@chipschat/hermes 1.0.4 → 1.0.7
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/README.md +54 -7
- package/dist/THIRD-PARTY-NOTICES.md +1 -1
- package/dist/main.js +1928 -196
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -23,19 +23,44 @@ Apache-2.0. Not published: a local repository until Chips's SDK is.
|
|
|
23
23
|
| The reply | `run.completed`'s `output`, else the `message.delta`s |
|
|
24
24
|
| Files in the reply | each `MEDIA:<path>` line of its own in the reply, taken out of the words and sent from the agent's folder; a file outside it is refused, and the reply says so. Each run is told how in its `instructions`, which Hermes adds to the system prompt, over its own hint that its API server sends only pictures |
|
|
25
25
|
| Cost | the run's tokens; a sub-agent's `cost_usd` as its step's share |
|
|
26
|
-
| An approval card | `approval.request` → `POST …/approval`: once, session or always where Hermes offers it, else once; deny for a no. One answered in Hermes's own tools is settled in Chips (ADR 0079) |
|
|
26
|
+
| An approval card | `approval.request` → `POST …/approval`: once, session or always where Hermes offers it, else once, and once for a command, which Chips remembers by how each part starts (Chips ADR 0239); deny for a no. One answered in Hermes's own tools is settled in Chips (ADR 0079) |
|
|
27
27
|
| "Not right?" on a reply (ADR 0200) | a run of the agent that said it, in its session in the room, after the room's other turns: told its reply and the person's note (or, for a bare 👎, that there was none), it answers again in its place |
|
|
28
28
|
| Fork (ADR 0087) | `POST /api/sessions/{id}/fork` of the agent's session in the room it is in (else the last it had), from its latest id when Hermes has compressed it, under an id made from the ask, so an ask heard twice forks once. Hermes ends the original as `branched`, and the original's runs go on in it. A turn still going isn't in the copy. An agent that never spoke is copied with nothing to remember |
|
|
29
29
|
| Stop | `POST …/stop` |
|
|
30
30
|
| A steer, a follow-up, an interrupt | `POST …/steer`; the next run of the turn; stop, then the next run with the words |
|
|
31
31
|
| Trouble on the harness | `GET /health` every 30 s, per profile |
|
|
32
|
+
| Restart on its page (ADR 0094) | Hermes's gateway restarted on this machine, and Hermes shown as restarting until its API server answers again (below) |
|
|
33
|
+
| Context (ADRs 0134, 0238) | the files Hermes builds the agent from: `SOUL.md` (who it is), `memories/USER.md` and `memories/MEMORY.md` in the profile's home, and the first project file with words in it in the folder Hermes's gateway works in (`.hermes.md`, `HERMES.md`, `AGENTS.md` and the rest Hermes looks for). The first profile's files and the project file are the harness's own set, since every new agent reads them; another profile's files are the agent's own until a fork reads them too. An edit is saved where Hermes reads it, only if the file is still the one the person changed. A memory file is saved as Hermes saves it, under its lock, entries apart by a line with only `§`, and an edit over Hermes's limit (2,200 and 1,375 characters unless `config.yaml` says others) is refused with how much to take out. The page says Hermes reads them when a conversation starts: a space already talking picks up a change after it next compacts |
|
|
34
|
+
| Context window (ADR 0146) | how full the agent's session is, from the webhook below: the last model call's prompt tokens, of its model's window. A sharp drop in a session is a compaction, and a turn past half the window says its peak. Read only: the limit is the profile's `compression.threshold` (75% under 512K tokens unless set higher), and Hermes can't be asked to compact from Chips. Nothing is shown until Hermes's first reading |
|
|
32
35
|
|
|
33
36
|
Not yet:
|
|
34
37
|
- Hermes's clarify questions (their event isn't documented).
|
|
35
38
|
- Its cron jobs as Chips schedules (ADR 0157).
|
|
36
39
|
- Its model list as the agent's Model group.
|
|
37
|
-
|
|
38
|
-
|
|
40
|
+
|
|
41
|
+
**How full each context is: Hermes's webhook.** Hermes's API server reports no window during a
|
|
42
|
+
run, so the bridge adds an outbound webhook to each profile's `config.yaml` when it starts (and
|
|
43
|
+
in the check before a link is taken up):
|
|
44
|
+
|
|
45
|
+
```yaml
|
|
46
|
+
hooks:
|
|
47
|
+
outbound:
|
|
48
|
+
- name: chips
|
|
49
|
+
url: http://127.0.0.1:<port>/chips-hermes/default
|
|
50
|
+
events: [post_api_request]
|
|
51
|
+
secret_env: CHIPS_HOOK_SECRET
|
|
52
|
+
timeout: 5
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
It only ever adds: with no `hooks:` it appends this block, and under a `hooks:` with no
|
|
56
|
+
`outbound:` yet it puts `outbound:` first. Anything else it leaves as it is, and its log says the
|
|
57
|
+
lines to add. The secret goes in the profile's `.env`, which Hermes loads into its gateway; a
|
|
58
|
+
profile with no `.env` gets the secret in the entry instead. Hermes reads its hooks when its
|
|
59
|
+
gateway starts, so after the bridge adds one, start `hermes gateway` again once (the setup step
|
|
60
|
+
says so when the gateway was running). After every model call Hermes then POSTs the call's
|
|
61
|
+
numbers, signed, to the bridge on 127.0.0.1. Hermes sends the reply's words too: the bridge
|
|
62
|
+
checks the signature, keeps only the numbers, and drops the rest. The port is chosen the first
|
|
63
|
+
time and kept; `hookPort` in the config fixes one.
|
|
39
64
|
|
|
40
65
|
**Approvals and Hermes v0.20.6.** Hermes's API server counts itself as unattended (issue
|
|
41
66
|
[#98728](https://github.com/NousResearch/hermes-agent/issues/98728), open on 14 October 2026). So a
|
|
@@ -97,8 +122,29 @@ writes a launch agent (`~/Library/LaunchAgents/chat.chips.hermes.plist`; a syste
|
|
|
97
122
|
Linux) that runs the bridge from login and again whenever it stops, and ends: closing the terminal
|
|
98
123
|
or restarting the machine no longer takes it offline in Chips. Its log is
|
|
99
124
|
`~/Library/Logs/chips-hermes.log`. `npm run keep -- --stop` stops it and removes the file. Stop a
|
|
100
|
-
copy started by hand first: two answer twice.
|
|
101
|
-
|
|
125
|
+
copy started by hand first: two answer twice. When the bridge starts and nothing answers at a local
|
|
126
|
+
address, it starts Hermes's gateway (below), so Hermes comes back after a reboot too.
|
|
127
|
+
|
|
128
|
+
**Restart.** Restart on Hermes's page in Chips restarts Hermes's gateway, the process serving its
|
|
129
|
+
API server at the agents' address, when that is on this machine:
|
|
130
|
+
- Installed as Hermes's own service (`hermes gateway install`, so
|
|
131
|
+
`~/Library/LaunchAgents/ai.hermes.gateway.plist` or a systemd unit), `hermes gateway restart`.
|
|
132
|
+
- Run by hand, the process listening on the API's port is stopped (SIGTERM, then SIGKILL if it is
|
|
133
|
+
still there 15 s later), only if it is this user's `hermes gateway run`. Anything else there is
|
|
134
|
+
left alone, and Chips says so. Then `hermes gateway run` is started again with the same words, in
|
|
135
|
+
the folder it worked in, in a session of its own, its output added to
|
|
136
|
+
`~/Library/Logs/chips-hermes-gateway.log`.
|
|
137
|
+
|
|
138
|
+
Chips shows Hermes as restarting until its API server answers again, then fine, or in a line what
|
|
139
|
+
went wrong. Started with the bridge, it is the same, with `hermes gateway start` for a service. The
|
|
140
|
+
bridge asks for `restarts` when it joins with a code; a harness joined without it gets Restart
|
|
141
|
+
once Chips is told it takes it (`chips declare`, ADR 0046).
|
|
142
|
+
|
|
143
|
+
On a Mac whose Homebrew python@3.14 can't load macOS's expat, Hermes dies as it starts with
|
|
144
|
+
`Symbol not found: _XML_SetAllocTrackerActivationThreshold`. Then the bridge starts Hermes's entry
|
|
145
|
+
point (the one the `hermes` wrapper runs) directly, with the wrapper's variables and
|
|
146
|
+
`DYLD_LIBRARY_PATH=/opt/homebrew/opt/expat/lib`, which macOS would drop at the wrapper, and its log
|
|
147
|
+
says so.
|
|
102
148
|
|
|
103
149
|
**Folders.** Each agent gets a folder of its own, `~/chips-hermes/agents/<its name>`, made the
|
|
104
150
|
first time it is spoken to and kept by its Chips agent after a rename. Each run tells the agent it
|
|
@@ -122,8 +168,9 @@ npm test
|
|
|
122
168
|
```
|
|
123
169
|
|
|
124
170
|
They run the bridge against Chips's conformance fake and a scripted Hermes API server
|
|
125
|
-
(`test/fake-hermes.ts`), on Hermes's own routes and event names
|
|
126
|
-
|
|
171
|
+
(`test/fake-hermes.ts`), on Hermes's own routes and event names, and its webhook's signed
|
|
172
|
+
readings. That includes Chips's golden scenario. Hermes's own files are in temporary homes: no
|
|
173
|
+
test reads or writes `~/.hermes`. The SDK and the kit are in `vendor/`, packed from a Chips checkout with
|
|
127
174
|
`pnpm release:sdk <this repo>/vendor`.
|
|
128
175
|
|
|
129
176
|
```
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Third-party notices
|
|
2
2
|
|
|
3
|
-
`dist/main.js` in @chipschat/hermes 1.0.
|
|
3
|
+
`dist/main.js` in @chipschat/hermes 1.0.7 carries these packages, bundled in. Each one's
|
|
4
4
|
licence follows.
|
|
5
5
|
|
|
6
6
|
## @chipschat/harness 0.0.0 (Apache-2.0)
|