@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.
- package/README.md +40 -26
- package/corpus/README.md +20 -36
- package/package.json +9 -10
- package/packages/tools/lib/analysis/impact.d.ts +30 -0
- package/packages/tools/lib/analysis/impact.d.ts.map +1 -1
- package/packages/tools/lib/analysis/impact.js +47 -74
- package/packages/tools/lib/analysis/impact.js.map +1 -1
- package/packages/tools/lib/analysis/interfaces-between.d.ts +36 -0
- package/packages/tools/lib/analysis/interfaces-between.d.ts.map +1 -0
- package/packages/tools/lib/analysis/interfaces-between.js +66 -0
- package/packages/tools/lib/analysis/interfaces-between.js.map +1 -0
- package/packages/tools/lib/analysis/suspect-links.d.ts +45 -0
- package/packages/tools/lib/analysis/suspect-links.d.ts.map +1 -0
- package/packages/tools/lib/analysis/suspect-links.js +66 -0
- package/packages/tools/lib/analysis/suspect-links.js.map +1 -0
- package/packages/tools/lib/analysis-starters.d.ts +2 -0
- package/packages/tools/lib/analysis-starters.d.ts.map +1 -1
- package/packages/tools/lib/analysis-starters.js +73 -68
- package/packages/tools/lib/analysis-starters.js.map +1 -1
- package/packages/tools/lib/authoring/outline-identity.d.ts +34 -0
- package/packages/tools/lib/authoring/outline-identity.d.ts.map +1 -0
- package/packages/tools/lib/authoring/outline-identity.js +95 -0
- package/packages/tools/lib/authoring/outline-identity.js.map +1 -0
- package/packages/tools/lib/authoring/outline-source.d.ts +57 -0
- package/packages/tools/lib/authoring/outline-source.d.ts.map +1 -0
- package/packages/tools/lib/authoring/outline-source.js +203 -0
- package/packages/tools/lib/authoring/outline-source.js.map +1 -0
- package/packages/tools/lib/authoring/source-outline.d.ts +82 -0
- package/packages/tools/lib/authoring/source-outline.d.ts.map +1 -0
- package/packages/tools/lib/authoring/source-outline.js +267 -0
- package/packages/tools/lib/authoring/source-outline.js.map +1 -0
- package/packages/tools/lib/bin/memo.js +181 -632
- package/packages/tools/lib/bin/memo.js.map +1 -1
- package/packages/tools/lib/browser/index.d.ts +12 -0
- package/packages/tools/lib/browser/index.d.ts.map +1 -1
- package/packages/tools/lib/browser/index.js +8 -0
- package/packages/tools/lib/browser/index.js.map +1 -1
- package/packages/tools/lib/cli/project-commands.d.ts +3 -0
- package/packages/tools/lib/cli/project-commands.d.ts.map +1 -0
- package/packages/tools/lib/cli/project-commands.js +577 -0
- package/packages/tools/lib/cli/project-commands.js.map +1 -0
- package/packages/tools/lib/commands/ask.d.ts.map +1 -1
- package/packages/tools/lib/commands/ask.js +10 -18
- package/packages/tools/lib/commands/ask.js.map +1 -1
- package/packages/tools/lib/commands/compile.d.ts +18 -0
- package/packages/tools/lib/commands/compile.d.ts.map +1 -0
- package/packages/tools/lib/commands/compile.js +122 -0
- package/packages/tools/lib/commands/compile.js.map +1 -0
- package/packages/tools/lib/commands/convert.js +2 -2
- package/packages/tools/lib/commands/convert.js.map +1 -1
- package/packages/tools/lib/commands/create-package.js +4 -4
- package/packages/tools/lib/commands/create-package.js.map +1 -1
- package/packages/tools/lib/commands/dev.d.ts +20 -2
- package/packages/tools/lib/commands/dev.d.ts.map +1 -1
- package/packages/tools/lib/commands/dev.js +386 -97
- package/packages/tools/lib/commands/dev.js.map +1 -1
- package/packages/tools/lib/commands/dhf-draft.d.ts.map +1 -1
- package/packages/tools/lib/commands/dhf-draft.js +7 -16
- package/packages/tools/lib/commands/dhf-draft.js.map +1 -1
- package/packages/tools/lib/commands/dhf-init.js +3 -3
- package/packages/tools/lib/commands/dhf-init.js.map +1 -1
- package/packages/tools/lib/commands/dhf-lint.d.ts.map +1 -1
- package/packages/tools/lib/commands/dhf-lint.js +4 -3
- package/packages/tools/lib/commands/dhf-lint.js.map +1 -1
- package/packages/tools/lib/commands/dhf-preview.d.ts.map +1 -1
- package/packages/tools/lib/commands/dhf-preview.js +5 -26
- package/packages/tools/lib/commands/dhf-preview.js.map +1 -1
- package/packages/tools/lib/commands/dhf.d.ts +4 -0
- package/packages/tools/lib/commands/dhf.d.ts.map +1 -1
- package/packages/tools/lib/commands/dhf.js +77 -31
- package/packages/tools/lib/commands/dhf.js.map +1 -1
- package/packages/tools/lib/commands/element.d.ts.map +1 -1
- package/packages/tools/lib/commands/element.js +44 -6
- package/packages/tools/lib/commands/element.js.map +1 -1
- package/packages/tools/lib/commands/export.d.ts +1 -1
- package/packages/tools/lib/commands/export.d.ts.map +1 -1
- package/packages/tools/lib/commands/export.js +25 -18
- package/packages/tools/lib/commands/export.js.map +1 -1
- package/packages/tools/lib/commands/generate.d.ts.map +1 -1
- package/packages/tools/lib/commands/generate.js +10 -30
- package/packages/tools/lib/commands/generate.js.map +1 -1
- package/packages/tools/lib/commands/ids-rebase.d.ts +15 -0
- package/packages/tools/lib/commands/ids-rebase.d.ts.map +1 -0
- package/packages/tools/lib/commands/ids-rebase.js +133 -0
- package/packages/tools/lib/commands/ids-rebase.js.map +1 -0
- package/packages/tools/lib/commands/import-ea.d.ts +3 -3
- package/packages/tools/lib/commands/import-ea.d.ts.map +1 -1
- package/packages/tools/lib/commands/import-ea.js +12 -9
- package/packages/tools/lib/commands/import-ea.js.map +1 -1
- package/packages/tools/lib/commands/import-owl.d.ts +1 -1
- package/packages/tools/lib/commands/import-owl.js +2 -2
- package/packages/tools/lib/commands/import-owl.js.map +1 -1
- package/packages/tools/lib/commands/import-sysand.d.ts +1 -1
- package/packages/tools/lib/commands/import-sysand.d.ts.map +1 -1
- package/packages/tools/lib/commands/import-sysand.js +15 -6
- package/packages/tools/lib/commands/import-sysand.js.map +1 -1
- package/packages/tools/lib/commands/import.d.ts +13 -0
- package/packages/tools/lib/commands/import.d.ts.map +1 -1
- package/packages/tools/lib/commands/import.js +89 -29
- package/packages/tools/lib/commands/import.js.map +1 -1
- package/packages/tools/lib/commands/init.d.ts +0 -8
- package/packages/tools/lib/commands/init.d.ts.map +1 -1
- package/packages/tools/lib/commands/init.js +56 -51
- package/packages/tools/lib/commands/init.js.map +1 -1
- package/packages/tools/lib/commands/inspect.d.ts.map +1 -1
- package/packages/tools/lib/commands/inspect.js +22 -15
- package/packages/tools/lib/commands/inspect.js.map +1 -1
- package/packages/tools/lib/commands/install.d.ts.map +1 -1
- package/packages/tools/lib/commands/install.js +9 -6
- package/packages/tools/lib/commands/install.js.map +1 -1
- package/packages/tools/lib/commands/interfaces.d.ts +8 -0
- package/packages/tools/lib/commands/interfaces.d.ts.map +1 -0
- package/packages/tools/lib/commands/interfaces.js +71 -0
- package/packages/tools/lib/commands/interfaces.js.map +1 -0
- package/packages/tools/lib/commands/lock.d.ts.map +1 -1
- package/packages/tools/lib/commands/lock.js +13 -6
- package/packages/tools/lib/commands/lock.js.map +1 -1
- package/packages/tools/lib/commands/mcp.js +7 -7
- package/packages/tools/lib/commands/mcp.js.map +1 -1
- package/packages/tools/lib/commands/migrate-layout.d.ts +5 -0
- package/packages/tools/lib/commands/migrate-layout.d.ts.map +1 -0
- package/packages/tools/lib/commands/migrate-layout.js +90 -0
- package/packages/tools/lib/commands/migrate-layout.js.map +1 -0
- package/packages/tools/lib/commands/ontology.d.ts.map +1 -1
- package/packages/tools/lib/commands/ontology.js +26 -22
- package/packages/tools/lib/commands/ontology.js.map +1 -1
- package/packages/tools/lib/commands/pack.d.ts.map +1 -1
- package/packages/tools/lib/commands/pack.js +14 -9
- package/packages/tools/lib/commands/pack.js.map +1 -1
- package/packages/tools/lib/commands/pinned-target.d.ts +12 -0
- package/packages/tools/lib/commands/pinned-target.d.ts.map +1 -0
- package/packages/tools/lib/commands/pinned-target.js +74 -0
- package/packages/tools/lib/commands/pinned-target.js.map +1 -0
- package/packages/tools/lib/commands/plugin.d.ts.map +1 -1
- package/packages/tools/lib/commands/plugin.js +13 -22
- package/packages/tools/lib/commands/plugin.js.map +1 -1
- package/packages/tools/lib/commands/prune.d.ts +5 -0
- package/packages/tools/lib/commands/prune.d.ts.map +1 -0
- package/packages/tools/lib/commands/prune.js +27 -0
- package/packages/tools/lib/commands/prune.js.map +1 -0
- package/packages/tools/lib/commands/retired.d.ts +10 -0
- package/packages/tools/lib/commands/retired.d.ts.map +1 -0
- package/packages/tools/lib/commands/retired.js +35 -0
- package/packages/tools/lib/commands/retired.js.map +1 -0
- package/packages/tools/lib/commands/rules.d.ts +49 -5
- package/packages/tools/lib/commands/rules.d.ts.map +1 -1
- package/packages/tools/lib/commands/rules.js +340 -172
- package/packages/tools/lib/commands/rules.js.map +1 -1
- package/packages/tools/lib/commands/ship-library.d.ts +4 -0
- package/packages/tools/lib/commands/ship-library.d.ts.map +1 -0
- package/packages/tools/lib/commands/ship-library.js +45 -0
- package/packages/tools/lib/commands/ship-library.js.map +1 -0
- package/packages/tools/lib/commands/standards.d.ts +2 -2
- package/packages/tools/lib/commands/standards.d.ts.map +1 -1
- package/packages/tools/lib/commands/standards.js +78 -33
- package/packages/tools/lib/commands/standards.js.map +1 -1
- package/packages/tools/lib/commands/sysand-publish.d.ts +16 -1
- package/packages/tools/lib/commands/sysand-publish.d.ts.map +1 -1
- package/packages/tools/lib/commands/sysand-publish.js +75 -193
- package/packages/tools/lib/commands/sysand-publish.js.map +1 -1
- package/packages/tools/lib/commands/toolchain.d.ts +5 -0
- package/packages/tools/lib/commands/toolchain.d.ts.map +1 -1
- package/packages/tools/lib/commands/toolchain.js +50 -1
- package/packages/tools/lib/commands/toolchain.js.map +1 -1
- package/packages/tools/lib/commands/validate-client.d.ts +11 -0
- package/packages/tools/lib/commands/validate-client.d.ts.map +1 -0
- package/packages/tools/lib/commands/validate-client.js +54 -0
- package/packages/tools/lib/commands/validate-client.js.map +1 -0
- package/packages/tools/lib/commands/validate.d.ts +33 -2
- package/packages/tools/lib/commands/validate.d.ts.map +1 -1
- package/packages/tools/lib/commands/validate.js +432 -186
- package/packages/tools/lib/commands/validate.js.map +1 -1
- package/packages/tools/lib/dhf/device-dhf.d.ts +57 -0
- package/packages/tools/lib/dhf/device-dhf.d.ts.map +1 -0
- package/packages/tools/lib/dhf/device-dhf.js +152 -0
- package/packages/tools/lib/dhf/device-dhf.js.map +1 -0
- package/packages/tools/lib/dhf/dhf-config-v2.d.ts +1 -1
- package/packages/tools/lib/dhf/dhf-config-v2.d.ts.map +1 -1
- package/packages/tools/lib/dhf/query-engine.d.ts +9 -2
- package/packages/tools/lib/dhf/query-engine.d.ts.map +1 -1
- package/packages/tools/lib/dhf/query-engine.js +29 -25
- package/packages/tools/lib/dhf/query-engine.js.map +1 -1
- package/packages/tools/lib/dhf/query-executor.d.ts +1 -1
- package/packages/tools/lib/dhf/query-executor.js +1 -1
- package/packages/tools/lib/dhf/query-executor.js.map +1 -1
- package/packages/tools/lib/dhf/standards-block.js +1 -1
- package/packages/tools/lib/dhf/standards-block.js.map +1 -1
- package/packages/tools/lib/dhf/standards-library.d.ts.map +1 -1
- package/packages/tools/lib/dhf/standards-library.js +16 -9
- package/packages/tools/lib/dhf/standards-library.js.map +1 -1
- package/packages/tools/lib/dhf/standards-report.d.ts +11 -3
- package/packages/tools/lib/dhf/standards-report.d.ts.map +1 -1
- package/packages/tools/lib/dhf/standards-report.js +43 -13
- package/packages/tools/lib/dhf/standards-report.js.map +1 -1
- package/packages/tools/lib/dhf/template-engine.d.ts +2 -0
- package/packages/tools/lib/dhf/template-engine.d.ts.map +1 -1
- package/packages/tools/lib/dhf/template-engine.js +5 -5
- package/packages/tools/lib/dhf/template-engine.js.map +1 -1
- package/packages/tools/lib/import/import-diff.d.ts +31 -1
- package/packages/tools/lib/import/import-diff.d.ts.map +1 -1
- package/packages/tools/lib/import/import-diff.js +91 -19
- package/packages/tools/lib/import/import-diff.js.map +1 -1
- package/packages/tools/lib/import/import-sources.d.ts +21 -0
- package/packages/tools/lib/import/import-sources.d.ts.map +1 -0
- package/packages/tools/lib/import/import-sources.js +36 -0
- package/packages/tools/lib/import/import-sources.js.map +1 -0
- package/packages/tools/lib/import/reqif.d.ts +23 -0
- package/packages/tools/lib/import/reqif.d.ts.map +1 -0
- package/packages/tools/lib/import/reqif.js +151 -0
- package/packages/tools/lib/import/reqif.js.map +1 -0
- package/packages/tools/lib/import/source-import.d.ts +128 -0
- package/packages/tools/lib/import/source-import.d.ts.map +1 -0
- package/packages/tools/lib/import/source-import.js +305 -0
- package/packages/tools/lib/import/source-import.js.map +1 -0
- package/packages/tools/lib/importer/cameo-importer.d.ts.map +1 -1
- package/packages/tools/lib/importer/cameo-importer.js +4 -1
- package/packages/tools/lib/importer/cameo-importer.js.map +1 -1
- package/packages/tools/lib/importer/ea-importer.d.ts.map +1 -1
- package/packages/tools/lib/importer/ea-importer.js +4 -1
- package/packages/tools/lib/importer/ea-importer.js.map +1 -1
- package/packages/tools/lib/importer/sysand-importer.d.ts +2 -1
- package/packages/tools/lib/importer/sysand-importer.d.ts.map +1 -1
- package/packages/tools/lib/importer/sysand-importer.js +27 -10
- package/packages/tools/lib/importer/sysand-importer.js.map +1 -1
- package/packages/tools/lib/index.d.ts +20 -6
- package/packages/tools/lib/index.d.ts.map +1 -1
- package/packages/tools/lib/index.js +22 -8
- package/packages/tools/lib/index.js.map +1 -1
- package/packages/tools/lib/llm/draft-engine.js +1 -1
- package/packages/tools/lib/llm/draft-engine.js.map +1 -1
- package/packages/tools/lib/llm/model-context.js +1 -1
- package/packages/tools/lib/llm/model-context.js.map +1 -1
- package/packages/tools/lib/lock.d.ts +37 -2
- package/packages/tools/lib/lock.d.ts.map +1 -1
- package/packages/tools/lib/lock.js +93 -8
- package/packages/tools/lib/lock.js.map +1 -1
- package/packages/tools/lib/mcp/index.js +1 -1
- package/packages/tools/lib/mcp/index.js.map +1 -1
- package/packages/tools/lib/mcp/model-loader.d.ts.map +1 -1
- package/packages/tools/lib/mcp/model-loader.js +6 -18
- package/packages/tools/lib/mcp/model-loader.js.map +1 -1
- package/packages/tools/lib/mcp/server.js +2 -2
- package/packages/tools/lib/mcp/server.js.map +1 -1
- package/packages/tools/lib/mcp/tools.d.ts.map +1 -1
- package/packages/tools/lib/mcp/tools.js +5 -4
- package/packages/tools/lib/mcp/tools.js.map +1 -1
- package/packages/tools/lib/methodology/guide-service.d.ts +28 -0
- package/packages/tools/lib/methodology/guide-service.d.ts.map +1 -0
- package/packages/tools/lib/methodology/guide-service.js +32 -0
- package/packages/tools/lib/methodology/guide-service.js.map +1 -0
- package/packages/tools/lib/methodology/guide.d.ts +56 -0
- package/packages/tools/lib/methodology/guide.d.ts.map +1 -0
- package/packages/tools/lib/methodology/guide.js +80 -0
- package/packages/tools/lib/methodology/guide.js.map +1 -0
- package/packages/tools/lib/model/census-projects.d.ts +26 -0
- package/packages/tools/lib/model/census-projects.d.ts.map +1 -0
- package/packages/tools/lib/model/census-projects.js +53 -0
- package/packages/tools/lib/model/census-projects.js.map +1 -0
- package/packages/tools/lib/model/census.d.ts +103 -0
- package/packages/tools/lib/model/census.d.ts.map +1 -0
- package/packages/tools/lib/model/census.js +229 -0
- package/packages/tools/lib/model/census.js.map +1 -0
- package/packages/tools/lib/model/complete-model.d.ts +52 -0
- package/packages/tools/lib/model/complete-model.d.ts.map +1 -0
- package/packages/tools/lib/model/complete-model.js +333 -0
- package/packages/tools/lib/model/complete-model.js.map +1 -0
- package/packages/tools/lib/model/config-loader.d.ts +8 -3
- package/packages/tools/lib/model/config-loader.d.ts.map +1 -1
- package/packages/tools/lib/model/config-loader.js +37 -6
- package/packages/tools/lib/model/config-loader.js.map +1 -1
- package/packages/tools/lib/model/config.d.ts +21 -7
- package/packages/tools/lib/model/config.d.ts.map +1 -1
- package/packages/tools/lib/model/effective-scope.d.ts +55 -28
- package/packages/tools/lib/model/effective-scope.d.ts.map +1 -1
- package/packages/tools/lib/model/effective-scope.js +96 -35
- package/packages/tools/lib/model/effective-scope.js.map +1 -1
- package/packages/tools/lib/model/element-index.d.ts +207 -0
- package/packages/tools/lib/model/element-index.d.ts.map +1 -0
- package/packages/tools/lib/model/element-index.js +316 -0
- package/packages/tools/lib/model/element-index.js.map +1 -0
- package/packages/tools/lib/model/id-rebase.d.ts +35 -0
- package/packages/tools/lib/model/id-rebase.d.ts.map +1 -0
- package/packages/tools/lib/model/id-rebase.js +199 -0
- package/packages/tools/lib/model/id-rebase.js.map +1 -0
- package/packages/tools/lib/model/identity-registry.d.ts +34 -3
- package/packages/tools/lib/model/identity-registry.d.ts.map +1 -1
- package/packages/tools/lib/model/identity-registry.js +40 -7
- package/packages/tools/lib/model/identity-registry.js.map +1 -1
- package/packages/tools/lib/model/impact.d.ts +75 -0
- package/packages/tools/lib/model/impact.d.ts.map +1 -0
- package/packages/tools/lib/model/impact.js +167 -0
- package/packages/tools/lib/model/impact.js.map +1 -0
- package/packages/tools/lib/model/ir-identity.d.ts +3 -51
- package/packages/tools/lib/model/ir-identity.d.ts.map +1 -1
- package/packages/tools/lib/model/ir-identity.js +14 -121
- package/packages/tools/lib/model/ir-identity.js.map +1 -1
- package/packages/tools/lib/model/kind-registry.d.ts +66 -22
- package/packages/tools/lib/model/kind-registry.d.ts.map +1 -1
- package/packages/tools/lib/model/kind-registry.js +104 -145
- package/packages/tools/lib/model/kind-registry.js.map +1 -1
- package/packages/tools/lib/model/manifest.d.ts +2 -2
- package/packages/tools/lib/model/manifest.d.ts.map +1 -1
- package/packages/tools/lib/model/manifest.js +5 -4
- package/packages/tools/lib/model/manifest.js.map +1 -1
- package/packages/tools/lib/model/methodology-loader.d.ts +11 -2
- package/packages/tools/lib/model/methodology-loader.d.ts.map +1 -1
- package/packages/tools/lib/model/methodology-loader.js +24 -130
- package/packages/tools/lib/model/methodology-loader.js.map +1 -1
- package/packages/tools/lib/model/methodology-resolver.d.ts +71 -6
- package/packages/tools/lib/model/methodology-resolver.d.ts.map +1 -1
- package/packages/tools/lib/model/methodology-resolver.js +210 -24
- package/packages/tools/lib/model/methodology-resolver.js.map +1 -1
- package/packages/tools/lib/model/model-diff.d.ts +73 -0
- package/packages/tools/lib/model/model-diff.d.ts.map +1 -0
- package/packages/tools/lib/model/model-diff.js +91 -0
- package/packages/tools/lib/model/model-diff.js.map +1 -0
- package/packages/tools/lib/model/narrow-model.d.ts +9 -0
- package/packages/tools/lib/model/narrow-model.d.ts.map +1 -0
- package/packages/tools/lib/model/narrow-model.js +54 -0
- package/packages/tools/lib/model/narrow-model.js.map +1 -0
- package/packages/tools/lib/model/native-project.d.ts +92 -11
- package/packages/tools/lib/model/native-project.d.ts.map +1 -1
- package/packages/tools/lib/model/native-project.js +163 -269
- package/packages/tools/lib/model/native-project.js.map +1 -1
- package/packages/tools/lib/model/ontology-loader.d.ts +10 -61
- package/packages/tools/lib/model/ontology-loader.d.ts.map +1 -1
- package/packages/tools/lib/model/ontology-loader.js +11 -512
- package/packages/tools/lib/model/ontology-loader.js.map +1 -1
- package/packages/tools/lib/model/package-manifest.d.ts +8 -2
- package/packages/tools/lib/model/package-manifest.d.ts.map +1 -1
- package/packages/tools/lib/model/package-manifest.js +14 -2
- package/packages/tools/lib/model/package-manifest.js.map +1 -1
- package/packages/tools/lib/model/pinned.d.ts +216 -0
- package/packages/tools/lib/model/pinned.d.ts.map +1 -0
- package/packages/tools/lib/model/pinned.js +481 -0
- package/packages/tools/lib/model/pinned.js.map +1 -0
- package/packages/tools/lib/model/project-conversion.d.ts +3 -2
- package/packages/tools/lib/model/project-conversion.d.ts.map +1 -1
- package/packages/tools/lib/model/project-conversion.js +55 -10
- package/packages/tools/lib/model/project-conversion.js.map +1 -1
- package/packages/tools/lib/model/project-settings.d.ts +10 -0
- package/packages/tools/lib/model/project-settings.d.ts.map +1 -0
- package/packages/tools/lib/model/project-settings.js +48 -0
- package/packages/tools/lib/model/project-settings.js.map +1 -0
- package/packages/tools/lib/model/relation-selection.d.ts +25 -0
- package/packages/tools/lib/model/relation-selection.d.ts.map +1 -0
- package/packages/tools/lib/model/relation-selection.js +65 -0
- package/packages/tools/lib/model/relation-selection.js.map +1 -0
- package/packages/tools/lib/model/relationship-legality.d.ts +6 -0
- package/packages/tools/lib/model/relationship-legality.d.ts.map +1 -1
- package/packages/tools/lib/model/relationship-legality.js.map +1 -1
- package/packages/tools/lib/model/relationship-registry.d.ts +21 -8
- package/packages/tools/lib/model/relationship-registry.d.ts.map +1 -1
- package/packages/tools/lib/model/relationship-registry.js +77 -129
- package/packages/tools/lib/model/relationship-registry.js.map +1 -1
- package/packages/tools/lib/model/relationship-subjects.d.ts +28 -0
- package/packages/tools/lib/model/relationship-subjects.d.ts.map +1 -0
- package/packages/tools/lib/model/relationship-subjects.js +126 -0
- package/packages/tools/lib/model/relationship-subjects.js.map +1 -0
- package/packages/tools/lib/model/release-target.d.ts +12 -0
- package/packages/tools/lib/model/release-target.d.ts.map +1 -0
- package/packages/tools/lib/model/release-target.js +35 -0
- package/packages/tools/lib/model/release-target.js.map +1 -0
- package/packages/tools/lib/model/selector-vocabulary.d.ts +47 -0
- package/packages/tools/lib/model/selector-vocabulary.d.ts.map +1 -0
- package/packages/tools/lib/model/selector-vocabulary.js +181 -0
- package/packages/tools/lib/model/selector-vocabulary.js.map +1 -0
- package/packages/tools/lib/model/semantic.d.ts +99 -7
- package/packages/tools/lib/model/semantic.d.ts.map +1 -1
- package/packages/tools/lib/model/semantic.js +13 -1
- package/packages/tools/lib/model/semantic.js.map +1 -1
- package/packages/tools/lib/model/settings-boundary.d.ts.map +1 -1
- package/packages/tools/lib/model/settings-boundary.js +9 -8
- package/packages/tools/lib/model/settings-boundary.js.map +1 -1
- package/packages/tools/lib/model/short-id.d.ts +2 -0
- package/packages/tools/lib/model/short-id.d.ts.map +1 -1
- package/packages/tools/lib/model/short-id.js +9 -0
- package/packages/tools/lib/model/short-id.js.map +1 -1
- package/packages/tools/lib/model/source-graph.d.ts +9 -7
- package/packages/tools/lib/model/source-graph.d.ts.map +1 -1
- package/packages/tools/lib/model/source-graph.js +19 -24
- package/packages/tools/lib/model/source-graph.js.map +1 -1
- package/packages/tools/lib/model/source-provenance.d.ts +5 -1
- package/packages/tools/lib/model/source-provenance.d.ts.map +1 -1
- package/packages/tools/lib/model/source-provenance.js.map +1 -1
- package/packages/tools/lib/model/sysml-files.js +1 -1
- package/packages/tools/lib/model/sysml-ir.d.ts +2 -5
- package/packages/tools/lib/model/sysml-ir.d.ts.map +1 -1
- package/packages/tools/lib/model/sysml-ir.js +1 -100
- package/packages/tools/lib/model/sysml-ir.js.map +1 -1
- package/packages/tools/lib/model/toolchain-merge.d.ts +4 -0
- package/packages/tools/lib/model/toolchain-merge.d.ts.map +1 -0
- package/packages/tools/lib/model/toolchain-merge.js +34 -0
- package/packages/tools/lib/model/toolchain-merge.js.map +1 -0
- package/packages/tools/lib/model/user-settings.d.ts +13 -0
- package/packages/tools/lib/model/user-settings.d.ts.map +1 -0
- package/packages/tools/lib/model/user-settings.js +83 -0
- package/packages/tools/lib/model/user-settings.js.map +1 -0
- package/packages/tools/lib/model/variability.d.ts +56 -0
- package/packages/tools/lib/model/variability.d.ts.map +1 -0
- package/packages/tools/lib/model/variability.js +116 -0
- package/packages/tools/lib/model/variability.js.map +1 -0
- package/packages/tools/lib/model/version-range.d.ts +2 -0
- package/packages/tools/lib/model/version-range.d.ts.map +1 -0
- package/packages/tools/lib/model/version-range.js +37 -0
- package/packages/tools/lib/model/version-range.js.map +1 -0
- package/packages/tools/lib/model/view-deriver.d.ts +16 -0
- package/packages/tools/lib/model/view-deriver.d.ts.map +1 -1
- package/packages/tools/lib/model/view-deriver.js +100 -26
- package/packages/tools/lib/model/view-deriver.js.map +1 -1
- package/packages/tools/lib/model/view-layout-block.d.ts +81 -0
- package/packages/tools/lib/model/view-layout-block.d.ts.map +1 -0
- package/packages/tools/lib/model/view-layout-block.js +525 -0
- package/packages/tools/lib/model/view-layout-block.js.map +1 -0
- package/packages/tools/lib/model/view-layout-migration.d.ts +54 -0
- package/packages/tools/lib/model/view-layout-migration.d.ts.map +1 -0
- package/packages/tools/lib/model/view-layout-migration.js +156 -0
- package/packages/tools/lib/model/view-layout-migration.js.map +1 -0
- package/packages/tools/lib/model/workspace-membership.d.ts +99 -0
- package/packages/tools/lib/model/workspace-membership.d.ts.map +1 -0
- package/packages/tools/lib/model/workspace-membership.js +281 -0
- package/packages/tools/lib/model/workspace-membership.js.map +1 -0
- package/packages/tools/lib/ontology/owl-exporter.d.ts +1 -1
- package/packages/tools/lib/ontology/owl-exporter.d.ts.map +1 -1
- package/packages/tools/lib/ontology/owl-exporter.js +1 -1
- package/packages/tools/lib/ontology/owl-exporter.js.map +1 -1
- package/packages/tools/lib/operations/ai-authoring.d.ts.map +1 -1
- package/packages/tools/lib/operations/ai-authoring.js +7 -5
- package/packages/tools/lib/operations/ai-authoring.js.map +1 -1
- package/packages/tools/lib/operations/authoring.d.ts +10 -4
- package/packages/tools/lib/operations/authoring.d.ts.map +1 -1
- package/packages/tools/lib/operations/authoring.js +27 -11
- package/packages/tools/lib/operations/authoring.js.map +1 -1
- package/packages/tools/lib/operations/index.d.ts +2 -0
- package/packages/tools/lib/operations/index.d.ts.map +1 -1
- package/packages/tools/lib/operations/index.js +1 -0
- package/packages/tools/lib/operations/index.js.map +1 -1
- package/packages/tools/lib/operations/project-snapshot.d.ts.map +1 -1
- package/packages/tools/lib/operations/project-snapshot.js +7 -13
- package/packages/tools/lib/operations/project-snapshot.js.map +1 -1
- package/packages/tools/lib/plugin/plugin-scaffold.js +2 -2
- package/packages/tools/lib/plugin/plugin-scaffold.js.map +1 -1
- package/packages/tools/lib/protocol/messages.d.ts +375 -7
- package/packages/tools/lib/protocol/messages.d.ts.map +1 -1
- package/packages/tools/lib/serializer/csv-io.d.ts +37 -29
- package/packages/tools/lib/serializer/csv-io.d.ts.map +1 -1
- package/packages/tools/lib/serializer/csv-io.js +64 -31
- package/packages/tools/lib/serializer/csv-io.js.map +1 -1
- package/packages/tools/lib/serializer/sysml-generator.d.ts +15 -2
- package/packages/tools/lib/serializer/sysml-generator.d.ts.map +1 -1
- package/packages/tools/lib/serializer/sysml-generator.js +45 -17
- package/packages/tools/lib/serializer/sysml-generator.js.map +1 -1
- package/packages/tools/lib/server/conflict-policy.js +1 -1
- package/packages/tools/lib/server/conflict-policy.js.map +1 -1
- package/packages/tools/lib/server/dashboard-store.d.ts +1 -7
- package/packages/tools/lib/server/dashboard-store.d.ts.map +1 -1
- package/packages/tools/lib/server/dashboard-store.js +3 -14
- package/packages/tools/lib/server/dashboard-store.js.map +1 -1
- package/packages/tools/lib/server/dev-server.d.ts +48 -1
- package/packages/tools/lib/server/dev-server.d.ts.map +1 -1
- package/packages/tools/lib/server/dev-server.js +529 -80
- package/packages/tools/lib/server/dev-server.js.map +1 -1
- package/packages/tools/lib/server/dev-validate.d.ts +30 -0
- package/packages/tools/lib/server/dev-validate.d.ts.map +1 -0
- package/packages/tools/lib/server/dev-validate.js +82 -0
- package/packages/tools/lib/server/dev-validate.js.map +1 -0
- package/packages/tools/lib/server/element-writer.d.ts +4 -1
- package/packages/tools/lib/server/element-writer.d.ts.map +1 -1
- package/packages/tools/lib/server/element-writer.js +56 -35
- package/packages/tools/lib/server/element-writer.js.map +1 -1
- package/packages/tools/lib/server/mutation-domain.d.ts +10 -0
- package/packages/tools/lib/server/mutation-domain.d.ts.map +1 -1
- package/packages/tools/lib/server/mutation-domain.js +45 -8
- package/packages/tools/lib/server/mutation-domain.js.map +1 -1
- package/packages/tools/lib/server/package-source.d.ts +13 -3
- package/packages/tools/lib/server/package-source.d.ts.map +1 -1
- package/packages/tools/lib/server/package-source.js +31 -39
- package/packages/tools/lib/server/package-source.js.map +1 -1
- package/packages/tools/lib/server/package-writer.d.ts +19 -6
- package/packages/tools/lib/server/package-writer.d.ts.map +1 -1
- package/packages/tools/lib/server/package-writer.js +90 -39
- package/packages/tools/lib/server/package-writer.js.map +1 -1
- package/packages/tools/lib/server/persistor.d.ts +33 -7
- package/packages/tools/lib/server/persistor.d.ts.map +1 -1
- package/packages/tools/lib/server/persistor.js +63 -48
- package/packages/tools/lib/server/persistor.js.map +1 -1
- package/packages/tools/lib/server/project-gitignore.d.ts +9 -0
- package/packages/tools/lib/server/project-gitignore.d.ts.map +1 -0
- package/packages/tools/lib/server/project-gitignore.js +27 -0
- package/packages/tools/lib/server/project-gitignore.js.map +1 -0
- package/packages/tools/lib/server/relationship-writer.d.ts +31 -2
- package/packages/tools/lib/server/relationship-writer.d.ts.map +1 -1
- package/packages/tools/lib/server/relationship-writer.js +255 -95
- package/packages/tools/lib/server/relationship-writer.js.map +1 -1
- package/packages/tools/lib/server/release-writer.d.ts +46 -0
- package/packages/tools/lib/server/release-writer.d.ts.map +1 -0
- package/packages/tools/lib/server/release-writer.js +133 -0
- package/packages/tools/lib/server/release-writer.js.map +1 -0
- package/packages/tools/lib/server/rule-policy-writer.d.ts +17 -4
- package/packages/tools/lib/server/rule-policy-writer.d.ts.map +1 -1
- package/packages/tools/lib/server/rule-policy-writer.js +92 -7
- package/packages/tools/lib/server/rule-policy-writer.js.map +1 -1
- package/packages/tools/lib/server/rule-service.d.ts +50 -0
- package/packages/tools/lib/server/rule-service.d.ts.map +1 -0
- package/packages/tools/lib/server/rule-service.js +89 -0
- package/packages/tools/lib/server/rule-service.js.map +1 -0
- package/packages/tools/lib/server/rule-writer.d.ts +87 -0
- package/packages/tools/lib/server/rule-writer.d.ts.map +1 -0
- package/packages/tools/lib/server/rule-writer.js +165 -0
- package/packages/tools/lib/server/rule-writer.js.map +1 -0
- package/packages/tools/lib/server/suspect-review.d.ts +11 -0
- package/packages/tools/lib/server/suspect-review.d.ts.map +1 -0
- package/packages/tools/lib/server/suspect-review.js +28 -0
- package/packages/tools/lib/server/suspect-review.js.map +1 -0
- package/packages/tools/lib/server/sysml-notation.d.ts +1 -1
- package/packages/tools/lib/server/sysml-notation.d.ts.map +1 -1
- package/packages/tools/lib/server/sysml-notation.js +5 -0
- package/packages/tools/lib/server/sysml-notation.js.map +1 -1
- package/packages/tools/lib/server/user-preferences.d.ts +8 -0
- package/packages/tools/lib/server/user-preferences.d.ts.map +1 -0
- package/packages/tools/lib/server/user-preferences.js +47 -0
- package/packages/tools/lib/server/user-preferences.js.map +1 -0
- package/packages/tools/lib/server/version-servers.d.ts +60 -0
- package/packages/tools/lib/server/version-servers.d.ts.map +1 -0
- package/packages/tools/lib/server/version-servers.js +106 -0
- package/packages/tools/lib/server/version-servers.js.map +1 -0
- package/packages/tools/lib/server/view-layout-store.d.ts +28 -13
- package/packages/tools/lib/server/view-layout-store.d.ts.map +1 -1
- package/packages/tools/lib/server/view-layout-store.js +106 -106
- package/packages/tools/lib/server/view-layout-store.js.map +1 -1
- package/packages/tools/lib/server/view-writer.d.ts +22 -2
- package/packages/tools/lib/server/view-writer.d.ts.map +1 -1
- package/packages/tools/lib/server/view-writer.js +99 -44
- package/packages/tools/lib/server/view-writer.js.map +1 -1
- package/packages/tools/lib/server/write-guard.d.ts +7 -0
- package/packages/tools/lib/server/write-guard.d.ts.map +1 -0
- package/packages/tools/lib/server/write-guard.js +77 -0
- package/packages/tools/lib/server/write-guard.js.map +1 -0
- package/packages/tools/lib/stage2/api-model.d.ts +160 -0
- package/packages/tools/lib/stage2/api-model.d.ts.map +1 -0
- package/packages/tools/lib/stage2/api-model.js +341 -0
- package/packages/tools/lib/stage2/api-model.js.map +1 -0
- package/packages/tools/lib/stage2/build-from-api.d.ts +47 -0
- package/packages/tools/lib/stage2/build-from-api.d.ts.map +1 -0
- package/packages/tools/lib/stage2/build-from-api.js +1462 -0
- package/packages/tools/lib/stage2/build-from-api.js.map +1 -0
- package/packages/tools/lib/stage2/guide-from-api.d.ts +38 -0
- package/packages/tools/lib/stage2/guide-from-api.d.ts.map +1 -0
- package/packages/tools/lib/stage2/guide-from-api.js +97 -0
- package/packages/tools/lib/stage2/guide-from-api.js.map +1 -0
- package/packages/tools/lib/stage2/handoff-files.d.ts +13 -0
- package/packages/tools/lib/stage2/handoff-files.d.ts.map +1 -0
- package/packages/tools/lib/stage2/handoff-files.js +32 -0
- package/packages/tools/lib/stage2/handoff-files.js.map +1 -0
- package/packages/tools/lib/stage2/methodology-from-api.d.ts +10 -0
- package/packages/tools/lib/stage2/methodology-from-api.d.ts.map +1 -0
- package/packages/tools/lib/stage2/methodology-from-api.js +109 -0
- package/packages/tools/lib/stage2/methodology-from-api.js.map +1 -0
- package/packages/tools/lib/stage2/package-metadata-from-api.d.ts +15 -0
- package/packages/tools/lib/stage2/package-metadata-from-api.d.ts.map +1 -0
- package/packages/tools/lib/stage2/package-metadata-from-api.js +238 -0
- package/packages/tools/lib/stage2/package-metadata-from-api.js.map +1 -0
- package/packages/tools/lib/stage2/project-from-api.d.ts +60 -0
- package/packages/tools/lib/stage2/project-from-api.d.ts.map +1 -0
- package/packages/tools/lib/stage2/project-from-api.js +328 -0
- package/packages/tools/lib/stage2/project-from-api.js.map +1 -0
- package/packages/tools/lib/stage2/registries-from-api.d.ts +68 -0
- package/packages/tools/lib/stage2/registries-from-api.d.ts.map +1 -0
- package/packages/tools/lib/stage2/registries-from-api.js +313 -0
- package/packages/tools/lib/stage2/registries-from-api.js.map +1 -0
- package/packages/tools/lib/stage2/stage2-from-handoff.d.ts +26 -0
- package/packages/tools/lib/stage2/stage2-from-handoff.d.ts.map +1 -0
- package/packages/tools/lib/stage2/stage2-from-handoff.js +34 -0
- package/packages/tools/lib/stage2/stage2-from-handoff.js.map +1 -0
- package/packages/tools/lib/stage2/sysml-names.d.ts +9 -0
- package/packages/tools/lib/stage2/sysml-names.d.ts.map +1 -0
- package/packages/tools/lib/stage2/sysml-names.js +39 -0
- package/packages/tools/lib/stage2/sysml-names.js.map +1 -0
- package/packages/tools/lib/toolchain/default-registry.d.ts +2 -2
- package/packages/tools/lib/toolchain/default-registry.d.ts.map +1 -1
- package/packages/tools/lib/toolchain/default-registry.js +9 -5
- package/packages/tools/lib/toolchain/default-registry.js.map +1 -1
- package/packages/tools/lib/toolchain/diagnostic.d.ts +2 -2
- package/packages/tools/lib/toolchain/diagnostic.js +1 -1
- package/packages/tools/lib/toolchain/diagnostic.js.map +1 -1
- package/packages/tools/lib/toolchain/effective.d.ts +25 -17
- package/packages/tools/lib/toolchain/effective.d.ts.map +1 -1
- package/packages/tools/lib/toolchain/effective.js +45 -40
- package/packages/tools/lib/toolchain/effective.js.map +1 -1
- package/packages/tools/lib/toolchain/exceptions.d.ts +27 -0
- package/packages/tools/lib/toolchain/exceptions.d.ts.map +1 -0
- package/packages/tools/lib/toolchain/exceptions.js +77 -0
- package/packages/tools/lib/toolchain/exceptions.js.map +1 -0
- package/packages/tools/lib/toolchain/index.d.ts +2 -2
- package/packages/tools/lib/toolchain/index.d.ts.map +1 -1
- package/packages/tools/lib/toolchain/index.js +2 -2
- package/packages/tools/lib/toolchain/index.js.map +1 -1
- package/packages/tools/lib/toolchain/operations.d.ts +45 -10
- package/packages/tools/lib/toolchain/operations.d.ts.map +1 -1
- package/packages/tools/lib/toolchain/operations.js +107 -8
- package/packages/tools/lib/toolchain/operations.js.map +1 -1
- package/packages/tools/lib/toolchain/ownership.d.ts +13 -0
- package/packages/tools/lib/toolchain/ownership.d.ts.map +1 -0
- package/packages/tools/lib/toolchain/ownership.js +57 -0
- package/packages/tools/lib/toolchain/ownership.js.map +1 -0
- package/packages/tools/lib/toolchain/process.d.ts +2 -2
- package/packages/tools/lib/toolchain/process.js +2 -2
- package/packages/tools/lib/toolchain/project-config.d.ts +4 -0
- package/packages/tools/lib/toolchain/project-config.d.ts.map +1 -0
- package/packages/tools/lib/toolchain/project-config.js +13 -0
- package/packages/tools/lib/toolchain/project-config.js.map +1 -0
- package/packages/tools/lib/toolchain/project-model.d.ts +75 -0
- package/packages/tools/lib/toolchain/project-model.d.ts.map +1 -0
- package/packages/tools/lib/toolchain/project-model.js +92 -0
- package/packages/tools/lib/toolchain/project-model.js.map +1 -0
- package/packages/tools/lib/toolchain/providers/internal-package.d.ts +6 -0
- package/packages/tools/lib/toolchain/providers/internal-package.d.ts.map +1 -0
- package/packages/tools/lib/toolchain/providers/internal-package.js +47 -0
- package/packages/tools/lib/toolchain/providers/internal-package.js.map +1 -0
- package/packages/tools/lib/toolchain/providers/opensysml-check.d.ts +20 -0
- package/packages/tools/lib/toolchain/providers/opensysml-check.d.ts.map +1 -0
- package/packages/tools/lib/toolchain/providers/opensysml-check.js +95 -0
- package/packages/tools/lib/toolchain/providers/opensysml-check.js.map +1 -0
- package/packages/tools/lib/toolchain/providers/opensysml-compact.d.ts +17 -0
- package/packages/tools/lib/toolchain/providers/opensysml-compact.d.ts.map +1 -0
- package/packages/tools/lib/toolchain/providers/opensysml-compact.js +69 -0
- package/packages/tools/lib/toolchain/providers/opensysml-compact.js.map +1 -0
- package/packages/tools/lib/toolchain/providers/opensysml-lowering.d.ts +50 -0
- package/packages/tools/lib/toolchain/providers/opensysml-lowering.d.ts.map +1 -0
- package/packages/tools/lib/toolchain/providers/opensysml-lowering.js +646 -0
- package/packages/tools/lib/toolchain/providers/opensysml-lowering.js.map +1 -0
- package/packages/tools/lib/toolchain/providers/opensysml-names.d.ts +16 -0
- package/packages/tools/lib/toolchain/providers/opensysml-names.d.ts.map +1 -0
- package/packages/tools/lib/toolchain/providers/opensysml-names.js +37 -0
- package/packages/tools/lib/toolchain/providers/opensysml-names.js.map +1 -0
- package/packages/tools/lib/toolchain/providers/opensysml.d.ts +88 -0
- package/packages/tools/lib/toolchain/providers/opensysml.d.ts.map +1 -0
- package/packages/tools/lib/toolchain/providers/opensysml.js +178 -0
- package/packages/tools/lib/toolchain/providers/opensysml.js.map +1 -0
- package/packages/tools/lib/toolchain/providers/recommended.d.ts +2 -0
- package/packages/tools/lib/toolchain/providers/recommended.d.ts.map +1 -0
- package/packages/tools/lib/toolchain/providers/recommended.js +13 -0
- package/packages/tools/lib/toolchain/providers/recommended.js.map +1 -0
- package/packages/tools/lib/toolchain/providers/sysand-project.d.ts +60 -0
- package/packages/tools/lib/toolchain/providers/sysand-project.d.ts.map +1 -0
- package/packages/tools/lib/toolchain/providers/sysand-project.js +160 -0
- package/packages/tools/lib/toolchain/providers/sysand-project.js.map +1 -0
- package/packages/tools/lib/toolchain/providers/sysand.d.ts.map +1 -1
- package/packages/tools/lib/toolchain/providers/sysand.js +26 -2
- package/packages/tools/lib/toolchain/providers/sysand.js.map +1 -1
- package/packages/tools/lib/toolchain/providers/syside-lowering.d.ts +29 -0
- package/packages/tools/lib/toolchain/providers/syside-lowering.d.ts.map +1 -0
- package/packages/tools/lib/toolchain/providers/syside-lowering.js +497 -0
- package/packages/tools/lib/toolchain/providers/syside-lowering.js.map +1 -0
- package/packages/tools/lib/toolchain/providers/syside-python.d.ts +9 -0
- package/packages/tools/lib/toolchain/providers/syside-python.d.ts.map +1 -0
- package/packages/tools/lib/toolchain/providers/syside-python.js +69 -0
- package/packages/tools/lib/toolchain/providers/syside-python.js.map +1 -0
- package/packages/tools/lib/toolchain/providers/syside.d.ts.map +1 -1
- package/packages/tools/lib/toolchain/providers/syside.js +2 -0
- package/packages/tools/lib/toolchain/providers/syside.js.map +1 -1
- package/packages/tools/lib/toolchain/registry.d.ts +118 -21
- package/packages/tools/lib/toolchain/registry.d.ts.map +1 -1
- package/packages/tools/lib/toolchain/registry.js +18 -24
- package/packages/tools/lib/toolchain/registry.js.map +1 -1
- package/packages/tools/lib/toolchain/schema.d.ts +6 -5
- package/packages/tools/lib/toolchain/schema.d.ts.map +1 -1
- package/packages/tools/lib/toolchain/schema.js +8 -13
- package/packages/tools/lib/toolchain/schema.js.map +1 -1
- package/packages/tools/lib/toolchain/shipped-library.d.ts +28 -0
- package/packages/tools/lib/toolchain/shipped-library.d.ts.map +1 -0
- package/packages/tools/lib/toolchain/shipped-library.js +120 -0
- package/packages/tools/lib/toolchain/shipped-library.js.map +1 -0
- package/packages/tools/lib/toolchain/source-fingerprint.d.ts +2 -0
- package/packages/tools/lib/toolchain/source-fingerprint.d.ts.map +1 -0
- package/packages/tools/lib/toolchain/source-fingerprint.js +30 -0
- package/packages/tools/lib/toolchain/source-fingerprint.js.map +1 -0
- package/packages/tools/lib/toolchain/user-settings-status.d.ts +51 -0
- package/packages/tools/lib/toolchain/user-settings-status.d.ts.map +1 -0
- package/packages/tools/lib/toolchain/user-settings-status.js +104 -0
- package/packages/tools/lib/toolchain/user-settings-status.js.map +1 -0
- package/packages/tools/lib/validator/architecture-validator.d.ts.map +1 -1
- package/packages/tools/lib/validator/architecture-validator.js +2 -1
- package/packages/tools/lib/validator/architecture-validator.js.map +1 -1
- package/packages/tools/lib/validator/behavior-validator.js +1 -1
- package/packages/tools/lib/validator/behavior-validator.js.map +1 -1
- package/packages/tools/lib/validator/builtin-rules.js +1 -1
- package/packages/tools/lib/validator/builtin-rules.js.map +1 -1
- package/packages/tools/lib/validator/constraint-eval.d.ts +30 -4
- package/packages/tools/lib/validator/constraint-eval.d.ts.map +1 -1
- package/packages/tools/lib/validator/constraint-eval.js +101 -59
- package/packages/tools/lib/validator/constraint-eval.js.map +1 -1
- package/packages/tools/lib/validator/constraint-loader-api.d.ts +22 -0
- package/packages/tools/lib/validator/constraint-loader-api.d.ts.map +1 -0
- package/packages/tools/lib/validator/constraint-loader-api.js +160 -0
- package/packages/tools/lib/validator/constraint-loader-api.js.map +1 -0
- package/packages/tools/lib/validator/constraint-loader.d.ts +22 -18
- package/packages/tools/lib/validator/constraint-loader.d.ts.map +1 -1
- package/packages/tools/lib/validator/constraint-loader.js +33 -141
- package/packages/tools/lib/validator/constraint-loader.js.map +1 -1
- package/packages/tools/lib/validator/rule-clauses.d.ts +51 -0
- package/packages/tools/lib/validator/rule-clauses.d.ts.map +1 -0
- package/packages/tools/lib/validator/rule-clauses.js +87 -0
- package/packages/tools/lib/validator/rule-clauses.js.map +1 -0
- package/packages/tools/lib/validator/rule-engine.d.ts +9 -1
- package/packages/tools/lib/validator/rule-engine.d.ts.map +1 -1
- package/packages/tools/lib/validator/rule-engine.js +50 -6
- package/packages/tools/lib/validator/rule-engine.js.map +1 -1
- package/packages/tools/lib/validator/rule-registry.d.ts +4 -8
- package/packages/tools/lib/validator/rule-registry.d.ts.map +1 -1
- package/packages/tools/lib/validator/rule-registry.js +42 -79
- package/packages/tools/lib/validator/rule-registry.js.map +1 -1
- package/packages/tools/lib/validator/rule-tailoring.d.ts +62 -0
- package/packages/tools/lib/validator/rule-tailoring.d.ts.map +1 -0
- package/packages/tools/lib/validator/rule-tailoring.js +85 -0
- package/packages/tools/lib/validator/rule-tailoring.js.map +1 -0
- package/packages/tools/lib/validator/types.d.ts +12 -1
- package/packages/tools/lib/validator/types.d.ts.map +1 -1
- package/packages/tools/lib/validator/workspace-boundary-validator.d.ts +9 -0
- package/packages/tools/lib/validator/workspace-boundary-validator.d.ts.map +1 -0
- package/packages/tools/lib/validator/workspace-boundary-validator.js +28 -0
- package/packages/tools/lib/validator/workspace-boundary-validator.js.map +1 -0
- package/packages/tools/python/memo_model.py +243 -0
- package/packages/tools/python/memo_stage1_syside.py +389 -0
- package/packages/tools/lib/commands/check.d.ts +0 -6
- package/packages/tools/lib/commands/check.d.ts.map +0 -1
- package/packages/tools/lib/commands/check.js +0 -191
- package/packages/tools/lib/commands/check.js.map +0 -1
- package/packages/tools/lib/commands/conformance.d.ts +0 -36
- package/packages/tools/lib/commands/conformance.d.ts.map +0 -1
- package/packages/tools/lib/commands/conformance.js +0 -212
- package/packages/tools/lib/commands/conformance.js.map +0 -1
- package/packages/tools/lib/commands/roundtrip.d.ts +0 -6
- package/packages/tools/lib/commands/roundtrip.d.ts.map +0 -1
- package/packages/tools/lib/commands/roundtrip.js +0 -145
- package/packages/tools/lib/commands/roundtrip.js.map +0 -1
- package/packages/tools/lib/conformance/baseline.d.ts +0 -26
- package/packages/tools/lib/conformance/baseline.d.ts.map +0 -1
- package/packages/tools/lib/conformance/baseline.js +0 -170
- package/packages/tools/lib/conformance/baseline.js.map +0 -1
- package/packages/tools/lib/conformance/bnf.d.ts +0 -84
- package/packages/tools/lib/conformance/bnf.d.ts.map +0 -1
- package/packages/tools/lib/conformance/bnf.js +0 -166
- package/packages/tools/lib/conformance/bnf.js.map +0 -1
- package/packages/tools/lib/conformance/corpus.d.ts +0 -125
- package/packages/tools/lib/conformance/corpus.d.ts.map +0 -1
- package/packages/tools/lib/conformance/corpus.js +0 -190
- package/packages/tools/lib/conformance/corpus.js.map +0 -1
- package/packages/tools/lib/conformance/diff-xmi.d.ts +0 -118
- package/packages/tools/lib/conformance/diff-xmi.d.ts.map +0 -1
- package/packages/tools/lib/conformance/diff-xmi.js +0 -276
- package/packages/tools/lib/conformance/diff-xmi.js.map +0 -1
- package/packages/tools/lib/conformance/generated/syside-rules.d.ts +0 -10
- package/packages/tools/lib/conformance/generated/syside-rules.d.ts.map +0 -1
- package/packages/tools/lib/conformance/generated/syside-rules.js +0 -1142
- package/packages/tools/lib/conformance/generated/syside-rules.js.map +0 -1
- package/packages/tools/lib/conformance/index.d.ts +0 -7
- package/packages/tools/lib/conformance/index.d.ts.map +0 -1
- package/packages/tools/lib/conformance/index.js +0 -19
- package/packages/tools/lib/conformance/index.js.map +0 -1
- package/packages/tools/lib/conformance/run.d.ts +0 -117
- package/packages/tools/lib/conformance/run.d.ts.map +0 -1
- package/packages/tools/lib/conformance/run.js +0 -0
- package/packages/tools/lib/conformance/run.js.map +0 -1
- package/packages/tools/lib/conformance/xmi.d.ts +0 -45
- package/packages/tools/lib/conformance/xmi.d.ts.map +0 -1
- package/packages/tools/lib/conformance/xmi.js +0 -148
- package/packages/tools/lib/conformance/xmi.js.map +0 -1
- package/packages/tools/lib/language/generated/ast.d.ts +0 -3571
- package/packages/tools/lib/language/generated/ast.d.ts.map +0 -1
- package/packages/tools/lib/language/generated/ast.js +0 -2980
- package/packages/tools/lib/language/generated/ast.js.map +0 -1
- package/packages/tools/lib/language/generated/grammar.d.ts +0 -7
- package/packages/tools/lib/language/generated/grammar.d.ts.map +0 -1
- package/packages/tools/lib/language/generated/grammar.js +0 -10687
- package/packages/tools/lib/language/generated/grammar.js.map +0 -1
- package/packages/tools/lib/language/generated/module.d.ts +0 -14
- package/packages/tools/lib/language/generated/module.d.ts.map +0 -1
- package/packages/tools/lib/language/generated/module.js +0 -21
- package/packages/tools/lib/language/generated/module.js.map +0 -1
- package/packages/tools/lib/language/memo-sysml-module.d.ts +0 -24
- package/packages/tools/lib/language/memo-sysml-module.d.ts.map +0 -1
- package/packages/tools/lib/language/memo-sysml-module.js +0 -20
- package/packages/tools/lib/language/memo-sysml-module.js.map +0 -1
- package/packages/tools/lib/model/builder.d.ts +0 -27
- package/packages/tools/lib/model/builder.d.ts.map +0 -1
- package/packages/tools/lib/model/builder.js +0 -2112
- package/packages/tools/lib/model/builder.js.map +0 -1
- package/packages/tools/lib/model/package-registry.d.ts +0 -64
- package/packages/tools/lib/model/package-registry.d.ts.map +0 -1
- package/packages/tools/lib/model/package-registry.js +0 -184
- package/packages/tools/lib/model/package-registry.js.map +0 -1
- package/packages/tools/lib/model/parser-utils.d.ts +0 -65
- package/packages/tools/lib/model/parser-utils.d.ts.map +0 -1
- package/packages/tools/lib/model/parser-utils.js +0 -201
- package/packages/tools/lib/model/parser-utils.js.map +0 -1
- package/packages/tools/lib/sysmlc/bin/memo-sysmlc.d.ts +0 -3
- package/packages/tools/lib/sysmlc/bin/memo-sysmlc.d.ts.map +0 -1
- package/packages/tools/lib/sysmlc/bin/memo-sysmlc.js +0 -97
- package/packages/tools/lib/sysmlc/bin/memo-sysmlc.js.map +0 -1
- package/packages/tools/lib/sysmlc/index.d.ts +0 -2
- package/packages/tools/lib/sysmlc/index.d.ts.map +0 -1
- package/packages/tools/lib/sysmlc/index.js +0 -7
- package/packages/tools/lib/sysmlc/index.js.map +0 -1
- package/packages/tools/lib/sysmlc/server.d.ts +0 -29
- package/packages/tools/lib/sysmlc/server.d.ts.map +0 -1
- package/packages/tools/lib/sysmlc/server.js +0 -168
- package/packages/tools/lib/sysmlc/server.js.map +0 -1
- package/packages/tools/lib/toolchain/lowering.d.ts +0 -63
- package/packages/tools/lib/toolchain/lowering.d.ts.map +0 -1
- package/packages/tools/lib/toolchain/lowering.js +0 -100
- package/packages/tools/lib/toolchain/lowering.js.map +0 -1
- package/packages/tools/lib/toolchain/providers/internal.d.ts +0 -33
- package/packages/tools/lib/toolchain/providers/internal.d.ts.map +0 -1
- package/packages/tools/lib/toolchain/providers/internal.js +0 -286
- package/packages/tools/lib/toolchain/providers/internal.js.map +0 -1
- package/packages/tools/lib/toolchain/sysmlc-client.d.ts +0 -77
- package/packages/tools/lib/toolchain/sysmlc-client.d.ts.map +0 -1
- package/packages/tools/lib/toolchain/sysmlc-client.js +0 -0
- package/packages/tools/lib/toolchain/sysmlc-client.js.map +0 -1
- package/packages/tools/lib/validator/sysml-constraints.d.ts +0 -64
- package/packages/tools/lib/validator/sysml-constraints.d.ts.map +0 -1
- package/packages/tools/lib/validator/sysml-constraints.js +0 -251
- package/packages/tools/lib/validator/sysml-constraints.js.map +0 -1
- 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 {
|
|
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 {
|
|
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
|
-
|
|
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
|
|
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
|
|
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 {
|
|
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) : {
|
|
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
|
|
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 =
|
|
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
|
-
/**
|
|
1087
|
-
|
|
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 {
|
|
1090
|
-
const {
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
1397
|
-
// derived diagram then carrying a `sourceFile` —
|
|
1398
|
-
//
|
|
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
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
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 =
|
|
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:
|
|
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 =
|
|
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:
|
|
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:
|
|
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 =
|
|
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:
|
|
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
|
-
|
|
1827
|
-
|
|
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,
|
|
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
|
-
|
|
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 {
|
|
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 =
|
|
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,
|
|
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 =
|
|
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,
|
|
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 =
|
|
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
|
|
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
|