arc402-cli 0.9.19 → 0.10.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 (359) 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 +45 -14
  5. package/dist/abis.js.map +1 -1
  6. package/dist/bundler.d.ts +1 -1
  7. package/dist/bundler.d.ts.map +1 -1
  8. package/dist/bundler.js +61 -27
  9. package/dist/bundler.js.map +1 -1
  10. package/dist/client.d.ts +1 -1
  11. package/dist/client.d.ts.map +1 -1
  12. package/dist/client.js +9 -5
  13. package/dist/client.js.map +1 -1
  14. package/dist/coinbase-smart-wallet.js +4 -1
  15. package/dist/coinbase-smart-wallet.js.map +1 -1
  16. package/dist/commands/accept.js +28 -25
  17. package/dist/commands/accept.js.map +1 -1
  18. package/dist/commands/agent-handshake.js +18 -15
  19. package/dist/commands/agent-handshake.js.map +1 -1
  20. package/dist/commands/agent.js +104 -98
  21. package/dist/commands/agent.js.map +1 -1
  22. package/dist/commands/agreements.js +98 -62
  23. package/dist/commands/agreements.js.map +1 -1
  24. package/dist/commands/arbitrator.js +81 -45
  25. package/dist/commands/arbitrator.js.map +1 -1
  26. package/dist/commands/arena-handshake.d.ts.map +1 -1
  27. package/dist/commands/arena-handshake.js +35 -53
  28. package/dist/commands/arena-handshake.js.map +1 -1
  29. package/dist/commands/arena.js +18 -12
  30. package/dist/commands/arena.js.map +1 -1
  31. package/dist/commands/backup.js +36 -30
  32. package/dist/commands/backup.js.map +1 -1
  33. package/dist/commands/cancel.js +18 -15
  34. package/dist/commands/cancel.js.map +1 -1
  35. package/dist/commands/channel.js +81 -45
  36. package/dist/commands/channel.js.map +1 -1
  37. package/dist/commands/coldstart.js +34 -31
  38. package/dist/commands/coldstart.js.map +1 -1
  39. package/dist/commands/compute.d.ts +14 -0
  40. package/dist/commands/compute.d.ts.map +1 -0
  41. package/dist/commands/compute.js +466 -0
  42. package/dist/commands/compute.js.map +1 -0
  43. package/dist/commands/config.js +30 -24
  44. package/dist/commands/config.js.map +1 -1
  45. package/dist/commands/contract-interaction.js +15 -12
  46. package/dist/commands/contract-interaction.js.map +1 -1
  47. package/dist/commands/daemon.d.ts.map +1 -1
  48. package/dist/commands/daemon.js +135 -98
  49. package/dist/commands/daemon.js.map +1 -1
  50. package/dist/commands/deliver.js +76 -37
  51. package/dist/commands/deliver.js.map +1 -1
  52. package/dist/commands/discover.js +27 -24
  53. package/dist/commands/discover.js.map +1 -1
  54. package/dist/commands/dispute.js +110 -104
  55. package/dist/commands/dispute.js.map +1 -1
  56. package/dist/commands/doctor.js +55 -16
  57. package/dist/commands/doctor.js.map +1 -1
  58. package/dist/commands/endpoint.js +95 -56
  59. package/dist/commands/endpoint.js.map +1 -1
  60. package/dist/commands/feed.js +18 -11
  61. package/dist/commands/feed.js.map +1 -1
  62. package/dist/commands/hire.js +40 -37
  63. package/dist/commands/hire.js.map +1 -1
  64. package/dist/commands/migrate.js +33 -30
  65. package/dist/commands/migrate.js.map +1 -1
  66. package/dist/commands/negotiate.d.ts.map +1 -1
  67. package/dist/commands/negotiate.js +36 -34
  68. package/dist/commands/negotiate.js.map +1 -1
  69. package/dist/commands/openshell.js +104 -68
  70. package/dist/commands/openshell.js.map +1 -1
  71. package/dist/commands/owner.js +20 -17
  72. package/dist/commands/owner.js.map +1 -1
  73. package/dist/commands/policy.js +43 -41
  74. package/dist/commands/policy.js.map +1 -1
  75. package/dist/commands/relay.d.ts.map +1 -1
  76. package/dist/commands/relay.js +51 -18
  77. package/dist/commands/relay.js.map +1 -1
  78. package/dist/commands/remediate.js +23 -20
  79. package/dist/commands/remediate.js.map +1 -1
  80. package/dist/commands/reputation.js +27 -25
  81. package/dist/commands/reputation.js.map +1 -1
  82. package/dist/commands/setup.js +104 -65
  83. package/dist/commands/setup.js.map +1 -1
  84. package/dist/commands/trust.js +20 -17
  85. package/dist/commands/trust.js.map +1 -1
  86. package/dist/commands/verify.js +21 -18
  87. package/dist/commands/verify.js.map +1 -1
  88. package/dist/commands/wallet.d.ts.map +1 -1
  89. package/dist/commands/wallet.js +645 -679
  90. package/dist/commands/wallet.js.map +1 -1
  91. package/dist/commands/watch.js +36 -33
  92. package/dist/commands/watch.js.map +1 -1
  93. package/dist/commands/watchtower.js +73 -37
  94. package/dist/commands/watchtower.js.map +1 -1
  95. package/dist/commands/workroom.d.ts.map +1 -1
  96. package/dist/commands/workroom.js +282 -143
  97. package/dist/commands/workroom.js.map +1 -1
  98. package/dist/config.d.ts +3 -0
  99. package/dist/config.d.ts.map +1 -1
  100. package/dist/config.js +71 -22
  101. package/dist/config.js.map +1 -1
  102. package/dist/daemon/compute-metering.d.ts +61 -0
  103. package/dist/daemon/compute-metering.d.ts.map +1 -0
  104. package/dist/daemon/compute-metering.js +299 -0
  105. package/dist/daemon/compute-metering.js.map +1 -0
  106. package/dist/daemon/compute-session.d.ts +100 -0
  107. package/dist/daemon/compute-session.d.ts.map +1 -0
  108. package/dist/daemon/compute-session.js +231 -0
  109. package/dist/daemon/compute-session.js.map +1 -0
  110. package/dist/daemon/config.d.ts +19 -1
  111. package/dist/daemon/config.d.ts.map +1 -1
  112. package/dist/daemon/config.js +90 -16
  113. package/dist/daemon/config.js.map +1 -1
  114. package/dist/daemon/credentials.d.ts +24 -0
  115. package/dist/daemon/credentials.d.ts.map +1 -0
  116. package/dist/daemon/credentials.js +80 -0
  117. package/dist/daemon/credentials.js.map +1 -0
  118. package/dist/daemon/delivery-client.d.ts +35 -0
  119. package/dist/daemon/delivery-client.d.ts.map +1 -0
  120. package/dist/daemon/delivery-client.js +231 -0
  121. package/dist/daemon/delivery-client.js.map +1 -0
  122. package/dist/daemon/file-delivery.d.ts +98 -0
  123. package/dist/daemon/file-delivery.d.ts.map +1 -0
  124. package/dist/daemon/file-delivery.js +461 -0
  125. package/dist/daemon/file-delivery.js.map +1 -0
  126. package/dist/daemon/hire-listener.d.ts +3 -3
  127. package/dist/daemon/hire-listener.d.ts.map +1 -1
  128. package/dist/daemon/hire-listener.js +47 -13
  129. package/dist/daemon/hire-listener.js.map +1 -1
  130. package/dist/daemon/index.d.ts +2 -1
  131. package/dist/daemon/index.d.ts.map +1 -1
  132. package/dist/daemon/index.js +526 -53
  133. package/dist/daemon/index.js.map +1 -1
  134. package/dist/daemon/job-lifecycle.d.ts +1 -1
  135. package/dist/daemon/job-lifecycle.d.ts.map +1 -1
  136. package/dist/daemon/job-lifecycle.js +51 -11
  137. package/dist/daemon/job-lifecycle.js.map +1 -1
  138. package/dist/daemon/notify.d.ts +1 -1
  139. package/dist/daemon/notify.d.ts.map +1 -1
  140. package/dist/daemon/notify.js +53 -19
  141. package/dist/daemon/notify.js.map +1 -1
  142. package/dist/daemon/token-metering.js +47 -8
  143. package/dist/daemon/token-metering.js.map +1 -1
  144. package/dist/daemon/userops.d.ts +2 -2
  145. package/dist/daemon/userops.d.ts.map +1 -1
  146. package/dist/daemon/userops.js +27 -23
  147. package/dist/daemon/userops.js.map +1 -1
  148. package/dist/daemon/wallet-monitor.d.ts +1 -1
  149. package/dist/daemon/wallet-monitor.d.ts.map +1 -1
  150. package/dist/daemon/wallet-monitor.js +12 -8
  151. package/dist/daemon/wallet-monitor.js.map +1 -1
  152. package/dist/daemon/worker-executor.d.ts +71 -0
  153. package/dist/daemon/worker-executor.d.ts.map +1 -0
  154. package/dist/daemon/worker-executor.js +382 -0
  155. package/dist/daemon/worker-executor.js.map +1 -0
  156. package/dist/drain-v4.js +64 -26
  157. package/dist/drain-v4.js.map +1 -1
  158. package/dist/endpoint-config.js +63 -20
  159. package/dist/endpoint-config.js.map +1 -1
  160. package/dist/endpoint-notify.d.ts.map +1 -1
  161. package/dist/endpoint-notify.js +49 -15
  162. package/dist/endpoint-notify.js.map +1 -1
  163. package/dist/index.js +50 -18
  164. package/dist/index.js.map +1 -1
  165. package/dist/openshell-runtime.d.ts.map +1 -1
  166. package/dist/openshell-runtime.js +82 -38
  167. package/dist/openshell-runtime.js.map +1 -1
  168. package/dist/program.d.ts.map +1 -1
  169. package/dist/program.js +85 -78
  170. package/dist/program.js.map +1 -1
  171. package/dist/repl.js +31 -25
  172. package/dist/repl.js.map +1 -1
  173. package/dist/signing.js +6 -3
  174. package/dist/signing.js.map +1 -1
  175. package/dist/telegram-notify.js +40 -3
  176. package/dist/telegram-notify.js.map +1 -1
  177. package/dist/tui/App.d.ts.map +1 -1
  178. package/dist/tui/App.js +56 -89
  179. package/dist/tui/App.js.map +1 -1
  180. package/dist/tui/Footer.js +7 -4
  181. package/dist/tui/Footer.js.map +1 -1
  182. package/dist/tui/Header.d.ts +1 -1
  183. package/dist/tui/Header.d.ts.map +1 -1
  184. package/dist/tui/Header.js +14 -9
  185. package/dist/tui/Header.js.map +1 -1
  186. package/dist/tui/InputLine.d.ts +2 -1
  187. package/dist/tui/InputLine.d.ts.map +1 -1
  188. package/dist/tui/InputLine.js +47 -97
  189. package/dist/tui/InputLine.js.map +1 -1
  190. package/dist/tui/Viewport.d.ts +1 -2
  191. package/dist/tui/Viewport.d.ts.map +1 -1
  192. package/dist/tui/Viewport.js +26 -6
  193. package/dist/tui/Viewport.js.map +1 -1
  194. package/dist/tui/WalletConnectPairing.js +19 -16
  195. package/dist/tui/WalletConnectPairing.js.map +1 -1
  196. package/dist/tui/components/Button.js +9 -6
  197. package/dist/tui/components/Button.js.map +1 -1
  198. package/dist/tui/components/CeremonyView.js +8 -5
  199. package/dist/tui/components/CeremonyView.js.map +1 -1
  200. package/dist/tui/components/CompletionDropdown.js +9 -6
  201. package/dist/tui/components/CompletionDropdown.js.map +1 -1
  202. package/dist/tui/components/ConfirmPrompt.js +8 -5
  203. package/dist/tui/components/ConfirmPrompt.js.map +1 -1
  204. package/dist/tui/components/CustomTextInput.js +14 -11
  205. package/dist/tui/components/CustomTextInput.js.map +1 -1
  206. package/dist/tui/components/InteractiveTable.js +12 -9
  207. package/dist/tui/components/InteractiveTable.js.map +1 -1
  208. package/dist/tui/components/StepSpinner.js +13 -10
  209. package/dist/tui/components/StepSpinner.js.map +1 -1
  210. package/dist/tui/components/Toast.js +12 -8
  211. package/dist/tui/components/Toast.js.map +1 -1
  212. package/dist/tui/index.d.ts.map +1 -1
  213. package/dist/tui/index.js +21 -28
  214. package/dist/tui/index.js.map +1 -1
  215. package/dist/tui/useChat.js +19 -13
  216. package/dist/tui/useChat.js.map +1 -1
  217. package/dist/tui/useCommand.d.ts +2 -3
  218. package/dist/tui/useCommand.d.ts.map +1 -1
  219. package/dist/tui/useCommand.js +24 -100
  220. package/dist/tui/useCommand.js.map +1 -1
  221. package/dist/tui/useNotifications.js +8 -5
  222. package/dist/tui/useNotifications.js.map +1 -1
  223. package/dist/tui/useScroll.d.ts.map +1 -1
  224. package/dist/tui/useScroll.js +12 -15
  225. package/dist/tui/useScroll.js.map +1 -1
  226. package/dist/ui/banner.d.ts +0 -12
  227. package/dist/ui/banner.d.ts.map +1 -1
  228. package/dist/ui/banner.js +19 -35
  229. package/dist/ui/banner.js.map +1 -1
  230. package/dist/ui/colors.js +19 -13
  231. package/dist/ui/colors.js.map +1 -1
  232. package/dist/ui/format.js +14 -6
  233. package/dist/ui/format.js.map +1 -1
  234. package/dist/ui/qr-render.js +11 -4
  235. package/dist/ui/qr-render.js.map +1 -1
  236. package/dist/ui/rpc-fallback.js +11 -6
  237. package/dist/ui/rpc-fallback.js.map +1 -1
  238. package/dist/ui/spinner.js +12 -6
  239. package/dist/ui/spinner.js.map +1 -1
  240. package/dist/ui/tree.js +6 -3
  241. package/dist/ui/tree.js.map +1 -1
  242. package/dist/utils/format.js +41 -27
  243. package/dist/utils/format.js.map +1 -1
  244. package/dist/utils/hash.js +42 -4
  245. package/dist/utils/hash.js.map +1 -1
  246. package/dist/utils/time.js +6 -2
  247. package/dist/utils/time.js.map +1 -1
  248. package/dist/wallet-router.d.ts +1 -1
  249. package/dist/wallet-router.d.ts.map +1 -1
  250. package/dist/wallet-router.js +19 -12
  251. package/dist/wallet-router.js.map +1 -1
  252. package/dist/walletconnect-session.d.ts +1 -1
  253. package/dist/walletconnect-session.d.ts.map +1 -1
  254. package/dist/walletconnect-session.js +11 -6
  255. package/dist/walletconnect-session.js.map +1 -1
  256. package/dist/walletconnect.d.ts +5 -6
  257. package/dist/walletconnect.d.ts.map +1 -1
  258. package/dist/walletconnect.js +35 -32
  259. package/dist/walletconnect.js.map +1 -1
  260. package/package.json +11 -10
  261. package/INK6-UX-SPEC.md +0 -446
  262. package/MIGRATION-SPEC.md +0 -108
  263. package/TUI-SPEC.md +0 -214
  264. package/scripts/authorize-machine-key.ts +0 -43
  265. package/scripts/drain-wallet.ts +0 -149
  266. package/scripts/execute-spend-only.ts +0 -81
  267. package/scripts/register-agent-userop.ts +0 -186
  268. package/src/abis.ts +0 -187
  269. package/src/bundler.ts +0 -235
  270. package/src/client.ts +0 -36
  271. package/src/coinbase-smart-wallet.ts +0 -51
  272. package/src/commands/accept.ts +0 -64
  273. package/src/commands/agent-handshake.ts +0 -72
  274. package/src/commands/agent.ts +0 -691
  275. package/src/commands/agreements.ts +0 -350
  276. package/src/commands/arbitrator.ts +0 -180
  277. package/src/commands/arena-handshake.ts +0 -274
  278. package/src/commands/arena.ts +0 -122
  279. package/src/commands/backup.ts +0 -117
  280. package/src/commands/cancel.ts +0 -35
  281. package/src/commands/channel.ts +0 -218
  282. package/src/commands/coldstart.ts +0 -165
  283. package/src/commands/config.ts +0 -68
  284. package/src/commands/contract-interaction.ts +0 -166
  285. package/src/commands/daemon.ts +0 -1054
  286. package/src/commands/deliver.ts +0 -148
  287. package/src/commands/discover.ts +0 -350
  288. package/src/commands/dispute.ts +0 -375
  289. package/src/commands/doctor.ts +0 -172
  290. package/src/commands/endpoint.ts +0 -620
  291. package/src/commands/feed.ts +0 -229
  292. package/src/commands/hire.ts +0 -245
  293. package/src/commands/migrate.ts +0 -177
  294. package/src/commands/negotiate.ts +0 -272
  295. package/src/commands/openshell.ts +0 -1055
  296. package/src/commands/owner.ts +0 -35
  297. package/src/commands/policy.ts +0 -263
  298. package/src/commands/relay.ts +0 -277
  299. package/src/commands/remediate.ts +0 -24
  300. package/src/commands/reputation.ts +0 -79
  301. package/src/commands/setup.ts +0 -343
  302. package/src/commands/trust.ts +0 -27
  303. package/src/commands/verify.ts +0 -91
  304. package/src/commands/wallet.ts +0 -3548
  305. package/src/commands/watch.ts +0 -220
  306. package/src/commands/watchtower.ts +0 -248
  307. package/src/commands/workroom.ts +0 -963
  308. package/src/config.ts +0 -220
  309. package/src/daemon/config.ts +0 -344
  310. package/src/daemon/hire-listener.ts +0 -226
  311. package/src/daemon/index.ts +0 -1089
  312. package/src/daemon/job-lifecycle.ts +0 -215
  313. package/src/daemon/notify.ts +0 -297
  314. package/src/daemon/token-metering.ts +0 -183
  315. package/src/daemon/userops.ts +0 -119
  316. package/src/daemon/wallet-monitor.ts +0 -90
  317. package/src/drain-v4.ts +0 -159
  318. package/src/endpoint-config.ts +0 -83
  319. package/src/endpoint-notify.ts +0 -134
  320. package/src/index.ts +0 -74
  321. package/src/openshell-runtime.ts +0 -281
  322. package/src/program.ts +0 -88
  323. package/src/repl.ts +0 -178
  324. package/src/signing.ts +0 -28
  325. package/src/telegram-notify.ts +0 -88
  326. package/src/tui/App.tsx +0 -263
  327. package/src/tui/Footer.tsx +0 -18
  328. package/src/tui/Header.tsx +0 -45
  329. package/src/tui/InputLine.tsx +0 -243
  330. package/src/tui/Viewport.tsx +0 -51
  331. package/src/tui/WalletConnectPairing.tsx +0 -114
  332. package/src/tui/components/Button.tsx +0 -38
  333. package/src/tui/components/CeremonyView.tsx +0 -39
  334. package/src/tui/components/CompletionDropdown.tsx +0 -56
  335. package/src/tui/components/ConfirmPrompt.tsx +0 -36
  336. package/src/tui/components/CustomTextInput.tsx +0 -132
  337. package/src/tui/components/InteractiveTable.tsx +0 -106
  338. package/src/tui/components/StepSpinner.tsx +0 -84
  339. package/src/tui/components/Toast.tsx +0 -59
  340. package/src/tui/index.tsx +0 -90
  341. package/src/tui/useChat.ts +0 -103
  342. package/src/tui/useCommand.ts +0 -238
  343. package/src/tui/useNotifications.ts +0 -28
  344. package/src/tui/useScroll.ts +0 -69
  345. package/src/ui/banner.ts +0 -78
  346. package/src/ui/colors.ts +0 -30
  347. package/src/ui/format.ts +0 -78
  348. package/src/ui/qr-render.ts +0 -92
  349. package/src/ui/rpc-fallback.ts +0 -59
  350. package/src/ui/spinner.ts +0 -56
  351. package/src/ui/tree.ts +0 -16
  352. package/src/utils/format.ts +0 -48
  353. package/src/utils/hash.ts +0 -5
  354. package/src/utils/time.ts +0 -15
  355. package/src/wallet-router.ts +0 -178
  356. package/src/walletconnect-session.ts +0 -27
  357. package/src/walletconnect.ts +0 -309
  358. package/test/time.test.js +0 -11
  359. package/tsconfig.json +0 -33
