@hoststack.dev/sdk 0.9.2 → 0.10.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/dist/index.cjs CHANGED
@@ -185,6 +185,25 @@ var DatabasesResource = class {
185
185
  const did = await this.client.resolveId(databaseId, { kind: "database", teamId: tid });
186
186
  return this.client.request("POST", `/api/databases/${tid}/${did}/upgrade-to-ha`);
187
187
  }
188
+ /**
189
+ * In-place engine version upgrade (postgres/redis standalone). The agent
190
+ * dumps the live data, recreates the container at `version` under the same
191
+ * DNS name, and restores — so connection URLs stay valid. There's a brief
192
+ * interruption (seconds) while the new container comes up.
193
+ *
194
+ * `version` must be a supported, strictly-newer version for the engine
195
+ * (e.g. '18' for postgres, '8' for redis). Throws 400 otherwise.
196
+ *
197
+ * Returns 202 — the upgrade is async; poll `get(...)` until `version`
198
+ * matches the target and `status === 'available'` to confirm.
199
+ */
200
+ async upgradeVersion(teamId, databaseId, version) {
201
+ const tid = await this.client.resolveId(teamId, { kind: "team" });
202
+ const did = await this.client.resolveId(databaseId, { kind: "database", teamId: tid });
203
+ return this.client.request("POST", `/api/databases/${tid}/${did}/upgrade-version`, {
204
+ version
205
+ });
206
+ }
188
207
  /**
189
208
  * v89 Phase 5: cluster topology + failover history for a Patroni-managed
190
209
  * Postgres database. Returns 400 for standalone databases — call
@@ -624,6 +643,32 @@ var ServicesResource = class {
624
643
  const sid = await this.client.resolveId(serviceId, { kind: "service", teamId: tid });
625
644
  return this.client.request("DELETE", `/api/services/${tid}/${sid}`);
626
645
  }
646
+ /**
647
+ * Spin up an agentic dev environment FROM this service: a dev box that runs
648
+ * a clone of the app (repo auto-cloned into /workspace, env-vars copied, and
649
+ * the linked database cloned so it never touches prod), with an unguessable
650
+ * public dev URL and seamless `git push`. Returns the dev box, its dev URL,
651
+ * and the first deploy id.
652
+ */
653
+ async spinUpDevEnvironment(teamId, serviceId, options) {
654
+ const tid = await this.client.resolveId(teamId, { kind: "team" });
655
+ const sid = await this.client.resolveId(serviceId, { kind: "service", teamId: tid });
656
+ return this.client.request(
657
+ "POST",
658
+ `/api/services/${tid}/${sid}/dev-environment`,
659
+ options ?? {}
660
+ );
661
+ }
662
+ /**
663
+ * Tear a dev environment down: removes the dev box and cascade-deletes its
664
+ * cloned database, /workspace volume, and the empty `development`
665
+ * environment. `serviceId` is the dev box itself.
666
+ */
667
+ async tearDownDevEnvironment(teamId, serviceId) {
668
+ const tid = await this.client.resolveId(teamId, { kind: "team" });
669
+ const sid = await this.client.resolveId(serviceId, { kind: "service", teamId: tid });
670
+ return this.client.request("DELETE", `/api/services/${tid}/${sid}/dev-environment`);
671
+ }
627
672
  /** Suspend a service. */
