@memoarchitect/tools 0.6.7 → 0.7.2

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 (466) hide show
  1. package/README.md +36 -11
  2. package/package.json +19 -7
  3. package/packages/tools/lib/bin/memo.js +161 -10
  4. package/packages/tools/lib/bin/memo.js.map +1 -1
  5. package/packages/tools/lib/browser/index.d.ts +1 -1
  6. package/packages/tools/lib/browser/index.d.ts.map +1 -1
  7. package/packages/tools/lib/browser/index.js +1 -1
  8. package/packages/tools/lib/browser/index.js.map +1 -1
  9. package/packages/tools/lib/commands/ask.js +1 -1
  10. package/packages/tools/lib/commands/ask.js.map +1 -1
  11. package/packages/tools/lib/commands/check.d.ts.map +1 -1
  12. package/packages/tools/lib/commands/check.js +3 -9
  13. package/packages/tools/lib/commands/check.js.map +1 -1
  14. package/packages/tools/lib/commands/conformance.d.ts +36 -0
  15. package/packages/tools/lib/commands/conformance.d.ts.map +1 -0
  16. package/packages/tools/lib/commands/conformance.js +212 -0
  17. package/packages/tools/lib/commands/conformance.js.map +1 -0
  18. package/packages/tools/lib/commands/convert.d.ts +12 -0
  19. package/packages/tools/lib/commands/convert.d.ts.map +1 -0
  20. package/packages/tools/lib/commands/convert.js +103 -0
  21. package/packages/tools/lib/commands/convert.js.map +1 -0
  22. package/packages/tools/lib/commands/create-package.d.ts +1 -2
  23. package/packages/tools/lib/commands/create-package.d.ts.map +1 -1
  24. package/packages/tools/lib/commands/create-package.js.map +1 -1
  25. package/packages/tools/lib/commands/dev.d.ts +13 -0
  26. package/packages/tools/lib/commands/dev.d.ts.map +1 -1
  27. package/packages/tools/lib/commands/dev.js +208 -74
  28. package/packages/tools/lib/commands/dev.js.map +1 -1
  29. package/packages/tools/lib/commands/dhf-draft.js +1 -1
  30. package/packages/tools/lib/commands/dhf-draft.js.map +1 -1
  31. package/packages/tools/lib/commands/dhf-preview.js +1 -1
  32. package/packages/tools/lib/commands/dhf-preview.js.map +1 -1
  33. package/packages/tools/lib/commands/dhf.js +1 -1
  34. package/packages/tools/lib/commands/dhf.js.map +1 -1
  35. package/packages/tools/lib/commands/element.d.ts +34 -0
  36. package/packages/tools/lib/commands/element.d.ts.map +1 -0
  37. package/packages/tools/lib/commands/element.js +174 -0
  38. package/packages/tools/lib/commands/element.js.map +1 -0
  39. package/packages/tools/lib/commands/export.d.ts.map +1 -1
  40. package/packages/tools/lib/commands/export.js +39 -40
  41. package/packages/tools/lib/commands/export.js.map +1 -1
  42. package/packages/tools/lib/commands/generate.d.ts.map +1 -1
  43. package/packages/tools/lib/commands/generate.js +10 -7
  44. package/packages/tools/lib/commands/generate.js.map +1 -1
  45. package/packages/tools/lib/commands/import.d.ts.map +1 -1
  46. package/packages/tools/lib/commands/import.js +25 -12
  47. package/packages/tools/lib/commands/import.js.map +1 -1
  48. package/packages/tools/lib/commands/init.d.ts.map +1 -1
  49. package/packages/tools/lib/commands/init.js +34 -14
  50. package/packages/tools/lib/commands/init.js.map +1 -1
  51. package/packages/tools/lib/commands/inspect.d.ts +5 -0
  52. package/packages/tools/lib/commands/inspect.d.ts.map +1 -0
  53. package/packages/tools/lib/commands/inspect.js +56 -0
  54. package/packages/tools/lib/commands/inspect.js.map +1 -0
  55. package/packages/tools/lib/commands/lock.d.ts.map +1 -1
  56. package/packages/tools/lib/commands/lock.js +7 -2
  57. package/packages/tools/lib/commands/lock.js.map +1 -1
  58. package/packages/tools/lib/commands/ontology.d.ts.map +1 -1
  59. package/packages/tools/lib/commands/ontology.js +69 -116
  60. package/packages/tools/lib/commands/ontology.js.map +1 -1
  61. package/packages/tools/lib/commands/pack.d.ts +1 -1
  62. package/packages/tools/lib/commands/pack.d.ts.map +1 -1
  63. package/packages/tools/lib/commands/pack.js +20 -78
  64. package/packages/tools/lib/commands/pack.js.map +1 -1
  65. package/packages/tools/lib/commands/package.d.ts +10 -0
  66. package/packages/tools/lib/commands/package.d.ts.map +1 -0
  67. package/packages/tools/lib/commands/package.js +113 -0
  68. package/packages/tools/lib/commands/package.js.map +1 -0
  69. package/packages/tools/lib/commands/plugin.js +1 -1
  70. package/packages/tools/lib/commands/plugin.js.map +1 -1
  71. package/packages/tools/lib/commands/rules.d.ts.map +1 -1
  72. package/packages/tools/lib/commands/rules.js +120 -30
  73. package/packages/tools/lib/commands/rules.js.map +1 -1
  74. package/packages/tools/lib/commands/sysand-publish.d.ts.map +1 -1
  75. package/packages/tools/lib/commands/sysand-publish.js +14 -16
  76. package/packages/tools/lib/commands/sysand-publish.js.map +1 -1
  77. package/packages/tools/lib/commands/toolchain.d.ts +8 -0
  78. package/packages/tools/lib/commands/toolchain.d.ts.map +1 -0
  79. package/packages/tools/lib/commands/toolchain.js +64 -0
  80. package/packages/tools/lib/commands/toolchain.js.map +1 -0
  81. package/packages/tools/lib/commands/validate.d.ts +1 -1
  82. package/packages/tools/lib/commands/validate.d.ts.map +1 -1
  83. package/packages/tools/lib/commands/validate.js +183 -56
  84. package/packages/tools/lib/commands/validate.js.map +1 -1
  85. package/packages/tools/lib/completeness/tracker.d.ts +10 -2
  86. package/packages/tools/lib/completeness/tracker.d.ts.map +1 -1
  87. package/packages/tools/lib/completeness/tracker.js +16 -21
  88. package/packages/tools/lib/completeness/tracker.js.map +1 -1
  89. package/packages/tools/lib/conformance/baseline.d.ts +26 -0
  90. package/packages/tools/lib/conformance/baseline.d.ts.map +1 -0
  91. package/packages/tools/lib/conformance/baseline.js +170 -0
  92. package/packages/tools/lib/conformance/baseline.js.map +1 -0
  93. package/packages/tools/lib/conformance/bnf.d.ts +84 -0
  94. package/packages/tools/lib/conformance/bnf.d.ts.map +1 -0
  95. package/packages/tools/lib/conformance/bnf.js +166 -0
  96. package/packages/tools/lib/conformance/bnf.js.map +1 -0
  97. package/packages/tools/lib/conformance/corpus.d.ts +125 -0
  98. package/packages/tools/lib/conformance/corpus.d.ts.map +1 -0
  99. package/packages/tools/lib/conformance/corpus.js +190 -0
  100. package/packages/tools/lib/conformance/corpus.js.map +1 -0
  101. package/packages/tools/lib/conformance/diff-xmi.d.ts +118 -0
  102. package/packages/tools/lib/conformance/diff-xmi.d.ts.map +1 -0
  103. package/packages/tools/lib/conformance/diff-xmi.js +276 -0
  104. package/packages/tools/lib/conformance/diff-xmi.js.map +1 -0
  105. package/packages/tools/lib/conformance/generated/syside-rules.d.ts +10 -0
  106. package/packages/tools/lib/conformance/generated/syside-rules.d.ts.map +1 -0
  107. package/packages/tools/lib/conformance/generated/syside-rules.js +1142 -0
  108. package/packages/tools/lib/conformance/generated/syside-rules.js.map +1 -0
  109. package/packages/tools/lib/conformance/index.d.ts +7 -0
  110. package/packages/tools/lib/conformance/index.d.ts.map +1 -0
  111. package/packages/tools/lib/conformance/index.js +19 -0
  112. package/packages/tools/lib/conformance/index.js.map +1 -0
  113. package/packages/tools/lib/conformance/run.d.ts +117 -0
  114. package/packages/tools/lib/conformance/run.d.ts.map +1 -0
  115. package/packages/tools/lib/conformance/run.js +0 -0
  116. package/packages/tools/lib/conformance/run.js.map +1 -0
  117. package/packages/tools/lib/conformance/xmi.d.ts +45 -0
  118. package/packages/tools/lib/conformance/xmi.d.ts.map +1 -0
  119. package/packages/tools/lib/conformance/xmi.js +148 -0
  120. package/packages/tools/lib/conformance/xmi.js.map +1 -0
  121. package/packages/tools/lib/dhf/template-resolver.js +1 -1
  122. package/packages/tools/lib/dhf/template-resolver.js.map +1 -1
  123. package/packages/tools/lib/import/column-mapper.d.ts +2 -2
  124. package/packages/tools/lib/import/column-mapper.d.ts.map +1 -1
  125. package/packages/tools/lib/import/column-mapper.js +3 -3
  126. package/packages/tools/lib/import/column-mapper.js.map +1 -1
  127. package/packages/tools/lib/index.d.ts +20 -3
  128. package/packages/tools/lib/index.d.ts.map +1 -1
  129. package/packages/tools/lib/index.js +19 -2
  130. package/packages/tools/lib/index.js.map +1 -1
  131. package/packages/tools/lib/language/generated/ast.d.ts +196 -51
  132. package/packages/tools/lib/language/generated/ast.d.ts.map +1 -1
  133. package/packages/tools/lib/language/generated/ast.js +136 -15
  134. package/packages/tools/lib/language/generated/ast.js.map +1 -1
  135. package/packages/tools/lib/language/generated/grammar.d.ts.map +1 -1
  136. package/packages/tools/lib/language/generated/grammar.js +867 -295
  137. package/packages/tools/lib/language/generated/grammar.js.map +1 -1
  138. package/packages/tools/lib/llm/chat-engine.d.ts +4 -3
  139. package/packages/tools/lib/llm/chat-engine.d.ts.map +1 -1
  140. package/packages/tools/lib/llm/chat-engine.js +15 -12
  141. package/packages/tools/lib/llm/chat-engine.js.map +1 -1
  142. package/packages/tools/lib/llm/generate-engine.d.ts +7 -2
  143. package/packages/tools/lib/llm/generate-engine.d.ts.map +1 -1
  144. package/packages/tools/lib/llm/generate-engine.js +22 -4
  145. package/packages/tools/lib/llm/generate-engine.js.map +1 -1
  146. package/packages/tools/lib/llm/index.d.ts +1 -0
  147. package/packages/tools/lib/llm/index.d.ts.map +1 -1
  148. package/packages/tools/lib/llm/index.js +1 -0
  149. package/packages/tools/lib/llm/index.js.map +1 -1
  150. package/packages/tools/lib/llm/model-context.d.ts +2 -2
  151. package/packages/tools/lib/llm/model-context.d.ts.map +1 -1
  152. package/packages/tools/lib/llm/model-context.js +7 -13
  153. package/packages/tools/lib/llm/model-context.js.map +1 -1
  154. package/packages/tools/lib/llm/sysml-guidance.d.ts +8 -0
  155. package/packages/tools/lib/llm/sysml-guidance.d.ts.map +1 -0
  156. package/packages/tools/lib/llm/sysml-guidance.js +28 -0
  157. package/packages/tools/lib/llm/sysml-guidance.js.map +1 -0
  158. package/packages/tools/lib/lock.d.ts +14 -8
  159. package/packages/tools/lib/lock.d.ts.map +1 -1
  160. package/packages/tools/lib/lock.js +97 -108
  161. package/packages/tools/lib/lock.js.map +1 -1
  162. package/packages/tools/lib/mcp/model-loader.d.ts +3 -0
  163. package/packages/tools/lib/mcp/model-loader.d.ts.map +1 -1
  164. package/packages/tools/lib/mcp/model-loader.js +9 -5
  165. package/packages/tools/lib/mcp/model-loader.js.map +1 -1
  166. package/packages/tools/lib/mcp/tools.d.ts +3 -0
  167. package/packages/tools/lib/mcp/tools.d.ts.map +1 -1
  168. package/packages/tools/lib/mcp/tools.js +8 -9
  169. package/packages/tools/lib/mcp/tools.js.map +1 -1
  170. package/packages/tools/lib/model/activity-notation.d.ts +54 -0
  171. package/packages/tools/lib/model/activity-notation.d.ts.map +1 -0
  172. package/packages/tools/lib/model/activity-notation.js +208 -0
  173. package/packages/tools/lib/model/activity-notation.js.map +1 -0
  174. package/packages/tools/lib/model/builder.d.ts +3 -0
  175. package/packages/tools/lib/model/builder.d.ts.map +1 -1
  176. package/packages/tools/lib/model/builder.js +231 -19
  177. package/packages/tools/lib/model/builder.js.map +1 -1
  178. package/packages/tools/lib/model/config-loader.d.ts +19 -25
  179. package/packages/tools/lib/model/config-loader.d.ts.map +1 -1
  180. package/packages/tools/lib/model/config-loader.js +51 -233
  181. package/packages/tools/lib/model/config-loader.js.map +1 -1
  182. package/packages/tools/lib/model/config.d.ts +42 -213
  183. package/packages/tools/lib/model/config.d.ts.map +1 -1
  184. package/packages/tools/lib/model/config.js +11 -9
  185. package/packages/tools/lib/model/config.js.map +1 -1
  186. package/packages/tools/lib/model/effective-scope.d.ts +74 -0
  187. package/packages/tools/lib/model/effective-scope.d.ts.map +1 -0
  188. package/packages/tools/lib/model/effective-scope.js +133 -0
  189. package/packages/tools/lib/model/effective-scope.js.map +1 -0
  190. package/packages/tools/lib/model/ir-identity.d.ts +94 -0
  191. package/packages/tools/lib/model/ir-identity.d.ts.map +1 -0
  192. package/packages/tools/lib/model/ir-identity.js +178 -0
  193. package/packages/tools/lib/model/ir-identity.js.map +1 -0
  194. package/packages/tools/lib/model/kind-registry.d.ts +114 -1
  195. package/packages/tools/lib/model/kind-registry.d.ts.map +1 -1
  196. package/packages/tools/lib/model/kind-registry.js +148 -4
  197. package/packages/tools/lib/model/kind-registry.js.map +1 -1
  198. package/packages/tools/lib/model/layer-resolver.js +1 -1
  199. package/packages/tools/lib/model/layer-resolver.js.map +1 -1
  200. package/packages/tools/lib/model/methodology-loader.d.ts +19 -24
  201. package/packages/tools/lib/model/methodology-loader.d.ts.map +1 -1
  202. package/packages/tools/lib/model/methodology-loader.js +179 -176
  203. package/packages/tools/lib/model/methodology-loader.js.map +1 -1
  204. package/packages/tools/lib/model/methodology-resolver.d.ts +115 -0
  205. package/packages/tools/lib/model/methodology-resolver.d.ts.map +1 -0
  206. package/packages/tools/lib/model/methodology-resolver.js +317 -0
  207. package/packages/tools/lib/model/methodology-resolver.js.map +1 -0
  208. package/packages/tools/lib/model/native-project.d.ts +130 -0
  209. package/packages/tools/lib/model/native-project.d.ts.map +1 -0
  210. package/packages/tools/lib/model/native-project.js +570 -0
  211. package/packages/tools/lib/model/native-project.js.map +1 -0
  212. package/packages/tools/lib/model/ontology-loader.d.ts +34 -21
  213. package/packages/tools/lib/model/ontology-loader.d.ts.map +1 -1
  214. package/packages/tools/lib/model/ontology-loader.js +340 -614
  215. package/packages/tools/lib/model/ontology-loader.js.map +1 -1
  216. package/packages/tools/lib/model/package-manifest.d.ts +37 -0
  217. package/packages/tools/lib/model/package-manifest.d.ts.map +1 -0
  218. package/packages/tools/lib/model/package-manifest.js +96 -0
  219. package/packages/tools/lib/model/package-manifest.js.map +1 -0
  220. package/packages/tools/lib/model/parser-utils.d.ts +31 -0
  221. package/packages/tools/lib/model/parser-utils.d.ts.map +1 -1
  222. package/packages/tools/lib/model/parser-utils.js +89 -1
  223. package/packages/tools/lib/model/parser-utils.js.map +1 -1
  224. package/packages/tools/lib/model/paths.d.ts +10 -4
  225. package/packages/tools/lib/model/paths.d.ts.map +1 -1
  226. package/packages/tools/lib/model/paths.js +10 -4
  227. package/packages/tools/lib/model/paths.js.map +1 -1
  228. package/packages/tools/lib/model/project-conversion.d.ts +226 -0
  229. package/packages/tools/lib/model/project-conversion.d.ts.map +1 -0
  230. package/packages/tools/lib/model/project-conversion.js +946 -0
  231. package/packages/tools/lib/model/project-conversion.js.map +1 -0
  232. package/packages/tools/lib/model/relationship-legality.d.ts +10 -0
  233. package/packages/tools/lib/model/relationship-legality.d.ts.map +1 -1
  234. package/packages/tools/lib/model/relationship-legality.js.map +1 -1
  235. package/packages/tools/lib/model/relationship-registry.d.ts +16 -1
  236. package/packages/tools/lib/model/relationship-registry.d.ts.map +1 -1
  237. package/packages/tools/lib/model/relationship-registry.js.map +1 -1
  238. package/packages/tools/lib/model/semantic.d.ts +27 -0
  239. package/packages/tools/lib/model/semantic.d.ts.map +1 -1
  240. package/packages/tools/lib/model/semantic.js +3 -0
  241. package/packages/tools/lib/model/semantic.js.map +1 -1
  242. package/packages/tools/lib/model/settings-boundary.d.ts +19 -0
  243. package/packages/tools/lib/model/settings-boundary.d.ts.map +1 -0
  244. package/packages/tools/lib/model/settings-boundary.js +118 -0
  245. package/packages/tools/lib/model/settings-boundary.js.map +1 -0
  246. package/packages/tools/lib/model/short-id.d.ts.map +1 -1
  247. package/packages/tools/lib/model/short-id.js +2 -0
  248. package/packages/tools/lib/model/short-id.js.map +1 -1
  249. package/packages/tools/lib/model/source-graph.d.ts.map +1 -1
  250. package/packages/tools/lib/model/source-graph.js +5 -1
  251. package/packages/tools/lib/model/source-graph.js.map +1 -1
  252. package/packages/tools/lib/model/source-provenance.d.ts +112 -0
  253. package/packages/tools/lib/model/source-provenance.d.ts.map +1 -0
  254. package/packages/tools/lib/model/source-provenance.js +169 -0
  255. package/packages/tools/lib/model/source-provenance.js.map +1 -0
  256. package/packages/tools/lib/model/sysml-ir.d.ts +9 -0
  257. package/packages/tools/lib/model/sysml-ir.d.ts.map +1 -0
  258. package/packages/tools/lib/model/sysml-ir.js +105 -0
  259. package/packages/tools/lib/model/sysml-ir.js.map +1 -0
  260. package/packages/tools/lib/model/view-deriver.d.ts.map +1 -1
  261. package/packages/tools/lib/model/view-deriver.js +36 -6
  262. package/packages/tools/lib/model/view-deriver.js.map +1 -1
  263. package/packages/tools/lib/model/view-kinds.d.ts +2 -0
  264. package/packages/tools/lib/model/view-kinds.d.ts.map +1 -1
  265. package/packages/tools/lib/model/view-kinds.js +11 -0
  266. package/packages/tools/lib/model/view-kinds.js.map +1 -1
  267. package/packages/tools/lib/ontology/owl-exporter.d.ts +2 -2
  268. package/packages/tools/lib/ontology/owl-exporter.d.ts.map +1 -1
  269. package/packages/tools/lib/ontology/owl-exporter.js +12 -12
  270. package/packages/tools/lib/ontology/owl-exporter.js.map +1 -1
  271. package/packages/tools/lib/operations/ai-authoring.d.ts +24 -0
  272. package/packages/tools/lib/operations/ai-authoring.d.ts.map +1 -0
  273. package/packages/tools/lib/operations/ai-authoring.js +77 -0
  274. package/packages/tools/lib/operations/ai-authoring.js.map +1 -0
  275. package/packages/tools/lib/operations/authoring.d.ts +40 -0
  276. package/packages/tools/lib/operations/authoring.d.ts.map +1 -0
  277. package/packages/tools/lib/operations/authoring.js +56 -0
  278. package/packages/tools/lib/operations/authoring.js.map +1 -0
  279. package/packages/tools/lib/operations/index.d.ts +2 -0
  280. package/packages/tools/lib/operations/index.d.ts.map +1 -1
  281. package/packages/tools/lib/operations/index.js +2 -0
  282. package/packages/tools/lib/operations/index.js.map +1 -1
  283. package/packages/tools/lib/operations/project-snapshot.d.ts +28 -3
  284. package/packages/tools/lib/operations/project-snapshot.d.ts.map +1 -1
  285. package/packages/tools/lib/operations/project-snapshot.js +79 -30
  286. package/packages/tools/lib/operations/project-snapshot.js.map +1 -1
  287. package/packages/tools/lib/protocol/messages.d.ts +298 -11
  288. package/packages/tools/lib/protocol/messages.d.ts.map +1 -1
  289. package/packages/tools/lib/serializer/csv-io.d.ts +7 -7
  290. package/packages/tools/lib/serializer/csv-io.d.ts.map +1 -1
  291. package/packages/tools/lib/serializer/csv-io.js +11 -11
  292. package/packages/tools/lib/serializer/csv-io.js.map +1 -1
  293. package/packages/tools/lib/serializer/sysml-generator.d.ts.map +1 -1
  294. package/packages/tools/lib/serializer/sysml-generator.js +34 -2
  295. package/packages/tools/lib/serializer/sysml-generator.js.map +1 -1
  296. package/packages/tools/lib/server/config-resolver.d.ts +8 -4
  297. package/packages/tools/lib/server/config-resolver.d.ts.map +1 -1
  298. package/packages/tools/lib/server/config-resolver.js +25 -44
  299. package/packages/tools/lib/server/config-resolver.js.map +1 -1
  300. package/packages/tools/lib/server/conflict-policy.d.ts +44 -0
  301. package/packages/tools/lib/server/conflict-policy.d.ts.map +1 -0
  302. package/packages/tools/lib/server/conflict-policy.js +94 -0
  303. package/packages/tools/lib/server/conflict-policy.js.map +1 -0
  304. package/packages/tools/lib/server/dev-server.d.ts +32 -2
  305. package/packages/tools/lib/server/dev-server.d.ts.map +1 -1
  306. package/packages/tools/lib/server/dev-server.js +721 -53
  307. package/packages/tools/lib/server/dev-server.js.map +1 -1
  308. package/packages/tools/lib/server/element-writer.d.ts +11 -0
  309. package/packages/tools/lib/server/element-writer.d.ts.map +1 -0
  310. package/packages/tools/lib/server/element-writer.js +123 -0
  311. package/packages/tools/lib/server/element-writer.js.map +1 -0
  312. package/packages/tools/lib/server/file-watcher.d.ts +4 -1
  313. package/packages/tools/lib/server/file-watcher.d.ts.map +1 -1
  314. package/packages/tools/lib/server/file-watcher.js +17 -7
  315. package/packages/tools/lib/server/file-watcher.js.map +1 -1
  316. package/packages/tools/lib/server/mutation-domain.d.ts +22 -0
  317. package/packages/tools/lib/server/mutation-domain.d.ts.map +1 -0
  318. package/packages/tools/lib/server/mutation-domain.js +87 -0
  319. package/packages/tools/lib/server/mutation-domain.js.map +1 -0
  320. package/packages/tools/lib/server/persistor.d.ts +63 -8
  321. package/packages/tools/lib/server/persistor.d.ts.map +1 -1
  322. package/packages/tools/lib/server/persistor.js +152 -44
  323. package/packages/tools/lib/server/persistor.js.map +1 -1
  324. package/packages/tools/lib/server/relationship-writer.d.ts +28 -4
  325. package/packages/tools/lib/server/relationship-writer.d.ts.map +1 -1
  326. package/packages/tools/lib/server/relationship-writer.js +98 -13
  327. package/packages/tools/lib/server/relationship-writer.js.map +1 -1
  328. package/packages/tools/lib/server/rule-policy-writer.d.ts +40 -0
  329. package/packages/tools/lib/server/rule-policy-writer.d.ts.map +1 -0
  330. package/packages/tools/lib/server/rule-policy-writer.js +124 -0
  331. package/packages/tools/lib/server/rule-policy-writer.js.map +1 -0
  332. package/packages/tools/lib/server/runtime-budget.d.ts +14 -0
  333. package/packages/tools/lib/server/runtime-budget.d.ts.map +1 -0
  334. package/packages/tools/lib/server/runtime-budget.js +15 -0
  335. package/packages/tools/lib/server/runtime-budget.js.map +1 -0
  336. package/packages/tools/lib/server/sysml-notation.d.ts +36 -0
  337. package/packages/tools/lib/server/sysml-notation.d.ts.map +1 -0
  338. package/packages/tools/lib/server/sysml-notation.js +87 -0
  339. package/packages/tools/lib/server/sysml-notation.js.map +1 -0
  340. package/packages/tools/lib/sysml-ir/generated/sysml-derivations.d.ts +9 -0
  341. package/packages/tools/lib/sysml-ir/generated/sysml-derivations.d.ts.map +1 -0
  342. package/packages/tools/lib/sysml-ir/generated/sysml-derivations.js +315 -0
  343. package/packages/tools/lib/sysml-ir/generated/sysml-derivations.js.map +1 -0
  344. package/packages/tools/lib/sysml-ir/generated/sysml-metamodel.d.ts +5206 -0
  345. package/packages/tools/lib/sysml-ir/generated/sysml-metamodel.d.ts.map +1 -0
  346. package/packages/tools/lib/sysml-ir/generated/sysml-metamodel.js +1933 -0
  347. package/packages/tools/lib/sysml-ir/generated/sysml-metamodel.js.map +1 -0
  348. package/packages/tools/lib/sysml-ir/index.d.ts +3 -0
  349. package/packages/tools/lib/sysml-ir/index.d.ts.map +1 -0
  350. package/packages/tools/lib/sysml-ir/index.js +3 -0
  351. package/packages/tools/lib/sysml-ir/index.js.map +1 -0
  352. package/packages/tools/lib/sysml-ir/ir.d.ts +50 -0
  353. package/packages/tools/lib/sysml-ir/ir.d.ts.map +1 -0
  354. package/packages/tools/lib/sysml-ir/ir.js +2 -0
  355. package/packages/tools/lib/sysml-ir/ir.js.map +1 -0
  356. package/packages/tools/lib/sysmlc/bin/memo-sysmlc.d.ts +3 -0
  357. package/packages/tools/lib/sysmlc/bin/memo-sysmlc.d.ts.map +1 -0
  358. package/packages/tools/lib/sysmlc/bin/memo-sysmlc.js +97 -0
  359. package/packages/tools/lib/sysmlc/bin/memo-sysmlc.js.map +1 -0
  360. package/packages/tools/lib/sysmlc/index.d.ts +2 -0
  361. package/packages/tools/lib/sysmlc/index.d.ts.map +1 -0
  362. package/packages/tools/lib/sysmlc/index.js +7 -0
  363. package/packages/tools/lib/sysmlc/index.js.map +1 -0
  364. package/packages/tools/lib/sysmlc/server.d.ts +29 -0
  365. package/packages/tools/lib/sysmlc/server.d.ts.map +1 -0
  366. package/packages/tools/lib/sysmlc/server.js +168 -0
  367. package/packages/tools/lib/sysmlc/server.js.map +1 -0
  368. package/packages/tools/lib/toolchain/default-registry.d.ts +12 -0
  369. package/packages/tools/lib/toolchain/default-registry.d.ts.map +1 -0
  370. package/packages/tools/lib/toolchain/default-registry.js +28 -0
  371. package/packages/tools/lib/toolchain/default-registry.js.map +1 -0
  372. package/packages/tools/lib/toolchain/diagnostic.d.ts +57 -0
  373. package/packages/tools/lib/toolchain/diagnostic.d.ts.map +1 -0
  374. package/packages/tools/lib/toolchain/diagnostic.js +69 -0
  375. package/packages/tools/lib/toolchain/diagnostic.js.map +1 -0
  376. package/packages/tools/lib/toolchain/effective.d.ts +36 -0
  377. package/packages/tools/lib/toolchain/effective.d.ts.map +1 -0
  378. package/packages/tools/lib/toolchain/effective.js +91 -0
  379. package/packages/tools/lib/toolchain/effective.js.map +1 -0
  380. package/packages/tools/lib/toolchain/index.d.ts +11 -0
  381. package/packages/tools/lib/toolchain/index.d.ts.map +1 -0
  382. package/packages/tools/lib/toolchain/index.js +21 -0
  383. package/packages/tools/lib/toolchain/index.js.map +1 -0
  384. package/packages/tools/lib/toolchain/lowering.d.ts +63 -0
  385. package/packages/tools/lib/toolchain/lowering.d.ts.map +1 -0
  386. package/packages/tools/lib/toolchain/lowering.js +100 -0
  387. package/packages/tools/lib/toolchain/lowering.js.map +1 -0
  388. package/packages/tools/lib/toolchain/operations.d.ts +87 -0
  389. package/packages/tools/lib/toolchain/operations.d.ts.map +1 -0
  390. package/packages/tools/lib/toolchain/operations.js +111 -0
  391. package/packages/tools/lib/toolchain/operations.js.map +1 -0
  392. package/packages/tools/lib/toolchain/process.d.ts +45 -0
  393. package/packages/tools/lib/toolchain/process.d.ts.map +1 -0
  394. package/packages/tools/lib/toolchain/process.js +125 -0
  395. package/packages/tools/lib/toolchain/process.js.map +1 -0
  396. package/packages/tools/lib/toolchain/protocol.d.ts +122 -0
  397. package/packages/tools/lib/toolchain/protocol.d.ts.map +1 -0
  398. package/packages/tools/lib/toolchain/protocol.js +74 -0
  399. package/packages/tools/lib/toolchain/protocol.js.map +1 -0
  400. package/packages/tools/lib/toolchain/providers/internal-kpar.d.ts +9 -0
  401. package/packages/tools/lib/toolchain/providers/internal-kpar.d.ts.map +1 -0
  402. package/packages/tools/lib/toolchain/providers/internal-kpar.js +84 -0
  403. package/packages/tools/lib/toolchain/providers/internal-kpar.js.map +1 -0
  404. package/packages/tools/lib/toolchain/providers/internal.d.ts +33 -0
  405. package/packages/tools/lib/toolchain/providers/internal.d.ts.map +1 -0
  406. package/packages/tools/lib/toolchain/providers/internal.js +286 -0
  407. package/packages/tools/lib/toolchain/providers/internal.js.map +1 -0
  408. package/packages/tools/lib/toolchain/providers/sysand.d.ts +12 -0
  409. package/packages/tools/lib/toolchain/providers/sysand.d.ts.map +1 -0
  410. package/packages/tools/lib/toolchain/providers/sysand.js +110 -0
  411. package/packages/tools/lib/toolchain/providers/sysand.js.map +1 -0
  412. package/packages/tools/lib/toolchain/providers/syside.d.ts +24 -0
  413. package/packages/tools/lib/toolchain/providers/syside.d.ts.map +1 -0
  414. package/packages/tools/lib/toolchain/providers/syside.js +208 -0
  415. package/packages/tools/lib/toolchain/providers/syside.js.map +1 -0
  416. package/packages/tools/lib/toolchain/registry.d.ts +192 -0
  417. package/packages/tools/lib/toolchain/registry.d.ts.map +1 -0
  418. package/packages/tools/lib/toolchain/registry.js +130 -0
  419. package/packages/tools/lib/toolchain/registry.js.map +1 -0
  420. package/packages/tools/lib/toolchain/schema.d.ts +30 -0
  421. package/packages/tools/lib/toolchain/schema.d.ts.map +1 -0
  422. package/packages/tools/lib/toolchain/schema.js +112 -0
  423. package/packages/tools/lib/toolchain/schema.js.map +1 -0
  424. package/packages/tools/lib/toolchain/sysmlc-client.d.ts +77 -0
  425. package/packages/tools/lib/toolchain/sysmlc-client.d.ts.map +1 -0
  426. package/packages/tools/lib/toolchain/sysmlc-client.js +0 -0
  427. package/packages/tools/lib/toolchain/sysmlc-client.js.map +1 -0
  428. package/packages/tools/lib/validator/architecture-validator.d.ts +8 -1
  429. package/packages/tools/lib/validator/architecture-validator.d.ts.map +1 -1
  430. package/packages/tools/lib/validator/architecture-validator.js +25 -1
  431. package/packages/tools/lib/validator/architecture-validator.js.map +1 -1
  432. package/packages/tools/lib/validator/builtin-rules.d.ts +16 -0
  433. package/packages/tools/lib/validator/builtin-rules.d.ts.map +1 -0
  434. package/packages/tools/lib/validator/builtin-rules.js +62 -0
  435. package/packages/tools/lib/validator/builtin-rules.js.map +1 -0
  436. package/packages/tools/lib/validator/constraint-eval.d.ts +15 -0
  437. package/packages/tools/lib/validator/constraint-eval.d.ts.map +1 -1
  438. package/packages/tools/lib/validator/constraint-eval.js +62 -7
  439. package/packages/tools/lib/validator/constraint-eval.js.map +1 -1
  440. package/packages/tools/lib/validator/constraint-loader.d.ts +22 -4
  441. package/packages/tools/lib/validator/constraint-loader.d.ts.map +1 -1
  442. package/packages/tools/lib/validator/constraint-loader.js +100 -27
  443. package/packages/tools/lib/validator/constraint-loader.js.map +1 -1
  444. package/packages/tools/lib/validator/rule-engine.d.ts +2 -1
  445. package/packages/tools/lib/validator/rule-engine.d.ts.map +1 -1
  446. package/packages/tools/lib/validator/rule-engine.js +56 -5
  447. package/packages/tools/lib/validator/rule-engine.js.map +1 -1
  448. package/packages/tools/lib/validator/sysml-constraints.d.ts +64 -0
  449. package/packages/tools/lib/validator/sysml-constraints.d.ts.map +1 -0
  450. package/packages/tools/lib/validator/sysml-constraints.js +251 -0
  451. package/packages/tools/lib/validator/sysml-constraints.js.map +1 -0
  452. package/packages/tools/lib/validator/types.d.ts +33 -0
  453. package/packages/tools/lib/validator/types.d.ts.map +1 -1
  454. package/packages/tools/lib/version.d.ts +2 -0
  455. package/packages/tools/lib/version.d.ts.map +1 -0
  456. package/packages/tools/lib/version.js +26 -0
  457. package/packages/tools/lib/version.js.map +1 -0
  458. package/packages/tools/src/grammar/memo-sysml.langium +104 -18
  459. package/packages/tools/lib/model/dimension-filter.d.ts +0 -33
  460. package/packages/tools/lib/model/dimension-filter.d.ts.map +0 -1
  461. package/packages/tools/lib/model/dimension-filter.js +0 -57
  462. package/packages/tools/lib/model/dimension-filter.js.map +0 -1
  463. package/packages/tools/lib/model/toolchain.d.ts +0 -12
  464. package/packages/tools/lib/model/toolchain.d.ts.map +0 -1
  465. package/packages/tools/lib/model/toolchain.js +0 -92
  466. package/packages/tools/lib/model/toolchain.js.map +0 -1
