ur-agent 1.65.0 → 1.65.2
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
CHANGED
|
@@ -1,5 +1,56 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.65.2
|
|
4
|
+
|
|
5
|
+
- Fixed `--discover-ollama` having no effect on model discovery or requests.
|
|
6
|
+
`getOllamaBaseUrl` resolves the session host correctly, but three callers
|
|
7
|
+
read a persisted `provider.baseUrl` *before* consulting it, so a value
|
|
8
|
+
written by `ur config set base_url` silently outranked a host chosen
|
|
9
|
+
interactively seconds earlier. `/model-doctor` calls `getOllamaBaseUrl()`
|
|
10
|
+
directly and was right, which is how the split surfaced: the doctor reported
|
|
11
|
+
`http://172.20.10.5:11434` and its six models while `/model` listed the local
|
|
12
|
+
daemon's, in the same session.
|
|
13
|
+
- This was not cosmetic. The request client had the same inversion
|
|
14
|
+
(`configured.baseUrl ?? getOllamaBaseUrl(...)` short-circuits), so calls went
|
|
15
|
+
to the local daemon while the doctor said otherwise — a different model than
|
|
16
|
+
the user believed, with no visible signal. The provider doctor had it too, so
|
|
17
|
+
it probed a host that was not in use.
|
|
18
|
+
- A model that does not advertise the `tools` capability now says so in the
|
|
19
|
+
transcript. UR already detected it and wrote the warning to the debug log,
|
|
20
|
+
which is invisible in a normal session: tool definitions were stripped, and
|
|
21
|
+
the model — having no way to act — described work it had not performed and
|
|
22
|
+
reported files it had not created. The warning appears once per model and
|
|
23
|
+
names the fix.
|
|
24
|
+
- `AskUserQuestion` states that `options` is required and that a question with
|
|
25
|
+
no discrete choices should be asked in plain text rather than by calling the
|
|
26
|
+
tool with a prose question and no options.
|
|
27
|
+
- Fixed the task list displaying out of order. `listTasks` returned `readdir`
|
|
28
|
+
order, which is lexicographic in practice, so past nine tasks it read
|
|
29
|
+
1, 10, 11, 12, ... 2, 20, 3. Under ten tasks the two orders are identical,
|
|
30
|
+
which is why it went unnoticed and why a test written against a short
|
|
31
|
+
fixture would have passed against the broken code.
|
|
32
|
+
- A task list is now required before any tool that changes the workspace
|
|
33
|
+
(`Edit`, `Write`, `Bash`, ...). The system prompt already asked for one on
|
|
34
|
+
multi-step work and the agent still edited files and reported completion with
|
|
35
|
+
no plan on record. Reads are never blocked, so it can investigate before
|
|
36
|
+
planning; the first three tool calls are free so a one-line fix needs no
|
|
37
|
+
ceremony; task tools are exempt so the gate cannot block its own remedy; and
|
|
38
|
+
subagents are exempt since they execute a step rather than own the plan.
|
|
39
|
+
Configure with `tasks.requireBeforeChanges`.
|
|
40
|
+
|
|
41
|
+
## 1.65.1
|
|
42
|
+
|
|
43
|
+
- Fixed `ur selftest run` reporting 0/5 anywhere but the UR repo. The drill
|
|
44
|
+
runner spawned `./bin/ur.js`, a path relative to the current directory, so
|
|
45
|
+
every drill failed instantly with an empty detail — which reads as five
|
|
46
|
+
broken features rather than one broken path. It now re-spawns
|
|
47
|
+
`process.execPath` with `process.argv[1]`, the exact pair this process was
|
|
48
|
+
launched with, so it works from any directory and for a global install.
|
|
49
|
+
- Every existing test ran `bun test` from the repo root, where the relative
|
|
50
|
+
path happens to exist, so all of them stayed green while the command was
|
|
51
|
+
unusable in practice. Added a test that runs the drills from a temp
|
|
52
|
+
directory; verified it fails against the old code and passes against the fix.
|
|
53
|
+
|
|
3
54
|
## 1.65.0
|
|
4
55
|
|
|
5
56
|
- The release gate now asks the registry whether the packed dependency ranges
|
package/dist/cli.js
CHANGED
|
@@ -53915,7 +53915,7 @@ function isLocalBaseUrl(value) {
|
|
|
53915
53915
|
async function checkEndpoint(definition, settings, adapters, result) {
|
|
53916
53916
|
if (!definition.endpointKind)
|
|
53917
53917
|
return;
|
|
53918
|
-
const baseUrl = settings.baseUrl ?? (definition.id === "ollama" ? getOllamaBaseUrl() : definition.defaultBaseUrl);
|
|
53918
|
+
const baseUrl = (definition.id === "ollama" ? getOllamaSessionOverride() : undefined) ?? settings.baseUrl ?? (definition.id === "ollama" ? getOllamaBaseUrl() : definition.defaultBaseUrl);
|
|
53919
53919
|
if (!baseUrl) {
|
|
53920
53920
|
result.checks.push({
|
|
53921
53921
|
name: "base_url",
|
|
@@ -54482,6 +54482,12 @@ function clearProviderModelCacheForTests() {
|
|
|
54482
54482
|
cachedModelsByProvider.clear();
|
|
54483
54483
|
}
|
|
54484
54484
|
function providerBaseUrl(provider, definition, settings) {
|
|
54485
|
+
if (provider === "ollama") {
|
|
54486
|
+
const sessionHost = getOllamaSessionOverride();
|
|
54487
|
+
if (sessionHost) {
|
|
54488
|
+
return sessionHost;
|
|
54489
|
+
}
|
|
54490
|
+
}
|
|
54485
54491
|
const providerSettings = getActiveProviderSettings(settings);
|
|
54486
54492
|
if (providerSettings.baseUrl) {
|
|
54487
54493
|
return providerSettings.baseUrl;
|
|
@@ -57388,6 +57394,7 @@ __export(exports_ollama, {
|
|
|
57388
57394
|
getOllamaRequestTimeoutMs: () => getOllamaRequestTimeoutMs,
|
|
57389
57395
|
getEffectiveOllamaBaseUrl: () => getEffectiveOllamaBaseUrl,
|
|
57390
57396
|
createOllamaURHQClient: () => createOllamaURHQClient,
|
|
57397
|
+
consumePendingProviderNotice: () => consumePendingProviderNotice,
|
|
57391
57398
|
buildOllamaHeaders: () => buildOllamaHeaders
|
|
57392
57399
|
});
|
|
57393
57400
|
import { randomUUID as randomUUID2 } from "crypto";
|
|
@@ -57552,6 +57559,11 @@ function isTruthyEnv(value) {
|
|
|
57552
57559
|
}
|
|
57553
57560
|
return !["0", "false", "no", "off"].includes(value.toLowerCase());
|
|
57554
57561
|
}
|
|
57562
|
+
function consumePendingProviderNotice() {
|
|
57563
|
+
const notice = pendingProviderNotice;
|
|
57564
|
+
pendingProviderNotice = null;
|
|
57565
|
+
return notice;
|
|
57566
|
+
}
|
|
57555
57567
|
function toOllamaChatRequest(params, stream4, capabilities) {
|
|
57556
57568
|
const supportsTools = modelCapabilityEnabled(capabilities, "tools");
|
|
57557
57569
|
const tools = supportsTools ? toOllamaTools(params.tools) : [];
|
|
@@ -57559,7 +57571,9 @@ function toOllamaChatRequest(params, stream4, capabilities) {
|
|
|
57559
57571
|
const toolsDropped = toolsRequested && !supportsTools;
|
|
57560
57572
|
if (toolsDropped && !warnedToolsUnsupportedModels.has(params.model)) {
|
|
57561
57573
|
warnedToolsUnsupportedModels.add(params.model);
|
|
57562
|
-
|
|
57574
|
+
const message = `"${params.model}" does not advertise the 'tools' capability, so tool ` + `definitions are not sent to it. It cannot read or write files, run ` + `commands, or use any tool \u2014 asked to, it will describe what it would ` + `do and may report work it did not perform. Pick a tools-capable model ` + `with /model (check with: ur model-doctor).`;
|
|
57575
|
+
logForDebugging(message, { level: "warn" });
|
|
57576
|
+
pendingProviderNotice = message;
|
|
57563
57577
|
}
|
|
57564
57578
|
const systemMessage = {
|
|
57565
57579
|
role: "system",
|
|
@@ -58438,7 +58452,7 @@ function parseToolInput(input) {
|
|
|
58438
58452
|
}
|
|
58439
58453
|
return parsed ?? {};
|
|
58440
58454
|
}
|
|
58441
|
-
var DEFAULT_OLLAMA_REQUEST_TIMEOUT_MS = 300000, REMOTE_OLLAMA_REQUEST_TIMEOUT_MS = 120000, CLOUD_OLLAMA_REQUEST_TIMEOUT_MS = 120000, OLLAMA_GATEWAY_TIMEOUT_MESSAGE = "Ollama gateway timed out while waiting for the model to respond. Check the selected Ollama endpoint or increase API_TIMEOUT_MS if the model needs more time.", ollamaModelCapabilitiesCache, ollamaBaseUrlOverride, warnedToolsUnsupportedModels, TEXT_TOOL_CALL_HINT, LEVELED_THINK_MODEL_RE;
|
|
58455
|
+
var DEFAULT_OLLAMA_REQUEST_TIMEOUT_MS = 300000, REMOTE_OLLAMA_REQUEST_TIMEOUT_MS = 120000, CLOUD_OLLAMA_REQUEST_TIMEOUT_MS = 120000, OLLAMA_GATEWAY_TIMEOUT_MESSAGE = "Ollama gateway timed out while waiting for the model to respond. Check the selected Ollama endpoint or increase API_TIMEOUT_MS if the model needs more time.", ollamaModelCapabilitiesCache, ollamaBaseUrlOverride, warnedToolsUnsupportedModels, TEXT_TOOL_CALL_HINT, pendingProviderNotice = null, LEVELED_THINK_MODEL_RE;
|
|
58442
58456
|
var init_ollama = __esm(() => {
|
|
58443
58457
|
init_urhq_sdk();
|
|
58444
58458
|
init_ollamaModels();
|
|
@@ -62586,7 +62600,8 @@ async function createLocalProviderClient(providerId, options = {}) {
|
|
|
62586
62600
|
const { createOllamaURHQClient: createOllamaURHQClient2 } = await Promise.resolve().then(() => (init_ollama(), exports_ollama));
|
|
62587
62601
|
const settings = getInitialSettings();
|
|
62588
62602
|
const configured = getActiveProviderSettings(settings);
|
|
62589
|
-
const
|
|
62603
|
+
const sessionHost = getOllamaSessionOverride();
|
|
62604
|
+
const baseUrlOverride = sessionHost ? sessionHost : configured.active === providerId ? configured.baseUrl ?? getOllamaBaseUrl(process.env, settings) : getOllamaBaseUrl(process.env, settings);
|
|
62590
62605
|
return createOllamaURHQClient2({ baseUrlOverride });
|
|
62591
62606
|
}
|
|
62592
62607
|
async function createOpenAICompatibleProviderClient(providerId, options = {}) {
|
|
@@ -75223,7 +75238,7 @@ var init_auth = __esm(() => {
|
|
|
75223
75238
|
|
|
75224
75239
|
// src/utils/userAgent.ts
|
|
75225
75240
|
function getURCodeUserAgent() {
|
|
75226
|
-
return `ur/${"1.65.
|
|
75241
|
+
return `ur/${"1.65.2"}`;
|
|
75227
75242
|
}
|
|
75228
75243
|
|
|
75229
75244
|
// src/utils/workloadContext.ts
|
|
@@ -75245,7 +75260,7 @@ function getUserAgent() {
|
|
|
75245
75260
|
const clientApp = process.env.UR_AGENT_SDK_CLIENT_APP ? `, client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}` : "";
|
|
75246
75261
|
const workload = getWorkload();
|
|
75247
75262
|
const workloadSuffix = workload ? `, workload/${workload}` : "";
|
|
75248
|
-
return `ur-cli/${"1.65.
|
|
75263
|
+
return `ur-cli/${"1.65.2"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
|
|
75249
75264
|
}
|
|
75250
75265
|
function getMCPUserAgent() {
|
|
75251
75266
|
const parts = [];
|
|
@@ -75259,7 +75274,7 @@ function getMCPUserAgent() {
|
|
|
75259
75274
|
parts.push(`client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}`);
|
|
75260
75275
|
}
|
|
75261
75276
|
const suffix = parts.length > 0 ? ` (${parts.join(", ")})` : "";
|
|
75262
|
-
return `ur/${"1.65.
|
|
75277
|
+
return `ur/${"1.65.2"}${suffix}`;
|
|
75263
75278
|
}
|
|
75264
75279
|
function getWebFetchUserAgent() {
|
|
75265
75280
|
return `UR-User (${getURCodeUserAgent()})`;
|
|
@@ -75397,7 +75412,7 @@ var init_user = __esm(() => {
|
|
|
75397
75412
|
deviceId,
|
|
75398
75413
|
sessionId: getSessionId(),
|
|
75399
75414
|
email: getEmail(),
|
|
75400
|
-
appVersion: "1.65.
|
|
75415
|
+
appVersion: "1.65.2",
|
|
75401
75416
|
platform: getHostPlatformForAnalytics(),
|
|
75402
75417
|
organizationUuid,
|
|
75403
75418
|
accountUuid,
|
|
@@ -83597,7 +83612,7 @@ var init_metadata = __esm(() => {
|
|
|
83597
83612
|
COMPOUND_OPERATOR_REGEX = /\s*(?:&&|\|\||[;|])\s*/;
|
|
83598
83613
|
WHITESPACE_REGEX = /\s+/;
|
|
83599
83614
|
getVersionBase = memoize_default(() => {
|
|
83600
|
-
const match = "1.65.
|
|
83615
|
+
const match = "1.65.2".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
|
|
83601
83616
|
return match ? match[0] : undefined;
|
|
83602
83617
|
});
|
|
83603
83618
|
buildEnvContext = memoize_default(async () => {
|
|
@@ -83637,7 +83652,7 @@ var init_metadata = __esm(() => {
|
|
|
83637
83652
|
isGithubAction: isEnvTruthy(process.env.GITHUB_ACTIONS),
|
|
83638
83653
|
isURCodeAction: isEnvTruthy(process.env.UR_CODE_ACTION),
|
|
83639
83654
|
isURAiAuth: isURAISubscriber(),
|
|
83640
|
-
version: "1.65.
|
|
83655
|
+
version: "1.65.2",
|
|
83641
83656
|
versionBase: getVersionBase(),
|
|
83642
83657
|
buildTime: "",
|
|
83643
83658
|
deploymentEnvironment: env2.detectDeploymentEnvironment(),
|
|
@@ -84307,7 +84322,7 @@ function initialize1PEventLogging() {
|
|
|
84307
84322
|
const platform2 = getPlatform();
|
|
84308
84323
|
const attributes = {
|
|
84309
84324
|
[import_semantic_conventions4.ATTR_SERVICE_NAME]: "ur",
|
|
84310
|
-
[import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.65.
|
|
84325
|
+
[import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.65.2"
|
|
84311
84326
|
};
|
|
84312
84327
|
if (platform2 === "wsl") {
|
|
84313
84328
|
const wslVersion = getWslVersion();
|
|
@@ -84335,7 +84350,7 @@ function initialize1PEventLogging() {
|
|
|
84335
84350
|
})
|
|
84336
84351
|
]
|
|
84337
84352
|
});
|
|
84338
|
-
firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.65.
|
|
84353
|
+
firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.65.2");
|
|
84339
84354
|
}
|
|
84340
84355
|
async function reinitialize1PEventLoggingIfConfigChanged() {
|
|
84341
84356
|
if (!is1PEventLoggingEnabled() || !firstPartyEventLoggerProvider) {
|
|
@@ -86854,6 +86869,12 @@ var init_types2 = __esm(() => {
|
|
|
86854
86869
|
name: exports_external.string().optional().describe("Synthesiser voice name"),
|
|
86855
86870
|
rate: exports_external.number().optional().describe("Words per minute")
|
|
86856
86871
|
}).optional().describe("Spoken output settings"),
|
|
86872
|
+
tasks: exports_external.object({
|
|
86873
|
+
requireBeforeChanges: exports_external.object({
|
|
86874
|
+
enabled: exports_external.boolean().optional(),
|
|
86875
|
+
freeReads: exports_external.number().optional()
|
|
86876
|
+
}).optional().describe("Require a task list before any tool that changes the workspace (Edit, Write, Bash, ...). " + "Reads are never blocked, so the agent can investigate before planning; freeReads is how many " + "tool calls may run before the gate applies at all. Set enabled=false to make the task list advisory again.")
|
|
86877
|
+
}).optional().describe("Task list behaviour."),
|
|
86857
86878
|
context: exports_external.object({
|
|
86858
86879
|
pruneToolResults: exports_external.object({
|
|
86859
86880
|
enabled: exports_external.boolean().optional(),
|
|
@@ -88095,6 +88116,9 @@ function getOllamaBaseUrl(env4 = process.env, settings) {
|
|
|
88095
88116
|
function setOllamaBaseUrlOverride(url3) {
|
|
88096
88117
|
sessionOverride = url3;
|
|
88097
88118
|
}
|
|
88119
|
+
function getOllamaSessionOverride() {
|
|
88120
|
+
return sessionOverride ? normalizeOllamaBaseUrl(sessionOverride) : undefined;
|
|
88121
|
+
}
|
|
88098
88122
|
var sessionOverride, OLLAMA_CLOUD_BASE_URL = "https://ollama.com";
|
|
88099
88123
|
var init_ollamaConfig = __esm(() => {
|
|
88100
88124
|
init_settings2();
|
|
@@ -94181,7 +94205,7 @@ function formatAgentTrendReport(report = buildAgentTrendReport()) {
|
|
|
94181
94205
|
function formatA2AAgentCard(options = {}, pretty = true) {
|
|
94182
94206
|
return JSON.stringify(buildA2AAgentCard(options), null, pretty ? 2 : 0);
|
|
94183
94207
|
}
|
|
94184
|
-
var urVersion = "1.65.
|
|
94208
|
+
var urVersion = "1.65.2", researchSnapshotDate = "2026-07-15", coverage, priorityRoadmap;
|
|
94185
94209
|
var init_trends = __esm(() => {
|
|
94186
94210
|
init_a2aCardSignature();
|
|
94187
94211
|
coverage = [
|
|
@@ -96984,7 +97008,7 @@ function getAttributionHeader(fingerprint) {
|
|
|
96984
97008
|
if (!isAttributionHeaderEnabled()) {
|
|
96985
97009
|
return "";
|
|
96986
97010
|
}
|
|
96987
|
-
const version2 = `${"1.65.
|
|
97011
|
+
const version2 = `${"1.65.2"}.${fingerprint}`;
|
|
96988
97012
|
const entrypoint = process.env.UR_CODE_ENTRYPOINT ?? "unknown";
|
|
96989
97013
|
const cch = "";
|
|
96990
97014
|
const workload = getWorkload();
|
|
@@ -154748,7 +154772,7 @@ var init_projectSafety = __esm(() => {
|
|
|
154748
154772
|
function getInstruments() {
|
|
154749
154773
|
if (instruments)
|
|
154750
154774
|
return instruments;
|
|
154751
|
-
const meter = import_api10.metrics.getMeter("ur-agent.gen_ai", "1.65.
|
|
154775
|
+
const meter = import_api10.metrics.getMeter("ur-agent.gen_ai", "1.65.2");
|
|
154752
154776
|
instruments = {
|
|
154753
154777
|
operationDuration: meter.createHistogram("gen_ai.client.operation.duration", {
|
|
154754
154778
|
description: "GenAI operation duration.",
|
|
@@ -154846,7 +154870,7 @@ function genAiAgentAttributes() {
|
|
|
154846
154870
|
"gen_ai.operation.name": GEN_AI_OPERATION_INVOKE_AGENT,
|
|
154847
154871
|
"gen_ai.provider.name": "ur",
|
|
154848
154872
|
"gen_ai.agent.name": "UR-Nexus",
|
|
154849
|
-
"gen_ai.agent.version": "1.65.
|
|
154873
|
+
"gen_ai.agent.version": "1.65.2"
|
|
154850
154874
|
};
|
|
154851
154875
|
}
|
|
154852
154876
|
function genAiWorkflowAttributes(workflowName) {
|
|
@@ -154862,7 +154886,7 @@ function genAiWorkflowAttributes(workflowName) {
|
|
|
154862
154886
|
function startGenAiWorkflowSpan(workflowName) {
|
|
154863
154887
|
const attributes = genAiWorkflowAttributes(workflowName);
|
|
154864
154888
|
const name = typeof attributes["gen_ai.workflow.name"] === "string" ? `invoke_workflow ${attributes["gen_ai.workflow.name"]}` : GEN_AI_OPERATION_INVOKE_WORKFLOW;
|
|
154865
|
-
return import_api10.trace.getTracer("ur-agent.gen_ai", "1.65.
|
|
154889
|
+
return import_api10.trace.getTracer("ur-agent.gen_ai", "1.65.2").startSpan(name, { kind: import_api10.SpanKind.INTERNAL, attributes });
|
|
154866
154890
|
}
|
|
154867
154891
|
function endGenAiWorkflowSpan(span, options2 = {}) {
|
|
154868
154892
|
try {
|
|
@@ -154900,7 +154924,7 @@ function startGenAiMemorySpan(operation, options2 = {}) {
|
|
|
154900
154924
|
if (options2.recordCount !== undefined && Number.isInteger(options2.recordCount) && options2.recordCount >= 0) {
|
|
154901
154925
|
attributes["gen_ai.memory.record.count"] = options2.recordCount;
|
|
154902
154926
|
}
|
|
154903
|
-
return import_api10.trace.getTracer("ur-agent.gen_ai", "1.65.
|
|
154927
|
+
return import_api10.trace.getTracer("ur-agent.gen_ai", "1.65.2").startSpan(operation, { kind: import_api10.SpanKind.INTERNAL, attributes });
|
|
154904
154928
|
}
|
|
154905
154929
|
function endGenAiMemorySpan(span, options2 = {}) {
|
|
154906
154930
|
try {
|
|
@@ -206419,7 +206443,7 @@ function getTelemetryAttributes() {
|
|
|
206419
206443
|
attributes["session.id"] = sessionId;
|
|
206420
206444
|
}
|
|
206421
206445
|
if (shouldIncludeAttribute("OTEL_METRICS_INCLUDE_VERSION")) {
|
|
206422
|
-
attributes["app.version"] = "1.65.
|
|
206446
|
+
attributes["app.version"] = "1.65.2";
|
|
206423
206447
|
}
|
|
206424
206448
|
const oauthAccount = getOauthAccountInfo();
|
|
206425
206449
|
if (oauthAccount) {
|
|
@@ -252956,7 +252980,7 @@ function getInstallationEnv() {
|
|
|
252956
252980
|
return;
|
|
252957
252981
|
}
|
|
252958
252982
|
function getURCodeVersion() {
|
|
252959
|
-
return "1.65.
|
|
252983
|
+
return "1.65.2";
|
|
252960
252984
|
}
|
|
252961
252985
|
async function getInstalledVSCodeExtensionVersion(command) {
|
|
252962
252986
|
const { stdout } = await execFileNoThrow(command, ["--list-extensions", "--show-versions"], {
|
|
@@ -260287,7 +260311,7 @@ async function setupSdkMcpClients(sdkMcpConfigs, sendMcpMessage) {
|
|
|
260287
260311
|
const client2 = new Client({
|
|
260288
260312
|
name: "ur",
|
|
260289
260313
|
title: "UR",
|
|
260290
|
-
version: "1.65.
|
|
260314
|
+
version: "1.65.2",
|
|
260291
260315
|
description: "UR-Nexus autonomous engineering workflow engine",
|
|
260292
260316
|
websiteUrl: PRODUCT_URL
|
|
260293
260317
|
}, {
|
|
@@ -260647,7 +260671,7 @@ var init_client5 = __esm(() => {
|
|
|
260647
260671
|
const client2 = new Client({
|
|
260648
260672
|
name: "ur",
|
|
260649
260673
|
title: "UR",
|
|
260650
|
-
version: "1.65.
|
|
260674
|
+
version: "1.65.2",
|
|
260651
260675
|
description: "UR-Nexus autonomous engineering workflow engine",
|
|
260652
260676
|
websiteUrl: PRODUCT_URL
|
|
260653
260677
|
}, {
|
|
@@ -273248,7 +273272,7 @@ async function createRuntime() {
|
|
|
273248
273272
|
bootstrapTelemetry();
|
|
273249
273273
|
const resource = defaultResource().merge(detectResources({ detectors: [envDetector] })).merge(resourceFromAttributes({
|
|
273250
273274
|
[import_semantic_conventions7.ATTR_SERVICE_NAME]: "ur-agent",
|
|
273251
|
-
[import_semantic_conventions7.ATTR_SERVICE_VERSION]: "1.65.
|
|
273275
|
+
[import_semantic_conventions7.ATTR_SERVICE_VERSION]: "1.65.2"
|
|
273252
273276
|
}));
|
|
273253
273277
|
const tracerProvider = exporters.traces.length > 0 ? new BasicTracerProvider({
|
|
273254
273278
|
resource,
|
|
@@ -273281,11 +273305,11 @@ async function createRuntime() {
|
|
|
273281
273305
|
setMeterProvider(meterProvider);
|
|
273282
273306
|
setLoggerProvider(loggerProvider);
|
|
273283
273307
|
if (meterProvider) {
|
|
273284
|
-
const meter = meterProvider.getMeter("ur-agent", "1.65.
|
|
273308
|
+
const meter = meterProvider.getMeter("ur-agent", "1.65.2");
|
|
273285
273309
|
setMeter(meter, (name, options2) => meter.createCounter(name, options2));
|
|
273286
273310
|
}
|
|
273287
273311
|
if (loggerProvider) {
|
|
273288
|
-
setEventLogger(loggerProvider.getLogger("ur-agent.events", "1.65.
|
|
273312
|
+
setEventLogger(loggerProvider.getLogger("ur-agent.events", "1.65.2"));
|
|
273289
273313
|
}
|
|
273290
273314
|
if (!cleanupRegistered2) {
|
|
273291
273315
|
cleanupRegistered2 = true;
|
|
@@ -273947,9 +273971,9 @@ async function assertMinVersion() {
|
|
|
273947
273971
|
if (false) {}
|
|
273948
273972
|
try {
|
|
273949
273973
|
const versionConfig = await getDynamicConfig_BLOCKS_ON_INIT("tengu_version_config", { minVersion: "0.0.0" });
|
|
273950
|
-
if (versionConfig.minVersion && lt("1.65.
|
|
273974
|
+
if (versionConfig.minVersion && lt("1.65.2", versionConfig.minVersion)) {
|
|
273951
273975
|
console.error(`
|
|
273952
|
-
It looks like your version of UR (${"1.65.
|
|
273976
|
+
It looks like your version of UR (${"1.65.2"}) needs an update.
|
|
273953
273977
|
A newer version (${versionConfig.minVersion} or higher) is required to continue.
|
|
273954
273978
|
|
|
273955
273979
|
To update, please run:
|
|
@@ -274165,7 +274189,7 @@ async function installGlobalPackage(specificVersion) {
|
|
|
274165
274189
|
logError2(new AutoUpdaterError("Another process is currently installing an update"));
|
|
274166
274190
|
logEvent("tengu_auto_updater_lock_contention", {
|
|
274167
274191
|
pid: process.pid,
|
|
274168
|
-
currentVersion: "1.65.
|
|
274192
|
+
currentVersion: "1.65.2"
|
|
274169
274193
|
});
|
|
274170
274194
|
return "in_progress";
|
|
274171
274195
|
}
|
|
@@ -274174,7 +274198,7 @@ async function installGlobalPackage(specificVersion) {
|
|
|
274174
274198
|
if (!env2.isRunningWithBun() && env2.isNpmFromWindowsPath()) {
|
|
274175
274199
|
logError2(new Error("Windows NPM detected in WSL environment"));
|
|
274176
274200
|
logEvent("tengu_auto_updater_windows_npm_in_wsl", {
|
|
274177
|
-
currentVersion: "1.65.
|
|
274201
|
+
currentVersion: "1.65.2"
|
|
274178
274202
|
});
|
|
274179
274203
|
console.error(`
|
|
274180
274204
|
Error: Windows NPM detected in WSL
|
|
@@ -274709,7 +274733,7 @@ function detectLinuxGlobPatternWarnings() {
|
|
|
274709
274733
|
}
|
|
274710
274734
|
async function getDoctorDiagnostic() {
|
|
274711
274735
|
const installationType = await getCurrentInstallationType();
|
|
274712
|
-
const version2 = typeof MACRO !== "undefined" ? "1.65.
|
|
274736
|
+
const version2 = typeof MACRO !== "undefined" ? "1.65.2" : "unknown";
|
|
274713
274737
|
const installationPath = await getInstallationPath();
|
|
274714
274738
|
const invokedBinary = getInvokedBinary();
|
|
274715
274739
|
const multipleInstallations = await detectMultipleInstallations();
|
|
@@ -275644,8 +275668,8 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
|
|
|
275644
275668
|
const maxVersion = await getMaxVersion();
|
|
275645
275669
|
if (maxVersion && gt(version2, maxVersion)) {
|
|
275646
275670
|
logForDebugging(`Native installer: maxVersion ${maxVersion} is set, capping update from ${version2} to ${maxVersion}`);
|
|
275647
|
-
if (gte("1.65.
|
|
275648
|
-
logForDebugging(`Native installer: current version ${"1.65.
|
|
275671
|
+
if (gte("1.65.2", maxVersion)) {
|
|
275672
|
+
logForDebugging(`Native installer: current version ${"1.65.2"} is already at or above maxVersion ${maxVersion}, skipping update`);
|
|
275649
275673
|
logEvent("tengu_native_update_skipped_max_version", {
|
|
275650
275674
|
latency_ms: Date.now() - startTime,
|
|
275651
275675
|
max_version: maxVersion,
|
|
@@ -275656,7 +275680,7 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
|
|
|
275656
275680
|
version2 = maxVersion;
|
|
275657
275681
|
}
|
|
275658
275682
|
}
|
|
275659
|
-
if (!forceReinstall && version2 === "1.65.
|
|
275683
|
+
if (!forceReinstall && version2 === "1.65.2" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
|
|
275660
275684
|
logForDebugging(`Found ${version2} at ${executablePath}, skipping install`);
|
|
275661
275685
|
logEvent("tengu_native_update_complete", {
|
|
275662
275686
|
latency_ms: Date.now() - startTime,
|
|
@@ -277525,6 +277549,34 @@ var init_spinnerVerbs = __esm(() => {
|
|
|
277525
277549
|
});
|
|
277526
277550
|
|
|
277527
277551
|
// src/utils/tasks.ts
|
|
277552
|
+
var exports_tasks = {};
|
|
277553
|
+
__export(exports_tasks, {
|
|
277554
|
+
updateTask: () => updateTask2,
|
|
277555
|
+
unassignTeammateTasks: () => unassignTeammateTasks,
|
|
277556
|
+
setLeaderTeamName: () => setLeaderTeamName,
|
|
277557
|
+
sanitizePathComponent: () => sanitizePathComponent,
|
|
277558
|
+
resetTaskList: () => resetTaskList,
|
|
277559
|
+
onTasksUpdated: () => onTasksUpdated,
|
|
277560
|
+
notifyTasksUpdated: () => notifyTasksUpdated,
|
|
277561
|
+
listTasks: () => listTasks,
|
|
277562
|
+
isTodoV2Enabled: () => isTodoV2Enabled,
|
|
277563
|
+
getTasksDir: () => getTasksDir,
|
|
277564
|
+
getTaskPath: () => getTaskPath,
|
|
277565
|
+
getTaskListId: () => getTaskListId,
|
|
277566
|
+
getTask: () => getTask,
|
|
277567
|
+
getAgentStatuses: () => getAgentStatuses,
|
|
277568
|
+
ensureTasksDir: () => ensureTasksDir,
|
|
277569
|
+
deleteTask: () => deleteTask,
|
|
277570
|
+
createTask: () => createTask,
|
|
277571
|
+
compareTaskIds: () => compareTaskIds,
|
|
277572
|
+
clearLeaderTeamName: () => clearLeaderTeamName,
|
|
277573
|
+
claimTask: () => claimTask,
|
|
277574
|
+
blockTask: () => blockTask,
|
|
277575
|
+
TaskStatusSchema: () => TaskStatusSchema2,
|
|
277576
|
+
TaskSchema: () => TaskSchema2,
|
|
277577
|
+
TASK_STATUSES: () => TASK_STATUSES,
|
|
277578
|
+
DEFAULT_TASKS_MODE_TASK_LIST_ID: () => DEFAULT_TASKS_MODE_TASK_LIST_ID
|
|
277579
|
+
});
|
|
277528
277580
|
import { mkdir as mkdir13, readdir as readdir10, readFile as readFile16, unlink as unlink10, writeFile as writeFile15 } from "fs/promises";
|
|
277529
277581
|
import { join as join83 } from "path";
|
|
277530
277582
|
function setLeaderTeamName(teamName) {
|
|
@@ -277762,6 +277814,19 @@ async function deleteTask(taskListId, taskId) {
|
|
|
277762
277814
|
return false;
|
|
277763
277815
|
}
|
|
277764
277816
|
}
|
|
277817
|
+
function compareTaskIds(a2, b) {
|
|
277818
|
+
const left = Number.parseInt(a2, 10);
|
|
277819
|
+
const right = Number.parseInt(b, 10);
|
|
277820
|
+
const leftIsNumeric = !Number.isNaN(left);
|
|
277821
|
+
const rightIsNumeric = !Number.isNaN(right);
|
|
277822
|
+
if (leftIsNumeric && rightIsNumeric)
|
|
277823
|
+
return left - right;
|
|
277824
|
+
if (leftIsNumeric)
|
|
277825
|
+
return -1;
|
|
277826
|
+
if (rightIsNumeric)
|
|
277827
|
+
return 1;
|
|
277828
|
+
return a2.localeCompare(b);
|
|
277829
|
+
}
|
|
277765
277830
|
async function listTasks(taskListId) {
|
|
277766
277831
|
const dir = getTasksDir(taskListId);
|
|
277767
277832
|
let files;
|
|
@@ -277770,7 +277835,7 @@ async function listTasks(taskListId) {
|
|
|
277770
277835
|
} catch {
|
|
277771
277836
|
return [];
|
|
277772
277837
|
}
|
|
277773
|
-
const taskIds = files.filter((f) => f.endsWith(".json")).map((f) => f.replace(".json", ""));
|
|
277838
|
+
const taskIds = files.filter((f) => f.endsWith(".json")).map((f) => f.replace(".json", "")).sort(compareTaskIds);
|
|
277774
277839
|
const results = await Promise.all(taskIds.map((id) => getTask(taskListId, id)));
|
|
277775
277840
|
return results.filter((t) => t !== null);
|
|
277776
277841
|
}
|
|
@@ -277891,6 +277956,60 @@ async function claimTaskWithBusyCheck(taskListId, taskId, claimantAgentId) {
|
|
|
277891
277956
|
}
|
|
277892
277957
|
}
|
|
277893
277958
|
}
|
|
277959
|
+
function sanitizeName(name) {
|
|
277960
|
+
return name.replace(/[^a-zA-Z0-9]/g, "-").toLowerCase();
|
|
277961
|
+
}
|
|
277962
|
+
async function readTeamMembers(teamName) {
|
|
277963
|
+
const teamsDir = getTeamsDir();
|
|
277964
|
+
const teamFilePath = join83(teamsDir, sanitizeName(teamName), "config.json");
|
|
277965
|
+
try {
|
|
277966
|
+
const content = await readFile16(teamFilePath, "utf-8");
|
|
277967
|
+
const teamFile = jsonParse(content);
|
|
277968
|
+
return {
|
|
277969
|
+
leadAgentId: teamFile.leadAgentId,
|
|
277970
|
+
members: teamFile.members.map((m) => ({
|
|
277971
|
+
agentId: m.agentId,
|
|
277972
|
+
name: m.name,
|
|
277973
|
+
agentType: m.agentType
|
|
277974
|
+
}))
|
|
277975
|
+
};
|
|
277976
|
+
} catch (e) {
|
|
277977
|
+
const code = getErrnoCode(e);
|
|
277978
|
+
if (code === "ENOENT") {
|
|
277979
|
+
return null;
|
|
277980
|
+
}
|
|
277981
|
+
logForDebugging(`[Tasks] Failed to read team file for ${teamName}: ${errorMessage2(e)}`);
|
|
277982
|
+
return null;
|
|
277983
|
+
}
|
|
277984
|
+
}
|
|
277985
|
+
async function getAgentStatuses(teamName) {
|
|
277986
|
+
const teamData = await readTeamMembers(teamName);
|
|
277987
|
+
if (!teamData) {
|
|
277988
|
+
return null;
|
|
277989
|
+
}
|
|
277990
|
+
const taskListId = sanitizeName(teamName);
|
|
277991
|
+
const allTasks = await listTasks(taskListId);
|
|
277992
|
+
const unresolvedTasksByOwner = new Map;
|
|
277993
|
+
for (const task of allTasks) {
|
|
277994
|
+
if (task.status !== "completed" && task.owner) {
|
|
277995
|
+
const existing2 = unresolvedTasksByOwner.get(task.owner) || [];
|
|
277996
|
+
existing2.push(task.id);
|
|
277997
|
+
unresolvedTasksByOwner.set(task.owner, existing2);
|
|
277998
|
+
}
|
|
277999
|
+
}
|
|
278000
|
+
return teamData.members.map((member) => {
|
|
278001
|
+
const tasksByName = unresolvedTasksByOwner.get(member.name) || [];
|
|
278002
|
+
const tasksById = unresolvedTasksByOwner.get(member.agentId) || [];
|
|
278003
|
+
const currentTasks = uniq([...tasksByName, ...tasksById]);
|
|
278004
|
+
return {
|
|
278005
|
+
agentId: member.agentId,
|
|
278006
|
+
name: member.name,
|
|
278007
|
+
agentType: member.agentType,
|
|
278008
|
+
status: currentTasks.length === 0 ? "idle" : "busy",
|
|
278009
|
+
currentTasks
|
|
278010
|
+
};
|
|
278011
|
+
});
|
|
278012
|
+
}
|
|
277894
278013
|
async function unassignTeammateTasks(teamName, teammateId, teammateName, reason) {
|
|
277895
278014
|
const tasks = await listTasks(teamName);
|
|
277896
278015
|
const unresolvedAssignedTasks = tasks.filter((t) => t.status !== "completed" && (t.owner === teammateId || t.owner === teammateName));
|
|
@@ -277914,7 +278033,7 @@ async function unassignTeammateTasks(teamName, teammateId, teammateName, reason)
|
|
|
277914
278033
|
notificationMessage
|
|
277915
278034
|
};
|
|
277916
278035
|
}
|
|
277917
|
-
var tasksUpdated, leaderTeamName, onTasksUpdated, TaskStatusSchema2, TaskSchema2, HIGH_WATER_MARK_FILE = ".highwatermark", LOCK_OPTIONS, DEFAULT_TASKS_MODE_TASK_LIST_ID = "tasklist";
|
|
278036
|
+
var tasksUpdated, leaderTeamName, onTasksUpdated, TASK_STATUSES, TaskStatusSchema2, TaskSchema2, HIGH_WATER_MARK_FILE = ".highwatermark", LOCK_OPTIONS, DEFAULT_TASKS_MODE_TASK_LIST_ID = "tasklist";
|
|
277918
278037
|
var init_tasks = __esm(() => {
|
|
277919
278038
|
init_v4();
|
|
277920
278039
|
init_state();
|
|
@@ -277927,6 +278046,7 @@ var init_tasks = __esm(() => {
|
|
|
277927
278046
|
init_teammateContext();
|
|
277928
278047
|
tasksUpdated = createSignal();
|
|
277929
278048
|
onTasksUpdated = tasksUpdated.subscribe;
|
|
278049
|
+
TASK_STATUSES = ["pending", "in_progress", "completed"];
|
|
277930
278050
|
TaskStatusSchema2 = lazySchema(() => exports_external.enum(["pending", "in_progress", "completed", "failed", "skipped"]));
|
|
277931
278051
|
TaskSchema2 = lazySchema(() => exports_external.object({
|
|
277932
278052
|
id: exports_external.string(),
|
|
@@ -283545,7 +283665,7 @@ __export(exports_teamHelpers, {
|
|
|
283545
283665
|
setMultipleMemberModes: () => setMultipleMemberModes,
|
|
283546
283666
|
setMemberMode: () => setMemberMode,
|
|
283547
283667
|
setMemberActive: () => setMemberActive,
|
|
283548
|
-
sanitizeName: () =>
|
|
283668
|
+
sanitizeName: () => sanitizeName2,
|
|
283549
283669
|
sanitizeAgentName: () => sanitizeAgentName,
|
|
283550
283670
|
removeTeammateFromTeamFile: () => removeTeammateFromTeamFile,
|
|
283551
283671
|
removeMemberFromTeam: () => removeMemberFromTeam,
|
|
@@ -283564,14 +283684,14 @@ __export(exports_teamHelpers, {
|
|
|
283564
283684
|
import { mkdirSync as mkdirSync16, readFileSync as readFileSync24, writeFileSync as writeFileSync16 } from "fs";
|
|
283565
283685
|
import { mkdir as mkdir15, readFile as readFile18, rm as rm4, writeFile as writeFile17 } from "fs/promises";
|
|
283566
283686
|
import { join as join85 } from "path";
|
|
283567
|
-
function
|
|
283687
|
+
function sanitizeName2(name) {
|
|
283568
283688
|
return name.replace(/[^a-zA-Z0-9]/g, "-").toLowerCase();
|
|
283569
283689
|
}
|
|
283570
283690
|
function sanitizeAgentName(name) {
|
|
283571
283691
|
return name.replace(/@/g, "-");
|
|
283572
283692
|
}
|
|
283573
283693
|
function getTeamDir(teamName) {
|
|
283574
|
-
return join85(getTeamsDir(),
|
|
283694
|
+
return join85(getTeamsDir(), sanitizeName2(teamName));
|
|
283575
283695
|
}
|
|
283576
283696
|
function getTeamFilePath(teamName) {
|
|
283577
283697
|
return join85(getTeamDir(teamName), "config.json");
|
|
@@ -283833,7 +283953,7 @@ async function killOrphanedTeammatePanes(teamName) {
|
|
|
283833
283953
|
}));
|
|
283834
283954
|
}
|
|
283835
283955
|
async function cleanupTeamDirectories(teamName) {
|
|
283836
|
-
const sanitizedName =
|
|
283956
|
+
const sanitizedName = sanitizeName2(teamName);
|
|
283837
283957
|
const teamFile = readTeamFile(teamName);
|
|
283838
283958
|
const worktreePaths = [];
|
|
283839
283959
|
if (teamFile) {
|
|
@@ -331629,7 +331749,7 @@ var init_AskUserQuestionTool = __esm(() => {
|
|
|
331629
331749
|
questionSchema = lazySchema(() => exports_external.object({
|
|
331630
331750
|
question: exports_external.string().describe('The complete question to ask the user. Should be clear, specific, and end with a question mark. Example: "Which library should we use for date formatting?" If multiSelect is true, phrase it accordingly, e.g. "Which features do you want to enable?"'),
|
|
331631
331751
|
header: exports_external.string().describe(`The category being decided, as a chip/tag (max ${ASK_USER_QUESTION_TOOL_CHIP_WIDTH} chars). Name the dimension, not the question: for "Which database should we use?" the header is "Database", not "Which DB". Examples: "Auth method", "Library", "Approach".`),
|
|
331632
|
-
options: exports_external.array(questionOptionSchema()).min(2).max(8).describe(`
|
|
331752
|
+
options: exports_external.array(questionOptionSchema()).min(2).max(8).describe(`REQUIRED: 2-8 concrete choices. A question with no options is not askable here \u2014 if you cannot name at least two specific answers, the question is open-ended, so ask it in plain assistant text instead of calling this tool. Do not call this tool with a prose question and omit options. Keep options concise and distinct; there should be no 'Other' option, that will be provided automatically.`),
|
|
331633
331753
|
multiSelect: exports_external.boolean().default(false).describe("Set to true to allow the user to select multiple options instead of just one. Use when choices are not mutually exclusive.")
|
|
331634
331754
|
}));
|
|
331635
331755
|
annotationsSchema = lazySchema(() => {
|
|
@@ -336802,10 +336922,10 @@ var init_TeamCreateTool = __esm(() => {
|
|
|
336802
336922
|
};
|
|
336803
336923
|
await writeTeamFileAsync(finalTeamName, teamFile);
|
|
336804
336924
|
registerTeamForSessionCleanup(finalTeamName);
|
|
336805
|
-
const taskListId =
|
|
336925
|
+
const taskListId = sanitizeName2(finalTeamName);
|
|
336806
336926
|
await resetTaskList(taskListId);
|
|
336807
336927
|
await ensureTasksDir(taskListId);
|
|
336808
|
-
setLeaderTeamName(
|
|
336928
|
+
setLeaderTeamName(sanitizeName2(finalTeamName));
|
|
336809
336929
|
setAppState((prev) => ({
|
|
336810
336930
|
...prev,
|
|
336811
336931
|
teamContext: {
|
|
@@ -339226,7 +339346,7 @@ async function handleSpawnSeparateWindow(input, context5) {
|
|
|
339226
339346
|
const uniqueName = await generateUniqueTeammateName(name, teamName);
|
|
339227
339347
|
const sanitizedName = sanitizeAgentName(uniqueName);
|
|
339228
339348
|
const teammateId = formatAgentId(sanitizedName, teamName);
|
|
339229
|
-
const windowName = `teammate-${
|
|
339349
|
+
const windowName = `teammate-${sanitizeName2(sanitizedName)}`;
|
|
339230
339350
|
const workingDir = cwd2 || getCwd();
|
|
339231
339351
|
await ensureSession(SWARM_SESSION_NAME);
|
|
339232
339352
|
const teammateColor = assignTeammateColor(teammateId);
|
|
@@ -345855,7 +345975,7 @@ function isAnyTracingEnabled() {
|
|
|
345855
345975
|
return isTelemetryEnabled() || isEnhancedTelemetryEnabled() || isBetaTracingEnabled();
|
|
345856
345976
|
}
|
|
345857
345977
|
function getTracer() {
|
|
345858
|
-
return import_api39.trace.getTracer("ur-agent.gen_ai", "1.65.
|
|
345978
|
+
return import_api39.trace.getTracer("ur-agent.gen_ai", "1.65.2");
|
|
345859
345979
|
}
|
|
345860
345980
|
function createSpanAttributes(spanType, customAttributes = {}) {
|
|
345861
345981
|
const baseAttributes = getTelemetryAttributes();
|
|
@@ -346513,6 +346633,53 @@ var init_toolErrors = __esm(() => {
|
|
|
346513
346633
|
init_messages();
|
|
346514
346634
|
});
|
|
346515
346635
|
|
|
346636
|
+
// src/services/tools/taskListGate.ts
|
|
346637
|
+
function getTaskListGateConfig() {
|
|
346638
|
+
const configured = getInitialSettings()?.tasks?.requireBeforeChanges;
|
|
346639
|
+
if (!configured)
|
|
346640
|
+
return TASK_LIST_GATE_DEFAULTS;
|
|
346641
|
+
return {
|
|
346642
|
+
enabled: typeof configured.enabled === "boolean" ? configured.enabled : TASK_LIST_GATE_DEFAULTS.enabled,
|
|
346643
|
+
freeReads: typeof configured.freeReads === "number" && Number.isInteger(configured.freeReads) && configured.freeReads >= 0 ? configured.freeReads : TASK_LIST_GATE_DEFAULTS.freeReads
|
|
346644
|
+
};
|
|
346645
|
+
}
|
|
346646
|
+
function isMutatingTool2(toolName) {
|
|
346647
|
+
return MUTATING_TOOLS2.has(toolName);
|
|
346648
|
+
}
|
|
346649
|
+
function checkTaskListGate(input) {
|
|
346650
|
+
const config2 = input.config ?? getTaskListGateConfig();
|
|
346651
|
+
if (!config2.enabled)
|
|
346652
|
+
return { allowed: true };
|
|
346653
|
+
if (input.isSubagent)
|
|
346654
|
+
return { allowed: true };
|
|
346655
|
+
if (!isMutatingTool2(input.toolName))
|
|
346656
|
+
return { allowed: true };
|
|
346657
|
+
if (input.taskCount > 0)
|
|
346658
|
+
return { allowed: true };
|
|
346659
|
+
if (input.readsSoFar < config2.freeReads)
|
|
346660
|
+
return { allowed: true };
|
|
346661
|
+
return {
|
|
346662
|
+
allowed: false,
|
|
346663
|
+
reason: `No task list exists, and ${input.toolName} changes the workspace. ` + `Call TaskCreate first with the steps you intend to take, then retry ` + `this call. Reads are unrestricted, so investigate as much as you need ` + `before writing the list. ` + `Disable with tasks.requireBeforeChanges.enabled=false in settings.`
|
|
346664
|
+
};
|
|
346665
|
+
}
|
|
346666
|
+
var TASK_LIST_GATE_DEFAULTS, MUTATING_TOOLS2;
|
|
346667
|
+
var init_taskListGate = __esm(() => {
|
|
346668
|
+
init_settings2();
|
|
346669
|
+
TASK_LIST_GATE_DEFAULTS = {
|
|
346670
|
+
enabled: true,
|
|
346671
|
+
freeReads: 3
|
|
346672
|
+
};
|
|
346673
|
+
MUTATING_TOOLS2 = new Set([
|
|
346674
|
+
"Edit",
|
|
346675
|
+
"MultiEdit",
|
|
346676
|
+
"Write",
|
|
346677
|
+
"NotebookEdit",
|
|
346678
|
+
"Bash",
|
|
346679
|
+
"Shell"
|
|
346680
|
+
]);
|
|
346681
|
+
});
|
|
346682
|
+
|
|
346516
346683
|
// src/stability/types.ts
|
|
346517
346684
|
var DEFAULT_LIMITS;
|
|
346518
346685
|
var init_types12 = __esm(() => {
|
|
@@ -347254,6 +347421,14 @@ var init_toolHooks = __esm(() => {
|
|
|
347254
347421
|
});
|
|
347255
347422
|
|
|
347256
347423
|
// src/services/tools/toolExecution.ts
|
|
347424
|
+
async function countTasksForGate() {
|
|
347425
|
+
try {
|
|
347426
|
+
const { getTaskListId: getTaskListId2, listTasks: listTasks3 } = await Promise.resolve().then(() => (init_tasks(), exports_tasks));
|
|
347427
|
+
return (await listTasks3(getTaskListId2())).length;
|
|
347428
|
+
} catch {
|
|
347429
|
+
return Number.POSITIVE_INFINITY;
|
|
347430
|
+
}
|
|
347431
|
+
}
|
|
347257
347432
|
function classifyToolError(error40) {
|
|
347258
347433
|
if (error40 instanceof TelemetrySafeError_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS) {
|
|
347259
347434
|
return error40.telemetryMessage.slice(0, 200);
|
|
@@ -347518,7 +347693,7 @@ function buildSchemaNotSentHint(tool, messages, tools) {
|
|
|
347518
347693
|
return null;
|
|
347519
347694
|
return `
|
|
347520
347695
|
|
|
347521
|
-
This tool's schema was not sent to the API \u2014 it was not in the discovered-tool set derived from message history. ` + `Without the schema in your prompt, typed parameters (arrays, numbers, booleans) get emitted as strings and the client-side parser rejects them.
|
|
347696
|
+
This tool's schema was not sent to the API \u2014 it was not in the discovered-tool set derived from message history. ` + `Without the schema in your prompt, typed parameters (arrays, numbers, booleans) get emitted as strings and the client-side parser rejects them. Load the tool first: call ${TOOL_SEARCH_TOOL_NAME} with query "select:${tool.name}", then retry this call.`;
|
|
347522
347697
|
}
|
|
347523
347698
|
async function checkPermissionsAndCallTool(tool, toolUseID, input, toolUseContext, canUseTool, assistantMessage, messageId, requestId, mcpServerType, mcpServerBaseUrl, onToolProgress) {
|
|
347524
347699
|
let parsedInput = tool.inputSchema.safeParse(input);
|
|
@@ -347535,6 +347710,32 @@ async function checkPermissionsAndCallTool(tool, toolUseID, input, toolUseContex
|
|
|
347535
347710
|
}
|
|
347536
347711
|
}
|
|
347537
347712
|
}
|
|
347713
|
+
const gate = checkTaskListGate({
|
|
347714
|
+
toolName: tool.name,
|
|
347715
|
+
taskCount: await countTasksForGate(),
|
|
347716
|
+
readsSoFar: toolUseContext.messages?.length ?? 0,
|
|
347717
|
+
isSubagent: Boolean(toolUseContext.agentId)
|
|
347718
|
+
});
|
|
347719
|
+
if (!gate.allowed) {
|
|
347720
|
+
logEvent("tengu_task_list_gate_blocked", {
|
|
347721
|
+
toolName: sanitizeToolNameForAnalytics(tool.name)
|
|
347722
|
+
});
|
|
347723
|
+
return [
|
|
347724
|
+
{
|
|
347725
|
+
message: createUserMessage({
|
|
347726
|
+
content: [
|
|
347727
|
+
{
|
|
347728
|
+
type: "tool_result",
|
|
347729
|
+
content: `<tool_use_error>TaskListRequired: ${gate.reason}</tool_use_error>`,
|
|
347730
|
+
is_error: true,
|
|
347731
|
+
tool_use_id: toolUseID
|
|
347732
|
+
}
|
|
347733
|
+
]
|
|
347734
|
+
}),
|
|
347735
|
+
shouldSkipPermissionCheck: false
|
|
347736
|
+
}
|
|
347737
|
+
];
|
|
347738
|
+
}
|
|
347538
347739
|
if (!parsedInput.success) {
|
|
347539
347740
|
let errorContent = formatZodValidationError(tool.name, parsedInput.error);
|
|
347540
347741
|
const schemaHint = buildSchemaNotSentHint(tool, toolUseContext.messages, toolUseContext.options.tools);
|
|
@@ -347717,7 +347918,7 @@ async function checkPermissionsAndCallTool(tool, toolUseID, input, toolUseContex
|
|
|
347717
347918
|
processedInput = resolved.input;
|
|
347718
347919
|
const permissionDurationMs = Date.now() - permissionStart;
|
|
347719
347920
|
if (permissionDurationMs >= SLOW_PHASE_LOG_THRESHOLD_MS && permissionMode === "auto") {
|
|
347720
|
-
logForDebugging(`Slow permission decision: ${permissionDurationMs}ms for ${tool.name}
|
|
347921
|
+
logForDebugging(`Slow permission decision: ${permissionDurationMs}ms for ${tool.name} (mode=${permissionMode}, behavior=${permissionDecision.behavior})`, { level: "info" });
|
|
347721
347922
|
}
|
|
347722
347923
|
if (permissionDecision.behavior !== "ask" && !toolUseContext.toolDecisions?.has(toolUseID)) {
|
|
347723
347924
|
const decision = permissionDecision.behavior === "allow" ? "accept" : "reject";
|
|
@@ -348225,6 +348426,7 @@ var init_toolExecution = __esm(() => {
|
|
|
348225
348426
|
init_toolErrors();
|
|
348226
348427
|
init_toolResultStorage();
|
|
348227
348428
|
init_toolSearch();
|
|
348429
|
+
init_taskListGate();
|
|
348228
348430
|
init_client5();
|
|
348229
348431
|
init_mcpStringUtils();
|
|
348230
348432
|
init_utils3();
|
|
@@ -350334,6 +350536,10 @@ async function* queryLoop(params, consumedCommandUuids) {
|
|
|
350334
350536
|
}
|
|
350335
350537
|
const pendingCacheEdits2 = undefined;
|
|
350336
350538
|
queryCheckpoint("query_microcompact_end");
|
|
350539
|
+
const providerNotice = consumePendingProviderNotice();
|
|
350540
|
+
if (providerNotice) {
|
|
350541
|
+
yield createSystemMessage(providerNotice, "warning");
|
|
350542
|
+
}
|
|
350337
350543
|
if (false) {}
|
|
350338
350544
|
const fullSystemPrompt = asSystemPrompt(appendSystemContext(systemPrompt, systemContext));
|
|
350339
350545
|
queryCheckpoint("query_autocompact_start");
|
|
@@ -351095,6 +351301,7 @@ var init_query = __esm(() => {
|
|
|
351095
351301
|
init_log2();
|
|
351096
351302
|
init_errors6();
|
|
351097
351303
|
init_debug();
|
|
351304
|
+
init_ollama();
|
|
351098
351305
|
init_messages();
|
|
351099
351306
|
init_toolUseSummaryGenerator();
|
|
351100
351307
|
init_api3();
|
|
@@ -375361,7 +375568,7 @@ function Feedback({
|
|
|
375361
375568
|
platform: env2.platform,
|
|
375362
375569
|
gitRepo: envInfo.isGit,
|
|
375363
375570
|
terminal: env2.terminal,
|
|
375364
|
-
version: "1.65.
|
|
375571
|
+
version: "1.65.2",
|
|
375365
375572
|
transcript: normalizeMessagesForAPI(messages),
|
|
375366
375573
|
errors: sanitizedErrors,
|
|
375367
375574
|
lastApiRequest: getLastAPIRequest(),
|
|
@@ -375553,7 +375760,7 @@ function Feedback({
|
|
|
375553
375760
|
", ",
|
|
375554
375761
|
env2.terminal,
|
|
375555
375762
|
", v",
|
|
375556
|
-
"1.65.
|
|
375763
|
+
"1.65.2"
|
|
375557
375764
|
]
|
|
375558
375765
|
}, undefined, true, undefined, this)
|
|
375559
375766
|
]
|
|
@@ -375659,7 +375866,7 @@ ${sanitizedDescription}
|
|
|
375659
375866
|
` + `**Environment Info**
|
|
375660
375867
|
` + `- Platform: ${env2.platform}
|
|
375661
375868
|
` + `- Terminal: ${env2.terminal}
|
|
375662
|
-
` + `- Version: ${"1.65.
|
|
375869
|
+
` + `- Version: ${"1.65.2"}
|
|
375663
375870
|
` + `- Feedback ID: ${feedbackId}
|
|
375664
375871
|
` + `
|
|
375665
375872
|
**Errors**
|
|
@@ -378769,7 +378976,7 @@ function buildPrimarySection() {
|
|
|
378769
378976
|
}, undefined, false, undefined, this);
|
|
378770
378977
|
return [{
|
|
378771
378978
|
label: "Version",
|
|
378772
|
-
value: "1.65.
|
|
378979
|
+
value: "1.65.2"
|
|
378773
378980
|
}, {
|
|
378774
378981
|
label: "Session name",
|
|
378775
378982
|
value: nameValue
|
|
@@ -382099,7 +382306,7 @@ function Config({
|
|
|
382099
382306
|
}
|
|
382100
382307
|
}, undefined, false, undefined, this)
|
|
382101
382308
|
}, undefined, false, undefined, this) : showSubmenu === "ChannelDowngrade" ? /* @__PURE__ */ jsx_dev_runtime179.jsxDEV(ChannelDowngradeDialog, {
|
|
382102
|
-
currentVersion: "1.65.
|
|
382309
|
+
currentVersion: "1.65.2",
|
|
382103
382310
|
onChoice: (choice) => {
|
|
382104
382311
|
setShowSubmenu(null);
|
|
382105
382312
|
setTabsHidden(false);
|
|
@@ -382111,7 +382318,7 @@ function Config({
|
|
|
382111
382318
|
autoUpdatesChannel: "stable"
|
|
382112
382319
|
};
|
|
382113
382320
|
if (choice === "stay") {
|
|
382114
|
-
newSettings.minimumVersion = "1.65.
|
|
382321
|
+
newSettings.minimumVersion = "1.65.2";
|
|
382115
382322
|
}
|
|
382116
382323
|
updateSettingsForSource("userSettings", newSettings);
|
|
382117
382324
|
setSettingsData((prev_27) => ({
|
|
@@ -390175,7 +390382,7 @@ function HelpV2(t0) {
|
|
|
390175
390382
|
let t6;
|
|
390176
390383
|
if ($2[31] !== tabs) {
|
|
390177
390384
|
t6 = /* @__PURE__ */ jsx_dev_runtime206.jsxDEV(Tabs, {
|
|
390178
|
-
title: `UR v${"1.65.
|
|
390385
|
+
title: `UR v${"1.65.2"}`,
|
|
390179
390386
|
color: "professionalBlue",
|
|
390180
390387
|
defaultTab: "general",
|
|
390181
390388
|
children: tabs
|
|
@@ -391092,7 +391299,7 @@ function buildToolUseContext(tools, readFileStateCache, toolPermissionContext, a
|
|
|
391092
391299
|
async function handleInitialize(options2) {
|
|
391093
391300
|
return {
|
|
391094
391301
|
name: "UR",
|
|
391095
|
-
version: "1.65.
|
|
391302
|
+
version: "1.65.2",
|
|
391096
391303
|
protocolVersion: "0.1.0",
|
|
391097
391304
|
workspaceRoot: options2.cwd,
|
|
391098
391305
|
capabilities: {
|
|
@@ -408200,7 +408407,7 @@ function getAllReleaseNotes(changelogContent = getStoredChangelogFromMemory()) {
|
|
|
408200
408407
|
return [];
|
|
408201
408408
|
}
|
|
408202
408409
|
}
|
|
408203
|
-
async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.65.
|
|
408410
|
+
async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.65.2") {
|
|
408204
408411
|
if (process.env.USER_TYPE === "ant") {
|
|
408205
408412
|
const changelog = "";
|
|
408206
408413
|
if (changelog) {
|
|
@@ -408227,7 +408434,7 @@ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.65.0")
|
|
|
408227
408434
|
releaseNotes
|
|
408228
408435
|
};
|
|
408229
408436
|
}
|
|
408230
|
-
function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.65.
|
|
408437
|
+
function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.65.2") {
|
|
408231
408438
|
if (process.env.USER_TYPE === "ant") {
|
|
408232
408439
|
const changelog = "";
|
|
408233
408440
|
if (changelog) {
|
|
@@ -411084,7 +411291,7 @@ function getRecentActivitySync() {
|
|
|
411084
411291
|
return cachedActivity;
|
|
411085
411292
|
}
|
|
411086
411293
|
function getLogoDisplayData() {
|
|
411087
|
-
const version2 = process.env.DEMO_VERSION ?? "1.65.
|
|
411294
|
+
const version2 = process.env.DEMO_VERSION ?? "1.65.2";
|
|
411088
411295
|
const serverUrl = getDirectConnectServerUrl();
|
|
411089
411296
|
const displayPath = process.env.DEMO_VERSION ? "/code/ur" : getDisplayPath(getCwd());
|
|
411090
411297
|
const cwd2 = serverUrl ? `${displayPath} in ${serverUrl.replace(/^https?:\/\//, "")}` : displayPath;
|
|
@@ -411968,7 +412175,7 @@ function LogoV2() {
|
|
|
411968
412175
|
if ($2[2] === Symbol.for("react.memo_cache_sentinel")) {
|
|
411969
412176
|
t2 = () => {
|
|
411970
412177
|
const currentConfig2 = getGlobalConfig();
|
|
411971
|
-
if (currentConfig2.lastReleaseNotesSeen === "1.65.
|
|
412178
|
+
if (currentConfig2.lastReleaseNotesSeen === "1.65.2") {
|
|
411972
412179
|
return;
|
|
411973
412180
|
}
|
|
411974
412181
|
saveGlobalConfig(_temp327);
|
|
@@ -412653,12 +412860,12 @@ function LogoV2() {
|
|
|
412653
412860
|
return t41;
|
|
412654
412861
|
}
|
|
412655
412862
|
function _temp327(current) {
|
|
412656
|
-
if (current.lastReleaseNotesSeen === "1.65.
|
|
412863
|
+
if (current.lastReleaseNotesSeen === "1.65.2") {
|
|
412657
412864
|
return current;
|
|
412658
412865
|
}
|
|
412659
412866
|
return {
|
|
412660
412867
|
...current,
|
|
412661
|
-
lastReleaseNotesSeen: "1.65.
|
|
412868
|
+
lastReleaseNotesSeen: "1.65.2"
|
|
412662
412869
|
};
|
|
412663
412870
|
}
|
|
412664
412871
|
function _temp241(s_0) {
|
|
@@ -425983,8 +426190,8 @@ var init_BackgroundTasksDialog = __esm(() => {
|
|
|
425983
426190
|
});
|
|
425984
426191
|
|
|
425985
426192
|
// src/commands/tasks/tasks.tsx
|
|
425986
|
-
var
|
|
425987
|
-
__export(
|
|
426193
|
+
var exports_tasks2 = {};
|
|
426194
|
+
__export(exports_tasks2, {
|
|
425988
426195
|
call: () => call41
|
|
425989
426196
|
});
|
|
425990
426197
|
async function call41(onDone, context6) {
|
|
@@ -426007,7 +426214,7 @@ var init_tasks4 = __esm(() => {
|
|
|
426007
426214
|
name: "tasks",
|
|
426008
426215
|
aliases: ["bashes"],
|
|
426009
426216
|
description: "List and manage background tasks",
|
|
426010
|
-
load: () => Promise.resolve().then(() => (init_tasks3(),
|
|
426217
|
+
load: () => Promise.resolve().then(() => (init_tasks3(), exports_tasks2))
|
|
426011
426218
|
};
|
|
426012
426219
|
tasks_default = tasks;
|
|
426013
426220
|
});
|
|
@@ -429456,7 +429663,7 @@ function compileAgenticCiWorkflow(specName = "default", options2 = {}) {
|
|
|
429456
429663
|
if (spec.name !== specName) {
|
|
429457
429664
|
throw new Error("Agentic CI workflow spec name does not match");
|
|
429458
429665
|
}
|
|
429459
|
-
const packageVersion = options2.packageVersion ?? (typeof MACRO !== "undefined" ? "1.65.
|
|
429666
|
+
const packageVersion = options2.packageVersion ?? (typeof MACRO !== "undefined" ? "1.65.2" : "1.65.2");
|
|
429460
429667
|
if (!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(packageVersion)) {
|
|
429461
429668
|
throw new Error("invalid ur-agent package version");
|
|
429462
429669
|
}
|
|
@@ -430449,7 +430656,7 @@ runner; \`ur trigger\` is the inbound parser that decides what to run.
|
|
|
430449
430656
|
path: ".github/workflows/ur.yml",
|
|
430450
430657
|
root: "project",
|
|
430451
430658
|
content: compileAgenticCiWorkflow("default", {
|
|
430452
|
-
packageVersion: typeof MACRO !== "undefined" ? "1.65.
|
|
430659
|
+
packageVersion: typeof MACRO !== "undefined" ? "1.65.2" : "1.65.2"
|
|
430453
430660
|
})
|
|
430454
430661
|
},
|
|
430455
430662
|
{
|
|
@@ -430512,7 +430719,7 @@ function value(tokens, flag) {
|
|
|
430512
430719
|
return index2 >= 0 ? tokens[index2 + 1] : undefined;
|
|
430513
430720
|
}
|
|
430514
430721
|
function cliVersion() {
|
|
430515
|
-
return typeof MACRO !== "undefined" ? "1.65.
|
|
430722
|
+
return typeof MACRO !== "undefined" ? "1.65.2" : "1.65.2";
|
|
430516
430723
|
}
|
|
430517
430724
|
function workflowPath(cwd2) {
|
|
430518
430725
|
return join159(cwd2, ".github", "workflows", "ur-agentic-ci.yml");
|
|
@@ -436368,7 +436575,7 @@ function createAcpStdioApp(deps) {
|
|
|
436368
436575
|
}
|
|
436369
436576
|
},
|
|
436370
436577
|
authMethods: [],
|
|
436371
|
-
agentInfo: { name: "UR-Nexus", version: "1.65.
|
|
436578
|
+
agentInfo: { name: "UR-Nexus", version: "1.65.2" }
|
|
436372
436579
|
})).onRequest("authenticate", () => ({})).onRequest("session/new", async (context6) => {
|
|
436373
436580
|
const result = runtime2.newSession(context6.params.cwd, context6.params.mcpServers, context6.params.additionalDirectories);
|
|
436374
436581
|
await runtime2.announce({
|
|
@@ -436465,7 +436672,7 @@ function createAcpStdioAgent(deps) {
|
|
|
436465
436672
|
}
|
|
436466
436673
|
},
|
|
436467
436674
|
authMethods: [],
|
|
436468
|
-
agentInfo: { name: "UR-Nexus", version: "1.65.
|
|
436675
|
+
agentInfo: { name: "UR-Nexus", version: "1.65.2" }
|
|
436469
436676
|
});
|
|
436470
436677
|
return;
|
|
436471
436678
|
case "authenticate":
|
|
@@ -437463,9 +437670,9 @@ function automationsDir() {
|
|
|
437463
437670
|
return join162(getCwd(), ".ur", "automations");
|
|
437464
437671
|
}
|
|
437465
437672
|
function automationPath(name) {
|
|
437466
|
-
return join162(automationsDir(), `${
|
|
437673
|
+
return join162(automationsDir(), `${sanitizeName3(name)}.json`);
|
|
437467
437674
|
}
|
|
437468
|
-
function
|
|
437675
|
+
function sanitizeName3(name) {
|
|
437469
437676
|
return name.trim().replace(/[^a-zA-Z0-9_-]/g, "-");
|
|
437470
437677
|
}
|
|
437471
437678
|
function option6(tokens, name) {
|
|
@@ -437726,7 +437933,7 @@ Expected a 5-field cron expression with a next run in the next year.`
|
|
|
437726
437933
|
}
|
|
437727
437934
|
const spec = {
|
|
437728
437935
|
version: 1,
|
|
437729
|
-
name:
|
|
437936
|
+
name: sanitizeName3(name),
|
|
437730
437937
|
schedule,
|
|
437731
437938
|
prompt,
|
|
437732
437939
|
runner: {
|
|
@@ -437749,7 +437956,7 @@ Expected a 5-field cron expression with a next run in the next year.`
|
|
|
437749
437956
|
return { type: "text", value: usage7() };
|
|
437750
437957
|
const path22 = automationPath(name);
|
|
437751
437958
|
if (!existsSync46(path22)) {
|
|
437752
|
-
return { type: "text", value: `Automation not found: ${
|
|
437959
|
+
return { type: "text", value: `Automation not found: ${sanitizeName3(name)}` };
|
|
437753
437960
|
}
|
|
437754
437961
|
const raw = readFileSync47(path22, "utf-8");
|
|
437755
437962
|
const parsed = safeParseJSON(raw, false);
|
|
@@ -437767,7 +437974,7 @@ Expected a 5-field cron expression with a next run in the next year.`
|
|
|
437767
437974
|
return { type: "text", value: usage7() };
|
|
437768
437975
|
const path22 = automationPath(name);
|
|
437769
437976
|
if (!existsSync46(path22)) {
|
|
437770
|
-
return { type: "text", value: `Automation not found: ${
|
|
437977
|
+
return { type: "text", value: `Automation not found: ${sanitizeName3(name)}` };
|
|
437771
437978
|
}
|
|
437772
437979
|
const parsed = safeParseJSON(readFileSync47(path22, "utf-8"), false);
|
|
437773
437980
|
if (!parsed)
|
|
@@ -437784,9 +437991,9 @@ Expected a 5-field cron expression with a next run in the next year.`
|
|
|
437784
437991
|
const nowMs = toMs(option6(tokens, "--now")) ?? Date.now();
|
|
437785
437992
|
const dryRun = hasFlag2(tokens, "--dry-run");
|
|
437786
437993
|
const dueOnly = command5 === "run-due";
|
|
437787
|
-
const specs = command5 === "run" ? listSpecs().filter((spec) => spec.name ===
|
|
437994
|
+
const specs = command5 === "run" ? listSpecs().filter((spec) => spec.name === sanitizeName3(positional[1] ?? "")) : listSpecs();
|
|
437788
437995
|
if (command5 === "run" && specs.length === 0) {
|
|
437789
|
-
return { type: "text", value: `Automation not found: ${
|
|
437996
|
+
return { type: "text", value: `Automation not found: ${sanitizeName3(positional[1] ?? "")}` };
|
|
437790
437997
|
}
|
|
437791
437998
|
const results = await Promise.all(specs.map((spec) => runSpec(spec, { dryRun, dueOnly, nowMs })));
|
|
437792
437999
|
const runnable = results.filter((result) => !result.skipped);
|
|
@@ -437802,10 +438009,10 @@ Expected a 5-field cron expression with a next run in the next year.`
|
|
|
437802
438009
|
return { type: "text", value: usage7() };
|
|
437803
438010
|
const path22 = automationPath(name);
|
|
437804
438011
|
if (!existsSync46(path22)) {
|
|
437805
|
-
return { type: "text", value: `Automation not found: ${
|
|
438012
|
+
return { type: "text", value: `Automation not found: ${sanitizeName3(name)}` };
|
|
437806
438013
|
}
|
|
437807
438014
|
unlinkSync9(path22);
|
|
437808
|
-
return { type: "text", value: `Deleted automation ${
|
|
438015
|
+
return { type: "text", value: `Deleted automation ${sanitizeName3(name)}` };
|
|
437809
438016
|
}
|
|
437810
438017
|
return { type: "text", value: usage7() };
|
|
437811
438018
|
};
|
|
@@ -446321,8 +446528,11 @@ import { spawnSync as spawnSync6 } from "child_process";
|
|
|
446321
446528
|
import { mkdirSync as mkdirSync47, mkdtempSync as mkdtempSync4, rmSync as rmSync14, writeFileSync as writeFileSync47 } from "fs";
|
|
446322
446529
|
import { tmpdir as tmpdir15 } from "os";
|
|
446323
446530
|
import { join as join186 } from "path";
|
|
446531
|
+
function urBinary() {
|
|
446532
|
+
return process.env.UR_BIN ?? process.argv[1] ?? "./bin/ur.js";
|
|
446533
|
+
}
|
|
446324
446534
|
function runCli(args, cwd2) {
|
|
446325
|
-
return spawnSync6(
|
|
446535
|
+
return spawnSync6(process.execPath, [urBinary(), ...args], {
|
|
446326
446536
|
encoding: "utf8",
|
|
446327
446537
|
timeout: 90000,
|
|
446328
446538
|
cwd: cwd2
|
|
@@ -459126,7 +459336,7 @@ var init_code_index2 = __esm(() => {
|
|
|
459126
459336
|
|
|
459127
459337
|
// node_modules/typescript/lib/typescript.js
|
|
459128
459338
|
var require_typescript2 = __commonJS((exports, module) => {
|
|
459129
|
-
var __dirname = "/
|
|
459339
|
+
var __dirname = "/Users/maith/Desktop/ur3-dev/UR-1.65.0/node_modules/typescript/lib", __filename = "/Users/maith/Desktop/ur3-dev/UR-1.65.0/node_modules/typescript/lib/typescript.js";
|
|
459130
459340
|
/*! *****************************************************************************
|
|
459131
459341
|
Copyright (c) Microsoft Corporation. All rights reserved.
|
|
459132
459342
|
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
|
|
@@ -644839,7 +645049,7 @@ async function captureMemoryDiagnostics(trigger2, dumpNumber = 0) {
|
|
|
644839
645049
|
smapsRollup,
|
|
644840
645050
|
platform: process.platform,
|
|
644841
645051
|
nodeVersion: process.version,
|
|
644842
|
-
ccVersion: "1.65.
|
|
645052
|
+
ccVersion: "1.65.2"
|
|
644843
645053
|
};
|
|
644844
645054
|
}
|
|
644845
645055
|
async function performHeapDump(trigger2 = "manual", dumpNumber = 0) {
|
|
@@ -645419,7 +645629,7 @@ var init_bridge_kick = __esm(() => {
|
|
|
645419
645629
|
var call153 = async () => {
|
|
645420
645630
|
return {
|
|
645421
645631
|
type: "text",
|
|
645422
|
-
value: "1.65.
|
|
645632
|
+
value: "1.65.2"
|
|
645423
645633
|
};
|
|
645424
645634
|
}, version2, version_default;
|
|
645425
645635
|
var init_version = __esm(() => {
|
|
@@ -656490,7 +656700,7 @@ function generateHtmlReport(data, insights) {
|
|
|
656490
656700
|
</html>`;
|
|
656491
656701
|
}
|
|
656492
656702
|
function buildExportData(data, insights, facets, remoteStats) {
|
|
656493
|
-
const version3 = typeof MACRO !== "undefined" ? "1.65.
|
|
656703
|
+
const version3 = typeof MACRO !== "undefined" ? "1.65.2" : "unknown";
|
|
656494
656704
|
const remote_hosts_collected = remoteStats?.hosts.filter((h2) => h2.sessionCount > 0).map((h2) => h2.name);
|
|
656495
656705
|
const facets_summary = {
|
|
656496
656706
|
total: facets.size,
|
|
@@ -660801,7 +661011,7 @@ var init_sessionStorage = __esm(() => {
|
|
|
660801
661011
|
init_settings2();
|
|
660802
661012
|
init_slowOperations();
|
|
660803
661013
|
init_uuid();
|
|
660804
|
-
VERSION7 = typeof MACRO !== "undefined" ? "1.65.
|
|
661014
|
+
VERSION7 = typeof MACRO !== "undefined" ? "1.65.2" : "unknown";
|
|
660805
661015
|
MAX_TOMBSTONE_REWRITE_BYTES = 50 * 1024 * 1024;
|
|
660806
661016
|
SKIP_FIRST_PROMPT_PATTERN = /^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/;
|
|
660807
661017
|
EPHEMERAL_PROGRESS_TYPES = new Set([
|
|
@@ -662016,7 +662226,7 @@ var init_filesystem = __esm(() => {
|
|
|
662016
662226
|
});
|
|
662017
662227
|
getBundledSkillsRoot = memoize_default(function getBundledSkillsRoot2() {
|
|
662018
662228
|
const nonce = randomBytes20(16).toString("hex");
|
|
662019
|
-
return join232(getURTempDir(), "bundled-skills", "1.65.
|
|
662229
|
+
return join232(getURTempDir(), "bundled-skills", "1.65.2", nonce);
|
|
662020
662230
|
});
|
|
662021
662231
|
getResolvedWorkingDirPaths = memoize_default(getPathsForPermissionCheck);
|
|
662022
662232
|
});
|
|
@@ -668311,7 +668521,7 @@ function computeFingerprint(messageText2, version3) {
|
|
|
668311
668521
|
}
|
|
668312
668522
|
function computeFingerprintFromMessages(messages) {
|
|
668313
668523
|
const firstMessageText = extractFirstMessageText(messages);
|
|
668314
|
-
return computeFingerprint(firstMessageText, "1.65.
|
|
668524
|
+
return computeFingerprint(firstMessageText, "1.65.2");
|
|
668315
668525
|
}
|
|
668316
668526
|
var FINGERPRINT_SALT = "59cf53e54c78";
|
|
668317
668527
|
var init_fingerprint = () => {};
|
|
@@ -670207,7 +670417,7 @@ async function sideQuery(opts) {
|
|
|
670207
670417
|
betas.push(STRUCTURED_OUTPUTS_BETA_HEADER);
|
|
670208
670418
|
}
|
|
670209
670419
|
const messageText2 = extractFirstUserMessageText(messages);
|
|
670210
|
-
const fingerprint2 = computeFingerprint(messageText2, "1.65.
|
|
670420
|
+
const fingerprint2 = computeFingerprint(messageText2, "1.65.2");
|
|
670211
670421
|
const attributionHeader = getAttributionHeader(fingerprint2);
|
|
670212
670422
|
const systemBlocks = [
|
|
670213
670423
|
attributionHeader ? { type: "text", text: attributionHeader } : null,
|
|
@@ -674978,7 +675188,7 @@ function buildSystemInitMessage(inputs) {
|
|
|
674978
675188
|
slash_commands: inputs.commands.filter((c4) => c4.userInvocable !== false).map((c4) => c4.name),
|
|
674979
675189
|
apiKeySource: getURHQApiKeyWithSource().source,
|
|
674980
675190
|
betas: getSdkBetas(),
|
|
674981
|
-
ur_version: "1.65.
|
|
675191
|
+
ur_version: "1.65.2",
|
|
674982
675192
|
output_style: outputStyle2,
|
|
674983
675193
|
agents: inputs.agents.map((agent2) => agent2.agentType),
|
|
674984
675194
|
skills: inputs.skills.filter((s) => s.userInvocable !== false).map((skill2) => skill2.name),
|
|
@@ -688838,7 +689048,7 @@ var init_useVoiceEnabled = __esm(() => {
|
|
|
688838
689048
|
function getSemverPart(version3) {
|
|
688839
689049
|
return `${import_semver13.major(version3, { loose: true })}.${import_semver13.minor(version3, { loose: true })}.${import_semver13.patch(version3, { loose: true })}`;
|
|
688840
689050
|
}
|
|
688841
|
-
function useUpdateNotification(updatedVersion, initialVersion = "1.65.
|
|
689051
|
+
function useUpdateNotification(updatedVersion, initialVersion = "1.65.2") {
|
|
688842
689052
|
const [lastNotifiedSemver, setLastNotifiedSemver] = import_react222.useState(() => getSemverPart(initialVersion));
|
|
688843
689053
|
if (!updatedVersion) {
|
|
688844
689054
|
return null;
|
|
@@ -688887,7 +689097,7 @@ function AutoUpdater({
|
|
|
688887
689097
|
return;
|
|
688888
689098
|
}
|
|
688889
689099
|
if (false) {}
|
|
688890
|
-
const currentVersion = "1.65.
|
|
689100
|
+
const currentVersion = "1.65.2";
|
|
688891
689101
|
const channel = getInitialSettings()?.autoUpdatesChannel ?? "latest";
|
|
688892
689102
|
let latestVersion = await getLatestVersion(channel);
|
|
688893
689103
|
const isDisabled = isAutoUpdaterDisabled();
|
|
@@ -689116,12 +689326,12 @@ function NativeAutoUpdater({
|
|
|
689116
689326
|
logEvent("tengu_native_auto_updater_start", {});
|
|
689117
689327
|
try {
|
|
689118
689328
|
const maxVersion = await getMaxVersion();
|
|
689119
|
-
if (maxVersion && gt("1.65.
|
|
689329
|
+
if (maxVersion && gt("1.65.2", maxVersion)) {
|
|
689120
689330
|
const msg = await getMaxVersionMessage();
|
|
689121
689331
|
setMaxVersionIssue(msg ?? "affects your version");
|
|
689122
689332
|
}
|
|
689123
689333
|
const result = await installLatest(channel);
|
|
689124
|
-
const currentVersion = "1.65.
|
|
689334
|
+
const currentVersion = "1.65.2";
|
|
689125
689335
|
const latencyMs = Date.now() - startTime;
|
|
689126
689336
|
if (result.lockFailed) {
|
|
689127
689337
|
logEvent("tengu_native_auto_updater_lock_contention", {
|
|
@@ -689258,17 +689468,17 @@ function PackageManagerAutoUpdater(t0) {
|
|
|
689258
689468
|
const maxVersion = await getMaxVersion();
|
|
689259
689469
|
if (maxVersion && latest && gt(latest, maxVersion)) {
|
|
689260
689470
|
logForDebugging(`PackageManagerAutoUpdater: maxVersion ${maxVersion} is set, capping update from ${latest} to ${maxVersion}`);
|
|
689261
|
-
if (gte("1.65.
|
|
689262
|
-
logForDebugging(`PackageManagerAutoUpdater: current version ${"1.65.
|
|
689471
|
+
if (gte("1.65.2", maxVersion)) {
|
|
689472
|
+
logForDebugging(`PackageManagerAutoUpdater: current version ${"1.65.2"} is already at or above maxVersion ${maxVersion}, skipping update`);
|
|
689263
689473
|
setUpdateAvailable(false);
|
|
689264
689474
|
return;
|
|
689265
689475
|
}
|
|
689266
689476
|
latest = maxVersion;
|
|
689267
689477
|
}
|
|
689268
|
-
const hasUpdate = latest && !gte("1.65.
|
|
689478
|
+
const hasUpdate = latest && !gte("1.65.2", latest) && !shouldSkipVersion(latest);
|
|
689269
689479
|
setUpdateAvailable(!!hasUpdate);
|
|
689270
689480
|
if (hasUpdate) {
|
|
689271
|
-
logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.65.
|
|
689481
|
+
logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.65.2"} -> ${latest}`);
|
|
689272
689482
|
}
|
|
689273
689483
|
};
|
|
689274
689484
|
$2[0] = t1;
|
|
@@ -689302,7 +689512,7 @@ function PackageManagerAutoUpdater(t0) {
|
|
|
689302
689512
|
wrap: "truncate",
|
|
689303
689513
|
children: [
|
|
689304
689514
|
"currentVersion: ",
|
|
689305
|
-
"1.65.
|
|
689515
|
+
"1.65.2"
|
|
689306
689516
|
]
|
|
689307
689517
|
}, undefined, true, undefined, this);
|
|
689308
689518
|
$2[3] = verbose;
|
|
@@ -699999,7 +700209,7 @@ function buildStatusLineCommandInput(permissionMode, exceeds200kTokens, settings
|
|
|
699999
700209
|
project_dir: getOriginalCwd(),
|
|
700000
700210
|
added_dirs: addedDirs
|
|
700001
700211
|
},
|
|
700002
|
-
version: "1.65.
|
|
700212
|
+
version: "1.65.2",
|
|
700003
700213
|
output_style: {
|
|
700004
700214
|
name: outputStyleName
|
|
700005
700215
|
},
|
|
@@ -700082,7 +700292,7 @@ function StatusLineInner({
|
|
|
700082
700292
|
const taskValues = Object.values(tasks2);
|
|
700083
700293
|
const taskRunningCount = taskValues.filter((task2) => task2.status === "running" || task2.status === "pending").length;
|
|
700084
700294
|
const defaultStatusLineText = buildDefaultStatusBar({
|
|
700085
|
-
version: "1.65.
|
|
700295
|
+
version: "1.65.2",
|
|
700086
700296
|
providerLabel: providerRuntime.providerLabel,
|
|
700087
700297
|
authMode: providerRuntime.authLabel,
|
|
700088
700298
|
model: providerRuntime.model ?? renderModelName(mainLoopModel),
|
|
@@ -712225,7 +712435,7 @@ async function submitTranscriptShare(messages, trigger2, appearanceId) {
|
|
|
712225
712435
|
} catch {}
|
|
712226
712436
|
const data = {
|
|
712227
712437
|
trigger: trigger2,
|
|
712228
|
-
version: "1.65.
|
|
712438
|
+
version: "1.65.2",
|
|
712229
712439
|
platform: process.platform,
|
|
712230
712440
|
transcript,
|
|
712231
712441
|
subagentTranscripts: Object.keys(subagentTranscripts).length > 0 ? subagentTranscripts : undefined,
|
|
@@ -724505,7 +724715,7 @@ function WelcomeV2() {
|
|
|
724505
724715
|
dimColor: true,
|
|
724506
724716
|
children: [
|
|
724507
724717
|
"v",
|
|
724508
|
-
"1.65.
|
|
724718
|
+
"1.65.2"
|
|
724509
724719
|
]
|
|
724510
724720
|
}, undefined, true, undefined, this)
|
|
724511
724721
|
]
|
|
@@ -725765,7 +725975,7 @@ function completeOnboarding() {
|
|
|
725765
725975
|
saveGlobalConfig((current) => ({
|
|
725766
725976
|
...current,
|
|
725767
725977
|
hasCompletedOnboarding: true,
|
|
725768
|
-
lastOnboardingVersion: "1.65.
|
|
725978
|
+
lastOnboardingVersion: "1.65.2"
|
|
725769
725979
|
}));
|
|
725770
725980
|
}
|
|
725771
725981
|
function showDialog(root2, renderer) {
|
|
@@ -730809,7 +731019,7 @@ function appendToLog(path24, message) {
|
|
|
730809
731019
|
cwd: getFsImplementation().cwd(),
|
|
730810
731020
|
userType: process.env.USER_TYPE,
|
|
730811
731021
|
sessionId: getSessionId(),
|
|
730812
|
-
version: "1.65.
|
|
731022
|
+
version: "1.65.2"
|
|
730813
731023
|
};
|
|
730814
731024
|
getLogWriter(path24).write(messageWithTimestamp);
|
|
730815
731025
|
}
|
|
@@ -734968,8 +735178,8 @@ async function getEnvLessBridgeConfig() {
|
|
|
734968
735178
|
}
|
|
734969
735179
|
async function checkEnvLessBridgeMinVersion() {
|
|
734970
735180
|
const cfg = await getEnvLessBridgeConfig();
|
|
734971
|
-
if (cfg.min_version && lt("1.65.
|
|
734972
|
-
return `Your version of UR (${"1.65.
|
|
735181
|
+
if (cfg.min_version && lt("1.65.2", cfg.min_version)) {
|
|
735182
|
+
return `Your version of UR (${"1.65.2"}) is too old for Remote Control.
|
|
734973
735183
|
Version ${cfg.min_version} or higher is required. Run \`ur update\` to update.`;
|
|
734974
735184
|
}
|
|
734975
735185
|
return null;
|
|
@@ -735443,7 +735653,7 @@ async function initBridgeCore(params) {
|
|
|
735443
735653
|
const rawApi = createBridgeApiClient({
|
|
735444
735654
|
baseUrl,
|
|
735445
735655
|
getAccessToken,
|
|
735446
|
-
runnerVersion: "1.65.
|
|
735656
|
+
runnerVersion: "1.65.2",
|
|
735447
735657
|
onDebug: logForDebugging,
|
|
735448
735658
|
onAuth401,
|
|
735449
735659
|
getTrustedDeviceToken
|
|
@@ -744916,7 +745126,7 @@ function getAgUiCapabilities() {
|
|
|
744916
745126
|
name: "UR-Nexus",
|
|
744917
745127
|
type: "ur-nexus",
|
|
744918
745128
|
description: "Provider-flexible, local-first autonomous engineering workflow agent.",
|
|
744919
|
-
version: "1.65.
|
|
745129
|
+
version: "1.65.2",
|
|
744920
745130
|
provider: "UR",
|
|
744921
745131
|
documentationUrl: "https://github.com/Maitham16/UR/blob/master/docs/AG_UI.md"
|
|
744922
745132
|
},
|
|
@@ -746056,7 +746266,7 @@ function createMCPServer(cwd4, debug2, verbose) {
|
|
|
746056
746266
|
};
|
|
746057
746267
|
const server2 = new Server({
|
|
746058
746268
|
name: "ur-nexus",
|
|
746059
|
-
version: "1.65.
|
|
746269
|
+
version: "1.65.2"
|
|
746060
746270
|
}, {
|
|
746061
746271
|
capabilities: {
|
|
746062
746272
|
tools: {}
|
|
@@ -747214,7 +747424,7 @@ function thrownResponse(error40) {
|
|
|
747214
747424
|
}
|
|
747215
747425
|
async function createUrMcp2026Runtime(options4) {
|
|
747216
747426
|
const server2 = createMCPServer(options4.cwd, options4.debug === true, options4.verbose === true);
|
|
747217
|
-
const client2 = new Client({ name: "ur-mcp-2026-adapter", version: "1.65.
|
|
747427
|
+
const client2 = new Client({ name: "ur-mcp-2026-adapter", version: "1.65.2" }, { capabilities: {} });
|
|
747218
747428
|
const [clientTransport, serverTransport] = createLinkedTransportPair();
|
|
747219
747429
|
try {
|
|
747220
747430
|
await server2.connect(serverTransport);
|
|
@@ -747225,7 +747435,7 @@ async function createUrMcp2026Runtime(options4) {
|
|
|
747225
747435
|
}
|
|
747226
747436
|
const runtime2 = new Mcp2026Runtime({
|
|
747227
747437
|
cwd: options4.cwd,
|
|
747228
|
-
version: "1.65.
|
|
747438
|
+
version: "1.65.2",
|
|
747229
747439
|
backend: {
|
|
747230
747440
|
listTools: async () => {
|
|
747231
747441
|
const listed = await client2.listTools();
|
|
@@ -749358,7 +749568,7 @@ async function update() {
|
|
|
749358
749568
|
logEvent("tengu_update_check", {});
|
|
749359
749569
|
const diagnostic2 = await getDoctorDiagnostic();
|
|
749360
749570
|
const result = await checkUpgradeStatus({
|
|
749361
|
-
currentVersion: "1.65.
|
|
749571
|
+
currentVersion: "1.65.2",
|
|
749362
749572
|
packageName: UR_AGENT_PACKAGE_NAME,
|
|
749363
749573
|
installationType: diagnostic2.installationType,
|
|
749364
749574
|
latestVersion: () => getLatestNpmPackageVersion(UR_AGENT_PACKAGE_NAME)
|
|
@@ -750674,7 +750884,7 @@ ${customInstructions}` : customInstructions;
|
|
|
750674
750884
|
}
|
|
750675
750885
|
}
|
|
750676
750886
|
logForDiagnosticsNoPII("info", "started", {
|
|
750677
|
-
version: "1.65.
|
|
750887
|
+
version: "1.65.2",
|
|
750678
750888
|
is_native_binary: isInBundledMode()
|
|
750679
750889
|
});
|
|
750680
750890
|
registerCleanup(async () => {
|
|
@@ -751460,7 +751670,7 @@ Usage: ur --remote "your task description"`, () => gracefulShutdown(1));
|
|
|
751460
751670
|
pendingHookMessages
|
|
751461
751671
|
}, renderAndRun);
|
|
751462
751672
|
}
|
|
751463
|
-
}).version("1.65.
|
|
751673
|
+
}).version("1.65.2 (UR-Nexus)", "-v, --version", "Output the version number");
|
|
751464
751674
|
program2.option("-w, --worktree [name]", "Create a new git worktree for this session (optionally specify a name)");
|
|
751465
751675
|
program2.option("--tmux", "Create a tmux session for the worktree (requires --worktree). Uses iTerm2 native panes when available; use --tmux=classic for traditional tmux.");
|
|
751466
751676
|
if (canUserConfigureAdvisor()) {
|
|
@@ -752512,7 +752722,7 @@ if (false) {}
|
|
|
752512
752722
|
async function main2() {
|
|
752513
752723
|
const args = process.argv.slice(2);
|
|
752514
752724
|
if (args.length === 1 && (args[0] === "--version" || args[0] === "-v" || args[0] === "-V")) {
|
|
752515
|
-
console.log(`${"1.65.
|
|
752725
|
+
console.log(`${"1.65.2"} (UR-Nexus)`);
|
|
752516
752726
|
return;
|
|
752517
752727
|
}
|
|
752518
752728
|
if (args[0] === "a2a" && args[1] === "serve" && !args.includes("--help") && !args.includes("-h")) {
|
package/documentation/index.html
CHANGED
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
<main id="content" class="content">
|
|
46
46
|
<header class="topbar">
|
|
47
47
|
<div>
|
|
48
|
-
<p class="eyebrow">Version 1.65.
|
|
48
|
+
<p class="eyebrow">Version 1.65.2</p>
|
|
49
49
|
<h1>UR-Nexus Documentation</h1>
|
|
50
50
|
<p class="lead">A practical, tutorial-style reference for installing, configuring, automating, extending, and operating UR-Nexus.</p>
|
|
51
51
|
</div>
|
|
@@ -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.65.
|
|
5
|
+
"version": "1.65.2",
|
|
6
6
|
"publisher": "ur-nexus",
|
|
7
7
|
"engines": {
|
|
8
8
|
"vscode": "^1.92.0"
|
package/package.json
CHANGED