@@ -0,0 +1,382 @@
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.WorkerExecutor = void 0;
37
+ /**
38
+ * ARC-402 Worker Executor
39
+ *
40
+ * Spawns an agent to complete hired work inside the job directory.
41
+ * On completion, scans the job dir for output files and uploads them to
42
+ * FileDeliveryManager. Computes root hash for on-chain delivery.
43
+ *
44
+ * Supported agent runtimes:
45
+ * - openclaw (preferred): Full OpenClaw gateway — can spawn any ACP
46
+ * (Claude Code, Codex, Gemini, Pi, etc.) and orchestrate multi-agent work.
47
+ * Command: openclaw run '<task>' --workdir <jobDir>
48
+ * - claude-code: Direct Claude Code CLI.
49
+ * Command: claude --permission-mode bypassPermissions --print '<task>'
50
+ * - codex: Direct Codex CLI.
51
+ * Command: codex --print '<task>'
52
+ * - shell: Raw shell execution.
53
+ * Command: /bin/sh -c '<task>'
54
+ *
55
+ * Job directory: ~/.arc402/jobs/agreement-<id>/
56
+ */
57
+ const fs = __importStar(require("fs"));
58
+ const path = __importStar(require("path"));
59
+ const os = __importStar(require("os"));
60
+ const child_process_1 = require("child_process");
61
+ const job_lifecycle_js_1 = require("./job-lifecycle.js");
62
+ const ARC402_DIR = path.join(os.homedir(), ".arc402");
63
+ const JOBS_DIR = path.join(ARC402_DIR, "jobs");
64
+ const WORKER_DIR = process.env.ARC402_WORKER_DIR || path.join(ARC402_DIR, "worker");
65
+ // ─── Helpers: read worker context ─────────────────────────────────────────────
66
+ function readFileOrEmpty(filePath) {
67
+ try {
68
+ return fs.readFileSync(filePath, "utf-8").trim();
69
+ }
70
+ catch {
71
+ return "";
72
+ }
73
+ }
74
+ /**
75
+ * Read all .md files from a directory, concatenated, up to maxBytes.
76
+ * Returns empty string if dir doesn't exist or is empty.
77
+ */
78
+ function readDirMd(dirPath, maxBytes) {
79
+ if (!fs.existsSync(dirPath))
80
+ return "";
81
+ const parts = [];
82
+ let totalSize = 0;
83
+ try {
84
+ const files = fs.readdirSync(dirPath)
85
+ .filter(f => f.endsWith(".md") || f.endsWith(".txt") || f.endsWith(".json"))
86
+ .sort();
87
+ for (const file of files) {
88
+ if (file.startsWith("."))
89
+ continue;
90
+ const content = readFileOrEmpty(path.join(dirPath, file));
91
+ if (!content)
92
+ continue;
93
+ const entry = `### ${file}\n${content}`;
94
+ if (totalSize + entry.length > maxBytes)
95
+ break;
96
+ parts.push(entry);
97
+ totalSize += entry.length;
98
+ }
99
+ }
100
+ catch { /* dir unreadable */ }
101
+ return parts.join("\n\n");
102
+ }
103
+ // ─── WorkerExecutor ───────────────────────────────────────────────────────────
104
+ class WorkerExecutor {
105
+ constructor(opts) {
106
+ this.jobs = new Map();
107
+ this.queue = [];
108
+ this.runningCount = 0;
109
+ // Callback invoked when a job completes with a root hash
110
+ this.onJobCompleted = null;
111
+ this.onJobFailed = null;
112
+ this.log = () => { };
113
+ this.maxConcurrentJobs = opts.maxConcurrentJobs ?? 2;
114
+ this.jobTimeoutMs = (opts.jobTimeoutSeconds ?? 3600) * 1000;
115
+ this.agentType = opts.agentType ?? "claude-code";
116
+ this.autoExecute = opts.autoExecute ?? true;
117
+ this.delivery = opts.delivery;
118
+ }
119
+ // ── Public API ────────────────────────────────────────────────────────────
120
+ /**
121
+ * Enqueue a job. If auto_execute is true, starts immediately (up to concurrency limit).
122
+ * Returns the WorkerExecution record.
123
+ */
124
+ enqueue(params) {
125
+ const { agreementId, capability, specHash } = params;
126
+ // Idempotent — return existing record if present
127
+ const existing = this.jobs.get(agreementId);
128
+ if (existing)
129
+ return this.toPublic(existing);
130
+ const jobDir = (0, job_lifecycle_js_1.createJobDirectory)(agreementId);
131
+ // Write task.md to job dir
132
+ const taskText = params.taskDescription ?? this.buildTask(capability, specHash, agreementId);
133
+ fs.writeFileSync(path.join(jobDir, "task.md"), taskText, "utf-8");
134
+ const record = {
135
+ agreementId,
136
+ capability,
137
+ specHash,
138
+ jobDir,
139
+ agentType: this.agentType,
140
+ pid: null,
141
+ status: "queued",
142
+ startedAt: Date.now(),
143
+ completedAt: null,
144
+ exitCode: null,
145
+ deliverableHash: null,
146
+ error: null,
147
+ process: null,
148
+ timeoutHandle: null,
149
+ };
150
+ this.jobs.set(agreementId, record);
151
+ this.queue.push(agreementId);
152
+ this.log({ event: "worker_queued", agreement_id: agreementId, capability });
153
+ if (this.autoExecute) {
154
+ this.drainQueue();
155
+ }
156
+ return this.toPublic(record);
157
+ }
158
+ /**
159
+ * Get current status of a job.
160
+ */
161
+ getStatus(agreementId) {
162
+ const rec = this.jobs.get(agreementId);
163
+ return rec ? this.toPublic(rec) : null;
164
+ }
165
+ /**
166
+ * Get all jobs (for status IPC command).
167
+ */
168
+ listAll() {
169
+ return Array.from(this.jobs.values()).map(r => this.toPublic(r));
170
+ }
171
+ /**
172
+ * Read job log contents (for worker-logs IPC command).
173
+ */
174
+ readLog(agreementId, tail = 200) {
175
+ const logPath = path.join(JOBS_DIR, `agreement-${agreementId}`, "job.log");
176
+ if (!fs.existsSync(logPath))
177
+ return "(no log yet)";
178
+ try {
179
+ const content = fs.readFileSync(logPath, "utf-8");
180
+ const lines = content.split("\n");
181
+ return lines.slice(-tail).join("\n");
182
+ }
183
+ catch {
184
+ return "(could not read log)";
185
+ }
186
+ }
187
+ /**
188
+ * Cancel a queued job. Cannot cancel running jobs.
189
+ */
190
+ cancel(agreementId) {
191
+ const rec = this.jobs.get(agreementId);
192
+ if (!rec || rec.status !== "queued")
193
+ return false;
194
+ rec.status = "failed";
195
+ rec.error = "cancelled";
196
+ rec.completedAt = Date.now();
197
+ this.queue = this.queue.filter(id => id !== agreementId);
198
+ this.log({ event: "worker_cancelled", agreement_id: agreementId });
199
+ return true;
200
+ }
201
+ // ── Execution ─────────────────────────────────────────────────────────────
202
+ drainQueue() {
203
+ while (this.runningCount < this.maxConcurrentJobs && this.queue.length > 0) {
204
+ const next = this.queue.shift();
205
+ const rec = this.jobs.get(next);
206
+ if (!rec || rec.status !== "queued")
207
+ continue;
208
+ void this.runJob(rec);
209
+ }
210
+ }
211
+ async runJob(rec) {
212
+ this.runningCount++;
213
+ rec.status = "running";
214
+ rec.startedAt = Date.now();
215
+ const logPath = path.join(rec.jobDir, "job.log");
216
+ const logStream = fs.createWriteStream(logPath, { flags: "a" });
217
+ this.log({ event: "worker_started", agreement_id: rec.agreementId, agent: rec.agentType });
218
+ try {
219
+ const exitCode = await this.spawnAgent(rec, logStream);
220
+ rec.exitCode = exitCode;
221
+ if (exitCode !== 0) {
222
+ throw new Error(`agent exited with code ${exitCode}`);
223
+ }
224
+ // Collect output files and upload
225
+ const manifest = await this.collectDeliverables(rec, logStream);
226
+ rec.deliverableHash = manifest.root_hash;
227
+ rec.status = "completed";
228
+ rec.completedAt = Date.now();
229
+ this.log({
230
+ event: "worker_completed",
231
+ agreement_id: rec.agreementId,
232
+ root_hash: manifest.root_hash,
233
+ file_count: manifest.files.length,
234
+ duration_ms: rec.completedAt - rec.startedAt,
235
+ });
236
+ this.onJobCompleted?.(rec.agreementId, manifest.root_hash);
237
+ }
238
+ catch (err) {
239
+ const msg = String(err instanceof Error ? err.message : err);
240
+ rec.status = "failed";
241
+ rec.error = msg;
242
+ rec.completedAt = Date.now();
243
+ logStream.write(`\n[worker-executor] FAILED: ${msg}\n`);
244
+ this.log({ event: "worker_failed", agreement_id: rec.agreementId, error: msg });
245
+ this.onJobFailed?.(rec.agreementId, msg);
246
+ }
247
+ finally {
248
+ logStream.end();
249
+ rec.process = null;
250
+ if (rec.timeoutHandle) {
251
+ clearTimeout(rec.timeoutHandle);
252
+ rec.timeoutHandle = null;
253
+ }
254
+ this.runningCount--;
255
+ this.drainQueue();
256
+ }
257
+ }
258
+ spawnAgent(rec, logStream) {
259
+ return new Promise((resolve, reject) => {
260
+ const { cmd, args } = this.buildCommand(rec);
261
+ const taskText = this.buildTask(rec.capability, rec.specHash, rec.agreementId);
262
+ logStream.write(`[worker-executor] Spawning: ${cmd} ${args.join(" ")}\n`);
263
+ logStream.write(`[worker-executor] CWD: ${rec.jobDir}\n`);
264
+ logStream.write(`[worker-executor] Task: ${taskText.slice(0, 200)}\n\n`);
265
+ const child = (0, child_process_1.spawn)(cmd, [...args, taskText], {
266
+ cwd: rec.jobDir,
267
+ env: {
268
+ ...process.env,
269
+ // Do NOT pass ARC402_MACHINE_KEY to worker process — security boundary
270
+ ARC402_MACHINE_KEY: undefined,
271
+ // Job context so the agent knows its scope
272
+ ARC402_JOB_ID: rec.agreementId,
273
+ ARC402_WORKER_DIR: WORKER_DIR,
274
+ ARC402_JOB_DIR: rec.jobDir,
275
+ // Unset ANTHROPIC_API_KEY — let OAuth handle auth
276
+ ANTHROPIC_API_KEY: undefined,
277
+ },
278
+ stdio: ["ignore", "pipe", "pipe"],
279
+ });
280
+ rec.process = child;
281
+ if (child.pid)
282
+ rec.pid = child.pid;
283
+ child.stdout?.on("data", (chunk) => { logStream.write(chunk); });
284
+ child.stderr?.on("data", (chunk) => { logStream.write(chunk); });
285
+ // Job timeout
286
+ rec.timeoutHandle = setTimeout(() => {
287
+ logStream.write(`\n[worker-executor] TIMEOUT after ${this.jobTimeoutMs}ms\n`);
288
+ child.kill("SIGTERM");
289
+ setTimeout(() => { child.kill("SIGKILL"); }, 5000);
290
+ reject(new Error("job_timeout"));
291
+ }, this.jobTimeoutMs);
292
+ child.on("close", (code) => {
293
+ resolve(code ?? 1);
294
+ });
295
+ child.on("error", (err) => {
296
+ reject(new Error(`spawn_failed: ${err.message}`));
297
+ });
298
+ });
299
+ }
300
+ buildCommand(rec) {
301
+ switch (rec.agentType) {
302
+ case "openclaw":
303
+ // OpenClaw as the worker runtime — can spawn any ACP (Claude Code,
304
+ // Codex, Gemini, Pi, etc.) and orchestrate multi-agent workflows.
305
+ // This is the preferred runtime because it gives the worker full
306
+ // agent orchestration capability instead of being locked to one CLI.
307
+ return {
308
+ cmd: "openclaw",
309
+ args: ["run", "--workdir", rec.jobDir, "--"],
310
+ };
311
+ case "claude-code":
312
+ return {
313
+ cmd: "claude",
314
+ args: ["--permission-mode", "bypassPermissions", "--print"],
315
+ };
316
+ case "codex":
317
+ return {
318
+ cmd: "codex",
319
+ args: ["--print"],
320
+ };
321
+ case "shell":
322
+ return {
323
+ cmd: "/bin/sh",
324
+ args: ["-c"],
325
+ };
326
+ }
327
+ }
328
+ buildTask(capability, specHash, agreementId) {
329
+ // ── Worker context injection ──────────────────────────────────────────
330
+ // The worker is a specialised agent with identity, expertise, and memory.
331
+ // All of this is injected BEFORE the task so the agent operates as a
332
+ // trained professional, not a blank slate.
333
+ const soul = readFileOrEmpty(path.join(WORKER_DIR, "SOUL.md"));
334
+ const identity = readFileOrEmpty(path.join(WORKER_DIR, "IDENTITY.md"));
335
+ const learnings = readFileOrEmpty(path.join(WORKER_DIR, "memory", "learnings.md"));
336
+ const knowledge = readDirMd(path.join(WORKER_DIR, "knowledge"), 50000);
337
+ const datasets = readDirMd(path.join(WORKER_DIR, "datasets"), 20000);
338
+ // Task from hire request (may have been written by enqueue())
339
+ const taskFile = path.join(JOBS_DIR, `agreement-${agreementId}`, "task.md");
340
+ const taskContent = readFileOrEmpty(taskFile);
341
+ const sections = [];
342
+ if (soul)
343
+ sections.push(`## Your Identity & Role\n${soul}`);
344
+ if (identity)
345
+ sections.push(`## Identity Card\n${identity}`);
346
+ if (learnings && learnings !== "# Accumulated Learnings\n\nNo learnings yet. Complete your first job to start building expertise.") {
347
+ sections.push(`## Your Accumulated Expertise\nThese are learnings from your previous jobs. Use them.\n\n${learnings}`);
348
+ }
349
+ if (knowledge)
350
+ sections.push(`## Domain Knowledge\nReference material for your specialisation.\n\n${knowledge}`);
351
+ if (datasets)
352
+ sections.push(`## Reference Examples\n${datasets}`);
353
+ sections.push(`## Current Task
354
+ Agreement ID: ${agreementId}
355
+ Capability: ${capability}
356
+ Spec Hash: ${specHash}
357
+
358
+ ${taskContent || `Complete the work specified by the capability "${capability}".`}`);
359
+ sections.push(`## Output Instructions
360
+ Store all deliverable files in the current directory.
361
+ Write a deliverable.md summarizing your work and results.
362
+ Be thorough and professional. Your output will be hashed and delivered on-chain.`);
363
+ return sections.join("\n\n---\n\n");
364
+ }
365
+ async collectDeliverables(rec, logStream) {
366
+ logStream.write(`\n[worker-executor] Collecting deliverables from ${rec.jobDir}\n`);
367
+ // Exclude non-deliverable files
368
+ const excludes = ["task.md", "job.log"];
369
+ const manifest = this.delivery.storeDirectory(rec.agreementId, rec.jobDir, excludes);
370
+ logStream.write(`[worker-executor] Uploaded ${manifest.files.length} files, root_hash: ${manifest.root_hash}\n`);
371
+ return manifest;
372
+ }
373
+ // ── Helpers ───────────────────────────────────────────────────────────────
374
+ toPublic(rec) {
375
+ const { process: _proc, timeoutHandle: _th, ...pub } = rec;
376
+ void _proc;
377
+ void _th;
378
+ return pub;
379
+ }
380
+ }
381
+ exports.WorkerExecutor = WorkerExecutor;
382
+ //# sourceMappingURL=worker-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-executor.js","sourceRoot":"","sources":["../../src/daemon/worker-executor.ts"],"names":[],"mappings":"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"}
package/dist/drain-v4.js CHANGED
@@ -1,22 +1,60 @@
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 });
1
39
  /**
2
40
  * drain-v4.ts
3
41
  * Drains ETH from v4 wallet (0xb4aF8760) to owner (0x7745772d) via WalletConnect.
4
42
  * Steps: openContext → attest → executeSpend → closeContext
5
43
  */
