@memoarchitect/tools 0.13.2 → 0.15.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 (824) hide show
  1. package/README.md +40 -26
  2. package/corpus/README.md +20 -36
  3. package/package.json +9 -10
  4. package/packages/tools/lib/analysis/impact.d.ts +30 -0
  5. package/packages/tools/lib/analysis/impact.d.ts.map +1 -1
  6. package/packages/tools/lib/analysis/impact.js +47 -74
  7. package/packages/tools/lib/analysis/impact.js.map +1 -1
  8. package/packages/tools/lib/analysis/interfaces-between.d.ts +36 -0
  9. package/packages/tools/lib/analysis/interfaces-between.d.ts.map +1 -0
  10. package/packages/tools/lib/analysis/interfaces-between.js +66 -0
  11. package/packages/tools/lib/analysis/interfaces-between.js.map +1 -0
  12. package/packages/tools/lib/analysis/suspect-links.d.ts +45 -0
  13. package/packages/tools/lib/analysis/suspect-links.d.ts.map +1 -0
  14. package/packages/tools/lib/analysis/suspect-links.js +66 -0
  15. package/packages/tools/lib/analysis/suspect-links.js.map +1 -0
  16. package/packages/tools/lib/analysis-starters.d.ts +2 -0
  17. package/packages/tools/lib/analysis-starters.d.ts.map +1 -1
  18. package/packages/tools/lib/analysis-starters.js +73 -68
  19. package/packages/tools/lib/analysis-starters.js.map +1 -1
  20. package/packages/tools/lib/authoring/outline-identity.d.ts +34 -0
  21. package/packages/tools/lib/authoring/outline-identity.d.ts.map +1 -0
  22. package/packages/tools/lib/authoring/outline-identity.js +95 -0
  23. package/packages/tools/lib/authoring/outline-identity.js.map +1 -0
  24. package/packages/tools/lib/authoring/outline-source.d.ts +57 -0
  25. package/packages/tools/lib/authoring/outline-source.d.ts.map +1 -0
  26. package/packages/tools/lib/authoring/outline-source.js +203 -0
  27. package/packages/tools/lib/authoring/outline-source.js.map +1 -0
  28. package/packages/tools/lib/authoring/source-outline.d.ts +82 -0
  29. package/packages/tools/lib/authoring/source-outline.d.ts.map +1 -0
  30. package/packages/tools/lib/authoring/source-outline.js +267 -0
  31. package/packages/tools/lib/authoring/source-outline.js.map +1 -0
  32. package/packages/tools/lib/bin/memo.js +181 -632
  33. package/packages/tools/lib/bin/memo.js.map +1 -1
  34. package/packages/tools/lib/browser/index.d.ts +12 -0
  35. package/packages/tools/lib/browser/index.d.ts.map +1 -1
  36. package/packages/tools/lib/browser/index.js +8 -0
  37. package/packages/tools/lib/browser/index.js.map +1 -1
  38. package/packages/tools/lib/cli/project-commands.d.ts +3 -0
  39. package/packages/tools/lib/cli/project-commands.d.ts.map +1 -0
  40. package/packages/tools/lib/cli/project-commands.js +577 -0
  41. package/packages/tools/lib/cli/project-commands.js.map +1 -0
  42. package/packages/tools/lib/commands/ask.d.ts.map +1 -1
  43. package/packages/tools/lib/commands/ask.js +10 -18
  44. package/packages/tools/lib/commands/ask.js.map +1 -1
  45. package/packages/tools/lib/commands/compile.d.ts +18 -0
  46. package/packages/tools/lib/commands/compile.d.ts.map +1 -0
  47. package/packages/tools/lib/commands/compile.js +122 -0
  48. package/packages/tools/lib/commands/compile.js.map +1 -0
  49. package/packages/tools/lib/commands/convert.js +2 -2
  50. package/packages/tools/lib/commands/convert.js.map +1 -1
  51. package/packages/tools/lib/commands/create-package.js +4 -4
  52. package/packages/tools/lib/commands/create-package.js.map +1 -1
  53. package/packages/tools/lib/commands/dev.d.ts +20 -2
  54. package/packages/tools/lib/commands/dev.d.ts.map +1 -1
  55. package/packages/tools/lib/commands/dev.js +386 -97
  56. package/packages/tools/lib/commands/dev.js.map +1 -1
  57. package/packages/tools/lib/commands/dhf-draft.d.ts.map +1 -1
  58. package/packages/tools/lib/commands/dhf-draft.js +7 -16
  59. package/packages/tools/lib/commands/dhf-draft.js.map +1 -1
  60. package/packages/tools/lib/commands/dhf-init.js +3 -3
  61. package/packages/tools/lib/commands/dhf-init.js.map +1 -1
  62. package/packages/tools/lib/commands/dhf-lint.d.ts.map +1 -1
  63. package/packages/tools/lib/commands/dhf-lint.js +4 -3
  64. package/packages/tools/lib/commands/dhf-lint.js.map +1 -1
  65. package/packages/tools/lib/commands/dhf-preview.d.ts.map +1 -1
  66. package/packages/tools/lib/commands/dhf-preview.js +5 -26
  67. package/packages/tools/lib/commands/dhf-preview.js.map +1 -1
  68. package/packages/tools/lib/commands/dhf.d.ts +4 -0
  69. package/packages/tools/lib/commands/dhf.d.ts.map +1 -1
  70. package/packages/tools/lib/commands/dhf.js +77 -31
  71. package/packages/tools/lib/commands/dhf.js.map +1 -1
  72. package/packages/tools/lib/commands/element.d.ts.map +1 -1
  73. package/packages/tools/lib/commands/element.js +44 -6
  74. package/packages/tools/lib/commands/element.js.map +1 -1
  75. package/packages/tools/lib/commands/export.d.ts +1 -1
  76. package/packages/tools/lib/commands/export.d.ts.map +1 -1
  77. package/packages/tools/lib/commands/export.js +25 -18
  78. package/packages/tools/lib/commands/export.js.map +1 -1
  79. package/packages/tools/lib/commands/generate.d.ts.map +1 -1
  80. package/packages/tools/lib/commands/generate.js +10 -30
  81. package/packages/tools/lib/commands/generate.js.map +1 -1
  82. package/packages/tools/lib/commands/ids-rebase.d.ts +15 -0
  83. package/packages/tools/lib/commands/ids-rebase.d.ts.map +1 -0
  84. package/packages/tools/lib/commands/ids-rebase.js +133 -0
  85. package/packages/tools/lib/commands/ids-rebase.js.map +1 -0
  86. package/packages/tools/lib/commands/import-ea.d.ts +3 -3
  87. package/packages/tools/lib/commands/import-ea.d.ts.map +1 -1
  88. package/packages/tools/lib/commands/import-ea.js +12 -9
  89. package/packages/tools/lib/commands/import-ea.js.map +1 -1
  90. package/packages/tools/lib/commands/import-owl.d.ts +1 -1
  91. package/packages/tools/lib/commands/import-owl.js +2 -2
  92. package/packages/tools/lib/commands/import-owl.js.map +1 -1
  93. package/packages/tools/lib/commands/import-sysand.d.ts +1 -1
  94. package/packages/tools/lib/commands/import-sysand.d.ts.map +1 -1
  95. package/packages/tools/lib/commands/import-sysand.js +15 -6
  96. package/packages/tools/lib/commands/import-sysand.js.map +1 -1
  97. package/packages/tools/lib/commands/import.d.ts +13 -0
  98. package/packages/tools/lib/commands/import.d.ts.map +1 -1
  99. package/packages/tools/lib/commands/import.js +89 -29
  100. package/packages/tools/lib/commands/import.js.map +1 -1
  101. package/packages/tools/lib/commands/init.d.ts +0 -8
  102. package/packages/tools/lib/commands/init.d.ts.map +1 -1
  103. package/packages/tools/lib/commands/init.js +56 -51
  104. package/packages/tools/lib/commands/init.js.map +1 -1
  105. package/packages/tools/lib/commands/inspect.d.ts.map +1 -1
  106. package/packages/tools/lib/commands/inspect.js +22 -15
  107. package/packages/tools/lib/commands/inspect.js.map +1 -1
  108. package/packages/tools/lib/commands/install.d.ts.map +1 -1
  109. package/packages/tools/lib/commands/install.js +9 -6
  110. package/packages/tools/lib/commands/install.js.map +1 -1
  111. package/packages/tools/lib/commands/interfaces.d.ts +8 -0
  112. package/packages/tools/lib/commands/interfaces.d.ts.map +1 -0
  113. package/packages/tools/lib/commands/interfaces.js +71 -0
  114. package/packages/tools/lib/commands/interfaces.js.map +1 -0
  115. package/packages/tools/lib/commands/lock.d.ts.map +1 -1
  116. package/packages/tools/lib/commands/lock.js +13 -6
  117. package/packages/tools/lib/commands/lock.js.map +1 -1
  118. package/packages/tools/lib/commands/mcp.js +7 -7
  119. package/packages/tools/lib/commands/mcp.js.map +1 -1
  120. package/packages/tools/lib/commands/migrate-layout.d.ts +5 -0
  121. package/packages/tools/lib/commands/migrate-layout.d.ts.map +1 -0
  122. package/packages/tools/lib/commands/migrate-layout.js +90 -0
  123. package/packages/tools/lib/commands/migrate-layout.js.map +1 -0
  124. package/packages/tools/lib/commands/ontology.d.ts.map +1 -1
  125. package/packages/tools/lib/commands/ontology.js +26 -22
  126. package/packages/tools/lib/commands/ontology.js.map +1 -1
  127. package/packages/tools/lib/commands/pack.d.ts.map +1 -1
  128. package/packages/tools/lib/commands/pack.js +14 -9
  129. package/packages/tools/lib/commands/pack.js.map +1 -1
  130. package/packages/tools/lib/commands/pinned-target.d.ts +12 -0
  131. package/packages/tools/lib/commands/pinned-target.d.ts.map +1 -0
  132. package/packages/tools/lib/commands/pinned-target.js +74 -0
  133. package/packages/tools/lib/commands/pinned-target.js.map +1 -0
  134. package/packages/tools/lib/commands/plugin.d.ts.map +1 -1
  135. package/packages/tools/lib/commands/plugin.js +13 -22
  136. package/packages/tools/lib/commands/plugin.js.map +1 -1
  137. package/packages/tools/lib/commands/prune.d.ts +5 -0
  138. package/packages/tools/lib/commands/prune.d.ts.map +1 -0
  139. package/packages/tools/lib/commands/prune.js +27 -0
  140. package/packages/tools/lib/commands/prune.js.map +1 -0
  141. package/packages/tools/lib/commands/retired.d.ts +10 -0
  142. package/packages/tools/lib/commands/retired.d.ts.map +1 -0
  143. package/packages/tools/lib/commands/retired.js +35 -0
  144. package/packages/tools/lib/commands/retired.js.map +1 -0
  145. package/packages/tools/lib/commands/rules.d.ts +49 -5
  146. package/packages/tools/lib/commands/rules.d.ts.map +1 -1
  147. package/packages/tools/lib/commands/rules.js +340 -172
  148. package/packages/tools/lib/commands/rules.js.map +1 -1
  149. package/packages/tools/lib/commands/ship-library.d.ts +4 -0
  150. package/packages/tools/lib/commands/ship-library.d.ts.map +1 -0
  151. package/packages/tools/lib/commands/ship-library.js +45 -0
  152. package/packages/tools/lib/commands/ship-library.js.map +1 -0
  153. package/packages/tools/lib/commands/standards.d.ts +2 -2
  154. package/packages/tools/lib/commands/standards.d.ts.map +1 -1
  155. package/packages/tools/lib/commands/standards.js +78 -33
  156. package/packages/tools/lib/commands/standards.js.map +1 -1
  157. package/packages/tools/lib/commands/sysand-publish.d.ts +16 -1
  158. package/packages/tools/lib/commands/sysand-publish.d.ts.map +1 -1
  159. package/packages/tools/lib/commands/sysand-publish.js +75 -193
  160. package/packages/tools/lib/commands/sysand-publish.js.map +1 -1
  161. package/packages/tools/lib/commands/toolchain.d.ts +5 -0
  162. package/packages/tools/lib/commands/toolchain.d.ts.map +1 -1
  163. package/packages/tools/lib/commands/toolchain.js +50 -1
  164. package/packages/tools/lib/commands/toolchain.js.map +1 -1
  165. package/packages/tools/lib/commands/validate-client.d.ts +11 -0
  166. package/packages/tools/lib/commands/validate-client.d.ts.map +1 -0
  167. package/packages/tools/lib/commands/validate-client.js +54 -0
  168. package/packages/tools/lib/commands/validate-client.js.map +1 -0
  169. package/packages/tools/lib/commands/validate.d.ts +33 -2
  170. package/packages/tools/lib/commands/validate.d.ts.map +1 -1
  171. package/packages/tools/lib/commands/validate.js +432 -186
  172. package/packages/tools/lib/commands/validate.js.map +1 -1
  173. package/packages/tools/lib/dhf/device-dhf.d.ts +57 -0
  174. package/packages/tools/lib/dhf/device-dhf.d.ts.map +1 -0
  175. package/packages/tools/lib/dhf/device-dhf.js +152 -0
  176. package/packages/tools/lib/dhf/device-dhf.js.map +1 -0
  177. package/packages/tools/lib/dhf/dhf-config-v2.d.ts +1 -1
  178. package/packages/tools/lib/dhf/dhf-config-v2.d.ts.map +1 -1
  179. package/packages/tools/lib/dhf/query-engine.d.ts +9 -2
  180. package/packages/tools/lib/dhf/query-engine.d.ts.map +1 -1
  181. package/packages/tools/lib/dhf/query-engine.js +29 -25
  182. package/packages/tools/lib/dhf/query-engine.js.map +1 -1
  183. package/packages/tools/lib/dhf/query-executor.d.ts +1 -1
  184. package/packages/tools/lib/dhf/query-executor.js +1 -1
  185. package/packages/tools/lib/dhf/query-executor.js.map +1 -1
  186. package/packages/tools/lib/dhf/standards-block.js +1 -1
  187. package/packages/tools/lib/dhf/standards-block.js.map +1 -1
  188. package/packages/tools/lib/dhf/standards-library.d.ts.map +1 -1
  189. package/packages/tools/lib/dhf/standards-library.js +16 -9
  190. package/packages/tools/lib/dhf/standards-library.js.map +1 -1
  191. package/packages/tools/lib/dhf/standards-report.d.ts +11 -3
  192. package/packages/tools/lib/dhf/standards-report.d.ts.map +1 -1
  193. package/packages/tools/lib/dhf/standards-report.js +43 -13
  194. package/packages/tools/lib/dhf/standards-report.js.map +1 -1
  195. package/packages/tools/lib/dhf/template-engine.d.ts +2 -0
  196. package/packages/tools/lib/dhf/template-engine.d.ts.map +1 -1
  197. package/packages/tools/lib/dhf/template-engine.js +5 -5
  198. package/packages/tools/lib/dhf/template-engine.js.map +1 -1
  199. package/packages/tools/lib/import/import-diff.d.ts +31 -1
  200. package/packages/tools/lib/import/import-diff.d.ts.map +1 -1
  201. package/packages/tools/lib/import/import-diff.js +91 -19
  202. package/packages/tools/lib/import/import-diff.js.map +1 -1
  203. package/packages/tools/lib/import/import-sources.d.ts +21 -0
  204. package/packages/tools/lib/import/import-sources.d.ts.map +1 -0
  205. package/packages/tools/lib/import/import-sources.js +36 -0
  206. package/packages/tools/lib/import/import-sources.js.map +1 -0
  207. package/packages/tools/lib/import/reqif.d.ts +23 -0
  208. package/packages/tools/lib/import/reqif.d.ts.map +1 -0
  209. package/packages/tools/lib/import/reqif.js +151 -0
  210. package/packages/tools/lib/import/reqif.js.map +1 -0
  211. package/packages/tools/lib/import/source-import.d.ts +128 -0
  212. package/packages/tools/lib/import/source-import.d.ts.map +1 -0
  213. package/packages/tools/lib/import/source-import.js +305 -0
  214. package/packages/tools/lib/import/source-import.js.map +1 -0
  215. package/packages/tools/lib/importer/cameo-importer.d.ts.map +1 -1
  216. package/packages/tools/lib/importer/cameo-importer.js +4 -1
  217. package/packages/tools/lib/importer/cameo-importer.js.map +1 -1
  218. package/packages/tools/lib/importer/ea-importer.d.ts.map +1 -1
  219. package/packages/tools/lib/importer/ea-importer.js +4 -1
  220. package/packages/tools/lib/importer/ea-importer.js.map +1 -1
  221. package/packages/tools/lib/importer/sysand-importer.d.ts +2 -1
  222. package/packages/tools/lib/importer/sysand-importer.d.ts.map +1 -1
  223. package/packages/tools/lib/importer/sysand-importer.js +27 -10
  224. package/packages/tools/lib/importer/sysand-importer.js.map +1 -1
  225. package/packages/tools/lib/index.d.ts +20 -6
  226. package/packages/tools/lib/index.d.ts.map +1 -1
  227. package/packages/tools/lib/index.js +22 -8
  228. package/packages/tools/lib/index.js.map +1 -1
  229. package/packages/tools/lib/llm/draft-engine.js +1 -1
  230. package/packages/tools/lib/llm/draft-engine.js.map +1 -1
  231. package/packages/tools/lib/llm/model-context.js +1 -1
  232. package/packages/tools/lib/llm/model-context.js.map +1 -1
  233. package/packages/tools/lib/lock.d.ts +37 -2
  234. package/packages/tools/lib/lock.d.ts.map +1 -1
  235. package/packages/tools/lib/lock.js +93 -8
  236. package/packages/tools/lib/lock.js.map +1 -1
  237. package/packages/tools/lib/mcp/index.js +1 -1
  238. package/packages/tools/lib/mcp/index.js.map +1 -1
  239. package/packages/tools/lib/mcp/model-loader.d.ts.map +1 -1
  240. package/packages/tools/lib/mcp/model-loader.js +6 -18
  241. package/packages/tools/lib/mcp/model-loader.js.map +1 -1
  242. package/packages/tools/lib/mcp/server.js +2 -2
  243. package/packages/tools/lib/mcp/server.js.map +1 -1
  244. package/packages/tools/lib/mcp/tools.d.ts.map +1 -1
  245. package/packages/tools/lib/mcp/tools.js +5 -4
  246. package/packages/tools/lib/mcp/tools.js.map +1 -1
  247. package/packages/tools/lib/methodology/guide-service.d.ts +28 -0
  248. package/packages/tools/lib/methodology/guide-service.d.ts.map +1 -0
  249. package/packages/tools/lib/methodology/guide-service.js +32 -0
  250. package/packages/tools/lib/methodology/guide-service.js.map +1 -0
  251. package/packages/tools/lib/methodology/guide.d.ts +56 -0
  252. package/packages/tools/lib/methodology/guide.d.ts.map +1 -0
  253. package/packages/tools/lib/methodology/guide.js +80 -0
  254. package/packages/tools/lib/methodology/guide.js.map +1 -0
  255. package/packages/tools/lib/model/census-projects.d.ts +26 -0
  256. package/packages/tools/lib/model/census-projects.d.ts.map +1 -0
  257. package/packages/tools/lib/model/census-projects.js +53 -0
  258. package/packages/tools/lib/model/census-projects.js.map +1 -0
  259. package/packages/tools/lib/model/census.d.ts +103 -0
  260. package/packages/tools/lib/model/census.d.ts.map +1 -0
  261. package/packages/tools/lib/model/census.js +229 -0
  262. package/packages/tools/lib/model/census.js.map +1 -0
  263. package/packages/tools/lib/model/complete-model.d.ts +52 -0
  264. package/packages/tools/lib/model/complete-model.d.ts.map +1 -0
  265. package/packages/tools/lib/model/complete-model.js +287 -0
  266. package/packages/tools/lib/model/complete-model.js.map +1 -0
  267. package/packages/tools/lib/model/config-loader.d.ts +8 -3
  268. package/packages/tools/lib/model/config-loader.d.ts.map +1 -1
  269. package/packages/tools/lib/model/config-loader.js +37 -6
  270. package/packages/tools/lib/model/config-loader.js.map +1 -1
  271. package/packages/tools/lib/model/config.d.ts +21 -7
  272. package/packages/tools/lib/model/config.d.ts.map +1 -1
  273. package/packages/tools/lib/model/effective-scope.d.ts +55 -28
  274. package/packages/tools/lib/model/effective-scope.d.ts.map +1 -1
  275. package/packages/tools/lib/model/effective-scope.js +96 -35
  276. package/packages/tools/lib/model/effective-scope.js.map +1 -1
  277. package/packages/tools/lib/model/element-index.d.ts +207 -0
  278. package/packages/tools/lib/model/element-index.d.ts.map +1 -0
  279. package/packages/tools/lib/model/element-index.js +316 -0
  280. package/packages/tools/lib/model/element-index.js.map +1 -0
  281. package/packages/tools/lib/model/id-rebase.d.ts +35 -0
  282. package/packages/tools/lib/model/id-rebase.d.ts.map +1 -0
  283. package/packages/tools/lib/model/id-rebase.js +199 -0
  284. package/packages/tools/lib/model/id-rebase.js.map +1 -0
  285. package/packages/tools/lib/model/identity-registry.d.ts +34 -3
  286. package/packages/tools/lib/model/identity-registry.d.ts.map +1 -1
  287. package/packages/tools/lib/model/identity-registry.js +40 -7
  288. package/packages/tools/lib/model/identity-registry.js.map +1 -1
  289. package/packages/tools/lib/model/impact.d.ts +75 -0
  290. package/packages/tools/lib/model/impact.d.ts.map +1 -0
  291. package/packages/tools/lib/model/impact.js +167 -0
  292. package/packages/tools/lib/model/impact.js.map +1 -0
  293. package/packages/tools/lib/model/ir-identity.d.ts +3 -51
  294. package/packages/tools/lib/model/ir-identity.d.ts.map +1 -1
  295. package/packages/tools/lib/model/ir-identity.js +14 -121
  296. package/packages/tools/lib/model/ir-identity.js.map +1 -1
  297. package/packages/tools/lib/model/kind-registry.d.ts +66 -22
  298. package/packages/tools/lib/model/kind-registry.d.ts.map +1 -1
  299. package/packages/tools/lib/model/kind-registry.js +104 -145
  300. package/packages/tools/lib/model/kind-registry.js.map +1 -1
  301. package/packages/tools/lib/model/manifest.d.ts +2 -2
  302. package/packages/tools/lib/model/manifest.d.ts.map +1 -1
  303. package/packages/tools/lib/model/manifest.js +5 -4
  304. package/packages/tools/lib/model/manifest.js.map +1 -1
  305. package/packages/tools/lib/model/methodology-loader.d.ts +11 -2
  306. package/packages/tools/lib/model/methodology-loader.d.ts.map +1 -1
  307. package/packages/tools/lib/model/methodology-loader.js +24 -130
  308. package/packages/tools/lib/model/methodology-loader.js.map +1 -1
  309. package/packages/tools/lib/model/methodology-resolver.d.ts +71 -6
  310. package/packages/tools/lib/model/methodology-resolver.d.ts.map +1 -1
  311. package/packages/tools/lib/model/methodology-resolver.js +210 -24
  312. package/packages/tools/lib/model/methodology-resolver.js.map +1 -1
  313. package/packages/tools/lib/model/model-diff.d.ts +73 -0
  314. package/packages/tools/lib/model/model-diff.d.ts.map +1 -0
  315. package/packages/tools/lib/model/model-diff.js +91 -0
  316. package/packages/tools/lib/model/model-diff.js.map +1 -0
  317. package/packages/tools/lib/model/narrow-model.d.ts +9 -0
  318. package/packages/tools/lib/model/narrow-model.d.ts.map +1 -0
  319. package/packages/tools/lib/model/narrow-model.js +54 -0
  320. package/packages/tools/lib/model/narrow-model.js.map +1 -0
  321. package/packages/tools/lib/model/native-project.d.ts +92 -11
  322. package/packages/tools/lib/model/native-project.d.ts.map +1 -1
  323. package/packages/tools/lib/model/native-project.js +163 -269
  324. package/packages/tools/lib/model/native-project.js.map +1 -1
  325. package/packages/tools/lib/model/ontology-loader.d.ts +10 -61
  326. package/packages/tools/lib/model/ontology-loader.d.ts.map +1 -1
  327. package/packages/tools/lib/model/ontology-loader.js +11 -512
  328. package/packages/tools/lib/model/ontology-loader.js.map +1 -1
  329. package/packages/tools/lib/model/package-manifest.d.ts +8 -2
  330. package/packages/tools/lib/model/package-manifest.d.ts.map +1 -1
  331. package/packages/tools/lib/model/package-manifest.js +14 -2
  332. package/packages/tools/lib/model/package-manifest.js.map +1 -1
  333. package/packages/tools/lib/model/pinned.d.ts +216 -0
  334. package/packages/tools/lib/model/pinned.d.ts.map +1 -0
  335. package/packages/tools/lib/model/pinned.js +481 -0
  336. package/packages/tools/lib/model/pinned.js.map +1 -0
  337. package/packages/tools/lib/model/project-conversion.d.ts +3 -2
  338. package/packages/tools/lib/model/project-conversion.d.ts.map +1 -1
  339. package/packages/tools/lib/model/project-conversion.js +55 -10
  340. package/packages/tools/lib/model/project-conversion.js.map +1 -1
  341. package/packages/tools/lib/model/project-settings.d.ts +10 -0
  342. package/packages/tools/lib/model/project-settings.d.ts.map +1 -0
  343. package/packages/tools/lib/model/project-settings.js +48 -0
  344. package/packages/tools/lib/model/project-settings.js.map +1 -0
  345. package/packages/tools/lib/model/relation-selection.d.ts +25 -0
  346. package/packages/tools/lib/model/relation-selection.d.ts.map +1 -0
  347. package/packages/tools/lib/model/relation-selection.js +65 -0
  348. package/packages/tools/lib/model/relation-selection.js.map +1 -0
  349. package/packages/tools/lib/model/relationship-legality.d.ts +6 -0
  350. package/packages/tools/lib/model/relationship-legality.d.ts.map +1 -1
  351. package/packages/tools/lib/model/relationship-legality.js.map +1 -1
  352. package/packages/tools/lib/model/relationship-registry.d.ts +21 -8
  353. package/packages/tools/lib/model/relationship-registry.d.ts.map +1 -1
  354. package/packages/tools/lib/model/relationship-registry.js +77 -129
  355. package/packages/tools/lib/model/relationship-registry.js.map +1 -1
  356. package/packages/tools/lib/model/relationship-subjects.d.ts +28 -0
  357. package/packages/tools/lib/model/relationship-subjects.d.ts.map +1 -0
  358. package/packages/tools/lib/model/relationship-subjects.js +126 -0
  359. package/packages/tools/lib/model/relationship-subjects.js.map +1 -0
  360. package/packages/tools/lib/model/release-target.d.ts +12 -0
  361. package/packages/tools/lib/model/release-target.d.ts.map +1 -0
  362. package/packages/tools/lib/model/release-target.js +35 -0
  363. package/packages/tools/lib/model/release-target.js.map +1 -0
  364. package/packages/tools/lib/model/selector-vocabulary.d.ts +47 -0
  365. package/packages/tools/lib/model/selector-vocabulary.d.ts.map +1 -0
  366. package/packages/tools/lib/model/selector-vocabulary.js +181 -0
  367. package/packages/tools/lib/model/selector-vocabulary.js.map +1 -0
  368. package/packages/tools/lib/model/semantic.d.ts +99 -7
  369. package/packages/tools/lib/model/semantic.d.ts.map +1 -1
  370. package/packages/tools/lib/model/semantic.js +13 -1
  371. package/packages/tools/lib/model/semantic.js.map +1 -1
  372. package/packages/tools/lib/model/settings-boundary.d.ts.map +1 -1
  373. package/packages/tools/lib/model/settings-boundary.js +9 -8
  374. package/packages/tools/lib/model/settings-boundary.js.map +1 -1
  375. package/packages/tools/lib/model/short-id.d.ts.map +1 -1
  376. package/packages/tools/lib/model/short-id.js +4 -0
  377. package/packages/tools/lib/model/short-id.js.map +1 -1
  378. package/packages/tools/lib/model/source-graph.d.ts +9 -7
  379. package/packages/tools/lib/model/source-graph.d.ts.map +1 -1
  380. package/packages/tools/lib/model/source-graph.js +19 -24
  381. package/packages/tools/lib/model/source-graph.js.map +1 -1
  382. package/packages/tools/lib/model/source-provenance.d.ts +5 -1
  383. package/packages/tools/lib/model/source-provenance.d.ts.map +1 -1
  384. package/packages/tools/lib/model/source-provenance.js.map +1 -1
  385. package/packages/tools/lib/model/sysml-files.js +1 -1
  386. package/packages/tools/lib/model/sysml-ir.d.ts +2 -5
  387. package/packages/tools/lib/model/sysml-ir.d.ts.map +1 -1
  388. package/packages/tools/lib/model/sysml-ir.js +1 -100
  389. package/packages/tools/lib/model/sysml-ir.js.map +1 -1
  390. package/packages/tools/lib/model/toolchain-merge.d.ts +4 -0
  391. package/packages/tools/lib/model/toolchain-merge.d.ts.map +1 -0
  392. package/packages/tools/lib/model/toolchain-merge.js +34 -0
  393. package/packages/tools/lib/model/toolchain-merge.js.map +1 -0
  394. package/packages/tools/lib/model/user-settings.d.ts +13 -0
  395. package/packages/tools/lib/model/user-settings.d.ts.map +1 -0
  396. package/packages/tools/lib/model/user-settings.js +83 -0
  397. package/packages/tools/lib/model/user-settings.js.map +1 -0
  398. package/packages/tools/lib/model/variability.d.ts +56 -0
  399. package/packages/tools/lib/model/variability.d.ts.map +1 -0
  400. package/packages/tools/lib/model/variability.js +116 -0
  401. package/packages/tools/lib/model/variability.js.map +1 -0
  402. package/packages/tools/lib/model/version-range.d.ts +2 -0
  403. package/packages/tools/lib/model/version-range.d.ts.map +1 -0
  404. package/packages/tools/lib/model/version-range.js +37 -0
  405. package/packages/tools/lib/model/version-range.js.map +1 -0
  406. package/packages/tools/lib/model/view-deriver.d.ts +16 -0
  407. package/packages/tools/lib/model/view-deriver.d.ts.map +1 -1
  408. package/packages/tools/lib/model/view-deriver.js +100 -26
  409. package/packages/tools/lib/model/view-deriver.js.map +1 -1
  410. package/packages/tools/lib/model/view-layout-block.d.ts +81 -0
  411. package/packages/tools/lib/model/view-layout-block.d.ts.map +1 -0
  412. package/packages/tools/lib/model/view-layout-block.js +525 -0
  413. package/packages/tools/lib/model/view-layout-block.js.map +1 -0
  414. package/packages/tools/lib/model/view-layout-migration.d.ts +54 -0
  415. package/packages/tools/lib/model/view-layout-migration.d.ts.map +1 -0
  416. package/packages/tools/lib/model/view-layout-migration.js +156 -0
  417. package/packages/tools/lib/model/view-layout-migration.js.map +1 -0
  418. package/packages/tools/lib/model/workspace-membership.d.ts +99 -0
  419. package/packages/tools/lib/model/workspace-membership.d.ts.map +1 -0
  420. package/packages/tools/lib/model/workspace-membership.js +281 -0
  421. package/packages/tools/lib/model/workspace-membership.js.map +1 -0
  422. package/packages/tools/lib/ontology/owl-exporter.d.ts +1 -1
  423. package/packages/tools/lib/ontology/owl-exporter.d.ts.map +1 -1
  424. package/packages/tools/lib/ontology/owl-exporter.js +1 -1
  425. package/packages/tools/lib/ontology/owl-exporter.js.map +1 -1
  426. package/packages/tools/lib/operations/ai-authoring.d.ts.map +1 -1
  427. package/packages/tools/lib/operations/ai-authoring.js +7 -5
  428. package/packages/tools/lib/operations/ai-authoring.js.map +1 -1
  429. package/packages/tools/lib/operations/authoring.d.ts +10 -4
  430. package/packages/tools/lib/operations/authoring.d.ts.map +1 -1
  431. package/packages/tools/lib/operations/authoring.js +27 -11
  432. package/packages/tools/lib/operations/authoring.js.map +1 -1
  433. package/packages/tools/lib/operations/index.d.ts +2 -0
  434. package/packages/tools/lib/operations/index.d.ts.map +1 -1
  435. package/packages/tools/lib/operations/index.js +1 -0
  436. package/packages/tools/lib/operations/index.js.map +1 -1
  437. package/packages/tools/lib/operations/project-snapshot.d.ts.map +1 -1
  438. package/packages/tools/lib/operations/project-snapshot.js +7 -13
  439. package/packages/tools/lib/operations/project-snapshot.js.map +1 -1
  440. package/packages/tools/lib/plugin/plugin-scaffold.js +2 -2
  441. package/packages/tools/lib/plugin/plugin-scaffold.js.map +1 -1
  442. package/packages/tools/lib/protocol/messages.d.ts +375 -7
  443. package/packages/tools/lib/protocol/messages.d.ts.map +1 -1
  444. package/packages/tools/lib/serializer/csv-io.d.ts +37 -29
  445. package/packages/tools/lib/serializer/csv-io.d.ts.map +1 -1
  446. package/packages/tools/lib/serializer/csv-io.js +64 -31
  447. package/packages/tools/lib/serializer/csv-io.js.map +1 -1
  448. package/packages/tools/lib/serializer/sysml-generator.d.ts +15 -2
  449. package/packages/tools/lib/serializer/sysml-generator.d.ts.map +1 -1
  450. package/packages/tools/lib/serializer/sysml-generator.js +45 -17
  451. package/packages/tools/lib/serializer/sysml-generator.js.map +1 -1
  452. package/packages/tools/lib/server/conflict-policy.js +1 -1
  453. package/packages/tools/lib/server/conflict-policy.js.map +1 -1
  454. package/packages/tools/lib/server/dashboard-store.d.ts +1 -7
  455. package/packages/tools/lib/server/dashboard-store.d.ts.map +1 -1
  456. package/packages/tools/lib/server/dashboard-store.js +3 -14
  457. package/packages/tools/lib/server/dashboard-store.js.map +1 -1
  458. package/packages/tools/lib/server/dev-server.d.ts +48 -1
  459. package/packages/tools/lib/server/dev-server.d.ts.map +1 -1
  460. package/packages/tools/lib/server/dev-server.js +529 -80
  461. package/packages/tools/lib/server/dev-server.js.map +1 -1
  462. package/packages/tools/lib/server/dev-validate.d.ts +30 -0
  463. package/packages/tools/lib/server/dev-validate.d.ts.map +1 -0
  464. package/packages/tools/lib/server/dev-validate.js +82 -0
  465. package/packages/tools/lib/server/dev-validate.js.map +1 -0
  466. package/packages/tools/lib/server/element-writer.d.ts +4 -1
  467. package/packages/tools/lib/server/element-writer.d.ts.map +1 -1
  468. package/packages/tools/lib/server/element-writer.js +56 -35
  469. package/packages/tools/lib/server/element-writer.js.map +1 -1
  470. package/packages/tools/lib/server/mutation-domain.d.ts +10 -0
  471. package/packages/tools/lib/server/mutation-domain.d.ts.map +1 -1
  472. package/packages/tools/lib/server/mutation-domain.js +45 -8
  473. package/packages/tools/lib/server/mutation-domain.js.map +1 -1
  474. package/packages/tools/lib/server/package-source.d.ts +13 -3
  475. package/packages/tools/lib/server/package-source.d.ts.map +1 -1
  476. package/packages/tools/lib/server/package-source.js +31 -39
  477. package/packages/tools/lib/server/package-source.js.map +1 -1
  478. package/packages/tools/lib/server/package-writer.d.ts +19 -6
  479. package/packages/tools/lib/server/package-writer.d.ts.map +1 -1
  480. package/packages/tools/lib/server/package-writer.js +90 -39
  481. package/packages/tools/lib/server/package-writer.js.map +1 -1
  482. package/packages/tools/lib/server/persistor.d.ts +33 -7
  483. package/packages/tools/lib/server/persistor.d.ts.map +1 -1
  484. package/packages/tools/lib/server/persistor.js +63 -48
  485. package/packages/tools/lib/server/persistor.js.map +1 -1
  486. package/packages/tools/lib/server/project-gitignore.d.ts +9 -0
  487. package/packages/tools/lib/server/project-gitignore.d.ts.map +1 -0
  488. package/packages/tools/lib/server/project-gitignore.js +27 -0
  489. package/packages/tools/lib/server/project-gitignore.js.map +1 -0
  490. package/packages/tools/lib/server/relationship-writer.d.ts +31 -2
  491. package/packages/tools/lib/server/relationship-writer.d.ts.map +1 -1
  492. package/packages/tools/lib/server/relationship-writer.js +255 -95
  493. package/packages/tools/lib/server/relationship-writer.js.map +1 -1
  494. package/packages/tools/lib/server/release-writer.d.ts +46 -0
  495. package/packages/tools/lib/server/release-writer.d.ts.map +1 -0
  496. package/packages/tools/lib/server/release-writer.js +133 -0
  497. package/packages/tools/lib/server/release-writer.js.map +1 -0
  498. package/packages/tools/lib/server/rule-policy-writer.d.ts +17 -4
  499. package/packages/tools/lib/server/rule-policy-writer.d.ts.map +1 -1
  500. package/packages/tools/lib/server/rule-policy-writer.js +92 -7
  501. package/packages/tools/lib/server/rule-policy-writer.js.map +1 -1
  502. package/packages/tools/lib/server/rule-service.d.ts +50 -0
  503. package/packages/tools/lib/server/rule-service.d.ts.map +1 -0
  504. package/packages/tools/lib/server/rule-service.js +89 -0
  505. package/packages/tools/lib/server/rule-service.js.map +1 -0
  506. package/packages/tools/lib/server/rule-writer.d.ts +87 -0
  507. package/packages/tools/lib/server/rule-writer.d.ts.map +1 -0
  508. package/packages/tools/lib/server/rule-writer.js +165 -0
  509. package/packages/tools/lib/server/rule-writer.js.map +1 -0
  510. package/packages/tools/lib/server/suspect-review.d.ts +11 -0
  511. package/packages/tools/lib/server/suspect-review.d.ts.map +1 -0
  512. package/packages/tools/lib/server/suspect-review.js +28 -0
  513. package/packages/tools/lib/server/suspect-review.js.map +1 -0
  514. package/packages/tools/lib/server/sysml-notation.d.ts +1 -1
  515. package/packages/tools/lib/server/sysml-notation.d.ts.map +1 -1
  516. package/packages/tools/lib/server/sysml-notation.js +5 -0
  517. package/packages/tools/lib/server/sysml-notation.js.map +1 -1
  518. package/packages/tools/lib/server/user-preferences.d.ts +8 -0
  519. package/packages/tools/lib/server/user-preferences.d.ts.map +1 -0
  520. package/packages/tools/lib/server/user-preferences.js +47 -0
  521. package/packages/tools/lib/server/user-preferences.js.map +1 -0
  522. package/packages/tools/lib/server/version-servers.d.ts +60 -0
  523. package/packages/tools/lib/server/version-servers.d.ts.map +1 -0
  524. package/packages/tools/lib/server/version-servers.js +106 -0
  525. package/packages/tools/lib/server/version-servers.js.map +1 -0
  526. package/packages/tools/lib/server/view-layout-store.d.ts +28 -13
  527. package/packages/tools/lib/server/view-layout-store.d.ts.map +1 -1
  528. package/packages/tools/lib/server/view-layout-store.js +106 -106
  529. package/packages/tools/lib/server/view-layout-store.js.map +1 -1
  530. package/packages/tools/lib/server/view-writer.d.ts +22 -2
  531. package/packages/tools/lib/server/view-writer.d.ts.map +1 -1
  532. package/packages/tools/lib/server/view-writer.js +99 -44
  533. package/packages/tools/lib/server/view-writer.js.map +1 -1
  534. package/packages/tools/lib/server/write-guard.d.ts +7 -0
  535. package/packages/tools/lib/server/write-guard.d.ts.map +1 -0
  536. package/packages/tools/lib/server/write-guard.js +77 -0
  537. package/packages/tools/lib/server/write-guard.js.map +1 -0
  538. package/packages/tools/lib/stage2/api-model.d.ts +160 -0
  539. package/packages/tools/lib/stage2/api-model.d.ts.map +1 -0
  540. package/packages/tools/lib/stage2/api-model.js +341 -0
  541. package/packages/tools/lib/stage2/api-model.js.map +1 -0
  542. package/packages/tools/lib/stage2/build-from-api.d.ts +47 -0
  543. package/packages/tools/lib/stage2/build-from-api.d.ts.map +1 -0
  544. package/packages/tools/lib/stage2/build-from-api.js +1462 -0
  545. package/packages/tools/lib/stage2/build-from-api.js.map +1 -0
  546. package/packages/tools/lib/stage2/guide-from-api.d.ts +38 -0
  547. package/packages/tools/lib/stage2/guide-from-api.d.ts.map +1 -0
  548. package/packages/tools/lib/stage2/guide-from-api.js +97 -0
  549. package/packages/tools/lib/stage2/guide-from-api.js.map +1 -0
  550. package/packages/tools/lib/stage2/handoff-files.d.ts +13 -0
  551. package/packages/tools/lib/stage2/handoff-files.d.ts.map +1 -0
  552. package/packages/tools/lib/stage2/handoff-files.js +32 -0
  553. package/packages/tools/lib/stage2/handoff-files.js.map +1 -0
  554. package/packages/tools/lib/stage2/methodology-from-api.d.ts +10 -0
  555. package/packages/tools/lib/stage2/methodology-from-api.d.ts.map +1 -0
  556. package/packages/tools/lib/stage2/methodology-from-api.js +109 -0
  557. package/packages/tools/lib/stage2/methodology-from-api.js.map +1 -0
  558. package/packages/tools/lib/stage2/package-metadata-from-api.d.ts +15 -0
  559. package/packages/tools/lib/stage2/package-metadata-from-api.d.ts.map +1 -0
  560. package/packages/tools/lib/stage2/package-metadata-from-api.js +238 -0
  561. package/packages/tools/lib/stage2/package-metadata-from-api.js.map +1 -0
  562. package/packages/tools/lib/stage2/project-from-api.d.ts +60 -0
  563. package/packages/tools/lib/stage2/project-from-api.d.ts.map +1 -0
  564. package/packages/tools/lib/stage2/project-from-api.js +328 -0
  565. package/packages/tools/lib/stage2/project-from-api.js.map +1 -0
  566. package/packages/tools/lib/stage2/registries-from-api.d.ts +68 -0
  567. package/packages/tools/lib/stage2/registries-from-api.d.ts.map +1 -0
  568. package/packages/tools/lib/stage2/registries-from-api.js +313 -0
  569. package/packages/tools/lib/stage2/registries-from-api.js.map +1 -0
  570. package/packages/tools/lib/stage2/stage2-from-handoff.d.ts +26 -0
  571. package/packages/tools/lib/stage2/stage2-from-handoff.d.ts.map +1 -0
  572. package/packages/tools/lib/stage2/stage2-from-handoff.js +34 -0
  573. package/packages/tools/lib/stage2/stage2-from-handoff.js.map +1 -0
  574. package/packages/tools/lib/stage2/sysml-names.d.ts +9 -0
  575. package/packages/tools/lib/stage2/sysml-names.d.ts.map +1 -0
  576. package/packages/tools/lib/stage2/sysml-names.js +39 -0
  577. package/packages/tools/lib/stage2/sysml-names.js.map +1 -0
  578. package/packages/tools/lib/toolchain/default-registry.d.ts +2 -2
  579. package/packages/tools/lib/toolchain/default-registry.d.ts.map +1 -1
  580. package/packages/tools/lib/toolchain/default-registry.js +9 -5
  581. package/packages/tools/lib/toolchain/default-registry.js.map +1 -1
  582. package/packages/tools/lib/toolchain/diagnostic.d.ts +2 -2
  583. package/packages/tools/lib/toolchain/diagnostic.js +1 -1
  584. package/packages/tools/lib/toolchain/diagnostic.js.map +1 -1
  585. package/packages/tools/lib/toolchain/effective.d.ts +25 -17
  586. package/packages/tools/lib/toolchain/effective.d.ts.map +1 -1
  587. package/packages/tools/lib/toolchain/effective.js +45 -40
  588. package/packages/tools/lib/toolchain/effective.js.map +1 -1
  589. package/packages/tools/lib/toolchain/exceptions.d.ts +27 -0
  590. package/packages/tools/lib/toolchain/exceptions.d.ts.map +1 -0
  591. package/packages/tools/lib/toolchain/exceptions.js +77 -0
  592. package/packages/tools/lib/toolchain/exceptions.js.map +1 -0
  593. package/packages/tools/lib/toolchain/index.d.ts +2 -2
  594. package/packages/tools/lib/toolchain/index.d.ts.map +1 -1
  595. package/packages/tools/lib/toolchain/index.js +2 -2
  596. package/packages/tools/lib/toolchain/index.js.map +1 -1
  597. package/packages/tools/lib/toolchain/operations.d.ts +45 -10
  598. package/packages/tools/lib/toolchain/operations.d.ts.map +1 -1
  599. package/packages/tools/lib/toolchain/operations.js +107 -8
  600. package/packages/tools/lib/toolchain/operations.js.map +1 -1
  601. package/packages/tools/lib/toolchain/ownership.d.ts +13 -0
  602. package/packages/tools/lib/toolchain/ownership.d.ts.map +1 -0
  603. package/packages/tools/lib/toolchain/ownership.js +57 -0
  604. package/packages/tools/lib/toolchain/ownership.js.map +1 -0
  605. package/packages/tools/lib/toolchain/process.d.ts +2 -2
  606. package/packages/tools/lib/toolchain/process.js +2 -2
  607. package/packages/tools/lib/toolchain/project-config.d.ts +4 -0
  608. package/packages/tools/lib/toolchain/project-config.d.ts.map +1 -0
  609. package/packages/tools/lib/toolchain/project-config.js +13 -0
  610. package/packages/tools/lib/toolchain/project-config.js.map +1 -0
  611. package/packages/tools/lib/toolchain/project-model.d.ts +75 -0
  612. package/packages/tools/lib/toolchain/project-model.d.ts.map +1 -0
  613. package/packages/tools/lib/toolchain/project-model.js +92 -0
  614. package/packages/tools/lib/toolchain/project-model.js.map +1 -0
  615. package/packages/tools/lib/toolchain/providers/internal-package.d.ts +6 -0
  616. package/packages/tools/lib/toolchain/providers/internal-package.d.ts.map +1 -0
  617. package/packages/tools/lib/toolchain/providers/internal-package.js +47 -0
  618. package/packages/tools/lib/toolchain/providers/internal-package.js.map +1 -0
  619. package/packages/tools/lib/toolchain/providers/opensysml-check.d.ts +20 -0
  620. package/packages/tools/lib/toolchain/providers/opensysml-check.d.ts.map +1 -0
  621. package/packages/tools/lib/toolchain/providers/opensysml-check.js +95 -0
  622. package/packages/tools/lib/toolchain/providers/opensysml-check.js.map +1 -0
  623. package/packages/tools/lib/toolchain/providers/opensysml-compact.d.ts +17 -0
  624. package/packages/tools/lib/toolchain/providers/opensysml-compact.d.ts.map +1 -0
  625. package/packages/tools/lib/toolchain/providers/opensysml-compact.js +69 -0
  626. package/packages/tools/lib/toolchain/providers/opensysml-compact.js.map +1 -0
  627. package/packages/tools/lib/toolchain/providers/opensysml-lowering.d.ts +50 -0
  628. package/packages/tools/lib/toolchain/providers/opensysml-lowering.d.ts.map +1 -0
  629. package/packages/tools/lib/toolchain/providers/opensysml-lowering.js +646 -0
  630. package/packages/tools/lib/toolchain/providers/opensysml-lowering.js.map +1 -0
  631. package/packages/tools/lib/toolchain/providers/opensysml-names.d.ts +16 -0
  632. package/packages/tools/lib/toolchain/providers/opensysml-names.d.ts.map +1 -0
  633. package/packages/tools/lib/toolchain/providers/opensysml-names.js +37 -0
  634. package/packages/tools/lib/toolchain/providers/opensysml-names.js.map +1 -0
  635. package/packages/tools/lib/toolchain/providers/opensysml.d.ts +88 -0
  636. package/packages/tools/lib/toolchain/providers/opensysml.d.ts.map +1 -0
  637. package/packages/tools/lib/toolchain/providers/opensysml.js +178 -0
  638. package/packages/tools/lib/toolchain/providers/opensysml.js.map +1 -0
  639. package/packages/tools/lib/toolchain/providers/recommended.d.ts +2 -0
  640. package/packages/tools/lib/toolchain/providers/recommended.d.ts.map +1 -0
  641. package/packages/tools/lib/toolchain/providers/recommended.js +13 -0
  642. package/packages/tools/lib/toolchain/providers/recommended.js.map +1 -0
  643. package/packages/tools/lib/toolchain/providers/sysand-project.d.ts +60 -0
  644. package/packages/tools/lib/toolchain/providers/sysand-project.d.ts.map +1 -0
  645. package/packages/tools/lib/toolchain/providers/sysand-project.js +160 -0
  646. package/packages/tools/lib/toolchain/providers/sysand-project.js.map +1 -0
  647. package/packages/tools/lib/toolchain/providers/sysand.d.ts.map +1 -1
  648. package/packages/tools/lib/toolchain/providers/sysand.js +26 -2
  649. package/packages/tools/lib/toolchain/providers/sysand.js.map +1 -1
  650. package/packages/tools/lib/toolchain/providers/syside-lowering.d.ts +29 -0
  651. package/packages/tools/lib/toolchain/providers/syside-lowering.d.ts.map +1 -0
  652. package/packages/tools/lib/toolchain/providers/syside-lowering.js +497 -0
  653. package/packages/tools/lib/toolchain/providers/syside-lowering.js.map +1 -0
  654. package/packages/tools/lib/toolchain/providers/syside-python.d.ts +9 -0
  655. package/packages/tools/lib/toolchain/providers/syside-python.d.ts.map +1 -0
  656. package/packages/tools/lib/toolchain/providers/syside-python.js +69 -0
  657. package/packages/tools/lib/toolchain/providers/syside-python.js.map +1 -0
  658. package/packages/tools/lib/toolchain/providers/syside.d.ts.map +1 -1
  659. package/packages/tools/lib/toolchain/providers/syside.js +2 -0
  660. package/packages/tools/lib/toolchain/providers/syside.js.map +1 -1
  661. package/packages/tools/lib/toolchain/registry.d.ts +118 -21
  662. package/packages/tools/lib/toolchain/registry.d.ts.map +1 -1
  663. package/packages/tools/lib/toolchain/registry.js +18 -24
  664. package/packages/tools/lib/toolchain/registry.js.map +1 -1
  665. package/packages/tools/lib/toolchain/schema.d.ts +6 -5
  666. package/packages/tools/lib/toolchain/schema.d.ts.map +1 -1
  667. package/packages/tools/lib/toolchain/schema.js +8 -13
  668. package/packages/tools/lib/toolchain/schema.js.map +1 -1
  669. package/packages/tools/lib/toolchain/shipped-library.d.ts +28 -0
  670. package/packages/tools/lib/toolchain/shipped-library.d.ts.map +1 -0
  671. package/packages/tools/lib/toolchain/shipped-library.js +120 -0
  672. package/packages/tools/lib/toolchain/shipped-library.js.map +1 -0
  673. package/packages/tools/lib/toolchain/source-fingerprint.d.ts +2 -0
  674. package/packages/tools/lib/toolchain/source-fingerprint.d.ts.map +1 -0
  675. package/packages/tools/lib/toolchain/source-fingerprint.js +30 -0
  676. package/packages/tools/lib/toolchain/source-fingerprint.js.map +1 -0
  677. package/packages/tools/lib/toolchain/user-settings-status.d.ts +51 -0
  678. package/packages/tools/lib/toolchain/user-settings-status.d.ts.map +1 -0
  679. package/packages/tools/lib/toolchain/user-settings-status.js +104 -0
  680. package/packages/tools/lib/toolchain/user-settings-status.js.map +1 -0
  681. package/packages/tools/lib/validator/architecture-validator.d.ts.map +1 -1
  682. package/packages/tools/lib/validator/architecture-validator.js +2 -1
  683. package/packages/tools/lib/validator/architecture-validator.js.map +1 -1
  684. package/packages/tools/lib/validator/behavior-validator.js +1 -1
  685. package/packages/tools/lib/validator/behavior-validator.js.map +1 -1
  686. package/packages/tools/lib/validator/builtin-rules.js +1 -1
  687. package/packages/tools/lib/validator/builtin-rules.js.map +1 -1
  688. package/packages/tools/lib/validator/constraint-eval.d.ts +30 -4
  689. package/packages/tools/lib/validator/constraint-eval.d.ts.map +1 -1
  690. package/packages/tools/lib/validator/constraint-eval.js +101 -59
  691. package/packages/tools/lib/validator/constraint-eval.js.map +1 -1
  692. package/packages/tools/lib/validator/constraint-loader-api.d.ts +22 -0
  693. package/packages/tools/lib/validator/constraint-loader-api.d.ts.map +1 -0
  694. package/packages/tools/lib/validator/constraint-loader-api.js +160 -0
  695. package/packages/tools/lib/validator/constraint-loader-api.js.map +1 -0
  696. package/packages/tools/lib/validator/constraint-loader.d.ts +22 -18
  697. package/packages/tools/lib/validator/constraint-loader.d.ts.map +1 -1
  698. package/packages/tools/lib/validator/constraint-loader.js +33 -141
  699. package/packages/tools/lib/validator/constraint-loader.js.map +1 -1
  700. package/packages/tools/lib/validator/rule-clauses.d.ts +51 -0
  701. package/packages/tools/lib/validator/rule-clauses.d.ts.map +1 -0
  702. package/packages/tools/lib/validator/rule-clauses.js +87 -0
  703. package/packages/tools/lib/validator/rule-clauses.js.map +1 -0
  704. package/packages/tools/lib/validator/rule-engine.d.ts +9 -1
  705. package/packages/tools/lib/validator/rule-engine.d.ts.map +1 -1
  706. package/packages/tools/lib/validator/rule-engine.js +50 -6
  707. package/packages/tools/lib/validator/rule-engine.js.map +1 -1
  708. package/packages/tools/lib/validator/rule-registry.d.ts +4 -8
  709. package/packages/tools/lib/validator/rule-registry.d.ts.map +1 -1
  710. package/packages/tools/lib/validator/rule-registry.js +42 -79
  711. package/packages/tools/lib/validator/rule-registry.js.map +1 -1
  712. package/packages/tools/lib/validator/rule-tailoring.d.ts +62 -0
  713. package/packages/tools/lib/validator/rule-tailoring.d.ts.map +1 -0
  714. package/packages/tools/lib/validator/rule-tailoring.js +85 -0
  715. package/packages/tools/lib/validator/rule-tailoring.js.map +1 -0
  716. package/packages/tools/lib/validator/types.d.ts +12 -1
  717. package/packages/tools/lib/validator/types.d.ts.map +1 -1
  718. package/packages/tools/lib/validator/workspace-boundary-validator.d.ts +9 -0
  719. package/packages/tools/lib/validator/workspace-boundary-validator.d.ts.map +1 -0
  720. package/packages/tools/lib/validator/workspace-boundary-validator.js +28 -0
  721. package/packages/tools/lib/validator/workspace-boundary-validator.js.map +1 -0
  722. package/packages/tools/python/memo_model.py +243 -0
  723. package/packages/tools/python/memo_stage1_syside.py +389 -0
  724. package/packages/tools/lib/commands/check.d.ts +0 -6
  725. package/packages/tools/lib/commands/check.d.ts.map +0 -1
  726. package/packages/tools/lib/commands/check.js +0 -191
  727. package/packages/tools/lib/commands/check.js.map +0 -1
  728. package/packages/tools/lib/commands/conformance.d.ts +0 -36
  729. package/packages/tools/lib/commands/conformance.d.ts.map +0 -1
  730. package/packages/tools/lib/commands/conformance.js +0 -212
  731. package/packages/tools/lib/commands/conformance.js.map +0 -1
  732. package/packages/tools/lib/commands/roundtrip.d.ts +0 -6
  733. package/packages/tools/lib/commands/roundtrip.d.ts.map +0 -1
  734. package/packages/tools/lib/commands/roundtrip.js +0 -145
  735. package/packages/tools/lib/commands/roundtrip.js.map +0 -1
  736. package/packages/tools/lib/conformance/baseline.d.ts +0 -26
  737. package/packages/tools/lib/conformance/baseline.d.ts.map +0 -1
  738. package/packages/tools/lib/conformance/baseline.js +0 -170
  739. package/packages/tools/lib/conformance/baseline.js.map +0 -1
  740. package/packages/tools/lib/conformance/bnf.d.ts +0 -84
  741. package/packages/tools/lib/conformance/bnf.d.ts.map +0 -1
  742. package/packages/tools/lib/conformance/bnf.js +0 -166
  743. package/packages/tools/lib/conformance/bnf.js.map +0 -1
  744. package/packages/tools/lib/conformance/corpus.d.ts +0 -125
  745. package/packages/tools/lib/conformance/corpus.d.ts.map +0 -1
  746. package/packages/tools/lib/conformance/corpus.js +0 -190
  747. package/packages/tools/lib/conformance/corpus.js.map +0 -1
  748. package/packages/tools/lib/conformance/diff-xmi.d.ts +0 -118
  749. package/packages/tools/lib/conformance/diff-xmi.d.ts.map +0 -1
  750. package/packages/tools/lib/conformance/diff-xmi.js +0 -276
  751. package/packages/tools/lib/conformance/diff-xmi.js.map +0 -1
  752. package/packages/tools/lib/conformance/generated/syside-rules.d.ts +0 -10
  753. package/packages/tools/lib/conformance/generated/syside-rules.d.ts.map +0 -1
  754. package/packages/tools/lib/conformance/generated/syside-rules.js +0 -1142
  755. package/packages/tools/lib/conformance/generated/syside-rules.js.map +0 -1
  756. package/packages/tools/lib/conformance/index.d.ts +0 -7
  757. package/packages/tools/lib/conformance/index.d.ts.map +0 -1
  758. package/packages/tools/lib/conformance/index.js +0 -19
  759. package/packages/tools/lib/conformance/index.js.map +0 -1
  760. package/packages/tools/lib/conformance/run.d.ts +0 -117
  761. package/packages/tools/lib/conformance/run.d.ts.map +0 -1
  762. package/packages/tools/lib/conformance/run.js +0 -0
  763. package/packages/tools/lib/conformance/run.js.map +0 -1
  764. package/packages/tools/lib/conformance/xmi.d.ts +0 -45
  765. package/packages/tools/lib/conformance/xmi.d.ts.map +0 -1
  766. package/packages/tools/lib/conformance/xmi.js +0 -148
  767. package/packages/tools/lib/conformance/xmi.js.map +0 -1
  768. package/packages/tools/lib/language/generated/ast.d.ts +0 -3571
  769. package/packages/tools/lib/language/generated/ast.d.ts.map +0 -1
  770. package/packages/tools/lib/language/generated/ast.js +0 -2980
  771. package/packages/tools/lib/language/generated/ast.js.map +0 -1
  772. package/packages/tools/lib/language/generated/grammar.d.ts +0 -7
  773. package/packages/tools/lib/language/generated/grammar.d.ts.map +0 -1
  774. package/packages/tools/lib/language/generated/grammar.js +0 -10687
  775. package/packages/tools/lib/language/generated/grammar.js.map +0 -1
  776. package/packages/tools/lib/language/generated/module.d.ts +0 -14
  777. package/packages/tools/lib/language/generated/module.d.ts.map +0 -1
  778. package/packages/tools/lib/language/generated/module.js +0 -21
  779. package/packages/tools/lib/language/generated/module.js.map +0 -1
  780. package/packages/tools/lib/language/memo-sysml-module.d.ts +0 -24
  781. package/packages/tools/lib/language/memo-sysml-module.d.ts.map +0 -1
  782. package/packages/tools/lib/language/memo-sysml-module.js +0 -20
  783. package/packages/tools/lib/language/memo-sysml-module.js.map +0 -1
  784. package/packages/tools/lib/model/builder.d.ts +0 -27
  785. package/packages/tools/lib/model/builder.d.ts.map +0 -1
  786. package/packages/tools/lib/model/builder.js +0 -2112
  787. package/packages/tools/lib/model/builder.js.map +0 -1
  788. package/packages/tools/lib/model/package-registry.d.ts +0 -64
  789. package/packages/tools/lib/model/package-registry.d.ts.map +0 -1
  790. package/packages/tools/lib/model/package-registry.js +0 -184
  791. package/packages/tools/lib/model/package-registry.js.map +0 -1
  792. package/packages/tools/lib/model/parser-utils.d.ts +0 -65
  793. package/packages/tools/lib/model/parser-utils.d.ts.map +0 -1
  794. package/packages/tools/lib/model/parser-utils.js +0 -201
  795. package/packages/tools/lib/model/parser-utils.js.map +0 -1
  796. package/packages/tools/lib/sysmlc/bin/memo-sysmlc.d.ts +0 -3
  797. package/packages/tools/lib/sysmlc/bin/memo-sysmlc.d.ts.map +0 -1
  798. package/packages/tools/lib/sysmlc/bin/memo-sysmlc.js +0 -97
  799. package/packages/tools/lib/sysmlc/bin/memo-sysmlc.js.map +0 -1
  800. package/packages/tools/lib/sysmlc/index.d.ts +0 -2
  801. package/packages/tools/lib/sysmlc/index.d.ts.map +0 -1
  802. package/packages/tools/lib/sysmlc/index.js +0 -7
  803. package/packages/tools/lib/sysmlc/index.js.map +0 -1
  804. package/packages/tools/lib/sysmlc/server.d.ts +0 -29
  805. package/packages/tools/lib/sysmlc/server.d.ts.map +0 -1
  806. package/packages/tools/lib/sysmlc/server.js +0 -168
  807. package/packages/tools/lib/sysmlc/server.js.map +0 -1
  808. package/packages/tools/lib/toolchain/lowering.d.ts +0 -63
  809. package/packages/tools/lib/toolchain/lowering.d.ts.map +0 -1
  810. package/packages/tools/lib/toolchain/lowering.js +0 -100
  811. package/packages/tools/lib/toolchain/lowering.js.map +0 -1
  812. package/packages/tools/lib/toolchain/providers/internal.d.ts +0 -33
  813. package/packages/tools/lib/toolchain/providers/internal.d.ts.map +0 -1
  814. package/packages/tools/lib/toolchain/providers/internal.js +0 -286
  815. package/packages/tools/lib/toolchain/providers/internal.js.map +0 -1
  816. package/packages/tools/lib/toolchain/sysmlc-client.d.ts +0 -77
  817. package/packages/tools/lib/toolchain/sysmlc-client.d.ts.map +0 -1
  818. package/packages/tools/lib/toolchain/sysmlc-client.js +0 -0
  819. package/packages/tools/lib/toolchain/sysmlc-client.js.map +0 -1
  820. package/packages/tools/lib/validator/sysml-constraints.d.ts +0 -64
  821. package/packages/tools/lib/validator/sysml-constraints.d.ts.map +0 -1
  822. package/packages/tools/lib/validator/sysml-constraints.js +0 -251
  823. package/packages/tools/lib/validator/sysml-constraints.js.map +0 -1
  824. package/packages/tools/src/grammar/memo-sysml.langium +0 -1064
