agim-cli 1.2.75 → 1.2.83
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 +208 -0
- package/dist/cli-ui/tui/app.d.ts +22 -0
- package/dist/cli-ui/tui/app.d.ts.map +1 -0
- package/dist/cli-ui/tui/app.js +578 -0
- package/dist/cli-ui/tui/app.js.map +1 -0
- package/dist/cli-ui/tui/index.d.ts +7 -0
- package/dist/cli-ui/tui/index.d.ts.map +1 -0
- package/dist/cli-ui/tui/index.js +125 -0
- package/dist/cli-ui/tui/index.js.map +1 -0
- package/dist/cli-ui/tui/markdown.d.ts +5 -0
- package/dist/cli-ui/tui/markdown.d.ts.map +1 -0
- package/dist/cli-ui/tui/markdown.js +145 -0
- package/dist/cli-ui/tui/markdown.js.map +1 -0
- package/dist/cli-ui/tui/sessions.d.ts +31 -0
- package/dist/cli-ui/tui/sessions.d.ts.map +1 -0
- package/dist/cli-ui/tui/sessions.js +107 -0
- package/dist/cli-ui/tui/sessions.js.map +1 -0
- package/dist/cli.js +12 -0
- package/dist/cli.js.map +1 -1
- package/package.json +5 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,214 @@ All notable changes to this project will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [1.2.83] - 2026-05-26
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- **Belt-and-suspenders**: drop `tsc --noEmit` from web-app's `build`
|
|
12
|
+
script. v1.2.82 added a tsconfig exclude for `*.test.tsx`, but the
|
|
13
|
+
user's CI run kept showing the same TS2305 errors — turning off
|
|
14
|
+
tsc entirely from the production build path guarantees the test-
|
|
15
|
+
type-drift can never block a release again. Type-checking still
|
|
16
|
+
happens via `npm run typecheck` and the `vitest` test runner.
|
|
17
|
+
Vite itself does enough at-bundle-time validation to catch syntax
|
|
18
|
+
+ import errors.
|
|
19
|
+
|
|
20
|
+
## [1.2.82] - 2026-05-26
|
|
21
|
+
|
|
22
|
+
### Fixed
|
|
23
|
+
|
|
24
|
+
- **Release CI: build step now skips test type-check.** v1.2.81's
|
|
25
|
+
npm-latest install path worked (the arborist hang is gone), but
|
|
26
|
+
the build then died in `web-app: tsc --noEmit` with TS2305
|
|
27
|
+
"Module '@testing-library/react' has no exported member 'fireEvent'
|
|
28
|
+
/ 'screen' / 'waitFor' / 'within'". Root cause: CI's
|
|
29
|
+
`--no-package-lock` install resolved testing-library to a patch
|
|
30
|
+
version whose `.d.ts` is missing those named re-exports. The
|
|
31
|
+
fix doesn't try to pin testing-library (we don't want to chase
|
|
32
|
+
CI-only patch drift); instead we exclude `*.test.tsx` from
|
|
33
|
+
`src/web-app/tsconfig.json`, so the production build doesn't
|
|
34
|
+
type-check tests. Tests are still type-checked by their own
|
|
35
|
+
vitest run (`npm run test`) which uses Vite/vitest's resolver
|
|
36
|
+
and isn't on the publish path.
|
|
37
|
+
|
|
38
|
+
## [1.2.81] - 2026-05-26
|
|
39
|
+
|
|
40
|
+
### Fixed
|
|
41
|
+
|
|
42
|
+
- **Release CI publishes again** (second attempt). v1.2.80's bun-install
|
|
43
|
+
pivot tripped on `ConnectionRefused` / `FailedToOpenSocket` when bun
|
|
44
|
+
tried to fetch tarballs — likely interaction between setup-node's
|
|
45
|
+
`always-auth=true` npmrc and bun's connection pool. Fallback: stay
|
|
46
|
+
with npm but **upgrade to `npm@latest` first** (npm 11 patched the
|
|
47
|
+
arborist "Exit handler never called!" stall that broke 1.2.76-78)
|
|
48
|
+
and use `npm install --no-package-lock --legacy-peer-deps --no-audit
|
|
49
|
+
--no-fund` so the tree resolution doesn't re-hit the same path. End
|
|
50
|
+
users still get the canonical npm path; this only changes CI.
|
|
51
|
+
|
|
52
|
+
## [1.2.80] - 2026-05-26
|
|
53
|
+
|
|
54
|
+
### Fixed
|
|
55
|
+
|
|
56
|
+
- **Release CI publishes again** (real root cause). v1.2.76 / 1.2.77 /
|
|
57
|
+
1.2.78 / 1.2.79 all never reached npm. The actual error in the
|
|
58
|
+
GitHub Actions log is **`npm error Exit handler never called!`**
|
|
59
|
+
during both `npm ci --omit=optional` AND the fallback `npm install
|
|
60
|
+
--omit=optional`. This is a known npm 10.x arborist bug that
|
|
61
|
+
previously only surfaced via the `@xenova/transformers` ONNX
|
|
62
|
+
postinstall — the TUI deps added in v1.2.76 (ink / react /
|
|
63
|
+
ink-text-input + their transitive chalk / wrap-ansi / cli-truncate
|
|
64
|
+
chain) pushed the dep tree over the same threshold and triggered
|
|
65
|
+
the same hang. Lock-sync (the v1.2.79 hypothesis) was a red
|
|
66
|
+
herring — the lockfile was already in sync.
|
|
67
|
+
- **Fix**: `release.yml` install steps switched from `npm ci` to
|
|
68
|
+
`bun install --frozen-lockfile`. bun is already on PATH from the
|
|
69
|
+
earlier `oven-sh/setup-bun@v2` step and handles the same
|
|
70
|
+
`package.json` cleanly (we've used bun for the `npm test` step for
|
|
71
|
+
months). `--no-optional` preserves the existing skip of
|
|
72
|
+
`@xenova/transformers` — agim-cli doesn't need it at publish time.
|
|
73
|
+
- **End-user `npm install -g agim-cli` is unaffected** — only the
|
|
74
|
+
CI publish path uses bun now; consumers still get the canonical
|
|
75
|
+
npm install path from npm.
|
|
76
|
+
|
|
77
|
+
## [1.2.79] - 2026-05-26 — UNRELEASED (CI publish failed, see 1.2.80)
|
|
78
|
+
|
|
79
|
+
### Attempted
|
|
80
|
+
|
|
81
|
+
- Bumped + re-synced `package-lock.json` thinking the publish failure
|
|
82
|
+
was a lock/package mismatch. Wrong diagnosis: the actual issue was
|
|
83
|
+
npm's `Exit handler never called!` arborist hang. Folded into the
|
|
84
|
+
v1.2.80 fix.
|
|
85
|
+
|
|
86
|
+
## [1.2.78] - 2026-05-26
|
|
87
|
+
|
|
88
|
+
### Fixed / Added (TUI feedback batch)
|
|
89
|
+
|
|
90
|
+
- **Session persistence + resume**. Every TUI session writes to
|
|
91
|
+
`<AGIM_HOME>/tui-sessions/<id>.json` after each agent turn and on
|
|
92
|
+
graceful exit. On exit the terminal prints the resume hint:
|
|
93
|
+
```
|
|
94
|
+
会话 ID:tui-20260526-090530-a1b2c3
|
|
95
|
+
恢复命令:agim tui --resume tui-20260526-090530-a1b2c3
|
|
96
|
+
查看所有会话:agim tui --list-sessions
|
|
97
|
+
```
|
|
98
|
+
New CLI flags:
|
|
99
|
+
- `agim tui --resume <id>` — load a specific session
|
|
100
|
+
- `agim tui --resume last` (or bare `--resume`) — load the most
|
|
101
|
+
recent session
|
|
102
|
+
- `agim tui --list-sessions` — print saved sessions, latest first
|
|
103
|
+
System-only / empty sessions are NOT saved (avoid clutter when the
|
|
104
|
+
user launches and exits without chatting).
|
|
105
|
+
- **Newline + cursor cleanup on exit**. Without the trailing `\n`,
|
|
106
|
+
the next shell prompt collided with the last rendered frame.
|
|
107
|
+
- **Markdown code-block colour fixed**. The keyword highlighter
|
|
108
|
+
looked up `KEYWORDS[lang.toLowerCase()]` directly, so fences spelled
|
|
109
|
+
`` ```typescript `` / `` ```python `` / `` ```bash `` never matched
|
|
110
|
+
(the table is keyed by short aliases: `ts` / `py` / `sh`). Added
|
|
111
|
+
`LANG_ALIASES` to normalise the common spellings:
|
|
112
|
+
`javascript/jsx/node → js`, `typescript/tsx → ts`,
|
|
113
|
+
`python/python3 → py`, `shell/bash/zsh → sh`, `golang → go`.
|
|
114
|
+
- **Input-keystroke flicker reduced.** Extracted the chat history
|
|
115
|
+
into a `React.memo`-wrapped `ChatHistory` component. Typing in the
|
|
116
|
+
input box changes `input` state on the parent but no longer
|
|
117
|
+
triggers a full reconciliation of every message Box — Ink's diff
|
|
118
|
+
pass skips the subtree when `messages` identity is unchanged.
|
|
119
|
+
|
|
120
|
+
## [1.2.77] - 2026-05-26
|
|
121
|
+
|
|
122
|
+
### Added (TUI opencode-parity iteration)
|
|
123
|
+
|
|
124
|
+
- **`!cmd` inline bash**. Messages starting with `!` get run in a child
|
|
125
|
+
shell (cwd inherited, 60s timeout, 1 MB output cap); stdout / stderr
|
|
126
|
+
/ exit code are rendered as a system message with timing.
|
|
127
|
+
- **`@file` fuzzy file picker**. Typing `@` in the input opens a popup
|
|
128
|
+
filtered against the cwd (skips `node_modules` / `.git` / `dist` /
|
|
129
|
+
`.next` / `target` / `venv` / `__pycache__`); Tab / Enter inserts
|
|
130
|
+
the cwd-relative path. The agent receives the literal token; tools
|
|
131
|
+
like Read can pick it up.
|
|
132
|
+
- **`/editor`** opens `$EDITOR` (or `vi`) on a temp file pre-seeded
|
|
133
|
+
with the current input draft. Save + quit submits the body as a
|
|
134
|
+
user prompt; lines starting with `#` are stripped (vi convention).
|
|
135
|
+
This is our multi-line input substitute.
|
|
136
|
+
- **`/compact`** asks the current agent to summarise the conversation
|
|
137
|
+
into 3-5 bullet points, then replaces history with that summary as
|
|
138
|
+
a system message. Use for long sessions where token budget runs hot.
|
|
139
|
+
- **`/redo`** re-sends the last user message.
|
|
140
|
+
- **`/undo`** drops the most recent user-and-reply pair.
|
|
141
|
+
- **`/export`** writes the transcript to `./agim-tui-<timestamp>.md`
|
|
142
|
+
with role headers + elapsed-time annotations.
|
|
143
|
+
- **Ctrl-P command palette**. Modal fuzzy search over every slash
|
|
144
|
+
command; works regardless of input state. Up / Down + Enter to
|
|
145
|
+
pick, Esc to dismiss.
|
|
146
|
+
- **Completion bell**. After each agent reply ends successfully, write
|
|
147
|
+
`\x07` to stdout. Disable with `IMHUB_TUI_NO_BELL=1`.
|
|
148
|
+
- **Markdown rendering** for assistant replies. New `Markdown` Ink
|
|
149
|
+
component walks `marked`'s lexer tokens to emit native Ink boxes:
|
|
150
|
+
headings (depth-coloured), paragraphs, bold / italic / strikethrough,
|
|
151
|
+
inline code (cyan), bordered code blocks with language label and a
|
|
152
|
+
dependency-free keyword colouriser (js / ts / py / sh / go), bullet
|
|
153
|
+
+ ordered lists, blockquotes (dim `│` prefix), `<hr>`, links
|
|
154
|
+
(underlined text + dim URL). Tables fall back to raw text to avoid
|
|
155
|
+
CJK width landmines. Streaming partial content stays plain-text;
|
|
156
|
+
the markdown pass kicks in once the reply is complete (so
|
|
157
|
+
half-formed fences don't flicker the layout).
|
|
158
|
+
|
|
159
|
+
### Still deferred
|
|
160
|
+
|
|
161
|
+
- Multi-line input in the chat box itself (`/editor` fills this for
|
|
162
|
+
now)
|
|
163
|
+
- Image attachments
|
|
164
|
+
- Multi-session list (`/new` / `/sessions`)
|
|
165
|
+
- Remote-daemon client mode (TUI still in-process only)
|
|
166
|
+
- Per-message token / cost stats (needs adapter hooks)
|
|
167
|
+
|
|
168
|
+
## [1.2.76] - 2026-05-26
|
|
169
|
+
|
|
170
|
+
### Added
|
|
171
|
+
|
|
172
|
+
- **`agim tui` — terminal chat UI (first usable iteration).** Ink-based
|
|
173
|
+
React renderer that drives any registered agent in-process. Use case:
|
|
174
|
+
ssh into a box, run `agim tui`, chat with claude-code / codex /
|
|
175
|
+
native / opencode / cursor without needing web admin or daemon.
|
|
176
|
+
- **Features in this iteration**:
|
|
177
|
+
- `agim tui [--agent <name>]` subcommand
|
|
178
|
+
- Streaming agent replies (live chunk rendering)
|
|
179
|
+
- Slash-command popup: type `/`, get a filterable command menu with
|
|
180
|
+
↑↓ navigation, Tab completion, Enter to select
|
|
181
|
+
- Commands: `/agents` `/agent <name>` `/clear` `/help` `/exit`
|
|
182
|
+
`/quit` (more to come — per-message tools, /compact, /diff, /fork
|
|
183
|
+
follow opencode's playbook)
|
|
184
|
+
- Per-message footer on assistant replies: `■ agent · 4.9s` (model
|
|
185
|
+
+ elapsed time)
|
|
186
|
+
- Bottom status bar: cwd, message count, key hints
|
|
187
|
+
- `Esc` aborts an in-flight reply via `AbortController`
|
|
188
|
+
- `Ctrl-C` exits cleanly
|
|
189
|
+
- **Architecture**: TUI is **in-process**, not a client of a running
|
|
190
|
+
`agim start` daemon. Loads `registry.loadBuiltInPlugins()` + reads
|
|
191
|
+
config.json for ACP agents, then talks directly to adapter
|
|
192
|
+
`sendPrompt()` generators. No HTTP, no SSE — works on boxes where
|
|
193
|
+
the daemon isn't running. Remote-daemon-client mode is on the
|
|
194
|
+
roadmap.
|
|
195
|
+
- **Quality cuts** (deliberate for first iteration):
|
|
196
|
+
- Single-line input (no `Shift+Enter` newline yet) — will switch
|
|
197
|
+
to custom multiline buffer
|
|
198
|
+
- Plain-text rendering (no markdown / table formatting) — avoids
|
|
199
|
+
terminal CJK width landmines
|
|
200
|
+
- Single thread (no session list, no fork)
|
|
201
|
+
- No approval-bus integration (TUI can't currently approve
|
|
202
|
+
tool-use cards; non-issue for read-only agent runs)
|
|
203
|
+
|
|
204
|
+
### Internal
|
|
205
|
+
|
|
206
|
+
- New deps: `ink ^5`, `ink-text-input ^6`, `react ^18` in `dependencies`;
|
|
207
|
+
`@types/react ^18` in `devDependencies`. Lazy-imported by the `tui`
|
|
208
|
+
subcommand only — other CLI paths pay zero startup cost.
|
|
209
|
+
- `tsconfig.json`: `"jsx": "react-jsx"` for tsx files.
|
|
210
|
+
- Root logger is set to `silent` for the TUI session (and restored
|
|
211
|
+
on exit) so pino-pretty doesn't write to fd 1 and scramble Ink's
|
|
212
|
+
diff renderer. `IMHUB_TUI_VERBOSE=1` keeps logs flowing (helpful
|
|
213
|
+
when stuck — pair with `2>tui.log`).
|
|
214
|
+
|
|
7
215
|
## [1.2.75] - 2026-05-26
|
|
8
216
|
|
|
9
217
|
### Fixed
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface ChatMessage {
|
|
2
|
+
role: 'user' | 'assistant' | 'system';
|
|
3
|
+
content: string;
|
|
4
|
+
pending?: boolean;
|
|
5
|
+
elapsedMs?: number;
|
|
6
|
+
agentName?: string;
|
|
7
|
+
}
|
|
8
|
+
interface AppProps {
|
|
9
|
+
initialAgent?: string;
|
|
10
|
+
/** Resume from disk; overrides initial empty state. */
|
|
11
|
+
resumed?: {
|
|
12
|
+
id: string;
|
|
13
|
+
agent?: string;
|
|
14
|
+
messages: ChatMessage[];
|
|
15
|
+
};
|
|
16
|
+
/** Stable session id — generated upstream and printed on exit so
|
|
17
|
+
* user can `agim tui --resume <id>` next time. */
|
|
18
|
+
sessionId: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function TuiApp({ initialAgent, resumed, sessionId }: AppProps): JSX.Element;
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=app.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/cli-ui/tui/app.tsx"],"names":[],"mappings":"AAoCA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAA;IACrC,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAmDD,UAAU,QAAQ;IAChB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,uDAAuD;IACvD,OAAO,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,WAAW,EAAE,CAAA;KAAE,CAAA;IACjE;uDACmD;IACnD,SAAS,EAAE,MAAM,CAAA;CAClB;AA0CD,wBAAgB,MAAM,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,QAAQ,GAAG,GAAG,CAAC,OAAO,CAmgBlF"}
|