@hoststack.dev/sdk 0.8.2 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -1,35 +1,47 @@
1
+ /**
2
+ * Region identifiers accepted by every endpoint that takes a `region`
3
+ * input. Mirrors `packages/shared/src/constants/regions.ts:30` — keep
4
+ * the two in sync when adding a region.
5
+ */
6
+ type RegionId = 'eu-central-1' | 'eu-central-2' | 'eu-west-1' | 'us-east-1';
1
7
  interface Project {
2
8
  id: number;
3
9
  publicId: string;
4
10
  name: string;
5
11
  slug: string;
6
12
  description?: string | null;
7
- region: string;
13
+ region: RegionId;
8
14
  createdAt: string;
9
15
  updatedAt: string;
10
16
  }
11
17
  interface CreateProjectInput {
12
18
  name: string;
13
19
  description?: string;
14
- region?: string;
20
+ region?: RegionId;
15
21
  }
16
22
  interface UpdateProjectInput {
17
23
  name?: string;
18
24
  description?: string;
19
25
  }
26
+ type ServiceType = 'web_service' | 'private_service' | 'worker' | 'cron_job' | 'static_site';
27
+ /**
28
+ * v89: `sleeping` is the free-tier idle state — container is `docker pause`d
29
+ * but warm-resumes <100ms on the next request. Distinct from `suspended`
30
+ * (admin/user action; container fully stopped, requires a deploy to revive).
31
+ */
32
+ type ServiceStatus = 'active' | 'deploying' | 'suspended' | 'failed' | 'not_deployed' | 'sleeping';
33
+ type ServicePlan = 'pico' | 'nano' | 'micro' | 'starter' | 'standard' | 'pro_standard' | 'pro_large';
20
34
  interface Service {
21
35
  id: number;
22
36
  publicId: string;
23
37
  name: string;
24
- type: string;
25
- status: string;
38
+ type: ServiceType;
39
+ status: ServiceStatus;
26
40
  internalUrl?: string | null;
27
41
  projectId: number;
28
42
  createdAt: string;
29
43
  updatedAt: string;
30
44
  }
31
- type ServiceType = 'web_service' | 'private_service' | 'worker' | 'cron_job' | 'static_site';
32
- type ServicePlan = 'pico' | 'nano' | 'micro' | 'starter' | 'standard' | 'pro_standard' | 'pro_large';
33
45
  interface CreateServiceInput {
34
46
  name: string;
35
47
  type: ServiceType;
@@ -147,11 +159,17 @@ interface UpdateServiceConfigInput {
147
159
  action: 'drop' | 'downgrade';
148
160
  }> | null;
149
161
  }
