geospec 0.1.0-beta.9 → 0.4.1-next.331

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 (105) hide show
  1. package/README.md +34 -9
  2. package/agent/doctrine.md +2 -1
  3. package/agent/geospec-authoring/SKILL.md +3 -3
  4. package/agent/geospec-authoring/api-index.md +20 -92
  5. package/agent/geospec-authoring/api-types.md +85 -480
  6. package/agent/geospec-authoring/public-api-functions.md +21 -1
  7. package/agent/geospec-authoring/public-api-index.md +215 -319
  8. package/agent/geospec-authoring/public-api-types-2.md +480 -352
  9. package/agent/geospec-authoring/public-api-types-3.md +79 -215
  10. package/agent/geospec-authoring/public-api-types.md +334 -849
  11. package/agent/resources.js +12 -13
  12. package/agent/skills.json +2 -3
  13. package/dist/assertion-client/client.d.mts +14 -15
  14. package/dist/assertion-client/client.mjs +1 -1
  15. package/dist/cli/check.mjs +2 -0
  16. package/dist/cli/cli.d.mts +5 -5
  17. package/dist/cli/cli.mjs +20 -3
  18. package/dist/cli/node-host.d.mts +5 -4
  19. package/dist/cli/node-host.mjs +1 -1
  20. package/dist/cli/wire-value.mjs +1 -1
  21. package/dist/config/define-config.d.mts +2 -3
  22. package/dist/config/node/index.mjs +1 -1
  23. package/dist/config/node/load.d.mts +2 -3
  24. package/dist/config/node/load.mjs +1 -1
  25. package/dist/config/read-geospec-config.d.mts +10 -6
  26. package/dist/config/read-geospec-config.mjs +1 -1
  27. package/dist/config/types.d.mts +6 -7
  28. package/dist/create-geospec.d.mts +7 -6
  29. package/dist/engine/client.d.mts +15 -15
  30. package/dist/engine/client.mjs +1 -1
  31. package/dist/engine/matchers.d.mts +10 -11
  32. package/dist/engine/pmi.types.d.mts +11 -12
  33. package/dist/engine/protocol.d.mts +7 -8
  34. package/dist/engine/protocol.mjs +1 -1
  35. package/dist/geometry-unit.d.mts +2 -3
  36. package/dist/index.d.mts +2 -2
  37. package/dist/index.mjs +1 -1
  38. package/dist/mesh/index.d.mts +2 -2
  39. package/dist/mesh/types.d.mts +8 -505
  40. package/dist/model/errors.d.mts +2 -3
  41. package/dist/model/load-model.d.mts +3 -4
  42. package/dist/model/mesh-evidence-matchers.d.mts +2 -3
  43. package/dist/model/native-model-loader.d.mts +14 -17
  44. package/dist/model/native-model-loader.mjs +1 -1
  45. package/dist/model/node/command-exporter.d.mts +3 -4
  46. package/dist/model/node/command-exporter.mjs +1 -1
  47. package/dist/model/node/index.mjs +1 -1
  48. package/dist/model/region-scope.d.mts +3 -6
  49. package/dist/model/region-scope.mjs +1 -1
  50. package/dist/model/subject.d.mts +2 -5
  51. package/dist/model/subject.mjs +1 -1
  52. package/dist/model/types.d.mts +19 -20
  53. package/dist/runner/collector.d.mts +7 -8
  54. package/dist/runner/collector.mjs +3 -1
  55. package/dist/runner/discovery.d.mts +10 -11
  56. package/dist/runner/discovery.mjs +5 -1
  57. package/dist/runner/filter.d.mts +6 -7
  58. package/dist/runner/filter.mjs +3 -1
  59. package/dist/runner/index.d.mts +3 -1
  60. package/dist/runner/index.mjs +1 -1
  61. package/dist/runner/native/native-pool-grants.d.mts +2 -3
  62. package/dist/runner/native/native-serial-runner.d.mts +4 -7
  63. package/dist/runner/native/native-serial-runner.mjs +1 -1
  64. package/dist/runner/node/engine.d.mts +5 -6
  65. package/dist/runner/node/index.mjs +1 -1
  66. package/dist/runner/node/node-vm-filesystem.d.mts +4 -5
  67. package/dist/runner/node/node-vm-filesystem.mjs +1 -1
  68. package/dist/runner/node/pool-runner.d.mts +15 -6
  69. package/dist/runner/node/pool-runner.mjs +1 -1
  70. package/dist/runner/node/pool-worker-entry.d.mts +9 -6
  71. package/dist/runner/node/pool-worker-entry.mjs +1 -1
  72. package/dist/runner/pool/events.mjs +1 -1
  73. package/dist/runner/pool/pool-messages.d.mts +8 -9
  74. package/dist/runner/pool/pool.d.mts +4 -6
  75. package/dist/runner/pool/pool.mjs +1 -1
  76. package/dist/runner/pool/shard-timings.d.mts +3 -4
  77. package/dist/runner/pool/worker-host.d.mts +6 -5
  78. package/dist/runner/pool/worker-host.mjs +1 -1
  79. package/dist/runner/run-geospec-module.d.mts +2 -3
  80. package/dist/runner/run-geospec-module.mjs +2 -2
  81. package/dist/runner/timeout-codes.d.mts +6 -8
  82. package/dist/runner/types.d.mts +56 -53
  83. package/dist/runner/worker/no-matching-tests-issue.d.mts +3 -4
  84. package/dist/runner/worker/runner-types.d.mts +17 -16
  85. package/dist/runner/worker/serial-runner.mjs +1 -1
  86. package/dist/selector/types.d.mts +22 -23
  87. package/dist/step/types.d.mts +4 -119
  88. package/dist/support/filesystem-errors.mjs +1 -0
  89. package/dist/support/hash.mjs +1 -0
  90. package/dist/support/path.mjs +1 -0
  91. package/dist/support/sha256.mjs +1 -0
  92. package/dist/support/types.d.mts +38 -0
  93. package/dist/vitest/adapter.d.mts +5 -6
  94. package/dist/vitest/adapter.mjs +1 -1
  95. package/dist/vitest/index.d.mts +0 -1
  96. package/dist/vitest/index.mjs +1 -1
  97. package/dist/vitest/node/index.d.mts +2 -0
  98. package/dist/vitest/node/index.mjs +1 -0
  99. package/dist/vitest/node/setup-project.d.mts +60 -0
  100. package/dist/vitest/node/setup-project.mjs +1 -0
  101. package/dist/vm/plain-module-vm.d.mts +13 -0
  102. package/dist/vm/plain-module-vm.mjs +8 -0
  103. package/dist/vm/types.d.mts +142 -0
  104. package/package.json +17 -9
  105. package/agent/geospec-authoring/api-types-2.md +0 -85
