pi-harness-runtime 1.1.49 → 1.1.71-3
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/CHANGELOG.md +30 -9
- package/README.md +119 -0
- package/harness/langchain/agents.d.ts +143 -0
- package/harness/langchain/agents.test.d.ts +2 -0
- package/harness/langchain/agents.test.ts +0 -1
- package/harness/langchain/agents.ts +196 -13
- package/harness/langchain/checkpointer.d.ts +48 -0
- package/harness/langchain/checkpointer.test.d.ts +8 -0
- package/harness/langchain/cron-cli.d.ts +12 -0
- package/harness/langchain/cron-cli.ts +169 -0
- package/harness/langchain/daemon.d.ts +161 -0
- package/harness/langchain/daemon.test.d.ts +11 -0
- package/harness/langchain/daemon.test.ts +62 -5
- package/harness/langchain/daemon.ts +231 -12
- package/harness/langchain/file-tools.d.ts +97 -0
- package/harness/langchain/file-tools.ts +29 -11
- package/harness/langchain/graph.d.ts +706 -0
- package/harness/langchain/graph.ts +184 -26
- package/harness/langchain/model-router.d.ts +63 -0
- package/harness/langchain/model-router.test.d.ts +2 -0
- package/harness/langchain/model-router.test.ts +191 -0
- package/harness/langchain/model-router.ts +188 -0
- package/harness/langchain/models.d.ts +72 -0
- package/harness/langchain/models.ts +111 -49
- package/harness/langchain/ping-pong-middleware.d.ts +28 -0
- package/harness/langchain/ping-pong-middleware.test.d.ts +2 -0
- package/harness/langchain/ping-pong-middleware.test.ts +69 -0
- package/harness/langchain/ping-pong-middleware.ts +204 -0
- package/harness/langchain/run.d.ts +15 -0
- package/harness/langchain/run.ts +15 -3
- package/harness/langchain/scoreboard.test.d.ts +13 -0
- package/harness/langchain/scoreboard.test.ts +28 -5
- package/harness/langchain/status-line.d.ts +91 -0
- package/harness/langchain/status-line.test.d.ts +8 -0
- package/harness/langchain/surge.d.ts +103 -0
- package/harness/langchain/surge.test.d.ts +10 -0
- package/harness/langchain/surge.test.ts +179 -0
- package/harness/langchain/surge.ts +188 -19
- package/harness/langchain/widget.d.ts +105 -0
- package/harness/langchain/widget.test.d.ts +8 -0
- package/harness/ssh-detach-interceptor.test.ts +263 -0
- package/harness/ssh-detach-interceptor.ts +438 -0
- package/index.ts +212 -47
- package/package.json +4 -2
- package/packages/a2a-adapter/package.json +1 -1
- package/packages/architecture-generator/package.json +1 -1
- package/packages/auth/package.json +1 -1
- package/packages/autonomous-refactor/package.json +1 -1
- package/packages/autonomous-runtime/package.json +1 -1
- package/packages/cache-strategy/package.json +1 -1
- package/packages/capability-registry/package.json +1 -1
- package/packages/checkpoint/package.json +1 -1
- package/packages/cli-plugin-sdk/package.json +1 -1
- package/packages/clipboard/package.json +1 -1
- package/packages/clipboard-plugin/package.json +1 -1
- package/packages/code-generation/package.json +1 -1
- package/packages/code-review/package.json +1 -1
- package/packages/codex-adapter/package.json +1 -1
- package/packages/config-capture/package.json +1 -1
- package/packages/context-compiler/package.json +1 -1
- package/packages/context-discovery/package.json +1 -1
- package/packages/context-manager/package.json +1 -1
- package/packages/cookie-sanitizer/package.json +1 -1
- package/packages/cost-optimizer/package.json +1 -1
- package/packages/dependency-analyzer/package.json +1 -1
- package/packages/django-plugin/package.json +1 -1
- package/packages/doc-generator/package.json +1 -1
- package/packages/evaluation-engine/package.json +1 -1
- package/packages/evaluation-runner/package.json +1 -1
- package/packages/event-bus/package.json +1 -1
- package/packages/event-store/package.json +1 -1
- package/packages/experience-replay/package.json +1 -1
- package/packages/feedback-collector/package.json +1 -1
- package/packages/file-copy-helper/package.json +1 -1
- package/packages/framework-detector/package.json +1 -1
- package/packages/framework-plugin-sdk/package.json +1 -1
- package/packages/frappe-plugin/package.json +1 -1
- package/packages/generic-web-plugin/package.json +1 -1
- package/packages/health-monitor/package.json +1 -1
- package/packages/intent-analyzer/dist/src/index.d.ts +2 -0
- package/packages/intent-analyzer/dist/src/index.d.ts.map +1 -1
- package/packages/intent-analyzer/dist/src/index.js +1 -0
- package/packages/intent-analyzer/dist/src/index.js.map +1 -1
- package/packages/intent-analyzer/dist/src/ping-pong.d.ts +56 -0
- package/packages/intent-analyzer/dist/src/ping-pong.d.ts.map +1 -0
- package/packages/intent-analyzer/dist/src/ping-pong.js +286 -0
- package/packages/intent-analyzer/dist/src/ping-pong.js.map +1 -0
- package/packages/intent-analyzer/package.json +1 -1
- package/packages/intent-analyzer/src/index.ts +13 -0
- package/packages/intent-analyzer/src/ping-pong.ts +387 -0
- package/packages/intent-analyzer/test/ping-pong.test.ts +96 -0
- package/packages/jev-judge/README.md +234 -0
- package/packages/jev-judge/dist/decision-engine.d.ts +100 -0
- package/packages/jev-judge/dist/decision-engine.d.ts.map +1 -0
- package/packages/jev-judge/dist/decision-engine.js +151 -0
- package/packages/jev-judge/dist/decision-engine.js.map +1 -0
- package/packages/jev-judge/dist/e2e-judge.d.ts +61 -0
- package/packages/jev-judge/dist/e2e-judge.d.ts.map +1 -0
- package/packages/jev-judge/dist/e2e-judge.js +268 -0
- package/packages/jev-judge/dist/e2e-judge.js.map +1 -0
- package/packages/jev-judge/dist/flaky-detector.d.ts +34 -0
- package/packages/jev-judge/dist/flaky-detector.d.ts.map +1 -0
- package/packages/jev-judge/dist/flaky-detector.js +154 -0
- package/packages/jev-judge/dist/flaky-detector.js.map +1 -0
- package/packages/jev-judge/dist/index.d.ts +77 -0
- package/packages/jev-judge/dist/index.d.ts.map +1 -0
- package/packages/jev-judge/dist/index.js +271 -0
- package/packages/jev-judge/dist/index.js.map +1 -0
- package/packages/jev-judge/dist/types.d.ts +97 -0
- package/packages/jev-judge/dist/types.d.ts.map +1 -0
- package/packages/jev-judge/dist/types.js +8 -0
- package/packages/jev-judge/dist/types.js.map +1 -0
- package/packages/jev-judge/package.json +46 -0
- package/packages/jev-judge/src/decision-engine.ts +231 -0
- package/packages/jev-judge/src/e2e-judge.ts +364 -0
- package/packages/jev-judge/src/flaky-detector.ts +190 -0
- package/packages/jev-judge/src/index.ts +345 -0
- package/packages/jev-judge/src/types.ts +131 -0
- package/packages/knowledge-graph/package.json +1 -1
- package/packages/knowledge-retrieval/package.json +1 -1
- package/packages/laravel-plugin/package.json +1 -1
- package/packages/learning-engine/package.json +1 -1
- package/packages/mcp-adapter/package.json +1 -1
- package/packages/memory-engine/package.json +1 -1
- package/packages/milestone-manager/package.json +1 -1
- package/packages/model-registry/package.json +1 -1
- package/packages/nextjs-plugin/package.json +1 -1
- package/packages/notification/package.json +1 -1
- package/packages/observability/package.json +1 -1
- package/packages/okf-indexer/package.json +1 -1
- package/packages/performance-optimizer/package.json +1 -1
- package/packages/privilege-broker/package.json +1 -1
- package/packages/project-analyzer/package.json +1 -1
- package/packages/project-bootstrap/package.json +1 -1
- package/packages/projection-engine/package.json +1 -1
- package/packages/prompt-compiler/package.json +1 -1
- package/packages/prompt-versioning/package.json +1 -1
- package/packages/provider-adapter-sdk/package.json +1 -1
- package/packages/provider-router/package.json +1 -1
- package/packages/provider-selector/package.json +1 -1
- package/packages/providers/package.json +1 -1
- package/packages/quota-manager/package.json +1 -1
- package/packages/rate-limiter/package.json +1 -1
- package/packages/react-vite-plugin/package.json +1 -1
- package/packages/release-manager/package.json +1 -1
- package/packages/requirement-compiler/package.json +1 -1
- package/packages/runtime/package.json +1 -1
- package/packages/scheduler/package.json +1 -1
- package/packages/scheduler-adapter/package.json +1 -1
- package/packages/session/package.json +1 -1
- package/packages/session-api/package.json +1 -1
- package/packages/session-export/package.json +1 -1
- package/packages/shared-context/package.json +1 -1
- package/packages/skill-mcp-client/package.json +1 -1
- package/packages/skill-registry/package.json +1 -1
- package/packages/sprint-planner/package.json +1 -1
- package/packages/subscription-engine/package.json +1 -1
- package/packages/task-compiler/package.json +1 -1
- package/packages/tencentdb-memory/package.json +1 -1
- package/packages/tencentdb-sync/package.json +1 -1
- package/packages/test-data-generator/package.json +1 -1
- package/packages/test-generator/package.json +1 -1
- package/packages/todo-bd-sync/README.md +71 -0
- package/packages/todo-bd-sync/package.json +1 -1
- package/packages/todo-bd-sync/src/extension.ts +16 -1
- package/packages/token-estimation/package.json +1 -1
- package/packages/token-optimizer/package.json +1 -1
- package/packages/trajectory/dist/src/approved-patterns.d.ts +51 -0
- package/packages/trajectory/dist/src/approved-patterns.d.ts.map +1 -0
- package/packages/trajectory/dist/src/approved-patterns.js +134 -0
- package/packages/trajectory/dist/src/approved-patterns.js.map +1 -0
- package/packages/trajectory/dist/src/index.d.ts +13 -0
- package/packages/trajectory/dist/src/index.d.ts.map +1 -0
- package/packages/trajectory/dist/src/index.js +12 -0
- package/packages/trajectory/dist/src/index.js.map +1 -0
- package/packages/trajectory/dist/src/store.d.ts +69 -0
- package/packages/trajectory/dist/src/store.d.ts.map +1 -0
- package/packages/trajectory/dist/src/store.js +253 -0
- package/packages/trajectory/dist/src/store.js.map +1 -0
- package/packages/trajectory/dist/src/types.d.ts +73 -0
- package/packages/trajectory/dist/src/types.d.ts.map +1 -0
- package/packages/trajectory/dist/src/types.js +9 -0
- package/packages/trajectory/dist/src/types.js.map +1 -0
- package/packages/trajectory/dist/test/store.test.d.ts +2 -0
- package/packages/trajectory/dist/test/store.test.d.ts.map +1 -0
- package/packages/trajectory/dist/test/store.test.js +228 -0
- package/packages/trajectory/dist/test/store.test.js.map +1 -0
- package/packages/trajectory/package.json +29 -0
- package/packages/trajectory/src/approved-patterns.ts +180 -0
- package/packages/trajectory/src/index.ts +26 -0
- package/packages/trajectory/src/store.ts +285 -0
- package/packages/trajectory/src/types.ts +84 -0
- package/packages/trajectory/test/store.test.d.ts +2 -0
- package/packages/trajectory/test/store.test.ts +250 -0
- package/packages/tui/package.json +1 -1
- package/packages/types/package.json +1 -1
- package/packages/workflow-events/package.json +1 -1
- package/packages/workspace-scanner/package.json +1 -1
- package/packages/worktree/package.json +1 -1
- package/packages/write-review/package.json +1 -1
- package/packages/write-review/src/blackboard.ts +38 -5
- package/packages/write-review/src/types.ts +13 -0
- package/skills/harness-runtime/SKILL.md +67 -4
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decision Engine - Threshold-based routing and action decisions
|
|
3
|
+
*
|
|
4
|
+
* Wraps Jev decisions with configurable thresholds for automated actions.
|
|
5
|
+
*/
|
|
6
|
+
import { JevJudge } from "./index.js";
|
|
7
|
+
import type { JevJudgeConfig } from "./types.js";
|
|
8
|
+
/**
|
|
9
|
+
* Threshold configuration for automatic decisions
|
|
10
|
+
*/
|
|
11
|
+
export interface ThresholdConfig {
|
|
12
|
+
/** Threshold for automatic approval (default: 0.9) */
|
|
13
|
+
approval?: number;
|
|
14
|
+
/** Threshold for requiring review (default: 0.5) */
|
|
15
|
+
review?: number;
|
|
16
|
+
/** Threshold for automatic blocking (default: 0.2) */
|
|
17
|
+
block?: number;
|
|
18
|
+
/** Custom thresholds per question ID */
|
|
19
|
+
perQuestion?: Record<string, {
|
|
20
|
+
approval?: number;
|
|
21
|
+
review?: number;
|
|
22
|
+
block?: number;
|
|
23
|
+
}>;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Action result from the decision engine
|
|
27
|
+
*/
|
|
28
|
+
export interface ActionResult {
|
|
29
|
+
action: "proceed" | "review" | "block";
|
|
30
|
+
shouldAct: boolean;
|
|
31
|
+
probability: number;
|
|
32
|
+
confidence: "high" | "medium" | "low";
|
|
33
|
+
reason: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Decision Engine - Makes automated decisions based on Jev probabilities
|
|
37
|
+
*/
|
|
38
|
+
export declare class DecisionEngine {
|
|
39
|
+
private judge;
|
|
40
|
+
private defaultThresholds;
|
|
41
|
+
constructor(config: JevJudgeConfig, thresholds?: ThresholdConfig);
|
|
42
|
+
/**
|
|
43
|
+
* Decide action based on probability and thresholds
|
|
44
|
+
*/
|
|
45
|
+
decide(probability: number, thresholds?: ThresholdConfig): ActionResult;
|
|
46
|
+
/**
|
|
47
|
+
* Decide with per-question thresholds
|
|
48
|
+
*/
|
|
49
|
+
decideWithThresholds(probabilities: Record<string, number>, thresholds?: ThresholdConfig): Record<string, ActionResult>;
|
|
50
|
+
/**
|
|
51
|
+
* Route to appropriate handler based on decision
|
|
52
|
+
*/
|
|
53
|
+
route<T>(decision: ActionResult, handlers: {
|
|
54
|
+
onProceed?: () => T | Promise<T>;
|
|
55
|
+
onReview?: () => T | Promise<T>;
|
|
56
|
+
onBlock?: () => T | Promise<T>;
|
|
57
|
+
}): Promise<T> | T;
|
|
58
|
+
/**
|
|
59
|
+
* Batch decision with voting
|
|
60
|
+
*/
|
|
61
|
+
batchDecide(decisions: {
|
|
62
|
+
id: string;
|
|
63
|
+
probability: number;
|
|
64
|
+
}[], threshold?: number): {
|
|
65
|
+
passed: string[];
|
|
66
|
+
failed: string[];
|
|
67
|
+
threshold: number;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Weighted voting for multiple judges
|
|
71
|
+
*/
|
|
72
|
+
weightedVote(votes: {
|
|
73
|
+
weight: number;
|
|
74
|
+
probability: number;
|
|
75
|
+
}[]): {
|
|
76
|
+
weightedAverage: number;
|
|
77
|
+
decision: ActionResult;
|
|
78
|
+
};
|
|
79
|
+
private getConfidence;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Routing helpers for common use cases
|
|
83
|
+
*/
|
|
84
|
+
export declare class Router {
|
|
85
|
+
/**
|
|
86
|
+
* Route to todo or bd based on task description
|
|
87
|
+
*/
|
|
88
|
+
static routeTaskTracker(taskDescription: string, judge: JevJudge): Promise<{
|
|
89
|
+
tracker: "todo" | "bd";
|
|
90
|
+
confidence: number;
|
|
91
|
+
}>;
|
|
92
|
+
/**
|
|
93
|
+
* Route to appropriate severity level
|
|
94
|
+
*/
|
|
95
|
+
static routeSeverity(issue: string, judge: JevJudge): Promise<{
|
|
96
|
+
severity: "critical" | "high" | "medium" | "low";
|
|
97
|
+
probability: number;
|
|
98
|
+
}>;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=decision-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decision-engine.d.ts","sourceRoot":"","sources":["../src/decision-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decision Engine - Threshold-based routing and action decisions
|
|
3
|
+
*
|
|
4
|
+
* Wraps Jev decisions with configurable thresholds for automated actions.
|
|
5
|
+
*/
|
|
6
|
+
import { JevJudge } from "./index.js";
|
|
7
|
+
/**
|
|
8
|
+
* Decision Engine - Makes automated decisions based on Jev probabilities
|
|
9
|
+
*/
|
|
10
|
+
export class DecisionEngine {
|
|
11
|
+
judge;
|
|
12
|
+
defaultThresholds;
|
|
13
|
+
constructor(config, thresholds) {
|
|
14
|
+
this.judge = new JevJudge(config);
|
|
15
|
+
this.defaultThresholds = {
|
|
16
|
+
approval: 0.9,
|
|
17
|
+
review: 0.5,
|
|
18
|
+
block: 0.2,
|
|
19
|
+
...thresholds,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Decide action based on probability and thresholds
|
|
24
|
+
*/
|
|
25
|
+
decide(probability, thresholds) {
|
|
26
|
+
const t = thresholds ?? this.defaultThresholds;
|
|
27
|
+
if (probability >= (t.approval ?? 0.9)) {
|
|
28
|
+
return {
|
|
29
|
+
action: "proceed",
|
|
30
|
+
shouldAct: true,
|
|
31
|
+
probability,
|
|
32
|
+
confidence: this.getConfidence(probability, t.approval ?? 0.9),
|
|
33
|
+
reason: "High confidence - auto-approved",
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
if (probability >= (t.review ?? 0.5)) {
|
|
37
|
+
return {
|
|
38
|
+
action: "review",
|
|
39
|
+
shouldAct: false,
|
|
40
|
+
probability,
|
|
41
|
+
confidence: this.getConfidence(probability, t.review ?? 0.5),
|
|
42
|
+
reason: "Medium confidence - requires human review",
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
action: "block",
|
|
47
|
+
shouldAct: false,
|
|
48
|
+
probability,
|
|
49
|
+
confidence: this.getConfidence(probability, t.block ?? 0.2),
|
|
50
|
+
reason: "Low confidence - blocked",
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Decide with per-question thresholds
|
|
55
|
+
*/
|
|
56
|
+
decideWithThresholds(probabilities, thresholds) {
|
|
57
|
+
const results = {};
|
|
58
|
+
for (const [questionId, probability] of Object.entries(probabilities)) {
|
|
59
|
+
const questionThresholds = thresholds?.perQuestion?.[questionId] ?? thresholds;
|
|
60
|
+
results[questionId] = this.decide(probability, questionThresholds);
|
|
61
|
+
}
|
|
62
|
+
return results;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Route to appropriate handler based on decision
|
|
66
|
+
*/
|
|
67
|
+
route(decision, handlers) {
|
|
68
|
+
switch (decision.action) {
|
|
69
|
+
case "proceed":
|
|
70
|
+
return handlers.onProceed?.() ?? {};
|
|
71
|
+
case "review":
|
|
72
|
+
return handlers.onReview?.() ?? {};
|
|
73
|
+
case "block":
|
|
74
|
+
return handlers.onBlock?.() ?? {};
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Batch decision with voting
|
|
79
|
+
*/
|
|
80
|
+
batchDecide(decisions, threshold = 0.5) {
|
|
81
|
+
const passed = [];
|
|
82
|
+
const failed = [];
|
|
83
|
+
for (const decision of decisions) {
|
|
84
|
+
if (decision.probability >= threshold) {
|
|
85
|
+
passed.push(decision.id);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
failed.push(decision.id);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return { passed, failed, threshold };
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Weighted voting for multiple judges
|
|
95
|
+
*/
|
|
96
|
+
weightedVote(votes) {
|
|
97
|
+
const totalWeight = votes.reduce((sum, v) => sum + v.weight, 0);
|
|
98
|
+
const weightedAverage = votes.reduce((sum, v) => sum + (v.probability * v.weight) / totalWeight, 0);
|
|
99
|
+
return {
|
|
100
|
+
weightedAverage,
|
|
101
|
+
decision: this.decide(weightedAverage),
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
getConfidence(probability, threshold) {
|
|
105
|
+
const distance = Math.abs(probability - threshold);
|
|
106
|
+
if (distance > 0.3)
|
|
107
|
+
return "high";
|
|
108
|
+
if (distance > 0.15)
|
|
109
|
+
return "medium";
|
|
110
|
+
return "low";
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Routing helpers for common use cases
|
|
115
|
+
*/
|
|
116
|
+
export class Router {
|
|
117
|
+
/**
|
|
118
|
+
* Route to todo or bd based on task description
|
|
119
|
+
*/
|
|
120
|
+
static async routeTaskTracker(taskDescription, judge) {
|
|
121
|
+
const result = await judge.evaluate(taskDescription, {
|
|
122
|
+
useTodo: {
|
|
123
|
+
type: "noul",
|
|
124
|
+
instructions: "Is this a short-lived, session-specific task that doesn't need GitHub tracking?",
|
|
125
|
+
},
|
|
126
|
+
});
|
|
127
|
+
const probability = (result.decisions.useTodo?.probability ?? 0.5);
|
|
128
|
+
return {
|
|
129
|
+
tracker: probability > 0.5 ? "todo" : "bd",
|
|
130
|
+
confidence: Math.abs(probability - 0.5) * 2, // 0-1 scale
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Route to appropriate severity level
|
|
135
|
+
*/
|
|
136
|
+
static async routeSeverity(issue, judge) {
|
|
137
|
+
const result = await judge.evaluate(issue, {
|
|
138
|
+
severity: {
|
|
139
|
+
type: "choice",
|
|
140
|
+
instructions: "What is the severity level of this issue?",
|
|
141
|
+
options: ["critical", "high", "medium", "low"],
|
|
142
|
+
},
|
|
143
|
+
});
|
|
144
|
+
const severityDecision = result.decisions.severity;
|
|
145
|
+
return {
|
|
146
|
+
severity: severityDecision?.response?.choice ?? "medium",
|
|
147
|
+
probability: severityDecision?.response?.confidence ?? 0.5,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=decision-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decision-engine.js","sourceRoot":"","sources":["../src/decision-engine.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AA4BtC;;GAEG;AACH,MAAM,OAAO,cAAc;IACjB,KAAK,CAAW;IAChB,iBAAiB,CAAkB;IAE3C,YACE,MAAsB,EACtB,UAA4B;QAE5B,IAAI,CAAC,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;QAClC,IAAI,CAAC,iBAAiB,GAAG;YACvB,QAAQ,EAAE,GAAG;YACb,MAAM,EAAE,GAAG;YACX,KAAK,EAAE,GAAG;YACV,GAAG,UAAU;SACd,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CACJ,WAAmB,EACnB,UAA4B;QAE5B,MAAM,CAAC,GAAG,UAAU,IAAI,IAAI,CAAC,iBAAiB,CAAC;QAE/C,IAAI,WAAW,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,GAAG,CAAC,EAAE,CAAC;YACvC,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,SAAS,EAAE,IAAI;gBACf,WAAW;gBACX,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,CAAC,QAAQ,IAAI,GAAG,CAAC;gBAC9D,MAAM,EAAE,iCAAiC;aAC1C,CAAC;QACJ,CAAC;QAED,IAAI,WAAW,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC;YACrC,OAAO;gBACL,MAAM,EAAE,QAAQ;gBAChB,SAAS,EAAE,KAAK;gBAChB,WAAW;gBACX,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC;gBAC5D,MAAM,EAAE,2CAA2C;aACpD,CAAC;QACJ,CAAC;QAED,OAAO;YACL,MAAM,EAAE,OAAO;YACf,SAAS,EAAE,KAAK;YAChB,WAAW;YACX,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC;YAC3D,MAAM,EAAE,0BAA0B;SACnC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,oBAAoB,CAClB,aAAqC,EACrC,UAA4B;QAE5B,MAAM,OAAO,GAAiC,EAAE,CAAC;QAEjD,KAAK,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;YACtE,MAAM,kBAAkB,GAAG,UAAU,EAAE,WAAW,EAAE,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC;YAC/E,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QACrE,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CACH,QAAsB,EACtB,QAIC;QAED,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC;YACxB,KAAK,SAAS;gBACZ,OAAO,QAAQ,CAAC,SAAS,EAAE,EAAE,IAAK,EAAQ,CAAC;YAC7C,KAAK,QAAQ;gBACX,OAAO,QAAQ,CAAC,QAAQ,EAAE,EAAE,IAAK,EAAQ,CAAC;YAC5C,KAAK,OAAO;gBACV,OAAO,QAAQ,CAAC,OAAO,EAAE,EAAE,IAAK,EAAQ,CAAC;QAC7C,CAAC;IACH,CAAC;IAED;;OAEG;IACH,WAAW,CACT,SAAgD,EAChD,SAAS,GAAG,GAAG;QAEf,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,QAAQ,CAAC,WAAW,IAAI,SAAS,EAAE,CAAC;gBACtC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC3B,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,YAAY,CACV,KAAgD;QAEhD,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAChE,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,CAClC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,WAAW,EAC1D,CAAC,CACF,CAAC;QAEF,OAAO;YACL,eAAe;YACf,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;SACvC,CAAC;IACJ,CAAC;IAEO,aAAa,CACnB,WAAmB,EACnB,SAAiB;QAEjB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;QACnD,IAAI,QAAQ,GAAG,GAAG;YAAE,OAAO,MAAM,CAAC;QAClC,IAAI,QAAQ,GAAG,IAAI;YAAE,OAAO,QAAQ,CAAC;QACrC,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,MAAM;IACjB;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAC3B,eAAuB,EACvB,KAAe;QAEf,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,eAAe,EAAE;YACnD,OAAO,EAAE;gBACP,IAAI,EAAE,MAAM;gBACZ,YAAY,EACV,iFAAiF;aACpF;SACF,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,WAAW,IAAI,GAAG,CAAC,CAAC;QACnE,OAAO;YACL,OAAO,EAAE,WAAW,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI;YAC1C,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,YAAY;SAC1D,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,aAAa,CACxB,KAAa,EACb,KAAe;QAEf,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE;YACzC,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,YAAY,EAAE,2CAA2C;gBACzD,OAAO,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC;aAC/C;SACF,CAAC,CAAC;QAEH,MAAM,gBAAgB,GAAG,MAAM,CAAC,SAAS,CAAC,QAEzC,CAAC;QAEF,OAAO;YACL,QAAQ,EAAG,gBAAgB,EAAE,QAAQ,EAAE,MAAiD,IAAI,QAAQ;YACpG,WAAW,EAAE,gBAAgB,EAAE,QAAQ,EAAE,UAAU,IAAI,GAAG;SAC3D,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* E2E Judge - Automated decision making for E2E testing
|
|
3
|
+
*
|
|
4
|
+
* Uses Jev to make fast, calibrated decisions about:
|
|
5
|
+
* - Test flakiness detection
|
|
6
|
+
* - Build blocking decisions
|
|
7
|
+
* - Retry recommendations
|
|
8
|
+
* - Error classification
|
|
9
|
+
*/
|
|
10
|
+
import { type JevJudgeConfig } from "./index.js";
|
|
11
|
+
import type { E2ETestResult, E2EFlakyAnalysis, E2EBuildDecision, E2ERetryDecision } from "./types.js";
|
|
12
|
+
/**
|
|
13
|
+
* E2E Judge - Specialized judge for E2E testing decisions
|
|
14
|
+
*/
|
|
15
|
+
export declare class E2EJudge {
|
|
16
|
+
private judge;
|
|
17
|
+
private config;
|
|
18
|
+
constructor(config: JevJudgeConfig, options?: {
|
|
19
|
+
flakyThreshold?: number;
|
|
20
|
+
blockThreshold?: number;
|
|
21
|
+
retryThreshold?: number;
|
|
22
|
+
});
|
|
23
|
+
/**
|
|
24
|
+
* Analyze if a test failure is likely a flaky test
|
|
25
|
+
*/
|
|
26
|
+
analyzeFlakiness(testResult: E2ETestResult): Promise<E2EFlakyAnalysis>;
|
|
27
|
+
/**
|
|
28
|
+
* Decide if a test failure should block the build
|
|
29
|
+
*/
|
|
30
|
+
shouldBlockBuild(testResult: E2ETestResult): Promise<E2EBuildDecision>;
|
|
31
|
+
/**
|
|
32
|
+
* Decide if a failed test should be retried
|
|
33
|
+
*/
|
|
34
|
+
shouldRetry(testResult: E2ETestResult): Promise<E2ERetryDecision>;
|
|
35
|
+
/**
|
|
36
|
+
* Classify a test error into categories
|
|
37
|
+
*/
|
|
38
|
+
classifyError(errorMessage: string, testName?: string): Promise<{
|
|
39
|
+
category: string;
|
|
40
|
+
subcategory?: string;
|
|
41
|
+
isKnown: boolean;
|
|
42
|
+
probability: number;
|
|
43
|
+
}>;
|
|
44
|
+
/**
|
|
45
|
+
* Batch analyze multiple test results
|
|
46
|
+
*/
|
|
47
|
+
batchAnalyze(testResults: E2ETestResult[]): Promise<{
|
|
48
|
+
flaky: E2ETestResult[];
|
|
49
|
+
shouldBlock: E2ETestResult[];
|
|
50
|
+
toRetry: {
|
|
51
|
+
test: E2ETestResult;
|
|
52
|
+
decision: E2ERetryDecision;
|
|
53
|
+
}[];
|
|
54
|
+
passed: E2ETestResult[];
|
|
55
|
+
}>;
|
|
56
|
+
private buildFlakyState;
|
|
57
|
+
private buildBuildBlockState;
|
|
58
|
+
private buildRetryState;
|
|
59
|
+
private getFlakyRecommendation;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=e2e-judge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"e2e-judge.d.ts","sourceRoot":"","sources":["../src/e2e-judge.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAY,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAEjB,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,MAAM,CAIZ;IAEF,YACE,MAAM,EAAE,cAAc,EACtB,OAAO,CAAC,EAAE;QACR,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,EAQF;IAED;;OAEG;IACG,gBAAgB,CAAC,UAAU,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA4C3E;IAED;;OAEG;IACG,gBAAgB,CAAC,UAAU,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA4C3E;IAED;;OAEG;IACG,WAAW,CAAC,UAAU,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA4CtE;IAED;;OAEG;IACG,aAAa,CACjB,YAAY,EAAE,MAAM,EACpB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC;QACT,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,EAAE,OAAO,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC,CAyCD;IAED;;OAEG;IACG,YAAY,CAChB,WAAW,EAAE,aAAa,EAAE,GAC3B,OAAO,CAAC;QACT,KAAK,EAAE,aAAa,EAAE,CAAC;QACvB,WAAW,EAAE,aAAa,EAAE,CAAC;QAC7B,OAAO,EAAE;YAAE,IAAI,EAAE,aAAa,CAAC;YAAC,QAAQ,EAAE,gBAAgB,CAAA;SAAE,EAAE,CAAC;QAC/D,MAAM,EAAE,aAAa,EAAE,CAAC;KACzB,CAAC,CA8CD;IAID,OAAO,CAAC,eAAe;IAkBvB,OAAO,CAAC,oBAAoB;IAc5B,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,sBAAsB;CAc/B"}
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* E2E Judge - Automated decision making for E2E testing
|
|
3
|
+
*
|
|
4
|
+
* Uses Jev to make fast, calibrated decisions about:
|
|
5
|
+
* - Test flakiness detection
|
|
6
|
+
* - Build blocking decisions
|
|
7
|
+
* - Retry recommendations
|
|
8
|
+
* - Error classification
|
|
9
|
+
*/
|
|
10
|
+
import { JevJudge } from "./index.js";
|
|
11
|
+
/**
|
|
12
|
+
* E2E Judge - Specialized judge for E2E testing decisions
|
|
13
|
+
*/
|
|
14
|
+
export class E2EJudge {
|
|
15
|
+
judge;
|
|
16
|
+
config;
|
|
17
|
+
constructor(config, options) {
|
|
18
|
+
this.judge = new JevJudge(config);
|
|
19
|
+
this.config = {
|
|
20
|
+
flakyThreshold: options?.flakyThreshold ?? 0.7,
|
|
21
|
+
blockThreshold: options?.blockThreshold ?? 0.8,
|
|
22
|
+
retryThreshold: options?.retryThreshold ?? 0.6,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Analyze if a test failure is likely a flaky test
|
|
27
|
+
*/
|
|
28
|
+
async analyzeFlakiness(testResult) {
|
|
29
|
+
const state = this.buildFlakyState(testResult);
|
|
30
|
+
const result = await this.judge.evaluate(state, {
|
|
31
|
+
isFlaky: {
|
|
32
|
+
type: "noul",
|
|
33
|
+
instructions: "Does this failure match a known flaky test pattern? Consider: timeout, race condition, network issue, or intermittent UI state.",
|
|
34
|
+
},
|
|
35
|
+
pattern: {
|
|
36
|
+
type: "choice",
|
|
37
|
+
instructions: "What is the most likely cause of this failure?",
|
|
38
|
+
options: [
|
|
39
|
+
"timeout",
|
|
40
|
+
"race_condition",
|
|
41
|
+
"network_issue",
|
|
42
|
+
"ui_state",
|
|
43
|
+
"data_issue",
|
|
44
|
+
"real_bug",
|
|
45
|
+
"unknown",
|
|
46
|
+
],
|
|
47
|
+
},
|
|
48
|
+
confidence: {
|
|
49
|
+
type: "noul",
|
|
50
|
+
instructions: "Is this a confident assessment based on clear evidence in the error message?",
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
const isFlakyDecision = result.decisions.isFlaky;
|
|
54
|
+
const patternDecision = result.decisions.pattern;
|
|
55
|
+
const probability = isFlakyDecision.probability ?? 0;
|
|
56
|
+
const isFlaky = probability >= (this.config.flakyThreshold ?? 0.7);
|
|
57
|
+
return {
|
|
58
|
+
isFlaky,
|
|
59
|
+
confidence: isFlakyDecision.confidence,
|
|
60
|
+
probability,
|
|
61
|
+
pattern: patternDecision?.response?.choice,
|
|
62
|
+
recommendation: this.getFlakyRecommendation(isFlaky, probability),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Decide if a test failure should block the build
|
|
67
|
+
*/
|
|
68
|
+
async shouldBlockBuild(testResult) {
|
|
69
|
+
const state = this.buildBuildBlockState(testResult);
|
|
70
|
+
const result = await this.judge.evaluate(state, {
|
|
71
|
+
blocksBuild: {
|
|
72
|
+
type: "noul",
|
|
73
|
+
instructions: "Would this failure indicate a real regression that should block the build? Consider: is this a core functionality, critical path, or user-facing feature?",
|
|
74
|
+
},
|
|
75
|
+
severity: {
|
|
76
|
+
type: "choice",
|
|
77
|
+
instructions: "What is the impact level of this failure?",
|
|
78
|
+
options: ["critical", "high", "medium", "low"],
|
|
79
|
+
},
|
|
80
|
+
reason: {
|
|
81
|
+
type: "choice",
|
|
82
|
+
instructions: "What is the primary reason this would block the build?",
|
|
83
|
+
options: [
|
|
84
|
+
"core_functionality",
|
|
85
|
+
"critical_path",
|
|
86
|
+
"user_facing",
|
|
87
|
+
"performance",
|
|
88
|
+
"cosmetic",
|
|
89
|
+
"flaky",
|
|
90
|
+
"known_issue",
|
|
91
|
+
],
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
const blockDecision = result.decisions.blocksBuild;
|
|
95
|
+
const probability = blockDecision.probability ?? 0;
|
|
96
|
+
const shouldBlock = probability >= (this.config.blockThreshold ?? 0.8);
|
|
97
|
+
const reasonDecision = result.decisions.reason;
|
|
98
|
+
return {
|
|
99
|
+
shouldBlock,
|
|
100
|
+
probability,
|
|
101
|
+
confidence: blockDecision.confidence,
|
|
102
|
+
reason: reasonDecision?.response?.choice ?? "unknown",
|
|
103
|
+
affectedTests: [testResult.name],
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Decide if a failed test should be retried
|
|
108
|
+
*/
|
|
109
|
+
async shouldRetry(testResult) {
|
|
110
|
+
const state = this.buildRetryState(testResult);
|
|
111
|
+
const result = await this.judge.evaluate(state, {
|
|
112
|
+
shouldRetry: {
|
|
113
|
+
type: "noul",
|
|
114
|
+
instructions: "Is this failure likely transient and worth retrying? Consider: timeout, network error, resource contention, or race conditions.",
|
|
115
|
+
},
|
|
116
|
+
attempts: {
|
|
117
|
+
type: "choice",
|
|
118
|
+
instructions: "How many retry attempts are recommended?",
|
|
119
|
+
options: ["1", "2", "3", "5", "dont_retry"],
|
|
120
|
+
},
|
|
121
|
+
delay: {
|
|
122
|
+
type: "score",
|
|
123
|
+
instructions: "How long should we wait before retrying (in seconds)?",
|
|
124
|
+
min: 0,
|
|
125
|
+
max: 30,
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
const retryDecision = result.decisions.shouldRetry;
|
|
129
|
+
const attemptsDecision = result.decisions.attempts;
|
|
130
|
+
const delayDecision = result.decisions.delay;
|
|
131
|
+
const probability = retryDecision.probability ?? 0;
|
|
132
|
+
const shouldRetry = probability >= (this.config.retryThreshold ?? 0.6);
|
|
133
|
+
const attemptsStr = attemptsDecision?.response?.choice ?? "1";
|
|
134
|
+
const maxAttempts = attemptsStr === "dont_retry" ? 0 : parseInt(attemptsStr, 10);
|
|
135
|
+
return {
|
|
136
|
+
shouldRetry: shouldRetry && maxAttempts > 0,
|
|
137
|
+
maxAttempts,
|
|
138
|
+
probability,
|
|
139
|
+
delayMs: delayDecision?.response?.score
|
|
140
|
+
? delayDecision.response.score * 1000
|
|
141
|
+
: undefined,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Classify a test error into categories
|
|
146
|
+
*/
|
|
147
|
+
async classifyError(errorMessage, testName) {
|
|
148
|
+
const state = testName
|
|
149
|
+
? `Test: ${testName}\nError: ${errorMessage}`
|
|
150
|
+
: errorMessage;
|
|
151
|
+
const result = await this.judge.evaluate(state, {
|
|
152
|
+
category: {
|
|
153
|
+
type: "choice",
|
|
154
|
+
instructions: "What is the primary category of this error?",
|
|
155
|
+
options: [
|
|
156
|
+
"assertion",
|
|
157
|
+
"timeout",
|
|
158
|
+
"network",
|
|
159
|
+
"permission",
|
|
160
|
+
"data",
|
|
161
|
+
"ui",
|
|
162
|
+
"api",
|
|
163
|
+
"auth",
|
|
164
|
+
"config",
|
|
165
|
+
"unknown",
|
|
166
|
+
],
|
|
167
|
+
},
|
|
168
|
+
isKnown: {
|
|
169
|
+
type: "noul",
|
|
170
|
+
instructions: "Is this a known, expected error pattern (e.g., known bug, expected failure)?",
|
|
171
|
+
},
|
|
172
|
+
});
|
|
173
|
+
const categoryDecision = result.decisions.category;
|
|
174
|
+
const isKnownDecision = result.decisions.isKnown;
|
|
175
|
+
return {
|
|
176
|
+
category: categoryDecision?.response?.choice ?? "unknown",
|
|
177
|
+
isKnown: isKnownDecision?.response?.noul
|
|
178
|
+
? isKnownDecision.response.noul > 0.5
|
|
179
|
+
: false,
|
|
180
|
+
probability: isKnownDecision.probability ?? 0.5,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Batch analyze multiple test results
|
|
185
|
+
*/
|
|
186
|
+
async batchAnalyze(testResults) {
|
|
187
|
+
const flaky = [];
|
|
188
|
+
const shouldBlock = [];
|
|
189
|
+
const toRetry = [];
|
|
190
|
+
const passed = [];
|
|
191
|
+
// Process in batches to avoid rate limiting
|
|
192
|
+
const BATCH_SIZE = 5;
|
|
193
|
+
for (let i = 0; i < testResults.length; i += BATCH_SIZE) {
|
|
194
|
+
const batch = testResults.slice(i, i + BATCH_SIZE);
|
|
195
|
+
const results = await Promise.all(batch.map(async (test) => {
|
|
196
|
+
if (test.status === "passed") {
|
|
197
|
+
return { test, type: "passed" };
|
|
198
|
+
}
|
|
199
|
+
const [flakyResult, retryDecision] = await Promise.all([
|
|
200
|
+
this.analyzeFlakiness(test),
|
|
201
|
+
this.shouldRetry(test),
|
|
202
|
+
]);
|
|
203
|
+
return { test, flakyResult, retryDecision, type: "failed" };
|
|
204
|
+
}));
|
|
205
|
+
for (const result of results) {
|
|
206
|
+
if (result.type === "passed") {
|
|
207
|
+
passed.push(result.test);
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
if (result.flakyResult?.isFlaky) {
|
|
211
|
+
flaky.push(result.test);
|
|
212
|
+
}
|
|
213
|
+
if (result.retryDecision?.shouldRetry) {
|
|
214
|
+
toRetry.push({ test: result.test, decision: result.retryDecision });
|
|
215
|
+
}
|
|
216
|
+
const blockDecision = await this.shouldBlockBuild(result.test);
|
|
217
|
+
if (blockDecision.shouldBlock) {
|
|
218
|
+
shouldBlock.push(result.test);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return { flaky, shouldBlock, toRetry, passed };
|
|
224
|
+
}
|
|
225
|
+
// Private helpers
|
|
226
|
+
buildFlakyState(test) {
|
|
227
|
+
const parts = [`Test: ${test.name}`, `Status: ${test.status}`];
|
|
228
|
+
if (test.error) {
|
|
229
|
+
parts.push(`Error: ${test.error}`);
|
|
230
|
+
}
|
|
231
|
+
if (test.retries !== undefined) {
|
|
232
|
+
parts.push(`Previous retries: ${test.retries}`);
|
|
233
|
+
}
|
|
234
|
+
if (test.duration !== undefined) {
|
|
235
|
+
parts.push(`Duration: ${test.duration}ms`);
|
|
236
|
+
}
|
|
237
|
+
return parts.join("\n");
|
|
238
|
+
}
|
|
239
|
+
buildBuildBlockState(test) {
|
|
240
|
+
const parts = [
|
|
241
|
+
`Test: ${test.name}`,
|
|
242
|
+
`Status: ${test.status}`,
|
|
243
|
+
`Test duration: ${test.duration ?? "unknown"}ms`,
|
|
244
|
+
];
|
|
245
|
+
if (test.error) {
|
|
246
|
+
parts.push(`Error: ${test.error}`);
|
|
247
|
+
}
|
|
248
|
+
return parts.join("\n");
|
|
249
|
+
}
|
|
250
|
+
buildRetryState(test) {
|
|
251
|
+
const parts = [
|
|
252
|
+
`Test: ${test.name}`,
|
|
253
|
+
`Error: ${test.error ?? "No error message"}`,
|
|
254
|
+
`Retries so far: ${test.retries ?? 0}`,
|
|
255
|
+
];
|
|
256
|
+
return parts.join("\n");
|
|
257
|
+
}
|
|
258
|
+
getFlakyRecommendation(isFlaky, probability) {
|
|
259
|
+
if (!isFlaky) {
|
|
260
|
+
return probability > 0.5 ? "investigate" : "block";
|
|
261
|
+
}
|
|
262
|
+
if (probability > 0.9) {
|
|
263
|
+
return "skip";
|
|
264
|
+
}
|
|
265
|
+
return "retry";
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
//# sourceMappingURL=e2e-judge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"e2e-judge.js","sourceRoot":"","sources":["../src/e2e-judge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Flaky Detector - Specialized module for detecting flaky tests
|
|
3
|
+
*
|
|
4
|
+
* Uses Jev to analyze test failures and determine if they're flaky.
|
|
5
|
+
*/
|
|
6
|
+
import type { JevJudgeConfig, E2ETestResult, E2EFlakyAnalysis } from "./types.js";
|
|
7
|
+
/**
|
|
8
|
+
* Flaky Detector - Specialized for detecting flaky test failures
|
|
9
|
+
*/
|
|
10
|
+
export declare class FlakyDetector {
|
|
11
|
+
private judge;
|
|
12
|
+
private threshold;
|
|
13
|
+
constructor(config: JevJudgeConfig, threshold?: number);
|
|
14
|
+
/**
|
|
15
|
+
* Quick pattern-based flaky detection (without Jev)
|
|
16
|
+
* Used for fast, synchronous checks
|
|
17
|
+
*/
|
|
18
|
+
detectPattern(errorMessage?: string): {
|
|
19
|
+
isFlaky: boolean;
|
|
20
|
+
pattern: string | null;
|
|
21
|
+
confidence: "high" | "medium" | "low";
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* AI-powered flaky detection with Jev
|
|
25
|
+
*/
|
|
26
|
+
detect(testResult: E2ETestResult): Promise<E2EFlakyAnalysis>;
|
|
27
|
+
/**
|
|
28
|
+
* Batch detect flaky tests
|
|
29
|
+
*/
|
|
30
|
+
batchDetect(testResults: E2ETestResult[]): Promise<Map<string, E2EFlakyAnalysis>>;
|
|
31
|
+
private buildState;
|
|
32
|
+
private getRecommendation;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=flaky-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flaky-detector.d.ts","sourceRoot":"","sources":["../src/flaky-detector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAoBlF;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,SAAS,CAAS;IAE1B,YAAY,MAAM,EAAE,cAAc,EAAE,SAAS,SAAM,EAGlD;IAED;;;OAGG;IACH,aAAa,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG;QACpC,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;KACvC,CA4BA;IAED;;OAEG;IACG,MAAM,CAAC,UAAU,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA0DjE;IAED;;OAEG;IACG,WAAW,CACf,WAAW,EAAE,aAAa,EAAE,GAC3B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAkBxC;IAED,OAAO,CAAC,UAAU;IAkBlB,OAAO,CAAC,iBAAiB;CAM1B"}
|