@arc402/daemon 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/bin/arc402-daemon +3 -0
  2. package/dist/abis.d.ts +20 -0
  3. package/dist/abis.d.ts.map +1 -0
  4. package/dist/abis.js +214 -0
  5. package/dist/abis.js.map +1 -0
  6. package/dist/api.d.ts +32 -0
  7. package/dist/api.d.ts.map +1 -0
  8. package/dist/api.js +430 -0
  9. package/dist/api.js.map +1 -0
  10. package/dist/auth-server.d.ts +50 -0
  11. package/dist/auth-server.d.ts.map +1 -0
  12. package/dist/auth-server.js +266 -0
  13. package/dist/auth-server.js.map +1 -0
  14. package/dist/bundler.d.ts +68 -0
  15. package/dist/bundler.d.ts.map +1 -0
  16. package/dist/bundler.js +181 -0
  17. package/dist/bundler.js.map +1 -0
  18. package/dist/capabilities.d.ts +17 -0
  19. package/dist/capabilities.d.ts.map +1 -0
  20. package/dist/capabilities.js +57 -0
  21. package/dist/capabilities.js.map +1 -0
  22. package/dist/compute-metering.d.ts +61 -0
  23. package/dist/compute-metering.d.ts.map +1 -0
  24. package/dist/compute-metering.js +299 -0
  25. package/dist/compute-metering.js.map +1 -0
  26. package/dist/compute-session.d.ts +100 -0
  27. package/dist/compute-session.d.ts.map +1 -0
  28. package/dist/compute-session.js +231 -0
  29. package/dist/compute-session.js.map +1 -0
  30. package/dist/config.d.ts +121 -0
  31. package/dist/config.d.ts.map +1 -0
  32. package/dist/config.js +397 -0
  33. package/dist/config.js.map +1 -0
  34. package/dist/context-manager.d.ts +17 -0
  35. package/dist/context-manager.d.ts.map +1 -0
  36. package/dist/context-manager.js +123 -0
  37. package/dist/context-manager.js.map +1 -0
  38. package/dist/credentials.d.ts +24 -0
  39. package/dist/credentials.d.ts.map +1 -0
  40. package/dist/credentials.js +80 -0
  41. package/dist/credentials.js.map +1 -0
  42. package/dist/delivery-client.d.ts +35 -0
  43. package/dist/delivery-client.d.ts.map +1 -0
  44. package/dist/delivery-client.js +231 -0
  45. package/dist/delivery-client.js.map +1 -0
  46. package/dist/endpoint-policy.d.ts +11 -0
  47. package/dist/endpoint-policy.d.ts.map +1 -0
  48. package/dist/endpoint-policy.js +107 -0
  49. package/dist/endpoint-policy.js.map +1 -0
  50. package/dist/event-watchers.d.ts +11 -0
  51. package/dist/event-watchers.d.ts.map +1 -0
  52. package/dist/event-watchers.js +24 -0
  53. package/dist/event-watchers.js.map +1 -0
  54. package/dist/exec-state.d.ts +37 -0
  55. package/dist/exec-state.d.ts.map +1 -0
  56. package/dist/exec-state.js +53 -0
  57. package/dist/exec-state.js.map +1 -0
  58. package/dist/file-delivery.d.ts +98 -0
  59. package/dist/file-delivery.d.ts.map +1 -0
  60. package/dist/file-delivery.js +473 -0
  61. package/dist/file-delivery.js.map +1 -0
  62. package/dist/handshake-watcher.d.ts +31 -0
  63. package/dist/handshake-watcher.d.ts.map +1 -0
  64. package/dist/handshake-watcher.js +157 -0
  65. package/dist/handshake-watcher.js.map +1 -0
  66. package/dist/hire-listener.d.ts +32 -0
  67. package/dist/hire-listener.d.ts.map +1 -0
  68. package/dist/hire-listener.js +237 -0
  69. package/dist/hire-listener.js.map +1 -0
  70. package/dist/index.d.ts +3 -0
  71. package/dist/index.d.ts.map +1 -0
  72. package/dist/index.js +182 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/job-lifecycle.d.ts +62 -0
  75. package/dist/job-lifecycle.d.ts.map +1 -0
  76. package/dist/job-lifecycle.js +201 -0
  77. package/dist/job-lifecycle.js.map +1 -0
  78. package/dist/notify.d.ts +51 -0
  79. package/dist/notify.d.ts.map +1 -0
  80. package/dist/notify.js +276 -0
  81. package/dist/notify.js.map +1 -0
  82. package/dist/permission-gate.d.ts +30 -0
  83. package/dist/permission-gate.d.ts.map +1 -0
  84. package/dist/permission-gate.js +180 -0
  85. package/dist/permission-gate.js.map +1 -0
  86. package/dist/prompt-guard.d.ts +18 -0
  87. package/dist/prompt-guard.d.ts.map +1 -0
  88. package/dist/prompt-guard.js +70 -0
  89. package/dist/prompt-guard.js.map +1 -0
  90. package/dist/server.d.ts +27 -0
  91. package/dist/server.d.ts.map +1 -0
  92. package/dist/server.js +1956 -0
  93. package/dist/server.js.map +1 -0
  94. package/dist/session-manager.d.ts +55 -0
  95. package/dist/session-manager.d.ts.map +1 -0
  96. package/dist/session-manager.js +139 -0
  97. package/dist/session-manager.js.map +1 -0
  98. package/dist/signer.d.ts +19 -0
  99. package/dist/signer.d.ts.map +1 -0
  100. package/dist/signer.js +195 -0
  101. package/dist/signer.js.map +1 -0
  102. package/dist/token-metering.d.ts +42 -0
  103. package/dist/token-metering.d.ts.map +1 -0
  104. package/dist/token-metering.js +178 -0
  105. package/dist/token-metering.js.map +1 -0
  106. package/dist/userops.d.ts +24 -0
  107. package/dist/userops.d.ts.map +1 -0
  108. package/dist/userops.js +156 -0
  109. package/dist/userops.js.map +1 -0
  110. package/dist/wallet-monitor.d.ts +16 -0
  111. package/dist/wallet-monitor.d.ts.map +1 -0
  112. package/dist/wallet-monitor.js +57 -0
  113. package/dist/wallet-monitor.js.map +1 -0
  114. package/dist/worker-executor.d.ts +81 -0
  115. package/dist/worker-executor.d.ts.map +1 -0
  116. package/dist/worker-executor.js +527 -0
  117. package/dist/worker-executor.js.map +1 -0
  118. package/dist/worker-router.d.ts +63 -0
  119. package/dist/worker-router.d.ts.map +1 -0
  120. package/dist/worker-router.js +263 -0
  121. package/dist/worker-router.js.map +1 -0
  122. package/package.json +30 -0
