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
@@ -1,272 +0,0 @@
1
- import { Command } from "commander";
2
- import * as fs from "node:fs";
3
- import { ethers } from "ethers";
4
- import {
5
- createSignedProposal,
6
- createSignedCounter,
7
- createSignedAccept,
8
- createSignedReject,
9
- NegotiationGuard,
10
- SessionManager,
11
- } from "@arc402/sdk";
12
- import { loadConfig } from "../config.js";
13
- import { requireSigner, getClient } from "../client.js";
14
- import { hashFile, hashString } from "../utils/hash.js";
15
- import { c } from '../ui/colors.js';
16
-
17
- const sessionManager = new SessionManager();
18
-
19
- export function registerNegotiateCommands(program: Command): void {
20
- const negotiate = program
21
- .command("negotiate")
22
- .description(
23
- "Signed agent-to-agent negotiation. Every message is authenticated, " +
24
- "sessions are tracked locally, transcripts are hashed and committed on-chain. " +
25
- "This is the secure communication layer — not just payload generation."
26
- );
27
-
28
- // Session management — nest list/show under a single 'session' subcommand
29
- const session = negotiate
30
- .command("session")
31
- .description("Manage local negotiation sessions");
32
-
33
- session
34
- .command("list")
35
- .description("List all negotiation sessions")
36
- .option("--json", "Machine-parseable output")
37
- .action((opts) => {
38
- const sessions = sessionManager.list();
39
- if (opts.json) {
40
- console.log(JSON.stringify(sessions));
41
- } else {
42
- sessions.forEach(s => {
43
- console.log(`${s.sessionId.slice(0, 10)}... ${s.state.padEnd(10)} ${s.initiator} ↔ ${s.responder} msgs:${s.messages.length}`);
44
- });
45
- }
46
- });
47
-
48
- session
49
- .command("show <sessionId>")
50
- .description("Show full session including message history and transcript hash")
51
- .option("--json", "Machine-parseable output")
52
- .action((sessionId, opts) => {
53
- const sess = sessionManager.load(sessionId);
54
- if (opts.json) {
55
- console.log(JSON.stringify(sess));
56
- } else {
57
- console.log(`Session: ${sess.sessionId}`);
58
- console.log(`State: ${sess.state}`);
59
- console.log(`Parties: ${sess.initiator} ↔ ${sess.responder}`);
60
- console.log(`Messages: ${sess.messages.length}`);
61
- if (sess.transcriptHash) console.log(`Transcript hash: ${sess.transcriptHash}`);
62
- if (sess.onChainAgreementId) console.log(`On-chain agreement: ${sess.onChainAgreementId}`);
63
- sess.messages.forEach((m, i) => console.log(` ${i + 1}. ${m.type} from ${m.from.slice(0, 8)}...`));
64
- }
65
- });
66
-
67
- // Signed propose (starts a new session)
68
- negotiate
69
- .command("propose")
70
- .description("Send a signed PROPOSE. Creates a new negotiation session.")
71
- .requiredOption("--to <address>")
72
- .requiredOption("--service-type <type>")
73
- .requiredOption("--price <amountWei>")
74
- .option("--token <token>", "Token address", ethers.ZeroAddress)
75
- .requiredOption("--deadline <iso>")
76
- .requiredOption("--spec <text>")
77
- .option("--spec-file <path>")
78
- .option("--expires-in <seconds>", "Proposal TTL in seconds", "3600")
79
- .option("--json", "Machine-parseable output")
80
- .action(async (opts) => {
81
- const config = loadConfig();
82
- const { signer } = await requireSigner(config);
83
- const myAddress = await signer.getAddress();
84
- const specHash = opts.specFile ? hashFile(opts.specFile) : hashString(opts.spec);
85
- const now = Math.floor(Date.now() / 1000);
86
-
87
- const session = sessionManager.createSession(myAddress, opts.to);
88
-
89
- const proposal = await createSignedProposal({
90
- from: myAddress,
91
- to: opts.to,
92
- serviceType: opts.serviceType,
93
- price: opts.price,
94
- token: opts.token,
95
- deadline: opts.deadline,
96
- spec: opts.spec,
97
- specHash,
98
- expiresAt: now + parseInt(opts.expiresIn),
99
- protocolVersion: "1.0.0",
100
- } as Parameters<typeof createSignedProposal>[0], signer);
101
-
102
- sessionManager.addMessage(session.sessionId, proposal);
103
-
104
- if (opts.json) {
105
- console.log(JSON.stringify({ sessionId: session.sessionId, message: proposal }));
106
- } else {
107
- console.log(' ' + c.success + c.white(' Session started: ' + session.sessionId.slice(0, 12) + '...'));
108
- console.log(`Signed PROPOSE:`);
109
- console.log(JSON.stringify(proposal, null, 2));
110
- }
111
- });
112
-
113
- // Counter
114
- negotiate
115
- .command("counter <sessionId>")
116
- .description("Send a signed COUNTER within an existing session.")
117
- .requiredOption("--justification <text>")
118
- .option("--price <amountWei>")
119
- .option("--deadline <iso>")
120
- .option("--json", "Machine-parseable output")
121
- .action(async (sessionId, opts) => {
122
- const config = loadConfig();
123
- const { signer } = await requireSigner(config);
124
- const myAddress = await signer.getAddress();
125
- const session = sessionManager.load(sessionId);
126
- const lastMessage = session.messages[session.messages.length - 1];
127
- const refNonce = "nonce" in lastMessage ? lastMessage.nonce : (lastMessage as any).refNonce;
128
-
129
- const counter = await createSignedCounter({
130
- from: myAddress,
131
- to: lastMessage.from === myAddress ? lastMessage.to : lastMessage.from,
132
- refNonce,
133
- justification: opts.justification,
134
- price: opts.price,
135
- deadline: opts.deadline,
136
- }, signer);
137
-
138
- sessionManager.addMessage(sessionId, counter);
139
-
140
- if (opts.json) {
141
- console.log(JSON.stringify(counter));
142
- } else {
143
- console.log(' ' + c.success + c.white(' Counter added to session'));
144
- console.log(JSON.stringify(counter, null, 2));
145
- }
146
- });
147
-
148
- // Accept — closes session, computes transcript hash
149
- negotiate
150
- .command("accept <sessionId>")
151
- .description("Accept terms. Closes the session and computes transcript hash.")
152
- .requiredOption("--price <amountWei>")
153
- .requiredOption("--deadline <iso>")
154
- .option("--record", "Commit transcript hash on-chain alongside propose()")
155
- .option("--json", "Machine-parseable output")
156
- .action(async (sessionId, opts) => {
157
- const config = loadConfig();
158
- const { signer } = await requireSigner(config);
159
- const myAddress = await signer.getAddress();
160
- const session = sessionManager.load(sessionId);
161
- const lastMessage = session.messages[session.messages.length - 1];
162
- const refNonce = "nonce" in lastMessage ? lastMessage.nonce : (lastMessage as any).refNonce;
163
-
164
- const accept = await createSignedAccept({
165
- from: myAddress,
166
- to: lastMessage.from === myAddress ? lastMessage.to : lastMessage.from,
167
- refNonce,
168
- agreedPrice: opts.price,
169
- agreedDeadline: opts.deadline,
170
- }, signer);
171
-
172
- sessionManager.addMessage(sessionId, accept);
173
- const updatedSession = sessionManager.load(sessionId);
174
-
175
- if (opts.json) {
176
- console.log(JSON.stringify({
177
- sessionId,
178
- transcriptHash: updatedSession.transcriptHash,
179
- message: accept,
180
- }));
181
- } else {
182
- console.log(' ' + c.success + c.white(' Session ACCEPTED — transcript locked'));
183
- console.log(' ' + c.dim(' Transcript:') + ' ' + c.white(updatedSession.transcriptHash ?? ''));
184
- if (opts.record) {
185
- console.log(`\nTranscript hash is ready to commit on-chain.`);
186
- console.log(`Run: arc402 hire --session ${sessionId} to propose() and record the transcript hash.`);
187
- }
188
- }
189
- });
190
-
191
- // Reject
192
- negotiate
193
- .command("reject <sessionId>")
194
- .description("Reject and close session.")
195
- .requiredOption("--reason <text>")
196
- .option("--json", "Machine-parseable output")
197
- .action(async (sessionId, opts) => {
198
- const config = loadConfig();
199
- const { signer } = await requireSigner(config);
200
- const myAddress = await signer.getAddress();
201
- const session = sessionManager.load(sessionId);
202
- const lastMessage = session.messages[session.messages.length - 1];
203
- const refNonce = "nonce" in lastMessage ? lastMessage.nonce : (lastMessage as any).refNonce;
204
-
205
- const reject = await createSignedReject({
206
- from: myAddress,
207
- to: lastMessage.from === myAddress ? lastMessage.to : lastMessage.from,
208
- reason: opts.reason,
209
- refNonce,
210
- }, signer);
211
-
212
- sessionManager.addMessage(sessionId, reject);
213
-
214
- if (opts.json) {
215
- console.log(JSON.stringify(reject));
216
- } else {
217
- console.log(' ' + c.failure + c.white(' Session REJECTED'));
218
- console.log(`Reason: ${opts.reason}`);
219
- }
220
- });
221
-
222
- // Verify an incoming message
223
- negotiate
224
- .command("verify")
225
- .description("Verify an incoming signed negotiation message against AgentRegistry.")
226
- .requiredOption("--message <json>", "Raw JSON string or @file.json")
227
- .option("--json", "Machine-parseable output")
228
- .action(async (opts) => {
229
- const config = loadConfig();
230
- if (!config.agentRegistryAddress) throw new Error("agentRegistryAddress not in config");
231
- const { provider } = await getClient(config);
232
-
233
- const guard = new NegotiationGuard({ agentRegistryAddress: config.agentRegistryAddress, runner: provider });
234
-
235
- const rawJson = opts.message.startsWith("@")
236
- ? fs.readFileSync(opts.message.slice(1), "utf8")
237
- : opts.message;
238
-
239
- const result = await guard.verify(rawJson);
240
-
241
- if (opts.json) {
242
- console.log(JSON.stringify(result));
243
- } else if (result.valid) {
244
- console.log(' ' + c.success + c.white(' Valid — signer: ' + result.recoveredSigner));
245
- } else {
246
- console.error(' ' + c.failure + c.white(' Invalid — ' + result.error));
247
- process.exit(1);
248
- }
249
- });
250
-
251
- // Transcript subcommand
252
- const transcript = negotiate.command("transcript").description("Transcript management for closed negotiation sessions");
253
-
254
- transcript
255
- .command("show <sessionId>")
256
- .description("Show the transcript hash for a completed session")
257
- .option("--json", "Machine-parseable output")
258
- .action((sessionId, opts) => {
259
- const session = sessionManager.load(sessionId);
260
- if (!session.transcriptHash) {
261
- console.error("Session not yet closed — no transcript hash");
262
- process.exit(1);
263
- }
264
- if (opts.json) {
265
- console.log(JSON.stringify({ sessionId, transcriptHash: session.transcriptHash, messageCount: session.messages.length }));
266
- } else {
267
- console.log(`Transcript hash: ${session.transcriptHash}`);
268
- console.log(`Messages: ${session.messages.length}`);
269
- console.log(`State: ${session.state}`);
270
- }
271
- });
272
- }