ur-agent 1.65.11 → 1.65.13

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.
@@ -19,7 +19,7 @@ You need:
19
19
 
20
20
  ```sh
21
21
  ur --version
22
- # expected for this release: "1.65.11 (UR-Nexus)"
22
+ # expected for this release: "1.65.13 (UR-Nexus)"
23
23
  ```
24
24
 
25
25
  ## 0.1 First-workspace model selection (1.45.4)
@@ -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.11</p>
48
+ <p class="eyebrow">Version 1.65.13</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>
@@ -7,7 +7,7 @@ plugins {
7
7
  }
8
8
 
9
9
  group = "dev.urnexus"
10
- version = "1.65.11"
10
+ version = "1.65.13"
11
11
 
12
12
  repositories {
13
13
  mavenCentral()
@@ -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.11",
5
+ "version": "1.65.13",
6
6
  "publisher": "ur-nexus",
7
7
  "engines": {
8
8
  "vscode": "^1.92.0"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ur-agent",
3
- "version": "1.65.11",
3
+ "version": "1.65.13",
4
4
  "description": "UR-Nexus — autonomous engineering workflow engine (plan, execute, test, verify, document, benchmark, reproduce)",
5
5
  "type": "module",
6
6
  "packageManager": "bun@1.3.14",
@@ -92,6 +92,33 @@ redirection, backgrounding, sandbox overrides, and permission-time rewrites to
92
92
  mutating commands fail closed. The preview command remains a Bash side effect
93
93
  and still follows normal permission, sandbox, and plan-worker rules.
94
94
 
95
+ Syntax verification has the same task-gate-only separation. A strictly parsed
96
+ `node --check <single-file>` or the bounded HTML checker that reads one file,
97
+ constructs but never invokes its first `<script>` body, and prints only a fixed
98
+ syntax result may run after a task-free one-shot Write. Generic `node -e`,
99
+ additional statements or invocation, mismatched files, flags, redirects,
100
+ expansion, backgrounding, sandbox overrides, and permission-time rewrites do
101
+ not qualify. Node remains non-read-only for Bash permission and sandbox
102
+ purposes, so this compatibility path cannot become a general execution bypass.
103
+
104
+ Task completion also protects that lifecycle boundary. When the final
105
+ actionable `in_progress` task has a successful `Write`/`Edit`/`MultiEdit`/
106
+ `NotebookEdit` after its recorded start but no later successful inspection,
107
+ runtime, test, shell, or delegated-check result, `TaskUpdate(completed)` is
108
+ soft-deferred: it returns a non-error explanation and leaves the same task
109
+ `in_progress`. The model verifies and retries completion instead of creating a
110
+ duplicate task or discovering an all-terminal dead end on the next corrective
111
+ Edit. The guard is evidence-based and conservative: missing/compacted history,
112
+ non-file work, and intermediate tasks are not guessed into a deferred state.
113
+
114
+ Live plan mode also treats setup of the exact current session plan artifact as
115
+ planning infrastructure rather than implementation. `Write` creates the plan
116
+ file's parent automatically, but weak models may first emit `mkdir -p` for that
117
+ exact parent or the bounded `ls ... || mkdir -p ... && ls ...` check. Only those
118
+ exact-path shapes bypass the task-list requirement; Bash permission and sandbox
119
+ checks still apply, and a hook rewrite, sibling path, extra command, expansion,
120
+ background launch, or sandbox override fails closed at the final boundary.
121
+
95
122
  `AskUserQuestion` exposes a request-only model schema: one top-level
96
123
  `questions` array with 1–4 complete question objects, each containing
97
124
  `question`, a header of at most 12 characters, and 2–8 labeled choices.
@@ -99,7 +126,24 @@ Descriptions are optional and are never fabricated from labels. The runtime
99
126
  accepts only lossless compatibility forms such as string choices and recognized
100
127
  question-text aliases; it does not turn arbitrary prose or flat option rows into
101
128
  invented questions. More than four blocking decisions are asked in later
102
- rounds.
129
+ rounds. The sole presentation-only repair compacts a safe explicit header of at
130
+ most 500 characters to one bounded first-word chip when it exceeds 12
131
+ characters. The question, options, labels, descriptions, previews, metadata,
132
+ and selection mode remain byte-for-byte unchanged. Control/ANSI-bearing or
133
+ grossly oversized headers still fail validation.
134
+
135
+ One narrow end-turn recovery exists for weak models that clearly attempted this
136
+ tool but failed to emit a native call. On an interactive main-agent turn with
137
+ no existing tool use, the runtime may recover either one canonical
138
+ `questions` object at the very end of a reasoning block that explicitly says
139
+ to invoke `AskUserQuestion`, or one standalone Markdown decision menu with
140
+ exactly one bold question, 2–8 bold labeled options with descriptions, and a
141
+ terminal instruction to select an option. The recovered object must pass the
142
+ live `AskUserQuestion` schema unchanged except for that same deterministic
143
+ UI-header compaction before the normal tool executor opens the UI. JSON repair,
144
+ question/choice truncation, duplicate/ambiguous candidates, casual “A or B?”
145
+ prose, examples, incomplete menus, background workers, headless sessions, and
146
+ unavailable/disabled tools all fail closed.
103
147
 
104
148
  Answers and annotations are not model input fields. They are accepted only
105
149
  during post-permission validation after the interactive UI has returned one
@@ -180,10 +224,10 @@ the intended file.
180
224
 
181
225
  `Edit` remains fail-closed rather than applying a fuzzy replacement to similar
182
226
  code. When an exact contiguous `old_string` is absent, its bounded error points
183
- to a verified matching line when one exists and tells the model to re-read that
184
- region, use a smaller current 2–4-line anchor, split distant HTML/CSS/JavaScript
185
- sections, and never retry the unchanged call. One narrow idempotent case returns
186
- success without writing: a non-`replace_all` deletion-only edit whose
187
- `new_string` is already present uniquely and whose larger `old_string` is
188
- absent. General stale, fuzzy, empty-replacement, and ambiguous matches still
189
- fail.
227
+ to the most distinctive verified matching line when one exists, rather than an
228
+ unrelated generic delimiter, and tells the model to re-read that region, use a
229
+ smaller current 2–4-line anchor, split distant HTML/CSS/JavaScript sections, and
230
+ never retry the unchanged call. One narrow idempotent case returns success
231
+ without writing: a non-`replace_all` deletion-only edit whose `new_string` is
232
+ already present uniquely and whose larger `old_string` is absent. General
233
+ stale, fuzzy, empty-replacement, and ambiguous matches still fail.
@@ -111,15 +111,18 @@ ur --discover-ollama # scan the LAN for Ollama servers (ollamaDiscovery.ts)
111
111
  search, and bounded private cursor state. Compacted context persistence
112
112
  requires a 32-byte `UR_OPENAI_RESPONSES_STATE_KEY`.
113
113
  - `ollama.ts` selects timeouts from explicit request options, then
114
- `API_TIMEOUT_MS`, then runtime defaults. `:cloud` models and remote sessions
115
- use 120 seconds; local models use 300 seconds. The same model-aware value is
116
- applied while waiting for `/api/chat` response headers and as the absolute
117
- deadline in `readOllamaChunks`.
114
+ `API_TIMEOUT_MS`, then runtime defaults. Remote sessions and ordinary
115
+ `:cloud` models use 120 seconds; local models and Kimi K2.7 Cloud use 300
116
+ seconds because large Kimi coding turns can legitimately take longer than
117
+ two minutes before completing. The same model-aware value is applied while
118
+ waiting for `/api/chat` response headers and as the absolute deadline in
119
+ `readOllamaChunks`.
118
120
  - `ur.ts` identifies an Ollama Cloud runtime from both the selected provider and
119
121
  the `:cloud` suffix. It disables shared automatic request retries for that
120
- route, applies the same 120-second bound to any permitted non-streaming
122
+ route, applies the same model-aware bound to any permitted non-streaming
121
123
  fallback, and skips fallback entirely when the Ollama stream deadline itself
122
- caused the failure. Explicit `API_TIMEOUT_MS` remains authoritative.
124
+ caused the failure. Explicit `API_TIMEOUT_MS` remains authoritative, and
125
+ remote-session safety keeps its 120-second ceiling.
123
126
 
124
127
  ## Capability-aware routing
125
128
 
@@ -149,6 +149,11 @@ use legacy `TodoWrite` by default, or Task V2 when
149
149
  - Dependencies block transition or claim until prerequisites are complete.
150
150
  - Actionable `pending` or `in_progress` entries open the gate; completed and
151
151
  internal entries do not.
152
+ - The last actionable `in_progress` task cannot be terminalized immediately
153
+ after a recorded file mutation with no later successful observable check.
154
+ `TaskUpdate` soft-defers that completion and keeps the same task actionable;
155
+ it does not infer or auto-create a replacement task. A later successful
156
+ inspection/runtime/test/delegated check allows the explicit completion retry.
152
157
  - Reads remain unrestricted. Ordinary mutations have a default allowance of
153
158
  three preceding tool calls, counted by tool call rather than message.
154
159
  Delegation and child mutations always require an actionable parent task.
@@ -159,10 +164,13 @@ use legacy `TodoWrite` by default, or Task V2 when
159
164
  exempt so the agent can repair the plan.
160
165
  - Creating or updating the exact current-session plan-mode Markdown file is
161
166
  also exempt: that file is the planning artifact, not an ordinary workspace
162
- change. The exemption and live actionable-task state are re-evaluated at the
163
- final execution boundary after permission-hook input rewrites; sibling files
164
- and the plans directory are not exempt, and the filename alone is not exempt
165
- outside live plan mode.
167
+ change. A bounded Bash bootstrap may only create/check that file's exact
168
+ parent (`mkdir -p`, optionally guarded by the known `ls` pattern); this
169
+ compatibility path remains subject to Bash permission and sandbox checks.
170
+ The exemption and live actionable-task state are re-evaluated at the final
171
+ execution boundary after permission-hook input rewrites. Sibling paths,
172
+ general plans-directory commands, added shell operations, and the filename
173
+ alone outside live plan mode are not exempt.
166
174
  - Configure the behavior at
167
175
  `tasks.requireBeforeChanges.{enabled,freeReads}`.
168
176
 
@@ -1,6 +1,6 @@
1
1
  # UR-Nexus — Technical Specifications
2
2
 
3
- > Audited against the executable source and tests for `ur-agent` v1.65.11.
3
+ > Audited against the executable source and tests for `ur-agent` v1.65.13.
4
4
  > Command, tool, flag, provider, and setting claims are checked against the
5
5
  > implementation rather than copied from product prose. Release validation
6
6
  > keeps this version synchronized and packages the complete `technical/`