feat(diagram-engine): wire up restructure_diagram + stencil catalog

Closes the loop: the model can now build and edit AWS architecture diagrams by
declaring structure, and never writes an mxCell again.

catalog.ts — 983 AWS icon and 19 group stencils as a name→style map, generated from
drawio-ai-kit's catalog (itself generated from jgraph's draw.io shape index). Styles
are verbatim, so the official category colours, connection points and aspect=fixed
come along for free and nothing is hand-assembled. An invented name is rejected with
suggestions instead of rendering as a blank square, which is what draw.io does with
an unknown resIcon today.

operations.ts — what the model actually sends: add_icon / add_container / move /
link / set_dir and so on, applied in order against the tree. Guards the things that
break a diagram quietly: duplicate ids (draw.io drops one of the two cells), edges
left pointing at a removed node, and moving a container inside itself.

index.ts — the entry point. current XML → parse → apply ops → check names → layout →
render → new XML. The tree is not stored between calls; it is re-derived from the
canvas every time, so a user's manual edits are input to the next layout rather than
state to reconcile.

Token cost, measured with Claude's tokenizer rather than estimated:
  - build a VPC diagram:  515 tok as operations vs 3180 as XML   (6.2x)
  - add one icon:          27 tok as an operation vs 3823 re-emitting (142x)
  - read current state:   216 tok as an outline vs 3180 as XML   (14.7x)

The 142x is the one that matters day to day: "add a Redis" is one operation, not a
rewrite of the whole diagram.

Routing in the system prompt sends AWS architecture through this path and leaves
flowcharts, BPMN, sequence diagrams, mind maps and Azure/GCP on display_diagram —
the layout engine's primitives (nested rows, columns, grids) do not model a sequence
diagram's lifelines or a mind map's radial spread, and pretending otherwise would
make those worse rather than better.

Also: added a NOTICE recording the MIT port and the AWS Architecture Icons terms,
and a narrow .gitignore exception so the generated catalog is tracked while the
root data/ directory (admin settings, contains secrets) stays ignored.

403 unit tests + 3 new e2e. Verified in the real app: a structural tool call renders
with real stencils and container markers; a second call adds one node and keeps
everything from the first; an invented name is refused and nothing is drawn. The 13
existing diagram e2e tests still pass.
This commit is contained in:
dayuan.jiang
2026-08-09 12:13:54 +09:00
parent a2f892ca82
commit cd1df1eb6a
14 changed files with 3475 additions and 7 deletions

43
NOTICE Normal file
View File

@@ -0,0 +1,43 @@
next-ai-draw-io
Copyright the next-ai-draw-io contributors
This product includes software developed by third parties, as set out below.
--------------------------------------------------------------------------------
lib/diagram-engine/ — layout and rendering
--------------------------------------------------------------------------------
The declarative layout algorithm (bottom-up measure, top-down place, sibling
size equalisation) and the mxCell/style emission in `lib/diagram-engine/layout.ts`
and `lib/diagram-engine/render.ts` are derived from drawio-ai-kit:
https://github.com/sparklabx/drawio-ai-kit
Copyright (c) sparklabx
Licensed under the MIT License
The XML→tree reverse parser (`lib/diagram-engine/parse.ts`), the style-marker
scheme (`markers.ts`), the structural-operations layer (`operations.ts`) and the
invisible-container approach that replaces that project's "phantom" nodes are
original to this repository.
--------------------------------------------------------------------------------
lib/diagram-engine/data/aws-stencils.json — stencil catalog
--------------------------------------------------------------------------------
A name→style map for the mxgraph.aws4 stencil family, generated from
drawio-ai-kit's `catalog/aws.json`, which in turn was generated from the draw.io
shape index published by jgraph:
https://github.com/jgraph/drawio-mcp
Copyright (c) JGraph Ltd
Licensed under the Apache License, Version 2.0
The style strings are reproduced verbatim from that index. They reference the
official AWS Architecture Icons, which are trademarks of Amazon Web Services and
are NOT covered by this repository's licence. Their use is governed by the AWS
Architecture Icons terms:
https://aws.amazon.com/architecture/icons/
The catalog contains stencil *names and style strings* only — it does not embed
any AWS icon artwork. draw.io supplies the artwork at render time.