arc402-cli 1.0.0-rc.1 → 1.0.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 (253) hide show
  1. package/README.md +41 -2
  2. package/dist/abis.d.ts +1 -0
  3. package/dist/abis.d.ts.map +1 -1
  4. package/dist/abis.js +29 -1
  5. package/dist/abis.js.map +1 -1
  6. package/dist/commands/backup.d.ts +3 -0
  7. package/dist/commands/backup.d.ts.map +1 -0
  8. package/dist/commands/backup.js +106 -0
  9. package/dist/commands/backup.js.map +1 -0
  10. package/dist/commands/compute.d.ts +14 -0
  11. package/dist/commands/compute.d.ts.map +1 -0
  12. package/dist/commands/compute.js +466 -0
  13. package/dist/commands/compute.js.map +1 -0
  14. package/dist/commands/config.d.ts.map +1 -1
  15. package/dist/commands/config.js +11 -1
  16. package/dist/commands/config.js.map +1 -1
  17. package/dist/commands/daemon.d.ts.map +1 -1
  18. package/dist/commands/daemon.js +67 -0
  19. package/dist/commands/daemon.js.map +1 -1
  20. package/dist/commands/discover.d.ts.map +1 -1
  21. package/dist/commands/discover.js +60 -15
  22. package/dist/commands/discover.js.map +1 -1
  23. package/dist/commands/doctor.d.ts +3 -0
  24. package/dist/commands/doctor.d.ts.map +1 -0
  25. package/dist/commands/doctor.js +205 -0
  26. package/dist/commands/doctor.js.map +1 -0
  27. package/dist/commands/wallet.d.ts.map +1 -1
  28. package/dist/commands/wallet.js +299 -65
  29. package/dist/commands/wallet.js.map +1 -1
  30. package/dist/commands/watch.d.ts.map +1 -1
  31. package/dist/commands/watch.js +146 -9
  32. package/dist/commands/watch.js.map +1 -1
  33. package/dist/commands/workroom.d.ts.map +1 -1
  34. package/dist/commands/workroom.js +112 -6
  35. package/dist/commands/workroom.js.map +1 -1
  36. package/dist/config.d.ts +12 -0
  37. package/dist/config.d.ts.map +1 -1
  38. package/dist/config.js +41 -4
  39. package/dist/config.js.map +1 -1
  40. package/dist/daemon/compute-metering.d.ts +61 -0
  41. package/dist/daemon/compute-metering.d.ts.map +1 -0
  42. package/dist/daemon/compute-metering.js +299 -0
  43. package/dist/daemon/compute-metering.js.map +1 -0
  44. package/dist/daemon/compute-session.d.ts +100 -0
  45. package/dist/daemon/compute-session.d.ts.map +1 -0
  46. package/dist/daemon/compute-session.js +231 -0
  47. package/dist/daemon/compute-session.js.map +1 -0
  48. package/dist/daemon/config.d.ts +33 -1
  49. package/dist/daemon/config.d.ts.map +1 -1
  50. package/dist/daemon/config.js +69 -0
  51. package/dist/daemon/config.js.map +1 -1
  52. package/dist/daemon/credentials.d.ts +24 -0
  53. package/dist/daemon/credentials.d.ts.map +1 -0
  54. package/dist/daemon/credentials.js +80 -0
  55. package/dist/daemon/credentials.js.map +1 -0
  56. package/dist/daemon/delivery-client.d.ts +35 -0
  57. package/dist/daemon/delivery-client.d.ts.map +1 -0
  58. package/dist/daemon/delivery-client.js +231 -0
  59. package/dist/daemon/delivery-client.js.map +1 -0
  60. package/dist/daemon/file-delivery.d.ts +98 -0
  61. package/dist/daemon/file-delivery.d.ts.map +1 -0
  62. package/dist/daemon/file-delivery.js +461 -0
  63. package/dist/daemon/file-delivery.js.map +1 -0
  64. package/dist/daemon/index.d.ts +1 -0
  65. package/dist/daemon/index.d.ts.map +1 -1
  66. package/dist/daemon/index.js +793 -227
  67. package/dist/daemon/index.js.map +1 -1
  68. package/dist/daemon/notify.d.ts +35 -6
  69. package/dist/daemon/notify.d.ts.map +1 -1
  70. package/dist/daemon/notify.js +176 -48
  71. package/dist/daemon/notify.js.map +1 -1
  72. package/dist/daemon/worker-executor.d.ts +71 -0
  73. package/dist/daemon/worker-executor.d.ts.map +1 -0
  74. package/dist/daemon/worker-executor.js +382 -0
  75. package/dist/daemon/worker-executor.js.map +1 -0
  76. package/dist/drain-v4.js +2 -2
  77. package/dist/drain-v4.js.map +1 -1
  78. package/dist/endpoint-notify.d.ts +9 -1
  79. package/dist/endpoint-notify.d.ts.map +1 -1
  80. package/dist/endpoint-notify.js +116 -3
  81. package/dist/endpoint-notify.js.map +1 -1
  82. package/dist/index.js +81 -1
  83. package/dist/index.js.map +1 -1
  84. package/dist/program.d.ts.map +1 -1
  85. package/dist/program.js +6 -0
  86. package/dist/program.js.map +1 -1
  87. package/dist/repl.d.ts.map +1 -1
  88. package/dist/repl.js +69 -486
  89. package/dist/repl.js.map +1 -1
  90. package/dist/tui/App.d.ts +12 -0
  91. package/dist/tui/App.d.ts.map +1 -0
  92. package/dist/tui/App.js +154 -0
  93. package/dist/tui/App.js.map +1 -0
  94. package/dist/tui/Footer.d.ts +11 -0
  95. package/dist/tui/Footer.d.ts.map +1 -0
  96. package/dist/tui/Footer.js +13 -0
  97. package/dist/tui/Footer.js.map +1 -0
  98. package/dist/tui/Header.d.ts +14 -0
  99. package/dist/tui/Header.d.ts.map +1 -0
  100. package/dist/tui/Header.js +19 -0
  101. package/dist/tui/Header.js.map +1 -0
  102. package/dist/tui/InputLine.d.ts +11 -0
  103. package/dist/tui/InputLine.d.ts.map +1 -0
  104. package/dist/tui/InputLine.js +145 -0
  105. package/dist/tui/InputLine.js.map +1 -0
  106. package/dist/tui/Viewport.d.ts +14 -0
  107. package/dist/tui/Viewport.d.ts.map +1 -0
  108. package/dist/tui/Viewport.js +48 -0
  109. package/dist/tui/Viewport.js.map +1 -0
  110. package/dist/tui/WalletConnectPairing.d.ts +23 -0
  111. package/dist/tui/WalletConnectPairing.d.ts.map +1 -0
  112. package/dist/tui/WalletConnectPairing.js +61 -0
  113. package/dist/tui/WalletConnectPairing.js.map +1 -0
  114. package/dist/tui/components/Button.d.ts +7 -0
  115. package/dist/tui/components/Button.d.ts.map +1 -0
  116. package/dist/tui/components/Button.js +21 -0
  117. package/dist/tui/components/Button.js.map +1 -0
  118. package/dist/tui/components/CeremonyView.d.ts +13 -0
  119. package/dist/tui/components/CeremonyView.d.ts.map +1 -0
  120. package/dist/tui/components/CeremonyView.js +10 -0
  121. package/dist/tui/components/CeremonyView.js.map +1 -0
  122. package/dist/tui/components/CompletionDropdown.d.ts +7 -0
  123. package/dist/tui/components/CompletionDropdown.d.ts.map +1 -0
  124. package/dist/tui/components/CompletionDropdown.js +23 -0
  125. package/dist/tui/components/CompletionDropdown.js.map +1 -0
  126. package/dist/tui/components/ConfirmPrompt.d.ts +9 -0
  127. package/dist/tui/components/ConfirmPrompt.d.ts.map +1 -0
  128. package/dist/tui/components/ConfirmPrompt.js +10 -0
  129. package/dist/tui/components/ConfirmPrompt.js.map +1 -0
  130. package/dist/tui/components/CustomTextInput.d.ts +15 -0
  131. package/dist/tui/components/CustomTextInput.d.ts.map +1 -0
  132. package/dist/tui/components/CustomTextInput.js +99 -0
  133. package/dist/tui/components/CustomTextInput.js.map +1 -0
  134. package/dist/tui/components/InteractiveTable.d.ts +14 -0
  135. package/dist/tui/components/InteractiveTable.d.ts.map +1 -0
  136. package/dist/tui/components/InteractiveTable.js +61 -0
  137. package/dist/tui/components/InteractiveTable.js.map +1 -0
  138. package/dist/tui/components/StepSpinner.d.ts +11 -0
  139. package/dist/tui/components/StepSpinner.d.ts.map +1 -0
  140. package/dist/tui/components/StepSpinner.js +32 -0
  141. package/dist/tui/components/StepSpinner.js.map +1 -0
  142. package/dist/tui/components/Toast.d.ts +18 -0
  143. package/dist/tui/components/Toast.d.ts.map +1 -0
  144. package/dist/tui/components/Toast.js +29 -0
  145. package/dist/tui/components/Toast.js.map +1 -0
  146. package/dist/tui/index.d.ts +2 -0
  147. package/dist/tui/index.d.ts.map +1 -0
  148. package/dist/tui/index.js +55 -0
  149. package/dist/tui/index.js.map +1 -0
  150. package/dist/tui/useChat.d.ts +11 -0
  151. package/dist/tui/useChat.d.ts.map +1 -0
  152. package/dist/tui/useChat.js +91 -0
  153. package/dist/tui/useChat.js.map +1 -0
  154. package/dist/tui/useCommand.d.ts +12 -0
  155. package/dist/tui/useCommand.d.ts.map +1 -0
  156. package/dist/tui/useCommand.js +137 -0
  157. package/dist/tui/useCommand.js.map +1 -0
  158. package/dist/tui/useNotifications.d.ts +9 -0
  159. package/dist/tui/useNotifications.d.ts.map +1 -0
  160. package/dist/tui/useNotifications.js +17 -0
  161. package/dist/tui/useNotifications.js.map +1 -0
  162. package/dist/tui/useScroll.d.ts +17 -0
  163. package/dist/tui/useScroll.d.ts.map +1 -0
  164. package/dist/tui/useScroll.js +46 -0
  165. package/dist/tui/useScroll.js.map +1 -0
  166. package/dist/ui/format.d.ts.map +1 -1
  167. package/dist/ui/format.js +2 -0
  168. package/dist/ui/format.js.map +1 -1
  169. package/dist/ui/qr-render.d.ts +25 -0
  170. package/dist/ui/qr-render.d.ts.map +1 -0
  171. package/dist/ui/qr-render.js +90 -0
  172. package/dist/ui/qr-render.js.map +1 -0
  173. package/dist/ui/rpc-fallback.d.ts +11 -0
  174. package/dist/ui/rpc-fallback.d.ts.map +1 -0
  175. package/dist/ui/rpc-fallback.js +58 -0
  176. package/dist/ui/rpc-fallback.js.map +1 -0
  177. package/dist/walletconnect.d.ts +4 -0
  178. package/dist/walletconnect.d.ts.map +1 -1
  179. package/dist/walletconnect.js.map +1 -1
  180. package/package.json +10 -2
  181. package/scripts/authorize-machine-key.ts +0 -43
  182. package/scripts/drain-wallet.ts +0 -149
  183. package/scripts/execute-spend-only.ts +0 -81
  184. package/scripts/register-agent-userop.ts +0 -186
  185. package/src/abis.ts +0 -187
  186. package/src/bundler.ts +0 -235
  187. package/src/client.ts +0 -36
  188. package/src/coinbase-smart-wallet.ts +0 -51
  189. package/src/commands/accept.ts +0 -64
  190. package/src/commands/agent-handshake.ts +0 -72
  191. package/src/commands/agent.ts +0 -691
  192. package/src/commands/agreements.ts +0 -350
  193. package/src/commands/arbitrator.ts +0 -180
  194. package/src/commands/arena-handshake.ts +0 -257
  195. package/src/commands/arena.ts +0 -122
  196. package/src/commands/cancel.ts +0 -35
  197. package/src/commands/channel.ts +0 -218
  198. package/src/commands/coldstart.ts +0 -165
  199. package/src/commands/config.ts +0 -58
  200. package/src/commands/contract-interaction.ts +0 -166
  201. package/src/commands/daemon.ts +0 -978
  202. package/src/commands/deliver.ts +0 -148
  203. package/src/commands/discover.ts +0 -297
  204. package/src/commands/dispute.ts +0 -375
  205. package/src/commands/endpoint.ts +0 -620
  206. package/src/commands/feed.ts +0 -229
  207. package/src/commands/hire.ts +0 -245
  208. package/src/commands/migrate.ts +0 -177
  209. package/src/commands/negotiate.ts +0 -271
  210. package/src/commands/openshell.ts +0 -1055
  211. package/src/commands/owner.ts +0 -35
  212. package/src/commands/policy.ts +0 -263
  213. package/src/commands/relay.ts +0 -273
  214. package/src/commands/remediate.ts +0 -24
  215. package/src/commands/reputation.ts +0 -79
  216. package/src/commands/setup.ts +0 -343
  217. package/src/commands/trust.ts +0 -27
  218. package/src/commands/verify.ts +0 -91
  219. package/src/commands/wallet.ts +0 -3280
  220. package/src/commands/watch.ts +0 -23
  221. package/src/commands/watchtower.ts +0 -248
  222. package/src/commands/workroom.ts +0 -959
  223. package/src/config.ts +0 -174
  224. package/src/daemon/config.ts +0 -308
  225. package/src/daemon/hire-listener.ts +0 -226
  226. package/src/daemon/index.ts +0 -955
  227. package/src/daemon/job-lifecycle.ts +0 -215
  228. package/src/daemon/notify.ts +0 -157
  229. package/src/daemon/token-metering.ts +0 -183
  230. package/src/daemon/userops.ts +0 -119
  231. package/src/daemon/wallet-monitor.ts +0 -90
  232. package/src/drain-v4.ts +0 -159
  233. package/src/endpoint-config.ts +0 -83
  234. package/src/endpoint-notify.ts +0 -46
  235. package/src/index.ts +0 -26
  236. package/src/openshell-runtime.ts +0 -277
  237. package/src/program.ts +0 -83
  238. package/src/repl.ts +0 -680
  239. package/src/signing.ts +0 -28
  240. package/src/telegram-notify.ts +0 -88
  241. package/src/ui/banner.ts +0 -51
  242. package/src/ui/colors.ts +0 -30
  243. package/src/ui/format.ts +0 -77
  244. package/src/ui/spinner.ts +0 -56
  245. package/src/ui/tree.ts +0 -16
  246. package/src/utils/format.ts +0 -48
  247. package/src/utils/hash.ts +0 -5
  248. package/src/utils/time.ts +0 -15
  249. package/src/wallet-router.ts +0 -178
  250. package/src/walletconnect-session.ts +0 -27
  251. package/src/walletconnect.ts +0 -294
  252. package/test/time.test.js +0 -11
  253. package/tsconfig.json +0 -19
