@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,81 @@
|
|
|
1
|
+
import { type AssistantWorkflowDefinition, type AssistantWorkflowOptionalToolSelectionMode, type AssistantWorkflowToolContextRequirement } from "./definition.js";
|
|
2
|
+
import type { AssistantWorkflowDecision, AssistantWorkflowDecisionInput } from "./decision.js";
|
|
3
|
+
export type { AssistantWorkflowOptionalToolSelectionMode } from "./definition.js";
|
|
4
|
+
export type AssistantWorkflowToolSelectionCandidate = {
|
|
5
|
+
optionalToolSelectionMode: AssistantWorkflowOptionalToolSelectionMode;
|
|
6
|
+
toolNames: string[];
|
|
7
|
+
classifierToolNames: string[];
|
|
8
|
+
requiredToolNames: string[];
|
|
9
|
+
optionalToolNames: string[];
|
|
10
|
+
excludedOptionalToolNames: string[];
|
|
11
|
+
activeProfileIds: string[];
|
|
12
|
+
profileToolNames: string[];
|
|
13
|
+
profileExcludedToolNames: string[];
|
|
14
|
+
};
|
|
15
|
+
export type AssistantWorkflowToolSelectionCandidateInput = {
|
|
16
|
+
workflow: AssistantWorkflowDefinition<string, string, string, string>;
|
|
17
|
+
decision: Pick<AssistantWorkflowDecision, "intent" | "classifierTools" | "requiredToolHints" | "toolHints" | "workflowSuggestedTools">;
|
|
18
|
+
availableToolNames?: readonly string[] | null;
|
|
19
|
+
hop?: number | null;
|
|
20
|
+
selectedReason?: string | null;
|
|
21
|
+
resolvedScope?: boolean;
|
|
22
|
+
attributeCount?: number | null;
|
|
23
|
+
};
|
|
24
|
+
export type AssistantWorkflowToolSelectionAuthoritySource = "workflow" | "legacy-pruner";
|
|
25
|
+
export type AssistantWorkflowToolSelectionAuthorityReason = "workflow_equivalent" | "workflow_authority_enabled" | "workflow_unavailable" | "workflow_authority_not_enabled" | "workflow_blocked" | "workflow_differs";
|
|
26
|
+
export type AssistantWorkflowToolSelectionAuthority = {
|
|
27
|
+
source: AssistantWorkflowToolSelectionAuthoritySource;
|
|
28
|
+
reason: AssistantWorkflowToolSelectionAuthorityReason;
|
|
29
|
+
selectedToolNames: string[];
|
|
30
|
+
workflowSuggestedToolNames: string[];
|
|
31
|
+
workflowStatus: string | null;
|
|
32
|
+
};
|
|
33
|
+
export type AssistantWorkflowToolSelectionAuthorityInput = {
|
|
34
|
+
selectedToolNames: readonly string[];
|
|
35
|
+
workflowAvailable: boolean;
|
|
36
|
+
workflowSuggestedToolNames?: readonly string[] | null;
|
|
37
|
+
workflowSelectionCandidateToolNames?: readonly string[] | null;
|
|
38
|
+
workflowStatus?: string | null;
|
|
39
|
+
workflowAuthorityEnabled?: boolean | null;
|
|
40
|
+
};
|
|
41
|
+
export type AssistantWorkflowToolSelectionComparisonInput = {
|
|
42
|
+
workflow: AssistantWorkflowDefinition<string, string, string, string>;
|
|
43
|
+
classification?: AssistantWorkflowDecisionInput | null;
|
|
44
|
+
availableToolNames?: readonly string[] | null;
|
|
45
|
+
selectedToolNames: readonly string[];
|
|
46
|
+
selectedMode?: string | null;
|
|
47
|
+
selectedReason?: string | null;
|
|
48
|
+
hop?: number | null;
|
|
49
|
+
pruningEnabled?: boolean | null;
|
|
50
|
+
availableContext?: readonly AssistantWorkflowToolContextRequirement[] | null;
|
|
51
|
+
resolvedScope?: boolean;
|
|
52
|
+
workflowAuthorityIntentIds?: readonly string[] | null;
|
|
53
|
+
workflowAuthoritySegmentKeys?: readonly string[] | null;
|
|
54
|
+
workflowAuthorityProfileKeys?: readonly string[] | null;
|
|
55
|
+
};
|
|
56
|
+
export type AssistantWorkflowToolSelectionDecisionInput = AssistantWorkflowToolSelectionComparisonInput;
|
|
57
|
+
export type AssistantWorkflowToolSelectionDecision = {
|
|
58
|
+
comparisonPayload: Record<string, unknown> | null;
|
|
59
|
+
authority: AssistantWorkflowToolSelectionAuthority;
|
|
60
|
+
effectiveToolNames: string[];
|
|
61
|
+
effectiveReason: string | null;
|
|
62
|
+
};
|
|
63
|
+
export declare function buildAssistantWorkflowToolSelectionCandidate(input: AssistantWorkflowToolSelectionCandidateInput): AssistantWorkflowToolSelectionCandidate;
|
|
64
|
+
export declare function buildAssistantWorkflowToolSelectionDecision(input: AssistantWorkflowToolSelectionDecisionInput): AssistantWorkflowToolSelectionDecision;
|
|
65
|
+
export declare function buildAssistantWorkflowToolSelectionComparisonPayload(input: AssistantWorkflowToolSelectionComparisonInput): Record<string, unknown> | null;
|
|
66
|
+
export declare function buildAssistantWorkflowToolSelectionAuthority(input: AssistantWorkflowToolSelectionAuthorityInput): AssistantWorkflowToolSelectionAuthority;
|
|
67
|
+
export declare function buildAssistantWorkflowToolSelectionSegmentKey(input: {
|
|
68
|
+
intentId: string | null;
|
|
69
|
+
hop: number | null;
|
|
70
|
+
selectedReason: string | null;
|
|
71
|
+
}): string;
|
|
72
|
+
/**
|
|
73
|
+
* Exact active profile combinations are authority scopes. A single profile can
|
|
74
|
+
* be safe in one combination and unsafe in another, so profile ids are sorted
|
|
75
|
+
* and retained together with the intent.
|
|
76
|
+
*/
|
|
77
|
+
export declare function buildAssistantWorkflowToolSelectionProfileKey(input: {
|
|
78
|
+
intentId: string | null;
|
|
79
|
+
profileIds: readonly unknown[] | null | undefined;
|
|
80
|
+
}): string | null;
|
|
81
|
+
//# sourceMappingURL=tool-selection-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-selection-policy.d.ts","sourceRoot":"","sources":["../src/tool-selection-policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
import { findAssistantWorkflowIntent, } from "./definition.js";
|
|
2
|
+
import { buildAssistantWorkflowRun, buildAssistantWorkflowRunTracePayload, } from "./run.js";
|
|
3
|
+
import { summarizeAssistantWorkflowToolCapabilities } from "./tool-capabilities.js";
|
|
4
|
+
import { readAssistantWorkflowString as normalizeNullableString, readAssistantWorkflowStringArray as readStringArray, } from "./value-readers.js";
|
|
5
|
+
export function buildAssistantWorkflowToolSelectionCandidate(input) {
|
|
6
|
+
const intent = findAssistantWorkflowIntent(input.workflow, input.decision.intent);
|
|
7
|
+
const optionalToolSelectionMode = intent?.optionalToolSelectionMode ?? "classifier-confirmed";
|
|
8
|
+
const classifierToolNames = uniqueStrings(input.decision.classifierTools);
|
|
9
|
+
const requiredToolNames = uniqueStrings(input.decision.requiredToolHints);
|
|
10
|
+
const optionalToolNames = uniqueStrings(input.decision.toolHints)
|
|
11
|
+
.filter((toolName) => !requiredToolNames.includes(toolName));
|
|
12
|
+
const classifierToolSet = new Set(classifierToolNames);
|
|
13
|
+
const availableToolNameSet = buildOptionalToolNameSet(input.availableToolNames);
|
|
14
|
+
const activeProfiles = (intent?.toolSelectionProfiles ?? [])
|
|
15
|
+
.filter((profile) => toolSelectionProfileConditionMatches(profile.condition, {
|
|
16
|
+
hop: input.hop ?? null,
|
|
17
|
+
selectedReason: input.selectedReason ?? null,
|
|
18
|
+
resolvedScope: input.resolvedScope === true,
|
|
19
|
+
attributeCount: input.attributeCount ?? null,
|
|
20
|
+
classifierToolNames: classifierToolSet,
|
|
21
|
+
}));
|
|
22
|
+
const activeProfileIds = uniqueStrings(activeProfiles.map((profile) => profile.id));
|
|
23
|
+
const profileToolNames = uniqueStrings(activeProfiles.flatMap((profile) => {
|
|
24
|
+
const mode = profile.optionalToolSelectionMode ?? "workflow-suggested";
|
|
25
|
+
const profileToolHints = uniqueStrings(profile.toolHints)
|
|
26
|
+
.filter((toolName) => !availableToolNameSet || availableToolNameSet.has(toolName));
|
|
27
|
+
return mode === "workflow-suggested"
|
|
28
|
+
? profileToolHints
|
|
29
|
+
: profileToolHints.filter((toolName) => classifierToolSet.has(toolName));
|
|
30
|
+
}));
|
|
31
|
+
const profileExcludedToolNames = uniqueStrings(activeProfiles.flatMap((profile) => profile.toolExclusions ?? []));
|
|
32
|
+
const requiredToolSet = new Set(requiredToolNames);
|
|
33
|
+
const profileExcludedToolSet = new Set(profileExcludedToolNames.filter((toolName) => !requiredToolSet.has(toolName)));
|
|
34
|
+
const allowedOptionalToolNames = optionalToolSelectionMode === "workflow-suggested"
|
|
35
|
+
? optionalToolNames
|
|
36
|
+
: optionalToolNames.filter((toolName) => classifierToolSet.has(toolName));
|
|
37
|
+
const allowedOptionalToolSet = new Set(allowedOptionalToolNames);
|
|
38
|
+
const allowedSet = new Set([
|
|
39
|
+
...classifierToolNames,
|
|
40
|
+
...requiredToolNames,
|
|
41
|
+
...allowedOptionalToolNames,
|
|
42
|
+
...profileToolNames,
|
|
43
|
+
]);
|
|
44
|
+
const toolNames = orderToolNamesByAvailableCatalog(uniqueStrings([
|
|
45
|
+
...input.decision.workflowSuggestedTools.filter((toolName) => allowedSet.has(toolName)),
|
|
46
|
+
...classifierToolNames,
|
|
47
|
+
...requiredToolNames,
|
|
48
|
+
...allowedOptionalToolNames,
|
|
49
|
+
...profileToolNames,
|
|
50
|
+
]).filter((toolName) => !profileExcludedToolSet.has(toolName)), input.availableToolNames);
|
|
51
|
+
return {
|
|
52
|
+
optionalToolSelectionMode,
|
|
53
|
+
toolNames,
|
|
54
|
+
classifierToolNames,
|
|
55
|
+
requiredToolNames,
|
|
56
|
+
optionalToolNames,
|
|
57
|
+
excludedOptionalToolNames: uniqueStrings([
|
|
58
|
+
...optionalToolNames.filter((toolName) => !allowedOptionalToolSet.has(toolName)),
|
|
59
|
+
...optionalToolNames.filter((toolName) => profileExcludedToolSet.has(toolName)),
|
|
60
|
+
]),
|
|
61
|
+
activeProfileIds,
|
|
62
|
+
profileToolNames: orderToolNamesByAvailableCatalog(profileToolNames, input.availableToolNames),
|
|
63
|
+
profileExcludedToolNames: orderToolNamesByAvailableCatalog(profileExcludedToolNames, input.availableToolNames),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
export function buildAssistantWorkflowToolSelectionDecision(input) {
|
|
67
|
+
const selectedToolNames = uniqueStrings(input.selectedToolNames);
|
|
68
|
+
const comparisonPayload = buildAssistantWorkflowToolSelectionComparisonPayload(input);
|
|
69
|
+
const workflowAuthorityEnabled = comparisonPayload
|
|
70
|
+
? isWorkflowAuthorityEnabled(input, comparisonPayload)
|
|
71
|
+
: false;
|
|
72
|
+
const authority = comparisonPayload
|
|
73
|
+
? buildAssistantWorkflowToolSelectionAuthority({
|
|
74
|
+
selectedToolNames,
|
|
75
|
+
workflowAvailable: true,
|
|
76
|
+
workflowSuggestedToolNames: readStringArray(comparisonPayload["workflowSuggestedTools"]),
|
|
77
|
+
workflowSelectionCandidateToolNames: readStringArray(comparisonPayload["workflowSelectionCandidateTools"]),
|
|
78
|
+
workflowStatus: readWorkflowStatus(comparisonPayload),
|
|
79
|
+
workflowAuthorityEnabled,
|
|
80
|
+
})
|
|
81
|
+
: buildAssistantWorkflowToolSelectionAuthority({
|
|
82
|
+
selectedToolNames,
|
|
83
|
+
workflowAvailable: false,
|
|
84
|
+
});
|
|
85
|
+
const gatedAuthority = applyWorkflowAuthorityIntentGate(authority, input, comparisonPayload);
|
|
86
|
+
const effectiveReason = gatedAuthority.source === "workflow"
|
|
87
|
+
? gatedAuthority.reason
|
|
88
|
+
: normalizeNullableString(input.selectedReason);
|
|
89
|
+
const effectiveToolNames = gatedAuthority.source === "workflow"
|
|
90
|
+
? [...gatedAuthority.selectedToolNames]
|
|
91
|
+
: selectedToolNames;
|
|
92
|
+
return {
|
|
93
|
+
comparisonPayload: comparisonPayload
|
|
94
|
+
? {
|
|
95
|
+
...comparisonPayload,
|
|
96
|
+
selectedReason: effectiveReason,
|
|
97
|
+
selectedToolCount: effectiveToolNames.length,
|
|
98
|
+
workflowAuthoritySegmentKey: buildAssistantWorkflowToolSelectionSegmentKey({
|
|
99
|
+
intentId: normalizeNullableString(input.classification?.intent) ?? "unknown",
|
|
100
|
+
hop: input.hop ?? null,
|
|
101
|
+
selectedReason: input.selectedReason ?? null,
|
|
102
|
+
}),
|
|
103
|
+
workflowAuthorityIntentIds: normalizeOptionalStringList(input.workflowAuthorityIntentIds),
|
|
104
|
+
workflowAuthoritySegmentKeys: normalizeOptionalStringList(input.workflowAuthoritySegmentKeys),
|
|
105
|
+
workflowAuthorityProfileKeys: normalizeOptionalStringList(input.workflowAuthorityProfileKeys),
|
|
106
|
+
authority: gatedAuthority,
|
|
107
|
+
}
|
|
108
|
+
: null,
|
|
109
|
+
authority: gatedAuthority,
|
|
110
|
+
effectiveToolNames,
|
|
111
|
+
effectiveReason,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
export function buildAssistantWorkflowToolSelectionComparisonPayload(input) {
|
|
115
|
+
if (!input.classification)
|
|
116
|
+
return null;
|
|
117
|
+
const selectedToolNames = uniqueStrings(input.selectedToolNames);
|
|
118
|
+
const workflowRun = buildAssistantWorkflowRun(input.workflow, {
|
|
119
|
+
classification: {
|
|
120
|
+
...input.classification,
|
|
121
|
+
...(input.resolvedScope === true ? { resolvedScope: true } : {}),
|
|
122
|
+
},
|
|
123
|
+
availableToolNames: input.availableToolNames ?? [],
|
|
124
|
+
availableContext: input.availableContext ?? null,
|
|
125
|
+
});
|
|
126
|
+
const workflowDecision = workflowRun.decision;
|
|
127
|
+
const workflowSelectionCandidate = buildAssistantWorkflowToolSelectionCandidate({
|
|
128
|
+
workflow: input.workflow,
|
|
129
|
+
decision: workflowDecision,
|
|
130
|
+
availableToolNames: input.availableToolNames ?? [],
|
|
131
|
+
hop: input.hop ?? null,
|
|
132
|
+
selectedReason: input.selectedReason ?? null,
|
|
133
|
+
resolvedScope: input.resolvedScope === true,
|
|
134
|
+
attributeCount: countDistinctAttributes(input.classification?.entities?.attributes),
|
|
135
|
+
});
|
|
136
|
+
const selectedSet = new Set(selectedToolNames);
|
|
137
|
+
const workflowSet = new Set(workflowDecision.workflowSuggestedTools);
|
|
138
|
+
const workflowSelectionCandidateSet = new Set(workflowSelectionCandidate.toolNames);
|
|
139
|
+
const workflowAuthorityProfileKey = buildAssistantWorkflowToolSelectionProfileKey({
|
|
140
|
+
intentId: workflowDecision.intent,
|
|
141
|
+
profileIds: workflowSelectionCandidate.activeProfileIds,
|
|
142
|
+
});
|
|
143
|
+
const runTrace = buildAssistantWorkflowRunTracePayload(workflowRun);
|
|
144
|
+
const decisionTrace = runTrace["decision"];
|
|
145
|
+
const executionPlanTrace = runTrace["executionPlan"];
|
|
146
|
+
return {
|
|
147
|
+
...(typeof input.hop === "number" ? { hop: input.hop } : {}),
|
|
148
|
+
...(typeof input.pruningEnabled === "boolean" ? { pruningEnabled: input.pruningEnabled } : {}),
|
|
149
|
+
// Keep workflow identity flat so bounded trace payload sanitizers retain it
|
|
150
|
+
// even when the detailed workflowRun object is omitted.
|
|
151
|
+
workflowId: workflowRun.workflowId,
|
|
152
|
+
workflowVersion: workflowRun.workflowVersion,
|
|
153
|
+
resolvedScope: input.resolvedScope === true,
|
|
154
|
+
...(input.selectedMode ? { selectedMode: input.selectedMode } : {}),
|
|
155
|
+
...(input.selectedReason ? { selectedReason: input.selectedReason } : {}),
|
|
156
|
+
selectedToolCount: selectedToolNames.length,
|
|
157
|
+
...decisionTrace,
|
|
158
|
+
workflowRun: runTrace,
|
|
159
|
+
executionPlan: executionPlanTrace,
|
|
160
|
+
workflowSelectionCandidateTools: workflowSelectionCandidate.toolNames,
|
|
161
|
+
workflowSelectionOptionalToolMode: workflowSelectionCandidate.optionalToolSelectionMode,
|
|
162
|
+
workflowSelectionExcludedOptionalTools: workflowSelectionCandidate.excludedOptionalToolNames,
|
|
163
|
+
workflowSelectionActiveProfileIds: workflowSelectionCandidate.activeProfileIds,
|
|
164
|
+
workflowSelectionProfileTools: workflowSelectionCandidate.profileToolNames,
|
|
165
|
+
workflowSelectionProfileExcludedTools: workflowSelectionCandidate.profileExcludedToolNames,
|
|
166
|
+
...(workflowAuthorityProfileKey ? { workflowAuthorityProfileKey } : {}),
|
|
167
|
+
missingWorkflowSuggestedTools: workflowDecision.workflowSuggestedTools.filter((tool) => !selectedSet.has(tool)),
|
|
168
|
+
missingWorkflowSelectionCandidateTools: workflowSelectionCandidate.toolNames.filter((tool) => !selectedSet.has(tool)),
|
|
169
|
+
selectedOutsideWorkflowSuggestions: selectedToolNames.filter((tool) => !workflowSet.has(tool)),
|
|
170
|
+
selectedOutsideWorkflowSelectionCandidate: selectedToolNames.filter((tool) => !workflowSelectionCandidateSet.has(tool)),
|
|
171
|
+
selectedToolCapabilitySummary: summarizeAssistantWorkflowToolCapabilities(input.workflow, selectedToolNames),
|
|
172
|
+
workflowSuggestedToolCapabilitySummary: summarizeAssistantWorkflowToolCapabilities(input.workflow, workflowDecision.workflowSuggestedTools),
|
|
173
|
+
workflowSelectionCandidateToolCapabilitySummary: summarizeAssistantWorkflowToolCapabilities(input.workflow, workflowSelectionCandidate.toolNames),
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
function toolSelectionProfileConditionMatches(condition, input) {
|
|
177
|
+
if (!condition)
|
|
178
|
+
return true;
|
|
179
|
+
if (condition.minHop !== undefined && (input.hop === null || input.hop < condition.minHop))
|
|
180
|
+
return false;
|
|
181
|
+
if (condition.maxHop !== undefined && (input.hop === null || input.hop > condition.maxHop))
|
|
182
|
+
return false;
|
|
183
|
+
if (condition.selectedReason !== undefined) {
|
|
184
|
+
const expectedReason = normalizeNullableString(condition.selectedReason);
|
|
185
|
+
if (expectedReason === null || normalizeNullableString(input.selectedReason) !== expectedReason)
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
if (condition.resolvedScope !== undefined && condition.resolvedScope !== input.resolvedScope)
|
|
189
|
+
return false;
|
|
190
|
+
if (condition.minAttributeCount !== undefined &&
|
|
191
|
+
(input.attributeCount === null || input.attributeCount < condition.minAttributeCount)) {
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
194
|
+
if (condition.maxAttributeCount !== undefined &&
|
|
195
|
+
(input.attributeCount === null || input.attributeCount > condition.maxAttributeCount)) {
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
if (condition.requiredClassifierTools !== undefined &&
|
|
199
|
+
!condition.requiredClassifierTools.every((toolName) => input.classifierToolNames.has(toolName))) {
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
return true;
|
|
203
|
+
}
|
|
204
|
+
function countDistinctAttributes(values) {
|
|
205
|
+
if (!Array.isArray(values))
|
|
206
|
+
return null;
|
|
207
|
+
return new Set(values
|
|
208
|
+
.filter((value) => typeof value === "string")
|
|
209
|
+
.map((value) => value.trim().toLocaleLowerCase())
|
|
210
|
+
.filter((value) => value.length > 0)).size;
|
|
211
|
+
}
|
|
212
|
+
function buildOptionalToolNameSet(values) {
|
|
213
|
+
const toolNames = normalizeOptionalStringList(values);
|
|
214
|
+
return toolNames === null || toolNames.length === 0 ? null : new Set(toolNames);
|
|
215
|
+
}
|
|
216
|
+
function orderToolNamesByAvailableCatalog(toolNames, availableToolNames) {
|
|
217
|
+
const availableOrder = normalizeOptionalStringList(availableToolNames);
|
|
218
|
+
if (!availableOrder?.length)
|
|
219
|
+
return toolNames;
|
|
220
|
+
const toolNameSet = new Set(toolNames);
|
|
221
|
+
const ordered = availableOrder.filter((toolName) => toolNameSet.has(toolName));
|
|
222
|
+
return uniqueStrings([
|
|
223
|
+
...ordered,
|
|
224
|
+
...toolNames.filter((toolName) => !ordered.includes(toolName)),
|
|
225
|
+
]);
|
|
226
|
+
}
|
|
227
|
+
export function buildAssistantWorkflowToolSelectionAuthority(input) {
|
|
228
|
+
const selectedToolNames = uniqueStrings(input.selectedToolNames);
|
|
229
|
+
const workflowSuggestedToolNames = uniqueStrings(input.workflowSuggestedToolNames ?? []);
|
|
230
|
+
const workflowSelectionCandidateToolNames = uniqueStrings(input.workflowSelectionCandidateToolNames ?? []);
|
|
231
|
+
const workflowStatus = normalizeNullableString(input.workflowStatus);
|
|
232
|
+
const comparableWorkflowToolNames = workflowSelectionCandidateToolNames.length > 0
|
|
233
|
+
? workflowSelectionCandidateToolNames
|
|
234
|
+
: workflowSuggestedToolNames;
|
|
235
|
+
if (!input.workflowAvailable) {
|
|
236
|
+
return {
|
|
237
|
+
source: "legacy-pruner",
|
|
238
|
+
reason: "workflow_unavailable",
|
|
239
|
+
selectedToolNames,
|
|
240
|
+
workflowSuggestedToolNames,
|
|
241
|
+
workflowStatus: null,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
if (workflowStatus === "blocked" || workflowStatus === "needs-clarification") {
|
|
245
|
+
return {
|
|
246
|
+
source: "legacy-pruner",
|
|
247
|
+
reason: "workflow_blocked",
|
|
248
|
+
selectedToolNames,
|
|
249
|
+
workflowSuggestedToolNames,
|
|
250
|
+
workflowStatus,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
if (input.workflowAuthorityEnabled && comparableWorkflowToolNames.length > 0) {
|
|
254
|
+
return {
|
|
255
|
+
source: "workflow",
|
|
256
|
+
reason: sameStringSet(selectedToolNames, comparableWorkflowToolNames)
|
|
257
|
+
? "workflow_equivalent"
|
|
258
|
+
: "workflow_authority_enabled",
|
|
259
|
+
selectedToolNames: comparableWorkflowToolNames,
|
|
260
|
+
workflowSuggestedToolNames,
|
|
261
|
+
workflowStatus,
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
if (comparableWorkflowToolNames.length > 0 && sameStringSet(selectedToolNames, comparableWorkflowToolNames)) {
|
|
265
|
+
return {
|
|
266
|
+
source: "workflow",
|
|
267
|
+
reason: "workflow_equivalent",
|
|
268
|
+
selectedToolNames: comparableWorkflowToolNames,
|
|
269
|
+
workflowSuggestedToolNames,
|
|
270
|
+
workflowStatus,
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
return {
|
|
274
|
+
source: "legacy-pruner",
|
|
275
|
+
reason: "workflow_differs",
|
|
276
|
+
selectedToolNames,
|
|
277
|
+
workflowSuggestedToolNames,
|
|
278
|
+
workflowStatus,
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
export function buildAssistantWorkflowToolSelectionSegmentKey(input) {
|
|
282
|
+
return `${normalizeNullableString(input.intentId) ?? "unknown"}|hop:${input.hop ?? "unknown"}|${normalizeNullableString(input.selectedReason) ?? "unknown"}`;
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Exact active profile combinations are authority scopes. A single profile can
|
|
286
|
+
* be safe in one combination and unsafe in another, so profile ids are sorted
|
|
287
|
+
* and retained together with the intent.
|
|
288
|
+
*/
|
|
289
|
+
export function buildAssistantWorkflowToolSelectionProfileKey(input) {
|
|
290
|
+
const intentId = normalizeNullableString(input.intentId);
|
|
291
|
+
const profileIds = uniqueStrings(input.profileIds ?? []).sort((left, right) => left.localeCompare(right));
|
|
292
|
+
if (!intentId || !profileIds.length)
|
|
293
|
+
return null;
|
|
294
|
+
return `${intentId}|profiles:${profileIds.join(",")}`;
|
|
295
|
+
}
|
|
296
|
+
function uniqueStrings(values) {
|
|
297
|
+
const out = [];
|
|
298
|
+
const seen = new Set();
|
|
299
|
+
for (const value of values) {
|
|
300
|
+
if (typeof value !== "string")
|
|
301
|
+
continue;
|
|
302
|
+
const trimmed = value.trim();
|
|
303
|
+
if (!trimmed.length || seen.has(trimmed))
|
|
304
|
+
continue;
|
|
305
|
+
seen.add(trimmed);
|
|
306
|
+
out.push(trimmed);
|
|
307
|
+
}
|
|
308
|
+
return out;
|
|
309
|
+
}
|
|
310
|
+
function applyWorkflowAuthorityIntentGate(authority, input, comparisonPayload) {
|
|
311
|
+
const enabledIntentIds = normalizeOptionalStringList(input.workflowAuthorityIntentIds);
|
|
312
|
+
const enabledSegmentKeys = normalizeOptionalStringList(input.workflowAuthoritySegmentKeys);
|
|
313
|
+
const enabledProfileKeys = normalizeOptionalStringList(input.workflowAuthorityProfileKeys);
|
|
314
|
+
if (enabledIntentIds === null && enabledSegmentKeys === null && enabledProfileKeys === null)
|
|
315
|
+
return authority;
|
|
316
|
+
if (authority.source !== "workflow")
|
|
317
|
+
return authority;
|
|
318
|
+
const intentId = normalizeNullableString(input.classification?.intent);
|
|
319
|
+
if (intentId && enabledIntentIds?.includes(intentId))
|
|
320
|
+
return authority;
|
|
321
|
+
const segmentKey = buildAssistantWorkflowToolSelectionSegmentKey({
|
|
322
|
+
intentId: intentId ?? "unknown",
|
|
323
|
+
hop: input.hop ?? null,
|
|
324
|
+
selectedReason: input.selectedReason ?? null,
|
|
325
|
+
});
|
|
326
|
+
if (enabledSegmentKeys?.includes(segmentKey))
|
|
327
|
+
return authority;
|
|
328
|
+
const profileKey = comparisonPayload
|
|
329
|
+
? normalizeNullableString(comparisonPayload["workflowAuthorityProfileKey"])
|
|
330
|
+
: null;
|
|
331
|
+
if (profileKey && enabledProfileKeys?.includes(profileKey))
|
|
332
|
+
return authority;
|
|
333
|
+
return {
|
|
334
|
+
...authority,
|
|
335
|
+
source: "legacy-pruner",
|
|
336
|
+
reason: "workflow_authority_not_enabled",
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
function isWorkflowAuthorityEnabled(input, comparisonPayload) {
|
|
340
|
+
const enabledIntentIds = normalizeOptionalStringList(input.workflowAuthorityIntentIds);
|
|
341
|
+
const enabledSegmentKeys = normalizeOptionalStringList(input.workflowAuthoritySegmentKeys);
|
|
342
|
+
const enabledProfileKeys = normalizeOptionalStringList(input.workflowAuthorityProfileKeys);
|
|
343
|
+
if (enabledIntentIds === null && enabledSegmentKeys === null && enabledProfileKeys === null)
|
|
344
|
+
return false;
|
|
345
|
+
const intentId = normalizeNullableString(input.classification?.intent);
|
|
346
|
+
if (intentId && enabledIntentIds?.includes(intentId))
|
|
347
|
+
return true;
|
|
348
|
+
const segmentKey = buildAssistantWorkflowToolSelectionSegmentKey({
|
|
349
|
+
intentId: intentId ?? "unknown",
|
|
350
|
+
hop: input.hop ?? null,
|
|
351
|
+
selectedReason: input.selectedReason ?? null,
|
|
352
|
+
});
|
|
353
|
+
if (enabledSegmentKeys?.includes(segmentKey))
|
|
354
|
+
return true;
|
|
355
|
+
const profileKey = normalizeNullableString(comparisonPayload["workflowAuthorityProfileKey"]);
|
|
356
|
+
return profileKey !== null && (enabledProfileKeys?.includes(profileKey) ?? false);
|
|
357
|
+
}
|
|
358
|
+
function normalizeOptionalStringList(values) {
|
|
359
|
+
if (values === null || values === undefined)
|
|
360
|
+
return null;
|
|
361
|
+
return uniqueStrings(values);
|
|
362
|
+
}
|
|
363
|
+
function readWorkflowStatus(payload) {
|
|
364
|
+
const workflowRun = isRecord(payload["workflowRun"]) ? payload["workflowRun"] : null;
|
|
365
|
+
return normalizeNullableString(workflowRun?.["status"]);
|
|
366
|
+
}
|
|
367
|
+
function sameStringSet(left, right) {
|
|
368
|
+
if (left.length !== right.length)
|
|
369
|
+
return false;
|
|
370
|
+
const rightSet = new Set(right);
|
|
371
|
+
return left.every((item) => rightSet.has(item));
|
|
372
|
+
}
|
|
373
|
+
function isRecord(value) {
|
|
374
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
375
|
+
}
|
|
376
|
+
//# sourceMappingURL=tool-selection-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-selection-policy.js","sourceRoot":"","sources":["../src/tool-selection-policy.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n findAssistantWorkflowIntent,\n type AssistantWorkflowDefinition,\n type AssistantWorkflowOptionalToolSelectionMode,\n type AssistantWorkflowToolContextRequirement,\n} from \"./definition.js\";\nimport type { AssistantWorkflowDecision, AssistantWorkflowDecisionInput } from \"./decision.js\";\nimport {\n buildAssistantWorkflowRun,\n buildAssistantWorkflowRunTracePayload,\n} from \"./run.js\";\nimport { summarizeAssistantWorkflowToolCapabilities } from \"./tool-capabilities.js\";\nimport {\n readAssistantWorkflowString as normalizeNullableString,\n readAssistantWorkflowStringArray as readStringArray,\n} from \"./value-readers.js\";\n\nexport type { AssistantWorkflowOptionalToolSelectionMode } from \"./definition.js\";\n\nexport type AssistantWorkflowToolSelectionCandidate = {\n optionalToolSelectionMode: AssistantWorkflowOptionalToolSelectionMode;\n toolNames: string[];\n classifierToolNames: string[];\n requiredToolNames: string[];\n optionalToolNames: string[];\n excludedOptionalToolNames: string[];\n activeProfileIds: string[];\n profileToolNames: string[];\n profileExcludedToolNames: string[];\n};\n\nexport type AssistantWorkflowToolSelectionCandidateInput = {\n workflow: AssistantWorkflowDefinition<string, string, string, string>;\n decision: Pick<\n AssistantWorkflowDecision,\n \"intent\" | \"classifierTools\" | \"requiredToolHints\" | \"toolHints\" | \"workflowSuggestedTools\"\n >;\n availableToolNames?: readonly string[] | null;\n hop?: number | null;\n selectedReason?: string | null;\n resolvedScope?: boolean;\n attributeCount?: number | null;\n};\n\nexport type AssistantWorkflowToolSelectionAuthoritySource = \"workflow\" | \"legacy-pruner\";\n\nexport type AssistantWorkflowToolSelectionAuthorityReason =\n | \"workflow_equivalent\"\n | \"workflow_authority_enabled\"\n | \"workflow_unavailable\"\n | \"workflow_authority_not_enabled\"\n | \"workflow_blocked\"\n | \"workflow_differs\";\n\nexport type AssistantWorkflowToolSelectionAuthority = {\n source: AssistantWorkflowToolSelectionAuthoritySource;\n reason: AssistantWorkflowToolSelectionAuthorityReason;\n selectedToolNames: string[];\n workflowSuggestedToolNames: string[];\n workflowStatus: string | null;\n};\n\nexport type AssistantWorkflowToolSelectionAuthorityInput = {\n selectedToolNames: readonly string[];\n workflowAvailable: boolean;\n workflowSuggestedToolNames?: readonly string[] | null;\n workflowSelectionCandidateToolNames?: readonly string[] | null;\n workflowStatus?: string | null;\n workflowAuthorityEnabled?: boolean | null;\n};\n\nexport type AssistantWorkflowToolSelectionComparisonInput = {\n workflow: AssistantWorkflowDefinition<string, string, string, string>;\n classification?: AssistantWorkflowDecisionInput | null;\n availableToolNames?: readonly string[] | null;\n selectedToolNames: readonly string[];\n selectedMode?: string | null;\n selectedReason?: string | null;\n hop?: number | null;\n pruningEnabled?: boolean | null;\n availableContext?: readonly AssistantWorkflowToolContextRequirement[] | null;\n resolvedScope?: boolean;\n workflowAuthorityIntentIds?: readonly string[] | null;\n workflowAuthoritySegmentKeys?: readonly string[] | null;\n workflowAuthorityProfileKeys?: readonly string[] | null;\n};\n\nexport type AssistantWorkflowToolSelectionDecisionInput = AssistantWorkflowToolSelectionComparisonInput;\n\nexport type AssistantWorkflowToolSelectionDecision = {\n comparisonPayload: Record<string, unknown> | null;\n authority: AssistantWorkflowToolSelectionAuthority;\n effectiveToolNames: string[];\n effectiveReason: string | null;\n};\n\nexport function buildAssistantWorkflowToolSelectionCandidate(\n input: AssistantWorkflowToolSelectionCandidateInput,\n): AssistantWorkflowToolSelectionCandidate {\n const intent = findAssistantWorkflowIntent(input.workflow, input.decision.intent);\n const optionalToolSelectionMode = intent?.optionalToolSelectionMode ?? \"classifier-confirmed\";\n const classifierToolNames = uniqueStrings(input.decision.classifierTools);\n const requiredToolNames = uniqueStrings(input.decision.requiredToolHints);\n const optionalToolNames = uniqueStrings(input.decision.toolHints)\n .filter((toolName) => !requiredToolNames.includes(toolName));\n const classifierToolSet = new Set(classifierToolNames);\n const availableToolNameSet = buildOptionalToolNameSet(input.availableToolNames);\n const activeProfiles = (intent?.toolSelectionProfiles ?? [])\n .filter((profile) => toolSelectionProfileConditionMatches(profile.condition, {\n hop: input.hop ?? null,\n selectedReason: input.selectedReason ?? null,\n resolvedScope: input.resolvedScope === true,\n attributeCount: input.attributeCount ?? null,\n classifierToolNames: classifierToolSet,\n }));\n const activeProfileIds = uniqueStrings(activeProfiles.map((profile) => profile.id));\n const profileToolNames = uniqueStrings(activeProfiles.flatMap((profile) => {\n const mode = profile.optionalToolSelectionMode ?? \"workflow-suggested\";\n const profileToolHints = uniqueStrings(profile.toolHints)\n .filter((toolName) => !availableToolNameSet || availableToolNameSet.has(toolName));\n return mode === \"workflow-suggested\"\n ? profileToolHints\n : profileToolHints.filter((toolName) => classifierToolSet.has(toolName));\n }));\n const profileExcludedToolNames = uniqueStrings(activeProfiles.flatMap((profile) => profile.toolExclusions ?? []));\n const requiredToolSet = new Set(requiredToolNames);\n const profileExcludedToolSet = new Set(profileExcludedToolNames.filter((toolName) => !requiredToolSet.has(toolName)));\n const allowedOptionalToolNames = optionalToolSelectionMode === \"workflow-suggested\"\n ? optionalToolNames\n : optionalToolNames.filter((toolName) => classifierToolSet.has(toolName));\n const allowedOptionalToolSet = new Set(allowedOptionalToolNames);\n const allowedSet = new Set([\n ...classifierToolNames,\n ...requiredToolNames,\n ...allowedOptionalToolNames,\n ...profileToolNames,\n ]);\n const toolNames = orderToolNamesByAvailableCatalog(uniqueStrings([\n ...input.decision.workflowSuggestedTools.filter((toolName) => allowedSet.has(toolName)),\n ...classifierToolNames,\n ...requiredToolNames,\n ...allowedOptionalToolNames,\n ...profileToolNames,\n ]).filter((toolName) => !profileExcludedToolSet.has(toolName)), input.availableToolNames);\n\n return {\n optionalToolSelectionMode,\n toolNames,\n classifierToolNames,\n requiredToolNames,\n optionalToolNames,\n excludedOptionalToolNames: uniqueStrings([\n ...optionalToolNames.filter((toolName) => !allowedOptionalToolSet.has(toolName)),\n ...optionalToolNames.filter((toolName) => profileExcludedToolSet.has(toolName)),\n ]),\n activeProfileIds,\n profileToolNames: orderToolNamesByAvailableCatalog(profileToolNames, input.availableToolNames),\n profileExcludedToolNames: orderToolNamesByAvailableCatalog(profileExcludedToolNames, input.availableToolNames),\n };\n}\n\nexport function buildAssistantWorkflowToolSelectionDecision(\n input: AssistantWorkflowToolSelectionDecisionInput,\n): AssistantWorkflowToolSelectionDecision {\n const selectedToolNames = uniqueStrings(input.selectedToolNames);\n const comparisonPayload = buildAssistantWorkflowToolSelectionComparisonPayload(input);\n const workflowAuthorityEnabled = comparisonPayload\n ? isWorkflowAuthorityEnabled(input, comparisonPayload)\n : false;\n const authority = comparisonPayload\n ? buildAssistantWorkflowToolSelectionAuthority({\n selectedToolNames,\n workflowAvailable: true,\n workflowSuggestedToolNames: readStringArray(comparisonPayload[\"workflowSuggestedTools\"]),\n workflowSelectionCandidateToolNames: readStringArray(comparisonPayload[\"workflowSelectionCandidateTools\"]),\n workflowStatus: readWorkflowStatus(comparisonPayload),\n workflowAuthorityEnabled,\n })\n : buildAssistantWorkflowToolSelectionAuthority({\n selectedToolNames,\n workflowAvailable: false,\n });\n const gatedAuthority = applyWorkflowAuthorityIntentGate(authority, input, comparisonPayload);\n const effectiveReason = gatedAuthority.source === \"workflow\"\n ? gatedAuthority.reason\n : normalizeNullableString(input.selectedReason);\n const effectiveToolNames = gatedAuthority.source === \"workflow\"\n ? [...gatedAuthority.selectedToolNames]\n : selectedToolNames;\n\n return {\n comparisonPayload: comparisonPayload\n ? {\n ...comparisonPayload,\n selectedReason: effectiveReason,\n selectedToolCount: effectiveToolNames.length,\n workflowAuthoritySegmentKey: buildAssistantWorkflowToolSelectionSegmentKey({\n intentId: normalizeNullableString(input.classification?.intent) ?? \"unknown\",\n hop: input.hop ?? null,\n selectedReason: input.selectedReason ?? null,\n }),\n workflowAuthorityIntentIds: normalizeOptionalStringList(input.workflowAuthorityIntentIds),\n workflowAuthoritySegmentKeys: normalizeOptionalStringList(input.workflowAuthoritySegmentKeys),\n workflowAuthorityProfileKeys: normalizeOptionalStringList(input.workflowAuthorityProfileKeys),\n authority: gatedAuthority,\n }\n : null,\n authority: gatedAuthority,\n effectiveToolNames,\n effectiveReason,\n };\n}\n\nexport function buildAssistantWorkflowToolSelectionComparisonPayload(\n input: AssistantWorkflowToolSelectionComparisonInput,\n): Record<string, unknown> | null {\n if (!input.classification) return null;\n\n const selectedToolNames = uniqueStrings(input.selectedToolNames);\n const workflowRun = buildAssistantWorkflowRun(input.workflow, {\n classification: {\n ...input.classification,\n ...(input.resolvedScope === true ? { resolvedScope: true } : {}),\n },\n availableToolNames: input.availableToolNames ?? [],\n availableContext: input.availableContext ?? null,\n });\n const workflowDecision = workflowRun.decision;\n const workflowSelectionCandidate = buildAssistantWorkflowToolSelectionCandidate({\n workflow: input.workflow,\n decision: workflowDecision,\n availableToolNames: input.availableToolNames ?? [],\n hop: input.hop ?? null,\n selectedReason: input.selectedReason ?? null,\n resolvedScope: input.resolvedScope === true,\n attributeCount: countDistinctAttributes(input.classification?.entities?.attributes),\n });\n const selectedSet = new Set(selectedToolNames);\n const workflowSet = new Set(workflowDecision.workflowSuggestedTools);\n const workflowSelectionCandidateSet = new Set(workflowSelectionCandidate.toolNames);\n const workflowAuthorityProfileKey = buildAssistantWorkflowToolSelectionProfileKey({\n intentId: workflowDecision.intent,\n profileIds: workflowSelectionCandidate.activeProfileIds,\n });\n const runTrace = buildAssistantWorkflowRunTracePayload(workflowRun);\n const decisionTrace = runTrace[\"decision\"] as Record<string, unknown>;\n const executionPlanTrace = runTrace[\"executionPlan\"] as Record<string, unknown>;\n\n return {\n ...(typeof input.hop === \"number\" ? { hop: input.hop } : {}),\n ...(typeof input.pruningEnabled === \"boolean\" ? { pruningEnabled: input.pruningEnabled } : {}),\n // Keep workflow identity flat so bounded trace payload sanitizers retain it\n // even when the detailed workflowRun object is omitted.\n workflowId: workflowRun.workflowId,\n workflowVersion: workflowRun.workflowVersion,\n resolvedScope: input.resolvedScope === true,\n ...(input.selectedMode ? { selectedMode: input.selectedMode } : {}),\n ...(input.selectedReason ? { selectedReason: input.selectedReason } : {}),\n selectedToolCount: selectedToolNames.length,\n ...decisionTrace,\n workflowRun: runTrace,\n executionPlan: executionPlanTrace,\n workflowSelectionCandidateTools: workflowSelectionCandidate.toolNames,\n workflowSelectionOptionalToolMode: workflowSelectionCandidate.optionalToolSelectionMode,\n workflowSelectionExcludedOptionalTools: workflowSelectionCandidate.excludedOptionalToolNames,\n workflowSelectionActiveProfileIds: workflowSelectionCandidate.activeProfileIds,\n workflowSelectionProfileTools: workflowSelectionCandidate.profileToolNames,\n workflowSelectionProfileExcludedTools: workflowSelectionCandidate.profileExcludedToolNames,\n ...(workflowAuthorityProfileKey ? { workflowAuthorityProfileKey } : {}),\n missingWorkflowSuggestedTools: workflowDecision.workflowSuggestedTools.filter((tool) => !selectedSet.has(tool)),\n missingWorkflowSelectionCandidateTools: workflowSelectionCandidate.toolNames.filter((tool) => !selectedSet.has(tool)),\n selectedOutsideWorkflowSuggestions: selectedToolNames.filter((tool) => !workflowSet.has(tool)),\n selectedOutsideWorkflowSelectionCandidate: selectedToolNames.filter((tool) => !workflowSelectionCandidateSet.has(tool)),\n selectedToolCapabilitySummary: summarizeAssistantWorkflowToolCapabilities(\n input.workflow,\n selectedToolNames,\n ),\n workflowSuggestedToolCapabilitySummary: summarizeAssistantWorkflowToolCapabilities(\n input.workflow,\n workflowDecision.workflowSuggestedTools,\n ),\n workflowSelectionCandidateToolCapabilitySummary: summarizeAssistantWorkflowToolCapabilities(\n input.workflow,\n workflowSelectionCandidate.toolNames,\n ),\n };\n}\n\nfunction toolSelectionProfileConditionMatches(\n condition: NonNullable<AssistantWorkflowDefinition<string, string, string, string>[\"intents\"][number][\"toolSelectionProfiles\"]>[number][\"condition\"],\n input: {\n hop: number | null;\n selectedReason: string | null;\n resolvedScope: boolean;\n attributeCount: number | null;\n classifierToolNames: ReadonlySet<string>;\n },\n): boolean {\n if (!condition) return true;\n if (condition.minHop !== undefined && (input.hop === null || input.hop < condition.minHop)) return false;\n if (condition.maxHop !== undefined && (input.hop === null || input.hop > condition.maxHop)) return false;\n if (condition.selectedReason !== undefined) {\n const expectedReason = normalizeNullableString(condition.selectedReason);\n if (expectedReason === null || normalizeNullableString(input.selectedReason) !== expectedReason) return false;\n }\n if (condition.resolvedScope !== undefined && condition.resolvedScope !== input.resolvedScope) return false;\n if (\n condition.minAttributeCount !== undefined &&\n (input.attributeCount === null || input.attributeCount < condition.minAttributeCount)\n ) {\n return false;\n }\n if (\n condition.maxAttributeCount !== undefined &&\n (input.attributeCount === null || input.attributeCount > condition.maxAttributeCount)\n ) {\n return false;\n }\n if (\n condition.requiredClassifierTools !== undefined &&\n !condition.requiredClassifierTools.every((toolName) => input.classifierToolNames.has(toolName))\n ) {\n return false;\n }\n return true;\n}\n\nfunction countDistinctAttributes(values: readonly string[] | null | undefined): number | null {\n if (!Array.isArray(values)) return null;\n return new Set(\n values\n .filter((value): value is string => typeof value === \"string\")\n .map((value) => value.trim().toLocaleLowerCase())\n .filter((value) => value.length > 0),\n ).size;\n}\n\nfunction buildOptionalToolNameSet(values: readonly unknown[] | null | undefined): Set<string> | null {\n const toolNames = normalizeOptionalStringList(values);\n return toolNames === null || toolNames.length === 0 ? null : new Set(toolNames);\n}\n\nfunction orderToolNamesByAvailableCatalog(\n toolNames: string[],\n availableToolNames: readonly unknown[] | null | undefined,\n): string[] {\n const availableOrder = normalizeOptionalStringList(availableToolNames);\n if (!availableOrder?.length) return toolNames;\n const toolNameSet = new Set(toolNames);\n const ordered = availableOrder.filter((toolName) => toolNameSet.has(toolName));\n return uniqueStrings([\n ...ordered,\n ...toolNames.filter((toolName) => !ordered.includes(toolName)),\n ]);\n}\n\nexport function buildAssistantWorkflowToolSelectionAuthority(\n input: AssistantWorkflowToolSelectionAuthorityInput,\n): AssistantWorkflowToolSelectionAuthority {\n const selectedToolNames = uniqueStrings(input.selectedToolNames);\n const workflowSuggestedToolNames = uniqueStrings(input.workflowSuggestedToolNames ?? []);\n const workflowSelectionCandidateToolNames = uniqueStrings(input.workflowSelectionCandidateToolNames ?? []);\n const workflowStatus = normalizeNullableString(input.workflowStatus);\n const comparableWorkflowToolNames = workflowSelectionCandidateToolNames.length > 0\n ? workflowSelectionCandidateToolNames\n : workflowSuggestedToolNames;\n\n if (!input.workflowAvailable) {\n return {\n source: \"legacy-pruner\",\n reason: \"workflow_unavailable\",\n selectedToolNames,\n workflowSuggestedToolNames,\n workflowStatus: null,\n };\n }\n\n if (workflowStatus === \"blocked\" || workflowStatus === \"needs-clarification\") {\n return {\n source: \"legacy-pruner\",\n reason: \"workflow_blocked\",\n selectedToolNames,\n workflowSuggestedToolNames,\n workflowStatus,\n };\n }\n\n if (input.workflowAuthorityEnabled && comparableWorkflowToolNames.length > 0) {\n return {\n source: \"workflow\",\n reason: sameStringSet(selectedToolNames, comparableWorkflowToolNames)\n ? \"workflow_equivalent\"\n : \"workflow_authority_enabled\",\n selectedToolNames: comparableWorkflowToolNames,\n workflowSuggestedToolNames,\n workflowStatus,\n };\n }\n\n if (comparableWorkflowToolNames.length > 0 && sameStringSet(selectedToolNames, comparableWorkflowToolNames)) {\n return {\n source: \"workflow\",\n reason: \"workflow_equivalent\",\n selectedToolNames: comparableWorkflowToolNames,\n workflowSuggestedToolNames,\n workflowStatus,\n };\n }\n\n return {\n source: \"legacy-pruner\",\n reason: \"workflow_differs\",\n selectedToolNames,\n workflowSuggestedToolNames,\n workflowStatus,\n };\n}\n\nexport function buildAssistantWorkflowToolSelectionSegmentKey(input: {\n intentId: string | null;\n hop: number | null;\n selectedReason: string | null;\n}): string {\n return `${normalizeNullableString(input.intentId) ?? \"unknown\"}|hop:${input.hop ?? \"unknown\"}|${\n normalizeNullableString(input.selectedReason) ?? \"unknown\"\n }`;\n}\n\n/**\n * Exact active profile combinations are authority scopes. A single profile can\n * be safe in one combination and unsafe in another, so profile ids are sorted\n * and retained together with the intent.\n */\nexport function buildAssistantWorkflowToolSelectionProfileKey(input: {\n intentId: string | null;\n profileIds: readonly unknown[] | null | undefined;\n}): string | null {\n const intentId = normalizeNullableString(input.intentId);\n const profileIds = uniqueStrings(input.profileIds ?? []).sort((left, right) => left.localeCompare(right));\n if (!intentId || !profileIds.length) return null;\n return `${intentId}|profiles:${profileIds.join(\",\")}`;\n}\n\nfunction uniqueStrings(values: readonly unknown[]): string[] {\n const out: string[] = [];\n const seen = new Set<string>();\n for (const value of values) {\n if (typeof value !== \"string\") continue;\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 applyWorkflowAuthorityIntentGate(\n authority: AssistantWorkflowToolSelectionAuthority,\n input: AssistantWorkflowToolSelectionDecisionInput,\n comparisonPayload: Record<string, unknown> | null,\n): AssistantWorkflowToolSelectionAuthority {\n const enabledIntentIds = normalizeOptionalStringList(input.workflowAuthorityIntentIds);\n const enabledSegmentKeys = normalizeOptionalStringList(input.workflowAuthoritySegmentKeys);\n const enabledProfileKeys = normalizeOptionalStringList(input.workflowAuthorityProfileKeys);\n if (enabledIntentIds === null && enabledSegmentKeys === null && enabledProfileKeys === null) return authority;\n if (authority.source !== \"workflow\") return authority;\n const intentId = normalizeNullableString(input.classification?.intent);\n if (intentId && enabledIntentIds?.includes(intentId)) return authority;\n const segmentKey = buildAssistantWorkflowToolSelectionSegmentKey({\n intentId: intentId ?? \"unknown\",\n hop: input.hop ?? null,\n selectedReason: input.selectedReason ?? null,\n });\n if (enabledSegmentKeys?.includes(segmentKey)) return authority;\n const profileKey = comparisonPayload\n ? normalizeNullableString(comparisonPayload[\"workflowAuthorityProfileKey\"])\n : null;\n if (profileKey && enabledProfileKeys?.includes(profileKey)) return authority;\n\n return {\n ...authority,\n source: \"legacy-pruner\",\n reason: \"workflow_authority_not_enabled\",\n };\n}\n\nfunction isWorkflowAuthorityEnabled(\n input: AssistantWorkflowToolSelectionDecisionInput,\n comparisonPayload: Record<string, unknown>,\n): boolean {\n const enabledIntentIds = normalizeOptionalStringList(input.workflowAuthorityIntentIds);\n const enabledSegmentKeys = normalizeOptionalStringList(input.workflowAuthoritySegmentKeys);\n const enabledProfileKeys = normalizeOptionalStringList(input.workflowAuthorityProfileKeys);\n if (enabledIntentIds === null && enabledSegmentKeys === null && enabledProfileKeys === null) return false;\n const intentId = normalizeNullableString(input.classification?.intent);\n if (intentId && enabledIntentIds?.includes(intentId)) return true;\n const segmentKey = buildAssistantWorkflowToolSelectionSegmentKey({\n intentId: intentId ?? \"unknown\",\n hop: input.hop ?? null,\n selectedReason: input.selectedReason ?? null,\n });\n if (enabledSegmentKeys?.includes(segmentKey)) return true;\n const profileKey = normalizeNullableString(comparisonPayload[\"workflowAuthorityProfileKey\"]);\n return profileKey !== null && (enabledProfileKeys?.includes(profileKey) ?? false);\n}\n\nfunction normalizeOptionalStringList(values: readonly unknown[] | null | undefined): string[] | null {\n if (values === null || values === undefined) return null;\n return uniqueStrings(values);\n}\n\nfunction readWorkflowStatus(payload: Record<string, unknown>): string | null {\n const workflowRun = isRecord(payload[\"workflowRun\"]) ? payload[\"workflowRun\"] : null;\n return normalizeNullableString(workflowRun?.[\"status\"]);\n}\n\nfunction sameStringSet(left: readonly string[], right: readonly string[]): boolean {\n if (left.length !== right.length) return false;\n const rightSet = new Set(right);\n return left.every((item) => rightSet.has(item));\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n"]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type AssistantWorkflowSerializedToolSelectionDecisionBatch, type AssistantWorkflowSerializedToolSelectionDecisionBatchOptions, type AssistantWorkflowSerializedToolSelectionDecisionLinesParseResult } from "./tool-selection-json.js";
|
|
2
|
+
import type { AssistantWorkflowJsonValue } from "./run-report-json.js";
|
|
3
|
+
import { type AssistantWorkflowToolSelectionAuthorityAllowListProposal, type AssistantWorkflowToolSelectionEvaluationBatch, type AssistantWorkflowToolSelectionMigrationReport, type AssistantWorkflowToolSelectionMigrationReviewArtifact } from "./tool-selection-evaluation.js";
|
|
4
|
+
export type AssistantWorkflowToolSelectionReplayLinesOptions = AssistantWorkflowSerializedToolSelectionDecisionBatchOptions & {
|
|
5
|
+
minMigrationDecisionCount?: number | null;
|
|
6
|
+
currentAuthorityIntentIds?: readonly string[] | null;
|
|
7
|
+
currentAuthoritySegmentKeys?: readonly string[] | null;
|
|
8
|
+
migrationReviewPatchTargets?: readonly string[] | null;
|
|
9
|
+
migrationReviewRequiredTestIds?: readonly string[] | null;
|
|
10
|
+
migrationReviewTitle?: string | null;
|
|
11
|
+
};
|
|
12
|
+
export type AssistantWorkflowToolSelectionReplayLinesInput = {
|
|
13
|
+
decisionLines: string;
|
|
14
|
+
};
|
|
15
|
+
export type AssistantWorkflowToolSelectionReplayLinesResult = {
|
|
16
|
+
decisionParse: AssistantWorkflowSerializedToolSelectionDecisionLinesParseResult;
|
|
17
|
+
parseErrorCount: number;
|
|
18
|
+
batch: AssistantWorkflowSerializedToolSelectionDecisionBatch;
|
|
19
|
+
evaluation: AssistantWorkflowToolSelectionEvaluationBatch;
|
|
20
|
+
migration: AssistantWorkflowToolSelectionMigrationReport;
|
|
21
|
+
migrationProposal: AssistantWorkflowToolSelectionAuthorityAllowListProposal;
|
|
22
|
+
migrationReviewArtifact: AssistantWorkflowToolSelectionMigrationReviewArtifact;
|
|
23
|
+
};
|
|
24
|
+
export declare function runAssistantWorkflowToolSelectionReplayLines(input: AssistantWorkflowToolSelectionReplayLinesInput, options?: AssistantWorkflowToolSelectionReplayLinesOptions): AssistantWorkflowToolSelectionReplayLinesResult;
|
|
25
|
+
export declare function buildAssistantWorkflowToolSelectionReplayLinesTracePayload(result: AssistantWorkflowToolSelectionReplayLinesResult): Record<string, AssistantWorkflowJsonValue>;
|
|
26
|
+
//# sourceMappingURL=tool-selection-replay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-selection-replay.d.ts","sourceRoot":"","sources":["../src/tool-selection-replay.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,qDAAqD,EAE1D,KAAK,4DAA4D,EACjE,KAAK,gEAAgE,EACtE,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EASL,KAAK,wDAAwD,EAC7D,KAAK,6CAA6C,EAClD,KAAK,6CAA6C,EAClD,KAAK,qDAAqD,EAC3D,MAAM,gCAAgC,CAAC;AAExC,MAAM,MAAM,gDAAgD,GAC1D,4DAA4D,GAAG;IAC7D,yBAAyB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,yBAAyB,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IACrD,2BAA2B,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IACvD,2BAA2B,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IACvD,8BAA8B,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IAC1D,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC,CAAC;AAEJ,MAAM,MAAM,8CAA8C,GAAG;IAC3D,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,+CAA+C,GAAG;IAC5D,aAAa,EAAE,gEAAgE,CAAC;IAChF,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,qDAAqD,CAAC;IAC7D,UAAU,EAAE,6CAA6C,CAAC;IAC1D,SAAS,EAAE,6CAA6C,CAAC;IACzD,iBAAiB,EAAE,wDAAwD,CAAC;IAC5E,uBAAuB,EAAE,qDAAqD,CAAC;CAChF,CAAC;AAEF,wBAAgB,4CAA4C,CAC1D,KAAK,EAAE,8CAA8C,EACrD,OAAO,GAAE,gDAAqD,GAC7D,+CAA+C,CA6CjD;AAED,wBAAgB,0DAA0D,CACxE,MAAM,EAAE,+CAA+C,GACtD,MAAM,CAAC,MAAM,EAAE,0BAA0B,CAAC,CA6C5C"}
|