callman-mcp 0.2.0 → 0.4.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.
- package/CHANGELOG.md +56 -0
- package/README.md +4 -4
- package/dist/client/api.d.ts +16 -1
- package/dist/client/api.d.ts.map +1 -1
- package/dist/client/api.js +22 -0
- package/dist/client/api.js.map +1 -1
- package/dist/client/types.d.ts +14 -0
- package/dist/client/types.d.ts.map +1 -1
- package/dist/domain/diagram/build.d.ts +122 -73
- package/dist/domain/diagram/build.d.ts.map +1 -1
- package/dist/domain/diagram/build.js +51 -167
- package/dist/domain/diagram/build.js.map +1 -1
- package/dist/domain/diagram/layout.d.ts +5 -4
- package/dist/domain/diagram/layout.d.ts.map +1 -1
- package/dist/domain/diagram/layout.js +18 -45
- package/dist/domain/diagram/layout.js.map +1 -1
- package/dist/domain/diagram/patch.d.ts +1011 -92
- package/dist/domain/diagram/patch.d.ts.map +1 -1
- package/dist/domain/diagram/patch.js +113 -273
- package/dist/domain/diagram/patch.js.map +1 -1
- package/dist/domain/diagram/style.d.ts +4 -12
- package/dist/domain/diagram/style.d.ts.map +1 -1
- package/dist/domain/diagram/style.js +8 -84
- package/dist/domain/diagram/style.js.map +1 -1
- package/dist/domain/diagram/summarize.d.ts +26 -24
- package/dist/domain/diagram/summarize.d.ts.map +1 -1
- package/dist/domain/diagram/summarize.js +21 -35
- package/dist/domain/diagram/summarize.js.map +1 -1
- package/dist/domain/requestIntegrations.d.ts +20 -20
- package/dist/domain/requestShape.d.ts +32 -32
- package/dist/resources/docs/diagramSchema.d.ts +1 -1
- package/dist/resources/docs/diagramSchema.d.ts.map +1 -1
- package/dist/resources/docs/diagramSchema.js +87 -10
- package/dist/resources/docs/diagramSchema.js.map +1 -1
- package/dist/resources/docs/overview.d.ts +1 -1
- package/dist/resources/docs/overview.d.ts.map +1 -1
- package/dist/resources/docs/overview.js +4 -1
- package/dist/resources/docs/overview.js.map +1 -1
- package/dist/resources/generated/aiPacks.d.ts +1 -1
- package/dist/resources/generated/aiPacks.js +2 -2
- package/dist/tools/catalog.d.ts.map +1 -1
- package/dist/tools/catalog.js +5 -0
- package/dist/tools/catalog.js.map +1 -1
- package/dist/tools/diagrams.d.ts.map +1 -1
- package/dist/tools/diagrams.js +547 -59
- package/dist/tools/diagrams.js.map +1 -1
- package/dist/tools/lookups.d.ts +5 -1
- package/dist/tools/lookups.d.ts.map +1 -1
- package/dist/tools/lookups.js +41 -0
- package/dist/tools/lookups.js.map +1 -1
- package/dist-cjs/client/api.js +22 -0
- package/dist-cjs/domain/diagram/build.js +55 -171
- package/dist-cjs/domain/diagram/layout.js +19 -45
- package/dist-cjs/domain/diagram/patch.js +111 -271
- package/dist-cjs/domain/diagram/style.js +11 -88
- package/dist-cjs/domain/diagram/summarize.js +23 -35
- package/dist-cjs/resources/docs/diagramSchema.js +87 -10
- package/dist-cjs/resources/docs/overview.js +4 -1
- package/dist-cjs/resources/generated/aiPacks.js +2 -2
- package/dist-cjs/tools/catalog.js +5 -0
- package/dist-cjs/tools/diagrams.js +539 -51
- package/dist-cjs/tools/lookups.js +46 -1
- package/package.json +2 -2
|
@@ -1,20 +1,22 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { assertNotConnector as assertNotConnectorCore, buildDiagramFromInput, containerTypes, DiagramOpError, edgeStyleFor, isContainerType, parentWarning, suggestComponentTypes, } from "callman-core";
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
import { ToolInputError } from "../../client/errors.js";
|
|
4
|
-
import { sequentialIds } from "../../lib/ids.js";
|
|
5
4
|
import { strictObject } from "../../lib/strict.js";
|
|
6
|
-
import {
|
|
5
|
+
import { colorInputSchema, nodeStyleInputSchema } from "./style.js";
|
|
7
6
|
// From the COMPACT diagram a model writes (typed nodes with labels, edges
|
|
8
|
-
// with a meaning) to the DiagramDocument the Diagram Studio renders.
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
7
|
+
// with a meaning) to the DiagramDocument the Diagram Studio renders. The
|
|
8
|
+
// zod schemas here are the tool contract (strict keys, descriptions); the
|
|
9
|
+
// building itself is callman-core's — the same code the desktop's AI edits
|
|
10
|
+
// and the studio use — so ids, sizes, notation and validation match
|
|
11
|
+
// everywhere. Ids are slugs of the label (`orders-service`, `-2` on a
|
|
12
|
+
// clash) so a model regenerating a diagram keeps them stable.
|
|
13
13
|
export const EDGE_SEMANTICS_INPUT = ["sync", "async", "fallback", "bus"];
|
|
14
|
-
const ARROWS = ["none", "classic", "classicThin", "open", "block", "diamond", "oval"];
|
|
14
|
+
const ARROWS = ["none", "classic", "classicThin", "open", "block", "diamond", "oval", "one", "many", "zeroOne", "zeroMany"];
|
|
15
|
+
export const ROUTINGS = ["orthogonal", "straight", "curved", "smart"];
|
|
16
|
+
export const SIDES = ["top", "right", "bottom", "left"];
|
|
15
17
|
export const diagramNodeInputSchema = strictObject({
|
|
16
|
-
id: z.string().min(1).max(64).optional().describe("Stable id (
|
|
17
|
-
type: z.string().min(1).max(80).describe("Component type from callman://diagram/components, e.g. net.service, net.api-gateway, db.postgres, mq.kafka, aws.lambda, flow.process"),
|
|
18
|
+
id: z.string().min(1).max(64).optional().describe("Stable id (orders, api, db…); a slug of the label when omitted"),
|
|
19
|
+
type: z.string().min(1).max(80).describe("Component type from callman://diagram/components, e.g. net.service, net.api-gateway, db.postgres, mq.kafka, aws.lambda, flow.process. On a BPMN diagram: a bpmn.* type (bpmn.user-task, bpmn.exclusive-gateway, bpmn.start-event, bpmn.pool, bpmn.lane …). On a database diagram: db.table, db.view or db.collection, with the columns in data: { db: { columns } }"),
|
|
18
20
|
label: z.string().max(200).optional(),
|
|
19
21
|
parent: z.string().max(64).optional().describe("Id of a container node this node sits inside: frame, pool.horizontal or pool.vertical"),
|
|
20
22
|
position: z.object({ x: z.number(), y: z.number() }).strict().optional().describe("Top-left corner; relative to the parent container when `parent` is set. Omit to auto-layout"),
|
|
@@ -23,7 +25,8 @@ export const diagramNodeInputSchema = strictObject({
|
|
|
23
25
|
rotation: z.number().min(-360).max(360).optional().describe("Degrees, clockwise"),
|
|
24
26
|
locked: z.boolean().optional().describe("Locked nodes cannot be moved or resized in the studio"),
|
|
25
27
|
hidden: z.boolean().optional(),
|
|
26
|
-
|
|
28
|
+
collapsed: z.boolean().optional().describe("Containers only: drawn folded with the children hidden"),
|
|
29
|
+
data: z.record(z.unknown()).optional().describe('Free-form metadata kept with the node (not rendered), e.g. { owner: "team-a", repo: "…" }. On a database diagram: { db: { schema?, columns: [{ name, dataType, primaryKey?, nullable?, unique?, defaultValue?, comment? }], comment? } }'),
|
|
27
30
|
}, "node field");
|
|
28
31
|
export const diagramEdgeInputSchema = strictObject({
|
|
29
32
|
id: z.string().min(1).max(64).optional(),
|
|
@@ -32,175 +35,56 @@ export const diagramEdgeInputSchema = strictObject({
|
|
|
32
35
|
label: z.string().max(200).optional(),
|
|
33
36
|
semantic: z.enum(EDGE_SEMANTICS_INPUT).optional().describe("sync (default, solid) = request/response, async (dashed) = event, fallback (dotted) = retry/optional, bus (heavy) = message bus; automatic bus when an end is a messaging component"),
|
|
34
37
|
color: colorInputSchema.optional().describe('Line CSS color, e.g. "#8B5CF6". Independent of `semantic`'),
|
|
35
|
-
routing: z.enum(
|
|
38
|
+
routing: z.enum(ROUTINGS).optional().describe("orthogonal (default, right-angle auto-routing), straight, curved, smart (routed around other shapes)"),
|
|
36
39
|
markerEnd: z.enum(ARROWS).optional().describe("Arrow at the target (default classicThin)"),
|
|
37
40
|
markerStart: z.enum(ARROWS).optional().describe("Arrow at the source (default none) — set it for a two-way connection"),
|
|
41
|
+
sourceSide: z.enum(SIDES).optional().describe("Fix which side of the source node the line leaves from (default: floating — chosen from the relative position)"),
|
|
42
|
+
targetSide: z.enum(SIDES).optional().describe("Fix which side of the target node the line enters"),
|
|
43
|
+
data: z.record(z.unknown()).optional().describe('Free-form metadata kept with the edge. On a BPMN diagram: { bpmn: { flow?: "sequence"|"message", conditionExpression?: string, isDefault?: boolean } }'),
|
|
38
44
|
}, "edge field");
|
|
45
|
+
export const diagramCanvasInputSchema = z
|
|
46
|
+
.object({
|
|
47
|
+
background: z.enum(["grid", "dots", "blank"]).optional(),
|
|
48
|
+
gridSize: z.number().int().positive().optional(),
|
|
49
|
+
defaultRouting: z.enum(ROUTINGS).optional().describe("Routing for edges that do not set their own (default orthogonal)"),
|
|
50
|
+
})
|
|
51
|
+
.strict()
|
|
52
|
+
.optional()
|
|
53
|
+
.describe("Canvas background (default dots), grid size (default 16) and the default edge routing");
|
|
39
54
|
export const diagramInputSchema = z.object({
|
|
40
55
|
title: z.string().min(1).max(200),
|
|
41
56
|
nodes: z.array(diagramNodeInputSchema).min(1).max(500),
|
|
42
57
|
edges: z.array(diagramEdgeInputSchema).max(2000).default([]),
|
|
43
|
-
canvas:
|
|
44
|
-
.object({ background: z.enum(["grid", "dots", "blank"]).optional(), gridSize: z.number().int().positive().optional() })
|
|
45
|
-
.strict()
|
|
46
|
-
.optional()
|
|
47
|
-
.describe("Canvas background (default dots) and grid size (default 16)"),
|
|
58
|
+
canvas: diagramCanvasInputSchema,
|
|
48
59
|
});
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
seen.add(candidate);
|
|
55
|
-
out.push(candidate);
|
|
56
|
-
}
|
|
57
|
-
};
|
|
58
|
-
for (const entry of searchDiagramComponents(type))
|
|
59
|
-
push(entry.type);
|
|
60
|
-
// A typo usually sits at the END of the last segment ("db.postgresqlx"):
|
|
61
|
-
// shrink it until something in the catalog contains it.
|
|
62
|
-
const tail = (type.split(".").pop() ?? type).toLowerCase();
|
|
63
|
-
for (let length = tail.length; length >= 3 && out.length < limit; length -= 1) {
|
|
64
|
-
const needle = tail.slice(0, length);
|
|
65
|
-
for (const entry of DIAGRAM_COMPONENT_CATALOG) {
|
|
66
|
-
const haystack = [entry.type, entry.label, ...(entry.aliases ?? [])].join(" ").toLowerCase();
|
|
67
|
-
if (haystack.includes(needle))
|
|
68
|
-
push(entry.type);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
// Still nothing: offer the same namespace ("db.*", "aws.*").
|
|
72
|
-
const namespace = type.includes(".") ? `${type.split(".")[0].toLowerCase()}.` : null;
|
|
73
|
-
if (namespace) {
|
|
74
|
-
for (const entry of DIAGRAM_COMPONENT_CATALOG)
|
|
75
|
-
if (entry.type.toLowerCase().startsWith(namespace))
|
|
76
|
-
push(entry.type);
|
|
77
|
-
}
|
|
78
|
-
return out;
|
|
60
|
+
// Core's op errors carry MCP's own codes; only the class changes.
|
|
61
|
+
export const toToolError = (error) => {
|
|
62
|
+
if (error instanceof DiagramOpError)
|
|
63
|
+
throw new ToolInputError(error.code, error.message, error.data);
|
|
64
|
+
throw error;
|
|
79
65
|
};
|
|
80
|
-
|
|
81
|
-
export const isContainerType = (type) => {
|
|
82
|
-
const def = type ? getDiagramComponent(type) : undefined;
|
|
83
|
-
return Boolean(def?.container || def?.swimlane);
|
|
84
|
-
};
|
|
85
|
-
export const containerTypes = () => DIAGRAM_COMPONENT_CATALOG.filter((entry) => entry.container || entry.swimlane).map((entry) => entry.type);
|
|
86
|
-
export const parentWarning = (id, parentId, parentType) => isContainerType(parentType)
|
|
87
|
-
? null
|
|
88
|
-
: `Node ${id} sits inside "${parentId}" (${parentType ?? "unknown"}), which is not a container — use ${containerTypes().join(", ")} to group nodes.`;
|
|
89
|
-
// Edge input → the stored edge's visual fields: the semantic's line tuple
|
|
90
|
-
// plus an optional color.
|
|
91
|
-
// line / arrow / line.dashed are palette connectors (0-height), not nodes.
|
|
66
|
+
export { containerTypes, edgeStyleFor, isContainerType, parentWarning, suggestComponentTypes };
|
|
92
67
|
export const assertNotConnector = (type, id) => {
|
|
93
|
-
|
|
94
|
-
|
|
68
|
+
try {
|
|
69
|
+
assertNotConnectorCore(type, id);
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
toToolError(error);
|
|
95
73
|
}
|
|
96
|
-
};
|
|
97
|
-
export const edgeStyleFor = (semantic, color) => {
|
|
98
|
-
const base = semantic ? semanticStyle(semantic) : undefined;
|
|
99
|
-
if (!color)
|
|
100
|
-
return base;
|
|
101
|
-
return { ...(base ?? {}), stroke: toTokenRef(color) };
|
|
102
74
|
};
|
|
103
75
|
export const buildDiagramDocument = (input, options = {}) => {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
}
|
|
114
|
-
const idSet = new Set(ids);
|
|
115
|
-
const unknown = [];
|
|
116
|
-
const typeOf = new Map();
|
|
117
|
-
const nodes = input.nodes.map((node, index) => {
|
|
118
|
-
const id = ids[index];
|
|
119
|
-
let type = node.type.trim();
|
|
120
|
-
const known = getDiagramComponent(type);
|
|
121
|
-
if (!known) {
|
|
122
|
-
const suggestions = suggestComponentTypes(type);
|
|
123
|
-
if (strict)
|
|
124
|
-
unknown.push({ type, suggestions });
|
|
125
|
-
else {
|
|
126
|
-
warnings.push(`Unknown component type "${type}" on ${id} → drawn as a rectangle (suggestions: ${suggestions.join(", ") || "none"})`);
|
|
127
|
-
type = "rect";
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
if (known)
|
|
131
|
-
assertNotConnector(type, id);
|
|
132
|
-
const def = getDiagramComponent(type);
|
|
133
|
-
typeOf.set(id, type);
|
|
134
|
-
if (node.parent && !idSet.has(node.parent)) {
|
|
135
|
-
throw new ToolInputError("DIAGRAM_PARENT_NOT_FOUND", `Node ${id} references parent "${node.parent}" which is not in nodes.`);
|
|
136
|
-
}
|
|
137
|
-
return {
|
|
138
|
-
id,
|
|
139
|
-
type,
|
|
140
|
-
position: node.position ?? { x: 0, y: 0 },
|
|
141
|
-
size: node.size ?? def?.defaultSize ?? { width: 140, height: 60 },
|
|
142
|
-
...(node.label !== undefined || !known ? { label: node.label ?? node.type } : def?.defaultLabel ? { label: def.defaultLabel } : {}),
|
|
143
|
-
...(node.parent ? { parentId: node.parent } : {}),
|
|
144
|
-
...(node.style ? { style: applyStyleInput(undefined, node.style) } : {}),
|
|
145
|
-
...(node.rotation ? { rotation: node.rotation } : {}),
|
|
146
|
-
...(node.locked ? { locked: true } : {}),
|
|
147
|
-
...(node.hidden ? { hidden: true } : {}),
|
|
148
|
-
...(node.data ? { data: node.data } : {}),
|
|
149
|
-
};
|
|
150
|
-
});
|
|
151
|
-
for (const node of nodes) {
|
|
152
|
-
const warning = node.parentId ? parentWarning(node.id, node.parentId, typeOf.get(node.parentId)) : null;
|
|
153
|
-
if (warning)
|
|
154
|
-
warnings.push(warning);
|
|
155
|
-
}
|
|
156
|
-
if (unknown.length > 0) {
|
|
157
|
-
throw new ToolInputError("DIAGRAM_UNKNOWN_COMPONENT_TYPE", `Unknown component type(s): ${unknown.map((entry) => entry.type).join(", ")}. Read callman://diagram/components for the catalog, or pass strictTypes:false to draw them as rectangles.`, { unknownTypes: unknown });
|
|
76
|
+
try {
|
|
77
|
+
const built = buildDiagramFromInput(input, {
|
|
78
|
+
strictTypes: options.strictTypes !== false,
|
|
79
|
+
existingId: options.existingId,
|
|
80
|
+
createdAt: options.createdAt,
|
|
81
|
+
idStrategy: "slug",
|
|
82
|
+
...(options.kind ? { kind: options.kind } : {}),
|
|
83
|
+
});
|
|
84
|
+
return { document: built.document, warnings: built.warnings, unpositionedNodeIds: built.unpositionedNodeIds };
|
|
158
85
|
}
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
const id = edge.id ?? nextEdgeId();
|
|
162
|
-
if (edgeIds.has(id))
|
|
163
|
-
throw new ToolInputError("DIAGRAM_DUPLICATE_EDGE_ID", `Duplicate edge id: ${id}`);
|
|
164
|
-
edgeIds.add(id);
|
|
165
|
-
for (const endpoint of [edge.source, edge.target]) {
|
|
166
|
-
if (!idSet.has(endpoint)) {
|
|
167
|
-
throw new ToolInputError("DIAGRAM_EDGE_ENDPOINT_NOT_FOUND", `Edge ${id} references "${endpoint}" which is not a node id.`);
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
let semantic = edge.semantic;
|
|
171
|
-
// A fresh edge into a broker reads as a bus line — the studio's own rule.
|
|
172
|
-
if (!semantic && (isBusComponentType(typeOf.get(edge.source)) || isBusComponentType(typeOf.get(edge.target)))) {
|
|
173
|
-
semantic = "bus";
|
|
174
|
-
}
|
|
175
|
-
const style = edgeStyleFor(semantic, edge.color);
|
|
176
|
-
return {
|
|
177
|
-
id,
|
|
178
|
-
source: edge.source,
|
|
179
|
-
target: edge.target,
|
|
180
|
-
...(edge.label ? { label: edge.label } : {}),
|
|
181
|
-
routing: edge.routing ?? "orthogonal",
|
|
182
|
-
markerEnd: edge.markerEnd ?? "classicThin",
|
|
183
|
-
...(edge.markerStart && edge.markerStart !== "none" ? { markerStart: edge.markerStart } : {}),
|
|
184
|
-
...(style && (!isDefaultEdgeStyle(style) || semantic === "sync" || edge.color) ? { style } : {}),
|
|
185
|
-
};
|
|
186
|
-
});
|
|
187
|
-
const timestamp = options.createdAt ?? nowIso();
|
|
188
|
-
const document = normalizeDiagramStyles({
|
|
189
|
-
schemaVersion: SCHEMA_VERSION,
|
|
190
|
-
id: options.existingId ?? `doc_${Math.random().toString(36).slice(2, 10)}`,
|
|
191
|
-
meta: { title: input.title.trim(), createdAt: timestamp, updatedAt: nowIso() },
|
|
192
|
-
canvas: { background: input.canvas?.background ?? "dots", gridSize: input.canvas?.gridSize ?? 16 },
|
|
193
|
-
nodes,
|
|
194
|
-
edges,
|
|
195
|
-
});
|
|
196
|
-
const parsed = safeParseDiagramDocument(document);
|
|
197
|
-
if (!parsed.ok) {
|
|
198
|
-
throw new ToolInputError("DIAGRAM_DOCUMENT_INVALID", `The diagram document is invalid: ${parsed.errors.join("; ")}`, { errors: parsed.errors });
|
|
86
|
+
catch (error) {
|
|
87
|
+
return toToolError(error);
|
|
199
88
|
}
|
|
200
|
-
return {
|
|
201
|
-
document: parsed.document,
|
|
202
|
-
warnings,
|
|
203
|
-
unpositionedNodeIds: input.nodes.filter((node) => !node.position).map((_node, index) => ids[index]),
|
|
204
|
-
};
|
|
205
89
|
};
|
|
206
90
|
//# sourceMappingURL=build.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/domain/diagram/build.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/domain/diagram/build.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,IAAI,sBAAsB,EAC5C,qBAAqB,EACrB,cAAc,EACd,cAAc,EACd,YAAY,EACZ,eAAe,EACf,aAAa,EACb,qBAAqB,GAEtB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEpE,0EAA0E;AAC1E,yEAAyE;AACzE,0EAA0E;AAC1E,2EAA2E;AAC3E,oEAAoE;AACpE,sEAAsE;AACtE,8DAA8D;AAE9D,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,CAAU,CAAC;AAElF,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,CAAU,CAAC;AACrI,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAU,CAAC;AAC/E,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAU,CAAC;AAEjE,MAAM,CAAC,MAAM,sBAAsB,GAAG,YAAY,CAAC;IACjD,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gEAAgE,CAAC;IACnH,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,qWAAqW,CAAC;IAC/Y,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IACrC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uFAAuF,CAAC;IACvI,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6FAA6F,CAAC;IAChL,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;IACxJ,KAAK,EAAE,oBAAoB,CAAC,QAAQ,EAAE;IACtC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;IACjF,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;IAChG,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC9B,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;IACpG,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0OAA0O,CAAC;CAC5R,EAAE,YAAY,CAAC,CAAC;AAEjB,MAAM,CAAC,MAAM,sBAAsB,GAAG,YAAY,CAAC;IACjD,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;IACxC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;IACrD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,+EAA+E,CAAC;IAC3H,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IACrC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qLAAqL,CAAC;IACjP,KAAK,EAAE,gBAAgB,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2DAA2D,CAAC;IACxG,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sGAAsG,CAAC;IACrJ,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;IAC1F,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sEAAsE,CAAC;IACvH,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gHAAgH,CAAC;IAC/J,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;IAClG,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wJAAwJ,CAAC;CAC1M,EAAE,YAAY,CAAC,CAAC;AAEjB,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC;KACtC,MAAM,CAAC;IACN,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE;IACxD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAChD,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kEAAkE,CAAC;CACzH,CAAC;KACD,MAAM,EAAE;KACR,QAAQ,EAAE;KACV,QAAQ,CAAC,uFAAuF,CAAC,CAAC;AAErG,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IACjC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IACtD,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC5D,MAAM,EAAE,wBAAwB;CACjC,CAAC,CAAC;AAyBH,kEAAkE;AAClE,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAc,EAAS,EAAE;IACnD,IAAI,KAAK,YAAY,cAAc;QAAE,MAAM,IAAI,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IACrG,MAAM,KAAK,CAAC;AACd,CAAC,CAAC;AAEF,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,qBAAqB,EAAE,CAAC;AAE/F,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAAY,EAAE,EAAU,EAAQ,EAAE;IACnE,IAAI,CAAC;QACH,sBAAsB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,WAAW,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAAmB,EAAE,UAA+B,EAAE,EAAsB,EAAE;IACjH,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,qBAAqB,CAAC,KAAK,EAAE;YACzC,WAAW,EAAE,OAAO,CAAC,WAAW,KAAK,KAAK;YAC1C,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,UAAU,EAAE,MAAM;YAClB,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChD,CAAC,CAAC;QACH,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,mBAAmB,EAAE,KAAK,CAAC,mBAAmB,EAAE,CAAC;IAChH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { type DiagramDocument, type
|
|
2
|
-
export
|
|
3
|
-
layout(graph: ElkGraphLike): Promise<ElkGraphLike>;
|
|
4
|
-
}
|
|
1
|
+
import { type DiagramDocument, type LayoutAlgorithm, type LayoutDirection, type LayoutEngine, type LayoutRequest } from "callman-core";
|
|
2
|
+
export type { LayoutEngine };
|
|
5
3
|
export interface LayoutOptionsInput {
|
|
6
4
|
algorithm?: LayoutAlgorithm;
|
|
7
5
|
direction?: LayoutDirection;
|
|
8
6
|
engine?: LayoutEngine;
|
|
7
|
+
nodeIds?: string[];
|
|
8
|
+
request?: Partial<LayoutRequest>;
|
|
9
9
|
}
|
|
10
10
|
export interface LayoutResult {
|
|
11
11
|
document: DiagramDocument;
|
|
@@ -14,4 +14,5 @@ export interface LayoutResult {
|
|
|
14
14
|
}
|
|
15
15
|
export declare const layoutDocument: (doc: DiagramDocument, options?: LayoutOptionsInput) => Promise<LayoutResult>;
|
|
16
16
|
export declare const placeNewNodes: (doc: DiagramDocument, nodeIds: string[], gap?: number) => DiagramDocument;
|
|
17
|
+
export declare const placeDatabaseNodes: (doc: DiagramDocument, nodeIds: string[]) => DiagramDocument;
|
|
17
18
|
//# sourceMappingURL=layout.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../src/domain/diagram/layout.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../src/domain/diagram/layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,eAAe,EAEpB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,YAAY,EAAyB,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAQrF,YAAY,EAAE,YAAY,EAAE,CAAC;AAE7B,MAAM,WAAW,kBAAkB;IACjC,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,MAAM,CAAC,EAAE,YAAY,CAAC;IAEtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAEnB,OAAO,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;CAClC;AAaD,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,cAAc,GAAU,KAAK,eAAe,EAAE,UAAS,kBAAuB,KAAG,OAAO,CAAC,YAAY,CAejH,CAAC;AAIF,eAAO,MAAM,aAAa,GAAI,KAAK,eAAe,EAAE,SAAS,MAAM,EAAE,EAAE,YAAQ,KAAG,eAGjF,CAAC;AAGF,eAAO,MAAM,kBAAkB,GAAI,KAAK,eAAe,EAAE,SAAS,MAAM,EAAE,KAAG,eAG5E,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { applyDiagramOps, placeNewNodesOps, runLayout, placeDatabaseNodesOps } from "callman-core";
|
|
2
2
|
let defaultEngine = null;
|
|
3
3
|
const loadElk = () => {
|
|
4
4
|
defaultEngine ??= import("elkjs/lib/elk.bundled.js").then((module) => {
|
|
@@ -9,53 +9,26 @@ const loadElk = () => {
|
|
|
9
9
|
return defaultEngine;
|
|
10
10
|
};
|
|
11
11
|
export const layoutDocument = async (doc, options = {}) => {
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
return {
|
|
23
|
-
document: touch(gridLayout(doc)),
|
|
24
|
-
engine: "grid",
|
|
25
|
-
warning: `Automatic layout fell back to a grid: ${error instanceof Error ? error.message : String(error)}`,
|
|
26
|
-
};
|
|
27
|
-
}
|
|
12
|
+
const engine = options.engine ?? (await loadElk());
|
|
13
|
+
const result = await runLayout(doc, {
|
|
14
|
+
...(options.request ?? {}),
|
|
15
|
+
algorithm: options.algorithm ?? options.request?.algorithm ?? "layered",
|
|
16
|
+
direction: options.direction ?? options.request?.direction ?? "DOWN",
|
|
17
|
+
mode: options.nodeIds && options.nodeIds.length > 0 ? "selection" : "full",
|
|
18
|
+
nodeIds: options.nodeIds,
|
|
19
|
+
}, engine);
|
|
20
|
+
const document = result.ops.length > 0 ? applyDiagramOps(doc, result.ops, { now: new Date().toISOString() }).doc : doc;
|
|
21
|
+
return { document, engine: result.engine, ...(result.warning ? { warning: result.warning } : {}) };
|
|
28
22
|
};
|
|
29
23
|
// Place ONLY the given nodes (new ones from a patch) below the current
|
|
30
24
|
// bounding box, in rows — nothing that already has a position moves.
|
|
31
25
|
export const placeNewNodes = (doc, nodeIds, gap = 40) => {
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
let cursorY = placed.length > 0 ? maxY + gap * 2 : 0;
|
|
40
|
-
let rowHeight = 0;
|
|
41
|
-
const rowLimit = 1200;
|
|
42
|
-
const nodes = doc.nodes.map((node) => {
|
|
43
|
-
if (!wanted.has(node.id))
|
|
44
|
-
return node;
|
|
45
|
-
if (cursorX + node.size.width > rowLimit && cursorX > 0) {
|
|
46
|
-
cursorX = Number.isFinite(minX) ? minX : 0;
|
|
47
|
-
cursorY += rowHeight + gap;
|
|
48
|
-
rowHeight = 0;
|
|
49
|
-
}
|
|
50
|
-
const positioned = { ...node, position: { x: cursorX, y: cursorY } };
|
|
51
|
-
cursorX += node.size.width + gap;
|
|
52
|
-
rowHeight = Math.max(rowHeight, node.size.height);
|
|
53
|
-
return positioned;
|
|
54
|
-
});
|
|
55
|
-
return touch({ ...doc, nodes });
|
|
26
|
+
const ops = placeNewNodesOps(doc, nodeIds, gap);
|
|
27
|
+
return ops.length > 0 ? applyDiagramOps(doc, ops, { now: new Date().toISOString() }).doc : doc;
|
|
28
|
+
};
|
|
29
|
+
// New tables of a database diagram go to the right of the canvas content.
|
|
30
|
+
export const placeDatabaseNodes = (doc, nodeIds) => {
|
|
31
|
+
const ops = placeDatabaseNodesOps(doc, nodeIds);
|
|
32
|
+
return ops.length > 0 ? applyDiagramOps(doc, ops, { now: new Date().toISOString() }).doc : doc;
|
|
56
33
|
};
|
|
57
|
-
const touch = (doc) => ({
|
|
58
|
-
...doc,
|
|
59
|
-
meta: { ...doc.meta, updatedAt: new Date().toISOString() },
|
|
60
|
-
});
|
|
61
34
|
//# sourceMappingURL=layout.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../../../src/domain/diagram/layout.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../../../src/domain/diagram/layout.ts"],"names":[],"mappings":"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"}
|