@memoarchitect/tools 0.13.2 → 0.15.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (825) 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 +333 -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 +2 -0
  376. package/packages/tools/lib/model/short-id.d.ts.map +1 -1
  377. package/packages/tools/lib/model/short-id.js +9 -0
  378. package/packages/tools/lib/model/short-id.js.map +1 -1
  379. package/packages/tools/lib/model/source-graph.d.ts +9 -7
  380. package/packages/tools/lib/model/source-graph.d.ts.map +1 -1
  381. package/packages/tools/lib/model/source-graph.js +19 -24
  382. package/packages/tools/lib/model/source-graph.js.map +1 -1
  383. package/packages/tools/lib/model/source-provenance.d.ts +5 -1
  384. package/packages/tools/lib/model/source-provenance.d.ts.map +1 -1
  385. package/packages/tools/lib/model/source-provenance.js.map +1 -1
  386. package/packages/tools/lib/model/sysml-files.js +1 -1
  387. package/packages/tools/lib/model/sysml-ir.d.ts +2 -5
  388. package/packages/tools/lib/model/sysml-ir.d.ts.map +1 -1
  389. package/packages/tools/lib/model/sysml-ir.js +1 -100
  390. package/packages/tools/lib/model/sysml-ir.js.map +1 -1
  391. package/packages/tools/lib/model/toolchain-merge.d.ts +4 -0
  392. package/packages/tools/lib/model/toolchain-merge.d.ts.map +1 -0
  393. package/packages/tools/lib/model/toolchain-merge.js +34 -0
  394. package/packages/tools/lib/model/toolchain-merge.js.map +1 -0
  395. package/packages/tools/lib/model/user-settings.d.ts +13 -0
  396. package/packages/tools/lib/model/user-settings.d.ts.map +1 -0
  397. package/packages/tools/lib/model/user-settings.js +83 -0
  398. package/packages/tools/lib/model/user-settings.js.map +1 -0
  399. package/packages/tools/lib/model/variability.d.ts +56 -0
  400. package/packages/tools/lib/model/variability.d.ts.map +1 -0
  401. package/packages/tools/lib/model/variability.js +116 -0
  402. package/packages/tools/lib/model/variability.js.map +1 -0
  403. package/packages/tools/lib/model/version-range.d.ts +2 -0
  404. package/packages/tools/lib/model/version-range.d.ts.map +1 -0
  405. package/packages/tools/lib/model/version-range.js +37 -0
  406. package/packages/tools/lib/model/version-range.js.map +1 -0
  407. package/packages/tools/lib/model/view-deriver.d.ts +16 -0
  408. package/packages/tools/lib/model/view-deriver.d.ts.map +1 -1
  409. package/packages/tools/lib/model/view-deriver.js +100 -26
  410. package/packages/tools/lib/model/view-deriver.js.map +1 -1
  411. package/packages/tools/lib/model/view-layout-block.d.ts +81 -0
  412. package/packages/tools/lib/model/view-layout-block.d.ts.map +1 -0
  413. package/packages/tools/lib/model/view-layout-block.js +525 -0
  414. package/packages/tools/lib/model/view-layout-block.js.map +1 -0
  415. package/packages/tools/lib/model/view-layout-migration.d.ts +54 -0
  416. package/packages/tools/lib/model/view-layout-migration.d.ts.map +1 -0
  417. package/packages/tools/lib/model/view-layout-migration.js +156 -0
  418. package/packages/tools/lib/model/view-layout-migration.js.map +1 -0
  419. package/packages/tools/lib/model/workspace-membership.d.ts +99 -0
  420. package/packages/tools/lib/model/workspace-membership.d.ts.map +1 -0
  421. package/packages/tools/lib/model/workspace-membership.js +281 -0
  422. package/packages/tools/lib/model/workspace-membership.js.map +1 -0
  423. package/packages/tools/lib/ontology/owl-exporter.d.ts +1 -1
  424. package/packages/tools/lib/ontology/owl-exporter.d.ts.map +1 -1
  425. package/packages/tools/lib/ontology/owl-exporter.js +1 -1
  426. package/packages/tools/lib/ontology/owl-exporter.js.map +1 -1
  427. package/packages/tools/lib/operations/ai-authoring.d.ts.map +1 -1
  428. package/packages/tools/lib/operations/ai-authoring.js +7 -5
  429. package/packages/tools/lib/operations/ai-authoring.js.map +1 -1
  430. package/packages/tools/lib/operations/authoring.d.ts +10 -4
  431. package/packages/tools/lib/operations/authoring.d.ts.map +1 -1
  432. package/packages/tools/lib/operations/authoring.js +27 -11
  433. package/packages/tools/lib/operations/authoring.js.map +1 -1
  434. package/packages/tools/lib/operations/index.d.ts +2 -0
  435. package/packages/tools/lib/operations/index.d.ts.map +1 -1
  436. package/packages/tools/lib/operations/index.js +1 -0
  437. package/packages/tools/lib/operations/index.js.map +1 -1
  438. package/packages/tools/lib/operations/project-snapshot.d.ts.map +1 -1
  439. package/packages/tools/lib/operations/project-snapshot.js +7 -13
  440. package/packages/tools/lib/operations/project-snapshot.js.map +1 -1
  441. package/packages/tools/lib/plugin/plugin-scaffold.js +2 -2
  442. package/packages/tools/lib/plugin/plugin-scaffold.js.map +1 -1
  443. package/packages/tools/lib/protocol/messages.d.ts +375 -7
  444. package/packages/tools/lib/protocol/messages.d.ts.map +1 -1
  445. package/packages/tools/lib/serializer/csv-io.d.ts +37 -29
  446. package/packages/tools/lib/serializer/csv-io.d.ts.map +1 -1
  447. package/packages/tools/lib/serializer/csv-io.js +64 -31
  448. package/packages/tools/lib/serializer/csv-io.js.map +1 -1
  449. package/packages/tools/lib/serializer/sysml-generator.d.ts +15 -2
  450. package/packages/tools/lib/serializer/sysml-generator.d.ts.map +1 -1
  451. package/packages/tools/lib/serializer/sysml-generator.js +45 -17
  452. package/packages/tools/lib/serializer/sysml-generator.js.map +1 -1
  453. package/packages/tools/lib/server/conflict-policy.js +1 -1
  454. package/packages/tools/lib/server/conflict-policy.js.map +1 -1
  455. package/packages/tools/lib/server/dashboard-store.d.ts +1 -7
  456. package/packages/tools/lib/server/dashboard-store.d.ts.map +1 -1
  457. package/packages/tools/lib/server/dashboard-store.js +3 -14
  458. package/packages/tools/lib/server/dashboard-store.js.map +1 -1
  459. package/packages/tools/lib/server/dev-server.d.ts +48 -1
  460. package/packages/tools/lib/server/dev-server.d.ts.map +1 -1
  461. package/packages/tools/lib/server/dev-server.js +529 -80
  462. package/packages/tools/lib/server/dev-server.js.map +1 -1
  463. package/packages/tools/lib/server/dev-validate.d.ts +30 -0
  464. package/packages/tools/lib/server/dev-validate.d.ts.map +1 -0
  465. package/packages/tools/lib/server/dev-validate.js +82 -0
  466. package/packages/tools/lib/server/dev-validate.js.map +1 -0
  467. package/packages/tools/lib/server/element-writer.d.ts +4 -1
  468. package/packages/tools/lib/server/element-writer.d.ts.map +1 -1
  469. package/packages/tools/lib/server/element-writer.js +56 -35
  470. package/packages/tools/lib/server/element-writer.js.map +1 -1
  471. package/packages/tools/lib/server/mutation-domain.d.ts +10 -0
  472. package/packages/tools/lib/server/mutation-domain.d.ts.map +1 -1
  473. package/packages/tools/lib/server/mutation-domain.js +45 -8
  474. package/packages/tools/lib/server/mutation-domain.js.map +1 -1
  475. package/packages/tools/lib/server/package-source.d.ts +13 -3
  476. package/packages/tools/lib/server/package-source.d.ts.map +1 -1
  477. package/packages/tools/lib/server/package-source.js +31 -39
  478. package/packages/tools/lib/server/package-source.js.map +1 -1
  479. package/packages/tools/lib/server/package-writer.d.ts +19 -6
  480. package/packages/tools/lib/server/package-writer.d.ts.map +1 -1
  481. package/packages/tools/lib/server/package-writer.js +90 -39
  482. package/packages/tools/lib/server/package-writer.js.map +1 -1
  483. package/packages/tools/lib/server/persistor.d.ts +33 -7
  484. package/packages/tools/lib/server/persistor.d.ts.map +1 -1
  485. package/packages/tools/lib/server/persistor.js +63 -48
  486. package/packages/tools/lib/server/persistor.js.map +1 -1
  487. package/packages/tools/lib/server/project-gitignore.d.ts +9 -0
  488. package/packages/tools/lib/server/project-gitignore.d.ts.map +1 -0
  489. package/packages/tools/lib/server/project-gitignore.js +27 -0
  490. package/packages/tools/lib/server/project-gitignore.js.map +1 -0
  491. package/packages/tools/lib/server/relationship-writer.d.ts +31 -2
  492. package/packages/tools/lib/server/relationship-writer.d.ts.map +1 -1
  493. package/packages/tools/lib/server/relationship-writer.js +255 -95
  494. package/packages/tools/lib/server/relationship-writer.js.map +1 -1
  495. package/packages/tools/lib/server/release-writer.d.ts +46 -0
  496. package/packages/tools/lib/server/release-writer.d.ts.map +1 -0
  497. package/packages/tools/lib/server/release-writer.js +133 -0
  498. package/packages/tools/lib/server/release-writer.js.map +1 -0
  499. package/packages/tools/lib/server/rule-policy-writer.d.ts +17 -4
  500. package/packages/tools/lib/server/rule-policy-writer.d.ts.map +1 -1
  501. package/packages/tools/lib/server/rule-policy-writer.js +92 -7
  502. package/packages/tools/lib/server/rule-policy-writer.js.map +1 -1
  503. package/packages/tools/lib/server/rule-service.d.ts +50 -0
  504. package/packages/tools/lib/server/rule-service.d.ts.map +1 -0
  505. package/packages/tools/lib/server/rule-service.js +89 -0
  506. package/packages/tools/lib/server/rule-service.js.map +1 -0
  507. package/packages/tools/lib/server/rule-writer.d.ts +87 -0
  508. package/packages/tools/lib/server/rule-writer.d.ts.map +1 -0
  509. package/packages/tools/lib/server/rule-writer.js +165 -0
  510. package/packages/tools/lib/server/rule-writer.js.map +1 -0
  511. package/packages/tools/lib/server/suspect-review.d.ts +11 -0
  512. package/packages/tools/lib/server/suspect-review.d.ts.map +1 -0
  513. package/packages/tools/lib/server/suspect-review.js +28 -0
  514. package/packages/tools/lib/server/suspect-review.js.map +1 -0
  515. package/packages/tools/lib/server/sysml-notation.d.ts +1 -1
  516. package/packages/tools/lib/server/sysml-notation.d.ts.map +1 -1
  517. package/packages/tools/lib/server/sysml-notation.js +5 -0
  518. package/packages/tools/lib/server/sysml-notation.js.map +1 -1
  519. package/packages/tools/lib/server/user-preferences.d.ts +8 -0
  520. package/packages/tools/lib/server/user-preferences.d.ts.map +1 -0
  521. package/packages/tools/lib/server/user-preferences.js +47 -0
  522. package/packages/tools/lib/server/user-preferences.js.map +1 -0
  523. package/packages/tools/lib/server/version-servers.d.ts +60 -0
  524. package/packages/tools/lib/server/version-servers.d.ts.map +1 -0
  525. package/packages/tools/lib/server/version-servers.js +106 -0
  526. package/packages/tools/lib/server/version-servers.js.map +1 -0
  527. package/packages/tools/lib/server/view-layout-store.d.ts +28 -13
  528. package/packages/tools/lib/server/view-layout-store.d.ts.map +1 -1
  529. package/packages/tools/lib/server/view-layout-store.js +106 -106
  530. package/packages/tools/lib/server/view-layout-store.js.map +1 -1
  531. package/packages/tools/lib/server/view-writer.d.ts +22 -2
  532. package/packages/tools/lib/server/view-writer.d.ts.map +1 -1
  533. package/packages/tools/lib/server/view-writer.js +99 -44
  534. package/packages/tools/lib/server/view-writer.js.map +1 -1
  535. package/packages/tools/lib/server/write-guard.d.ts +7 -0
  536. package/packages/tools/lib/server/write-guard.d.ts.map +1 -0
  537. package/packages/tools/lib/server/write-guard.js +77 -0
  538. package/packages/tools/lib/server/write-guard.js.map +1 -0
  539. package/packages/tools/lib/stage2/api-model.d.ts +160 -0
  540. package/packages/tools/lib/stage2/api-model.d.ts.map +1 -0
  541. package/packages/tools/lib/stage2/api-model.js +341 -0
  542. package/packages/tools/lib/stage2/api-model.js.map +1 -0
  543. package/packages/tools/lib/stage2/build-from-api.d.ts +47 -0
  544. package/packages/tools/lib/stage2/build-from-api.d.ts.map +1 -0
  545. package/packages/tools/lib/stage2/build-from-api.js +1462 -0
  546. package/packages/tools/lib/stage2/build-from-api.js.map +1 -0
  547. package/packages/tools/lib/stage2/guide-from-api.d.ts +38 -0
  548. package/packages/tools/lib/stage2/guide-from-api.d.ts.map +1 -0
  549. package/packages/tools/lib/stage2/guide-from-api.js +97 -0
  550. package/packages/tools/lib/stage2/guide-from-api.js.map +1 -0
  551. package/packages/tools/lib/stage2/handoff-files.d.ts +13 -0
  552. package/packages/tools/lib/stage2/handoff-files.d.ts.map +1 -0
  553. package/packages/tools/lib/stage2/handoff-files.js +32 -0
  554. package/packages/tools/lib/stage2/handoff-files.js.map +1 -0
  555. package/packages/tools/lib/stage2/methodology-from-api.d.ts +10 -0
  556. package/packages/tools/lib/stage2/methodology-from-api.d.ts.map +1 -0
  557. package/packages/tools/lib/stage2/methodology-from-api.js +109 -0
  558. package/packages/tools/lib/stage2/methodology-from-api.js.map +1 -0
  559. package/packages/tools/lib/stage2/package-metadata-from-api.d.ts +15 -0
  560. package/packages/tools/lib/stage2/package-metadata-from-api.d.ts.map +1 -0
  561. package/packages/tools/lib/stage2/package-metadata-from-api.js +238 -0
  562. package/packages/tools/lib/stage2/package-metadata-from-api.js.map +1 -0
  563. package/packages/tools/lib/stage2/project-from-api.d.ts +60 -0
  564. package/packages/tools/lib/stage2/project-from-api.d.ts.map +1 -0
  565. package/packages/tools/lib/stage2/project-from-api.js +328 -0
  566. package/packages/tools/lib/stage2/project-from-api.js.map +1 -0
  567. package/packages/tools/lib/stage2/registries-from-api.d.ts +68 -0
  568. package/packages/tools/lib/stage2/registries-from-api.d.ts.map +1 -0
  569. package/packages/tools/lib/stage2/registries-from-api.js +313 -0
  570. package/packages/tools/lib/stage2/registries-from-api.js.map +1 -0
  571. package/packages/tools/lib/stage2/stage2-from-handoff.d.ts +26 -0
  572. package/packages/tools/lib/stage2/stage2-from-handoff.d.ts.map +1 -0
  573. package/packages/tools/lib/stage2/stage2-from-handoff.js +34 -0
  574. package/packages/tools/lib/stage2/stage2-from-handoff.js.map +1 -0
  575. package/packages/tools/lib/stage2/sysml-names.d.ts +9 -0
  576. package/packages/tools/lib/stage2/sysml-names.d.ts.map +1 -0
  577. package/packages/tools/lib/stage2/sysml-names.js +39 -0
  578. package/packages/tools/lib/stage2/sysml-names.js.map +1 -0
  579. package/packages/tools/lib/toolchain/default-registry.d.ts +2 -2
  580. package/packages/tools/lib/toolchain/default-registry.d.ts.map +1 -1
  581. package/packages/tools/lib/toolchain/default-registry.js +9 -5
  582. package/packages/tools/lib/toolchain/default-registry.js.map +1 -1
  583. package/packages/tools/lib/toolchain/diagnostic.d.ts +2 -2
  584. package/packages/tools/lib/toolchain/diagnostic.js +1 -1
  585. package/packages/tools/lib/toolchain/diagnostic.js.map +1 -1
  586. package/packages/tools/lib/toolchain/effective.d.ts +25 -17
  587. package/packages/tools/lib/toolchain/effective.d.ts.map +1 -1
  588. package/packages/tools/lib/toolchain/effective.js +45 -40
  589. package/packages/tools/lib/toolchain/effective.js.map +1 -1
  590. package/packages/tools/lib/toolchain/exceptions.d.ts +27 -0
  591. package/packages/tools/lib/toolchain/exceptions.d.ts.map +1 -0
  592. package/packages/tools/lib/toolchain/exceptions.js +77 -0
  593. package/packages/tools/lib/toolchain/exceptions.js.map +1 -0
  594. package/packages/tools/lib/toolchain/index.d.ts +2 -2
  595. package/packages/tools/lib/toolchain/index.d.ts.map +1 -1
  596. package/packages/tools/lib/toolchain/index.js +2 -2
  597. package/packages/tools/lib/toolchain/index.js.map +1 -1
  598. package/packages/tools/lib/toolchain/operations.d.ts +45 -10
  599. package/packages/tools/lib/toolchain/operations.d.ts.map +1 -1
  600. package/packages/tools/lib/toolchain/operations.js +107 -8
  601. package/packages/tools/lib/toolchain/operations.js.map +1 -1
  602. package/packages/tools/lib/toolchain/ownership.d.ts +13 -0
  603. package/packages/tools/lib/toolchain/ownership.d.ts.map +1 -0
  604. package/packages/tools/lib/toolchain/ownership.js +57 -0
  605. package/packages/tools/lib/toolchain/ownership.js.map +1 -0
  606. package/packages/tools/lib/toolchain/process.d.ts +2 -2
  607. package/packages/tools/lib/toolchain/process.js +2 -2
  608. package/packages/tools/lib/toolchain/project-config.d.ts +4 -0
  609. package/packages/tools/lib/toolchain/project-config.d.ts.map +1 -0
  610. package/packages/tools/lib/toolchain/project-config.js +13 -0
  611. package/packages/tools/lib/toolchain/project-config.js.map +1 -0
  612. package/packages/tools/lib/toolchain/project-model.d.ts +75 -0
  613. package/packages/tools/lib/toolchain/project-model.d.ts.map +1 -0
  614. package/packages/tools/lib/toolchain/project-model.js +92 -0
  615. package/packages/tools/lib/toolchain/project-model.js.map +1 -0
  616. package/packages/tools/lib/toolchain/providers/internal-package.d.ts +6 -0
  617. package/packages/tools/lib/toolchain/providers/internal-package.d.ts.map +1 -0
  618. package/packages/tools/lib/toolchain/providers/internal-package.js +47 -0
  619. package/packages/tools/lib/toolchain/providers/internal-package.js.map +1 -0
  620. package/packages/tools/lib/toolchain/providers/opensysml-check.d.ts +20 -0
  621. package/packages/tools/lib/toolchain/providers/opensysml-check.d.ts.map +1 -0
  622. package/packages/tools/lib/toolchain/providers/opensysml-check.js +95 -0
  623. package/packages/tools/lib/toolchain/providers/opensysml-check.js.map +1 -0
  624. package/packages/tools/lib/toolchain/providers/opensysml-compact.d.ts +17 -0
  625. package/packages/tools/lib/toolchain/providers/opensysml-compact.d.ts.map +1 -0
  626. package/packages/tools/lib/toolchain/providers/opensysml-compact.js +69 -0
  627. package/packages/tools/lib/toolchain/providers/opensysml-compact.js.map +1 -0
  628. package/packages/tools/lib/toolchain/providers/opensysml-lowering.d.ts +50 -0
  629. package/packages/tools/lib/toolchain/providers/opensysml-lowering.d.ts.map +1 -0
  630. package/packages/tools/lib/toolchain/providers/opensysml-lowering.js +646 -0
  631. package/packages/tools/lib/toolchain/providers/opensysml-lowering.js.map +1 -0
  632. package/packages/tools/lib/toolchain/providers/opensysml-names.d.ts +16 -0
  633. package/packages/tools/lib/toolchain/providers/opensysml-names.d.ts.map +1 -0
  634. package/packages/tools/lib/toolchain/providers/opensysml-names.js +37 -0
  635. package/packages/tools/lib/toolchain/providers/opensysml-names.js.map +1 -0
  636. package/packages/tools/lib/toolchain/providers/opensysml.d.ts +88 -0
  637. package/packages/tools/lib/toolchain/providers/opensysml.d.ts.map +1 -0
  638. package/packages/tools/lib/toolchain/providers/opensysml.js +178 -0
  639. package/packages/tools/lib/toolchain/providers/opensysml.js.map +1 -0
  640. package/packages/tools/lib/toolchain/providers/recommended.d.ts +2 -0
  641. package/packages/tools/lib/toolchain/providers/recommended.d.ts.map +1 -0
  642. package/packages/tools/lib/toolchain/providers/recommended.js +13 -0
  643. package/packages/tools/lib/toolchain/providers/recommended.js.map +1 -0
  644. package/packages/tools/lib/toolchain/providers/sysand-project.d.ts +60 -0
  645. package/packages/tools/lib/toolchain/providers/sysand-project.d.ts.map +1 -0
  646. package/packages/tools/lib/toolchain/providers/sysand-project.js +160 -0
  647. package/packages/tools/lib/toolchain/providers/sysand-project.js.map +1 -0
  648. package/packages/tools/lib/toolchain/providers/sysand.d.ts.map +1 -1
  649. package/packages/tools/lib/toolchain/providers/sysand.js +26 -2
  650. package/packages/tools/lib/toolchain/providers/sysand.js.map +1 -1
  651. package/packages/tools/lib/toolchain/providers/syside-lowering.d.ts +29 -0
  652. package/packages/tools/lib/toolchain/providers/syside-lowering.d.ts.map +1 -0
  653. package/packages/tools/lib/toolchain/providers/syside-lowering.js +497 -0
  654. package/packages/tools/lib/toolchain/providers/syside-lowering.js.map +1 -0
  655. package/packages/tools/lib/toolchain/providers/syside-python.d.ts +9 -0
  656. package/packages/tools/lib/toolchain/providers/syside-python.d.ts.map +1 -0
  657. package/packages/tools/lib/toolchain/providers/syside-python.js +69 -0
  658. package/packages/tools/lib/toolchain/providers/syside-python.js.map +1 -0
  659. package/packages/tools/lib/toolchain/providers/syside.d.ts.map +1 -1
  660. package/packages/tools/lib/toolchain/providers/syside.js +2 -0
  661. package/packages/tools/lib/toolchain/providers/syside.js.map +1 -1
  662. package/packages/tools/lib/toolchain/registry.d.ts +118 -21
  663. package/packages/tools/lib/toolchain/registry.d.ts.map +1 -1
  664. package/packages/tools/lib/toolchain/registry.js +18 -24
  665. package/packages/tools/lib/toolchain/registry.js.map +1 -1
  666. package/packages/tools/lib/toolchain/schema.d.ts +6 -5
  667. package/packages/tools/lib/toolchain/schema.d.ts.map +1 -1
  668. package/packages/tools/lib/toolchain/schema.js +8 -13
  669. package/packages/tools/lib/toolchain/schema.js.map +1 -1
  670. package/packages/tools/lib/toolchain/shipped-library.d.ts +28 -0
  671. package/packages/tools/lib/toolchain/shipped-library.d.ts.map +1 -0
  672. package/packages/tools/lib/toolchain/shipped-library.js +120 -0
  673. package/packages/tools/lib/toolchain/shipped-library.js.map +1 -0
  674. package/packages/tools/lib/toolchain/source-fingerprint.d.ts +2 -0
  675. package/packages/tools/lib/toolchain/source-fingerprint.d.ts.map +1 -0
  676. package/packages/tools/lib/toolchain/source-fingerprint.js +30 -0
  677. package/packages/tools/lib/toolchain/source-fingerprint.js.map +1 -0
  678. package/packages/tools/lib/toolchain/user-settings-status.d.ts +51 -0
  679. package/packages/tools/lib/toolchain/user-settings-status.d.ts.map +1 -0
  680. package/packages/tools/lib/toolchain/user-settings-status.js +104 -0
  681. package/packages/tools/lib/toolchain/user-settings-status.js.map +1 -0
  682. package/packages/tools/lib/validator/architecture-validator.d.ts.map +1 -1
  683. package/packages/tools/lib/validator/architecture-validator.js +2 -1
  684. package/packages/tools/lib/validator/architecture-validator.js.map +1 -1
  685. package/packages/tools/lib/validator/behavior-validator.js +1 -1
  686. package/packages/tools/lib/validator/behavior-validator.js.map +1 -1
  687. package/packages/tools/lib/validator/builtin-rules.js +1 -1
  688. package/packages/tools/lib/validator/builtin-rules.js.map +1 -1
  689. package/packages/tools/lib/validator/constraint-eval.d.ts +30 -4
  690. package/packages/tools/lib/validator/constraint-eval.d.ts.map +1 -1
  691. package/packages/tools/lib/validator/constraint-eval.js +101 -59
  692. package/packages/tools/lib/validator/constraint-eval.js.map +1 -1
  693. package/packages/tools/lib/validator/constraint-loader-api.d.ts +22 -0
  694. package/packages/tools/lib/validator/constraint-loader-api.d.ts.map +1 -0
  695. package/packages/tools/lib/validator/constraint-loader-api.js +160 -0
  696. package/packages/tools/lib/validator/constraint-loader-api.js.map +1 -0
  697. package/packages/tools/lib/validator/constraint-loader.d.ts +22 -18
  698. package/packages/tools/lib/validator/constraint-loader.d.ts.map +1 -1
  699. package/packages/tools/lib/validator/constraint-loader.js +33 -141
  700. package/packages/tools/lib/validator/constraint-loader.js.map +1 -1
  701. package/packages/tools/lib/validator/rule-clauses.d.ts +51 -0
  702. package/packages/tools/lib/validator/rule-clauses.d.ts.map +1 -0
  703. package/packages/tools/lib/validator/rule-clauses.js +87 -0
  704. package/packages/tools/lib/validator/rule-clauses.js.map +1 -0
  705. package/packages/tools/lib/validator/rule-engine.d.ts +9 -1
  706. package/packages/tools/lib/validator/rule-engine.d.ts.map +1 -1
  707. package/packages/tools/lib/validator/rule-engine.js +50 -6
  708. package/packages/tools/lib/validator/rule-engine.js.map +1 -1
  709. package/packages/tools/lib/validator/rule-registry.d.ts +4 -8
  710. package/packages/tools/lib/validator/rule-registry.d.ts.map +1 -1
  711. package/packages/tools/lib/validator/rule-registry.js +42 -79
  712. package/packages/tools/lib/validator/rule-registry.js.map +1 -1
  713. package/packages/tools/lib/validator/rule-tailoring.d.ts +62 -0
  714. package/packages/tools/lib/validator/rule-tailoring.d.ts.map +1 -0
  715. package/packages/tools/lib/validator/rule-tailoring.js +85 -0
  716. package/packages/tools/lib/validator/rule-tailoring.js.map +1 -0
  717. package/packages/tools/lib/validator/types.d.ts +12 -1
  718. package/packages/tools/lib/validator/types.d.ts.map +1 -1
  719. package/packages/tools/lib/validator/workspace-boundary-validator.d.ts +9 -0
  720. package/packages/tools/lib/validator/workspace-boundary-validator.d.ts.map +1 -0
  721. package/packages/tools/lib/validator/workspace-boundary-validator.js +28 -0
  722. package/packages/tools/lib/validator/workspace-boundary-validator.js.map +1 -0
  723. package/packages/tools/python/memo_model.py +243 -0
  724. package/packages/tools/python/memo_stage1_syside.py +389 -0
  725. package/packages/tools/lib/commands/check.d.ts +0 -6
  726. package/packages/tools/lib/commands/check.d.ts.map +0 -1
  727. package/packages/tools/lib/commands/check.js +0 -191
  728. package/packages/tools/lib/commands/check.js.map +0 -1
  729. package/packages/tools/lib/commands/conformance.d.ts +0 -36
  730. package/packages/tools/lib/commands/conformance.d.ts.map +0 -1
  731. package/packages/tools/lib/commands/conformance.js +0 -212
  732. package/packages/tools/lib/commands/conformance.js.map +0 -1
  733. package/packages/tools/lib/commands/roundtrip.d.ts +0 -6
  734. package/packages/tools/lib/commands/roundtrip.d.ts.map +0 -1
  735. package/packages/tools/lib/commands/roundtrip.js +0 -145
  736. package/packages/tools/lib/commands/roundtrip.js.map +0 -1
  737. package/packages/tools/lib/conformance/baseline.d.ts +0 -26
  738. package/packages/tools/lib/conformance/baseline.d.ts.map +0 -1
  739. package/packages/tools/lib/conformance/baseline.js +0 -170
  740. package/packages/tools/lib/conformance/baseline.js.map +0 -1
  741. package/packages/tools/lib/conformance/bnf.d.ts +0 -84
  742. package/packages/tools/lib/conformance/bnf.d.ts.map +0 -1
  743. package/packages/tools/lib/conformance/bnf.js +0 -166
  744. package/packages/tools/lib/conformance/bnf.js.map +0 -1
  745. package/packages/tools/lib/conformance/corpus.d.ts +0 -125
  746. package/packages/tools/lib/conformance/corpus.d.ts.map +0 -1
  747. package/packages/tools/lib/conformance/corpus.js +0 -190
  748. package/packages/tools/lib/conformance/corpus.js.map +0 -1
  749. package/packages/tools/lib/conformance/diff-xmi.d.ts +0 -118
  750. package/packages/tools/lib/conformance/diff-xmi.d.ts.map +0 -1
  751. package/packages/tools/lib/conformance/diff-xmi.js +0 -276
  752. package/packages/tools/lib/conformance/diff-xmi.js.map +0 -1
  753. package/packages/tools/lib/conformance/generated/syside-rules.d.ts +0 -10
  754. package/packages/tools/lib/conformance/generated/syside-rules.d.ts.map +0 -1
  755. package/packages/tools/lib/conformance/generated/syside-rules.js +0 -1142
  756. package/packages/tools/lib/conformance/generated/syside-rules.js.map +0 -1
  757. package/packages/tools/lib/conformance/index.d.ts +0 -7
  758. package/packages/tools/lib/conformance/index.d.ts.map +0 -1
  759. package/packages/tools/lib/conformance/index.js +0 -19
  760. package/packages/tools/lib/conformance/index.js.map +0 -1
  761. package/packages/tools/lib/conformance/run.d.ts +0 -117
  762. package/packages/tools/lib/conformance/run.d.ts.map +0 -1
  763. package/packages/tools/lib/conformance/run.js +0 -0
  764. package/packages/tools/lib/conformance/run.js.map +0 -1
  765. package/packages/tools/lib/conformance/xmi.d.ts +0 -45
  766. package/packages/tools/lib/conformance/xmi.d.ts.map +0 -1
  767. package/packages/tools/lib/conformance/xmi.js +0 -148
  768. package/packages/tools/lib/conformance/xmi.js.map +0 -1
  769. package/packages/tools/lib/language/generated/ast.d.ts +0 -3571
  770. package/packages/tools/lib/language/generated/ast.d.ts.map +0 -1
  771. package/packages/tools/lib/language/generated/ast.js +0 -2980
  772. package/packages/tools/lib/language/generated/ast.js.map +0 -1
  773. package/packages/tools/lib/language/generated/grammar.d.ts +0 -7
  774. package/packages/tools/lib/language/generated/grammar.d.ts.map +0 -1
  775. package/packages/tools/lib/language/generated/grammar.js +0 -10687
  776. package/packages/tools/lib/language/generated/grammar.js.map +0 -1
  777. package/packages/tools/lib/language/generated/module.d.ts +0 -14
  778. package/packages/tools/lib/language/generated/module.d.ts.map +0 -1
  779. package/packages/tools/lib/language/generated/module.js +0 -21
  780. package/packages/tools/lib/language/generated/module.js.map +0 -1
  781. package/packages/tools/lib/language/memo-sysml-module.d.ts +0 -24
  782. package/packages/tools/lib/language/memo-sysml-module.d.ts.map +0 -1
  783. package/packages/tools/lib/language/memo-sysml-module.js +0 -20
  784. package/packages/tools/lib/language/memo-sysml-module.js.map +0 -1
  785. package/packages/tools/lib/model/builder.d.ts +0 -27
  786. package/packages/tools/lib/model/builder.d.ts.map +0 -1
  787. package/packages/tools/lib/model/builder.js +0 -2112
  788. package/packages/tools/lib/model/builder.js.map +0 -1
  789. package/packages/tools/lib/model/package-registry.d.ts +0 -64
  790. package/packages/tools/lib/model/package-registry.d.ts.map +0 -1
  791. package/packages/tools/lib/model/package-registry.js +0 -184
  792. package/packages/tools/lib/model/package-registry.js.map +0 -1
  793. package/packages/tools/lib/model/parser-utils.d.ts +0 -65
  794. package/packages/tools/lib/model/parser-utils.d.ts.map +0 -1
  795. package/packages/tools/lib/model/parser-utils.js +0 -201
  796. package/packages/tools/lib/model/parser-utils.js.map +0 -1
  797. package/packages/tools/lib/sysmlc/bin/memo-sysmlc.d.ts +0 -3
  798. package/packages/tools/lib/sysmlc/bin/memo-sysmlc.d.ts.map +0 -1
  799. package/packages/tools/lib/sysmlc/bin/memo-sysmlc.js +0 -97
  800. package/packages/tools/lib/sysmlc/bin/memo-sysmlc.js.map +0 -1
  801. package/packages/tools/lib/sysmlc/index.d.ts +0 -2
  802. package/packages/tools/lib/sysmlc/index.d.ts.map +0 -1
  803. package/packages/tools/lib/sysmlc/index.js +0 -7
  804. package/packages/tools/lib/sysmlc/index.js.map +0 -1
  805. package/packages/tools/lib/sysmlc/server.d.ts +0 -29
  806. package/packages/tools/lib/sysmlc/server.d.ts.map +0 -1
  807. package/packages/tools/lib/sysmlc/server.js +0 -168
  808. package/packages/tools/lib/sysmlc/server.js.map +0 -1
  809. package/packages/tools/lib/toolchain/lowering.d.ts +0 -63
  810. package/packages/tools/lib/toolchain/lowering.d.ts.map +0 -1
  811. package/packages/tools/lib/toolchain/lowering.js +0 -100
  812. package/packages/tools/lib/toolchain/lowering.js.map +0 -1
  813. package/packages/tools/lib/toolchain/providers/internal.d.ts +0 -33
  814. package/packages/tools/lib/toolchain/providers/internal.d.ts.map +0 -1
  815. package/packages/tools/lib/toolchain/providers/internal.js +0 -286
  816. package/packages/tools/lib/toolchain/providers/internal.js.map +0 -1
  817. package/packages/tools/lib/toolchain/sysmlc-client.d.ts +0 -77
  818. package/packages/tools/lib/toolchain/sysmlc-client.d.ts.map +0 -1
  819. package/packages/tools/lib/toolchain/sysmlc-client.js +0 -0
  820. package/packages/tools/lib/toolchain/sysmlc-client.js.map +0 -1
  821. package/packages/tools/lib/validator/sysml-constraints.d.ts +0 -64
  822. package/packages/tools/lib/validator/sysml-constraints.d.ts.map +0 -1
  823. package/packages/tools/lib/validator/sysml-constraints.js +0 -251
  824. package/packages/tools/lib/validator/sysml-constraints.js.map +0 -1
  825. package/packages/tools/src/grammar/memo-sysml.langium +0 -1064
