@claudexor/harness-cursor 3.5.0 → 3.8.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/dist/smoke.js ADDED
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Isolated Cursor API-key smoke: prove a key actually serves a turn inside a
3
+ * scrubbed throwaway HOME before the route ladder may prefer it. Split from
4
+ * index.ts (the complexity ratchet's smaller-owner rule), mirroring the
5
+ * harness-codex/harness-claude `smoke.ts` siblings.
6
+ */
7
+ import { mkdirSync, mkdtempSync, rmSync } from "node:fs";
8
+ import { tmpdir } from "node:os";
9
+ import { join } from "node:path";
10
+ import { providerScrubEnv, runCapture } from "@claudexor/core";
11
+ import { redactSecrets } from "@claudexor/util";
12
+ import { BIN } from "./index.js";
13
+ /** The route did not need (or could not run) the isolated key smoke. */
14
+ export const unsmokedApiSmoke = (key) => ({
15
+ ok: false,
16
+ detail: key ? "Cursor API-key smoke not required for selected route" : "no Cursor API key",
17
+ });
18
+ export function cursorApiSmokeFinalText(stdout) {
19
+ const replies = [];
20
+ for (const rawLine of stdout.replaceAll("\r", "").split("\n")) {
21
+ const line = rawLine.trim();
22
+ if (!line)
23
+ continue;
24
+ let obj;
25
+ try {
26
+ obj = JSON.parse(line);
27
+ }
28
+ catch {
29
+ continue;
30
+ }
31
+ if (!obj || typeof obj !== "object")
32
+ continue;
33
+ const record = obj;
34
+ if (record["type"] === "assistant") {
35
+ const message = record["message"];
36
+ const content = message && typeof message === "object"
37
+ ? message["content"]
38
+ : undefined;
39
+ if (!Array.isArray(content))
40
+ continue;
41
+ for (const block of content) {
42
+ if (!block || typeof block !== "object")
43
+ continue;
44
+ const text = block["text"];
45
+ if (typeof text === "string" && text.trim())
46
+ replies.push(text);
47
+ }
48
+ }
49
+ else if (record["type"] === "result") {
50
+ const result = record["result"];
51
+ if (typeof result === "string" && result.trim())
52
+ replies.push(result);
53
+ }
54
+ }
55
+ return replies.at(-1)?.trim() ?? null;
56
+ }
57
+ export function cursorApiSmokeUsedEnvKey(stdout) {
58
+ for (const rawLine of stdout.replaceAll("\r", "").split("\n")) {
59
+ const line = rawLine.trim();
60
+ if (!line)
61
+ continue;
62
+ let obj;
63
+ try {
64
+ obj = JSON.parse(line);
65
+ }
66
+ catch {
67
+ continue;
68
+ }
69
+ if (!obj || typeof obj !== "object")
70
+ continue;
71
+ const record = obj;
72
+ if (record["type"] === "system" && record["apiKeySource"] === "env")
73
+ return true;
74
+ }
75
+ return false;
76
+ }
77
+ export function cursorApiSmokePassed(code, stdout) {
78
+ return code === 0 && cursorApiSmokeUsedEnvKey(stdout) && cursorApiSmokeFinalText(stdout) === "OK";
79
+ }
80
+ export async function cleanupCursorSmokeBase(base, opts = {}) {
81
+ const remove = opts.remove ?? ((path) => rmSync(path, { recursive: true, force: true }));
82
+ const sleepMs = opts.sleepMs ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
83
+ const retries = opts.retries ?? 2;
84
+ for (let attempt = 0;; attempt += 1) {
85
+ try {
86
+ remove(base);
87
+ return;
88
+ }
89
+ catch {
90
+ if (attempt >= retries)
91
+ return;
92
+ await sleepMs(25 * (attempt + 1));
93
+ }
94
+ }
95
+ }
96
+ // (bridgeMacLoginKeychain retired — owner decision D-U3: the host Keychain is
97
+ // never read, probed, or bridged; native cursor sessions live only in
98
+ // account-row file stores.)
99
+ export async function smokeIsolatedApiKey(key, options = {}) {
100
+ if (!key)
101
+ return { ok: false, detail: "no Cursor API key" };
102
+ const base = options.makeBaseDir?.() ?? mkdtempSync(join(tmpdir(), "claudexor-cursor-smoke-"));
103
+ const home = join(base, "home");
104
+ try {
105
+ mkdirSync(join(home, ".config"), { recursive: true, mode: 0o700 });
106
+ // No Keychain bridge (D-U3): the key smoke proves the API route with the
107
+ // key alone — bridging the host Keychain could silently authenticate the
108
+ // smoke with the HOST login instead of the key under test.
109
+ const env = {
110
+ ...providerScrubEnv(),
111
+ HOME: home,
112
+ XDG_CONFIG_HOME: join(home, ".config"),
113
+ CURSOR_API_KEY: key,
114
+ };
115
+ const r = await (options.runCapture ?? runCapture)(BIN, ["-p", "--output-format", "stream-json", "--mode", "plan", "--trust", "Reply exactly OK"], {
116
+ env,
117
+ timeoutMs: 45_000,
118
+ });
119
+ const text = `${r.stdout}\n${r.stderr}`;
120
+ if (cursorApiSmokePassed(r.code, r.stdout))
121
+ return { ok: true, detail: "isolated cursor-agent API-key smoke passed" };
122
+ return {
123
+ ok: false,
124
+ detail: `isolated cursor-agent API-key smoke failed (exit ${r.code ?? "signal"}): ${redactSecrets(text).trim().split("\n").slice(-3).join(" ").slice(0, 500)}`,
125
+ };
126
+ }
127
+ catch (err) {
128
+ return {
129
+ ok: false,
130
+ detail: `isolated cursor-agent API-key smoke failed (${err instanceof Error ? err.message.split("\n")[0] : String(err)})`,
131
+ };
132
+ }
133
+ finally {
134
+ await (options.cleanupBase ?? cleanupCursorSmokeBase)(base);
135
+ }
136
+ }
137
+ //# sourceMappingURL=smoke.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smoke.js","sourceRoot":"","sources":["../src/smoke.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@claudexor/harness-cursor",
3
- "version": "3.5.0",
3
+ "version": "3.8.0",
4
4
  "license": "MIT",
5
5
  "description": "Cursor CLI adapter (cursor-agent -p --output-format stream-json).",
6
6
  "type": "module",
@@ -16,10 +16,10 @@
16
16
  "dist"
17
17
  ],
18
18
  "dependencies": {
19
- "@claudexor/schema": "3.5.0",
20
- "@claudexor/util": "3.5.0",
21
- "@claudexor/secrets": "3.5.0",
22
- "@claudexor/core": "3.5.0"
19
+ "@claudexor/schema": "3.8.0",
20
+ "@claudexor/util": "3.8.0",
21
+ "@claudexor/secrets": "3.8.0",
22
+ "@claudexor/core": "3.8.0"
23
23
  },
24
24
  "repository": {
25
25
  "type": "git",