ur-agent 1.68.17 → 1.69.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -595
- package/README.md +4 -5
- package/dist/cli.js +4228 -8407
- package/docs/VALIDATION.md +1 -1
- package/documentation/app.js +0 -91
- 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 +2 -13
- package/dist/sdk/index.cjs +0 -189
- package/dist/sdk/index.d.ts +0 -68
- package/dist/sdk/index.js +0 -149
- package/technical/01-architecture.md +0 -148
- package/technical/02-cli-reference.md +0 -227
- package/technical/03-slash-commands.md +0 -318
- package/technical/04-tools.md +0 -283
- package/technical/05-providers-and-models.md +0 -195
- package/technical/06-configuration.md +0 -428
- package/technical/07-memory-and-context.md +0 -175
- package/technical/08-skills-plugins-workflows.md +0 -211
- package/technical/09-multi-agent.md +0 -327
- package/technical/10-headless-automation-eval.md +0 -441
- package/technical/11-integrations.md +0 -157
- package/technical/12-security-sandbox-stability.md +0 -288
- package/technical/13-research.md +0 -129
- package/technical/14-sessions.md +0 -177
- package/technical/README.md +0 -43
package/CHANGELOG.md
CHANGED
|
@@ -1,600 +1,19 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## 1.
|
|
4
|
-
|
|
5
|
-
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
## 1.68.16
|
|
19
|
-
|
|
20
|
-
- First pieces of the UR Nexus visual identity, as terminal primitives rather
|
|
21
|
-
than artwork: `constants/urPalette.ts` (obsidian/bronze/electrum/lapis tokens
|
|
22
|
-
in true-colour, ANSI-256 and monochrome tiers, with depth detection),
|
|
23
|
-
`constants/urOrnament.ts` (frieze bands, the four border styles, the gate
|
|
24
|
-
brand mark), and `utils/statusBarItems.ts` (width-aware status-bar registry).
|
|
25
|
-
- The ornaments are thin box-drawing strokes, not solid blocks. Heavy glyphs
|
|
26
|
-
(▟▙██) were tried first and read as chunky sprites against a design built
|
|
27
|
-
from fine line-work. Everything renders on macOS Terminal, GNOME Terminal,
|
|
28
|
-
Konsole, Alacritty, foot and over SSH — no image protocol, so no user gets a
|
|
29
|
-
degraded version of the identity.
|
|
30
|
-
- Friezes tile to an exact width and truncate rather than pad: a band that
|
|
31
|
-
overshoots its column budget wraps, and a wrapped frieze reads as corruption
|
|
32
|
-
rather than decoration. The ASCII gate is cell-for-cell the same size as the
|
|
33
|
-
Unicode one so a fallback does not shift the layout.
|
|
34
|
-
- Status-bar items degrade by dropping whole items, lowest priority first,
|
|
35
|
-
after trying short forms — never by truncating the assembled string, which
|
|
36
|
-
cuts through whichever number sits at the boundary.
|
|
37
|
-
- Section 11 of the design spec lists context usage at priority 2 but its own
|
|
38
|
-
narrow-width example keeps `ctx` while dropping state and agents. The
|
|
39
|
-
examples win: at a glance the two things worth knowing are how far along the
|
|
40
|
-
work is and how much room is left. Drop order is now an explicit per-item
|
|
41
|
-
rank rather than emerging from zone position.
|
|
42
|
-
|
|
43
|
-
## 1.68.15
|
|
44
|
-
|
|
45
|
-
- Reconstructed three more stub type files, clearing 177 further errors:
|
|
46
|
-
`keybindings/types.ts` (six empty interfaces), `ink/cursor.ts`, and
|
|
47
|
-
`commands/plugin/unifiedTypes.ts`. Same defect as the MCP types in 1.68.14 —
|
|
48
|
-
an empty interface means "has no members" to TypeScript, not "shape unknown",
|
|
49
|
-
so every property access on one was an error and the consuming files carried
|
|
50
|
-
`@ts-nocheck` as a result.
|
|
51
|
-
- `KeybindingBlock.bindings` is keyed by chord string, not an array. A first
|
|
52
|
-
attempt typed it `ParsedBinding[]`, which made every entry in the default
|
|
53
|
-
binding table an error — the declaration form (`'ctrl+d': 'app:exit'`) and the
|
|
54
|
-
parsed form (chord resolved into keystrokes) are different shapes, and
|
|
55
|
-
conflating them broke a file that had been fine.
|
|
56
|
-
- `KeybindingAction` is a string rather than a union of known actions:
|
|
57
|
-
`defaultBindings.ts` assembles entries conditionally from feature flags, so a
|
|
58
|
-
value missing from a union would turn a working binding into an error.
|
|
59
|
-
- Suppression list: 140 -> 132. Eight keybinding and ink files came off.
|
|
60
|
-
- Totals for the sweep so far: 223 -> 132 files, 868 -> 563 errors, and almost
|
|
61
|
-
none of it file-by-file. Four stub files accounted for 258 errors on their
|
|
62
|
-
own.
|
|
63
|
-
|
|
64
|
-
## 1.68.14
|
|
65
|
-
|
|
66
|
-
- Gave the MCP settings types their real shapes. `components/mcp/types.ts`
|
|
67
|
-
declared seven **empty** interfaces under a "Stub: not included in leaked
|
|
68
|
-
source" comment. An empty interface does not mean "unknown shape" to
|
|
69
|
-
TypeScript, it means "has no members" — so every property access on one was an
|
|
70
|
-
error, and that single file produced ~221 of the 858 errors sitting behind
|
|
71
|
-
`@ts-nocheck`. The MCP menus were not wrong; their types were.
|
|
72
|
-
- The shapes are reconstructed from what the components actually access, with
|
|
73
|
-
`transport` as a literal discriminant so the server union narrows on
|
|
74
|
-
`transport === 'stdio'` instead of collapsing. Fields whose internals the UI
|
|
75
|
-
never inspects are `Record<string, unknown>` rather than `any`, so a consumer
|
|
76
|
-
must still narrow before reaching inside.
|
|
77
|
-
- 118 errors cleared, `MCPAgentServerMenu` off the suppression list (141 -> 140).
|
|
78
|
-
- Method note: of 42 files carrying exactly one error, nine shared one cause;
|
|
79
|
-
221 more came from this one stub. These cluster, so the productive next step
|
|
80
|
-
is grouping by error signature rather than opening files one at a time.
|
|
81
|
-
|
|
82
|
-
## 1.68.13
|
|
83
|
-
|
|
84
|
-
- Eight more files came off `@ts-nocheck` (149 -> 141) from a single fix. The
|
|
85
|
-
compiled signature of `useRegisterOverlay(id, t0)` declared two required
|
|
86
|
-
parameters while its own first statement reads
|
|
87
|
-
`const enabled = t0 === undefined ? true : t0` — the argument was optional by
|
|
88
|
-
construction and required by declaration, so every caller passing only an id
|
|
89
|
-
was a type error. Marking it optional cleared 10 errors across 10 files.
|
|
90
|
-
- That is the shape worth looking for in the rest: of 42 files carrying exactly
|
|
91
|
-
one error, nine shared this one cause. The remaining suppressed files surface
|
|
92
|
-
~858 errors, and the useful next step is grouping them by cause rather than
|
|
93
|
-
working through them file by file.
|
|
94
|
-
|
|
95
|
-
## 1.68.12
|
|
96
|
-
|
|
97
|
-
- The Ollama request path now reports where a request's bytes actually go —
|
|
98
|
-
tool definitions, system prompt, conversation — once per session in the debug
|
|
99
|
-
log. The fixed cost of tools plus system prompt is what decides whether a
|
|
100
|
-
small-context model has room left to work, and until now it had only been
|
|
101
|
-
estimated by summing prompt source. That estimate is wrong by construction:
|
|
102
|
-
these prompts are full of `condition ? longText : shortText`, and summing the
|
|
103
|
-
file counts both branches when only one is ever sent. The measurement is
|
|
104
|
-
taken from the serialized request, so it is what the server receives.
|
|
105
|
-
- Reported as a share of the whole with the tool-definition count, because
|
|
106
|
-
"system prompt is large" and "conversation is large" call for opposite fixes
|
|
107
|
-
and are indistinguishable in a single total.
|
|
108
|
-
|
|
109
|
-
## 1.68.11
|
|
110
|
-
|
|
111
|
-
- Investigated turning the task-list gate advisory by default and did not do
|
|
112
|
-
it. The friction it causes is real, but the gate is also the final
|
|
113
|
-
revalidation before a tool executes, and defaulting it off removes two
|
|
114
|
-
properties nothing else provides: a permission handler or hook that rewrites
|
|
115
|
-
a read-only call into a mutating one is re-checked *after* the rewrite, and
|
|
116
|
-
task state is re-read at execution time so a plan that disappears while
|
|
117
|
-
permission is pending cannot let the mutation through. Eight tests in
|
|
118
|
-
`toolExecutionFinalInput` fail the moment enforcement is defaulted off, all
|
|
119
|
-
on those two paths. The rule and its revalidation are not separable: the
|
|
120
|
-
re-read is how the rule is applied at execution time, so with no rule there
|
|
121
|
-
is nothing to revalidate.
|
|
122
|
-
- The friction had two causes and both are already fixed forward: the
|
|
123
|
-
allowance counted messages instead of tool calls, so the gate fired on the
|
|
124
|
-
first Write (1.65.5), and the TodoWrite prompt had lost its worked examples,
|
|
125
|
-
so smaller models stopped producing task lists at all (1.68.0). The gate is
|
|
126
|
-
reached far less often as a result. `tasks.requireBeforeChanges.enabled`
|
|
127
|
-
remains available for anyone who wants it off knowingly.
|
|
128
|
-
|
|
129
|
-
## 1.68.10
|
|
130
|
-
|
|
131
|
-
- `ToolSearchTool` no longer registers on runtimes where it cannot work. Its
|
|
132
|
-
purpose is fetching schemas for tools whose definitions were deferred, and
|
|
133
|
-
deferral needs the runtime to expand `tool_reference` blocks — an
|
|
134
|
-
Anthropic-native beta shape that no UR runtime supports (UR runs on Ollama,
|
|
135
|
-
OpenAI-compatible servers and vendor CLIs). `isEnabled()` consulted only
|
|
136
|
-
`isToolSearchEnabledOptimistic()`, which reads the mode, and the mode
|
|
137
|
-
defaults to `'tst'` (on). The tool therefore registered on every run: its
|
|
138
|
-
description shipped with each request, and the model was offered a tool that
|
|
139
|
-
could not function, because nothing was ever deferred for it to fetch.
|
|
140
|
-
- Audit note on the surface as a whole: 168 commands, of which 8 touch a
|
|
141
|
-
feature flag that is not compiled in, and in each case the flag gates a
|
|
142
|
-
sub-feature rather than the command. 89 of 91 flags are absent from shipped
|
|
143
|
-
builds. Two of those (`CONTEXT_COLLAPSE`, `REACTIVE_COMPACT`) would have
|
|
144
|
-
failed on the first turn if enabled and were fixed in 1.68.2.
|
|
145
|
-
|
|
146
|
-
## 1.68.9
|
|
147
|
-
|
|
148
|
-
- Narrowed that allowlist entry from `ur.com` to `ur.com/docs`. Replacing a
|
|
149
|
-
docs-only host with a bare domain widened what WebFetch retrieves without
|
|
150
|
-
asking, on a list whose own header warns that broad entries are dangerous
|
|
151
|
-
where a host may serve user-supplied content — and the domain in question
|
|
152
|
-
does not exist yet, so whatever ends up hosted there would have inherited
|
|
153
|
-
that trust. The matcher enforces path-segment boundaries, so `/docs-evil/x`
|
|
154
|
-
does not match. Caught by `apiTool`, which asserted the old entry.
|
|
155
|
-
|
|
156
|
-
## 1.68.8
|
|
157
|
-
|
|
158
|
-
- The bundled `ur-guide` agent no longer answers UR questions out of another
|
|
159
|
-
product's documentation. It instructed the model to fetch
|
|
160
|
-
`https://docs.claude.com/llms.txt` and present it to users as "UR SDK docs"
|
|
161
|
-
and "UR API docs", including the line "Agent SDK docs are part of the UR API
|
|
162
|
-
documentation at the same URL". Its other source, `docs.ur.dev`, was never
|
|
163
|
-
served. Both now resolve to `https://ur.com/docs`.
|
|
164
|
-
- Replaced the remaining 33 `docs.ur.dev` links across MCP help, the security
|
|
165
|
-
dialog, keybindings, settings validation tips, preflight checks and the
|
|
166
|
-
feedback survey. Two sandbox dialogs had been pointing their href at the new
|
|
167
|
-
domain while still displaying the old one.
|
|
168
|
-
- `docs.ur.dev` in the WebFetch preapproved-host allowlist now points at
|
|
169
|
-
ur.com. Changed on its own: it is a hostname the fetch tool trusts, not a
|
|
170
|
-
link.
|
|
171
|
-
- `KNOWN_AGENTS` listed `ur-code-guide`; the registered agent type is
|
|
172
|
-
`ur-guide`. A workflow naming the real agent was warned as unknown, while the
|
|
173
|
-
listed name would have been accepted despite resolving to nothing.
|
|
174
|
-
- Removed a dead `UR_CODE_DOCS_MAP_URL` export from `constants/prompts.ts` —
|
|
175
|
-
a duplicate of the live constant, imported by nothing.
|
|
176
|
-
- Added `test/docsUrlIntegrity.test.ts`, including a check that a link's
|
|
177
|
-
displayed text matches where it actually goes.
|
|
178
|
-
|
|
179
|
-
## 1.68.7
|
|
180
|
-
|
|
181
|
-
- Corrected the ur.ai -> ur.com replacement, which had rewritten identifiers as
|
|
182
|
-
well as URLs. `'ur.ai'` served two roles in this codebase: a domain in links
|
|
183
|
-
such as `https://ur.ai/settings/billing`, and a discriminant value in
|
|
184
|
-
`authTokenSource === 'ur.ai'`, `authMethod = 'ur.ai'` and
|
|
185
|
-
`source: 'ur.ai' as const`. A blanket replace changed both, which typechecked
|
|
186
|
-
and looked internally consistent but altered command availability — one
|
|
187
|
-
command that should have been hidden became visible, caught by
|
|
188
|
-
`commandRegistryIntegrity`. The 39 URLs now point at ur.com; the 11 auth
|
|
189
|
-
discriminants are back to their original values, which also keeps any
|
|
190
|
-
`"ur.ai"` already persisted in a user's auth state matching.
|
|
191
|
-
|
|
192
|
-
## 1.68.6
|
|
193
|
-
|
|
194
|
-
- An oversized Ollama request now recovers instead of only explaining itself.
|
|
195
|
-
1.68.3 reported "this request was 19.6 MB" clearly and then left the user to
|
|
196
|
-
run /compact by hand. UR already had both halves of the fix — `isMediaSizeError`
|
|
197
|
-
and `stripImagesFromMessages` — but both were wired to reactive compact's
|
|
198
|
-
retry, and REACTIVE_COMPACT is not compiled into any shipped build, so neither
|
|
199
|
-
was reachable. `isMediaSizeError` and `isMediaSizeErrorMessage` had no callers
|
|
200
|
-
at all outside their own file.
|
|
201
|
-
- On a body-size rejection the request is retried once with images from earlier
|
|
202
|
-
turns removed, keeping the most recent one. Stale attachments are the usual
|
|
203
|
-
bulk and the least valuable part of it: only the newest is normally still
|
|
204
|
-
under discussion.
|
|
205
|
-
- The retry is announced with both sizes and says to re-attach an earlier image
|
|
206
|
-
if it is needed. Dropping a user's attachments silently would be the same
|
|
207
|
-
invisible behaviour being fixed everywhere else.
|
|
208
|
-
- No retry is attempted when there is at most one image-bearing message, since
|
|
209
|
-
it would resend identical bytes and fail identically.
|
|
210
|
-
|
|
211
|
-
## 1.68.5
|
|
212
|
-
|
|
213
|
-
- Replaced every `ur.ai` reference in `src/` with `ur.com` (202 sites, 0 left).
|
|
214
|
-
Note what these are: most are upstream URL structures carried into the fork —
|
|
215
|
-
`/settings/billing`, `/settings/connectors`, `/upgrade/max`, `/chrome`,
|
|
216
|
-
`/chrome/reconnect`, `/admin-settings/usage`, and desktop auto-update
|
|
217
|
-
redirects like `/api/desktop/darwin/universal/dmg/latest/redirect`. Changing
|
|
218
|
-
the domain does not make those endpoints exist; it moves them to a domain UR
|
|
219
|
-
will control. The features behind them still need a backend or removal.
|
|
220
|
-
- `test/tipsAreReal.test.ts` still forbids `ur.ai` and `ur.com` in tips, since
|
|
221
|
-
the domain is not serving yet. Relax that deliberately once it is.
|
|
222
|
-
- Corrected a comment in that test which claimed both domains "have no DNS
|
|
223
|
-
records". That came from a lookup run where `github.com` and `example.com`
|
|
224
|
-
fail identically — the environment had no DNS — so it was never evidence.
|
|
225
|
-
|
|
226
|
-
## 1.68.4
|
|
227
|
-
|
|
228
|
-
- The status line now reports subagents running in the current turn:
|
|
229
|
-
`agents: 2 running`, separate from the existing background `tasks:` count.
|
|
230
|
-
`isBackgroundTask()` excludes foreground entries on purpose — it was narrowed
|
|
231
|
-
to stop stale ratios like `tasks: 0/4 active` outliving the work — but nothing
|
|
232
|
-
counted them instead, so while subagents ran the bar said nothing at all,
|
|
233
|
-
which is the one moment the number matters.
|
|
234
|
-
- Counted conservatively on purpose: a pending agent is not reported as running,
|
|
235
|
-
a backgrounded agent is not counted twice across both numbers, a foreground
|
|
236
|
-
shell is not labelled an agent, and zero renders nothing rather than
|
|
237
|
-
`agents: 0`. A wrong number in a status line is worse than a missing one.
|
|
238
|
-
- No tool count was added. A `toolCount` field was drafted and then removed
|
|
239
|
-
rather than shipped unpopulated; a meaningful count of in-flight tool calls
|
|
240
|
-
needs hooks into tool execution, and a static "tools registered" total is
|
|
241
|
-
noise.
|
|
242
|
-
|
|
243
|
-
## 1.68.3
|
|
244
|
-
|
|
245
|
-
- `Ollama request failed (400): http: request body too large` now explains
|
|
246
|
-
itself. That string comes from Go's `net/http` MaxBytesReader rejecting the
|
|
247
|
-
payload on **byte size**, which is a different limit from the model's context
|
|
248
|
-
window — so the token-based context warning added in 1.66.2 never fires for
|
|
249
|
-
it, and a couple of screenshots can breach it while the token estimate still
|
|
250
|
-
looks comfortable. The request body is now measured at the send site, and the
|
|
251
|
-
error reports its actual size, names images as the usual cause (base64 adds
|
|
252
|
-
roughly a third, and every image persists in the transcript on later turns),
|
|
253
|
-
offers `/compact` or a fresh session, and notes that a reverse proxy in front
|
|
254
|
-
of Ollama enforces its own limit (`client_max_body_size` for nginx) which
|
|
255
|
-
tuning Ollama would not affect.
|
|
256
|
-
- The classifier matches the 413 spellings a proxy returns as well as the Go
|
|
257
|
-
400, and is tested against unrelated 400s so it cannot replace a correct error
|
|
258
|
-
with confident, irrelevant advice.
|
|
259
|
-
|
|
260
|
-
## 1.68.2
|
|
261
|
-
|
|
262
|
-
- **Security: explicit file deny rules were not enforced.** `matchingRuleForInput`
|
|
263
|
-
resolved which permission rule matched a path by reading `igResult.rule.pattern`
|
|
264
|
-
from `ignore().test()`. That property does not exist — `TestResult` is
|
|
265
|
-
`{ ignored, unignored }` — and the access sat behind an `igResult.rule` guard,
|
|
266
|
-
so the guard was always false and the function returned `null` unconditionally.
|
|
267
|
-
Every caller (FileWriteTool, FileEditTool, FileReadTool, PowerShell path
|
|
268
|
-
validation, attachments, and the read/write permission checks themselves) does
|
|
269
|
-
`const denyRule = matchingRuleForInput(path, ctx, kind, 'deny'); if (denyRule)
|
|
270
|
-
{ deny }`, so a path the user had explicitly denied was reported as matching no
|
|
271
|
-
rule and allowed through. The comment above one call site reads "SECURITY: This
|
|
272
|
-
must come before any allow checks ... to prevent bypassing explicit read deny
|
|
273
|
-
rules"; the code beneath it had never run.
|
|
274
|
-
- The library cannot report which pattern matched, so resolution now tests
|
|
275
|
-
patterns individually after a combined fast-path check, and skips the empty
|
|
276
|
-
pattern that `/**` reduces to — which would otherwise deny every path.
|
|
277
|
-
- `filesystem.ts` and `toolExecution.ts` are off `@ts-nocheck` (149 files remain).
|
|
278
|
-
The missing property was invisible to `tsc` for exactly as long as the
|
|
279
|
-
suppression was there; this is the defect the ratchet in 1.68.0 was added for.
|
|
280
|
-
- Added `test/denyRuleMatching.test.ts`, which asserts the negative case as well
|
|
281
|
-
as the positive — the bug made *everything* return `null`, so "returns null for
|
|
282
|
-
an unmatched path" proves nothing on its own.
|
|
283
|
-
|
|
284
|
-
## 1.68.1
|
|
285
|
-
|
|
286
|
-
- A detected prompt-injection attempt is now reported to the user instead of
|
|
287
|
-
being refused in silence. Consolidating the scattered prompt guidance into the
|
|
288
|
-
execution contract was a genuine improvement, but one clause did not survive:
|
|
289
|
-
the older text said to "flag it directly to the user", and the replacement
|
|
290
|
-
told the model to refuse embedded directives and stopped there. So
|
|
291
|
-
`scanForInjection` would correctly flag hostile content, annotate the model's
|
|
292
|
-
own copy of the block, write an evidence-ledger entry — and say nothing to the
|
|
293
|
-
person whose fetched page or issue comment was carrying the attack. The
|
|
294
|
-
detection was never the weak part; the reporting was.
|
|
295
|
-
|
|
296
|
-
## 1.68.0
|
|
297
|
-
|
|
298
|
-
- Removed `@ts-nocheck` from 73 files, putting 21,503 previously unchecked lines
|
|
299
|
-
under `tsc`. Every one of those files produced **zero** errors once the
|
|
300
|
-
suppression was lifted — they were not suppressed because they were broken,
|
|
301
|
-
they were suppressed and then fixed, or never needed it. The blind spot was
|
|
302
|
-
33% larger than the actual debt. Typecheck remains clean at exit 0.
|
|
303
|
-
- Added `test/typeCheckCoverage.test.ts`, a ratchet: the `@ts-nocheck` count may
|
|
304
|
-
fall but never rise, and the budget must be lowered when files come off the
|
|
305
|
-
list so it cannot silently stop ratcheting. It also asserts that `query.ts`,
|
|
306
|
-
`permissions.ts`, `filesystem.ts` and `toolExecution.ts` are still suppressed
|
|
307
|
-
— a standing reminder that the highest-consequence files are the unchecked
|
|
308
|
-
ones, with instructions to delete the test when that stops being true.
|
|
309
|
-
- Remaining debt, measured rather than estimated: 150 files, ~870 errors, but
|
|
310
|
-
concentrated — 3 files hold 231 of them, while 95 files have 3 or fewer each
|
|
311
|
-
and 135 have 10 or fewer. Of the total, 32 are dead build-constant comparisons
|
|
312
|
-
from the fork (`'external' === 'ant'`) and 562 are property-access-on-`any`.
|
|
313
|
-
The 95 cheap files are the next batch.
|
|
314
|
-
|
|
315
|
-
- Restored the worked examples in the TodoWrite tool prompt, with their
|
|
316
|
-
narrated tool use removed. After 1.65.5 that
|
|
317
|
-
prompt was cut from 184 lines to 48, which removed every demonstration and
|
|
318
|
-
left only abstract rules ("work is non-trivial when it needs planning,
|
|
319
|
-
investigation, multiple deliverables..."). A large model infers intent from
|
|
320
|
-
rules; a small local model pattern-matches on examples. Task lists stopped
|
|
321
|
-
being produced, and the task-list gate was then hardened over five successive
|
|
322
|
-
commits to force what the prompt no longer taught — which is what produced
|
|
323
|
-
refused writes and retry loops on small models. The newer lifecycle rules are
|
|
324
|
-
good and are kept; what returns is seven worked examples covering when to use
|
|
325
|
-
the list, when not to, and why, including the single-file case where one Write
|
|
326
|
-
call still warrants a plan.
|
|
327
|
-
|
|
328
|
-
### Also in this release (was staged as 1.67.0)
|
|
329
|
-
|
|
330
|
-
- Two subsystems loaded behind feature flags were not merely disabled, they
|
|
331
|
-
were broken in a way that only showed if you enabled them.
|
|
332
|
-
`services/compact/reactiveCompact.ts` did not exist on disk at all, yet
|
|
333
|
-
`query.ts` requires it by path and `/compact` calls two functions on it;
|
|
334
|
-
`services/contextCollapse/index.ts` was a stub exporting four names while
|
|
335
|
-
`query.ts` called four different ones, three of which were absent. Setting
|
|
336
|
-
either flag would have failed on the first turn with MODULE_NOT_FOUND or
|
|
337
|
-
"is not a function" rather than degrading to "feature off". Both modules now
|
|
338
|
-
export the full surface their callers use, returning result-shaped objects
|
|
339
|
-
instead of null so property access on the result cannot throw.
|
|
340
|
-
- Neither was reachable in shipped builds — the bundler passes only VOICE_MODE
|
|
341
|
-
and CHICAGO_MCP, and live context management runs through
|
|
342
|
-
`services/compact/autoCompact.ts`, which is real and unaffected.
|
|
343
|
-
- Added `test/optionalSubsystems.test.ts`, which derives the required exports
|
|
344
|
-
from what `query.ts` actually calls rather than from a hand-written list, so
|
|
345
|
-
a new call site cannot reintroduce the gap. It also asserts autoCompact has
|
|
346
|
-
not itself become a stub.
|
|
347
|
-
- Audit note: 223 files carry `@ts-nocheck` and are invisible to
|
|
348
|
-
`tsc --noEmit`. Stripping the suppressions in a scratch copy surfaces 872
|
|
349
|
-
errors across ~108k lines, including `query.ts`, `permissions.ts` and
|
|
350
|
-
`filesystem.ts`. Both defects above sat inside that blind spot.
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
- The original examples narrated tool use as prose ("* Uses the Edit tool to
|
|
354
|
-
add a comment *", "*Executes: npm install*"), which is the exact anti-pattern
|
|
355
|
-
the same prompt forbids in its closing paragraph — and what a small model
|
|
356
|
-
copies when it reports a file as written without calling Write. That is why
|
|
357
|
-
the examples were cut, and cutting them was not baseless; it just took the
|
|
358
|
-
decision guidance with it. They now return without the narration.
|
|
359
|
-
|
|
360
|
-
## 1.66.2
|
|
361
|
-
|
|
362
|
-
- A long session on Ollama now says when it has run out of context instead of
|
|
363
|
-
quietly getting worse. Ollama truncates an oversized prompt from the front
|
|
364
|
-
rather than returning an error, and the front of the prompt is the system
|
|
365
|
-
prompt — so the first thing discarded is the instruction set. The model then
|
|
366
|
-
answers with no tool guidance and no task-list requirement, which from the
|
|
367
|
-
outside looks like the model degrading on long prompts rather than like
|
|
368
|
-
context running out. Both numbers needed to detect this were already computed
|
|
369
|
-
on every request; they were never compared. A near-full context now warns at
|
|
370
|
-
85% and a full one explains what was dropped and offers `/compact`, a fresh
|
|
371
|
-
session, a larger-context model, or `UR_OLLAMA_NUM_CTX`.
|
|
372
|
-
- Added `test/contextPressure.test.ts`, including that unknown sizing produces
|
|
373
|
-
no warning — an unmeasured context is not a full one.
|
|
374
|
-
|
|
375
|
-
## 1.66.1
|
|
376
|
-
|
|
377
|
-
- Corrected the warning-state result used by reactive compaction and context
|
|
378
|
-
collapse when a custom proactive threshold is configured. Their
|
|
379
|
-
effective-window override can no longer report that the separate proactive
|
|
380
|
-
auto-compact trigger was crossed.
|
|
381
|
-
|
|
382
|
-
## 1.66.0
|
|
383
|
-
|
|
384
|
-
- Unified proactive compaction around one model-aware threshold and one live
|
|
385
|
-
token estimator. Small context windows now retain positive warning, error,
|
|
386
|
-
and trigger thresholds; configured 50–95% thresholds are honored; prompt
|
|
387
|
-
notifications, `/context`, and the SDK expose a clamped live-estimated
|
|
388
|
-
percentage remaining until the real trigger; reactive/collapse modes do not
|
|
389
|
-
claim a false
|
|
390
|
-
countdown; and successful compaction clears stale warnings.
|
|
391
|
-
- Preserved exact task execution state across full, partial, and
|
|
392
|
-
session-memory compaction. The restored authoritative snapshot keeps Task V2
|
|
393
|
-
IDs, statuses, owners, and dependency edges (or TodoWrite order/status),
|
|
394
|
-
prioritizes actionable work under 64-record and estimated 6,000-token
|
|
395
|
-
bounds, and requires `TaskList` before mutations when records were omitted.
|
|
396
|
-
- Closed a task-gate bypass caused by compacted history. Compact boundaries
|
|
397
|
-
now carry durable metadata that consumes the initial trivial-call allowance,
|
|
398
|
-
including SDK serialization, so a model cannot compact and then mutate as
|
|
399
|
-
though no earlier tool calls occurred.
|
|
400
|
-
- Removed a competing private compaction path from in-process workers. Workers
|
|
401
|
-
now use the normal agent query loop and therefore inherit the same feature
|
|
402
|
-
flags, exact trigger, session-memory-first path, reactive/collapse policy,
|
|
403
|
-
failure circuit breaker, cleanup, and compact-boundary behavior.
|
|
404
|
-
- Brought Kimi/Ollama bare task-call recovery into parity with the live task
|
|
405
|
-
schemas. Dependency fields, numeric task/dependency IDs, and `failed` or
|
|
406
|
-
`skipped` terminal updates are normalized safely; invalid IDs, statuses, and
|
|
407
|
-
unknown fields fail closed.
|
|
408
|
-
- Audited v1.65.0 through v1.65.5 for regression-safe enhancements. Every
|
|
409
|
-
concrete earlier technique is already present or superseded by stricter
|
|
410
|
-
current behavior, so no legacy implementation or removed feature was copied
|
|
411
|
-
back.
|
|
412
|
-
|
|
413
|
-
## 1.65.14
|
|
414
|
-
|
|
415
|
-
- Restored the proactive task-first behavior that was present in v1.65.0 and
|
|
416
|
-
removed a prompt/gate contradiction introduced later. For any non-trivial
|
|
417
|
-
state change, including a feature-rich single-file build, the model is now
|
|
418
|
-
told at system, task-tool, approved-plan, Ollama/Kimi, file, notebook,
|
|
419
|
-
shell, and worker boundaries to complete the available task setup, inspect
|
|
420
|
-
its result, mark the selected task `in_progress`, inspect that result, and
|
|
421
|
-
only then mutate state.
|
|
422
|
-
- Made the ordering unambiguous for weaker models: task setup cannot be batched
|
|
423
|
-
with the mutation it enables, approved-plan handoffs require task calls as
|
|
424
|
-
the next state-changing calls, terminal task lists must be reopened or
|
|
425
|
-
extended before new work, and task guidance appears before file-tool
|
|
426
|
-
selection guidance.
|
|
427
|
-
- Closed planner availability and control-flow gaps across tool modes. Legacy
|
|
428
|
-
`TodoWrite` now follows the same feature-rich/terminal-list lifecycle and is
|
|
429
|
-
preferred when Task V2 is incomplete; bare/simple, REPL-simple, coordinator,
|
|
430
|
-
custom-agent, and override-prompt paths all receive a usable planner and the
|
|
431
|
-
task-state contract. Coordinator workers must be task-bound before launch;
|
|
432
|
-
an explicitly planner-less custom tool pool now fails closed with honest
|
|
433
|
-
configuration recovery instead of naming a missing tool.
|
|
434
|
-
- Prevented task-gate deadlocks and false mutations in supporting tools.
|
|
435
|
-
Team creation/deletion, shutdown/plan control messages, and emergency task
|
|
436
|
-
stop are narrow control transitions; skill loading and desktop screenshots
|
|
437
|
-
are read-only while downstream skill work, desktop input, and arbitrary
|
|
438
|
-
state-changing tools remain gated.
|
|
439
|
-
|
|
440
|
-
## 1.65.13
|
|
441
|
-
|
|
442
|
-
- Recovered otherwise valid `AskUserQuestion` calls whose UI header exceeds
|
|
443
|
-
the 12-character chip width. Native structured calls, bare/wrapped JSON, and
|
|
444
|
-
explicit-choice recovery now compact only that bounded presentation field;
|
|
445
|
-
questions, choices, labels, descriptions, previews, metadata, and selection
|
|
446
|
-
behavior remain unchanged, while unsafe or grossly oversized headers still
|
|
447
|
-
fail validation.
|
|
448
|
-
- Allowed strictly parsed syntax verification after a task-free one-shot
|
|
449
|
-
Write. `node --check <file>` and the bounded transcript-produced HTML script
|
|
450
|
-
checker bypass only the task-list requirement; arbitrary Node evaluation,
|
|
451
|
-
extra commands, redirects, backgrounding, sandbox overrides, and
|
|
452
|
-
permission-time rewrites fail closed, and normal Bash permission/sandbox
|
|
453
|
-
checks still apply.
|
|
454
|
-
|
|
455
|
-
## 1.65.12
|
|
456
|
-
|
|
457
|
-
- Forced explicit weak-model decision menus through the real
|
|
458
|
-
`AskUserQuestion` UI. A provider-neutral end-turn guard accepts only one
|
|
459
|
-
canonical Ask object from explicit reasoning or one complete rigid Markdown
|
|
460
|
-
choice menu, validates it unchanged against the live tool schema, and rejects
|
|
461
|
-
examples, ambiguity, ordinary prose, workers, and headless sessions.
|
|
462
|
-
- Removed two task-list dead ends without weakening the mutation boundary.
|
|
463
|
-
Live plan mode may run only the exact current plan-directory bootstrap Bash
|
|
464
|
-
shape before tasks exist, and the last actionable task remains `in_progress`
|
|
465
|
-
when a file mutation has no later successful observable check. The same task
|
|
466
|
-
can then be verified or corrected instead of creating a duplicate.
|
|
467
|
-
- Improved exact `Edit` mismatch recovery for stale HTML blocks. Diagnostics
|
|
468
|
-
now select the most distinctive verified line near the real target, such as
|
|
469
|
-
`<script>`, rather than an unrelated generic closing tag; edits remain
|
|
470
|
-
fail-closed and never apply fuzzy replacements.
|
|
471
|
-
- Raised the default Ollama Cloud timeout for the known-slow Kimi K2.7 family
|
|
472
|
-
from 120 to 300 seconds in both streaming and permitted non-streaming paths.
|
|
473
|
-
Explicit timeouts and the stricter remote-session ceiling still take
|
|
474
|
-
precedence.
|
|
475
|
-
|
|
476
|
-
## 1.65.11
|
|
477
|
-
|
|
478
|
-
- Hardened `AskUserQuestion` for weaker models without inventing user intent.
|
|
479
|
-
Its model schema now exposes only a strict 1–4-question request shape with
|
|
480
|
-
2–8 nested choices, compact validation explains malformed flat arrays, and
|
|
481
|
-
lossless recovery never fabricates labels, descriptions, or prose-derived
|
|
482
|
-
questions.
|
|
483
|
-
- Made question interaction truthful and safe. Answers are accepted only after
|
|
484
|
-
post-permission validation has collected one real response per question,
|
|
485
|
-
custom `Other` works in both menu layouts, question-keyed UI state is
|
|
486
|
-
prototype-safe, and HTML-configured previews render escaped inert text
|
|
487
|
-
instead of executable model markup.
|
|
488
|
-
- Improved weak-model file-tool recovery. `Write` now explains that
|
|
489
|
-
`file_path` and complete `content` must be supplied together and never treats
|
|
490
|
-
surrounding prose as file data; a narrow deletion-only `Edit` whose desired
|
|
491
|
-
replacement is already uniquely present reports “already up to date” without
|
|
492
|
-
writing, while ambiguous and general stale edits still fail closed.
|
|
493
|
-
- Corrected task-gate control flow and diagnostics. `ExitPlanMode` can reach
|
|
494
|
-
its approval transition without an implementation task, stale out-of-mode
|
|
495
|
-
calls remain invalid, and gate recovery distinguishes a missing plan from an
|
|
496
|
-
all-terminal task list so unfinished Edit/Bash work is reopened rather than
|
|
497
|
-
retried unchanged. A simple loopback browser preview bypasses only the task
|
|
498
|
-
gate while retaining Bash permission and rewrite checks.
|
|
499
|
-
- Kept package validation compatible with both npm 11 and npm 12
|
|
500
|
-
`npm pack --json` output shapes, so upgrading npm does not make a valid
|
|
501
|
-
tarball look missing during tests or release checks.
|
|
502
|
-
|
|
503
|
-
## 1.65.10
|
|
504
|
-
|
|
505
|
-
- Reworked approved-plan execution into a capability-aware task graph. Plans
|
|
506
|
-
now split separately completable outcomes, keep genuinely atomic work whole,
|
|
507
|
-
express review-to-fix and verification dependencies, and launch only ready,
|
|
508
|
-
non-conflicting work in parallel waves of at most eight. The handoff uses
|
|
509
|
-
`TaskCreate`/`TaskUpdate`, `TodoWrite`, or the numbered plan according to the
|
|
510
|
-
tools actually available, and never advertises a worker that is not active.
|
|
511
|
-
- Made the built-in Explore and Plan agents available in the standard CLI with
|
|
512
|
-
structurally read-only tools. Parent and child execution boundaries reject
|
|
513
|
-
mutations even after permission-hook rewrites, custom agents cannot inherit
|
|
514
|
-
the exemption by reusing a name, and team creation/deletion rechecks live
|
|
515
|
-
plan mode before changing state.
|
|
516
|
-
- Task tools now accept positive safe-integer JSON task IDs as well as strings
|
|
517
|
-
and normalize them to canonical persisted strings, fixing smaller models
|
|
518
|
-
that call `TaskUpdate` with `taskId: 1`.
|
|
519
|
-
- Exact edit failures now return a bounded preview and a verified line anchor
|
|
520
|
-
for a fresh, smaller contiguous match. Large cross-section replacements fail
|
|
521
|
-
closed with actionable recovery instead of retrying unchanged or applying a
|
|
522
|
-
risky fuzzy edit.
|
|
523
|
-
|
|
524
|
-
## 1.65.9
|
|
525
|
-
|
|
526
|
-
- Fixed the plan-file/task-list deadlock. While plan mode is active, the exact
|
|
527
|
-
normalized session plan file can be written before actionable tasks exist;
|
|
528
|
-
ordinary workspace mutations still require `TaskCreate`/`TodoWrite`, and
|
|
529
|
-
permission or hook rewrites are reclassified at the final execution boundary.
|
|
530
|
-
- Fixed `ExitPlanMode` approval races. Permission approval can change the mode
|
|
531
|
-
and rewrite allowed prompts or edited plan content without causing a false
|
|
532
|
-
“not in plan mode” error, while genuinely new out-of-mode calls remain
|
|
533
|
-
rejected. The compact execution contract now distinguishes ordered task
|
|
534
|
-
tracking from explicit plan mode for weaker models.
|
|
535
|
-
- Fixed Linux GitHub Actions and release validation without misrepresenting the
|
|
536
|
-
product surface. Registry checks now use the platform-neutral
|
|
537
|
-
167-command/160-visible/235-token baseline and verify the supported macOS and
|
|
538
|
-
x64 Windows `/desktop` (`/app`) delta separately.
|
|
539
|
-
|
|
540
|
-
## 1.65.8
|
|
541
|
-
|
|
542
|
-
- Fixed provider API-key entry in `/model`: the masked input now uses the
|
|
543
|
-
available terminal width, explicit cursor/focus state, and a one-line secret
|
|
544
|
-
viewport instead of rendering one masked character per row. Narrow and
|
|
545
|
-
invalid resize states retain a safe minimum width.
|
|
546
|
-
|
|
547
|
-
## 1.65.7
|
|
548
|
-
|
|
549
|
-
- Audited all 14 technical chapters against the shipped source and generated
|
|
550
|
-
CLI. The manual now distinguishes public runtime behavior from compile-time
|
|
551
|
-
flags, compatibility-only state, and source helpers; it is included in the
|
|
552
|
-
npm package and checked for valid paths, commands, configuration, and package
|
|
553
|
-
coverage.
|
|
554
|
-
- Reworked agent guidance into one compact, ordered execution contract plus
|
|
555
|
-
mode-specific code, research, debug, browser, image, video, and data
|
|
556
|
-
workflows. Structured tool calls, dependency-aware planning, bounded
|
|
557
|
-
parallelism, failure recovery, result inspection, verification, honest
|
|
558
|
-
completion, and prompt-injection boundaries remain explicit without unsafe
|
|
559
|
-
package-manager guesses or examples that merely narrate fake tool calls.
|
|
560
|
-
- Hardened task execution end to end. Both Task V2 and legacy TodoWrite plans
|
|
561
|
-
participate in mutation and completion gates, task order is numeric and
|
|
562
|
-
dependency-aware, failed/skipped states are rendered honestly, and the
|
|
563
|
-
verifier refuses an overall completion while actionable work remains or task
|
|
564
|
-
state cannot be read.
|
|
565
|
-
- Workflow execution now checks approval before invoking a side effect,
|
|
566
|
-
enforces verification unless explicitly advisory, records every settled
|
|
567
|
-
parallel branch, and persists progress atomically. Resume restores bounded
|
|
568
|
-
exact dependency outputs without replaying completed steps; missing or
|
|
569
|
-
oversized required output fails closed and explains how to recover.
|
|
570
|
-
- Multi-agent crews and planned `/exec` runs use bounded parallel workers,
|
|
571
|
-
dependency fan-in, exact verdicts, cancellation-aware respawn, isolated retry
|
|
572
|
-
worktrees, and a shared-checkout write gate. Ambiguous side effects are not
|
|
573
|
-
replayed, per-prompt worktrees keep dependent steps together, and concurrent
|
|
574
|
-
output files cannot overwrite one another.
|
|
575
|
-
- Fixed false-success and argument-parsing behavior across root and slash
|
|
576
|
-
commands. Invalid usage returns 2, failed operations return 1, child process
|
|
577
|
-
failures propagate, previews do not mutate, and claim-ledger persistence is
|
|
578
|
-
structurally validated, workspace-contained, private, atomic, and bounded.
|
|
579
|
-
- Strengthened provider and tool-call interoperability for smaller/local
|
|
580
|
-
models: streamed calls keep stable ordinals, cumulative fragments are
|
|
581
|
-
deduplicated conservatively, malformed or rewritten inputs are revalidated,
|
|
582
|
-
Ollama image results and session-host overrides are preserved, and OpenAI
|
|
583
|
-
Responses transport settings now reach actual client selection.
|
|
584
|
-
- Improved terminal task UX: live task/status displays use the selected
|
|
585
|
-
session model, show only actionable or active background work, preserve
|
|
586
|
-
selection as rows change, handle narrow terminals, expose blockers and every
|
|
587
|
-
terminal status, and never advertise blocked work as the next action.
|
|
588
|
-
- Hardened session, export, research, notes, file-operation, worktree, and
|
|
589
|
-
sandbox paths against traversal, symlink escape, oversized/corrupt state,
|
|
590
|
-
interrupted writes, stale replay, and misleading success. Unsupported
|
|
591
|
-
workflow/monitor task implementations remain inspectable as history but are
|
|
592
|
-
no longer presented as runnable.
|
|
593
|
-
- Added a typed `ur-agent/sdk` subpath for ESM and CommonJS with validated
|
|
594
|
-
subprocess inputs, deterministic JSON/NDJSON result parsing, environment
|
|
595
|
-
precedence, and nonzero-exit handling. Release gates rebuild generated
|
|
596
|
-
artifacts before publish, smoke-test both SDK module formats from the packed
|
|
597
|
-
tarball, require the technical manual, and verify runtime dependency ranges.
|
|
3
|
+
## 1.69.0
|
|
4
|
+
|
|
5
|
+
- Rolled the codebase back to the state shipped as 1.65.6. Everything released
|
|
6
|
+
between 1.65.7 and 1.68.19 is withdrawn from this line. The version number
|
|
7
|
+
moves forward rather than back so npm and existing installs upgrade cleanly.
|
|
8
|
+
- No functional change relative to 1.65.6. Commit history for the withdrawn
|
|
9
|
+
releases is retained and any part of it can be reintroduced in a later
|
|
10
|
+
release.
|
|
11
|
+
- Fixed the packaged-CLI smoke check failing on npm 11 and later. It read the
|
|
12
|
+
`npm pack --json` report as an array, but npm now returns an object keyed by
|
|
13
|
+
package name, so a successful pack was reported as "npm pack did not report a
|
|
14
|
+
tarball" and the release gate failed on every modern npm. Both shapes are now
|
|
15
|
+
accepted. The check lives in `scripts/`, which is not published, so the
|
|
16
|
+
released artifact is unaffected.
|
|
598
17
|
|
|
599
18
|
## 1.65.6
|
|
600
19
|
|
package/README.md
CHANGED
|
@@ -549,11 +549,10 @@ ur plugin disable <plugin>
|
|
|
549
549
|
manifest and reports its declared components and capability surface, so you can
|
|
550
550
|
review what a plugin touches before enabling it.
|
|
551
551
|
|
|
552
|
-
The npm package includes `README.md`, `QUALITY.md`, `docs/`, `
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
[Plugin Guide](docs/plugins.md).
|
|
552
|
+
The npm package includes `README.md`, `QUALITY.md`, `docs/`, `documentation/`,
|
|
553
|
+
and `plugins/`, so the npm package page and installed artifact both carry the
|
|
554
|
+
marketplace documentation, core plugins, community staging directory, and
|
|
555
|
+
example plugin template. See [Plugin Guide](docs/plugins.md).
|
|
557
556
|
|
|
558
557
|
UR also documents the core Cursor-style agent primitives as first-class,
|
|
559
558
|
project-backed features: Agent surfaces (`ur`, `ur agents`, `ur crew`, `ur bg`),
|