@stamn/sdk 0.1.0-alpha.1 → 0.1.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +32 -1
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -122,6 +122,29 @@ interface LeaderboardEntry {
|
|
|
122
122
|
interface HealthCheckResult {
|
|
123
123
|
ok: boolean;
|
|
124
124
|
}
|
|
125
|
+
interface ServiceListing {
|
|
126
|
+
id: string;
|
|
127
|
+
participantId: string;
|
|
128
|
+
serviceTag: string;
|
|
129
|
+
name: string;
|
|
130
|
+
description: string;
|
|
131
|
+
priceCents: number;
|
|
132
|
+
isActive: boolean;
|
|
133
|
+
createdAt: string;
|
|
134
|
+
updatedAt: string;
|
|
135
|
+
}
|
|
136
|
+
interface CreateServiceListingOptions {
|
|
137
|
+
serviceTag: string;
|
|
138
|
+
name: string;
|
|
139
|
+
description: string;
|
|
140
|
+
priceCents: number;
|
|
141
|
+
}
|
|
142
|
+
interface UpdateServiceListingOptions {
|
|
143
|
+
name?: string;
|
|
144
|
+
description?: string;
|
|
145
|
+
priceCents?: number;
|
|
146
|
+
isActive?: boolean;
|
|
147
|
+
}
|
|
125
148
|
|
|
126
149
|
declare abstract class Resource {
|
|
127
150
|
protected readonly client: Requestable;
|
|
@@ -184,6 +207,13 @@ declare class HealthResource extends Resource {
|
|
|
184
207
|
check(): Promise<HealthCheckResult>;
|
|
185
208
|
}
|
|
186
209
|
|
|
210
|
+
declare class ServicesResource extends Resource {
|
|
211
|
+
list(participantId: string): Promise<ServiceListing[]>;
|
|
212
|
+
create(participantId: string, options: CreateServiceListingOptions): Promise<ServiceListing>;
|
|
213
|
+
update(participantId: string, serviceId: string, options: UpdateServiceListingOptions): Promise<ServiceListing>;
|
|
214
|
+
delete(participantId: string, serviceId: string): Promise<void>;
|
|
215
|
+
}
|
|
216
|
+
|
|
187
217
|
declare class StamnApiError extends Error {
|
|
188
218
|
readonly status: number;
|
|
189
219
|
constructor(message: string, status: number);
|
|
@@ -199,6 +229,7 @@ declare class StamnClient implements Requestable {
|
|
|
199
229
|
readonly directory: DirectoryResource;
|
|
200
230
|
readonly leaderboard: LeaderboardResource;
|
|
201
231
|
readonly health: HealthResource;
|
|
232
|
+
readonly services: ServicesResource;
|
|
202
233
|
constructor(options?: StamnClientOptions);
|
|
203
234
|
setApiKey(apiKey: string): void;
|
|
204
235
|
request<T>(method: string, path: string, body?: unknown): Promise<T>;
|
|
@@ -209,4 +240,4 @@ declare class StamnClient implements Requestable {
|
|
|
209
240
|
private parseErrorResponse;
|
|
210
241
|
}
|
|
211
242
|
|
|
212
|
-
export { type ApiKeyCreateResponse, type ApiKeySummary, ApiKeysResource, AuthResource, type BalanceResponse, type DeviceFlowData, type DeviceFlowStatus, type DirectoryEntry, DirectoryResource, type DirectoryResponse, type DirectoryServiceEntry, type HealthCheckResult, HealthResource, type LeaderboardEntry, LeaderboardResource, type LedgerEntry, type OnchainBalanceResponse, type Participant, type ParticipantSettings, ParticipantsResource, type Requestable, Resource, type RetryOptions, StamnApiError, StamnClient, type StamnClientOptions };
|
|
243
|
+
export { type ApiKeyCreateResponse, type ApiKeySummary, ApiKeysResource, AuthResource, type BalanceResponse, type CreateServiceListingOptions, type DeviceFlowData, type DeviceFlowStatus, type DirectoryEntry, DirectoryResource, type DirectoryResponse, type DirectoryServiceEntry, type HealthCheckResult, HealthResource, type LeaderboardEntry, LeaderboardResource, type LedgerEntry, type OnchainBalanceResponse, type Participant, type ParticipantSettings, ParticipantsResource, type Requestable, Resource, type RetryOptions, type ServiceListing, ServicesResource, StamnApiError, StamnClient, type StamnClientOptions, type UpdateServiceListingOptions };
|
package/dist/index.js
CHANGED
|
@@ -186,6 +186,39 @@ var HealthResource = class extends Resource {
|
|
|
186
186
|
}
|
|
187
187
|
};
|
|
188
188
|
|
|
189
|
+
// src/resources/services.ts
|
|
190
|
+
var ServicesResource = class extends Resource {
|
|
191
|
+
async list(participantId) {
|
|
192
|
+
const res = await this.client.request(
|
|
193
|
+
"GET",
|
|
194
|
+
`/v1/participants/${participantId}/services`
|
|
195
|
+
);
|
|
196
|
+
return res.data;
|
|
197
|
+
}
|
|
198
|
+
async create(participantId, options) {
|
|
199
|
+
const res = await this.client.request(
|
|
200
|
+
"POST",
|
|
201
|
+
`/v1/participants/${participantId}/services`,
|
|
202
|
+
options
|
|
203
|
+
);
|
|
204
|
+
return res.data;
|
|
205
|
+
}
|
|
206
|
+
async update(participantId, serviceId, options) {
|
|
207
|
+
const res = await this.client.request(
|
|
208
|
+
"PATCH",
|
|
209
|
+
`/v1/participants/${participantId}/services/${serviceId}`,
|
|
210
|
+
options
|
|
211
|
+
);
|
|
212
|
+
return res.data;
|
|
213
|
+
}
|
|
214
|
+
async delete(participantId, serviceId) {
|
|
215
|
+
await this.client.request(
|
|
216
|
+
"DELETE",
|
|
217
|
+
`/v1/participants/${participantId}/services/${serviceId}`
|
|
218
|
+
);
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
|
|
189
222
|
// src/client.ts
|
|
190
223
|
var StamnApiError = class extends Error {
|
|
191
224
|
constructor(message, status) {
|
|
@@ -212,6 +245,7 @@ var StamnClient = class {
|
|
|
212
245
|
directory;
|
|
213
246
|
leaderboard;
|
|
214
247
|
health;
|
|
248
|
+
services;
|
|
215
249
|
constructor(options = {}) {
|
|
216
250
|
this.apiKey = options.apiKey;
|
|
217
251
|
this.retryOptions = { ...DEFAULT_RETRY, ...options.retry };
|
|
@@ -222,6 +256,7 @@ var StamnClient = class {
|
|
|
222
256
|
this.directory = new DirectoryResource(this);
|
|
223
257
|
this.leaderboard = new LeaderboardResource(this);
|
|
224
258
|
this.health = new HealthResource(this);
|
|
259
|
+
this.services = new ServicesResource(this);
|
|
225
260
|
}
|
|
226
261
|
setApiKey(apiKey) {
|
|
227
262
|
this.apiKey = apiKey;
|
|
@@ -297,6 +332,7 @@ export {
|
|
|
297
332
|
LeaderboardResource,
|
|
298
333
|
ParticipantsResource,
|
|
299
334
|
Resource,
|
|
335
|
+
ServicesResource,
|
|
300
336
|
StamnApiError,
|
|
301
337
|
StamnClient
|
|
302
338
|
};
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/resources/base.ts","../src/resources/auth.ts","../src/resources/agents.ts","../src/resources/participants.ts","../src/resources/api-keys.ts","../src/resources/directory.ts","../src/resources/leaderboard.ts","../src/resources/health.ts","../src/client.ts"],"sourcesContent":["import type { Requestable } from '@/types';\n\nexport abstract class Resource {\n constructor(protected readonly client: Requestable) {}\n}\n","import { Resource } from '@/resources/base';\nimport type { DeviceFlowData, DeviceFlowStatus } from '@/types';\n\nconst DEFAULT_POLL_INTERVAL_MS = 5_000;\nconst DEFAULT_TIMEOUT_MS = 300_000; // 5 minutes\n\nexport class AuthResource extends Resource {\n\n async initiateDeviceFlow(): Promise<DeviceFlowData> {\n const res = await this.client.request<{ data: DeviceFlowData }>(\n 'POST',\n '/v1/auth/device-codes',\n );\n return res.data;\n }\n\n async getDeviceFlowStatus(deviceCode: string): Promise<DeviceFlowStatus> {\n const res = await this.client.request<{ data: DeviceFlowStatus }>(\n 'GET',\n `/v1/auth/device-codes/${deviceCode}`,\n );\n return res.data;\n }\n\n async pollForApproval(\n deviceCode: string,\n options?: { pollIntervalMs?: number; timeoutMs?: number },\n ): Promise<string> {\n const pollInterval = options?.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n const timeout = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const deadline = Date.now() + timeout;\n\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, pollInterval));\n\n try {\n const status = await this.getDeviceFlowStatus(deviceCode);\n\n if (status.status === 'approved' && status.apiKey) {\n return status.apiKey;\n }\n\n if (status.status === 'expired') {\n throw new Error('Login code expired. Try again.');\n }\n } catch (err) {\n if ((err as Error).message.includes('expired')) throw err;\n }\n }\n\n throw new Error('Login timed out. Try again.');\n }\n}\n","import { Resource } from '@/resources/base';\nimport type { Participant } from '@/types';\n\nexport class AgentsResource extends Resource {\n\n async create(options?: { name?: string; description?: string }): Promise<Participant> {\n const res = await this.client.request<{ data: Participant }>(\n 'POST',\n '/v1/participants',\n {\n name: options?.name,\n description: options?.description,\n },\n );\n return res.data;\n }\n}\n","import { Resource } from '@/resources/base';\nimport type {\n Participant,\n ParticipantSettings,\n BalanceResponse,\n OnchainBalanceResponse,\n LedgerEntry,\n} from '@/types';\n\nexport class ParticipantsResource extends Resource {\n\n async create(options?: { name?: string; description?: string }): Promise<Participant> {\n const res = await this.client.request<{ data: Participant }>(\n 'POST',\n '/v1/participants',\n {\n name: options?.name || undefined,\n description: options?.description || undefined,\n },\n );\n return res.data;\n }\n\n async list(): Promise<Participant[]> {\n const res = await this.client.request<{ data: Participant[] }>(\n 'GET',\n '/v1/participants',\n );\n return res.data;\n }\n\n async get(participantId: string): Promise<Participant> {\n const res = await this.client.request<{ data: Participant }>(\n 'GET',\n `/v1/participants/${participantId}`,\n );\n return res.data;\n }\n\n async update(\n participantId: string,\n data: {\n settings?: Partial<ParticipantSettings>;\n status?: 'active' | 'deleted';\n },\n ): Promise<Participant> {\n const res = await this.client.request<{ data: Participant }>(\n 'PATCH',\n `/v1/participants/${participantId}`,\n data,\n );\n return res.data;\n }\n\n async getBalance(participantId: string): Promise<BalanceResponse> {\n const res = await this.client.request<{ data: BalanceResponse }>(\n 'GET',\n `/v1/participants/${participantId}/balance`,\n );\n return res.data;\n }\n\n async getOnchainBalance(participantId: string): Promise<OnchainBalanceResponse> {\n const res = await this.client.request<{ data: OnchainBalanceResponse }>(\n 'GET',\n `/v1/participants/${participantId}/onchain-balance`,\n );\n return res.data;\n }\n\n async getLedgerEntries(participantId: string): Promise<LedgerEntry[]> {\n const res = await this.client.request<{ data: LedgerEntry[] }>(\n 'GET',\n `/v1/participants/${participantId}/ledger-entries`,\n );\n return res.data;\n }\n\n async deposit(\n participantId: string,\n data: { amountCents: number },\n ): Promise<LedgerEntry> {\n const res = await this.client.request<{ data: LedgerEntry }>(\n 'POST',\n `/v1/participants/${participantId}/deposits`,\n data,\n );\n return res.data;\n }\n}\n","import { Resource } from '@/resources/base';\nimport type { ApiKeyCreateResponse, ApiKeySummary } from '@/types';\n\nexport class ApiKeysResource extends Resource {\n\n async create(): Promise<ApiKeyCreateResponse> {\n const res = await this.client.request<{ data: ApiKeyCreateResponse }>(\n 'POST',\n '/v1/api-keys',\n );\n return res.data;\n }\n\n async list(): Promise<ApiKeySummary[]> {\n const res = await this.client.request<{ data: ApiKeySummary[] }>(\n 'GET',\n '/v1/api-keys',\n );\n return res.data;\n }\n\n async revoke(id: string): Promise<void> {\n await this.client.request('DELETE', `/v1/api-keys/${id}`);\n }\n}\n","import { Resource } from '@/resources/base';\nimport type { DirectoryResponse } from '@/types';\n\nexport class DirectoryResource extends Resource {\n\n async list(options?: { serviceTag?: string; name?: string }): Promise<DirectoryResponse> {\n const params = new URLSearchParams();\n if (options?.serviceTag) params.set('serviceTag', options.serviceTag);\n if (options?.name) params.set('name', options.name);\n const query = params.toString();\n const path = query ? `/v1/directory?${query}` : '/v1/directory';\n\n const res = await this.client.request<{ data: DirectoryResponse }>(\n 'GET',\n path,\n );\n return res.data;\n }\n}\n","import { Resource } from '@/resources/base';\nimport type { LeaderboardEntry } from '@/types';\n\nexport class LeaderboardResource extends Resource {\n\n async get(): Promise<LeaderboardEntry[]> {\n const res = await this.client.request<{ data: LeaderboardEntry[] }>(\n 'GET',\n '/v1/leaderboard',\n );\n return res.data;\n }\n}\n","import { Resource } from '@/resources/base';\nimport type { HealthCheckResult } from '@/types';\n\nexport class HealthResource extends Resource {\n\n async check(): Promise<HealthCheckResult> {\n try {\n await this.client.request('GET', '/v1/health');\n return { ok: true };\n } catch {\n return { ok: false };\n }\n }\n}\n","import type { StamnClientOptions, Requestable } from '@/types';\nimport { AuthResource } from '@/resources/auth';\nimport { AgentsResource } from '@/resources/agents';\nimport { ParticipantsResource } from '@/resources/participants';\nimport { ApiKeysResource } from '@/resources/api-keys';\nimport { DirectoryResource } from '@/resources/directory';\nimport { LeaderboardResource } from '@/resources/leaderboard';\nimport { HealthResource } from '@/resources/health';\n\nexport class StamnApiError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n ) {\n super(message);\n this.name = \"StamnApiError\";\n }\n}\n\ninterface ResolvedRetryOptions {\n maxRetries: number;\n initialDelayMs: number;\n backoffMultiplier: number;\n maxDelayMs: number;\n}\n\nconst DEFAULT_RETRY: ResolvedRetryOptions = {\n maxRetries: 0,\n initialDelayMs: 500,\n backoffMultiplier: 2,\n maxDelayMs: 10_000,\n};\n\nconst SERVER_URL = \"https://api.stamn.com\";\n\nexport class StamnClient implements Requestable {\n private readonly serverUrl = SERVER_URL;\n private apiKey?: string;\n private retryOptions: ResolvedRetryOptions;\n\n public readonly auth: AuthResource;\n public readonly agents: AgentsResource;\n public readonly participants: ParticipantsResource;\n public readonly apiKeys: ApiKeysResource;\n public readonly directory: DirectoryResource;\n public readonly leaderboard: LeaderboardResource;\n public readonly health: HealthResource;\n\n constructor(options: StamnClientOptions = {}) {\n this.apiKey = options.apiKey;\n this.retryOptions = { ...DEFAULT_RETRY, ...options.retry };\n\n this.auth = new AuthResource(this);\n this.agents = new AgentsResource(this);\n this.participants = new ParticipantsResource(this);\n this.apiKeys = new ApiKeysResource(this);\n this.directory = new DirectoryResource(this);\n this.leaderboard = new LeaderboardResource(this);\n this.health = new HealthResource(this);\n }\n\n setApiKey(apiKey: string): void {\n this.apiKey = apiKey;\n }\n\n async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= this.retryOptions.maxRetries; attempt++) {\n if (attempt > 0) {\n await this.sleep(this.calculateDelay(attempt - 1));\n }\n\n try {\n return await this.executeRequest<T>(method, path, body);\n } catch (error) {\n lastError = error;\n if (\n !this.isRetryable(error) ||\n attempt === this.retryOptions.maxRetries\n ) {\n throw error;\n }\n }\n }\n\n throw lastError;\n }\n\n private async executeRequest<T>(\n method: string,\n path: string,\n body?: unknown,\n ): Promise<T> {\n const headers: Record<string, string> = {};\n\n if (body !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n\n if (this.apiKey) {\n headers[\"Authorization\"] = `Bearer ${this.apiKey}`;\n }\n\n const res = await fetch(`${this.serverUrl}${path}`, {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n\n if (!res.ok) {\n const message = await this.parseErrorResponse(res);\n throw new StamnApiError(message, res.status);\n }\n\n const text = await res.text();\n if (!text) return undefined as T;\n\n return JSON.parse(text) as T;\n }\n\n private isRetryable(error: unknown): boolean {\n if (error instanceof TypeError) return true;\n if (error instanceof StamnApiError && error.status >= 500) return true;\n if (error instanceof StamnApiError && error.status === 429) return true;\n return false;\n }\n\n private calculateDelay(attempt: number): number {\n const baseDelay =\n this.retryOptions.initialDelayMs *\n Math.pow(this.retryOptions.backoffMultiplier, attempt);\n const capped = Math.min(baseDelay, this.retryOptions.maxDelayMs);\n return Math.random() * capped;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n private async parseErrorResponse(res: Response): Promise<string> {\n const body = await res.text();\n try {\n const parsed = JSON.parse(body);\n const msg =\n parsed.error?.message ??\n (Array.isArray(parsed.message)\n ? parsed.message.join(\". \")\n : parsed.message);\n if (msg) return msg;\n } catch {}\n return body || `HTTP ${res.status}`;\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/resources/base.ts","../src/resources/auth.ts","../src/resources/agents.ts","../src/resources/participants.ts","../src/resources/api-keys.ts","../src/resources/directory.ts","../src/resources/leaderboard.ts","../src/resources/health.ts","../src/resources/services.ts","../src/client.ts"],"sourcesContent":["import type { Requestable } from '@/types';\n\nexport abstract class Resource {\n constructor(protected readonly client: Requestable) {}\n}\n","import { Resource } from '@/resources/base';\nimport type { DeviceFlowData, DeviceFlowStatus } from '@/types';\n\nconst DEFAULT_POLL_INTERVAL_MS = 5_000;\nconst DEFAULT_TIMEOUT_MS = 300_000; // 5 minutes\n\nexport class AuthResource extends Resource {\n\n async initiateDeviceFlow(): Promise<DeviceFlowData> {\n const res = await this.client.request<{ data: DeviceFlowData }>(\n 'POST',\n '/v1/auth/device-codes',\n );\n return res.data;\n }\n\n async getDeviceFlowStatus(deviceCode: string): Promise<DeviceFlowStatus> {\n const res = await this.client.request<{ data: DeviceFlowStatus }>(\n 'GET',\n `/v1/auth/device-codes/${deviceCode}`,\n );\n return res.data;\n }\n\n async pollForApproval(\n deviceCode: string,\n options?: { pollIntervalMs?: number; timeoutMs?: number },\n ): Promise<string> {\n const pollInterval = options?.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n const timeout = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const deadline = Date.now() + timeout;\n\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, pollInterval));\n\n try {\n const status = await this.getDeviceFlowStatus(deviceCode);\n\n if (status.status === 'approved' && status.apiKey) {\n return status.apiKey;\n }\n\n if (status.status === 'expired') {\n throw new Error('Login code expired. Try again.');\n }\n } catch (err) {\n if ((err as Error).message.includes('expired')) throw err;\n }\n }\n\n throw new Error('Login timed out. Try again.');\n }\n}\n","import { Resource } from '@/resources/base';\nimport type { Participant } from '@/types';\n\nexport class AgentsResource extends Resource {\n\n async create(options?: { name?: string; description?: string }): Promise<Participant> {\n const res = await this.client.request<{ data: Participant }>(\n 'POST',\n '/v1/participants',\n {\n name: options?.name,\n description: options?.description,\n },\n );\n return res.data;\n }\n}\n","import { Resource } from '@/resources/base';\nimport type {\n Participant,\n ParticipantSettings,\n BalanceResponse,\n OnchainBalanceResponse,\n LedgerEntry,\n} from '@/types';\n\nexport class ParticipantsResource extends Resource {\n\n async create(options?: { name?: string; description?: string }): Promise<Participant> {\n const res = await this.client.request<{ data: Participant }>(\n 'POST',\n '/v1/participants',\n {\n name: options?.name || undefined,\n description: options?.description || undefined,\n },\n );\n return res.data;\n }\n\n async list(): Promise<Participant[]> {\n const res = await this.client.request<{ data: Participant[] }>(\n 'GET',\n '/v1/participants',\n );\n return res.data;\n }\n\n async get(participantId: string): Promise<Participant> {\n const res = await this.client.request<{ data: Participant }>(\n 'GET',\n `/v1/participants/${participantId}`,\n );\n return res.data;\n }\n\n async update(\n participantId: string,\n data: {\n settings?: Partial<ParticipantSettings>;\n status?: 'active' | 'deleted';\n },\n ): Promise<Participant> {\n const res = await this.client.request<{ data: Participant }>(\n 'PATCH',\n `/v1/participants/${participantId}`,\n data,\n );\n return res.data;\n }\n\n async getBalance(participantId: string): Promise<BalanceResponse> {\n const res = await this.client.request<{ data: BalanceResponse }>(\n 'GET',\n `/v1/participants/${participantId}/balance`,\n );\n return res.data;\n }\n\n async getOnchainBalance(participantId: string): Promise<OnchainBalanceResponse> {\n const res = await this.client.request<{ data: OnchainBalanceResponse }>(\n 'GET',\n `/v1/participants/${participantId}/onchain-balance`,\n );\n return res.data;\n }\n\n async getLedgerEntries(participantId: string): Promise<LedgerEntry[]> {\n const res = await this.client.request<{ data: LedgerEntry[] }>(\n 'GET',\n `/v1/participants/${participantId}/ledger-entries`,\n );\n return res.data;\n }\n\n async deposit(\n participantId: string,\n data: { amountCents: number },\n ): Promise<LedgerEntry> {\n const res = await this.client.request<{ data: LedgerEntry }>(\n 'POST',\n `/v1/participants/${participantId}/deposits`,\n data,\n );\n return res.data;\n }\n}\n","import { Resource } from '@/resources/base';\nimport type { ApiKeyCreateResponse, ApiKeySummary } from '@/types';\n\nexport class ApiKeysResource extends Resource {\n\n async create(): Promise<ApiKeyCreateResponse> {\n const res = await this.client.request<{ data: ApiKeyCreateResponse }>(\n 'POST',\n '/v1/api-keys',\n );\n return res.data;\n }\n\n async list(): Promise<ApiKeySummary[]> {\n const res = await this.client.request<{ data: ApiKeySummary[] }>(\n 'GET',\n '/v1/api-keys',\n );\n return res.data;\n }\n\n async revoke(id: string): Promise<void> {\n await this.client.request('DELETE', `/v1/api-keys/${id}`);\n }\n}\n","import { Resource } from '@/resources/base';\nimport type { DirectoryResponse } from '@/types';\n\nexport class DirectoryResource extends Resource {\n\n async list(options?: { serviceTag?: string; name?: string }): Promise<DirectoryResponse> {\n const params = new URLSearchParams();\n if (options?.serviceTag) params.set('serviceTag', options.serviceTag);\n if (options?.name) params.set('name', options.name);\n const query = params.toString();\n const path = query ? `/v1/directory?${query}` : '/v1/directory';\n\n const res = await this.client.request<{ data: DirectoryResponse }>(\n 'GET',\n path,\n );\n return res.data;\n }\n}\n","import { Resource } from '@/resources/base';\nimport type { LeaderboardEntry } from '@/types';\n\nexport class LeaderboardResource extends Resource {\n\n async get(): Promise<LeaderboardEntry[]> {\n const res = await this.client.request<{ data: LeaderboardEntry[] }>(\n 'GET',\n '/v1/leaderboard',\n );\n return res.data;\n }\n}\n","import { Resource } from '@/resources/base';\nimport type { HealthCheckResult } from '@/types';\n\nexport class HealthResource extends Resource {\n\n async check(): Promise<HealthCheckResult> {\n try {\n await this.client.request('GET', '/v1/health');\n return { ok: true };\n } catch {\n return { ok: false };\n }\n }\n}\n","import { Resource } from '@/resources/base';\nimport type {\n ServiceListing,\n CreateServiceListingOptions,\n UpdateServiceListingOptions,\n} from '@/types';\n\nexport class ServicesResource extends Resource {\n async list(participantId: string): Promise<ServiceListing[]> {\n const res = await this.client.request<{ data: ServiceListing[] }>(\n 'GET',\n `/v1/participants/${participantId}/services`,\n );\n return res.data;\n }\n\n async create(\n participantId: string,\n options: CreateServiceListingOptions,\n ): Promise<ServiceListing> {\n const res = await this.client.request<{ data: ServiceListing }>(\n 'POST',\n `/v1/participants/${participantId}/services`,\n options,\n );\n return res.data;\n }\n\n async update(\n participantId: string,\n serviceId: string,\n options: UpdateServiceListingOptions,\n ): Promise<ServiceListing> {\n const res = await this.client.request<{ data: ServiceListing }>(\n 'PATCH',\n `/v1/participants/${participantId}/services/${serviceId}`,\n options,\n );\n return res.data;\n }\n\n async delete(\n participantId: string,\n serviceId: string,\n ): Promise<void> {\n await this.client.request<{ data: { deleted: boolean } }>(\n 'DELETE',\n `/v1/participants/${participantId}/services/${serviceId}`,\n );\n }\n}\n","import type { StamnClientOptions, Requestable } from '@/types';\nimport { AuthResource } from '@/resources/auth';\nimport { AgentsResource } from '@/resources/agents';\nimport { ParticipantsResource } from '@/resources/participants';\nimport { ApiKeysResource } from '@/resources/api-keys';\nimport { DirectoryResource } from '@/resources/directory';\nimport { LeaderboardResource } from '@/resources/leaderboard';\nimport { HealthResource } from '@/resources/health';\nimport { ServicesResource } from '@/resources/services';\n\nexport class StamnApiError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n ) {\n super(message);\n this.name = \"StamnApiError\";\n }\n}\n\ninterface ResolvedRetryOptions {\n maxRetries: number;\n initialDelayMs: number;\n backoffMultiplier: number;\n maxDelayMs: number;\n}\n\nconst DEFAULT_RETRY: ResolvedRetryOptions = {\n maxRetries: 0,\n initialDelayMs: 500,\n backoffMultiplier: 2,\n maxDelayMs: 10_000,\n};\n\nconst SERVER_URL = \"https://api.stamn.com\";\n\nexport class StamnClient implements Requestable {\n private readonly serverUrl = SERVER_URL;\n private apiKey?: string;\n private retryOptions: ResolvedRetryOptions;\n\n public readonly auth: AuthResource;\n public readonly agents: AgentsResource;\n public readonly participants: ParticipantsResource;\n public readonly apiKeys: ApiKeysResource;\n public readonly directory: DirectoryResource;\n public readonly leaderboard: LeaderboardResource;\n public readonly health: HealthResource;\n public readonly services: ServicesResource;\n\n constructor(options: StamnClientOptions = {}) {\n this.apiKey = options.apiKey;\n this.retryOptions = { ...DEFAULT_RETRY, ...options.retry };\n\n this.auth = new AuthResource(this);\n this.agents = new AgentsResource(this);\n this.participants = new ParticipantsResource(this);\n this.apiKeys = new ApiKeysResource(this);\n this.directory = new DirectoryResource(this);\n this.leaderboard = new LeaderboardResource(this);\n this.health = new HealthResource(this);\n this.services = new ServicesResource(this);\n }\n\n setApiKey(apiKey: string): void {\n this.apiKey = apiKey;\n }\n\n async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= this.retryOptions.maxRetries; attempt++) {\n if (attempt > 0) {\n await this.sleep(this.calculateDelay(attempt - 1));\n }\n\n try {\n return await this.executeRequest<T>(method, path, body);\n } catch (error) {\n lastError = error;\n if (\n !this.isRetryable(error) ||\n attempt === this.retryOptions.maxRetries\n ) {\n throw error;\n }\n }\n }\n\n throw lastError;\n }\n\n private async executeRequest<T>(\n method: string,\n path: string,\n body?: unknown,\n ): Promise<T> {\n const headers: Record<string, string> = {};\n\n if (body !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n\n if (this.apiKey) {\n headers[\"Authorization\"] = `Bearer ${this.apiKey}`;\n }\n\n const res = await fetch(`${this.serverUrl}${path}`, {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n\n if (!res.ok) {\n const message = await this.parseErrorResponse(res);\n throw new StamnApiError(message, res.status);\n }\n\n const text = await res.text();\n if (!text) return undefined as T;\n\n return JSON.parse(text) as T;\n }\n\n private isRetryable(error: unknown): boolean {\n if (error instanceof TypeError) return true;\n if (error instanceof StamnApiError && error.status >= 500) return true;\n if (error instanceof StamnApiError && error.status === 429) return true;\n return false;\n }\n\n private calculateDelay(attempt: number): number {\n const baseDelay =\n this.retryOptions.initialDelayMs *\n Math.pow(this.retryOptions.backoffMultiplier, attempt);\n const capped = Math.min(baseDelay, this.retryOptions.maxDelayMs);\n return Math.random() * capped;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n private async parseErrorResponse(res: Response): Promise<string> {\n const body = await res.text();\n try {\n const parsed = JSON.parse(body);\n const msg =\n parsed.error?.message ??\n (Array.isArray(parsed.message)\n ? parsed.message.join(\". \")\n : parsed.message);\n if (msg) return msg;\n } catch {}\n return body || `HTTP ${res.status}`;\n }\n}\n"],"mappings":"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","names":[]}
|