ur-agent 1.80.2 → 1.80.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 +16 -0
- package/README.md +7 -0
- package/dist/cli.js +173 -99
- package/docs/AGENT_FEATURES.md +6 -0
- package/docs/CONFIGURATION.md +25 -0
- package/docs/USAGE.md +27 -0
- package/docs/VALIDATION.md +1 -1
- package/documentation/index.html +1 -1
- package/extensions/jetbrains-ur/build.gradle.kts +1 -1
- package/extensions/vscode-ur-inline-diffs/package.json +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.80.3
|
|
4
|
+
|
|
5
|
+
- Restored visible task planning with a strict-hybrid default. Atomic,
|
|
6
|
+
low-risk requests still execute directly; requests with multiple outcomes,
|
|
7
|
+
sequencing, plan mode, delegation, project-sized work, or release/security/
|
|
8
|
+
migration/production risk must create an actionable task before the first
|
|
9
|
+
mutation. Read-only investigation remains unrestricted.
|
|
10
|
+
- The task gate now uses deterministic user-turn classification instead of
|
|
11
|
+
treating conversation length as complexity. It fails closed when task state
|
|
12
|
+
is unreadable, rechecks permission-rewritten tool input, preserves active
|
|
13
|
+
interrupted boards, and never deadlocks a custom tool profile that omits
|
|
14
|
+
`TaskCreate`.
|
|
15
|
+
- Operators can keep task tracking advisory with
|
|
16
|
+
`tasks.requireBeforeChanges.enabled=false`, or set `freeReads=0` to require a
|
|
17
|
+
task before every mutation. Approve All remains unchanged.
|
|
18
|
+
|
|
3
19
|
## 1.80.2
|
|
4
20
|
|
|
5
21
|
- Repaired repeated `AskUserQuestion` validation loops when a model emits one
|
package/README.md
CHANGED
|
@@ -81,6 +81,13 @@ useful. Each task records id, order, title, description, status, dependencies,
|
|
|
81
81
|
assigned logical agent role, input, expected output, verification criteria, file
|
|
82
82
|
targets, risk level, and whether approval is required.
|
|
83
83
|
|
|
84
|
+
Inside the interactive agent, task tracking uses a strict-hybrid default:
|
|
85
|
+
atomic low-risk work stays direct, while multi-outcome, sequenced, planned,
|
|
86
|
+
delegated, project-sized, and high-risk lifecycle work must create a visible
|
|
87
|
+
task before the first mutation. Reads stay unrestricted. Configure the gate
|
|
88
|
+
with `tasks.requireBeforeChanges`; `enabled=false` makes it advisory and
|
|
89
|
+
`freeReads=0` requires a task before every mutation.
|
|
90
|
+
|
|
84
91
|
During real `ur exec` runs the task board streams when a task status changes,
|
|
85
92
|
then appears again in the final report. Quiet/non-interactive runs can suppress
|
|
86
93
|
streaming while preserving the final board. Public status labels are
|
package/dist/cli.js
CHANGED
|
@@ -107784,7 +107784,7 @@ var init_auth = __esm(() => {
|
|
|
107784
107784
|
|
|
107785
107785
|
// src/utils/userAgent.ts
|
|
107786
107786
|
function getURCodeUserAgent() {
|
|
107787
|
-
return `ur/${"1.80.
|
|
107787
|
+
return `ur/${"1.80.3"}`;
|
|
107788
107788
|
}
|
|
107789
107789
|
|
|
107790
107790
|
// src/utils/workloadContext.ts
|
|
@@ -107806,7 +107806,7 @@ function getUserAgent() {
|
|
|
107806
107806
|
const clientApp = process.env.UR_AGENT_SDK_CLIENT_APP ? `, client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}` : "";
|
|
107807
107807
|
const workload = getWorkload();
|
|
107808
107808
|
const workloadSuffix = workload ? `, workload/${workload}` : "";
|
|
107809
|
-
return `ur-cli/${"1.80.
|
|
107809
|
+
return `ur-cli/${"1.80.3"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
|
|
107810
107810
|
}
|
|
107811
107811
|
function getMCPUserAgent() {
|
|
107812
107812
|
const parts = [];
|
|
@@ -107820,7 +107820,7 @@ function getMCPUserAgent() {
|
|
|
107820
107820
|
parts.push(`client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}`);
|
|
107821
107821
|
}
|
|
107822
107822
|
const suffix = parts.length > 0 ? ` (${parts.join(", ")})` : "";
|
|
107823
|
-
return `ur/${"1.80.
|
|
107823
|
+
return `ur/${"1.80.3"}${suffix}`;
|
|
107824
107824
|
}
|
|
107825
107825
|
function getWebFetchUserAgent() {
|
|
107826
107826
|
return `UR-User (${getURCodeUserAgent()})`;
|
|
@@ -107958,7 +107958,7 @@ var init_user = __esm(() => {
|
|
|
107958
107958
|
deviceId,
|
|
107959
107959
|
sessionId: getSessionId(),
|
|
107960
107960
|
email: getEmail(),
|
|
107961
|
-
appVersion: "1.80.
|
|
107961
|
+
appVersion: "1.80.3",
|
|
107962
107962
|
platform: getHostPlatformForAnalytics(),
|
|
107963
107963
|
organizationUuid,
|
|
107964
107964
|
accountUuid,
|
|
@@ -115845,7 +115845,7 @@ var init_metadata = __esm(() => {
|
|
|
115845
115845
|
COMPOUND_OPERATOR_REGEX = /\s*(?:&&|\|\||[;|])\s*/;
|
|
115846
115846
|
WHITESPACE_REGEX = /\s+/;
|
|
115847
115847
|
getVersionBase = memoize_default(() => {
|
|
115848
|
-
const match = "1.80.
|
|
115848
|
+
const match = "1.80.3".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
|
|
115849
115849
|
return match ? match[0] : undefined;
|
|
115850
115850
|
});
|
|
115851
115851
|
buildEnvContext = memoize_default(async () => {
|
|
@@ -115885,7 +115885,7 @@ var init_metadata = __esm(() => {
|
|
|
115885
115885
|
isGithubAction: isEnvTruthy(process.env.GITHUB_ACTIONS),
|
|
115886
115886
|
isURCodeAction: isEnvTruthy(process.env.UR_CODE_ACTION),
|
|
115887
115887
|
isURAiAuth: isURAISubscriber(),
|
|
115888
|
-
version: "1.80.
|
|
115888
|
+
version: "1.80.3",
|
|
115889
115889
|
versionBase: getVersionBase(),
|
|
115890
115890
|
buildTime: "",
|
|
115891
115891
|
deploymentEnvironment: env2.detectDeploymentEnvironment(),
|
|
@@ -116555,7 +116555,7 @@ function initialize1PEventLogging() {
|
|
|
116555
116555
|
const platform2 = getPlatform();
|
|
116556
116556
|
const attributes = {
|
|
116557
116557
|
[import_semantic_conventions4.ATTR_SERVICE_NAME]: "ur",
|
|
116558
|
-
[import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.80.
|
|
116558
|
+
[import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.80.3"
|
|
116559
116559
|
};
|
|
116560
116560
|
if (platform2 === "wsl") {
|
|
116561
116561
|
const wslVersion = getWslVersion();
|
|
@@ -116583,7 +116583,7 @@ function initialize1PEventLogging() {
|
|
|
116583
116583
|
})
|
|
116584
116584
|
]
|
|
116585
116585
|
});
|
|
116586
|
-
firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.80.
|
|
116586
|
+
firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.80.3");
|
|
116587
116587
|
}
|
|
116588
116588
|
async function reinitialize1PEventLoggingIfConfigChanged() {
|
|
116589
116589
|
if (!is1PEventLoggingEnabled() || !firstPartyEventLoggerProvider) {
|
|
@@ -119068,7 +119068,7 @@ var init_types2 = __esm(() => {
|
|
|
119068
119068
|
requireBeforeChanges: exports_external.object({
|
|
119069
119069
|
enabled: exports_external.boolean().optional(),
|
|
119070
119070
|
freeReads: exports_external.number().optional()
|
|
119071
|
-
}).optional().describe("Require a task list before any tool that changes the workspace (Edit, Write, Bash, ...). " + "
|
|
119071
|
+
}).optional().describe("Require a task list before any tool that changes the workspace (Edit, Write, Bash, ...). " + "The default strict-hybrid policy enforces classified multi-step, risky, delegated, and release work " + "while allowing positively classified atomic changes to proceed directly. Reads are never blocked. " + "Set freeReads=0 to require a task before every mutation, or enabled=false to make task tracking advisory.")
|
|
119072
119072
|
}).optional().describe("Task list behaviour."),
|
|
119073
119073
|
context: exports_external.object({
|
|
119074
119074
|
pruneToolResults: exports_external.object({
|
|
@@ -126542,7 +126542,7 @@ function formatAgentTrendReport(report = buildAgentTrendReport()) {
|
|
|
126542
126542
|
function formatA2AAgentCard(options = {}, pretty = true) {
|
|
126543
126543
|
return JSON.stringify(buildA2AAgentCard(options), null, pretty ? 2 : 0);
|
|
126544
126544
|
}
|
|
126545
|
-
var urVersion = "1.80.
|
|
126545
|
+
var urVersion = "1.80.3", researchSnapshotDate = "2026-08-10", coverage, priorityRoadmap;
|
|
126546
126546
|
var init_trends = __esm(() => {
|
|
126547
126547
|
init_a2aCardSignature();
|
|
126548
126548
|
coverage = [
|
|
@@ -129432,7 +129432,7 @@ function getAttributionHeader(fingerprint) {
|
|
|
129432
129432
|
if (!isAttributionHeaderEnabled()) {
|
|
129433
129433
|
return "";
|
|
129434
129434
|
}
|
|
129435
|
-
const version2 = `${"1.80.
|
|
129435
|
+
const version2 = `${"1.80.3"}.${fingerprint}`;
|
|
129436
129436
|
const entrypoint = process.env.UR_CODE_ENTRYPOINT ?? "unknown";
|
|
129437
129437
|
const cch = "";
|
|
129438
129438
|
const workload = getWorkload();
|
|
@@ -184625,7 +184625,7 @@ var init_projectSafety = __esm(() => {
|
|
|
184625
184625
|
function getInstruments() {
|
|
184626
184626
|
if (instruments)
|
|
184627
184627
|
return instruments;
|
|
184628
|
-
const meter = import_api10.metrics.getMeter("ur-agent.gen_ai", "1.80.
|
|
184628
|
+
const meter = import_api10.metrics.getMeter("ur-agent.gen_ai", "1.80.3");
|
|
184629
184629
|
instruments = {
|
|
184630
184630
|
operationDuration: meter.createHistogram("gen_ai.client.operation.duration", {
|
|
184631
184631
|
description: "GenAI operation duration.",
|
|
@@ -184723,7 +184723,7 @@ function genAiAgentAttributes() {
|
|
|
184723
184723
|
"gen_ai.operation.name": GEN_AI_OPERATION_INVOKE_AGENT,
|
|
184724
184724
|
"gen_ai.provider.name": "ur",
|
|
184725
184725
|
"gen_ai.agent.name": "UR-Nexus",
|
|
184726
|
-
"gen_ai.agent.version": "1.80.
|
|
184726
|
+
"gen_ai.agent.version": "1.80.3"
|
|
184727
184727
|
};
|
|
184728
184728
|
}
|
|
184729
184729
|
function genAiWorkflowAttributes(workflowName, workflowRunId) {
|
|
@@ -184744,7 +184744,7 @@ function genAiWorkflowAttributes(workflowName, workflowRunId) {
|
|
|
184744
184744
|
function startGenAiWorkflowSpan(workflowName, workflowRunId) {
|
|
184745
184745
|
const attributes = genAiWorkflowAttributes(workflowName, workflowRunId);
|
|
184746
184746
|
const name = typeof attributes["gen_ai.workflow.name"] === "string" ? `invoke_workflow ${attributes["gen_ai.workflow.name"]}` : GEN_AI_OPERATION_INVOKE_WORKFLOW;
|
|
184747
|
-
return import_api10.trace.getTracer("ur-agent.gen_ai", "1.80.
|
|
184747
|
+
return import_api10.trace.getTracer("ur-agent.gen_ai", "1.80.3").startSpan(name, { kind: import_api10.SpanKind.INTERNAL, attributes });
|
|
184748
184748
|
}
|
|
184749
184749
|
function endGenAiWorkflowSpan(span, options2 = {}) {
|
|
184750
184750
|
try {
|
|
@@ -184782,7 +184782,7 @@ function startGenAiMemorySpan(operation, options2 = {}) {
|
|
|
184782
184782
|
if (options2.recordCount !== undefined && Number.isInteger(options2.recordCount) && options2.recordCount >= 0) {
|
|
184783
184783
|
attributes["gen_ai.memory.record.count"] = options2.recordCount;
|
|
184784
184784
|
}
|
|
184785
|
-
return import_api10.trace.getTracer("ur-agent.gen_ai", "1.80.
|
|
184785
|
+
return import_api10.trace.getTracer("ur-agent.gen_ai", "1.80.3").startSpan(operation, { kind: import_api10.SpanKind.INTERNAL, attributes });
|
|
184786
184786
|
}
|
|
184787
184787
|
function endGenAiMemorySpan(span, options2 = {}) {
|
|
184788
184788
|
try {
|
|
@@ -278497,7 +278497,7 @@ function getTelemetryAttributes() {
|
|
|
278497
278497
|
attributes["session.id"] = sessionId;
|
|
278498
278498
|
}
|
|
278499
278499
|
if (shouldIncludeAttribute("OTEL_METRICS_INCLUDE_VERSION")) {
|
|
278500
|
-
attributes["app.version"] = "1.80.
|
|
278500
|
+
attributes["app.version"] = "1.80.3";
|
|
278501
278501
|
}
|
|
278502
278502
|
const oauthAccount = getOauthAccountInfo();
|
|
278503
278503
|
if (oauthAccount) {
|
|
@@ -319488,7 +319488,7 @@ function getInstallationEnv() {
|
|
|
319488
319488
|
return;
|
|
319489
319489
|
}
|
|
319490
319490
|
function getURCodeVersion() {
|
|
319491
|
-
return "1.80.
|
|
319491
|
+
return "1.80.3";
|
|
319492
319492
|
}
|
|
319493
319493
|
async function getInstalledVSCodeExtensionVersion(command) {
|
|
319494
319494
|
const { stdout } = await execFileNoThrow(command, ["--list-extensions", "--show-versions"], {
|
|
@@ -326858,7 +326858,7 @@ async function setupSdkMcpClients(sdkMcpConfigs, sendMcpMessage) {
|
|
|
326858
326858
|
const client2 = new Client({
|
|
326859
326859
|
name: "ur",
|
|
326860
326860
|
title: "UR",
|
|
326861
|
-
version: "1.80.
|
|
326861
|
+
version: "1.80.3",
|
|
326862
326862
|
description: "UR-Nexus autonomous engineering workflow engine",
|
|
326863
326863
|
websiteUrl: PRODUCT_URL
|
|
326864
326864
|
}, {
|
|
@@ -327219,7 +327219,7 @@ var init_client5 = __esm(() => {
|
|
|
327219
327219
|
const client2 = new Client({
|
|
327220
327220
|
name: "ur",
|
|
327221
327221
|
title: "UR",
|
|
327222
|
-
version: "1.80.
|
|
327222
|
+
version: "1.80.3",
|
|
327223
327223
|
description: "UR-Nexus autonomous engineering workflow engine",
|
|
327224
327224
|
websiteUrl: PRODUCT_URL
|
|
327225
327225
|
}, {
|
|
@@ -339957,7 +339957,7 @@ async function createRuntime() {
|
|
|
339957
339957
|
bootstrapTelemetry();
|
|
339958
339958
|
const resource = defaultResource().merge(detectResources({ detectors: [envDetector] })).merge(resourceFromAttributes({
|
|
339959
339959
|
[import_semantic_conventions7.ATTR_SERVICE_NAME]: "ur-agent",
|
|
339960
|
-
[import_semantic_conventions7.ATTR_SERVICE_VERSION]: "1.80.
|
|
339960
|
+
[import_semantic_conventions7.ATTR_SERVICE_VERSION]: "1.80.3"
|
|
339961
339961
|
}));
|
|
339962
339962
|
const tracerProvider = exporters.traces.length > 0 ? new BasicTracerProvider({
|
|
339963
339963
|
resource,
|
|
@@ -339990,11 +339990,11 @@ async function createRuntime() {
|
|
|
339990
339990
|
setMeterProvider(meterProvider);
|
|
339991
339991
|
setLoggerProvider(loggerProvider);
|
|
339992
339992
|
if (meterProvider) {
|
|
339993
|
-
const meter = meterProvider.getMeter("ur-agent", "1.80.
|
|
339993
|
+
const meter = meterProvider.getMeter("ur-agent", "1.80.3");
|
|
339994
339994
|
setMeter(meter, (name, options2) => meter.createCounter(name, options2));
|
|
339995
339995
|
}
|
|
339996
339996
|
if (loggerProvider) {
|
|
339997
|
-
setEventLogger(loggerProvider.getLogger("ur-agent.events", "1.80.
|
|
339997
|
+
setEventLogger(loggerProvider.getLogger("ur-agent.events", "1.80.3"));
|
|
339998
339998
|
}
|
|
339999
339999
|
if (!cleanupRegistered3) {
|
|
340000
340000
|
cleanupRegistered3 = true;
|
|
@@ -340656,9 +340656,9 @@ async function assertMinVersion() {
|
|
|
340656
340656
|
if (false) {}
|
|
340657
340657
|
try {
|
|
340658
340658
|
const versionConfig = await getDynamicConfig_BLOCKS_ON_INIT("tengu_version_config", { minVersion: "0.0.0" });
|
|
340659
|
-
if (versionConfig.minVersion && lt("1.80.
|
|
340659
|
+
if (versionConfig.minVersion && lt("1.80.3", versionConfig.minVersion)) {
|
|
340660
340660
|
console.error(`
|
|
340661
|
-
It looks like your version of UR (${"1.80.
|
|
340661
|
+
It looks like your version of UR (${"1.80.3"}) needs an update.
|
|
340662
340662
|
A newer version (${versionConfig.minVersion} or higher) is required to continue.
|
|
340663
340663
|
|
|
340664
340664
|
To update, please run:
|
|
@@ -340874,7 +340874,7 @@ async function installGlobalPackage(specificVersion) {
|
|
|
340874
340874
|
logError2(new AutoUpdaterError("Another process is currently installing an update"));
|
|
340875
340875
|
logEvent("tengu_auto_updater_lock_contention", {
|
|
340876
340876
|
pid: process.pid,
|
|
340877
|
-
currentVersion: "1.80.
|
|
340877
|
+
currentVersion: "1.80.3"
|
|
340878
340878
|
});
|
|
340879
340879
|
return "in_progress";
|
|
340880
340880
|
}
|
|
@@ -340883,7 +340883,7 @@ async function installGlobalPackage(specificVersion) {
|
|
|
340883
340883
|
if (!env2.isRunningWithBun() && env2.isNpmFromWindowsPath()) {
|
|
340884
340884
|
logError2(new Error("Windows NPM detected in WSL environment"));
|
|
340885
340885
|
logEvent("tengu_auto_updater_windows_npm_in_wsl", {
|
|
340886
|
-
currentVersion: "1.80.
|
|
340886
|
+
currentVersion: "1.80.3"
|
|
340887
340887
|
});
|
|
340888
340888
|
console.error(`
|
|
340889
340889
|
Error: Windows NPM detected in WSL
|
|
@@ -341418,7 +341418,7 @@ function detectLinuxGlobPatternWarnings() {
|
|
|
341418
341418
|
}
|
|
341419
341419
|
async function getDoctorDiagnostic() {
|
|
341420
341420
|
const installationType = await getCurrentInstallationType();
|
|
341421
|
-
const version2 = typeof MACRO !== "undefined" ? "1.80.
|
|
341421
|
+
const version2 = typeof MACRO !== "undefined" ? "1.80.3" : "unknown";
|
|
341422
341422
|
const installationPath = await getInstallationPath();
|
|
341423
341423
|
const invokedBinary = getInvokedBinary();
|
|
341424
341424
|
const multipleInstallations = await detectMultipleInstallations();
|
|
@@ -342353,8 +342353,8 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
|
|
|
342353
342353
|
const maxVersion = await getMaxVersion();
|
|
342354
342354
|
if (maxVersion && gt(version2, maxVersion)) {
|
|
342355
342355
|
logForDebugging(`Native installer: maxVersion ${maxVersion} is set, capping update from ${version2} to ${maxVersion}`);
|
|
342356
|
-
if (gte("1.80.
|
|
342357
|
-
logForDebugging(`Native installer: current version ${"1.80.
|
|
342356
|
+
if (gte("1.80.3", maxVersion)) {
|
|
342357
|
+
logForDebugging(`Native installer: current version ${"1.80.3"} is already at or above maxVersion ${maxVersion}, skipping update`);
|
|
342358
342358
|
logEvent("tengu_native_update_skipped_max_version", {
|
|
342359
342359
|
latency_ms: Date.now() - startTime,
|
|
342360
342360
|
max_version: maxVersion,
|
|
@@ -342365,7 +342365,7 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
|
|
|
342365
342365
|
version2 = maxVersion;
|
|
342366
342366
|
}
|
|
342367
342367
|
}
|
|
342368
|
-
if (!forceReinstall && version2 === "1.80.
|
|
342368
|
+
if (!forceReinstall && version2 === "1.80.3" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
|
|
342369
342369
|
logForDebugging(`Found ${version2} at ${executablePath}, skipping install`);
|
|
342370
342370
|
logEvent("tengu_native_update_complete", {
|
|
342371
342371
|
latency_ms: Date.now() - startTime,
|
|
@@ -402101,6 +402101,52 @@ function requestsRevisionOfCurrentTaskList(input) {
|
|
|
402101
402101
|
function shouldKeepCurrentTaskList(input) {
|
|
402102
402102
|
return requestsAppendToCurrentTaskList(input) || requestsContinueCurrentTaskList(input) || requestsRevisionOfCurrentTaskList(input);
|
|
402103
402103
|
}
|
|
402104
|
+
function withoutCode(input) {
|
|
402105
|
+
return input.replace(/```[\s\S]*?```/gu, " ").replace(/`[^`\n]*`/gu, " ");
|
|
402106
|
+
}
|
|
402107
|
+
function proseOnly(input) {
|
|
402108
|
+
return withoutCode(input).replace(/\s+/gu, " ").trim();
|
|
402109
|
+
}
|
|
402110
|
+
function taskListRequirementReason(input) {
|
|
402111
|
+
const text2 = proseOnly(input);
|
|
402112
|
+
if (!text2)
|
|
402113
|
+
return;
|
|
402114
|
+
const optsOut = /\b(?:do not|don't)\s+(?:(?:create|make|maintain|show|start|use)\s+)?(?:a\s+)?(?:task|todo)(?:\s+(?:list|board))?\b/iu.test(text2) || /\bwithout\s+(?:(?:creating|making|maintaining|showing|starting|using)\s+)?(?:a\s+)?(?:task|todo)(?:\s+(?:list|board))?\b/iu.test(text2) || /\b(?:skip|no)\s+(?:the\s+|a\s+)?(?:task|todo)(?:\s+(?:list|board))?\b/iu.test(text2);
|
|
402115
|
+
if (optsOut)
|
|
402116
|
+
return;
|
|
402117
|
+
if (/\b(?:create|make|maintain|show|start|use|keep|track|add|append|put|queue)\b[^.!?]{0,100}\b(?:task|todo)\s+(?:list|board)\b/iu.test(text2) || /\b(?:add|append|put|queue)\s+(?:this|it)?\s*(?:to|on)?\s*(?:my|the|your)?\s*(?:tasks?|todos?)\b/iu.test(text2) || /\b(?:add|append|put|queue)\s+(?:this|it)\s+(?:to|on)\s+(?:the\s+|your\s+|my\s+)?(?:current|existing)\s+list\b/iu.test(text2) || /\b(?:create|make|use|track)\s+(?:the\s+|a\s+|your\s+)?(?:tasks?|todos?)\b/iu.test(text2) || /\b(?:tasks?|todos?)\s+first\b/iu.test(text2)) {
|
|
402118
|
+
return "explicit task tracking request";
|
|
402119
|
+
}
|
|
402120
|
+
if (/^\/plan(?:\s|$)/iu.test(text2) || /\b(?:enter|start|use|switch\s+to)\s+plan\s+mode\b/iu.test(text2) || /\bplan\s+(?:this|the\s+work|first)\b/iu.test(text2)) {
|
|
402121
|
+
return "planning workflow";
|
|
402122
|
+
}
|
|
402123
|
+
if (/\b(?:delegate|delegation|sub[ -]?agents?|parallel\s+agents?|agent\s+team|team\s+of\s+agents?|fan[ -]?out)\b/iu.test(text2)) {
|
|
402124
|
+
return "delegation or parallel agent work";
|
|
402125
|
+
}
|
|
402126
|
+
const hasAction = new RegExp(String.raw`\b${ACTION_WORD}\b`, "iu").test(text2);
|
|
402127
|
+
if (hasAction && /\b(?:publish|release|deploy|production|migrat(?:e|ion)|database\s+schema|credentials?|secrets?|permissions?|sandbox|security|authentication|authorization|payments?|billing|version\s+bump|git\s+tag)\b/iu.test(text2)) {
|
|
402128
|
+
return "release, security, migration, or production risk";
|
|
402129
|
+
}
|
|
402130
|
+
const structuralText = withoutCode(input);
|
|
402131
|
+
const enumeratedItems = structuralText.match(/(?:^|\n)\s*(?:[-*+]\s+|\d+[.)]\s+)\S/gu);
|
|
402132
|
+
const actionLines = structuralText.split(/\r?\n/gu).filter((line) => new RegExp(String.raw`\b${ACTION_WORD}\b`, "iu").test(line));
|
|
402133
|
+
if ((enumeratedItems?.length ?? 0) >= 2 || actionLines.length >= 2 || SEQUENCED_ACTION_RE.test(text2)) {
|
|
402134
|
+
return "multiple requested outcomes";
|
|
402135
|
+
}
|
|
402136
|
+
const targetList = new RegExp(String.raw`\b${ACTION_WORD}\b[^.!?]{0,120}\b(?:docs?|tests?|code|implementation|configuration|config|workflow|release notes?|technical docs?|readme|ui|api|cli|database|schema|sandbox|permissions?)\b[^.!?]{0,80}(?:,|\band\b|\bplus\b)[^.!?]{0,80}\b(?:docs?|tests?|code|implementation|configuration|config|workflow|release notes?|technical docs?|readme|ui|api|cli|database|schema|sandbox|permissions?)\b`, "iu");
|
|
402137
|
+
if (targetList.test(text2))
|
|
402138
|
+
return "multiple requested outcomes";
|
|
402139
|
+
const projectScope = /\b(?:app|application|agent|system|platform|website|dashboard|service|integration|workflow|codebase|project|plugin|extension|3d\s+(?:scene|design|pipeline))\b/iu;
|
|
402140
|
+
const projectAction = /\b(?:build(?:ing|s)?|built|creat(?:e|ed|es|ing)|design(?:ed|ing|s)?|implement(?:ed|ing|s)?|integrat(?:e|ed|es|ing)|refactor(?:ed|ing|s)?|rewrit(?:e|ing|ten)|overhaul(?:ed|ing|s)?|audit(?:ed|ing|s)?|research(?:ed|es|ing)?)\b/iu;
|
|
402141
|
+
if (projectScope.test(text2) && projectAction.test(text2)) {
|
|
402142
|
+
return "large project scope";
|
|
402143
|
+
}
|
|
402144
|
+
ACTION_RE.lastIndex = 0;
|
|
402145
|
+
if (text2.length >= 600 && ACTION_RE.test(text2)) {
|
|
402146
|
+
return "detailed multi-step request";
|
|
402147
|
+
}
|
|
402148
|
+
return;
|
|
402149
|
+
}
|
|
402104
402150
|
function getTaskListRunForCommand(command, options2 = {}) {
|
|
402105
402151
|
if (!command || command.mode !== "prompt" || command.isMeta)
|
|
402106
402152
|
return;
|
|
@@ -402108,9 +402154,12 @@ function getTaskListRunForCommand(command, options2 = {}) {
|
|
|
402108
402154
|
if (!options2.allowSlashCommand && !command.skipSlashCommands && text2.trimStart().startsWith("/")) {
|
|
402109
402155
|
return;
|
|
402110
402156
|
}
|
|
402157
|
+
const requirementReason = taskListRequirementReason(text2);
|
|
402111
402158
|
return {
|
|
402112
402159
|
generationId: String(command.uuid ?? randomUUID40()),
|
|
402113
|
-
appendToCurrent: shouldKeepCurrentTaskList(text2)
|
|
402160
|
+
appendToCurrent: shouldKeepCurrentTaskList(text2),
|
|
402161
|
+
requiresTaskList: requirementReason !== undefined,
|
|
402162
|
+
...requirementReason ? { requirementReason } : {}
|
|
402114
402163
|
};
|
|
402115
402164
|
}
|
|
402116
402165
|
function getTaskListRunFromMessages(messages) {
|
|
@@ -402118,14 +402167,21 @@ function getTaskListRunFromMessages(messages) {
|
|
|
402118
402167
|
if (!message || typeof message.uuid !== "string" || !message.uuid) {
|
|
402119
402168
|
return;
|
|
402120
402169
|
}
|
|
402170
|
+
const text2 = textFromMessage(message);
|
|
402171
|
+
const requirementReason = taskListRequirementReason(text2);
|
|
402121
402172
|
return {
|
|
402122
402173
|
generationId: message.uuid,
|
|
402123
|
-
appendToCurrent: shouldKeepCurrentTaskList(
|
|
402174
|
+
appendToCurrent: shouldKeepCurrentTaskList(text2),
|
|
402175
|
+
requiresTaskList: requirementReason !== undefined,
|
|
402176
|
+
...requirementReason ? { requirementReason } : {}
|
|
402124
402177
|
};
|
|
402125
402178
|
}
|
|
402126
|
-
var taskListRunStorage;
|
|
402179
|
+
var taskListRunStorage, ACTION_WORD, ACTION_RE, SEQUENCED_ACTION_RE;
|
|
402127
402180
|
var init_taskListRunContext = __esm(() => {
|
|
402128
402181
|
taskListRunStorage = new AsyncLocalStorage5;
|
|
402182
|
+
ACTION_WORD = String.raw`(?:add(?:ed|ing|s)?|audit(?:ed|ing|s)?|build(?:ing|s)?|built|bump(?:ed|ing|s)?|chang(?:e|ed|es|ing)|clean(?:ed|ing|s)?|creat(?:e|ed|es|ing)|debug(?:ged|ging|s)?|delet(?:e|ed|es|ing)|deploy(?:ed|ing|s)?|design(?:ed|ing|s)?|document(?:ed|ing|s)?|fix(?:ed|es|ing)?|implement(?:ed|ing|s)?|integrat(?:e|ed|es|ing)|migrat(?:e|ed|es|ing)|publish(?:ed|es|ing)?|push(?:ed|es|ing)?|refactor(?:ed|ing|s)?|releas(?:e|ed|es|ing)|remov(?:e|ed|es|ing)|renam(?:e|ed|es|ing)|repair(?:ed|ing|s)?|research(?:ed|es|ing)?|review(?:ed|ing|s)?|secur(?:e|ed|es|ing)|test(?:ed|ing|s)?|updat(?:e|ed|es|ing)|upgrad(?:e|ed|es|ing)|verif(?:y|ied|ies|ying)|writ(?:e|es|ing)|wrote)`;
|
|
402183
|
+
ACTION_RE = new RegExp(String.raw`\b${ACTION_WORD}\b`, "giu");
|
|
402184
|
+
SEQUENCED_ACTION_RE = new RegExp(String.raw`\b${ACTION_WORD}\b[^.!?\n]{0,180}(?:\band\b|\bthen\b|\balso\b|\bplus\b|;|\n)[^.!?\n]{0,100}\b${ACTION_WORD}\b`, "iu");
|
|
402129
402185
|
});
|
|
402130
402186
|
|
|
402131
402187
|
// src/tools/TaskCreateTool/prompt.ts
|
|
@@ -402141,9 +402197,11 @@ It also helps the user understand the progress of the task and overall progress
|
|
|
402141
402197
|
|
|
402142
402198
|
Use this tool proactively in these scenarios:
|
|
402143
402199
|
|
|
402144
|
-
-
|
|
402200
|
+
- Multi-outcome work - When a request has 2 or more distinct requested outcomes, deliverables, or sequenced actions
|
|
402145
402201
|
- Non-trivial and complex tasks - Tasks that require careful planning or multiple operations${teammateContext}
|
|
402146
402202
|
- Multiple independently verifiable outcomes, dependency ordering, delegation, or parallel work
|
|
402203
|
+
- High-risk lifecycle work - Releases, publishing, deployment, migrations, security, credentials, permissions, sandboxing, or production changes
|
|
402204
|
+
- Project-sized builds, integrations, workflows, refactors, and audits
|
|
402147
402205
|
- Plan mode - When using plan mode, create a task list to track the work
|
|
402148
402206
|
- User explicitly requests todo list - When the user directly asks you to use the todo list
|
|
402149
402207
|
- User asks to queue work - When the user says "add to your tasks", "add this to your task list", "put this on the list", "queue this up", or anything similar, IMMEDIATELY call this tool with that request \u2014 even if you are in the middle of other work and even if the item sounds small. The user is watching the live task panel and expects the item to appear there right away. Acknowledge briefly and continue what you were doing unless asked to switch.
|
|
@@ -402154,7 +402212,7 @@ Use this tool proactively in these scenarios:
|
|
|
402154
402212
|
|
|
402155
402213
|
Skip using this tool when:
|
|
402156
402214
|
- The task is purely conversational or informational
|
|
402157
|
-
- The request is one
|
|
402215
|
+
- The request is one genuinely atomic, low-risk action with one outcome that can be completed and verified directly
|
|
402158
402216
|
- The user sends a short acknowledgement, correction, or clarification that does not add a distinct outcome to an existing board
|
|
402159
402217
|
|
|
402160
402218
|
Do not create a task merely because a user sent a message or because the request is actionable. Task subjects must describe concrete outcomes chosen after understanding the work; never copy the raw prompt into a task title.
|
|
@@ -412385,7 +412443,7 @@ function isAnyTracingEnabled() {
|
|
|
412385
412443
|
return isTelemetryEnabled() || isEnhancedTelemetryEnabled() || isBetaTracingEnabled();
|
|
412386
412444
|
}
|
|
412387
412445
|
function getTracer() {
|
|
412388
|
-
return import_api39.trace.getTracer("ur-agent.gen_ai", "1.80.
|
|
412446
|
+
return import_api39.trace.getTracer("ur-agent.gen_ai", "1.80.3");
|
|
412389
412447
|
}
|
|
412390
412448
|
function createSpanAttributes(spanType, customAttributes = {}) {
|
|
412391
412449
|
const baseAttributes = getTelemetryAttributes();
|
|
@@ -413066,6 +413124,8 @@ function checkTaskListGate(input) {
|
|
|
413066
413124
|
const config3 = input.config ?? getTaskListGateConfig();
|
|
413067
413125
|
if (!config3.enabled)
|
|
413068
413126
|
return { allowed: true };
|
|
413127
|
+
if (input.taskListWriterAvailable === false)
|
|
413128
|
+
return { allowed: true };
|
|
413069
413129
|
if (isTaskListGateExempt(input.toolName))
|
|
413070
413130
|
return { allowed: true };
|
|
413071
413131
|
const isMutating = input.isMutating ?? isMutatingTool2(input.toolName);
|
|
@@ -413074,23 +413134,29 @@ function checkTaskListGate(input) {
|
|
|
413074
413134
|
if (input.taskCount !== null && input.taskCount > 0) {
|
|
413075
413135
|
return { allowed: true };
|
|
413076
413136
|
}
|
|
413137
|
+
const inherentlyRequiresTaskList = input.isSubagent || ALWAYS_REQUIRE_PLAN_TOOLS.has(input.toolName);
|
|
413138
|
+
const classifiedRequirement = input.requiresTaskList === true;
|
|
413139
|
+
const forceEveryMutation = config3.freeReads === 0;
|
|
413140
|
+
const unclassifiedAllowanceExpired = input.requiresTaskList === undefined && input.readsSoFar >= config3.freeReads;
|
|
413141
|
+
const gateRequired = inherentlyRequiresTaskList || classifiedRequirement || forceEveryMutation || unclassifiedAllowanceExpired;
|
|
413142
|
+
const requirementContext = input.requirementReason ? ` This turn requires task tracking because it contains ${input.requirementReason}.` : "";
|
|
413077
413143
|
if (input.taskCount === null) {
|
|
413078
413144
|
return {
|
|
413079
413145
|
allowed: false,
|
|
413080
|
-
reason: `The task list could not be read, so ${input.toolName} was not allowed ` + `to change state without a verifiable plan
|
|
413146
|
+
reason: `The task list could not be read, so ${input.toolName} was not allowed ` + `to change state without a verifiable plan.${requirementContext} Retry TaskList or ` + `TaskCreate, then retry this call. Disable with ` + `tasks.requireBeforeChanges.enabled=false in settings.`
|
|
413081
413147
|
};
|
|
413082
413148
|
}
|
|
413083
|
-
if (
|
|
413149
|
+
if (!gateRequired)
|
|
413150
|
+
return { allowed: true };
|
|
413151
|
+
if (inherentlyRequiresTaskList) {
|
|
413084
413152
|
return {
|
|
413085
413153
|
allowed: false,
|
|
413086
413154
|
reason: `No actionable parent task exists for ${input.toolName}. Call ` + `TaskCreate before delegating or changing state, then retry this call. ` + `Disable with tasks.requireBeforeChanges.enabled=false in settings.`
|
|
413087
413155
|
};
|
|
413088
413156
|
}
|
|
413089
|
-
if (input.readsSoFar < config3.freeReads)
|
|
413090
|
-
return { allowed: true };
|
|
413091
413157
|
return {
|
|
413092
413158
|
allowed: false,
|
|
413093
|
-
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.`
|
|
413159
|
+
reason: `No task list exists, and ${input.toolName} changes the workspace. ` + `${requirementContext.trim()}${requirementContext ? " " : ""}` + `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.`
|
|
413094
413160
|
};
|
|
413095
413161
|
}
|
|
413096
413162
|
var TASK_LIST_GATE_DEFAULTS, KNOWN_MUTATING_TOOLS, GATE_EXEMPT_TOOLS, ALWAYS_REQUIRE_PLAN_TOOLS;
|
|
@@ -413098,7 +413164,7 @@ var init_taskListGate = __esm(() => {
|
|
|
413098
413164
|
init_settings2();
|
|
413099
413165
|
init_tasks();
|
|
413100
413166
|
TASK_LIST_GATE_DEFAULTS = {
|
|
413101
|
-
enabled:
|
|
413167
|
+
enabled: true,
|
|
413102
413168
|
freeReads: 3
|
|
413103
413169
|
};
|
|
413104
413170
|
KNOWN_MUTATING_TOOLS = new Set([
|
|
@@ -414638,12 +414704,16 @@ async function checkPermissionsAndCallTool(tool, toolUseID, input, toolUseContex
|
|
|
414638
414704
|
} catch {
|
|
414639
414705
|
isMutating = true;
|
|
414640
414706
|
}
|
|
414707
|
+
const taskListRun = getTaskListRunContext() ?? (toolUseContext.agentId ? undefined : getTaskListRunFromMessages(toolUseContext.messages ?? []));
|
|
414641
414708
|
const gate = checkTaskListGate({
|
|
414642
414709
|
toolName: tool.name,
|
|
414643
414710
|
taskCount: await countTasksForGate(),
|
|
414644
414711
|
readsSoFar: countToolCallsBeforeCurrent(toolUseContext.messages, assistantMessage, toolUseID),
|
|
414645
414712
|
isSubagent: Boolean(toolUseContext.agentId),
|
|
414646
|
-
isMutating
|
|
414713
|
+
isMutating,
|
|
414714
|
+
requiresTaskList: taskListRun?.requiresTaskList,
|
|
414715
|
+
requirementReason: taskListRun?.requirementReason,
|
|
414716
|
+
taskListWriterAvailable: toolUseContext.options.tools.some((candidate) => candidate.name === "TaskCreate")
|
|
414647
414717
|
});
|
|
414648
414718
|
if (gate.allowed === false) {
|
|
414649
414719
|
recordCallFailure(callSig);
|
|
@@ -415000,7 +415070,10 @@ async function checkPermissionsAndCallTool(tool, toolUseID, input, toolUseContex
|
|
|
415000
415070
|
taskCount: await countTasksForGate(),
|
|
415001
415071
|
readsSoFar: countToolCallsBeforeCurrent(toolUseContext.messages, assistantMessage, toolUseID),
|
|
415002
415072
|
isSubagent: Boolean(toolUseContext.agentId),
|
|
415003
|
-
isMutating: finalIsMutating
|
|
415073
|
+
isMutating: finalIsMutating,
|
|
415074
|
+
requiresTaskList: taskListRun?.requiresTaskList,
|
|
415075
|
+
requirementReason: taskListRun?.requirementReason,
|
|
415076
|
+
taskListWriterAvailable: toolUseContext.options.tools.some((candidate) => candidate.name === "TaskCreate")
|
|
415004
415077
|
});
|
|
415005
415078
|
if (finalGate.allowed === false) {
|
|
415006
415079
|
recordCallFailure(callSig);
|
|
@@ -415438,6 +415511,7 @@ var init_toolExecution = __esm(() => {
|
|
|
415438
415511
|
init_genAiSemantics();
|
|
415439
415512
|
init_toolErrors();
|
|
415440
415513
|
init_toolResultStorage();
|
|
415514
|
+
init_taskListRunContext();
|
|
415441
415515
|
init_toolSearch();
|
|
415442
415516
|
init_taskListGate();
|
|
415443
415517
|
init_repeatedFailureGuard();
|
|
@@ -442817,7 +442891,7 @@ function Feedback({
|
|
|
442817
442891
|
platform: env2.platform,
|
|
442818
442892
|
gitRepo: envInfo.isGit,
|
|
442819
442893
|
terminal: env2.terminal,
|
|
442820
|
-
version: "1.80.
|
|
442894
|
+
version: "1.80.3",
|
|
442821
442895
|
transcript: normalizeMessagesForAPI(messages),
|
|
442822
442896
|
errors: sanitizedErrors,
|
|
442823
442897
|
lastApiRequest: getLastAPIRequest(),
|
|
@@ -443009,7 +443083,7 @@ function Feedback({
|
|
|
443009
443083
|
", ",
|
|
443010
443084
|
env2.terminal,
|
|
443011
443085
|
", v",
|
|
443012
|
-
"1.80.
|
|
443086
|
+
"1.80.3"
|
|
443013
443087
|
]
|
|
443014
443088
|
}, undefined, true, undefined, this)
|
|
443015
443089
|
]
|
|
@@ -443115,7 +443189,7 @@ ${sanitizedDescription}
|
|
|
443115
443189
|
` + `**Environment Info**
|
|
443116
443190
|
` + `- Platform: ${env2.platform}
|
|
443117
443191
|
` + `- Terminal: ${env2.terminal}
|
|
443118
|
-
` + `- Version: ${"1.80.
|
|
443192
|
+
` + `- Version: ${"1.80.3"}
|
|
443119
443193
|
` + `- Feedback ID: ${feedbackId}
|
|
443120
443194
|
` + `
|
|
443121
443195
|
**Errors**
|
|
@@ -446225,7 +446299,7 @@ function buildPrimarySection() {
|
|
|
446225
446299
|
}, undefined, false, undefined, this);
|
|
446226
446300
|
return [{
|
|
446227
446301
|
label: "Version",
|
|
446228
|
-
value: "1.80.
|
|
446302
|
+
value: "1.80.3"
|
|
446229
446303
|
}, {
|
|
446230
446304
|
label: "Session name",
|
|
446231
446305
|
value: nameValue
|
|
@@ -449607,7 +449681,7 @@ function Config({
|
|
|
449607
449681
|
}
|
|
449608
449682
|
}, undefined, false, undefined, this)
|
|
449609
449683
|
}, undefined, false, undefined, this) : showSubmenu === "ChannelDowngrade" ? /* @__PURE__ */ jsx_dev_runtime179.jsxDEV(ChannelDowngradeDialog, {
|
|
449610
|
-
currentVersion: "1.80.
|
|
449684
|
+
currentVersion: "1.80.3",
|
|
449611
449685
|
onChoice: (choice) => {
|
|
449612
449686
|
setShowSubmenu(null);
|
|
449613
449687
|
setTabsHidden(false);
|
|
@@ -449619,7 +449693,7 @@ function Config({
|
|
|
449619
449693
|
autoUpdatesChannel: "stable"
|
|
449620
449694
|
};
|
|
449621
449695
|
if (choice === "stay") {
|
|
449622
|
-
newSettings.minimumVersion = "1.80.
|
|
449696
|
+
newSettings.minimumVersion = "1.80.3";
|
|
449623
449697
|
}
|
|
449624
449698
|
updateSettingsForSource("userSettings", newSettings);
|
|
449625
449699
|
setSettingsData((prev_27) => ({
|
|
@@ -457877,7 +457951,7 @@ function HelpV2(t0) {
|
|
|
457877
457951
|
let t6;
|
|
457878
457952
|
if ($2[31] !== tabs) {
|
|
457879
457953
|
t6 = /* @__PURE__ */ jsx_dev_runtime206.jsxDEV(Tabs, {
|
|
457880
|
-
title: `UR v${"1.80.
|
|
457954
|
+
title: `UR v${"1.80.3"}`,
|
|
457881
457955
|
color: "professionalBlue",
|
|
457882
457956
|
defaultTab: "general",
|
|
457883
457957
|
children: tabs
|
|
@@ -458810,7 +458884,7 @@ function buildToolUseContext(tools, readFileStateCache, toolPermissionContext, a
|
|
|
458810
458884
|
async function handleInitialize(options2) {
|
|
458811
458885
|
return {
|
|
458812
458886
|
name: "UR",
|
|
458813
|
-
version: "1.80.
|
|
458887
|
+
version: "1.80.3",
|
|
458814
458888
|
protocolVersion: "0.1.0",
|
|
458815
458889
|
workspaceRoot: options2.cwd,
|
|
458816
458890
|
capabilities: {
|
|
@@ -475918,7 +475992,7 @@ function getAllReleaseNotes(changelogContent = getStoredChangelogFromMemory()) {
|
|
|
475918
475992
|
return [];
|
|
475919
475993
|
}
|
|
475920
475994
|
}
|
|
475921
|
-
async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.80.
|
|
475995
|
+
async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.80.3") {
|
|
475922
475996
|
if (process.env.USER_TYPE === "ant") {
|
|
475923
475997
|
const changelog = "";
|
|
475924
475998
|
if (changelog) {
|
|
@@ -475945,7 +476019,7 @@ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.80.2")
|
|
|
475945
476019
|
releaseNotes
|
|
475946
476020
|
};
|
|
475947
476021
|
}
|
|
475948
|
-
function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.80.
|
|
476022
|
+
function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.80.3") {
|
|
475949
476023
|
if (process.env.USER_TYPE === "ant") {
|
|
475950
476024
|
const changelog = "";
|
|
475951
476025
|
if (changelog) {
|
|
@@ -478850,7 +478924,7 @@ function getRecentActivitySync() {
|
|
|
478850
478924
|
return cachedActivity;
|
|
478851
478925
|
}
|
|
478852
478926
|
function getLogoDisplayData() {
|
|
478853
|
-
const version2 = process.env.DEMO_VERSION ?? "1.80.
|
|
478927
|
+
const version2 = process.env.DEMO_VERSION ?? "1.80.3";
|
|
478854
478928
|
const serverUrl = getDirectConnectServerUrl();
|
|
478855
478929
|
const displayPath = process.env.DEMO_VERSION ? "/code/ur" : getDisplayPath(getCwd());
|
|
478856
478930
|
const cwd2 = serverUrl ? `${displayPath} in ${serverUrl.replace(/^https?:\/\//, "")}` : displayPath;
|
|
@@ -479718,7 +479792,7 @@ function LogoV2() {
|
|
|
479718
479792
|
if ($2[2] === Symbol.for("react.memo_cache_sentinel")) {
|
|
479719
479793
|
t2 = () => {
|
|
479720
479794
|
const currentConfig = getGlobalConfig();
|
|
479721
|
-
if (currentConfig.lastReleaseNotesSeen === "1.80.
|
|
479795
|
+
if (currentConfig.lastReleaseNotesSeen === "1.80.3") {
|
|
479722
479796
|
return;
|
|
479723
479797
|
}
|
|
479724
479798
|
saveGlobalConfig(_temp325);
|
|
@@ -480403,12 +480477,12 @@ function LogoV2() {
|
|
|
480403
480477
|
return t41;
|
|
480404
480478
|
}
|
|
480405
480479
|
function _temp325(current) {
|
|
480406
|
-
if (current.lastReleaseNotesSeen === "1.80.
|
|
480480
|
+
if (current.lastReleaseNotesSeen === "1.80.3") {
|
|
480407
480481
|
return current;
|
|
480408
480482
|
}
|
|
480409
480483
|
return {
|
|
480410
480484
|
...current,
|
|
480411
|
-
lastReleaseNotesSeen: "1.80.
|
|
480485
|
+
lastReleaseNotesSeen: "1.80.3"
|
|
480412
480486
|
};
|
|
480413
480487
|
}
|
|
480414
480488
|
function _temp241(s_0) {
|
|
@@ -496500,7 +496574,7 @@ function compileAgenticCiWorkflow(specName = "default", options2 = {}) {
|
|
|
496500
496574
|
if (spec.name !== specName) {
|
|
496501
496575
|
throw new Error("Agentic CI workflow spec name does not match");
|
|
496502
496576
|
}
|
|
496503
|
-
const packageVersion = options2.packageVersion ?? (typeof MACRO !== "undefined" ? "1.80.
|
|
496577
|
+
const packageVersion = options2.packageVersion ?? (typeof MACRO !== "undefined" ? "1.80.3" : "1.80.3");
|
|
496504
496578
|
if (!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(packageVersion)) {
|
|
496505
496579
|
throw new Error("invalid ur-agent package version");
|
|
496506
496580
|
}
|
|
@@ -497493,7 +497567,7 @@ runner; \`ur trigger\` is the inbound parser that decides what to run.
|
|
|
497493
497567
|
path: ".github/workflows/ur.yml",
|
|
497494
497568
|
root: "project",
|
|
497495
497569
|
content: compileAgenticCiWorkflow("default", {
|
|
497496
|
-
packageVersion: typeof MACRO !== "undefined" ? "1.80.
|
|
497570
|
+
packageVersion: typeof MACRO !== "undefined" ? "1.80.3" : "1.80.3"
|
|
497497
497571
|
})
|
|
497498
497572
|
},
|
|
497499
497573
|
{
|
|
@@ -497556,7 +497630,7 @@ function value(tokens, flag) {
|
|
|
497556
497630
|
return index2 >= 0 ? tokens[index2 + 1] : undefined;
|
|
497557
497631
|
}
|
|
497558
497632
|
function cliVersion() {
|
|
497559
|
-
return typeof MACRO !== "undefined" ? "1.80.
|
|
497633
|
+
return typeof MACRO !== "undefined" ? "1.80.3" : "1.80.3";
|
|
497560
497634
|
}
|
|
497561
497635
|
function workflowPath(cwd2) {
|
|
497562
497636
|
return join168(cwd2, ".github", "workflows", "ur-agentic-ci.yml");
|
|
@@ -503412,7 +503486,7 @@ function createAcpStdioApp(deps) {
|
|
|
503412
503486
|
}
|
|
503413
503487
|
},
|
|
503414
503488
|
authMethods: [],
|
|
503415
|
-
agentInfo: { name: "UR-Nexus", version: "1.80.
|
|
503489
|
+
agentInfo: { name: "UR-Nexus", version: "1.80.3" }
|
|
503416
503490
|
})).onRequest("authenticate", () => ({})).onRequest("session/new", async (context6) => {
|
|
503417
503491
|
const result = runtime2.newSession(context6.params.cwd, context6.params.mcpServers, context6.params.additionalDirectories);
|
|
503418
503492
|
await runtime2.announce({
|
|
@@ -503509,7 +503583,7 @@ function createAcpStdioAgent(deps) {
|
|
|
503509
503583
|
}
|
|
503510
503584
|
},
|
|
503511
503585
|
authMethods: [],
|
|
503512
|
-
agentInfo: { name: "UR-Nexus", version: "1.80.
|
|
503586
|
+
agentInfo: { name: "UR-Nexus", version: "1.80.3" }
|
|
503513
503587
|
});
|
|
503514
503588
|
return;
|
|
503515
503589
|
case "authenticate":
|
|
@@ -714735,7 +714809,7 @@ async function captureMemoryDiagnostics(trigger2, dumpNumber = 0) {
|
|
|
714735
714809
|
smapsRollup,
|
|
714736
714810
|
platform: process.platform,
|
|
714737
714811
|
nodeVersion: process.version,
|
|
714738
|
-
ccVersion: "1.80.
|
|
714812
|
+
ccVersion: "1.80.3"
|
|
714739
714813
|
};
|
|
714740
714814
|
}
|
|
714741
714815
|
async function performHeapDump(trigger2 = "manual", dumpNumber = 0) {
|
|
@@ -715324,7 +715398,7 @@ var init_bridge_kick = __esm(() => {
|
|
|
715324
715398
|
var call154 = async () => {
|
|
715325
715399
|
return {
|
|
715326
715400
|
type: "text",
|
|
715327
|
-
value: "1.80.
|
|
715401
|
+
value: "1.80.3"
|
|
715328
715402
|
};
|
|
715329
715403
|
}, version2, version_default;
|
|
715330
715404
|
var init_version = __esm(() => {
|
|
@@ -726567,7 +726641,7 @@ function generateHtmlReport(data, insights) {
|
|
|
726567
726641
|
</html>`;
|
|
726568
726642
|
}
|
|
726569
726643
|
function buildExportData(data, insights, facets, remoteStats) {
|
|
726570
|
-
const version3 = typeof MACRO !== "undefined" ? "1.80.
|
|
726644
|
+
const version3 = typeof MACRO !== "undefined" ? "1.80.3" : "unknown";
|
|
726571
726645
|
const remote_hosts_collected = remoteStats?.hosts.filter((h2) => h2.sessionCount > 0).map((h2) => h2.name);
|
|
726572
726646
|
const facets_summary = {
|
|
726573
726647
|
total: facets.size,
|
|
@@ -730880,7 +730954,7 @@ var init_sessionStorage = __esm(() => {
|
|
|
730880
730954
|
init_settings2();
|
|
730881
730955
|
init_slowOperations();
|
|
730882
730956
|
init_uuid();
|
|
730883
|
-
VERSION7 = typeof MACRO !== "undefined" ? "1.80.
|
|
730957
|
+
VERSION7 = typeof MACRO !== "undefined" ? "1.80.3" : "unknown";
|
|
730884
730958
|
MAX_TOMBSTONE_REWRITE_BYTES = 50 * 1024 * 1024;
|
|
730885
730959
|
SKIP_FIRST_PROMPT_PATTERN = /^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/;
|
|
730886
730960
|
EPHEMERAL_PROGRESS_TYPES = new Set([
|
|
@@ -732095,7 +732169,7 @@ var init_filesystem = __esm(() => {
|
|
|
732095
732169
|
});
|
|
732096
732170
|
getBundledSkillsRoot = memoize_default(function getBundledSkillsRoot2() {
|
|
732097
732171
|
const nonce = randomBytes24(16).toString("hex");
|
|
732098
|
-
return join243(getURTempDir(), "bundled-skills", "1.80.
|
|
732172
|
+
return join243(getURTempDir(), "bundled-skills", "1.80.3", nonce);
|
|
732099
732173
|
});
|
|
732100
732174
|
getResolvedWorkingDirPaths = memoize_default(getPathsForPermissionCheck);
|
|
732101
732175
|
});
|
|
@@ -737551,13 +737625,13 @@ function getTaskToolGuidance(enabledTools) {
|
|
|
737551
737625
|
const canUpdate = enabledTools.has(TASK_UPDATE_TOOL_NAME);
|
|
737552
737626
|
const canList = enabledTools.has(TASK_LIST_TOOL_NAME);
|
|
737553
737627
|
if (canCreate && canUpdate) {
|
|
737554
|
-
return `
|
|
737628
|
+
return `UR uses a strict-hybrid task policy. Before the first mutation, you MUST use ${TASK_CREATE_TOOL_NAME} for 2+ distinct requested outcomes, enumerated or sequenced work, multiple independently verifiable deliverables, plan-mode implementation, delegation or parallel agents, dependency ordering, project-sized builds/refactors, and release, publishing, deployment, migration, security, credential, permission, sandbox, production, or other high-risk work. An explicit user request for tasks always wins. Only a genuinely atomic, low-risk change with one outcome may proceed directly; informational answers, acknowledgements, and small corrections need no board. Read-only investigation is always allowed before planning. Decompose tracked work into 2-8 bounded outcomes (never more than 12), each with one observable result, likely file scope, and acceptance evidence; never copy the raw user prompt as a task title. Create tasks first without guessed or forward dependency IDs. After each real ID is returned, use ${TASK_UPDATE_TOOL_NAME} to add dependencies only to tasks that already exist; never reference a future task, and never create a self-dependency. Keep the final graph dependency-ordered; independent branches stay dependency-free. If the user interrupts while tasks are pending or in progress, inspect the active list, preserve still-relevant work, update the affected task, add a task only for a genuinely distinct new outcome, and mark superseded work skipped rather than starting from an empty list. Mark each unblocked task in_progress when work starts and completed immediately after implementation and relevant verification succeed; use failed for attempted work that did not finish, skipped only for explicitly inapplicable work, and leave dependency-blocked work open with its blocker recorded.${canList ? ` Use ${TASK_LIST_TOOL_NAME} after every interruption and to select the next unblocked task; when all work succeeds, show the final list with every task completed before finishing.` : ""}`;
|
|
737555
737629
|
}
|
|
737556
737630
|
if (canUpdate) {
|
|
737557
737631
|
return `Keep assigned tasks current with ${TASK_UPDATE_TOOL_NAME}: mark the task in_progress when starting, completed only after implementation and relevant verification succeed, and leave blocked or partial work open with its blocker recorded.${canList ? ` Use ${TASK_LIST_TOOL_NAME} to select the next unblocked task.` : ""}`;
|
|
737558
737632
|
}
|
|
737559
737633
|
if (canCreate) {
|
|
737560
|
-
return `Use ${TASK_CREATE_TOOL_NAME} for
|
|
737634
|
+
return `Use ${TASK_CREATE_TOOL_NAME} before mutation for 2+ distinct outcomes, sequenced work, project-sized changes, delegation, dependencies, releases/deployments/migrations, security-sensitive work, or an explicit task-list request. Only a genuinely atomic low-risk change may proceed directly. A tracked request should have 2-8 bounded outcomes (never more than 12). Never copy the raw prompt as a task title. Create tasks without guessed or forward IDs; dependencies may name only tasks whose real IDs have already been returned. Preserve pending or in-progress work after an interruption, update affected work, and add only genuinely distinct new outcomes.`;
|
|
737561
737635
|
}
|
|
737562
737636
|
if (enabledTools.has(TODO_WRITE_TOOL_NAME)) {
|
|
737563
737637
|
return `Track multi-step work with ${TODO_WRITE_TOOL_NAME}. Keep items dependency-ordered and mark each item completed immediately after its implementation and relevant verification succeed.`;
|
|
@@ -738484,7 +738558,7 @@ function computeFingerprint(messageText2, version3) {
|
|
|
738484
738558
|
}
|
|
738485
738559
|
function computeFingerprintFromMessages(messages) {
|
|
738486
738560
|
const firstMessageText = extractFirstMessageText(messages);
|
|
738487
|
-
return computeFingerprint(firstMessageText, "1.80.
|
|
738561
|
+
return computeFingerprint(firstMessageText, "1.80.3");
|
|
738488
738562
|
}
|
|
738489
738563
|
var FINGERPRINT_SALT = "59cf53e54c78";
|
|
738490
738564
|
var init_fingerprint = () => {};
|
|
@@ -740409,7 +740483,7 @@ async function sideQuery(opts) {
|
|
|
740409
740483
|
betas.push(STRUCTURED_OUTPUTS_BETA_HEADER);
|
|
740410
740484
|
}
|
|
740411
740485
|
const messageText2 = extractFirstUserMessageText(messages);
|
|
740412
|
-
const fingerprint2 = computeFingerprint(messageText2, "1.80.
|
|
740486
|
+
const fingerprint2 = computeFingerprint(messageText2, "1.80.3");
|
|
740413
740487
|
const attributionHeader = getAttributionHeader(fingerprint2);
|
|
740414
740488
|
const systemBlocks = [
|
|
740415
740489
|
attributionHeader ? { type: "text", text: attributionHeader } : null,
|
|
@@ -745243,7 +745317,7 @@ function buildSystemInitMessage(inputs) {
|
|
|
745243
745317
|
slash_commands: inputs.commands.filter((c4) => c4.userInvocable !== false).map((c4) => c4.name),
|
|
745244
745318
|
apiKeySource: getURHQApiKeyWithSource().source,
|
|
745245
745319
|
betas: getSdkBetas(),
|
|
745246
|
-
ur_version: "1.80.
|
|
745320
|
+
ur_version: "1.80.3",
|
|
745247
745321
|
output_style: outputStyle,
|
|
745248
745322
|
agents: inputs.agents.map((agent2) => agent2.agentType),
|
|
745249
745323
|
skills: inputs.skills.filter((s) => s.userInvocable !== false).map((skill2) => skill2.name),
|
|
@@ -759079,7 +759153,7 @@ var init_useVoiceEnabled = __esm(() => {
|
|
|
759079
759153
|
function getSemverPart(version3) {
|
|
759080
759154
|
return `${import_semver13.major(version3, { loose: true })}.${import_semver13.minor(version3, { loose: true })}.${import_semver13.patch(version3, { loose: true })}`;
|
|
759081
759155
|
}
|
|
759082
|
-
function useUpdateNotification(updatedVersion, initialVersion = "1.80.
|
|
759156
|
+
function useUpdateNotification(updatedVersion, initialVersion = "1.80.3") {
|
|
759083
759157
|
const [lastNotifiedSemver, setLastNotifiedSemver] = import_react225.useState(() => getSemverPart(initialVersion));
|
|
759084
759158
|
if (!updatedVersion) {
|
|
759085
759159
|
return null;
|
|
@@ -759128,7 +759202,7 @@ function AutoUpdater({
|
|
|
759128
759202
|
return;
|
|
759129
759203
|
}
|
|
759130
759204
|
if (false) {}
|
|
759131
|
-
const currentVersion = "1.80.
|
|
759205
|
+
const currentVersion = "1.80.3";
|
|
759132
759206
|
const channel = getInitialSettings()?.autoUpdatesChannel ?? "latest";
|
|
759133
759207
|
let latestVersion = await getLatestVersion(channel);
|
|
759134
759208
|
const isDisabled = isAutoUpdaterDisabled();
|
|
@@ -759357,12 +759431,12 @@ function NativeAutoUpdater({
|
|
|
759357
759431
|
logEvent("tengu_native_auto_updater_start", {});
|
|
759358
759432
|
try {
|
|
759359
759433
|
const maxVersion = await getMaxVersion();
|
|
759360
|
-
if (maxVersion && gt("1.80.
|
|
759434
|
+
if (maxVersion && gt("1.80.3", maxVersion)) {
|
|
759361
759435
|
const msg = await getMaxVersionMessage();
|
|
759362
759436
|
setMaxVersionIssue(msg ?? "affects your version");
|
|
759363
759437
|
}
|
|
759364
759438
|
const result = await installLatest(channel);
|
|
759365
|
-
const currentVersion = "1.80.
|
|
759439
|
+
const currentVersion = "1.80.3";
|
|
759366
759440
|
const latencyMs = Date.now() - startTime;
|
|
759367
759441
|
if (result.lockFailed) {
|
|
759368
759442
|
logEvent("tengu_native_auto_updater_lock_contention", {
|
|
@@ -759499,17 +759573,17 @@ function PackageManagerAutoUpdater(t0) {
|
|
|
759499
759573
|
const maxVersion = await getMaxVersion();
|
|
759500
759574
|
if (maxVersion && latest && gt(latest, maxVersion)) {
|
|
759501
759575
|
logForDebugging(`PackageManagerAutoUpdater: maxVersion ${maxVersion} is set, capping update from ${latest} to ${maxVersion}`);
|
|
759502
|
-
if (gte("1.80.
|
|
759503
|
-
logForDebugging(`PackageManagerAutoUpdater: current version ${"1.80.
|
|
759576
|
+
if (gte("1.80.3", maxVersion)) {
|
|
759577
|
+
logForDebugging(`PackageManagerAutoUpdater: current version ${"1.80.3"} is already at or above maxVersion ${maxVersion}, skipping update`);
|
|
759504
759578
|
setUpdateAvailable(false);
|
|
759505
759579
|
return;
|
|
759506
759580
|
}
|
|
759507
759581
|
latest = maxVersion;
|
|
759508
759582
|
}
|
|
759509
|
-
const hasUpdate = latest && !gte("1.80.
|
|
759583
|
+
const hasUpdate = latest && !gte("1.80.3", latest) && !shouldSkipVersion(latest);
|
|
759510
759584
|
setUpdateAvailable(!!hasUpdate);
|
|
759511
759585
|
if (hasUpdate) {
|
|
759512
|
-
logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.80.
|
|
759586
|
+
logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.80.3"} -> ${latest}`);
|
|
759513
759587
|
}
|
|
759514
759588
|
};
|
|
759515
759589
|
$2[0] = t1;
|
|
@@ -759543,7 +759617,7 @@ function PackageManagerAutoUpdater(t0) {
|
|
|
759543
759617
|
wrap: "truncate",
|
|
759544
759618
|
children: [
|
|
759545
759619
|
"currentVersion: ",
|
|
759546
|
-
"1.80.
|
|
759620
|
+
"1.80.3"
|
|
759547
759621
|
]
|
|
759548
759622
|
}, undefined, true, undefined, this);
|
|
759549
759623
|
$2[3] = verbose;
|
|
@@ -770396,7 +770470,7 @@ function buildStatusLineCommandInput(permissionMode, exceeds200kTokens, settings
|
|
|
770396
770470
|
project_dir: getOriginalCwd(),
|
|
770397
770471
|
added_dirs: addedDirs
|
|
770398
770472
|
},
|
|
770399
|
-
version: "1.80.
|
|
770473
|
+
version: "1.80.3",
|
|
770400
770474
|
output_style: {
|
|
770401
770475
|
name: outputStyleName
|
|
770402
770476
|
},
|
|
@@ -770531,7 +770605,7 @@ function StatusLineInner({
|
|
|
770531
770605
|
const attention = customStatusError ?? taskAttention;
|
|
770532
770606
|
const terminalSize = React133.useContext(TerminalSizeContext);
|
|
770533
770607
|
const defaultStatusLineText = buildDefaultStatusBar({
|
|
770534
|
-
version: "1.80.
|
|
770608
|
+
version: "1.80.3",
|
|
770535
770609
|
providerLabel: providerRuntime.providerLabel,
|
|
770536
770610
|
authMode: providerRuntime.authLabel,
|
|
770537
770611
|
model: renderModelName(mainLoopModel) || providerRuntime.model || "",
|
|
@@ -782786,7 +782860,7 @@ async function submitTranscriptShare(messages, trigger2, appearanceId) {
|
|
|
782786
782860
|
} catch {}
|
|
782787
782861
|
const data = {
|
|
782788
782862
|
trigger: trigger2,
|
|
782789
|
-
version: "1.80.
|
|
782863
|
+
version: "1.80.3",
|
|
782790
782864
|
platform: process.platform,
|
|
782791
782865
|
transcript,
|
|
782792
782866
|
subagentTranscripts: Object.keys(subagentTranscripts).length > 0 ? subagentTranscripts : undefined,
|
|
@@ -795155,7 +795229,7 @@ function WelcomeV2() {
|
|
|
795155
795229
|
dimColor: true,
|
|
795156
795230
|
children: [
|
|
795157
795231
|
"v",
|
|
795158
|
-
"1.80.
|
|
795232
|
+
"1.80.3"
|
|
795159
795233
|
]
|
|
795160
795234
|
}, undefined, true, undefined, this)
|
|
795161
795235
|
]
|
|
@@ -796415,7 +796489,7 @@ function completeOnboarding() {
|
|
|
796415
796489
|
saveGlobalConfig((current) => ({
|
|
796416
796490
|
...current,
|
|
796417
796491
|
hasCompletedOnboarding: true,
|
|
796418
|
-
lastOnboardingVersion: "1.80.
|
|
796492
|
+
lastOnboardingVersion: "1.80.3"
|
|
796419
796493
|
}));
|
|
796420
796494
|
}
|
|
796421
796495
|
function showDialog(root2, renderer) {
|
|
@@ -801561,7 +801635,7 @@ function appendToLog(path28, message) {
|
|
|
801561
801635
|
cwd: getFsImplementation().cwd(),
|
|
801562
801636
|
userType: process.env.USER_TYPE,
|
|
801563
801637
|
sessionId: getSessionId(),
|
|
801564
|
-
version: "1.80.
|
|
801638
|
+
version: "1.80.3"
|
|
801565
801639
|
};
|
|
801566
801640
|
getLogWriter(path28).write(messageWithTimestamp);
|
|
801567
801641
|
}
|
|
@@ -805725,8 +805799,8 @@ async function getEnvLessBridgeConfig() {
|
|
|
805725
805799
|
}
|
|
805726
805800
|
async function checkEnvLessBridgeMinVersion() {
|
|
805727
805801
|
const cfg = await getEnvLessBridgeConfig();
|
|
805728
|
-
if (cfg.min_version && lt("1.80.
|
|
805729
|
-
return `Your version of UR (${"1.80.
|
|
805802
|
+
if (cfg.min_version && lt("1.80.3", cfg.min_version)) {
|
|
805803
|
+
return `Your version of UR (${"1.80.3"}) is too old for Remote Control.
|
|
805730
805804
|
Version ${cfg.min_version} or higher is required. Run \`ur update\` to update.`;
|
|
805731
805805
|
}
|
|
805732
805806
|
return null;
|
|
@@ -806200,7 +806274,7 @@ async function initBridgeCore(params) {
|
|
|
806200
806274
|
const rawApi = createBridgeApiClient({
|
|
806201
806275
|
baseUrl,
|
|
806202
806276
|
getAccessToken,
|
|
806203
|
-
runnerVersion: "1.80.
|
|
806277
|
+
runnerVersion: "1.80.3",
|
|
806204
806278
|
onDebug: logForDebugging,
|
|
806205
806279
|
onAuth401,
|
|
806206
806280
|
getTrustedDeviceToken
|
|
@@ -815673,7 +815747,7 @@ function getAgUiCapabilities() {
|
|
|
815673
815747
|
name: "UR-Nexus",
|
|
815674
815748
|
type: "ur-nexus",
|
|
815675
815749
|
description: "Provider-flexible, local-first autonomous engineering workflow agent.",
|
|
815676
|
-
version: "1.80.
|
|
815750
|
+
version: "1.80.3",
|
|
815677
815751
|
provider: "UR",
|
|
815678
815752
|
documentationUrl: "https://github.com/Maitham16/UR/blob/master/docs/AG_UI.md"
|
|
815679
815753
|
},
|
|
@@ -816804,7 +816878,7 @@ function createMCPServer(cwd4, debug2, verbose) {
|
|
|
816804
816878
|
};
|
|
816805
816879
|
const server2 = new Server({
|
|
816806
816880
|
name: "ur-nexus",
|
|
816807
|
-
version: "1.80.
|
|
816881
|
+
version: "1.80.3"
|
|
816808
816882
|
}, {
|
|
816809
816883
|
capabilities: {
|
|
816810
816884
|
tools: {}
|
|
@@ -818008,7 +818082,7 @@ function thrownResponse(error40) {
|
|
|
818008
818082
|
}
|
|
818009
818083
|
async function createUrMcp2026Runtime(options5) {
|
|
818010
818084
|
const server2 = createMCPServer(options5.cwd, options5.debug === true, options5.verbose === true);
|
|
818011
|
-
const client2 = new Client({ name: "ur-mcp-2026-adapter", version: "1.80.
|
|
818085
|
+
const client2 = new Client({ name: "ur-mcp-2026-adapter", version: "1.80.3" }, { capabilities: {} });
|
|
818012
818086
|
const [clientTransport, serverTransport] = createLinkedTransportPair();
|
|
818013
818087
|
try {
|
|
818014
818088
|
await server2.connect(serverTransport);
|
|
@@ -818019,7 +818093,7 @@ async function createUrMcp2026Runtime(options5) {
|
|
|
818019
818093
|
}
|
|
818020
818094
|
const runtime2 = new Mcp2026Runtime({
|
|
818021
818095
|
cwd: options5.cwd,
|
|
818022
|
-
version: "1.80.
|
|
818096
|
+
version: "1.80.3",
|
|
818023
818097
|
backend: {
|
|
818024
818098
|
listTools: async () => {
|
|
818025
818099
|
const listed = await client2.listTools();
|
|
@@ -820621,7 +820695,7 @@ async function update() {
|
|
|
820621
820695
|
logEvent("tengu_update_check", {});
|
|
820622
820696
|
const diagnostic2 = await getDoctorDiagnostic();
|
|
820623
820697
|
const result = await checkUpgradeStatus({
|
|
820624
|
-
currentVersion: "1.80.
|
|
820698
|
+
currentVersion: "1.80.3",
|
|
820625
820699
|
packageName: UR_AGENT_PACKAGE_NAME,
|
|
820626
820700
|
installationType: diagnostic2.installationType,
|
|
820627
820701
|
latestVersion: () => getLatestNpmPackageVersion(UR_AGENT_PACKAGE_NAME)
|
|
@@ -821949,7 +822023,7 @@ ${customInstructions}` : customInstructions;
|
|
|
821949
822023
|
}
|
|
821950
822024
|
}
|
|
821951
822025
|
logForDiagnosticsNoPII("info", "started", {
|
|
821952
|
-
version: "1.80.
|
|
822026
|
+
version: "1.80.3",
|
|
821953
822027
|
is_native_binary: isInBundledMode()
|
|
821954
822028
|
});
|
|
821955
822029
|
registerCleanup(async () => {
|
|
@@ -822736,7 +822810,7 @@ Usage: ur --remote "your task description"`, () => gracefulShutdown(1));
|
|
|
822736
822810
|
pendingHookMessages
|
|
822737
822811
|
}, renderAndRun);
|
|
822738
822812
|
}
|
|
822739
|
-
}).version("1.80.
|
|
822813
|
+
}).version("1.80.3 (UR-Nexus)", "-v, --version", "Output the version number");
|
|
822740
822814
|
program2.option("-w, --worktree [name]", "Create a new git worktree for this session (optionally specify a name)");
|
|
822741
822815
|
program2.option("--tmux", "Create a tmux session for the worktree (requires --worktree). Uses iTerm2 native panes when available; use --tmux=classic for traditional tmux.");
|
|
822742
822816
|
if (canUserConfigureAdvisor()) {
|
|
@@ -823844,7 +823918,7 @@ if (false) {}
|
|
|
823844
823918
|
async function main2() {
|
|
823845
823919
|
const args = process.argv.slice(2);
|
|
823846
823920
|
if (args.length === 1 && (args[0] === "--version" || args[0] === "-v" || args[0] === "-V")) {
|
|
823847
|
-
console.log(`${"1.80.
|
|
823921
|
+
console.log(`${"1.80.3"} (UR-Nexus)`);
|
|
823848
823922
|
return;
|
|
823849
823923
|
}
|
|
823850
823924
|
if (args[0] === "a2a" && args[1] === "serve" && !args.includes("--help") && !args.includes("-h")) {
|
package/docs/AGENT_FEATURES.md
CHANGED
|
@@ -9,6 +9,12 @@ reproducible autonomous software engineering agent: every substantial task can
|
|
|
9
9
|
be driven as `spec -> plan -> patch -> test -> report -> rollback`, with the
|
|
10
10
|
spec as the durable source of truth and command evidence as the success gate.
|
|
11
11
|
|
|
12
|
+
## v1.80.3 Addition
|
|
13
|
+
|
|
14
|
+
| Addition | Surface | What it adds |
|
|
15
|
+
| --- | --- | --- |
|
|
16
|
+
| Strict-hybrid task planning | Interactive `TaskCreate` lifecycle, `tasks.requireBeforeChanges` | Keeps atomic low-risk work direct, but requires a visible actionable task before mutation for multi-outcome, sequenced, planned, delegated, project-sized, and high-risk lifecycle work. Reads stay open, custom profiles without `TaskCreate` cannot deadlock, and operators retain advisory and fully strict modes. |
|
|
17
|
+
|
|
12
18
|
## v1.80.0 Additions
|
|
13
19
|
|
|
14
20
|
| Addition | Surface | What it adds |
|
package/docs/CONFIGURATION.md
CHANGED
|
@@ -17,6 +17,31 @@ Start UR with `--screen-reader`, set `UR_SCREEN_READER=1`, or use
|
|
|
17
17
|
edits, and reduced animation. `vimEscape` accepts 2–8 printable non-whitespace
|
|
18
18
|
characters or `off`.
|
|
19
19
|
|
|
20
|
+
## Interactive task planning
|
|
21
|
+
|
|
22
|
+
UR uses strict-hybrid task tracking by default: one atomic, low-risk outcome
|
|
23
|
+
can proceed directly, while multi-outcome, sequenced, planned, delegated,
|
|
24
|
+
project-sized, release, migration, security, sandbox, and production work must
|
|
25
|
+
create a visible task before the first mutation. Read-only investigation is
|
|
26
|
+
never blocked.
|
|
27
|
+
|
|
28
|
+
```jsonc
|
|
29
|
+
{
|
|
30
|
+
"tasks": {
|
|
31
|
+
"requireBeforeChanges": {
|
|
32
|
+
"enabled": true,
|
|
33
|
+
"freeReads": 3
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
`freeReads` is a compatibility allowance for non-interactive integrations that
|
|
40
|
+
do not carry a classified user turn; it is not a limit on investigation. Set
|
|
41
|
+
it to `0` to require a task before every mutation. Set `enabled` to `false` to
|
|
42
|
+
return to advisory task tracking. Profiles that omit `TaskCreate` are not
|
|
43
|
+
gated, because they could not satisfy the requirement.
|
|
44
|
+
|
|
20
45
|
## Model Providers
|
|
21
46
|
|
|
22
47
|
UR-Nexus supports official provider access paths only:
|
package/docs/USAGE.md
CHANGED
|
@@ -428,6 +428,33 @@ in dependency order. `ur exec` materializes this graph deterministically; the
|
|
|
428
428
|
interactive agent follows the same lifecycle and its task/agent tools enforce
|
|
429
429
|
the concurrency boundary.
|
|
430
430
|
|
|
431
|
+
Interactive work uses a strict-hybrid task policy by default. One atomic,
|
|
432
|
+
low-risk outcome can be implemented directly. Before the first mutation, UR
|
|
433
|
+
requires a visible task for requests with two or more outcomes, enumerated or
|
|
434
|
+
sequenced work, plan mode, delegation, dependencies, project-sized work, and
|
|
435
|
+
release, publishing, deployment, migration, security, credential, permission,
|
|
436
|
+
sandbox, or production risk. Read-only inspection never needs a task, so the
|
|
437
|
+
agent can understand the repository before it creates the board. A custom tool
|
|
438
|
+
profile without `TaskCreate` remains usable and does not deadlock.
|
|
439
|
+
|
|
440
|
+
The default can be tuned in `.ur/settings.json` or user settings:
|
|
441
|
+
|
|
442
|
+
```json
|
|
443
|
+
{
|
|
444
|
+
"tasks": {
|
|
445
|
+
"requireBeforeChanges": {
|
|
446
|
+
"enabled": true,
|
|
447
|
+
"freeReads": 3
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
Set `enabled` to `false` for advisory task tracking. Set `freeReads` to `0` for
|
|
454
|
+
the fully strict policy that requires a task before every mutation, including
|
|
455
|
+
an atomic change. The positive atomic classification otherwise stays direct
|
|
456
|
+
regardless of how many read-only tools were needed.
|
|
457
|
+
|
|
431
458
|
A user prompt does not create a placeholder task. The task panel stays quiet
|
|
432
459
|
for informational conversation, direct one-step changes, acknowledgements, and
|
|
433
460
|
small corrections. For genuinely multi-step work, multiple independently
|
package/docs/VALIDATION.md
CHANGED
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.80.
|
|
48
|
+
<p class="eyebrow">Version 1.80.3</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.80.
|
|
5
|
+
"version": "1.80.3",
|
|
6
6
|
"publisher": "ur-nexus",
|
|
7
7
|
"engines": {
|
|
8
8
|
"vscode": "^1.92.0"
|
package/package.json
CHANGED