@particle-academy/fancy-flow 0.35.0 → 0.37.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 (54) hide show
  1. package/dist/FlowViewer-C4QAVgWv.d.ts +62 -0
  2. package/dist/FlowViewer-nLqo7s2E.d.cts +62 -0
  3. package/dist/{chunk-N5ICD2WZ.js → chunk-3BKU4SQZ.js} +3 -3
  4. package/dist/{chunk-N5ICD2WZ.js.map → chunk-3BKU4SQZ.js.map} +1 -1
  5. package/dist/chunk-5UCWY7G3.js +593 -0
  6. package/dist/chunk-5UCWY7G3.js.map +1 -0
  7. package/dist/{chunk-EBE3FEAJ.js → chunk-A6RFLGWV.js} +4 -4
  8. package/dist/{chunk-EBE3FEAJ.js.map → chunk-A6RFLGWV.js.map} +1 -1
  9. package/dist/{chunk-Q6IPK64P.js → chunk-PVROYW7C.js} +32 -5
  10. package/dist/chunk-PVROYW7C.js.map +1 -0
  11. package/dist/{chunk-FKOXQP76.js → chunk-QZTGV3ZL.js} +3 -3
  12. package/dist/{chunk-FKOXQP76.js.map → chunk-QZTGV3ZL.js.map} +1 -1
  13. package/dist/{chunk-THU5LW22.js → chunk-UX65ML3J.js} +4 -4
  14. package/dist/{chunk-THU5LW22.js.map → chunk-UX65ML3J.js.map} +1 -1
  15. package/dist/{chunk-RE7T5GKQ.js → chunk-VLATLVGH.js} +3 -3
  16. package/dist/{chunk-RE7T5GKQ.js.map → chunk-VLATLVGH.js.map} +1 -1
  17. package/dist/engine.cjs +10 -2
  18. package/dist/engine.cjs.map +1 -1
  19. package/dist/engine.d.cts +1 -1
  20. package/dist/engine.d.ts +1 -1
  21. package/dist/engine.js +5 -5
  22. package/dist/index.cjs +163 -4
  23. package/dist/index.cjs.map +1 -1
  24. package/dist/index.d.cts +2 -1
  25. package/dist/index.d.ts +2 -1
  26. package/dist/index.js +21 -473
  27. package/dist/index.js.map +1 -1
  28. package/dist/registry/index.d.cts +1 -1
  29. package/dist/registry/index.d.ts +1 -1
  30. package/dist/{registry-Ru5jIS5H.d.cts → registry-BADFn97n.d.cts} +41 -1
  31. package/dist/{registry-Df2-bTXZ.d.ts → registry-DYbFLEcW.d.ts} +41 -1
  32. package/dist/registry.cjs +31 -2
  33. package/dist/registry.cjs.map +1 -1
  34. package/dist/registry.js +3 -3
  35. package/dist/runtime.cjs +7 -1
  36. package/dist/runtime.cjs.map +1 -1
  37. package/dist/runtime.js +4 -4
  38. package/dist/schema.cjs +7 -1
  39. package/dist/schema.cjs.map +1 -1
  40. package/dist/schema.js +2 -2
  41. package/dist/screens.cjs +9834 -0
  42. package/dist/screens.cjs.map +1 -0
  43. package/dist/screens.css +563 -0
  44. package/dist/screens.css.map +1 -0
  45. package/dist/screens.d.cts +25 -0
  46. package/dist/screens.d.ts +25 -0
  47. package/dist/screens.js +21 -0
  48. package/dist/screens.js.map +1 -0
  49. package/dist/styles.css +103 -0
  50. package/dist/styles.css.map +1 -1
  51. package/dist/ux.cjs.map +1 -1
  52. package/dist/ux.js +1 -1
  53. package/package.json +196 -181
  54. package/dist/chunk-Q6IPK64P.js.map +0 -1