@@ -0,0 +1,208 @@
1
+ // ─── Activity notation roles ─────────────────────────────────────────────────
2
+ //
3
+ // Which activity symbol an element draws as. Same standard as
4
+ // `relationship-legality.ts`: pure, dependency-free, and derived from declared
5
+ // data rather than from a table of names in TypeScript.
6
+ //
7
+ // What this replaces. Architect's `actionflow-view.ts` classified nodes by
8
+ // comparing a normalised `kind` string against a ladder of spellings —
9
+ // `'decisionnode' || 'decisionnodeusage'`, `'acceptactionusage' ||
10
+ // 'acceptaction'`, and so on. Three problems with that, in increasing order of
11
+ // seriousness: it lived in the view rather than in the toolchain (§1.2.2); the
12
+ // spellings were a hardcoded kind list, which is exactly what the engine is not
13
+ // supposed to contain; and it could not answer a question the metamodel answers
14
+ // for free — that a `ForkNode` *is* a `ControlNode` *is* an `ActionUsage`.
15
+ //
16
+ // How it works instead. Three declared sources decide, and none of them is a
17
+ // list of names maintained here:
18
+ //
19
+ // 1. **The normative metamodel.** `SYSML_METACLASSES` is generated from
20
+ // `SysML.ecore` (Track B B2), so the generalization graph — `ForkNode` →
21
+ // `ControlNode` → `ActionUsage` — is data. A role is anchored on one
22
+ // metaclass and matched with `conformsTo`, so every present and future
23
+ // subtype of that anchor classifies correctly without being named.
24
+ // 2. **The metamodel again, for precedence.** Roles are tried most-specific
25
+ // first, and "most specific" is computed from each anchor's supertype
26
+ // depth rather than written down in an order someone has to maintain.
27
+ // 3. **The ontology.** An element whose `kind` is a MEMO ontology kind is
28
+ // resolved by walking that kind's declared `superType` chain, so binding a
29
+ // new kind to a notation role is an ontology edit and not a code change.
30
+ //
31
+ // What remains hardcoded, stated plainly rather than hidden. Two things, both
32
+ // irreducible today:
33
+ //
34
+ // - **The role → anchor binding.** Notation is a mapping from semantics to
35
+ // symbols; something has to state it. The normative graphical grammar
36
+ // (`bnf/SysML-graphical-bnf.kgbnf`, vendored) names the productions —
37
+ // `fork-node`, `decision-node`, `accept-action-node` — but binds them to
38
+ // SVG images, not to metaclasses, so it cannot supply the anchor. Each
39
+ // binding cites its production, and Session 5's notation work is where the
40
+ // kgbnf becomes the source rather than the citation.
41
+ // - **The two final-node roles.** SysML v2 has no `ActivityFinalNode` or
42
+ // `FlowFinalNode` metaclass; they are UML and SysML v1 names that
43
+ // importers still emit. They cannot come from the v2 metamodel because the
44
+ // v2 metamodel does not have them, so they are declared as what they are —
45
+ // legacy input spellings — instead of sitting in the same ladder as
46
+ // metaclasses that do exist.
47
+ // ─────────────────────────────────────────────────────────────────────────────
48
+ import { SYSML_METACLASSES, allSuperTypes, conformsTo } from '../sysml-ir/index.js';
49
+ /**
50
+ * Role bindings, unordered.
51
+ *
52
+ * Deliberately not written in precedence order — `activityRolesBySpecificity()`
53
+ * derives that from the metamodel, so adding a binding cannot put it in the
54
+ * wrong place.
55
+ */
56
+ export const ACTIVITY_NOTATION_ROLES = [
57
+ { role: 'fork', metaclass: 'ForkNode', bnfProduction: 'fork-node' },
58
+ { role: 'join', metaclass: 'JoinNode', bnfProduction: 'join-node' },
59
+ { role: 'decision', metaclass: 'DecisionNode', bnfProduction: 'decision-node' },
60
+ { role: 'merge', metaclass: 'MergeNode', bnfProduction: 'merge-node' },
61
+ { role: 'send', metaclass: 'SendActionUsage', bnfProduction: 'send-action-node' },
62
+ { role: 'accept', metaclass: 'AcceptActionUsage', bnfProduction: 'accept-action-node' },
63
+ { role: 'activityFinal', metaclass: 'TerminateActionUsage' },
64
+ { role: 'action', metaclass: 'ActionUsage', bnfProduction: 'action-node' },
65
+ // Definitions draw as actions too, and `ActionDefinition` is not a subtype
66
+ // of `ActionUsage` — the metamodel puts it under `OccurrenceDefinition` and
67
+ // `Behavior` — so it needs its own anchor rather than being reached through
68
+ // the usage one. A role with two anchors is exactly what the list shape is
69
+ // for.
70
+ { role: 'action', metaclass: 'ActionDefinition', bnfProduction: 'action-node' },
71
+ ];
72
+ /**
73
+ * Input spellings SysML v2 has no metaclass for.
74
+ *
75
+ * UML and SysML v1 final nodes. Kept because importers emit them and a diagram
76
+ * that silently drops a final node is worse than one drawn from a legacy name;
77
+ * kept *here*, apart from the metamodel-driven path, because pretending they
78
+ * are metaclasses is how the old ladder became unreadable.
79
+ */
80
+ const LEGACY_NODE_SPELLINGS = {
81
+ activityfinalnode: 'activityFinal',
82
+ activityfinalnodeusage: 'activityFinal',
83
+ flowfinalnode: 'flowFinal',
84
+ flowfinalnodeusage: 'flowFinal',
85
+ };
86
+ /**
87
+ * MEMO grammar literals for `ControlNodeUsage.controlKind`, bound to the
88
+ * metaclasses they name.
89
+ *
90
+ * The four values come from MEMO's own Langium grammar, so they are not
91
+ * derivable from `SysML.ecore` — but their targets are, and
92
+ * `controlKindMetaclassesAreControlNodes()` asserts that these four are exactly
93
+ * the metamodel's `ControlNode` subtypes. A fifth control node upstream fails
94
+ * that check rather than silently going unclassified.
95
+ */
96
+ export const CONTROL_KIND_METACLASS = {
97
+ fork: 'ForkNode',
98
+ join: 'JoinNode',
99
+ decide: 'DecisionNode',
100
+ merge: 'MergeNode',
101
+ };
102
+ /** True when the bindings above still match the metamodel's control nodes. */
103
+ export function controlKindMetaclassesAreControlNodes() {
104
+ const declared = new Set(Object.values(CONTROL_KIND_METACLASS));
105
+ const actual = Object.keys(SYSML_METACLASSES)
106
+ .filter(name => name !== 'ControlNode' && conformsTo(name, 'ControlNode'));
107
+ return actual.length === declared.size && actual.every(name => declared.has(name));
108
+ }
109
+ /**
110
+ * Roles most-specific first, by supertype depth.
111
+ *
112
+ * `ForkNode` sits three levels below `ActionUsage`, so it is tried first and an
113
+ * `ActionUsage` anchor never swallows a control node. Computed rather than
114
+ * declared, because the metamodel already knows the answer.
115
+ */
116
+ export function activityRolesBySpecificity() {
117
+ return [...ACTIVITY_NOTATION_ROLES].sort((a, b) => allSuperTypes(b.metaclass).length - allSuperTypes(a.metaclass).length);
118
+ }
119
+ /**
120
+ * Spellings of `token` to try against the metamodel.
121
+ *
122
+ * The suffix rules exist because the same concept is written several ways
123
+ * across importers and MEMO's own construct keywords — `DecisionNodeUsage`,
124
+ * `decision`, `AcceptAction`. What makes this different from the ladder it
125
+ * replaces is that *the metamodel decides* which candidate is real: a spelling
126
+ * that does not name a metaclass simply does not match, and no spelling has to
127
+ * be enumerated here.
128
+ */
129
+ function metaclassCandidates(token) {
130
+ if (!token)
131
+ return [];
132
+ const base = token.replace(/[ _-]/g, '');
133
+ const capitalized = base.charAt(0).toUpperCase() + base.slice(1);
134
+ return [
135
+ capitalized,
136
+ `${capitalized}Usage`,
137
+ `${capitalized}Node`,
138
+ `${capitalized}ActionUsage`,
139
+ capitalized.replace(/Usage$/, ''),
140
+ capitalized.replace(/Definition$/, ''),
141
+ ];
142
+ }
143
+ /** The metaclass a token names, if the metamodel has one. */
144
+ function resolveMetaclass(token) {
145
+ for (const candidate of metaclassCandidates(token ?? '')) {
146
+ if (candidate in SYSML_METACLASSES)
147
+ return candidate;
148
+ }
149
+ return undefined;
150
+ }
151
+ /** An ontology kind and everything it specializes, nearest first. */
152
+ function ontologyChain(kind, kinds) {
153
+ const byName = new Map((kinds ?? []).map(definition => [definition.name, definition]));
154
+ const chain = [];
155
+ let current = kind;
156
+ while (current && !chain.includes(current)) {
157
+ chain.push(current);
158
+ current = byName.get(current)?.superType;
159
+ }
160
+ return chain;
161
+ }
162
+ /**
163
+ * The activity symbol this element draws as, or `undefined` if it is not an
164
+ * activity node at all.
165
+ *
166
+ * `registries` is optional: without it, classification uses the metamodel
167
+ * alone, which is what a caller holding a bare element can do. With it, an
168
+ * ontology kind reaches its role through its declared specialization chain —
169
+ * which is the path a project extends.
170
+ */
171
+ export function activityNodeType(element, registries) {
172
+ // The metamodel's own discriminator first: a control node says what it is.
173
+ const controlKind = element.attributes?.controlKind?.toLowerCase();
174
+ const fromControlKind = controlKind ? CONTROL_KIND_METACLASS[controlKind] : undefined;
175
+ const tokens = [
176
+ ...(fromControlKind ? [fromControlKind] : []),
177
+ ...ontologyChain(element.kind, registries?.kinds),
178
+ // Native SysML nodes (AcceptActionUsage, DecisionNodeUsage, etc.) are
179
+ // already represented by their metaclass name in `kind`; do not rely
180
+ // on the generic `construct: action`, which would erase their symbol.
181
+ element.kind,
182
+ element.construct,
183
+ ];
184
+ const roles = activityRolesBySpecificity();
185
+ for (const token of tokens) {
186
+ const legacy = LEGACY_NODE_SPELLINGS[(token ?? '').replace(/[ _-]/g, '').toLowerCase()];
187
+ if (legacy)
188
+ return legacy;
189
+ const metaclass = resolveMetaclass(token);
190
+ if (!metaclass)
191
+ continue;
192
+ const match = roles.find(role => conformsTo(metaclass, role.metaclass));
193
+ if (match)
194
+ return match.role;
195
+ }
196
+ return undefined;
197
+ }
198
+ /** Control nodes flow through the graph but own no responsibility lane. */
199
+ export function isControlNode(element, registries) {
200
+ const role = activityNodeType(element, registries);
201
+ if (role === 'activityFinal' || role === 'flowFinal')
202
+ return true;
203
+ const binding = ACTIVITY_NOTATION_ROLES.find(candidate => candidate.role === role);
204
+ // "Is it a control node" is the metamodel's question, not a list of four
205
+ // role names: `ControlNode` is a metaclass, and the anchors sit under it.
206
+ return binding !== undefined && conformsTo(binding.metaclass, 'ControlNode');
207
+ }
208
+ //# sourceMappingURL=activity-notation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity-notation.js","sourceRoot":"","sources":["../../src/model/activity-notation.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ import type { MemoModel, ParseError } from './semantic.js';
3
3
  import type { ParsedDocument } from './parser-utils.js';
