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