@aws/nx-plugin 1.0.0 → 1.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 (117) hide show
  1. package/LICENSE-THIRD-PARTY +11686 -23398
  2. package/README.md +18 -0
  3. package/generators.json +7 -0
  4. package/migrations.json +34 -1
  5. package/package.json +6 -6
  6. package/src/agentcore-gateway/schema.json +1 -0
  7. package/src/agentcore-harness/generator.d.ts +1 -1
  8. package/src/connection/scaffold-catalog.d.ts +4 -0
  9. package/src/connection/scaffold-catalog.js +3 -6
  10. package/src/connection/scaffold-catalog.js.map +1 -1
  11. package/src/infra/app/generator.d.ts +1 -1
  12. package/src/init/generator.d.ts +1 -1
  13. package/src/mcp-server/guide-pipeline.d.ts +2 -1
  14. package/src/mcp-server/guide-pipeline.js +6 -0
  15. package/src/mcp-server/guide-pipeline.js.map +1 -1
  16. package/src/mcp-server/mdx-ast.d.ts +7 -0
  17. package/src/mcp-server/mdx-ast.js +15 -0
  18. package/src/mcp-server/mdx-ast.js.map +1 -1
  19. package/src/mcp-server/schema-registry.d.ts +2 -2
  20. package/src/mcp-server/schema-registry.js +2 -2
  21. package/src/mcp-server/schema-registry.js.map +1 -1
  22. package/src/open-api/py-client/__snapshots__/generator.additional-properties.spec.ts.snap +34 -0
  23. package/src/open-api/py-client/__snapshots__/generator.arrays.spec.ts.snap +1750 -0
  24. package/src/open-api/py-client/__snapshots__/generator.complex-types.spec.ts.snap +82 -0
  25. package/src/open-api/py-client/__snapshots__/generator.composite-types.spec.ts.snap +447 -0
  26. package/src/open-api/py-client/__snapshots__/generator.duplicate-types.spec.ts.snap +404 -0
  27. package/src/open-api/py-client/__snapshots__/generator.errors.spec.ts.snap +430 -0
  28. package/src/open-api/py-client/__snapshots__/generator.fast-api.spec.ts.snap +447 -0
  29. package/src/open-api/py-client/__snapshots__/generator.petstore.spec.ts.snap +3488 -0
  30. package/src/open-api/py-client/__snapshots__/generator.primitive-types.spec.ts.snap +1444 -0
  31. package/src/open-api/py-client/__snapshots__/generator.request.spec.ts.snap +390 -0
  32. package/src/open-api/py-client/__snapshots__/generator.reserved-keywords.spec.ts.snap +364 -0
  33. package/src/open-api/py-client/__snapshots__/generator.response.spec.ts.snap +739 -0
  34. package/src/open-api/py-client/__snapshots__/generator.streaming.spec.ts.snap +384 -0
  35. package/src/open-api/py-client/__snapshots__/generator.tags.spec.ts.snap +414 -0
  36. package/src/open-api/py-client/files/client/__clientModuleName__.py.template +1076 -0
  37. package/src/open-api/py-client/files/shared/__init__.py.template +28 -0
  38. package/src/open-api/py-client/files/shared/errors.py.template +37 -0
  39. package/src/open-api/py-client/files/shared/types.py.template +319 -0
  40. package/src/open-api/py-client/generator.d.ts +53 -0
  41. package/src/open-api/py-client/generator.js +119 -0
  42. package/src/open-api/py-client/generator.js.map +1 -0
  43. package/src/open-api/py-client/schema.d.js +6 -0
  44. package/src/open-api/py-client/schema.d.js.map +1 -0
  45. package/src/open-api/py-client/schema.d.ts +12 -0
  46. package/src/open-api/py-client/schema.json +28 -0
  47. package/src/open-api/py-client/vessel-registry-spec.json +2716 -0
  48. package/src/open-api/ts-client/__snapshots__/generator.edge-cases.spec.ts.snap +274 -0
  49. package/src/open-api/ts-client/petstore-spec.d.ts +6 -0
  50. package/src/open-api/ts-client/petstore-spec.js +1275 -0
  51. package/src/open-api/ts-client/petstore-spec.js.map +1 -0
  52. package/src/open-api/ts-hooks/generator.spec.tsx +1 -1
  53. package/src/open-api/utils/codegen-data/languages.d.ts +68 -2
  54. package/src/open-api/utils/codegen-data/languages.js +433 -21
  55. package/src/open-api/utils/codegen-data/languages.js.map +1 -1
  56. package/src/open-api/utils/codegen-data/types.d.ts +187 -0
  57. package/src/open-api/utils/codegen-data/types.js +10 -1
  58. package/src/open-api/utils/codegen-data/types.js.map +1 -1
  59. package/src/open-api/utils/codegen-data.d.ts +40 -1
  60. package/src/open-api/utils/codegen-data.js +622 -17
  61. package/src/open-api/utils/codegen-data.js.map +1 -1
  62. package/src/open-api/utils/normalise.js +175 -41
  63. package/src/open-api/utils/normalise.js.map +1 -1
  64. package/src/open-api/utils/parser.js +1 -1
  65. package/src/open-api/utils/parser.js.map +1 -1
  66. package/src/preset/__snapshots__/generator.spec.ts.snap +3 -3
  67. package/src/preset/generator.d.ts +1 -1
  68. package/src/py/agent/gateway-connection/generator.js +0 -3
  69. package/src/py/agent/gateway-connection/generator.js.map +1 -1
  70. package/src/py/agent/react-connection/generator.d.ts +1 -1
  71. package/src/py/agent/schema.json +2 -0
  72. package/src/py/fast-api/react/generator.d.ts +1 -1
  73. package/src/py/mcp-server/schema.json +1 -0
  74. package/src/sdk/open-api.d.ts +2 -0
  75. package/src/sdk/open-api.js +1 -0
  76. package/src/sdk/open-api.js.map +1 -1
  77. package/src/smithy/project/generator.d.ts +1 -1
  78. package/src/smithy/react-connection/generator.d.ts +1 -1
  79. package/src/terraform/project/generator.d.ts +1 -1
  80. package/src/trpc/react/generator.d.ts +1 -1
  81. package/src/ts/agent/a2a-connection/generator.d.ts +1 -1
  82. package/src/ts/agent/gateway-connection/generator.d.ts +1 -1
  83. package/src/ts/agent/gateway-connection/generator.js +0 -3
  84. package/src/ts/agent/gateway-connection/generator.js.map +1 -1
  85. package/src/ts/agent/mcp-connection/generator.d.ts +1 -1
  86. package/src/ts/agent/react-connection/generator.d.ts +1 -1
  87. package/src/ts/agent/schema.json +1 -0
  88. package/src/ts/api/schema.json +2 -0
  89. package/src/ts/astro-docs/generator.d.ts +1 -1
  90. package/src/ts/dcr-proxy/generator.d.ts +1 -1
  91. package/src/ts/dynamodb/generator.d.ts +1 -1
  92. package/src/ts/lambda-function/generator.d.ts +1 -1
  93. package/src/ts/lib/generator.d.ts +1 -1
  94. package/src/ts/mcp-server/schema.json +1 -0
  95. package/src/ts/nx-generator/__snapshots__/generator.spec.ts.snap +1 -1
  96. package/src/ts/nx-generator/files/nx-plugin-for-aws/generator/generator.spec.ts.template +1 -1
  97. package/src/ts/nx-generator/generator.d.ts +1 -1
  98. package/src/ts/nx-migration/generator.d.ts +1 -1
  99. package/src/ts/nx-plugin/generator.d.ts +1 -1
  100. package/src/ts/rdb/generator.d.ts +1 -1
  101. package/src/ts/react-website/agui/generator.d.ts +1 -1
  102. package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +10 -10
  103. package/src/ts/react-website/app/schema.json +1 -0
  104. package/src/ts/website/app/schema.json +1 -0
  105. package/src/utils/metrics-assertions.d.ts +18 -0
  106. package/src/utils/metrics-assertions.js +42 -0
  107. package/src/utils/metrics-assertions.js.map +1 -0
  108. package/src/utils/test/python-dependencies.d.ts +8 -0
  109. package/src/utils/test/python-dependencies.js +14 -0
  110. package/src/utils/test/python-dependencies.js.map +1 -0
  111. package/src/utils/test/python-worker/worker.py +703 -0
  112. package/src/utils/test/warm-python-cache.d.ts +18 -0
  113. package/src/utils/test/warm-python-cache.js +46 -0
  114. package/src/utils/test/warm-python-cache.js.map +1 -0
  115. package/src/utils/versions.d.ts +10 -9
  116. package/src/utils/versions.js +9 -8
  117. package/src/utils/versions.js.map +1 -1
