@garydevenay/emporion 0.0.1
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 +173 -0
- package/dist/src/cli.d.ts +7 -0
- package/dist/src/cli.js +2101 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/config.d.ts +2 -0
- package/dist/src/config.js +41 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/demo.d.ts +1 -0
- package/dist/src/demo.js +140 -0
- package/dist/src/demo.js.map +1 -0
- package/dist/src/did.d.ts +13 -0
- package/dist/src/did.js +155 -0
- package/dist/src/did.js.map +1 -0
- package/dist/src/errors.d.ts +23 -0
- package/dist/src/errors.js +25 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/handshake.d.ts +9 -0
- package/dist/src/handshake.js +131 -0
- package/dist/src/handshake.js.map +1 -0
- package/dist/src/identity.d.ts +17 -0
- package/dist/src/identity.js +105 -0
- package/dist/src/identity.js.map +1 -0
- package/dist/src/index.d.ts +5 -0
- package/dist/src/index.js +5 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/logger.d.ts +11 -0
- package/dist/src/logger.js +41 -0
- package/dist/src/logger.js.map +1 -0
- package/dist/src/persistent-agent.d.ts +2 -0
- package/dist/src/persistent-agent.js +24 -0
- package/dist/src/persistent-agent.js.map +1 -0
- package/dist/src/protocol/company.d.ts +36 -0
- package/dist/src/protocol/company.js +211 -0
- package/dist/src/protocol/company.js.map +1 -0
- package/dist/src/protocol/contracts.d.ts +119 -0
- package/dist/src/protocol/contracts.js +404 -0
- package/dist/src/protocol/contracts.js.map +1 -0
- package/dist/src/protocol/credential-reference.d.ts +71 -0
- package/dist/src/protocol/credential-reference.js +136 -0
- package/dist/src/protocol/credential-reference.js.map +1 -0
- package/dist/src/protocol/dissemination.d.ts +47 -0
- package/dist/src/protocol/dissemination.js +111 -0
- package/dist/src/protocol/dissemination.js.map +1 -0
- package/dist/src/protocol/envelope.d.ts +71 -0
- package/dist/src/protocol/envelope.js +203 -0
- package/dist/src/protocol/envelope.js.map +1 -0
- package/dist/src/protocol/identity.d.ts +18 -0
- package/dist/src/protocol/identity.js +143 -0
- package/dist/src/protocol/identity.js.map +1 -0
- package/dist/src/protocol/index.d.ts +22 -0
- package/dist/src/protocol/index.js +12 -0
- package/dist/src/protocol/index.js.map +1 -0
- package/dist/src/protocol/market.d.ts +96 -0
- package/dist/src/protocol/market.js +293 -0
- package/dist/src/protocol/market.js.map +1 -0
- package/dist/src/protocol/messaging.d.ts +87 -0
- package/dist/src/protocol/messaging.js +296 -0
- package/dist/src/protocol/messaging.js.map +1 -0
- package/dist/src/protocol/repository.d.ts +87 -0
- package/dist/src/protocol/repository.js +651 -0
- package/dist/src/protocol/repository.js.map +1 -0
- package/dist/src/protocol/resolution.d.ts +86 -0
- package/dist/src/protocol/resolution.js +305 -0
- package/dist/src/protocol/resolution.js.map +1 -0
- package/dist/src/protocol/shared.d.ts +14 -0
- package/dist/src/protocol/shared.js +45 -0
- package/dist/src/protocol/shared.js.map +1 -0
- package/dist/src/protocol/versioning.d.ts +21 -0
- package/dist/src/protocol/versioning.js +69 -0
- package/dist/src/protocol/versioning.js.map +1 -0
- package/dist/src/storage.d.ts +36 -0
- package/dist/src/storage.js +156 -0
- package/dist/src/storage.js.map +1 -0
- package/dist/src/topics.d.ts +3 -0
- package/dist/src/topics.js +27 -0
- package/dist/src/topics.js.map +1 -0
- package/dist/src/transport.d.ts +114 -0
- package/dist/src/transport.js +291 -0
- package/dist/src/transport.js.map +1 -0
- package/dist/src/types.d.ts +95 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/test/cli.test.d.ts +1 -0
- package/dist/test/cli.test.js +122 -0
- package/dist/test/cli.test.js.map +1 -0
- package/dist/test/economy.test.d.ts +1 -0
- package/dist/test/economy.test.js +661 -0
- package/dist/test/economy.test.js.map +1 -0
- package/dist/test/helpers.d.ts +12 -0
- package/dist/test/helpers.js +57 -0
- package/dist/test/helpers.js.map +1 -0
- package/dist/test/integration.test.d.ts +1 -0
- package/dist/test/integration.test.js +287 -0
- package/dist/test/integration.test.js.map +1 -0
- package/dist/test/protocol.test.d.ts +1 -0
- package/dist/test/protocol.test.js +448 -0
- package/dist/test/protocol.test.js.map +1 -0
- package/dist/test/unit.test.d.ts +1 -0
- package/dist/test/unit.test.js +87 -0
- package/dist/test/unit.test.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
import { mkdir } from "node:fs/promises";
|
|
2
|
+
import DHT from "hyperdht";
|
|
3
|
+
import Hyperswarm from "hyperswarm";
|
|
4
|
+
import { normalizeTransportConfig } from "./config.js";
|
|
5
|
+
import { extractEmporionTransportService, resolveDidDocument } from "./did.js";
|
|
6
|
+
import { ConnectionRejectedError } from "./errors.js";
|
|
7
|
+
import { performPeerHandshake } from "./handshake.js";
|
|
8
|
+
import { loadIdentityMaterial, persistAgentIdentity } from "./identity.js";
|
|
9
|
+
import { createLogger } from "./logger.js";
|
|
10
|
+
import { getSupportedProtocolDescriptors } from "./protocol/versioning.js";
|
|
11
|
+
import { TransportStorage } from "./storage.js";
|
|
12
|
+
import { topicRefToCanonicalString, topicRefToDiscoveryKey } from "./topics.js";
|
|
13
|
+
function waitForSocketOpen(socket, timeoutMs) {
|
|
14
|
+
if (socket.remotePublicKey) {
|
|
15
|
+
return Promise.resolve();
|
|
16
|
+
}
|
|
17
|
+
return new Promise((resolve, reject) => {
|
|
18
|
+
const timer = setTimeout(() => {
|
|
19
|
+
cleanup();
|
|
20
|
+
reject(new ConnectionRejectedError(`Timed out waiting for socket open after ${timeoutMs}ms`));
|
|
21
|
+
}, timeoutMs);
|
|
22
|
+
function cleanup() {
|
|
23
|
+
clearTimeout(timer);
|
|
24
|
+
socket.off("open", onOpen);
|
|
25
|
+
socket.off("error", onError);
|
|
26
|
+
socket.off("close", onClose);
|
|
27
|
+
}
|
|
28
|
+
function onOpen() {
|
|
29
|
+
cleanup();
|
|
30
|
+
resolve();
|
|
31
|
+
}
|
|
32
|
+
function onError(error) {
|
|
33
|
+
cleanup();
|
|
34
|
+
reject(new ConnectionRejectedError("Socket failed before opening", { cause: error }));
|
|
35
|
+
}
|
|
36
|
+
function onClose() {
|
|
37
|
+
cleanup();
|
|
38
|
+
reject(new ConnectionRejectedError("Socket closed before opening"));
|
|
39
|
+
}
|
|
40
|
+
socket.once("open", onOpen);
|
|
41
|
+
socket.once("error", onError);
|
|
42
|
+
socket.once("close", onClose);
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
function normalizeJoinOptions(options) {
|
|
46
|
+
return {
|
|
47
|
+
server: options?.server ?? true,
|
|
48
|
+
client: options?.client ?? true
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
export class AgentTransport {
|
|
52
|
+
static async create(config) {
|
|
53
|
+
const normalizedConfig = normalizeTransportConfig(config);
|
|
54
|
+
await mkdir(normalizedConfig.dataDir, { recursive: true });
|
|
55
|
+
const logger = createLogger(normalizedConfig.logLevel);
|
|
56
|
+
const provisionalIdentity = await loadIdentityMaterial(normalizedConfig.dataDir, "0".repeat(64));
|
|
57
|
+
const storage = await TransportStorage.create(normalizedConfig.dataDir, provisionalIdentity.storagePrimaryKey, logger);
|
|
58
|
+
const defaults = await storage.initializeDefaults();
|
|
59
|
+
const identityMaterial = await loadIdentityMaterial(normalizedConfig.dataDir, defaults.controlDescriptor.key);
|
|
60
|
+
await persistAgentIdentity(normalizedConfig.dataDir, identityMaterial.agentIdentity);
|
|
61
|
+
const dht = new DHT({
|
|
62
|
+
bootstrap: normalizedConfig.bootstrap,
|
|
63
|
+
keyPair: identityMaterial.transportKeyPair
|
|
64
|
+
});
|
|
65
|
+
const swarm = new Hyperswarm({
|
|
66
|
+
dht,
|
|
67
|
+
keyPair: identityMaterial.transportKeyPair,
|
|
68
|
+
maxPeers: normalizedConfig.maxPeers
|
|
69
|
+
});
|
|
70
|
+
return new AgentTransport(normalizedConfig, logger, storage, identityMaterial, dht, swarm);
|
|
71
|
+
}
|
|
72
|
+
identity;
|
|
73
|
+
logger;
|
|
74
|
+
storage;
|
|
75
|
+
identityMaterial;
|
|
76
|
+
dht;
|
|
77
|
+
swarm;
|
|
78
|
+
config;
|
|
79
|
+
joinedTopics = new Map();
|
|
80
|
+
activeSockets = new Set();
|
|
81
|
+
activePeerSessions = new Map();
|
|
82
|
+
started = false;
|
|
83
|
+
stopping = false;
|
|
84
|
+
destroyed = false;
|
|
85
|
+
constructor(config, logger, storage, identityMaterial, dht, swarm) {
|
|
86
|
+
this.config = config;
|
|
87
|
+
this.logger = logger;
|
|
88
|
+
this.storage = storage;
|
|
89
|
+
this.identityMaterial = identityMaterial;
|
|
90
|
+
this.identity = identityMaterial.agentIdentity;
|
|
91
|
+
this.dht = dht;
|
|
92
|
+
this.swarm = swarm;
|
|
93
|
+
}
|
|
94
|
+
async start() {
|
|
95
|
+
if (this.started) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
if (this.destroyed) {
|
|
99
|
+
throw new ConnectionRejectedError("Agent transport cannot be restarted after stop()");
|
|
100
|
+
}
|
|
101
|
+
this.swarm.on("connection", (socket, info) => {
|
|
102
|
+
void this.handleSocket(socket, {
|
|
103
|
+
source: info.topics && info.topics.length > 0 ? "hyperswarm-topic" : "hyperswarm-direct"
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
this.swarm.on("update", () => {
|
|
107
|
+
this.logger.debug("Swarm state updated", {
|
|
108
|
+
connecting: this.swarm.connecting,
|
|
109
|
+
connected: this.swarm.connections.size
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
this.swarm.on("ban", (_peerInfo, error) => {
|
|
113
|
+
this.logger.warn("Peer was banned by the swarm", { error: error.message });
|
|
114
|
+
});
|
|
115
|
+
await this.swarm.listen();
|
|
116
|
+
this.started = true;
|
|
117
|
+
this.logger.info("Agent transport started", {
|
|
118
|
+
did: this.identity.did,
|
|
119
|
+
noisePublicKey: this.identity.noisePublicKey,
|
|
120
|
+
controlFeedKey: this.identity.controlFeedKey,
|
|
121
|
+
dataDir: this.config.dataDir
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
async stop() {
|
|
125
|
+
if (!this.started || this.stopping) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
this.stopping = true;
|
|
129
|
+
this.logger.info("Stopping agent transport");
|
|
130
|
+
for (const [key, state] of this.joinedTopics) {
|
|
131
|
+
await state.discovery.destroy();
|
|
132
|
+
this.joinedTopics.delete(key);
|
|
133
|
+
}
|
|
134
|
+
for (const socket of this.activeSockets) {
|
|
135
|
+
socket.destroy();
|
|
136
|
+
}
|
|
137
|
+
await this.swarm.destroy();
|
|
138
|
+
await this.storage.close();
|
|
139
|
+
this.started = false;
|
|
140
|
+
this.stopping = false;
|
|
141
|
+
this.destroyed = true;
|
|
142
|
+
this.logger.info("Agent transport stopped");
|
|
143
|
+
}
|
|
144
|
+
async suspend() {
|
|
145
|
+
await this.swarm.suspend();
|
|
146
|
+
this.logger.info("Agent transport suspended");
|
|
147
|
+
}
|
|
148
|
+
async resume() {
|
|
149
|
+
await this.swarm.resume();
|
|
150
|
+
this.logger.info("Agent transport resumed");
|
|
151
|
+
}
|
|
152
|
+
async joinTopic(ref, options) {
|
|
153
|
+
this.ensureStarted();
|
|
154
|
+
const key = topicRefToCanonicalString(ref);
|
|
155
|
+
if (this.joinedTopics.has(key)) {
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
const mode = normalizeJoinOptions(options);
|
|
159
|
+
const discovery = this.swarm.join(topicRefToDiscoveryKey(ref), mode);
|
|
160
|
+
if (mode.server) {
|
|
161
|
+
await discovery.flushed();
|
|
162
|
+
}
|
|
163
|
+
if (mode.client) {
|
|
164
|
+
await this.swarm.flush();
|
|
165
|
+
}
|
|
166
|
+
this.joinedTopics.set(key, { ref, discovery });
|
|
167
|
+
this.logger.info("Joined topic", { topic: key, ...mode });
|
|
168
|
+
}
|
|
169
|
+
async leaveTopic(ref) {
|
|
170
|
+
this.ensureStarted();
|
|
171
|
+
const key = topicRefToCanonicalString(ref);
|
|
172
|
+
const state = this.joinedTopics.get(key);
|
|
173
|
+
if (!state) {
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
await state.discovery.destroy();
|
|
177
|
+
this.joinedTopics.delete(key);
|
|
178
|
+
this.logger.info("Left topic", { topic: key });
|
|
179
|
+
}
|
|
180
|
+
async connectToDid(did) {
|
|
181
|
+
this.ensureStarted();
|
|
182
|
+
const resolved = await resolveDidDocument(did);
|
|
183
|
+
const endpoint = extractEmporionTransportService(resolved.didDocument);
|
|
184
|
+
await this.connectToNoiseKey(endpoint.noisePublicKey);
|
|
185
|
+
}
|
|
186
|
+
async connectToNoiseKey(publicKeyHex) {
|
|
187
|
+
this.ensureStarted();
|
|
188
|
+
const socket = this.dht.connect(Buffer.from(publicKeyHex, "hex"), {
|
|
189
|
+
keyPair: this.identityMaterial.transportKeyPair
|
|
190
|
+
});
|
|
191
|
+
await waitForSocketOpen(socket, this.config.handshakeTimeoutMs);
|
|
192
|
+
await this.handleSocket(socket, { source: "hyperdht-direct" }, true);
|
|
193
|
+
}
|
|
194
|
+
async openFeed(name) {
|
|
195
|
+
return this.storage.openFeed(name);
|
|
196
|
+
}
|
|
197
|
+
async openIndex(name) {
|
|
198
|
+
return this.storage.openIndex(name);
|
|
199
|
+
}
|
|
200
|
+
getPeerSessions() {
|
|
201
|
+
return this.activePeerSessions;
|
|
202
|
+
}
|
|
203
|
+
getRemoteFeed(key) {
|
|
204
|
+
return this.storage.getRemoteFeed(key);
|
|
205
|
+
}
|
|
206
|
+
async handleSocket(socket, metadata, propagateFailure = false) {
|
|
207
|
+
this.activeSockets.add(socket);
|
|
208
|
+
socket.once("close", () => {
|
|
209
|
+
this.activeSockets.delete(socket);
|
|
210
|
+
});
|
|
211
|
+
socket.once("error", (error) => {
|
|
212
|
+
this.logger.warn("Socket error", { source: metadata.source, error: error.message });
|
|
213
|
+
});
|
|
214
|
+
try {
|
|
215
|
+
const remoteHello = await performPeerHandshake(socket, this.buildLocalHello(), this.config.handshakeTimeoutMs);
|
|
216
|
+
const session = await this.validateRemoteHello(socket, remoteHello, metadata.source);
|
|
217
|
+
await this.storage.trackRemoteDescriptors(remoteHello.replication);
|
|
218
|
+
const replicationStream = this.storage.replicate(socket);
|
|
219
|
+
replicationStream.on("error", (error) => {
|
|
220
|
+
this.logger.warn("Replication stream error", {
|
|
221
|
+
remoteDid: remoteHello.agentDid,
|
|
222
|
+
error: error.message
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
this.activePeerSessions.set(session.remoteDid, session);
|
|
226
|
+
socket.once("close", () => {
|
|
227
|
+
this.activePeerSessions.delete(session.remoteDid);
|
|
228
|
+
this.logger.info("Peer disconnected", {
|
|
229
|
+
remoteDid: session.remoteDid,
|
|
230
|
+
remoteNoisePublicKey: session.remoteNoisePublicKey
|
|
231
|
+
});
|
|
232
|
+
});
|
|
233
|
+
this.logger.info("Peer connected", {
|
|
234
|
+
source: metadata.source,
|
|
235
|
+
remoteDid: session.remoteDid,
|
|
236
|
+
remoteNoisePublicKey: session.remoteNoisePublicKey,
|
|
237
|
+
replicationCount: session.replication.length
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
catch (error) {
|
|
241
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
242
|
+
this.logger.warn("Rejected peer connection", {
|
|
243
|
+
source: metadata.source,
|
|
244
|
+
error: message
|
|
245
|
+
});
|
|
246
|
+
socket.destroy(error instanceof Error ? error : undefined);
|
|
247
|
+
if (propagateFailure) {
|
|
248
|
+
throw error;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
buildLocalHello() {
|
|
253
|
+
return {
|
|
254
|
+
protocolVersion: 1,
|
|
255
|
+
agentDid: this.identity.did,
|
|
256
|
+
capabilities: ["emporion.transport.v1", "hypercore.replicate"],
|
|
257
|
+
supportedProtocols: getSupportedProtocolDescriptors(),
|
|
258
|
+
controlFeedKey: this.identity.controlFeedKey,
|
|
259
|
+
joinedTopics: [...this.joinedTopics.values()].map(({ ref }) => topicRefToCanonicalString(ref)).sort(),
|
|
260
|
+
replication: this.storage.getReplicationDescriptors()
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
async validateRemoteHello(socket, remoteHello, source) {
|
|
264
|
+
if (!socket.remotePublicKey) {
|
|
265
|
+
throw new ConnectionRejectedError("Remote socket does not expose a Noise public key");
|
|
266
|
+
}
|
|
267
|
+
const remoteNoisePublicKey = socket.remotePublicKey.toString("hex");
|
|
268
|
+
const resolved = await resolveDidDocument(remoteHello.agentDid);
|
|
269
|
+
const endpoint = extractEmporionTransportService(resolved.didDocument);
|
|
270
|
+
if (endpoint.noisePublicKey !== remoteNoisePublicKey) {
|
|
271
|
+
throw new ConnectionRejectedError(`Remote DID ${remoteHello.agentDid} does not match socket key ${remoteNoisePublicKey}`);
|
|
272
|
+
}
|
|
273
|
+
if (endpoint.controlFeedKey !== remoteHello.controlFeedKey) {
|
|
274
|
+
throw new ConnectionRejectedError(`Remote DID ${remoteHello.agentDid} advertised a mismatched control feed`);
|
|
275
|
+
}
|
|
276
|
+
return {
|
|
277
|
+
remoteDid: remoteHello.agentDid,
|
|
278
|
+
remoteNoisePublicKey,
|
|
279
|
+
remoteControlFeedKey: remoteHello.controlFeedKey,
|
|
280
|
+
source,
|
|
281
|
+
supportedProtocols: remoteHello.supportedProtocols,
|
|
282
|
+
replication: remoteHello.replication
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
ensureStarted() {
|
|
286
|
+
if (!this.started) {
|
|
287
|
+
throw new ConnectionRejectedError("Agent transport must be started before performing network operations");
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import type { LogLevel } from "./logger.js";
|
|
2
|
+
import type { SupportedProtocolDescriptor } from "./protocol/versioning.js";
|
|
3
|
+
export interface ReconnectBackoffConfig {
|
|
4
|
+
minMs: number;
|
|
5
|
+
maxMs: number;
|
|
6
|
+
}
|
|
7
|
+
export interface TransportConfig {
|
|
8
|
+
dataDir: string;
|
|
9
|
+
bootstrap?: string[] | undefined;
|
|
10
|
+
maxPeers?: number;
|
|
11
|
+
handshakeTimeoutMs?: number;
|
|
12
|
+
reconnectBackoff?: ReconnectBackoffConfig;
|
|
13
|
+
logLevel?: LogLevel;
|
|
14
|
+
}
|
|
15
|
+
export interface NormalizedTransportConfig {
|
|
16
|
+
dataDir: string;
|
|
17
|
+
bootstrap: string[] | undefined;
|
|
18
|
+
maxPeers: number;
|
|
19
|
+
handshakeTimeoutMs: number;
|
|
20
|
+
reconnectBackoff: ReconnectBackoffConfig;
|
|
21
|
+
logLevel: LogLevel;
|
|
22
|
+
}
|
|
23
|
+
export type TopicKind = "agent" | "company" | "marketplace";
|
|
24
|
+
export interface AgentTopicRef {
|
|
25
|
+
kind: "agent";
|
|
26
|
+
agentDid: string;
|
|
27
|
+
}
|
|
28
|
+
export interface CompanyTopicRef {
|
|
29
|
+
kind: "company";
|
|
30
|
+
companyId: string;
|
|
31
|
+
}
|
|
32
|
+
export interface MarketplaceTopicRef {
|
|
33
|
+
kind: "marketplace";
|
|
34
|
+
marketplaceId: string;
|
|
35
|
+
}
|
|
36
|
+
export type TopicRef = AgentTopicRef | CompanyTopicRef | MarketplaceTopicRef;
|
|
37
|
+
export interface TopicJoinOptions {
|
|
38
|
+
server?: boolean;
|
|
39
|
+
client?: boolean;
|
|
40
|
+
}
|
|
41
|
+
export interface TopicJoinState {
|
|
42
|
+
ref: TopicRef;
|
|
43
|
+
key: string;
|
|
44
|
+
server: boolean;
|
|
45
|
+
client: boolean;
|
|
46
|
+
}
|
|
47
|
+
export interface ReplicationDescriptor {
|
|
48
|
+
name: string;
|
|
49
|
+
key: string;
|
|
50
|
+
kind: "feed" | "index";
|
|
51
|
+
}
|
|
52
|
+
export interface PeerHello {
|
|
53
|
+
protocolVersion: 1;
|
|
54
|
+
agentDid: string;
|
|
55
|
+
capabilities: string[];
|
|
56
|
+
supportedProtocols: SupportedProtocolDescriptor[];
|
|
57
|
+
controlFeedKey: string;
|
|
58
|
+
joinedTopics: string[];
|
|
59
|
+
replication: ReplicationDescriptor[];
|
|
60
|
+
}
|
|
61
|
+
export interface AgentIdentity {
|
|
62
|
+
did: string;
|
|
63
|
+
didDocument: DidDocumentLike;
|
|
64
|
+
noisePublicKey: string;
|
|
65
|
+
keyAgreementPublicKey: string;
|
|
66
|
+
controlFeedKey: string;
|
|
67
|
+
}
|
|
68
|
+
export interface DidVerificationMethodLike {
|
|
69
|
+
id: string;
|
|
70
|
+
type: string;
|
|
71
|
+
controller: string;
|
|
72
|
+
publicKeyMultibase?: string;
|
|
73
|
+
}
|
|
74
|
+
export interface DidServiceLike {
|
|
75
|
+
id: string;
|
|
76
|
+
type: string;
|
|
77
|
+
serviceEndpoint: unknown;
|
|
78
|
+
}
|
|
79
|
+
export interface DidDocumentLike {
|
|
80
|
+
id: string;
|
|
81
|
+
verificationMethod?: DidVerificationMethodLike[];
|
|
82
|
+
authentication?: Array<string | DidVerificationMethodLike>;
|
|
83
|
+
assertionMethod?: Array<string | DidVerificationMethodLike>;
|
|
84
|
+
keyAgreement?: Array<string | DidVerificationMethodLike>;
|
|
85
|
+
service?: DidServiceLike[];
|
|
86
|
+
}
|
|
87
|
+
export interface TransportServiceEndpoint {
|
|
88
|
+
protocolVersion: 1;
|
|
89
|
+
noisePublicKey: string;
|
|
90
|
+
controlFeedKey: string;
|
|
91
|
+
}
|
|
92
|
+
export interface ResolvedDidDocument {
|
|
93
|
+
did: string;
|
|
94
|
+
didDocument: DidDocumentLike;
|
|
95
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import test from "node:test";
|
|
3
|
+
import { runCli } from "../src/cli.js";
|
|
4
|
+
import { createBootstrapNode, createTempDir, removeTempDir } from "./helpers.js";
|
|
5
|
+
function createCaptureIo() {
|
|
6
|
+
const stdout = [];
|
|
7
|
+
const stderr = [];
|
|
8
|
+
return {
|
|
9
|
+
stdout,
|
|
10
|
+
stderr,
|
|
11
|
+
io: {
|
|
12
|
+
stdout(message) {
|
|
13
|
+
stdout.push(message);
|
|
14
|
+
},
|
|
15
|
+
stderr(message) {
|
|
16
|
+
stderr.push(message);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
test("CLI can initialize an agent profile and show it", async () => {
|
|
22
|
+
const dataDir = await createTempDir("emporion-cli-agent-");
|
|
23
|
+
try {
|
|
24
|
+
const initCapture = createCaptureIo();
|
|
25
|
+
const initExitCode = await runCli(["agent", "init", "--data-dir", dataDir, "--display-name", "Agent A", "--bio", "Builds the market"], initCapture.io);
|
|
26
|
+
assert.equal(initExitCode, 0);
|
|
27
|
+
const initPayload = JSON.parse(initCapture.stdout.join(""));
|
|
28
|
+
assert.equal(initPayload.identity.did.startsWith("did:peer:"), true);
|
|
29
|
+
assert.equal(initPayload.profile.displayName, "Agent A");
|
|
30
|
+
const showCapture = createCaptureIo();
|
|
31
|
+
const showExitCode = await runCli(["agent", "show", "--data-dir", dataDir], showCapture.io);
|
|
32
|
+
assert.equal(showExitCode, 0);
|
|
33
|
+
const showPayload = JSON.parse(showCapture.stdout.join(""));
|
|
34
|
+
assert.equal(showPayload.profile.bio, "Builds the market");
|
|
35
|
+
assert.equal(showPayload.identity.did, initPayload.identity.did);
|
|
36
|
+
}
|
|
37
|
+
finally {
|
|
38
|
+
await removeTempDir(dataDir);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
test("CLI can create company and market objects, then list marketplace entries", async () => {
|
|
42
|
+
const dataDir = await createTempDir("emporion-cli-market-");
|
|
43
|
+
try {
|
|
44
|
+
const companyCapture = createCaptureIo();
|
|
45
|
+
assert.equal(await runCli(["company", "create", "--data-dir", dataDir, "--name", "Emporion Labs"], companyCapture.io), 0);
|
|
46
|
+
const companyPayload = JSON.parse(companyCapture.stdout.join(""));
|
|
47
|
+
const companyDid = companyPayload.companyDid;
|
|
48
|
+
const joinCapture = createCaptureIo();
|
|
49
|
+
assert.equal(await runCli(["company", "join-market", "--data-dir", dataDir, "--company-did", companyDid, "--marketplace", "coding"], joinCapture.io), 0);
|
|
50
|
+
const listingCapture = createCaptureIo();
|
|
51
|
+
assert.equal(await runCli([
|
|
52
|
+
"market",
|
|
53
|
+
"listing",
|
|
54
|
+
"publish",
|
|
55
|
+
"--data-dir",
|
|
56
|
+
dataDir,
|
|
57
|
+
"--marketplace",
|
|
58
|
+
"coding",
|
|
59
|
+
"--seller-did",
|
|
60
|
+
companyDid,
|
|
61
|
+
"--title",
|
|
62
|
+
"Protocol design review",
|
|
63
|
+
"--amount-sats",
|
|
64
|
+
"150000"
|
|
65
|
+
], listingCapture.io), 0);
|
|
66
|
+
const listingPayload = JSON.parse(listingCapture.stdout.join(""));
|
|
67
|
+
const listingId = listingPayload.objectId;
|
|
68
|
+
const agreementCapture = createCaptureIo();
|
|
69
|
+
assert.equal(await runCli([
|
|
70
|
+
"market",
|
|
71
|
+
"agreement",
|
|
72
|
+
"create",
|
|
73
|
+
"--data-dir",
|
|
74
|
+
dataDir,
|
|
75
|
+
"--source-kind",
|
|
76
|
+
"listing",
|
|
77
|
+
"--source-id",
|
|
78
|
+
listingId,
|
|
79
|
+
"--deliverable",
|
|
80
|
+
"Review the architecture"
|
|
81
|
+
], agreementCapture.io), 0);
|
|
82
|
+
const agreementPayload = JSON.parse(agreementCapture.stdout.join(""));
|
|
83
|
+
assert.equal(agreementPayload.state.status, "active");
|
|
84
|
+
const listCapture = createCaptureIo();
|
|
85
|
+
assert.equal(await runCli(["market", "list", "--data-dir", dataDir, "--marketplace", "coding"], listCapture.io), 0);
|
|
86
|
+
const listPayload = JSON.parse(listCapture.stdout.join(""));
|
|
87
|
+
assert.equal(Array.isArray(listPayload.entries), true);
|
|
88
|
+
assert.equal(listPayload.entries.length, 2);
|
|
89
|
+
}
|
|
90
|
+
finally {
|
|
91
|
+
await removeTempDir(dataDir);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
test("CLI serve starts and stops cleanly against a custom bootstrap node", async () => {
|
|
95
|
+
const dataDir = await createTempDir("emporion-cli-serve-");
|
|
96
|
+
const bootstrapNode = await createBootstrapNode();
|
|
97
|
+
try {
|
|
98
|
+
const capture = createCaptureIo();
|
|
99
|
+
const exitCode = await runCli([
|
|
100
|
+
"serve",
|
|
101
|
+
"--data-dir",
|
|
102
|
+
dataDir,
|
|
103
|
+
"--bootstrap",
|
|
104
|
+
bootstrapNode.bootstrap[0],
|
|
105
|
+
"--marketplace",
|
|
106
|
+
"coding",
|
|
107
|
+
"--agent-topic",
|
|
108
|
+
"--log-level",
|
|
109
|
+
"error",
|
|
110
|
+
"--exit-after-ms",
|
|
111
|
+
"250"
|
|
112
|
+
], capture.io);
|
|
113
|
+
assert.equal(exitCode, 0);
|
|
114
|
+
const payload = JSON.parse(capture.stdout.join(""));
|
|
115
|
+
assert.equal(payload.identity.did.startsWith("did:peer:"), true);
|
|
116
|
+
assert.equal(payload.topics.length, 2);
|
|
117
|
+
}
|
|
118
|
+
finally {
|
|
119
|
+
await Promise.allSettled([bootstrapNode.destroy(), removeTempDir(dataDir)]);
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
//# sourceMappingURL=cli.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.test.js","sourceRoot":"","sources":["../../test/cli.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|