@garydevenay/emporion 0.0.1 → 0.0.3

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.
Files changed (57) hide show
  1. package/README.md +230 -10
  2. package/dist/src/cli.js +1626 -300
  3. package/dist/src/cli.js.map +1 -1
  4. package/dist/src/context-store.d.ts +22 -0
  5. package/dist/src/context-store.js +133 -0
  6. package/dist/src/context-store.js.map +1 -0
  7. package/dist/src/daemon.d.ts +76 -0
  8. package/dist/src/daemon.js +341 -0
  9. package/dist/src/daemon.js.map +1 -0
  10. package/dist/src/errors.d.ts +8 -0
  11. package/dist/src/errors.js +8 -0
  12. package/dist/src/errors.js.map +1 -1
  13. package/dist/src/experience/deals-store.d.ts +37 -0
  14. package/dist/src/experience/deals-store.js +96 -0
  15. package/dist/src/experience/deals-store.js.map +1 -0
  16. package/dist/src/handshake.js +69 -45
  17. package/dist/src/handshake.js.map +1 -1
  18. package/dist/src/index.d.ts +6 -0
  19. package/dist/src/index.js +5 -0
  20. package/dist/src/index.js.map +1 -1
  21. package/dist/src/transport.d.ts +6 -1
  22. package/dist/src/transport.js +17 -1
  23. package/dist/src/transport.js.map +1 -1
  24. package/dist/src/wallet/config-store.d.ts +16 -0
  25. package/dist/src/wallet/config-store.js +180 -0
  26. package/dist/src/wallet/config-store.js.map +1 -0
  27. package/dist/src/wallet/index.d.ts +3 -0
  28. package/dist/src/wallet/index.js +4 -0
  29. package/dist/src/wallet/index.js.map +1 -0
  30. package/dist/src/wallet/ledger.d.ts +50 -0
  31. package/dist/src/wallet/ledger.js +340 -0
  32. package/dist/src/wallet/ledger.js.map +1 -0
  33. package/dist/src/wallet/nostr-nwc-adapter.d.ts +40 -0
  34. package/dist/src/wallet/nostr-nwc-adapter.js +506 -0
  35. package/dist/src/wallet/nostr-nwc-adapter.js.map +1 -0
  36. package/dist/src/wallet/nwc-adapter.d.ts +20 -0
  37. package/dist/src/wallet/nwc-adapter.js +233 -0
  38. package/dist/src/wallet/nwc-adapter.js.map +1 -0
  39. package/dist/src/wallet/service.d.ts +42 -0
  40. package/dist/src/wallet/service.js +390 -0
  41. package/dist/src/wallet/service.js.map +1 -0
  42. package/dist/src/wallet/types.d.ts +140 -0
  43. package/dist/src/wallet/types.js +2 -0
  44. package/dist/src/wallet/types.js.map +1 -0
  45. package/dist/test/cli.test.js +76 -15
  46. package/dist/test/cli.test.js.map +1 -1
  47. package/dist/test/experience.test.d.ts +1 -0
  48. package/dist/test/experience.test.js +232 -0
  49. package/dist/test/experience.test.js.map +1 -0
  50. package/dist/test/integration.test.js +37 -31
  51. package/dist/test/integration.test.js.map +1 -1
  52. package/dist/test/unit.test.js +26 -0
  53. package/dist/test/unit.test.js.map +1 -1
  54. package/dist/test/wallet.test.d.ts +1 -0
  55. package/dist/test/wallet.test.js +853 -0
  56. package/dist/test/wallet.test.js.map +1 -0
  57. package/package.json +2 -1
