@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.
- package/LICENSE +21 -0
- package/README.md +37 -0
- package/dist/clarification-policy.d.ts +64 -0
- package/dist/clarification-policy.d.ts.map +1 -0
- package/dist/clarification-policy.js +174 -0
- package/dist/clarification-policy.js.map +1 -0
- package/dist/decision.d.ts +37 -0
- package/dist/decision.d.ts.map +1 -0
- package/dist/decision.js +100 -0
- package/dist/decision.js.map +1 -0
- package/dist/definition-catalog-replay.d.ts +25 -0
- package/dist/definition-catalog-replay.d.ts.map +1 -0
- package/dist/definition-catalog-replay.js +54 -0
- package/dist/definition-catalog-replay.js.map +1 -0
- package/dist/definition-catalog.d.ts +45 -0
- package/dist/definition-catalog.d.ts.map +1 -0
- package/dist/definition-catalog.js +97 -0
- package/dist/definition-catalog.js.map +1 -0
- package/dist/definition-diagnostics.d.ts +17 -0
- package/dist/definition-diagnostics.d.ts.map +1 -0
- package/dist/definition-diagnostics.js +353 -0
- package/dist/definition-diagnostics.js.map +1 -0
- package/dist/definition-diff.d.ts +51 -0
- package/dist/definition-diff.d.ts.map +1 -0
- package/dist/definition-diff.js +172 -0
- package/dist/definition-diff.js.map +1 -0
- package/dist/definition-json.d.ts +53 -0
- package/dist/definition-json.d.ts.map +1 -0
- package/dist/definition-json.js +186 -0
- package/dist/definition-json.js.map +1 -0
- package/dist/definition-manifest.d.ts +41 -0
- package/dist/definition-manifest.d.ts.map +1 -0
- package/dist/definition-manifest.js +119 -0
- package/dist/definition-manifest.js.map +1 -0
- package/dist/definition-package-execution-json.d.ts +64 -0
- package/dist/definition-package-execution-json.d.ts.map +1 -0
- package/dist/definition-package-execution-json.js +245 -0
- package/dist/definition-package-execution-json.js.map +1 -0
- package/dist/definition-package-execution-replay.d.ts +14 -0
- package/dist/definition-package-execution-replay.d.ts.map +1 -0
- package/dist/definition-package-execution-replay.js +47 -0
- package/dist/definition-package-execution-replay.js.map +1 -0
- package/dist/definition-package-executor.d.ts +52 -0
- package/dist/definition-package-executor.d.ts.map +1 -0
- package/dist/definition-package-executor.js +70 -0
- package/dist/definition-package-executor.js.map +1 -0
- package/dist/definition-package-loader.d.ts +36 -0
- package/dist/definition-package-loader.d.ts.map +1 -0
- package/dist/definition-package-loader.js +56 -0
- package/dist/definition-package-loader.js.map +1 -0
- package/dist/definition-package-replay.d.ts +28 -0
- package/dist/definition-package-replay.d.ts.map +1 -0
- package/dist/definition-package-replay.js +74 -0
- package/dist/definition-package-replay.js.map +1 -0
- package/dist/definition-package-resolver.d.ts +31 -0
- package/dist/definition-package-resolver.d.ts.map +1 -0
- package/dist/definition-package-resolver.js +60 -0
- package/dist/definition-package-resolver.js.map +1 -0
- package/dist/definition-package-review.d.ts +29 -0
- package/dist/definition-package-review.d.ts.map +1 -0
- package/dist/definition-package-review.js +74 -0
- package/dist/definition-package-review.js.map +1 -0
- package/dist/definition-package-run-report.d.ts +25 -0
- package/dist/definition-package-run-report.d.ts.map +1 -0
- package/dist/definition-package-run-report.js +37 -0
- package/dist/definition-package-run-report.js.map +1 -0
- package/dist/definition-package-run.d.ts +20 -0
- package/dist/definition-package-run.d.ts.map +1 -0
- package/dist/definition-package-run.js +41 -0
- package/dist/definition-package-run.js.map +1 -0
- package/dist/definition-package-selection.d.ts +29 -0
- package/dist/definition-package-selection.d.ts.map +1 -0
- package/dist/definition-package-selection.js +68 -0
- package/dist/definition-package-selection.js.map +1 -0
- package/dist/definition-package-smoke.d.ts +74 -0
- package/dist/definition-package-smoke.d.ts.map +1 -0
- package/dist/definition-package-smoke.js +184 -0
- package/dist/definition-package-smoke.js.map +1 -0
- package/dist/definition-package.d.ts +36 -0
- package/dist/definition-package.d.ts.map +1 -0
- package/dist/definition-package.js +114 -0
- package/dist/definition-package.js.map +1 -0
- package/dist/definition-tuning-approval.d.ts +39 -0
- package/dist/definition-tuning-approval.d.ts.map +1 -0
- package/dist/definition-tuning-approval.js +207 -0
- package/dist/definition-tuning-approval.js.map +1 -0
- package/dist/definition-tuning-json.d.ts +58 -0
- package/dist/definition-tuning-json.d.ts.map +1 -0
- package/dist/definition-tuning-json.js +276 -0
- package/dist/definition-tuning-json.js.map +1 -0
- package/dist/definition-tuning-promotion.d.ts +120 -0
- package/dist/definition-tuning-promotion.d.ts.map +1 -0
- package/dist/definition-tuning-promotion.js +460 -0
- package/dist/definition-tuning-promotion.js.map +1 -0
- package/dist/definition-tuning-replay.d.ts +14 -0
- package/dist/definition-tuning-replay.d.ts.map +1 -0
- package/dist/definition-tuning-replay.js +50 -0
- package/dist/definition-tuning-replay.js.map +1 -0
- package/dist/definition-tuning-review-artifact.d.ts +56 -0
- package/dist/definition-tuning-review-artifact.d.ts.map +1 -0
- package/dist/definition-tuning-review-artifact.js +302 -0
- package/dist/definition-tuning-review-artifact.js.map +1 -0
- package/dist/definition-tuning-review.d.ts +59 -0
- package/dist/definition-tuning-review.d.ts.map +1 -0
- package/dist/definition-tuning-review.js +213 -0
- package/dist/definition-tuning-review.js.map +1 -0
- package/dist/definition-tuning-source-patch.d.ts +43 -0
- package/dist/definition-tuning-source-patch.d.ts.map +1 -0
- package/dist/definition-tuning-source-patch.js +214 -0
- package/dist/definition-tuning-source-patch.js.map +1 -0
- package/dist/definition-tuning.d.ts +73 -0
- package/dist/definition-tuning.d.ts.map +1 -0
- package/dist/definition-tuning.js +426 -0
- package/dist/definition-tuning.js.map +1 -0
- package/dist/definition.d.ts +189 -0
- package/dist/definition.d.ts.map +1 -0
- package/dist/definition.js +494 -0
- package/dist/definition.js.map +1 -0
- package/dist/direct-route-invocation.d.ts +132 -0
- package/dist/direct-route-invocation.d.ts.map +1 -0
- package/dist/direct-route-invocation.js +325 -0
- package/dist/direct-route-invocation.js.map +1 -0
- package/dist/direct-route-policy.d.ts +25 -0
- package/dist/direct-route-policy.d.ts.map +1 -0
- package/dist/direct-route-policy.js +106 -0
- package/dist/direct-route-policy.js.map +1 -0
- package/dist/eval-case.d.ts +85 -0
- package/dist/eval-case.d.ts.map +1 -0
- package/dist/eval-case.js +366 -0
- package/dist/eval-case.js.map +1 -0
- package/dist/eval-replay.d.ts +18 -0
- package/dist/eval-replay.d.ts.map +1 -0
- package/dist/eval-replay.js +41 -0
- package/dist/eval-replay.js.map +1 -0
- package/dist/eval-result.d.ts +46 -0
- package/dist/eval-result.d.ts.map +1 -0
- package/dist/eval-result.js +183 -0
- package/dist/eval-result.js.map +1 -0
- package/dist/eval-runner.d.ts +30 -0
- package/dist/eval-runner.d.ts.map +1 -0
- package/dist/eval-runner.js +57 -0
- package/dist/eval-runner.js.map +1 -0
- package/dist/eval-suite.d.ts +43 -0
- package/dist/eval-suite.d.ts.map +1 -0
- package/dist/eval-suite.js +101 -0
- package/dist/eval-suite.js.map +1 -0
- package/dist/execution-plan.d.ts +43 -0
- package/dist/execution-plan.d.ts.map +1 -0
- package/dist/execution-plan.js +187 -0
- package/dist/execution-plan.js.map +1 -0
- package/dist/hosted-tool-policy.d.ts +70 -0
- package/dist/hosted-tool-policy.d.ts.map +1 -0
- package/dist/hosted-tool-policy.js +228 -0
- package/dist/hosted-tool-policy.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +73 -0
- package/dist/index.js.map +1 -0
- package/dist/memory-policy.d.ts +55 -0
- package/dist/memory-policy.d.ts.map +1 -0
- package/dist/memory-policy.js +187 -0
- package/dist/memory-policy.js.map +1 -0
- package/dist/memory-updates.d.ts +39 -0
- package/dist/memory-updates.d.ts.map +1 -0
- package/dist/memory-updates.js +110 -0
- package/dist/memory-updates.js.map +1 -0
- package/dist/outcome-trace.d.ts +79 -0
- package/dist/outcome-trace.d.ts.map +1 -0
- package/dist/outcome-trace.js +117 -0
- package/dist/outcome-trace.js.map +1 -0
- package/dist/outcome.d.ts +97 -0
- package/dist/outcome.d.ts.map +1 -0
- package/dist/outcome.js +160 -0
- package/dist/outcome.js.map +1 -0
- package/dist/planner-compiler.d.ts +14 -0
- package/dist/planner-compiler.d.ts.map +1 -0
- package/dist/planner-compiler.js +26 -0
- package/dist/planner-compiler.js.map +1 -0
- package/dist/planning.d.ts +36 -0
- package/dist/planning.d.ts.map +1 -0
- package/dist/planning.js +141 -0
- package/dist/planning.js.map +1 -0
- package/dist/policy-resolution.d.ts +10 -0
- package/dist/policy-resolution.d.ts.map +1 -0
- package/dist/policy-resolution.js +30 -0
- package/dist/policy-resolution.js.map +1 -0
- package/dist/run-evaluation.d.ts +29 -0
- package/dist/run-evaluation.d.ts.map +1 -0
- package/dist/run-evaluation.js +128 -0
- package/dist/run-evaluation.js.map +1 -0
- package/dist/run-parity.d.ts +24 -0
- package/dist/run-parity.d.ts.map +1 -0
- package/dist/run-parity.js +36 -0
- package/dist/run-parity.js.map +1 -0
- package/dist/run-report-batch.d.ts +150 -0
- package/dist/run-report-batch.d.ts.map +1 -0
- package/dist/run-report-batch.js +391 -0
- package/dist/run-report-batch.js.map +1 -0
- package/dist/run-report-json.d.ts +76 -0
- package/dist/run-report-json.d.ts.map +1 -0
- package/dist/run-report-json.js +451 -0
- package/dist/run-report-json.js.map +1 -0
- package/dist/run-report.d.ts +22 -0
- package/dist/run-report.d.ts.map +1 -0
- package/dist/run-report.js +46 -0
- package/dist/run-report.js.map +1 -0
- package/dist/run.d.ts +20 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +36 -0
- package/dist/run.js.map +1 -0
- package/dist/tool-bindings.d.ts +42 -0
- package/dist/tool-bindings.d.ts.map +1 -0
- package/dist/tool-bindings.js +124 -0
- package/dist/tool-bindings.js.map +1 -0
- package/dist/tool-capabilities.d.ts +37 -0
- package/dist/tool-capabilities.d.ts.map +1 -0
- package/dist/tool-capabilities.js +91 -0
- package/dist/tool-capabilities.js.map +1 -0
- package/dist/tool-executor.d.ts +63 -0
- package/dist/tool-executor.d.ts.map +1 -0
- package/dist/tool-executor.js +176 -0
- package/dist/tool-executor.js.map +1 -0
- package/dist/tool-fixtures.d.ts +18 -0
- package/dist/tool-fixtures.d.ts.map +1 -0
- package/dist/tool-fixtures.js +52 -0
- package/dist/tool-fixtures.js.map +1 -0
- package/dist/tool-invocations.d.ts +31 -0
- package/dist/tool-invocations.d.ts.map +1 -0
- package/dist/tool-invocations.js +79 -0
- package/dist/tool-invocations.js.map +1 -0
- package/dist/tool-provider-executors.d.ts +43 -0
- package/dist/tool-provider-executors.d.ts.map +1 -0
- package/dist/tool-provider-executors.js +59 -0
- package/dist/tool-provider-executors.js.map +1 -0
- package/dist/tool-result-cache.d.ts +37 -0
- package/dist/tool-result-cache.d.ts.map +1 -0
- package/dist/tool-result-cache.js +173 -0
- package/dist/tool-result-cache.js.map +1 -0
- package/dist/tool-results.d.ts +41 -0
- package/dist/tool-results.d.ts.map +1 -0
- package/dist/tool-results.js +137 -0
- package/dist/tool-results.js.map +1 -0
- package/dist/tool-runtime.d.ts +46 -0
- package/dist/tool-runtime.d.ts.map +1 -0
- package/dist/tool-runtime.js +163 -0
- package/dist/tool-runtime.js.map +1 -0
- package/dist/tool-selection-evaluation.d.ts +214 -0
- package/dist/tool-selection-evaluation.d.ts.map +1 -0
- package/dist/tool-selection-evaluation.js +773 -0
- package/dist/tool-selection-evaluation.js.map +1 -0
- package/dist/tool-selection-json.d.ts +71 -0
- package/dist/tool-selection-json.d.ts.map +1 -0
- package/dist/tool-selection-json.js +284 -0
- package/dist/tool-selection-json.js.map +1 -0
- package/dist/tool-selection-policy.d.ts +81 -0
- package/dist/tool-selection-policy.d.ts.map +1 -0
- package/dist/tool-selection-policy.js +376 -0
- package/dist/tool-selection-policy.js.map +1 -0
- package/dist/tool-selection-replay.d.ts +26 -0
- package/dist/tool-selection-replay.d.ts.map +1 -0
- package/dist/tool-selection-replay.js +88 -0
- package/dist/tool-selection-replay.js.map +1 -0
- package/dist/tool-selection-rules.d.ts +46 -0
- package/dist/tool-selection-rules.d.ts.map +1 -0
- package/dist/tool-selection-rules.js +183 -0
- package/dist/tool-selection-rules.js.map +1 -0
- package/dist/tool-selection-trace-export.d.ts +37 -0
- package/dist/tool-selection-trace-export.d.ts.map +1 -0
- package/dist/tool-selection-trace-export.js +324 -0
- package/dist/tool-selection-trace-export.js.map +1 -0
- package/dist/trace-events.d.ts +14 -0
- package/dist/trace-events.d.ts.map +1 -0
- package/dist/trace-events.js +65 -0
- package/dist/trace-events.js.map +1 -0
- package/dist/trace-payload.d.ts +24 -0
- package/dist/trace-payload.d.ts.map +1 -0
- package/dist/trace-payload.js +113 -0
- package/dist/trace-payload.js.map +1 -0
- package/dist/trace-replay.d.ts +276 -0
- package/dist/trace-replay.d.ts.map +1 -0
- package/dist/trace-replay.js +685 -0
- package/dist/trace-replay.js.map +1 -0
- package/dist/trace-report.d.ts +320 -0
- package/dist/trace-report.d.ts.map +1 -0
- package/dist/trace-report.js +1394 -0
- package/dist/trace-report.js.map +1 -0
- package/dist/trace-stages.d.ts +70 -0
- package/dist/trace-stages.d.ts.map +1 -0
- package/dist/trace-stages.js +103 -0
- package/dist/trace-stages.js.map +1 -0
- package/dist/value-readers.d.ts +20 -0
- package/dist/value-readers.d.ts.map +1 -0
- package/dist/value-readers.js +82 -0
- package/dist/value-readers.js.map +1 -0
- package/package.json +341 -0
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
import { readAssistantWorkflowTraceBoolean as readBoolean, readAssistantWorkflowTraceNumber as readNumber, readAssistantWorkflowTracePayloadRecord as readRecord, readAssistantWorkflowTraceString as readString, readAssistantWorkflowTraceStringArray as readStringArray, readAssistantWorkflowTraceUserMessagePreview, } from "./trace-events.js";
|
|
2
|
+
import { ASSISTANT_WORKFLOW_TRACE_STAGE } from "./trace-stages.js";
|
|
3
|
+
import { buildAssistantWorkflowToolSelectionDecision, } from "./tool-selection-policy.js";
|
|
4
|
+
import { buildAssistantWorkflowEvalCaseFromSerializedToolSelectionDecision, } from "./eval-case.js";
|
|
5
|
+
import { parseAssistantWorkflowSerializedToolSelectionDecision, serializeAssistantWorkflowToolSelectionDecision, } from "./tool-selection-json.js";
|
|
6
|
+
export function buildAssistantWorkflowSerializedToolSelectionDecisionFromTraceEvent(event) {
|
|
7
|
+
if (event.stage !== ASSISTANT_WORKFLOW_TRACE_STAGE.toolSelectionWorkflowComparison)
|
|
8
|
+
return null;
|
|
9
|
+
const payload = readRecord(event.payload);
|
|
10
|
+
if (!payload)
|
|
11
|
+
return null;
|
|
12
|
+
const authority = readRecord(payload["authority"]);
|
|
13
|
+
const inferredWorkflowAuthorityReason = authority
|
|
14
|
+
? null
|
|
15
|
+
: inferWorkflowAuthorityReason(payload);
|
|
16
|
+
const selectedToolNames = authority
|
|
17
|
+
? readStringArray(authority["selectedToolNames"])
|
|
18
|
+
: inferredWorkflowAuthorityReason
|
|
19
|
+
? inferWorkflowAuthoritySelectedToolNames(payload)
|
|
20
|
+
: inferSelectedToolNames(payload);
|
|
21
|
+
const workflowSuggestedToolNames = authority
|
|
22
|
+
? readStringArray(authority["workflowSuggestedToolNames"])
|
|
23
|
+
: readStringArray(payload["workflowSuggestedTools"]);
|
|
24
|
+
const comparisonPayload = toJsonRecordOrNull(payload);
|
|
25
|
+
if (!comparisonPayload)
|
|
26
|
+
return null;
|
|
27
|
+
return parseAssistantWorkflowSerializedToolSelectionDecision({
|
|
28
|
+
schemaVersion: 1,
|
|
29
|
+
authority: {
|
|
30
|
+
source: authority?.["source"] ?? (inferredWorkflowAuthorityReason ? "workflow" : "legacy-pruner"),
|
|
31
|
+
reason: authority?.["reason"] ?? inferredWorkflowAuthorityReason ??
|
|
32
|
+
inferLegacyAuthorityReason(payload, selectedToolNames),
|
|
33
|
+
selectedToolNames,
|
|
34
|
+
workflowSuggestedToolNames: workflowSuggestedToolNames.length
|
|
35
|
+
? workflowSuggestedToolNames
|
|
36
|
+
: readStringArray(payload["workflowSuggestedTools"]),
|
|
37
|
+
workflowStatus: typeof authority?.["workflowStatus"] === "string"
|
|
38
|
+
? authority["workflowStatus"]
|
|
39
|
+
: readWorkflowStatus(payload),
|
|
40
|
+
},
|
|
41
|
+
effectiveToolNames: readStringArray(payload["effectiveToolNames"]).length
|
|
42
|
+
? readStringArray(payload["effectiveToolNames"])
|
|
43
|
+
: selectedToolNames,
|
|
44
|
+
effectiveReason: typeof payload["selectedReason"] === "string" ? payload["selectedReason"] : null,
|
|
45
|
+
comparisonPayload,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
export function buildAssistantWorkflowSerializedToolSelectionDecisionsFromTraceEvents(events) {
|
|
49
|
+
const decisions = [];
|
|
50
|
+
let candidateEventCount = 0;
|
|
51
|
+
let skippedCandidateEventCount = 0;
|
|
52
|
+
for (const event of events) {
|
|
53
|
+
if (event.stage !== ASSISTANT_WORKFLOW_TRACE_STAGE.toolSelectionWorkflowComparison)
|
|
54
|
+
continue;
|
|
55
|
+
candidateEventCount += 1;
|
|
56
|
+
const decision = buildAssistantWorkflowSerializedToolSelectionDecisionFromTraceEvent(event);
|
|
57
|
+
if (decision) {
|
|
58
|
+
decisions.push(decision);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
skippedCandidateEventCount += 1;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
traceEventCount: events.length,
|
|
66
|
+
candidateEventCount,
|
|
67
|
+
decisionCount: decisions.length,
|
|
68
|
+
skippedCandidateEventCount,
|
|
69
|
+
decisions,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
export function buildAssistantWorkflowCurrentSerializedToolSelectionDecisionsFromTraceEvents(events, options) {
|
|
73
|
+
const decisions = [];
|
|
74
|
+
let candidateEventCount = 0;
|
|
75
|
+
let skippedCandidateEventCount = 0;
|
|
76
|
+
let latestClassifierPayload = null;
|
|
77
|
+
for (const event of events) {
|
|
78
|
+
if (event.stage === ASSISTANT_WORKFLOW_TRACE_STAGE.plannerClassifierDone) {
|
|
79
|
+
latestClassifierPayload = readRecord(event.payload);
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (event.stage !== ASSISTANT_WORKFLOW_TRACE_STAGE.toolSelectionWorkflowComparison)
|
|
83
|
+
continue;
|
|
84
|
+
candidateEventCount += 1;
|
|
85
|
+
const decision = buildAssistantWorkflowCurrentSerializedToolSelectionDecisionFromTraceEvent(event, latestClassifierPayload, options);
|
|
86
|
+
if (decision) {
|
|
87
|
+
decisions.push(decision);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
skippedCandidateEventCount += 1;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
traceEventCount: events.length,
|
|
95
|
+
candidateEventCount,
|
|
96
|
+
decisionCount: decisions.length,
|
|
97
|
+
skippedCandidateEventCount,
|
|
98
|
+
decisions,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
export function buildAssistantWorkflowCurrentSerializedToolSelectionDecisionFromTraceEvent(event, classifierPayload, options) {
|
|
102
|
+
const payload = readRecord(event.payload);
|
|
103
|
+
if (!payload)
|
|
104
|
+
return null;
|
|
105
|
+
const historicalDecision = buildAssistantWorkflowSerializedToolSelectionDecisionFromTraceEvent(event);
|
|
106
|
+
if (!historicalDecision)
|
|
107
|
+
return null;
|
|
108
|
+
const selectedToolNames = historicalDecision.authority.selectedToolNames;
|
|
109
|
+
const availableToolNames = buildCurrentReplayAvailableToolNames(options, selectedToolNames, historicalDecision.authority.workflowSuggestedToolNames, payload, classifierPayload);
|
|
110
|
+
const currentDecision = buildAssistantWorkflowToolSelectionDecision({
|
|
111
|
+
workflow: options.workflow,
|
|
112
|
+
classification: {
|
|
113
|
+
intent: readString(classifierPayload?.["intent"]) ?? readString(payload["intent"]),
|
|
114
|
+
presentation: readString(classifierPayload?.["presentation"]) ??
|
|
115
|
+
readString(payload["effectivePresentation"]) ??
|
|
116
|
+
readString(payload["defaultPresentation"]),
|
|
117
|
+
toolsToExpose: firstNonEmptyStringArray(classifierPayload?.["tools"], classifierPayload?.["toolsToExpose"], payload["classifierTools"]),
|
|
118
|
+
...(typeof classifierPayload?.["confidence"] === "number"
|
|
119
|
+
? { confidence: classifierPayload["confidence"] }
|
|
120
|
+
: {}),
|
|
121
|
+
...(readString(classifierPayload?.["timeWindowHint"])
|
|
122
|
+
? { timeWindowHint: readString(classifierPayload?.["timeWindowHint"]) }
|
|
123
|
+
: {}),
|
|
124
|
+
entities: {
|
|
125
|
+
containers: firstNonEmptyStringArray(classifierPayload?.["containers"], payload["containers"]),
|
|
126
|
+
attributes: firstNonEmptyStringArray(classifierPayload?.["attributes"], payload["attributes"]),
|
|
127
|
+
fullTopicPaths: firstNonEmptyStringArray(classifierPayload?.["fullTopicPaths"], payload["fullTopicPaths"]),
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
availableToolNames,
|
|
131
|
+
selectedToolNames,
|
|
132
|
+
selectedMode: readString(payload["selectedMode"]),
|
|
133
|
+
selectedReason: readString(payload["selectedReason"]),
|
|
134
|
+
hop: readNumber(payload["hop"]),
|
|
135
|
+
pruningEnabled: readBoolean(payload["pruningEnabled"]),
|
|
136
|
+
availableContext: options.availableContext ?? null,
|
|
137
|
+
workflowAuthorityIntentIds: options.workflowAuthorityIntentIds ?? null,
|
|
138
|
+
workflowAuthoritySegmentKeys: options.workflowAuthoritySegmentKeys ?? null,
|
|
139
|
+
});
|
|
140
|
+
return serializeAssistantWorkflowToolSelectionDecision(currentDecision);
|
|
141
|
+
}
|
|
142
|
+
export function buildAssistantWorkflowToolSelectionEvalCasesFromTraceEvents(events, options = {}) {
|
|
143
|
+
const exportResult = buildAssistantWorkflowSerializedToolSelectionDecisionsFromTraceEvents(events);
|
|
144
|
+
const prompt = normalizeOptionalString(options.prompt) ?? readPromptPreview(events);
|
|
145
|
+
const cases = prompt
|
|
146
|
+
? exportResult.decisions.map((decision, index) => buildAssistantWorkflowEvalCaseFromSerializedToolSelectionDecision(decision, {
|
|
147
|
+
prompt,
|
|
148
|
+
...(options.id !== undefined && exportResult.decisions.length === 1 ? { id: options.id } : {}),
|
|
149
|
+
...(options.required !== undefined ? { required: options.required } : {}),
|
|
150
|
+
...(options.tags !== undefined ? { tags: options.tags } : {}),
|
|
151
|
+
...(options.source !== undefined ? { source: options.source } : {}),
|
|
152
|
+
...(options.notes !== undefined ? { notes: options.notes } : {}),
|
|
153
|
+
metadata: {
|
|
154
|
+
...(options.metadata ?? {}),
|
|
155
|
+
traceDecisionIndex: index,
|
|
156
|
+
},
|
|
157
|
+
}))
|
|
158
|
+
: [];
|
|
159
|
+
return {
|
|
160
|
+
...exportResult,
|
|
161
|
+
prompt,
|
|
162
|
+
evalCaseCount: cases.length,
|
|
163
|
+
missingPromptCount: prompt ? 0 : exportResult.decisionCount,
|
|
164
|
+
cases,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
export function buildAssistantWorkflowToolSelectionTraceExportPayload(result) {
|
|
168
|
+
return {
|
|
169
|
+
traceEventCount: result.traceEventCount,
|
|
170
|
+
candidateEventCount: result.candidateEventCount,
|
|
171
|
+
decisionCount: result.decisionCount,
|
|
172
|
+
skippedCandidateEventCount: result.skippedCandidateEventCount,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
export function buildAssistantWorkflowToolSelectionTraceEvalCaseExportPayload(result) {
|
|
176
|
+
return {
|
|
177
|
+
...buildAssistantWorkflowToolSelectionTraceExportPayload(result),
|
|
178
|
+
prompt: result.prompt,
|
|
179
|
+
evalCaseCount: result.evalCaseCount,
|
|
180
|
+
missingPromptCount: result.missingPromptCount,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
function firstNonEmptyStringArray(...values) {
|
|
184
|
+
for (const value of values) {
|
|
185
|
+
const strings = readStringArray(value);
|
|
186
|
+
if (strings.length > 0)
|
|
187
|
+
return strings;
|
|
188
|
+
}
|
|
189
|
+
return [];
|
|
190
|
+
}
|
|
191
|
+
function buildCurrentReplayAvailableToolNames(options, selectedToolNames, workflowSuggestedToolNames, payload, classifierPayload) {
|
|
192
|
+
if (options.availableToolNames !== undefined && options.availableToolNames !== null) {
|
|
193
|
+
return uniqueStrings(readStringArray(options.availableToolNames));
|
|
194
|
+
}
|
|
195
|
+
return uniqueStrings([
|
|
196
|
+
...selectedToolNames,
|
|
197
|
+
...workflowSuggestedToolNames,
|
|
198
|
+
...(options.includeWorkflowToolCapabilities === false
|
|
199
|
+
? []
|
|
200
|
+
: (options.workflow.tools ?? []).map((tool) => tool.name)),
|
|
201
|
+
...readStringArray(payload["workflowSuggestedTools"]),
|
|
202
|
+
...readStringArray(payload["toolHints"]),
|
|
203
|
+
...readStringArray(payload["requiredToolHints"]),
|
|
204
|
+
...readStringArray(payload["classifierTools"]),
|
|
205
|
+
...readStringArray(classifierPayload?.["tools"]),
|
|
206
|
+
...readStringArray(classifierPayload?.["toolsToExpose"]),
|
|
207
|
+
]);
|
|
208
|
+
}
|
|
209
|
+
function readPromptPreview(events) {
|
|
210
|
+
for (const event of events) {
|
|
211
|
+
const payload = readRecord(event.payload);
|
|
212
|
+
if (!payload)
|
|
213
|
+
continue;
|
|
214
|
+
const candidate = readAssistantWorkflowTraceUserMessagePreview(event.stage, payload);
|
|
215
|
+
if (candidate)
|
|
216
|
+
return candidate;
|
|
217
|
+
}
|
|
218
|
+
return null;
|
|
219
|
+
}
|
|
220
|
+
function inferSelectedToolNames(payload) {
|
|
221
|
+
const explicit = readStringArray(payload["effectiveToolNames"]);
|
|
222
|
+
if (explicit.length)
|
|
223
|
+
return explicit;
|
|
224
|
+
const selected = readStringArray(payload["selectedToolNames"]);
|
|
225
|
+
if (selected.length)
|
|
226
|
+
return selected;
|
|
227
|
+
const candidateTools = readStringArray(payload["workflowSelectionCandidateTools"]);
|
|
228
|
+
const workflowSuggestedTools = readStringArray(payload["workflowSuggestedTools"]);
|
|
229
|
+
const comparableTools = candidateTools.length ? candidateTools : workflowSuggestedTools;
|
|
230
|
+
const missingTools = candidateTools.length
|
|
231
|
+
? readStringArray(payload["missingWorkflowSelectionCandidateTools"])
|
|
232
|
+
: readStringArray(payload["missingWorkflowSuggestedTools"]);
|
|
233
|
+
const outsideTools = candidateTools.length
|
|
234
|
+
? readStringArray(payload["selectedOutsideWorkflowSelectionCandidate"])
|
|
235
|
+
: readStringArray(payload["selectedOutsideWorkflowSuggestions"]);
|
|
236
|
+
const missingSet = new Set(missingTools);
|
|
237
|
+
return uniqueStrings([
|
|
238
|
+
...comparableTools.filter((toolName) => !missingSet.has(toolName)),
|
|
239
|
+
...outsideTools,
|
|
240
|
+
]);
|
|
241
|
+
}
|
|
242
|
+
function inferWorkflowAuthoritySelectedToolNames(payload) {
|
|
243
|
+
const explicit = readStringArray(payload["effectiveToolNames"]);
|
|
244
|
+
if (explicit.length)
|
|
245
|
+
return explicit;
|
|
246
|
+
const selected = readStringArray(payload["selectedToolNames"]);
|
|
247
|
+
if (selected.length)
|
|
248
|
+
return selected;
|
|
249
|
+
const candidateTools = readStringArray(payload["workflowSelectionCandidateTools"]);
|
|
250
|
+
if (candidateTools.length)
|
|
251
|
+
return candidateTools;
|
|
252
|
+
return readStringArray(payload["workflowSuggestedTools"]);
|
|
253
|
+
}
|
|
254
|
+
function inferWorkflowAuthorityReason(payload) {
|
|
255
|
+
const selectedReason = readString(payload["selectedReason"]);
|
|
256
|
+
return selectedReason === "workflow_equivalent" || selectedReason === "workflow_authority_enabled"
|
|
257
|
+
? selectedReason
|
|
258
|
+
: null;
|
|
259
|
+
}
|
|
260
|
+
function inferLegacyAuthorityReason(payload, selectedToolNames) {
|
|
261
|
+
const workflowStatus = readWorkflowStatus(payload);
|
|
262
|
+
if (workflowStatus === "blocked" || workflowStatus === "needs-clarification") {
|
|
263
|
+
return "workflow_blocked";
|
|
264
|
+
}
|
|
265
|
+
const hasWorkflowTools = readStringArray(payload["workflowSelectionCandidateTools"]).length > 0 ||
|
|
266
|
+
readStringArray(payload["workflowSuggestedTools"]).length > 0;
|
|
267
|
+
const hasDiffSignals = readStringArray(payload["missingWorkflowSelectionCandidateTools"]).length > 0 ||
|
|
268
|
+
readStringArray(payload["missingWorkflowSuggestedTools"]).length > 0 ||
|
|
269
|
+
readStringArray(payload["selectedOutsideWorkflowSelectionCandidate"]).length > 0 ||
|
|
270
|
+
readStringArray(payload["selectedOutsideWorkflowSuggestions"]).length > 0;
|
|
271
|
+
return hasWorkflowTools || selectedToolNames.length > 0 || hasDiffSignals
|
|
272
|
+
? "workflow_differs"
|
|
273
|
+
: "workflow_unavailable";
|
|
274
|
+
}
|
|
275
|
+
function readWorkflowStatus(payload) {
|
|
276
|
+
const workflowRun = readRecord(payload["workflowRun"]);
|
|
277
|
+
if (typeof workflowRun?.["status"] === "string")
|
|
278
|
+
return workflowRun["status"];
|
|
279
|
+
const executionPlan = readRecord(payload["executionPlan"]);
|
|
280
|
+
if (typeof executionPlan?.["status"] === "string")
|
|
281
|
+
return executionPlan["status"];
|
|
282
|
+
return null;
|
|
283
|
+
}
|
|
284
|
+
function uniqueStrings(values) {
|
|
285
|
+
const out = [];
|
|
286
|
+
const seen = new Set();
|
|
287
|
+
for (const value of values) {
|
|
288
|
+
const trimmed = value.trim();
|
|
289
|
+
if (!trimmed.length || seen.has(trimmed))
|
|
290
|
+
continue;
|
|
291
|
+
seen.add(trimmed);
|
|
292
|
+
out.push(trimmed);
|
|
293
|
+
}
|
|
294
|
+
return out;
|
|
295
|
+
}
|
|
296
|
+
function normalizeOptionalString(value) {
|
|
297
|
+
if (typeof value !== "string")
|
|
298
|
+
return null;
|
|
299
|
+
const trimmed = value.trim();
|
|
300
|
+
return trimmed.length ? trimmed : null;
|
|
301
|
+
}
|
|
302
|
+
function toJsonRecordOrNull(value) {
|
|
303
|
+
if (!isJsonRecord(value))
|
|
304
|
+
return null;
|
|
305
|
+
return value;
|
|
306
|
+
}
|
|
307
|
+
function isJsonRecord(value) {
|
|
308
|
+
const record = readRecord(value);
|
|
309
|
+
if (!record)
|
|
310
|
+
return false;
|
|
311
|
+
return Object.values(record).every(isJsonValue);
|
|
312
|
+
}
|
|
313
|
+
function isJsonValue(value) {
|
|
314
|
+
if (value === null)
|
|
315
|
+
return true;
|
|
316
|
+
if (typeof value === "string" || typeof value === "boolean")
|
|
317
|
+
return true;
|
|
318
|
+
if (typeof value === "number")
|
|
319
|
+
return Number.isFinite(value);
|
|
320
|
+
if (Array.isArray(value))
|
|
321
|
+
return value.every(isJsonValue);
|
|
322
|
+
return isJsonRecord(value);
|
|
323
|
+
}
|
|
324
|
+
//# sourceMappingURL=tool-selection-trace-export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-selection-trace-export.js","sourceRoot":"","sources":["../src/tool-selection-trace-export.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantWorkflowJsonValue } from \"./run-report-json.js\";\nimport {\n readAssistantWorkflowTraceBoolean as readBoolean,\n readAssistantWorkflowTraceNumber as readNumber,\n readAssistantWorkflowTracePayloadRecord as readRecord,\n readAssistantWorkflowTraceString as readString,\n readAssistantWorkflowTraceStringArray as readStringArray,\n readAssistantWorkflowTraceUserMessagePreview,\n type AssistantWorkflowTraceEvent,\n} from \"./trace-events.js\";\nimport { ASSISTANT_WORKFLOW_TRACE_STAGE } from \"./trace-stages.js\";\nimport type {\n AssistantWorkflowDefinition,\n AssistantWorkflowToolContextRequirement,\n} from \"./definition.js\";\nimport {\n buildAssistantWorkflowToolSelectionDecision,\n} from \"./tool-selection-policy.js\";\nimport {\n buildAssistantWorkflowEvalCaseFromSerializedToolSelectionDecision,\n type AssistantWorkflowEvalCase,\n type AssistantWorkflowToolSelectionEvalCaseOptions,\n} from \"./eval-case.js\";\nimport {\n parseAssistantWorkflowSerializedToolSelectionDecision,\n serializeAssistantWorkflowToolSelectionDecision,\n type AssistantWorkflowSerializedToolSelectionDecision,\n} from \"./tool-selection-json.js\";\n\nexport type AssistantWorkflowToolSelectionTraceExportResult = {\n traceEventCount: number;\n candidateEventCount: number;\n decisionCount: number;\n skippedCandidateEventCount: number;\n decisions: AssistantWorkflowSerializedToolSelectionDecision[];\n};\n\nexport type AssistantWorkflowToolSelectionTraceEvalCaseOptions =\n Omit<AssistantWorkflowToolSelectionEvalCaseOptions, \"prompt\"> & {\n prompt?: string | null;\n };\n\nexport type AssistantWorkflowToolSelectionTraceEvalCaseExportResult =\n AssistantWorkflowToolSelectionTraceExportResult & {\n prompt: string | null;\n evalCaseCount: number;\n missingPromptCount: number;\n cases: AssistantWorkflowEvalCase[];\n };\n\nexport type AssistantWorkflowToolSelectionTraceCurrentReplayOptions = {\n workflow: AssistantWorkflowDefinition<string, string, string, string>;\n availableToolNames?: readonly string[] | null;\n availableContext?: readonly AssistantWorkflowToolContextRequirement[] | null;\n workflowAuthorityIntentIds?: readonly string[] | null;\n workflowAuthoritySegmentKeys?: readonly string[] | null;\n includeWorkflowToolCapabilities?: boolean;\n};\n\nexport function buildAssistantWorkflowSerializedToolSelectionDecisionFromTraceEvent(\n event: AssistantWorkflowTraceEvent,\n): AssistantWorkflowSerializedToolSelectionDecision | null {\n if (event.stage !== ASSISTANT_WORKFLOW_TRACE_STAGE.toolSelectionWorkflowComparison) return null;\n const payload = readRecord(event.payload);\n if (!payload) return null;\n const authority = readRecord(payload[\"authority\"]);\n const inferredWorkflowAuthorityReason = authority\n ? null\n : inferWorkflowAuthorityReason(payload);\n const selectedToolNames = authority\n ? readStringArray(authority[\"selectedToolNames\"])\n : inferredWorkflowAuthorityReason\n ? inferWorkflowAuthoritySelectedToolNames(payload)\n : inferSelectedToolNames(payload);\n const workflowSuggestedToolNames = authority\n ? readStringArray(authority[\"workflowSuggestedToolNames\"])\n : readStringArray(payload[\"workflowSuggestedTools\"]);\n const comparisonPayload = toJsonRecordOrNull(payload);\n if (!comparisonPayload) return null;\n\n return parseAssistantWorkflowSerializedToolSelectionDecision({\n schemaVersion: 1,\n authority: {\n source: authority?.[\"source\"] ?? (inferredWorkflowAuthorityReason ? \"workflow\" : \"legacy-pruner\"),\n reason: authority?.[\"reason\"] ?? inferredWorkflowAuthorityReason ??\n inferLegacyAuthorityReason(payload, selectedToolNames),\n selectedToolNames,\n workflowSuggestedToolNames: workflowSuggestedToolNames.length\n ? workflowSuggestedToolNames\n : readStringArray(payload[\"workflowSuggestedTools\"]),\n workflowStatus: typeof authority?.[\"workflowStatus\"] === \"string\"\n ? authority[\"workflowStatus\"]\n : readWorkflowStatus(payload),\n },\n effectiveToolNames: readStringArray(payload[\"effectiveToolNames\"]).length\n ? readStringArray(payload[\"effectiveToolNames\"])\n : selectedToolNames,\n effectiveReason: typeof payload[\"selectedReason\"] === \"string\" ? payload[\"selectedReason\"] : null,\n comparisonPayload,\n });\n}\n\nexport function buildAssistantWorkflowSerializedToolSelectionDecisionsFromTraceEvents(\n events: readonly AssistantWorkflowTraceEvent[],\n): AssistantWorkflowToolSelectionTraceExportResult {\n const decisions: AssistantWorkflowSerializedToolSelectionDecision[] = [];\n let candidateEventCount = 0;\n let skippedCandidateEventCount = 0;\n\n for (const event of events) {\n if (event.stage !== ASSISTANT_WORKFLOW_TRACE_STAGE.toolSelectionWorkflowComparison) continue;\n candidateEventCount += 1;\n const decision = buildAssistantWorkflowSerializedToolSelectionDecisionFromTraceEvent(event);\n if (decision) {\n decisions.push(decision);\n } else {\n skippedCandidateEventCount += 1;\n }\n }\n\n return {\n traceEventCount: events.length,\n candidateEventCount,\n decisionCount: decisions.length,\n skippedCandidateEventCount,\n decisions,\n };\n}\n\nexport function buildAssistantWorkflowCurrentSerializedToolSelectionDecisionsFromTraceEvents(\n events: readonly AssistantWorkflowTraceEvent[],\n options: AssistantWorkflowToolSelectionTraceCurrentReplayOptions,\n): AssistantWorkflowToolSelectionTraceExportResult {\n const decisions: AssistantWorkflowSerializedToolSelectionDecision[] = [];\n let candidateEventCount = 0;\n let skippedCandidateEventCount = 0;\n let latestClassifierPayload: Record<string, unknown> | null = null;\n\n for (const event of events) {\n if (event.stage === ASSISTANT_WORKFLOW_TRACE_STAGE.plannerClassifierDone) {\n latestClassifierPayload = readRecord(event.payload);\n continue;\n }\n if (event.stage !== ASSISTANT_WORKFLOW_TRACE_STAGE.toolSelectionWorkflowComparison) continue;\n\n candidateEventCount += 1;\n const decision = buildAssistantWorkflowCurrentSerializedToolSelectionDecisionFromTraceEvent(\n event,\n latestClassifierPayload,\n options,\n );\n if (decision) {\n decisions.push(decision);\n } else {\n skippedCandidateEventCount += 1;\n }\n }\n\n return {\n traceEventCount: events.length,\n candidateEventCount,\n decisionCount: decisions.length,\n skippedCandidateEventCount,\n decisions,\n };\n}\n\nexport function buildAssistantWorkflowCurrentSerializedToolSelectionDecisionFromTraceEvent(\n event: AssistantWorkflowTraceEvent,\n classifierPayload: Record<string, unknown> | null,\n options: AssistantWorkflowToolSelectionTraceCurrentReplayOptions,\n): AssistantWorkflowSerializedToolSelectionDecision | null {\n const payload = readRecord(event.payload);\n if (!payload) return null;\n const historicalDecision = buildAssistantWorkflowSerializedToolSelectionDecisionFromTraceEvent(event);\n if (!historicalDecision) return null;\n const selectedToolNames = historicalDecision.authority.selectedToolNames;\n const availableToolNames = buildCurrentReplayAvailableToolNames(\n options,\n selectedToolNames,\n historicalDecision.authority.workflowSuggestedToolNames,\n payload,\n classifierPayload,\n );\n const currentDecision = buildAssistantWorkflowToolSelectionDecision({\n workflow: options.workflow,\n classification: {\n intent: readString(classifierPayload?.[\"intent\"]) ?? readString(payload[\"intent\"]),\n presentation:\n readString(classifierPayload?.[\"presentation\"]) ??\n readString(payload[\"effectivePresentation\"]) ??\n readString(payload[\"defaultPresentation\"]),\n toolsToExpose: firstNonEmptyStringArray(\n classifierPayload?.[\"tools\"],\n classifierPayload?.[\"toolsToExpose\"],\n payload[\"classifierTools\"],\n ),\n ...(typeof classifierPayload?.[\"confidence\"] === \"number\"\n ? { confidence: classifierPayload[\"confidence\"] }\n : {}),\n ...(readString(classifierPayload?.[\"timeWindowHint\"])\n ? { timeWindowHint: readString(classifierPayload?.[\"timeWindowHint\"]) }\n : {}),\n entities: {\n containers: firstNonEmptyStringArray(classifierPayload?.[\"containers\"], payload[\"containers\"]),\n attributes: firstNonEmptyStringArray(classifierPayload?.[\"attributes\"], payload[\"attributes\"]),\n fullTopicPaths: firstNonEmptyStringArray(classifierPayload?.[\"fullTopicPaths\"], payload[\"fullTopicPaths\"]),\n },\n },\n availableToolNames,\n selectedToolNames,\n selectedMode: readString(payload[\"selectedMode\"]),\n selectedReason: readString(payload[\"selectedReason\"]),\n hop: readNumber(payload[\"hop\"]),\n pruningEnabled: readBoolean(payload[\"pruningEnabled\"]),\n availableContext: options.availableContext ?? null,\n workflowAuthorityIntentIds: options.workflowAuthorityIntentIds ?? null,\n workflowAuthoritySegmentKeys: options.workflowAuthoritySegmentKeys ?? null,\n });\n\n return serializeAssistantWorkflowToolSelectionDecision(currentDecision);\n}\n\nexport function buildAssistantWorkflowToolSelectionEvalCasesFromTraceEvents(\n events: readonly AssistantWorkflowTraceEvent[],\n options: AssistantWorkflowToolSelectionTraceEvalCaseOptions = {},\n): AssistantWorkflowToolSelectionTraceEvalCaseExportResult {\n const exportResult = buildAssistantWorkflowSerializedToolSelectionDecisionsFromTraceEvents(events);\n const prompt = normalizeOptionalString(options.prompt) ?? readPromptPreview(events);\n const cases = prompt\n ? exportResult.decisions.map((decision, index) =>\n buildAssistantWorkflowEvalCaseFromSerializedToolSelectionDecision(decision, {\n prompt,\n ...(options.id !== undefined && exportResult.decisions.length === 1 ? { id: options.id } : {}),\n ...(options.required !== undefined ? { required: options.required } : {}),\n ...(options.tags !== undefined ? { tags: options.tags } : {}),\n ...(options.source !== undefined ? { source: options.source } : {}),\n ...(options.notes !== undefined ? { notes: options.notes } : {}),\n metadata: {\n ...(options.metadata ?? {}),\n traceDecisionIndex: index,\n },\n })\n )\n : [];\n\n return {\n ...exportResult,\n prompt,\n evalCaseCount: cases.length,\n missingPromptCount: prompt ? 0 : exportResult.decisionCount,\n cases,\n };\n}\n\nexport function buildAssistantWorkflowToolSelectionTraceExportPayload(\n result: AssistantWorkflowToolSelectionTraceExportResult,\n): Record<string, AssistantWorkflowJsonValue> {\n return {\n traceEventCount: result.traceEventCount,\n candidateEventCount: result.candidateEventCount,\n decisionCount: result.decisionCount,\n skippedCandidateEventCount: result.skippedCandidateEventCount,\n };\n}\n\nexport function buildAssistantWorkflowToolSelectionTraceEvalCaseExportPayload(\n result: AssistantWorkflowToolSelectionTraceEvalCaseExportResult,\n): Record<string, AssistantWorkflowJsonValue> {\n return {\n ...buildAssistantWorkflowToolSelectionTraceExportPayload(result),\n prompt: result.prompt,\n evalCaseCount: result.evalCaseCount,\n missingPromptCount: result.missingPromptCount,\n };\n}\n\nfunction firstNonEmptyStringArray(...values: unknown[]): string[] {\n for (const value of values) {\n const strings = readStringArray(value);\n if (strings.length > 0) return strings;\n }\n return [];\n}\n\nfunction buildCurrentReplayAvailableToolNames(\n options: AssistantWorkflowToolSelectionTraceCurrentReplayOptions,\n selectedToolNames: readonly string[],\n workflowSuggestedToolNames: readonly string[],\n payload: Record<string, unknown>,\n classifierPayload: Record<string, unknown> | null,\n): string[] {\n if (options.availableToolNames !== undefined && options.availableToolNames !== null) {\n return uniqueStrings(readStringArray(options.availableToolNames));\n }\n return uniqueStrings([\n ...selectedToolNames,\n ...workflowSuggestedToolNames,\n ...(options.includeWorkflowToolCapabilities === false\n ? []\n : (options.workflow.tools ?? []).map((tool) => tool.name)),\n ...readStringArray(payload[\"workflowSuggestedTools\"]),\n ...readStringArray(payload[\"toolHints\"]),\n ...readStringArray(payload[\"requiredToolHints\"]),\n ...readStringArray(payload[\"classifierTools\"]),\n ...readStringArray(classifierPayload?.[\"tools\"]),\n ...readStringArray(classifierPayload?.[\"toolsToExpose\"]),\n ]);\n}\n\nfunction readPromptPreview(events: readonly AssistantWorkflowTraceEvent[]): string | null {\n for (const event of events) {\n const payload = readRecord(event.payload);\n if (!payload) continue;\n const candidate = readAssistantWorkflowTraceUserMessagePreview(event.stage, payload);\n if (candidate) return candidate;\n }\n return null;\n}\n\nfunction inferSelectedToolNames(payload: Record<string, unknown>): string[] {\n const explicit = readStringArray(payload[\"effectiveToolNames\"]);\n if (explicit.length) return explicit;\n const selected = readStringArray(payload[\"selectedToolNames\"]);\n if (selected.length) return selected;\n\n const candidateTools = readStringArray(payload[\"workflowSelectionCandidateTools\"]);\n const workflowSuggestedTools = readStringArray(payload[\"workflowSuggestedTools\"]);\n const comparableTools = candidateTools.length ? candidateTools : workflowSuggestedTools;\n const missingTools = candidateTools.length\n ? readStringArray(payload[\"missingWorkflowSelectionCandidateTools\"])\n : readStringArray(payload[\"missingWorkflowSuggestedTools\"]);\n const outsideTools = candidateTools.length\n ? readStringArray(payload[\"selectedOutsideWorkflowSelectionCandidate\"])\n : readStringArray(payload[\"selectedOutsideWorkflowSuggestions\"]);\n const missingSet = new Set(missingTools);\n return uniqueStrings([\n ...comparableTools.filter((toolName) => !missingSet.has(toolName)),\n ...outsideTools,\n ]);\n}\n\nfunction inferWorkflowAuthoritySelectedToolNames(payload: Record<string, unknown>): string[] {\n const explicit = readStringArray(payload[\"effectiveToolNames\"]);\n if (explicit.length) return explicit;\n const selected = readStringArray(payload[\"selectedToolNames\"]);\n if (selected.length) return selected;\n const candidateTools = readStringArray(payload[\"workflowSelectionCandidateTools\"]);\n if (candidateTools.length) return candidateTools;\n return readStringArray(payload[\"workflowSuggestedTools\"]);\n}\n\nfunction inferWorkflowAuthorityReason(payload: Record<string, unknown>): string | null {\n const selectedReason = readString(payload[\"selectedReason\"]);\n return selectedReason === \"workflow_equivalent\" || selectedReason === \"workflow_authority_enabled\"\n ? selectedReason\n : null;\n}\n\nfunction inferLegacyAuthorityReason(\n payload: Record<string, unknown>,\n selectedToolNames: readonly string[],\n): string {\n const workflowStatus = readWorkflowStatus(payload);\n if (workflowStatus === \"blocked\" || workflowStatus === \"needs-clarification\") {\n return \"workflow_blocked\";\n }\n const hasWorkflowTools = readStringArray(payload[\"workflowSelectionCandidateTools\"]).length > 0 ||\n readStringArray(payload[\"workflowSuggestedTools\"]).length > 0;\n const hasDiffSignals = readStringArray(payload[\"missingWorkflowSelectionCandidateTools\"]).length > 0 ||\n readStringArray(payload[\"missingWorkflowSuggestedTools\"]).length > 0 ||\n readStringArray(payload[\"selectedOutsideWorkflowSelectionCandidate\"]).length > 0 ||\n readStringArray(payload[\"selectedOutsideWorkflowSuggestions\"]).length > 0;\n return hasWorkflowTools || selectedToolNames.length > 0 || hasDiffSignals\n ? \"workflow_differs\"\n : \"workflow_unavailable\";\n}\n\nfunction readWorkflowStatus(payload: Record<string, unknown>): string | null {\n const workflowRun = readRecord(payload[\"workflowRun\"]);\n if (typeof workflowRun?.[\"status\"] === \"string\") return workflowRun[\"status\"];\n const executionPlan = readRecord(payload[\"executionPlan\"]);\n if (typeof executionPlan?.[\"status\"] === \"string\") return executionPlan[\"status\"];\n return null;\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 trimmed = value.trim();\n if (!trimmed.length || seen.has(trimmed)) continue;\n seen.add(trimmed);\n out.push(trimmed);\n }\n return out;\n}\n\nfunction normalizeOptionalString(value: string | null | undefined): string | null {\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n return trimmed.length ? trimmed : null;\n}\n\nfunction toJsonRecordOrNull(value: unknown): Record<string, AssistantWorkflowJsonValue> | null {\n if (!isJsonRecord(value)) return null;\n return value;\n}\n\nfunction isJsonRecord(value: unknown): value is Record<string, AssistantWorkflowJsonValue> {\n const record = readRecord(value);\n if (!record) return false;\n return Object.values(record).every(isJsonValue);\n}\n\nfunction isJsonValue(value: unknown): value is AssistantWorkflowJsonValue {\n if (value === null) return true;\n if (typeof value === \"string\" || typeof value === \"boolean\") return true;\n if (typeof value === \"number\") return Number.isFinite(value);\n if (Array.isArray(value)) return value.every(isJsonValue);\n return isJsonRecord(value);\n}\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export { readAssistantWorkflowBoolean as readAssistantWorkflowTraceBoolean, readAssistantWorkflowBooleanRecord as readAssistantWorkflowTraceBooleanRecord, readAssistantWorkflowNumber as readAssistantWorkflowTraceNumber, readAssistantWorkflowRecord as readAssistantWorkflowTracePayloadRecord, readAssistantWorkflowString as readAssistantWorkflowTraceString, readAssistantWorkflowStringArray as readAssistantWorkflowTraceStringArray, } from "./value-readers.js";
|
|
2
|
+
export type AssistantWorkflowTraceEvent = {
|
|
3
|
+
stage: string;
|
|
4
|
+
timestamp?: string | null;
|
|
5
|
+
payload?: Record<string, unknown> | null;
|
|
6
|
+
};
|
|
7
|
+
export type AssistantWorkflowTraceUserMessagePreviewOptions = {
|
|
8
|
+
limit?: number;
|
|
9
|
+
omission?: string;
|
|
10
|
+
};
|
|
11
|
+
export declare function parseAssistantWorkflowTraceEvents(raw: unknown): AssistantWorkflowTraceEvent[];
|
|
12
|
+
export declare function readAssistantWorkflowTraceUserMessagePreview(stage: string, payload: Record<string, unknown>, options?: AssistantWorkflowTraceUserMessagePreviewOptions): string | null;
|
|
13
|
+
export declare function isAssistantWorkflowErrorTraceStage(stage: string): boolean;
|
|
14
|
+
//# sourceMappingURL=trace-events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace-events.d.ts","sourceRoot":"","sources":["../src/trace-events.ts"],"names":[],"mappings":"AAUA,OAAO,EACL,4BAA4B,IAAI,iCAAiC,EACjE,kCAAkC,IAAI,uCAAuC,EAC7E,2BAA2B,IAAI,gCAAgC,EAC/D,2BAA2B,IAAI,uCAAuC,EACtE,2BAA2B,IAAI,gCAAgC,EAC/D,gCAAgC,IAAI,qCAAqC,GAC1E,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,2BAA2B,GAAG;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,+CAA+C,GAAG;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAUF,wBAAgB,iCAAiC,CAAC,GAAG,EAAE,OAAO,GAAG,2BAA2B,EAAE,CAe7F;AAaD,wBAAgB,4CAA4C,CAC1D,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,GAAE,+CAAoD,GAC5D,MAAM,GAAG,IAAI,CAUf;AAED,wBAAgB,kCAAkC,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAGzE"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { ASSISTANT_WORKFLOW_TRACE_STAGE } from "./trace-stages.js";
|
|
2
|
+
import { readAssistantWorkflowRecord, readAssistantWorkflowString, } from "./value-readers.js";
|
|
3
|
+
export { readAssistantWorkflowBoolean as readAssistantWorkflowTraceBoolean, readAssistantWorkflowBooleanRecord as readAssistantWorkflowTraceBooleanRecord, readAssistantWorkflowNumber as readAssistantWorkflowTraceNumber, readAssistantWorkflowRecord as readAssistantWorkflowTracePayloadRecord, readAssistantWorkflowString as readAssistantWorkflowTraceString, readAssistantWorkflowStringArray as readAssistantWorkflowTraceStringArray, } from "./value-readers.js";
|
|
4
|
+
const ERROR_STAGE_EXACT = new Set([
|
|
5
|
+
ASSISTANT_WORKFLOW_TRACE_STAGE.responseGuardrailHit,
|
|
6
|
+
ASSISTANT_WORKFLOW_TRACE_STAGE.toolGuardrailHit,
|
|
7
|
+
ASSISTANT_WORKFLOW_TRACE_STAGE.toolCallError,
|
|
8
|
+
]);
|
|
9
|
+
const ERROR_STAGE_SUFFIXES = [".error", ".timeout.fallback", ".invalid"];
|
|
10
|
+
export function parseAssistantWorkflowTraceEvents(raw) {
|
|
11
|
+
if (!Array.isArray(raw))
|
|
12
|
+
return [];
|
|
13
|
+
const out = [];
|
|
14
|
+
for (const entry of raw) {
|
|
15
|
+
const record = readAssistantWorkflowRecord(entry);
|
|
16
|
+
if (!record)
|
|
17
|
+
continue;
|
|
18
|
+
const stage = readAssistantWorkflowString(record["stage"]);
|
|
19
|
+
if (!stage)
|
|
20
|
+
continue;
|
|
21
|
+
out.push({
|
|
22
|
+
stage,
|
|
23
|
+
timestamp: readAssistantWorkflowString(record["timestamp"]),
|
|
24
|
+
payload: readTraceEventPayload(record["payload"]),
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
return out;
|
|
28
|
+
}
|
|
29
|
+
function readTraceEventPayload(value) {
|
|
30
|
+
const record = readAssistantWorkflowRecord(value);
|
|
31
|
+
if (record)
|
|
32
|
+
return record;
|
|
33
|
+
if (typeof value !== "string" || !value.trim().length)
|
|
34
|
+
return null;
|
|
35
|
+
try {
|
|
36
|
+
return readAssistantWorkflowRecord(JSON.parse(value));
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export function readAssistantWorkflowTraceUserMessagePreview(stage, payload, options = {}) {
|
|
43
|
+
const candidate = stage === ASSISTANT_WORKFLOW_TRACE_STAGE.chatRequestStart || stage === ASSISTANT_WORKFLOW_TRACE_STAGE.userMessage
|
|
44
|
+
? readAssistantWorkflowString(payload["message"]) ?? readAssistantWorkflowString(payload["content"])
|
|
45
|
+
: stage === ASSISTANT_WORKFLOW_TRACE_STAGE.schemaAdvisoryRequest
|
|
46
|
+
? readAssistantWorkflowString(payload["message"]) ??
|
|
47
|
+
readAssistantWorkflowString(payload["prompt"]) ??
|
|
48
|
+
readAssistantWorkflowString(payload["key"])
|
|
49
|
+
: null;
|
|
50
|
+
return candidate ? truncateTracePreview(candidate, options.limit, options.omission) : null;
|
|
51
|
+
}
|
|
52
|
+
export function isAssistantWorkflowErrorTraceStage(stage) {
|
|
53
|
+
if (ERROR_STAGE_EXACT.has(stage))
|
|
54
|
+
return true;
|
|
55
|
+
return ERROR_STAGE_SUFFIXES.some((suffix) => stage.endsWith(suffix));
|
|
56
|
+
}
|
|
57
|
+
function truncateTracePreview(value, limit = 240, omission = "...") {
|
|
58
|
+
const trimmed = value.replace(/\s+/g, " ").trim();
|
|
59
|
+
if (trimmed.length <= limit)
|
|
60
|
+
return trimmed;
|
|
61
|
+
if (limit <= omission.length)
|
|
62
|
+
return omission.slice(0, Math.max(limit, 0));
|
|
63
|
+
return `${trimmed.slice(0, limit - omission.length)}${omission}`;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=trace-events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace-events.js","sourceRoot":"","sources":["../src/trace-events.ts"],"names":[],"mappings":"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","sourcesContent":["import { ASSISTANT_WORKFLOW_TRACE_STAGE } from \"./trace-stages.js\";\nimport {\n readAssistantWorkflowBoolean,\n readAssistantWorkflowBooleanRecord,\n readAssistantWorkflowNumber,\n readAssistantWorkflowRecord,\n readAssistantWorkflowString,\n readAssistantWorkflowStringArray,\n} from \"./value-readers.js\";\n\nexport {\n readAssistantWorkflowBoolean as readAssistantWorkflowTraceBoolean,\n readAssistantWorkflowBooleanRecord as readAssistantWorkflowTraceBooleanRecord,\n readAssistantWorkflowNumber as readAssistantWorkflowTraceNumber,\n readAssistantWorkflowRecord as readAssistantWorkflowTracePayloadRecord,\n readAssistantWorkflowString as readAssistantWorkflowTraceString,\n readAssistantWorkflowStringArray as readAssistantWorkflowTraceStringArray,\n} from \"./value-readers.js\";\n\nexport type AssistantWorkflowTraceEvent = {\n stage: string;\n timestamp?: string | null;\n payload?: Record<string, unknown> | null;\n};\n\nexport type AssistantWorkflowTraceUserMessagePreviewOptions = {\n limit?: number;\n omission?: string;\n};\n\nconst ERROR_STAGE_EXACT = new Set<string>([\n ASSISTANT_WORKFLOW_TRACE_STAGE.responseGuardrailHit,\n ASSISTANT_WORKFLOW_TRACE_STAGE.toolGuardrailHit,\n ASSISTANT_WORKFLOW_TRACE_STAGE.toolCallError,\n]);\n\nconst ERROR_STAGE_SUFFIXES = [\".error\", \".timeout.fallback\", \".invalid\"];\n\nexport function parseAssistantWorkflowTraceEvents(raw: unknown): AssistantWorkflowTraceEvent[] {\n if (!Array.isArray(raw)) return [];\n const out: AssistantWorkflowTraceEvent[] = [];\n for (const entry of raw) {\n const record = readAssistantWorkflowRecord(entry);\n if (!record) continue;\n const stage = readAssistantWorkflowString(record[\"stage\"]);\n if (!stage) continue;\n out.push({\n stage,\n timestamp: readAssistantWorkflowString(record[\"timestamp\"]),\n payload: readTraceEventPayload(record[\"payload\"]),\n });\n }\n return out;\n}\n\nfunction readTraceEventPayload(value: unknown): Record<string, unknown> | null {\n const record = readAssistantWorkflowRecord(value);\n if (record) return record;\n if (typeof value !== \"string\" || !value.trim().length) return null;\n try {\n return readAssistantWorkflowRecord(JSON.parse(value) as unknown);\n } catch {\n return null;\n }\n}\n\nexport function readAssistantWorkflowTraceUserMessagePreview(\n stage: string,\n payload: Record<string, unknown>,\n options: AssistantWorkflowTraceUserMessagePreviewOptions = {},\n): string | null {\n const candidate =\n stage === ASSISTANT_WORKFLOW_TRACE_STAGE.chatRequestStart || stage === ASSISTANT_WORKFLOW_TRACE_STAGE.userMessage\n ? readAssistantWorkflowString(payload[\"message\"]) ?? readAssistantWorkflowString(payload[\"content\"])\n : stage === ASSISTANT_WORKFLOW_TRACE_STAGE.schemaAdvisoryRequest\n ? readAssistantWorkflowString(payload[\"message\"]) ??\n readAssistantWorkflowString(payload[\"prompt\"]) ??\n readAssistantWorkflowString(payload[\"key\"])\n : null;\n return candidate ? truncateTracePreview(candidate, options.limit, options.omission) : null;\n}\n\nexport function isAssistantWorkflowErrorTraceStage(stage: string): boolean {\n if (ERROR_STAGE_EXACT.has(stage)) return true;\n return ERROR_STAGE_SUFFIXES.some((suffix) => stage.endsWith(suffix));\n}\n\nfunction truncateTracePreview(value: string, limit = 240, omission = \"...\"): string {\n const trimmed = value.replace(/\\s+/g, \" \").trim();\n if (trimmed.length <= limit) return trimmed;\n if (limit <= omission.length) return omission.slice(0, Math.max(limit, 0));\n return `${trimmed.slice(0, limit - omission.length)}${omission}`;\n}\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export type AssistantWorkflowTraceEntry = {
|
|
2
|
+
stage: string;
|
|
3
|
+
timestamp: string;
|
|
4
|
+
payload?: Record<string, unknown>;
|
|
5
|
+
};
|
|
6
|
+
export type AssistantWorkflowTraceEntryLike = {
|
|
7
|
+
stage: string;
|
|
8
|
+
payload?: unknown;
|
|
9
|
+
};
|
|
10
|
+
export type AssistantWorkflowTracePayloadSanitizerOptions = {
|
|
11
|
+
/** Additional payload keys to redact alongside encrypted reasoning fields. */
|
|
12
|
+
redactedKeys?: readonly string[];
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Projects arbitrary trace values onto a bounded JSON-serializable form. It
|
|
16
|
+
* truncates strings, limits collection breadth, collapses deeply nested data,
|
|
17
|
+
* and redacts encrypted reasoning fields before trace storage or transport.
|
|
18
|
+
*/
|
|
19
|
+
export declare function sanitizeAssistantWorkflowTraceValue(value: unknown, depth?: number, options?: AssistantWorkflowTracePayloadSanitizerOptions): unknown;
|
|
20
|
+
export declare function sanitizeAssistantWorkflowTracePayload(payload: Record<string, unknown>, options?: AssistantWorkflowTracePayloadSanitizerOptions): Record<string, unknown>;
|
|
21
|
+
export declare function buildAssistantWorkflowTraceEntry(stage: string, payload?: Record<string, unknown>, timestamp?: Date | string, options?: AssistantWorkflowTracePayloadSanitizerOptions): AssistantWorkflowTraceEntry;
|
|
22
|
+
export declare function summarizeAssistantWorkflowToolArgsForTrace(args: Record<string, unknown>): Record<string, unknown>;
|
|
23
|
+
export declare function findLatestAssistantWorkflowTracePayload(traceEvents: readonly AssistantWorkflowTraceEntryLike[] | null | undefined, stage: string): Record<string, unknown> | null;
|
|
24
|
+
//# sourceMappingURL=trace-payload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace-payload.d.ts","sourceRoot":"","sources":["../src/trace-payload.ts"],"names":[],"mappings":"AAeA,MAAM,MAAM,2BAA2B,GAAG;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,6CAA6C,GAAG;IAC1D,8EAA8E;IAC9E,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC,CAAC;AAqDF;;;;GAIG;AACH,wBAAgB,mCAAmC,CACjD,KAAK,EAAE,OAAO,EACd,KAAK,SAAI,EACT,OAAO,CAAC,EAAE,6CAA6C,GACtD,OAAO,CAET;AAED,wBAAgB,qCAAqC,CACnD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,CAAC,EAAE,6CAA6C,GACtD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CASzB;AAED,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,SAAS,GAAE,IAAI,GAAG,MAAmB,EACrC,OAAO,CAAC,EAAE,6CAA6C,GACtD,2BAA2B,CAO7B;AAED,wBAAgB,0CAA0C,CACxD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAmBzB;AAED,wBAAgB,uCAAuC,CACrD,WAAW,EAAE,SAAS,+BAA+B,EAAE,GAAG,IAAI,GAAG,SAAS,EAC1E,KAAK,EAAE,MAAM,GACZ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAQhC"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { readAssistantWorkflowRecord } from "./value-readers.js";
|
|
2
|
+
const DEFAULT_REDACTED_KEYS = new Set([
|
|
3
|
+
"encrypted_content",
|
|
4
|
+
"encryptedContent",
|
|
5
|
+
]);
|
|
6
|
+
const TRACE_STRING_LIMIT = 240;
|
|
7
|
+
const TOOL_ARGUMENT_STRING_LIMIT = 160;
|
|
8
|
+
const TRACE_COLLAPSE_DEPTH = 2;
|
|
9
|
+
const TRACE_NUMERIC_ARRAY_LIMIT = 64;
|
|
10
|
+
const TRACE_ARRAY_LIMIT = 8;
|
|
11
|
+
const TRACE_OBJECT_ENTRY_LIMIT = 12;
|
|
12
|
+
const TRACE_PAYLOAD_ENTRY_LIMIT = 24;
|
|
13
|
+
function truncateTraceString(value, maxChars) {
|
|
14
|
+
return value.length > maxChars ? `${value.slice(0, maxChars)}…` : value;
|
|
15
|
+
}
|
|
16
|
+
function buildSanitizerPolicy(options) {
|
|
17
|
+
if (!options?.redactedKeys?.length)
|
|
18
|
+
return { redactedKeys: DEFAULT_REDACTED_KEYS };
|
|
19
|
+
return {
|
|
20
|
+
redactedKeys: new Set([
|
|
21
|
+
...DEFAULT_REDACTED_KEYS,
|
|
22
|
+
...options.redactedKeys,
|
|
23
|
+
]),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function sanitizeTraceValue(value, depth, policy) {
|
|
27
|
+
if (value === null || typeof value === "boolean" || typeof value === "number")
|
|
28
|
+
return value;
|
|
29
|
+
if (typeof value === "string")
|
|
30
|
+
return truncateTraceString(value, TRACE_STRING_LIMIT);
|
|
31
|
+
if (depth >= TRACE_COLLAPSE_DEPTH) {
|
|
32
|
+
if (Array.isArray(value))
|
|
33
|
+
return `array(${value.length})`;
|
|
34
|
+
const record = readAssistantWorkflowRecord(value);
|
|
35
|
+
if (record)
|
|
36
|
+
return `object(${Object.keys(record).length})`;
|
|
37
|
+
return typeof value;
|
|
38
|
+
}
|
|
39
|
+
if (Array.isArray(value)) {
|
|
40
|
+
const allNumeric = value.every((entry) => typeof entry === "number" && Number.isFinite(entry));
|
|
41
|
+
const limit = allNumeric ? TRACE_NUMERIC_ARRAY_LIMIT : TRACE_ARRAY_LIMIT;
|
|
42
|
+
return value.slice(0, limit).map((entry) => sanitizeTraceValue(entry, depth + 1, policy));
|
|
43
|
+
}
|
|
44
|
+
const record = readAssistantWorkflowRecord(value);
|
|
45
|
+
if (record) {
|
|
46
|
+
const nested = {};
|
|
47
|
+
for (const [key, nestedValue] of Object.entries(record).slice(0, TRACE_OBJECT_ENTRY_LIMIT)) {
|
|
48
|
+
nested[key] = policy.redactedKeys.has(key)
|
|
49
|
+
? "[redacted]"
|
|
50
|
+
: sanitizeTraceValue(nestedValue, depth + 1, policy);
|
|
51
|
+
}
|
|
52
|
+
return nested;
|
|
53
|
+
}
|
|
54
|
+
return typeof value;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Projects arbitrary trace values onto a bounded JSON-serializable form. It
|
|
58
|
+
* truncates strings, limits collection breadth, collapses deeply nested data,
|
|
59
|
+
* and redacts encrypted reasoning fields before trace storage or transport.
|
|
60
|
+
*/
|
|
61
|
+
export function sanitizeAssistantWorkflowTraceValue(value, depth = 0, options) {
|
|
62
|
+
return sanitizeTraceValue(value, depth, buildSanitizerPolicy(options));
|
|
63
|
+
}
|
|
64
|
+
export function sanitizeAssistantWorkflowTracePayload(payload, options) {
|
|
65
|
+
const policy = buildSanitizerPolicy(options);
|
|
66
|
+
const sanitized = {};
|
|
67
|
+
for (const [key, value] of Object.entries(payload).slice(0, TRACE_PAYLOAD_ENTRY_LIMIT)) {
|
|
68
|
+
sanitized[key] = policy.redactedKeys.has(key)
|
|
69
|
+
? "[redacted]"
|
|
70
|
+
: sanitizeTraceValue(value, 0, policy);
|
|
71
|
+
}
|
|
72
|
+
return sanitized;
|
|
73
|
+
}
|
|
74
|
+
export function buildAssistantWorkflowTraceEntry(stage, payload, timestamp = new Date(), options) {
|
|
75
|
+
const sanitizedPayload = payload ? sanitizeAssistantWorkflowTracePayload(payload, options) : undefined;
|
|
76
|
+
return {
|
|
77
|
+
stage,
|
|
78
|
+
timestamp: timestamp instanceof Date ? timestamp.toISOString() : timestamp,
|
|
79
|
+
...(sanitizedPayload ? { payload: sanitizedPayload } : {}),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
export function summarizeAssistantWorkflowToolArgsForTrace(args) {
|
|
83
|
+
const summary = {};
|
|
84
|
+
for (const [key, value] of Object.entries(args)) {
|
|
85
|
+
if (typeof value === "string") {
|
|
86
|
+
summary[key] = truncateTraceString(value, TOOL_ARGUMENT_STRING_LIMIT);
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
if (typeof value === "number" || typeof value === "boolean" || value === null) {
|
|
90
|
+
summary[key] = value;
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
if (Array.isArray(value)) {
|
|
94
|
+
summary[key] = `array(${value.length})`;
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
const record = readAssistantWorkflowRecord(value);
|
|
98
|
+
summary[key] = record ? `object(${Object.keys(record).length})` : typeof value;
|
|
99
|
+
}
|
|
100
|
+
return summary;
|
|
101
|
+
}
|
|
102
|
+
export function findLatestAssistantWorkflowTracePayload(traceEvents, stage) {
|
|
103
|
+
for (let index = (traceEvents?.length ?? 0) - 1; index >= 0; index -= 1) {
|
|
104
|
+
const entry = traceEvents?.[index];
|
|
105
|
+
if (!entry || entry.stage !== stage)
|
|
106
|
+
continue;
|
|
107
|
+
const payload = readAssistantWorkflowRecord(entry.payload);
|
|
108
|
+
if (payload)
|
|
109
|
+
return payload;
|
|
110
|
+
}
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=trace-payload.js.map
|