@figulus/schema 0.4.0-alpha-dev → 0.5.0-alpha-dev-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 (192) hide show
  1. package/.openapi-meta/index.ts +12 -0
  2. package/dist/core/entities/figspec.d.ts +659 -0
  3. package/dist/core/entities/figspec.d.ts.map +1 -0
  4. package/dist/core/entities/figspec.js +73 -0
  5. package/dist/core/entities/figspec.js.map +1 -0
  6. package/dist/core/entities/figstack.d.ts +139 -0
  7. package/dist/core/entities/figstack.d.ts.map +1 -0
  8. package/dist/core/entities/figstack.js +79 -0
  9. package/dist/core/entities/figstack.js.map +1 -0
  10. package/dist/core/entities/index.d.ts +3 -0
  11. package/dist/core/entities/index.d.ts.map +1 -0
  12. package/dist/core/entities/index.js +3 -0
  13. package/dist/core/entities/index.js.map +1 -0
  14. package/dist/core/execute.d.ts +64 -0
  15. package/dist/core/execute.d.ts.map +1 -0
  16. package/dist/core/execute.js +45 -0
  17. package/dist/core/execute.js.map +1 -0
  18. package/dist/core/generic.d.ts +35 -0
  19. package/dist/core/generic.d.ts.map +1 -0
  20. package/dist/core/generic.js +28 -0
  21. package/dist/core/generic.js.map +1 -0
  22. package/dist/core/index.d.ts +6 -0
  23. package/dist/core/index.d.ts.map +1 -0
  24. package/dist/core/index.js +6 -0
  25. package/dist/core/index.js.map +1 -0
  26. package/dist/core/primitives.d.ts +3 -0
  27. package/dist/core/primitives.d.ts.map +1 -0
  28. package/dist/core/primitives.js +11 -0
  29. package/dist/core/primitives.js.map +1 -0
  30. package/dist/core/volumes.d.ts +160 -0
  31. package/dist/core/volumes.d.ts.map +1 -0
  32. package/dist/core/volumes.js +100 -0
  33. package/dist/core/volumes.js.map +1 -0
  34. package/dist/engine/deprecated/index.d.ts +2 -0
  35. package/dist/engine/deprecated/index.d.ts.map +1 -0
  36. package/dist/engine/deprecated/index.js +2 -0
  37. package/dist/engine/deprecated/index.js.map +1 -0
  38. package/dist/engine/deprecated/run-request.d.ts +73 -0
  39. package/dist/engine/deprecated/run-request.d.ts.map +1 -0
  40. package/dist/engine/deprecated/run-request.js +47 -0
  41. package/dist/engine/deprecated/run-request.js.map +1 -0
  42. package/dist/engine/dry-run.d.ts +15 -0
  43. package/dist/engine/dry-run.d.ts.map +1 -0
  44. package/dist/engine/dry-run.js +12 -0
  45. package/dist/engine/dry-run.js.map +1 -0
  46. package/dist/engine/health.d.ts +11 -0
  47. package/dist/engine/health.d.ts.map +1 -0
  48. package/dist/engine/health.js +9 -0
  49. package/dist/engine/health.js.map +1 -0
  50. package/dist/engine/images.d.ts +49 -0
  51. package/dist/engine/images.d.ts.map +1 -0
  52. package/dist/engine/images.js +44 -0
  53. package/dist/engine/images.js.map +1 -0
  54. package/dist/engine/index.d.ts +9 -0
  55. package/dist/engine/index.d.ts.map +1 -0
  56. package/dist/engine/index.js +9 -0
  57. package/dist/engine/index.js.map +1 -0
  58. package/dist/engine/paths/containers.d.ts +8 -0
  59. package/dist/engine/paths/containers.d.ts.map +1 -0
  60. package/dist/engine/paths/containers.js +297 -0
  61. package/dist/engine/paths/containers.js.map +1 -0
  62. package/dist/engine/paths/dry-run.d.ts +3 -0
  63. package/dist/engine/paths/dry-run.d.ts.map +1 -0
  64. package/dist/engine/paths/dry-run.js +43 -0
  65. package/dist/engine/paths/dry-run.js.map +1 -0
  66. package/dist/engine/paths/health.d.ts +3 -0
  67. package/dist/engine/paths/health.d.ts.map +1 -0
  68. package/dist/engine/paths/health.js +36 -0
  69. package/dist/engine/paths/health.js.map +1 -0
  70. package/dist/engine/paths/images.d.ts +5 -0
  71. package/dist/engine/paths/images.d.ts.map +1 -0
  72. package/dist/engine/paths/images.js +144 -0
  73. package/dist/engine/paths/images.js.map +1 -0
  74. package/dist/engine/paths/index.d.ts +8 -0
  75. package/dist/engine/paths/index.d.ts.map +1 -0
  76. package/dist/engine/paths/index.js +8 -0
  77. package/dist/engine/paths/index.js.map +1 -0
  78. package/dist/engine/paths/sessions.d.ts +10 -0
  79. package/dist/engine/paths/sessions.d.ts.map +1 -0
  80. package/dist/engine/paths/sessions.js +484 -0
  81. package/dist/engine/paths/sessions.js.map +1 -0
  82. package/dist/engine/paths/stacks.d.ts +6 -0
  83. package/dist/engine/paths/stacks.d.ts.map +1 -0
  84. package/dist/engine/paths/stacks.js +175 -0
  85. package/dist/engine/paths/stacks.js.map +1 -0
  86. package/dist/engine/paths/volumes.d.ts +6 -0
  87. package/dist/engine/paths/volumes.d.ts.map +1 -0
  88. package/dist/engine/paths/volumes.js +164 -0
  89. package/dist/engine/paths/volumes.js.map +1 -0
  90. package/dist/engine/response.d.ts +8 -0
  91. package/dist/engine/response.d.ts.map +1 -0
  92. package/dist/engine/response.js +9 -0
  93. package/dist/engine/response.js.map +1 -0
  94. package/dist/engine/sessions.d.ts +343 -0
  95. package/dist/engine/sessions.d.ts.map +1 -0
  96. package/dist/engine/sessions.js +118 -0
  97. package/dist/engine/sessions.js.map +1 -0
  98. package/dist/engine/volumes.d.ts +52 -0
  99. package/dist/engine/volumes.d.ts.map +1 -0
  100. package/dist/engine/volumes.js +39 -0
  101. package/dist/engine/volumes.js.map +1 -0
  102. package/dist/index.d.ts +2 -8
  103. package/dist/index.d.ts.map +1 -1
  104. package/dist/index.js +2 -8
  105. package/dist/index.js.map +1 -1
  106. package/dist/registry/index.d.ts +3 -0
  107. package/dist/registry/index.d.ts.map +1 -0
  108. package/dist/registry/index.js +3 -0
  109. package/dist/registry/index.js.map +1 -0
  110. package/dist/registry/json-schema.d.ts +82 -0
  111. package/dist/registry/json-schema.d.ts.map +1 -0
  112. package/dist/registry/json-schema.js +149 -0
  113. package/dist/registry/json-schema.js.map +1 -0
  114. package/dist/registry/metadata.d.ts +216 -0
  115. package/dist/registry/metadata.d.ts.map +1 -0
  116. package/dist/registry/metadata.js +143 -0
  117. package/dist/registry/metadata.js.map +1 -0
  118. package/package.json +10 -3
  119. package/scripts/fix-openapi-3.1.ts +183 -0
  120. package/scripts/generate-openapi-data.ts +51 -0
  121. package/scripts/generate-openapi-meta.ts +540 -0
  122. package/src/core/entities/figspec.ts +94 -0
  123. package/src/core/entities/figstack.ts +101 -0
  124. package/src/core/entities/index.ts +2 -0
  125. package/src/core/execute.ts +66 -0
  126. package/src/core/generic.ts +38 -0
  127. package/src/core/index.ts +5 -0
  128. package/src/core/primitives.ts +12 -0
  129. package/src/core/volumes.ts +124 -0
  130. package/src/engine/deprecated/index.ts +1 -0
  131. package/src/engine/deprecated/run-request.ts +53 -0
  132. package/src/engine/dry-run.ts +14 -0
  133. package/src/engine/health.ts +11 -0
  134. package/src/engine/images.ts +58 -0
  135. package/src/engine/index.ts +8 -0
  136. package/src/engine/paths/containers.ts +304 -0
  137. package/src/engine/paths/dry-run.ts +44 -0
  138. package/src/engine/paths/health.ts +37 -0
  139. package/src/engine/paths/images.ts +148 -0
  140. package/src/engine/paths/index.ts +7 -0
  141. package/src/engine/paths/sessions.ts +493 -0
  142. package/src/engine/paths/stacks.ts +179 -0
  143. package/src/engine/paths/volumes.ts +168 -0
  144. package/src/engine/response.ts +11 -0
  145. package/src/engine/sessions.ts +146 -0
  146. package/src/engine/volumes.ts +53 -0
  147. package/src/index.ts +2 -8
  148. package/src/registry/index.ts +2 -0
  149. package/src/registry/json-schema.ts +178 -0
  150. package/src/registry/metadata.ts +181 -0
  151. package/tests/figspec.test.ts +1 -1
  152. package/tests/schemas.test.ts +31 -31
  153. package/dist/figspec.d.ts +0 -4394
  154. package/dist/figspec.d.ts.map +0 -1
  155. package/dist/figspec.js +0 -214
  156. package/dist/figspec.js.map +0 -1
  157. package/dist/figstack.d.ts +0 -419
  158. package/dist/figstack.d.ts.map +0 -1
  159. package/dist/figstack.js +0 -72
  160. package/dist/figstack.js.map +0 -1
  161. package/dist/health.d.ts +0 -16
  162. package/dist/health.d.ts.map +0 -1
  163. package/dist/health.js +0 -7
  164. package/dist/health.js.map +0 -1
  165. package/dist/image.d.ts +0 -115
  166. package/dist/image.d.ts.map +0 -1
  167. package/dist/image.js +0 -42
  168. package/dist/image.js.map +0 -1
  169. package/dist/run-request.d.ts +0 -244
  170. package/dist/run-request.d.ts.map +0 -1
  171. package/dist/run-request.js +0 -43
  172. package/dist/run-request.js.map +0 -1
  173. package/dist/session.d.ts +0 -447
  174. package/dist/session.d.ts.map +0 -1
  175. package/dist/session.js +0 -78
  176. package/dist/session.js.map +0 -1
  177. package/dist/shared.d.ts +0 -90
  178. package/dist/shared.d.ts.map +0 -1
  179. package/dist/shared.js +0 -41
  180. package/dist/shared.js.map +0 -1
  181. package/dist/volume.d.ts +0 -140
  182. package/dist/volume.d.ts.map +0 -1
  183. package/dist/volume.js +0 -37
  184. package/dist/volume.js.map +0 -1
  185. package/src/figspec.ts +0 -279
  186. package/src/figstack.ts +0 -92
  187. package/src/health.ts +0 -8
  188. package/src/image.ts +0 -55
  189. package/src/run-request.ts +0 -55
  190. package/src/session.ts +0 -101
  191. package/src/shared.ts +0 -56
  192. package/src/volume.ts +0 -50
