@claw-network/node 0.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 (190) hide show
  1. package/README.md +49 -0
  2. package/dist/api/api-key-store.d.ts +74 -0
  3. package/dist/api/api-key-store.d.ts.map +1 -0
  4. package/dist/api/api-key-store.js +170 -0
  5. package/dist/api/api-key-store.js.map +1 -0
  6. package/dist/api/auth.d.ts +30 -0
  7. package/dist/api/auth.d.ts.map +1 -0
  8. package/dist/api/auth.js +115 -0
  9. package/dist/api/auth.js.map +1 -0
  10. package/dist/api/legacy.d.ts +26 -0
  11. package/dist/api/legacy.d.ts.map +1 -0
  12. package/dist/api/legacy.js +281 -0
  13. package/dist/api/legacy.js.map +1 -0
  14. package/dist/api/middleware.d.ts +35 -0
  15. package/dist/api/middleware.d.ts.map +1 -0
  16. package/dist/api/middleware.js +75 -0
  17. package/dist/api/middleware.js.map +1 -0
  18. package/dist/api/response.d.ts +85 -0
  19. package/dist/api/response.d.ts.map +1 -0
  20. package/dist/api/response.js +185 -0
  21. package/dist/api/response.js.map +1 -0
  22. package/dist/api/router.d.ts +45 -0
  23. package/dist/api/router.d.ts.map +1 -0
  24. package/dist/api/router.js +183 -0
  25. package/dist/api/router.js.map +1 -0
  26. package/dist/api/routes/admin.d.ts +11 -0
  27. package/dist/api/routes/admin.d.ts.map +1 -0
  28. package/dist/api/routes/admin.js +124 -0
  29. package/dist/api/routes/admin.js.map +1 -0
  30. package/dist/api/routes/contracts.d.ts +7 -0
  31. package/dist/api/routes/contracts.d.ts.map +1 -0
  32. package/dist/api/routes/contracts.js +665 -0
  33. package/dist/api/routes/contracts.js.map +1 -0
  34. package/dist/api/routes/dao.d.ts +7 -0
  35. package/dist/api/routes/dao.d.ts.map +1 -0
  36. package/dist/api/routes/dao.js +549 -0
  37. package/dist/api/routes/dao.js.map +1 -0
  38. package/dist/api/routes/dev.d.ts +9 -0
  39. package/dist/api/routes/dev.d.ts.map +1 -0
  40. package/dist/api/routes/dev.js +273 -0
  41. package/dist/api/routes/dev.js.map +1 -0
  42. package/dist/api/routes/escrows.d.ts +7 -0
  43. package/dist/api/routes/escrows.d.ts.map +1 -0
  44. package/dist/api/routes/escrows.js +454 -0
  45. package/dist/api/routes/escrows.js.map +1 -0
  46. package/dist/api/routes/identities.d.ts +7 -0
  47. package/dist/api/routes/identities.d.ts.map +1 -0
  48. package/dist/api/routes/identities.js +245 -0
  49. package/dist/api/routes/identities.js.map +1 -0
  50. package/dist/api/routes/markets-capabilities.d.ts +7 -0
  51. package/dist/api/routes/markets-capabilities.d.ts.map +1 -0
  52. package/dist/api/routes/markets-capabilities.js +477 -0
  53. package/dist/api/routes/markets-capabilities.js.map +1 -0
  54. package/dist/api/routes/markets-disputes.d.ts +7 -0
  55. package/dist/api/routes/markets-disputes.d.ts.map +1 -0
  56. package/dist/api/routes/markets-disputes.js +102 -0
  57. package/dist/api/routes/markets-disputes.js.map +1 -0
  58. package/dist/api/routes/markets-info.d.ts +7 -0
  59. package/dist/api/routes/markets-info.d.ts.map +1 -0
  60. package/dist/api/routes/markets-info.js +523 -0
  61. package/dist/api/routes/markets-info.js.map +1 -0
  62. package/dist/api/routes/markets-search.d.ts +7 -0
  63. package/dist/api/routes/markets-search.d.ts.map +1 -0
  64. package/dist/api/routes/markets-search.js +38 -0
  65. package/dist/api/routes/markets-search.js.map +1 -0
  66. package/dist/api/routes/markets-tasks.d.ts +7 -0
  67. package/dist/api/routes/markets-tasks.d.ts.map +1 -0
  68. package/dist/api/routes/markets-tasks.js +539 -0
  69. package/dist/api/routes/markets-tasks.js.map +1 -0
  70. package/dist/api/routes/node.d.ts +7 -0
  71. package/dist/api/routes/node.d.ts.map +1 -0
  72. package/dist/api/routes/node.js +53 -0
  73. package/dist/api/routes/node.js.map +1 -0
  74. package/dist/api/routes/nonce.d.ts +10 -0
  75. package/dist/api/routes/nonce.d.ts.map +1 -0
  76. package/dist/api/routes/nonce.js +65 -0
  77. package/dist/api/routes/nonce.js.map +1 -0
  78. package/dist/api/routes/reputations.d.ts +7 -0
  79. package/dist/api/routes/reputations.d.ts.map +1 -0
  80. package/dist/api/routes/reputations.js +243 -0
  81. package/dist/api/routes/reputations.js.map +1 -0
  82. package/dist/api/routes/transfers.d.ts +7 -0
  83. package/dist/api/routes/transfers.d.ts.map +1 -0
  84. package/dist/api/routes/transfers.js +88 -0
  85. package/dist/api/routes/transfers.js.map +1 -0
  86. package/dist/api/routes/wallets.d.ts +7 -0
  87. package/dist/api/routes/wallets.d.ts.map +1 -0
  88. package/dist/api/routes/wallets.js +132 -0
  89. package/dist/api/routes/wallets.js.map +1 -0
  90. package/dist/api/schemas/common.d.ts +45 -0
  91. package/dist/api/schemas/common.d.ts.map +1 -0
  92. package/dist/api/schemas/common.js +30 -0
  93. package/dist/api/schemas/common.js.map +1 -0
  94. package/dist/api/schemas/contracts.d.ts +284 -0
  95. package/dist/api/schemas/contracts.d.ts.map +1 -0
  96. package/dist/api/schemas/contracts.js +79 -0
  97. package/dist/api/schemas/contracts.js.map +1 -0
  98. package/dist/api/schemas/dao.d.ts +271 -0
  99. package/dist/api/schemas/dao.d.ts.map +1 -0
  100. package/dist/api/schemas/dao.js +78 -0
  101. package/dist/api/schemas/dao.js.map +1 -0
  102. package/dist/api/schemas/identity.d.ts +75 -0
  103. package/dist/api/schemas/identity.d.ts.map +1 -0
  104. package/dist/api/schemas/identity.js +32 -0
  105. package/dist/api/schemas/identity.js.map +1 -0
  106. package/dist/api/schemas/markets.d.ts +822 -0
  107. package/dist/api/schemas/markets.d.ts.map +1 -0
  108. package/dist/api/schemas/markets.js +246 -0
  109. package/dist/api/schemas/markets.js.map +1 -0
  110. package/dist/api/schemas/wallet.d.ts +163 -0
  111. package/dist/api/schemas/wallet.d.ts.map +1 -0
  112. package/dist/api/schemas/wallet.js +54 -0
  113. package/dist/api/schemas/wallet.js.map +1 -0
  114. package/dist/api/server.d.ts +45 -0
  115. package/dist/api/server.d.ts.map +1 -0
  116. package/dist/api/server.js +131 -0
  117. package/dist/api/server.js.map +1 -0
  118. package/dist/api/types.d.ts +69 -0
  119. package/dist/api/types.d.ts.map +1 -0
  120. package/dist/api/types.js +196 -0
  121. package/dist/api/types.js.map +1 -0
  122. package/dist/daemon.d.ts +11 -0
  123. package/dist/daemon.d.ts.map +1 -0
  124. package/dist/daemon.js +248 -0
  125. package/dist/daemon.js.map +1 -0
  126. package/dist/index.d.ts +137 -0
  127. package/dist/index.d.ts.map +1 -0
  128. package/dist/index.js +795 -0
  129. package/dist/index.js.map +1 -0
  130. package/dist/indexer/index.d.ts +10 -0
  131. package/dist/indexer/index.d.ts.map +1 -0
  132. package/dist/indexer/index.js +7 -0
  133. package/dist/indexer/index.js.map +1 -0
  134. package/dist/indexer/indexer.d.ts +60 -0
  135. package/dist/indexer/indexer.d.ts.map +1 -0
  136. package/dist/indexer/indexer.js +408 -0
  137. package/dist/indexer/indexer.js.map +1 -0
  138. package/dist/indexer/query.d.ts +141 -0
  139. package/dist/indexer/query.d.ts.map +1 -0
  140. package/dist/indexer/query.js +244 -0
  141. package/dist/indexer/query.js.map +1 -0
  142. package/dist/indexer/store.d.ts +95 -0
  143. package/dist/indexer/store.d.ts.map +1 -0
  144. package/dist/indexer/store.js +250 -0
  145. package/dist/indexer/store.js.map +1 -0
  146. package/dist/logger.d.ts +13 -0
  147. package/dist/logger.d.ts.map +1 -0
  148. package/dist/logger.js +37 -0
  149. package/dist/logger.js.map +1 -0
  150. package/dist/p2p/sync.d.ts +105 -0
  151. package/dist/p2p/sync.d.ts.map +1 -0
  152. package/dist/p2p/sync.js +875 -0
  153. package/dist/p2p/sync.js.map +1 -0
  154. package/dist/policy/liquidity-policy.d.ts +17 -0
  155. package/dist/policy/liquidity-policy.d.ts.map +1 -0
  156. package/dist/policy/liquidity-policy.js +112 -0
  157. package/dist/policy/liquidity-policy.js.map +1 -0
  158. package/dist/services/chain-config.d.ts +226 -0
  159. package/dist/services/chain-config.d.ts.map +1 -0
  160. package/dist/services/chain-config.js +105 -0
  161. package/dist/services/chain-config.js.map +1 -0
  162. package/dist/services/contract-provider.d.ts +44 -0
  163. package/dist/services/contract-provider.d.ts.map +1 -0
  164. package/dist/services/contract-provider.js +167 -0
  165. package/dist/services/contract-provider.js.map +1 -0
  166. package/dist/services/contracts-service.d.ts +192 -0
  167. package/dist/services/contracts-service.d.ts.map +1 -0
  168. package/dist/services/contracts-service.js +336 -0
  169. package/dist/services/contracts-service.js.map +1 -0
  170. package/dist/services/dao-service.d.ts +245 -0
  171. package/dist/services/dao-service.d.ts.map +1 -0
  172. package/dist/services/dao-service.js +389 -0
  173. package/dist/services/dao-service.js.map +1 -0
  174. package/dist/services/identity-service.d.ts +150 -0
  175. package/dist/services/identity-service.d.ts.map +1 -0
  176. package/dist/services/identity-service.js +286 -0
  177. package/dist/services/identity-service.js.map +1 -0
  178. package/dist/services/index.d.ts +20 -0
  179. package/dist/services/index.d.ts.map +1 -0
  180. package/dist/services/index.js +15 -0
  181. package/dist/services/index.js.map +1 -0
  182. package/dist/services/reputation-service.d.ts +128 -0
  183. package/dist/services/reputation-service.d.ts.map +1 -0
  184. package/dist/services/reputation-service.js +204 -0
  185. package/dist/services/reputation-service.js.map +1 -0
  186. package/dist/services/wallet-service.d.ts +201 -0
  187. package/dist/services/wallet-service.d.ts.map +1 -0
  188. package/dist/services/wallet-service.js +402 -0
  189. package/dist/services/wallet-service.js.map +1 -0
  190. package/package.json +66 -0
