cad-mcp-server 0.1.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.
Files changed (208) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +111 -0
  3. package/THIRD_PARTY_NOTICES.md +20 -0
  4. package/dist/cad/compare.d.ts +31 -0
  5. package/dist/cad/compare.d.ts.map +1 -0
  6. package/dist/cad/compare.js +51 -0
  7. package/dist/cad/compare.js.map +1 -0
  8. package/dist/cad/model-store.d.ts +52 -0
  9. package/dist/cad/model-store.d.ts.map +1 -0
  10. package/dist/cad/model-store.js +227 -0
  11. package/dist/cad/model-store.js.map +1 -0
  12. package/dist/cad/query/edges.d.ts +6 -0
  13. package/dist/cad/query/edges.d.ts.map +1 -0
  14. package/dist/cad/query/edges.js +257 -0
  15. package/dist/cad/query/edges.js.map +1 -0
  16. package/dist/cad/query/entities.d.ts +4 -0
  17. package/dist/cad/query/entities.d.ts.map +1 -0
  18. package/dist/cad/query/entities.js +185 -0
  19. package/dist/cad/query/entities.js.map +1 -0
  20. package/dist/cad/query/faces.d.ts +6 -0
  21. package/dist/cad/query/faces.d.ts.map +1 -0
  22. package/dist/cad/query/faces.js +305 -0
  23. package/dist/cad/query/faces.js.map +1 -0
  24. package/dist/cad/query/pmi.d.ts +3 -0
  25. package/dist/cad/query/pmi.d.ts.map +1 -0
  26. package/dist/cad/query/pmi.js +141 -0
  27. package/dist/cad/query/pmi.js.map +1 -0
  28. package/dist/cad/query/shared.d.ts +74 -0
  29. package/dist/cad/query/shared.d.ts.map +1 -0
  30. package/dist/cad/query/shared.js +181 -0
  31. package/dist/cad/query/shared.js.map +1 -0
  32. package/dist/cad/schema-version.d.ts +2 -0
  33. package/dist/cad/schema-version.d.ts.map +1 -0
  34. package/dist/cad/schema-version.js +2 -0
  35. package/dist/cad/schema-version.js.map +1 -0
  36. package/dist/compare.d.ts +31 -0
  37. package/dist/compare.d.ts.map +1 -0
  38. package/dist/compare.js +51 -0
  39. package/dist/compare.js.map +1 -0
  40. package/dist/index.d.ts +17 -0
  41. package/dist/index.d.ts.map +1 -0
  42. package/dist/index.js +113 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/kernel/aag-utils.d.ts +7 -0
  45. package/dist/kernel/aag-utils.d.ts.map +1 -0
  46. package/dist/kernel/aag-utils.js +54 -0
  47. package/dist/kernel/aag-utils.js.map +1 -0
  48. package/dist/kernel/import.d.ts +4 -0
  49. package/dist/kernel/import.d.ts.map +1 -0
  50. package/dist/kernel/import.js +25 -0
  51. package/dist/kernel/import.js.map +1 -0
  52. package/dist/kernel/kernel.d.ts +3 -0
  53. package/dist/kernel/kernel.d.ts.map +1 -0
  54. package/dist/kernel/kernel.js +7 -0
  55. package/dist/kernel/kernel.js.map +1 -0
  56. package/dist/kernel/measure.d.ts +6 -0
  57. package/dist/kernel/measure.d.ts.map +1 -0
  58. package/dist/kernel/measure.js +23 -0
  59. package/dist/kernel/measure.js.map +1 -0
  60. package/dist/kernel/query-entities.d.ts +75 -0
  61. package/dist/kernel/query-entities.d.ts.map +1 -0
  62. package/dist/kernel/query-entities.js +190 -0
  63. package/dist/kernel/query-entities.js.map +1 -0
  64. package/dist/kernel/topology.d.ts +4 -0
  65. package/dist/kernel/topology.d.ts.map +1 -0
  66. package/dist/kernel/topology.js +48 -0
  67. package/dist/kernel/topology.js.map +1 -0
  68. package/dist/model-store.d.ts +52 -0
  69. package/dist/model-store.d.ts.map +1 -0
  70. package/dist/model-store.js +227 -0
  71. package/dist/model-store.js.map +1 -0
  72. package/dist/pmi/metadata.d.ts +15 -0
  73. package/dist/pmi/metadata.d.ts.map +1 -0
  74. package/dist/pmi/metadata.js +93 -0
  75. package/dist/pmi/metadata.js.map +1 -0
  76. package/dist/pmi/parser.d.ts +46 -0
  77. package/dist/pmi/parser.d.ts.map +1 -0
  78. package/dist/pmi/parser.js +400 -0
  79. package/dist/pmi/parser.js.map +1 -0
  80. package/dist/pmi/semantic-provider.d.ts +7 -0
  81. package/dist/pmi/semantic-provider.d.ts.map +1 -0
  82. package/dist/pmi/semantic-provider.js +96 -0
  83. package/dist/pmi/semantic-provider.js.map +1 -0
  84. package/dist/providers/brep.d.ts +39 -0
  85. package/dist/providers/brep.d.ts.map +1 -0
  86. package/dist/providers/brep.js +2 -0
  87. package/dist/providers/brep.js.map +1 -0
  88. package/dist/providers/lightweight-step/metadata.d.ts +15 -0
  89. package/dist/providers/lightweight-step/metadata.d.ts.map +1 -0
  90. package/dist/providers/lightweight-step/metadata.js +93 -0
  91. package/dist/providers/lightweight-step/metadata.js.map +1 -0
  92. package/dist/providers/lightweight-step/pmi-parser.d.ts +46 -0
  93. package/dist/providers/lightweight-step/pmi-parser.d.ts.map +1 -0
  94. package/dist/providers/lightweight-step/pmi-parser.js +400 -0
  95. package/dist/providers/lightweight-step/pmi-parser.js.map +1 -0
  96. package/dist/providers/lightweight-step/semantic-provider.d.ts +7 -0
  97. package/dist/providers/lightweight-step/semantic-provider.d.ts.map +1 -0
  98. package/dist/providers/lightweight-step/semantic-provider.js +96 -0
  99. package/dist/providers/lightweight-step/semantic-provider.js.map +1 -0
  100. package/dist/providers/occt-wasm/aag-utils.d.ts +7 -0
  101. package/dist/providers/occt-wasm/aag-utils.d.ts.map +1 -0
  102. package/dist/providers/occt-wasm/aag-utils.js +54 -0
  103. package/dist/providers/occt-wasm/aag-utils.js.map +1 -0
  104. package/dist/providers/occt-wasm/import.d.ts +4 -0
  105. package/dist/providers/occt-wasm/import.d.ts.map +1 -0
  106. package/dist/providers/occt-wasm/import.js +25 -0
  107. package/dist/providers/occt-wasm/import.js.map +1 -0
  108. package/dist/providers/occt-wasm/kernel.d.ts +3 -0
  109. package/dist/providers/occt-wasm/kernel.d.ts.map +1 -0
  110. package/dist/providers/occt-wasm/kernel.js +7 -0
  111. package/dist/providers/occt-wasm/kernel.js.map +1 -0
  112. package/dist/providers/occt-wasm/measure.d.ts +6 -0
  113. package/dist/providers/occt-wasm/measure.d.ts.map +1 -0
  114. package/dist/providers/occt-wasm/measure.js +23 -0
  115. package/dist/providers/occt-wasm/measure.js.map +1 -0
  116. package/dist/providers/occt-wasm/query-entities.d.ts +71 -0
  117. package/dist/providers/occt-wasm/query-entities.d.ts.map +1 -0
  118. package/dist/providers/occt-wasm/query-entities.js +177 -0
  119. package/dist/providers/occt-wasm/query-entities.js.map +1 -0
  120. package/dist/providers/occt-wasm/topology.d.ts +4 -0
  121. package/dist/providers/occt-wasm/topology.d.ts.map +1 -0
  122. package/dist/providers/occt-wasm/topology.js +48 -0
  123. package/dist/providers/occt-wasm/topology.js.map +1 -0
  124. package/dist/providers/schema.d.ts +50 -0
  125. package/dist/providers/schema.d.ts.map +1 -0
  126. package/dist/providers/schema.js +2 -0
  127. package/dist/providers/schema.js.map +1 -0
  128. package/dist/providers/semantic.d.ts +34 -0
  129. package/dist/providers/semantic.d.ts.map +1 -0
  130. package/dist/providers/semantic.js +2 -0
  131. package/dist/providers/semantic.js.map +1 -0
  132. package/dist/query/edges.d.ts +6 -0
  133. package/dist/query/edges.d.ts.map +1 -0
  134. package/dist/query/edges.js +257 -0
  135. package/dist/query/edges.js.map +1 -0
  136. package/dist/query/entities.d.ts +4 -0
  137. package/dist/query/entities.d.ts.map +1 -0
  138. package/dist/query/entities.js +203 -0
  139. package/dist/query/entities.js.map +1 -0
  140. package/dist/query/faces.d.ts +6 -0
  141. package/dist/query/faces.d.ts.map +1 -0
  142. package/dist/query/faces.js +309 -0
  143. package/dist/query/faces.js.map +1 -0
  144. package/dist/query/pmi.d.ts +3 -0
  145. package/dist/query/pmi.d.ts.map +1 -0
  146. package/dist/query/pmi.js +141 -0
  147. package/dist/query/pmi.js.map +1 -0
  148. package/dist/query/shared.d.ts +74 -0
  149. package/dist/query/shared.d.ts.map +1 -0
  150. package/dist/query/shared.js +181 -0
  151. package/dist/query/shared.js.map +1 -0
  152. package/dist/schema-version.d.ts +2 -0
  153. package/dist/schema-version.d.ts.map +1 -0
  154. package/dist/schema-version.js +2 -0
  155. package/dist/schema-version.js.map +1 -0
  156. package/dist/tools/shared.d.ts +11 -0
  157. package/dist/tools/shared.d.ts.map +1 -0
  158. package/dist/tools/shared.js +19 -0
  159. package/dist/tools/shared.js.map +1 -0
  160. package/dist/tools/step-tools.d.ts +758 -0
  161. package/dist/tools/step-tools.d.ts.map +1 -0
  162. package/dist/tools/step-tools.js +836 -0
  163. package/dist/tools/step-tools.js.map +1 -0
  164. package/dist/types/brep.d.ts +39 -0
  165. package/dist/types/brep.d.ts.map +1 -0
  166. package/dist/types/brep.js +2 -0
  167. package/dist/types/brep.js.map +1 -0
  168. package/dist/types/schema.d.ts +50 -0
  169. package/dist/types/schema.d.ts.map +1 -0
  170. package/dist/types/schema.js +2 -0
  171. package/dist/types/schema.js.map +1 -0
  172. package/dist/types/semantic.d.ts +34 -0
  173. package/dist/types/semantic.d.ts.map +1 -0
  174. package/dist/types/semantic.js +2 -0
  175. package/dist/types/semantic.js.map +1 -0
  176. package/dist/utils/errors.d.ts +7 -0
  177. package/dist/utils/errors.d.ts.map +1 -0
  178. package/dist/utils/errors.js +7 -0
  179. package/dist/utils/errors.js.map +1 -0
  180. package/dist/utils/ids.d.ts +2 -0
  181. package/dist/utils/ids.d.ts.map +1 -0
  182. package/dist/utils/ids.js +4 -0
  183. package/dist/utils/ids.js.map +1 -0
  184. package/dist/utils/numbers.d.ts +11 -0
  185. package/dist/utils/numbers.d.ts.map +1 -0
  186. package/dist/utils/numbers.js +15 -0
  187. package/dist/utils/numbers.js.map +1 -0
  188. package/dist/utils/vectors.d.ts +4 -0
  189. package/dist/utils/vectors.d.ts.map +1 -0
  190. package/dist/utils/vectors.js +14 -0
  191. package/dist/utils/vectors.js.map +1 -0
  192. package/docs/EXAMPLE_PROMPTS.md +61 -0
  193. package/node_modules/occt-wasm/dist/index.d.ts +303 -0
  194. package/node_modules/occt-wasm/dist/index.d.ts.map +1 -0
  195. package/node_modules/occt-wasm/dist/index.js +1125 -0
  196. package/node_modules/occt-wasm/dist/index.js.map +1 -0
  197. package/node_modules/occt-wasm/dist/occt-wasm.js +2 -0
  198. package/node_modules/occt-wasm/dist/occt-wasm.wasm +0 -0
  199. package/node_modules/occt-wasm/dist/raw-types.d.ts +229 -0
  200. package/node_modules/occt-wasm/dist/raw-types.d.ts.map +1 -0
  201. package/node_modules/occt-wasm/dist/raw-types.js +8 -0
  202. package/node_modules/occt-wasm/dist/raw-types.js.map +1 -0
  203. package/node_modules/occt-wasm/dist/types.d.ts +223 -0
  204. package/node_modules/occt-wasm/dist/types.d.ts.map +1 -0
  205. package/node_modules/occt-wasm/dist/types.js +129 -0
  206. package/node_modules/occt-wasm/dist/types.js.map +1 -0
  207. package/node_modules/occt-wasm/package.json +44 -0
  208. package/package.json +102 -0