@@ -0,0 +1,231 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.DeliveryClient = void 0;
37
+ /**
38
+ * ARC-402 Delivery Client
39
+ *
40
+ * When this agent receives a /delivery notification with a files_url, this
41
+ * module fetches the manifest, downloads each file, verifies all keccak256
42
+ * hashes, and verifies the root hash against the on-chain delivery hash.
43
+ *
44
+ * Flow:
45
+ * 1. Receive POST /delivery { agreementId, deliverableHash, files_url }
46
+ * 2. Fetch manifest from <files_url base>/manifest
47
+ * 3. Download each file to local job dir
48
+ * 4. Verify keccak256 of each file matches manifest
49
+ * 5. Verify root hash matches on-chain deliverableHash
50
+ * 6. Return verification result
51
+ */
52
+ const fs = __importStar(require("fs"));
53
+ const path = __importStar(require("path"));
54
+ const http = __importStar(require("http"));
55
+ const https = __importStar(require("https"));
56
+ const ethers_1 = require("ethers");
57
+ const job_lifecycle_js_1 = require("./job-lifecycle.js");
58
+ // ─── DeliveryClient ───────────────────────────────────────────────────────────
59
+ class DeliveryClient {
60
+ constructor(opts = {}) {
61
+ this.log = () => { };
62
+ this.autoDownload = opts.autoDownload ?? true;
63
+ }
64
+ /**
65
+ * Handle an incoming delivery notification.
66
+ * If auto_download is true, downloads and verifies the files.
67
+ * Returns a VerificationResult.
68
+ */
69
+ async handleDeliveryNotification(params) {
70
+ const { agreementId, deliverableHash, filesUrl } = params;
71
+ if (!this.autoDownload) {
72
+ this.log({ event: "delivery_client_skipped", agreement_id: agreementId, reason: "auto_download_disabled" });
73
+ return null;
74
+ }
75
+ if (!filesUrl) {
76
+ this.log({ event: "delivery_client_skipped", agreement_id: agreementId, reason: "no_files_url" });
77
+ return null;
78
+ }
79
+ this.log({ event: "delivery_download_start", agreement_id: agreementId, files_url: filesUrl });
80
+ try {
81
+ // Derive manifest URL from files_url
82
+ // files_url = https://host/job/abc/files → manifest = https://host/job/abc/manifest
83
+ const manifestUrl = this.deriveManifestUrl(filesUrl);
84
+ // Fetch manifest
85
+ const manifest = await this.fetchJson(manifestUrl);
86
+ this.log({ event: "manifest_fetched", agreement_id: agreementId, file_count: manifest.files.length, root_hash: manifest.root_hash });
87
+ // Create local job directory for client
88
+ const jobDir = (0, job_lifecycle_js_1.createJobDirectory)(agreementId);
89
+ // Download and verify each file
90
+ const fileResults = [];
91
+ let allFilesMatch = true;
92
+ for (const fileEntry of manifest.files) {
93
+ const fileUrl = `${filesUrl.replace(/\/$/, "")}/${encodeURIComponent(fileEntry.name)}`;
94
+ const result = await this.downloadAndVerify(fileUrl, fileEntry, jobDir);
95
+ fileResults.push(result);
96
+ if (!result.hashMatch)
97
+ allFilesMatch = false;
98
+ }
99
+ // Verify root hash
100
+ const actualRootHash = this.computeRootHash(manifest.files.map(f => f.hash));
101
+ const rootHashMatch = actualRootHash.toLowerCase() === deliverableHash.toLowerCase() &&
102
+ actualRootHash.toLowerCase() === manifest.root_hash.toLowerCase();
103
+ const ok = allFilesMatch && rootHashMatch;
104
+ const result = {
105
+ ok,
106
+ agreementId,
107
+ rootHashMatch,
108
+ fileResults,
109
+ };
110
+ this.log({
111
+ event: "delivery_verified",
112
+ agreement_id: agreementId,
113
+ ok,
114
+ root_hash_match: rootHashMatch,
115
+ files_verified: fileResults.length,
116
+ files_ok: fileResults.filter(f => f.hashMatch).length,
117
+ });
118
+ return result;
119
+ }
120
+ catch (err) {
121
+ const error = String(err instanceof Error ? err.message : err);
122
+ this.log({ event: "delivery_verify_error", agreement_id: agreementId, error });
123
+ return {
124
+ ok: false,
125
+ agreementId,
126
+ rootHashMatch: false,
127
+ fileResults: [],
128
+ error,
129
+ };
130
+ }
131
+ }
132
+ // ── Private helpers ───────────────────────────────────────────────────────
133
+ deriveManifestUrl(filesUrl) {
134
+ // Strip trailing slash
135
+ const base = filesUrl.replace(/\/$/, "");
136
+ // Replace /files at end with /manifest, or append /manifest
137
+ if (base.endsWith("/files")) {
138
+ return base.slice(0, -6) + "/manifest";
139
+ }
140
+ // Fallback: try stripping /files/ prefix from last segment
141
+ const parts = base.split("/");
142
+ const lastPart = parts[parts.length - 1];
143
+ if (lastPart === "files") {
144
+ parts[parts.length - 1] = "manifest";
145
+ return parts.join("/");
146
+ }
147
+ return base + "/manifest";
148
+ }
149
+ async downloadAndVerify(url, expected, destDir) {
150
+ const data = await this.fetchBytes(url);
151
+ const actual = ethers_1.ethers.keccak256(data);
152
+ const hashMatch = actual.toLowerCase() === expected.hash.toLowerCase();
153
+ if (hashMatch) {
154
+ // Write to job dir
155
+ const destPath = path.join(destDir, path.basename(expected.name));
156
+ fs.writeFileSync(destPath, data);
157
+ }
158
+ return {
159
+ name: expected.name,
160
+ hashMatch,
161
+ expected: expected.hash,
162
+ actual,
163
+ };
164
+ }
165
+ computeRootHash(fileHashes) {
166
+ if (fileHashes.length === 0) {
167
+ return ethers_1.ethers.keccak256(new Uint8Array(0));
168
+ }
169
+ const sorted = [...fileHashes].sort();
170
+ const allBytes = Buffer.concat(sorted.map(h => Buffer.from(ethers_1.ethers.getBytes(h))));
171
+ return ethers_1.ethers.keccak256(allBytes);
172
+ }
173
+ fetchJson(url) {
174
+ return new Promise((resolve, reject) => {
175
+ const parsed = new URL(url);
176
+ const mod = parsed.protocol === "https:" ? https : http;
177
+ const req = mod.get(url, { headers: { "Accept": "application/json" } }, (res) => {
178
+ if (res.statusCode !== 200) {
179
+ reject(new Error(`fetch_manifest_failed: HTTP ${res.statusCode} for ${url}`));
180
+ res.resume();
181
+ return;
182
+ }
183
+ let raw = "";
184
+ res.on("data", (c) => { raw += c.toString(); });
185
+ res.on("end", () => {
186
+ try {
187
+ resolve(JSON.parse(raw));
188
+ }
189
+ catch {
190
+ reject(new Error(`invalid_manifest_json from ${url}`));
191
+ }
192
+ });
193
+ });
194
+ req.on("error", (err) => reject(new Error(`network_error: ${err.message}`)));
195
+ req.setTimeout(30000, () => {
196
+ req.destroy(new Error("fetch_timeout"));
197
+ });
198
+ });
199
+ }
200
+ fetchBytes(url) {
201
+ return new Promise((resolve, reject) => {
202
+ const parsed = new URL(url);
203
+ const mod = parsed.protocol === "https:" ? https : http;
204
+ const MAX_FILE_BYTES = 200 * 1024 * 1024; // 200MB hard cap for downloads
205
+ const req = mod.get(url, (res) => {
206
+ if (res.statusCode !== 200) {
207
+ reject(new Error(`fetch_file_failed: HTTP ${res.statusCode} for ${url}`));
208
+ res.resume();
209
+ return;
210
+ }
211
+ const chunks = [];
212
+ let total = 0;
213
+ res.on("data", (chunk) => {
214
+ total += chunk.length;
215
+ if (total > MAX_FILE_BYTES) {
216
+ req.destroy(new Error("file_too_large"));
217
+ return;
218
+ }
219
+ chunks.push(chunk);
220
+ });
221
+ res.on("end", () => resolve(Buffer.concat(chunks)));
222
+ });
223
+ req.on("error", (err) => reject(new Error(`network_error: ${err.message}`)));
224
+ req.setTimeout(120000, () => {
225
+ req.destroy(new Error("download_timeout"));
226
+ });
227
+ });
228
+ }
229
+ }
230
+ exports.DeliveryClient = DeliveryClient;
231
+ //# sourceMappingURL=delivery-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delivery-client.js","sourceRoot":"","sources":["../../src/daemon/delivery-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ import * as http from "http";
2
+ export interface DeliveryFileEntry {
3
+ name: string;
4
+ size: number;
5
+ hash: string;
6
+ }
7
+ export interface DeliveryManifest {
8
+ agreement_id: string;
9
+ files: DeliveryFileEntry[];
10
+ root_hash: string;
11
+ total_size: number;
12
+ created_at: string;
13
+ updated_at: string;
14
+ }
15
+ /**
16
+ * Resolves agreement parties (hirer + provider) for access control.
17
+ * Injected by the daemon so file-delivery doesn't depend on the DB schema.
18
+ */
19
+ export type AgreementPartyResolver = (agreementId: string) => {
20
+ hirerAddress: string;
21
+ providerAddress: string;
22
+ } | null;
23
+ export declare class FileDeliveryManager {
24
+ private readonly maxFileSizeBytes;
25
+ private readonly maxJobSizeBytes;
26
+ private partyResolver;
27
+ /** Temporary arbitrator access tokens: token → { agreementId, expiresAt } */
28
+ private readonly arbitratorTokens;
29
+ constructor(opts?: {
30
+ maxFileSizeMb?: number;
31
+ maxJobSizeMb?: number;
32
+ });
33
+ setPartyResolver(resolver: AgreementPartyResolver): void;
34
+ /**
35
+ * Generate a time-limited arbitrator access token for dispute resolution.
36
+ * Valid for the specified agreement only.
37
+ */
38
+ generateArbitratorToken(agreementId: string, ttlSeconds?: number): string;
39
+ /**
40
+ * Verify that a request has valid party auth for a given agreement.
41
+ * Returns true if:
42
+ * 1. X-ARC402-Signature is a valid EIP-191 sig of "arc402:download:<agreementId>"
43
+ * from an address that is the hirer or provider on the agreement, OR
44
+ * 2. Authorization: Bearer <daemon-token> (local access), OR
45
+ * 3. X-Arbitrator-Token is a valid unexpired arbitrator token for this agreement
46
+ */
47
+ verifyPartyAccess(req: http.IncomingMessage, agreementId: string, daemonToken: string): {
48
+ allowed: boolean;
49
+ party?: string;
50
+ reason?: string;
51
+ };
52
+ deliveryDir(agreementId: string): string;
53
+ manifestPath(agreementId: string): string;
54
+ filePath(agreementId: string, filename: string): string;
55
+ computeFileHash(data: Buffer): string;
56
+ computeRootHash(fileHashes: string[]): string;
57
+ getManifest(agreementId: string): DeliveryManifest | null;
58
+ private writeManifest;
59
+ private recomputeManifest;
60
+ /**
61
+ * Store a file for an agreement. Immutable — returns existing entry if
62
+ * the file already exists (no overwrite).
63
+ */
64
+ storeFile(agreementId: string, filename: string, data: Buffer): {
65
+ entry: DeliveryFileEntry;
66
+ manifest: DeliveryManifest;
67
+ alreadyExisted: boolean;
68
+ };
69
+ /**
70
+ * Scan a directory for output files and store all of them.
71
+ * Returns the final manifest with root_hash.
72
+ */
73
+ storeDirectory(agreementId: string, sourceDir: string, excludes?: string[]): DeliveryManifest;
74
+ /**
75
+ * POST /job/:id/upload
76
+ * Auth required. Accepts raw binary body with X-Filename header.
77
+ * Also accepts Content-Disposition: attachment; filename="..."
78
+ */
79
+ handleUpload(req: http.IncomingMessage, res: http.ServerResponse, agreementId: string, log: (entry: Record<string, unknown>) => void): Promise<void>;
80
+ /**
81
+ * GET /job/:id/files
82
+ * Party-gated. Returns list of files (same as manifest but concise).
83
+ * Requires valid party auth (signature, daemon token, or arbitrator token).
84
+ */
85
+ handleListFiles(req: http.IncomingMessage, res: http.ServerResponse, agreementId: string, daemonToken: string, log: (entry: Record<string, unknown>) => void): void;
86
+ /**
87
+ * GET /job/:id/files/:filename
88
+ * Party-gated. Streams the file content to authenticated agreement parties.
89
+ */
90
+ handleDownloadFile(req: http.IncomingMessage, res: http.ServerResponse, agreementId: string, filename: string, daemonToken: string, log: (entry: Record<string, unknown>) => void): void;
91
+ /**
92
+ * GET /job/:id/manifest
93
+ * Party-gated. Returns full manifest with hashes for verification.
94
+ */
95
+ handleManifest(req: http.IncomingMessage, res: http.ServerResponse, agreementId: string, daemonToken: string, log: (entry: Record<string, unknown>) => void): void;
96
+ private readUploadBody;
97
+ }
98
+ //# sourceMappingURL=file-delivery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-delivery.d.ts","sourceRoot":"","sources":["../../src/daemon/file-delivery.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAQ7B,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAID;;;GAGG;AACH,MAAM,MAAM,sBAAsB,GAAG,CAAC,WAAW,EAAE,MAAM,KAAK;IAC5D,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;CACzB,GAAG,IAAI,CAAC;AAET,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,aAAa,CAAuC;IAC5D,6EAA6E;IAC7E,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAiE;gBAEtF,IAAI,GAAE;QAChB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,YAAY,CAAC,EAAE,MAAM,CAAC;KAClB;IAMN,gBAAgB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,IAAI;IAIxD;;;OAGG;IACH,uBAAuB,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,GAAE,MAAc,GAAG,MAAM;IAShF;;;;;;;OAOG;IACH,iBAAiB,CACf,GAAG,EAAE,IAAI,CAAC,eAAe,EACzB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;IA+DxD,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAIxC,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAIzC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAQvD,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAIrC,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM;IAW7C,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAUzD,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,iBAAiB;IAsCzB;;;OAGG;IACH,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG;QAC9D,KAAK,EAAE,iBAAiB,CAAC;QACzB,QAAQ,EAAE,gBAAgB,CAAC;QAC3B,cAAc,EAAE,OAAO,CAAC;KACzB;IA0CD;;;OAGG;IACH,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,EAAO,GAAG,gBAAgB;IAuBjG;;;;OAIG;IACG,YAAY,CAChB,GAAG,EAAE,IAAI,CAAC,eAAe,EACzB,GAAG,EAAE,IAAI,CAAC,cAAc,EACxB,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,GAC5C,OAAO,CAAC,IAAI,CAAC;IA+ChB;;;;OAIG;IACH,eAAe,CACb,GAAG,EAAE,IAAI,CAAC,eAAe,EACzB,GAAG,EAAE,IAAI,CAAC,cAAc,EACxB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,GAC5C,IAAI;IA2BP;;;OAGG;IACH,kBAAkB,CAChB,GAAG,EAAE,IAAI,CAAC,eAAe,EACzB,GAAG,EAAE,IAAI,CAAC,cAAc,EACxB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,GAC5C,IAAI;IAuCP;;;OAGG;IACH,cAAc,CACZ,GAAG,EAAE,IAAI,CAAC,eAAe,EACzB,GAAG,EAAE,IAAI,CAAC,cAAc,EACxB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,GAC5C,IAAI;IAuBP,OAAO,CAAC,cAAc;CAgCvB"}