@ifc-lite/clash 1.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 (107) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +32 -0
  3. package/dist/adapters/ifcx.d.ts +44 -0
  4. package/dist/adapters/ifcx.d.ts.map +1 -0
  5. package/dist/adapters/ifcx.js +198 -0
  6. package/dist/adapters/ifcx.js.map +1 -0
  7. package/dist/adapters/step.d.ts +42 -0
  8. package/dist/adapters/step.d.ts.map +1 -0
  9. package/dist/adapters/step.js +77 -0
  10. package/dist/adapters/step.js.map +1 -0
  11. package/dist/bcf-bridge.d.ts +51 -0
  12. package/dist/bcf-bridge.d.ts.map +1 -0
  13. package/dist/bcf-bridge.js +298 -0
  14. package/dist/bcf-bridge.js.map +1 -0
  15. package/dist/deterministic-uuid.d.ts +9 -0
  16. package/dist/deterministic-uuid.d.ts.map +1 -0
  17. package/dist/deterministic-uuid.js +87 -0
  18. package/dist/deterministic-uuid.js.map +1 -0
  19. package/dist/disciplines.d.ts +33 -0
  20. package/dist/disciplines.d.ts.map +1 -0
  21. package/dist/disciplines.js +148 -0
  22. package/dist/disciplines.js.map +1 -0
  23. package/dist/engine-ts/broad.d.ts +11 -0
  24. package/dist/engine-ts/broad.d.ts.map +1 -0
  25. package/dist/engine-ts/broad.js +61 -0
  26. package/dist/engine-ts/broad.js.map +1 -0
  27. package/dist/engine-ts/index.d.ts +16 -0
  28. package/dist/engine-ts/index.d.ts.map +1 -0
  29. package/dist/engine-ts/index.js +17 -0
  30. package/dist/engine-ts/index.js.map +1 -0
  31. package/dist/engine-ts/kernel.d.ts +50 -0
  32. package/dist/engine-ts/kernel.d.ts.map +1 -0
  33. package/dist/engine-ts/kernel.js +5 -0
  34. package/dist/engine-ts/kernel.js.map +1 -0
  35. package/dist/engine-ts/narrow.d.ts +23 -0
  36. package/dist/engine-ts/narrow.d.ts.map +1 -0
  37. package/dist/engine-ts/narrow.js +127 -0
  38. package/dist/engine-ts/narrow.js.map +1 -0
  39. package/dist/engine-ts/orchestrator.d.ts +11 -0
  40. package/dist/engine-ts/orchestrator.d.ts.map +1 -0
  41. package/dist/engine-ts/orchestrator.js +127 -0
  42. package/dist/engine-ts/orchestrator.js.map +1 -0
  43. package/dist/engine-ts/tri-mesh.d.ts +33 -0
  44. package/dist/engine-ts/tri-mesh.d.ts.map +1 -0
  45. package/dist/engine-ts/tri-mesh.js +125 -0
  46. package/dist/engine-ts/tri-mesh.js.map +1 -0
  47. package/dist/engine-ts/ts-kernel.d.ts +14 -0
  48. package/dist/engine-ts/ts-kernel.d.ts.map +1 -0
  49. package/dist/engine-ts/ts-kernel.js +85 -0
  50. package/dist/engine-ts/ts-kernel.js.map +1 -0
  51. package/dist/engine-wasm/index.d.ts +21 -0
  52. package/dist/engine-wasm/index.d.ts.map +1 -0
  53. package/dist/engine-wasm/index.js +40 -0
  54. package/dist/engine-wasm/index.js.map +1 -0
  55. package/dist/engine-wasm/wasm-kernel.d.ts +20 -0
  56. package/dist/engine-wasm/wasm-kernel.d.ts.map +1 -0
  57. package/dist/engine-wasm/wasm-kernel.js +106 -0
  58. package/dist/engine-wasm/wasm-kernel.js.map +1 -0
  59. package/dist/engine.d.ts +14 -0
  60. package/dist/engine.d.ts.map +1 -0
  61. package/dist/engine.js +20 -0
  62. package/dist/engine.js.map +1 -0
  63. package/dist/exclude.d.ts +15 -0
  64. package/dist/exclude.d.ts.map +1 -0
  65. package/dist/exclude.js +38 -0
  66. package/dist/exclude.js.map +1 -0
  67. package/dist/grouping.d.ts +16 -0
  68. package/dist/grouping.d.ts.map +1 -0
  69. package/dist/grouping.js +311 -0
  70. package/dist/grouping.js.map +1 -0
  71. package/dist/index.d.ts +18 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +21 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/lifecycle.d.ts +41 -0
  76. package/dist/lifecycle.d.ts.map +1 -0
  77. package/dist/lifecycle.js +70 -0
  78. package/dist/lifecycle.js.map +1 -0
  79. package/dist/math/aabb.d.ts +27 -0
  80. package/dist/math/aabb.d.ts.map +1 -0
  81. package/dist/math/aabb.js +127 -0
  82. package/dist/math/aabb.js.map +1 -0
  83. package/dist/math/triangle-distance.d.ts +29 -0
  84. package/dist/math/triangle-distance.d.ts.map +1 -0
  85. package/dist/math/triangle-distance.js +149 -0
  86. package/dist/math/triangle-distance.js.map +1 -0
  87. package/dist/math/triangle-intersect.d.ts +13 -0
  88. package/dist/math/triangle-intersect.d.ts.map +1 -0
  89. package/dist/math/triangle-intersect.js +55 -0
  90. package/dist/math/triangle-intersect.js.map +1 -0
  91. package/dist/math/vec3.d.ts +11 -0
  92. package/dist/math/vec3.d.ts.map +1 -0
  93. package/dist/math/vec3.js +38 -0
  94. package/dist/math/vec3.js.map +1 -0
  95. package/dist/selectors.d.ts +12 -0
  96. package/dist/selectors.d.ts.map +1 -0
  97. package/dist/selectors.js +53 -0
  98. package/dist/selectors.js.map +1 -0
  99. package/dist/triage.d.ts +19 -0
  100. package/dist/triage.d.ts.map +1 -0
  101. package/dist/triage.js +99 -0
  102. package/dist/triage.js.map +1 -0
  103. package/dist/types.d.ts +145 -0
  104. package/dist/types.d.ts.map +1 -0
  105. package/dist/types.js +8 -0
  106. package/dist/types.js.map +1 -0
  107. package/package.json +72 -0
