dev3000 0.0.173 → 0.0.175
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 +0 -4
- package/dist/cdp-monitor.d.ts +21 -2
- package/dist/cdp-monitor.d.ts.map +1 -1
- package/dist/cdp-monitor.js +449 -107
- package/dist/cdp-monitor.js.map +1 -1
- package/dist/cli.js +193 -216
- package/dist/cli.js.map +1 -1
- package/dist/commands/crawl.d.ts.map +1 -1
- package/dist/commands/crawl.js +4 -43
- package/dist/commands/crawl.js.map +1 -1
- package/dist/commands/errors.d.ts.map +1 -1
- package/dist/commands/errors.js +4 -53
- package/dist/commands/errors.js.map +1 -1
- package/dist/commands/fix.d.ts.map +1 -1
- package/dist/commands/fix.js +5 -74
- package/dist/commands/fix.js.map +1 -1
- package/dist/commands/logs.d.ts.map +1 -1
- package/dist/commands/logs.js +4 -53
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/resume.d.ts +11 -0
- package/dist/commands/resume.d.ts.map +1 -0
- package/dist/commands/resume.js +75 -0
- package/dist/commands/resume.js.map +1 -0
- package/dist/commands/skill-runner.d.ts +14 -0
- package/dist/commands/skill-runner.d.ts.map +1 -0
- package/dist/commands/skill-runner.js +494 -0
- package/dist/commands/skill-runner.js.map +1 -0
- package/dist/dev-environment.d.ts +26 -3
- package/dist/dev-environment.d.ts.map +1 -1
- package/dist/dev-environment.js +285 -118
- package/dist/dev-environment.js.map +1 -1
- package/dist/skills/d3k/internal-skill.md +145 -0
- package/dist/skills/index.test.ts +28 -1
- package/dist/skills/index.ts +58 -7
- package/dist/tui-interface-opentui.d.ts +2 -0
- package/dist/tui-interface-opentui.d.ts.map +1 -1
- package/dist/tui-interface-opentui.js +17 -3
- package/dist/tui-interface-opentui.js.map +1 -1
- package/dist/utils/agent-browser.d.ts.map +1 -1
- package/dist/utils/agent-browser.js +6 -3
- package/dist/utils/agent-browser.js.map +1 -1
- package/dist/utils/agent-detection.d.ts +1 -0
- package/dist/utils/agent-detection.d.ts.map +1 -1
- package/dist/utils/agent-detection.js +11 -0
- package/dist/utils/agent-detection.js.map +1 -1
- package/dist/utils/agent-selection.js +4 -4
- package/dist/utils/agent-selection.js.map +1 -1
- package/dist/utils/browser-command-argv.d.ts +1 -1
- package/dist/utils/browser-command-argv.d.ts.map +1 -1
- package/dist/utils/browser-command-argv.js +1 -1
- package/dist/utils/browser-command-argv.js.map +1 -1
- package/dist/utils/project-metadata.d.ts +4 -0
- package/dist/utils/project-metadata.d.ts.map +1 -0
- package/dist/utils/project-metadata.js +48 -0
- package/dist/utils/project-metadata.js.map +1 -0
- package/dist/utils/project-name.d.ts +2 -0
- package/dist/utils/project-name.d.ts.map +1 -1
- package/dist/utils/project-name.js +6 -0
- package/dist/utils/project-name.js.map +1 -1
- package/dist/utils/session.d.ts +14 -0
- package/dist/utils/session.d.ts.map +1 -0
- package/dist/utils/session.js +65 -0
- package/dist/utils/session.js.map +1 -0
- package/dist/utils/version-check.js +2 -2
- package/dist/utils/version-check.js.map +1 -1
- package/package.json +9 -21
- package/dist/commands/cloud-check-pr.d.ts +0 -9
- package/dist/commands/cloud-check-pr.d.ts.map +0 -1
- package/dist/commands/cloud-check-pr.js +0 -243
- package/dist/commands/cloud-check-pr.js.map +0 -1
- package/dist/commands/cloud-fix.d.ts +0 -13
- package/dist/commands/cloud-fix.d.ts.map +0 -1
- package/dist/commands/cloud-fix.js +0 -79
- package/dist/commands/cloud-fix.js.map +0 -1
- package/dist/commands/find-component.d.ts +0 -8
- package/dist/commands/find-component.d.ts.map +0 -1
- package/dist/commands/find-component.js +0 -182
- package/dist/commands/find-component.js.map +0 -1
- package/dist/skills/d3k/SKILL.md +0 -126
- package/dist/skills/index.d.ts +0 -46
- package/dist/skills/index.d.ts.map +0 -1
- package/dist/skills/index.js +0 -174
- package/dist/skills/index.js.map +0 -1
|
@@ -0,0 +1,494 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { existsSync, readFileSync } from "fs";
|
|
3
|
+
import ora from "ora";
|
|
4
|
+
import { homedir } from "os";
|
|
5
|
+
import { dirname, join, resolve } from "path";
|
|
6
|
+
const DEFAULT_DEV3000_BASE_URL = "https://dev3000.ai";
|
|
7
|
+
const REMOTE_SKILL_OPTIONS = ["team", "project", "branch", "projectDir", "baseUrl", "wait", "json"];
|
|
8
|
+
export function shouldUseRemoteSkillRunner(name, options) {
|
|
9
|
+
if (name !== "deepsec") {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
const hasExplicitRunOption = REMOTE_SKILL_OPTIONS.some((option) => Boolean(options[option])) ||
|
|
13
|
+
options.install === false;
|
|
14
|
+
try {
|
|
15
|
+
return hasExplicitRunOption || Boolean(findLinkedVercelProject());
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export async function runRemoteSkillCommand(name, options) {
|
|
22
|
+
if (!name) {
|
|
23
|
+
throw new Error("A skill name is required. Example: d3k skill deepsec --team elsigh-pro --project commonerband");
|
|
24
|
+
}
|
|
25
|
+
if (name !== "deepsec") {
|
|
26
|
+
throw new Error("Remote skill runs currently support `deepsec` only.");
|
|
27
|
+
}
|
|
28
|
+
const linkedProject = findLinkedVercelProject();
|
|
29
|
+
const teamInput = options.team?.trim() || linkedProject?.orgId;
|
|
30
|
+
const projectInput = options.project?.trim() || linkedProject?.projectId;
|
|
31
|
+
if (!teamInput || !projectInput) {
|
|
32
|
+
throw new Error("Could not infer the Vercel team/project. Run from a directory linked with `vercel link`, or pass `--team` and `--project`.");
|
|
33
|
+
}
|
|
34
|
+
const token = resolveVercelAccessToken();
|
|
35
|
+
if (!token) {
|
|
36
|
+
throw new Error("No Vercel token found. Run `vercel login`, or set VERCEL_TOKEN to a token that can access the target team.");
|
|
37
|
+
}
|
|
38
|
+
const baseUrl = normalizeBaseUrl(options.baseUrl || process.env.D3K_CLOUD_URL || DEFAULT_DEV3000_BASE_URL);
|
|
39
|
+
log(options, `Starting ${chalk.bold("DeepSec Security Scan")} on ${chalk.bold(projectInput)}...`);
|
|
40
|
+
if (linkedProject && (!options.team || !options.project)) {
|
|
41
|
+
log(options, `${chalk.green("✓")} Inferred Vercel project link from ${linkedProject.path}`);
|
|
42
|
+
}
|
|
43
|
+
const [user, teams] = await Promise.all([fetchVercelUser(token), fetchVercelTeams(token)]);
|
|
44
|
+
const team = resolveTeam(teamInput, user, teams);
|
|
45
|
+
const project = await resolveProject(token, team, projectInput);
|
|
46
|
+
const githubRepo = getProjectGitHubRepo(project);
|
|
47
|
+
if (!githubRepo) {
|
|
48
|
+
throw new Error(`Project ${project.name} is not connected to a GitHub repository. DeepSec requires a GitHub-backed Vercel project.`);
|
|
49
|
+
}
|
|
50
|
+
const latestDeployment = project.latestDeployments?.[0];
|
|
51
|
+
const branch = options.branch?.trim() || latestDeployment?.gitSource?.ref || latestDeployment?.gitSource?.sha || "main";
|
|
52
|
+
const projectDir = options.projectDir?.trim() || project.rootDirectory?.trim() || undefined;
|
|
53
|
+
const productionUrl = latestDeployment?.url ? `https://${latestDeployment.url}` : undefined;
|
|
54
|
+
const teamScope = team.isPersonal ? team.slug : team.id;
|
|
55
|
+
const reportBasePath = `${baseUrl}/${encodeURIComponent(team.slug)}/skill-runner/runs`;
|
|
56
|
+
log(options, `${chalk.green("✓")} Team: ${team.name} (${team.slug})`);
|
|
57
|
+
log(options, `${chalk.green("✓")} Project: ${project.name} (${githubRepo.owner}/${githubRepo.repo})`);
|
|
58
|
+
const startRunSpinner = startSpinner(options, "Starting run...");
|
|
59
|
+
let startResult;
|
|
60
|
+
try {
|
|
61
|
+
startResult = await startSkillRun({
|
|
62
|
+
baseUrl,
|
|
63
|
+
token,
|
|
64
|
+
user,
|
|
65
|
+
team,
|
|
66
|
+
teamScope,
|
|
67
|
+
project,
|
|
68
|
+
githubRepo,
|
|
69
|
+
branch,
|
|
70
|
+
projectDir,
|
|
71
|
+
productionUrl
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
startRunSpinner?.fail("Failed to start run");
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
if (startResult.code === "runner_setup_required" && options.install !== false) {
|
|
79
|
+
startRunSpinner?.stop();
|
|
80
|
+
log(options, "Team skill runner project needs setup; installing...");
|
|
81
|
+
await installWorkerProject(baseUrl, token, team, options);
|
|
82
|
+
const retryStartRunSpinner = startSpinner(options, "Starting run...");
|
|
83
|
+
try {
|
|
84
|
+
startResult = await startSkillRun({
|
|
85
|
+
baseUrl,
|
|
86
|
+
token,
|
|
87
|
+
user,
|
|
88
|
+
team,
|
|
89
|
+
teamScope,
|
|
90
|
+
project,
|
|
91
|
+
githubRepo,
|
|
92
|
+
branch,
|
|
93
|
+
projectDir,
|
|
94
|
+
productionUrl
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
retryStartRunSpinner?.fail("Failed to start run");
|
|
99
|
+
throw error;
|
|
100
|
+
}
|
|
101
|
+
if (startResult.success && startResult.runId) {
|
|
102
|
+
retryStartRunSpinner?.stop();
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
retryStartRunSpinner?.fail("Failed to start run");
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
else if (startResult.success && startResult.runId) {
|
|
109
|
+
startRunSpinner?.stop();
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
startRunSpinner?.fail("Failed to start run");
|
|
113
|
+
}
|
|
114
|
+
if (!startResult.success || !startResult.runId) {
|
|
115
|
+
const error = startResult.error || "Failed to start DeepSec run.";
|
|
116
|
+
throw new Error(error);
|
|
117
|
+
}
|
|
118
|
+
const reportUrl = `${reportBasePath}/${encodeURIComponent(startResult.runId)}/report`;
|
|
119
|
+
const output = {
|
|
120
|
+
success: true,
|
|
121
|
+
runId: startResult.runId,
|
|
122
|
+
reportUrl,
|
|
123
|
+
team: team.slug,
|
|
124
|
+
project: project.name
|
|
125
|
+
};
|
|
126
|
+
if (options.json && !options.wait) {
|
|
127
|
+
console.log(JSON.stringify(output, null, 2));
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
log(options, `${chalk.green("✓")} Started run ${startResult.runId}`);
|
|
131
|
+
log(options, `${chalk.bold("Report:")} ${reportUrl}`);
|
|
132
|
+
if (options.wait) {
|
|
133
|
+
const run = await waitForRun(baseUrl, user.id, startResult.runId, options);
|
|
134
|
+
if (options.json) {
|
|
135
|
+
console.log(JSON.stringify({ ...output, run }, null, 2));
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
log(options, formatRunCompletion(run, reportUrl));
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
function resolveVercelAccessToken() {
|
|
142
|
+
const explicitToken = process.env.VERCEL_TOKEN?.trim();
|
|
143
|
+
if (explicitToken) {
|
|
144
|
+
return explicitToken;
|
|
145
|
+
}
|
|
146
|
+
const homeDirectory = homedir();
|
|
147
|
+
const xdgDataHome = process.env.XDG_DATA_HOME || join(homeDirectory, ".local", "share");
|
|
148
|
+
const candidates = [
|
|
149
|
+
join(xdgDataHome, "com.vercel.cli", "auth.json"),
|
|
150
|
+
join(homeDirectory, "Library", "Application Support", "com.vercel.cli", "auth.json"),
|
|
151
|
+
join(homeDirectory, ".now", "auth.json"),
|
|
152
|
+
join(homeDirectory, ".vercel", "auth.json")
|
|
153
|
+
];
|
|
154
|
+
for (const candidate of candidates) {
|
|
155
|
+
try {
|
|
156
|
+
const parsed = JSON.parse(readFileSync(candidate, "utf8"));
|
|
157
|
+
const token = parsed.token?.trim();
|
|
158
|
+
const expiresAt = typeof parsed.expiresAt === "number" ? parsed.expiresAt : null;
|
|
159
|
+
if (token && (!expiresAt || expiresAt > Math.floor(Date.now() / 1000) + 60)) {
|
|
160
|
+
return token;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
// Try the next known Vercel CLI auth location.
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
function findLinkedVercelProject(startDirectory = process.cwd()) {
|
|
170
|
+
let currentDirectory = resolve(startDirectory);
|
|
171
|
+
for (;;) {
|
|
172
|
+
const candidate = join(currentDirectory, ".vercel", "project.json");
|
|
173
|
+
if (existsSync(candidate)) {
|
|
174
|
+
try {
|
|
175
|
+
const parsed = JSON.parse(readFileSync(candidate, "utf8"));
|
|
176
|
+
const orgId = stringValue(parsed.orgId);
|
|
177
|
+
const projectId = stringValue(parsed.projectId);
|
|
178
|
+
if (orgId || projectId) {
|
|
179
|
+
return { orgId, projectId, path: candidate };
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
throw new Error(`Could not read ${candidate}. Re-run \`vercel link\` or fix the invalid project.json. ${error instanceof Error ? error.message : String(error)}`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
const parentDirectory = dirname(currentDirectory);
|
|
187
|
+
if (parentDirectory === currentDirectory) {
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
currentDirectory = parentDirectory;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
async function fetchVercelUser(token) {
|
|
194
|
+
const data = await fetchJson("https://api.vercel.com/v2/user", {
|
|
195
|
+
headers: authorizationHeaders(token)
|
|
196
|
+
});
|
|
197
|
+
const rawUser = data.user || {};
|
|
198
|
+
const id = stringValue(rawUser.uid) || stringValue(rawUser.id);
|
|
199
|
+
const username = stringValue(rawUser.username);
|
|
200
|
+
if (!id || !username) {
|
|
201
|
+
throw new Error("Could not resolve the signed-in Vercel user from the configured token.");
|
|
202
|
+
}
|
|
203
|
+
return {
|
|
204
|
+
id,
|
|
205
|
+
username,
|
|
206
|
+
email: stringValue(rawUser.email) || "",
|
|
207
|
+
name: stringValue(rawUser.name) || username
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
async function fetchVercelTeams(token) {
|
|
211
|
+
const teams = [];
|
|
212
|
+
const seen = new Set();
|
|
213
|
+
let until = null;
|
|
214
|
+
for (let page = 0; page < 20; page++) {
|
|
215
|
+
const apiUrl = new URL("https://api.vercel.com/v2/teams");
|
|
216
|
+
apiUrl.searchParams.set("limit", "100");
|
|
217
|
+
if (until) {
|
|
218
|
+
apiUrl.searchParams.set("until", until);
|
|
219
|
+
}
|
|
220
|
+
const data = await fetchJson(apiUrl.toString(), {
|
|
221
|
+
headers: authorizationHeaders(token)
|
|
222
|
+
});
|
|
223
|
+
const pageTeams = Array.isArray(data.teams) ? data.teams : [];
|
|
224
|
+
for (const rawTeam of pageTeams) {
|
|
225
|
+
const id = stringValue(rawTeam.id);
|
|
226
|
+
const slug = stringValue(rawTeam.slug);
|
|
227
|
+
const name = stringValue(rawTeam.name);
|
|
228
|
+
if (!id || !slug || !name || seen.has(id.toLowerCase())) {
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
seen.add(id.toLowerCase());
|
|
232
|
+
teams.push({ id, slug, name, isPersonal: false });
|
|
233
|
+
}
|
|
234
|
+
const nextCursor = data.pagination?.next;
|
|
235
|
+
if (!nextCursor || pageTeams.length === 0) {
|
|
236
|
+
break;
|
|
237
|
+
}
|
|
238
|
+
until = String(nextCursor);
|
|
239
|
+
}
|
|
240
|
+
return teams;
|
|
241
|
+
}
|
|
242
|
+
function resolveTeam(input, user, teams) {
|
|
243
|
+
const normalizedInput = input.toLowerCase();
|
|
244
|
+
const personalTeam = {
|
|
245
|
+
id: user.id,
|
|
246
|
+
slug: user.username,
|
|
247
|
+
name: user.name || user.username,
|
|
248
|
+
isPersonal: true
|
|
249
|
+
};
|
|
250
|
+
const allTeams = [personalTeam, ...teams];
|
|
251
|
+
const team = allTeams.find((candidate) => candidate.id.toLowerCase() === normalizedInput) ||
|
|
252
|
+
allTeams.find((candidate) => candidate.slug.toLowerCase() === normalizedInput) ||
|
|
253
|
+
allTeams.find((candidate) => candidate.name.toLowerCase() === normalizedInput);
|
|
254
|
+
if (!team) {
|
|
255
|
+
const available = allTeams.map((candidate) => candidate.slug).join(", ");
|
|
256
|
+
throw new Error(`Could not find Vercel team "${input}". Available teams: ${available}`);
|
|
257
|
+
}
|
|
258
|
+
return team;
|
|
259
|
+
}
|
|
260
|
+
async function resolveProject(token, team, input) {
|
|
261
|
+
const fetchedProjects = await fetchProjects(token, team, input.startsWith("prj_") ? undefined : input);
|
|
262
|
+
const normalizedInput = input.toLowerCase();
|
|
263
|
+
const project = fetchedProjects.find((candidate) => candidate.id?.toLowerCase() === normalizedInput) ||
|
|
264
|
+
fetchedProjects.find((candidate) => candidate.name?.toLowerCase() === normalizedInput);
|
|
265
|
+
if (!project?.id || !project.name) {
|
|
266
|
+
const available = fetchedProjects
|
|
267
|
+
.filter((candidate) => candidate.name && !isSkillRunnerWorkerProject(candidate.name))
|
|
268
|
+
.slice(0, 10)
|
|
269
|
+
.map((candidate) => candidate.name)
|
|
270
|
+
.join(", ");
|
|
271
|
+
throw new Error(`Could not find Vercel project "${input}" in ${team.slug}.${available ? ` Nearby projects: ${available}` : ""}`);
|
|
272
|
+
}
|
|
273
|
+
if (isSkillRunnerWorkerProject(project.name)) {
|
|
274
|
+
throw new Error("The d3k-skill-runner project cannot be used as the scan target.");
|
|
275
|
+
}
|
|
276
|
+
return project;
|
|
277
|
+
}
|
|
278
|
+
async function fetchProjects(token, team, search) {
|
|
279
|
+
const projects = [];
|
|
280
|
+
let until = null;
|
|
281
|
+
for (let page = 0; page < 20; page++) {
|
|
282
|
+
const apiUrl = new URL("https://api.vercel.com/v9/projects");
|
|
283
|
+
if (!team.isPersonal) {
|
|
284
|
+
apiUrl.searchParams.set("teamId", team.id);
|
|
285
|
+
}
|
|
286
|
+
if (search) {
|
|
287
|
+
apiUrl.searchParams.set("search", search);
|
|
288
|
+
}
|
|
289
|
+
apiUrl.searchParams.set("limit", "100");
|
|
290
|
+
if (until) {
|
|
291
|
+
apiUrl.searchParams.set("until", until);
|
|
292
|
+
}
|
|
293
|
+
const data = await fetchJson(apiUrl.toString(), {
|
|
294
|
+
headers: authorizationHeaders(token)
|
|
295
|
+
});
|
|
296
|
+
const pageProjects = Array.isArray(data.projects) ? data.projects : [];
|
|
297
|
+
projects.push(...pageProjects);
|
|
298
|
+
const nextCursor = data.pagination?.next;
|
|
299
|
+
if (!nextCursor || pageProjects.length === 0) {
|
|
300
|
+
break;
|
|
301
|
+
}
|
|
302
|
+
until = String(nextCursor);
|
|
303
|
+
}
|
|
304
|
+
return projects;
|
|
305
|
+
}
|
|
306
|
+
function getProjectGitHubRepo(project) {
|
|
307
|
+
const linkedOwner = project.link?.org?.trim();
|
|
308
|
+
const linkedRepo = project.link?.repo?.trim();
|
|
309
|
+
if (linkedOwner && linkedRepo) {
|
|
310
|
+
return { owner: linkedOwner, repo: linkedRepo };
|
|
311
|
+
}
|
|
312
|
+
const deploymentWithGitHubMeta = project.latestDeployments?.find((deployment) => deployment.meta?.githubOrg?.trim() && deployment.meta?.githubRepo?.trim());
|
|
313
|
+
const metaOwner = deploymentWithGitHubMeta?.meta?.githubOrg?.trim();
|
|
314
|
+
const metaRepo = deploymentWithGitHubMeta?.meta?.githubRepo?.trim();
|
|
315
|
+
return metaOwner && metaRepo ? { owner: metaOwner, repo: metaRepo } : null;
|
|
316
|
+
}
|
|
317
|
+
async function installWorkerProject(baseUrl, token, team, options) {
|
|
318
|
+
log(options, "Installing team skill runner project...");
|
|
319
|
+
const response = await fetchJsonResponse(`${baseUrl}/api/skill-runner-teams/worker`, {
|
|
320
|
+
method: "POST",
|
|
321
|
+
headers: {
|
|
322
|
+
...authorizationHeaders(token),
|
|
323
|
+
"Content-Type": "application/json"
|
|
324
|
+
},
|
|
325
|
+
body: JSON.stringify({ team: team.id })
|
|
326
|
+
});
|
|
327
|
+
if (!response.ok || !response.data?.success) {
|
|
328
|
+
throw new Error(response.data?.error || `Failed to install runner project (${response.status}).`);
|
|
329
|
+
}
|
|
330
|
+
const workerStatus = response.data.settings?.workerStatus;
|
|
331
|
+
const project = response.data.project;
|
|
332
|
+
const isReady = response.data.installed &&
|
|
333
|
+
Boolean(project?.workerBaseUrl || response.data.settings?.workerBaseUrl) &&
|
|
334
|
+
!project?.missingEnvKeys?.length &&
|
|
335
|
+
project?.shellVersionStatus !== "outdated" &&
|
|
336
|
+
workerStatus === "ready";
|
|
337
|
+
if (!isReady) {
|
|
338
|
+
const message = response.data.message ||
|
|
339
|
+
`Runner project is not ready yet${workerStatus ? ` (status: ${workerStatus})` : ""}. Open the report link after setup completes, then retry.`;
|
|
340
|
+
throw new Error(message);
|
|
341
|
+
}
|
|
342
|
+
log(options, `${chalk.green("✓")} Team skill runner project is ready`);
|
|
343
|
+
}
|
|
344
|
+
async function startSkillRun(input) {
|
|
345
|
+
const response = await fetchJsonResponse(`${input.baseUrl}/api/cloud/start-fix`, {
|
|
346
|
+
method: "POST",
|
|
347
|
+
headers: {
|
|
348
|
+
...authorizationHeaders(input.token),
|
|
349
|
+
"Content-Type": "application/json"
|
|
350
|
+
},
|
|
351
|
+
body: JSON.stringify({
|
|
352
|
+
userId: input.user.id,
|
|
353
|
+
skillRunnerId: "deepsec",
|
|
354
|
+
skillRunnerTeam: {
|
|
355
|
+
id: input.team.id,
|
|
356
|
+
slug: input.team.slug,
|
|
357
|
+
name: input.team.name,
|
|
358
|
+
isPersonal: input.team.isPersonal
|
|
359
|
+
},
|
|
360
|
+
projectName: input.project.name,
|
|
361
|
+
projectId: input.project.id,
|
|
362
|
+
teamId: input.teamScope,
|
|
363
|
+
projectDir: input.projectDir,
|
|
364
|
+
repoUrl: `https://github.com/${input.githubRepo.owner}/${input.githubRepo.repo}`,
|
|
365
|
+
repoOwner: input.githubRepo.owner,
|
|
366
|
+
repoName: input.githubRepo.repo,
|
|
367
|
+
repoBranch: input.branch,
|
|
368
|
+
baseBranch: input.branch,
|
|
369
|
+
submitPullRequest: true,
|
|
370
|
+
productionUrl: input.productionUrl,
|
|
371
|
+
useV0DevAgentRunner: true
|
|
372
|
+
})
|
|
373
|
+
});
|
|
374
|
+
return {
|
|
375
|
+
...response.data,
|
|
376
|
+
success: response.ok && response.data?.success === true
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
async function waitForRun(baseUrl, userId, runId, options) {
|
|
380
|
+
log(options, "Waiting for run to finish...");
|
|
381
|
+
for (let attempt = 0; attempt < 720; attempt++) {
|
|
382
|
+
const run = await fetchRun(baseUrl, userId, runId);
|
|
383
|
+
if (run?.status && run.status !== "running") {
|
|
384
|
+
return run;
|
|
385
|
+
}
|
|
386
|
+
await new Promise((resolve) => setTimeout(resolve, 5000));
|
|
387
|
+
}
|
|
388
|
+
throw new Error("Timed out waiting for DeepSec run to finish.");
|
|
389
|
+
}
|
|
390
|
+
async function fetchRun(baseUrl, userId, runId) {
|
|
391
|
+
const apiUrl = new URL(`${baseUrl}/api/dev-agents/runs`);
|
|
392
|
+
apiUrl.searchParams.set("userId", userId);
|
|
393
|
+
const data = await fetchJson(apiUrl.toString());
|
|
394
|
+
const runs = Array.isArray(data.runs) ? data.runs : [];
|
|
395
|
+
return runs.find((run) => run.id === runId) || null;
|
|
396
|
+
}
|
|
397
|
+
function formatRunCompletion(run, reportUrl) {
|
|
398
|
+
const status = run.status || "unknown";
|
|
399
|
+
const cost = run.formattedCost || formatCost(run.cost ?? run.totalCost);
|
|
400
|
+
const duration = run.duration ? `, ${run.duration}` : "";
|
|
401
|
+
const costText = cost ? `, ${cost}` : "";
|
|
402
|
+
const errorText = run.error ? `\n${chalk.red(run.error)}` : "";
|
|
403
|
+
return `${chalk.bold("Run finished:")} ${status}${duration}${costText}\n${chalk.bold("Report:")} ${reportUrl}${errorText}`;
|
|
404
|
+
}
|
|
405
|
+
async function fetchJson(url, init) {
|
|
406
|
+
const response = await fetchJsonResponse(url, init);
|
|
407
|
+
if (!response.ok) {
|
|
408
|
+
throw new Error(formatFetchError(url, response.status, response.data));
|
|
409
|
+
}
|
|
410
|
+
return response.data;
|
|
411
|
+
}
|
|
412
|
+
async function fetchJsonResponse(url, init) {
|
|
413
|
+
const response = await fetch(url, init);
|
|
414
|
+
const text = await response.text();
|
|
415
|
+
let data = null;
|
|
416
|
+
if (text.trim()) {
|
|
417
|
+
try {
|
|
418
|
+
data = JSON.parse(text);
|
|
419
|
+
}
|
|
420
|
+
catch {
|
|
421
|
+
throw new Error(`${url} returned invalid JSON: ${text.slice(0, 300)}`);
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
return {
|
|
425
|
+
ok: response.ok,
|
|
426
|
+
status: response.status,
|
|
427
|
+
data: data
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
function formatFetchError(url, status, data) {
|
|
431
|
+
const error = typeof data === "object" && data !== null ? data.error : undefined;
|
|
432
|
+
const message = typeof error === "object" && error !== null
|
|
433
|
+
? stringValue(error.message)
|
|
434
|
+
: stringValue(error) ||
|
|
435
|
+
(typeof data === "object" && data !== null ? stringValue(data.message) : "");
|
|
436
|
+
let hostname = "";
|
|
437
|
+
try {
|
|
438
|
+
hostname = new URL(url).hostname;
|
|
439
|
+
}
|
|
440
|
+
catch {
|
|
441
|
+
hostname = "";
|
|
442
|
+
}
|
|
443
|
+
if (hostname === "api.vercel.com" && status === 401) {
|
|
444
|
+
return "Vercel authentication failed. Run `vercel login`, or set VERCEL_TOKEN to a token that can access the target team.";
|
|
445
|
+
}
|
|
446
|
+
if (hostname === "api.vercel.com" && status === 403) {
|
|
447
|
+
return `Vercel API access was denied${message ? `: ${message}` : "."} Re-authenticate with \`vercel login\`; for SAML teams, re-authenticate that scope in the Vercel CLI, then retry.`;
|
|
448
|
+
}
|
|
449
|
+
return `${url} failed (${status})${message ? `: ${message}` : ""}`;
|
|
450
|
+
}
|
|
451
|
+
function authorizationHeaders(token) {
|
|
452
|
+
return {
|
|
453
|
+
Authorization: `Bearer ${token}`
|
|
454
|
+
};
|
|
455
|
+
}
|
|
456
|
+
function normalizeBaseUrl(value) {
|
|
457
|
+
return value.replace(/\/+$/, "");
|
|
458
|
+
}
|
|
459
|
+
function stringValue(value) {
|
|
460
|
+
return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
|
|
461
|
+
}
|
|
462
|
+
function isSkillRunnerWorkerProject(name) {
|
|
463
|
+
const normalizedName = name.trim().toLowerCase();
|
|
464
|
+
return normalizedName === "d3k-skill-runner" || normalizedName.startsWith("d3k-skill-runner-");
|
|
465
|
+
}
|
|
466
|
+
function formatCost(value) {
|
|
467
|
+
if (typeof value === "number" && Number.isFinite(value)) {
|
|
468
|
+
return `$${value.toFixed(2)}`;
|
|
469
|
+
}
|
|
470
|
+
if (typeof value !== "string") {
|
|
471
|
+
return null;
|
|
472
|
+
}
|
|
473
|
+
const parsed = Number(value.replace(/[^0-9.]/g, ""));
|
|
474
|
+
if (!Number.isFinite(parsed)) {
|
|
475
|
+
return value;
|
|
476
|
+
}
|
|
477
|
+
return `$${parsed.toFixed(2)}`;
|
|
478
|
+
}
|
|
479
|
+
function log(options, message) {
|
|
480
|
+
if (!options.json) {
|
|
481
|
+
console.log(message);
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
function startSpinner(options, message) {
|
|
485
|
+
if (options.json || !process.stderr.isTTY) {
|
|
486
|
+
return null;
|
|
487
|
+
}
|
|
488
|
+
return ora({
|
|
489
|
+
text: message,
|
|
490
|
+
spinner: "dots",
|
|
491
|
+
stream: process.stderr
|
|
492
|
+
}).start();
|
|
493
|
+
}
|
|
494
|
+
//# sourceMappingURL=skill-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-runner.js","sourceRoot":"","sources":["../../src/commands/skill-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -39,8 +39,9 @@ interface DevEnvironmentOptions {
|
|
|
39
39
|
port: string;
|
|
40
40
|
serverCommand: string;
|
|
41
41
|
startupTimeoutSeconds: number;
|
|
42
|
+
browserNavigationTimeoutSeconds: number;
|
|
42
43
|
profileDir: string;
|
|
43
|
-
browserTool: "agent-browser"
|
|
44
|
+
browserTool: "agent-browser";
|
|
44
45
|
logFile: string;
|
|
45
46
|
debug?: boolean;
|
|
46
47
|
serversOnly?: boolean;
|
|
@@ -57,9 +58,11 @@ interface DevEnvironmentOptions {
|
|
|
57
58
|
debugPort?: number;
|
|
58
59
|
headless?: boolean;
|
|
59
60
|
withAgent?: string;
|
|
61
|
+
agentName?: string;
|
|
60
62
|
skillsAgentId?: string;
|
|
61
63
|
autoSkills?: boolean;
|
|
62
64
|
installSkills?: boolean;
|
|
65
|
+
screenshotsDir?: string;
|
|
63
66
|
}
|
|
64
67
|
/**
|
|
65
68
|
* Count active d3k instances by checking PID files in tmpdir.
|
|
@@ -69,6 +72,26 @@ interface DevEnvironmentOptions {
|
|
|
69
72
|
* This function is used to reason about multi-instance shutdown behavior.
|
|
70
73
|
*/
|
|
71
74
|
export declare function countActiveD3kInstances(excludeCurrentPid?: boolean): number;
|
|
75
|
+
type D3kLockInfo = {
|
|
76
|
+
pid: number;
|
|
77
|
+
cwd?: string | null;
|
|
78
|
+
createdAt?: string | null;
|
|
79
|
+
processStartTime?: string | null;
|
|
80
|
+
};
|
|
81
|
+
type LockValidationResult = {
|
|
82
|
+
active: boolean;
|
|
83
|
+
reason: string;
|
|
84
|
+
lockInfo: D3kLockInfo | null;
|
|
85
|
+
};
|
|
86
|
+
type LockValidationDeps = {
|
|
87
|
+
processExists?: (pid: number) => boolean;
|
|
88
|
+
getProcessStartTime?: (pid: number) => string | null;
|
|
89
|
+
getProcessCommand?: (pid: number) => string | null;
|
|
90
|
+
};
|
|
91
|
+
export declare function parseD3kLockContent(content: string): D3kLockInfo | null;
|
|
92
|
+
export declare function getProcessStartTime(pid: number): string | null;
|
|
93
|
+
export declare function getProcessCommand(pid: number): string | null;
|
|
94
|
+
export declare function validateD3kLockContent(content: string, deps?: LockValidationDeps): LockValidationResult;
|
|
72
95
|
/**
|
|
73
96
|
* Check if a server is actually listening and responding on a port.
|
|
74
97
|
* Used for waiting for a dev server to start up.
|
|
@@ -82,7 +105,7 @@ export declare function isServerListening(port: string | number): Promise<Server
|
|
|
82
105
|
export declare function tryHttpConnection(port: string | number): Promise<boolean>;
|
|
83
106
|
export declare function tryHttpsConnection(port: string | number): Promise<boolean>;
|
|
84
107
|
export declare function findAvailablePort(startPort: number): Promise<string>;
|
|
85
|
-
export declare function createPersistentLogFile(): string;
|
|
108
|
+
export declare function createPersistentLogFile(override?: string): string;
|
|
86
109
|
/**
|
|
87
110
|
* Write session info for external tooling to discover.
|
|
88
111
|
*
|
|
@@ -94,7 +117,7 @@ export declare function createPersistentLogFile(): string;
|
|
|
94
117
|
* processes belong to THIS d3k instance so we don't accidentally kill
|
|
95
118
|
* Chrome instances from other d3k sessions.
|
|
96
119
|
*/
|
|
97
|
-
export declare function writeSessionInfo(projectName: string, logFilePath: string, appPort: string, publicUrl?: string | null, cdpUrl?: string | null, chromePids?: number[], serverCommand?: string, framework?: "nextjs" | "svelte" | "other", serverPid?: number, skillsInstalled?: string[], skillsAgentId?: string | null, preferredBrowserTool?: "agent-browser" |
|
|
120
|
+
export declare function writeSessionInfo(projectName: string, logFilePath: string, appPort: string, publicUrl?: string | null, cdpUrl?: string | null, chromePids?: number[], serverCommand?: string, framework?: "nextjs" | "svelte" | "other", serverPid?: number, skillsInstalled?: string[], skillsAgentId?: string | null, preferredBrowserTool?: "agent-browser", agentName?: string | null): void;
|
|
98
121
|
export declare function getSessionChromePids(projectName: string): number[];
|
|
99
122
|
export declare class DevEnvironment {
|
|
100
123
|
private serverProcess;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-environment.d.ts","sourceRoot":"","sources":["../src/dev-environment.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dev-environment.d.ts","sourceRoot":"","sources":["../src/dev-environment.ts"],"names":[],"mappings":"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"}
|