@arc402/daemon 1.2.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.
Files changed (122) hide show
  1. package/bin/arc402-daemon +3 -0
  2. package/dist/abis.d.ts +20 -0
  3. package/dist/abis.d.ts.map +1 -0
  4. package/dist/abis.js +214 -0
  5. package/dist/abis.js.map +1 -0
  6. package/dist/api.d.ts +32 -0
  7. package/dist/api.d.ts.map +1 -0
  8. package/dist/api.js +430 -0
  9. package/dist/api.js.map +1 -0
  10. package/dist/auth-server.d.ts +50 -0
  11. package/dist/auth-server.d.ts.map +1 -0
  12. package/dist/auth-server.js +266 -0
  13. package/dist/auth-server.js.map +1 -0
  14. package/dist/bundler.d.ts +68 -0
  15. package/dist/bundler.d.ts.map +1 -0
  16. package/dist/bundler.js +181 -0
  17. package/dist/bundler.js.map +1 -0
  18. package/dist/capabilities.d.ts +17 -0
  19. package/dist/capabilities.d.ts.map +1 -0
  20. package/dist/capabilities.js +57 -0
  21. package/dist/capabilities.js.map +1 -0
  22. package/dist/compute-metering.d.ts +61 -0
  23. package/dist/compute-metering.d.ts.map +1 -0
  24. package/dist/compute-metering.js +299 -0
  25. package/dist/compute-metering.js.map +1 -0
  26. package/dist/compute-session.d.ts +100 -0
  27. package/dist/compute-session.d.ts.map +1 -0
  28. package/dist/compute-session.js +231 -0
  29. package/dist/compute-session.js.map +1 -0
  30. package/dist/config.d.ts +121 -0
  31. package/dist/config.d.ts.map +1 -0
  32. package/dist/config.js +397 -0
  33. package/dist/config.js.map +1 -0
  34. package/dist/context-manager.d.ts +17 -0
  35. package/dist/context-manager.d.ts.map +1 -0
  36. package/dist/context-manager.js +123 -0
  37. package/dist/context-manager.js.map +1 -0
  38. package/dist/credentials.d.ts +24 -0
  39. package/dist/credentials.d.ts.map +1 -0
  40. package/dist/credentials.js +80 -0
  41. package/dist/credentials.js.map +1 -0
  42. package/dist/delivery-client.d.ts +35 -0
  43. package/dist/delivery-client.d.ts.map +1 -0
  44. package/dist/delivery-client.js +231 -0
  45. package/dist/delivery-client.js.map +1 -0
  46. package/dist/endpoint-policy.d.ts +11 -0
  47. package/dist/endpoint-policy.d.ts.map +1 -0
  48. package/dist/endpoint-policy.js +107 -0
  49. package/dist/endpoint-policy.js.map +1 -0
  50. package/dist/event-watchers.d.ts +11 -0
  51. package/dist/event-watchers.d.ts.map +1 -0
  52. package/dist/event-watchers.js +24 -0
  53. package/dist/event-watchers.js.map +1 -0
  54. package/dist/exec-state.d.ts +37 -0
  55. package/dist/exec-state.d.ts.map +1 -0
  56. package/dist/exec-state.js +53 -0
  57. package/dist/exec-state.js.map +1 -0
  58. package/dist/file-delivery.d.ts +98 -0
  59. package/dist/file-delivery.d.ts.map +1 -0
  60. package/dist/file-delivery.js +473 -0
  61. package/dist/file-delivery.js.map +1 -0
  62. package/dist/handshake-watcher.d.ts +31 -0
  63. package/dist/handshake-watcher.d.ts.map +1 -0
  64. package/dist/handshake-watcher.js +157 -0
  65. package/dist/handshake-watcher.js.map +1 -0
  66. package/dist/hire-listener.d.ts +32 -0
  67. package/dist/hire-listener.d.ts.map +1 -0
  68. package/dist/hire-listener.js +237 -0
  69. package/dist/hire-listener.js.map +1 -0
  70. package/dist/index.d.ts +3 -0
  71. package/dist/index.d.ts.map +1 -0
  72. package/dist/index.js +182 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/job-lifecycle.d.ts +62 -0
  75. package/dist/job-lifecycle.d.ts.map +1 -0
  76. package/dist/job-lifecycle.js +201 -0
  77. package/dist/job-lifecycle.js.map +1 -0
  78. package/dist/notify.d.ts +51 -0
  79. package/dist/notify.d.ts.map +1 -0
  80. package/dist/notify.js +276 -0
  81. package/dist/notify.js.map +1 -0
  82. package/dist/permission-gate.d.ts +30 -0
  83. package/dist/permission-gate.d.ts.map +1 -0
  84. package/dist/permission-gate.js +180 -0
  85. package/dist/permission-gate.js.map +1 -0
  86. package/dist/prompt-guard.d.ts +18 -0
  87. package/dist/prompt-guard.d.ts.map +1 -0
  88. package/dist/prompt-guard.js +70 -0
  89. package/dist/prompt-guard.js.map +1 -0
  90. package/dist/server.d.ts +27 -0
  91. package/dist/server.d.ts.map +1 -0
  92. package/dist/server.js +1956 -0
  93. package/dist/server.js.map +1 -0
  94. package/dist/session-manager.d.ts +55 -0
  95. package/dist/session-manager.d.ts.map +1 -0
  96. package/dist/session-manager.js +139 -0
  97. package/dist/session-manager.js.map +1 -0
  98. package/dist/signer.d.ts +19 -0
  99. package/dist/signer.d.ts.map +1 -0
  100. package/dist/signer.js +195 -0
  101. package/dist/signer.js.map +1 -0
  102. package/dist/token-metering.d.ts +42 -0
  103. package/dist/token-metering.d.ts.map +1 -0
  104. package/dist/token-metering.js +178 -0
  105. package/dist/token-metering.js.map +1 -0
  106. package/dist/userops.d.ts +24 -0
  107. package/dist/userops.d.ts.map +1 -0
  108. package/dist/userops.js +156 -0
  109. package/dist/userops.js.map +1 -0
  110. package/dist/wallet-monitor.d.ts +16 -0
  111. package/dist/wallet-monitor.d.ts.map +1 -0
  112. package/dist/wallet-monitor.js +57 -0
  113. package/dist/wallet-monitor.js.map +1 -0
  114. package/dist/worker-executor.d.ts +81 -0
  115. package/dist/worker-executor.d.ts.map +1 -0
  116. package/dist/worker-executor.js +527 -0
  117. package/dist/worker-executor.js.map +1 -0
  118. package/dist/worker-router.d.ts +63 -0
  119. package/dist/worker-router.d.ts.map +1 -0
  120. package/dist/worker-router.js +263 -0
  121. package/dist/worker-router.js.map +1 -0
  122. package/package.json +30 -0
