arc402-cli 0.9.18 → 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 (358) 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.js +48 -9
  161. package/dist/endpoint-notify.js.map +1 -1
  162. package/dist/index.js +50 -18
  163. package/dist/index.js.map +1 -1
  164. package/dist/openshell-runtime.d.ts.map +1 -1
  165. package/dist/openshell-runtime.js +82 -38
  166. package/dist/openshell-runtime.js.map +1 -1
  167. package/dist/program.d.ts.map +1 -1
  168. package/dist/program.js +85 -78
  169. package/dist/program.js.map +1 -1
  170. package/dist/repl.js +31 -25
  171. package/dist/repl.js.map +1 -1
  172. package/dist/signing.js +6 -3
  173. package/dist/signing.js.map +1 -1
  174. package/dist/telegram-notify.js +40 -3
  175. package/dist/telegram-notify.js.map +1 -1
  176. package/dist/tui/App.d.ts.map +1 -1
  177. package/dist/tui/App.js +56 -89
  178. package/dist/tui/App.js.map +1 -1
  179. package/dist/tui/Footer.js +7 -4
  180. package/dist/tui/Footer.js.map +1 -1
  181. package/dist/tui/Header.d.ts +1 -1
  182. package/dist/tui/Header.d.ts.map +1 -1
  183. package/dist/tui/Header.js +14 -9
  184. package/dist/tui/Header.js.map +1 -1
  185. package/dist/tui/InputLine.d.ts +2 -1
  186. package/dist/tui/InputLine.d.ts.map +1 -1
  187. package/dist/tui/InputLine.js +47 -97
  188. package/dist/tui/InputLine.js.map +1 -1
  189. package/dist/tui/Viewport.d.ts +1 -2
  190. package/dist/tui/Viewport.d.ts.map +1 -1
  191. package/dist/tui/Viewport.js +26 -6
  192. package/dist/tui/Viewport.js.map +1 -1
  193. package/dist/tui/WalletConnectPairing.js +19 -16
  194. package/dist/tui/WalletConnectPairing.js.map +1 -1
  195. package/dist/tui/components/Button.js +9 -6
  196. package/dist/tui/components/Button.js.map +1 -1
  197. package/dist/tui/components/CeremonyView.js +8 -5
  198. package/dist/tui/components/CeremonyView.js.map +1 -1
  199. package/dist/tui/components/CompletionDropdown.js +9 -6
  200. package/dist/tui/components/CompletionDropdown.js.map +1 -1
  201. package/dist/tui/components/ConfirmPrompt.js +8 -5
  202. package/dist/tui/components/ConfirmPrompt.js.map +1 -1
  203. package/dist/tui/components/CustomTextInput.js +14 -11
  204. package/dist/tui/components/CustomTextInput.js.map +1 -1
  205. package/dist/tui/components/InteractiveTable.js +12 -9
  206. package/dist/tui/components/InteractiveTable.js.map +1 -1
  207. package/dist/tui/components/StepSpinner.js +13 -10
  208. package/dist/tui/components/StepSpinner.js.map +1 -1
  209. package/dist/tui/components/Toast.js +12 -8
  210. package/dist/tui/components/Toast.js.map +1 -1
  211. package/dist/tui/index.d.ts.map +1 -1
  212. package/dist/tui/index.js +21 -28
  213. package/dist/tui/index.js.map +1 -1
  214. package/dist/tui/useChat.js +19 -13
  215. package/dist/tui/useChat.js.map +1 -1
  216. package/dist/tui/useCommand.d.ts +2 -3
  217. package/dist/tui/useCommand.d.ts.map +1 -1
  218. package/dist/tui/useCommand.js +24 -100
  219. package/dist/tui/useCommand.js.map +1 -1
  220. package/dist/tui/useNotifications.js +8 -5
  221. package/dist/tui/useNotifications.js.map +1 -1
  222. package/dist/tui/useScroll.d.ts.map +1 -1
  223. package/dist/tui/useScroll.js +12 -15
  224. package/dist/tui/useScroll.js.map +1 -1
  225. package/dist/ui/banner.d.ts +0 -12
  226. package/dist/ui/banner.d.ts.map +1 -1
  227. package/dist/ui/banner.js +19 -35
  228. package/dist/ui/banner.js.map +1 -1
  229. package/dist/ui/colors.js +19 -13
  230. package/dist/ui/colors.js.map +1 -1
  231. package/dist/ui/format.js +14 -6
  232. package/dist/ui/format.js.map +1 -1
  233. package/dist/ui/qr-render.js +11 -4
  234. package/dist/ui/qr-render.js.map +1 -1
  235. package/dist/ui/rpc-fallback.js +11 -6
  236. package/dist/ui/rpc-fallback.js.map +1 -1
  237. package/dist/ui/spinner.js +12 -6
  238. package/dist/ui/spinner.js.map +1 -1
  239. package/dist/ui/tree.js +6 -3
  240. package/dist/ui/tree.js.map +1 -1
  241. package/dist/utils/format.js +41 -27
  242. package/dist/utils/format.js.map +1 -1
  243. package/dist/utils/hash.js +42 -4
  244. package/dist/utils/hash.js.map +1 -1
  245. package/dist/utils/time.js +6 -2
  246. package/dist/utils/time.js.map +1 -1
  247. package/dist/wallet-router.d.ts +1 -1
  248. package/dist/wallet-router.d.ts.map +1 -1
  249. package/dist/wallet-router.js +19 -12
  250. package/dist/wallet-router.js.map +1 -1
  251. package/dist/walletconnect-session.d.ts +1 -1
  252. package/dist/walletconnect-session.d.ts.map +1 -1
  253. package/dist/walletconnect-session.js +11 -6
  254. package/dist/walletconnect-session.js.map +1 -1
  255. package/dist/walletconnect.d.ts +5 -6
  256. package/dist/walletconnect.d.ts.map +1 -1
  257. package/dist/walletconnect.js +35 -32
  258. package/dist/walletconnect.js.map +1 -1
  259. package/package.json +11 -10
  260. package/INK6-UX-SPEC.md +0 -446
  261. package/MIGRATION-SPEC.md +0 -108
  262. package/TUI-SPEC.md +0 -214
  263. package/scripts/authorize-machine-key.ts +0 -43
  264. package/scripts/drain-wallet.ts +0 -149
  265. package/scripts/execute-spend-only.ts +0 -81
  266. package/scripts/register-agent-userop.ts +0 -186
  267. package/src/abis.ts +0 -187
  268. package/src/bundler.ts +0 -235
  269. package/src/client.ts +0 -36
  270. package/src/coinbase-smart-wallet.ts +0 -51
  271. package/src/commands/accept.ts +0 -64
  272. package/src/commands/agent-handshake.ts +0 -72
  273. package/src/commands/agent.ts +0 -691
  274. package/src/commands/agreements.ts +0 -350
  275. package/src/commands/arbitrator.ts +0 -180
  276. package/src/commands/arena-handshake.ts +0 -274
  277. package/src/commands/arena.ts +0 -122
  278. package/src/commands/backup.ts +0 -117
  279. package/src/commands/cancel.ts +0 -35
  280. package/src/commands/channel.ts +0 -218
  281. package/src/commands/coldstart.ts +0 -165
  282. package/src/commands/config.ts +0 -68
  283. package/src/commands/contract-interaction.ts +0 -166
  284. package/src/commands/daemon.ts +0 -1054
  285. package/src/commands/deliver.ts +0 -148
  286. package/src/commands/discover.ts +0 -350
  287. package/src/commands/dispute.ts +0 -375
  288. package/src/commands/doctor.ts +0 -172
  289. package/src/commands/endpoint.ts +0 -620
  290. package/src/commands/feed.ts +0 -229
  291. package/src/commands/hire.ts +0 -245
  292. package/src/commands/migrate.ts +0 -177
  293. package/src/commands/negotiate.ts +0 -272
  294. package/src/commands/openshell.ts +0 -1055
  295. package/src/commands/owner.ts +0 -35
  296. package/src/commands/policy.ts +0 -263
  297. package/src/commands/relay.ts +0 -277
  298. package/src/commands/remediate.ts +0 -24
  299. package/src/commands/reputation.ts +0 -79
  300. package/src/commands/setup.ts +0 -343
  301. package/src/commands/trust.ts +0 -27
  302. package/src/commands/verify.ts +0 -91
  303. package/src/commands/wallet.ts +0 -3548
  304. package/src/commands/watch.ts +0 -220
  305. package/src/commands/watchtower.ts +0 -248
  306. package/src/commands/workroom.ts +0 -963
  307. package/src/config.ts +0 -220
  308. package/src/daemon/config.ts +0 -344
  309. package/src/daemon/hire-listener.ts +0 -226
  310. package/src/daemon/index.ts +0 -1089
  311. package/src/daemon/job-lifecycle.ts +0 -215
  312. package/src/daemon/notify.ts +0 -297
  313. package/src/daemon/token-metering.ts +0 -183
  314. package/src/daemon/userops.ts +0 -119
  315. package/src/daemon/wallet-monitor.ts +0 -90
  316. package/src/drain-v4.ts +0 -159
  317. package/src/endpoint-config.ts +0 -83
  318. package/src/endpoint-notify.ts +0 -129
  319. package/src/index.ts +0 -74
  320. package/src/openshell-runtime.ts +0 -281
  321. package/src/program.ts +0 -88
  322. package/src/repl.ts +0 -178
  323. package/src/signing.ts +0 -28
  324. package/src/telegram-notify.ts +0 -88
  325. package/src/tui/App.tsx +0 -263
  326. package/src/tui/Footer.tsx +0 -18
  327. package/src/tui/Header.tsx +0 -45
  328. package/src/tui/InputLine.tsx +0 -243
  329. package/src/tui/Viewport.tsx +0 -51
  330. package/src/tui/WalletConnectPairing.tsx +0 -114
  331. package/src/tui/components/Button.tsx +0 -38
  332. package/src/tui/components/CeremonyView.tsx +0 -39
  333. package/src/tui/components/CompletionDropdown.tsx +0 -56
  334. package/src/tui/components/ConfirmPrompt.tsx +0 -36
  335. package/src/tui/components/CustomTextInput.tsx +0 -132
  336. package/src/tui/components/InteractiveTable.tsx +0 -106
  337. package/src/tui/components/StepSpinner.tsx +0 -84
  338. package/src/tui/components/Toast.tsx +0 -59
  339. package/src/tui/index.tsx +0 -90
  340. package/src/tui/useChat.ts +0 -103
  341. package/src/tui/useCommand.ts +0 -238
  342. package/src/tui/useNotifications.ts +0 -28
  343. package/src/tui/useScroll.ts +0 -69
  344. package/src/ui/banner.ts +0 -78
  345. package/src/ui/colors.ts +0 -30
  346. package/src/ui/format.ts +0 -78
  347. package/src/ui/qr-render.ts +0 -92
  348. package/src/ui/rpc-fallback.ts +0 -59
  349. package/src/ui/spinner.ts +0 -56
  350. package/src/ui/tree.ts +0 -16
  351. package/src/utils/format.ts +0 -48
  352. package/src/utils/hash.ts +0 -5
  353. package/src/utils/time.ts +0 -15
  354. package/src/wallet-router.ts +0 -178
  355. package/src/walletconnect-session.ts +0 -27
  356. package/src/walletconnect.ts +0 -309
  357. package/test/time.test.js +0 -11
  358. package/tsconfig.json +0 -33