package/dist/triage.js ADDED
@@ -0,0 +1,99 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ /** System prompt instructing the LLM to act as a BIM coordination specialist. */
5
+ export function buildTriageSystemPrompt() {
6
+ return `You are a BIM coordination specialist analyzing clash detection results from an IFC model. Your job is to:
7
+
8
+ 1. Summarize the clash results concisely (2-3 sentences).
9
+ 2. Prioritize which clashes to resolve first based on:
10
+ - Severity (critical > major > minor > info)
11
+ - Impact on construction schedule and cost
12
+ - Safety implications
13
+ 3. Provide 3-5 actionable recommendations for resolving the most important clashes.
14
+ 4. Suggest which discipline team should take ownership of each recommendation.
15
+
16
+ Respond in this exact JSON format:
17
+ {
18
+ "summary": "Brief summary of clash results",
19
+ "recommendations": [
20
+ "Recommendation 1 — [DISCIPLINE] — description",
21
+ "Recommendation 2 — [DISCIPLINE] — description"
22
+ ]
23
+ }
24
+
25
+ Keep recommendations specific and actionable. Use discipline codes: ARCH, STR, MEP, HVAC, ELEC, FIRE.
26
+ Do not include any text outside the JSON.`;
27
+ }
28
+ function countSeverities(result) {
29
+ const counts = { critical: 0, major: 0, minor: 0, info: 0 };
30
+ for (const clash of result.clashes) {
31
+ counts[clash.severity] += 1;
32
+ }
33
+ return counts;
34
+ }
35
+ /** Build the user message with structured clash data for the LLM. */
36
+ export function buildTriageUserMessage(result) {
37
+ const severityCounts = countSeverities(result);
38
+ const lines = [
39
+ `## Clash Detection Results`,
40
+ ``,
41
+ `**Total clashes:** ${result.summary.total}`,
42
+ `**Tolerance:** ${result.settings.tolerance} m`,
43
+ ``,
44
+ `### Severity Breakdown`,
45
+ `- Critical: ${severityCounts.critical}`,
46
+ `- Major: ${severityCounts.major}`,
47
+ `- Minor: ${severityCounts.minor}`,
48
+ `- Info: ${severityCounts.info}`,
49
+ ``,
50
+ `### By Rule`,
51
+ ];
52
+ for (const [rule, count] of Object.entries(result.summary.byRule)) {
53
+ lines.push(`- ${rule}: ${count} clashes`);
54
+ }
55
+ lines.push(``, `### By Type Pair`);
56
+ const sortedPairs = Object.entries(result.summary.byTypePair).sort(([, a], [, b]) => b - a);
57
+ for (const [pair, count] of sortedPairs.slice(0, 15)) {
58
+ lines.push(`- ${pair}: ${count}`);
59
+ }
60
+ const important = result.clashes
61
+ .filter((c) => c.severity === 'critical' || c.severity === 'major')
62
+ .slice(0, 10);
63
+ if (important.length > 0) {
64
+ lines.push(``, `### Sample Critical/Major Clashes`);
65
+ for (const c of important) {
66
+ const aLabel = c.a.name || c.a.key.slice(0, 8);
67
+ const bLabel = c.b.name || c.b.key.slice(0, 8);
68
+ lines.push(`- [${c.severity}] ${c.a.tag} "${aLabel}" vs ${c.b.tag} "${bLabel}" — ${formatDistance(c.distance)} (rule: ${c.rule})`);
69
+ }
70
+ }
71
+ return lines.join('\n');
72
+ }
73
+ function formatDistance(distance) {
74
+ return distance < 0
75
+ ? `penetration ${Math.abs(distance).toFixed(3)} m`
76
+ : `gap ${distance.toFixed(3)} m`;
77
+ }
78
+ /** Parse the LLM's JSON response into a structured triage result. */
79
+ export function parseTriageResponse(text, result) {
80
+ const severityCounts = countSeverities(result);
81
+ const jsonMatch = text.match(/\{[\s\S]*\}/);
82
+ if (!jsonMatch) {
83
+ return { summary: text.slice(0, 500), recommendations: [], severityCounts };
84
+ }
85
+ try {
86
+ const parsed = JSON.parse(jsonMatch[0]);
87
+ return {
88
+ summary: parsed.summary ?? 'Analysis complete.',
89
+ recommendations: Array.isArray(parsed.recommendations) ? parsed.recommendations : [],
90
+ severityCounts,
91
+ };
92
+ }
93
+ catch (error) {
94
+ // Malformed JSON from the model — log, then fall back to the raw text as the summary.
95
+ console.warn('[clash/triage] failed to parse LLM JSON response; using raw text fallback', error);
96
+ return { summary: text.slice(0, 500), recommendations: [], severityCounts };
97
+ }
98
+ }
99
+ //# sourceMappingURL=triage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triage.js","sourceRoot":"","sources":["../src/triage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,145 @@
1
+ import type { AABB } from '@ifc-lite/spatial';
2
+ export type { AABB };
3
+ /** A 3-component vector `[x, y, z]`. */
4
+ export type Vec3 = [number, number, number];
5
+ /** A 4×4 transform, column-major, length 16. */
6
+ export type Mat4 = readonly number[];
7
+ /**
8
+ * What a rule looks for between two solids:
9
+ * - `hard` interpenetration (penetration depth beyond tolerance)
10
+ * - `clearance` separated but within the required gap
11
+ */
12
+ export type ClashMode = 'hard' | 'clearance';
13
+ /** How a detected clash is classified. `touch` is suppressed unless opted in. */
14
+ export type ClashStatus = 'hard' | 'clearance' | 'touch';
15
+ export type ClashSeverity = 'critical' | 'major' | 'minor' | 'info';
16
+ /**
17
+ * A representation-agnostic element fed to the clash core.
18
+ *
19
+ * Identity is deliberately split: a durable `key` (IfcGUID / USD prim path) for
20
+ * persistence, BCF, dedup and lifecycle; and a runtime `ref` (federated globalId
21
+ * / expressId) for selection and coloring in a renderer.
22
+ *
23
+ * `positions`/`indices` are world-frame triangles (the geometry-pipeline frame,
24
+ * Y-up, RTC-shifted). `transform` is identity unless positions are kept local.
25
+ */
26
+ export interface ClashElement {
27
+ key: string;
28
+ ref: number;
29
+ model: string;
30
+ tag: string;
31
+ name?: string;
32
+ storey?: string;
33
+ bounds: AABB;
34
+ positions: Float32Array;
35
+ indices: Uint32Array;
36
+ transform?: Mat4;
37
+ }
38
+ /** The element identity carried on a `Clash` (no geometry). */
39
+ export interface ClashElementRef {
40
+ key: string;
41
+ ref: number;
42
+ model: string;
43
+ tag: string;
44
+ name?: string;
45
+ }
46
+ /** A single detection rule. Omit `b` for a self-clash within selection `a`. */
47
+ export interface ClashRule {
48
+ id: string;
49
+ name: string;
50
+ /** Selector for set A (e.g. `IfcDuct*|IfcPipe*`, `!IfcSpace`). */
51
+ a: string;
52
+ /** Selector for set B. Omitted ⇒ self-clash within A. */
53
+ b?: string;
54
+ mode: ClashMode;
55
+ /** Touching band (m). Defaults to the run-level tolerance. */
56
+ tolerance?: number;
57
+ /** Required gap (m) for `clearance` mode. */
58
+ clearance?: number;
59
+ /** Explicit severity; otherwise inferred from the discipline matrix. */
60
+ severity?: ClashSeverity;
61
+ /** Emit `touch`-classified results instead of suppressing them. */
62
+ reportTouch?: boolean;
63
+ }
64
+ /** A set of rules run together (Navisworks-style clash matrix). */
65
+ export interface ClashMatrix {
66
+ rules: ClashRule[];
67
+ }
68
+ export interface ClashProgress {
69
+ phase: 'broad' | 'narrow';
70
+ rule: string;
71
+ done: number;
72
+ total: number;
73
+ }
74
+ /** A precomputed set of element-`key` pairs to skip (voids/hosts/assemblies). */
75
+ export type ExclusionSet = Set<string>;
76
+ export interface ClashSettings {
77
+ /** Default touching band (m). */
78
+ tolerance?: number;
79
+ /** Apply `exclusions` (voids/hosts/assemblies). Default true. */
80
+ excludeVoidsAndHosts?: boolean;
81
+ /** Pair-exclusion set from an adapter. */
82
+ exclusions?: ExclusionSet;
83
+ /**
84
+ * Safety cap on candidate pairs per rule, reported in `result.truncated`.
85
+ * This is a **TS-backend guardrail**: the WASM kernel runs every candidate pair
86
+ * in Rust and does not truncate, so when the cap would bite it returns the
87
+ * COMPLETE (uncapped) clash set rather than a truncated one. Use `backend:'ts'`
88
+ * when a deterministic cap matters. Defaults to unlimited.
89
+ */
90
+ maxCandidatePairs?: number;
91
+ signal?: AbortSignal;
92
+ onProgress?: (p: ClashProgress) => void;
93
+ }
94
+ export interface Clash {
95
+ /** Stable id: derived from the two durable keys + rule id. */
96
+ id: string;
97
+ a: ClashElementRef;
98
+ b: ClashElementRef;
99
+ rule: string;
100
+ status: ClashStatus;
101
+ /** Signed: `<0` penetration depth, `>0` gap. */
102
+ distance: number;
103
+ /** True contact point (hard) or closest-point midpoint (clearance/touch). */
104
+ point: Vec3;
105
+ /** Overlap region (hard) or closest-segment box (clearance/touch). */
106
+ bounds: AABB;
107
+ severity: ClashSeverity;
108
+ }
109
+ export interface ClashSummary {
110
+ total: number;
111
+ byRule: Record<string, number>;
112
+ byTypePair: Record<string, number>;
113
+ bySeverity: Record<ClashSeverity, number>;
114
+ byStorey?: Record<string, number>;
115
+ }
116
+ export interface ClashResult {
117
+ clashes: Clash[];
118
+ summary: ClashSummary;
119
+ /** Present only when a cap dropped work — never silent. */
120
+ truncated?: {
121
+ reason: string;
122
+ droppedPairs: number;
123
+ };
124
+ rulesRun: ClashRule[];
125
+ settings: {
126
+ tolerance: number;
127
+ excludeVoidsAndHosts: boolean;
128
+ };
129
+ }
130
+ /** A cluster of related clashes — the unit of a single BCF topic (Phase 2). */
131
+ export interface ClashGroup {
132
+ id: string;
133
+ title: string;
134
+ members: Clash[];
135
+ bounds: AABB;
136
+ representativePoint: Vec3;
137
+ severity: ClashSeverity;
138
+ discipline?: string;
139
+ storey?: string;
140
+ }
141
+ export declare const DEFAULT_CLASH_SETTINGS: {
142
+ readonly tolerance: 0.002;
143
+ readonly excludeVoidsAndHosts: true;
144
+ };
145
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAE9C,YAAY,EAAE,IAAI,EAAE,CAAC;AAErB,wCAAwC;AACxC,MAAM,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAE5C,gDAAgD;AAChD,MAAM,MAAM,IAAI,GAAG,SAAS,MAAM,EAAE,CAAC;AAErC;;;;GAIG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,WAAW,CAAC;AAE7C,iFAAiF;AACjF,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,WAAW,GAAG,OAAO,CAAC;AAEzD,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;AAEpE;;;;;;;;;GASG;AACH,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,IAAI,CAAC;IACb,SAAS,EAAE,YAAY,CAAC;IACxB,OAAO,EAAE,WAAW,CAAC;IACrB,SAAS,CAAC,EAAE,IAAI,CAAC;CAClB;AAED,+DAA+D;AAC/D,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,+EAA+E;AAC/E,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,CAAC,EAAE,MAAM,CAAC;IACV,yDAAyD;IACzD,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,SAAS,CAAC;IAChB,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,mEAAmE;IACnE,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,mEAAmE;AACnE,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,iFAAiF;AACjF,MAAM,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;AAEvC,MAAM,WAAW,aAAa;IAC5B,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,0CAA0C;IAC1C,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B;;;;;;OAMG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;CACzC;AAED,MAAM,WAAW,KAAK;IACpB,8DAA8D;IAC9D,EAAE,EAAE,MAAM,CAAC;IACX,CAAC,EAAE,eAAe,CAAC;IACnB,CAAC,EAAE,eAAe,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,CAAC;IACpB,gDAAgD;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,KAAK,EAAE,IAAI,CAAC;IACZ,sEAAsE;IACtE,MAAM,EAAE,IAAI,CAAC;IACb,QAAQ,EAAE,aAAa,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,KAAK,EAAE,CAAC;IACjB,OAAO,EAAE,YAAY,CAAC;IACtB,2DAA2D;IAC3D,SAAS,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IACrD,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,QAAQ,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,oBAAoB,EAAE,OAAO,CAAA;KAAE,CAAC;CAChE;AAED,+EAA+E;AAC/E,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,KAAK,EAAE,CAAC;IACjB,MAAM,EAAE,IAAI,CAAC;IACb,mBAAmB,EAAE,IAAI,CAAC;IAC1B,QAAQ,EAAE,aAAa,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,sBAAsB;;;CAGzB,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,8 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ export const DEFAULT_CLASH_SETTINGS = {
5
+ tolerance: 0.002,
6
+ excludeVoidsAndHosts: true,
7
+ };
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AA0J/D,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,SAAS,EAAE,KAAK;IAChB,oBAAoB,EAAE,IAAI;CAClB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,72 @@
1
+ {
2
+ "name": "@ifc-lite/clash",
3
+ "version": "1.1.0",
4
+ "description": "Clash detection for IFC-Lite — representation-agnostic core engine + source adapters",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ },
13
+ "./step": {
14
+ "import": "./dist/adapters/step.js",
15
+ "types": "./dist/adapters/step.d.ts"
16
+ },
17
+ "./ifcx": {
18
+ "import": "./dist/adapters/ifcx.js",
19
+ "types": "./dist/adapters/ifcx.d.ts"
20
+ },
21
+ "./bcf": {
22
+ "import": "./dist/bcf-bridge.js",
23
+ "types": "./dist/bcf-bridge.d.ts"
24
+ },
25
+ "./wasm": {
26
+ "import": "./dist/engine-wasm/index.js",
27
+ "types": "./dist/engine-wasm/index.d.ts"
28
+ }
29
+ },
30
+ "dependencies": {
31
+ "@ifc-lite/spatial": "^1.14.6",
32
+ "@ifc-lite/geometry": "^2.1.0",
33
+ "@ifc-lite/parser": "^3.0.0",
34
+ "@ifc-lite/bcf": "^1.15.4",
35
+ "@ifc-lite/ifcx": "^2.1.2",
36
+ "@ifc-lite/query": "^1.14.8",
37
+ "@ifc-lite/wasm": "^2.1.2"
38
+ },
39
+ "devDependencies": {
40
+ "typescript": "^6.0.3",
41
+ "vitest": "^1.6.0"
42
+ },
43
+ "license": "MPL-2.0",
44
+ "author": "Louis True",
45
+ "repository": {
46
+ "type": "git",
47
+ "url": "https://github.com/LTplus-AG/ifc-lite.git",
48
+ "directory": "packages/clash"
49
+ },
50
+ "homepage": "https://ltplus-ag.github.io/ifc-lite/",
51
+ "bugs": "https://github.com/LTplus-AG/ifc-lite/issues",
52
+ "keywords": [
53
+ "ifc",
54
+ "bim",
55
+ "clash",
56
+ "clash-detection",
57
+ "coordination",
58
+ "aec"
59
+ ],
60
+ "publishConfig": {
61
+ "access": "public"
62
+ },
63
+ "files": [
64
+ "dist",
65
+ "README.md"
66
+ ],
67
+ "scripts": {
68
+ "build": "pnpm exec tsc",
69
+ "dev": "pnpm exec tsc --watch",
70
+ "test": "vitest run"
71
+ }
72
+ }