@faicad/faijs 0.13.2 → 0.14.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (285) hide show
  1. package/dist/api/api-namespace.d.ts.map +1 -1
  2. package/dist/api/api-namespace.js +30 -4
  3. package/dist/api/api-namespace.js.map +1 -1
  4. package/dist/api/boolean.d.ts +19 -0
  5. package/dist/api/boolean.d.ts.map +1 -1
  6. package/dist/api/boolean.js +51 -10
  7. package/dist/api/boolean.js.map +1 -1
  8. package/dist/api/chamfer.d.ts.map +1 -1
  9. package/dist/api/chamfer.js +8 -7
  10. package/dist/api/chamfer.js.map +1 -1
  11. package/dist/api/compound-geom.d.ts +45 -0
  12. package/dist/api/compound-geom.d.ts.map +1 -0
  13. package/dist/api/compound-geom.js +85 -0
  14. package/dist/api/compound-geom.js.map +1 -0
  15. package/dist/api/compound.d.ts +2 -0
  16. package/dist/api/compound.d.ts.map +1 -1
  17. package/dist/api/compound.js +2 -0
  18. package/dist/api/compound.js.map +1 -1
  19. package/dist/api/copy.d.ts +1 -0
  20. package/dist/api/copy.d.ts.map +1 -1
  21. package/dist/api/copy.js +4 -2
  22. package/dist/api/copy.js.map +1 -1
  23. package/dist/api/edge-ref.d.ts.map +1 -1
  24. package/dist/api/edge-ref.js +7 -4
  25. package/dist/api/edge-ref.js.map +1 -1
  26. package/dist/api/engrave.d.ts.map +1 -1
  27. package/dist/api/engrave.js +1 -0
  28. package/dist/api/engrave.js.map +1 -1
  29. package/dist/api/extrude.d.ts.map +1 -1
  30. package/dist/api/extrude.js +131 -3
  31. package/dist/api/extrude.js.map +1 -1
  32. package/dist/api/face-ref.d.ts.map +1 -1
  33. package/dist/api/face-ref.js +7 -4
  34. package/dist/api/face-ref.js.map +1 -1
  35. package/dist/api/fai_drill.d.ts +1 -1
  36. package/dist/api/fai_drill.d.ts.map +1 -1
  37. package/dist/api/fai_drill.js +31 -18
  38. package/dist/api/fai_drill.js.map +1 -1
  39. package/dist/api/fai_extrude.d.ts +1 -1
  40. package/dist/api/fai_extrude.d.ts.map +1 -1
  41. package/dist/api/fai_extrude.js +2 -1
  42. package/dist/api/fai_extrude.js.map +1 -1
  43. package/dist/api/fai_split.d.ts +1 -1
  44. package/dist/api/fai_split.d.ts.map +1 -1
  45. package/dist/api/fai_split.js +2 -1
  46. package/dist/api/fai_split.js.map +1 -1
  47. package/dist/api/fillet.d.ts.map +1 -1
  48. package/dist/api/fillet.js +6 -5
  49. package/dist/api/fillet.js.map +1 -1
  50. package/dist/api/generated/operations.js +16 -16
  51. package/dist/api/generated/operations.js.map +1 -1
  52. package/dist/api/generated/script-face-manifest.d.ts.map +1 -1
  53. package/dist/api/generated/script-face-manifest.js +0 -1
  54. package/dist/api/generated/script-face-manifest.js.map +1 -1
  55. package/dist/api/generated/script-face.d.ts +1 -4
  56. package/dist/api/generated/script-face.d.ts.map +1 -1
  57. package/dist/api/generated/script-face.js +2 -3
  58. package/dist/api/generated/script-face.js.map +1 -1
  59. package/dist/api/generated/sketching.js +1 -1
  60. package/dist/api/generated/sketching.js.map +1 -1
  61. package/dist/api/generated/topology.d.ts +0 -48
  62. package/dist/api/generated/topology.d.ts.map +1 -1
  63. package/dist/api/generated/topology.js +20 -62
  64. package/dist/api/generated/topology.js.map +1 -1
  65. package/dist/api/import-brep.d.ts +36 -0
  66. package/dist/api/import-brep.d.ts.map +1 -0
  67. package/dist/api/import-brep.js +72 -0
  68. package/dist/api/import-brep.js.map +1 -0
  69. package/dist/api/import-step.d.ts +28 -0
  70. package/dist/api/import-step.d.ts.map +1 -0
  71. package/dist/api/import-step.js +57 -0
  72. package/dist/api/import-step.js.map +1 -0
  73. package/dist/api/index.d.ts +7 -2
  74. package/dist/api/index.d.ts.map +1 -1
  75. package/dist/api/index.js +19 -5
  76. package/dist/api/index.js.map +1 -1
  77. package/dist/api/internal/compat-op.d.ts.map +1 -1
  78. package/dist/api/internal/compat-op.js +2 -1
  79. package/dist/api/internal/compat-op.js.map +1 -1
  80. package/dist/api/knurl.d.ts.map +1 -1
  81. package/dist/api/knurl.js +1 -0
  82. package/dist/api/knurl.js.map +1 -1
  83. package/dist/api/load.d.ts +3 -1
  84. package/dist/api/load.d.ts.map +1 -1
  85. package/dist/api/load.js +3 -1
  86. package/dist/api/load.js.map +1 -1
  87. package/dist/api/pattern.d.ts +32 -0
  88. package/dist/api/pattern.d.ts.map +1 -0
  89. package/dist/api/pattern.js +121 -0
  90. package/dist/api/pattern.js.map +1 -0
  91. package/dist/api/place.d.ts +35 -0
  92. package/dist/api/place.d.ts.map +1 -0
  93. package/dist/api/place.js +113 -0
  94. package/dist/api/place.js.map +1 -0
  95. package/dist/api/primitives.d.ts.map +1 -1
  96. package/dist/api/primitives.js +10 -3
  97. package/dist/api/primitives.js.map +1 -1
  98. package/dist/api/screw.d.ts.map +1 -1
  99. package/dist/api/screw.js +1 -0
  100. package/dist/api/screw.js.map +1 -1
  101. package/dist/api/sdf.d.ts.map +1 -1
  102. package/dist/api/sdf.js +1 -0
  103. package/dist/api/sdf.js.map +1 -1
  104. package/dist/api/sketch.d.ts.map +1 -1
  105. package/dist/api/sketch.js +1 -0
  106. package/dist/api/sketch.js.map +1 -1
  107. package/dist/api/split.d.ts +31 -0
  108. package/dist/api/split.d.ts.map +1 -0
  109. package/dist/api/split.js +96 -0
  110. package/dist/api/split.js.map +1 -0
  111. package/dist/api/surface/arg-spec.d.ts +9 -0
  112. package/dist/api/surface/arg-spec.d.ts.map +1 -1
  113. package/dist/api/surface/arg-spec.js +49 -30
  114. package/dist/api/surface/arg-spec.js.map +1 -1
  115. package/dist/api/svgExtrude.d.ts.map +1 -1
  116. package/dist/api/svgExtrude.js +1 -0
  117. package/dist/api/svgExtrude.js.map +1 -1
  118. package/dist/api/text.d.ts.map +1 -1
  119. package/dist/api/text.js +1 -0
  120. package/dist/api/text.js.map +1 -1
  121. package/dist/api/topo-resolve.d.ts.map +1 -1
  122. package/dist/api/topo-resolve.js +65 -3
  123. package/dist/api/topo-resolve.js.map +1 -1
  124. package/dist/api/transform.d.ts +4 -0
  125. package/dist/api/transform.d.ts.map +1 -1
  126. package/dist/api/transform.js +44 -12
  127. package/dist/api/transform.js.map +1 -1
  128. package/dist/brep/brep-ops.d.ts +34 -1
  129. package/dist/brep/brep-ops.d.ts.map +1 -1
  130. package/dist/brep/brep-ops.js +62 -22
  131. package/dist/brep/brep-ops.js.map +1 -1
  132. package/dist/brep/engine/adapters/brep-mock.d.ts.map +1 -1
  133. package/dist/brep/engine/adapters/brep-mock.js +8 -0
  134. package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
  135. package/dist/brep/engine/adapters/brepkit.d.ts.map +1 -1
  136. package/dist/brep/engine/adapters/brepkit.js +6 -1
  137. package/dist/brep/engine/adapters/brepkit.js.map +1 -1
  138. package/dist/brep/engine/adapters/occt.d.ts.map +1 -1
  139. package/dist/brep/engine/adapters/occt.js +24 -1
  140. package/dist/brep/engine/adapters/occt.js.map +1 -1
  141. package/dist/brep/engine/primitives.d.ts +17 -0
  142. package/dist/brep/engine/primitives.d.ts.map +1 -1
  143. package/dist/brep/engine/primitives.js.map +1 -1
  144. package/dist/brep/engine/types.d.ts +49 -6
  145. package/dist/brep/engine/types.d.ts.map +1 -1
  146. package/dist/brep/engine/types.js.map +1 -1
  147. package/dist/brep/export/step.d.ts.map +1 -1
  148. package/dist/brep/export/step.js +6 -1
  149. package/dist/brep/export/step.js.map +1 -1
  150. package/dist/brep/face-evolution.d.ts +78 -8
  151. package/dist/brep/face-evolution.d.ts.map +1 -1
  152. package/dist/brep/face-evolution.js +130 -17
  153. package/dist/brep/face-evolution.js.map +1 -1
  154. package/dist/brepkit-kernel/brepkitKernel.d.ts +1 -1
  155. package/dist/brepkit-kernel/brepkitKernel.d.ts.map +1 -1
  156. package/dist/brepkit-kernel/brepkitKernel.js +27 -1
  157. package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
  158. package/dist/cad-runtime/admit-compat-lib.d.ts +19 -1
  159. package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
  160. package/dist/cad-runtime/admit-compat-lib.js +21 -1
  161. package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
  162. package/dist/cad-runtime/backend-dispatch.d.ts +44 -3
  163. package/dist/cad-runtime/backend-dispatch.d.ts.map +1 -1
  164. package/dist/cad-runtime/backend-dispatch.js +46 -3
  165. package/dist/cad-runtime/backend-dispatch.js.map +1 -1
  166. package/dist/cad-runtime/browser-lib-loader.d.ts +2 -0
  167. package/dist/cad-runtime/browser-lib-loader.d.ts.map +1 -1
  168. package/dist/cad-runtime/browser-lib-loader.js +9 -1
  169. package/dist/cad-runtime/browser-lib-loader.js.map +1 -1
  170. package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
  171. package/dist/cad-runtime/direct-executor.js +14 -4
  172. package/dist/cad-runtime/direct-executor.js.map +1 -1
  173. package/dist/cad-runtime/module-registry.d.ts +3 -1
  174. package/dist/cad-runtime/module-registry.d.ts.map +1 -1
  175. package/dist/cad-runtime/module-registry.js +13 -1
  176. package/dist/cad-runtime/module-registry.js.map +1 -1
  177. package/dist/cad-runtime/ports.d.ts +7 -0
  178. package/dist/cad-runtime/ports.d.ts.map +1 -1
  179. package/dist/cad-runtime/ports.js.map +1 -1
  180. package/dist/cad-runtime/runtime-concurrent-error.d.ts +38 -0
  181. package/dist/cad-runtime/runtime-concurrent-error.d.ts.map +1 -0
  182. package/dist/cad-runtime/runtime-concurrent-error.js +43 -0
  183. package/dist/cad-runtime/runtime-concurrent-error.js.map +1 -0
  184. package/dist/cad-runtime/runtime.d.ts +54 -2
  185. package/dist/cad-runtime/runtime.d.ts.map +1 -1
  186. package/dist/cad-runtime/runtime.js +186 -10
  187. package/dist/cad-runtime/runtime.js.map +1 -1
  188. package/dist/define-op.d.ts +22 -0
  189. package/dist/define-op.d.ts.map +1 -1
  190. package/dist/define-op.js +82 -12
  191. package/dist/define-op.js.map +1 -1
  192. package/dist/fcstd/attachment.d.ts +8 -1
  193. package/dist/fcstd/attachment.d.ts.map +1 -1
  194. package/dist/fcstd/attachment.js +7 -1
  195. package/dist/fcstd/attachment.js.map +1 -1
  196. package/dist/fcstd/build-fai-zip.d.ts.map +1 -1
  197. package/dist/fcstd/build-fai-zip.js +12 -7
  198. package/dist/fcstd/build-fai-zip.js.map +1 -1
  199. package/dist/fcstd/codegen.d.ts +10 -1
  200. package/dist/fcstd/codegen.d.ts.map +1 -1
  201. package/dist/fcstd/codegen.js +150 -48
  202. package/dist/fcstd/codegen.js.map +1 -1
  203. package/dist/fcstd/contour.d.ts.map +1 -1
  204. package/dist/fcstd/contour.js +23 -24
  205. package/dist/fcstd/contour.js.map +1 -1
  206. package/dist/fcstd/convert.d.ts +2 -18
  207. package/dist/fcstd/convert.d.ts.map +1 -1
  208. package/dist/fcstd/convert.js +35 -53
  209. package/dist/fcstd/convert.js.map +1 -1
  210. package/dist/fcstd/external-geo.d.ts +12 -1
  211. package/dist/fcstd/external-geo.d.ts.map +1 -1
  212. package/dist/fcstd/external-geo.js +15 -1
  213. package/dist/fcstd/external-geo.js.map +1 -1
  214. package/dist/fcstd/feature-translate.d.ts +21 -1
  215. package/dist/fcstd/feature-translate.d.ts.map +1 -1
  216. package/dist/fcstd/feature-translate.js +108 -6
  217. package/dist/fcstd/feature-translate.js.map +1 -1
  218. package/dist/fcstd/structural-types.d.ts +83 -0
  219. package/dist/fcstd/structural-types.d.ts.map +1 -0
  220. package/dist/fcstd/structural-types.js +116 -0
  221. package/dist/fcstd/structural-types.js.map +1 -0
  222. package/dist/index.d.ts +1 -0
  223. package/dist/index.d.ts.map +1 -1
  224. package/dist/index.js.map +1 -1
  225. package/dist/lang/determinism-scanner.d.ts +62 -0
  226. package/dist/lang/determinism-scanner.d.ts.map +1 -0
  227. package/dist/lang/determinism-scanner.js +619 -0
  228. package/dist/lang/determinism-scanner.js.map +1 -0
  229. package/dist/lang/symbol-table.generated.d.ts +7 -3
  230. package/dist/lang/symbol-table.generated.d.ts.map +1 -1
  231. package/dist/lang/symbol-table.generated.js +7 -3
  232. package/dist/lang/symbol-table.generated.js.map +1 -1
  233. package/dist/mesh/index.d.ts.map +1 -1
  234. package/dist/mesh/index.js +3 -2
  235. package/dist/mesh/index.js.map +1 -1
  236. package/dist/node-host/cli.d.ts.map +1 -1
  237. package/dist/node-host/cli.js +56 -2
  238. package/dist/node-host/cli.js.map +1 -1
  239. package/dist/runtime-state.d.ts +18 -6
  240. package/dist/runtime-state.d.ts.map +1 -1
  241. package/dist/runtime-state.js +9 -1
  242. package/dist/runtime-state.js.map +1 -1
  243. package/dist/shape.d.ts +15 -0
  244. package/dist/shape.d.ts.map +1 -1
  245. package/dist/shape.js +26 -3
  246. package/dist/shape.js.map +1 -1
  247. package/dist/topology/naming/build-naming.d.ts +14 -30
  248. package/dist/topology/naming/build-naming.d.ts.map +1 -1
  249. package/dist/topology/naming/build-naming.js +21 -54
  250. package/dist/topology/naming/build-naming.js.map +1 -1
  251. package/dist/topology/naming/capture-topo-ref.d.ts.map +1 -1
  252. package/dist/topology/naming/capture-topo-ref.js +5 -0
  253. package/dist/topology/naming/capture-topo-ref.js.map +1 -1
  254. package/dist/topology/naming/index.d.ts +3 -0
  255. package/dist/topology/naming/index.d.ts.map +1 -1
  256. package/dist/topology/naming/index.js +3 -0
  257. package/dist/topology/naming/index.js.map +1 -1
  258. package/dist/topology/naming/lineage-resolve.d.ts +80 -0
  259. package/dist/topology/naming/lineage-resolve.d.ts.map +1 -0
  260. package/dist/topology/naming/lineage-resolve.js +120 -0
  261. package/dist/topology/naming/lineage-resolve.js.map +1 -0
  262. package/dist/topology/naming/lineage.d.ts +349 -0
  263. package/dist/topology/naming/lineage.d.ts.map +1 -0
  264. package/dist/topology/naming/lineage.js +398 -0
  265. package/dist/topology/naming/lineage.js.map +1 -0
  266. package/dist/topology/naming/migrate.d.ts +41 -0
  267. package/dist/topology/naming/migrate.d.ts.map +1 -0
  268. package/dist/topology/naming/migrate.js +88 -0
  269. package/dist/topology/naming/migrate.js.map +1 -0
  270. package/dist/topology/naming/role-name.d.ts +176 -0
  271. package/dist/topology/naming/role-name.d.ts.map +1 -0
  272. package/dist/topology/naming/role-name.js +344 -0
  273. package/dist/topology/naming/role-name.js.map +1 -0
  274. package/dist/topology/naming/roles.d.ts +20 -22
  275. package/dist/topology/naming/roles.d.ts.map +1 -1
  276. package/dist/topology/naming/roles.js +51 -49
  277. package/dist/topology/naming/roles.js.map +1 -1
  278. package/dist/topology/naming/types.d.ts +65 -18
  279. package/dist/topology/naming/types.d.ts.map +1 -1
  280. package/dist/topology/naming/types.js.map +1 -1
  281. package/dist/weapp.d.ts +1 -1
  282. package/dist/weapp.d.ts.map +1 -1
  283. package/dist/weapp.js +1 -1
  284. package/dist/weapp.js.map +1 -1
  285. package/package.json +1 -1