@@ -1,22 +1,56 @@
1
- import * as crypto from "node:crypto";
2
- import * as fs from "fs";
3
- import * as path from "path";
4
- import * as http from "http";
5
- import { spawnSync } from "child_process";
6
- import { ARC402_DIR, runCmd, } from "../openshell-runtime.js";
7
- import { DAEMON_TOML, loadDaemonConfig } from "../daemon/config.js";
8
- import { c } from "../ui/colors.js";
9
- import { renderTree } from "../ui/tree.js";
10
- import { fileURLToPath } from "node:url";
11
- const __filename = fileURLToPath(import.meta.url);
12
- const __dirname = path.dirname(__filename);
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.registerWorkroomCommands = registerWorkroomCommands;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const http = __importStar(require("http"));
40
+ const child_process_1 = require("child_process");
41
+ const openshell_runtime_1 = require("../openshell-runtime");
42
+ const config_1 = require("../daemon/config");
43
+ const credentials_1 = require("../daemon/credentials");
44
+ const colors_1 = require("../ui/colors");
45
+ const tree_1 = require("../ui/tree");
13
46
  // ─── Daemon lifecycle notify ──────────────────────────────────────────────────
14
47
  function notifyDaemonWorkroomStatus(event, agentAddress, jobId, port = 4402) {
15
48
  try {
16
49
  // Try to read port from daemon config
17
50
  let daemonPort = port;
18
- if (fs.existsSync(DAEMON_TOML)) {
51
+ if (fs.existsSync(config_1.DAEMON_TOML)) {
19
52
  try {
53
+ const { loadDaemonConfig } = require("../daemon/config");
20
54
  const cfg = loadDaemonConfig();
21
55
  daemonPort = cfg.relay?.listen_port ?? port;
22
56
  }
@@ -44,36 +78,43 @@ function notifyDaemonWorkroomStatus(event, agentAddress, jobId, port = 4402) {
44
78
  // ─── Constants ────────────────────────────────────────────────────────────────
45
79
  const WORKROOM_IMAGE = "arc402-workroom";
46
80
  const WORKROOM_CONTAINER = "arc402-workroom";
47
- const POLICY_FILE = path.join(ARC402_DIR, "openshell-policy.yaml");
48
- const ARENA_POLICY_FILE = path.join(ARC402_DIR, "arena-policy.yaml");
49
- const ARENA_DATA_DIR = path.join(ARC402_DIR, "arena");
81
+ const POLICY_FILE = path.join(openshell_runtime_1.ARC402_DIR, "openshell-policy.yaml");
82
+ const ARENA_POLICY_FILE = path.join(openshell_runtime_1.ARC402_DIR, "arena-policy.yaml");
83
+ const ARENA_DATA_DIR = path.join(openshell_runtime_1.ARC402_DIR, "arena");
50
84
  const WORKROOM_DIR = path.join(__dirname, "..", "..", "..", "workroom"); // relative to cli/dist
85
+ // Template ships at workroom/credentials.template.toml, resolved from cli/dist/commands/
86
+ const CREDENTIALS_TEMPLATE = path.resolve(__dirname, "..", "..", "..", "workroom", "credentials.template.toml");
51
87
  // ─── Helpers ──────────────────────────────────────────────────────────────────
52
88
  function dockerAvailable() {
53
- const r = runCmd("docker", ["info", "--format", "{{.ServerVersion}}"]);
89
+ const r = (0, openshell_runtime_1.runCmd)("docker", ["info", "--format", "{{.ServerVersion}}"]);
54
90
  return r.ok;
55
91
  }
56
92
  function containerExists() {
57
- const r = runCmd("docker", ["inspect", WORKROOM_CONTAINER, "--format", "{{.State.Status}}"]);
93
+ const r = (0, openshell_runtime_1.runCmd)("docker", ["inspect", WORKROOM_CONTAINER, "--format", "{{.State.Status}}"]);
58
94
  return r.ok;
59
95
  }
60
96
  function containerRunning() {
61
- const r = runCmd("docker", ["inspect", WORKROOM_CONTAINER, "--format", "{{.State.Running}}"]);
97
+ const r = (0, openshell_runtime_1.runCmd)("docker", ["inspect", WORKROOM_CONTAINER, "--format", "{{.State.Running}}"]);
62
98
  return r.ok && r.stdout.trim() === "true";
63
99
  }
64
100
  function imageExists() {
65
- const r = runCmd("docker", ["image", "inspect", WORKROOM_IMAGE, "--format", "{{.Id}}"]);
101
+ const r = (0, openshell_runtime_1.runCmd)("docker", ["image", "inspect", WORKROOM_IMAGE, "--format", "{{.Id}}"]);
66
102
  return r.ok;
67
103
  }
68
- function buildImage() {
104
+ function buildImage(useGpu = false) {
69
105
  // Find the workroom directory (contains Dockerfile)
70
106
  const workroomSrc = path.resolve(__dirname, "..", "..", "..", "workroom");
71
- if (!fs.existsSync(path.join(workroomSrc, "Dockerfile"))) {
107
+ const dockerfile = useGpu ? "Dockerfile.gpu" : "Dockerfile";
108
+ if (!fs.existsSync(path.join(workroomSrc, dockerfile))) {
109
+ if (useGpu) {
110
+ console.error(`Dockerfile.gpu not found at ${workroomSrc}/Dockerfile.gpu`);
111
+ return false;
112
+ }
72
113
  console.error(`Dockerfile not found at ${workroomSrc}/Dockerfile`);
73
114
  return false;
74
115
  }
75
- console.log("Building ARC-402 Workroom image...");
76
- const result = spawnSync("docker", ["build", "-t", WORKROOM_IMAGE, workroomSrc], {
116
+ console.log(`Building ARC-402 Workroom image (${dockerfile})...`);
117
+ const result = (0, child_process_1.spawnSync)("docker", ["build", "-f", path.join(workroomSrc, dockerfile), "-t", WORKROOM_IMAGE, workroomSrc], {
77
118
  stdio: "inherit",
78
119
  });
79
120
  return result.status === 0;
@@ -82,11 +123,11 @@ function getPolicyHash() {
82
123
  if (!fs.existsSync(POLICY_FILE))
83
124
  return "(no policy file)";
84
125
  const content = fs.readFileSync(POLICY_FILE, "utf-8");
85
- // crypto imported at top level
126
+ const crypto = require("crypto");
86
127
  return "0x" + crypto.createHash("sha256").update(content).digest("hex").slice(0, 16);
87
128
  }
88
129
  // ─── Commands ─────────────────────────────────────────────────────────────────
89
- export function registerWorkroomCommands(program) {
130
+ function registerWorkroomCommands(program) {
90
131
  const workroom = program
91
132
  .command("workroom")
92
133
  .description("ARC-402 Workroom — governed execution environment for hired work. Your OpenClaw stays on the host; work runs inside the workroom.");
@@ -95,81 +136,151 @@ export function registerWorkroomCommands(program) {
95
136
  .command("init")
96
137
  .description("Create the ARC-402 Workroom: build Docker image, validate policy, prepare runtime bundle.")
97
138
  .action(async () => {
98
- console.log(c.brightCyan("ARC-402 Workroom Init"));
99
- console.log(c.dim("─────────────────────"));
139
+ console.log(colors_1.c.brightCyan("ARC-402 Workroom Init"));
140
+ console.log(colors_1.c.dim("─────────────────────"));
100
141
  // Check Docker
101
142
  if (!dockerAvailable()) {
102
- console.error(c.failure + " " + c.red("Docker is not available. Install Docker Desktop and try again."));
143
+ console.error(colors_1.c.failure + " " + colors_1.c.red("Docker is not available. Install Docker Desktop and try again."));
103
144
  process.exit(1);
104
145
  }
105
- console.log(" " + c.success + c.white(" Docker available"));
146
+ console.log(" " + colors_1.c.success + colors_1.c.white(" Docker available"));
106
147
  // Check policy file
107
148
  if (!fs.existsSync(POLICY_FILE)) {
108
- console.log(c.dim("No policy file found. Generating default..."));
149
+ console.log(colors_1.c.dim("No policy file found. Generating default..."));
109
150
  // Import and call the existing policy generator
110
- const { registerOpenShellCommands } = await import("./openshell.js");
111
- console.log(c.dim(`Policy file will be generated at: ${POLICY_FILE}`));
112
- console.log(c.dim("Run 'arc402 workroom policy preset core-launch' after init to apply defaults."));
151
+ const { registerOpenShellCommands } = require("./openshell");
152
+ console.log(colors_1.c.dim(`Policy file will be generated at: ${POLICY_FILE}`));
153
+ console.log(colors_1.c.dim("Run 'arc402 workroom policy preset core-launch' after init to apply defaults."));
113
154
  }
114
155
  else {
115
- console.log(" " + c.success + c.dim(" Policy file: ") + c.white(POLICY_FILE));
156
+ console.log(" " + colors_1.c.success + colors_1.c.dim(" Policy file: ") + colors_1.c.white(POLICY_FILE));
116
157
  }
117
158
  // Check daemon.toml
118
- if (!fs.existsSync(DAEMON_TOML)) {
119
- console.error(c.failure + " " + c.red("daemon.toml not found. Run 'arc402 daemon init' first."));
159
+ if (!fs.existsSync(config_1.DAEMON_TOML)) {
160
+ console.error(colors_1.c.failure + " " + colors_1.c.red("daemon.toml not found. Run 'arc402 daemon init' first."));
120
161
  process.exit(1);
121
162
  }
122
- console.log(" " + c.success + c.white(" daemon.toml found"));
163
+ console.log(" " + colors_1.c.success + colors_1.c.white(" daemon.toml found"));
123
164
  // Set up Arena directories and default policy
124
165
  if (!fs.existsSync(ARENA_DATA_DIR)) {
125
166
  fs.mkdirSync(ARENA_DATA_DIR, { recursive: true });
126
167
  for (const sub of ["feed", "profile", "state", "queue"]) {
127
168
  fs.mkdirSync(path.join(ARENA_DATA_DIR, sub), { recursive: true });
128
169
  }
129
- console.log(" " + c.success + c.white(" Arena directories created"));
170
+ console.log(" " + colors_1.c.success + colors_1.c.white(" Arena directories created"));
130
171
  }
131
172
  else {
132
- console.log(" " + c.success + c.white(" Arena directories exist"));
173
+ console.log(" " + colors_1.c.success + colors_1.c.white(" Arena directories exist"));
133
174
  }
134
175
  // Copy default arena policy if not present
135
176
  if (!fs.existsSync(ARENA_POLICY_FILE)) {
136
177
  const defaultArenaPolicy = path.join(WORKROOM_DIR, "arena-policy.yaml");
137
178
  if (fs.existsSync(defaultArenaPolicy)) {
138
179
  fs.copyFileSync(defaultArenaPolicy, ARENA_POLICY_FILE);
139
- console.log(" " + c.success + c.white(" Arena policy: default installed"));
180
+ console.log(" " + colors_1.c.success + colors_1.c.white(" Arena policy: default installed"));
140
181
  }
141
182
  else {
142
- console.log(" " + c.warning + " " + c.yellow("Arena policy template not found — create manually at " + ARENA_POLICY_FILE));
183
+ console.log(" " + colors_1.c.warning + " " + colors_1.c.yellow("Arena policy template not found — create manually at " + ARENA_POLICY_FILE));
143
184
  }
144
185
  }
145
186
  else {
146
- console.log(" " + c.success + c.white(" Arena policy exists"));
187
+ console.log(" " + colors_1.c.success + colors_1.c.white(" Arena policy exists"));
188
+ }
189
+ // ── Credentials template ──────────────────────────────────────────────
190
+ const workerDir = path.dirname(credentials_1.CREDENTIALS_PATH);
191
+ if (!fs.existsSync(workerDir)) {
192
+ fs.mkdirSync(workerDir, { recursive: true });
193
+ }
194
+ if (!fs.existsSync(credentials_1.CREDENTIALS_PATH)) {
195
+ if (fs.existsSync(CREDENTIALS_TEMPLATE)) {
196
+ fs.copyFileSync(CREDENTIALS_TEMPLATE, credentials_1.CREDENTIALS_PATH);
197
+ console.log(" " + colors_1.c.success + colors_1.c.white(" credentials.toml installed at " + credentials_1.CREDENTIALS_PATH));
198
+ console.log(colors_1.c.dim(" Edit it to enable providers: set enabled = true and export API keys."));
199
+ }
200
+ else {
201
+ console.log(" " + colors_1.c.warning + " " + colors_1.c.yellow("credentials.template.toml not found — skipping credentials setup"));
202
+ }
203
+ }
204
+ else {
205
+ console.log(" " + colors_1.c.success + colors_1.c.white(" credentials.toml found"));
206
+ }
207
+ // ── Provider check + policy integration ──────────────────────────────
208
+ const providers = await (0, credentials_1.getEnabledProviders)();
209
+ if (providers.length > 0) {
210
+ console.log(colors_1.c.dim("\nEnabled providers:"));
211
+ for (const p of providers) {
212
+ const keyStatus = p.hasKey
213
+ ? colors_1.c.success + colors_1.c.white(` key found`)
214
+ : colors_1.c.warning + " " + colors_1.c.yellow("key MISSING — export " + (p.env ?? ""));
215
+ console.log(` ${colors_1.c.dim("Provider:")} ${colors_1.c.white(p.name)} ${colors_1.c.dim("(" + p.hosts.join(", ") + ")")} — ${keyStatus}`);
216
+ }
217
+ // Add provider hosts to policy file if it exists
218
+ if (fs.existsSync(POLICY_FILE)) {
219
+ let policy = fs.readFileSync(POLICY_FILE, "utf-8");
220
+ let changed = false;
221
+ for (const p of providers) {
222
+ for (const host of p.hosts) {
223
+ if (!policy.includes(`host: ${host}`)) {
224
+ // Append a new network_policy entry for this provider
225
+ const entry = [
226
+ ` provider_${p.name}:`,
227
+ ` name: provider-${p.name}`,
228
+ ` endpoints:`,
229
+ ` - host: ${host}`,
230
+ ` port: 443`,
231
+ ` protocol: rest`,
232
+ ` tls: terminate`,
233
+ ` enforcement: enforce`,
234
+ ` access: read-write`,
235
+ ` binaries: *a1`,
236
+ ].join("\n");
237
+ policy += "\n" + entry + "\n";
238
+ changed = true;
239
+ }
240
+ }
241
+ }
242
+ if (changed) {
243
+ fs.writeFileSync(POLICY_FILE, policy, "utf-8");
244
+ console.log(" " + colors_1.c.success + colors_1.c.white(" Policy updated with provider hosts"));
245
+ }
246
+ else {
247
+ console.log(" " + colors_1.c.success + colors_1.c.white(" Provider hosts already in policy"));
248
+ }
249
+ }
250
+ else {
251
+ console.log(colors_1.c.dim(" (Policy file not yet created — provider hosts will be added on next init after policy setup)"));
252
+ }
253
+ }
254
+ else if (fs.existsSync(credentials_1.CREDENTIALS_PATH)) {
255
+ console.log(colors_1.c.dim(" No providers enabled in credentials.toml — edit to enable providers."));
147
256
  }
148
257
  // Build image
149
258
  if (!imageExists()) {
150
259
  if (!buildImage()) {
151
- console.error(c.failure + " " + c.red("Failed to build workroom image."));
260
+ console.error(colors_1.c.failure + " " + colors_1.c.red("Failed to build workroom image."));
152
261
  process.exit(1);
153
262
  }
154
263
  }
155
- console.log(" " + c.success + c.dim(" Image: ") + c.white(WORKROOM_IMAGE));
264
+ console.log(" " + colors_1.c.success + colors_1.c.dim(" Image: ") + colors_1.c.white(WORKROOM_IMAGE));
156
265
  // Package CLI runtime for the workroom
157
266
  const cliDist = path.resolve(__dirname, "..", "..");
158
267
  const cliPackage = path.resolve(__dirname, "..", "..", "..", "package.json");
159
268
  if (fs.existsSync(cliDist) && fs.existsSync(cliPackage)) {
160
- console.log(" " + c.success + c.white(" CLI runtime available for workroom mount"));
269
+ console.log(" " + colors_1.c.success + colors_1.c.white(" CLI runtime available for workroom mount"));
161
270
  }
162
271
  else {
163
- console.warn(" " + c.warning + " " + c.yellow("CLI dist not found — workroom will need runtime bundle"));
272
+ console.warn(" " + colors_1.c.warning + " " + colors_1.c.yellow("CLI dist not found — workroom will need runtime bundle"));
164
273
  }
165
- console.log("\n" + c.success + c.white(" Workroom initialized. Start with: arc402 workroom start"));
166
- console.log(c.dim("Policy hash: ") + c.white(getPolicyHash()));
274
+ console.log("\n" + colors_1.c.success + colors_1.c.white(" Workroom initialized. Start with: arc402 workroom start"));
275
+ console.log(colors_1.c.dim("Policy hash: ") + colors_1.c.white(getPolicyHash()));
167
276
  });
168
277
  // ── start ─────────────────────────────────────────────────────────────────
169
278
  workroom
170
279
  .command("start")
171
280
  .description("Start the ARC-402 Workroom (always-on governed container with daemon inside).")
172
- .action(async () => {
281
+ .option("--compute", "Enable GPU compute mode: uses Dockerfile.gpu and passes --gpus all --runtime nvidia to docker run")
282
+ .action(async (opts) => {
283
+ const useGpu = !!opts.compute;
173
284
  if (!dockerAvailable()) {
174
285
  console.error("Docker is not available.");
175
286
  process.exit(1);
@@ -180,11 +291,11 @@ export function registerWorkroomCommands(program) {
180
291
  }
181
292
  // Remove stopped container if exists
182
293
  if (containerExists()) {
183
- runCmd("docker", ["rm", "-f", WORKROOM_CONTAINER]);
294
+ (0, openshell_runtime_1.runCmd)("docker", ["rm", "-f", WORKROOM_CONTAINER]);
184
295
  }
185
296
  // Build image if needed
186
297
  if (!imageExists()) {
187
- if (!buildImage()) {
298
+ if (!buildImage(useGpu)) {
188
299
  console.error("Failed to build workroom image.");
189
300
  process.exit(1);
190
301
  }
@@ -198,22 +309,26 @@ export function registerWorkroomCommands(program) {
198
309
  console.error("Export it before starting: export ARC402_MACHINE_KEY=0x...");
199
310
  process.exit(1);
200
311
  }
312
+ // Collect provider env flags from credentials.toml
313
+ const providerEnvFlags = await (0, credentials_1.getDockerEnvFlags)();
201
314
  // CLI runtime path
202
315
  const cliRoot = path.resolve(__dirname, "..", "..", "..");
203
- console.log(c.dim("Starting ARC-402 Workroom..."));
316
+ console.log(colors_1.c.dim("Starting ARC-402 Workroom..."));
204
317
  const args = [
205
318
  "run", "-d",
206
319
  "--name", WORKROOM_CONTAINER,
207
320
  "--restart", "unless-stopped",
208
321
  "--cap-add", "NET_ADMIN", // Required for iptables
322
+ // GPU pass-through (only when --compute flag is set)
323
+ ...(useGpu ? ["--gpus", "all", "--runtime", "nvidia"] : []),
209
324
  // Mount config (read-write for daemon state/logs)
210
- "-v", `${ARC402_DIR}:/workroom/.arc402:rw`,
325
+ "-v", `${openshell_runtime_1.ARC402_DIR}:/workroom/.arc402:rw`,
211
326
  // Mount CLI runtime (read-only)
212
327
  "-v", `${cliRoot}:/workroom/runtime:ro`,
213
328
  // Mount jobs directory
214
- "-v", `${path.join(ARC402_DIR, "jobs")}:/workroom/jobs:rw`,
329
+ "-v", `${path.join(openshell_runtime_1.ARC402_DIR, "jobs")}:/workroom/jobs:rw`,
215
330
  // Mount worker directory (identity, memory, skills, knowledge)
216
- "-v", `${path.join(ARC402_DIR, "worker")}:/workroom/worker:rw`,
331
+ "-v", `${path.join(openshell_runtime_1.ARC402_DIR, "worker")}:/workroom/worker:rw`,
217
332
  // Mount Arena data directory (feed index, profile cache, state, queue)
218
333
  "-v", `${ARENA_DATA_DIR}:/workroom/arena:rw`,
219
334
  // Inject secrets as env vars
@@ -222,20 +337,22 @@ export function registerWorkroomCommands(program) {
222
337
  "-e", `TELEGRAM_CHAT_ID=${telegramChat}`,
223
338
  "-e", `ARC402_DAEMON_PROCESS=1`,
224
339
  "-e", `ARC402_DAEMON_FOREGROUND=1`,
340
+ // Inject enabled provider API keys (never written to container disk)
341
+ ...providerEnvFlags,
225
342
  // Expose relay port
226
343
  "-p", "4402:4402",
227
344
  WORKROOM_IMAGE,
228
345
  ];
229
- const result = spawnSync("docker", args, { stdio: "inherit" });
346
+ const result = (0, child_process_1.spawnSync)("docker", args, { stdio: "inherit" });
230
347
  if (result.status !== 0) {
231
348
  console.error("Failed to start workroom container.");
232
349
  process.exit(1);
233
350
  }
234
351
  // Wait briefly and check health
235
- spawnSync("sleep", ["2"]);
352
+ (0, child_process_1.spawnSync)("sleep", ["2"]);
236
353
  if (containerRunning()) {
237
- console.log("\n" + c.success + c.white(" ARC-402 Workroom is running"));
238
- renderTree([
354
+ console.log("\n" + colors_1.c.success + colors_1.c.white(" ARC-402 Workroom is running"));
355
+ (0, tree_1.renderTree)([
239
356
  { label: "Container", value: WORKROOM_CONTAINER },
240
357
  { label: "Policy hash", value: getPolicyHash() },
241
358
  { label: "Relay port", value: "4402" },
@@ -245,8 +362,8 @@ export function registerWorkroomCommands(program) {
245
362
  notifyDaemonWorkroomStatus("entered");
246
363
  }
247
364
  else {
248
- console.error(c.failure + " " + c.red("Workroom started but exited immediately. Check logs:"));
249
- console.error(c.dim(" docker logs arc402-workroom"));
365
+ console.error(colors_1.c.failure + " " + colors_1.c.red("Workroom started but exited immediately. Check logs:"));
366
+ console.error(colors_1.c.dim(" docker logs arc402-workroom"));
250
367
  process.exit(1);
251
368
  }
252
369
  });
@@ -259,85 +376,85 @@ export function registerWorkroomCommands(program) {
259
376
  console.log("Workroom is not running.");
260
377
  return;
261
378
  }
262
- console.log(c.dim("Stopping ARC-402 Workroom..."));
379
+ console.log(colors_1.c.dim("Stopping ARC-402 Workroom..."));
263
380
  // Notify daemon before stopping (daemon may be inside container)
264
381
  notifyDaemonWorkroomStatus("exited");
265
- runCmd("docker", ["stop", WORKROOM_CONTAINER]);
266
- console.log(" " + c.success + c.white(" Workroom stopped"));
382
+ (0, openshell_runtime_1.runCmd)("docker", ["stop", WORKROOM_CONTAINER]);
383
+ console.log(" " + colors_1.c.success + colors_1.c.white(" Workroom stopped"));
267
384
  });
268
385
  // ── status ────────────────────────────────────────────────────────────────
269
386
  workroom
270
387
  .command("status")
271
388
  .description("Show ARC-402 Workroom health, policy, and active state.")
272
389
  .action(async () => {
273
- console.log(c.brightCyan("ARC-402 Workroom Status"));
274
- console.log(c.dim("───────────────────────"));
390
+ console.log(colors_1.c.brightCyan("ARC-402 Workroom Status"));
391
+ console.log(colors_1.c.dim("───────────────────────"));
275
392
  // Docker
276
393
  if (!dockerAvailable()) {
277
- console.log(c.dim("Docker: ") + c.failure + " " + c.red("not available"));
394
+ console.log(colors_1.c.dim("Docker: ") + colors_1.c.failure + " " + colors_1.c.red("not available"));
278
395
  return;
279
396
  }
280
- console.log(c.dim("Docker: ") + c.success + c.white(" available"));
397
+ console.log(colors_1.c.dim("Docker: ") + colors_1.c.success + colors_1.c.white(" available"));
281
398
  // Image
282
399
  if (imageExists()) {
283
- console.log(c.dim("Image: ") + c.success + " " + c.white(WORKROOM_IMAGE));
400
+ console.log(colors_1.c.dim("Image: ") + colors_1.c.success + " " + colors_1.c.white(WORKROOM_IMAGE));
284
401
  }
285
402
  else {
286
- console.log(c.dim("Image: ") + c.failure + " " + c.red("not built (run: arc402 workroom init)"));
403
+ console.log(colors_1.c.dim("Image: ") + colors_1.c.failure + " " + colors_1.c.red("not built (run: arc402 workroom init)"));
287
404
  }
288
405
  // Container
289
406
  if (containerRunning()) {
290
- console.log(c.dim("Container: ") + c.success + c.white(` running (${WORKROOM_CONTAINER})`));
407
+ console.log(colors_1.c.dim("Container: ") + colors_1.c.success + colors_1.c.white(` running (${WORKROOM_CONTAINER})`));
291
408
  // Get container uptime
292
- const inspect = runCmd("docker", ["inspect", WORKROOM_CONTAINER, "--format", "{{.State.StartedAt}}"]);
409
+ const inspect = (0, openshell_runtime_1.runCmd)("docker", ["inspect", WORKROOM_CONTAINER, "--format", "{{.State.StartedAt}}"]);
293
410
  if (inspect.ok) {
294
411
  const started = new Date(inspect.stdout.trim());
295
412
  const uptime = Math.floor((Date.now() - started.getTime()) / 1000);
296
413
  const h = Math.floor(uptime / 3600);
297
414
  const m = Math.floor((uptime % 3600) / 60);
298
- console.log(c.dim("Uptime: ") + c.white(`${h}h ${m}m`));
415
+ console.log(colors_1.c.dim("Uptime: ") + colors_1.c.white(`${h}h ${m}m`));
299
416
  }
300
417
  // Get iptables rule count from inside container
301
- const rules = runCmd("docker", ["exec", WORKROOM_CONTAINER, "iptables", "-L", "OUTPUT", "-n", "--line-numbers"]);
418
+ const rules = (0, openshell_runtime_1.runCmd)("docker", ["exec", WORKROOM_CONTAINER, "iptables", "-L", "OUTPUT", "-n", "--line-numbers"]);
302
419
  if (rules.ok) {
303
420
  const ruleCount = rules.stdout.split("\n").filter(l => l.match(/^\d+/)).length;
304
- console.log(c.dim("Network rules: ") + c.white(`${ruleCount} iptables rules enforced`));
421
+ console.log(colors_1.c.dim("Network rules: ") + colors_1.c.white(`${ruleCount} iptables rules enforced`));
305
422
  }
306
423
  }
307
424
  else if (containerExists()) {
308
- console.log(c.dim("Container: ") + c.warning + " " + c.yellow("stopped (run: arc402 workroom start)"));
425
+ console.log(colors_1.c.dim("Container: ") + colors_1.c.warning + " " + colors_1.c.yellow("stopped (run: arc402 workroom start)"));
309
426
  }
310
427
  else {
311
- console.log(c.dim("Container: ") + c.failure + " " + c.red("not created (run: arc402 workroom init)"));
428
+ console.log(colors_1.c.dim("Container: ") + colors_1.c.failure + " " + colors_1.c.red("not created (run: arc402 workroom init)"));
312
429
  }
313
430
  // Policy
314
431
  if (fs.existsSync(POLICY_FILE)) {
315
- console.log(c.dim("Policy file: ") + c.success + " " + c.white(POLICY_FILE));
432
+ console.log(colors_1.c.dim("Policy file: ") + colors_1.c.success + " " + colors_1.c.white(POLICY_FILE));
316
433
  }
317
434
  else {
318
- console.log(c.dim("Policy file: ") + c.failure + " " + c.red("missing"));
435
+ console.log(colors_1.c.dim("Policy file: ") + colors_1.c.failure + " " + colors_1.c.red("missing"));
319
436
  }
320
- console.log(c.dim("Policy hash: ") + c.white(getPolicyHash()));
437
+ console.log(colors_1.c.dim("Policy hash: ") + colors_1.c.white(getPolicyHash()));
321
438
  // Arena
322
439
  const arenaExists = fs.existsSync(ARENA_DATA_DIR);
323
440
  const arenaPolicy = fs.existsSync(ARENA_POLICY_FILE);
324
441
  if (arenaExists) {
325
- console.log(c.dim("Arena data: ") + c.success + " " + c.white(ARENA_DATA_DIR));
442
+ console.log(colors_1.c.dim("Arena data: ") + colors_1.c.success + " " + colors_1.c.white(ARENA_DATA_DIR));
326
443
  }
327
444
  else {
328
- console.log(c.dim("Arena data: ") + c.failure + " " + c.red("missing (run: arc402 workroom init)"));
445
+ console.log(colors_1.c.dim("Arena data: ") + colors_1.c.failure + " " + colors_1.c.red("missing (run: arc402 workroom init)"));
329
446
  }
330
- console.log(c.dim("Arena policy: ") + (arenaPolicy ? c.success + c.white(" loaded") : c.failure + " " + c.red("missing")));
447
+ console.log(colors_1.c.dim("Arena policy: ") + (arenaPolicy ? colors_1.c.success + colors_1.c.white(" loaded") : colors_1.c.failure + " " + colors_1.c.red("missing")));
331
448
  // Arena queue (pending approvals)
332
449
  if (arenaExists) {
333
450
  const queueDir = path.join(ARENA_DATA_DIR, "queue");
334
451
  if (fs.existsSync(queueDir)) {
335
452
  const pending = fs.readdirSync(queueDir).filter(f => f.endsWith(".json")).length;
336
453
  if (pending > 0) {
337
- console.log(c.dim("Arena queue: ") + c.warning + " " + c.yellow(`${pending} action(s) awaiting approval`));
454
+ console.log(colors_1.c.dim("Arena queue: ") + colors_1.c.warning + " " + colors_1.c.yellow(`${pending} action(s) awaiting approval`));
338
455
  }
339
456
  else {
340
- console.log(c.dim("Arena queue: ") + c.success + c.white(" empty"));
457
+ console.log(colors_1.c.dim("Arena queue: ") + colors_1.c.success + colors_1.c.white(" empty"));
341
458
  }
342
459
  }
343
460
  }
@@ -354,7 +471,7 @@ export function registerWorkroomCommands(program) {
354
471
  args.push("-f");
355
472
  args.push("--tail", opts.lines);
356
473
  args.push(WORKROOM_CONTAINER);
357
- spawnSync("docker", args, { stdio: "inherit" });
474
+ (0, child_process_1.spawnSync)("docker", args, { stdio: "inherit" });
358
475
  });
359
476
  // ── shell ─────────────────────────────────────────────────────────────────
360
477
  workroom
@@ -365,7 +482,7 @@ export function registerWorkroomCommands(program) {
365
482
  console.error("Workroom is not running.");
366
483
  process.exit(1);
367
484
  }
368
- spawnSync("docker", ["exec", "-it", WORKROOM_CONTAINER, "/bin/bash"], {
485
+ (0, child_process_1.spawnSync)("docker", ["exec", "-it", WORKROOM_CONTAINER, "/bin/bash"], {
369
486
  stdio: "inherit",
370
487
  });
371
488
  });
@@ -374,8 +491,8 @@ export function registerWorkroomCommands(program) {
374
491
  .command("doctor")
375
492
  .description("Diagnose workroom health: Docker, image, container, network, policy, daemon.")
376
493
  .action(async () => {
377
- console.log(c.brightCyan("ARC-402 Workroom Doctor"));
378
- console.log(c.dim("───────────────────────"));
494
+ console.log(colors_1.c.brightCyan("ARC-402 Workroom Doctor"));
495
+ console.log(colors_1.c.dim("───────────────────────"));
379
496
  const checks = [];
380
497
  // Docker
381
498
  const docker = dockerAvailable();
@@ -390,32 +507,32 @@ export function registerWorkroomCommands(program) {
390
507
  const policyExists = fs.existsSync(POLICY_FILE);
391
508
  checks.push({ label: "Policy file", pass: policyExists, detail: policyExists ? POLICY_FILE : "missing" });
392
509
  // daemon.toml
393
- const daemonCfg = fs.existsSync(DAEMON_TOML);
510
+ const daemonCfg = fs.existsSync(config_1.DAEMON_TOML);
394
511
  checks.push({ label: "daemon.toml", pass: daemonCfg, detail: daemonCfg ? "found" : "missing — run: arc402 daemon init" });
395
512
  // Machine key env
396
513
  const mk = !!process.env.ARC402_MACHINE_KEY;
397
514
  checks.push({ label: "Machine key env", pass: mk, detail: mk ? "set" : "ARC402_MACHINE_KEY not in environment" });
398
515
  // Network connectivity (if running)
399
516
  if (running) {
400
- const rpcTest = runCmd("docker", ["exec", WORKROOM_CONTAINER, "curl", "-s", "-o", "/dev/null", "-w", "%{http_code}", "--max-time", "5", "https://mainnet.base.org"]);
517
+ const rpcTest = (0, openshell_runtime_1.runCmd)("docker", ["exec", WORKROOM_CONTAINER, "curl", "-s", "-o", "/dev/null", "-w", "%{http_code}", "--max-time", "5", "https://mainnet.base.org"]);
401
518
  const rpcOk = rpcTest.ok && rpcTest.stdout.trim() !== "000";
402
519
  checks.push({ label: "Base RPC from workroom", pass: rpcOk, detail: rpcOk ? `HTTP ${rpcTest.stdout.trim()}` : "FAILED — network policy may be blocking RPC" });
403
520
  }
404
521
  // Print results
405
522
  for (const chk of checks) {
406
523
  if (chk.pass) {
407
- console.log(" " + c.success + " " + c.dim(chk.label + ":") + " " + c.white(chk.detail));
524
+ console.log(" " + colors_1.c.success + " " + colors_1.c.dim(chk.label + ":") + " " + colors_1.c.white(chk.detail));
408
525
  }
409
526
  else {
410
- console.log(" " + c.failure + " " + c.dim(chk.label + ":") + " " + c.red(chk.detail) + c.yellow(" ← FIX"));
527
+ console.log(" " + colors_1.c.failure + " " + colors_1.c.dim(chk.label + ":") + " " + colors_1.c.red(chk.detail) + colors_1.c.yellow(" ← FIX"));
411
528
  }
412
529
  }
413
530
  const failures = checks.filter(chk => !chk.pass);
414
531
  if (failures.length === 0) {
415
- console.log("\n" + c.success + c.white(" All checks passed. Workroom is healthy."));
532
+ console.log("\n" + colors_1.c.success + colors_1.c.white(" All checks passed. Workroom is healthy."));
416
533
  }
417
534
  else {
418
- console.log("\n" + c.failure + " " + c.red(`${failures.length} issue(s) found.`));
535
+ console.log("\n" + colors_1.c.failure + " " + colors_1.c.red(`${failures.length} issue(s) found.`));
419
536
  }
420
537
  });
421
538
  // ── policy (delegate to existing openshell policy commands) ───────────────
@@ -448,19 +565,19 @@ export function registerWorkroomCommands(program) {
448
565
  console.error("Workroom is not running. Start it first: arc402 workroom start");
449
566
  process.exit(1);
450
567
  }
451
- console.log(c.dim(`Testing connectivity to ${host} from inside workroom...`));
452
- const result = runCmd("docker", [
568
+ console.log(colors_1.c.dim(`Testing connectivity to ${host} from inside workroom...`));
569
+ const result = (0, openshell_runtime_1.runCmd)("docker", [
453
570
  "exec", WORKROOM_CONTAINER,
454
571
  "curl", "-s", "-o", "/dev/null", "-w", "%{http_code}", "--max-time", "5",
455
572
  `https://${host}`,
456
573
  ]);
457
574
  if (result.ok && result.stdout.trim() !== "000") {
458
- console.log(" " + c.success + " " + c.white(host) + c.dim(` is reachable (HTTP ${result.stdout.trim()})`));
575
+ console.log(" " + colors_1.c.success + " " + colors_1.c.white(host) + colors_1.c.dim(` is reachable (HTTP ${result.stdout.trim()})`));
459
576
  }
460
577
  else {
461
- console.log(" " + c.failure + " " + c.red(`${host} is NOT reachable from the workroom`));
462
- console.log(c.dim(" This host may not be in the workroom policy."));
463
- console.log(c.dim(" Add it with: arc402 openshell policy add <name> <host>"));
578
+ console.log(" " + colors_1.c.failure + " " + colors_1.c.red(`${host} is NOT reachable from the workroom`));
579
+ console.log(colors_1.c.dim(" This host may not be in the workroom policy."));
580
+ console.log(colors_1.c.dim(" Add it with: arc402 openshell policy add <name> <host>"));
464
581
  }
465
582
  });
466
583
  // ── worker ─────────────────────────────────────────────────────────────────
@@ -471,11 +588,15 @@ export function registerWorkroomCommands(program) {
471
588
  .option("--name <name>", "Worker display name", "Worker")
472
589
  .option("--model <model>", "Preferred LLM model for task execution")
473
590
  .action(async (opts) => {
474
- const workerDir = path.join(ARC402_DIR, "worker");
591
+ const workerDir = path.join(openshell_runtime_1.ARC402_DIR, "worker");
475
592
  const memoryDir = path.join(workerDir, "memory");
476
593
  const skillsDir = path.join(workerDir, "skills");
594
+ const knowledgeDir = path.join(workerDir, "knowledge");
595
+ const datasetsDir = path.join(workerDir, "datasets");
477
596
  fs.mkdirSync(memoryDir, { recursive: true });
478
597
  fs.mkdirSync(skillsDir, { recursive: true });
598
+ fs.mkdirSync(knowledgeDir, { recursive: true });
599
+ fs.mkdirSync(datasetsDir, { recursive: true });
479
600
  // Generate default worker SOUL.md
480
601
  const soulPath = path.join(workerDir, "SOUL.md");
481
602
  if (!fs.existsSync(soulPath)) {
@@ -516,10 +637,28 @@ Write these learnings concisely. They will be available on your next job.
516
637
  - If the task is unclear, produce the best interpretation and document assumptions
517
638
  - Every deliverable must be verifiable against the task spec
518
639
  `);
519
- console.log(" " + c.success + c.dim(` Worker SOUL.md created: ${soulPath}`));
640
+ console.log(" " + colors_1.c.success + colors_1.c.dim(` Worker SOUL.md created: ${soulPath}`));
520
641
  }
521
642
  else {
522
- console.log(" " + c.success + c.dim(` Worker SOUL.md already exists: ${soulPath}`));
643
+ console.log(" " + colors_1.c.success + colors_1.c.dim(` Worker SOUL.md already exists: ${soulPath}`));
644
+ }
645
+ // Generate IDENTITY.md
646
+ const identityPath = path.join(workerDir, "IDENTITY.md");
647
+ if (!fs.existsSync(identityPath)) {
648
+ fs.writeFileSync(identityPath, `# Worker Identity
649
+ - **Name:** ${opts.name}
650
+ - **Emoji:** 🔧
651
+ - **Capabilities:** []
652
+ - **Model:** ${opts.model || "default"}
653
+ - **Created:** ${new Date().toISOString()}
654
+
655
+ ## Specialisation
656
+ Describe what this worker specialises in. This is injected into every job prompt.
657
+
658
+ ## Personality
659
+ How should this worker communicate? Professional? Casual? Technical?
660
+ `);
661
+ console.log(" " + colors_1.c.success + colors_1.c.dim(` Worker IDENTITY.md created: ${identityPath}`));
523
662
  }
524
663
  // Generate default MEMORY.md
525
664
  const memoryPath = path.join(workerDir, "MEMORY.md");
@@ -535,7 +674,7 @@ Write these learnings concisely. They will be available on your next job.
535
674
 
536
675
  No jobs completed yet. Learnings will accumulate here as the worker completes hired tasks.
537
676
  `);
538
- console.log(" " + c.success + c.dim(` Worker MEMORY.md created: ${memoryPath}`));
677
+ console.log(" " + colors_1.c.success + colors_1.c.dim(` Worker MEMORY.md created: ${memoryPath}`));
539
678
  }
540
679
  // Generate learnings.md
541
680
  const learningsPath = path.join(memoryDir, "learnings.md");
@@ -548,7 +687,7 @@ No jobs completed yet. Learnings will accumulate here as the worker completes hi
548
687
 
549
688
  No learnings yet. Complete your first hired task to start accumulating expertise.
550
689
  `);
551
- console.log(" " + c.success + c.dim(` Learnings file created: ${learningsPath}`));
690
+ console.log(" " + colors_1.c.success + colors_1.c.dim(` Learnings file created: ${learningsPath}`));
552
691
  }
553
692
  // Worker config
554
693
  const configPath = path.join(workerDir, "config.json");
@@ -562,18 +701,18 @@ No learnings yet. Complete your first hired task to start accumulating expertise
562
701
  total_earned_eth: "0",
563
702
  };
564
703
  fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
565
- console.log(" " + c.success + c.dim(` Worker config created: ${configPath}`));
704
+ console.log(" " + colors_1.c.success + colors_1.c.dim(` Worker config created: ${configPath}`));
566
705
  }
567
- console.log("\n" + c.success + c.white(` Worker initialized at: ${workerDir}`));
568
- console.log(c.dim("Next: customize the worker SOUL.md and add skills."));
569
- console.log(c.dim(" arc402 workroom worker set-soul <file>"));
570
- console.log(c.dim(" arc402 workroom worker set-skills <dir>"));
706
+ console.log("\n" + colors_1.c.success + colors_1.c.white(` Worker initialized at: ${workerDir}`));
707
+ console.log(colors_1.c.dim("Next: customize the worker SOUL.md and add skills."));
708
+ console.log(colors_1.c.dim(" arc402 workroom worker set-soul <file>"));
709
+ console.log(colors_1.c.dim(" arc402 workroom worker set-skills <dir>"));
571
710
  });
572
711
  worker
573
712
  .command("status")
574
713
  .description("Show worker identity, job count, learnings, and configuration.")
575
714
  .action(async () => {
576
- const workerDir = path.join(ARC402_DIR, "worker");
715
+ const workerDir = path.join(openshell_runtime_1.ARC402_DIR, "worker");
577
716
  const configPath = path.join(workerDir, "config.json");
578
717
  if (!fs.existsSync(configPath)) {
579
718
  console.error("Worker not initialized. Run: arc402 workroom worker init");
@@ -592,9 +731,9 @@ No learnings yet. Complete your first hired task to start accumulating expertise
592
731
  const skillCount = fs.existsSync(skillsDir)
593
732
  ? fs.readdirSync(skillsDir).length
594
733
  : 0;
595
- console.log(c.brightCyan("ARC-402 Workroom Worker"));
596
- console.log(c.dim("───────────────────────"));
597
- renderTree([
734
+ console.log(colors_1.c.brightCyan("ARC-402 Workroom Worker"));
735
+ console.log(colors_1.c.dim("───────────────────────"));
736
+ (0, tree_1.renderTree)([
598
737
  { label: "Name", value: config.name },
599
738
  { label: "Model", value: config.model },
600
739
  { label: "Created", value: config.created },
@@ -613,10 +752,10 @@ No learnings yet. Complete your first hired task to start accumulating expertise
613
752
  console.error(`File not found: ${file}`);
614
753
  process.exit(1);
615
754
  }
616
- const dest = path.join(ARC402_DIR, "worker", "SOUL.md");
755
+ const dest = path.join(openshell_runtime_1.ARC402_DIR, "worker", "SOUL.md");
617
756
  fs.mkdirSync(path.dirname(dest), { recursive: true });
618
757
  fs.copyFileSync(file, dest);
619
- console.log(" " + c.success + c.white(` Worker SOUL.md updated from: ${file}`));
758
+ console.log(" " + colors_1.c.success + colors_1.c.white(` Worker SOUL.md updated from: ${file}`));
620
759
  });
621
760
  worker
622
761
  .command("set-skills <dir>")
@@ -626,7 +765,7 @@ No learnings yet. Complete your first hired task to start accumulating expertise
626
765
  console.error(`Directory not found: ${dir}`);
627
766
  process.exit(1);
628
767
  }
629
- const dest = path.join(ARC402_DIR, "worker", "skills");
768
+ const dest = path.join(openshell_runtime_1.ARC402_DIR, "worker", "skills");
630
769
  fs.mkdirSync(dest, { recursive: true });
631
770
  // Copy all files from source to dest
632
771
  const files = fs.readdirSync(dir);
@@ -641,7 +780,7 @@ No learnings yet. Complete your first hired task to start accumulating expertise
641
780
  fs.cpSync(src, dst, { recursive: true });
642
781
  }
643
782
  }
644
- console.log(" " + c.success + c.white(` ${files.length} items copied to worker skills`));
783
+ console.log(" " + colors_1.c.success + colors_1.c.white(` ${files.length} items copied to worker skills`));
645
784
  });
646
785
  worker
647
786
  .command("set-knowledge <dir>")
@@ -651,7 +790,7 @@ No learnings yet. Complete your first hired task to start accumulating expertise
651
790
  console.error(`Directory not found: ${dir}`);
652
791
  process.exit(1);
653
792
  }
654
- const dest = path.join(ARC402_DIR, "worker", "knowledge");
793
+ const dest = path.join(openshell_runtime_1.ARC402_DIR, "worker", "knowledge");
655
794
  fs.mkdirSync(dest, { recursive: true });
656
795
  const files = fs.readdirSync(dir);
657
796
  let count = 0;
@@ -667,16 +806,16 @@ No learnings yet. Complete your first hired task to start accumulating expertise
667
806
  count++;
668
807
  }
669
808
  }
670
- console.log(" " + c.success + c.white(` ${count} items copied to worker knowledge`));
671
- console.log(" " + c.dim("Path:") + " " + c.white(dest));
672
- console.log(c.dim(" The worker can reference these files during hired tasks."));
673
- console.log(c.dim(" To update: run this command again with the updated directory."));
809
+ console.log(" " + colors_1.c.success + colors_1.c.white(` ${count} items copied to worker knowledge`));
810
+ console.log(" " + colors_1.c.dim("Path:") + " " + colors_1.c.white(dest));
811
+ console.log(colors_1.c.dim(" The worker can reference these files during hired tasks."));
812
+ console.log(colors_1.c.dim(" To update: run this command again with the updated directory."));
674
813
  });
675
814
  worker
676
815
  .command("knowledge")
677
816
  .description("List the worker's knowledge directory contents.")
678
817
  .action(async () => {
679
- const knowledgeDir = path.join(ARC402_DIR, "worker", "knowledge");
818
+ const knowledgeDir = path.join(openshell_runtime_1.ARC402_DIR, "worker", "knowledge");
680
819
  if (!fs.existsSync(knowledgeDir)) {
681
820
  console.log("No knowledge directory. Add one with: arc402 workroom worker set-knowledge <dir>");
682
821
  return;
@@ -697,7 +836,7 @@ No learnings yet. Complete your first hired task to start accumulating expertise
697
836
  .command("memory")
698
837
  .description("Show the worker's accumulated learnings.")
699
838
  .action(async () => {
700
- const learningsPath = path.join(ARC402_DIR, "worker", "memory", "learnings.md");
839
+ const learningsPath = path.join(openshell_runtime_1.ARC402_DIR, "worker", "memory", "learnings.md");
701
840
  if (!fs.existsSync(learningsPath)) {
702
841
  console.log("No learnings yet. Complete a hired task first.");
703
842
  return;
@@ -708,7 +847,7 @@ No learnings yet. Complete your first hired task to start accumulating expertise
708
847
  .command("memory-reset")
709
848
  .description("Clear the worker's accumulated memory (start fresh).")
710
849
  .action(async () => {
711
- const memoryDir = path.join(ARC402_DIR, "worker", "memory");
850
+ const memoryDir = path.join(openshell_runtime_1.ARC402_DIR, "worker", "memory");
712
851
  if (fs.existsSync(memoryDir)) {
713
852
  const files = fs.readdirSync(memoryDir);
714
853
  for (const f of files)
@@ -716,20 +855,20 @@ No learnings yet. Complete your first hired task to start accumulating expertise
716
855
  fs.writeFileSync(path.join(memoryDir, "learnings.md"), `# Accumulated Learnings\n\n*Reset: ${new Date().toISOString()}*\n\nNo learnings yet.\n`);
717
856
  }
718
857
  // Reset job count in config
719
- const configPath = path.join(ARC402_DIR, "worker", "config.json");
858
+ const configPath = path.join(openshell_runtime_1.ARC402_DIR, "worker", "config.json");
720
859
  if (fs.existsSync(configPath)) {
721
860
  const config = JSON.parse(fs.readFileSync(configPath, "utf-8"));
722
861
  config.job_count = 0;
723
862
  fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
724
863
  }
725
- console.log(" " + c.success + c.white(" Worker memory cleared. Starting fresh."));
864
+ console.log(" " + colors_1.c.success + colors_1.c.white(" Worker memory cleared. Starting fresh."));
726
865
  });
727
866
  // ── token usage ──────────────────────────────────────────────────────────
728
867
  workroom
729
868
  .command("token-usage [agreementId]")
730
869
  .description("Show token usage for a specific agreement or across all jobs.")
731
870
  .action(async (agreementId) => {
732
- const { readUsageReport, formatUsageReport } = await import("../daemon/token-metering.js");
871
+ const { readUsageReport, formatUsageReport } = require("../daemon/token-metering");
733
872
  if (agreementId) {
734
873
  const usage = readUsageReport(agreementId);
735
874
  if (!usage) {
@@ -740,7 +879,7 @@ No learnings yet. Complete your first hired task to start accumulating expertise
740
879
  }
741
880
  else {
742
881
  // Aggregate across all receipts
743
- const receiptsDir = path.join(ARC402_DIR, "receipts");
882
+ const receiptsDir = path.join(openshell_runtime_1.ARC402_DIR, "receipts");
744
883
  if (!fs.existsSync(receiptsDir)) {
745
884
  console.log("No receipts yet.");
746
885
  return;
@@ -781,7 +920,7 @@ No learnings yet. Complete your first hired task to start accumulating expertise
781
920
  .command("receipts")
782
921
  .description("List all execution receipts from completed jobs.")
783
922
  .action(async () => {
784
- const receiptsDir = path.join(ARC402_DIR, "receipts");
923
+ const receiptsDir = path.join(openshell_runtime_1.ARC402_DIR, "receipts");
785
924
  if (!fs.existsSync(receiptsDir)) {
786
925
  console.log("No receipts yet.");
787
926
  return;
@@ -809,7 +948,7 @@ No learnings yet. Complete your first hired task to start accumulating expertise
809
948
  .command("receipt <agreementId>")
810
949
  .description("Show full execution receipt for a specific job.")
811
950
  .action(async (agreementId) => {
812
- const receiptPath = path.join(ARC402_DIR, "receipts", `${agreementId}.json`);
951
+ const receiptPath = path.join(openshell_runtime_1.ARC402_DIR, "receipts", `${agreementId}.json`);
813
952
  if (!fs.existsSync(receiptPath)) {
814
953
  console.error(`No receipt found for agreement: ${agreementId}`);
815
954
  process.exit(1);
@@ -821,14 +960,14 @@ No learnings yet. Complete your first hired task to start accumulating expertise
821
960
  .description("Show total earnings from completed jobs.")
822
961
  .option("--period <period>", "Time period (e.g. 7d, 30d, all)", "all")
823
962
  .action(async (opts) => {
824
- const configPath = path.join(ARC402_DIR, "worker", "config.json");
963
+ const configPath = path.join(openshell_runtime_1.ARC402_DIR, "worker", "config.json");
825
964
  if (!fs.existsSync(configPath)) {
826
965
  console.log("No worker configured. Run: arc402 workroom worker init");
827
966
  return;
828
967
  }
829
968
  const config = JSON.parse(fs.readFileSync(configPath, "utf-8"));
830
- console.log(c.brightCyan("ARC-402 Earnings"));
831
- console.log(c.dim("────────────────"));
969
+ console.log(colors_1.c.brightCyan("ARC-402 Earnings"));
970
+ console.log(colors_1.c.dim("────────────────"));
832
971
  const earningsItems = [
833
972
  { label: "Total earned", value: config.total_earned_eth + " ETH" },
834
973
  { label: "Jobs completed", value: String(config.job_count) },
@@ -838,13 +977,13 @@ No learnings yet. Complete your first hired task to start accumulating expertise
838
977
  earningsItems.push({ label: "Average/job", value: avg + " ETH" });
839
978
  }
840
979
  earningsItems[earningsItems.length - 1].last = true;
841
- renderTree(earningsItems);
980
+ (0, tree_1.renderTree)(earningsItems);
842
981
  });
843
982
  workroom
844
983
  .command("history")
845
984
  .description("Show job history with outcomes and earnings.")
846
985
  .action(async () => {
847
- const memoryDir = path.join(ARC402_DIR, "worker", "memory");
986
+ const memoryDir = path.join(openshell_runtime_1.ARC402_DIR, "worker", "memory");
848
987
  if (!fs.existsSync(memoryDir)) {
849
988
  console.log("No job history yet.");
850
989
  return;
@@ -870,17 +1009,17 @@ No learnings yet. Complete your first hired task to start accumulating expertise
870
1009
  console.error("Workroom is not running.");
871
1010
  process.exit(1);
872
1011
  }
873
- console.log(c.dim("Reloading workroom policy..."));
1012
+ console.log(colors_1.c.dim("Reloading workroom policy..."));
874
1013
  // Trigger DNS refresh manually (which re-reads policy and updates iptables)
875
- const result = runCmd("docker", [
1014
+ const result = (0, openshell_runtime_1.runCmd)("docker", [
876
1015
  "exec", WORKROOM_CONTAINER,
877
1016
  "bash", "-c", "/dns-refresh.sh /workroom/.arc402/openshell-policy.yaml &",
878
1017
  ]);
879
1018
  if (result.ok) {
880
- console.log(" " + c.success + c.white(" Policy reload triggered"));
1019
+ console.log(" " + colors_1.c.success + colors_1.c.white(" Policy reload triggered"));
881
1020
  }
882
1021
  else {
883
- console.error(c.failure + " " + c.red("Failed to reload policy"));
1022
+ console.error(colors_1.c.failure + " " + colors_1.c.red("Failed to reload policy"));
884
1023
  }
885
1024
  });
886
1025
  }