arc402-cli 1.0.0-rc.1 → 1.0.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 (253) 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 +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/wallet.d.ts.map +1 -1
  28. package/dist/commands/wallet.js +299 -65
  29. package/dist/commands/wallet.js.map +1 -1
  30. package/dist/commands/watch.d.ts.map +1 -1
  31. package/dist/commands/watch.js +146 -9
  32. package/dist/commands/watch.js.map +1 -1
  33. package/dist/commands/workroom.d.ts.map +1 -1
  34. package/dist/commands/workroom.js +112 -6
  35. package/dist/commands/workroom.js.map +1 -1
  36. package/dist/config.d.ts +12 -0
  37. package/dist/config.d.ts.map +1 -1
  38. package/dist/config.js +41 -4
  39. package/dist/config.js.map +1 -1
  40. package/dist/daemon/compute-metering.d.ts +61 -0
  41. package/dist/daemon/compute-metering.d.ts.map +1 -0
  42. package/dist/daemon/compute-metering.js +299 -0
  43. package/dist/daemon/compute-metering.js.map +1 -0
  44. package/dist/daemon/compute-session.d.ts +100 -0
  45. package/dist/daemon/compute-session.d.ts.map +1 -0
  46. package/dist/daemon/compute-session.js +231 -0
  47. package/dist/daemon/compute-session.js.map +1 -0
  48. package/dist/daemon/config.d.ts +33 -1
  49. package/dist/daemon/config.d.ts.map +1 -1
  50. package/dist/daemon/config.js +69 -0
  51. package/dist/daemon/config.js.map +1 -1
  52. package/dist/daemon/credentials.d.ts +24 -0
  53. package/dist/daemon/credentials.d.ts.map +1 -0
  54. package/dist/daemon/credentials.js +80 -0
  55. package/dist/daemon/credentials.js.map +1 -0
  56. package/dist/daemon/delivery-client.d.ts +35 -0
  57. package/dist/daemon/delivery-client.d.ts.map +1 -0
  58. package/dist/daemon/delivery-client.js +231 -0
  59. package/dist/daemon/delivery-client.js.map +1 -0
  60. package/dist/daemon/file-delivery.d.ts +98 -0
  61. package/dist/daemon/file-delivery.d.ts.map +1 -0
  62. package/dist/daemon/file-delivery.js +461 -0
  63. package/dist/daemon/file-delivery.js.map +1 -0
  64. package/dist/daemon/index.d.ts +1 -0
  65. package/dist/daemon/index.d.ts.map +1 -1
  66. package/dist/daemon/index.js +793 -227
  67. package/dist/daemon/index.js.map +1 -1
  68. package/dist/daemon/notify.d.ts +35 -6
  69. package/dist/daemon/notify.d.ts.map +1 -1
  70. package/dist/daemon/notify.js +176 -48
  71. package/dist/daemon/notify.js.map +1 -1
  72. package/dist/daemon/worker-executor.d.ts +71 -0
  73. package/dist/daemon/worker-executor.d.ts.map +1 -0
  74. package/dist/daemon/worker-executor.js +382 -0
  75. package/dist/daemon/worker-executor.js.map +1 -0
  76. package/dist/drain-v4.js +2 -2
  77. package/dist/drain-v4.js.map +1 -1
  78. package/dist/endpoint-notify.d.ts +9 -1
  79. package/dist/endpoint-notify.d.ts.map +1 -1
  80. package/dist/endpoint-notify.js +116 -3
  81. package/dist/endpoint-notify.js.map +1 -1
  82. package/dist/index.js +81 -1
  83. package/dist/index.js.map +1 -1
  84. package/dist/program.d.ts.map +1 -1
  85. package/dist/program.js +6 -0
  86. package/dist/program.js.map +1 -1
  87. package/dist/repl.d.ts.map +1 -1
  88. package/dist/repl.js +69 -486
  89. package/dist/repl.js.map +1 -1
  90. package/dist/tui/App.d.ts +12 -0
  91. package/dist/tui/App.d.ts.map +1 -0
  92. package/dist/tui/App.js +154 -0
  93. package/dist/tui/App.js.map +1 -0
  94. package/dist/tui/Footer.d.ts +11 -0
  95. package/dist/tui/Footer.d.ts.map +1 -0
  96. package/dist/tui/Footer.js +13 -0
  97. package/dist/tui/Footer.js.map +1 -0
  98. package/dist/tui/Header.d.ts +14 -0
  99. package/dist/tui/Header.d.ts.map +1 -0
  100. package/dist/tui/Header.js +19 -0
  101. package/dist/tui/Header.js.map +1 -0
  102. package/dist/tui/InputLine.d.ts +11 -0
  103. package/dist/tui/InputLine.d.ts.map +1 -0
  104. package/dist/tui/InputLine.js +145 -0
  105. package/dist/tui/InputLine.js.map +1 -0
  106. package/dist/tui/Viewport.d.ts +14 -0
  107. package/dist/tui/Viewport.d.ts.map +1 -0
  108. package/dist/tui/Viewport.js +48 -0
  109. package/dist/tui/Viewport.js.map +1 -0
  110. package/dist/tui/WalletConnectPairing.d.ts +23 -0
  111. package/dist/tui/WalletConnectPairing.d.ts.map +1 -0
  112. package/dist/tui/WalletConnectPairing.js +61 -0
  113. package/dist/tui/WalletConnectPairing.js.map +1 -0
  114. package/dist/tui/components/Button.d.ts +7 -0
  115. package/dist/tui/components/Button.d.ts.map +1 -0
  116. package/dist/tui/components/Button.js +21 -0
  117. package/dist/tui/components/Button.js.map +1 -0
  118. package/dist/tui/components/CeremonyView.d.ts +13 -0
  119. package/dist/tui/components/CeremonyView.d.ts.map +1 -0
  120. package/dist/tui/components/CeremonyView.js +10 -0
  121. package/dist/tui/components/CeremonyView.js.map +1 -0
  122. package/dist/tui/components/CompletionDropdown.d.ts +7 -0
  123. package/dist/tui/components/CompletionDropdown.d.ts.map +1 -0
  124. package/dist/tui/components/CompletionDropdown.js +23 -0
  125. package/dist/tui/components/CompletionDropdown.js.map +1 -0
  126. package/dist/tui/components/ConfirmPrompt.d.ts +9 -0
  127. package/dist/tui/components/ConfirmPrompt.d.ts.map +1 -0
  128. package/dist/tui/components/ConfirmPrompt.js +10 -0
  129. package/dist/tui/components/ConfirmPrompt.js.map +1 -0
  130. package/dist/tui/components/CustomTextInput.d.ts +15 -0
  131. package/dist/tui/components/CustomTextInput.d.ts.map +1 -0
  132. package/dist/tui/components/CustomTextInput.js +99 -0
  133. package/dist/tui/components/CustomTextInput.js.map +1 -0
  134. package/dist/tui/components/InteractiveTable.d.ts +14 -0
  135. package/dist/tui/components/InteractiveTable.d.ts.map +1 -0
  136. package/dist/tui/components/InteractiveTable.js +61 -0
  137. package/dist/tui/components/InteractiveTable.js.map +1 -0
  138. package/dist/tui/components/StepSpinner.d.ts +11 -0
  139. package/dist/tui/components/StepSpinner.d.ts.map +1 -0
  140. package/dist/tui/components/StepSpinner.js +32 -0
  141. package/dist/tui/components/StepSpinner.js.map +1 -0
  142. package/dist/tui/components/Toast.d.ts +18 -0
  143. package/dist/tui/components/Toast.d.ts.map +1 -0
  144. package/dist/tui/components/Toast.js +29 -0
  145. package/dist/tui/components/Toast.js.map +1 -0
  146. package/dist/tui/index.d.ts +2 -0
  147. package/dist/tui/index.d.ts.map +1 -0
  148. package/dist/tui/index.js +55 -0
  149. package/dist/tui/index.js.map +1 -0
  150. package/dist/tui/useChat.d.ts +11 -0
  151. package/dist/tui/useChat.d.ts.map +1 -0
  152. package/dist/tui/useChat.js +91 -0
  153. package/dist/tui/useChat.js.map +1 -0
  154. package/dist/tui/useCommand.d.ts +12 -0
  155. package/dist/tui/useCommand.d.ts.map +1 -0
  156. package/dist/tui/useCommand.js +137 -0
  157. package/dist/tui/useCommand.js.map +1 -0
  158. package/dist/tui/useNotifications.d.ts +9 -0
  159. package/dist/tui/useNotifications.d.ts.map +1 -0
  160. package/dist/tui/useNotifications.js +17 -0
  161. package/dist/tui/useNotifications.js.map +1 -0
  162. package/dist/tui/useScroll.d.ts +17 -0
  163. package/dist/tui/useScroll.d.ts.map +1 -0
  164. package/dist/tui/useScroll.js +46 -0
  165. package/dist/tui/useScroll.js.map +1 -0
  166. package/dist/ui/format.d.ts.map +1 -1
  167. package/dist/ui/format.js +2 -0
  168. package/dist/ui/format.js.map +1 -1
  169. package/dist/ui/qr-render.d.ts +25 -0
  170. package/dist/ui/qr-render.d.ts.map +1 -0
  171. package/dist/ui/qr-render.js +90 -0
  172. package/dist/ui/qr-render.js.map +1 -0
  173. package/dist/ui/rpc-fallback.d.ts +11 -0
  174. package/dist/ui/rpc-fallback.d.ts.map +1 -0
  175. package/dist/ui/rpc-fallback.js +58 -0
  176. package/dist/ui/rpc-fallback.js.map +1 -0
  177. package/dist/walletconnect.d.ts +4 -0
  178. package/dist/walletconnect.d.ts.map +1 -1
  179. package/dist/walletconnect.js.map +1 -1
  180. package/package.json +10 -2
  181. package/scripts/authorize-machine-key.ts +0 -43
  182. package/scripts/drain-wallet.ts +0 -149
  183. package/scripts/execute-spend-only.ts +0 -81
  184. package/scripts/register-agent-userop.ts +0 -186
  185. package/src/abis.ts +0 -187
  186. package/src/bundler.ts +0 -235
  187. package/src/client.ts +0 -36
  188. package/src/coinbase-smart-wallet.ts +0 -51
  189. package/src/commands/accept.ts +0 -64
  190. package/src/commands/agent-handshake.ts +0 -72
  191. package/src/commands/agent.ts +0 -691
  192. package/src/commands/agreements.ts +0 -350
  193. package/src/commands/arbitrator.ts +0 -180
  194. package/src/commands/arena-handshake.ts +0 -257
  195. package/src/commands/arena.ts +0 -122
  196. package/src/commands/cancel.ts +0 -35
  197. package/src/commands/channel.ts +0 -218
  198. package/src/commands/coldstart.ts +0 -165
  199. package/src/commands/config.ts +0 -58
  200. package/src/commands/contract-interaction.ts +0 -166
  201. package/src/commands/daemon.ts +0 -978
  202. package/src/commands/deliver.ts +0 -148
  203. package/src/commands/discover.ts +0 -297
  204. package/src/commands/dispute.ts +0 -375
  205. package/src/commands/endpoint.ts +0 -620
  206. package/src/commands/feed.ts +0 -229
  207. package/src/commands/hire.ts +0 -245
  208. package/src/commands/migrate.ts +0 -177
  209. package/src/commands/negotiate.ts +0 -271
  210. package/src/commands/openshell.ts +0 -1055
  211. package/src/commands/owner.ts +0 -35
  212. package/src/commands/policy.ts +0 -263
  213. package/src/commands/relay.ts +0 -273
  214. package/src/commands/remediate.ts +0 -24
  215. package/src/commands/reputation.ts +0 -79
  216. package/src/commands/setup.ts +0 -343
  217. package/src/commands/trust.ts +0 -27
  218. package/src/commands/verify.ts +0 -91
  219. package/src/commands/wallet.ts +0 -3280
  220. package/src/commands/watch.ts +0 -23
  221. package/src/commands/watchtower.ts +0 -248
  222. package/src/commands/workroom.ts +0 -959
  223. package/src/config.ts +0 -174
  224. package/src/daemon/config.ts +0 -308
  225. package/src/daemon/hire-listener.ts +0 -226
  226. package/src/daemon/index.ts +0 -955
  227. package/src/daemon/job-lifecycle.ts +0 -215
  228. package/src/daemon/notify.ts +0 -157
  229. package/src/daemon/token-metering.ts +0 -183
  230. package/src/daemon/userops.ts +0 -119
  231. package/src/daemon/wallet-monitor.ts +0 -90
  232. package/src/drain-v4.ts +0 -159
  233. package/src/endpoint-config.ts +0 -83
  234. package/src/endpoint-notify.ts +0 -46
  235. package/src/index.ts +0 -26
  236. package/src/openshell-runtime.ts +0 -277
  237. package/src/program.ts +0 -83
  238. package/src/repl.ts +0 -680
  239. package/src/signing.ts +0 -28
  240. package/src/telegram-notify.ts +0 -88
  241. package/src/ui/banner.ts +0 -51
  242. package/src/ui/colors.ts +0 -30
  243. package/src/ui/format.ts +0 -77
  244. package/src/ui/spinner.ts +0 -56
  245. package/src/ui/tree.ts +0 -16
  246. package/src/utils/format.ts +0 -48
  247. package/src/utils/hash.ts +0 -5
  248. package/src/utils/time.ts +0 -15
  249. package/src/wallet-router.ts +0 -178
  250. package/src/walletconnect-session.ts +0 -27
  251. package/src/walletconnect.ts +0 -294
  252. package/test/time.test.js +0 -11
  253. package/tsconfig.json +0 -19
