@archildata/api-types 0.0.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.
Files changed (4) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +3 -0
  3. package/index.d.ts +1448 -0
  4. package/package.json +31 -0
package/index.d.ts ADDED
@@ -0,0 +1,1448 @@
1
+ /**
2
+ * This file was auto-generated by openapi-typescript.
3
+ * Do not make direct changes to the file.
4
+ */
5
+
6
+ export interface paths {
7
+ "/api/disks": {
8
+ parameters: {
9
+ query?: never;
10
+ header?: never;
11
+ path?: never;
12
+ cookie?: never;
13
+ };
14
+ /**
15
+ * List all disks
16
+ * @description Returns all disks owned by the authenticated account.
17
+ */
18
+ get: operations["listDisks"];
19
+ put?: never;
20
+ /**
21
+ * Create a new disk
22
+ * @description Creates a new disk with the specified configuration. A default token
23
+ * user is automatically generated and returned in the response, so the
24
+ * disk is immediately mountable. The one-time token appears in
25
+ * `authorizedUsers[].token` and cannot be retrieved again.
26
+ *
27
+ * To provide your own users instead, pass the deprecated `authMethods`
28
+ * field or call AddDiskUser after creation.
29
+ */
30
+ post: operations["createDisk"];
31
+ delete?: never;
32
+ options?: never;
33
+ head?: never;
34
+ patch?: never;
35
+ trace?: never;
36
+ };
37
+ "/api/disks/{id}": {
38
+ parameters: {
39
+ query?: never;
40
+ header?: never;
41
+ path?: never;
42
+ cookie?: never;
43
+ };
44
+ /**
45
+ * Get disk details
46
+ * @description Returns detailed information about a specific disk.
47
+ */
48
+ get: operations["getDisk"];
49
+ put?: never;
50
+ post?: never;
51
+ /**
52
+ * Delete a disk
53
+ * @description Deletes a disk and all associated resources.
54
+ */
55
+ delete: operations["deleteDisk"];
56
+ options?: never;
57
+ head?: never;
58
+ patch?: never;
59
+ trace?: never;
60
+ };
61
+ "/api/disks/{id}/users": {
62
+ parameters: {
63
+ query?: never;
64
+ header?: never;
65
+ path?: never;
66
+ cookie?: never;
67
+ };
68
+ get?: never;
69
+ put?: never;
70
+ /**
71
+ * Add user to disk
72
+ * @description Adds an authorized user to a disk. Users can authenticate via:
73
+ * - **token**: A shared token with a nickname and 4-character suffix
74
+ * - **awssts**: AWS STS role assumption with an IAM principal ARN
75
+ */
76
+ post: operations["addDiskUser"];
77
+ delete?: never;
78
+ options?: never;
79
+ head?: never;
80
+ patch?: never;
81
+ trace?: never;
82
+ };
83
+ "/api/disks/{id}/users/{userType}": {
84
+ parameters: {
85
+ query?: never;
86
+ header?: never;
87
+ path?: never;
88
+ cookie?: never;
89
+ };
90
+ get?: never;
91
+ put?: never;
92
+ post?: never;
93
+ /**
94
+ * Remove user from disk
95
+ * @description Removes an authorized user from a disk.
96
+ */
97
+ delete: operations["removeDiskUser"];
98
+ options?: never;
99
+ head?: never;
100
+ patch?: never;
101
+ trace?: never;
102
+ };
103
+ "/api/disks/{id}/allowed-ips": {
104
+ parameters: {
105
+ query?: never;
106
+ header?: never;
107
+ path?: never;
108
+ cookie?: never;
109
+ };
110
+ /**
111
+ * Get IP allowlist
112
+ * @description Returns the current IP allowlist for a disk.
113
+ */
114
+ get: operations["getAllowedIPs"];
115
+ /**
116
+ * Set IP allowlist
117
+ * @description Replaces the IP allowlist for a disk. When non-empty, only clients connecting from listed IPs or CIDR ranges can mount the disk. Pass an empty array to remove all restrictions.
118
+ */
119
+ put: operations["setAllowedIPs"];
120
+ post?: never;
121
+ delete?: never;
122
+ options?: never;
123
+ head?: never;
124
+ patch?: never;
125
+ trace?: never;
126
+ };
127
+ "/api/disks/{id}/exec": {
128
+ parameters: {
129
+ query?: never;
130
+ header?: never;
131
+ path?: never;
132
+ cookie?: never;
133
+ };
134
+ get?: never;
135
+ put?: never;
136
+ /**
137
+ * Execute a command on a disk
138
+ * @description Launches a container with the specified disk mounted, runs the given
139
+ * command to completion, and shuts down the container. Returns immediately
140
+ * with the container info; poll the container endpoint for completion.
141
+ */
142
+ post: operations["execDisk"];
143
+ delete?: never;
144
+ options?: never;
145
+ head?: never;
146
+ patch?: never;
147
+ trace?: never;
148
+ };
149
+ "/api/disks/{id}/grep": {
150
+ parameters: {
151
+ query?: never;
152
+ header?: never;
153
+ path?: never;
154
+ cookie?: never;
155
+ };
156
+ get?: never;
157
+ put?: never;
158
+ /**
159
+ * Constant-time parallel grep over a directory on a disk
160
+ * @description Searches files under a directory on the disk for lines matching a
161
+ * regular expression. Listing and matching are fanned out across
162
+ * ephemeral exec containers, so the request finishes within the user's
163
+ * time budget regardless of the size of the directory.
164
+ *
165
+ * The user controls cost and latency with three knobs:
166
+ *
167
+ * - `maxDurationSeconds` is the wall-clock deadline.
168
+ * - `concurrency` is the maximum number of parallel grep workers.
169
+ * Higher concurrency finishes larger datasets within the deadline;
170
+ * the controlplane clamps to the runtime fleet's current capacity.
171
+ * - `maxResults` causes the search to short-circuit after the
172
+ * aggregator has collected this many matches.
173
+ *
174
+ * With `recursive: false` only files directly under `directory` are
175
+ * searched. With `recursive: true` subdirectories are walked
176
+ * breadth-first and grep workers are dispatched as soon as each level
177
+ * finishes listing — listing and matching overlap.
178
+ *
179
+ * The matches returned when stopping early on `maxResults` are a sample
180
+ * of whichever workers reported first, not the lexicographically first
181
+ * N. The response surfaces `stoppedReason` so callers can distinguish
182
+ * completion from early termination.
183
+ */
184
+ post: operations["grepDisk"];
185
+ delete?: never;
186
+ options?: never;
187
+ head?: never;
188
+ patch?: never;
189
+ trace?: never;
190
+ };
191
+ "/api/exec": {
192
+ parameters: {
193
+ query?: never;
194
+ header?: never;
195
+ path?: never;
196
+ cookie?: never;
197
+ };
198
+ get?: never;
199
+ put?: never;
200
+ /**
201
+ * Execute a command with multiple disks mounted
202
+ * @description Launches a container with the supplied set of disks each mounted at its
203
+ * own relative path under `/mnt/archil`, runs the command to completion,
204
+ * and shuts down the container. Activation is atomic: every disk mounts
205
+ * or none of them do.
206
+ *
207
+ * Relative paths must be non-empty, non-absolute, and contain no `.` /
208
+ * `..` segments. Mounting two disks at the same relative path is an
209
+ * error.
210
+ */
211
+ post: operations["exec"];
212
+ delete?: never;
213
+ options?: never;
214
+ head?: never;
215
+ patch?: never;
216
+ trace?: never;
217
+ };
218
+ "/api/tokens": {
219
+ parameters: {
220
+ query?: never;
221
+ header?: never;
222
+ path?: never;
223
+ cookie?: never;
224
+ };
225
+ /**
226
+ * List API tokens
227
+ * @description Returns all API tokens for the authenticated account.
228
+ */
229
+ get: operations["listApiTokens"];
230
+ put?: never;
231
+ /**
232
+ * Create API token
233
+ * @description Creates a new API token for programmatic access. The full token value
234
+ * is only returned once at creation time.
235
+ */
236
+ post: operations["createApiToken"];
237
+ delete?: never;
238
+ options?: never;
239
+ head?: never;
240
+ patch?: never;
241
+ trace?: never;
242
+ };
243
+ "/api/tokens/{id}": {
244
+ parameters: {
245
+ query?: never;
246
+ header?: never;
247
+ path?: never;
248
+ cookie?: never;
249
+ };
250
+ get?: never;
251
+ put?: never;
252
+ post?: never;
253
+ /**
254
+ * Delete API token
255
+ * @description Revokes and deletes an API token.
256
+ */
257
+ delete: operations["deleteApiToken"];
258
+ options?: never;
259
+ head?: never;
260
+ patch?: never;
261
+ trace?: never;
262
+ };
263
+ }
264
+ export type webhooks = Record<string, never>;
265
+ export interface components {
266
+ schemas: {
267
+ ErrorResponse: {
268
+ /** @example false */
269
+ success: boolean;
270
+ /** @example Invalid request parameters */
271
+ error: string;
272
+ };
273
+ ApiResponse_Empty: {
274
+ /** @example true */
275
+ success: boolean;
276
+ };
277
+ ApiResponse_Message: {
278
+ /** @example true */
279
+ success: boolean;
280
+ data: {
281
+ message?: string;
282
+ };
283
+ };
284
+ CreateDiskRequest: {
285
+ /**
286
+ * @description Disk name (alphanumeric, dashes, underscores)
287
+ * @example my-data-disk
288
+ */
289
+ name: string;
290
+ /** @description Storage mount to attach. Omit for archil-managed storage. */
291
+ mounts?: components["schemas"]["MountConfig"][];
292
+ /**
293
+ * @description IP allowlist for mount access. When non-empty, only clients connecting from these IPs or CIDR ranges can mount the disk. An empty list (default) allows all IPs.
294
+ * @example [
295
+ * "203.0.113.0/24",
296
+ * "198.51.100.42"
297
+ * ]
298
+ */
299
+ allowedIps?: string[];
300
+ /**
301
+ * @deprecated
302
+ * @description Deprecated. Use AddDiskUser after creation instead. When provided, suppresses the default auto-generated token user.
303
+ */
304
+ authMethods?: components["schemas"]["DiskUser"][];
305
+ };
306
+ MountConfig: components["schemas"]["S3Mount"] | components["schemas"]["GCSMount"] | components["schemas"]["R2Mount"] | components["schemas"]["S3CompatibleMount"] | components["schemas"]["AzureBlobMount"];
307
+ /**
308
+ * S3
309
+ * @description Mount configuration for Amazon S3 buckets
310
+ */
311
+ S3Mount: {
312
+ /**
313
+ * @description Mount type identifier (enum property replaced by openapi-typescript)
314
+ * @enum {string}
315
+ */
316
+ type: "s3";
317
+ /**
318
+ * @description S3 bucket name
319
+ * @example my-bucket
320
+ */
321
+ bucketName: string;
322
+ /** @description AWS access key ID (optional for public buckets or IAM role auth) */
323
+ accessKeyId?: string;
324
+ /**
325
+ * Format: password
326
+ * @description AWS secret access key
327
+ */
328
+ secretAccessKey?: string;
329
+ /** @description Session token for temporary credentials */
330
+ sessionToken?: string;
331
+ /**
332
+ * @description Prefix within the bucket
333
+ * @example data/
334
+ */
335
+ bucketPrefix?: string;
336
+ };
337
+ /**
338
+ * Google Cloud Storage
339
+ * @description Mount configuration for Google Cloud Storage buckets
340
+ */
341
+ GCSMount: {
342
+ /**
343
+ * @description Mount type identifier (enum property replaced by openapi-typescript)
344
+ * @enum {string}
345
+ */
346
+ type: "gcs";
347
+ /**
348
+ * @description GCS bucket name
349
+ * @example my-gcs-bucket
350
+ */
351
+ bucketName: string;
352
+ /** @description HMAC access key ID */
353
+ accessKeyId: string;
354
+ /**
355
+ * Format: password
356
+ * @description HMAC secret access key
357
+ */
358
+ secretAccessKey: string;
359
+ /**
360
+ * @description Prefix within the bucket (optional)
361
+ * @example data/
362
+ */
363
+ bucketPrefix?: string;
364
+ };
365
+ /**
366
+ * Cloudflare R2
367
+ * @description Mount configuration for Cloudflare R2 buckets
368
+ */
369
+ R2Mount: {
370
+ /**
371
+ * @description Mount type identifier (enum property replaced by openapi-typescript)
372
+ * @enum {string}
373
+ */
374
+ type: "r2";
375
+ /**
376
+ * @description R2 bucket name
377
+ * @example my-r2-bucket
378
+ */
379
+ bucketName: string;
380
+ /**
381
+ * @description R2 endpoint URL
382
+ * @example https://accountid.r2.cloudflarestorage.com
383
+ */
384
+ bucketEndpoint: string;
385
+ /** @description R2 access key ID */
386
+ accessKeyId: string;
387
+ /**
388
+ * Format: password
389
+ * @description R2 secret access key
390
+ */
391
+ secretAccessKey: string;
392
+ /**
393
+ * @description Prefix within the bucket (optional)
394
+ * @example data/
395
+ */
396
+ bucketPrefix?: string;
397
+ };
398
+ /**
399
+ * S3-Compatible
400
+ * @description Mount configuration for S3-compatible storage (MinIO, Backblaze B2, etc.)
401
+ */
402
+ S3CompatibleMount: {
403
+ /**
404
+ * @description Mount type identifier (enum property replaced by openapi-typescript)
405
+ * @enum {string}
406
+ */
407
+ type: "s3-compatible";
408
+ /**
409
+ * @description Bucket name
410
+ * @example my-bucket
411
+ */
412
+ bucketName: string;
413
+ /**
414
+ * @description S3-compatible endpoint URL
415
+ * @example https://s3.us-west-001.backblazeb2.com
416
+ */
417
+ bucketEndpoint: string;
418
+ /** @description Access key ID */
419
+ accessKeyId: string;
420
+ /**
421
+ * Format: password
422
+ * @description Secret access key
423
+ */
424
+ secretAccessKey: string;
425
+ /**
426
+ * @description Prefix within the bucket (optional)
427
+ * @example data/
428
+ */
429
+ bucketPrefix?: string;
430
+ };
431
+ /**
432
+ * Azure Blob Storage
433
+ * @description Mount configuration for Azure Blob Storage containers
434
+ */
435
+ AzureBlobMount: {
436
+ /**
437
+ * @description Mount type identifier (enum property replaced by openapi-typescript)
438
+ * @enum {string}
439
+ */
440
+ type: "azure-blob";
441
+ /**
442
+ * @description Azure blob container name
443
+ * @example my-container
444
+ */
445
+ containerName: string;
446
+ /**
447
+ * @description Azure blob endpoint URL (optional if storageAccountName provided)
448
+ * @example https://myaccount.blob.core.windows.net
449
+ */
450
+ endpoint?: string;
451
+ /**
452
+ * @description Azure storage account name (used to derive endpoint if not provided)
453
+ * @example myaccount
454
+ */
455
+ storageAccountName?: string;
456
+ /** @description Azure AD tenant ID */
457
+ tenantId: string;
458
+ /** @description Azure AD application client ID */
459
+ clientId: string;
460
+ /**
461
+ * Format: password
462
+ * @description Azure AD application client secret
463
+ */
464
+ clientSecret: string;
465
+ /**
466
+ * @description Prefix within the container
467
+ * @example data/
468
+ */
469
+ bucketPrefix?: string;
470
+ };
471
+ TokenUser: {
472
+ /**
473
+ * @description discriminator enum property added by openapi-typescript
474
+ * @enum {string}
475
+ */
476
+ type: "token";
477
+ /**
478
+ * @deprecated
479
+ * @description Deprecated. Client-provided token. If omitted, the server generates a cryptographically secure token and returns it in the response.
480
+ */
481
+ principal?: string;
482
+ nickname: string;
483
+ /**
484
+ * @deprecated
485
+ * @description Deprecated. Last 4 characters of the token. Required when principal is provided; ignored when the server generates the token.
486
+ */
487
+ tokenSuffix?: string;
488
+ };
489
+ AwsStsUser: {
490
+ /**
491
+ * @description discriminator enum property added by openapi-typescript
492
+ * @enum {string}
493
+ */
494
+ type: "awssts";
495
+ /** @description IAM principal ARN */
496
+ principal: string;
497
+ };
498
+ DiskUser: components["schemas"]["TokenUser"] | components["schemas"]["AwsStsUser"];
499
+ DiskResponse: {
500
+ /**
501
+ * @description Disk ID
502
+ * @example dsk-0123456789abcdef
503
+ */
504
+ id: string;
505
+ /** @description Disk name */
506
+ name: string;
507
+ /** @description Owning organization ID */
508
+ organization: string;
509
+ /**
510
+ * @description Disk status
511
+ * @enum {string}
512
+ */
513
+ status: "available" | "creating" | "deleting" | "deleted" | "failed";
514
+ /** @description Filesystem handler status */
515
+ fsHandlerStatus?: string;
516
+ /** @description Cloud provider */
517
+ provider: string;
518
+ /** @description Disk region (e.g., aws-us-east-1, gcp-us-central1) */
519
+ region: string;
520
+ /**
521
+ * Format: date-time
522
+ * @description Creation timestamp
523
+ */
524
+ createdAt: string;
525
+ /**
526
+ * Format: date-time
527
+ * @description Last access timestamp
528
+ */
529
+ lastAccessed?: string;
530
+ /**
531
+ * Format: int64
532
+ * @description Total data size in bytes
533
+ */
534
+ dataSize?: number;
535
+ /** @description Monthly usage amount formatted as a currency string (e.g., "$1.23") */
536
+ monthlyUsage?: string;
537
+ mounts?: components["schemas"]["MountResponse"][];
538
+ metrics?: components["schemas"]["DiskMetrics"];
539
+ connectedClients?: components["schemas"]["ConnectedClient"][];
540
+ authorizedUsers?: components["schemas"]["AuthorizedUser"][];
541
+ /**
542
+ * @description IP allowlist for mount access. Empty means all IPs are allowed.
543
+ * @example [
544
+ * "203.0.113.0/24"
545
+ * ]
546
+ */
547
+ allowedIps?: string[];
548
+ /**
549
+ * @description Capabilities supported by this disk. Determined at creation
550
+ * time and immutable thereafter. Defined values:
551
+ *
552
+ * * `checkpoints` — checkpoints can be created on this disk. Not
553
+ * available for disks with bring-your-own buckets.
554
+ * @example [
555
+ * "checkpoints"
556
+ * ]
557
+ */
558
+ capabilities?: "checkpoints"[];
559
+ };
560
+ MountResponse: {
561
+ /** @description Mount identifier */
562
+ id?: string;
563
+ /**
564
+ * @description Storage backend type
565
+ * @enum {string}
566
+ */
567
+ type?: "s3" | "gcs" | "r2" | "s3-compatible" | "azure-blob";
568
+ /** @description Mount path */
569
+ path?: string;
570
+ /** @description Bucket/container name */
571
+ name?: string;
572
+ /**
573
+ * @description Access mode
574
+ * @example rw
575
+ * @enum {string}
576
+ */
577
+ accessMode?: "rw" | "ro";
578
+ config?: components["schemas"]["MountConfigResponse"];
579
+ /**
580
+ * @description Current connection status
581
+ * @enum {string}
582
+ */
583
+ connectionStatus?: "connected" | "disconnected";
584
+ /** @description Authentication error message (if disconnected) */
585
+ authError?: string;
586
+ /**
587
+ * @description How the mount authenticates to the storage backend
588
+ * @enum {string}
589
+ */
590
+ authorizationType?: "iam" | "accessKeys" | "oauth";
591
+ };
592
+ /** @description Mount configuration details (secrets omitted) */
593
+ MountConfigResponse: {
594
+ /** @description Bucket name */
595
+ bucketName?: string;
596
+ /** @description Storage endpoint URL */
597
+ bucketEndpoint?: string;
598
+ /** @description Prefix within the bucket */
599
+ bucketPrefix?: string;
600
+ /** @description Session identifier for IAM-authorized mounts */
601
+ sessionId?: string;
602
+ };
603
+ DiskMetrics: {
604
+ /** @description Data transfer amount with unit (e.g., "1.5 GB") */
605
+ dataTransfer?: string;
606
+ /** @description Total request count as a formatted string (e.g., "1,234") */
607
+ requests?: string;
608
+ /** @description Average response time with unit (e.g., "45ms") */
609
+ avgResponseTime?: string;
610
+ };
611
+ ConnectedClient: {
612
+ id?: string;
613
+ ipAddress?: string;
614
+ /** Format: date-time */
615
+ connectedAt?: string;
616
+ };
617
+ AuthorizedUser: {
618
+ /** @enum {string} */
619
+ type?: "token" | "awssts";
620
+ /**
621
+ * @deprecated
622
+ * @description Use identifier instead. Only populated for awssts type (the IAM ARN).
623
+ */
624
+ principal?: string;
625
+ nickname?: string;
626
+ tokenSuffix?: string;
627
+ /** @description The generated mount token. Only present in the response when the server generates the token (i.e. principal was not provided). This value is shown exactly once and cannot be retrieved again. */
628
+ token?: string;
629
+ /** @description Stable identifier for this user, returned in creation and list responses. Use this value with DELETE /api/disks/{id}/users/{type}?identifier={identifier} to remove the user. For awssts users, this is the IAM ARN. */
630
+ identifier?: string;
631
+ /** Format: date-time */
632
+ createdAt?: string;
633
+ };
634
+ /** @description All API responses use a standard envelope with `success: boolean` and `data` (on success) or `error: string` (on failure). The ApiResponse_* schemas each define the specific `data` shape for their endpoint. */
635
+ ApiResponse_DiskList: {
636
+ /** @example true */
637
+ success: boolean;
638
+ data: components["schemas"]["DiskResponse"][];
639
+ };
640
+ ApiResponse_Disk: {
641
+ /** @example true */
642
+ success: boolean;
643
+ data: components["schemas"]["DiskResponse"];
644
+ };
645
+ ApiResponse_CreateDisk: {
646
+ /** @example true */
647
+ success: boolean;
648
+ data: {
649
+ /** @example dsk-0123456789abcdef */
650
+ diskId?: string;
651
+ authorizedUsers?: components["schemas"]["AuthorizedUser"][];
652
+ };
653
+ };
654
+ ApiResponse_AuthorizedUser: {
655
+ /** @example true */
656
+ success: boolean;
657
+ data: components["schemas"]["AuthorizedUser"];
658
+ };
659
+ ApiResponse_AllowedIPs: {
660
+ /** @example true */
661
+ success: boolean;
662
+ data: {
663
+ /**
664
+ * @example [
665
+ * "203.0.113.0/24",
666
+ * "198.51.100.42"
667
+ * ]
668
+ */
669
+ allowedIps: string[];
670
+ };
671
+ };
672
+ CreateApiTokenRequest: {
673
+ /** @description Token name */
674
+ name: string;
675
+ /** @description Token description */
676
+ description?: string;
677
+ };
678
+ ApiTokenResponse: {
679
+ /** @description Token hash/ID */
680
+ id?: string;
681
+ name?: string;
682
+ description?: string;
683
+ /** @description Last 4 characters of the token */
684
+ tokenSuffix?: string;
685
+ /** Format: date-time */
686
+ createdAt?: string;
687
+ /** Format: date-time */
688
+ lastUsedAt?: string;
689
+ };
690
+ ApiResponse_TokenList: {
691
+ /** @example true */
692
+ success: boolean;
693
+ data: {
694
+ tokens?: components["schemas"]["ApiTokenResponse"][];
695
+ };
696
+ };
697
+ ApiResponse_TokenCreated: {
698
+ /** @example true */
699
+ success: boolean;
700
+ data: components["schemas"]["ApiTokenResponse"] & {
701
+ /**
702
+ * @description Full token value (only shown at creation)
703
+ * @example key-abc123...
704
+ */
705
+ token?: string;
706
+ };
707
+ };
708
+ ExecDiskRequest: {
709
+ /**
710
+ * @description Shell command to execute inside the container
711
+ * @example ls -la /mnt/archil
712
+ */
713
+ command: string;
714
+ };
715
+ ExecDiskResult: {
716
+ /**
717
+ * @description Exit code of the command (0 = success)
718
+ * @example 0
719
+ */
720
+ exitCode: number;
721
+ /** @description Standard output from the command */
722
+ stdout: string;
723
+ /** @description Standard error from the command */
724
+ stderr: string;
725
+ timing: components["schemas"]["ExecTiming"];
726
+ };
727
+ /** @description Server-measured timings for an exec request. */
728
+ ExecTiming: {
729
+ /**
730
+ * @description End-to-end wall clock measured on the server, from request arrival to response.
731
+ * @example 2450
732
+ */
733
+ totalMs: number;
734
+ /**
735
+ * @description Time spent queueing, scheduling, booting/claiming a VM, and mounting the filesystem before the command started running.
736
+ * @example 150
737
+ */
738
+ queueMs: number;
739
+ /**
740
+ * @description Time the user's command itself ran, measured by the runtime.
741
+ * @example 2300
742
+ */
743
+ executeMs: number;
744
+ };
745
+ ApiResponse_ExecDisk: {
746
+ /** @example true */
747
+ success: boolean;
748
+ data: components["schemas"]["ExecDiskResult"];
749
+ };
750
+ ExecRequest: {
751
+ /**
752
+ * @description Map of relative path under `/mnt/archil` to the disk to mount
753
+ * there. At least one entry is required. Relative paths must be
754
+ * non-empty, non-absolute, and contain no `.` or `..` segments.
755
+ *
756
+ * Each value is either a plain disk ID string (mounts the disk's
757
+ * root, read-write) or an object that additionally selects a
758
+ * subdirectory of the disk and/or marks the mount as read-only,
759
+ * conditional, or requests delegation checkouts before the command
760
+ * starts. `checkoutPaths` are relative to that disk's exposed mount
761
+ * root. `queueMs` is an optional timeout for delegation acquisition;
762
+ * with `checkoutPaths`, it applies to each requested checkout, and
763
+ * without `checkoutPaths`, the mount root is acquired during mount
764
+ * setup. Delegation checkout options are rejected with `readOnly:
765
+ * true`.
766
+ * @example {
767
+ * "data": "dsk-abc123",
768
+ * "logs": {
769
+ * "disk": "dsk-def456",
770
+ * "subdirectory": "app/logs",
771
+ * "readOnly": true
772
+ * }
773
+ * }
774
+ */
775
+ disks: {
776
+ [key: string]: string | components["schemas"]["ExecMount"];
777
+ };
778
+ /**
779
+ * @description Shell command to execute inside the container
780
+ * @example ls -la /mnt/archil/data /mnt/archil/logs
781
+ */
782
+ command: string;
783
+ };
784
+ ExecMount: {
785
+ /**
786
+ * @description Disk ID to mount at this relative path
787
+ * @example dsk-abc123
788
+ */
789
+ disk: string;
790
+ /**
791
+ * @description Subdirectory of the disk to expose at the mountpoint. Must be a
792
+ * relative path with no `.` or `..` segments. When omitted, the
793
+ * disk's root is exposed.
794
+ * @example app/logs
795
+ */
796
+ subdirectory?: string;
797
+ /**
798
+ * @description When true, the disk is mounted read-only inside the container.
799
+ * Writes against the mount fail with EROFS.
800
+ * @default false
801
+ */
802
+ readOnly: boolean;
803
+ /**
804
+ * @description When true, the disk is mounted in conditional mode, where mutating
805
+ * operations are sent directly to the server without a delegation
806
+ * checkout. This enables concurrent writes from multiple clients to
807
+ * the same disk.
808
+ * @default false
809
+ */
810
+ conditional: boolean;
811
+ /**
812
+ * Format: uint64
813
+ * @description Optional delegation checkout queue timeout, in milliseconds. With
814
+ * `checkoutPaths`, it applies to each requested checkout. Without
815
+ * `checkoutPaths`, the exposed mount root is acquired during mount
816
+ * setup. Rejected with `readOnly: true`.
817
+ */
818
+ queueMs?: number;
819
+ /**
820
+ * @description Paths relative to this disk's exposed mount root to check out before
821
+ * the command starts. May be set without `queueMs`; those checkouts
822
+ * try immediately without waiting in the delegation queue. Rejected
823
+ * with `readOnly: true`.
824
+ * @example [
825
+ * "src",
826
+ * "tmp/cache"
827
+ * ]
828
+ */
829
+ checkoutPaths?: string[];
830
+ };
831
+ ApiResponse_Exec: {
832
+ /** @example true */
833
+ success: boolean;
834
+ data: components["schemas"]["ExecDiskResult"];
835
+ };
836
+ GrepDiskRequest: {
837
+ /**
838
+ * @description Directory on the disk to search, relative to the disk root.
839
+ * An empty string or "/" means the disk root.
840
+ * @example data/logs
841
+ */
842
+ directory: string;
843
+ /**
844
+ * @description Extended regular expression (passed to `grep -E`)
845
+ * @example ERROR|FATAL
846
+ */
847
+ pattern: string;
848
+ /**
849
+ * @description When true, walks subdirectories breadth-first.
850
+ * @default false
851
+ */
852
+ recursive: boolean;
853
+ /**
854
+ * @description Wall-clock deadline for the entire request. Capped at 30
855
+ * seconds because the runtime exec container itself is bounded
856
+ * at ~30s; longer requests would have their workers killed
857
+ * mid-scan.
858
+ * @default 30
859
+ */
860
+ maxDurationSeconds: number;
861
+ /**
862
+ * @description Maximum number of parallel grep workers. Higher values finish
863
+ * larger datasets within the deadline but consume more runtime
864
+ * capacity. The controlplane clamps this to the fleet's
865
+ * currently-available capacity.
866
+ * @default 50
867
+ */
868
+ concurrency: number;
869
+ /**
870
+ * @description Stop scanning once the aggregator has this many matches.
871
+ * Returned matches are a sample of whichever workers reported
872
+ * first, not the lexicographically first N.
873
+ * @default 1000
874
+ */
875
+ maxResults: number;
876
+ };
877
+ GrepMatch: {
878
+ /**
879
+ * @description Path to the file (relative to the disk root).
880
+ * @example data/logs/2026-05-03.log
881
+ */
882
+ file: string;
883
+ /**
884
+ * @description 1-based line number where the match occurred.
885
+ * @example 142
886
+ */
887
+ line: number;
888
+ /** @description The matching line. */
889
+ text: string;
890
+ };
891
+ /**
892
+ * @description Why the search stopped.
893
+ * - `completed`: every file under the directory was scanned successfully.
894
+ * - `incomplete`: pipeline ran to its natural end but one or more
895
+ * batches errored (invalid regex, unreadable file, runtime issue).
896
+ * Results may be partial or wrong; do not rely on completeness.
897
+ * - `max_results`: hit `maxResults` before scanning everything.
898
+ * - `deadline`: hit `maxDurationSeconds`.
899
+ * - `list_failed`: directory listing failed; partial results
900
+ * may be present.
901
+ * @enum {string}
902
+ */
903
+ GrepStoppedReason: "completed" | "incomplete" | "max_results" | "deadline" | "list_failed";
904
+ GrepDiskResult: {
905
+ matches: components["schemas"]["GrepMatch"][];
906
+ stoppedReason: components["schemas"]["GrepStoppedReason"];
907
+ /** @description Files actually fed to a grep container. */
908
+ filesScanned: number;
909
+ /** @description Number of grep containers started for this request. */
910
+ containersDispatched: number;
911
+ /**
912
+ * Format: double
913
+ * @description Sum of per-container execution time in seconds, measured by the
914
+ * runtime. Approximates billable container-seconds.
915
+ */
916
+ computeSecondsUsed: number;
917
+ /** @description End-to-end wall clock measured by the server. */
918
+ durationMs: number;
919
+ /**
920
+ * @description Wall-clock time spent enumerating files via listObjects, from
921
+ * the request's start to the moment listing fully drained (or
922
+ * was canceled). Listing and matching overlap, so listingMs +
923
+ * grepMs typically exceeds durationMs.
924
+ */
925
+ listingMs: number;
926
+ /**
927
+ * @description Wall-clock time spent matching, from the first grep container
928
+ * being dispatched to the last container reporting results. 0 if
929
+ * no batches ran.
930
+ */
931
+ grepMs: number;
932
+ };
933
+ ApiResponse_GrepDisk: {
934
+ /** @example true */
935
+ success: boolean;
936
+ data: components["schemas"]["GrepDiskResult"];
937
+ };
938
+ };
939
+ responses: {
940
+ /** @description Invalid or missing authentication credentials */
941
+ Unauthorized: {
942
+ headers: {
943
+ [name: string]: unknown;
944
+ };
945
+ content: {
946
+ "application/json": components["schemas"]["ErrorResponse"];
947
+ };
948
+ };
949
+ /** @description Validation error */
950
+ ValidationError: {
951
+ headers: {
952
+ [name: string]: unknown;
953
+ };
954
+ content: {
955
+ "application/json": components["schemas"]["ErrorResponse"];
956
+ };
957
+ };
958
+ /** @description Resource not found */
959
+ NotFound: {
960
+ headers: {
961
+ [name: string]: unknown;
962
+ };
963
+ content: {
964
+ "application/json": components["schemas"]["ErrorResponse"];
965
+ };
966
+ };
967
+ /** @description Internal server error */
968
+ InternalError: {
969
+ headers: {
970
+ [name: string]: unknown;
971
+ };
972
+ content: {
973
+ "application/json": components["schemas"]["ErrorResponse"];
974
+ };
975
+ };
976
+ };
977
+ parameters: {
978
+ /** @description Disk ID (format `dsk-{16 hex chars}`) */
979
+ DiskId: string;
980
+ /** @description Maximum number of items to return */
981
+ Limit: number;
982
+ /** @description Pagination cursor from a previous response */
983
+ Cursor: string;
984
+ };
985
+ requestBodies: never;
986
+ headers: never;
987
+ pathItems: never;
988
+ }
989
+ export type $defs = Record<string, never>;
990
+ export interface operations {
991
+ listDisks: {
992
+ parameters: {
993
+ query?: {
994
+ /** @description Maximum number of items to return */
995
+ limit?: components["parameters"]["Limit"];
996
+ /** @description Pagination cursor from a previous response */
997
+ cursor?: components["parameters"]["Cursor"];
998
+ /** @description Filter disks by exact name match. */
999
+ name?: string;
1000
+ };
1001
+ header?: never;
1002
+ path?: never;
1003
+ cookie?: never;
1004
+ };
1005
+ requestBody?: never;
1006
+ responses: {
1007
+ /** @description List of disks */
1008
+ 200: {
1009
+ headers: {
1010
+ [name: string]: unknown;
1011
+ };
1012
+ content: {
1013
+ "application/json": components["schemas"]["ApiResponse_DiskList"];
1014
+ };
1015
+ };
1016
+ 401: components["responses"]["Unauthorized"];
1017
+ 500: components["responses"]["InternalError"];
1018
+ };
1019
+ };
1020
+ createDisk: {
1021
+ parameters: {
1022
+ query?: never;
1023
+ header?: never;
1024
+ path?: never;
1025
+ cookie?: never;
1026
+ };
1027
+ requestBody: {
1028
+ content: {
1029
+ "application/json": components["schemas"]["CreateDiskRequest"];
1030
+ };
1031
+ };
1032
+ responses: {
1033
+ /** @description Disk with this name already exists and configuration matches (idempotent) */
1034
+ 200: {
1035
+ headers: {
1036
+ [name: string]: unknown;
1037
+ };
1038
+ content: {
1039
+ "application/json": components["schemas"]["ApiResponse_CreateDisk"];
1040
+ };
1041
+ };
1042
+ /** @description Disk created successfully */
1043
+ 201: {
1044
+ headers: {
1045
+ [name: string]: unknown;
1046
+ };
1047
+ content: {
1048
+ "application/json": components["schemas"]["ApiResponse_CreateDisk"];
1049
+ };
1050
+ };
1051
+ 400: components["responses"]["ValidationError"];
1052
+ 401: components["responses"]["Unauthorized"];
1053
+ /** @description Access denied (e.g., preview region not enabled) */
1054
+ 403: {
1055
+ headers: {
1056
+ [name: string]: unknown;
1057
+ };
1058
+ content: {
1059
+ "application/json": components["schemas"]["ErrorResponse"];
1060
+ };
1061
+ };
1062
+ /** @description Disk with this name already exists but configuration differs */
1063
+ 409: {
1064
+ headers: {
1065
+ [name: string]: unknown;
1066
+ };
1067
+ content: {
1068
+ "application/json": components["schemas"]["ErrorResponse"];
1069
+ };
1070
+ };
1071
+ 500: components["responses"]["InternalError"];
1072
+ };
1073
+ };
1074
+ getDisk: {
1075
+ parameters: {
1076
+ query?: never;
1077
+ header?: never;
1078
+ path: {
1079
+ /** @description Disk ID (format `dsk-{16 hex chars}`) */
1080
+ id: components["parameters"]["DiskId"];
1081
+ };
1082
+ cookie?: never;
1083
+ };
1084
+ requestBody?: never;
1085
+ responses: {
1086
+ /** @description Disk details */
1087
+ 200: {
1088
+ headers: {
1089
+ [name: string]: unknown;
1090
+ };
1091
+ content: {
1092
+ "application/json": components["schemas"]["ApiResponse_Disk"];
1093
+ };
1094
+ };
1095
+ 400: components["responses"]["ValidationError"];
1096
+ 401: components["responses"]["Unauthorized"];
1097
+ 404: components["responses"]["NotFound"];
1098
+ 500: components["responses"]["InternalError"];
1099
+ };
1100
+ };
1101
+ deleteDisk: {
1102
+ parameters: {
1103
+ query?: never;
1104
+ header?: never;
1105
+ path: {
1106
+ /** @description Disk ID (format `dsk-{16 hex chars}`) */
1107
+ id: components["parameters"]["DiskId"];
1108
+ };
1109
+ cookie?: never;
1110
+ };
1111
+ requestBody?: never;
1112
+ responses: {
1113
+ /** @description Disk deleted successfully */
1114
+ 200: {
1115
+ headers: {
1116
+ [name: string]: unknown;
1117
+ };
1118
+ content: {
1119
+ "application/json": components["schemas"]["ApiResponse_Empty"];
1120
+ };
1121
+ };
1122
+ 400: components["responses"]["ValidationError"];
1123
+ 401: components["responses"]["Unauthorized"];
1124
+ 404: components["responses"]["NotFound"];
1125
+ 500: components["responses"]["InternalError"];
1126
+ };
1127
+ };
1128
+ addDiskUser: {
1129
+ parameters: {
1130
+ query?: never;
1131
+ header?: never;
1132
+ path: {
1133
+ /** @description Disk ID (format `dsk-{16 hex chars}`) */
1134
+ id: components["parameters"]["DiskId"];
1135
+ };
1136
+ cookie?: never;
1137
+ };
1138
+ requestBody: {
1139
+ content: {
1140
+ "application/json": components["schemas"]["DiskUser"];
1141
+ };
1142
+ };
1143
+ responses: {
1144
+ /** @description User added successfully */
1145
+ 201: {
1146
+ headers: {
1147
+ [name: string]: unknown;
1148
+ };
1149
+ content: {
1150
+ "application/json": components["schemas"]["ApiResponse_AuthorizedUser"];
1151
+ };
1152
+ };
1153
+ 400: components["responses"]["ValidationError"];
1154
+ 401: components["responses"]["Unauthorized"];
1155
+ 500: components["responses"]["InternalError"];
1156
+ };
1157
+ };
1158
+ removeDiskUser: {
1159
+ parameters: {
1160
+ query?: {
1161
+ /** @description Identifier of the user to remove, as returned in the creation or list response. For awssts users, this is the IAM ARN. */
1162
+ identifier?: string;
1163
+ /**
1164
+ * @deprecated
1165
+ * @description Use identifier instead.
1166
+ */
1167
+ principal?: string;
1168
+ };
1169
+ header?: never;
1170
+ path: {
1171
+ /** @description Disk ID (format `dsk-{16 hex chars}`) */
1172
+ id: components["parameters"]["DiskId"];
1173
+ /** @description The type of user authentication */
1174
+ userType: "token" | "awssts";
1175
+ };
1176
+ cookie?: never;
1177
+ };
1178
+ requestBody?: never;
1179
+ responses: {
1180
+ /** @description User removed successfully */
1181
+ 200: {
1182
+ headers: {
1183
+ [name: string]: unknown;
1184
+ };
1185
+ content: {
1186
+ "application/json": components["schemas"]["ApiResponse_Message"];
1187
+ };
1188
+ };
1189
+ 400: components["responses"]["ValidationError"];
1190
+ 401: components["responses"]["Unauthorized"];
1191
+ 500: components["responses"]["InternalError"];
1192
+ };
1193
+ };
1194
+ getAllowedIPs: {
1195
+ parameters: {
1196
+ query?: never;
1197
+ header?: never;
1198
+ path: {
1199
+ /** @description Disk ID (format `dsk-{16 hex chars}`) */
1200
+ id: components["parameters"]["DiskId"];
1201
+ };
1202
+ cookie?: never;
1203
+ };
1204
+ requestBody?: never;
1205
+ responses: {
1206
+ /** @description Current IP allowlist */
1207
+ 200: {
1208
+ headers: {
1209
+ [name: string]: unknown;
1210
+ };
1211
+ content: {
1212
+ "application/json": components["schemas"]["ApiResponse_AllowedIPs"];
1213
+ };
1214
+ };
1215
+ 401: components["responses"]["Unauthorized"];
1216
+ 404: components["responses"]["NotFound"];
1217
+ 500: components["responses"]["InternalError"];
1218
+ };
1219
+ };
1220
+ setAllowedIPs: {
1221
+ parameters: {
1222
+ query?: never;
1223
+ header?: never;
1224
+ path: {
1225
+ /** @description Disk ID (format `dsk-{16 hex chars}`) */
1226
+ id: components["parameters"]["DiskId"];
1227
+ };
1228
+ cookie?: never;
1229
+ };
1230
+ requestBody: {
1231
+ content: {
1232
+ "application/json": {
1233
+ /**
1234
+ * @description List of IPs or CIDR ranges. Empty array removes restrictions.
1235
+ * @example [
1236
+ * "203.0.113.0/24",
1237
+ * "198.51.100.42"
1238
+ * ]
1239
+ */
1240
+ allowedIps: string[];
1241
+ };
1242
+ };
1243
+ };
1244
+ responses: {
1245
+ /** @description Allowlist updated */
1246
+ 200: {
1247
+ headers: {
1248
+ [name: string]: unknown;
1249
+ };
1250
+ content: {
1251
+ "application/json": components["schemas"]["ApiResponse_AllowedIPs"];
1252
+ };
1253
+ };
1254
+ 400: components["responses"]["ValidationError"];
1255
+ 401: components["responses"]["Unauthorized"];
1256
+ 404: components["responses"]["NotFound"];
1257
+ 500: components["responses"]["InternalError"];
1258
+ };
1259
+ };
1260
+ execDisk: {
1261
+ parameters: {
1262
+ query?: never;
1263
+ header?: never;
1264
+ path: {
1265
+ /** @description Disk ID (format `dsk-{16 hex chars}`) */
1266
+ id: components["parameters"]["DiskId"];
1267
+ };
1268
+ cookie?: never;
1269
+ };
1270
+ requestBody: {
1271
+ content: {
1272
+ "application/json": components["schemas"]["ExecDiskRequest"];
1273
+ };
1274
+ };
1275
+ responses: {
1276
+ /** @description Command completed */
1277
+ 200: {
1278
+ headers: {
1279
+ [name: string]: unknown;
1280
+ };
1281
+ content: {
1282
+ "application/json": components["schemas"]["ApiResponse_ExecDisk"];
1283
+ };
1284
+ };
1285
+ 400: components["responses"]["ValidationError"];
1286
+ 401: components["responses"]["Unauthorized"];
1287
+ 404: components["responses"]["NotFound"];
1288
+ 500: components["responses"]["InternalError"];
1289
+ /** @description Command timed out */
1290
+ 504: {
1291
+ headers: {
1292
+ [name: string]: unknown;
1293
+ };
1294
+ content: {
1295
+ "application/json": components["schemas"]["ErrorResponse"];
1296
+ };
1297
+ };
1298
+ };
1299
+ };
1300
+ grepDisk: {
1301
+ parameters: {
1302
+ query?: never;
1303
+ header?: never;
1304
+ path: {
1305
+ /** @description Disk ID (format `dsk-{16 hex chars}`) */
1306
+ id: components["parameters"]["DiskId"];
1307
+ };
1308
+ cookie?: never;
1309
+ };
1310
+ requestBody: {
1311
+ content: {
1312
+ "application/json": components["schemas"]["GrepDiskRequest"];
1313
+ };
1314
+ };
1315
+ responses: {
1316
+ /** @description Grep completed (possibly stopped early) */
1317
+ 200: {
1318
+ headers: {
1319
+ [name: string]: unknown;
1320
+ };
1321
+ content: {
1322
+ "application/json": components["schemas"]["ApiResponse_GrepDisk"];
1323
+ };
1324
+ };
1325
+ 400: components["responses"]["ValidationError"];
1326
+ 401: components["responses"]["Unauthorized"];
1327
+ 404: components["responses"]["NotFound"];
1328
+ 500: components["responses"]["InternalError"];
1329
+ };
1330
+ };
1331
+ exec: {
1332
+ parameters: {
1333
+ query?: never;
1334
+ header?: never;
1335
+ path?: never;
1336
+ cookie?: never;
1337
+ };
1338
+ requestBody: {
1339
+ content: {
1340
+ "application/json": components["schemas"]["ExecRequest"];
1341
+ };
1342
+ };
1343
+ responses: {
1344
+ /** @description Command completed */
1345
+ 200: {
1346
+ headers: {
1347
+ [name: string]: unknown;
1348
+ };
1349
+ content: {
1350
+ "application/json": components["schemas"]["ApiResponse_Exec"];
1351
+ };
1352
+ };
1353
+ 400: components["responses"]["ValidationError"];
1354
+ 401: components["responses"]["Unauthorized"];
1355
+ 404: components["responses"]["NotFound"];
1356
+ 500: components["responses"]["InternalError"];
1357
+ /** @description Command timed out */
1358
+ 504: {
1359
+ headers: {
1360
+ [name: string]: unknown;
1361
+ };
1362
+ content: {
1363
+ "application/json": components["schemas"]["ErrorResponse"];
1364
+ };
1365
+ };
1366
+ };
1367
+ };
1368
+ listApiTokens: {
1369
+ parameters: {
1370
+ query?: {
1371
+ /** @description Maximum number of items to return */
1372
+ limit?: components["parameters"]["Limit"];
1373
+ /** @description Pagination cursor from a previous response */
1374
+ cursor?: components["parameters"]["Cursor"];
1375
+ };
1376
+ header?: never;
1377
+ path?: never;
1378
+ cookie?: never;
1379
+ };
1380
+ requestBody?: never;
1381
+ responses: {
1382
+ /** @description List of API tokens */
1383
+ 200: {
1384
+ headers: {
1385
+ [name: string]: unknown;
1386
+ };
1387
+ content: {
1388
+ "application/json": components["schemas"]["ApiResponse_TokenList"];
1389
+ };
1390
+ };
1391
+ 401: components["responses"]["Unauthorized"];
1392
+ 500: components["responses"]["InternalError"];
1393
+ };
1394
+ };
1395
+ createApiToken: {
1396
+ parameters: {
1397
+ query?: never;
1398
+ header?: never;
1399
+ path?: never;
1400
+ cookie?: never;
1401
+ };
1402
+ requestBody: {
1403
+ content: {
1404
+ "application/json": components["schemas"]["CreateApiTokenRequest"];
1405
+ };
1406
+ };
1407
+ responses: {
1408
+ /** @description Token created successfully */
1409
+ 201: {
1410
+ headers: {
1411
+ [name: string]: unknown;
1412
+ };
1413
+ content: {
1414
+ "application/json": components["schemas"]["ApiResponse_TokenCreated"];
1415
+ };
1416
+ };
1417
+ 400: components["responses"]["ValidationError"];
1418
+ 401: components["responses"]["Unauthorized"];
1419
+ 500: components["responses"]["InternalError"];
1420
+ };
1421
+ };
1422
+ deleteApiToken: {
1423
+ parameters: {
1424
+ query?: never;
1425
+ header?: never;
1426
+ path: {
1427
+ /** @description The token ID (hash) */
1428
+ id: string;
1429
+ };
1430
+ cookie?: never;
1431
+ };
1432
+ requestBody?: never;
1433
+ responses: {
1434
+ /** @description Token deleted successfully */
1435
+ 200: {
1436
+ headers: {
1437
+ [name: string]: unknown;
1438
+ };
1439
+ content: {
1440
+ "application/json": components["schemas"]["ApiResponse_Message"];
1441
+ };
1442
+ };
1443
+ 401: components["responses"]["Unauthorized"];
1444
+ 404: components["responses"]["NotFound"];
1445
+ 500: components["responses"]["InternalError"];
1446
+ };
1447
+ };
1448
+ }