Releases: Maitham16/UR
Release list
UR-Nexus 1.68.18
-
The shell is presentational and imports only ink and useTerminalSize. A first
version read live state itself (settings, provider registry, app state, git),
and importing it from REPL changed REPL's module graph enough to flip a
command from hidden to visible — caught bycommandRegistryIntegrity, which
passed with the REPL edit stashed and failed with it applied. Loading a module
is not free here; some register on load. Session values now arrive as props
from a caller that already holds them. -
Reconstructed three more stub type files, clearing 177 further errors:
keybindings/types.ts(six empty interfaces),ink/cursor.ts, and
commands/plugin/unifiedTypes.ts. Same defect as the MCP types in 1.68.14 —
an empty interface means "has no members" to TypeScript, not "shape unknown",
so every property access on one was an error and the consuming files carried
@ts-nocheckas a result. -
KeybindingBlock.bindingsis keyed by chord string, not an array. A first
attempt typed itParsedBinding[], which made every entry in the default
binding table an error — the declaration form ('ctrl+d': 'app:exit') and the
parsed form (chord resolved into keystrokes) are different shapes, and
conflating them broke a file that had been fine. -
KeybindingActionis a string rather than a union of known actions:
defaultBindings.tsassembles entries conditionally from feature flags, so a
value missing from a union would turn a working binding into an error. -
Suppression list: 140 -> 132. Eight keybinding and ink files came off.
-
Totals for the sweep so far: 223 -> 132 files, 868 -> 563 errors, and almost
none of it file-by-file. Four stub files accounted for 258 errors on their
own.
UR-Nexus 1.68.10
ToolSearchToolno longer registers on runtimes where it cannot work. Its
purpose is fetching schemas for tools whose definitions were deferred, and
deferral needs the runtime to expandtool_referenceblocks — an
Anthropic-native beta shape that no UR runtime supports (UR runs on Ollama,
OpenAI-compatible servers and vendor CLIs).isEnabled()consulted only
isToolSearchEnabledOptimistic(), which reads the mode, and the mode
defaults to'tst'(on). The tool therefore registered on every run: its
description shipped with each request, and the model was offered a tool that
could not function, because nothing was ever deferred for it to fetch.- Audit note on the surface as a whole: 168 commands, of which 8 touch a
feature flag that is not compiled in, and in each case the flag gates a
sub-feature rather than the command. 89 of 91 flags are absent from shipped
builds. Two of those (CONTEXT_COLLAPSE,REACTIVE_COMPACT) would have
failed on the first turn if enabled and were fixed in 1.68.2.
UR-Nexus 1.68.9
- Narrowed that allowlist entry from
ur.comtour.com/docs. Replacing a
docs-only host with a bare domain widened what WebFetch retrieves without
asking, on a list whose own header warns that broad entries are dangerous
where a host may serve user-supplied content — and the domain in question
does not exist yet, so whatever ends up hosted there would have inherited
that trust. The matcher enforces path-segment boundaries, so/docs-evil/x
does not match. Caught byapiTool, which asserted the old entry.
UR-Nexus 1.68.7
- Corrected the ur.ai -> ur.com replacement, which had rewritten identifiers as
well as URLs.'ur.ai'served two roles in this codebase: a domain in links
such ashttps://ur.ai/settings/billing, and a discriminant value in
authTokenSource === 'ur.ai',authMethod = 'ur.ai'and
source: 'ur.ai' as const. A blanket replace changed both, which typechecked
and looked internally consistent but altered command availability — one
command that should have been hidden became visible, caught by
commandRegistryIntegrity. The 39 URLs now point at ur.com; the 11 auth
discriminants are back to their original values, which also keeps any
"ur.ai"already persisted in a user's auth state matching.
UR-Nexus 1.68.3
Ollama request failed (400): http: request body too largenow explains
itself. That string comes from Go'snet/httpMaxBytesReader rejecting the
payload on byte size, which is a different limit from the model's context
window — so the token-based context warning added in 1.66.2 never fires for
it, and a couple of screenshots can breach it while the token estimate still
looks comfortable. The request body is now measured at the send site, and the
error reports its actual size, names images as the usual cause (base64 adds
roughly a third, and every image persists in the transcript on later turns),
offers/compactor a fresh session, and notes that a reverse proxy in front
of Ollama enforces its own limit (client_max_body_sizefor nginx) which
tuning Ollama would not affect.- The classifier matches the 413 spellings a proxy returns as well as the Go
400, and is tested against unrelated 400s so it cannot replace a correct error
with confident, irrelevant advice.
UR-Nexus 1.68.0
-
Removed
@ts-nocheckfrom 73 files, putting 21,503 previously unchecked lines
undertsc. Every one of those files produced zero errors once the
suppression was lifted — they were not suppressed because they were broken,
they were suppressed and then fixed, or never needed it. The blind spot was
33% larger than the actual debt. Typecheck remains clean at exit 0. -
Added
test/typeCheckCoverage.test.ts, a ratchet: the@ts-nocheckcount may
fall but never rise, and the budget must be lowered when files come off the
list so it cannot silently stop ratcheting. It also asserts thatquery.ts,
permissions.ts,filesystem.tsandtoolExecution.tsare still suppressed
— a standing reminder that the highest-consequence files are the unchecked
ones, with instructions to delete the test when that stops being true. -
Remaining debt, measured rather than estimated: 150 files, ~870 errors, but
concentrated — 3 files hold 231 of them, while 95 files have 3 or fewer each
and 135 have 10 or fewer. Of the total, 32 are dead build-constant comparisons
from the fork ('external' === 'ant') and 562 are property-access-on-any.
The 95 cheap files are the next batch. -
Restored the worked examples in the TodoWrite tool prompt, with their
narrated tool use removed. After 1.65.5 that
prompt was cut from 184 lines to 48, which removed every demonstration and
left only abstract rules ("work is non-trivial when it needs planning,
investigation, multiple deliverables..."). A large model infers intent from
rules; a small local model pattern-matches on examples. Task lists stopped
being produced, and the task-list gate was then hardened over five successive
commits to force what the prompt no longer taught — which is what produced
refused writes and retry loops on small models. The newer lifecycle rules are
good and are kept; what returns is seven worked examples covering when to use
the list, when not to, and why, including the single-file case where one Write
call still warrants a plan.
Also in this release (was staged as 1.67.0)
-
Two subsystems loaded behind feature flags were not merely disabled, they
were broken in a way that only showed if you enabled them.
services/compact/reactiveCompact.tsdid not exist on disk at all, yet
query.tsrequires it by path and/compactcalls two functions on it;
services/contextCollapse/index.tswas a stub exporting four names while
query.tscalled four different ones, three of which were absent. Setting
either flag would have failed on the first turn with MODULE_NOT_FOUND or
"is not a function" rather than degrading to "feature off". Both modules now
export the full surface their callers use, returning result-shaped objects
instead of null so property access on the result cannot throw. -
Neither was reachable in shipped builds — the bundler passes only VOICE_MODE
and CHICAGO_MCP, and live context management runs through
services/compact/autoCompact.ts, which is real and unaffected. -
Added
test/optionalSubsystems.test.ts, which derives the required exports
from whatquery.tsactually calls rather than from a hand-written list, so
a new call site cannot reintroduce the gap. It also asserts autoCompact has
not itself become a stub. -
Audit note: 223 files carry
@ts-nocheckand are invisible to
tsc --noEmit. Stripping the suppressions in a scratch copy surfaces 872
errors across ~108k lines, includingquery.ts,permissions.tsand
filesystem.ts. Both defects above sat inside that blind spot. -
The original examples narrated tool use as prose ("* Uses the Edit tool to
add a comment *", "Executes: npm install"), which is the exact anti-pattern
the same prompt forbids in its closing paragraph — and what a small model
copies when it reports a file as written without calling Write. That is why
the examples were cut, and cutting them was not baseless; it just took the
decision guidance with it. They now return without the narration.
UR-Nexus 1.67.0
- Two subsystems loaded behind feature flags were not merely disabled, they
were broken in a way that only showed if you enabled them.
services/compact/reactiveCompact.tsdid not exist on disk at all, yet
query.tsrequires it by path and/compactcalls two functions on it;
services/contextCollapse/index.tswas a stub exporting four names while
query.tscalled four different ones, three of which were absent. Setting
either flag would have failed on the first turn with MODULE_NOT_FOUND or
"is not a function" rather than degrading to "feature off". Both modules now
export the full surface their callers use, returning result-shaped objects
instead of null so property access on the result cannot throw. - Neither was reachable in shipped builds — the bundler passes only VOICE_MODE
and CHICAGO_MCP, and live context management runs through
services/compact/autoCompact.ts, which is real and unaffected. - Added
test/optionalSubsystems.test.ts, which derives the required exports
from whatquery.tsactually calls rather than from a hand-written list, so
a new call site cannot reintroduce the gap. It also asserts autoCompact has
not itself become a stub. - Audit note: 223 files carry
@ts-nocheckand are invisible to
tsc --noEmit. Stripping the suppressions in a scratch copy surfaces 872
errors across ~108k lines, includingquery.ts,permissions.tsand
filesystem.ts. Both defects above sat inside that blind spot.
UR-Nexus 1.66.1
- Corrected the warning-state result used by reactive compaction and context
collapse when a custom proactive threshold is configured. Their
effective-window override can no longer report that the separate proactive
auto-compact trigger was crossed.
UR-Nexus 1.65.14
- Restored the proactive task-first behavior that was present in v1.65.0 and
removed a prompt/gate contradiction introduced later. For any non-trivial
state change, including a feature-rich single-file build, the model is now
told at system, task-tool, approved-plan, Ollama/Kimi, file, notebook,
shell, and worker boundaries to complete the available task setup, inspect
its result, mark the selected taskin_progress, inspect that result, and
only then mutate state. - Made the ordering unambiguous for weaker models: task setup cannot be batched
with the mutation it enables, approved-plan handoffs require task calls as
the next state-changing calls, terminal task lists must be reopened or
extended before new work, and task guidance appears before file-tool
selection guidance. - Closed planner availability and control-flow gaps across tool modes. Legacy
TodoWritenow follows the same feature-rich/terminal-list lifecycle and is
preferred when Task V2 is incomplete; bare/simple, REPL-simple, coordinator,
custom-agent, and override-prompt paths all receive a usable planner and the
task-state contract. Coordinator workers must be task-bound before launch;
an explicitly planner-less custom tool pool now fails closed with honest
configuration recovery instead of naming a missing tool. - Prevented task-gate deadlocks and false mutations in supporting tools.
Team creation/deletion, shutdown/plan control messages, and emergency task
stop are narrow control transitions; skill loading and desktop screenshots
are read-only while downstream skill work, desktop input, and arbitrary
state-changing tools remain gated.
UR-Nexus 1.65.13
- Recovered otherwise valid
AskUserQuestioncalls whose UI header exceeds
the 12-character chip width. Native structured calls, bare/wrapped JSON, and
explicit-choice recovery now compact only that bounded presentation field;
questions, choices, labels, descriptions, previews, metadata, and selection
behavior remain unchanged, while unsafe or grossly oversized headers still
fail validation. - Allowed strictly parsed syntax verification after a task-free one-shot
Write.node --check <file>and the bounded transcript-produced HTML script
checker bypass only the task-list requirement; arbitrary Node evaluation,
extra commands, redirects, backgrounding, sandbox overrides, and
permission-time rewrites fail closed, and normal Bash permission/sandbox
checks still apply.