@memoarchitect/tools 0.15.1 → 0.15.3

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 (54) hide show
  1. package/README.md +1 -1
  2. package/package.json +2 -2
  3. package/packages/tools/lib/commands/dev.d.ts.map +1 -1
  4. package/packages/tools/lib/commands/dev.js +4 -0
  5. package/packages/tools/lib/commands/dev.js.map +1 -1
  6. package/packages/tools/lib/commands/validate.d.ts.map +1 -1
  7. package/packages/tools/lib/commands/validate.js +2 -16
  8. package/packages/tools/lib/commands/validate.js.map +1 -1
  9. package/packages/tools/lib/model/complete-model.d.ts.map +1 -1
  10. package/packages/tools/lib/model/complete-model.js +59 -14
  11. package/packages/tools/lib/model/complete-model.js.map +1 -1
  12. package/packages/tools/lib/model/id-rebase.d.ts +6 -1
  13. package/packages/tools/lib/model/id-rebase.d.ts.map +1 -1
  14. package/packages/tools/lib/model/id-rebase.js +71 -36
  15. package/packages/tools/lib/model/id-rebase.js.map +1 -1
  16. package/packages/tools/lib/model/identity-registry.d.ts +26 -0
  17. package/packages/tools/lib/model/identity-registry.d.ts.map +1 -1
  18. package/packages/tools/lib/model/identity-registry.js +55 -4
  19. package/packages/tools/lib/model/identity-registry.js.map +1 -1
  20. package/packages/tools/lib/model/semantic.d.ts +72 -0
  21. package/packages/tools/lib/model/semantic.d.ts.map +1 -1
  22. package/packages/tools/lib/model/semantic.js.map +1 -1
  23. package/packages/tools/lib/model/short-id.d.ts +11 -0
  24. package/packages/tools/lib/model/short-id.d.ts.map +1 -1
  25. package/packages/tools/lib/model/short-id.js +33 -0
  26. package/packages/tools/lib/model/short-id.js.map +1 -1
  27. package/packages/tools/lib/model/view-deriver.d.ts +8 -1
  28. package/packages/tools/lib/model/view-deriver.d.ts.map +1 -1
  29. package/packages/tools/lib/model/view-deriver.js +45 -0
  30. package/packages/tools/lib/model/view-deriver.js.map +1 -1
  31. package/packages/tools/lib/operations/project-snapshot.d.ts.map +1 -1
  32. package/packages/tools/lib/operations/project-snapshot.js +3 -18
  33. package/packages/tools/lib/operations/project-snapshot.js.map +1 -1
  34. package/packages/tools/lib/protocol/messages.d.ts +56 -3
  35. package/packages/tools/lib/protocol/messages.d.ts.map +1 -1
  36. package/packages/tools/lib/server/axis-query.d.ts +9 -0
  37. package/packages/tools/lib/server/axis-query.d.ts.map +1 -0
  38. package/packages/tools/lib/server/axis-query.js +47 -0
  39. package/packages/tools/lib/server/axis-query.js.map +1 -0
  40. package/packages/tools/lib/server/dev-server.d.ts.map +1 -1
  41. package/packages/tools/lib/server/dev-server.js +46 -9
  42. package/packages/tools/lib/server/dev-server.js.map +1 -1
  43. package/packages/tools/lib/server/mutation-domain.d.ts.map +1 -1
  44. package/packages/tools/lib/server/mutation-domain.js +4 -0
  45. package/packages/tools/lib/server/mutation-domain.js.map +1 -1
  46. package/packages/tools/lib/server/user-preferences.d.ts.map +1 -1
  47. package/packages/tools/lib/server/user-preferences.js +11 -2
  48. package/packages/tools/lib/server/user-preferences.js.map +1 -1
  49. package/packages/tools/lib/server/view-writer.d.ts +25 -2
  50. package/packages/tools/lib/server/view-writer.d.ts.map +1 -1
  51. package/packages/tools/lib/server/view-writer.js +231 -27
  52. package/packages/tools/lib/server/view-writer.js.map +1 -1
  53. package/packages/tools/lib/stage2/build-from-api.js +3 -1
  54. package/packages/tools/lib/stage2/build-from-api.js.map +1 -1
@@ -29,7 +29,7 @@ import { createRule, previewRule } from './rule-service.js';
29
29
  import { loadViewLayouts, saveViewLayout } from './view-layout-store.js';
30
30
  import { layoutBlindRevision } from '../model/view-layout-block.js';
31
31
  import { assertWritable } from './write-guard.js';
32
- import { updateViewDisplay, updateViewExpose, writeViewDeclaration } from './view-writer.js';
32
+ import { updateViewDeclaration, updateViewDisplay, updateViewExpose, writeViewDeclaration } from './view-writer.js';
33
33
  import { usageKeyword } from '../model/semantic.js';
34
34
  import { loadDhfDocs, saveDhfDoc, deleteDhfDoc, loadDhfSettings, saveDhfSettings, listRepoTemplates, readRepoTemplate, saveRepoTemplate, } from './dhf-doc-store.js';
35
35
  import { loadDashboards, saveDashboard, deleteDashboard, moveDashboard } from './dashboard-store.js';