@@ -0,0 +1,133 @@
1
+ import os from "node:os";
2
+ import path from "node:path";
3
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
4
+ export const EMPORION_CONTEXTS_FILE_ENV = "EMPORION_CONTEXTS_FILE";
5
+ function normalizeContextName(name) {
6
+ const trimmed = name.trim();
7
+ if (!/^[A-Za-z0-9._-]+$/.test(trimmed)) {
8
+ throw new Error("Context name must match [A-Za-z0-9._-]+");
9
+ }
10
+ return trimmed;
11
+ }
12
+ function defaultContextStorePath() {
13
+ const override = process.env[EMPORION_CONTEXTS_FILE_ENV];
14
+ if (override && override.trim().length > 0) {
15
+ return path.resolve(override.trim());
16
+ }
17
+ return path.join(os.homedir(), ".emporion", "contexts.v1.json");
18
+ }
19
+ function normalizeDataDir(dataDir) {
20
+ const trimmed = dataDir.trim();
21
+ if (trimmed.length === 0) {
22
+ throw new Error("Context data-dir must not be blank");
23
+ }
24
+ return path.resolve(trimmed);
25
+ }
26
+ function parseContextFile(raw) {
27
+ const value = typeof raw === "object" && raw !== null ? raw : {};
28
+ const contextsValue = typeof value.contexts === "object" && value.contexts !== null ? value.contexts : {};
29
+ const contexts = {};
30
+ for (const [name, entry] of Object.entries(contextsValue)) {
31
+ const contextName = normalizeContextName(name);
32
+ const record = typeof entry === "object" && entry !== null ? entry : {};
33
+ const dataDir = normalizeDataDir(typeof record.dataDir === "string" ? record.dataDir : "");
34
+ contexts[contextName] = { dataDir };
35
+ }
36
+ const activeContext = value.activeContext === null
37
+ ? null
38
+ : typeof value.activeContext === "string" && value.activeContext.trim().length > 0
39
+ ? normalizeContextName(value.activeContext)
40
+ : null;
41
+ if (activeContext && !contexts[activeContext]) {
42
+ return { activeContext: null, contexts };
43
+ }
44
+ return { activeContext, contexts };
45
+ }
46
+ function toSnapshot(file) {
47
+ return {
48
+ activeContext: file.activeContext,
49
+ contexts: Object.entries(file.contexts)
50
+ .sort(([left], [right]) => left.localeCompare(right))
51
+ .map(([name, entry]) => ({ name, dataDir: entry.dataDir }))
52
+ };
53
+ }
54
+ export class ContextStore {
55
+ filePath;
56
+ loaded = false;
57
+ data = {
58
+ activeContext: null,
59
+ contexts: {}
60
+ };
61
+ constructor(filePath = defaultContextStorePath()) {
62
+ this.filePath = path.resolve(filePath);
63
+ }
64
+ async snapshot() {
65
+ await this.ensureLoaded();
66
+ return toSnapshot(this.data);
67
+ }
68
+ async resolveDataDir(contextName) {
69
+ await this.ensureLoaded();
70
+ if (contextName && contextName.trim().length > 0) {
71
+ const normalized = normalizeContextName(contextName);
72
+ return this.data.contexts[normalized]?.dataDir;
73
+ }
74
+ const active = this.data.activeContext;
75
+ return active ? this.data.contexts[active]?.dataDir : undefined;
76
+ }
77
+ async add(name, dataDir, makeActive) {
78
+ await this.ensureLoaded();
79
+ const normalizedName = normalizeContextName(name);
80
+ this.data.contexts[normalizedName] = {
81
+ dataDir: normalizeDataDir(dataDir)
82
+ };
83
+ if (makeActive || this.data.activeContext === null) {
84
+ this.data.activeContext = normalizedName;
85
+ }
86
+ await this.persist();
87
+ return toSnapshot(this.data);
88
+ }
89
+ async use(name) {
90
+ await this.ensureLoaded();
91
+ const normalizedName = normalizeContextName(name);
92
+ if (!this.data.contexts[normalizedName]) {
93
+ throw new Error(`Unknown context: ${normalizedName}`);
94
+ }
95
+ this.data.activeContext = normalizedName;
96
+ await this.persist();
97
+ return toSnapshot(this.data);
98
+ }
99
+ async remove(name) {
100
+ await this.ensureLoaded();
101
+ const normalizedName = normalizeContextName(name);
102
+ if (!this.data.contexts[normalizedName]) {
103
+ throw new Error(`Unknown context: ${normalizedName}`);
104
+ }
105
+ delete this.data.contexts[normalizedName];
106
+ if (this.data.activeContext === normalizedName) {
107
+ this.data.activeContext = null;
108
+ }
109
+ await this.persist();
110
+ return toSnapshot(this.data);
111
+ }
112
+ async ensureLoaded() {
113
+ if (this.loaded) {
114
+ return;
115
+ }
116
+ this.loaded = true;
117
+ try {
118
+ const content = await readFile(this.filePath, "utf8");
119
+ this.data = parseContextFile(JSON.parse(content));
120
+ }
121
+ catch {
122
+ this.data = {
123
+ activeContext: null,
124
+ contexts: {}
125
+ };
126
+ }
127
+ }
128
+ async persist() {
129
+ await mkdir(path.dirname(this.filePath), { recursive: true });
130
+ await writeFile(this.filePath, `${JSON.stringify(this.data, null, 2)}\n`, "utf8");
131
+ }
132
+ }
133
+ //# sourceMappingURL=context-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-store.js","sourceRoot":"","sources":["../../src/context-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ import type { AgentIdentity, ReplicationDescriptor, TopicJoinState } from "./types.js";
2
+ import type { SupportedProtocolDescriptor } from "./protocol/versioning.js";
3
+ import type { DaemonWalletStatus } from "./wallet/types.js";
4
+ export interface LocalControlEndpoint {
5
+ kind: "unix" | "named-pipe";
6
+ path: string;
7
+ }
8
+ export interface DaemonStatus {
9
+ dataDir: string;
10
+ pid: number;
11
+ startedAt: string;
12
+ identity: AgentIdentity;
13
+ runtimeEndpoint: string;
14
+ logPath: string;
15
+ topics: TopicJoinState[];
16
+ connectedPeers: Array<{
17
+ remoteDid: string;
18
+ remoteNoisePublicKey: string;
19
+ remoteControlFeedKey: string;
20
+ source: string;
21
+ supportedProtocols: SupportedProtocolDescriptor[];
22
+ replication: ReplicationDescriptor[];
23
+ }>;
24
+ wallet: DaemonWalletStatus;
25
+ healthy: boolean;
26
+ }
27
+ export interface DaemonCommandRequest {
28
+ id: string;
29
+ commandPath: string[];
30
+ options: Record<string, string[]>;
31
+ }
32
+ export interface DaemonCommandResponse {
33
+ id: string;
34
+ ok: boolean;
35
+ result?: unknown;
36
+ error?: string;
37
+ }
38
+ export declare function getDaemonRuntimeDir(dataDir: string): string;
39
+ export declare function getDaemonPidPath(dataDir: string): string;
40
+ export declare function getDaemonLogPath(dataDir: string): string;
41
+ export declare function getLocalControlEndpoint(dataDir: string): LocalControlEndpoint;
42
+ export declare function ensureDaemonRuntimeDir(dataDir: string): Promise<string>;
43
+ export declare function readDaemonPid(dataDir: string): Promise<number | null>;
44
+ export declare function writeDaemonPid(dataDir: string, pid: number): Promise<void>;
45
+ export declare function isProcessAlive(pid: number): boolean;
46
+ export declare function cleanupStaleDaemonArtifacts(dataDir: string): Promise<void>;
47
+ export declare function sendDaemonCommand(dataDir: string, request: Omit<DaemonCommandRequest, "id">, timeoutMs?: number): Promise<DaemonCommandResponse>;
48
+ export declare function probeDaemonStatus(dataDir: string, timeoutMs?: number): Promise<DaemonStatus | null>;
49
+ export declare function daemonRequestFromParsed(commandPath: string[], options: Record<string, string[]>): Omit<DaemonCommandRequest, "id">;
50
+ export declare function daemonRequestOptionsToRecord(options: Map<string, string[]>): Record<string, string[]>;
51
+ export declare function daemonOptionsRecordToMap(options: Record<string, string[]>): Map<string, string[]>;
52
+ export declare function openDaemonLogFd(dataDir: string): number;
53
+ export interface AgentDaemonOptions {
54
+ dataDir: string;
55
+ statusProvider(): DaemonStatus;
56
+ commandHandler(request: DaemonCommandRequest): Promise<unknown>;
57
+ onShutdown(): Promise<void>;
58
+ }
59
+ export declare class AgentDaemon {
60
+ private readonly dataDir;
61
+ private readonly endpoint;
62
+ private readonly statusProvider;
63
+ private readonly commandHandler;
64
+ private readonly onShutdown;
65
+ private readonly server;
66
+ private shutdownResolve;
67
+ private readonly shutdownPromise;
68
+ private stopping;
69
+ private started;
70
+ constructor(options: AgentDaemonOptions);
71
+ start(): Promise<void>;
72
+ waitForShutdown(): Promise<void>;
73
+ stop(): Promise<void>;
74
+ private handleConnection;
75
+ private requestShutdown;
76
+ }
@@ -0,0 +1,341 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import { openSync } from "node:fs";
3
+ import { mkdir, readFile, rm, stat, writeFile } from "node:fs/promises";
4
+ import net from "node:net";
5
+ import path from "node:path";
6
+ const DEFAULT_DAEMON_TIMEOUT_MS = 5_000;
7
+ function normalizeDataDir(dataDir) {
8
+ return path.resolve(dataDir);
9
+ }
10
+ export function getDaemonRuntimeDir(dataDir) {
11
+ return path.join(normalizeDataDir(dataDir), "runtime");
12
+ }
13
+ export function getDaemonPidPath(dataDir) {
14
+ return path.join(getDaemonRuntimeDir(dataDir), "daemon.pid");
15
+ }
16
+ export function getDaemonLogPath(dataDir) {
17
+ return path.join(getDaemonRuntimeDir(dataDir), "daemon.log");
18
+ }
19
+ export function getLocalControlEndpoint(dataDir) {
20
+ const normalized = normalizeDataDir(dataDir);
21
+ if (process.platform === "win32") {
22
+ const digest = createHash("sha256").update(normalized).digest("hex").slice(0, 24);
23
+ return {
24
+ kind: "named-pipe",
25
+ path: `\\\\.\\pipe\\emporion-${digest}`
26
+ };
27
+ }
28
+ return {
29
+ kind: "unix",
30
+ path: path.join(getDaemonRuntimeDir(normalized), "daemon.sock")
31
+ };
32
+ }
33
+ export async function ensureDaemonRuntimeDir(dataDir) {
34
+ const runtimeDir = getDaemonRuntimeDir(dataDir);
35
+ await mkdir(runtimeDir, { recursive: true });
36
+ return runtimeDir;
37
+ }
38
+ export async function readDaemonPid(dataDir) {
39
+ try {
40
+ const value = await readFile(getDaemonPidPath(dataDir), "utf8");
41
+ const parsed = Number.parseInt(value.trim(), 10);
42
+ return Number.isInteger(parsed) && parsed > 0 ? parsed : null;
43
+ }
44
+ catch {
45
+ return null;
46
+ }
47
+ }
48
+ export async function writeDaemonPid(dataDir, pid) {
49
+ await ensureDaemonRuntimeDir(dataDir);
50
+ await writeFile(getDaemonPidPath(dataDir), `${pid}\n`, "utf8");
51
+ }
52
+ export function isProcessAlive(pid) {
53
+ try {
54
+ process.kill(pid, 0);
55
+ return true;
56
+ }
57
+ catch (error) {
58
+ const code = typeof error === "object" && error !== null && "code" in error ? String(error.code) : "";
59
+ return code === "EPERM";
60
+ }
61
+ }
62
+ async function removePathIfPresent(targetPath) {
63
+ await rm(targetPath, { force: true });
64
+ }
65
+ export async function cleanupStaleDaemonArtifacts(dataDir) {
66
+ const endpoint = getLocalControlEndpoint(dataDir);
67
+ await removePathIfPresent(getDaemonPidPath(dataDir));
68
+ if (endpoint.kind === "unix") {
69
+ await removePathIfPresent(endpoint.path);
70
+ }
71
+ }
72
+ function writeFrame(socket, payload) {
73
+ return new Promise((resolve, reject) => {
74
+ const body = Buffer.from(JSON.stringify(payload), "utf8");
75
+ const header = Buffer.allocUnsafe(4);
76
+ header.writeUInt32BE(body.byteLength, 0);
77
+ socket.write(Buffer.concat([header, body]), (error) => {
78
+ if (error) {
79
+ reject(error);
80
+ return;
81
+ }
82
+ resolve();
83
+ });
84
+ });
85
+ }
86
+ function readFrame(socket, timeoutMs) {
87
+ return new Promise((resolve, reject) => {
88
+ let buffer = Buffer.alloc(0);
89
+ let expectedLength = null;
90
+ const timer = setTimeout(() => {
91
+ cleanup();
92
+ reject(new Error(`Timed out waiting for daemon IPC frame after ${timeoutMs}ms`));
93
+ }, timeoutMs);
94
+ function cleanup() {
95
+ clearTimeout(timer);
96
+ socket.off("data", onData);
97
+ socket.off("error", onError);
98
+ socket.off("close", onClose);
99
+ socket.off("end", onClose);
100
+ }
101
+ function onError(error) {
102
+ cleanup();
103
+ reject(error);
104
+ }
105
+ function onClose() {
106
+ cleanup();
107
+ reject(new Error("Daemon IPC connection closed before a complete frame was received"));
108
+ }
109
+ function onData(chunk) {
110
+ buffer = Buffer.concat([buffer, chunk]);
111
+ if (expectedLength === null && buffer.byteLength >= 4) {
112
+ expectedLength = buffer.readUInt32BE(0);
113
+ buffer = buffer.subarray(4);
114
+ }
115
+ if (expectedLength === null || buffer.byteLength < expectedLength) {
116
+ return;
117
+ }
118
+ const payload = buffer.subarray(0, expectedLength);
119
+ cleanup();
120
+ try {
121
+ resolve(JSON.parse(payload.toString("utf8")));
122
+ }
123
+ catch (error) {
124
+ reject(error);
125
+ }
126
+ }
127
+ socket.on("data", onData);
128
+ socket.once("error", onError);
129
+ socket.once("close", onClose);
130
+ socket.once("end", onClose);
131
+ });
132
+ }
133
+ export async function sendDaemonCommand(dataDir, request, timeoutMs = DEFAULT_DAEMON_TIMEOUT_MS) {
134
+ const endpoint = getLocalControlEndpoint(dataDir);
135
+ const socket = net.createConnection(endpoint.path);
136
+ await new Promise((resolve, reject) => {
137
+ const timer = setTimeout(() => {
138
+ socket.destroy();
139
+ reject(new Error(`Timed out connecting to daemon endpoint ${endpoint.path}`));
140
+ }, timeoutMs);
141
+ socket.once("connect", () => {
142
+ clearTimeout(timer);
143
+ resolve();
144
+ });
145
+ socket.once("error", (error) => {
146
+ clearTimeout(timer);
147
+ reject(error);
148
+ });
149
+ });
150
+ try {
151
+ const message = {
152
+ id: randomUUID(),
153
+ ...request
154
+ };
155
+ await writeFrame(socket, message);
156
+ const response = await readFrame(socket, timeoutMs);
157
+ if (response.id !== message.id) {
158
+ throw new Error("Daemon IPC correlation ID mismatch");
159
+ }
160
+ return response;
161
+ }
162
+ finally {
163
+ socket.destroy();
164
+ }
165
+ }
166
+ export async function probeDaemonStatus(dataDir, timeoutMs = DEFAULT_DAEMON_TIMEOUT_MS) {
167
+ const endpoint = getLocalControlEndpoint(dataDir);
168
+ const pid = await readDaemonPid(dataDir);
169
+ if (pid === null) {
170
+ if (endpoint.kind === "unix") {
171
+ try {
172
+ await stat(endpoint.path);
173
+ }
174
+ catch {
175
+ return null;
176
+ }
177
+ }
178
+ else {
179
+ return null;
180
+ }
181
+ }
182
+ try {
183
+ const response = await sendDaemonCommand(dataDir, {
184
+ commandPath: ["daemon", "status"],
185
+ options: {}
186
+ }, timeoutMs);
187
+ if (!response.ok) {
188
+ throw new Error(response.error ?? "Daemon reported an unknown status failure");
189
+ }
190
+ return response.result;
191
+ }
192
+ catch (error) {
193
+ if (pid !== null && isProcessAlive(pid)) {
194
+ throw new Error(`Daemon for ${normalizeDataDir(dataDir)} is running but not responding: ${error.message}`);
195
+ }
196
+ await cleanupStaleDaemonArtifacts(dataDir);
197
+ return null;
198
+ }
199
+ }
200
+ export function daemonRequestFromParsed(commandPath, options) {
201
+ return {
202
+ commandPath,
203
+ options
204
+ };
205
+ }
206
+ export function daemonRequestOptionsToRecord(options) {
207
+ return Object.fromEntries([...options.entries()].map(([key, values]) => [key, [...values]]));
208
+ }
209
+ export function daemonOptionsRecordToMap(options) {
210
+ return new Map(Object.entries(options).map(([key, values]) => [key, [...values]]));
211
+ }
212
+ export function openDaemonLogFd(dataDir) {
213
+ const logPath = getDaemonLogPath(dataDir);
214
+ return openSync(logPath, "a");
215
+ }
216
+ export class AgentDaemon {
217
+ dataDir;
218
+ endpoint;
219
+ statusProvider;
220
+ commandHandler;
221
+ onShutdown;
222
+ server;
223
+ shutdownResolve = null;
224
+ shutdownPromise;
225
+ stopping = false;
226
+ started = false;
227
+ constructor(options) {
228
+ this.dataDir = normalizeDataDir(options.dataDir);
229
+ this.endpoint = getLocalControlEndpoint(this.dataDir);
230
+ this.statusProvider = options.statusProvider;
231
+ this.commandHandler = options.commandHandler;
232
+ this.onShutdown = options.onShutdown;
233
+ this.server = net.createServer((socket) => {
234
+ void this.handleConnection(socket);
235
+ });
236
+ this.shutdownPromise = new Promise((resolve) => {
237
+ this.shutdownResolve = resolve;
238
+ });
239
+ }
240
+ async start() {
241
+ await ensureDaemonRuntimeDir(this.dataDir);
242
+ if (this.endpoint.kind === "unix") {
243
+ await removePathIfPresent(this.endpoint.path);
244
+ }
245
+ await writeDaemonPid(this.dataDir, process.pid);
246
+ await new Promise((resolve, reject) => {
247
+ this.server.once("error", reject);
248
+ this.server.listen(this.endpoint.path, () => {
249
+ this.server.off("error", reject);
250
+ this.started = true;
251
+ resolve();
252
+ });
253
+ });
254
+ }
255
+ async waitForShutdown() {
256
+ await this.shutdownPromise;
257
+ }
258
+ async stop() {
259
+ if (this.stopping) {
260
+ return;
261
+ }
262
+ this.stopping = true;
263
+ try {
264
+ if (this.started) {
265
+ await new Promise((resolve, reject) => {
266
+ this.server.close((error) => {
267
+ if (error) {
268
+ reject(error);
269
+ return;
270
+ }
271
+ resolve();
272
+ });
273
+ });
274
+ }
275
+ await this.onShutdown();
276
+ }
277
+ finally {
278
+ this.started = false;
279
+ await cleanupStaleDaemonArtifacts(this.dataDir);
280
+ }
281
+ }
282
+ async handleConnection(socket) {
283
+ let requestId = randomUUID();
284
+ try {
285
+ const request = await readFrame(socket, DEFAULT_DAEMON_TIMEOUT_MS);
286
+ requestId = request.id;
287
+ if (!Array.isArray(request.commandPath)) {
288
+ throw new Error("Daemon commandPath must be an array");
289
+ }
290
+ if (request.commandPath.length === 2 && request.commandPath[0] === "daemon" && request.commandPath[1] === "status") {
291
+ await writeFrame(socket, {
292
+ id: request.id,
293
+ ok: true,
294
+ result: this.statusProvider()
295
+ });
296
+ socket.end();
297
+ return;
298
+ }
299
+ if (request.commandPath.length === 2 && request.commandPath[0] === "daemon" && request.commandPath[1] === "stop") {
300
+ await writeFrame(socket, {
301
+ id: request.id,
302
+ ok: true,
303
+ result: this.statusProvider()
304
+ });
305
+ socket.end(() => {
306
+ void this.requestShutdown();
307
+ });
308
+ return;
309
+ }
310
+ const result = await this.commandHandler(request);
311
+ await writeFrame(socket, {
312
+ id: request.id,
313
+ ok: true,
314
+ result
315
+ });
316
+ socket.end();
317
+ }
318
+ catch (error) {
319
+ const response = {
320
+ id: requestId,
321
+ ok: false,
322
+ error: error instanceof Error ? error.message : String(error)
323
+ };
324
+ try {
325
+ await writeFrame(socket, response);
326
+ }
327
+ catch {
328
+ // Ignore secondary write failures on broken IPC sockets.
329
+ }
330
+ socket.end();
331
+ }
332
+ }
333
+ async requestShutdown() {
334
+ if (!this.shutdownResolve) {
335
+ return;
336
+ }
337
+ this.shutdownResolve();
338
+ this.shutdownResolve = null;
339
+ }
340
+ }
341
+ //# sourceMappingURL=daemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/daemon.ts"],"names":[],"mappings":"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"}
@@ -21,3 +21,11 @@ export declare class ProtocolValidationError extends EmporionError {
21
21
  }
