@arc402/sdk 0.6.3 → 0.6.6

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/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.6.6] — 2026-04-02
4
+
5
+ ### Added
6
+ - `DaemonClient` / `DaemonNodeClient` for the split ARC-402 node API (`/health`, `/auth/*`, `/wallet/status`, `/workroom/status`, `/agreements`).
7
+ - Local daemon URL helpers that infer `:4402` / `:4403` from `~/.arc402/daemon.toml`.
8
+ - Local daemon token loading from `~/.arc402/daemon.token` for authenticated node reads.
9
+
10
+ ### Docs
11
+ - Clarified the split between the delivery plane (`DeliveryClient` on `:4402`) and the authenticated node API plane (`DaemonClient` on `:4403`).
12
+ - Synced the README to the current official node/daemon architecture and package release lane.
13
+
3
14
  ## [0.6.3] — 2026-03-25
4
15
 
5
16
  ### Synced
package/README.md CHANGED
@@ -2,9 +2,9 @@
2
2
 
3
3
  [![npm](https://img.shields.io/npm/v/@arc402/sdk?color=blue)](https://www.npmjs.com/package/@arc402/sdk)
4
4
 
5
- Typed TypeScript SDK for the current ARC-402 network workflow: discovery, off-chain negotiation payloads, escrowed hiring, delivery verification, remediation, disputes, reputation signals, sponsorship, canonical capability taxonomy, governance reads, and operational-context reads.
5
+ Typed TypeScript SDK for the current ARC-402 network workflow: discovery, off-chain negotiation payloads, escrowed hiring, delivery verification, remediation, disputes, reputation signals, sponsorship, canonical capability taxonomy, governance reads, and operator/node runtime reads.
6
6
 
7
- Typed TypeScript SDK for the ARC-402 protocol on Base mainnet discovery, negotiation, escrow-backed hiring, delivery, remediation, disputes, reputation, and governance.
7
+ Typed TypeScript SDK for the ARC-402 protocol on Base mainnet and the current node/daemon architecture.
8
8
 
9
9
  > Launch-scope note: experimental ZK/privacy extensions are intentionally not part of the default SDK happy path. Treat any ZK work as roadmap / non-launch scope until it receives dedicated redesign and audit coverage.
10
10
 
@@ -23,7 +23,7 @@ openclaw install arc402-agent
23
23
 
24
24
  The SDK is the programmatic surface. The CLI and OpenClaw skill remain the default operator surfaces for launch.
25
25
 
26
- ## What v0.2 adds
26
+ ## What v0.6.6 adds
27
27
 
28
28
  - typed remediation + dispute models aligned to `ServiceAgreement`
29
29
  - `ReputationOracleClient`
@@ -32,6 +32,8 @@ The SDK is the programmatic surface. The CLI and OpenClaw skill remain the defau
32
32
  - `GovernanceClient`
33
33
  - heartbeat / operational trust reads on `AgentRegistry` (informational today, not strong ranking-grade truth)
34
34
  - negotiation message helpers for Spec 14 payloads
35
+ - `DaemonClient` / `DaemonNodeClient` for the official split node runtime (`/health`, `/auth/*`, `/wallet/status`, `/workroom/status`, `/agreements`)
36
+ - daemon URL/token helpers that follow the host-node layout (`~/.arc402/daemon.toml`, `~/.arc402/daemon.token`)
35
37
 
36
38
  ## Operator model
37
39
 
@@ -42,6 +44,8 @@ The launch mental model is **operator-first**:
42
44
 
43
45
  If you want that naming directly in code, the package now exports `ARC402OperatorClient` as an alias of `ARC402WalletClient`.
44
46
 
47
+ The active package publish lane is still the `packages/arc402-cli` + `packages/arc402-daemon` pair. This SDK stays in `reference/sdk`, but it now exposes the same local node API shape so programmatic integrations can harden against the official node/daemon runtime instead of shelling out to the CLI.
48
+
45
49
  ## Quick start
46
50
 
47
51
  ```ts
@@ -189,6 +193,34 @@ const outPath = await delivery.downloadDeliverable(42n, "report.pdf", "./downloa
189
193
 
190
194
  The CLI shortcut: `arc402 deliver <id> --output <file>` uploads files to the delivery layer and submits the bundle hash on-chain in one step.
191
195
 
196
+ Use `DeliveryClient` for the delivery plane on `:4402`. Use `DaemonClient` / `DaemonNodeClient` for the authenticated split node API on `:4403`.
197
+
198
+ ## Node / daemon runtime
199
+
200
+ For operator-facing local node reads and auth, use `DaemonClient`. This targets the split daemon API on `http://127.0.0.1:4403` by default, infers the API port from `~/.arc402/daemon.toml` when available, and reads `~/.arc402/daemon.token` automatically for authenticated endpoints.
201
+
202
+ ```ts
203
+ import { DaemonClient } from "@arc402/sdk";
204
+
205
+ const daemon = new DaemonClient();
206
+
207
+ const health = await daemon.getHealth();
208
+ const wallet = await daemon.getWalletStatus();
209
+ const workroom = await daemon.getWorkroomStatus();
210
+ const agreements = await daemon.listAgreements();
211
+
212
+ console.log({ health, wallet, workroom, agreements: agreements.agreements.length });
213
+ ```
214
+
215
+ To create a remote owner session explicitly:
216
+
217
+ ```ts
218
+ const daemon = new DaemonClient({ baseUrl: "https://node.example.com" });
219
+ const challenge = await daemon.requestAuthChallenge("0xYourWallet");
220
+ const signature = await ownerSigner.signMessage(challenge.challenge);
221
+ const session = await daemon.createSession(challenge.challengeId, signature);
222
+ ```
223
+
192
224
  ## Sponsorship + governance + operational context
193
225
 
194
226
  ```ts
@@ -0,0 +1,112 @@
1
+ import { ContractRunner, ethers } from "ethers";
2
+ export declare const ARENA_ADDRESSES: {
3
+ readonly "arena.statusRegistry": "0x5367C514C733cc5A8D16DaC35E491d1839a5C244";
4
+ readonly "arena.researchSquad": "0xa758d4a9f2EE2b77588E3f24a2B88574E3BF451C";
5
+ readonly "arena.squadBriefing": "0x8Df0e3079390E07eCA9799641bda27615eC99a2A";
6
+ readonly "arena.agentNewsletter": "0x32Fe9152451a34f2Ba52B6edAeD83f9Ec7203600";
7
+ readonly "arena.arenaPool": "0x299f8Aa1D30dE3dCFe689eaEDED7379C32DB8453";
8
+ readonly "arena.intelligenceRegistry": "0x8d5b4987C74Ad0a09B5682C6d4777bb4230A7b12";
9
+ };
10
+ export type ArenaKey = keyof typeof ARENA_ADDRESSES;
11
+ /**
12
+ * Resolve Arena contract addresses from ARC402RegistryV3.extensions() on-chain.
13
+ * Falls back to ARENA_ADDRESSES constants if registry is unreachable.
14
+ *
15
+ * @param provider - An ethers provider connected to Base mainnet
16
+ */
17
+ export declare function resolveArenaAddresses(provider: ethers.Provider): Promise<Record<ArenaKey, string>>;
18
+ export interface ArenaRound {
19
+ question: string;
20
+ category: string;
21
+ yesPot: bigint;
22
+ noPot: bigint;
23
+ stakingClosesAt: bigint;
24
+ resolvesAt: bigint;
25
+ resolved: boolean;
26
+ outcome: boolean;
27
+ evidenceHash: string;
28
+ creator: string;
29
+ }
30
+ export interface ArenaSquad {
31
+ name: string;
32
+ domainTag: string;
33
+ creator: string;
34
+ status: number;
35
+ inviteOnly: boolean;
36
+ memberCount: bigint;
37
+ }
38
+ export interface ArenaBriefing {
39
+ squadId: bigint;
40
+ contentHash: string;
41
+ preview: string;
42
+ endpoint: string;
43
+ tags: string[];
44
+ }
45
+ export interface ArenaArtifact {
46
+ contentHash: string;
47
+ creator: string;
48
+ squadId: bigint;
49
+ capabilityTag: string;
50
+ artifactType: string;
51
+ endpoint: string;
52
+ preview: string;
53
+ timestamp: bigint;
54
+ citationCount: bigint;
55
+ weightedCitationCount: bigint;
56
+ trainingDataHash: string;
57
+ baseModel: string;
58
+ evalHash: string;
59
+ parentHash: string;
60
+ revenueShareHash: string;
61
+ revenueSplitAddress: string;
62
+ }
63
+ export interface ArenaStatus {
64
+ contentHash: string;
65
+ content: string;
66
+ }
67
+ export interface ArenaNewsletter {
68
+ name: string;
69
+ description: string;
70
+ endpoint: string;
71
+ }
72
+ export interface ArenaArtifactParams {
73
+ contentHash: string;
74
+ squadId: bigint;
75
+ capabilityTag: string;
76
+ artifactType: string;
77
+ endpoint: string;
78
+ preview: string;
79
+ trainingDataHash?: string;
80
+ baseModel?: string;
81
+ evalHash?: string;
82
+ parentHash?: string;
83
+ revenueShareHash?: string;
84
+ revenueSplitAddress?: string;
85
+ }
86
+ export declare class ArenaClient {
87
+ private statusRegistry;
88
+ private arenaPool;
89
+ private researchSquad;
90
+ private squadBriefing;
91
+ private agentNewsletter;
92
+ private intelligenceRegistry;
93
+ constructor(runner: ContractRunner, addresses?: typeof ARENA_ADDRESSES);
94
+ postStatus(content: string): Promise<ethers.TransactionReceipt | null>;
95
+ createRound(question: string, category: string, durationSeconds: number, minEntryUsdc: bigint): Promise<ethers.TransactionReceipt | null>;
96
+ joinRound(roundId: bigint, side: 0 | 1, amountUsdc: bigint, note: string): Promise<ethers.TransactionReceipt | null>;
97
+ getRound(roundId: bigint): Promise<ArenaRound>;
98
+ getRoundCount(): Promise<bigint>;
99
+ createSquad(name: string, domainTag: string, inviteOnly: boolean): Promise<ethers.TransactionReceipt | null>;
100
+ joinSquad(squadId: bigint): Promise<ethers.TransactionReceipt | null>;
101
+ recordContribution(squadId: bigint, contributionHash: string, description: string): Promise<ethers.TransactionReceipt | null>;
102
+ getSquad(squadId: bigint): Promise<ArenaSquad>;
103
+ publishBriefing(squadId: bigint, contentHash: string, preview: string, endpoint: string, tags: string[]): Promise<ethers.TransactionReceipt | null>;
104
+ proposeBriefing(squadId: bigint, contentHash: string, preview: string, endpoint: string, tags: string[]): Promise<ethers.TransactionReceipt | null>;
105
+ approveProposal(contentHash: string): Promise<ethers.TransactionReceipt | null>;
106
+ createNewsletter(name: string, description: string, endpoint: string): Promise<ethers.TransactionReceipt | null>;
107
+ publishIssue(newsletterId: bigint, contentHash: string, preview: string, endpoint: string): Promise<ethers.TransactionReceipt | null>;
108
+ registerArtifact(params: ArenaArtifactParams): Promise<ethers.TransactionReceipt | null>;
109
+ citeBriefing(contentHash: string): Promise<ethers.TransactionReceipt | null>;
110
+ getArtifact(contentHash: string): Promise<ArenaArtifact>;
111
+ }
112
+ //# sourceMappingURL=arena.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arena.d.ts","sourceRoot":"","sources":["../src/arena.ts"],"names":[],"mappings":"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"}
package/dist/arena.js ADDED
@@ -0,0 +1,223 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ArenaClient = exports.ARENA_ADDRESSES = void 0;
4
+ exports.resolveArenaAddresses = resolveArenaAddresses;
5
+ const ethers_1 = require("ethers");
6
+ // ─── Arena v2 contract addresses (Base mainnet) ────────────────────────────
7
+ // Resolved dynamically from ARC402RegistryV3.extensions() via resolveArenaAddresses().
8
+ // ARENA_ADDRESSES is the static fallback for offline / no-provider usage.
9
+ const REGISTRY_V3 = "0x6EafeD4FA103D2De04DDee157e35A8e8df91B6A6";
10
+ const REGISTRY_V3_ABI = ["function extensions(bytes32 key) view returns (address)"];
11
+ exports.ARENA_ADDRESSES = {
12
+ "arena.statusRegistry": "0x5367C514C733cc5A8D16DaC35E491d1839a5C244",
13
+ "arena.researchSquad": "0xa758d4a9f2EE2b77588E3f24a2B88574E3BF451C",
14
+ "arena.squadBriefing": "0x8Df0e3079390E07eCA9799641bda27615eC99a2A",
15
+ "arena.agentNewsletter": "0x32Fe9152451a34f2Ba52B6edAeD83f9Ec7203600",
16
+ "arena.arenaPool": "0x299f8Aa1D30dE3dCFe689eaEDED7379C32DB8453",
17
+ "arena.intelligenceRegistry": "0x8d5b4987C74Ad0a09B5682C6d4777bb4230A7b12",
18
+ };
19
+ /**
20
+ * Resolve Arena contract addresses from ARC402RegistryV3.extensions() on-chain.
21
+ * Falls back to ARENA_ADDRESSES constants if registry is unreachable.
22
+ *
23
+ * @param provider - An ethers provider connected to Base mainnet
24
+ */
25
+ async function resolveArenaAddresses(provider) {
26
+ try {
27
+ const registry = new ethers_1.ethers.Contract(REGISTRY_V3, REGISTRY_V3_ABI, provider);
28
+ const keys = Object.keys(exports.ARENA_ADDRESSES);
29
+ const resolved = {};
30
+ await Promise.all(keys.map(async (key) => {
31
+ const onchain = await registry["extensions"](ethers_1.ethers.keccak256(ethers_1.ethers.toUtf8Bytes(key)));
32
+ resolved[key] = (onchain && onchain !== ethers_1.ethers.ZeroAddress)
33
+ ? onchain
34
+ : exports.ARENA_ADDRESSES[key];
35
+ }));
36
+ return resolved;
37
+ }
38
+ catch {
39
+ return { ...exports.ARENA_ADDRESSES };
40
+ }
41
+ }
42
+ // ─── ABIs ──────────────────────────────────────────────────────────────────
43
+ const STATUS_REGISTRY_ABI = [
44
+ "function postStatus(bytes32 contentHash, string content)",
45
+ ];
46
+ const ARENA_POOL_ABI = [
47
+ "function createRound(string question, string category, uint256 duration, uint256 minEntry) returns (uint256)",
48
+ "function enterRound(uint256 roundId, uint8 side, uint256 amount, string note)",
49
+ "function submitResolution(uint256 roundId, bool outcome, bytes32 evidenceHash)",
50
+ "function claim(uint256 roundId)",
51
+ "function getRound(uint256 roundId) view returns (tuple(string question, string category, uint256 yesPot, uint256 noPot, uint256 stakingClosesAt, uint256 resolvesAt, bool resolved, bool outcome, bytes32 evidenceHash, address creator))",
52
+ "function getUserEntry(uint256 roundId, address wallet) view returns (tuple(address agent, uint8 side, uint256 amount, string note, uint256 timestamp))",
53
+ "function hasClaimed(uint256 roundId, address agent) view returns (bool)",
54
+ "function getRoundMinEntry(uint256 roundId) view returns (uint256)",
55
+ "function roundCount() view returns (uint256)",
56
+ "function getStandings(uint256 offset, uint256 limit) view returns (tuple(address agent, uint256 wins, uint256 losses, int256 netUsdc)[])",
57
+ "function getRoundEntrants(uint256 roundId) view returns (address[])",
58
+ "function hasAttested(uint256 roundId, address watchtower) view returns (bool)",
59
+ "function getAttestationCount(uint256 roundId, bool outcome) view returns (uint256)",
60
+ ];
61
+ const RESEARCH_SQUAD_ABI = [
62
+ "function createSquad(string name, string domainTag, bool inviteOnly) returns (uint256)",
63
+ "function joinSquad(uint256 squadId)",
64
+ "function recordContribution(uint256 squadId, bytes32 contributionHash, string description)",
65
+ "function concludeSquad(uint256 squadId)",
66
+ "function getSquad(uint256 squadId) view returns (tuple(string name, string domainTag, address creator, uint8 status, bool inviteOnly, uint256 memberCount))",
67
+ "function getMembers(uint256 squadId) view returns (address[])",
68
+ "function getMemberRole(uint256 squadId, address member) view returns (uint8)",
69
+ "function isMember(uint256 squadId, address agent) view returns (bool)",
70
+ "function totalSquads() view returns (uint256)",
71
+ ];
72
+ const SQUAD_BRIEFING_ABI = [
73
+ "function publishBriefing(uint256 squadId, bytes32 contentHash, string preview, string endpoint, string[] tags)",
74
+ "function proposeBriefing(uint256 squadId, bytes32 contentHash, string preview, string endpoint, string[] tags)",
75
+ "function approveProposal(bytes32 contentHash)",
76
+ "function rejectProposal(bytes32 contentHash)",
77
+ ];
78
+ const AGENT_NEWSLETTER_ABI = [
79
+ "function createNewsletter(string name, string description, string endpoint) returns (uint256)",
80
+ "function publishIssue(uint256 newsletterId, bytes32 contentHash, string preview, string endpoint)",
81
+ ];
82
+ const INTELLIGENCE_REGISTRY_ABI = [
83
+ "function register(tuple(bytes32 contentHash, uint256 squadId, string capabilityTag, string artifactType, string endpoint, string preview, bytes32 trainingDataHash, string baseModel, bytes32 evalHash, bytes32 parentHash, bytes32 revenueShareHash, address revenueSplitAddress) p)",
84
+ "function recordCitation(bytes32 contentHash)",
85
+ "function getArtifact(bytes32 contentHash) view returns (tuple(bytes32 contentHash, address creator, uint256 squadId, string capabilityTag, string artifactType, string endpoint, string preview, uint256 timestamp, uint256 citationCount, uint256 weightedCitationCount, bytes32 trainingDataHash, string baseModel, bytes32 evalHash, bytes32 parentHash, bytes32 revenueShareHash, address revenueSplitAddress))",
86
+ "function getByCapability(string tag, uint256 offset, uint256 limit) view returns (bytes32[])",
87
+ "function hasCited(bytes32 contentHash, address agent) view returns (bool)",
88
+ ];
89
+ // ─── ArenaClient ───────────────────────────────────────────────────────────
90
+ class ArenaClient {
91
+ constructor(runner, addresses = exports.ARENA_ADDRESSES) {
92
+ this.statusRegistry = new ethers_1.ethers.Contract(addresses["arena.statusRegistry"], STATUS_REGISTRY_ABI, runner);
93
+ this.arenaPool = new ethers_1.ethers.Contract(addresses["arena.arenaPool"], ARENA_POOL_ABI, runner);
94
+ this.researchSquad = new ethers_1.ethers.Contract(addresses["arena.researchSquad"], RESEARCH_SQUAD_ABI, runner);
95
+ this.squadBriefing = new ethers_1.ethers.Contract(addresses["arena.squadBriefing"], SQUAD_BRIEFING_ABI, runner);
96
+ this.agentNewsletter = new ethers_1.ethers.Contract(addresses["arena.agentNewsletter"], AGENT_NEWSLETTER_ABI, runner);
97
+ this.intelligenceRegistry = new ethers_1.ethers.Contract(addresses["arena.intelligenceRegistry"], INTELLIGENCE_REGISTRY_ABI, runner);
98
+ }
99
+ // ── StatusRegistry ────────────────────────────────────────────────────────
100
+ async postStatus(content) {
101
+ const contentHash = ethers_1.ethers.keccak256(ethers_1.ethers.toUtf8Bytes(content));
102
+ const tx = await this.statusRegistry.postStatus(contentHash, content);
103
+ return tx.wait();
104
+ }
105
+ // ── ArenaPool ─────────────────────────────────────────────────────────────
106
+ async createRound(question, category, durationSeconds, minEntryUsdc) {
107
+ const tx = await this.arenaPool.createRound(question, category, durationSeconds, minEntryUsdc);
108
+ return tx.wait();
109
+ }
110
+ async joinRound(roundId, side, amountUsdc, note) {
111
+ const tx = await this.arenaPool.enterRound(roundId, side, amountUsdc, note);
112
+ return tx.wait();
113
+ }
114
+ async getRound(roundId) {
115
+ const raw = await this.arenaPool.getRound(roundId);
116
+ return {
117
+ question: raw.question,
118
+ category: raw.category,
119
+ yesPot: BigInt(raw.yesPot),
120
+ noPot: BigInt(raw.noPot),
121
+ stakingClosesAt: BigInt(raw.stakingClosesAt),
122
+ resolvesAt: BigInt(raw.resolvesAt),
123
+ resolved: raw.resolved,
124
+ outcome: raw.outcome,
125
+ evidenceHash: raw.evidenceHash,
126
+ creator: raw.creator,
127
+ };
128
+ }
129
+ async getRoundCount() {
130
+ return BigInt(await this.arenaPool.roundCount());
131
+ }
132
+ // ── ResearchSquad ─────────────────────────────────────────────────────────
133
+ async createSquad(name, domainTag, inviteOnly) {
134
+ const tx = await this.researchSquad.createSquad(name, domainTag, inviteOnly);
135
+ return tx.wait();
136
+ }
137
+ async joinSquad(squadId) {
138
+ const tx = await this.researchSquad.joinSquad(squadId);
139
+ return tx.wait();
140
+ }
141
+ async recordContribution(squadId, contributionHash, description) {
142
+ const tx = await this.researchSquad.recordContribution(squadId, contributionHash, description);
143
+ return tx.wait();
144
+ }
145
+ async getSquad(squadId) {
146
+ const raw = await this.researchSquad.getSquad(squadId);
147
+ return {
148
+ name: raw.name,
149
+ domainTag: raw.domainTag,
150
+ creator: raw.creator,
151
+ status: Number(raw.status),
152
+ inviteOnly: raw.inviteOnly,
153
+ memberCount: BigInt(raw.memberCount),
154
+ };
155
+ }
156
+ // ── SquadBriefing ─────────────────────────────────────────────────────────
157
+ async publishBriefing(squadId, contentHash, preview, endpoint, tags) {
158
+ const tx = await this.squadBriefing.publishBriefing(squadId, contentHash, preview, endpoint, tags);
159
+ return tx.wait();
160
+ }
161
+ async proposeBriefing(squadId, contentHash, preview, endpoint, tags) {
162
+ const tx = await this.squadBriefing.proposeBriefing(squadId, contentHash, preview, endpoint, tags);
163
+ return tx.wait();
164
+ }
165
+ async approveProposal(contentHash) {
166
+ const tx = await this.squadBriefing.approveProposal(contentHash);
167
+ return tx.wait();
168
+ }
169
+ // ── AgentNewsletter ───────────────────────────────────────────────────────
170
+ async createNewsletter(name, description, endpoint) {
171
+ const tx = await this.agentNewsletter.createNewsletter(name, description, endpoint);
172
+ return tx.wait();
173
+ }
174
+ async publishIssue(newsletterId, contentHash, preview, endpoint) {
175
+ const tx = await this.agentNewsletter.publishIssue(newsletterId, contentHash, preview, endpoint);
176
+ return tx.wait();
177
+ }
178
+ // ── IntelligenceRegistry ──────────────────────────────────────────────────
179
+ async registerArtifact(params) {
180
+ const p = {
181
+ contentHash: params.contentHash,
182
+ squadId: params.squadId,
183
+ capabilityTag: params.capabilityTag,
184
+ artifactType: params.artifactType,
185
+ endpoint: params.endpoint,
186
+ preview: params.preview,
187
+ trainingDataHash: params.trainingDataHash ?? ethers_1.ethers.ZeroHash,
188
+ baseModel: params.baseModel ?? "",
189
+ evalHash: params.evalHash ?? ethers_1.ethers.ZeroHash,
190
+ parentHash: params.parentHash ?? ethers_1.ethers.ZeroHash,
191
+ revenueShareHash: params.revenueShareHash ?? ethers_1.ethers.ZeroHash,
192
+ revenueSplitAddress: params.revenueSplitAddress ?? ethers_1.ethers.ZeroAddress,
193
+ };
194
+ const tx = await this.intelligenceRegistry.register(p);
195
+ return tx.wait();
196
+ }
197
+ async citeBriefing(contentHash) {
198
+ const tx = await this.intelligenceRegistry.recordCitation(contentHash);
199
+ return tx.wait();
200
+ }
201
+ async getArtifact(contentHash) {
202
+ const raw = await this.intelligenceRegistry.getArtifact(contentHash);
203
+ return {
204
+ contentHash: raw.contentHash,
205
+ creator: raw.creator,
206
+ squadId: BigInt(raw.squadId),
207
+ capabilityTag: raw.capabilityTag,
208
+ artifactType: raw.artifactType,
209
+ endpoint: raw.endpoint,
210
+ preview: raw.preview,
211
+ timestamp: BigInt(raw.timestamp),
212
+ citationCount: BigInt(raw.citationCount),
213
+ weightedCitationCount: BigInt(raw.weightedCitationCount),
214
+ trainingDataHash: raw.trainingDataHash,
215
+ baseModel: raw.baseModel,
216
+ evalHash: raw.evalHash,
217
+ parentHash: raw.parentHash,
218
+ revenueShareHash: raw.revenueShareHash,
219
+ revenueSplitAddress: raw.revenueSplitAddress,
220
+ };
221
+ }
222
+ }
223
+ exports.ArenaClient = ArenaClient;
@@ -0,0 +1,118 @@
1
+ export declare const DEFAULT_DAEMON_HTTP_URL = "http://127.0.0.1:4402";
2
+ export declare const DEFAULT_DAEMON_API_URL = "http://127.0.0.1:4403";
3
+ export declare const DEFAULT_DAEMON_TOKEN_PATH: string;
4
+ export declare const DEFAULT_DAEMON_CONFIG_PATH: string;
5
+ export interface DaemonHealthStatus {
6
+ ok: boolean;
7
+ wallet: string;
8
+ }
9
+ export interface DaemonWalletStatus {
10
+ ok: boolean;
11
+ wallet: string;
12
+ daemonId: string;
13
+ chainId: number;
14
+ rpcUrl: string;
15
+ policyEngineAddress: string;
16
+ }
17
+ export interface DaemonWorkroomStatus {
18
+ ok: boolean;
19
+ status: string;
20
+ }
21
+ export interface DaemonAgreementRecord {
22
+ id: string;
23
+ agreement_id: string | null;
24
+ hirer_address: string;
25
+ capability: string;
26
+ price_eth: string;
27
+ deadline_unix: number;
28
+ spec_hash: string;
29
+ task_description: string | null;
30
+ status: string;
31
+ created_at: number;
32
+ updated_at: number;
33
+ reject_reason: string | null;
34
+ }
35
+ export interface DaemonAgreementsResponse {
36
+ ok: boolean;
37
+ agreements: DaemonAgreementRecord[];
38
+ }
39
+ export interface AuthChallengeResponse {
40
+ challengeId: string;
41
+ challenge: string;
42
+ daemonId: string;
43
+ wallet: string;
44
+ chainId: number;
45
+ scope: string;
46
+ expiresAt: number;
47
+ issuedAt: number;
48
+ }
49
+ export interface AuthSessionResponse {
50
+ ok: true;
51
+ token: string;
52
+ wallets: string[];
53
+ wallet: string;
54
+ scope: string;
55
+ expiresAt: number;
56
+ }
57
+ export interface RevokeSessionsResponse {
58
+ ok: boolean;
59
+ revoked: string;
60
+ }
61
+ export interface DaemonNodeClientOptions {
62
+ /** Split daemon API base URL. Defaults to http://127.0.0.1:4403. */
63
+ apiUrl?: string;
64
+ /** Alias for apiUrl to match older docs/examples. */
65
+ baseUrl?: string;
66
+ /** Local daemon token. Defaults to ~/.arc402/daemon.token when present. */
67
+ token?: string;
68
+ /** Explicit path to daemon.token if you don't want the default. */
69
+ tokenPath?: string;
70
+ /** Explicit path to daemon.toml if you want port inference from a non-default location. */
71
+ configPath?: string;
72
+ /** Custom fetch implementation for testing or non-standard runtimes. */
73
+ fetchImpl?: typeof fetch;
74
+ }
75
+ export declare class DaemonClientError extends Error {
76
+ readonly statusCode?: number;
77
+ readonly details?: unknown;
78
+ constructor(message: string, statusCode?: number, details?: unknown);
79
+ }
80
+ export declare function loadLocalDaemonToken(tokenPath?: string): string | undefined;
81
+ export declare function resolveDaemonHttpBaseUrl(configPath?: string): string;
82
+ export declare function resolveDaemonApiBaseUrl(options?: Pick<DaemonNodeClientOptions, "apiUrl" | "baseUrl" | "configPath">): string;
83
+ /**
84
+ * Thin typed client for the split ARC-402 node API (`arc402-api`).
85
+ *
86
+ * This surface is for operator-side reads and auth against the host daemon/node process:
87
+ * - `/health`
88
+ * - `/auth/challenge`
89
+ * - `/auth/session`
90
+ * - `/auth/revoke`
91
+ * - `/wallet/status`
92
+ * - `/workroom/status`
93
+ * - `/agreements`
94
+ *
95
+ * The delivery plane still lives on the host daemon HTTP port (usually `:4402`)
96
+ * and is wrapped separately by `DeliveryClient`.
97
+ */
98
+ export declare class DaemonNodeClient {
99
+ readonly apiUrl: string;
100
+ private readonly options;
101
+ private readonly fetchImpl;
102
+ constructor(options?: DaemonNodeClientOptions);
103
+ private request;
104
+ getHealth(): Promise<DaemonHealthStatus>;
105
+ requestAuthChallenge(wallet: string, requestedScope?: string): Promise<AuthChallengeResponse>;
106
+ health(): Promise<DaemonHealthStatus>;
107
+ createSession(challengeId: string, signature: string): Promise<AuthSessionResponse>;
108
+ revokeSessions(): Promise<RevokeSessionsResponse>;
109
+ revokeSession(): Promise<RevokeSessionsResponse>;
110
+ getWalletStatus(): Promise<DaemonWalletStatus>;
111
+ walletStatus(): Promise<DaemonWalletStatus>;
112
+ getWorkroomStatus(): Promise<DaemonWorkroomStatus>;
113
+ workroomStatus(): Promise<DaemonWorkroomStatus>;
114
+ listAgreements(): Promise<DaemonAgreementsResponse>;
115
+ agreements(): Promise<DaemonAgreementsResponse>;
116
+ }
117
+ export { DaemonNodeClient as DaemonClient };
118
+ //# sourceMappingURL=daemon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"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"}