@memoarchitect/tools 0.4.6 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/README.md +5 -5
  2. package/package.json +3 -3
  3. package/packages/tools/lib/bin/memo.js +1 -1
  4. package/packages/tools/lib/browser/index.d.ts +2 -0
  5. package/packages/tools/lib/browser/index.d.ts.map +1 -1
  6. package/packages/tools/lib/browser/index.js +2 -0
  7. package/packages/tools/lib/browser/index.js.map +1 -1
  8. package/packages/tools/lib/commands/create-package.js +1 -1
  9. package/packages/tools/lib/commands/dev.d.ts.map +1 -1
  10. package/packages/tools/lib/commands/dev.js +40 -5
  11. package/packages/tools/lib/commands/dev.js.map +1 -1
  12. package/packages/tools/lib/commands/install.js +1 -1
  13. package/packages/tools/lib/commands/ontology.js +1 -1
  14. package/packages/tools/lib/commands/ontology.js.map +1 -1
  15. package/packages/tools/lib/dhf/document-registry.js +5 -5
  16. package/packages/tools/lib/dhf/document-registry.js.map +1 -1
  17. package/packages/tools/lib/dhf/template-engine.js +3 -3
  18. package/packages/tools/lib/dhf/template-engine.js.map +1 -1
  19. package/packages/tools/lib/importer/cameo-importer.d.ts.map +1 -1
  20. package/packages/tools/lib/importer/cameo-importer.js +5 -2
  21. package/packages/tools/lib/importer/cameo-importer.js.map +1 -1
  22. package/packages/tools/lib/importer/ea-importer.d.ts +1 -1
  23. package/packages/tools/lib/importer/ea-importer.d.ts.map +1 -1
  24. package/packages/tools/lib/importer/ea-importer.js +6 -4
  25. package/packages/tools/lib/importer/ea-importer.js.map +1 -1
  26. package/packages/tools/lib/index.d.ts +2 -0
  27. package/packages/tools/lib/index.d.ts.map +1 -1
  28. package/packages/tools/lib/index.js +2 -0
  29. package/packages/tools/lib/index.js.map +1 -1
  30. package/packages/tools/lib/language/generated/ast.d.ts +409 -42
  31. package/packages/tools/lib/language/generated/ast.d.ts.map +1 -1
  32. package/packages/tools/lib/language/generated/ast.js +318 -12
  33. package/packages/tools/lib/language/generated/ast.js.map +1 -1
  34. package/packages/tools/lib/language/generated/grammar.d.ts.map +1 -1
  35. package/packages/tools/lib/language/generated/grammar.js +1732 -513
  36. package/packages/tools/lib/language/generated/grammar.js.map +1 -1
  37. package/packages/tools/lib/model/builder.d.ts.map +1 -1
  38. package/packages/tools/lib/model/builder.js +38 -14
  39. package/packages/tools/lib/model/builder.js.map +1 -1
  40. package/packages/tools/lib/model/config.d.ts +11 -1
  41. package/packages/tools/lib/model/config.d.ts.map +1 -1
  42. package/packages/tools/lib/model/kind-registry.d.ts +9 -0
  43. package/packages/tools/lib/model/kind-registry.d.ts.map +1 -1
  44. package/packages/tools/lib/model/kind-registry.js +26 -3
  45. package/packages/tools/lib/model/kind-registry.js.map +1 -1
  46. package/packages/tools/lib/model/layer-resolver.d.ts.map +1 -1
  47. package/packages/tools/lib/model/layer-resolver.js +15 -0
  48. package/packages/tools/lib/model/layer-resolver.js.map +1 -1
  49. package/packages/tools/lib/model/ontology-loader.d.ts +2 -0
  50. package/packages/tools/lib/model/ontology-loader.d.ts.map +1 -1
  51. package/packages/tools/lib/model/ontology-loader.js +92 -28
  52. package/packages/tools/lib/model/ontology-loader.js.map +1 -1
  53. package/packages/tools/lib/model/parser-utils.d.ts +9 -0
  54. package/packages/tools/lib/model/parser-utils.d.ts.map +1 -1
  55. package/packages/tools/lib/model/parser-utils.js +24 -0
  56. package/packages/tools/lib/model/parser-utils.js.map +1 -1
  57. package/packages/tools/lib/model/paths.d.ts +0 -2
  58. package/packages/tools/lib/model/paths.d.ts.map +1 -1
  59. package/packages/tools/lib/model/paths.js +0 -2
  60. package/packages/tools/lib/model/paths.js.map +1 -1
  61. package/packages/tools/lib/model/relationship-legality.d.ts +261 -0
  62. package/packages/tools/lib/model/relationship-legality.d.ts.map +1 -0
  63. package/packages/tools/lib/model/relationship-legality.js +391 -0
  64. package/packages/tools/lib/model/relationship-legality.js.map +1 -0
  65. package/packages/tools/lib/model/relationship-registry.d.ts +38 -4
  66. package/packages/tools/lib/model/relationship-registry.d.ts.map +1 -1
  67. package/packages/tools/lib/model/relationship-registry.js +109 -1
  68. package/packages/tools/lib/model/relationship-registry.js.map +1 -1
  69. package/packages/tools/lib/model/semantic.d.ts +42 -0
  70. package/packages/tools/lib/model/semantic.d.ts.map +1 -1
  71. package/packages/tools/lib/model/semantic.js +3 -0
  72. package/packages/tools/lib/model/semantic.js.map +1 -1
  73. package/packages/tools/lib/model/short-id.js +1 -1
  74. package/packages/tools/lib/model/short-id.js.map +1 -1
  75. package/packages/tools/lib/model/source-affinity.d.ts +21 -0
  76. package/packages/tools/lib/model/source-affinity.d.ts.map +1 -0
  77. package/packages/tools/lib/model/source-affinity.js +42 -0
  78. package/packages/tools/lib/model/source-affinity.js.map +1 -0
  79. package/packages/tools/lib/model/source-graph.d.ts +30 -0
  80. package/packages/tools/lib/model/source-graph.d.ts.map +1 -0
  81. package/packages/tools/lib/model/source-graph.js +154 -0
  82. package/packages/tools/lib/model/source-graph.js.map +1 -0
  83. package/packages/tools/lib/model/view-kinds.d.ts.map +1 -1
  84. package/packages/tools/lib/model/view-kinds.js +1 -0
  85. package/packages/tools/lib/model/view-kinds.js.map +1 -1
  86. package/packages/tools/lib/operations/project-snapshot.d.ts.map +1 -1
  87. package/packages/tools/lib/operations/project-snapshot.js +2 -15
  88. package/packages/tools/lib/operations/project-snapshot.js.map +1 -1
  89. package/packages/tools/lib/protocol/messages.d.ts +92 -8
  90. package/packages/tools/lib/protocol/messages.d.ts.map +1 -1
  91. package/packages/tools/lib/server/dev-server.d.ts +16 -0
  92. package/packages/tools/lib/server/dev-server.d.ts.map +1 -1
  93. package/packages/tools/lib/server/dev-server.js +190 -16
  94. package/packages/tools/lib/server/dev-server.js.map +1 -1
  95. package/packages/tools/lib/server/file-watcher.d.ts +21 -2
  96. package/packages/tools/lib/server/file-watcher.d.ts.map +1 -1
  97. package/packages/tools/lib/server/file-watcher.js +55 -23
  98. package/packages/tools/lib/server/file-watcher.js.map +1 -1
  99. package/packages/tools/lib/server/persistor.d.ts +0 -13
  100. package/packages/tools/lib/server/persistor.d.ts.map +1 -1
  101. package/packages/tools/lib/server/persistor.js +3 -31
  102. package/packages/tools/lib/server/persistor.js.map +1 -1
  103. package/packages/tools/lib/server/relationship-writer.d.ts +104 -0
  104. package/packages/tools/lib/server/relationship-writer.d.ts.map +1 -0
  105. package/packages/tools/lib/server/relationship-writer.js +402 -0
  106. package/packages/tools/lib/server/relationship-writer.js.map +1 -0
  107. package/packages/tools/lib/server/view-layout-store.d.ts +14 -1
  108. package/packages/tools/lib/server/view-layout-store.d.ts.map +1 -1
  109. package/packages/tools/lib/server/view-layout-store.js +63 -11
  110. package/packages/tools/lib/server/view-layout-store.js.map +1 -1
  111. package/packages/tools/src/grammar/memo-sysml.langium +102 -18