@@ -4,7 +4,9 @@
4
4
  // - Optional client middleware supplied by a higher-level application
5
5
  // - WebSocket endpoint for pushing model updates to browser
6
6
  // ─────────────────────────────────────────────────────────────────────────────
7
+ import { serveValidate } from './dev-validate.js';
7
8
  import { createServer as createHttpServer } from 'node:http';
9
+ import { createServer as createNetServer } from 'node:net';
8
10
  import { createHash, randomUUID } from 'node:crypto';
9
11
  import { isAbsolute, relative, resolve } from 'node:path';
10
12
  import { existsSync, readFileSync, realpathSync, writeFileSync, mkdirSync, createReadStream, statSync } from 'node:fs';
@@ -12,25 +14,34 @@ import { extname } from 'node:path';
12
14
  import { findMemoManifests, validateRelationshipMutation, validateRelationshipDeletion } from '@memoarchitect/tools';
13
15
  import { indexFromIdentityTable } from '../model/ir-identity.js';
14
16
  import { recompileProject, writeElement } from '../operations/authoring.js';
15
- import { isWritableRelationshipFile, removeRelationship, resolveRelationshipPlacement, updateRelationship, writeRelationship, } from './relationship-writer.js';
17
+ import { isWritableRelationshipFile, removeRelationship, resolveRelationshipPlacement, reviewTraceBaselines, updateRelationship, writeRelationship, } from './relationship-writer.js';
18
+ import { resolveSuspectReviews } from './suspect-review.js';
19
+ import { prepareSourceImport } from '../import/source-import.js';
20
+ import { dtoToModel } from '../model/semantic.js';
16
21
  import { removeElement } from './element-writer.js';
