@kolisachint/hoocode-agent 0.5.57 → 0.5.59
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 +181 -0
- package/dist/core/agent-session.d.ts +2 -2
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +4 -3
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +4 -1
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/keybindings.d.ts +162 -98
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +222 -106
- package/dist/core/keybindings.js.map +1 -1
- package/dist/modes/interactive/command-executor.d.ts.map +1 -1
- package/dist/modes/interactive/command-executor.js +95 -62
- package/dist/modes/interactive/command-executor.js.map +1 -1
- package/dist/modes/interactive/components/ask-options.d.ts +20 -6
- package/dist/modes/interactive/components/ask-options.d.ts.map +1 -1
- package/dist/modes/interactive/components/ask-options.js +35 -13
- package/dist/modes/interactive/components/ask-options.js.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.d.ts +9 -0
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.js +12 -0
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
- package/dist/modes/interactive/components/task-panel.d.ts +2 -2
- package/dist/modes/interactive/components/task-panel.d.ts.map +1 -1
- package/dist/modes/interactive/components/task-panel.js +24 -11
- package/dist/modes/interactive/components/task-panel.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js +29 -12
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +63 -8
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +189 -90
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/model-controller.d.ts +3 -0
- package/dist/modes/interactive/model-controller.d.ts.map +1 -1
- package/dist/modes/interactive/model-controller.js +1 -1
- package/dist/modes/interactive/model-controller.js.map +1 -1
- package/docs/keybindings.md +247 -80
- package/docs/terminal-setup.md +8 -3
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package.json +1 -1
- package/package.json +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,186 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.5.59] - 2026-09-05
|
|
4
|
+
|
|
5
|
+
### Fixed
|
|
6
|
+
|
|
7
|
+
- **`hoo`, `/new` and `/reload` now leave you looking at the same thing.** All
|
|
8
|
+
three rebuild the session's resources and repaint the chrome, and they did it
|
|
9
|
+
from two hand-kept lists, so an edit to `settings.json` reached one and not the
|
|
10
|
+
other: after `/reload` the footer went on promising auto-compaction that was
|
|
11
|
+
switched off, and the model count, the subagent indicator and the session chip
|
|
12
|
+
kept the state of the session before it; after `/new` a changed `theme` never
|
|
13
|
+
loaded at all. A theme that did load left the banner in the retired theme's
|
|
14
|
+
colours, on either path — a `Text` holds its string with the escapes already in
|
|
15
|
+
it, so invalidating it is not repainting it. One list now, applied by every
|
|
16
|
+
path, and the resource listing is drawn once per session change instead of
|
|
17
|
+
drawn and immediately wiped. `/reload` also drops the stale view-layer
|
|
18
|
+
references into the transcript it just replayed, the way a session swap always
|
|
19
|
+
has.
|
|
20
|
+
|
|
21
|
+
## [0.5.58] - 2026-09-04
|
|
22
|
+
|
|
23
|
+
### Changed
|
|
24
|
+
|
|
25
|
+
- **The keyboard map is grouped by intention, not by mechanism.** Sorting the
|
|
26
|
+
bindings by what the widget is — everything that cycles together — made a list
|
|
27
|
+
that was tidy on the page and useless at the keyboard, because "it cycles" is
|
|
28
|
+
not what anyone is thinking when they reach for a key. Sixty bindings is not a
|
|
29
|
+
thing anyone holds; five groups of at most five is.
|
|
30
|
+
|
|
31
|
+
The groups are the five things you are ever doing here, in the order the loop
|
|
32
|
+
runs:
|
|
33
|
+
|
|
34
|
+
| group | what it is | keys |
|
|
35
|
+
| --- | --- | --- |
|
|
36
|
+
| **Compose** | the message in your hands | `alt+e` `alt+r` `ctrl+v` `alt+enter` `alt+↑` |
|
|
37
|
+
| **Steer** | what the agent is before it runs | `alt+a` `alt+m` `alt+t` |
|
|
38
|
+
| **Read** | what you see of what it did | `alt+o` `alt+l` `ctrl+o` `ctrl+t` |
|
|
39
|
+
| **Go** | sessions and places | `alt+h` `alt+w` `alt+c` `alt+s` `alt+k` |
|
|
40
|
+
| **Flow** | getting out, getting back | `esc` `ctrl+c` `ctrl+d` `ctrl+z` |
|
|
41
|
+
|
|
42
|
+
Two of them cost nothing: **Flow** is what every terminal program already
|
|
43
|
+
taught you, and the overlays — pickers, the tree, the options pane — print
|
|
44
|
+
their own keys on their own hint lines, so they are read rather than recalled.
|
|
45
|
+
That leaves three groups to genuinely know.
|
|
46
|
+
|
|
47
|
+
No key moved. The grouping is now the source's own declaration order, which
|
|
48
|
+
matters beyond the file: `orderKeybindingsConfig` writes `keybindings.json` in
|
|
49
|
+
that order, so the file you open to rebind something is grouped the same way.
|
|
50
|
+
The startup banner, `/hotkeys` and `docs/keybindings.md` all lead with the same
|
|
51
|
+
five groups in the same order, instead of three different organisations.
|
|
52
|
+
|
|
53
|
+
- **A dial names the key that steps it back, once.** The instant after you move a
|
|
54
|
+
dial is the one moment you are primed to learn its other half — you have used
|
|
55
|
+
one direction and can feel the missing one — so the reverse rides along with
|
|
56
|
+
the first step of each dial in a session and never again. A hint that repeats
|
|
57
|
+
forever stops being read, and its cost falls on the people who already know it.
|
|
58
|
+
|
|
59
|
+
- **The task panel advertises the roster key.** It already printed `alt+l cycle`
|
|
60
|
+
in its header; on the teams lens it now prints the focus key too. That is what
|
|
61
|
+
lets `alt+n` stay: it is the one letter in the set that names nothing, and it
|
|
62
|
+
survives on the fallback every unmemorable key needs — being read off the
|
|
63
|
+
screen instead of remembered.
|
|
64
|
+
|
|
65
|
+
- The layout test now holds the grouping as well as the keys: every binding
|
|
66
|
+
belongs to exactly one family, families are declared contiguously and in order,
|
|
67
|
+
and no learned family exceeds five subjects that carry a key. That last one
|
|
68
|
+
caught **Go** at eight before the count was corrected to ignore actions that
|
|
69
|
+
ship unbound — an action with no key costs no memory.
|
|
70
|
+
|
|
71
|
+
- **Every dial is now `alt+<letter>`, and `shift+alt+<letter>` steps it back.**
|
|
72
|
+
The thinking level came off `shift+tab` and the task ledger off `ctrl+n`, so the
|
|
73
|
+
six most-pressed keys in the app share one modifier, one shape, and six letters
|
|
74
|
+
that each name their dial:
|
|
75
|
+
|
|
76
|
+
| dial | forward | back |
|
|
77
|
+
| --- | --- | --- |
|
|
78
|
+
| **a**gent mode | `alt+a` | `shift+alt+a` |
|
|
79
|
+
| **m**odel | `alt+m` | `shift+alt+m` |
|
|
80
|
+
| **t**hinking level | `alt+t` | `shift+alt+t` |
|
|
81
|
+
| tool **o**utput | `alt+o` | `shift+alt+o` |
|
|
82
|
+
| task **l**edger | `alt+l` | `shift+alt+l` |
|
|
83
|
+
| session **c**olor | `alt+c` | `shift+alt+c` |
|
|
84
|
+
|
|
85
|
+
`alt+t` also buys the pairing that `alt+o` already had: same letter on both
|
|
86
|
+
rings, `alt` walking the dial and saving where it lands, `ctrl` acting on what
|
|
87
|
+
is drawn right now. `alt+o` sets how much tool output there ever is and
|
|
88
|
+
`ctrl+o` jumps to all of it and back; `alt+t` sets how much thinking there ever
|
|
89
|
+
is and `ctrl+t` shows or hides what you have. Those two are all that is left on
|
|
90
|
+
the `ctrl` ring besides the flow keys.
|
|
91
|
+
|
|
92
|
+
The task ledger gains the reverse it could never have had on `ctrl`, where
|
|
93
|
+
`shift+ctrl+n` is Windows Terminal's "new window". `alt+l` names the pane's own
|
|
94
|
+
word for itself — the task ledger — where `ctrl+n` named nothing.
|
|
95
|
+
|
|
96
|
+
`shift+tab` still steps the thinking level as a second key. It is the only dial
|
|
97
|
+
with no slash command and the only one whose setting changes what the agent
|
|
98
|
+
does, so it keeps a way in on a terminal that does not send `alt`.
|
|
99
|
+
|
|
100
|
+
`app.session.tree` gave `alt+t` to the thinking dial and ships unbound; `/tree`
|
|
101
|
+
opens it, the same trade `app.model.select` makes for `/model`. `ctrl+n`,
|
|
102
|
+
`ctrl+p` and `shift+ctrl+p` are all free now, so the emacs config in
|
|
103
|
+
`docs/keybindings.md` collides with nothing.
|
|
104
|
+
|
|
105
|
+
`app.tasks.cycleView` became `app.tasks.cycleForward`; existing
|
|
106
|
+
`keybindings.json` files are migrated on startup.
|
|
107
|
+
|
|
108
|
+
- **The six dials now work the same way.** Everything on screen with an ordered
|
|
109
|
+
set of stops — agent mode, model, thinking level, tool output, session colour,
|
|
110
|
+
the task panel's lens — is stepped with a key, and until now those six keys had
|
|
111
|
+
four different shapes between them (`alt+`, `ctrl+`, `shift+ctrl+`, `shift+tab`)
|
|
112
|
+
and only three could step backward at all. Nothing told you which was which, so
|
|
113
|
+
each one had to be memorised on its own.
|
|
114
|
+
|
|
115
|
+
They share one rule now: **a dial steps forward on its key and back with one
|
|
116
|
+
more modifier held, the letter names the dial, and the slash command picks a
|
|
117
|
+
stop outright.**
|
|
118
|
+
|
|
119
|
+
What moved: the model dial from `ctrl+p`/`shift+ctrl+p` to `alt+m`, because the
|
|
120
|
+
model is a cockpit dial — what the agent *is*, not what is on screen — and `p`
|
|
121
|
+
named nothing. Agent mode and thinking level gained the reverse halves they
|
|
122
|
+
never had.
|
|
123
|
+
|
|
124
|
+
`app.thinking.cycle` and `app.mode.cycle` became `…cycleForward` so every
|
|
125
|
+
two-direction dial reads the same; existing `keybindings.json` files are
|
|
126
|
+
migrated on startup.
|
|
127
|
+
|
|
128
|
+
- **`app.model.select` ships unbound; `/model` opens the picker.** Its key went to
|
|
129
|
+
the dial that steps the model, on the principle the colour dial already
|
|
130
|
+
followed: the key steps, the slash command chooses. `/mode`, `/model` and
|
|
131
|
+
`/color` are the three pickers behind the dials.
|
|
132
|
+
|
|
133
|
+
- **The startup banner, `/hotkeys` and `docs/keybindings.md` lead with the
|
|
134
|
+
dials.** `/hotkeys` gained a Dials table naming what each one steps through and
|
|
135
|
+
where to see its state, and spells out the ctrl/alt pairing: `ctrl+o` opens the
|
|
136
|
+
tool bodies you have and `alt+o` sets how much they ever show; `ctrl+t` shows
|
|
137
|
+
the thinking you have and `shift+tab` sets how much there ever is.
|
|
138
|
+
|
|
139
|
+
### Fixed
|
|
140
|
+
|
|
141
|
+
- **Searching the session tree no longer fires its verbs.** The tree's two
|
|
142
|
+
label keys were the last verbs left on `shift+<letter>`, and outside the
|
|
143
|
+
Kitty keyboard protocol that is not a chord at all — the terminal sends the
|
|
144
|
+
plain uppercase letter. The tree takes every printable key into its search
|
|
145
|
+
query, so typing `TODO` or `Logger` toggled label timestamps and opened the
|
|
146
|
+
label editor instead of searching. They move to `alt+l` ("label") and `alt+t`
|
|
147
|
+
("time"), which is where every other picker verb already lives, and a layout
|
|
148
|
+
test now refuses a bare `shift+<letter>` outright.
|
|
149
|
+
|
|
150
|
+
- **The options pane gave its arrow keys to the step, never to the text.** On
|
|
151
|
+
the free-text row `←` stepped back to the previous question — which clears
|
|
152
|
+
the field — so a cursor key could throw away a half-typed answer, and `→`
|
|
153
|
+
submitted rather than moving right. The text now gets first refusal and the
|
|
154
|
+
step takes what is left at the ends: `→` commits from the end of the answer
|
|
155
|
+
(an empty field is already at its end, so the plain custom row still
|
|
156
|
+
advances), `←` stays out while there is an answer to lose, and `enter`
|
|
157
|
+
commits from anywhere.
|
|
158
|
+
|
|
159
|
+
### Changed
|
|
160
|
+
|
|
161
|
+
- **`alt+a` cycles the agent mode**, replacing `alt+g`, which stood for
|
|
162
|
+
nothing. Mode and model are one letter apart and `alt+m` is the model
|
|
163
|
+
selector, so the letter has to carry the meaning: `a` for agent mode.
|
|
164
|
+
|
|
165
|
+
- **The session tree's hint line is readable.** It printed every alias of every
|
|
166
|
+
key — `ctrl+left/alt+left/ctrl+right/alt+right` for one fold verb, five
|
|
167
|
+
spelled-out filter keys — in a style no other hint line used. It is now the
|
|
168
|
+
house style (dim key, muted description, `·` separated), one key per verb,
|
|
169
|
+
with the five lenses shown as the range `alt+1…alt+5`. The header chip that
|
|
170
|
+
said `[+label time]` says `[timestamps]`.
|
|
171
|
+
|
|
172
|
+
- **`docs/keybindings.md` documents the keys that exist.** It still listed the
|
|
173
|
+
layout from before the cockpit rings: `ctrl+l` for the model selector,
|
|
174
|
+
`ctrl+g` for the external editor, the picker verbs on the `ctrl` letters they
|
|
175
|
+
were moved off, the session tree and `/resume` as unbound, and no mention at
|
|
176
|
+
all of the view dial, the mode cycle, voice, settings, `/cd`, the team roster
|
|
177
|
+
or the options pane. Rewritten from the definitions, grouped by ring, and it
|
|
178
|
+
now leads with the rule that decides which ring a key is in.
|
|
179
|
+
|
|
180
|
+
- `app.options.next` and `app.options.back` are registered keybinding ids like
|
|
181
|
+
every other action, instead of being defined but missing from the type map
|
|
182
|
+
and reached through a cast. The layout test now checks that every id belongs
|
|
183
|
+
to a scope, so the next one cannot slip through unchecked.
|
|
3
184
|
## [0.5.57] - 2026-09-04
|
|
4
185
|
|
|
5
186
|
### Changed
|
|
@@ -400,10 +400,10 @@ export declare class AgentSession {
|
|
|
400
400
|
*/
|
|
401
401
|
setThinkingLevel(level: ThinkingLevel): void;
|
|
402
402
|
/**
|
|
403
|
-
*
|
|
403
|
+
* Step the thinking level one stop, wrapping at both ends.
|
|
404
404
|
* @returns New level, or undefined if model doesn't support thinking
|
|
405
405
|
*/
|
|
406
|
-
cycleThinkingLevel(): ThinkingLevel | undefined;
|
|
406
|
+
cycleThinkingLevel(direction?: "forward" | "backward"): ThinkingLevel | undefined;
|
|
407
407
|
/**
|
|
408
408
|
* Get available thinking levels for current model.
|
|
409
409
|
* The provider will clamp to what the specific model supports internally.
|