hexcli 2.8.0__py3-none-any.whl
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.
- hexcli/__init__.py +6 -0
- hexcli/agent.py +1931 -0
- hexcli/assets/hexcli.ico +0 -0
- hexcli/assets/hexcli.png +0 -0
- hexcli/cancel.py +76 -0
- hexcli/chatlog.py +232 -0
- hexcli/commands.py +73 -0
- hexcli/compaction.py +309 -0
- hexcli/config.py +217 -0
- hexcli/diffview.py +106 -0
- hexcli/distribution.py +237 -0
- hexcli/doctor.py +265 -0
- hexcli/escalate.py +192 -0
- hexcli/http_client.py +156 -0
- hexcli/launcher.py +481 -0
- hexcli/lineedit.py +1110 -0
- hexcli/llm.py +599 -0
- hexcli/local_escalation.py +191 -0
- hexcli/lockfile.py +71 -0
- hexcli/loop_v2.py +393 -0
- hexcli/markdown_stream.py +241 -0
- hexcli/memory.py +416 -0
- hexcli/network.py +154 -0
- hexcli/parsing.py +215 -0
- hexcli/paths.py +127 -0
- hexcli/prompts.py +321 -0
- hexcli/protocol_v2.py +505 -0
- hexcli/repl.py +807 -0
- hexcli/safety.py +127 -0
- hexcli/sessions.py +226 -0
- hexcli/setup_wizard.py +144 -0
- hexcli/shell_session.py +186 -0
- hexcli/statusbar.py +894 -0
- hexcli/stream_render.py +250 -0
- hexcli/telemetry.py +131 -0
- hexcli/tools.py +775 -0
- hexcli/ui.py +1106 -0
- hexcli-2.8.0.dist-info/METADATA +394 -0
- hexcli-2.8.0.dist-info/RECORD +42 -0
- hexcli-2.8.0.dist-info/WHEEL +4 -0
- hexcli-2.8.0.dist-info/entry_points.txt +3 -0
- hexcli-2.8.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: hexcli
|
|
3
|
+
Version: 2.8.0
|
|
4
|
+
Summary: Local Hexagon NPU terminal agent for Snapdragon X Elite Windows ARM64
|
|
5
|
+
Project-URL: Homepage, https://github.com/NathanL15/Hex-CLI
|
|
6
|
+
Project-URL: Repository, https://github.com/NathanL15/Hex-CLI
|
|
7
|
+
Project-URL: Bug Tracker, https://github.com/NathanL15/Hex-CLI/issues
|
|
8
|
+
License: MIT
|
|
9
|
+
License-File: LICENSE
|
|
10
|
+
Keywords: agent,ai,arm64,cli,npu,snapdragon,terminal
|
|
11
|
+
Classifier: Development Status :: 4 - Beta
|
|
12
|
+
Classifier: Environment :: Console
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
15
|
+
Classifier: Operating System :: Microsoft :: Windows
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
20
|
+
Classifier: Topic :: Terminals
|
|
21
|
+
Requires-Python: >=3.11
|
|
22
|
+
Requires-Dist: numpy>=1.26
|
|
23
|
+
Requires-Dist: onnxruntime>=1.18
|
|
24
|
+
Provides-Extra: dev
|
|
25
|
+
Requires-Dist: ruff>=0.4; extra == 'dev'
|
|
26
|
+
Description-Content-Type: text/markdown
|
|
27
|
+
|
|
28
|
+
# Hex CLI
|
|
29
|
+
|
|
30
|
+
Hex CLI is a coding agent for the Windows terminal, similar to aider or
|
|
31
|
+
Claude Code, that runs a local model on the Snapdragon Hexagon NPU. It reads
|
|
32
|
+
and edits files, runs commands, and checks its own work. The model is
|
|
33
|
+
Qwen3-4B, served by [npurun](https://github.com/bpbonker/npurun). After
|
|
34
|
+
setup it works offline.
|
|
35
|
+
|
|
36
|
+
**Ask something.** The answer streams in, markdown and all, above an input
|
|
37
|
+
box that stays on the last rows.
|
|
38
|
+
|
|
39
|
+

|
|
40
|
+
|
|
41
|
+
**Ask about the machine.** Live state comes from a real command, shown as
|
|
42
|
+
it runs.
|
|
43
|
+
|
|
44
|
+

|
|
45
|
+
|
|
46
|
+
**Change code.** Every file change prints a diff; when you ask for the
|
|
47
|
+
tests, they run; `/diff` shows the turn's changes and `/undo` takes them
|
|
48
|
+
back, files included.
|
|
49
|
+
|
|
50
|
+

|
|
51
|
+
|
|
52
|
+
**Nothing destructive runs unasked.** Commands are classified before they
|
|
53
|
+
run; a delete asks first.
|
|
54
|
+
|
|
55
|
+

|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
> the median calc in processor.py is wrong for even-length lists, fix it
|
|
59
|
+
|
|
60
|
+
◆ read_file
|
|
61
|
+
▸ [read] processor.py (lines 1-40 of 40)
|
|
62
|
+
|
|
63
|
+
◆ edit_file
|
|
64
|
+
▸ [edit] processor.py (+2 lines)
|
|
65
|
+
~ processor.py (+3 −1)
|
|
66
|
+
@@ -12,4 +12,6 @@
|
|
67
|
+
- return sorted(data)[len(data) // 2]
|
|
68
|
+
+ mid = len(data) // 2
|
|
69
|
+
+ if len(data) % 2 == 0:
|
|
70
|
+
+ return (sorted(data)[mid - 1] + sorted(data)[mid]) / 2
|
|
71
|
+
|
|
72
|
+
◆ run_code
|
|
73
|
+
|
|
74
|
+
Fixed: even-length lists now average the two middle values. The test file
|
|
75
|
+
prints 3.5 for [1, 2, 5, 6].
|
|
76
|
+
|
|
77
|
+
──────────────────────────────────────────────────────────────────
|
|
78
|
+
> ask, or / for commands
|
|
79
|
+
──────────────────────────────────────────────────────────────────
|
|
80
|
+
context ◔ 21% npu 0% mem 12.5/15.6 GB ~\proj (main)
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Your messages sit on a light band, the input box and status line stay on
|
|
84
|
+
the last rows, and the answer streams in above them.
|
|
85
|
+
|
|
86
|
+
## Requirements
|
|
87
|
+
|
|
88
|
+
- Windows 11 on ARM with a Snapdragon X series chip
|
|
89
|
+
- Python 3.11 or newer
|
|
90
|
+
- The Qualcomm QAIRT SDK, 2.50 or newer (free developer account needed)
|
|
91
|
+
|
|
92
|
+
Tested on a Snapdragon X Elite. It will not run on x86 machines or on Macs.
|
|
93
|
+
|
|
94
|
+
## Install
|
|
95
|
+
|
|
96
|
+
```powershell
|
|
97
|
+
git clone https://github.com/NathanL15/Hex-CLI
|
|
98
|
+
cd Hex-CLI
|
|
99
|
+
.\install.ps1
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
The installer checks the machine, installs the package (`pip install .`,
|
|
103
|
+
which gives you the `hex` and `hexcli` commands), downloads npurun, the
|
|
104
|
+
model and the small embedding model that semantic memory uses, and runs
|
|
105
|
+
`--doctor` when it finishes. It skips steps that are already done, so run
|
|
106
|
+
it again after fixing anything it reports. Everything it writes for you
|
|
107
|
+
lives in `~\.shellai`.
|
|
108
|
+
|
|
109
|
+
It cannot download the QAIRT SDK for you, because Qualcomm does not allow
|
|
110
|
+
redistribution. It prints instructions for that step and picks the SDK up on
|
|
111
|
+
the next run. See [Setup by hand](#setup-by-hand) if you want to do the
|
|
112
|
+
steps yourself.
|
|
113
|
+
|
|
114
|
+
The Start Menu shortcut opens Hex in Windows Terminal when it is installed,
|
|
115
|
+
through a "Hex CLI" profile the installer registers. It starts in your home
|
|
116
|
+
folder; `/cwd <path>` moves into a project, whose `AGENTS.md` then applies. Text selection, copy
|
|
117
|
+
and paste work there as in any other tab. Without Windows Terminal the
|
|
118
|
+
shortcut uses the classic console, where drag-select is off because Hex
|
|
119
|
+
disables QuickEdit (a click would otherwise freeze output); use the window
|
|
120
|
+
menu's Edit, Mark to copy there. To have `hex` itself open in Windows
|
|
121
|
+
Terminal from any shell, set it as the default terminal in its Settings,
|
|
122
|
+
Startup.
|
|
123
|
+
|
|
124
|
+
## Usage
|
|
125
|
+
|
|
126
|
+
```powershell
|
|
127
|
+
hex # start the NPU server and the REPL
|
|
128
|
+
hexcli # REPL only, if the server is already running
|
|
129
|
+
hexcli "what changed in this repo today?"
|
|
130
|
+
git diff | hexcli "review this diff"
|
|
131
|
+
echo "summarize README.md" | hexcli
|
|
132
|
+
hexcli --doctor # check the install
|
|
133
|
+
hexcli --update # refresh npurun (and pull the source in a checkout)
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
In a checkout without the package installed, `python launcher.py` and
|
|
137
|
+
`python -m hexcli.agent` are the same two commands.
|
|
138
|
+
|
|
139
|
+
Piped input is added to the request as context, or used as the request if
|
|
140
|
+
there is no argument. Long input is trimmed to fit the context window.
|
|
141
|
+
When stdout is not a terminal the answer is printed alone, with no
|
|
142
|
+
progress text, so `hexcli "..." > answer.txt` and `hexcli "..." | clip`
|
|
143
|
+
work.
|
|
144
|
+
|
|
145
|
+
### Commands
|
|
146
|
+
|
|
147
|
+
| Command | Does |
|
|
148
|
+
|---|---|
|
|
149
|
+
| `/help` | list all commands |
|
|
150
|
+
| `/clear` | clear the screen and the chat |
|
|
151
|
+
| `/new` | start a new chat, keep the scrollback |
|
|
152
|
+
| `/history` | list past sessions |
|
|
153
|
+
| `/resume <n>` | reopen a past session |
|
|
154
|
+
| `/search <text>` | find past sessions by content |
|
|
155
|
+
| `/diff` | show what the agent changed this turn |
|
|
156
|
+
| `/undo` | revert the last exchange, including any files it wrote |
|
|
157
|
+
| `/stats` | turns, time, tokens, context usage |
|
|
158
|
+
| `/context` | how full the context is and when it will compact |
|
|
159
|
+
| `/compact` | compress the history now |
|
|
160
|
+
| `/memory` | inspect the memory store |
|
|
161
|
+
| `/config [key [value]]` | view or set a config value for this session |
|
|
162
|
+
| `/setup` | config wizard, writes the config file |
|
|
163
|
+
| `/tools` | list the agent's tools |
|
|
164
|
+
| `/cwd [path]` | show or change the working directory |
|
|
165
|
+
| `/doctor` | check the install |
|
|
166
|
+
| `Esc` | cancel the running step |
|
|
167
|
+
|
|
168
|
+
You can add your own commands. Put a `.md` file in `.shellai/commands/` in
|
|
169
|
+
the project, or `~/.shellai/commands/` for all projects, and `/<filename>`
|
|
170
|
+
sends its content as the prompt. `$ARGUMENTS` in the file is replaced with
|
|
171
|
+
whatever follows the command.
|
|
172
|
+
|
|
173
|
+
```powershell
|
|
174
|
+
# .shellai/commands/review.md contains: Review $ARGUMENTS for bugs and style issues.
|
|
175
|
+
/review src/parser.py
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### Editing keys
|
|
179
|
+
|
|
180
|
+
| Key | Does |
|
|
181
|
+
|---|---|
|
|
182
|
+
| `↑` `↓` | history. With text typed, searches by that prefix |
|
|
183
|
+
| `Tab` | complete commands, config keys, and file paths |
|
|
184
|
+
| `Ctrl+←` `Ctrl+→` | move by word |
|
|
185
|
+
| `Home` `End` | start or end of line |
|
|
186
|
+
| `Ctrl+W` `Ctrl+U` `Ctrl+K` | delete the word before, to line start, to line end |
|
|
187
|
+
| `Esc` | clear the line |
|
|
188
|
+
| `Ctrl+V` | paste a block. Nothing is sent until you press Enter |
|
|
189
|
+
| `Shift+Enter` | new line inside the entry |
|
|
190
|
+
| `\` then `Enter` | continue on a new line |
|
|
191
|
+
| `Ctrl+Plus` `Ctrl+Minus` | text size in the classic console |
|
|
192
|
+
|
|
193
|
+
History is saved in `~/.shellai/input_history`. When stdin is not a
|
|
194
|
+
terminal the agent falls back to plain `input()`, so pipes and CI work.
|
|
195
|
+
|
|
196
|
+
The input box stays on the last rows of the window, and the conversation
|
|
197
|
+
scrolls up above it. The status line under it
|
|
198
|
+
shows how full the context is, the NPU load (the counter behind Task
|
|
199
|
+
Manager's NPU graph), memory in use, and the working directory and branch.
|
|
200
|
+
Set `status_bar` to `false` for the old inline prompt.
|
|
201
|
+
|
|
202
|
+
### Project instructions
|
|
203
|
+
|
|
204
|
+
If a project has an `AGENTS.md`, the agent reads it every turn. Keep it
|
|
205
|
+
under about 1,200 characters. The model has a 4K token context and your
|
|
206
|
+
request has to fit in there too.
|
|
207
|
+
|
|
208
|
+
### Tools
|
|
209
|
+
|
|
210
|
+
`run_command`, `read_file`, `edit_file`, `write_file`, `append_file`,
|
|
211
|
+
`list_directory`, `search_files`, `find_files`, `verify_syntax`, `run_code`,
|
|
212
|
+
`lint_code`, `search_memory`, `fetch_url`, `batch`, `delegate`. Run `/tools`
|
|
213
|
+
for the full signatures.
|
|
214
|
+
|
|
215
|
+
`edit_file` tries an exact match first, then a whitespace-tolerant match,
|
|
216
|
+
then a close match if there is exactly one. If the match is ambiguous it
|
|
217
|
+
returns an error rather than guessing. `read_file` reads large files in
|
|
218
|
+
pages. Every file change prints a diff and can be reverted with `/undo`.
|
|
219
|
+
|
|
220
|
+
## Safety
|
|
221
|
+
|
|
222
|
+
Commands are classified before they run:
|
|
223
|
+
|
|
224
|
+
| Level | Examples | Behaviour |
|
|
225
|
+
|---|---|---|
|
|
226
|
+
| destructive | `Remove-Item`, `git reset --hard`, `format-*`, `iex` | asks first |
|
|
227
|
+
| sensitive | ssh/gpg/aws keys, hosts file, registry hives, credential stores, `-EncodedCommand` | asks first, denied when non-interactive |
|
|
228
|
+
| safe | `Get-*`, `ls`, `git status` | runs |
|
|
229
|
+
| caution | anything else | runs |
|
|
230
|
+
|
|
231
|
+
File writes stay inside the working directory unless you widen the scope
|
|
232
|
+
with `workspace_write_allow`. Reads can go anywhere. Key and credential
|
|
233
|
+
paths are blocked for all file tools.
|
|
234
|
+
|
|
235
|
+
`fetch_url` is the only tool that touches the network. It asks before every
|
|
236
|
+
fetch, and is refused when non-interactive. Set `network_access` to
|
|
237
|
+
`"deny"` to remove the tool or `"allow"` to skip the prompt.
|
|
238
|
+
|
|
239
|
+
Each classified command is appended to `.shellai/audit.log`. Text inside
|
|
240
|
+
files and tool output is treated as data, not instructions. A 4B model does
|
|
241
|
+
not reliably resist prompt injection, so none of the above depends on it
|
|
242
|
+
doing so.
|
|
243
|
+
|
|
244
|
+
## Configuration
|
|
245
|
+
|
|
246
|
+
Config is optional. `~\.shellai\shellai.json` and `.shellai/config.json`
|
|
247
|
+
in a project are merged over the defaults, so you only need to write the
|
|
248
|
+
keys you change. `shellai.example.json` lists every key with its default,
|
|
249
|
+
and `/setup` writes the file for you.
|
|
250
|
+
|
|
251
|
+
| Key | Default | Effect |
|
|
252
|
+
|---|---|---|
|
|
253
|
+
| `max_agent_steps` | `15` | tool calls per turn |
|
|
254
|
+
| `live_streaming` | `true` | show the answer as it arrives |
|
|
255
|
+
| `rich_input` | `true` | history, Tab completion, multi-line paste |
|
|
256
|
+
| `side_padding` | `2` | left margin in columns |
|
|
257
|
+
| `status_bar` | `true` | input box and status line at the bottom |
|
|
258
|
+
| `user_highlight` | `true` | light band behind your messages in the transcript |
|
|
259
|
+
| `show_diffs` | `true` | print a diff after each file change |
|
|
260
|
+
| `workspace_write_scope` | `true` | keep writes inside the working directory |
|
|
261
|
+
| `autopilot_confirm_sensitive` | `true` | ask before touching keys and credentials |
|
|
262
|
+
| `network_access` | `"ask"` | `"deny"` or `"allow"` |
|
|
263
|
+
| `require_verification` | `true` | ask the agent to check its own edits |
|
|
264
|
+
| `prompt_split` | `true` | answer plain questions without the tool loop |
|
|
265
|
+
| `escalation_local_model` | `""` | a larger local model to consult when stuck |
|
|
266
|
+
| `memory_enabled` | `true` | semantic memory |
|
|
267
|
+
| `chat_log_enabled` | `true` | write full session logs |
|
|
268
|
+
| `protocol` | `"v1"` | `"v2"` is experimental |
|
|
269
|
+
|
|
270
|
+
## Logs and memory
|
|
271
|
+
|
|
272
|
+
Each session is written to `~/.shellai/chatlog/` as a JSONL file: every
|
|
273
|
+
request, every message sent to the model, every reply with its latency,
|
|
274
|
+
every tool call with its output. Secrets in the config are redacted.
|
|
275
|
+
`/stats` prints the path of the current file.
|
|
276
|
+
|
|
277
|
+
```powershell
|
|
278
|
+
python tools/chatlog_report.py # summary across all sessions
|
|
279
|
+
python tools/chatlog_report.py --last # replay the most recent session
|
|
280
|
+
python tools/chatlog_report.py --session 1a2b # replay one session by id prefix
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
Memory is two local stores, one per project and one global, built on MiniLM
|
|
284
|
+
embeddings. When idle, the agent condenses recent turns into short notes
|
|
285
|
+
that are included in later prompts. `/memory` shows what is stored.
|
|
286
|
+
|
|
287
|
+
## Setup by hand
|
|
288
|
+
|
|
289
|
+
These are the steps `install.ps1` performs. `--doctor` checks each one.
|
|
290
|
+
|
|
291
|
+
**1. The package**
|
|
292
|
+
|
|
293
|
+
```powershell
|
|
294
|
+
pip install . # from the checkout: the hex and hexcli commands, numpy, onnxruntime
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
`ruff` is optional and enables the `lint_code` tool.
|
|
298
|
+
|
|
299
|
+
**2. QAIRT SDK**
|
|
300
|
+
|
|
301
|
+
Install version 2.50 or newer to `C:\Qualcomm\AIStack\QAIRT_<version>`.
|
|
302
|
+
2.47 also works, but 2.50 lets the server keep the prompt cache between
|
|
303
|
+
calls, which makes turns about 40% faster.
|
|
304
|
+
|
|
305
|
+
The launcher uses the newest install it finds in that folder. To pin one,
|
|
306
|
+
set both variables:
|
|
307
|
+
|
|
308
|
+
```powershell
|
|
309
|
+
setx QNN_SDK_ROOT "C:\Qualcomm\AIStack\QAIRT_2.50.0"
|
|
310
|
+
setx ADSP_LIBRARY_PATH "C:\Qualcomm\AIStack\QAIRT_2.50.0\lib\hexagon-v73\unsigned"
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
If `ADSP_LIBRARY_PATH` is missing, npurun crashes with
|
|
314
|
+
`STATUS_STACK_BUFFER_OVERRUN`.
|
|
315
|
+
|
|
316
|
+
**3. npurun and a model**
|
|
317
|
+
|
|
318
|
+
The NPU server is a fork of npurun, at
|
|
319
|
+
[NathanL15/npurun](https://github.com/NathanL15/npurun) on the
|
|
320
|
+
`hexcli-fork` branch. Each release there has a prebuilt `npurun-arm64.exe`.
|
|
321
|
+
Hex CLI expects one specific build, set by `REQUIRED_NPURUN` in
|
|
322
|
+
`hexcli/launcher.py`. `--doctor` fails on an older build and `--update`
|
|
323
|
+
replaces it (the download goes to `~\.shellai\bin`).
|
|
324
|
+
|
|
325
|
+
To build from source, use the fork. It has the prompt cache rewind, usage
|
|
326
|
+
reporting, exact `max_tokens`, and request watchdog that Hex CLI relies on.
|
|
327
|
+
|
|
328
|
+
```powershell
|
|
329
|
+
git clone -b hexcli-fork https://github.com/NathanL15/npurun
|
|
330
|
+
cd npurun
|
|
331
|
+
cmd /c "scripts\dev-shell-local.bat cargo install --path crates\npurun-cli"
|
|
332
|
+
npurun pull qwen3-4b-instruct-2507 # about 2.5 GB
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
**4. Embedding model**
|
|
336
|
+
|
|
337
|
+
About 23 MB, into `~\.shellai\onnx`. Memory is disabled without it.
|
|
338
|
+
|
|
339
|
+
```powershell
|
|
340
|
+
mkdir ~\.shellai\onnx
|
|
341
|
+
curl -L -o ~\.shellai\onnx\model_qint8_arm64.onnx https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/onnx/model_qint8_arm64.onnx
|
|
342
|
+
curl -L -o ~\.shellai\onnx\tokenizer.json https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/tokenizer.json
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
## Limitations
|
|
346
|
+
|
|
347
|
+
- A 4B model. It handles small, well-defined edits and questions about a
|
|
348
|
+
codebase. It is not a match for a hosted frontier model on large or vague
|
|
349
|
+
tasks.
|
|
350
|
+
- 4,096 tokens of context. History is compacted often, and long files are
|
|
351
|
+
read in pages.
|
|
352
|
+
- About 15 tokens per second on a Snapdragon X Elite. A follow-up turn takes
|
|
353
|
+
a second or two. The first turn of a new conversation takes longer while
|
|
354
|
+
the server rebuilds the prompt cache.
|
|
355
|
+
- Windows on ARM only. Nothing here is portable to other platforms without
|
|
356
|
+
a different backend.
|
|
357
|
+
|
|
358
|
+
## Development
|
|
359
|
+
|
|
360
|
+
CI runs `ruff` and 25 offline test suites against a mock backend, so no NPU
|
|
361
|
+
is needed for those:
|
|
362
|
+
|
|
363
|
+
```powershell
|
|
364
|
+
python evals/test_core.py
|
|
365
|
+
python evals/test_agent_loop.py
|
|
366
|
+
python evals/test_product_shell.py
|
|
367
|
+
python evals/test_lineedit.py
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
The live evals need the NPU server. They check what the model actually did,
|
|
371
|
+
by looking at the filesystem and the answer, and run each case several
|
|
372
|
+
times because the model is not deterministic.
|
|
373
|
+
|
|
374
|
+
```powershell
|
|
375
|
+
python evals/cases_smoke.py # quick check
|
|
376
|
+
python evals/cases_extended.py --runs 3 # 41 cases
|
|
377
|
+
python evals/cases_multiturn.py --runs 3 --think-time 15
|
|
378
|
+
python evals/compare.py <before.json> <after.json>
|
|
379
|
+
python evals/gate.py --baseline <base.json> <candidate.json>
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
Restart the NPU server before each suite. After an hour or two of steady
|
|
383
|
+
use it starts returning errors for everything, which looks like a model
|
|
384
|
+
regression. The runner detects this and marks those runs invalid.
|
|
385
|
+
|
|
386
|
+
`ARCHITECTURE.md` describes the module layout. `docs/V2_PLAN.md` has the
|
|
387
|
+
hardware measurements, the eval method, and the reasoning behind each
|
|
388
|
+
safety layer. `RELEASING.md` covers how a release is cut.
|
|
389
|
+
|
|
390
|
+
## License
|
|
391
|
+
|
|
392
|
+
MIT. See [LICENSE](LICENSE).
|
|
393
|
+
|
|
394
|
+
npurun is Apache 2.0. The QAIRT SDK is Qualcomm's and has its own terms.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
hexcli/__init__.py,sha256=C5c8rZZMGktk0oXyWJ36i4WSEjnhntt-1bvDVaYQN_c,239
|
|
2
|
+
hexcli/agent.py,sha256=fKpaSkFqbuyPyVevzz9gTaxjtH1LS7Xs4t1lV3MQ_f0,83731
|
|
3
|
+
hexcli/cancel.py,sha256=gZJX2dRWUrixJV-TRNmkDvhx4v4zszTT_6Ud-HKuVO0,2150
|
|
4
|
+
hexcli/chatlog.py,sha256=HCbayFns_I7wwqCD43NO1EoXCshL7DPVv8FJF6kC9_0,9601
|
|
5
|
+
hexcli/commands.py,sha256=1rmQavrtyTilSBvUEWNk21Femxy8r0vVghF5Jt0G9OI,2765
|
|
6
|
+
hexcli/compaction.py,sha256=vIMl10lmPIdeO6egdNflZNkWGdoYfoIvYv5zdkFpO2o,12951
|
|
7
|
+
hexcli/config.py,sha256=cVNfRjBNokgxPCTHBsIM9hmCpNmhMRU_mBQNRzC8C5I,9510
|
|
8
|
+
hexcli/diffview.py,sha256=bzjzXi7byMKRx1yyeAJH3XHPx4Ye3vKzJ44VYEP-Ymo,3535
|
|
9
|
+
hexcli/distribution.py,sha256=FOg-3xmcF9G146EFmdPWkpKl9U-xvS3Pzr_QnT1hOBU,8348
|
|
10
|
+
hexcli/doctor.py,sha256=AaCAHRnq8EmvKkPWvyhb6ejZplofnxQKS50ZFnwOQJY,10783
|
|
11
|
+
hexcli/escalate.py,sha256=3wn8KUOpYCa2aqJe80dqu0eKHOM6dYURHnp4_23genA,6892
|
|
12
|
+
hexcli/http_client.py,sha256=ltESw9PR8ePwdexy-P8Im3eaXFdm86akVp8ijzblAl8,5857
|
|
13
|
+
hexcli/launcher.py,sha256=hthUcEWFaPTDrH8YSpYco2me6j3aqvKgmwAlulg4QRE,20160
|
|
14
|
+
hexcli/lineedit.py,sha256=AM5KigL4mk-3yShNpCDN8q0VfNH9wzxKzg7fCavJVfI,44745
|
|
15
|
+
hexcli/llm.py,sha256=h6YF_chcDouNkpsVAiGhwXzJlqFnQgjA8XD0GVk55bM,23138
|
|
16
|
+
hexcli/local_escalation.py,sha256=Q4ezDTLJRqvnpOi934aEQMTnNLQoNwA3ExP2LFEnaWs,7448
|
|
17
|
+
hexcli/lockfile.py,sha256=T1AQEju_DxDdg4gfqr5tH1eOwyDIgrPygWlfrDryLGc,2343
|
|
18
|
+
hexcli/loop_v2.py,sha256=CoJisB31Nh5cmuQnebYLMwlHQPLKKjn5KGfUTm5jNkw,17346
|
|
19
|
+
hexcli/markdown_stream.py,sha256=7c62BO6vXFLt3EiYYXpUH6DZkDU6PfxSHLjdfUHZt8o,10132
|
|
20
|
+
hexcli/memory.py,sha256=RCj0jrKmwIz2Le-HkGAsp_nH0ik0RoeAoVCtmfKehxE,15258
|
|
21
|
+
hexcli/network.py,sha256=WNRyW4GJx0Y5wmUU0cfBUlCUkPXR3NKwlkrAbuMM_Ho,5201
|
|
22
|
+
hexcli/parsing.py,sha256=wkm8Bt-3qbzHRHbv9mAjYCs4pcQ0jsMfNPJsdjeR4_M,8525
|
|
23
|
+
hexcli/paths.py,sha256=T_9EbSR6INlgXFAxbCRnSoBktm2rLi-duKjVIcjQHZg,4006
|
|
24
|
+
hexcli/prompts.py,sha256=QArEyd08lH0WoO_4ORojn_3rrDZcFsFwn0h04MI5JgI,18864
|
|
25
|
+
hexcli/protocol_v2.py,sha256=3hHs_AN0RPOKOihQaUMvuC2AaUGDX1DXsxB4F4fQzUw,25405
|
|
26
|
+
hexcli/repl.py,sha256=J7NAlQ_7KWEOb6mOKIkLCd41DvZ-h524EAvzlXndlsw,37227
|
|
27
|
+
hexcli/safety.py,sha256=57iCipYvKDvezgdS0AvV2LkS1BynQHZF_8E_GND8JIo,5487
|
|
28
|
+
hexcli/sessions.py,sha256=7TNfU4pfgnJYTICOBCzIRs6ROWids9SjOYlRlAdjhi8,8173
|
|
29
|
+
hexcli/setup_wizard.py,sha256=np3RjKwyoMuxdJQSUhJ3dQGy4nbE-FininvBEOTl7us,5547
|
|
30
|
+
hexcli/shell_session.py,sha256=rZ9ip2jizLtQfTck3-8mcSjTZXq6S4gJhDigb4ntER0,8307
|
|
31
|
+
hexcli/statusbar.py,sha256=3CWz1e_bpjONPA7JuUvRlA-q1Suraowb3nWgvDvJ9kM,36608
|
|
32
|
+
hexcli/stream_render.py,sha256=FYDwGb-XWEj13jcJJg69szHG-T0LwFlq5-kf7BoAJ3w,8932
|
|
33
|
+
hexcli/telemetry.py,sha256=eghXX6yChYNp-vDKP4fwSqPZzEbvAa2G89-LblBDmZo,4756
|
|
34
|
+
hexcli/tools.py,sha256=phjLMftiYn4HytvdfN7OC09CZjYMPTfMKgNIVwXa4p8,31127
|
|
35
|
+
hexcli/ui.py,sha256=5FEwNHxR0QehOonRX_PvIKX_qAArzZYjCu8dh3lSG4c,43893
|
|
36
|
+
hexcli/assets/hexcli.ico,sha256=LkMAk7mOShn6VCafsBq9EVQTKy-szN7OFcgbPJ3FK3w,60080
|
|
37
|
+
hexcli/assets/hexcli.png,sha256=Fco7qSFwMGoXF-pnNoA10rB-o_Wij9KMx3n2b9KaSZo,31365
|
|
38
|
+
hexcli-2.8.0.dist-info/METADATA,sha256=d3-XTkCXepPctfHHtB4gqtnn7vVlCGiaTZKMRYll2NM,15842
|
|
39
|
+
hexcli-2.8.0.dist-info/WHEEL,sha256=zOwg4jB6zX2kU910N-cMawjivD6tO8NEWvE12je1bVk,87
|
|
40
|
+
hexcli-2.8.0.dist-info/entry_points.txt,sha256=siibVCtS_CEA65VGsoGj1a7n-qNHDTi_gC3jq9McYeQ,72
|
|
41
|
+
hexcli-2.8.0.dist-info/licenses/LICENSE,sha256=1mfF8m8fVppTDYGH79GTtUb4Jl_qBDXJGweqNxXHCqQ,1066
|
|
42
|
+
hexcli-2.8.0.dist-info/RECORD,,
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 NathanL15
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|