22
22
  export declare class ProtocolConflictError extends EmporionError {
23
23
  }
24
+ export declare class WalletAuthError extends EmporionError {
25
+ }
26
+ export declare class WalletUnavailableError extends EmporionError {
27
+ }
28
+ export declare class InvoiceCreationError extends EmporionError {
29
+ }
30
+ export declare class PaymentFailedError extends EmporionError {
31
+ }
@@ -22,4 +22,12 @@ export class ProtocolValidationError extends EmporionError {
22
22
  }
23
23
  export class ProtocolConflictError extends EmporionError {
24
24
  }
25
+ export class WalletAuthError extends EmporionError {
26
+ }
27
+ export class WalletUnavailableError extends EmporionError {
28
+ }
29
+ export class InvoiceCreationError extends EmporionError {
30
+ }
31
+ export class PaymentFailedError extends EmporionError {
32
+ }
25
33
  //# sourceMappingURL=errors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,aAAc,SAAQ,KAAK;IACtC,YAAmB,OAAe,EAAE,OAA6B;QAC/D,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,aAAa;CAAG;AAC3D,MAAM,OAAO,aAAc,SAAQ,aAAa;CAAG;AACnD,MAAM,OAAO,kBAAmB,SAAQ,aAAa;CAAG;AACxD,MAAM,OAAO,oBAAqB,SAAQ,aAAa;CAAG;AAC1D,MAAM,OAAO,cAAe,SAAQ,aAAa;CAAG;AACpD,MAAM,OAAO,uBAAwB,SAAQ,aAAa;CAAG;AAC7D,MAAM,OAAO,YAAa,SAAQ,aAAa;CAAG;AAClD,MAAM,OAAO,uBAAwB,SAAQ,aAAa;CAAG;AAC7D,MAAM,OAAO,qBAAsB,SAAQ,aAAa;CAAG"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,aAAc,SAAQ,KAAK;IACtC,YAAmB,OAAe,EAAE,OAA6B;QAC/D,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,aAAa;CAAG;AAC3D,MAAM,OAAO,aAAc,SAAQ,aAAa;CAAG;AACnD,MAAM,OAAO,kBAAmB,SAAQ,aAAa;CAAG;AACxD,MAAM,OAAO,oBAAqB,SAAQ,aAAa;CAAG;AAC1D,MAAM,OAAO,cAAe,SAAQ,aAAa;CAAG;AACpD,MAAM,OAAO,uBAAwB,SAAQ,aAAa;CAAG;AAC7D,MAAM,OAAO,YAAa,SAAQ,aAAa;CAAG;AAClD,MAAM,OAAO,uBAAwB,SAAQ,aAAa;CAAG;AAC7D,MAAM,OAAO,qBAAsB,SAAQ,aAAa;CAAG;AAC3D,MAAM,OAAO,eAAgB,SAAQ,aAAa;CAAG;AACrD,MAAM,OAAO,sBAAuB,SAAQ,aAAa;CAAG;AAC5D,MAAM,OAAO,oBAAqB,SAAQ,aAAa;CAAG;AAC1D,MAAM,OAAO,kBAAmB,SAAQ,aAAa;CAAG"}
