@euqns/nudge-mcp 1.8.0 → 1.10.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.
@@ -1,10 +1,8 @@
1
1
  import { spawn, spawnSync } from "node:child_process";
2
- import { mkdtemp, mkdir, rm, writeFile } from "node:fs/promises";
3
- import os from "node:os";
4
- import path from "node:path";
5
2
  import readline from "node:readline";
6
- import { companionMcpTransport, parseCursorModels, subscriptionEnvironment } from "../codex-companion.js";
7
- import { buildTriagePrompt, coerceVerdict, emptyUsage, } from "./types.js";
3
+ import { cursorEnvironment, parseCursorModels } from "../codex-companion.js";
4
+ import { ensureCursorConfigDir } from "./isolation.js";
5
+ import { emptyUsage, } from "./types.js";
8
6
  export const CURSOR_CLI = process.platform === "win32" ? "cursor-agent.cmd" : "cursor-agent";
9
7
  export function parseCursorEvent(line) {
10
8
  try {
@@ -41,45 +39,44 @@ export function resolveCursorModel(alias, available) {
41
39
  const matched = cursorModelMatches(requested, available);
42
40
  if (matched)
43
41
  return matched;
44
- throw new Error(`Cursor model alias "${requested}" is unavailable. Available models: ${available.join(", ") || "none discovered"}. ` +
42
+ // With no discovered models we can't tell a bad alias from discovery having
43
+ // failed silently — pass it through and let the CLI itself validate it.
44
+ if (available.length === 0)
45
+ return requested;
46
+ throw new Error(`Cursor model alias "${requested}" is unavailable. Available models: ${available.join(", ")}. ` +
45
47
  "Install/update cursor-agent and sign in with `cursor-agent login`, then retry.");
46
48
  }
49
+ // detectEngines() is awaited before the runner registers or subscribes to any
50
+ // job — so a `cursor-agent` call that hangs (stalled network check, waiting on
51
+ // a TTY prompt that never comes) blocks startup forever, which reads on the
52
+ // board as "runner never picks up the job". Every other CLI probe in this file
53
+ // has a timeout; this one didn't, and cursor-agent hanging on a bad network or
54
+ // stale login is exactly the kind of thing that happens on a runner host.
55
+ const LIST_MODELS_TIMEOUT_MS = 8_000;
47
56
  async function listModels() {
48
57
  const result = await new Promise((resolve, reject) => {
49
58
  const child = spawn(CURSOR_CLI, ["--list-models"], {
50
- env: subscriptionEnvironment(),
59
+ env: cursorEnvironment(),
51
60
  stdio: ["ignore", "pipe", "pipe"],
52
61
  });
53
62
  let stdout = "";
54
63
  let stderr = "";
64
+ const timer = setTimeout(() => child.kill("SIGKILL"), LIST_MODELS_TIMEOUT_MS);
55
65
  child.stdout.on("data", (chunk) => { stdout += chunk.toString("utf8"); });
56
66
  child.stderr.on("data", (chunk) => { stderr = `${stderr}${chunk.toString("utf8")}`.slice(-8_000); });
57
- child.once("error", reject);
58
- child.once("close", (code) => resolve({ stdout, stderr, code }));
67
+ child.once("error", (error) => { clearTimeout(timer); reject(error); });
68
+ child.once("close", (code) => { clearTimeout(timer); resolve({ stdout, stderr, code }); });
59
69
  });
60
70
  if (result.code !== 0)
61
- throw new Error(result.stderr.trim() || `Cursor model discovery exited ${result.code}`);
62
- return parseCursorModels(result.stdout).map((model) => model.model);
71
+ throw new Error(result.stderr.trim() || `Cursor model discovery exited ${result.code} (timed out or failed)`);
72
+ // Cursor renders the list through its console-io UI writer, which can land
73
+ // on stderr even on a clean exit.
74
+ return parseCursorModels(`${result.stdout}\n${result.stderr}`).map((model) => model.model);
63
75
  }
64
76
  async function isolatedCursorEnv(options) {
65
- const home = await mkdtemp(path.join(os.tmpdir(), "nudge-cursor-"));
66
- const cursorDir = path.join(home, ".cursor");
67
- await mkdir(cursorDir, { recursive: true });
68
- const transport = companionMcpTransport();
69
- await writeFile(path.join(cursorDir, "mcp.json"), JSON.stringify({
70
- mcpServers: {
71
- nudge: {
72
- command: transport.command,
73
- args: transport.args,
74
- env: options.env ?? {},
75
- },
76
- },
77
- }));
78
- const env = subscriptionEnvironment({ ...process.env, ...(options.env ?? {}) });
79
- return {
80
- env: { ...env, HOME: home, CURSOR_CONFIG_DIR: cursorDir, XDG_CONFIG_HOME: home },
81
- cleanup: async () => { await rm(home, { recursive: true, force: true }); },
82
- };
77
+ const cursorDir = await ensureCursorConfigDir(options.env);
78
+ const env = cursorEnvironment({ ...process.env, ...(options.env ?? {}) });
79
+ return { env: { ...env, CURSOR_CONFIG_DIR: cursorDir } };
83
80
  }
84
81
  function usageFrom(value) {
85
82
  const usage = value && typeof value === "object" ? value : {};
@@ -113,15 +110,14 @@ export class CursorEngine {
113
110
  displayName = "Cursor";
114
111
  models = [];
115
112
  async detect() {
116
- const version = spawnSync(CURSOR_CLI, ["--version"], { encoding: "utf8", stdio: ["ignore", "pipe", "pipe"] });
113
+ const env = cursorEnvironment();
114
+ // `--version`/`--help` are local/offline, unlike `--list-models`, but a
115
+ // timeout here too means one wedged process can never hang startup.
116
+ const version = spawnSync(CURSOR_CLI, ["--version"], { encoding: "utf8", stdio: ["ignore", "pipe", "pipe"], env, timeout: LIST_MODELS_TIMEOUT_MS });
117
117
  if (version.error || version.status !== 0)
118
118
  return { available: false, detail: "cursor-agent CLI not found" };
119
- const help = spawnSync(CURSOR_CLI, ["--help"], { encoding: "utf8", stdio: ["ignore", "pipe", "pipe"] });
119
+ const help = spawnSync(CURSOR_CLI, ["--help"], { encoding: "utf8", stdio: ["ignore", "pipe", "pipe"], env, timeout: LIST_MODELS_TIMEOUT_MS });
120
120
  const helpText = `${help.stdout ?? ""}\n${help.stderr ?? ""}`;
121
- const status = spawnSync(CURSOR_CLI, ["status"], { encoding: "utf8", stdio: ["ignore", "pipe", "pipe"] });
122
- const authenticated = status.status === 0 && !/not logged|log in|unauthorized/i.test(`${status.stdout ?? ""}\n${status.stderr ?? ""}`);
123
- if (!authenticated)
124
- return { available: false, detail: "cursor-agent is installed but not authenticated" };
125
121
  try {
126
122
  this.models = await listModels();
127
123
  }
@@ -135,11 +131,10 @@ export class CursorEngine {
135
131
  modes: ["plan", "ask", "agent"].filter((mode) => mode === "agent" || helpText.includes(mode)),
136
132
  resume: helpText.includes("--resume") || helpText.includes("--continue"),
137
133
  };
138
- return { available: true, detail: `${capabilities.version} · ${this.models.length} models`, capabilities };
139
- }
140
- async triage(options) {
141
- const result = await this.execute({ ...options, prompt: buildTriagePrompt(options.prompt), readOnly: true, model: options.model ?? "auto" });
142
- return { verdict: coerceVerdict(result.summary), usage: result.usage, threadId: result.threadId };
134
+ const detail = this.models.length > 0
135
+ ? `${capabilities.version} · ${this.models.length} models`
136
+ : `${capabilities.version} · models unknown`;
137
+ return { available: true, detail, capabilities };
143
138
  }
144
139
  async execute(options) {
145
140
  const models = this.models.length ? this.models : await listModels();
@@ -197,9 +192,6 @@ export class CursorEngine {
197
192
  if (!options.signal.aborted)
198
193
  throw caught;
199
194
  }
200
- finally {
201
- await runtime.cleanup();
202
- }
203
195
  return { summary, threadId, resolvedModel, usage, costBasis: "subscription", error };
204
196
  }
205
197
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/engines/cursor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/engines/cursor.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,29 @@
1
1
  import assert from "node:assert/strict";
2
2
  import test from "node:test";
3
+ import { cursorEnvironment, parseCursorModels } from "../codex-companion.js";
3
4
  import { cursorModelMatches, parseCursorEvent, resolveCursorModel } from "./cursor.js";
4
5
  test("Cursor resolves exact and latest family aliases", () => {
5
6
  assert.equal(resolveCursorModel("grok-4.6", ["grok-4.6", "composer-1"]), "grok-4.6");
6
7
  assert.equal(resolveCursorModel("composer-latest", ["composer-1", "gpt-5"]), "composer-1");
7
8
  });
9
+ test("Cursor passes an alias through when discovery found nothing", () => {
10
+ // Empty discovery can mean "auth failed and the list is empty", not "this
11
+ // alias doesn't exist" — let the CLI itself validate rather than pre-failing.
12
+ assert.equal(resolveCursorModel("grok-4.6", []), "grok-4.6");
13
+ });
14
+ test("Cursor still throws when a non-empty list has no match", () => {
15
+ assert.throws(() => resolveCursorModel("gpt-6", ["grok-4.6", "composer-1"]), /alias "gpt-6" is unavailable.*Available models: grok-4\.6, composer-1/);
16
+ });
17
+ test("Cursor model list parses from stderr-rendered output", () => {
18
+ const models = parseCursorModels("\ngrok-4.6\ncomposer-1 (default)\n").map((m) => m.model);
19
+ assert.deepEqual(models, ["grok-4.6", "composer-1"]);
20
+ });
21
+ test("Cursor env keeps CURSOR_API_KEY and never overrides HOME", () => {
22
+ const env = cursorEnvironment({ CURSOR_API_KEY: "sk-test", HOME: "/Users/real", ANTHROPIC_API_KEY: "secret" });
23
+ assert.equal(env.CURSOR_API_KEY, "sk-test");
24
+ assert.equal(env.HOME, "/Users/real");
25
+ assert.equal(env.ANTHROPIC_API_KEY, undefined);
26
+ });
8
27
  test("cursorModelMatches matches exact, case-insensitive, and family stem", () => {
9
28
  assert.equal(cursorModelMatches("grok-4.6", ["grok-4.6", "composer-1"]), "grok-4.6");
10
29
  assert.equal(cursorModelMatches("Grok-4.6", ["grok-4.6-fast"]), "grok-4.6-fast");
@@ -1 +1 @@
1
- {"version":3,"file":"cursor.test.js","sourceRoot":"","sources":["../../src/engines/cursor.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEvF,IAAI,CAAC,iDAAiD,EAAE,GAAG,EAAE;IAC3D,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,UAAU,EAAE,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IACrF,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,iBAAiB,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;AAC7F,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,qEAAqE,EAAE,GAAG,EAAE;IAC/E,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,UAAU,EAAE,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IACrF,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,UAAU,EAAE,CAAC,eAAe,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;IACjF,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,UAAU,EAAE,CAAC,eAAe,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;IACjF,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,iBAAiB,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IAC3F,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC5E,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;AACzD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sDAAsD,EAAE,GAAG,EAAE;IAChE,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,kBAAkB,CAAC,UAAU,EAAE,CAAC,YAAY,CAAC,CAAC,EACpD,oFAAoF,CACrF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6CAA6C,EAAE,GAAG,EAAE;IACvD,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,yDAAyD,CAAC,EAAE;QAC5F,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,MAAM;QACd,UAAU,EAAE,QAAQ;KACrB,CAAC,CAAC;IACH,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"cursor.test.js","sourceRoot":"","sources":["../../src/engines/cursor.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEvF,IAAI,CAAC,iDAAiD,EAAE,GAAG,EAAE;IAC3D,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,UAAU,EAAE,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IACrF,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,iBAAiB,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;AAC7F,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6DAA6D,EAAE,GAAG,EAAE;IACvE,0EAA0E;IAC1E,8EAA8E;IAC9E,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;AAC/D,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,wDAAwD,EAAE,GAAG,EAAE;IAClE,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,EAC7D,uEAAuE,CACxE,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sDAAsD,EAAE,GAAG,EAAE;IAChE,MAAM,MAAM,GAAG,iBAAiB,CAAC,oCAAoC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC3F,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC;AACvD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,0DAA0D,EAAE,GAAG,EAAE;IACpE,MAAM,GAAG,GAAG,iBAAiB,CAAC,EAAE,cAAc,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC/G,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;IAC5C,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACtC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,qEAAqE,EAAE,GAAG,EAAE;IAC/E,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,UAAU,EAAE,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IACrF,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,UAAU,EAAE,CAAC,eAAe,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;IACjF,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,UAAU,EAAE,CAAC,eAAe,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;IACjF,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,iBAAiB,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IAC3F,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC5E,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;AACzD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sDAAsD,EAAE,GAAG,EAAE;IAChE,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,kBAAkB,CAAC,UAAU,EAAE,CAAC,YAAY,CAAC,CAAC,EACpD,oFAAoF,CACrF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6CAA6C,EAAE,GAAG,EAAE;IACvD,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,yDAAyD,CAAC,EAAE;QAC5F,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,MAAM;QACd,UAAU,EAAE,QAAQ;KACrB,CAAC,CAAC;IACH,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC"}
@@ -98,6 +98,62 @@ export async function ensureCodexShadowHome() {
98
98
  effort: carried.model_reasoning_effort ?? null,
99
99
  };
100
100
  }
101
+ const CURSOR_CONFIG_ROOT = path.join(NUDGE_DIR, "cursor-config");
102
+ const CURSOR_CONFIG_MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000;
103
+ /**
104
+ * Cursor's CLI reads its login from `os.homedir()`/`XDG_CONFIG_HOME`, not
105
+ * `CURSOR_CONFIG_DIR` — so, unlike Codex, isolation here must leave `HOME`
106
+ * alone entirely and only point `CURSOR_CONFIG_DIR` at a directory holding
107
+ * nothing but our `mcp.json`. The directory is keyed by job id (falling back
108
+ * to the process id for an ad-hoc run) so concurrent jobs never share — and
109
+ * race on — the same `mcp.json`, and it's kept (not deleted) after the run so
110
+ * `--resume <threadId>` can find the chat later, since Cursor stores chat
111
+ * history under the config dir.
112
+ */
113
+ export async function ensureCursorConfigDir(env) {
114
+ await fs.mkdir(CURSOR_CONFIG_ROOT, { recursive: true, mode: 0o700 });
115
+ await pruneOldCursorConfigDirs();
116
+ // The runner daemon's own process never has NUDGE_RUNNER_JOB set — only the
117
+ // per-job env passed in here does (see runOptions.env in runner.ts). Falling
118
+ // back to process.env before pid means every job resolved to the same
119
+ // adhoc-<pid> directory, defeating the per-job isolation this dir exists for.
120
+ const jobId = env?.NUDGE_RUNNER_JOB || process.env.NUDGE_RUNNER_JOB || `adhoc-${process.pid}`;
121
+ const dir = path.join(CURSOR_CONFIG_ROOT, jobId);
122
+ await fs.mkdir(dir, { recursive: true, mode: 0o700 });
123
+ const transport = companionMcpTransport();
124
+ await fs.writeFile(path.join(dir, "mcp.json"), JSON.stringify({
125
+ mcpServers: {
126
+ nudge: {
127
+ command: transport.command,
128
+ args: transport.args,
129
+ env: env ?? {},
130
+ },
131
+ },
132
+ }), { mode: 0o600 });
133
+ return dir;
134
+ }
135
+ async function pruneOldCursorConfigDirs() {
136
+ let entries;
137
+ try {
138
+ entries = await fs.readdir(CURSOR_CONFIG_ROOT);
139
+ }
140
+ catch {
141
+ return;
142
+ }
143
+ const now = Date.now();
144
+ await Promise.all(entries.map(async (entry) => {
145
+ const entryPath = path.join(CURSOR_CONFIG_ROOT, entry);
146
+ try {
147
+ const stat = await fs.stat(entryPath);
148
+ if (now - stat.mtimeMs > CURSOR_CONFIG_MAX_AGE_MS) {
149
+ await fs.rm(entryPath, { recursive: true, force: true });
150
+ }
151
+ }
152
+ catch {
153
+ // Raced with another job's cleanup or the entry vanished; ignore.
154
+ }
155
+ }));
156
+ }
101
157
  /**
102
158
  * The MCP servers a job is allowed to see, in Claude Code's `--mcp-config`
103
159
  * shape. Exactly one: the Nudge board API. Paired with `--strict-mcp-config`,
@@ -1 +1 @@
1
- {"version":3,"file":"isolation.js","sourceRoot":"","sources":["../../src/engines/isolation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"isolation.js","sourceRoot":"","sources":["../../src/engines/isolation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import assert from "node:assert/strict";
2
+ import { rm } from "node:fs/promises";
3
+ import test from "node:test";
4
+ import { ensureCursorConfigDir } from "./isolation.js";
5
+ // ensureCursorConfigDir used to key its per-job directory off
6
+ // process.env.NUDGE_RUNNER_JOB, which the runner daemon never sets — only the
7
+ // per-job `env` argument does. That collapsed every job onto one adhoc-<pid>
8
+ // directory, so concurrent jobs raced on the same mcp.json.
9
+ test("Cursor config dir is keyed by the job's own env, not the daemon's", async () => {
10
+ const originalEnvJob = process.env.NUDGE_RUNNER_JOB;
11
+ let dirA;
12
+ let dirB;
13
+ try {
14
+ delete process.env.NUDGE_RUNNER_JOB;
15
+ dirA = await ensureCursorConfigDir({ NUDGE_RUNNER_JOB: "nudge-test-job-a" });
16
+ dirB = await ensureCursorConfigDir({ NUDGE_RUNNER_JOB: "nudge-test-job-b" });
17
+ assert.notEqual(dirA, dirB);
18
+ assert.match(dirA, /nudge-test-job-a$/);
19
+ assert.match(dirB, /nudge-test-job-b$/);
20
+ }
21
+ finally {
22
+ if (originalEnvJob === undefined)
23
+ delete process.env.NUDGE_RUNNER_JOB;
24
+ else
25
+ process.env.NUDGE_RUNNER_JOB = originalEnvJob;
26
+ if (dirA)
27
+ await rm(dirA, { recursive: true, force: true });
28
+ if (dirB)
29
+ await rm(dirB, { recursive: true, force: true });
30
+ }
31
+ });
32
+ //# sourceMappingURL=isolation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isolation.test.js","sourceRoot":"","sources":["../../src/engines/isolation.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACtC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,8DAA8D;AAC9D,8EAA8E;AAC9E,6EAA6E;AAC7E,4DAA4D;AAC5D,IAAI,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;IACnF,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IACpD,IAAI,IAAwB,CAAC;IAC7B,IAAI,IAAwB,CAAC;IAC7B,IAAI,CAAC;QACH,OAAO,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;QACpC,IAAI,GAAG,MAAM,qBAAqB,CAAC,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC7E,IAAI,GAAG,MAAM,qBAAqB,CAAC,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC7E,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC5B,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;IAC1C,CAAC;YAAS,CAAC;QACT,IAAI,cAAc,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;;YACjE,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,cAAc,CAAC;QACnD,IAAI,IAAI;YAAE,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,IAAI,IAAI;YAAE,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -1,111 +1,4 @@
1
- // The engine abstraction: one interface, two local coding agents behind it.
2
- //
3
- // A "job" runs in two phases and both go through this interface:
4
- //
5
- // triage() — read-only. The agent decides whether it can actually do the
6
- // task, and returns a structured verdict. Nothing is written.
7
- // execute() — the real work, with write access to the checkout.
8
- //
9
- // Keeping triage read-only is the point of splitting them. An agent that
10
- // discovers mid-edit that it needed a decision from a human leaves a
11
- // half-modified working copy behind; one that answers the question first
12
- // leaves the checkout untouched.
13
- // The contract for the triage turn. Kept identical across engines so a verdict
14
- // means the same thing regardless of which agent produced it.
15
- export const TRIAGE_SCHEMA = {
16
- type: "object",
17
- properties: {
18
- verdict: { type: "string", enum: ["can_do", "needs_human"] },
19
- reason: {
20
- type: "string",
21
- description: "One or two sentences explaining the call, written for the person who filed the task.",
22
- },
23
- questions: {
24
- type: "array",
25
- items: { type: "string" },
26
- description: "Specific decisions or information you need from a human. Empty when verdict is can_do.",
27
- },
28
- confidence: { type: "number", description: "0 to 1." },
29
- },
30
- // EVERY property must be listed. Codex validates this schema under OpenAI's
31
- // strict structured-output rules, where a property that isn't required is a
32
- // hard rejection — and the failure surfaces only as `Codex Exec exited with
33
- // code 1` with no explanation, which is a miserable thing to debug. Optional
34
- // semantics are expressed by letting the model send an empty array / 0
35
- // rather than by omitting the key.
36
- required: ["verdict", "reason", "questions", "confidence"],
37
- additionalProperties: false,
38
- };
39
- // Deliberately biased toward attempting the work. A triage step that bounces
40
- // anything ambiguous back to a human is worse than no triage step at all — it
41
- // adds latency and teaches people to ignore it. The bar for needs_human is a
42
- // decision only a person can make, not merely a task that looks hard.
43
- export function buildTriagePrompt(taskPrompt) {
44
- return [
45
- "You are triaging a task before starting work on it. Do NOT modify anything.",
46
- "Read whatever you need from the repository to make an informed call, then answer.",
47
- "",
48
- "IMPORTANT — about this environment: the triage turn itself runs deliberately",
49
- "restricted (read-only filesystem, network blocked, some tools disabled). Those",
50
- "limits apply ONLY to this check, NOT to the actual work turn, which has full",
51
- "write access to the checkout and — when the task involves committing, pushing,",
52
- "or opening a PR — network and GitHub (git/ssh/gh) access on this machine.",
53
- "NEVER answer needs_human because of missing write access, blocked network, or",
54
- "GitHub authentication errors you observe here: you cannot measure the work",
55
- "turn's capabilities from inside this sandbox.",
56
- "",
57
- "Decide between:",
58
- ' "can_do" — you can complete this yourself with the access you have.',
59
- ' "needs_human" — you cannot finish without a decision or information only a person can give.',
60
- "",
61
- "Choose needs_human ONLY for things like: the task is ambiguous in a way that",
62
- "changes the outcome, it requires credentials or access you don't have, it asks",
63
- "for a product or design decision, or the repository contradicts the request.",
64
- "Do NOT choose needs_human just because the task is large, touches many files,",
65
- "or looks difficult — that is ordinary work. When in doubt, choose can_do.",
66
- "",
67
- "If you choose needs_human, list the specific questions a person must answer.",
68
- "",
69
- "--- TASK ---",
70
- taskPrompt,
71
- ].join("\n");
72
- }
73
- // Accept whatever the model produced and coerce it into a usable verdict.
74
- // A malformed triage response must never strand a job: if we can't read it,
75
- // we fall through to can_do and let the work phase surface any real problem.
76
- export function coerceVerdict(raw) {
77
- const obj = (typeof raw === "string" ? safeParse(raw) : raw);
78
- const verdict = obj?.verdict === "needs_human" ? "needs_human" : "can_do";
79
- const reason = typeof obj?.reason === "string" && obj.reason.trim()
80
- ? obj.reason.trim()
81
- : verdict === "can_do"
82
- ? "Proceeding."
83
- : "The agent asked for human input but gave no reason.";
84
- const questions = Array.isArray(obj?.questions)
85
- ? obj.questions.filter((q) => typeof q === "string")
86
- : undefined;
87
- const confidence = typeof obj?.confidence === "number" ? obj.confidence : undefined;
88
- return { verdict, reason, questions, confidence };
89
- }
90
- function safeParse(text) {
91
- try {
92
- return JSON.parse(text);
93
- }
94
- catch {
95
- // Models sometimes wrap JSON in prose or a fenced block. Take the widest
96
- // brace-delimited span and try that before giving up.
97
- const start = text.indexOf("{");
98
- const end = text.lastIndexOf("}");
99
- if (start === -1 || end <= start)
100
- return null;
101
- try {
102
- return JSON.parse(text.slice(start, end + 1));
103
- }
104
- catch {
105
- return null;
106
- }
107
- }
108
- }
1
+ // The engine abstraction: local coding agents behind one writable work turn.
109
2
  export function emptyUsage() {
110
3
  return { inputTokens: 0, outputTokens: 0 };
111
4
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/engines/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/engines/types.ts"],"names":[],"mappings":"AAAA,6EAA6E;AA+F7E,MAAM,UAAU,UAAU;IACxB,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,CAAc,EAAE,CAAc;IACrD,MAAM,GAAG,GAAG,CAAC,CAAU,EAAE,CAAU,EAAE,EAAE,CACrC,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACvE,OAAO;QACL,WAAW,EAAE,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW;QAC1C,YAAY,EAAE,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY;QAC7C,iBAAiB,EAAE,GAAG,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC,iBAAiB,CAAC;QAChE,mBAAmB,EAAE,GAAG,CAAC,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC,mBAAmB,CAAC;QACtE,eAAe,EAAE,GAAG,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,eAAe,CAAC;KAC3D,CAAC;AACJ,CAAC"}
package/dist/index.js CHANGED
@@ -318,7 +318,7 @@ kind='html' renders a complete single-page HTML document in a sandboxed iframe o
318
318
  # Identifiers
319
319
  All ids are opaque Convex strings ("k…" / "j…" / similar). Treat them as opaque.`;
320
320
  const ACTIVE_INSTRUCTIONS = RUNNER_JOB?.kind === "intake"
321
- ? `${INSTRUCTIONS}\n\nINTAKE REWRITE MODE: This is a read-only AI Rewrite turn. Only read tools, one \`create_card\` call, and \`ask_human\` are available. Inspect the repository as context, then create exactly one polished title and structured Markdown description. Do not implement, edit files, run CI, complete, move, comment, create subtasks, or request review.`
321
+ ? `${INSTRUCTIONS}\n\nINTAKE REWRITE MODE: This is a read-only AI Rewrite turn. Inspect the repository as context, then END your final message with the complete card: a \`TASK TITLE: <title>\` line, then a \`TASK DESCRIPTION:\` line, then the full Markdown description. The runner creates the card from that closing message in one sweep no tool call is needed (a single direct \`create_card\` call also works but is unnecessary). Only read tools and \`ask_human\` should otherwise be used. Do not implement, edit files, run CI, complete, move, comment, create subtasks, or request review.`
322
322
  : INSTRUCTIONS;
323
323
  // ---- tool definitions -----------------------------------------------------
324
324
  // Schemas defined with zod so we get runtime validation AND can dump JSON