@@ -3,38 +3,72 @@
3
3
  // Two-scope watchers: project files (hot reload) and ontology files (restart).
4
4
  // ─────────────────────────────────────────────────────────────────────────────
5
5
  import chokidar from 'chokidar';
6
- import { extname, relative, resolve, sep } from 'node:path';
6
+ import { extname, isAbsolute, relative, resolve, sep } from 'node:path';
7
7
  import { existsSync } from 'node:fs';
8
8
  const IGNORED_DIR_NAMES = new Set(['node_modules', '.memo', 'dist', 'lib']);
9
9
  function isInIgnoredDir(filePath) {
10
10
  return resolve(filePath).split(sep).some(part => IGNORED_DIR_NAMES.has(part));
11
11
  }
12
+ /** True when `filePath` is inside `dir` (or is `dir` itself). */
13
+ function isWithin(dir, filePath) {
14
+ const rel = relative(dir, filePath);
15
+ return rel === '' || (rel !== '..' && !rel.startsWith(`..${sep}`) && !isAbsolute(rel));
16
+ }
17
+ /**
18
+ * Debounce a burst of file events into one call, keeping the set of paths seen
19
+ * during the burst. A single save can emit several events, and a branch switch
20
+ * emits hundreds — the caller wants one rebuild and the full list.
21
+ */
12
22
  function makeDebounced(onChange, debounceMs) {
13
23
  let timer = null;
14
- return () => {
24
+ let pending = new Set();
25
+ return (filePath) => {
26
+ pending.add(filePath);
15
27
  if (timer)
16
28
  clearTimeout(timer);
17
29
  timer = setTimeout(() => {
18
30
  timer = null;
19
- onChange();
31
+ const files = [...pending].sort();
32
+ pending = new Set();
33
+ onChange(files);
20
34
  }, debounceMs);
21
35
  };
22
36
  }
23
37
  /**
24
38
  * Watch project source files — triggers hot rebuild.
25
- * Covers model SysML and per-project YAML config files only.
39
+ *
40
+ * The scope deliberately matches what the build ingests: every project-local
41
+ * `.sysml` file, wherever it sits, plus the per-project YAML config files. A
42
+ * narrower scope (model/ only) leaves views and catalogs outside that directory
43
+ * silently stale, which is exactly the class of bug this watcher exists to
44
+ * prevent.
45
+ *
46
+ * The callback receives the project-relative paths that changed, so callers can
47
+ * tell clients what moved rather than only that something did.
26
48
  */
27
- export function createProjectWatcher(projectDir, onChange, debounceMs = 300, usePolling = false) {
28
- const fire = makeDebounced(onChange, debounceMs);
49
+ export function createProjectWatcher(projectDir, onChange, debounceMs = 300, usePolling = false, options = {}) {
50
+ const fire = makeDebounced(onChange, options.debounceMs ?? debounceMs);
29
51
  const root = resolve(projectDir);
30
- const modelRoot = resolve(root, 'model');
31
52
  const configFiles = [
32
53
  resolve(root, 'memo.rendering.yaml'),
33
54
  resolve(root, 'memo.rules.yaml'),
34
55
  resolve(root, 'memo.viewpoints.yaml'),
35
56
  ];
36
- // Chokidar 4 removed glob support. Watch concrete roots/files and filter
37
- // events instead of passing model/**/*.sysml (which silently watches none).
57
+ const ontologyRoots = (options.ontologyRoots ?? []).map(dir => resolve(dir));
58
+ /** Whether a change to this path should rebuild the project model. */
59
+ const isProjectSource = (absolute) => {
60
+ if (configFiles.includes(absolute))
61
+ return true;
62
+ if (extname(absolute).toLowerCase() !== '.sysml')
63
+ return false;
64
+ if (isInIgnoredDir(absolute))
65
+ return false;
66
+ if (!isWithin(root, absolute))
67
+ return false;
68
+ return !ontologyRoots.some(ontologyRoot => isWithin(ontologyRoot, absolute));
69
+ };
70
+ // Chokidar 4 removed glob support. Watch the project root and filter events
71
+ // instead of passing model/**/*.sysml (which silently watches none).
38
72
  const watcher = chokidar.watch(root, {
39
73
  ignored: (filePath, stats) => {
40
74
  const absolute = resolve(filePath);
@@ -42,25 +76,23 @@ export function createProjectWatcher(projectDir, onChange, debounceMs = 300, use
42
76
  return false;
43
77
  if (isInIgnoredDir(absolute))
44
78
  return true;
45
- if (configFiles.includes(absolute))
79
+ // Directories must stay watchable — the files under them are what
80
+ // gets filtered, and a directory has no extension to judge by.
81
+ if (stats && !stats.isFile()) {
82
+ return ontologyRoots.some(ontologyRoot => isWithin(ontologyRoot, absolute));
83
+ }
84
+ if (!stats)
46
85
  return false;
47
- const relToModel = relative(modelRoot, absolute);
48
- const inModel = relToModel !== '..' && !relToModel.startsWith(`..${sep}`);
49
- if (!inModel)
50
- return true;
51
- return stats?.isFile() === true && extname(absolute).toLowerCase() !== '.sysml';
86
+ return !isProjectSource(absolute);
52
87
  },
53
88
  persistent: true,
54
89
  ignoreInitial: true,
55
- usePolling,
90
+ usePolling: options.usePolling ?? usePolling,
56
91
  });
57
92
  watcher.on('all', (_event, filePath) => {
58
93
  const absolute = resolve(filePath);
59
- const inModel = relative(modelRoot, absolute) !== '..'
60
- && !relative(modelRoot, absolute).startsWith(`..${sep}`);
61
- if ((inModel && extname(absolute).toLowerCase() === '.sysml') || configFiles.includes(absolute)) {
62
- fire();
63
- }
94
+ if (isProjectSource(absolute))
95
+ fire(relative(root, absolute));
64
96
  });
65
97
  return {
66
98
  close() { watcher.close(); },
@@ -118,7 +150,7 @@ export function createOntologyWatcher(projectDir, ontologyRoots, onChange, debou
118
150
  * Kept for backward compatibility.
119
151
  */
120
152
  export function createFileWatcher(projectDir, onChange, debounceMs = 300) {
121
- const fire = makeDebounced(onChange, debounceMs);
153
+ const fire = makeDebounced(() => onChange(), debounceMs);
122
154
  const watchedConfigNames = new Set([
123
155
  'memo.config.yaml', 'memo.config.yml', 'memo.package.yaml',
124
156
  'memo.rendering.yaml', 'memo.rules.yaml', 'memo.viewpoints.yaml',
@@ -131,7 +163,7 @@ export function createFileWatcher(projectDir, onChange, debounceMs = 300) {
131
163
  watcher.on('all', (_event, filePath) => {
132
164
  const name = filePath.split(sep).at(-1) ?? '';
133
165
  if (extname(filePath).toLowerCase() === '.sysml' || watchedConfigNames.has(name))
134
- fire();
166
+ fire(filePath);
135
167
  });
136
168
  return {
137
169
  close() { watcher.close(); },
@@ -1 +1 @@
1
- {"version":3,"file":"file-watcher.js","sourceRoot":"","sources":["../../src/server/file-watcher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"file-watcher.js","sourceRoot":"","sources":["../../src/server/file-watcher.ts"],"names":[],"mappings":"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"}
@@ -9,17 +9,4 @@ export declare function saveElementToFile(cwd: string, element: any): {
9
9
  filePath: string;
10
10
  error?: string;
11
11
  };
12
- /**
13
- * Appends a typed relationship connection to model/relationships.sysml.
14
- * Writes: connection : RelType connect sourceId to targetId;
15
- */
16
- export declare function saveRelationshipToFile(cwd: string, rel: {
17
- sourceId: string;
18
- targetId: string;
19
- type: string;
20
- }): {
21
- success: boolean;
22
- filePath: string;
23
- error?: string;
24
- };
25
12
  //# sourceMappingURL=persistor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"persistor.d.ts","sourceRoot":"","sources":["../../src/server/persistor.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAmEnH;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAClC,GAAG,EAAE,MAAM,EACX,GAAG,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC1D;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CA0BxD"}
1
+ {"version":3,"file":"persistor.d.ts","sourceRoot":"","sources":["../../src/server/persistor.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAmEnH"}
@@ -66,35 +66,7 @@ export function saveElementToFile(cwd, element) {
66
66
  return { success: false, filePath: relativePath, error: String(e) };
67
67
  }
68
68
  }
69
- /**
70
- * Appends a typed relationship connection to model/relationships.sysml.
71
- * Writes: connection : RelType connect sourceId to targetId;
72
- */
73
- export function saveRelationshipToFile(cwd, rel) {
74
- const relativePath = 'model/relationships.sysml';
75
- const filePath = resolve(cwd, relativePath);
76
- const dir = dirname(filePath);
77
- if (!existsSync(dir))
78
- mkdirSync(dir, { recursive: true });
79
- const typeName = rel.type.charAt(0).toUpperCase() + rel.type.slice(1);
80
- const line = ` connection : ${typeName} connect ${rel.sourceId} to ${rel.targetId};\n`;
81
- try {
82
- if (!existsSync(filePath)) {
83
- writeFileSync(filePath, `package relationships {\n${line}}\n`, 'utf8');
84
- }
85
- else {
86
- // Insert before the last closing brace
87
- const content = readFileSync(filePath, 'utf8');
88
- const lastBrace = content.lastIndexOf('}');
89
- const newContent = lastBrace !== -1
90
- ? content.slice(0, lastBrace) + line + content.slice(lastBrace)
91
- : content + line;
92
- writeFileSync(filePath, newContent, 'utf8');
93
- }
94
- return { success: true, filePath: relativePath };
95
- }
96
- catch (e) {
97
- return { success: false, filePath: relativePath, error: String(e) };
98
- }
99
- }
69
+ // Relationship persistence lives in ./relationship-writer.ts. It replaces the
70
+ // blind append this module used to do: relationships now go through ontology
71
+ // validation, a deterministic ownership policy, and CST-aware source editing.
100
72
  //# sourceMappingURL=persistor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"persistor.js","sourceRoot":"","sources":["../../src/server/persistor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7F,OAAO,EAAE,OAAO,EAAE,OAAO,EAAQ,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAoB,MAAM,sBAAsB,CAAC;AAEvE;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAW,EAAE,OAAY;IACvD,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,IAAI,uBAAuB,CAAC;IAC7D,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAE5C,6BAA6B;IAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACnB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,4BAA4B;IAC5B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QACrG,aAAa,CAAC,QAAQ,EAAE,WAAW,OAAO,IAAI,WAAW,SAAS,EAAE,MAAM,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAE/C,oDAAoD;IACpD,iFAAiF;IACjF,4BAA4B;IAC5B,MAAM,QAAQ,GAAG,aAAa,CAAC;QAC3B,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,MAAM;QACtC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE;QAC1B,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,EAAE;QACtB,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,EAAE;KACvC,CAAC,CAAC;IAEH,gCAAgC;IAChC,0DAA0D;IAC1D,MAAM,SAAS,GAAG,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;IACpE,MAAM,UAAU,GAAG,IAAI,MAAM,CACzB,aAAa,SAAS,gDAAgD,EACtE,GAAG,CACN,CAAC;IAEF,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC1C,IAAI,UAAkB,CAAC;IAEvB,MAAM,GAAG,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,cAAc,CAAC,oBAAoB,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,CAAC,CAAC;IAC5G,GAAG,CAAC,cAAc,OAAO,CAAC,EAAE,OAAO,QAAQ,kBAAkB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAE/E,IAAI,OAAO,EAAE,CAAC;QACV,GAAG,CAAC,oCAAoC,OAAO,CAAC,EAAE,qBAAqB,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;QACrG,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACvD,CAAC;SAAM,CAAC;QACJ,GAAG,CAAC,oCAAoC,OAAO,CAAC,EAAE,iEAAiE,CAAC,CAAC;QACrH,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;YACnB,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3E,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,IAAI,GAAG,aAAa,GAAG,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACtG,CAAC;aAAM,CAAC;YACJ,UAAU,GAAG,OAAO,GAAG,IAAI,GAAG,QAAQ,GAAG,IAAI,CAAC;QAClD,CAAC;IACL,CAAC;IAED,IAAI,CAAC;QACD,aAAa,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QAC5C,GAAG,CAAC,sBAAsB,UAAU,CAAC,MAAM,aAAa,QAAQ,EAAE,CAAC,CAAC;QACpE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;IACrD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,GAAG,CAAC,gCAAgC,QAAQ,KAAK,CAAC,EAAE,CAAC,CAAC;QACtD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACxE,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAClC,GAAW,EACX,GAAyD;IAEzD,MAAM,YAAY,GAAG,2BAA2B,CAAC;IACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAC5C,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE9B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1D,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACtE,MAAM,IAAI,GAAG,oBAAoB,QAAQ,YAAY,GAAG,CAAC,QAAQ,OAAO,GAAG,CAAC,QAAQ,KAAK,CAAC;IAE1F,IAAI,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxB,aAAa,CAAC,QAAQ,EAAE,4BAA4B,IAAI,KAAK,EAAE,MAAM,CAAC,CAAC;QAC3E,CAAC;aAAM,CAAC;YACJ,uCAAuC;YACvC,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YAC3C,MAAM,UAAU,GAAG,SAAS,KAAK,CAAC,CAAC;gBAC/B,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC;gBAC/D,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC;YACrB,aAAa,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;IACrD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACxE,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"persistor.js","sourceRoot":"","sources":["../../src/server/persistor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ import type { MemoModelDTO, MemoRelationship } from '../model/semantic.js';
2
+ import type { RelationshipCreateRequest, RelationshipDefinitionDTO } from '../model/relationship-legality.js';
3
+ /** Default file used when the project has no better home for a relationship. */
4
+ export declare const CANONICAL_RELATIONSHIP_FILE = "model/relationships.sysml";
5
+ /** Directory segments holding view/presentation SysML — never a relationship home. */
6
+ export declare const DEFAULT_PRESENTATION_DIRS: string[];
7
+ /** Filenames a package uses to collect its relationships. */
8
+ export declare const DEFAULT_RELATIONSHIP_FILE_PATTERN: RegExp;
9
+ export interface RelationshipWriterOptions {
10
+ /** Absolute project root. Nothing outside it is ever written. */
11
+ projectRoot: string;
12
+ /**
13
+ * Per-package designated relationship files, project-relative.
14
+ * Keyed by package qualified name, from project configuration.
15
+ */
16
+ designatedFiles?: Record<string, string>;
17
+ /** Configured canonical relationship file, project-relative. */
18
+ canonicalFile?: string;
19
+ /**
20
+ * Absolute roots of installed ontology/library packages. Files under these
21
+ * are read-only content and are never modified.
22
+ */
23
+ ontologyRoots?: string[];
24
+ /**
25
+ * Directory segments that hold view/presentation SysML. A relationship is a
26
+ * model fact and is never written into one.
27
+ */
28
+ presentationDirs?: string[];
29
+ /** Filenames treated as a package's relationship collection. */
30
+ relationshipFilePattern?: RegExp;
31
+ }
32
+ /** Why a particular file was chosen, for logging and for the UI to show. */
33
+ export type PlacementReason = 'requested' | 'designated-package-file' | 'common-package-file' | 'source-element-file' | 'canonical-file' | 'canonical-file-created';
34
+ export interface RelationshipPlacement {
35
+ /** Project-relative .sysml path that will own the relationship. */
36
+ file: string;
37
+ reason: PlacementReason;
38
+ /** True when the file does not exist yet and will be created. */
39
+ willCreate: boolean;
40
+ }
41
+ export interface RelationshipWriteResult {
42
+ success: boolean;
43
+ /** Project-relative file actually written. */
44
+ sourceFile?: string;
45
+ /** Stable ID (the connection usage name) of the created relationship. */
46
+ relationshipId?: string;
47
+ /** The exact declaration text inserted. */
48
+ declaration?: string;
49
+ placementReason?: PlacementReason;
50
+ error?: string;
51
+ }
52
+ export interface RelationshipRemoveResult {
53
+ success: boolean;
54
+ sourceFile?: string;
55
+ /** The declaration removed, so the caller can offer an exact undo. */
56
+ removedDeclaration?: string;
57
+ error?: string;
58
+ }
59
+ /**
60
+ * Whether a project-relative path is a legal home for a model relationship.
61
+ *
62
+ * Rejects anything outside the project, non-.sysml files, installed ontology
63
+ * content, and the diagram presentation section. Symlinks are resolved before
64
+ * the containment check so an in-tree link cannot escape the project.
65
+ */
66
+ export declare function isWritableRelationshipFile(relativePath: string, options: RelationshipWriterOptions): boolean;
67
+ /**
68
+ * Choose the file that will own a new relationship, deterministically:
69
+ *
70
+ * 1. the file the request explicitly asked for
71
+ * 2. the designated relationship file of the active model package
72
+ * 3. an existing relationships file in the nearest common package of both
73
+ * endpoints, else the source element's own file within that package
74
+ * 4. the configured canonical relationship file, when it already exists
75
+ * 5. the canonical file, created only because nothing above was suitable
76
+ *
77
+ * Every candidate passes isWritableRelationshipFile before it is considered.
78
+ */
79
+ export declare function resolveRelationshipPlacement(request: Pick<RelationshipCreateRequest, 'sourceId' | 'targetId' | 'owningFile'>, model: Pick<MemoModelDTO, 'elements'>, options: RelationshipWriterOptions): RelationshipPlacement;
80
+ /**
81
+ * A stable, explicit relationship ID. Named connection usages are what make a
82
+ * relationship addressable for inspection, deletion, and deep links, so every
83
+ * authored relationship gets one.
84
+ */
85
+ export declare function generateRelationshipId(type: string, sourceId: string, targetId: string, taken: Iterable<string>): string;
86
+ /** Render the typed connection usage for a relationship. */
87
+ export declare function generateRelationshipDeclaration(id: string, definition: RelationshipDefinitionDTO, sourceId: string, targetId: string): string;
88
+ /**
89
+ * Write a relationship into project SysML.
90
+ *
91
+ * The declaration is inserted inside the target package by source offset, the
92
+ * whole updated file is reparsed, and the write is abandoned if the result does
93
+ * not parse or does not contain the new connection.
94
+ */
95
+ export declare function writeRelationship(request: RelationshipCreateRequest, definition: RelationshipDefinitionDTO, model: Pick<MemoModelDTO, 'elements' | 'relationships'>, options: RelationshipWriterOptions): Promise<RelationshipWriteResult>;
96
+ /**
97
+ * Remove exactly one connection usage from its owning file.
98
+ *
99
+ * Only the declaration's own source range is cut — together with the whitespace
100
+ * on its line — so neighbouring comments and declarations are preserved. Both
101
+ * endpoint elements are left completely untouched.
102
+ */
103
+ export declare function removeRelationship(relationship: Pick<MemoRelationship, 'id' | 'file' | 'named'>, options: RelationshipWriterOptions): Promise<RelationshipRemoveResult>;
104
+ //# sourceMappingURL=relationship-writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relationship-writer.d.ts","sourceRoot":"","sources":["../../src/server/relationship-writer.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,KAAK,EACR,yBAAyB,EACzB,yBAAyB,EAC5B,MAAM,mCAAmC,CAAC;AAa3C,gFAAgF;AAChF,eAAO,MAAM,2BAA2B,8BAA8B,CAAC;AAEvE,sFAAsF;AACtF,eAAO,MAAM,yBAAyB,UAAY,CAAC;AAEnD,6DAA6D;AAC7D,eAAO,MAAM,iCAAiC,QAA4B,CAAC;AAE3E,MAAM,WAAW,yBAAyB;IACtC,iEAAiE;IACjE,WAAW,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,gEAAgE;IAChE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,gEAAgE;IAChE,uBAAuB,CAAC,EAAE,MAAM,CAAC;CACpC;AAED,4EAA4E;AAC5E,MAAM,MAAM,eAAe,GACrB,WAAW,GACX,yBAAyB,GACzB,qBAAqB,GACrB,qBAAqB,GACrB,gBAAgB,GAChB,wBAAwB,CAAC;AAE/B,MAAM,WAAW,qBAAqB;IAClC,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,eAAe,CAAC;IACxB,iEAAiE;IACjE,UAAU,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,8CAA8C;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,2CAA2C;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,wBAAwB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAID;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACtC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,yBAAyB,GACnC,OAAO,CAkCT;AAID;;;;;;;;;;;GAWG;AACH,wBAAgB,4BAA4B,CACxC,OAAO,EAAE,IAAI,CAAC,yBAAyB,EAAE,UAAU,GAAG,UAAU,GAAG,YAAY,CAAC,EAChF,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,EACrC,OAAO,EAAE,yBAAyB,GACnC,qBAAqB,CAyCvB;AAgDD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAClC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,GACxB,MAAM,CAQR;AAED,4DAA4D;AAC5D,wBAAgB,+BAA+B,CAC3C,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,yBAAyB,EACrC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACjB,MAAM,CAIR;AAID;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACnC,OAAO,EAAE,yBAAyB,EAClC,UAAU,EAAE,yBAAyB,EACrC,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,UAAU,GAAG,eAAe,CAAC,EACvD,OAAO,EAAE,yBAAyB,GACnC,OAAO,CAAC,uBAAuB,CAAC,CAuDlC;AAoED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACpC,YAAY,EAAE,IAAI,CAAC,gBAAgB,EAAE,IAAI,GAAG,MAAM,GAAG,OAAO,CAAC,EAC7D,OAAO,EAAE,yBAAyB,GACnC,OAAO,CAAC,wBAAwB,CAAC,CA6DnC"}