package/package.json CHANGED
@@ -1,192 +1,207 @@
1
1
  {
2
- "name": "@particle-academy/fancy-flow",
3
- "version": "0.35.0",
4
- "description": "Workflow editor + runner. Six built-in node kits (trigger / action / decision / output / note / subgraph), tokenized theme, topological execution with per-node status. React-flow bundled; consumers npm install fancy-flow and get nothing extra.",
5
- "repository": {
6
- "type": "git",
7
- "url": "git+https://github.com/Particle-Academy/fancy-flow.git"
8
- },
9
- "homepage": "https://github.com/Particle-Academy/fancy-flow#readme",
10
- "bugs": "https://github.com/Particle-Academy/fancy-flow/issues",
11
- "type": "module",
12
- "main": "./dist/index.cjs",
13
- "module": "./dist/index.js",
14
- "types": "./dist/index.d.ts",
15
- "exports": {
16
- ".": {
17
- "import": {
18
- "types": "./dist/index.d.ts",
19
- "default": "./dist/index.js"
20
- },
21
- "require": {
22
- "types": "./dist/index.d.cts",
23
- "default": "./dist/index.cjs"
24
- }
2
+ "name": "@particle-academy/fancy-flow",
3
+ "version": "0.37.0",
4
+ "description": "Workflow editor + runner. Six built-in node kits (trigger / action / decision / output / note / subgraph), tokenized theme, topological execution with per-node status. React-flow bundled; consumers npm install fancy-flow and get nothing extra.",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/Particle-Academy/fancy-flow.git"
25
8
  },
26
- "./runtime": {
27
- "import": {
28
- "types": "./dist/runtime/index.d.ts",
29
- "default": "./dist/runtime.js"
30
- },
31
- "require": {
32
- "types": "./dist/runtime/index.d.cts",
33
- "default": "./dist/runtime.cjs"
34
- }
9
+ "homepage": "https://github.com/Particle-Academy/fancy-flow#readme",
10
+ "bugs": "https://github.com/Particle-Academy/fancy-flow/issues",
11
+ "type": "module",
12
+ "main": "./dist/index.cjs",
13
+ "module": "./dist/index.js",
14
+ "types": "./dist/index.d.ts",
15
+ "exports": {
16
+ ".": {
17
+ "import": {
18
+ "types": "./dist/index.d.ts",
19
+ "default": "./dist/index.js"
20
+ },
21
+ "require": {
22
+ "types": "./dist/index.d.cts",
23
+ "default": "./dist/index.cjs"
24
+ }
25
+ },
26
+ "./runtime": {
27
+ "import": {
28
+ "types": "./dist/runtime/index.d.ts",
29
+ "default": "./dist/runtime.js"
30
+ },
31
+ "require": {
32
+ "types": "./dist/runtime/index.d.cts",
33
+ "default": "./dist/runtime.cjs"
34
+ }
35
+ },
36
+ "./registry": {
37
+ "import": {
38
+ "types": "./dist/registry/index.d.ts",
39
+ "default": "./dist/registry.js"
40
+ },
41
+ "require": {
42
+ "types": "./dist/registry/index.d.cts",
43
+ "default": "./dist/registry.cjs"
44
+ }
45
+ },
46
+ "./schema": {
47
+ "import": {
48
+ "types": "./dist/schema/index.d.ts",
49
+ "default": "./dist/schema.js"
50
+ },
51
+ "require": {
52
+ "types": "./dist/schema/index.d.cts",
53
+ "default": "./dist/schema.cjs"
54
+ }
55
+ },
56
+ "./layout": {
57
+ "import": {
58
+ "types": "./dist/layout/index.d.ts",
59
+ "default": "./dist/layout.js"
60
+ },
61
+ "require": {
62
+ "types": "./dist/layout/index.d.cts",
63
+ "default": "./dist/layout.cjs"
64
+ }
65
+ },
66
+ "./engine": {
67
+ "import": {
68
+ "types": "./dist/engine.d.ts",
69
+ "default": "./dist/engine.js"
70
+ },
71
+ "require": {
72
+ "types": "./dist/engine.d.cts",
73
+ "default": "./dist/engine.cjs"
74
+ }
75
+ },
76
+ "./ux": {
77
+ "import": {
78
+ "types": "./dist/ux.d.ts",
79
+ "default": "./dist/ux.js"
80
+ },
81
+ "require": {
82
+ "types": "./dist/ux.d.cts",
83
+ "default": "./dist/ux.cjs"
84
+ }
85
+ },
86
+ "./styles.css": "./dist/styles.css",
87
+ "./rich-input": {
88
+ "import": {
89
+ "types": "./dist/rich-input.d.ts",
90
+ "default": "./dist/rich-input.js"
91
+ },
92
+ "require": {
93
+ "types": "./dist/rich-input.d.cts",
94
+ "default": "./dist/rich-input.cjs"
95
+ }
96
+ },
97
+ "./llm/vercel-ai": {
98
+ "import": {
99
+ "types": "./dist/llm/vercel-ai.d.ts",
100
+ "default": "./dist/llm/vercel-ai.js"
101
+ },
102
+ "require": {
103
+ "types": "./dist/llm/vercel-ai.d.cts",
104
+ "default": "./dist/llm/vercel-ai.cjs"
105
+ }
106
+ },
107
+ "./llm/prism": {
108
+ "import": {
109
+ "types": "./dist/llm/prism.d.ts",
110
+ "default": "./dist/llm/prism.js"
111
+ },
112
+ "require": {
113
+ "types": "./dist/llm/prism.d.cts",
114
+ "default": "./dist/llm/prism.cjs"
115
+ }
116
+ },
117
+ "./screens": {
118
+ "import": {
119
+ "types": "./dist/screens.d.ts",
120
+ "default": "./dist/screens.js"
121
+ },
122
+ "require": {
123
+ "types": "./dist/screens.d.cts",
124
+ "default": "./dist/screens.cjs"
125
+ }
126
+ }
35
127
  },
36
- "./registry": {
37
- "import": {
38
- "types": "./dist/registry/index.d.ts",
39
- "default": "./dist/registry.js"
40
- },
41
- "require": {
42
- "types": "./dist/registry/index.d.cts",
43
- "default": "./dist/registry.cjs"
44
- }
128
+ "files": [
129
+ "dist",
130
+ "docs",
131
+ "README.md"
132
+ ],
133
+ "scripts": {
134
+ "build": "tsup",
135
+ "dev": "tsup --watch",
136
+ "lint": "tsc --noEmit && eslint .",
137
+ "test": "vitest run",
138
+ "clean": "rm -rf dist",
139
+ "prepublishOnly": "tsup"
45
140
  },
46
- "./schema": {
47
- "import": {
48
- "types": "./dist/schema/index.d.ts",
49
- "default": "./dist/schema.js"
50
- },
51
- "require": {
52
- "types": "./dist/schema/index.d.cts",
53
- "default": "./dist/schema.cjs"
54
- }
141
+ "keywords": [
142
+ "react",
143
+ "workflow",
144
+ "flow",
145
+ "graph",
146
+ "agent",
147
+ "fancy"
148
+ ],
149
+ "peerDependencies": {
150
+ "@particle-academy/fancy-cms-ui": ">=0.2",
151
+ "@particle-academy/react-fancy": ">=3",
152
+ "ai": ">=5",
153
+ "react": "^18.0.0 || ^19.0.0",
154
+ "react-dom": "^18.0.0 || ^19.0.0",
155
+ "@particle-academy/fancy-screens": ">=0.4 <2.0"
55
156
  },
56
- "./layout": {
57
- "import": {
58
- "types": "./dist/layout/index.d.ts",
59
- "default": "./dist/layout.js"
60
- },
61
- "require": {
62
- "types": "./dist/layout/index.d.cts",
63
- "default": "./dist/layout.cjs"
64
- }
157
+ "dependencies": {
158
+ "@particle-academy/fancy-auto-common": ">=0.1 <2.0"
65
159
  },
66
- "./engine": {
67
- "import": {
68
- "types": "./dist/engine.d.ts",
69
- "default": "./dist/engine.js"
70
- },
71
- "require": {
72
- "types": "./dist/engine.d.cts",
73
- "default": "./dist/engine.cjs"
74
- }
160
+ "devDependencies": {
161
+ "@dagrejs/dagre": "^3.0.0",
162
+ "@particle-academy/fancy-cms-ui": "^0.2.0",
163
+ "@particle-academy/react-fancy": "^4.15.0",
164
+ "@testing-library/dom": "^10.4.1",
165
+ "@testing-library/react": "^16.3.2",
166
+ "@types/react": "^19.0.0",
167
+ "@types/react-dom": "^19.0.0",
168
+ "@xyflow/react": "^12.4.0",
169
+ "ai": "^7.0.31",
170
+ "clsx": "^2.1.0",
171
+ "eslint": "^10.8.0",
172
+ "eslint-plugin-react-hooks": "^7.1.1",
173
+ "jsdom": "^29.1.1",
174
+ "react": "^19.0.0",
175
+ "react-dom": "^19.0.0",
176
+ "tsup": "^8.0.0",
177
+ "typescript": "^5.7.0",
178
+ "typescript-eslint": "^8.65.0",
179
+ "vitest": "^3.2.6",
180
+ "zod": "^4.4.3",
181
+ "@particle-academy/fancy-screens": "^0.4.3"
75
182
  },
76
- "./ux": {
77
- "import": {
78
- "types": "./dist/ux.d.ts",
79
- "default": "./dist/ux.js"
80
- },
81
- "require": {
82
- "types": "./dist/ux.d.cts",
83
- "default": "./dist/ux.cjs"
84
- }
183
+ "publishConfig": {
184
+ "access": "public"
85
185
  },
86
- "./styles.css": "./dist/styles.css",
87
- "./rich-input": {
88
- "import": {
89
- "types": "./dist/rich-input.d.ts",
90
- "default": "./dist/rich-input.js"
91
- },
92
- "require": {
93
- "types": "./dist/rich-input.d.cts",
94
- "default": "./dist/rich-input.cjs"
95
- }
186
+ "license": "MIT",
187
+ "sideEffects": [
188
+ "**/*.css"
189
+ ],
190
+ "overrides": {
191
+ "esbuild": "^0.28.1"
96
192
  },
97
- "./llm/vercel-ai": {
98
- "import": {
99
- "types": "./dist/llm/vercel-ai.d.ts",
100
- "default": "./dist/llm/vercel-ai.js"
101
- },
102
- "require": {
103
- "types": "./dist/llm/vercel-ai.d.cts",
104
- "default": "./dist/llm/vercel-ai.cjs"
105
- }
106
- },
107
- "./llm/prism": {
108
- "import": {
109
- "types": "./dist/llm/prism.d.ts",
110
- "default": "./dist/llm/prism.js"
111
- },
112
- "require": {
113
- "types": "./dist/llm/prism.d.cts",
114
- "default": "./dist/llm/prism.cjs"
115
- }
116
- }
117
- },
118
- "files": [
119
- "dist",
120
- "docs",
121
- "README.md"
122
- ],
123
- "scripts": {
124
- "build": "tsup",
125
- "dev": "tsup --watch",
126
- "lint": "tsc --noEmit && eslint .",
127
- "test": "vitest run",
128
- "clean": "rm -rf dist",
129
- "prepublishOnly": "tsup"
130
- },
131
- "keywords": [
132
- "react",
133
- "workflow",
134
- "flow",
135
- "graph",
136
- "agent",
137
- "fancy"
138
- ],
139
- "peerDependencies": {
140
- "@particle-academy/fancy-cms-ui": ">=0.2",
141
- "@particle-academy/react-fancy": ">=3",
142
- "ai": ">=5",
143
- "react": "^18.0.0 || ^19.0.0",
144
- "react-dom": "^18.0.0 || ^19.0.0"
145
- },
146
- "dependencies": {
147
- "@particle-academy/fancy-auto-common": ">=0.1 <2.0"
148
- },
149
- "devDependencies": {
150
- "@dagrejs/dagre": "^3.0.0",
151
- "@particle-academy/fancy-cms-ui": "^0.2.0",
152
- "@particle-academy/react-fancy": "^4.15.0",
153
- "@testing-library/dom": "^10.4.1",
154
- "@testing-library/react": "^16.3.2",
155
- "@types/react": "^19.0.0",
156
- "@types/react-dom": "^19.0.0",
157
- "@xyflow/react": "^12.4.0",
158
- "ai": "^7.0.31",
159
- "clsx": "^2.1.0",
160
- "eslint": "^10.8.0",
161
- "eslint-plugin-react-hooks": "^7.1.1",
162
- "jsdom": "^29.1.1",
163
- "react": "^19.0.0",
164
- "react-dom": "^19.0.0",
165
- "tsup": "^8.0.0",
166
- "typescript": "^5.7.0",
167
- "typescript-eslint": "^8.65.0",
168
- "vitest": "^3.2.6",
169
- "zod": "^4.4.3"
170
- },
171
- "publishConfig": {
172
- "access": "public"
173
- },
174
- "license": "MIT",
175
- "sideEffects": [
176
- "**/*.css"
177
- ],
178
- "overrides": {
179
- "esbuild": "^0.28.1"
180
- },
181
- "peerDependenciesMeta": {
182
- "@particle-academy/fancy-cms-ui": {
183
- "optional": true
184
- },
185
- "@particle-academy/react-fancy": {
186
- "optional": true
187
- },
188
- "ai": {
189
- "optional": true
193
+ "peerDependenciesMeta": {
194
+ "@particle-academy/fancy-cms-ui": {
195
+ "optional": true
196
+ },
197
+ "@particle-academy/react-fancy": {
198
+ "optional": true
199
+ },
200
+ "ai": {
201
+ "optional": true
202
+ },
203
+ "@particle-academy/fancy-screens": {
204
+ "optional": true
205
+ }
190
206
  }
191
- }
192
207
  }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/registry/registry.ts"],"names":[],"mappings":"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","file":"chunk-Q6IPK64P.js","sourcesContent":["import type { ConfigField, NodeKindDefinition } from \"./types\";\n\nconst kinds = new Map<string, NodeKindDefinition<any, any, any>>();\n/** alias → canonical name. See `resolveKindId`. */\nconst aliases = new Map<string, string>();\nconst listeners = new Set<() => void>();\n\n/**\n * registerNodeKind — install a node kind in the global registry. Returns\n * an `unregister` function. Calling with the same name replaces the prior\n * registration (handy for HMR).\n *\n * A kind's `name` is its CANONICAL id and is what gets written into saved\n * documents. Publish namespaced (`@fancy/llm_branch`, `@acme/salesforce_upsert`)\n * and list any previous bare names in `aliases`, so graphs saved before the\n * rename keep resolving.\n */\nexport function registerNodeKind<TC = any, TI = any, TO = any>(\n definition: NodeKindDefinition<TC, TI, TO>,\n): () => void {\n kinds.set(definition.name, definition as NodeKindDefinition<any, any, any>);\n for (const alias of definition.aliases ?? []) aliases.set(alias, definition.name);\n notify();\n return () => {\n if (kinds.get(definition.name) === (definition as any)) {\n kinds.delete(definition.name);\n for (const alias of definition.aliases ?? []) {\n if (aliases.get(alias) === definition.name) aliases.delete(alias);\n }\n notify();\n }\n };\n}\n\n/**\n * Resolve any id — canonical or alias — to the canonical one, or null.\n *\n * `kind` is persisted inside every saved graph, so a bare name that two\n * packages could both claim is unfixable after the fact: the ambiguous string\n * is already in the document. Canonical ids are namespaced; aliases exist so\n * documents written before namespacing keep opening.\n */\nexport function resolveKindId(id: string): string | null {\n if (kinds.has(id)) return id;\n const canonical = aliases.get(id);\n return canonical && kinds.has(canonical) ? canonical : null;\n}\n\n/** Get a single kind by canonical id or alias, or null. */\nexport function getNodeKind(name: string): NodeKindDefinition | null {\n const canonical = resolveKindId(name);\n return canonical ? ((kinds.get(canonical) as NodeKindDefinition) ?? null) : null;\n}\n\n/** Every id a kind answers to — canonical first. Used to key node-type maps. */\nexport function kindIds(kind: NodeKindDefinition): string[] {\n return [kind.name, ...(kind.aliases ?? [])];\n}\n\n/** List every registered kind, optionally filtered by category. */\nexport function listNodeKinds(category?: string): NodeKindDefinition[] {\n const all = Array.from(kinds.values()) as NodeKindDefinition[];\n return category ? all.filter((k) => k.category === category) : all;\n}\n\n/** Subscribe to registry changes. Returns an unsubscribe function. */\nexport function onNodeKindsChanged(listener: () => void): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\nfunction notify(): void {\n for (const l of listeners) l();\n}\n\n/** Fill in defaults from a kind's configSchema for newly-created nodes. */\nexport function defaultConfigFor(kind: NodeKindDefinition): Record<string, unknown> {\n const fromKind = kind.defaultConfig ? { ...(kind.defaultConfig as Record<string, unknown>) } : {};\n for (const field of kind.configSchema ?? []) {\n if (fromKind[field.key] !== undefined) continue;\n if (\"default\" in field && (field as any).default !== undefined) {\n fromKind[field.key] = (field as any).default;\n }\n }\n return fromKind;\n}\n\n/**\n * Validate a config object against a kind's schema. Returns an array of\n * issues (empty = valid). Validation is intentionally light — type\n * coercion + required-field checks. Hosts can layer Zod / Ajv on top.\n */\nexport function validateConfig(\n kind: NodeKindDefinition,\n config: Record<string, unknown>,\n): Array<{ key: string; message: string }> {\n const issues: Array<{ key: string; message: string }> = [];\n for (const field of kind.configSchema ?? []) {\n const value = config[field.key];\n if (field.required && (value === undefined || value === null || value === \"\")) {\n issues.push({ key: field.key, message: `${field.label} is required` });\n continue;\n }\n if (value === undefined || value === null) continue;\n const issue = validateField(field, value);\n if (issue) issues.push({ key: field.key, message: issue });\n }\n return issues;\n}\n\nfunction validateField(field: ConfigField, value: unknown): string | null {\n switch (field.type) {\n case \"text\":\n case \"textarea\":\n case \"expression\":\n case \"credential\":\n return typeof value === \"string\" ? null : `${field.label} must be a string`;\n case \"number\": {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return `${field.label} must be a number`;\n if (field.min !== undefined && value < field.min) return `${field.label} must be >= ${field.min}`;\n if (field.max !== undefined && value > field.max) return `${field.label} must be <= ${field.max}`;\n return null;\n }\n case \"switch\":\n return typeof value === \"boolean\" ? null : `${field.label} must be a boolean`;\n case \"select\": {\n const allowed = field.options.map((o) => o.value);\n return allowed.includes(String(value)) ? null : `${field.label} must be one of ${allowed.join(\", \")}`;\n }\n case \"json\":\n return null; // permissive — just JSON-shaped\n case \"repeater\": {\n if (!Array.isArray(value)) return `${field.label} must be a list`;\n if (field.minItems !== undefined && value.length < field.minItems) {\n return `${field.label} needs at least ${field.minItems}`;\n }\n if (field.maxItems !== undefined && value.length > field.maxItems) {\n return `${field.label} allows at most ${field.maxItems}`;\n }\n // Surface the first offending row so the author knows WHICH one.\n for (let i = 0; i < value.length; i++) {\n const row = value[i];\n if (!row || typeof row !== \"object\" || Array.isArray(row)) {\n return `${field.label} item ${i + 1} must be an object`;\n }\n for (const sub of field.fields) {\n const cell = (row as Record<string, unknown>)[sub.key];\n if (sub.required && (cell === undefined || cell === null || cell === \"\")) {\n return `${field.label} item ${i + 1}: ${sub.label} is required`;\n }\n if (cell === undefined || cell === null) continue;\n const issue = validateField(sub, cell);\n if (issue) return `${field.label} item ${i + 1}: ${issue}`;\n }\n }\n return null;\n }\n case \"keyvalue\": {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return `${field.label} must be a key/value map`;\n }\n const allowed = field.valueOptions?.map((o) => o.value);\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n if (typeof v !== \"string\") return `${field.label}: \"${k}\" must be a string`;\n if (allowed && !allowed.includes(v)) {\n return `${field.label}: \"${k}\" must be one of ${allowed.join(\", \")}`;\n }\n }\n return null;\n }\n case \"document\":\n return null; // opaque to fancy-flow — the host's editor owns its shape\n default:\n return null;\n }\n}\n\n/** Default accents per category. */\nexport function categoryAccent(category: string): string {\n switch (category) {\n case \"trigger\": return \"#10b981\";\n case \"logic\": return \"#f59e0b\";\n case \"data\": return \"#0ea5e9\";\n case \"ai\": return \"#8b5cf6\";\n case \"io\": return \"#3b82f6\";\n case \"human\": return \"#ec4899\";\n case \"output\": return \"#a855f7\";\n case \"layout\": return \"#64748b\";\n case \"annotation\": return \"#eab308\";\n default: return \"#71717a\";\n }\n}\n"]}