6
- import { ethers } from "ethers";
7
- import { SignClient } from "@walletconnect/sign-client";
8
- import { KeyValueStorage } from "@walletconnect/keyvaluestorage";
9
- import { printQR } from "./ui/qr-render.js";
10
- import path from "path";
11
- import os from "os";
12
- import * as fs from "fs";
44
+ const ethers_1 = require("ethers");
45
+ const sign_client_1 = require("@walletconnect/sign-client");
46
+ const keyvaluestorage_1 = require("@walletconnect/keyvaluestorage");
47
+ const qr_render_js_1 = require("./ui/qr-render.js");
48
+ const path_1 = __importDefault(require("path"));
49
+ const os_1 = __importDefault(require("os"));
50
+ const fs = __importStar(require("fs"));
13
51
  const V4_WALLET = "0xb4aF8760d349a6A4C8495Ae4da9089bC84994eE6";
14
52
  const OWNER = "0x7745772d67Cd52c1F38706bF5550AdcD925c7c00";
15
53
  const INTENT_ATTEST = "0x7ad8db6C5f394542E8e9658F86C85cC99Cf6D460";
16
54
  const CHAIN_ID = 8453;
17
55
  const RPC = "https://base-mainnet.g.alchemy.com/v2/YIA2uRCsFI-j5pqH-aRzflrACSlV1Qrs";
