arc402-cli 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (308) hide show
  1. package/README.md +245 -0
  2. package/dist/abis.d.ts +19 -0
  3. package/dist/abis.d.ts.map +1 -0
  4. package/dist/abis.js +177 -0
  5. package/dist/abis.js.map +1 -0
  6. package/dist/bundler.d.ts +65 -0
  7. package/dist/bundler.d.ts.map +1 -0
  8. package/dist/bundler.js +181 -0
  9. package/dist/bundler.js.map +1 -0
  10. package/dist/client.d.ts +14 -0
  11. package/dist/client.d.ts.map +1 -0
  12. package/dist/client.js +24 -0
  13. package/dist/client.js.map +1 -0
  14. package/dist/coinbase-smart-wallet.d.ts +28 -0
  15. package/dist/coinbase-smart-wallet.d.ts.map +1 -0
  16. package/dist/coinbase-smart-wallet.js +38 -0
  17. package/dist/coinbase-smart-wallet.js.map +1 -0
  18. package/dist/commands/accept.d.ts +3 -0
  19. package/dist/commands/accept.d.ts.map +1 -0
  20. package/dist/commands/accept.js +26 -0
  21. package/dist/commands/accept.js.map +1 -0
  22. package/dist/commands/agent-handshake.d.ts +3 -0
  23. package/dist/commands/agent-handshake.d.ts.map +1 -0
  24. package/dist/commands/agent-handshake.js +61 -0
  25. package/dist/commands/agent-handshake.js.map +1 -0
  26. package/dist/commands/agent.d.ts +3 -0
  27. package/dist/commands/agent.d.ts.map +1 -0
  28. package/dist/commands/agent.js +417 -0
  29. package/dist/commands/agent.js.map +1 -0
  30. package/dist/commands/agreements.d.ts +3 -0
  31. package/dist/commands/agreements.d.ts.map +1 -0
  32. package/dist/commands/agreements.js +344 -0
  33. package/dist/commands/agreements.js.map +1 -0
  34. package/dist/commands/arbitrator.d.ts +3 -0
  35. package/dist/commands/arbitrator.d.ts.map +1 -0
  36. package/dist/commands/arbitrator.js +157 -0
  37. package/dist/commands/arbitrator.js.map +1 -0
  38. package/dist/commands/arena-handshake.d.ts +3 -0
  39. package/dist/commands/arena-handshake.d.ts.map +1 -0
  40. package/dist/commands/arena-handshake.js +187 -0
  41. package/dist/commands/arena-handshake.js.map +1 -0
  42. package/dist/commands/cancel.d.ts +3 -0
  43. package/dist/commands/cancel.d.ts.map +1 -0
  44. package/dist/commands/cancel.js +30 -0
  45. package/dist/commands/cancel.js.map +1 -0
  46. package/dist/commands/channel.d.ts +3 -0
  47. package/dist/commands/channel.d.ts.map +1 -0
  48. package/dist/commands/channel.js +238 -0
  49. package/dist/commands/channel.js.map +1 -0
  50. package/dist/commands/coldstart.d.ts +3 -0
  51. package/dist/commands/coldstart.d.ts.map +1 -0
  52. package/dist/commands/coldstart.js +148 -0
  53. package/dist/commands/coldstart.js.map +1 -0
  54. package/dist/commands/config.d.ts +3 -0
  55. package/dist/commands/config.d.ts.map +1 -0
  56. package/dist/commands/config.js +40 -0
  57. package/dist/commands/config.js.map +1 -0
  58. package/dist/commands/contract-interaction.d.ts +3 -0
  59. package/dist/commands/contract-interaction.d.ts.map +1 -0
  60. package/dist/commands/contract-interaction.js +165 -0
  61. package/dist/commands/contract-interaction.js.map +1 -0
  62. package/dist/commands/daemon.d.ts +3 -0
  63. package/dist/commands/daemon.d.ts.map +1 -0
  64. package/dist/commands/daemon.js +891 -0
  65. package/dist/commands/daemon.js.map +1 -0
  66. package/dist/commands/deliver.d.ts +3 -0
  67. package/dist/commands/deliver.d.ts.map +1 -0
  68. package/dist/commands/deliver.js +156 -0
  69. package/dist/commands/deliver.js.map +1 -0
  70. package/dist/commands/discover.d.ts +3 -0
  71. package/dist/commands/discover.d.ts.map +1 -0
  72. package/dist/commands/discover.js +224 -0
  73. package/dist/commands/discover.js.map +1 -0
  74. package/dist/commands/dispute.d.ts +3 -0
  75. package/dist/commands/dispute.d.ts.map +1 -0
  76. package/dist/commands/dispute.js +348 -0
  77. package/dist/commands/dispute.js.map +1 -0
  78. package/dist/commands/endpoint.d.ts +3 -0
  79. package/dist/commands/endpoint.d.ts.map +1 -0
  80. package/dist/commands/endpoint.js +604 -0
  81. package/dist/commands/endpoint.js.map +1 -0
  82. package/dist/commands/hire.d.ts +3 -0
  83. package/dist/commands/hire.d.ts.map +1 -0
  84. package/dist/commands/hire.js +189 -0
  85. package/dist/commands/hire.js.map +1 -0
  86. package/dist/commands/migrate.d.ts +3 -0
  87. package/dist/commands/migrate.d.ts.map +1 -0
  88. package/dist/commands/migrate.js +163 -0
  89. package/dist/commands/migrate.js.map +1 -0
  90. package/dist/commands/negotiate.d.ts +3 -0
  91. package/dist/commands/negotiate.d.ts.map +1 -0
  92. package/dist/commands/negotiate.js +247 -0
  93. package/dist/commands/negotiate.js.map +1 -0
  94. package/dist/commands/openshell.d.ts +3 -0
  95. package/dist/commands/openshell.d.ts.map +1 -0
  96. package/dist/commands/openshell.js +952 -0
  97. package/dist/commands/openshell.js.map +1 -0
  98. package/dist/commands/owner.d.ts +3 -0
  99. package/dist/commands/owner.d.ts.map +1 -0
  100. package/dist/commands/owner.js +32 -0
  101. package/dist/commands/owner.js.map +1 -0
  102. package/dist/commands/policy.d.ts +4 -0
  103. package/dist/commands/policy.d.ts.map +1 -0
  104. package/dist/commands/policy.js +248 -0
  105. package/dist/commands/policy.js.map +1 -0
  106. package/dist/commands/relay.d.ts +3 -0
  107. package/dist/commands/relay.d.ts.map +1 -0
  108. package/dist/commands/relay.js +279 -0
  109. package/dist/commands/relay.js.map +1 -0
  110. package/dist/commands/remediate.d.ts +3 -0
  111. package/dist/commands/remediate.d.ts.map +1 -0
  112. package/dist/commands/remediate.js +42 -0
  113. package/dist/commands/remediate.js.map +1 -0
  114. package/dist/commands/reputation.d.ts +4 -0
  115. package/dist/commands/reputation.d.ts.map +1 -0
  116. package/dist/commands/reputation.js +72 -0
  117. package/dist/commands/reputation.js.map +1 -0
  118. package/dist/commands/setup.d.ts +3 -0
  119. package/dist/commands/setup.d.ts.map +1 -0
  120. package/dist/commands/setup.js +332 -0
  121. package/dist/commands/setup.js.map +1 -0
  122. package/dist/commands/trust.d.ts +3 -0
  123. package/dist/commands/trust.d.ts.map +1 -0
  124. package/dist/commands/trust.js +23 -0
  125. package/dist/commands/trust.js.map +1 -0
  126. package/dist/commands/verify.d.ts +3 -0
  127. package/dist/commands/verify.d.ts.map +1 -0
  128. package/dist/commands/verify.js +88 -0
  129. package/dist/commands/verify.js.map +1 -0
  130. package/dist/commands/wallet.d.ts +3 -0
  131. package/dist/commands/wallet.d.ts.map +1 -0
  132. package/dist/commands/wallet.js +2520 -0
  133. package/dist/commands/wallet.js.map +1 -0
  134. package/dist/commands/watchtower.d.ts +3 -0
  135. package/dist/commands/watchtower.d.ts.map +1 -0
  136. package/dist/commands/watchtower.js +238 -0
  137. package/dist/commands/watchtower.js.map +1 -0
  138. package/dist/commands/workroom.d.ts +3 -0
  139. package/dist/commands/workroom.d.ts.map +1 -0
  140. package/dist/commands/workroom.js +855 -0
  141. package/dist/commands/workroom.js.map +1 -0
  142. package/dist/config.d.ts +62 -0
  143. package/dist/config.d.ts.map +1 -0
  144. package/dist/config.js +141 -0
  145. package/dist/config.js.map +1 -0
  146. package/dist/daemon/config.d.ts +74 -0
  147. package/dist/daemon/config.d.ts.map +1 -0
  148. package/dist/daemon/config.js +271 -0
  149. package/dist/daemon/config.js.map +1 -0
  150. package/dist/daemon/hire-listener.d.ts +31 -0
  151. package/dist/daemon/hire-listener.d.ts.map +1 -0
  152. package/dist/daemon/hire-listener.js +207 -0
  153. package/dist/daemon/hire-listener.js.map +1 -0
  154. package/dist/daemon/index.d.ts +29 -0
  155. package/dist/daemon/index.d.ts.map +1 -0
  156. package/dist/daemon/index.js +535 -0
  157. package/dist/daemon/index.js.map +1 -0
  158. package/dist/daemon/job-lifecycle.d.ts +62 -0
  159. package/dist/daemon/job-lifecycle.d.ts.map +1 -0
  160. package/dist/daemon/job-lifecycle.js +201 -0
  161. package/dist/daemon/job-lifecycle.js.map +1 -0
  162. package/dist/daemon/notify.d.ts +22 -0
  163. package/dist/daemon/notify.d.ts.map +1 -0
  164. package/dist/daemon/notify.js +148 -0
  165. package/dist/daemon/notify.js.map +1 -0
  166. package/dist/daemon/token-metering.d.ts +42 -0
  167. package/dist/daemon/token-metering.d.ts.map +1 -0
  168. package/dist/daemon/token-metering.js +178 -0
  169. package/dist/daemon/token-metering.js.map +1 -0
  170. package/dist/daemon/userops.d.ts +21 -0
  171. package/dist/daemon/userops.d.ts.map +1 -0
  172. package/dist/daemon/userops.js +88 -0
  173. package/dist/daemon/userops.js.map +1 -0
  174. package/dist/daemon/wallet-monitor.d.ts +16 -0
  175. package/dist/daemon/wallet-monitor.d.ts.map +1 -0
  176. package/dist/daemon/wallet-monitor.js +57 -0
  177. package/dist/daemon/wallet-monitor.js.map +1 -0
  178. package/dist/drain-v4.d.ts +2 -0
  179. package/dist/drain-v4.d.ts.map +1 -0
  180. package/dist/drain-v4.js +167 -0
  181. package/dist/drain-v4.js.map +1 -0
  182. package/dist/endpoint-config.d.ts +36 -0
  183. package/dist/endpoint-config.d.ts.map +1 -0
  184. package/dist/endpoint-config.js +96 -0
  185. package/dist/endpoint-config.js.map +1 -0
  186. package/dist/index.d.ts +3 -0
  187. package/dist/index.d.ts.map +1 -0
  188. package/dist/index.js +79 -0
  189. package/dist/index.js.map +1 -0
  190. package/dist/openshell-runtime.d.ts +55 -0
  191. package/dist/openshell-runtime.d.ts.map +1 -0
  192. package/dist/openshell-runtime.js +268 -0
  193. package/dist/openshell-runtime.js.map +1 -0
  194. package/dist/signing.d.ts +2 -0
  195. package/dist/signing.d.ts.map +1 -0
  196. package/dist/signing.js +23 -0
  197. package/dist/signing.js.map +1 -0
  198. package/dist/telegram-notify.d.ts +23 -0
  199. package/dist/telegram-notify.d.ts.map +1 -0
  200. package/dist/telegram-notify.js +106 -0
  201. package/dist/telegram-notify.js.map +1 -0
  202. package/dist/ui/banner.d.ts +7 -0
  203. package/dist/ui/banner.d.ts.map +1 -0
  204. package/dist/ui/banner.js +37 -0
  205. package/dist/ui/banner.js.map +1 -0
  206. package/dist/ui/colors.d.ts +14 -0
  207. package/dist/ui/colors.d.ts.map +1 -0
  208. package/dist/ui/colors.js +29 -0
  209. package/dist/ui/colors.js.map +1 -0
  210. package/dist/ui/format.d.ts +26 -0
  211. package/dist/ui/format.d.ts.map +1 -0
  212. package/dist/ui/format.js +77 -0
  213. package/dist/ui/format.js.map +1 -0
  214. package/dist/ui/spinner.d.ts +8 -0
  215. package/dist/ui/spinner.d.ts.map +1 -0
  216. package/dist/ui/spinner.js +43 -0
  217. package/dist/ui/spinner.js.map +1 -0
  218. package/dist/utils/format.d.ts +10 -0
  219. package/dist/utils/format.d.ts.map +1 -0
  220. package/dist/utils/format.js +61 -0
  221. package/dist/utils/format.js.map +1 -0
  222. package/dist/utils/hash.d.ts +3 -0
  223. package/dist/utils/hash.d.ts.map +1 -0
  224. package/dist/utils/hash.js +43 -0
  225. package/dist/utils/hash.js.map +1 -0
  226. package/dist/utils/time.d.ts +3 -0
  227. package/dist/utils/time.d.ts.map +1 -0
  228. package/dist/utils/time.js +21 -0
  229. package/dist/utils/time.js.map +1 -0
  230. package/dist/wallet-router.d.ts +25 -0
  231. package/dist/wallet-router.d.ts.map +1 -0
  232. package/dist/wallet-router.js +153 -0
  233. package/dist/wallet-router.js.map +1 -0
  234. package/dist/walletconnect-session.d.ts +12 -0
  235. package/dist/walletconnect-session.d.ts.map +1 -0
  236. package/dist/walletconnect-session.js +26 -0
  237. package/dist/walletconnect-session.js.map +1 -0
  238. package/dist/walletconnect.d.ts +46 -0
  239. package/dist/walletconnect.d.ts.map +1 -0
  240. package/dist/walletconnect.js +267 -0
  241. package/dist/walletconnect.js.map +1 -0
  242. package/package.json +38 -0
  243. package/scripts/authorize-machine-key.ts +43 -0
  244. package/scripts/drain-wallet.ts +149 -0
  245. package/scripts/execute-spend-only.ts +81 -0
  246. package/scripts/register-agent-userop.ts +186 -0
  247. package/src/abis.ts +187 -0
  248. package/src/bundler.ts +235 -0
  249. package/src/client.ts +34 -0
  250. package/src/coinbase-smart-wallet.ts +51 -0
  251. package/src/commands/accept.ts +25 -0
  252. package/src/commands/agent-handshake.ts +67 -0
  253. package/src/commands/agent.ts +458 -0
  254. package/src/commands/agreements.ts +324 -0
  255. package/src/commands/arbitrator.ts +129 -0
  256. package/src/commands/arena-handshake.ts +217 -0
  257. package/src/commands/cancel.ts +26 -0
  258. package/src/commands/channel.ts +208 -0
  259. package/src/commands/coldstart.ts +156 -0
  260. package/src/commands/config.ts +35 -0
  261. package/src/commands/contract-interaction.ts +166 -0
  262. package/src/commands/daemon.ts +971 -0
  263. package/src/commands/deliver.ts +116 -0
  264. package/src/commands/discover.ts +295 -0
  265. package/src/commands/dispute.ts +373 -0
  266. package/src/commands/endpoint.ts +619 -0
  267. package/src/commands/hire.ts +200 -0
  268. package/src/commands/migrate.ts +175 -0
  269. package/src/commands/negotiate.ts +270 -0
  270. package/src/commands/openshell.ts +1053 -0
  271. package/src/commands/owner.ts +30 -0
  272. package/src/commands/policy.ts +252 -0
  273. package/src/commands/relay.ts +272 -0
  274. package/src/commands/remediate.ts +22 -0
  275. package/src/commands/reputation.ts +71 -0
  276. package/src/commands/setup.ts +343 -0
  277. package/src/commands/trust.ts +15 -0
  278. package/src/commands/verify.ts +88 -0
  279. package/src/commands/wallet.ts +2892 -0
  280. package/src/commands/watchtower.ts +232 -0
  281. package/src/commands/workroom.ts +889 -0
  282. package/src/config.ts +153 -0
  283. package/src/daemon/config.ts +308 -0
  284. package/src/daemon/hire-listener.ts +226 -0
  285. package/src/daemon/index.ts +609 -0
  286. package/src/daemon/job-lifecycle.ts +215 -0
  287. package/src/daemon/notify.ts +157 -0
  288. package/src/daemon/token-metering.ts +183 -0
  289. package/src/daemon/userops.ts +119 -0
  290. package/src/daemon/wallet-monitor.ts +90 -0
  291. package/src/drain-v4.ts +159 -0
  292. package/src/endpoint-config.ts +83 -0
  293. package/src/index.ts +75 -0
  294. package/src/openshell-runtime.ts +277 -0
  295. package/src/signing.ts +28 -0
  296. package/src/telegram-notify.ts +88 -0
  297. package/src/ui/banner.ts +41 -0
  298. package/src/ui/colors.ts +30 -0
  299. package/src/ui/format.ts +77 -0
  300. package/src/ui/spinner.ts +46 -0
  301. package/src/utils/format.ts +48 -0
  302. package/src/utils/hash.ts +5 -0
  303. package/src/utils/time.ts +15 -0
  304. package/src/wallet-router.ts +178 -0
  305. package/src/walletconnect-session.ts +27 -0
  306. package/src/walletconnect.ts +294 -0
  307. package/test/time.test.js +11 -0
  308. package/tsconfig.json +19 -0
