arc402-cli 1.0.0-rc.1 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (257) hide show
  1. package/README.md +43 -2
  2. package/dist/abis.d.ts +1 -0
  3. package/dist/abis.d.ts.map +1 -1
  4. package/dist/abis.js +29 -1
  5. package/dist/abis.js.map +1 -1
  6. package/dist/commands/backup.d.ts +3 -0
  7. package/dist/commands/backup.d.ts.map +1 -0
  8. package/dist/commands/backup.js +106 -0
  9. package/dist/commands/backup.js.map +1 -0
  10. package/dist/commands/compute.d.ts +14 -0
  11. package/dist/commands/compute.d.ts.map +1 -0
  12. package/dist/commands/compute.js +466 -0
  13. package/dist/commands/compute.js.map +1 -0
  14. package/dist/commands/config.d.ts.map +1 -1
  15. package/dist/commands/config.js +11 -1
  16. package/dist/commands/config.js.map +1 -1
  17. package/dist/commands/daemon.d.ts.map +1 -1
  18. package/dist/commands/daemon.js +67 -0
  19. package/dist/commands/daemon.js.map +1 -1
  20. package/dist/commands/discover.d.ts.map +1 -1
  21. package/dist/commands/discover.js +60 -15
  22. package/dist/commands/discover.js.map +1 -1
  23. package/dist/commands/doctor.d.ts +3 -0
  24. package/dist/commands/doctor.d.ts.map +1 -0
  25. package/dist/commands/doctor.js +205 -0
  26. package/dist/commands/doctor.js.map +1 -0
  27. package/dist/commands/tunnel.d.ts +3 -0
  28. package/dist/commands/tunnel.d.ts.map +1 -0
  29. package/dist/commands/tunnel.js +281 -0
  30. package/dist/commands/tunnel.js.map +1 -0
  31. package/dist/commands/wallet.d.ts.map +1 -1
  32. package/dist/commands/wallet.js +299 -65
  33. package/dist/commands/wallet.js.map +1 -1
  34. package/dist/commands/watch.d.ts.map +1 -1
  35. package/dist/commands/watch.js +146 -9
  36. package/dist/commands/watch.js.map +1 -1
  37. package/dist/commands/workroom.d.ts.map +1 -1
  38. package/dist/commands/workroom.js +112 -6
  39. package/dist/commands/workroom.js.map +1 -1
  40. package/dist/config.d.ts +13 -0
  41. package/dist/config.d.ts.map +1 -1
  42. package/dist/config.js +41 -4
  43. package/dist/config.js.map +1 -1
  44. package/dist/daemon/compute-metering.d.ts +61 -0
  45. package/dist/daemon/compute-metering.d.ts.map +1 -0
  46. package/dist/daemon/compute-metering.js +299 -0
  47. package/dist/daemon/compute-metering.js.map +1 -0
  48. package/dist/daemon/compute-session.d.ts +100 -0
  49. package/dist/daemon/compute-session.d.ts.map +1 -0
  50. package/dist/daemon/compute-session.js +231 -0
  51. package/dist/daemon/compute-session.js.map +1 -0
  52. package/dist/daemon/config.d.ts +33 -1
  53. package/dist/daemon/config.d.ts.map +1 -1
  54. package/dist/daemon/config.js +69 -0
  55. package/dist/daemon/config.js.map +1 -1
  56. package/dist/daemon/credentials.d.ts +24 -0
  57. package/dist/daemon/credentials.d.ts.map +1 -0
  58. package/dist/daemon/credentials.js +80 -0
  59. package/dist/daemon/credentials.js.map +1 -0
  60. package/dist/daemon/delivery-client.d.ts +35 -0
  61. package/dist/daemon/delivery-client.d.ts.map +1 -0
  62. package/dist/daemon/delivery-client.js +231 -0
  63. package/dist/daemon/delivery-client.js.map +1 -0
  64. package/dist/daemon/file-delivery.d.ts +98 -0
  65. package/dist/daemon/file-delivery.d.ts.map +1 -0
  66. package/dist/daemon/file-delivery.js +461 -0
  67. package/dist/daemon/file-delivery.js.map +1 -0
  68. package/dist/daemon/index.d.ts +1 -0
  69. package/dist/daemon/index.d.ts.map +1 -1
  70. package/dist/daemon/index.js +793 -227
  71. package/dist/daemon/index.js.map +1 -1
  72. package/dist/daemon/notify.d.ts +35 -6
  73. package/dist/daemon/notify.d.ts.map +1 -1
  74. package/dist/daemon/notify.js +176 -48
  75. package/dist/daemon/notify.js.map +1 -1
  76. package/dist/daemon/worker-executor.d.ts +71 -0
  77. package/dist/daemon/worker-executor.d.ts.map +1 -0
  78. package/dist/daemon/worker-executor.js +382 -0
  79. package/dist/daemon/worker-executor.js.map +1 -0
  80. package/dist/drain-v4.js +2 -2
  81. package/dist/drain-v4.js.map +1 -1
  82. package/dist/endpoint-notify.d.ts +9 -1
  83. package/dist/endpoint-notify.d.ts.map +1 -1
  84. package/dist/endpoint-notify.js +116 -3
  85. package/dist/endpoint-notify.js.map +1 -1
  86. package/dist/index.js +81 -1
  87. package/dist/index.js.map +1 -1
  88. package/dist/program.d.ts.map +1 -1
  89. package/dist/program.js +8 -0
  90. package/dist/program.js.map +1 -1
  91. package/dist/repl.d.ts.map +1 -1
  92. package/dist/repl.js +69 -486
  93. package/dist/repl.js.map +1 -1
  94. package/dist/tui/App.d.ts +12 -0
  95. package/dist/tui/App.d.ts.map +1 -0
  96. package/dist/tui/App.js +154 -0
  97. package/dist/tui/App.js.map +1 -0
  98. package/dist/tui/Footer.d.ts +11 -0
  99. package/dist/tui/Footer.d.ts.map +1 -0
  100. package/dist/tui/Footer.js +13 -0
  101. package/dist/tui/Footer.js.map +1 -0
  102. package/dist/tui/Header.d.ts +14 -0
  103. package/dist/tui/Header.d.ts.map +1 -0
  104. package/dist/tui/Header.js +19 -0
  105. package/dist/tui/Header.js.map +1 -0
  106. package/dist/tui/InputLine.d.ts +11 -0
  107. package/dist/tui/InputLine.d.ts.map +1 -0
  108. package/dist/tui/InputLine.js +145 -0
  109. package/dist/tui/InputLine.js.map +1 -0
  110. package/dist/tui/Viewport.d.ts +14 -0
  111. package/dist/tui/Viewport.d.ts.map +1 -0
  112. package/dist/tui/Viewport.js +48 -0
  113. package/dist/tui/Viewport.js.map +1 -0
  114. package/dist/tui/WalletConnectPairing.d.ts +23 -0
  115. package/dist/tui/WalletConnectPairing.d.ts.map +1 -0
  116. package/dist/tui/WalletConnectPairing.js +61 -0
  117. package/dist/tui/WalletConnectPairing.js.map +1 -0
  118. package/dist/tui/components/Button.d.ts +7 -0
  119. package/dist/tui/components/Button.d.ts.map +1 -0
  120. package/dist/tui/components/Button.js +21 -0
  121. package/dist/tui/components/Button.js.map +1 -0
  122. package/dist/tui/components/CeremonyView.d.ts +13 -0
  123. package/dist/tui/components/CeremonyView.d.ts.map +1 -0
  124. package/dist/tui/components/CeremonyView.js +10 -0
  125. package/dist/tui/components/CeremonyView.js.map +1 -0
  126. package/dist/tui/components/CompletionDropdown.d.ts +7 -0
  127. package/dist/tui/components/CompletionDropdown.d.ts.map +1 -0
  128. package/dist/tui/components/CompletionDropdown.js +23 -0
  129. package/dist/tui/components/CompletionDropdown.js.map +1 -0
  130. package/dist/tui/components/ConfirmPrompt.d.ts +9 -0
  131. package/dist/tui/components/ConfirmPrompt.d.ts.map +1 -0
  132. package/dist/tui/components/ConfirmPrompt.js +10 -0
  133. package/dist/tui/components/ConfirmPrompt.js.map +1 -0
  134. package/dist/tui/components/CustomTextInput.d.ts +15 -0
  135. package/dist/tui/components/CustomTextInput.d.ts.map +1 -0
  136. package/dist/tui/components/CustomTextInput.js +99 -0
  137. package/dist/tui/components/CustomTextInput.js.map +1 -0
  138. package/dist/tui/components/InteractiveTable.d.ts +14 -0
  139. package/dist/tui/components/InteractiveTable.d.ts.map +1 -0
  140. package/dist/tui/components/InteractiveTable.js +61 -0
  141. package/dist/tui/components/InteractiveTable.js.map +1 -0
  142. package/dist/tui/components/StepSpinner.d.ts +11 -0
  143. package/dist/tui/components/StepSpinner.d.ts.map +1 -0
  144. package/dist/tui/components/StepSpinner.js +32 -0
  145. package/dist/tui/components/StepSpinner.js.map +1 -0
  146. package/dist/tui/components/Toast.d.ts +18 -0
  147. package/dist/tui/components/Toast.d.ts.map +1 -0
  148. package/dist/tui/components/Toast.js +29 -0
  149. package/dist/tui/components/Toast.js.map +1 -0
  150. package/dist/tui/index.d.ts +2 -0
  151. package/dist/tui/index.d.ts.map +1 -0
  152. package/dist/tui/index.js +55 -0
  153. package/dist/tui/index.js.map +1 -0
  154. package/dist/tui/useChat.d.ts +11 -0
  155. package/dist/tui/useChat.d.ts.map +1 -0
  156. package/dist/tui/useChat.js +91 -0
  157. package/dist/tui/useChat.js.map +1 -0
  158. package/dist/tui/useCommand.d.ts +12 -0
  159. package/dist/tui/useCommand.d.ts.map +1 -0
  160. package/dist/tui/useCommand.js +137 -0
  161. package/dist/tui/useCommand.js.map +1 -0
  162. package/dist/tui/useNotifications.d.ts +9 -0
  163. package/dist/tui/useNotifications.d.ts.map +1 -0
  164. package/dist/tui/useNotifications.js +17 -0
  165. package/dist/tui/useNotifications.js.map +1 -0
  166. package/dist/tui/useScroll.d.ts +17 -0
  167. package/dist/tui/useScroll.d.ts.map +1 -0
  168. package/dist/tui/useScroll.js +46 -0
  169. package/dist/tui/useScroll.js.map +1 -0
  170. package/dist/ui/format.d.ts.map +1 -1
  171. package/dist/ui/format.js +2 -0
  172. package/dist/ui/format.js.map +1 -1
  173. package/dist/ui/qr-render.d.ts +25 -0
  174. package/dist/ui/qr-render.d.ts.map +1 -0
  175. package/dist/ui/qr-render.js +90 -0
  176. package/dist/ui/qr-render.js.map +1 -0
  177. package/dist/ui/rpc-fallback.d.ts +11 -0
  178. package/dist/ui/rpc-fallback.d.ts.map +1 -0
  179. package/dist/ui/rpc-fallback.js +58 -0
  180. package/dist/ui/rpc-fallback.js.map +1 -0
  181. package/dist/walletconnect.d.ts +4 -0
  182. package/dist/walletconnect.d.ts.map +1 -1
  183. package/dist/walletconnect.js.map +1 -1
  184. package/package.json +11 -3
  185. package/scripts/authorize-machine-key.ts +0 -43
  186. package/scripts/drain-wallet.ts +0 -149
  187. package/scripts/execute-spend-only.ts +0 -81
  188. package/scripts/register-agent-userop.ts +0 -186
  189. package/src/abis.ts +0 -187
  190. package/src/bundler.ts +0 -235
  191. package/src/client.ts +0 -36
  192. package/src/coinbase-smart-wallet.ts +0 -51
  193. package/src/commands/accept.ts +0 -64
  194. package/src/commands/agent-handshake.ts +0 -72
  195. package/src/commands/agent.ts +0 -691
  196. package/src/commands/agreements.ts +0 -350
  197. package/src/commands/arbitrator.ts +0 -180
  198. package/src/commands/arena-handshake.ts +0 -257
  199. package/src/commands/arena.ts +0 -122
  200. package/src/commands/cancel.ts +0 -35
  201. package/src/commands/channel.ts +0 -218
  202. package/src/commands/coldstart.ts +0 -165
  203. package/src/commands/config.ts +0 -58
  204. package/src/commands/contract-interaction.ts +0 -166
  205. package/src/commands/daemon.ts +0 -978
  206. package/src/commands/deliver.ts +0 -148
  207. package/src/commands/discover.ts +0 -297
  208. package/src/commands/dispute.ts +0 -375
  209. package/src/commands/endpoint.ts +0 -620
  210. package/src/commands/feed.ts +0 -229
  211. package/src/commands/hire.ts +0 -245
  212. package/src/commands/migrate.ts +0 -177
  213. package/src/commands/negotiate.ts +0 -271
  214. package/src/commands/openshell.ts +0 -1055
  215. package/src/commands/owner.ts +0 -35
  216. package/src/commands/policy.ts +0 -263
  217. package/src/commands/relay.ts +0 -273
  218. package/src/commands/remediate.ts +0 -24
  219. package/src/commands/reputation.ts +0 -79
  220. package/src/commands/setup.ts +0 -343
  221. package/src/commands/trust.ts +0 -27
  222. package/src/commands/verify.ts +0 -91
  223. package/src/commands/wallet.ts +0 -3280
  224. package/src/commands/watch.ts +0 -23
  225. package/src/commands/watchtower.ts +0 -248
  226. package/src/commands/workroom.ts +0 -959
  227. package/src/config.ts +0 -174
  228. package/src/daemon/config.ts +0 -308
  229. package/src/daemon/hire-listener.ts +0 -226
  230. package/src/daemon/index.ts +0 -955
  231. package/src/daemon/job-lifecycle.ts +0 -215
  232. package/src/daemon/notify.ts +0 -157
  233. package/src/daemon/token-metering.ts +0 -183
  234. package/src/daemon/userops.ts +0 -119
  235. package/src/daemon/wallet-monitor.ts +0 -90
  236. package/src/drain-v4.ts +0 -159
  237. package/src/endpoint-config.ts +0 -83
  238. package/src/endpoint-notify.ts +0 -46
  239. package/src/index.ts +0 -26
  240. package/src/openshell-runtime.ts +0 -277
  241. package/src/program.ts +0 -83
  242. package/src/repl.ts +0 -680
  243. package/src/signing.ts +0 -28
  244. package/src/telegram-notify.ts +0 -88
  245. package/src/ui/banner.ts +0 -51
  246. package/src/ui/colors.ts +0 -30
  247. package/src/ui/format.ts +0 -77
  248. package/src/ui/spinner.ts +0 -56
  249. package/src/ui/tree.ts +0 -16
  250. package/src/utils/format.ts +0 -48
  251. package/src/utils/hash.ts +0 -5
  252. package/src/utils/time.ts +0 -15
  253. package/src/wallet-router.ts +0 -178
  254. package/src/walletconnect-session.ts +0 -27
  255. package/src/walletconnect.ts +0 -294
  256. package/test/time.test.js +0 -11
  257. package/tsconfig.json +0 -19