@@ -0,0 +1,493 @@
1
+ import { RouteConfig } from "@asteasolutions/zod-to-openapi";
2
+ import z from "zod";
3
+ import { createSessionRequestSchema, createSessionResponseSchema, getRunResponseSchema, getSessionResponseSchema, listRunsResponseSchema, runInSessionRequestSchema, runInSessionResponseSchema, syncFileRequestSchema, syncFileResponseSchema } from "../sessions.js";
4
+ import { extendZodWithOpenApi } from "@asteasolutions/zod-to-openapi";
5
+ import { errorResponseSchema } from "../response.js";
6
+
7
+ extendZodWithOpenApi(z);
8
+
9
+ export const listSessionsRouteSchema: RouteConfig = {
10
+ method: "get",
11
+ path: "/api/v1/sessions",
12
+ operationId: "listSessions",
13
+ summary: "List all active sessions",
14
+ description: "Returns all active sessions from the session store (memory and Valkey).",
15
+ tags: [
16
+ "sessions"
17
+ ],
18
+ responses: {
19
+ 200: {
20
+ description: "List of active sessions",
21
+ content: {
22
+ "application/json": {
23
+ schema: z.object({
24
+ sessions: getSessionResponseSchema.array(),
25
+ count: z.int(),
26
+ })
27
+ }
28
+ }
29
+ },
30
+ 503: {
31
+ description: "Session management unavailable (Valkey not configured)",
32
+ content: {
33
+ "application/json": {
34
+ schema: errorResponseSchema
35
+ }
36
+ }
37
+ }
38
+ }
39
+ };
40
+
41
+ export const createSessionRouteSchema: RouteConfig = {
42
+ method: "post",
43
+ path: "/api/v1/sessions",
44
+ operationId: "createSession",
45
+ summary: "Create a persistent session",
46
+ description: "Creates and starts a persistent container session. Returns 503 if Valkey is not configured (session management unavailable).",
47
+ tags: [
48
+ "sessions"
49
+ ],
50
+ request: {
51
+ body: {
52
+ description: undefined,
53
+ content: {
54
+ "application/json": {
55
+ schema: createSessionRequestSchema
56
+ }
57
+ },
58
+ required: true
59
+ }
60
+ },
61
+ responses: {
62
+ 201: {
63
+ description: "Session created",
64
+ content: {
65
+ "application/json": {
66
+ schema: createSessionResponseSchema
67
+ }
68
+ }
69
+ },
70
+ 400: {
71
+ description: "Missing image_tag or invalid request",
72
+ content: {
73
+ "application/json": {
74
+ schema: errorResponseSchema
75
+ }
76
+ }
77
+ },
78
+ 500: {
79
+ description: "Failed to create session",
80
+ content: {
81
+ "application/json": {
82
+ schema: errorResponseSchema
83
+ }
84
+ }
85
+ },
86
+ 503: {
87
+ description: "Session management unavailable (Valkey not configured)",
88
+ content: {
89
+ "application/json": {
90
+ schema: errorResponseSchema
91
+ }
92
+ }
93
+ }
94
+ }
95
+ };
96
+
97
+ export const getSessionRouteSchema: RouteConfig = {
98
+ method: "get",
99
+ path: "/api/v1/sessions/{sessionId}",
100
+ operationId: "getSession",
101
+ summary: "Get session details",
102
+ description: "Returns the current status and metadata for a session, with container liveness verification.",
103
+ tags: [
104
+ "sessions"
105
+ ],
106
+ parameters: [
107
+ {
108
+ name: "sessionId",
109
+ in: "path",
110
+ required: true,
111
+ schema: {
112
+ type: "string"
113
+ },
114
+ example: "sess-abc123"
115
+ }
116
+ ],
117
+ responses: {
118
+ 200: {
119
+ description: "Session details",
120
+ content: {
121
+ "application/json": {
122
+ schema: getSessionResponseSchema
123
+ }
124
+ }
125
+ },
126
+ 400: {
127
+ description: "Missing sessionId",
128
+ content: {
129
+ "application/json": {
130
+ schema: errorResponseSchema
131
+ }
132
+ }
133
+ },
134
+ 404: {
135
+ description: "Session not found",
136
+ content: {
137
+ "application/json": {
138
+ schema: errorResponseSchema
139
+ }
140
+ }
141
+ },
142
+ 503: {
143
+ description: "Session management unavailable",
144
+ content: {
145
+ "application/json": {
146
+ schema: errorResponseSchema
147
+ }
148
+ }
149
+ }
150
+ }
151
+ };
152
+
153
+ export const deleteSessionRouteSchema: RouteConfig = {
154
+ method: "delete",
155
+ path: "/api/v1/sessions/{sessionId}",
156
+ operationId: "deleteSession",
157
+ summary: "Delete a session",
158
+ description: "Destroys the session and its container.",
159
+ tags: [
160
+ "sessions"
161
+ ],
162
+ parameters: [
163
+ {
164
+ name: "sessionId",
165
+ in: "path",
166
+ required: true,
167
+ schema: {
168
+ type: "string"
169
+ },
170
+ example: "sess-abc123"
171
+ }
172
+ ],
173
+ responses: {
174
+ 200: {
175
+ description: "Session deleted",
176
+ content: {
177
+ "application/json": {
178
+ schema: z.object({
179
+ message: z.string(),
180
+ session_id: z.string(),
181
+ }),
182
+ example: {
183
+ message: "Session deleted successfully",
184
+ session_id: "sess-abc123"
185
+ }
186
+ }
187
+ }
188
+ },
189
+ 400: {
190
+ description: "Missing sessionId",
191
+ content: {
192
+ "application/json": {
193
+ schema: errorResponseSchema
194
+ }
195
+ }
196
+ },
197
+ 404: {
198
+ description: "Session not found",
199
+ content: {
200
+ "application/json": {
201
+ schema: errorResponseSchema
202
+ }
203
+ }
204
+ },
205
+ 503: {
206
+ description: "Session management unavailable",
207
+ content: {
208
+ "application/json": {
209
+ schema: errorResponseSchema
210
+ }
211
+ }
212
+ }
213
+ }
214
+ };
215
+
216
+ export const runInSessionRouteSchema: RouteConfig = {
217
+ method: "post",
218
+ path: "/api/v1/sessions/{sessionId}/run",
219
+ operationId: "runInSession",
220
+ summary: "Run a command in a session",
221
+ description: "Executes a command inside the session container and returns the result. Blocks until command completes or timeout is reached.",
222
+ tags: [
223
+ "sessions"
224
+ ],
225
+ parameters: [
226
+ {
227
+ name: "sessionId",
228
+ in: "path",
229
+ required: true,
230
+ schema: {
231
+ type: "string"
232
+ },
233
+ example: "sess-abc123"
234
+ }
235
+ ],
236
+ request: {
237
+ body: {
238
+ description: undefined,
239
+ content: {
240
+ "application/json": {
241
+ schema: runInSessionRequestSchema
242
+ }
243
+ },
244
+ required: true
245
+ }
246
+ },
247
+ responses: {
248
+ 200: {
249
+ description: "Command completed",
250
+ content: {
251
+ "application/json": {
252
+ schema: runInSessionResponseSchema
253
+ }
254
+ }
255
+ },
256
+ 400: {
257
+ description: "Missing command or invalid request",
258
+ content: {
259
+ "application/json": {
260
+ schema: errorResponseSchema
261
+ }
262
+ }
263
+ },
264
+ 404: {
265
+ description: "Session not found",
266
+ content: {
267
+ "application/json": {
268
+ schema: errorResponseSchema
269
+ }
270
+ }
271
+ },
272
+ 500: {
273
+ description: "Run failed",
274
+ content: {
275
+ "application/json": {
276
+ schema: errorResponseSchema
277
+ }
278
+ }
279
+ },
280
+ 503: {
281
+ description: "Session management unavailable",
282
+ content: {
283
+ "application/json": {
284
+ schema: errorResponseSchema
285
+ }
286
+ }
287
+ }
288
+ }
289
+ };
290
+
291
+ export const syncFileInSessionRouteSchema: RouteConfig = {
292
+ method: "post",
293
+ path: "/api/v1/sessions/{sessionId}/sync-file",
294
+ operationId: "syncFileInSession",
295
+ summary: "Sync a file into a session container",
296
+ description: "Writes a file to an absolute path inside the running session container. Content must be base64-encoded (default) or utf8 as specified by encoding.",
297
+ tags: [
298
+ "sessions"
299
+ ],
300
+ parameters: [
301
+ {
302
+ name: "sessionId",
303
+ in: "path",
304
+ required: true,
305
+ schema: {
306
+ type: "string"
307
+ },
308
+ example: "sess-abc123"
309
+ }
310
+ ],
311
+ request: {
312
+ body: {
313
+ description: undefined,
314
+ content: {
315
+ "application/json": {
316
+ schema: syncFileRequestSchema
317
+ }
318
+ },
319
+ required: true
320
+ }
321
+ },
322
+ responses: {
323
+ 200: {
324
+ description: "File written successfully",
325
+ content: {
326
+ "application/json": {
327
+ schema: syncFileResponseSchema
328
+ }
329
+ }
330
+ },
331
+ 400: {
332
+ description: "Missing targetPath/content, invalid encoding, invalid base64, or invalid path",
333
+ content: {
334
+ "application/json": {
335
+ schema: errorResponseSchema
336
+ }
337
+ }
338
+ },
339
+ 404: {
340
+ description: "Session not found",
341
+ content: {
342
+ "application/json": {
343
+ schema: errorResponseSchema
344
+ }
345
+ }
346
+ },
347
+ 409: {
348
+ description: "Container is no longer running",
349
+ content: {
350
+ "application/json": {
351
+ schema: errorResponseSchema
352
+ }
353
+ }
354
+ },
355
+ 500: {
356
+ description: "File write failed",
357
+ content: {
358
+ "application/json": {
359
+ schema: errorResponseSchema
360
+ }
361
+ }
362
+ },
363
+ 503: {
364
+ description: "Session management unavailable",
365
+ content: {
366
+ "application/json": {
367
+ schema: errorResponseSchema
368
+ }
369
+ }
370
+ }
371
+ }
372
+ };
373
+
374
+ export const listSessionRunsRouteSchema: RouteConfig = {
375
+ method: "get",
376
+ path: "/api/v1/sessions/{sessionId}/runs",
377
+ operationId: "listSessionRuns",
378
+ summary: "List all runs for a session",
379
+ description: "Returns all cached runs for a session, ordered by start time ascending.",
380
+ tags: [
381
+ "sessions"
382
+ ],
383
+ parameters: [
384
+ {
385
+ name: "sessionId",
386
+ in: "path",
387
+ required: true,
388
+ schema: {
389
+ type: "string"
390
+ },
391
+ example: "sess-abc123"
392
+ }
393
+ ],
394
+ responses: {
395
+ 200: {
396
+ description: "List of runs",
397
+ content: {
398
+ "application/json": {
399
+ schema: listRunsResponseSchema
400
+ }
401
+ }
402
+ },
403
+ 400: {
404
+ description: "Missing sessionId",
405
+ content: {
406
+ "application/json": {
407
+ schema: errorResponseSchema
408
+ }
409
+ }
410
+ },
411
+ 500: {
412
+ description: "Internal error",
413
+ content: {
414
+ "application/json": {
415
+ schema: errorResponseSchema
416
+ }
417
+ }
418
+ },
419
+ 503: {
420
+ description: "Session management unavailable",
421
+ content: {
422
+ "application/json": {
423
+ schema: errorResponseSchema
424
+ }
425
+ }
426
+ }
427
+ }
428
+ };
429
+
430
+ export const getSessionRunRouteSchema: RouteConfig = {
431
+ method: "get",
432
+ path: "/api/v1/sessions/{sessionId}/runs/{runId}",
433
+ operationId: "getSessionRun",
434
+ summary: "Get a previous run result",
435
+ description: "Retrieves the stored result of a past run within a session.",
436
+ tags: [
437
+ "sessions"
438
+ ],
439
+ parameters: [
440
+ {
441
+ name: "sessionId",
442
+ in: "path",
443
+ required: true,
444
+ schema: {
445
+ type: "string"
446
+ },
447
+ example: "sess-abc123"
448
+ },
449
+ {
450
+ name: "runId",
451
+ in: "path",
452
+ required: true,
453
+ schema: {
454
+ type: "string"
455
+ },
456
+ example: "run-def456"
457
+ }
458
+ ],
459
+ responses: {
460
+ 200: {
461
+ description: "Run details",
462
+ content: {
463
+ "application/json": {
464
+ schema: getRunResponseSchema
465
+ }
466
+ }
467
+ },
468
+ 400: {
469
+ description: "Missing runId",
470
+ content: {
471
+ "application/json": {
472
+ schema: errorResponseSchema
473
+ }
474
+ }
475
+ },
476
+ 404: {
477
+ description: "Run not found",
478
+ content: {
479
+ "application/json": {
480
+ schema: errorResponseSchema
481
+ }
482
+ }
483
+ },
484
+ 503: {
485
+ description: "Session management unavailable",
486
+ content: {
487
+ "application/json": {
488
+ schema: errorResponseSchema
489
+ }
490
+ }
491
+ }
492
+ }
493
+ };
@@ -0,0 +1,179 @@
1
+ import { RouteConfig } from "@asteasolutions/zod-to-openapi";
2
+ import { getStackResponseSchema, listStacksResponseSchema, startStackRequestSchema, startStackResponseSchema } from "../sessions.js";
3
+ import { errorResponseSchema } from "../response.js";
4
+
5
+ export const startStackRouteSchema: RouteConfig = {
6
+ method: "post",
7
+ path: "/api/v1/stacks",
8
+ operationId: "startStack",
9
+ summary: "Start a FigStack",
10
+ description: "Parse the FigStack spec and start all containers in dependency order. Optionally builds all required images first if build=true.",
11
+ tags: [
12
+ "stacks"
13
+ ],
14
+ request: {
15
+ body: {
16
+ description: undefined,
17
+ content: {
18
+ "application/json": {
19
+ schema: startStackRequestSchema
20
+ }
21
+ },
22
+ required: true
23
+ }
24
+ },
25
+ responses: {
26
+ 201: {
27
+ description: "Stack started successfully",
28
+ content: {
29
+ "application/json": {
30
+ schema: startStackResponseSchema
31
+ }
32
+ }
33
+ },
34
+ 400: {
35
+ description: "Invalid request or spec",
36
+ content: {
37
+ "application/json": {
38
+ schema: errorResponseSchema
39
+ }
40
+ }
41
+ },
42
+ 500: {
43
+ description: "Stack startup failed",
44
+ content: {
45
+ "application/json": {
46
+ schema: errorResponseSchema
47
+ }
48
+ }
49
+ },
50
+ 503: {
51
+ description: "Stack management unavailable",
52
+ content: {
53
+ "application/json": {
54
+ schema: errorResponseSchema
55
+ }
56
+ }
57
+ }
58
+ }
59
+ };
60
+
61
+ export const listStacksRouteSchema: RouteConfig = {
62
+ method: "get",
63
+ path: "/api/v1/stacks",
64
+ operationId: "listStacks",
65
+ summary: "List all running FigStacks",
66
+ description: "Returns all stacks currently tracked by the engine.",
67
+ tags: [
68
+ "stacks"
69
+ ],
70
+ responses: {
71
+ 200: {
72
+ description: "List of running stacks",
73
+ content: {
74
+ "application/json": {
75
+ schema: listStacksResponseSchema
76
+ }
77
+ }
78
+ },
79
+ 503: {
80
+ description: "Stack management unavailable",
81
+ content: {
82
+ "application/json": {
83
+ schema: errorResponseSchema
84
+ }
85
+ }
86
+ }
87
+ }
88
+ };
89
+
90
+ export const getStackRouteSchema: RouteConfig = {
91
+ method: "get",
92
+ path: "/api/v1/stacks/{stackName}",
93
+ operationId: "getStack",
94
+ summary: "Get the status of a running FigStack",
95
+ description: "Returns the current status of all containers in the named stack.",
96
+ tags: [
97
+ "stacks"
98
+ ],
99
+ parameters: [
100
+ {
101
+ name: "stackName",
102
+ in: "path",
103
+ required: true,
104
+ schema: {
105
+ type: "string"
106
+ },
107
+ example: "blog"
108
+ }
109
+ ],
110
+ responses: {
111
+ 200: {
112
+ description: "Stack status",
113
+ content: {
114
+ "application/json": {
115
+ schema: getStackResponseSchema
116
+ }
117
+ }
118
+ },
119
+ 404: {
120
+ description: "Stack not found",
121
+ content: {
122
+ "application/json": {
123
+ schema: errorResponseSchema
124
+ }
125
+ }
126
+ },
127
+ 503: {
128
+ description: "Stack management unavailable",
129
+ content: {
130
+ "application/json": {
131
+ schema: errorResponseSchema
132
+ }
133
+ }
134
+ }
135
+ }
136
+ };
137
+
138
+ export const stopStackRouteSchema: RouteConfig = {
139
+ method: "delete",
140
+ path: "/api/v1/stacks/{stackName}",
141
+ operationId: "stopStack",
142
+ summary: "Stop a running FigStack",
143
+ description: "Stops all containers in the stack and removes the stack network.",
144
+ tags: [
145
+ "stacks"
146
+ ],
147
+ parameters: [
148
+ {
149
+ name: "stackName",
150
+ in: "path",
151
+ required: true,
152
+ schema: {
153
+ type: "string"
154
+ },
155
+ example: "blog"
156
+ }
157
+ ],
158
+ responses: {
159
+ 204: {
160
+ description: "Stack stopped successfully"
161
+ },
162
+ 500: {
163
+ description: "Stack stop failed",
164
+ content: {
165
+ "application/json": {
166
+ schema: errorResponseSchema
167
+ }
168
+ }
169
+ },
170
+ 503: {
171
+ description: "Stack management unavailable",
172
+ content: {
173
+ "application/json": {
174
+ schema: errorResponseSchema
175
+ }
176
+ }
177
+ }
178
+ }
179
+ };