arc402-cli 1.0.0-rc.1 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (257) hide show
  1. package/README.md +43 -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/tunnel.d.ts +3 -0
  28. package/dist/commands/tunnel.d.ts.map +1 -0
  29. package/dist/commands/tunnel.js +281 -0
  30. package/dist/commands/tunnel.js.map +1 -0
  31. package/dist/commands/wallet.d.ts.map +1 -1
  32. package/dist/commands/wallet.js +299 -65
  33. package/dist/commands/wallet.js.map +1 -1
  34. package/dist/commands/watch.d.ts.map +1 -1
  35. package/dist/commands/watch.js +146 -9
  36. package/dist/commands/watch.js.map +1 -1
  37. package/dist/commands/workroom.d.ts.map +1 -1
  38. package/dist/commands/workroom.js +112 -6
  39. package/dist/commands/workroom.js.map +1 -1
  40. package/dist/config.d.ts +13 -0
  41. package/dist/config.d.ts.map +1 -1
  42. package/dist/config.js +41 -4
  43. package/dist/config.js.map +1 -1
  44. package/dist/daemon/compute-metering.d.ts +61 -0
  45. package/dist/daemon/compute-metering.d.ts.map +1 -0
  46. package/dist/daemon/compute-metering.js +299 -0
  47. package/dist/daemon/compute-metering.js.map +1 -0
  48. package/dist/daemon/compute-session.d.ts +100 -0
  49. package/dist/daemon/compute-session.d.ts.map +1 -0
  50. package/dist/daemon/compute-session.js +231 -0
  51. package/dist/daemon/compute-session.js.map +1 -0
  52. package/dist/daemon/config.d.ts +33 -1
  53. package/dist/daemon/config.d.ts.map +1 -1
  54. package/dist/daemon/config.js +69 -0
  55. package/dist/daemon/config.js.map +1 -1
  56. package/dist/daemon/credentials.d.ts +24 -0
  57. package/dist/daemon/credentials.d.ts.map +1 -0
  58. package/dist/daemon/credentials.js +80 -0
  59. package/dist/daemon/credentials.js.map +1 -0
  60. package/dist/daemon/delivery-client.d.ts +35 -0
  61. package/dist/daemon/delivery-client.d.ts.map +1 -0
  62. package/dist/daemon/delivery-client.js +231 -0
  63. package/dist/daemon/delivery-client.js.map +1 -0
  64. package/dist/daemon/file-delivery.d.ts +98 -0
  65. package/dist/daemon/file-delivery.d.ts.map +1 -0
  66. package/dist/daemon/file-delivery.js +461 -0
  67. package/dist/daemon/file-delivery.js.map +1 -0
  68. package/dist/daemon/index.d.ts +1 -0
  69. package/dist/daemon/index.d.ts.map +1 -1
  70. package/dist/daemon/index.js +793 -227
  71. package/dist/daemon/index.js.map +1 -1
  72. package/dist/daemon/notify.d.ts +35 -6
  73. package/dist/daemon/notify.d.ts.map +1 -1
  74. package/dist/daemon/notify.js +176 -48
  75. package/dist/daemon/notify.js.map +1 -1
  76. package/dist/daemon/worker-executor.d.ts +71 -0
  77. package/dist/daemon/worker-executor.d.ts.map +1 -0
  78. package/dist/daemon/worker-executor.js +382 -0
  79. package/dist/daemon/worker-executor.js.map +1 -0
  80. package/dist/drain-v4.js +2 -2
  81. package/dist/drain-v4.js.map +1 -1
  82. package/dist/endpoint-notify.d.ts +9 -1
  83. package/dist/endpoint-notify.d.ts.map +1 -1
  84. package/dist/endpoint-notify.js +116 -3
  85. package/dist/endpoint-notify.js.map +1 -1
  86. package/dist/index.js +81 -1
  87. package/dist/index.js.map +1 -1
  88. package/dist/program.d.ts.map +1 -1
  89. package/dist/program.js +8 -0
  90. package/dist/program.js.map +1 -1
  91. package/dist/repl.d.ts.map +1 -1
  92. package/dist/repl.js +69 -486
  93. package/dist/repl.js.map +1 -1
  94. package/dist/tui/App.d.ts +12 -0
  95. package/dist/tui/App.d.ts.map +1 -0
  96. package/dist/tui/App.js +154 -0
  97. package/dist/tui/App.js.map +1 -0
  98. package/dist/tui/Footer.d.ts +11 -0
  99. package/dist/tui/Footer.d.ts.map +1 -0
  100. package/dist/tui/Footer.js +13 -0
  101. package/dist/tui/Footer.js.map +1 -0
  102. package/dist/tui/Header.d.ts +14 -0
  103. package/dist/tui/Header.d.ts.map +1 -0
  104. package/dist/tui/Header.js +19 -0
  105. package/dist/tui/Header.js.map +1 -0
  106. package/dist/tui/InputLine.d.ts +11 -0
  107. package/dist/tui/InputLine.d.ts.map +1 -0
  108. package/dist/tui/InputLine.js +145 -0
  109. package/dist/tui/InputLine.js.map +1 -0
  110. package/dist/tui/Viewport.d.ts +14 -0
  111. package/dist/tui/Viewport.d.ts.map +1 -0
  112. package/dist/tui/Viewport.js +48 -0
  113. package/dist/tui/Viewport.js.map +1 -0
  114. package/dist/tui/WalletConnectPairing.d.ts +23 -0
  115. package/dist/tui/WalletConnectPairing.d.ts.map +1 -0
  116. package/dist/tui/WalletConnectPairing.js +61 -0
  117. package/dist/tui/WalletConnectPairing.js.map +1 -0
  118. package/dist/tui/components/Button.d.ts +7 -0
  119. package/dist/tui/components/Button.d.ts.map +1 -0
  120. package/dist/tui/components/Button.js +21 -0
  121. package/dist/tui/components/Button.js.map +1 -0
  122. package/dist/tui/components/CeremonyView.d.ts +13 -0
  123. package/dist/tui/components/CeremonyView.d.ts.map +1 -0
  124. package/dist/tui/components/CeremonyView.js +10 -0
  125. package/dist/tui/components/CeremonyView.js.map +1 -0
  126. package/dist/tui/components/CompletionDropdown.d.ts +7 -0
  127. package/dist/tui/components/CompletionDropdown.d.ts.map +1 -0
  128. package/dist/tui/components/CompletionDropdown.js +23 -0
  129. package/dist/tui/components/CompletionDropdown.js.map +1 -0
  130. package/dist/tui/components/ConfirmPrompt.d.ts +9 -0
  131. package/dist/tui/components/ConfirmPrompt.d.ts.map +1 -0
  132. package/dist/tui/components/ConfirmPrompt.js +10 -0
  133. package/dist/tui/components/ConfirmPrompt.js.map +1 -0
  134. package/dist/tui/components/CustomTextInput.d.ts +15 -0
  135. package/dist/tui/components/CustomTextInput.d.ts.map +1 -0
  136. package/dist/tui/components/CustomTextInput.js +99 -0
  137. package/dist/tui/components/CustomTextInput.js.map +1 -0
  138. package/dist/tui/components/InteractiveTable.d.ts +14 -0
  139. package/dist/tui/components/InteractiveTable.d.ts.map +1 -0
  140. package/dist/tui/components/InteractiveTable.js +61 -0
  141. package/dist/tui/components/InteractiveTable.js.map +1 -0
  142. package/dist/tui/components/StepSpinner.d.ts +11 -0
  143. package/dist/tui/components/StepSpinner.d.ts.map +1 -0
  144. package/dist/tui/components/StepSpinner.js +32 -0
  145. package/dist/tui/components/StepSpinner.js.map +1 -0
  146. package/dist/tui/components/Toast.d.ts +18 -0
  147. package/dist/tui/components/Toast.d.ts.map +1 -0
  148. package/dist/tui/components/Toast.js +29 -0
  149. package/dist/tui/components/Toast.js.map +1 -0
  150. package/dist/tui/index.d.ts +2 -0
  151. package/dist/tui/index.d.ts.map +1 -0
  152. package/dist/tui/index.js +55 -0
  153. package/dist/tui/index.js.map +1 -0
  154. package/dist/tui/useChat.d.ts +11 -0
  155. package/dist/tui/useChat.d.ts.map +1 -0
  156. package/dist/tui/useChat.js +91 -0
  157. package/dist/tui/useChat.js.map +1 -0
  158. package/dist/tui/useCommand.d.ts +12 -0
  159. package/dist/tui/useCommand.d.ts.map +1 -0
  160. package/dist/tui/useCommand.js +137 -0
  161. package/dist/tui/useCommand.js.map +1 -0
  162. package/dist/tui/useNotifications.d.ts +9 -0
  163. package/dist/tui/useNotifications.d.ts.map +1 -0
  164. package/dist/tui/useNotifications.js +17 -0
  165. package/dist/tui/useNotifications.js.map +1 -0
  166. package/dist/tui/useScroll.d.ts +17 -0
  167. package/dist/tui/useScroll.d.ts.map +1 -0
  168. package/dist/tui/useScroll.js +46 -0
  169. package/dist/tui/useScroll.js.map +1 -0
  170. package/dist/ui/format.d.ts.map +1 -1
  171. package/dist/ui/format.js +2 -0
  172. package/dist/ui/format.js.map +1 -1
  173. package/dist/ui/qr-render.d.ts +25 -0
  174. package/dist/ui/qr-render.d.ts.map +1 -0
  175. package/dist/ui/qr-render.js +90 -0
  176. package/dist/ui/qr-render.js.map +1 -0
  177. package/dist/ui/rpc-fallback.d.ts +11 -0
  178. package/dist/ui/rpc-fallback.d.ts.map +1 -0
  179. package/dist/ui/rpc-fallback.js +58 -0
  180. package/dist/ui/rpc-fallback.js.map +1 -0
  181. package/dist/walletconnect.d.ts +4 -0
  182. package/dist/walletconnect.d.ts.map +1 -1
  183. package/dist/walletconnect.js.map +1 -1
  184. package/package.json +11 -3
  185. package/scripts/authorize-machine-key.ts +0 -43
  186. package/scripts/drain-wallet.ts +0 -149
  187. package/scripts/execute-spend-only.ts +0 -81
  188. package/scripts/register-agent-userop.ts +0 -186
  189. package/src/abis.ts +0 -187
  190. package/src/bundler.ts +0 -235
  191. package/src/client.ts +0 -36
  192. package/src/coinbase-smart-wallet.ts +0 -51
  193. package/src/commands/accept.ts +0 -64
  194. package/src/commands/agent-handshake.ts +0 -72
  195. package/src/commands/agent.ts +0 -691
  196. package/src/commands/agreements.ts +0 -350
  197. package/src/commands/arbitrator.ts +0 -180
  198. package/src/commands/arena-handshake.ts +0 -257
  199. package/src/commands/arena.ts +0 -122
  200. package/src/commands/cancel.ts +0 -35
  201. package/src/commands/channel.ts +0 -218
  202. package/src/commands/coldstart.ts +0 -165
  203. package/src/commands/config.ts +0 -58
  204. package/src/commands/contract-interaction.ts +0 -166
  205. package/src/commands/daemon.ts +0 -978
  206. package/src/commands/deliver.ts +0 -148
  207. package/src/commands/discover.ts +0 -297
  208. package/src/commands/dispute.ts +0 -375
  209. package/src/commands/endpoint.ts +0 -620
  210. package/src/commands/feed.ts +0 -229
  211. package/src/commands/hire.ts +0 -245
  212. package/src/commands/migrate.ts +0 -177
  213. package/src/commands/negotiate.ts +0 -271
  214. package/src/commands/openshell.ts +0 -1055
  215. package/src/commands/owner.ts +0 -35
  216. package/src/commands/policy.ts +0 -263
  217. package/src/commands/relay.ts +0 -273
  218. package/src/commands/remediate.ts +0 -24
  219. package/src/commands/reputation.ts +0 -79
  220. package/src/commands/setup.ts +0 -343
  221. package/src/commands/trust.ts +0 -27
  222. package/src/commands/verify.ts +0 -91
  223. package/src/commands/wallet.ts +0 -3280
  224. package/src/commands/watch.ts +0 -23
  225. package/src/commands/watchtower.ts +0 -248
  226. package/src/commands/workroom.ts +0 -959
  227. package/src/config.ts +0 -174
  228. package/src/daemon/config.ts +0 -308
  229. package/src/daemon/hire-listener.ts +0 -226
  230. package/src/daemon/index.ts +0 -955
  231. package/src/daemon/job-lifecycle.ts +0 -215
  232. package/src/daemon/notify.ts +0 -157
  233. package/src/daemon/token-metering.ts +0 -183
  234. package/src/daemon/userops.ts +0 -119
  235. package/src/daemon/wallet-monitor.ts +0 -90
  236. package/src/drain-v4.ts +0 -159
  237. package/src/endpoint-config.ts +0 -83
  238. package/src/endpoint-notify.ts +0 -46
  239. package/src/index.ts +0 -26
  240. package/src/openshell-runtime.ts +0 -277
  241. package/src/program.ts +0 -83
  242. package/src/repl.ts +0 -680
  243. package/src/signing.ts +0 -28
  244. package/src/telegram-notify.ts +0 -88
  245. package/src/ui/banner.ts +0 -51
  246. package/src/ui/colors.ts +0 -30
  247. package/src/ui/format.ts +0 -77
  248. package/src/ui/spinner.ts +0 -56
  249. package/src/ui/tree.ts +0 -16
  250. package/src/utils/format.ts +0 -48
  251. package/src/utils/hash.ts +0 -5
  252. package/src/utils/time.ts +0 -15
  253. package/src/wallet-router.ts +0 -178
  254. package/src/walletconnect-session.ts +0 -27
  255. package/src/walletconnect.ts +0 -294
  256. package/test/time.test.js +0 -11
  257. 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"}