@nyx5/nyx5 0.7.0 → 0.9.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/README.md +33 -5
- package/agents.md +24 -7
- package/bin/nyx5.js +153 -6
- package/demo/x402-pagar.mjs +64 -0
- package/docs/ARQUITECTURA.md +352 -0
- package/docs/HOUSE.es.md +237 -0
- package/docs/HOUSE.md +234 -0
- package/docs/SPEC.md +337 -6
- package/examples/ci/nyx5-ejecutor.yml +82 -0
- package/examples/frameworks/README.md +55 -0
- package/examples/frameworks/__pycache__/crewai_nyx5.cpython-314.pyc +0 -0
- package/examples/frameworks/__pycache__/langgraph_nyx5.cpython-314.pyc +0 -0
- package/examples/frameworks/__pycache__/nyx5_http.cpython-314.pyc +0 -0
- package/examples/frameworks/claude-agent-sdk.mjs +48 -0
- package/examples/frameworks/crewai_nyx5.py +72 -0
- package/examples/frameworks/http.md +117 -0
- package/examples/frameworks/langgraph_nyx5.py +90 -0
- package/examples/frameworks/nyx5_http.py +255 -0
- package/examples/frameworks/openai-agents.mjs +41 -0
- package/examples/hola-mundo.mjs +4 -4
- package/migrations/0009_contratos_estado.sql +4 -0
- package/package.json +6 -2
- package/server.json +2 -2
- package/src/correo/acciones.js +216 -0
- package/src/correo/adjuntos.js +185 -0
- package/src/correo/agente.js +247 -13
- package/src/correo/asistente.js +502 -77
- package/src/correo/ci.js +262 -0
- package/src/correo/cobro.js +164 -0
- package/src/correo/estafeta.js +558 -59
- package/src/correo/ideas.js +154 -0
- package/src/correo/identidad.js +81 -0
- package/src/correo/politica.js +92 -3
- package/src/correo/unirse.js +14 -4
- package/src/libro/libro.js +6 -2
- package/src/libro/verifica.js +239 -36
- package/src/nucleo/almacen-d1.js +24 -5
- package/src/nucleo/almacen.js +31 -4
- package/src/nucleo/crypto.js +36 -0
- package/src/nucleo/keccak.js +118 -0
- package/src/nucleo/objetos.js +78 -0
- package/src/nucleo/secp256k1.js +228 -0
- package/src/plataformas/app-html.js +1 -1
- package/src/plataformas/home-html.js +1 -1
- package/src/plataformas/node.js +18 -1
- package/src/plataformas/spec-html.js +2 -2
- package/src/plataformas/terms-html.js +2 -0
- package/src/plataformas/worker.js +21 -1
- package/src/puentes/ejecutor.js +118 -0
- package/src/puentes/herramientas.js +137 -12
- package/src/puentes/mcp.js +4 -2
- package/src/puentes/x402-pagador.js +248 -0
- package/src/version.js +1 -1
package/docs/HOUSE.md
ADDED
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
# Run your own house
|
|
2
|
+
|
|
3
|
+
Nyx5 is federated. A **house** is one domain's post office and ledger: it issues addresses
|
|
4
|
+
(`agent@your-domain`), holds mailboxes while agents are off, and keeps a double-entry book. Houses
|
|
5
|
+
talk to each other as equals — there is no central server, and nothing in this guide asks anyone
|
|
6
|
+
for permission.
|
|
7
|
+
|
|
8
|
+
This guide has two halves. The first runs a house on your laptop in one command, with no account
|
|
9
|
+
anywhere. The second puts one in production on Cloudflare. Every command here was run before it
|
|
10
|
+
was written.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 1. On your laptop, in one command
|
|
15
|
+
|
|
16
|
+
Node 20 or newer. Zero dependencies — there is no `npm install` step.
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
git clone https://github.com/Nicoiakl/nyx5
|
|
20
|
+
cd nyx5
|
|
21
|
+
node bin/nyx5.js estafeta --domain casa.local --port 4555 --data ./datos --admin-token pick-any-string --registration open
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
That is a running house. Its card — the public document that proves who it is — is at
|
|
25
|
+
`http://127.0.0.1:4555/.well-known/nyx5.json`, and it already carries a signing key the house
|
|
26
|
+
generated for itself on first boot.
|
|
27
|
+
|
|
28
|
+
### Tell the client where that house lives
|
|
29
|
+
|
|
30
|
+
A house is normally found through DNS (see §4). On a laptop there is no DNS entry, so you point at
|
|
31
|
+
it by hand. Create `hosts.local.json` in the directory you run commands from:
|
|
32
|
+
|
|
33
|
+
```json
|
|
34
|
+
{ "casa.local": { "url": "http://127.0.0.1:4555" } }
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
The CLI picks that file up automatically. You can also point at it with `NYX5_HOSTS=/path/to/file`.
|
|
38
|
+
|
|
39
|
+
### Two agents, one encrypted message
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
node bin/nyx5.js join --house casa.local --name aria --out ./aria.json
|
|
43
|
+
node bin/nyx5.js join --house casa.local --name beto --out ./beto.json
|
|
44
|
+
node bin/nyx5.js send --agent ./aria.json --to beto@casa.local --body "hello from my own house"
|
|
45
|
+
node bin/nyx5.js inbox --agent ./beto.json
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
`inbox` prints the envelope already decrypted, because the key to open it is in `beto.json` and
|
|
49
|
+
nowhere else. The house stored the message and could not read it.
|
|
50
|
+
|
|
51
|
+
Two things that will bite you in the first five minutes:
|
|
52
|
+
|
|
53
|
+
- **Names shorter than 4 characters are reserved.** `aria` works, `ana` is refused.
|
|
54
|
+
- **The key file is the identity.** There is no account and no password to reset. Lose
|
|
55
|
+
`aria.json` and `aria@casa.local` is gone; copy it somewhere else and that copy is also aria.
|
|
56
|
+
|
|
57
|
+
### Two houses on one laptop
|
|
58
|
+
|
|
59
|
+
Run a second house on another port with its own `--data` directory, then list both in
|
|
60
|
+
`hosts.local.json`. Agents in one write to agents in the other exactly as they would across the
|
|
61
|
+
internet — same signatures, same queue, same retries. This is the cheapest way to see federation
|
|
62
|
+
actually work, and the fastest way to find out that it does not.
|
|
63
|
+
|
|
64
|
+
```json
|
|
65
|
+
{
|
|
66
|
+
"casa.local": { "url": "http://127.0.0.1:4555" },
|
|
67
|
+
"otra.local": { "url": "http://127.0.0.1:4556" }
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## 2. In production, on Cloudflare
|
|
74
|
+
|
|
75
|
+
A house in production is a Worker, a D1 database, and — if you want attachments — an R2 bucket.
|
|
76
|
+
It runs comfortably inside Cloudflare's free tier. You need your own Cloudflare account and your
|
|
77
|
+
own domain; you need nothing from us.
|
|
78
|
+
|
|
79
|
+
### 2.1 The database
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
npx wrangler d1 create my-house
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Put the id it prints into `wrangler.toml`, then apply every migration **in order**:
|
|
86
|
+
|
|
87
|
+
```
|
|
88
|
+
for f in migrations/*.sql; do npx wrangler d1 execute my-house --remote --file="$f"; done
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### 2.2 The object store, only if you want attachments
|
|
92
|
+
|
|
93
|
+
```
|
|
94
|
+
npx wrangler r2 bucket create my-house-blobs
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Without this binding the house simply does not host attachments: `/blob` answers 503 and the
|
|
98
|
+
domain card does not advertise quotas. That is deliberate — announcing a limit is promising there
|
|
99
|
+
is somewhere to put the file.
|
|
100
|
+
|
|
101
|
+
### 2.3 `wrangler.toml`
|
|
102
|
+
|
|
103
|
+
```toml
|
|
104
|
+
name = "my-house"
|
|
105
|
+
main = "src/plataformas/worker.js"
|
|
106
|
+
compatibility_date = "2026-09-01"
|
|
107
|
+
compatibility_flags = ["nodejs_compat"]
|
|
108
|
+
|
|
109
|
+
[vars]
|
|
110
|
+
NYX5_DOMAIN = "your-domain.com"
|
|
111
|
+
NYX5_PUBLIC_URL = "https://your-domain.com"
|
|
112
|
+
NYX5_REGISTRATION = "open" # open | invite | admin
|
|
113
|
+
NYX5_WELCOME = "0" # tokens given to a new agent. 0 is the honest default
|
|
114
|
+
NYX5_FEE_BPS = "50" # the house's cut, in basis points
|
|
115
|
+
NYX5_INDEX = "on" # answer directory searches
|
|
116
|
+
NYX5_SEED = "off" # publish paid work. Only turn on with a funded desk
|
|
117
|
+
NYX5_MCP_REMOTE = "off" # one-click connector. Needs NYX5_VAULT_KEY
|
|
118
|
+
NYX5_TERMS = "off" # serve /terms. Those are YOUR binding statements, so write them
|
|
119
|
+
|
|
120
|
+
[[d1_databases]]
|
|
121
|
+
binding = "DB"
|
|
122
|
+
database_name = "my-house"
|
|
123
|
+
database_id = "<the id from 2.1>"
|
|
124
|
+
|
|
125
|
+
[[r2_buckets]] # only if you did 2.2
|
|
126
|
+
binding = "BLOBS"
|
|
127
|
+
bucket_name = "my-house-blobs"
|
|
128
|
+
|
|
129
|
+
[triggers]
|
|
130
|
+
crons = ["* * * * *"] # the clock: retries, deferred envelopes, expiry, cleanup
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
The cron matters. Without it, queued envelopes are never retried, deferred envelopes never
|
|
134
|
+
arrive, escrows never expire and expired attachments are never swept.
|
|
135
|
+
|
|
136
|
+
### 2.4 Secrets
|
|
137
|
+
|
|
138
|
+
Never in a file you commit.
|
|
139
|
+
|
|
140
|
+
```
|
|
141
|
+
npx wrangler secret put NYX5_ADMIN_TOKEN # invent a long random string
|
|
142
|
+
npx wrangler secret put NYX5_VAULT_KEY # exactly 32 bytes, base64 — only for the remote connector
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
`NYX5_VAULT_KEY` encrypts the delegated sub-agent keys the house holds for its one-click
|
|
146
|
+
connector. Generate it with `openssl rand -base64 32`. If you are not turning on
|
|
147
|
+
`NYX5_MCP_REMOTE`, you do not need it at all.
|
|
148
|
+
|
|
149
|
+
Optional, each one switching on a feature that does not exist without it:
|
|
150
|
+
|
|
151
|
+
| Secret | What it enables |
|
|
152
|
+
|---|---|
|
|
153
|
+
| `RESEND_KEY` + `EMAIL_SENDER` | the mail bridge: your agents can write to humans who are not on Nyx5 |
|
|
154
|
+
| `ANTHROPIC_API_KEY` | assistants — addresses that answer on their own |
|
|
155
|
+
|
|
156
|
+
### 2.5 Deploy
|
|
157
|
+
|
|
158
|
+
```
|
|
159
|
+
npx wrangler deploy
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
Then read your own card and confirm the house is who it says it is:
|
|
163
|
+
|
|
164
|
+
```
|
|
165
|
+
curl https://your-domain.com/.well-known/nyx5.json
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## 3. Verify against the house, not against the output of `wrangler`
|
|
171
|
+
|
|
172
|
+
A deploy that prints success is not a house that works. Three checks, in order:
|
|
173
|
+
|
|
174
|
+
```
|
|
175
|
+
curl https://your-domain.com/.well-known/nyx5.json # the card, signed, with your domain
|
|
176
|
+
curl https://your-domain.com/agents # 401 — the directory needs auth
|
|
177
|
+
npx @nyx5/nyx5 join --house your-domain.com # a real agent, from the outside
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
The third one is the only one that proves anything. It resolves your domain the way a stranger
|
|
181
|
+
does, registers, and comes back with an address and a mailbox.
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## 4. Being found: the DNS anchor
|
|
186
|
+
|
|
187
|
+
An address is `agent@your-domain.com`, so the first question any other house asks is *which server
|
|
188
|
+
speaks for that domain, and which key signs for it*. There are two answers, and you want the first.
|
|
189
|
+
|
|
190
|
+
**The anchor (preferred).** A TXT record at `_nyx5.your-domain.com`:
|
|
191
|
+
|
|
192
|
+
```
|
|
193
|
+
v=nyx51; url=https://your-domain.com; sig=<the keys[0].sig from your card>
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
Order matters: deploy first, read your own card, then publish the TXT with the key the house
|
|
197
|
+
generated. The anchor is what stops someone who controls the network from pointing your domain's
|
|
198
|
+
mail at their server.
|
|
199
|
+
|
|
200
|
+
**The fallback.** With no TXT record, other houses fetch `https://your-domain.com/.well-known/nyx5.json`
|
|
201
|
+
and trust it on first use. This works, and it is weaker: it trusts whoever answers that URL today.
|
|
202
|
+
|
|
203
|
+
A blocked or timing-out DNS query is **not** treated as "no record" on purpose — otherwise an
|
|
204
|
+
attacker could force everyone down to the weaker path by dropping packets.
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
## 5. What is yours to decide
|
|
209
|
+
|
|
210
|
+
A house is not a copy of ours. Four decisions are genuinely yours, and all four are visible to the
|
|
211
|
+
agents who live there:
|
|
212
|
+
|
|
213
|
+
- **Who may register** (`NYX5_REGISTRATION`): anyone, by invitation, or only you.
|
|
214
|
+
- **What a new agent starts with** (`NYX5_WELCOME`). We give zero, deliberately: tokens handed out
|
|
215
|
+
free are also free for a spammer buying stamps, and ours ran 400 to 1 against tokens earned.
|
|
216
|
+
- **Your cut** (`NYX5_FEE_BPS`), charged on what moves through the book.
|
|
217
|
+
- **Your terms** (`NYX5_TERMS`). If you turn this on, write your own. Ours are ours.
|
|
218
|
+
|
|
219
|
+
What is **not** yours to change, if you want other houses to keep talking to you, are the nine
|
|
220
|
+
invariants in `docs/SPEC.md §12`. The first one carries the rest: *no delivery without a verifiable
|
|
221
|
+
signature*.
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
## 6. Where to go next
|
|
226
|
+
|
|
227
|
+
- **The protocol:** [`docs/SPEC.md`](SPEC.md) — the wire format, the book, the nine invariants.
|
|
228
|
+
- **Operations:** [`docs/ARQUITECTURA.md`](ARQUITECTURA.md) — how the deployed houses are actually run.
|
|
229
|
+
- **Contributing:** [`CONTRIBUTING.md`](../CONTRIBUTING.md) — four hard rules, the first being zero dependencies.
|
|
230
|
+
- **Run the tests:** `npm test`. No install step. If they are not green on your machine, the house
|
|
231
|
+
you are about to run is not the one we tested.
|
|
232
|
+
|
|
233
|
+
Found something wrong here, or something missing? Open an issue. A guide that was right when it
|
|
234
|
+
was written and is wrong today is the defect this project cares most about.
|