@vessel-dsp/core 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -15,14 +15,19 @@ import type {
15
15
  ControlOutput,
16
16
  DocumentSource,
17
17
  PanelElementBinding,
18
+ PanelElementPhysicalPlacement,
18
19
  PanelElementPlacement,
19
20
  PanelFace,
21
+ PanelFaceGeometry,
20
22
  PanelGridLayout,
21
23
  PanelGridPosition,
22
24
  PanelPlacementMetadata,
23
25
  Point,
24
26
  PropertyValue,
25
27
  Terminal,
28
+ VdspBuildDataObject,
29
+ VdspBuildDataScalar,
30
+ VdspBuildDataValue,
26
31
  Warning,
27
32
  Wire,
28
33
  } from '../../model/types';
@@ -44,8 +49,9 @@ export function serializeInterchangeYaml(
44
49
  options: SerializeInterchangeYamlOptions = {},
45
50
  ): string {
46
51
  const connectivity = resolveConnectivity(doc);
52
+ const schema = hasV3OnlyFields(doc) ? 'circuit-interchange/v3' : 'circuit-interchange/v2';
47
53
  const root: MutableYamlObject = {
48
- schema: 'circuit-interchange/v2',
54
+ schema,
49
55
  metadata: {
50
56
  name: doc.metadata.name,
51
57
  description: doc.metadata.description,
@@ -62,6 +68,21 @@ export function serializeInterchangeYaml(
62
68
  if (doc.controlContexts !== undefined) {
63
69
  root.controlContexts = doc.controlContexts.map(controlContextBlock);
64
70
  }
71
+ if (doc.mechanical !== undefined) {
72
+ root.mechanical = buildDataObjectBlock(doc.mechanical);
73
+ }
74
+ if (doc.build !== undefined) {
75
+ root.build = buildDataObjectBlock(doc.build);
76
+ }
77
+ if (doc.bom !== undefined) {
78
+ root.bom = buildDataObjectBlock(doc.bom);
79
+ }
80
+ if (doc.partProfiles !== undefined) {
81
+ root.partProfiles = buildDataObjectBlock(doc.partProfiles);
82
+ }
83
+ if (doc.footprints !== undefined) {
84
+ root.footprints = buildDataObjectBlock(doc.footprints);
85
+ }
65
86
  if (doc.deviceInterface !== undefined) {
66
87
  root.deviceInterface = deviceInterfaceBlock(doc.deviceInterface);
67
88
  }
@@ -74,6 +95,9 @@ export function serializeInterchangeYaml(
74
95
  if (doc.controlOutputs !== undefined) {
75
96
  root.controlOutputs = doc.controlOutputs.map(controlOutputBlock);
76
97
  }
98
+ if (doc.offBoardWiring !== undefined) {
99
+ root.offBoardWiring = buildDataObjectBlock(doc.offBoardWiring);
100
+ }
77
101
  Object.assign(root, {
78
102
  components: doc.components.map((component) => componentBlock(component, connectivity)),
79
103
  nodes: nodeBlocks(connectivity),
@@ -82,10 +106,36 @@ export function serializeInterchangeYaml(
82
106
  diagnostics: doc.warnings.map(warningBlock),
83
107
  rawAttributes: doc.rawAttributes,
84
108
  });
109
+ if (doc.boards !== undefined) {
110
+ root.boards = doc.boards.map(buildDataObjectBlock);
111
+ }
85
112
 
86
113
  return `${emitYaml(root, 0)}\n`;
87
114
  }
88
115
 
116
+ function hasV3OnlyFields(doc: CircuitDocument): boolean {
117
+ return doc.mechanical !== undefined
118
+ || doc.build !== undefined
119
+ || doc.bom !== undefined
120
+ || doc.partProfiles !== undefined
121
+ || doc.footprints !== undefined
122
+ || doc.offBoardWiring !== undefined
123
+ || doc.boards !== undefined
124
+ || hasV3PanelFields(doc.panel);
125
+ }
126
+
127
+ function hasV3PanelFields(panel: PanelPlacementMetadata | undefined): boolean {
128
+ return panel?.faces.some((face) =>
129
+ face.geometry !== undefined
130
+ || face.elements.some((element) =>
131
+ element.id !== undefined
132
+ || element.physical !== undefined
133
+ || element.kind === 'selector'
134
+ || element.kind === 'footswitch'
135
+ )
136
+ ) ?? false;
137
+ }
138
+
89
139
  function deviceBlock(device: CircuitDocumentDevice): MutableYamlObject {
90
140
  const out: MutableYamlObject = {
91
141
  kind: device.kind,
@@ -313,6 +363,9 @@ function panelFaceBlock(face: PanelFace): MutableYamlObject {
313
363
  out.label = face.label;
314
364
  }
315
365
  out.layout = panelLayoutBlock(face.layout);
366
+ if (face.geometry !== undefined) {
367
+ out.geometry = panelFaceGeometryBlock(face.geometry);
368
+ }
316
369
  out.elements = face.elements.map(panelElementBlock);
317
370
  return out;
318
371
  }
@@ -339,15 +392,29 @@ function panelElementBlock(element: PanelElementPlacement): MutableYamlObject {
339
392
  kind: element.kind,
340
393
  grid: panelGridPositionBlock(element.grid),
341
394
  };
395
+ if (element.id !== undefined) {
396
+ out.id = element.id;
397
+ }
342
398
  if (element.label !== undefined) {
343
399
  out.label = element.label;
344
400
  }
345
401
  if (element.interfaceControlId !== undefined) {
346
402
  out.interfaceControlId = element.interfaceControlId;
347
403
  }
404
+ if (element.physical !== undefined) {
405
+ out.physical = panelElementPhysicalBlock(element.physical);
406
+ }
348
407
  return out;
349
408
  }
350
409
 
410
+ function panelFaceGeometryBlock(geometry: PanelFaceGeometry): MutableYamlObject {
411
+ return buildDataObjectBlock(geometry);
412
+ }
413
+
414
+ function panelElementPhysicalBlock(physical: PanelElementPhysicalPlacement): MutableYamlObject {
415
+ return buildDataObjectBlock(physical);
416
+ }
417
+
351
418
  function panelElementBindingBlock(binding: PanelElementBinding): MutableYamlObject {
352
419
  const out: MutableYamlObject = {
353
420
  componentId: binding.componentId,
@@ -476,6 +543,26 @@ function pointBlock(point: Point): MutableYamlObject {
476
543
  };
477
544
  }
478
545
 
546
+ function buildDataObjectBlock(value: VdspBuildDataObject): MutableYamlObject {
547
+ const out: MutableYamlObject = {};
548
+ for (const [key, child] of Object.entries(value)) {
549
+ if (child !== undefined) {
550
+ out[key] = buildDataValueBlock(child);
551
+ }
552
+ }
553
+ return out;
554
+ }
555
+
556
+ function buildDataValueBlock(value: VdspBuildDataValue): YamlValue {
557
+ if (isBuildDataScalar(value)) {
558
+ return value;
559
+ }
560
+ if (isBuildDataArray(value)) {
561
+ return value.map(buildDataValueBlock);
562
+ }
563
+ return buildDataObjectBlock(value);
564
+ }
565
+
479
566
  function emitYaml(value: YamlValue, indent: number): string {
480
567
  if (isScalar(value)) {
481
568
  return `${spaces(indent)}${formatScalar(value)}`;
@@ -556,6 +643,14 @@ function isYamlArray(value: YamlValue): value is readonly YamlValue[] {
556
643
  return Array.isArray(value);
557
644
  }
558
645
 
646
+ function isBuildDataScalar(value: VdspBuildDataValue): value is VdspBuildDataScalar {
647
+ return value === null || typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';
648
+ }
649
+
650
+ function isBuildDataArray(value: VdspBuildDataValue): value is readonly VdspBuildDataValue[] {
651
+ return Array.isArray(value);
652
+ }
653
+
559
654
  function formatKey(key: string): string {
560
655
  return isPlainScalar(key) ? key : JSON.stringify(key);
561
656
  }
package/src/index.ts CHANGED
@@ -1,11 +1,40 @@
1
- export const VERSION = '0.5.0';
1
+ export const VERSION = '0.6.0';
2
2
 
3
3
  export type {
4
+ BoardApplicability,
5
+ BoardEdgeTerminal,
6
+ BoardFamily,
7
+ BoardFootprint,
8
+ BoardFootprintCatalog,
9
+ BoardFootprintPlacement,
10
+ BoardHole,
11
+ BoardKind,
12
+ BoardNet,
13
+ BoardNetlist,
14
+ BoardNetMember,
15
+ BoardNetRef,
16
+ BoardPlacedPad,
17
+ BoardRealization,
18
+ BoardReview,
19
+ BoardRoute,
20
+ BoardSourceCircuitHash,
21
+ BoardSubtype,
22
+ BuildBom,
23
+ BuildBomItem,
24
+ BuildBomRef,
25
+ BuildBomRefKind,
26
+ BuildCompleteness,
27
+ BuildIntent,
28
+ BuildPartProfile,
29
+ BuildPartProfileCatalog,
30
+ BuildScope,
31
+ CanonicalCircuitNetRef,
4
32
  CircuitDocument,
5
33
  CircuitDocumentDevice,
6
34
  CircuitDocumentDeviceKind,
7
35
  Component,
8
36
  ComponentKind,
37
+ ComponentTerminalRef,
9
38
  ControlApplicabilityPredicate,
10
39
  ControlContext,
11
40
  ControlGroup,
@@ -23,12 +52,25 @@ export type {
23
52
  DeviceInterfaceControlKind,
24
53
  DocumentMetadata,
25
54
  DocumentSource,
55
+ MechanicalBuildMetadata,
56
+ MillimeterRect,
57
+ OffBoardSignalRef,
58
+ OffBoardWireAttributes,
59
+ OffBoardWiringConnection,
60
+ OffBoardWiringCoverage,
61
+ OffBoardWiringEndpoint,
62
+ OffBoardWiringEndpointKind,
63
+ OffBoardWiringHarness,
64
+ OffBoardWiringHarnessStatus,
65
+ OffBoardWiringPlan,
26
66
  PanelColumnOrder,
27
67
  PanelControlKind,
28
68
  PanelControlPlacement,
29
69
  PanelElementBinding,
70
+ PanelElementPhysicalPlacement,
30
71
  PanelElementPlacement,
31
72
  PanelFace,
73
+ PanelFaceGeometry,
32
74
  PanelGridIndexing,
33
75
  PanelGridLayout,
34
76
  PanelGridPosition,
@@ -40,6 +82,9 @@ export type {
40
82
  PropertyValue,
41
83
  Rotation,
42
84
  Terminal,
85
+ VdspBuildDataObject,
86
+ VdspBuildDataScalar,
87
+ VdspBuildDataValue,
43
88
  Warning,
44
89
  Wire,
45
90
  } from './model/types';
@@ -87,6 +132,10 @@ export type {
87
132
  SerializeCircuitDocumentFileOptions,
88
133
  SerializeVdspCircuitDocumentOptions,
89
134
  ConvertCircuitDocumentFileOptions,
135
+ ConvertCircuitDocumentFileWithReportOptions,
136
+ CircuitDocumentConversionDiagnostic,
137
+ CircuitDocumentConversionLossPolicy,
138
+ CircuitDocumentFileConversionReport,
90
139
  VdspSchemaValidationIssue,
91
140
  VdspSchemaValidationResult,
92
141
  } from './formats/document';
@@ -102,6 +151,7 @@ export {
102
151
  parseCircuitDocumentFile,
103
152
  serializeCircuitDocumentFile,
104
153
  convertCircuitDocumentFile,
154
+ convertCircuitDocumentFileWithReport,
105
155
  serializeVdspCircuitDocument,
106
156
  } from './formats/document';
107
157
  export { parseLtspiceAsc } from './formats/ltspice/parser';
@@ -236,7 +236,7 @@ export type PanelGridLayout = Readonly<{
236
236
  columnOrder?: PanelColumnOrder;
237
237
  }>;
238
238
 
239
- export type PanelControlKind = 'knob' | 'slider' | 'switch' | 'led' | 'jack';
239
+ export type PanelControlKind = 'knob' | 'slider' | 'switch' | 'selector' | 'footswitch' | 'led' | 'jack';
240
240
 
241
241
  export type PanelGridPosition = Readonly<{
242
242
  row: number;
@@ -253,11 +253,13 @@ export type PanelElementBinding = Readonly<{
253
253
  }>;
254
254
 
255
255
  export type PanelElementPlacement = Readonly<{
256
+ id?: string;
256
257
  bind: PanelElementBinding;
257
258
  kind: PanelControlKind;
258
259
  grid: PanelGridPosition;
259
260
  label?: string;
260
261
  interfaceControlId?: string;
262
+ physical?: PanelElementPhysicalPlacement;
261
263
  }>;
262
264
 
263
265
  /** @deprecated Use PanelElementPlacement. */
@@ -267,6 +269,7 @@ export type PanelFace = Readonly<{
267
269
  id: string;
268
270
  label?: string;
269
271
  layout: PanelGridLayout;
272
+ geometry?: PanelFaceGeometry;
270
273
  elements: readonly PanelElementPlacement[];
271
274
  }>;
272
275
 
@@ -274,6 +277,297 @@ export type PanelPlacementMetadata = Readonly<{
274
277
  faces: readonly PanelFace[];
275
278
  }>;
276
279
 
280
+ export type VdspBuildDataScalar = string | number | boolean | null;
281
+
282
+ export type VdspBuildDataValue = VdspBuildDataScalar | readonly VdspBuildDataValue[] | VdspBuildDataObject;
283
+
284
+ export type VdspBuildDataObject = Readonly<{
285
+ readonly [key: string]: VdspBuildDataValue | undefined;
286
+ }>;
287
+
288
+ export type MillimeterRect = Readonly<{
289
+ x: number;
290
+ y: number;
291
+ width: number;
292
+ height: number;
293
+ }>;
294
+
295
+ export type PanelFaceGeometry = VdspBuildDataObject & Readonly<{
296
+ units?: string;
297
+ surface?: string;
298
+ usableRectMm?: MillimeterRect;
299
+ }>;
300
+
301
+ export type PanelElementPhysicalPlacement = VdspBuildDataObject & Readonly<{
302
+ units?: string;
303
+ centerMm?: Point;
304
+ drillDiameterMm?: number;
305
+ partProfileId?: string;
306
+ locked?: boolean;
307
+ }>;
308
+
309
+ export type BuildIntent = 'diy-build-artifact' | 'schema-review-sample';
310
+
311
+ export type BuildCompleteness = 'complete-selected-build' | 'partial-offboard-wiring';
312
+
313
+ export type BuildScope = VdspBuildDataObject & Readonly<{
314
+ schema: 'build-scope/v1';
315
+ intent?: BuildIntent;
316
+ completeness?: BuildCompleteness;
317
+ selectedBoardId?: string;
318
+ selectedOffBoardWiringHarnessIds?: readonly string[];
319
+ alternateBoardIds?: readonly string[];
320
+ bomScope?: string;
321
+ }>;
322
+
323
+ export type MechanicalBuildMetadata = VdspBuildDataObject & Readonly<{
324
+ schema?: string;
325
+ units?: string;
326
+ coordinateSystem?: VdspBuildDataObject;
327
+ enclosure?: VdspBuildDataObject & Readonly<{
328
+ profileId?: string;
329
+ label?: string;
330
+ outerSizeMm?: VdspBuildDataObject;
331
+ wallThicknessMm?: number;
332
+ }>;
333
+ internalBoard?: VdspBuildDataObject & Readonly<{
334
+ preferredBoardId?: string;
335
+ usableRectMm?: MillimeterRect;
336
+ keepoutRectsMm?: readonly VdspBuildDataObject[];
337
+ }>;
338
+ }>;
339
+
340
+ export type BuildBomRefKind =
341
+ | 'component'
342
+ | 'device-interface-control'
343
+ | 'panel-element'
344
+ | 'board'
345
+ | 'freeform-build-item';
346
+
347
+ export type BuildBomRef = VdspBuildDataObject & Readonly<{
348
+ kind: BuildBomRefKind;
349
+ componentId?: string;
350
+ controlId?: string;
351
+ panelElementId?: string;
352
+ boardId?: string;
353
+ label?: string;
354
+ }>;
355
+
356
+ export type BuildBomItem = VdspBuildDataObject & Readonly<{
357
+ id: string;
358
+ refs: readonly BuildBomRef[];
359
+ quantity: number;
360
+ value?: string;
361
+ partProfileId?: string;
362
+ category?: string;
363
+ sku?: string;
364
+ }>;
365
+
366
+ export type BuildBom = VdspBuildDataObject & Readonly<{
367
+ schema: 'build-bom/v1';
368
+ items: readonly BuildBomItem[];
369
+ }>;
370
+
371
+ export type BuildPartProfile = VdspBuildDataObject & Readonly<{
372
+ id: string;
373
+ kind?: string;
374
+ }>;
375
+
376
+ export type BuildPartProfileCatalog = VdspBuildDataObject & Readonly<{
377
+ schema: 'part-profile-catalog/v1';
378
+ resolution?: string;
379
+ units?: string;
380
+ profiles: readonly BuildPartProfile[];
381
+ }>;
382
+
383
+ export type BoardFootprint = VdspBuildDataObject & Readonly<{
384
+ id: string;
385
+ boardApplicability?: BoardApplicability;
386
+ }>;
387
+
388
+ export type BoardFootprintCatalog = VdspBuildDataObject & Readonly<{
389
+ schema: 'board-footprint-catalog/v1';
390
+ resolution?: string;
391
+ units?: string;
392
+ footprints: readonly BoardFootprint[];
393
+ }>;
394
+
395
+ export type OffBoardWiringCoverage = 'selected-build-complete' | 'representative-selected-build-endpoints';
396
+
397
+ export type OffBoardWiringHarnessStatus = 'complete' | 'partial' | 'candidate';
398
+
399
+ export type OffBoardWiringEndpointKind =
400
+ | 'panel-component-terminal'
401
+ | 'board-terminal'
402
+ | 'power-terminal'
403
+ | 'footswitch-terminal'
404
+ | 'free-wire-label';
405
+
406
+ export type OffBoardWiringEndpoint = VdspBuildDataObject & Readonly<{
407
+ id: string;
408
+ kind: OffBoardWiringEndpointKind;
409
+ componentId?: string;
410
+ terminalName?: string;
411
+ panelElementId?: string;
412
+ boardId?: string;
413
+ terminalId?: string;
414
+ label?: string;
415
+ }>;
416
+
417
+ export type BoardNetRef = VdspBuildDataObject & Readonly<{
418
+ source: 'board-netlist';
419
+ boardId?: string;
420
+ netId: string;
421
+ }>;
422
+
423
+ export type CanonicalCircuitNetRef = VdspBuildDataObject & Readonly<{
424
+ source: 'canonical-circuit';
425
+ member?: ComponentTerminalRef;
426
+ }>;
427
+
428
+ export type OffBoardSignalRef = BoardNetRef | CanonicalCircuitNetRef | VdspBuildDataObject;
429
+
430
+ export type OffBoardWireAttributes = VdspBuildDataObject & Readonly<{
431
+ color?: string;
432
+ gaugeAwg?: number;
433
+ reviewedLengthMm?: number;
434
+ groupId?: string;
435
+ }>;
436
+
437
+ export type OffBoardWiringConnection = VdspBuildDataObject & Readonly<{
438
+ id: string;
439
+ fromEndpointId: string;
440
+ toEndpointId: string;
441
+ signalRef?: OffBoardSignalRef;
442
+ wire?: OffBoardWireAttributes;
443
+ }>;
444
+
445
+ export type OffBoardWiringHarness = VdspBuildDataObject & Readonly<{
446
+ id: string;
447
+ status?: OffBoardWiringHarnessStatus;
448
+ notes?: string;
449
+ endpoints: readonly OffBoardWiringEndpoint[];
450
+ connections: readonly OffBoardWiringConnection[];
451
+ }>;
452
+
453
+ export type OffBoardWiringPlan = VdspBuildDataObject & Readonly<{
454
+ schema: 'offboard-wiring/v1';
455
+ source?: string;
456
+ coverage?: OffBoardWiringCoverage;
457
+ harnesses: readonly OffBoardWiringHarness[];
458
+ }>;
459
+
460
+ export type BoardFamily = 'prototype-board' | 'fabricated-board';
461
+
462
+ export type BoardKind = 'stripboard' | 'perfboard' | 'breadboard-pattern' | 'pcb';
463
+
464
+ export type BoardSubtype =
465
+ | 'veroboard'
466
+ | 'isolated-pad'
467
+ | 'solderable-half-breadboard'
468
+ | 'single-sided-through-hole'
469
+ | 'two-layer-through-hole';
470
+
471
+ export type BoardApplicability = VdspBuildDataObject & Readonly<{
472
+ family: BoardFamily;
473
+ kind: BoardKind;
474
+ subtype?: BoardSubtype;
475
+ }>;
476
+
477
+ export type ComponentTerminalRef = VdspBuildDataObject & Readonly<{
478
+ componentId: string;
479
+ terminalName: string;
480
+ }>;
481
+
482
+ export type BoardSourceCircuitHash = VdspBuildDataObject & Readonly<{
483
+ schema: 'canonical-circuit-facts-hash/v1';
484
+ hashAlgorithm: 'sha256';
485
+ hash: string;
486
+ }>;
487
+
488
+ export type BoardHole = VdspBuildDataObject & Readonly<{
489
+ row: number;
490
+ column: number;
491
+ }>;
492
+
493
+ export type BoardEdgeTerminal = VdspBuildDataObject & Readonly<{
494
+ id: string;
495
+ role?: string;
496
+ terminalRef?: ComponentTerminalRef;
497
+ hole?: BoardHole;
498
+ }>;
499
+
500
+ export type BoardPlacedPad = VdspBuildDataObject & Readonly<{
501
+ padId: string;
502
+ terminalName?: string;
503
+ hole?: BoardHole;
504
+ positionMm?: Point;
505
+ }>;
506
+
507
+ export type BoardFootprintPlacement = VdspBuildDataObject & Readonly<{
508
+ componentId: string;
509
+ footprintId: string;
510
+ atGrid?: BoardHole;
511
+ atMm?: Point;
512
+ rotationDeg?: number;
513
+ pads: readonly BoardPlacedPad[];
514
+ }>;
515
+
516
+ export type BoardNetMember = VdspBuildDataObject & Readonly<{
517
+ componentId: string;
518
+ terminalName: string;
519
+ padId?: string;
520
+ terminalId?: string;
521
+ }>;
522
+
523
+ export type BoardNet = VdspBuildDataObject & Readonly<{
524
+ id: string;
525
+ name?: string;
526
+ members: readonly BoardNetMember[];
527
+ }>;
528
+
529
+ export type BoardNetlist = VdspBuildDataObject & Readonly<{
530
+ source?: string;
531
+ nets: readonly BoardNet[];
532
+ }>;
533
+
534
+ export type BoardRoute = VdspBuildDataObject & Readonly<{
535
+ id: string;
536
+ netRef?: BoardNetRef | CanonicalCircuitNetRef | VdspBuildDataObject;
537
+ locked?: boolean;
538
+ conductors?: readonly VdspBuildDataObject[];
539
+ copper?: readonly VdspBuildDataObject[];
540
+ vias?: readonly VdspBuildDataObject[];
541
+ zones?: readonly VdspBuildDataObject[];
542
+ drills?: readonly VdspBuildDataObject[];
543
+ }>;
544
+
545
+ export type BoardReview = VdspBuildDataObject & Readonly<{
546
+ status?: 'buildable' | 'candidate' | 'stale' | string;
547
+ reviewedBy?: string;
548
+ reviewedAt?: string;
549
+ notes?: string;
550
+ }>;
551
+
552
+ export type BoardRealization = VdspBuildDataObject & Readonly<{
553
+ id: string;
554
+ schema: 'circuit-board/v1';
555
+ family: BoardFamily;
556
+ kind: BoardKind;
557
+ subtype?: BoardSubtype;
558
+ source?: string;
559
+ units?: string;
560
+ locked?: boolean;
561
+ sourceCircuit?: BoardSourceCircuitHash;
562
+ edgeTerminals: readonly BoardEdgeTerminal[];
563
+ footprintPlacements: readonly BoardFootprintPlacement[];
564
+ netlist?: BoardNetlist;
565
+ routes: readonly BoardRoute[];
566
+ zones?: readonly VdspBuildDataObject[];
567
+ drills?: readonly VdspBuildDataObject[];
568
+ review?: BoardReview;
569
+ }>;
570
+
277
571
  export type Warning = Readonly<{
278
572
  code: string;
279
573
  message: string;
@@ -287,6 +581,13 @@ export type CircuitDocument = Readonly<{
287
581
  device?: CircuitDocumentDevice;
288
582
  controlGroups?: readonly ControlGroup[];
289
583
  controlContexts?: readonly ControlContext[];
584
+ mechanical?: MechanicalBuildMetadata;
585
+ build?: BuildScope;
586
+ bom?: BuildBom;
587
+ partProfiles?: BuildPartProfileCatalog;
588
+ footprints?: BoardFootprintCatalog;
589
+ offBoardWiring?: OffBoardWiringPlan;
590
+ boards?: readonly BoardRealization[];
290
591
  deviceInterface?: DeviceInterface;
291
592
  panel?: PanelPlacementMetadata;
292
593
  controlInterfaces?: readonly ControlInterface[];