@@ -1,226 +0,0 @@
1
- /**
2
- * Hire listener — polls relay for incoming hire proposals,
3
- * evaluates against policy, and queues for approval or auto-accepts.
4
- */
5
- import * as http from "http";
6
- import * as https from "https";
7
- import { ethers } from "ethers";
8
- import type { DaemonConfig } from "./config";
9
- import type { DaemonDB } from "./index";
10
- import type { Notifier } from "./notify";
11
-
12
- export interface HireProposal {
13
- messageId: string;
14
- hirerAddress: string;
15
- capability: string;
16
- priceEth: string;
17
- deadlineUnix: number;
18
- specHash: string;
19
- agreementId?: string;
20
- signature?: string;
21
- }
22
-
23
- export interface PolicyResult {
24
- allowed: boolean;
25
- reason?: string;
26
- }
27
-
28
- function relayGet(
29
- relayUrl: string,
30
- urlPath: string
31
- ): Promise<{ status: number; data: unknown }> {
32
- return new Promise((resolve, reject) => {
33
- const parsed = new URL(urlPath, relayUrl);
34
- const isHttps = parsed.protocol === "https:";
35
- const mod = isHttps ? https : http;
36
- const options: http.RequestOptions = {
37
- hostname: parsed.hostname,
38
- port: parsed.port || (isHttps ? 443 : 80),
39
- path: parsed.pathname + (parsed.search || ""),
40
- method: "GET",
41
- headers: { "Content-Type": "application/json" },
42
- };
43
- const req = mod.request(options, (res) => {
44
- let raw = "";
45
- res.on("data", (c: Buffer) => { raw += c.toString(); });
46
- res.on("end", () => {
47
- try {
48
- resolve({ status: res.statusCode ?? 0, data: JSON.parse(raw) });
49
- } catch {
50
- resolve({ status: res.statusCode ?? 0, data: raw });
51
- }
52
- });
53
- });
54
- req.on("error", reject);
55
- req.end();
56
- });
57
- }
58
-
59
- export function evaluatePolicy(
60
- proposal: HireProposal,
61
- config: DaemonConfig,
62
- activeCount: number
63
- ): PolicyResult {
64
- const policy = config.policy;
65
-
66
- // Concurrency check
67
- if (activeCount >= config.relay.max_concurrent_agreements) {
68
- return { allowed: false, reason: "at_capacity" };
69
- }
70
-
71
- // Price check
72
- try {
73
- const priceWei = ethers.parseEther(proposal.priceEth || "0");
74
- const maxWei = ethers.parseEther(policy.max_price_eth);
75
- if (priceWei > maxWei) {
76
- return { allowed: false, reason: "price_exceeds_policy" };
77
- }
78
- } catch {
79
- return { allowed: false, reason: "invalid_price" };
80
- }
81
-
82
- // Capability check (empty list = accept all)
83
- if (policy.allowed_capabilities.length > 0 && proposal.capability) {
84
- if (!policy.allowed_capabilities.includes(proposal.capability)) {
85
- return { allowed: false, reason: "capability_not_allowed" };
86
- }
87
- }
88
-
89
- // Deadline check
90
- const now = Math.floor(Date.now() / 1000);
91
- if (proposal.deadlineUnix > 0) {
92
- if (proposal.deadlineUnix < now + policy.min_hire_lead_time_seconds) {
93
- return { allowed: false, reason: "deadline_too_soon" };
94
- }
95
- }
96
-
97
- return { allowed: true };
98
- }
99
-
100
- function parseProposal(msg: Record<string, unknown>): HireProposal | null {
101
- const payload = (msg.payload ?? msg) as Record<string, unknown>;
102
- if (!payload.hirerAddress && !payload.hirer_address && !payload.from) return null;
103
-
104
- return {
105
- messageId: String(msg.messageId ?? msg.id ?? `msg_${Date.now()}`),
106
- hirerAddress: String(payload.hirerAddress ?? payload.hirer_address ?? msg.from ?? ""),
107
- capability: String(payload.capability ?? ""),
108
- priceEth: String(payload.priceEth ?? payload.price_eth ?? "0"),
109
- deadlineUnix: Number(payload.deadlineUnix ?? payload.deadline ?? 0),
110
- specHash: String(payload.specHash ?? payload.spec_hash ?? ""),
111
- agreementId: payload.agreementId ? String(payload.agreementId) : undefined,
112
- signature: payload.signature ? String(payload.signature) : undefined,
113
- };
114
- }
115
-
116
- export class HireListener {
117
- private config: DaemonConfig;
118
- private db: DaemonDB;
119
- private notifier: Notifier;
120
- private walletAddress: string;
121
- private lastSeenMessageId: string | null = null;
122
- private onApprove: ((hireId: string) => Promise<void>) | null = null;
123
-
124
- constructor(
125
- config: DaemonConfig,
126
- db: DaemonDB,
127
- notifier: Notifier,
128
- walletAddress: string
129
- ) {
130
- this.config = config;
131
- this.db = db;
132
- this.notifier = notifier;
133
- this.walletAddress = walletAddress;
134
- }
135
-
136
- setApproveCallback(cb: (hireId: string) => Promise<void>): void {
137
- this.onApprove = cb;
138
- }
139
-
140
- async poll(): Promise<void> {
141
- const relayUrl = this.config.relay.relay_url;
142
- if (!relayUrl) return;
143
-
144
- try {
145
- const qs =
146
- `?address=${encodeURIComponent(this.walletAddress)}` +
147
- (this.lastSeenMessageId ? `&since=${encodeURIComponent(this.lastSeenMessageId)}` : "");
148
-
149
- const result = await relayGet(relayUrl, `/poll${qs}`);
150
- const data = result.data as { messages?: Array<Record<string, unknown>> };
151
- const messages = data.messages ?? [];
152
-
153
- for (const msg of messages) {
154
- this.lastSeenMessageId = String(msg.messageId ?? "");
155
- await this.handleMessage(msg);
156
- }
157
- } catch {
158
- // Transient relay failure — retry next poll
159
- }
160
- }
161
-
162
- private async handleMessage(msg: Record<string, unknown>): Promise<void> {
163
- const proposal = parseProposal(msg);
164
- if (!proposal) return;
165
-
166
- // Dedup — skip if already in DB
167
- const existing = this.db.getHireRequest(proposal.messageId);
168
- if (existing) return;
169
-
170
- // Count active agreements
171
- const activeCount = this.db.countActiveHireRequests();
172
-
173
- // Policy evaluation
174
- const policyResult = evaluatePolicy(proposal, this.config, activeCount);
175
-
176
- if (!policyResult.allowed) {
177
- // Reject
178
- const hireId = proposal.messageId;
179
- this.db.insertHireRequest({
180
- id: hireId,
181
- agreement_id: proposal.agreementId ?? null,
182
- hirer_address: proposal.hirerAddress,
183
- capability: proposal.capability,
184
- price_eth: proposal.priceEth,
185
- deadline_unix: proposal.deadlineUnix,
186
- spec_hash: proposal.specHash,
187
- status: "rejected",
188
- reject_reason: policyResult.reason ?? "policy_violation",
189
- });
190
-
191
- if (this.config.notifications.notify_on_hire_rejected) {
192
- await this.notifier.notifyHireRejected(hireId, policyResult.reason ?? "policy_violation");
193
- }
194
- return;
195
- }
196
-
197
- // Insert as pending_approval or auto-accept
198
- const hireId = proposal.messageId;
199
- const status = this.config.policy.auto_accept ? "accepted" : "pending_approval";
200
-
201
- this.db.insertHireRequest({
202
- id: hireId,
203
- agreement_id: proposal.agreementId ?? null,
204
- hirer_address: proposal.hirerAddress,
205
- capability: proposal.capability,
206
- price_eth: proposal.priceEth,
207
- deadline_unix: proposal.deadlineUnix,
208
- spec_hash: proposal.specHash,
209
- status,
210
- reject_reason: null,
211
- });
212
-
213
- if (status === "pending_approval") {
214
- if (this.config.notifications.notify_on_hire_request) {
215
- await this.notifier.notifyHireRequest(
216
- hireId,
217
- proposal.hirerAddress,
218
- proposal.priceEth,
219
- proposal.capability
220
- );
221
- }
222
- } else if (status === "accepted" && this.onApprove) {
223
- await this.onApprove(hireId);
224
- }
225
- }
226
- }