package/dist/shape.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"shape.js","sourceRoot":"","sources":["../src/shape.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib shape — 类型化构造器 + 身份槽\n *\n *\n * 变更要点:\n * - 身份表(created / slots / shapeToName)改读全局锚点 runtime-state,\n * 使\"两份 faijs 代码\"共享同一份状态(解决 Shape 身份孤岛)。\n * - 新增 fromBrep(mesh, holder):BREP 产物一次登记句柄与面演化,\n * 库函数不再手动登记(P2 落地)。\n * - 新增 hasBrep / brepOf:引擎侧判定\"某 Shape 是否在 BREP 链上\"。\n */\n\nimport type { Shape } from './mesh/types'\nimport { getRuntimeState, registerFunctionBrep, nameOf, type ShapeSlot } from './runtime-state'\n\n// ── Shape 构造器 ──\n\n/** Discriminator for the concrete shape kinds. */\nexport type ShapeKind = 'solid' | 'shape2d' | 'curve' | 'compound'\n\n/** A solid mesh shape produced by a constructor. */\nexport interface SolidShape extends Shape {\n kind: 'solid'\n}\n\n/** A structural compound grouping a list of child shapes. */\nexport interface CompoundShape {\n kind: 'compound'\n children: Shape[]\n}\n\n/** A shape that the stdlib exports as a finished result. */\nexport type StdShape = SolidShape | CompoundShape\n\n/**\n * 实体 Shape 构造器:mesh 产物必须经此创建。\n *\n * @param mesh - the mesh shape to wrap as a solid.\n * @returns the created solid shape.\n */\nexport function solid(mesh: Shape): SolidShape {\n const s: SolidShape = { ...mesh, kind: 'solid' }\n getRuntimeState().created.add(s)\n return s\n}\n\n/**\n * BREP 产物构造器:同时登记 mesh 与 OCCT 句柄(+ 可选面演化)。\n *\n * 库函数用它替代 `solid(mesh)` + 手动登记句柄两步行:\n * ```ts\n * return fromBrep(solidToShape(kernel, resultSolid), {\n * solid: resultSolid,\n * faceEvolution: identityEvolution(kernel, resultSolid),\n * })\n * ```\n *\n * @param mesh - the mesh shape to register.\n * @param holder - the BREP holder providing the OCCT handle and optional face evolution.\n * @returns the created solid shape with the BREP handle attached.\n */\nexport function fromBrep(mesh: Shape, holder: BrepHolder): SolidShape {\n const s = solid(mesh)\n const state = getRuntimeState()\n const slot = state.slots.get(s) ?? {}\n slot.solid = holder.solid\n if (holder.faceEvolution) slot.faceEvolution = holder.faceEvolution\n if (holder.roleTable) slot.roleTable = holder.roleTable\n state.slots.set(s, slot)\n // 函数 BREP 域(§5.6):函数体内 op 产生的新句柄登记到当前域,函数返回后统一释放\n registerFunctionBrep(holder.solid)\n return s\n}\n\n/** BREP 句柄 + 面演化 + 拓扑命名 RoleTable(对应 OCCT 的 ShapeHandle)。类型为 unknown 以保持零依赖。 */\nexport interface BrepHolder {\n solid: unknown\n faceEvolution?: Map<number, number[]>\n roleTable?: unknown\n}\n\n/**\n * compound Shape 构造器:结构(层级)而非新几何。\n *\n * @param children - the child shapes to group.\n * @returns the created compound shape.\n */\nexport function compound(children: Shape[]): CompoundShape {\n const c: CompoundShape = { kind: 'compound', children }\n getRuntimeState().created.add(c)\n return c\n}\n\n/**\n * 是否为构造器产物(终端判定与 compound 检测的依据)。\n *\n * @param v - the value to test.\n * @returns true if the value was created by a shape constructor.\n */\nexport function isShape(v: unknown): v is Shape {\n return !!v && typeof v === 'object' && getRuntimeState().created.has(v)\n}\n\n/**\n * Returns true if the value is a strict compound shape created by a constructor.\n *\n * @param v - the value to test.\n * @returns true if the value is a strict compound shape.\n */\nexport function isCompound(v: unknown): v is CompoundShape {\n return isShape(v) && (v as { kind?: string }).kind === 'compound'\n}\n\n/**\n * 结构判定:是否为 compound 形态(keep-syntax §5.3 D5,对任意库函数零要求)。\n * 引擎内部的终端/消费判定用结构判定;SDK 公开的 isShape/isCompound 保持 WeakSet 严格。\n *\n * @param v - the value to test.\n * @returns true if the value has compound shape structure.\n */\nexport function isCompoundLike(v: unknown): v is CompoundShape {\n return !!v && typeof v === 'object'\n && (v as { kind?: string }).kind === 'compound'\n && Array.isArray((v as { children?: unknown }).children)\n}\n\n// ── 身份槽 ──\n\nexport type { ShapeSlot }\n\n/**\n * 读取 Shape 的身份槽(无则 undefined)。\n *\n * @param shape - the shape whose slot to read.\n * @returns the identity slot, or undefined if none is registered.\n */\nexport function getSlot(shape: object): ShapeSlot | undefined {\n return getRuntimeState().slots.get(shape)\n}\n\n/**\n * 读取或创建 Shape 的身份槽。\n *\n * @param shape - the shape whose slot to read or create.\n * @returns the shape's identity slot.\n */\nexport function ensureSlot(shape: object): ShapeSlot {\n const state = getRuntimeState()\n let slot = state.slots.get(shape)\n if (!slot) {\n slot = {}\n state.slots.set(shape, slot)\n }\n return slot\n}\n\n/**\n * 该 Shape 是否在 BREP 链上(有 OCCT 句柄)。引擎分派与 UI 查询用。\n *\n * @param shape - the shape to test.\n * @returns true if the shape has an attached OCCT handle.\n */\nexport function hasBrep(shape: Shape): boolean {\n return getRuntimeState().slots.get(shape)?.solid !== undefined\n}\n\n/**\n * 读取该 Shape 的 OCCT 句柄(无则 undefined)。库函数用前必须判空。\n *\n * @param shape - the shape whose handle to read.\n * @returns the OCCT handle, or undefined if none.\n */\nexport function brepOf(shape: Shape): unknown | undefined {\n return getRuntimeState().slots.get(shape)?.solid\n}\n\n/**\n * nameOf 批量版:Shape[] → 成员名(装配 memberNames,P6 替代读 IR)。\n *\n * @param shapes - the shapes to name.\n * @returns the member names, one per shape (empty string when unnamed).\n */\nexport function nameOfShapes(shapes: Shape[]): string[] {\n return shapes.map((s) => String(nameOf(s) ?? ''))\n}\n"]}
1
+ {"version":3,"file":"shape.js","sourceRoot":"","sources":["../src/shape.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib shape — 类型化构造器 + 身份槽\n *\n *\n * 变更要点:\n * - 身份表(created / slots / shapeToName)改读全局锚点 runtime-state,\n * 使\"两份 faijs 代码\"共享同一份状态(解决 Shape 身份孤岛)。\n * - 新增 fromBrep(mesh, holder):BREP 产物一次登记句柄与面演化,\n * 库函数不再手动登记(P2 落地)。\n * - 新增 hasBrep / brepOf:引擎侧判定\"某 Shape 是否在 BREP 链上\"。\n */\n\nimport type { Shape } from './mesh/types'\nimport { getRuntimeState, registerFunctionBrep, nameOf, getCurrentStmt, type ShapeSlot } from './runtime-state'\nimport { asStmtId } from './identity'\nimport { runtimeLineage } from './topology/naming/lineage'\n\n// ── Shape 构造器 ──\n\n/** Discriminator for the concrete shape kinds. */\nexport type ShapeKind = 'solid' | 'shape2d' | 'curve' | 'compound'\n\n/** A solid mesh shape produced by a constructor. */\nexport interface SolidShape extends Shape {\n kind: 'solid'\n}\n\n/** A structural compound grouping a list of child shapes. */\nexport interface CompoundShape {\n kind: 'compound'\n children: Shape[]\n}\n\n/** A shape that the stdlib exports as a finished result. */\nexport type StdShape = SolidShape | CompoundShape\n\n/**\n * 实体 Shape 构造器:mesh 产物必须经此创建。\n *\n * @param mesh - the mesh shape to wrap as a solid.\n * @returns the created solid shape.\n */\nexport function solid(mesh: Shape): SolidShape {\n const s: SolidShape = { ...mesh, kind: 'solid' }\n getRuntimeState().created.add(s)\n return s\n}\n\n/**\n * BREP 产物构造器:同时登记 mesh 与 OCCT 句柄(+ 可选面演化)。\n *\n * 库函数用它替代 `solid(mesh)` + 手动登记句柄两步行:\n * ```ts\n * return fromBrep(solidToShape(kernel, resultSolid), {\n * solid: resultSolid,\n * faceEvolution: identityEvolution(kernel, resultSolid),\n * })\n * ```\n *\n * @param mesh - the mesh shape to register.\n * @param holder - the BREP holder providing the OCCT handle and optional face evolution.\n * @returns the created solid shape with the BREP handle attached.\n */\nexport function fromBrep(mesh: Shape, holder: BrepHolder): SolidShape {\n const s = solid(mesh)\n const state = getRuntimeState()\n const slot = state.slots.get(s) ?? {}\n slot.solid = holder.solid\n if (holder.faceEvolution) slot.faceEvolution = holder.faceEvolution\n // 1.10 前置③:roleTable **不再写 slot**(字段已删)——权威落点是下方血缘图\n // 旁挂(语句键 + part 键),解析缓存 miss 由回走重算恢复。\n state.slots.set(s, slot)\n // 1.10 前置③:roleTable 权威旁挂(**语句键**)在血缘图。part 键的记录在\n // define-op.wrapped(impl 返回后 anchor.outputs 名字已定)——此处 shape 还未\n // 被 executor 命名,nameOf(s) 为 undefined,不能在这里记 part 键。\n const stmt = getCurrentStmt()\n if (stmt && (holder.roleTable || holder.solid !== undefined)) {\n runtimeLineage.recordOutput(\n asStmtId(stmt.id),\n holder.roleTable as ReadonlyMap<string, ReadonlyMap<string, readonly number[]>> | undefined,\n holder.solid,\n )\n }\n // 函数 BREP 域(§5.6):函数体内 op 产生的新句柄登记到当前域,函数返回后统一释放\n registerFunctionBrep(holder.solid)\n return s\n}\n\n/** BREP 句柄 + 面演化 + 拓扑命名 RoleTable(对应 OCCT 的 ShapeHandle)。类型为 unknown 以保持零依赖。 */\nexport interface BrepHolder {\n solid: unknown\n faceEvolution?: Map<number, number[]>\n /**\n * 1.10 前置③:产形 op 交付 role 表的唯一入口。fromBrep 把它**旁挂到血缘图**\n * (语句键 + part 键);slot 侧的缓存存储已删(ShapeSlot 不再有该字段)。\n */\n roleTable?: unknown\n}\n\n/**\n * compound Shape 构造器:结构(层级)而非新几何。\n *\n * @param children - the child shapes to group.\n * @returns the created compound shape.\n */\nexport function compound(children: Shape[]): CompoundShape {\n const c: CompoundShape = { kind: 'compound', children }\n getRuntimeState().created.add(c)\n return c\n}\n\n/**\n * 是否为构造器产物(终端判定与 compound 检测的依据)。\n *\n * @param v - the value to test.\n * @returns true if the value was created by a shape constructor.\n */\nexport function isShape(v: unknown): v is Shape {\n return !!v && typeof v === 'object' && getRuntimeState().created.has(v)\n}\n\n/**\n * Returns true if the value is a strict compound shape created by a constructor.\n *\n * @param v - the value to test.\n * @returns true if the value is a strict compound shape.\n */\nexport function isCompound(v: unknown): v is CompoundShape {\n return isShape(v) && (v as { kind?: string }).kind === 'compound'\n}\n\n/**\n * 结构判定:是否为 compound 形态(keep-syntax §5.3 D5,对任意库函数零要求)。\n * 引擎内部的终端/消费判定用结构判定;SDK 公开的 isShape/isCompound 保持 WeakSet 严格。\n *\n * @param v - the value to test.\n * @returns true if the value has compound shape structure.\n */\nexport function isCompoundLike(v: unknown): v is CompoundShape {\n return !!v && typeof v === 'object'\n && (v as { kind?: string }).kind === 'compound'\n && Array.isArray((v as { children?: unknown }).children)\n}\n\n// ── 身份槽 ──\n\nexport type { ShapeSlot }\n\n/**\n * 读取 Shape 的身份槽(无则 undefined)。\n *\n * @param shape - the shape whose slot to read.\n * @returns the identity slot, or undefined if none is registered.\n */\nexport function getSlot(shape: object): ShapeSlot | undefined {\n return getRuntimeState().slots.get(shape)\n}\n\n/**\n * 读取或创建 Shape 的身份槽。\n *\n * @param shape - the shape whose slot to read or create.\n * @returns the shape's identity slot.\n */\nexport function ensureSlot(shape: object): ShapeSlot {\n const state = getRuntimeState()\n let slot = state.slots.get(shape)\n if (!slot) {\n slot = {}\n state.slots.set(shape, slot)\n }\n return slot\n}\n\n/**\n * 读输入 Shape 的 roleTable(op 实现读**输入**表的唯一读口,1.10 前置③)。\n *\n * 语义 = 旧 `getSlot(shape)?.roleTable`:权威落点在血缘图的 part 键旁挂\n * (上一条语句 fromBrep 时记录),slot 缓存字段已删除。未记录 → undefined\n * (mesh 产物 / 无命名)。\n *\n * @param shape - the input shape whose role table to read.\n * @returns the role table (unknown — callers assert their table type), or undefined.\n */\nexport function inputRoleTable(shape: object): unknown | undefined {\n const name = nameOf(shape)\n return name ? runtimeLineage.tableOfPart(name) : undefined\n}\n\n/**\n * 该 Shape 是否在 BREP 链上(有 OCCT 句柄)。引擎分派与 UI 查询用。\n *\n * @param shape - the shape to test.\n * @returns true if the shape has an attached OCCT handle.\n */\nexport function hasBrep(shape: Shape): boolean {\n return getRuntimeState().slots.get(shape)?.solid !== undefined\n}\n\n/**\n * 读取该 Shape 的 OCCT 句柄(无则 undefined)。库函数用前必须判空。\n *\n * @param shape - the shape whose handle to read.\n * @returns the OCCT handle, or undefined if none.\n */\nexport function brepOf(shape: Shape): unknown | undefined {\n return getRuntimeState().slots.get(shape)?.solid\n}\n\n/**\n * nameOf 批量版:Shape[] → 成员名(装配 memberNames,P6 替代读 IR)。\n *\n * @param shapes - the shapes to name.\n * @returns the member names, one per shape (empty string when unnamed).\n */\nexport function nameOfShapes(shapes: Shape[]): string[] {\n return shapes.map((s) => String(nameOf(s) ?? ''))\n}\n"]}
@@ -4,14 +4,12 @@
4
4
  * 从「part 的面行 + RoleTable」生成 FaceNaming/EdgeNaming 命名行,供宿主 O(1)