4
4
  import type { KindRegistry } from './kind-registry.js';
5
5
  import type { RelationshipRegistry } from './relationship-registry.js';
6
+ import type { ProvenanceTable } from './source-provenance.js';
6
7
  /**
7
8
  * Optional registries for dual-mode resolution.
8
9
  * When provided, registries take precedence over config lookups.
@@ -13,6 +14,8 @@ export interface BuilderRegistries {
13
14
  kindRegistry?: KindRegistry;
14
15
  /** RelationshipRegistry populated from ontology SysML files */
15
16
  relationshipRegistry?: RelationshipRegistry;
17
+ /** Resolved source ownership; never infer this from a client-side path. */
18
+ provenance?: ProvenanceTable;
16
19
  }
17
20
  /**
18
21
  * Build a MemoModel from parsed documents and config.
@@ -1 +1 @@
1
- {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/model/builder.ts"],"names":[],"mappings":"AA4DA,OAAO,KAAK,EAAE,UAAU,EAAkB,MAAM,aAAa,CAAC;AAC9D,OAAO,KAAK,EAGR,SAAS,EACT,UAAU,EAGb,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAGvE;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAC9B,uDAAuD;IACvD,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,+DAA+D;IAC/D,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC/C;AAmFD;;;GAGG;AACH,wBAAgB,cAAc,CAC1B,SAAS,EAAE,cAAc,EAAE,EAC3B,MAAM,EAAE,UAAU,EAClB,WAAW,GAAE,UAAU,EAAO,EAC9B,UAAU,CAAC,EAAE,iBAAiB,GAC/B,SAAS,CAiIX"}
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/model/builder.ts"],"names":[],"mappings":"AA4DA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,KAAK,EAGR,SAAS,EACT,UAAU,EAGb,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAGvE,OAAO,KAAK,EAAE,eAAe,EAA6B,MAAM,wBAAwB,CAAC;AAEzF;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAC9B,uDAAuD;IACvD,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,+DAA+D;IAC/D,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,2EAA2E;IAC3E,UAAU,CAAC,EAAE,eAAe,CAAC;CAChC;AAqFD;;;GAGG;AACH,wBAAgB,cAAc,CAC1B,SAAS,EAAE,cAAc,EAAE,EAC3B,MAAM,EAAE,UAAU,EAClB,WAAW,GAAE,UAAU,EAAO,EAC9B,UAAU,CAAC,EAAE,iBAAiB,GAC/B,SAAS,CAsIX"}
@@ -28,6 +28,7 @@ import { createHash } from 'node:crypto';
28
28
  import { PackageRegistry } from './package-registry.js';
29
29
  import { assignSequentialShortIds, kindToPrefix } from './short-id.js';
30
30
  import { indexKinds, kindConformsTo } from './relationship-legality.js';
31
+ import { CONTROL_KIND_METACLASS } from './activity-notation.js';
31
32
  let relationshipCounter = 0;
32
33
  /**
33
34
  * Resolve a kind definition using registry-first, config-fallback strategy.
@@ -55,8 +56,10 @@ function resolveKindDef(typeName, config, registries) {
55
56
  }
56
57
  }
57
58
  }
58
- // Fall back to config (if kinds are present)
59
- const kinds = config.kinds ?? {};
59
+ // There is no config fallback. Kinds come from the ontology the project
60
+ // resolves; a YAML `kinds:` block used to be able to declare one, which
61
+ // meant a settings file could invent a type the ontology never defined.
62
+ const kinds = {};
60
63
  const kindDef = kinds[typeName];
61
64
  if (kindDef) {
62
65
  return { kindDef, resolvedKind: typeName };
@@ -108,6 +111,10 @@ export function buildMemoModel(documents, config, parseErrors = [], registries)
108
111
  for (const { allocate, filePath, packageName } of deferredAllocates) {
109
112
  resolveAllocate(allocate, filePath, packageName, elements, relationships, registry, allElementIds);
110
113
  }
114
+ // Keep ownership of a declaration separate from ownership of the type that
115
+ // classifies it. A project usage of `Hazard` is editable project content;
116
+ // its classifier is a read-only ontology definition.
117
+ applySemanticProvenance(elements, relationships, registries);
111
118
  // Build indexes
112
119
  const elementsByKind = new Map();
113
120
  const elementsByLayer = new Map();
@@ -197,6 +204,49 @@ export function buildMemoModel(documents, config, parseErrors = [], registries)
197
204
  incoming,
198
205
  };
199
206
  }
207
+ function applySemanticProvenance(elements, relationships, registries) {
208
+ const table = registries?.provenance;
209
+ if (!table)
210
+ return;
211
+ const entryFor = (kind) => registries?.kindRegistry?.getKind(kind)
212
+ ?? registries?.kindRegistry?.getKind(kind.split('::').pop() ?? kind);
213
+ const classifierFor = (kind) => {
214
+ const entry = entryFor(kind);
215
+ if (!entry?.qualifiedName)
216
+ return undefined;
217
+ return {
218
+ qualifiedName: entry.qualifiedName,
219
+ shortName: entry.name,
220
+ provenance: entry.sourceFile ? table.lookup(entry.sourceFile) : undefined,
221
+ };
222
+ };
223
+ const classifierChainFor = (kind) => {
224
+ const chain = [];
225
+ const seen = new Set();
226
+ let entry = entryFor(kind);
227
+ while (entry?.qualifiedName && !seen.has(entry.qualifiedName)) {
228
+ seen.add(entry.qualifiedName);
229
+ chain.push({
230
+ qualifiedName: entry.qualifiedName,
231
+ shortName: entry.name,
232
+ provenance: entry.sourceFile ? table.lookup(entry.sourceFile) : undefined,
233
+ });
234
+ entry = entry.superType ? entryFor(entry.superType) : undefined;
235
+ }
236
+ return chain.length > 0 ? chain : undefined;
237
+ };
238
+ const declarationFor = (file, kind) => ({
239
+ declaration: table.lookupOrProject(file),
240
+ classifier: kind ? classifierFor(kind) : undefined,
241
+ classifierChain: kind ? classifierChainFor(kind) : undefined,
242
+ });
243
+ for (const element of elements.values()) {
244
+ element.provenance = declarationFor(element.file, element.kind);
245
+ }
246
+ for (const relationship of relationships) {
247
+ relationship.provenance = declarationFor(relationship.file, relationship.type);
248
+ }
249
+ }
200
250
  /**
201
251
  * Derive a UUID from source identity, rather than allocating a random value on
202
252
  * every compilation. This is the machine identity; `shortId` is the compact
@@ -269,6 +319,23 @@ function extractFromPackage(pkg, filePath, parentPackage, config, elements, defe
269
319
  packageName,
270
320
  });
271
321
  break;
322
+ case 'FlowConnectionUsage':
323
+ // A flow between two action usages declared side by side in a
324
+ // package has no enclosing action, so parentActionId is unset
325
+ // and the endpoints resolve against the package scope.
326
+ deferredFlows.push({
327
+ flow: member,
328
+ filePath,
329
+ packageName,
330
+ });
331
+ break;
332
+ case 'SuccessionUsage':
333
+ deferredSuccessions.push({
334
+ succession: member,
335
+ filePath,
336
+ packageName,
337
+ });
338
+ break;
272
339
  case 'AllocateUsage':
273
340
  deferredAllocates.push({
274
341
  allocate: member,
@@ -278,7 +345,7 @@ function extractFromPackage(pkg, filePath, parentPackage, config, elements, defe
278
345
  break;
279
346
  // ─── Definition members ─────────────────────────────────────
280
347
  case 'ActionDefinition':
281
- extractActionDefinition(member, filePath, packageName, config, elements, registry);
348
+ extractActionDefinition(member, filePath, packageName, config, elements, deferredFlows, deferredSuccessions, registry, registries);
282
349
  break;
283
350
  case 'ItemDefinition':
284
351
  extractItemDefinition(member, filePath, packageName, config, elements, registry, registries);
@@ -312,13 +379,21 @@ function extractUsage(usage, construct, filePath, packageName, config, elements,
312
379
  continue;
313
380
  const pm = member;
314
381
  if (pm.boundRef && pm.name) {
382
+ // Two shapes land here. `part viewpointDefinition :> vp;` names the
383
+ // feature in `name` and the value in `boundRef`. The subsetting
384
+ // form for a multi-valued feature —
385
+ // `part vpLogical :> viewpointDefinition = someViewpoint;` — puts
386
+ // the FEATURE in `boundRef` and the value in `subsetValue`, and its
387
+ // member name is arbitrary. Attribute it to the feature it subsets,
388
+ // or a view governed by three viewpoints would surface as three
389
+ // unrelated attributes nothing reads.
390
+ const key = pm.subsetValue ? pm.boundRef : pm.name;
391
+ const value = pm.subsetValue ?? pm.boundRef;
315
392
  // A feature with multiplicity may be rebound more than once. Keep
316
393
  // every binding as a comma-separated value so view conformance can
317
394
  // model one view against several viewpoints without cloning it.
318
- const previous = attributes[pm.name];
319
- attributes[pm.name] = previous
320
- ? `${previous},${pm.boundRef}`
321
- : pm.boundRef;
395
+ const previous = attributes[key];
396
+ attributes[key] = previous ? `${previous},${value}` : value;
322
397
  }
323
398
  else if (pm.body && pm.name) {
324
399
  const nested = extractAttributes(pm.body);
@@ -343,11 +418,23 @@ function extractUsage(usage, construct, filePath, packageName, config, elements,
343
418
  // Port-specific fields
344
419
  if (construct === 'port') {
345
420
  const portNode = usage;
421
+ const directedItems = (usage.body || [])
422
+ .filter(member => member.$type === 'ItemUsage' && !!member.direction)
423
+ .map(member => member);
424
+ const itemDirections = new Set(directedItems.map(item => item.direction));
346
425
  element.portSpec = {
347
426
  type: portNode.type,
348
- direction: portNode.direction,
427
+ direction: (portNode.direction ?? (itemDirections.size === 1 ? directedItems[0]?.direction : undefined)),
349
428
  isConjugated: portNode.isConjugated ?? false,
350
429
  };
430
+ element.parameters = directedItems
431
+ .map(feature => {
432
+ return {
433
+ name: feature.name,
434
+ direction: feature.direction,
435
+ type: feature.type || 'Item',
436
+ };
437
+ });
351
438
  }
352
439
  elements.set(id, element);
353
440
  registry.registerElement(id, packageName);
@@ -355,18 +442,18 @@ function extractUsage(usage, construct, filePath, packageName, config, elements,
355
442
  /**
356
443
  * Extract an ActionDefinition as a MemoElement with parameters.
357
444
  */
