@pedrocivita/tocket 2.5.0 → 2.6.4
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/README.md +233 -18
- package/dist/commands/agents-md.cmd.d.ts +2 -0
- package/dist/commands/agents-md.cmd.js +166 -0
- package/dist/commands/agents-md.cmd.js.map +1 -0
- package/dist/commands/decide.cmd.d.ts +2 -0
- package/dist/commands/decide.cmd.js +70 -0
- package/dist/commands/decide.cmd.js.map +1 -0
- package/dist/commands/doctor.cmd.d.ts +13 -0
- package/dist/commands/doctor.cmd.js +135 -11
- package/dist/commands/doctor.cmd.js.map +1 -1
- package/dist/commands/eject.cmd.d.ts +1 -1
- package/dist/commands/eject.cmd.js +3 -1
- package/dist/commands/eject.cmd.js.map +1 -1
- package/dist/commands/init.cmd.js +67 -13
- package/dist/commands/init.cmd.js.map +1 -1
- package/dist/commands/scaffold.cmd.d.ts +2 -0
- package/dist/commands/scaffold.cmd.js +118 -0
- package/dist/commands/scaffold.cmd.js.map +1 -0
- package/dist/commands/suite.cmd.d.ts +2 -0
- package/dist/commands/suite.cmd.js +387 -0
- package/dist/commands/suite.cmd.js.map +1 -0
- package/dist/commands/validate.cmd.js +1 -0
- package/dist/commands/validate.cmd.js.map +1 -1
- package/dist/commands/work.cmd.d.ts +2 -0
- package/dist/commands/work.cmd.js +48 -0
- package/dist/commands/work.cmd.js.map +1 -0
- package/dist/eval/decide-eval.d.ts +28 -0
- package/dist/eval/decide-eval.js +34 -0
- package/dist/eval/decide-eval.js.map +1 -0
- package/dist/eval/triage-eval.d.ts +46 -0
- package/dist/eval/triage-eval.js +175 -0
- package/dist/eval/triage-eval.js.map +1 -0
- package/dist/index.js +11 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/index.d.ts +2 -0
- package/dist/mcp/index.js +7 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +4 -0
- package/dist/mcp/server.js +360 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/templates/memory-bank.d.ts +11 -0
- package/dist/templates/memory-bank.js +456 -329
- package/dist/templates/memory-bank.js.map +1 -1
- package/dist/tests/agents.test.js +73 -1
- package/dist/tests/agents.test.js.map +1 -1
- package/dist/tests/context.test.js +10 -1
- package/dist/tests/context.test.js.map +1 -1
- package/dist/tests/decide.test.d.ts +1 -0
- package/dist/tests/decide.test.js +483 -0
- package/dist/tests/decide.test.js.map +1 -0
- package/dist/tests/doctor.test.js +74 -1
- package/dist/tests/doctor.test.js.map +1 -1
- package/dist/tests/eject.test.js +3 -0
- package/dist/tests/eject.test.js.map +1 -1
- package/dist/tests/git.test.js +17 -0
- package/dist/tests/git.test.js.map +1 -1
- package/dist/tests/helpers.d.ts +6 -0
- package/dist/tests/helpers.js +13 -0
- package/dist/tests/helpers.js.map +1 -0
- package/dist/tests/helpers.test.d.ts +1 -0
- package/dist/tests/helpers.test.js +23 -0
- package/dist/tests/helpers.test.js.map +1 -0
- package/dist/tests/init.test.js +85 -5
- package/dist/tests/init.test.js.map +1 -1
- package/dist/tests/loop.test.d.ts +1 -0
- package/dist/tests/loop.test.js +153 -0
- package/dist/tests/loop.test.js.map +1 -0
- package/dist/tests/memory-bank.test.js +53 -1
- package/dist/tests/memory-bank.test.js.map +1 -1
- package/dist/tests/suite.test.d.ts +1 -0
- package/dist/tests/suite.test.js +199 -0
- package/dist/tests/suite.test.js.map +1 -0
- package/dist/tests/triage.test.d.ts +1 -0
- package/dist/tests/triage.test.js +152 -0
- package/dist/tests/triage.test.js.map +1 -0
- package/dist/tests/work.test.d.ts +1 -0
- package/dist/tests/work.test.js +276 -0
- package/dist/tests/work.test.js.map +1 -0
- package/dist/utils/agents.d.ts +25 -0
- package/dist/utils/agents.js +92 -0
- package/dist/utils/agents.js.map +1 -1
- package/dist/utils/appmaps.d.ts +65 -0
- package/dist/utils/appmaps.js +280 -0
- package/dist/utils/appmaps.js.map +1 -0
- package/dist/utils/context.d.ts +2 -0
- package/dist/utils/context.js +21 -0
- package/dist/utils/context.js.map +1 -1
- package/dist/utils/decide.d.ts +178 -0
- package/dist/utils/decide.js +614 -0
- package/dist/utils/decide.js.map +1 -0
- package/dist/utils/git.js +8 -1
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/jev.d.ts +83 -0
- package/dist/utils/jev.js +190 -0
- package/dist/utils/jev.js.map +1 -0
- package/dist/utils/triage.d.ts +87 -0
- package/dist/utils/triage.js +241 -0
- package/dist/utils/triage.js.map +1 -0
- package/dist/utils/work.d.ts +72 -0
- package/dist/utils/work.js +225 -0
- package/dist/utils/work.js.map +1 -0
- package/package.json +53 -50
package/dist/utils/git.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/** Thin TypeSafe System One (Jev) client. No SDK dependency. */
|
|
2
|
+
export declare const JEV_SYSTEMONE_URL = "https://api.typesafe.ai/v1/systemone";
|
|
3
|
+
export declare const JEV_MODEL = "jev-latest";
|
|
4
|
+
export declare const TRIAGE_CHOICES: readonly ["retry", "escalate", "ignore", "rewrite-locator"];
|
|
5
|
+
export type TriageChoice = (typeof TRIAGE_CHOICES)[number];
|
|
6
|
+
export declare const TRIAGE_CHOICE_CRITERIA: Record<TriageChoice, string>;
|
|
7
|
+
export interface JevTriageAnswers {
|
|
8
|
+
choice: TriageChoice;
|
|
9
|
+
confidence: number;
|
|
10
|
+
locatorDrift: number;
|
|
11
|
+
model: string;
|
|
12
|
+
probabilities?: Record<string, number>;
|
|
13
|
+
}
|
|
14
|
+
export interface JevAskOptions {
|
|
15
|
+
apiKey: string;
|
|
16
|
+
state: unknown;
|
|
17
|
+
fetchImpl?: typeof fetch;
|
|
18
|
+
timeoutMs?: number;
|
|
19
|
+
}
|
|
20
|
+
export interface JevChoiceQuestion {
|
|
21
|
+
type: "choice";
|
|
22
|
+
instructions?: string;
|
|
23
|
+
criteria: Record<string, string>;
|
|
24
|
+
}
|
|
25
|
+
export interface JevNoulQuestion {
|
|
26
|
+
type: "noul";
|
|
27
|
+
instructions?: string;
|
|
28
|
+
criteria?: Record<string, string>;
|
|
29
|
+
}
|
|
30
|
+
export interface JevScoreQuestion {
|
|
31
|
+
type: "score";
|
|
32
|
+
instructions?: string;
|
|
33
|
+
min?: number;
|
|
34
|
+
max?: number;
|
|
35
|
+
criteria?: Record<string, string>;
|
|
36
|
+
}
|
|
37
|
+
export type JevQuestion = JevChoiceQuestion | JevNoulQuestion | JevScoreQuestion;
|
|
38
|
+
export interface JevChoiceAnswer {
|
|
39
|
+
type: "choice";
|
|
40
|
+
choice: string;
|
|
41
|
+
confidence: number;
|
|
42
|
+
probabilities?: Record<string, number>;
|
|
43
|
+
}
|
|
44
|
+
export interface JevNoulAnswer {
|
|
45
|
+
type: "noul";
|
|
46
|
+
noul: number;
|
|
47
|
+
confidence: number;
|
|
48
|
+
}
|
|
49
|
+
export interface JevScoreAnswer {
|
|
50
|
+
type: "score";
|
|
51
|
+
score: number;
|
|
52
|
+
confidence: number;
|
|
53
|
+
}
|
|
54
|
+
export type JevAnswer = JevChoiceAnswer | JevNoulAnswer | JevScoreAnswer;
|
|
55
|
+
export interface PostJevOptions {
|
|
56
|
+
apiKey: string;
|
|
57
|
+
state: unknown;
|
|
58
|
+
questions: Record<string, unknown>;
|
|
59
|
+
fetchImpl?: typeof fetch;
|
|
60
|
+
timeoutMs?: number;
|
|
61
|
+
model?: string;
|
|
62
|
+
}
|
|
63
|
+
export interface JevResponse {
|
|
64
|
+
model: string;
|
|
65
|
+
answers: Record<string, unknown>;
|
|
66
|
+
raw: Record<string, unknown>;
|
|
67
|
+
}
|
|
68
|
+
export declare class JevRequestError extends Error {
|
|
69
|
+
constructor(message: string);
|
|
70
|
+
}
|
|
71
|
+
export declare function buildTriageQuestions(): Record<string, unknown>;
|
|
72
|
+
/** POST state + questions to TypeSafe System One. */
|
|
73
|
+
export declare function postJev(options: PostJevOptions): Promise<JevResponse>;
|
|
74
|
+
/** Call Jev with arbitrary Choice / Noul questions. */
|
|
75
|
+
export declare function askJev(options: PostJevOptions & {
|
|
76
|
+
questions: Record<string, JevQuestion>;
|
|
77
|
+
}): Promise<{
|
|
78
|
+
model: string;
|
|
79
|
+
answers: Record<string, JevAnswer>;
|
|
80
|
+
}>;
|
|
81
|
+
/** Call Jev Choice + optional Noul for one triage case. */
|
|
82
|
+
export declare function askJevTriage(options: JevAskOptions): Promise<JevTriageAnswers>;
|
|
83
|
+
export declare function readTypesafeApiKey(env?: NodeJS.ProcessEnv): string | undefined;
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
/** Thin TypeSafe System One (Jev) client. No SDK dependency. */
|
|
2
|
+
export const JEV_SYSTEMONE_URL = "https://api.typesafe.ai/v1/systemone";
|
|
3
|
+
export const JEV_MODEL = "jev-latest";
|
|
4
|
+
export const TRIAGE_CHOICES = [
|
|
5
|
+
"retry",
|
|
6
|
+
"escalate",
|
|
7
|
+
"ignore",
|
|
8
|
+
"rewrite-locator",
|
|
9
|
+
];
|
|
10
|
+
export const TRIAGE_CHOICE_CRITERIA = {
|
|
11
|
+
retry: "Transient flake, navigation timeout, connection reset, or HTTP 5xx. Re-run the same goal without changing the map.",
|
|
12
|
+
escalate: "Real product or assertion failure, empty error, or unknown failure that needs a human.",
|
|
13
|
+
ignore: "Benign noise, known warning, or a pass (including low-confidence) that does not need action.",
|
|
14
|
+
"rewrite-locator": "Selector or locator drift: missing element, stale node, strict-mode violation, or timeout waiting for a locator.",
|
|
15
|
+
};
|
|
16
|
+
export class JevRequestError extends Error {
|
|
17
|
+
constructor(message) {
|
|
18
|
+
super(message);
|
|
19
|
+
this.name = "JevRequestError";
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function isRecord(value) {
|
|
23
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
24
|
+
}
|
|
25
|
+
function isTriageChoice(value) {
|
|
26
|
+
return typeof value === "string" && TRIAGE_CHOICES.includes(value);
|
|
27
|
+
}
|
|
28
|
+
function parseNamedChoice(value, allowed) {
|
|
29
|
+
if (!isRecord(value)) {
|
|
30
|
+
throw new JevRequestError("Jev action answer is not an object");
|
|
31
|
+
}
|
|
32
|
+
const choice = value.choice;
|
|
33
|
+
if (typeof choice !== "string" || !allowed.includes(choice)) {
|
|
34
|
+
throw new JevRequestError(`Jev returned unknown choice: ${String(choice)}`);
|
|
35
|
+
}
|
|
36
|
+
const confidence = typeof value.confidence === "number" && Number.isFinite(value.confidence)
|
|
37
|
+
? value.confidence
|
|
38
|
+
: 0;
|
|
39
|
+
const probabilities = isRecord(value.probabilities)
|
|
40
|
+
? Object.fromEntries(Object.entries(value.probabilities).filter((entry) => typeof entry[1] === "number"))
|
|
41
|
+
: undefined;
|
|
42
|
+
return { choice, confidence, probabilities };
|
|
43
|
+
}
|
|
44
|
+
function parseChoiceAnswer(value) {
|
|
45
|
+
const parsed = parseNamedChoice(value, TRIAGE_CHOICES);
|
|
46
|
+
if (!isTriageChoice(parsed.choice)) {
|
|
47
|
+
throw new JevRequestError(`Jev returned unknown choice: ${parsed.choice}`);
|
|
48
|
+
}
|
|
49
|
+
return { choice: parsed.choice, confidence: parsed.confidence, probabilities: parsed.probabilities };
|
|
50
|
+
}
|
|
51
|
+
function parseNoulAnswer(value) {
|
|
52
|
+
if (typeof value === "number" && Number.isFinite(value))
|
|
53
|
+
return value;
|
|
54
|
+
if (isRecord(value) && typeof value.noul === "number" && Number.isFinite(value.noul)) {
|
|
55
|
+
return value.noul;
|
|
56
|
+
}
|
|
57
|
+
return 0;
|
|
58
|
+
}
|
|
59
|
+
function parseScoreAnswer(value) {
|
|
60
|
+
if (typeof value === "number" && Number.isFinite(value))
|
|
61
|
+
return value;
|
|
62
|
+
if (isRecord(value) && typeof value.score === "number" && Number.isFinite(value.score)) {
|
|
63
|
+
return value.score;
|
|
64
|
+
}
|
|
65
|
+
return 0;
|
|
66
|
+
}
|
|
67
|
+
function answerConfidence(value, fallback) {
|
|
68
|
+
if (isRecord(value) && typeof value.confidence === "number" && Number.isFinite(value.confidence)) {
|
|
69
|
+
return value.confidence;
|
|
70
|
+
}
|
|
71
|
+
return fallback;
|
|
72
|
+
}
|
|
73
|
+
export function buildTriageQuestions() {
|
|
74
|
+
return {
|
|
75
|
+
action: {
|
|
76
|
+
type: "choice",
|
|
77
|
+
instructions: "What should a suite maintainer do about this AppMap goal result? Pick one action.",
|
|
78
|
+
criteria: TRIAGE_CHOICE_CRITERIA,
|
|
79
|
+
},
|
|
80
|
+
locator_drift: {
|
|
81
|
+
type: "noul",
|
|
82
|
+
instructions: "Is this a locator drift (selector changed, element missing, stale node, or wait-for-locator timeout)?",
|
|
83
|
+
criteria: {
|
|
84
|
+
true: "The failure is explained by a broken or drifted locator or selector.",
|
|
85
|
+
false: "The failure is not locator-related.",
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/** POST state + questions to TypeSafe System One. */
|
|
91
|
+
export async function postJev(options) {
|
|
92
|
+
const fetchImpl = options.fetchImpl ?? fetch;
|
|
93
|
+
const timeoutMs = options.timeoutMs ?? 20_000;
|
|
94
|
+
const controller = new AbortController();
|
|
95
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
96
|
+
const model = options.model ?? JEV_MODEL;
|
|
97
|
+
let response;
|
|
98
|
+
try {
|
|
99
|
+
response = await fetchImpl(JEV_SYSTEMONE_URL, {
|
|
100
|
+
method: "POST",
|
|
101
|
+
headers: {
|
|
102
|
+
Authorization: `Bearer ${options.apiKey}`,
|
|
103
|
+
"Content-Type": "application/json",
|
|
104
|
+
},
|
|
105
|
+
body: JSON.stringify({
|
|
106
|
+
model,
|
|
107
|
+
state: options.state,
|
|
108
|
+
questions: options.questions,
|
|
109
|
+
}),
|
|
110
|
+
signal: controller.signal,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
115
|
+
throw new JevRequestError(`Jev request failed: ${message}`);
|
|
116
|
+
}
|
|
117
|
+
finally {
|
|
118
|
+
clearTimeout(timer);
|
|
119
|
+
}
|
|
120
|
+
if (!response.ok) {
|
|
121
|
+
const body = await response.text().catch(() => "");
|
|
122
|
+
throw new JevRequestError(`Jev HTTP ${response.status}${body ? `: ${body.slice(0, 240)}` : ""}`);
|
|
123
|
+
}
|
|
124
|
+
const payload = await response.json();
|
|
125
|
+
if (!isRecord(payload)) {
|
|
126
|
+
throw new JevRequestError("Jev response is not an object");
|
|
127
|
+
}
|
|
128
|
+
const answers = isRecord(payload.answers) ? payload.answers : payload;
|
|
129
|
+
const resolvedModel = typeof payload.model === "string" ? payload.model : model;
|
|
130
|
+
return { model: resolvedModel, answers, raw: payload };
|
|
131
|
+
}
|
|
132
|
+
/** Call Jev with arbitrary Choice / Noul questions. */
|
|
133
|
+
export async function askJev(options) {
|
|
134
|
+
const payload = await postJev(options);
|
|
135
|
+
const answers = {};
|
|
136
|
+
for (const [name, question] of Object.entries(options.questions)) {
|
|
137
|
+
const raw = payload.answers[name];
|
|
138
|
+
if (raw === undefined) {
|
|
139
|
+
throw new JevRequestError(`Jev response missing answer for "${name}"`);
|
|
140
|
+
}
|
|
141
|
+
if (question.type === "choice") {
|
|
142
|
+
const parsed = parseNamedChoice(raw, Object.keys(question.criteria));
|
|
143
|
+
answers[name] = {
|
|
144
|
+
type: "choice",
|
|
145
|
+
choice: parsed.choice,
|
|
146
|
+
confidence: parsed.confidence,
|
|
147
|
+
probabilities: parsed.probabilities,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
else if (question.type === "noul") {
|
|
151
|
+
answers[name] = {
|
|
152
|
+
type: "noul",
|
|
153
|
+
noul: parseNoulAnswer(raw),
|
|
154
|
+
confidence: answerConfidence(raw, 0.7),
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
answers[name] = {
|
|
159
|
+
type: "score",
|
|
160
|
+
score: parseScoreAnswer(raw),
|
|
161
|
+
confidence: answerConfidence(raw, 0.7),
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return { model: payload.model, answers };
|
|
166
|
+
}
|
|
167
|
+
/** Call Jev Choice + optional Noul for one triage case. */
|
|
168
|
+
export async function askJevTriage(options) {
|
|
169
|
+
const payload = await postJev({
|
|
170
|
+
apiKey: options.apiKey,
|
|
171
|
+
state: options.state,
|
|
172
|
+
questions: buildTriageQuestions(),
|
|
173
|
+
fetchImpl: options.fetchImpl,
|
|
174
|
+
timeoutMs: options.timeoutMs,
|
|
175
|
+
});
|
|
176
|
+
const parsed = parseChoiceAnswer(payload.answers.action);
|
|
177
|
+
const locatorDrift = parseNoulAnswer(payload.answers.locator_drift);
|
|
178
|
+
return {
|
|
179
|
+
choice: parsed.choice,
|
|
180
|
+
confidence: parsed.confidence,
|
|
181
|
+
locatorDrift,
|
|
182
|
+
model: payload.model,
|
|
183
|
+
probabilities: parsed.probabilities,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
export function readTypesafeApiKey(env = process.env) {
|
|
187
|
+
const key = env.TYPESAFE_API_KEY?.trim();
|
|
188
|
+
return key ? key : undefined;
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=jev.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jev.js","sourceRoot":"","sources":["../../src/utils/jev.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { type LastRun, type LastRunResult } from "./appmaps.js";
|
|
2
|
+
import { type TriageChoice } from "./jev.js";
|
|
3
|
+
export declare const TRIAGE_SCHEMA = "tocket.appmaps.triage/v0";
|
|
4
|
+
export declare const LOW_CONFIDENCE_THRESHOLD = 0.6;
|
|
5
|
+
export declare const HEURISTIC_MODEL = "heuristic-v0";
|
|
6
|
+
export type { TriageChoice };
|
|
7
|
+
export type TriageMode = "heuristic" | "jev" | "dry-run";
|
|
8
|
+
export type TriageSource = "heuristic" | "jev";
|
|
9
|
+
export interface TriageCase {
|
|
10
|
+
id: string;
|
|
11
|
+
name: string;
|
|
12
|
+
ok: boolean;
|
|
13
|
+
error: string | null;
|
|
14
|
+
jev_confidence: number | null;
|
|
15
|
+
choice: TriageChoice;
|
|
16
|
+
confidence: number;
|
|
17
|
+
locator_drift: number;
|
|
18
|
+
rationale: string;
|
|
19
|
+
source: TriageSource;
|
|
20
|
+
}
|
|
21
|
+
export interface TriageReport {
|
|
22
|
+
schema: typeof TRIAGE_SCHEMA;
|
|
23
|
+
app: string;
|
|
24
|
+
map: string;
|
|
25
|
+
source: string;
|
|
26
|
+
generated_at: string;
|
|
27
|
+
mode: TriageMode;
|
|
28
|
+
model: string;
|
|
29
|
+
include_low_confidence: boolean;
|
|
30
|
+
cases: TriageCase[];
|
|
31
|
+
}
|
|
32
|
+
export interface HeuristicJudgment {
|
|
33
|
+
choice: TriageChoice;
|
|
34
|
+
confidence: number;
|
|
35
|
+
locatorDrift: number;
|
|
36
|
+
rationale: string;
|
|
37
|
+
}
|
|
38
|
+
export interface TriageInput {
|
|
39
|
+
id: string;
|
|
40
|
+
name: string;
|
|
41
|
+
ok: boolean;
|
|
42
|
+
error?: string | null;
|
|
43
|
+
evidence?: unknown;
|
|
44
|
+
jev_confidence?: number | null;
|
|
45
|
+
notes?: string;
|
|
46
|
+
}
|
|
47
|
+
export interface RunTriageOptions {
|
|
48
|
+
fromPath: string;
|
|
49
|
+
cwd: string;
|
|
50
|
+
mapPath?: string;
|
|
51
|
+
notes?: string;
|
|
52
|
+
includeLowConfidence?: boolean;
|
|
53
|
+
dryRun?: boolean;
|
|
54
|
+
outPath?: string;
|
|
55
|
+
apiKey?: string | null;
|
|
56
|
+
now?: () => string;
|
|
57
|
+
fetchImpl?: typeof fetch;
|
|
58
|
+
}
|
|
59
|
+
export declare function evidenceText(evidence: unknown): string;
|
|
60
|
+
/** Deterministic flavor classifier. Does not key off fixture ids. */
|
|
61
|
+
export declare function heuristicJudge(input: TriageInput): HeuristicJudgment;
|
|
62
|
+
/** Naive baseline used by the eval kill check: fail → escalate, pass → ignore. */
|
|
63
|
+
export declare function naiveIfElseChoice(input: Pick<TriageInput, "ok">): TriageChoice;
|
|
64
|
+
export declare function shouldTriage(result: LastRunResult, includeLowConfidence: boolean): boolean;
|
|
65
|
+
export declare function selectResults(run: LastRun, includeLowConfidence: boolean): LastRunResult[];
|
|
66
|
+
export declare function heuristicCase(result: LastRunResult, notes?: string): TriageCase;
|
|
67
|
+
export declare function judgeResult(result: LastRunResult, options: {
|
|
68
|
+
notes?: string;
|
|
69
|
+
mapExcerpt?: string;
|
|
70
|
+
apiKey?: string;
|
|
71
|
+
fetchImpl?: typeof fetch;
|
|
72
|
+
}): Promise<TriageCase>;
|
|
73
|
+
export declare function triageOutputPath(cwd: string, app: string, outPath?: string): string;
|
|
74
|
+
export declare function buildTriageReport(args: {
|
|
75
|
+
run: LastRun;
|
|
76
|
+
cases: TriageCase[];
|
|
77
|
+
source: string;
|
|
78
|
+
mode: TriageMode;
|
|
79
|
+
model: string;
|
|
80
|
+
includeLowConfidence: boolean;
|
|
81
|
+
generatedAt: string;
|
|
82
|
+
}): TriageReport;
|
|
83
|
+
export declare function runTriage(options: RunTriageOptions): Promise<{
|
|
84
|
+
report: TriageReport;
|
|
85
|
+
outPath: string;
|
|
86
|
+
}>;
|
|
87
|
+
export declare function parseTriageReport(raw: string): TriageReport;
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { APPMAPS_DIR, parseLastRun, prettyLastRunJson, } from "./appmaps.js";
|
|
4
|
+
import { JEV_MODEL, askJevTriage, readTypesafeApiKey, } from "./jev.js";
|
|
5
|
+
export const TRIAGE_SCHEMA = "tocket.appmaps.triage/v0";
|
|
6
|
+
export const LOW_CONFIDENCE_THRESHOLD = 0.6;
|
|
7
|
+
export const HEURISTIC_MODEL = "heuristic-v0";
|
|
8
|
+
const LOCATOR_RE = /\b(locator|selector|getby(?:role|text|label|placeholder|testid|title|alttext)?|data-testid|no such element|not found|stale|detached|strict mode violation|unable to locate)\b/i;
|
|
9
|
+
const ASSERT_RE = /\b(assertion(?:error)?|expect(?:ed)?|tohave|tobe|toequal|received|expected\b)/i;
|
|
10
|
+
const TRANSIENT_RE = /\b(timeout|etimedout|timed out|flak(?:y|e)|econnreset|econnrefused|err_connection|net::err_|503|502|504|service unavailable|connection reset)\b/i;
|
|
11
|
+
const NOISE_RE = /\b(resizeobserver|benign|known warning|console warning|pixel diff|screenshot comparison)\b/i;
|
|
12
|
+
function isRecord(value) {
|
|
13
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
14
|
+
}
|
|
15
|
+
export function evidenceText(evidence) {
|
|
16
|
+
if (evidence == null)
|
|
17
|
+
return "";
|
|
18
|
+
if (typeof evidence === "string")
|
|
19
|
+
return evidence;
|
|
20
|
+
try {
|
|
21
|
+
return JSON.stringify(evidence);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return String(evidence);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function blob(input) {
|
|
28
|
+
return [input.error, evidenceText(input.evidence), input.notes]
|
|
29
|
+
.filter((part) => part && part.trim())
|
|
30
|
+
.join("\n")
|
|
31
|
+
.toLowerCase();
|
|
32
|
+
}
|
|
33
|
+
/** Deterministic flavor classifier. Does not key off fixture ids. */
|
|
34
|
+
export function heuristicJudge(input) {
|
|
35
|
+
const text = blob(input);
|
|
36
|
+
if (input.ok) {
|
|
37
|
+
return {
|
|
38
|
+
choice: "ignore",
|
|
39
|
+
confidence: 0.86,
|
|
40
|
+
locatorDrift: 0.08,
|
|
41
|
+
rationale: "Goal passed; no maintainer action.",
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
if (NOISE_RE.test(text)) {
|
|
45
|
+
return {
|
|
46
|
+
choice: "ignore",
|
|
47
|
+
confidence: 0.8,
|
|
48
|
+
locatorDrift: 0.1,
|
|
49
|
+
rationale: "Failure looks like known benign noise.",
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
if (ASSERT_RE.test(text)) {
|
|
53
|
+
return {
|
|
54
|
+
choice: "escalate",
|
|
55
|
+
confidence: 0.88,
|
|
56
|
+
locatorDrift: LOCATOR_RE.test(text) ? 0.35 : 0.12,
|
|
57
|
+
rationale: "Assertion or expect mismatch; treat as a product failure.",
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
if (LOCATOR_RE.test(text)) {
|
|
61
|
+
return {
|
|
62
|
+
choice: "rewrite-locator",
|
|
63
|
+
confidence: 0.9,
|
|
64
|
+
locatorDrift: 0.86,
|
|
65
|
+
rationale: "Selector/locator signal (missing, stale, strict, or wait-for-locator).",
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
if (TRANSIENT_RE.test(text)) {
|
|
69
|
+
return {
|
|
70
|
+
choice: "retry",
|
|
71
|
+
confidence: 0.84,
|
|
72
|
+
locatorDrift: 0.14,
|
|
73
|
+
rationale: "Transient timeout, flake, or connectivity error.",
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
choice: "escalate",
|
|
78
|
+
confidence: 0.7,
|
|
79
|
+
locatorDrift: 0.16,
|
|
80
|
+
rationale: "Failed goal with empty or unknown error; escalate to a human.",
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/** Naive baseline used by the eval kill check: fail → escalate, pass → ignore. */
|
|
84
|
+
export function naiveIfElseChoice(input) {
|
|
85
|
+
return input.ok ? "ignore" : "escalate";
|
|
86
|
+
}
|
|
87
|
+
export function shouldTriage(result, includeLowConfidence) {
|
|
88
|
+
if (!result.ok)
|
|
89
|
+
return true;
|
|
90
|
+
if (!includeLowConfidence)
|
|
91
|
+
return false;
|
|
92
|
+
const confidence = result.jev_confidence;
|
|
93
|
+
return typeof confidence === "number" && confidence < LOW_CONFIDENCE_THRESHOLD;
|
|
94
|
+
}
|
|
95
|
+
export function selectResults(run, includeLowConfidence) {
|
|
96
|
+
return run.results.filter((result) => shouldTriage(result, includeLowConfidence));
|
|
97
|
+
}
|
|
98
|
+
function toInput(result, notes) {
|
|
99
|
+
return {
|
|
100
|
+
id: result.id,
|
|
101
|
+
name: result.name,
|
|
102
|
+
ok: result.ok,
|
|
103
|
+
error: result.error ?? null,
|
|
104
|
+
evidence: result.evidence,
|
|
105
|
+
jev_confidence: result.jev_confidence ?? null,
|
|
106
|
+
notes,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
function fromHeuristic(result, judgment) {
|
|
110
|
+
return {
|
|
111
|
+
id: result.id,
|
|
112
|
+
name: result.name,
|
|
113
|
+
ok: result.ok,
|
|
114
|
+
error: result.error ?? null,
|
|
115
|
+
jev_confidence: result.jev_confidence ?? null,
|
|
116
|
+
choice: judgment.choice,
|
|
117
|
+
confidence: judgment.confidence,
|
|
118
|
+
locator_drift: judgment.locatorDrift,
|
|
119
|
+
rationale: judgment.rationale,
|
|
120
|
+
source: "heuristic",
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
export function heuristicCase(result, notes) {
|
|
124
|
+
return fromHeuristic(result, heuristicJudge(toInput(result, notes)));
|
|
125
|
+
}
|
|
126
|
+
export async function judgeResult(result, options) {
|
|
127
|
+
if (!options.apiKey) {
|
|
128
|
+
return heuristicCase(result, options.notes);
|
|
129
|
+
}
|
|
130
|
+
try {
|
|
131
|
+
const answers = await askJevTriage({
|
|
132
|
+
apiKey: options.apiKey,
|
|
133
|
+
fetchImpl: options.fetchImpl,
|
|
134
|
+
state: {
|
|
135
|
+
goal_id: result.id,
|
|
136
|
+
goal_name: result.name,
|
|
137
|
+
ok: result.ok,
|
|
138
|
+
error: result.error ?? null,
|
|
139
|
+
jev_confidence: result.jev_confidence ?? null,
|
|
140
|
+
evidence: result.evidence ?? null,
|
|
141
|
+
notes: options.notes ?? null,
|
|
142
|
+
map_excerpt: options.mapExcerpt ?? null,
|
|
143
|
+
actions: [
|
|
144
|
+
"retry",
|
|
145
|
+
"escalate",
|
|
146
|
+
"ignore",
|
|
147
|
+
"rewrite-locator",
|
|
148
|
+
],
|
|
149
|
+
},
|
|
150
|
+
});
|
|
151
|
+
return {
|
|
152
|
+
id: result.id,
|
|
153
|
+
name: result.name,
|
|
154
|
+
ok: result.ok,
|
|
155
|
+
error: result.error ?? null,
|
|
156
|
+
jev_confidence: result.jev_confidence ?? null,
|
|
157
|
+
choice: answers.choice,
|
|
158
|
+
confidence: answers.confidence,
|
|
159
|
+
locator_drift: answers.locatorDrift,
|
|
160
|
+
rationale: `Jev Choice=${answers.choice}; locator-drift noul=${answers.locatorDrift.toFixed(2)}.`,
|
|
161
|
+
source: "jev",
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
const fallback = heuristicCase(result, options.notes);
|
|
166
|
+
return {
|
|
167
|
+
...fallback,
|
|
168
|
+
rationale: `${fallback.rationale} (Jev unavailable; heuristic fallback)`,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
export function triageOutputPath(cwd, app, outPath) {
|
|
173
|
+
if (outPath)
|
|
174
|
+
return outPath;
|
|
175
|
+
const slug = app.trim() ? app.trim().replace(/[^a-zA-Z0-9._-]+/g, "-") : "suite";
|
|
176
|
+
return join(cwd, APPMAPS_DIR, `${slug}.triage.json`);
|
|
177
|
+
}
|
|
178
|
+
export function buildTriageReport(args) {
|
|
179
|
+
return {
|
|
180
|
+
schema: TRIAGE_SCHEMA,
|
|
181
|
+
app: args.run.app,
|
|
182
|
+
map: args.run.map,
|
|
183
|
+
source: args.source,
|
|
184
|
+
generated_at: args.generatedAt,
|
|
185
|
+
mode: args.mode,
|
|
186
|
+
model: args.model,
|
|
187
|
+
include_low_confidence: args.includeLowConfidence,
|
|
188
|
+
cases: args.cases,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
function readMapExcerpt(mapPath) {
|
|
192
|
+
if (!mapPath)
|
|
193
|
+
return undefined;
|
|
194
|
+
try {
|
|
195
|
+
const raw = readFileSync(mapPath, "utf-8");
|
|
196
|
+
return raw.length > 4000 ? `${raw.slice(0, 4000)}\n…` : raw;
|
|
197
|
+
}
|
|
198
|
+
catch {
|
|
199
|
+
return undefined;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
export async function runTriage(options) {
|
|
203
|
+
const includeLowConfidence = options.includeLowConfidence === true;
|
|
204
|
+
const dryRun = options.dryRun === true;
|
|
205
|
+
const apiKey = dryRun ? undefined : (options.apiKey === null ? undefined : options.apiKey ?? readTypesafeApiKey());
|
|
206
|
+
const mode = dryRun ? "dry-run" : apiKey ? "jev" : "heuristic";
|
|
207
|
+
const run = parseLastRun(readFileSync(options.fromPath, "utf-8"));
|
|
208
|
+
const selected = selectResults(run, includeLowConfidence);
|
|
209
|
+
const mapExcerpt = readMapExcerpt(options.mapPath);
|
|
210
|
+
const cases = [];
|
|
211
|
+
for (const result of selected) {
|
|
212
|
+
cases.push(await judgeResult(result, {
|
|
213
|
+
notes: options.notes,
|
|
214
|
+
mapExcerpt,
|
|
215
|
+
apiKey,
|
|
216
|
+
fetchImpl: options.fetchImpl,
|
|
217
|
+
}));
|
|
218
|
+
}
|
|
219
|
+
const usedJev = cases.some((item) => item.source === "jev");
|
|
220
|
+
const report = buildTriageReport({
|
|
221
|
+
run,
|
|
222
|
+
cases,
|
|
223
|
+
source: options.fromPath,
|
|
224
|
+
mode,
|
|
225
|
+
model: usedJev ? JEV_MODEL : HEURISTIC_MODEL,
|
|
226
|
+
includeLowConfidence,
|
|
227
|
+
generatedAt: options.now ? options.now() : new Date().toISOString(),
|
|
228
|
+
});
|
|
229
|
+
const outPath = triageOutputPath(options.cwd, run.app, options.outPath);
|
|
230
|
+
mkdirSync(dirname(outPath), { recursive: true });
|
|
231
|
+
writeFileSync(outPath, prettyLastRunJson(report), "utf-8");
|
|
232
|
+
return { report, outPath };
|
|
233
|
+
}
|
|
234
|
+
export function parseTriageReport(raw) {
|
|
235
|
+
const value = JSON.parse(raw);
|
|
236
|
+
if (!isRecord(value) || value.schema !== TRIAGE_SCHEMA || !Array.isArray(value.cases)) {
|
|
237
|
+
throw new Error(`Invalid triage report (expected ${TRIAGE_SCHEMA})`);
|
|
238
|
+
}
|
|
239
|
+
return value;
|
|
240
|
+
}
|
|
241
|
+
//# sourceMappingURL=triage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triage.js","sourceRoot":"","sources":["../../src/utils/triage.ts"],"names":[],"mappings":"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"}
|