5
5
  * 反查(拾取序号 → 命名行 → captureTopoRef)。序号(1起) ↔ 数组下标。
6
6
  *
7
- * - BREP:roleTable + roleOfOrdinal 反查每个面的 {origin, role}(布尔合流后
8
- * 一张表可能含多个 origin,逐 origin 反查);hint 取自面行(与 BREP 现场
9
- * 同口径,见 geom-hint.ts)。
10
- * - primitive:role 由固定面序的语义命名器给出(M4 §5.2 接入;本函数留
11
- * primitiveRoles 参数,M4 填充)。
12
- * - mesh:只填 hint、role=''、origin=该 part(§5.3:只能几何兜底)。
7
+ * Phase 1.6/1.7 换型(§4.1/§4.2):
8
+ * - RoleTable 外层键与 naming 行的 origin 一律是 **StmtId**(不再 PartName)。
9
+ * - role 是 RoleName 的线格式串(无 'box:' 前缀)。
10
+ * - **无身份面显式 `role: null`**——`''` 静默兜底已删(G6);mesh 来源只填 hint。
13
11
  */
14
- import type { PartName } from '../../identity.js';
12
+ import type { StmtId, PartName } from '../../identity.js';
15
13
  import type { RoleTable, PartNaming } from './types.js';
16
14
  /** 面的源行数据(FaceRow 子集,够生成 hint + 反查)。axis 为宿主注入的轴快照(装配轴约束用)。 */
