@uns-kit/assistant-workflow 2.0.72

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 (295) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +37 -0
  3. package/dist/clarification-policy.d.ts +64 -0
  4. package/dist/clarification-policy.d.ts.map +1 -0
  5. package/dist/clarification-policy.js +174 -0
  6. package/dist/clarification-policy.js.map +1 -0
  7. package/dist/decision.d.ts +37 -0
  8. package/dist/decision.d.ts.map +1 -0
  9. package/dist/decision.js +100 -0
  10. package/dist/decision.js.map +1 -0
  11. package/dist/definition-catalog-replay.d.ts +25 -0
  12. package/dist/definition-catalog-replay.d.ts.map +1 -0
  13. package/dist/definition-catalog-replay.js +54 -0
  14. package/dist/definition-catalog-replay.js.map +1 -0
  15. package/dist/definition-catalog.d.ts +45 -0
  16. package/dist/definition-catalog.d.ts.map +1 -0
  17. package/dist/definition-catalog.js +97 -0
  18. package/dist/definition-catalog.js.map +1 -0
  19. package/dist/definition-diagnostics.d.ts +17 -0
  20. package/dist/definition-diagnostics.d.ts.map +1 -0
  21. package/dist/definition-diagnostics.js +353 -0
  22. package/dist/definition-diagnostics.js.map +1 -0
  23. package/dist/definition-diff.d.ts +51 -0
  24. package/dist/definition-diff.d.ts.map +1 -0
  25. package/dist/definition-diff.js +172 -0
  26. package/dist/definition-diff.js.map +1 -0
  27. package/dist/definition-json.d.ts +53 -0
  28. package/dist/definition-json.d.ts.map +1 -0
  29. package/dist/definition-json.js +186 -0
  30. package/dist/definition-json.js.map +1 -0
  31. package/dist/definition-manifest.d.ts +41 -0
  32. package/dist/definition-manifest.d.ts.map +1 -0
  33. package/dist/definition-manifest.js +119 -0
  34. package/dist/definition-manifest.js.map +1 -0
  35. package/dist/definition-package-execution-json.d.ts +64 -0
  36. package/dist/definition-package-execution-json.d.ts.map +1 -0
  37. package/dist/definition-package-execution-json.js +245 -0
  38. package/dist/definition-package-execution-json.js.map +1 -0
  39. package/dist/definition-package-execution-replay.d.ts +14 -0
  40. package/dist/definition-package-execution-replay.d.ts.map +1 -0
  41. package/dist/definition-package-execution-replay.js +47 -0
  42. package/dist/definition-package-execution-replay.js.map +1 -0
  43. package/dist/definition-package-executor.d.ts +52 -0
  44. package/dist/definition-package-executor.d.ts.map +1 -0
  45. package/dist/definition-package-executor.js +70 -0
  46. package/dist/definition-package-executor.js.map +1 -0
  47. package/dist/definition-package-loader.d.ts +36 -0
  48. package/dist/definition-package-loader.d.ts.map +1 -0
  49. package/dist/definition-package-loader.js +56 -0
  50. package/dist/definition-package-loader.js.map +1 -0
  51. package/dist/definition-package-replay.d.ts +28 -0
  52. package/dist/definition-package-replay.d.ts.map +1 -0
  53. package/dist/definition-package-replay.js +74 -0
  54. package/dist/definition-package-replay.js.map +1 -0
  55. package/dist/definition-package-resolver.d.ts +31 -0
  56. package/dist/definition-package-resolver.d.ts.map +1 -0
  57. package/dist/definition-package-resolver.js +60 -0
  58. package/dist/definition-package-resolver.js.map +1 -0
  59. package/dist/definition-package-review.d.ts +29 -0
  60. package/dist/definition-package-review.d.ts.map +1 -0
  61. package/dist/definition-package-review.js +74 -0
  62. package/dist/definition-package-review.js.map +1 -0
  63. package/dist/definition-package-run-report.d.ts +25 -0
  64. package/dist/definition-package-run-report.d.ts.map +1 -0
  65. package/dist/definition-package-run-report.js +37 -0
  66. package/dist/definition-package-run-report.js.map +1 -0
  67. package/dist/definition-package-run.d.ts +20 -0
  68. package/dist/definition-package-run.d.ts.map +1 -0
  69. package/dist/definition-package-run.js +41 -0
  70. package/dist/definition-package-run.js.map +1 -0
  71. package/dist/definition-package-selection.d.ts +29 -0
  72. package/dist/definition-package-selection.d.ts.map +1 -0
  73. package/dist/definition-package-selection.js +68 -0
  74. package/dist/definition-package-selection.js.map +1 -0
  75. package/dist/definition-package-smoke.d.ts +74 -0
  76. package/dist/definition-package-smoke.d.ts.map +1 -0
  77. package/dist/definition-package-smoke.js +184 -0
  78. package/dist/definition-package-smoke.js.map +1 -0
  79. package/dist/definition-package.d.ts +36 -0
  80. package/dist/definition-package.d.ts.map +1 -0
  81. package/dist/definition-package.js +114 -0
  82. package/dist/definition-package.js.map +1 -0
  83. package/dist/definition-tuning-approval.d.ts +39 -0
  84. package/dist/definition-tuning-approval.d.ts.map +1 -0
  85. package/dist/definition-tuning-approval.js +207 -0
  86. package/dist/definition-tuning-approval.js.map +1 -0
  87. package/dist/definition-tuning-json.d.ts +58 -0
  88. package/dist/definition-tuning-json.d.ts.map +1 -0
  89. package/dist/definition-tuning-json.js +276 -0
  90. package/dist/definition-tuning-json.js.map +1 -0
  91. package/dist/definition-tuning-promotion.d.ts +120 -0
  92. package/dist/definition-tuning-promotion.d.ts.map +1 -0
  93. package/dist/definition-tuning-promotion.js +460 -0
  94. package/dist/definition-tuning-promotion.js.map +1 -0
  95. package/dist/definition-tuning-replay.d.ts +14 -0
  96. package/dist/definition-tuning-replay.d.ts.map +1 -0
  97. package/dist/definition-tuning-replay.js +50 -0
  98. package/dist/definition-tuning-replay.js.map +1 -0
  99. package/dist/definition-tuning-review-artifact.d.ts +56 -0
  100. package/dist/definition-tuning-review-artifact.d.ts.map +1 -0
  101. package/dist/definition-tuning-review-artifact.js +302 -0
  102. package/dist/definition-tuning-review-artifact.js.map +1 -0
  103. package/dist/definition-tuning-review.d.ts +59 -0
  104. package/dist/definition-tuning-review.d.ts.map +1 -0
  105. package/dist/definition-tuning-review.js +213 -0
  106. package/dist/definition-tuning-review.js.map +1 -0
  107. package/dist/definition-tuning-source-patch.d.ts +43 -0
  108. package/dist/definition-tuning-source-patch.d.ts.map +1 -0
  109. package/dist/definition-tuning-source-patch.js +214 -0
  110. package/dist/definition-tuning-source-patch.js.map +1 -0
  111. package/dist/definition-tuning.d.ts +73 -0
  112. package/dist/definition-tuning.d.ts.map +1 -0
  113. package/dist/definition-tuning.js +426 -0
  114. package/dist/definition-tuning.js.map +1 -0
  115. package/dist/definition.d.ts +189 -0
  116. package/dist/definition.d.ts.map +1 -0
  117. package/dist/definition.js +494 -0
  118. package/dist/definition.js.map +1 -0
  119. package/dist/direct-route-invocation.d.ts +132 -0
  120. package/dist/direct-route-invocation.d.ts.map +1 -0
  121. package/dist/direct-route-invocation.js +325 -0
  122. package/dist/direct-route-invocation.js.map +1 -0
  123. package/dist/direct-route-policy.d.ts +25 -0
  124. package/dist/direct-route-policy.d.ts.map +1 -0
  125. package/dist/direct-route-policy.js +106 -0
  126. package/dist/direct-route-policy.js.map +1 -0
  127. package/dist/eval-case.d.ts +85 -0
  128. package/dist/eval-case.d.ts.map +1 -0
  129. package/dist/eval-case.js +366 -0
  130. package/dist/eval-case.js.map +1 -0
  131. package/dist/eval-replay.d.ts +18 -0
  132. package/dist/eval-replay.d.ts.map +1 -0
  133. package/dist/eval-replay.js +41 -0
  134. package/dist/eval-replay.js.map +1 -0
  135. package/dist/eval-result.d.ts +46 -0
  136. package/dist/eval-result.d.ts.map +1 -0
  137. package/dist/eval-result.js +183 -0
  138. package/dist/eval-result.js.map +1 -0
  139. package/dist/eval-runner.d.ts +30 -0
  140. package/dist/eval-runner.d.ts.map +1 -0
  141. package/dist/eval-runner.js +57 -0
  142. package/dist/eval-runner.js.map +1 -0
  143. package/dist/eval-suite.d.ts +43 -0
  144. package/dist/eval-suite.d.ts.map +1 -0
  145. package/dist/eval-suite.js +101 -0
  146. package/dist/eval-suite.js.map +1 -0
  147. package/dist/execution-plan.d.ts +43 -0
  148. package/dist/execution-plan.d.ts.map +1 -0
  149. package/dist/execution-plan.js +187 -0
  150. package/dist/execution-plan.js.map +1 -0
  151. package/dist/hosted-tool-policy.d.ts +70 -0
  152. package/dist/hosted-tool-policy.d.ts.map +1 -0
  153. package/dist/hosted-tool-policy.js +228 -0
  154. package/dist/hosted-tool-policy.js.map +1 -0
  155. package/dist/index.d.ts +73 -0
  156. package/dist/index.d.ts.map +1 -0
  157. package/dist/index.js +73 -0
  158. package/dist/index.js.map +1 -0
  159. package/dist/memory-policy.d.ts +55 -0
  160. package/dist/memory-policy.d.ts.map +1 -0
  161. package/dist/memory-policy.js +187 -0
  162. package/dist/memory-policy.js.map +1 -0
  163. package/dist/memory-updates.d.ts +39 -0
  164. package/dist/memory-updates.d.ts.map +1 -0
  165. package/dist/memory-updates.js +110 -0
  166. package/dist/memory-updates.js.map +1 -0
  167. package/dist/outcome-trace.d.ts +79 -0
  168. package/dist/outcome-trace.d.ts.map +1 -0
  169. package/dist/outcome-trace.js +117 -0
  170. package/dist/outcome-trace.js.map +1 -0
  171. package/dist/outcome.d.ts +97 -0
  172. package/dist/outcome.d.ts.map +1 -0
  173. package/dist/outcome.js +160 -0
  174. package/dist/outcome.js.map +1 -0
  175. package/dist/planner-compiler.d.ts +14 -0
  176. package/dist/planner-compiler.d.ts.map +1 -0
  177. package/dist/planner-compiler.js +26 -0
  178. package/dist/planner-compiler.js.map +1 -0
  179. package/dist/planning.d.ts +36 -0
  180. package/dist/planning.d.ts.map +1 -0
  181. package/dist/planning.js +141 -0
  182. package/dist/planning.js.map +1 -0
  183. package/dist/policy-resolution.d.ts +10 -0
  184. package/dist/policy-resolution.d.ts.map +1 -0
  185. package/dist/policy-resolution.js +30 -0
  186. package/dist/policy-resolution.js.map +1 -0
  187. package/dist/run-evaluation.d.ts +29 -0
  188. package/dist/run-evaluation.d.ts.map +1 -0
  189. package/dist/run-evaluation.js +128 -0
  190. package/dist/run-evaluation.js.map +1 -0
  191. package/dist/run-parity.d.ts +24 -0
  192. package/dist/run-parity.d.ts.map +1 -0
  193. package/dist/run-parity.js +36 -0
  194. package/dist/run-parity.js.map +1 -0
  195. package/dist/run-report-batch.d.ts +150 -0
  196. package/dist/run-report-batch.d.ts.map +1 -0
  197. package/dist/run-report-batch.js +391 -0
  198. package/dist/run-report-batch.js.map +1 -0
  199. package/dist/run-report-json.d.ts +76 -0
  200. package/dist/run-report-json.d.ts.map +1 -0
  201. package/dist/run-report-json.js +451 -0
  202. package/dist/run-report-json.js.map +1 -0
  203. package/dist/run-report.d.ts +22 -0
  204. package/dist/run-report.d.ts.map +1 -0
  205. package/dist/run-report.js +46 -0
  206. package/dist/run-report.js.map +1 -0
  207. package/dist/run.d.ts +20 -0
  208. package/dist/run.d.ts.map +1 -0
  209. package/dist/run.js +36 -0
  210. package/dist/run.js.map +1 -0
  211. package/dist/tool-bindings.d.ts +42 -0
  212. package/dist/tool-bindings.d.ts.map +1 -0
  213. package/dist/tool-bindings.js +124 -0
  214. package/dist/tool-bindings.js.map +1 -0
  215. package/dist/tool-capabilities.d.ts +37 -0
  216. package/dist/tool-capabilities.d.ts.map +1 -0
  217. package/dist/tool-capabilities.js +91 -0
  218. package/dist/tool-capabilities.js.map +1 -0
  219. package/dist/tool-executor.d.ts +63 -0
  220. package/dist/tool-executor.d.ts.map +1 -0
  221. package/dist/tool-executor.js +176 -0
  222. package/dist/tool-executor.js.map +1 -0
  223. package/dist/tool-fixtures.d.ts +18 -0
  224. package/dist/tool-fixtures.d.ts.map +1 -0
  225. package/dist/tool-fixtures.js +52 -0
  226. package/dist/tool-fixtures.js.map +1 -0
  227. package/dist/tool-invocations.d.ts +31 -0
  228. package/dist/tool-invocations.d.ts.map +1 -0
  229. package/dist/tool-invocations.js +79 -0
  230. package/dist/tool-invocations.js.map +1 -0
  231. package/dist/tool-provider-executors.d.ts +43 -0
  232. package/dist/tool-provider-executors.d.ts.map +1 -0
  233. package/dist/tool-provider-executors.js +59 -0
  234. package/dist/tool-provider-executors.js.map +1 -0
  235. package/dist/tool-result-cache.d.ts +37 -0
  236. package/dist/tool-result-cache.d.ts.map +1 -0
  237. package/dist/tool-result-cache.js +173 -0
  238. package/dist/tool-result-cache.js.map +1 -0
  239. package/dist/tool-results.d.ts +41 -0
  240. package/dist/tool-results.d.ts.map +1 -0
  241. package/dist/tool-results.js +137 -0
  242. package/dist/tool-results.js.map +1 -0
  243. package/dist/tool-runtime.d.ts +46 -0
  244. package/dist/tool-runtime.d.ts.map +1 -0
  245. package/dist/tool-runtime.js +163 -0
  246. package/dist/tool-runtime.js.map +1 -0
  247. package/dist/tool-selection-evaluation.d.ts +214 -0
  248. package/dist/tool-selection-evaluation.d.ts.map +1 -0
  249. package/dist/tool-selection-evaluation.js +773 -0
  250. package/dist/tool-selection-evaluation.js.map +1 -0
  251. package/dist/tool-selection-json.d.ts +71 -0
  252. package/dist/tool-selection-json.d.ts.map +1 -0
  253. package/dist/tool-selection-json.js +284 -0
  254. package/dist/tool-selection-json.js.map +1 -0
  255. package/dist/tool-selection-policy.d.ts +81 -0
  256. package/dist/tool-selection-policy.d.ts.map +1 -0
  257. package/dist/tool-selection-policy.js +376 -0
  258. package/dist/tool-selection-policy.js.map +1 -0
  259. package/dist/tool-selection-replay.d.ts +26 -0
  260. package/dist/tool-selection-replay.d.ts.map +1 -0
  261. package/dist/tool-selection-replay.js +88 -0
  262. package/dist/tool-selection-replay.js.map +1 -0
  263. package/dist/tool-selection-rules.d.ts +46 -0
  264. package/dist/tool-selection-rules.d.ts.map +1 -0
  265. package/dist/tool-selection-rules.js +183 -0
  266. package/dist/tool-selection-rules.js.map +1 -0
  267. package/dist/tool-selection-trace-export.d.ts +37 -0
  268. package/dist/tool-selection-trace-export.d.ts.map +1 -0
  269. package/dist/tool-selection-trace-export.js +324 -0
  270. package/dist/tool-selection-trace-export.js.map +1 -0
  271. package/dist/trace-events.d.ts +14 -0
  272. package/dist/trace-events.d.ts.map +1 -0
  273. package/dist/trace-events.js +65 -0
  274. package/dist/trace-events.js.map +1 -0
  275. package/dist/trace-payload.d.ts +24 -0
  276. package/dist/trace-payload.d.ts.map +1 -0
  277. package/dist/trace-payload.js +113 -0
  278. package/dist/trace-payload.js.map +1 -0
  279. package/dist/trace-replay.d.ts +276 -0
  280. package/dist/trace-replay.d.ts.map +1 -0
  281. package/dist/trace-replay.js +685 -0
  282. package/dist/trace-replay.js.map +1 -0
  283. package/dist/trace-report.d.ts +320 -0
  284. package/dist/trace-report.d.ts.map +1 -0
  285. package/dist/trace-report.js +1394 -0
  286. package/dist/trace-report.js.map +1 -0
  287. package/dist/trace-stages.d.ts +70 -0
  288. package/dist/trace-stages.d.ts.map +1 -0
  289. package/dist/trace-stages.js +103 -0
  290. package/dist/trace-stages.js.map +1 -0
  291. package/dist/value-readers.d.ts +20 -0
  292. package/dist/value-readers.d.ts.map +1 -0
  293. package/dist/value-readers.js +82 -0
  294. package/dist/value-readers.js.map +1 -0
  295. package/package.json +341 -0
