@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,106 @@
1
+ import { findAssistantWorkflowIntent, normalizeAssistantWorkflowId, } from "./definition.js";
2
+ export function buildAssistantWorkflowDirectRoutePolicy(workflow, intentId) {
3
+ const normalizedIntentId = normalizeAssistantWorkflowId(intentId);
4
+ const intent = findAssistantWorkflowIntent(workflow, normalizedIntentId);
5
+ const routeIds = uniqueStrings(intent?.directRoutes ?? []);
6
+ const routesById = new Map((workflow.directRoutes ?? []).map((route) => [route.id, route]));
7
+ const routes = routeIds.flatMap((routeId) => {
8
+ const route = routesById.get(routeId);
9
+ return route ? [route] : [];
10
+ });
11
+ const missingRouteIds = routeIds.filter((routeId) => !routesById.has(routeId));
12
+ return {
13
+ intentId: intent?.id ?? normalizedIntentId,
14
+ routeIds,
15
+ routes,
16
+ missingRouteIds,
17
+ };
18
+ }
19
+ export function buildAssistantWorkflowDirectRouteRuntimeDecision(input) {
20
+ const routeId = normalizeAssistantWorkflowId(input.routeId) ?? "";
21
+ if (input.policyScope === "catalog") {
22
+ const routeIds = new Set((input.workflow.directRoutes ?? []).map((route) => route.id));
23
+ if (!routeId || !routeIds.has(routeId)) {
24
+ return {
25
+ intentId: null,
26
+ routeId,
27
+ enabled: false,
28
+ reason: "route_not_declared",
29
+ policyRouteIds: [],
30
+ };
31
+ }
32
+ if (!input.runtimeEnabled) {
33
+ return {
34
+ intentId: null,
35
+ routeId,
36
+ enabled: false,
37
+ reason: "runtime_disabled",
38
+ policyRouteIds: [routeId],
39
+ };
40
+ }
41
+ return {
42
+ intentId: null,
43
+ routeId,
44
+ enabled: true,
45
+ reason: "enabled",
46
+ policyRouteIds: [routeId],
47
+ };
48
+ }
49
+ const policy = buildAssistantWorkflowDirectRoutePolicy(input.workflow, input.intentId);
50
+ if (!policy.intentId || !findAssistantWorkflowIntent(input.workflow, policy.intentId)) {
51
+ return {
52
+ intentId: policy.intentId,
53
+ routeId,
54
+ enabled: false,
55
+ reason: "intent_not_found",
56
+ policyRouteIds: policy.routeIds,
57
+ };
58
+ }
59
+ if (!routeId || !policy.routeIds.includes(routeId)) {
60
+ return {
61
+ intentId: policy.intentId,
62
+ routeId,
63
+ enabled: false,
64
+ reason: "route_not_declared",
65
+ policyRouteIds: policy.routeIds,
66
+ };
67
+ }
68
+ if (!input.runtimeEnabled) {
69
+ return {
70
+ intentId: policy.intentId,
71
+ routeId,
72
+ enabled: false,
73
+ reason: "runtime_disabled",
74
+ policyRouteIds: policy.routeIds,
75
+ };
76
+ }
77
+ return {
78
+ intentId: policy.intentId,
79
+ routeId,
80
+ enabled: true,
81
+ reason: "enabled",
82
+ policyRouteIds: policy.routeIds,
83
+ };
84
+ }
85
+ export function buildAssistantWorkflowDirectRouteRuntimeDecisionTracePayload(decision) {
86
+ return {
87
+ intent: decision.intentId,
88
+ route: decision.routeId,
89
+ enabled: decision.enabled,
90
+ reason: decision.reason,
91
+ policyRouteIds: decision.policyRouteIds,
92
+ };
93
+ }
94
+ function uniqueStrings(values) {
95
+ const out = [];
96
+ const seen = new Set();
97
+ for (const value of values) {
98
+ const normalized = normalizeAssistantWorkflowId(value);
99
+ if (!normalized || seen.has(normalized))
100
+ continue;
101
+ seen.add(normalized);
102
+ out.push(normalized);
103
+ }
104
+ return out;
105
+ }
106
+ //# sourceMappingURL=direct-route-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"direct-route-policy.js","sourceRoot":"","sources":["../src/direct-route-policy.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n findAssistantWorkflowIntent,\n normalizeAssistantWorkflowId,\n type AssistantWorkflowDefinition,\n type AssistantWorkflowDirectRouteDefinition,\n} from \"./definition.js\";\n\nexport type AssistantWorkflowDirectRoutePolicy = {\n intentId: string | null;\n routeIds: string[];\n routes: AssistantWorkflowDirectRouteDefinition[];\n missingRouteIds: string[];\n};\n\nexport type AssistantWorkflowDirectRouteRuntimeDecision = {\n intentId: string | null;\n routeId: string;\n enabled: boolean;\n reason: \"enabled\" | \"runtime_disabled\" | \"intent_not_found\" | \"route_not_declared\";\n policyRouteIds: string[];\n};\n\nexport type AssistantWorkflowDirectRouteRuntimeDecisionScope = \"intent\" | \"catalog\";\n\nexport function buildAssistantWorkflowDirectRoutePolicy(\n workflow: AssistantWorkflowDefinition<string, string, string, string>,\n intentId: unknown,\n): AssistantWorkflowDirectRoutePolicy {\n const normalizedIntentId = normalizeAssistantWorkflowId(intentId);\n const intent = findAssistantWorkflowIntent(workflow, normalizedIntentId);\n const routeIds = uniqueStrings(intent?.directRoutes ?? []);\n const routesById = new Map((workflow.directRoutes ?? []).map((route) => [route.id, route] as const));\n const routes = routeIds.flatMap((routeId) => {\n const route = routesById.get(routeId);\n return route ? [route] : [];\n });\n const missingRouteIds = routeIds.filter((routeId) => !routesById.has(routeId));\n\n return {\n intentId: intent?.id ?? normalizedIntentId,\n routeIds,\n routes,\n missingRouteIds,\n };\n}\n\nexport function buildAssistantWorkflowDirectRouteRuntimeDecision(input: {\n workflow: AssistantWorkflowDefinition<string, string, string, string>;\n intentId?: unknown;\n routeId: unknown;\n runtimeEnabled: boolean;\n policyScope?: AssistantWorkflowDirectRouteRuntimeDecisionScope;\n}): AssistantWorkflowDirectRouteRuntimeDecision {\n const routeId = normalizeAssistantWorkflowId(input.routeId) ?? \"\";\n if (input.policyScope === \"catalog\") {\n const routeIds = new Set((input.workflow.directRoutes ?? []).map((route) => route.id));\n if (!routeId || !routeIds.has(routeId)) {\n return {\n intentId: null,\n routeId,\n enabled: false,\n reason: \"route_not_declared\",\n policyRouteIds: [],\n };\n }\n if (!input.runtimeEnabled) {\n return {\n intentId: null,\n routeId,\n enabled: false,\n reason: \"runtime_disabled\",\n policyRouteIds: [routeId],\n };\n }\n return {\n intentId: null,\n routeId,\n enabled: true,\n reason: \"enabled\",\n policyRouteIds: [routeId],\n };\n }\n const policy = buildAssistantWorkflowDirectRoutePolicy(input.workflow, input.intentId);\n if (!policy.intentId || !findAssistantWorkflowIntent(input.workflow, policy.intentId)) {\n return {\n intentId: policy.intentId,\n routeId,\n enabled: false,\n reason: \"intent_not_found\",\n policyRouteIds: policy.routeIds,\n };\n }\n if (!routeId || !policy.routeIds.includes(routeId)) {\n return {\n intentId: policy.intentId,\n routeId,\n enabled: false,\n reason: \"route_not_declared\",\n policyRouteIds: policy.routeIds,\n };\n }\n if (!input.runtimeEnabled) {\n return {\n intentId: policy.intentId,\n routeId,\n enabled: false,\n reason: \"runtime_disabled\",\n policyRouteIds: policy.routeIds,\n };\n }\n return {\n intentId: policy.intentId,\n routeId,\n enabled: true,\n reason: \"enabled\",\n policyRouteIds: policy.routeIds,\n };\n}\n\nexport function buildAssistantWorkflowDirectRouteRuntimeDecisionTracePayload(\n decision: AssistantWorkflowDirectRouteRuntimeDecision,\n): Record<string, unknown> {\n return {\n intent: decision.intentId,\n route: decision.routeId,\n enabled: decision.enabled,\n reason: decision.reason,\n policyRouteIds: decision.policyRouteIds,\n };\n}\n\nfunction uniqueStrings(values: readonly string[]): string[] {\n const out: string[] = [];\n const seen = new Set<string>();\n for (const value of values) {\n const normalized = normalizeAssistantWorkflowId(value);\n if (!normalized || seen.has(normalized)) continue;\n seen.add(normalized);\n out.push(normalized);\n }\n return out;\n}\n"]}
@@ -0,0 +1,85 @@
1
+ import type { AssistantWorkflowRunReportStatus } from "./run-report.js";
2
+ import type { AssistantWorkflowJsonValue, AssistantWorkflowSerializedRunReport } from "./run-report-json.js";
3
+ import type { AssistantWorkflowSerializedToolSelectionDecision } from "./tool-selection-json.js";
4
+ import type { AssistantWorkflowTraceEvalCandidate } from "./trace-replay.js";
5
+ export declare const ASSISTANT_WORKFLOW_EVAL_CASE_SCHEMA_VERSION = 1;
6
+ export type AssistantWorkflowEvalCaseSourceKind = "manual" | "trace-replay" | "run-report" | "tool-selection";
7
+ export type AssistantWorkflowEvalCaseSource = {
8
+ kind: AssistantWorkflowEvalCaseSourceKind;
9
+ requestId: string | null;
10
+ debugId: string | null;
11
+ workflowId: string | null;
12
+ workflowVersion: number | null;
13
+ createdAt: string | null;
14
+ };
15
+ export type AssistantWorkflowEvalCaseExpectations = {
16
+ intent: string | null;
17
+ presentation: string | null;
18
+ status: AssistantWorkflowRunReportStatus | null;
19
+ outcomeKind: string | null;
20
+ planStepIds: string[];
21
+ activePlanningStepProfileIds: string[];
22
+ profileStepIds: string[];
23
+ tools: string[];
24
+ signalNames: string[];
25
+ qualitySignalNames: string[];
26
+ };
27
+ export type AssistantWorkflowEvalCase = {
28
+ schemaVersion: typeof ASSISTANT_WORKFLOW_EVAL_CASE_SCHEMA_VERSION;
29
+ id: string;
30
+ prompt: string;
31
+ required: boolean;
32
+ tags: string[];
33
+ source: AssistantWorkflowEvalCaseSource;
34
+ expectations: AssistantWorkflowEvalCaseExpectations;
35
+ notes: string[];
36
+ metadata: Record<string, AssistantWorkflowJsonValue>;
37
+ };
38
+ export type AssistantWorkflowEvalCaseInput = {
39
+ id?: string | null;
40
+ prompt: string;
41
+ required?: boolean | null;
42
+ tags?: readonly string[] | null;
43
+ source?: Partial<AssistantWorkflowEvalCaseSource> | null;
44
+ expectations?: Partial<AssistantWorkflowEvalCaseExpectations> | null;
45
+ notes?: readonly string[] | null;
46
+ metadata?: Record<string, AssistantWorkflowJsonValue> | null;
47
+ };
48
+ export type AssistantWorkflowTraceEvalCaseOptions = {
49
+ id?: string | null;
50
+ required?: boolean | null;
51
+ tags?: readonly string[] | null;
52
+ source?: Partial<AssistantWorkflowEvalCaseSource> | null;
53
+ notes?: readonly string[] | null;
54
+ metadata?: Record<string, AssistantWorkflowJsonValue> | null;
55
+ };
56
+ export type AssistantWorkflowRunReportEvalCaseOptions = AssistantWorkflowTraceEvalCaseOptions & {
57
+ prompt: string;
58
+ };
59
+ export type AssistantWorkflowToolSelectionEvalCaseOptions = AssistantWorkflowTraceEvalCaseOptions & {
60
+ prompt: string;
61
+ };
62
+ export type AssistantWorkflowEvalCaseLineErrorReason = "invalid_json" | "invalid_eval_case";
63
+ export type AssistantWorkflowEvalCaseLineError = {
64
+ lineNumber: number;
65
+ reason: AssistantWorkflowEvalCaseLineErrorReason;
66
+ preview: string;
67
+ };
68
+ export type AssistantWorkflowEvalCaseLinesParseResult = {
69
+ lineCount: number;
70
+ caseCount: number;
71
+ errorCount: number;
72
+ cases: AssistantWorkflowEvalCase[];
73
+ errors: AssistantWorkflowEvalCaseLineError[];
74
+ };
75
+ export declare function buildAssistantWorkflowEvalCase(input: AssistantWorkflowEvalCaseInput): AssistantWorkflowEvalCase;
76
+ export declare function buildAssistantWorkflowEvalCaseFromTraceCandidate(candidate: AssistantWorkflowTraceEvalCandidate, options?: AssistantWorkflowTraceEvalCaseOptions): AssistantWorkflowEvalCase;
77
+ export declare function buildAssistantWorkflowEvalCaseFromSerializedRunReport(report: AssistantWorkflowSerializedRunReport, options: AssistantWorkflowRunReportEvalCaseOptions): AssistantWorkflowEvalCase;
78
+ export declare function buildAssistantWorkflowEvalCaseFromSerializedToolSelectionDecision(decision: AssistantWorkflowSerializedToolSelectionDecision, options: AssistantWorkflowToolSelectionEvalCaseOptions): AssistantWorkflowEvalCase;
79
+ export declare function stringifyAssistantWorkflowEvalCase(evalCase: AssistantWorkflowEvalCase, space?: number): string;
80
+ export declare function stringifyAssistantWorkflowEvalCaseLines(cases: readonly AssistantWorkflowEvalCase[], options?: {
81
+ trailingNewline?: boolean;
82
+ }): string;
83
+ export declare function parseAssistantWorkflowEvalCase(value: unknown): AssistantWorkflowEvalCase | null;
84
+ export declare function parseAssistantWorkflowEvalCaseLines(input: string): AssistantWorkflowEvalCaseLinesParseResult;
85
+ //# sourceMappingURL=eval-case.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval-case.d.ts","sourceRoot":"","sources":["../src/eval-case.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,366 @@
1
+ import { readAssistantWorkflowNestedArray as readNestedArray, readAssistantWorkflowNestedString as readNestedStringOrNull, readAssistantWorkflowString as readStringOrNull, readAssistantWorkflowStringArray as readStringArray, } from "./value-readers.js";
2
+ export const ASSISTANT_WORKFLOW_EVAL_CASE_SCHEMA_VERSION = 1;
3
+ export function buildAssistantWorkflowEvalCase(input) {
4
+ const prompt = normalizeRequiredString(input.prompt, "prompt");
5
+ const source = normalizeEvalCaseSource(input.source, "manual");
6
+ const expectations = normalizeEvalCaseExpectations(input.expectations);
7
+ const tags = uniqueNonEmptyStrings(input.tags ?? []);
8
+ const notes = uniqueNonEmptyStrings(input.notes ?? []);
9
+ const metadata = input.metadata ?? {};
10
+ return {
11
+ schemaVersion: ASSISTANT_WORKFLOW_EVAL_CASE_SCHEMA_VERSION,
12
+ id: normalizeOptionalString(input.id) ?? buildEvalCaseId(prompt, expectations.intent, source.kind),
13
+ prompt,
14
+ required: input.required === true,
15
+ tags,
16
+ source,
17
+ expectations,
18
+ notes,
19
+ metadata,
20
+ };
21
+ }
22
+ export function buildAssistantWorkflowEvalCaseFromTraceCandidate(candidate, options = {}) {
23
+ return buildAssistantWorkflowEvalCase({
24
+ prompt: candidate.promptPreview,
25
+ source: {
26
+ ...options.source,
27
+ kind: options.source?.kind ?? "trace-replay",
28
+ },
29
+ expectations: {
30
+ intent: candidate.expectedIntent,
31
+ presentation: candidate.expectedPresentation,
32
+ planStepIds: candidate.expectedPlanStepIds,
33
+ activePlanningStepProfileIds: candidate.expectedActivePlanningStepProfileIds,
34
+ profileStepIds: candidate.expectedProfileStepIds,
35
+ tools: candidate.expectedTools,
36
+ qualitySignalNames: candidate.qualitySignalNames,
37
+ },
38
+ notes: [...candidate.notes, ...(options.notes ?? [])],
39
+ ...(options.id !== undefined ? { id: options.id } : {}),
40
+ ...(options.required !== undefined ? { required: options.required } : {}),
41
+ ...(options.tags !== undefined ? { tags: options.tags } : {}),
42
+ ...(options.metadata !== undefined ? { metadata: options.metadata } : {}),
43
+ });
44
+ }
45
+ export function buildAssistantWorkflowEvalCaseFromSerializedRunReport(report, options) {
46
+ return buildAssistantWorkflowEvalCase({
47
+ prompt: options.prompt,
48
+ source: {
49
+ ...options.source,
50
+ kind: options.source?.kind ?? "run-report",
51
+ workflowId: options.source?.workflowId ?? report.workflowId,
52
+ workflowVersion: options.source?.workflowVersion ?? report.workflowVersion,
53
+ },
54
+ expectations: {
55
+ intent: readStringOrNull(report.evaluation["intent"]) ?? readNestedStringOrNull(report.run, ["decision", "intent"]),
56
+ presentation: readNestedStringOrNull(report.run, ["decision", "effectivePresentation"]),
57
+ status: report.status,
58
+ outcomeKind: readStringOrNull(report.evaluation["outcomeKind"]) ?? readStringOrNull(report.outcome["kind"]),
59
+ planStepIds: readPlanStepIds(report),
60
+ activePlanningStepProfileIds: readStringArray(report.evaluation["activePlanningStepProfileIds"]),
61
+ profileStepIds: readStringArray(report.evaluation["profileStepIds"]),
62
+ tools: readInvocationToolNames(report),
63
+ signalNames: readSignalNames(report),
64
+ },
65
+ ...(options.id !== undefined ? { id: options.id } : {}),
66
+ ...(options.required !== undefined ? { required: options.required } : {}),
67
+ ...(options.tags !== undefined ? { tags: options.tags } : {}),
68
+ ...(options.notes !== undefined ? { notes: options.notes } : {}),
69
+ ...(options.metadata !== undefined ? { metadata: options.metadata } : {}),
70
+ });
71
+ }
72
+ export function buildAssistantWorkflowEvalCaseFromSerializedToolSelectionDecision(decision, options) {
73
+ return buildAssistantWorkflowEvalCase({
74
+ prompt: options.prompt,
75
+ source: {
76
+ ...options.source,
77
+ kind: options.source?.kind ?? "tool-selection",
78
+ workflowId: options.source?.workflowId ?? readNestedStringOrNull(decision.comparisonPayload, ["workflowRun", "workflowId"]),
79
+ workflowVersion: options.source?.workflowVersion ?? readWorkflowVersion(decision),
80
+ },
81
+ expectations: {
82
+ intent: readNestedStringOrNull(decision.comparisonPayload, ["intent"])
83
+ ?? readNestedStringOrNull(decision.comparisonPayload, ["workflowRun", "decision", "intent"]),
84
+ presentation: readNestedStringOrNull(decision.comparisonPayload, ["effectivePresentation"])
85
+ ?? readNestedStringOrNull(decision.comparisonPayload, ["workflowRun", "decision", "effectivePresentation"]),
86
+ planStepIds: readSelectionPlanStepIds(decision),
87
+ activePlanningStepProfileIds: readSelectionActivePlanningStepProfileIds(decision),
88
+ profileStepIds: readSelectionProfileStepIds(decision),
89
+ tools: decision.effectiveToolNames,
90
+ signalNames: uniqueNonEmptyStrings([
91
+ decision.authority.source,
92
+ decision.authority.reason,
93
+ ]),
94
+ },
95
+ notes: [
96
+ `tool_selection_authority: ${decision.authority.source}/${decision.authority.reason}`,
97
+ ...(options.notes ?? []),
98
+ ],
99
+ metadata: {
100
+ ...(options.metadata ?? {}),
101
+ authoritySource: decision.authority.source,
102
+ authorityReason: decision.authority.reason,
103
+ },
104
+ ...(options.id !== undefined ? { id: options.id } : {}),
105
+ ...(options.required !== undefined ? { required: options.required } : {}),
106
+ ...(options.tags !== undefined ? { tags: options.tags } : {}),
107
+ });
108
+ }
109
+ export function stringifyAssistantWorkflowEvalCase(evalCase, space) {
110
+ return JSON.stringify(evalCase, null, space);
111
+ }
112
+ export function stringifyAssistantWorkflowEvalCaseLines(cases, options = {}) {
113
+ const lines = cases.map((evalCase) => JSON.stringify(evalCase));
114
+ if (!lines.length)
115
+ return "";
116
+ return options.trailingNewline === true ? `${lines.join("\n")}\n` : lines.join("\n");
117
+ }
118
+ export function parseAssistantWorkflowEvalCase(value) {
119
+ if (!isRecord(value))
120
+ return null;
121
+ if (value["schemaVersion"] !== ASSISTANT_WORKFLOW_EVAL_CASE_SCHEMA_VERSION)
122
+ return null;
123
+ if (typeof value["id"] !== "string" || !value["id"].trim().length)
124
+ return null;
125
+ if (typeof value["prompt"] !== "string" || !value["prompt"].trim().length)
126
+ return null;
127
+ if (typeof value["required"] !== "boolean")
128
+ return null;
129
+ if (!isStringArray(value["tags"]))
130
+ return null;
131
+ if (!isEvalCaseSource(value["source"]))
132
+ return null;
133
+ if (!isEvalCaseExpectations(value["expectations"]))
134
+ return null;
135
+ if (!isStringArray(value["notes"]))
136
+ return null;
137
+ if (!isJsonRecord(value["metadata"]))
138
+ return null;
139
+ return {
140
+ schemaVersion: ASSISTANT_WORKFLOW_EVAL_CASE_SCHEMA_VERSION,
141
+ id: value["id"],
142
+ prompt: value["prompt"],
143
+ required: value["required"],
144
+ tags: value["tags"],
145
+ source: value["source"],
146
+ expectations: normalizeEvalCaseExpectations(value["expectations"]),
147
+ notes: value["notes"],
148
+ metadata: value["metadata"],
149
+ };
150
+ }
151
+ export function parseAssistantWorkflowEvalCaseLines(input) {
152
+ const cases = [];
153
+ const errors = [];
154
+ let lineCount = 0;
155
+ for (const [index, line] of input.split(/\r?\n/).entries()) {
156
+ const trimmed = line.trim();
157
+ if (!trimmed.length)
158
+ continue;
159
+ const lineNumber = index + 1;
160
+ lineCount += 1;
161
+ let parsed;
162
+ try {
163
+ parsed = JSON.parse(trimmed);
164
+ }
165
+ catch {
166
+ errors.push({
167
+ lineNumber,
168
+ reason: "invalid_json",
169
+ preview: previewLine(trimmed),
170
+ });
171
+ continue;
172
+ }
173
+ const evalCase = parseAssistantWorkflowEvalCase(parsed);
174
+ if (!evalCase) {
175
+ errors.push({
176
+ lineNumber,
177
+ reason: "invalid_eval_case",
178
+ preview: previewLine(trimmed),
179
+ });
180
+ continue;
181
+ }
182
+ cases.push(evalCase);
183
+ }
184
+ return {
185
+ lineCount,
186
+ caseCount: cases.length,
187
+ errorCount: errors.length,
188
+ cases,
189
+ errors,
190
+ };
191
+ }
192
+ function normalizeEvalCaseSource(source, fallbackKind) {
193
+ return {
194
+ kind: isEvalCaseSourceKind(source?.kind) ? source.kind : fallbackKind,
195
+ requestId: normalizeOptionalString(source?.requestId),
196
+ debugId: normalizeOptionalString(source?.debugId),
197
+ workflowId: normalizeOptionalString(source?.workflowId),
198
+ workflowVersion: typeof source?.workflowVersion === "number" && Number.isFinite(source.workflowVersion)
199
+ ? source.workflowVersion
200
+ : null,
201
+ createdAt: normalizeOptionalString(source?.createdAt),
202
+ };
203
+ }
204
+ function normalizeEvalCaseExpectations(expectations) {
205
+ return {
206
+ intent: normalizeOptionalString(expectations?.intent),
207
+ presentation: normalizeOptionalString(expectations?.presentation),
208
+ status: isRunReportStatus(expectations?.status) ? expectations.status : null,
209
+ outcomeKind: normalizeOptionalString(expectations?.outcomeKind),
210
+ planStepIds: uniqueNonEmptyStrings(expectations?.planStepIds ?? []),
211
+ activePlanningStepProfileIds: uniqueNonEmptyStrings(expectations?.activePlanningStepProfileIds ?? []),
212
+ profileStepIds: uniqueNonEmptyStrings(expectations?.profileStepIds ?? []),
213
+ tools: uniqueNonEmptyStrings(expectations?.tools ?? []),
214
+ signalNames: uniqueNonEmptyStrings(expectations?.signalNames ?? []),
215
+ qualitySignalNames: uniqueNonEmptyStrings(expectations?.qualitySignalNames ?? []),
216
+ };
217
+ }
218
+ function readPlanStepIds(report) {
219
+ const steps = readNestedArray(report.run, ["executionPlan", "steps"]);
220
+ return uniqueNonEmptyStrings(steps.flatMap((step) => isRecord(step) ? [step["id"]] : []));
221
+ }
222
+ function readInvocationToolNames(report) {
223
+ const invocations = readNestedArray(report.run, ["toolInvocationQueue", "invocations"]);
224
+ return uniqueNonEmptyStrings(invocations.flatMap((invocation) => isRecord(invocation) ? [invocation["toolName"]] : []));
225
+ }
226
+ function readSignalNames(report) {
227
+ const signals = readNestedArray(report.evaluation, ["signals"]);
228
+ return uniqueNonEmptyStrings(signals.flatMap((signal) => isRecord(signal) ? [signal["name"]] : []));
229
+ }
230
+ function readSelectionPlanStepIds(decision) {
231
+ const fromPlan = readNestedArray(decision.comparisonPayload, ["plan", "stepIds"]);
232
+ if (fromPlan.length)
233
+ return uniqueNonEmptyStrings(fromPlan);
234
+ const fromExecutionPlan = readNestedArray(decision.comparisonPayload, ["executionPlan", "steps"]);
235
+ return uniqueNonEmptyStrings(fromExecutionPlan.flatMap((step) => isRecord(step) ? [step["id"]] : []));
236
+ }
237
+ function readSelectionActivePlanningStepProfileIds(decision) {
238
+ const fromPlan = readNestedArray(decision.comparisonPayload, ["plan", "activePlanningStepProfileIds"]);
239
+ if (fromPlan.length)
240
+ return uniqueNonEmptyStrings(fromPlan);
241
+ return readNestedArray(decision.comparisonPayload, ["workflowRun", "decision", "plan", "activePlanningStepProfileIds"])
242
+ .filter((value) => typeof value === "string");
243
+ }
244
+ function readSelectionProfileStepIds(decision) {
245
+ const fromPlan = readNestedArray(decision.comparisonPayload, ["plan", "profileStepIds"]);
246
+ if (fromPlan.length)
247
+ return uniqueNonEmptyStrings(fromPlan);
248
+ return readNestedArray(decision.comparisonPayload, ["workflowRun", "decision", "plan", "profileStepIds"])
249
+ .filter((value) => typeof value === "string");
250
+ }
251
+ function readWorkflowVersion(decision) {
252
+ const payload = decision.comparisonPayload;
253
+ if (!isRecord(payload))
254
+ return null;
255
+ const workflowRun = payload["workflowRun"];
256
+ if (!isRecord(workflowRun))
257
+ return null;
258
+ return typeof workflowRun["workflowVersion"] === "number" && Number.isFinite(workflowRun["workflowVersion"])
259
+ ? workflowRun["workflowVersion"]
260
+ : null;
261
+ }
262
+ function buildEvalCaseId(prompt, intent, sourceKind) {
263
+ const prefix = [sourceKind, intent ?? "unknown"].map(toIdSegment).join("-");
264
+ return `${prefix}-${hashString(prompt)}`;
265
+ }
266
+ function hashString(value) {
267
+ let hash = 5381;
268
+ for (let index = 0; index < value.length; index += 1) {
269
+ hash = ((hash << 5) + hash) ^ value.charCodeAt(index);
270
+ }
271
+ return (hash >>> 0).toString(36);
272
+ }
273
+ function toIdSegment(value) {
274
+ const normalized = value.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
275
+ return normalized.length ? normalized : "unknown";
276
+ }
277
+ function uniqueNonEmptyStrings(values) {
278
+ const out = [];
279
+ const seen = new Set();
280
+ for (const value of values) {
281
+ if (typeof value !== "string")
282
+ continue;
283
+ const trimmed = value.trim();
284
+ if (!trimmed.length || seen.has(trimmed))
285
+ continue;
286
+ seen.add(trimmed);
287
+ out.push(trimmed);
288
+ }
289
+ return out;
290
+ }
291
+ function normalizeOptionalString(value) {
292
+ if (typeof value !== "string")
293
+ return null;
294
+ const trimmed = value.trim();
295
+ return trimmed.length ? trimmed : null;
296
+ }
297
+ function normalizeRequiredString(value, fieldName) {
298
+ const trimmed = value.trim();
299
+ if (!trimmed.length) {
300
+ throw new Error(`Assistant workflow eval case ${fieldName} is required.`);
301
+ }
302
+ return trimmed;
303
+ }
304
+ function isEvalCaseSource(value) {
305
+ if (!isRecord(value))
306
+ return false;
307
+ return (isEvalCaseSourceKind(value["kind"]) &&
308
+ isNullableString(value["requestId"]) &&
309
+ isNullableString(value["debugId"]) &&
310
+ isNullableString(value["workflowId"]) &&
311
+ (value["workflowVersion"] === null || (typeof value["workflowVersion"] === "number" && Number.isFinite(value["workflowVersion"]))) &&
312
+ isNullableString(value["createdAt"]));
313
+ }
314
+ function isEvalCaseExpectations(value) {
315
+ if (!isRecord(value))
316
+ return false;
317
+ return (isNullableString(value["intent"]) &&
318
+ isNullableString(value["presentation"]) &&
319
+ (value["status"] === null || isRunReportStatus(value["status"])) &&
320
+ isNullableString(value["outcomeKind"]) &&
321
+ isStringArray(value["planStepIds"]) &&
322
+ (value["activePlanningStepProfileIds"] === undefined || isStringArray(value["activePlanningStepProfileIds"])) &&
323
+ (value["profileStepIds"] === undefined || isStringArray(value["profileStepIds"])) &&
324
+ isStringArray(value["tools"]) &&
325
+ isStringArray(value["signalNames"]) &&
326
+ isStringArray(value["qualitySignalNames"]));
327
+ }
328
+ function isEvalCaseSourceKind(value) {
329
+ return value === "manual" || value === "trace-replay" || value === "run-report" || value === "tool-selection";
330
+ }
331
+ function isRunReportStatus(value) {
332
+ return (value === "completed" ||
333
+ value === "clarification" ||
334
+ value === "degraded" ||
335
+ value === "failed" ||
336
+ value === "not_handled");
337
+ }
338
+ function isNullableString(value) {
339
+ return value === null || typeof value === "string";
340
+ }
341
+ function isStringArray(value) {
342
+ return Array.isArray(value) && value.every((entry) => typeof entry === "string");
343
+ }
344
+ function isJsonRecord(value) {
345
+ if (!isRecord(value))
346
+ return false;
347
+ return Object.values(value).every(isJsonValue);
348
+ }
349
+ function isJsonValue(value) {
350
+ if (value === null)
351
+ return true;
352
+ if (typeof value === "string" || typeof value === "boolean")
353
+ return true;
354
+ if (typeof value === "number")
355
+ return Number.isFinite(value);
356
+ if (Array.isArray(value))
357
+ return value.every(isJsonValue);
358
+ return isJsonRecord(value);
359
+ }
360
+ function isRecord(value) {
361
+ return typeof value === "object" && value !== null && !Array.isArray(value);
362
+ }
363
+ function previewLine(line) {
364
+ return line.length <= 160 ? line : `${line.slice(0, 157)}...`;
365
+ }
366
+ //# sourceMappingURL=eval-case.js.map