17
15
  export interface NamingFaceRow {
@@ -36,52 +34,38 @@ export interface NamingEdgeRow {
36
34
  /** 生成 PartNaming 的输入。 */
37
35
  export interface PartNamingInput {
38
36
  readonly source: 'brep' | 'primitive' | 'mesh';
39
- /** 该 part 变量名(mesh/primitive 的 origin 兜底;BREP 用 role 的 origin)。 */
37
+ /** 该 part 变量名(仅 UI 显示兜底用;身份一律走 roleTable 的 StmtId)。 */
40
38
  readonly partName: PartName;
41
39
  /** 面命名源行(序号 1 起 ↔ 数组下标 0 起)。 */
42
40
  readonly faces: readonly NamingFaceRow[];
43
41
  /** 边命名源行(序号 1 起 ↔ 数组下标 0 起)。 */
44
42
  readonly edges: readonly NamingEdgeRow[];
45
- /** BREP:RoleTable(可能多 origin);mesh/primitive 缺省。 */
43
+ /** BREP:RoleTable(可能多 origin,键=StmtId);mesh/primitive 缺省。 */
46
44
  readonly roleTable?: RoleTable;
47
45
  /** BREP:subShapeHashes(shape,'face'),序号 → hash 对照(roleOfOrdinal 用)。 */
48
46
  readonly ordinalToHash?: readonly number[];
49
- /** primitive:按固定面序的语义 role(M4 填充);缺省 → role=''。 */
50
- readonly primitiveRoles?: readonly string[];
51
47
  /** 每条边的两邻面序号(1 起;来自 manifest faceEdgeRows/edgeFaceRows)。mesh 无邻接 → undefined。 */
52
48
  readonly edgeFaceOrdinals?: ReadonlyArray<readonly [number, number] | null>;
53
49
  }
54
50
  /**
55
51
  * 逐 origin 反查一个面的 {origin, role}(布尔合流后 RoleTable 含多个 origin)。
56
52
  *
57
- * @param table - the RoleTable (may have several origins after a boolean merge).
53
+ * @param table - the RoleTable (may have several origins after a boolean merge; keys are StmtId strings).
58
54
  * @param ordinalToHash - ordinal → hash array (subShapeHashes).
59
55
  * @param ordinal - the face ordinal (1-based).
60
- * @returns the owning origin and role, or undefined when no origin tracks it.
56
+ * @returns the owning origin (StmtId) and role, or undefined when no origin tracks it.
61
57
  */
62
58
  export declare function findOriginRole(table: RoleTable, ordinalToHash: readonly number[], ordinal: number): {
63
- origin: PartName;
59
+ origin: StmtId;
64
60
  role: string;
65
61
  } | undefined;
66
- /**
67
- * 为 primitive 假拓扑按面行几何命名语义 role(§5.2,与 BREP §3.2 同一套命名器)。
68
- *
69
- * primitive 无 OCCT solid,用「固定面序 + 面行几何」直接命名:
70
- * - plane + 法向主轴 → box 语义名(box:top/bottom/front/back/left/right)
71
- * - cylinder/cone/sphere 曲面 → lateral/surface 语义名
72
- * - 其余/认不出 → 位置名 `${partName}:face_${i}`(保证每面必有 role)
73
- *
74
- * 与 BREP assignRoles 的对照:cube 固定面序(+X,-X,+Y,-Y,+Z,-Z)命名一致
75
- * (f0→box:right、f1→box:left、f2→box:back、f3→box:front、f4→box:top、f5→box:bottom)。
76
- *
77
- * @param faces - the primitive's face rows (fixed enumeration order).
78
- * @param partName - the part variable name (positional-role prefix).
79
- * @returns one semantic role per face (same length as faces).
80
- */
81
- export declare function assignPrimitiveFaceRoles(faces: readonly NamingFaceRow[], partName: PartName): string[];
82
62
  /**
83
63
  * 生成一个 part 的命名数据(§3.7 ExecutionResult.naming 元素)。
84
64
  *
65
+ * Phase 1.8(D6):mesh 伪拓扑已删——primitive/mesh 来源**不再派生 role**
66
+ * (拓扑身份是 BREP 专有能力,§3);primitive 分支与 mesh 一致只填 hint。
67
+ * G6:无身份面显式 `role: null`(`''` 兜底已删)。
68
+ *
85
69
  * @param input - the part naming input.
86
70
  * @returns the PartNaming rows.
87
71
  */
@@ -1 +1 @@
1
- {"version":3,"file":"build-naming.d.ts","sourceRoot":"","sources":["../../../src/topology/naming/build-naming.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,KAAK,EAAE,SAAS,EAA0B,UAAU,EAAE,MAAM,SAAS,CAAA;AAI5E,+DAA+D;AAC/D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;IAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;IAC1C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAA;CACrH;AAED,kDAAkD;AAClD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;IAC1C,QAAQ,CAAC,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAA;CACrH;AAED,yBAAyB;AACzB,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,CAAA;IAC9C,mEAAmE;IACnE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;IAC3B,gCAAgC;IAChC,QAAQ,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,CAAA;IACxC,gCAAgC;IAChC,QAAQ,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,CAAA;IACxC,oDAAoD;IACpD,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAA;IAC9B,uEAAuE;IACvE,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC1C,mDAAmD;IACnD,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC3C,iFAAiF;IACjF,QAAQ,CAAC,gBAAgB,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,CAAA;CAC5E;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,SAAS,EAChB,aAAa,EAAE,SAAS,MAAM,EAAE,EAChC,OAAO,EAAE,MAAM,GACd;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAMhD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,SAAS,aAAa,EAAE,EAC/B,QAAQ,EAAE,QAAQ,GACjB,MAAM,EAAE,CAaV;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,GAAG,UAAU,CAqClE"}
1
+ {"version":3,"file":"build-naming.d.ts","sourceRoot":"","sources":["../../../src/topology/naming/build-naming.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACtD,OAAO,KAAK,EAAE,SAAS,EAA0B,UAAU,EAAiB,MAAM,SAAS,CAAA;AAI3F,+DAA+D;AAC/D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;IAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;IAC1C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAA;CACrH;AAED,kDAAkD;AAClD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;IAC1C,QAAQ,CAAC,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAA;CACrH;AAED,yBAAyB;AACzB,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,CAAA;IAC9C,uDAAuD;IACvD,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;IAC3B,gCAAgC;IAChC,QAAQ,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,CAAA;IACxC,gCAAgC;IAChC,QAAQ,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,CAAA;IACxC,6DAA6D;IAC7D,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAA;IAC9B,uEAAuE;IACvE,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC1C,iFAAiF;IACjF,QAAQ,CAAC,gBAAgB,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,CAAA;CAC5E;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,SAAS,EAChB,aAAa,EAAE,SAAS,MAAM,EAAE,EAChC,OAAO,EAAE,MAAM,GACd;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAM9C;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,GAAG,UAAU,CAmClE"}
@@ -4,91 +4,56 @@
4
4
  * 从「part 的面行 + RoleTable」生成 FaceNaming/EdgeNaming 命名行,供宿主 O(1)
5
5
  * 反查(拾取序号 → 命名行 → captureTopoRef)。序号(1起) ↔ 数组下标。
6
6
  *
7
- * - BREP:roleTable + roleOfOrdinal 反查每个面的 {origin, role}(布尔合流后
8
- * 一张表可能含多个 origin,逐 origin 反查);hint 取自面行(与 BREP 现场
9
- * 同口径,见 geom-hint.ts)。
10
- * - primitive:role 由固定面序的语义命名器给出(M4 §5.2 接入;本函数留
11
- * primitiveRoles 参数,M4 填充)。
12
- * - mesh:只填 hint、role=''、origin=该 part(§5.3:只能几何兜底)。
7
+ * Phase 1.6/1.7 换型(§4.1/§4.2):
8
+ * - RoleTable 外层键与 naming 行的 origin 一律是 **StmtId**(不再 PartName)。
9
+ * - role 是 RoleName 的线格式串(无 'box:' 前缀)。
10
+ * - **无身份面显式 `role: null`**——`''` 静默兜底已删(G6);mesh 来源只填 hint。
13
11
  */
14
12
  import { faceRowToHint, edgeRowToHint } from './geom-hint.js';
15
- import { roleOfOrdinal, boxRoleFromNormal } from './roles.js';
13
+ import { roleOfOrdinal } from './roles.js';
16
14
  /**
17
15
  * 逐 origin 反查一个面的 {origin, role}(布尔合流后 RoleTable 含多个 origin)。
18
16
  *
19
- * @param table - the RoleTable (may have several origins after a boolean merge).
17
+ * @param table - the RoleTable (may have several origins after a boolean merge; keys are StmtId strings).
20
18
  * @param ordinalToHash - ordinal → hash array (subShapeHashes).
21
19
  * @param ordinal - the face ordinal (1-based).
22
- * @returns the owning origin and role, or undefined when no origin tracks it.
20
+ * @returns the owning origin (StmtId) and role, or undefined when no origin tracks it.
23
21
  */
24
22
  export function findOriginRole(table, ordinalToHash, ordinal) {
25
23
  for (const [origin, roles] of table) {
26
24
  const role = roleOfOrdinal(roles, ordinalToHash, ordinal);
27
25
  if (role !== undefined)
28
- return { origin, role };
26
+ return { origin: origin, role };
29
27
  }
30
28
  return undefined;
31
29
  }
32
- /**
33
- * 为 primitive 假拓扑按面行几何命名语义 role(§5.2,与 BREP §3.2 同一套命名器)。
34
- *
35
- * primitive 无 OCCT solid,用「固定面序 + 面行几何」直接命名:
36
- * - plane + 法向主轴 → box 语义名(box:top/bottom/front/back/left/right)
37
- * - cylinder/cone/sphere 曲面 → lateral/surface 语义名
38
- * - 其余/认不出 → 位置名 `${partName}:face_${i}`(保证每面必有 role)
39
- *
40
- * 与 BREP assignRoles 的对照:cube 固定面序(+X,-X,+Y,-Y,+Z,-Z)命名一致
41
- * (f0→box:right、f1→box:left、f2→box:back、f3→box:front、f4→box:top、f5→box:bottom)。
42
- *
43
- * @param faces - the primitive's face rows (fixed enumeration order).
44
- * @param partName - the part variable name (positional-role prefix).
45
- * @returns one semantic role per face (same length as faces).
46
- */
47
- export function assignPrimitiveFaceRoles(faces, partName) {
48
- return faces.map((row, i) => {
49
- const surfaceType = row.surfaceType;
50
- const normal = row.normal;
51
- if (surfaceType === 'cylinder')
52
- return 'cylinder:lateral';
53
- if (surfaceType === 'cone')
54
- return 'cone:lateral';
55
- if (surfaceType === 'sphere')
56
- return 'sphere:surface';
57
- if (surfaceType === 'plane' && normal && normal.length === 3) {
58
- const role = boxRoleFromNormal([normal[0], normal[1], normal[2]]);
59
- if (role)
60
- return role;
61
- }
62
- return `${partName}:face_${i}`;
63
- });
64
- }
65
30
  /**
66
31
  * 生成一个 part 的命名数据(§3.7 ExecutionResult.naming 元素)。
67
32
  *
33
+ * Phase 1.8(D6):mesh 伪拓扑已删——primitive/mesh 来源**不再派生 role**
34
+ * (拓扑身份是 BREP 专有能力,§3);primitive 分支与 mesh 一致只填 hint。
35
+ * G6:无身份面显式 `role: null`(`''` 兜底已删)。
36
+ *
68
37
  * @param input - the part naming input.
69
38
  * @returns the PartNaming rows.
70
39
  */
71
40
  export function buildPartNaming(input) {
72
- const { source, partName } = input;
41
+ const { source } = input;
73
42
  const faceNaming = [];
74
43
  input.faces.forEach((row, i) => {
75
- const ordinal = i + 1;
76
44
  const hint = faceRowToHint(row);
77
45
  if (source === 'brep' && input.roleTable && input.ordinalToHash) {
78
- const found = findOriginRole(input.roleTable, input.ordinalToHash, ordinal);
46
+ const found = findOriginRole(input.roleTable, input.ordinalToHash, i + 1);
79
47
  if (found) {
80
48
  faceNaming.push({ origin: found.origin, role: found.role, hint });
81
49
  return;
82
50
  }
83
- // BREP 链上面应都被追踪;未命中 → role=''(理论不发生,显式兜底)
84
- faceNaming.push({ origin: partName, role: '', hint });
85
- return;
86
- }
87
- if (source === 'primitive' && input.primitiveRoles) {
88
- faceNaming.push({ origin: partName, role: input.primitiveRoles[i] ?? '', hint });
51
+ // BREP 链上未追踪的面:显式无身份(G6——不再伪造 role='')
52
+ faceNaming.push({ origin: null, role: null, hint });
89
53
  return;
90
54
  }
91
- faceNaming.push({ origin: partName, role: '', hint });
55
+ // primitive / mesh:拓扑身份是 BREP 专有能力(§3/D6)——只填 hint,origin/role 显式 null
56
+ faceNaming.push({ origin: null, role: null, hint });
92
57
  });
93
58
  const edgeNaming = input.edges.map((row, i) => {
94
59
  const hint = edgeRowToHint(row);
@@ -97,7 +62,9 @@ export function buildPartNaming(input) {
97
62
  const a = findOriginRole(input.roleTable, input.ordinalToHash, pair[0]);
98
63
  const b = findOriginRole(input.roleTable, input.ordinalToHash, pair[1]);
99
64
  if (a && b) {
100
- return { faces: [{ origin: a.origin, role: a.role }, { origin: b.origin, role: b.role }], hint };
65
+ const qa = { origin: a.origin, role: a.role };
66
+ const qb = { origin: b.origin, role: b.role };
67
+ return { faces: [qa, qb], hint };
101
68
  }
102
69
  }
103
70
  return { faces: null, hint };
@@ -1 +1 @@
1
- {"version":3,"file":"build-naming.js","sourceRoot":"","sources":["../../../src/topology/naming/build-naming.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * build-naming.ts — ExecutionResult.naming 生成(§3.7)\n *\n * 从「part 的面行 + RoleTable」生成 FaceNaming/EdgeNaming 命名行,供宿主 O(1)\n * 反查(拾取序号 → 命名行 → captureTopoRef)。序号(1起) ↔ 数组下标。\n *\n * - BREP:roleTable + roleOfOrdinal 反查每个面的 {origin, role}(布尔合流后\n * 一张表可能含多个 origin,逐 origin 反查);hint 取自面行(与 BREP 现场\n * 同口径,见 geom-hint.ts)。\n * - primitive:role 由固定面序的语义命名器给出(M4 §5.2 接入;本函数留\n * primitiveRoles 参数,M4 填充)。\n * - mesh:只填 hint、role=''、origin=该 part(§5.3:只能几何兜底)。\n */\n\nimport type { PartName } from '../../identity'\nimport type { RoleTable, FaceNaming, EdgeNaming, PartNaming } from './types'\nimport { faceRowToHint, edgeRowToHint } from './geom-hint'\nimport { roleOfOrdinal, boxRoleFromNormal } from './roles'\n\n/** 面的源行数据(FaceRow 子集,够生成 hint + 反查)。axis 为宿主注入的轴快照(装配轴约束用)。 */\nexport interface NamingFaceRow {\n readonly surfaceType?: string\n readonly normal?: readonly number[] | null\n readonly center?: readonly number[] | null\n readonly area?: number\n readonly axis?: { readonly origin?: readonly number[] | null; readonly direction?: readonly number[] | null } | null\n}\n\n/** 边的源行数据(EdgeRow 子集)。axis 为直边/圆边的轴快照(装配轴约束用)。 */\nexport interface NamingEdgeRow {\n readonly length?: number\n readonly center?: readonly number[] | null\n readonly axis?: { readonly origin?: readonly number[] | null; readonly direction?: readonly number[] | null } | null\n}\n\n/** 生成 PartNaming 的输入。 */\nexport interface PartNamingInput {\n readonly source: 'brep' | 'primitive' | 'mesh'\n /** 该 part 变量名(mesh/primitive 的 origin 兜底;BREP 用 role 的 origin)。 */\n readonly partName: PartName\n /** 面命名源行(序号 1 起 ↔ 数组下标 0 起)。 */\n readonly faces: readonly NamingFaceRow[]\n /** 边命名源行(序号 1 起 ↔ 数组下标 0 起)。 */\n readonly edges: readonly NamingEdgeRow[]\n /** BREP:RoleTable(可能多 origin);mesh/primitive 缺省。 */\n readonly roleTable?: RoleTable\n /** BREP:subShapeHashes(shape,'face'),序号 → hash 对照(roleOfOrdinal 用)。 */\n readonly ordinalToHash?: readonly number[]\n /** primitive:按固定面序的语义 role(M4 填充);缺省 → role=''。 */\n readonly primitiveRoles?: readonly string[]\n /** 每条边的两邻面序号(1 起;来自 manifest faceEdgeRows/edgeFaceRows)。mesh 无邻接 → undefined。 */\n readonly edgeFaceOrdinals?: ReadonlyArray<readonly [number, number] | null>\n}\n\n/**\n * 逐 origin 反查一个面的 {origin, role}(布尔合流后 RoleTable 含多个 origin)。\n *\n * @param table - the RoleTable (may have several origins after a boolean merge).\n * @param ordinalToHash - ordinal → hash array (subShapeHashes).\n * @param ordinal - the face ordinal (1-based).\n * @returns the owning origin and role, or undefined when no origin tracks it.\n */\nexport function findOriginRole(\n table: RoleTable,\n ordinalToHash: readonly number[],\n ordinal: number,\n): { origin: PartName; role: string } | undefined {\n for (const [origin, roles] of table) {\n const role = roleOfOrdinal(roles, ordinalToHash, ordinal)\n if (role !== undefined) return { origin, role }\n }\n return undefined\n}\n\n/**\n * 为 primitive 假拓扑按面行几何命名语义 role(§5.2,与 BREP §3.2 同一套命名器)。\n *\n * primitive 无 OCCT solid,用「固定面序 + 面行几何」直接命名:\n * - plane + 法向主轴 → box 语义名(box:top/bottom/front/back/left/right)\n * - cylinder/cone/sphere 曲面 → lateral/surface 语义名\n * - 其余/认不出 → 位置名 `${partName}:face_${i}`(保证每面必有 role)\n *\n * 与 BREP assignRoles 的对照:cube 固定面序(+X,-X,+Y,-Y,+Z,-Z)命名一致\n * (f0→box:right、f1→box:left、f2→box:back、f3→box:front、f4→box:top、f5→box:bottom)。\n *\n * @param faces - the primitive's face rows (fixed enumeration order).\n * @param partName - the part variable name (positional-role prefix).\n * @returns one semantic role per face (same length as faces).\n */\nexport function assignPrimitiveFaceRoles(\n faces: readonly NamingFaceRow[],\n partName: PartName,\n): string[] {\n return faces.map((row, i) => {\n const surfaceType = row.surfaceType\n const normal = row.normal\n if (surfaceType === 'cylinder') return 'cylinder:lateral'\n if (surfaceType === 'cone') return 'cone:lateral'\n if (surfaceType === 'sphere') return 'sphere:surface'\n if (surfaceType === 'plane' && normal && normal.length === 3) {\n const role = boxRoleFromNormal([normal[0], normal[1], normal[2]])\n if (role) return role\n }\n return `${partName}:face_${i}`\n })\n}\n\n/**\n * 生成一个 part 的命名数据(§3.7 ExecutionResult.naming 元素)。\n *\n * @param input - the part naming input.\n * @returns the PartNaming rows.\n */\nexport function buildPartNaming(input: PartNamingInput): PartNaming {\n const { source, partName } = input\n const faceNaming: FaceNaming[] = []\n input.faces.forEach((row, i) => {\n const ordinal = i + 1\n const hint = faceRowToHint(row)\n if (source === 'brep' && input.roleTable && input.ordinalToHash) {\n const found = findOriginRole(input.roleTable, input.ordinalToHash, ordinal)\n if (found) {\n faceNaming.push({ origin: found.origin, role: found.role, hint })\n return\n }\n // BREP 链上面应都被追踪;未命中 → role=''(理论不发生,显式兜底)\n faceNaming.push({ origin: partName, role: '', hint })\n return\n }\n if (source === 'primitive' && input.primitiveRoles) {\n faceNaming.push({ origin: partName, role: input.primitiveRoles[i] ?? '', hint })\n return\n }\n faceNaming.push({ origin: partName, role: '', hint })\n })\n\n const edgeNaming: EdgeNaming[] = input.edges.map((row, i) => {\n const hint = edgeRowToHint(row)\n const pair = input.edgeFaceOrdinals?.[i]\n if (pair && input.roleTable && input.ordinalToHash) {\n const a = findOriginRole(input.roleTable, input.ordinalToHash, pair[0])\n const b = findOriginRole(input.roleTable, input.ordinalToHash, pair[1])\n if (a && b) {\n return { faces: [{ origin: a.origin, role: a.role }, { origin: b.origin, role: b.role }], hint }\n }\n }\n return { faces: null, hint }\n })\n\n return { source, faceNaming, edgeNaming }\n}\n"]}
1
+ {"version":3,"file":"build-naming.js","sourceRoot":"","sources":["../../../src/topology/naming/build-naming.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * build-naming.ts — ExecutionResult.naming 生成(§3.7)\n *\n * 从「part 的面行 + RoleTable」生成 FaceNaming/EdgeNaming 命名行,供宿主 O(1)\n * 反查(拾取序号 → 命名行 → captureTopoRef)。序号(1起) ↔ 数组下标。\n *\n * Phase 1.6/1.7 换型(§4.1/§4.2):\n * - RoleTable 外层键与 naming 行的 origin 一律是 **StmtId**(不再 PartName)。\n * - role 是 RoleName 的线格式串(无 'box:' 前缀)。\n * - **无身份面显式 `role: null`**——`''` 静默兜底已删(G6);mesh 来源只填 hint。\n */\n\nimport type { StmtId, PartName } from '../../identity'\nimport type { RoleTable, FaceNaming, EdgeNaming, PartNaming, RoleQualifier } from './types'\nimport { faceRowToHint, edgeRowToHint } from './geom-hint'\nimport { roleOfOrdinal } from './roles'\n\n/** 面的源行数据(FaceRow 子集,够生成 hint + 反查)。axis 为宿主注入的轴快照(装配轴约束用)。 */\nexport interface NamingFaceRow {\n readonly surfaceType?: string\n readonly normal?: readonly number[] | null\n readonly center?: readonly number[] | null\n readonly area?: number\n readonly axis?: { readonly origin?: readonly number[] | null; readonly direction?: readonly number[] | null } | null\n}\n\n/** 边的源行数据(EdgeRow 子集)。axis 为直边/圆边的轴快照(装配轴约束用)。 */\nexport interface NamingEdgeRow {\n readonly length?: number\n readonly center?: readonly number[] | null\n readonly axis?: { readonly origin?: readonly number[] | null; readonly direction?: readonly number[] | null } | null\n}\n\n/** 生成 PartNaming 的输入。 */\nexport interface PartNamingInput {\n readonly source: 'brep' | 'primitive' | 'mesh'\n /** 该 part 变量名(仅 UI 显示兜底用;身份一律走 roleTable 的 StmtId)。 */\n readonly partName: PartName\n /** 面命名源行(序号 1 起 ↔ 数组下标 0 起)。 */\n readonly faces: readonly NamingFaceRow[]\n /** 边命名源行(序号 1 起 ↔ 数组下标 0 起)。 */\n readonly edges: readonly NamingEdgeRow[]\n /** BREP:RoleTable(可能多 origin,键=StmtId);mesh/primitive 缺省。 */\n readonly roleTable?: RoleTable\n /** BREP:subShapeHashes(shape,'face'),序号 → hash 对照(roleOfOrdinal 用)。 */\n readonly ordinalToHash?: readonly number[]\n /** 每条边的两邻面序号(1 起;来自 manifest faceEdgeRows/edgeFaceRows)。mesh 无邻接 → undefined。 */\n readonly edgeFaceOrdinals?: ReadonlyArray<readonly [number, number] | null>\n}\n\n/**\n * 逐 origin 反查一个面的 {origin, role}(布尔合流后 RoleTable 含多个 origin)。\n *\n * @param table - the RoleTable (may have several origins after a boolean merge; keys are StmtId strings).\n * @param ordinalToHash - ordinal → hash array (subShapeHashes).\n * @param ordinal - the face ordinal (1-based).\n * @returns the owning origin (StmtId) and role, or undefined when no origin tracks it.\n */\nexport function findOriginRole(\n table: RoleTable,\n ordinalToHash: readonly number[],\n ordinal: number,\n): { origin: StmtId; role: string } | undefined {\n for (const [origin, roles] of table) {\n const role = roleOfOrdinal(roles, ordinalToHash, ordinal)\n if (role !== undefined) return { origin: origin as StmtId, role }\n }\n return undefined\n}\n\n/**\n * 生成一个 part 的命名数据(§3.7 ExecutionResult.naming 元素)。\n *\n * Phase 1.8(D6):mesh 伪拓扑已删——primitive/mesh 来源**不再派生 role**\n * (拓扑身份是 BREP 专有能力,§3);primitive 分支与 mesh 一致只填 hint。\n * G6:无身份面显式 `role: null`(`''` 兜底已删)。\n *\n * @param input - the part naming input.\n * @returns the PartNaming rows.\n */\nexport function buildPartNaming(input: PartNamingInput): PartNaming {\n const { source } = input\n const faceNaming: FaceNaming[] = []\n input.faces.forEach((row, i) => {\n const hint = faceRowToHint(row)\n if (source === 'brep' && input.roleTable && input.ordinalToHash) {\n const found = findOriginRole(input.roleTable, input.ordinalToHash, i + 1)\n if (found) {\n faceNaming.push({ origin: found.origin, role: found.role, hint })\n return\n }\n // BREP 链上未追踪的面:显式无身份(G6——不再伪造 role='')\n faceNaming.push({ origin: null, role: null, hint })\n return\n }\n // primitive / mesh:拓扑身份是 BREP 专有能力(§3/D6)——只填 hint,origin/role 显式 null\n faceNaming.push({ origin: null, role: null, hint })\n })\n\n const edgeNaming: EdgeNaming[] = input.edges.map((row, i) => {\n const hint = edgeRowToHint(row)\n const pair = input.edgeFaceOrdinals?.[i]\n if (pair && input.roleTable && input.ordinalToHash) {\n const a = findOriginRole(input.roleTable, input.ordinalToHash, pair[0])\n const b = findOriginRole(input.roleTable, input.ordinalToHash, pair[1])\n if (a && b) {\n const qa: RoleQualifier = { origin: a.origin, role: a.role }\n const qb: RoleQualifier = { origin: b.origin, role: b.role }\n return { faces: [qa, qb], hint }\n }\n }\n return { faces: null, hint }\n })\n\n return { source, faceNaming, edgeNaming }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"capture-topo-ref.d.ts","sourceRoot":"","sources":["../../../src/topology/naming/capture-topo-ref.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAgB,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,KAAK,OAAO,EAAE,MAAM,SAAS,CAAA;AAOtF;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,UAAU,GAAG,UAAU,GAAG,OAAO,CAYpE"}
1
+ {"version":3,"file":"capture-topo-ref.d.ts","sourceRoot":"","sources":["../../../src/topology/naming/capture-topo-ref.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAgB,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,KAAK,OAAO,EAAE,MAAM,SAAS,CAAA;AAOtF;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,UAAU,GAAG,UAAU,GAAG,OAAO,CAqBpE"}
@@ -29,6 +29,11 @@ export function captureTopoRef(row) {
29
29
  }
30
30
  return { kind: 'edge', faces: row.faces, hint: row.hint };
31
31
  }
32
+ // Phase 1.6/1.8:无身份行(origin/role=null,mesh 或未追踪面)不能构造 FaceTopoRef
33
+ // ——身份字段是引用的主键,伪造空值正是被删除的静默降级(G6)。
34
+ if (row.origin === null || row.role === null) {
35
+ throw new TopoRefError('E_TOPO_NOT_FOUND', 'face', 'face naming row has no identity (mesh path or untracked face on the BREP chain)');
36
+ }
32
37
  return { kind: 'face', origin: row.origin, role: row.role, hint: row.hint };
33
38
  }
34
39
  //# sourceMappingURL=capture-topo-ref.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"capture-topo-ref.js","sourceRoot":"","sources":["../../../src/topology/naming/capture-topo-ref.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAkD,MAAM,SAAS,CAAA;AAEtF,6CAA6C;AAC7C,SAAS,YAAY,CAAC,GAA4B;IAChD,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAA;AACjC,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,cAAc,CAAC,GAA4B;IACzD,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,YAAY,CACpB,kBAAkB,EAClB,MAAM,EACN,4DAA4D,CAC7D,CAAA;QACH,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAA;IAC3D,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAA;AAC7E,CAAC","sourcesContent":["/**\n * capture-topo-ref.ts — 由命名行构造 TopoRef(§3.7 根门面导出,纯函数、不含前端状态)\n *\n * 宿主拾取到 Reference(序号)→ 经 ExecutionResult.naming 定位命名行 →\n * captureTopoRef(row) → 可直接塞进 op 参数的 TopoRef。\n * ReferenceId/ordinal 的解析与命名行定位由宿主完成(§6.1),本函数只做纯构造。\n */\n\nimport { TopoRefError, type EdgeNaming, type FaceNaming, type TopoRef } from './types'\n\n/** 结构守卫:EdgeNaming(hint.kind === 'edge')。 */\nfunction isEdgeNaming(row: FaceNaming | EdgeNaming): row is EdgeNaming {\n return row.hint.kind === 'edge'\n}\n\n/**\n * 由命名行构造 TopoRef。\n *\n * - FaceNaming → FaceTopoRef{kind:'face', origin, role, hint};\n * - EdgeNaming → EdgeTopoRef{kind:'edge', faces, hint}。\n *\n * EdgeNaming.faces 为 null(mesh 无邻接,§5.3 能力边界)时无法构造 lineage,\n * 显式抛 TopoRefError(E_TOPO_NOT_FOUND)——绝不静默产出残缺引用。\n *\n * @param row - the naming row (face or edge) to convert.\n * @returns the corresponding TopoRef.\n */\nexport function captureTopoRef(row: FaceNaming | EdgeNaming): TopoRef {\n if (isEdgeNaming(row)) {\n if (!row.faces) {\n throw new TopoRefError(\n 'E_TOPO_NOT_FOUND',\n 'edge',\n 'edge naming has no adjacent-face lineage (mesh limitation)',\n )\n }\n return { kind: 'edge', faces: row.faces, hint: row.hint }\n }\n return { kind: 'face', origin: row.origin, role: row.role, hint: row.hint }\n}\n"]}
1
+ {"version":3,"file":"capture-topo-ref.js","sourceRoot":"","sources":["../../../src/topology/naming/capture-topo-ref.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAkD,MAAM,SAAS,CAAA;AAEtF,6CAA6C;AAC7C,SAAS,YAAY,CAAC,GAA4B;IAChD,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAA;AACjC,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,cAAc,CAAC,GAA4B;IACzD,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,YAAY,CACpB,kBAAkB,EAClB,MAAM,EACN,4DAA4D,CAC7D,CAAA;QACH,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAA;IAC3D,CAAC;IACD,kEAAkE;IAClE,mCAAmC;IACnC,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QAC7C,MAAM,IAAI,YAAY,CACpB,kBAAkB,EAClB,MAAM,EACN,iFAAiF,CAClF,CAAA;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAA;AAC7E,CAAC","sourcesContent":["/**\n * capture-topo-ref.ts — 由命名行构造 TopoRef(§3.7 根门面导出,纯函数、不含前端状态)\n *\n * 宿主拾取到 Reference(序号)→ 经 ExecutionResult.naming 定位命名行 →\n * captureTopoRef(row) → 可直接塞进 op 参数的 TopoRef。\n * ReferenceId/ordinal 的解析与命名行定位由宿主完成(§6.1),本函数只做纯构造。\n */\n\nimport { TopoRefError, type EdgeNaming, type FaceNaming, type TopoRef } from './types'\n\n/** 结构守卫:EdgeNaming(hint.kind === 'edge')。 */\nfunction isEdgeNaming(row: FaceNaming | EdgeNaming): row is EdgeNaming {\n return row.hint.kind === 'edge'\n}\n\n/**\n * 由命名行构造 TopoRef。\n *\n * - FaceNaming → FaceTopoRef{kind:'face', origin, role, hint};\n * - EdgeNaming → EdgeTopoRef{kind:'edge', faces, hint}。\n *\n * EdgeNaming.faces 为 null(mesh 无邻接,§5.3 能力边界)时无法构造 lineage,\n * 显式抛 TopoRefError(E_TOPO_NOT_FOUND)——绝不静默产出残缺引用。\n *\n * @param row - the naming row (face or edge) to convert.\n * @returns the corresponding TopoRef.\n */\nexport function captureTopoRef(row: FaceNaming | EdgeNaming): TopoRef {\n if (isEdgeNaming(row)) {\n if (!row.faces) {\n throw new TopoRefError(\n 'E_TOPO_NOT_FOUND',\n 'edge',\n 'edge naming has no adjacent-face lineage (mesh limitation)',\n )\n }\n return { kind: 'edge', faces: row.faces, hint: row.hint }\n }\n // Phase 1.6/1.8:无身份行(origin/role=null,mesh 或未追踪面)不能构造 FaceTopoRef\n // ——身份字段是引用的主键,伪造空值正是被删除的静默降级(G6)。\n if (row.origin === null || row.role === null) {\n throw new TopoRefError(\n 'E_TOPO_NOT_FOUND',\n 'face',\n 'face naming row has no identity (mesh path or untracked face on the BREP chain)',\n )\n }\n return { kind: 'face', origin: row.origin, role: row.role, hint: row.hint }\n}\n"]}
@@ -5,6 +5,8 @@
5
5
  * 或活 BREP 句柄。绝不反向把序号当稳定身份存进脚本。
6
6
  */
7
7
  export * from './types.js';
8
+ export * from './role-name.js';
9
+ export * from './lineage.js';
8
10
  export * from './geom-hint.js';
9
11
  export * from './score.js';
10
12
  export * from './roles.js';
@@ -16,4 +18,5 @@ export * from './resolver.js';
16
18
  export * from './ref-params.js';
17
19
  export * from './capture-topo-ref.js';
18
20
  export * from './build-naming.js';
21
+ export * from './migrate.js';
19
22
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/topology/naming/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,SAAS,CAAA;AACvB,cAAc,aAAa,CAAA;AAC3B,cAAc,SAAS,CAAA;AACvB,cAAc,SAAS,CAAA;AACvB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,oBAAoB,CAAA;AAClC,cAAc,gBAAgB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/topology/naming/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,SAAS,CAAA;AACvB,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,aAAa,CAAA;AAC3B,cAAc,SAAS,CAAA;AACvB,cAAc,SAAS,CAAA;AACvB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,oBAAoB,CAAA;AAClC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,WAAW,CAAA"}
@@ -5,6 +5,8 @@
5
5
  * 或活 BREP 句柄。绝不反向把序号当稳定身份存进脚本。
6
6
  */
7
7
  export * from './types.js';
8
+ export * from './role-name.js';
9
+ export * from './lineage.js';
8
10
  export * from './geom-hint.js';
9
11
  export * from './score.js';
10
12
  export * from './roles.js';
@@ -16,4 +18,5 @@ export * from './resolver.js';
16
18
  export * from './ref-params.js';
17
19
  export * from './capture-topo-ref.js';
18
20
  export * from './build-naming.js';
21
+ export * from './migrate.js';
19
22
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/topology/naming/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,SAAS,CAAA;AACvB,cAAc,aAAa,CAAA;AAC3B,cAAc,SAAS,CAAA;AACvB,cAAc,SAAS,CAAA;AACvB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,oBAAoB,CAAA;AAClC,cAAc,gBAAgB,CAAA","sourcesContent":["/**\n *\n * 跨历史身份层:TopoRef(纯数据、写进 .fai.js)+ RoleTable(运行期、不序列化)。\n * 解析方向固定为单向:TopoRef(稳定)→ 解析器 → 当前快照的序号 FaceId/EdgeId\n * 或活 BREP 句柄。绝不反向把序号当稳定身份存进脚本。\n */\n\nexport * from './types'\nexport * from './geom-hint'\nexport * from './score'\nexport * from './roles'\nexport * from './resolve-face'\nexport * from './resolve-edge'\nexport * from './resolve-vertex'\nexport * from './resolve-derived'\nexport * from './resolver'\nexport * from './ref-params'\nexport * from './capture-topo-ref'\nexport * from './build-naming'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/topology/naming/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,SAAS,CAAA;AACvB,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,aAAa,CAAA;AAC3B,cAAc,SAAS,CAAA;AACvB,cAAc,SAAS,CAAA;AACvB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,oBAAoB,CAAA;AAClC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,WAAW,CAAA","sourcesContent":["/**\n *\n * 跨历史身份层:TopoRef(纯数据、写进 .fai.js)+ RoleTable(运行期、不序列化)。\n * 解析方向固定为单向:TopoRef(稳定)→ 解析器 → 当前快照的序号 FaceId/EdgeId\n * 或活 BREP 句柄。绝不反向把序号当稳定身份存进脚本。\n */\n\nexport * from './types'\nexport * from './role-name'\nexport * from './lineage'\nexport * from './geom-hint'\nexport * from './score'\nexport * from './roles'\nexport * from './resolve-face'\nexport * from './resolve-edge'\nexport * from './resolve-vertex'\nexport * from './resolve-derived'\nexport * from './resolver'\nexport * from './ref-params'\nexport * from './capture-topo-ref'\nexport * from './build-naming'\nexport * from './migrate'\n"]}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * lineage-resolve.ts — 回走推进器(1.10 前置②,计划 §4.5)。
3
+ *
4
+ * 「产物上的 roleTable 只是缓存」的重算引擎:缓存 miss 时沿血缘 DAG
5
+ * 从身份原点 `(origin, role)` 走到目标 part,产出该 role 在目标 part 上的
6
+ * 面 hash 集合——与 `slot.roleTable.get(origin)?.get(role)` 语义等价。
7
+ *
8
+ * ## 推进载体:序号(ordinal),不是 hash
9
+ *
10
+ * hash 是内存指针哈希,跨 Shape 实例必变(copy 一个新 handle,hash 全换),
11
+ * **不能**作为跨节点推进的载体。跨节点稳定的是两样东西:
12
+ * - role(因果坐标,本机制的存在理由);
13
+ * - 面枚举序号(`slot.faceEvolution` 记录的正是 ordinal→ordinal[] 的演化,
14
+ * 1.10 前置①已把每个 brep op 的演化挂到血缘节点)。
15
+ *
16
+ * 推进三步:
17
+ * 1. **锚定**:root 语句的输出 part 上,role → hash 集合(读 root 的现存
18
+ * roleTable——它现在是缓存,读它是合法的),再换算成 root 上的序号集合;
19
+ * 2. **逐节点推进**:沿 DAG 每个节点用其 `evolution`(ordinal 键)把序号集合
20
+ * 映射到输出序号(`evo.get(o) ?? [o]`——"未变"的两种上报形态都容纳);
21
+ * 3. **落地**:目标 part 上把最终序号集合换算回 hash 集合。
22
+ *
23
+ * 任一步数据缺失 → 返回结构化失败原因(不静默返回空集——空集会被上层当成
24
+ * "面被删除",那是另一个语义)。
25
+ */
26
+ import type { PartName, StmtId } from '../../identity.js';
27
+ import type { LineageGraph } from './lineage.js';
28
+ import { formatRoleName } from './role-name.js';
29
+ /** 回走所需的外部读口(由调用方注入:runtime 持有 kernel 与 slots)。 */
30
+ export interface LineageResolveDeps {
31
+ /** part 的 BREP 句柄(回走链上的中间产物经 solidCache 存活)。 */
32
+ brepOf: (part: PartName) => unknown | undefined;
33
+ /** 句柄的全部面 hash(枚举序 = ordinal 1 起,与 faceEvolution 同序)。 */
34
+ faceHashes: (handle: unknown) => readonly number[];
35
+ /** 读某 part 的 roleTable 缓存(root 锚定用;返回 origin→role→hash[])。 */
36
+ roleTableOf: (part: PartName) => ReadonlyMap<string, ReadonlyMap<string, readonly number[]>> | undefined;
37
+ }
38
+ /** 回走失败原因(结构化,不静默)。 */
39
+ export type LineageResolveFailure = {
40
+ readonly reason: 'no-lineage-node';
41
+ readonly stmt: string;
42
+ } | {
43
+ readonly reason: 'no-root-part';
44
+ readonly stmt: string;
45
+ } | {
46
+ readonly reason: 'no-handle';
47
+ readonly part: string;
48
+ } | {
49
+ readonly reason: 'no-role-table';
50
+ readonly part: string;
51
+ } | {
52
+ readonly reason: 'role-not-in-table';
53
+ readonly origin: string;
54
+ readonly role: string;
55
+ } | {
56
+ readonly reason: 'hash-not-found';
57
+ readonly part: string;
58
+ readonly count: number;
59
+ } | {
60
+ readonly reason: 'no-evolution';
61
+ readonly stmt: string;
62
+ readonly op: string;
63
+ };
64
+ /** 回走成功:role 在目标 part 上的面 hash 集合。 */
65
+ export interface LineageResolveSuccess {
66
+ readonly hashes: readonly number[];
67
+ }
68
+ /**
69
+ * 沿血缘 DAG 回走:`(origin, role)` → 目标 part 上的 hash 集合。
70
+ *
71
+ * @param graph - the lineage graph (registered per execution).
72
+ * @param origin - the origin statement id of the identity.
73
+ * @param roleLine - the role in wire format (as stored in TopoRef).
74
+ * @param targetPart - the part whose snapshot we resolve against.
75
+ * @param deps - external readers (handles / hashes / role-table cache).
76
+ * @returns success with the hash set, or a structured failure.
77
+ */
78
+ export declare function resolveViaLineage(graph: LineageGraph, origin: StmtId, roleLine: string, targetPart: PartName, deps: LineageResolveDeps): LineageResolveSuccess | LineageResolveFailure;
79
+ export { formatRoleName };
80
+ //# sourceMappingURL=lineage-resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lineage-resolve.d.ts","sourceRoot":"","sources":["../../../src/topology/naming/lineage-resolve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAC7C,OAAO,EAAiB,cAAc,EAAE,MAAM,aAAa,CAAA;AAE3D,mDAAmD;AACnD,MAAM,WAAW,kBAAkB;IACjC,gDAAgD;IAChD,MAAM,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO,GAAG,SAAS,CAAA;IAC/C,yDAAyD;IACzD,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,SAAS,MAAM,EAAE,CAAA;IAClD,8DAA8D;IAC9D,WAAW,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,GAAG,SAAS,CAAA;CACzG;AAED,uBAAuB;AACvB,MAAM,MAAM,qBAAqB,GAC7B;IAAE,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC7D;IAAE,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC1D;IAAE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACvD;IAAE,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC3D;IAAE,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACxF;IAAE,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACpF;IAAE,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAA;AAEnF,sCAAsC;AACtC,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;CACnC;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,QAAQ,EACpB,IAAI,EAAE,kBAAkB,GACvB,qBAAqB,GAAG,qBAAqB,CAyE/C;AAID,OAAO,EAAE,cAAc,EAAE,CAAA"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * lineage-resolve.ts — 回走推进器(1.10 前置②,计划 §4.5)。
3
+ *
4
+ * 「产物上的 roleTable 只是缓存」的重算引擎:缓存 miss 时沿血缘 DAG
5
+ * 从身份原点 `(origin, role)` 走到目标 part,产出该 role 在目标 part 上的
6
+ * 面 hash 集合——与 `slot.roleTable.get(origin)?.get(role)` 语义等价。
7
+ *
8
+ * ## 推进载体:序号(ordinal),不是 hash
9
+ *
10
+ * hash 是内存指针哈希,跨 Shape 实例必变(copy 一个新 handle,hash 全换),
11
+ * **不能**作为跨节点推进的载体。跨节点稳定的是两样东西:
12
+ * - role(因果坐标,本机制的存在理由);
13
+ * - 面枚举序号(`slot.faceEvolution` 记录的正是 ordinal→ordinal[] 的演化,
14
+ * 1.10 前置①已把每个 brep op 的演化挂到血缘节点)。
15
+ *
16
+ * 推进三步:
17
+ * 1. **锚定**:root 语句的输出 part 上,role → hash 集合(读 root 的现存
18
+ * roleTable——它现在是缓存,读它是合法的),再换算成 root 上的序号集合;
19
+ * 2. **逐节点推进**:沿 DAG 每个节点用其 `evolution`(ordinal 键)把序号集合
20
+ * 映射到输出序号(`evo.get(o) ?? [o]`——"未变"的两种上报形态都容纳);
21
+ * 3. **落地**:目标 part 上把最终序号集合换算回 hash 集合。
22
+ *
23
+ * 任一步数据缺失 → 返回结构化失败原因(不静默返回空集——空集会被上层当成
24
+ * "面被删除",那是另一个语义)。
25
+ */
26
+ import { parseRoleName, formatRoleName } from './role-name.js';
27
+ /**
28
+ * 沿血缘 DAG 回走:`(origin, role)` → 目标 part 上的 hash 集合。
29
+ *
30
+ * @param graph - the lineage graph (registered per execution).
31
+ * @param origin - the origin statement id of the identity.
32
+ * @param roleLine - the role in wire format (as stored in TopoRef).
33
+ * @param targetPart - the part whose snapshot we resolve against.
34
+ * @param deps - external readers (handles / hashes / role-table cache).
35
+ * @returns success with the hash set, or a structured failure.
36
+ */
37
+ export function resolveViaLineage(graph, origin, roleLine, targetPart, deps) {
38
+ const role = parseRoleName(roleLine);
39
+ if (!role)
40
+ return { reason: 'role-not-in-table', origin, role: roleLine };
41
+ // ── 链收集:origin 节点 →(经消费者边)→ 产出 targetPart 的节点 ──
42
+ // 行走方向是「origin → 谁消费了我的输出 → 谁又消费了它的输出」:
43
+ // 中间 part 的产出方是 origin 自己(stmtOf 指回原点),不能用产出方找下一步。
44
+ const chain = [];
45
+ {
46
+ const start = graph.node(origin);
47
+ if (!start)
48
+ return { reason: 'no-lineage-node', stmt: String(origin) };
49
+ const rootPart = start.outputs[0];
50
+ if (!rootPart)
51
+ return { reason: 'no-root-part', stmt: String(origin) };
52
+ const startEvo = start.evolution && !('modified' in start.evolution) ? start.evolution : undefined;
53
+ chain.push({ stmt: origin, part: rootPart, evolution: startEvo });
54
+ let currentPart = rootPart;
55
+ while (!chain[chain.length - 1].part || true) {
56
+ if (currentPart === targetPart)
57
+ break;
58
+ const consumer = graph.nodeConsuming(currentPart);
59
+ if (!consumer)
60
+ return { reason: 'no-lineage-node', stmt: String(currentPart) };
61
+ const evo = consumer.evolution && !('modified' in consumer.evolution) ? consumer.evolution : undefined;
62
+ // 承载 part:消费者的输出里选一个(单输出链取第一个;多输出如 split 取含
63
+ // targetPart 的那个,否则取第一个——多输出分支的精确选择由调用方语义决定)。
64
+ const carry = consumer.outputs.includes(targetPart) ? targetPart : consumer.outputs[0];
65
+ chain.push({ stmt: consumer.stmt, part: carry, evolution: evo });
66
+ currentPart = carry;
67
+ }
68
+ }
69
+ // ── 锚定:root part 上 role → hash → ordinal ──
70
+ const root = chain[0];
71
+ const rootHandle = deps.brepOf(root.part);
72
+ if (rootHandle === undefined)
73
+ return { reason: 'no-handle', part: root.part };
74
+ const rootTable = deps.roleTableOf(root.part);
75
+ if (!rootTable)
76
+ return { reason: 'no-role-table', part: root.part };
77
+ // root 的 roleTable 键形:origin(StmtId 串)→ role 线格式 → hashes。
78
+ const rootHashes = rootTable.get(String(origin))?.get(roleLine);
79
+ if (rootHashes === undefined || rootHashes.length === 0) {
80
+ return { reason: 'role-not-in-table', origin, role: roleLine };
81
+ }
82
+ const rootAll = deps.faceHashes(rootHandle);
83
+ let ordinals = [];
84
+ for (const h of rootHashes) {
85
+ const idx = rootAll.indexOf(h);
86
+ if (idx < 0)
87
+ return { reason: 'hash-not-found', part: root.part, count: rootHashes.length };
88
+ ordinals.push(idx + 1); // ordinal 1 起
89
+ }
90
+ // ── 逐节点推进(ordinal 键演化;链上首节点是原点,其演化作用于其输入,
91
+ // 因此推进从链的第二个节点开始)──
92
+ for (let i = 1; i < chain.length; i++) {
93
+ const node = chain[i];
94
+ if (!node.evolution) {
95
+ // identity 类 op(copy/place/transform)登记时 slot 里有 identityEvolution;
96
+ // 演化缺失说明该节点未按 1.10 前置①挂接 —— 显式失败,不默认恒等。
97
+ const g = graph.node(node.stmt);
98
+ return { reason: 'no-evolution', stmt: node.stmt, op: g?.op ?? '?' };
99
+ }
100
+ ordinals = ordinals.flatMap((o) => node.evolution.get(o) ?? [o]);
101
+ }
102
+ // ── 落地:目标 part 上 ordinal → hash ──
103
+ const last = chain[chain.length - 1];
104
+ const targetHandle = deps.brepOf(last.part);
105
+ if (targetHandle === undefined)
106
+ return { reason: 'no-handle', part: last.part };
107
+ const targetAll = deps.faceHashes(targetHandle);
108
+ const hashes = [];
109
+ for (const o of ordinals) {
110
+ const h = targetAll[o - 1];
111
+ if (h === undefined)
112
+ return { reason: 'hash-not-found', part: last.part, count: ordinals.length };
113
+ hashes.push(h);
114
+ }
115
+ return { hashes };
116
+ }
117
+ // formatRoleName 在 API 面保留导出(role 线格式与 TopoRef 序列化的唯一权威),
118
+ // 本模块仅经 parseRoleName 校验线格式合法性。
119
+ export { formatRoleName };
120
+ //# sourceMappingURL=lineage-resolve.js.map