@zmeel/adapter-cursor-local 0.1.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/LICENSE +21 -0
- package/dist/cli/format-event.d.ts +2 -0
- package/dist/cli/format-event.d.ts.map +1 -0
- package/dist/cli/format-event.js +296 -0
- package/dist/cli/format-event.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +81 -0
- package/dist/index.js.map +1 -0
- package/dist/server/execute.d.ts +15 -0
- package/dist/server/execute.d.ts.map +1 -0
- package/dist/server/execute.js +429 -0
- package/dist/server/execute.js.map +1 -0
- package/dist/server/index.d.ts +7 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +62 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/parse.d.ts +13 -0
- package/dist/server/parse.d.ts.map +1 -0
- package/dist/server/parse.js +139 -0
- package/dist/server/parse.js.map +1 -0
- package/dist/server/skills.d.ts +8 -0
- package/dist/server/skills.d.ts.map +1 -0
- package/dist/server/skills.js +69 -0
- package/dist/server/skills.js.map +1 -0
- package/dist/server/test.d.ts +10 -0
- package/dist/server/test.d.ts.map +1 -0
- package/dist/server/test.js +236 -0
- package/dist/server/test.js.map +1 -0
- package/dist/shared/stream.d.ts +5 -0
- package/dist/shared/stream.d.ts.map +1 -0
- package/dist/shared/stream.js +13 -0
- package/dist/shared/stream.js.map +1 -0
- package/dist/shared/trust.d.ts +2 -0
- package/dist/shared/trust.d.ts.map +1 -0
- package/dist/shared/trust.js +7 -0
- package/dist/shared/trust.js.map +1 -0
- package/dist/ui/build-config.d.ts +3 -0
- package/dist/ui/build-config.d.ts.map +1 -0
- package/dist/ui/build-config.js +92 -0
- package/dist/ui/build-config.js.map +1 -0
- package/dist/ui/index.d.ts +3 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +3 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/parse-stdout.d.ts +3 -0
- package/dist/ui/parse-stdout.d.ts.map +1 -0
- package/dist/ui/parse-stdout.js +373 -0
- package/dist/ui/parse-stdout.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { asString, asNumber, parseObject, parseJson } from "@zmeel/adapter-utils/server-utils";
|
|
2
|
+
import { normalizeCursorStreamLine } from "../shared/stream.js";
|
|
3
|
+
function asErrorText(value) {
|
|
4
|
+
if (typeof value === "string")
|
|
5
|
+
return value;
|
|
6
|
+
const rec = parseObject(value);
|
|
7
|
+
const message = asString(rec.message, "") ||
|
|
8
|
+
asString(rec.error, "") ||
|
|
9
|
+
asString(rec.code, "") ||
|
|
10
|
+
asString(rec.detail, "");
|
|
11
|
+
if (message)
|
|
12
|
+
return message;
|
|
13
|
+
try {
|
|
14
|
+
return JSON.stringify(rec);
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return "";
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function collectAssistantText(message) {
|
|
21
|
+
if (typeof message === "string") {
|
|
22
|
+
const trimmed = message.trim();
|
|
23
|
+
return trimmed ? [trimmed] : [];
|
|
24
|
+
}
|
|
25
|
+
const rec = parseObject(message);
|
|
26
|
+
const direct = asString(rec.text, "").trim();
|
|
27
|
+
const lines = direct ? [direct] : [];
|
|
28
|
+
const content = Array.isArray(rec.content) ? rec.content : [];
|
|
29
|
+
for (const partRaw of content) {
|
|
30
|
+
const part = parseObject(partRaw);
|
|
31
|
+
const type = asString(part.type, "").trim();
|
|
32
|
+
if (type === "output_text" || type === "text") {
|
|
33
|
+
const text = asString(part.text, "").trim();
|
|
34
|
+
if (text)
|
|
35
|
+
lines.push(text);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return lines;
|
|
39
|
+
}
|
|
40
|
+
function readSessionId(event) {
|
|
41
|
+
return (asString(event.session_id, "").trim() ||
|
|
42
|
+
asString(event.sessionId, "").trim() ||
|
|
43
|
+
asString(event.sessionID, "").trim() ||
|
|
44
|
+
null);
|
|
45
|
+
}
|
|
46
|
+
export function parseCursorJsonl(stdout) {
|
|
47
|
+
let sessionId = null;
|
|
48
|
+
const messages = [];
|
|
49
|
+
let errorMessage = null;
|
|
50
|
+
let totalCostUsd = 0;
|
|
51
|
+
const usage = {
|
|
52
|
+
inputTokens: 0,
|
|
53
|
+
cachedInputTokens: 0,
|
|
54
|
+
outputTokens: 0,
|
|
55
|
+
};
|
|
56
|
+
for (const rawLine of stdout.split(/\r?\n/)) {
|
|
57
|
+
const line = normalizeCursorStreamLine(rawLine).line;
|
|
58
|
+
if (!line)
|
|
59
|
+
continue;
|
|
60
|
+
const event = parseJson(line);
|
|
61
|
+
if (!event)
|
|
62
|
+
continue;
|
|
63
|
+
const foundSession = readSessionId(event);
|
|
64
|
+
if (foundSession)
|
|
65
|
+
sessionId = foundSession;
|
|
66
|
+
const type = asString(event.type, "").trim();
|
|
67
|
+
if (type === "assistant") {
|
|
68
|
+
messages.push(...collectAssistantText(event.message));
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
if (type === "result") {
|
|
72
|
+
const usageObj = parseObject(event.usage);
|
|
73
|
+
usage.inputTokens += asNumber(usageObj.input_tokens, asNumber(usageObj.inputTokens, 0));
|
|
74
|
+
usage.cachedInputTokens += asNumber(usageObj.cached_input_tokens, asNumber(usageObj.cachedInputTokens, asNumber(usageObj.cache_read_input_tokens, 0)));
|
|
75
|
+
usage.outputTokens += asNumber(usageObj.output_tokens, asNumber(usageObj.outputTokens, 0));
|
|
76
|
+
totalCostUsd += asNumber(event.total_cost_usd, asNumber(event.cost_usd, asNumber(event.cost, 0)));
|
|
77
|
+
const isError = event.is_error === true || asString(event.subtype, "").toLowerCase() === "error";
|
|
78
|
+
const resultText = asString(event.result, "").trim();
|
|
79
|
+
if (resultText && messages.length === 0) {
|
|
80
|
+
messages.push(resultText);
|
|
81
|
+
}
|
|
82
|
+
if (isError) {
|
|
83
|
+
const resultError = asErrorText(event.error ?? event.message ?? event.result).trim();
|
|
84
|
+
if (resultError)
|
|
85
|
+
errorMessage = resultError;
|
|
86
|
+
}
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
if (type === "error") {
|
|
90
|
+
const message = asErrorText(event.message ?? event.error ?? event.detail).trim();
|
|
91
|
+
if (message)
|
|
92
|
+
errorMessage = message;
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
if (type === "system") {
|
|
96
|
+
const subtype = asString(event.subtype, "").trim().toLowerCase();
|
|
97
|
+
if (subtype === "error") {
|
|
98
|
+
const message = asErrorText(event.message ?? event.error ?? event.detail).trim();
|
|
99
|
+
if (message)
|
|
100
|
+
errorMessage = message;
|
|
101
|
+
}
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
// Compatibility with older stream-json shapes.
|
|
105
|
+
if (type === "text") {
|
|
106
|
+
const part = parseObject(event.part);
|
|
107
|
+
const text = asString(part.text, "").trim();
|
|
108
|
+
if (text)
|
|
109
|
+
messages.push(text);
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
if (type === "step_finish") {
|
|
113
|
+
const part = parseObject(event.part);
|
|
114
|
+
const tokens = parseObject(part.tokens);
|
|
115
|
+
const cache = parseObject(tokens.cache);
|
|
116
|
+
usage.inputTokens += asNumber(tokens.input, 0);
|
|
117
|
+
usage.cachedInputTokens += asNumber(cache.read, 0);
|
|
118
|
+
usage.outputTokens += asNumber(tokens.output, 0);
|
|
119
|
+
totalCostUsd += asNumber(part.cost, 0);
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
sessionId,
|
|
125
|
+
summary: messages.join("\n\n").trim(),
|
|
126
|
+
usage,
|
|
127
|
+
costUsd: totalCostUsd > 0 ? totalCostUsd : null,
|
|
128
|
+
errorMessage,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
export function isCursorUnknownSessionError(stdout, stderr) {
|
|
132
|
+
const haystack = `${stdout}\n${stderr}`
|
|
133
|
+
.split(/\r?\n/)
|
|
134
|
+
.map((line) => line.trim())
|
|
135
|
+
.filter(Boolean)
|
|
136
|
+
.join("\n");
|
|
137
|
+
return /unknown\s+(session|chat)|session\s+.*\s+not\s+found|chat\s+.*\s+not\s+found|resume\s+.*\s+not\s+found|could\s+not\s+resume/i.test(haystack);
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/server/parse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AdapterSkillContext, AdapterSkillSnapshot } from "@zmeel/adapter-utils";
|
|
2
|
+
export declare function listCursorSkills(ctx: AdapterSkillContext): Promise<AdapterSkillSnapshot>;
|
|
3
|
+
export declare function syncCursorSkills(ctx: AdapterSkillContext, desiredSkills: string[]): Promise<AdapterSkillSnapshot>;
|
|
4
|
+
export declare function resolveCursorDesiredSkillNames(config: Record<string, unknown>, availableEntries: Array<{
|
|
5
|
+
key: string;
|
|
6
|
+
required?: boolean;
|
|
7
|
+
}>): string[];
|
|
8
|
+
//# sourceMappingURL=skills.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/server/skills.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,sBAAsB,CAAC;AA2C9B,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAE9F;AAED,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,mBAAmB,EACxB,aAAa,EAAE,MAAM,EAAE,GACtB,OAAO,CAAC,oBAAoB,CAAC,CA0B/B;AAED,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,gBAAgB,EAAE,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,YAG7D"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { buildPersistentSkillSnapshot, ensurezmeelSkillSymlink, readzmeelRuntimeSkillEntries, readInstalledSkillTargets, resolvezmeelDesiredSkillNames, } from "@zmeel/adapter-utils/server-utils";
|
|
6
|
+
const __moduleDir = path.dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
function asString(value) {
|
|
8
|
+
return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
|
|
9
|
+
}
|
|
10
|
+
function resolveCursorSkillsHome(config) {
|
|
11
|
+
const env = typeof config.env === "object" && config.env !== null && !Array.isArray(config.env)
|
|
12
|
+
? config.env
|
|
13
|
+
: {};
|
|
14
|
+
const configuredHome = asString(env.HOME);
|
|
15
|
+
const home = configuredHome ? path.resolve(configuredHome) : os.homedir();
|
|
16
|
+
return path.join(home, ".cursor", "skills");
|
|
17
|
+
}
|
|
18
|
+
async function buildCursorSkillSnapshot(config) {
|
|
19
|
+
const availableEntries = await readzmeelRuntimeSkillEntries(config, __moduleDir);
|
|
20
|
+
const desiredSkills = resolvezmeelDesiredSkillNames(config, availableEntries);
|
|
21
|
+
const skillsHome = resolveCursorSkillsHome(config);
|
|
22
|
+
const installed = await readInstalledSkillTargets(skillsHome);
|
|
23
|
+
return buildPersistentSkillSnapshot({
|
|
24
|
+
adapterType: "cursor",
|
|
25
|
+
availableEntries,
|
|
26
|
+
desiredSkills,
|
|
27
|
+
installed,
|
|
28
|
+
skillsHome,
|
|
29
|
+
locationLabel: "~/.cursor/skills",
|
|
30
|
+
missingDetail: "Configured but not currently linked into the Cursor skills home.",
|
|
31
|
+
externalConflictDetail: "Skill name is occupied by an external installation.",
|
|
32
|
+
externalDetail: "Installed outside zmeel management.",
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
export async function listCursorSkills(ctx) {
|
|
36
|
+
return buildCursorSkillSnapshot(ctx.config);
|
|
37
|
+
}
|
|
38
|
+
export async function syncCursorSkills(ctx, desiredSkills) {
|
|
39
|
+
const availableEntries = await readzmeelRuntimeSkillEntries(ctx.config, __moduleDir);
|
|
40
|
+
const desiredSet = new Set([
|
|
41
|
+
...desiredSkills,
|
|
42
|
+
...availableEntries.filter((entry) => entry.required).map((entry) => entry.key),
|
|
43
|
+
]);
|
|
44
|
+
const skillsHome = resolveCursorSkillsHome(ctx.config);
|
|
45
|
+
await fs.mkdir(skillsHome, { recursive: true });
|
|
46
|
+
const installed = await readInstalledSkillTargets(skillsHome);
|
|
47
|
+
const availableByRuntimeName = new Map(availableEntries.map((entry) => [entry.runtimeName, entry]));
|
|
48
|
+
for (const available of availableEntries) {
|
|
49
|
+
if (!desiredSet.has(available.key))
|
|
50
|
+
continue;
|
|
51
|
+
const target = path.join(skillsHome, available.runtimeName);
|
|
52
|
+
await ensurezmeelSkillSymlink(available.source, target);
|
|
53
|
+
}
|
|
54
|
+
for (const [name, installedEntry] of installed.entries()) {
|
|
55
|
+
const available = availableByRuntimeName.get(name);
|
|
56
|
+
if (!available)
|
|
57
|
+
continue;
|
|
58
|
+
if (desiredSet.has(available.key))
|
|
59
|
+
continue;
|
|
60
|
+
if (installedEntry.targetPath !== available.source)
|
|
61
|
+
continue;
|
|
62
|
+
await fs.unlink(path.join(skillsHome, name)).catch(() => { });
|
|
63
|
+
}
|
|
64
|
+
return buildCursorSkillSnapshot(ctx.config);
|
|
65
|
+
}
|
|
66
|
+
export function resolveCursorDesiredSkillNames(config, availableEntries) {
|
|
67
|
+
return resolvezmeelDesiredSkillNames(config, availableEntries);
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/server/skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AdapterEnvironmentTestContext, AdapterEnvironmentTestResult } from "@zmeel/adapter-utils";
|
|
2
|
+
export interface CursorAuthInfo {
|
|
3
|
+
email: string | null;
|
|
4
|
+
displayName: string | null;
|
|
5
|
+
userId: number | null;
|
|
6
|
+
}
|
|
7
|
+
export declare function cursorConfigPath(cursorHome?: string): string;
|
|
8
|
+
export declare function readCursorAuthInfo(cursorHome?: string): Promise<CursorAuthInfo | null>;
|
|
9
|
+
export declare function testEnvironment(ctx: AdapterEnvironmentTestContext): Promise<AdapterEnvironmentTestResult>;
|
|
10
|
+
//# sourceMappingURL=test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/server/test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,6BAA6B,EAC7B,4BAA4B,EAC7B,MAAM,sBAAsB,CAAC;AAiD9B,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,wBAAgB,gBAAgB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,wBAAsB,kBAAkB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAuB5F;AAKD,wBAAsB,eAAe,CACnC,GAAG,EAAE,6BAA6B,GACjC,OAAO,CAAC,4BAA4B,CAAC,CAsKvC"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { asString, asStringArray, parseObject, ensureAbsoluteDirectory, ensureCommandResolvable, ensurePathInEnv, runChildProcess, } from "@zmeel/adapter-utils/server-utils";
|
|
2
|
+
import fs from "node:fs/promises";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { DEFAULT_CURSOR_LOCAL_MODEL } from "../index.js";
|
|
6
|
+
import { parseCursorJsonl } from "./parse.js";
|
|
7
|
+
import { hasCursorTrustBypassArg } from "../shared/trust.js";
|
|
8
|
+
function summarizeStatus(checks) {
|
|
9
|
+
if (checks.some((check) => check.level === "error"))
|
|
10
|
+
return "fail";
|
|
11
|
+
if (checks.some((check) => check.level === "warn"))
|
|
12
|
+
return "warn";
|
|
13
|
+
return "pass";
|
|
14
|
+
}
|
|
15
|
+
function isNonEmpty(value) {
|
|
16
|
+
return typeof value === "string" && value.trim().length > 0;
|
|
17
|
+
}
|
|
18
|
+
function firstNonEmptyLine(text) {
|
|
19
|
+
return (text
|
|
20
|
+
.split(/\r?\n/)
|
|
21
|
+
.map((line) => line.trim())
|
|
22
|
+
.find(Boolean) ?? "");
|
|
23
|
+
}
|
|
24
|
+
function commandLooksLike(command, expected) {
|
|
25
|
+
const base = path.basename(command).toLowerCase();
|
|
26
|
+
return base === expected || base === `${expected}.cmd` || base === `${expected}.exe`;
|
|
27
|
+
}
|
|
28
|
+
function summarizeProbeDetail(stdout, stderr, parsedError) {
|
|
29
|
+
const raw = parsedError?.trim() || firstNonEmptyLine(stderr) || firstNonEmptyLine(stdout);
|
|
30
|
+
if (!raw)
|
|
31
|
+
return null;
|
|
32
|
+
const clean = raw.replace(/\s+/g, " ").trim();
|
|
33
|
+
const max = 240;
|
|
34
|
+
return clean.length > max ? `${clean.slice(0, max - 1)}…` : clean;
|
|
35
|
+
}
|
|
36
|
+
export function cursorConfigPath(cursorHome) {
|
|
37
|
+
return path.join(cursorHome ?? path.join(os.homedir(), ".cursor"), "cli-config.json");
|
|
38
|
+
}
|
|
39
|
+
export async function readCursorAuthInfo(cursorHome) {
|
|
40
|
+
let raw;
|
|
41
|
+
try {
|
|
42
|
+
raw = await fs.readFile(cursorConfigPath(cursorHome), "utf8");
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
let parsed;
|
|
48
|
+
try {
|
|
49
|
+
parsed = JSON.parse(raw);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
if (typeof parsed !== "object" || parsed === null)
|
|
55
|
+
return null;
|
|
56
|
+
const obj = parsed;
|
|
57
|
+
const authInfo = obj.authInfo;
|
|
58
|
+
if (typeof authInfo !== "object" || authInfo === null)
|
|
59
|
+
return null;
|
|
60
|
+
const info = authInfo;
|
|
61
|
+
const email = typeof info.email === "string" && info.email.trim().length > 0 ? info.email.trim() : null;
|
|
62
|
+
const displayName = typeof info.displayName === "string" && info.displayName.trim().length > 0 ? info.displayName.trim() : null;
|
|
63
|
+
const userId = typeof info.userId === "number" ? info.userId : null;
|
|
64
|
+
if (!email && !displayName && userId == null)
|
|
65
|
+
return null;
|
|
66
|
+
return { email, displayName, userId };
|
|
67
|
+
}
|
|
68
|
+
const CURSOR_AUTH_REQUIRED_RE = /(?:authentication\s+required|not\s+authenticated|not\s+logged\s+in|unauthorized|invalid(?:\s+or\s+missing)?\s+api(?:[_\s-]?key)?|cursor[_\s-]?api[_\s-]?key|run\s+'?agent\s+login'?\s+first|api(?:[_\s-]?key)?(?:\s+is)?\s+required)/i;
|
|
69
|
+
export async function testEnvironment(ctx) {
|
|
70
|
+
const checks = [];
|
|
71
|
+
const config = parseObject(ctx.config);
|
|
72
|
+
const command = asString(config.command, "agent");
|
|
73
|
+
const cwd = asString(config.cwd, process.cwd());
|
|
74
|
+
try {
|
|
75
|
+
await ensureAbsoluteDirectory(cwd, { createIfMissing: true });
|
|
76
|
+
checks.push({
|
|
77
|
+
code: "cursor_cwd_valid",
|
|
78
|
+
level: "info",
|
|
79
|
+
message: `Working directory is valid: ${cwd}`,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
checks.push({
|
|
84
|
+
code: "cursor_cwd_invalid",
|
|
85
|
+
level: "error",
|
|
86
|
+
message: err instanceof Error ? err.message : "Invalid working directory",
|
|
87
|
+
detail: cwd,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
const envConfig = parseObject(config.env);
|
|
91
|
+
const env = {};
|
|
92
|
+
for (const [key, value] of Object.entries(envConfig)) {
|
|
93
|
+
if (typeof value === "string")
|
|
94
|
+
env[key] = value;
|
|
95
|
+
}
|
|
96
|
+
const runtimeEnv = ensurePathInEnv({ ...process.env, ...env });
|
|
97
|
+
try {
|
|
98
|
+
await ensureCommandResolvable(command, cwd, runtimeEnv);
|
|
99
|
+
checks.push({
|
|
100
|
+
code: "cursor_command_resolvable",
|
|
101
|
+
level: "info",
|
|
102
|
+
message: `Command is executable: ${command}`,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
checks.push({
|
|
107
|
+
code: "cursor_command_unresolvable",
|
|
108
|
+
level: "error",
|
|
109
|
+
message: err instanceof Error ? err.message : "Command is not executable",
|
|
110
|
+
detail: command,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
const configCursorApiKey = env.CURSOR_API_KEY;
|
|
114
|
+
const hostCursorApiKey = process.env.CURSOR_API_KEY;
|
|
115
|
+
if (isNonEmpty(configCursorApiKey) || isNonEmpty(hostCursorApiKey)) {
|
|
116
|
+
const source = isNonEmpty(configCursorApiKey) ? "adapter config env" : "server environment";
|
|
117
|
+
checks.push({
|
|
118
|
+
code: "cursor_api_key_present",
|
|
119
|
+
level: "info",
|
|
120
|
+
message: "CURSOR_API_KEY is set for Cursor authentication.",
|
|
121
|
+
detail: `Detected in ${source}.`,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
const cursorHome = isNonEmpty(env.CURSOR_HOME) ? env.CURSOR_HOME : undefined;
|
|
126
|
+
const cursorAuth = await readCursorAuthInfo(cursorHome).catch(() => null);
|
|
127
|
+
if (cursorAuth) {
|
|
128
|
+
checks.push({
|
|
129
|
+
code: "cursor_native_auth_present",
|
|
130
|
+
level: "info",
|
|
131
|
+
message: "Cursor is authenticated via `agent login`.",
|
|
132
|
+
detail: cursorAuth.email
|
|
133
|
+
? `Logged in as ${cursorAuth.email}.`
|
|
134
|
+
: `Credentials found in ${cursorConfigPath(cursorHome)}.`,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
checks.push({
|
|
139
|
+
code: "cursor_api_key_missing",
|
|
140
|
+
level: "warn",
|
|
141
|
+
message: "CURSOR_API_KEY is not set. Cursor runs may fail until authentication is configured.",
|
|
142
|
+
hint: "Set CURSOR_API_KEY in adapter env or run `agent login`.",
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
const canRunProbe = checks.every((check) => check.code !== "cursor_cwd_invalid" && check.code !== "cursor_command_unresolvable");
|
|
147
|
+
if (canRunProbe) {
|
|
148
|
+
if (!commandLooksLike(command, "agent")) {
|
|
149
|
+
checks.push({
|
|
150
|
+
code: "cursor_hello_probe_skipped_custom_command",
|
|
151
|
+
level: "info",
|
|
152
|
+
message: "Skipped hello probe because command is not `agent`.",
|
|
153
|
+
detail: command,
|
|
154
|
+
hint: "Use the `agent` CLI command to run the automatic installation and auth probe.",
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
const model = asString(config.model, DEFAULT_CURSOR_LOCAL_MODEL).trim();
|
|
159
|
+
const extraArgs = (() => {
|
|
160
|
+
const fromExtraArgs = asStringArray(config.extraArgs);
|
|
161
|
+
if (fromExtraArgs.length > 0)
|
|
162
|
+
return fromExtraArgs;
|
|
163
|
+
return asStringArray(config.args);
|
|
164
|
+
})();
|
|
165
|
+
const autoTrustEnabled = !hasCursorTrustBypassArg(extraArgs);
|
|
166
|
+
const args = ["-p", "--mode", "ask", "--output-format", "json", "--workspace", cwd];
|
|
167
|
+
if (model)
|
|
168
|
+
args.push("--model", model);
|
|
169
|
+
if (autoTrustEnabled)
|
|
170
|
+
args.push("--yolo");
|
|
171
|
+
if (extraArgs.length > 0)
|
|
172
|
+
args.push(...extraArgs);
|
|
173
|
+
args.push("Respond with hello.");
|
|
174
|
+
const probe = await runChildProcess(`cursor-envtest-${Date.now()}-${Math.random().toString(16).slice(2)}`, command, args, {
|
|
175
|
+
cwd,
|
|
176
|
+
env,
|
|
177
|
+
timeoutSec: 45,
|
|
178
|
+
graceSec: 5,
|
|
179
|
+
onLog: async () => { },
|
|
180
|
+
});
|
|
181
|
+
const parsed = parseCursorJsonl(probe.stdout);
|
|
182
|
+
const detail = summarizeProbeDetail(probe.stdout, probe.stderr, parsed.errorMessage);
|
|
183
|
+
const authEvidence = `${parsed.errorMessage ?? ""}\n${probe.stdout}\n${probe.stderr}`.trim();
|
|
184
|
+
if (probe.timedOut) {
|
|
185
|
+
checks.push({
|
|
186
|
+
code: "cursor_hello_probe_timed_out",
|
|
187
|
+
level: "warn",
|
|
188
|
+
message: "Cursor hello probe timed out.",
|
|
189
|
+
hint: "Retry the probe. If this persists, verify `agent -p --mode ask --output-format json \"Respond with hello.\"` manually.",
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
else if ((probe.exitCode ?? 1) === 0) {
|
|
193
|
+
const summary = parsed.summary.trim();
|
|
194
|
+
const hasHello = /\bhello\b/i.test(summary);
|
|
195
|
+
checks.push({
|
|
196
|
+
code: hasHello ? "cursor_hello_probe_passed" : "cursor_hello_probe_unexpected_output",
|
|
197
|
+
level: hasHello ? "info" : "warn",
|
|
198
|
+
message: hasHello
|
|
199
|
+
? "Cursor hello probe succeeded."
|
|
200
|
+
: "Cursor probe ran but did not return `hello` as expected.",
|
|
201
|
+
...(summary ? { detail: summary.replace(/\s+/g, " ").trim().slice(0, 240) } : {}),
|
|
202
|
+
...(hasHello
|
|
203
|
+
? {}
|
|
204
|
+
: {
|
|
205
|
+
hint: "Try `agent -p --mode ask --output-format json \"Respond with hello.\"` manually to inspect full output.",
|
|
206
|
+
}),
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
else if (CURSOR_AUTH_REQUIRED_RE.test(authEvidence)) {
|
|
210
|
+
checks.push({
|
|
211
|
+
code: "cursor_hello_probe_auth_required",
|
|
212
|
+
level: "warn",
|
|
213
|
+
message: "Cursor CLI is installed, but authentication is not ready.",
|
|
214
|
+
...(detail ? { detail } : {}),
|
|
215
|
+
hint: "Run `agent login` or configure CURSOR_API_KEY in adapter env/shell, then retry the probe.",
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
checks.push({
|
|
220
|
+
code: "cursor_hello_probe_failed",
|
|
221
|
+
level: "error",
|
|
222
|
+
message: "Cursor hello probe failed.",
|
|
223
|
+
...(detail ? { detail } : {}),
|
|
224
|
+
hint: "Run `agent -p --mode ask --output-format json \"Respond with hello.\"` manually in this working directory to debug.",
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
return {
|
|
230
|
+
adapterType: ctx.adapterType,
|
|
231
|
+
status: summarizeStatus(checks),
|
|
232
|
+
checks,
|
|
233
|
+
testedAt: new Date().toISOString(),
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/server/test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/shared/stream.ts"],"names":[],"mappings":"AAAA,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG;IAC1D,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAAC;IACnC,IAAI,EAAE,MAAM,CAAC;CACd,CAYA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export function normalizeCursorStreamLine(rawLine) {
|
|
2
|
+
const trimmed = rawLine.trim();
|
|
3
|
+
if (!trimmed)
|
|
4
|
+
return { stream: null, line: "" };
|
|
5
|
+
const prefixed = trimmed.match(/^(stdout|stderr)\s*[:=]?\s*([\[{].*)$/i);
|
|
6
|
+
if (!prefixed) {
|
|
7
|
+
return { stream: null, line: trimmed };
|
|
8
|
+
}
|
|
9
|
+
const stream = prefixed[1]?.toLowerCase() === "stderr" ? "stderr" : "stdout";
|
|
10
|
+
const line = (prefixed[2] ?? "").trim();
|
|
11
|
+
return { stream, line };
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/shared/stream.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,yBAAyB,CAAC,OAAe;IAIvD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAEhD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;IACzE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IACzC,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC7E,MAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACxC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trust.d.ts","sourceRoot":"","sources":["../../src/shared/trust.ts"],"names":[],"mappings":"AAAA,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAQxE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trust.js","sourceRoot":"","sources":["../../src/shared/trust.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,uBAAuB,CAAC,IAAuB;IAC7D,OAAO,IAAI,CAAC,IAAI,CACd,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,KAAK,SAAS;QACjB,GAAG,KAAK,QAAQ;QAChB,GAAG,KAAK,IAAI;QACZ,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,CAC7B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-config.d.ts","sourceRoot":"","sources":["../../src/ui/build-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AA2D/D,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAsBrF"}
|