@voybio/ace-swarm 2.4.1 → 2.4.2
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 +8 -0
- package/README.md +501 -56
- package/dist/cli.js +282 -2
- package/dist/helpers/constants.d.ts +2 -0
- package/dist/helpers/constants.js +1 -0
- package/dist/hermes/bridge-protocol.d.ts +41 -0
- package/dist/hermes/bridge-protocol.js +70 -0
- package/dist/hermes/launch-profile.d.ts +19 -0
- package/dist/hermes/launch-profile.js +81 -0
- package/dist/hermes/session-manager.d.ts +42 -0
- package/dist/hermes/session-manager.js +187 -0
- package/dist/local-model-runtime.d.ts +11 -0
- package/dist/local-model-runtime.js +58 -2
- package/dist/schemas.js +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.js +22 -4
- package/dist/store/materializers/vericify-projector.js +3 -0
- package/dist/store/repositories/local-model-runtime-repository.d.ts +12 -0
- package/dist/store/repositories/local-model-runtime-repository.js +3 -0
- package/dist/tools-agent.js +6 -1
- package/dist/tools.d.ts +4 -1
- package/dist/tools.js +35 -13
- package/dist/tui/chat.d.ts +8 -0
- package/dist/tui/chat.js +74 -0
- package/dist/tui/index.d.ts +7 -0
- package/dist/tui/index.js +35 -1
- package/dist/tui/layout.d.ts +1 -0
- package/dist/tui/layout.js +4 -1
- package/dist/tui/provider-discovery.js +15 -13
- package/dist/vericify-bridge.d.ts +3 -0
- package/dist/vericify-bridge.js +3 -0
- package/package.json +2 -1
- package/scripts/hermes_bridge_worker.py +136 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [2.4.1] - 2026-05-08
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
|
|
7
|
+
- Added the local-model execution-engine seam for Hermes-local remediation while preserving provider identity.
|
|
8
|
+
- Added filtered ACE shadow-server registration support for Hermes-local tool allowlists.
|
|
9
|
+
- Added strict Hermes bridge frame decoding tests for fragmented UTF-8, malformed JSON, and control-byte rejection.
|
|
10
|
+
|
|
3
11
|
## [2.4.0] - 2026-05-02
|
|
4
12
|
|
|
5
13
|
### Changed
|
package/README.md
CHANGED
|
@@ -6,6 +6,8 @@ Autonomous Coding Entity (ACE) is a local MCP server and CLI for agent-assisted
|
|
|
6
6
|
|
|
7
7
|
Modern coding agents can already read files, write code, run commands, and call tools. The missing layer is coordination that survives restarts, model switches, and multi-agent work. ACE keeps the workflow in the store and projects only the files external clients still need. For provider-backed runs, ACE provides task context, tool surfaces, status events, evidence trails, and resumable state.
|
|
8
8
|
|
|
9
|
+
The full MCP surface spans **~70 registered tools** across 12 domain modules — handoffs, scheduler, file ops, drift detection, git, memory, discovery, skills, lifecycle events, vericify, tracker, and framework orchestration — plus resources and prompts.
|
|
10
|
+
|
|
9
11
|
## ACE Manifesto
|
|
10
12
|
|
|
11
13
|
- Agent work should survive restarts, handoffs, and review.
|
|
@@ -25,6 +27,7 @@ ACE provides model providers with the context they cannot infer on their own: ta
|
|
|
25
27
|
- `ace doctor --scan` probes common Ollama and llama.cpp endpoints and writes the selected profile back into the store.
|
|
26
28
|
- `ace tui` is provider-aware for `ollama`, `llama.cpp`, `codex`, `claude`, `gemini`, and `copilot` when credentials or base URLs are configured.
|
|
27
29
|
- `ace mcp` and `ace tui` expose the same workspace truth to the host, the terminal, and the model.
|
|
30
|
+
- `ace mcp-shadow --tools <csv>` starts a filtered stdio server that exposes only the listed tools — used internally by the Hermes bridge so the local model sees a scoped, safe subset of the surface.
|
|
28
31
|
|
|
29
32
|
## Why This Exists Now
|
|
30
33
|
|
|
@@ -130,6 +133,18 @@ ace doctor --llm llama.cpp --model local-model --base-url http://localhost:8080
|
|
|
130
133
|
ace mcp
|
|
131
134
|
```
|
|
132
135
|
|
|
136
|
+
Optional local-model path with the Hermes execution engine:
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
ace init --project "My Project" --llm llama.cpp --base-url http://localhost:8080
|
|
140
|
+
llama-server -m /path/to/model.gguf --port 8080
|
|
141
|
+
ace doctor --scan # auto-detect endpoint and model
|
|
142
|
+
ACE_HERMES_ROOT=/path/to/hermes-agent HERMES_PYTHON=/path/to/python \
|
|
143
|
+
ace doctor --llm llama.cpp --base-url http://127.0.0.1:8080/v1 --model <model> --hermes
|
|
144
|
+
ACE_HERMES_ROOT=/path/to/hermes-agent HERMES_PYTHON=/path/to/python \
|
|
145
|
+
ace tui --provider llama.cpp --base-url http://127.0.0.1:8080/v1 --model <model> --hermes
|
|
146
|
+
```
|
|
147
|
+
|
|
133
148
|
If you already have a local runtime running, `ace doctor --scan` will probe common Ollama and llama.cpp endpoints and write the selected profile back into the store.
|
|
134
149
|
|
|
135
150
|
Hosted provider path with Codex:
|
|
@@ -158,35 +173,38 @@ That containment matters. ACE is meant to structure the workflow, not contaminat
|
|
|
158
173
|
|
|
159
174
|
```text
|
|
160
175
|
Developer or MCP host
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
176
|
+
│
|
|
177
|
+
├── Claude Code / Codex / Cursor / VS Code / Antigravity
|
|
178
|
+
│ │
|
|
179
|
+
│ └── calls ace-swarm over MCP
|
|
180
|
+
│
|
|
181
|
+
├── agent-state/
|
|
182
|
+
│ │
|
|
183
|
+
│ ├── ace-state.ace (ACEPACK binary store)
|
|
184
|
+
│ └── STATUS.md / kanban.html / HANDOFF.json projections
|
|
185
|
+
│
|
|
186
|
+
├── ace mcp (full surface, ~70 tools)
|
|
187
|
+
│ │
|
|
188
|
+
│ ├── tools, prompts, resources
|
|
189
|
+
│ ├── typed handoff validation
|
|
190
|
+
│ ├── scheduler and resource locks
|
|
191
|
+
│ └── state-aware workflow tools
|
|
192
|
+
│
|
|
193
|
+
├── ace tui
|
|
194
|
+
│ │
|
|
195
|
+
│ ├── chat, agent tabs, telemetry
|
|
196
|
+
│ └── provider-aware runtime (direct | optional hermes_local)
|
|
197
|
+
│ │
|
|
198
|
+
│ └── [hermes_local] HermesSubprocessExecutor
|
|
199
|
+
│ │ spawns Python worker per turn
|
|
200
|
+
│ ├── ace mcp-shadow --tools <csv> (scoped surface for Hermes)
|
|
201
|
+
│ └── hermes_bridge_worker.py → local model (Ollama / llama.cpp)
|
|
202
|
+
│
|
|
203
|
+
├── .agents/ACE/
|
|
204
|
+
│ │
|
|
205
|
+
│ ├── ace-hook-context.json
|
|
206
|
+
│ ├── tasks/todo.md
|
|
207
|
+
│ └── host config bundles
|
|
190
208
|
```
|
|
191
209
|
|
|
192
210
|
## What Ships Today
|
|
@@ -195,16 +213,22 @@ Developer or MCP host
|
|
|
195
213
|
+----------------------+--------------------------------------------------------------+
|
|
196
214
|
| Surface | Current scope |
|
|
197
215
|
+----------------------+--------------------------------------------------------------+
|
|
198
|
-
| Runtime roles |
|
|
199
|
-
|
|
|
200
|
-
| MCP server |
|
|
201
|
-
| Durable state |
|
|
202
|
-
|
|
|
203
|
-
|
|
|
204
|
-
|
|
|
205
|
-
|
|
|
206
|
-
|
|
|
207
|
-
|
|
|
216
|
+
| Runtime roles | ACE-Orchestrator, Coders, QA, Spec, Docs, Research, Ops, |
|
|
217
|
+
| | Security, Memory, Release, Eval, Skeptic, astgrep, Builder |
|
|
218
|
+
| MCP server | ~70 tools across 12 domain modules (stdio transport) |
|
|
219
|
+
| Durable state | Single `agent-state/ace-state.ace` authority for handoffs, |
|
|
220
|
+
| | status events, todos, run ledger, job queue, and discovery |
|
|
221
|
+
| Projections | Hook context, todo surface, and host config bundles |
|
|
222
|
+
| Coordination | Scheduler queues, dependency gates, leases, resource locks |
|
|
223
|
+
| Change intelligence | Delta scan, semantic snapshots, drift reports, rewrite hints |
|
|
224
|
+
| Structural editing | ast-grep query, locate, rewrite, compile, patch |
|
|
225
|
+
| Hermes bridge | Optional, user-supplied subprocess engine selected only with |
|
|
226
|
+
| | `--hermes`; scoped shadow MCP tools, evidence tracking |
|
|
227
|
+
| Terminal UI | Provider-aware TUI with chat, tabs, telemetry, and agent UI |
|
|
228
|
+
| Local models | Ollama and llama.cpp bootstrap, doctor checks, and bridges |
|
|
229
|
+
| Tracker integration | GitHub Issues, Linear adapter layer with snapshot cache |
|
|
230
|
+
| Vericify | Test evidence log, process post trail (incl. blocker routing), bridge snapshot |
|
|
231
|
+
| Skills | Packaged skills with catalog, audit, and triage |
|
|
208
232
|
+----------------------+--------------------------------------------------------------+
|
|
209
233
|
```
|
|
210
234
|
|
|
@@ -219,16 +243,360 @@ ACE is for teams and solo operators who already like their coding host and want
|
|
|
219
243
|
|
|
220
244
|
In that setup, the host remains the interface. ACE becomes the state contract underneath it.
|
|
221
245
|
|
|
222
|
-
## Local Models
|
|
246
|
+
## Local Models & Hermes Companion Engine
|
|
223
247
|
|
|
224
248
|
Local models are good at generating text. They usually need help seeing the workspace, hearing the handoff trail, and remembering what changed two turns ago. ACE closes that gap.
|
|
225
249
|
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
-
|
|
229
|
-
|
|
250
|
+
### What Hermes is
|
|
251
|
+
|
|
252
|
+
Hermes is an optional, user-supplied companion execution substrate. ACE does not install Hermes, clone it, or make it a package dependency. When the operator explicitly passes `--hermes` or `--engine hermes_local`, Hermes handles local provider quirks, streaming delivery, and robust tool-call framing. The local model provider is still Ollama or llama.cpp. ACE remains the system of record — state, evidence, verification, scheduler — and exports a **scoped shadow MCP tool surface** to Hermes so the local model only sees the tools it needs for a given task scope.
|
|
253
|
+
|
|
254
|
+
```
|
|
255
|
+
ACE TUI (ace tui --hermes / --engine hermes_local)
|
|
256
|
+
│ user input → ChatSession.sendMessage();
|
|
257
|
+
│ ACE owns session identity, policy, state
|
|
258
|
+
▼
|
|
259
|
+
runLocalModelTask() ← src/local-model-runtime.ts
|
|
260
|
+
│ ACE dispatches, ACE controls the turn
|
|
261
|
+
▼
|
|
262
|
+
HermesSubprocessExecutor ← Node.js class, src/hermes/session-manager.ts
|
|
263
|
+
│ spawns Python worker; ACE controls lifecycle
|
|
264
|
+
├── writes hermesHome/config.yaml (provider, model, user-supplied Hermes path, shadow MCP entry)
|
|
265
|
+
├── pipes ace mcp-shadow --tools <csv> ← scoped tools-only shadow server (stdio)
|
|
266
|
+
│ (ACE-owned; local model sees only allowed tools, not public prompts/resources)
|
|
267
|
+
▼
|
|
268
|
+
hermes_bridge_worker.py ← Python subprocess
|
|
269
|
+
│ reads config.yaml; calls shadow MCP & local model
|
|
270
|
+
├── streams framed NDJSON events → HermesBridgeFrameDecoder
|
|
271
|
+
└── calls local model (ollama / llama.cpp)
|
|
272
|
+
│
|
|
273
|
+
▼ bridge frames validated and applied by ACE
|
|
274
|
+
ACE store (ace-state.ace) ← authoritative output; ACE-owned
|
|
275
|
+
evidence, continuity, run ledger persisted here
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
### Bridge protocol
|
|
279
|
+
|
|
280
|
+
The Node ↔ Hermes channel is a strictly typed newline-delimited JSON frame stream. Each frame carries a `type` field:
|
|
281
|
+
|
|
282
|
+
| Frame type | Direction | Purpose |
|
|
283
|
+
|---|---|---|
|
|
284
|
+
| `session_open` | N→H | start session with config |
|
|
285
|
+
| `turn_run` | N→H | submit a task turn |
|
|
286
|
+
| `interrupt` | N→H | cancel in-flight turn |
|
|
287
|
+
| `session_close` | N→H | shut down the worker |
|
|
288
|
+
| `status` | H→N | heartbeat / progress |
|
|
289
|
+
| `delta` | H→N | streaming token chunk |
|
|
290
|
+
| `reasoning` | H→N | chain-of-thought (optional) |
|
|
291
|
+
| `assistant_interim` | H→N | partial assistant message |
|
|
292
|
+
| `tool_start` | H→N | tool call initiated |
|
|
293
|
+
| `tool_progress` | H→N | tool call in flight |
|
|
294
|
+
| `tool_complete` | H→N | tool call result |
|
|
295
|
+
| `final` | H→N | complete assistant response |
|
|
296
|
+
| `error` | H→N | fatal bridge error |
|
|
297
|
+
|
|
298
|
+
Frame decoding is handled by `HermesBridgeFrameDecoder` in `src/hermes/bridge-protocol.ts`. The decoder strips control bytes, sanitizes the line, and validates against the event schema before handing frames to the session manager.
|
|
299
|
+
|
|
300
|
+
### Running with Hermes
|
|
301
|
+
|
|
302
|
+
```bash
|
|
303
|
+
# User owns Hermes/Python setup. ACE only discovers and launches it when asked.
|
|
304
|
+
ACE_HERMES_ROOT=/path/to/hermes-agent \
|
|
305
|
+
HERMES_PYTHON=/path/to/python \
|
|
306
|
+
ace doctor --llm llama.cpp --base-url http://127.0.0.1:8080/v1 --model <model> --hermes
|
|
307
|
+
|
|
308
|
+
ACE_HERMES_ROOT=/path/to/hermes-agent \
|
|
309
|
+
HERMES_PYTHON=/path/to/python \
|
|
310
|
+
ace tui --provider llama.cpp --base-url http://127.0.0.1:8080/v1 --model <model> --hermes
|
|
311
|
+
|
|
312
|
+
# Optional uv-managed Hermes project, still operator supplied.
|
|
313
|
+
ACE_HERMES_ROOT=/path/to/hermes-agent \
|
|
314
|
+
ACE_HERMES_UV_PROJECT=/path/to/hermes-agent \
|
|
315
|
+
ace tui --provider llama.cpp --base-url http://127.0.0.1:8080/v1 --model <model> --hermes
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
Or use the TUI with explicit engine selection:
|
|
319
|
+
|
|
320
|
+
```bash
|
|
321
|
+
ace tui --provider llama.cpp --base-url http://localhost:8080 --engine hermes_local
|
|
322
|
+
# shorthand
|
|
323
|
+
ace tui --provider ollama --model llama3.1:8b --hermes
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
Note: Hermes-local is opt-in. Without `--hermes` or `--engine hermes_local`, the TUI uses the direct provider path and does not require Python, uv, or Hermes. When Hermes is selected, ACE launches the user-supplied Hermes/Python setup for that session and exposes only the scoped shadow MCP tool surface. Tool evidence, not model prose, determines executable mutation.
|
|
327
|
+
|
|
328
|
+
### Doctor checks for Hermes
|
|
329
|
+
|
|
330
|
+
`ace doctor` surfaces Hermes-local readiness gates only when `--hermes` is passed:
|
|
331
|
+
|
|
332
|
+
```bash
|
|
333
|
+
ACE_HERMES_ROOT=/path/to/hermes-agent HERMES_PYTHON=/path/to/python \
|
|
334
|
+
ace doctor --llm llama.cpp --model gemma-4 --base-url http://localhost:8080 --hermes
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
Checks performed:
|
|
338
|
+
|
|
339
|
+
- Hermes bridge worker packaged (`scripts/hermes_bridge_worker.py` present)
|
|
340
|
+
- Hermes checkout supplied by the operator (`ACE_HERMES_ROOT` or `--hermes-root`)
|
|
341
|
+
- Python supplied by the operator (`HERMES_PYTHON` or `--hermes-python`)
|
|
342
|
+
- Optional uv project supplied by the operator (`ACE_HERMES_UV_PROJECT` or `--hermes-uv-project`)
|
|
343
|
+
- Shadow MCP command available for scoped tools-only transport
|
|
344
|
+
- Local runtime reachable and model available
|
|
345
|
+
|
|
346
|
+
```bash
|
|
347
|
+
# Auto-scan common Ollama + llama.cpp endpoints
|
|
348
|
+
ace doctor --scan
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
### Evidence model
|
|
352
|
+
|
|
353
|
+
ACE persists tool evidence only when the model invokes `write_workspace_file` successfully through the shadow MCP surface. If Hermes returns a complete artifact in its final response but never called the write tool, the live driver materializes the artifact for inspection and records `materialized_from_hermes_final` — diagnostic only, not counted as `tool_write_done`.
|
|
354
|
+
|
|
355
|
+
Operator-restricted models (e.g. `deepseek-r1:8b`) are blocked in `local-model-policy.ts` before a session even starts.
|
|
356
|
+
|
|
357
|
+
## MCP Tool Surface
|
|
358
|
+
|
|
359
|
+
ACE exposes tools through a domain-modular registration system (`src/tools.ts` delegates to 12 domain modules). Tools can be allow-listed at startup; `ace mcp-shadow` uses this to give Hermes a scoped tools-only subset. Public `ace mcp` still exposes the full tools, prompts, and resources surface.
|
|
360
|
+
|
|
361
|
+
### Agent & Runtime
|
|
362
|
+
|
|
363
|
+
| Tool | Purpose |
|
|
364
|
+
|---|---|
|
|
365
|
+
| `get_agent_instructions` | Read instruction content for any ACE agent role |
|
|
366
|
+
| `get_agent_manifest` | Read the manifest for a given agent role |
|
|
367
|
+
| `get_all_agents_summary` | List all registered agents with role metadata |
|
|
368
|
+
| `get_kernel_artifact` | Read a named kernel artifact from the store |
|
|
369
|
+
| `get_runtime_profile` | Read the active runtime profile (provider, model, base URL) |
|
|
370
|
+
| `validate_runtime_profile` | Schema-validate the stored runtime profile |
|
|
371
|
+
| `get_transition_log` | Read recent agent state-transition history |
|
|
372
|
+
| `get_capability_snapshot` | Summarize current capability coverage across agents |
|
|
373
|
+
| `get_runtime_tool_specs` | Read the tool-spec registry for the active runtime |
|
|
374
|
+
| `validate_runtime_tool_specs` | Schema-validate the tool-spec registry |
|
|
375
|
+
| `list_runtime_tool_specs` | List all registered tool specs |
|
|
376
|
+
| `execute_runtime_tool` | Execute a named runtime tool by spec |
|
|
377
|
+
|
|
378
|
+
### Orchestration & Planning
|
|
379
|
+
|
|
380
|
+
| Tool | Purpose |
|
|
381
|
+
|---|---|
|
|
382
|
+
| `propose_plan` | Generate a multi-step task plan proposal |
|
|
383
|
+
| `validate_plan` | Validate a plan proposal against acceptance contracts |
|
|
384
|
+
| `run_local_model` | Dispatch a task to the configured local model runtime |
|
|
385
|
+
| `run_orchestrator` | Run an ACE orchestrator session for a given task |
|
|
386
|
+
| `route_task` | Route an incoming task to the appropriate agent role |
|
|
387
|
+
| `bootstrap_state` | Seed or repair the ACE store for the current workspace |
|
|
388
|
+
| `get_framework_status` | Read aggregate framework health and readiness |
|
|
389
|
+
| `validate_framework` | Run the full framework validation gate suite |
|
|
390
|
+
| `audit_public_surface` | Audit schema-bound tools, resources, and prompts |
|
|
391
|
+
| `audit_store_authority` | Verify store authority and projection consistency |
|
|
392
|
+
| `execute_gates` | Run named gate conditions (dependency, handoff, time) |
|
|
393
|
+
|
|
394
|
+
### Handoffs
|
|
395
|
+
|
|
396
|
+
| Tool | Purpose |
|
|
397
|
+
|---|---|
|
|
398
|
+
| `create_handoff` | Create a typed, validated handoff record |
|
|
399
|
+
| `validate_handoff` | Validate a handoff payload against the schema |
|
|
400
|
+
| `get_handoff_template` | Retrieve the handoff template for a given role pair |
|
|
401
|
+
| `get_handoff_status` | Read the status of a specific handoff |
|
|
402
|
+
| `ack_handoff` | Acknowledge a handoff as received and accepted |
|
|
403
|
+
|
|
404
|
+
Example — creating a handoff from orchestrator to qa:
|
|
405
|
+
|
|
406
|
+
```bash
|
|
407
|
+
# via any MCP client
|
|
408
|
+
create_handoff {
|
|
409
|
+
"from_role": "orchestrator",
|
|
410
|
+
"to_role": "qa",
|
|
411
|
+
"summary": "Auth module implementation complete, ready for test coverage review",
|
|
412
|
+
"evidence": ["src/auth.ts", "src/auth.test.ts"],
|
|
413
|
+
"priority": "P1"
|
|
414
|
+
}
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
### Scheduler
|
|
418
|
+
|
|
419
|
+
| Tool | Purpose |
|
|
420
|
+
|---|---|
|
|
421
|
+
| `enqueue_job` | Add a job to the queue with priority, deps, and resource locks |
|
|
422
|
+
| `dispatch_jobs` | Tick the scheduler and dispatch ready jobs |
|
|
423
|
+
| `acknowledge_job` | Mark a job as accepted by a worker |
|
|
424
|
+
| `complete_job` | Mark a job done or failed |
|
|
425
|
+
| `get_job_queue` | Read the current job queue |
|
|
426
|
+
| `get_job_lock_table` | Read active resource locks |
|
|
427
|
+
| `get_scheduler_lease` | Read the current scheduler lease |
|
|
428
|
+
|
|
429
|
+
Example — queuing a blocked job:
|
|
430
|
+
|
|
431
|
+
```bash
|
|
432
|
+
enqueue_job {
|
|
433
|
+
"kind": "handoff.lifecycle",
|
|
434
|
+
"priority": "P1",
|
|
435
|
+
"dependencies": [{ "kind": "handoff", "ref": "HNDOFF-abc123", "expected": "ack" }],
|
|
436
|
+
"resource_requirements": ["agent-state/handoff-registry.json"],
|
|
437
|
+
"run_after": "2026-05-08T18:00:00Z"
|
|
438
|
+
}
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
### Files & Structural Editing
|
|
442
|
+
|
|
443
|
+
| Tool | Purpose |
|
|
444
|
+
|---|---|
|
|
445
|
+
| `read_workspace_file` | Read any file in the workspace |
|
|
446
|
+
| `write_workspace_file` | Write or overwrite a file (evidence-tracked) |
|
|
447
|
+
| `list_workspace` | Directory listing with optional glob filter |
|
|
448
|
+
| `safe_edit_file` | Edit a file with collision-safe write semantics |
|
|
449
|
+
| `diff_files` | Produce a unified diff between two workspace paths |
|
|
450
|
+
| `read_file_lines` | Read a line range from a file |
|
|
451
|
+
| `outline_file` | Extract structural outline (symbols, headings) from a file |
|
|
452
|
+
| `astgrep_query` | Run an ast-grep query pattern against the workspace index |
|
|
453
|
+
| `astgrep_locate` | Locate a specific symbol or construct with ast-grep |
|
|
454
|
+
| `compile_structural_edit` | Compile an ast-grep rewrite to a patch |
|
|
455
|
+
| `preview_structural_edit` | Preview a structural edit without applying |
|
|
456
|
+
| `astgrep_rewrite` | Apply an ast-grep rewrite rule across matched files |
|
|
457
|
+
| `apply_patch` | Apply a unified diff patch to the workspace |
|
|
458
|
+
|
|
459
|
+
### Change Intelligence & Drift
|
|
460
|
+
|
|
461
|
+
| Tool | Purpose |
|
|
462
|
+
|---|---|
|
|
463
|
+
| `snapshot_state` | Take a semantic snapshot of the current workspace state |
|
|
464
|
+
| `semantic_diff` | Diff two semantic snapshots |
|
|
465
|
+
| `drift_report` | Produce a drift report between baseline and current state |
|
|
466
|
+
| `list_snapshots` | List available workspace snapshots |
|
|
467
|
+
| `rewrite_targets` | Identify files that are candidates for rewrite based on drift |
|
|
230
468
|
|
|
231
|
-
|
|
469
|
+
### Discovery & Indexing
|
|
470
|
+
|
|
471
|
+
| Tool | Purpose |
|
|
472
|
+
|---|---|
|
|
473
|
+
| `refresh_astgrep_index` | Rebuild the ast-grep structural index |
|
|
474
|
+
| `scan_workspace_delta` | Scan for file changes since the last index pass |
|
|
475
|
+
| `web_research_packet` | Package a web research context for agent consumption |
|
|
476
|
+
| `mcp_ingestion_probe` | Probe an MCP server and ingest its tool/resource surface |
|
|
477
|
+
| `codemunch_snapshot` | Take a full codemunch snapshot of the workspace |
|
|
478
|
+
| `codemunch_index` | Index a codemunch snapshot for search |
|
|
479
|
+
|
|
480
|
+
### Git
|
|
481
|
+
|
|
482
|
+
| Tool | Purpose |
|
|
483
|
+
|---|---|
|
|
484
|
+
| `git_status` | Read working-tree status |
|
|
485
|
+
| `git_commit` | Stage and commit changes with a message |
|
|
486
|
+
| `git_diff` | Diff staged, unstaged, or between refs |
|
|
487
|
+
| `git_log` | Read recent commit history |
|
|
488
|
+
|
|
489
|
+
### Memory & Continuity
|
|
490
|
+
|
|
491
|
+
| Tool | Purpose |
|
|
492
|
+
|---|---|
|
|
493
|
+
| `context_snapshot` | Capture a structured context snapshot for the current session |
|
|
494
|
+
| `build_continuity_packet` | Build a continuity packet for cross-session handoff |
|
|
495
|
+
| `recall_context` | Recall a previous context snapshot by ID or recency |
|
|
496
|
+
|
|
497
|
+
Example — before switching models mid-task:
|
|
498
|
+
|
|
499
|
+
```bash
|
|
500
|
+
build_continuity_packet {
|
|
501
|
+
"session_summary": "Implemented auth module, blocked on integration test setup",
|
|
502
|
+
"next_step": "Write integration tests for /api/auth endpoints"
|
|
503
|
+
}
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
### Lifecycle & Status Events
|
|
507
|
+
|
|
508
|
+
| Tool | Purpose |
|
|
509
|
+
|---|---|
|
|
510
|
+
| `emit_status_event` | Append a typed lifecycle event to `STATUS_EVENTS.ndjson` |
|
|
511
|
+
| `get_framework_status` | Read aggregate status across all modules |
|
|
512
|
+
| `refresh_kanban` | Rebuild the kanban board from current state |
|
|
513
|
+
|
|
514
|
+
Example:
|
|
515
|
+
|
|
516
|
+
```bash
|
|
517
|
+
emit_status_event {
|
|
518
|
+
"source_module": "capability-ops",
|
|
519
|
+
"event_type": "TASK_COMPLETE",
|
|
520
|
+
"status": "pass",
|
|
521
|
+
"summary": "Auth integration tests green across all providers"
|
|
522
|
+
}
|
|
523
|
+
```
|
|
524
|
+
|
|
525
|
+
### Todo & Run Ledger
|
|
526
|
+
|
|
527
|
+
| Tool | Purpose |
|
|
528
|
+
|---|---|
|
|
529
|
+
| `get_todo` | Read the current todo surface |
|
|
530
|
+
| `get_todo_state` | Read structured todo state from the store |
|
|
531
|
+
| `update_todo` | Update one or more todo items |
|
|
532
|
+
| `get_run_ledger` | Read the run ledger (history of major tool invocations) |
|
|
533
|
+
|
|
534
|
+
### Vericify (Verification)
|
|
535
|
+
|
|
536
|
+
| Tool | Purpose |
|
|
537
|
+
|---|---|
|
|
538
|
+
| `get_vericify_context` | Get the current verification context packet |
|
|
539
|
+
| `get_vericify_delta` | Get the incremental verification delta |
|
|
540
|
+
| `get_vericify_bridge` | Read the vericify bridge snapshot |
|
|
541
|
+
| `refresh_vericify_bridge` | Refresh the bridge snapshot from test runner output |
|
|
542
|
+
| `validate_vericify_bridge` | Schema-validate the bridge snapshot |
|
|
543
|
+
| `get_vericify_process_posts` | Read the vericify process post log |
|
|
544
|
+
| `append_vericify_process_post` | Append a test result post to the process log |
|
|
545
|
+
| `validate_vericify_process_post_log` | Schema-validate the process post log |
|
|
546
|
+
|
|
547
|
+
### Tracker Integration
|
|
548
|
+
|
|
549
|
+
| Tool | Purpose |
|
|
550
|
+
|---|---|
|
|
551
|
+
| `get_tracker_snapshot` | Read the cached tracker snapshot (GitHub Issues, Linear, etc.) |
|
|
552
|
+
| `validate_tracker_snapshot` | Schema-validate the tracker snapshot |
|
|
553
|
+
| `list_tracker_adapter_kinds` | List available tracker adapters |
|
|
554
|
+
| `get_tracker_adapter_health` | Check health of the active tracker adapter |
|
|
555
|
+
| `list_tracker_items` | List items from the tracker |
|
|
556
|
+
| `create_tracker_comment` | Post a comment to a tracker item |
|
|
557
|
+
| `update_tracker_item_state` | Update the state of a tracker item |
|
|
558
|
+
| `refresh_tracker_snapshot` | Pull fresh data from the tracker into the snapshot |
|
|
559
|
+
|
|
560
|
+
### Skills & Tasks
|
|
561
|
+
|
|
562
|
+
| Tool | Purpose |
|
|
563
|
+
|---|---|
|
|
564
|
+
| `skill_catalog_summary` | List all available skills with brief descriptions |
|
|
565
|
+
| `skill_audit` | Audit skill freshness and coverage |
|
|
566
|
+
| `problem_triage` | Triage a problem description against known skills |
|
|
567
|
+
| `list_skills` | List skills in the store |
|
|
568
|
+
| `get_skill_instructions` | Read full instructions for a named skill |
|
|
569
|
+
| `get_task_pack` | Read a named task pack |
|
|
570
|
+
| `get_lessons` | Read the lessons log |
|
|
571
|
+
| `add_lesson` | Append a lesson to the log |
|
|
572
|
+
|
|
573
|
+
### Workspace Sessions
|
|
574
|
+
|
|
575
|
+
| Tool | Purpose |
|
|
576
|
+
|---|---|
|
|
577
|
+
| `list_workspace_sessions` | List managed workspace sessions |
|
|
578
|
+
| `create_workspace_session` | Create a new managed workspace session |
|
|
579
|
+
| `remove_workspace_session` | Remove a workspace session |
|
|
580
|
+
| `validate_managed_workspace_path` | Validate a workspace path against the session registry |
|
|
581
|
+
|
|
582
|
+
### Unattended Sessions
|
|
583
|
+
|
|
584
|
+
| Tool | Purpose |
|
|
585
|
+
|---|---|
|
|
586
|
+
| `list_unattended_sessions` | List registered unattended agent sessions |
|
|
587
|
+
| `get_unattended_session` | Read details of a specific unattended session |
|
|
588
|
+
| `start_unattended_session` | Launch an unattended agent session |
|
|
589
|
+
| `stop_unattended_session` | Stop a running unattended session |
|
|
590
|
+
| `wait_for_unattended_session` | Block until a session reaches a terminal state |
|
|
591
|
+
| `validate_unattended_session_registry` | Schema-validate the session registry |
|
|
592
|
+
|
|
593
|
+
### Framework & Config
|
|
594
|
+
|
|
595
|
+
| Tool | Purpose |
|
|
596
|
+
|---|---|
|
|
597
|
+
| `get_mcp_config` | Read the baked MCP config for a named client |
|
|
598
|
+
| `run_tests` | Run the ACE test suite |
|
|
599
|
+
| `get_cli_split` | Read the CLI split configuration |
|
|
232
600
|
|
|
233
601
|
## Compatible Surfaces
|
|
234
602
|
|
|
@@ -247,17 +615,64 @@ If you want local agents with memory, evidence, and handoff discipline, this is
|
|
|
247
615
|
## CLI
|
|
248
616
|
|
|
249
617
|
```text
|
|
250
|
-
|
|
251
|
-
| Command
|
|
252
|
-
|
|
253
|
-
| `ace
|
|
254
|
-
| `ace
|
|
255
|
-
| `ace
|
|
256
|
-
| `ace
|
|
257
|
-
| `ace
|
|
258
|
-
| `ace
|
|
259
|
-
| `ace
|
|
260
|
-
|
|
618
|
+
+-----------------------------------------------+---------------------------------------------------+
|
|
619
|
+
| Command | Purpose |
|
|
620
|
+
+-----------------------------------------------+---------------------------------------------------+
|
|
621
|
+
| `ace mcp` / `ace serve` | Start MCP server over stdio |
|
|
622
|
+
| `ace mcp-shadow --tools <csv>` | Start filtered shadow MCP server (Hermes use) |
|
|
623
|
+
| `ace tui [options]` | Open the terminal operator surface |
|
|
624
|
+
| `ace init [options]` | Seed the ACE store and optional host stubs |
|
|
625
|
+
| `ace connect [provider] [options]` | Register a live local runtime or hosted provider |
|
|
626
|
+
| `ace turnkey [options]` | Project store-backed host surface stubs |
|
|
627
|
+
| `ace doctor [options]` | Validate ACE runtime + Hermes readiness |
|
|
628
|
+
| `ace cache [options]` | Cache ACE artifacts into ace-state.ace |
|
|
629
|
+
| `ace mcp-config [--client <name>|--all]` | Print baked client snippets for optional install |
|
|
630
|
+
| `ace preconfig` | Write .mcp-config/ bundle for all clients |
|
|
631
|
+
| `ace paths` | Show resolved package and workspace paths |
|
|
632
|
+
| `ace help` | Show help |
|
|
633
|
+
+-----------------------------------------------+---------------------------------------------------+
|
|
634
|
+
```
|
|
635
|
+
|
|
636
|
+
### CLI examples
|
|
637
|
+
|
|
638
|
+
```bash
|
|
639
|
+
# Bootstrap a workspace with a hosted provider
|
|
640
|
+
ace init --project "My App" --llm claude --client-config-bundle
|
|
641
|
+
|
|
642
|
+
# Bootstrap with local Ollama model and write VS Code MCP config
|
|
643
|
+
ace init --project "My App" --llm ollama --model llama3.1:8b \
|
|
644
|
+
--base-url http://localhost:11434 --mcp-config
|
|
645
|
+
|
|
646
|
+
# Connect to a running llama.cpp server from a Hugging Face model
|
|
647
|
+
ace connect llama-server --hf bartowski/gemma-3-4b-it-GGUF \
|
|
648
|
+
--base-url http://localhost:8080
|
|
649
|
+
|
|
650
|
+
# Run doctor checks with auto-scan of common local endpoints
|
|
651
|
+
ace doctor --scan
|
|
652
|
+
|
|
653
|
+
# Run doctor checks for a specific provider + model
|
|
654
|
+
ace doctor --llm ollama --model llama3.1:8b --base-url http://localhost:11434
|
|
655
|
+
|
|
656
|
+
# Run optional Hermes checks with user-supplied Hermes/Python
|
|
657
|
+
ACE_HERMES_ROOT=/path/to/hermes-agent HERMES_PYTHON=/path/to/python \
|
|
658
|
+
ace doctor --llm llama.cpp --model gemma-4 --base-url http://localhost:8080 --hermes
|
|
659
|
+
|
|
660
|
+
# Repair a missing Ollama model found during doctor
|
|
661
|
+
ace doctor --llm ollama --model llama3.1:8b --repair-ollama
|
|
662
|
+
|
|
663
|
+
# Print VS Code MCP config snippet to stdout
|
|
664
|
+
ace mcp-config --client vscode
|
|
665
|
+
|
|
666
|
+
# Write config bundles for every supported client at workspace root
|
|
667
|
+
ace preconfig
|
|
668
|
+
|
|
669
|
+
# Launch TUI with optional Hermes engine against a local llama.cpp server
|
|
670
|
+
ACE_HERMES_ROOT=/path/to/hermes-agent HERMES_PYTHON=/path/to/python \
|
|
671
|
+
ace tui --provider llama.cpp --base-url http://localhost:8080 --model gemma-4 --hermes
|
|
672
|
+
|
|
673
|
+
# Cache all ACE artifacts into ace-state.ace (dry run first)
|
|
674
|
+
ace cache --dry-run
|
|
675
|
+
ace cache
|
|
261
676
|
```
|
|
262
677
|
|
|
263
678
|
## Development
|
|
@@ -270,6 +685,36 @@ npm test
|
|
|
270
685
|
npm run start
|
|
271
686
|
```
|
|
272
687
|
|
|
688
|
+
Run the Hermes live driver against your workspace:
|
|
689
|
+
|
|
690
|
+
```bash
|
|
691
|
+
npm run build
|
|
692
|
+
# with a local llama.cpp or Ollama runtime running:
|
|
693
|
+
ACE_WORKSPACE_ROOT=$PWD \
|
|
694
|
+
ACE_LIVE_PROVIDERS=llama.cpp \
|
|
695
|
+
ACE_LIVE_LLAMA_CPP_BASE_URL=http://127.0.0.1:8080/v1 \
|
|
696
|
+
ACE_LIVE_LLAMA_CPP_MODEL=gemma-4-it \
|
|
697
|
+
ACE_LIVE_HERMES_MAX_TURNS=3 \
|
|
698
|
+
ACE_LIVE_OUTPUT_ONLY=1 \
|
|
699
|
+
node scripts/dev/run_hermes_crispr_live.mjs
|
|
700
|
+
```
|
|
701
|
+
|
|
702
|
+
Key source files:
|
|
703
|
+
|
|
704
|
+
| File | Role |
|
|
705
|
+
|---|---|
|
|
706
|
+
| `src/index.ts` | Package entry point |
|
|
707
|
+
| `src/cli.ts` | CLI command dispatch |
|
|
708
|
+
| `src/server.ts` | MCP server setup and stdio transport |
|
|
709
|
+
| `src/tools.ts` | Tool registration hub (delegates to domain modules) |
|
|
710
|
+
| `src/hermes/session-manager.ts` | `HermesSubprocessExecutor` — Hermes subprocess lifecycle |
|
|
711
|
+
| `src/hermes/bridge-protocol.ts` | Frame decoder for the Hermes bridge protocol |
|
|
712
|
+
| `src/model-bridge.ts` | Model bridge interface and process orchestration |
|
|
713
|
+
| `src/public-surface.ts` | Public surface audit and schema-bound entry map |
|
|
714
|
+
| `src/store/ace-packed-store.ts` | ACEPACK binary store read/write |
|
|
715
|
+
| `src/local-model-policy.ts` | Operator allow/block policy for local models |
|
|
716
|
+
| `scripts/hermes_bridge_worker.py` | Packaged Python worker for the Hermes bridge |
|
|
717
|
+
|
|
273
718
|
See [CHANGELOG.md](./CHANGELOG.md) for release history.
|
|
274
719
|
|
|
275
720
|
## References
|