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.
- package/README.md +41 -2
- package/dist/abis.d.ts +1 -0
- package/dist/abis.d.ts.map +1 -1
- package/dist/abis.js +45 -14
- package/dist/abis.js.map +1 -1
- package/dist/bundler.d.ts +1 -1
- package/dist/bundler.d.ts.map +1 -1
- package/dist/bundler.js +61 -27
- package/dist/bundler.js.map +1 -1
- package/dist/client.d.ts +1 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +9 -5
- package/dist/client.js.map +1 -1
- package/dist/coinbase-smart-wallet.js +4 -1
- package/dist/coinbase-smart-wallet.js.map +1 -1
- package/dist/commands/accept.js +28 -25
- package/dist/commands/accept.js.map +1 -1
- package/dist/commands/agent-handshake.js +18 -15
- package/dist/commands/agent-handshake.js.map +1 -1
- package/dist/commands/agent.js +104 -98
- package/dist/commands/agent.js.map +1 -1
- package/dist/commands/agreements.js +98 -62
- package/dist/commands/agreements.js.map +1 -1
- package/dist/commands/arbitrator.js +81 -45
- package/dist/commands/arbitrator.js.map +1 -1
- package/dist/commands/arena-handshake.d.ts.map +1 -1
- package/dist/commands/arena-handshake.js +35 -53
- package/dist/commands/arena-handshake.js.map +1 -1
- package/dist/commands/arena.js +18 -12
- package/dist/commands/arena.js.map +1 -1
- package/dist/commands/backup.js +36 -30
- package/dist/commands/backup.js.map +1 -1
- package/dist/commands/cancel.js +18 -15
- package/dist/commands/cancel.js.map +1 -1
- package/dist/commands/channel.js +81 -45
- package/dist/commands/channel.js.map +1 -1
- package/dist/commands/coldstart.js +34 -31
- package/dist/commands/coldstart.js.map +1 -1
- 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.js +30 -24
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/contract-interaction.js +15 -12
- package/dist/commands/contract-interaction.js.map +1 -1
- package/dist/commands/daemon.d.ts.map +1 -1
- package/dist/commands/daemon.js +135 -98
- package/dist/commands/daemon.js.map +1 -1
- package/dist/commands/deliver.js +76 -37
- package/dist/commands/deliver.js.map +1 -1
- package/dist/commands/discover.js +27 -24
- package/dist/commands/discover.js.map +1 -1
- package/dist/commands/dispute.js +110 -104
- package/dist/commands/dispute.js.map +1 -1
- package/dist/commands/doctor.js +55 -16
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/endpoint.js +95 -56
- package/dist/commands/endpoint.js.map +1 -1
- package/dist/commands/feed.js +18 -11
- package/dist/commands/feed.js.map +1 -1
- package/dist/commands/hire.js +40 -37
- package/dist/commands/hire.js.map +1 -1
- package/dist/commands/migrate.js +33 -30
- package/dist/commands/migrate.js.map +1 -1
- package/dist/commands/negotiate.d.ts.map +1 -1
- package/dist/commands/negotiate.js +36 -34
- package/dist/commands/negotiate.js.map +1 -1
- package/dist/commands/openshell.js +104 -68
- package/dist/commands/openshell.js.map +1 -1
- package/dist/commands/owner.js +20 -17
- package/dist/commands/owner.js.map +1 -1
- package/dist/commands/policy.js +43 -41
- package/dist/commands/policy.js.map +1 -1
- package/dist/commands/relay.d.ts.map +1 -1
- package/dist/commands/relay.js +51 -18
- package/dist/commands/relay.js.map +1 -1
- package/dist/commands/remediate.js +23 -20
- package/dist/commands/remediate.js.map +1 -1
- package/dist/commands/reputation.js +27 -25
- package/dist/commands/reputation.js.map +1 -1
- package/dist/commands/setup.js +104 -65
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/trust.js +20 -17
- package/dist/commands/trust.js.map +1 -1
- package/dist/commands/verify.js +21 -18
- package/dist/commands/verify.js.map +1 -1
- package/dist/commands/wallet.d.ts.map +1 -1
- package/dist/commands/wallet.js +645 -679
- package/dist/commands/wallet.js.map +1 -1
- package/dist/commands/watch.js +36 -33
- package/dist/commands/watch.js.map +1 -1
- package/dist/commands/watchtower.js +73 -37
- package/dist/commands/watchtower.js.map +1 -1
- package/dist/commands/workroom.d.ts.map +1 -1
- package/dist/commands/workroom.js +282 -143
- package/dist/commands/workroom.js.map +1 -1
- package/dist/config.d.ts +3 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +71 -22
- 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 +19 -1
- package/dist/daemon/config.d.ts.map +1 -1
- package/dist/daemon/config.js +90 -16
- 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/hire-listener.d.ts +3 -3
- package/dist/daemon/hire-listener.d.ts.map +1 -1
- package/dist/daemon/hire-listener.js +47 -13
- package/dist/daemon/hire-listener.js.map +1 -1
- package/dist/daemon/index.d.ts +2 -1
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +526 -53
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/job-lifecycle.d.ts +1 -1
- package/dist/daemon/job-lifecycle.d.ts.map +1 -1
- package/dist/daemon/job-lifecycle.js +51 -11
- package/dist/daemon/job-lifecycle.js.map +1 -1
- package/dist/daemon/notify.d.ts +1 -1
- package/dist/daemon/notify.d.ts.map +1 -1
- package/dist/daemon/notify.js +53 -19
- package/dist/daemon/notify.js.map +1 -1
- package/dist/daemon/token-metering.js +47 -8
- package/dist/daemon/token-metering.js.map +1 -1
- package/dist/daemon/userops.d.ts +2 -2
- package/dist/daemon/userops.d.ts.map +1 -1
- package/dist/daemon/userops.js +27 -23
- package/dist/daemon/userops.js.map +1 -1
- package/dist/daemon/wallet-monitor.d.ts +1 -1
- package/dist/daemon/wallet-monitor.d.ts.map +1 -1
- package/dist/daemon/wallet-monitor.js +12 -8
- package/dist/daemon/wallet-monitor.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 +64 -26
- package/dist/drain-v4.js.map +1 -1
- package/dist/endpoint-config.js +63 -20
- package/dist/endpoint-config.js.map +1 -1
- package/dist/endpoint-notify.js +48 -9
- package/dist/endpoint-notify.js.map +1 -1
- package/dist/index.js +50 -18
- package/dist/index.js.map +1 -1
- package/dist/openshell-runtime.d.ts.map +1 -1
- package/dist/openshell-runtime.js +82 -38
- package/dist/openshell-runtime.js.map +1 -1
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js +85 -78
- package/dist/program.js.map +1 -1
- package/dist/repl.js +31 -25
- package/dist/repl.js.map +1 -1
- package/dist/signing.js +6 -3
- package/dist/signing.js.map +1 -1
- package/dist/telegram-notify.js +40 -3
- package/dist/telegram-notify.js.map +1 -1
- package/dist/tui/App.d.ts.map +1 -1
- package/dist/tui/App.js +56 -89
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/Footer.js +7 -4
- package/dist/tui/Footer.js.map +1 -1
- package/dist/tui/Header.d.ts +1 -1
- package/dist/tui/Header.d.ts.map +1 -1
- package/dist/tui/Header.js +14 -9
- package/dist/tui/Header.js.map +1 -1
- package/dist/tui/InputLine.d.ts +2 -1
- package/dist/tui/InputLine.d.ts.map +1 -1
- package/dist/tui/InputLine.js +47 -97
- package/dist/tui/InputLine.js.map +1 -1
- package/dist/tui/Viewport.d.ts +1 -2
- package/dist/tui/Viewport.d.ts.map +1 -1
- package/dist/tui/Viewport.js +26 -6
- package/dist/tui/Viewport.js.map +1 -1
- package/dist/tui/WalletConnectPairing.js +19 -16
- package/dist/tui/WalletConnectPairing.js.map +1 -1
- package/dist/tui/components/Button.js +9 -6
- package/dist/tui/components/Button.js.map +1 -1
- package/dist/tui/components/CeremonyView.js +8 -5
- package/dist/tui/components/CeremonyView.js.map +1 -1
- package/dist/tui/components/CompletionDropdown.js +9 -6
- package/dist/tui/components/CompletionDropdown.js.map +1 -1
- package/dist/tui/components/ConfirmPrompt.js +8 -5
- package/dist/tui/components/ConfirmPrompt.js.map +1 -1
- package/dist/tui/components/CustomTextInput.js +14 -11
- package/dist/tui/components/CustomTextInput.js.map +1 -1
- package/dist/tui/components/InteractiveTable.js +12 -9
- package/dist/tui/components/InteractiveTable.js.map +1 -1
- package/dist/tui/components/StepSpinner.js +13 -10
- package/dist/tui/components/StepSpinner.js.map +1 -1
- package/dist/tui/components/Toast.js +12 -8
- package/dist/tui/components/Toast.js.map +1 -1
- package/dist/tui/index.d.ts.map +1 -1
- package/dist/tui/index.js +21 -28
- package/dist/tui/index.js.map +1 -1
- package/dist/tui/useChat.js +19 -13
- package/dist/tui/useChat.js.map +1 -1
- package/dist/tui/useCommand.d.ts +2 -3
- package/dist/tui/useCommand.d.ts.map +1 -1
- package/dist/tui/useCommand.js +24 -100
- package/dist/tui/useCommand.js.map +1 -1
- package/dist/tui/useNotifications.js +8 -5
- package/dist/tui/useNotifications.js.map +1 -1
- package/dist/tui/useScroll.d.ts.map +1 -1
- package/dist/tui/useScroll.js +12 -15
- package/dist/tui/useScroll.js.map +1 -1
- package/dist/ui/banner.d.ts +0 -12
- package/dist/ui/banner.d.ts.map +1 -1
- package/dist/ui/banner.js +19 -35
- package/dist/ui/banner.js.map +1 -1
- package/dist/ui/colors.js +19 -13
- package/dist/ui/colors.js.map +1 -1
- package/dist/ui/format.js +14 -6
- package/dist/ui/format.js.map +1 -1
- package/dist/ui/qr-render.js +11 -4
- package/dist/ui/qr-render.js.map +1 -1
- package/dist/ui/rpc-fallback.js +11 -6
- package/dist/ui/rpc-fallback.js.map +1 -1
- package/dist/ui/spinner.js +12 -6
- package/dist/ui/spinner.js.map +1 -1
- package/dist/ui/tree.js +6 -3
- package/dist/ui/tree.js.map +1 -1
- package/dist/utils/format.js +41 -27
- package/dist/utils/format.js.map +1 -1
- package/dist/utils/hash.js +42 -4
- package/dist/utils/hash.js.map +1 -1
- package/dist/utils/time.js +6 -2
- package/dist/utils/time.js.map +1 -1
- package/dist/wallet-router.d.ts +1 -1
- package/dist/wallet-router.d.ts.map +1 -1
- package/dist/wallet-router.js +19 -12
- package/dist/wallet-router.js.map +1 -1
- package/dist/walletconnect-session.d.ts +1 -1
- package/dist/walletconnect-session.d.ts.map +1 -1
- package/dist/walletconnect-session.js +11 -6
- package/dist/walletconnect-session.js.map +1 -1
- package/dist/walletconnect.d.ts +5 -6
- package/dist/walletconnect.d.ts.map +1 -1
- package/dist/walletconnect.js +35 -32
- package/dist/walletconnect.js.map +1 -1
- package/package.json +11 -10
- package/INK6-UX-SPEC.md +0 -446
- package/MIGRATION-SPEC.md +0 -108
- package/TUI-SPEC.md +0 -214
- 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 -274
- package/src/commands/arena.ts +0 -122
- package/src/commands/backup.ts +0 -117
- 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 -68
- package/src/commands/contract-interaction.ts +0 -166
- package/src/commands/daemon.ts +0 -1054
- package/src/commands/deliver.ts +0 -148
- package/src/commands/discover.ts +0 -350
- package/src/commands/dispute.ts +0 -375
- package/src/commands/doctor.ts +0 -172
- 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 -272
- 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 -277
- 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 -3548
- package/src/commands/watch.ts +0 -220
- package/src/commands/watchtower.ts +0 -248
- package/src/commands/workroom.ts +0 -963
- package/src/config.ts +0 -220
- package/src/daemon/config.ts +0 -344
- package/src/daemon/hire-listener.ts +0 -226
- package/src/daemon/index.ts +0 -1089
- package/src/daemon/job-lifecycle.ts +0 -215
- package/src/daemon/notify.ts +0 -297
- 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 -129
- package/src/index.ts +0 -74
- package/src/openshell-runtime.ts +0 -281
- package/src/program.ts +0 -88
- package/src/repl.ts +0 -178
- package/src/signing.ts +0 -28
- package/src/telegram-notify.ts +0 -88
- package/src/tui/App.tsx +0 -263
- package/src/tui/Footer.tsx +0 -18
- package/src/tui/Header.tsx +0 -45
- package/src/tui/InputLine.tsx +0 -243
- package/src/tui/Viewport.tsx +0 -51
- package/src/tui/WalletConnectPairing.tsx +0 -114
- package/src/tui/components/Button.tsx +0 -38
- package/src/tui/components/CeremonyView.tsx +0 -39
- package/src/tui/components/CompletionDropdown.tsx +0 -56
- package/src/tui/components/ConfirmPrompt.tsx +0 -36
- package/src/tui/components/CustomTextInput.tsx +0 -132
- package/src/tui/components/InteractiveTable.tsx +0 -106
- package/src/tui/components/StepSpinner.tsx +0 -84
- package/src/tui/components/Toast.tsx +0 -59
- package/src/tui/index.tsx +0 -90
- package/src/tui/useChat.ts +0 -103
- package/src/tui/useCommand.ts +0 -238
- package/src/tui/useNotifications.ts +0 -28
- package/src/tui/useScroll.ts +0 -69
- package/src/ui/banner.ts +0 -78
- package/src/ui/colors.ts +0 -30
- package/src/ui/format.ts +0 -78
- package/src/ui/qr-render.ts +0 -92
- package/src/ui/rpc-fallback.ts +0 -59
- 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 -309
- package/test/time.test.js +0 -11
- package/tsconfig.json +0 -33
|
@@ -1,22 +1,56 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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 } =
|
|
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
|
-
.
|
|
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 } =
|
|
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
|
}
|