628
673
  async suspend(teamId, serviceId) {
629
674
  const tid = await this.client.resolveId(teamId, { kind: "team" });
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/resources/cron.ts","../src/resources/databases.ts","../src/resources/deploys.ts","../src/resources/domains.ts","../src/resources/environments.ts","../src/resources/env-vars.ts","../src/resources/notifications.ts","../src/resources/projects.ts","../src/streaming.ts","../src/resources/services.ts","../src/resources/teams.ts","../src/resources/volumes.ts","../src/client.ts","../src/pagination.ts"],"names":["fetch"],"mappings":"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","file":"index.cjs","sourcesContent":["export class HostStackError extends Error {\n\tpublic readonly statusCode: number;\n\t/** Raw response body, if it parsed as JSON. Useful for surfacing field-level validation errors. */\n\tpublic readonly body: unknown;\n\n\tconstructor(statusCode: number, message: string, body?: unknown) {\n\t\tsuper(message);\n\t\tthis.name = 'HostStackError';\n\t\tthis.statusCode = statusCode;\n\t\tthis.body = body;\n\t}\n}\n\nexport class AuthenticationError extends HostStackError {\n\tconstructor(message = 'Authentication failed — check your API key.', body?: unknown) {\n\t\tsuper(401, message, body);\n\t\tthis.name = 'AuthenticationError';\n\t}\n}\n\nexport class ForbiddenError extends HostStackError {\n\tconstructor(message = 'Permission denied — API key lacks the required scope.', body?: unknown) {\n\t\tsuper(403, message, body);\n\t\tthis.name = 'ForbiddenError';\n\t}\n}\n\nexport class NotFoundError extends HostStackError {\n\tconstructor(message = 'Resource not found.', body?: unknown) {\n\t\tsuper(404, message, body);\n\t\tthis.name = 'NotFoundError';\n\t}\n}\n\nexport class ConflictError extends HostStackError {\n\tconstructor(\n\t\tmessage = 'Conflict — the resource state prevents this operation.',\n\t\tbody?: unknown,\n\t) {\n\t\tsuper(409, message, body);\n\t\tthis.name = 'ConflictError';\n\t}\n}\n\nexport class RateLimitError extends HostStackError {\n\t/**\n\t * Seconds to wait before retrying, parsed from the `Retry-After` response\n\t * header. `undefined` if the server didn't send one.\n\t */\n\tpublic readonly retryAfter: number | undefined;\n\n\tconstructor(\n\t\tmessage = 'Rate limit exceeded — back off and retry.',\n\t\tretryAfter?: number,\n\t\tbody?: unknown,\n\t) {\n\t\tsuper(429, message, body);\n\t\tthis.name = 'RateLimitError';\n\t\tthis.retryAfter = retryAfter;\n\t}\n}\n","import type { HostStack, IdInput } from '../client.ts';\nimport type { CronExecution } from '../types.ts';\n\nexport class CronResource {\n\tconstructor(private client: HostStack) {}\n\n\t/** List cron executions for a service. */\n\tasync list(\n\t\tteamId: IdInput,\n\t\tserviceId: IdInput,\n\t\toptions?: { limit?: number },\n\t): Promise<{ executions: CronExecution[] }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\tconst params = new URLSearchParams();\n\t\tif (options?.limit) params.set('limit', String(options.limit));\n\t\tconst qs = params.toString();\n\t\treturn this.client.request(\n\t\t\t'GET',\n\t\t\t`/api/services/${tid}/${sid}/cron-executions${qs ? `?${qs}` : ''}`,\n\t\t);\n\t}\n\n\t/** Get a single cron execution by ID. */\n\tasync get(\n\t\tteamId: IdInput,\n\t\tserviceId: IdInput,\n\t\texecutionId: IdInput,\n\t): Promise<{ execution: CronExecution }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\tconst eid = await this.client.resolveId(executionId, {\n\t\t\tkind: 'cronExecution',\n\t\t\tteamId: tid,\n\t\t\tserviceId: sid,\n\t\t});\n\t\treturn this.client.request('GET', `/api/services/${tid}/${sid}/cron-executions/${eid}`);\n\t}\n\n\t/** Trigger an immediate cron execution. */\n\tasync trigger(teamId: IdInput, serviceId: IdInput): Promise<{ execution: CronExecution }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\treturn this.client.request('POST', `/api/services/${tid}/${sid}/cron-executions/trigger`);\n\t}\n}\n","import type { HostStack, IdInput } from '../client.ts';\nimport type {\n\tCreateDatabaseInput,\n\tDatabase,\n\tDatabaseCredentials,\n\tUpdateDatabaseInput,\n} from '../types.ts';\n\nexport class DatabasesResource {\n\tconstructor(private client: HostStack) {}\n\n\t/**\n\t * List databases for the team. Pass `projectId` to scope to one\n\t * project; omit it to list every database the team owns.\n\t */\n\tasync list(teamId: IdInput, projectId?: IdInput): Promise<{ databases: Database[] }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tif (projectId === undefined) {\n\t\t\treturn this.client.request('GET', `/api/databases/${tid}`);\n\t\t}\n\t\tconst pid = await this.client.resolveId(projectId, { kind: 'project', teamId: tid });\n\t\treturn this.client.request('GET', `/api/databases/${tid}?projectId=${pid}`);\n\t}\n\n\t/** Get a single database by ID. */\n\tasync get(teamId: IdInput, databaseId: IdInput): Promise<{ database: Database }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst did = await this.client.resolveId(databaseId, { kind: 'database', teamId: tid });\n\t\treturn this.client.request('GET', `/api/databases/${tid}/${did}`);\n\t}\n\n\t/** Create a new database. */\n\tasync create(teamId: IdInput, data: CreateDatabaseInput): Promise<{ database: Database }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\treturn this.client.request('POST', `/api/databases/${tid}`, data);\n\t}\n\n\t/** Update a database. */\n\tasync update(\n\t\tteamId: IdInput,\n\t\tdatabaseId: IdInput,\n\t\tdata: UpdateDatabaseInput,\n\t): Promise<{ database: Database }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst did = await this.client.resolveId(databaseId, { kind: 'database', teamId: tid });\n\t\treturn this.client.request('PATCH', `/api/databases/${tid}/${did}`, data);\n\t}\n\n\t/** Delete a database. */\n\tasync delete(teamId: IdInput, databaseId: IdInput): Promise<void> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst did = await this.client.resolveId(databaseId, { kind: 'database', teamId: tid });\n\t\treturn this.client.request('DELETE', `/api/databases/${tid}/${did}`);\n\t}\n\n\t/** Suspend a database. */\n\tasync suspend(teamId: IdInput, databaseId: IdInput): Promise<void> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst did = await this.client.resolveId(databaseId, { kind: 'database', teamId: tid });\n\t\treturn this.client.request('POST', `/api/databases/${tid}/${did}/suspend`);\n\t}\n\n\t/** Resume a suspended database. */\n\tasync resume(teamId: IdInput, databaseId: IdInput): Promise<void> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst did = await this.client.resolveId(databaseId, { kind: 'database', teamId: tid });\n\t\treturn this.client.request('POST', `/api/databases/${tid}/${did}/resume`);\n\t}\n\n\t/** Get connection credentials. */\n\tasync getCredentials(\n\t\tteamId: IdInput,\n\t\tdatabaseId: IdInput,\n\t): Promise<{ credentials: DatabaseCredentials }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst did = await this.client.resolveId(databaseId, { kind: 'database', teamId: tid });\n\t\treturn this.client.request('GET', `/api/databases/${tid}/${did}/credentials`);\n\t}\n\n\t/** Reset the database password. */\n\tasync resetPassword(teamId: IdInput, databaseId: IdInput): Promise<void> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst did = await this.client.resolveId(databaseId, { kind: 'database', teamId: tid });\n\t\treturn this.client.request('POST', `/api/databases/${tid}/${did}/reset-password`);\n\t}\n\n\t/**\n\t * v89 (skyskraber #18): run a single READ ONLY statement against a\n\t * managed postgres database. Wrapped server-side in\n\t * `BEGIN TRANSACTION READ ONLY` with a 30s statement_timeout and a\n\t * 1000-row cap. Writes (INSERT/UPDATE/DELETE/DDL) fail with a\n\t * postgres \"cannot execute … in a read-only transaction\" error.\n\t *\n\t * Every call is audit-logged regardless of outcome (admin role\n\t * required server-side).\n\t *\n\t * Returns columns + rows-as-strings (CSV-serialized from psql) plus\n\t * a `truncated` flag if the result set was capped.\n\t */\n\tasync query(\n\t\tteamId: IdInput,\n\t\tdatabaseId: IdInput,\n\t\tsql: string,\n\t): Promise<{\n\t\tcolumns: string[];\n\t\trows: string[][];\n\t\trowCount: number;\n\t\ttruncated: boolean;\n\t\tdurationMs: number;\n\t}> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst did = await this.client.resolveId(databaseId, { kind: 'database', teamId: tid });\n\t\treturn this.client.request('POST', `/api/databases/${tid}/${did}/query`, { sql });\n\t}\n\n\t/**\n\t * v89 Phase 4: trigger a single-node → HA migration (Patroni 3-node\n\t * cluster). The customer-facing database briefly goes read-only during\n\t * the pg_dump → bootstrap → pg_restore. The standalone container stays\n\t * running (read-only) for 24 h as a rollback target before being\n\t * decommissioned automatically.\n\t *\n\t * Requires (server-side): PATRONI_ENABLED env on the deployment +\n\t * `teams.ha_beta=true` on this team. Throws 403 otherwise.\n\t *\n\t * Returns 202 — the upgrade is async; poll `get(...)` until\n\t * `pgEngineType === 'patroni'` + `status === 'available'` to confirm.\n\t */\n\tasync upgradeToHa(teamId: IdInput, databaseId: IdInput): Promise<void> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst did = await this.client.resolveId(databaseId, { kind: 'database', teamId: tid });\n\t\treturn this.client.request('POST', `/api/databases/${tid}/${did}/upgrade-to-ha`);\n\t}\n\n\t/**\n\t * v89 Phase 5: cluster topology + failover history for a Patroni-managed\n\t * Postgres database. Returns 400 for standalone databases — call\n\t * `get(...)` first if you need to branch.\n\t */\n\tasync getCluster(\n\t\tteamId: IdInput,\n\t\tdatabaseId: IdInput,\n\t): Promise<{\n\t\tmembers: Array<{\n\t\t\tid: number;\n\t\t\tmemberRole: 'etcd' | 'primary-candidate' | 'replica' | 'proxy';\n\t\t\tcontainerId: string;\n\t\t\tworkerHostId: number | null;\n\t\t\tjoinedAt: string;\n\t\t\tleftAt: string | null;\n\t\t}>;\n\t\tfailovers: Array<{\n\t\t\tid: number;\n\t\t\tcreatedAt: string;\n\t\t\toldLeader: string | null;\n\t\t\tnewLeader: string | null;\n\t\t}>;\n\t}> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst did = await this.client.resolveId(databaseId, { kind: 'database', teamId: tid });\n\t\treturn this.client.request('GET', `/api/databases/${tid}/${did}/cluster`);\n\t}\n}\n","import type { HostStack, IdInput } from '../client.ts';\nimport type { Deploy, TriggerDeployInput } from '../types.ts';\n\nexport interface DeployListResponse {\n\tdata: Deploy[];\n\tpage: number;\n\tperPage: number;\n\ttotal: number;\n\ttotalPages: number;\n}\n\nexport class DeploysResource {\n\tconstructor(private client: HostStack) {}\n\n\t/**\n\t * List deploys for a service. Paginated — pass `page` / `perPage` to walk\n\t * pages. Default page=1, perPage=25, hard cap perPage=100.\n\t */\n\tasync list(\n\t\tteamId: IdInput,\n\t\tserviceId: IdInput,\n\t\toptions?: { page?: number; perPage?: number },\n\t): Promise<DeployListResponse> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\tconst params = new URLSearchParams();\n\t\tif (options?.page !== undefined) params.set('page', String(options.page));\n\t\tif (options?.perPage !== undefined) params.set('perPage', String(options.perPage));\n\t\tconst qs = params.toString();\n\t\treturn this.client.request(\n\t\t\t'GET',\n\t\t\t`/api/services/${tid}/${sid}/deploys${qs ? `?${qs}` : ''}`,\n\t\t);\n\t}\n\n\t/** Get a single deploy by ID. */\n\tasync get(teamId: IdInput, serviceId: IdInput, deployId: IdInput): Promise<{ deploy: Deploy }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\tconst did = await this.client.resolveId(deployId, {\n\t\t\tkind: 'deploy',\n\t\t\tteamId: tid,\n\t\t\tserviceId: sid,\n\t\t});\n\t\treturn this.client.request('GET', `/api/services/${tid}/${sid}/deploys/${did}`);\n\t}\n\n\t/** Trigger a new deploy. */\n\tasync trigger(\n\t\tteamId: IdInput,\n\t\tserviceId: IdInput,\n\t\tdata?: TriggerDeployInput,\n\t): Promise<{ deploy: Deploy }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\treturn this.client.request('POST', `/api/services/${tid}/${sid}/deploys`, data ?? {});\n\t}\n\n\t/** Cancel an in-progress deploy. */\n\tasync cancel(teamId: IdInput, serviceId: IdInput, deployId: IdInput): Promise<void> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\tconst did = await this.client.resolveId(deployId, {\n\t\t\tkind: 'deploy',\n\t\t\tteamId: tid,\n\t\t\tserviceId: sid,\n\t\t});\n\t\treturn this.client.request('POST', `/api/services/${tid}/${sid}/deploys/${did}/cancel`);\n\t}\n\n\t/** Rollback to a previous deploy. */\n\tasync rollback(teamId: IdInput, serviceId: IdInput, deployId: IdInput): Promise<void> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\tconst did = await this.client.resolveId(deployId, {\n\t\t\tkind: 'deploy',\n\t\t\tteamId: tid,\n\t\t\tserviceId: sid,\n\t\t});\n\t\treturn this.client.request('POST', `/api/services/${tid}/${sid}/deploys/${did}/rollback`);\n\t}\n\n\t/**\n\t * v66 P5: promote a built deploy to a sibling service in another\n\t * environment. Reuses the source deploy's docker image (no rebuild).\n\t * If no sibling service exists in the target env yet, the API auto-\n\t * creates one by cloning the source service's config.\n\t */\n\tasync promote(\n\t\tteamId: IdInput,\n\t\tserviceId: IdInput,\n\t\tdeployId: IdInput,\n\t\ttargetEnvironmentId: number,\n\t): Promise<{ deploy: Deploy }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\tconst did = await this.client.resolveId(deployId, {\n\t\t\tkind: 'deploy',\n\t\t\tteamId: tid,\n\t\t\tserviceId: sid,\n\t\t});\n\t\treturn this.client.request('POST', `/api/services/${tid}/${sid}/deploys/${did}/promote`, {\n\t\t\ttargetEnvironmentId,\n\t\t});\n\t}\n\n\t/**\n\t * Get build logs for a deploy.\n\t *\n\t * Pagination: pass `afterId` from the previous response's `nextAfterId`\n\t * to fetch the next page. Per-call cap is 5000; default 500.\n\t */\n\tasync getLogs(\n\t\tteamId: IdInput,\n\t\tserviceId: IdInput,\n\t\tdeployId: IdInput,\n\t\toptions?: {\n\t\t\tsearch?: string;\n\t\t\tlevel?: string;\n\t\t\tphase?: string;\n\t\t\tlimit?: number;\n\t\t\tafterId?: number;\n\t\t},\n\t): Promise<{ logs: DeployLogEntry[]; nextAfterId: number | null }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\tconst did = await this.client.resolveId(deployId, {\n\t\t\tkind: 'deploy',\n\t\t\tteamId: tid,\n\t\t\tserviceId: sid,\n\t\t});\n\t\tconst params = new URLSearchParams();\n\t\tif (options?.search) params.set('search', options.search);\n\t\tif (options?.level) params.set('level', options.level);\n\t\tif (options?.phase) params.set('phase', options.phase);\n\t\tif (options?.limit !== undefined) params.set('limit', String(options.limit));\n\t\tif (options?.afterId !== undefined) params.set('afterId', String(options.afterId));\n\t\tconst qs = params.toString();\n\t\tconst url = `/api/services/${tid}/${sid}/deploys/${did}/logs${qs ? `?${qs}` : ''}`;\n\t\treturn this.client.request('GET', url);\n\t}\n}\n\nexport interface DeployLogEntry {\n\tid: number;\n\tdeployId: number;\n\ttimestamp: string;\n\tlevel: 'info' | 'warn' | 'error' | 'debug';\n\tphase: string | null;\n\tmessage: string;\n}\n","import type { HostStack, IdInput } from '../client.ts';\nimport type { AddDomainInput, Domain, UpdateDomainInput } from '../types.ts';\n\nexport class DomainsResource {\n\tconstructor(private client: HostStack) {}\n\n\t/** List all domains for the active team. */\n\tasync list(teamId: IdInput): Promise<{ domains: Domain[] }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\treturn this.client.request('GET', `/api/domains/${tid}`);\n\t}\n\n\t/** Add a custom domain. */\n\tasync add(teamId: IdInput, data: AddDomainInput): Promise<{ domain: Domain }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(data.serviceId, { kind: 'service', teamId: tid });\n\t\treturn this.client.request('POST', `/api/domains/${tid}`, { ...data, serviceId: sid });\n\t}\n\n\t/** Update a domain. */\n\tasync update(\n\t\tteamId: IdInput,\n\t\tdomainId: IdInput,\n\t\tdata: UpdateDomainInput,\n\t): Promise<{ domain: Domain }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst did = await this.client.resolveId(domainId, { kind: 'domain', teamId: tid });\n\t\treturn this.client.request('PATCH', `/api/domains/${tid}/${did}`, data);\n\t}\n\n\t/** Remove a domain. */\n\tasync remove(teamId: IdInput, domainId: IdInput): Promise<void> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst did = await this.client.resolveId(domainId, { kind: 'domain', teamId: tid });\n\t\treturn this.client.request('DELETE', `/api/domains/${tid}/${did}`);\n\t}\n\n\t/** Verify domain DNS configuration. */\n\tasync verify(teamId: IdInput, domainId: IdInput): Promise<void> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst did = await this.client.resolveId(domainId, { kind: 'domain', teamId: tid });\n\t\treturn this.client.request('POST', `/api/domains/${tid}/${did}/verify`);\n\t}\n}\n","import type { HostStack, IdInput } from '../client.ts';\n\nexport interface Environment {\n\tid: number;\n\tpublicId: string;\n\tprojectId: number;\n\tname: string;\n\ttype: 'production' | 'staging' | 'development' | 'preview';\n\tisDefault: boolean;\n\tisProtected: boolean;\n\tcreatedAt: string;\n\tupdatedAt: string;\n}\n\nexport interface CreateEnvironmentInput {\n\tname: string;\n\ttype: 'production' | 'staging' | 'development' | 'preview';\n\tisProtected?: boolean;\n}\n\nexport interface UpdateEnvironmentInput {\n\tname?: string;\n\tisDefault?: boolean;\n\tisProtected?: boolean;\n}\n\n/**\n * v66 P5: programmatic env management. Each project has at least a\n * Production env auto-created at project creation; you can add more\n * via `create` and bind services/databases to them via the\n * `environmentId` field on those resources' create inputs.\n *\n * @example\n * ```ts\n * const { environment: staging } = await client.environments.create(\n * teamId,\n * projectId,\n * { name: 'Staging', type: 'staging' }\n * );\n * await client.services.create(teamId, {\n * projectId,\n * environmentId: staging.id,\n * name: 'api',\n * type: 'web_service',\n * // ...\n * });\n * ```\n */\nexport class EnvironmentsResource {\n\tconstructor(private client: HostStack) {}\n\n\t/** List all environments for a project. */\n\tasync list(teamId: IdInput, projectId: IdInput): Promise<{ environments: Environment[] }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst pid = await this.client.resolveId(projectId, { kind: 'project', teamId: tid });\n\t\treturn this.client.request('GET', `/api/environments/${tid}/${pid}`);\n\t}\n\n\t/** Get a single environment by id. */\n\tasync get(\n\t\tteamId: IdInput,\n\t\tprojectId: IdInput,\n\t\tenvId: IdInput,\n\t): Promise<{ environment: Environment }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst pid = await this.client.resolveId(projectId, { kind: 'project', teamId: tid });\n\t\tconst eid = await this.client.resolveId(envId, { kind: 'environment', teamId: tid });\n\t\treturn this.client.request('GET', `/api/environments/${tid}/${pid}/${eid}`);\n\t}\n\n\t/** Create a new environment in the given project. */\n\tasync create(\n\t\tteamId: IdInput,\n\t\tprojectId: IdInput,\n\t\tdata: CreateEnvironmentInput,\n\t): Promise<{ environment: Environment }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst pid = await this.client.resolveId(projectId, { kind: 'project', teamId: tid });\n\t\treturn this.client.request('POST', `/api/environments/${tid}/${pid}`, data);\n\t}\n\n\t/** Update environment metadata (name, default flag, protected flag). */\n\tasync update(\n\t\tteamId: IdInput,\n\t\tprojectId: IdInput,\n\t\tenvId: IdInput,\n\t\tdata: UpdateEnvironmentInput,\n\t): Promise<{ environment: Environment }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst pid = await this.client.resolveId(projectId, { kind: 'project', teamId: tid });\n\t\tconst eid = await this.client.resolveId(envId, { kind: 'environment', teamId: tid });\n\t\treturn this.client.request('PATCH', `/api/environments/${tid}/${pid}/${eid}`, data);\n\t}\n\n\t/**\n\t * Delete an environment. The API blocks delete when the env still\n\t * has services or databases attached — destroy them first or move\n\t * them to another env. Cannot delete the project's default env.\n\t */\n\tasync delete(teamId: IdInput, projectId: IdInput, envId: IdInput): Promise<void> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst pid = await this.client.resolveId(projectId, { kind: 'project', teamId: tid });\n\t\tconst eid = await this.client.resolveId(envId, { kind: 'environment', teamId: tid });\n\t\treturn this.client.request('DELETE', `/api/environments/${tid}/${pid}/${eid}`);\n\t}\n}\n","import type { HostStack, IdInput } from '../client.ts';\nimport type {\n\tBulkSetEnvVarsInput,\n\tCreateEnvVarInput,\n\tEnvVar,\n\tUpdateEnvVarInput,\n} from '../types.ts';\n\nexport class EnvVarsResource {\n\tconstructor(private client: HostStack) {}\n\n\t/** List all environment variables for a service. */\n\tasync list(teamId: IdInput, serviceId: IdInput): Promise<{ envVars: EnvVar[] }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\treturn this.client.request('GET', `/api/services/${tid}/${sid}/env`);\n\t}\n\n\t/** Create a new environment variable. */\n\tasync create(\n\t\tteamId: IdInput,\n\t\tserviceId: IdInput,\n\t\tdata: CreateEnvVarInput,\n\t): Promise<{ envVar: EnvVar }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\treturn this.client.request('POST', `/api/services/${tid}/${sid}/env`, data);\n\t}\n\n\t/** Update an environment variable. */\n\tasync update(\n\t\tteamId: IdInput,\n\t\tserviceId: IdInput,\n\t\tenvVarId: IdInput,\n\t\tdata: UpdateEnvVarInput,\n\t): Promise<{ envVar: EnvVar }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\tconst eid = typeof envVarId === 'number' ? envVarId : Number.parseInt(envVarId, 10);\n\t\tif (Number.isNaN(eid)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Invalid envVarId \"${envVarId}\": expected a numeric id (env vars have no publicId — read it from list()).`,\n\t\t\t);\n\t\t}\n\t\treturn this.client.request('PATCH', `/api/services/${tid}/${sid}/env/${eid}`, data);\n\t}\n\n\t/** Delete an environment variable. */\n\tasync delete(teamId: IdInput, serviceId: IdInput, envVarId: IdInput): Promise<void> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\tconst eid = typeof envVarId === 'number' ? envVarId : Number.parseInt(envVarId, 10);\n\t\tif (Number.isNaN(eid)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Invalid envVarId \"${envVarId}\": expected a numeric id (env vars have no publicId — read it from list()).`,\n\t\t\t);\n\t\t}\n\t\treturn this.client.request('DELETE', `/api/services/${tid}/${sid}/env/${eid}`);\n\t}\n\n\t/** Bulk set environment variables (create or update). */\n\tasync bulkSet(teamId: IdInput, serviceId: IdInput, data: BulkSetEnvVarsInput): Promise<void> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\treturn this.client.request('PUT', `/api/services/${tid}/${sid}/env/bulk`, data);\n\t}\n}\n","import type { HostStack, IdInput } from '../client.ts';\n\nexport type NotificationChannelType = 'slack' | 'discord' | 'email';\n\n/**\n * Events a notification channel can subscribe to. Source of truth is\n * `packages/shared/src/schemas/notification-channel.ts:NOTIFICATION_CHANNEL_EVENTS`.\n */\nexport type NotificationChannelEvent =\n\t| 'deploy.started'\n\t| 'deploy.succeeded'\n\t| 'deploy.failed'\n\t| 'deploy.failed_consecutive'\n\t| 'service.created'\n\t| 'service.deleted'\n\t| 'service.suspended'\n\t| 'service.resumed'\n\t| 'service.restart_failed'\n\t| 'service.auto_suspended'\n\t| 'service.acme_cert_failed'\n\t| 'git.auth_failed';\n\nexport interface NotificationChannel {\n\tid: number;\n\tteamId: number;\n\ttype: NotificationChannelType;\n\tname: string;\n\t/**\n\t * Webhook URL (Slack/Discord) or email address. The list API masks\n\t * the value for security — only the create/update calls round-trip\n\t * the real URL.\n\t */\n\twebhookUrl: string;\n\tactive: boolean;\n\tevents: NotificationChannelEvent[];\n\tcreatedAt: string;\n\tupdatedAt: string;\n}\n\nexport class NotificationsResource {\n\tconstructor(private client: HostStack) {}\n\n\t/**\n\t * List notification channels for the team. Webhook URLs are\n\t * server-side masked in the response so this is safe to log.\n\t */\n\tasync listChannels(teamId: IdInput): Promise<{ channels: NotificationChannel[] }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\treturn this.client.request('GET', `/api/notifications/${tid}/channels`);\n\t}\n\n\t/**\n\t * Create a Slack/Discord/email notification channel.\n\t *\n\t * For type=email, `webhookUrl` is the recipient email address; for\n\t * type=slack/discord it's the incoming webhook URL.\n\t *\n\t * `events` is the explicit subscription list — an empty array means\n\t * \"receive nothing\". The platform pre-selects the critical-event\n\t * set on the dashboard, but SDK callers must pass the list\n\t * explicitly so behaviour is deterministic.\n\t */\n\tasync createChannel(\n\t\tteamId: IdInput,\n\t\tdata: {\n\t\t\ttype: NotificationChannelType;\n\t\t\tname: string;\n\t\t\twebhookUrl: string;\n\t\t\tevents: NotificationChannelEvent[];\n\t\t},\n\t): Promise<{ channel: NotificationChannel }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\treturn this.client.request('POST', `/api/notifications/${tid}/channels`, data);\n\t}\n\n\t/**\n\t * Update a channel's name / active state / event subscriptions. The\n\t * webhook URL and type are immutable — create a new channel if\n\t * those need to change.\n\t */\n\tasync updateChannel(\n\t\tteamId: IdInput,\n\t\tchannelId: number,\n\t\tdata: {\n\t\t\tname?: string;\n\t\t\tactive?: boolean;\n\t\t\tevents?: NotificationChannelEvent[];\n\t\t},\n\t): Promise<{ channel: NotificationChannel }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\treturn this.client.request(\n\t\t\t'PATCH',\n\t\t\t`/api/notifications/${tid}/channels/${channelId}`,\n\t\t\tdata,\n\t\t);\n\t}\n\n\t/** Delete a notification channel. */\n\tasync deleteChannel(teamId: IdInput, channelId: number): Promise<void> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\treturn this.client.request('DELETE', `/api/notifications/${tid}/channels/${channelId}`);\n\t}\n\n\t/**\n\t * Fire a test event to the channel so the user can confirm the\n\t * webhook is wired correctly. Returns the dispatch outcome.\n\t */\n\tasync testChannel(\n\t\tteamId: IdInput,\n\t\tchannelId: number,\n\t): Promise<{ success: boolean; error?: string }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\treturn this.client.request('POST', `/api/notifications/${tid}/channels/${channelId}/test`);\n\t}\n}\n","import type { HostStack, IdInput } from '../client.ts';\nimport type { CreateProjectInput, Project, UpdateProjectInput } from '../types.ts';\n\nexport class ProjectsResource {\n\tconstructor(private client: HostStack) {}\n\n\t/** List all projects for the active team. */\n\tasync list(teamId: IdInput): Promise<{ projects: Project[] }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\treturn this.client.request('GET', `/api/projects/${tid}`);\n\t}\n\n\t/** Get a single project by ID. */\n\tasync get(teamId: IdInput, projectId: IdInput): Promise<{ project: Project }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst pid = await this.client.resolveId(projectId, { kind: 'project', teamId: tid });\n\t\treturn this.client.request('GET', `/api/projects/${tid}/${pid}`);\n\t}\n\n\t/** Create a new project. */\n\tasync create(teamId: IdInput, data: CreateProjectInput): Promise<{ project: Project }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\treturn this.client.request('POST', `/api/projects/${tid}`, data);\n\t}\n\n\t/** Update a project. */\n\tasync update(\n\t\tteamId: IdInput,\n\t\tprojectId: IdInput,\n\t\tdata: UpdateProjectInput,\n\t): Promise<{ project: Project }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst pid = await this.client.resolveId(projectId, { kind: 'project', teamId: tid });\n\t\treturn this.client.request('PATCH', `/api/projects/${tid}/${pid}`, data);\n\t}\n\n\t/** Delete a project. */\n\tasync delete(teamId: IdInput, projectId: IdInput): Promise<void> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst pid = await this.client.resolveId(projectId, { kind: 'project', teamId: tid });\n\t\treturn this.client.request('DELETE', `/api/projects/${tid}/${pid}`);\n\t}\n}\n","export interface LogEntry {\n\ttimestamp: string;\n\t/**\n\t * Parsed log level if the message is a structured JSON envelope\n\t * (pino numeric, `{\"level\":\"info\"}`, or `{\"severity\":\"WARNING\"}`).\n\t * `undefined` for plain-text logs.\n\t */\n\tlevel?: 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal' | null;\n\tstream?: 'stdout' | 'stderr' | null;\n\tmessage: string;\n}\n\nexport interface StreamLogsOptions {\n\t/** Filter by stream: 'stdout' or 'stderr'. */\n\tstream?: 'stdout' | 'stderr';\n\t/** Number of historical lines to fetch on first poll (default: 100). */\n\tinitialLines?: number;\n\t/** Poll interval in milliseconds (default: 2000). */\n\tpollInterval?: number;\n\t/** AbortSignal to stop streaming. */\n\tsignal?: AbortSignal;\n}\n\n/**\n * Streams runtime logs for a service by polling the logs REST endpoint.\n * Yields log entries as they appear. Use an AbortController to stop.\n *\n * @example\n * ```ts\n * const ac = new AbortController();\n * for await (const entry of client.services.streamLogs(teamId, serviceId, { signal: ac.signal })) {\n * console.log(entry.message);\n * }\n * ```\n */\nexport async function* streamLogsViaPolling(\n\tfetch: (path: string) => Promise<{ logs: LogEntry[] | string }>,\n\tbasePath: string,\n\toptions: StreamLogsOptions = {},\n): AsyncGenerator<LogEntry> {\n\tconst pollInterval = options.pollInterval ?? 2000;\n\tconst initialLines = options.initialLines ?? 100;\n\n\t// Track seen timestamps to avoid duplicates on first yield\n\tlet lastTimestamp: string | null = null;\n\n\tconst buildPath = (lines?: number, since?: string) => {\n\t\tconst params = new URLSearchParams();\n\t\tif (options.stream) params.set('stream', options.stream);\n\t\t// v63 P5: backend now standardises on `limit` + `since`; we keep the\n\t\t// `lines` SDK alias and pass it as `limit` so old + new wire formats\n\t\t// both work.\n\t\tif (lines !== undefined) params.set('limit', String(lines));\n\t\tif (since) params.set('since', since);\n\t\tconst qs = params.toString();\n\t\treturn `${basePath}${qs ? `?${qs}` : ''}`;\n\t};\n\n\t// Initial fetch\n\tconst initialData = await fetch(buildPath(initialLines));\n\tconst initial = normalizeEntries(initialData.logs);\n\tfor (const entry of initial) {\n\t\tyield entry;\n\t\tif (entry.timestamp > (lastTimestamp ?? '')) {\n\t\t\tlastTimestamp = entry.timestamp;\n\t\t}\n\t}\n\n\t// Poll loop\n\twhile (!options.signal?.aborted) {\n\t\tawait sleep(pollInterval, options.signal);\n\t\tif (options.signal?.aborted) break;\n\n\t\tconst sinceTs = lastTimestamp ? new Date(lastTimestamp).toISOString() : undefined;\n\t\tconst data = await fetch(buildPath(undefined, sinceTs)).catch(() => ({ logs: [] }));\n\t\tconst entries = normalizeEntries(data.logs);\n\n\t\tfor (const entry of entries) {\n\t\t\tif (!lastTimestamp || entry.timestamp > lastTimestamp) {\n\t\t\t\tyield entry;\n\t\t\t\tlastTimestamp = entry.timestamp;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction normalizeEntries(logs: LogEntry[] | string): LogEntry[] {\n\tif (typeof logs === 'string') {\n\t\tconst lines = logs.split('\\n').filter(Boolean);\n\t\treturn lines.map((line) => ({\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tmessage: line,\n\t\t}));\n\t}\n\treturn logs;\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n\treturn new Promise((resolve) => {\n\t\tconst timer = setTimeout(resolve, ms);\n\t\tif (signal) {\n\t\t\t// Resolve (not reject) on abort: the poll loop checks\n\t\t\t// `signal.aborted` right after the sleep and breaks cleanly, so\n\t\t\t// the documented AbortController usage terminates the `for await`\n\t\t\t// without throwing an AbortError at the consumer.\n\t\t\tsignal.addEventListener('abort', () => {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\tresolve();\n\t\t\t});\n\t\t}\n\t});\n}\n","import type { HostStack, IdInput } from '../client.ts';\nimport { type StreamLogsOptions, streamLogsViaPolling } from '../streaming.ts';\nimport type {\n\tCreateServiceInput,\n\tService,\n\tServiceConfig,\n\tServiceMetricsSnapshot,\n\tServiceStatus,\n\tServiceType,\n\tUpdateServiceConfigInput,\n\tUpdateServiceInput,\n} from '../types.ts';\n\ninterface LogEntry {\n\ttimestamp: string;\n\t/**\n\t * Parsed structured log level (pino numeric or string envelopes).\n\t * `undefined` for plain-text logs.\n\t */\n\tlevel?: 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal' | null;\n\tstream?: 'stdout' | 'stderr' | null;\n\tmessage: string;\n}\n\nexport class ServicesResource {\n\tconstructor(private client: HostStack) {}\n\n\t/**\n\t * List services for the active team.\n\t *\n\t * Optional filters narrow by project, environment, status, or type.\n\t * The server treats unknown enum values as no match (returns empty)\n\t * rather than 400-ing.\n\t */\n\tasync list(\n\t\tteamId: IdInput,\n\t\tfilters?: {\n\t\t\tprojectId?: number | string;\n\t\t\tenvironmentId?: number | string;\n\t\t\tstatus?: ServiceStatus;\n\t\t\ttype?: ServiceType;\n\t\t},\n\t): Promise<{ services: Service[] }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst params = new URLSearchParams();\n\t\tif (filters?.projectId !== undefined) params.set('projectId', String(filters.projectId));\n\t\tif (filters?.environmentId !== undefined)\n\t\t\tparams.set('environmentId', String(filters.environmentId));\n\t\tif (filters?.status) params.set('status', filters.status);\n\t\tif (filters?.type) params.set('type', filters.type);\n\t\tconst qs = params.toString();\n\t\treturn this.client.request('GET', `/api/services/${tid}${qs ? `?${qs}` : ''}`);\n\t}\n\n\t/** Get a single service by ID. */\n\tasync get(teamId: IdInput, serviceId: IdInput): Promise<{ service: Service }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\treturn this.client.request('GET', `/api/services/${tid}/${sid}`);\n\t}\n\n\t/** Create a new service. */\n\tasync create(teamId: IdInput, data: CreateServiceInput): Promise<{ service: Service }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\treturn this.client.request('POST', `/api/services/${tid}`, data);\n\t}\n\n\t/** Update a service. */\n\tasync update(\n\t\tteamId: IdInput,\n\t\tserviceId: IdInput,\n\t\tdata: UpdateServiceInput,\n\t): Promise<{ service: Service }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\treturn this.client.request('PATCH', `/api/services/${tid}/${sid}`, data);\n\t}\n\n\t/** Delete a service. */\n\tasync delete(teamId: IdInput, serviceId: IdInput): Promise<void> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\treturn this.client.request('DELETE', `/api/services/${tid}/${sid}`);\n\t}\n\n\t/** Suspend a service. */\n\tasync suspend(teamId: IdInput, serviceId: IdInput): Promise<void> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\treturn this.client.request('POST', `/api/services/${tid}/${sid}/suspend`);\n\t}\n\n\t/** Resume a suspended service. */\n\tasync resume(teamId: IdInput, serviceId: IdInput): Promise<void> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\treturn this.client.request('POST', `/api/services/${tid}/${sid}/resume`);\n\t}\n\n\t/**\n\t * Get the latest metrics snapshot for a service.\n\t *\n\t * Returns `metrics: null` before the first agent sample lands;\n\t * `serverOverview: null` when the service is not currently placed\n\t * (suspended, between deploys, etc).\n\t */\n\tasync getMetrics(teamId: IdInput, serviceId: IdInput): Promise<ServiceMetricsSnapshot> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\treturn this.client.request('GET', `/api/services/${tid}/${sid}/metrics`);\n\t}\n\n\t/**\n\t * Get a metrics time series for a service.\n\t *\n\t * `from`/`to` accept ISO-8601 timestamps. Omit both for the trailing\n\t * hour. Server picks the resolution: raw samples ≤7d, hourly pre-\n\t * aggregates ≤30d, daily beyond that. Up to ~500 points returned.\n\t */\n\tasync getMetricsHistory(\n\t\tteamId: IdInput,\n\t\tserviceId: IdInput,\n\t\toptions?: { from?: string; to?: string },\n\t): Promise<{\n\t\thistory: Array<{\n\t\t\ttimestamp: string;\n\t\t\tcpuPercent: number;\n\t\t\tmemoryUsedMb: number;\n\t\t\tmemoryLimitMb: number;\n\t\t\tnetworkRxBytes: number;\n\t\t\tnetworkTxBytes: number;\n\t\t\tdiskUsedMb: number;\n\t\t}>;\n\t}> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\tconst params = new URLSearchParams();\n\t\tif (options?.from) params.set('from', options.from);\n\t\tif (options?.to) params.set('to', options.to);\n\t\tconst qs = params.toString();\n\t\treturn this.client.request(\n\t\t\t'GET',\n\t\t\t`/api/services/${tid}/${sid}/metrics/history${qs ? `?${qs}` : ''}`,\n\t\t);\n\t}\n\n\t/** Get service configuration. */\n\tasync getConfig(teamId: IdInput, serviceId: IdInput): Promise<{ config: ServiceConfig }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\treturn this.client.request('GET', `/api/services/${tid}/${sid}/config`);\n\t}\n\n\t/** Update service configuration. */\n\tasync updateConfig(\n\t\tteamId: IdInput,\n\t\tserviceId: IdInput,\n\t\tdata: UpdateServiceConfigInput,\n\t): Promise<{ config: ServiceConfig }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\treturn this.client.request('PATCH', `/api/services/${tid}/${sid}/config`, data);\n\t}\n\n\t/**\n\t * Get runtime logs for a service.\n\t *\n\t * `since`/`until` accept either an ISO-8601 timestamp or a short\n\t * relative offset like `-5m`, `-1h`, `-2d`.\n\t *\n\t * `search` does case-insensitive substring filtering server-side\n\t * (≤100 chars). `countOnly` returns just `{ count: N }` for cheap\n\t * polling — useful when you want to know \"how many error lines in the\n\t * last 5 minutes\" without paying the bytes.\n\t */\n\tasync getRuntimeLogs(\n\t\tteamId: IdInput,\n\t\tserviceId: IdInput,\n\t\toptions?: {\n\t\t\tlines?: number;\n\t\t\tlimit?: number;\n\t\t\tsince?: string;\n\t\t\tuntil?: string;\n\t\t\tstream?: 'stdout' | 'stderr';\n\t\t\tlevel?: 'stdout' | 'stderr' | 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal';\n\t\t\tsearch?: string;\n\t\t\tgrep?: string;\n\t\t\tcountOnly?: boolean;\n\t\t},\n\t): Promise<{ logs: LogEntry[] | string } | { count: number }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\tconst params = new URLSearchParams();\n\t\tconst lim = options?.limit ?? options?.lines;\n\t\tif (lim != null) params.set('limit', String(lim));\n\t\tif (options?.since) params.set('since', options.since);\n\t\tif (options?.until) params.set('until', options.until);\n\t\tif (options?.stream) params.set('stream', options.stream);\n\t\tif (options?.level) params.set('level', options.level);\n\t\tconst grep = options?.grep ?? options?.search;\n\t\tif (grep) params.set('search', grep);\n\t\tif (options?.countOnly) params.set('count_only', '1');\n\t\tconst qs = params.toString();\n\t\treturn this.client.request(\n\t\t\t'GET',\n\t\t\t`/api/services/${tid}/${sid}/runtime-logs${qs ? `?${qs}` : ''}`,\n\t\t);\n\t}\n\n\t/**\n\t * Stream runtime logs for a service by polling the logs endpoint.\n\t * Yields log entries as they appear. Use an AbortController to stop.\n\t *\n\t * @example\n\t * ```ts\n\t * const ac = new AbortController();\n\t * for await (const entry of client.services.streamLogs(teamId, serviceId, { signal: ac.signal })) {\n\t * console.log(entry.message);\n\t * }\n\t * ```\n\t */\n\tasync *streamLogs(\n\t\tteamId: IdInput,\n\t\tserviceId: IdInput,\n\t\toptions?: StreamLogsOptions,\n\t): AsyncGenerator<LogEntry> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\tconst basePath = `/api/services/${tid}/${sid}/runtime-logs`;\n\t\tyield* streamLogsViaPolling((path) => this.client.request('GET', path), basePath, options);\n\t}\n}\n","import type { HostStack } from '../client.ts';\nimport type { Team } from '../types.ts';\n\nexport class TeamsResource {\n\tconstructor(private client: HostStack) {}\n\n\t/**\n\t * List the teams the authenticated principal can access.\n\t *\n\t * Session auth: all teams the user belongs to.\n\t * API-key auth: the single team the key is bound to.\n\t */\n\tasync list(): Promise<{ teams: Team[] }> {\n\t\treturn this.client.request('GET', '/api/auth/teams');\n\t}\n}\n","import type { HostStack, IdInput } from '../client.ts';\nimport type { CreateVolumeInput, UpdateVolumeInput, Volume } from '../types.ts';\n\n/**\n * Manage persistent disks attached to a service.\n *\n * Volumes mount a writable disk into a service's container at the path you\n * choose, surviving redeploys and container restarts. One service can have\n * multiple volumes; each one is identified by a short `name` and a\n * `mountPath`.\n *\n * Renderers porting from render.yaml: a volume here is the same concept as\n * Render's `disk:` block. Use {@link create} to attach one programmatically,\n * or declare it in `hoststack.yaml` for IaC workflows.\n *\n * @example\n * ```ts\n * await client.volumes.create(team, service, {\n * name: 'data',\n * mountPath: '/var/data',\n * sizeGb: 10,\n * });\n * ```\n */\nexport class VolumesResource {\n\tconstructor(private client: HostStack) {}\n\n\t/** List volumes attached to a service. */\n\tasync list(teamId: IdInput, serviceId: IdInput): Promise<{ volumes: Volume[] }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\treturn this.client.request('GET', `/api/services/${tid}/${sid}/volumes`);\n\t}\n\n\t/** Attach a new volume to a service. Triggers provisioning on the host. */\n\tasync create(\n\t\tteamId: IdInput,\n\t\tserviceId: IdInput,\n\t\tdata: CreateVolumeInput,\n\t): Promise<{ volume: Volume }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\treturn this.client.request('POST', `/api/services/${tid}/${sid}/volumes`, data);\n\t}\n\n\t/**\n\t * Update a volume's mountPath or sizeGb. Resizes that take effect on the\n\t * next deploy; mountPath changes require a redeploy to remount.\n\t */\n\tasync update(\n\t\tteamId: IdInput,\n\t\tserviceId: IdInput,\n\t\tvolumeId: IdInput,\n\t\tdata: UpdateVolumeInput,\n\t): Promise<{ volume: Volume }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\tconst vid = await this.client.resolveId(volumeId, {\n\t\t\tkind: 'volume',\n\t\t\tteamId: tid,\n\t\t\tserviceId: sid,\n\t\t});\n\t\treturn this.client.request('PATCH', `/api/services/${tid}/${sid}/volumes/${vid}`, data);\n\t}\n\n\t/**\n\t * Detach and deprovision a volume. The underlying disk is destroyed —\n\t * back up any data first. Async: the row is marked `deleting` and the\n\t * agent finalises the removal once it acks.\n\t */\n\tasync delete(teamId: IdInput, serviceId: IdInput, volumeId: IdInput): Promise<void> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\tconst vid = await this.client.resolveId(volumeId, {\n\t\t\tkind: 'volume',\n\t\t\tteamId: tid,\n\t\t\tserviceId: sid,\n\t\t});\n\t\treturn this.client.request('DELETE', `/api/services/${tid}/${sid}/volumes/${vid}`);\n\t}\n}\n","import {\n\tAuthenticationError,\n\tConflictError,\n\tForbiddenError,\n\tHostStackError,\n\tNotFoundError,\n\tRateLimitError,\n} from './errors.ts';\nimport { CronResource } from './resources/cron.ts';\nimport { DatabasesResource } from './resources/databases.ts';\nimport { DeploysResource } from './resources/deploys.ts';\nimport { DomainsResource } from './resources/domains.ts';\nimport { EnvironmentsResource } from './resources/environments.ts';\nimport { EnvVarsResource } from './resources/env-vars.ts';\nimport { NotificationsResource } from './resources/notifications.ts';\nimport { ProjectsResource } from './resources/projects.ts';\nimport { ServicesResource } from './resources/services.ts';\nimport { TeamsResource } from './resources/teams.ts';\nimport { VolumesResource } from './resources/volumes.ts';\nimport type { MeResponse } from './types.ts';\n\n/** A numeric id or a publicId string (e.g. 42, \"42\", \"svc_abc…\"). */\nexport type IdInput = number | string;\n\nexport interface HostStackOptions {\n\t/** Your HostStack API key (hs_live_... or hs_test_...). */\n\tapiKey: string;\n\t/** Base URL of the HostStack API. Defaults to https://hoststack.dev */\n\tbaseUrl?: string;\n}\n\nconst PREFIX = {\n\tteam: 'team_',\n\tproject: 'prj_',\n\tservice: 'svc_',\n\tdeploy: 'dpl_',\n\tdatabase: 'db_',\n\tdomain: 'dom_',\n\tvolume: 'vol_',\n\tenvironment: 'env_',\n\tcronExecution: 'cjob_',\n} as const;\n\ntype ResolveScope =\n\t| { kind: 'team' }\n\t| { kind: 'project'; teamId: number }\n\t| { kind: 'service'; teamId: number }\n\t| { kind: 'deploy'; teamId: number; serviceId: number }\n\t| { kind: 'database'; teamId: number }\n\t| { kind: 'domain'; teamId: number }\n\t| { kind: 'volume'; teamId: number; serviceId: number }\n\t// v66 P5: env publicIds resolve numeric ids by hitting the project's\n\t// env list. The resource methods that call resolveId for env scope\n\t// only need teamId since the listForProject endpoint validates team\n\t// ownership; we accept publicId from any project the team owns.\n\t| { kind: 'environment'; teamId: number }\n\t| { kind: 'cronExecution'; teamId: number; serviceId: number };\n\nexport class HostStack {\n\tprivate apiKey: string;\n\tprivate baseUrl: string;\n\n\t// publicId → numeric id, scoped by parent context. Lifetime: client instance.\n\tprivate idCache = new Map<string, number>();\n\n\t/** Manage projects. */\n\tpublic readonly projects: ProjectsResource;\n\t/** Manage services (web, worker, cron). */\n\tpublic readonly services: ServicesResource;\n\t/** Trigger and manage deployments. */\n\tpublic readonly deploys: DeploysResource;\n\t/** Manage databases (Postgres, Redis). */\n\tpublic readonly databases: DatabasesResource;\n\t/** Manage custom domains. */\n\tpublic readonly domains: DomainsResource;\n\t/** Manage service environment variables. */\n\tpublic readonly envVars: EnvVarsResource;\n\t/** v66: manage environments (production/staging/development/preview) per project. */\n\tpublic readonly environments: EnvironmentsResource;\n\t/** Manage cron job executions. */\n\tpublic readonly cron: CronResource;\n\t/** Manage persistent disks attached to services. */\n\tpublic readonly volumes: VolumesResource;\n\t/**\n\t * Manage notification channels — Slack/Discord webhooks + email\n\t * recipients with per-channel event filters. Used for deploy\n\t * failures, restart loops, ACME failures, git auth losses, etc.\n\t */\n\tpublic readonly notifications: NotificationsResource;\n\t/** List the teams this API key (or session) can access. */\n\tpublic readonly teams: TeamsResource;\n\n\tconstructor(options: HostStackOptions) {\n\t\tif (!options.apiKey) {\n\t\t\tthrow new Error('apiKey is required');\n\t\t}\n\n\t\tthis.apiKey = options.apiKey;\n\t\tthis.baseUrl = (options.baseUrl ?? 'https://hoststack.dev').replace(/\\/$/, '');\n\n\t\tthis.projects = new ProjectsResource(this);\n\t\tthis.services = new ServicesResource(this);\n\t\tthis.deploys = new DeploysResource(this);\n\t\tthis.databases = new DatabasesResource(this);\n\t\tthis.domains = new DomainsResource(this);\n\t\tthis.envVars = new EnvVarsResource(this);\n\t\tthis.environments = new EnvironmentsResource(this);\n\t\tthis.cron = new CronResource(this);\n\t\tthis.volumes = new VolumesResource(this);\n\t\tthis.notifications = new NotificationsResource(this);\n\t\tthis.teams = new TeamsResource(this);\n\t}\n\n\t/**\n\t * Identify the authenticated principal. For API-key auth, `user` is\n\t * `null` and `team` is the team the key is bound to; `apiKey` carries\n\t * the key's permission scope (read or full).\n\t */\n\tasync me(): Promise<MeResponse> {\n\t\treturn this.request<MeResponse>('GET', '/api/auth/me');\n\t}\n\n\t/**\n\t * Make an authenticated request to the HostStack API.\n\t * Used internally by resource classes. Can also be used for custom API calls.\n\t */\n\tasync request<T>(method: string, path: string, body?: unknown): Promise<T> {\n\t\tconst url = `${this.baseUrl}${path}`;\n\n\t\tconst headers: Record<string, string> = {\n\t\t\tAuthorization: `Bearer ${this.apiKey}`,\n\t\t};\n\n\t\tif (body !== undefined) {\n\t\t\theaders['Content-Type'] = 'application/json';\n\t\t}\n\n\t\tconst res = await fetch(url, {\n\t\t\tmethod,\n\t\t\theaders,\n\t\t\tbody: body !== undefined ? JSON.stringify(body) : undefined,\n\t\t});\n\n\t\tif (!res.ok) {\n\t\t\tconst data = (await res.json().catch(() => ({ error: 'Unknown error' }))) as {\n\t\t\t\terror?: string;\n\t\t\t};\n\t\t\tconst message = data.error ?? `HTTP ${res.status}`;\n\n\t\t\tswitch (res.status) {\n\t\t\t\tcase 401:\n\t\t\t\t\tthrow new AuthenticationError(message, data);\n\t\t\t\tcase 403:\n\t\t\t\t\tthrow new ForbiddenError(message, data);\n\t\t\t\tcase 404:\n\t\t\t\t\tthrow new NotFoundError(message, data);\n\t\t\t\tcase 409:\n\t\t\t\t\tthrow new ConflictError(message, data);\n\t\t\t\tcase 429: {\n\t\t\t\t\t// RFC 9110 §10.2.3: Retry-After is either delta-seconds or an\n\t\t\t\t\t// HTTP-date. We accept seconds — HTTP-date is rare on JSON APIs.\n\t\t\t\t\tconst header = res.headers.get('Retry-After');\n\t\t\t\t\tconst retryAfter = header && /^\\d+$/.test(header) ? Number(header) : undefined;\n\t\t\t\t\tthrow new RateLimitError(message, retryAfter, data);\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new HostStackError(res.status, message, data);\n\t\t\t}\n\t\t}\n\n\t\t// Handle 204 No Content\n\t\tif (res.status === 204) {\n\t\t\treturn undefined as T;\n\t\t}\n\n\t\treturn res.json() as Promise<T>;\n\t}\n\n\t/**\n\t * Resolve a publicId-or-numeric id input to a numeric database id. Numeric\n\t * inputs short-circuit; publicIds (svc_xyz, dpl_xyz, etc.) are looked up\n\t * via the relevant list endpoint and cached on this client instance.\n\t *\n\t * The API addresses everything by numeric id internally; this resolver lets\n\t * SDK/MCP consumers pass either form interchangeably without burning extra\n\t * round-trips on subsequent calls.\n\t */\n\tasync resolveId(input: IdInput, scope: ResolveScope): Promise<number> {\n\t\tif (typeof input === 'number') return input;\n\t\tif (/^\\d+$/.test(input)) return Number.parseInt(input, 10);\n\n\t\tconst expectedPrefix = PREFIX[scope.kind];\n\t\tif (!input.startsWith(expectedPrefix)) {\n\t\t\tthrow new HostStackError(\n\t\t\t\t400,\n\t\t\t\t`Invalid ${scope.kind} id \"${input}\": expected ${expectedPrefix}xxx or numeric.`,\n\t\t\t);\n\t\t}\n\n\t\tconst cacheKey = `${cacheScope(scope)}:${input}`;\n\t\tconst cached = this.idCache.get(cacheKey);\n\t\tif (cached !== undefined) return cached;\n\n\t\tconst items = await this.fetchForResolution(scope);\n\t\tconst match = items.find((it) => it.publicId === input);\n\t\tif (!match) {\n\t\t\tthrow new NotFoundError(`${scope.kind} ${input} not found`);\n\t\t}\n\t\tthis.idCache.set(cacheKey, match.id);\n\t\treturn match.id;\n\t}\n\n\tprivate async fetchForResolution(\n\t\tscope: ResolveScope,\n\t): Promise<Array<{ id: number; publicId: string }>> {\n\t\tswitch (scope.kind) {\n\t\t\tcase 'team': {\n\t\t\t\tconst r = await this.request<{ teams: Array<{ id: number; publicId: string }> }>(\n\t\t\t\t\t'GET',\n\t\t\t\t\t'/api/teams',\n\t\t\t\t);\n\t\t\t\treturn r.teams ?? [];\n\t\t\t}\n\t\t\tcase 'project': {\n\t\t\t\tconst r = await this.request<{ projects: Array<{ id: number; publicId: string }> }>(\n\t\t\t\t\t'GET',\n\t\t\t\t\t`/api/projects/${scope.teamId}`,\n\t\t\t\t);\n\t\t\t\treturn r.projects ?? [];\n\t\t\t}\n\t\t\tcase 'service': {\n\t\t\t\tconst r = await this.request<{ services: Array<{ id: number; publicId: string }> }>(\n\t\t\t\t\t'GET',\n\t\t\t\t\t`/api/services/${scope.teamId}`,\n\t\t\t\t);\n\t\t\t\treturn r.services ?? [];\n\t\t\t}\n\t\t\tcase 'deploy': {\n\t\t\t\t// Deploys list is paginated and returns `{ data, page, ... }` —\n\t\t\t\t// not the bare `{ deploys: [] }` shape used by other endpoints.\n\t\t\t\t// resolveId only needs the latest pages, but we walk pagination\n\t\t\t\t// so older deploy publicIds still resolve.\n\t\t\t\tconst r = await this.request<{\n\t\t\t\t\tdata: Array<{ id: number; publicId: string }>;\n\t\t\t\t\ttotalPages?: number;\n\t\t\t\t}>('GET', `/api/services/${scope.teamId}/${scope.serviceId}/deploys?perPage=100`);\n\t\t\t\treturn r.data ?? [];\n\t\t\t}\n\t\t\tcase 'database': {\n\t\t\t\tconst r = await this.request<{\n\t\t\t\t\tdatabases: Array<{ id: number; publicId: string }>;\n\t\t\t\t}>('GET', `/api/databases/${scope.teamId}`);\n\t\t\t\treturn r.databases ?? [];\n\t\t\t}\n\t\t\tcase 'domain': {\n\t\t\t\tconst r = await this.request<{ domains: Array<{ id: number; publicId: string }> }>(\n\t\t\t\t\t'GET',\n\t\t\t\t\t`/api/domains/${scope.teamId}`,\n\t\t\t\t);\n\t\t\t\treturn r.domains ?? [];\n\t\t\t}\n\t\t\tcase 'volume': {\n\t\t\t\tconst r = await this.request<{\n\t\t\t\t\tvolumes: Array<{ id: number; publicId: string }>;\n\t\t\t\t}>('GET', `/api/services/${scope.teamId}/${scope.serviceId}/volumes`);\n\t\t\t\treturn r.volumes ?? [];\n\t\t\t}\n\t\t\tcase 'cronExecution': {\n\t\t\t\tconst r = await this.request<{\n\t\t\t\t\texecutions: Array<{ id: number; publicId: string }>;\n\t\t\t\t}>('GET', `/api/services/${scope.teamId}/${scope.serviceId}/cron-executions`);\n\t\t\t\treturn r.executions ?? [];\n\t\t\t}\n\t\t\tcase 'environment': {\n\t\t\t\t// Walk the team's projects to collect every env. Slightly\n\t\t\t\t// expensive but envs are small in count and the cache\n\t\t\t\t// amortizes subsequent lookups for the same client instance.\n\t\t\t\tconst projectsRes = await this.request<{\n\t\t\t\t\tprojects: Array<{ id: number; publicId: string }>;\n\t\t\t\t}>('GET', `/api/projects/${scope.teamId}`);\n\t\t\t\tconst envs: Array<{ id: number; publicId: string }> = [];\n\t\t\t\tfor (const p of projectsRes.projects ?? []) {\n\t\t\t\t\tconst r = await this.request<{\n\t\t\t\t\t\tenvironments: Array<{ id: number; publicId: string }>;\n\t\t\t\t\t}>('GET', `/api/environments/${scope.teamId}/${p.id}`);\n\t\t\t\t\tenvs.push(...(r.environments ?? []));\n\t\t\t\t}\n\t\t\t\treturn envs;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction cacheScope(scope: ResolveScope): string {\n\tswitch (scope.kind) {\n\t\tcase 'team':\n\t\t\treturn 'team';\n\t\tcase 'project':\n\t\tcase 'service':\n\t\tcase 'database':\n\t\tcase 'domain':\n\t\tcase 'environment':\n\t\t\treturn `${scope.kind}:${scope.teamId}`;\n\t\tcase 'deploy':\n\t\tcase 'volume':\n\t\tcase 'cronExecution':\n\t\t\treturn `${scope.kind}:${scope.teamId}:${scope.serviceId}`;\n\t}\n}\n","/**\n * Standard pagination parameters for list requests.\n *\n * Mirrors `packages/shared/src/schemas/pagination.ts` — the API uses\n * `page` (1-based) + `perPage` (≤100) everywhere. Use these names\n * directly in your code; the SDK serializes them as the matching\n * query-string params.\n */\nexport interface PaginationParams {\n\t/** 1-based page number. Default `1`. */\n\tpage?: number;\n\t/** Items per page. Range 1–100, default `20`. */\n\tperPage?: number;\n\t/** Free-text search applied server-side. ≤200 chars. */\n\tsearch?: string;\n\t/** Column to sort by (route-dependent). */\n\tsortBy?: string;\n\t/** Sort direction. Default `'desc'`. */\n\tsortOrder?: 'asc' | 'desc';\n}\n\n/**\n * A paginated response wrapper. Mirrors the shape every paginated API\n * endpoint returns under `data` + `total` + `page` + `perPage` + `totalPages`.\n */\nexport interface PaginatedResponse<T> {\n\tdata: T[];\n\ttotal: number;\n\tpage: number;\n\tperPage: number;\n\ttotalPages: number;\n}\n\n/**\n * Builds a query string from pagination params.\n * Returns an empty string if no params are set.\n */\nexport function buildPaginationQuery(params?: PaginationParams): string {\n\tif (!params) return '';\n\tconst qs = new URLSearchParams();\n\tif (params.page !== undefined) qs.set('page', String(params.page));\n\tif (params.perPage !== undefined) qs.set('perPage', String(params.perPage));\n\tif (params.search !== undefined) qs.set('search', params.search);\n\tif (params.sortBy !== undefined) qs.set('sortBy', params.sortBy);\n\tif (params.sortOrder !== undefined) qs.set('sortOrder', params.sortOrder);\n\tconst str = qs.toString();\n\treturn str ? `?${str}` : '';\n}\n"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/resources/cron.ts","../src/resources/databases.ts","../src/resources/deploys.ts","../src/resources/domains.ts","../src/resources/environments.ts","../src/resources/env-vars.ts","../src/resources/notifications.ts","../src/resources/projects.ts","../src/streaming.ts","../src/resources/services.ts","../src/resources/teams.ts","../src/resources/volumes.ts","../src/client.ts","../src/pagination.ts"],"names":["fetch"],"mappings":"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","file":"index.cjs","sourcesContent":["export class HostStackError extends Error {\n\tpublic readonly statusCode: number;\n\t/** Raw response body, if it parsed as JSON. Useful for surfacing field-level validation errors. */\n\tpublic readonly body: unknown;\n\n\tconstructor(statusCode: number, message: string, body?: unknown) {\n\t\tsuper(message);\n\t\tthis.name = 'HostStackError';\n\t\tthis.statusCode = statusCode;\n\t\tthis.body = body;\n\t}\n}\n\nexport class AuthenticationError extends HostStackError {\n\tconstructor(message = 'Authentication failed — check your API key.', body?: unknown) {\n\t\tsuper(401, message, body);\n\t\tthis.name = 'AuthenticationError';\n\t}\n}\n\nexport class ForbiddenError extends HostStackError {\n\tconstructor(message = 'Permission denied — API key lacks the required scope.', body?: unknown) {\n\t\tsuper(403, message, body);\n\t\tthis.name = 'ForbiddenError';\n\t}\n}\n\nexport class NotFoundError extends HostStackError {\n\tconstructor(message = 'Resource not found.', body?: unknown) {\n\t\tsuper(404, message, body);\n\t\tthis.name = 'NotFoundError';\n\t}\n}\n\nexport class ConflictError extends HostStackError {\n\tconstructor(\n\t\tmessage = 'Conflict — the resource state prevents this operation.',\n\t\tbody?: unknown,\n\t) {\n\t\tsuper(409, message, body);\n\t\tthis.name = 'ConflictError';\n\t}\n}\n\nexport class RateLimitError extends HostStackError {\n\t/**\n\t * Seconds to wait before retrying, parsed from the `Retry-After` response\n\t * header. `undefined` if the server didn't send one.\n\t */\n\tpublic readonly retryAfter: number | undefined;\n\n\tconstructor(\n\t\tmessage = 'Rate limit exceeded — back off and retry.',\n\t\tretryAfter?: number,\n\t\tbody?: unknown,\n\t) {\n\t\tsuper(429, message, body);\n\t\tthis.name = 'RateLimitError';\n\t\tthis.retryAfter = retryAfter;\n\t}\n}\n","import type { HostStack, IdInput } from '../client.ts';\nimport type { CronExecution } from '../types.ts';\n\nexport class CronResource {\n\tconstructor(private client: HostStack) {}\n\n\t/** List cron executions for a service. */\n\tasync list(\n\t\tteamId: IdInput,\n\t\tserviceId: IdInput,\n\t\toptions?: { limit?: number },\n\t): Promise<{ executions: CronExecution[] }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\tconst params = new URLSearchParams();\n\t\tif (options?.limit) params.set('limit', String(options.limit));\n\t\tconst qs = params.toString();\n\t\treturn this.client.request(\n\t\t\t'GET',\n\t\t\t`/api/services/${tid}/${sid}/cron-executions${qs ? `?${qs}` : ''}`,\n\t\t);\n\t}\n\n\t/** Get a single cron execution by ID. */\n\tasync get(\n\t\tteamId: IdInput,\n\t\tserviceId: IdInput,\n\t\texecutionId: IdInput,\n\t): Promise<{ execution: CronExecution }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\tconst eid = await this.client.resolveId(executionId, {\n\t\t\tkind: 'cronExecution',\n\t\t\tteamId: tid,\n\t\t\tserviceId: sid,\n\t\t});\n\t\treturn this.client.request('GET', `/api/services/${tid}/${sid}/cron-executions/${eid}`);\n\t}\n\n\t/** Trigger an immediate cron execution. */\n\tasync trigger(teamId: IdInput, serviceId: IdInput): Promise<{ execution: CronExecution }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\treturn this.client.request('POST', `/api/services/${tid}/${sid}/cron-executions/trigger`);\n\t}\n}\n","import type { HostStack, IdInput } from '../client.ts';\nimport type {\n\tCreateDatabaseInput,\n\tDatabase,\n\tDatabaseCredentials,\n\tUpdateDatabaseInput,\n} from '../types.ts';\n\nexport class DatabasesResource {\n\tconstructor(private client: HostStack) {}\n\n\t/**\n\t * List databases for the team. Pass `projectId` to scope to one\n\t * project; omit it to list every database the team owns.\n\t */\n\tasync list(teamId: IdInput, projectId?: IdInput): Promise<{ databases: Database[] }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tif (projectId === undefined) {\n\t\t\treturn this.client.request('GET', `/api/databases/${tid}`);\n\t\t}\n\t\tconst pid = await this.client.resolveId(projectId, { kind: 'project', teamId: tid });\n\t\treturn this.client.request('GET', `/api/databases/${tid}?projectId=${pid}`);\n\t}\n\n\t/** Get a single database by ID. */\n\tasync get(teamId: IdInput, databaseId: IdInput): Promise<{ database: Database }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst did = await this.client.resolveId(databaseId, { kind: 'database', teamId: tid });\n\t\treturn this.client.request('GET', `/api/databases/${tid}/${did}`);\n\t}\n\n\t/** Create a new database. */\n\tasync create(teamId: IdInput, data: CreateDatabaseInput): Promise<{ database: Database }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\treturn this.client.request('POST', `/api/databases/${tid}`, data);\n\t}\n\n\t/** Update a database. */\n\tasync update(\n\t\tteamId: IdInput,\n\t\tdatabaseId: IdInput,\n\t\tdata: UpdateDatabaseInput,\n\t): Promise<{ database: Database }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst did = await this.client.resolveId(databaseId, { kind: 'database', teamId: tid });\n\t\treturn this.client.request('PATCH', `/api/databases/${tid}/${did}`, data);\n\t}\n\n\t/** Delete a database. */\n\tasync delete(teamId: IdInput, databaseId: IdInput): Promise<void> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst did = await this.client.resolveId(databaseId, { kind: 'database', teamId: tid });\n\t\treturn this.client.request('DELETE', `/api/databases/${tid}/${did}`);\n\t}\n\n\t/** Suspend a database. */\n\tasync suspend(teamId: IdInput, databaseId: IdInput): Promise<void> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst did = await this.client.resolveId(databaseId, { kind: 'database', teamId: tid });\n\t\treturn this.client.request('POST', `/api/databases/${tid}/${did}/suspend`);\n\t}\n\n\t/** Resume a suspended database. */\n\tasync resume(teamId: IdInput, databaseId: IdInput): Promise<void> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst did = await this.client.resolveId(databaseId, { kind: 'database', teamId: tid });\n\t\treturn this.client.request('POST', `/api/databases/${tid}/${did}/resume`);\n\t}\n\n\t/** Get connection credentials. */\n\tasync getCredentials(\n\t\tteamId: IdInput,\n\t\tdatabaseId: IdInput,\n\t): Promise<{ credentials: DatabaseCredentials }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst did = await this.client.resolveId(databaseId, { kind: 'database', teamId: tid });\n\t\treturn this.client.request('GET', `/api/databases/${tid}/${did}/credentials`);\n\t}\n\n\t/** Reset the database password. */\n\tasync resetPassword(teamId: IdInput, databaseId: IdInput): Promise<void> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst did = await this.client.resolveId(databaseId, { kind: 'database', teamId: tid });\n\t\treturn this.client.request('POST', `/api/databases/${tid}/${did}/reset-password`);\n\t}\n\n\t/**\n\t * v89 (skyskraber #18): run a single READ ONLY statement against a\n\t * managed postgres database. Wrapped server-side in\n\t * `BEGIN TRANSACTION READ ONLY` with a 30s statement_timeout and a\n\t * 1000-row cap. Writes (INSERT/UPDATE/DELETE/DDL) fail with a\n\t * postgres \"cannot execute … in a read-only transaction\" error.\n\t *\n\t * Every call is audit-logged regardless of outcome (admin role\n\t * required server-side).\n\t *\n\t * Returns columns + rows-as-strings (CSV-serialized from psql) plus\n\t * a `truncated` flag if the result set was capped.\n\t */\n\tasync query(\n\t\tteamId: IdInput,\n\t\tdatabaseId: IdInput,\n\t\tsql: string,\n\t): Promise<{\n\t\tcolumns: string[];\n\t\trows: string[][];\n\t\trowCount: number;\n\t\ttruncated: boolean;\n\t\tdurationMs: number;\n\t}> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst did = await this.client.resolveId(databaseId, { kind: 'database', teamId: tid });\n\t\treturn this.client.request('POST', `/api/databases/${tid}/${did}/query`, { sql });\n\t}\n\n\t/**\n\t * v89 Phase 4: trigger a single-node → HA migration (Patroni 3-node\n\t * cluster). The customer-facing database briefly goes read-only during\n\t * the pg_dump → bootstrap → pg_restore. The standalone container stays\n\t * running (read-only) for 24 h as a rollback target before being\n\t * decommissioned automatically.\n\t *\n\t * Requires (server-side): PATRONI_ENABLED env on the deployment +\n\t * `teams.ha_beta=true` on this team. Throws 403 otherwise.\n\t *\n\t * Returns 202 — the upgrade is async; poll `get(...)` until\n\t * `pgEngineType === 'patroni'` + `status === 'available'` to confirm.\n\t */\n\tasync upgradeToHa(teamId: IdInput, databaseId: IdInput): Promise<void> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst did = await this.client.resolveId(databaseId, { kind: 'database', teamId: tid });\n\t\treturn this.client.request('POST', `/api/databases/${tid}/${did}/upgrade-to-ha`);\n\t}\n\n\t/**\n\t * In-place engine version upgrade (postgres/redis standalone). The agent\n\t * dumps the live data, recreates the container at `version` under the same\n\t * DNS name, and restores — so connection URLs stay valid. There's a brief\n\t * interruption (seconds) while the new container comes up.\n\t *\n\t * `version` must be a supported, strictly-newer version for the engine\n\t * (e.g. '18' for postgres, '8' for redis). Throws 400 otherwise.\n\t *\n\t * Returns 202 — the upgrade is async; poll `get(...)` until `version`\n\t * matches the target and `status === 'available'` to confirm.\n\t */\n\tasync upgradeVersion(teamId: IdInput, databaseId: IdInput, version: string): Promise<void> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst did = await this.client.resolveId(databaseId, { kind: 'database', teamId: tid });\n\t\treturn this.client.request('POST', `/api/databases/${tid}/${did}/upgrade-version`, {\n\t\t\tversion,\n\t\t});\n\t}\n\n\t/**\n\t * v89 Phase 5: cluster topology + failover history for a Patroni-managed\n\t * Postgres database. Returns 400 for standalone databases — call\n\t * `get(...)` first if you need to branch.\n\t */\n\tasync getCluster(\n\t\tteamId: IdInput,\n\t\tdatabaseId: IdInput,\n\t): Promise<{\n\t\tmembers: Array<{\n\t\t\tid: number;\n\t\t\tmemberRole: 'etcd' | 'primary-candidate' | 'replica' | 'proxy';\n\t\t\tcontainerId: string;\n\t\t\tworkerHostId: number | null;\n\t\t\tjoinedAt: string;\n\t\t\tleftAt: string | null;\n\t\t}>;\n\t\tfailovers: Array<{\n\t\t\tid: number;\n\t\t\tcreatedAt: string;\n\t\t\toldLeader: string | null;\n\t\t\tnewLeader: string | null;\n\t\t}>;\n\t}> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst did = await this.client.resolveId(databaseId, { kind: 'database', teamId: tid });\n\t\treturn this.client.request('GET', `/api/databases/${tid}/${did}/cluster`);\n\t}\n}\n","import type { HostStack, IdInput } from '../client.ts';\nimport type { Deploy, TriggerDeployInput } from '../types.ts';\n\nexport interface DeployListResponse {\n\tdata: Deploy[];\n\tpage: number;\n\tperPage: number;\n\ttotal: number;\n\ttotalPages: number;\n}\n\nexport class DeploysResource {\n\tconstructor(private client: HostStack) {}\n\n\t/**\n\t * List deploys for a service. Paginated — pass `page` / `perPage` to walk\n\t * pages. Default page=1, perPage=25, hard cap perPage=100.\n\t */\n\tasync list(\n\t\tteamId: IdInput,\n\t\tserviceId: IdInput,\n\t\toptions?: { page?: number; perPage?: number },\n\t): Promise<DeployListResponse> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\tconst params = new URLSearchParams();\n\t\tif (options?.page !== undefined) params.set('page', String(options.page));\n\t\tif (options?.perPage !== undefined) params.set('perPage', String(options.perPage));\n\t\tconst qs = params.toString();\n\t\treturn this.client.request(\n\t\t\t'GET',\n\t\t\t`/api/services/${tid}/${sid}/deploys${qs ? `?${qs}` : ''}`,\n\t\t);\n\t}\n\n\t/** Get a single deploy by ID. */\n\tasync get(teamId: IdInput, serviceId: IdInput, deployId: IdInput): Promise<{ deploy: Deploy }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\tconst did = await this.client.resolveId(deployId, {\n\t\t\tkind: 'deploy',\n\t\t\tteamId: tid,\n\t\t\tserviceId: sid,\n\t\t});\n\t\treturn this.client.request('GET', `/api/services/${tid}/${sid}/deploys/${did}`);\n\t}\n\n\t/** Trigger a new deploy. */\n\tasync trigger(\n\t\tteamId: IdInput,\n\t\tserviceId: IdInput,\n\t\tdata?: TriggerDeployInput,\n\t): Promise<{ deploy: Deploy }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\treturn this.client.request('POST', `/api/services/${tid}/${sid}/deploys`, data ?? {});\n\t}\n\n\t/** Cancel an in-progress deploy. */\n\tasync cancel(teamId: IdInput, serviceId: IdInput, deployId: IdInput): Promise<void> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\tconst did = await this.client.resolveId(deployId, {\n\t\t\tkind: 'deploy',\n\t\t\tteamId: tid,\n\t\t\tserviceId: sid,\n\t\t});\n\t\treturn this.client.request('POST', `/api/services/${tid}/${sid}/deploys/${did}/cancel`);\n\t}\n\n\t/** Rollback to a previous deploy. */\n\tasync rollback(teamId: IdInput, serviceId: IdInput, deployId: IdInput): Promise<void> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\tconst did = await this.client.resolveId(deployId, {\n\t\t\tkind: 'deploy',\n\t\t\tteamId: tid,\n\t\t\tserviceId: sid,\n\t\t});\n\t\treturn this.client.request('POST', `/api/services/${tid}/${sid}/deploys/${did}/rollback`);\n\t}\n\n\t/**\n\t * v66 P5: promote a built deploy to a sibling service in another\n\t * environment. Reuses the source deploy's docker image (no rebuild).\n\t * If no sibling service exists in the target env yet, the API auto-\n\t * creates one by cloning the source service's config.\n\t */\n\tasync promote(\n\t\tteamId: IdInput,\n\t\tserviceId: IdInput,\n\t\tdeployId: IdInput,\n\t\ttargetEnvironmentId: number,\n\t): Promise<{ deploy: Deploy }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\tconst did = await this.client.resolveId(deployId, {\n\t\t\tkind: 'deploy',\n\t\t\tteamId: tid,\n\t\t\tserviceId: sid,\n\t\t});\n\t\treturn this.client.request('POST', `/api/services/${tid}/${sid}/deploys/${did}/promote`, {\n\t\t\ttargetEnvironmentId,\n\t\t});\n\t}\n\n\t/**\n\t * Get build logs for a deploy.\n\t *\n\t * Pagination: pass `afterId` from the previous response's `nextAfterId`\n\t * to fetch the next page. Per-call cap is 5000; default 500.\n\t */\n\tasync getLogs(\n\t\tteamId: IdInput,\n\t\tserviceId: IdInput,\n\t\tdeployId: IdInput,\n\t\toptions?: {\n\t\t\tsearch?: string;\n\t\t\tlevel?: string;\n\t\t\tphase?: string;\n\t\t\tlimit?: number;\n\t\t\tafterId?: number;\n\t\t},\n\t): Promise<{ logs: DeployLogEntry[]; nextAfterId: number | null }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\tconst did = await this.client.resolveId(deployId, {\n\t\t\tkind: 'deploy',\n\t\t\tteamId: tid,\n\t\t\tserviceId: sid,\n\t\t});\n\t\tconst params = new URLSearchParams();\n\t\tif (options?.search) params.set('search', options.search);\n\t\tif (options?.level) params.set('level', options.level);\n\t\tif (options?.phase) params.set('phase', options.phase);\n\t\tif (options?.limit !== undefined) params.set('limit', String(options.limit));\n\t\tif (options?.afterId !== undefined) params.set('afterId', String(options.afterId));\n\t\tconst qs = params.toString();\n\t\tconst url = `/api/services/${tid}/${sid}/deploys/${did}/logs${qs ? `?${qs}` : ''}`;\n\t\treturn this.client.request('GET', url);\n\t}\n}\n\nexport interface DeployLogEntry {\n\tid: number;\n\tdeployId: number;\n\ttimestamp: string;\n\tlevel: 'info' | 'warn' | 'error' | 'debug';\n\tphase: string | null;\n\tmessage: string;\n}\n","import type { HostStack, IdInput } from '../client.ts';\nimport type { AddDomainInput, Domain, UpdateDomainInput } from '../types.ts';\n\nexport class DomainsResource {\n\tconstructor(private client: HostStack) {}\n\n\t/** List all domains for the active team. */\n\tasync list(teamId: IdInput): Promise<{ domains: Domain[] }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\treturn this.client.request('GET', `/api/domains/${tid}`);\n\t}\n\n\t/** Add a custom domain. */\n\tasync add(teamId: IdInput, data: AddDomainInput): Promise<{ domain: Domain }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(data.serviceId, { kind: 'service', teamId: tid });\n\t\treturn this.client.request('POST', `/api/domains/${tid}`, { ...data, serviceId: sid });\n\t}\n\n\t/** Update a domain. */\n\tasync update(\n\t\tteamId: IdInput,\n\t\tdomainId: IdInput,\n\t\tdata: UpdateDomainInput,\n\t): Promise<{ domain: Domain }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst did = await this.client.resolveId(domainId, { kind: 'domain', teamId: tid });\n\t\treturn this.client.request('PATCH', `/api/domains/${tid}/${did}`, data);\n\t}\n\n\t/** Remove a domain. */\n\tasync remove(teamId: IdInput, domainId: IdInput): Promise<void> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst did = await this.client.resolveId(domainId, { kind: 'domain', teamId: tid });\n\t\treturn this.client.request('DELETE', `/api/domains/${tid}/${did}`);\n\t}\n\n\t/** Verify domain DNS configuration. */\n\tasync verify(teamId: IdInput, domainId: IdInput): Promise<void> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst did = await this.client.resolveId(domainId, { kind: 'domain', teamId: tid });\n\t\treturn this.client.request('POST', `/api/domains/${tid}/${did}/verify`);\n\t}\n}\n","import type { HostStack, IdInput } from '../client.ts';\n\nexport interface Environment {\n\tid: number;\n\tpublicId: string;\n\tprojectId: number;\n\tname: string;\n\ttype: 'production' | 'staging' | 'development' | 'preview';\n\tisDefault: boolean;\n\tisProtected: boolean;\n\tcreatedAt: string;\n\tupdatedAt: string;\n}\n\nexport interface CreateEnvironmentInput {\n\tname: string;\n\ttype: 'production' | 'staging' | 'development' | 'preview';\n\tisProtected?: boolean;\n}\n\nexport interface UpdateEnvironmentInput {\n\tname?: string;\n\tisDefault?: boolean;\n\tisProtected?: boolean;\n}\n\n/**\n * v66 P5: programmatic env management. Each project has at least a\n * Production env auto-created at project creation; you can add more\n * via `create` and bind services/databases to them via the\n * `environmentId` field on those resources' create inputs.\n *\n * @example\n * ```ts\n * const { environment: staging } = await client.environments.create(\n * teamId,\n * projectId,\n * { name: 'Staging', type: 'staging' }\n * );\n * await client.services.create(teamId, {\n * projectId,\n * environmentId: staging.id,\n * name: 'api',\n * type: 'web_service',\n * // ...\n * });\n * ```\n */\nexport class EnvironmentsResource {\n\tconstructor(private client: HostStack) {}\n\n\t/** List all environments for a project. */\n\tasync list(teamId: IdInput, projectId: IdInput): Promise<{ environments: Environment[] }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst pid = await this.client.resolveId(projectId, { kind: 'project', teamId: tid });\n\t\treturn this.client.request('GET', `/api/environments/${tid}/${pid}`);\n\t}\n\n\t/** Get a single environment by id. */\n\tasync get(\n\t\tteamId: IdInput,\n\t\tprojectId: IdInput,\n\t\tenvId: IdInput,\n\t): Promise<{ environment: Environment }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst pid = await this.client.resolveId(projectId, { kind: 'project', teamId: tid });\n\t\tconst eid = await this.client.resolveId(envId, { kind: 'environment', teamId: tid });\n\t\treturn this.client.request('GET', `/api/environments/${tid}/${pid}/${eid}`);\n\t}\n\n\t/** Create a new environment in the given project. */\n\tasync create(\n\t\tteamId: IdInput,\n\t\tprojectId: IdInput,\n\t\tdata: CreateEnvironmentInput,\n\t): Promise<{ environment: Environment }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst pid = await this.client.resolveId(projectId, { kind: 'project', teamId: tid });\n\t\treturn this.client.request('POST', `/api/environments/${tid}/${pid}`, data);\n\t}\n\n\t/** Update environment metadata (name, default flag, protected flag). */\n\tasync update(\n\t\tteamId: IdInput,\n\t\tprojectId: IdInput,\n\t\tenvId: IdInput,\n\t\tdata: UpdateEnvironmentInput,\n\t): Promise<{ environment: Environment }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst pid = await this.client.resolveId(projectId, { kind: 'project', teamId: tid });\n\t\tconst eid = await this.client.resolveId(envId, { kind: 'environment', teamId: tid });\n\t\treturn this.client.request('PATCH', `/api/environments/${tid}/${pid}/${eid}`, data);\n\t}\n\n\t/**\n\t * Delete an environment. The API blocks delete when the env still\n\t * has services or databases attached — destroy them first or move\n\t * them to another env. Cannot delete the project's default env.\n\t */\n\tasync delete(teamId: IdInput, projectId: IdInput, envId: IdInput): Promise<void> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst pid = await this.client.resolveId(projectId, { kind: 'project', teamId: tid });\n\t\tconst eid = await this.client.resolveId(envId, { kind: 'environment', teamId: tid });\n\t\treturn this.client.request('DELETE', `/api/environments/${tid}/${pid}/${eid}`);\n\t}\n}\n","import type { HostStack, IdInput } from '../client.ts';\nimport type {\n\tBulkSetEnvVarsInput,\n\tCreateEnvVarInput,\n\tEnvVar,\n\tUpdateEnvVarInput,\n} from '../types.ts';\n\nexport class EnvVarsResource {\n\tconstructor(private client: HostStack) {}\n\n\t/** List all environment variables for a service. */\n\tasync list(teamId: IdInput, serviceId: IdInput): Promise<{ envVars: EnvVar[] }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\treturn this.client.request('GET', `/api/services/${tid}/${sid}/env`);\n\t}\n\n\t/** Create a new environment variable. */\n\tasync create(\n\t\tteamId: IdInput,\n\t\tserviceId: IdInput,\n\t\tdata: CreateEnvVarInput,\n\t): Promise<{ envVar: EnvVar }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\treturn this.client.request('POST', `/api/services/${tid}/${sid}/env`, data);\n\t}\n\n\t/** Update an environment variable. */\n\tasync update(\n\t\tteamId: IdInput,\n\t\tserviceId: IdInput,\n\t\tenvVarId: IdInput,\n\t\tdata: UpdateEnvVarInput,\n\t): Promise<{ envVar: EnvVar }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\tconst eid = typeof envVarId === 'number' ? envVarId : Number.parseInt(envVarId, 10);\n\t\tif (Number.isNaN(eid)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Invalid envVarId \"${envVarId}\": expected a numeric id (env vars have no publicId — read it from list()).`,\n\t\t\t);\n\t\t}\n\t\treturn this.client.request('PATCH', `/api/services/${tid}/${sid}/env/${eid}`, data);\n\t}\n\n\t/** Delete an environment variable. */\n\tasync delete(teamId: IdInput, serviceId: IdInput, envVarId: IdInput): Promise<void> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\tconst eid = typeof envVarId === 'number' ? envVarId : Number.parseInt(envVarId, 10);\n\t\tif (Number.isNaN(eid)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Invalid envVarId \"${envVarId}\": expected a numeric id (env vars have no publicId — read it from list()).`,\n\t\t\t);\n\t\t}\n\t\treturn this.client.request('DELETE', `/api/services/${tid}/${sid}/env/${eid}`);\n\t}\n\n\t/** Bulk set environment variables (create or update). */\n\tasync bulkSet(teamId: IdInput, serviceId: IdInput, data: BulkSetEnvVarsInput): Promise<void> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\treturn this.client.request('PUT', `/api/services/${tid}/${sid}/env/bulk`, data);\n\t}\n}\n","import type { HostStack, IdInput } from '../client.ts';\n\nexport type NotificationChannelType = 'slack' | 'discord' | 'email';\n\n/**\n * Events a notification channel can subscribe to. Source of truth is\n * `packages/shared/src/schemas/notification-channel.ts:NOTIFICATION_CHANNEL_EVENTS`.\n */\nexport type NotificationChannelEvent =\n\t| 'deploy.started'\n\t| 'deploy.succeeded'\n\t| 'deploy.failed'\n\t| 'deploy.failed_consecutive'\n\t| 'service.created'\n\t| 'service.deleted'\n\t| 'service.suspended'\n\t| 'service.resumed'\n\t| 'service.restart_failed'\n\t| 'service.auto_suspended'\n\t| 'service.acme_cert_failed'\n\t| 'git.auth_failed';\n\nexport interface NotificationChannel {\n\tid: number;\n\tteamId: number;\n\ttype: NotificationChannelType;\n\tname: string;\n\t/**\n\t * Webhook URL (Slack/Discord) or email address. The list API masks\n\t * the value for security — only the create/update calls round-trip\n\t * the real URL.\n\t */\n\twebhookUrl: string;\n\tactive: boolean;\n\tevents: NotificationChannelEvent[];\n\tcreatedAt: string;\n\tupdatedAt: string;\n}\n\nexport class NotificationsResource {\n\tconstructor(private client: HostStack) {}\n\n\t/**\n\t * List notification channels for the team. Webhook URLs are\n\t * server-side masked in the response so this is safe to log.\n\t */\n\tasync listChannels(teamId: IdInput): Promise<{ channels: NotificationChannel[] }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\treturn this.client.request('GET', `/api/notifications/${tid}/channels`);\n\t}\n\n\t/**\n\t * Create a Slack/Discord/email notification channel.\n\t *\n\t * For type=email, `webhookUrl` is the recipient email address; for\n\t * type=slack/discord it's the incoming webhook URL.\n\t *\n\t * `events` is the explicit subscription list — an empty array means\n\t * \"receive nothing\". The platform pre-selects the critical-event\n\t * set on the dashboard, but SDK callers must pass the list\n\t * explicitly so behaviour is deterministic.\n\t */\n\tasync createChannel(\n\t\tteamId: IdInput,\n\t\tdata: {\n\t\t\ttype: NotificationChannelType;\n\t\t\tname: string;\n\t\t\twebhookUrl: string;\n\t\t\tevents: NotificationChannelEvent[];\n\t\t},\n\t): Promise<{ channel: NotificationChannel }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\treturn this.client.request('POST', `/api/notifications/${tid}/channels`, data);\n\t}\n\n\t/**\n\t * Update a channel's name / active state / event subscriptions. The\n\t * webhook URL and type are immutable — create a new channel if\n\t * those need to change.\n\t */\n\tasync updateChannel(\n\t\tteamId: IdInput,\n\t\tchannelId: number,\n\t\tdata: {\n\t\t\tname?: string;\n\t\t\tactive?: boolean;\n\t\t\tevents?: NotificationChannelEvent[];\n\t\t},\n\t): Promise<{ channel: NotificationChannel }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\treturn this.client.request(\n\t\t\t'PATCH',\n\t\t\t`/api/notifications/${tid}/channels/${channelId}`,\n\t\t\tdata,\n\t\t);\n\t}\n\n\t/** Delete a notification channel. */\n\tasync deleteChannel(teamId: IdInput, channelId: number): Promise<void> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\treturn this.client.request('DELETE', `/api/notifications/${tid}/channels/${channelId}`);\n\t}\n\n\t/**\n\t * Fire a test event to the channel so the user can confirm the\n\t * webhook is wired correctly. Returns the dispatch outcome.\n\t */\n\tasync testChannel(\n\t\tteamId: IdInput,\n\t\tchannelId: number,\n\t): Promise<{ success: boolean; error?: string }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\treturn this.client.request('POST', `/api/notifications/${tid}/channels/${channelId}/test`);\n\t}\n}\n","import type { HostStack, IdInput } from '../client.ts';\nimport type { CreateProjectInput, Project, UpdateProjectInput } from '../types.ts';\n\nexport class ProjectsResource {\n\tconstructor(private client: HostStack) {}\n\n\t/** List all projects for the active team. */\n\tasync list(teamId: IdInput): Promise<{ projects: Project[] }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\treturn this.client.request('GET', `/api/projects/${tid}`);\n\t}\n\n\t/** Get a single project by ID. */\n\tasync get(teamId: IdInput, projectId: IdInput): Promise<{ project: Project }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst pid = await this.client.resolveId(projectId, { kind: 'project', teamId: tid });\n\t\treturn this.client.request('GET', `/api/projects/${tid}/${pid}`);\n\t}\n\n\t/** Create a new project. */\n\tasync create(teamId: IdInput, data: CreateProjectInput): Promise<{ project: Project }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\treturn this.client.request('POST', `/api/projects/${tid}`, data);\n\t}\n\n\t/** Update a project. */\n\tasync update(\n\t\tteamId: IdInput,\n\t\tprojectId: IdInput,\n\t\tdata: UpdateProjectInput,\n\t): Promise<{ project: Project }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst pid = await this.client.resolveId(projectId, { kind: 'project', teamId: tid });\n\t\treturn this.client.request('PATCH', `/api/projects/${tid}/${pid}`, data);\n\t}\n\n\t/** Delete a project. */\n\tasync delete(teamId: IdInput, projectId: IdInput): Promise<void> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst pid = await this.client.resolveId(projectId, { kind: 'project', teamId: tid });\n\t\treturn this.client.request('DELETE', `/api/projects/${tid}/${pid}`);\n\t}\n}\n","export interface LogEntry {\n\ttimestamp: string;\n\t/**\n\t * Parsed log level if the message is a structured JSON envelope\n\t * (pino numeric, `{\"level\":\"info\"}`, or `{\"severity\":\"WARNING\"}`).\n\t * `undefined` for plain-text logs.\n\t */\n\tlevel?: 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal' | null;\n\tstream?: 'stdout' | 'stderr' | null;\n\tmessage: string;\n}\n\nexport interface StreamLogsOptions {\n\t/** Filter by stream: 'stdout' or 'stderr'. */\n\tstream?: 'stdout' | 'stderr';\n\t/** Number of historical lines to fetch on first poll (default: 100). */\n\tinitialLines?: number;\n\t/** Poll interval in milliseconds (default: 2000). */\n\tpollInterval?: number;\n\t/** AbortSignal to stop streaming. */\n\tsignal?: AbortSignal;\n}\n\n/**\n * Streams runtime logs for a service by polling the logs REST endpoint.\n * Yields log entries as they appear. Use an AbortController to stop.\n *\n * @example\n * ```ts\n * const ac = new AbortController();\n * for await (const entry of client.services.streamLogs(teamId, serviceId, { signal: ac.signal })) {\n * console.log(entry.message);\n * }\n * ```\n */\nexport async function* streamLogsViaPolling(\n\tfetch: (path: string) => Promise<{ logs: LogEntry[] | string }>,\n\tbasePath: string,\n\toptions: StreamLogsOptions = {},\n): AsyncGenerator<LogEntry> {\n\tconst pollInterval = options.pollInterval ?? 2000;\n\tconst initialLines = options.initialLines ?? 100;\n\n\t// Track seen timestamps to avoid duplicates on first yield\n\tlet lastTimestamp: string | null = null;\n\n\tconst buildPath = (lines?: number, since?: string) => {\n\t\tconst params = new URLSearchParams();\n\t\tif (options.stream) params.set('stream', options.stream);\n\t\t// v63 P5: backend now standardises on `limit` + `since`; we keep the\n\t\t// `lines` SDK alias and pass it as `limit` so old + new wire formats\n\t\t// both work.\n\t\tif (lines !== undefined) params.set('limit', String(lines));\n\t\tif (since) params.set('since', since);\n\t\tconst qs = params.toString();\n\t\treturn `${basePath}${qs ? `?${qs}` : ''}`;\n\t};\n\n\t// Initial fetch\n\tconst initialData = await fetch(buildPath(initialLines));\n\tconst initial = normalizeEntries(initialData.logs);\n\tfor (const entry of initial) {\n\t\tyield entry;\n\t\tif (entry.timestamp > (lastTimestamp ?? '')) {\n\t\t\tlastTimestamp = entry.timestamp;\n\t\t}\n\t}\n\n\t// Poll loop\n\twhile (!options.signal?.aborted) {\n\t\tawait sleep(pollInterval, options.signal);\n\t\tif (options.signal?.aborted) break;\n\n\t\tconst sinceTs = lastTimestamp ? new Date(lastTimestamp).toISOString() : undefined;\n\t\tconst data = await fetch(buildPath(undefined, sinceTs)).catch(() => ({ logs: [] }));\n\t\tconst entries = normalizeEntries(data.logs);\n\n\t\tfor (const entry of entries) {\n\t\t\tif (!lastTimestamp || entry.timestamp > lastTimestamp) {\n\t\t\t\tyield entry;\n\t\t\t\tlastTimestamp = entry.timestamp;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction normalizeEntries(logs: LogEntry[] | string): LogEntry[] {\n\tif (typeof logs === 'string') {\n\t\tconst lines = logs.split('\\n').filter(Boolean);\n\t\treturn lines.map((line) => ({\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tmessage: line,\n\t\t}));\n\t}\n\treturn logs;\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n\treturn new Promise((resolve) => {\n\t\tconst timer = setTimeout(resolve, ms);\n\t\tif (signal) {\n\t\t\t// Resolve (not reject) on abort: the poll loop checks\n\t\t\t// `signal.aborted` right after the sleep and breaks cleanly, so\n\t\t\t// the documented AbortController usage terminates the `for await`\n\t\t\t// without throwing an AbortError at the consumer.\n\t\t\tsignal.addEventListener('abort', () => {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\tresolve();\n\t\t\t});\n\t\t}\n\t});\n}\n","import type { HostStack, IdInput } from '../client.ts';\nimport { type StreamLogsOptions, streamLogsViaPolling } from '../streaming.ts';\nimport type {\n\tCreateServiceInput,\n\tService,\n\tServiceConfig,\n\tServiceMetricsSnapshot,\n\tServiceStatus,\n\tServiceType,\n\tUpdateServiceConfigInput,\n\tUpdateServiceInput,\n} from '../types.ts';\n\ninterface LogEntry {\n\ttimestamp: string;\n\t/**\n\t * Parsed structured log level (pino numeric or string envelopes).\n\t * `undefined` for plain-text logs.\n\t */\n\tlevel?: 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal' | null;\n\tstream?: 'stdout' | 'stderr' | null;\n\tmessage: string;\n}\n\nexport class ServicesResource {\n\tconstructor(private client: HostStack) {}\n\n\t/**\n\t * List services for the active team.\n\t *\n\t * Optional filters narrow by project, environment, status, or type.\n\t * The server treats unknown enum values as no match (returns empty)\n\t * rather than 400-ing.\n\t */\n\tasync list(\n\t\tteamId: IdInput,\n\t\tfilters?: {\n\t\t\tprojectId?: number | string;\n\t\t\tenvironmentId?: number | string;\n\t\t\tstatus?: ServiceStatus;\n\t\t\ttype?: ServiceType;\n\t\t},\n\t): Promise<{ services: Service[] }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst params = new URLSearchParams();\n\t\tif (filters?.projectId !== undefined) params.set('projectId', String(filters.projectId));\n\t\tif (filters?.environmentId !== undefined)\n\t\t\tparams.set('environmentId', String(filters.environmentId));\n\t\tif (filters?.status) params.set('status', filters.status);\n\t\tif (filters?.type) params.set('type', filters.type);\n\t\tconst qs = params.toString();\n\t\treturn this.client.request('GET', `/api/services/${tid}${qs ? `?${qs}` : ''}`);\n\t}\n\n\t/** Get a single service by ID. */\n\tasync get(teamId: IdInput, serviceId: IdInput): Promise<{ service: Service }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\treturn this.client.request('GET', `/api/services/${tid}/${sid}`);\n\t}\n\n\t/** Create a new service. */\n\tasync create(teamId: IdInput, data: CreateServiceInput): Promise<{ service: Service }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\treturn this.client.request('POST', `/api/services/${tid}`, data);\n\t}\n\n\t/** Update a service. */\n\tasync update(\n\t\tteamId: IdInput,\n\t\tserviceId: IdInput,\n\t\tdata: UpdateServiceInput,\n\t): Promise<{ service: Service }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\treturn this.client.request('PATCH', `/api/services/${tid}/${sid}`, data);\n\t}\n\n\t/** Delete a service. */\n\tasync delete(teamId: IdInput, serviceId: IdInput): Promise<void> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\treturn this.client.request('DELETE', `/api/services/${tid}/${sid}`);\n\t}\n\n\t/**\n\t * Spin up an agentic dev environment FROM this service: a dev box that runs\n\t * a clone of the app (repo auto-cloned into /workspace, env-vars copied, and\n\t * the linked database cloned so it never touches prod), with an unguessable\n\t * public dev URL and seamless `git push`. Returns the dev box, its dev URL,\n\t * and the first deploy id.\n\t */\n\tasync spinUpDevEnvironment(\n\t\tteamId: IdInput,\n\t\tserviceId: IdInput,\n\t\toptions?: { includeDatabaseClone?: boolean; name?: string },\n\t): Promise<{ service: Service; devUrl: string; deployId: number | null }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\treturn this.client.request(\n\t\t\t'POST',\n\t\t\t`/api/services/${tid}/${sid}/dev-environment`,\n\t\t\toptions ?? {},\n\t\t);\n\t}\n\n\t/**\n\t * Tear a dev environment down: removes the dev box and cascade-deletes its\n\t * cloned database, /workspace volume, and the empty `development`\n\t * environment. `serviceId` is the dev box itself.\n\t */\n\tasync tearDownDevEnvironment(teamId: IdInput, serviceId: IdInput): Promise<{ success: true }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\treturn this.client.request('DELETE', `/api/services/${tid}/${sid}/dev-environment`);\n\t}\n\n\t/** Suspend a service. */\n\tasync suspend(teamId: IdInput, serviceId: IdInput): Promise<void> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\treturn this.client.request('POST', `/api/services/${tid}/${sid}/suspend`);\n\t}\n\n\t/** Resume a suspended service. */\n\tasync resume(teamId: IdInput, serviceId: IdInput): Promise<void> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\treturn this.client.request('POST', `/api/services/${tid}/${sid}/resume`);\n\t}\n\n\t/**\n\t * Get the latest metrics snapshot for a service.\n\t *\n\t * Returns `metrics: null` before the first agent sample lands;\n\t * `serverOverview: null` when the service is not currently placed\n\t * (suspended, between deploys, etc).\n\t */\n\tasync getMetrics(teamId: IdInput, serviceId: IdInput): Promise<ServiceMetricsSnapshot> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\treturn this.client.request('GET', `/api/services/${tid}/${sid}/metrics`);\n\t}\n\n\t/**\n\t * Get a metrics time series for a service.\n\t *\n\t * `from`/`to` accept ISO-8601 timestamps. Omit both for the trailing\n\t * hour. Server picks the resolution: raw samples ≤7d, hourly pre-\n\t * aggregates ≤30d, daily beyond that. Up to ~500 points returned.\n\t */\n\tasync getMetricsHistory(\n\t\tteamId: IdInput,\n\t\tserviceId: IdInput,\n\t\toptions?: { from?: string; to?: string },\n\t): Promise<{\n\t\thistory: Array<{\n\t\t\ttimestamp: string;\n\t\t\tcpuPercent: number;\n\t\t\tmemoryUsedMb: number;\n\t\t\tmemoryLimitMb: number;\n\t\t\tnetworkRxBytes: number;\n\t\t\tnetworkTxBytes: number;\n\t\t\tdiskUsedMb: number;\n\t\t}>;\n\t}> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\tconst params = new URLSearchParams();\n\t\tif (options?.from) params.set('from', options.from);\n\t\tif (options?.to) params.set('to', options.to);\n\t\tconst qs = params.toString();\n\t\treturn this.client.request(\n\t\t\t'GET',\n\t\t\t`/api/services/${tid}/${sid}/metrics/history${qs ? `?${qs}` : ''}`,\n\t\t);\n\t}\n\n\t/** Get service configuration. */\n\tasync getConfig(teamId: IdInput, serviceId: IdInput): Promise<{ config: ServiceConfig }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\treturn this.client.request('GET', `/api/services/${tid}/${sid}/config`);\n\t}\n\n\t/** Update service configuration. */\n\tasync updateConfig(\n\t\tteamId: IdInput,\n\t\tserviceId: IdInput,\n\t\tdata: UpdateServiceConfigInput,\n\t): Promise<{ config: ServiceConfig }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\treturn this.client.request('PATCH', `/api/services/${tid}/${sid}/config`, data);\n\t}\n\n\t/**\n\t * Get runtime logs for a service.\n\t *\n\t * `since`/`until` accept either an ISO-8601 timestamp or a short\n\t * relative offset like `-5m`, `-1h`, `-2d`.\n\t *\n\t * `search` does case-insensitive substring filtering server-side\n\t * (≤100 chars). `countOnly` returns just `{ count: N }` for cheap\n\t * polling — useful when you want to know \"how many error lines in the\n\t * last 5 minutes\" without paying the bytes.\n\t */\n\tasync getRuntimeLogs(\n\t\tteamId: IdInput,\n\t\tserviceId: IdInput,\n\t\toptions?: {\n\t\t\tlines?: number;\n\t\t\tlimit?: number;\n\t\t\tsince?: string;\n\t\t\tuntil?: string;\n\t\t\tstream?: 'stdout' | 'stderr';\n\t\t\tlevel?: 'stdout' | 'stderr' | 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal';\n\t\t\tsearch?: string;\n\t\t\tgrep?: string;\n\t\t\tcountOnly?: boolean;\n\t\t},\n\t): Promise<{ logs: LogEntry[] | string } | { count: number }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\tconst params = new URLSearchParams();\n\t\tconst lim = options?.limit ?? options?.lines;\n\t\tif (lim != null) params.set('limit', String(lim));\n\t\tif (options?.since) params.set('since', options.since);\n\t\tif (options?.until) params.set('until', options.until);\n\t\tif (options?.stream) params.set('stream', options.stream);\n\t\tif (options?.level) params.set('level', options.level);\n\t\tconst grep = options?.grep ?? options?.search;\n\t\tif (grep) params.set('search', grep);\n\t\tif (options?.countOnly) params.set('count_only', '1');\n\t\tconst qs = params.toString();\n\t\treturn this.client.request(\n\t\t\t'GET',\n\t\t\t`/api/services/${tid}/${sid}/runtime-logs${qs ? `?${qs}` : ''}`,\n\t\t);\n\t}\n\n\t/**\n\t * Stream runtime logs for a service by polling the logs endpoint.\n\t * Yields log entries as they appear. Use an AbortController to stop.\n\t *\n\t * @example\n\t * ```ts\n\t * const ac = new AbortController();\n\t * for await (const entry of client.services.streamLogs(teamId, serviceId, { signal: ac.signal })) {\n\t * console.log(entry.message);\n\t * }\n\t * ```\n\t */\n\tasync *streamLogs(\n\t\tteamId: IdInput,\n\t\tserviceId: IdInput,\n\t\toptions?: StreamLogsOptions,\n\t): AsyncGenerator<LogEntry> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\tconst basePath = `/api/services/${tid}/${sid}/runtime-logs`;\n\t\tyield* streamLogsViaPolling((path) => this.client.request('GET', path), basePath, options);\n\t}\n}\n","import type { HostStack } from '../client.ts';\nimport type { Team } from '../types.ts';\n\nexport class TeamsResource {\n\tconstructor(private client: HostStack) {}\n\n\t/**\n\t * List the teams the authenticated principal can access.\n\t *\n\t * Session auth: all teams the user belongs to.\n\t * API-key auth: the single team the key is bound to.\n\t */\n\tasync list(): Promise<{ teams: Team[] }> {\n\t\treturn this.client.request('GET', '/api/auth/teams');\n\t}\n}\n","import type { HostStack, IdInput } from '../client.ts';\nimport type { CreateVolumeInput, UpdateVolumeInput, Volume } from '../types.ts';\n\n/**\n * Manage persistent disks attached to a service.\n *\n * Volumes mount a writable disk into a service's container at the path you\n * choose, surviving redeploys and container restarts. One service can have\n * multiple volumes; each one is identified by a short `name` and a\n * `mountPath`.\n *\n * Renderers porting from render.yaml: a volume here is the same concept as\n * Render's `disk:` block. Use {@link create} to attach one programmatically,\n * or declare it in `hoststack.yaml` for IaC workflows.\n *\n * @example\n * ```ts\n * await client.volumes.create(team, service, {\n * name: 'data',\n * mountPath: '/var/data',\n * sizeGb: 10,\n * });\n * ```\n */\nexport class VolumesResource {\n\tconstructor(private client: HostStack) {}\n\n\t/** List volumes attached to a service. */\n\tasync list(teamId: IdInput, serviceId: IdInput): Promise<{ volumes: Volume[] }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\treturn this.client.request('GET', `/api/services/${tid}/${sid}/volumes`);\n\t}\n\n\t/** Attach a new volume to a service. Triggers provisioning on the host. */\n\tasync create(\n\t\tteamId: IdInput,\n\t\tserviceId: IdInput,\n\t\tdata: CreateVolumeInput,\n\t): Promise<{ volume: Volume }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\treturn this.client.request('POST', `/api/services/${tid}/${sid}/volumes`, data);\n\t}\n\n\t/**\n\t * Update a volume's mountPath or sizeGb. Resizes that take effect on the\n\t * next deploy; mountPath changes require a redeploy to remount.\n\t */\n\tasync update(\n\t\tteamId: IdInput,\n\t\tserviceId: IdInput,\n\t\tvolumeId: IdInput,\n\t\tdata: UpdateVolumeInput,\n\t): Promise<{ volume: Volume }> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\tconst vid = await this.client.resolveId(volumeId, {\n\t\t\tkind: 'volume',\n\t\t\tteamId: tid,\n\t\t\tserviceId: sid,\n\t\t});\n\t\treturn this.client.request('PATCH', `/api/services/${tid}/${sid}/volumes/${vid}`, data);\n\t}\n\n\t/**\n\t * Detach and deprovision a volume. The underlying disk is destroyed —\n\t * back up any data first. Async: the row is marked `deleting` and the\n\t * agent finalises the removal once it acks.\n\t */\n\tasync delete(teamId: IdInput, serviceId: IdInput, volumeId: IdInput): Promise<void> {\n\t\tconst tid = await this.client.resolveId(teamId, { kind: 'team' });\n\t\tconst sid = await this.client.resolveId(serviceId, { kind: 'service', teamId: tid });\n\t\tconst vid = await this.client.resolveId(volumeId, {\n\t\t\tkind: 'volume',\n\t\t\tteamId: tid,\n\t\t\tserviceId: sid,\n\t\t});\n\t\treturn this.client.request('DELETE', `/api/services/${tid}/${sid}/volumes/${vid}`);\n\t}\n}\n","import {\n\tAuthenticationError,\n\tConflictError,\n\tForbiddenError,\n\tHostStackError,\n\tNotFoundError,\n\tRateLimitError,\n} from './errors.ts';\nimport { CronResource } from './resources/cron.ts';\nimport { DatabasesResource } from './resources/databases.ts';\nimport { DeploysResource } from './resources/deploys.ts';\nimport { DomainsResource } from './resources/domains.ts';\nimport { EnvironmentsResource } from './resources/environments.ts';\nimport { EnvVarsResource } from './resources/env-vars.ts';\nimport { NotificationsResource } from './resources/notifications.ts';\nimport { ProjectsResource } from './resources/projects.ts';\nimport { ServicesResource } from './resources/services.ts';\nimport { TeamsResource } from './resources/teams.ts';\nimport { VolumesResource } from './resources/volumes.ts';\nimport type { MeResponse } from './types.ts';\n\n/** A numeric id or a publicId string (e.g. 42, \"42\", \"svc_abc…\"). */\nexport type IdInput = number | string;\n\nexport interface HostStackOptions {\n\t/** Your HostStack API key (hs_live_... or hs_test_...). */\n\tapiKey: string;\n\t/** Base URL of the HostStack API. Defaults to https://hoststack.dev */\n\tbaseUrl?: string;\n}\n\nconst PREFIX = {\n\tteam: 'team_',\n\tproject: 'prj_',\n\tservice: 'svc_',\n\tdeploy: 'dpl_',\n\tdatabase: 'db_',\n\tdomain: 'dom_',\n\tvolume: 'vol_',\n\tenvironment: 'env_',\n\tcronExecution: 'cjob_',\n} as const;\n\ntype ResolveScope =\n\t| { kind: 'team' }\n\t| { kind: 'project'; teamId: number }\n\t| { kind: 'service'; teamId: number }\n\t| { kind: 'deploy'; teamId: number; serviceId: number }\n\t| { kind: 'database'; teamId: number }\n\t| { kind: 'domain'; teamId: number }\n\t| { kind: 'volume'; teamId: number; serviceId: number }\n\t// v66 P5: env publicIds resolve numeric ids by hitting the project's\n\t// env list. The resource methods that call resolveId for env scope\n\t// only need teamId since the listForProject endpoint validates team\n\t// ownership; we accept publicId from any project the team owns.\n\t| { kind: 'environment'; teamId: number }\n\t| { kind: 'cronExecution'; teamId: number; serviceId: number };\n\nexport class HostStack {\n\tprivate apiKey: string;\n\tprivate baseUrl: string;\n\n\t// publicId → numeric id, scoped by parent context. Lifetime: client instance.\n\tprivate idCache = new Map<string, number>();\n\n\t/** Manage projects. */\n\tpublic readonly projects: ProjectsResource;\n\t/** Manage services (web, worker, cron). */\n\tpublic readonly services: ServicesResource;\n\t/** Trigger and manage deployments. */\n\tpublic readonly deploys: DeploysResource;\n\t/** Manage databases (Postgres, Redis). */\n\tpublic readonly databases: DatabasesResource;\n\t/** Manage custom domains. */\n\tpublic readonly domains: DomainsResource;\n\t/** Manage service environment variables. */\n\tpublic readonly envVars: EnvVarsResource;\n\t/** v66: manage environments (production/staging/development/preview) per project. */\n\tpublic readonly environments: EnvironmentsResource;\n\t/** Manage cron job executions. */\n\tpublic readonly cron: CronResource;\n\t/** Manage persistent disks attached to services. */\n\tpublic readonly volumes: VolumesResource;\n\t/**\n\t * Manage notification channels — Slack/Discord webhooks + email\n\t * recipients with per-channel event filters. Used for deploy\n\t * failures, restart loops, ACME failures, git auth losses, etc.\n\t */\n\tpublic readonly notifications: NotificationsResource;\n\t/** List the teams this API key (or session) can access. */\n\tpublic readonly teams: TeamsResource;\n\n\tconstructor(options: HostStackOptions) {\n\t\tif (!options.apiKey) {\n\t\t\tthrow new Error('apiKey is required');\n\t\t}\n\n\t\tthis.apiKey = options.apiKey;\n\t\tthis.baseUrl = (options.baseUrl ?? 'https://hoststack.dev').replace(/\\/$/, '');\n\n\t\tthis.projects = new ProjectsResource(this);\n\t\tthis.services = new ServicesResource(this);\n\t\tthis.deploys = new DeploysResource(this);\n\t\tthis.databases = new DatabasesResource(this);\n\t\tthis.domains = new DomainsResource(this);\n\t\tthis.envVars = new EnvVarsResource(this);\n\t\tthis.environments = new EnvironmentsResource(this);\n\t\tthis.cron = new CronResource(this);\n\t\tthis.volumes = new VolumesResource(this);\n\t\tthis.notifications = new NotificationsResource(this);\n\t\tthis.teams = new TeamsResource(this);\n\t}\n\n\t/**\n\t * Identify the authenticated principal. For API-key auth, `user` is\n\t * `null` and `team` is the team the key is bound to; `apiKey` carries\n\t * the key's permission scope (read or full).\n\t */\n\tasync me(): Promise<MeResponse> {\n\t\treturn this.request<MeResponse>('GET', '/api/auth/me');\n\t}\n\n\t/**\n\t * Make an authenticated request to the HostStack API.\n\t * Used internally by resource classes. Can also be used for custom API calls.\n\t */\n\tasync request<T>(method: string, path: string, body?: unknown): Promise<T> {\n\t\tconst url = `${this.baseUrl}${path}`;\n\n\t\tconst headers: Record<string, string> = {\n\t\t\tAuthorization: `Bearer ${this.apiKey}`,\n\t\t};\n\n\t\tif (body !== undefined) {\n\t\t\theaders['Content-Type'] = 'application/json';\n\t\t}\n\n\t\tconst res = await fetch(url, {\n\t\t\tmethod,\n\t\t\theaders,\n\t\t\tbody: body !== undefined ? JSON.stringify(body) : undefined,\n\t\t});\n\n\t\tif (!res.ok) {\n\t\t\tconst data = (await res.json().catch(() => ({ error: 'Unknown error' }))) as {\n\t\t\t\terror?: string;\n\t\t\t};\n\t\t\tconst message = data.error ?? `HTTP ${res.status}`;\n\n\t\t\tswitch (res.status) {\n\t\t\t\tcase 401:\n\t\t\t\t\tthrow new AuthenticationError(message, data);\n\t\t\t\tcase 403:\n\t\t\t\t\tthrow new ForbiddenError(message, data);\n\t\t\t\tcase 404:\n\t\t\t\t\tthrow new NotFoundError(message, data);\n\t\t\t\tcase 409:\n\t\t\t\t\tthrow new ConflictError(message, data);\n\t\t\t\tcase 429: {\n\t\t\t\t\t// RFC 9110 §10.2.3: Retry-After is either delta-seconds or an\n\t\t\t\t\t// HTTP-date. We accept seconds — HTTP-date is rare on JSON APIs.\n\t\t\t\t\tconst header = res.headers.get('Retry-After');\n\t\t\t\t\tconst retryAfter = header && /^\\d+$/.test(header) ? Number(header) : undefined;\n\t\t\t\t\tthrow new RateLimitError(message, retryAfter, data);\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new HostStackError(res.status, message, data);\n\t\t\t}\n\t\t}\n\n\t\t// Handle 204 No Content\n\t\tif (res.status === 204) {\n\t\t\treturn undefined as T;\n\t\t}\n\n\t\treturn res.json() as Promise<T>;\n\t}\n\n\t/**\n\t * Resolve a publicId-or-numeric id input to a numeric database id. Numeric\n\t * inputs short-circuit; publicIds (svc_xyz, dpl_xyz, etc.) are looked up\n\t * via the relevant list endpoint and cached on this client instance.\n\t *\n\t * The API addresses everything by numeric id internally; this resolver lets\n\t * SDK/MCP consumers pass either form interchangeably without burning extra\n\t * round-trips on subsequent calls.\n\t */\n\tasync resolveId(input: IdInput, scope: ResolveScope): Promise<number> {\n\t\tif (typeof input === 'number') return input;\n\t\tif (/^\\d+$/.test(input)) return Number.parseInt(input, 10);\n\n\t\tconst expectedPrefix = PREFIX[scope.kind];\n\t\tif (!input.startsWith(expectedPrefix)) {\n\t\t\tthrow new HostStackError(\n\t\t\t\t400,\n\t\t\t\t`Invalid ${scope.kind} id \"${input}\": expected ${expectedPrefix}xxx or numeric.`,\n\t\t\t);\n\t\t}\n\n\t\tconst cacheKey = `${cacheScope(scope)}:${input}`;\n\t\tconst cached = this.idCache.get(cacheKey);\n\t\tif (cached !== undefined) return cached;\n\n\t\tconst items = await this.fetchForResolution(scope);\n\t\tconst match = items.find((it) => it.publicId === input);\n\t\tif (!match) {\n\t\t\tthrow new NotFoundError(`${scope.kind} ${input} not found`);\n\t\t}\n\t\tthis.idCache.set(cacheKey, match.id);\n\t\treturn match.id;\n\t}\n\n\tprivate async fetchForResolution(\n\t\tscope: ResolveScope,\n\t): Promise<Array<{ id: number; publicId: string }>> {\n\t\tswitch (scope.kind) {\n\t\t\tcase 'team': {\n\t\t\t\tconst r = await this.request<{ teams: Array<{ id: number; publicId: string }> }>(\n\t\t\t\t\t'GET',\n\t\t\t\t\t'/api/teams',\n\t\t\t\t);\n\t\t\t\treturn r.teams ?? [];\n\t\t\t}\n\t\t\tcase 'project': {\n\t\t\t\tconst r = await this.request<{ projects: Array<{ id: number; publicId: string }> }>(\n\t\t\t\t\t'GET',\n\t\t\t\t\t`/api/projects/${scope.teamId}`,\n\t\t\t\t);\n\t\t\t\treturn r.projects ?? [];\n\t\t\t}\n\t\t\tcase 'service': {\n\t\t\t\tconst r = await this.request<{ services: Array<{ id: number; publicId: string }> }>(\n\t\t\t\t\t'GET',\n\t\t\t\t\t`/api/services/${scope.teamId}`,\n\t\t\t\t);\n\t\t\t\treturn r.services ?? [];\n\t\t\t}\n\t\t\tcase 'deploy': {\n\t\t\t\t// Deploys list is paginated and returns `{ data, page, ... }` —\n\t\t\t\t// not the bare `{ deploys: [] }` shape used by other endpoints.\n\t\t\t\t// resolveId only needs the latest pages, but we walk pagination\n\t\t\t\t// so older deploy publicIds still resolve.\n\t\t\t\tconst r = await this.request<{\n\t\t\t\t\tdata: Array<{ id: number; publicId: string }>;\n\t\t\t\t\ttotalPages?: number;\n\t\t\t\t}>('GET', `/api/services/${scope.teamId}/${scope.serviceId}/deploys?perPage=100`);\n\t\t\t\treturn r.data ?? [];\n\t\t\t}\n\t\t\tcase 'database': {\n\t\t\t\tconst r = await this.request<{\n\t\t\t\t\tdatabases: Array<{ id: number; publicId: string }>;\n\t\t\t\t}>('GET', `/api/databases/${scope.teamId}`);\n\t\t\t\treturn r.databases ?? [];\n\t\t\t}\n\t\t\tcase 'domain': {\n\t\t\t\tconst r = await this.request<{ domains: Array<{ id: number; publicId: string }> }>(\n\t\t\t\t\t'GET',\n\t\t\t\t\t`/api/domains/${scope.teamId}`,\n\t\t\t\t);\n\t\t\t\treturn r.domains ?? [];\n\t\t\t}\n\t\t\tcase 'volume': {\n\t\t\t\tconst r = await this.request<{\n\t\t\t\t\tvolumes: Array<{ id: number; publicId: string }>;\n\t\t\t\t}>('GET', `/api/services/${scope.teamId}/${scope.serviceId}/volumes`);\n\t\t\t\treturn r.volumes ?? [];\n\t\t\t}\n\t\t\tcase 'cronExecution': {\n\t\t\t\tconst r = await this.request<{\n\t\t\t\t\texecutions: Array<{ id: number; publicId: string }>;\n\t\t\t\t}>('GET', `/api/services/${scope.teamId}/${scope.serviceId}/cron-executions`);\n\t\t\t\treturn r.executions ?? [];\n\t\t\t}\n\t\t\tcase 'environment': {\n\t\t\t\t// Walk the team's projects to collect every env. Slightly\n\t\t\t\t// expensive but envs are small in count and the cache\n\t\t\t\t// amortizes subsequent lookups for the same client instance.\n\t\t\t\tconst projectsRes = await this.request<{\n\t\t\t\t\tprojects: Array<{ id: number; publicId: string }>;\n\t\t\t\t}>('GET', `/api/projects/${scope.teamId}`);\n\t\t\t\tconst envs: Array<{ id: number; publicId: string }> = [];\n\t\t\t\tfor (const p of projectsRes.projects ?? []) {\n\t\t\t\t\tconst r = await this.request<{\n\t\t\t\t\t\tenvironments: Array<{ id: number; publicId: string }>;\n\t\t\t\t\t}>('GET', `/api/environments/${scope.teamId}/${p.id}`);\n\t\t\t\t\tenvs.push(...(r.environments ?? []));\n\t\t\t\t}\n\t\t\t\treturn envs;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction cacheScope(scope: ResolveScope): string {\n\tswitch (scope.kind) {\n\t\tcase 'team':\n\t\t\treturn 'team';\n\t\tcase 'project':\n\t\tcase 'service':\n\t\tcase 'database':\n\t\tcase 'domain':\n\t\tcase 'environment':\n\t\t\treturn `${scope.kind}:${scope.teamId}`;\n\t\tcase 'deploy':\n\t\tcase 'volume':\n\t\tcase 'cronExecution':\n\t\t\treturn `${scope.kind}:${scope.teamId}:${scope.serviceId}`;\n\t}\n}\n","/**\n * Standard pagination parameters for list requests.\n *\n * Mirrors `packages/shared/src/schemas/pagination.ts` — the API uses\n * `page` (1-based) + `perPage` (≤100) everywhere. Use these names\n * directly in your code; the SDK serializes them as the matching\n * query-string params.\n */\nexport interface PaginationParams {\n\t/** 1-based page number. Default `1`. */\n\tpage?: number;\n\t/** Items per page. Range 1–100, default `20`. */\n\tperPage?: number;\n\t/** Free-text search applied server-side. ≤200 chars. */\n\tsearch?: string;\n\t/** Column to sort by (route-dependent). */\n\tsortBy?: string;\n\t/** Sort direction. Default `'desc'`. */\n\tsortOrder?: 'asc' | 'desc';\n}\n\n/**\n * A paginated response wrapper. Mirrors the shape every paginated API\n * endpoint returns under `data` + `total` + `page` + `perPage` + `totalPages`.\n */\nexport interface PaginatedResponse<T> {\n\tdata: T[];\n\ttotal: number;\n\tpage: number;\n\tperPage: number;\n\ttotalPages: number;\n}\n\n/**\n * Builds a query string from pagination params.\n * Returns an empty string if no params are set.\n */\nexport function buildPaginationQuery(params?: PaginationParams): string {\n\tif (!params) return '';\n\tconst qs = new URLSearchParams();\n\tif (params.page !== undefined) qs.set('page', String(params.page));\n\tif (params.perPage !== undefined) qs.set('perPage', String(params.perPage));\n\tif (params.search !== undefined) qs.set('search', params.search);\n\tif (params.sortBy !== undefined) qs.set('sortBy', params.sortBy);\n\tif (params.sortOrder !== undefined) qs.set('sortOrder', params.sortOrder);\n\tconst str = qs.toString();\n\treturn str ? `?${str}` : '';\n}\n"]}