@@ -0,0 +1,37 @@
1
+ export type DealStage = "draft" | "negotiating" | "agreed" | "in_progress" | "proof_submitted" | "proof_accepted" | "settlement_pending" | "settled" | "closed";
2
+ export interface DealRecord {
3
+ dealId: string;
4
+ stage: DealStage;
5
+ intent?: "buy" | "sell";
6
+ marketplaceId?: string;
7
+ title?: string;
8
+ amountSats?: number;
9
+ rootObjectKind?: "request" | "listing";
10
+ rootObjectId?: string;
11
+ proposalKind?: "offer" | "bid";
12
+ proposalId?: string;
13
+ agreementId?: string;
14
+ contractId?: string;
15
+ milestoneId?: string;
16
+ evidenceId?: string;
17
+ invoiceId?: string;
18
+ invoiceBolt11?: string;
19
+ paymentId?: string;
20
+ createdAt: string;
21
+ updatedAt: string;
22
+ }
23
+ export declare class DealsStore {
24
+ private readonly filePath;
25
+ private readonly deals;
26
+ private constructor();
27
+ static create(dataDir: string): Promise<DealsStore>;
28
+ list(): DealRecord[];
29
+ get(dealId: string): DealRecord | undefined;
30
+ findByRootObjectId(objectId: string): DealRecord | undefined;
31
+ findByProposalId(proposalId: string): DealRecord | undefined;
32
+ findByContractId(contractId: string): DealRecord | undefined;
33
+ save(record: DealRecord): Promise<DealRecord>;
34
+ update(dealId: string, updater: (current: DealRecord) => DealRecord): Promise<DealRecord>;
35
+ private load;
36
+ private persist;
37
+ }