ur-agent 1.73.0 → 1.75.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 CHANGED
@@ -1,6 +1,25 @@
1
1
  # Changelog
2
2
 
3
- ## 1.73.0
3
+ ## 1.75.0
4
+
5
+ - The UI can no longer stay on "working" for a prompt that is running nowhere.
6
+ `QueryGuard`'s `dispatching` state — the gap between `reserve()` and
7
+ `tryStart()` — has no owner: if that chain dies where handlePromptSubmit's
8
+ `finally` cannot observe it, nothing calls `cancelReservation()`, `isActive`
9
+ stays true forever, and the queue behind it never drains. The guard now
10
+ records when it entered a state, and an outstanding reservation older than
11
+ 120s is released and logged. `running` is deliberately excluded — a long
12
+ query is legitimate and is bounded by the request and stream-inactivity
13
+ timeouts instead.
14
+ - New work no longer lands in a finished task list. `useTasksV2` clears a fully
15
+ completed list on a 5s hide timer, so a `TaskCreate` inside that window
16
+ appended to it: the new list arrived pre-populated with ticked items and the
17
+ progress count was wrong from the first task. `TaskCreate` now retires a
18
+ fully completed list before adding, making the rule deterministic rather than
19
+ timing-dependent. A list with any pending, running, failed or blocked task is
20
+ left alone, so "add this to the current list" still works.
21
+
22
+ ## 1.74.0
4
23
 
5
24
  - Provider API key entry no longer renders one character per line. The field in
6
25
  the provider picker omitted `columns`, `cursorOffset` and
@@ -30,6 +49,62 @@
30
49
  entries (four choices plus "Other") pushed the tail below the footer divider
31
50
  and read as a detached second group. The list is now sized to the terminal
32
51
  and only windows when the height genuinely cannot fit it.
52
+ - Cached and reasoning tokens are no longer discarded, and the cached prefix is
53
+ no longer counted twice. OpenAI-shaped providers report `prompt_tokens` as
54
+ the whole input including `prompt_tokens_details.cached_tokens`, while the
55
+ internal counters are disjoint and summed for the context total. Every
56
+ provider adapter now goes through one normalisation pass that partitions the
57
+ counters correctly and carries `reasoning_tokens` separately, since it is
58
+ already inside `completion_tokens`.
59
+ - OpenRouter turns report usage at all. OpenRouter returns no usage block
60
+ unless `usage: { include: true }` is sent, which it never was — the direct
61
+ cause of "0 tokens" on that provider.
62
+ - Model lists carry the metadata the provider actually returns. The id-only
63
+ mapping discarded the human name, context length and pricing, so OpenRouter's
64
+ rotating free tier was invisible. Free models are detected from pricing
65
+ (falling back to the `:free` suffix), listed first, and deprecated entries
66
+ listed last. Concurrent discovery requests for the same provider now share
67
+ one call, a stale cache reports its age instead of being shown as current,
68
+ and ctrl+r re-runs discovery from the picker.
69
+ - Tool schemas no longer forward `$schema`, `$defs`/`$ref`, or vendor keys
70
+ nested below the root. A recursive tool schema emitted `{"$ref": "#"}`, which
71
+ Gemini cannot express and non-OpenAI compatible servers frequently fail to
72
+ resolve; references are inlined instead. Gemini receives a narrowed dialect
73
+ with its unsupported keywords removed and `anyOf: [T, null]` folded into
74
+ `nullable`. Prepared schemas are validated before sending, so a malformed one
75
+ fails with a specific message instead of being retried unchanged.
76
+ - Bash reports the command's own exit code and always records its working
77
+ directory. The `pwd -P` capture was chained after the command with `&&`, so
78
+ it never ran when the command failed (losing a preceding `cd`), its own
79
+ failure masked a successful command as failed when the command removed its
80
+ working directory, and a command containing `exit` terminated the shell
81
+ before the capture ran. The capture now runs from an `EXIT` trap.
82
+ - A streaming provider that goes silent mid-response now fails with a stated
83
+ reason. The total-request timeout is cleared once headers arrive, which for a
84
+ streaming request left no timeout at all — the stream stayed open and the UI
85
+ showed work in progress indefinitely. An inactivity watchdog aborts after a
86
+ gap between chunks; a long stream that keeps producing is never interrupted.
87
+ - AskUserQuestion repairs duplicate questions and option labels instead of
88
+ rejecting them. The uniqueness rule failed the whole call, so a recoverable
89
+ formatting slip cost a round trip and showed the user nothing.
90
+ - The question view no longer rules a line between the choices and the
91
+ numbered actions below them. The footer entries continue the same numbering
92
+ as the choices ("1..N" choices, then "N+1 Chat about this"), so a full-width
93
+ divider cut them off from the list they belong to and they read as a detached
94
+ second group. The duplicate rule above the planning path is gone too.
95
+ - `TaskUpdate` no longer fails an entire call because one dependency points at
96
+ its own task. A self-edge carries no ordering information, so it is dropped
97
+ and the status change and remaining valid dependencies still apply; the
98
+ previous behaviour discarded all of them. An unknown dependency target now
99
+ names the missing id and lists the tasks that do exist, instead of returning
100
+ a bare `task_not_found` the caller could only retry unchanged.
101
+ - The status bar is field-based and width-aware. Fields are declared with a
102
+ priority and dropped lowest-first when the terminal is narrow, rather than
103
+ being cut mid-word with everything to the right silently lost. Task progress
104
+ reports completed-of-total, pending tasks are no longer counted as active,
105
+ and a field with nothing to report is omitted rather than rendered as zero.
106
+ `/status-bar` chooses which fields are shown; the choice persists in
107
+ `statusBarFields`.
33
108
 
34
109
  ## 1.72.0
35
110