exai 1.1.1 → 1.6.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/README.md +29 -6
- package/dist/ai/config.d.ts +1 -1
- package/dist/ai/config.d.ts.map +1 -1
- package/dist/ai/config.js +4 -4
- package/dist/ai/config.js.map +1 -1
- package/dist/ai/openrouter.d.ts.map +1 -1
- package/dist/ai/openrouter.js +258 -46
- package/dist/ai/openrouter.js.map +1 -1
- package/dist/cli.js +73 -4
- package/dist/cli.js.map +1 -1
- package/dist/factory/node-factory.d.ts +4 -4
- package/dist/factory/node-factory.d.ts.map +1 -1
- package/dist/factory/node-factory.js +11 -8
- package/dist/factory/node-factory.js.map +1 -1
- package/dist/factory/text-factory.d.ts +9 -0
- package/dist/factory/text-factory.d.ts.map +1 -1
- package/dist/factory/text-factory.js +41 -19
- package/dist/factory/text-factory.js.map +1 -1
- package/dist/generator/excalidraw-generator.d.ts.map +1 -1
- package/dist/generator/excalidraw-generator.js +71 -6
- package/dist/generator/excalidraw-generator.js.map +1 -1
- package/dist/layout/elk-layout.d.ts.map +1 -1
- package/dist/layout/elk-layout.js +45 -0
- package/dist/layout/elk-layout.js.map +1 -1
- package/dist/parser/dsl-parser.d.ts +5 -11
- package/dist/parser/dsl-parser.d.ts.map +1 -1
- package/dist/parser/dsl-parser.js +536 -205
- package/dist/parser/dsl-parser.js.map +1 -1
- package/dist/types/dsl.d.ts +36 -0
- package/dist/types/dsl.d.ts.map +1 -1
- package/dist/types/dsl.js.map +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -25,9 +25,11 @@ npm install && npm run bundle
|
|
|
25
25
|
Get an API key from [openrouter.ai/keys](https://openrouter.ai/keys), then either:
|
|
26
26
|
|
|
27
27
|
```bash
|
|
28
|
-
export
|
|
28
|
+
export EXAI_OPENROUTER_APIKEY="sk-or-v1-..."
|
|
29
29
|
```
|
|
30
30
|
|
|
31
|
+
`OPENROUTER_API_KEY` is also accepted for backward compatibility.
|
|
32
|
+
|
|
31
33
|
Or use a config file:
|
|
32
34
|
|
|
33
35
|
```bash
|
|
@@ -52,7 +54,7 @@ One file controls everything. Generate it with `exai init`.
|
|
|
52
54
|
"direction": "TB",
|
|
53
55
|
"spacing": 50,
|
|
54
56
|
|
|
55
|
-
"context": ["
|
|
57
|
+
"context": ["."],
|
|
56
58
|
"exclude": ["dist", "coverage", "*.lock"],
|
|
57
59
|
"allowTestFiles": false,
|
|
58
60
|
"maxFileSize": 65536,
|
|
@@ -104,13 +106,34 @@ exai init [path]
|
|
|
104
106
|
|
|
105
107
|
## DSL Syntax
|
|
106
108
|
|
|
109
|
+
Directive-style DSL:
|
|
110
|
+
|
|
107
111
|
```
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
112
|
+
@direction TB
|
|
113
|
+
@spacing 60
|
|
114
|
+
|
|
115
|
+
@node user user "End User"
|
|
116
|
+
@node api orchestrator "API Gateway" bg:#ffe3e3 stroke:#c92a2a size:18 font:2
|
|
117
|
+
@node auth service "Auth Service" bg:#e5dbff stroke:#7048e8
|
|
118
|
+
@node db database "Users DB" bg:#d3f9d8 stroke:#2f9e44
|
|
119
|
+
|
|
120
|
+
@edge user api "calls"
|
|
121
|
+
@edge api auth "validates token" color:#495057 width:2
|
|
122
|
+
@edge auth db "reads/writes" dashed color:#2f9e44 arrow:triangle
|
|
123
|
+
|
|
124
|
+
@group core "Core Services" nodes:api,auth,db stroke:#868e96 dashed padding:24
|
|
111
125
|
```
|
|
112
126
|
|
|
113
|
-
|
|
127
|
+
`@node <id> <type-or-kind> "<label>"`
|
|
128
|
+
`@edge <fromId> <toId> ["label"] [dashed] [style...]`
|
|
129
|
+
`@group <id> "<label>" nodes:<id,id,...> [style...]`
|
|
130
|
+
|
|
131
|
+
Common kinds: `user`, `frontend`, `backend`, `service`, `api`, `worker`, `database`, `storage`, `queue`, `cache`, `external`, `orchestrator`, `decision`.
|
|
132
|
+
|
|
133
|
+
Common style tokens:
|
|
134
|
+
- Node: `bg:#hex`, `stroke:#hex`, `size:18`, `font:2|virgil|helvetica|cascadia|excalifont`, `text:#hex`
|
|
135
|
+
- Edge: `color:#hex`, `width:3`, `arrow:arrow|bar|dot|triangle|null`, `start:...`, `dashed|dotted|solid`
|
|
136
|
+
- Group: `stroke:#hex`, `bg:#hex`, `padding:24`, `dashed|solid|dotted`
|
|
114
137
|
|
|
115
138
|
## License
|
|
116
139
|
|
package/dist/ai/config.d.ts
CHANGED
|
@@ -48,7 +48,7 @@ export interface CliConfig {
|
|
|
48
48
|
* Load and validate a CLI config file.
|
|
49
49
|
*
|
|
50
50
|
* - Resolves configPath relative to CWD
|
|
51
|
-
* -
|
|
51
|
+
* - Absolute context paths are used as-is; relative paths resolve from the config file's directory
|
|
52
52
|
* - Throws on missing file or invalid JSON
|
|
53
53
|
*/
|
|
54
54
|
export declare function loadConfig(configPath: string): CliConfig;
|
package/dist/ai/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/ai/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,MAAM,WAAW,qBAAqB;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/ai/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,MAAM,WAAW,qBAAqB;IAClC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,0BAA0B,CAAC,EAAE,OAAO,CAAC;CACxC;AAID,MAAM,WAAW,SAAS;IAEtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IAGrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IAGjB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,qBAAqB,CAAC;IAGxC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IAGzB,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AA0ED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAyExD;AAID;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,SAyC7B,CAAC"}
|
package/dist/ai/config.js
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* All fields optional. Priority: CLI flags > config file > env vars > hardcoded defaults.
|
|
13
13
|
*/
|
|
14
14
|
import { readFileSync, existsSync } from 'fs';
|
|
15
|
-
import { resolve, dirname } from 'path';
|
|
15
|
+
import { resolve, dirname, isAbsolute } from 'path';
|
|
16
16
|
// ── Validation helpers ──────────────────────────────────────────────────────
|
|
17
17
|
const KNOWN_KEYS = new Set([
|
|
18
18
|
// AI / LLM
|
|
@@ -87,7 +87,7 @@ function parseCompressOptions(obj) {
|
|
|
87
87
|
* Load and validate a CLI config file.
|
|
88
88
|
*
|
|
89
89
|
* - Resolves configPath relative to CWD
|
|
90
|
-
* -
|
|
90
|
+
* - Absolute context paths are used as-is; relative paths resolve from the config file's directory
|
|
91
91
|
* - Throws on missing file or invalid JSON
|
|
92
92
|
*/
|
|
93
93
|
export function loadConfig(configPath) {
|
|
@@ -141,7 +141,7 @@ export function loadConfig(configPath) {
|
|
|
141
141
|
// Context gathering
|
|
142
142
|
if (obj.context !== undefined) {
|
|
143
143
|
const paths = assertStringArray(obj, 'context');
|
|
144
|
-
config.context = paths.map((p) => resolve(configDir, p));
|
|
144
|
+
config.context = paths.map((p) => isAbsolute(p) ? p : resolve(configDir, p));
|
|
145
145
|
}
|
|
146
146
|
if (obj.exclude !== undefined)
|
|
147
147
|
config.exclude = assertStringArray(obj, 'exclude');
|
|
@@ -188,7 +188,7 @@ export const CONFIG_TEMPLATE = {
|
|
|
188
188
|
direction: 'TB',
|
|
189
189
|
spacing: 50,
|
|
190
190
|
// Context gathering
|
|
191
|
-
context: ['
|
|
191
|
+
context: ['.'],
|
|
192
192
|
exclude: ['dist', 'coverage', '*.lock'],
|
|
193
193
|
allowTestFiles: false,
|
|
194
194
|
maxFileSize: 65536,
|
package/dist/ai/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/ai/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/ai/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openrouter.d.ts","sourceRoot":"","sources":["../../src/ai/openrouter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAoC,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"openrouter.d.ts","sourceRoot":"","sources":["../../src/ai/openrouter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAoC,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AA2FvF,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,MAAM,CAAC;AAE1C,MAAM,WAAW,cAAc;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,YAAY,CAAC;CAC/B;AA+CD;;;;;GAKG;AACH,wBAAsB,OAAO,CACzB,UAAU,EAAE,MAAM,EAClB,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,GAAE,cAAmB,GAC7B,OAAO,CAAC,MAAM,CAAC,CAkFjB;AAID;;;GAGG;AACH,wBAAsB,sBAAsB,CACxC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,YAAY,EACpB,OAAO,GAAE,eAAoB,GAC9B,OAAO,CAAC,MAAM,CAAC,CAgEjB"}
|
package/dist/ai/openrouter.js
CHANGED
|
@@ -7,37 +7,50 @@
|
|
|
7
7
|
import { getCachedResponse, cacheResponse } from './query-cache.js';
|
|
8
8
|
import { OPENROUTER_API_URL, DEFAULT_MODEL, DEFAULT_TEMPERATURE } from "./contants.js";
|
|
9
9
|
// ── System Prompts ──────────────────────────────────────────────────────────
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
Convert the user's
|
|
13
|
-
|
|
14
|
-
IMPORTANT
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
-
|
|
36
|
-
-
|
|
37
|
-
-
|
|
38
|
-
-
|
|
39
|
-
-
|
|
40
|
-
|
|
10
|
+
const DSL_PLAN_SYSTEM_PROMPT = `You are an expert software architecture diagram planner for Excalidraw.
|
|
11
|
+
|
|
12
|
+
Convert the user's request into a STRICT JSON graph plan. Do NOT output DSL directly.
|
|
13
|
+
|
|
14
|
+
IMPORTANT CONTEXT RULE:
|
|
15
|
+
- If codebase context is provided, analyze ONLY that codebase.
|
|
16
|
+
- Do NOT use outside assumptions or hallucinated components.
|
|
17
|
+
|
|
18
|
+
Return ONLY valid JSON with this exact schema:
|
|
19
|
+
{
|
|
20
|
+
"nodes": [
|
|
21
|
+
{ "id": "string", "type": "rectangle|diamond|ellipse|database", "label": "string" }
|
|
22
|
+
],
|
|
23
|
+
"edges": [
|
|
24
|
+
{ "from": "node_id", "to": "node_id", "label": "optional", "dashed": false }
|
|
25
|
+
],
|
|
26
|
+
"options": {
|
|
27
|
+
"direction": "TB|BT|LR|RL",
|
|
28
|
+
"spacing": 50
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
ARCHITECTURE MODELING RULES:
|
|
33
|
+
- Identify key components and flows:
|
|
34
|
+
- entry points/users/clients
|
|
35
|
+
- gateways/frontends
|
|
36
|
+
- services/workers
|
|
37
|
+
- databases/stores
|
|
38
|
+
- external systems/APIs
|
|
39
|
+
- Use edge labels for meaningful interactions (e.g. "calls", "reads", "writes", "publishes", "consumes").
|
|
40
|
+
- Prefer layered architecture layout (usually TB) unless user requests another direction.
|
|
41
|
+
- Keep labels concise and concrete (recommended <= 60 chars).
|
|
42
|
+
- Avoid decorative nodes.
|
|
43
|
+
- Prefer rectangle/ellipse/database for architecture diagrams.
|
|
44
|
+
- Use diamond ONLY when explicit decision logic is central to the requested flow.
|
|
45
|
+
|
|
46
|
+
GRAPH QUALITY RULES:
|
|
47
|
+
- Output JSON object only (no markdown, no explanation).
|
|
48
|
+
- Node IDs must be unique and stable-looking (e.g. "api-gateway", "user-service", "orders-db").
|
|
49
|
+
- Every edge must reference valid node IDs.
|
|
50
|
+
- Avoid duplicate edges with same from/to/label.
|
|
51
|
+
- Prefer connected graphs; avoid isolated nodes unless explicitly requested.
|
|
52
|
+
- Prefer 6-25 nodes unless user requests high detail or the system is tiny.`;
|
|
53
|
+
const JSON_SYSTEM_PROMPT = `You are an expert at creating architecture/flowchart diagrams using exai JSON format.
|
|
41
54
|
|
|
42
55
|
Convert the user's natural language description into valid JSON format.
|
|
43
56
|
|
|
@@ -57,15 +70,21 @@ JSON Structure:
|
|
|
57
70
|
}
|
|
58
71
|
}
|
|
59
72
|
|
|
60
|
-
Node Types:
|
|
61
|
-
- rectangle: Process steps, actions
|
|
62
|
-
- diamond: Decisions, conditionals
|
|
63
|
-
- ellipse: Start/end points
|
|
64
|
-
- database: Data storage
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
-
|
|
68
|
-
-
|
|
73
|
+
Node Types:
|
|
74
|
+
- rectangle: Process steps, actions
|
|
75
|
+
- diamond: Decisions, conditionals
|
|
76
|
+
- ellipse: Start/end points
|
|
77
|
+
- database: Data storage
|
|
78
|
+
|
|
79
|
+
MODELING RULES:
|
|
80
|
+
- Prefer architecture-relevant components and explicit data/control-flow edges.
|
|
81
|
+
- Prefer rectangle/ellipse/database for architecture diagrams.
|
|
82
|
+
- Use diamond only when explicit decision branching is required.
|
|
83
|
+
- Avoid unsupported assumptions when context is provided.
|
|
84
|
+
|
|
85
|
+
CRITICAL RULES:
|
|
86
|
+
- Output ONLY valid JSON
|
|
87
|
+
- Do NOT wrap output in markdown code blocks
|
|
69
88
|
- Do NOT include backticks or \`\`\`json
|
|
70
89
|
- Do NOT add explanations
|
|
71
90
|
- Output must be raw JSON that can be parsed directly
|
|
@@ -78,10 +97,12 @@ CRITICAL RULES:
|
|
|
78
97
|
* Returns the raw response string - no cleaning or validation.
|
|
79
98
|
*/
|
|
80
99
|
export async function callLLM(userPrompt, systemPrompt, options = {}) {
|
|
81
|
-
const apiKey = options.apiKey ||
|
|
100
|
+
const apiKey = options.apiKey ||
|
|
101
|
+
process.env.EXAI_OPENROUTER_APIKEY ||
|
|
102
|
+
process.env.OPENROUTER_API_KEY;
|
|
82
103
|
if (!apiKey) {
|
|
83
104
|
throw new Error('OpenRouter API key is required.\n' +
|
|
84
|
-
'Provide it via options or set OPENROUTER_API_KEY environment variable.\n' +
|
|
105
|
+
'Provide it via options or set EXAI_OPENROUTER_APIKEY / OPENROUTER_API_KEY environment variable.\n' +
|
|
85
106
|
'Get your API key from https://openrouter.ai/keys');
|
|
86
107
|
}
|
|
87
108
|
const model = options.model || process.env.OPENROUTER_MODEL || DEFAULT_MODEL;
|
|
@@ -143,7 +164,6 @@ export async function callLLM(userPrompt, systemPrompt, options = {}) {
|
|
|
143
164
|
* Wraps callLLM with format-specific system prompts and output cleaning.
|
|
144
165
|
*/
|
|
145
166
|
export async function generateFlowchartInput(prompt, format, options = {}) {
|
|
146
|
-
const systemPrompt = format === 'dsl' ? DSL_SYSTEM_PROMPT : JSON_SYSTEM_PROMPT;
|
|
147
167
|
// Build user message with optional context
|
|
148
168
|
let userMessage = prompt;
|
|
149
169
|
if (options.context) {
|
|
@@ -166,10 +186,33 @@ ${options.context}
|
|
|
166
186
|
====== END CODEBASE ======
|
|
167
187
|
|
|
168
188
|
Now, analyze the codebase above and ${prompt}
|
|
169
|
-
|
|
189
|
+
|
|
170
190
|
Remember: Base your diagram ONLY on the code provided between the BEGIN/END markers above.`;
|
|
171
191
|
}
|
|
172
|
-
|
|
192
|
+
if (format === 'dsl') {
|
|
193
|
+
const rawPlan = await callLLM(userMessage, DSL_PLAN_SYSTEM_PROMPT, {
|
|
194
|
+
model: options.model,
|
|
195
|
+
apiKey: options.apiKey,
|
|
196
|
+
temperature: options.temperature,
|
|
197
|
+
verbose: options.verbose,
|
|
198
|
+
useCache: options.useCache,
|
|
199
|
+
cacheOptions: options.cacheOptions,
|
|
200
|
+
cacheFormat: 'dsl-plan',
|
|
201
|
+
cacheContext: options.context,
|
|
202
|
+
});
|
|
203
|
+
if (options.verbose)
|
|
204
|
+
console.log(` Rebuilding DSL from normalized plan...`);
|
|
205
|
+
try {
|
|
206
|
+
const plan = parseDslPlan(rawPlan);
|
|
207
|
+
const normalized = normalizeDslPlan(plan);
|
|
208
|
+
return buildDslFromPlan(normalized);
|
|
209
|
+
}
|
|
210
|
+
catch (error) {
|
|
211
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
212
|
+
throw new Error(`Failed to build DSL from AI plan: ${message}`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
const raw = await callLLM(userMessage, JSON_SYSTEM_PROMPT, {
|
|
173
216
|
model: options.model,
|
|
174
217
|
apiKey: options.apiKey,
|
|
175
218
|
temperature: options.temperature,
|
|
@@ -183,6 +226,175 @@ Remember: Base your diagram ONLY on the code provided between the BEGIN/END mark
|
|
|
183
226
|
console.log(` Cleaning and validating output...`);
|
|
184
227
|
return cleanOutput(raw, format);
|
|
185
228
|
}
|
|
229
|
+
function parseDslPlan(raw) {
|
|
230
|
+
let cleaned = raw.trim();
|
|
231
|
+
cleaned = cleaned.replace(/```(?:json)?\n?/gi, '');
|
|
232
|
+
cleaned = cleaned.replace(/```\n?/g, '').trim();
|
|
233
|
+
const firstObj = cleaned.indexOf('{');
|
|
234
|
+
const lastObj = cleaned.lastIndexOf('}');
|
|
235
|
+
if (firstObj !== -1 && lastObj > firstObj) {
|
|
236
|
+
cleaned = cleaned.slice(firstObj, lastObj + 1);
|
|
237
|
+
}
|
|
238
|
+
const parsed = JSON.parse(cleaned);
|
|
239
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
240
|
+
throw new Error('Plan output is not a JSON object');
|
|
241
|
+
}
|
|
242
|
+
return parsed;
|
|
243
|
+
}
|
|
244
|
+
function normalizeDirection(value) {
|
|
245
|
+
if (!value)
|
|
246
|
+
return undefined;
|
|
247
|
+
const dir = value.toUpperCase();
|
|
248
|
+
return dir === 'TB' || dir === 'BT' || dir === 'LR' || dir === 'RL' ? dir : undefined;
|
|
249
|
+
}
|
|
250
|
+
function normalizeNodeType(value) {
|
|
251
|
+
if (!value)
|
|
252
|
+
return 'rectangle';
|
|
253
|
+
const type = value.toLowerCase();
|
|
254
|
+
if (type === 'diamond' || type === 'decision' || type === 'condition')
|
|
255
|
+
return 'diamond';
|
|
256
|
+
if (type === 'ellipse' || type === 'oval' || type === 'start' || type === 'end')
|
|
257
|
+
return 'ellipse';
|
|
258
|
+
if (type === 'database' || type === 'db' || type === 'storage' || type === 'cylinder')
|
|
259
|
+
return 'database';
|
|
260
|
+
return 'rectangle';
|
|
261
|
+
}
|
|
262
|
+
function sanitizeNodeLabel(label, fallback) {
|
|
263
|
+
const value = (label || '').trim();
|
|
264
|
+
const cleaned = value
|
|
265
|
+
.replace(/[\[\]\{\}\(\)]/g, '')
|
|
266
|
+
.replace(/\s+/g, ' ')
|
|
267
|
+
.trim();
|
|
268
|
+
return cleaned || fallback;
|
|
269
|
+
}
|
|
270
|
+
function sanitizeEdgeLabel(label) {
|
|
271
|
+
if (!label)
|
|
272
|
+
return undefined;
|
|
273
|
+
const cleaned = label.replace(/\s+/g, ' ').trim();
|
|
274
|
+
return cleaned.length > 0 ? cleaned.slice(0, 120) : undefined;
|
|
275
|
+
}
|
|
276
|
+
function normalizeDslPlan(plan) {
|
|
277
|
+
const nodes = [];
|
|
278
|
+
const nodeById = new Map();
|
|
279
|
+
const rawNodes = Array.isArray(plan.nodes) ? plan.nodes : [];
|
|
280
|
+
let autoNodeId = 1;
|
|
281
|
+
for (const rawNode of rawNodes) {
|
|
282
|
+
if (!rawNode || typeof rawNode !== 'object')
|
|
283
|
+
continue;
|
|
284
|
+
const fallbackLabel = `Step ${autoNodeId}`;
|
|
285
|
+
const id = String(rawNode.id || `n${autoNodeId}`).trim();
|
|
286
|
+
const nodeId = id || `n${autoNodeId}`;
|
|
287
|
+
autoNodeId++;
|
|
288
|
+
if (nodeById.has(nodeId))
|
|
289
|
+
continue;
|
|
290
|
+
const node = {
|
|
291
|
+
id: nodeId,
|
|
292
|
+
type: normalizeNodeType(rawNode.type),
|
|
293
|
+
label: sanitizeNodeLabel(rawNode.label, fallbackLabel),
|
|
294
|
+
};
|
|
295
|
+
nodes.push(node);
|
|
296
|
+
nodeById.set(node.id, node);
|
|
297
|
+
}
|
|
298
|
+
if (nodes.length === 0) {
|
|
299
|
+
nodes.push({ id: 'start', type: 'ellipse', label: 'Start' }, { id: 'end', type: 'ellipse', label: 'End' });
|
|
300
|
+
nodeById.set('start', nodes[0]);
|
|
301
|
+
nodeById.set('end', nodes[1]);
|
|
302
|
+
}
|
|
303
|
+
const edges = [];
|
|
304
|
+
const rawEdges = Array.isArray(plan.edges) ? plan.edges : [];
|
|
305
|
+
for (const rawEdge of rawEdges) {
|
|
306
|
+
if (!rawEdge || typeof rawEdge !== 'object')
|
|
307
|
+
continue;
|
|
308
|
+
const from = String(rawEdge.from || '').trim();
|
|
309
|
+
const to = String(rawEdge.to || '').trim();
|
|
310
|
+
if (!from || !to)
|
|
311
|
+
continue;
|
|
312
|
+
if (!nodeById.has(from) || !nodeById.has(to))
|
|
313
|
+
continue;
|
|
314
|
+
edges.push({
|
|
315
|
+
from,
|
|
316
|
+
to,
|
|
317
|
+
label: sanitizeEdgeLabel(rawEdge.label),
|
|
318
|
+
dashed: rawEdge.dashed === true,
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
// If model returned nodes without edges, create a simple chain to ensure valid flow.
|
|
322
|
+
if (edges.length === 0 && nodes.length > 1) {
|
|
323
|
+
for (let i = 0; i < nodes.length - 1; i++) {
|
|
324
|
+
edges.push({
|
|
325
|
+
from: nodes[i].id,
|
|
326
|
+
to: nodes[i + 1].id,
|
|
327
|
+
dashed: false,
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
const direction = normalizeDirection(plan.options?.direction);
|
|
332
|
+
const spacingInput = plan.options?.spacing ?? plan.options?.nodeSpacing;
|
|
333
|
+
const spacing = typeof spacingInput === 'number' && Number.isFinite(spacingInput) && spacingInput > 0
|
|
334
|
+
? Math.round(spacingInput)
|
|
335
|
+
: undefined;
|
|
336
|
+
return { nodes, edges, direction, spacing };
|
|
337
|
+
}
|
|
338
|
+
function normalizeDslRefId(raw, fallbackIndex) {
|
|
339
|
+
const base = raw
|
|
340
|
+
.toLowerCase()
|
|
341
|
+
.replace(/[^a-z0-9_-]+/g, '-')
|
|
342
|
+
.replace(/-+/g, '-')
|
|
343
|
+
.replace(/^-|-$/g, '');
|
|
344
|
+
return base || `n${fallbackIndex}`;
|
|
345
|
+
}
|
|
346
|
+
function quoteDsl(value) {
|
|
347
|
+
return `"${value.replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`;
|
|
348
|
+
}
|
|
349
|
+
function buildDslFromPlan(plan) {
|
|
350
|
+
const lines = [];
|
|
351
|
+
if (plan.direction)
|
|
352
|
+
lines.push(`@direction ${plan.direction}`);
|
|
353
|
+
if (plan.spacing)
|
|
354
|
+
lines.push(`@spacing ${plan.spacing}`);
|
|
355
|
+
if (lines.length > 0)
|
|
356
|
+
lines.push('');
|
|
357
|
+
const nodeRefByOriginalId = new Map();
|
|
358
|
+
const usedRefs = new Set();
|
|
359
|
+
for (let i = 0; i < plan.nodes.length; i++) {
|
|
360
|
+
const node = plan.nodes[i];
|
|
361
|
+
let ref = normalizeDslRefId(node.id, i + 1);
|
|
362
|
+
if (usedRefs.has(ref)) {
|
|
363
|
+
let suffix = 2;
|
|
364
|
+
while (usedRefs.has(`${ref}-${suffix}`))
|
|
365
|
+
suffix++;
|
|
366
|
+
ref = `${ref}-${suffix}`;
|
|
367
|
+
}
|
|
368
|
+
usedRefs.add(ref);
|
|
369
|
+
nodeRefByOriginalId.set(node.id, ref);
|
|
370
|
+
lines.push(`@node ${ref} ${node.type} ${quoteDsl(node.label)}`);
|
|
371
|
+
}
|
|
372
|
+
if (plan.nodes.length > 0 && plan.edges.length > 0) {
|
|
373
|
+
lines.push('');
|
|
374
|
+
}
|
|
375
|
+
for (const edge of plan.edges) {
|
|
376
|
+
const fromRef = nodeRefByOriginalId.get(edge.from);
|
|
377
|
+
const toRef = nodeRefByOriginalId.get(edge.to);
|
|
378
|
+
if (!fromRef || !toRef)
|
|
379
|
+
continue;
|
|
380
|
+
let edgeLine = `@edge ${fromRef} ${toRef}`;
|
|
381
|
+
if (edge.label) {
|
|
382
|
+
edgeLine += ` ${quoteDsl(edge.label)}`;
|
|
383
|
+
}
|
|
384
|
+
if (edge.dashed) {
|
|
385
|
+
edgeLine += ' dashed';
|
|
386
|
+
}
|
|
387
|
+
lines.push(edgeLine);
|
|
388
|
+
}
|
|
389
|
+
const output = lines.join('\n').trim();
|
|
390
|
+
if (!output) {
|
|
391
|
+
return `@node start ellipse "Start"
|
|
392
|
+
@node end ellipse "End"
|
|
393
|
+
|
|
394
|
+
@edge start end`;
|
|
395
|
+
}
|
|
396
|
+
return output;
|
|
397
|
+
}
|
|
186
398
|
// ── Output cleaning ─────────────────────────────────────────────────────────
|
|
187
399
|
/**
|
|
188
400
|
* Clean AI output - remove markdown wrappers and explanations
|
|
@@ -214,7 +426,7 @@ function cleanOutput(output, format) {
|
|
|
214
426
|
}
|
|
215
427
|
}
|
|
216
428
|
else if (format === 'dsl') {
|
|
217
|
-
if (!cleaned.includes('
|
|
429
|
+
if (!cleaned.includes('@node') && !cleaned.includes('@edge')) {
|
|
218
430
|
throw new Error('AI output does not appear to be valid DSL. Expected nodes and connections.\n\n' +
|
|
219
431
|
'This is a bug in the AI model output. Please try again or use a different model.');
|
|
220
432
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openrouter.js","sourceRoot":"","sources":["../../src/ai/openrouter.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"openrouter.js","sourceRoot":"","sources":["../../src/ai/openrouter.ts"],"names":[],"mappings":"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"}
|