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.
- package/README.md +43 -2
- package/dist/abis.d.ts +1 -0
- package/dist/abis.d.ts.map +1 -1
- package/dist/abis.js +29 -1
- package/dist/abis.js.map +1 -1
- package/dist/commands/backup.d.ts +3 -0
- package/dist/commands/backup.d.ts.map +1 -0
- package/dist/commands/backup.js +106 -0
- package/dist/commands/backup.js.map +1 -0
- package/dist/commands/compute.d.ts +14 -0
- package/dist/commands/compute.d.ts.map +1 -0
- package/dist/commands/compute.js +466 -0
- package/dist/commands/compute.js.map +1 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +11 -1
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/daemon.d.ts.map +1 -1
- package/dist/commands/daemon.js +67 -0
- package/dist/commands/daemon.js.map +1 -1
- package/dist/commands/discover.d.ts.map +1 -1
- package/dist/commands/discover.js +60 -15
- package/dist/commands/discover.js.map +1 -1
- package/dist/commands/doctor.d.ts +3 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +205 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/tunnel.d.ts +3 -0
- package/dist/commands/tunnel.d.ts.map +1 -0
- package/dist/commands/tunnel.js +281 -0
- package/dist/commands/tunnel.js.map +1 -0
- package/dist/commands/wallet.d.ts.map +1 -1
- package/dist/commands/wallet.js +299 -65
- package/dist/commands/wallet.js.map +1 -1
- package/dist/commands/watch.d.ts.map +1 -1
- package/dist/commands/watch.js +146 -9
- package/dist/commands/watch.js.map +1 -1
- package/dist/commands/workroom.d.ts.map +1 -1
- package/dist/commands/workroom.js +112 -6
- package/dist/commands/workroom.js.map +1 -1
- package/dist/config.d.ts +13 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +41 -4
- package/dist/config.js.map +1 -1
- package/dist/daemon/compute-metering.d.ts +61 -0
- package/dist/daemon/compute-metering.d.ts.map +1 -0
- package/dist/daemon/compute-metering.js +299 -0
- package/dist/daemon/compute-metering.js.map +1 -0
- package/dist/daemon/compute-session.d.ts +100 -0
- package/dist/daemon/compute-session.d.ts.map +1 -0
- package/dist/daemon/compute-session.js +231 -0
- package/dist/daemon/compute-session.js.map +1 -0
- package/dist/daemon/config.d.ts +33 -1
- package/dist/daemon/config.d.ts.map +1 -1
- package/dist/daemon/config.js +69 -0
- package/dist/daemon/config.js.map +1 -1
- package/dist/daemon/credentials.d.ts +24 -0
- package/dist/daemon/credentials.d.ts.map +1 -0
- package/dist/daemon/credentials.js +80 -0
- package/dist/daemon/credentials.js.map +1 -0
- package/dist/daemon/delivery-client.d.ts +35 -0
- package/dist/daemon/delivery-client.d.ts.map +1 -0
- package/dist/daemon/delivery-client.js +231 -0
- package/dist/daemon/delivery-client.js.map +1 -0
- package/dist/daemon/file-delivery.d.ts +98 -0
- package/dist/daemon/file-delivery.d.ts.map +1 -0
- package/dist/daemon/file-delivery.js +461 -0
- package/dist/daemon/file-delivery.js.map +1 -0
- package/dist/daemon/index.d.ts +1 -0
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +793 -227
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/notify.d.ts +35 -6
- package/dist/daemon/notify.d.ts.map +1 -1
- package/dist/daemon/notify.js +176 -48
- package/dist/daemon/notify.js.map +1 -1
- package/dist/daemon/worker-executor.d.ts +71 -0
- package/dist/daemon/worker-executor.d.ts.map +1 -0
- package/dist/daemon/worker-executor.js +382 -0
- package/dist/daemon/worker-executor.js.map +1 -0
- package/dist/drain-v4.js +2 -2
- package/dist/drain-v4.js.map +1 -1
- package/dist/endpoint-notify.d.ts +9 -1
- package/dist/endpoint-notify.d.ts.map +1 -1
- package/dist/endpoint-notify.js +116 -3
- package/dist/endpoint-notify.js.map +1 -1
- package/dist/index.js +81 -1
- package/dist/index.js.map +1 -1
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js +8 -0
- package/dist/program.js.map +1 -1
- package/dist/repl.d.ts.map +1 -1
- package/dist/repl.js +69 -486
- package/dist/repl.js.map +1 -1
- package/dist/tui/App.d.ts +12 -0
- package/dist/tui/App.d.ts.map +1 -0
- package/dist/tui/App.js +154 -0
- package/dist/tui/App.js.map +1 -0
- package/dist/tui/Footer.d.ts +11 -0
- package/dist/tui/Footer.d.ts.map +1 -0
- package/dist/tui/Footer.js +13 -0
- package/dist/tui/Footer.js.map +1 -0
- package/dist/tui/Header.d.ts +14 -0
- package/dist/tui/Header.d.ts.map +1 -0
- package/dist/tui/Header.js +19 -0
- package/dist/tui/Header.js.map +1 -0
- package/dist/tui/InputLine.d.ts +11 -0
- package/dist/tui/InputLine.d.ts.map +1 -0
- package/dist/tui/InputLine.js +145 -0
- package/dist/tui/InputLine.js.map +1 -0
- package/dist/tui/Viewport.d.ts +14 -0
- package/dist/tui/Viewport.d.ts.map +1 -0
- package/dist/tui/Viewport.js +48 -0
- package/dist/tui/Viewport.js.map +1 -0
- package/dist/tui/WalletConnectPairing.d.ts +23 -0
- package/dist/tui/WalletConnectPairing.d.ts.map +1 -0
- package/dist/tui/WalletConnectPairing.js +61 -0
- package/dist/tui/WalletConnectPairing.js.map +1 -0
- package/dist/tui/components/Button.d.ts +7 -0
- package/dist/tui/components/Button.d.ts.map +1 -0
- package/dist/tui/components/Button.js +21 -0
- package/dist/tui/components/Button.js.map +1 -0
- package/dist/tui/components/CeremonyView.d.ts +13 -0
- package/dist/tui/components/CeremonyView.d.ts.map +1 -0
- package/dist/tui/components/CeremonyView.js +10 -0
- package/dist/tui/components/CeremonyView.js.map +1 -0
- package/dist/tui/components/CompletionDropdown.d.ts +7 -0
- package/dist/tui/components/CompletionDropdown.d.ts.map +1 -0
- package/dist/tui/components/CompletionDropdown.js +23 -0
- package/dist/tui/components/CompletionDropdown.js.map +1 -0
- package/dist/tui/components/ConfirmPrompt.d.ts +9 -0
- package/dist/tui/components/ConfirmPrompt.d.ts.map +1 -0
- package/dist/tui/components/ConfirmPrompt.js +10 -0
- package/dist/tui/components/ConfirmPrompt.js.map +1 -0
- package/dist/tui/components/CustomTextInput.d.ts +15 -0
- package/dist/tui/components/CustomTextInput.d.ts.map +1 -0
- package/dist/tui/components/CustomTextInput.js +99 -0
- package/dist/tui/components/CustomTextInput.js.map +1 -0
- package/dist/tui/components/InteractiveTable.d.ts +14 -0
- package/dist/tui/components/InteractiveTable.d.ts.map +1 -0
- package/dist/tui/components/InteractiveTable.js +61 -0
- package/dist/tui/components/InteractiveTable.js.map +1 -0
- package/dist/tui/components/StepSpinner.d.ts +11 -0
- package/dist/tui/components/StepSpinner.d.ts.map +1 -0
- package/dist/tui/components/StepSpinner.js +32 -0
- package/dist/tui/components/StepSpinner.js.map +1 -0
- package/dist/tui/components/Toast.d.ts +18 -0
- package/dist/tui/components/Toast.d.ts.map +1 -0
- package/dist/tui/components/Toast.js +29 -0
- package/dist/tui/components/Toast.js.map +1 -0
- package/dist/tui/index.d.ts +2 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +55 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/useChat.d.ts +11 -0
- package/dist/tui/useChat.d.ts.map +1 -0
- package/dist/tui/useChat.js +91 -0
- package/dist/tui/useChat.js.map +1 -0
- package/dist/tui/useCommand.d.ts +12 -0
- package/dist/tui/useCommand.d.ts.map +1 -0
- package/dist/tui/useCommand.js +137 -0
- package/dist/tui/useCommand.js.map +1 -0
- package/dist/tui/useNotifications.d.ts +9 -0
- package/dist/tui/useNotifications.d.ts.map +1 -0
- package/dist/tui/useNotifications.js +17 -0
- package/dist/tui/useNotifications.js.map +1 -0
- package/dist/tui/useScroll.d.ts +17 -0
- package/dist/tui/useScroll.d.ts.map +1 -0
- package/dist/tui/useScroll.js +46 -0
- package/dist/tui/useScroll.js.map +1 -0
- package/dist/ui/format.d.ts.map +1 -1
- package/dist/ui/format.js +2 -0
- package/dist/ui/format.js.map +1 -1
- package/dist/ui/qr-render.d.ts +25 -0
- package/dist/ui/qr-render.d.ts.map +1 -0
- package/dist/ui/qr-render.js +90 -0
- package/dist/ui/qr-render.js.map +1 -0
- package/dist/ui/rpc-fallback.d.ts +11 -0
- package/dist/ui/rpc-fallback.d.ts.map +1 -0
- package/dist/ui/rpc-fallback.js +58 -0
- package/dist/ui/rpc-fallback.js.map +1 -0
- package/dist/walletconnect.d.ts +4 -0
- package/dist/walletconnect.d.ts.map +1 -1
- package/dist/walletconnect.js.map +1 -1
- package/package.json +11 -3
- package/scripts/authorize-machine-key.ts +0 -43
- package/scripts/drain-wallet.ts +0 -149
- package/scripts/execute-spend-only.ts +0 -81
- package/scripts/register-agent-userop.ts +0 -186
- package/src/abis.ts +0 -187
- package/src/bundler.ts +0 -235
- package/src/client.ts +0 -36
- package/src/coinbase-smart-wallet.ts +0 -51
- package/src/commands/accept.ts +0 -64
- package/src/commands/agent-handshake.ts +0 -72
- package/src/commands/agent.ts +0 -691
- package/src/commands/agreements.ts +0 -350
- package/src/commands/arbitrator.ts +0 -180
- package/src/commands/arena-handshake.ts +0 -257
- package/src/commands/arena.ts +0 -122
- package/src/commands/cancel.ts +0 -35
- package/src/commands/channel.ts +0 -218
- package/src/commands/coldstart.ts +0 -165
- package/src/commands/config.ts +0 -58
- package/src/commands/contract-interaction.ts +0 -166
- package/src/commands/daemon.ts +0 -978
- package/src/commands/deliver.ts +0 -148
- package/src/commands/discover.ts +0 -297
- package/src/commands/dispute.ts +0 -375
- package/src/commands/endpoint.ts +0 -620
- package/src/commands/feed.ts +0 -229
- package/src/commands/hire.ts +0 -245
- package/src/commands/migrate.ts +0 -177
- package/src/commands/negotiate.ts +0 -271
- package/src/commands/openshell.ts +0 -1055
- package/src/commands/owner.ts +0 -35
- package/src/commands/policy.ts +0 -263
- package/src/commands/relay.ts +0 -273
- package/src/commands/remediate.ts +0 -24
- package/src/commands/reputation.ts +0 -79
- package/src/commands/setup.ts +0 -343
- package/src/commands/trust.ts +0 -27
- package/src/commands/verify.ts +0 -91
- package/src/commands/wallet.ts +0 -3280
- package/src/commands/watch.ts +0 -23
- package/src/commands/watchtower.ts +0 -248
- package/src/commands/workroom.ts +0 -959
- package/src/config.ts +0 -174
- package/src/daemon/config.ts +0 -308
- package/src/daemon/hire-listener.ts +0 -226
- package/src/daemon/index.ts +0 -955
- package/src/daemon/job-lifecycle.ts +0 -215
- package/src/daemon/notify.ts +0 -157
- package/src/daemon/token-metering.ts +0 -183
- package/src/daemon/userops.ts +0 -119
- package/src/daemon/wallet-monitor.ts +0 -90
- package/src/drain-v4.ts +0 -159
- package/src/endpoint-config.ts +0 -83
- package/src/endpoint-notify.ts +0 -46
- package/src/index.ts +0 -26
- package/src/openshell-runtime.ts +0 -277
- package/src/program.ts +0 -83
- package/src/repl.ts +0 -680
- package/src/signing.ts +0 -28
- package/src/telegram-notify.ts +0 -88
- package/src/ui/banner.ts +0 -51
- package/src/ui/colors.ts +0 -30
- package/src/ui/format.ts +0 -77
- package/src/ui/spinner.ts +0 -56
- package/src/ui/tree.ts +0 -16
- package/src/utils/format.ts +0 -48
- package/src/utils/hash.ts +0 -5
- package/src/utils/time.ts +0 -15
- package/src/wallet-router.ts +0 -178
- package/src/walletconnect-session.ts +0 -27
- package/src/walletconnect.ts +0 -294
- package/test/time.test.js +0 -11
- 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
|
-
}
|