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.
Files changed (203) hide show
  1. package/CHANGELOG.md +30 -9
  2. package/README.md +119 -0
  3. package/harness/langchain/agents.d.ts +143 -0
  4. package/harness/langchain/agents.test.d.ts +2 -0
  5. package/harness/langchain/agents.test.ts +0 -1
  6. package/harness/langchain/agents.ts +196 -13
  7. package/harness/langchain/checkpointer.d.ts +48 -0
  8. package/harness/langchain/checkpointer.test.d.ts +8 -0
  9. package/harness/langchain/cron-cli.d.ts +12 -0
  10. package/harness/langchain/cron-cli.ts +169 -0
  11. package/harness/langchain/daemon.d.ts +161 -0
  12. package/harness/langchain/daemon.test.d.ts +11 -0
  13. package/harness/langchain/daemon.test.ts +62 -5
  14. package/harness/langchain/daemon.ts +231 -12
  15. package/harness/langchain/file-tools.d.ts +97 -0
  16. package/harness/langchain/file-tools.ts +29 -11
  17. package/harness/langchain/graph.d.ts +706 -0
  18. package/harness/langchain/graph.ts +184 -26
  19. package/harness/langchain/model-router.d.ts +63 -0
  20. package/harness/langchain/model-router.test.d.ts +2 -0
  21. package/harness/langchain/model-router.test.ts +191 -0
  22. package/harness/langchain/model-router.ts +188 -0
  23. package/harness/langchain/models.d.ts +72 -0
  24. package/harness/langchain/models.ts +111 -49
  25. package/harness/langchain/ping-pong-middleware.d.ts +28 -0
  26. package/harness/langchain/ping-pong-middleware.test.d.ts +2 -0
  27. package/harness/langchain/ping-pong-middleware.test.ts +69 -0
  28. package/harness/langchain/ping-pong-middleware.ts +204 -0
  29. package/harness/langchain/run.d.ts +15 -0
  30. package/harness/langchain/run.ts +15 -3
  31. package/harness/langchain/scoreboard.test.d.ts +13 -0
  32. package/harness/langchain/scoreboard.test.ts +28 -5
  33. package/harness/langchain/status-line.d.ts +91 -0
  34. package/harness/langchain/status-line.test.d.ts +8 -0
  35. package/harness/langchain/surge.d.ts +103 -0
  36. package/harness/langchain/surge.test.d.ts +10 -0
  37. package/harness/langchain/surge.test.ts +179 -0
  38. package/harness/langchain/surge.ts +188 -19
  39. package/harness/langchain/widget.d.ts +105 -0
  40. package/harness/langchain/widget.test.d.ts +8 -0
  41. package/harness/ssh-detach-interceptor.test.ts +263 -0
  42. package/harness/ssh-detach-interceptor.ts +438 -0
  43. package/index.ts +212 -47
  44. package/package.json +4 -2
  45. package/packages/a2a-adapter/package.json +1 -1
  46. package/packages/architecture-generator/package.json +1 -1
  47. package/packages/auth/package.json +1 -1
  48. package/packages/autonomous-refactor/package.json +1 -1
  49. package/packages/autonomous-runtime/package.json +1 -1
  50. package/packages/cache-strategy/package.json +1 -1
  51. package/packages/capability-registry/package.json +1 -1
  52. package/packages/checkpoint/package.json +1 -1
  53. package/packages/cli-plugin-sdk/package.json +1 -1
  54. package/packages/clipboard/package.json +1 -1
  55. package/packages/clipboard-plugin/package.json +1 -1
  56. package/packages/code-generation/package.json +1 -1
  57. package/packages/code-review/package.json +1 -1
  58. package/packages/codex-adapter/package.json +1 -1
  59. package/packages/config-capture/package.json +1 -1
  60. package/packages/context-compiler/package.json +1 -1
  61. package/packages/context-discovery/package.json +1 -1
  62. package/packages/context-manager/package.json +1 -1
  63. package/packages/cookie-sanitizer/package.json +1 -1
  64. package/packages/cost-optimizer/package.json +1 -1
  65. package/packages/dependency-analyzer/package.json +1 -1
  66. package/packages/django-plugin/package.json +1 -1
  67. package/packages/doc-generator/package.json +1 -1
  68. package/packages/evaluation-engine/package.json +1 -1
  69. package/packages/evaluation-runner/package.json +1 -1
  70. package/packages/event-bus/package.json +1 -1
  71. package/packages/event-store/package.json +1 -1
  72. package/packages/experience-replay/package.json +1 -1
  73. package/packages/feedback-collector/package.json +1 -1
  74. package/packages/file-copy-helper/package.json +1 -1
  75. package/packages/framework-detector/package.json +1 -1
  76. package/packages/framework-plugin-sdk/package.json +1 -1
  77. package/packages/frappe-plugin/package.json +1 -1
  78. package/packages/generic-web-plugin/package.json +1 -1
  79. package/packages/health-monitor/package.json +1 -1
  80. package/packages/intent-analyzer/dist/src/index.d.ts +2 -0
  81. package/packages/intent-analyzer/dist/src/index.d.ts.map +1 -1
  82. package/packages/intent-analyzer/dist/src/index.js +1 -0
  83. package/packages/intent-analyzer/dist/src/index.js.map +1 -1
  84. package/packages/intent-analyzer/dist/src/ping-pong.d.ts +56 -0
  85. package/packages/intent-analyzer/dist/src/ping-pong.d.ts.map +1 -0
  86. package/packages/intent-analyzer/dist/src/ping-pong.js +286 -0
  87. package/packages/intent-analyzer/dist/src/ping-pong.js.map +1 -0
  88. package/packages/intent-analyzer/package.json +1 -1
  89. package/packages/intent-analyzer/src/index.ts +13 -0
  90. package/packages/intent-analyzer/src/ping-pong.ts +387 -0
  91. package/packages/intent-analyzer/test/ping-pong.test.ts +96 -0
  92. package/packages/jev-judge/README.md +234 -0
  93. package/packages/jev-judge/dist/decision-engine.d.ts +100 -0
  94. package/packages/jev-judge/dist/decision-engine.d.ts.map +1 -0
  95. package/packages/jev-judge/dist/decision-engine.js +151 -0
  96. package/packages/jev-judge/dist/decision-engine.js.map +1 -0
  97. package/packages/jev-judge/dist/e2e-judge.d.ts +61 -0
  98. package/packages/jev-judge/dist/e2e-judge.d.ts.map +1 -0
  99. package/packages/jev-judge/dist/e2e-judge.js +268 -0
  100. package/packages/jev-judge/dist/e2e-judge.js.map +1 -0
  101. package/packages/jev-judge/dist/flaky-detector.d.ts +34 -0
  102. package/packages/jev-judge/dist/flaky-detector.d.ts.map +1 -0
  103. package/packages/jev-judge/dist/flaky-detector.js +154 -0
  104. package/packages/jev-judge/dist/flaky-detector.js.map +1 -0
  105. package/packages/jev-judge/dist/index.d.ts +77 -0
  106. package/packages/jev-judge/dist/index.d.ts.map +1 -0
  107. package/packages/jev-judge/dist/index.js +271 -0
  108. package/packages/jev-judge/dist/index.js.map +1 -0
  109. package/packages/jev-judge/dist/types.d.ts +97 -0
  110. package/packages/jev-judge/dist/types.d.ts.map +1 -0
  111. package/packages/jev-judge/dist/types.js +8 -0
  112. package/packages/jev-judge/dist/types.js.map +1 -0
  113. package/packages/jev-judge/package.json +46 -0
  114. package/packages/jev-judge/src/decision-engine.ts +231 -0
  115. package/packages/jev-judge/src/e2e-judge.ts +364 -0
  116. package/packages/jev-judge/src/flaky-detector.ts +190 -0
  117. package/packages/jev-judge/src/index.ts +345 -0
  118. package/packages/jev-judge/src/types.ts +131 -0
  119. package/packages/knowledge-graph/package.json +1 -1
  120. package/packages/knowledge-retrieval/package.json +1 -1
  121. package/packages/laravel-plugin/package.json +1 -1
  122. package/packages/learning-engine/package.json +1 -1
  123. package/packages/mcp-adapter/package.json +1 -1
  124. package/packages/memory-engine/package.json +1 -1
  125. package/packages/milestone-manager/package.json +1 -1
  126. package/packages/model-registry/package.json +1 -1
  127. package/packages/nextjs-plugin/package.json +1 -1
  128. package/packages/notification/package.json +1 -1
  129. package/packages/observability/package.json +1 -1
  130. package/packages/okf-indexer/package.json +1 -1
  131. package/packages/performance-optimizer/package.json +1 -1
  132. package/packages/privilege-broker/package.json +1 -1
  133. package/packages/project-analyzer/package.json +1 -1
  134. package/packages/project-bootstrap/package.json +1 -1
  135. package/packages/projection-engine/package.json +1 -1
  136. package/packages/prompt-compiler/package.json +1 -1
  137. package/packages/prompt-versioning/package.json +1 -1
  138. package/packages/provider-adapter-sdk/package.json +1 -1
  139. package/packages/provider-router/package.json +1 -1
  140. package/packages/provider-selector/package.json +1 -1
  141. package/packages/providers/package.json +1 -1
  142. package/packages/quota-manager/package.json +1 -1
  143. package/packages/rate-limiter/package.json +1 -1
  144. package/packages/react-vite-plugin/package.json +1 -1
  145. package/packages/release-manager/package.json +1 -1
  146. package/packages/requirement-compiler/package.json +1 -1
  147. package/packages/runtime/package.json +1 -1
  148. package/packages/scheduler/package.json +1 -1
  149. package/packages/scheduler-adapter/package.json +1 -1
  150. package/packages/session/package.json +1 -1
  151. package/packages/session-api/package.json +1 -1
  152. package/packages/session-export/package.json +1 -1
  153. package/packages/shared-context/package.json +1 -1
  154. package/packages/skill-mcp-client/package.json +1 -1
  155. package/packages/skill-registry/package.json +1 -1
  156. package/packages/sprint-planner/package.json +1 -1
  157. package/packages/subscription-engine/package.json +1 -1
  158. package/packages/task-compiler/package.json +1 -1
  159. package/packages/tencentdb-memory/package.json +1 -1
  160. package/packages/tencentdb-sync/package.json +1 -1
  161. package/packages/test-data-generator/package.json +1 -1
  162. package/packages/test-generator/package.json +1 -1
  163. package/packages/todo-bd-sync/README.md +71 -0
  164. package/packages/todo-bd-sync/package.json +1 -1
  165. package/packages/todo-bd-sync/src/extension.ts +16 -1
  166. package/packages/token-estimation/package.json +1 -1
  167. package/packages/token-optimizer/package.json +1 -1
  168. package/packages/trajectory/dist/src/approved-patterns.d.ts +51 -0
  169. package/packages/trajectory/dist/src/approved-patterns.d.ts.map +1 -0
  170. package/packages/trajectory/dist/src/approved-patterns.js +134 -0
  171. package/packages/trajectory/dist/src/approved-patterns.js.map +1 -0
  172. package/packages/trajectory/dist/src/index.d.ts +13 -0
  173. package/packages/trajectory/dist/src/index.d.ts.map +1 -0
  174. package/packages/trajectory/dist/src/index.js +12 -0
  175. package/packages/trajectory/dist/src/index.js.map +1 -0
  176. package/packages/trajectory/dist/src/store.d.ts +69 -0
  177. package/packages/trajectory/dist/src/store.d.ts.map +1 -0
  178. package/packages/trajectory/dist/src/store.js +253 -0
  179. package/packages/trajectory/dist/src/store.js.map +1 -0
  180. package/packages/trajectory/dist/src/types.d.ts +73 -0
  181. package/packages/trajectory/dist/src/types.d.ts.map +1 -0
  182. package/packages/trajectory/dist/src/types.js +9 -0
  183. package/packages/trajectory/dist/src/types.js.map +1 -0
  184. package/packages/trajectory/dist/test/store.test.d.ts +2 -0
  185. package/packages/trajectory/dist/test/store.test.d.ts.map +1 -0
  186. package/packages/trajectory/dist/test/store.test.js +228 -0
  187. package/packages/trajectory/dist/test/store.test.js.map +1 -0
  188. package/packages/trajectory/package.json +29 -0
  189. package/packages/trajectory/src/approved-patterns.ts +180 -0
  190. package/packages/trajectory/src/index.ts +26 -0
  191. package/packages/trajectory/src/store.ts +285 -0
  192. package/packages/trajectory/src/types.ts +84 -0
  193. package/packages/trajectory/test/store.test.d.ts +2 -0
  194. package/packages/trajectory/test/store.test.ts +250 -0
  195. package/packages/tui/package.json +1 -1
  196. package/packages/types/package.json +1 -1
  197. package/packages/workflow-events/package.json +1 -1
  198. package/packages/workspace-scanner/package.json +1 -1
  199. package/packages/worktree/package.json +1 -1
  200. package/packages/write-review/package.json +1 -1
  201. package/packages/write-review/src/blackboard.ts +38 -5
  202. package/packages/write-review/src/types.ts +13 -0
  203. 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":"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"}
@@ -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"}