@@ -0,0 +1,201 @@
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.generateReceipt = generateReceipt;
37
+ exports.extractLearnings = extractLearnings;
38
+ exports.createJobDirectory = createJobDirectory;
39
+ exports.cleanJobDirectory = cleanJobDirectory;
40
+ exports.computePolicyHash = computePolicyHash;
41
+ /**
42
+ * ARC-402 Job Lifecycle — Post-delivery processing.
43
+ *
44
+ * Handles everything that happens after a worker completes a job:
45
+ * 1. Execution receipt generation
46
+ * 2. Learning extraction from completed work
47
+ * 3. Worker memory update
48
+ * 4. Per-agreement job directory management
49
+ *
50
+ * These functions are called by the daemon after a successful delivery.
51
+ */
52
+ const fs = __importStar(require("fs"));
53
+ const path = __importStar(require("path"));
54
+ const os = __importStar(require("os"));
55
+ const crypto = __importStar(require("crypto"));
56
+ const token_metering_1 = require("./token-metering");
57
+ const ARC402_DIR = path.join(os.homedir(), ".arc402");
58
+ const RECEIPTS_DIR = path.join(ARC402_DIR, "receipts");
59
+ const WORKER_DIR = path.join(ARC402_DIR, "worker");
60
+ const WORKER_MEMORY_DIR = path.join(WORKER_DIR, "memory");
61
+ const WORKER_CONFIG = path.join(WORKER_DIR, "config.json");
62
+ const JOBS_DIR = path.join(ARC402_DIR, "jobs");
63
+ /**
64
+ * Generate and persist an execution receipt after job delivery.
65
+ */
66
+ function generateReceipt(params) {
67
+ fs.mkdirSync(RECEIPTS_DIR, { recursive: true });
68
+ // Compute policy hash
69
+ let policyHash = "0x0";
70
+ const policyPath = params.policyFilePath ?? path.join(ARC402_DIR, "openshell-policy.yaml");
71
+ if (fs.existsSync(policyPath)) {
72
+ const content = fs.readFileSync(policyPath, "utf-8");
73
+ policyHash = "0x" + crypto.createHash("sha256").update(content).digest("hex");
74
+ }
75
+ // Calculate wall clock time
76
+ const started = new Date(params.startedAt).getTime();
77
+ const completed = new Date(params.completedAt).getTime();
78
+ const wallClockSeconds = Math.max(0, Math.floor((completed - started) / 1000));
79
+ // Read token usage report (if the worker wrote one)
80
+ const tokenUsage = (0, token_metering_1.readUsageReport)(params.agreementId);
81
+ const receipt = {
82
+ schema: "arc402.execution-receipt.v1",
83
+ agreement_id: params.agreementId,
84
+ workroom_policy_hash: policyHash,
85
+ started_at: params.startedAt,
86
+ completed_at: params.completedAt,
87
+ deliverable_hash: params.deliverableHash,
88
+ worker_address: params.walletAddress,
89
+ metrics: {
90
+ wall_clock_seconds: wallClockSeconds,
91
+ network_hosts_contacted: params.networkHosts ?? [],
92
+ policy_violations_attempted: 0,
93
+ },
94
+ token_usage: tokenUsage,
95
+ receipt_hash: "", // filled below
96
+ };
97
+ // Receipt hash = SHA-256 of the receipt content (without the hash field)
98
+ const hashInput = JSON.stringify({ ...receipt, receipt_hash: undefined });
99
+ receipt.receipt_hash = "0x" + crypto.createHash("sha256").update(hashInput).digest("hex");
100
+ // Persist
101
+ const receiptPath = path.join(RECEIPTS_DIR, `${params.agreementId}.json`);
102
+ fs.writeFileSync(receiptPath, JSON.stringify(receipt, null, 2));
103
+ return receipt;
104
+ }
105
+ // ─── Learning Extraction ──────────────────────────────────────────────────────
106
+ /**
107
+ * Extract learnings from a completed job and update worker memory.
108
+ *
109
+ * This creates:
110
+ * 1. A per-job memory file: memory/job-<id>.md
111
+ * 2. Updates the cumulative learnings.md
112
+ * 3. Updates the worker config (job count, earnings)
113
+ */
114
+ function extractLearnings(params) {
115
+ fs.mkdirSync(WORKER_MEMORY_DIR, { recursive: true });
116
+ const now = new Date().toISOString();
117
+ const dateStr = now.split("T")[0];
118
+ // 1. Per-job memory file
119
+ const jobMemory = `# Job: ${params.agreementId}
120
+ *Completed: ${now}*
121
+ *Capability: ${params.capability}*
122
+ *Price: ${params.priceEth} ETH*
123
+ *Duration: ${params.wallClockSeconds}s*
124
+ *Outcome: ${params.success ? "delivered" : "failed"}*
125
+
126
+ ## Task
127
+ ${params.taskDescription}
128
+
129
+ ## Deliverable
130
+ Hash: ${params.deliverableHash}
131
+
132
+ ## Learnings
133
+ - Completed ${params.capability} task in ${params.wallClockSeconds}s
134
+ - ${params.success ? "Delivered successfully" : "Delivery failed — review required"}
135
+ `;
136
+ const jobFile = path.join(WORKER_MEMORY_DIR, `job-${params.agreementId}.md`);
137
+ fs.writeFileSync(jobFile, jobMemory);
138
+ // 2. Update cumulative learnings.md
139
+ const learningsPath = path.join(WORKER_MEMORY_DIR, "learnings.md");
140
+ let learnings = "";
141
+ if (fs.existsSync(learningsPath)) {
142
+ learnings = fs.readFileSync(learningsPath, "utf-8");
143
+ }
144
+ const newEntry = `\n### ${dateStr} — ${params.capability} (${params.agreementId.slice(0, 8)}...)
145
+ - Duration: ${params.wallClockSeconds}s | Price: ${params.priceEth} ETH | Outcome: ${params.success ? "✓" : "✗"}
146
+ `;
147
+ // Append to learnings
148
+ if (learnings.includes("No learnings yet")) {
149
+ learnings = `# Accumulated Learnings\n\n*Auto-updated after each completed job.*\n${newEntry}`;
150
+ }
151
+ else {
152
+ learnings += newEntry;
153
+ }
154
+ fs.writeFileSync(learningsPath, learnings);
155
+ // 3. Update worker config
156
+ if (fs.existsSync(WORKER_CONFIG)) {
157
+ try {
158
+ const config = JSON.parse(fs.readFileSync(WORKER_CONFIG, "utf-8"));
159
+ config.job_count = (config.job_count || 0) + 1;
160
+ const currentEarnings = parseFloat(config.total_earned_eth || "0");
161
+ const jobEarnings = parseFloat(params.priceEth || "0");
162
+ config.total_earned_eth = (currentEarnings + jobEarnings).toFixed(6);
163
+ config.last_job_at = now;
164
+ fs.writeFileSync(WORKER_CONFIG, JSON.stringify(config, null, 2));
165
+ }
166
+ catch { /* non-fatal — config may be malformed */ }
167
+ }
168
+ }
169
+ // ─── Per-Agreement Job Directory ──────────────────────────────────────────────
170
+ /**
171
+ * Create an isolated job directory for a specific agreement.
172
+ * Returns the path to the job workspace.
173
+ */
174
+ function createJobDirectory(agreementId) {
175
+ const jobDir = path.join(JOBS_DIR, `agreement-${agreementId}`);
176
+ fs.mkdirSync(jobDir, { recursive: true });
177
+ return jobDir;
178
+ }
179
+ /**
180
+ * Clean up a job directory after settlement.
181
+ * Preserves the receipt and job memory — only removes working files.
182
+ */
183
+ function cleanJobDirectory(agreementId) {
184
+ const jobDir = path.join(JOBS_DIR, `agreement-${agreementId}`);
185
+ if (fs.existsSync(jobDir)) {
186
+ fs.rmSync(jobDir, { recursive: true, force: true });
187
+ }
188
+ }
189
+ // ─── Policy Hash ──────────────────────────────────────────────────────────────
190
+ /**
191
+ * Compute the SHA-256 hash of the current workroom policy.
192
+ * This hash can be registered in AgentRegistry for verifiability.
193
+ */
194
+ function computePolicyHash(policyFilePath) {
195
+ const policyPath = policyFilePath ?? path.join(ARC402_DIR, "openshell-policy.yaml");
196
+ if (!fs.existsSync(policyPath))
197
+ return "0x0";
198
+ const content = fs.readFileSync(policyPath, "utf-8");
199
+ return "0x" + crypto.createHash("sha256").update(content).digest("hex");
200
+ }
201
+ //# sourceMappingURL=job-lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job-lifecycle.js","sourceRoot":"","sources":["../../src/daemon/job-lifecycle.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8CA,0CAqDC;AAYD,4CAmEC;AAQD,gDAIC;AAMD,8CAKC;AAQD,8CAKC;AAtND;;;;;;;;;;GAUG;AACH,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AACzB,+CAAiC;AACjC,qDAA8E;AAE9E,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AACtD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AACvD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AACnD,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AAC1D,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;AAqB/C;;GAEG;AACH,SAAgB,eAAe,CAAC,MAQ/B;IACC,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEhD,sBAAsB;IACtB,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,MAAM,UAAU,GAAG,MAAM,CAAC,cAAc,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,uBAAuB,CAAC,CAAC;IAC3F,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACrD,UAAU,GAAG,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChF,CAAC;IAED,4BAA4B;IAC5B,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;IACrD,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,CAAC;IACzD,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAE/E,oDAAoD;IACpD,MAAM,UAAU,GAAG,IAAA,gCAAe,EAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAEvD,MAAM,OAAO,GAAqB;QAChC,MAAM,EAAE,6BAA6B;QACrC,YAAY,EAAE,MAAM,CAAC,WAAW;QAChC,oBAAoB,EAAE,UAAU;QAChC,UAAU,EAAE,MAAM,CAAC,SAAS;QAC5B,YAAY,EAAE,MAAM,CAAC,WAAW;QAChC,gBAAgB,EAAE,MAAM,CAAC,eAAe;QACxC,cAAc,EAAE,MAAM,CAAC,aAAa;QACpC,OAAO,EAAE;YACP,kBAAkB,EAAE,gBAAgB;YACpC,uBAAuB,EAAE,MAAM,CAAC,YAAY,IAAI,EAAE;YAClD,2BAA2B,EAAE,CAAC;SAC/B;QACD,WAAW,EAAE,UAAU;QACvB,YAAY,EAAE,EAAE,EAAE,eAAe;KAClC,CAAC;IAEF,yEAAyE;IACzE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC;IAC1E,OAAO,CAAC,YAAY,GAAG,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAE1F,UAAU;IACV,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,MAAM,CAAC,WAAW,OAAO,CAAC,CAAC;IAC1E,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAEhE,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,iFAAiF;AAEjF;;;;;;;GAOG;AACH,SAAgB,gBAAgB,CAAC,MAQhC;IACC,EAAE,CAAC,SAAS,CAAC,iBAAiB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAErD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAElC,yBAAyB;IACzB,MAAM,SAAS,GAAG,UAAU,MAAM,CAAC,WAAW;cAClC,GAAG;eACF,MAAM,CAAC,UAAU;UACtB,MAAM,CAAC,QAAQ;aACZ,MAAM,CAAC,gBAAgB;YACxB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ;;;EAGjD,MAAM,CAAC,eAAe;;;QAGhB,MAAM,CAAC,eAAe;;;cAGhB,MAAM,CAAC,UAAU,YAAY,MAAM,CAAC,gBAAgB;IAC9D,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,mCAAmC;CAClF,CAAC;IAEA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,OAAO,MAAM,CAAC,WAAW,KAAK,CAAC,CAAC;IAC7E,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAErC,oCAAoC;IACpC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;IACnE,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,IAAI,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QACjC,SAAS,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,QAAQ,GAAG,SAAS,OAAO,MAAM,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;cAC/E,MAAM,CAAC,gBAAgB,cAAc,MAAM,CAAC,QAAQ,mBAAmB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;CAC9G,CAAC;IAEA,sBAAsB;IACtB,IAAI,SAAS,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC3C,SAAS,GAAG,wEAAwE,QAAQ,EAAE,CAAC;IACjG,CAAC;SAAM,CAAC;QACN,SAAS,IAAI,QAAQ,CAAC;IACxB,CAAC;IACD,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAE3C,0BAA0B;IAC1B,IAAI,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;YACnE,MAAM,CAAC,SAAS,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YAC/C,MAAM,eAAe,GAAG,UAAU,CAAC,MAAM,CAAC,gBAAgB,IAAI,GAAG,CAAC,CAAC;YACnE,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,QAAQ,IAAI,GAAG,CAAC,CAAC;YACvD,MAAM,CAAC,gBAAgB,GAAG,CAAC,eAAe,GAAG,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACrE,MAAM,CAAC,WAAW,GAAG,GAAG,CAAC;YACzB,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACnE,CAAC;QAAC,MAAM,CAAC,CAAC,yCAAyC,CAAC,CAAC;IACvD,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF;;;GAGG;AACH,SAAgB,kBAAkB,CAAC,WAAmB;IACpD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,WAAW,EAAE,CAAC,CAAC;IAC/D,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,SAAgB,iBAAiB,CAAC,WAAmB;IACnD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,WAAW,EAAE,CAAC,CAAC;IAC/D,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF;;;GAGG;AACH,SAAgB,iBAAiB,CAAC,cAAuB;IACvD,MAAM,UAAU,GAAG,cAAc,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,uBAAuB,CAAC,CAAC;IACpF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7C,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACrD,OAAO,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1E,CAAC"}
@@ -0,0 +1,22 @@
1
+ export type NotifyEvent = "hire_request" | "hire_accepted" | "hire_rejected" | "delivery" | "dispute" | "channel_challenge" | "low_balance" | "daemon_started" | "daemon_stopped";
2
+ export interface TelegramConfig {
3
+ botToken: string;
4
+ chatId: string;
5
+ }
6
+ export declare class Notifier {
7
+ private config;
8
+ private notifyFlags;
9
+ constructor(botToken: string, chatId: string, flags?: Partial<Record<NotifyEvent, boolean>>);
10
+ isEnabled(): boolean;
11
+ send(event: NotifyEvent, message: string): Promise<void>;
12
+ notifyHireRequest(hireId: string, hirerAddress: string, priceEth: string, capability: string): Promise<void>;
13
+ notifyHireAccepted(hireId: string, agreementId: string): Promise<void>;
14
+ notifyHireRejected(hireId: string, reason: string): Promise<void>;
15
+ notifyDelivery(agreementId: string, deliveryHash: string, userOpHash: string): Promise<void>;
16
+ notifyDispute(agreementId: string, raisedBy: string): Promise<void>;
17
+ notifyChannelChallenge(channelId: string, txHash: string): Promise<void>;
18
+ notifyLowBalance(balanceEth: string, thresholdEth: string): Promise<void>;
19
+ notifyStarted(walletAddress: string, subsystems: string[]): Promise<void>;
20
+ notifyStopped(): Promise<void>;
21
+ }
22
+ //# sourceMappingURL=notify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../../src/daemon/notify.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,WAAW,GACnB,cAAc,GACd,eAAe,GACf,eAAe,GACf,UAAU,GACV,SAAS,GACT,mBAAmB,GACnB,aAAa,GACb,gBAAgB,GAChB,gBAAgB,CAAC;AAErB,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAiCD,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,WAAW,CAA+B;gBAGhD,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAM;IAgBnD,SAAS,IAAI,OAAO;IAId,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAexD,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAe5G,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMtE,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMjE,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM5F,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnE,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMxE,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMzE,aAAa,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAMzE,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CAGrC"}
@@ -0,0 +1,148 @@
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.Notifier = void 0;
37
+ /**
38
+ * Telegram notification module for daemon events.
39
+ * Uses Telegram Bot API — no external dependencies.
40
+ */
41
+ const https = __importStar(require("https"));
42
+ function telegramPost(botToken, method, body) {
43
+ return new Promise((resolve, reject) => {
44
+ const payload = JSON.stringify(body);
45
+ const options = {
46
+ hostname: "api.telegram.org",
47
+ port: 443,
48
+ path: `/bot${botToken}/${method}`,
49
+ method: "POST",
50
+ headers: {
51
+ "Content-Type": "application/json",
52
+ "Content-Length": Buffer.byteLength(payload),
53
+ },
54
+ };
55
+ const req = https.request(options, (res) => {
56
+ let data = "";
57
+ res.on("data", (c) => { data += c.toString(); });
58
+ res.on("end", () => {
59
+ const parsed = JSON.parse(data);
60
+ if (!parsed.ok) {
61
+ reject(new Error(`Telegram API error: ${parsed.description}`));
62
+ }
63
+ else {
64
+ resolve();
65
+ }
66
+ });
67
+ });
68
+ req.on("error", reject);
69
+ req.write(payload);
70
+ req.end();
71
+ });
72
+ }
73
+ class Notifier {
74
+ constructor(botToken, chatId, flags = {}) {
75
+ this.config = botToken && chatId ? { botToken, chatId } : null;
76
+ this.notifyFlags = {
77
+ hire_request: flags.hire_request ?? true,
78
+ hire_accepted: flags.hire_accepted ?? true,
79
+ hire_rejected: flags.hire_rejected ?? true,
80
+ delivery: flags.delivery ?? true,
81
+ dispute: flags.dispute ?? true,
82
+ channel_challenge: flags.channel_challenge ?? true,
83
+ low_balance: flags.low_balance ?? true,
84
+ daemon_started: true,
85
+ daemon_stopped: true,
86
+ };
87
+ }
88
+ isEnabled() {
89
+ return this.config !== null;
90
+ }
91
+ async send(event, message) {
92
+ if (!this.config)
93
+ return;
94
+ if (!this.notifyFlags[event])
95
+ return;
96
+ try {
97
+ await telegramPost(this.config.botToken, "sendMessage", {
98
+ chat_id: this.config.chatId,
99
+ text: message,
100
+ parse_mode: "HTML",
101
+ });
102
+ }
103
+ catch (err) {
104
+ // Non-fatal — log and continue
105
+ process.stderr.write(`[notify] Telegram send failed: ${err}\n`);
106
+ }
107
+ }
108
+ async notifyHireRequest(hireId, hirerAddress, priceEth, capability) {
109
+ const short = hirerAddress.slice(0, 10);
110
+ const msg = [
111
+ `⚡ <b>Hire Request</b>`,
112
+ `ID: <code>${hireId}</code>`,
113
+ `From: <code>${short}...</code>`,
114
+ `Capability: ${capability || "unspecified"}`,
115
+ `Price: ${priceEth} ETH`,
116
+ ``,
117
+ `Approve: <code>arc402 daemon approve ${hireId}</code>`,
118
+ `Reject: <code>arc402 daemon reject ${hireId}</code>`,
119
+ ].join("\n");
120
+ await this.send("hire_request", msg);
121
+ }
122
+ async notifyHireAccepted(hireId, agreementId) {
123
+ await this.send("hire_accepted", `✅ <b>Hire Accepted</b>\nID: <code>${hireId}</code>\nAgreement: <code>${agreementId}</code>`);
124
+ }
125
+ async notifyHireRejected(hireId, reason) {
126
+ await this.send("hire_rejected", `❌ <b>Hire Rejected</b>\nID: <code>${hireId}</code>\nReason: ${reason}`);
127
+ }
128
+ async notifyDelivery(agreementId, deliveryHash, userOpHash) {
129
+ await this.send("delivery", `📦 <b>Delivery Submitted</b>\nAgreement: <code>${agreementId}</code>\nDelivery hash: <code>${deliveryHash.slice(0, 16)}...</code>\nUserOp: <code>${userOpHash.slice(0, 16)}...</code>`);
130
+ }
131
+ async notifyDispute(agreementId, raisedBy) {
132
+ await this.send("dispute", `⚠️ <b>Dispute Raised</b>\nAgreement: <code>${agreementId}</code>\nBy: <code>${raisedBy}</code>`);
133
+ }
134
+ async notifyChannelChallenge(channelId, txHash) {
135
+ await this.send("channel_challenge", `🔔 <b>Channel Challenged</b>\nChannel: <code>${channelId.slice(0, 16)}...</code>\nTx: <code>${txHash.slice(0, 16)}...</code>`);
136
+ }
137
+ async notifyLowBalance(balanceEth, thresholdEth) {
138
+ await this.send("low_balance", `💸 <b>Low Balance Alert</b>\nCurrent: ${balanceEth} ETH\nThreshold: ${thresholdEth} ETH`);
139
+ }
140
+ async notifyStarted(walletAddress, subsystems) {
141
+ await this.send("daemon_started", `🟢 <b>ARC-402 Daemon Started</b>\nWallet: <code>${walletAddress}</code>\nSubsystems: ${subsystems.join(", ")}`);
142
+ }
143
+ async notifyStopped() {
144
+ await this.send("daemon_stopped", `🔴 <b>ARC-402 Daemon Stopped</b>`);
145
+ }
146
+ }
147
+ exports.Notifier = Notifier;
148
+ //# sourceMappingURL=notify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notify.js","sourceRoot":"","sources":["../../src/daemon/notify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ export interface TokenUsageEntry {
2
+ model: string;
3
+ provider: string;
4
+ input: number;
5
+ output: number;
6
+ ts: string;
7
+ cost_usd?: number;
8
+ }
9
+ export interface AggregatedTokenUsage {
10
+ total_input: number;
11
+ total_output: number;
12
+ total_tokens: number;
13
+ estimated_cost_usd: number;
14
+ models_used: string[];
15
+ entries: number;
16
+ by_model: Record<string, {
17
+ input: number;
18
+ output: number;
19
+ calls: number;
20
+ cost_usd: number;
21
+ }>;
22
+ }
23
+ /**
24
+ * Get the path where the worker should write token usage for an agreement.
25
+ * The daemon sets this as an env var before calling exec_command.
26
+ */
27
+ export declare function getUsageReportPath(agreementId: string): string;
28
+ /**
29
+ * Create the parent directory and return the path.
30
+ * Called by the daemon before spawning the worker.
31
+ */
32
+ export declare function prepareUsageReport(agreementId: string): string;
33
+ /**
34
+ * Read the token usage report for an agreement and aggregate totals.
35
+ * Returns null if no report exists.
36
+ */
37
+ export declare function readUsageReport(agreementId: string): AggregatedTokenUsage | null;
38
+ /**
39
+ * Format token usage for CLI display.
40
+ */
41
+ export declare function formatUsageReport(usage: AggregatedTokenUsage): string;
42
+ //# sourceMappingURL=token-metering.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-metering.d.ts","sourceRoot":"","sources":["../../src/daemon/token-metering.ts"],"names":[],"mappings":"AA+BA,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE;QACvB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;CACJ;AA4BD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAI9D;AAID;;;GAGG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAqDhF;AAID;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM,CAiBrE"}
@@ -0,0 +1,178 @@
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.getUsageReportPath = getUsageReportPath;
37
+ exports.prepareUsageReport = prepareUsageReport;
38
+ exports.readUsageReport = readUsageReport;
39
+ exports.formatUsageReport = formatUsageReport;
40
+ /**
41
+ * ARC-402 Token Usage Metering
42
+ *
43
+ * Tracks LLM token consumption per agreement. The worker writes a usage report
44
+ * file during execution; the daemon reads it after delivery and includes the
45
+ * data in the execution receipt.
46
+ *
47
+ * Architecture:
48
+ * - Before execution: daemon creates a usage report path for the agreement
49
+ * - During execution: worker appends usage entries as it calls LLM APIs
50
+ * - After execution: daemon reads the report, aggregates totals, includes in receipt
51
+ *
52
+ * The worker writes entries in JSON Lines format to:
53
+ * /workroom/jobs/agreement-<id>/token-usage.jsonl
54
+ *
55
+ * Each line:
56
+ * {"model":"claude-sonnet-4-6","provider":"anthropic","input":1200,"output":450,"ts":"..."}
57
+ *
58
+ * This is non-invasive — no proxy, no network interception. The worker
59
+ * is responsible for reporting its own usage. OpenClaw agents can do this
60
+ * natively via session metadata.
61
+ */
62
+ const fs = __importStar(require("fs"));
63
+ const path = __importStar(require("path"));
64
+ const os = __importStar(require("os"));
65
+ const ARC402_DIR = path.join(os.homedir(), ".arc402");
66
+ const JOBS_DIR = path.join(ARC402_DIR, "jobs");
67
+ // ─── Known model pricing (USD per 1M tokens, as of 2026-03) ──────────────────
68
+ const MODEL_PRICING = {
69
+ // Anthropic
70
+ "claude-opus-4-6": { input: 15.0, output: 75.0 },
71
+ "claude-sonnet-4-6": { input: 3.0, output: 15.0 },
72
+ "claude-haiku-4-5": { input: 0.8, output: 4.0 },
73
+ // OpenAI
74
+ "gpt-5.4": { input: 2.5, output: 10.0 },
75
+ "gpt-5.3-codex": { input: 2.5, output: 10.0 },
76
+ "gpt-4o": { input: 2.5, output: 10.0 },
77
+ "gpt-4o-mini": { input: 0.15, output: 0.6 },
78
+ // Google
79
+ "gemini-2.5-pro": { input: 1.25, output: 10.0 },
80
+ "gemini-2.5-flash": { input: 0.15, output: 0.6 },
81
+ // Defaults
82
+ "default": { input: 2.0, output: 8.0 },
83
+ };
84
+ function estimateCost(model, inputTokens, outputTokens) {
85
+ const pricing = MODEL_PRICING[model] ?? MODEL_PRICING["default"];
86
+ return (inputTokens * pricing.input + outputTokens * pricing.output) / 1000000;
87
+ }
88
+ // ─── Usage report path ────────────────────────────────────────────────────────
89
+ /**
90
+ * Get the path where the worker should write token usage for an agreement.
91
+ * The daemon sets this as an env var before calling exec_command.
92
+ */
93
+ function getUsageReportPath(agreementId) {
94
+ return path.join(JOBS_DIR, `agreement-${agreementId}`, "token-usage.jsonl");
95
+ }
96
+ /**
97
+ * Create the parent directory and return the path.
98
+ * Called by the daemon before spawning the worker.
99
+ */
100
+ function prepareUsageReport(agreementId) {
101
+ const reportPath = getUsageReportPath(agreementId);
102
+ fs.mkdirSync(path.dirname(reportPath), { recursive: true });
103
+ return reportPath;
104
+ }
105
+ // ─── Read and aggregate ───────────────────────────────────────────────────────
106
+ /**
107
+ * Read the token usage report for an agreement and aggregate totals.
108
+ * Returns null if no report exists.
109
+ */
110
+ function readUsageReport(agreementId) {
111
+ const reportPath = getUsageReportPath(agreementId);
112
+ if (!fs.existsSync(reportPath))
113
+ return null;
114
+ const content = fs.readFileSync(reportPath, "utf-8").trim();
115
+ if (!content)
116
+ return null;
117
+ const lines = content.split("\n").filter(Boolean);
118
+ const entries = [];
119
+ for (const line of lines) {
120
+ try {
121
+ entries.push(JSON.parse(line));
122
+ }
123
+ catch {
124
+ // Skip malformed lines
125
+ }
126
+ }
127
+ if (entries.length === 0)
128
+ return null;
129
+ // Aggregate
130
+ const byModel = {};
131
+ let totalInput = 0;
132
+ let totalOutput = 0;
133
+ let totalCost = 0;
134
+ for (const entry of entries) {
135
+ totalInput += entry.input;
136
+ totalOutput += entry.output;
137
+ const model = entry.model || "unknown";
138
+ if (!byModel[model]) {
139
+ byModel[model] = { input: 0, output: 0, calls: 0, cost_usd: 0 };
140
+ }
141
+ byModel[model].input += entry.input;
142
+ byModel[model].output += entry.output;
143
+ byModel[model].calls += 1;
144
+ const cost = entry.cost_usd ?? estimateCost(model, entry.input, entry.output);
145
+ byModel[model].cost_usd += cost;
146
+ totalCost += cost;
147
+ }
148
+ return {
149
+ total_input: totalInput,
150
+ total_output: totalOutput,
151
+ total_tokens: totalInput + totalOutput,
152
+ estimated_cost_usd: Math.round(totalCost * 10000) / 10000, // 4 decimal places
153
+ models_used: Object.keys(byModel),
154
+ entries: entries.length,
155
+ by_model: byModel,
156
+ };
157
+ }
158
+ // ─── CLI display helper ───────────────────────────────────────────────────────
159
+ /**
160
+ * Format token usage for CLI display.
161
+ */
162
+ function formatUsageReport(usage) {
163
+ const lines = [];
164
+ lines.push(`Token Usage`);
165
+ lines.push(`───────────`);
166
+ lines.push(`Total tokens: ${usage.total_tokens.toLocaleString()} (${usage.total_input.toLocaleString()} in / ${usage.total_output.toLocaleString()} out)`);
167
+ lines.push(`Est. cost: $${usage.estimated_cost_usd.toFixed(4)}`);
168
+ lines.push(`LLM calls: ${usage.entries}`);
169
+ lines.push(``);
170
+ if (Object.keys(usage.by_model).length > 1) {
171
+ lines.push(`By model:`);
172
+ for (const [model, data] of Object.entries(usage.by_model)) {
173
+ lines.push(` ${model.padEnd(24)} ${data.calls} calls ${(data.input + data.output).toLocaleString()} tokens $${data.cost_usd.toFixed(4)}`);
174
+ }
175
+ }
176
+ return lines.join("\n");
177
+ }
178
+ //# sourceMappingURL=token-metering.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-metering.js","sourceRoot":"","sources":["../../src/daemon/token-metering.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * UserOperation builder and submitter for the ARC-402 daemon.
3
+ * Wraps protocol calls (accept, fulfill) into ERC-4337 UserOperations.
4
+ */
5
+ import { ethers } from "ethers";
6
+ import type { UserOperation } from "../bundler";
7
+ import type { DaemonConfig } from "./config";
8
+ export declare function encodeWalletCall(target: string, innerCalldata: string, value?: bigint): string;
9
+ export declare function buildAcceptCalldata(serviceAgreementAddress: string, agreementId: string, walletAddress: string): string;
10
+ export declare function buildFulfillCalldata(serviceAgreementAddress: string, agreementId: string, deliveryHash: string, walletAddress: string): string;
11
+ export declare class UserOpsManager {
12
+ private bundlerClient;
13
+ private provider;
14
+ private config;
15
+ constructor(config: DaemonConfig, provider: ethers.Provider);
16
+ buildUserOp(callData: string, senderWallet: string): Promise<UserOperation>;
17
+ submit(callData: string, senderWallet: string): Promise<string>;
18
+ waitForInclusion(userOpHash: string): Promise<void>;
19
+ pingBundler(): Promise<boolean>;
20
+ }
21
+ //# sourceMappingURL=userops.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"userops.d.ts","sourceRoot":"","sources":["../../src/daemon/userops.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAY7C,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,KAAK,SAAY,GAChB,MAAM,CASR;AAED,wBAAgB,mBAAmB,CACjC,uBAAuB,EAAE,MAAM,EAC/B,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,GACpB,MAAM,CAGR;AAED,wBAAgB,oBAAoB,CAClC,uBAAuB,EAAE,MAAM,EAC/B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,GACpB,MAAM,CAGR;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,MAAM,CAAe;gBAEjB,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ;IAarD,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAwB3E,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK/D,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAInD,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CActC"}