@@ -1,6 +1,6 @@
1
1
  # geospec — Types
2
2
 
3
- 66 top-level symbols. Signatures are verbatim typescript.
3
+ 55 top-level symbols. Signatures are verbatim typescript.
4
4
 
5
5
  // A model admitted by one live GeoSpec host scope
6
6
  GeoSpecSubject: {
@@ -34,7 +34,7 @@ GeoSpecAssertion: {
34
34
  * holds for this millimetre box, never for the whole model.
35
35
  */
36
36
  region?: GeoSpecLoadRegion;
37
- /** Wall-clock cost of matcher evaluation in milliseconds (R1: budgeted matchers only). */
37
+ /** Wall-clock cost of matcher evaluation in milliseconds (budgeted matchers only). */
38
38
  durationMs?: number;
39
39
  }
40
40
 
@@ -62,7 +62,7 @@ GeoSpecAssertion: {
62
62
  // The crop this assertion's subject was loaded with
63
63
  region?: GeoSpecLoadRegion
64
64
 
65
- // Wall-clock cost of matcher evaluation in milliseconds (R1
65
+ // Wall-clock cost of matcher evaluation in milliseconds (budgeted matchers only)
66
66
  durationMs?: number
67
67
 
68
68
  // Assembly occurrence rule accepted by `expectGeo(...).toHaveAssemblyOccurrences(...)`
@@ -830,256 +830,6 @@ GeoSpecVolumeExpectation: {
830
830
 
831
831
  tolerance?: number
832
832
 
833
- // Basic exact or topology-derived BRep evidence consumed by early feature matchers
834
- BrepEvidence: {
835
- validity?: {
836
- valid: boolean;
837
- checks?: Array<{
838
- shape: string;
839
- status: string;
840
- }>;
841
- maxTolerance?: number;
842
- freeBounds?: {
843
- count: number;
844
- };
845
- smallEdges?: Array<{
846
- length: number;
847
- shape?: string;
848
- location?: Vec3;
849
- }>;
850
- sameParameter?: boolean;
851
- closedShells?: boolean;
852
- closedSolids?: boolean;
853
- solidCount?: number;
854
- invalidSolidCount?: number;
855
- openEdgeCount?: number;
856
- reason?: string;
857
- closedWires?: boolean;
858
- };
859
- topologyCounts?: {
860
- vertices?: number;
861
- edges?: number;
862
- wires?: number;
863
- faces?: number;
864
- shells?: number;
865
- solids?: number;
866
- compounds?: number;
867
- };
868
- boundingBox?: {
869
- min: Vec3;
870
- max: Vec3;
871
- size: Vec3;
872
- center: Vec3;
873
- };
874
- massProperties?: {
875
- surfaceArea?: number;
876
- volume?: number;
877
- centerOfMass?: Vec3;
878
- mass?: number;
879
- };
880
- planarFaces?: Array<{
881
- normal: Vec3;
882
- offset: number;
883
- area?: number;
884
- center?: Vec3;
885
- }>;
886
- cylindricalFaces?: Array<{
887
- radius: number;
888
- axis: 'x' | 'y' | 'z';
889
- center?: Vec3;
890
- axisRange?: {
891
- min: number;
892
- max: number;
893
- };
894
- }>;
895
- circularHoles?: Array<{
896
- diameter: number;
897
- through: boolean;
898
- axis: 'x' | 'y' | 'z';
899
- center?: Vec3;
900
- axisRange?: {
901
- min: number;
902
- max: number;
903
- };
904
- }>;
905
- circularHolePatterns?: Array<{
906
- count: number;
907
- holeDiameter: number;
908
- boltCircleDiameter: number;
909
- axis: 'x' | 'y' | 'z';
910
- center?: Vec3;
911
- }>;
912
- chamferFeatures?: Array<{
913
- distance: number;
914
- selection?: string;
915
- }>;
916
- filletFeatures?: Array<{
917
- radius: number;
918
- selection?: string;
919
- }>;
920
- minimumWallThickness?: {
921
- value: number;
922
- location?: Vec3;
923
- pointA?: Vec3;
924
- pointB?: Vec3;
925
- solidIndex?: number;
926
- tieCount?: number;
927
- algorithm?: string;
928
- tolerance?: number;
929
- supportA?: {
930
- faceIndex?: number;
931
- surfaceType?: string;
932
- supportType?: string;
933
- };
934
- supportB?: {
935
- faceIndex?: number;
936
- surfaceType?: string;
937
- supportType?: string;
938
- };
939
- rejections?: Record<string, number>;
940
- };
941
- }
942
-
943
- validity?: {
944
- valid: boolean;
945
- checks?: Array<{
946
- shape: string;
947
- status: string;
948
- }>;
949
- maxTolerance?: number;
950
- freeBounds?: {
951
- count: number;
952
- };
953
- smallEdges?: Array<{
954
- length: number;
955
- shape?: string;
956
- location?: Vec3;
957
- }>;
958
- sameParameter?: boolean;
959
- closedShells?: boolean;
960
- closedSolids?: boolean;
961
- solidCount?: number;
962
- invalidSolidCount?: number;
963
- openEdgeCount?: number;
964
- reason?: string;
965
- closedWires?: boolean;
966
- }
967
-
968
- topologyCounts?: {
969
- vertices?: number;
970
- edges?: number;
971
- wires?: number;
972
- faces?: number;
973
- shells?: number;
974
- solids?: number;
975
- compounds?: number;
976
- }
977
-
978
- boundingBox?: {
979
- min: Vec3;
980
- max: Vec3;
981
- size: Vec3;
982
- center: Vec3;
983
- }
984
-
985
- massProperties?: {
986
- surfaceArea?: number;
987
- volume?: number;
988
- centerOfMass?: Vec3;
989
- mass?: number;
990
- }
991
-
992
- planarFaces?: Array<{
993
- normal: Vec3;
994
- offset: number;
995
- area?: number;
996
- center?: Vec3;
997
- }>
998
-
999
- cylindricalFaces?: Array<{
1000
- radius: number;
1001
- axis: 'x' | 'y' | 'z';
1002
- center?: Vec3;
1003
- axisRange?: {
1004
- min: number;
1005
- max: number;
1006
- };
1007
- }>
1008
-
1009
- circularHoles?: Array<{
1010
- diameter: number;
1011
- through: boolean;
1012
- axis: 'x' | 'y' | 'z';
1013
- center?: Vec3;
1014
- axisRange?: {
1015
- min: number;
1016
- max: number;
1017
- };
1018
- }>
1019
-
1020
- circularHolePatterns?: Array<{
1021
- count: number;
1022
- holeDiameter: number;
1023
- boltCircleDiameter: number;
1024
- axis: 'x' | 'y' | 'z';
1025
- center?: Vec3;
1026
- }>
1027
-
1028
- chamferFeatures?: Array<{
1029
- distance: number;
1030
- selection?: string;
1031
- }>
1032
-
1033
- filletFeatures?: Array<{
1034
- radius: number;
1035
- selection?: string;
1036
- }>
1037
-
1038
- minimumWallThickness?: {
1039
- value: number;
1040
- location?: Vec3;
1041
- pointA?: Vec3;
1042
- pointB?: Vec3;
1043
- solidIndex?: number;
1044
- tieCount?: number;
1045
- algorithm?: string;
1046
- tolerance?: number;
1047
- supportA?: {
1048
- faceIndex?: number;
1049
- surfaceType?: string;
1050
- supportType?: string;
1051
- };
1052
- supportB?: {
1053
- faceIndex?: number;
1054
- surfaceType?: string;
1055
- supportType?: string;
1056
- };
1057
- rejections?: Record<string, number>;
1058
- }
1059
-
1060
- // Geometry file formats understood by GeoSpec provenance
1061
- GeometryFileFormat: MeshFileFormat | 'step' | 'stp'
1062
-
1063
- // Capability exposed by a loaded subject
1064
- GeometryCapability: {
1065
- kind: 'mesh';
1066
- feature: 'triangles' | 'bounding-box' | 'connected-components' | 'watertightness' | 'surface-area' | 'volume' | 'center-of-mass' | 'distance' | 'component-overlap';
1067
- } | {
1068
- kind: 'brep';
1069
- feature: 'validity' | 'topology-counts' | 'bounding-box' | 'mass-properties' | 'planar-faces' | 'cylindrical-faces' | 'circular-holes' | 'circular-hole-patterns' | 'chamfer-features' | 'fillet-features' | 'wall-thickness';
1070
- } | {
1071
- kind: 'step';
1072
- feature: 'schema' | 'units' | 'product-structure' | 'reader-provenance';
1073
- } | {
1074
- kind: 'unsupported';
1075
- feature: string;
1076
- reason: string;
1077
- }
1078
-
1079
- kind: 'mesh'
1080
-
1081
- feature: 'triangles' | 'bounding-box' | 'connected-components' | 'watertightness' | 'surface-area' | 'volume' | 'center-of-mass' | 'distance' | 'component-overlap'
1082
-
1083
833
  // Diagnostic emitted by GeoSpec loaders, analyzers, and matchers
1084
834
  GeometryDiagnostic: {
1085
835
  code: KernelIssueCode | (string & {});
@@ -1110,233 +860,6 @@ GeometryDiagnostic: {
1110
860
 
1111
861
  details?: unknown
1112
862
 
1113
- // Provenance recorded by GeoSpec loaders
1114
- GeometryProvenance: {
1115
- source: GeometrySource;
1116
- unit: GeoSpecUnit;
1117
- loader: 'gltf-transform' | 'in-memory' | 'opencascade-step';
1118
- contentHash?: string;
1119
- parameters?: Record<string, JSONValue>;
1120
- exportIntent?: GeometryExportIntent;
1121
- }
1122
-
1123
- source: GeometrySource
1124
-
1125
- unit: GeoSpecUnit
1126
-
1127
- loader: 'gltf-transform' | 'in-memory' | 'opencascade-step'
1128
-
1129
- contentHash?: string
1130
-
1131
- parameters?: Record<string, JSONValue>
1132
-
1133
- exportIntent?: GeometryExportIntent
1134
-
1135
- // Source metadata for a loaded geometry subject
1136
- GeometrySource: {
1137
- kind: 'bytes' | 'array-buffer' | 'blob' | 'file' | 'path' | 'url' | 'mesh-buffer' | 'readable-stream' | 'async-iterable';
1138
- format: GeometryFileFormat;
1139
- path?: string;
1140
- name?: string;
1141
- byteLength?: number;
1142
- }
1143
-
1144
- kind: 'bytes' | 'array-buffer' | 'blob' | 'file' | 'path' | 'url' | 'mesh-buffer' | 'readable-stream' | 'async-iterable'
1145
-
1146
- format: GeometryFileFormat
1147
-
1148
- path?: string
1149
-
1150
- name?: string
1151
-
1152
- byteLength?: number
1153
-
1154
- // Canonical P0 object under test for GeoSpec
1155
- // Remarks: This is intentionally a GeoSpec-loaded subject rather than a Tau runtime contract. Runtime integrations pass GLB/glTF bytes or files into loaders.
1156
- GeometrySubject: {
1157
- kind: 'geometry-subject';
1158
- /** Opaque engine-owned identifier used by every protocol claim. */
1159
- subjectId: string;
1160
- mesh: GeometrySubjectMeshEvidence;
1161
- brep?: BrepEvidence;
1162
- step?: StepEvidence;
1163
- provenance: GeometryProvenance;
1164
- capabilities: GeometryCapability[];
1165
- diagnostics: GeometryEvidenceDiagnostic[];
1166
- }
1167
-
1168
- kind: 'geometry-subject'
1169
-
1170
- // Opaque engine-owned identifier used by every protocol claim
1171
- subjectId: string
1172
-
1173
- mesh: GeometrySubjectMeshEvidence
1174
-
1175
- brep?: BrepEvidence
1176
-
1177
- step?: StepEvidence
1178
-
1179
- provenance: GeometryProvenance
1180
-
1181
- capabilities: GeometryCapability[]
1182
-
1183
- diagnostics: GeometryEvidenceDiagnostic[]
1184
-
1185
- // Wire-safe mesh summary carried by an opaque geometry subject
1186
- GeometrySubjectMeshEvidence: {
1187
- format: MeshFileFormat;
1188
- stats: Pick<GeometryStats, 'vertexCount' | 'meshCount' | 'triangleCount'>;
1189
- }
1190
-
1191
- format: MeshFileFormat
1192
-
1193
- stats: Pick<GeometryStats, 'vertexCount' | 'meshCount' | 'triangleCount'>
1194
-
1195
- // Mesh evidence loaded from geometry bytes or buffers
1196
- MeshEvidence: {
1197
- format: MeshFileFormat;
1198
- stats: GeometryStats;
1199
- }
1200
-
1201
- format: MeshFileFormat
1202
-
1203
- stats: GeometryStats
1204
-
1205
- // Geometry file formats supported by the P0 mesh loader
1206
- MeshFileFormat: 'glb' | 'gltf' | 'mesh-buffer'
1207
-
1208
- // Triangle quality and scalar mesh metrics used by P0 GeoSpec matchers
1209
- // Remarks: Values are reported in the glTF document coordinate units.
1210
- MeshQualityStats: {
1211
- triangleCount: number;
1212
- nonFiniteVertices: Array<{
1213
- primitive: string;
1214
- vertexIndex: number;
1215
- position: [number, number, number];
1216
- }>;
1217
- degenerateTriangles: Array<{
1218
- primitive: string;
1219
- triangleIndex: number;
1220
- area: number;
1221
- center: [number, number, number];
1222
- }>;
1223
- duplicateFaces: Array<{
1224
- primitive: string;
1225
- triangleIndex: number;
1226
- firstTriangleIndex: number;
1227
- }>;
1228
- triangles: MeshTriangle[];
1229
- surfaceArea: number;
1230
- signedVolume: number;
1231
- centerOfMass?: Vec3;
1232
- }
1233
-
1234
- triangleCount: number
1235
-
1236
- nonFiniteVertices: Array<{
1237
- primitive: string;
1238
- vertexIndex: number;
1239
- position: [number, number, number];
1240
- }>
1241
-
1242
- degenerateTriangles: Array<{
1243
- primitive: string;
1244
- triangleIndex: number;
1245
- area: number;
1246
- center: [number, number, number];
1247
- }>
1248
-
1249
- duplicateFaces: Array<{
1250
- primitive: string;
1251
- triangleIndex: number;
1252
- firstTriangleIndex: number;
1253
- }>
1254
-
1255
- triangles: MeshTriangle[]
1256
-
1257
- surfaceArea: number
1258
-
1259
- signedVolume: number
1260
-
1261
- centerOfMass?: Vec3
1262
-
1263
- // One triangle from mesh evidence, in geometry document coordinates
1264
- MeshTriangle: {
1265
- primitive: string;
1266
- triangleIndex: number;
1267
- a: [number, number, number];
1268
- b: [number, number, number];
1269
- c: [number, number, number];
1270
- center: [number, number, number];
1271
- area: number;
1272
- }
1273
-
1274
- primitive: string
1275
-
1276
- triangleIndex: number
1277
-
1278
- a: [number, number, number]
1279
-
1280
- b: [number, number, number]
1281
-
1282
- c: [number, number, number]
1283
-
1284
- center: [number, number, number]
1285
-
1286
- area: number
1287
-
1288
- // STEP/XDE evidence extracted while loading a STEP subject
1289
- StepEvidence: {
1290
- schema?: string;
1291
- unit?: GeoSpecUnit;
1292
- productStructure?: Array<{
1293
- name: string;
1294
- path: string;
1295
- transform?: number[];
1296
- }>;
1297
- readStrategy: {
1298
- strategy: 'native-stream' | 'filesystem';
1299
- inputKind: GeometrySource['kind'];
1300
- bytesRead: number;
1301
- nativeReadStream: boolean;
1302
- copiedToEmscriptenFs: boolean;
1303
- };
1304
- capabilities: Array<{
1305
- feature: string;
1306
- supported: boolean;
1307
- reason?: string;
1308
- }>;
1309
- /** Structured AP242 XDE read result (occurrences, subshape names, datum placements). */
1310
- xde?: XdeReadResult;
1311
- }
1312
-
1313
- schema?: string
1314
-
1315
- unit?: GeoSpecUnit
1316
-
1317
- productStructure?: Array<{
1318
- name: string;
1319
- path: string;
1320
- transform?: number[];
1321
- }>
1322
-
1323
- readStrategy: {
1324
- strategy: 'native-stream' | 'filesystem';
1325
- inputKind: GeometrySource['kind'];
1326
- bytesRead: number;
1327
- nativeReadStream: boolean;
1328
- copiedToEmscriptenFs: boolean;
1329
- }
1330
-
1331
- capabilities: Array<{
1332
- feature: string;
1333
- supported: boolean;
1334
- reason?: string;
1335
- }>
1336
-
1337
- // Structured AP242 XDE read result (occurrences, subshape names, datum placements)
1338
- xde?: XdeReadResult
1339
-
1340
863
  // Numeric 3D vector
1341
864
  Vec3: readonly [number, number, number]
1342
865
 
@@ -1752,3 +1275,85 @@ LoadModelOptions: LoadModelSourceOptions | LoadModelCodeOptions<Code> | LoadMode
1752
1275
 
1753
1276
  // Default work-unit budget for every claim on this subject
1754
1277
  workUnitLimit?: number
1278
+
1279
+ // Direct geometry-source model load options
1280
+ LoadModelSourceOptions: {
1281
+ /** Geometry bytes, path, browser file/blob, or in-memory mesh buffer. */
1282
+ source: MeshSource | StepSource;
1283
+ /** Named external resources consumed alongside the direct geometry bytes. */
1284
+ resources?: ReadonlyArray<{
1285
+ readonly name: string;
1286
+ readonly source: MeshSource | StepSource;
1287
+ }>;
1288
+ /**
1289
+ * Project-relative folder a path `source` and each resource path resolve in. Omitted, they resolve against the
1290
+ * project root. Recorded in the load evidence.
1291
+ */
1292
+ rootDir?: string;
1293
+ /** Source geometry format. Defaults to `glb`. */
1294
+ format?: GeoSpecModelFormat;
1295
+ /** Source path recorded in provenance. */
1296
+ path?: string;
1297
+ /** Human-readable source name recorded in provenance. */
1298
+ name?: string;
1299
+ /** Coordinate unit of raw GLB/glTF or mesh-buffer data before canonical millimetre normalization. */
1300
+ sourceUnit?: GeoSpecUnit;
1301
+ /** Explicit parameters recorded in provenance. */
1302
+ parameters?: Record<string, unknown>;
1303
+ /** STEP reader strategy used for STEP sources. */
1304
+ stepStreaming?: StepStreamingMode;
1305
+ /** Whether STEP loading should also produce mesh evidence. Defaults to true. */
1306
+ mesh?: boolean;
1307
+ /** Linear tolerance used while meshing exact BRep evidence. */
1308
+ meshLinearTolerance?: number;
1309
+ /** Angular tolerance in degrees used while meshing exact BRep evidence. */
1310
+ meshAngularToleranceDegrees?: number;
1311
+ /**
1312
+ * Default work-unit budget for every claim on this subject: a positive integer no greater than
1313
+ * the host's maximum (default `geoSpecMaximumWorkUnitLimit`, 512 000 000). `expectGeo(subject, { workUnitLimit })` overrides
1314
+ * it per chain. Recorded in the load evidence; it never changes the exported or admitted bytes.
1315
+ */
1316
+ workUnitLimit?: number;
1317
+ }
1318
+
1319
+ // Geometry bytes, path, browser file/blob, or in-memory mesh buffer
1320
+ source: MeshSource | StepSource
1321
+
1322
+ // Named external resources consumed alongside the direct geometry bytes
1323
+ resources?: ReadonlyArray<{
1324
+ readonly name: string;
1325
+ readonly source: MeshSource | StepSource;
1326
+ }>
1327
+
1328
+ // Project-relative folder a path `source` and each resource path resolve in
1329
+ rootDir?: string
1330
+
1331
+ // Source geometry format
1332
+ format?: GeoSpecModelFormat
1333
+
1334
+ // Source path recorded in provenance
1335
+ path?: string
1336
+
1337
+ // Human-readable source name recorded in provenance
1338
+ name?: string
1339
+
1340
+ // Coordinate unit of raw GLB/glTF or mesh-buffer data before canonical millimetre normalization
1341
+ sourceUnit?: GeoSpecUnit
1342
+
1343
+ // Explicit parameters recorded in provenance
1344
+ parameters?: Record<string, unknown>
1345
+
1346
+ // STEP reader strategy used for STEP sources
1347
+ stepStreaming?: StepStreamingMode
1348
+
1349
+ // Whether STEP loading should also produce mesh evidence
1350
+ mesh?: boolean
1351
+
1352
+ // Linear tolerance used while meshing exact BRep evidence
1353
+ meshLinearTolerance?: number
1354
+
1355
+ // Angular tolerance in degrees used while meshing exact BRep evidence
1356
+ meshAngularToleranceDegrees?: number
1357
+
1358
+ // Default work-unit budget for every claim on this subject
1359
+ workUnitLimit?: number
@@ -1,6 +1,6 @@
1
1
  # geospec — Functions
2
2
 
3
- 46 top-level symbols. Signatures are verbatim typescript.
3
+ 48 top-level symbols. Signatures are verbatim typescript.
4
4
 
5
5
  // GeoSpec suite helper used inside VM-executed test modules
6
6
  // describe (function)
@@ -129,6 +129,11 @@ export declare function runGeoSpecModule(options: RunGeoSpecModuleOptions): Prom
129
129
  export declare function isGeoSpecTimeoutCode(code: string): code is GeoSpecTimeoutCode;
130
130
  // code: Any diagnostic or issue code
131
131
 
132
+ // Create GeoSpec's default module VM
133
+ // createPlainModuleVm (function)
134
+ export declare function createPlainModuleVm(options: ModuleVmOptions): Promise<ModuleVm>;
135
+ // options: The project filesystem
136
+
132
137
  // Compose compiled assertion and model bindings with the SDK's serial lifecycle
133
138
  // createNativeGeoSpecRunner (function)
134
139
  export declare function createNativeGeoSpecRunner(options: GeoSpecNativeRunnerOptions): GeoSpecRunner;
@@ -244,6 +249,21 @@ export declare function installGeoSpecVitest(client: GeoSpecAssertionClient): Ge
244
249
  export declare function setupGeoSpecVitest(options: GeoSpecAssertionClientOptions): GeoSpecVitestAdapter;
245
250
  // options: Flat native assertion-client options
246
251
 
252
+ // Configure GeoSpec for the active Vitest file from the project's `geospec.config.*`, the file the `geospec` CLI reads
253
+ // Remarks: Call it at the top level of a test file or a setup file and await it. Subjects are released, and an engine this call created is closed, after the file's tests.
254
+ // setupGeoSpecVitestProject (function)
255
+ export declare function setupGeoSpecVitestProject(options: SetupGeoSpecVitestProjectOptions): Promise<GeoSpecVitestProject>;
256
+ // options: Project root, config file, overrides and assertion-client options
257
+ // Example (A Vitest file over a project with a geospec.config.ts):
258
+ // import { expect, it } from 'vitest';
259
+ // import { setupGeoSpecVitestProject } from 'geospec/vitest/node';
260
+ //
261
+ // const geo = await setupGeoSpecVitestProject({ projectPath: import.meta.dirname });
262
+ //
263
+ // it('has the intended volume', async () => {
264
+ // await expect(await geo.loadModel({ file: 'part.step' })).toHaveVolume({ value: 1000, tolerance: 1 });
265
+ // });
266
+
247
267
  // Type a `geospec.config.*` default export
248
268
  // Remarks: An identity at runtime. The parameter is not generic, so an object literal gets the excess-property and contextual checks `satisfies GeoSpecConfig` gives, in `.ts` and `.js` alike.
249
269
  // defineConfig (function)