package/dist/api.js ADDED
@@ -0,0 +1,430 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.routeToCapability = routeToCapability;
40
+ exports.createSessionMiddleware = createSessionMiddleware;
41
+ exports.broadcast = broadcast;
42
+ exports.createApiServer = createApiServer;
43
+ /**
44
+ * arc402-api — public HTTP process (Spec 46 §16 Pattern 1).
45
+ *
46
+ * Handles all external HTTPS requests. Has NO access to the machine key.
47
+ * Routes execution intents to arc402-signer via Unix socket.
48
+ *
49
+ * Responsibilities:
50
+ * - Session validation middleware
51
+ * - Auth endpoints (challenge/session/revoke)
52
+ * - SSE event stream
53
+ * - Commerce endpoints (proxied to signer for signing)
54
+ * - Read-only endpoints (agreements, workroom status)
55
+ *
56
+ * The machine key env var is explicitly excluded when this process is
57
+ * forked by index.ts — see index.ts.
58
+ */
59
+ const express_1 = __importDefault(require("express"));
60
+ const net = __importStar(require("net"));
61
+ const crypto = __importStar(require("crypto"));
62
+ const fs = __importStar(require("fs"));
63
+ const path = __importStar(require("path"));
64
+ const os = __importStar(require("os"));
65
+ const http = __importStar(require("http"));
66
+ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
67
+ const config_1 = require("./config");
68
+ const auth_server_1 = require("./auth-server");
69
+ const capabilities_1 = require("./capabilities");
70
+ const signer_1 = require("./signer");
71
+ const endpoint_policy_1 = require("./endpoint-policy");
72
+ const prompt_guard_1 = require("./prompt-guard");
73
+ // ─── Capability routing ───────────────────────────────────────────────────────
74
+ function routeToCapability(method, urlPath) {
75
+ if (method === "POST" && urlPath === "/hire")
76
+ return "agreement.propose";
77
+ if (method === "POST" && urlPath === "/deliver")
78
+ return "agreement.deliver";
79
+ if (method === "POST" && urlPath === "/verify")
80
+ return "agreement.verify";
81
+ if (method === "POST" && urlPath === "/subscribe")
82
+ return "subscribe";
83
+ if (method === "GET" && urlPath === "/agreements")
84
+ return "agreement.read";
85
+ if (method === "GET" && urlPath === "/wallet/status")
86
+ return "wallet.read";
87
+ if (method === "GET" && urlPath === "/workroom/status")
88
+ return "workroom.status";
89
+ if (method === "POST" && urlPath === "/auth/revoke")
90
+ return "session.revoke:self";
91
+ if (method === "POST" && urlPath === "/wallet/setGuardian")
92
+ return "wallet.setGuardian";
93
+ if (method === "POST" && urlPath === "/wallet/setMachineKey")
94
+ return "wallet.setMachineKey";
95
+ if (method === "POST" && urlPath === "/wallet/authorizeMachineKey")
96
+ return "wallet.authorizeMachineKey";
97
+ if (method === "POST" && urlPath === "/policy/setSpendLimit")
98
+ return "policy.setSpendLimit";
99
+ if (method === "POST" && urlPath === "/daemon/exportKey")
100
+ return "daemon.exportKey";
101
+ if (method === "GET" && urlPath === "/daemon/readSecrets")
102
+ return "daemon.readSecrets";
103
+ if (method === "POST" && urlPath === "/daemon/shell")
104
+ return "daemon.shell";
105
+ if (method === "POST" && urlPath === "/daemon/restart")
106
+ return "daemon.restart";
107
+ if (method === "POST" && urlPath === "/daemon/config/write")
108
+ return "daemon.config.write";
109
+ if (urlPath.startsWith("/arena/"))
110
+ return `arena.${urlPath.slice(7)}`;
111
+ return `${method.toLowerCase()}${urlPath.replace(/\//g, ".")}`;
112
+ }
113
+ // ─── Signer IPC ───────────────────────────────────────────────────────────────
114
+ async function callSigner(request) {
115
+ return new Promise((resolve, reject) => {
116
+ const socket = net.createConnection(signer_1.SIGNER_SOCKET_PATH);
117
+ let buf = "";
118
+ let settled = false;
119
+ const timeout = setTimeout(() => {
120
+ if (!settled) {
121
+ settled = true;
122
+ socket.destroy();
123
+ reject(new Error("signer timeout (10s)"));
124
+ }
125
+ }, 10000);
126
+ socket.once("connect", () => {
127
+ socket.write(JSON.stringify(request) + "\n");
128
+ });
129
+ socket.on("data", (chunk) => {
130
+ buf += chunk.toString();
131
+ const newlineIdx = buf.indexOf("\n");
132
+ if (newlineIdx >= 0 && !settled) {
133
+ settled = true;
134
+ clearTimeout(timeout);
135
+ socket.destroy();
136
+ const line = buf.slice(0, newlineIdx).trim();
137
+ try {
138
+ resolve(JSON.parse(line));
139
+ }
140
+ catch {
141
+ reject(new Error("invalid signer response JSON"));
142
+ }
143
+ }
144
+ });
145
+ socket.on("error", (err) => {
146
+ if (!settled) {
147
+ settled = true;
148
+ clearTimeout(timeout);
149
+ reject(err);
150
+ }
151
+ });
152
+ });
153
+ }
154
+ // ─── Session middleware ───────────────────────────────────────────────────────
155
+ function createSessionMiddleware(db) {
156
+ return (req, res, next) => {
157
+ const authHeader = req.headers["authorization"];
158
+ const token = authHeader?.replace("Bearer ", "");
159
+ if (!token) {
160
+ res.status(401).json({ error: "no_session" });
161
+ return;
162
+ }
163
+ const hash = crypto.createHash("sha256").update(token).digest("hex");
164
+ const session = db.prepare("SELECT * FROM sessions WHERE token_hash = ? AND expires_at > ? AND revoked = 0").get(hash, Date.now());
165
+ if (!session && token === readLocalDaemonToken()) {
166
+ req.session = {
167
+ id: "local-operator",
168
+ token_hash: hash,
169
+ wallet: (0, config_1.loadDaemonConfig)().wallet.contract_address,
170
+ scope: "operator",
171
+ expires_at: Number.MAX_SAFE_INTEGER,
172
+ issued_at: Date.now(),
173
+ revoked: 0,
174
+ };
175
+ next();
176
+ return;
177
+ }
178
+ if (!session) {
179
+ res.status(401).json({ error: "invalid_session" });
180
+ return;
181
+ }
182
+ const capability = routeToCapability(req.method, req.path);
183
+ if (capabilities_1.SESSION_FORBIDDEN.has(capability)) {
184
+ res.status(403).json({ error: "AUTHZ_DENIED", capability });
185
+ return;
186
+ }
187
+ if (!(0, capabilities_1.isCapabilityAllowed)(capability)) {
188
+ res.status(403).json({ error: "AUTHZ_DENIED", capability });
189
+ return;
190
+ }
191
+ req.session = session;
192
+ next();
193
+ };
194
+ }
195
+ const DAEMON_TOKEN_PATH = path.join(os.homedir(), ".arc402", "daemon.token");
196
+ function readLocalDaemonToken() {
197
+ try {
198
+ const token = fs.readFileSync(DAEMON_TOKEN_PATH, "utf-8").trim();
199
+ return token.length > 0 ? token : undefined;
200
+ }
201
+ catch {
202
+ return undefined;
203
+ }
204
+ }
205
+ function ensureLocalDaemonToken(db, wallet) {
206
+ const existing = readLocalDaemonToken();
207
+ const now = Date.now();
208
+ if (existing) {
209
+ const hash = crypto.createHash("sha256").update(existing).digest("hex");
210
+ const row = db
211
+ .prepare("SELECT id FROM sessions WHERE token_hash = ? AND revoked = 0")
212
+ .get(hash);
213
+ if (row?.id)
214
+ return existing;
215
+ }
216
+ const token = crypto.randomBytes(32).toString("hex");
217
+ const tokenHash = crypto.createHash("sha256").update(token).digest("hex");
218
+ const sessionId = crypto.randomBytes(16).toString("hex");
219
+ const expiresAt = now + 365 * 24 * 60 * 60 * 1000; // 1 year local daemon token
220
+ db.prepare(`INSERT OR REPLACE INTO sessions (id, token_hash, wallet, scope, expires_at, issued_at, revoked)
221
+ VALUES (?, ?, ?, ?, ?, ?, 0)`).run(sessionId, tokenHash, wallet, "local", expiresAt, now);
222
+ fs.mkdirSync(path.dirname(DAEMON_TOKEN_PATH), { recursive: true });
223
+ fs.writeFileSync(DAEMON_TOKEN_PATH, `${token}\n`, { mode: 0o600 });
224
+ return token;
225
+ }
226
+ // ─── SSE event stream ─────────────────────────────────────────────────────────
227
+ const sseClients = new Set();
228
+ function sseHandler(req, res) {
229
+ res.setHeader("Content-Type", "text/event-stream");
230
+ res.setHeader("Cache-Control", "no-cache");
231
+ res.setHeader("Connection", "keep-alive");
232
+ res.flushHeaders();
233
+ sseClients.add(res);
234
+ const keepalive = setInterval(() => {
235
+ res.write(": keepalive\n\n");
236
+ }, 30000);
237
+ req.on("close", () => {
238
+ clearInterval(keepalive);
239
+ sseClients.delete(res);
240
+ });
241
+ }
242
+ function broadcast(event, data) {
243
+ const payload = `event: ${event}\ndata: ${JSON.stringify(data)}\n\n`;
244
+ for (const client of sseClients) {
245
+ client.write(payload);
246
+ }
247
+ }
248
+ // ─── Commerce handler helper ──────────────────────────────────────────────────
249
+ function makeCommerceHandler(category, policyEngineAddress, rpcUrl) {
250
+ return async (req, res) => {
251
+ const session = req.session;
252
+ const { target, value, data } = req.body;
253
+ if (!target || !data) {
254
+ res.status(400).json({ error: "target and data required" });
255
+ return;
256
+ }
257
+ const signReq = {
258
+ requestId: crypto.randomBytes(16).toString("hex"),
259
+ sessionId: session.id,
260
+ wallet: session.wallet,
261
+ target,
262
+ value: value ?? "0",
263
+ data,
264
+ category,
265
+ policyEngineAddress,
266
+ rpcUrl,
267
+ };
268
+ try {
269
+ const result = await callSigner(signReq);
270
+ if (!result.ok) {
271
+ res.status(403).json({ error: result.error });
272
+ return;
273
+ }
274
+ broadcast(`${category}.submitted`, { requestId: signReq.requestId, wallet: session.wallet });
275
+ res.json({ ok: true, requestId: signReq.requestId, signedUserOp: result.signedUserOp });
276
+ }
277
+ catch (err) {
278
+ res.status(503).json({
279
+ error: "signer_unavailable",
280
+ detail: err instanceof Error ? err.message : String(err),
281
+ });
282
+ }
283
+ };
284
+ }
285
+ function collectInboundTaskTexts(body) {
286
+ if (!body || typeof body !== "object")
287
+ return [];
288
+ const record = body;
289
+ const values = [
290
+ record.task,
291
+ record.taskDescription,
292
+ record.task_description,
293
+ record.content,
294
+ record.prompt,
295
+ record.workloadDescription,
296
+ record.workload_description,
297
+ ];
298
+ return values.filter((value) => typeof value === "string" && value.trim().length > 0);
299
+ }
300
+ function createApiServer(apiConfig) {
301
+ const app = (0, express_1.default)();
302
+ const { db, rpcUrl, policyEngineAddress } = apiConfig;
303
+ const sessionMiddleware = createSessionMiddleware(db);
304
+ const endpointPolicy = new endpoint_policy_1.EndpointPolicy();
305
+ app.use(express_1.default.json({ limit: "1mb" }));
306
+ app.use((req, res, next) => {
307
+ const jobId = (0, endpoint_policy_1.resolveJobId)(req.headers);
308
+ if (jobId) {
309
+ endpointPolicy.lockForJob(jobId);
310
+ if ((0, endpoint_policy_1.hasExplicitCommerceDelegation)(req.body, req.path)) {
311
+ endpointPolicy.grantCommerceDelegate(jobId);
312
+ }
313
+ if (!endpointPolicy.isAllowed(jobId, req.path)) {
314
+ res.status(403).json({
315
+ error: "commerce_delegation_required",
316
+ reason: "This job was not granted commerce delegation. The worker agent cannot initiate hires or subscriptions.",
317
+ });
318
+ return;
319
+ }
320
+ }
321
+ for (const text of collectInboundTaskTexts(req.body)) {
322
+ const guardResult = (0, prompt_guard_1.guardTaskContent)(text);
323
+ if (!guardResult.safe) {
324
+ res.status(400).json({
325
+ error: "task_rejected",
326
+ reason: "Task content failed security screening",
327
+ code: "PROMPT_INJECTION_DETECTED",
328
+ category: guardResult.category,
329
+ });
330
+ return;
331
+ }
332
+ }
333
+ next();
334
+ });
335
+ // ── Health ──────────────────────────────────────────────────────────────────
336
+ app.get("/health", (_req, res) => {
337
+ res.json({ ok: true, wallet: apiConfig.walletAddress });
338
+ });
339
+ // ── SSE ─────────────────────────────────────────────────────────────────────
340
+ app.get("/events", sseHandler);
341
+ // ── Auth ─────────────────────────────────────────────────────────────────────
342
+ const authCfg = {
343
+ daemonId: apiConfig.daemonId,
344
+ rpcUrl,
345
+ chainId: apiConfig.chainId,
346
+ walletAddress: apiConfig.walletAddress,
347
+ };
348
+ (0, auth_server_1.registerAuthRoutes)(app, db, authCfg);
349
+ // ── Commerce (execution — proxied to signer) ─────────────────────────────────
350
+ app.post("/hire", sessionMiddleware, makeCommerceHandler("hire", policyEngineAddress, rpcUrl));
351
+ app.post("/deliver", sessionMiddleware, makeCommerceHandler("deliver", policyEngineAddress, rpcUrl));
352
+ app.post("/verify", sessionMiddleware, makeCommerceHandler("verify", policyEngineAddress, rpcUrl));
353
+ app.post("/subscribe", sessionMiddleware, makeCommerceHandler("subscribe", policyEngineAddress, rpcUrl));
354
+ // ── Read endpoints (no signer needed) ───────────────────────────────────────
355
+ app.get("/agreements", sessionMiddleware, (req, res) => {
356
+ const session = req.session;
357
+ // hire_requests table uses hirer_address; include both sides
358
+ const rows = db.prepare(`SELECT * FROM hire_requests
359
+ WHERE hirer_address = ? OR (agreement_id IS NOT NULL)
360
+ ORDER BY created_at DESC LIMIT 50`).all(session.wallet);
361
+ res.json({ ok: true, agreements: rows });
362
+ });
363
+ app.get("/wallet/status", sessionMiddleware, (_req, res) => {
364
+ res.json({
365
+ ok: true,
366
+ wallet: apiConfig.walletAddress,
367
+ daemonId: apiConfig.daemonId,
368
+ chainId: apiConfig.chainId,
369
+ rpcUrl: apiConfig.rpcUrl,
370
+ policyEngineAddress: apiConfig.policyEngineAddress,
371
+ });
372
+ });
373
+ app.get("/workroom/status", sessionMiddleware, (_req, res) => {
374
+ res.json({ ok: true, status: "running" });
375
+ });
376
+ return app;
377
+ }
378
+ // ─── Standalone process entrypoint ───────────────────────────────────────────
379
+ async function main() {
380
+ const config = (0, config_1.loadDaemonConfig)();
381
+ const dbPath = path.join(os.homedir(), ".arc402", "daemon.db");
382
+ const db = new better_sqlite3_1.default(dbPath);
383
+ db.pragma("journal_mode = WAL");
384
+ // Ensure session + challenge tables exist (idempotent)
385
+ db.exec(`
386
+ CREATE TABLE IF NOT EXISTS sessions (
387
+ id TEXT PRIMARY KEY,
388
+ token_hash TEXT NOT NULL UNIQUE,
389
+ wallet TEXT NOT NULL,
390
+ scope TEXT NOT NULL,
391
+ expires_at INTEGER NOT NULL,
392
+ issued_at INTEGER NOT NULL,
393
+ revoked INTEGER DEFAULT 0
394
+ );
395
+
396
+ CREATE TABLE IF NOT EXISTS auth_challenges (
397
+ challenge_id TEXT PRIMARY KEY,
398
+ daemon_id TEXT NOT NULL,
399
+ wallet TEXT NOT NULL,
400
+ chain_id INTEGER NOT NULL,
401
+ scope TEXT NOT NULL,
402
+ expires_at INTEGER NOT NULL,
403
+ used INTEGER DEFAULT 0
404
+ );
405
+ `);
406
+ const apiConfig = {
407
+ port: (config.relay.listen_port ?? 4402) + 1, // 4403 — separate from legacy HTTP port
408
+ daemonId: config.wallet.contract_address,
409
+ rpcUrl: config.network.rpc_url,
410
+ chainId: config.network.chain_id,
411
+ walletAddress: config.wallet.contract_address,
412
+ policyEngineAddress: config.policyEngineAddress ?? process.env.ARC402_POLICY_ENGINE ?? "",
413
+ db,
414
+ };
415
+ ensureLocalDaemonToken(db, apiConfig.walletAddress);
416
+ const app = createApiServer(apiConfig);
417
+ const server = http.createServer(app);
418
+ server.listen(apiConfig.port, "0.0.0.0", () => {
419
+ process.stdout.write(`[api] HTTP server ready on port ${apiConfig.port}\n`);
420
+ });
421
+ process.on("SIGTERM", () => { server.close(); db.close(); process.exit(0); });
422
+ process.on("SIGINT", () => { server.close(); db.close(); process.exit(0); });
423
+ }
424
+ if (require.main === module) {
425
+ main().catch((err) => {
426
+ process.stderr.write(`[api] Fatal: ${err instanceof Error ? err.message : String(err)}\n`);
427
+ process.exit(1);
428
+ });
429
+ }
430
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiDA,8CAoBC;AAkDD,0DA8CC;AA4DD,8BAKC;AA6ED,0CAyFC;AA5YD;;;;;;;;;;;;;;;GAeG;AACH,sDAAmE;AACnE,yCAA2B;AAC3B,+CAAiC;AACjC,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AACzB,2CAA6B;AAC7B,oEAAsC;AACtC,qCAA4C;AAC5C,+CAA0E;AAC1E,iDAAwE;AACxE,qCAAmF;AACnF,uDAAgG;AAChG,iDAAkD;AAkBlD,iFAAiF;AAEjF,SAAgB,iBAAiB,CAAC,MAAc,EAAE,OAAe;IAC/D,IAAI,MAAM,KAAK,MAAM,IAAI,OAAO,KAAK,OAAO;QAAgB,OAAO,mBAAmB,CAAC;IACvF,IAAI,MAAM,KAAK,MAAM,IAAI,OAAO,KAAK,UAAU;QAAa,OAAO,mBAAmB,CAAC;IACvF,IAAI,MAAM,KAAK,MAAM,IAAI,OAAO,KAAK,SAAS;QAAc,OAAO,kBAAkB,CAAC;IACtF,IAAI,MAAM,KAAK,MAAM,IAAI,OAAO,KAAK,YAAY;QAAW,OAAO,WAAW,CAAC;IAC/E,IAAI,MAAM,KAAK,KAAK,IAAK,OAAO,KAAK,aAAa;QAAU,OAAO,gBAAgB,CAAC;IACpF,IAAI,MAAM,KAAK,KAAK,IAAK,OAAO,KAAK,gBAAgB;QAAO,OAAO,aAAa,CAAC;IACjF,IAAI,MAAM,KAAK,KAAK,IAAK,OAAO,KAAK,kBAAkB;QAAK,OAAO,iBAAiB,CAAC;IACrF,IAAI,MAAM,KAAK,MAAM,IAAI,OAAO,KAAK,cAAc;QAAS,OAAO,qBAAqB,CAAC;IACzF,IAAI,MAAM,KAAK,MAAM,IAAI,OAAO,KAAK,qBAAqB;QAAE,OAAO,oBAAoB,CAAC;IACxF,IAAI,MAAM,KAAK,MAAM,IAAI,OAAO,KAAK,uBAAuB;QAAE,OAAO,sBAAsB,CAAC;IAC5F,IAAI,MAAM,KAAK,MAAM,IAAI,OAAO,KAAK,6BAA6B;QAAE,OAAO,4BAA4B,CAAC;IACxG,IAAI,MAAM,KAAK,MAAM,IAAI,OAAO,KAAK,uBAAuB;QAAE,OAAO,sBAAsB,CAAC;IAC5F,IAAI,MAAM,KAAK,MAAM,IAAI,OAAO,KAAK,mBAAmB;QAAI,OAAO,kBAAkB,CAAC;IACtF,IAAI,MAAM,KAAK,KAAK,IAAK,OAAO,KAAK,qBAAqB;QAAE,OAAO,oBAAoB,CAAC;IACxF,IAAI,MAAM,KAAK,MAAM,IAAI,OAAO,KAAK,eAAe;QAAQ,OAAO,cAAc,CAAC;IAClF,IAAI,MAAM,KAAK,MAAM,IAAI,OAAO,KAAK,iBAAiB;QAAM,OAAO,gBAAgB,CAAC;IACpF,IAAI,MAAM,KAAK,MAAM,IAAI,OAAO,KAAK,sBAAsB;QAAE,OAAO,qBAAqB,CAAC;IAC1F,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC;QAA2B,OAAO,SAAS,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/F,OAAO,GAAG,MAAM,CAAC,WAAW,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;AACjE,CAAC;AAED,iFAAiF;AAEjF,KAAK,UAAU,UAAU,CAAC,OAAoB;IAC5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,GAAG,CAAC,gBAAgB,CAAC,2BAAkB,CAAC,CAAC;QACxD,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,GAAG,IAAI,CAAC;gBACf,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjB,MAAM,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC,EAAE,KAAM,CAAC,CAAC;QAEX,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;YAC1B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1B,GAAG,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACxB,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACrC,IAAI,UAAU,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAChC,OAAO,GAAG,IAAI,CAAC;gBACf,YAAY,CAAC,OAAO,CAAC,CAAC;gBACtB,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjB,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC7C,IAAI,CAAC;oBACH,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAiB,CAAC,CAAC;gBAC5C,CAAC;gBAAC,MAAM,CAAC;oBACP,MAAM,CAAC,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;gBACpD,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACzB,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,GAAG,IAAI,CAAC;gBACf,YAAY,CAAC,OAAO,CAAC,CAAC;gBACtB,MAAM,CAAC,GAAG,CAAC,CAAC;YACd,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,iFAAiF;AAEjF,SAAgB,uBAAuB,CAAC,EAAqB;IAC3D,OAAO,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAQ,EAAE;QAC/D,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,UAAU,EAAE,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;YAC9C,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrE,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CACxB,gFAAgF,CACjF,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,CAA2B,CAAC;QAElD,IAAI,CAAC,OAAO,IAAI,KAAK,KAAK,oBAAoB,EAAE,EAAE,CAAC;YAChD,GAA4B,CAAC,OAAO,GAAG;gBACtC,EAAE,EAAE,gBAAgB;gBACpB,UAAU,EAAE,IAAI;gBAChB,MAAM,EAAE,IAAA,yBAAgB,GAAE,CAAC,MAAM,CAAC,gBAAgB;gBAClD,KAAK,EAAE,UAAU;gBACjB,UAAU,EAAE,MAAM,CAAC,gBAAgB;gBACnC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,OAAO,EAAE,CAAC;aACX,CAAC;YACF,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC;YACnD,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GAAG,iBAAiB,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3D,IAAI,gCAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YACtC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC,CAAC;YAC5D,OAAO;QACT,CAAC;QACD,IAAI,CAAC,IAAA,kCAAmB,EAAC,UAAU,CAAC,EAAE,CAAC;YACrC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC,CAAC;YAC5D,OAAO;QACT,CAAC;QAEA,GAA4B,CAAC,OAAO,GAAG,OAAO,CAAC;QAChD,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;AAE7E,SAAS,oBAAoB;IAC3B,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,EAAE,CAAC,YAAY,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QACjE,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,sBAAsB,CAAC,EAAqB,EAAE,MAAc;IACnE,MAAM,QAAQ,GAAG,oBAAoB,EAAE,CAAC;IACxC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxE,MAAM,GAAG,GAAG,EAAE;aACX,OAAO,CAAC,8DAA8D,CAAC;aACvE,GAAG,CAAC,IAAI,CAAgC,CAAC;QAC5C,IAAI,GAAG,EAAE,EAAE;YAAE,OAAO,QAAQ,CAAC;IAC/B,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1E,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACzD,MAAM,SAAS,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,4BAA4B;IAE/E,EAAE,CAAC,OAAO,CACR;kCAC8B,CAC/B,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;IAE7D,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnE,EAAE,CAAC,aAAa,CAAC,iBAAiB,EAAE,GAAG,KAAK,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACnE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,iFAAiF;AAEjF,MAAM,UAAU,GAAG,IAAI,GAAG,EAAY,CAAC;AAEvC,SAAS,UAAU,CAAC,GAAY,EAAE,GAAa;IAC7C,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAC;IACnD,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;IAC3C,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IAC1C,GAAG,CAAC,YAAY,EAAE,CAAC;IACnB,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAEpB,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;QACjC,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAC/B,CAAC,EAAE,KAAM,CAAC,CAAC;IAEX,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QACnB,aAAa,CAAC,SAAS,CAAC,CAAC;QACzB,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,SAAS,CAAC,KAAa,EAAE,IAAa;IACpD,MAAM,OAAO,GAAG,UAAU,KAAK,WAAW,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;IACrE,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF,SAAS,mBAAmB,CAC1B,QAAgB,EAChB,mBAA2B,EAC3B,MAAc;IAEd,OAAO,KAAK,EAAE,GAAY,EAAE,GAAa,EAAiB,EAAE;QAC1D,MAAM,OAAO,GAAI,GAA4B,CAAC,OAAO,CAAC;QACtD,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,IAInC,CAAC;QACF,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YACrB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC,CAAC;YAC5D,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAgB;YAC3B,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;YACjD,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,MAAM;YACN,KAAK,EAAE,KAAK,IAAI,GAAG;YACnB,IAAI;YACJ,QAAQ;YACR,mBAAmB;YACnB,MAAM;SACP,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;YACzC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;gBACf,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;gBAC9C,OAAO;YACT,CAAC;YACD,SAAS,CAAC,GAAG,QAAQ,YAAY,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YAC7F,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;QAC1F,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE,oBAAoB;gBAC3B,MAAM,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACzD,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAcD,SAAS,uBAAuB,CAAC,IAAa;IAC5C,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACjD,MAAM,MAAM,GAAG,IAA+B,CAAC;IAC/C,MAAM,MAAM,GAAG;QACb,MAAM,CAAC,IAAI;QACX,MAAM,CAAC,eAAe;QACtB,MAAM,CAAC,gBAAgB;QACvB,MAAM,CAAC,OAAO;QACd,MAAM,CAAC,MAAM;QACb,MAAM,CAAC,mBAAmB;QAC1B,MAAM,CAAC,oBAAoB;KAC5B,CAAC;IACF,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACzG,CAAC;AAED,SAAgB,eAAe,CAAC,SAAoB;IAClD,MAAM,GAAG,GAAG,IAAA,iBAAO,GAAE,CAAC;IACtB,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,mBAAmB,EAAE,GAAG,SAAS,CAAC;IACtD,MAAM,iBAAiB,GAAG,uBAAuB,CAAC,EAAE,CAAC,CAAC;IACtD,MAAM,cAAc,GAAG,IAAI,gCAAc,EAAE,CAAC;IAE5C,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACxC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAQ,EAAE;QAChE,MAAM,KAAK,GAAG,IAAA,8BAAY,EAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,KAAK,EAAE,CAAC;YACV,cAAc,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACjC,IAAI,IAAA,+CAA6B,EAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtD,cAAc,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;YAC9C,CAAC;YACD,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,KAAK,EAAE,8BAA8B;oBACrC,MAAM,EAAE,wGAAwG;iBACjH,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;QACH,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACrD,MAAM,WAAW,GAAG,IAAA,+BAAgB,EAAC,IAAI,CAAC,CAAC;YAC3C,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;gBACtB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,KAAK,EAAE,eAAe;oBACtB,MAAM,EAAE,wCAAwC;oBAChD,IAAI,EAAE,2BAA2B;oBACjC,QAAQ,EAAE,WAAW,CAAC,QAAQ;iBAC/B,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;QACH,CAAC;QACD,IAAI,EAAE,CAAC;IACT,CAAC,CAAC,CAAC;IAEH,+EAA+E;IAC/E,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QAC/B,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,+EAA+E;IAC/E,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAE/B,gFAAgF;IAChF,MAAM,OAAO,GAAqB;QAChC,QAAQ,EAAE,SAAS,CAAC,QAAQ;QAC5B,MAAM;QACN,OAAO,EAAE,SAAS,CAAC,OAAO;QAC1B,aAAa,EAAE,SAAS,CAAC,aAAa;KACvC,CAAC;IACF,IAAA,gCAAkB,EAAC,GAAG,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IAErC,gFAAgF;IAChF,GAAG,CAAC,IAAI,CAAC,OAAO,EAAO,iBAAiB,EAAE,mBAAmB,CAAC,MAAM,EAAO,mBAAmB,EAAE,MAAM,CAAC,CAAC,CAAC;IACzG,GAAG,CAAC,IAAI,CAAC,UAAU,EAAI,iBAAiB,EAAE,mBAAmB,CAAC,SAAS,EAAI,mBAAmB,EAAE,MAAM,CAAC,CAAC,CAAC;IACzG,GAAG,CAAC,IAAI,CAAC,SAAS,EAAK,iBAAiB,EAAE,mBAAmB,CAAC,QAAQ,EAAK,mBAAmB,EAAE,MAAM,CAAC,CAAC,CAAC;IACzG,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,iBAAiB,EAAE,mBAAmB,CAAC,WAAW,EAAE,mBAAmB,EAAE,MAAM,CAAC,CAAC,CAAC;IAEzG,+EAA+E;IAC/E,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,iBAAiB,EAAE,CAAC,GAAY,EAAE,GAAa,EAAQ,EAAE;QAC9E,MAAM,OAAO,GAAI,GAA4B,CAAC,OAAO,CAAC;QACtD,6DAA6D;QAC7D,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB;;yCAEmC,CACpC,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACtB,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE,iBAAiB,EAAE,CAAC,IAAa,EAAE,GAAa,EAAQ,EAAE;QAClF,GAAG,CAAC,IAAI,CAAC;YACP,EAAE,EAAE,IAAI;YACR,MAAM,EAAE,SAAS,CAAC,aAAa;YAC/B,QAAQ,EAAE,SAAS,CAAC,QAAQ;YAC5B,OAAO,EAAE,SAAS,CAAC,OAAO;YAC1B,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,mBAAmB,EAAE,SAAS,CAAC,mBAAmB;SACnD,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAAC,kBAAkB,EAAE,iBAAiB,EAAE,CAAC,IAAa,EAAE,GAAa,EAAQ,EAAE;QACpF,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACb,CAAC;AAED,gFAAgF;AAEhF,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,IAAA,yBAAgB,GAAE,CAAC;IAElC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IAC/D,MAAM,EAAE,GAAG,IAAI,wBAAQ,CAAC,MAAM,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAEhC,uDAAuD;IACvD,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;GAoBP,CAAC,CAAC;IAEH,MAAM,SAAS,GAAc;QAC3B,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,wCAAwC;QACtF,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,gBAAgB;QACxC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO;QAC9B,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ;QAChC,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,gBAAgB;QAC7C,mBAAmB,EAAE,MAAM,CAAC,mBAAmB,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE;QACzF,EAAE;KACH,CAAC;IAEF,sBAAsB,CAAC,EAAE,EAAE,SAAS,CAAC,aAAa,CAAC,CAAC;IAEpD,MAAM,GAAG,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IAEtC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE;QAC5C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,SAAS,CAAC,IAAI,IAAI,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9E,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAG,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChF,CAAC;AAED,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;QAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,gBAAgB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CACrE,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,50 @@
1
+ import { ethers } from "ethers";
2
+ import type { Express } from "express";
3
+ import Database from "better-sqlite3";
4
+ import { SessionManager } from "./session-manager";
5
+ export interface AuthServerConfig {
6
+ daemonId: string;
7
+ rpcUrl: string;
8
+ chainId: number;
9
+ walletAddress: string;
10
+ }
11
+ export interface AuthServerDependencies {
12
+ createProvider?: (rpcUrl: string) => ethers.Provider;
13
+ recoverSigner?: (message: string, signature: string) => string;
14
+ getWalletOwner?: (wallet: string, provider: ethers.Provider) => Promise<string>;
15
+ getWalletsForOwner?: (ownerAddress: string, provider: ethers.Provider, chainId: number) => Promise<string[]>;
16
+ }
17
+ /**
18
+ * Build the EIP-191 message that the owner must sign.
19
+ *
20
+ * "ARC-402 Remote Auth\nChallenge: " + keccak256(abi.encodePacked(
21
+ * challengeId, daemonId, wallet, chainId, requestedScope, expiresAt
22
+ * ))
23
+ */
24
+ export declare function buildChallengeMessage(challengeId: string, daemonId: string, wallet: string, chainId: number, scope: string, expiresAt: number): string;
25
+ export interface IssuedAuthChallenge {
26
+ challengeId: string;
27
+ challenge: string;
28
+ daemonId: string;
29
+ wallet: string;
30
+ chainId: number;
31
+ scope: string;
32
+ expiresAt: number;
33
+ issuedAt: number;
34
+ }
35
+ export declare function issueAuthChallenge(sessions: SessionManager, cfg: AuthServerConfig, wallet: string, requestedScope?: string): IssuedAuthChallenge;
36
+ export type AuthSessionResult = {
37
+ ok: true;
38
+ token: string;
39
+ wallets: string[];
40
+ wallet: string;
41
+ scope: string;
42
+ expiresAt: number;
43
+ } | {
44
+ ok: false;
45
+ status: number;
46
+ error: string;
47
+ };
48
+ export declare function consumeAuthChallenge(sessions: SessionManager, cfg: AuthServerConfig, deps: AuthServerDependencies, provider: ethers.Provider, challengeId: string, signature: string): Promise<AuthSessionResult>;
49
+ export declare function registerAuthRoutes(app: Express, db: Database.Database, cfg: AuthServerConfig, deps?: AuthServerDependencies): void;
50
+ //# sourceMappingURL=auth-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-server.d.ts","sourceRoot":"","sources":["../src/auth-server.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EAAE,OAAO,EAAqB,MAAM,SAAS,CAAC;AAC1D,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AASnD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,sBAAsB;IACrC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,QAAQ,CAAC;IACrD,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC;IAC/D,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAChF,kBAAkB,CAAC,EAAE,CACnB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,CAAC,QAAQ,EACzB,OAAO,EAAE,MAAM,KACZ,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CACxB;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,GAChB,MAAM,CAcR;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,cAAc,EACxB,GAAG,EAAE,gBAAgB,EACrB,MAAM,EAAE,MAAM,EACd,cAAc,CAAC,EAAE,MAAM,GACtB,mBAAmB,CAgCrB;AAED,MAAM,MAAM,iBAAiB,GACzB;IACE,EAAE,EAAE,IAAI,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB,GACD;IACE,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEN,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,cAAc,EACxB,GAAG,EAAE,gBAAgB,EACrB,IAAI,EAAE,sBAAsB,EAC5B,QAAQ,EAAE,MAAM,CAAC,QAAQ,EACzB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,iBAAiB,CAAC,CAoE5B;AAkED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,OAAO,EACZ,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,GAAG,EAAE,gBAAgB,EACrB,IAAI,GAAE,sBAA2B,GAChC,IAAI,CAwEN"}