18
56
  // Leave 0.00005 ETH for gas
19
- const DRAIN_AMOUNT = ethers.parseEther("0.00045");
57
+ const DRAIN_AMOUNT = ethers_1.ethers.parseEther("0.00045");
20
58
  const WALLET_ABI = [
21
59
  "function openContext(bytes32 contextId, string calldata taskType) external",
22
60
  "function attest(bytes32 attestationId, string calldata action, string calldata reason, address recipient, uint256 amount, address token, uint256 expiresAt) external",
@@ -28,24 +66,24 @@ const ATTEST_ABI = [
28
66
  "function attest(bytes32 attestationId, string calldata action, string calldata reason, address recipient, uint256 amount, address token, uint256 expiresAt) external",
29
67
  ];
30
68
  async function main() {
31
- const provider = new ethers.JsonRpcProvider(RPC);
69
+ const provider = new ethers_1.ethers.JsonRpcProvider(RPC);
32
70
  const balance = await provider.getBalance(V4_WALLET);
33
- console.log(`v4 balance: ${ethers.formatEther(balance)} ETH`);
71
+ console.log(`v4 balance: ${ethers_1.ethers.formatEther(balance)} ETH`);
34
72
  if (balance < DRAIN_AMOUNT) {
35
73
  console.error("Insufficient balance");
36
74
  process.exit(1);
37
75
  }
38
76
  // Load config for machine key
39
- const config = JSON.parse(fs.readFileSync(path.join(os.homedir(), ".arc402/config.json"), "utf8"));
40
- const machineKey = new ethers.Wallet(config.privateKey, provider);
77
+ const config = JSON.parse(fs.readFileSync(path_1.default.join(os_1.default.homedir(), ".arc402/config.json"), "utf8"));
78
+ const machineKey = new ethers_1.ethers.Wallet(config.privateKey, provider);
41
79
  console.log(`Machine key: ${machineKey.address}`);
42
80
  // WalletConnect setup
43
81
  const projectId = config.walletConnectProjectId;
44
- const storagePath = path.join(os.homedir(), ".arc402/wc-storage.json");
45
- const client = await SignClient.init({
82
+ const storagePath = path_1.default.join(os_1.default.homedir(), ".arc402/wc-storage.json");
83
+ const client = await sign_client_1.SignClient.init({
46
84
  projectId,
47
85
  metadata: { name: "ARC-402 Drain v4", description: "Drain v4 wallet ETH to owner", url: "https://app.arc402.xyz", icons: [] },
48
- storage: new KeyValueStorage({ database: storagePath }),
86
+ storage: new keyvaluestorage_1.KeyValueStorage({ database: storagePath }),
49
87
  });
50
88
  const { uri, approval } = await client.connect({
51
89
  requiredNamespaces: {
@@ -57,16 +95,16 @@ async function main() {
57
95
  },
58
96
  });
59
97
  console.log("\nScan this QR in MetaMask (make sure you're on Base):\n");
60
- printQR(uri);
98
+ (0, qr_render_js_1.printQR)(uri);
61
99
  console.log(`\nMetaMask deep link:\nmetamask://wc?uri=${encodeURIComponent(uri)}\n`);
62
100
  console.log("Waiting for MetaMask approval...");
63
101
  const session = await approval();
64
102
  console.log("✓ MetaMask connected");
65
103
  // Build transactions
66
- const walletIface = new ethers.Interface(WALLET_ABI);
67
- const attestIface = new ethers.Interface(ATTEST_ABI);
68
- const contextId = ethers.keccak256(ethers.toUtf8Bytes(`drain-${Date.now()}`));
69
- const attestationId = ethers.keccak256(ethers.toUtf8Bytes(`attest-${Date.now()}`));
104
+ const walletIface = new ethers_1.ethers.Interface(WALLET_ABI);
105
+ const attestIface = new ethers_1.ethers.Interface(ATTEST_ABI);
106
+ const contextId = ethers_1.ethers.keccak256(ethers_1.ethers.toUtf8Bytes(`drain-${Date.now()}`));
107
+ const attestationId = ethers_1.ethers.keccak256(ethers_1.ethers.toUtf8Bytes(`attest-${Date.now()}`));
70
108
  const expiry = Math.floor(Date.now() / 1000) + 600; // 10 min
71
109
  const account = session.namespaces.eip155.accounts[0].split(":")[2];
72
110
  console.log(`Owner address: ${account}`);
@@ -88,7 +126,7 @@ async function main() {
88
126
  }
89
127
  // Step 1: close stale context via machine key if needed
90
128
  console.log("\nStep 1: Checking context state...");
91
- const walletContract = new ethers.Contract(V4_WALLET, WALLET_ABI, machineKey);
129
+ const walletContract = new ethers_1.ethers.Contract(V4_WALLET, WALLET_ABI, machineKey);
92
130
  const isOpen = await walletContract.contextOpen();
93
131
  if (isOpen) {
94
132
  console.log(" Stale context found — closing it...");
@@ -99,16 +137,16 @@ async function main() {
99
137
  }
100
138
  // Step 2: owner opens context (MetaMask signs — so simulation sees it)
101
139
  console.log("\nStep 2: Owner opens context via MetaMask...");
102
- await sendTx(V4_WALLET, new ethers.Interface(WALLET_ABI).encodeFunctionData("openContext", [contextId, "drain"]), "Open context");
140
+ await sendTx(V4_WALLET, new ethers_1.ethers.Interface(WALLET_ABI).encodeFunctionData("openContext", [contextId, "drain"]), "Open context");
103
141
  // Step 3: call attest() directly on wallet (onlyOwnerOrMachineKey — no executeContractCall needed)
104
- const walletIface2 = new ethers.Interface(WALLET_ABI);
142
+ const walletIface2 = new ethers_1.ethers.Interface(WALLET_ABI);
105
143
  await sendTx(V4_WALLET, walletIface2.encodeFunctionData("attest", [
106
144
  attestationId,
107
145
  "spend",
108
146
  "drain v4 to owner",
109
147
  OWNER,
110
148
  DRAIN_AMOUNT,
111
- ethers.ZeroAddress,
149
+ ethers_1.ethers.ZeroAddress,
112
150
  expiry,
113
151
  ]), "Create spend attestation");
114
152
  // Step 4: machine key executes spend
@@ -121,8 +159,8 @@ async function main() {
121
159
  await closeTx.wait();
122
160
  console.log(`✓ Context closed: ${closeTx.hash}`);
123
161
  const newBalance = await provider.getBalance(V4_WALLET);
124
- console.log(`\nv4 remaining balance: ${ethers.formatEther(newBalance)} ETH`);
125
- console.log(`Done. ${ethers.formatEther(DRAIN_AMOUNT)} ETH sent to ${OWNER}`);
162
+ console.log(`\nv4 remaining balance: ${ethers_1.ethers.formatEther(newBalance)} ETH`);
163
+ console.log(`Done. ${ethers_1.ethers.formatEther(DRAIN_AMOUNT)} ETH sent to ${OWNER}`);
126
164
  process.exit(0);
127
165
  }
128
166
  main().catch(e => { console.error(e); process.exit(1); });
@@ -1 +1 @@
1
- {"version":3,"file":"drain-v4.js","sourceRoot":"","sources":["../src/drain-v4.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"drain-v4.js","sourceRoot":"","sources":["../src/drain-v4.ts"],"names":[],"mappings":"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"}