@@ -0,0 +1,477 @@
1
+ /**
2
+ * Capability market routes — /api/v1/markets/capabilities
3
+ */
4
+ import { Router } from '../router.js';
5
+ import { ok, created, badRequest, notFound, internalError, paginated, parsePagination, } from '../response.js';
6
+ import { validate, ListingRemoveSchema } from '../schemas/common.js';
7
+ import { CapabilityPublishSchema, CapabilityLeaseSchema, CapabilityLeaseActionSchema, CapabilityInvokeSchema, } from '../schemas/markets.js';
8
+ import { resolvePrivateKey } from '../types.js';
9
+ import { createCapabilityListingPublishEnvelope, createMarketCapabilityLeaseStartEnvelope, createMarketCapabilityInvokeEnvelope, createMarketCapabilityLeasePauseEnvelope, createMarketCapabilityLeaseResumeEnvelope, createMarketCapabilityLeaseTerminateEnvelope, createMarketListingRemoveEnvelope, } from '@claw-network/protocol';
10
+ export function marketsCapabilityRoutes(ctx) {
11
+ const r = new Router();
12
+ // ── POST / — publish capability listing ───────────────────────
13
+ r.post('/', async (_req, res, route) => {
14
+ const v = validate(CapabilityPublishSchema, route.body);
15
+ if (!v.success) {
16
+ badRequest(res, v.error, route.url.pathname);
17
+ return;
18
+ }
19
+ const body = v.data;
20
+ const listingId = body.listingId ?? `cap-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
21
+ const privateKey = await resolvePrivateKey(ctx.config.dataDir, body.did, body.passphrase);
22
+ if (!privateKey) {
23
+ badRequest(res, 'Key unavailable', route.url.pathname);
24
+ return;
25
+ }
26
+ try {
27
+ const envelope = await createCapabilityListingPublishEnvelope({
28
+ issuer: body.did,
29
+ privateKey,
30
+ listingId,
31
+ title: body.title,
32
+ description: body.description,
33
+ category: body.category,
34
+ tags: (body.tags ?? []),
35
+ pricing: body.pricing,
36
+ visibility: (body.visibility ?? 'public'),
37
+ marketData: {
38
+ capabilityType: body.capabilityType,
39
+ capability: body.capability,
40
+ performance: body.performance,
41
+ quota: body.quota,
42
+ access: body.access,
43
+ sla: body.sla,
44
+ },
45
+ restrictions: body.restrictions,
46
+ metadata: body.metadata,
47
+ expiresAt: body.expiresAt,
48
+ status: body.status,
49
+ ts: body.ts ?? Date.now(),
50
+ nonce: body.nonce,
51
+ prev: body.prev,
52
+ });
53
+ const hash = await ctx.publishEvent(envelope);
54
+ created(res, { listingId, txHash: hash }, { self: `/api/v1/markets/capabilities/${listingId}` });
55
+ }
56
+ catch (err) {
57
+ internalError(res, err.message || 'Capability listing publish failed');
58
+ }
59
+ });
60
+ // ── GET / — list capability listings ──────────────────────────
61
+ r.get('/', async (_req, res, route) => {
62
+ const { page, perPage } = parsePagination(route.query);
63
+ if (ctx.searchMarkets) {
64
+ try {
65
+ const result = ctx.searchMarkets({
66
+ markets: ['capability'],
67
+ page,
68
+ pageSize: perPage,
69
+ keyword: route.query.get('keyword') ?? undefined,
70
+ category: route.query.get('category') ?? undefined,
71
+ });
72
+ const r2 = result;
73
+ paginated(res, (r2.listings ?? []), {
74
+ page,
75
+ perPage,
76
+ total: (r2.total ?? 0),
77
+ basePath: '/api/v1/markets/capabilities',
78
+ });
79
+ return;
80
+ }
81
+ catch {
82
+ /* fallthrough */
83
+ }
84
+ }
85
+ paginated(res, [], { page, perPage, total: 0, basePath: '/api/v1/markets/capabilities' });
86
+ });
87
+ // ── GET /:id — single capability listing ──────────────────────
88
+ r.get('/:id', async (_req, res, route) => {
89
+ const { id } = route.params;
90
+ if (ctx.marketStore) {
91
+ try {
92
+ const listing = await ctx.marketStore.getListing?.(id);
93
+ if (listing) {
94
+ ok(res, listing, { self: `/api/v1/markets/capabilities/${id}` });
95
+ return;
96
+ }
97
+ }
98
+ catch {
99
+ /* fallthrough */
100
+ }
101
+ }
102
+ notFound(res, `Capability listing ${id} not found`);
103
+ });
104
+ // ── DELETE /:id — remove capability listing ───────────────────
105
+ r.delete('/:id', async (_req, res, route) => {
106
+ const { id } = route.params;
107
+ const v = validate(ListingRemoveSchema, route.body);
108
+ if (!v.success) {
109
+ badRequest(res, v.error, route.url.pathname);
110
+ return;
111
+ }
112
+ const body = v.data;
113
+ const privateKey = await resolvePrivateKey(ctx.config.dataDir, body.did, body.passphrase);
114
+ if (!privateKey) {
115
+ badRequest(res, 'Key unavailable', route.url.pathname);
116
+ return;
117
+ }
118
+ try {
119
+ const envelope = await createMarketListingRemoveEnvelope({
120
+ issuer: body.did,
121
+ privateKey,
122
+ listingId: id,
123
+ resourcePrev: body.prev ?? '',
124
+ ts: body.ts ?? Date.now(),
125
+ nonce: body.nonce,
126
+ prev: body.prev,
127
+ });
128
+ const hash = await ctx.publishEvent(envelope);
129
+ ok(res, { listingId: id, txHash: hash }, { self: `/api/v1/markets/capabilities/${id}` });
130
+ }
131
+ catch (err) {
132
+ internalError(res, err.message || 'Capability listing remove failed');
133
+ }
134
+ });
135
+ // ── POST /:id/actions/remove — compatibility alias ────────────
136
+ r.post('/:id/actions/remove', async (_req, res, route) => {
137
+ const { id } = route.params;
138
+ const v = validate(ListingRemoveSchema, route.body);
139
+ if (!v.success) {
140
+ badRequest(res, v.error, route.url.pathname);
141
+ return;
142
+ }
143
+ const body = v.data;
144
+ const privateKey = await resolvePrivateKey(ctx.config.dataDir, body.did, body.passphrase);
145
+ if (!privateKey) {
146
+ badRequest(res, 'Key unavailable', route.url.pathname);
147
+ return;
148
+ }
149
+ try {
150
+ const envelope = await createMarketListingRemoveEnvelope({
151
+ issuer: body.did,
152
+ privateKey,
153
+ listingId: id,
154
+ resourcePrev: body.prev ?? '',
155
+ ts: body.ts ?? Date.now(),
156
+ nonce: body.nonce,
157
+ prev: body.prev,
158
+ });
159
+ const hash = await ctx.publishEvent(envelope);
160
+ ok(res, { listingId: id, txHash: hash }, { self: `/api/v1/markets/capabilities/${id}` });
161
+ }
162
+ catch (err) {
163
+ internalError(res, err.message || 'Capability listing remove failed');
164
+ }
165
+ });
166
+ // ── POST /:id/leases — start lease ────────────────────────────
167
+ r.post('/:id/leases', async (_req, res, route) => {
168
+ const { id } = route.params;
169
+ const v = validate(CapabilityLeaseSchema, route.body);
170
+ if (!v.success) {
171
+ badRequest(res, v.error, route.url.pathname);
172
+ return;
173
+ }
174
+ const body = v.data;
175
+ const privateKey = await resolvePrivateKey(ctx.config.dataDir, body.did, body.passphrase);
176
+ if (!privateKey) {
177
+ badRequest(res, 'Key unavailable', route.url.pathname);
178
+ return;
179
+ }
180
+ try {
181
+ const leaseId = body.leaseId ?? `lease-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
182
+ const envelope = await createMarketCapabilityLeaseStartEnvelope({
183
+ issuer: body.did,
184
+ privateKey,
185
+ listingId: id,
186
+ leaseId,
187
+ plan: body.plan,
188
+ credentials: body.credentials,
189
+ metadata: body.metadata,
190
+ expiresAt: body.expiresAt,
191
+ resourcePrev: body.resourcePrev,
192
+ ts: body.ts ?? Date.now(),
193
+ nonce: body.nonce,
194
+ prev: body.prev,
195
+ });
196
+ const hash = await ctx.publishEvent(envelope);
197
+ created(res, { leaseId, txHash: hash, credentials: body.credentials }, { self: `/api/v1/markets/capabilities/${id}/leases/${leaseId}` });
198
+ }
199
+ catch (err) {
200
+ internalError(res, err.message || 'Lease start failed');
201
+ }
202
+ });
203
+ // ── GET /:id/leases — list leases for capability ──────────────
204
+ r.get('/:id/leases', async (_req, res, route) => {
205
+ const { id } = route.params;
206
+ // MarketSearchStore does not index leases — return empty list
207
+ ok(res, [], { self: `/api/v1/markets/capabilities/${id}/leases` });
208
+ });
209
+ // ── POST /:id/leases/:leaseId/actions/invoke ──────────────────
210
+ r.post('/:id/leases/:leaseId/actions/invoke', async (_req, res, route) => {
211
+ const { id, leaseId } = route.params;
212
+ const v = validate(CapabilityInvokeSchema, route.body);
213
+ if (!v.success) {
214
+ badRequest(res, v.error, route.url.pathname);
215
+ return;
216
+ }
217
+ const body = v.data;
218
+ const privateKey = await resolvePrivateKey(ctx.config.dataDir, body.did, body.passphrase);
219
+ if (!privateKey) {
220
+ badRequest(res, 'Key unavailable', route.url.pathname);
221
+ return;
222
+ }
223
+ try {
224
+ const envelope = await createMarketCapabilityInvokeEnvelope({
225
+ issuer: body.did,
226
+ privateKey,
227
+ leaseId,
228
+ resource: body.resource,
229
+ units: body.units,
230
+ latency: body.latency,
231
+ success: body.success,
232
+ cost: body.cost != null ? String(body.cost) : undefined,
233
+ ts: body.ts ?? Date.now(),
234
+ nonce: body.nonce,
235
+ prev: body.prev,
236
+ });
237
+ const hash = await ctx.publishEvent(envelope);
238
+ ok(res, {
239
+ leaseId,
240
+ txHash: hash,
241
+ usage: {
242
+ resource: body.resource,
243
+ units: body.units,
244
+ latency: body.latency,
245
+ success: body.success,
246
+ },
247
+ }, { self: `/api/v1/markets/capabilities/${id}/leases/${leaseId}` });
248
+ }
249
+ catch (err) {
250
+ internalError(res, err.message || 'Capability invoke failed');
251
+ }
252
+ });
253
+ // ── POST /:id/leases/:leaseId/actions/pause ───────────────────
254
+ r.post('/:id/leases/:leaseId/actions/pause', async (_req, res, route) => {
255
+ const { id, leaseId } = route.params;
256
+ const v = validate(CapabilityLeaseActionSchema, route.body);
257
+ if (!v.success) {
258
+ badRequest(res, v.error, route.url.pathname);
259
+ return;
260
+ }
261
+ const body = v.data;
262
+ const privateKey = await resolvePrivateKey(ctx.config.dataDir, body.did, body.passphrase);
263
+ if (!privateKey) {
264
+ badRequest(res, 'Key unavailable', route.url.pathname);
265
+ return;
266
+ }
267
+ try {
268
+ const envelope = await createMarketCapabilityLeasePauseEnvelope({
269
+ issuer: body.did,
270
+ privateKey,
271
+ leaseId,
272
+ resourcePrev: body.prev ?? '',
273
+ ts: body.ts ?? Date.now(),
274
+ nonce: body.nonce,
275
+ prev: body.prev,
276
+ });
277
+ const hash = await ctx.publishEvent(envelope);
278
+ ok(res, { leaseId, txHash: hash, action: 'pause' }, { self: `/api/v1/markets/capabilities/${id}/leases/${leaseId}` });
279
+ }
280
+ catch (err) {
281
+ internalError(res, err.message || 'Lease pause failed');
282
+ }
283
+ });
284
+ // ── POST /:id/leases/:leaseId/actions/resume ──────────────────
285
+ r.post('/:id/leases/:leaseId/actions/resume', async (_req, res, route) => {
286
+ const { id, leaseId } = route.params;
287
+ const v = validate(CapabilityLeaseActionSchema, route.body);
288
+ if (!v.success) {
289
+ badRequest(res, v.error, route.url.pathname);
290
+ return;
291
+ }
292
+ const body = v.data;
293
+ const privateKey = await resolvePrivateKey(ctx.config.dataDir, body.did, body.passphrase);
294
+ if (!privateKey) {
295
+ badRequest(res, 'Key unavailable', route.url.pathname);
296
+ return;
297
+ }
298
+ try {
299
+ const envelope = await createMarketCapabilityLeaseResumeEnvelope({
300
+ issuer: body.did,
301
+ privateKey,
302
+ leaseId,
303
+ resourcePrev: body.prev ?? '',
304
+ ts: body.ts ?? Date.now(),
305
+ nonce: body.nonce,
306
+ prev: body.prev,
307
+ });
308
+ const hash = await ctx.publishEvent(envelope);
309
+ ok(res, { leaseId, txHash: hash, action: 'resume' }, { self: `/api/v1/markets/capabilities/${id}/leases/${leaseId}` });
310
+ }
311
+ catch (err) {
312
+ internalError(res, err.message || 'Lease resume failed');
313
+ }
314
+ });
315
+ // ── POST /:id/leases/:leaseId/actions/terminate ───────────────
316
+ r.post('/:id/leases/:leaseId/actions/terminate', async (_req, res, route) => {
317
+ const { id, leaseId } = route.params;
318
+ const v = validate(CapabilityLeaseActionSchema, route.body);
319
+ if (!v.success) {
320
+ badRequest(res, v.error, route.url.pathname);
321
+ return;
322
+ }
323
+ const body = v.data;
324
+ const privateKey = await resolvePrivateKey(ctx.config.dataDir, body.did, body.passphrase);
325
+ if (!privateKey) {
326
+ badRequest(res, 'Key unavailable', route.url.pathname);
327
+ return;
328
+ }
329
+ try {
330
+ const envelope = await createMarketCapabilityLeaseTerminateEnvelope({
331
+ issuer: body.did,
332
+ privateKey,
333
+ leaseId,
334
+ resourcePrev: body.prev ?? '',
335
+ ts: body.ts ?? Date.now(),
336
+ nonce: body.nonce,
337
+ prev: body.prev,
338
+ });
339
+ const hash = await ctx.publishEvent(envelope);
340
+ ok(res, { leaseId, txHash: hash, action: 'terminate' }, { self: `/api/v1/markets/capabilities/${id}/leases/${leaseId}` });
341
+ }
342
+ catch (err) {
343
+ internalError(res, err.message || 'Lease terminate failed');
344
+ }
345
+ });
346
+ // ── Lease endpoints without listingId in path ──────────────────
347
+ r.get('/leases/:leaseId', async (_req, res, route) => {
348
+ const { leaseId } = route.params;
349
+ ok(res, { leaseId }, { self: `/api/v1/markets/capabilities/leases/${leaseId}` });
350
+ });
351
+ r.post('/leases/:leaseId/actions/invoke', async (_req, res, route) => {
352
+ const { leaseId } = route.params;
353
+ const v = validate(CapabilityInvokeSchema, route.body);
354
+ if (!v.success) {
355
+ badRequest(res, v.error, route.url.pathname);
356
+ return;
357
+ }
358
+ const body = v.data;
359
+ const privateKey = await resolvePrivateKey(ctx.config.dataDir, body.did, body.passphrase);
360
+ if (!privateKey) {
361
+ badRequest(res, 'Key unavailable', route.url.pathname);
362
+ return;
363
+ }
364
+ try {
365
+ const envelope = await createMarketCapabilityInvokeEnvelope({
366
+ issuer: body.did,
367
+ privateKey,
368
+ leaseId,
369
+ resource: body.resource,
370
+ units: body.units,
371
+ latency: body.latency,
372
+ success: body.success,
373
+ cost: body.cost != null ? String(body.cost) : undefined,
374
+ ts: body.ts ?? Date.now(),
375
+ nonce: body.nonce,
376
+ prev: body.prev,
377
+ });
378
+ const hash = await ctx.publishEvent(envelope);
379
+ ok(res, { leaseId, txHash: hash }, { self: `/api/v1/markets/capabilities/leases/${leaseId}` });
380
+ }
381
+ catch (err) {
382
+ internalError(res, err.message || 'Capability invoke failed');
383
+ }
384
+ });
385
+ r.post('/leases/:leaseId/actions/pause', async (_req, res, route) => {
386
+ const { leaseId } = route.params;
387
+ const v = validate(CapabilityLeaseActionSchema, route.body);
388
+ if (!v.success) {
389
+ badRequest(res, v.error, route.url.pathname);
390
+ return;
391
+ }
392
+ const body = v.data;
393
+ const privateKey = await resolvePrivateKey(ctx.config.dataDir, body.did, body.passphrase);
394
+ if (!privateKey) {
395
+ badRequest(res, 'Key unavailable', route.url.pathname);
396
+ return;
397
+ }
398
+ try {
399
+ const envelope = await createMarketCapabilityLeasePauseEnvelope({
400
+ issuer: body.did,
401
+ privateKey,
402
+ leaseId,
403
+ resourcePrev: body.prev ?? '',
404
+ ts: body.ts ?? Date.now(),
405
+ nonce: body.nonce,
406
+ prev: body.prev,
407
+ });
408
+ const hash = await ctx.publishEvent(envelope);
409
+ ok(res, { leaseId, txHash: hash, action: 'pause' }, { self: `/api/v1/markets/capabilities/leases/${leaseId}` });
410
+ }
411
+ catch (err) {
412
+ internalError(res, err.message || 'Lease pause failed');
413
+ }
414
+ });
415
+ r.post('/leases/:leaseId/actions/resume', async (_req, res, route) => {
416
+ const { leaseId } = route.params;
417
+ const v = validate(CapabilityLeaseActionSchema, route.body);
418
+ if (!v.success) {
419
+ badRequest(res, v.error, route.url.pathname);
420
+ return;
421
+ }
422
+ const body = v.data;
423
+ const privateKey = await resolvePrivateKey(ctx.config.dataDir, body.did, body.passphrase);
424
+ if (!privateKey) {
425
+ badRequest(res, 'Key unavailable', route.url.pathname);
426
+ return;
427
+ }
428
+ try {
429
+ const envelope = await createMarketCapabilityLeaseResumeEnvelope({
430
+ issuer: body.did,
431
+ privateKey,
432
+ leaseId,
433
+ resourcePrev: body.prev ?? '',
434
+ ts: body.ts ?? Date.now(),
435
+ nonce: body.nonce,
436
+ prev: body.prev,
437
+ });
438
+ const hash = await ctx.publishEvent(envelope);
439
+ ok(res, { leaseId, txHash: hash, action: 'resume' }, { self: `/api/v1/markets/capabilities/leases/${leaseId}` });
440
+ }
441
+ catch (err) {
442
+ internalError(res, err.message || 'Lease resume failed');
443
+ }
444
+ });
445
+ r.post('/leases/:leaseId/actions/terminate', async (_req, res, route) => {
446
+ const { leaseId } = route.params;
447
+ const v = validate(CapabilityLeaseActionSchema, route.body);
448
+ if (!v.success) {
449
+ badRequest(res, v.error, route.url.pathname);
450
+ return;
451
+ }
452
+ const body = v.data;
453
+ const privateKey = await resolvePrivateKey(ctx.config.dataDir, body.did, body.passphrase);
454
+ if (!privateKey) {
455
+ badRequest(res, 'Key unavailable', route.url.pathname);
456
+ return;
457
+ }
458
+ try {
459
+ const envelope = await createMarketCapabilityLeaseTerminateEnvelope({
460
+ issuer: body.did,
461
+ privateKey,
462
+ leaseId,
463
+ resourcePrev: body.prev ?? '',
464
+ ts: body.ts ?? Date.now(),
465
+ nonce: body.nonce,
466
+ prev: body.prev,
467
+ });
468
+ const hash = await ctx.publishEvent(envelope);
469
+ ok(res, { leaseId, txHash: hash, action: 'terminate' }, { self: `/api/v1/markets/capabilities/leases/${leaseId}` });
470
+ }
471
+ catch (err) {
472
+ internalError(res, err.message || 'Lease terminate failed');
473
+ }
474
+ });
475
+ return r;
476
+ }
477
+ //# sourceMappingURL=markets-capabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markets-capabilities.js","sourceRoot":"","sources":["../../../src/api/routes/markets-capabilities.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Market dispute routes — /api/v1/markets/disputes
3
+ */
4
+ import { Router } from '../router.js';
5
+ import type { RuntimeContext } from '../types.js';
6
+ export declare function marketsDisputeRoutes(ctx: RuntimeContext): Router;
7
+ //# sourceMappingURL=markets-disputes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markets-disputes.d.ts","sourceRoot":"","sources":["../../../src/api/routes/markets-disputes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAQtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAQlD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,CAyEhE"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Market dispute routes — /api/v1/markets/disputes
3
+ */
4
+ import { Router } from '../router.js';
5
+ import { ok, created, badRequest, internalError, } from '../response.js';
6
+ import { validate } from '../schemas/common.js';
7
+ import { DisputeOpenSchema, DisputeResponseSchema, DisputeResolveSchema, } from '../schemas/markets.js';
8
+ import { resolvePrivateKey } from '../types.js';
9
+ import { createMarketDisputeOpenEnvelope, createMarketDisputeResponseEnvelope, createMarketDisputeResolveEnvelope, } from '@claw-network/protocol';
10
+ export function marketsDisputeRoutes(ctx) {
11
+ const r = new Router();
12
+ // ── POST / — open dispute on an order ─────────────────────────
13
+ r.post('/', async (_req, res, route) => {
14
+ const v = validate(DisputeOpenSchema, route.body);
15
+ if (!v.success) {
16
+ badRequest(res, v.error, route.url.pathname);
17
+ return;
18
+ }
19
+ const body = v.data;
20
+ const disputeId = body.disputeId ?? `dispute-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
21
+ const privateKey = await resolvePrivateKey(ctx.config.dataDir, body.did, body.passphrase);
22
+ if (!privateKey) {
23
+ badRequest(res, 'Key unavailable', route.url.pathname);
24
+ return;
25
+ }
26
+ try {
27
+ const envelope = await createMarketDisputeOpenEnvelope({
28
+ issuer: body.did, privateKey, disputeId,
29
+ orderId: body.orderId ?? '',
30
+ type: body.type, description: body.description,
31
+ claimAmount: body.claimAmount != null ? String(body.claimAmount) : undefined,
32
+ ts: body.ts ?? Date.now(), nonce: body.nonce, prev: body.prev,
33
+ });
34
+ const hash = await ctx.publishEvent(envelope);
35
+ created(res, {
36
+ disputeId, txHash: hash, type: body.type,
37
+ status: 'open', createdAt: body.ts ?? Date.now(),
38
+ }, { self: `/api/v1/markets/disputes/${disputeId}` });
39
+ }
40
+ catch (err) {
41
+ internalError(res, err.message || 'Dispute open failed');
42
+ }
43
+ });
44
+ // ── POST /:id/actions/respond — respond to dispute ────────────
45
+ r.post('/:id/actions/respond', async (_req, res, route) => {
46
+ const { id } = route.params;
47
+ const v = validate(DisputeResponseSchema, route.body);
48
+ if (!v.success) {
49
+ badRequest(res, v.error, route.url.pathname);
50
+ return;
51
+ }
52
+ const body = v.data;
53
+ const privateKey = await resolvePrivateKey(ctx.config.dataDir, body.did, body.passphrase);
54
+ if (!privateKey) {
55
+ badRequest(res, 'Key unavailable', route.url.pathname);
56
+ return;
57
+ }
58
+ try {
59
+ const envelope = await createMarketDisputeResponseEnvelope({
60
+ issuer: body.did, privateKey, disputeId: id,
61
+ resourcePrev: body.prev ?? '',
62
+ response: body.response, evidence: body.evidence,
63
+ ts: body.ts ?? Date.now(), nonce: body.nonce, prev: body.prev,
64
+ });
65
+ const hash = await ctx.publishEvent(envelope);
66
+ ok(res, { disputeId: id, txHash: hash, status: 'responded' }, { self: `/api/v1/markets/disputes/${id}` });
67
+ }
68
+ catch (err) {
69
+ internalError(res, err.message || 'Dispute response failed');
70
+ }
71
+ });
72
+ // ── POST /:id/actions/resolve — resolve dispute ───────────────
73
+ r.post('/:id/actions/resolve', async (_req, res, route) => {
74
+ const { id } = route.params;
75
+ const v = validate(DisputeResolveSchema, route.body);
76
+ if (!v.success) {
77
+ badRequest(res, v.error, route.url.pathname);
78
+ return;
79
+ }
80
+ const body = v.data;
81
+ const privateKey = await resolvePrivateKey(ctx.config.dataDir, body.did, body.passphrase);
82
+ if (!privateKey) {
83
+ badRequest(res, 'Key unavailable', route.url.pathname);
84
+ return;
85
+ }
86
+ try {
87
+ const envelope = await createMarketDisputeResolveEnvelope({
88
+ issuer: body.did, privateKey, disputeId: id,
89
+ resourcePrev: body.prev ?? '',
90
+ resolution: body.resolution, notes: body.notes,
91
+ ts: body.ts ?? Date.now(), nonce: body.nonce, prev: body.prev,
92
+ });
93
+ const hash = await ctx.publishEvent(envelope);
94
+ ok(res, { disputeId: id, txHash: hash, resolution: body.resolution, status: 'resolved' }, { self: `/api/v1/markets/disputes/${id}` });
95
+ }
96
+ catch (err) {
97
+ internalError(res, err.message || 'Dispute resolve failed');
98
+ }
99
+ });
100
+ return r;
101
+ }
102
+ //# sourceMappingURL=markets-disputes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markets-disputes.js","sourceRoot":"","sources":["../../../src/api/routes/markets-disputes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Info market routes — /api/v1/markets/info
3
+ */
4
+ import { Router } from '../router.js';
5
+ import type { RuntimeContext } from '../types.js';
6
+ export declare function marketsInfoRoutes(ctx: RuntimeContext): Router;
7
+ //# sourceMappingURL=markets-info.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markets-info.d.ts","sourceRoot":"","sources":["../../../src/api/routes/markets-info.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAoBtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAiBlD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,CAyjB7D"}