ur-agent 1.37.1 → 1.37.3
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/CHANGELOG.md +26 -0
- package/RELEASE.md +13 -0
- package/bin/ur.js +56 -4
- package/dist/cli.js +1039 -683
- package/docs/IDE.md +8 -3
- package/docs/providers.md +29 -0
- package/documentation/index.html +10 -10
- package/extensions/vscode-ur-inline-diffs/README.md +7 -1
- package/extensions/vscode-ur-inline-diffs/out/extension.js +131 -31
- package/extensions/vscode-ur-inline-diffs/package.json +19 -1
- package/package.json +14 -2
package/docs/IDE.md
CHANGED
|
@@ -86,9 +86,14 @@ Install it with `ur ide install` (offers the bundled VSIX) or from the
|
|
|
86
86
|
packaged `.vsix`. The extension is bundled inside this repository and
|
|
87
87
|
packaged as a local VSIX when installed from UR-AGENT; the public install
|
|
88
88
|
path does not depend on an unpublished marketplace extension ID. Every
|
|
89
|
-
feature below
|
|
90
|
-
|
|
91
|
-
|
|
89
|
+
feature below runs UR as a local subprocess and never talks to a model
|
|
90
|
+
provider or network service directly.
|
|
91
|
+
|
|
92
|
+
When the workspace itself is a UR checkout, the extension prefers the
|
|
93
|
+
workspace-local runtime (`bun dist/cli.js`, then `node bin/ur.js`) before
|
|
94
|
+
falling back to `ur` from `PATH`. Set `ur.executablePath` in VS Code settings
|
|
95
|
+
to force a specific binary; `ur.executableArgs` can provide fixed wrapper
|
|
96
|
+
arguments before normal UR command arguments.
|
|
92
97
|
|
|
93
98
|
### Chat panel
|
|
94
99
|
|
package/docs/providers.md
CHANGED
|
@@ -420,3 +420,32 @@ Local/server providers use their normal endpoints:
|
|
|
420
420
|
- LM Studio: `http://localhost:1234/v1`
|
|
421
421
|
- llama.cpp server mode: `http://localhost:8080/v1`
|
|
422
422
|
- vLLM server mode: `http://localhost:8000/v1`
|
|
423
|
+
|
|
424
|
+
## Optional Live Provider Smoke
|
|
425
|
+
|
|
426
|
+
`bun run provider:smoke` runs optional live checks only for providers with the
|
|
427
|
+
required environment variables present. With no variables set it exits
|
|
428
|
+
successfully and reports every provider as skipped, so CI does not need secrets.
|
|
429
|
+
|
|
430
|
+
Configured providers run one short text request, a finite-timeout streaming
|
|
431
|
+
request, and, when `PROVIDER_SMOKE_TOOL_CALLS=1`, a forced tool-call request.
|
|
432
|
+
|
|
433
|
+
Required variables:
|
|
434
|
+
|
|
435
|
+
| Provider | Required env vars | Optional env vars |
|
|
436
|
+
| --- | --- | --- |
|
|
437
|
+
| OpenAI-compatible | `OPENAI_COMPATIBLE_BASE_URL`, `OPENAI_COMPATIBLE_MODEL` | `OPENAI_COMPATIBLE_API_KEY` |
|
|
438
|
+
| OpenRouter | `OPENROUTER_API_KEY`, `OPENROUTER_MODEL` | |
|
|
439
|
+
| Anthropic | `ANTHROPIC_API_KEY`, `ANTHROPIC_MODEL` | `ANTHROPIC_BASE_URL` |
|
|
440
|
+
| Gemini | `GEMINI_API_KEY`, `GEMINI_MODEL` | `GEMINI_BASE_URL` |
|
|
441
|
+
| Ollama | `OLLAMA_MODEL` | `OLLAMA_BASE_URL` or `OLLAMA_HOST` |
|
|
442
|
+
| LM Studio | `LMSTUDIO_BASE_URL`, `LMSTUDIO_MODEL` | `LMSTUDIO_API_KEY` |
|
|
443
|
+
| vLLM | `VLLM_BASE_URL`, `VLLM_MODEL` | `VLLM_API_KEY` |
|
|
444
|
+
|
|
445
|
+
Common knobs:
|
|
446
|
+
|
|
447
|
+
```sh
|
|
448
|
+
PROVIDER_SMOKE_TIMEOUT_MS=30000
|
|
449
|
+
PROVIDER_SMOKE_MAX_RETRIES=0
|
|
450
|
+
PROVIDER_SMOKE_TOOL_CALLS=1
|
|
451
|
+
```
|
package/documentation/index.html
CHANGED
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
<main id="content" class="content">
|
|
45
45
|
<header class="topbar">
|
|
46
46
|
<div>
|
|
47
|
-
<p class="eyebrow">Version 1.37.
|
|
47
|
+
<p class="eyebrow">Version 1.37.3</p>
|
|
48
48
|
<h1>UR-AGENT Documentation</h1>
|
|
49
49
|
<p class="lead">A practical, tutorial-style reference for installing, configuring, automating, extending, and operating UR-AGENT.</p>
|
|
50
50
|
</div>
|
|
@@ -58,12 +58,12 @@
|
|
|
58
58
|
<div class="section-heading">
|
|
59
59
|
<p class="eyebrow">What UR Is</p>
|
|
60
60
|
<h2>Autonomous engineering workflow engine</h2>
|
|
61
|
-
<p>UR is not only chat, autocomplete, or code edits. It turns work into a plan, executes patches, tests and verifies them, documents the result, benchmarks behavior, and keeps the run reproducible
|
|
61
|
+
<p>UR is not only chat, autocomplete, or code edits. It turns work into a plan, executes patches, tests and verifies them, documents the result, benchmarks behavior, and keeps the run reproducible.</p>
|
|
62
62
|
</div>
|
|
63
63
|
<div class="stat-grid">
|
|
64
64
|
<article>
|
|
65
65
|
<strong>Local-first runtime</strong>
|
|
66
|
-
<span>Use local Ollama/OpenAI-compatible runtimes for private and offline work, or explicitly select configured API provider paths. Subscription access stays visible but unavailable when
|
|
66
|
+
<span>Use local Ollama/OpenAI-compatible runtimes for private and offline work, or explicitly select configured API provider paths. Subscription access stays visible but unavailable when not authenticated.</span>
|
|
67
67
|
</article>
|
|
68
68
|
<article>
|
|
69
69
|
<strong>Interactive and headless</strong>
|
|
@@ -128,7 +128,7 @@ ur -p --output-format json "Review the current diff"</code></pre>
|
|
|
128
128
|
</div>
|
|
129
129
|
<div class="callout">
|
|
130
130
|
<strong>Runtime requirement</strong>
|
|
131
|
-
<p>UR expects Bun. For local-first work, run a local Ollama app/server at <code>http://localhost:11434/api</code>. Set <code>OLLAMA_MODEL</code> or <code>UR_MODEL</code> to force a model
|
|
131
|
+
<p>UR expects Bun. For local-first work, run a local Ollama app/server at <code>http://localhost:11434/api</code>. Set <code>OLLAMA_MODEL</code> or <code>UR_MODEL</code> to force a model route.</p>
|
|
132
132
|
</div>
|
|
133
133
|
</section>
|
|
134
134
|
|
|
@@ -136,7 +136,7 @@ ur -p --output-format json "Review the current diff"</code></pre>
|
|
|
136
136
|
<div class="section-heading">
|
|
137
137
|
<p class="eyebrow">Legal Access Paths</p>
|
|
138
138
|
<h2>Providers and authentication</h2>
|
|
139
|
-
<p>UR-AGENT integrates official access paths only. It never scrapes browser sessions, extracts OAuth tokens, reads hidden provider auth files, bypasses provider restrictions, or proxies
|
|
139
|
+
<p>UR-AGENT integrates official access paths only. It never scrapes browser sessions, extracts OAuth tokens, reads hidden provider auth files, bypasses provider restrictions, or proxies credentials.</p>
|
|
140
140
|
</div>
|
|
141
141
|
<div class="reference-grid">
|
|
142
142
|
<article>
|
|
@@ -146,7 +146,7 @@ ur auth claude
|
|
|
146
146
|
ur auth gemini
|
|
147
147
|
ur auth antigravity
|
|
148
148
|
ur provider doctor agy</code></pre>
|
|
149
|
-
<p>Codex CLI, Claude Code, Gemini CLI, and Antigravity are first-class providers that dispatch each turn through the vendor's official CLI using your subscription login. They are optional
|
|
149
|
+
<p>Codex CLI, Claude Code, Gemini CLI, and Antigravity are first-class providers that dispatch each turn through the vendor's official CLI using your subscription login. They are optional and can be disabled.</p>
|
|
150
150
|
</article>
|
|
151
151
|
<article>
|
|
152
152
|
<h3>API and local providers</h3>
|
|
@@ -155,12 +155,12 @@ ur config set provider openai-api
|
|
|
155
155
|
ur config set base_url http://localhost:11434/v1
|
|
156
156
|
ur config set model qwen3-coder:480b-cloud
|
|
157
157
|
ur config set provider.fallback ollama</code></pre>
|
|
158
|
-
<p>API providers require explicit selection and read keys from a key stored via <code>ur connect</code> (OS keychain) or from environment variables. Local providers include Ollama, LM Studio, llama.cpp
|
|
158
|
+
<p>API providers require explicit selection and read keys from a key stored via <code>ur connect</code> (OS keychain) or from environment variables. Local providers include Ollama, LM Studio, llama.cpp, and vLLM.</p>
|
|
159
159
|
</article>
|
|
160
160
|
<article>
|
|
161
161
|
<h3>Status bar and updates</h3>
|
|
162
|
-
<pre><code>Ollama | llama3 | ask | main | update 1.37.
|
|
163
|
-
<p>The interactive status bar shows only important runtime state: provider, model, mode, branch, active tasks, checks status when known, and update availability. It is hidden in CI, dumb terminals, and
|
|
162
|
+
<pre><code>Ollama | llama3 | ask | main | update 1.37.3 available</code></pre>
|
|
163
|
+
<p>The interactive status bar shows only important runtime state: provider, model, mode, branch, active tasks, checks status when known, and update availability. It is hidden in CI, dumb terminals, and print mode.</p>
|
|
164
164
|
</article>
|
|
165
165
|
</div>
|
|
166
166
|
</section>
|
|
@@ -169,7 +169,7 @@ ur config set provider.fallback ollama</code></pre>
|
|
|
169
169
|
<div class="section-heading">
|
|
170
170
|
<p class="eyebrow">Runtime</p>
|
|
171
171
|
<h2>Architecture</h2>
|
|
172
|
-
<p>The CLI is the control plane. Project context and <code>.ur</code> assets feed agent orchestration, which uses approved provider adapters, local-first model runtimes, and approved tools to produce
|
|
172
|
+
<p>The CLI is the control plane. Project context and <code>.ur</code> assets feed agent orchestration, which uses approved provider adapters, local-first model runtimes, and approved tools to produce auditable results.</p>
|
|
173
173
|
</div>
|
|
174
174
|
<figure class="diagram">
|
|
175
175
|
<img src="assets/ur-architecture.svg" alt="UR-AGENT runtime architecture diagram">
|
|
@@ -11,7 +11,13 @@ marketplace extension ID.
|
|
|
11
11
|
|
|
12
12
|
The extension never talks to a model provider or network service directly —
|
|
13
13
|
every AI request goes through your local `ur` CLI, the same way `ur` behaves
|
|
14
|
-
in a terminal.
|
|
14
|
+
in a terminal.
|
|
15
|
+
|
|
16
|
+
When the opened workspace is a UR checkout, the extension prefers the
|
|
17
|
+
workspace-local runtime (`bun dist/cli.js`, then `node bin/ur.js`) before
|
|
18
|
+
falling back to `ur` on `PATH`. To force a specific binary, set
|
|
19
|
+
`ur.executablePath` in VS Code settings. Use `ur.executableArgs` only for
|
|
20
|
+
custom wrappers that need fixed arguments before normal UR arguments.
|
|
15
21
|
|
|
16
22
|
## Chat
|
|
17
23
|
|
|
@@ -221,23 +221,66 @@ var DiffTreeProvider = class {
|
|
|
221
221
|
};
|
|
222
222
|
|
|
223
223
|
// src/bridge/urCli.ts
|
|
224
|
-
var
|
|
224
|
+
var import_node_child_process2 = require("node:child_process");
|
|
225
225
|
var import_node_util = require("node:util");
|
|
226
|
-
|
|
226
|
+
|
|
227
|
+
// src/bridge/urCommand.ts
|
|
228
|
+
var import_node_child_process = require("node:child_process");
|
|
229
|
+
var import_node_fs = require("node:fs");
|
|
230
|
+
var import_node_path = require("node:path");
|
|
231
|
+
function resolveUrCommand(options) {
|
|
232
|
+
const config = options.config ?? {};
|
|
233
|
+
const configuredPath = config.executablePath?.trim();
|
|
234
|
+
const configuredArgs = normalizeExecutableArgs(config.executableArgs);
|
|
235
|
+
if (configuredPath) {
|
|
236
|
+
return command(configuredPath, configuredArgs, "configured");
|
|
237
|
+
}
|
|
238
|
+
const pathExists = options.pathExists ?? import_node_fs.existsSync;
|
|
239
|
+
const bunCommand = options.bunCommand ?? "bun";
|
|
240
|
+
const nodeCommand = options.nodeCommand ?? "node";
|
|
241
|
+
const distEntrypoint = (0, import_node_path.join)(options.cwd, "dist", "cli.js");
|
|
242
|
+
if (pathExists(distEntrypoint) && (options.bunAvailable ?? isBunAvailable)(bunCommand)) {
|
|
243
|
+
return command(bunCommand, [distEntrypoint], "workspace-dist");
|
|
244
|
+
}
|
|
245
|
+
const launcherEntrypoint = (0, import_node_path.join)(options.cwd, "bin", "ur.js");
|
|
246
|
+
if (pathExists(launcherEntrypoint)) {
|
|
247
|
+
return command(nodeCommand, [launcherEntrypoint], "workspace-launcher");
|
|
248
|
+
}
|
|
249
|
+
return command("ur", [], "path");
|
|
250
|
+
}
|
|
251
|
+
function formatResolvedUrCommand(resolved) {
|
|
252
|
+
return [resolved.command, ...resolved.args].join(" ");
|
|
253
|
+
}
|
|
254
|
+
function command(commandName, args, source) {
|
|
255
|
+
const resolved = { command: commandName, args, source, display: "" };
|
|
256
|
+
return { ...resolved, display: formatResolvedUrCommand(resolved) };
|
|
257
|
+
}
|
|
258
|
+
function normalizeExecutableArgs(args) {
|
|
259
|
+
return Array.isArray(args) ? args.filter((arg) => typeof arg === "string" && arg.length > 0) : [];
|
|
260
|
+
}
|
|
261
|
+
function isBunAvailable(commandName) {
|
|
262
|
+
const result = (0, import_node_child_process.spawnSync)(commandName, ["--version"], { stdio: "ignore" });
|
|
263
|
+
return !result.error && result.status === 0;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// src/bridge/urCli.ts
|
|
267
|
+
var execFileAsync = (0, import_node_util.promisify)(import_node_child_process2.execFile);
|
|
227
268
|
async function runUrCli(args, options) {
|
|
269
|
+
const executable = resolveUrCommand({ cwd: options.cwd, config: readUrCommandConfig() });
|
|
228
270
|
try {
|
|
229
|
-
const { stdout, stderr } = await execFileAsync(
|
|
271
|
+
const { stdout, stderr } = await execFileAsync(executable.command, [...executable.args, ...args], {
|
|
230
272
|
cwd: options.cwd,
|
|
231
273
|
shell: false
|
|
232
274
|
});
|
|
233
275
|
return { stdout, stderr };
|
|
234
276
|
} catch (error) {
|
|
235
|
-
throw new Error(formatUrCliError(args, error));
|
|
277
|
+
throw new Error(formatUrCliError(args, error, executable, options.cwd));
|
|
236
278
|
}
|
|
237
279
|
}
|
|
238
280
|
async function runUrCliCapture(args, options) {
|
|
281
|
+
const executable = resolveUrCommand({ cwd: options.cwd, config: readUrCommandConfig() });
|
|
239
282
|
try {
|
|
240
|
-
const { stdout, stderr } = await execFileAsync(
|
|
283
|
+
const { stdout, stderr } = await execFileAsync(executable.command, [...executable.args, ...args], {
|
|
241
284
|
cwd: options.cwd,
|
|
242
285
|
shell: false
|
|
243
286
|
});
|
|
@@ -246,13 +289,34 @@ async function runUrCliCapture(args, options) {
|
|
|
246
289
|
if (isCapturedNonZeroExit(error)) {
|
|
247
290
|
return { stdout: error.stdout, stderr: error.stderr, exitCode: error.code };
|
|
248
291
|
}
|
|
249
|
-
throw new Error(formatUrCliError(args, error));
|
|
292
|
+
throw new Error(formatUrCliError(args, error, executable, options.cwd));
|
|
250
293
|
}
|
|
251
294
|
}
|
|
252
|
-
function
|
|
295
|
+
function readUrCommandConfig() {
|
|
296
|
+
try {
|
|
297
|
+
const vscode18 = require("vscode");
|
|
298
|
+
const config = vscode18.workspace.getConfiguration("ur");
|
|
299
|
+
const executablePath = config.get("executablePath")?.trim();
|
|
300
|
+
const executableArgs = config.get("executableArgs") ?? [];
|
|
301
|
+
return {
|
|
302
|
+
executablePath: executablePath || void 0,
|
|
303
|
+
executableArgs: executableArgs.filter((arg) => typeof arg === "string" && arg.length > 0)
|
|
304
|
+
};
|
|
305
|
+
} catch {
|
|
306
|
+
return {};
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
function formatUrCliError(args, error, executable, cwd) {
|
|
253
310
|
const stderr = hasStderr(error) ? error.stderr.trim() : "";
|
|
254
311
|
const detail = stderr || (error instanceof Error ? error.message : String(error));
|
|
255
|
-
return
|
|
312
|
+
return [
|
|
313
|
+
`Failed to run UR command.`,
|
|
314
|
+
`Executable: ${executable.display}`,
|
|
315
|
+
`cwd: ${cwd}`,
|
|
316
|
+
`Args: ${args.join(" ")}`,
|
|
317
|
+
`Error: ${detail}`,
|
|
318
|
+
`Hint: Set ur.executablePath in VS Code settings if the extension is using the wrong UR binary.`
|
|
319
|
+
].join("\n");
|
|
256
320
|
}
|
|
257
321
|
function hasStderr(error) {
|
|
258
322
|
return typeof error === "object" && error !== null && "stderr" in error && typeof error.stderr === "string";
|
|
@@ -409,7 +473,7 @@ function isCanUseToolRequest(message) {
|
|
|
409
473
|
}
|
|
410
474
|
|
|
411
475
|
// src/bridge/urProcess.ts
|
|
412
|
-
var
|
|
476
|
+
var import_node_child_process3 = require("node:child_process");
|
|
413
477
|
var NdjsonBuffer = class {
|
|
414
478
|
buffer = "";
|
|
415
479
|
/** Feed a raw chunk (may contain zero, one, or many complete lines, and may
|
|
@@ -477,14 +541,14 @@ function buildControlResponse(requestId, decision) {
|
|
|
477
541
|
}
|
|
478
542
|
};
|
|
479
543
|
}
|
|
480
|
-
var defaultSpawn = (
|
|
544
|
+
var defaultSpawn = (command2, args, options) => (0, import_node_child_process3.spawn)(command2, args, options);
|
|
481
545
|
function runUrTurn(request, handlers, deps = {}) {
|
|
482
546
|
const spawnFn = deps.spawn ?? defaultSpawn;
|
|
483
|
-
const
|
|
484
|
-
const args = buildUrArgs(request);
|
|
547
|
+
const executable = deps.executable ?? (deps.command ? { command: deps.command, args: [], source: "configured", display: deps.command } : resolveUrCommand({ cwd: request.cwd }));
|
|
548
|
+
const args = [...executable.args, ...buildUrArgs(request)];
|
|
485
549
|
let child;
|
|
486
550
|
try {
|
|
487
|
-
child = spawnFn(command, args, {
|
|
551
|
+
child = spawnFn(executable.command, args, {
|
|
488
552
|
cwd: request.cwd,
|
|
489
553
|
shell: false,
|
|
490
554
|
stdio: ["pipe", "pipe", "pipe"]
|
|
@@ -493,10 +557,18 @@ function runUrTurn(request, handlers, deps = {}) {
|
|
|
493
557
|
handlers.onExit({
|
|
494
558
|
ok: false,
|
|
495
559
|
exitCode: null,
|
|
560
|
+
signal: null,
|
|
496
561
|
canceled: false,
|
|
497
562
|
sawResult: false,
|
|
498
563
|
stderr: "",
|
|
499
|
-
error:
|
|
564
|
+
error: formatTurnFailure({
|
|
565
|
+
executable,
|
|
566
|
+
cwd: request.cwd,
|
|
567
|
+
exitCode: null,
|
|
568
|
+
signal: null,
|
|
569
|
+
stderr: "",
|
|
570
|
+
reason: `Failed to start: ${errorMessage2(error)}`
|
|
571
|
+
})
|
|
500
572
|
});
|
|
501
573
|
return { cancel: () => {
|
|
502
574
|
} };
|
|
@@ -507,7 +579,7 @@ function runUrTurn(request, handlers, deps = {}) {
|
|
|
507
579
|
let resultIsError = false;
|
|
508
580
|
let canceled = false;
|
|
509
581
|
let settled = false;
|
|
510
|
-
const finish = (exitCode, spawnError) => {
|
|
582
|
+
const finish = (exitCode, signal, spawnError) => {
|
|
511
583
|
if (settled) return;
|
|
512
584
|
settled = true;
|
|
513
585
|
const stderr = stderrChunks.join("");
|
|
@@ -515,10 +587,11 @@ function runUrTurn(request, handlers, deps = {}) {
|
|
|
515
587
|
handlers.onExit({
|
|
516
588
|
ok,
|
|
517
589
|
exitCode,
|
|
590
|
+
signal,
|
|
518
591
|
canceled,
|
|
519
592
|
sawResult,
|
|
520
593
|
stderr,
|
|
521
|
-
error: spawnError ?? (!ok && !canceled ? deriveErrorMessage(sawResult, resultIsError, exitCode, stderr) : void 0)
|
|
594
|
+
error: spawnError ?? (!ok && !canceled ? deriveErrorMessage(executable, request.cwd, sawResult, resultIsError, exitCode, signal, stderr) : void 0)
|
|
522
595
|
});
|
|
523
596
|
};
|
|
524
597
|
const handleMessage = (message) => {
|
|
@@ -547,13 +620,24 @@ function runUrTurn(request, handlers, deps = {}) {
|
|
|
547
620
|
stderrChunks.push(chunk.toString("utf8"));
|
|
548
621
|
});
|
|
549
622
|
child.on("error", (error) => {
|
|
550
|
-
finish(
|
|
623
|
+
finish(
|
|
624
|
+
null,
|
|
625
|
+
null,
|
|
626
|
+
formatTurnFailure({
|
|
627
|
+
executable,
|
|
628
|
+
cwd: request.cwd,
|
|
629
|
+
exitCode: null,
|
|
630
|
+
signal: null,
|
|
631
|
+
stderr: stderrChunks.join(""),
|
|
632
|
+
reason: `Failed to run: ${errorMessage2(error)}`
|
|
633
|
+
})
|
|
634
|
+
);
|
|
551
635
|
});
|
|
552
|
-
child.on("exit", (code) => {
|
|
636
|
+
child.on("exit", (code, signal) => {
|
|
553
637
|
for (const message of stdoutBuffer.flush()) {
|
|
554
638
|
handleMessage(message);
|
|
555
639
|
}
|
|
556
|
-
finish(code);
|
|
640
|
+
finish(code, signal);
|
|
557
641
|
});
|
|
558
642
|
return {
|
|
559
643
|
cancel: () => {
|
|
@@ -570,11 +654,26 @@ function writeControlResponse(child, requestId, decision) {
|
|
|
570
654
|
} catch {
|
|
571
655
|
}
|
|
572
656
|
}
|
|
573
|
-
function deriveErrorMessage(sawResult, resultIsError, exitCode, stderr) {
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
657
|
+
function deriveErrorMessage(executable, cwd, sawResult, resultIsError, exitCode, signal, stderr) {
|
|
658
|
+
const reason = sawResult && resultIsError ? "UR reported an error completing this turn." : "UR exited without producing a successful result.";
|
|
659
|
+
return formatTurnFailure({ executable, cwd, exitCode, signal, stderr, reason });
|
|
660
|
+
}
|
|
661
|
+
function formatTurnFailure(options) {
|
|
662
|
+
const stderr = summarizeStderr(options.stderr);
|
|
663
|
+
return [
|
|
664
|
+
`UR chat backend failed.`,
|
|
665
|
+
`Executable: ${options.executable.display}`,
|
|
666
|
+
`cwd: ${options.cwd}`,
|
|
667
|
+
`Exit: code ${options.exitCode ?? "unknown"}, signal ${options.signal ?? "none"}`,
|
|
668
|
+
`stderr: ${stderr || "<empty>"}`,
|
|
669
|
+
options.reason,
|
|
670
|
+
`Hint: Set ur.executablePath in VS Code settings if the extension is using the wrong UR binary.`
|
|
671
|
+
].join("\n");
|
|
672
|
+
}
|
|
673
|
+
function summarizeStderr(stderr) {
|
|
674
|
+
const trimmed = stderr.trim();
|
|
675
|
+
if (trimmed.length <= 2e3) return trimmed;
|
|
676
|
+
return `${trimmed.slice(0, 2e3)}\u2026`;
|
|
578
677
|
}
|
|
579
678
|
function errorMessage2(error) {
|
|
580
679
|
return error instanceof Error ? error.message : String(error);
|
|
@@ -1367,7 +1466,8 @@ var ChatController = class {
|
|
|
1367
1466
|
onMessage: (message) => this.handleStreamMessage(root, sessionId, message),
|
|
1368
1467
|
onControlRequest: (request) => this.handlePermissionRequest(request),
|
|
1369
1468
|
onExit: (result) => this.handleTurnExit(root, result)
|
|
1370
|
-
}
|
|
1469
|
+
},
|
|
1470
|
+
{ executable: resolveUrCommand({ cwd: root, config: readUrCommandConfig() }) }
|
|
1371
1471
|
);
|
|
1372
1472
|
}
|
|
1373
1473
|
handleStreamMessage(root, sessionId, message) {
|
|
@@ -1489,13 +1589,13 @@ var ChatController = class {
|
|
|
1489
1589
|
// src/chat/chatTreeProvider.ts
|
|
1490
1590
|
var vscode7 = __toESM(require("vscode"));
|
|
1491
1591
|
var ActionItem = class extends vscode7.TreeItem {
|
|
1492
|
-
constructor(label, description, icon,
|
|
1592
|
+
constructor(label, description, icon, command2, tooltip) {
|
|
1493
1593
|
super(label, vscode7.TreeItemCollapsibleState.None);
|
|
1494
1594
|
this.contextValue = "urChatAction";
|
|
1495
1595
|
this.description = description;
|
|
1496
1596
|
this.iconPath = new vscode7.ThemeIcon(icon);
|
|
1497
1597
|
this.tooltip = tooltip ?? `${label}${description ? ` - ${description}` : ""}`;
|
|
1498
|
-
this.command =
|
|
1598
|
+
this.command = command2;
|
|
1499
1599
|
}
|
|
1500
1600
|
};
|
|
1501
1601
|
var InfoItem3 = class extends vscode7.TreeItem {
|
|
@@ -1567,11 +1667,11 @@ var ChatTreeProvider = class {
|
|
|
1567
1667
|
};
|
|
1568
1668
|
|
|
1569
1669
|
// src/diffs/actions.ts
|
|
1570
|
-
var
|
|
1670
|
+
var import_node_child_process4 = require("node:child_process");
|
|
1571
1671
|
var fs3 = __toESM(require("node:fs"));
|
|
1572
1672
|
var import_node_util2 = require("node:util");
|
|
1573
1673
|
var vscode8 = __toESM(require("vscode"));
|
|
1574
|
-
var execFileAsync2 = (0, import_node_util2.promisify)(
|
|
1674
|
+
var execFileAsync2 = (0, import_node_util2.promisify)(import_node_child_process4.execFile);
|
|
1575
1675
|
async function commentDiff(item, provider) {
|
|
1576
1676
|
const root = workspaceRoot();
|
|
1577
1677
|
const bundle = item?.bundle;
|
|
@@ -2181,7 +2281,7 @@ async function showAgentOptions(cwd) {
|
|
|
2181
2281
|
}
|
|
2182
2282
|
|
|
2183
2283
|
// src/review/reviewDiff.ts
|
|
2184
|
-
var
|
|
2284
|
+
var import_node_child_process5 = require("node:child_process");
|
|
2185
2285
|
var import_node_util3 = require("node:util");
|
|
2186
2286
|
var vscode13 = __toESM(require("vscode"));
|
|
2187
2287
|
|
|
@@ -2199,7 +2299,7 @@ function buildReviewPrompt(diff) {
|
|
|
2199
2299
|
}
|
|
2200
2300
|
|
|
2201
2301
|
// src/review/reviewDiff.ts
|
|
2202
|
-
var execFileAsync3 = (0, import_node_util3.promisify)(
|
|
2302
|
+
var execFileAsync3 = (0, import_node_util3.promisify)(import_node_child_process5.execFile);
|
|
2203
2303
|
async function captureGitDiff(cwd) {
|
|
2204
2304
|
const { stdout } = await execFileAsync3("git", ["diff", "HEAD"], { cwd, shell: false });
|
|
2205
2305
|
return stdout;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "ur-inline-diffs",
|
|
3
3
|
"displayName": "UR Inline Diffs",
|
|
4
4
|
"description": "Review, apply, and reject UR inline diff bundles from .ur/ide/diffs inside VS Code.",
|
|
5
|
-
"version": "1.37.
|
|
5
|
+
"version": "1.37.3",
|
|
6
6
|
"publisher": "ur-agent",
|
|
7
7
|
"engines": {
|
|
8
8
|
"vscode": "^1.92.0"
|
|
@@ -55,6 +55,24 @@
|
|
|
55
55
|
"typescript": "^5.7.0"
|
|
56
56
|
},
|
|
57
57
|
"contributes": {
|
|
58
|
+
"configuration": {
|
|
59
|
+
"title": "UR",
|
|
60
|
+
"properties": {
|
|
61
|
+
"ur.executablePath": {
|
|
62
|
+
"type": "string",
|
|
63
|
+
"default": "",
|
|
64
|
+
"description": "Absolute path or command name for the UR executable the extension should run. Leave empty to prefer a repo-local UR checkout in the workspace, then fall back to ur on PATH."
|
|
65
|
+
},
|
|
66
|
+
"ur.executableArgs": {
|
|
67
|
+
"type": "array",
|
|
68
|
+
"default": [],
|
|
69
|
+
"items": {
|
|
70
|
+
"type": "string"
|
|
71
|
+
},
|
|
72
|
+
"description": "Optional arguments inserted after ur.executablePath and before UR command arguments. Use this only for custom wrappers, for example when ur.executablePath points to bun and the first arg is a dist/cli.js path."
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
},
|
|
58
76
|
"viewsContainers": {
|
|
59
77
|
"activitybar": [
|
|
60
78
|
{
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ur-agent",
|
|
3
|
-
"version": "1.37.
|
|
3
|
+
"version": "1.37.3",
|
|
4
4
|
"description": "UR-AGENT \u2014 autonomous engineering workflow engine (plan, execute, test, verify, document, benchmark, reproduce)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"packageManager": "bun@1.3.14",
|
|
@@ -49,11 +49,23 @@
|
|
|
49
49
|
"bundle": "node scripts/bundle.mjs",
|
|
50
50
|
"build": "node scripts/bundle.mjs",
|
|
51
51
|
"release:check": "node scripts/release-check.mjs",
|
|
52
|
-
"
|
|
52
|
+
"release:create-source-zip": "bun scripts/source-zip-create.mjs",
|
|
53
|
+
"release:check-source-zip": "node scripts/source-zip-check.mjs",
|
|
54
|
+
"typecheck": "bun run tsc --noEmit && bun run typecheck:strict-core",
|
|
55
|
+
"typecheck:strict-core": "node scripts/strict-core-check.mjs",
|
|
53
56
|
"lint": "node scripts/lint.mjs",
|
|
54
57
|
"test": "bun test",
|
|
55
58
|
"smoke": "node ./bin/ur.js --version",
|
|
56
59
|
"secrets:scan": "bash scripts/secret-scan.sh",
|
|
60
|
+
"benchmark:report": "node scripts/benchmark-report.mjs",
|
|
61
|
+
"benchmark:smoke": "node scripts/benchmark-smoke.mjs",
|
|
62
|
+
"benchmark:local": "node scripts/benchmark-local.mjs",
|
|
63
|
+
"benchmark:compare": "node scripts/benchmark-compare.mjs",
|
|
64
|
+
"benchmark:swe-bench-lite": "node scripts/benchmark-external.mjs swe-bench-lite",
|
|
65
|
+
"benchmark:terminal-bench": "node scripts/benchmark-external.mjs terminal-bench",
|
|
66
|
+
"benchmark:aider-polyglot": "node scripts/benchmark-external.mjs aider-polyglot",
|
|
67
|
+
"safety:matrix": "bun scripts/generate-safety-matrix.mjs",
|
|
68
|
+
"provider:smoke": "bun scripts/provider-smoke.mjs",
|
|
57
69
|
"package:check": "node scripts/package-check.mjs",
|
|
58
70
|
"prepack": "bun run release:check"
|
|
59
71
|
},
|