maritime-sdk 0.2.0 → 0.2.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.cjs +18 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +18 -3
- package/dist/index.js.map +1 -1
- package/package.json +6 -5
package/dist/index.cjs
CHANGED
|
@@ -374,13 +374,26 @@ function toCreateBody(p) {
|
|
|
374
374
|
}
|
|
375
375
|
|
|
376
376
|
// src/resources/keys.ts
|
|
377
|
+
function normalize(k) {
|
|
378
|
+
return {
|
|
379
|
+
id: k.id,
|
|
380
|
+
name: k.name,
|
|
381
|
+
keyPrefix: k.key_prefix,
|
|
382
|
+
scopes: k.scopes,
|
|
383
|
+
isActive: k.is_active,
|
|
384
|
+
lastUsedAt: k.last_used_at,
|
|
385
|
+
expiresAt: k.expires_at,
|
|
386
|
+
createdAt: k.created_at,
|
|
387
|
+
rawKey: k.raw_key
|
|
388
|
+
};
|
|
389
|
+
}
|
|
377
390
|
var KeysResource = class {
|
|
378
391
|
constructor(http) {
|
|
379
392
|
this.http = http;
|
|
380
393
|
}
|
|
381
|
-
/** Mint a new key. The raw key is returned once — store it
|
|
394
|
+
/** Mint a new key. The raw key (`rawKey`) is returned once — store it now. */
|
|
382
395
|
async create(params) {
|
|
383
|
-
|
|
396
|
+
const raw = await this.http.request({
|
|
384
397
|
method: "POST",
|
|
385
398
|
path: "/api/v1/keys",
|
|
386
399
|
body: {
|
|
@@ -389,10 +402,12 @@ var KeysResource = class {
|
|
|
389
402
|
expires_in_days: params.expiresInDays
|
|
390
403
|
}
|
|
391
404
|
});
|
|
405
|
+
return normalize(raw);
|
|
392
406
|
}
|
|
393
407
|
/** List the caller's keys (raw values are never returned again). */
|
|
394
408
|
async list() {
|
|
395
|
-
|
|
409
|
+
const raw = await this.http.request({ method: "GET", path: "/api/v1/keys" });
|
|
410
|
+
return raw.map(normalize);
|
|
396
411
|
}
|
|
397
412
|
/** Revoke a key by id. */
|
|
398
413
|
async revoke(keyId) {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/http.ts","../src/resources/agents.ts","../src/resources/keys.ts","../src/resources/webhooks.ts"],"sourcesContent":["import { HttpClient, type MaritimeClientOptions } from './http.js'\nimport { AgentsResource } from './resources/agents.js'\nimport { KeysResource } from './resources/keys.js'\nimport { WebhooksResource } from './resources/webhooks.js'\n\nexport type { MaritimeClientOptions } from './http.js'\nexport * from './types.js'\nexport {\n MaritimeError,\n MaritimeConnectionError,\n MaritimeAPIError,\n MaritimeAuthError,\n MaritimePaymentRequiredError,\n MaritimeNotFoundError,\n MaritimeConflictError,\n MaritimeRateLimitError,\n} from './errors.js'\n\n/**\n * The Maritime client. Provision and drive AI agents on Maritime's serverless\n * infrastructure from your own backend.\n *\n * ```ts\n * import { Maritime } from 'maritime-sdk'\n *\n * const maritime = new Maritime({ apiKey: process.env.MARITIME_API_KEY })\n *\n * // When YOUR user signs up, give them their own agent (idempotent):\n * const agent = await maritime.agents.provision({\n * externalId: `customer_${userId}`,\n * name: `assistant-${userId}`,\n * template: 'openclaw',\n * })\n *\n * const { response } = await maritime.agents.chat(agent.id, 'Hello!')\n * ```\n */\nexport class Maritime {\n readonly agents: AgentsResource\n readonly keys: KeysResource\n readonly webhooks: WebhooksResource\n /** The underlying transport — escape hatch for endpoints not yet wrapped. */\n readonly http: HttpClient\n\n constructor(options: MaritimeClientOptions = {}) {\n this.http = new HttpClient(options)\n this.agents = new AgentsResource(this.http)\n this.keys = new KeysResource(this.http)\n this.webhooks = new WebhooksResource(this.http)\n }\n}\n\nexport default Maritime\n","/** Base class for every error the SDK throws. Catch this to catch them all. */\nexport class MaritimeError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'MaritimeError'\n // Restore prototype chain when compiled to ES5-ish targets.\n Object.setPrototypeOf(this, new.target.prototype)\n }\n}\n\n/** The request never reached Maritime (DNS, connection refused, timeout, …). */\nexport class MaritimeConnectionError extends MaritimeError {\n readonly cause?: unknown\n constructor(message: string, cause?: unknown) {\n super(message)\n this.name = 'MaritimeConnectionError'\n this.cause = cause\n }\n}\n\n/** Maritime returned a non-2xx response. Subclassed by status below. */\nexport class MaritimeAPIError extends MaritimeError {\n readonly status: number\n readonly detail: string\n /** Value of the `x-request-id` response header, when present. */\n readonly requestId?: string\n\n constructor(status: number, detail: string, requestId?: string) {\n super(`Maritime API error ${status}: ${detail}`)\n this.name = 'MaritimeAPIError'\n this.status = status\n this.detail = detail\n this.requestId = requestId\n }\n}\n\n/** 401 / 403 — bad or insufficiently-scoped API key. */\nexport class MaritimeAuthError extends MaritimeAPIError {\n constructor(status: number, detail: string, requestId?: string) {\n super(status, detail, requestId)\n this.name = 'MaritimeAuthError'\n }\n}\n\n/** 402 — the account wallet needs funding before this action can proceed. */\nexport class MaritimePaymentRequiredError extends MaritimeAPIError {\n constructor(status: number, detail: string, requestId?: string) {\n super(status, detail, requestId)\n this.name = 'MaritimePaymentRequiredError'\n }\n}\n\n/** 404 — the agent (or other resource) does not exist or is not yours. */\nexport class MaritimeNotFoundError extends MaritimeAPIError {\n constructor(status: number, detail: string, requestId?: string) {\n super(status, detail, requestId)\n this.name = 'MaritimeNotFoundError'\n }\n}\n\n/** 409 — a uniqueness conflict (e.g. an agent with that name already exists). */\nexport class MaritimeConflictError extends MaritimeAPIError {\n constructor(status: number, detail: string, requestId?: string) {\n super(status, detail, requestId)\n this.name = 'MaritimeConflictError'\n }\n}\n\n/** 429 — rate limited. */\nexport class MaritimeRateLimitError extends MaritimeAPIError {\n constructor(status: number, detail: string, requestId?: string) {\n super(status, detail, requestId)\n this.name = 'MaritimeRateLimitError'\n }\n}\n\n/** Build the most specific error subclass for an HTTP status. */\nexport function apiErrorFromStatus(\n status: number,\n detail: string,\n requestId?: string,\n): MaritimeAPIError {\n switch (status) {\n case 401:\n case 403:\n return new MaritimeAuthError(status, detail, requestId)\n case 402:\n return new MaritimePaymentRequiredError(status, detail, requestId)\n case 404:\n return new MaritimeNotFoundError(status, detail, requestId)\n case 409:\n return new MaritimeConflictError(status, detail, requestId)\n case 429:\n return new MaritimeRateLimitError(status, detail, requestId)\n default:\n return new MaritimeAPIError(status, detail, requestId)\n }\n}\n","import { apiErrorFromStatus, MaritimeConnectionError, MaritimeError } from './errors.js'\n\nexport interface MaritimeClientOptions {\n /**\n * Maritime API key (`mk_...`). Defaults to the `MARITIME_API_KEY` env var.\n * Mint one from the dashboard (Settings → API keys) or `maritime keys create`.\n */\n apiKey?: string\n /** API base URL. Defaults to `MARITIME_API_URL` or `https://api.maritime.sh`. */\n baseUrl?: string\n /** Per-request timeout in ms (default 60_000). */\n timeout?: number\n /** Retries on network errors and 5xx/429 responses (default 2). */\n maxRetries?: number\n /** Inject a custom fetch (tests, proxies, non-global-fetch runtimes). */\n fetch?: typeof fetch\n /** Extra headers sent on every request. */\n defaultHeaders?: Record<string, string>\n}\n\ninterface RequestOptions {\n method: string\n path: string\n query?: Record<string, string | number | boolean | undefined | null>\n body?: unknown\n /** Override retry behaviour for a single call (e.g. non-idempotent POST). */\n idempotent?: boolean\n}\n\nconst DEFAULT_BASE_URL = 'https://api.maritime.sh'\nconst RETRYABLE_STATUS = new Set([429, 500, 502, 503, 504])\n\nfunction resolveApiKey(explicit?: string): string {\n const key = explicit ?? (typeof process !== 'undefined' ? process.env?.MARITIME_API_KEY : undefined)\n if (!key) {\n throw new MaritimeError(\n 'Missing Maritime API key. Pass { apiKey } to the client or set MARITIME_API_KEY.',\n )\n }\n return key\n}\n\nfunction resolveBaseUrl(explicit?: string): string {\n const url =\n explicit ??\n (typeof process !== 'undefined' ? process.env?.MARITIME_API_URL : undefined) ??\n DEFAULT_BASE_URL\n return url.replace(/\\/+$/, '')\n}\n\nconst sleep = (ms: number) => new Promise((r) => setTimeout(r, ms))\n\n/**\n * Thin transport: auth header, JSON encode/decode, typed errors, and bounded\n * retry with exponential backoff on transient failures. No dependencies —\n * uses the runtime's global `fetch` (Node 18+, Bun, Deno, browsers, edge).\n */\nexport class HttpClient {\n private readonly apiKey: string\n private readonly baseUrl: string\n private readonly timeout: number\n private readonly maxRetries: number\n private readonly fetchImpl: typeof fetch\n private readonly defaultHeaders: Record<string, string>\n\n constructor(options: MaritimeClientOptions = {}) {\n this.apiKey = resolveApiKey(options.apiKey)\n this.baseUrl = resolveBaseUrl(options.baseUrl)\n this.timeout = options.timeout ?? 60_000\n this.maxRetries = options.maxRetries ?? 2\n const f = options.fetch ?? (typeof fetch !== 'undefined' ? fetch : undefined)\n if (!f) {\n throw new MaritimeError(\n 'No global fetch available. Use Node 18+, or pass a { fetch } implementation.',\n )\n }\n // Bind so `this` inside native fetch stays correct.\n this.fetchImpl = f.bind(globalThis) as typeof fetch\n this.defaultHeaders = options.defaultHeaders ?? {}\n }\n\n private buildUrl(path: string, query?: RequestOptions['query']): string {\n const url = new URL(this.baseUrl + path)\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v !== undefined && v !== null) url.searchParams.set(k, String(v))\n }\n }\n return url.toString()\n }\n\n async request<T>(opts: RequestOptions): Promise<T> {\n const url = this.buildUrl(opts.path, opts.query)\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.apiKey}`,\n Accept: 'application/json',\n 'User-Agent': 'maritime-sdk',\n ...this.defaultHeaders,\n }\n const init: RequestInit = { method: opts.method, headers }\n if (opts.body !== undefined) {\n headers['Content-Type'] = 'application/json'\n init.body = JSON.stringify(opts.body)\n }\n\n // GET/DELETE are idempotent and safe to retry; POST/PUT retry only on\n // network errors + 429/503 (never on a 5xx that may have applied a write),\n // unless the caller explicitly marks the call idempotent.\n const method = opts.method.toUpperCase()\n const retrySafe = opts.idempotent ?? (method === 'GET' || method === 'DELETE')\n\n let lastErr: unknown\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), this.timeout)\n\n let res: Response\n try {\n res = await this.fetchImpl(url, { ...init, signal: controller.signal })\n } catch (err) {\n // Transport-level failure (DNS, connection, timeout/abort). Retry.\n clearTimeout(timer)\n lastErr = err\n if (attempt < this.maxRetries) {\n await sleep(this.backoff(attempt))\n continue\n }\n const reason = err instanceof Error ? err.message : String(err)\n throw new MaritimeConnectionError(\n `Failed to reach Maritime at ${this.baseUrl}: ${reason}`,\n err,\n )\n }\n clearTimeout(timer)\n\n if (res.ok) return (await this.parseBody(res)) as T\n\n const detail = await this.safeDetail(res)\n const requestId = res.headers.get('x-request-id') ?? undefined\n const retryable =\n attempt < this.maxRetries &&\n RETRYABLE_STATUS.has(res.status) &&\n (retrySafe || res.status === 429 || res.status === 503)\n if (retryable) {\n lastErr = apiErrorFromStatus(res.status, detail, requestId)\n await sleep(this.backoff(attempt, res))\n continue\n }\n throw apiErrorFromStatus(res.status, detail, requestId)\n }\n\n // Exhausted retries on a retryable HTTP status.\n if (lastErr instanceof MaritimeError) throw lastErr\n throw new MaritimeConnectionError(`Request to ${url} failed after retries`, lastErr)\n }\n\n private backoff(attempt: number, res?: Response): number {\n // Honour Retry-After (seconds) when the server sends it.\n const retryAfter = res?.headers.get('retry-after')\n if (retryAfter) {\n const secs = Number(retryAfter)\n if (!Number.isNaN(secs)) return Math.min(secs * 1000, 20_000)\n }\n return Math.min(500 * 2 ** attempt, 8_000)\n }\n\n private async parseBody(res: Response): Promise<unknown> {\n if (res.status === 204) return undefined\n const text = await res.text()\n if (!text) return undefined\n try {\n return JSON.parse(text)\n } catch {\n return text\n }\n }\n\n private async safeDetail(res: Response): Promise<string> {\n try {\n const body = await this.parseBody(res)\n if (body && typeof body === 'object' && 'detail' in body) {\n const d = (body as { detail: unknown }).detail\n if (typeof d === 'string') return d\n return JSON.stringify(d)\n }\n if (typeof body === 'string' && body) return body\n } catch {\n /* fall through */\n }\n return `Request failed with status ${res.status}`\n }\n}\n","import type { HttpClient } from '../http.js'\nimport type {\n Agent,\n ChatOptions,\n ChatResult,\n CreateAgentParams,\n EnvVar,\n ListAgentsParams,\n LogEntry,\n} from '../types.js'\n\n/** Operations on Maritime agents. Access via `maritime.agents`. */\nexport class AgentsResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Create a new agent and kick off its deploy. */\n async create(params: CreateAgentParams): Promise<Agent> {\n return this.http.request<Agent>({\n method: 'POST',\n path: '/api/agents',\n body: toCreateBody(params),\n })\n }\n\n /**\n * Get-or-create an agent by `externalId` — the idempotent entry point for a\n * \"one agent per end-customer\" flow. If an agent with that external id\n * already exists it is returned; otherwise a new one is created. Safe to call\n * on every sign-in.\n */\n async provision(params: CreateAgentParams & { externalId: string }): Promise<Agent> {\n const existing = await this.list({ externalId: params.externalId })\n if (existing.length > 0) return existing[0] as Agent\n // Default the template so we never create a broken bare-framework agent.\n const withTemplate: CreateAgentParams = {\n template: 'openclaw',\n ...params,\n }\n try {\n return await this.create(withTemplate)\n } catch (err) {\n // Lost a race with a concurrent provisioner (unique-name 409). Re-read.\n const raced = await this.list({ externalId: params.externalId })\n if (raced.length > 0) return raced[0] as Agent\n throw err\n }\n }\n\n /** Fetch a single agent by id. */\n async get(agentId: string): Promise<Agent> {\n return this.http.request<Agent>({ method: 'GET', path: `/api/agents/${enc(agentId)}` })\n }\n\n /** List agents, optionally filtered by `externalId` or `name`. */\n async list(params: ListAgentsParams = {}): Promise<Agent[]> {\n return this.http.request<Agent[]>({\n method: 'GET',\n path: '/api/agents',\n query: { externalId: params.externalId, name: params.name },\n })\n }\n\n /**\n * Send a message to an agent and wait for its reply. Sleeping serverless\n * agents auto-wake. Returns `{ response }` (or `{ response: null, error }`\n * if delivery failed — Maritime does not surface that as an HTTP error).\n */\n async chat(agentId: string, message: string, opts: ChatOptions = {}): Promise<ChatResult> {\n return this.http.request<ChatResult>({\n method: 'POST',\n path: `/api/agents/${enc(agentId)}/chat`,\n body: { message, conversation_id: opts.conversationId },\n })\n }\n\n /** Start / wake an agent. */\n async start(agentId: string): Promise<Agent> {\n return this.lifecycle(agentId, 'start')\n }\n\n /** Stop an agent (container stopped, state preserved). */\n async stop(agentId: string): Promise<Agent> {\n return this.lifecycle(agentId, 'stop')\n }\n\n /** Put an agent to sleep (serverless snapshot; cheapest resting state). */\n async sleep(agentId: string): Promise<Agent> {\n return this.lifecycle(agentId, 'sleep')\n }\n\n /** Restart an agent. */\n async restart(agentId: string): Promise<Agent> {\n return this.lifecycle(agentId, 'restart')\n }\n\n /** Delete an agent and all its resources (container, volume, network). */\n async delete(agentId: string): Promise<void> {\n await this.http.request<void>({ method: 'DELETE', path: `/api/agents/${enc(agentId)}` })\n }\n\n /** List an agent's env vars (secret values are masked). */\n async listEnv(agentId: string): Promise<EnvVar[]> {\n return this.http.request<EnvVar[]>({ method: 'GET', path: `/api/agents/${enc(agentId)}/env` })\n }\n\n /**\n * Set (upsert) an env var. Secrets are encrypted at rest. Changes reach a\n * running container after {@link reloadEnv} or a restart.\n */\n async setEnv(\n agentId: string,\n key: string,\n value: string,\n opts: { secret?: boolean } = {},\n ): Promise<EnvVar> {\n return this.http.request<EnvVar>({\n method: 'POST',\n path: `/api/agents/${enc(agentId)}/env`,\n body: { key, value, isSecret: opts.secret ?? true },\n })\n }\n\n /** Delete an env var. */\n async deleteEnv(agentId: string, key: string): Promise<void> {\n await this.http.request<void>({\n method: 'DELETE',\n path: `/api/agents/${enc(agentId)}/env/${enc(key)}`,\n })\n }\n\n /** Hot-reload env vars into the running container (falls back to restart). */\n async reloadEnv(agentId: string): Promise<Agent> {\n return this.lifecycle(agentId, 'reload-env')\n }\n\n /** Fetch recent log entries for an agent. */\n async logs(\n agentId: string,\n opts: { limit?: number; level?: string } = {},\n ): Promise<LogEntry[]> {\n return this.http.request<LogEntry[]>({\n method: 'GET',\n path: `/api/agents/${enc(agentId)}/logs`,\n query: { limit: opts.limit, level: opts.level },\n })\n }\n\n private lifecycle(agentId: string, action: string): Promise<Agent> {\n return this.http.request<Agent>({\n method: 'POST',\n path: `/api/agents/${enc(agentId)}/${action}`,\n // Lifecycle transitions are effectively idempotent; safe to retry.\n idempotent: true,\n })\n }\n}\n\nconst enc = encodeURIComponent\n\nfunction toCreateBody(p: CreateAgentParams): Record<string, unknown> {\n return {\n name: p.name,\n templateId: p.template,\n externalId: p.externalId,\n description: p.description,\n instructions: p.instructions,\n tier: p.tier,\n memMb: p.memMb,\n vcpus: p.vcpus,\n idleTtlSeconds: p.idleTtlSeconds,\n diskGb: p.diskGb,\n githubRepo: p.githubRepo,\n imageName: p.imageName,\n initialEnvVars: p.env?.map((e) => ({\n key: e.key,\n value: e.value,\n isSecret: e.secret ?? true,\n })),\n }\n}\n","import type { HttpClient } from '../http.js'\nimport type { ApiKey, CreatedApiKey, CreateApiKeyParams } from '../types.js'\n\n/**\n * Manage API keys (`mk_...`) programmatically. Access via `maritime.keys`.\n *\n * Minting a key requires the caller's own key to carry the `manage` scope (or\n * be a dashboard session). Hand a narrower-scoped key to a subsystem that only\n * needs part of the surface — e.g. a `deploy`-scoped key for a worker that only\n * chats to agents.\n */\nexport class KeysResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Mint a new key. The raw key is returned once — store it immediately. */\n async create(params: CreateApiKeyParams): Promise<CreatedApiKey> {\n return this.http.request<CreatedApiKey>({\n method: 'POST',\n path: '/api/v1/keys',\n body: {\n name: params.name,\n scopes: params.scopes ?? ['provision', 'deploy', 'secrets', 'manage'],\n expires_in_days: params.expiresInDays,\n },\n })\n }\n\n /** List the caller's keys (raw values are never returned again). */\n async list(): Promise<ApiKey[]> {\n return this.http.request<ApiKey[]>({ method: 'GET', path: '/api/v1/keys' })\n }\n\n /** Revoke a key by id. */\n async revoke(keyId: string): Promise<void> {\n await this.http.request<void>({ method: 'DELETE', path: `/api/v1/keys/${encodeURIComponent(keyId)}` })\n }\n}\n","import type { HttpClient } from '../http.js'\nimport type { CreatedWebhook, CreateWebhookParams, Webhook, WebhookTestResult } from '../types.js'\n\n/**\n * Manage outbound webhook subscriptions. Access via `maritime.webhooks`.\n *\n * Subscribe a URL to receive signed agent lifecycle events (agent.deployed,\n * agent.error, agent.sleeping, agent.woken, agent.restarted, agent.stopped)\n * instead of polling. Each delivery carries an `X-Maritime-Signature:\n * sha256=<hmac>` header — verify it with the subscription's secret. The event\n * body includes the agent's `external_id` so you can route to your own customer.\n */\nexport class WebhooksResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Create a subscription. The signing `secret` is returned once. */\n async create(params: CreateWebhookParams): Promise<CreatedWebhook> {\n return this.http.request<CreatedWebhook>({\n method: 'POST',\n path: '/api/v1/webhooks',\n body: { url: params.url, events: params.events ?? [] },\n })\n }\n\n /** List your subscriptions (secrets are never returned again). */\n async list(): Promise<Webhook[]> {\n return this.http.request<Webhook[]>({ method: 'GET', path: '/api/v1/webhooks' })\n }\n\n /** Delete a subscription. */\n async delete(id: string): Promise<void> {\n await this.http.request<void>({\n method: 'DELETE',\n path: `/api/v1/webhooks/${encodeURIComponent(id)}`,\n })\n }\n\n /** Send a synthetic `ping` to the subscription's URL and return the result. */\n async test(id: string): Promise<WebhookTestResult> {\n return this.http.request<WebhookTestResult>({\n method: 'POST',\n path: `/api/v1/webhooks/${encodeURIComponent(id)}/test`,\n })\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/http.ts","../src/resources/agents.ts","../src/resources/keys.ts","../src/resources/webhooks.ts"],"sourcesContent":["import { HttpClient, type MaritimeClientOptions } from './http.js'\nimport { AgentsResource } from './resources/agents.js'\nimport { KeysResource } from './resources/keys.js'\nimport { WebhooksResource } from './resources/webhooks.js'\n\nexport type { MaritimeClientOptions } from './http.js'\nexport * from './types.js'\nexport {\n MaritimeError,\n MaritimeConnectionError,\n MaritimeAPIError,\n MaritimeAuthError,\n MaritimePaymentRequiredError,\n MaritimeNotFoundError,\n MaritimeConflictError,\n MaritimeRateLimitError,\n} from './errors.js'\n\n/**\n * The Maritime client. Provision and drive AI agents on Maritime's serverless\n * infrastructure from your own backend.\n *\n * ```ts\n * import { Maritime } from 'maritime-sdk'\n *\n * const maritime = new Maritime({ apiKey: process.env.MARITIME_API_KEY })\n *\n * // When YOUR user signs up, give them their own agent (idempotent):\n * const agent = await maritime.agents.provision({\n * externalId: `customer_${userId}`,\n * name: `assistant-${userId}`,\n * template: 'openclaw',\n * })\n *\n * const { response } = await maritime.agents.chat(agent.id, 'Hello!')\n * ```\n */\nexport class Maritime {\n readonly agents: AgentsResource\n readonly keys: KeysResource\n readonly webhooks: WebhooksResource\n /** The underlying transport — escape hatch for endpoints not yet wrapped. */\n readonly http: HttpClient\n\n constructor(options: MaritimeClientOptions = {}) {\n this.http = new HttpClient(options)\n this.agents = new AgentsResource(this.http)\n this.keys = new KeysResource(this.http)\n this.webhooks = new WebhooksResource(this.http)\n }\n}\n\nexport default Maritime\n","/** Base class for every error the SDK throws. Catch this to catch them all. */\nexport class MaritimeError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'MaritimeError'\n // Restore prototype chain when compiled to ES5-ish targets.\n Object.setPrototypeOf(this, new.target.prototype)\n }\n}\n\n/** The request never reached Maritime (DNS, connection refused, timeout, …). */\nexport class MaritimeConnectionError extends MaritimeError {\n readonly cause?: unknown\n constructor(message: string, cause?: unknown) {\n super(message)\n this.name = 'MaritimeConnectionError'\n this.cause = cause\n }\n}\n\n/** Maritime returned a non-2xx response. Subclassed by status below. */\nexport class MaritimeAPIError extends MaritimeError {\n readonly status: number\n readonly detail: string\n /** Value of the `x-request-id` response header, when present. */\n readonly requestId?: string\n\n constructor(status: number, detail: string, requestId?: string) {\n super(`Maritime API error ${status}: ${detail}`)\n this.name = 'MaritimeAPIError'\n this.status = status\n this.detail = detail\n this.requestId = requestId\n }\n}\n\n/** 401 / 403 — bad or insufficiently-scoped API key. */\nexport class MaritimeAuthError extends MaritimeAPIError {\n constructor(status: number, detail: string, requestId?: string) {\n super(status, detail, requestId)\n this.name = 'MaritimeAuthError'\n }\n}\n\n/** 402 — the account wallet needs funding before this action can proceed. */\nexport class MaritimePaymentRequiredError extends MaritimeAPIError {\n constructor(status: number, detail: string, requestId?: string) {\n super(status, detail, requestId)\n this.name = 'MaritimePaymentRequiredError'\n }\n}\n\n/** 404 — the agent (or other resource) does not exist or is not yours. */\nexport class MaritimeNotFoundError extends MaritimeAPIError {\n constructor(status: number, detail: string, requestId?: string) {\n super(status, detail, requestId)\n this.name = 'MaritimeNotFoundError'\n }\n}\n\n/** 409 — a uniqueness conflict (e.g. an agent with that name already exists). */\nexport class MaritimeConflictError extends MaritimeAPIError {\n constructor(status: number, detail: string, requestId?: string) {\n super(status, detail, requestId)\n this.name = 'MaritimeConflictError'\n }\n}\n\n/** 429 — rate limited. */\nexport class MaritimeRateLimitError extends MaritimeAPIError {\n constructor(status: number, detail: string, requestId?: string) {\n super(status, detail, requestId)\n this.name = 'MaritimeRateLimitError'\n }\n}\n\n/** Build the most specific error subclass for an HTTP status. */\nexport function apiErrorFromStatus(\n status: number,\n detail: string,\n requestId?: string,\n): MaritimeAPIError {\n switch (status) {\n case 401:\n case 403:\n return new MaritimeAuthError(status, detail, requestId)\n case 402:\n return new MaritimePaymentRequiredError(status, detail, requestId)\n case 404:\n return new MaritimeNotFoundError(status, detail, requestId)\n case 409:\n return new MaritimeConflictError(status, detail, requestId)\n case 429:\n return new MaritimeRateLimitError(status, detail, requestId)\n default:\n return new MaritimeAPIError(status, detail, requestId)\n }\n}\n","import { apiErrorFromStatus, MaritimeConnectionError, MaritimeError } from './errors.js'\n\nexport interface MaritimeClientOptions {\n /**\n * Maritime API key (`mk_...`). Defaults to the `MARITIME_API_KEY` env var.\n * Mint one from the dashboard (Settings → API keys) or `maritime keys create`.\n */\n apiKey?: string\n /** API base URL. Defaults to `MARITIME_API_URL` or `https://api.maritime.sh`. */\n baseUrl?: string\n /** Per-request timeout in ms (default 60_000). */\n timeout?: number\n /** Retries on network errors and 5xx/429 responses (default 2). */\n maxRetries?: number\n /** Inject a custom fetch (tests, proxies, non-global-fetch runtimes). */\n fetch?: typeof fetch\n /** Extra headers sent on every request. */\n defaultHeaders?: Record<string, string>\n}\n\ninterface RequestOptions {\n method: string\n path: string\n query?: Record<string, string | number | boolean | undefined | null>\n body?: unknown\n /** Override retry behaviour for a single call (e.g. non-idempotent POST). */\n idempotent?: boolean\n}\n\nconst DEFAULT_BASE_URL = 'https://api.maritime.sh'\nconst RETRYABLE_STATUS = new Set([429, 500, 502, 503, 504])\n\nfunction resolveApiKey(explicit?: string): string {\n const key = explicit ?? (typeof process !== 'undefined' ? process.env?.MARITIME_API_KEY : undefined)\n if (!key) {\n throw new MaritimeError(\n 'Missing Maritime API key. Pass { apiKey } to the client or set MARITIME_API_KEY.',\n )\n }\n return key\n}\n\nfunction resolveBaseUrl(explicit?: string): string {\n const url =\n explicit ??\n (typeof process !== 'undefined' ? process.env?.MARITIME_API_URL : undefined) ??\n DEFAULT_BASE_URL\n return url.replace(/\\/+$/, '')\n}\n\nconst sleep = (ms: number) => new Promise((r) => setTimeout(r, ms))\n\n/**\n * Thin transport: auth header, JSON encode/decode, typed errors, and bounded\n * retry with exponential backoff on transient failures. No dependencies —\n * uses the runtime's global `fetch` (Node 18+, Bun, Deno, browsers, edge).\n */\nexport class HttpClient {\n private readonly apiKey: string\n private readonly baseUrl: string\n private readonly timeout: number\n private readonly maxRetries: number\n private readonly fetchImpl: typeof fetch\n private readonly defaultHeaders: Record<string, string>\n\n constructor(options: MaritimeClientOptions = {}) {\n this.apiKey = resolveApiKey(options.apiKey)\n this.baseUrl = resolveBaseUrl(options.baseUrl)\n this.timeout = options.timeout ?? 60_000\n this.maxRetries = options.maxRetries ?? 2\n const f = options.fetch ?? (typeof fetch !== 'undefined' ? fetch : undefined)\n if (!f) {\n throw new MaritimeError(\n 'No global fetch available. Use Node 18+, or pass a { fetch } implementation.',\n )\n }\n // Bind so `this` inside native fetch stays correct.\n this.fetchImpl = f.bind(globalThis) as typeof fetch\n this.defaultHeaders = options.defaultHeaders ?? {}\n }\n\n private buildUrl(path: string, query?: RequestOptions['query']): string {\n const url = new URL(this.baseUrl + path)\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v !== undefined && v !== null) url.searchParams.set(k, String(v))\n }\n }\n return url.toString()\n }\n\n async request<T>(opts: RequestOptions): Promise<T> {\n const url = this.buildUrl(opts.path, opts.query)\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.apiKey}`,\n Accept: 'application/json',\n 'User-Agent': 'maritime-sdk',\n ...this.defaultHeaders,\n }\n const init: RequestInit = { method: opts.method, headers }\n if (opts.body !== undefined) {\n headers['Content-Type'] = 'application/json'\n init.body = JSON.stringify(opts.body)\n }\n\n // GET/DELETE are idempotent and safe to retry; POST/PUT retry only on\n // network errors + 429/503 (never on a 5xx that may have applied a write),\n // unless the caller explicitly marks the call idempotent.\n const method = opts.method.toUpperCase()\n const retrySafe = opts.idempotent ?? (method === 'GET' || method === 'DELETE')\n\n let lastErr: unknown\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), this.timeout)\n\n let res: Response\n try {\n res = await this.fetchImpl(url, { ...init, signal: controller.signal })\n } catch (err) {\n // Transport-level failure (DNS, connection, timeout/abort). Retry.\n clearTimeout(timer)\n lastErr = err\n if (attempt < this.maxRetries) {\n await sleep(this.backoff(attempt))\n continue\n }\n const reason = err instanceof Error ? err.message : String(err)\n throw new MaritimeConnectionError(\n `Failed to reach Maritime at ${this.baseUrl}: ${reason}`,\n err,\n )\n }\n clearTimeout(timer)\n\n if (res.ok) return (await this.parseBody(res)) as T\n\n const detail = await this.safeDetail(res)\n const requestId = res.headers.get('x-request-id') ?? undefined\n const retryable =\n attempt < this.maxRetries &&\n RETRYABLE_STATUS.has(res.status) &&\n (retrySafe || res.status === 429 || res.status === 503)\n if (retryable) {\n lastErr = apiErrorFromStatus(res.status, detail, requestId)\n await sleep(this.backoff(attempt, res))\n continue\n }\n throw apiErrorFromStatus(res.status, detail, requestId)\n }\n\n // Exhausted retries on a retryable HTTP status.\n if (lastErr instanceof MaritimeError) throw lastErr\n throw new MaritimeConnectionError(`Request to ${url} failed after retries`, lastErr)\n }\n\n private backoff(attempt: number, res?: Response): number {\n // Honour Retry-After (seconds) when the server sends it.\n const retryAfter = res?.headers.get('retry-after')\n if (retryAfter) {\n const secs = Number(retryAfter)\n if (!Number.isNaN(secs)) return Math.min(secs * 1000, 20_000)\n }\n return Math.min(500 * 2 ** attempt, 8_000)\n }\n\n private async parseBody(res: Response): Promise<unknown> {\n if (res.status === 204) return undefined\n const text = await res.text()\n if (!text) return undefined\n try {\n return JSON.parse(text)\n } catch {\n return text\n }\n }\n\n private async safeDetail(res: Response): Promise<string> {\n try {\n const body = await this.parseBody(res)\n if (body && typeof body === 'object' && 'detail' in body) {\n const d = (body as { detail: unknown }).detail\n if (typeof d === 'string') return d\n return JSON.stringify(d)\n }\n if (typeof body === 'string' && body) return body\n } catch {\n /* fall through */\n }\n return `Request failed with status ${res.status}`\n }\n}\n","import type { HttpClient } from '../http.js'\nimport type {\n Agent,\n ChatOptions,\n ChatResult,\n CreateAgentParams,\n EnvVar,\n ListAgentsParams,\n LogEntry,\n} from '../types.js'\n\n/** Operations on Maritime agents. Access via `maritime.agents`. */\nexport class AgentsResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Create a new agent and kick off its deploy. */\n async create(params: CreateAgentParams): Promise<Agent> {\n return this.http.request<Agent>({\n method: 'POST',\n path: '/api/agents',\n body: toCreateBody(params),\n })\n }\n\n /**\n * Get-or-create an agent by `externalId` — the idempotent entry point for a\n * \"one agent per end-customer\" flow. If an agent with that external id\n * already exists it is returned; otherwise a new one is created. Safe to call\n * on every sign-in.\n */\n async provision(params: CreateAgentParams & { externalId: string }): Promise<Agent> {\n const existing = await this.list({ externalId: params.externalId })\n if (existing.length > 0) return existing[0] as Agent\n // Default the template so we never create a broken bare-framework agent.\n const withTemplate: CreateAgentParams = {\n template: 'openclaw',\n ...params,\n }\n try {\n return await this.create(withTemplate)\n } catch (err) {\n // Lost a race with a concurrent provisioner (unique-name 409). Re-read.\n const raced = await this.list({ externalId: params.externalId })\n if (raced.length > 0) return raced[0] as Agent\n throw err\n }\n }\n\n /** Fetch a single agent by id. */\n async get(agentId: string): Promise<Agent> {\n return this.http.request<Agent>({ method: 'GET', path: `/api/agents/${enc(agentId)}` })\n }\n\n /** List agents, optionally filtered by `externalId` or `name`. */\n async list(params: ListAgentsParams = {}): Promise<Agent[]> {\n return this.http.request<Agent[]>({\n method: 'GET',\n path: '/api/agents',\n query: { externalId: params.externalId, name: params.name },\n })\n }\n\n /**\n * Send a message to an agent and wait for its reply. Sleeping serverless\n * agents auto-wake. Returns `{ response }` (or `{ response: null, error }`\n * if delivery failed — Maritime does not surface that as an HTTP error).\n */\n async chat(agentId: string, message: string, opts: ChatOptions = {}): Promise<ChatResult> {\n return this.http.request<ChatResult>({\n method: 'POST',\n path: `/api/agents/${enc(agentId)}/chat`,\n body: { message, conversation_id: opts.conversationId },\n })\n }\n\n /** Start / wake an agent. */\n async start(agentId: string): Promise<Agent> {\n return this.lifecycle(agentId, 'start')\n }\n\n /** Stop an agent (container stopped, state preserved). */\n async stop(agentId: string): Promise<Agent> {\n return this.lifecycle(agentId, 'stop')\n }\n\n /** Put an agent to sleep (serverless snapshot; cheapest resting state). */\n async sleep(agentId: string): Promise<Agent> {\n return this.lifecycle(agentId, 'sleep')\n }\n\n /** Restart an agent. */\n async restart(agentId: string): Promise<Agent> {\n return this.lifecycle(agentId, 'restart')\n }\n\n /** Delete an agent and all its resources (container, volume, network). */\n async delete(agentId: string): Promise<void> {\n await this.http.request<void>({ method: 'DELETE', path: `/api/agents/${enc(agentId)}` })\n }\n\n /** List an agent's env vars (secret values are masked). */\n async listEnv(agentId: string): Promise<EnvVar[]> {\n return this.http.request<EnvVar[]>({ method: 'GET', path: `/api/agents/${enc(agentId)}/env` })\n }\n\n /**\n * Set (upsert) an env var. Secrets are encrypted at rest. Changes reach a\n * running container after {@link reloadEnv} or a restart.\n */\n async setEnv(\n agentId: string,\n key: string,\n value: string,\n opts: { secret?: boolean } = {},\n ): Promise<EnvVar> {\n return this.http.request<EnvVar>({\n method: 'POST',\n path: `/api/agents/${enc(agentId)}/env`,\n body: { key, value, isSecret: opts.secret ?? true },\n })\n }\n\n /** Delete an env var. */\n async deleteEnv(agentId: string, key: string): Promise<void> {\n await this.http.request<void>({\n method: 'DELETE',\n path: `/api/agents/${enc(agentId)}/env/${enc(key)}`,\n })\n }\n\n /** Hot-reload env vars into the running container (falls back to restart). */\n async reloadEnv(agentId: string): Promise<Agent> {\n return this.lifecycle(agentId, 'reload-env')\n }\n\n /** Fetch recent log entries for an agent. */\n async logs(\n agentId: string,\n opts: { limit?: number; level?: string } = {},\n ): Promise<LogEntry[]> {\n return this.http.request<LogEntry[]>({\n method: 'GET',\n path: `/api/agents/${enc(agentId)}/logs`,\n query: { limit: opts.limit, level: opts.level },\n })\n }\n\n private lifecycle(agentId: string, action: string): Promise<Agent> {\n return this.http.request<Agent>({\n method: 'POST',\n path: `/api/agents/${enc(agentId)}/${action}`,\n // Lifecycle transitions are effectively idempotent; safe to retry.\n idempotent: true,\n })\n }\n}\n\nconst enc = encodeURIComponent\n\nfunction toCreateBody(p: CreateAgentParams): Record<string, unknown> {\n return {\n name: p.name,\n templateId: p.template,\n externalId: p.externalId,\n description: p.description,\n instructions: p.instructions,\n tier: p.tier,\n memMb: p.memMb,\n vcpus: p.vcpus,\n idleTtlSeconds: p.idleTtlSeconds,\n diskGb: p.diskGb,\n githubRepo: p.githubRepo,\n imageName: p.imageName,\n initialEnvVars: p.env?.map((e) => ({\n key: e.key,\n value: e.value,\n isSecret: e.secret ?? true,\n })),\n }\n}\n","import type { HttpClient } from '../http.js'\nimport type { ApiKey, CreatedApiKey, CreateApiKeyParams } from '../types.js'\n\n/** Raw /api/v1/keys response — this endpoint serializes snake_case (unlike the\n * rest of the API, which is camelCase). We normalize it below so the SDK\n * presents one consistent camelCase shape. */\ninterface RawApiKey {\n id: string\n name: string\n key_prefix: string\n scopes: string[]\n is_active: boolean\n last_used_at: string | null\n expires_at: string | null\n created_at: string\n raw_key?: string\n}\n\nfunction normalize(k: RawApiKey): CreatedApiKey {\n return {\n id: k.id,\n name: k.name,\n keyPrefix: k.key_prefix,\n scopes: k.scopes,\n isActive: k.is_active,\n lastUsedAt: k.last_used_at,\n expiresAt: k.expires_at,\n createdAt: k.created_at,\n rawKey: k.raw_key as string,\n }\n}\n\n/**\n * Manage API keys (`mk_...`) programmatically. Access via `maritime.keys`.\n *\n * Minting a key requires the caller's own key to carry the `manage` scope (or\n * be a dashboard session). Hand a narrower-scoped key to a subsystem that only\n * needs part of the surface — e.g. a `deploy`-scoped key for a worker that only\n * chats to agents.\n */\nexport class KeysResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Mint a new key. The raw key (`rawKey`) is returned once — store it now. */\n async create(params: CreateApiKeyParams): Promise<CreatedApiKey> {\n const raw = await this.http.request<RawApiKey>({\n method: 'POST',\n path: '/api/v1/keys',\n body: {\n name: params.name,\n scopes: params.scopes ?? ['provision', 'deploy', 'secrets', 'manage'],\n expires_in_days: params.expiresInDays,\n },\n })\n return normalize(raw)\n }\n\n /** List the caller's keys (raw values are never returned again). */\n async list(): Promise<ApiKey[]> {\n const raw = await this.http.request<RawApiKey[]>({ method: 'GET', path: '/api/v1/keys' })\n return raw.map(normalize)\n }\n\n /** Revoke a key by id. */\n async revoke(keyId: string): Promise<void> {\n await this.http.request<void>({ method: 'DELETE', path: `/api/v1/keys/${encodeURIComponent(keyId)}` })\n }\n}\n","import type { HttpClient } from '../http.js'\nimport type { CreatedWebhook, CreateWebhookParams, Webhook, WebhookTestResult } from '../types.js'\n\n/**\n * Manage outbound webhook subscriptions. Access via `maritime.webhooks`.\n *\n * Subscribe a URL to receive signed agent lifecycle events (agent.deployed,\n * agent.error, agent.sleeping, agent.woken, agent.restarted, agent.stopped)\n * instead of polling. Each delivery carries an `X-Maritime-Signature:\n * sha256=<hmac>` header — verify it with the subscription's secret. The event\n * body includes the agent's `external_id` so you can route to your own customer.\n */\nexport class WebhooksResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Create a subscription. The signing `secret` is returned once. */\n async create(params: CreateWebhookParams): Promise<CreatedWebhook> {\n return this.http.request<CreatedWebhook>({\n method: 'POST',\n path: '/api/v1/webhooks',\n body: { url: params.url, events: params.events ?? [] },\n })\n }\n\n /** List your subscriptions (secrets are never returned again). */\n async list(): Promise<Webhook[]> {\n return this.http.request<Webhook[]>({ method: 'GET', path: '/api/v1/webhooks' })\n }\n\n /** Delete a subscription. */\n async delete(id: string): Promise<void> {\n await this.http.request<void>({\n method: 'DELETE',\n path: `/api/v1/webhooks/${encodeURIComponent(id)}`,\n })\n }\n\n /** Send a synthetic `ping` to the subscription's URL and return the result. */\n async test(id: string): Promise<WebhookTestResult> {\n return this.http.request<WebhookTestResult>({\n method: 'POST',\n path: `/api/v1/webhooks/${encodeURIComponent(id)}/test`,\n })\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.d.cts
CHANGED
|
@@ -237,7 +237,7 @@ declare class AgentsResource {
|
|
|
237
237
|
declare class KeysResource {
|
|
238
238
|
private readonly http;
|
|
239
239
|
constructor(http: HttpClient);
|
|
240
|
-
/** Mint a new key. The raw key is returned once — store it
|
|
240
|
+
/** Mint a new key. The raw key (`rawKey`) is returned once — store it now. */
|
|
241
241
|
create(params: CreateApiKeyParams): Promise<CreatedApiKey>;
|
|
242
242
|
/** List the caller's keys (raw values are never returned again). */
|
|
243
243
|
list(): Promise<ApiKey[]>;
|
package/dist/index.d.ts
CHANGED
|
@@ -237,7 +237,7 @@ declare class AgentsResource {
|
|
|
237
237
|
declare class KeysResource {
|
|
238
238
|
private readonly http;
|
|
239
239
|
constructor(http: HttpClient);
|
|
240
|
-
/** Mint a new key. The raw key is returned once — store it
|
|
240
|
+
/** Mint a new key. The raw key (`rawKey`) is returned once — store it now. */
|
|
241
241
|
create(params: CreateApiKeyParams): Promise<CreatedApiKey>;
|
|
242
242
|
/** List the caller's keys (raw values are never returned again). */
|
|
243
243
|
list(): Promise<ApiKey[]>;
|
package/dist/index.js
CHANGED
|
@@ -339,13 +339,26 @@ function toCreateBody(p) {
|
|
|
339
339
|
}
|
|
340
340
|
|
|
341
341
|
// src/resources/keys.ts
|
|
342
|
+
function normalize(k) {
|
|
343
|
+
return {
|
|
344
|
+
id: k.id,
|
|
345
|
+
name: k.name,
|
|
346
|
+
keyPrefix: k.key_prefix,
|
|
347
|
+
scopes: k.scopes,
|
|
348
|
+
isActive: k.is_active,
|
|
349
|
+
lastUsedAt: k.last_used_at,
|
|
350
|
+
expiresAt: k.expires_at,
|
|
351
|
+
createdAt: k.created_at,
|
|
352
|
+
rawKey: k.raw_key
|
|
353
|
+
};
|
|
354
|
+
}
|
|
342
355
|
var KeysResource = class {
|
|
343
356
|
constructor(http) {
|
|
344
357
|
this.http = http;
|
|
345
358
|
}
|
|
346
|
-
/** Mint a new key. The raw key is returned once — store it
|
|
359
|
+
/** Mint a new key. The raw key (`rawKey`) is returned once — store it now. */
|
|
347
360
|
async create(params) {
|
|
348
|
-
|
|
361
|
+
const raw = await this.http.request({
|
|
349
362
|
method: "POST",
|
|
350
363
|
path: "/api/v1/keys",
|
|
351
364
|
body: {
|
|
@@ -354,10 +367,12 @@ var KeysResource = class {
|
|
|
354
367
|
expires_in_days: params.expiresInDays
|
|
355
368
|
}
|
|
356
369
|
});
|
|
370
|
+
return normalize(raw);
|
|
357
371
|
}
|
|
358
372
|
/** List the caller's keys (raw values are never returned again). */
|
|
359
373
|
async list() {
|
|
360
|
-
|
|
374
|
+
const raw = await this.http.request({ method: "GET", path: "/api/v1/keys" });
|
|
375
|
+
return raw.map(normalize);
|
|
361
376
|
}
|
|
362
377
|
/** Revoke a key by id. */
|
|
363
378
|
async revoke(keyId) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/resources/agents.ts","../src/resources/keys.ts","../src/resources/webhooks.ts","../src/index.ts"],"sourcesContent":["/** Base class for every error the SDK throws. Catch this to catch them all. */\nexport class MaritimeError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'MaritimeError'\n // Restore prototype chain when compiled to ES5-ish targets.\n Object.setPrototypeOf(this, new.target.prototype)\n }\n}\n\n/** The request never reached Maritime (DNS, connection refused, timeout, …). */\nexport class MaritimeConnectionError extends MaritimeError {\n readonly cause?: unknown\n constructor(message: string, cause?: unknown) {\n super(message)\n this.name = 'MaritimeConnectionError'\n this.cause = cause\n }\n}\n\n/** Maritime returned a non-2xx response. Subclassed by status below. */\nexport class MaritimeAPIError extends MaritimeError {\n readonly status: number\n readonly detail: string\n /** Value of the `x-request-id` response header, when present. */\n readonly requestId?: string\n\n constructor(status: number, detail: string, requestId?: string) {\n super(`Maritime API error ${status}: ${detail}`)\n this.name = 'MaritimeAPIError'\n this.status = status\n this.detail = detail\n this.requestId = requestId\n }\n}\n\n/** 401 / 403 — bad or insufficiently-scoped API key. */\nexport class MaritimeAuthError extends MaritimeAPIError {\n constructor(status: number, detail: string, requestId?: string) {\n super(status, detail, requestId)\n this.name = 'MaritimeAuthError'\n }\n}\n\n/** 402 — the account wallet needs funding before this action can proceed. */\nexport class MaritimePaymentRequiredError extends MaritimeAPIError {\n constructor(status: number, detail: string, requestId?: string) {\n super(status, detail, requestId)\n this.name = 'MaritimePaymentRequiredError'\n }\n}\n\n/** 404 — the agent (or other resource) does not exist or is not yours. */\nexport class MaritimeNotFoundError extends MaritimeAPIError {\n constructor(status: number, detail: string, requestId?: string) {\n super(status, detail, requestId)\n this.name = 'MaritimeNotFoundError'\n }\n}\n\n/** 409 — a uniqueness conflict (e.g. an agent with that name already exists). */\nexport class MaritimeConflictError extends MaritimeAPIError {\n constructor(status: number, detail: string, requestId?: string) {\n super(status, detail, requestId)\n this.name = 'MaritimeConflictError'\n }\n}\n\n/** 429 — rate limited. */\nexport class MaritimeRateLimitError extends MaritimeAPIError {\n constructor(status: number, detail: string, requestId?: string) {\n super(status, detail, requestId)\n this.name = 'MaritimeRateLimitError'\n }\n}\n\n/** Build the most specific error subclass for an HTTP status. */\nexport function apiErrorFromStatus(\n status: number,\n detail: string,\n requestId?: string,\n): MaritimeAPIError {\n switch (status) {\n case 401:\n case 403:\n return new MaritimeAuthError(status, detail, requestId)\n case 402:\n return new MaritimePaymentRequiredError(status, detail, requestId)\n case 404:\n return new MaritimeNotFoundError(status, detail, requestId)\n case 409:\n return new MaritimeConflictError(status, detail, requestId)\n case 429:\n return new MaritimeRateLimitError(status, detail, requestId)\n default:\n return new MaritimeAPIError(status, detail, requestId)\n }\n}\n","import { apiErrorFromStatus, MaritimeConnectionError, MaritimeError } from './errors.js'\n\nexport interface MaritimeClientOptions {\n /**\n * Maritime API key (`mk_...`). Defaults to the `MARITIME_API_KEY` env var.\n * Mint one from the dashboard (Settings → API keys) or `maritime keys create`.\n */\n apiKey?: string\n /** API base URL. Defaults to `MARITIME_API_URL` or `https://api.maritime.sh`. */\n baseUrl?: string\n /** Per-request timeout in ms (default 60_000). */\n timeout?: number\n /** Retries on network errors and 5xx/429 responses (default 2). */\n maxRetries?: number\n /** Inject a custom fetch (tests, proxies, non-global-fetch runtimes). */\n fetch?: typeof fetch\n /** Extra headers sent on every request. */\n defaultHeaders?: Record<string, string>\n}\n\ninterface RequestOptions {\n method: string\n path: string\n query?: Record<string, string | number | boolean | undefined | null>\n body?: unknown\n /** Override retry behaviour for a single call (e.g. non-idempotent POST). */\n idempotent?: boolean\n}\n\nconst DEFAULT_BASE_URL = 'https://api.maritime.sh'\nconst RETRYABLE_STATUS = new Set([429, 500, 502, 503, 504])\n\nfunction resolveApiKey(explicit?: string): string {\n const key = explicit ?? (typeof process !== 'undefined' ? process.env?.MARITIME_API_KEY : undefined)\n if (!key) {\n throw new MaritimeError(\n 'Missing Maritime API key. Pass { apiKey } to the client or set MARITIME_API_KEY.',\n )\n }\n return key\n}\n\nfunction resolveBaseUrl(explicit?: string): string {\n const url =\n explicit ??\n (typeof process !== 'undefined' ? process.env?.MARITIME_API_URL : undefined) ??\n DEFAULT_BASE_URL\n return url.replace(/\\/+$/, '')\n}\n\nconst sleep = (ms: number) => new Promise((r) => setTimeout(r, ms))\n\n/**\n * Thin transport: auth header, JSON encode/decode, typed errors, and bounded\n * retry with exponential backoff on transient failures. No dependencies —\n * uses the runtime's global `fetch` (Node 18+, Bun, Deno, browsers, edge).\n */\nexport class HttpClient {\n private readonly apiKey: string\n private readonly baseUrl: string\n private readonly timeout: number\n private readonly maxRetries: number\n private readonly fetchImpl: typeof fetch\n private readonly defaultHeaders: Record<string, string>\n\n constructor(options: MaritimeClientOptions = {}) {\n this.apiKey = resolveApiKey(options.apiKey)\n this.baseUrl = resolveBaseUrl(options.baseUrl)\n this.timeout = options.timeout ?? 60_000\n this.maxRetries = options.maxRetries ?? 2\n const f = options.fetch ?? (typeof fetch !== 'undefined' ? fetch : undefined)\n if (!f) {\n throw new MaritimeError(\n 'No global fetch available. Use Node 18+, or pass a { fetch } implementation.',\n )\n }\n // Bind so `this` inside native fetch stays correct.\n this.fetchImpl = f.bind(globalThis) as typeof fetch\n this.defaultHeaders = options.defaultHeaders ?? {}\n }\n\n private buildUrl(path: string, query?: RequestOptions['query']): string {\n const url = new URL(this.baseUrl + path)\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v !== undefined && v !== null) url.searchParams.set(k, String(v))\n }\n }\n return url.toString()\n }\n\n async request<T>(opts: RequestOptions): Promise<T> {\n const url = this.buildUrl(opts.path, opts.query)\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.apiKey}`,\n Accept: 'application/json',\n 'User-Agent': 'maritime-sdk',\n ...this.defaultHeaders,\n }\n const init: RequestInit = { method: opts.method, headers }\n if (opts.body !== undefined) {\n headers['Content-Type'] = 'application/json'\n init.body = JSON.stringify(opts.body)\n }\n\n // GET/DELETE are idempotent and safe to retry; POST/PUT retry only on\n // network errors + 429/503 (never on a 5xx that may have applied a write),\n // unless the caller explicitly marks the call idempotent.\n const method = opts.method.toUpperCase()\n const retrySafe = opts.idempotent ?? (method === 'GET' || method === 'DELETE')\n\n let lastErr: unknown\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), this.timeout)\n\n let res: Response\n try {\n res = await this.fetchImpl(url, { ...init, signal: controller.signal })\n } catch (err) {\n // Transport-level failure (DNS, connection, timeout/abort). Retry.\n clearTimeout(timer)\n lastErr = err\n if (attempt < this.maxRetries) {\n await sleep(this.backoff(attempt))\n continue\n }\n const reason = err instanceof Error ? err.message : String(err)\n throw new MaritimeConnectionError(\n `Failed to reach Maritime at ${this.baseUrl}: ${reason}`,\n err,\n )\n }\n clearTimeout(timer)\n\n if (res.ok) return (await this.parseBody(res)) as T\n\n const detail = await this.safeDetail(res)\n const requestId = res.headers.get('x-request-id') ?? undefined\n const retryable =\n attempt < this.maxRetries &&\n RETRYABLE_STATUS.has(res.status) &&\n (retrySafe || res.status === 429 || res.status === 503)\n if (retryable) {\n lastErr = apiErrorFromStatus(res.status, detail, requestId)\n await sleep(this.backoff(attempt, res))\n continue\n }\n throw apiErrorFromStatus(res.status, detail, requestId)\n }\n\n // Exhausted retries on a retryable HTTP status.\n if (lastErr instanceof MaritimeError) throw lastErr\n throw new MaritimeConnectionError(`Request to ${url} failed after retries`, lastErr)\n }\n\n private backoff(attempt: number, res?: Response): number {\n // Honour Retry-After (seconds) when the server sends it.\n const retryAfter = res?.headers.get('retry-after')\n if (retryAfter) {\n const secs = Number(retryAfter)\n if (!Number.isNaN(secs)) return Math.min(secs * 1000, 20_000)\n }\n return Math.min(500 * 2 ** attempt, 8_000)\n }\n\n private async parseBody(res: Response): Promise<unknown> {\n if (res.status === 204) return undefined\n const text = await res.text()\n if (!text) return undefined\n try {\n return JSON.parse(text)\n } catch {\n return text\n }\n }\n\n private async safeDetail(res: Response): Promise<string> {\n try {\n const body = await this.parseBody(res)\n if (body && typeof body === 'object' && 'detail' in body) {\n const d = (body as { detail: unknown }).detail\n if (typeof d === 'string') return d\n return JSON.stringify(d)\n }\n if (typeof body === 'string' && body) return body\n } catch {\n /* fall through */\n }\n return `Request failed with status ${res.status}`\n }\n}\n","import type { HttpClient } from '../http.js'\nimport type {\n Agent,\n ChatOptions,\n ChatResult,\n CreateAgentParams,\n EnvVar,\n ListAgentsParams,\n LogEntry,\n} from '../types.js'\n\n/** Operations on Maritime agents. Access via `maritime.agents`. */\nexport class AgentsResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Create a new agent and kick off its deploy. */\n async create(params: CreateAgentParams): Promise<Agent> {\n return this.http.request<Agent>({\n method: 'POST',\n path: '/api/agents',\n body: toCreateBody(params),\n })\n }\n\n /**\n * Get-or-create an agent by `externalId` — the idempotent entry point for a\n * \"one agent per end-customer\" flow. If an agent with that external id\n * already exists it is returned; otherwise a new one is created. Safe to call\n * on every sign-in.\n */\n async provision(params: CreateAgentParams & { externalId: string }): Promise<Agent> {\n const existing = await this.list({ externalId: params.externalId })\n if (existing.length > 0) return existing[0] as Agent\n // Default the template so we never create a broken bare-framework agent.\n const withTemplate: CreateAgentParams = {\n template: 'openclaw',\n ...params,\n }\n try {\n return await this.create(withTemplate)\n } catch (err) {\n // Lost a race with a concurrent provisioner (unique-name 409). Re-read.\n const raced = await this.list({ externalId: params.externalId })\n if (raced.length > 0) return raced[0] as Agent\n throw err\n }\n }\n\n /** Fetch a single agent by id. */\n async get(agentId: string): Promise<Agent> {\n return this.http.request<Agent>({ method: 'GET', path: `/api/agents/${enc(agentId)}` })\n }\n\n /** List agents, optionally filtered by `externalId` or `name`. */\n async list(params: ListAgentsParams = {}): Promise<Agent[]> {\n return this.http.request<Agent[]>({\n method: 'GET',\n path: '/api/agents',\n query: { externalId: params.externalId, name: params.name },\n })\n }\n\n /**\n * Send a message to an agent and wait for its reply. Sleeping serverless\n * agents auto-wake. Returns `{ response }` (or `{ response: null, error }`\n * if delivery failed — Maritime does not surface that as an HTTP error).\n */\n async chat(agentId: string, message: string, opts: ChatOptions = {}): Promise<ChatResult> {\n return this.http.request<ChatResult>({\n method: 'POST',\n path: `/api/agents/${enc(agentId)}/chat`,\n body: { message, conversation_id: opts.conversationId },\n })\n }\n\n /** Start / wake an agent. */\n async start(agentId: string): Promise<Agent> {\n return this.lifecycle(agentId, 'start')\n }\n\n /** Stop an agent (container stopped, state preserved). */\n async stop(agentId: string): Promise<Agent> {\n return this.lifecycle(agentId, 'stop')\n }\n\n /** Put an agent to sleep (serverless snapshot; cheapest resting state). */\n async sleep(agentId: string): Promise<Agent> {\n return this.lifecycle(agentId, 'sleep')\n }\n\n /** Restart an agent. */\n async restart(agentId: string): Promise<Agent> {\n return this.lifecycle(agentId, 'restart')\n }\n\n /** Delete an agent and all its resources (container, volume, network). */\n async delete(agentId: string): Promise<void> {\n await this.http.request<void>({ method: 'DELETE', path: `/api/agents/${enc(agentId)}` })\n }\n\n /** List an agent's env vars (secret values are masked). */\n async listEnv(agentId: string): Promise<EnvVar[]> {\n return this.http.request<EnvVar[]>({ method: 'GET', path: `/api/agents/${enc(agentId)}/env` })\n }\n\n /**\n * Set (upsert) an env var. Secrets are encrypted at rest. Changes reach a\n * running container after {@link reloadEnv} or a restart.\n */\n async setEnv(\n agentId: string,\n key: string,\n value: string,\n opts: { secret?: boolean } = {},\n ): Promise<EnvVar> {\n return this.http.request<EnvVar>({\n method: 'POST',\n path: `/api/agents/${enc(agentId)}/env`,\n body: { key, value, isSecret: opts.secret ?? true },\n })\n }\n\n /** Delete an env var. */\n async deleteEnv(agentId: string, key: string): Promise<void> {\n await this.http.request<void>({\n method: 'DELETE',\n path: `/api/agents/${enc(agentId)}/env/${enc(key)}`,\n })\n }\n\n /** Hot-reload env vars into the running container (falls back to restart). */\n async reloadEnv(agentId: string): Promise<Agent> {\n return this.lifecycle(agentId, 'reload-env')\n }\n\n /** Fetch recent log entries for an agent. */\n async logs(\n agentId: string,\n opts: { limit?: number; level?: string } = {},\n ): Promise<LogEntry[]> {\n return this.http.request<LogEntry[]>({\n method: 'GET',\n path: `/api/agents/${enc(agentId)}/logs`,\n query: { limit: opts.limit, level: opts.level },\n })\n }\n\n private lifecycle(agentId: string, action: string): Promise<Agent> {\n return this.http.request<Agent>({\n method: 'POST',\n path: `/api/agents/${enc(agentId)}/${action}`,\n // Lifecycle transitions are effectively idempotent; safe to retry.\n idempotent: true,\n })\n }\n}\n\nconst enc = encodeURIComponent\n\nfunction toCreateBody(p: CreateAgentParams): Record<string, unknown> {\n return {\n name: p.name,\n templateId: p.template,\n externalId: p.externalId,\n description: p.description,\n instructions: p.instructions,\n tier: p.tier,\n memMb: p.memMb,\n vcpus: p.vcpus,\n idleTtlSeconds: p.idleTtlSeconds,\n diskGb: p.diskGb,\n githubRepo: p.githubRepo,\n imageName: p.imageName,\n initialEnvVars: p.env?.map((e) => ({\n key: e.key,\n value: e.value,\n isSecret: e.secret ?? true,\n })),\n }\n}\n","import type { HttpClient } from '../http.js'\nimport type { ApiKey, CreatedApiKey, CreateApiKeyParams } from '../types.js'\n\n/**\n * Manage API keys (`mk_...`) programmatically. Access via `maritime.keys`.\n *\n * Minting a key requires the caller's own key to carry the `manage` scope (or\n * be a dashboard session). Hand a narrower-scoped key to a subsystem that only\n * needs part of the surface — e.g. a `deploy`-scoped key for a worker that only\n * chats to agents.\n */\nexport class KeysResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Mint a new key. The raw key is returned once — store it immediately. */\n async create(params: CreateApiKeyParams): Promise<CreatedApiKey> {\n return this.http.request<CreatedApiKey>({\n method: 'POST',\n path: '/api/v1/keys',\n body: {\n name: params.name,\n scopes: params.scopes ?? ['provision', 'deploy', 'secrets', 'manage'],\n expires_in_days: params.expiresInDays,\n },\n })\n }\n\n /** List the caller's keys (raw values are never returned again). */\n async list(): Promise<ApiKey[]> {\n return this.http.request<ApiKey[]>({ method: 'GET', path: '/api/v1/keys' })\n }\n\n /** Revoke a key by id. */\n async revoke(keyId: string): Promise<void> {\n await this.http.request<void>({ method: 'DELETE', path: `/api/v1/keys/${encodeURIComponent(keyId)}` })\n }\n}\n","import type { HttpClient } from '../http.js'\nimport type { CreatedWebhook, CreateWebhookParams, Webhook, WebhookTestResult } from '../types.js'\n\n/**\n * Manage outbound webhook subscriptions. Access via `maritime.webhooks`.\n *\n * Subscribe a URL to receive signed agent lifecycle events (agent.deployed,\n * agent.error, agent.sleeping, agent.woken, agent.restarted, agent.stopped)\n * instead of polling. Each delivery carries an `X-Maritime-Signature:\n * sha256=<hmac>` header — verify it with the subscription's secret. The event\n * body includes the agent's `external_id` so you can route to your own customer.\n */\nexport class WebhooksResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Create a subscription. The signing `secret` is returned once. */\n async create(params: CreateWebhookParams): Promise<CreatedWebhook> {\n return this.http.request<CreatedWebhook>({\n method: 'POST',\n path: '/api/v1/webhooks',\n body: { url: params.url, events: params.events ?? [] },\n })\n }\n\n /** List your subscriptions (secrets are never returned again). */\n async list(): Promise<Webhook[]> {\n return this.http.request<Webhook[]>({ method: 'GET', path: '/api/v1/webhooks' })\n }\n\n /** Delete a subscription. */\n async delete(id: string): Promise<void> {\n await this.http.request<void>({\n method: 'DELETE',\n path: `/api/v1/webhooks/${encodeURIComponent(id)}`,\n })\n }\n\n /** Send a synthetic `ping` to the subscription's URL and return the result. */\n async test(id: string): Promise<WebhookTestResult> {\n return this.http.request<WebhookTestResult>({\n method: 'POST',\n path: `/api/v1/webhooks/${encodeURIComponent(id)}/test`,\n })\n }\n}\n","import { HttpClient, type MaritimeClientOptions } from './http.js'\nimport { AgentsResource } from './resources/agents.js'\nimport { KeysResource } from './resources/keys.js'\nimport { WebhooksResource } from './resources/webhooks.js'\n\nexport type { MaritimeClientOptions } from './http.js'\nexport * from './types.js'\nexport {\n MaritimeError,\n MaritimeConnectionError,\n MaritimeAPIError,\n MaritimeAuthError,\n MaritimePaymentRequiredError,\n MaritimeNotFoundError,\n MaritimeConflictError,\n MaritimeRateLimitError,\n} from './errors.js'\n\n/**\n * The Maritime client. Provision and drive AI agents on Maritime's serverless\n * infrastructure from your own backend.\n *\n * ```ts\n * import { Maritime } from 'maritime-sdk'\n *\n * const maritime = new Maritime({ apiKey: process.env.MARITIME_API_KEY })\n *\n * // When YOUR user signs up, give them their own agent (idempotent):\n * const agent = await maritime.agents.provision({\n * externalId: `customer_${userId}`,\n * name: `assistant-${userId}`,\n * template: 'openclaw',\n * })\n *\n * const { response } = await maritime.agents.chat(agent.id, 'Hello!')\n * ```\n */\nexport class Maritime {\n readonly agents: AgentsResource\n readonly keys: KeysResource\n readonly webhooks: WebhooksResource\n /** The underlying transport — escape hatch for endpoints not yet wrapped. */\n readonly http: HttpClient\n\n constructor(options: MaritimeClientOptions = {}) {\n this.http = new HttpClient(options)\n this.agents = new AgentsResource(this.http)\n this.keys = new KeysResource(this.http)\n this.webhooks = new WebhooksResource(this.http)\n }\n}\n\nexport default Maritime\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/resources/agents.ts","../src/resources/keys.ts","../src/resources/webhooks.ts","../src/index.ts"],"sourcesContent":["/** Base class for every error the SDK throws. Catch this to catch them all. */\nexport class MaritimeError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'MaritimeError'\n // Restore prototype chain when compiled to ES5-ish targets.\n Object.setPrototypeOf(this, new.target.prototype)\n }\n}\n\n/** The request never reached Maritime (DNS, connection refused, timeout, …). */\nexport class MaritimeConnectionError extends MaritimeError {\n readonly cause?: unknown\n constructor(message: string, cause?: unknown) {\n super(message)\n this.name = 'MaritimeConnectionError'\n this.cause = cause\n }\n}\n\n/** Maritime returned a non-2xx response. Subclassed by status below. */\nexport class MaritimeAPIError extends MaritimeError {\n readonly status: number\n readonly detail: string\n /** Value of the `x-request-id` response header, when present. */\n readonly requestId?: string\n\n constructor(status: number, detail: string, requestId?: string) {\n super(`Maritime API error ${status}: ${detail}`)\n this.name = 'MaritimeAPIError'\n this.status = status\n this.detail = detail\n this.requestId = requestId\n }\n}\n\n/** 401 / 403 — bad or insufficiently-scoped API key. */\nexport class MaritimeAuthError extends MaritimeAPIError {\n constructor(status: number, detail: string, requestId?: string) {\n super(status, detail, requestId)\n this.name = 'MaritimeAuthError'\n }\n}\n\n/** 402 — the account wallet needs funding before this action can proceed. */\nexport class MaritimePaymentRequiredError extends MaritimeAPIError {\n constructor(status: number, detail: string, requestId?: string) {\n super(status, detail, requestId)\n this.name = 'MaritimePaymentRequiredError'\n }\n}\n\n/** 404 — the agent (or other resource) does not exist or is not yours. */\nexport class MaritimeNotFoundError extends MaritimeAPIError {\n constructor(status: number, detail: string, requestId?: string) {\n super(status, detail, requestId)\n this.name = 'MaritimeNotFoundError'\n }\n}\n\n/** 409 — a uniqueness conflict (e.g. an agent with that name already exists). */\nexport class MaritimeConflictError extends MaritimeAPIError {\n constructor(status: number, detail: string, requestId?: string) {\n super(status, detail, requestId)\n this.name = 'MaritimeConflictError'\n }\n}\n\n/** 429 — rate limited. */\nexport class MaritimeRateLimitError extends MaritimeAPIError {\n constructor(status: number, detail: string, requestId?: string) {\n super(status, detail, requestId)\n this.name = 'MaritimeRateLimitError'\n }\n}\n\n/** Build the most specific error subclass for an HTTP status. */\nexport function apiErrorFromStatus(\n status: number,\n detail: string,\n requestId?: string,\n): MaritimeAPIError {\n switch (status) {\n case 401:\n case 403:\n return new MaritimeAuthError(status, detail, requestId)\n case 402:\n return new MaritimePaymentRequiredError(status, detail, requestId)\n case 404:\n return new MaritimeNotFoundError(status, detail, requestId)\n case 409:\n return new MaritimeConflictError(status, detail, requestId)\n case 429:\n return new MaritimeRateLimitError(status, detail, requestId)\n default:\n return new MaritimeAPIError(status, detail, requestId)\n }\n}\n","import { apiErrorFromStatus, MaritimeConnectionError, MaritimeError } from './errors.js'\n\nexport interface MaritimeClientOptions {\n /**\n * Maritime API key (`mk_...`). Defaults to the `MARITIME_API_KEY` env var.\n * Mint one from the dashboard (Settings → API keys) or `maritime keys create`.\n */\n apiKey?: string\n /** API base URL. Defaults to `MARITIME_API_URL` or `https://api.maritime.sh`. */\n baseUrl?: string\n /** Per-request timeout in ms (default 60_000). */\n timeout?: number\n /** Retries on network errors and 5xx/429 responses (default 2). */\n maxRetries?: number\n /** Inject a custom fetch (tests, proxies, non-global-fetch runtimes). */\n fetch?: typeof fetch\n /** Extra headers sent on every request. */\n defaultHeaders?: Record<string, string>\n}\n\ninterface RequestOptions {\n method: string\n path: string\n query?: Record<string, string | number | boolean | undefined | null>\n body?: unknown\n /** Override retry behaviour for a single call (e.g. non-idempotent POST). */\n idempotent?: boolean\n}\n\nconst DEFAULT_BASE_URL = 'https://api.maritime.sh'\nconst RETRYABLE_STATUS = new Set([429, 500, 502, 503, 504])\n\nfunction resolveApiKey(explicit?: string): string {\n const key = explicit ?? (typeof process !== 'undefined' ? process.env?.MARITIME_API_KEY : undefined)\n if (!key) {\n throw new MaritimeError(\n 'Missing Maritime API key. Pass { apiKey } to the client or set MARITIME_API_KEY.',\n )\n }\n return key\n}\n\nfunction resolveBaseUrl(explicit?: string): string {\n const url =\n explicit ??\n (typeof process !== 'undefined' ? process.env?.MARITIME_API_URL : undefined) ??\n DEFAULT_BASE_URL\n return url.replace(/\\/+$/, '')\n}\n\nconst sleep = (ms: number) => new Promise((r) => setTimeout(r, ms))\n\n/**\n * Thin transport: auth header, JSON encode/decode, typed errors, and bounded\n * retry with exponential backoff on transient failures. No dependencies —\n * uses the runtime's global `fetch` (Node 18+, Bun, Deno, browsers, edge).\n */\nexport class HttpClient {\n private readonly apiKey: string\n private readonly baseUrl: string\n private readonly timeout: number\n private readonly maxRetries: number\n private readonly fetchImpl: typeof fetch\n private readonly defaultHeaders: Record<string, string>\n\n constructor(options: MaritimeClientOptions = {}) {\n this.apiKey = resolveApiKey(options.apiKey)\n this.baseUrl = resolveBaseUrl(options.baseUrl)\n this.timeout = options.timeout ?? 60_000\n this.maxRetries = options.maxRetries ?? 2\n const f = options.fetch ?? (typeof fetch !== 'undefined' ? fetch : undefined)\n if (!f) {\n throw new MaritimeError(\n 'No global fetch available. Use Node 18+, or pass a { fetch } implementation.',\n )\n }\n // Bind so `this` inside native fetch stays correct.\n this.fetchImpl = f.bind(globalThis) as typeof fetch\n this.defaultHeaders = options.defaultHeaders ?? {}\n }\n\n private buildUrl(path: string, query?: RequestOptions['query']): string {\n const url = new URL(this.baseUrl + path)\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v !== undefined && v !== null) url.searchParams.set(k, String(v))\n }\n }\n return url.toString()\n }\n\n async request<T>(opts: RequestOptions): Promise<T> {\n const url = this.buildUrl(opts.path, opts.query)\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.apiKey}`,\n Accept: 'application/json',\n 'User-Agent': 'maritime-sdk',\n ...this.defaultHeaders,\n }\n const init: RequestInit = { method: opts.method, headers }\n if (opts.body !== undefined) {\n headers['Content-Type'] = 'application/json'\n init.body = JSON.stringify(opts.body)\n }\n\n // GET/DELETE are idempotent and safe to retry; POST/PUT retry only on\n // network errors + 429/503 (never on a 5xx that may have applied a write),\n // unless the caller explicitly marks the call idempotent.\n const method = opts.method.toUpperCase()\n const retrySafe = opts.idempotent ?? (method === 'GET' || method === 'DELETE')\n\n let lastErr: unknown\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), this.timeout)\n\n let res: Response\n try {\n res = await this.fetchImpl(url, { ...init, signal: controller.signal })\n } catch (err) {\n // Transport-level failure (DNS, connection, timeout/abort). Retry.\n clearTimeout(timer)\n lastErr = err\n if (attempt < this.maxRetries) {\n await sleep(this.backoff(attempt))\n continue\n }\n const reason = err instanceof Error ? err.message : String(err)\n throw new MaritimeConnectionError(\n `Failed to reach Maritime at ${this.baseUrl}: ${reason}`,\n err,\n )\n }\n clearTimeout(timer)\n\n if (res.ok) return (await this.parseBody(res)) as T\n\n const detail = await this.safeDetail(res)\n const requestId = res.headers.get('x-request-id') ?? undefined\n const retryable =\n attempt < this.maxRetries &&\n RETRYABLE_STATUS.has(res.status) &&\n (retrySafe || res.status === 429 || res.status === 503)\n if (retryable) {\n lastErr = apiErrorFromStatus(res.status, detail, requestId)\n await sleep(this.backoff(attempt, res))\n continue\n }\n throw apiErrorFromStatus(res.status, detail, requestId)\n }\n\n // Exhausted retries on a retryable HTTP status.\n if (lastErr instanceof MaritimeError) throw lastErr\n throw new MaritimeConnectionError(`Request to ${url} failed after retries`, lastErr)\n }\n\n private backoff(attempt: number, res?: Response): number {\n // Honour Retry-After (seconds) when the server sends it.\n const retryAfter = res?.headers.get('retry-after')\n if (retryAfter) {\n const secs = Number(retryAfter)\n if (!Number.isNaN(secs)) return Math.min(secs * 1000, 20_000)\n }\n return Math.min(500 * 2 ** attempt, 8_000)\n }\n\n private async parseBody(res: Response): Promise<unknown> {\n if (res.status === 204) return undefined\n const text = await res.text()\n if (!text) return undefined\n try {\n return JSON.parse(text)\n } catch {\n return text\n }\n }\n\n private async safeDetail(res: Response): Promise<string> {\n try {\n const body = await this.parseBody(res)\n if (body && typeof body === 'object' && 'detail' in body) {\n const d = (body as { detail: unknown }).detail\n if (typeof d === 'string') return d\n return JSON.stringify(d)\n }\n if (typeof body === 'string' && body) return body\n } catch {\n /* fall through */\n }\n return `Request failed with status ${res.status}`\n }\n}\n","import type { HttpClient } from '../http.js'\nimport type {\n Agent,\n ChatOptions,\n ChatResult,\n CreateAgentParams,\n EnvVar,\n ListAgentsParams,\n LogEntry,\n} from '../types.js'\n\n/** Operations on Maritime agents. Access via `maritime.agents`. */\nexport class AgentsResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Create a new agent and kick off its deploy. */\n async create(params: CreateAgentParams): Promise<Agent> {\n return this.http.request<Agent>({\n method: 'POST',\n path: '/api/agents',\n body: toCreateBody(params),\n })\n }\n\n /**\n * Get-or-create an agent by `externalId` — the idempotent entry point for a\n * \"one agent per end-customer\" flow. If an agent with that external id\n * already exists it is returned; otherwise a new one is created. Safe to call\n * on every sign-in.\n */\n async provision(params: CreateAgentParams & { externalId: string }): Promise<Agent> {\n const existing = await this.list({ externalId: params.externalId })\n if (existing.length > 0) return existing[0] as Agent\n // Default the template so we never create a broken bare-framework agent.\n const withTemplate: CreateAgentParams = {\n template: 'openclaw',\n ...params,\n }\n try {\n return await this.create(withTemplate)\n } catch (err) {\n // Lost a race with a concurrent provisioner (unique-name 409). Re-read.\n const raced = await this.list({ externalId: params.externalId })\n if (raced.length > 0) return raced[0] as Agent\n throw err\n }\n }\n\n /** Fetch a single agent by id. */\n async get(agentId: string): Promise<Agent> {\n return this.http.request<Agent>({ method: 'GET', path: `/api/agents/${enc(agentId)}` })\n }\n\n /** List agents, optionally filtered by `externalId` or `name`. */\n async list(params: ListAgentsParams = {}): Promise<Agent[]> {\n return this.http.request<Agent[]>({\n method: 'GET',\n path: '/api/agents',\n query: { externalId: params.externalId, name: params.name },\n })\n }\n\n /**\n * Send a message to an agent and wait for its reply. Sleeping serverless\n * agents auto-wake. Returns `{ response }` (or `{ response: null, error }`\n * if delivery failed — Maritime does not surface that as an HTTP error).\n */\n async chat(agentId: string, message: string, opts: ChatOptions = {}): Promise<ChatResult> {\n return this.http.request<ChatResult>({\n method: 'POST',\n path: `/api/agents/${enc(agentId)}/chat`,\n body: { message, conversation_id: opts.conversationId },\n })\n }\n\n /** Start / wake an agent. */\n async start(agentId: string): Promise<Agent> {\n return this.lifecycle(agentId, 'start')\n }\n\n /** Stop an agent (container stopped, state preserved). */\n async stop(agentId: string): Promise<Agent> {\n return this.lifecycle(agentId, 'stop')\n }\n\n /** Put an agent to sleep (serverless snapshot; cheapest resting state). */\n async sleep(agentId: string): Promise<Agent> {\n return this.lifecycle(agentId, 'sleep')\n }\n\n /** Restart an agent. */\n async restart(agentId: string): Promise<Agent> {\n return this.lifecycle(agentId, 'restart')\n }\n\n /** Delete an agent and all its resources (container, volume, network). */\n async delete(agentId: string): Promise<void> {\n await this.http.request<void>({ method: 'DELETE', path: `/api/agents/${enc(agentId)}` })\n }\n\n /** List an agent's env vars (secret values are masked). */\n async listEnv(agentId: string): Promise<EnvVar[]> {\n return this.http.request<EnvVar[]>({ method: 'GET', path: `/api/agents/${enc(agentId)}/env` })\n }\n\n /**\n * Set (upsert) an env var. Secrets are encrypted at rest. Changes reach a\n * running container after {@link reloadEnv} or a restart.\n */\n async setEnv(\n agentId: string,\n key: string,\n value: string,\n opts: { secret?: boolean } = {},\n ): Promise<EnvVar> {\n return this.http.request<EnvVar>({\n method: 'POST',\n path: `/api/agents/${enc(agentId)}/env`,\n body: { key, value, isSecret: opts.secret ?? true },\n })\n }\n\n /** Delete an env var. */\n async deleteEnv(agentId: string, key: string): Promise<void> {\n await this.http.request<void>({\n method: 'DELETE',\n path: `/api/agents/${enc(agentId)}/env/${enc(key)}`,\n })\n }\n\n /** Hot-reload env vars into the running container (falls back to restart). */\n async reloadEnv(agentId: string): Promise<Agent> {\n return this.lifecycle(agentId, 'reload-env')\n }\n\n /** Fetch recent log entries for an agent. */\n async logs(\n agentId: string,\n opts: { limit?: number; level?: string } = {},\n ): Promise<LogEntry[]> {\n return this.http.request<LogEntry[]>({\n method: 'GET',\n path: `/api/agents/${enc(agentId)}/logs`,\n query: { limit: opts.limit, level: opts.level },\n })\n }\n\n private lifecycle(agentId: string, action: string): Promise<Agent> {\n return this.http.request<Agent>({\n method: 'POST',\n path: `/api/agents/${enc(agentId)}/${action}`,\n // Lifecycle transitions are effectively idempotent; safe to retry.\n idempotent: true,\n })\n }\n}\n\nconst enc = encodeURIComponent\n\nfunction toCreateBody(p: CreateAgentParams): Record<string, unknown> {\n return {\n name: p.name,\n templateId: p.template,\n externalId: p.externalId,\n description: p.description,\n instructions: p.instructions,\n tier: p.tier,\n memMb: p.memMb,\n vcpus: p.vcpus,\n idleTtlSeconds: p.idleTtlSeconds,\n diskGb: p.diskGb,\n githubRepo: p.githubRepo,\n imageName: p.imageName,\n initialEnvVars: p.env?.map((e) => ({\n key: e.key,\n value: e.value,\n isSecret: e.secret ?? true,\n })),\n }\n}\n","import type { HttpClient } from '../http.js'\nimport type { ApiKey, CreatedApiKey, CreateApiKeyParams } from '../types.js'\n\n/** Raw /api/v1/keys response — this endpoint serializes snake_case (unlike the\n * rest of the API, which is camelCase). We normalize it below so the SDK\n * presents one consistent camelCase shape. */\ninterface RawApiKey {\n id: string\n name: string\n key_prefix: string\n scopes: string[]\n is_active: boolean\n last_used_at: string | null\n expires_at: string | null\n created_at: string\n raw_key?: string\n}\n\nfunction normalize(k: RawApiKey): CreatedApiKey {\n return {\n id: k.id,\n name: k.name,\n keyPrefix: k.key_prefix,\n scopes: k.scopes,\n isActive: k.is_active,\n lastUsedAt: k.last_used_at,\n expiresAt: k.expires_at,\n createdAt: k.created_at,\n rawKey: k.raw_key as string,\n }\n}\n\n/**\n * Manage API keys (`mk_...`) programmatically. Access via `maritime.keys`.\n *\n * Minting a key requires the caller's own key to carry the `manage` scope (or\n * be a dashboard session). Hand a narrower-scoped key to a subsystem that only\n * needs part of the surface — e.g. a `deploy`-scoped key for a worker that only\n * chats to agents.\n */\nexport class KeysResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Mint a new key. The raw key (`rawKey`) is returned once — store it now. */\n async create(params: CreateApiKeyParams): Promise<CreatedApiKey> {\n const raw = await this.http.request<RawApiKey>({\n method: 'POST',\n path: '/api/v1/keys',\n body: {\n name: params.name,\n scopes: params.scopes ?? ['provision', 'deploy', 'secrets', 'manage'],\n expires_in_days: params.expiresInDays,\n },\n })\n return normalize(raw)\n }\n\n /** List the caller's keys (raw values are never returned again). */\n async list(): Promise<ApiKey[]> {\n const raw = await this.http.request<RawApiKey[]>({ method: 'GET', path: '/api/v1/keys' })\n return raw.map(normalize)\n }\n\n /** Revoke a key by id. */\n async revoke(keyId: string): Promise<void> {\n await this.http.request<void>({ method: 'DELETE', path: `/api/v1/keys/${encodeURIComponent(keyId)}` })\n }\n}\n","import type { HttpClient } from '../http.js'\nimport type { CreatedWebhook, CreateWebhookParams, Webhook, WebhookTestResult } from '../types.js'\n\n/**\n * Manage outbound webhook subscriptions. Access via `maritime.webhooks`.\n *\n * Subscribe a URL to receive signed agent lifecycle events (agent.deployed,\n * agent.error, agent.sleeping, agent.woken, agent.restarted, agent.stopped)\n * instead of polling. Each delivery carries an `X-Maritime-Signature:\n * sha256=<hmac>` header — verify it with the subscription's secret. The event\n * body includes the agent's `external_id` so you can route to your own customer.\n */\nexport class WebhooksResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Create a subscription. The signing `secret` is returned once. */\n async create(params: CreateWebhookParams): Promise<CreatedWebhook> {\n return this.http.request<CreatedWebhook>({\n method: 'POST',\n path: '/api/v1/webhooks',\n body: { url: params.url, events: params.events ?? [] },\n })\n }\n\n /** List your subscriptions (secrets are never returned again). */\n async list(): Promise<Webhook[]> {\n return this.http.request<Webhook[]>({ method: 'GET', path: '/api/v1/webhooks' })\n }\n\n /** Delete a subscription. */\n async delete(id: string): Promise<void> {\n await this.http.request<void>({\n method: 'DELETE',\n path: `/api/v1/webhooks/${encodeURIComponent(id)}`,\n })\n }\n\n /** Send a synthetic `ping` to the subscription's URL and return the result. */\n async test(id: string): Promise<WebhookTestResult> {\n return this.http.request<WebhookTestResult>({\n method: 'POST',\n path: `/api/v1/webhooks/${encodeURIComponent(id)}/test`,\n })\n }\n}\n","import { HttpClient, type MaritimeClientOptions } from './http.js'\nimport { AgentsResource } from './resources/agents.js'\nimport { KeysResource } from './resources/keys.js'\nimport { WebhooksResource } from './resources/webhooks.js'\n\nexport type { MaritimeClientOptions } from './http.js'\nexport * from './types.js'\nexport {\n MaritimeError,\n MaritimeConnectionError,\n MaritimeAPIError,\n MaritimeAuthError,\n MaritimePaymentRequiredError,\n MaritimeNotFoundError,\n MaritimeConflictError,\n MaritimeRateLimitError,\n} from './errors.js'\n\n/**\n * The Maritime client. Provision and drive AI agents on Maritime's serverless\n * infrastructure from your own backend.\n *\n * ```ts\n * import { Maritime } from 'maritime-sdk'\n *\n * const maritime = new Maritime({ apiKey: process.env.MARITIME_API_KEY })\n *\n * // When YOUR user signs up, give them their own agent (idempotent):\n * const agent = await maritime.agents.provision({\n * externalId: `customer_${userId}`,\n * name: `assistant-${userId}`,\n * template: 'openclaw',\n * })\n *\n * const { response } = await maritime.agents.chat(agent.id, 'Hello!')\n * ```\n */\nexport class Maritime {\n readonly agents: AgentsResource\n readonly keys: KeysResource\n readonly webhooks: WebhooksResource\n /** The underlying transport — escape hatch for endpoints not yet wrapped. */\n readonly http: HttpClient\n\n constructor(options: MaritimeClientOptions = {}) {\n this.http = new HttpClient(options)\n this.agents = new AgentsResource(this.http)\n this.keys = new KeysResource(this.http)\n this.webhooks = new WebhooksResource(this.http)\n }\n}\n\nexport default Maritime\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "maritime-sdk",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "Official TypeScript SDK for Maritime — provision and drive AI agents on Maritime's serverless infrastructure from your own backend.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"maritime",
|
|
@@ -11,14 +11,14 @@
|
|
|
11
11
|
"serverless",
|
|
12
12
|
"agent-infrastructure"
|
|
13
13
|
],
|
|
14
|
-
"homepage": "https://maritime.sh",
|
|
14
|
+
"homepage": "https://maritime.sh/docs/build",
|
|
15
15
|
"repository": {
|
|
16
16
|
"type": "git",
|
|
17
|
-
"url": "git+https://github.com/mariagorskikh/maritime.git",
|
|
18
|
-
"directory": "
|
|
17
|
+
"url": "git+https://github.com/mariagorskikh/maritime-sdk.git",
|
|
18
|
+
"directory": "typescript"
|
|
19
19
|
},
|
|
20
20
|
"bugs": {
|
|
21
|
-
"url": "https://github.com/mariagorskikh/maritime/issues"
|
|
21
|
+
"url": "https://github.com/mariagorskikh/maritime-sdk/issues"
|
|
22
22
|
},
|
|
23
23
|
"license": "MIT",
|
|
24
24
|
"author": "Maritime",
|
|
@@ -47,6 +47,7 @@
|
|
|
47
47
|
"prepublishOnly": "npm run build"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
|
+
"@types/node": "^20.19.43",
|
|
50
51
|
"tsup": "^8.3.5",
|
|
51
52
|
"typescript": "^5.6.3",
|
|
52
53
|
"vitest": "^2.1.5"
|