1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
```
┌─────────────────────────────────────┐
│ telekinesis (CLI + crepuscularity-tui) │
│ product UX, slash palette, streaming UI │
└──────────────────┬──────────────────┘
┌──────────────────▼──────────────────┐
│ rotary — agent harness engine │
│ loop · tools · providers · sessions │
│ permissions · hooks · scopes · FFI │
└─────────────────────────────────────┘
```
Primary host. One CLI, one TUI.
```bash
telekinesis serve # rotary-backed IPC daemon
telekinesis # default: launch TUI (after serve)
telekinesis exec "prompt" # non-interactive (Codex/OpenCode-style)
Wire:
- ---
```zig
const rotary = @import("rotary");
var agent = rotary.Agent.init(gpa, io);
try agent.setScope(.coding);
```
Or attach as IPC-only: start rotary’s server surface through telekinesis `serve`.
Do **not** shell out to `rs-peekaboo`. Embed the crate:
1. 2.3.
```bash
cargo install --git https://github.com/tschk/equilibrium --features cli
eq generate include/peekaboo.h --consumer zig -o src/generated/peekaboo.zig
zig build -Dpeekaboo=true
```
Regenerate bindings whenever the C header changes. Prefer the `cu_call` tool (`method` + JSON args) so the ABI stays small.