17
22
  import { projectEntrypoint } from '../model/native-project.js';
18
23
  import { createPackage, deletePackage, moveElementToPackage, moveIntoGroupingPackage, movePackage, renamePackage, } from './package-writer.js';
19
- import { assertSingleDomainMutation, MixedMutationDomainError } from './mutation-domain.js';
24
+ import { writeRelease } from './release-writer.js';
25
+ import { assertSingleDomainMutation, isReadOnlyMessage, MixedMutationDomainError } from './mutation-domain.js';
20
26
  import { classifyConflict } from './conflict-policy.js';
21
27
  import { checkRulePolicy, insertRulePolicy, renderRulePolicy } from './rule-policy-writer.js';
28
+ import { createRule, previewRule } from './rule-service.js';
22
29
  import { loadViewLayouts, saveViewLayout } from './view-layout-store.js';
23
- import { updateViewExpose, writeViewDeclaration } from './view-writer.js';
30
+ import { layoutBlindRevision } from '../model/view-layout-block.js';
31
+ import { assertWritable } from './write-guard.js';
32
+ import { updateViewDisplay, updateViewExpose, writeViewDeclaration } from './view-writer.js';
24
33
  import { usageKeyword } from '../model/semantic.js';
25
34
  import { loadDhfDocs, saveDhfDoc, deleteDhfDoc, loadDhfSettings, saveDhfSettings, listRepoTemplates, readRepoTemplate, saveRepoTemplate, } from './dhf-doc-store.js';
