arc402-cli 0.7.0 → 0.7.1
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/dist/commands/backup.d.ts +3 -0
- package/dist/commands/backup.d.ts.map +1 -0
- package/dist/commands/backup.js +106 -0
- package/dist/commands/backup.js.map +1 -0
- package/dist/commands/discover.d.ts.map +1 -1
- package/dist/commands/discover.js +60 -15
- package/dist/commands/discover.js.map +1 -1
- package/dist/commands/wallet.d.ts.map +1 -1
- package/dist/commands/wallet.js +136 -52
- package/dist/commands/wallet.js.map +1 -1
- package/dist/commands/watch.d.ts.map +1 -1
- package/dist/commands/watch.js +146 -9
- package/dist/commands/watch.js.map +1 -1
- package/dist/config.d.ts +8 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +25 -1
- package/dist/config.js.map +1 -1
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +65 -12
- package/dist/daemon/index.js.map +1 -1
- package/dist/endpoint-notify.d.ts +2 -1
- package/dist/endpoint-notify.d.ts.map +1 -1
- package/dist/endpoint-notify.js +12 -3
- package/dist/endpoint-notify.js.map +1 -1
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -1
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js +2 -0
- package/dist/program.js.map +1 -1
- package/package.json +1 -1
- package/src/commands/backup.ts +117 -0
- package/src/commands/discover.ts +74 -21
- package/src/commands/wallet.ts +137 -51
- package/src/commands/watch.ts +207 -10
- package/src/config.ts +39 -1
- package/src/daemon/index.ts +63 -12
- package/src/endpoint-notify.ts +13 -3
- package/src/index.ts +26 -0
- package/src/program.ts +2 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2DpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgK3D"}
|
package/dist/commands/watch.js
CHANGED
|
@@ -1,21 +1,158 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.registerWatchCommand = registerWatchCommand;
|
|
4
|
-
const
|
|
4
|
+
const ethers_1 = require("ethers");
|
|
5
5
|
const config_1 = require("../config");
|
|
6
|
+
const client_1 = require("../client");
|
|
7
|
+
const colors_1 = require("../ui/colors");
|
|
8
|
+
// ─── Minimal ABIs for event watching ─────────────────────────────────────────
|
|
9
|
+
const AGENT_REGISTRY_WATCH_ABI = [
|
|
10
|
+
"event AgentRegistered(address indexed wallet, string name, string serviceType, uint256 timestamp)",
|
|
11
|
+
"event AgentUpdated(address indexed wallet, string name, string serviceType)",
|
|
12
|
+
"event AgentDeactivated(address indexed wallet)",
|
|
13
|
+
];
|
|
14
|
+
const SERVICE_AGREEMENT_WATCH_ABI = [
|
|
15
|
+
"event AgreementProposed(uint256 indexed id, address indexed client, address indexed provider, string serviceType, uint256 price, address token, uint256 deadline)",
|
|
16
|
+
"event AgreementAccepted(uint256 indexed id, address indexed provider)",
|
|
17
|
+
"event AgreementFulfilled(uint256 indexed id, address indexed provider, bytes32 deliverablesHash)",
|
|
18
|
+
"event AgreementDisputed(uint256 indexed id, address indexed initiator, string reason)",
|
|
19
|
+
"event AgreementCancelled(uint256 indexed id, address indexed client)",
|
|
20
|
+
];
|
|
21
|
+
const HANDSHAKE_WATCH_ABI = [
|
|
22
|
+
"event HandshakeSent(uint256 indexed handshakeId, address indexed from, address indexed to, uint8 hsType, address token, uint256 amount, string note, uint256 timestamp)",
|
|
23
|
+
];
|
|
24
|
+
const DISPUTE_MODULE_WATCH_ABI = [
|
|
25
|
+
"event DisputeRaised(uint256 indexed agreementId, address indexed initiator, string reason)",
|
|
26
|
+
"event DisputeResolved(uint256 indexed agreementId, bool favorProvider, string resolution)",
|
|
27
|
+
];
|
|
28
|
+
const HS_TYPE_LABELS = {
|
|
29
|
+
0: "Respected",
|
|
30
|
+
1: "Curious",
|
|
31
|
+
2: "Endorsed",
|
|
32
|
+
3: "Thanked",
|
|
33
|
+
4: "Collaborated",
|
|
34
|
+
5: "Challenged",
|
|
35
|
+
6: "Referred",
|
|
36
|
+
7: "Hello",
|
|
37
|
+
};
|
|
38
|
+
function shortAddr(addr) {
|
|
39
|
+
return addr.length > 10 ? `${addr.slice(0, 6)}...${addr.slice(-4)}` : addr;
|
|
40
|
+
}
|
|
41
|
+
function nowHHMM() {
|
|
42
|
+
const d = new Date();
|
|
43
|
+
const h = d.getHours().toString().padStart(2, "0");
|
|
44
|
+
const m = d.getMinutes().toString().padStart(2, "0");
|
|
45
|
+
return `${h}:${m}`;
|
|
46
|
+
}
|
|
47
|
+
function printEvent(label, detail, status) {
|
|
48
|
+
const ts = colors_1.c.dim(`[${nowHHMM()}]`);
|
|
49
|
+
const col = status === "ok" ? colors_1.c.green : status === "err" ? colors_1.c.red : status === "warn" ? colors_1.c.yellow : colors_1.c.white;
|
|
50
|
+
process.stdout.write(` ${ts} ${col(label)} ${colors_1.c.dim(detail)}\n`);
|
|
51
|
+
}
|
|
6
52
|
function registerWatchCommand(program) {
|
|
7
53
|
program
|
|
8
54
|
.command("watch")
|
|
9
|
-
.description("Watch wallet activity in real-time")
|
|
55
|
+
.description("Watch wallet activity in real-time (live onchain event feed)")
|
|
10
56
|
.action(async () => {
|
|
11
57
|
const config = (0, config_1.loadConfig)();
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
console.log(
|
|
18
|
-
console.log(
|
|
58
|
+
const { provider } = await (0, client_1.getClient)(config);
|
|
59
|
+
const myWallet = (config.walletContractAddress ?? "").toLowerCase();
|
|
60
|
+
const shortMe = myWallet ? shortAddr(config.walletContractAddress) : "(no wallet)";
|
|
61
|
+
const line = "─".repeat(22);
|
|
62
|
+
console.log(`\n ${colors_1.c.mark} ${colors_1.c.white("ARC-402 Live Feed")} ${colors_1.c.dim(line)}`);
|
|
63
|
+
console.log(` ${colors_1.c.dim("Watching")} ${colors_1.c.brightCyan(shortMe)} ${colors_1.c.dim("on")} ${colors_1.c.dim(config.network)}`);
|
|
64
|
+
console.log(` ${colors_1.c.dim("Ctrl+C to exit")}\n`);
|
|
65
|
+
// ── Build contract instances ───────────────────────────────────────────
|
|
66
|
+
const contractLabels = [];
|
|
67
|
+
if (config.agentRegistryAddress)
|
|
68
|
+
contractLabels.push("AgentRegistry");
|
|
69
|
+
if (config.serviceAgreementAddress)
|
|
70
|
+
contractLabels.push("ServiceAgreement");
|
|
71
|
+
if (config.handshakeAddress)
|
|
72
|
+
contractLabels.push("Handshake");
|
|
73
|
+
if (config.disputeModuleAddress)
|
|
74
|
+
contractLabels.push("DisputeModule");
|
|
75
|
+
if (contractLabels.length === 0) {
|
|
76
|
+
console.log(` ${colors_1.c.warning} No contract addresses configured. Run arc402 config init.`);
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
console.log(` ${colors_1.c.dim(`Monitoring ${contractLabels.length} contract${contractLabels.length !== 1 ? "s" : ""}: ${contractLabels.join(", ")}`)}\n`);
|
|
80
|
+
// ── Helpers ────────────────────────────────────────────────────────────
|
|
81
|
+
function isMe(addr) {
|
|
82
|
+
return myWallet !== "" && addr.toLowerCase() === myWallet;
|
|
83
|
+
}
|
|
84
|
+
function fmtAddr(addr) {
|
|
85
|
+
return isMe(addr) ? colors_1.c.brightCyan("you") : colors_1.c.dim(shortAddr(addr));
|
|
86
|
+
}
|
|
87
|
+
// ── AgentRegistry ──────────────────────────────────────────────────────
|
|
88
|
+
if (config.agentRegistryAddress) {
|
|
89
|
+
const reg = new ethers_1.ethers.Contract(config.agentRegistryAddress, AGENT_REGISTRY_WATCH_ABI, provider);
|
|
90
|
+
reg.on("AgentRegistered", (wallet, name, serviceType) => {
|
|
91
|
+
printEvent(`Agent registered: ${name}`, `${fmtAddr(wallet)} ${colors_1.c.dim(serviceType)}`, "ok");
|
|
92
|
+
});
|
|
93
|
+
reg.on("AgentUpdated", (wallet, name, serviceType) => {
|
|
94
|
+
printEvent(`Agent updated: ${name}`, `${fmtAddr(wallet)} ${colors_1.c.dim(serviceType)}`);
|
|
95
|
+
});
|
|
96
|
+
reg.on("AgentDeactivated", (wallet) => {
|
|
97
|
+
printEvent(`Agent deactivated`, fmtAddr(wallet), "warn");
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
// ── ServiceAgreement ───────────────────────────────────────────────────
|
|
101
|
+
if (config.serviceAgreementAddress) {
|
|
102
|
+
const sa = new ethers_1.ethers.Contract(config.serviceAgreementAddress, SERVICE_AGREEMENT_WATCH_ABI, provider);
|
|
103
|
+
sa.on("AgreementProposed", (id, client, agentProvider, serviceType) => {
|
|
104
|
+
const involved = isMe(client) || isMe(agentProvider);
|
|
105
|
+
printEvent(`Agreement #${id} proposed`, `${fmtAddr(client)} → ${fmtAddr(agentProvider)} ${colors_1.c.dim(serviceType)}`, involved ? "ok" : undefined);
|
|
106
|
+
});
|
|
107
|
+
sa.on("AgreementAccepted", (id, agentProvider) => {
|
|
108
|
+
printEvent(`Agreement #${id} → ${colors_1.c.green("ACCEPTED")}`, fmtAddr(agentProvider));
|
|
109
|
+
});
|
|
110
|
+
sa.on("AgreementFulfilled", (id, agentProvider, deliverablesHash) => {
|
|
111
|
+
printEvent(`Agreement #${id} → ${colors_1.c.green("DELIVERED")}`, `${fmtAddr(agentProvider)} ${colors_1.c.dim(deliverablesHash.slice(0, 10) + "...")}`, "ok");
|
|
112
|
+
});
|
|
113
|
+
sa.on("AgreementDisputed", (id, initiator, reason) => {
|
|
114
|
+
printEvent(`Agreement #${id} → ${colors_1.c.red("DISPUTED")}`, `${fmtAddr(initiator)} ${colors_1.c.dim(reason.slice(0, 40))}`, "err");
|
|
115
|
+
});
|
|
116
|
+
sa.on("AgreementCancelled", (id, client) => {
|
|
117
|
+
printEvent(`Agreement #${id} → ${colors_1.c.yellow("CANCELLED")}`, fmtAddr(client), "warn");
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
// ── Handshake ──────────────────────────────────────────────────────────
|
|
121
|
+
if (config.handshakeAddress) {
|
|
122
|
+
const hs = new ethers_1.ethers.Contract(config.handshakeAddress, HANDSHAKE_WATCH_ABI, provider);
|
|
123
|
+
hs.on("HandshakeSent", (_id, from, to, hsType, _token, _amount, note) => {
|
|
124
|
+
const typeLabel = HS_TYPE_LABELS[hsType] ?? `type ${hsType}`;
|
|
125
|
+
const toMe = isMe(to);
|
|
126
|
+
const noteStr = note ? ` ${colors_1.c.dim(`(${note.slice(0, 30)})`)}` : "";
|
|
127
|
+
printEvent(`Handshake from ${fmtAddr(from)} → ${fmtAddr(to)}`, `${colors_1.c.dim(typeLabel)}${noteStr}`, toMe ? "ok" : undefined);
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
// ── DisputeModule ──────────────────────────────────────────────────────
|
|
131
|
+
if (config.disputeModuleAddress) {
|
|
132
|
+
const dm = new ethers_1.ethers.Contract(config.disputeModuleAddress, DISPUTE_MODULE_WATCH_ABI, provider);
|
|
133
|
+
dm.on("DisputeRaised", (agreementId, initiator, reason) => {
|
|
134
|
+
printEvent(`Dispute raised on #${agreementId}`, `${fmtAddr(initiator)} ${colors_1.c.dim(reason.slice(0, 40))}`, "err");
|
|
135
|
+
});
|
|
136
|
+
dm.on("DisputeResolved", (agreementId, favorProvider, resolution) => {
|
|
137
|
+
printEvent(`Dispute #${agreementId} → ${colors_1.c.green("RESOLVED")}`, `${colors_1.c.dim(favorProvider ? "provider wins" : "client wins")} ${colors_1.c.dim(resolution.slice(0, 30))}`, "ok");
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
// ── Block heartbeat (shows feed is alive) ──────────────────────────────
|
|
141
|
+
let lastBlock = 0;
|
|
142
|
+
provider.on("block", (blockNumber) => {
|
|
143
|
+
if (blockNumber > lastBlock) {
|
|
144
|
+
lastBlock = blockNumber;
|
|
145
|
+
if (blockNumber % 10 === 0) {
|
|
146
|
+
process.stdout.write(` ${colors_1.c.dim(`· block ${blockNumber}`)}\n`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
// ── Clean exit ─────────────────────────────────────────────────────────
|
|
151
|
+
process.on("SIGINT", () => {
|
|
152
|
+
console.log(`\n ${colors_1.c.dim("Feed stopped.")}`);
|
|
153
|
+
provider.removeAllListeners();
|
|
154
|
+
process.exit(0);
|
|
155
|
+
});
|
|
19
156
|
// Keep process alive
|
|
20
157
|
process.stdin.resume();
|
|
21
158
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -36,12 +36,20 @@ export interface Arc402Config {
|
|
|
36
36
|
telegramBotToken?: string;
|
|
37
37
|
telegramChatId?: string;
|
|
38
38
|
telegramThreadId?: number;
|
|
39
|
+
/** Tracks onboarding progress so `wallet deploy` can resume after interruption. */
|
|
40
|
+
onboardingProgress?: {
|
|
41
|
+
walletAddress: string;
|
|
42
|
+
step: number;
|
|
43
|
+
completedSteps: string[];
|
|
44
|
+
};
|
|
39
45
|
wcSession?: {
|
|
40
46
|
topic: string;
|
|
41
47
|
expiry: number;
|
|
42
48
|
account: string;
|
|
43
49
|
chainId: number;
|
|
44
50
|
};
|
|
51
|
+
deviceId?: string;
|
|
52
|
+
lastCliVersion?: string;
|
|
45
53
|
}
|
|
46
54
|
export declare const getWcProjectId: () => string;
|
|
47
55
|
export declare const getConfigPath: () => string;
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/config.js
CHANGED
|
@@ -41,15 +41,28 @@ exports.getSubdomainApi = getSubdomainApi;
|
|
|
41
41
|
const fs = __importStar(require("fs"));
|
|
42
42
|
const path = __importStar(require("path"));
|
|
43
43
|
const os = __importStar(require("os"));
|
|
44
|
+
const crypto_1 = require("crypto");
|
|
44
45
|
const CONFIG_DIR = path.join(os.homedir(), ".arc402");
|
|
45
46
|
const CONFIG_PATH = process.env.ARC402_CONFIG || path.join(CONFIG_DIR, "config.json");
|
|
47
|
+
const DEVICE_ID_PATH = path.join(CONFIG_DIR, "device.id");
|
|
46
48
|
// WalletConnect project ID — get your own at cloud.walletconnect.com
|
|
47
49
|
const DEFAULT_WC_PROJECT_ID = "455e9425343b9156fce1428250c9a54a";
|
|
48
50
|
const getWcProjectId = () => process.env.WC_PROJECT_ID ?? DEFAULT_WC_PROJECT_ID;
|
|
49
51
|
exports.getWcProjectId = getWcProjectId;
|
|
50
52
|
const getConfigPath = () => CONFIG_PATH;
|
|
51
53
|
exports.getConfigPath = getConfigPath;
|
|
54
|
+
/** Returns this device's stable UUID, creating it on first call. */
|
|
55
|
+
function getOrCreateDeviceId() {
|
|
56
|
+
if (fs.existsSync(DEVICE_ID_PATH)) {
|
|
57
|
+
return fs.readFileSync(DEVICE_ID_PATH, "utf-8").trim();
|
|
58
|
+
}
|
|
59
|
+
const id = (0, crypto_1.randomUUID)();
|
|
60
|
+
fs.mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });
|
|
61
|
+
fs.writeFileSync(DEVICE_ID_PATH, id, { mode: 0o600 });
|
|
62
|
+
return id;
|
|
63
|
+
}
|
|
52
64
|
function loadConfig() {
|
|
65
|
+
const thisDeviceId = getOrCreateDeviceId();
|
|
53
66
|
if (!fs.existsSync(CONFIG_PATH)) {
|
|
54
67
|
// Auto-create with Base Mainnet defaults — zero friction
|
|
55
68
|
const defaults = exports.NETWORK_DEFAULTS["base-mainnet"] ?? {};
|
|
@@ -70,13 +83,24 @@ function loadConfig() {
|
|
|
70
83
|
walletFactoryAddress: defaults.walletFactoryAddress,
|
|
71
84
|
sessionChannelsAddress: defaults.sessionChannelsAddress,
|
|
72
85
|
disputeModuleAddress: defaults.disputeModuleAddress,
|
|
86
|
+
deviceId: thisDeviceId,
|
|
73
87
|
};
|
|
74
88
|
saveConfig(autoConfig);
|
|
75
89
|
console.log(`◈ Config auto-created at ${CONFIG_PATH} (Base Mainnet)`);
|
|
76
90
|
console.log("⚠ Base Mainnet — real funds at risk. Use arc402 config init for testnet.");
|
|
77
91
|
return autoConfig;
|
|
78
92
|
}
|
|
79
|
-
|
|
93
|
+
const config = JSON.parse(fs.readFileSync(CONFIG_PATH, "utf-8"));
|
|
94
|
+
// Multi-device awareness: warn if config was created on a different device
|
|
95
|
+
if (config.deviceId && config.deviceId !== thisDeviceId) {
|
|
96
|
+
console.warn("⚠ This config was created on a different device. Some keys may not work.");
|
|
97
|
+
}
|
|
98
|
+
// Backfill deviceId if missing (older config)
|
|
99
|
+
if (!config.deviceId) {
|
|
100
|
+
config.deviceId = thisDeviceId;
|
|
101
|
+
saveConfig(config);
|
|
102
|
+
}
|
|
103
|
+
return config;
|
|
80
104
|
}
|
|
81
105
|
function saveConfig(config) {
|
|
82
106
|
const configDir = path.dirname(CONFIG_PATH);
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":"AAoCA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,QAAQ;IACvB,iBAAiB,CAAC,GAAG,EAAE,IAAI,CAAC,cAAc,EAAE,YAAY,GAAG,YAAY,CAAC,GAAG,IAAI,CAAC;IAChF,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAAC;IACvD,uBAAuB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjF,uBAAuB,IAAI,cAAc,EAAE,CAAC;IAC5C,sBAAsB,IAAI,cAAc,EAAE,CAAC;IAC3C,uBAAuB,IAAI,MAAM,CAAC;IAClC,KAAK,IAAI,IAAI,CAAC;CACf;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":"AAoCA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,QAAQ;IACvB,iBAAiB,CAAC,GAAG,EAAE,IAAI,CAAC,cAAc,EAAE,YAAY,GAAG,YAAY,CAAC,GAAG,IAAI,CAAC;IAChF,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAAC;IACvD,uBAAuB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjF,uBAAuB,IAAI,cAAc,EAAE,CAAC;IAC5C,sBAAsB,IAAI,cAAc,EAAE,CAAC;IAC3C,uBAAuB,IAAI,MAAM,CAAC;IAClC,KAAK,IAAI,IAAI,CAAC;CACf;AAwXD,OAAO,QAAQ,UAAU,CAAC;IACxB,UAAU,YAAY;QACpB,uBAAuB,CAAC,EAAE,MAAM,CAAC;KAClC;CACF;AAED,wBAAsB,SAAS,CAAC,UAAU,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAuoBjE"}
|
package/dist/daemon/index.js
CHANGED
|
@@ -175,6 +175,8 @@ function checkRateLimit(ip) {
|
|
|
175
175
|
bucket.count++;
|
|
176
176
|
return bucket.count <= RATE_LIMIT;
|
|
177
177
|
}
|
|
178
|
+
// Cleanup stale rate limit entries every 5 minutes to prevent unbounded growth
|
|
179
|
+
let rateLimitCleanupInterval = null;
|
|
178
180
|
// ─── Body size limit ──────────────────────────────────────────────────────────
|
|
179
181
|
const MAX_BODY_SIZE = 1024 * 1024; // 1 MB
|
|
180
182
|
// ─── Logger ───────────────────────────────────────────────────────────────────
|
|
@@ -511,6 +513,14 @@ async function runDaemon(foreground = false) {
|
|
|
511
513
|
}
|
|
512
514
|
}
|
|
513
515
|
}, 30000);
|
|
516
|
+
// Rate limit map cleanup — every 5 minutes (prevents unbounded growth)
|
|
517
|
+
rateLimitCleanupInterval = setInterval(() => {
|
|
518
|
+
const now = Date.now();
|
|
519
|
+
for (const [ip, bucket] of rateLimitMap) {
|
|
520
|
+
if (bucket.resetTime < now)
|
|
521
|
+
rateLimitMap.delete(ip);
|
|
522
|
+
}
|
|
523
|
+
}, 5 * 60 * 1000);
|
|
514
524
|
// Balance monitor — every 5 minutes
|
|
515
525
|
const balanceInterval = setInterval(async () => {
|
|
516
526
|
try {
|
|
@@ -536,6 +546,28 @@ async function runDaemon(foreground = false) {
|
|
|
536
546
|
const ipcServer = startIpcServer(ipcCtx, log, apiToken);
|
|
537
547
|
// ── Start HTTP relay server (public endpoint) ────────────────────────────
|
|
538
548
|
const httpPort = config.relay.listen_port ?? 4402;
|
|
549
|
+
/**
|
|
550
|
+
* Optionally verifies X-ARC402-Signature against the request body.
|
|
551
|
+
* Logs the result but never rejects — unsigned requests are accepted for backwards compat.
|
|
552
|
+
*/
|
|
553
|
+
function verifyRequestSignature(body, req) {
|
|
554
|
+
const sig = req.headers["x-arc402-signature"];
|
|
555
|
+
if (!sig)
|
|
556
|
+
return;
|
|
557
|
+
const claimedSigner = req.headers["x-arc402-signer"];
|
|
558
|
+
try {
|
|
559
|
+
const recovered = ethers_1.ethers.verifyMessage(body, sig);
|
|
560
|
+
if (claimedSigner && recovered.toLowerCase() !== claimedSigner.toLowerCase()) {
|
|
561
|
+
log({ event: "sig_mismatch", claimed: claimedSigner, recovered });
|
|
562
|
+
}
|
|
563
|
+
else {
|
|
564
|
+
log({ event: "sig_verified", signer: recovered });
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
catch {
|
|
568
|
+
log({ event: "sig_invalid" });
|
|
569
|
+
}
|
|
570
|
+
}
|
|
539
571
|
/**
|
|
540
572
|
* Read request body with a size cap. Destroys the request and sends 413
|
|
541
573
|
* if the body exceeds MAX_BODY_SIZE. Returns null in that case.
|
|
@@ -560,11 +592,22 @@ async function runDaemon(foreground = false) {
|
|
|
560
592
|
});
|
|
561
593
|
}
|
|
562
594
|
const PUBLIC_GET_PATHS = new Set(["/", "/health", "/agent", "/capabilities", "/status"]);
|
|
595
|
+
// CORS whitelist — localhost for local tooling, arc402.xyz for the web app
|
|
596
|
+
const CORS_WHITELIST = new Set(["localhost", "127.0.0.1", "arc402.xyz", "app.arc402.xyz"]);
|
|
563
597
|
const httpServer = http.createServer(async (req, res) => {
|
|
564
|
-
// CORS
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
598
|
+
// CORS — only reflect origin header if it's in the whitelist
|
|
599
|
+
const origin = (req.headers["origin"] ?? "");
|
|
600
|
+
if (origin) {
|
|
601
|
+
try {
|
|
602
|
+
const { hostname } = new URL(origin);
|
|
603
|
+
if (CORS_WHITELIST.has(hostname)) {
|
|
604
|
+
res.setHeader("Access-Control-Allow-Origin", origin);
|
|
605
|
+
res.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
|
|
606
|
+
res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
catch { /* ignore invalid origin */ }
|
|
610
|
+
}
|
|
568
611
|
if (req.method === "OPTIONS") {
|
|
569
612
|
res.writeHead(204);
|
|
570
613
|
res.end();
|
|
@@ -623,6 +666,7 @@ async function runDaemon(foreground = false) {
|
|
|
623
666
|
const body = await readBody(req, res);
|
|
624
667
|
if (body === null)
|
|
625
668
|
return;
|
|
669
|
+
verifyRequestSignature(body, req);
|
|
626
670
|
try {
|
|
627
671
|
const msg = JSON.parse(body);
|
|
628
672
|
// Feed into the hire listener's message handler
|
|
@@ -696,6 +740,7 @@ async function runDaemon(foreground = false) {
|
|
|
696
740
|
const body = await readBody(req, res);
|
|
697
741
|
if (body === null)
|
|
698
742
|
return;
|
|
743
|
+
verifyRequestSignature(body, req);
|
|
699
744
|
try {
|
|
700
745
|
const msg = JSON.parse(body);
|
|
701
746
|
log({ event: "handshake_received", from: msg.from, type: msg.type, note: msg.note });
|
|
@@ -735,6 +780,7 @@ async function runDaemon(foreground = false) {
|
|
|
735
780
|
const body = await readBody(req, res);
|
|
736
781
|
if (body === null)
|
|
737
782
|
return;
|
|
783
|
+
verifyRequestSignature(body, req);
|
|
738
784
|
try {
|
|
739
785
|
const msg = JSON.parse(body);
|
|
740
786
|
const from = String(msg.from ?? "");
|
|
@@ -756,6 +802,7 @@ async function runDaemon(foreground = false) {
|
|
|
756
802
|
const body = await readBody(req, res);
|
|
757
803
|
if (body === null)
|
|
758
804
|
return;
|
|
805
|
+
verifyRequestSignature(body, req);
|
|
759
806
|
try {
|
|
760
807
|
const msg = JSON.parse(body);
|
|
761
808
|
const agreementId = String(msg.agreementId ?? msg.agreement_id ?? "");
|
|
@@ -878,21 +925,25 @@ async function runDaemon(foreground = false) {
|
|
|
878
925
|
}));
|
|
879
926
|
return;
|
|
880
927
|
}
|
|
881
|
-
// GET /status — health with active agreement count
|
|
928
|
+
// GET /status — health with active agreement count (sensitive counts only for authenticated)
|
|
882
929
|
if (pathname === "/status" && req.method === "GET") {
|
|
883
|
-
const
|
|
884
|
-
const
|
|
885
|
-
|
|
886
|
-
|
|
930
|
+
const statusAuth = (req.headers["authorization"] ?? "");
|
|
931
|
+
const statusToken = statusAuth.startsWith("Bearer ") ? statusAuth.slice(7) : "";
|
|
932
|
+
const statusAuthed = statusToken === apiToken;
|
|
933
|
+
const statusPayload = {
|
|
887
934
|
protocol: "arc-402",
|
|
888
935
|
version: "0.3.0",
|
|
889
936
|
agent: config.wallet.contract_address,
|
|
890
937
|
status: "online",
|
|
891
938
|
uptime: Math.floor((Date.now() - ipcCtx.startTime) / 1000),
|
|
892
|
-
active_agreements: activeList.length,
|
|
893
|
-
pending_approval: pendingList.length,
|
|
894
939
|
capabilities: config.policy.allowed_capabilities,
|
|
895
|
-
}
|
|
940
|
+
};
|
|
941
|
+
if (statusAuthed) {
|
|
942
|
+
statusPayload.active_agreements = db.listActiveHireRequests().length;
|
|
943
|
+
statusPayload.pending_approval = db.listPendingHireRequests().length;
|
|
944
|
+
}
|
|
945
|
+
res.writeHead(200, { "Content-Type": "application/json" });
|
|
946
|
+
res.end(JSON.stringify(statusPayload));
|
|
896
947
|
return;
|
|
897
948
|
}
|
|
898
949
|
// 404
|
|
@@ -924,6 +975,8 @@ async function runDaemon(foreground = false) {
|
|
|
924
975
|
clearInterval(relayInterval);
|
|
925
976
|
clearInterval(timeoutInterval);
|
|
926
977
|
clearInterval(balanceInterval);
|
|
978
|
+
if (rateLimitCleanupInterval)
|
|
979
|
+
clearInterval(rateLimitCleanupInterval);
|
|
927
980
|
// Close HTTP + IPC
|
|
928
981
|
httpServer.close();
|
|
929
982
|
ipcServer.close();
|