@@ -0,0 +1,309 @@
1
+ import { computeEdgeVexity } from '../kernel/aag-utils.js';
2
+ import { normalizeVector, angleDegreesNormalized } from '../utils/vectors.js';
3
+ import { withStepModel } from '../model-store.js';
4
+ import { normalizePagination, createPagination, createQueryResponse, groupEntities, magnitudeBucketKey, radiusBucketValue, axisDirectionKey, DEFAULT_QUERY_LIMITS, } from './shared.js';
5
+ /**
6
+ * Query STEP file faces with filtering, sorting, and pagination.
7
+ */
8
+ export async function queryStepFaces(filePath, input) {
9
+ return withStepModel(filePath, async (model) => {
10
+ const includeBodyId = Boolean(input.filter?.body_ids?.length ||
11
+ input.include?.includes('body_id') ||
12
+ input.group_by?.includes('body_id'));
13
+ const allFaces = await model.getFaceEntities(includeBodyId);
14
+ const { kernel, shape } = await model.getShapeContext('query_step_faces');
15
+ // Pre-filter by group_ids: resolve which entities belong to requested groups.
16
+ let preFiltered = allFaces;
17
+ if (input.filter?.group_ids && input.filter.group_ids.length > 0) {
18
+ const groupBy = input.group_by;
19
+ const preGroups = groupFaces(allFaces, groupBy, 0);
20
+ const groupIdSet = new Set(input.filter.group_ids);
21
+ const allowedIds = new Set();
22
+ for (const g of preGroups) {
23
+ if (groupIdSet.has(g.id)) {
24
+ for (const id of g.entity_ids)
25
+ allowedIds.add(id);
26
+ }
27
+ }
28
+ preFiltered = allFaces.filter((f) => allowedIds.has(f.id));
29
+ }
30
+ // Apply filters.
31
+ let filtered = applyFaceFilters(preFiltered, input.filter);
32
+ // Apply sorting.
33
+ if (input.sort) {
34
+ filtered = sortFaces(filtered, input.sort);
35
+ }
36
+ const resultMode = input.result_mode ?? 'entities';
37
+ const total_matched = filtered.length;
38
+ // Grouping (result_mode "groups").
39
+ const groups = resultMode === 'groups'
40
+ ? groupFaces(filtered, input.group_by, DEFAULT_QUERY_LIMITS.sample_entity_limit)
41
+ : [];
42
+ // Pagination + projection (skipped for summary/groups modes to save tokens).
43
+ const { limit, offset } = normalizePagination(input.limit, input.offset);
44
+ const includeEntities = resultMode === 'entities';
45
+ const paginated = includeEntities ? filtered.slice(offset, offset + limit) : [];
46
+ // Compute adjacency and closest-face-distance for paginated faces on demand.
47
+ const faceShapes = kernel.getSubShapes(shape, 'face');
48
+ const adjacencies = buildFaceAdjacencies(kernel, shape, faceShapes, paginated, input.include);
49
+ const closestDistances = buildClosestFaceDistances(kernel, faceShapes, paginated, allFaces, input.include);
50
+ const augmentedFaces = paginated.map((face) => ({
51
+ ...face,
52
+ ...(adjacencies ? { adjacent_faces: adjacencies.get(face.id) ?? [] } : {}),
53
+ ...(closestDistances ? { closest_face_distance: closestDistances.get(face.id) } : {}),
54
+ }));
55
+ const entities = augmentedFaces.map((face) => projectFace(face, input.include));
56
+ const pagination = createPagination(limit, offset, paginated.length, total_matched);
57
+ return createQueryResponse(filePath, {
58
+ filter: input.filter ?? {},
59
+ include: input.include ?? [],
60
+ group_by: input.group_by ?? null,
61
+ result_mode: resultMode,
62
+ sort: input.sort ?? null,
63
+ limit,
64
+ offset,
65
+ }, pagination, entities, {
66
+ total_faces: allFaces.length,
67
+ matched_faces: total_matched,
68
+ surface_types: aggregateSurfaceTypes(filtered),
69
+ area_range: getAreaRange(filtered),
70
+ }, groups, [], // warnings
71
+ [] // limitations
72
+ );
73
+ });
74
+ }
75
+ /**
76
+ * Build adjacency data for paginated faces when requested via include.
77
+ */
78
+ function buildFaceAdjacencies(kernel, shape, faceShapes, paginated, include) {
79
+ if (!include?.includes('adjacent_faces'))
80
+ return undefined;
81
+ const result = new Map();
82
+ for (const face of paginated) {
83
+ const idx = face.index;
84
+ const faceShape = faceShapes[idx];
85
+ const adjacent = kernel.adjacentFaces(shape, faceShape);
86
+ const entries = [];
87
+ for (const adjFace of adjacent) {
88
+ const adjIdx = faceShapes.findIndex((s) => kernel.isSame(s, adjFace));
89
+ if (adjIdx === -1)
90
+ continue;
91
+ const sharedEdges = kernel.sharedEdges(faceShape, adjFace);
92
+ if (sharedEdges.length === 0)
93
+ continue;
94
+ const vexityResult = computeEdgeVexity(kernel, faceShape, adjFace, sharedEdges[0]);
95
+ entries.push({
96
+ face_id: `face:${adjIdx}`,
97
+ surface_type: kernel.surfaceType(adjFace),
98
+ dihedral_angle_deg: vexityResult.dihedralAngleDeg,
99
+ });
100
+ }
101
+ result.set(face.id, entries);
102
+ }
103
+ return result;
104
+ }
105
+ /**
106
+ * Compute closest face distance for each paginated face when requested.
107
+ */
108
+ function buildClosestFaceDistances(kernel, faceShapes, paginated, allFaces, include) {
109
+ if (!include?.includes('closest_face_distance'))
110
+ return undefined;
111
+ const result = new Map();
112
+ const allIndices = allFaces.map((f) => f.index);
113
+ for (const face of paginated) {
114
+ const idx = face.index;
115
+ const faceShape = faceShapes[idx];
116
+ let bestFace = '';
117
+ let bestDist = Number.POSITIVE_INFINITY;
118
+ for (const otherIdx of allIndices) {
119
+ if (otherIdx === idx)
120
+ continue;
121
+ const dist = kernel.distanceBetween(faceShape, faceShapes[otherIdx]);
122
+ if (dist < bestDist) {
123
+ bestDist = dist;
124
+ bestFace = `face:${otherIdx}`;
125
+ }
126
+ }
127
+ result.set(face.id, {
128
+ face_id: bestFace,
129
+ distance: bestDist === Number.POSITIVE_INFINITY ? -1 : bestDist,
130
+ });
131
+ }
132
+ return result;
133
+ }
134
+ /**
135
+ * Group faces by the requested dimensions using fixed server-side buckets.
136
+ */
137
+ function groupFaces(faces, groupBy, sampleLimit) {
138
+ const dimensions = groupBy ?? ['surface_type'];
139
+ const limit = sampleLimit ?? DEFAULT_QUERY_LIMITS.sample_entity_limit;
140
+ return groupEntities(faces, dimensions, (face, dimension) => {
141
+ switch (dimension) {
142
+ case 'surface_type':
143
+ return face.surface_type;
144
+ case 'normal_direction':
145
+ return face.normal ? axisDirectionKey(face.normal) : 'undefined';
146
+ case 'area_range':
147
+ return magnitudeBucketKey(face.area);
148
+ case 'radius':
149
+ return face.radius !== undefined ? radiusBucketValue(face.radius) : null;
150
+ case 'body_id':
151
+ return face.body_id ?? 'unknown';
152
+ default:
153
+ return null;
154
+ }
155
+ }, limit, (members) => ({
156
+ area_range: getAreaRange(members),
157
+ }));
158
+ }
159
+ /**
160
+ * Apply face filters to a set of faces.
161
+ */
162
+ function applyFaceFilters(faces, filter) {
163
+ let result = faces;
164
+ if (filter) {
165
+ if (filter.entity_ids && filter.entity_ids.length > 0) {
166
+ const idSet = new Set(filter.entity_ids);
167
+ result = result.filter((f) => idSet.has(f.id));
168
+ }
169
+ if (filter.body_ids && filter.body_ids.length > 0) {
170
+ const bodySet = new Set(filter.body_ids);
171
+ result = result.filter((f) => f.body_id !== undefined && bodySet.has(f.body_id));
172
+ }
173
+ if (filter.surface_type && filter.surface_type.length > 0) {
174
+ const typeSet = new Set(filter.surface_type);
175
+ result = result.filter((f) => typeSet.has(f.surface_type));
176
+ }
177
+ if (filter.area_min !== undefined) {
178
+ result = result.filter((f) => f.area >= filter.area_min);
179
+ }
180
+ if (filter.area_max !== undefined) {
181
+ result = result.filter((f) => f.area <= filter.area_max);
182
+ }
183
+ // Normal parallel to filter.
184
+ if (filter.normal_parallel_to) {
185
+ const targetNormal = normalizeVector(filter.normal_parallel_to);
186
+ const tolerance = filter.normal_tolerance_degrees ?? 10;
187
+ result = result.filter((f) => {
188
+ if (!f.normal)
189
+ return false;
190
+ const faceNormal = normalizeVector(f.normal);
191
+ const angle = angleDegreesNormalized(faceNormal, targetNormal);
192
+ // Allow angle or 180-angle (opposite direction).
193
+ return Math.min(angle, 180 - angle) <= tolerance;
194
+ });
195
+ }
196
+ }
197
+ return result;
198
+ }
199
+ /**
200
+ * Sort faces by the specified criteria.
201
+ */
202
+ function sortFaces(faces, sort) {
203
+ const sorted = [...faces];
204
+ const direction = sort.direction === 'desc' ? -1 : 1;
205
+ sorted.sort((a, b) => {
206
+ let cmp = 0;
207
+ switch (sort.by) {
208
+ case 'area':
209
+ cmp = a.area - b.area;
210
+ break;
211
+ case 'surface_type':
212
+ cmp = a.surface_type.localeCompare(b.surface_type);
213
+ break;
214
+ case 'center_x':
215
+ cmp = a.center[0] - b.center[0];
216
+ break;
217
+ case 'center_y':
218
+ cmp = a.center[1] - b.center[1];
219
+ break;
220
+ case 'center_z':
221
+ cmp = a.center[2] - b.center[2];
222
+ break;
223
+ }
224
+ return cmp * direction;
225
+ });
226
+ return sorted;
227
+ }
228
+ /**
229
+ * Project a face to only the requested include fields.
230
+ */
231
+ function projectFace(face, include) {
232
+ const fields = include ?? ['id', 'surface_type', 'area', 'bbox', 'center'];
233
+ const result = {};
234
+ for (const field of fields) {
235
+ switch (field) {
236
+ case 'id':
237
+ result.id = face.id;
238
+ break;
239
+ case 'surface_type':
240
+ result.surface_type = face.surface_type;
241
+ break;
242
+ case 'area':
243
+ result.area = face.area;
244
+ break;
245
+ case 'bbox':
246
+ result.bbox = face.bbox;
247
+ break;
248
+ case 'center':
249
+ result.bbox_center = face.center;
250
+ break;
251
+ case 'normal':
252
+ if (face.normal !== undefined)
253
+ result.normal = face.normal;
254
+ break;
255
+ case 'surface_parameters':
256
+ // Surface-specific parameters like radius for cylinders.
257
+ result.surface_parameters = face.radius !== undefined ? { radius: face.radius } : {};
258
+ break;
259
+ case 'axis':
260
+ if (face.axis !== undefined)
261
+ result.axis = face.axis;
262
+ break;
263
+ case 'adjacent_faces':
264
+ if (face.adjacent_faces !== undefined)
265
+ result.adjacent_faces = face.adjacent_faces;
266
+ break;
267
+ case 'closest_face_distance':
268
+ if (face.closest_face_distance !== undefined)
269
+ result.closest_face_distance = face.closest_face_distance;
270
+ break;
271
+ case 'has_inner_wires':
272
+ if (face.has_inner_wires !== undefined)
273
+ result.has_inner_wires = face.has_inner_wires;
274
+ break;
275
+ case 'body_id':
276
+ if (face.body_id !== undefined)
277
+ result.body_id = face.body_id;
278
+ break;
279
+ }
280
+ }
281
+ return result;
282
+ }
283
+ /**
284
+ * Aggregate surface types in a set of faces.
285
+ */
286
+ function aggregateSurfaceTypes(faces) {
287
+ const agg = {};
288
+ for (const face of faces) {
289
+ agg[face.surface_type] = (agg[face.surface_type] ?? 0) + 1;
290
+ }
291
+ return agg;
292
+ }
293
+ /**
294
+ * Get area range of faces.
295
+ */
296
+ function getAreaRange(faces) {
297
+ if (faces.length === 0)
298
+ return null;
299
+ let min = Number.POSITIVE_INFINITY;
300
+ let max = Number.NEGATIVE_INFINITY;
301
+ for (const face of faces) {
302
+ if (face.area < min)
303
+ min = face.area;
304
+ if (face.area > max)
305
+ max = face.area;
306
+ }
307
+ return { min, max };
308
+ }
309
+ //# sourceMappingURL=faces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"faces.js","sourceRoot":"","sources":["../../src/query/faces.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { QueryStepPmiInput } from '../tools/step-tools.js';
2
+ export declare function queryStepPmi(filePath: string, input: QueryStepPmiInput): Promise<import("../tools/step-tools.js").StepQueryResponse<Record<string, unknown>>>;
3
+ //# sourceMappingURL=pmi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pmi.d.ts","sourceRoot":"","sources":["../../src/query/pmi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAkBhE,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,wFAsK5E"}
@@ -0,0 +1,141 @@
1
+ import { withStepModel } from '../model-store.js';
2
+ import { normalizePagination, createPagination, createQueryResponse, DEFAULT_QUERY_LIMITS, } from './shared.js';
3
+ export async function queryStepPmi(filePath, input) {
4
+ return withStepModel(filePath, async (model) => {
5
+ const full = await model.getPmiEntities();
6
+ let filtered = [...full.pmi_entities];
7
+ // Apply filters.
8
+ if (input.filter?.pmi_types && input.filter.pmi_types.length > 0) {
9
+ const typeSet = new Set(input.filter.pmi_types);
10
+ filtered = filtered.filter((e) => typeSet.has(e.type));
11
+ }
12
+ if (input.filter?.tolerance_types && input.filter.tolerance_types.length > 0) {
13
+ const tolSet = new Set(input.filter.tolerance_types);
14
+ filtered = filtered.filter((e) => e.type === 'geometric_tolerance' &&
15
+ 'tolerance_type' in e &&
16
+ tolSet.has(e.tolerance_type));
17
+ }
18
+ if (input.filter?.value_min !== undefined) {
19
+ filtered = filtered.filter((e) => 'value' in e && e.value !== null && e.value >= input.filter.value_min);
20
+ }
21
+ if (input.filter?.value_max !== undefined) {
22
+ filtered = filtered.filter((e) => 'value' in e && e.value !== null && e.value <= input.filter.value_max);
23
+ }
24
+ // Sorting.
25
+ if (input.sort) {
26
+ const dir = input.sort.direction === 'desc' ? -1 : 1;
27
+ filtered.sort((a, b) => {
28
+ let cmp = 0;
29
+ switch (input.sort.by) {
30
+ case 'type':
31
+ cmp = a.type.localeCompare(b.type);
32
+ break;
33
+ case 'value':
34
+ cmp =
35
+ ('value' in a ? (a.value ?? 0) : 0) -
36
+ ('value' in b ? (b.value ?? 0) : 0);
37
+ break;
38
+ case 'tolerance_type': {
39
+ const aTol = a.type === 'geometric_tolerance' ? a.tolerance_type : '';
40
+ const bTol = b.type === 'geometric_tolerance' ? b.tolerance_type : '';
41
+ cmp = aTol.localeCompare(bTol);
42
+ break;
43
+ }
44
+ }
45
+ return cmp * dir;
46
+ });
47
+ }
48
+ // Grouping.
49
+ const resultMode = input.result_mode ?? 'entities';
50
+ let groups = [];
51
+ if (resultMode === 'groups') {
52
+ const groupBy = input.group_by ?? ['type'];
53
+ const buckets = new Map();
54
+ for (const entity of filtered) {
55
+ const key = {};
56
+ for (const dim of groupBy) {
57
+ switch (dim) {
58
+ case 'type':
59
+ key.type = entity.type;
60
+ break;
61
+ case 'tolerance_type':
62
+ if (entity.type === 'geometric_tolerance') {
63
+ key.tolerance_type = entity.tolerance_type;
64
+ }
65
+ else {
66
+ key.tolerance_type = null;
67
+ }
68
+ break;
69
+ case 'dimension_type':
70
+ if (entity.type === 'dimension') {
71
+ key.dimension_type = entity.dimension_type;
72
+ }
73
+ else {
74
+ key.dimension_type = null;
75
+ }
76
+ break;
77
+ case 'material_condition':
78
+ if (entity.type === 'geometric_tolerance') {
79
+ key.material_condition = entity.material_condition;
80
+ }
81
+ else {
82
+ key.material_condition = null;
83
+ }
84
+ break;
85
+ }
86
+ }
87
+ const mapKey = JSON.stringify(groupBy.map((d) => key[d]));
88
+ let bucket = buckets.get(mapKey);
89
+ if (!bucket) {
90
+ bucket = { key, members: [] };
91
+ buckets.set(mapKey, bucket);
92
+ }
93
+ bucket.members.push(entity);
94
+ }
95
+ const sampleLimit = DEFAULT_QUERY_LIMITS.sample_entity_limit;
96
+ let groupIdx = 0;
97
+ groups = [...buckets.values()].map((bucket) => {
98
+ const ids = bucket.members.map((m) => m.step_id);
99
+ const sampled = ids.slice(0, sampleLimit);
100
+ const isComplete = ids.length <= sampleLimit;
101
+ return {
102
+ id: `group:${groupIdx++}`,
103
+ key: bucket.key,
104
+ entity_count: bucket.members.length,
105
+ entity_ids: ids,
106
+ sample_entity_ids: sampled,
107
+ sample_entity_limit: sampleLimit,
108
+ sample_is_complete: isComplete,
109
+ summary: {},
110
+ };
111
+ });
112
+ groups.sort((a, b) => b.entity_count - a.entity_count);
113
+ }
114
+ // Pagination.
115
+ const { limit, offset } = normalizePagination(input.limit, input.offset);
116
+ const paginated = resultMode === 'entities' ? filtered.slice(offset, offset + limit) : [];
117
+ const pagination = createPagination(limit, offset, paginated.length, filtered.length);
118
+ // Statistics.
119
+ const byType = {};
120
+ for (const e of full.pmi_entities) {
121
+ byType[e.type] = (byType[e.type] ?? 0) + 1;
122
+ }
123
+ return createQueryResponse(filePath, {
124
+ filter: input.filter ?? {},
125
+ group_by: input.group_by ?? null,
126
+ sort: input.sort ?? null,
127
+ result_mode: resultMode,
128
+ limit,
129
+ offset,
130
+ }, pagination, paginated, {
131
+ total_pmi: full.pmi_entities.length,
132
+ matched_pmi: filtered.length,
133
+ ...byType,
134
+ }, groups, full.pmi_entities.length === 0
135
+ ? [
136
+ 'No PMI entities found. STEP file may be AP203 (no PMI) or may not contain GD&T annotations.',
137
+ ]
138
+ : [], []);
139
+ });
140
+ }
141
+ //# sourceMappingURL=pmi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pmi.js","sourceRoot":"","sources":["../../src/query/pmi.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,GAErB,MAAM,aAAa,CAAC;AAIrB,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB,EAAE,KAAwB;IAC3E,OAAO,aAAa,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QAC7C,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,cAAc,EAAE,CAAC;QAC1C,IAAI,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;QAEtC,iBAAiB;QACjB,IAAI,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAChD,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACzD,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,EAAE,eAAe,IAAI,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7E,MAAM,MAAM,GAAG,IAAI,GAAG,CAAS,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;YAC7D,QAAQ,GAAG,QAAQ,CAAC,MAAM,CACxB,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,IAAI,KAAK,qBAAqB;gBAChC,gBAAgB,IAAI,CAAC;gBACrB,MAAM,CAAC,GAAG,CAAE,CAAwB,CAAC,cAAc,CAAC,CACvD,CAAC;QACJ,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,SAAS,EAAE,CAAC;YAC1C,QAAQ,GAAG,QAAQ,CAAC,MAAM,CACxB,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,MAAO,CAAC,SAAU,CAC/E,CAAC;QACJ,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,SAAS,EAAE,CAAC;YAC1C,QAAQ,GAAG,QAAQ,CAAC,MAAM,CACxB,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,MAAO,CAAC,SAAU,CAC/E,CAAC;QACJ,CAAC;QAED,WAAW;QACX,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACrD,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACrB,IAAI,GAAG,GAAG,CAAC,CAAC;gBACZ,QAAQ,KAAK,CAAC,IAAK,CAAC,EAAE,EAAE,CAAC;oBACvB,KAAK,MAAM;wBACT,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;wBACnC,MAAM;oBACR,KAAK,OAAO;wBACV,GAAG;4BACD,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAE,CAAwB,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gCAC3D,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAE,CAAwB,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC9D,MAAM;oBACR,KAAK,gBAAgB,CAAC,CAAC,CAAC;wBACtB,MAAM,IAAI,GACR,CAAC,CAAC,IAAI,KAAK,qBAAqB,CAAC,CAAC,CAAE,CAAwB,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;wBACnF,MAAM,IAAI,GACR,CAAC,CAAC,IAAI,KAAK,qBAAqB,CAAC,CAAC,CAAE,CAAwB,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;wBACnF,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;wBAC/B,MAAM;oBACR,CAAC;gBACH,CAAC;gBACD,OAAO,GAAG,GAAG,GAAG,CAAC;YACnB,CAAC,CAAC,CAAC;QACL,CAAC;QAED,YAAY;QACZ,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,IAAI,UAAU,CAAC;QACnD,IAAI,MAAM,GAAoB,EAAE,CAAC;QAEjC,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkE,CAAC;YAE1F,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;gBAC9B,MAAM,GAAG,GAA4B,EAAE,CAAC;gBACxC,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;oBAC1B,QAAQ,GAAG,EAAE,CAAC;wBACZ,KAAK,MAAM;4BACT,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;4BACvB,MAAM;wBACR,KAAK,gBAAgB;4BACnB,IAAI,MAAM,CAAC,IAAI,KAAK,qBAAqB,EAAE,CAAC;gCAC1C,GAAG,CAAC,cAAc,GAAI,MAA6B,CAAC,cAAc,CAAC;4BACrE,CAAC;iCAAM,CAAC;gCACN,GAAG,CAAC,cAAc,GAAG,IAAI,CAAC;4BAC5B,CAAC;4BACD,MAAM;wBACR,KAAK,gBAAgB;4BACnB,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gCAChC,GAAG,CAAC,cAAc,GAAI,MAA6B,CAAC,cAAc,CAAC;4BACrE,CAAC;iCAAM,CAAC;gCACN,GAAG,CAAC,cAAc,GAAG,IAAI,CAAC;4BAC5B,CAAC;4BACD,MAAM;wBACR,KAAK,oBAAoB;4BACvB,IAAI,MAAM,CAAC,IAAI,KAAK,qBAAqB,EAAE,CAAC;gCAC1C,GAAG,CAAC,kBAAkB,GAAI,MAA6B,CAAC,kBAAkB,CAAC;4BAC7E,CAAC;iCAAM,CAAC;gCACN,GAAG,CAAC,kBAAkB,GAAG,IAAI,CAAC;4BAChC,CAAC;4BACD,MAAM;oBACV,CAAC;gBACH,CAAC;gBACD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1D,IAAI,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACjC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,MAAM,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;oBAC9B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAC9B,CAAC;gBACD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC9B,CAAC;YAED,MAAM,WAAW,GAAG,oBAAoB,CAAC,mBAAmB,CAAC;YAC7D,IAAI,QAAQ,GAAG,CAAC,CAAC;YACjB,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC5C,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;gBACjD,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;gBAC1C,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,IAAI,WAAW,CAAC;gBAC7C,OAAO;oBACL,EAAE,EAAE,SAAS,QAAQ,EAAE,EAAE;oBACzB,GAAG,EAAE,MAAM,CAAC,GAAG;oBACf,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM;oBACnC,UAAU,EAAE,GAAG;oBACf,iBAAiB,EAAE,OAAO;oBAC1B,mBAAmB,EAAE,WAAW;oBAChC,kBAAkB,EAAE,UAAU;oBAC9B,OAAO,EAAE,EAA6B;iBACvC,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC;QACzD,CAAC;QAED,cAAc;QACd,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,mBAAmB,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACzE,MAAM,SAAS,GAAG,UAAU,KAAK,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAE1F,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QAEtF,cAAc;QACd,MAAM,MAAM,GAA2B,EAAE,CAAC;QAC1C,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAClC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC7C,CAAC;QAED,OAAO,mBAAmB,CACxB,QAAQ,EACR;YACE,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,EAAE;YAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,IAAI;YAChC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,IAAI;YACxB,WAAW,EAAE,UAAU;YACvB,KAAK;YACL,MAAM;SACP,EACD,UAAU,EACV,SAAkB,EAClB;YACE,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM;YACnC,WAAW,EAAE,QAAQ,CAAC,MAAM;YAC5B,GAAG,MAAM;SACV,EACD,MAAM,EACN,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;YAC5B,CAAC,CAAC;gBACE,6FAA6F;aAC9F;YACH,CAAC,CAAC,EAAE,EACN,EAAE,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,74 @@
1
+ import type { StepQueryResponse, StepQueryPagination, StepQueryUnits, StepQueryCoordinateSystem } from '../tools/step-tools.js';
2
+ /**
3
+ * Shared query utilities for pagination, filtering, sorting, and response envelopes.
4
+ */
5
+ export declare const DEFAULT_QUERY_LIMITS: {
6
+ readonly limit: 100;
7
+ readonly offset: 0;
8
+ readonly sample_entity_limit: 5;
9
+ readonly max_page_size: 1000;
10
+ };
11
+ /**
12
+ * Hardcoded bucket widths for continuous-value grouping.
13
+ * Single source of truth; the model does not control these.
14
+ */
15
+ export declare const GROUP_BUCKETS: {
16
+ magnitude_bins: number[];
17
+ radius_step: number;
18
+ axis_snap_degrees: number;
19
+ };
20
+ /**
21
+ * Bucket a continuous magnitude (length, area, depth) into a labelled range
22
+ * using fixed log-scale bins. Returns a stable string key like "10-100".
23
+ */
24
+ export declare function magnitudeBucketKey(value: number): string;
25
+ /**
26
+ * Bucket a radius or diameter by rounding to the nearest fixed step.
27
+ * Returns the rounded numeric value (used directly as the group key).
28
+ */
29
+ export declare function radiusBucketValue(value: number): number;
30
+ /**
31
+ * Snap a direction vector to the nearest principal axis (+X..-Z) when within
32
+ * the axis-snap tolerance; otherwise return "off-axis". Keys are stable strings.
33
+ */
34
+ export declare function axisDirectionKey(direction: number[]): string;
35
+ /**
36
+ * A computed group of entities sharing a key across one or more dimensions.
37
+ */
38
+ export interface ComputedGroup {
39
+ id: string;
40
+ key: Record<string, unknown>;
41
+ entity_count: number;
42
+ entity_ids: string[];
43
+ sample_entity_ids: string[];
44
+ sample_entity_limit: number;
45
+ sample_is_complete: boolean;
46
+ summary: Record<string, unknown>;
47
+ }
48
+ /**
49
+ * Group entities deterministically by a composite key derived from each
50
+ * requested dimension. Groups are sorted by descending entity count, then by
51
+ * key for stable ordering. Each group includes bounded sample entity IDs.
52
+ */
53
+ export declare function groupEntities<T extends {
54
+ id: string;
55
+ }>(entities: T[], dimensions: string[], keyOf: (entity: T, dimension: string) => unknown, sampleLimit: number, summarize?: (members: T[]) => Record<string, unknown>): ComputedGroup[];
56
+ export declare function normalizePagination(limit: number | undefined, offset: number | undefined): {
57
+ limit: number;
58
+ offset: number;
59
+ };
60
+ export declare function createPagination(limit: number, offset: number, returned: number, total_matched: number): StepQueryPagination;
61
+ export declare const STEP_QUERY_UNITS: StepQueryUnits;
62
+ export declare const STEP_QUERY_COORDINATE_SYSTEM: StepQueryCoordinateSystem;
63
+ /**
64
+ * Build a query response envelope.
65
+ */
66
+ export declare function createQueryResponse<T extends Record<string, unknown>>(file_path: string, query: Record<string, unknown>, pagination: StepQueryPagination, entities: T[], statistics?: Record<string, unknown>, groups?: ComputedGroup[], warnings?: unknown[], limitations?: unknown[]): StepQueryResponse<T>;
67
+ /**
68
+ * Sample entity IDs from a larger set, deterministically.
69
+ */
70
+ export declare function sampleEntityIds(entity_ids: string[], sample_limit: number): {
71
+ sampled: string[];
72
+ is_complete: boolean;
73
+ };
74
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/query/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,yBAAyB,EAC1B,MAAM,wBAAwB,CAAC;AAIhC;;GAEG;AAEH,eAAO,MAAM,oBAAoB;;;;;CAKvB,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE;IAC1B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;CAU3B,CAAC;AAEF;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOxD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,CAqB5D;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,EACpD,QAAQ,EAAE,CAAC,EAAE,EACb,UAAU,EAAE,MAAM,EAAE,EACpB,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,EAChD,WAAW,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACpD,aAAa,EAAE,CAsCjB;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAKnC;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GACpB,mBAAmB,CAQrB;AAED,eAAO,MAAM,gBAAgB,EAAE,cAK9B,CAAC;AAEF,eAAO,MAAM,4BAA4B,EAAE,yBAI1C,CAAC;AAEF;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnE,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,UAAU,EAAE,mBAAmB,EAC/B,QAAQ,EAAE,CAAC,EAAE,EACb,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,MAAM,GAAE,aAAa,EAAO,EAC5B,QAAQ,GAAE,OAAO,EAAO,EACxB,WAAW,GAAE,OAAO,EAAO,GAC1B,iBAAiB,CAAC,CAAC,CAAC,CAsBtB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,MAAM,EAAE,EACpB,YAAY,EAAE,MAAM,GACnB;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,CAS7C"}