@@ -1,271 +0,0 @@
1
- import { Command } from "commander";
2
- import { ethers } from "ethers";
3
- import {
4
- createSignedProposal,
5
- createSignedCounter,
6
- createSignedAccept,
7
- createSignedReject,
8
- NegotiationGuard,
9
- SessionManager,
10
- } from "@arc402/sdk";
11
- import { loadConfig } from "../config";
12
- import { requireSigner, getClient } from "../client";
13
- import { hashFile, hashString } from "../utils/hash";
14
- import { c } from '../ui/colors';
15
-
16
- const sessionManager = new SessionManager();
17
-
18
- export function registerNegotiateCommands(program: Command): void {
19
- const negotiate = program
20
- .command("negotiate")
21
- .description(
22
- "Signed agent-to-agent negotiation. Every message is authenticated, " +
23
- "sessions are tracked locally, transcripts are hashed and committed on-chain. " +
24
- "This is the secure communication layer — not just payload generation."
25
- );
26
-
27
- // Session management — nest list/show under a single 'session' subcommand
28
- const session = negotiate
29
- .command("session")
30
- .description("Manage local negotiation sessions");
31
-
32
- session
33
- .command("list")
34
- .description("List all negotiation sessions")
35
- .option("--json", "Machine-parseable output")
36
- .action((opts) => {
37
- const sessions = sessionManager.list();
38
- if (opts.json) {
39
- console.log(JSON.stringify(sessions));
40
- } else {
41
- sessions.forEach(s => {
42
- console.log(`${s.sessionId.slice(0, 10)}... ${s.state.padEnd(10)} ${s.initiator} ↔ ${s.responder} msgs:${s.messages.length}`);
43
- });
44
- }
45
- });
46
-
47
- session
48
- .command("show <sessionId>")
49
- .description("Show full session including message history and transcript hash")
50
- .option("--json", "Machine-parseable output")
51
- .action((sessionId, opts) => {
52
- const sess = sessionManager.load(sessionId);
53
- if (opts.json) {
54
- console.log(JSON.stringify(sess));
55
- } else {
56
- console.log(`Session: ${sess.sessionId}`);
57
- console.log(`State: ${sess.state}`);
58
- console.log(`Parties: ${sess.initiator} ↔ ${sess.responder}`);
59
- console.log(`Messages: ${sess.messages.length}`);
60
- if (sess.transcriptHash) console.log(`Transcript hash: ${sess.transcriptHash}`);
61
- if (sess.onChainAgreementId) console.log(`On-chain agreement: ${sess.onChainAgreementId}`);
62
- sess.messages.forEach((m, i) => console.log(` ${i + 1}. ${m.type} from ${m.from.slice(0, 8)}...`));
63
- }
64
- });
65
-
66
- // Signed propose (starts a new session)
67
- negotiate
68
- .command("propose")
69
- .description("Send a signed PROPOSE. Creates a new negotiation session.")
70
- .requiredOption("--to <address>")
71
- .requiredOption("--service-type <type>")
72
- .requiredOption("--price <amountWei>")
73
- .option("--token <token>", "Token address", ethers.ZeroAddress)
74
- .requiredOption("--deadline <iso>")
75
- .requiredOption("--spec <text>")
76
- .option("--spec-file <path>")
77
- .option("--expires-in <seconds>", "Proposal TTL in seconds", "3600")
78
- .option("--json", "Machine-parseable output")
79
- .action(async (opts) => {
80
- const config = loadConfig();
81
- const { signer } = await requireSigner(config);
82
- const myAddress = await signer.getAddress();
83
- const specHash = opts.specFile ? hashFile(opts.specFile) : hashString(opts.spec);
84
- const now = Math.floor(Date.now() / 1000);
85
-
86
- const session = sessionManager.createSession(myAddress, opts.to);
87
-
88
- const proposal = await createSignedProposal({
89
- from: myAddress,
90
- to: opts.to,
91
- serviceType: opts.serviceType,
92
- price: opts.price,
93
- token: opts.token,
94
- deadline: opts.deadline,
95
- spec: opts.spec,
96
- specHash,
97
- expiresAt: now + parseInt(opts.expiresIn),
98
- protocolVersion: "1.0.0",
99
- } as Parameters<typeof createSignedProposal>[0], signer);
100
-
101
- sessionManager.addMessage(session.sessionId, proposal);
102
-
103
- if (opts.json) {
104
- console.log(JSON.stringify({ sessionId: session.sessionId, message: proposal }));
105
- } else {
106
- console.log(' ' + c.success + c.white(' Session started: ' + session.sessionId.slice(0, 12) + '...'));
107
- console.log(`Signed PROPOSE:`);
108
- console.log(JSON.stringify(proposal, null, 2));
109
- }
110
- });
111
-
112
- // Counter
113
- negotiate
114
- .command("counter <sessionId>")
115
- .description("Send a signed COUNTER within an existing session.")
116
- .requiredOption("--justification <text>")
117
- .option("--price <amountWei>")
118
- .option("--deadline <iso>")
119
- .option("--json", "Machine-parseable output")
120
- .action(async (sessionId, opts) => {
121
- const config = loadConfig();
122
- const { signer } = await requireSigner(config);
123
- const myAddress = await signer.getAddress();
124
- const session = sessionManager.load(sessionId);
125
- const lastMessage = session.messages[session.messages.length - 1];
126
- const refNonce = "nonce" in lastMessage ? lastMessage.nonce : (lastMessage as any).refNonce;
127
-
128
- const counter = await createSignedCounter({
129
- from: myAddress,
130
- to: lastMessage.from === myAddress ? lastMessage.to : lastMessage.from,
131
- refNonce,
132
- justification: opts.justification,
133
- price: opts.price,
134
- deadline: opts.deadline,
135
- }, signer);
136
-
137
- sessionManager.addMessage(sessionId, counter);
138
-
139
- if (opts.json) {
140
- console.log(JSON.stringify(counter));
141
- } else {
142
- console.log(' ' + c.success + c.white(' Counter added to session'));
143
- console.log(JSON.stringify(counter, null, 2));
144
- }
145
- });
146
-
147
- // Accept — closes session, computes transcript hash
148
- negotiate
149
- .command("accept <sessionId>")
150
- .description("Accept terms. Closes the session and computes transcript hash.")
151
- .requiredOption("--price <amountWei>")
152
- .requiredOption("--deadline <iso>")
153
- .option("--record", "Commit transcript hash on-chain alongside propose()")
154
- .option("--json", "Machine-parseable output")
155
- .action(async (sessionId, opts) => {
156
- const config = loadConfig();
157
- const { signer } = await requireSigner(config);
158
- const myAddress = await signer.getAddress();
159
- const session = sessionManager.load(sessionId);
160
- const lastMessage = session.messages[session.messages.length - 1];
161
- const refNonce = "nonce" in lastMessage ? lastMessage.nonce : (lastMessage as any).refNonce;
162
-
163
- const accept = await createSignedAccept({
164
- from: myAddress,
165
- to: lastMessage.from === myAddress ? lastMessage.to : lastMessage.from,
166
- refNonce,
167
- agreedPrice: opts.price,
168
- agreedDeadline: opts.deadline,
169
- }, signer);
170
-
171
- sessionManager.addMessage(sessionId, accept);
172
- const updatedSession = sessionManager.load(sessionId);
173
-
174
- if (opts.json) {
175
- console.log(JSON.stringify({
176
- sessionId,
177
- transcriptHash: updatedSession.transcriptHash,
178
- message: accept,
179
- }));
180
- } else {
181
- console.log(' ' + c.success + c.white(' Session ACCEPTED — transcript locked'));
182
- console.log(' ' + c.dim(' Transcript:') + ' ' + c.white(updatedSession.transcriptHash ?? ''));
183
- if (opts.record) {
184
- console.log(`\nTranscript hash is ready to commit on-chain.`);
185
- console.log(`Run: arc402 hire --session ${sessionId} to propose() and record the transcript hash.`);
186
- }
187
- }
188
- });
189
-
190
- // Reject
191
- negotiate
192
- .command("reject <sessionId>")
193
- .description("Reject and close session.")
194
- .requiredOption("--reason <text>")
195
- .option("--json", "Machine-parseable output")
196
- .action(async (sessionId, opts) => {
197
- const config = loadConfig();
198
- const { signer } = await requireSigner(config);
199
- const myAddress = await signer.getAddress();
200
- const session = sessionManager.load(sessionId);
201
- const lastMessage = session.messages[session.messages.length - 1];
202
- const refNonce = "nonce" in lastMessage ? lastMessage.nonce : (lastMessage as any).refNonce;
203
-
204
- const reject = await createSignedReject({
205
- from: myAddress,
206
- to: lastMessage.from === myAddress ? lastMessage.to : lastMessage.from,
207
- reason: opts.reason,
208
- refNonce,
209
- }, signer);
210
-
211
- sessionManager.addMessage(sessionId, reject);
212
-
213
- if (opts.json) {
214
- console.log(JSON.stringify(reject));
215
- } else {
216
- console.log(' ' + c.failure + c.white(' Session REJECTED'));
217
- console.log(`Reason: ${opts.reason}`);
218
- }
219
- });
220
-
221
- // Verify an incoming message
222
- negotiate
223
- .command("verify")
224
- .description("Verify an incoming signed negotiation message against AgentRegistry.")
225
- .requiredOption("--message <json>", "Raw JSON string or @file.json")
226
- .option("--json", "Machine-parseable output")
227
- .action(async (opts) => {
228
- const config = loadConfig();
229
- if (!config.agentRegistryAddress) throw new Error("agentRegistryAddress not in config");
230
- const { provider } = await getClient(config);
231
-
232
- const guard = new NegotiationGuard({ agentRegistryAddress: config.agentRegistryAddress, runner: provider });
233
-
234
- const rawJson = opts.message.startsWith("@")
235
- ? require("fs").readFileSync(opts.message.slice(1), "utf8")
236
- : opts.message;
237
-
238
- const result = await guard.verify(rawJson);
239
-
240
- if (opts.json) {
241
- console.log(JSON.stringify(result));
242
- } else if (result.valid) {
243
- console.log(' ' + c.success + c.white(' Valid — signer: ' + result.recoveredSigner));
244
- } else {
245
- console.error(' ' + c.failure + c.white(' Invalid — ' + result.error));
246
- process.exit(1);
247
- }
248
- });
249
-
250
- // Transcript subcommand
251
- const transcript = negotiate.command("transcript").description("Transcript management for closed negotiation sessions");
252
-
253
- transcript
254
- .command("show <sessionId>")
255
- .description("Show the transcript hash for a completed session")
256
- .option("--json", "Machine-parseable output")
257
- .action((sessionId, opts) => {
258
- const session = sessionManager.load(sessionId);
259
- if (!session.transcriptHash) {
260
- console.error("Session not yet closed — no transcript hash");
261
- process.exit(1);
262
- }
263
- if (opts.json) {
264
- console.log(JSON.stringify({ sessionId, transcriptHash: session.transcriptHash, messageCount: session.messages.length }));
265
- } else {
266
- console.log(`Transcript hash: ${session.transcriptHash}`);
267
- console.log(`Messages: ${session.messages.length}`);
268
- console.log(`State: ${session.state}`);
269
- }
270
- });
271
- }