358
- function extractActionDefinition(actionDef, filePath, packageName, config, elements, registry) {
445
+ function extractActionDefinition(actionDef, filePath, packageName, config, elements, deferredFlows, deferredSuccessions, registry, registries) {
359
446
  const id = actionDef.name;
360
447
  // Extract parameters from body
361
448
  const parameters = [];
362
449
  const bodyMembers = actionDef.body || [];
363
450
  for (const member of bodyMembers) {
364
- if (member.$type === 'ActionParameterMember') {
451
+ if (member.$type === 'ActionParameterMember' || (member.$type === 'ItemUsage' && member.direction)) {
365
452
  const param = member;
366
453
  parameters.push({
367
454
  name: param.name,
368
455
  direction: param.direction,
369
- type: param.type,
456
+ type: param.type || 'Item',
370
457
  });
371
458
  }
372
459
  }
@@ -388,6 +475,66 @@ function extractActionDefinition(actionDef, filePath, packageName, config, eleme
388
475
  };
389
476
  elements.set(id, element);
390
477
  registry.registerElement(id, packageName);
478
+ // Standard SysML activity bodies may contain action/control usages directly
479
+ // (not wrapped in an ActionUsage). Preserve those declarations so a valid
480
+ // activity diagram cannot collapse to its enclosing action alone.
481
+ // `previousStep` carries the member a `then` refers back to: in standard
482
+ // SysML a body member written `then action x ...` succeeds the step declared
483
+ // before it, with no `succession` usage naming either end.
484
+ let previousStep;
485
+ let terminateCount = 0;
486
+ for (const member of bodyMembers) {
487
+ let step;
488
+ if (member.$type === 'ActionUsage') {
489
+ extractActionUsage(member, filePath, packageName, config, elements, deferredFlows, deferredSuccessions, registry, registries, id);
490
+ step = member.name;
491
+ }
492
+ else if (member.$type === 'ControlNodeUsage') {
493
+ extractControlNode(member, filePath, packageName, elements, registry, id);
494
+ step = member.name;
495
+ }
496
+ else if (['AcceptActionUsage', 'SendActionUsage', 'DecisionNodeUsage', 'MergeNodeUsage', 'TerminateUsage'].includes(member.$type)) {
497
+ const node = member;
498
+ // A terminate node has no name to be given one by, and an id keyed
499
+ // on `elements.size` moves whenever anything else in the file does.
500
+ // Key it on the action that owns it instead, so a view can name it
501
+ // and a saved layout keeps pointing at the same node.
502
+ const fallback = node.$type === 'TerminateUsage'
503
+ ? `${id}__terminate${terminateCount++ === 0 ? '' : terminateCount}`
504
+ : `${node.$type}-${elements.size}`;
505
+ const nodeId = node.name ?? fallback;
506
+ step = nodeId;
507
+ extractStandardActivityNode(node, filePath, packageName, elements, registry, id, nodeId);
508
+ }
509
+ else if (member.$type === 'SuccessionUsage') {
510
+ deferredSuccessions.push({ succession: member, filePath, packageName, parentActionId: id });
511
+ }
512
+ if (step && member.followsPrevious && previousStep) {
513
+ deferredSuccessions.push({
514
+ succession: { steps: [{ ref: previousStep }, { ref: step }] },
515
+ filePath,
516
+ packageName,
517
+ parentActionId: id,
518
+ });
519
+ }
520
+ if (step)
521
+ previousStep = step;
522
+ }
523
+ }
524
+ function extractStandardActivityNode(node, filePath, packageName, elements, registry, parentActionId, id) {
525
+ const typeToKind = {
526
+ AcceptActionUsage: 'AcceptActionUsage', SendActionUsage: 'SendActionUsage',
527
+ DecisionNodeUsage: 'DecisionNodeUsage', MergeNodeUsage: 'MergeNodeUsage', TerminateUsage: 'ActivityFinalNodeUsage',
528
+ };
529
+ const parameters = node.$type === 'AcceptActionUsage' && node.payloadName
530
+ ? [{ name: node.payloadName, direction: 'out', type: node.payloadType ?? 'Item' }]
531
+ : undefined;
532
+ elements.set(id, {
533
+ id, name: node.name ?? node.$type, kind: typeToKind[node.$type] ?? node.$type,
534
+ construct: 'action', layer: 'behavior', file: filePath, package: packageName || undefined,
535
+ attributes: { ...(node.payloadName ? { payloadName: node.payloadName } : {}), ...(node.payloadType ? { payloadType: node.payloadType } : {}) }, parentAction: parentActionId, parameters,
536
+ });
537
+ registry.registerElement(id, packageName);
391
538
  }
392
539
  /**
393
540
  * Extract an ItemDefinition as a MemoElement.
@@ -482,6 +629,9 @@ function extractActionUsage(usage, filePath, packageName, config, elements, defe
482
629
  attributes,
483
630
  doc,
484
631
  parentAction: parentActionId,
632
+ parameters: bodyMembers
633
+ .filter(member => member.$type === 'ActionParameterMember')
634
+ .map(member => ({ name: member.name, direction: member.direction, type: member.type || 'Item' })),
485
635
  };
486
636
  elements.set(id, element);
487
637
  registry.registerElement(id, packageName);
@@ -515,18 +665,22 @@ function extractActionUsage(usage, filePath, packageName, config, elements, defe
515
665
  }
516
666
  }
517
667
  /**
518
- * Extract a fork/join control node. Modeled as a behavior-layer element with
668
+ * Extract a control node. Modeled as a behavior-layer element with
519
669
  * `construct: 'action'` so it participates in succession ordering and swimlane
520
- * layout like any other flow step, but carries a distinct kind
521
- * (`ForkNode` / `JoinNode`) and a `controlKind` attribute so renderers draw it
522
- * as a synchronization bar rather than an action card.
670
+ * layout like any other flow step, but carries the metaclass its `controlKind`
671
+ * names and a `controlKind` attribute, so renderers draw the right symbol —
672
+ * a bar for fork/join, a diamond for decide/merge.
673
+ *
674
+ * The kind comes from `CONTROL_KIND_METACLASS`, the same binding
675
+ * `activityNodeType` classifies by; a second mapping here is how `decide` and
676
+ * `merge` came to be stored as `JoinNode`.
523
677
  */
524
678
  function extractControlNode(node, filePath, packageName, elements, registry, parentActionId) {
525
679
  const id = node.name;
526
- const kind = node.controlKind === 'fork' ? 'ForkNode' : 'JoinNode';
680
+ const kind = CONTROL_KIND_METACLASS[node.controlKind];
527
681
  elements.set(id, {
528
682
  id,
529
- name: node.controlKind,
683
+ name: node.name,
530
684
  kind,
531
685
  construct: 'action',
532
686
  layer: 'behavior',
@@ -630,11 +784,12 @@ function resolveSuccession(succession, filePath, packageName, parentActionId, re
630
784
  const targetKnown = toRef === 'done' || allElementIds.has(targetId);
631
785
  if (!sourceKnown || !targetKnown)
632
786
  continue;
787
+ const guardLabel = renderGuardExpression(steps[i].guard);
633
788
  const rel = {
634
789
  id: `rel-${++relationshipCounter}`,
635
790
  type: 'succession',
636
791
  sourceId,
637
- sourceEnd: '',
792
+ sourceEnd: guardLabel === undefined ? '' : `[${guardLabel}]`,
638
793
  targetId,
639
794
  targetEnd: '',
640
795
  file: filePath,
@@ -642,6 +797,44 @@ function resolveSuccession(succession, filePath, packageName, parentActionId, re
642
797
  relationships.push(rel);
643
798
  }
644
799
  }
800
+ /**
801
+ * Preserve a SysML succession guard as readable diagram text.
802
+ *
803
+ * Guards use the same expression AST as constraints. Previously only literal
804
+ * `true`/`false` nodes happened to carry one of the three fields inspected by
805
+ * the builder, so a valid guard such as `validUser == true` silently vanished
806
+ * during lowering even though SysIDE accepted it.
807
+ */
808
+ function renderGuardExpression(expr) {
809
+ if (!expr)
810
+ return undefined;
811
+ switch (expr.$type) {
812
+ case 'LiteralExpr':
813
+ return expr.boolValue ?? expr.intValue ?? expr.strValue;
814
+ case 'FeatureChain':
815
+ return Array.isArray(expr.segments) ? expr.segments.join('.') : undefined;
816
+ case 'UnaryExpr': {
817
+ const operand = renderGuardExpression(expr.operand);
818
+ return operand === undefined ? undefined : `${expr.op} ${operand}`;
819
+ }
820
+ case 'BinaryExpr': {
821
+ const left = renderGuardExpression(expr.left);
822
+ const right = renderGuardExpression(expr.right);
823
+ return left === undefined || right === undefined
824
+ ? undefined
825
+ : `${left} ${expr.op} ${right}`;
826
+ }
827
+ case 'CollectionOp': {
828
+ const target = renderGuardExpression(expr.target);
829
+ const argument = renderGuardExpression(expr.argument);
830
+ if (target === undefined)
831
+ return undefined;
832
+ return `${target}->${expr.op}(${argument ?? ''})`;
833
+ }
834
+ default:
835
+ return expr.text ?? expr.value;
836
+ }
837
+ }
645
838
  /**
646
839
  * Resolve an allocate usage into a MemoRelationship and set allocatedTo on the element.
647
840
  */
@@ -685,6 +878,17 @@ function extractAttributes(body) {
685
878
  else if (attr.type) {
686
879
  attrs[attr.name] = `<${attr.type}>`;
687
880
  }
881
+ else if (attr.body?.length) {
882
+ // Structured value: the members of an `attribute def` assigned
883
+ // inline, e.g. `attribute :>> bounds { attribute :>> x = 0.1; }`.
884
+ // Flattened to dotted keys ("bounds.x") so the value lands in
885
+ // the same flat map every consumer already reads. Without this
886
+ // branch the whole assignment is dropped and the model carries
887
+ // no record of it.
888
+ for (const [key, value] of Object.entries(extractAttributes(attr.body))) {
889
+ attrs[`${attr.name}.${key}`] = value;
890
+ }
891
+ }
688
892
  }
689
893
  }
690
894
  return attrs;
@@ -742,7 +946,15 @@ function resolveRef(ref) {
742
946
  * are registered under their leaf name, so when the full reference is not a
743
947
  * known element id, resolve its last dot segment instead.
744
948
  */
745
- function resolveEndpointId(ref, packageName, registry, allElementIds) {
949
+ function resolveEndpointId(
950
+ // An endpoint can parse without a reference — the Release examples contain
951
+ // connection forms the MEMO grammar accepts structurally but cannot bind.
952
+ // An unresolvable endpoint drops the relationship at the call site, which
953
+ // is the same outcome as any other unresolved reference; crashing the whole
954
+ // build over it is not (§1.1 — the compiler reports, it does not refuse).
955
+ ref, packageName, registry, allElementIds) {
956
+ if (!ref)
957
+ return undefined;
746
958
  const direct = registry.resolveElementId(ref, packageName, allElementIds) || resolveRef(ref);
747
959
  if (direct && allElementIds.has(direct))
748
960
  return direct;