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.
@@ -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;AAIpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkB3D"}
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"}
@@ -1,21 +1,158 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.registerWatchCommand = registerWatchCommand;
4
- const colors_1 = require("../ui/colors");
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 wallet = config.walletContractAddress ?? "(no wallet)";
13
- const shortWallet = wallet.length > 10
14
- ? `${wallet.slice(0, 6)}...${wallet.slice(-4)}`
15
- : wallet;
16
- const line = "─".repeat(20);
17
- console.log(`${colors_1.c.mark} ARC-402 Watching ${colors_1.c.white(shortWallet)} ${colors_1.c.dim(line)}`);
18
- console.log(`${colors_1.c.dim("···")} ${colors_1.c.dim("waiting")}`);
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":";;AAIA,oDAkBC;AArBD,yCAAiC;AACjC,sCAAuC;AAEvC,SAAgB,oBAAoB,CAAC,OAAgB;IACnD,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,oCAAoC,CAAC;SACjD,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,MAAM,CAAC,qBAAqB,IAAI,aAAa,CAAC;QAC7D,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,GAAG,EAAE;YACpC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;YAC/C,CAAC,CAAC,MAAM,CAAC;QACX,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAE5B,OAAO,CAAC,GAAG,CAAC,GAAG,UAAC,CAAC,IAAI,uBAAuB,UAAC,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,UAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnF,OAAO,CAAC,GAAG,CAAC,GAAG,UAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,UAAC,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAEpD,qBAAqB;QACrB,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;AACP,CAAC"}
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;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,cAAc,GAAG,cAAc,CAAC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,4BAA4B,CAAC,EAAE,MAAM,CAAC;IACtC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,6BAA6B,CAAC,EAAE,MAAM,CAAC;IACvC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,6BAA6B,CAAC,EAAE,MAAM,CAAC;IACvC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE;QACV,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAOD,eAAO,MAAM,cAAc,cAA2D,CAAC;AAEvF,eAAO,MAAM,aAAa,cAAoB,CAAC;AAE/C,wBAAgB,UAAU,IAAI,YAAY,CA4BzC;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAOrD;AAED,eAAO,MAAM,YAAY,eAAmC,CAAC;AAG7D,eAAO,MAAM,eAAe,6BAA6B,CAAC;AAC1D,eAAO,MAAM,gBAAgB,6BAA6B,CAAC;AAE3D;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAK1D;AAED,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,CA4D5F,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,QAAQ,YAAY,WAAwD,CAAC;AAE5G,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAE5D"}
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
- return JSON.parse(fs.readFileSync(CONFIG_PATH, "utf-8"));
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);
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
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;AAqXD,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,CAulBjE"}
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"}
@@ -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 headers
565
- res.setHeader("Access-Control-Allow-Origin", "*");
566
- res.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
567
- res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
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 activeList = db.listActiveHireRequests();
884
- const pendingList = db.listPendingHireRequests();
885
- res.writeHead(200, { "Content-Type": "application/json" });
886
- res.end(JSON.stringify({
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();