@@ -1616,6 +1616,7 @@ export async function createDevServer(options) {
1616
1616
  else if (msg.type === 'diagram:create') {
1617
1617
  const { projectRoot } = options;
1618
1618
  const diagram = { ...msg.payload, auto: false };
1619
+ const requestId = msg.payload?.requestId;
1619
1620
  // A view is model content, so it is DECLARED, not recorded in
1620
1621
  // a sidecar. Writing the SysML puts it where `memo validate`,
1621
1622
  // the selected compiler, review and git can all see it, and — the
@@ -1630,33 +1631,69 @@ export async function createDevServer(options) {
1630
1631
  const error = `The view "${diagram.name}" was not created: ${declared.reason}. `
1631
1632
  + 'Every view must be declared in SysML.';
1632
1633
  console.error(`[Diagram] REFUSED: ${error}`);
1633
- ws.send(JSON.stringify({ type: 'app:error', payload: { requestId: msg.payload?.requestId, error } }));
1634
+ ws.send(JSON.stringify({ type: 'app:error', payload: { requestId, error } }));
1635
+ if (requestId)
1636
+ ws.send(JSON.stringify({ type: 'diagram:result', payload: { requestId, success: false, error } }));
1634
1637
  return;
1635
1638
  }
1636
- console.log(`[Diagram] Declared: ${diagram.name} (${diagram.id}) as ${declared.identifier} in ${declared.filePath}`);
1639
+ console.log(`[Diagram] Declared: ${diagram.name} as ${declared.identifier} in ${declared.filePath}`);
1637
1640
  // The file watcher recompiles and `view-deriver` emits the
1638
1641
  // diagram; no broadcast here, or clients would briefly hold
1639
1642
  // a second, sidecar-shaped copy of it.
1640
1643
  await recompileAfterWrite();
1644
+ if (requestId) {
1645
+ ws.send(JSON.stringify({ type: 'diagram:result', payload: {
1646
+ requestId, success: true, qualifiedName: declared.qualifiedName, filePath: declared.filePath,
1647
+ } }));
1648
+ }
1649
+ }
1650
+ else if (msg.type === 'query:run') {
1651
+ const requestId = msg.payload?.requestId;
1652
+ try {
1653
+ const { runAxisQuery } = await import('./axis-query.js');
1654
+ const { findConfigFile } = await import('@memoarchitect/tools');
1655
+ const { loadAndResolveConfig } = await import('./config-resolver.js');
1656
+ const configPath = findConfigFile(options.projectRoot);
1657
+ const config = configPath ? await loadAndResolveConfig(configPath) : {};
1658
+ const ctx = await scopedQueryContext(config, msg.payload?.workspace);
1659
+ const result = runAxisQuery(String(msg.payload?.query ?? ''), ctx, {
1660
+ ids: msg.payload?.idLimit, preview: msg.payload?.previewLimit,
1661
+ });
1662
+ ws.send(JSON.stringify({ type: 'query:result', payload: { requestId, ...result } }));
1663
+ }
1664
+ catch (e) {
1665
+ ws.send(JSON.stringify({ type: 'query:result', payload: { requestId, count: 0, preview: [], error: e?.message ?? String(e) } }));
1666
+ }
1641
1667
  }
1642
1668
  else if (msg.type === 'diagram:update') {
1643
1669
  // What a view shows lives in its `expose` members, not in a
1644
1670
  // list of ids in a sidecar, so the update is applied to the
1645
1671
  // declaration. This used to edit the sidecar, which meant
1646
1672
  // that for a DECLARED view it silently did nothing at all.
1673
+ // A matrix view has no `expose`: its name and its axes are
1674
+ // statements of its own declaration.
1647
1675
  const { projectRoot } = options;
1648
- const declared = currentDiagrams().find(d => d.id === msg.payload?.id);
1676
+ const payload = (msg.payload ?? {});
1677
+ const requestId = payload.requestId;
1678
+ const declared = currentDiagrams().find(d => d.id === payload.id || d.elementId === payload.id);
1679
+ const isMatrixChange = payload.matrix !== undefined || (payload.name !== undefined && payload.elementIds === undefined);
1649
1680
  const result = declared
1650
- ? await updateViewExpose(projectRoot, currentModel() ?? { elements: {} }, declared, msg.payload?.elementIds, (await authoringContext()).outlines)
1651
- : { success: false, reason: `no view "${msg.payload?.id}" is declared` };
1681
+ ? isMatrixChange
1682
+ ? await updateViewDeclaration(projectRoot, currentModel() ?? { elements: {} }, declared, { name: payload.name, matrix: payload.matrix }, (await authoringContext()).outlines)
1683
+ : await updateViewExpose(projectRoot, currentModel() ?? { elements: {} }, declared, payload.elementIds, (await authoringContext()).outlines)
1684
+ : { success: false, reason: `no view "${payload.id}" is declared` };
1652
1685
  if (result.success) {
1653
- console.log(`[Diagram] Exposed ${result.exposed.join(', ')} on ${declared.name} (${result.filePath})`);
1686
+ console.log(`[Diagram] Updated ${declared.name} (${result.filePath})`);
1654
1687
  await recompileAfterWrite();
1688
+ if (requestId)
1689
+ ws.send(JSON.stringify({ type: 'diagram:result', payload: { requestId, success: true, filePath: result.filePath } }));
1655
1690
  }
1656
1691
  else {
1657
- const error = `The view "${declared?.name ?? msg.payload?.id}" was not changed: ${result.reason}.`;
1692
+ const error = `The view "${declared?.name ?? payload.id}" was not changed: ${result.reason}.`;
1658
1693
  console.error(`[Diagram] REFUSED: ${error}`);
1659
- ws.send(JSON.stringify({ type: 'app:error', payload: { requestId: msg.payload?.requestId, error } }));
1694
+ ws.send(JSON.stringify({ type: 'app:error', payload: { requestId, error } }));
1695
+ if (requestId)
1696
+ ws.send(JSON.stringify({ type: 'diagram:result', payload: { requestId, success: false, error } }));
1660
1697
  }
1661
1698
  }
1662
1699
  else if (msg.type === 'diagram:display:update') {