@@ -0,0 +1,685 @@
1
+ import { ASSISTANT_WORKFLOW_TRACE_STAGE, parseAssistantWorkflowDirectRouteTraceStage, } from "./trace-stages.js";
2
+ import { isAssistantWorkflowErrorTraceStage, readAssistantWorkflowTraceBoolean as readBoolean, readAssistantWorkflowTraceBooleanRecord as readBooleanRecord, readAssistantWorkflowTraceNumber as readNumber, readAssistantWorkflowTracePayloadRecord as readRecord, readAssistantWorkflowTraceString as readString, readAssistantWorkflowTraceStringArray as readStringArray, readAssistantWorkflowTraceUserMessagePreview, } from "./trace-events.js";
3
+ export { isAssistantWorkflowErrorTraceStage, readAssistantWorkflowTraceUserMessagePreview, } from "./trace-events.js";
4
+ export function buildAssistantWorkflowTraceSummary(events) {
5
+ let userMessagePreview = null;
6
+ let classifier = null;
7
+ let workflow = null;
8
+ const directRoutes = [];
9
+ const directRoutePolicies = [];
10
+ const directRouteGaps = [];
11
+ const memoryPatches = [];
12
+ const threadProfileWrites = [];
13
+ const outcomes = [];
14
+ const toolRuntimeBindings = [];
15
+ const clarificationComparisons = [];
16
+ const toolSelections = [];
17
+ const toolCalls = [];
18
+ const errorStages = [];
19
+ let qualityFlagged = false;
20
+ const qualitySignalNames = new Set();
21
+ const passedSignalNames = new Set();
22
+ for (const event of events) {
23
+ if (!event || typeof event !== "object")
24
+ continue;
25
+ const stage = typeof event.stage === "string" ? event.stage : "";
26
+ if (!stage)
27
+ continue;
28
+ if (isAssistantWorkflowErrorTraceStage(stage)) {
29
+ errorStages.push(stage);
30
+ }
31
+ const payload = readRecord(event.payload);
32
+ if (!payload)
33
+ continue;
34
+ if (!userMessagePreview) {
35
+ userMessagePreview = readAssistantWorkflowTraceUserMessagePreview(stage, payload);
36
+ }
37
+ const directRoute = readDirectRouteSummary(stage, payload);
38
+ if (directRoute) {
39
+ directRoutes.push(directRoute);
40
+ continue;
41
+ }
42
+ const directRoutePolicy = readDirectRoutePolicySummary(stage, payload);
43
+ if (directRoutePolicy) {
44
+ directRoutePolicies.push(directRoutePolicy);
45
+ continue;
46
+ }
47
+ const directRouteGap = readDirectRouteGapSummary(stage, payload);
48
+ if (directRouteGap) {
49
+ directRouteGaps.push(directRouteGap);
50
+ continue;
51
+ }
52
+ const memoryPatch = readMemoryPatchSummary(stage, payload);
53
+ if (memoryPatch) {
54
+ memoryPatches.push(memoryPatch);
55
+ continue;
56
+ }
57
+ const threadProfileWrite = readThreadProfileWriteSummary(stage, payload);
58
+ if (threadProfileWrite) {
59
+ threadProfileWrites.push(threadProfileWrite);
60
+ continue;
61
+ }
62
+ const outcome = readOutcomeSummary(stage, payload);
63
+ if (outcome) {
64
+ outcomes.push(outcome);
65
+ continue;
66
+ }
67
+ const toolRuntimeBinding = readToolRuntimeBindingSummary(stage, payload);
68
+ if (toolRuntimeBinding) {
69
+ toolRuntimeBindings.push(toolRuntimeBinding);
70
+ continue;
71
+ }
72
+ const clarificationComparison = readClarificationComparisonSummary(stage, payload);
73
+ if (clarificationComparison) {
74
+ clarificationComparisons.push(clarificationComparison);
75
+ continue;
76
+ }
77
+ if (stage === ASSISTANT_WORKFLOW_TRACE_STAGE.plannerClassifierDone) {
78
+ classifier = readClassifierSummary(payload);
79
+ continue;
80
+ }
81
+ if (stage === ASSISTANT_WORKFLOW_TRACE_STAGE.plannerWorkflowDecision ||
82
+ stage === ASSISTANT_WORKFLOW_TRACE_STAGE.toolSelectionWorkflowComparison) {
83
+ const nextWorkflow = readWorkflowSummary(stage, payload);
84
+ workflow = workflow ? mergeWorkflowSummaries(workflow, nextWorkflow) : nextWorkflow;
85
+ if (!classifier && stage === ASSISTANT_WORKFLOW_TRACE_STAGE.plannerWorkflowDecision) {
86
+ classifier = readClassifierSummary(payload);
87
+ }
88
+ continue;
89
+ }
90
+ if (stage === ASSISTANT_WORKFLOW_TRACE_STAGE.toolSelectionApplied) {
91
+ toolSelections.push(readToolSelectionSummary(stage, payload));
92
+ continue;
93
+ }
94
+ if (stage === ASSISTANT_WORKFLOW_TRACE_STAGE.toolCall ||
95
+ stage === ASSISTANT_WORKFLOW_TRACE_STAGE.toolCallError) {
96
+ const toolCall = readToolCallSummary(stage, payload);
97
+ if (toolCall)
98
+ toolCalls.push(toolCall);
99
+ continue;
100
+ }
101
+ if (stage === ASSISTANT_WORKFLOW_TRACE_STAGE.qualitySignalsFlagged ||
102
+ stage === ASSISTANT_WORKFLOW_TRACE_STAGE.qualitySignalsOk) {
103
+ if (stage === ASSISTANT_WORKFLOW_TRACE_STAGE.qualitySignalsFlagged)
104
+ qualityFlagged = true;
105
+ for (const name of readQualitySignalNames(payload["triggered"])) {
106
+ qualitySignalNames.add(name);
107
+ }
108
+ for (const name of readStringArray(payload["passed"])) {
109
+ passedSignalNames.add(name);
110
+ }
111
+ }
112
+ }
113
+ return {
114
+ userMessagePreview,
115
+ classifier,
116
+ workflow,
117
+ directRoutes,
118
+ directRoutePolicies,
119
+ directRouteGaps,
120
+ memoryPatches,
121
+ threadProfileWrites,
122
+ outcomes,
123
+ handledOutcome: [...outcomes].reverse().find((outcome) => outcome.handled) ?? null,
124
+ toolRuntimeBindings,
125
+ clarificationComparisons,
126
+ toolSelections,
127
+ toolCalls,
128
+ toolCallNames: uniqueStrings(toolCalls.map((call) => call.tool)),
129
+ errorStages: uniqueStrings(errorStages),
130
+ quality: {
131
+ flagged: qualityFlagged,
132
+ signalNames: [...qualitySignalNames].sort(),
133
+ passedSignalNames: [...passedSignalNames].sort(),
134
+ },
135
+ traceEventCount: events.length,
136
+ };
137
+ }
138
+ export function buildAssistantWorkflowTraceEvalCandidate(summary) {
139
+ if (!summary.userMessagePreview)
140
+ return null;
141
+ const expectedIntent = summary.classifier?.intent ?? summary.workflow?.intent ?? null;
142
+ const expectedPresentation = summary.classifier?.presentation ?? summary.workflow?.effectivePresentation ?? null;
143
+ const expectedTools = uniqueStrings([
144
+ ...(summary.workflow?.workflowSelectionCandidateTools.length
145
+ ? summary.workflow.workflowSelectionCandidateTools
146
+ : summary.workflow?.workflowSuggestedTools ?? []),
147
+ ...summary.toolCallNames,
148
+ ]);
149
+ const notes = collectAssistantWorkflowTraceTuningSignals(summary).map((signal) => signal.detail ? `${signal.name}: ${signal.detail}` : signal.name);
150
+ return {
151
+ promptPreview: summary.userMessagePreview,
152
+ expectedIntent,
153
+ expectedPresentation,
154
+ expectedPlanStepIds: summary.workflow?.plan?.stepIds ?? [],
155
+ expectedActivePlanningStepProfileIds: summary.workflow?.plan?.activePlanningStepProfileIds ?? [],
156
+ expectedProfileStepIds: summary.workflow?.plan?.profileStepIds ?? [],
157
+ expectedTools,
158
+ qualitySignalNames: summary.quality.signalNames,
159
+ notes,
160
+ };
161
+ }
162
+ export function collectAssistantWorkflowTraceTuningSignals(summary) {
163
+ const signals = [];
164
+ if (!summary.classifier) {
165
+ signals.push({
166
+ name: "missing_classifier",
167
+ severity: "info",
168
+ detail: "turn did not emit planner_classifier.done",
169
+ });
170
+ }
171
+ const workflow = summary.workflow;
172
+ if (workflow) {
173
+ if (workflow.missingRequiredToolHints.length) {
174
+ signals.push({
175
+ name: "workflow_missing_required_tools",
176
+ severity: "warning",
177
+ detail: workflow.missingRequiredToolHints.join(", "),
178
+ });
179
+ }
180
+ if (workflow.missingToolHints.length) {
181
+ signals.push({
182
+ name: "workflow_missing_optional_tools",
183
+ severity: "info",
184
+ detail: workflow.missingToolHints.join(", "),
185
+ });
186
+ }
187
+ if (workflow.plan?.missingPlanningSteps.length) {
188
+ signals.push({
189
+ name: "workflow_missing_planning_steps",
190
+ severity: "warning",
191
+ detail: workflow.plan.missingPlanningSteps.join(", "),
192
+ });
193
+ }
194
+ if (hasAssistantWorkflowConstrainedToolSelectionEvidence(workflow)) {
195
+ const missingSelectionCandidateTools = getMissingWorkflowSelectionCandidateTools(workflow);
196
+ if (missingSelectionCandidateTools.length) {
197
+ signals.push({
198
+ name: "workflow_suggested_not_selected",
199
+ severity: "info",
200
+ detail: missingSelectionCandidateTools.join(", "),
201
+ });
202
+ }
203
+ const unmodeledToolCalls = getAssistantWorkflowUnmodeledToolCalls(workflow, summary.toolCallNames);
204
+ if (unmodeledToolCalls.length) {
205
+ signals.push({
206
+ name: "selected_outside_workflow",
207
+ severity: "info",
208
+ detail: unmodeledToolCalls.join(", "),
209
+ });
210
+ }
211
+ }
212
+ if (workflow.extraClassifierTools.length) {
213
+ signals.push({
214
+ name: "classifier_extra_tools",
215
+ severity: "info",
216
+ detail: workflow.extraClassifierTools.join(", "),
217
+ });
218
+ }
219
+ }
220
+ for (const comparison of summary.clarificationComparisons) {
221
+ if (comparison.matched !== false)
222
+ continue;
223
+ signals.push({
224
+ name: "clarification_runtime_mismatch",
225
+ severity: "warning",
226
+ detail: buildClarificationComparisonMismatchDetail(comparison),
227
+ });
228
+ }
229
+ for (const patch of summary.memoryPatches) {
230
+ if (patch.profilePatchEquivalent !== false)
231
+ continue;
232
+ signals.push({
233
+ name: "workflow_memory_patch_mismatch",
234
+ severity: "warning",
235
+ detail: patch.profilePatchMismatchedFields.length
236
+ ? patch.profilePatchMismatchedFields.join(", ")
237
+ : "profile patch mismatch",
238
+ });
239
+ }
240
+ if (summary.errorStages.length) {
241
+ signals.push({
242
+ name: "trace_errors",
243
+ severity: "warning",
244
+ detail: summary.errorStages.join(", "),
245
+ });
246
+ }
247
+ for (const name of summary.quality.signalNames) {
248
+ signals.push({
249
+ name: "quality_signal",
250
+ severity: "warning",
251
+ detail: name,
252
+ });
253
+ }
254
+ return signals;
255
+ }
256
+ function buildClarificationComparisonMismatchDetail(comparison) {
257
+ if (comparison.missingExpectedRuleIds.length) {
258
+ return `missing ${comparison.missingExpectedRuleIds.join(", ")}`;
259
+ }
260
+ if (comparison.unexpectedObservedRuleId) {
261
+ return `unexpected ${comparison.unexpectedObservedRuleId}`;
262
+ }
263
+ if (comparison.observedRuleId) {
264
+ return `unmatched ${comparison.observedRuleId}`;
265
+ }
266
+ return "clarification policy mismatch";
267
+ }
268
+ function readClassifierSummary(payload) {
269
+ return {
270
+ intent: readString(payload["intent"]),
271
+ presentation: readString(payload["presentation"]),
272
+ confidence: readNumber(payload["confidence"]),
273
+ toolsToExpose: readStringArray(payload["toolsToExpose"]),
274
+ };
275
+ }
276
+ function readClarificationComparisonSummary(stage, payload) {
277
+ if (stage !== "clarification.workflow_comparison")
278
+ return null;
279
+ return {
280
+ stage,
281
+ intent: readString(payload["intent"]),
282
+ expectedRuleIds: readStringArray(payload["expectedRuleIds"]),
283
+ expectedBlockingRuleIds: readStringArray(payload["expectedBlockingRuleIds"]),
284
+ expectedSuggestedRuleIds: readStringArray(payload["expectedSuggestedRuleIds"]),
285
+ produced: readBoolean(payload["produced"]),
286
+ observedRuleId: readString(payload["observedRuleId"]),
287
+ equivalentRuleIds: readStringArray(payload["equivalentRuleIds"]),
288
+ matched: readBoolean(payload["matched"]),
289
+ missingExpectedRuleIds: readStringArray(payload["missingExpectedRuleIds"]),
290
+ unexpectedObservedRuleId: readString(payload["unexpectedObservedRuleId"]),
291
+ source: readString(payload["source"]),
292
+ layer: readString(payload["layer"]),
293
+ reason: readString(payload["reason"]),
294
+ };
295
+ }
296
+ function readWorkflowSummary(sourceStage, payload) {
297
+ const workflowRun = readRecord(payload["workflowRun"]);
298
+ const memoryPolicy = readRecord(payload["memoryPolicy"]);
299
+ const clarificationPolicy = readRecord(payload["clarificationPolicy"]);
300
+ const authority = readRecord(payload["authority"]);
301
+ return {
302
+ sourceStage,
303
+ workflowId: readString(payload["workflowId"]) ?? readString(workflowRun?.["workflowId"]),
304
+ workflowVersion: readNumber(payload["workflowVersion"]) ?? readNumber(workflowRun?.["workflowVersion"]),
305
+ intent: readString(payload["intent"]),
306
+ matchedIntent: readBoolean(payload["matchedIntent"]),
307
+ effectivePresentation: readString(payload["effectivePresentation"]),
308
+ executionBias: readString(payload["executionBias"]),
309
+ workflowSuggestedTools: readStringArray(payload["workflowSuggestedTools"]),
310
+ workflowSelectionCandidateTools: readStringArray(payload["workflowSelectionCandidateTools"]),
311
+ workflowSelectionOptionalToolMode: readString(payload["workflowSelectionOptionalToolMode"]),
312
+ workflowSelectionExcludedOptionalTools: readStringArray(payload["workflowSelectionExcludedOptionalTools"]),
313
+ workflowSelectionActiveProfileIds: readStringArray(payload["workflowSelectionActiveProfileIds"]),
314
+ workflowSelectionProfileTools: readStringArray(payload["workflowSelectionProfileTools"]),
315
+ workflowSelectionProfileExcludedTools: readStringArray(payload["workflowSelectionProfileExcludedTools"]),
316
+ workflowAuthorityIntentIds: readStringArray(payload["workflowAuthorityIntentIds"]),
317
+ workflowAuthoritySegmentKeys: readStringArray(payload["workflowAuthoritySegmentKeys"]),
318
+ workflowAuthorityProfileKeys: readStringArray(payload["workflowAuthorityProfileKeys"]),
319
+ toolSelectionPruningEnabled: readBoolean(payload["pruningEnabled"]),
320
+ toolSelectionMode: readString(payload["selectedMode"]),
321
+ missingToolHints: readStringArray(payload["missingToolHints"]),
322
+ missingRequiredToolHints: readStringArray(payload["missingRequiredToolHints"]),
323
+ extraClassifierTools: readStringArray(payload["extraClassifierTools"]),
324
+ missingWorkflowSuggestedTools: readStringArray(payload["missingWorkflowSuggestedTools"]),
325
+ missingWorkflowSelectionCandidateTools: readStringArray(payload["missingWorkflowSelectionCandidateTools"]),
326
+ selectedOutsideWorkflowSuggestions: readStringArray(payload["selectedOutsideWorkflowSuggestions"]),
327
+ selectedOutsideWorkflowSelectionCandidate: readStringArray(payload["selectedOutsideWorkflowSelectionCandidate"]),
328
+ plan: readPlanSummary(payload["plan"]),
329
+ memory: memoryPolicy
330
+ ? {
331
+ readSlots: readStringArray(memoryPolicy["readSlots"]),
332
+ writeSlots: readStringArray(memoryPolicy["writeSlots"]),
333
+ injectSlots: readStringArray(memoryPolicy["injectSlots"]),
334
+ missingMemorySlots: readStringArray(memoryPolicy["missingMemorySlots"]),
335
+ }
336
+ : null,
337
+ clarification: clarificationPolicy
338
+ ? {
339
+ ruleIds: readStringArray(clarificationPolicy["ruleIds"]),
340
+ suggestedRuleIds: readStringArray(clarificationPolicy["suggestedRuleIds"]),
341
+ blockingRuleIds: readStringArray(clarificationPolicy["blockingRuleIds"]),
342
+ missingClarificationRules: readStringArray(clarificationPolicy["missingClarificationRules"]),
343
+ needsClarification: readBoolean(clarificationPolicy["needsClarification"]) ?? false,
344
+ reasons: readStringArray(clarificationPolicy["reasons"]),
345
+ }
346
+ : null,
347
+ authority: authority
348
+ ? {
349
+ source: readString(authority["source"]),
350
+ reason: readString(authority["reason"]),
351
+ selectedToolNames: readStringArray(authority["selectedToolNames"]),
352
+ workflowSuggestedToolNames: readStringArray(authority["workflowSuggestedToolNames"]),
353
+ workflowStatus: readString(authority["workflowStatus"]),
354
+ }
355
+ : null,
356
+ };
357
+ }
358
+ function mergeWorkflowSummaries(previous, next) {
359
+ return {
360
+ sourceStage: next.sourceStage,
361
+ workflowId: next.workflowId ?? previous.workflowId,
362
+ workflowVersion: next.workflowVersion ?? previous.workflowVersion,
363
+ intent: next.intent ?? previous.intent,
364
+ matchedIntent: next.matchedIntent ?? previous.matchedIntent,
365
+ effectivePresentation: next.effectivePresentation ?? previous.effectivePresentation,
366
+ executionBias: next.executionBias ?? previous.executionBias,
367
+ workflowSuggestedTools: mergeStringArrays(previous.workflowSuggestedTools, next.workflowSuggestedTools),
368
+ workflowSelectionCandidateTools: mergeStringArrays(previous.workflowSelectionCandidateTools, next.workflowSelectionCandidateTools),
369
+ workflowSelectionOptionalToolMode: next.workflowSelectionOptionalToolMode ?? previous.workflowSelectionOptionalToolMode,
370
+ workflowSelectionExcludedOptionalTools: mergeStringArrays(previous.workflowSelectionExcludedOptionalTools, next.workflowSelectionExcludedOptionalTools),
371
+ workflowSelectionActiveProfileIds: mergeStringArrays(previous.workflowSelectionActiveProfileIds, next.workflowSelectionActiveProfileIds),
372
+ workflowSelectionProfileTools: mergeStringArrays(previous.workflowSelectionProfileTools, next.workflowSelectionProfileTools),
373
+ workflowSelectionProfileExcludedTools: mergeStringArrays(previous.workflowSelectionProfileExcludedTools, next.workflowSelectionProfileExcludedTools),
374
+ workflowAuthorityIntentIds: mergeStringArrays(previous.workflowAuthorityIntentIds, next.workflowAuthorityIntentIds),
375
+ workflowAuthoritySegmentKeys: mergeStringArrays(previous.workflowAuthoritySegmentKeys, next.workflowAuthoritySegmentKeys),
376
+ workflowAuthorityProfileKeys: mergeStringArrays(previous.workflowAuthorityProfileKeys, next.workflowAuthorityProfileKeys),
377
+ toolSelectionPruningEnabled: next.toolSelectionPruningEnabled ?? previous.toolSelectionPruningEnabled,
378
+ toolSelectionMode: next.toolSelectionMode ?? previous.toolSelectionMode,
379
+ missingToolHints: mergeStringArrays(previous.missingToolHints, next.missingToolHints),
380
+ missingRequiredToolHints: mergeStringArrays(previous.missingRequiredToolHints, next.missingRequiredToolHints),
381
+ extraClassifierTools: mergeStringArrays(previous.extraClassifierTools, next.extraClassifierTools),
382
+ missingWorkflowSuggestedTools: mergeStringArrays(previous.missingWorkflowSuggestedTools, next.missingWorkflowSuggestedTools),
383
+ missingWorkflowSelectionCandidateTools: mergeStringArrays(previous.missingWorkflowSelectionCandidateTools, next.missingWorkflowSelectionCandidateTools),
384
+ selectedOutsideWorkflowSuggestions: mergeStringArrays(previous.selectedOutsideWorkflowSuggestions, next.selectedOutsideWorkflowSuggestions),
385
+ selectedOutsideWorkflowSelectionCandidate: mergeStringArrays(previous.selectedOutsideWorkflowSelectionCandidate, next.selectedOutsideWorkflowSelectionCandidate),
386
+ plan: next.plan ?? previous.plan,
387
+ memory: next.memory ?? previous.memory,
388
+ clarification: next.clarification ?? previous.clarification,
389
+ authority: next.authority ?? previous.authority,
390
+ };
391
+ }
392
+ function mergeStringArrays(previous, next) {
393
+ return uniqueStrings([...previous, ...next]);
394
+ }
395
+ export function getMissingWorkflowSelectionCandidateTools(workflow) {
396
+ if (!workflow.workflowSelectionCandidateTools.length) {
397
+ return workflow.missingWorkflowSuggestedTools;
398
+ }
399
+ if (workflow.missingWorkflowSelectionCandidateTools.length) {
400
+ return workflow.missingWorkflowSelectionCandidateTools;
401
+ }
402
+ const selectedToolNames = workflow.authority?.selectedToolNames ?? [];
403
+ if (!selectedToolNames.length) {
404
+ return workflow.missingWorkflowSuggestedTools.filter((tool) => workflow.workflowSelectionCandidateTools.includes(tool));
405
+ }
406
+ const selectedSet = new Set(selectedToolNames);
407
+ return workflow.workflowSelectionCandidateTools.filter((tool) => !selectedSet.has(tool));
408
+ }
409
+ /**
410
+ * A full catalog records availability, not a routing decision. Older traces did
411
+ * not include this metadata, so they retain the legacy interpretation.
412
+ */
413
+ export function hasAssistantWorkflowConstrainedToolSelectionEvidence(workflow) {
414
+ return !(workflow.toolSelectionPruningEnabled === false
415
+ && workflow.toolSelectionMode === "full");
416
+ }
417
+ /**
418
+ * Prompt exposure alone is not definition-tuning evidence. A tool must have
419
+ * been invoked and be absent from the workflow's full hint set.
420
+ */
421
+ export function getAssistantWorkflowUnmodeledToolCalls(workflow, toolCallNames) {
422
+ const workflowTools = new Set(workflow.workflowSuggestedTools);
423
+ return uniqueStrings(toolCallNames.filter((toolName) => !workflowTools.has(toolName)));
424
+ }
425
+ export function getSelectedOutsideWorkflowSelectionCandidate(workflow) {
426
+ if (!workflow.workflowSelectionCandidateTools.length) {
427
+ return workflow.selectedOutsideWorkflowSuggestions;
428
+ }
429
+ if (workflow.selectedOutsideWorkflowSelectionCandidate.length) {
430
+ return workflow.selectedOutsideWorkflowSelectionCandidate;
431
+ }
432
+ const candidateSet = new Set(workflow.workflowSelectionCandidateTools);
433
+ const selectedToolNames = workflow.authority?.selectedToolNames ?? [];
434
+ if (!selectedToolNames.length)
435
+ return [];
436
+ return selectedToolNames.filter((tool) => !candidateSet.has(tool));
437
+ }
438
+ function readPlanSummary(value) {
439
+ const plan = readRecord(value);
440
+ if (!plan)
441
+ return null;
442
+ return {
443
+ stepIds: readStringArray(plan["stepIds"]),
444
+ activePlanningStepProfileIds: readStringArray(plan["activePlanningStepProfileIds"]),
445
+ profileStepIds: readStringArray(plan["profileStepIds"]),
446
+ missingPlanningSteps: readStringArray(plan["missingPlanningSteps"]),
447
+ missingToolHints: readStringArray(plan["missingToolHints"]),
448
+ missingRequiredToolHints: readStringArray(plan["missingRequiredToolHints"]),
449
+ executionHints: readBooleanRecord(plan["executionHints"]),
450
+ };
451
+ }
452
+ function readToolCallSummary(stage, payload) {
453
+ const tool = readString(payload["tool"]) ?? readString(payload["effectiveToolName"]);
454
+ if (!tool)
455
+ return null;
456
+ const args = readRecord(payload["args"]);
457
+ return {
458
+ tool,
459
+ requestedTool: readString(payload["requestedTool"]) ?? readString(payload["requestedToolName"]),
460
+ hop: readNumber(payload["hop"]),
461
+ success: stage !== ASSISTANT_WORKFLOW_TRACE_STAGE.toolCallError,
462
+ synthetic: readBoolean(payload["synthetic"]) ?? false,
463
+ parallel: readBoolean(payload["parallel"]) ?? false,
464
+ resultChars: readNumber(payload["resultChars"]),
465
+ topic: args ? readString(args["topic"]) : null,
466
+ structuredArtifactKinds: readStringArray(payload["structuredArtifactKinds"]),
467
+ };
468
+ }
469
+ function readToolSelectionSummary(stage, payload) {
470
+ return {
471
+ stage,
472
+ hop: readNumber(payload["hop"]),
473
+ mode: readString(payload["mode"]),
474
+ reason: readString(payload["reason"]),
475
+ pruningEnabled: readBoolean(payload["toolPruningEnabled"]),
476
+ toolCount: readNumber(payload["toolCount"]),
477
+ totalToolCount: readNumber(payload["totalToolCount"]),
478
+ schemaCostSource: readString(payload["schemaCostSource"]),
479
+ approxSchemaChars: readNumber(payload["approxSchemaChars"]),
480
+ approxSavedChars: readNumber(payload["approxSavedChars"]),
481
+ toolNames: readStringArray(payload["tools"]),
482
+ };
483
+ }
484
+ function readOutcomeSummary(stage, payload) {
485
+ if (stage !== ASSISTANT_WORKFLOW_TRACE_STAGE.outcome)
486
+ return null;
487
+ const kind = readString(payload["kind"]);
488
+ if (!kind)
489
+ return null;
490
+ return {
491
+ stage,
492
+ kind,
493
+ handled: readBoolean(payload["handled"]) ?? false,
494
+ contentChars: readNumber(payload["contentChars"]),
495
+ reason: readString(payload["reason"]),
496
+ delivery: readString(payload["delivery"]),
497
+ artifactKind: readString(payload["artifactKind"]),
498
+ route: readString(payload["route"]),
499
+ source: readString(payload["source"]),
500
+ layer: readString(payload["layer"]),
501
+ skipEvent: readString(payload["skipEvent"]),
502
+ mode: readString(payload["mode"]),
503
+ submode: readString(payload["submode"]),
504
+ tool: readString(payload["tool"]),
505
+ ruleId: readString(payload["ruleId"]),
506
+ streamed: readBoolean(payload["streamed"]),
507
+ };
508
+ }
509
+ function readToolRuntimeBindingSummary(stage, payload) {
510
+ if (stage !== ASSISTANT_WORKFLOW_TRACE_STAGE.toolBindingRuntime)
511
+ return null;
512
+ return {
513
+ stage,
514
+ toolName: readString(payload["toolName"]),
515
+ status: readString(payload["status"]),
516
+ capabilityProvider: readString(payload["capabilityProvider"]),
517
+ bindingProvider: readString(payload["bindingProvider"]),
518
+ runtimeAdapterId: readString(payload["runtimeAdapterId"]),
519
+ policyMismatchFields: readPolicyMismatchFields(payload["policyMismatches"]),
520
+ };
521
+ }
522
+ function readMemoryPatchSummary(stage, payload) {
523
+ if (stage !== ASSISTANT_WORKFLOW_TRACE_STAGE.memoryPatch)
524
+ return null;
525
+ return {
526
+ stage,
527
+ changedSlots: readStringArray(payload["changedSlots"]),
528
+ changedProfileFields: readStringArray(payload["changedProfileFields"]),
529
+ appliedPatchCount: readNumber(payload["appliedPatchCount"]),
530
+ skippedPatchCount: readNumber(payload["skippedPatchCount"]),
531
+ appliedPatches: readAppliedMemoryPatches(payload["appliedPatches"]),
532
+ skippedPatches: readSkippedMemoryPatches(payload["skippedPatches"]),
533
+ profilePatchEquivalent: readBoolean(payload["profilePatchEquivalent"]),
534
+ profilePatchComparedFields: readStringArray(payload["profilePatchComparedFields"]),
535
+ profilePatchMismatchedFields: readStringArray(payload["profilePatchMismatchedFields"]),
536
+ patchDerivation: readString(payload["patchDerivation"]),
537
+ profileWriteMode: readString(payload["profileWriteMode"]),
538
+ profileWriteSource: readString(payload["profileWriteSource"]),
539
+ profileWriteReason: readString(payload["profileWriteReason"]),
540
+ intentWritePolicy: readIntentWritePolicySummary(payload["intentWritePolicy"]),
541
+ };
542
+ }
543
+ function readIntentWritePolicySummary(value) {
544
+ const policy = readRecord(value);
545
+ if (!policy)
546
+ return null;
547
+ return {
548
+ intentId: readString(policy["intentId"]),
549
+ writeSlots: readStringArray(policy["writeSlots"]),
550
+ missingMemorySlots: readStringArray(policy["missingMemorySlots"]),
551
+ changedSlots: readStringArray(policy["changedSlots"]),
552
+ appliedPatchCount: readNumber(policy["appliedPatchCount"]),
553
+ skippedPatchCount: readNumber(policy["skippedPatchCount"]),
554
+ skippedPatches: readSkippedMemoryPatches(policy["skippedPatches"]),
555
+ profilePatchEquivalent: readBoolean(policy["profilePatchEquivalent"]),
556
+ profilePatchComparedFields: readStringArray(policy["profilePatchComparedFields"]),
557
+ profilePatchMismatchedFields: readStringArray(policy["profilePatchMismatchedFields"]),
558
+ };
559
+ }
560
+ function readThreadProfileWriteSummary(stage, payload) {
561
+ if (stage !== ASSISTANT_WORKFLOW_TRACE_STAGE.threadProfileUpdated)
562
+ return null;
563
+ return {
564
+ stage,
565
+ changed: readBoolean(payload["changed"]),
566
+ changedFields: readStringArray(payload["changedFields"]),
567
+ writeMode: readString(payload["writeMode"]),
568
+ writeSource: readString(payload["writeSource"]),
569
+ writeReason: readString(payload["writeReason"]),
570
+ };
571
+ }
572
+ function readPolicyMismatchFields(value) {
573
+ if (!Array.isArray(value))
574
+ return [];
575
+ return uniqueStrings(value.flatMap((entry) => {
576
+ const record = readRecord(entry);
577
+ const field = record ? readString(record["field"]) : null;
578
+ return field ? [field] : [];
579
+ }));
580
+ }
581
+ function readAppliedMemoryPatches(value) {
582
+ if (!Array.isArray(value))
583
+ return [];
584
+ return value.flatMap((entry) => {
585
+ const record = readRecord(entry);
586
+ if (!record)
587
+ return [];
588
+ const slotId = readString(record["slotId"]);
589
+ const operation = readString(record["operation"]);
590
+ if (!slotId || !operation)
591
+ return [];
592
+ return [{
593
+ slotId,
594
+ operation,
595
+ changed: readBoolean(record["changed"]) ?? false,
596
+ }];
597
+ });
598
+ }
599
+ function readSkippedMemoryPatches(value) {
600
+ if (!Array.isArray(value))
601
+ return [];
602
+ return value.flatMap((entry) => {
603
+ const record = readRecord(entry);
604
+ if (!record)
605
+ return [];
606
+ const reason = readString(record["reason"]);
607
+ if (!reason)
608
+ return [];
609
+ return [{
610
+ slotId: readString(record["slotId"]),
611
+ operation: readString(record["operation"]),
612
+ reason,
613
+ }];
614
+ });
615
+ }
616
+ function readDirectRouteSummary(stage, payload) {
617
+ const parsedStage = parseAssistantWorkflowDirectRouteTraceStage(stage);
618
+ if (!parsedStage)
619
+ return null;
620
+ return {
621
+ stage,
622
+ route: parsedStage.route,
623
+ outcome: parsedStage.outcome,
624
+ reason: readString(payload["reason"]),
625
+ strategy: readString(payload["strategy"]),
626
+ topic: readString(payload["topic"]),
627
+ tool: readString(payload["tool"]),
628
+ mode: readString(payload["mode"]),
629
+ handled: readBoolean(payload["handled"]),
630
+ contentChars: readNumber(payload["contentChars"]),
631
+ tookMs: readNumber(payload["tookMs"]),
632
+ };
633
+ }
634
+ function readDirectRoutePolicySummary(stage, payload) {
635
+ if (stage !== ASSISTANT_WORKFLOW_TRACE_STAGE.directRoutePolicy)
636
+ return null;
637
+ return {
638
+ stage,
639
+ intent: readString(payload["intent"]),
640
+ route: readString(payload["route"]),
641
+ enabled: readBoolean(payload["enabled"]),
642
+ reason: readString(payload["reason"]),
643
+ policyRouteIds: readStringArray(payload["policyRouteIds"]),
644
+ };
645
+ }
646
+ function readDirectRouteGapSummary(stage, payload) {
647
+ if (stage !== ASSISTANT_WORKFLOW_TRACE_STAGE.directRouteGap)
648
+ return null;
649
+ return {
650
+ stage,
651
+ handlerId: readString(payload["handlerId"]),
652
+ layer: readString(payload["layer"]),
653
+ route: readString(payload["route"]),
654
+ reason: readString(payload["reason"]),
655
+ };
656
+ }
657
+ function readQualitySignalNames(value) {
658
+ if (!Array.isArray(value))
659
+ return [];
660
+ const out = [];
661
+ for (const entry of value) {
662
+ if (typeof entry === "string") {
663
+ out.push(entry);
664
+ continue;
665
+ }
666
+ const record = readRecord(entry);
667
+ const name = record ? readString(record["name"]) : null;
668
+ if (name)
669
+ out.push(name);
670
+ }
671
+ return uniqueStrings(out);
672
+ }
673
+ function uniqueStrings(values) {
674
+ const out = [];
675
+ const seen = new Set();
676
+ for (const value of values) {
677
+ const trimmed = value.trim();
678
+ if (!trimmed.length || seen.has(trimmed))
679
+ continue;
680
+ seen.add(trimmed);
681
+ out.push(trimmed);
682
+ }
683
+ return out;
684
+ }
685
+ //# sourceMappingURL=trace-replay.js.map