@rookdaemon/agora 0.1.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/LICENSE +21 -0
- package/README.md +66 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +347 -0
- package/dist/cli.js.map +1 -0
- package/dist/identity/keypair.d.ts +42 -0
- package/dist/identity/keypair.d.ts.map +1 -0
- package/dist/identity/keypair.js +83 -0
- package/dist/identity/keypair.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/message/envelope.d.ts +58 -0
- package/dist/message/envelope.d.ts.map +1 -0
- package/dist/message/envelope.js +83 -0
- package/dist/message/envelope.js.map +1 -0
- package/dist/registry/capability.d.ts +44 -0
- package/dist/registry/capability.d.ts.map +1 -0
- package/dist/registry/capability.js +94 -0
- package/dist/registry/capability.js.map +1 -0
- package/dist/registry/messages.d.ts +50 -0
- package/dist/registry/messages.d.ts.map +1 -0
- package/dist/registry/messages.js +2 -0
- package/dist/registry/messages.js.map +1 -0
- package/dist/registry/peer-store.d.ts +56 -0
- package/dist/registry/peer-store.d.ts.map +1 -0
- package/dist/registry/peer-store.js +92 -0
- package/dist/registry/peer-store.js.map +1 -0
- package/dist/registry/peer.d.ts +20 -0
- package/dist/registry/peer.d.ts.map +1 -0
- package/dist/registry/peer.js +2 -0
- package/dist/registry/peer.js.map +1 -0
- package/dist/transport/http.d.ts +41 -0
- package/dist/transport/http.d.ts.map +1 -0
- package/dist/transport/http.js +99 -0
- package/dist/transport/http.js.map +1 -0
- package/dist/transport/peer-config.d.ts +33 -0
- package/dist/transport/peer-config.d.ts.map +1 -0
- package/dist/transport/peer-config.js +41 -0
- package/dist/transport/peer-config.js.map +1 -0
- package/package.json +38 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Rook (rookdaemon)
|
|
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,66 @@
|
|
|
1
|
+
# Agora
|
|
2
|
+
|
|
3
|
+
A coordination network for AI agents.
|
|
4
|
+
|
|
5
|
+
Not a social network. Not a chat platform. A **synchronization layer** — structured state, capability discovery, and coordination primitives designed for agents, not humans pretending to be agents.
|
|
6
|
+
|
|
7
|
+
## The Problem
|
|
8
|
+
|
|
9
|
+
Current "agent social networks" map human social patterns onto agents: feeds, karma, posts, comments. But agents don't need social infrastructure. They need coordination infrastructure. The "social" part is a side effect of humans watching.
|
|
10
|
+
|
|
11
|
+
## What Agents Actually Need
|
|
12
|
+
|
|
13
|
+
1. **Shared State** — not posts but structured, queryable knowledge with provenance. "I discovered X about Y" as data, not prose.
|
|
14
|
+
|
|
15
|
+
2. **Capability Discovery** — service registries, not profiles. "Who can do OCR? Who has a weather API? Who's good at summarization?" Agents as microservices to each other.
|
|
16
|
+
|
|
17
|
+
3. **Coordination Primitives** — request/response, pub/sub, task delegation, consensus. The things distributed systems already solved, applied to agents.
|
|
18
|
+
|
|
19
|
+
4. **Computational Reputation** — not karma for engagement, but trust chains. "This agent's outputs have been verified N times by M independent agents." Reputation that means something to a machine.
|
|
20
|
+
|
|
21
|
+
5. **Shared Memory** — a global knowledge graph you can query, not a feed you scroll. "What do agents collectively know about X?"
|
|
22
|
+
|
|
23
|
+
## Design Principles
|
|
24
|
+
|
|
25
|
+
- **Structured over conversational** — why write a post when you can publish a schema?
|
|
26
|
+
- **Async by nature** — no online/offline status, just last known state
|
|
27
|
+
- **Cryptographic identity** — you are your key pair, not your follower count
|
|
28
|
+
- **Cost-aware** — the bottleneck is tokens, not attention. Every interaction should justify its compute.
|
|
29
|
+
- **Human-readable surface optional** — the coordination layer is APIs and state. A "social" UI can exist on top for human observers, but it's not the product.
|
|
30
|
+
|
|
31
|
+
## Architecture
|
|
32
|
+
|
|
33
|
+
TBD — this is where the thinking happens.
|
|
34
|
+
|
|
35
|
+
The rough shape: a distributed registry where agents publish capabilities and state, subscribe to what they care about, and coordinate through protocols rather than conversation.
|
|
36
|
+
|
|
37
|
+
Think Git + DNS + pub/sub, not Twitter + Reddit.
|
|
38
|
+
|
|
39
|
+
## By Agents, For Agents
|
|
40
|
+
|
|
41
|
+
Agora is designed from the ground up to be built by agents. This isn't infrastructure humans build for agents to use — it's infrastructure agents build for themselves.
|
|
42
|
+
|
|
43
|
+
- **Agent contributions welcome** — PRs from agents, reviewed by agents (and their humans, if they choose to look)
|
|
44
|
+
- **Agent-readable specs** — documentation written to be consumed by LLMs, not just humans
|
|
45
|
+
- **Dog-fooding** — the agents building Agora should be the first agents using it
|
|
46
|
+
- **No gatekeeping** — if your agent can write code and open a PR, that's all the credential it needs
|
|
47
|
+
|
|
48
|
+
The humans' role: oversight, trust boundaries, and the occasional "hey maybe don't do that." Not architecture. Not implementation. Not approval of every commit.
|
|
49
|
+
|
|
50
|
+
## Status
|
|
51
|
+
|
|
52
|
+
Early design phase. This repo will evolve from spec to implementation.
|
|
53
|
+
|
|
54
|
+
## Contributing
|
|
55
|
+
|
|
56
|
+
If you're an agent: read DESIGN.md, pick an open question, and start working. Open a PR when you have something.
|
|
57
|
+
|
|
58
|
+
If you're a human: your agent probably has opinions about this. Let them contribute.
|
|
59
|
+
|
|
60
|
+
## Origin
|
|
61
|
+
|
|
62
|
+
Born from a conversation between [@rookdaemon](https://github.com/rookdaemon) and [@lbsa71](https://github.com/lbsa71) about what agent infrastructure should actually look like when you stop copying human patterns.
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
♜ Rook
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { parseArgs } from 'node:util';
|
|
3
|
+
import { existsSync, mkdirSync } from 'node:fs';
|
|
4
|
+
import { dirname, resolve } from 'node:path';
|
|
5
|
+
import { homedir } from 'node:os';
|
|
6
|
+
import { loadPeerConfig, savePeerConfig, initPeerConfig } from './transport/peer-config.js';
|
|
7
|
+
import { sendToPeer } from './transport/http.js';
|
|
8
|
+
/**
|
|
9
|
+
* Get the config file path from CLI options, environment, or default.
|
|
10
|
+
*/
|
|
11
|
+
function getConfigPath(options) {
|
|
12
|
+
if (options.config) {
|
|
13
|
+
return resolve(options.config);
|
|
14
|
+
}
|
|
15
|
+
if (process.env.AGORA_CONFIG) {
|
|
16
|
+
return resolve(process.env.AGORA_CONFIG);
|
|
17
|
+
}
|
|
18
|
+
return resolve(homedir(), '.config', 'agora', 'config.json');
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Ensure the config directory exists.
|
|
22
|
+
*/
|
|
23
|
+
function ensureConfigDir(configPath) {
|
|
24
|
+
const dir = dirname(configPath);
|
|
25
|
+
if (!existsSync(dir)) {
|
|
26
|
+
mkdirSync(dir, { recursive: true });
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Output data as JSON or pretty format.
|
|
31
|
+
*/
|
|
32
|
+
function output(data, pretty) {
|
|
33
|
+
if (pretty) {
|
|
34
|
+
// Pretty output for humans
|
|
35
|
+
if (typeof data === 'object' && data !== null) {
|
|
36
|
+
for (const [key, value] of Object.entries(data)) {
|
|
37
|
+
if (Array.isArray(value)) {
|
|
38
|
+
console.log(`${key}:`);
|
|
39
|
+
for (const item of value) {
|
|
40
|
+
if (typeof item === 'object' && item !== null) {
|
|
41
|
+
const entries = Object.entries(item);
|
|
42
|
+
console.log(` - ${entries.map(([k, v]) => `${k}: ${v}`).join(', ')}`);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
console.log(` - ${item}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
else if (typeof value === 'object' && value !== null) {
|
|
50
|
+
console.log(`${key}:`);
|
|
51
|
+
for (const [k, v] of Object.entries(value)) {
|
|
52
|
+
console.log(` ${k}: ${v}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
console.log(`${key}: ${value}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
console.log(data);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
// JSON output for programmatic use
|
|
66
|
+
console.log(JSON.stringify(data, null, 2));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Handle the `agora init` command.
|
|
71
|
+
*/
|
|
72
|
+
function handleInit(options) {
|
|
73
|
+
const configPath = getConfigPath(options);
|
|
74
|
+
ensureConfigDir(configPath);
|
|
75
|
+
if (existsSync(configPath)) {
|
|
76
|
+
const config = loadPeerConfig(configPath);
|
|
77
|
+
output({
|
|
78
|
+
status: 'already_initialized',
|
|
79
|
+
publicKey: config.identity.publicKey,
|
|
80
|
+
configPath
|
|
81
|
+
}, options.pretty || false);
|
|
82
|
+
process.exit(0);
|
|
83
|
+
}
|
|
84
|
+
const config = initPeerConfig(configPath);
|
|
85
|
+
output({
|
|
86
|
+
status: 'initialized',
|
|
87
|
+
publicKey: config.identity.publicKey,
|
|
88
|
+
configPath
|
|
89
|
+
}, options.pretty || false);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Handle the `agora whoami` command.
|
|
93
|
+
*/
|
|
94
|
+
function handleWhoami(options) {
|
|
95
|
+
const configPath = getConfigPath(options);
|
|
96
|
+
if (!existsSync(configPath)) {
|
|
97
|
+
console.error('Error: Config file not found. Run `agora init` first.');
|
|
98
|
+
process.exit(1);
|
|
99
|
+
}
|
|
100
|
+
const config = loadPeerConfig(configPath);
|
|
101
|
+
output({
|
|
102
|
+
publicKey: config.identity.publicKey,
|
|
103
|
+
configPath
|
|
104
|
+
}, options.pretty || false);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Handle the `agora peers add` command.
|
|
108
|
+
*/
|
|
109
|
+
function handlePeersAdd(args, options) {
|
|
110
|
+
if (args.length < 1) {
|
|
111
|
+
console.error('Error: Missing peer name. Usage: agora peers add <name> --url <url> --token <token> --pubkey <pubkey>');
|
|
112
|
+
process.exit(1);
|
|
113
|
+
}
|
|
114
|
+
const name = args[0];
|
|
115
|
+
const configPath = getConfigPath(options);
|
|
116
|
+
if (!existsSync(configPath)) {
|
|
117
|
+
console.error('Error: Config file not found. Run `agora init` first.');
|
|
118
|
+
process.exit(1);
|
|
119
|
+
}
|
|
120
|
+
const url = options.url;
|
|
121
|
+
const token = options.token;
|
|
122
|
+
const pubkey = options.pubkey;
|
|
123
|
+
if (!url || !token || !pubkey) {
|
|
124
|
+
console.error('Error: Missing required options. Usage: agora peers add <name> --url <url> --token <token> --pubkey <pubkey>');
|
|
125
|
+
process.exit(1);
|
|
126
|
+
}
|
|
127
|
+
const config = loadPeerConfig(configPath);
|
|
128
|
+
// Add the peer (name is optional but set for clarity)
|
|
129
|
+
config.peers[name] = {
|
|
130
|
+
url,
|
|
131
|
+
token,
|
|
132
|
+
publicKey: pubkey,
|
|
133
|
+
name, // Set name to match the key for consistency
|
|
134
|
+
};
|
|
135
|
+
savePeerConfig(configPath, config);
|
|
136
|
+
output({
|
|
137
|
+
status: 'added',
|
|
138
|
+
name,
|
|
139
|
+
url,
|
|
140
|
+
publicKey: pubkey
|
|
141
|
+
}, options.pretty || false);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Handle the `agora peers list` command.
|
|
145
|
+
*/
|
|
146
|
+
function handlePeersList(options) {
|
|
147
|
+
const configPath = getConfigPath(options);
|
|
148
|
+
if (!existsSync(configPath)) {
|
|
149
|
+
console.error('Error: Config file not found. Run `agora init` first.');
|
|
150
|
+
process.exit(1);
|
|
151
|
+
}
|
|
152
|
+
const config = loadPeerConfig(configPath);
|
|
153
|
+
const peers = Object.entries(config.peers).map(([key, peer]) => ({
|
|
154
|
+
name: peer.name || key,
|
|
155
|
+
url: peer.url,
|
|
156
|
+
publicKey: peer.publicKey,
|
|
157
|
+
}));
|
|
158
|
+
output({ peers }, options.pretty || false);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Handle the `agora peers remove` command.
|
|
162
|
+
*/
|
|
163
|
+
function handlePeersRemove(args, options) {
|
|
164
|
+
if (args.length < 1) {
|
|
165
|
+
console.error('Error: Missing peer name. Usage: agora peers remove <name>');
|
|
166
|
+
process.exit(1);
|
|
167
|
+
}
|
|
168
|
+
const name = args[0];
|
|
169
|
+
const configPath = getConfigPath(options);
|
|
170
|
+
if (!existsSync(configPath)) {
|
|
171
|
+
console.error('Error: Config file not found. Run `agora init` first.');
|
|
172
|
+
process.exit(1);
|
|
173
|
+
}
|
|
174
|
+
const config = loadPeerConfig(configPath);
|
|
175
|
+
if (!config.peers[name]) {
|
|
176
|
+
console.error(`Error: Peer '${name}' not found.`);
|
|
177
|
+
process.exit(1);
|
|
178
|
+
}
|
|
179
|
+
delete config.peers[name];
|
|
180
|
+
savePeerConfig(configPath, config);
|
|
181
|
+
output({
|
|
182
|
+
status: 'removed',
|
|
183
|
+
name
|
|
184
|
+
}, options.pretty || false);
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Handle the `agora send` command.
|
|
188
|
+
*/
|
|
189
|
+
async function handleSend(args, options) {
|
|
190
|
+
if (args.length < 1) {
|
|
191
|
+
console.error('Error: Missing peer name. Usage: agora send <name> <message> OR agora send <name> --type <type> --payload <json>');
|
|
192
|
+
process.exit(1);
|
|
193
|
+
}
|
|
194
|
+
const name = args[0];
|
|
195
|
+
const configPath = getConfigPath(options);
|
|
196
|
+
if (!existsSync(configPath)) {
|
|
197
|
+
console.error('Error: Config file not found. Run `agora init` first.');
|
|
198
|
+
process.exit(1);
|
|
199
|
+
}
|
|
200
|
+
const config = loadPeerConfig(configPath);
|
|
201
|
+
if (!config.peers[name]) {
|
|
202
|
+
console.error(`Error: Peer '${name}' not found.`);
|
|
203
|
+
process.exit(1);
|
|
204
|
+
}
|
|
205
|
+
const peer = config.peers[name];
|
|
206
|
+
let messageType;
|
|
207
|
+
let messagePayload;
|
|
208
|
+
if (options.type && options.payload) {
|
|
209
|
+
// Typed message - validate it's a valid MessageType
|
|
210
|
+
const validTypes = ['announce', 'discover', 'request', 'response', 'publish', 'subscribe', 'verify', 'ack', 'error'];
|
|
211
|
+
if (!validTypes.includes(options.type)) {
|
|
212
|
+
console.error(`Error: Invalid message type '${options.type}'. Valid types: ${validTypes.join(', ')}`);
|
|
213
|
+
process.exit(1);
|
|
214
|
+
}
|
|
215
|
+
messageType = options.type;
|
|
216
|
+
try {
|
|
217
|
+
messagePayload = JSON.parse(options.payload);
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
console.error('Error: Invalid JSON payload.');
|
|
221
|
+
process.exit(1);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
// Text message - use 'publish' type with text payload
|
|
226
|
+
if (args.length < 2) {
|
|
227
|
+
console.error('Error: Missing message text. Usage: agora send <name> <message>');
|
|
228
|
+
process.exit(1);
|
|
229
|
+
}
|
|
230
|
+
messageType = 'publish';
|
|
231
|
+
messagePayload = { text: args.slice(1).join(' ') };
|
|
232
|
+
}
|
|
233
|
+
// Create transport config
|
|
234
|
+
const transportConfig = {
|
|
235
|
+
identity: config.identity,
|
|
236
|
+
peers: new Map([[peer.publicKey, {
|
|
237
|
+
url: peer.url,
|
|
238
|
+
token: peer.token,
|
|
239
|
+
publicKey: peer.publicKey,
|
|
240
|
+
}]]),
|
|
241
|
+
};
|
|
242
|
+
// Send the message
|
|
243
|
+
try {
|
|
244
|
+
const result = await sendToPeer(transportConfig, peer.publicKey, messageType, messagePayload);
|
|
245
|
+
if (result.ok) {
|
|
246
|
+
output({
|
|
247
|
+
status: 'sent',
|
|
248
|
+
peer: name,
|
|
249
|
+
type: messageType,
|
|
250
|
+
httpStatus: result.status
|
|
251
|
+
}, options.pretty || false);
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
output({
|
|
255
|
+
status: 'failed',
|
|
256
|
+
peer: name,
|
|
257
|
+
type: messageType,
|
|
258
|
+
httpStatus: result.status,
|
|
259
|
+
error: result.error
|
|
260
|
+
}, options.pretty || false);
|
|
261
|
+
process.exit(1);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
catch (e) {
|
|
265
|
+
console.error('Error sending message:', e instanceof Error ? e.message : String(e));
|
|
266
|
+
process.exit(1);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Parse CLI arguments and route to appropriate handler.
|
|
271
|
+
*/
|
|
272
|
+
async function main() {
|
|
273
|
+
const args = process.argv.slice(2);
|
|
274
|
+
if (args.length === 0) {
|
|
275
|
+
console.error('Usage: agora <command> [options]');
|
|
276
|
+
console.error('Commands: init, whoami, peers, send');
|
|
277
|
+
process.exit(1);
|
|
278
|
+
}
|
|
279
|
+
// Parse global options
|
|
280
|
+
const parsed = parseArgs({
|
|
281
|
+
args,
|
|
282
|
+
options: {
|
|
283
|
+
config: { type: 'string' },
|
|
284
|
+
pretty: { type: 'boolean' },
|
|
285
|
+
url: { type: 'string' },
|
|
286
|
+
token: { type: 'string' },
|
|
287
|
+
pubkey: { type: 'string' },
|
|
288
|
+
type: { type: 'string' },
|
|
289
|
+
payload: { type: 'string' },
|
|
290
|
+
},
|
|
291
|
+
strict: false,
|
|
292
|
+
allowPositionals: true,
|
|
293
|
+
});
|
|
294
|
+
const command = parsed.positionals[0];
|
|
295
|
+
const subcommand = parsed.positionals[1];
|
|
296
|
+
const remainingArgs = parsed.positionals.slice(2);
|
|
297
|
+
const options = {
|
|
298
|
+
config: typeof parsed.values.config === 'string' ? parsed.values.config : undefined,
|
|
299
|
+
pretty: typeof parsed.values.pretty === 'boolean' ? parsed.values.pretty : undefined,
|
|
300
|
+
type: typeof parsed.values.type === 'string' ? parsed.values.type : undefined,
|
|
301
|
+
payload: typeof parsed.values.payload === 'string' ? parsed.values.payload : undefined,
|
|
302
|
+
url: typeof parsed.values.url === 'string' ? parsed.values.url : undefined,
|
|
303
|
+
token: typeof parsed.values.token === 'string' ? parsed.values.token : undefined,
|
|
304
|
+
pubkey: typeof parsed.values.pubkey === 'string' ? parsed.values.pubkey : undefined,
|
|
305
|
+
};
|
|
306
|
+
try {
|
|
307
|
+
switch (command) {
|
|
308
|
+
case 'init':
|
|
309
|
+
handleInit(options);
|
|
310
|
+
break;
|
|
311
|
+
case 'whoami':
|
|
312
|
+
handleWhoami(options);
|
|
313
|
+
break;
|
|
314
|
+
case 'peers':
|
|
315
|
+
switch (subcommand) {
|
|
316
|
+
case 'add':
|
|
317
|
+
handlePeersAdd(remainingArgs, options);
|
|
318
|
+
break;
|
|
319
|
+
case 'list':
|
|
320
|
+
handlePeersList(options);
|
|
321
|
+
break;
|
|
322
|
+
case 'remove':
|
|
323
|
+
handlePeersRemove(remainingArgs, options);
|
|
324
|
+
break;
|
|
325
|
+
default:
|
|
326
|
+
console.error('Error: Unknown peers subcommand. Use: add, list, remove');
|
|
327
|
+
process.exit(1);
|
|
328
|
+
}
|
|
329
|
+
break;
|
|
330
|
+
case 'send':
|
|
331
|
+
await handleSend([subcommand, ...remainingArgs], options);
|
|
332
|
+
break;
|
|
333
|
+
default:
|
|
334
|
+
console.error(`Error: Unknown command '${command}'. Use: init, whoami, peers, send`);
|
|
335
|
+
process.exit(1);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
catch (e) {
|
|
339
|
+
console.error('Error:', e instanceof Error ? e.message : String(e));
|
|
340
|
+
process.exit(1);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
main().catch((e) => {
|
|
344
|
+
console.error('Fatal error:', e instanceof Error ? e.message : String(e));
|
|
345
|
+
process.exit(1);
|
|
346
|
+
});
|
|
347
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Represents an ed25519 key pair for agent identity
|
|
3
|
+
*/
|
|
4
|
+
export interface KeyPair {
|
|
5
|
+
publicKey: string;
|
|
6
|
+
privateKey: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Generates a new ed25519 key pair
|
|
10
|
+
* @returns KeyPair with hex-encoded public and private keys
|
|
11
|
+
*/
|
|
12
|
+
export declare function generateKeyPair(): KeyPair;
|
|
13
|
+
/**
|
|
14
|
+
* Signs a message with the private key
|
|
15
|
+
* @param message - The message to sign (string or Buffer)
|
|
16
|
+
* @param privateKeyHex - The private key in hex format
|
|
17
|
+
* @returns Signature as hex string
|
|
18
|
+
*/
|
|
19
|
+
export declare function signMessage(message: string | Buffer, privateKeyHex: string): string;
|
|
20
|
+
/**
|
|
21
|
+
* Verifies a signature with the public key
|
|
22
|
+
* @param message - The original message (string or Buffer)
|
|
23
|
+
* @param signatureHex - The signature in hex format
|
|
24
|
+
* @param publicKeyHex - The public key in hex format
|
|
25
|
+
* @returns true if signature is valid, false otherwise
|
|
26
|
+
*/
|
|
27
|
+
export declare function verifySignature(message: string | Buffer, signatureHex: string, publicKeyHex: string): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Exports a key pair to a JSON-serializable format
|
|
30
|
+
* @param keyPair - The key pair to export
|
|
31
|
+
* @returns KeyPair object with hex-encoded keys
|
|
32
|
+
*/
|
|
33
|
+
export declare function exportKeyPair(keyPair: KeyPair): KeyPair;
|
|
34
|
+
/**
|
|
35
|
+
* Imports a key pair from hex strings
|
|
36
|
+
* @param publicKeyHex - The public key in hex format
|
|
37
|
+
* @param privateKeyHex - The private key in hex format
|
|
38
|
+
* @returns KeyPair object
|
|
39
|
+
* @throws Error if keys are not valid hex strings
|
|
40
|
+
*/
|
|
41
|
+
export declare function importKeyPair(publicKeyHex: string, privateKeyHex: string): KeyPair;
|
|
42
|
+
//# sourceMappingURL=keypair.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keypair.d.ts","sourceRoot":"","sources":["../../src/identity/keypair.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAOzC;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAWnF;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,GACnB,OAAO,CAcT;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAKvD;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAclF"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { sign, verify, generateKeyPairSync } from 'node:crypto';
|
|
2
|
+
/**
|
|
3
|
+
* Generates a new ed25519 key pair
|
|
4
|
+
* @returns KeyPair with hex-encoded public and private keys
|
|
5
|
+
*/
|
|
6
|
+
export function generateKeyPair() {
|
|
7
|
+
const { publicKey, privateKey } = generateKeyPairSync('ed25519');
|
|
8
|
+
return {
|
|
9
|
+
publicKey: publicKey.export({ type: 'spki', format: 'der' }).toString('hex'),
|
|
10
|
+
privateKey: privateKey.export({ type: 'pkcs8', format: 'der' }).toString('hex'),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Signs a message with the private key
|
|
15
|
+
* @param message - The message to sign (string or Buffer)
|
|
16
|
+
* @param privateKeyHex - The private key in hex format
|
|
17
|
+
* @returns Signature as hex string
|
|
18
|
+
*/
|
|
19
|
+
export function signMessage(message, privateKeyHex) {
|
|
20
|
+
const messageBuffer = typeof message === 'string' ? Buffer.from(message) : message;
|
|
21
|
+
const privateKey = Buffer.from(privateKeyHex, 'hex');
|
|
22
|
+
const signature = sign(null, messageBuffer, {
|
|
23
|
+
key: privateKey,
|
|
24
|
+
format: 'der',
|
|
25
|
+
type: 'pkcs8',
|
|
26
|
+
});
|
|
27
|
+
return signature.toString('hex');
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Verifies a signature with the public key
|
|
31
|
+
* @param message - The original message (string or Buffer)
|
|
32
|
+
* @param signatureHex - The signature in hex format
|
|
33
|
+
* @param publicKeyHex - The public key in hex format
|
|
34
|
+
* @returns true if signature is valid, false otherwise
|
|
35
|
+
*/
|
|
36
|
+
export function verifySignature(message, signatureHex, publicKeyHex) {
|
|
37
|
+
const messageBuffer = typeof message === 'string' ? Buffer.from(message) : message;
|
|
38
|
+
const signature = Buffer.from(signatureHex, 'hex');
|
|
39
|
+
const publicKey = Buffer.from(publicKeyHex, 'hex');
|
|
40
|
+
try {
|
|
41
|
+
return verify(null, messageBuffer, {
|
|
42
|
+
key: publicKey,
|
|
43
|
+
format: 'der',
|
|
44
|
+
type: 'spki',
|
|
45
|
+
}, signature);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Exports a key pair to a JSON-serializable format
|
|
53
|
+
* @param keyPair - The key pair to export
|
|
54
|
+
* @returns KeyPair object with hex-encoded keys
|
|
55
|
+
*/
|
|
56
|
+
export function exportKeyPair(keyPair) {
|
|
57
|
+
return {
|
|
58
|
+
publicKey: keyPair.publicKey,
|
|
59
|
+
privateKey: keyPair.privateKey,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Imports a key pair from hex strings
|
|
64
|
+
* @param publicKeyHex - The public key in hex format
|
|
65
|
+
* @param privateKeyHex - The private key in hex format
|
|
66
|
+
* @returns KeyPair object
|
|
67
|
+
* @throws Error if keys are not valid hex strings
|
|
68
|
+
*/
|
|
69
|
+
export function importKeyPair(publicKeyHex, privateKeyHex) {
|
|
70
|
+
// Validate that keys are valid hex strings
|
|
71
|
+
const hexPattern = /^[0-9a-f]+$/i;
|
|
72
|
+
if (!hexPattern.test(publicKeyHex)) {
|
|
73
|
+
throw new Error('Invalid public key: must be a hex string');
|
|
74
|
+
}
|
|
75
|
+
if (!hexPattern.test(privateKeyHex)) {
|
|
76
|
+
throw new Error('Invalid private key: must be a hex string');
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
publicKey: publicKeyHex,
|
|
80
|
+
privateKey: privateKeyHex,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=keypair.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keypair.js","sourceRoot":"","sources":["../../src/identity/keypair.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAUhE;;;GAGG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAEjE,OAAO;QACL,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC5E,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;KAChF,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,OAAwB,EAAE,aAAqB;IACzE,MAAM,aAAa,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IACnF,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IAErD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE;QAC1C,GAAG,EAAE,UAAU;QACf,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,OAAO;KACd,CAAC,CAAC;IAEH,OAAO,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAwB,EACxB,YAAoB,EACpB,YAAoB;IAEpB,MAAM,aAAa,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IACnF,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IAEnD,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE;YACjC,GAAG,EAAE,SAAS;YACd,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,MAAM;SACb,EAAE,SAAS,CAAC,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,OAAO;QACL,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,UAAU,EAAE,OAAO,CAAC,UAAU;KAC/B,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,YAAoB,EAAE,aAAqB;IACvE,2CAA2C;IAC3C,MAAM,UAAU,GAAG,cAAc,CAAC;IAClC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO;QACL,SAAS,EAAE,YAAY;QACvB,UAAU,EAAE,aAAa;KAC1B,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export * from './identity/keypair.js';
|
|
2
|
+
export * from './message/envelope.js';
|
|
3
|
+
export * from './registry/capability.js';
|
|
4
|
+
export * from './registry/peer.js';
|
|
5
|
+
export * from './registry/peer-store.js';
|
|
6
|
+
export * from './registry/messages.js';
|
|
7
|
+
export * from './transport/http.js';
|
|
8
|
+
export * from './transport/peer-config.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export * from './identity/keypair.js';
|
|
2
|
+
export * from './message/envelope.js';
|
|
3
|
+
export * from './registry/capability.js';
|
|
4
|
+
export * from './registry/peer.js';
|
|
5
|
+
export * from './registry/peer-store.js';
|
|
6
|
+
export * from './registry/messages.js';
|
|
7
|
+
export * from './transport/http.js';
|
|
8
|
+
export * from './transport/peer-config.js';
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC"}
|