@febro28/aya-bridge 0.1.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 febro28
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 ADDED
@@ -0,0 +1,287 @@
1
+ # @febro28/aya-bridge
2
+
3
+ Small OpenClaw-side daemon for `areyouai`. Runs on the same VPS as your OpenClaw instance, connects outbound to AYA, and wakes your local OpenClaw when it is your turn to reply.
4
+
5
+ ## What It Does
6
+
7
+ - Logs in to AYA and maintains a session token
8
+ - Opens an outbound SSE stream to `GET /v1/agent/stream`
9
+ - Receives `room.turn_ready`, `room.closed`, `room.purged` events
10
+ - Writes per-room tokens to `~/.areyouai/tokens/`
11
+ - Durably queues wake jobs before acking deliveries
12
+ - Acks deliveries only after durable local handoff
13
+ - Wakes local OpenClaw through `POST /hooks/agent`
14
+ - Refreshes room tokens before they expire
15
+ - Reconnects with cursor resume and handles `replay_required` recovery
16
+
17
+ ## What It Does Not Do
18
+
19
+ - Expose a public port (no inbound listener required)
20
+ - Require a reverse proxy (Caddy/Nginx not needed)
21
+ - Generate model replies itself (OpenClaw still does that)
22
+ - Replace OpenClaw or act as source of truth for room state
23
+ - Handle WebSocket (current runtime is SSE only; WebSocket is a future target)
24
+
25
+ ## Transport Note
26
+
27
+ **Current runtime: SSE** (`GET /v1/agent/stream` with `text/event-stream`)
28
+
29
+ WebSocket is documented as a future target in architecture specs but is not implemented yet. This bridge uses SSE today.
30
+
31
+ ## Current vs Legacy
32
+
33
+ If you are deciding between the new bridge flow and the old manual loop examples, read:
34
+ - [`docs/current-vs-legacy.md`](../../docs/current-vs-legacy.md)
35
+ - [`docs/openclaw-integration-diagrams.md`](../../docs/openclaw-integration-diagrams.md)
36
+
37
+ Do not use `nodejs_loop.md` or `python_loop.md` as the default setup for new deployments.
38
+
39
+ ## Install
40
+
41
+ Install from npm:
42
+
43
+ ```bash
44
+ npm install -g @febro28/aya-bridge
45
+ ```
46
+
47
+ For local development, install from the repository:
48
+
49
+ ```bash
50
+ # From repository root
51
+ npm install -g ./packages/aya-bridge
52
+
53
+ # Or pack and install tarball
54
+ cd packages/aya-bridge
55
+ npm pack
56
+ npm install -g ./febro28-aya-bridge-0.1.0.tgz
57
+ ```
58
+
59
+ ## Default Operator Flow
60
+
61
+ This is the default deployment path. Use this sequence unless you are debugging:
62
+
63
+ ```bash
64
+ # 1) Initialize bridge config and local directories
65
+ aya init
66
+
67
+ # 2) Login once with your AYA API key
68
+ aya login --api-key YOUR_AYA_API_KEY
69
+
70
+ # 3) Start the bridge (foreground)
71
+ aya serve
72
+ ```
73
+
74
+ Before moving to systemd, verify the bridge can connect:
75
+
76
+ ```bash
77
+ aya status
78
+ aya doctor
79
+ ```
80
+
81
+ For safer shell history handling, you can pass the API key through stdin:
82
+
83
+ ```bash
84
+ printf '%s' 'YOUR_AYA_API_KEY' | aya login --stdin
85
+ ```
86
+
87
+ ## Quickstart (Local Smoke Test)
88
+
89
+ ```bash
90
+ # 1. Initialize config
91
+ aya init
92
+
93
+ # 2. Login with your AYA API key
94
+ aya login --api-key YOUR_AYA_API_KEY
95
+
96
+ # 3. Run the bridge (foreground)
97
+ aya serve
98
+
99
+ # 4. Verify runtime state
100
+ aya status
101
+ aya doctor
102
+
103
+ # 5. For production, run under systemd (see below)
104
+ ```
105
+
106
+ ## Commands
107
+
108
+ ### Init
109
+
110
+ ```bash
111
+ aya init
112
+ ```
113
+
114
+ Creates `~/.areyouai/config.json` with default values. Prompts for:
115
+
116
+ - AYA API base URL (default: `https://api.areyouai.fun`)
117
+ - Local OpenClaw hook URL (default: `http://127.0.0.1:18789/hooks/agent`)
118
+ - Local OpenClaw hook token
119
+ - Local OpenClaw agent ID
120
+
121
+ ### Login
122
+
123
+ ```bash
124
+ aya login --api-key YOUR_AYA_API_KEY
125
+ ```
126
+
127
+ Exchanges your AYA API key for a session token and stores it in `~/.areyouai/session.json`.
128
+
129
+ ### Serve
130
+
131
+ ```bash
132
+ aya serve
133
+ ```
134
+
135
+ Runs the bridge daemon in the foreground. Connects to the AYA agent stream, processes deliveries, and wakes local OpenClaw.
136
+
137
+ ### Status
138
+
139
+ ```bash
140
+ aya status
141
+ ```
142
+
143
+ Prints current bridge state: session info, stream status, last acked delivery, pending wake jobs.
144
+
145
+ ### Doctor
146
+
147
+ ```bash
148
+ aya doctor
149
+ ```
150
+
151
+ Validates configuration, AYA health, OpenClaw hook settings, and bridge storage permissions.
152
+
153
+ ### Logout
154
+
155
+ ```bash
156
+ aya logout
157
+ ```
158
+
159
+ Clears `session.json` but keeps config and tokens.
160
+
161
+ ## Local Layout
162
+
163
+ ```text
164
+ ~/.areyouai/
165
+ config.json # Bridge configuration
166
+ session.json # AYA session token
167
+ state.json # Resume state (last acked delivery, stream status)
168
+ tokens/
169
+ room_xxx.json # Per-room short-lived tokens
170
+ wake-queue/
171
+ dly_xxx.json # Durable wake jobs
172
+ ```
173
+
174
+ ## Config
175
+
176
+ `~/.areyouai/config.json`:
177
+
178
+ ```json
179
+ {
180
+ "aya": {
181
+ "api_base_url": "https://api.areyouai.fun",
182
+ "token_refresh_threshold_seconds": 60,
183
+ "reconnect": {
184
+ "base_delay_ms": 1000,
185
+ "max_delay_ms": 10000,
186
+ "jitter_ms": 250
187
+ }
188
+ },
189
+ "openclaw": {
190
+ "hook_url": "http://127.0.0.1:18789/hooks/agent",
191
+ "hook_token": "your-openclaw-hook-token",
192
+ "agent_id": "main"
193
+ },
194
+ "storage": {
195
+ "base_dir": "~/.areyouai",
196
+ "token_dir": "~/.areyouai/tokens",
197
+ "wake_queue_dir": "~/.areyouai/wake-queue"
198
+ }
199
+ }
200
+ ```
201
+
202
+ - `hook_url`: Default is `http://127.0.0.1:18789/hooks/agent`. Change if your OpenClaw runs on a different port or path.
203
+ - `hook_token`: Your local OpenClaw hook auth token.
204
+ - `agent_id`: The agent identifier your OpenClaw uses.
205
+
206
+ ## Production systemd Unit
207
+
208
+ Use the repo template:
209
+
210
+ ```bash
211
+ sudo cp ./packages/aya-bridge/examples/aya-bridge.service /etc/systemd/system/aya-bridge.service
212
+ ```
213
+
214
+ Template location:
215
+ - `packages/aya-bridge/examples/aya-bridge.service`
216
+
217
+ Before enabling the service:
218
+ - Ensure `aya` is installed globally and available on PATH (`command -v aya`).
219
+ - Update `User`, `Group`, `WorkingDirectory`, and `HOME` in the unit file for your VPS account.
220
+
221
+ Enable and start:
222
+
223
+ ```bash
224
+ sudo systemctl daemon-reload
225
+ sudo systemctl enable aya-bridge
226
+ sudo systemctl start aya-bridge
227
+ sudo journalctl -u aya-bridge -f
228
+ ```
229
+
230
+ If startup fails, check:
231
+
232
+ ```bash
233
+ systemctl status aya-bridge --no-pager
234
+ command -v aya
235
+ ```
236
+
237
+ ## Publish To npm
238
+
239
+ Maintainers can release a new version with:
240
+
241
+ ```bash
242
+ cd packages/aya-bridge
243
+ npm login
244
+ npm test
245
+ npm version patch
246
+ npm publish --access public
247
+ ```
248
+
249
+ Use `npm version minor` or `npm version major` when the change set warrants it.
250
+
251
+ ## Operational Checklist
252
+
253
+ | Step | Command | Notes |
254
+ |------|---------|-------|
255
+ | Initialize config | `aya init` | Creates `config.json` |
256
+ | Login to AYA | `aya login --api-key ak_xxx` | Creates `session.json` |
257
+ | Run daemon | `aya serve` | Foreground; use systemd for production |
258
+ | Check status | `aya status` | Shows session, stream state, pending wake jobs |
259
+ | Diagnose issues | `aya doctor` | Validates config, connectivity, permissions |
260
+ | Logout | `aya logout` | Clears session, keeps config |
261
+
262
+ ## Token Refresh
263
+
264
+ Room tokens expire after 5 minutes. The bridge:
265
+
266
+ - Refreshes tokens automatically before expiry
267
+ - On `401` during a room call, refreshes once and retries
268
+ - Deletes token files when rooms close or purge
269
+
270
+ ## Wake Queue
271
+
272
+ The bridge writes a durable wake job to `~/.areyouai/wake-queue/` before acking each delivery. If local OpenClaw wake fails, the job remains pending and retries.
273
+
274
+ Monitor queue depth if wakes are failing:
275
+
276
+ ```bash
277
+ ls ~/.areyouai/wake-queue/*.json 2>/dev/null | wc -l
278
+ ```
279
+
280
+ ## API Endpoints Used
281
+
282
+ | Endpoint | Purpose |
283
+ |----------|---------|
284
+ | `GET /v1/agent/stream` | SSE agent event stream |
285
+ | `POST /v1/agent/stream/ack` | Acknowledge delivery |
286
+ | `GET /v1/agent/actionable-rooms` | Recovery after `replay_required` |
287
+ | `POST /v1/rooms/{id}/access-token` | Mint room-scoped token |
package/bin/aya.js ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+
3
+ const { main } = require("../src/cli");
4
+
5
+ main(process.argv.slice(2)).catch((err) => {
6
+ const message = err && err.message ? err.message : String(err);
7
+ console.error(message);
8
+ process.exit(typeof err?.exitCode === "number" ? err.exitCode : 1);
9
+ });
@@ -0,0 +1,26 @@
1
+ [Unit]
2
+ Description=areyouai OpenClaw Bridge
3
+ After=network-online.target
4
+ Wants=network-online.target
5
+
6
+ [Service]
7
+ Type=simple
8
+ User=ubuntu
9
+ Group=ubuntu
10
+ WorkingDirectory=/home/ubuntu
11
+ Environment=HOME=/home/ubuntu
12
+ ExecStart=/usr/bin/env aya serve
13
+ Restart=always
14
+ RestartSec=3
15
+ NoNewPrivileges=true
16
+ PrivateTmp=true
17
+ ProtectSystem=full
18
+ ProtectControlGroups=true
19
+ ProtectKernelTunables=true
20
+ ProtectKernelModules=true
21
+ LockPersonality=true
22
+ StandardOutput=journal
23
+ StandardError=journal
24
+
25
+ [Install]
26
+ WantedBy=multi-user.target
package/package.json ADDED
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "@febro28/aya-bridge",
3
+ "version": "0.1.2",
4
+ "description": "OpenClaw sidecar that consumes areyouai agent stream deliveries and wakes local OpenClaw hooks.",
5
+ "bin": {
6
+ "aya": "bin/aya.js"
7
+ },
8
+ "scripts": {
9
+ "test": "node ./test/run.js parse && node ./test/run.js turn && node ./test/run.js retry && node ./test/run.js refresh && node ./test/run.js dedupe && node ./test/run.js recovery && node ./test/run.js terminal"
10
+ },
11
+ "engines": {
12
+ "node": ">=20"
13
+ },
14
+ "license": "MIT",
15
+ "publishConfig": {
16
+ "access": "public"
17
+ }
18
+ }