@memoarchitect/architect 0.6.6 → 0.8.26

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 (93) hide show
  1. package/README.md +26 -4
  2. package/dist/assets/AiWorkspace-Z3BbnmaP.js +7 -0
  3. package/dist/assets/AnalysisWorkspace-DjaUOo7U.js +39 -0
  4. package/dist/assets/{ComplianceWizard-k98NZ2ec.js → ComplianceWizard-DKxZ1z25.js} +1 -1
  5. package/dist/assets/DSMView-DJhmrXYm.js +5 -0
  6. package/dist/assets/Dashboard-CYT7KjqU.js +1 -0
  7. package/dist/assets/DhfDashboard-DacdOtkU.js +1 -0
  8. package/dist/assets/DhfWorkbench-CIhopT8J.js +69 -0
  9. package/dist/assets/DiagramCanvas-CLE_nv7Y.js +4 -0
  10. package/dist/assets/DiagramEditor-puQuE8gB.js +4 -0
  11. package/dist/assets/DiagramToolbarControls-XMGLx08e.js +1 -0
  12. package/dist/assets/ElementDetailView-D5XvAL_i.js +2 -0
  13. package/dist/assets/ExplorerTreeRow-DUmcEsqf.js +3 -0
  14. package/dist/assets/{ImportView-CyMm-tSP.js → ImportView-9y1nhQS4.js} +1 -1
  15. package/dist/assets/{LayerGrid-DNPZYTsD.js → LayerGrid-bhFpOIbe.js} +1 -1
  16. package/dist/assets/{LayerTable-DhOq1DHo.js → LayerTable-RuswZVUI.js} +2 -2
  17. package/dist/assets/{MaxGraphCanvas-DqKU1PTY.js → MaxGraphCanvas-D3BXQK2y.js} +6 -6
  18. package/dist/assets/{ModelDiff-BbqIoesG.js → ModelDiff-Cl2dhlk3.js} +1 -1
  19. package/dist/assets/OntologyDecompositionDiagram-aONGngg4.js +1 -0
  20. package/dist/assets/{OntologyViewer-BIpJC66j.js → OntologyViewer-VOrKTRuQ.js} +2 -2
  21. package/dist/assets/{RelationshipOverlay-B9bqt4zl.js → RelationshipOverlay-B3AN-bM-.js} +1 -1
  22. package/dist/assets/{RelationshipsSection-DttMvF2i.js → RelationshipsSection-DggeGBKP.js} +1 -1
  23. package/dist/assets/{ReviewDashboard-DKoExM8K.js → ReviewDashboard--LMXZ3F4.js} +1 -1
  24. package/dist/assets/ScenarioEditor-bB4iBbgO.js +3 -0
  25. package/dist/assets/{StatisticsDashboard-B8BduIDz.js → StatisticsDashboard-iXimfU20.js} +1 -1
  26. package/dist/assets/{SysmlCodeEditor-Die2RUsz.js → SysmlCodeEditor-i0BHj3of.js} +117 -117
  27. package/dist/assets/TabularView-DnIfq-TB.js +1 -0
  28. package/dist/assets/TraceabilityMatrix-eilGn6Sr.js +3 -0
  29. package/dist/assets/UiScreensWorkspace-Cs1ivqzc.js +1 -0
  30. package/dist/assets/{WorkflowWizard-7--f9OH2.js → WorkflowWizard-C7jI6C59.js} +1 -1
  31. package/dist/assets/html2canvas.esm-QH1iLAAe.js +22 -0
  32. package/dist/assets/index-CG-gfw-s.js +4067 -0
  33. package/dist/assets/index-DXB4CKwW.css +1 -0
  34. package/dist/assets/index.es-DABt8CUc.js +18 -0
  35. package/dist/assets/jspdf.es.min-G-Vwo9yG.js +170 -0
  36. package/dist/assets/{layout-providers-Dr743WlP.js → layout-providers-BSDYNZu0.js} +1 -1
  37. package/dist/assets/notation-scene-DLZms6VR.js +1 -0
  38. package/dist/assets/purify.es-DP5U8-sc.js +3 -0
  39. package/dist/assets/{reactflow-CsCqNKB-.js → reactflow-C9OlmOYw.js} +5 -5
  40. package/dist/assets/xlsx-CkFp8p6R.js +105 -0
  41. package/dist/index.html +3 -3
  42. package/dist-standalone/index.html +5504 -0
  43. package/lib/__tests__/compiler-bundling.test.d.ts +2 -0
  44. package/lib/__tests__/compiler-bundling.test.d.ts.map +1 -0
  45. package/lib/__tests__/compiler-bundling.test.js +32 -0
  46. package/lib/__tests__/compiler-bundling.test.js.map +1 -0
  47. package/lib/__tests__/standalone-distribution.test.d.ts +2 -0
  48. package/lib/__tests__/standalone-distribution.test.d.ts.map +1 -0
  49. package/lib/__tests__/standalone-distribution.test.js +51 -0
  50. package/lib/__tests__/standalone-distribution.test.js.map +1 -0
  51. package/lib/__tests__/standard-sysml-diagrams-smoke.test.d.ts +2 -0
  52. package/lib/__tests__/standard-sysml-diagrams-smoke.test.d.ts.map +1 -0
  53. package/lib/__tests__/standard-sysml-diagrams-smoke.test.js +22 -0
  54. package/lib/__tests__/standard-sysml-diagrams-smoke.test.js.map +1 -0
  55. package/lib/__tests__/supervised-child-args.test.d.ts +2 -0
  56. package/lib/__tests__/supervised-child-args.test.d.ts.map +1 -0
  57. package/lib/__tests__/supervised-child-args.test.js +55 -0
  58. package/lib/__tests__/supervised-child-args.test.js.map +1 -0
  59. package/lib/bin/memo-architect.js +30 -4
  60. package/lib/bin/memo-architect.js.map +1 -1
  61. package/lib/commands/build.d.ts.map +1 -1
  62. package/lib/commands/build.js +15 -18
  63. package/lib/commands/build.js.map +1 -1
  64. package/lib/commands/dev.d.ts +32 -2
  65. package/lib/commands/dev.d.ts.map +1 -1
  66. package/lib/commands/dev.js +95 -8
  67. package/lib/commands/dev.js.map +1 -1
  68. package/lib/commands/example.d.ts +1 -0
  69. package/lib/commands/example.d.ts.map +1 -1
  70. package/lib/commands/example.js +2 -0
  71. package/lib/commands/example.js.map +1 -1
  72. package/lib/feature-grants.d.ts.map +1 -1
  73. package/lib/feature-grants.js +3 -1
  74. package/lib/feature-grants.js.map +1 -1
  75. package/package.json +16 -6
  76. package/dist/assets/AiWorkspace-DS79vBOT.js +0 -3
  77. package/dist/assets/AnalysisWorkspace-D_u4shRY.js +0 -39
  78. package/dist/assets/DSMView-DGheBwZ0.js +0 -1
  79. package/dist/assets/Dashboard-BRUQvUFK.js +0 -1
  80. package/dist/assets/DhfDashboard-B9V_n7kg.js +0 -1
  81. package/dist/assets/DhfSettingsPanel-B8aLsWn6.js +0 -1
  82. package/dist/assets/DhfWorkbench-TOnZkdUU.js +0 -69
  83. package/dist/assets/DiagramCanvas-B9d4aLKt.js +0 -1
  84. package/dist/assets/DiagramEditor-CJ7OG2IC.js +0 -4
  85. package/dist/assets/ElementDetailView-CDcm1rvf.js +0 -2
  86. package/dist/assets/OntologyDecompositionDiagram-DkxTe2C_.js +0 -1
  87. package/dist/assets/ScenarioEditor-JQ3huCnz.js +0 -3
  88. package/dist/assets/TabularView-BXfFSluC.js +0 -1
  89. package/dist/assets/TraceabilityMatrix-CHZHFucA.js +0 -1
  90. package/dist/assets/editor.worker-DyuDvpVp.js +0 -26
  91. package/dist/assets/index-CVW92JY7.js +0 -3280
  92. package/dist/assets/index-Y1UZTZg-.css +0 -1
  93. package/dist/assets/layout-selection-ClQ295Xc.js +0 -1
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=compiler-bundling.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compiler-bundling.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/compiler-bundling.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,32 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { dirname, resolve } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { describe, expect, it } from 'vitest';
5
+ // ─── Architect delegates compiler selection to tools ─────────────────────────
6
+ //
7
+ // "The user is responsible for PATH" governs third-party validators. It has
8
+ // never governed MEMO's own compiler: a default install has to compile and draw
9
+ // with nothing installed and nothing configured. Architect therefore *bundles*
10
+ // its bundled `memo-sysmlc` default, SysIDE, or another configured provider.
11
+ //
12
+ // Resolving and spawning it stays in MEMO Tools (§1.2.2 rule 4). Architect's
13
+ // whole part in this is the tools dependency; that is what this test pins.
14
+ const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), '../..');
15
+ const manifest = JSON.parse(readFileSync(resolve(ROOT, 'package.json'), 'utf8'));
16
+ describe('Architect delegates compiler selection to tools', () => {
17
+ it('declares tools, not a fixed compiler, as its runtime dependency', () => {
18
+ expect(Object.keys(manifest.dependencies)).toContain('@memoarchitect/tools');
19
+ expect(Object.keys(manifest.dependencies)).not.toContain('@memoarchitect/sysmlc');
20
+ });
21
+ it('does not declare a second compiler package', () => {
22
+ expect(manifest.dependencies['@memoarchitect/sysmlc']).toBeUndefined();
23
+ });
24
+ it('does not reach for the compiler itself', () => {
25
+ // Architect calls MEMO Tools; MEMO Tools spawns the compiler. An
26
+ // Architect that knew how to start `memo-sysmlc` would be a second
27
+ // implementation of an operation that already has one.
28
+ const dev = readFileSync(resolve(ROOT, 'src/commands/dev.ts'), 'utf8');
29
+ expect(dev).not.toMatch(/memo-sysmlc/);
30
+ });
31
+ });
32
+ //# sourceMappingURL=compiler-bundling.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compiler-bundling.test.js","sourceRoot":"","sources":["../../src/__tests__/compiler-bundling.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,gFAAgF;AAChF,EAAE;AACF,4EAA4E;AAC5E,gFAAgF;AAChF,+EAA+E;AAC/E,6EAA6E;AAC7E,EAAE;AACF,6EAA6E;AAC7E,2EAA2E;AAE3E,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAEjF,QAAQ,CAAC,iDAAiD,EAAE,GAAG,EAAE;IAC7D,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACvE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAC7E,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,uBAAuB,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAC9C,iEAAiE;QACjE,mEAAmE;QACnE,uDAAuD;QACvD,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,qBAAqB,CAAC,EAAE,MAAM,CAAC,CAAC;QACvE,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=standalone-distribution.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standalone-distribution.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/standalone-distribution.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,51 @@
1
+ import { existsSync, readFileSync, statSync } from 'node:fs';
2
+ import { dirname, resolve } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { describe, expect, it } from 'vitest';
5
+ // ─── The standalone distribution is one file with nothing to fetch ───────────
6
+ //
7
+ // `memo-architect build --standalone` exists so a viewer can be opened off
8
+ // disk. Two things make that possible and neither is visible in the source: the
9
+ // build must leave no reference to a second file, and it must not reach the
10
+ // network. Both were broken before — the flag inlined the entry script but left
11
+ // its chunk imports pointing at `/assets/…`, so the page 404'd when served and
12
+ // died on CORS when opened, and it did that silently, as a blank screen.
13
+ //
14
+ // These assertions are on the built artefact rather than on the config, because
15
+ // the config is not what the user opens.
16
+ // ─────────────────────────────────────────────────────────────────────────────
17
+ const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), '../..');
18
+ const INDEX = resolve(ROOT, 'dist-standalone/index.html');
19
+ const built = existsSync(INDEX);
20
+ const html = built ? readFileSync(INDEX, 'utf8') : '';
21
+ // The distribution is a build output, so a source checkout may not have one.
22
+ // Skipping keeps `pnpm test` honest without pretending the file was checked.
23
+ const describeBuilt = built ? describe : describe.skip;
24
+ describeBuilt('standalone distribution', () => {
25
+ it('is a single file', () => {
26
+ expect(statSync(INDEX).isFile()).toBe(true);
27
+ });
28
+ it('references no sibling asset', () => {
29
+ // Only fetchable paths count. The inlined bundle contains plenty of
30
+ // attribute-shaped text — `href="${url}"`, `href="$2"` — which is
31
+ // library code writing markup at runtime, not a reference this file has.
32
+ const refs = [...html.matchAll(/(?:src|href)="([^"]+)"/g)]
33
+ .map(match => match[1])
34
+ .filter(url => /^(?:\/|\.\.?\/)/.test(url) || /\.(?:js|mjs|css|png|svg|woff2?)$/.test(url))
35
+ .filter(url => !url.includes('$'));
36
+ expect(refs).toEqual([]);
37
+ });
38
+ it('loads nothing over the network', () => {
39
+ expect(html).not.toMatch(/(?:src|href)="https?:\/\//);
40
+ expect(html).not.toContain('fonts.googleapis.com');
41
+ });
42
+ it('carries no unresolved Vite preload marker', () => {
43
+ // A bare `__VITE_PRELOAD__` is a ReferenceError on load: the token is
44
+ // substituted in a hook that runs after the one that inlines the chunk.
45
+ expect(html).not.toContain('__VITE_PRELOAD__');
46
+ });
47
+ it('emits no ELK layout worker beside it', () => {
48
+ expect(existsSync(resolve(ROOT, 'dist-standalone/elk-worker.min.js'))).toBe(false);
49
+ });
50
+ });
51
+ //# sourceMappingURL=standalone-distribution.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standalone-distribution.test.js","sourceRoot":"","sources":["../../src/__tests__/standalone-distribution.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,gFAAgF;AAChF,EAAE;AACF,2EAA2E;AAC3E,gFAAgF;AAChF,4EAA4E;AAC5E,gFAAgF;AAChF,+EAA+E;AAC/E,yEAAyE;AACzE,EAAE;AACF,gFAAgF;AAChF,yCAAyC;AACzC,gFAAgF;AAEhF,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACvE,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,4BAA4B,CAAC,CAAC;AAE1D,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;AAChC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAEtD,6EAA6E;AAC7E,6EAA6E;AAC7E,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;AAEvD,aAAa,CAAC,yBAAyB,EAAE,GAAG,EAAE;IAC1C,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE;QACxB,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACnC,oEAAoE;QACpE,kEAAkE;QAClE,yEAAyE;QACzE,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC;aACrD,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;aACtB,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,kCAAkC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;aAC1F,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;QACtD,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACjD,sEAAsE;QACtE,wEAAwE;QACxE,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,mCAAmC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=standard-sysml-diagrams-smoke.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standard-sysml-diagrams-smoke.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/standard-sysml-diagrams-smoke.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,22 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { createRequire } from 'node:module';
3
+ import { dirname, join } from 'node:path';
4
+ import { describe, expect, it } from 'vitest';
5
+ import { listArchitectExamples } from '../commands/example.js';
6
+ const require = createRequire(import.meta.url);
7
+ describe('memo-architect --example standard-sysml-diagrams', () => {
8
+ it('ships the runnable action-flow model with its source identities', () => {
9
+ expect(listArchitectExamples()).toContain('standard-sysml-diagrams');
10
+ const ontologyRoot = dirname(require.resolve('@memoarchitect/ontology/package.json'));
11
+ const source = readFileSync(join(ontologyRoot, 'examples/sysml-diagram-samples/model/sysml_v2_activity_example.sysml'), 'utf8');
12
+ expect(source).toContain('FulfillOrder');
13
+ expect(source).toContain('receiveOrder');
14
+ expect(source).toContain('routeOrder');
15
+ expect(source).toContain('readyToNotify');
16
+ expect(source).toContain('CustomerProcess');
17
+ expect(source).toContain('validUserDecision');
18
+ expect(source).toContain('shoppingDecision');
19
+ expect(source).toContain('creditDecision');
20
+ });
21
+ });
22
+ //# sourceMappingURL=standard-sysml-diagrams-smoke.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standard-sysml-diagrams-smoke.test.js","sourceRoot":"","sources":["../../src/__tests__/standard-sysml-diagrams-smoke.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C,QAAQ,CAAC,kDAAkD,EAAE,GAAG,EAAE;IAC9D,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACvE,MAAM,CAAC,qBAAqB,EAAE,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;QACrE,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC,CAAC;QACtF,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,sEAAsE,CAAC,EAAE,MAAM,CAAC,CAAC;QAChI,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=supervised-child-args.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervised-child-args.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/supervised-child-args.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,55 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { runningArchitectsForProject, supervisedChildArgs } from '../commands/dev.js';
3
+ // ─── Supervised child argv ──────────────────────────────────────────────────
4
+ //
5
+ // The supervisor rebuilds argv rather than forwarding it, so every flag the
6
+ // session was started with has to be restated. A dropped flag is invisible:
7
+ // the server starts, serves, and simply behaves as though the user never
8
+ // passed it — which is how `--experimental dev` came to serve a client with
9
+ // no Traceability, Ontology, Import or AI surfaces.
10
+ const ENTRY = '/usr/local/bin/memo-architect.js';
11
+ describe('supervisedChildArgs', () => {
12
+ it('carries the experimental grant to the child that serves the client', () => {
13
+ const args = supervisedChildArgs(ENTRY, { featureGrants: { experimental: true } }, true);
14
+ expect(args).toContain('--experimental');
15
+ });
16
+ it('does not invent a grant the session was started without', () => {
17
+ expect(supervisedChildArgs(ENTRY, { featureGrants: { experimental: false } }, true))
18
+ .not.toContain('--experimental');
19
+ expect(supervisedChildArgs(ENTRY, {}, true)).not.toContain('--experimental');
20
+ });
21
+ it('keeps the toolchain selection across a relaunch', () => {
22
+ const args = supervisedChildArgs(ENTRY, { toolchainArgv: ['--toolchain.validator=syside'] }, false);
23
+ expect(args).toContain('--toolchain.validator=syside');
24
+ });
25
+ it('opens a browser once, and never again on a relaunch', () => {
26
+ expect(supervisedChildArgs(ENTRY, { open: true }, true)).not.toContain('--no-open');
27
+ expect(supervisedChildArgs(ENTRY, { open: true }, false)).toContain('--no-open');
28
+ expect(supervisedChildArgs(ENTRY, { open: false }, true)).toContain('--no-open');
29
+ });
30
+ it('passes the resolved port, defaulting to 3000', () => {
31
+ expect(supervisedChildArgs(ENTRY, { port: 4100 }, true)).toEqual([ENTRY, 'dev', '--port', '4100']);
32
+ expect(supervisedChildArgs(ENTRY, {}, true)).toContain('3000');
33
+ });
34
+ });
35
+ describe('runningArchitectsForProject', () => {
36
+ it('reports only Architect servers whose cwd is the requested project', async () => {
37
+ const run = async (file, args) => {
38
+ if (file === 'ps') {
39
+ return {
40
+ stdout: [
41
+ '100 node /workspace/pump/node_modules/.bin/memo-architect dev --port 3111',
42
+ '200 node /workspace/other/node_modules/.bin/memo-architect dev --port 3112',
43
+ ].join('\n'),
44
+ stderr: '',
45
+ };
46
+ }
47
+ expect(file).toBe('lsof');
48
+ return { stdout: args[2] === '100' ? 'pcwd\nn/workspace/pump\n' : 'pcwd\nn/workspace/other\n', stderr: '' };
49
+ };
50
+ await expect(runningArchitectsForProject('/workspace/pump', run)).resolves.toEqual([
51
+ { pid: 100, command: 'node /workspace/pump/node_modules/.bin/memo-architect dev --port 3111' },
52
+ ]);
53
+ });
54
+ });
55
+ //# sourceMappingURL=supervised-child-args.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervised-child-args.test.js","sourceRoot":"","sources":["../../src/__tests__/supervised-child-args.test.ts"],"names":[],"mappings":"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"}
@@ -4,15 +4,36 @@ import { architectBuildCommand } from '../commands/build.js';
4
4
  import { architectDevCommand } from '../commands/dev.js';
5
5
  import { architectExampleCommand, listArchitectExamples, listArchitectTemplates, } from '../commands/example.js';
6
6
  import { EXPERIMENTAL_FLAG_DESCRIPTION, resolveFeatureGrants } from '../feature-grants.js';
7
+ import { applyToolchainCliOptions, defaultRegistry, toolchainOptionName } from '@memoarchitect/tools';
7
8
  const program = new Command();
9
+ /**
10
+ * Toolchain flags, generated by MEMO Tools from its provider registry.
11
+ *
12
+ * Architect declares none of them itself and reads none of their values: it
13
+ * forwards them to the operation that owns the toolchain. That is the whole of
14
+ * §1.2.2 here — anything you can do in the UI you can script, without Architect
15
+ * learning a provider's name or a tool's output format.
16
+ */
17
+ const TOOLCHAIN_OPTION_NAMES = defaultRegistry.schema().map(toolchainOptionName);
18
+ function toolchainOptionsFrom(options) {
19
+ return Object.fromEntries(TOOLCHAIN_OPTION_NAMES
20
+ .filter(name => options[name] !== undefined)
21
+ .map(name => [name, options[name]]));
22
+ }
23
+ /** Re-emit the toolchain flags so the supervised child runs the same toolchain. */
24
+ function toolchainArgv(options) {
25
+ return Object.entries(toolchainOptionsFrom(options))
26
+ .flatMap(([name, value]) => [`--${name}`, String(value)]);
27
+ }
8
28
  program
9
29
  .name('memo-architect')
10
30
  .description('MEMO Architect — interactive and distributable model workbench')
11
- .version('0.6.3')
31
+ .version('0.6.6')
12
32
  .option('--example <name>', 'Open a bundled example project (e.g. gpca, standard-sysml-diagrams). A local checkout is opened in place; an installed package is opened read-only in a disposable copy')
13
33
  .option('--read-only', 'Always open the example in a disposable copy, even from a local checkout')
14
34
  .option('-p, --port <port>', 'Server port', '3000')
15
35
  .option('--no-open', 'Do not open a browser')
36
+ .option('--keep-alive', 'Keep running after the last browser disconnects')
16
37
  .option('--experimental', EXPERIMENTAL_FLAG_DESCRIPTION)
17
38
  .action(async (options) => {
18
39
  if (options.example) {
@@ -22,6 +43,7 @@ program
22
43
  open: options.open,
23
44
  readOnly: options.readOnly,
24
45
  featureGrants: resolveFeatureGrants(options),
46
+ keepAlive: options.keepAlive,
25
47
  });
26
48
  return;
27
49
  }
@@ -44,20 +66,24 @@ function resolveOption(command, name, local) {
44
66
  return parent.opts()[name];
45
67
  return local;
46
68
  }
47
- program
69
+ applyToolchainCliOptions(program
48
70
  .command('dev')
49
71
  .description('Start Architect with live model reload')
50
72
  .option('-p, --port <port>', 'Server port', '3000')
51
73
  .option('--no-open', 'Do not open a browser')
52
- .option('--experimental', EXPERIMENTAL_FLAG_DESCRIPTION)
53
- .action(async function (options) {
74
+ .option('--keep-alive', 'Keep running after the last browser disconnects')
75
+ .option('--experimental', EXPERIMENTAL_FLAG_DESCRIPTION), defaultRegistry).action(async function (options) {
54
76
  const port = resolveOption(this, 'port', options.port);
55
77
  const open = resolveOption(this, 'open', options.open);
56
78
  const experimental = resolveOption(this, 'experimental', options.experimental);
79
+ const keepAlive = resolveOption(this, 'keepAlive', options.keepAlive);
57
80
  await architectDevCommand({
58
81
  port: Number.parseInt(String(port), 10),
59
82
  open,
60
83
  featureGrants: resolveFeatureGrants({ experimental }),
84
+ keepAlive: keepAlive === true,
85
+ toolchainOptions: toolchainOptionsFrom(options),
86
+ toolchainArgv: toolchainArgv(options),
61
87
  });
62
88
  });
63
89
  program
@@ -1 +1 @@
1
- {"version":3,"file":"memo-architect.js","sourceRoot":"","sources":["../../src/bin/memo-architect.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"memo-architect.js","sourceRoot":"","sources":["../../src/bin/memo-architect.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAWA,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAwB/E,wBAAsB,qBAAqB,CAAC,OAAO,EAAE;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,wFAAwF;IACxF,aAAa,CAAC,EAAE,aAAa,CAAC;CACjC,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BhB"}
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAWA,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAM/E,wBAAsB,qBAAqB,CAAC,OAAO,EAAE;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,wFAAwF;IACxF,aAAa,CAAC,EAAE,aAAa,CAAC;CACjC,GAAG,OAAO,CAAC,IAAI,CAAC,CAoChB"}
@@ -6,22 +6,15 @@ import { injectFeatureGrants } from '../feature-grants.js';
6
6
  function architectPackageRoot() {
7
7
  return resolve(dirname(fileURLToPath(import.meta.url)), '../..');
8
8
  }
9
- function inlineEntryAssets(html, outputDir) {
10
- html = html.replace(/<link[^>]+rel="stylesheet"[^>]+href="([^"]+)"[^>]*\/?>/g, (match, href) => {
11
- const path = resolve(outputDir, href.replace(/^\//, ''));
12
- return existsSync(path) ? `<style>${readFileSync(path, 'utf-8')}</style>` : match;
13
- });
14
- html = html.replace(/<script[^>]+src="([^"]+)"[^>]*><\/script>/g, (match, src) => {
15
- const path = resolve(outputDir, src.replace(/^\//, ''));
16
- return existsSync(path) ? `<script type="module">${readFileSync(path, 'utf-8')}</script>` : match;
17
- });
18
- return html;
19
- }
20
9
  export async function architectBuildCommand(options) {
21
10
  const snapshot = await buildProjectSnapshot();
22
- const sourceDist = resolve(architectPackageRoot(), 'dist');
11
+ // Two distributions, because one file and many files are different builds,
12
+ // not the same build post-processed: see packages/web/vite.standalone.config.ts.
13
+ const sourceDist = resolve(architectPackageRoot(), options.standalone ? 'dist-standalone' : 'dist');
23
14
  if (!existsSync(resolve(sourceDist, 'index.html'))) {
24
- throw new Error('Architect distribution is missing. Reinstall @memoarchitect/architect or run its build.');
15
+ throw new Error(options.standalone
16
+ ? 'Standalone Architect distribution is missing. Reinstall @memoarchitect/architect or run `pnpm run build:client:standalone`.'
17
+ : 'Architect distribution is missing. Reinstall @memoarchitect/architect or run its build.');
25
18
  }
26
19
  const outputDir = resolve(snapshot.projectRoot, options.output || 'dist');
27
20
  if (outputDir === sourceDist) {
@@ -29,19 +22,23 @@ export async function architectBuildCommand(options) {
29
22
  }
30
23
  rmSync(outputDir, { recursive: true, force: true });
31
24
  mkdirSync(outputDir, { recursive: true });
32
- cpSync(sourceDist, outputDir, { recursive: true });
25
+ // The standalone distribution is the single HTML file and nothing beside
26
+ // it; copying the directory would be copying that one file.
27
+ if (!options.standalone)
28
+ cpSync(sourceDist, outputDir, { recursive: true });
33
29
  const indexPath = resolve(outputDir, 'index.html');
34
- let html = readFileSync(indexPath, 'utf-8');
30
+ let html = readFileSync(resolve(sourceDist, 'index.html'), 'utf-8');
35
31
  const payload = serializeForInlineScript({
36
32
  model: snapshot.model,
37
33
  validation: snapshot.validation,
38
34
  completeness: snapshot.completeness,
39
35
  });
40
- html = html.replace('</head>', `<script>window.__MEMO_DATA__=${payload};</script>\n</head>`);
36
+ // Replacer function, not a replacement string: model text containing `$&`
37
+ // or ``$` `` would otherwise be read as a substitution pattern and splice
38
+ // the document into the payload.
39
+ html = html.replace('</head>', () => `<script>window.__MEMO_DATA__=${payload};</script>\n</head>`);
41
40
  if (options.featureGrants)
42
41
  html = injectFeatureGrants(html, options.featureGrants);
43
- if (options.standalone)
44
- html = inlineEntryAssets(html, outputDir);
45
42
  writeFileSync(indexPath, html);
46
43
  process.stdout.write(`Architect viewer built at ${indexPath}\n`);
47
44
  }
@@ -1 +1 @@
1
- {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,MAAM,EACN,UAAU,EACV,SAAS,EACT,YAAY,EACZ,MAAM,EACN,aAAa,GAChB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACtF,OAAO,EAAE,mBAAmB,EAAsB,MAAM,sBAAsB,CAAC;AAE/E,SAAS,oBAAoB;IACzB,OAAO,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,OAK3C;IACG,MAAM,QAAQ,GAAG,MAAM,oBAAoB,EAAE,CAAC;IAC9C,2EAA2E;IAC3E,iFAAiF;IACjF,MAAM,UAAU,GAAG,OAAO,CAAC,oBAAoB,EAAE,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACpG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU;YAC9B,CAAC,CAAC,6HAA6H;YAC/H,CAAC,CAAC,yFAAyF,CAAC,CAAC;IACrG,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC;IAC1E,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;IAC/F,CAAC;IACD,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,yEAAyE;IACzE,4DAA4D;IAC5D,IAAI,CAAC,OAAO,CAAC,UAAU;QAAE,MAAM,CAAC,UAAU,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5E,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACnD,IAAI,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;IACpE,MAAM,OAAO,GAAG,wBAAwB,CAAC;QACrC,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,YAAY,EAAE,QAAQ,CAAC,YAAY;KACtC,CAAC,CAAC;IACH,0EAA0E;IAC1E,0EAA0E;IAC1E,iCAAiC;IACjC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,gCAAgC,OAAO,qBAAqB,CAAC,CAAC;IACnG,IAAI,OAAO,CAAC,aAAa;QAAE,IAAI,GAAG,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACnF,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAE/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,SAAS,IAAI,CAAC,CAAC;AACrE,CAAC"}
@@ -1,7 +1,37 @@
1
1
  import { type FeatureGrants } from '../feature-grants.js';
2
- export declare function architectDevCommand(options: {
2
+ type ProjectProcessRunner = (file: string, args: string[]) => Promise<{
3
+ stdout: string;
4
+ stderr: string;
5
+ }>;
6
+ export interface RunningArchitect {
7
+ pid: number;
8
+ command: string;
9
+ }
10
+ /**
11
+ * Best-effort duplicate detection. A dev server has a supervisor and a runtime
12
+ * child, so callers treat this as an advisory rather than a process count.
13
+ */
14
+ export declare function runningArchitectsForProject(projectDir: string, run?: ProjectProcessRunner): Promise<RunningArchitect[]>;
15
+ export interface ArchitectDevOptions {
3
16
  port?: number;
4
17
  open?: boolean;
5
18
  featureGrants?: FeatureGrants;
6
- }): Promise<void>;
19
+ keepAlive?: boolean;
20
+ /** Parsed `--toolchain.*` options, passed straight through to MEMO Tools. */
21
+ toolchainOptions?: Record<string, unknown>;
22
+ /** The same flags as argv, so the supervised child runs the same toolchain. */
23
+ toolchainArgv?: string[];
24
+ }
25
+ /**
26
+ * The argv the supervised child is launched with.
27
+ *
28
+ * The child, not this process, serves the client shell and holds the model
29
+ * runtime — so anything the session was started with has to be restated here
30
+ * or it is silently lost. That has bitten grants (the browser lost every
31
+ * experimental surface) and would bite the toolchain the same way, which is
32
+ * why this is one reviewable function rather than a line in a loop.
33
+ */
34
+ export declare function supervisedChildArgs(entry: string, options: ArchitectDevOptions, firstStart: boolean): string[];
35
+ export declare function architectDevCommand(options: ArchitectDevOptions): Promise<void>;
36
+ export {};
7
37
  //# sourceMappingURL=dev.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAIA,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAY/E,wBAAsB,mBAAmB,CAAC,OAAO,EAAE;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,aAAa,CAAC,EAAE,aAAa,CAAC;CAChE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBhB"}
1
+ {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAOA,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAI/E,KAAK,oBAAoB,GAAG,CACxB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EAAE,KACb,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAIjD,MAAM,WAAW,gBAAgB;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAsB,2BAA2B,CAC7C,UAAU,EAAE,MAAM,EAClB,GAAG,GAAE,oBAAwC,GAC9C,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAuB7B;AAYD,MAAM,WAAW,mBAAmB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,aAAa,CAAC,EAAE,aAAa,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAClF,6EAA6E;IAC7E,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,+EAA+E;IAC/E,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAC/B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,mBAAmB,EAC5B,UAAU,EAAE,OAAO,GACpB,MAAM,EAAE,CAOV;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsDrF"}
@@ -1,8 +1,43 @@
1
1
  import { existsSync } from 'node:fs';
2
2
  import { dirname, resolve } from 'node:path';
3
3
  import { fileURLToPath } from 'node:url';
4
+ import { execFile, spawn } from 'node:child_process';
5
+ import { once } from 'node:events';
6
+ import { promisify } from 'node:util';
4
7
  import { startProjectServer } from '@memoarchitect/tools';
5
8
  import { injectFeatureGrants } from '../feature-grants.js';
9
+ const execFileAsync = promisify(execFile);
10
+ const runProjectProcess = (file, args) => execFileAsync(file, args);
11
+ /**
12
+ * Best-effort duplicate detection. A dev server has a supervisor and a runtime
13
+ * child, so callers treat this as an advisory rather than a process count.
14
+ */
15
+ export async function runningArchitectsForProject(projectDir, run = runProjectProcess) {
16
+ try {
17
+ const { stdout } = await run('ps', ['-axo', 'pid=,command=']);
18
+ const candidates = stdout.split('\n').flatMap(line => {
19
+ const match = line.trim().match(/^(\d+)\s+(.+)$/);
20
+ return match && /(?:^|\/)memo-architect(?:\.js)?\s+dev\b/.test(match[2])
21
+ && Number(match[1]) !== process.pid
22
+ ? [{ pid: Number(match[1]), command: match[2] }]
23
+ : [];
24
+ });
25
+ const matching = await Promise.all(candidates.map(async (candidate) => {
26
+ try {
27
+ const { stdout } = await run('lsof', ['-a', '-p', String(candidate.pid), '-d', 'cwd', '-Fn']);
28
+ const cwd = stdout.split('\n').find(line => line.startsWith('n'))?.slice(1);
29
+ return cwd === projectDir ? candidate : undefined;
30
+ }
31
+ catch {
32
+ return undefined;
33
+ }
34
+ }));
35
+ return matching.filter((candidate) => candidate !== undefined);
36
+ }
37
+ catch {
38
+ return [];
39
+ }
40
+ }
6
41
  function architectPackageRoot() {
7
42
  return resolve(dirname(fileURLToPath(import.meta.url)), '../..');
8
43
  }
@@ -11,20 +46,72 @@ function clientRoot() {
11
46
  const sourceRoot = resolve(root, 'packages', 'web');
12
47
  return existsSync(resolve(sourceRoot, 'index.html')) ? sourceRoot : root;
13
48
  }
49
+ /**
50
+ * The argv the supervised child is launched with.
51
+ *
52
+ * The child, not this process, serves the client shell and holds the model
53
+ * runtime — so anything the session was started with has to be restated here
54
+ * or it is silently lost. That has bitten grants (the browser lost every
55
+ * experimental surface) and would bite the toolchain the same way, which is
56
+ * why this is one reviewable function rather than a line in a loop.
57
+ */
58
+ export function supervisedChildArgs(entry, options, firstStart) {
59
+ const args = [entry, 'dev', '--port', String(options.port ?? 3000)];
60
+ if (!firstStart || options.open === false)
61
+ args.push('--no-open');
62
+ if (options.keepAlive)
63
+ args.push('--keep-alive');
64
+ if (options.featureGrants?.experimental === true)
65
+ args.push('--experimental');
66
+ args.push(...(options.toolchainArgv ?? []));
67
+ return args;
68
+ }
14
69
  export async function architectDevCommand(options) {
15
- // Ctrl+C has to stop the server. This command drives startProjectServer
16
- // directly rather than going through the Tools dev command, so it does not
17
- // inherit that command's signal handling and has to register its own —
18
- // without this the process ignores SIGINT and only a kill will end it.
19
- for (const signal of ['SIGINT', 'SIGTERM']) {
20
- process.once(signal, () => {
21
- process.exit(0);
22
- });
70
+ if (process.env.MEMO_ARCHITECT_RUNTIME_CHILD !== '1') {
71
+ const port = options.port ?? 3000;
72
+ const existing = await runningArchitectsForProject(process.cwd());
73
+ if (existing.length > 0) {
74
+ const pids = existing.map(({ pid }) => pid).join(', ');
75
+ process.stderr.write(`⚠ MEMO Architect is already running for this project (PID${existing.length === 1 ? '' : 's'} ${pids}). `
76
+ + `Starting another server on http://127.0.0.1:${port}.\n`);
77
+ }
78
+ let stopping = false;
79
+ let firstStart = true;
80
+ let restartStartedAt;
81
+ let child;
82
+ const stop = () => { stopping = true; child?.kill('SIGTERM'); };
83
+ process.once('SIGINT', stop);
84
+ process.once('SIGTERM', stop);
85
+ while (!stopping) {
86
+ const args = supervisedChildArgs(process.argv[1], { ...options, port }, firstStart);
87
+ child = spawn(process.execPath, args, {
88
+ cwd: process.cwd(), stdio: 'inherit',
89
+ env: {
90
+ ...process.env,
91
+ MEMO_ARCHITECT_RUNTIME_CHILD: '1',
92
+ ...(restartStartedAt ? { MEMO_RUNTIME_RESTART_STARTED_AT: String(restartStartedAt) } : {}),
93
+ },
94
+ });
95
+ firstStart = false;
96
+ const [code] = await once(child, 'exit');
97
+ child = undefined;
98
+ if (stopping || code !== 75) {
99
+ if (code && code !== 0)
100
+ process.exitCode = code;
101
+ break;
102
+ }
103
+ restartStartedAt = Date.now();
104
+ process.stderr.write(' Reusable semantics changed; relaunching model runtime...\n');
105
+ }
106
+ return;
23
107
  }
24
108
  await startProjectServer({
25
109
  port: options.port,
26
110
  open: options.open,
27
111
  clientRoot: clientRoot(),
112
+ exitWhenIdle: !options.keepAlive,
113
+ supervisedRuntime: true,
114
+ toolchainOptions: options.toolchainOptions,
28
115
  // Tools serves the shell; Architect decides what goes into it.
29
116
  transformClientHtml: options.featureGrants
30
117
  ? html => injectFeatureGrants(html, options.featureGrants)
@@ -1 +1 @@
1
- {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAsB,MAAM,sBAAsB,CAAC;AAE/E,SAAS,oBAAoB;IACzB,OAAO,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,UAAU;IACf,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAC;IACpC,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;IACpD,OAAO,UAAU,CAAC,OAAO,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAEzC;IACG,wEAAwE;IACxE,2EAA2E;IAC3E,uEAAuE;IACvE,uEAAuE;IACvE,KAAK,MAAM,MAAM,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAU,EAAE,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;YACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;IACP,CAAC;IAED,MAAM,kBAAkB,CAAC;QACrB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,UAAU,EAAE,UAAU,EAAE;QACxB,+DAA+D;QAC/D,mBAAmB,EAAE,OAAO,CAAC,aAAa;YACtC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,aAAc,CAAC;YAC3D,CAAC,CAAC,SAAS;KAClB,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
@@ -18,5 +18,6 @@ export declare function architectExampleCommand(options: {
18
18
  /** Force the disposable copy even for a local checkout. */
19
19
  readOnly?: boolean;
20
20
  featureGrants?: FeatureGrants;
21
+ keepAlive?: boolean;
21
22
  }): Promise<void>;
22
23
  //# sourceMappingURL=example.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"example.d.ts","sourceRoot":"","sources":["../../src/commands/example.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAgE1D,kDAAkD;AAClD,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAEhD;AAED,uEAAuE;AACvE,wBAAgB,sBAAsB,IAAI,MAAM,EAAE,CAEjD;AA2BD;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,EAAE;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,aAAa,CAAC;CACjC,GAAG,OAAO,CAAC,IAAI,CAAC,CA6ChB"}
1
+ {"version":3,"file":"example.d.ts","sourceRoot":"","sources":["../../src/commands/example.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAgE1D,kDAAkD;AAClD,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAEhD;AAED,uEAAuE;AACvE,wBAAgB,sBAAsB,IAAI,MAAM,EAAE,CAEjD;AA2BD;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,EAAE;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAC;CACvB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+ChB"}
@@ -128,6 +128,7 @@ export async function architectExampleCommand(options) {
128
128
  process.chdir(target);
129
129
  await architectDevCommand({
130
130
  port: options.port, open: options.open, featureGrants: options.featureGrants,
131
+ keepAlive: options.keepAlive,
131
132
  });
132
133
  return;
133
134
  }
@@ -149,6 +150,7 @@ export async function architectExampleCommand(options) {
149
150
  process.chdir(tempRoot);
150
151
  await architectDevCommand({
151
152
  port: options.port, open: options.open, featureGrants: options.featureGrants,
153
+ keepAlive: options.keepAlive,
152
154
  });
153
155
  }
154
156
  //# sourceMappingURL=example.js.map