@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.
Files changed (45) hide show
  1. package/CHANGELOG.md +181 -0
  2. package/dist/core/agent-session.d.ts +2 -2
  3. package/dist/core/agent-session.d.ts.map +1 -1
  4. package/dist/core/agent-session.js +4 -3
  5. package/dist/core/agent-session.js.map +1 -1
  6. package/dist/core/extensions/runner.d.ts.map +1 -1
  7. package/dist/core/extensions/runner.js +4 -1
  8. package/dist/core/extensions/runner.js.map +1 -1
  9. package/dist/core/keybindings.d.ts +162 -98
  10. package/dist/core/keybindings.d.ts.map +1 -1
  11. package/dist/core/keybindings.js +222 -106
  12. package/dist/core/keybindings.js.map +1 -1
  13. package/dist/modes/interactive/command-executor.d.ts.map +1 -1
  14. package/dist/modes/interactive/command-executor.js +95 -62
  15. package/dist/modes/interactive/command-executor.js.map +1 -1
  16. package/dist/modes/interactive/components/ask-options.d.ts +20 -6
  17. package/dist/modes/interactive/components/ask-options.d.ts.map +1 -1
  18. package/dist/modes/interactive/components/ask-options.js +35 -13
  19. package/dist/modes/interactive/components/ask-options.js.map +1 -1
  20. package/dist/modes/interactive/components/keybinding-hints.d.ts +9 -0
  21. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  22. package/dist/modes/interactive/components/keybinding-hints.js +12 -0
  23. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  24. package/dist/modes/interactive/components/task-panel.d.ts +2 -2
  25. package/dist/modes/interactive/components/task-panel.d.ts.map +1 -1
  26. package/dist/modes/interactive/components/task-panel.js +24 -11
  27. package/dist/modes/interactive/components/task-panel.js.map +1 -1
  28. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  29. package/dist/modes/interactive/components/tree-selector.js +29 -12
  30. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  31. package/dist/modes/interactive/interactive-mode.d.ts +63 -8
  32. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  33. package/dist/modes/interactive/interactive-mode.js +189 -90
  34. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  35. package/dist/modes/interactive/model-controller.d.ts +3 -0
  36. package/dist/modes/interactive/model-controller.d.ts.map +1 -1
  37. package/dist/modes/interactive/model-controller.js +1 -1
  38. package/dist/modes/interactive/model-controller.js.map +1 -1
  39. package/docs/keybindings.md +247 -80
  40. package/docs/terminal-setup.md +8 -3
  41. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  42. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  43. package/examples/extensions/sandbox/package.json +1 -1
  44. package/examples/extensions/with-deps/package.json +1 -1
  45. 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
- * Cycle to next thinking level.
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.