diagram-tool 0.1.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 (46) hide show
  1. package/README.md +64 -0
  2. package/dist/cli.d.ts +2 -0
  3. package/dist/cli.js +239 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/context.d.ts +27 -0
  6. package/dist/context.js +55 -0
  7. package/dist/context.js.map +1 -0
  8. package/dist/diagram.d.ts +51 -0
  9. package/dist/diagram.js +519 -0
  10. package/dist/diagram.js.map +1 -0
  11. package/dist/dom-shim.d.ts +1 -0
  12. package/dist/dom-shim.js +59 -0
  13. package/dist/dom-shim.js.map +1 -0
  14. package/dist/guide.d.ts +9 -0
  15. package/dist/guide.js +99 -0
  16. package/dist/guide.js.map +1 -0
  17. package/dist/library.d.ts +76 -0
  18. package/dist/library.js +364 -0
  19. package/dist/library.js.map +1 -0
  20. package/dist/llm.d.ts +23 -0
  21. package/dist/llm.js +124 -0
  22. package/dist/llm.js.map +1 -0
  23. package/dist/mcp-install.d.ts +1 -0
  24. package/dist/mcp-install.js +68 -0
  25. package/dist/mcp-install.js.map +1 -0
  26. package/dist/mcp.d.ts +6 -0
  27. package/dist/mcp.js +262 -0
  28. package/dist/mcp.js.map +1 -0
  29. package/dist/public/Assistant-Bold-ZDZZ6JHA.woff2 +0 -0
  30. package/dist/public/Assistant-Medium-DZ25RZU3.woff2 +0 -0
  31. package/dist/public/Assistant-Regular-PLF2XOGW.woff2 +0 -0
  32. package/dist/public/Assistant-SemiBold-CZ5MX6FK.woff2 +0 -0
  33. package/dist/public/viewer.css +2 -0
  34. package/dist/public/viewer.css.map +7 -0
  35. package/dist/public/viewer.js +3092 -0
  36. package/dist/public/viewer.js.map +7 -0
  37. package/dist/server.d.ts +9 -0
  38. package/dist/server.js +166 -0
  39. package/dist/server.js.map +1 -0
  40. package/libraries/UML-ER-library.excalidrawlib +5380 -0
  41. package/libraries/awesome-icons.excalidrawlib +4081 -0
  42. package/libraries/dev_ops.excalidrawlib +35468 -0
  43. package/libraries/network-topology-icons.excalidrawlib +5290 -0
  44. package/libraries/system-icons.excalidrawlib +4521 -0
  45. package/libraries/systemdesignicons.excalidrawlib +1307 -0
  46. package/package.json +38 -0
