@netlify/axis 0.2.0
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 +977 -0
- package/dist/adapters/base/acp-adapter.d.ts +44 -0
- package/dist/adapters/base/acp-adapter.d.ts.map +1 -0
- package/dist/adapters/base/acp-adapter.js +559 -0
- package/dist/adapters/base/acp-adapter.js.map +1 -0
- package/dist/adapters/base/agent-adapter.d.ts +132 -0
- package/dist/adapters/base/agent-adapter.d.ts.map +1 -0
- package/dist/adapters/base/agent-adapter.js +212 -0
- package/dist/adapters/base/agent-adapter.js.map +1 -0
- package/dist/adapters/claude-code.d.ts +3 -0
- package/dist/adapters/claude-code.d.ts.map +1 -0
- package/dist/adapters/claude-code.js +138 -0
- package/dist/adapters/claude-code.js.map +1 -0
- package/dist/adapters/claude-sdk.d.ts +11 -0
- package/dist/adapters/claude-sdk.d.ts.map +1 -0
- package/dist/adapters/claude-sdk.js +46 -0
- package/dist/adapters/claude-sdk.js.map +1 -0
- package/dist/adapters/codex.d.ts +3 -0
- package/dist/adapters/codex.d.ts.map +1 -0
- package/dist/adapters/codex.js +183 -0
- package/dist/adapters/codex.js.map +1 -0
- package/dist/adapters/gemini-acp.d.ts +11 -0
- package/dist/adapters/gemini-acp.d.ts.map +1 -0
- package/dist/adapters/gemini-acp.js +60 -0
- package/dist/adapters/gemini-acp.js.map +1 -0
- package/dist/adapters/gemini.d.ts +3 -0
- package/dist/adapters/gemini.d.ts.map +1 -0
- package/dist/adapters/gemini.js +222 -0
- package/dist/adapters/gemini.js.map +1 -0
- package/dist/adapters/goose.d.ts +3 -0
- package/dist/adapters/goose.d.ts.map +1 -0
- package/dist/adapters/goose.js +9 -0
- package/dist/adapters/goose.js.map +1 -0
- package/dist/adapters/registry.d.ts +7 -0
- package/dist/adapters/registry.d.ts.map +1 -0
- package/dist/adapters/registry.js +37 -0
- package/dist/adapters/registry.js.map +1 -0
- package/dist/adapters/utils/mcp.d.ts +23 -0
- package/dist/adapters/utils/mcp.d.ts.map +1 -0
- package/dist/adapters/utils/mcp.js +114 -0
- package/dist/adapters/utils/mcp.js.map +1 -0
- package/dist/adapters/utils/resolve.d.ts +20 -0
- package/dist/adapters/utils/resolve.d.ts.map +1 -0
- package/dist/adapters/utils/resolve.js +48 -0
- package/dist/adapters/utils/resolve.js.map +1 -0
- package/dist/adapters/utils/skills.d.ts +17 -0
- package/dist/adapters/utils/skills.d.ts.map +1 -0
- package/dist/adapters/utils/skills.js +52 -0
- package/dist/adapters/utils/skills.js.map +1 -0
- package/dist/adapters/utils/token-estimator.d.ts +21 -0
- package/dist/adapters/utils/token-estimator.d.ts.map +1 -0
- package/dist/adapters/utils/token-estimator.js +37 -0
- package/dist/adapters/utils/token-estimator.js.map +1 -0
- package/dist/baselines/diff.d.ts +9 -0
- package/dist/baselines/diff.d.ts.map +1 -0
- package/dist/baselines/diff.js +83 -0
- package/dist/baselines/diff.js.map +1 -0
- package/dist/baselines/index.d.ts +3 -0
- package/dist/baselines/index.d.ts.map +1 -0
- package/dist/baselines/index.js +3 -0
- package/dist/baselines/index.js.map +1 -0
- package/dist/baselines/store.d.ts +19 -0
- package/dist/baselines/store.d.ts.map +1 -0
- package/dist/baselines/store.js +104 -0
- package/dist/baselines/store.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +487 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/loader.d.ts +8 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +99 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/validator.d.ts +11 -0
- package/dist/config/validator.d.ts.map +1 -0
- package/dist/config/validator.js +203 -0
- package/dist/config/validator.js.map +1 -0
- package/dist/docs-site/_astro/cli.DDWZtG0-.css +1 -0
- package/dist/docs-site/cli/index.html +18 -0
- package/dist/docs-site/configuration/index.html +121 -0
- package/dist/docs-site/content-assets.mjs +1 -0
- package/dist/docs-site/content-modules.mjs +1 -0
- package/dist/docs-site/data-store.json +9 -0
- package/dist/docs-site/index.html +69 -0
- package/dist/docs-site/quickstart/index.html +59 -0
- package/dist/docs-site/running/index.html +87 -0
- package/dist/docs-site/scoring/index.html +135 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/report-ui/index.html +291 -0
- package/dist/report-ui/mock-data.json +298 -0
- package/dist/reports/html.d.ts +7 -0
- package/dist/reports/html.d.ts.map +1 -0
- package/dist/reports/html.js +27 -0
- package/dist/reports/html.js.map +1 -0
- package/dist/reports/reader.d.ts +21 -0
- package/dist/reports/reader.d.ts.map +1 -0
- package/dist/reports/reader.js +110 -0
- package/dist/reports/reader.js.map +1 -0
- package/dist/reports/writer.d.ts +14 -0
- package/dist/reports/writer.d.ts.map +1 -0
- package/dist/reports/writer.js +106 -0
- package/dist/reports/writer.js.map +1 -0
- package/dist/runner/lifecycle.d.ts +10 -0
- package/dist/runner/lifecycle.d.ts.map +1 -0
- package/dist/runner/lifecycle.js +58 -0
- package/dist/runner/lifecycle.js.map +1 -0
- package/dist/runner/runner.d.ts +34 -0
- package/dist/runner/runner.d.ts.map +1 -0
- package/dist/runner/runner.js +330 -0
- package/dist/runner/runner.js.map +1 -0
- package/dist/scoring/category-score.d.ts +52 -0
- package/dist/scoring/category-score.d.ts.map +1 -0
- package/dist/scoring/category-score.js +157 -0
- package/dist/scoring/category-score.js.map +1 -0
- package/dist/scoring/composite.d.ts +5 -0
- package/dist/scoring/composite.d.ts.map +1 -0
- package/dist/scoring/composite.js +24 -0
- package/dist/scoring/composite.js.map +1 -0
- package/dist/scoring/deep-eval.d.ts +25 -0
- package/dist/scoring/deep-eval.d.ts.map +1 -0
- package/dist/scoring/deep-eval.js +382 -0
- package/dist/scoring/deep-eval.js.map +1 -0
- package/dist/scoring/goal-achievement.d.ts +5 -0
- package/dist/scoring/goal-achievement.d.ts.map +1 -0
- package/dist/scoring/goal-achievement.js +241 -0
- package/dist/scoring/goal-achievement.js.map +1 -0
- package/dist/scoring/index.d.ts +22 -0
- package/dist/scoring/index.d.ts.map +1 -0
- package/dist/scoring/index.js +115 -0
- package/dist/scoring/index.js.map +1 -0
- package/dist/scoring/parse-json.d.ts +6 -0
- package/dist/scoring/parse-json.d.ts.map +1 -0
- package/dist/scoring/parse-json.js +18 -0
- package/dist/scoring/parse-json.js.map +1 -0
- package/dist/scoring/sparse-index.d.ts +15 -0
- package/dist/scoring/sparse-index.d.ts.map +1 -0
- package/dist/scoring/sparse-index.js +338 -0
- package/dist/scoring/sparse-index.js.map +1 -0
- package/dist/scoring/triage.d.ts +15 -0
- package/dist/scoring/triage.d.ts.map +1 -0
- package/dist/scoring/triage.js +204 -0
- package/dist/scoring/triage.js.map +1 -0
- package/dist/skills/resolver.d.ts +19 -0
- package/dist/skills/resolver.d.ts.map +1 -0
- package/dist/skills/resolver.js +95 -0
- package/dist/skills/resolver.js.map +1 -0
- package/dist/transcript/categorize.d.ts +24 -0
- package/dist/transcript/categorize.d.ts.map +1 -0
- package/dist/transcript/categorize.js +233 -0
- package/dist/transcript/categorize.js.map +1 -0
- package/dist/transcript/classify.d.ts +7 -0
- package/dist/transcript/classify.d.ts.map +1 -0
- package/dist/transcript/classify.js +32 -0
- package/dist/transcript/classify.js.map +1 -0
- package/dist/transcript/extract.d.ts +24 -0
- package/dist/transcript/extract.d.ts.map +1 -0
- package/dist/transcript/extract.js +266 -0
- package/dist/transcript/extract.js.map +1 -0
- package/dist/transcript/index.d.ts +3 -0
- package/dist/transcript/index.d.ts.map +1 -0
- package/dist/transcript/index.js +2 -0
- package/dist/transcript/index.js.map +1 -0
- package/dist/transcript/normalize.d.ts +15 -0
- package/dist/transcript/normalize.d.ts.map +1 -0
- package/dist/transcript/normalize.js +160 -0
- package/dist/transcript/normalize.js.map +1 -0
- package/dist/transcript/types.d.ts +92 -0
- package/dist/transcript/types.d.ts.map +1 -0
- package/dist/transcript/types.js +2 -0
- package/dist/transcript/types.js.map +1 -0
- package/dist/transcript/urls.d.ts +10 -0
- package/dist/transcript/urls.d.ts.map +1 -0
- package/dist/transcript/urls.js +31 -0
- package/dist/transcript/urls.js.map +1 -0
- package/dist/types/agent.d.ts +80 -0
- package/dist/types/agent.d.ts.map +1 -0
- package/dist/types/agent.js +2 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/baseline.d.ts +65 -0
- package/dist/types/baseline.d.ts.map +1 -0
- package/dist/types/baseline.js +2 -0
- package/dist/types/baseline.js.map +1 -0
- package/dist/types/config.d.ts +76 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +2 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/output.d.ts +70 -0
- package/dist/types/output.d.ts.map +1 -0
- package/dist/types/output.js +15 -0
- package/dist/types/output.js.map +1 -0
- package/dist/types/report.d.ts +37 -0
- package/dist/types/report.d.ts.map +1 -0
- package/dist/types/report.js +2 -0
- package/dist/types/report.js.map +1 -0
- package/dist/types/scenario.d.ts +23 -0
- package/dist/types/scenario.d.ts.map +1 -0
- package/dist/types/scenario.js +2 -0
- package/dist/types/scenario.js.map +1 -0
- package/dist/types/scoring.d.ts +176 -0
- package/dist/types/scoring.d.ts.map +1 -0
- package/dist/types/scoring.js +2 -0
- package/dist/types/scoring.js.map +1 -0
- package/dist/ui/AnimatedTokens.d.ts +29 -0
- package/dist/ui/AnimatedTokens.d.ts.map +1 -0
- package/dist/ui/AnimatedTokens.js +53 -0
- package/dist/ui/AnimatedTokens.js.map +1 -0
- package/dist/ui/App.d.ts +6 -0
- package/dist/ui/App.d.ts.map +1 -0
- package/dist/ui/App.js +16 -0
- package/dist/ui/App.js.map +1 -0
- package/dist/ui/LiveDuration.d.ts +20 -0
- package/dist/ui/LiveDuration.d.ts.map +1 -0
- package/dist/ui/LiveDuration.js +31 -0
- package/dist/ui/LiveDuration.js.map +1 -0
- package/dist/ui/LiveStatus.d.ts +7 -0
- package/dist/ui/LiveStatus.d.ts.map +1 -0
- package/dist/ui/LiveStatus.js +52 -0
- package/dist/ui/LiveStatus.js.map +1 -0
- package/dist/ui/format.d.ts +29 -0
- package/dist/ui/format.d.ts.map +1 -0
- package/dist/ui/format.js +514 -0
- package/dist/ui/format.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as os from "node:os";
|
|
3
|
+
import * as path from "node:path";
|
|
4
|
+
import { getAdapter } from "../adapters/registry.js";
|
|
5
|
+
import { parseJsonFromText } from "./parse-json.js";
|
|
6
|
+
/** Maximum interactions to flag for deep evaluation. */
|
|
7
|
+
const MAX_FLAGS = 30;
|
|
8
|
+
/** Maximum characters for the sparse index in the triage prompt. */
|
|
9
|
+
const MAX_SPARSE_INDEX_CHARS = 60_000;
|
|
10
|
+
/**
|
|
11
|
+
* Run the triage LLM pass on a sparse index.
|
|
12
|
+
* Scans the compressed transcript for patterns, classifies interactions,
|
|
13
|
+
* and flags areas of concern for deep evaluation.
|
|
14
|
+
*
|
|
15
|
+
* Returns an empty triage result on failure (no flags, no patterns).
|
|
16
|
+
*/
|
|
17
|
+
export async function runTriage(result, sparseIndex) {
|
|
18
|
+
const prompt = buildTriagePrompt(result, sparseIndex);
|
|
19
|
+
const responseText = await callJudge(result, prompt);
|
|
20
|
+
return parseTriageResponse(responseText);
|
|
21
|
+
}
|
|
22
|
+
function buildTriagePrompt(result, sparseIndex) {
|
|
23
|
+
const { stats } = sparseIndex;
|
|
24
|
+
return `You are an expert evaluator for AXIS, an AI agent testing framework.
|
|
25
|
+
|
|
26
|
+
You are analyzing an agent's execution trace to identify areas that need deeper evaluation.
|
|
27
|
+
|
|
28
|
+
SCENARIO: ${result.scenarioName}
|
|
29
|
+
|
|
30
|
+
TASK GIVEN TO AGENT:
|
|
31
|
+
${result.prompt}
|
|
32
|
+
|
|
33
|
+
SPARSE INDEX (${stats.totalInteractions} interactions):
|
|
34
|
+
${truncateSparseIndex(sparseIndex.lines)}
|
|
35
|
+
|
|
36
|
+
STATS:
|
|
37
|
+
- Environment interactions: ${stats.byCategory.environment}
|
|
38
|
+
- Service interactions: ${stats.byCategory.service}
|
|
39
|
+
- Agent interactions: ${stats.byCategory.agent}
|
|
40
|
+
- Errors: ${stats.totalErrors}
|
|
41
|
+
- Total duration: ${stats.totalDurationMs}ms
|
|
42
|
+
|
|
43
|
+
CONTEXT FOR EVALUATION:
|
|
44
|
+
- Tool discovery (e.g., ToolSearch, ListTools) and agent configuration reads are required infrastructure — do not flag as unnecessary unless genuinely redundant (same query repeated).
|
|
45
|
+
- Byte counts in sparse lines show total I/O transferred, not file content size. Small results are normal for write/edit confirmations.
|
|
46
|
+
- Tool durations include system overhead (SDK roundtrips, sandbox setup, process spawning) — do not flag interactions solely for being slow unless the agent caused the slowness through redundant or unnecessary work.
|
|
47
|
+
- If a service call (API request, web fetch) returned structured, usable content and the agent used it to complete the task, do not flag it for concerns about hypothetical missing content or page size.
|
|
48
|
+
|
|
49
|
+
INSTRUCTIONS:
|
|
50
|
+
Analyze this agent execution trace and identify areas of concern.
|
|
51
|
+
|
|
52
|
+
For each interaction you want to flag for deep evaluation, specify:
|
|
53
|
+
1. The interaction ID (#N)
|
|
54
|
+
2. Why it needs deeper review
|
|
55
|
+
3. Which dimensions to evaluate: success, speed, weight, relevance, necessity
|
|
56
|
+
|
|
57
|
+
Also identify any patterns across interactions:
|
|
58
|
+
- Repeated failures or retries
|
|
59
|
+
- Redundant service calls (same endpoint called multiple times)
|
|
60
|
+
- Excessive environment operations for simple tasks
|
|
61
|
+
- Wasted agent reasoning that didn't lead to progress
|
|
62
|
+
- Unnecessary interactions given prior context
|
|
63
|
+
|
|
64
|
+
Respond with ONLY valid JSON:
|
|
65
|
+
{
|
|
66
|
+
"flaggedInteractions": [
|
|
67
|
+
{"id": 1, "reason": "description of concern", "concerns": ["success", "relevance"]},
|
|
68
|
+
...
|
|
69
|
+
],
|
|
70
|
+
"patterns": [
|
|
71
|
+
{"description": "pattern description", "interactionIds": [1, 2, 3], "severity": "high"},
|
|
72
|
+
...
|
|
73
|
+
],
|
|
74
|
+
"categoryNotes": {
|
|
75
|
+
"environment": "summary of environment interaction quality",
|
|
76
|
+
"service": "summary of service interaction quality",
|
|
77
|
+
"agent": "summary of agent reasoning quality"
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
Flag at most ${MAX_FLAGS} interactions. Focus on the most significant issues.
|
|
82
|
+
Non-flagged interactions will receive default passing scores.`;
|
|
83
|
+
}
|
|
84
|
+
async function callJudge(runResult, prompt) {
|
|
85
|
+
const adapter = getAdapter(runResult.agentConfig.adapter);
|
|
86
|
+
const workspace = fs.mkdtempSync(path.join(os.tmpdir(), "axis-triage-"));
|
|
87
|
+
try {
|
|
88
|
+
const output = await adapter.run({
|
|
89
|
+
prompt,
|
|
90
|
+
config: runResult.agentConfig,
|
|
91
|
+
scenario: {
|
|
92
|
+
key: "__triage__",
|
|
93
|
+
name: "AXIS Triage",
|
|
94
|
+
prompt,
|
|
95
|
+
rubric: [],
|
|
96
|
+
},
|
|
97
|
+
workingDirectory: workspace,
|
|
98
|
+
});
|
|
99
|
+
return output.result ?? "";
|
|
100
|
+
}
|
|
101
|
+
finally {
|
|
102
|
+
try {
|
|
103
|
+
fs.rmSync(workspace, { recursive: true, force: true });
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
/* ignore */
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Parse the triage LLM response. Returns empty result on failure.
|
|
112
|
+
*/
|
|
113
|
+
export function parseTriageResponse(responseText) {
|
|
114
|
+
const empty = {
|
|
115
|
+
flaggedInteractions: [],
|
|
116
|
+
patterns: [],
|
|
117
|
+
categoryNotes: {
|
|
118
|
+
environment: "",
|
|
119
|
+
service: "",
|
|
120
|
+
agent: "",
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
const parsed = parseJsonFromText(responseText);
|
|
124
|
+
if (!parsed)
|
|
125
|
+
return empty;
|
|
126
|
+
const flaggedInteractions = parseFlags(parsed.flaggedInteractions);
|
|
127
|
+
const patterns = parsePatterns(parsed.patterns);
|
|
128
|
+
const categoryNotes = parseCategoryNotes(parsed.categoryNotes);
|
|
129
|
+
return { flaggedInteractions, patterns, categoryNotes };
|
|
130
|
+
}
|
|
131
|
+
function parseFlags(raw) {
|
|
132
|
+
if (!Array.isArray(raw))
|
|
133
|
+
return [];
|
|
134
|
+
const validConcerns = new Set(["success", "speed", "weight", "relevance", "necessity"]);
|
|
135
|
+
const flags = [];
|
|
136
|
+
for (const item of raw) {
|
|
137
|
+
if (!item || typeof item !== "object")
|
|
138
|
+
continue;
|
|
139
|
+
const obj = item;
|
|
140
|
+
if (typeof obj.id !== "number" || typeof obj.reason !== "string")
|
|
141
|
+
continue;
|
|
142
|
+
const concerns = Array.isArray(obj.concerns)
|
|
143
|
+
? obj.concerns.filter((c) => typeof c === "string" && validConcerns.has(c))
|
|
144
|
+
: [];
|
|
145
|
+
flags.push({
|
|
146
|
+
id: obj.id,
|
|
147
|
+
reason: obj.reason,
|
|
148
|
+
concerns: concerns.length > 0 ? concerns : ["success", "relevance"],
|
|
149
|
+
});
|
|
150
|
+
if (flags.length >= MAX_FLAGS)
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
153
|
+
return flags;
|
|
154
|
+
}
|
|
155
|
+
function parsePatterns(raw) {
|
|
156
|
+
if (!Array.isArray(raw))
|
|
157
|
+
return [];
|
|
158
|
+
const validSeverities = new Set(["low", "medium", "high"]);
|
|
159
|
+
const patterns = [];
|
|
160
|
+
for (const item of raw) {
|
|
161
|
+
if (!item || typeof item !== "object")
|
|
162
|
+
continue;
|
|
163
|
+
const obj = item;
|
|
164
|
+
if (typeof obj.description !== "string")
|
|
165
|
+
continue;
|
|
166
|
+
const interactionIds = Array.isArray(obj.interactionIds)
|
|
167
|
+
? obj.interactionIds.filter((id) => typeof id === "number")
|
|
168
|
+
: [];
|
|
169
|
+
const severity = typeof obj.severity === "string" && validSeverities.has(obj.severity)
|
|
170
|
+
? obj.severity
|
|
171
|
+
: "medium";
|
|
172
|
+
patterns.push({ description: obj.description, interactionIds, severity });
|
|
173
|
+
}
|
|
174
|
+
return patterns;
|
|
175
|
+
}
|
|
176
|
+
function parseCategoryNotes(raw) {
|
|
177
|
+
const defaults = {
|
|
178
|
+
environment: "",
|
|
179
|
+
service: "",
|
|
180
|
+
agent: "",
|
|
181
|
+
};
|
|
182
|
+
if (!raw || typeof raw !== "object")
|
|
183
|
+
return defaults;
|
|
184
|
+
const obj = raw;
|
|
185
|
+
return {
|
|
186
|
+
environment: typeof obj.environment === "string" ? obj.environment : "",
|
|
187
|
+
service: typeof obj.service === "string" ? obj.service : "",
|
|
188
|
+
agent: typeof obj.agent === "string" ? obj.agent : "",
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
function truncateSparseIndex(lines) {
|
|
192
|
+
let totalChars = 0;
|
|
193
|
+
const included = [];
|
|
194
|
+
for (const line of lines) {
|
|
195
|
+
if (totalChars + line.length > MAX_SPARSE_INDEX_CHARS) {
|
|
196
|
+
included.push(`... (${lines.length - included.length} more interactions omitted)`);
|
|
197
|
+
break;
|
|
198
|
+
}
|
|
199
|
+
included.push(line);
|
|
200
|
+
totalChars += line.length;
|
|
201
|
+
}
|
|
202
|
+
return included.join("\n");
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=triage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triage.js","sourceRoot":"","sources":["../../src/scoring/triage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ResolvedSkill, SkillSource } from "../types/config.js";
|
|
2
|
+
import type { Logger } from "../types/output.js";
|
|
3
|
+
/** Extract the source string from a SkillSource entry. */
|
|
4
|
+
export declare function skillSourceString(entry: SkillSource): string;
|
|
5
|
+
export interface ResolveSkillsOptions {
|
|
6
|
+
sources: SkillSource[];
|
|
7
|
+
configDir: string;
|
|
8
|
+
cacheDir: string;
|
|
9
|
+
logger: Logger;
|
|
10
|
+
refresh?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare function resolveSkills(options: ResolveSkillsOptions): Promise<ResolvedSkill[]>;
|
|
13
|
+
/**
|
|
14
|
+
* Find the directory containing SKILL.md.
|
|
15
|
+
* Checks the root directory first, then one level of subdirectories
|
|
16
|
+
* (for repos where the skill lives in a subdirectory).
|
|
17
|
+
*/
|
|
18
|
+
export declare function findSkillDir(dir: string): string | null;
|
|
19
|
+
//# sourceMappingURL=resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/skills/resolver.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAKjD,0DAA0D;AAC1D,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAE5D;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAM3F;AAsCD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAqBvD"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { execFileSync } from "node:child_process";
|
|
2
|
+
import * as fs from "node:fs";
|
|
3
|
+
import * as path from "node:path";
|
|
4
|
+
const GITHUB_URL_RE = /^https?:\/\/github\.com\/([^/]+)\/([^/]+?)(?:\.git)?$/;
|
|
5
|
+
const GITHUB_SHORTHAND_RE = /^([a-zA-Z0-9_.-]+)\/([a-zA-Z0-9_.-]+)$/;
|
|
6
|
+
/** Extract the source string from a SkillSource entry. */
|
|
7
|
+
export function skillSourceString(entry) {
|
|
8
|
+
return typeof entry === "string" ? entry : entry.source;
|
|
9
|
+
}
|
|
10
|
+
export async function resolveSkills(options) {
|
|
11
|
+
const results = [];
|
|
12
|
+
for (const entry of options.sources) {
|
|
13
|
+
results.push(resolveSkill(entry, options));
|
|
14
|
+
}
|
|
15
|
+
return results;
|
|
16
|
+
}
|
|
17
|
+
function resolveSkill(entry, options) {
|
|
18
|
+
const { configDir, cacheDir, logger, refresh } = options;
|
|
19
|
+
const source = skillSourceString(entry);
|
|
20
|
+
const axisCategory = typeof entry === "object" ? entry.axisCategory : undefined;
|
|
21
|
+
let dir;
|
|
22
|
+
let name;
|
|
23
|
+
if (source.startsWith("./") || source.startsWith("../") || source.startsWith("/")) {
|
|
24
|
+
// Local path — resolve relative to config directory
|
|
25
|
+
dir = path.resolve(configDir, source);
|
|
26
|
+
name = path.basename(dir);
|
|
27
|
+
}
|
|
28
|
+
else if (GITHUB_URL_RE.test(source)) {
|
|
29
|
+
const match = source.match(GITHUB_URL_RE);
|
|
30
|
+
const [, owner, repo] = match;
|
|
31
|
+
name = `${owner}-${repo}`;
|
|
32
|
+
dir = path.join(cacheDir, owner, repo);
|
|
33
|
+
cloneIfNeeded(source.replace(/\.git$/, "") + ".git", dir, logger, refresh);
|
|
34
|
+
}
|
|
35
|
+
else if (GITHUB_SHORTHAND_RE.test(source)) {
|
|
36
|
+
const [owner, repo] = source.split("/");
|
|
37
|
+
name = `${owner}-${repo}`;
|
|
38
|
+
dir = path.join(cacheDir, owner, repo);
|
|
39
|
+
cloneIfNeeded(`https://github.com/${owner}/${repo}.git`, dir, logger, refresh);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
throw new Error(`Invalid skill source: "${source}". Expected a local path (./...), GitHub shorthand (owner/repo), or GitHub URL.`);
|
|
43
|
+
}
|
|
44
|
+
const skillDir = findSkillDir(dir);
|
|
45
|
+
if (!skillDir) {
|
|
46
|
+
throw new Error(`No SKILL.md found in skill "${source}" (looked in ${dir})`);
|
|
47
|
+
}
|
|
48
|
+
return { name, path: skillDir, ...(axisCategory ? { axisCategory } : {}) };
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Find the directory containing SKILL.md.
|
|
52
|
+
* Checks the root directory first, then one level of subdirectories
|
|
53
|
+
* (for repos where the skill lives in a subdirectory).
|
|
54
|
+
*/
|
|
55
|
+
export function findSkillDir(dir) {
|
|
56
|
+
if (fs.existsSync(path.join(dir, "SKILL.md"))) {
|
|
57
|
+
return dir;
|
|
58
|
+
}
|
|
59
|
+
try {
|
|
60
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
61
|
+
for (const entry of entries) {
|
|
62
|
+
if (!entry.isDirectory() || entry.name.startsWith(".") || entry.name === "node_modules") {
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
const nested = path.join(dir, entry.name);
|
|
66
|
+
if (fs.existsSync(path.join(nested, "SKILL.md"))) {
|
|
67
|
+
return nested;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// Directory doesn't exist or isn't readable
|
|
73
|
+
}
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
function cloneIfNeeded(url, targetDir, logger, refresh) {
|
|
77
|
+
if (fs.existsSync(targetDir) && !refresh) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (fs.existsSync(targetDir)) {
|
|
81
|
+
fs.rmSync(targetDir, { recursive: true, force: true });
|
|
82
|
+
}
|
|
83
|
+
fs.mkdirSync(path.dirname(targetDir), { recursive: true });
|
|
84
|
+
logger.info(`Cloning skill: ${url}`);
|
|
85
|
+
try {
|
|
86
|
+
execFileSync("git", ["clone", "--depth", "1", "--single-branch", url, targetDir], {
|
|
87
|
+
stdio: ["ignore", "ignore", "pipe"],
|
|
88
|
+
timeout: 30_000,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
throw new Error(`Failed to clone skill from ${url}: ${err instanceof Error ? err.message : String(err)}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/skills/resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { TranscriptEntry } from "../types/agent.js";
|
|
2
|
+
import type { InteractionCategory, McpCategoryOverrides } from "../types/scoring.js";
|
|
3
|
+
/** Optional context for richer classification of tool_use entries. */
|
|
4
|
+
export interface CategorizationContext {
|
|
5
|
+
/** Summarized tool input (e.g. "file_path: src/index.ts"). */
|
|
6
|
+
toolInputSummary?: string | null;
|
|
7
|
+
/** Whether this entry was detected as a network call during normalization. */
|
|
8
|
+
isNetworkCall?: boolean;
|
|
9
|
+
/** MCP server category overrides from config. */
|
|
10
|
+
mcpCategoryOverrides?: McpCategoryOverrides;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Classify a transcript entry into one or more interaction categories.
|
|
14
|
+
*
|
|
15
|
+
* - **environment**: OS, filesystem, shell, dev tooling
|
|
16
|
+
* - **agent**: assistant reasoning, system messages, self-configuration
|
|
17
|
+
* - **service**: external APIs, MCP tools, network calls
|
|
18
|
+
*
|
|
19
|
+
* An interaction can belong to multiple categories (e.g. `Bash(curl ...)` is both
|
|
20
|
+
* environment and service). Classification is deterministic from tool name, entry type,
|
|
21
|
+
* and optional context.
|
|
22
|
+
*/
|
|
23
|
+
export declare function categorizeInteraction(entryType: TranscriptEntry["type"], toolName: string | null, context?: CategorizationContext): InteractionCategory[];
|
|
24
|
+
//# sourceMappingURL=categorize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"categorize.d.ts","sourceRoot":"","sources":["../../src/transcript/categorize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAuIrF,sEAAsE;AACtE,MAAM,WAAW,qBAAqB;IACpC,8DAA8D;IAC9D,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,8EAA8E;IAC9E,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,iDAAiD;IACjD,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC7C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,eAAe,CAAC,MAAM,CAAC,EAClC,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,mBAAmB,EAAE,CA8CvB"}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool names that represent environment interactions —
|
|
3
|
+
* OS, filesystem, shell, dev tooling, package managers, version control.
|
|
4
|
+
* All entries are lowercase; lookup is case-insensitive.
|
|
5
|
+
*/
|
|
6
|
+
const ENVIRONMENT_TOOL_NAMES = new Set([
|
|
7
|
+
// Shell / execution
|
|
8
|
+
"bash",
|
|
9
|
+
"shell",
|
|
10
|
+
"terminal",
|
|
11
|
+
"exec",
|
|
12
|
+
"command_execution",
|
|
13
|
+
// File operations
|
|
14
|
+
"read",
|
|
15
|
+
"write",
|
|
16
|
+
"edit",
|
|
17
|
+
"glob",
|
|
18
|
+
"grep",
|
|
19
|
+
"notebookedit",
|
|
20
|
+
"cat",
|
|
21
|
+
"head",
|
|
22
|
+
"tail",
|
|
23
|
+
"sed",
|
|
24
|
+
"awk",
|
|
25
|
+
"find",
|
|
26
|
+
"ls",
|
|
27
|
+
"mkdir",
|
|
28
|
+
"rm",
|
|
29
|
+
"cp",
|
|
30
|
+
"mv",
|
|
31
|
+
"touch",
|
|
32
|
+
"chmod",
|
|
33
|
+
"chown",
|
|
34
|
+
// Version control
|
|
35
|
+
"git",
|
|
36
|
+
// Package managers
|
|
37
|
+
"npm",
|
|
38
|
+
"npx",
|
|
39
|
+
"yarn",
|
|
40
|
+
"pnpm",
|
|
41
|
+
"pip",
|
|
42
|
+
"pip3",
|
|
43
|
+
"cargo",
|
|
44
|
+
"go",
|
|
45
|
+
"bundle",
|
|
46
|
+
"gem",
|
|
47
|
+
"composer",
|
|
48
|
+
"brew",
|
|
49
|
+
"apt",
|
|
50
|
+
"apt-get",
|
|
51
|
+
// Build / test tools
|
|
52
|
+
"make",
|
|
53
|
+
"cmake",
|
|
54
|
+
"tsc",
|
|
55
|
+
"node",
|
|
56
|
+
"python",
|
|
57
|
+
"python3",
|
|
58
|
+
"ruby",
|
|
59
|
+
"java",
|
|
60
|
+
"javac",
|
|
61
|
+
"docker",
|
|
62
|
+
"kubectl",
|
|
63
|
+
// File system navigation
|
|
64
|
+
"cd",
|
|
65
|
+
"pwd",
|
|
66
|
+
"which",
|
|
67
|
+
"whereis",
|
|
68
|
+
"file",
|
|
69
|
+
"stat",
|
|
70
|
+
"du",
|
|
71
|
+
"df",
|
|
72
|
+
// Text processing
|
|
73
|
+
"sort",
|
|
74
|
+
"uniq",
|
|
75
|
+
"wc",
|
|
76
|
+
"diff",
|
|
77
|
+
"patch",
|
|
78
|
+
"tr",
|
|
79
|
+
"cut",
|
|
80
|
+
"xargs",
|
|
81
|
+
]);
|
|
82
|
+
/**
|
|
83
|
+
* Prefixes for tool names that indicate environment interactions.
|
|
84
|
+
* Shell commands invoked via adapters often use these prefixes.
|
|
85
|
+
*/
|
|
86
|
+
const ENVIRONMENT_TOOL_PREFIXES = ["file_", "fs_", "dir_", "mcp__filesystem__"];
|
|
87
|
+
/**
|
|
88
|
+
* Tool names that represent agent-internal operations —
|
|
89
|
+
* metacognition, planning, task management, tool discovery.
|
|
90
|
+
* These are the agent orchestrating itself, not interacting with external services.
|
|
91
|
+
* All entries are lowercase; lookup is case-insensitive.
|
|
92
|
+
*/
|
|
93
|
+
const AGENT_TOOL_NAMES = new Set([
|
|
94
|
+
// Tool discovery / selection
|
|
95
|
+
"toolsearch",
|
|
96
|
+
"tool_search",
|
|
97
|
+
"listtoolsets",
|
|
98
|
+
"list_tools",
|
|
99
|
+
// Task management
|
|
100
|
+
"task",
|
|
101
|
+
"taskcreate",
|
|
102
|
+
"taskupdate",
|
|
103
|
+
"taskget",
|
|
104
|
+
"tasklist",
|
|
105
|
+
"taskoutput",
|
|
106
|
+
"taskstop",
|
|
107
|
+
"todoread",
|
|
108
|
+
"todowrite",
|
|
109
|
+
"todo_read",
|
|
110
|
+
"todo_write",
|
|
111
|
+
// Planning / mode control
|
|
112
|
+
"enterplanmode",
|
|
113
|
+
"exitplanmode",
|
|
114
|
+
"enter_plan_mode",
|
|
115
|
+
"exit_plan_mode",
|
|
116
|
+
// User interaction
|
|
117
|
+
"askuserquestion",
|
|
118
|
+
"askfollowupquestion",
|
|
119
|
+
"ask_user_question",
|
|
120
|
+
"ask_followup_question",
|
|
121
|
+
// Skill invocation
|
|
122
|
+
"skill",
|
|
123
|
+
]);
|
|
124
|
+
/**
|
|
125
|
+
* Path patterns that indicate agent-internal file operations.
|
|
126
|
+
* When an environment tool (Read, Write, etc.) targets one of these paths,
|
|
127
|
+
* it's the agent configuring itself — not a meaningful environment interaction.
|
|
128
|
+
*/
|
|
129
|
+
const AGENT_INTERNAL_PATH_PATTERNS = [".claude/", ".codex/", ".gemini/", "CLAUDE.md", "AGENTS.md"];
|
|
130
|
+
/**
|
|
131
|
+
* Classify a transcript entry into one or more interaction categories.
|
|
132
|
+
*
|
|
133
|
+
* - **environment**: OS, filesystem, shell, dev tooling
|
|
134
|
+
* - **agent**: assistant reasoning, system messages, self-configuration
|
|
135
|
+
* - **service**: external APIs, MCP tools, network calls
|
|
136
|
+
*
|
|
137
|
+
* An interaction can belong to multiple categories (e.g. `Bash(curl ...)` is both
|
|
138
|
+
* environment and service). Classification is deterministic from tool name, entry type,
|
|
139
|
+
* and optional context.
|
|
140
|
+
*/
|
|
141
|
+
export function categorizeInteraction(entryType, toolName, context) {
|
|
142
|
+
// Agent-internal: assistant reasoning and system messages
|
|
143
|
+
if (entryType === "assistant" || entryType === "system" || entryType === "user") {
|
|
144
|
+
return ["agent"];
|
|
145
|
+
}
|
|
146
|
+
// Error entries default to agent (agent encountered an error)
|
|
147
|
+
if (entryType === "error") {
|
|
148
|
+
return ["agent"];
|
|
149
|
+
}
|
|
150
|
+
// Tool-based entries: classify by tool name
|
|
151
|
+
if (toolName) {
|
|
152
|
+
if (isAgentTool(toolName)) {
|
|
153
|
+
return ["agent"];
|
|
154
|
+
}
|
|
155
|
+
// MCP category override: authoritative when set
|
|
156
|
+
const mcpOverride = resolveMcpCategoryOverride(toolName, context?.mcpCategoryOverrides);
|
|
157
|
+
if (mcpOverride) {
|
|
158
|
+
return [mcpOverride];
|
|
159
|
+
}
|
|
160
|
+
if (isEnvironmentTool(toolName)) {
|
|
161
|
+
// Environment tools targeting agent-internal paths are agent operations
|
|
162
|
+
if (context?.toolInputSummary && isAgentInternalPath(context.toolInputSummary)) {
|
|
163
|
+
return ["agent"];
|
|
164
|
+
}
|
|
165
|
+
// Environment tools that also make network calls belong to both categories
|
|
166
|
+
if (context?.isNetworkCall) {
|
|
167
|
+
return ["environment", "service"];
|
|
168
|
+
}
|
|
169
|
+
return ["environment"];
|
|
170
|
+
}
|
|
171
|
+
// Everything else is a service interaction
|
|
172
|
+
return ["service"];
|
|
173
|
+
}
|
|
174
|
+
// tool_result without a tool name — follow the pair's category
|
|
175
|
+
// (will be resolved during sparse index building via the paired tool_use)
|
|
176
|
+
// Default to service as the safest assumption for unknown tools
|
|
177
|
+
if (entryType === "tool_result") {
|
|
178
|
+
return ["service"];
|
|
179
|
+
}
|
|
180
|
+
return ["agent"];
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Check if a tool name matches an MCP server with a category override.
|
|
184
|
+
* MCP tool names follow the pattern: mcp__<servername>__<toolname>
|
|
185
|
+
*/
|
|
186
|
+
function resolveMcpCategoryOverride(toolName, overrides) {
|
|
187
|
+
if (!overrides || overrides.size === 0)
|
|
188
|
+
return null;
|
|
189
|
+
const lower = toolName.toLowerCase();
|
|
190
|
+
if (!lower.startsWith("mcp__"))
|
|
191
|
+
return null;
|
|
192
|
+
const withoutPrefix = lower.slice(5); // remove "mcp__"
|
|
193
|
+
const separatorIdx = withoutPrefix.indexOf("__");
|
|
194
|
+
if (separatorIdx < 0)
|
|
195
|
+
return null;
|
|
196
|
+
const serverName = withoutPrefix.slice(0, separatorIdx);
|
|
197
|
+
for (const [name, category] of overrides) {
|
|
198
|
+
if (name.toLowerCase() === serverName) {
|
|
199
|
+
return category;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Check if the tool input summary references an agent-internal path.
|
|
206
|
+
* These are paths used for agent self-configuration (skills, settings, instructions).
|
|
207
|
+
*/
|
|
208
|
+
function isAgentInternalPath(inputSummary) {
|
|
209
|
+
const lower = inputSummary.toLowerCase();
|
|
210
|
+
return AGENT_INTERNAL_PATH_PATTERNS.some((pattern) => lower.includes(pattern.toLowerCase()));
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Check if a tool name represents an environment tool.
|
|
214
|
+
* Case-insensitive: all entries in ENVIRONMENT_TOOL_NAMES are lowercase.
|
|
215
|
+
*/
|
|
216
|
+
function isEnvironmentTool(toolName) {
|
|
217
|
+
const lower = toolName.toLowerCase();
|
|
218
|
+
if (ENVIRONMENT_TOOL_NAMES.has(lower))
|
|
219
|
+
return true;
|
|
220
|
+
for (const prefix of ENVIRONMENT_TOOL_PREFIXES) {
|
|
221
|
+
if (lower.startsWith(prefix))
|
|
222
|
+
return true;
|
|
223
|
+
}
|
|
224
|
+
return false;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Check if a tool name represents an agent-internal operation.
|
|
228
|
+
* Case-insensitive: all entries in AGENT_TOOL_NAMES are lowercase.
|
|
229
|
+
*/
|
|
230
|
+
function isAgentTool(toolName) {
|
|
231
|
+
return AGENT_TOOL_NAMES.has(toolName.toLowerCase());
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=categorize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"categorize.js","sourceRoot":"","sources":["../../src/transcript/categorize.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC;IACrC,oBAAoB;IACpB,MAAM;IACN,OAAO;IACP,UAAU;IACV,MAAM;IACN,mBAAmB;IACnB,kBAAkB;IAClB,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,MAAM;IACN,cAAc;IACd,KAAK;IACL,MAAM;IACN,MAAM;IACN,KAAK;IACL,KAAK;IACL,MAAM;IACN,IAAI;IACJ,OAAO;IACP,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,OAAO;IACP,OAAO;IACP,OAAO;IACP,kBAAkB;IAClB,KAAK;IACL,mBAAmB;IACnB,KAAK;IACL,KAAK;IACL,MAAM;IACN,MAAM;IACN,KAAK;IACL,MAAM;IACN,OAAO;IACP,IAAI;IACJ,QAAQ;IACR,KAAK;IACL,UAAU;IACV,MAAM;IACN,KAAK;IACL,SAAS;IACT,qBAAqB;IACrB,MAAM;IACN,OAAO;IACP,KAAK;IACL,MAAM;IACN,QAAQ;IACR,SAAS;IACT,MAAM;IACN,MAAM;IACN,OAAO;IACP,QAAQ;IACR,SAAS;IACT,yBAAyB;IACzB,IAAI;IACJ,KAAK;IACL,OAAO;IACP,SAAS;IACT,MAAM;IACN,MAAM;IACN,IAAI;IACJ,IAAI;IACJ,kBAAkB;IAClB,MAAM;IACN,MAAM;IACN,IAAI;IACJ,MAAM;IACN,OAAO;IACP,IAAI;IACJ,KAAK;IACL,OAAO;CACR,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,yBAAyB,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC;AAEhF;;;;;GAKG;AACH,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC/B,6BAA6B;IAC7B,YAAY;IACZ,aAAa;IACb,cAAc;IACd,YAAY;IACZ,kBAAkB;IAClB,MAAM;IACN,YAAY;IACZ,YAAY;IACZ,SAAS;IACT,UAAU;IACV,YAAY;IACZ,UAAU;IACV,UAAU;IACV,WAAW;IACX,WAAW;IACX,YAAY;IACZ,0BAA0B;IAC1B,eAAe;IACf,cAAc;IACd,iBAAiB;IACjB,gBAAgB;IAChB,mBAAmB;IACnB,iBAAiB;IACjB,qBAAqB;IACrB,mBAAmB;IACnB,uBAAuB;IACvB,mBAAmB;IACnB,OAAO;CACR,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,4BAA4B,GAAG,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;AAYnG;;;;;;;;;;GAUG;AACH,MAAM,UAAU,qBAAqB,CACnC,SAAkC,EAClC,QAAuB,EACvB,OAA+B;IAE/B,0DAA0D;IAC1D,IAAI,SAAS,KAAK,WAAW,IAAI,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;QAChF,OAAO,CAAC,OAAO,CAAC,CAAC;IACnB,CAAC;IAED,8DAA8D;IAC9D,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;QAC1B,OAAO,CAAC,OAAO,CAAC,CAAC;IACnB,CAAC;IAED,4CAA4C;IAC5C,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,OAAO,CAAC,CAAC;QACnB,CAAC;QAED,gDAAgD;QAChD,MAAM,WAAW,GAAG,0BAA0B,CAAC,QAAQ,EAAE,OAAO,EAAE,oBAAoB,CAAC,CAAC;QACxF,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,WAAW,CAAC,CAAC;QACvB,CAAC;QAED,IAAI,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChC,wEAAwE;YACxE,IAAI,OAAO,EAAE,gBAAgB,IAAI,mBAAmB,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBAC/E,OAAO,CAAC,OAAO,CAAC,CAAC;YACnB,CAAC;YACD,2EAA2E;YAC3E,IAAI,OAAO,EAAE,aAAa,EAAE,CAAC;gBAC3B,OAAO,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;YACpC,CAAC;YACD,OAAO,CAAC,aAAa,CAAC,CAAC;QACzB,CAAC;QACD,2CAA2C;QAC3C,OAAO,CAAC,SAAS,CAAC,CAAC;IACrB,CAAC;IAED,+DAA+D;IAC/D,0EAA0E;IAC1E,gEAAgE;IAChE,IAAI,SAAS,KAAK,aAAa,EAAE,CAAC;QAChC,OAAO,CAAC,SAAS,CAAC,CAAC;IACrB,CAAC;IAED,OAAO,CAAC,OAAO,CAAC,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,SAAS,0BAA0B,CACjC,QAAgB,EAChB,SAAgC;IAEhC,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEpD,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACrC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAE5C,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB;IACvD,MAAM,YAAY,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,IAAI,YAAY,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAElC,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IAExD,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,SAAS,EAAE,CAAC;QACzC,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,UAAU,EAAE,CAAC;YACtC,OAAO,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,SAAS,mBAAmB,CAAC,YAAoB;IAC/C,MAAM,KAAK,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC;IACzC,OAAO,4BAA4B,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;AAC/F,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CAAC,QAAgB;IACzC,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACrC,IAAI,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEnD,KAAK,MAAM,MAAM,IAAI,yBAAyB,EAAE,CAAC;QAC/C,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;IAC5C,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,SAAS,WAAW,CAAC,QAAgB;IACnC,OAAO,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ExtractedUrl } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Determine if a tool call represents a network-related action.
|
|
4
|
+
* Uses tool name matching and URL presence in tool input.
|
|
5
|
+
*/
|
|
6
|
+
export declare function isNetworkCall(toolName: string | null, urls: ExtractedUrl[]): boolean;
|
|
7
|
+
//# sourceMappingURL=classify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.d.ts","sourceRoot":"","sources":["../../src/transcript/classify.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAmB/C;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,OAAO,CAUpF"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/** Tool names that are known to make network requests. */
|
|
2
|
+
const NETWORK_TOOL_NAMES = new Set([
|
|
3
|
+
"WebFetch",
|
|
4
|
+
"Fetch",
|
|
5
|
+
"web_fetch",
|
|
6
|
+
"WebSearch",
|
|
7
|
+
"web_search",
|
|
8
|
+
"mcp_fetch",
|
|
9
|
+
"http_request",
|
|
10
|
+
"curl",
|
|
11
|
+
"wget",
|
|
12
|
+
"fetch",
|
|
13
|
+
]);
|
|
14
|
+
/** Prefixes that indicate MCP-proxied tools (often network-related). */
|
|
15
|
+
const NETWORK_TOOL_PREFIXES = ["mcp__"];
|
|
16
|
+
/**
|
|
17
|
+
* Determine if a tool call represents a network-related action.
|
|
18
|
+
* Uses tool name matching and URL presence in tool input.
|
|
19
|
+
*/
|
|
20
|
+
export function isNetworkCall(toolName, urls) {
|
|
21
|
+
if (toolName) {
|
|
22
|
+
if (NETWORK_TOOL_NAMES.has(toolName))
|
|
23
|
+
return true;
|
|
24
|
+
for (const prefix of NETWORK_TOOL_PREFIXES) {
|
|
25
|
+
if (toolName.startsWith(prefix))
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
// If the tool input contains URLs, it's likely a network call
|
|
30
|
+
return urls.length > 0;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=classify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.js","sourceRoot":"","sources":["../../src/transcript/classify.ts"],"names":[],"mappings":"AAEA,0DAA0D;AAC1D,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC;IACjC,UAAU;IACV,OAAO;IACP,WAAW;IACX,WAAW;IACX,YAAY;IACZ,WAAW;IACX,cAAc;IACd,MAAM;IACN,MAAM;IACN,OAAO;CACR,CAAC,CAAC;AAEH,wEAAwE;AACxE,MAAM,qBAAqB,GAAG,CAAC,OAAO,CAAC,CAAC;AAExC;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,QAAuB,EAAE,IAAoB;IACzE,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAC;QAClD,KAAK,MAAM,MAAM,IAAI,qBAAqB,EAAE,CAAC;YAC3C,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC;gBAAE,OAAO,IAAI,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,8DAA8D;IAC9D,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AACzB,CAAC"}
|