26
35
  import { loadDashboards, saveDashboard, deleteDashboard, moveDashboard } from './dashboard-store.js';
36
+ import { loadUserPreferences, saveUserPreferences } from './user-preferences.js';
27
37
  import { createDashboardWatcher } from './file-watcher.js';
38
+ import { selectedOutlineSource } from '../authoring/outline-source.js';
28
39
  const MODEL_MUTATION_MESSAGES = new Set([
29
40
  'element:update', 'element:create', 'element:delete', 'element:remap-kinds', 'element:move-package',
30
41
  'package:create', 'package:rename', 'package:delete', 'package:move',
31
- 'relationship:create', 'relationship:delete', 'relationship:update',
32
- 'diagram:create', 'diagram:update', 'diagram:delete', 'diagram:layout:update', 'diagram:source:save',
33
- 'methodology:source:save', 'csv:import', 'screen-capture:upload',
42
+ 'relationship:create', 'relationship:delete', 'relationship:update', 'release:create',
43
+ 'diagram:create', 'diagram:update', 'diagram:display:update', 'diagram:delete', 'diagram:layout:update', 'diagram:source:save',
44
+ 'methodology:source:save', 'csv:import', 'import:apply', 'suspect:review', 'screen-capture:upload',
34
45
  'ontology:install', 'ontology:remove', 'ontology:save-selection',
35
46
  'dhf:doc:save', 'dhf:doc:delete', 'dhf:settings:save', 'dhf:template:save',
36
47
  'llm:chat:apply', 'llm:settings:save',
@@ -174,6 +185,10 @@ export async function createDevServer(options) {
174
185
  // three state payloads from a rebuild share one revision so the browser
175
186
  // cannot combine a model from one build with validation from another.
176
187
  const workspaceSessionId = randomUUID();
188
+ /** The model writes in flight, in order. */
189
+ let mutationQueue = Promise.resolve();
190
+ /** The newest layout message seen for each diagram. */
191
+ const latestLayoutMessage = new Map();
177
192
  const writeTransactions = new Map();
178
193
  let workspaceRevision = 1;
179
194
  let mutationLockout;
@@ -216,7 +231,8 @@ export async function createDevServer(options) {
216
231
  function recordWriteTransaction(sourceFile, text) {
217
232
  const id = randomUUID();
218
233
  writeTransactions.set(sourceFile.replaceAll('\\', '/'), {
219
- id, hash: createHash('sha256').update(text).digest('hex').slice(0, 16),
234
+ // The same revision the watcher's match is made with, which ignores layout.
235
+ id, hash: fileRevision(text),
220
236
  createdAt: Date.now(), unmatchedWrites: 0,
221
237
  });
222
238
  return id;
@@ -331,6 +347,11 @@ export async function createDevServer(options) {
331
347
  server: {
332
348
  middlewareMode: true,
333
349
  host,
350
+ // Vite's HMR socket defaults to 24678, one per machine. A second
351
+ // dev server (or a stale one) finds it taken, logs a port error,
352
+ // and its page's HMR client keeps failing to connect to a socket
353
+ // that belongs to somebody else's server. Each server takes its own.
354
+ hmr: { port: await freePort(host) },
334
355
  watch: { ignored: isModelOwnedWatchPath },
335
356
  },
336
357
  appType: 'spa',
@@ -339,6 +360,8 @@ export async function createDevServer(options) {
339
360
  : [],
340
361
  });
341
362
  server = createHttpServer((req, res) => {
363
+ if (serveValidate(req, res, options.validateToken, options.validate))
364
+ return;
342
365
  if (serveProjectAsset(req, res))
343
366
  return;
344
367
  if (serveHelp(req, res))
@@ -349,6 +372,8 @@ export async function createDevServer(options) {
349
372
  else if (hasWebDist) {
350
373
  // Packaged install: serve the prebuilt web app statically
351
374
  server = createHttpServer((req, res) => {
375
+ if (serveValidate(req, res, options.validateToken, options.validate))
376
+ return;
352
377
  if (serveProjectAsset(req, res))
353
378
  return;
354
379
  if (serveHelp(req, res))
@@ -359,6 +384,8 @@ export async function createDevServer(options) {
359
384
  else {
360
385
  // Fallback: serve a basic page that connects via WebSocket
361
386
  server = createHttpServer((req, res) => {
387
+ if (serveValidate(req, res, options.validateToken, options.validate))
388
+ return;
362
389
  if (serveProjectAsset(req, res))
363
390
  return;
364
391
  res.writeHead(200, { 'Content-Type': 'text/html' });
@@ -404,7 +431,7 @@ export async function createDevServer(options) {
404
431
  // Every view is DECLARED in SysML — see `view-writer.ts`. The sidecar at
405
432
  // .memo/user-diagrams.json used to be merged in here as a second class of
406
433
  // view, which is how a view could exist for Architect and for nothing else:
407
- // no source file, so invisible to `memo validate`, to `syside check`, to
434
+ // no source file, so invisible to `memo validate`, to the selected compiler, to
408
435
  // review, and — wherever `.memo/` is ignored — to git.
409
436
  //
410
437
  // Rows left in that file are therefore not views but UNDECLARED views: an
@@ -551,6 +578,13 @@ export async function createDevServer(options) {
551
578
  * Cleared by `broadcast`, because a published model supersedes it.
552
579
  */
553
580
  let writeBackIndex;
581
+ /**
582
+ * A recompiled index, when it addresses anything. A compiler that builds
583
+ * the model from its handoff states no syntax tree, so its recompile
584
+ * mints no identities; adopting that empty index would refuse every
585
+ * further write until the watcher republished. The published one stands.
586
+ */
587
+ const addressable = (index) => index.byIdentity.size > 0 ? index : writeBackIndex;
554
588
  /** The index every write resolves its identities against. */
555
589
  const irIndex = () => writeBackIndex ?? indexFromIdentityTable(currentModel()?.irIdentities);
556
590
  /**
@@ -566,17 +600,19 @@ export async function createDevServer(options) {
566
600
  /** What every authoring operation is given: the project, its settings, and the index. */
567
601
  async function authoringContext() {
568
602
  const { loadAndResolveConfig } = await import('./config-resolver.js');
569
- const { findConfigFile } = await import('@memoarchitect/tools');
603
+ const { findConfigFile, loadProjectSettings } = await import('@memoarchitect/tools');
570
604
  const configPath = findConfigFile(options.projectRoot);
605
+ const config = configPath ? loadAndResolveConfig(configPath) : loadProjectSettings(options.projectRoot);
571
606
  return {
572
607
  projectDir: options.projectRoot,
573
- config: configPath ? loadAndResolveConfig(configPath) : undefined,
608
+ config,
574
609
  irIndex: irIndex(),
610
+ outlines: selectedOutlineSource(options.projectRoot, config),
575
611
  };
576
612
  }
577
613
  async function recompileAfterWrite() {
578
614
  try {
579
- writeBackIndex = (await recompileProject(await authoringContext())).index;
615
+ writeBackIndex = addressable((await recompileProject(await authoringContext())).index);
580
616
  }
581
617
  catch (e) {
582
618
  // A recompile that fails leaves the previous index in place: the
@@ -586,33 +622,54 @@ export async function createDevServer(options) {
586
622
  console.warn(`[Authoring] Recompile after write failed: ${e instanceof Error ? e.message : String(e)}`);
587
623
  }
588
624
  }
625
+ /**
626
+ * What the query engines read: the model the last build made (not the DTO clients are sent, which has no
627
+ * indexes to query), the validation and completeness the server holds, and, when the person is working in
628
+ * one workspace, its scope, so a question about one system is answered from that system.
629
+ */
630
+ async function scopedQueryContext(config, workspaceRoot) {
631
+ const { createQueryContext } = await import('../dhf/query-engine.js');
632
+ const model = options.memoModel?.();
633
+ if (!model)
634
+ throw new Error('The model is not built yet.');
635
+ const validMsg = initialMessages.find(m => m.type === 'validation:update');
636
+ const compMsg = initialMessages.find(m => m.type === 'completeness:update');
637
+ const scope = workspaceRoot ? options.workspaceScope?.(workspaceRoot) : undefined;
638
+ return createQueryContext(model, validMsg?.payload ?? { violations: [] }, compMsg?.payload ?? { overall: 0, layers: [] }, config, undefined, scope);
639
+ }
589
640
  /**
590
641
  * Build the query context the LLM engines read from, against whatever the
591
642
  * server currently holds. Every LLM handler needs the same four pieces, so
592
643
  * they share this rather than each re-deriving them.
593
644
  */
594
- async function llmQueryContext() {
595
- const { createQueryContext, findConfigFile, loadOntologyRegistries, ontologyViewFrom, EMPTY_ONTOLOGY_VIEW } = await import('@memoarchitect/tools');
645
+ async function llmQueryContext(workspaceRoot) {
646
+ const { findConfigFile, loadProjectOntology, ontologyViewFrom, EMPTY_ONTOLOGY_VIEW } = await import('@memoarchitect/tools');
596
647
  const { loadAndResolveConfig } = await import('./config-resolver.js');
597
648
  const modelMsg = initialMessages.find(m => m.type === 'model:update');
598
649
  const validMsg = initialMessages.find(m => m.type === 'validation:update');
599
650
  const compMsg = initialMessages.find(m => m.type === 'completeness:update');
600
651
  const configPath = findConfigFile(options.projectRoot);
601
- const config = configPath ? loadAndResolveConfig(configPath) : { projectName: 'untitled' };
652
+ const config = configPath ? loadAndResolveConfig(configPath) : { modelName: 'untitled' };
602
653
  // Kinds and relationships come from the resolved SysML, not from the
603
654
  // settings file the config path points at.
604
655
  let ontology = EMPTY_ONTOLOGY_VIEW;
605
656
  try {
606
- const loaded = await loadOntologyRegistries(options.projectRoot);
657
+ const loaded = await loadProjectOntology({ projectRoot: options.projectRoot, config });
607
658
  ontology = ontologyViewFrom(loaded.registries.kindRegistry, loaded.registries.relationshipRegistry);
608
659
  }
609
660
  catch {
610
661
  // A project whose ontology does not resolve still has a model to query.
611
662
  }
612
- const ctx = createQueryContext(modelMsg?.payload ?? {}, validMsg?.payload ?? { violations: [] }, compMsg?.payload ?? { overall: 0, layers: [] }, config);
663
+ const ctx = await scopedQueryContext(config, workspaceRoot);
613
664
  return { ctx, config, ontology };
614
665
  }
615
666
  /** Settings status for the client — provider/model/origin, never the key. */
667
+ async function toolchainSettings() {
668
+ const { userToolchainStatus } = await import('../toolchain/user-settings-status.js');
669
+ const { defaultRegistry } = await import('../toolchain/default-registry.js');
670
+ const { loadProjectSettings } = await import('../model/config-loader.js');
671
+ return userToolchainStatus(defaultRegistry, {}, process.env, loadProjectSettings(options.projectRoot).projectToolchain ?? {});
672
+ }
616
673
  async function llmSettings() {
617
674
  const { llmSettingsStatus } = await import('@memoarchitect/tools');
618
675
  return llmSettingsStatus(options.projectRoot);
@@ -641,7 +698,7 @@ export async function createDevServer(options) {
641
698
  layer: change.layer ?? kindDef?.layer ?? '',
642
699
  doc: change.doc ?? '',
643
700
  attributes: change.attributes ?? {},
644
- });
701
+ }, irIndex(), (await authoringContext()).outlines);
645
702
  if (!result.success)
646
703
  throw new Error(result.error ?? 'Failed to write the element.');
647
704
  await recompileAfterWrite();
@@ -656,7 +713,7 @@ export async function createDevServer(options) {
656
713
  ...(change.changes.name !== undefined ? { name: change.changes.name } : {}),
657
714
  ...(change.changes.doc !== undefined ? { doc: change.changes.doc } : {}),
658
715
  attributes: { ...existing.attributes, ...(change.changes.attributes ?? {}) },
659
- }, irIndex());
716
+ }, irIndex(), (await authoringContext()).outlines);
660
717
  if (!result.success)
661
718
  throw new Error(result.error ?? 'Failed to write the element.');
662
719
  await recompileAfterWrite();
@@ -705,13 +762,14 @@ export async function createDevServer(options) {
705
762
  ?? registries?.kindRegistry?.toDefinitionDTOs() ?? [],
706
763
  };
707
764
  }
708
- function relationshipWriterOptions() {
765
+ async function relationshipWriterOptions() {
709
766
  return {
710
767
  projectRoot: options.projectRoot,
711
768
  ontologyRoots: options.ontologyRoots,
712
769
  designatedFiles: options.relationshipFiles,
713
770
  canonicalFile: options.canonicalRelationshipFile,
714
771
  irIndex: irIndex(),
772
+ outlines: (await authoringContext()).outlines,
715
773
  };
716
774
  }
717
775
  /**
@@ -735,7 +793,7 @@ export async function createDevServer(options) {
735
793
  if (!model)
736
794
  return reject('The model is not loaded yet.');
737
795
  const registries = serverRegistries();
738
- const writerOptions = relationshipWriterOptions();
796
+ const writerOptions = await relationshipWriterOptions();
739
797
  // The active view's profile only downgrades to a warning, so a
740
798
  // relationship the view cannot draw is still created in the model.
741
799
  const diagram = payload.diagramId
@@ -789,6 +847,29 @@ export async function createDevServer(options) {
789
847
  },
790
848
  };
791
849
  }
850
+ /** Create one release record with all its statements, or none. */
851
+ async function handleReleaseCreate(payload) {
852
+ const requestId = payload?.requestId ?? '';
853
+ const reject = (error) => ({ type: 'release:create:result', payload: { requestId, success: false, error } });
854
+ const conflict = checkMutationPrecondition(payload.precondition, requestId, payload);
855
+ if (conflict)
856
+ return reject(conflict);
857
+ const model = currentModel();
858
+ if (!model)
859
+ return reject('The model is not loaded yet.');
860
+ const result = await writeRelease(payload, {
861
+ projectRoot: options.projectRoot,
862
+ outlines: (await authoringContext()).outlines,
863
+ fileOf: id => model.elements[id]?.file,
864
+ commitOf: id => model.elements[id]?.attributes?.modelCommit,
865
+ });
866
+ if (!result.success)
867
+ return reject(result.error ?? 'The release could not be written.');
868
+ console.log(`[Persisted] release ${result.name} (${result.modelCommit?.slice(0, 7)}) to ${result.filePath}`);
869
+ recordWriteTransaction(result.filePath, readFileSync(resolve(options.projectRoot, result.filePath), 'utf8'));
870
+ await recompileAfterWrite();
871
+ return { type: 'release:create:result', payload: { requestId, ...result } };
872
+ }
792
873
  /** Delete one relationship usage, leaving both endpoint elements in place. */
793
874
  async function handleRelationshipDelete(payload) {
794
875
  const requestId = payload?.requestId ?? '';
@@ -810,7 +891,7 @@ export async function createDevServer(options) {
810
891
  const first = validation.diagnostics[0];
811
892
  return reject(first?.message ?? 'The relationship was not found.', validation.diagnostics);
812
893
  }
813
- const result = await removeRelationship(validation.relationship, relationshipWriterOptions());
894
+ const result = await removeRelationship(validation.relationship, await relationshipWriterOptions());
814
895
  if (!result.success) {
815
896
  console.error(`[Relationship] Delete failed: ${result.error}`);
816
897
  return reject(result.error ?? 'The relationship could not be removed.');
@@ -831,6 +912,96 @@ export async function createDevServer(options) {
831
912
  },
832
913
  };
833
914
  }
915
+ /**
916
+ * Preview or apply an import from another system. A preview writes nothing; an
917
+ * apply writes the one file the source owns, then recompiles. Both run the
918
+ * same computation, so the preview is what the apply does.
919
+ */
920
+ async function handleSourceImport(mode, payload) {
921
+ const requestId = payload?.requestId ?? '';
922
+ const fail = (...errors) => ({
923
+ type: 'source-import:result', payload: { requestId, mode, success: false, errors },
924
+ });
925
+ const model = currentModel();
926
+ const registries = options.ontologyRegistries;
927
+ if (!model)
928
+ return fail('The model is not loaded yet.');
929
+ if (!registries?.kindRegistry || !registries.relationshipRegistry)
930
+ return fail('The ontology is not loaded yet.');
931
+ if (!payload.system?.trim())
932
+ return fail('Name the system the export came from.');
933
+ const context = { kindRegistry: registries.kindRegistry, relationshipRegistry: registries.relationshipRegistry };
934
+ const prepared = prepareSourceImport(dtoToModel(model), context, {
935
+ system: payload.system.trim(), format: payload.format, text: payload.text,
936
+ defaultKind: payload.kind, defaultRelation: payload.relation,
937
+ }, { sourceFile: payload.fileName });
938
+ const { records, preview, rendered } = prepared;
939
+ // An export that read nothing must not look like a source that dropped every record.
940
+ if (records.errors.length > 0 && records.items.length === 0 && !records.partial)
941
+ return fail(...records.errors);
942
+ const target = resolve(options.projectRoot, rendered.file);
943
+ const base = {
944
+ requestId, mode, success: true, preview, dropped: rendered.dropped,
945
+ warnings: [...records.warnings, ...rendered.warnings], errors: records.errors,
946
+ sourceFile: rendered.file,
947
+ sourceHash: existsSync(target) ? fileRevision(readFileSync(target, 'utf8')) : '',
948
+ };
949
+ if (mode === 'preview')
950
+ return { type: 'source-import:result', payload: base };
951
+ // The preview named the file this writes and the hash the client saw of it; if the file has
952
+ // changed since (a second tab, a CLI import, a text edit), what the person reviewed is not
953
+ // what this would do.
954
+ if (payload.precondition?.sourceFile !== rendered.file)
955
+ return fail('The apply is not for the file this import writes; preview it again.');
956
+ const conflict = checkMutationPrecondition(payload.precondition, requestId, payload);
957
+ if (conflict)
958
+ return fail(conflict);
959
+ if (!isWritableRelationshipFile(rendered.file, await relationshipWriterOptions()))
960
+ return fail(`${rendered.file} is not a writable project file`);
961
+ mkdirSync(resolve(target, '..'), { recursive: true });
962
+ assertWritable(target);
963
+ writeFileSync(target, rendered.text, 'utf-8');
964
+ recordWriteTransaction(rendered.file, rendered.text);
965
+ console.log(`[Import] ${payload.system}: wrote ${rendered.file}`);
966
+ await recompileAfterWrite();
967
+ return { type: 'source-import:result', payload: base };
968
+ }
969
+ /**
970
+ * Mark suspect links reviewed: each is rewritten to the current revision of the
971
+ * record it was suspect about. What is suspect is decided here from the whole
972
+ * model, never from the request, so a stale or invented link is refused.
973
+ */
974
+ async function handleSuspectReview(payload) {
975
+ const requestId = payload?.requestId ?? '';
976
+ const reject = (error) => ({
977
+ type: 'suspect:review:result', payload: { requestId, success: false, reviewed: [], error },
978
+ });
979
+ if (!payload.preconditions?.length)
980
+ return reject('The review has no source preconditions; reload before saving.');
981
+ for (const precondition of payload.preconditions) {
982
+ const conflict = checkMutationPrecondition(precondition, requestId, payload);
983
+ if (conflict)
984
+ return reject(conflict);
985
+ }
986
+ const model = currentModel();
987
+ if (!model)
988
+ return reject('The model is not loaded yet.');
989
+ const resolved = resolveSuspectReviews(model, payload.reviews ?? []);
990
+ if ('error' in resolved)
991
+ return reject(resolved.error);
992
+ const { reviews } = resolved;
993
+ const result = await reviewTraceBaselines(reviews, await relationshipWriterOptions());
994
+ if (!result.success)
995
+ return reject(result.error ?? 'The review could not be written.');
996
+ for (const file of result.sourceFiles ?? []) {
997
+ recordWriteTransaction(file, readFileSync(resolve(options.projectRoot, file), 'utf8'));
998
+ }
999
+ await recompileAfterWrite();
1000
+ return {
1001
+ type: 'suspect:review:result',
1002
+ payload: { requestId, success: true, reviewed: reviews.map(r => r.relationship.id), sourceFiles: result.sourceFiles },
1003
+ };
1004
+ }
834
1005
  /** Move relationship endpoints as one source edit, including anonymous flows. */
835
1006
  async function handleRelationshipUpdate(payload) {
836
1007
  const requestId = payload?.requestId ?? '';
@@ -867,7 +1038,7 @@ export async function createDevServer(options) {
867
1038
  const first = validation.diagnostics.find(diagnostic => diagnostic.severity === 'error');
868
1039
  return reject(first?.message ?? 'The relationship update is not valid.', validation.diagnostics);
869
1040
  }
870
- const result = await updateRelationship(payload, relationship, validation.definition, model, relationshipWriterOptions());
1041
+ const result = await updateRelationship(payload, relationship, validation.definition, model, await relationshipWriterOptions());
871
1042
  if (!result.success)
872
1043
  return reject(result.error ?? 'The relationship could not be updated.');
873
1044
  if (result.sourceFile) {
@@ -922,7 +1093,7 @@ export async function createDevServer(options) {
922
1093
  if (parent && !fileOf(parent)) {
923
1094
  return { success: false, filePaths: [], error: `Package "${parent}" was not found.` };
924
1095
  }
925
- return createPackage(projectRoot, { file, parent, name: String(payload.name ?? '') });
1096
+ return createPackage(projectRoot, { file, parent, name: String(payload.name ?? '') }, (await authoringContext()).outlines);
926
1097
  }
927
1098
  const qualifiedName = String(payload.qualifiedName ?? '');
928
1099
  if (type === 'package:rename' || type === 'package:delete' || type === 'package:move') {
@@ -930,16 +1101,16 @@ export async function createDevServer(options) {
930
1101
  if (!file)
931
1102
  return { success: false, filePaths: [], error: `Package "${qualifiedName}" was not found.` };
932
1103
  if (type === 'package:rename') {
933
- return renamePackage(projectRoot, { file, qualifiedName, name: String(payload.name ?? '') });
1104
+ return renamePackage(projectRoot, { file, qualifiedName, name: String(payload.name ?? '') }, (await authoringContext()).outlines);
934
1105
  }
935
1106
  if (type === 'package:delete')
936
- return deletePackage(projectRoot, { file, qualifiedName });
1107
+ return deletePackage(projectRoot, { file, qualifiedName }, (await authoringContext()).outlines);
937
1108
  const targetParent = payload.targetParent || undefined;
938
1109
  const targetFile = targetParent ? fileOf(targetParent) : file;
939
1110
  if (targetParent && !targetFile) {
940
1111
  return { success: false, filePaths: [], error: `Package "${targetParent}" was not found.` };
941
1112
  }
942
- return movePackage(projectRoot, { file, qualifiedName, targetParent, targetFile: targetFile });
1113
+ return movePackage(projectRoot, { file, qualifiedName, targetParent, targetFile: targetFile }, (await authoringContext()).outlines);
943
1114
  }
944
1115
  const elementId = String(payload.elementId ?? '');
945
1116
  const element = model.elements[elementId];
@@ -978,7 +1149,7 @@ export async function createDevServer(options) {
978
1149
  file: element.file,
979
1150
  qualifiedName: declarationPath(element),
980
1151
  targetPackage,
981
- });
1152
+ }, (await authoringContext()).outlines);
982
1153
  }
983
1154
  const irIdentity = irIndex().byMemoElement[elementId];
984
1155
  if (!irIdentity) {
@@ -989,7 +1160,7 @@ export async function createDevServer(options) {
989
1160
  }
990
1161
  return moveElementToPackage(projectRoot, {
991
1162
  elementId, irIdentity, sourceFile: element.file, targetFile: targetFile, targetPackage,
992
- }, irIndex());
1163
+ }, irIndex(), (await authoringContext()).outlines);
993
1164
  }
994
1165
  async function handleElementDelete(payload) {
995
1166
  const requestId = payload?.requestId ?? '';
@@ -1010,7 +1181,7 @@ export async function createDevServer(options) {
1010
1181
  if (element.provenance && !element.provenance.declaration.writable) {
1011
1182
  return reject(`Element "${elementId}" is read-only ${element.provenance.declaration.origin} content.`);
1012
1183
  }
1013
- const result = await removeElement(element, model, options.projectRoot);
1184
+ const result = await removeElement(element, model, options.projectRoot, (await authoringContext()).outlines);
1014
1185
  if (result.success) {
1015
1186
  for (const sourceFile of result.sourceFiles ?? []) {
1016
1187
  const path = resolve(options.projectRoot, sourceFile);
@@ -1081,19 +1252,35 @@ export async function createDevServer(options) {
1081
1252
  * granularity is too coarse to trust for conflict detection.
1082
1253
  */
1083
1254
  function fileRevision(contents) {
1255
+ // Layout-blind: a box moved on a canvas is not an edit of the file. For a
1256
+ // targeted edit, which is computed again from the file as it is.
1257
+ return layoutBlindRevision(contents);
1258
+ }
1259
+ /**
1260
+ * The revision of a whole file's text, layout included. A save that replaces
1261
+ * the file with text an editor loaded earlier must not pass when a layout was
1262
+ * written into the file since: it would put the old statements back.
1263
+ */
1264
+ function textRevision(contents) {
1084
1265
  return createHash('sha256').update(contents).digest('hex').slice(0, 16);
1085
1266
  }
1086
- /** Parse errors in SysML text, so the editor can show them without a rebuild. */
1087
- async function sysmlParseErrors(text) {
1267
+ /**
1268
+ * What the selected compiler says about SysML text, so the editor can show
1269
+ * it without waiting for the rebuild. The write already stands, so a
1270
+ * compiler that cannot be reached is not a save failure.
1271
+ */
1272
+ async function sysmlParseErrors(file, text) {
1088
1273
  try {
1089
- const { parseText } = await import('../model/parser-utils.js');
1090
- const { errors } = await parseText(text);
1091
- return errors.slice(0, 10).map(error => typeof error.line === 'number' ? `Line ${error.line}: ${error.message}` : error.message);
1092
- }
1093
- catch {
1094
- // A parser failure is not a save failure — the write already stands.
1274
+ const { loadAndResolveConfig } = await import('./config-resolver.js');
1275
+ const { findConfigFile, loadProjectSettings } = await import('@memoarchitect/tools');
1276
+ const configPath = findConfigFile(options.projectRoot);
1277
+ const config = configPath ? loadAndResolveConfig(configPath) : loadProjectSettings(options.projectRoot);
1278
+ await selectedOutlineSource(options.projectRoot, config).verify(file, text);
1095
1279
  return [];
1096
1280
  }
1281
+ catch (error) {
1282
+ return [(error instanceof Error ? error.message : String(error))];
1283
+ }
1097
1284
  }
1098
1285
  /** Resolve only the project-local .sysml source declared by the diagram. */
1099
1286
  function diagramSource(diagramId) {
@@ -1130,10 +1317,28 @@ export async function createDevServer(options) {
1130
1317
  if (sourceIncoherence)
1131
1318
  ws.send(JSON.stringify(sourceIncoherence));
1132
1319
  // Send all sidecar layouts on connect
1133
- const layouts = loadViewLayouts(options.projectRoot, currentDiagrams());
1320
+ const layouts = loadViewLayouts(options.projectRoot, currentDiagrams(), savedId => {
1321
+ const model = currentModel();
1322
+ if (!model || model.elements[savedId])
1323
+ return undefined;
1324
+ // A layout written before ids were qualified keys its nodes by the
1325
+ // declared name. Accept it when exactly one element answers to it.
1326
+ const matches = Object.keys(model.elements)
1327
+ .filter(id => (model.elements[id].shortName ?? id) === savedId);
1328
+ return matches.length === 1 ? matches[0] : undefined;
1329
+ });
1134
1330
  if (Object.keys(layouts).length > 0) {
1135
1331
  ws.send(JSON.stringify({ type: 'diagram:layout', payload: { layouts } }));
1136
1332
  }
1333
+ // The person's own choices for this model (memo.user.yaml)
1334
+ try {
1335
+ ws.send(JSON.stringify({ type: 'user-preferences', payload: loadUserPreferences(options.preferencesRoot ?? options.projectRoot) }));
1336
+ if (options.readOnly)
1337
+ ws.send(JSON.stringify({ type: 'pinned:info', payload: options.pinned ?? { kind: 'read-only', label: 'read-only' } }));
1338
+ }
1339
+ catch (e) {
1340
+ console.error('[Preferences] load failed:', e);
1341
+ }
1137
1342
  // Send custom dashboards on connect
1138
1343
  try {
1139
1344
  ws.send(JSON.stringify({ type: 'dashboards', payload: { dashboards: loadDashboards(options.projectRoot) } }));
@@ -1153,6 +1358,15 @@ export async function createDevServer(options) {
1153
1358
  catch (e) {
1154
1359
  console.error('[DHF] initial load failed:', e);
1155
1360
  }
1361
+ // The user's own toolchain settings: shown in Architect, written to their file.
1362
+ void (async () => {
1363
+ try {
1364
+ ws.send(JSON.stringify({ type: 'toolchain:settings', payload: { settings: await toolchainSettings() } }));
1365
+ }
1366
+ catch (e) {
1367
+ console.error('[toolchain] settings load failed:', e);
1368
+ }
1369
+ })();
1156
1370
  // Announce LLM availability and settings on connect. Resolution spans
1157
1371
  // the environment, a project .env, project settings and stored
1158
1372
  // credentials — never just process.env.
@@ -1173,9 +1387,20 @@ export async function createDevServer(options) {
1173
1387
  clients.delete(ws);
1174
1388
  options.onClientCountChanged?.(clients.size);
1175
1389
  });
1176
- ws.on('message', async (data) => {
1390
+ const handleMessage = async (data) => {
1177
1391
  try {
1178
1392
  const msg = JSON.parse(data.toString());
1393
+ if (options.readOnly && !isReadOnlyMessage(msg.type)) {
1394
+ // Refused by name, not by what it would have written: see READ_ONLY_MESSAGES.
1395
+ ws.send(JSON.stringify({
1396
+ type: 'app:error',
1397
+ payload: {
1398
+ requestId: msg.payload?.requestId,
1399
+ error: 'This is a pinned, read-only view; nothing can be changed in it. Open the working version to edit.',
1400
+ },
1401
+ }));
1402
+ return;
1403
+ }
1179
1404
  if (mutationLockout && isModelMutationMessage(msg.type)) {
1180
1405
  // A section 13.5 escalation is a hard server boundary;
1181
1406
  // stale and hand-authored clients cannot write through it.
@@ -1278,7 +1503,7 @@ export async function createDevServer(options) {
1278
1503
  if (result.success) {
1279
1504
  transactionId = recordWriteTransaction(result.filePath, readFileSync(resolve(projectRoot, result.filePath), 'utf8'));
1280
1505
  if (result.revision)
1281
- writeBackIndex = result.revision.index;
1506
+ writeBackIndex = addressable(result.revision.index);
1282
1507
  console.log(`[Persisted] ${msg.type} to ${result.filePath}`);
1283
1508
  }
1284
1509
  if (result.stale) {
@@ -1393,10 +1618,10 @@ export async function createDevServer(options) {
1393
1618
  const diagram = { ...msg.payload, auto: false };
1394
1619
  // A view is model content, so it is DECLARED, not recorded in
1395
1620
  // a sidecar. Writing the SysML puts it where `memo validate`,
1396
- // `syside check`, review and git can all see it, and — the
1397
- // derived diagram then carrying a `sourceFile` — takes its
1398
- // `.viewlayout` companion out of the hidden store too.
1399
- const declared = await writeViewDeclaration(projectRoot, currentModel() ?? { elements: {}, diagrams: [] }, diagram);
1621
+ // the selected compiler, review and git can all see it, and — the
1622
+ // derived diagram then carrying a `sourceFile` — has a place to keep
1623
+ // its layout.
1624
+ const declared = await writeViewDeclaration(projectRoot, currentModel() ?? { elements: {}, diagrams: [] }, diagram, (await authoringContext()).outlines);
1400
1625
  if (!declared.success) {
1401
1626
  // No fallback. A view that cannot be declared is not one
1402
1627
  // this project can hold, and recording it in a sidecar
@@ -1422,7 +1647,7 @@ export async function createDevServer(options) {
1422
1647
  const { projectRoot } = options;
1423
1648
  const declared = currentDiagrams().find(d => d.id === msg.payload?.id);
1424
1649
  const result = declared
1425
- ? await updateViewExpose(projectRoot, currentModel() ?? { elements: {} }, declared, msg.payload?.elementIds)
1650
+ ? await updateViewExpose(projectRoot, currentModel() ?? { elements: {} }, declared, msg.payload?.elementIds, (await authoringContext()).outlines)
1426
1651
  : { success: false, reason: `no view "${msg.payload?.id}" is declared` };
1427
1652
  if (result.success) {
1428
1653
  console.log(`[Diagram] Exposed ${result.exposed.join(', ')} on ${declared.name} (${result.filePath})`);
@@ -1434,6 +1659,22 @@ export async function createDevServer(options) {
1434
1659
  ws.send(JSON.stringify({ type: 'app:error', payload: { requestId: msg.payload?.requestId, error } }));
1435
1660
  }
1436
1661
  }
1662
+ else if (msg.type === 'diagram:display:update') {
1663
+ const { projectRoot } = options;
1664
+ const declared = currentDiagrams().find(d => d.id === msg.payload?.diagramId);
1665
+ const result = declared
1666
+ ? await updateViewDisplay(projectRoot, currentModel() ?? { elements: {} }, declared, msg.payload?.display ?? {}, (await authoringContext()).outlines)
1667
+ : { success: false, reason: `no view "${msg.payload?.diagramId}" is declared` };
1668
+ if (result.success) {
1669
+ await recompileAfterWrite();
1670
+ }
1671
+ else {
1672
+ ws.send(JSON.stringify({ type: 'app:error', payload: {
1673
+ requestId: msg.payload?.requestId,
1674
+ error: `How "${declared?.name ?? msg.payload?.diagramId}" is shown was not saved: ${result.reason}.`,
1675
+ } }));
1676
+ }
1677
+ }
1437
1678
  else if (msg.type === 'diagram:delete') {
1438
1679
  // Deleting a view means deleting its declaration, which is
1439
1680
  // `element:delete` on the view element — not a sidecar edit.
@@ -1448,12 +1689,32 @@ export async function createDevServer(options) {
1448
1689
  }
1449
1690
  else if (msg.type === 'diagram:layout:update') {
1450
1691
  const { diagramId, layout } = msg.payload;
1451
- const diagram = currentDiagrams().find(d => d.id === diagramId)
1452
- ?? { id: diagramId, name: diagramId, diagramType: 'bdd', viewpointId: '__model', auto: false };
1453
- const savedPath = saveViewLayout(options.projectRoot, diagram, layout);
1454
- console.log(savedPath
1455
- ? `[Diagram] Saved layout: ${savedPath}`
1456
- : `[Diagram] No overrides to save for ${diagramId}`);
1692
+ const diagram = currentDiagrams().find(d => d.id === diagramId);
1693
+ // The layout is written into the `view` that declares the
1694
+ // diagram, and nowhere else. A diagram that is not a declared
1695
+ // view keeps its layout for the session only.
1696
+ const saved = diagram
1697
+ ? await saveViewLayout(options.projectRoot, diagram, layout, (await authoringContext()).outlines)
1698
+ : { success: false, reason: `no view "${diagramId}" is declared` };
1699
+ if (!saved.success) {
1700
+ console.log(`[Diagram] Layout of ${diagramId} not saved: ${saved.reason}`);
1701
+ // Said to the sender, who is showing a layout the file does not hold.
1702
+ ws.send(JSON.stringify({ type: 'app:error', payload: {
1703
+ requestId: msg.payload?.requestId,
1704
+ error: `The layout of "${diagram?.name ?? diagramId}" was not saved: ${saved.reason}.`,
1705
+ } }));
1706
+ return;
1707
+ }
1708
+ else if ('changed' in saved && saved.changed && saved.filePath) {
1709
+ console.log(`[Diagram] Saved layout: ${saved.filePath}`);
1710
+ // The file watcher sees this write, finds it layout-only and
1711
+ // does not rebuild; the write is matched here so it is not
1712
+ // mistaken for an outside edit.
1713
+ recordWriteTransaction(saved.filePath, readFileSync(resolve(options.projectRoot, saved.filePath), 'utf8'));
1714
+ }
1715
+ else {
1716
+ console.log(`[Diagram] No change to the layout of ${diagramId}`);
1717
+ }
1457
1718
  // Broadcast to other clients (not the sender)
1458
1719
  const layoutMsg = JSON.stringify({ type: 'diagram:layout', payload: { layouts: { [diagramId]: layout } } });
1459
1720
  for (const client of clients) {
@@ -1464,12 +1725,21 @@ export async function createDevServer(options) {
1464
1725
  else if (msg.type === 'relationship:create') {
1465
1726
  ws.send(JSON.stringify(await handleRelationshipCreate(msg.payload)));
1466
1727
  }
1728
+ else if (msg.type === 'release:create') {
1729
+ ws.send(JSON.stringify(await handleReleaseCreate(msg.payload)));
1730
+ }
1467
1731
  else if (msg.type === 'relationship:delete') {
1468
1732
  ws.send(JSON.stringify(await handleRelationshipDelete(msg.payload)));
1469
1733
  }
1470
1734
  else if (msg.type === 'relationship:update') {
1471
1735
  ws.send(JSON.stringify(await handleRelationshipUpdate(msg.payload)));
1472
1736
  }
1737
+ else if (msg.type === 'import:preview' || msg.type === 'import:apply') {
1738
+ ws.send(JSON.stringify(await handleSourceImport(msg.type === 'import:preview' ? 'preview' : 'apply', msg.payload)));
1739
+ }
1740
+ else if (msg.type === 'suspect:review') {
1741
+ ws.send(JSON.stringify(await handleSuspectReview(msg.payload)));
1742
+ }
1473
1743
  else if (msg.type === 'element:delete') {
1474
1744
  ws.send(JSON.stringify(await handleElementDelete(msg.payload)));
1475
1745
  }
@@ -1484,10 +1754,11 @@ export async function createDevServer(options) {
1484
1754
  const elements = modelMsg?.payload?.elements ?? {};
1485
1755
  const { saveElementToFile } = await import('./persistor.js');
1486
1756
  let remappedCount = 0;
1757
+ const remapOutlines = (await authoringContext()).outlines;
1487
1758
  for (const element of Object.values(elements)) {
1488
1759
  const newKind = mappings[element.kind];
1489
1760
  if (newKind) {
1490
- const result = await saveElementToFile(projectRoot, { ...element, kind: newKind }, irIndex());
1761
+ const result = await saveElementToFile(projectRoot, { ...element, kind: newKind }, irIndex(), remapOutlines);
1491
1762
  if (result.success)
1492
1763
  remappedCount++;
1493
1764
  }
@@ -1558,7 +1829,7 @@ export async function createDevServer(options) {
1558
1829
  throw new Error('The requested file is not in the resolved methodology source set.');
1559
1830
  }
1560
1831
  const onDisk = readFileSync(path, 'utf8');
1561
- const revision = fileRevision(onDisk);
1832
+ const revision = textRevision(onDisk);
1562
1833
  if (operation === 'load') {
1563
1834
  reply({ success: true, text: onDisk, revision });
1564
1835
  return;
@@ -1585,7 +1856,7 @@ export async function createDevServer(options) {
1585
1856
  }
1586
1857
  writeFileSync(path, text, 'utf8');
1587
1858
  const transactionId = recordWriteTransaction(String(sourceFile), text);
1588
- reply({ success: true, revision: fileRevision(text), transactionId });
1859
+ reply({ success: true, revision: textRevision(text), transactionId });
1589
1860
  }
1590
1861
  catch (error) {
1591
1862
  reply({ success: false, error: error instanceof Error ? error.message : String(error) });
@@ -1616,7 +1887,7 @@ export async function createDevServer(options) {
1616
1887
  throw new Error('The target file is not in the resolved methodology source set.');
1617
1888
  }
1618
1889
  const onDisk = readFileSync(path, 'utf8');
1619
- const revision = fileRevision(onDisk);
1890
+ const revision = textRevision(onDisk);
1620
1891
  if (request.baseRevision !== revision) {
1621
1892
  reply({ success: false, conflict: true, revision,
1622
1893
  error: `${request.sourceFile} changed on disk; no write was made.` });
@@ -1624,11 +1895,43 @@ export async function createDevServer(options) {
1624
1895
  }
1625
1896
  const updated = insertRulePolicy(onDisk, renderRulePolicy(request));
1626
1897
  if (!updated) {
1627
- throw new Error(`${request.sourceFile} declares no MethodologyDefinition to attach the policy to.`);
1898
+ throw new Error(`${request.sourceFile} declares no ModelMethodBinding or MethodologyDefinition to attach the policy to.`);
1628
1899
  }
1629
1900
  writeFileSync(path, updated, 'utf8');
1630
1901
  const transactionId = recordWriteTransaction(String(request.sourceFile), updated);
1631
- reply({ success: true, revision: fileRevision(updated), transactionId });
1902
+ reply({ success: true, revision: textRevision(updated), transactionId });
1903
+ }
1904
+ catch (error) {
1905
+ reply({ success: false, error: error instanceof Error ? error.message : String(error) });
1906
+ }
1907
+ }
1908
+ else if (msg.type === 'rule:preview' || msg.type === 'rule:create') {
1909
+ // A rule of the user's. Preview and write take the same
1910
+ // request through the same checks (rule-service.ts); the
1911
+ // browser names the rule and Tools renders and verifies it.
1912
+ const { requestId } = msg.payload ?? {};
1913
+ const resultType = msg.type === 'rule:preview' ? 'rule:preview:result' : 'rule:create:result';
1914
+ const reply = (payload) => ws.send(JSON.stringify({ type: resultType, payload: { requestId, ...payload } }));
1915
+ try {
1916
+ const context = options.ruleContext?.();
1917
+ if (!context) {
1918
+ reply({ success: false, error: 'The project has not built yet, so a rule cannot be checked against it.' });
1919
+ return;
1920
+ }
1921
+ const form = msg.payload;
1922
+ if (msg.type === 'rule:preview') {
1923
+ reply(previewRule(context, form));
1924
+ }
1925
+ else {
1926
+ const written = await createRule(context, form);
1927
+ if (written.success) {
1928
+ const transactionId = recordWriteTransaction(String(form.file), written.text);
1929
+ reply({ success: true, revision: written.revision, transactionId });
1930
+ }
1931
+ else {
1932
+ reply(written);
1933
+ }
1934
+ }
1632
1935
  }
1633
1936
  catch (error) {
1634
1937
  reply({ success: false, error: error instanceof Error ? error.message : String(error) });
@@ -1643,7 +1946,7 @@ export async function createDevServer(options) {
1643
1946
  type: 'diagram:source:result',
1644
1947
  payload: {
1645
1948
  requestId, diagramId, operation: 'load', success: true,
1646
- sourceFile: source.sourceFile, text, revision: fileRevision(text),
1949
+ sourceFile: source.sourceFile, text, revision: textRevision(text),
1647
1950
  },
1648
1951
  }));
1649
1952
  }
@@ -1666,7 +1969,7 @@ export async function createDevServer(options) {
1666
1969
  // began. The client gets the current file back so it can
1667
1970
  // show the conflict instead of losing one of the two.
1668
1971
  const onDisk = readFileSync(source.path, 'utf8');
1669
- const currentRevision = fileRevision(onDisk);
1972
+ const currentRevision = textRevision(onDisk);
1670
1973
  if (baseRevision !== currentRevision) {
1671
1974
  console.warn(`[Diagram] Refused stale save of ${source.sourceFile} ` +
1672
1975
  `(based on ${baseRevision}, disk is ${currentRevision})`);
@@ -1690,15 +1993,16 @@ export async function createDevServer(options) {
1690
1993
  }));
1691
1994
  return;
1692
1995
  }
1996
+ assertWritable(source.path);
1693
1997
  writeFileSync(source.path, text, 'utf8');
1694
1998
  const transactionId = recordWriteTransaction(source.sourceFile, text);
1695
1999
  ws.send(JSON.stringify({
1696
2000
  type: 'diagram:source:result',
1697
2001
  payload: {
1698
2002
  requestId, diagramId, operation: 'save', success: true,
1699
- sourceFile: source.sourceFile, revision: fileRevision(text),
2003
+ sourceFile: source.sourceFile, revision: textRevision(text),
1700
2004
  transactionId,
1701
- parseErrors: await sysmlParseErrors(text),
2005
+ parseErrors: await sysmlParseErrors(source.sourceFile, text),
1702
2006
  },
1703
2007
  }));
1704
2008
  // The project watcher rebuilds and broadcasts the resulting model.
@@ -1823,8 +2127,9 @@ export async function createDevServer(options) {
1823
2127
  }
1824
2128
  }
1825
2129
  // Refresh packages and broadcast
1826
- const { getPackageMetadata } = await import('@memoarchitect/tools');
1827
- const packages = getPackageMetadata(projectRoot);
2130
+ // The list is read from the last build's handoff: a package just
2131
+ // installed joins it when the project next compiles.
2132
+ const packages = options.packageMetadata?.() ?? [];
1828
2133
  const pkgMsg = { type: 'ontology:packages', payload: { packages } };
1829
2134
  for (const client of clients) {
1830
2135
  if (client.readyState === 1)
@@ -1851,7 +2156,7 @@ export async function createDevServer(options) {
1851
2156
  const { projectRoot } = options;
1852
2157
  const { elementsCsv, relationshipsCsv, packageName, targetFile } = msg.payload ?? {};
1853
2158
  try {
1854
- const { parseElementsCsv, parseRelationshipsCsv, generateFile, attachProvenance, loadProjectSettings, } = await import('@memoarchitect/tools');
2159
+ const { parseElementsCsv, parseRelationshipsCsv, generateFile, loadProjectSettings, } = await import('@memoarchitect/tools');
1855
2160
  const config = loadProjectSettings(projectRoot);
1856
2161
  const { ontology } = await llmQueryContext();
1857
2162
  const errors = [];
@@ -1864,13 +2169,7 @@ export async function createDevServer(options) {
1864
2169
  const result = parseElementsCsv(elementsCsv, ontology);
1865
2170
  errors.push(...result.errors);
1866
2171
  warnings.push(...result.warnings);
1867
- // Attach provenance
1868
- const sessionId = `ws-${Date.now().toString(36)}`;
1869
- elements = attachProvenance(result.items, {
1870
- sourceFile: targetFile ?? 'web-import',
1871
- importTimestamp: new Date().toISOString(),
1872
- importSessionId: sessionId,
1873
- });
2172
+ elements = result.items;
1874
2173
  elementsImported = elements.length;
1875
2174
  }
1876
2175
  if (relationshipsCsv) {
@@ -1914,7 +2213,7 @@ export async function createDevServer(options) {
1914
2213
  const { requestId, question } = msg.payload ?? {};
1915
2214
  try {
1916
2215
  const { resolveLLMConfig, createProvider } = await import('@memoarchitect/tools');
1917
- const { createQueryContext, findConfigFile } = await import('@memoarchitect/tools');
2216
+ const { findConfigFile } = await import('@memoarchitect/tools');
1918
2217
  const { askModel } = await import('@memoarchitect/tools');
1919
2218
  const { loadAndResolveConfig } = await import('./config-resolver.js');
1920
2219
  const llmConfig = resolveLLMConfig();
@@ -1927,7 +2226,7 @@ export async function createDevServer(options) {
1927
2226
  const compMsg = initialMessages.find((m) => m.type === 'completeness:update');
1928
2227
  const configPath = findConfigFile(options.projectRoot);
1929
2228
  const config = configPath ? await loadAndResolveConfig(configPath) : {};
1930
- const ctx = createQueryContext(modelMsg?.payload ?? {}, validMsg?.payload ?? { violations: [] }, compMsg?.payload ?? { overall: 0, layers: [] }, config);
2229
+ const ctx = await scopedQueryContext(config, msg.payload?.workspace);
1931
2230
  const provider = createProvider(llmConfig);
1932
2231
  const result = await askModel(question, ctx, provider);
1933
2232
  ws.send(JSON.stringify({ type: 'llm:ask:result', payload: { requestId, answer: result.answer } }));
@@ -1948,7 +2247,7 @@ export async function createDevServer(options) {
1948
2247
  ws.send(JSON.stringify({ type: 'llm:chat:result', payload: { requestId, error: 'No LLM provider configured. Add an API key in Settings, set ANTHROPIC_API_KEY or OPENAI_API_KEY, or put one in a project .env file.' } }));
1949
2248
  }
1950
2249
  else {
1951
- const { ctx, ontology } = await llmQueryContext();
2250
+ const { ctx, ontology } = await llmQueryContext(msg.payload?.workspace);
1952
2251
  const provider = createProvider(llmConfig);
1953
2252
  const result = await runChatTurn({
1954
2253
  question, history, ctx, provider, ontology,
@@ -1996,6 +2295,31 @@ export async function createDevServer(options) {
1996
2295
  ws.send(JSON.stringify({ type: 'llm:chat:apply:result', payload: { requestId, applied, failed, error: e?.message ?? String(e) } }));
1997
2296
  }
1998
2297
  }
2298
+ else if (msg.type === 'toolchain:settings:save') {
2299
+ // Not a model mutation: it writes the user's own file, and is how a
2300
+ // user gets out of a compiler that rejects their project.
2301
+ const { requestId, path, value, scope } = msg.payload ?? {};
2302
+ try {
2303
+ const { applyUserSetting, applyProjectSetting } = await import('../toolchain/user-settings-status.js');
2304
+ const { defaultRegistry } = await import('../toolchain/default-registry.js');
2305
+ const wanted = typeof value === 'string' && value.length > 0 ? value : undefined;
2306
+ // The project's own file is watched: the change reaches the restart-required flow by itself.
2307
+ if (scope === 'project')
2308
+ applyProjectSetting(options.projectRoot, String(path ?? ''), wanted, defaultRegistry);
2309
+ else
2310
+ applyUserSetting(String(path ?? ''), wanted, defaultRegistry);
2311
+ const settings = await toolchainSettings();
2312
+ ws.send(JSON.stringify({ type: 'toolchain:settings:save:result', payload: { requestId, settings, appliesOnRestart: true } }));
2313
+ const settingsMsg = JSON.stringify({ type: 'toolchain:settings', payload: { settings } });
2314
+ for (const client of clients) {
2315
+ if (client.readyState === 1)
2316
+ client.send(settingsMsg);
2317
+ }
2318
+ }
2319
+ catch (e) {
2320
+ ws.send(JSON.stringify({ type: 'toolchain:settings:save:result', payload: { requestId, error: e?.message ?? String(e) } }));
2321
+ }
2322
+ }
1999
2323
  else if (msg.type === 'llm:settings:save') {
2000
2324
  const { requestId, provider, model, baseUrl, apiKey } = msg.payload ?? {};
2001
2325
  try {
@@ -2047,7 +2371,7 @@ export async function createDevServer(options) {
2047
2371
  // Draft DHF document sections via LLM (#55)
2048
2372
  const { requestId, documentTypeId, targetSections } = msg.payload ?? {};
2049
2373
  try {
2050
- const { resolveLLMConfig, createProvider, createQueryContext, findConfigFile, getDocumentType } = await import('@memoarchitect/tools');
2374
+ const { resolveLLMConfig, createProvider, findConfigFile, getDocumentType } = await import('@memoarchitect/tools');
2051
2375
  const { draftDocument } = await import('@memoarchitect/tools');
2052
2376
  const { loadAndResolveConfig } = await import('./config-resolver.js');
2053
2377
  const llmConfig = resolveLLMConfig();
@@ -2060,7 +2384,7 @@ export async function createDevServer(options) {
2060
2384
  const compMsg = initialMessages.find((m) => m.type === 'completeness:update');
2061
2385
  const configPath = findConfigFile(options.projectRoot);
2062
2386
  const config = configPath ? await loadAndResolveConfig(configPath) : {};
2063
- const ctx = createQueryContext(modelMsg?.payload ?? {}, validMsg?.payload ?? { violations: [] }, compMsg?.payload ?? { overall: 0, layers: [] }, config);
2387
+ const ctx = await scopedQueryContext(config, msg.payload?.workspace);
2064
2388
  const docType = getDocumentType(documentTypeId);
2065
2389
  if (!docType) {
2066
2390
  ws.send(JSON.stringify({ type: 'llm:draft:result', payload: { requestId, error: `Unknown document type: ${documentTypeId}` } }));
@@ -2090,7 +2414,7 @@ export async function createDevServer(options) {
2090
2414
  // Completeness suggestions via LLM (#53)
2091
2415
  const { requestId } = msg.payload ?? {};
2092
2416
  try {
2093
- const { resolveLLMConfig, createProvider, createQueryContext, findConfigFile, serializeModelContext } = await import('@memoarchitect/tools');
2417
+ const { resolveLLMConfig, createProvider, findConfigFile, serializeModelContext } = await import('@memoarchitect/tools');
2094
2418
  const { loadAndResolveConfig } = await import('./config-resolver.js');
2095
2419
  const llmConfig = resolveLLMConfig();
2096
2420
  if (!llmConfig) {
@@ -2102,7 +2426,7 @@ export async function createDevServer(options) {
2102
2426
  const compMsg = initialMessages.find((m) => m.type === 'completeness:update');
2103
2427
  const configPath = findConfigFile(options.projectRoot);
2104
2428
  const config = configPath ? await loadAndResolveConfig(configPath) : {};
2105
- const ctx = createQueryContext(modelMsg?.payload ?? {}, validMsg?.payload ?? { violations: [] }, compMsg?.payload ?? { overall: 0, layers: [] }, config);
2429
+ const ctx = await scopedQueryContext(config, msg.payload?.workspace);
2106
2430
  const modelContext = serializeModelContext(ctx, { includeGaps: true, maxElements: 200 });
2107
2431
  const provider = createProvider(llmConfig);
2108
2432
  const result = await provider.complete({
@@ -2139,6 +2463,69 @@ Return ONLY a JSON array of strings. Each string is a concise, actionable sugges
2139
2463
  ws.send(JSON.stringify({ type: 'llm:suggest:result', payload: { requestId, error: e?.message ?? String(e) } }));
2140
2464
  }
2141
2465
  }
2466
+ else if (msg.type === 'versions:list') {
2467
+ // The unreleased refs; the releases are read from the model the client already has.
2468
+ const refs = options.versions ? await options.versions.refs() : [];
2469
+ ws.send(JSON.stringify({ type: 'versions:update', payload: { refs } }));
2470
+ }
2471
+ else if (msg.type === 'version:open') {
2472
+ const requestId = msg.payload?.requestId;
2473
+ try {
2474
+ if (!options.versions)
2475
+ throw new Error('A pinned view is opened from the working version; open that one first.');
2476
+ const opened = await options.versions.open({ release: msg.payload?.release, ref: msg.payload?.ref });
2477
+ ws.send(JSON.stringify({ type: 'version:ready', payload: { requestId, ...opened } }));
2478
+ }
2479
+ catch (e) {
2480
+ ws.send(JSON.stringify({ type: 'version:error', payload: { requestId, error: e?.message ?? String(e) } }));
2481
+ }
2482
+ }
2483
+ else if (msg.type === 'impact:compute') {
2484
+ const requestId = msg.payload?.requestId;
2485
+ try {
2486
+ if (!options.impact)
2487
+ throw new Error('Impact is computed from the working version.');
2488
+ ws.send(JSON.stringify({ type: 'impact:result', payload: { requestId, report: await options.impact.compute(msg.payload?.target || undefined) } }));
2489
+ }
2490
+ catch (e) {
2491
+ ws.send(JSON.stringify({ type: 'impact:result', payload: { requestId, error: e?.message ?? String(e) } }));
2492
+ }
2493
+ }
2494
+ else if (msg.type === 'guide:evaluate') {
2495
+ const requestId = msg.payload?.requestId;
2496
+ try {
2497
+ if (!options.guide)
2498
+ throw new Error('The Guide is not available here.');
2499
+ ws.send(JSON.stringify({ type: 'guide:result', payload: { requestId, ...options.guide.evaluate(msg.payload?.workspace || undefined) } }));
2500
+ }
2501
+ catch (e) {
2502
+ ws.send(JSON.stringify({ type: 'guide:result', payload: { requestId, steps: [], methodologies: [], roleViews: [], error: e?.message ?? String(e) } }));
2503
+ }
2504
+ }
2505
+ else if (msg.type === 'dhf:device:generate') {
2506
+ const requestId = msg.payload?.requestId;
2507
+ try {
2508
+ if (!options.devices)
2509
+ throw new Error('Documents are generated from the working version.');
2510
+ const result = await options.devices.generate(String(msg.payload?.device ?? ''));
2511
+ ws.send(JSON.stringify({ type: 'dhf:device:result', payload: { requestId, success: true, ...result } }));
2512
+ }
2513
+ catch (e) {
2514
+ ws.send(JSON.stringify({ type: 'dhf:device:result', payload: { requestId, success: false, error: e?.message ?? String(e) } }));
2515
+ }
2516
+ }
2517
+ else if (msg.type === 'release:diff') {
2518
+ const requestId = msg.payload?.requestId;
2519
+ try {
2520
+ if (!options.versions)
2521
+ throw new Error('Releases are compared from the working version.');
2522
+ const result = await options.versions.diff(String(msg.payload?.release ?? ''), String(msg.payload?.against ?? 'previous'));
2523
+ ws.send(JSON.stringify({ type: 'release:diff:result', payload: { requestId, ...result } }));
2524
+ }
2525
+ catch (e) {
2526
+ ws.send(JSON.stringify({ type: 'release:diff:result', payload: { requestId, error: e?.message ?? String(e) } }));
2527
+ }
2528
+ }
2142
2529
  else if (msg.type === 'dashboard:save' || msg.type === 'dashboard:delete' || msg.type === 'dashboard:move') {
2143
2530
  // Dashboards are presentation, not model source: they are
2144
2531
  // deliberately absent from MODEL_MUTATION_MESSAGES, so a
@@ -2163,6 +2550,17 @@ Return ONLY a JSON array of strings. Each string is a concise, actionable sugges
2163
2550
  ws.send(JSON.stringify({ type: 'dashboard:result', payload: { requestId: p.requestId, ok: false, error: e?.message ?? String(e) } }));
2164
2551
  }
2165
2552
  }
2553
+ else if (msg.type === 'user-preferences:save') {
2554
+ // Not model source either: one person's choice, written to a
2555
+ // git-ignored file, and only that person's clients hear it.
2556
+ try {
2557
+ const saved = saveUserPreferences(options.projectRoot, msg.payload ?? {});
2558
+ ws.send(JSON.stringify({ type: 'user-preferences', payload: saved }));
2559
+ }
2560
+ catch (e) {
2561
+ console.error('[Preferences] save failed:', e);
2562
+ }
2563
+ }
2166
2564
  else if (msg.type === 'dhf:docs:load') {
2167
2565
  const docs = loadDhfDocs(options.projectRoot);
2168
2566
  ws.send(JSON.stringify({ type: 'dhf:docs', payload: { docs } }));
@@ -2236,8 +2634,7 @@ Return ONLY a JSON array of strings. Each string is a concise, actionable sugges
2236
2634
  rmSync(memoPkgsPath, { recursive: true, force: true });
2237
2635
  }
2238
2636
  // Refresh and broadcast
2239
- const { getPackageMetadata } = await import('@memoarchitect/tools');
2240
- const packages = getPackageMetadata(projectRoot);
2637
+ const packages = options.packageMetadata?.() ?? [];
2241
2638
  const pkgMsg = { type: 'ontology:packages', payload: { packages } };
2242
2639
  for (const client of clients) {
2243
2640
  if (client.readyState === 1)
@@ -2262,6 +2659,32 @@ Return ONLY a JSON array of strings. Each string is a concise, actionable sugges
2262
2659
  catch (e) {
2263
2660
  console.error('WebSocket Error:', e);
2264
2661
  }
2662
+ };
2663
+ // Every write is made from a read of the file it writes, with the compiler
2664
+ // between the two, so two writes in flight would each start from the text
2665
+ // before the other and one would be lost. They run one at a time, in the
2666
+ // order they arrived. A layout message names the whole layout of its
2667
+ // diagram, so one that a newer message for the same diagram has overtaken
2668
+ // is dropped rather than written.
2669
+ ws.on('message', (data) => {
2670
+ let type;
2671
+ let layoutOf;
2672
+ try {
2673
+ const parsed = JSON.parse(data.toString());
2674
+ type = parsed?.type;
2675
+ if (type === 'diagram:layout:update')
2676
+ layoutOf = String(parsed?.payload?.diagramId);
2677
+ }
2678
+ catch { /* the handler reports a message that does not parse */ }
2679
+ if (!type || !isModelMutationMessage(type)) {
2680
+ void handleMessage(data);
2681
+ return;
2682
+ }
2683
+ const seq = layoutOf === undefined ? 0 : (latestLayoutMessage.get(layoutOf) ?? 0) + 1;
2684
+ if (layoutOf !== undefined)
2685
+ latestLayoutMessage.set(layoutOf, seq);
2686
+ const run = mutationQueue.then(() => layoutOf !== undefined && latestLayoutMessage.get(layoutOf) !== seq ? undefined : handleMessage(data));
2687
+ mutationQueue = run.then(() => undefined, () => undefined);
2265
2688
  });
2266
2689
  });
2267
2690
  // Start listening
@@ -2297,6 +2720,21 @@ Return ONLY a JSON array of strings. Each string is a concise, actionable sugges
2297
2720
  }
2298
2721
  }
2299
2722
  },
2723
+ refreshLayouts(files) {
2724
+ const wanted = new Set(files.map(file => file.replaceAll('\\', '/')));
2725
+ const diagrams = currentDiagrams().filter(d => d.sourceFile && wanted.has(d.sourceFile.replaceAll('\\', '/')));
2726
+ const layouts = loadViewLayouts(options.projectRoot, diagrams);
2727
+ // A diagram whose statements are all gone is sent as an empty layout,
2728
+ // or the clients would keep the one they had.
2729
+ for (const diagram of diagrams)
2730
+ layouts[diagram.id] ??= { nodes: {}, edges: {} };
2731
+ if (Object.keys(layouts).length === 0)
2732
+ return;
2733
+ const message = JSON.stringify({ type: 'diagram:layout', payload: { layouts } });
2734
+ for (const client of clients)
2735
+ if (client.readyState === 1)
2736
+ client.send(message);
2737
+ },
2300
2738
  consumeWriteTransactions(files) {
2301
2739
  const matched = {};
2302
2740
  let escalationFile;
@@ -2350,4 +2788,15 @@ Return ONLY a JSON array of strings. Each string is a concise, actionable sugges
2350
2788
  },
2351
2789
  };
2352
2790
  }
2791
+ /** A port nothing is listening on, for a socket that must not collide with another server's. */
2792
+ function freePort(host) {
2793
+ return new Promise((resolvePort, reject) => {
2794
+ const probe = createNetServer();
2795
+ probe.once('error', reject);
2796
+ probe.listen(0, typeof host === 'string' ? host : undefined, () => {
2797
+ const { port } = probe.address();
2798
+ probe.close(() => resolvePort(port));
2799
+ });
2800
+ });
2801
+ }
2353
2802
  //# sourceMappingURL=dev-server.js.map