package/dist/guide.js ADDED
@@ -0,0 +1,99 @@
1
+ /** Single source of truth for agent-facing docs (plan §5).
2
+ * Reused by: MCP `initialize` instructions (summary), tool descriptions,
3
+ * `diagram-tool://guide` resource (full), and GUIDE.md generation. */
4
+ export const SERVER_INSTRUCTIONS = `Diagram Tool turns Mermaid into an Excalidraw scene with a live localhost UI.
5
+ Use it when the user asks to draw, visualize, diagram, or whiteboard anything.
6
+ Workflow: 1) get_diagram for current state (edits need it), 2) author the FULL mermaid source yourself, 3) render_diagram to validate+render — share the returned url. Open the url once; it live-updates on every render.
7
+ Structural changes = new mermaid + render. Never hand-edit scene.elements.
8
+ Supported types: flowchart, sequenceDiagram, erDiagram, classDiagram, stateDiagram-v2.`;
9
+ export const RENDER_DESCRIPTION = `Validate + render Mermaid into the shared Excalidraw scene (bumps rev, writes .excalidraw.json + .mmd sidecars, live UI updates). You author the mermaid — the server never calls an LLM.
10
+
11
+ TYPE CHOICE: processes/decisions/architecture -> flowchart (LR wide, TD tall); interactions over time -> sequenceDiagram; data models -> erDiagram; OOP -> classDiagram; states -> stateDiagram-v2.
12
+
13
+ FLOWCHART RULES: init line first: %%{init: {"flowchart": {"nodeSpacing": 60, "rankSpacing": 90, "curve": "linear"}}}%%. SELF-EXPLANATORY node ids (CLI, CTXFILE — never A/B/C). Declare ALL nodes first, then edges grouped with %% comments + blank lines (NO subgraphs — the renderer cannot draw them). Edge labels pipe-only: -->|reads|. Shape by role: rhombus {..} for decisions, [...] for everything else. End with palette + class on EVERY node: classDef actor fill:#e3f2fd,stroke:#1e88e5,stroke-width:2px / store fill:#fff3e0,stroke:#fb8c00 / flow fill:#e8f5e9,stroke:#43a047 / ext fill:#f3e5f5,stroke:#8e24aa. Max ~12 nodes. Hub with many edges -> TD. Max 3 edges per node; one edge per node pair (merge labels with " · ").
14
+
15
+ Example:
16
+ \`\`\`mermaid
17
+ %%{init: {"flowchart": {"nodeSpacing": 60, "rankSpacing": 90, "curve": "linear"}}}%%
18
+ flowchart LR
19
+ USER["User"]
20
+ CLI["diagram-tool CLI"]
21
+ CTXFILE["diagram-tool.context.json"]
22
+ USER-->|invokes|CLI
23
+ CLI-->|writes rev|CTXFILE
24
+ classDef actor fill:#e3f2fd,stroke:#1e88e5,stroke-width:2px
25
+ classDef store fill:#fff3e0,stroke:#fb8c00,stroke-width:2px
26
+ classDef flow fill:#e8f5e9,stroke:#43a047,stroke-width:2px
27
+ classDef ext fill:#f3e5f5,stroke:#8e24aa,stroke-width:2px
28
+ class USER actor
29
+ class CLI flow
30
+ class CTXFILE store
31
+ \`\`\`
32
+
33
+ LIBRARIES: cloud/architecture/system-design -> consider list_libraries (AWS/GCP/Azure/K8s icons via decorations, max ~6, decorate not replace). Logic flowcharts, sequence/ER/class diagrams -> NO libs, pure mermaid.
34
+ On parse error the server returns the error verbatim: fix ONLY the syntax and retry with the full source.`;
35
+ export const GET_DESCRIPTION = `Read the current diagram state {rev, prompt, mermaidSource}. Call first for edits/follow-ups so you preserve node IDs. Returns empty mermaidSource when nothing exists yet — then just render fresh.`;
36
+ export const LIST_LIBRARIES_DESCRIPTION = `Search the Excalidraw library catalog (all ~100 MIT libraries from libraries.excalidraw.com). Use for cloud/architecture/network diagrams where vendor icons help. Returns {slug, name, description, itemCount, sampleItems}. Empty query returns the curated top picks. Logic-only flowcharts, sequence/ER/class diagrams -> skip libs entirely (pure mermaid reads better).`;
37
+ export const LIST_ITEMS_DESCRIPTION = `List items inside one library {index, name, kind} so you can pick exact itemIndex values for render_diagram decorations. Call after list_libraries. Unbundled libraries are fetched on demand and cached — first call may take a few seconds.`;
38
+ export const GUIDE = `# Diagram Tool agent guide
39
+
40
+ ## Concepts
41
+ - One context file (default \`diagram-tool.context.json\`) is the source of truth: \`{rev, prompt, mermaidSource, scene}\`.
42
+ - Every render bumps \`rev\`, rewrites sidecars (\`.excalidraw.json\` for excalidraw.com import, \`.mmd\` source), and the localhost UI (SSE \`GET /api/live\` push, refetches on rev change) applies the new rev without reload.
43
+ - UI canvas edits autosave back (\`POST /api/scene\`, stale rev -> 409). Prefer mermaid edits for structure; canvas for nudges.
44
+
45
+ ## Recipes
46
+ - Create: author full mermaid -> \`render_diagram\` -> share \`url\`.
47
+ - Edit: \`get_diagram\` -> modify source preserving node IDs -> \`render_diagram\`.
48
+ - Restyle: same as edit (change classDefs/labels only).
49
+ - Import: paste an existing \`.mmd\` as \`mermaidSource\` and render.
50
+
51
+ ## Few-shot: flowchart LR
52
+ \`\`\`mermaid
53
+ %%{init: {"flowchart": {"nodeSpacing": 60, "rankSpacing": 90, "curve": "linear"}}}%%
54
+ flowchart LR
55
+ USER["User"]
56
+ CLI["diagram-tool CLI"]
57
+ CTXFILE["diagram-tool.context.json"]
58
+ WEBUI["React Excalidraw UI"]
59
+ USER-->|invokes|CLI
60
+ CLI-->|writes rev|CTXFILE
61
+ CTXFILE-->|polls|WEBUI
62
+ classDef actor fill:#e3f2fd,stroke:#1e88e5,stroke-width:2px
63
+ classDef store fill:#fff3e0,stroke:#fb8c00,stroke-width:2px
64
+ classDef flow fill:#e8f5e9,stroke:#43a047,stroke-width:2px
65
+ classDef ext fill:#f3e5f5,stroke:#8e24aa,stroke-width:2px
66
+ class USER actor
67
+ class CLI,WEBUI flow
68
+ class CTXFILE store
69
+ \`\`\`
70
+
71
+ ## Few-shot: sequenceDiagram
72
+ \`\`\`mermaid
73
+ sequenceDiagram
74
+ participant C as Client
75
+ participant S as Server
76
+ C->>S: GET /api/context
77
+ activate S
78
+ S-->>C: 200 context
79
+ deactivate S
80
+ \`\`\`
81
+
82
+ ## Libraries: when icons vs no icons
83
+ - Cloud/architecture/system-design -> \`list_libraries\` (aws/gcp/azure/kubernetes), pick <=6 icons, pass as \`decorations\`. Icons decorate labeled boxes; never drop labels.
84
+ - Network topologies -> \`network-topology-icons\`.
85
+ - Flowcharts of logic, sequence/ER/class/state diagrams -> NO libraries.
86
+ - Node icon classes (\`class USER actor,icon_user\`) also work with the 10 bundled slugs: icon_user, icon_users, icon_home, icon_lock, icon_search, icon_chart, icon_email, icon_calendar, icon_location, icon_payment.
87
+
88
+ ## Troubleshooting
89
+ | Symptom | Fix |
90
+ |---|---|
91
+ | Mermaid parse error (returned verbatim) | Fix syntax only, resend full source |
92
+ | Converter: no drawable elements / subgraph | Flatten subgraphs into plain nodes + edges |
93
+ | 409 rev conflict (UI edited meanwhile) | \`get_diagram\`, rebase, render again |
94
+ | Port 3000 taken | Server falls back to a free port; use returned \`url\` |
95
+ | Viewer bundle missing | Run the package build once (\`node src/viewer/build.mjs\`) |
96
+ | Library item index out of range | Error lists valid range; \`list_library_items\` to repick |
97
+ | Offline + uncached library | Connect once (fetch+cache) or stick to the 6 bundled libs |
98
+ `;
99
+ //# sourceMappingURL=guide.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guide.js","sourceRoot":"","sources":["../src/guide.ts"],"names":[],"mappings":"AAAA;;sEAEsE;AAEtE,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;uFAIoD,CAAC;AAExF,MAAM,CAAC,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;0GAyBwE,CAAC;AAE3G,MAAM,CAAC,MAAM,eAAe,GAAG,sMAAsM,CAAC;AAEtO,MAAM,CAAC,MAAM,0BAA0B,GAAG,+WAA+W,CAAC;AAE1Z,MAAM,CAAC,MAAM,sBAAsB,GAAG,+OAA+O,CAAC;AAEtR,MAAM,CAAC,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4DpB,CAAC"}
@@ -0,0 +1,76 @@
1
+ export interface LibraryItem {
2
+ id: string;
3
+ elements: Record<string, unknown>[];
4
+ }
5
+ /** libraries/*.excalidrawlib in both formats (libraryItems[] and legacy library[]). */
6
+ export declare function loadLibraryItems(dir: string): Promise<LibraryItem[]>;
7
+ /** Resolve slugs to templates, skipping any whose caption drifted. */
8
+ export declare function loadIconTemplates(dir: string): Promise<Map<string, Record<string, unknown>[]>>;
9
+ export interface CatalogEntry {
10
+ slug: string;
11
+ name: string;
12
+ description: string;
13
+ keywords: string;
14
+ /** upstream path under libraries/, e.g. "slobodan/aws-serverless.excalidrawlib" */
15
+ source: string;
16
+ /** local filename for bundled/cache lookup */
17
+ file: string;
18
+ sampleItems: string[];
19
+ bundled: boolean;
20
+ }
21
+ export declare const CATALOG: CatalogEntry[];
22
+ export interface LibraryHit {
23
+ slug: string;
24
+ name: string;
25
+ description: string;
26
+ itemCount: number | null;
27
+ sampleItems: string[];
28
+ }
29
+ /** Keyword-ranked catalog search. Logic-only queries return [] + no-libs hint. */
30
+ export declare function listLibraries(query?: string): {
31
+ hits: LibraryHit[];
32
+ noLibsHint?: string;
33
+ };
34
+ /** Local library dir: project ./libraries if present, else the shipped bundle. */
35
+ export declare function libraryDir(): string;
36
+ /** Parse v1 + v2 payloads into item element-groups. Skips image items (need files map). */
37
+ export declare function normalizePayload(raw: unknown, label: string): Record<string, unknown>[][];
38
+ /** Resolve a library slug to item groups: cwd/libraries → cache → bundled → upstream fetch. */
39
+ export declare function loadLibraryBySlug(slug: string, libraryUrl?: string): Promise<{
40
+ entry: CatalogEntry | null;
41
+ groups: Record<string, unknown>[][];
42
+ names: string[];
43
+ }>;
44
+ /** TTL check helper for cache freshness messaging (7 days). */
45
+ export declare function isCacheFresh(file: string): Promise<boolean>;
46
+ export interface Decoration {
47
+ library: string;
48
+ itemIndex: number;
49
+ libraryUrl?: string;
50
+ scale?: number;
51
+ x?: number;
52
+ y?: number;
53
+ }
54
+ /**
55
+ * Clone library items onto the scene with fresh ids + remapped internal refs,
56
+ * scaled, auto-tiled along the bottom row unless explicit x/y given.
57
+ */
58
+ export declare function applyDecorations(elements: Record<string, unknown>[], decorations: Decoration[]): Promise<{
59
+ added: number;
60
+ placed: {
61
+ library: string;
62
+ itemIndex: number;
63
+ elementIds: string[];
64
+ }[];
65
+ }>;
66
+ /**
67
+ * Fit a library item's artwork into a node card: strip its own caption text
68
+ * (the node's label stays), normalize coords, scale into the top of the box,
69
+ * node caption pinned to the bottom strip.
70
+ */
71
+ export declare function instantiateIcon(template: Record<string, unknown>[], box: {
72
+ x: number;
73
+ y: number;
74
+ w: number;
75
+ h: number;
76
+ }, groupId: string): Record<string, unknown>[];
@@ -0,0 +1,364 @@
1
+ import { readFile, readdir, mkdir, writeFile, stat } from "node:fs/promises";
2
+ import { join, dirname } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { existsSync } from "node:fs";
5
+ import { homedir } from "node:os";
6
+ /** libraries/*.excalidrawlib in both formats (libraryItems[] and legacy library[]). */
7
+ export async function loadLibraryItems(dir) {
8
+ if (!existsSync(dir))
9
+ return [];
10
+ const files = (await readdir(dir)).filter((f) => f.endsWith(".excalidrawlib"));
11
+ const out = [];
12
+ for (const f of files) {
13
+ try {
14
+ const d = JSON.parse(await readFile(join(dir, f), "utf8"));
15
+ if (Array.isArray(d.libraryItems)) {
16
+ for (const it of d.libraryItems) {
17
+ if (it && Array.isArray(it.elements))
18
+ out.push({ id: String(it.id ?? `${f}#${out.length}`), elements: it.elements });
19
+ }
20
+ }
21
+ else if (Array.isArray(d.library)) {
22
+ const lib = d.library;
23
+ if (lib.length > 0 && Array.isArray(lib[0])) {
24
+ // oldest format: library = list of element-groups
25
+ for (let i = 0; i < lib.length; i++) {
26
+ out.push({ id: `${f}#${i}`, elements: lib[i] });
27
+ }
28
+ }
29
+ else {
30
+ for (let i = 0; i < lib.length; i++) {
31
+ const e = lib[i];
32
+ out.push({ id: String(e.id ?? `${f}#${i}`), elements: [e] });
33
+ }
34
+ }
35
+ }
36
+ }
37
+ catch {
38
+ /* skip corrupt files */
39
+ }
40
+ }
41
+ return out;
42
+ }
43
+ /**
44
+ * Named icon slots for generation. Pinned by file + index, verified by the
45
+ * caption text inside the item at load time (index shifts are detected).
46
+ */
47
+ const ICON_SLOTS = [
48
+ { slug: "icon_user", file: "awesome-icons.excalidrawlib", index: 13, expect: "User" },
49
+ { slug: "icon_users", file: "awesome-icons.excalidrawlib", index: 14, expect: "Users" },
50
+ { slug: "icon_home", file: "awesome-icons.excalidrawlib", index: 4, expect: "Home" },
51
+ { slug: "icon_lock", file: "awesome-icons.excalidrawlib", index: 5, expect: "Lock" },
52
+ { slug: "icon_search", file: "awesome-icons.excalidrawlib", index: 2, expect: "Search" },
53
+ { slug: "icon_chart", file: "awesome-icons.excalidrawlib", index: 8, expect: "Chart" },
54
+ { slug: "icon_email", file: "awesome-icons.excalidrawlib", index: 22, expect: "email" },
55
+ { slug: "icon_calendar", file: "awesome-icons.excalidrawlib", index: 10, expect: "Calendar" },
56
+ { slug: "icon_location", file: "awesome-icons.excalidrawlib", index: 17, expect: "Location" },
57
+ { slug: "icon_payment", file: "awesome-icons.excalidrawlib", index: 11, expect: "Payment" },
58
+ ];
59
+ function captionOf(elements) {
60
+ return elements
61
+ .filter((e) => e.type === "text" && typeof e.text === "string")
62
+ .map((e) => e.text)
63
+ .join(" ");
64
+ }
65
+ /** Resolve slugs to templates, skipping any whose caption drifted. */
66
+ export async function loadIconTemplates(dir) {
67
+ const out = new Map();
68
+ for (const slot of ICON_SLOTS) {
69
+ try {
70
+ const d = JSON.parse(await readFile(join(dir, slot.file), "utf8"));
71
+ let elements = null;
72
+ if (Array.isArray(d.libraryItems) && d.libraryItems[slot.index]?.elements) {
73
+ elements = d.libraryItems[slot.index].elements;
74
+ }
75
+ else if (Array.isArray(d.library) && Array.isArray(d.library[0])) {
76
+ elements = d.library[slot.index];
77
+ }
78
+ if (elements && captionOf(elements).includes(slot.expect)) {
79
+ out.set(slot.slug, elements);
80
+ }
81
+ else {
82
+ console.error(`[library] slot ${slot.slug}: caption drift, skipping`);
83
+ }
84
+ }
85
+ catch (e) {
86
+ console.error(`[library] slot ${slot.slug}: ${e instanceof Error ? e.message : String(e)}`);
87
+ }
88
+ }
89
+ return out;
90
+ }
91
+ let idCounter = 0;
92
+ const freshId = () => `lib${Date.now().toString(36)}${(idCounter++).toString(36)}`;
93
+ const UPSTREAM_BASE = "https://raw.githubusercontent.com/excalidraw/excalidraw-libraries/main/libraries";
94
+ export const CATALOG = [
95
+ { slug: "aws-serverless", name: "AWS Serverless Icons", description: "Lambda, API Gateway, DynamoDB, S3, SQS, SNS and more.", keywords: "aws lambda serverless cloud s3 dynamodb api gateway", source: "slobodan/aws-serverless.excalidrawlib", file: "aws-serverless.excalidrawlib", sampleItems: ["Lambda", "S3", "DynamoDB", "API Gateway", "SQS"], bundled: false },
96
+ { slug: "aws-architecture", name: "AWS Architecture Icons", description: "EC2, ELB, Lambda and core AWS building blocks.", keywords: "aws ec2 elb architecture cloud", source: "narhari-motivaras/aws-architecture-icons.excalidrawlib", file: "aws-architecture-icons.excalidrawlib", sampleItems: ["EC2", "ELB", "Lambda"], bundled: false },
97
+ { slug: "gcp-icons", name: "GCP Icons", description: "Google Cloud Platform product icons.", keywords: "gcp google cloud", source: "clementbosc/gcp-icons.excalidrawlib", file: "gcp-icons.excalidrawlib", sampleItems: ["Compute", "Storage", "BigQuery"], bundled: false },
98
+ { slug: "azure-cloud", name: "Azure cloud services icons", description: "Key Vault, App Service, SQL Database, VMs and more.", keywords: "azure microsoft cloud vm sql", source: "youritjang/azure-cloud-services.excalidrawlib", file: "azure-cloud-services.excalidrawlib", sampleItems: ["Key Vault", "App Service", "Virtual Machine", "SQL Database"], bundled: false },
99
+ { slug: "technology-logos", name: "Technology Logos", description: "Kubernetes, Docker, Terraform, Kafka, Redis and cloud-native logos.", keywords: "kubernetes docker k8s terraform kafka redis devops logo", source: "maeddes/technology-logos.excalidrawlib", file: "technology-logos.excalidrawlib", sampleItems: ["Kubernetes", "Docker", "Terraform", "Kafka"], bundled: false },
100
+ { slug: "software-architecture", name: "Software Architecture", description: "Microservice, database, cache, event bus, browser, mobile.", keywords: "software architecture microservice database cache", source: "youritjang/software-architecture.excalidrawlib", file: "software-architecture.excalidrawlib", sampleItems: ["microservice", "database", "cache"], bundled: false },
101
+ { slug: "network-topology", name: "Network topology icons", description: "Router, switch, firewall, server, VPN, client.", keywords: "network router switch firewall server vpn topology", source: "dwelle/network-topology-icons.excalidrawlib", file: "network-topology-icons.excalidrawlib", sampleItems: ["Router", "Switch", "Firewall", "Server", "VPN"], bundled: true },
102
+ { slug: "dev-ops", name: "Dev Ops Icons", description: "Nomad, Consul, Vault, Ansible, Docker, Kubernetes, Terraform and more.", keywords: "devops ansible vault consul nomad github docker kubernetes terraform", source: "markopolo123/dev_ops.excalidrawlib", file: "dev_ops.excalidrawlib", sampleItems: ["Docker", "Kubernetes", "Terraform", "Ansible"], bundled: true },
103
+ { slug: "it-logos", name: "IT Logos", description: "React, Python, Docker, Kubernetes, Kafka and web stack logos.", keywords: "react python docker kubernetes logo frontend backend", source: "pclainchard/it-logos.excalidrawlib", file: "it-logos.excalidrawlib", sampleItems: ["React", "Python", "Docker", "Kubernetes"], bundled: false },
104
+ { slug: "system-design", name: "System Design Components", description: "Generic high-level system design blocks.", keywords: "system design interview cloud stream server db", source: "rohanp/system-design.excalidrawlib", file: "system-design.excalidrawlib", sampleItems: ["Cloud", "Servers", "DB"], bundled: false },
105
+ { slug: "systemdesignicons", name: "System Design Icons", description: "Service clusters, cache layers, MapReduce blocks.", keywords: "system design cache cluster mapreduce", source: "niknm/systemdesignicons.excalidrawlib", file: "systemdesignicons.excalidrawlib", sampleItems: ["ServiceCluster", "cacheLayer"], bundled: true },
106
+ { slug: "uml-er", name: "Shapes for UML & ER Diagrams", description: "Opinionated UML and ER shapes.", keywords: "uml er diagram class entity", source: "BjoernKW/UML-ER-library.excalidrawlib", file: "UML-ER-library.excalidrawlib", sampleItems: ["class", "entity"], bundled: true },
107
+ { slug: "awesome-icons", name: "Awesome Icons", description: "Everyday glyphs: user, lock, search, chart, email, calendar.", keywords: "icon user lock search chart email calendar home ui", source: "ferminrp/awesome-icons.excalidrawlib", file: "awesome-icons.excalidrawlib", sampleItems: ["User", "Lock", "Search", "Chart", "email"], bundled: true },
108
+ { slug: "system-icons", name: "System Icons", description: "Document, cloud, star, file and generic system glyphs.", keywords: "icon document cloud file star system", source: "xxxdeveloper/system-icons.excalidrawlib", file: "system-icons.excalidrawlib", sampleItems: ["document", "cloud", "star"], bundled: true },
109
+ ];
110
+ const LOGIC_ONLY = /\b(sequence|er\b|class diagram|state diagram|flowchart of logic|algorithm)\b/i;
111
+ /** Keyword-ranked catalog search. Logic-only queries return [] + no-libs hint. */
112
+ export function listLibraries(query = "") {
113
+ const q = query.trim().toLowerCase();
114
+ if (q && LOGIC_ONLY.test(q)) {
115
+ return { hits: [], noLibsHint: "Logic-only diagram — use pure mermaid, no libraries." };
116
+ }
117
+ const terms = q.split(/\s+/).filter(Boolean);
118
+ const scored = CATALOG.map((e) => {
119
+ let score = 0;
120
+ if (!terms.length)
121
+ score = e.bundled ? 2 : 1;
122
+ for (const t of terms) {
123
+ if (e.slug.includes(t))
124
+ score += 3;
125
+ if (e.keywords.includes(t))
126
+ score += 2;
127
+ if (e.name.toLowerCase().includes(t))
128
+ score += 2;
129
+ if (e.description.toLowerCase().includes(t))
130
+ score += 1;
131
+ }
132
+ return { e, score };
133
+ })
134
+ .filter((s) => s.score > 0)
135
+ .sort((a, b) => b.score - a.score)
136
+ .slice(0, 10);
137
+ return {
138
+ hits: scored.map((s) => ({
139
+ slug: s.e.slug, name: s.e.name, description: s.e.description,
140
+ itemCount: s.e.sampleItems.length || null, sampleItems: s.e.sampleItems.slice(0, 5),
141
+ })),
142
+ };
143
+ }
144
+ function cacheDir() {
145
+ return join(homedir(), ".cache", "diagram-tool", "libraries");
146
+ }
147
+ function bundledDir() {
148
+ // dist/library.js -> ../libraries ; src/library.ts -> ../libraries (repo root)
149
+ return join(dirname(fileURLToPath(import.meta.url)), "..", "libraries");
150
+ }
151
+ /** Local library dir: project ./libraries if present, else the shipped bundle. */
152
+ export function libraryDir() {
153
+ const local = join(process.cwd(), "libraries");
154
+ if (existsSync(local))
155
+ return local;
156
+ return bundledDir();
157
+ }
158
+ const payloadCache = new Map();
159
+ /** Parse v1 + v2 payloads into item element-groups. Skips image items (need files map). */
160
+ export function normalizePayload(raw, label) {
161
+ const d = raw;
162
+ if (!d || typeof d !== "object" || d.type !== "excalidrawlib") {
163
+ throw new Error(`Not an .excalidrawlib payload: ${label}`);
164
+ }
165
+ const groups = [];
166
+ if (Array.isArray(d.libraryItems)) {
167
+ for (const it of d.libraryItems) {
168
+ if (it && Array.isArray(it.elements)) {
169
+ const els = it.elements.filter((e) => e.type !== "image");
170
+ if (els.length)
171
+ groups.push(els);
172
+ }
173
+ }
174
+ }
175
+ else if (Array.isArray(d.library)) {
176
+ const lib = d.library;
177
+ if (lib.length > 0 && Array.isArray(lib[0])) {
178
+ for (const g of lib) {
179
+ const els = g.filter((e) => e.type !== "image");
180
+ if (els.length)
181
+ groups.push(els);
182
+ }
183
+ }
184
+ }
185
+ return groups;
186
+ }
187
+ async function readPayloadFile(path) {
188
+ const raw = JSON.parse(await readFile(path, "utf8"));
189
+ return normalizePayload(raw, path);
190
+ }
191
+ /** Resolve a library slug to item groups: cwd/libraries → cache → bundled → upstream fetch. */
192
+ export async function loadLibraryBySlug(slug, libraryUrl) {
193
+ const entry = CATALOG.find((e) => e.slug === slug) ?? null;
194
+ const cacheKey = libraryUrl ?? slug;
195
+ const cached = payloadCache.get(cacheKey);
196
+ if (cached)
197
+ return { entry, groups: cached, names: namesOf(cached) };
198
+ const candidates = [];
199
+ if (entry) {
200
+ candidates.push(join(process.cwd(), "libraries", entry.file));
201
+ candidates.push(join(cacheDir(), entry.file));
202
+ candidates.push(join(bundledDir(), entry.file));
203
+ }
204
+ for (const p of candidates) {
205
+ if (existsSync(p)) {
206
+ try {
207
+ const groups = await readPayloadFile(p);
208
+ payloadCache.set(cacheKey, groups);
209
+ return { entry, groups, names: namesOf(groups) };
210
+ }
211
+ catch { /* try next */ }
212
+ }
213
+ }
214
+ // On-demand upstream fetch (explicit URL wins, else catalog source).
215
+ const url = libraryUrl ?? (entry ? `${UPSTREAM_BASE}/${entry.source}` : null);
216
+ if (!url)
217
+ throw new Error(`Unknown library "${slug}". Use list_libraries to discover slugs.`);
218
+ if (!entry && libraryUrl) {
219
+ if (!/^https:\/\/raw\.githubusercontent\.com\/excalidraw\/excalidraw-libraries\//.test(libraryUrl)) {
220
+ throw new Error("libraryUrl must point at the excalidraw-libraries repo (or save the file locally).");
221
+ }
222
+ }
223
+ const res = await fetch(url);
224
+ if (!res.ok)
225
+ throw new Error(`Library fetch failed: HTTP ${res.status} (${url}). Offline? Use one of the 6 bundled libs.`);
226
+ const raw = await res.json();
227
+ const groups = normalizePayload(raw, url);
228
+ payloadCache.set(cacheKey, groups);
229
+ // Persist to disk cache (best effort, 7-day TTL enforced on read).
230
+ try {
231
+ if (entry) {
232
+ await mkdir(cacheDir(), { recursive: true });
233
+ await writeFile(join(cacheDir(), entry.file), JSON.stringify(raw));
234
+ }
235
+ }
236
+ catch { /* cache write optional */ }
237
+ return { entry, groups, names: namesOf(groups) };
238
+ }
239
+ function namesOf(groups) {
240
+ return groups.map((els, i) => {
241
+ const t = els.find((e) => e.type === "text" && typeof e.text === "string");
242
+ const name = t ? String(t.text).slice(0, 40) : "";
243
+ return name || `item ${i}`;
244
+ });
245
+ }
246
+ /** TTL check helper for cache freshness messaging (7 days). */
247
+ export async function isCacheFresh(file) {
248
+ try {
249
+ const st = await stat(join(cacheDir(), file));
250
+ return Date.now() - st.mtimeMs < 7 * 24 * 3600 * 1000;
251
+ }
252
+ catch {
253
+ return false;
254
+ }
255
+ }
256
+ /**
257
+ * Clone library items onto the scene with fresh ids + remapped internal refs,
258
+ * scaled, auto-tiled along the bottom row unless explicit x/y given.
259
+ */
260
+ export async function applyDecorations(elements, decorations) {
261
+ if (decorations.length > 6)
262
+ throw new Error("Max 6 decorations per render (keeps diagrams readable).");
263
+ const num = (v, d = 0) => (typeof v === "number" && isFinite(v) ? v : d);
264
+ const xs = elements.flatMap((e) => (typeof e.x === "number" && typeof e.width === "number" ? [e.x, e.x + e.width] : []));
265
+ const ys = elements.flatMap((e) => (typeof e.y === "number" && typeof e.height === "number" ? [e.y, e.y + e.height] : []));
266
+ let cursorX = xs.length ? Math.min(...xs) : 0;
267
+ const baseY = ys.length ? Math.max(...ys) + 60 : 0;
268
+ const placed = [];
269
+ let added = 0;
270
+ for (const d of decorations) {
271
+ const { groups } = await loadLibraryBySlug(d.library, d.libraryUrl);
272
+ const template = groups[d.itemIndex];
273
+ if (!template)
274
+ throw new Error(`Item ${d.itemIndex} out of range for "${d.library}" (0–${groups.length - 1}). Use list_library_items to repick.`);
275
+ const scale = d.scale ?? 1;
276
+ // bbox of template
277
+ const tx = template.flatMap((e) => (typeof e.x === "number" && typeof e.width === "number" ? [e.x, e.x + e.width] : []));
278
+ const ty = template.flatMap((e) => (typeof e.y === "number" && typeof e.height === "number" ? [e.y, e.y + e.height] : []));
279
+ if (!tx.length || !ty.length)
280
+ continue;
281
+ const minX = Math.min(...tx);
282
+ const minY = Math.min(...ty);
283
+ const w = Math.max(1, Math.max(...tx) - minX) * scale;
284
+ const targetX = d.x ?? cursorX;
285
+ const targetY = d.y ?? baseY;
286
+ const idMap = new Map();
287
+ for (const e of template) {
288
+ if (typeof e.id === "string")
289
+ idMap.set(e.id, freshId());
290
+ }
291
+ const groupId = freshId();
292
+ const ids = [];
293
+ for (const e of template) {
294
+ const nid = idMap.get(String(e.id)) ?? freshId();
295
+ ids.push(nid);
296
+ const clone = {
297
+ ...e, id: nid, groupIds: [...(e.groupIds ?? []), groupId],
298
+ x: num(e.x) * scale + (targetX - minX * scale),
299
+ y: num(e.y) * scale + (targetY - minY * scale),
300
+ width: num(e.width) * scale, height: num(e.height) * scale,
301
+ seed: Math.floor(Math.random() * 2 ** 31),
302
+ versionNonce: Math.floor(Math.random() * 2 ** 31),
303
+ };
304
+ // remap internal refs
305
+ if (typeof e.containerId === "string" && idMap.has(e.containerId))
306
+ clone.containerId = idMap.get(e.containerId);
307
+ const be = e.boundElements;
308
+ if (Array.isArray(be))
309
+ clone.boundElements = be.map((b) => ({ ...b, id: idMap.get(b.id) ?? b.id }));
310
+ const start = e.start;
311
+ const end = e.end;
312
+ if (start?.id && idMap.has(start.id))
313
+ clone.start = { ...start, id: idMap.get(start.id) };
314
+ if (end?.id && idMap.has(end.id))
315
+ clone.end = { ...end, id: idMap.get(end.id) };
316
+ elements.push(clone);
317
+ added++;
318
+ }
319
+ if (d.x === undefined)
320
+ cursorX += w + 40;
321
+ placed.push({ library: d.library, itemIndex: d.itemIndex, elementIds: ids });
322
+ }
323
+ return { added, placed };
324
+ }
325
+ /**
326
+ * Fit a library item's artwork into a node card: strip its own caption text
327
+ * (the node's label stays), normalize coords, scale into the top of the box,
328
+ * node caption pinned to the bottom strip.
329
+ */
330
+ export function instantiateIcon(template, box, groupId) {
331
+ const art = template.filter((e) => e.type !== "text");
332
+ const xs = [];
333
+ const ys = [];
334
+ for (const e of art) {
335
+ if (typeof e.x === "number" && typeof e.width === "number")
336
+ xs.push(e.x, e.x + e.width);
337
+ if (typeof e.y === "number" && typeof e.height === "number")
338
+ ys.push(e.y, e.y + e.height);
339
+ }
340
+ if (xs.length === 0 || ys.length === 0)
341
+ return [];
342
+ const minX = Math.min(...xs);
343
+ const minY = Math.min(...ys);
344
+ const natW = Math.max(1, Math.max(...xs) - minX);
345
+ const natH = Math.max(1, Math.max(...ys) - minY);
346
+ const targetH = Math.max(24, box.h - 46);
347
+ const targetW = Math.max(24, box.w - 24);
348
+ const s = Math.min(targetW / natW, targetH / natH);
349
+ const offX = box.x + box.w / 2 - (natW * s) / 2 - minX * s;
350
+ const offY = box.y + 10 - minY * s;
351
+ const num = (v) => (typeof v === "number" ? v : 0);
352
+ return art.map((e) => ({
353
+ ...e,
354
+ id: freshId(),
355
+ groupIds: [groupId],
356
+ x: num(e.x) * s + offX,
357
+ y: num(e.y) * s + offY,
358
+ width: num(e.width) * s,
359
+ height: num(e.height) * s,
360
+ seed: Math.floor(Math.random() * 2 ** 31),
361
+ versionNonce: Math.floor(Math.random() * 2 ** 31),
362
+ }));
363
+ }
364
+ //# sourceMappingURL=library.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"library.js","sourceRoot":"","sources":["../src/library.ts"],"names":[],"mappings":"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"}
package/dist/llm.d.ts ADDED
@@ -0,0 +1,23 @@
1
+ /** Tiny fetch-based LLM layer. No provider SDKs. */
2
+ export type Provider = "openai" | "anthropic" | "google" | "ollama" | "openrouter";
3
+ export interface ChatMsg {
4
+ role: "system" | "user" | "assistant";
5
+ content: string;
6
+ }
7
+ export interface LlmOpts {
8
+ provider: Provider;
9
+ model: string;
10
+ apiKey?: string;
11
+ baseUrl?: string;
12
+ temperature?: number;
13
+ timeoutMs?: number;
14
+ }
15
+ export declare class LlmError extends Error {
16
+ provider: string;
17
+ status?: number;
18
+ constructor(provider: string, message: string, status?: number);
19
+ }
20
+ export declare const DEFAULT_MODELS: Record<Provider, string>;
21
+ export declare function resolveKey(provider: Provider, apiKey?: string): string | undefined;
22
+ /** One automatic retry on 429/5xx/timeout. Throws LlmError otherwise. */
23
+ export declare function complete(messages: ChatMsg[], opts: LlmOpts): Promise<string>;