@@ -0,0 +1,1462 @@
1
+ // ─── Stage 2: the MEMO graph from stage 1's API JSON ─────────────────────────
2
+ //
3
+ // `buildMemoModel` (model/builder.ts) reads MEMO's own Langium syntax trees. This
4
+ // builds the same graph from the OMG API JSON a SysML compiler hands stage 2,
5
+ // through `ApiModel`, so MEMO no longer needs a SysML parser of its own
6
+ // (plans/memo-compiler-stages-opensysml.md, milestone 2, slice 2d).
7
+ //
8
+ // It is being built one family at a time, each held to
9
+ // `scripts/diff-memo-graph.mjs` against the Langium builder's output. This slice
10
+ // is ELEMENTS: which declarations become MEMO elements, their ids, kinds,
11
+ // constructs, layers, attributes, docs, ports and parameters. Relationships
12
+ // (connections, flows, bindings, allocations, successions, satisfy/verify) are
13
+ // the next slice; `composes` edges synthesized from nesting come with them.
14
+ //
15
+ // The rules below are the Langium builder's, restated over the metamodel. Where
16
+ // one is a rule about MEMO (what becomes an element, what a kind is) it is kept;
17
+ // where it was a workaround for the grammar's shape it has no counterpart here,
18
+ // because the metamodel already says what the grammar had to infer.
19
+ // ─────────────────────────────────────────────────────────────────────────────
20
+ import { CONTROL_KIND_METACLASS } from '../model/activity-notation.js';
21
+ import { completeModel } from '../model/complete-model.js';
22
+ import { toModelType } from '../model/naming.js';
23
+ import { LANGUAGE_NATIVE_RELATIONS, REFINEMENT_METADATA, pascalToCamelCase } from '../model/relationship-registry.js';
24
+ import { ElementIndex, qualifiedId } from '../model/element-index.js';
25
+ import { resolveLayerFromPath } from '../model/layer-resolver.js';
26
+ import { textualName } from './sysml-names.js';
27
+ /** The definition metaclasses whose project declarations become elements, and their construct. */
28
+ const DEFINITION_CONSTRUCTS = {
29
+ PartDefinition: 'part',
30
+ PortDefinition: 'port',
31
+ InterfaceDefinition: 'interface',
32
+ ConnectionDefinition: 'connection',
33
+ RequirementDefinition: 'requirement',
34
+ VerificationCaseDefinition: 'verification',
35
+ StateDefinition: 'state',
36
+ AttributeDefinition: 'attribute',
37
+ EnumerationDefinition: 'enumeration',
38
+ UseCaseDefinition: 'use case',
39
+ };
40
+ /** The usage metaclasses a package member becomes an element as, and its construct. */
41
+ const USAGE_CONSTRUCTS = {
42
+ PartUsage: 'part',
43
+ RequirementUsage: 'requirement',
44
+ ItemUsage: 'item',
45
+ UseCaseUsage: 'use case',
46
+ VerificationCaseUsage: 'verification',
47
+ StateUsage: 'state',
48
+ PortUsage: 'port',
49
+ ViewUsage: 'view',
50
+ ConcernUsage: 'concern',
51
+ };
52
+ /** Standard metadata whose field name differs from the flat key MEMO reads. */
53
+ const METADATA_KEY_ALIASES = {
54
+ Rationale: { text: 'rationale' },
55
+ };
56
+ const lastSegment = (qualifiedName) => qualifiedName.slice(qualifiedName.lastIndexOf('::') + 2);
57
+ /**
58
+ * The finished MEMO model from a stage 1 handoff: what `buildMemoModel` returns
59
+ * from MEMO's own parse, finished by the same `completeModel`.
60
+ *
61
+ * `unresolvedReferences` is left empty on purpose: it reports qualified names
62
+ * that do not resolve, and stage 2 only ever runs on a stage 1 that resolved
63
+ * everything.
64
+ */
65
+ export function buildMemoModelFromApi(api, config, registries,
66
+ /**
67
+ * The files MEMO's project resolution counts as project source, relative to
68
+ * the project root. A file the handoff carries as project content can still
69
+ * be a resolved library root (a project's own `methodology/`), which
70
+ * `memo validate` leaves out of the model; absent, every project file counts.
71
+ */
72
+ projectFiles) {
73
+ const builder = new ElementBuilder(api, registries, projectFiles);
74
+ builder.run();
75
+ builder.buildRelationships();
76
+ return completeModel({
77
+ elements: builder.elements,
78
+ relationships: builder.relationships,
79
+ errors: [],
80
+ config,
81
+ registries,
82
+ packages: builder.packages(),
83
+ lineOfRelationship: relationship => builder.lineOf(relationship),
84
+ });
85
+ }
86
+ /** Build MEMO's elements AND relationships from a stage 1 handoff. */
87
+ export function buildFromApi(api, registries) {
88
+ const builder = new ElementBuilder(api, registries);
89
+ builder.run();
90
+ builder.buildRelationships();
91
+ return { elements: builder.elements, relationships: builder.relationships, diagnostics: builder.diagnostics };
92
+ }
93
+ /**
94
+ * Build MEMO's elements from a stage 1 handoff. `registries` are the ontology's,
95
+ * loaded exactly as `buildMemoModel`'s caller loads them.
96
+ */
97
+ export function buildElementsFromApi(api, registries) {
98
+ const builder = new ElementBuilder(api, registries);
99
+ builder.run();
100
+ return { elements: builder.elements };
101
+ }
102
+ /**
103
+ * A definition's flat attribute map and doc comment, read exactly as the
104
+ * builder reads them for model elements: declared attributes, then metadata
105
+ * applications (`@MemoIdentity { :>> providedId = … }`) over them. The rule
106
+ * loader reads ontology rules through this, so stage 2 needs no parser.
107
+ */
108
+ export function apiDefinitionFacts(api, definition) {
109
+ const builder = new ElementBuilder(api);
110
+ return { attributes: builder.attributesOf(definition), doc: builder.docOf(definition) };
111
+ }
112
+ class ElementBuilder {
113
+ api;
114
+ registries;
115
+ projectFiles;
116
+ elements = new ElementIndex();
117
+ relationships = [];
118
+ diagnostics = [];
119
+ counter = 0;
120
+ /** The line each relationship is declared on, for end-kind findings. */
121
+ relationshipLines = new Map();
122
+ /** API element → the MEMO element it became, including anonymous ones (a `terminate`). */
123
+ idOf = new Map();
124
+ constructor(api, registries, projectFiles) {
125
+ this.api = api;
126
+ this.registries = registries;
127
+ this.projectFiles = projectFiles;
128
+ }
129
+ run() {
130
+ for (const root of this.projectRootPackages())
131
+ this.visitPackage(root, '', undefined);
132
+ this.inheritKindsFromLocalDefinitions();
133
+ }
134
+ /** Top-level packages the project declares. */
135
+ projectRootPackages() {
136
+ const roots = [];
137
+ for (const element of this.api.projectElements()) {
138
+ if (element['@type'] !== 'Namespace')
139
+ continue; // a document's root namespace
140
+ if (this.projectFiles && !this.projectFiles.has(this.file(element)) && !this.api.isDependency(element['@id']))
141
+ continue;
142
+ for (const member of this.api.ownedMembers(element['@id'])) {
143
+ if (member['@type'] === 'Package' || member['@type'] === 'LibraryPackage')
144
+ roots.push(member);
145
+ }
146
+ }
147
+ return roots;
148
+ }
149
+ file(element) {
150
+ return (this.api.isDependency(element['@id']) ? this.api.dependencyFile(element['@id']) : undefined)
151
+ ?? this.api.source(element['@id'])?.file ?? '';
152
+ }
153
+ visitPackage(pkg, parent, folder) {
154
+ const name = this.api.name(pkg['@id']) ?? '';
155
+ const packageName = parent ? `${parent}::${name}` : name;
156
+ const isLibrary = pkg['@type'] === 'LibraryPackage';
157
+ // Only nested packages present as folders; the top-level package is the root.
158
+ const folderLabel = parent ? this.folderLabel(pkg, name) : undefined;
159
+ void folder;
160
+ for (const member of this.api.ownedMembers(pkg['@id'])) {
161
+ const type = member['@type'];
162
+ if (type === 'Package' || type === 'LibraryPackage') {
163
+ this.visitPackage(member, packageName, folderLabel);
164
+ continue;
165
+ }
166
+ if (!this.api.name(member['@id']))
167
+ continue;
168
+ const definition = DEFINITION_CONSTRUCTS[type];
169
+ if (definition) {
170
+ // A library package's definitions are types for other models,
171
+ // not this model's content; they stay kinds.
172
+ if (isLibrary)
173
+ continue;
174
+ this.definition(member, definition, packageName);
175
+ continue;
176
+ }
177
+ if (type === 'ActionDefinition' || type === 'CalculationDefinition') {
178
+ if (!isLibrary)
179
+ this.actionDefinition(member, packageName);
180
+ continue;
181
+ }
182
+ if (type === 'ItemDefinition') {
183
+ if (!isLibrary)
184
+ this.itemDefinition(member, packageName);
185
+ continue;
186
+ }
187
+ if (type === 'ActionUsage' || type === 'CalculationUsage') {
188
+ this.action(member, packageName, undefined);
189
+ continue;
190
+ }
191
+ if (type === 'ViewpointUsage') {
192
+ this.viewpoint(member, packageName, undefined);
193
+ continue;
194
+ }
195
+ if (type === 'TransitionUsage') {
196
+ this.transition(member, packageName, undefined);
197
+ continue;
198
+ }
199
+ if (type === 'InterfaceUsage' && this.connectorEnds(member).length >= 2)
200
+ continue; // an edge: next slice
201
+ const construct = type === 'InterfaceUsage' ? 'interface' : USAGE_CONSTRUCTS[type];
202
+ if (construct) {
203
+ const id = this.usage(member, construct, packageName, undefined);
204
+ const element = this.elements.get(id);
205
+ if (element && folderLabel && ['part', 'requirement', 'item', 'verification'].includes(construct)) {
206
+ element.attributes['elementPackage'] = folderLabel;
207
+ }
208
+ }
209
+ }
210
+ }
211
+ /** A folder's label: an explicit `Matrix folder:` doc line, else the package name tidied. */
212
+ folderLabel(pkg, name) {
213
+ const doc = this.doc(pkg);
214
+ const match = doc?.match(/Matrix folder:\s*(.+)/);
215
+ return match ? match[1].trim() : name.replace(/^folder_/, '').replace(/_/g, ' ');
216
+ }
217
+ // ─── Kinds ──────────────────────────────────────────────────────────────
218
+ /** Registry first; a qualified name falls back to its last segment, as `resolveKindDef` does. */
219
+ resolveKind(typeName) {
220
+ const registry = this.registries?.kindRegistry;
221
+ if (!typeName || !registry)
222
+ return { kind: typeName, layer: undefined };
223
+ const entry = registry.getKind(typeName) ?? registry.getKind(lastSegment(typeName));
224
+ return entry
225
+ ? { kind: registry.getKind(typeName) ? typeName : lastSegment(typeName), layer: entry.layer }
226
+ : { kind: typeName, layer: undefined };
227
+ }
228
+ /** The type a usage names, spelled as MEMO stores it: the type's own name. */
229
+ typeName(element) {
230
+ const type = this.api.types(element['@id'])[0] ?? this.api.conjugatedOriginal(element['@id']);
231
+ return type ? this.api.name(type['@id']) : undefined;
232
+ }
233
+ superTypeName(element) {
234
+ const general = this.api.superclassifiers(element['@id'])[0];
235
+ return general ? this.api.name(general['@id']) : undefined;
236
+ }
237
+ // ─── Declarations ───────────────────────────────────────────────────────
238
+ definition(def, construct, packageName, ownerId) {
239
+ const shortName = this.api.name(def['@id']);
240
+ const id = qualifiedId(shortName, packageName, ownerId);
241
+ const superType = this.superTypeName(def);
242
+ const resolved = superType ? this.resolveKind(superType) : undefined;
243
+ const attributes = this.attributes(def);
244
+ if (def.isVariation === true)
245
+ attributes.isVariation = 'true';
246
+ this.define({
247
+ id, shortName, name: displayNameOf(attributes, shortName),
248
+ kind: resolved?.kind ?? `${construct.charAt(0).toUpperCase()}${construct.slice(1)}Definition`,
249
+ construct, layer: resolved?.layer || 'unknown', file: this.file(def), package: packageName || undefined,
250
+ attributes, doc: this.doc(def), isDefinition: true, owner: ownerId,
251
+ }, def);
252
+ if (['part', 'port', 'interface', 'connection'].includes(construct)) {
253
+ this.ports(def, packageName, id);
254
+ this.nestedParts(def, packageName, id);
255
+ }
256
+ }
257
+ itemDefinition(def, packageName) {
258
+ const shortName = this.api.name(def['@id']);
259
+ const superType = this.superTypeName(def);
260
+ const resolved = superType ? this.resolveKind(superType) : undefined;
261
+ const known = resolved?.layer && resolved.layer !== 'unknown';
262
+ this.define({
263
+ id: qualifiedId(shortName, packageName, undefined), shortName, name: shortName,
264
+ kind: known ? resolved.kind : 'ItemDefinition', construct: 'item', isDefinition: true,
265
+ layer: known ? resolved.layer : resolveLayerFromPath(this.file(def)),
266
+ file: this.file(def), package: packageName || undefined, attributes: this.attributes(def), doc: this.doc(def),
267
+ }, def);
268
+ }
269
+ actionDefinition(def, packageName) {
270
+ const shortName = this.api.name(def['@id']);
271
+ const id = qualifiedId(shortName, packageName, undefined);
272
+ const behaviorKind = def['@type'] === 'CalculationDefinition' ? 'function' : 'action';
273
+ const superType = this.superTypeName(def);
274
+ const resolved = superType ? this.resolveKind(superType) : undefined;
275
+ const known = resolved?.layer && resolved.layer !== 'unknown';
276
+ const parameters = this.parameters(def);
277
+ this.define({
278
+ id, shortName, name: shortName,
279
+ kind: known ? resolved.kind : behaviorKind === 'function' ? 'FunctionDefinition' : 'ActionDefinition',
280
+ construct: 'action', isDefinition: true,
281
+ layer: known ? resolved.layer : resolveLayerFromPath(this.file(def)),
282
+ file: this.file(def), package: packageName || undefined,
283
+ attributes: { ...this.attributes(def), behaviorKind }, doc: this.doc(def),
284
+ parameters: parameters.length > 0 ? parameters : undefined,
285
+ }, def);
286
+ this.behaviorBody(def, packageName, id);
287
+ }
288
+ usage(usage, construct, packageName, ownerId) {
289
+ const shortName = this.api.name(usage['@id']);
290
+ const id = qualifiedId(shortName, packageName, ownerId);
291
+ const typeName = this.typeName(usage);
292
+ const resolved = typeName ? this.resolveKind(typeName) : undefined;
293
+ const attributes = this.attributes(usage);
294
+ if (typeName)
295
+ attributes.usageType = typeName;
296
+ // Read from the handoff's own flag: SysIDE also sets `isAbstract` on a variation and OpenSysML does not.
297
+ if (usage.isVariation === true)
298
+ attributes.isVariation = 'true';
299
+ if (construct === 'view')
300
+ Object.assign(attributes, this.exposes(usage));
301
+ Object.assign(attributes, this.viewMetadata(usage));
302
+ const element = {
303
+ id, shortName, name: displayNameOf(attributes, shortName),
304
+ kind: resolved?.kind ?? 'Unknown', construct, layer: resolved?.layer || 'unknown',
305
+ file: this.file(usage), package: packageName || undefined, attributes, doc: this.doc(usage), owner: ownerId,
306
+ };
307
+ if (construct === 'port') {
308
+ const directed = this.directedFeatures(usage);
309
+ const directions = new Set(directed.map(f => f.direction));
310
+ element.portSpec = {
311
+ type: typeName,
312
+ direction: (this.direction(usage) ?? (directions.size === 1 ? directed[0]?.direction : undefined)),
313
+ isConjugated: this.api.ownedRelationships(usage['@id']).some(r => r['@type'] === 'ConjugatedPortTyping'),
314
+ };
315
+ element.parameters = directed;
316
+ }
317
+ this.define(element, usage);
318
+ if (construct === 'port')
319
+ this.ports(usage, packageName, id);
320
+ if (construct === 'part' || construct === 'item')
321
+ this.nestedParts(usage, packageName, id);
322
+ if (construct === 'part')
323
+ this.ports(usage, packageName, id);
324
+ for (const member of this.api.ownedMembers(usage['@id'])) {
325
+ if (member['@type'] === 'TransitionUsage')
326
+ this.transition(member, packageName, id);
327
+ else if (construct === 'state' && member['@type'] === 'StateUsage' && this.api.name(member['@id'])) {
328
+ this.usage(member, 'state', packageName, id);
329
+ }
330
+ }
331
+ return id;
332
+ }
333
+ viewpoint(usage, packageName, ownerId) {
334
+ const id = this.usage(usage, 'viewpoint', packageName, ownerId);
335
+ for (const member of this.api.ownedMembers(usage['@id'])) {
336
+ if (member['@type'] === 'ViewpointUsage' && this.api.name(member['@id']))
337
+ this.viewpoint(member, packageName, id);
338
+ }
339
+ }
340
+ /** An action usage. `ownerId` is a non-action owner (a part that performs it), which names it and is not its `parentAction`. */
341
+ action(usage, packageName, parentActionId, ownerId) {
342
+ const shortName = this.api.name(usage['@id']);
343
+ if (!shortName)
344
+ return;
345
+ const id = qualifiedId(shortName, packageName, parentActionId ?? ownerId);
346
+ const behaviorKind = usage['@type'] === 'CalculationUsage' ? 'function' : 'action';
347
+ const typeName = this.typeName(usage);
348
+ let kind = behaviorKind === 'function' ? 'FunctionUsage' : 'ActionUsage';
349
+ let layer = resolveLayerFromPath(this.file(usage));
350
+ if (typeName) {
351
+ const resolved = this.resolveKind(typeName);
352
+ if (resolved.layer && resolved.layer !== 'unknown') {
353
+ kind = resolved.kind;
354
+ layer = resolved.layer;
355
+ }
356
+ }
357
+ const subsetted = this.api.subsetted(usage['@id'])[0];
358
+ if (!typeName && subsetted && parentActionId && layer === 'unknown') {
359
+ layer = this.elements.get(parentActionId)?.layer ?? layer;
360
+ }
361
+ const attributes = this.attributes(usage);
362
+ attributes.behaviorKind = behaviorKind;
363
+ if (typeName) {
364
+ attributes.actionType = typeName;
365
+ attributes.usageType = typeName;
366
+ }
367
+ if (subsetted)
368
+ attributes.subsets = this.api.name(subsetted['@id']) ?? '';
369
+ this.define({
370
+ id, shortName, name: displayNameOf(attributes, shortName), kind, construct: 'action', layer,
371
+ file: this.file(usage), package: packageName || undefined, attributes, doc: this.doc(usage),
372
+ parentAction: parentActionId, owner: ownerId, parameters: this.parameters(usage),
373
+ }, usage);
374
+ this.behaviorBody(usage, packageName, id);
375
+ }
376
+ /** Nested steps of an action body: actions and control nodes. */
377
+ behaviorBody(owner, packageName, parentActionId) {
378
+ let terminates = 0;
379
+ for (const member of this.api.ownedMembers(owner['@id'])) {
380
+ const type = member['@type'];
381
+ if (type === 'ActionUsage' || type === 'CalculationUsage') {
382
+ if (this.direction(member))
383
+ continue; // a parameter, not a step
384
+ this.action(member, packageName, parentActionId);
385
+ }
386
+ else if (type in CONTROL_METACLASS_KINDS) {
387
+ const name = this.api.name(member['@id']);
388
+ if (!name)
389
+ continue;
390
+ const controlKind = CONTROL_METACLASS_KINDS[type];
391
+ this.define({
392
+ id: qualifiedId(name, packageName, parentActionId), shortName: name, name,
393
+ kind: CONTROL_KIND_METACLASS[controlKind], construct: 'action',
394
+ layer: resolveLayerFromPath(this.file(member)), file: this.file(member),
395
+ package: packageName || undefined, attributes: { controlKind }, parentAction: parentActionId,
396
+ }, member);
397
+ }
398
+ else if (['AcceptActionUsage', 'SendActionUsage', 'TerminateActionUsage'].includes(type)) {
399
+ const fallback = type === 'TerminateActionUsage' ? `terminate${terminates++ === 0 ? '' : terminates}` : undefined;
400
+ const name = this.api.name(member['@id']) ?? fallback;
401
+ if (!name)
402
+ continue;
403
+ const id = qualifiedId(name, packageName, parentActionId);
404
+ // An accept's payload is its parameter: `accept order : Order`.
405
+ const payload = type === 'AcceptActionUsage'
406
+ ? this.api.ownedRelationships(member['@id'])
407
+ .filter(r => r['@type'] === 'ParameterMembership')
408
+ .flatMap(r => this.api.ownedMembers(member['@id']).filter(m => m['@id'] === r.memberElement?.['@id']))[0]
409
+ : undefined;
410
+ const payloadName = payload ? this.api.name(payload['@id']) : undefined;
411
+ const payloadType = payload ? this.typeName(payload) : undefined;
412
+ this.define({
413
+ id, shortName: name, name: this.api.name(member['@id']) ?? type,
414
+ kind: type === 'TerminateActionUsage' ? 'ActivityFinalNodeUsage' : type,
415
+ construct: 'action', layer: resolveLayerFromPath(this.file(member)), file: this.file(member),
416
+ package: packageName || undefined,
417
+ attributes: { ...(payloadName ? { payloadName } : {}), ...(payloadType ? { payloadType } : {}) },
418
+ parentAction: parentActionId,
419
+ parameters: payloadName ? [{ name: payloadName, direction: 'out', type: payloadType ?? 'Item' }] : undefined,
420
+ }, member);
421
+ }
422
+ }
423
+ }
424
+ transition(transition, packageName, ownerId) {
425
+ const shortName = this.api.name(transition['@id']);
426
+ if (!shortName)
427
+ return; // an anonymous transition is a control statement, not an element
428
+ // The source is the transition's first member (`FeatureChainMember`,
429
+ // SysML-textual-bnf.kebnf:1283): a Membership naming the state, or an
430
+ // owned chain feature for `first a.b`. The target is the end of the
431
+ // succession it owns (`then …`). Both are written as MEMO stores them,
432
+ // the path from the state machine down.
433
+ const attributes = { ...this.attributes(transition) };
434
+ const path = (feature) => {
435
+ if (!feature)
436
+ return undefined;
437
+ const steps = this.api.chain(feature['@id']);
438
+ return (steps.length ? steps : [feature]).map(step => this.api.name(step['@id'])).join('.');
439
+ };
440
+ const first = this.api.ownedRelationships(transition['@id'])[0];
441
+ let source;
442
+ if (first?.['@type'] === 'Membership') {
443
+ const member = first.memberElement;
444
+ source = path(member ? this.api.element(member['@id']) : undefined);
445
+ }
446
+ else if (first?.['@type'] === 'OwningMembership') {
447
+ const owned = first.ownedRelatedElement?.[0];
448
+ source = path(owned ? this.api.element(owned['@id']) : undefined);
449
+ }
450
+ const succession = this.api.ownedMembers(transition['@id']).find(m => m['@type'] === 'SuccessionAsUsage');
451
+ const targetEnd = succession ? this.connectorEnds(succession).at(-1) : undefined;
452
+ const target = targetEnd
453
+ ? path(this.api.related(targetEnd['@id'], ['ReferenceSubsetting'], 'referencedFeature')[0])
454
+ : undefined;
455
+ if (source)
456
+ attributes.sourceState = source;
457
+ if (target)
458
+ attributes.targetState = target;
459
+ const typeName = this.typeName(transition);
460
+ const resolved = typeName ? this.resolveKind(typeName) : undefined;
461
+ this.define({
462
+ id: qualifiedId(shortName, packageName, ownerId), shortName, name: attributes.name || shortName,
463
+ kind: resolved?.kind ?? 'Unknown', construct: 'transition', layer: resolved?.layer || 'unknown',
464
+ file: this.file(transition), package: packageName || undefined, attributes, doc: this.doc(transition), owner: ownerId,
465
+ }, transition);
466
+ }
467
+ /** Port usages an owner declares, each an element owned by it. */
468
+ ports(owner, packageName, ownerId) {
469
+ const owned = [];
470
+ for (const member of this.api.ownedMembers(owner['@id'])) {
471
+ if (member['@type'] !== 'PortUsage' || !this.api.name(member['@id']))
472
+ continue;
473
+ const id = this.usage(member, 'port', packageName, ownerId);
474
+ if (this.elements.has(id))
475
+ owned.push(id);
476
+ }
477
+ const element = this.elements.get(ownerId);
478
+ if (owned.length > 0 && element)
479
+ element.ownedPorts = owned;
480
+ }
481
+ /** Typed nested parts and undirected items: containment, owned by the owner. */
482
+ nestedParts(owner, packageName, ownerId) {
483
+ for (const member of this.api.ownedMembers(owner['@id'])) {
484
+ const type = member['@type'];
485
+ if (type === 'Package') {
486
+ this.groupingPackage(member, packageName, ownerId);
487
+ continue;
488
+ }
489
+ const isPart = type === 'PartUsage';
490
+ const isItem = type === 'ItemUsage' && !this.direction(member);
491
+ if (!isPart && !isItem)
492
+ continue;
493
+ // A connection definition's `end part source : T` is an end, not a part it contains.
494
+ if (member.isEnd === true)
495
+ continue;
496
+ // Only a TYPED nested usage is containment; an untyped one is view metadata.
497
+ if (!this.api.name(member['@id']) || this.api.types(member['@id']).length === 0)
498
+ continue;
499
+ // A typed part that subsets a feature (`part mapEngine : LogicalComponent :> component`)
500
+ // is still a part usage the owner contains: `PartUsage` takes a `UsageDeclaration`, whose
501
+ // `FeatureSpecializationPart` allows typing and subsetting together
502
+ // (SysML-textual-bnf.kebnf:627, :312, :428). Only `viewMetadata` reads a subsetting
503
+ // part as a binding (`isBinding`), and so does a methodology owner, whose
504
+ // `part x : RulePolicy :> rulePolicy { … }` is configuration the rule-policy writer
505
+ // appends to the model's `ModelMethodBinding` (measured on a scratch E0, 2026-10-12).
506
+ if (this.api.redefined(member['@id']).length > 0)
507
+ continue;
508
+ if (this.isBinding(member) && this.elements.get(ownerId)?.layer === 'methodology')
509
+ continue;
510
+ this.usage(member, isPart ? 'part' : 'item', packageName, ownerId);
511
+ }
512
+ }
513
+ /** A package inside a usage groups; its members stay contained by the owner. */
514
+ groupingPackage(pkg, packageName, ownerId) {
515
+ const name = this.api.name(pkg['@id']);
516
+ if (!name)
517
+ return;
518
+ this.define({
519
+ id: qualifiedId(name, packageName, ownerId), shortName: name, name, kind: 'ElementPackage',
520
+ construct: 'package', layer: this.elements.get(ownerId)?.layer ?? 'unknown',
521
+ file: this.file(pkg), package: packageName, attributes: {}, owner: ownerId,
522
+ }, pkg);
523
+ for (const member of this.api.ownedMembers(pkg['@id'])) {
524
+ const isPart = member['@type'] === 'PartUsage';
525
+ const isItem = member['@type'] === 'ItemUsage' && !this.direction(member);
526
+ if ((!isPart && !isItem) || !this.api.name(member['@id']) || this.api.types(member['@id']).length === 0)
527
+ continue;
528
+ const childId = this.usage(member, isPart ? 'part' : 'item', packageName, ownerId);
529
+ const child = this.elements.get(childId);
530
+ if (child)
531
+ child.attributes['elementPackage'] = name;
532
+ }
533
+ }
534
+ // ─── Features, values, metadata ─────────────────────────────────────────
535
+ direction(element) {
536
+ const direction = element.direction;
537
+ return typeof direction === 'string' ? direction : undefined;
538
+ }
539
+ /** Directed item features: a port's payloads, an action's parameters. */
540
+ directedFeatures(owner) {
541
+ return this.api.ownedMembers(owner['@id'])
542
+ .filter(m => ['ItemUsage', 'ReferenceUsage', 'AttributeUsage', 'PartUsage'].includes(m['@type']) && this.direction(m))
543
+ .map(m => {
544
+ const type = this.typeName(m);
545
+ const subsetted = this.api.subsetted(m['@id'])[0] ?? this.api.referenced(m['@id'])[0];
546
+ return {
547
+ name: this.api.name(m['@id']) ?? '',
548
+ direction: this.direction(m),
549
+ type: type ?? (subsetted ? this.api.name(subsetted['@id']) : undefined) ?? 'Item',
550
+ };
551
+ });
552
+ }
553
+ parameters(owner) {
554
+ return this.directedFeatures(owner);
555
+ }
556
+ /**
557
+ * The flat attribute map: every attribute or reference member with a value
558
+ * (or a type, or a structured body flattened to dotted keys), then metadata
559
+ * applications, which win over a directly declared attribute of the same name.
560
+ */
561
+ attributes(owner) {
562
+ const attributes = {};
563
+ for (const member of this.api.ownedMembers(owner['@id'])) {
564
+ if (member['@type'] !== 'AttributeUsage' && member['@type'] !== 'ReferenceUsage')
565
+ continue;
566
+ if (this.direction(member) || this.isBinding(member))
567
+ continue;
568
+ const name = this.api.name(member['@id']);
569
+ if (!name)
570
+ continue;
571
+ const value = this.api.value(member['@id']);
572
+ if (value) {
573
+ attributes[name] = this.render(value);
574
+ continue;
575
+ }
576
+ const type = this.typeName(member);
577
+ if (type && this.api.redefined(member['@id']).length === 0) {
578
+ attributes[name] = `<${type}>`;
579
+ continue;
580
+ }
581
+ for (const [key, nested] of Object.entries(this.attributes(member)))
582
+ attributes[`${name}.${key}`] = nested;
583
+ }
584
+ Object.assign(attributes, this.metadata(owner));
585
+ return attributes;
586
+ }
587
+ /**
588
+ * A connector's own attributes over the values its type binds. A feature value on a
589
+ * definition (`attribute :>> direction = DirectionKind::output;` on an `interface def`)
590
+ * is inherited by every usage, and the usage may not restate it (SysIDE:
591
+ * feature-value-overriding), so reading only the usage's own members misses it.
592
+ */
593
+ withTypeValues(node) {
594
+ const inherited = {};
595
+ const seen = new Set();
596
+ const visit = (definition) => {
597
+ if (seen.has(definition['@id']))
598
+ return;
599
+ seen.add(definition['@id']);
600
+ for (const parent of this.api.superclassifiers(definition['@id']))
601
+ visit(parent);
602
+ if (this.api.source(definition['@id'])?.role === 'project')
603
+ Object.assign(inherited, this.attributes(definition));
604
+ };
605
+ for (const type of this.api.types(node['@id']))
606
+ visit(type);
607
+ return { ...inherited, ...this.attributes(node) };
608
+ }
609
+ /** `@Foo { :>> field = value; }` applications, lifted under each field's own name. */
610
+ metadata(owner) {
611
+ const attributes = {};
612
+ for (const member of this.api.ownedMembers(owner['@id'])) {
613
+ if (member['@type'] !== 'MetadataUsage')
614
+ continue;
615
+ const type = this.typeName(member) ?? '';
616
+ const aliases = METADATA_KEY_ALIASES[type] ?? {};
617
+ for (const [field, value] of Object.entries(this.attributes(member))) {
618
+ if (value === '')
619
+ continue;
620
+ attributes[aliases[field] ?? field] = value;
621
+ }
622
+ }
623
+ return attributes;
624
+ }
625
+ /**
626
+ * A part or reference member that SUBSETS a feature is a binding, not
627
+ * containment: `part x : T :> rulePolicy { … }` records `x = rulePolicy`, and
628
+ * `ref vp :> viewpointDefinition = v;` adds `v` to `viewpointDefinition`
629
+ * (comma-joined, since such a feature may be bound more than once).
630
+ */
631
+ isBinding(member) {
632
+ return (member['@type'] === 'PartUsage' || member['@type'] === 'ReferenceUsage')
633
+ && this.api.subsetted(member['@id']).length > 0 && this.api.redefined(member['@id']).length === 0;
634
+ }
635
+ /** View metadata members flattened onto the view: bindings and an untyped `part :>> x { … }` body. */
636
+ viewMetadata(owner) {
637
+ const attributes = {};
638
+ for (const member of this.api.ownedMembers(owner['@id'])) {
639
+ if (this.isBinding(member)) {
640
+ const subsetted = this.api.name(this.api.subsetted(member['@id'])[0]['@id']) ?? '';
641
+ const value = this.api.value(member['@id']);
642
+ const [key, bound] = value ? [subsetted, this.render(value)] : [this.api.name(member['@id']) ?? '', subsetted];
643
+ if (!key)
644
+ continue;
645
+ attributes[key] = attributes[key] ? `${attributes[key]},${bound}` : bound;
646
+ continue;
647
+ }
648
+ if (member['@type'] !== 'PartUsage')
649
+ continue;
650
+ if (this.api.types(member['@id']).length > 0)
651
+ continue; // typed: containment
652
+ const name = this.api.name(member['@id']);
653
+ if (!name)
654
+ continue;
655
+ for (const [key, value] of Object.entries(this.attributes(member)))
656
+ attributes[`${name}.${key}`] = value;
657
+ }
658
+ return attributes;
659
+ }
660
+ /** A view's `expose` paths, comma-joined, as `resolveViewElementIds` reads them. */
661
+ exposes(view) {
662
+ const paths = [];
663
+ for (const relationship of this.api.ownedRelationships(view['@id'])) {
664
+ if (relationship['@type'] !== 'NamespaceExpose' && relationship['@type'] !== 'MembershipExpose')
665
+ continue;
666
+ let name;
667
+ if (relationship['@type'] === 'NamespaceExpose') {
668
+ const target = relationship.importedNamespace;
669
+ name = target ? this.api.qualifiedName(target['@id']) : undefined;
670
+ if (name)
671
+ name += relationship.isRecursive ? '::**' : '::*';
672
+ }
673
+ else {
674
+ // A membership expose names a membership; the element is its member.
675
+ const membership = relationship.importedMembership;
676
+ const member = membership ? this.api.element(membership['@id'])?.memberElement : undefined;
677
+ // Written by qualified name: a short name can be ambiguous (two
678
+ // views may each declare a `clinician`), a qualified name never is.
679
+ name = member ? this.api.qualifiedName(member['@id']) : undefined;
680
+ if (name && relationship.isRecursive)
681
+ name += '::**';
682
+ }
683
+ if (name)
684
+ paths.push(name);
685
+ }
686
+ return paths.length > 0 ? { expose: paths.join(',') } : {};
687
+ }
688
+ /** A value as MEMO's flat attribute map spells it. */
689
+ render(value) {
690
+ switch (value.kind) {
691
+ case 'string': return value.value;
692
+ case 'number': return renderNumber(value.value, value.rational);
693
+ case 'boolean': return String(value.value);
694
+ case 'sequence': return value.items.map(item => this.render(item)).filter(s => s.length > 0).join(', ');
695
+ case 'reference': {
696
+ // An enumeration literal is `Kind::member`, the one spelling MEMO
697
+ // accepts; any other reference is the referenced element's name.
698
+ const target = this.api.resolve(value.qualifiedName);
699
+ const owner = target ? this.api.owner(target['@id']) : undefined;
700
+ if (owner?.['@type'] === 'EnumerationDefinition') {
701
+ return `${textualName(this.api.name(owner['@id']) ?? '')}::${textualName(lastSegment(value.qualifiedName))}`;
702
+ }
703
+ return lastSegment(value.qualifiedName);
704
+ }
705
+ case 'chain': return value.steps.map(lastSegment).join('.');
706
+ default: return '';
707
+ }
708
+ }
709
+ /** The flat attribute map of any element, for readers outside the builder. */
710
+ attributesOf(owner) { return this.attributes(owner); }
711
+ /** The doc comment of any element, for readers outside the builder. */
712
+ docOf(owner) { return this.doc(owner); }
713
+ doc(owner) {
714
+ const documentation = this.api.ownedMembers(owner['@id']).find(m => m['@type'] === 'Documentation');
715
+ const body = documentation?.body;
716
+ if (typeof body !== 'string' || !body.trim())
717
+ return undefined;
718
+ return body.replace(/^\/\*\s*/, '').replace(/\s*\*\/$/, '').replace(/\n\s*\*\s?/g, ' ').replace(/\s*\n\s*/g, ' ').trim();
719
+ }
720
+ connectorEnds(connector) {
721
+ return this.api.ownedMembers(connector['@id']).filter(m => m.isEnd === true
722
+ || this.api.ownedRelationships(m['@id']).some(r => r['@type'] === 'ReferenceSubsetting'));
723
+ }
724
+ define(element, node) {
725
+ this.elements.define(element, node);
726
+ this.idOf.set(node['@id'], element.id);
727
+ }
728
+ // ─── Relationships ──────────────────────────────────────────────────────
729
+ //
730
+ // The Langium builder's order, for the reason it gives: a named flow,
731
+ // binding or interface is an identity a later connection, allocation or
732
+ // trace may name, so those land first.
733
+ buildRelationships() {
734
+ const project = [...this.api.projectElements()];
735
+ const scoped = (types, where) => project
736
+ .filter(e => types.includes(e['@type']))
737
+ .map(e => ({ node: e, ...this.contextOf(e) }))
738
+ .filter(c => c.inPackage || c.inStructure || (where === 'package-or-action' && c.parentActionId));
739
+ for (const c of scoped(['FlowUsage', 'SuccessionFlowUsage'], 'package-or-action'))
740
+ this.flow(c.node, c.packageName, c.parentActionId);
741
+ for (const c of scoped(['BindingConnectorAsUsage'], 'package'))
742
+ this.binding(c.node, c.packageName);
743
+ for (const c of scoped(['InterfaceUsage'], 'package'))
744
+ this.interfaceEdge(c.node, c.packageName);
745
+ for (const c of scoped(['ConnectionUsage'], 'package'))
746
+ this.connection(c.node, c.packageName);
747
+ for (const c of scoped(['SuccessionAsUsage'], 'package-or-action'))
748
+ this.succession(c.node, c.packageName, c.parentActionId);
749
+ for (const c of scoped(['TransitionUsage'], 'package-or-action')) {
750
+ if (c.parentActionId && !this.api.declaredName(c.node['@id']))
751
+ this.guardedSuccession(c.node, c.packageName, c.parentActionId);
752
+ }
753
+ for (const c of scoped(['AllocationUsage'], 'package'))
754
+ this.allocation(c.node, c.packageName);
755
+ this.nativeTraces(project);
756
+ this.composition();
757
+ }
758
+ /** The enclosing package (qualified) and, when directly in an action body, that action's element id. */
759
+ contextOf(node) {
760
+ const owner = this.api.owner(node['@id']);
761
+ const packageName = this.packageOf(node);
762
+ const ownerId = owner ? this.api.qualifiedName(owner['@id']) : undefined;
763
+ const isPackage = owner?.['@type'] === 'Package' || owner?.['@type'] === 'LibraryPackage';
764
+ const isAction = ownerId !== undefined && this.elements.get(ownerId)?.construct === 'action';
765
+ // A part definition or usage owns its connectors and allocations; the endpoints
766
+ // are features it contains, which the element index names by qualified name.
767
+ const inStructure = owner?.['@type'] === 'PartDefinition' || owner?.['@type'] === 'PartUsage';
768
+ return { packageName, parentActionId: isAction ? ownerId : undefined, inPackage: isPackage, inStructure };
769
+ }
770
+ packageOf(node) {
771
+ for (let current = this.api.owner(node['@id']); current; current = this.api.owner(current['@id'])) {
772
+ if (current['@type'] === 'Package' || current['@type'] === 'LibraryPackage')
773
+ return this.api.qualifiedName(current['@id']) ?? '';
774
+ }
775
+ return '';
776
+ }
777
+ /** The nearest enclosing element that is a MEMO element: what owns a native usage. */
778
+ nearestElement(node) {
779
+ for (let current = this.api.owner(node['@id']); current; current = this.api.owner(current['@id'])) {
780
+ const id = this.api.qualifiedName(current['@id']);
781
+ if (id && this.elements.has(id))
782
+ return id;
783
+ }
784
+ return undefined;
785
+ }
786
+ /** The steps a feature reference names: a chain's, or the feature itself. */
787
+ steps(feature) {
788
+ if (!feature)
789
+ return [];
790
+ const chain = this.api.chain(feature['@id']);
791
+ return chain.length ? chain : [feature];
792
+ }
793
+ /**
794
+ * Resolve a reference to the deepest MEMO element it names, as the Langium
795
+ * builder's `resolvePath` does: what is left over (an action's parameter, a
796
+ * port's payload) is the end label. A resolved head is passed as its
797
+ * qualified name, which `resolvePath` matches exactly; one that is not an
798
+ * element (an inherited feature) falls back to its name in context.
799
+ */
800
+ endpoint(steps, context, options = {}) {
801
+ if (steps.length === 0)
802
+ return { end: '' };
803
+ const names = steps.map(step => this.api.name(step['@id']) ?? '');
804
+ const head = this.api.qualifiedName(steps[0]['@id']);
805
+ const reference = head && this.elements.has(head) ? [head, ...names.slice(1)].join('.') : names.join('.');
806
+ const walked = this.elements.resolvePath(reference, context);
807
+ if (walked.element)
808
+ return options.throughTypes ? this.throughTypes(walked) : { id: walked.id, end: walked.end };
809
+ if (walked.ambiguous)
810
+ return { end: '' };
811
+ // A named flow or connection is an identity too.
812
+ const asRelationship = this.elements.lookupRelationship(head ?? names.join('.'), context)
813
+ ?? this.elements.lookupRelationship(names.join('.'), context);
814
+ if (asRelationship)
815
+ return { id: asRelationship.id, end: '' };
816
+ // An element the project does not hold (a clause instance in the
817
+ // ontology) is kept by its name, as the Langium builder keeps it.
818
+ return { id: names.at(-1) || undefined, end: '' };
819
+ }
820
+ /**
821
+ * Carry a walked path on into the definitions that type it. A nested part is
822
+ * owned by the definition (`P::Pump::motor`), not by the usage that is typed
823
+ * by it, so `pump.motor` stops on `pump` until the walk follows the typing.
824
+ *
825
+ * Only for relations that name an element (`allocate`, `satisfy`, `verify`):
826
+ * a connector end on a slot means the slot, and is walked without this.
827
+ */
828
+ throughTypes(walked) {
829
+ let id = walked.id;
830
+ let rest = walked.end ? walked.end.split('.') : [];
831
+ while (rest.length > 0) {
832
+ const usage = this.api.resolve(id);
833
+ const next = usage && this.api.types(usage['@id'])
834
+ .map(type => this.api.qualifiedName(type['@id']))
835
+ .map(type => type && this.elements.get(`${type}::${rest[0]}`))
836
+ .find(Boolean);
837
+ if (!next)
838
+ break;
839
+ id = next.id;
840
+ rest = rest.slice(1);
841
+ }
842
+ return { id, end: rest.join('.') };
843
+ }
844
+ /** The feature a connector end references, as steps. */
845
+ endSteps(end) {
846
+ const target = this.api.related(end['@id'], ['ReferenceSubsetting'], 'referencedFeature')[0];
847
+ return this.steps(target);
848
+ }
849
+ sourceRangeOf(node) {
850
+ const source = this.api.source(node['@id']);
851
+ return source?.startByte !== undefined && source.endByte !== undefined
852
+ ? { offset: source.startByte, length: source.endByte - source.startByte } : undefined;
853
+ }
854
+ push(relationship, named, node) {
855
+ const line = this.api.source(node['@id'])?.line;
856
+ if (line !== undefined)
857
+ this.relationshipLines.set(relationship, line);
858
+ this.relationships.push(relationship);
859
+ if (named)
860
+ this.elements.defineRelationship(relationship, node);
861
+ }
862
+ nextId() { return `rel-${++this.counter}`; }
863
+ lineOf(relationship) { return this.relationshipLines.get(relationship); }
864
+ /** The packages the project declares, as `collectPackages` reports them. */
865
+ packages() {
866
+ const out = [];
867
+ for (const element of this.api.projectElements()) {
868
+ if (element['@type'] !== 'Package' && element['@type'] !== 'LibraryPackage')
869
+ continue;
870
+ const qualifiedName = this.api.qualifiedName(element['@id']);
871
+ if (!qualifiedName)
872
+ continue;
873
+ const separator = qualifiedName.lastIndexOf('::');
874
+ const attributes = this.metadata(element);
875
+ out.push({
876
+ qualifiedName,
877
+ name: separator === -1 ? qualifiedName : qualifiedName.slice(separator + 2),
878
+ ...(separator === -1 ? {} : { parent: qualifiedName.slice(0, separator) }),
879
+ file: this.file(element),
880
+ // `@ImportSource { … }` and any other metadata the package carries.
881
+ ...(Object.keys(attributes).length > 0 ? { attributes } : {}),
882
+ });
883
+ }
884
+ return out.sort((a, b) => a.qualifiedName.localeCompare(b.qualifiedName));
885
+ }
886
+ tagPorts(relationship) {
887
+ if (this.elements.get(relationship.sourceId)?.construct === 'port')
888
+ relationship.sourcePortId = relationship.sourceId;
889
+ if (this.elements.get(relationship.targetId)?.construct === 'port')
890
+ relationship.targetPortId = relationship.targetId;
891
+ }
892
+ flow(node, packageName, parentActionId) {
893
+ // Ends: a flow end (`from a.b`) references `a` and owns a flow feature
894
+ // redefining `b`; a message end is an event parameter referencing its part.
895
+ const endFeatures = this.api.ownedMembers(node['@id']).filter(m => m.isEnd === true
896
+ || (m['@type'] === 'EventOccurrenceUsage' && this.api.referenced(m['@id']).length > 0));
897
+ if (endFeatures.length < 2)
898
+ return;
899
+ const pathOf = (end) => {
900
+ const steps = this.endSteps(end);
901
+ const flowFeature = this.api.ownedMembers(end['@id'])
902
+ .map(m => this.api.redefined(m['@id'])[0]).find(Boolean);
903
+ return flowFeature ? [...steps, flowFeature] : steps;
904
+ };
905
+ const context = { packageName, ownerId: parentActionId };
906
+ const source = this.endpoint(pathOf(endFeatures[0]), context);
907
+ const target = this.endpoint(pathOf(endFeatures[1]), context);
908
+ if (!source.id || !target.id || !this.elements.hasEntity(source.id) || !this.elements.hasEntity(target.id)) {
909
+ this.diagnostics.push(`flow '${this.api.name(node['@id']) ?? '(anonymous)'}' has an end naming no element`);
910
+ return;
911
+ }
912
+ const name = this.api.declaredName(node['@id']);
913
+ const payload = this.api.ownedMembers(node['@id']).find(m => m['@type'] === 'PayloadFeature');
914
+ const kind = this.typeName(node);
915
+ const relationship = {
916
+ id: name ? qualifiedId(name, packageName || undefined, parentActionId) : this.nextId(),
917
+ ...(name ? { shortName: name } : {}),
918
+ type: 'flow', sourceId: source.id, sourceEnd: source.end, targetId: target.id, targetEnd: target.end,
919
+ file: this.file(node), sourceRange: this.sourceRangeOf(node), named: name ? true : undefined,
920
+ kind, attributes: this.attributes(node),
921
+ flowItem: payload ? this.typeName(payload) : undefined,
922
+ };
923
+ this.push(relationship, Boolean(name), node);
924
+ }
925
+ binding(node, packageName) {
926
+ const ends = this.connectorEnds(node);
927
+ if (ends.length < 2)
928
+ return;
929
+ const context = { packageName };
930
+ const source = this.endpoint(this.endSteps(ends[0]), context);
931
+ const target = this.endpoint(this.endSteps(ends[1]), context);
932
+ if (!source.id || !target.id || !this.elements.has(source.id) || !this.elements.has(target.id)) {
933
+ this.diagnostics.push(`binding '${this.api.name(node['@id']) ?? '(anonymous)'}' has an end naming no element`);
934
+ return;
935
+ }
936
+ const name = this.api.declaredName(node['@id']);
937
+ const attributes = this.attributes(node);
938
+ this.push({
939
+ id: name ? qualifiedId(name, packageName || undefined, undefined) : this.nextId(),
940
+ ...(name ? { shortName: name, named: true } : {}),
941
+ type: 'bind', sourceId: source.id, sourceEnd: source.end, targetId: target.id, targetEnd: target.end,
942
+ file: this.file(node),
943
+ ...(name ? { sourceRange: this.sourceRangeOf(node) } : {}),
944
+ ...(Object.keys(attributes).length ? { attributes } : {}),
945
+ }, Boolean(name), node);
946
+ }
947
+ interfaceEdge(node, packageName) {
948
+ const ends = this.connectorEnds(node);
949
+ if (ends.length < 2)
950
+ return; // an interface with no ends is an element
951
+ const context = { packageName };
952
+ const source = this.endpoint(this.endSteps(ends[0]), context);
953
+ const target = this.endpoint(this.endSteps(ends[1]), context);
954
+ if (!source.id || !target.id || !this.elements.has(source.id) || !this.elements.has(target.id)) {
955
+ this.diagnostics.push(`interface '${this.api.name(node['@id'])}' has an end naming no element`);
956
+ return;
957
+ }
958
+ const name = this.api.declaredName(node['@id']) ?? '';
959
+ const relationship = {
960
+ id: qualifiedId(name, packageName || undefined, undefined), shortName: name, type: 'interface',
961
+ sourceId: source.id, sourceEnd: source.end || 'source', targetId: target.id, targetEnd: target.end || 'target',
962
+ file: this.file(node), sourceRange: this.sourceRangeOf(node), named: true,
963
+ kind: this.typeName(node), attributes: this.withTypeValues(node),
964
+ };
965
+ this.tagPorts(relationship);
966
+ this.push(relationship, true, node);
967
+ }
968
+ connection(node, packageName) {
969
+ let ends = this.connectorEnds(node);
970
+ if (ends.length < 2) {
971
+ // `connection : T { …; connect a to b; }`: by the grammar the `connect`
972
+ // in a body declares a separate, nested connection, and the outer one
973
+ // relates nothing (plan, milestone 1 item c). MEMO's own compiler read
974
+ // the nested ends as the outer's, and the examples rely on it, so this
975
+ // reads them the same way and says so.
976
+ const nested = this.api.ownedMembers(node['@id'])
977
+ .find(m => m['@type'] === 'ConnectionUsage' && this.connectorEnds(m).length >= 2);
978
+ if (!nested)
979
+ return;
980
+ ends = this.connectorEnds(nested);
981
+ this.diagnostics.push(`${this.file(node)}:${this.api.source(node['@id'])?.line ?? '?'}: `
982
+ + `a 'connect' inside a connection's body declares a nested connection; it is read as this `
983
+ + `connection's ends. Move 'connect … to …' into the declaration.`);
984
+ }
985
+ const context = { packageName };
986
+ const sourceSteps = this.endSteps(ends[0]);
987
+ const targetSteps = this.endSteps(ends[1]);
988
+ const source = this.endpoint(sourceSteps, context);
989
+ const target = this.endpoint(targetSteps, context);
990
+ if (!source.id || !target.id)
991
+ return;
992
+ const typeName = this.typeName(node);
993
+ const name = this.api.declaredName(node['@id']);
994
+ const attributes = this.attributes(node);
995
+ const relationship = {
996
+ id: name ? qualifiedId(name, packageName || undefined, undefined) : this.nextId(),
997
+ ...(name ? { shortName: name } : {}),
998
+ type: typeName ? toModelType(typeName) : 'connect',
999
+ sourceId: source.id, sourceEnd: this.api.declaredName(ends[0]['@id']) ?? 'source',
1000
+ targetId: target.id, targetEnd: this.api.declaredName(ends[1]['@id']) ?? 'target',
1001
+ file: this.file(node), sourceRange: this.sourceRangeOf(node), named: name ? true : undefined,
1002
+ attributes, flowItem: attributes.transportedItem || attributes.flowItem || undefined,
1003
+ };
1004
+ this.tagPorts(relationship);
1005
+ this.push(relationship, Boolean(name), node);
1006
+ }
1007
+ succession(node, packageName, parentActionId) {
1008
+ const ends = this.connectorEnds(node);
1009
+ if (ends.length === 0 && parentActionId) {
1010
+ // `then action b;`: the ends are implied by position — the occurrence
1011
+ // declared before the succession and the one declared after it.
1012
+ const [before, after] = this.neighbours(node);
1013
+ if (before && after)
1014
+ this.relationships.push({ id: this.nextId(), type: 'succession', sourceId: before,
1015
+ sourceEnd: '', targetId: after, targetEnd: '', file: this.file(node) });
1016
+ return;
1017
+ }
1018
+ if (ends.length < 2)
1019
+ return;
1020
+ const context = { packageName, ownerId: parentActionId, file: this.file(node) };
1021
+ const pseudo = (steps, which) => steps.length === 1 && this.api.qualifiedName(steps[0]['@id']) === `Actions::Action::${which}`;
1022
+ const resolve = (written) => {
1023
+ const steps = this.performedSteps(written);
1024
+ if (pseudo(steps, 'start'))
1025
+ return parentActionId ? `${parentActionId}__start` : '__start';
1026
+ if (pseudo(steps, 'done'))
1027
+ return parentActionId ? `${parentActionId}__done` : '__done';
1028
+ // An end that references a declared element reaches it by identity,
1029
+ // which an anonymous one (`then terminate;`) needs: it has no name.
1030
+ const direct = steps.length === 1 ? this.idOf.get(steps[0]['@id']) : undefined;
1031
+ if (direct && this.elements.has(direct))
1032
+ return direct;
1033
+ const found = this.endpoint(steps, context);
1034
+ return found.id && this.elements.has(found.id) ? found.id : undefined;
1035
+ };
1036
+ // `then b;` with no `first`: a compiler may write the implied ends out
1037
+ // (OpenSysML does, with the source end naming nothing), so an end that
1038
+ // refers to nothing takes the occurrence before or after it by position.
1039
+ const [before, after] = parentActionId ? this.neighbours(node) : [undefined, undefined];
1040
+ const sourceSteps = this.endSteps(ends[0]);
1041
+ const targetSteps = this.endSteps(ends[1]);
1042
+ const sourceId = sourceSteps.length === 0 ? before : resolve(sourceSteps);
1043
+ const targetId = targetSteps.length === 0 ? after : resolve(targetSteps);
1044
+ if (!sourceId || !targetId)
1045
+ return;
1046
+ this.relationships.push({
1047
+ id: this.nextId(), type: 'succession', sourceId, sourceEnd: '', targetId, targetEnd: '', file: this.file(node),
1048
+ });
1049
+ }
1050
+ /**
1051
+ * The steps a succession end reaches. `first actClean then …` written where
1052
+ * the body declares `perform actClean;` names that perform usage, by the
1053
+ * name it takes from the action it performs (SysML name resolution finds
1054
+ * the local member first); the step MEMO records is the performed action,
1055
+ * the feature the perform's reference subsetting references.
1056
+ */
1057
+ performedSteps(steps) {
1058
+ const last = steps.at(-1);
1059
+ if (!last || last['@type'] !== 'PerformActionUsage')
1060
+ return steps;
1061
+ const performed = this.api.related(last['@id'], ['ReferenceSubsetting'], 'referencedFeature')[0];
1062
+ if (!performed)
1063
+ return steps;
1064
+ const chain = this.api.chain(performed['@id']);
1065
+ return chain.length ? chain : [performed];
1066
+ }
1067
+ /** The MEMO elements declared immediately before and after a member of its owner. */
1068
+ neighbours(node) {
1069
+ const owner = this.api.owner(node['@id']);
1070
+ if (!owner)
1071
+ return [undefined, undefined];
1072
+ const members = this.api.ownedMembers(owner['@id']);
1073
+ const at = members.findIndex(m => m['@id'] === node['@id']);
1074
+ const step = (m) => this.idOf.get(m['@id']);
1075
+ const before = members.slice(0, at).reverse().map(step).find(Boolean);
1076
+ const after = members.slice(at + 1).map(step).find(Boolean);
1077
+ return [before, after];
1078
+ }
1079
+ /**
1080
+ * `succession first a if g then b;` is a guarded succession, which SysML
1081
+ * makes a TransitionUsage (SysML-textual-bnf.kebnf, GuardedSuccession). MEMO
1082
+ * records it as a succession whose source end is the guard, `[g]`.
1083
+ */
1084
+ guardedSuccession(node, packageName, parentActionId) {
1085
+ const context = { packageName, ownerId: parentActionId };
1086
+ const first = this.api.ownedRelationships(node['@id'])[0];
1087
+ const sourceFeature = first?.['@type'] === 'Membership'
1088
+ ? this.api.element(first.memberElement?.['@id'] ?? '') : undefined;
1089
+ const succession = this.api.ownedMembers(node['@id']).find(m => m['@type'] === 'SuccessionAsUsage');
1090
+ const targetEnd = succession ? this.connectorEnds(succession).at(-1) : undefined;
1091
+ const source = this.endpoint(this.steps(sourceFeature), context);
1092
+ const target = targetEnd ? this.endpoint(this.endSteps(targetEnd), context) : { id: undefined };
1093
+ if (!source.id || !target.id || !this.elements.has(source.id) || !this.elements.has(target.id))
1094
+ return;
1095
+ const guardMembership = this.api.ownedRelationships(node['@id'])
1096
+ .find(r => r['@type'] === 'TransitionFeatureMembership' && r.kind === 'guard');
1097
+ const guard = guardMembership
1098
+ ? this.expressionText((guardMembership.ownedRelatedElement ?? [])[0]?.['@id'])
1099
+ : undefined;
1100
+ this.relationships.push({ id: this.nextId(), type: 'succession', sourceId: source.id,
1101
+ sourceEnd: guard === undefined ? '' : `[${guard}]`, targetId: target.id, targetEnd: '', file: this.file(node) });
1102
+ }
1103
+ /** An expression as readable text, as MEMO labels a guard: `validUser == true`. */
1104
+ expressionText(id) {
1105
+ const expression = id ? this.api.element(id) : undefined;
1106
+ if (!expression)
1107
+ return undefined;
1108
+ switch (expression['@type']) {
1109
+ case 'LiteralBoolean': return String(expression.value);
1110
+ case 'LiteralInteger':
1111
+ case 'LiteralRational': return String(expression.value);
1112
+ case 'LiteralString': return `"${expression.value}"`;
1113
+ case 'FeatureReferenceExpression':
1114
+ case 'FeatureChainExpression': {
1115
+ const value = this.api.value(expression['@id']) ?? this.valueOfExpression(expression['@id']);
1116
+ return value && value.kind !== 'other' ? this.render(value) : undefined;
1117
+ }
1118
+ case 'OperatorExpression': {
1119
+ const operands = this.api.ownedRelationships(id)
1120
+ .filter(r => r['@type'] === 'ParameterMembership')
1121
+ .flatMap(r => (r.ownedRelatedElement ?? []))
1122
+ .map(operand => {
1123
+ const bound = this.api.ownedRelationships(operand['@id']).find(r => r['@type'] === 'FeatureValue');
1124
+ return this.expressionText((bound?.ownedRelatedElement ?? [])[0]?.['@id']);
1125
+ });
1126
+ if (operands.some(o => o === undefined))
1127
+ return undefined;
1128
+ const operator = String(expression.operator);
1129
+ return operands.length === 1 ? `${operator} ${operands[0]}` : operands.join(` ${operator} `);
1130
+ }
1131
+ default: return undefined;
1132
+ }
1133
+ }
1134
+ /** The value of a bare expression (not a feature's), through a throwaway feature-value reading. */
1135
+ valueOfExpression(id) {
1136
+ return this.api.expression(id);
1137
+ }
1138
+ allocation(node, packageName) {
1139
+ const ends = this.connectorEnds(node);
1140
+ if (ends.length < 2)
1141
+ return;
1142
+ const context = { packageName };
1143
+ const source = this.endpoint(this.endSteps(ends[0]), context, { throughTypes: true });
1144
+ const target = this.endpoint(this.endSteps(ends[1]), context, { throughTypes: true });
1145
+ if (!source.id || !target.id)
1146
+ return;
1147
+ const sourceElement = this.elements.get(source.id);
1148
+ if (sourceElement)
1149
+ sourceElement.allocatedTo = target.id;
1150
+ // A typed allocation keeps which allocation it is (`DeploysTo`,
1151
+ // `BuildsInto`); an unknown or absent type is the base allocation.
1152
+ const typeName = this.typeName(node);
1153
+ const typed = typeName ? pascalToCamelCase(typeName) : undefined;
1154
+ const registry = this.registries?.relationshipRegistry;
1155
+ const type = typed && registry?.has(typed) ? typed : 'allocatedTo';
1156
+ const ends2 = type === 'allocatedTo'
1157
+ ? LANGUAGE_NATIVE_RELATIONS.allocatedTo.ends
1158
+ : registry?.getRelType(type)?.ends ?? [];
1159
+ this.relationships.push({
1160
+ id: this.nextId(), type, sourceId: source.id, sourceEnd: ends2[0]?.name ?? 'source',
1161
+ targetId: target.id, targetEnd: ends2[1]?.name ?? 'target', file: this.file(node),
1162
+ });
1163
+ }
1164
+ native(name, sourceId, targetId, file, attributes = {}, declaration) {
1165
+ const [sourceEnd, targetEnd] = LANGUAGE_NATIVE_RELATIONS[name].ends;
1166
+ this.relationships.push({
1167
+ id: this.nextId(), type: name, sourceId, sourceEnd: sourceEnd.name, targetId, targetEnd: targetEnd.name, file,
1168
+ // Metadata applied to the link (`satisfy r by x { @TraceBaseline { … } }`), as a typed connection carries it.
1169
+ ...(Object.keys(attributes).length > 0 ? { attributes } : {}),
1170
+ // Where the statement is, for a writer that edits it in place. Only a statement that is its own
1171
+ // declaration has one; an owner-rooted `verify` or `perform` is a member of something larger.
1172
+ ...(declaration ? { sourceRange: this.sourceRangeOf(declaration) } : {}),
1173
+ });
1174
+ }
1175
+ /**
1176
+ * The action a `perform` declares in place. `perform action n : T;` has no
1177
+ * reference subsetting (SysML-textual-bnf.kebnf:952-955, the second
1178
+ * alternative of PerformActionUsageDeclaration), so the usage is itself the
1179
+ * action performed: the abstract syntax's `performedAction` is the
1180
+ * `ownedReferenceSubsetting`'s feature if there is one and the usage itself
1181
+ * if not. It is an element of the model owned by the performer, and the
1182
+ * performer performs it. An unnamed one has no identity to hold.
1183
+ */
1184
+ performedHere(node, owner) {
1185
+ // The declared name: `perform action :>> clean;` takes its name from what it
1186
+ // redefines and declares none, so it is not a new element.
1187
+ const name = this.api.declaredName(node['@id']);
1188
+ if (!name || !owner)
1189
+ return undefined;
1190
+ const id = qualifiedId(name, this.packageOf(node), owner);
1191
+ if (!this.elements.has(id)) {
1192
+ const ownerIsAction = this.elements.get(owner)?.construct === 'action';
1193
+ this.action(node, this.packageOf(node), ownerIsAction ? owner : undefined, ownerIsAction ? undefined : owner);
1194
+ }
1195
+ return id;
1196
+ }
1197
+ /** `satisfy`, `verify`, `perform`, subjects, actors, dependencies, variants, constraints. */
1198
+ nativeTraces(project) {
1199
+ const endpointOf = (steps, node) => this.endpoint(steps, { packageName: this.packageOf(node) }, { throughTypes: true }).id;
1200
+ const valueSteps = (value) => {
1201
+ if (!value)
1202
+ return [];
1203
+ if (value.kind === 'reference')
1204
+ return [[this.api.resolve(value.qualifiedName)].filter(Boolean)];
1205
+ if (value.kind === 'chain')
1206
+ return [value.steps.map(q => this.api.resolve(q)).filter(Boolean)];
1207
+ if (value.kind === 'sequence')
1208
+ return value.items.flatMap(valueSteps);
1209
+ return [];
1210
+ };
1211
+ for (const node of project) {
1212
+ const type = node['@type'];
1213
+ const file = this.file(node);
1214
+ if (type === 'SatisfyRequirementUsage') {
1215
+ if (node.isNegated === true)
1216
+ continue;
1217
+ const requirement = endpointOf(this.steps(this.api.referenced(node['@id'])[0] && this.api.related(node['@id'], ['ReferenceSubsetting'], 'referencedFeature')[0]), node);
1218
+ const subject = this.api.ownedRelationships(node['@id']).find(r => r['@type'] === 'SubjectMembership');
1219
+ const subjectFeature = subject ? this.api.element((subject.ownedRelatedElement ?? [])[0]?.['@id'] ?? '') : undefined;
1220
+ const by = subjectFeature ? valueSteps(this.api.value(subjectFeature['@id']))[0] : undefined;
1221
+ const satisfying = by ? endpointOf(by, node) : undefined;
1222
+ if (requirement && satisfying)
1223
+ this.native('satisfiedBy', requirement, satisfying, file, this.metadata(node), node);
1224
+ }
1225
+ else if (type === 'RequirementVerificationMembership') {
1226
+ const verified = this.api.ownedMembers(node['@id'])[0] ?? this.api.element((node.ownedRelatedElement ?? [])[0]?.['@id'] ?? '');
1227
+ const requirement = verified ? endpointOf(this.steps(this.api.related(verified['@id'], ['ReferenceSubsetting'], 'referencedFeature')[0]), node) : undefined;
1228
+ const owner = this.nearestElement(node);
1229
+ if (requirement && owner)
1230
+ this.native('verifiedBy', requirement, owner, file);
1231
+ }
1232
+ else if (type === 'RequirementConstraintMembership') {
1233
+ const constraint = this.api.element((node.ownedRelatedElement ?? [])[0]?.['@id'] ?? '');
1234
+ const referenced = constraint ? this.api.related(constraint['@id'], ['ReferenceSubsetting'], 'referencedFeature')[0] : undefined;
1235
+ const owner = this.nearestElement(node);
1236
+ const target = referenced ? endpointOf(this.steps(referenced), node) : undefined;
1237
+ if (owner && target)
1238
+ this.native(node.kind === 'assumption' ? 'assumes' : 'requires', owner, target, file);
1239
+ }
1240
+ else if (type === 'PerformActionUsage' || type === 'IncludeUseCaseUsage' || type === 'ExhibitStateUsage') {
1241
+ const referenced = this.api.related(node['@id'], ['ReferenceSubsetting'], 'referencedFeature')[0];
1242
+ const owner = this.nearestElement(node);
1243
+ const target = referenced ? endpointOf(this.steps(referenced), node)
1244
+ : type === 'PerformActionUsage' ? this.performedHere(node, owner) : undefined;
1245
+ const edge = type === 'PerformActionUsage' ? 'performs' : type === 'IncludeUseCaseUsage' ? 'includesStep' : 'exhibitsMode';
1246
+ if (owner && target)
1247
+ this.native(edge, owner, target, file);
1248
+ }
1249
+ else if (type === 'FramedConcernMembership') {
1250
+ const concern = this.api.element((node.ownedRelatedElement ?? [])[0]?.['@id'] ?? '');
1251
+ const referenced = concern ? this.api.related(concern['@id'], ['ReferenceSubsetting'], 'referencedFeature')[0] : undefined;
1252
+ const owner = this.nearestElement(node);
1253
+ const target = referenced ? endpointOf(this.steps(referenced), node) : undefined;
1254
+ if (owner && target)
1255
+ this.native('framesConcern', owner, target, file);
1256
+ }
1257
+ else if (type === 'ActionUsage' && this.api.subsetted(node['@id']).length > 0) {
1258
+ // `action step :> fnX;` is fnX performed here; the step's owner performs it.
1259
+ const owner = this.nearestElement(node);
1260
+ const target = endpointOf(this.steps(this.api.subsetted(node['@id'])[0]), node);
1261
+ if (owner && target)
1262
+ this.native('performs', owner, target, file);
1263
+ }
1264
+ else if (type === 'SubjectMembership') {
1265
+ const ownerNode = this.api.owner(node['@id']);
1266
+ const ownerId = ownerNode ? this.api.qualifiedName(ownerNode['@id']) : undefined;
1267
+ if (!ownerNode || !ownerId || !this.elements.has(ownerId))
1268
+ continue; // a satisfy's subject, say
1269
+ const subject = this.api.element((node.ownedRelatedElement ?? [])[0]?.['@id'] ?? '');
1270
+ if (!subject)
1271
+ continue;
1272
+ const bound = [...valueSteps(this.api.value(subject['@id'])),
1273
+ ...this.api.subsetted(subject['@id']).map(f => this.steps(f)),
1274
+ ...this.api.related(subject['@id'], ['ReferenceSubsetting'], 'referencedFeature').map(f => this.steps(f))];
1275
+ // A requirement and a use case are ABOUT their subject; a
1276
+ // verification case's subject is what it verifies. A use case
1277
+ // bound to its subject (`subject :>> supportingSystem = lab;`,
1278
+ // or `= lab.navigation` on an `include`) is the system the case is
1279
+ // carried out with, which `verifiedBy` would claim was verified.
1280
+ const aboutSubject = [
1281
+ 'RequirementUsage', 'RequirementDefinition',
1282
+ 'UseCaseUsage', 'UseCaseDefinition', 'IncludeUseCaseUsage',
1283
+ ].includes(ownerNode['@type']);
1284
+ // A subject declared by TYPE (`subject :>> supportingSystem : NavigationSystem;`)
1285
+ // is about that definition: it is how a system's use case names its system. Only a
1286
+ // definition the project holds counts. A subject bound inside an `include` is not
1287
+ // read: the include is not an element, and its target is owned by the system of
1288
+ // systems, so the edge would pull the system's use case into the lab's workspace.
1289
+ const typed = aboutSubject && ownerNode['@type'] !== 'IncludeUseCaseUsage'
1290
+ ? this.api.types(subject['@id'])
1291
+ .filter(type => this.elements.has(this.api.qualifiedName(type['@id']) ?? ''))
1292
+ .map(type => [type])
1293
+ : [];
1294
+ for (const steps of [...bound, ...typed]) {
1295
+ const boundId = endpointOf(steps, node);
1296
+ if (!boundId)
1297
+ continue;
1298
+ if (aboutSubject)
1299
+ this.native('hasSubject', ownerId, boundId, file);
1300
+ else
1301
+ this.native('verifiedBy', boundId, ownerId, file);
1302
+ }
1303
+ }
1304
+ else if (type === 'ActorMembership') {
1305
+ const actor = this.api.element((node.ownedRelatedElement ?? [])[0]?.['@id'] ?? '');
1306
+ const bound = actor ? valueSteps(this.api.value(actor['@id']))[0] : undefined;
1307
+ const owner = this.nearestElement(node);
1308
+ const source = bound ? endpointOf(bound, node) : undefined;
1309
+ if (source && owner)
1310
+ this.native('participatesIn', source, owner, file);
1311
+ }
1312
+ else if (type === 'Dependency') {
1313
+ const refinement = this.api.ownedRelationships(node['@id'])
1314
+ .filter(r => r['@type'] === 'Annotation')
1315
+ .flatMap(r => this.api.ownedMembers(r['@id']).length ? this.api.ownedMembers(r['@id'])
1316
+ : (r.ownedRelatedElement ?? []).map(x => this.api.element(x['@id'])).filter(Boolean))
1317
+ .some(metadata => (this.typeName(metadata) ?? '').toLowerCase() === REFINEMENT_METADATA);
1318
+ const ids = (key) => (node[key] ?? [])
1319
+ .map(r => this.api.element(r['@id'])).filter(Boolean);
1320
+ for (const client of ids('client')) {
1321
+ const sourceId = endpointOf([client], node);
1322
+ if (!sourceId)
1323
+ continue;
1324
+ for (const supplier of ids('supplier')) {
1325
+ const targetId = endpointOf([supplier], node);
1326
+ if (!targetId)
1327
+ continue;
1328
+ const applied = this.metadata(node);
1329
+ // A dependency typed by a metadata def the ontology declares as a relation
1330
+ // (`#RealizesFeature dependency …`) is that relation, and only that: one
1331
+ // statement, one edge. Any other dependency stays a plain `dependency`.
1332
+ const typed = this.typedDependencyOf(node);
1333
+ if (typed) {
1334
+ const ends = this.registries?.relationshipRegistry?.getRelType(typed)?.ends ?? [];
1335
+ this.relationships.push({
1336
+ id: this.nextId(), type: typed, sourceId, sourceEnd: ends[0]?.name ?? 'client',
1337
+ targetId, targetEnd: ends[1]?.name ?? 'supplier', file,
1338
+ ...(Object.keys(applied).length > 0 ? { attributes: applied } : {}),
1339
+ sourceRange: this.sourceRangeOf(node),
1340
+ });
1341
+ continue;
1342
+ }
1343
+ this.native('dependency', sourceId, targetId, file, applied, node);
1344
+ if (refinement)
1345
+ this.native('realizes', sourceId, targetId, file, applied, node);
1346
+ }
1347
+ }
1348
+ }
1349
+ else if (type === 'VariantMembership') {
1350
+ const variant = this.api.element((node.ownedRelatedElement ?? [])[0]?.['@id'] ?? '');
1351
+ const referenced = variant ? this.api.related(variant['@id'], ['ReferenceSubsetting'], 'referencedFeature')[0] : undefined;
1352
+ const owner = this.nearestElement(node);
1353
+ // `variant part euOut : T;` declares its variant in place and references nothing.
1354
+ const declaredHere = variant ? this.api.qualifiedName(variant['@id']) : undefined;
1355
+ const target = referenced ? endpointOf(this.steps(referenced), node)
1356
+ : declaredHere && this.elements.has(declaredHere) ? declaredHere : undefined;
1357
+ if (owner && target)
1358
+ this.relationships.push({
1359
+ id: this.nextId(), type: 'variant', sourceId: owner, sourceEnd: 'variationPoint',
1360
+ targetId: target, targetEnd: 'variant', file,
1361
+ });
1362
+ }
1363
+ }
1364
+ }
1365
+ /**
1366
+ * The relation a dependency's prefix metadata names, when the ontology declares that metadata def
1367
+ * as one (`memo_core_relationships::MemoTypedDependency`): `#RealizesFeature dependency …` is
1368
+ * `realizesFeature`. Undefined for a plain dependency or any other prefix (`#refinement`,
1369
+ * `#EnforcesClause`).
1370
+ */
1371
+ typedDependencyOf(node) {
1372
+ const registry = this.registries?.relationshipRegistry;
1373
+ if (!registry)
1374
+ return undefined;
1375
+ for (const annotation of this.api.ownedRelationships(node['@id'])) {
1376
+ if (annotation['@type'] !== 'Annotation')
1377
+ continue;
1378
+ const metadata = this.api.ownedMembers(annotation['@id'])[0]
1379
+ ?? (annotation.ownedRelatedElement ?? []).map(x => this.api.element(x['@id'])).find(Boolean);
1380
+ const name = metadata ? this.typeName(metadata) : undefined;
1381
+ const relation = name ? registry.getRelType(pascalToCamelCase(name)) : undefined;
1382
+ if (relation?.sysmlConstruct === 'metadata def')
1383
+ return relation.name;
1384
+ }
1385
+ return undefined;
1386
+ }
1387
+ /** `composes` edges from native nesting: parts, items and states by owner; actions by parent action. */
1388
+ composition() {
1389
+ const containing = new Set(['part', 'item', 'state']);
1390
+ for (const element of this.elements.values()) {
1391
+ if (!containing.has(element.construct) || !element.owner)
1392
+ continue;
1393
+ const parent = this.elements.get(element.owner);
1394
+ if (!parent || !containing.has(parent.construct))
1395
+ continue;
1396
+ this.relationships.push({ id: this.nextId(), type: 'composes', sourceId: element.owner, sourceEnd: 'parent',
1397
+ targetId: element.id, targetEnd: 'child', file: element.file, named: false });
1398
+ }
1399
+ for (const element of this.elements.values()) {
1400
+ if (element.construct !== 'action' || !element.parentAction)
1401
+ continue;
1402
+ const parent = this.elements.get(element.parentAction);
1403
+ if (!parent || parent.construct !== 'action')
1404
+ continue;
1405
+ this.relationships.push({ id: this.nextId(), type: 'composes', sourceId: element.parentAction, sourceEnd: 'parent',
1406
+ targetId: element.id, targetEnd: 'child', file: element.file, named: false });
1407
+ }
1408
+ }
1409
+ // ─── After extraction ───────────────────────────────────────────────────
1410
+ /** A usage typed by a local definition takes the ontology kind that definition resolved to. */
1411
+ inheritKindsFromLocalDefinitions() {
1412
+ const registry = this.registries?.kindRegistry;
1413
+ if (!registry)
1414
+ return;
1415
+ const byName = new Map();
1416
+ for (const [id, element] of this.elements) {
1417
+ if (!byName.has(id))
1418
+ byName.set(id, element);
1419
+ if (element.shortName && !byName.has(element.shortName))
1420
+ byName.set(element.shortName, element);
1421
+ if (element.name && !byName.has(element.name))
1422
+ byName.set(element.name, element);
1423
+ }
1424
+ for (let pass = 0; pass < 16; pass++) {
1425
+ let progressed = false;
1426
+ for (const element of this.elements.values()) {
1427
+ if (!element.kind || registry.getKind(element.kind))
1428
+ continue;
1429
+ const def = byName.get(lastSegment(element.kind));
1430
+ if (def && def !== element && def.kind && def.kind !== element.kind) {
1431
+ element.kind = def.kind;
1432
+ if (def.layer && (!element.layer || element.layer === 'unknown'))
1433
+ element.layer = def.layer;
1434
+ progressed = true;
1435
+ }
1436
+ }
1437
+ if (!progressed)
1438
+ break;
1439
+ }
1440
+ }
1441
+ }
1442
+ /** The metamodel's control nodes, keyed to the `controlKind` MEMO records. */
1443
+ const CONTROL_METACLASS_KINDS = {
1444
+ ForkNode: 'fork', JoinNode: 'join', DecisionNode: 'decide', MergeNode: 'merge',
1445
+ };
1446
+ function displayNameOf(attributes, shortName) {
1447
+ return attributes['label'] || attributes['name'] || attributes['title'] || shortName;
1448
+ }
1449
+ /**
1450
+ * A number as the source most plausibly wrote it: the JSON holds values, not
1451
+ * spellings, so a real that is whole is written `100.0` (a rational literal
1452
+ * always has a point) and no value is written in exponent form.
1453
+ */
1454
+ function renderNumber(value, rational) {
1455
+ if (!Number.isFinite(value))
1456
+ return String(value);
1457
+ if (rational && Number.isInteger(value))
1458
+ return `${value}.0`;
1459
+ const plain = value.toLocaleString('en-US', { useGrouping: false, maximumFractionDigits: 20 });
1460
+ return plain;
1461
+ }
1462
+ //# sourceMappingURL=build-from-api.js.map