@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,73 @@
|
|
|
1
|
+
import type { AssistantWorkflowDefinition } from "./definition.js";
|
|
2
|
+
import { type AssistantWorkflowDefinitionDiff } from "./definition-diff.js";
|
|
3
|
+
import type { AssistantWorkflowTraceReport, AssistantWorkflowTraceReportSuggestion } from "./trace-report.js";
|
|
4
|
+
import type { AssistantWorkflowJsonValue } from "./run-report-json.js";
|
|
5
|
+
export type AssistantWorkflowDefinitionTuningAction = "add_intent_tool_hint" | "add_direct_route_strategy" | "register_tool_capability" | "review_tool_selection_policy" | "review_clarification_rule" | "review_direct_route_strategy" | "debug_runtime_error" | "promote_eval_case" | "review_quality_signal" | "review_memory_patch_mapping";
|
|
6
|
+
export type AssistantWorkflowDefinitionTuningPatchPreview = {
|
|
7
|
+
kind: "append_intent_tool_hint";
|
|
8
|
+
intentId: string;
|
|
9
|
+
toolName: string;
|
|
10
|
+
} | {
|
|
11
|
+
kind: "register_tool_capability";
|
|
12
|
+
toolName: string;
|
|
13
|
+
} | {
|
|
14
|
+
kind: "append_direct_route_strategy";
|
|
15
|
+
routeId: string;
|
|
16
|
+
strategyId: string;
|
|
17
|
+
description: string;
|
|
18
|
+
} | {
|
|
19
|
+
kind: "none";
|
|
20
|
+
};
|
|
21
|
+
export type AssistantWorkflowDefinitionTuningSuggestion = {
|
|
22
|
+
id: string;
|
|
23
|
+
action: AssistantWorkflowDefinitionTuningAction;
|
|
24
|
+
severity: "info" | "warning";
|
|
25
|
+
intentId: string | null;
|
|
26
|
+
toolName: string | null;
|
|
27
|
+
signal: string | null;
|
|
28
|
+
count: number;
|
|
29
|
+
requestIds: string[];
|
|
30
|
+
sourceSuggestionIds: string[];
|
|
31
|
+
rationale: string;
|
|
32
|
+
suggestedAction: string;
|
|
33
|
+
patchPreview: AssistantWorkflowDefinitionTuningPatchPreview;
|
|
34
|
+
};
|
|
35
|
+
export type AssistantWorkflowDefinitionTuningReportOptions = {
|
|
36
|
+
minCount?: number;
|
|
37
|
+
includeLowConfidence?: boolean;
|
|
38
|
+
ignoredIntentIds?: readonly string[];
|
|
39
|
+
};
|
|
40
|
+
export type AssistantWorkflowDefinitionTuningReport = {
|
|
41
|
+
generatedAt: string;
|
|
42
|
+
workflowId: string;
|
|
43
|
+
workflowVersion: number;
|
|
44
|
+
sourceSuggestionCount: number;
|
|
45
|
+
suggestionCount: number;
|
|
46
|
+
applicableSuggestionCount: number;
|
|
47
|
+
skippedSuggestionCount: number;
|
|
48
|
+
suggestions: AssistantWorkflowDefinitionTuningSuggestion[];
|
|
49
|
+
};
|
|
50
|
+
export type AssistantWorkflowDefinitionTuningApplySkipReason = "not_selected" | "unsupported_patch" | "missing_intent" | "missing_direct_route" | "tool_hint_exists" | "direct_route_strategy_exists" | "intent_apply_limit";
|
|
51
|
+
export type AssistantWorkflowDefinitionTuningApplySkippedSuggestion = {
|
|
52
|
+
id: string;
|
|
53
|
+
reason: AssistantWorkflowDefinitionTuningApplySkipReason;
|
|
54
|
+
};
|
|
55
|
+
export type AssistantWorkflowDefinitionTuningApplyOptions = {
|
|
56
|
+
suggestionIds?: readonly string[];
|
|
57
|
+
bumpVersion?: boolean;
|
|
58
|
+
maxToolHintsPerIntent?: number;
|
|
59
|
+
};
|
|
60
|
+
export type AssistantWorkflowDefinitionTuningApplyResult = {
|
|
61
|
+
changed: boolean;
|
|
62
|
+
appliedCount: number;
|
|
63
|
+
skippedCount: number;
|
|
64
|
+
appliedSuggestionIds: string[];
|
|
65
|
+
skippedSuggestions: AssistantWorkflowDefinitionTuningApplySkippedSuggestion[];
|
|
66
|
+
diff: AssistantWorkflowDefinitionDiff;
|
|
67
|
+
definition: AssistantWorkflowDefinition;
|
|
68
|
+
};
|
|
69
|
+
export declare function buildAssistantWorkflowDefinitionTuningReport(workflow: AssistantWorkflowDefinition, traceReport: AssistantWorkflowTraceReport, options?: AssistantWorkflowDefinitionTuningReportOptions): AssistantWorkflowDefinitionTuningReport;
|
|
70
|
+
export declare function buildAssistantWorkflowDefinitionTuningReportFromSuggestions(workflow: AssistantWorkflowDefinition, traceSuggestions: readonly AssistantWorkflowTraceReportSuggestion[], options?: AssistantWorkflowDefinitionTuningReportOptions): AssistantWorkflowDefinitionTuningReport;
|
|
71
|
+
export declare function applyAssistantWorkflowDefinitionTuningSuggestions(workflow: AssistantWorkflowDefinition, suggestions: readonly AssistantWorkflowDefinitionTuningSuggestion[], options?: AssistantWorkflowDefinitionTuningApplyOptions): AssistantWorkflowDefinitionTuningApplyResult;
|
|
72
|
+
export declare function buildAssistantWorkflowDefinitionTuningApplyTracePayload(result: AssistantWorkflowDefinitionTuningApplyResult): Record<string, AssistantWorkflowJsonValue>;
|
|
73
|
+
//# sourceMappingURL=definition-tuning.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definition-tuning.d.ts","sourceRoot":"","sources":["../src/definition-tuning.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,426 @@
|
|
|
1
|
+
import { defineAssistantWorkflow } from "./definition.js";
|
|
2
|
+
import { buildAssistantWorkflowDefinitionDiff, buildAssistantWorkflowDefinitionDiffTracePayload, } from "./definition-diff.js";
|
|
3
|
+
export function buildAssistantWorkflowDefinitionTuningReport(workflow, traceReport, options = {}) {
|
|
4
|
+
return buildAssistantWorkflowDefinitionTuningReportFromSuggestions(workflow, traceReport.suggestions, options);
|
|
5
|
+
}
|
|
6
|
+
export function buildAssistantWorkflowDefinitionTuningReportFromSuggestions(workflow, traceSuggestions, options = {}) {
|
|
7
|
+
const minCount = clampPositiveInteger(options.minCount, 1);
|
|
8
|
+
const includeLowConfidence = options.includeLowConfidence === true;
|
|
9
|
+
const ignoredIntentIds = new Set(options.ignoredIntentIds ?? ["fallback", "other", "unknown"]);
|
|
10
|
+
const builder = new DefinitionTuningSuggestionBuilder(workflow);
|
|
11
|
+
for (const suggestion of traceSuggestions) {
|
|
12
|
+
if (suggestion.count < minCount)
|
|
13
|
+
continue;
|
|
14
|
+
const tuningSuggestion = mapTraceSuggestionToDefinitionSuggestion(workflow, suggestion, includeLowConfidence, ignoredIntentIds);
|
|
15
|
+
if (tuningSuggestion)
|
|
16
|
+
builder.add(tuningSuggestion);
|
|
17
|
+
}
|
|
18
|
+
const suggestions = builder.toSuggestions();
|
|
19
|
+
return {
|
|
20
|
+
generatedAt: new Date().toISOString(),
|
|
21
|
+
workflowId: workflow.id,
|
|
22
|
+
workflowVersion: workflow.version,
|
|
23
|
+
sourceSuggestionCount: traceSuggestions.length,
|
|
24
|
+
suggestionCount: suggestions.length,
|
|
25
|
+
applicableSuggestionCount: suggestions.filter((suggestion) => suggestion.patchPreview.kind !== "none").length,
|
|
26
|
+
skippedSuggestionCount: traceSuggestions.length - suggestions.length,
|
|
27
|
+
suggestions,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export function applyAssistantWorkflowDefinitionTuningSuggestions(workflow, suggestions, options = {}) {
|
|
31
|
+
const selectedIds = options.suggestionIds ? new Set(options.suggestionIds) : null;
|
|
32
|
+
const maxToolHintsPerIntent = normalizeOptionalPositiveInteger(options.maxToolHintsPerIntent);
|
|
33
|
+
const appliedSuggestionIds = [];
|
|
34
|
+
const skippedSuggestions = [];
|
|
35
|
+
const toolHintsByIntent = new Map();
|
|
36
|
+
const strategiesByDirectRoute = new Map();
|
|
37
|
+
for (const suggestion of suggestions) {
|
|
38
|
+
if (selectedIds && !selectedIds.has(suggestion.id)) {
|
|
39
|
+
skippedSuggestions.push({ id: suggestion.id, reason: "not_selected" });
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
if (suggestion.patchPreview.kind === "append_intent_tool_hint") {
|
|
43
|
+
const intent = findIntent(workflow, suggestion.patchPreview.intentId);
|
|
44
|
+
if (!intent) {
|
|
45
|
+
skippedSuggestions.push({ id: suggestion.id, reason: "missing_intent" });
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
if (intentHasToolHint(intent, suggestion.patchPreview.toolName)) {
|
|
49
|
+
skippedSuggestions.push({ id: suggestion.id, reason: "tool_hint_exists" });
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
const pendingHints = toolHintsByIntent.get(intent.id) ?? [];
|
|
53
|
+
if (pendingHints.includes(suggestion.patchPreview.toolName)) {
|
|
54
|
+
skippedSuggestions.push({ id: suggestion.id, reason: "tool_hint_exists" });
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
if (maxToolHintsPerIntent !== null && pendingHints.length >= maxToolHintsPerIntent) {
|
|
58
|
+
skippedSuggestions.push({ id: suggestion.id, reason: "intent_apply_limit" });
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
pendingHints.push(suggestion.patchPreview.toolName);
|
|
62
|
+
toolHintsByIntent.set(intent.id, pendingHints);
|
|
63
|
+
appliedSuggestionIds.push(suggestion.id);
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
if (suggestion.patchPreview.kind === "append_direct_route_strategy") {
|
|
67
|
+
const patchPreview = suggestion.patchPreview;
|
|
68
|
+
const directRoute = findDirectRoute(workflow, patchPreview.routeId);
|
|
69
|
+
if (!directRoute) {
|
|
70
|
+
skippedSuggestions.push({ id: suggestion.id, reason: "missing_direct_route" });
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (directRouteHasStrategy(directRoute, patchPreview.strategyId)) {
|
|
74
|
+
skippedSuggestions.push({ id: suggestion.id, reason: "direct_route_strategy_exists" });
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
const pendingStrategies = strategiesByDirectRoute.get(directRoute.id) ?? [];
|
|
78
|
+
if (pendingStrategies.some((strategy) => strategy.id === patchPreview.strategyId)) {
|
|
79
|
+
skippedSuggestions.push({ id: suggestion.id, reason: "direct_route_strategy_exists" });
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
pendingStrategies.push({
|
|
83
|
+
id: patchPreview.strategyId,
|
|
84
|
+
description: patchPreview.description,
|
|
85
|
+
});
|
|
86
|
+
strategiesByDirectRoute.set(directRoute.id, pendingStrategies);
|
|
87
|
+
appliedSuggestionIds.push(suggestion.id);
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
{
|
|
91
|
+
skippedSuggestions.push({ id: suggestion.id, reason: "unsupported_patch" });
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (appliedSuggestionIds.length === 0) {
|
|
96
|
+
return {
|
|
97
|
+
changed: false,
|
|
98
|
+
appliedCount: 0,
|
|
99
|
+
skippedCount: skippedSuggestions.length,
|
|
100
|
+
appliedSuggestionIds,
|
|
101
|
+
skippedSuggestions,
|
|
102
|
+
diff: buildAssistantWorkflowDefinitionDiff(workflow, workflow),
|
|
103
|
+
definition: workflow,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
const directRoutes = workflow.directRoutes?.map((directRoute) => {
|
|
107
|
+
const appendedStrategies = strategiesByDirectRoute.get(directRoute.id);
|
|
108
|
+
if (!appendedStrategies?.length)
|
|
109
|
+
return directRoute;
|
|
110
|
+
return {
|
|
111
|
+
...directRoute,
|
|
112
|
+
strategies: [
|
|
113
|
+
...(directRoute.strategies ?? []),
|
|
114
|
+
...appendedStrategies,
|
|
115
|
+
],
|
|
116
|
+
};
|
|
117
|
+
});
|
|
118
|
+
const definition = defineAssistantWorkflow({
|
|
119
|
+
...workflow,
|
|
120
|
+
version: options.bumpVersion === false ? workflow.version : workflow.version + 1,
|
|
121
|
+
intents: workflow.intents.map((intent) => {
|
|
122
|
+
const appendedHints = toolHintsByIntent.get(intent.id);
|
|
123
|
+
if (!appendedHints?.length)
|
|
124
|
+
return intent;
|
|
125
|
+
return {
|
|
126
|
+
...intent,
|
|
127
|
+
toolHints: uniqueStrings([
|
|
128
|
+
...(intent.toolHints ?? []),
|
|
129
|
+
...appendedHints,
|
|
130
|
+
]),
|
|
131
|
+
};
|
|
132
|
+
}),
|
|
133
|
+
...(directRoutes ? { directRoutes } : {}),
|
|
134
|
+
});
|
|
135
|
+
return {
|
|
136
|
+
changed: true,
|
|
137
|
+
appliedCount: appliedSuggestionIds.length,
|
|
138
|
+
skippedCount: skippedSuggestions.length,
|
|
139
|
+
appliedSuggestionIds,
|
|
140
|
+
skippedSuggestions,
|
|
141
|
+
diff: buildAssistantWorkflowDefinitionDiff(workflow, definition),
|
|
142
|
+
definition,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
export function buildAssistantWorkflowDefinitionTuningApplyTracePayload(result) {
|
|
146
|
+
return {
|
|
147
|
+
changed: result.changed,
|
|
148
|
+
appliedCount: result.appliedCount,
|
|
149
|
+
skippedCount: result.skippedCount,
|
|
150
|
+
appliedSuggestionIds: result.appliedSuggestionIds,
|
|
151
|
+
skippedSuggestions: result.skippedSuggestions.map((suggestion) => ({
|
|
152
|
+
id: suggestion.id,
|
|
153
|
+
reason: suggestion.reason,
|
|
154
|
+
})),
|
|
155
|
+
definition: {
|
|
156
|
+
id: result.definition.id,
|
|
157
|
+
version: result.definition.version,
|
|
158
|
+
intentCount: result.definition.intents.length,
|
|
159
|
+
toolCapabilityCount: result.definition.tools?.length ?? 0,
|
|
160
|
+
planningStepCount: result.definition.planningSteps?.length ?? 0,
|
|
161
|
+
},
|
|
162
|
+
diff: buildAssistantWorkflowDefinitionDiffTracePayload(result.diff),
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
function mapTraceSuggestionToDefinitionSuggestion(workflow, suggestion, includeLowConfidence, ignoredIntentIds) {
|
|
166
|
+
const intent = findIntent(workflow, suggestion.intent);
|
|
167
|
+
const tool = findTool(workflow, suggestion.tool);
|
|
168
|
+
const ignoredIntent = suggestion.intent ? ignoredIntentIds.has(suggestion.intent) : false;
|
|
169
|
+
switch (suggestion.kind) {
|
|
170
|
+
case "review_unmodeled_selected_tool":
|
|
171
|
+
case "review_classifier_extra_tool": {
|
|
172
|
+
if (!suggestion.intent || !suggestion.tool)
|
|
173
|
+
return null;
|
|
174
|
+
if (!intent)
|
|
175
|
+
return reviewOnlySuggestion(suggestion, "review_tool_selection_policy");
|
|
176
|
+
if (ignoredIntent)
|
|
177
|
+
return reviewOnlySuggestion(suggestion, "review_tool_selection_policy");
|
|
178
|
+
if (!tool)
|
|
179
|
+
return registerToolSuggestion(suggestion);
|
|
180
|
+
if (intentHasToolHint(intent, suggestion.tool)) {
|
|
181
|
+
return includeLowConfidence
|
|
182
|
+
? reviewOnlySuggestion(suggestion, "review_tool_selection_policy")
|
|
183
|
+
: null;
|
|
184
|
+
}
|
|
185
|
+
if (tool.requiresConfirmation || tool.effect === "write" || tool.sideEffectRisk === "high") {
|
|
186
|
+
return reviewOnlySuggestion(suggestion, "review_tool_selection_policy");
|
|
187
|
+
}
|
|
188
|
+
return {
|
|
189
|
+
id: buildDefinitionTuningId("add_intent_tool_hint", suggestion.intent, suggestion.tool),
|
|
190
|
+
action: "add_intent_tool_hint",
|
|
191
|
+
severity: suggestion.severity,
|
|
192
|
+
intentId: suggestion.intent,
|
|
193
|
+
toolName: suggestion.tool,
|
|
194
|
+
signal: suggestion.signal,
|
|
195
|
+
count: suggestion.count,
|
|
196
|
+
requestIds: suggestion.requestIds,
|
|
197
|
+
sourceSuggestionIds: [suggestion.id],
|
|
198
|
+
rationale: `Trace review repeatedly selected ${suggestion.tool} for ${suggestion.intent}, but the workflow intent does not hint that tool.`,
|
|
199
|
+
suggestedAction: "Add the tool as an intent toolHint after confirming it is safe for this intent.",
|
|
200
|
+
patchPreview: {
|
|
201
|
+
kind: "append_intent_tool_hint",
|
|
202
|
+
intentId: suggestion.intent,
|
|
203
|
+
toolName: suggestion.tool,
|
|
204
|
+
},
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
case "review_missing_required_tool":
|
|
208
|
+
if (!suggestion.tool)
|
|
209
|
+
return null;
|
|
210
|
+
if (!tool)
|
|
211
|
+
return registerToolSuggestion(suggestion);
|
|
212
|
+
return reviewOnlySuggestion(suggestion, "review_tool_selection_policy");
|
|
213
|
+
case "review_workflow_tool_selection_gap":
|
|
214
|
+
return includeLowConfidence
|
|
215
|
+
? reviewOnlySuggestion(suggestion, "review_tool_selection_policy")
|
|
216
|
+
: null;
|
|
217
|
+
case "review_clarification_policy":
|
|
218
|
+
return reviewOnlySuggestion(suggestion, "review_clarification_rule");
|
|
219
|
+
case "review_memory_patch_equivalence":
|
|
220
|
+
return reviewOnlySuggestion(suggestion, "review_memory_patch_mapping");
|
|
221
|
+
case "review_direct_route_strategy":
|
|
222
|
+
return directRouteStrategySuggestion(workflow, suggestion);
|
|
223
|
+
case "review_trace_error":
|
|
224
|
+
return reviewOnlySuggestion(suggestion, "debug_runtime_error");
|
|
225
|
+
case "review_quality_signal":
|
|
226
|
+
return reviewOnlySuggestion(suggestion, "review_quality_signal");
|
|
227
|
+
case "promote_bad_feedback_eval":
|
|
228
|
+
return reviewOnlySuggestion(suggestion, "promote_eval_case");
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
function directRouteStrategySuggestion(workflow, suggestion) {
|
|
232
|
+
const parsed = parseDirectRouteStrategySignal(suggestion.signal);
|
|
233
|
+
const route = findDirectRoute(workflow, suggestion.intent) ??
|
|
234
|
+
findDirectRouteByObservedRoute(workflow, parsed?.route ?? null);
|
|
235
|
+
if (!route || !parsed || directRouteHasStrategy(route, parsed.strategy)) {
|
|
236
|
+
return reviewOnlySuggestion(suggestion, "review_direct_route_strategy");
|
|
237
|
+
}
|
|
238
|
+
return {
|
|
239
|
+
id: buildDefinitionTuningId("add_direct_route_strategy", route.id, parsed.strategy),
|
|
240
|
+
action: "add_direct_route_strategy",
|
|
241
|
+
severity: suggestion.severity,
|
|
242
|
+
intentId: route.id,
|
|
243
|
+
toolName: null,
|
|
244
|
+
signal: suggestion.signal,
|
|
245
|
+
count: suggestion.count,
|
|
246
|
+
requestIds: suggestion.requestIds,
|
|
247
|
+
sourceSuggestionIds: [suggestion.id],
|
|
248
|
+
rationale: `Trace review observed runtime strategy ${parsed.strategy} for direct route ${route.id}, but the workflow route does not declare it.`,
|
|
249
|
+
suggestedAction: "Add the observed strategy as direct-route metadata after confirming it names a stable runtime branch.",
|
|
250
|
+
patchPreview: {
|
|
251
|
+
kind: "append_direct_route_strategy",
|
|
252
|
+
routeId: route.id,
|
|
253
|
+
strategyId: parsed.strategy,
|
|
254
|
+
description: `Observed runtime strategy ${parsed.strategy} for direct route ${route.id}.`,
|
|
255
|
+
},
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
function registerToolSuggestion(suggestion) {
|
|
259
|
+
const toolName = suggestion.tool ?? "unknown";
|
|
260
|
+
return {
|
|
261
|
+
id: buildDefinitionTuningId("register_tool_capability", suggestion.intent, toolName),
|
|
262
|
+
action: "register_tool_capability",
|
|
263
|
+
severity: "warning",
|
|
264
|
+
intentId: suggestion.intent,
|
|
265
|
+
toolName,
|
|
266
|
+
signal: suggestion.signal,
|
|
267
|
+
count: suggestion.count,
|
|
268
|
+
requestIds: suggestion.requestIds,
|
|
269
|
+
sourceSuggestionIds: [suggestion.id],
|
|
270
|
+
rationale: `Trace review referenced ${toolName}, but the workflow package does not define that tool capability.`,
|
|
271
|
+
suggestedAction: "Register the tool capability/binding or remove the stale tool reference from the runtime path.",
|
|
272
|
+
patchPreview: {
|
|
273
|
+
kind: "register_tool_capability",
|
|
274
|
+
toolName,
|
|
275
|
+
},
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
function reviewOnlySuggestion(suggestion, action) {
|
|
279
|
+
return {
|
|
280
|
+
id: buildDefinitionTuningId(action, suggestion.intent, suggestion.tool ?? suggestion.signal ?? "all"),
|
|
281
|
+
action,
|
|
282
|
+
severity: suggestion.severity,
|
|
283
|
+
intentId: suggestion.intent,
|
|
284
|
+
toolName: suggestion.tool,
|
|
285
|
+
signal: suggestion.signal,
|
|
286
|
+
count: suggestion.count,
|
|
287
|
+
requestIds: suggestion.requestIds,
|
|
288
|
+
sourceSuggestionIds: [suggestion.id],
|
|
289
|
+
rationale: suggestion.rationale,
|
|
290
|
+
suggestedAction: suggestion.suggestedAction,
|
|
291
|
+
patchPreview: { kind: "none" },
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
class DefinitionTuningSuggestionBuilder {
|
|
295
|
+
workflow;
|
|
296
|
+
suggestions = new Map();
|
|
297
|
+
constructor(workflow) {
|
|
298
|
+
this.workflow = workflow;
|
|
299
|
+
}
|
|
300
|
+
add(input) {
|
|
301
|
+
const existing = this.suggestions.get(input.id);
|
|
302
|
+
if (existing) {
|
|
303
|
+
existing.count += input.count;
|
|
304
|
+
existing.requestIds = mergeLimitedStrings(existing.requestIds, input.requestIds);
|
|
305
|
+
existing.sourceSuggestionIds = mergeLimitedStrings(existing.sourceSuggestionIds, input.sourceSuggestionIds);
|
|
306
|
+
if (input.severity === "warning")
|
|
307
|
+
existing.severity = "warning";
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
this.suggestions.set(input.id, {
|
|
311
|
+
id: input.id,
|
|
312
|
+
action: input.action,
|
|
313
|
+
severity: input.severity,
|
|
314
|
+
intentId: input.intentId,
|
|
315
|
+
toolName: input.toolName,
|
|
316
|
+
signal: input.signal,
|
|
317
|
+
count: input.count,
|
|
318
|
+
requestIds: [...input.requestIds],
|
|
319
|
+
sourceSuggestionIds: [...input.sourceSuggestionIds],
|
|
320
|
+
rationale: input.rationale,
|
|
321
|
+
suggestedAction: input.suggestedAction,
|
|
322
|
+
patchPreview: input.patchPreview,
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
toSuggestions() {
|
|
326
|
+
return [...this.suggestions.values()]
|
|
327
|
+
.filter((suggestion) => !isNoopToolHintSuggestion(this.workflow, suggestion))
|
|
328
|
+
.sort((left, right) => {
|
|
329
|
+
if (left.severity !== right.severity)
|
|
330
|
+
return left.severity === "warning" ? -1 : 1;
|
|
331
|
+
if (right.count !== left.count)
|
|
332
|
+
return right.count - left.count;
|
|
333
|
+
return left.id.localeCompare(right.id);
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
function isNoopToolHintSuggestion(workflow, suggestion) {
|
|
338
|
+
if (suggestion.patchPreview.kind === "append_intent_tool_hint") {
|
|
339
|
+
const intent = findIntent(workflow, suggestion.patchPreview.intentId);
|
|
340
|
+
return intentHasToolHint(intent, suggestion.patchPreview.toolName);
|
|
341
|
+
}
|
|
342
|
+
if (suggestion.patchPreview.kind === "append_direct_route_strategy") {
|
|
343
|
+
const directRoute = findDirectRoute(workflow, suggestion.patchPreview.routeId);
|
|
344
|
+
return directRouteHasStrategy(directRoute, suggestion.patchPreview.strategyId);
|
|
345
|
+
}
|
|
346
|
+
return false;
|
|
347
|
+
}
|
|
348
|
+
function findIntent(workflow, intentId) {
|
|
349
|
+
if (!intentId)
|
|
350
|
+
return null;
|
|
351
|
+
return workflow.intents.find((intent) => intent.id === intentId) ?? null;
|
|
352
|
+
}
|
|
353
|
+
function findTool(workflow, toolName) {
|
|
354
|
+
if (!toolName)
|
|
355
|
+
return null;
|
|
356
|
+
return workflow.tools?.find((tool) => tool.name === toolName) ?? null;
|
|
357
|
+
}
|
|
358
|
+
function findDirectRoute(workflow, routeId) {
|
|
359
|
+
if (!routeId)
|
|
360
|
+
return null;
|
|
361
|
+
return workflow.directRoutes?.find((route) => route.id === routeId) ?? null;
|
|
362
|
+
}
|
|
363
|
+
function findDirectRouteByObservedRoute(workflow, observedRoute) {
|
|
364
|
+
if (!observedRoute)
|
|
365
|
+
return null;
|
|
366
|
+
return workflow.directRoutes?.find((route) => route.id === observedRoute || route.outcomeRoute === observedRoute) ?? null;
|
|
367
|
+
}
|
|
368
|
+
function directRouteHasStrategy(directRoute, strategyId) {
|
|
369
|
+
if (!directRoute)
|
|
370
|
+
return false;
|
|
371
|
+
return (directRoute.strategies ?? []).some((strategy) => strategy.id === strategyId);
|
|
372
|
+
}
|
|
373
|
+
function parseDirectRouteStrategySignal(signal) {
|
|
374
|
+
if (!signal)
|
|
375
|
+
return null;
|
|
376
|
+
const separatorIndex = signal.indexOf(":");
|
|
377
|
+
if (separatorIndex <= 0 || separatorIndex >= signal.length - 1)
|
|
378
|
+
return null;
|
|
379
|
+
const route = signal.slice(0, separatorIndex).trim();
|
|
380
|
+
const strategy = signal.slice(separatorIndex + 1).trim();
|
|
381
|
+
if (!route || !strategy)
|
|
382
|
+
return null;
|
|
383
|
+
return { route, strategy };
|
|
384
|
+
}
|
|
385
|
+
function intentHasToolHint(intent, toolName) {
|
|
386
|
+
if (!intent)
|
|
387
|
+
return false;
|
|
388
|
+
return (intent.toolHints ?? []).includes(toolName) ||
|
|
389
|
+
(intent.requiredToolHints ?? []).includes(toolName);
|
|
390
|
+
}
|
|
391
|
+
function mergeLimitedStrings(left, right, limit = 10) {
|
|
392
|
+
const out = [];
|
|
393
|
+
for (const value of [...left, ...right]) {
|
|
394
|
+
if (!value.length || out.includes(value))
|
|
395
|
+
continue;
|
|
396
|
+
out.push(value);
|
|
397
|
+
if (out.length >= limit)
|
|
398
|
+
break;
|
|
399
|
+
}
|
|
400
|
+
return out;
|
|
401
|
+
}
|
|
402
|
+
function uniqueStrings(values) {
|
|
403
|
+
const out = [];
|
|
404
|
+
for (const value of values) {
|
|
405
|
+
if (!value.length || out.includes(value))
|
|
406
|
+
continue;
|
|
407
|
+
out.push(value);
|
|
408
|
+
}
|
|
409
|
+
return out;
|
|
410
|
+
}
|
|
411
|
+
function buildDefinitionTuningId(action, intent, target) {
|
|
412
|
+
return [action, intent ?? "unknown", target]
|
|
413
|
+
.map((part) => part.replace(/[^a-zA-Z0-9_.-]+/g, "_").toLowerCase())
|
|
414
|
+
.join(":");
|
|
415
|
+
}
|
|
416
|
+
function clampPositiveInteger(value, fallback) {
|
|
417
|
+
if (typeof value !== "number" || !Number.isFinite(value))
|
|
418
|
+
return fallback;
|
|
419
|
+
return Math.max(1, Math.floor(value));
|
|
420
|
+
}
|
|
421
|
+
function normalizeOptionalPositiveInteger(value) {
|
|
422
|
+
if (typeof value !== "number" || !Number.isFinite(value))
|
|
423
|
+
return null;
|
|
424
|
+
return Math.max(1, Math.floor(value));
|
|
425
|
+
}
|
|
426
|
+
//# sourceMappingURL=definition-tuning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definition-tuning.js","sourceRoot":"","sources":["../src/definition-tuning.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AssistantWorkflowDefinition,\n AssistantWorkflowDirectRouteDefinition,\n AssistantWorkflowIntentDefinition,\n AssistantWorkflowToolCapabilityDefinition,\n} from \"./definition.js\";\nimport { defineAssistantWorkflow } from \"./definition.js\";\nimport {\n buildAssistantWorkflowDefinitionDiff,\n buildAssistantWorkflowDefinitionDiffTracePayload,\n type AssistantWorkflowDefinitionDiff,\n} from \"./definition-diff.js\";\nimport type {\n AssistantWorkflowTraceReport,\n AssistantWorkflowTraceReportSuggestion,\n} from \"./trace-report.js\";\nimport type { AssistantWorkflowJsonValue } from \"./run-report-json.js\";\n\nexport type AssistantWorkflowDefinitionTuningAction =\n | \"add_intent_tool_hint\"\n | \"add_direct_route_strategy\"\n | \"register_tool_capability\"\n | \"review_tool_selection_policy\"\n | \"review_clarification_rule\"\n | \"review_direct_route_strategy\"\n | \"debug_runtime_error\"\n | \"promote_eval_case\"\n | \"review_quality_signal\"\n | \"review_memory_patch_mapping\";\n\nexport type AssistantWorkflowDefinitionTuningPatchPreview =\n | {\n kind: \"append_intent_tool_hint\";\n intentId: string;\n toolName: string;\n }\n | {\n kind: \"register_tool_capability\";\n toolName: string;\n }\n | {\n kind: \"append_direct_route_strategy\";\n routeId: string;\n strategyId: string;\n description: string;\n }\n | {\n kind: \"none\";\n };\n\nexport type AssistantWorkflowDefinitionTuningSuggestion = {\n id: string;\n action: AssistantWorkflowDefinitionTuningAction;\n severity: \"info\" | \"warning\";\n intentId: string | null;\n toolName: string | null;\n signal: string | null;\n count: number;\n requestIds: string[];\n sourceSuggestionIds: string[];\n rationale: string;\n suggestedAction: string;\n patchPreview: AssistantWorkflowDefinitionTuningPatchPreview;\n};\n\nexport type AssistantWorkflowDefinitionTuningReportOptions = {\n minCount?: number;\n includeLowConfidence?: boolean;\n ignoredIntentIds?: readonly string[];\n};\n\nexport type AssistantWorkflowDefinitionTuningReport = {\n generatedAt: string;\n workflowId: string;\n workflowVersion: number;\n sourceSuggestionCount: number;\n suggestionCount: number;\n applicableSuggestionCount: number;\n skippedSuggestionCount: number;\n suggestions: AssistantWorkflowDefinitionTuningSuggestion[];\n};\n\nexport type AssistantWorkflowDefinitionTuningApplySkipReason =\n | \"not_selected\"\n | \"unsupported_patch\"\n | \"missing_intent\"\n | \"missing_direct_route\"\n | \"tool_hint_exists\"\n | \"direct_route_strategy_exists\"\n | \"intent_apply_limit\";\n\nexport type AssistantWorkflowDefinitionTuningApplySkippedSuggestion = {\n id: string;\n reason: AssistantWorkflowDefinitionTuningApplySkipReason;\n};\n\nexport type AssistantWorkflowDefinitionTuningApplyOptions = {\n suggestionIds?: readonly string[];\n bumpVersion?: boolean;\n maxToolHintsPerIntent?: number;\n};\n\nexport type AssistantWorkflowDefinitionTuningApplyResult = {\n changed: boolean;\n appliedCount: number;\n skippedCount: number;\n appliedSuggestionIds: string[];\n skippedSuggestions: AssistantWorkflowDefinitionTuningApplySkippedSuggestion[];\n diff: AssistantWorkflowDefinitionDiff;\n definition: AssistantWorkflowDefinition;\n};\n\ntype SuggestionAccumulator = Omit<\n AssistantWorkflowDefinitionTuningSuggestion,\n \"count\" | \"requestIds\" | \"sourceSuggestionIds\"\n> & {\n count: number;\n requestIds: string[];\n sourceSuggestionIds: string[];\n};\n\nexport function buildAssistantWorkflowDefinitionTuningReport(\n workflow: AssistantWorkflowDefinition,\n traceReport: AssistantWorkflowTraceReport,\n options: AssistantWorkflowDefinitionTuningReportOptions = {},\n): AssistantWorkflowDefinitionTuningReport {\n return buildAssistantWorkflowDefinitionTuningReportFromSuggestions(\n workflow,\n traceReport.suggestions,\n options,\n );\n}\n\nexport function buildAssistantWorkflowDefinitionTuningReportFromSuggestions(\n workflow: AssistantWorkflowDefinition,\n traceSuggestions: readonly AssistantWorkflowTraceReportSuggestion[],\n options: AssistantWorkflowDefinitionTuningReportOptions = {},\n): AssistantWorkflowDefinitionTuningReport {\n const minCount = clampPositiveInteger(options.minCount, 1);\n const includeLowConfidence = options.includeLowConfidence === true;\n const ignoredIntentIds = new Set(options.ignoredIntentIds ?? [\"fallback\", \"other\", \"unknown\"]);\n const builder = new DefinitionTuningSuggestionBuilder(workflow);\n\n for (const suggestion of traceSuggestions) {\n if (suggestion.count < minCount) continue;\n const tuningSuggestion = mapTraceSuggestionToDefinitionSuggestion(\n workflow,\n suggestion,\n includeLowConfidence,\n ignoredIntentIds,\n );\n if (tuningSuggestion) builder.add(tuningSuggestion);\n }\n\n const suggestions = builder.toSuggestions();\n return {\n generatedAt: new Date().toISOString(),\n workflowId: workflow.id,\n workflowVersion: workflow.version,\n sourceSuggestionCount: traceSuggestions.length,\n suggestionCount: suggestions.length,\n applicableSuggestionCount: suggestions.filter((suggestion) => suggestion.patchPreview.kind !== \"none\").length,\n skippedSuggestionCount: traceSuggestions.length - suggestions.length,\n suggestions,\n };\n}\n\nexport function applyAssistantWorkflowDefinitionTuningSuggestions(\n workflow: AssistantWorkflowDefinition,\n suggestions: readonly AssistantWorkflowDefinitionTuningSuggestion[],\n options: AssistantWorkflowDefinitionTuningApplyOptions = {},\n): AssistantWorkflowDefinitionTuningApplyResult {\n const selectedIds = options.suggestionIds ? new Set(options.suggestionIds) : null;\n const maxToolHintsPerIntent = normalizeOptionalPositiveInteger(options.maxToolHintsPerIntent);\n const appliedSuggestionIds: string[] = [];\n const skippedSuggestions: AssistantWorkflowDefinitionTuningApplySkippedSuggestion[] = [];\n const toolHintsByIntent = new Map<string, string[]>();\n const strategiesByDirectRoute = new Map<string, Array<{ id: string; description: string }>>();\n\n for (const suggestion of suggestions) {\n if (selectedIds && !selectedIds.has(suggestion.id)) {\n skippedSuggestions.push({ id: suggestion.id, reason: \"not_selected\" });\n continue;\n }\n if (suggestion.patchPreview.kind === \"append_intent_tool_hint\") {\n const intent = findIntent(workflow, suggestion.patchPreview.intentId);\n if (!intent) {\n skippedSuggestions.push({ id: suggestion.id, reason: \"missing_intent\" });\n continue;\n }\n if (intentHasToolHint(intent, suggestion.patchPreview.toolName)) {\n skippedSuggestions.push({ id: suggestion.id, reason: \"tool_hint_exists\" });\n continue;\n }\n const pendingHints = toolHintsByIntent.get(intent.id) ?? [];\n if (pendingHints.includes(suggestion.patchPreview.toolName)) {\n skippedSuggestions.push({ id: suggestion.id, reason: \"tool_hint_exists\" });\n continue;\n }\n if (maxToolHintsPerIntent !== null && pendingHints.length >= maxToolHintsPerIntent) {\n skippedSuggestions.push({ id: suggestion.id, reason: \"intent_apply_limit\" });\n continue;\n }\n pendingHints.push(suggestion.patchPreview.toolName);\n toolHintsByIntent.set(intent.id, pendingHints);\n appliedSuggestionIds.push(suggestion.id);\n continue;\n }\n if (suggestion.patchPreview.kind === \"append_direct_route_strategy\") {\n const patchPreview = suggestion.patchPreview;\n const directRoute = findDirectRoute(workflow, patchPreview.routeId);\n if (!directRoute) {\n skippedSuggestions.push({ id: suggestion.id, reason: \"missing_direct_route\" });\n continue;\n }\n if (directRouteHasStrategy(directRoute, patchPreview.strategyId)) {\n skippedSuggestions.push({ id: suggestion.id, reason: \"direct_route_strategy_exists\" });\n continue;\n }\n const pendingStrategies = strategiesByDirectRoute.get(directRoute.id) ?? [];\n if (pendingStrategies.some((strategy) => strategy.id === patchPreview.strategyId)) {\n skippedSuggestions.push({ id: suggestion.id, reason: \"direct_route_strategy_exists\" });\n continue;\n }\n pendingStrategies.push({\n id: patchPreview.strategyId,\n description: patchPreview.description,\n });\n strategiesByDirectRoute.set(directRoute.id, pendingStrategies);\n appliedSuggestionIds.push(suggestion.id);\n continue;\n }\n {\n skippedSuggestions.push({ id: suggestion.id, reason: \"unsupported_patch\" });\n continue;\n }\n }\n\n if (appliedSuggestionIds.length === 0) {\n return {\n changed: false,\n appliedCount: 0,\n skippedCount: skippedSuggestions.length,\n appliedSuggestionIds,\n skippedSuggestions,\n diff: buildAssistantWorkflowDefinitionDiff(workflow, workflow),\n definition: workflow,\n };\n }\n\n const directRoutes = workflow.directRoutes?.map((directRoute) => {\n const appendedStrategies = strategiesByDirectRoute.get(directRoute.id);\n if (!appendedStrategies?.length) return directRoute;\n return {\n ...directRoute,\n strategies: [\n ...(directRoute.strategies ?? []),\n ...appendedStrategies,\n ],\n };\n });\n const definition = defineAssistantWorkflow({\n ...workflow,\n version: options.bumpVersion === false ? workflow.version : workflow.version + 1,\n intents: workflow.intents.map((intent) => {\n const appendedHints = toolHintsByIntent.get(intent.id);\n if (!appendedHints?.length) return intent;\n return {\n ...intent,\n toolHints: uniqueStrings([\n ...(intent.toolHints ?? []),\n ...appendedHints,\n ]),\n };\n }),\n ...(directRoutes ? { directRoutes } : {}),\n });\n\n return {\n changed: true,\n appliedCount: appliedSuggestionIds.length,\n skippedCount: skippedSuggestions.length,\n appliedSuggestionIds,\n skippedSuggestions,\n diff: buildAssistantWorkflowDefinitionDiff(workflow, definition),\n definition,\n };\n}\n\nexport function buildAssistantWorkflowDefinitionTuningApplyTracePayload(\n result: AssistantWorkflowDefinitionTuningApplyResult,\n): Record<string, AssistantWorkflowJsonValue> {\n return {\n changed: result.changed,\n appliedCount: result.appliedCount,\n skippedCount: result.skippedCount,\n appliedSuggestionIds: result.appliedSuggestionIds,\n skippedSuggestions: result.skippedSuggestions.map((suggestion) => ({\n id: suggestion.id,\n reason: suggestion.reason,\n })),\n definition: {\n id: result.definition.id,\n version: result.definition.version,\n intentCount: result.definition.intents.length,\n toolCapabilityCount: result.definition.tools?.length ?? 0,\n planningStepCount: result.definition.planningSteps?.length ?? 0,\n },\n diff: buildAssistantWorkflowDefinitionDiffTracePayload(result.diff),\n };\n}\n\nfunction mapTraceSuggestionToDefinitionSuggestion(\n workflow: AssistantWorkflowDefinition,\n suggestion: AssistantWorkflowTraceReportSuggestion,\n includeLowConfidence: boolean,\n ignoredIntentIds: ReadonlySet<string>,\n): AssistantWorkflowDefinitionTuningSuggestion | null {\n const intent = findIntent(workflow, suggestion.intent);\n const tool = findTool(workflow, suggestion.tool);\n const ignoredIntent = suggestion.intent ? ignoredIntentIds.has(suggestion.intent) : false;\n\n switch (suggestion.kind) {\n case \"review_unmodeled_selected_tool\":\n case \"review_classifier_extra_tool\": {\n if (!suggestion.intent || !suggestion.tool) return null;\n if (!intent) return reviewOnlySuggestion(suggestion, \"review_tool_selection_policy\");\n if (ignoredIntent) return reviewOnlySuggestion(suggestion, \"review_tool_selection_policy\");\n if (!tool) return registerToolSuggestion(suggestion);\n if (intentHasToolHint(intent, suggestion.tool)) {\n return includeLowConfidence\n ? reviewOnlySuggestion(suggestion, \"review_tool_selection_policy\")\n : null;\n }\n if (tool.requiresConfirmation || tool.effect === \"write\" || tool.sideEffectRisk === \"high\") {\n return reviewOnlySuggestion(suggestion, \"review_tool_selection_policy\");\n }\n return {\n id: buildDefinitionTuningId(\"add_intent_tool_hint\", suggestion.intent, suggestion.tool),\n action: \"add_intent_tool_hint\",\n severity: suggestion.severity,\n intentId: suggestion.intent,\n toolName: suggestion.tool,\n signal: suggestion.signal,\n count: suggestion.count,\n requestIds: suggestion.requestIds,\n sourceSuggestionIds: [suggestion.id],\n rationale: `Trace review repeatedly selected ${suggestion.tool} for ${suggestion.intent}, but the workflow intent does not hint that tool.`,\n suggestedAction: \"Add the tool as an intent toolHint after confirming it is safe for this intent.\",\n patchPreview: {\n kind: \"append_intent_tool_hint\",\n intentId: suggestion.intent,\n toolName: suggestion.tool,\n },\n };\n }\n case \"review_missing_required_tool\":\n if (!suggestion.tool) return null;\n if (!tool) return registerToolSuggestion(suggestion);\n return reviewOnlySuggestion(suggestion, \"review_tool_selection_policy\");\n case \"review_workflow_tool_selection_gap\":\n return includeLowConfidence\n ? reviewOnlySuggestion(suggestion, \"review_tool_selection_policy\")\n : null;\n case \"review_clarification_policy\":\n return reviewOnlySuggestion(suggestion, \"review_clarification_rule\");\n case \"review_memory_patch_equivalence\":\n return reviewOnlySuggestion(suggestion, \"review_memory_patch_mapping\");\n case \"review_direct_route_strategy\":\n return directRouteStrategySuggestion(workflow, suggestion);\n case \"review_trace_error\":\n return reviewOnlySuggestion(suggestion, \"debug_runtime_error\");\n case \"review_quality_signal\":\n return reviewOnlySuggestion(suggestion, \"review_quality_signal\");\n case \"promote_bad_feedback_eval\":\n return reviewOnlySuggestion(suggestion, \"promote_eval_case\");\n }\n}\n\nfunction directRouteStrategySuggestion(\n workflow: AssistantWorkflowDefinition,\n suggestion: AssistantWorkflowTraceReportSuggestion,\n): AssistantWorkflowDefinitionTuningSuggestion {\n const parsed = parseDirectRouteStrategySignal(suggestion.signal);\n const route = findDirectRoute(workflow, suggestion.intent) ??\n findDirectRouteByObservedRoute(workflow, parsed?.route ?? null);\n if (!route || !parsed || directRouteHasStrategy(route, parsed.strategy)) {\n return reviewOnlySuggestion(suggestion, \"review_direct_route_strategy\");\n }\n return {\n id: buildDefinitionTuningId(\"add_direct_route_strategy\", route.id, parsed.strategy),\n action: \"add_direct_route_strategy\",\n severity: suggestion.severity,\n intentId: route.id,\n toolName: null,\n signal: suggestion.signal,\n count: suggestion.count,\n requestIds: suggestion.requestIds,\n sourceSuggestionIds: [suggestion.id],\n rationale: `Trace review observed runtime strategy ${parsed.strategy} for direct route ${route.id}, but the workflow route does not declare it.`,\n suggestedAction: \"Add the observed strategy as direct-route metadata after confirming it names a stable runtime branch.\",\n patchPreview: {\n kind: \"append_direct_route_strategy\",\n routeId: route.id,\n strategyId: parsed.strategy,\n description: `Observed runtime strategy ${parsed.strategy} for direct route ${route.id}.`,\n },\n };\n}\n\nfunction registerToolSuggestion(\n suggestion: AssistantWorkflowTraceReportSuggestion,\n): AssistantWorkflowDefinitionTuningSuggestion {\n const toolName = suggestion.tool ?? \"unknown\";\n return {\n id: buildDefinitionTuningId(\"register_tool_capability\", suggestion.intent, toolName),\n action: \"register_tool_capability\",\n severity: \"warning\",\n intentId: suggestion.intent,\n toolName,\n signal: suggestion.signal,\n count: suggestion.count,\n requestIds: suggestion.requestIds,\n sourceSuggestionIds: [suggestion.id],\n rationale: `Trace review referenced ${toolName}, but the workflow package does not define that tool capability.`,\n suggestedAction: \"Register the tool capability/binding or remove the stale tool reference from the runtime path.\",\n patchPreview: {\n kind: \"register_tool_capability\",\n toolName,\n },\n };\n}\n\nfunction reviewOnlySuggestion(\n suggestion: AssistantWorkflowTraceReportSuggestion,\n action: AssistantWorkflowDefinitionTuningAction,\n): AssistantWorkflowDefinitionTuningSuggestion {\n return {\n id: buildDefinitionTuningId(action, suggestion.intent, suggestion.tool ?? suggestion.signal ?? \"all\"),\n action,\n severity: suggestion.severity,\n intentId: suggestion.intent,\n toolName: suggestion.tool,\n signal: suggestion.signal,\n count: suggestion.count,\n requestIds: suggestion.requestIds,\n sourceSuggestionIds: [suggestion.id],\n rationale: suggestion.rationale,\n suggestedAction: suggestion.suggestedAction,\n patchPreview: { kind: \"none\" },\n };\n}\n\nclass DefinitionTuningSuggestionBuilder {\n private readonly suggestions = new Map<string, SuggestionAccumulator>();\n\n constructor(private readonly workflow: AssistantWorkflowDefinition) {}\n\n add(input: AssistantWorkflowDefinitionTuningSuggestion): void {\n const existing = this.suggestions.get(input.id);\n if (existing) {\n existing.count += input.count;\n existing.requestIds = mergeLimitedStrings(existing.requestIds, input.requestIds);\n existing.sourceSuggestionIds = mergeLimitedStrings(existing.sourceSuggestionIds, input.sourceSuggestionIds);\n if (input.severity === \"warning\") existing.severity = \"warning\";\n return;\n }\n this.suggestions.set(input.id, {\n id: input.id,\n action: input.action,\n severity: input.severity,\n intentId: input.intentId,\n toolName: input.toolName,\n signal: input.signal,\n count: input.count,\n requestIds: [...input.requestIds],\n sourceSuggestionIds: [...input.sourceSuggestionIds],\n rationale: input.rationale,\n suggestedAction: input.suggestedAction,\n patchPreview: input.patchPreview,\n });\n }\n\n toSuggestions(): AssistantWorkflowDefinitionTuningSuggestion[] {\n return [...this.suggestions.values()]\n .filter((suggestion) => !isNoopToolHintSuggestion(this.workflow, suggestion))\n .sort((left, right) => {\n if (left.severity !== right.severity) return left.severity === \"warning\" ? -1 : 1;\n if (right.count !== left.count) return right.count - left.count;\n return left.id.localeCompare(right.id);\n });\n }\n}\n\nfunction isNoopToolHintSuggestion(\n workflow: AssistantWorkflowDefinition,\n suggestion: SuggestionAccumulator,\n): boolean {\n if (suggestion.patchPreview.kind === \"append_intent_tool_hint\") {\n const intent = findIntent(workflow, suggestion.patchPreview.intentId);\n return intentHasToolHint(intent, suggestion.patchPreview.toolName);\n }\n if (suggestion.patchPreview.kind === \"append_direct_route_strategy\") {\n const directRoute = findDirectRoute(workflow, suggestion.patchPreview.routeId);\n return directRouteHasStrategy(directRoute, suggestion.patchPreview.strategyId);\n }\n return false;\n}\n\nfunction findIntent(\n workflow: AssistantWorkflowDefinition,\n intentId: string | null,\n): AssistantWorkflowIntentDefinition | null {\n if (!intentId) return null;\n return workflow.intents.find((intent) => intent.id === intentId) ?? null;\n}\n\nfunction findTool(\n workflow: AssistantWorkflowDefinition,\n toolName: string | null,\n): AssistantWorkflowToolCapabilityDefinition | null {\n if (!toolName) return null;\n return workflow.tools?.find((tool) => tool.name === toolName) ?? null;\n}\n\nfunction findDirectRoute(\n workflow: AssistantWorkflowDefinition,\n routeId: string | null,\n): AssistantWorkflowDirectRouteDefinition | null {\n if (!routeId) return null;\n return workflow.directRoutes?.find((route) => route.id === routeId) ?? null;\n}\n\nfunction findDirectRouteByObservedRoute(\n workflow: AssistantWorkflowDefinition,\n observedRoute: string | null,\n): AssistantWorkflowDirectRouteDefinition | null {\n if (!observedRoute) return null;\n return workflow.directRoutes?.find((route) => route.id === observedRoute || route.outcomeRoute === observedRoute) ?? null;\n}\n\nfunction directRouteHasStrategy(\n directRoute: AssistantWorkflowDirectRouteDefinition | null,\n strategyId: string,\n): boolean {\n if (!directRoute) return false;\n return (directRoute.strategies ?? []).some((strategy) => strategy.id === strategyId);\n}\n\nfunction parseDirectRouteStrategySignal(signal: string | null): { route: string; strategy: string } | null {\n if (!signal) return null;\n const separatorIndex = signal.indexOf(\":\");\n if (separatorIndex <= 0 || separatorIndex >= signal.length - 1) return null;\n const route = signal.slice(0, separatorIndex).trim();\n const strategy = signal.slice(separatorIndex + 1).trim();\n if (!route || !strategy) return null;\n return { route, strategy };\n}\n\nfunction intentHasToolHint(\n intent: AssistantWorkflowIntentDefinition | null,\n toolName: string,\n): boolean {\n if (!intent) return false;\n return (intent.toolHints ?? []).includes(toolName) ||\n (intent.requiredToolHints ?? []).includes(toolName);\n}\n\nfunction mergeLimitedStrings(\n left: readonly string[],\n right: readonly string[],\n limit = 10,\n): string[] {\n const out: string[] = [];\n for (const value of [...left, ...right]) {\n if (!value.length || out.includes(value)) continue;\n out.push(value);\n if (out.length >= limit) break;\n }\n return out;\n}\n\nfunction uniqueStrings(values: readonly string[]): string[] {\n const out: string[] = [];\n for (const value of values) {\n if (!value.length || out.includes(value)) continue;\n out.push(value);\n }\n return out;\n}\n\nfunction buildDefinitionTuningId(\n action: AssistantWorkflowDefinitionTuningAction,\n intent: string | null,\n target: string,\n): string {\n return [action, intent ?? \"unknown\", target]\n .map((part) => part.replace(/[^a-zA-Z0-9_.-]+/g, \"_\").toLowerCase())\n .join(\":\");\n}\n\nfunction clampPositiveInteger(value: number | undefined, fallback: number): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return fallback;\n return Math.max(1, Math.floor(value));\n}\n\nfunction normalizeOptionalPositiveInteger(value: number | undefined): number | null {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return null;\n return Math.max(1, Math.floor(value));\n}\n"]}
|