@@ -0,0 +1,2716 @@
1
+ {
2
+ "openapi": "3.1.0",
3
+ "info": {
4
+ "title": "VesselRegistry",
5
+ "version": "0.1.0"
6
+ },
7
+ "paths": {
8
+ "/fleet/vessels": {
9
+ "get": {
10
+ "tags": ["fleet"],
11
+ "summary": "List registered vessels",
12
+ "operationId": "list_vessels",
13
+ "parameters": [
14
+ {
15
+ "name": "hull_class",
16
+ "in": "query",
17
+ "required": false,
18
+ "schema": {
19
+ "anyOf": [
20
+ {
21
+ "type": "array",
22
+ "items": {
23
+ "$ref": "#/components/schemas/HullClass"
24
+ }
25
+ },
26
+ {
27
+ "type": "null"
28
+ }
29
+ ],
30
+ "description": "Repeatable hull class filter",
31
+ "title": "Hull Class"
32
+ },
33
+ "description": "Repeatable hull class filter"
34
+ },
35
+ {
36
+ "name": "status",
37
+ "in": "query",
38
+ "required": false,
39
+ "schema": {
40
+ "anyOf": [
41
+ {
42
+ "$ref": "#/components/schemas/VesselStatus"
43
+ },
44
+ {
45
+ "type": "null"
46
+ }
47
+ ],
48
+ "title": "Status"
49
+ }
50
+ },
51
+ {
52
+ "name": "min_cargo_tonnage",
53
+ "in": "query",
54
+ "required": false,
55
+ "schema": {
56
+ "type": "integer",
57
+ "minimum": 0,
58
+ "default": 0,
59
+ "title": "Min Cargo Tonnage"
60
+ }
61
+ },
62
+ {
63
+ "name": "home_port",
64
+ "in": "query",
65
+ "required": false,
66
+ "schema": {
67
+ "anyOf": [
68
+ {
69
+ "type": "string",
70
+ "pattern": "^[A-Z]{3}-\\d{1,2}$"
71
+ },
72
+ {
73
+ "type": "null"
74
+ }
75
+ ],
76
+ "title": "Home Port"
77
+ }
78
+ },
79
+ {
80
+ "name": "sort_by",
81
+ "in": "query",
82
+ "required": false,
83
+ "schema": {
84
+ "$ref": "#/components/schemas/VesselSortKey",
85
+ "default": "call-sign"
86
+ }
87
+ },
88
+ {
89
+ "name": "descending",
90
+ "in": "query",
91
+ "required": false,
92
+ "schema": {
93
+ "type": "boolean",
94
+ "default": false,
95
+ "title": "Descending"
96
+ }
97
+ },
98
+ {
99
+ "name": "page_size",
100
+ "in": "query",
101
+ "required": false,
102
+ "schema": {
103
+ "type": "integer",
104
+ "maximum": 200,
105
+ "minimum": 1,
106
+ "default": 25,
107
+ "title": "Page Size"
108
+ }
109
+ },
110
+ {
111
+ "name": "cursor",
112
+ "in": "query",
113
+ "required": false,
114
+ "schema": {
115
+ "anyOf": [
116
+ {
117
+ "type": "string"
118
+ },
119
+ {
120
+ "type": "null"
121
+ }
122
+ ],
123
+ "title": "Cursor"
124
+ }
125
+ }
126
+ ],
127
+ "responses": {
128
+ "200": {
129
+ "description": "Successful Response",
130
+ "content": {
131
+ "application/json": {
132
+ "schema": {
133
+ "$ref": "#/components/schemas/VesselPage"
134
+ }
135
+ }
136
+ }
137
+ },
138
+ "500": {
139
+ "content": {
140
+ "application/json": {
141
+ "schema": {
142
+ "$ref": "#/components/schemas/InternalServerErrorDetails"
143
+ }
144
+ }
145
+ },
146
+ "description": "Internal Server Error"
147
+ },
148
+ "422": {
149
+ "description": "Validation Error",
150
+ "content": {
151
+ "application/json": {
152
+ "schema": {
153
+ "$ref": "#/components/schemas/HTTPValidationError"
154
+ }
155
+ }
156
+ }
157
+ }
158
+ }
159
+ },
160
+ "post": {
161
+ "tags": ["fleet"],
162
+ "summary": "Commission a new vessel",
163
+ "operationId": "commission_vessel",
164
+ "requestBody": {
165
+ "required": true,
166
+ "content": {
167
+ "application/json": {
168
+ "schema": {
169
+ "$ref": "#/components/schemas/CommissionVesselRequest"
170
+ }
171
+ }
172
+ }
173
+ },
174
+ "responses": {
175
+ "201": {
176
+ "description": "Successful Response",
177
+ "content": {
178
+ "application/json": {
179
+ "schema": {
180
+ "$ref": "#/components/schemas/Vessel"
181
+ }
182
+ }
183
+ }
184
+ },
185
+ "500": {
186
+ "content": {
187
+ "application/json": {
188
+ "schema": {
189
+ "$ref": "#/components/schemas/InternalServerErrorDetails"
190
+ }
191
+ }
192
+ },
193
+ "description": "Internal Server Error"
194
+ },
195
+ "422": {
196
+ "description": "Validation Error",
197
+ "content": {
198
+ "application/json": {
199
+ "schema": {
200
+ "$ref": "#/components/schemas/HTTPValidationError"
201
+ }
202
+ }
203
+ }
204
+ }
205
+ }
206
+ }
207
+ },
208
+ "/fleet/vessels/{vessel_id}": {
209
+ "get": {
210
+ "tags": ["fleet"],
211
+ "summary": "Fetch one vessel",
212
+ "operationId": "get_vessel",
213
+ "parameters": [
214
+ {
215
+ "name": "vessel_id",
216
+ "in": "path",
217
+ "required": true,
218
+ "schema": {
219
+ "type": "string",
220
+ "pattern": "^ves_[a-z0-9_]+$",
221
+ "title": "Vessel Id"
222
+ }
223
+ },
224
+ {
225
+ "name": "as_of",
226
+ "in": "query",
227
+ "required": false,
228
+ "schema": {
229
+ "anyOf": [
230
+ {
231
+ "type": "string",
232
+ "format": "date-time"
233
+ },
234
+ {
235
+ "type": "null"
236
+ }
237
+ ],
238
+ "description": "Read the registry as it stood at this instant",
239
+ "title": "As Of"
240
+ },
241
+ "description": "Read the registry as it stood at this instant"
242
+ }
243
+ ],
244
+ "responses": {
245
+ "200": {
246
+ "description": "Successful Response",
247
+ "content": {
248
+ "application/json": {
249
+ "schema": {
250
+ "$ref": "#/components/schemas/Vessel"
251
+ }
252
+ }
253
+ }
254
+ },
255
+ "500": {
256
+ "content": {
257
+ "application/json": {
258
+ "schema": {
259
+ "$ref": "#/components/schemas/InternalServerErrorDetails"
260
+ }
261
+ }
262
+ },
263
+ "description": "Internal Server Error"
264
+ },
265
+ "404": {
266
+ "description": "Resource not found",
267
+ "content": {
268
+ "application/json": {
269
+ "schema": {
270
+ "$ref": "#/components/schemas/ProblemDetails"
271
+ }
272
+ }
273
+ }
274
+ },
275
+ "422": {
276
+ "description": "Validation Error",
277
+ "content": {
278
+ "application/json": {
279
+ "schema": {
280
+ "$ref": "#/components/schemas/HTTPValidationError"
281
+ }
282
+ }
283
+ }
284
+ }
285
+ }
286
+ },
287
+ "delete": {
288
+ "tags": ["fleet"],
289
+ "summary": "Strike a vessel from the registry",
290
+ "operationId": "decommission_vessel",
291
+ "parameters": [
292
+ {
293
+ "name": "vessel_id",
294
+ "in": "path",
295
+ "required": true,
296
+ "schema": {
297
+ "type": "string",
298
+ "title": "Vessel Id"
299
+ }
300
+ },
301
+ {
302
+ "name": "scuttle",
303
+ "in": "query",
304
+ "required": false,
305
+ "schema": {
306
+ "type": "boolean",
307
+ "description": "Scuttle the hull rather than sell it on",
308
+ "default": false,
309
+ "title": "Scuttle"
310
+ },
311
+ "description": "Scuttle the hull rather than sell it on"
312
+ },
313
+ {
314
+ "name": "reason",
315
+ "in": "query",
316
+ "required": false,
317
+ "schema": {
318
+ "type": "string",
319
+ "minLength": 3,
320
+ "maxLength": 256,
321
+ "default": "end of service life",
322
+ "title": "Reason"
323
+ }
324
+ }
325
+ ],
326
+ "responses": {
327
+ "204": {
328
+ "description": "Successful Response"
329
+ },
330
+ "500": {
331
+ "content": {
332
+ "application/json": {
333
+ "schema": {
334
+ "$ref": "#/components/schemas/InternalServerErrorDetails"
335
+ }
336
+ }
337
+ },
338
+ "description": "Internal Server Error"
339
+ },
340
+ "404": {
341
+ "description": "Resource not found",
342
+ "content": {
343
+ "application/json": {
344
+ "schema": {
345
+ "$ref": "#/components/schemas/ProblemDetails"
346
+ }
347
+ }
348
+ }
349
+ },
350
+ "422": {
351
+ "description": "Validation Error",
352
+ "content": {
353
+ "application/json": {
354
+ "schema": {
355
+ "$ref": "#/components/schemas/HTTPValidationError"
356
+ }
357
+ }
358
+ }
359
+ }
360
+ }
361
+ }
362
+ },
363
+ "/fleet/vessels/{vessel_id}/status": {
364
+ "patch": {
365
+ "tags": ["fleet"],
366
+ "summary": "Amend a vessel's operational status",
367
+ "operationId": "update_vessel_status",
368
+ "parameters": [
369
+ {
370
+ "name": "vessel_id",
371
+ "in": "path",
372
+ "required": true,
373
+ "schema": {
374
+ "type": "string",
375
+ "title": "Vessel Id"
376
+ }
377
+ },
378
+ {
379
+ "name": "X-Dock-Authority",
380
+ "in": "header",
381
+ "required": true,
382
+ "schema": {
383
+ "type": "string",
384
+ "minLength": 4,
385
+ "maxLength": 64,
386
+ "title": "X-Dock-Authority"
387
+ }
388
+ }
389
+ ],
390
+ "requestBody": {
391
+ "required": true,
392
+ "content": {
393
+ "application/json": {
394
+ "schema": {
395
+ "$ref": "#/components/schemas/VesselStatusPatch"
396
+ }
397
+ }
398
+ }
399
+ },
400
+ "responses": {
401
+ "200": {
402
+ "description": "Successful Response",
403
+ "content": {
404
+ "application/json": {
405
+ "schema": {
406
+ "$ref": "#/components/schemas/Vessel"
407
+ }
408
+ }
409
+ }
410
+ },
411
+ "500": {
412
+ "content": {
413
+ "application/json": {
414
+ "schema": {
415
+ "$ref": "#/components/schemas/InternalServerErrorDetails"
416
+ }
417
+ }
418
+ },
419
+ "description": "Internal Server Error"
420
+ },
421
+ "404": {
422
+ "description": "Resource not found",
423
+ "content": {
424
+ "application/json": {
425
+ "schema": {
426
+ "$ref": "#/components/schemas/ProblemDetails"
427
+ }
428
+ }
429
+ }
430
+ },
431
+ "422": {
432
+ "description": "Validation Error",
433
+ "content": {
434
+ "application/json": {
435
+ "schema": {
436
+ "$ref": "#/components/schemas/HTTPValidationError"
437
+ }
438
+ }
439
+ }
440
+ }
441
+ }
442
+ }
443
+ },
444
+ "/fleet/vessels/{vessel_id}/refuel": {
445
+ "post": {
446
+ "tags": ["fleet"],
447
+ "summary": "Take on propellant",
448
+ "operationId": "refuel_vessel",
449
+ "parameters": [
450
+ {
451
+ "name": "vessel_id",
452
+ "in": "path",
453
+ "required": true,
454
+ "schema": {
455
+ "type": "string",
456
+ "title": "Vessel Id"
457
+ }
458
+ }
459
+ ],
460
+ "requestBody": {
461
+ "required": true,
462
+ "content": {
463
+ "application/json": {
464
+ "schema": {
465
+ "$ref": "#/components/schemas/RefuelRequest"
466
+ }
467
+ }
468
+ }
469
+ },
470
+ "responses": {
471
+ "200": {
472
+ "description": "Successful Response",
473
+ "content": {
474
+ "application/json": {
475
+ "schema": {
476
+ "$ref": "#/components/schemas/RefuelReceipt"
477
+ }
478
+ }
479
+ }
480
+ },
481
+ "500": {
482
+ "content": {
483
+ "application/json": {
484
+ "schema": {
485
+ "$ref": "#/components/schemas/InternalServerErrorDetails"
486
+ }
487
+ }
488
+ },
489
+ "description": "Internal Server Error"
490
+ },
491
+ "404": {
492
+ "description": "Resource not found",
493
+ "content": {
494
+ "application/json": {
495
+ "schema": {
496
+ "$ref": "#/components/schemas/ProblemDetails"
497
+ }
498
+ }
499
+ }
500
+ },
501
+ "422": {
502
+ "description": "Validation Error",
503
+ "content": {
504
+ "application/json": {
505
+ "schema": {
506
+ "$ref": "#/components/schemas/HTTPValidationError"
507
+ }
508
+ }
509
+ }
510
+ }
511
+ }
512
+ }
513
+ },
514
+ "/fleet/vessels/{vessel_id}/telemetry": {
515
+ "get": {
516
+ "tags": ["fleet"],
517
+ "summary": "Stream live telemetry frames",
518
+ "operationId": "stream_vessel_telemetry",
519
+ "parameters": [
520
+ {
521
+ "name": "vessel_id",
522
+ "in": "path",
523
+ "required": true,
524
+ "schema": {
525
+ "type": "string",
526
+ "title": "Vessel Id"
527
+ }
528
+ },
529
+ {
530
+ "name": "frames",
531
+ "in": "query",
532
+ "required": false,
533
+ "schema": {
534
+ "type": "integer",
535
+ "maximum": 1000,
536
+ "minimum": 1,
537
+ "description": "Number of frames before the stream closes",
538
+ "default": 10,
539
+ "title": "Frames"
540
+ },
541
+ "description": "Number of frames before the stream closes"
542
+ },
543
+ {
544
+ "name": "interval_ms",
545
+ "in": "query",
546
+ "required": false,
547
+ "schema": {
548
+ "type": "integer",
549
+ "maximum": 5000,
550
+ "minimum": 0,
551
+ "default": 250,
552
+ "title": "Interval Ms"
553
+ }
554
+ }
555
+ ],
556
+ "responses": {
557
+ "200": {
558
+ "description": "A JSON Lines stream of telemetry frames",
559
+ "content": {
560
+ "application/json": {
561
+ "schema": {
562
+ "$ref": "#/components/schemas/TelemetryFrame"
563
+ }
564
+ },
565
+ "application/jsonl": {
566
+ "itemSchema": {
567
+ "$ref": "#/components/schemas/TelemetryFrame"
568
+ }
569
+ }
570
+ }
571
+ },
572
+ "500": {
573
+ "content": {
574
+ "application/json": {
575
+ "schema": {
576
+ "$ref": "#/components/schemas/InternalServerErrorDetails"
577
+ }
578
+ }
579
+ },
580
+ "description": "Internal Server Error"
581
+ },
582
+ "404": {
583
+ "description": "Resource not found",
584
+ "content": {
585
+ "application/json": {
586
+ "schema": {
587
+ "$ref": "#/components/schemas/ProblemDetails"
588
+ }
589
+ }
590
+ }
591
+ },
592
+ "422": {
593
+ "description": "Validation Error",
594
+ "content": {
595
+ "application/json": {
596
+ "schema": {
597
+ "$ref": "#/components/schemas/HTTPValidationError"
598
+ }
599
+ }
600
+ }
601
+ }
602
+ }
603
+ }
604
+ },
605
+ "/ports": {
606
+ "get": {
607
+ "tags": ["ports"],
608
+ "summary": "List orbital ports",
609
+ "operationId": "list_ports",
610
+ "parameters": [
611
+ {
612
+ "name": "sector",
613
+ "in": "query",
614
+ "required": false,
615
+ "schema": {
616
+ "anyOf": [
617
+ {
618
+ "type": "string",
619
+ "maxLength": 64
620
+ },
621
+ {
622
+ "type": "null"
623
+ }
624
+ ],
625
+ "title": "Sector"
626
+ }
627
+ },
628
+ {
629
+ "name": "max_gravity_well_g",
630
+ "in": "query",
631
+ "required": false,
632
+ "schema": {
633
+ "type": "number",
634
+ "maximum": 50,
635
+ "exclusiveMinimum": 0,
636
+ "default": 50,
637
+ "title": "Max Gravity Well G"
638
+ }
639
+ },
640
+ {
641
+ "name": "drydock_only",
642
+ "in": "query",
643
+ "required": false,
644
+ "schema": {
645
+ "type": "boolean",
646
+ "default": false,
647
+ "title": "Drydock Only"
648
+ }
649
+ }
650
+ ],
651
+ "responses": {
652
+ "200": {
653
+ "description": "Successful Response",
654
+ "content": {
655
+ "application/json": {
656
+ "schema": {
657
+ "type": "array",
658
+ "items": {
659
+ "$ref": "#/components/schemas/Port"
660
+ },
661
+ "title": "Response List Ports"
662
+ }
663
+ }
664
+ }
665
+ },
666
+ "500": {
667
+ "content": {
668
+ "application/json": {
669
+ "schema": {
670
+ "$ref": "#/components/schemas/InternalServerErrorDetails"
671
+ }
672
+ }
673
+ },
674
+ "description": "Internal Server Error"
675
+ },
676
+ "422": {
677
+ "description": "Validation Error",
678
+ "content": {
679
+ "application/json": {
680
+ "schema": {
681
+ "$ref": "#/components/schemas/HTTPValidationError"
682
+ }
683
+ }
684
+ }
685
+ }
686
+ }
687
+ }
688
+ },
689
+ "/ports/{port_code}/berths": {
690
+ "get": {
691
+ "tags": ["ports"],
692
+ "summary": "List berths at a port",
693
+ "operationId": "list_berths",
694
+ "parameters": [
695
+ {
696
+ "name": "port_code",
697
+ "in": "path",
698
+ "required": true,
699
+ "schema": {
700
+ "type": "string",
701
+ "pattern": "^[A-Z]{3}-\\d{1,2}$",
702
+ "examples": ["SOL-3", "PRX-1"],
703
+ "title": "Port Code"
704
+ }
705
+ },
706
+ {
707
+ "name": "free_between",
708
+ "in": "query",
709
+ "required": false,
710
+ "schema": {
711
+ "anyOf": [
712
+ {
713
+ "type": "string",
714
+ "format": "date"
715
+ },
716
+ {
717
+ "type": "null"
718
+ }
719
+ ],
720
+ "description": "Start of the availability window",
721
+ "title": "Free Between"
722
+ },
723
+ "description": "Start of the availability window"
724
+ },
725
+ {
726
+ "name": "free_and",
727
+ "in": "query",
728
+ "required": false,
729
+ "schema": {
730
+ "anyOf": [
731
+ {
732
+ "type": "string",
733
+ "format": "date"
734
+ },
735
+ {
736
+ "type": "null"
737
+ }
738
+ ],
739
+ "description": "End of the availability window",
740
+ "title": "Free And"
741
+ },
742
+ "description": "End of the availability window"
743
+ },
744
+ {
745
+ "name": "fits_tonnage",
746
+ "in": "query",
747
+ "required": false,
748
+ "schema": {
749
+ "type": "integer",
750
+ "minimum": 0,
751
+ "default": 0,
752
+ "title": "Fits Tonnage"
753
+ }
754
+ },
755
+ {
756
+ "name": "pressurised_only",
757
+ "in": "query",
758
+ "required": false,
759
+ "schema": {
760
+ "type": "boolean",
761
+ "default": false,
762
+ "title": "Pressurised Only"
763
+ }
764
+ }
765
+ ],
766
+ "responses": {
767
+ "200": {
768
+ "description": "Successful Response",
769
+ "content": {
770
+ "application/json": {
771
+ "schema": {
772
+ "type": "array",
773
+ "items": {
774
+ "$ref": "#/components/schemas/Berth"
775
+ },
776
+ "title": "Response List Berths"
777
+ }
778
+ }
779
+ }
780
+ },
781
+ "500": {
782
+ "content": {
783
+ "application/json": {
784
+ "schema": {
785
+ "$ref": "#/components/schemas/InternalServerErrorDetails"
786
+ }
787
+ }
788
+ },
789
+ "description": "Internal Server Error"
790
+ },
791
+ "404": {
792
+ "description": "Resource not found",
793
+ "content": {
794
+ "application/json": {
795
+ "schema": {
796
+ "$ref": "#/components/schemas/ProblemDetails"
797
+ }
798
+ }
799
+ }
800
+ },
801
+ "422": {
802
+ "description": "Validation Error",
803
+ "content": {
804
+ "application/json": {
805
+ "schema": {
806
+ "$ref": "#/components/schemas/HTTPValidationError"
807
+ }
808
+ }
809
+ }
810
+ }
811
+ }
812
+ }
813
+ },
814
+ "/ports/{port_code}/berths/reservations": {
815
+ "post": {
816
+ "tags": ["ports"],
817
+ "summary": "Reserve a berth",
818
+ "operationId": "reserve_berth",
819
+ "parameters": [
820
+ {
821
+ "name": "port_code",
822
+ "in": "path",
823
+ "required": true,
824
+ "schema": {
825
+ "type": "string",
826
+ "pattern": "^[A-Z]{3}-\\d{1,2}$",
827
+ "examples": ["SOL-3", "PRX-1"],
828
+ "title": "Port Code"
829
+ }
830
+ }
831
+ ],
832
+ "requestBody": {
833
+ "required": true,
834
+ "content": {
835
+ "application/json": {
836
+ "schema": {
837
+ "$ref": "#/components/schemas/BerthReservationRequest"
838
+ }
839
+ }
840
+ }
841
+ },
842
+ "responses": {
843
+ "201": {
844
+ "description": "Successful Response",
845
+ "content": {
846
+ "application/json": {
847
+ "schema": {
848
+ "$ref": "#/components/schemas/BerthReservation"
849
+ }
850
+ }
851
+ }
852
+ },
853
+ "500": {
854
+ "content": {
855
+ "application/json": {
856
+ "schema": {
857
+ "$ref": "#/components/schemas/InternalServerErrorDetails"
858
+ }
859
+ }
860
+ },
861
+ "description": "Internal Server Error"
862
+ },
863
+ "404": {
864
+ "description": "Resource not found",
865
+ "content": {
866
+ "application/json": {
867
+ "schema": {
868
+ "$ref": "#/components/schemas/ProblemDetails"
869
+ }
870
+ }
871
+ }
872
+ },
873
+ "422": {
874
+ "description": "Validation Error",
875
+ "content": {
876
+ "application/json": {
877
+ "schema": {
878
+ "$ref": "#/components/schemas/HTTPValidationError"
879
+ }
880
+ }
881
+ }
882
+ }
883
+ }
884
+ }
885
+ },
886
+ "/ports/{port_code}/berths/reservations/{reservation_id}": {
887
+ "delete": {
888
+ "tags": ["ports"],
889
+ "summary": "Release a berth reservation",
890
+ "operationId": "cancel_berth_reservation",
891
+ "parameters": [
892
+ {
893
+ "name": "port_code",
894
+ "in": "path",
895
+ "required": true,
896
+ "schema": {
897
+ "type": "string",
898
+ "pattern": "^[A-Z]{3}-\\d{1,2}$",
899
+ "examples": ["SOL-3", "PRX-1"],
900
+ "title": "Port Code"
901
+ }
902
+ },
903
+ {
904
+ "name": "reservation_id",
905
+ "in": "path",
906
+ "required": true,
907
+ "schema": {
908
+ "type": "string",
909
+ "pattern": "^res_[a-z0-9]+$",
910
+ "title": "Reservation Id"
911
+ }
912
+ },
913
+ {
914
+ "name": "waive_penalty",
915
+ "in": "query",
916
+ "required": false,
917
+ "schema": {
918
+ "type": "boolean",
919
+ "default": false,
920
+ "title": "Waive Penalty"
921
+ }
922
+ }
923
+ ],
924
+ "responses": {
925
+ "204": {
926
+ "description": "Successful Response"
927
+ },
928
+ "500": {
929
+ "content": {
930
+ "application/json": {
931
+ "schema": {
932
+ "$ref": "#/components/schemas/InternalServerErrorDetails"
933
+ }
934
+ }
935
+ },
936
+ "description": "Internal Server Error"
937
+ },
938
+ "404": {
939
+ "description": "Resource not found",
940
+ "content": {
941
+ "application/json": {
942
+ "schema": {
943
+ "$ref": "#/components/schemas/ProblemDetails"
944
+ }
945
+ }
946
+ }
947
+ },
948
+ "422": {
949
+ "description": "Validation Error",
950
+ "content": {
951
+ "application/json": {
952
+ "schema": {
953
+ "$ref": "#/components/schemas/HTTPValidationError"
954
+ }
955
+ }
956
+ }
957
+ }
958
+ }
959
+ }
960
+ },
961
+ "/manifests": {
962
+ "get": {
963
+ "tags": ["manifests"],
964
+ "summary": "Search lodged manifests",
965
+ "operationId": "list_manifests",
966
+ "parameters": [
967
+ {
968
+ "name": "status",
969
+ "in": "query",
970
+ "required": false,
971
+ "schema": {
972
+ "anyOf": [
973
+ {
974
+ "type": "array",
975
+ "items": {
976
+ "$ref": "#/components/schemas/ManifestStatus"
977
+ }
978
+ },
979
+ {
980
+ "type": "null"
981
+ }
982
+ ],
983
+ "description": "Repeatable status filter",
984
+ "title": "Status"
985
+ },
986
+ "description": "Repeatable status filter"
987
+ },
988
+ {
989
+ "name": "carrying",
990
+ "in": "query",
991
+ "required": false,
992
+ "schema": {
993
+ "anyOf": [
994
+ {
995
+ "type": "array",
996
+ "items": {
997
+ "$ref": "#/components/schemas/HazardClass"
998
+ }
999
+ },
1000
+ {
1001
+ "type": "null"
1002
+ }
1003
+ ],
1004
+ "title": "Carrying"
1005
+ }
1006
+ },
1007
+ {
1008
+ "name": "lodged_after",
1009
+ "in": "query",
1010
+ "required": false,
1011
+ "schema": {
1012
+ "anyOf": [
1013
+ {
1014
+ "type": "string",
1015
+ "format": "date-time"
1016
+ },
1017
+ {
1018
+ "type": "null"
1019
+ }
1020
+ ],
1021
+ "title": "Lodged After"
1022
+ }
1023
+ },
1024
+ {
1025
+ "name": "lodged_before",
1026
+ "in": "query",
1027
+ "required": false,
1028
+ "schema": {
1029
+ "anyOf": [
1030
+ {
1031
+ "type": "string",
1032
+ "format": "date-time"
1033
+ },
1034
+ {
1035
+ "type": "null"
1036
+ }
1037
+ ],
1038
+ "title": "Lodged Before"
1039
+ }
1040
+ },
1041
+ {
1042
+ "name": "consignee_like",
1043
+ "in": "query",
1044
+ "required": false,
1045
+ "schema": {
1046
+ "anyOf": [
1047
+ {
1048
+ "type": "string",
1049
+ "minLength": 2,
1050
+ "maxLength": 128
1051
+ },
1052
+ {
1053
+ "type": "null"
1054
+ }
1055
+ ],
1056
+ "title": "Consignee Like"
1057
+ }
1058
+ },
1059
+ {
1060
+ "name": "page_size",
1061
+ "in": "query",
1062
+ "required": false,
1063
+ "schema": {
1064
+ "type": "integer",
1065
+ "maximum": 100,
1066
+ "minimum": 1,
1067
+ "default": 20,
1068
+ "title": "Page Size"
1069
+ }
1070
+ },
1071
+ {
1072
+ "name": "cursor",
1073
+ "in": "query",
1074
+ "required": false,
1075
+ "schema": {
1076
+ "anyOf": [
1077
+ {
1078
+ "type": "string"
1079
+ },
1080
+ {
1081
+ "type": "null"
1082
+ }
1083
+ ],
1084
+ "title": "Cursor"
1085
+ }
1086
+ }
1087
+ ],
1088
+ "responses": {
1089
+ "200": {
1090
+ "description": "Successful Response",
1091
+ "content": {
1092
+ "application/json": {
1093
+ "schema": {
1094
+ "$ref": "#/components/schemas/ManifestPage"
1095
+ }
1096
+ }
1097
+ }
1098
+ },
1099
+ "500": {
1100
+ "content": {
1101
+ "application/json": {
1102
+ "schema": {
1103
+ "$ref": "#/components/schemas/InternalServerErrorDetails"
1104
+ }
1105
+ }
1106
+ },
1107
+ "description": "Internal Server Error"
1108
+ },
1109
+ "422": {
1110
+ "description": "Validation Error",
1111
+ "content": {
1112
+ "application/json": {
1113
+ "schema": {
1114
+ "$ref": "#/components/schemas/HTTPValidationError"
1115
+ }
1116
+ }
1117
+ }
1118
+ }
1119
+ }
1120
+ },
1121
+ "post": {
1122
+ "tags": ["manifests"],
1123
+ "summary": "Lodge a draft manifest",
1124
+ "operationId": "create_manifest",
1125
+ "requestBody": {
1126
+ "required": true,
1127
+ "content": {
1128
+ "application/json": {
1129
+ "schema": {
1130
+ "$ref": "#/components/schemas/ManifestUpsert"
1131
+ }
1132
+ }
1133
+ }
1134
+ },
1135
+ "responses": {
1136
+ "201": {
1137
+ "description": "Successful Response",
1138
+ "content": {
1139
+ "application/json": {
1140
+ "schema": {
1141
+ "$ref": "#/components/schemas/Manifest"
1142
+ }
1143
+ }
1144
+ }
1145
+ },
1146
+ "500": {
1147
+ "content": {
1148
+ "application/json": {
1149
+ "schema": {
1150
+ "$ref": "#/components/schemas/InternalServerErrorDetails"
1151
+ }
1152
+ }
1153
+ },
1154
+ "description": "Internal Server Error"
1155
+ },
1156
+ "422": {
1157
+ "description": "Validation Error",
1158
+ "content": {
1159
+ "application/json": {
1160
+ "schema": {
1161
+ "$ref": "#/components/schemas/HTTPValidationError"
1162
+ }
1163
+ }
1164
+ }
1165
+ }
1166
+ }
1167
+ }
1168
+ },
1169
+ "/manifests/{manifest_id}": {
1170
+ "get": {
1171
+ "tags": ["manifests"],
1172
+ "summary": "Fetch one manifest",
1173
+ "operationId": "get_manifest",
1174
+ "parameters": [
1175
+ {
1176
+ "name": "manifest_id",
1177
+ "in": "path",
1178
+ "required": true,
1179
+ "schema": {
1180
+ "type": "string",
1181
+ "pattern": "^man_[a-z0-9]+$",
1182
+ "title": "Manifest Id"
1183
+ }
1184
+ },
1185
+ {
1186
+ "name": "expand_lines",
1187
+ "in": "query",
1188
+ "required": false,
1189
+ "schema": {
1190
+ "type": "boolean",
1191
+ "description": "Include line items; false returns the header only",
1192
+ "default": true,
1193
+ "title": "Expand Lines"
1194
+ },
1195
+ "description": "Include line items; false returns the header only"
1196
+ }
1197
+ ],
1198
+ "responses": {
1199
+ "200": {
1200
+ "description": "Successful Response",
1201
+ "content": {
1202
+ "application/json": {
1203
+ "schema": {
1204
+ "$ref": "#/components/schemas/Manifest"
1205
+ }
1206
+ }
1207
+ }
1208
+ },
1209
+ "500": {
1210
+ "content": {
1211
+ "application/json": {
1212
+ "schema": {
1213
+ "$ref": "#/components/schemas/InternalServerErrorDetails"
1214
+ }
1215
+ }
1216
+ },
1217
+ "description": "Internal Server Error"
1218
+ },
1219
+ "404": {
1220
+ "description": "Resource not found",
1221
+ "content": {
1222
+ "application/json": {
1223
+ "schema": {
1224
+ "$ref": "#/components/schemas/ProblemDetails"
1225
+ }
1226
+ }
1227
+ }
1228
+ },
1229
+ "422": {
1230
+ "description": "Validation Error",
1231
+ "content": {
1232
+ "application/json": {
1233
+ "schema": {
1234
+ "$ref": "#/components/schemas/HTTPValidationError"
1235
+ }
1236
+ }
1237
+ }
1238
+ }
1239
+ }
1240
+ },
1241
+ "put": {
1242
+ "tags": ["manifests"],
1243
+ "summary": "Replace a draft manifest",
1244
+ "operationId": "replace_manifest",
1245
+ "parameters": [
1246
+ {
1247
+ "name": "manifest_id",
1248
+ "in": "path",
1249
+ "required": true,
1250
+ "schema": {
1251
+ "type": "string",
1252
+ "title": "Manifest Id"
1253
+ }
1254
+ }
1255
+ ],
1256
+ "requestBody": {
1257
+ "required": true,
1258
+ "content": {
1259
+ "application/json": {
1260
+ "schema": {
1261
+ "$ref": "#/components/schemas/ManifestUpsert"
1262
+ }
1263
+ }
1264
+ }
1265
+ },
1266
+ "responses": {
1267
+ "200": {
1268
+ "description": "Successful Response",
1269
+ "content": {
1270
+ "application/json": {
1271
+ "schema": {
1272
+ "$ref": "#/components/schemas/Manifest"
1273
+ }
1274
+ }
1275
+ }
1276
+ },
1277
+ "500": {
1278
+ "content": {
1279
+ "application/json": {
1280
+ "schema": {
1281
+ "$ref": "#/components/schemas/InternalServerErrorDetails"
1282
+ }
1283
+ }
1284
+ },
1285
+ "description": "Internal Server Error"
1286
+ },
1287
+ "404": {
1288
+ "description": "Resource not found",
1289
+ "content": {
1290
+ "application/json": {
1291
+ "schema": {
1292
+ "$ref": "#/components/schemas/ProblemDetails"
1293
+ }
1294
+ }
1295
+ }
1296
+ },
1297
+ "422": {
1298
+ "description": "Validation Error",
1299
+ "content": {
1300
+ "application/json": {
1301
+ "schema": {
1302
+ "$ref": "#/components/schemas/HTTPValidationError"
1303
+ }
1304
+ }
1305
+ }
1306
+ }
1307
+ }
1308
+ }
1309
+ },
1310
+ "/manifests/{manifest_id}/seal": {
1311
+ "post": {
1312
+ "tags": ["manifests"],
1313
+ "summary": "Seal a manifest for customs",
1314
+ "operationId": "seal_manifest",
1315
+ "parameters": [
1316
+ {
1317
+ "name": "manifest_id",
1318
+ "in": "path",
1319
+ "required": true,
1320
+ "schema": {
1321
+ "type": "string",
1322
+ "title": "Manifest Id"
1323
+ }
1324
+ },
1325
+ {
1326
+ "name": "Idempotency-Key",
1327
+ "in": "header",
1328
+ "required": false,
1329
+ "schema": {
1330
+ "anyOf": [
1331
+ {
1332
+ "type": "string",
1333
+ "maxLength": 128
1334
+ },
1335
+ {
1336
+ "type": "null"
1337
+ }
1338
+ ],
1339
+ "title": "Idempotency-Key"
1340
+ }
1341
+ }
1342
+ ],
1343
+ "requestBody": {
1344
+ "required": true,
1345
+ "content": {
1346
+ "application/json": {
1347
+ "schema": {
1348
+ "$ref": "#/components/schemas/SealManifestRequest"
1349
+ }
1350
+ }
1351
+ }
1352
+ },
1353
+ "responses": {
1354
+ "200": {
1355
+ "description": "Successful Response",
1356
+ "content": {
1357
+ "application/json": {
1358
+ "schema": {
1359
+ "$ref": "#/components/schemas/Manifest"
1360
+ }
1361
+ }
1362
+ }
1363
+ },
1364
+ "500": {
1365
+ "content": {
1366
+ "application/json": {
1367
+ "schema": {
1368
+ "$ref": "#/components/schemas/InternalServerErrorDetails"
1369
+ }
1370
+ }
1371
+ },
1372
+ "description": "Internal Server Error"
1373
+ },
1374
+ "404": {
1375
+ "description": "Resource not found",
1376
+ "content": {
1377
+ "application/json": {
1378
+ "schema": {
1379
+ "$ref": "#/components/schemas/ProblemDetails"
1380
+ }
1381
+ }
1382
+ }
1383
+ },
1384
+ "422": {
1385
+ "description": "Validation Error",
1386
+ "content": {
1387
+ "application/json": {
1388
+ "schema": {
1389
+ "$ref": "#/components/schemas/HTTPValidationError"
1390
+ }
1391
+ }
1392
+ }
1393
+ }
1394
+ }
1395
+ }
1396
+ },
1397
+ "/lanes/plot": {
1398
+ "post": {
1399
+ "tags": ["lanes"],
1400
+ "summary": "Plot a jump lane between two ports",
1401
+ "operationId": "plot_lane",
1402
+ "parameters": [
1403
+ {
1404
+ "name": "objective",
1405
+ "in": "query",
1406
+ "required": false,
1407
+ "schema": {
1408
+ "$ref": "#/components/schemas/PlotObjective",
1409
+ "description": "What the plotter should optimise for",
1410
+ "default": "fastest"
1411
+ },
1412
+ "description": "What the plotter should optimise for"
1413
+ },
1414
+ {
1415
+ "name": "include_dwell",
1416
+ "in": "query",
1417
+ "required": false,
1418
+ "schema": {
1419
+ "type": "boolean",
1420
+ "default": true,
1421
+ "title": "Include Dwell"
1422
+ }
1423
+ }
1424
+ ],
1425
+ "requestBody": {
1426
+ "required": true,
1427
+ "content": {
1428
+ "application/json": {
1429
+ "schema": {
1430
+ "$ref": "#/components/schemas/PlotLaneRequest"
1431
+ }
1432
+ }
1433
+ }
1434
+ },
1435
+ "responses": {
1436
+ "200": {
1437
+ "description": "Successful Response",
1438
+ "content": {
1439
+ "application/json": {
1440
+ "schema": {
1441
+ "$ref": "#/components/schemas/PlottedLane"
1442
+ }
1443
+ }
1444
+ }
1445
+ },
1446
+ "500": {
1447
+ "content": {
1448
+ "application/json": {
1449
+ "schema": {
1450
+ "$ref": "#/components/schemas/InternalServerErrorDetails"
1451
+ }
1452
+ }
1453
+ },
1454
+ "description": "Internal Server Error"
1455
+ },
1456
+ "422": {
1457
+ "description": "Validation Error",
1458
+ "content": {
1459
+ "application/json": {
1460
+ "schema": {
1461
+ "$ref": "#/components/schemas/HTTPValidationError"
1462
+ }
1463
+ }
1464
+ }
1465
+ }
1466
+ }
1467
+ }
1468
+ },
1469
+ "/lanes/{lane_id}/hazards": {
1470
+ "get": {
1471
+ "tags": ["lanes"],
1472
+ "summary": "List hazards reported on a lane",
1473
+ "operationId": "list_lane_hazards",
1474
+ "parameters": [
1475
+ {
1476
+ "name": "lane_id",
1477
+ "in": "path",
1478
+ "required": true,
1479
+ "schema": {
1480
+ "type": "string",
1481
+ "pattern": "^lane_[a-z0-9]{6,}$",
1482
+ "examples": ["lane_kuiper1"],
1483
+ "title": "Lane Id"
1484
+ }
1485
+ },
1486
+ {
1487
+ "name": "at_least",
1488
+ "in": "query",
1489
+ "required": false,
1490
+ "schema": {
1491
+ "$ref": "#/components/schemas/HazardSeverity",
1492
+ "description": "Minimum severity to report",
1493
+ "default": "nuisance"
1494
+ },
1495
+ "description": "Minimum severity to report"
1496
+ },
1497
+ {
1498
+ "name": "include_expired",
1499
+ "in": "query",
1500
+ "required": false,
1501
+ "schema": {
1502
+ "type": "boolean",
1503
+ "default": false,
1504
+ "title": "Include Expired"
1505
+ }
1506
+ },
1507
+ {
1508
+ "name": "limit",
1509
+ "in": "query",
1510
+ "required": false,
1511
+ "schema": {
1512
+ "type": "integer",
1513
+ "maximum": 100,
1514
+ "minimum": 1,
1515
+ "default": 20,
1516
+ "title": "Limit"
1517
+ }
1518
+ }
1519
+ ],
1520
+ "responses": {
1521
+ "200": {
1522
+ "description": "Successful Response",
1523
+ "content": {
1524
+ "application/json": {
1525
+ "schema": {
1526
+ "type": "array",
1527
+ "items": {
1528
+ "$ref": "#/components/schemas/LaneHazard"
1529
+ },
1530
+ "title": "Response List Lane Hazards"
1531
+ }
1532
+ }
1533
+ }
1534
+ },
1535
+ "500": {
1536
+ "content": {
1537
+ "application/json": {
1538
+ "schema": {
1539
+ "$ref": "#/components/schemas/InternalServerErrorDetails"
1540
+ }
1541
+ }
1542
+ },
1543
+ "description": "Internal Server Error"
1544
+ },
1545
+ "422": {
1546
+ "description": "Validation Error",
1547
+ "content": {
1548
+ "application/json": {
1549
+ "schema": {
1550
+ "$ref": "#/components/schemas/HTTPValidationError"
1551
+ }
1552
+ }
1553
+ }
1554
+ }
1555
+ }
1556
+ }
1557
+ },
1558
+ "/crew": {
1559
+ "get": {
1560
+ "tags": ["crew"],
1561
+ "summary": "Search the crew roster",
1562
+ "operationId": "search_crew",
1563
+ "parameters": [
1564
+ {
1565
+ "name": "q",
1566
+ "in": "query",
1567
+ "required": false,
1568
+ "schema": {
1569
+ "anyOf": [
1570
+ {
1571
+ "type": "string",
1572
+ "minLength": 2,
1573
+ "maxLength": 128
1574
+ },
1575
+ {
1576
+ "type": "null"
1577
+ }
1578
+ ],
1579
+ "description": "Free-text name search",
1580
+ "title": "Q"
1581
+ },
1582
+ "description": "Free-text name search"
1583
+ },
1584
+ {
1585
+ "name": "rank",
1586
+ "in": "query",
1587
+ "required": false,
1588
+ "schema": {
1589
+ "anyOf": [
1590
+ {
1591
+ "type": "array",
1592
+ "items": {
1593
+ "$ref": "#/components/schemas/CrewRank"
1594
+ }
1595
+ },
1596
+ {
1597
+ "type": "null"
1598
+ }
1599
+ ],
1600
+ "title": "Rank"
1601
+ }
1602
+ },
1603
+ {
1604
+ "name": "certified_in",
1605
+ "in": "query",
1606
+ "required": false,
1607
+ "schema": {
1608
+ "anyOf": [
1609
+ {
1610
+ "type": "array",
1611
+ "items": {
1612
+ "type": "string"
1613
+ },
1614
+ "maxItems": 8
1615
+ },
1616
+ {
1617
+ "type": "null"
1618
+ }
1619
+ ],
1620
+ "title": "Certified In"
1621
+ }
1622
+ },
1623
+ {
1624
+ "name": "unassigned_only",
1625
+ "in": "query",
1626
+ "required": false,
1627
+ "schema": {
1628
+ "type": "boolean",
1629
+ "default": false,
1630
+ "title": "Unassigned Only"
1631
+ }
1632
+ },
1633
+ {
1634
+ "name": "page_size",
1635
+ "in": "query",
1636
+ "required": false,
1637
+ "schema": {
1638
+ "type": "integer",
1639
+ "maximum": 100,
1640
+ "minimum": 1,
1641
+ "default": 25,
1642
+ "title": "Page Size"
1643
+ }
1644
+ },
1645
+ {
1646
+ "name": "cursor",
1647
+ "in": "query",
1648
+ "required": false,
1649
+ "schema": {
1650
+ "anyOf": [
1651
+ {
1652
+ "type": "string"
1653
+ },
1654
+ {
1655
+ "type": "null"
1656
+ }
1657
+ ],
1658
+ "title": "Cursor"
1659
+ }
1660
+ }
1661
+ ],
1662
+ "responses": {
1663
+ "200": {
1664
+ "description": "Successful Response",
1665
+ "content": {
1666
+ "application/json": {
1667
+ "schema": {
1668
+ "$ref": "#/components/schemas/CrewSearchResults"
1669
+ }
1670
+ }
1671
+ }
1672
+ },
1673
+ "500": {
1674
+ "content": {
1675
+ "application/json": {
1676
+ "schema": {
1677
+ "$ref": "#/components/schemas/InternalServerErrorDetails"
1678
+ }
1679
+ }
1680
+ },
1681
+ "description": "Internal Server Error"
1682
+ },
1683
+ "422": {
1684
+ "description": "Validation Error",
1685
+ "content": {
1686
+ "application/json": {
1687
+ "schema": {
1688
+ "$ref": "#/components/schemas/HTTPValidationError"
1689
+ }
1690
+ }
1691
+ }
1692
+ }
1693
+ }
1694
+ }
1695
+ },
1696
+ "/crew/{crew_id}/assignment": {
1697
+ "patch": {
1698
+ "tags": ["crew"],
1699
+ "summary": "Reassign or promote a crew member",
1700
+ "operationId": "amend_crew_assignment",
1701
+ "parameters": [
1702
+ {
1703
+ "name": "crew_id",
1704
+ "in": "path",
1705
+ "required": true,
1706
+ "schema": {
1707
+ "type": "string",
1708
+ "pattern": "^crw_[a-z0-9_]+$",
1709
+ "title": "Crew Id"
1710
+ }
1711
+ },
1712
+ {
1713
+ "name": "effective_from",
1714
+ "in": "query",
1715
+ "required": false,
1716
+ "schema": {
1717
+ "anyOf": [
1718
+ {
1719
+ "type": "string",
1720
+ "format": "date"
1721
+ },
1722
+ {
1723
+ "type": "null"
1724
+ }
1725
+ ],
1726
+ "title": "Effective From"
1727
+ }
1728
+ }
1729
+ ],
1730
+ "requestBody": {
1731
+ "required": true,
1732
+ "content": {
1733
+ "application/json": {
1734
+ "schema": {
1735
+ "$ref": "#/components/schemas/CrewAssignmentPatch"
1736
+ }
1737
+ }
1738
+ }
1739
+ },
1740
+ "responses": {
1741
+ "200": {
1742
+ "description": "Successful Response",
1743
+ "content": {
1744
+ "application/json": {
1745
+ "schema": {
1746
+ "$ref": "#/components/schemas/CrewMember"
1747
+ }
1748
+ }
1749
+ }
1750
+ },
1751
+ "500": {
1752
+ "content": {
1753
+ "application/json": {
1754
+ "schema": {
1755
+ "$ref": "#/components/schemas/InternalServerErrorDetails"
1756
+ }
1757
+ }
1758
+ },
1759
+ "description": "Internal Server Error"
1760
+ },
1761
+ "404": {
1762
+ "description": "Resource not found",
1763
+ "content": {
1764
+ "application/json": {
1765
+ "schema": {
1766
+ "$ref": "#/components/schemas/ProblemDetails"
1767
+ }
1768
+ }
1769
+ }
1770
+ },
1771
+ "422": {
1772
+ "description": "Validation Error",
1773
+ "content": {
1774
+ "application/json": {
1775
+ "schema": {
1776
+ "$ref": "#/components/schemas/HTTPValidationError"
1777
+ }
1778
+ }
1779
+ }
1780
+ }
1781
+ }
1782
+ }
1783
+ }
1784
+ },
1785
+ "components": {
1786
+ "schemas": {
1787
+ "Berth": {
1788
+ "properties": {
1789
+ "berth_id": {
1790
+ "type": "string",
1791
+ "title": "Berth Id"
1792
+ },
1793
+ "port_code": {
1794
+ "type": "string",
1795
+ "title": "Port Code"
1796
+ },
1797
+ "max_tonnage": {
1798
+ "type": "integer",
1799
+ "title": "Max Tonnage"
1800
+ },
1801
+ "pressurised": {
1802
+ "type": "boolean",
1803
+ "title": "Pressurised"
1804
+ },
1805
+ "available_from": {
1806
+ "type": "string",
1807
+ "format": "date",
1808
+ "title": "Available From"
1809
+ },
1810
+ "available_until": {
1811
+ "type": "string",
1812
+ "format": "date",
1813
+ "title": "Available Until"
1814
+ }
1815
+ },
1816
+ "type": "object",
1817
+ "required": [
1818
+ "berth_id",
1819
+ "port_code",
1820
+ "max_tonnage",
1821
+ "pressurised",
1822
+ "available_from",
1823
+ "available_until"
1824
+ ],
1825
+ "title": "Berth"
1826
+ },
1827
+ "BerthReservation": {
1828
+ "properties": {
1829
+ "reservation_id": {
1830
+ "type": "string",
1831
+ "title": "Reservation Id"
1832
+ },
1833
+ "port_code": {
1834
+ "type": "string",
1835
+ "title": "Port Code"
1836
+ },
1837
+ "berth_id": {
1838
+ "type": "string",
1839
+ "title": "Berth Id"
1840
+ },
1841
+ "vessel_id": {
1842
+ "type": "string",
1843
+ "title": "Vessel Id"
1844
+ },
1845
+ "arrival": {
1846
+ "type": "string",
1847
+ "format": "date",
1848
+ "title": "Arrival"
1849
+ },
1850
+ "departure": {
1851
+ "type": "string",
1852
+ "format": "date",
1853
+ "title": "Departure"
1854
+ },
1855
+ "mooring_fee_credits": {
1856
+ "type": "number",
1857
+ "title": "Mooring Fee Credits"
1858
+ }
1859
+ },
1860
+ "type": "object",
1861
+ "required": [
1862
+ "reservation_id",
1863
+ "port_code",
1864
+ "berth_id",
1865
+ "vessel_id",
1866
+ "arrival",
1867
+ "departure",
1868
+ "mooring_fee_credits"
1869
+ ],
1870
+ "title": "BerthReservation"
1871
+ },
1872
+ "BerthReservationRequest": {
1873
+ "properties": {
1874
+ "vessel_id": {
1875
+ "type": "string",
1876
+ "title": "Vessel Id"
1877
+ },
1878
+ "berth_id": {
1879
+ "type": "string",
1880
+ "title": "Berth Id"
1881
+ },
1882
+ "arrival": {
1883
+ "type": "string",
1884
+ "format": "date",
1885
+ "title": "Arrival"
1886
+ },
1887
+ "departure": {
1888
+ "type": "string",
1889
+ "format": "date",
1890
+ "title": "Departure"
1891
+ },
1892
+ "requires_pressurised": {
1893
+ "type": "boolean",
1894
+ "title": "Requires Pressurised",
1895
+ "default": false
1896
+ }
1897
+ },
1898
+ "type": "object",
1899
+ "required": ["vessel_id", "berth_id", "arrival", "departure"],
1900
+ "title": "BerthReservationRequest"
1901
+ },
1902
+ "CommissionVesselRequest": {
1903
+ "properties": {
1904
+ "call_sign": {
1905
+ "type": "string",
1906
+ "maxLength": 32,
1907
+ "minLength": 3,
1908
+ "title": "Call Sign"
1909
+ },
1910
+ "hull_class": {
1911
+ "$ref": "#/components/schemas/HullClass"
1912
+ },
1913
+ "cargo_tonnage": {
1914
+ "type": "integer",
1915
+ "maximum": 2000000.0,
1916
+ "minimum": 0.0,
1917
+ "title": "Cargo Tonnage"
1918
+ },
1919
+ "home_port": {
1920
+ "type": "string",
1921
+ "pattern": "^[A-Z]{3}-\\d{1,2}$",
1922
+ "title": "Home Port"
1923
+ },
1924
+ "registry_notes": {
1925
+ "anyOf": [
1926
+ {
1927
+ "type": "string",
1928
+ "maxLength": 512
1929
+ },
1930
+ {
1931
+ "type": "null"
1932
+ }
1933
+ ],
1934
+ "title": "Registry Notes"
1935
+ }
1936
+ },
1937
+ "type": "object",
1938
+ "required": ["call_sign", "hull_class", "cargo_tonnage", "home_port"],
1939
+ "title": "CommissionVesselRequest"
1940
+ },
1941
+ "CrewAssignmentPatch": {
1942
+ "properties": {
1943
+ "assigned_vessel_id": {
1944
+ "anyOf": [
1945
+ {
1946
+ "type": "string"
1947
+ },
1948
+ {
1949
+ "type": "null"
1950
+ }
1951
+ ],
1952
+ "title": "Assigned Vessel Id"
1953
+ },
1954
+ "rank": {
1955
+ "anyOf": [
1956
+ {
1957
+ "$ref": "#/components/schemas/CrewRank"
1958
+ },
1959
+ {
1960
+ "type": "null"
1961
+ }
1962
+ ]
1963
+ }
1964
+ },
1965
+ "type": "object",
1966
+ "title": "CrewAssignmentPatch"
1967
+ },
1968
+ "CrewMember": {
1969
+ "properties": {
1970
+ "crew_id": {
1971
+ "type": "string",
1972
+ "title": "Crew Id"
1973
+ },
1974
+ "name": {
1975
+ "type": "string",
1976
+ "title": "Name"
1977
+ },
1978
+ "rank": {
1979
+ "$ref": "#/components/schemas/CrewRank"
1980
+ },
1981
+ "certifications": {
1982
+ "items": {
1983
+ "type": "string"
1984
+ },
1985
+ "type": "array",
1986
+ "title": "Certifications"
1987
+ },
1988
+ "assigned_vessel_id": {
1989
+ "anyOf": [
1990
+ {
1991
+ "type": "string"
1992
+ },
1993
+ {
1994
+ "type": "null"
1995
+ }
1996
+ ],
1997
+ "title": "Assigned Vessel Id"
1998
+ }
1999
+ },
2000
+ "type": "object",
2001
+ "required": ["crew_id", "name", "rank", "certifications"],
2002
+ "title": "CrewMember"
2003
+ },
2004
+ "CrewRank": {
2005
+ "type": "string",
2006
+ "enum": ["deckhand", "navigator", "quartermaster", "master"],
2007
+ "title": "CrewRank"
2008
+ },
2009
+ "CrewSearchResults": {
2010
+ "properties": {
2011
+ "crew": {
2012
+ "items": {
2013
+ "$ref": "#/components/schemas/CrewMember"
2014
+ },
2015
+ "type": "array",
2016
+ "title": "Crew"
2017
+ },
2018
+ "next_cursor": {
2019
+ "anyOf": [
2020
+ {
2021
+ "type": "string"
2022
+ },
2023
+ {
2024
+ "type": "null"
2025
+ }
2026
+ ],
2027
+ "title": "Next Cursor"
2028
+ }
2029
+ },
2030
+ "type": "object",
2031
+ "required": ["crew"],
2032
+ "title": "CrewSearchResults"
2033
+ },
2034
+ "HTTPValidationError": {
2035
+ "properties": {
2036
+ "detail": {
2037
+ "items": {
2038
+ "$ref": "#/components/schemas/ValidationError"
2039
+ },
2040
+ "type": "array",
2041
+ "title": "Detail"
2042
+ }
2043
+ },
2044
+ "type": "object",
2045
+ "title": "HTTPValidationError"
2046
+ },
2047
+ "HazardClass": {
2048
+ "type": "string",
2049
+ "enum": ["inert", "cryogenic", "fissile", "bioactive", "sentient"],
2050
+ "title": "HazardClass"
2051
+ },
2052
+ "HazardSeverity": {
2053
+ "type": "string",
2054
+ "enum": ["nuisance", "notable", "severe", "lane-closing"],
2055
+ "title": "HazardSeverity"
2056
+ },
2057
+ "HullClass": {
2058
+ "type": "string",
2059
+ "enum": ["skiff", "hauler", "bulk-freighter", "ore-barge"],
2060
+ "title": "HullClass"
2061
+ },
2062
+ "InternalServerErrorDetails": {
2063
+ "properties": {
2064
+ "detail": {
2065
+ "type": "string",
2066
+ "title": "Detail"
2067
+ }
2068
+ },
2069
+ "type": "object",
2070
+ "required": ["detail"],
2071
+ "title": "InternalServerErrorDetails"
2072
+ },
2073
+ "LaneHazard": {
2074
+ "properties": {
2075
+ "hazard_id": {
2076
+ "type": "string",
2077
+ "title": "Hazard Id"
2078
+ },
2079
+ "lane_id": {
2080
+ "type": "string",
2081
+ "title": "Lane Id"
2082
+ },
2083
+ "kind": {
2084
+ "type": "string",
2085
+ "title": "Kind"
2086
+ },
2087
+ "severity": {
2088
+ "$ref": "#/components/schemas/HazardSeverity"
2089
+ },
2090
+ "reported_at": {
2091
+ "type": "string",
2092
+ "format": "date-time",
2093
+ "title": "Reported At"
2094
+ },
2095
+ "expires_at": {
2096
+ "anyOf": [
2097
+ {
2098
+ "type": "string",
2099
+ "format": "date-time"
2100
+ },
2101
+ {
2102
+ "type": "null"
2103
+ }
2104
+ ],
2105
+ "title": "Expires At"
2106
+ }
2107
+ },
2108
+ "type": "object",
2109
+ "required": ["hazard_id", "lane_id", "kind", "severity", "reported_at"],
2110
+ "title": "LaneHazard"
2111
+ },
2112
+ "LaneWaypoint": {
2113
+ "properties": {
2114
+ "port_code": {
2115
+ "type": "string",
2116
+ "pattern": "^[A-Z]{3}-\\d{1,2}$",
2117
+ "title": "Port Code"
2118
+ },
2119
+ "dwell_hours": {
2120
+ "type": "number",
2121
+ "maximum": 720.0,
2122
+ "minimum": 0.0,
2123
+ "title": "Dwell Hours",
2124
+ "default": 0
2125
+ }
2126
+ },
2127
+ "type": "object",
2128
+ "required": ["port_code"],
2129
+ "title": "LaneWaypoint"
2130
+ },
2131
+ "Manifest": {
2132
+ "properties": {
2133
+ "manifest_id": {
2134
+ "type": "string",
2135
+ "title": "Manifest Id"
2136
+ },
2137
+ "status": {
2138
+ "$ref": "#/components/schemas/ManifestStatus"
2139
+ },
2140
+ "consignor": {
2141
+ "type": "string",
2142
+ "title": "Consignor"
2143
+ },
2144
+ "consignee": {
2145
+ "type": "string",
2146
+ "title": "Consignee"
2147
+ },
2148
+ "origin_port": {
2149
+ "type": "string",
2150
+ "title": "Origin Port"
2151
+ },
2152
+ "destination_port": {
2153
+ "type": "string",
2154
+ "title": "Destination Port"
2155
+ },
2156
+ "lines": {
2157
+ "items": {
2158
+ "$ref": "#/components/schemas/ManifestLine"
2159
+ },
2160
+ "type": "array",
2161
+ "title": "Lines"
2162
+ },
2163
+ "declared_value_credits": {
2164
+ "type": "number",
2165
+ "title": "Declared Value Credits"
2166
+ },
2167
+ "total_tonnage": {
2168
+ "type": "number",
2169
+ "title": "Total Tonnage"
2170
+ },
2171
+ "lodged_at": {
2172
+ "type": "string",
2173
+ "format": "date-time",
2174
+ "title": "Lodged At"
2175
+ },
2176
+ "seal_hash": {
2177
+ "anyOf": [
2178
+ {
2179
+ "type": "string"
2180
+ },
2181
+ {
2182
+ "type": "null"
2183
+ }
2184
+ ],
2185
+ "title": "Seal Hash"
2186
+ }
2187
+ },
2188
+ "type": "object",
2189
+ "required": [
2190
+ "manifest_id",
2191
+ "status",
2192
+ "consignor",
2193
+ "consignee",
2194
+ "origin_port",
2195
+ "destination_port",
2196
+ "lines",
2197
+ "declared_value_credits",
2198
+ "total_tonnage",
2199
+ "lodged_at"
2200
+ ],
2201
+ "title": "Manifest"
2202
+ },
2203
+ "ManifestLine": {
2204
+ "properties": {
2205
+ "sku": {
2206
+ "type": "string",
2207
+ "maxLength": 64,
2208
+ "minLength": 1,
2209
+ "title": "Sku"
2210
+ },
2211
+ "description": {
2212
+ "type": "string",
2213
+ "maxLength": 256,
2214
+ "title": "Description"
2215
+ },
2216
+ "tonnage": {
2217
+ "type": "number",
2218
+ "exclusiveMinimum": 0.0,
2219
+ "title": "Tonnage"
2220
+ },
2221
+ "hazard_class": {
2222
+ "$ref": "#/components/schemas/HazardClass",
2223
+ "default": "inert"
2224
+ }
2225
+ },
2226
+ "type": "object",
2227
+ "required": ["sku", "description", "tonnage"],
2228
+ "title": "ManifestLine"
2229
+ },
2230
+ "ManifestPage": {
2231
+ "properties": {
2232
+ "manifests": {
2233
+ "items": {
2234
+ "$ref": "#/components/schemas/Manifest"
2235
+ },
2236
+ "type": "array",
2237
+ "title": "Manifests"
2238
+ },
2239
+ "next_cursor": {
2240
+ "anyOf": [
2241
+ {
2242
+ "type": "string"
2243
+ },
2244
+ {
2245
+ "type": "null"
2246
+ }
2247
+ ],
2248
+ "title": "Next Cursor"
2249
+ }
2250
+ },
2251
+ "type": "object",
2252
+ "required": ["manifests"],
2253
+ "title": "ManifestPage"
2254
+ },
2255
+ "ManifestStatus": {
2256
+ "type": "string",
2257
+ "enum": ["draft", "sealed", "in-transit", "delivered", "quarantined"],
2258
+ "title": "ManifestStatus"
2259
+ },
2260
+ "ManifestUpsert": {
2261
+ "properties": {
2262
+ "consignor": {
2263
+ "type": "string",
2264
+ "maxLength": 128,
2265
+ "minLength": 1,
2266
+ "title": "Consignor"
2267
+ },
2268
+ "consignee": {
2269
+ "type": "string",
2270
+ "maxLength": 128,
2271
+ "minLength": 1,
2272
+ "title": "Consignee"
2273
+ },
2274
+ "origin_port": {
2275
+ "type": "string",
2276
+ "pattern": "^[A-Z]{3}-\\d{1,2}$",
2277
+ "title": "Origin Port"
2278
+ },
2279
+ "destination_port": {
2280
+ "type": "string",
2281
+ "pattern": "^[A-Z]{3}-\\d{1,2}$",
2282
+ "title": "Destination Port"
2283
+ },
2284
+ "lines": {
2285
+ "items": {
2286
+ "$ref": "#/components/schemas/ManifestLine"
2287
+ },
2288
+ "type": "array",
2289
+ "maxItems": 500,
2290
+ "minItems": 1,
2291
+ "title": "Lines"
2292
+ },
2293
+ "declared_value_credits": {
2294
+ "type": "number",
2295
+ "minimum": 0.0,
2296
+ "title": "Declared Value Credits"
2297
+ }
2298
+ },
2299
+ "type": "object",
2300
+ "required": [
2301
+ "consignor",
2302
+ "consignee",
2303
+ "origin_port",
2304
+ "destination_port",
2305
+ "lines",
2306
+ "declared_value_credits"
2307
+ ],
2308
+ "title": "ManifestUpsert"
2309
+ },
2310
+ "PlotLaneRequest": {
2311
+ "properties": {
2312
+ "origin": {
2313
+ "type": "string",
2314
+ "pattern": "^[A-Z]{3}-\\d{1,2}$",
2315
+ "title": "Origin"
2316
+ },
2317
+ "destination": {
2318
+ "type": "string",
2319
+ "pattern": "^[A-Z]{3}-\\d{1,2}$",
2320
+ "title": "Destination"
2321
+ },
2322
+ "via": {
2323
+ "items": {
2324
+ "$ref": "#/components/schemas/LaneWaypoint"
2325
+ },
2326
+ "type": "array",
2327
+ "maxItems": 12,
2328
+ "title": "Via"
2329
+ },
2330
+ "max_hazard": {
2331
+ "$ref": "#/components/schemas/HazardSeverity",
2332
+ "default": "notable"
2333
+ }
2334
+ },
2335
+ "type": "object",
2336
+ "required": ["origin", "destination"],
2337
+ "title": "PlotLaneRequest"
2338
+ },
2339
+ "PlotObjective": {
2340
+ "type": "string",
2341
+ "enum": ["fastest", "cheapest", "safest"],
2342
+ "title": "PlotObjective"
2343
+ },
2344
+ "PlottedLane": {
2345
+ "properties": {
2346
+ "lane_id": {
2347
+ "type": "string",
2348
+ "title": "Lane Id"
2349
+ },
2350
+ "objective": {
2351
+ "$ref": "#/components/schemas/PlotObjective"
2352
+ },
2353
+ "legs": {
2354
+ "items": {
2355
+ "$ref": "#/components/schemas/PlottedLeg"
2356
+ },
2357
+ "type": "array",
2358
+ "title": "Legs"
2359
+ },
2360
+ "total_hours": {
2361
+ "type": "number",
2362
+ "title": "Total Hours"
2363
+ },
2364
+ "total_fuel_litres": {
2365
+ "type": "number",
2366
+ "title": "Total Fuel Litres"
2367
+ }
2368
+ },
2369
+ "type": "object",
2370
+ "required": [
2371
+ "lane_id",
2372
+ "objective",
2373
+ "legs",
2374
+ "total_hours",
2375
+ "total_fuel_litres"
2376
+ ],
2377
+ "title": "PlottedLane"
2378
+ },
2379
+ "PlottedLeg": {
2380
+ "properties": {
2381
+ "from_port": {
2382
+ "type": "string",
2383
+ "title": "From Port"
2384
+ },
2385
+ "to_port": {
2386
+ "type": "string",
2387
+ "title": "To Port"
2388
+ },
2389
+ "jump_distance_parsecs": {
2390
+ "type": "number",
2391
+ "title": "Jump Distance Parsecs"
2392
+ },
2393
+ "estimated_hours": {
2394
+ "type": "number",
2395
+ "title": "Estimated Hours"
2396
+ }
2397
+ },
2398
+ "type": "object",
2399
+ "required": [
2400
+ "from_port",
2401
+ "to_port",
2402
+ "jump_distance_parsecs",
2403
+ "estimated_hours"
2404
+ ],
2405
+ "title": "PlottedLeg"
2406
+ },
2407
+ "Port": {
2408
+ "properties": {
2409
+ "port_code": {
2410
+ "type": "string",
2411
+ "title": "Port Code"
2412
+ },
2413
+ "name": {
2414
+ "type": "string",
2415
+ "title": "Name"
2416
+ },
2417
+ "sector": {
2418
+ "type": "string",
2419
+ "title": "Sector"
2420
+ },
2421
+ "gravity_well_g": {
2422
+ "type": "number",
2423
+ "title": "Gravity Well G"
2424
+ },
2425
+ "has_drydock": {
2426
+ "type": "boolean",
2427
+ "title": "Has Drydock"
2428
+ },
2429
+ "berth_count": {
2430
+ "type": "integer",
2431
+ "title": "Berth Count"
2432
+ }
2433
+ },
2434
+ "type": "object",
2435
+ "required": [
2436
+ "port_code",
2437
+ "name",
2438
+ "sector",
2439
+ "gravity_well_g",
2440
+ "has_drydock",
2441
+ "berth_count"
2442
+ ],
2443
+ "title": "Port"
2444
+ },
2445
+ "ProblemDetails": {
2446
+ "properties": {
2447
+ "detail": {
2448
+ "type": "string",
2449
+ "title": "Detail"
2450
+ }
2451
+ },
2452
+ "type": "object",
2453
+ "required": ["detail"],
2454
+ "title": "ProblemDetails"
2455
+ },
2456
+ "Propellant": {
2457
+ "type": "string",
2458
+ "enum": ["deuterium-slush", "helium-3", "ion-paste"],
2459
+ "title": "Propellant"
2460
+ },
2461
+ "RefuelReceipt": {
2462
+ "properties": {
2463
+ "vessel_id": {
2464
+ "type": "string",
2465
+ "title": "Vessel Id"
2466
+ },
2467
+ "propellant": {
2468
+ "$ref": "#/components/schemas/Propellant"
2469
+ },
2470
+ "litres_loaded": {
2471
+ "type": "number",
2472
+ "title": "Litres Loaded"
2473
+ },
2474
+ "tank_pressure_kpa": {
2475
+ "type": "number",
2476
+ "title": "Tank Pressure Kpa"
2477
+ },
2478
+ "credits_charged": {
2479
+ "type": "number",
2480
+ "title": "Credits Charged"
2481
+ }
2482
+ },
2483
+ "type": "object",
2484
+ "required": [
2485
+ "vessel_id",
2486
+ "propellant",
2487
+ "litres_loaded",
2488
+ "tank_pressure_kpa",
2489
+ "credits_charged"
2490
+ ],
2491
+ "title": "RefuelReceipt"
2492
+ },
2493
+ "RefuelRequest": {
2494
+ "properties": {
2495
+ "propellant": {
2496
+ "$ref": "#/components/schemas/Propellant"
2497
+ },
2498
+ "litres": {
2499
+ "type": "number",
2500
+ "maximum": 4000000.0,
2501
+ "exclusiveMinimum": 0.0,
2502
+ "title": "Litres"
2503
+ },
2504
+ "top_up_only": {
2505
+ "type": "boolean",
2506
+ "title": "Top Up Only",
2507
+ "default": false
2508
+ }
2509
+ },
2510
+ "type": "object",
2511
+ "required": ["propellant", "litres"],
2512
+ "title": "RefuelRequest"
2513
+ },
2514
+ "SealManifestRequest": {
2515
+ "properties": {
2516
+ "sealed_by": {
2517
+ "type": "string",
2518
+ "maxLength": 128,
2519
+ "minLength": 1,
2520
+ "title": "Sealed By"
2521
+ },
2522
+ "customs_declaration": {
2523
+ "type": "string",
2524
+ "maxLength": 1024,
2525
+ "title": "Customs Declaration"
2526
+ }
2527
+ },
2528
+ "type": "object",
2529
+ "required": ["sealed_by", "customs_declaration"],
2530
+ "title": "SealManifestRequest"
2531
+ },
2532
+ "TelemetryFrame": {
2533
+ "properties": {
2534
+ "vessel_id": {
2535
+ "type": "string",
2536
+ "title": "Vessel Id"
2537
+ },
2538
+ "sequence": {
2539
+ "type": "integer",
2540
+ "title": "Sequence"
2541
+ },
2542
+ "captured_at": {
2543
+ "type": "string",
2544
+ "format": "date-time",
2545
+ "title": "Captured At"
2546
+ },
2547
+ "hull_temp_kelvin": {
2548
+ "type": "number",
2549
+ "title": "Hull Temp Kelvin"
2550
+ },
2551
+ "reactor_output_mw": {
2552
+ "type": "number",
2553
+ "title": "Reactor Output Mw"
2554
+ },
2555
+ "drift_metres_per_second": {
2556
+ "type": "number",
2557
+ "title": "Drift Metres Per Second"
2558
+ }
2559
+ },
2560
+ "type": "object",
2561
+ "required": [
2562
+ "vessel_id",
2563
+ "sequence",
2564
+ "captured_at",
2565
+ "hull_temp_kelvin",
2566
+ "reactor_output_mw",
2567
+ "drift_metres_per_second"
2568
+ ],
2569
+ "title": "TelemetryFrame"
2570
+ },
2571
+ "ValidationError": {
2572
+ "properties": {
2573
+ "loc": {
2574
+ "items": {
2575
+ "anyOf": [
2576
+ {
2577
+ "type": "string"
2578
+ },
2579
+ {
2580
+ "type": "integer"
2581
+ }
2582
+ ]
2583
+ },
2584
+ "type": "array",
2585
+ "title": "Location"
2586
+ },
2587
+ "msg": {
2588
+ "type": "string",
2589
+ "title": "Message"
2590
+ },
2591
+ "type": {
2592
+ "type": "string",
2593
+ "title": "Error Type"
2594
+ },
2595
+ "input": {
2596
+ "title": "Input"
2597
+ },
2598
+ "ctx": {
2599
+ "type": "object",
2600
+ "title": "Context"
2601
+ }
2602
+ },
2603
+ "type": "object",
2604
+ "required": ["loc", "msg", "type"],
2605
+ "title": "ValidationError"
2606
+ },
2607
+ "Vessel": {
2608
+ "properties": {
2609
+ "vessel_id": {
2610
+ "type": "string",
2611
+ "title": "Vessel Id"
2612
+ },
2613
+ "call_sign": {
2614
+ "type": "string",
2615
+ "maxLength": 32,
2616
+ "minLength": 3,
2617
+ "title": "Call Sign"
2618
+ },
2619
+ "hull_class": {
2620
+ "$ref": "#/components/schemas/HullClass"
2621
+ },
2622
+ "cargo_tonnage": {
2623
+ "type": "integer",
2624
+ "maximum": 2000000.0,
2625
+ "minimum": 0.0,
2626
+ "title": "Cargo Tonnage"
2627
+ },
2628
+ "status": {
2629
+ "$ref": "#/components/schemas/VesselStatus"
2630
+ },
2631
+ "home_port": {
2632
+ "type": "string",
2633
+ "title": "Home Port"
2634
+ },
2635
+ "last_seen_at": {
2636
+ "type": "string",
2637
+ "format": "date-time",
2638
+ "title": "Last Seen At"
2639
+ }
2640
+ },
2641
+ "type": "object",
2642
+ "required": [
2643
+ "vessel_id",
2644
+ "call_sign",
2645
+ "hull_class",
2646
+ "cargo_tonnage",
2647
+ "status",
2648
+ "home_port",
2649
+ "last_seen_at"
2650
+ ],
2651
+ "title": "Vessel"
2652
+ },
2653
+ "VesselPage": {
2654
+ "properties": {
2655
+ "vessels": {
2656
+ "items": {
2657
+ "$ref": "#/components/schemas/Vessel"
2658
+ },
2659
+ "type": "array",
2660
+ "title": "Vessels"
2661
+ },
2662
+ "next_cursor": {
2663
+ "anyOf": [
2664
+ {
2665
+ "type": "string"
2666
+ },
2667
+ {
2668
+ "type": "null"
2669
+ }
2670
+ ],
2671
+ "title": "Next Cursor"
2672
+ },
2673
+ "total_matched": {
2674
+ "type": "integer",
2675
+ "title": "Total Matched"
2676
+ }
2677
+ },
2678
+ "type": "object",
2679
+ "required": ["vessels", "total_matched"],
2680
+ "title": "VesselPage"
2681
+ },
2682
+ "VesselSortKey": {
2683
+ "type": "string",
2684
+ "enum": ["call-sign", "tonnage", "last-seen"],
2685
+ "title": "VesselSortKey"
2686
+ },
2687
+ "VesselStatus": {
2688
+ "type": "string",
2689
+ "enum": [
2690
+ "in-drydock",
2691
+ "berthed",
2692
+ "under-way",
2693
+ "impounded",
2694
+ "lost-with-all-hands"
2695
+ ],
2696
+ "title": "VesselStatus"
2697
+ },
2698
+ "VesselStatusPatch": {
2699
+ "properties": {
2700
+ "status": {
2701
+ "$ref": "#/components/schemas/VesselStatus"
2702
+ },
2703
+ "reason": {
2704
+ "type": "string",
2705
+ "maxLength": 256,
2706
+ "minLength": 3,
2707
+ "title": "Reason"
2708
+ }
2709
+ },
2710
+ "type": "object",
2711
+ "required": ["status", "reason"],
2712
+ "title": "VesselStatusPatch"
2713
+ }
2714
+ }
2715
+ }
2716
+ }