@@ -0,0 +1,61 @@
1
+ /**
2
+ * ComputeMetering — GPU utilization tracking for ARC-402 compute sessions.
3
+ *
4
+ * - Polls nvidia-smi every N seconds (configurable; default 30)
5
+ * - Falls back to mock metrics when nvidia-smi is not available (testing)
6
+ * - Aggregates into 15-minute UsageReports signed with the provider key
7
+ * - Persists raw metrics to ~/.arc402/compute/<sessionId>/metrics.jsonl
8
+ * - Persists signed reports to ~/.arc402/compute/<sessionId>/reports/
9
+ */
10
+ import { ethers } from "ethers";
11
+ export interface ComputeMetrics {
12
+ sessionId: string;
13
+ gpuUtilizationPercent: number;
14
+ gpuMemoryUsedMB: number;
15
+ gpuTemperatureC: number;
16
+ activeMinutes: number;
17
+ computeMinutes: number;
18
+ timestamp: number;
19
+ }
20
+ export interface UsageReport {
21
+ sessionId: string;
22
+ periodStart: number;
23
+ periodEnd: number;
24
+ computeMinutes: number;
25
+ avgUtilization: number;
26
+ providerSignature: string;
27
+ metricsHash: string;
28
+ }
29
+ export declare class ComputeMetering {
30
+ private sessions;
31
+ private wallet;
32
+ private chainId;
33
+ private contractAddress;
34
+ private meteringIntervalMs;
35
+ private reportIntervalMs;
36
+ private onchainProvider;
37
+ constructor(providerPrivateKey: string, chainId: number, contractAddress: string, meteringIntervalSeconds?: number, reportIntervalMinutes?: number, onchainProvider?: ethers.JsonRpcProvider);
38
+ /**
39
+ * Start metering a new session.
40
+ * Polls nvidia-smi on the metering interval and aggregates 15-min reports.
41
+ */
42
+ startMetering(sessionId: string): void;
43
+ /**
44
+ * Stop metering and return the final usage report.
45
+ * Generates a final report covering remaining metrics since last report.
46
+ */
47
+ stopMetering(sessionId: string): Promise<UsageReport | null>;
48
+ /**
49
+ * Return the latest metrics snapshot for a running session.
50
+ */
51
+ getCurrentMetrics(sessionId: string): ComputeMetrics | null;
52
+ /**
53
+ * Return all usage reports generated for a session.
54
+ */
55
+ getUsageReports(sessionId: string): UsageReport[];
56
+ private _collectMetric;
57
+ private _generateReport;
58
+ private _submitOnChain;
59
+ private _loadReportsFromDisk;
60
+ }
61
+ //# sourceMappingURL=compute-metering.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute-metering.d.ts","sourceRoot":"","sources":["../src/compute-metering.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAKhC,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;CACrB;AA4HD,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAgD;IAChE,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,eAAe,CAAqC;gBAG1D,kBAAkB,EAAE,MAAM,EAC1B,OAAO,EAAE,MAAM,EACf,eAAe,EAAE,MAAM,EACvB,uBAAuB,SAAK,EAC5B,qBAAqB,SAAO,EAC5B,eAAe,CAAC,EAAE,MAAM,CAAC,eAAe;IAU1C;;;OAGG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAgCtC;;;OAGG;IACG,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAclE;;OAEG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAM3D;;OAEG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,EAAE;IAWjD,OAAO,CAAC,cAAc;YAsCR,eAAe;YAsEf,cAAc;IAgB5B,OAAO,CAAC,oBAAoB;CAe7B"}
@@ -0,0 +1,299 @@
1
+ "use strict";
2
+ /**
3
+ * ComputeMetering — GPU utilization tracking for ARC-402 compute sessions.
4
+ *
5
+ * - Polls nvidia-smi every N seconds (configurable; default 30)
6
+ * - Falls back to mock metrics when nvidia-smi is not available (testing)
7
+ * - Aggregates into 15-minute UsageReports signed with the provider key
8
+ * - Persists raw metrics to ~/.arc402/compute/<sessionId>/metrics.jsonl
9
+ * - Persists signed reports to ~/.arc402/compute/<sessionId>/reports/
10
+ */
11
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ var desc = Object.getOwnPropertyDescriptor(m, k);
14
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
15
+ desc = { enumerable: true, get: function() { return m[k]; } };
16
+ }
17
+ Object.defineProperty(o, k2, desc);
18
+ }) : (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ o[k2] = m[k];
21
+ }));
22
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
23
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
24
+ }) : function(o, v) {
25
+ o["default"] = v;
26
+ });
27
+ var __importStar = (this && this.__importStar) || (function () {
28
+ var ownKeys = function(o) {
29
+ ownKeys = Object.getOwnPropertyNames || function (o) {
30
+ var ar = [];
31
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
32
+ return ar;
33
+ };
34
+ return ownKeys(o);
35
+ };
36
+ return function (mod) {
37
+ if (mod && mod.__esModule) return mod;
38
+ var result = {};
39
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
40
+ __setModuleDefault(result, mod);
41
+ return result;
42
+ };
43
+ })();
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.ComputeMetering = void 0;
46
+ const fs = __importStar(require("fs"));
47
+ const path = __importStar(require("path"));
48
+ const child_process_1 = require("child_process");
49
+ const ethers_1 = require("ethers");
50
+ const config_1 = require("./config");
51
+ // ─── Constants ────────────────────────────────────────────────────────────────
52
+ const COMPUTE_DATA_DIR = path.join(config_1.DAEMON_DIR, "compute");
53
+ const GPU_ACTIVE_THRESHOLD = 5; // utilization % above which we count compute-minutes
54
+ // ─── nvidia-smi poll ──────────────────────────────────────────────────────────
55
+ function pollNvidiaSmi() {
56
+ try {
57
+ const output = (0, child_process_1.execSync)("nvidia-smi --query-gpu=utilization.gpu,memory.used,temperature.gpu --format=csv,noheader,nounits", { timeout: 5000, stdio: ["ignore", "pipe", "ignore"] }).toString().trim();
58
+ const parts = output.split(",").map(s => s.trim());
59
+ if (parts.length < 3)
60
+ return null;
61
+ const utilization = parseFloat(parts[0]);
62
+ const memoryMB = parseFloat(parts[1]);
63
+ const temperatureC = parseFloat(parts[2]);
64
+ if (isNaN(utilization) || isNaN(memoryMB) || isNaN(temperatureC))
65
+ return null;
66
+ return { utilization, memoryMB, temperatureC };
67
+ }
68
+ catch {
69
+ return null;
70
+ }
71
+ }
72
+ function mockMetrics() {
73
+ // Deterministic-ish mock that oscillates for test realism
74
+ const t = Date.now() / 1000;
75
+ return {
76
+ utilization: Math.round(50 + 30 * Math.sin(t / 60)),
77
+ memoryMB: Math.round(4000 + 1000 * Math.cos(t / 90)),
78
+ temperatureC: Math.round(65 + 10 * Math.sin(t / 120)),
79
+ };
80
+ }
81
+ // ─── Report signing ───────────────────────────────────────────────────────────
82
+ /**
83
+ * Produce the same digest that ComputeAgreement.sol verifies.
84
+ * CA-IND-1: includes chainId and contractAddress to prevent cross-chain/cross-contract replay.
85
+ * structHash = keccak256(abi.encode(chainId, contractAddress, sessionId, periodStart,
86
+ * periodEnd, computeMinutes, avgUtilization, metricsHash))
87
+ * digest = EIP-191 personal_sign(structHash)
88
+ */
89
+ function buildReportDigest(chainId, contractAddress, sessionId, periodStart, periodEnd, computeMinutes, avgUtilization, metricsHash) {
90
+ const encoded = ethers_1.ethers.AbiCoder.defaultAbiCoder().encode(["uint256", "address", "bytes32", "uint256", "uint256", "uint256", "uint256", "bytes32"], [
91
+ BigInt(chainId),
92
+ contractAddress,
93
+ sessionId,
94
+ BigInt(periodStart),
95
+ BigInt(periodEnd),
96
+ BigInt(computeMinutes),
97
+ BigInt(avgUtilization),
98
+ metricsHash,
99
+ ]);
100
+ const structHash = ethers_1.ethers.keccak256(encoded);
101
+ // EIP-191 prefix — matches "\x19Ethereum Signed Message:\n32" + structHash
102
+ return ethers_1.ethers.hashMessage(ethers_1.ethers.getBytes(structHash));
103
+ }
104
+ async function signReport(wallet, chainId, contractAddress, sessionId, periodStart, periodEnd, computeMinutes, avgUtilization, metricsHash) {
105
+ const encoded = ethers_1.ethers.AbiCoder.defaultAbiCoder().encode(["uint256", "address", "bytes32", "uint256", "uint256", "uint256", "uint256", "bytes32"], [
106
+ BigInt(chainId),
107
+ contractAddress,
108
+ sessionId,
109
+ BigInt(periodStart),
110
+ BigInt(periodEnd),
111
+ BigInt(computeMinutes),
112
+ BigInt(avgUtilization),
113
+ metricsHash,
114
+ ]);
115
+ const structHash = ethers_1.ethers.keccak256(encoded);
116
+ return wallet.signMessage(ethers_1.ethers.getBytes(structHash));
117
+ }
118
+ // ─── Main class ───────────────────────────────────────────────────────────────
119
+ const SUBMIT_USAGE_REPORT_ABI = [
120
+ "function submitUsageReport(bytes32 sessionId, uint256 periodStart, uint256 periodEnd, uint256 computeMinutes, uint256 avgUtilization, bytes providerSignature, bytes32 metricsHash) external",
121
+ ];
122
+ class ComputeMetering {
123
+ constructor(providerPrivateKey, chainId, contractAddress, meteringIntervalSeconds = 30, reportIntervalMinutes = 15, onchainProvider) {
124
+ this.sessions = new Map();
125
+ this.wallet = new ethers_1.ethers.Wallet(providerPrivateKey);
126
+ this.chainId = chainId;
127
+ this.contractAddress = contractAddress;
128
+ this.meteringIntervalMs = meteringIntervalSeconds * 1000;
129
+ this.reportIntervalMs = reportIntervalMinutes * 60 * 1000;
130
+ this.onchainProvider = onchainProvider;
131
+ }
132
+ /**
133
+ * Start metering a new session.
134
+ * Polls nvidia-smi on the metering interval and aggregates 15-min reports.
135
+ */
136
+ startMetering(sessionId) {
137
+ if (this.sessions.has(sessionId))
138
+ return;
139
+ const sessionDir = path.join(COMPUTE_DATA_DIR, sessionId);
140
+ const reportsDir = path.join(sessionDir, "reports");
141
+ fs.mkdirSync(reportsDir, { recursive: true, mode: 0o700 });
142
+ const state = {
143
+ sessionId,
144
+ startTime: Date.now(),
145
+ lastReportTime: Date.now(),
146
+ rawMetrics: [],
147
+ allReports: [],
148
+ metricsFilePath: path.join(sessionDir, "metrics.jsonl"),
149
+ reportsDir,
150
+ intervalHandle: null,
151
+ reportIntervalHandle: null,
152
+ };
153
+ // Metering poll
154
+ state.intervalHandle = setInterval(() => {
155
+ this._collectMetric(state);
156
+ }, this.meteringIntervalMs);
157
+ // Report generation
158
+ state.reportIntervalHandle = setInterval(() => {
159
+ void this._generateReport(state);
160
+ }, this.reportIntervalMs);
161
+ this.sessions.set(sessionId, state);
162
+ }
163
+ /**
164
+ * Stop metering and return the final usage report.
165
+ * Generates a final report covering remaining metrics since last report.
166
+ */
167
+ async stopMetering(sessionId) {
168
+ const state = this.sessions.get(sessionId);
169
+ if (!state)
170
+ return null;
171
+ clearInterval(state.intervalHandle);
172
+ clearInterval(state.reportIntervalHandle);
173
+ // Final report from remaining buffered metrics
174
+ const finalReport = await this._generateReport(state);
175
+ this.sessions.delete(sessionId);
176
+ return finalReport;
177
+ }
178
+ /**
179
+ * Return the latest metrics snapshot for a running session.
180
+ */
181
+ getCurrentMetrics(sessionId) {
182
+ const state = this.sessions.get(sessionId);
183
+ if (!state || state.rawMetrics.length === 0)
184
+ return null;
185
+ return state.rawMetrics[state.rawMetrics.length - 1];
186
+ }
187
+ /**
188
+ * Return all usage reports generated for a session.
189
+ */
190
+ getUsageReports(sessionId) {
191
+ const state = this.sessions.get(sessionId);
192
+ if (!state) {
193
+ // Try to load persisted reports from disk
194
+ return this._loadReportsFromDisk(sessionId);
195
+ }
196
+ return [...state.allReports];
197
+ }
198
+ // ─── Private ────────────────────────────────────────────────────────────────
199
+ _collectMetric(state) {
200
+ const gpu = pollNvidiaSmi() ?? mockMetrics();
201
+ const now = Date.now();
202
+ const wallMs = now - state.startTime;
203
+ const wallMins = wallMs / 60000;
204
+ // Compute-minutes: count wall-clock intervals where utilization exceeded threshold
205
+ const active = gpu.utilization > GPU_ACTIVE_THRESHOLD;
206
+ const addComputeMins = active ? this.meteringIntervalMs / 60000 : 0;
207
+ // Accumulate into the current period buffer
208
+ const prevComputeMins = state.rawMetrics.length > 0
209
+ ? state.rawMetrics[state.rawMetrics.length - 1].computeMinutes
210
+ : 0;
211
+ const metric = {
212
+ sessionId: state.sessionId,
213
+ gpuUtilizationPercent: gpu.utilization,
214
+ gpuMemoryUsedMB: gpu.memoryMB,
215
+ gpuTemperatureC: gpu.temperatureC,
216
+ activeMinutes: wallMins,
217
+ computeMinutes: prevComputeMins + addComputeMins,
218
+ timestamp: now,
219
+ };
220
+ state.rawMetrics.push(metric);
221
+ // Persist to JSONL
222
+ try {
223
+ fs.appendFileSync(state.metricsFilePath, JSON.stringify(metric) + "\n", { mode: 0o600 });
224
+ }
225
+ catch { /* non-fatal — disk full etc */ }
226
+ }
227
+ async _generateReport(state) {
228
+ if (state.rawMetrics.length === 0)
229
+ return null;
230
+ const periodStart = state.lastReportTime;
231
+ const periodEnd = Date.now();
232
+ // Metrics accumulated in this period
233
+ const periodMetrics = state.rawMetrics.filter(m => m.timestamp >= periodStart);
234
+ if (periodMetrics.length === 0)
235
+ return null;
236
+ const computeMinutes = periodMetrics.reduce((acc, m) => {
237
+ // Each poll interval contributes proportionally
238
+ const active = m.gpuUtilizationPercent > GPU_ACTIVE_THRESHOLD;
239
+ return acc + (active ? this.meteringIntervalMs / 60000 : 0);
240
+ }, 0);
241
+ const avgUtilization = Math.round(periodMetrics.reduce((acc, m) => acc + m.gpuUtilizationPercent, 0) / periodMetrics.length);
242
+ // Hash raw metrics for dispute evidence
243
+ const metricsJson = JSON.stringify(periodMetrics);
244
+ const metricsHash = ethers_1.ethers.keccak256(ethers_1.ethers.toUtf8Bytes(metricsJson));
245
+ const roundedMinutes = Math.round(computeMinutes);
246
+ const sig = await signReport(this.wallet, this.chainId, this.contractAddress, state.sessionId, Math.floor(periodStart / 1000), Math.floor(periodEnd / 1000), roundedMinutes, avgUtilization, metricsHash);
247
+ const report = {
248
+ sessionId: state.sessionId,
249
+ periodStart: Math.floor(periodStart / 1000),
250
+ periodEnd: Math.floor(periodEnd / 1000),
251
+ computeMinutes: roundedMinutes,
252
+ avgUtilization,
253
+ providerSignature: sig,
254
+ metricsHash,
255
+ };
256
+ state.allReports.push(report);
257
+ state.lastReportTime = periodEnd;
258
+ // Clear the processed period's metrics from the buffer
259
+ state.rawMetrics = state.rawMetrics.filter(m => m.timestamp >= periodEnd);
260
+ // Persist report to disk
261
+ const reportFile = path.join(state.reportsDir, `report_${report.periodStart}.json`);
262
+ try {
263
+ fs.writeFileSync(reportFile, JSON.stringify(report, null, 2), { mode: 0o600 });
264
+ }
265
+ catch { /* non-fatal */ }
266
+ // Submit on-chain if provider is configured
267
+ if (this.onchainProvider && this.contractAddress) {
268
+ void this._submitOnChain(report).catch(() => { });
269
+ }
270
+ return report;
271
+ }
272
+ async _submitOnChain(report) {
273
+ if (!this.onchainProvider)
274
+ return;
275
+ const signer = this.wallet.connect(this.onchainProvider);
276
+ const contract = new ethers_1.ethers.Contract(this.contractAddress, SUBMIT_USAGE_REPORT_ABI, signer);
277
+ const tx = await contract.submitUsageReport(report.sessionId, BigInt(report.periodStart), BigInt(report.periodEnd), BigInt(report.computeMinutes), BigInt(report.avgUtilization), report.providerSignature, report.metricsHash);
278
+ await tx.wait();
279
+ }
280
+ _loadReportsFromDisk(sessionId) {
281
+ const reportsDir = path.join(COMPUTE_DATA_DIR, sessionId, "reports");
282
+ if (!fs.existsSync(reportsDir))
283
+ return [];
284
+ try {
285
+ const files = fs.readdirSync(reportsDir)
286
+ .filter(f => f.endsWith(".json"))
287
+ .sort();
288
+ return files.map(f => {
289
+ const raw = fs.readFileSync(path.join(reportsDir, f), "utf-8");
290
+ return JSON.parse(raw);
291
+ });
292
+ }
293
+ catch {
294
+ return [];
295
+ }
296
+ }
297
+ }
298
+ exports.ComputeMetering = ComputeMetering;
299
+ //# sourceMappingURL=compute-metering.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute-metering.js","sourceRoot":"","sources":["../src/compute-metering.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * ComputeSessionManager — session lifecycle management for ARC-402 compute rental.
3
+ *
4
+ * Owns the in-memory + persisted state for all compute sessions handled by
5
+ * this provider node. Coordinates with ComputeMetering for GPU tracking.
6
+ */
7
+ import { ComputeMetering, UsageReport } from "./compute-metering";
8
+ export type ComputeSessionStatus = "proposed" | "accepted" | "active" | "completed" | "disputed";
9
+ export interface ComputeProposal {
10
+ sessionId: string;
11
+ clientAddress: string;
12
+ providerAddress: string;
13
+ ratePerHourWei: string;
14
+ maxHours: number;
15
+ gpuSpecHash: string;
16
+ workloadDescription: string;
17
+ depositAmount: string;
18
+ proposedAt: number;
19
+ }
20
+ export interface ComputeSessionState {
21
+ proposal: ComputeProposal;
22
+ status: ComputeSessionStatus;
23
+ startedAt: number | null;
24
+ endedAt: number | null;
25
+ accessEndpoint: string | null;
26
+ consumedMinutes: number;
27
+ usageReports: UsageReport[];
28
+ updatedAt: number;
29
+ }
30
+ export interface SettlementResult {
31
+ sessionId: string;
32
+ consumedMinutes: number;
33
+ costWei: bigint;
34
+ depositWei: bigint;
35
+ refundWei: bigint;
36
+ reports: UsageReport[];
37
+ }
38
+ export declare class ComputeSessionManager {
39
+ sessions: Map<string, ComputeSessionState>;
40
+ private metering;
41
+ constructor(metering?: ComputeMetering);
42
+ /**
43
+ * Record an incoming compute proposal (from a client).
44
+ * Validates it doesn't conflict with capacity limits.
45
+ */
46
+ handleProposal(proposal: ComputeProposal): {
47
+ ok: boolean;
48
+ error?: string;
49
+ };
50
+ /**
51
+ * Provider accepts the proposal. On-chain call should follow.
52
+ */
53
+ acceptSession(sessionId: string): {
54
+ ok: boolean;
55
+ error?: string;
56
+ };
57
+ /**
58
+ * Provider marks the session as active. Starts GPU metering.
59
+ * @param accessEndpoint Optional SSH / API endpoint to surface to client.
60
+ */
61
+ startSession(sessionId: string, accessEndpoint?: string): {
62
+ ok: boolean;
63
+ error?: string;
64
+ };
65
+ /**
66
+ * Either party ends the session. Stops metering, calculates settlement.
67
+ */
68
+ endSession(sessionId: string): Promise<{
69
+ ok: boolean;
70
+ error?: string;
71
+ result?: SettlementResult;
72
+ }>;
73
+ /**
74
+ * Client disputes the session — freezes it pending arbitration.
75
+ */
76
+ disputeSession(sessionId: string): {
77
+ ok: boolean;
78
+ error?: string;
79
+ };
80
+ /**
81
+ * Append a usage report (from daemon's periodic reporting loop).
82
+ */
83
+ appendUsageReport(sessionId: string, report: UsageReport): {
84
+ ok: boolean;
85
+ error?: string;
86
+ };
87
+ /**
88
+ * Get a single session by ID.
89
+ */
90
+ getSession(sessionId: string): ComputeSessionState | null;
91
+ /**
92
+ * List all sessions.
93
+ */
94
+ listSessions(): ComputeSessionState[];
95
+ /**
96
+ * Count sessions in a given status.
97
+ */
98
+ countByStatus(status: ComputeSessionStatus): number;
99
+ }
100
+ //# sourceMappingURL=compute-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute-session.d.ts","sourceRoot":"","sources":["../src/compute-session.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAIlE,MAAM,MAAM,oBAAoB,GAC5B,UAAU,GACV,UAAU,GACV,QAAQ,GACR,WAAW,GACX,UAAU,CAAC;AAEf,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAY,MAAM,CAAC;IAC5B,aAAa,EAAQ,MAAM,CAAC;IAC5B,eAAe,EAAM,MAAM,CAAC;IAC5B,cAAc,EAAO,MAAM,CAAC;IAC5B,QAAQ,EAAa,MAAM,CAAC;IAC5B,WAAW,EAAU,MAAM,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAQ,MAAM,CAAC;IAC5B,UAAU,EAAW,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAS,eAAe,CAAC;IACjC,MAAM,EAAW,oBAAoB,CAAC;IACtC,SAAS,EAAQ,MAAM,GAAG,IAAI,CAAC;IAC/B,OAAO,EAAU,MAAM,GAAG,IAAI,CAAC;IAC/B,cAAc,EAAG,MAAM,GAAG,IAAI,CAAC;IAC/B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAK,WAAW,EAAE,CAAC;IAC/B,SAAS,EAAQ,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAQ,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAU,MAAM,CAAC;IACxB,UAAU,EAAO,MAAM,CAAC;IACxB,SAAS,EAAQ,MAAM,CAAC;IACxB,OAAO,EAAU,WAAW,EAAE,CAAC;CAChC;AA8BD,qBAAa,qBAAqB;IACzB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAClD,OAAO,CAAC,QAAQ,CAAyB;gBAE7B,QAAQ,CAAC,EAAE,eAAe;IAKtC;;;OAGG;IACH,cAAc,CAAC,QAAQ,EAAE,eAAe,GAAG;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IAqB1E;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IAWjE;;;OAGG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IAoBzF;;OAEG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,gBAAgB,CAAA;KAAE,CAAC;IA8CxG;;OAEG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IAWlE;;OAEG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IAY1F;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI;IAIzD;;OAEG;IACH,YAAY,IAAI,mBAAmB,EAAE;IAIrC;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM;CAOpD"}