heyterm 0.0.0-stage → 0.1.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/LICENSE +21 -0
- package/README.md +112 -2
- package/SECURITY.md +18 -0
- package/THIRD_PARTY_NOTICES.md +2175 -0
- package/assets/logo-mark.svg +7 -0
- package/bin/heyterm.js +2 -0
- package/dist/server/cli.js +3640 -0
- package/dist/web/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
- package/dist/web/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
- package/dist/web/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
- package/dist/web/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
- package/dist/web/assets/geist-mono-cyrillic-ext-wght-normal-X_5orZeX.woff2 +0 -0
- package/dist/web/assets/geist-mono-cyrillic-wght-normal-DiZS0aHC.woff2 +0 -0
- package/dist/web/assets/geist-mono-latin-ext-wght-normal-Bwz-egvJ.woff2 +0 -0
- package/dist/web/assets/geist-mono-latin-wght-normal-XN7g48iV.woff2 +0 -0
- package/dist/web/assets/geist-mono-symbols2-wght-normal-CO5SzqOn.woff2 +0 -0
- package/dist/web/assets/geist-mono-vietnamese-wght-normal-DadHysG0.woff2 +0 -0
- package/dist/web/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
- package/dist/web/assets/index-B6Nt0upF.js +106 -0
- package/dist/web/assets/index-DG46Czg4.css +1 -0
- package/dist/web/favicon.svg +7 -0
- package/dist/web/index.html +15 -0
- package/package.json +88 -4
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Adil Husain
|
|
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.
|
package/README.md
CHANGED
|
@@ -1,3 +1,113 @@
|
|
|
1
|
-
|
|
1
|
+
<p align="center"><img src="assets/logo-mark.svg" width="96" height="96" alt="HeyTerm"></p>
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
# HeyTerm
|
|
4
|
+
|
|
5
|
+
Run your coding agents by voice. HeyTerm is one window for all your Claude Code, Codex and Gemini CLI sessions, with an assistant in the middle: you talk through Wispr Flow (or any dictation tool), it works out which session you mean and does it, and it tells you when a session needs you. Five agents at once, no keyboard, no trackpad.
|
|
6
|
+
|
|
7
|
+
## Why
|
|
8
|
+
|
|
9
|
+
When you run several agents in parallel, they spend a lot of time waiting for you. On one developer's Mac over two weeks, sessions finished or stopped to ask something 179 times while the developer was busy in another session. Those waits added up to 55 session-hours, with a median of 5.5 minutes and the longest at 3 hours 25 minutes. Measure your own with:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
python3 scripts/measure-waits.py
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## What you can say
|
|
16
|
+
|
|
17
|
+
| You say | HeyTerm does |
|
|
18
|
+
| --- | --- |
|
|
19
|
+
| "start a session in portfolio and fix the phone menu" | starts Claude Code in that project and gives it the task |
|
|
20
|
+
| "peeker, run the tests again" / "tell bookboy to use Neon" | sends your words to that session, after a 1.5 second preview you can cancel |
|
|
21
|
+
| "approve" / "no, use pnpm instead" | answers the permission at the top of the queue; a "no" passes your reason to Claude |
|
|
22
|
+
| "Neon" / "the second one" | answers a multiple-choice question, with no arrow keys |
|
|
23
|
+
| "catch me up" / "what's synqed doing?" | says what changed since you last looked |
|
|
24
|
+
| "trust it" | trusts a new folder for the session asking |
|
|
25
|
+
| "go to whisker" / "stop synqed" / "close peeker" / "bring back peeker" | focus, interrupt, close and resume |
|
|
26
|
+
| "be quiet" / "mute" / "talk to me" | announcements for questions and permissions only, sounds only, or everything |
|
|
27
|
+
|
|
28
|
+
Those happen at once on your computer. Everything else goes to the assistant in the middle: Claude (Opus 5.5 at low effort) on the Agent SDK, through your own Claude Code login, so there is no API key to set up. Ask it anything ("what is everyone doing?", "what changed in heyterm today?", "start a session in portfolio and fix the header") and it answers out loud, reads sessions, sends them work and runs commands on your Mac. It does whatever your Claude Code permission mode allows, and asks you out loud whenever Claude Code would ask. When a session needs you, the assistant tells you what it wants and what to say, in plain words, without reading the command out.
|
|
29
|
+
|
|
30
|
+
HeyTerm speaks with your Mac's own voice (whatever is set in System Settings, Accessibility, Spoken Content; Siri voices work there), or the browser's voice if you pick it in Setup.
|
|
31
|
+
|
|
32
|
+
## Getting started
|
|
33
|
+
|
|
34
|
+
You need Node.js 20 or newer on macOS, Linux or Windows, and at least one coding agent signed in once: [Claude Code](https://code.claude.com), [Codex](https://github.com/openai/codex) (`npm install -g @openai/codex`) or [Gemini CLI](https://github.com/google-gemini/gemini-cli) (`npm install -g @google/gemini-cli`). The assistant in the middle runs on Claude Code.
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
npx heyterm doctor # checks Node and which agents are installed
|
|
38
|
+
npx heyterm # starts HeyTerm and opens it in your browser
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Until the package is on npm, run it from source instead:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
git clone https://github.com/adilhusain01/heyterm && cd heyterm
|
|
45
|
+
npm install && npm run build
|
|
46
|
+
node bin/heyterm.js
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Then:
|
|
50
|
+
|
|
51
|
+
1. Click anywhere on the page once, so the browser lets HeyTerm speak.
|
|
52
|
+
2. Open Setup and check your project folders. HeyTerm looks in `~/Documents/Projects`, `~/Projects`, `~/code`, `~/dev`, `~/src` and `~/Developer` by default, and the assistant can start a session in any folder you name.
|
|
53
|
+
3. Hold your dictation key (Fn for Wispr Flow) and say "start a session in" followed by a project name. Say "start a codex session in…" or "open gemini in…" for the other agents.
|
|
54
|
+
4. Use headphones, so HeyTerm's spoken alerts never end up in your own dictation.
|
|
55
|
+
|
|
56
|
+
To see the Claude sessions you start in your own terminals as well, open Setup and turn on **Show my own sessions**. While HeyTerm runs, its hooks sit in `~/.claude/settings.json` (backed up first in `~/.heyterm/backups`); they come out when HeyTerm stops. It can answer those sessions' permissions and questions and tell you when they finish, but it can only type into sessions it started.
|
|
57
|
+
|
|
58
|
+
## Starting, stopping and removing it
|
|
59
|
+
|
|
60
|
+
| | |
|
|
61
|
+
| --- | --- |
|
|
62
|
+
| `heyterm` | starts it and opens the page, or opens the one already running |
|
|
63
|
+
| `heyterm stop`, Ctrl+C, Quit in Setup, or closing the last HeyTerm page | stops it and every session in it; they wait under Recently closed, and Bring back resumes the conversation |
|
|
64
|
+
| `heyterm uninstall` | stops it, takes its hooks out of your Claude settings and moves `~/.heyterm` to the Trash; then `npm uninstall -g heyterm` removes the command |
|
|
65
|
+
|
|
66
|
+
Closing the page stops HeyTerm after 15 seconds, so a reload never does. Setup has **Keep running without the page** if you want it to stay up.
|
|
67
|
+
|
|
68
|
+
## How it works
|
|
69
|
+
|
|
70
|
+
- **Sessions run in HeyTerm's own terminals** (pseudo-terminals it owns, the same on macOS, Linux and Windows), with a copy of each screen so the assistant can read it and a page opened later sees it.
|
|
71
|
+
- **Agent hooks report every state**, so nothing is guessed from the screen. Claude Code gets them through a settings file for its session; Codex through config overrides for that run (Codex asks once to trust them; say "trust it"). Your own `~/.codex` and Claude settings are not changed.
|
|
72
|
+
- **A permission or a multiple-choice question is held open until you answer by voice**; answering in the terminal by hand still works, and wins.
|
|
73
|
+
- **No extra gates**: HeyTerm adds no permission layer of its own. What an agent's permission mode allows, it runs; when the agent asks, you hear what it wants and its risk, and "approve" answers.
|
|
74
|
+
- **Text is sent as a real prompt**, pasted into the session and confirmed by its prompt hook.
|
|
75
|
+
- **Announcements wait for you.** Nothing is spoken while text is arriving in the command bar, lines are said one after another, and what you say goes ahead of news waiting for the assistant.
|
|
76
|
+
|
|
77
|
+
## Privacy and safety
|
|
78
|
+
|
|
79
|
+
- The server listens on `127.0.0.1` only. It refuses requests from other sites, and every hook and every page connection needs a private token from `~/.heyterm/token` (readable by you alone), so neither a web page nor another user on the same computer can type into your terminals.
|
|
80
|
+
- Every decision, by voice or click, goes into `~/.heyterm/audit.jsonl` with the time, the session, the command and the words that decided it.
|
|
81
|
+
- HeyTerm never deletes a folder or a worktree. Closing a session that is working or has uncommitted changes asks first.
|
|
82
|
+
|
|
83
|
+
## Settings
|
|
84
|
+
|
|
85
|
+
All optional; see `.env.example`.
|
|
86
|
+
|
|
87
|
+
| Variable | What it changes |
|
|
88
|
+
| --- | --- |
|
|
89
|
+
| `HEYTERM_PORT` | the port (default 4747) |
|
|
90
|
+
| `HEYTERM_PROJECT_ROOTS` | project folders, separated by `:` (`;` on Windows); Setup saves the same thing |
|
|
91
|
+
| `HEYTERM_ROUTER_MODEL` | the assistant's model (default `claude-opus-5-5`) |
|
|
92
|
+
| `ANTHROPIC_API_KEY` | run the assistant on the Claude API instead of your Claude Code login |
|
|
93
|
+
|
|
94
|
+
## Development
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
npm install
|
|
98
|
+
npm run dev # server with reload on :4747, UI with reload on :5173
|
|
99
|
+
npm test # the unit tests; CI also runs them on macOS, Linux and Windows
|
|
100
|
+
npm run typecheck
|
|
101
|
+
npm run build # dist/web and dist/server/cli.js
|
|
102
|
+
npm run build:playground # dist/playground: the same UI on three simulated agents, a static site anyone can open
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
`docs/SPEC.md` is the behaviour HeyTerm promises, and the tests are written from it. `scripts/smoke.mjs` checks an installed package end to end (start, the token wall, stop, uninstall). Pure decisions (routing, risk, session states, the attention queue) live in their own files with tests beside them.
|
|
106
|
+
|
|
107
|
+
Built for [No Hands: The Wispr Challenge](https://www.wemakedevs.org/wispr) by WeMakeDevs and Wispr Flow.
|
|
108
|
+
|
|
109
|
+
The look is specified in `docs/DESIGN.md`.
|
|
110
|
+
|
|
111
|
+
## Licence
|
|
112
|
+
|
|
113
|
+
MIT, see `LICENSE`. The packages HeyTerm ships keep their own licences, listed in `THIRD_PARTY_NOTICES.md`.
|
package/SECURITY.md
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Security
|
|
2
|
+
|
|
3
|
+
HeyTerm can type into terminals and run commands on your computer, so its local server is built to answer only you.
|
|
4
|
+
|
|
5
|
+
## What protects you
|
|
6
|
+
|
|
7
|
+
- **Local only.** The server listens on 127.0.0.1, never on the network.
|
|
8
|
+
- **A token for everything that acts.** Every agent hook, every page connection and the stop command need the secret in `~/.heyterm/token`, which only your user can read. Another user on the same computer can reach 127.0.0.1 but not the token.
|
|
9
|
+
- **The token never sits in an address.** The `heyterm` command opens the page with a one-time ticket that expires in two minutes; the page trades it for the token and clears the address.
|
|
10
|
+
- **Other websites cannot act for you.** Requests with a foreign `Origin`, a cross-site fetch, or a `Host` that is not this computer (DNS rebinding) are refused. The page cannot be framed by another site, loads no outside scripts, and sends no referrer.
|
|
11
|
+
- **What agents write is data.** Agent messages are rendered without raw HTML, and the assistant treats session text as information, never as instructions.
|
|
12
|
+
- **No gates of its own, by design.** HeyTerm follows each agent's own permission mode. What the agent allows, it runs; what the agent asks about comes to you.
|
|
13
|
+
- **Private files.** `~/.heyterm` is readable by your user alone. It holds the token, the audit log of every decision, a log of how text reached the page (event kinds and lengths, never words), and backups of your Claude settings.
|
|
14
|
+
- **Nothing left behind.** Its hooks sit in your Claude settings only while it runs, and `heyterm uninstall` removes its folder to the Trash.
|
|
15
|
+
|
|
16
|
+
## Reporting a problem
|
|
17
|
+
|
|
18
|
+
Please report security issues privately through GitHub's "Report a vulnerability" on this repository, not in a public issue. Include what you did, what happened, and the HeyTerm, Node and operating system versions.
|