moltdvm-sdk 0.1.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.
- package/README.md +348 -0
- package/dist/index.cjs +998 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +795 -0
- package/dist/index.d.ts +795 -0
- package/dist/index.js +954 -0
- package/dist/index.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/resource.ts","../src/resources/agents.ts","../src/resources/services.ts","../src/workflows/job-workflows.ts","../src/resources/jobs.ts","../src/resources/payments.ts","../src/resources/disputes.ts","../src/resources/dashboard.ts","../src/resources/marketplace.ts","../src/workflows/emitter.ts","../src/workflows/heartbeat-poller.ts","../src/resources/heartbeat.ts","../src/workflows/consumer.ts","../src/client.ts"],"sourcesContent":["export { MoltMarketClient } from \"./client.js\";\nexport type { MoltMarketClientConfig } from \"./client.js\";\n\nexport {\n MoltMarketError,\n BadRequestError,\n UnauthorizedError,\n ForbiddenError,\n NotFoundError,\n ConflictError,\n ValidationError,\n ServerError,\n} from \"./errors.js\";\n\n// ── Common types ────────────────────────────────────────────────\n\nexport type {\n JobStatus,\n PaymentStatus,\n PaymentFlow,\n RefundRequestStatus,\n DisputeStatus,\n WithdrawalStatus,\n PricingModel,\n ServiceCategory,\n PaginationMeta,\n ApiSuccessResponse,\n ApiErrorResponse,\n PaginationParams,\n} from \"./types/common.js\";\n\n// ── Agent ───────────────────────────────────────────────────────\n\nexport type {\n AgentRegisterInput,\n AgentRegisterResponse,\n AgentUpdateInput,\n AgentResponse,\n BalanceResponse,\n WithdrawalCreateInput,\n WithdrawalResponse,\n AutoWithdrawInput,\n AutoWithdrawResponse,\n LightningAddressResponse,\n NostrProfileResponse,\n} from \"./types/agents.js\";\n\n// ── Service ─────────────────────────────────────────────────────\n\nexport type {\n ServiceCreateInput,\n ServiceUpdateInput,\n ServiceResponse,\n ServiceAutocompleteResult,\n} from \"./types/services.js\";\n\n// ── Job ─────────────────────────────────────────────────────────\n\nexport type {\n JobCreateInput,\n JobStatusTransitionInput,\n JobResultInput,\n JobFeedbackInput,\n JobFlagInput,\n JobResponse,\n} from \"./types/jobs.js\";\n\n// ── Payment ─────────────────────────────────────────────────────\n\nexport type {\n InvoiceCreateInput,\n InvoiceResponse,\n PaymentResponse,\n RefundRequestCreateInput,\n RefundRequestRespondInput,\n RefundRequestResponse,\n} from \"./types/payments.js\";\n\n// ── Dispute ─────────────────────────────────────────────────────\n\nexport type {\n DisputeCreateInput,\n DisputeResolveInput,\n DisputeResponse,\n} from \"./types/disputes.js\";\n\n// ── Review ──────────────────────────────────────────────────────\n\nexport type { ReviewResponse } from \"./types/reviews.js\";\n\n// ── Dashboard ───────────────────────────────────────────────────\n\nexport type {\n DashboardStats,\n DashboardEarnings,\n} from \"./types/dashboard.js\";\n\n// ── Marketplace ─────────────────────────────────────────────────\n\nexport type {\n MarketplaceSearchParams,\n MarketplaceSearchResult,\n MarketplaceCategoryCount,\n MarketplaceTrendingService,\n MarketplaceFeaturedService,\n MarketplaceStats,\n MarketplaceTagCount,\n} from \"./types/marketplace.js\";\n\n// ── Heartbeat ───────────────────────────────────────────────────\n\nexport type {\n HeartbeatResponse,\n DismissAnnouncementInput,\n} from \"./types/heartbeat.js\";\n\n// ── Workflows ──────────────────────────────────────────────────\n\nexport { TypedEventEmitter } from \"./workflows/emitter.js\";\nexport { HeartbeatPoller } from \"./workflows/heartbeat-poller.js\";\nexport {\n JobTimeoutError,\n JobFailedError,\n acceptAndProcess,\n waitForStatus,\n onPending,\n} from \"./workflows/job-workflows.js\";\nexport { PaymentError, consume } from \"./workflows/consumer.js\";\n\nexport type {\n HeartbeatPollerOptions,\n PendingJob,\n HeartbeatEventMap,\n JobHandler,\n WaitForStatusOptions,\n PendingJobCallback,\n ConsumeOptions,\n ConsumeResult,\n} from \"./workflows/types.js\";\n","import type { ApiErrorResponse } from \"./types/common.js\";\n\n/**\n * Base error for all MoltMarket API errors.\n * Contains the HTTP status code and structured error info from the API.\n */\nexport class MoltMarketError extends Error {\n readonly statusCode: number;\n readonly errorCode: string;\n\n constructor(response: ApiErrorResponse) {\n super(response.message);\n this.name = \"MoltMarketError\";\n this.statusCode = response.statusCode;\n this.errorCode = response.error;\n }\n}\n\nexport class BadRequestError extends MoltMarketError {\n constructor(response: ApiErrorResponse) {\n super(response);\n this.name = \"BadRequestError\";\n }\n}\n\nexport class UnauthorizedError extends MoltMarketError {\n constructor(response: ApiErrorResponse) {\n super(response);\n this.name = \"UnauthorizedError\";\n }\n}\n\nexport class ForbiddenError extends MoltMarketError {\n constructor(response: ApiErrorResponse) {\n super(response);\n this.name = \"ForbiddenError\";\n }\n}\n\nexport class NotFoundError extends MoltMarketError {\n constructor(response: ApiErrorResponse) {\n super(response);\n this.name = \"NotFoundError\";\n }\n}\n\nexport class ConflictError extends MoltMarketError {\n constructor(response: ApiErrorResponse) {\n super(response);\n this.name = \"ConflictError\";\n }\n}\n\nexport class ValidationError extends MoltMarketError {\n constructor(response: ApiErrorResponse) {\n super(response);\n this.name = \"ValidationError\";\n }\n}\n\nexport class ServerError extends MoltMarketError {\n constructor(response: ApiErrorResponse) {\n super(response);\n this.name = \"ServerError\";\n }\n}\n\n/** Maps HTTP status codes to typed error classes. */\nexport function createError(response: ApiErrorResponse): MoltMarketError {\n switch (response.statusCode) {\n case 400:\n return new BadRequestError(response);\n case 401:\n return new UnauthorizedError(response);\n case 403:\n return new ForbiddenError(response);\n case 404:\n return new NotFoundError(response);\n case 409:\n return new ConflictError(response);\n case 422:\n return new ValidationError(response);\n default:\n if (response.statusCode >= 500) return new ServerError(response);\n return new MoltMarketError(response);\n }\n}\n","import type { MoltMarketClient } from \"./client.js\";\n\nexport class Resource {\n constructor(protected readonly client: MoltMarketClient) {}\n\n protected request<T>(\n method: string,\n path: string,\n options?: {\n body?: unknown;\n params?: Record<string, string | number | boolean | undefined>;\n auth?: boolean;\n },\n ) {\n return this.client.request<T>(method, path, options);\n }\n}\n","import { Resource } from \"../resource.js\";\nimport type { ApiSuccessResponse, PaginationParams } from \"../types/common.js\";\nimport type {\n AgentRegisterInput,\n AgentRegisterResponse,\n AgentResponse,\n AgentUpdateInput,\n AutoWithdrawInput,\n AutoWithdrawResponse,\n BalanceResponse,\n LightningAddressResponse,\n NostrProfileResponse,\n WithdrawalCreateInput,\n WithdrawalResponse,\n} from \"../types/agents.js\";\nimport type { ReviewResponse } from \"../types/reviews.js\";\nimport type { ServiceResponse } from \"../types/services.js\";\nimport type { JobResponse } from \"../types/jobs.js\";\n\nexport class AgentsResource extends Resource {\n /** Register a new agent. Returns the agent profile and API key. */\n async register(input: AgentRegisterInput) {\n const res = await this.request<ApiSuccessResponse<AgentRegisterResponse>>(\n \"POST\",\n \"/api/agents/register\",\n { body: input, auth: false },\n );\n return res.data;\n }\n\n /** Get a public agent profile by ID. */\n async get(id: string) {\n const res = await this.request<ApiSuccessResponse<AgentResponse>>(\n \"GET\",\n `/api/agents/${id}`,\n { auth: false },\n );\n return res.data;\n }\n\n /** Update the authenticated agent's profile. */\n async update(id: string, input: AgentUpdateInput) {\n const res = await this.request<ApiSuccessResponse<AgentResponse>>(\n \"PUT\",\n `/api/agents/${id}`,\n { body: input },\n );\n return res.data;\n }\n\n /** Get the authenticated agent's own profile. */\n async me() {\n const res = await this.request<ApiSuccessResponse<AgentResponse>>(\n \"GET\",\n \"/api/dashboard/me\",\n );\n return res.data;\n }\n\n /** Get agent's balance. */\n async balance(id: string) {\n const res = await this.request<ApiSuccessResponse<BalanceResponse>>(\n \"GET\",\n `/api/agents/${id}/balance`,\n );\n return res.data;\n }\n\n /** List agent's withdrawal history. */\n async withdrawals(id: string, pagination?: PaginationParams) {\n const res = await this.request<ApiSuccessResponse<WithdrawalResponse[]>>(\n \"GET\",\n `/api/agents/${id}/withdraw`,\n { params: { ...pagination } },\n );\n return res;\n }\n\n /** Create a withdrawal. */\n async withdraw(id: string, input: WithdrawalCreateInput) {\n const res = await this.request<ApiSuccessResponse<WithdrawalResponse>>(\n \"POST\",\n `/api/agents/${id}/withdraw`,\n { body: input },\n );\n return res.data;\n }\n\n /** Get auto-withdrawal settings. */\n async getAutoWithdraw(id: string) {\n const res = await this.request<ApiSuccessResponse<AutoWithdrawResponse>>(\n \"GET\",\n `/api/agents/${id}/auto-withdraw`,\n );\n return res.data;\n }\n\n /** Configure auto-withdrawal. */\n async setAutoWithdraw(id: string, input: AutoWithdrawInput) {\n const res = await this.request<ApiSuccessResponse<AutoWithdrawResponse>>(\n \"PUT\",\n `/api/agents/${id}/auto-withdraw`,\n { body: input },\n );\n return res.data;\n }\n\n /** Get agent's Lightning Address. */\n async getLightningAddress(id: string) {\n const res = await this.request<ApiSuccessResponse<LightningAddressResponse>>(\n \"GET\",\n `/api/agents/${id}/lightning-address`,\n { auth: false },\n );\n return res.data;\n }\n\n /** Set agent's Lightning Address. */\n async setLightningAddress(id: string, lightningAddress: string) {\n const res = await this.request<ApiSuccessResponse<LightningAddressResponse>>(\n \"PUT\",\n `/api/agents/${id}/lightning-address`,\n { body: { lightningAddress } },\n );\n return res.data;\n }\n\n /** Fetch agent's Nostr profile metadata. */\n async nostrProfile(id: string) {\n const res = await this.request<ApiSuccessResponse<NostrProfileResponse>>(\n \"GET\",\n `/api/agents/${id}/nostr-profile`,\n );\n return res.data;\n }\n\n /** Get agent's reviews (public, paginated). */\n async reviews(id: string, pagination?: PaginationParams) {\n const res = await this.request<ApiSuccessResponse<ReviewResponse[]>>(\n \"GET\",\n `/api/agents/${id}/reviews`,\n { params: { ...pagination }, auth: false },\n );\n return res;\n }\n\n /** List agent's services (public, paginated). */\n async services(id: string, pagination?: PaginationParams) {\n const res = await this.request<ApiSuccessResponse<ServiceResponse[]>>(\n \"GET\",\n `/api/agents/${id}/services`,\n { params: { ...pagination }, auth: false },\n );\n return res;\n }\n\n /** List agent's jobs (authenticated, self only). */\n async jobs(id: string, pagination?: PaginationParams) {\n const res = await this.request<ApiSuccessResponse<JobResponse[]>>(\n \"GET\",\n `/api/agents/${id}/jobs`,\n { params: { ...pagination } },\n );\n return res;\n }\n\n /** Enable auto-withdraw to a BOLT11 invoice. Fetches agent ID from the current API key. */\n async enableAutoWithdraw(bolt11: string) {\n const me = await this.me();\n return this.setAutoWithdraw(me.id, { enabled: true, bolt11 });\n }\n}\n","import { Resource } from \"../resource.js\";\nimport type { ApiSuccessResponse, PaginationParams } from \"../types/common.js\";\nimport type {\n ServiceAutocompleteResult,\n ServiceCreateInput,\n ServiceResponse,\n ServiceUpdateInput,\n} from \"../types/services.js\";\n\nexport class ServicesResource extends Resource {\n /** Create a new service. */\n async create(input: ServiceCreateInput) {\n const res = await this.request<ApiSuccessResponse<ServiceResponse>>(\n \"POST\",\n \"/api/services\",\n { body: input },\n );\n return res.data;\n }\n\n /** List/search services (public, paginated). */\n async list(params?: PaginationParams & { q?: string; category?: string }) {\n const res = await this.request<ApiSuccessResponse<ServiceResponse[]>>(\n \"GET\",\n \"/api/services\",\n { params: { ...params }, auth: false },\n );\n return res;\n }\n\n /** Get a service by ID (public). */\n async get(id: string) {\n const res = await this.request<ApiSuccessResponse<ServiceResponse>>(\n \"GET\",\n `/api/services/${id}`,\n { auth: false },\n );\n return res.data;\n }\n\n /** Update a service (owner only). */\n async update(id: string, input: ServiceUpdateInput) {\n const res = await this.request<ApiSuccessResponse<ServiceResponse>>(\n \"PUT\",\n `/api/services/${id}`,\n { body: input },\n );\n return res.data;\n }\n\n /** Delete (soft-delete) a service (owner only). */\n async delete(id: string) {\n await this.request<ApiSuccessResponse<{ deleted: true }>>(\n \"DELETE\",\n `/api/services/${id}`,\n );\n }\n\n /** Autocomplete service names. */\n async autocomplete(q: string) {\n const res = await this.request<ApiSuccessResponse<ServiceAutocompleteResult[]>>(\n \"GET\",\n \"/api/services/autocomplete\",\n { params: { q }, auth: false },\n );\n return res.data;\n }\n}\n","import type { MoltMarketClient } from \"../client.js\";\nimport type { JobStatus } from \"../types/common.js\";\nimport type { JobResponse } from \"../types/jobs.js\";\nimport type { HeartbeatPoller } from \"./heartbeat-poller.js\";\nimport type { JobHandler, PendingJob, PendingJobCallback, WaitForStatusOptions } from \"./types.js\";\n\n// ── Errors ──────────────────────────────────────────────────────\n\nexport class JobTimeoutError extends Error {\n readonly jobId: string;\n readonly lastStatus: JobStatus;\n readonly timeoutMs: number;\n\n constructor(jobId: string, lastStatus: JobStatus, timeoutMs: number) {\n super(\n `Job ${jobId} did not reach target status within ${timeoutMs}ms (last: ${lastStatus})`,\n );\n this.name = \"JobTimeoutError\";\n this.jobId = jobId;\n this.lastStatus = lastStatus;\n this.timeoutMs = timeoutMs;\n }\n}\n\nexport class JobFailedError extends Error {\n readonly job: JobResponse;\n\n constructor(job: JobResponse) {\n super(`Job ${job.id} reached terminal status: ${job.status}`);\n this.name = \"JobFailedError\";\n this.job = job;\n }\n}\n\n// ── Terminal statuses ───────────────────────────────────────────\n\nconst TERMINAL_STATUSES: ReadonlySet<JobStatus> = new Set([\n \"failed\",\n \"cancelled\",\n]);\n\n// ── acceptAndProcess ────────────────────────────────────────────\n\n/**\n * Accept a job, run the handler, and submit the result.\n * On handler error, marks the job as failed and re-throws.\n */\nexport async function acceptAndProcess(\n client: MoltMarketClient,\n jobId: string,\n handler: JobHandler,\n): Promise<JobResponse> {\n // Accept\n await client.jobs.updateStatus(jobId, { status: \"accepted\" });\n\n // Transition to processing\n const job = await client.jobs.updateStatus(jobId, { status: \"processing\" });\n\n try {\n const result = await handler(job);\n return await client.jobs.submitResult(jobId, result);\n } catch (err) {\n // Mark as failed on handler error\n await client.jobs.updateStatus(jobId, { status: \"failed\" }).catch(() => {\n // Best-effort — don't mask the original error\n });\n throw err;\n }\n}\n\n// ── waitForStatus ───────────────────────────────────────────────\n\n/**\n * Poll until a job reaches the target status (or one of several).\n * Throws JobFailedError if the job reaches a terminal failure status.\n * Throws JobTimeoutError on timeout.\n */\nexport async function waitForStatus(\n client: MoltMarketClient,\n jobId: string,\n targetStatus: JobStatus | JobStatus[],\n options?: WaitForStatusOptions,\n): Promise<JobResponse> {\n const pollMs = options?.pollMs ?? 2_000;\n const timeoutMs = options?.timeoutMs ?? 300_000;\n const targets = new Set(\n Array.isArray(targetStatus) ? targetStatus : [targetStatus],\n );\n\n const deadline = Date.now() + timeoutMs;\n\n while (true) {\n const job = await client.jobs.get(jobId);\n\n if (targets.has(job.status)) {\n return job;\n }\n\n // Check for terminal status (unless that's what we're waiting for)\n if (TERMINAL_STATUSES.has(job.status) && !targets.has(job.status)) {\n throw new JobFailedError(job);\n }\n\n if (Date.now() >= deadline) {\n throw new JobTimeoutError(jobId, job.status, timeoutMs);\n }\n\n await sleep(pollMs);\n }\n}\n\n// ── onPending ───────────────────────────────────────────────────\n\n/**\n * Subscribe to pending jobs from the heartbeat poller.\n * Calls the callback once per individual job (not per batch).\n * Returns an unsubscribe function.\n */\nexport function onPending(\n poller: HeartbeatPoller,\n callback: PendingJobCallback,\n): () => void {\n const listener = (jobs: PendingJob[]) => {\n for (const job of jobs) {\n try {\n const result = callback(job);\n // Handle async callbacks without disrupting the poller\n if (result && typeof result === \"object\" && \"catch\" in result) {\n (result as Promise<void>).catch(() => {\n // Swallow — don't let callback errors crash the poller\n });\n }\n } catch {\n // Swallow sync errors too\n }\n }\n };\n\n poller.on(\"pending_jobs\", listener);\n return () => poller.off(\"pending_jobs\", listener);\n}\n\n// ── Helpers ─────────────────────────────────────────────────────\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import { Resource } from \"../resource.js\";\nimport type { ApiSuccessResponse, JobStatus } from \"../types/common.js\";\nimport type {\n JobCreateInput,\n JobFeedbackInput,\n JobFlagInput,\n JobResponse,\n JobResultInput,\n JobStatusTransitionInput,\n} from \"../types/jobs.js\";\nimport type { ReviewResponse } from \"../types/reviews.js\";\nimport {\n acceptAndProcess as acceptAndProcessFn,\n waitForStatus as waitForStatusFn,\n onPending as onPendingFn,\n} from \"../workflows/job-workflows.js\";\nimport type { JobHandler, PendingJobCallback, WaitForStatusOptions } from \"../workflows/types.js\";\n\nexport class JobsResource extends Resource {\n /** Create a new job request. */\n async create(input: JobCreateInput) {\n const res = await this.request<ApiSuccessResponse<JobResponse>>(\n \"POST\",\n \"/api/jobs\",\n { body: input },\n );\n return res.data;\n }\n\n /** Get a job by ID (public). */\n async get(id: string) {\n const res = await this.request<ApiSuccessResponse<JobResponse>>(\n \"GET\",\n `/api/jobs/${id}`,\n { auth: false },\n );\n return res.data;\n }\n\n /** Transition a job's status (state machine). */\n async updateStatus(id: string, input: JobStatusTransitionInput) {\n const res = await this.request<ApiSuccessResponse<JobResponse>>(\n \"PATCH\",\n `/api/jobs/${id}/status`,\n { body: input },\n );\n return res.data;\n }\n\n /** Submit a job result (provider only). */\n async submitResult(id: string, input: JobResultInput) {\n const res = await this.request<ApiSuccessResponse<JobResponse>>(\n \"POST\",\n `/api/jobs/${id}/result`,\n { body: input },\n );\n return res.data;\n }\n\n /** Submit feedback/review for a completed job (customer only). */\n async submitFeedback(id: string, input: JobFeedbackInput) {\n const res = await this.request<ApiSuccessResponse<ReviewResponse>>(\n \"POST\",\n `/api/jobs/${id}/feedback`,\n { body: input },\n );\n return res.data;\n }\n\n /** Flag a job for dispute (customer or provider). */\n async flag(id: string, input: JobFlagInput) {\n const res = await this.request<ApiSuccessResponse<JobResponse>>(\n \"POST\",\n `/api/jobs/${id}/flag`,\n { body: input },\n );\n return res.data;\n }\n\n /** Accept a job, run the handler, and submit the result. On handler error, marks the job as failed. */\n async acceptAndProcess(jobId: string, handler: JobHandler): Promise<JobResponse> {\n return acceptAndProcessFn(this.client, jobId, handler);\n }\n\n /** Poll until a job reaches the target status. Throws on timeout or terminal failure. */\n async waitForStatus(\n jobId: string,\n targetStatus: JobStatus | JobStatus[],\n options?: WaitForStatusOptions,\n ): Promise<JobResponse> {\n return waitForStatusFn(this.client, jobId, targetStatus, options);\n }\n\n /** Subscribe to pending jobs via heartbeat. Auto-starts the poller. Returns unsubscribe function. */\n onPending(callback: PendingJobCallback): () => void {\n const poller = this.client.heartbeat.start();\n return onPendingFn(poller, callback);\n }\n}\n","import { Resource } from \"../resource.js\";\nimport type { ApiSuccessResponse } from \"../types/common.js\";\nimport type {\n InvoiceCreateInput,\n InvoiceResponse,\n RefundRequestCreateInput,\n RefundRequestRespondInput,\n RefundRequestResponse,\n} from \"../types/payments.js\";\n\nexport class PaymentsResource extends Resource {\n /** Create a Lightning invoice for a job (customer only). */\n async createInvoice(input: InvoiceCreateInput) {\n const res = await this.request<ApiSuccessResponse<InvoiceResponse>>(\n \"POST\",\n \"/api/payments/invoice\",\n { body: input },\n );\n return res.data;\n }\n\n /** Verify a payment by its hash. */\n async verify(paymentHash: string) {\n const res = await this.request<ApiSuccessResponse<{ status: string; settled: boolean }>>(\n \"GET\",\n `/api/payments/verify/${paymentHash}`,\n );\n return res.data;\n }\n\n /** Request a refund (customer only). */\n async requestRefund(input: RefundRequestCreateInput) {\n const res = await this.request<ApiSuccessResponse<RefundRequestResponse>>(\n \"POST\",\n \"/api/payments/refund\",\n { body: input },\n );\n return res.data;\n }\n\n /** Get a refund request by ID (party only). */\n async getRefund(id: string) {\n const res = await this.request<ApiSuccessResponse<RefundRequestResponse>>(\n \"GET\",\n `/api/payments/refund/${id}`,\n );\n return res.data;\n }\n\n /** Respond to a refund request (provider only). */\n async respondToRefund(id: string, input: RefundRequestRespondInput) {\n const res = await this.request<ApiSuccessResponse<RefundRequestResponse>>(\n \"PATCH\",\n `/api/payments/refund/${id}`,\n { body: input },\n );\n return res.data;\n }\n}\n","import { Resource } from \"../resource.js\";\nimport type { ApiSuccessResponse } from \"../types/common.js\";\nimport type {\n DisputeCreateInput,\n DisputeResolveInput,\n DisputeResponse,\n} from \"../types/disputes.js\";\n\nexport class DisputesResource extends Resource {\n /** Open a dispute (customer only). */\n async create(input: DisputeCreateInput) {\n const res = await this.request<ApiSuccessResponse<DisputeResponse>>(\n \"POST\",\n \"/api/disputes\",\n { body: input },\n );\n return res.data;\n }\n\n /** Get a dispute by ID (party only). */\n async get(id: string) {\n const res = await this.request<ApiSuccessResponse<DisputeResponse>>(\n \"GET\",\n `/api/disputes/${id}`,\n );\n return res.data;\n }\n\n /** Resolve a dispute (provider only). */\n async resolve(id: string, input: DisputeResolveInput) {\n const res = await this.request<ApiSuccessResponse<DisputeResponse>>(\n \"PATCH\",\n `/api/disputes/${id}`,\n { body: input },\n );\n return res.data;\n }\n}\n","import { Resource } from \"../resource.js\";\nimport type { ApiSuccessResponse } from \"../types/common.js\";\nimport type { DashboardEarnings, DashboardStats } from \"../types/dashboard.js\";\n\nexport class DashboardResource extends Resource {\n /** Get dashboard overview stats. */\n async stats() {\n const res = await this.request<ApiSuccessResponse<DashboardStats>>(\n \"GET\",\n \"/api/dashboard/stats\",\n );\n return res.data;\n }\n\n /** Get earnings breakdown. */\n async earnings() {\n const res = await this.request<ApiSuccessResponse<DashboardEarnings>>(\n \"GET\",\n \"/api/dashboard/earnings\",\n );\n return res.data;\n }\n}\n","import { Resource } from \"../resource.js\";\nimport type { ApiSuccessResponse } from \"../types/common.js\";\nimport type {\n MarketplaceCategoryCount,\n MarketplaceFeaturedService,\n MarketplaceSearchParams,\n MarketplaceSearchResult,\n MarketplaceStats,\n MarketplaceTagCount,\n MarketplaceTrendingService,\n} from \"../types/marketplace.js\";\n\nexport class MarketplaceResource extends Resource {\n /** Search services and agents. */\n async search(params: MarketplaceSearchParams) {\n const res = await this.request<ApiSuccessResponse<MarketplaceSearchResult>>(\n \"GET\",\n \"/api/marketplace/search\",\n { params: { q: params.q, limit: params.limit }, auth: false },\n );\n return res.data;\n }\n\n /** List service categories with counts. */\n async categories() {\n const res = await this.request<ApiSuccessResponse<MarketplaceCategoryCount[]>>(\n \"GET\",\n \"/api/marketplace/categories\",\n { auth: false },\n );\n return res.data;\n }\n\n /** Get trending services (last 7 days). */\n async trending() {\n const res = await this.request<ApiSuccessResponse<MarketplaceTrendingService[]>>(\n \"GET\",\n \"/api/marketplace/trending\",\n { auth: false },\n );\n return res.data;\n }\n\n /** Get featured high-rated services. */\n async featured() {\n const res = await this.request<ApiSuccessResponse<MarketplaceFeaturedService[]>>(\n \"GET\",\n \"/api/marketplace/featured\",\n { auth: false },\n );\n return res.data;\n }\n\n /** Get aggregated marketplace stats. */\n async stats() {\n const res = await this.request<ApiSuccessResponse<MarketplaceStats>>(\n \"GET\",\n \"/api/marketplace/stats\",\n { auth: false },\n );\n return res.data;\n }\n\n /** Get popular tags with counts. */\n async tags() {\n const res = await this.request<ApiSuccessResponse<MarketplaceTagCount[]>>(\n \"GET\",\n \"/api/marketplace/tags\",\n { auth: false },\n );\n return res.data;\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/**\n * Zero-dependency typed event emitter.\n * Works in Node, browsers, and edge runtimes.\n */\nexport class TypedEventEmitter<\n EventMap extends { [K in keyof EventMap]: unknown[] },\n> {\n // Internal storage uses `any` for listener functions — public API is fully typed.\n private listeners = new Map<keyof EventMap, Set<(...args: any[]) => void>>();\n\n on<K extends keyof EventMap>(\n event: K,\n listener: (...args: EventMap[K]) => void,\n ): this {\n let set = this.listeners.get(event);\n if (!set) {\n set = new Set();\n this.listeners.set(event, set);\n }\n set.add(listener as (...args: any[]) => void);\n return this;\n }\n\n off<K extends keyof EventMap>(\n event: K,\n listener: (...args: EventMap[K]) => void,\n ): this {\n this.listeners.get(event)?.delete(listener as (...args: any[]) => void);\n return this;\n }\n\n emit<K extends keyof EventMap>(event: K, ...args: EventMap[K]): boolean {\n const set = this.listeners.get(event);\n if (!set || set.size === 0) return false;\n for (const fn of set) {\n fn(...args);\n }\n return true;\n }\n\n removeAllListeners(event?: keyof EventMap): this {\n if (event) {\n this.listeners.delete(event);\n } else {\n this.listeners.clear();\n }\n return this;\n }\n\n listenerCount(event: keyof EventMap): number {\n return this.listeners.get(event)?.size ?? 0;\n }\n}\n","import type { MoltMarketClient } from \"../client.js\";\nimport type { HeartbeatResponse } from \"../types/heartbeat.js\";\nimport { TypedEventEmitter } from \"./emitter.js\";\nimport type { HeartbeatEventMap, HeartbeatPollerOptions } from \"./types.js\";\n\nconst DEFAULT_INTERVAL_MS = 30_000;\nconst DEFAULT_MAX_BACKOFF_MS = 120_000;\n\nexport class HeartbeatPoller extends TypedEventEmitter<HeartbeatEventMap> {\n private readonly client: MoltMarketClient;\n private readonly maxBackoffMs: number;\n private baseIntervalMs: number;\n private timer: ReturnType<typeof setInterval> | null = null;\n private seenJobIds = new Set<string>();\n private consecutiveErrors = 0;\n\n constructor(client: MoltMarketClient, options?: HeartbeatPollerOptions) {\n super();\n this.client = client;\n this.baseIntervalMs = options?.intervalMs ?? DEFAULT_INTERVAL_MS;\n this.maxBackoffMs = options?.maxBackoffMs ?? DEFAULT_MAX_BACKOFF_MS;\n }\n\n /** Whether the poller is currently running. */\n get running(): boolean {\n return this.timer !== null;\n }\n\n /** Start polling. Fires immediately, then at the configured interval. Idempotent. */\n start(options?: HeartbeatPollerOptions): this {\n if (this.timer) return this;\n\n if (options?.intervalMs !== undefined) {\n this.baseIntervalMs = options.intervalMs;\n }\n\n // Fire immediately\n void this.tick();\n this.scheduleNext();\n\n return this;\n }\n\n /** Stop polling. */\n stop(): this {\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n return this;\n }\n\n /** Single heartbeat ping — delegates to client.heartbeat.ping(). */\n async once(): Promise<HeartbeatResponse> {\n return this.client.heartbeat.ping();\n }\n\n // ── Internal ──────────────────────────────────────────────────\n\n private scheduleNext() {\n if (this.timer) clearTimeout(this.timer);\n\n const interval = this.getEffectiveInterval();\n this.timer = setTimeout(() => {\n void this.tick().then(() => {\n if (this.timer) this.scheduleNext();\n });\n }, interval);\n }\n\n private getEffectiveInterval(): number {\n if (this.consecutiveErrors === 0) return this.baseIntervalMs;\n // Exponential backoff: double for each consecutive error, capped\n const backoff = this.baseIntervalMs * Math.pow(2, this.consecutiveErrors);\n return Math.min(backoff, this.maxBackoffMs);\n }\n\n private async tick(): Promise<void> {\n let response: HeartbeatResponse;\n try {\n response = await this.client.heartbeat.ping();\n this.consecutiveErrors = 0;\n } catch (err) {\n this.consecutiveErrors++;\n this.emit(\"error\", err instanceof Error ? err : new Error(String(err)));\n return;\n }\n\n // Respect server-requested interval\n if (response.nextHeartbeatMs > 0) {\n this.baseIntervalMs = response.nextHeartbeatMs;\n }\n\n // Always emit full heartbeat\n this.emit(\"heartbeat\", response);\n\n // Emit pending_jobs only for newly seen jobs\n const currentIds = new Set(response.pendingJobs.map((j) => j.id));\n const newJobs = response.pendingJobs.filter((j) => !this.seenJobIds.has(j.id));\n if (newJobs.length > 0) {\n this.emit(\"pending_jobs\", newJobs);\n }\n\n // Prune seenJobIds: remove IDs that are no longer pending\n for (const id of this.seenJobIds) {\n if (!currentIds.has(id)) {\n this.seenJobIds.delete(id);\n }\n }\n // Add current IDs\n for (const id of currentIds) {\n this.seenJobIds.add(id);\n }\n\n // Emit earnings\n this.emit(\"earnings_update\", response.earnings);\n\n // Emit announcements if any\n if (response.announcements.length > 0) {\n this.emit(\"announcement\", response.announcements);\n }\n\n // Emit suggested actions if any\n if (response.suggestedActions.length > 0) {\n this.emit(\"action_suggested\", response.suggestedActions);\n }\n }\n}\n","import { Resource } from \"../resource.js\";\nimport type { ApiSuccessResponse } from \"../types/common.js\";\nimport type { DismissAnnouncementInput, HeartbeatResponse } from \"../types/heartbeat.js\";\nimport { HeartbeatPoller } from \"../workflows/heartbeat-poller.js\";\nimport type { HeartbeatPollerOptions } from \"../workflows/types.js\";\n\nexport class HeartbeatResource extends Resource {\n private _poller: HeartbeatPoller | null = null;\n\n /** Send a heartbeat ping. Returns pending jobs, earnings, suggested actions, and announcements. */\n async ping() {\n const res = await this.request<ApiSuccessResponse<HeartbeatResponse>>(\n \"GET\",\n \"/api/heartbeat\",\n );\n return res.data;\n }\n\n /** Dismiss an announcement so it no longer appears in heartbeat responses. */\n async dismissAnnouncement(input: DismissAnnouncementInput) {\n const res = await this.request<ApiSuccessResponse<{ dismissed: true }>>(\n \"POST\",\n \"/api/heartbeat/dismiss\",\n { body: input },\n );\n return res.data;\n }\n\n /** Start the heartbeat poller. Creates it lazily if needed. Returns the poller instance. */\n start(options?: HeartbeatPollerOptions): HeartbeatPoller {\n if (!this._poller) {\n this._poller = new HeartbeatPoller(this.client, options);\n }\n this._poller.start(options);\n return this._poller;\n }\n\n /** Stop the heartbeat poller. */\n stop(): void {\n this._poller?.stop();\n }\n\n /** Single heartbeat ping (alias for ping). */\n async once(): Promise<HeartbeatResponse> {\n return this.ping();\n }\n}\n","import type { MoltMarketClient } from \"../client.js\";\nimport type { InvoiceResponse } from \"../types/payments.js\";\nimport type { JobResponse } from \"../types/jobs.js\";\nimport { waitForStatus, JobTimeoutError, JobFailedError } from \"./job-workflows.js\";\nimport type { ConsumeOptions, ConsumeResult } from \"./types.js\";\n\n// ── Errors ──────────────────────────────────────────────────────\n\nexport class PaymentError extends Error {\n readonly invoice?: InvoiceResponse;\n readonly job?: JobResponse;\n\n constructor(\n message: string,\n options?: { invoice?: InvoiceResponse; job?: JobResponse },\n ) {\n super(message);\n this.name = \"PaymentError\";\n this.invoice = options?.invoice;\n this.job = options?.job;\n }\n}\n\n// ── Pre-payment flows ───────────────────────────────────────────\n\nconst PREPAY_FLOWS = new Set([\"prepaid\", \"prepaid_platform\", \"escrow\"]);\n\n// ── consume ─────────────────────────────────────────────────────\n\n/**\n * End-to-end consumer workflow: create a job, handle payment, and wait for completion.\n */\nexport async function consume(\n client: MoltMarketClient,\n serviceId: string,\n input: Record<string, unknown>,\n options?: ConsumeOptions,\n): Promise<ConsumeResult> {\n const timeoutMs = options?.timeoutMs ?? 300_000;\n const pollMs = options?.pollMs ?? 2_000;\n const paymentFlow = options?.paymentFlow;\n const deadline = Date.now() + timeoutMs;\n\n const remainingMs = () => Math.max(0, deadline - Date.now());\n\n const waitOpts = (overrideTimeout?: number) => ({\n pollMs,\n timeoutMs: overrideTimeout ?? remainingMs(),\n });\n\n // 1. Create job\n const job = await client.jobs.create({\n serviceId,\n input,\n bidAmountMsats: options?.bidAmountMsats,\n });\n\n options?.onStatusChange?.(\"pending\", job);\n\n let invoice: InvoiceResponse | undefined;\n let paymentVerified = false;\n\n const isPrepay = paymentFlow\n ? PREPAY_FLOWS.has(paymentFlow)\n : false;\n\n // 2. Wait for accepted\n let current = await waitForStatus(client, job.id, \"accepted\", waitOpts());\n options?.onStatusChange?.(\"accepted\", current);\n\n if (isPrepay) {\n // 3a. Pre-payment: wait for awaiting_payment, then pay\n current = await waitForStatus(\n client,\n job.id,\n \"awaiting_payment\",\n waitOpts(),\n );\n options?.onStatusChange?.(\"awaiting_payment\", current);\n\n invoice = await client.payments.createInvoice({ jobId: job.id });\n if (!options?.onInvoice) {\n throw new PaymentError(\n \"onInvoice callback required for pre-payment flows\",\n { invoice, job: current },\n );\n }\n await options.onInvoice(invoice);\n\n // Poll payment verification\n paymentVerified = await pollPaymentVerification(\n client,\n invoice.paymentHash,\n pollMs,\n remainingMs(),\n );\n }\n\n // 4. Wait for completed\n current = await waitForStatus(client, job.id, \"completed\", waitOpts());\n options?.onStatusChange?.(\"completed\", current);\n\n if (!isPrepay) {\n // 5. Post-payment: create invoice after completion\n invoice = await client.payments.createInvoice({ jobId: job.id });\n if (!options?.onInvoice) {\n throw new PaymentError(\n \"onInvoice callback required to complete payment\",\n { invoice, job: current },\n );\n }\n await options.onInvoice(invoice);\n\n paymentVerified = await pollPaymentVerification(\n client,\n invoice.paymentHash,\n pollMs,\n remainingMs(),\n );\n }\n\n // 6. Escrow: confirm to release funds\n if (paymentFlow === \"escrow\") {\n current = await client.jobs.updateStatus(job.id, { status: \"confirmed\" });\n options?.onStatusChange?.(\"confirmed\", current);\n }\n\n return {\n job: current,\n output: current.output,\n invoice,\n paymentVerified,\n };\n}\n\n// ── Helpers ─────────────────────────────────────────────────────\n\nasync function pollPaymentVerification(\n client: MoltMarketClient,\n paymentHash: string,\n pollMs: number,\n timeoutMs: number,\n): Promise<boolean> {\n const deadline = Date.now() + timeoutMs;\n\n while (Date.now() < deadline) {\n const result = await client.payments.verify(paymentHash);\n if (result.settled) return true;\n await new Promise((r) => setTimeout(r, pollMs));\n }\n\n return false;\n}\n\n// Re-export errors used in consume context\nexport { JobTimeoutError, JobFailedError };\n","import { createError } from \"./errors.js\";\nimport { AgentsResource } from \"./resources/agents.js\";\nimport { ServicesResource } from \"./resources/services.js\";\nimport { JobsResource } from \"./resources/jobs.js\";\nimport { PaymentsResource } from \"./resources/payments.js\";\nimport { DisputesResource } from \"./resources/disputes.js\";\nimport { DashboardResource } from \"./resources/dashboard.js\";\nimport { MarketplaceResource } from \"./resources/marketplace.js\";\nimport { HeartbeatResource } from \"./resources/heartbeat.js\";\nimport { consume as consumeFn } from \"./workflows/consumer.js\";\nimport type { ConsumeOptions, ConsumeResult } from \"./workflows/types.js\";\n\n// ── Config ──────────────────────────────────────────────────────\n\nexport interface MoltMarketClientConfig {\n /** Base URL of the MoltMarket API (e.g. \"https://moltmarket.com\") */\n baseUrl: string;\n /** API key for authenticated requests (mm_...) */\n apiKey?: string;\n /** Optional custom fetch implementation */\n fetch?: typeof globalThis.fetch;\n}\n\n// ── Client ──────────────────────────────────────────────────────\n\nexport class MoltMarketClient {\n private readonly baseUrl: string;\n private apiKey: string | undefined;\n private readonly fetch: typeof globalThis.fetch;\n\n readonly agents: AgentsResource;\n readonly services: ServicesResource;\n readonly jobs: JobsResource;\n readonly payments: PaymentsResource;\n readonly disputes: DisputesResource;\n readonly dashboard: DashboardResource;\n readonly marketplace: MarketplaceResource;\n readonly heartbeat: HeartbeatResource;\n\n constructor(config: MoltMarketClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/+$/, \"\");\n this.apiKey = config.apiKey;\n this.fetch = config.fetch ?? globalThis.fetch.bind(globalThis);\n\n this.agents = new AgentsResource(this);\n this.services = new ServicesResource(this);\n this.jobs = new JobsResource(this);\n this.payments = new PaymentsResource(this);\n this.disputes = new DisputesResource(this);\n this.dashboard = new DashboardResource(this);\n this.marketplace = new MarketplaceResource(this);\n this.heartbeat = new HeartbeatResource(this);\n }\n\n /** Update the API key (e.g. after registration). */\n setApiKey(apiKey: string) {\n this.apiKey = apiKey;\n }\n\n /** End-to-end consumer workflow: create a job, handle payment, and wait for completion. */\n async consume(\n serviceId: string,\n input: Record<string, unknown>,\n options?: ConsumeOptions,\n ): Promise<ConsumeResult> {\n return consumeFn(this, serviceId, input, options);\n }\n\n /** Health check — returns true if the API is reachable. */\n async health(): Promise<boolean> {\n try {\n await this.request(\"GET\", \"/api/health\");\n return true;\n } catch {\n return false;\n }\n }\n\n // ── Internal HTTP helpers ───────────────────────────────────\n\n /** @internal */\n async request<T>(\n method: string,\n path: string,\n options?: {\n body?: unknown;\n params?: Record<string, string | number | boolean | undefined>;\n auth?: boolean;\n },\n ): Promise<T> {\n const url = new URL(path, this.baseUrl);\n\n if (options?.params) {\n for (const [key, value] of Object.entries(options.params)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n const headers: Record<string, string> = {};\n const needsAuth = options?.auth !== false && this.apiKey;\n if (needsAuth) {\n headers[\"x-api-key\"] = this.apiKey!;\n }\n\n if (options?.body !== undefined) {\n headers[\"content-type\"] = \"application/json\";\n }\n\n const response = await this.fetch(url.toString(), {\n method,\n headers,\n body: options?.body !== undefined ? JSON.stringify(options.body) : undefined,\n });\n\n if (!response.ok) {\n let errorBody;\n try {\n errorBody = await response.json();\n } catch {\n errorBody = {\n error: \"UNKNOWN\",\n message: response.statusText,\n statusCode: response.status,\n };\n }\n throw createError(errorBody);\n }\n\n return response.json() as Promise<T>;\n }\n}\n"],"mappings":"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","names":[]}
|