162
+ /**
163
+ * `superseded` (v63 P4) means a newer push for the same (service, branch) arrived
164
+ * before this deploy could finish. Distinct from `cancelled` (operator-initiated).
165
+ */
166
+ type DeployStatus = 'pending' | 'building' | 'build_failed' | 'deploying' | 'live' | 'failed' | 'cancelled' | 'deactivated' | 'superseded';
167
+ type DeployTrigger = 'github_push' | 'gitlab_push' | 'bitbucket_push' | 'manual' | 'rollback' | 'api' | 'config_change';
150
168
  interface Deploy {
151
169
  id: number;
152
170
  publicId: string;
153
- status: string;
154
- trigger: string;
171
+ status: DeployStatus;
172
+ trigger: DeployTrigger;
155
173
  commitHash?: string | null;
156
174
  commitMessage?: string | null;
157
175
  createdAt: string;
@@ -196,6 +214,13 @@ interface TriggerDeployInput {
196
214
  }
197
215
  /** Managed database engines supported by HostStack. */
198
216
  type DatabaseEngine = 'postgres' | 'redis' | 'mysql' | 'mariadb' | 'mongodb';
217
+ /**
218
+ * `migrating` (v89 Phase 4) is the transient state while the agent runs the
219
+ * single-node → HA migration (pg_dump → bootstrap → pg_restore). Reads stay
220
+ * read-only during this window.
221
+ */
222
+ type DatabaseStatus = 'creating' | 'available' | 'suspended' | 'deleting' | 'error' | 'migrating';
223
+ type DatabasePlan = 'free' | 'micro' | 'starter' | 'standard' | 'pro';
199
224
  interface Database {
200
225
  id: number;
201
226
  publicId: string;
@@ -203,10 +228,10 @@ interface Database {
203
228
  /** The engine name. The legacy `type` alias still ships in API responses
204
229
  * but is deprecated — read `engine` going forward. */
205
230
  engine: DatabaseEngine;
206
- status: string;
231
+ status: DatabaseStatus;
207
232
  version?: string | null;
208
- plan?: string | null;
209
- region?: string | null;
233
+ plan?: DatabasePlan | null;
234
+ region?: RegionId | null;
210
235
  projectId: number;
211
236
  diskSizeGb?: number;
212
237
  memoryMb?: number;
@@ -227,12 +252,12 @@ interface CreateDatabaseInput {
227
252
  */
228
253
  environmentId?: number;
229
254
  version?: string;
230
- plan?: 'free' | 'micro' | 'starter' | 'standard' | 'pro';
231
- region?: string;
255
+ plan?: DatabasePlan;
256
+ region?: RegionId;
232
257
  }
233
258
  interface UpdateDatabaseInput {
234
259
  name?: string;
235
- plan?: 'free' | 'micro' | 'starter' | 'standard' | 'pro';
260
+ plan?: DatabasePlan;
236
261
  /** Grow the database disk in GB. Cannot shrink. */
237
262
  diskSizeGb?: number;
238
263
  }
@@ -275,11 +300,12 @@ interface UpdateVolumeInput {
275
300
  mountPath?: string;
276
301
  sizeGb?: number;
277
302
  }
303
+ type DomainStatus = 'pending' | 'active' | 'failed' | 'deleting';
278
304
  interface Domain {
279
305
  id: number;
280
306
  publicId: string;
281
307
  domain: string;
282
- status: string;
308
+ status: DomainStatus;
283
309
  verified: boolean;
284
310
  serviceId?: number | null;
285
311
  createdAt: string;
@@ -330,12 +356,13 @@ interface User {
330
356
  email: string;
331
357
  avatarUrl?: string | null;
332
358
  }
359
+ type TeamRole = 'owner' | 'admin' | 'member';
333
360
  interface Team {
334
361
  id: number;
335
362
  publicId: string;
336
363
  name: string;
337
364
  slug: string;
338
- role: string;
365
+ role: TeamRole;
339
366
  }
340
367
  interface MeResponse {
341
368
  /** Null when authenticated with an API key (no associated user). */
@@ -345,7 +372,12 @@ interface MeResponse {
345
372
  id: number;
346
373
  permission: string;
347
374
  };
375
+ /** `'test'` when the API is wired to Stripe's test mode, `'live'` otherwise. */
348
376
  stripeMode?: string;
377
+ /** True when the caller is a superadmin acting on behalf of another team. Always false for API-key auth. */
378
+ isImpersonating?: boolean;
379
+ /** v88 P1b: server-side flag the dashboard renders as a "please add a card" prompt for free-tier teams 14+ days in. */
380
+ cardPromptVisible?: boolean;
349
381
  }
350
382
  /**
351
383
  * A single point in a service metrics time series. Same shape used for
@@ -376,14 +408,16 @@ interface ServiceMetricsSnapshot {
376
408
  containerCount: number;
377
409
  } | null;
378
410
  }
411
+ type CronExecutionStatus = 'pending' | 'running' | 'succeeded' | 'failed';
412
+ type CronExecutionTrigger = 'scheduled' | 'manual';
379
413
  interface CronExecution {
380
414
  id: number;
381
415
  publicId: string;
382
- status: string;
416
+ status: CronExecutionStatus;
383
417
  startedAt?: string | null;
384
418
  finishedAt?: string | null;
385
419
  exitCode?: number | null;
386
- triggeredBy?: string | null;
420
+ triggeredBy?: CronExecutionTrigger | null;
387
421
  createdAt: string;
388
422
  }
389
423
  interface ActivityLogEntry {
@@ -827,8 +861,8 @@ declare class ServicesResource {
827
861
  list(teamId: IdInput, filters?: {
828
862
  projectId?: number | string;
829
863
  environmentId?: number | string;
830
- status?: 'active' | 'deploying' | 'suspended' | 'failed' | 'not_deployed';
831
- type?: 'web_service' | 'private_service' | 'worker' | 'cron_job' | 'static_site';
864
+ status?: ServiceStatus;
865
+ type?: ServiceType;
832
866
  }): Promise<{
833
867
  services: Service[];
834
868
  }>;
@@ -928,6 +962,20 @@ declare class ServicesResource {
928
962
  streamLogs(teamId: IdInput, serviceId: IdInput, options?: StreamLogsOptions): AsyncGenerator<LogEntry>;
929
963
  }
930
964
 
965
+ declare class TeamsResource {
966
+ private client;
967
+ constructor(client: HostStack);
968
+ /**
969
+ * List the teams the authenticated principal can access.
970
+ *
971
+ * Session auth: all teams the user belongs to.
972
+ * API-key auth: the single team the key is bound to.
973
+ */
974
+ list(): Promise<{
975
+ teams: Team[];
976
+ }>;
977
+ }
978
+
931
979
  /**
932
980
  * Manage persistent disks attached to a service.
933
981
  *
@@ -1041,7 +1089,15 @@ declare class HostStack {
1041
1089
  * failures, restart loops, ACME failures, git auth losses, etc.
1042
1090
  */
1043
1091
  readonly notifications: NotificationsResource;
1092
+ /** List the teams this API key (or session) can access. */
1093
+ readonly teams: TeamsResource;
1044
1094
  constructor(options: HostStackOptions);
1095
+ /**
1096
+ * Identify the authenticated principal. For API-key auth, `user` is
1097
+ * `null` and `team` is the team the key is bound to; `apiKey` carries
1098
+ * the key's permission scope (read or full).
1099
+ */
1100
+ me(): Promise<MeResponse>;
1045
1101
  /**
1046
1102
  * Make an authenticated request to the HostStack API.
1047
1103
  * Used internally by resource classes. Can also be used for custom API calls.
@@ -1089,32 +1145,39 @@ declare class RateLimitError extends HostStackError {
1089
1145
 
1090
1146
  /**
1091
1147
  * Standard pagination parameters for list requests.
1148
+ *
1149
+ * Mirrors `packages/shared/src/schemas/pagination.ts` — the API uses
1150
+ * `page` (1-based) + `perPage` (≤100) everywhere. Use these names
1151
+ * directly in your code; the SDK serializes them as the matching
1152
+ * query-string params.
1092
1153
  */
1093
1154
  interface PaginationParams {
1094
- /** Maximum number of items to return. */
1095
- limit?: number;
1096
- /** Number of items to skip. */
1097
- offset?: number;
1155
+ /** 1-based page number. Default `1`. */
1156
+ page?: number;
1157
+ /** Items per page. Range 1–100, default `20`. */
1158
+ perPage?: number;
1159
+ /** Free-text search applied server-side. ≤200 chars. */
1160
+ search?: string;
1161
+ /** Column to sort by (route-dependent). */
1162
+ sortBy?: string;
1163
+ /** Sort direction. Default `'desc'`. */
1164
+ sortOrder?: 'asc' | 'desc';
1098
1165
  }
1099
1166
  /**
1100
- * A paginated response wrapper.
1167
+ * A paginated response wrapper. Mirrors the shape every paginated API
1168
+ * endpoint returns under `data` + `total` + `page` + `perPage` + `totalPages`.
1101
1169
  */
1102
1170
  interface PaginatedResponse<T> {
1103
- items: T[];
1171
+ data: T[];
1104
1172
  total: number;
1105
- limit: number;
1106
- offset: number;
1107
- hasMore: boolean;
1173
+ page: number;
1174
+ perPage: number;
1175
+ totalPages: number;
1108
1176
  }
1109
1177
  /**
1110
1178
  * Builds a query string from pagination params.
1111
1179
  * Returns an empty string if no params are set.
1112
1180
  */
1113
1181
  declare function buildPaginationQuery(params?: PaginationParams): string;
1114
- /**
1115
- * Wraps a plain array result into a PaginatedResponse.
1116
- * Useful when the API returns a flat array without pagination metadata.
1117
- */
1118
- declare function wrapArray<T>(items: T[], params?: PaginationParams): PaginatedResponse<T>;
1119
1182
 
1120
- export { type ActivityLogEntry, type AddDomainInput, AuthenticationError, type BulkSetEnvVarsInput, ConflictError, type CreateDatabaseInput, type CreateEnvVarInput, type CreateEnvironmentInput, type CreateProjectInput, type CreateServiceInput, type CreateVolumeInput, type CronExecution, type Database, type DatabaseCredentials, type Deploy, type DeployListResponse, type DeployLogEntry, type Domain, type EnvVar, type Environment, ForbiddenError, HostStack, HostStackError, type HostStackOptions, type IdInput, type LogEntry$1 as LogEntry, type MeResponse, NotFoundError, type NotificationChannel, type NotificationChannelEvent, type NotificationChannelType, type PaginatedResponse, type PaginationParams, type Project, RateLimitError, type Service, type ServiceConfig, type ServiceMetricsPoint, type ServiceMetricsSnapshot, type ServicePlan, type ServiceType, type StreamLogsOptions, type Team, type TriggerDeployInput, type UpdateDatabaseInput, type UpdateDomainInput, type UpdateEnvVarInput, type UpdateEnvironmentInput, type UpdateProjectInput, type UpdateServiceConfigInput, type UpdateServiceInput, type UpdateVolumeInput, type User, type Volume, buildPaginationQuery, wrapArray };
1183
+ export { type ActivityLogEntry, type AddDomainInput, AuthenticationError, type BulkSetEnvVarsInput, ConflictError, type CreateDatabaseInput, type CreateEnvVarInput, type CreateEnvironmentInput, type CreateProjectInput, type CreateServiceInput, type CreateVolumeInput, type CronExecution, type CronExecutionStatus, type CronExecutionTrigger, type Database, type DatabaseCredentials, type DatabaseEngine, type DatabasePlan, type DatabaseStatus, type Deploy, type DeployListResponse, type DeployLogEntry, type DeployStatus, type DeployTrigger, type Domain, type DomainStatus, type EnvVar, type EnvVarTarget, type Environment, ForbiddenError, HostStack, HostStackError, type HostStackOptions, type IdInput, type LogEntry$1 as LogEntry, type MeResponse, NotFoundError, type NotificationChannel, type NotificationChannelEvent, type NotificationChannelType, type PaginatedResponse, type PaginationParams, type Project, RateLimitError, type RegionId, type Service, type ServiceConfig, type ServiceMetricsPoint, type ServiceMetricsSnapshot, type ServicePlan, type ServiceStatus, type ServiceType, type StreamLogsOptions, type Team, type TeamRole, type TriggerDeployInput, type UpdateDatabaseInput, type UpdateDomainInput, type UpdateEnvVarInput, type UpdateEnvironmentInput, type UpdateProjectInput, type UpdateServiceConfigInput, type UpdateServiceInput, type UpdateVolumeInput, type User, type Volume, buildPaginationQuery };
package/dist/index.d.ts CHANGED
@@ -1,35 +1,47 @@
1
+ /**
2
+ * Region identifiers accepted by every endpoint that takes a `region`
3
+ * input. Mirrors `packages/shared/src/constants/regions.ts:30` — keep
4
+ * the two in sync when adding a region.
5
+ */
6
+ type RegionId = 'eu-central-1' | 'eu-central-2' | 'eu-west-1' | 'us-east-1';
1
7
  interface Project {
2
8
  id: number;
3
9
  publicId: string;
4
10
  name: string;
5
11
  slug: string;
6
12
  description?: string | null;
7
- region: string;
13
+ region: RegionId;
8
14
  createdAt: string;
9
15
  updatedAt: string;
10
16
  }
11
17
  interface CreateProjectInput {
12
18
  name: string;
13
19
  description?: string;
14
- region?: string;
20
+ region?: RegionId;
15
21
  }
16
22
  interface UpdateProjectInput {
17
23
  name?: string;
18
24
  description?: string;
19
25
  }
26
+ type ServiceType = 'web_service' | 'private_service' | 'worker' | 'cron_job' | 'static_site';
27
+ /**
28
+ * v89: `sleeping` is the free-tier idle state — container is `docker pause`d
29
+ * but warm-resumes <100ms on the next request. Distinct from `suspended`
30
+ * (admin/user action; container fully stopped, requires a deploy to revive).
31
+ */
32
+ type ServiceStatus = 'active' | 'deploying' | 'suspended' | 'failed' | 'not_deployed' | 'sleeping';
33
+ type ServicePlan = 'pico' | 'nano' | 'micro' | 'starter' | 'standard' | 'pro_standard' | 'pro_large';
20
34
  interface Service {
21
35
  id: number;
22
36
  publicId: string;
23
37
  name: string;
24
- type: string;
25
- status: string;
38
+ type: ServiceType;
39
+ status: ServiceStatus;
26
40
  internalUrl?: string | null;
27
41
  projectId: number;
28
42
  createdAt: string;
29
43
  updatedAt: string;
30
44
  }
31
- type ServiceType = 'web_service' | 'private_service' | 'worker' | 'cron_job' | 'static_site';
32
- type ServicePlan = 'pico' | 'nano' | 'micro' | 'starter' | 'standard' | 'pro_standard' | 'pro_large';
33
45
  interface CreateServiceInput {
34
46
  name: string;
35
47
  type: ServiceType;
@@ -147,11 +159,17 @@ interface UpdateServiceConfigInput {
147
159
  action: 'drop' | 'downgrade';
148
160
  }> | null;
149
161
  }
162
+ /**
163
+ * `superseded` (v63 P4) means a newer push for the same (service, branch) arrived
164
+ * before this deploy could finish. Distinct from `cancelled` (operator-initiated).
165
+ */
166
+ type DeployStatus = 'pending' | 'building' | 'build_failed' | 'deploying' | 'live' | 'failed' | 'cancelled' | 'deactivated' | 'superseded';
167
+ type DeployTrigger = 'github_push' | 'gitlab_push' | 'bitbucket_push' | 'manual' | 'rollback' | 'api' | 'config_change';
150
168
  interface Deploy {
151
169
  id: number;
152
170
  publicId: string;
153
- status: string;
154
- trigger: string;
171
+ status: DeployStatus;
172
+ trigger: DeployTrigger;
155
173
  commitHash?: string | null;
156
174
  commitMessage?: string | null;
157
175
  createdAt: string;
@@ -196,6 +214,13 @@ interface TriggerDeployInput {
196
214
  }
197
215
  /** Managed database engines supported by HostStack. */
198
216
  type DatabaseEngine = 'postgres' | 'redis' | 'mysql' | 'mariadb' | 'mongodb';
217
+ /**
218
+ * `migrating` (v89 Phase 4) is the transient state while the agent runs the
219
+ * single-node → HA migration (pg_dump → bootstrap → pg_restore). Reads stay
220
+ * read-only during this window.
221
+ */
222
+ type DatabaseStatus = 'creating' | 'available' | 'suspended' | 'deleting' | 'error' | 'migrating';
223
+ type DatabasePlan = 'free' | 'micro' | 'starter' | 'standard' | 'pro';
199
224
  interface Database {
200
225
  id: number;
201
226
  publicId: string;
@@ -203,10 +228,10 @@ interface Database {
203
228
  /** The engine name. The legacy `type` alias still ships in API responses
204
229
  * but is deprecated — read `engine` going forward. */
205
230
  engine: DatabaseEngine;
206
- status: string;
231
+ status: DatabaseStatus;
207
232
  version?: string | null;
208
- plan?: string | null;
209
- region?: string | null;
233
+ plan?: DatabasePlan | null;
234
+ region?: RegionId | null;
210
235
  projectId: number;
211
236
  diskSizeGb?: number;
212
237
  memoryMb?: number;
@@ -227,12 +252,12 @@ interface CreateDatabaseInput {
227
252
  */
228
253
  environmentId?: number;
229
254
  version?: string;
230
- plan?: 'free' | 'micro' | 'starter' | 'standard' | 'pro';
231
- region?: string;
255
+ plan?: DatabasePlan;
256
+ region?: RegionId;
232
257
  }
233
258
  interface UpdateDatabaseInput {
234
259
  name?: string;
235
- plan?: 'free' | 'micro' | 'starter' | 'standard' | 'pro';
260
+ plan?: DatabasePlan;
236
261
  /** Grow the database disk in GB. Cannot shrink. */
237
262
  diskSizeGb?: number;
238
263
  }
@@ -275,11 +300,12 @@ interface UpdateVolumeInput {
275
300
  mountPath?: string;
276
301
  sizeGb?: number;
277
302
  }
303
+ type DomainStatus = 'pending' | 'active' | 'failed' | 'deleting';
278
304
  interface Domain {
279
305
  id: number;
280
306
  publicId: string;
281
307
  domain: string;
282
- status: string;
308
+ status: DomainStatus;
283
309
  verified: boolean;
284
310
  serviceId?: number | null;
285
311
  createdAt: string;
@@ -330,12 +356,13 @@ interface User {
330
356
  email: string;
331
357
  avatarUrl?: string | null;
332
358
  }
359
+ type TeamRole = 'owner' | 'admin' | 'member';
333
360
  interface Team {
334
361
  id: number;
335
362
  publicId: string;
336
363
  name: string;
337
364
  slug: string;
338
- role: string;
365
+ role: TeamRole;
339
366
  }
340
367
  interface MeResponse {
341
368
  /** Null when authenticated with an API key (no associated user). */
@@ -345,7 +372,12 @@ interface MeResponse {
345
372
  id: number;
346
373
  permission: string;
347
374
  };
375
+ /** `'test'` when the API is wired to Stripe's test mode, `'live'` otherwise. */
348
376
  stripeMode?: string;
377
+ /** True when the caller is a superadmin acting on behalf of another team. Always false for API-key auth. */
378
+ isImpersonating?: boolean;
379
+ /** v88 P1b: server-side flag the dashboard renders as a "please add a card" prompt for free-tier teams 14+ days in. */
380
+ cardPromptVisible?: boolean;
349
381
  }
350
382
  /**
351
383
  * A single point in a service metrics time series. Same shape used for
@@ -376,14 +408,16 @@ interface ServiceMetricsSnapshot {
376
408
  containerCount: number;
377
409
  } | null;
378
410
  }
411
+ type CronExecutionStatus = 'pending' | 'running' | 'succeeded' | 'failed';
412
+ type CronExecutionTrigger = 'scheduled' | 'manual';
379
413
  interface CronExecution {
380
414
  id: number;
381
415
  publicId: string;
382
- status: string;
416
+ status: CronExecutionStatus;
383
417
  startedAt?: string | null;
384
418
  finishedAt?: string | null;
385
419
  exitCode?: number | null;
386
- triggeredBy?: string | null;
420
+ triggeredBy?: CronExecutionTrigger | null;
387
421
  createdAt: string;
388
422
  }
389
423
  interface ActivityLogEntry {
@@ -827,8 +861,8 @@ declare class ServicesResource {
827
861
  list(teamId: IdInput, filters?: {
828
862
  projectId?: number | string;
829
863
  environmentId?: number | string;
830
- status?: 'active' | 'deploying' | 'suspended' | 'failed' | 'not_deployed';
831
- type?: 'web_service' | 'private_service' | 'worker' | 'cron_job' | 'static_site';
864
+ status?: ServiceStatus;
865
+ type?: ServiceType;
832
866
  }): Promise<{
833
867
  services: Service[];
834
868
  }>;
@@ -928,6 +962,20 @@ declare class ServicesResource {
928
962
  streamLogs(teamId: IdInput, serviceId: IdInput, options?: StreamLogsOptions): AsyncGenerator<LogEntry>;
929
963
  }
930
964
 
965
+ declare class TeamsResource {
966
+ private client;
967
+ constructor(client: HostStack);
968
+ /**
969
+ * List the teams the authenticated principal can access.
970
+ *
971
+ * Session auth: all teams the user belongs to.
972
+ * API-key auth: the single team the key is bound to.
973
+ */
974
+ list(): Promise<{
975
+ teams: Team[];
976
+ }>;
977
+ }
978
+
931
979
  /**
932
980
  * Manage persistent disks attached to a service.
933
981
  *
@@ -1041,7 +1089,15 @@ declare class HostStack {
1041
1089
  * failures, restart loops, ACME failures, git auth losses, etc.
1042
1090
  */
1043
1091
  readonly notifications: NotificationsResource;
1092
+ /** List the teams this API key (or session) can access. */
1093
+ readonly teams: TeamsResource;
1044
1094
  constructor(options: HostStackOptions);
1095
+ /**
1096
+ * Identify the authenticated principal. For API-key auth, `user` is
1097
+ * `null` and `team` is the team the key is bound to; `apiKey` carries
1098
+ * the key's permission scope (read or full).
1099
+ */
1100
+ me(): Promise<MeResponse>;
1045
1101
  /**
1046
1102
  * Make an authenticated request to the HostStack API.
1047
1103
  * Used internally by resource classes. Can also be used for custom API calls.
@@ -1089,32 +1145,39 @@ declare class RateLimitError extends HostStackError {
1089
1145
 
1090
1146
  /**
1091
1147
  * Standard pagination parameters for list requests.
1148
+ *
1149
+ * Mirrors `packages/shared/src/schemas/pagination.ts` — the API uses
1150
+ * `page` (1-based) + `perPage` (≤100) everywhere. Use these names
1151
+ * directly in your code; the SDK serializes them as the matching
1152
+ * query-string params.
1092
1153
  */
1093
1154
  interface PaginationParams {
1094
- /** Maximum number of items to return. */
1095
- limit?: number;
1096
- /** Number of items to skip. */
1097
- offset?: number;
1155
+ /** 1-based page number. Default `1`. */
1156
+ page?: number;
1157
+ /** Items per page. Range 1–100, default `20`. */
1158
+ perPage?: number;
1159
+ /** Free-text search applied server-side. ≤200 chars. */
1160
+ search?: string;
1161
+ /** Column to sort by (route-dependent). */
1162
+ sortBy?: string;
1163
+ /** Sort direction. Default `'desc'`. */
1164
+ sortOrder?: 'asc' | 'desc';
1098
1165
  }
1099
1166
  /**
1100
- * A paginated response wrapper.
1167
+ * A paginated response wrapper. Mirrors the shape every paginated API
1168
+ * endpoint returns under `data` + `total` + `page` + `perPage` + `totalPages`.
1101
1169
  */
1102
1170
  interface PaginatedResponse<T> {
1103
- items: T[];
1171
+ data: T[];
1104
1172
  total: number;
1105
- limit: number;
1106
- offset: number;
1107
- hasMore: boolean;
1173
+ page: number;
1174
+ perPage: number;
1175
+ totalPages: number;
1108
1176
  }
1109
1177
  /**
1110
1178
  * Builds a query string from pagination params.
1111
1179
  * Returns an empty string if no params are set.
1112
1180
  */
1113
1181
  declare function buildPaginationQuery(params?: PaginationParams): string;
1114
- /**
1115
- * Wraps a plain array result into a PaginatedResponse.
1116
- * Useful when the API returns a flat array without pagination metadata.
1117
- */
1118
- declare function wrapArray<T>(items: T[], params?: PaginationParams): PaginatedResponse<T>;
1119
1182
 
1120
- export { type ActivityLogEntry, type AddDomainInput, AuthenticationError, type BulkSetEnvVarsInput, ConflictError, type CreateDatabaseInput, type CreateEnvVarInput, type CreateEnvironmentInput, type CreateProjectInput, type CreateServiceInput, type CreateVolumeInput, type CronExecution, type Database, type DatabaseCredentials, type Deploy, type DeployListResponse, type DeployLogEntry, type Domain, type EnvVar, type Environment, ForbiddenError, HostStack, HostStackError, type HostStackOptions, type IdInput, type LogEntry$1 as LogEntry, type MeResponse, NotFoundError, type NotificationChannel, type NotificationChannelEvent, type NotificationChannelType, type PaginatedResponse, type PaginationParams, type Project, RateLimitError, type Service, type ServiceConfig, type ServiceMetricsPoint, type ServiceMetricsSnapshot, type ServicePlan, type ServiceType, type StreamLogsOptions, type Team, type TriggerDeployInput, type UpdateDatabaseInput, type UpdateDomainInput, type UpdateEnvVarInput, type UpdateEnvironmentInput, type UpdateProjectInput, type UpdateServiceConfigInput, type UpdateServiceInput, type UpdateVolumeInput, type User, type Volume, buildPaginationQuery, wrapArray };
1183
+ export { type ActivityLogEntry, type AddDomainInput, AuthenticationError, type BulkSetEnvVarsInput, ConflictError, type CreateDatabaseInput, type CreateEnvVarInput, type CreateEnvironmentInput, type CreateProjectInput, type CreateServiceInput, type CreateVolumeInput, type CronExecution, type CronExecutionStatus, type CronExecutionTrigger, type Database, type DatabaseCredentials, type DatabaseEngine, type DatabasePlan, type DatabaseStatus, type Deploy, type DeployListResponse, type DeployLogEntry, type DeployStatus, type DeployTrigger, type Domain, type DomainStatus, type EnvVar, type EnvVarTarget, type Environment, ForbiddenError, HostStack, HostStackError, type HostStackOptions, type IdInput, type LogEntry$1 as LogEntry, type MeResponse, NotFoundError, type NotificationChannel, type NotificationChannelEvent, type NotificationChannelType, type PaginatedResponse, type PaginationParams, type Project, RateLimitError, type RegionId, type Service, type ServiceConfig, type ServiceMetricsPoint, type ServiceMetricsSnapshot, type ServicePlan, type ServiceStatus, type ServiceType, type StreamLogsOptions, type Team, type TeamRole, type TriggerDeployInput, type UpdateDatabaseInput, type UpdateDomainInput, type UpdateEnvVarInput, type UpdateEnvironmentInput, type UpdateProjectInput, type UpdateServiceConfigInput, type UpdateServiceInput, type UpdateVolumeInput, type User, type Volume, buildPaginationQuery };
package/dist/index.js CHANGED
@@ -565,12 +565,12 @@ function normalizeEntries(logs) {
565
565
  return logs;
566
566
  }
567
567
  function sleep(ms, signal) {
568
- return new Promise((resolve, reject) => {
568
+ return new Promise((resolve) => {
569
569
  const timer = setTimeout(resolve, ms);
570
570
  if (signal) {
571
571
  signal.addEventListener("abort", () => {
572
572
  clearTimeout(timer);
573
- reject(new DOMException("Aborted", "AbortError"));
573
+ resolve();
574
574
  });
575
575
  }
576
576
  });
@@ -727,6 +727,22 @@ var ServicesResource = class {
727
727
  }
728
728
  };
729
729
 
730
+ // src/resources/teams.ts
731
+ var TeamsResource = class {
732
+ constructor(client) {
733
+ this.client = client;
734
+ }
735
+ /**
736
+ * List the teams the authenticated principal can access.
737
+ *
738
+ * Session auth: all teams the user belongs to.
739
+ * API-key auth: the single team the key is bound to.
740
+ */
741
+ async list() {
742
+ return this.client.request("GET", "/api/auth/teams");
743
+ }
744
+ };
745
+
730
746
  // src/resources/volumes.ts
731
747
  var VolumesResource = class {
732
748
  constructor(client) {
@@ -816,6 +832,8 @@ var HostStack = class {
816
832
  * failures, restart loops, ACME failures, git auth losses, etc.
817
833
  */
818
834
  notifications;
835
+ /** List the teams this API key (or session) can access. */
836
+ teams;
819
837
  constructor(options) {
820
838
  if (!options.apiKey) {
821
839
  throw new Error("apiKey is required");
@@ -832,6 +850,15 @@ var HostStack = class {
832
850
  this.cron = new CronResource(this);
833
851
  this.volumes = new VolumesResource(this);
834
852
  this.notifications = new NotificationsResource(this);
853
+ this.teams = new TeamsResource(this);
854
+ }
855
+ /**
856
+ * Identify the authenticated principal. For API-key auth, `user` is
857
+ * `null` and `team` is the team the key is bound to; `apiKey` carries
858
+ * the key's permission scope (read or full).
859
+ */
860
+ async me() {
861
+ return this.request("GET", "/api/auth/me");
835
862
  }
836
863
  /**
837
864
  * Make an authenticated request to the HostStack API.
@@ -985,23 +1012,15 @@ function cacheScope(scope) {
985
1012
  function buildPaginationQuery(params) {
986
1013
  if (!params) return "";
987
1014
  const qs = new URLSearchParams();
988
- if (params.limit !== void 0) qs.set("limit", String(params.limit));
989
- if (params.offset !== void 0) qs.set("offset", String(params.offset));
1015
+ if (params.page !== void 0) qs.set("page", String(params.page));
1016
+ if (params.perPage !== void 0) qs.set("perPage", String(params.perPage));
1017
+ if (params.search !== void 0) qs.set("search", params.search);
1018
+ if (params.sortBy !== void 0) qs.set("sortBy", params.sortBy);
1019
+ if (params.sortOrder !== void 0) qs.set("sortOrder", params.sortOrder);
990
1020
  const str = qs.toString();
991
1021
  return str ? `?${str}` : "";
992
1022
  }
993
- function wrapArray(items, params) {
994
- const limit = params?.limit ?? items.length;
995
- const offset = params?.offset ?? 0;
996
- return {
997
- items,
998
- total: items.length,
999
- limit,
1000
- offset,
1001
- hasMore: false
1002
- };
1003
- }
1004
1023
 
1005
- export { AuthenticationError, ConflictError, ForbiddenError, HostStack, HostStackError, NotFoundError, RateLimitError, buildPaginationQuery, wrapArray };
1024
+ export { AuthenticationError, ConflictError, ForbiddenError, HostStack, HostStackError, NotFoundError, RateLimitError, buildPaginationQuery };
1006
1025
  //# sourceMappingURL=index.js.map
1007
1026
  //# sourceMappingURL=index.js.map