helix-lang 11.0.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 +168 -0
- package/dist/architect.d.ts +14 -0
- package/dist/architect.d.ts.map +1 -0
- package/dist/architect.js +127 -0
- package/dist/architect.js.map +1 -0
- package/dist/bin/helix.d.ts +20 -0
- package/dist/bin/helix.d.ts.map +1 -0
- package/dist/bin/helix.js +921 -0
- package/dist/bin/helix.js.map +1 -0
- package/dist/commands/collaborate/index.d.ts +2 -0
- package/dist/commands/collaborate/index.d.ts.map +1 -0
- package/dist/commands/collaborate/index.js +129 -0
- package/dist/commands/collaborate/index.js.map +1 -0
- package/dist/commands/collaborate/server.d.ts +31 -0
- package/dist/commands/collaborate/server.d.ts.map +1 -0
- package/dist/commands/collaborate/server.js +159 -0
- package/dist/commands/collaborate/server.js.map +1 -0
- package/dist/commands/deploy/index.d.ts +25 -0
- package/dist/commands/deploy/index.d.ts.map +1 -0
- package/dist/commands/deploy/index.js +130 -0
- package/dist/commands/deploy/index.js.map +1 -0
- package/dist/commands/deploy/platforms/fly.d.ts +9 -0
- package/dist/commands/deploy/platforms/fly.d.ts.map +1 -0
- package/dist/commands/deploy/platforms/fly.js +68 -0
- package/dist/commands/deploy/platforms/fly.js.map +1 -0
- package/dist/commands/deploy/platforms/railway.d.ts +9 -0
- package/dist/commands/deploy/platforms/railway.d.ts.map +1 -0
- package/dist/commands/deploy/platforms/railway.js +115 -0
- package/dist/commands/deploy/platforms/railway.js.map +1 -0
- package/dist/commands/deploy/platforms/vercel.d.ts +10 -0
- package/dist/commands/deploy/platforms/vercel.d.ts.map +1 -0
- package/dist/commands/deploy/platforms/vercel.js +126 -0
- package/dist/commands/deploy/platforms/vercel.js.map +1 -0
- package/dist/commands/deploy.d.ts +6 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +56 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/evolve/analyzers/performance.d.ts +13 -0
- package/dist/commands/evolve/analyzers/performance.d.ts.map +1 -0
- package/dist/commands/evolve/analyzers/performance.js +591 -0
- package/dist/commands/evolve/analyzers/performance.js.map +1 -0
- package/dist/commands/evolve/analyzers/security.d.ts +21 -0
- package/dist/commands/evolve/analyzers/security.d.ts.map +1 -0
- package/dist/commands/evolve/analyzers/security.js +280 -0
- package/dist/commands/evolve/analyzers/security.js.map +1 -0
- package/dist/commands/evolve/index.d.ts +2 -0
- package/dist/commands/evolve/index.d.ts.map +1 -0
- package/dist/commands/evolve/index.js +122 -0
- package/dist/commands/evolve/index.js.map +1 -0
- package/dist/commands/generate.d.ts +6 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +277 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/install.d.ts +2 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +176 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/library/index.d.ts +27 -0
- package/dist/commands/library/index.d.ts.map +1 -0
- package/dist/commands/library/index.js +126 -0
- package/dist/commands/library/index.js.map +1 -0
- package/dist/commands/migrate.d.ts +5 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +258 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/new.d.ts +6 -0
- package/dist/commands/new.d.ts.map +1 -0
- package/dist/commands/new.js +195 -0
- package/dist/commands/new.js.map +1 -0
- package/dist/commands/preflight.d.ts +20 -0
- package/dist/commands/preflight.d.ts.map +1 -0
- package/dist/commands/preflight.js +182 -0
- package/dist/commands/preflight.js.map +1 -0
- package/dist/commands/preview.d.ts +13 -0
- package/dist/commands/preview.d.ts.map +1 -0
- package/dist/commands/preview.js +260 -0
- package/dist/commands/preview.js.map +1 -0
- package/dist/commands/run.d.ts +6 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +96 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/spawn.d.ts +11 -0
- package/dist/commands/spawn.d.ts.map +1 -0
- package/dist/commands/spawn.js +916 -0
- package/dist/commands/spawn.js.map +1 -0
- package/dist/compiler.d.ts +12 -0
- package/dist/compiler.d.ts.map +1 -0
- package/dist/compiler.js +92 -0
- package/dist/compiler.js.map +1 -0
- package/dist/core/file-writer.d.ts +36 -0
- package/dist/core/file-writer.d.ts.map +1 -0
- package/dist/core/file-writer.js +268 -0
- package/dist/core/file-writer.js.map +1 -0
- package/dist/core/registry.d.ts +57 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +222 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/self-healing.d.ts +47 -0
- package/dist/core/self-healing.d.ts.map +1 -0
- package/dist/core/self-healing.js +250 -0
- package/dist/core/self-healing.js.map +1 -0
- package/dist/core/types.d.ts +126 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +7 -0
- package/dist/core/types.js.map +1 -0
- package/dist/generators/databases/mongodb.d.ts +10 -0
- package/dist/generators/databases/mongodb.d.ts.map +1 -0
- package/dist/generators/databases/mongodb.js +83 -0
- package/dist/generators/databases/mongodb.js.map +1 -0
- package/dist/generators/databases/redis.d.ts +2 -0
- package/dist/generators/databases/redis.d.ts.map +1 -0
- package/dist/generators/databases/redis.js +140 -0
- package/dist/generators/databases/redis.js.map +1 -0
- package/dist/generators/flutter.d.ts +32 -0
- package/dist/generators/flutter.d.ts.map +1 -0
- package/dist/generators/flutter.js +628 -0
- package/dist/generators/flutter.js.map +1 -0
- package/dist/openrouter.d.ts +68 -0
- package/dist/openrouter.d.ts.map +1 -0
- package/dist/openrouter.js +241 -0
- package/dist/openrouter.js.map +1 -0
- package/dist/page-generator.d.ts +22 -0
- package/dist/page-generator.d.ts.map +1 -0
- package/dist/page-generator.js +192 -0
- package/dist/page-generator.js.map +1 -0
- package/dist/parser.d.ts +76 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +691 -0
- package/dist/parser.js.map +1 -0
- package/dist/prompts/master-architect.d.ts +9 -0
- package/dist/prompts/master-architect.d.ts.map +1 -0
- package/dist/prompts/master-architect.js +150 -0
- package/dist/prompts/master-architect.js.map +1 -0
- package/dist/researcher.d.ts +12 -0
- package/dist/researcher.d.ts.map +1 -0
- package/dist/researcher.js +85 -0
- package/dist/researcher.js.map +1 -0
- package/dist/self-heal.d.ts +29 -0
- package/dist/self-heal.d.ts.map +1 -0
- package/dist/self-heal.js +260 -0
- package/dist/self-heal.js.map +1 -0
- package/dist/services/SupabaseDeployer.d.ts +9 -0
- package/dist/services/SupabaseDeployer.d.ts.map +1 -0
- package/dist/services/SupabaseDeployer.js +50 -0
- package/dist/services/SupabaseDeployer.js.map +1 -0
- package/dist/test-generator.d.ts +18 -0
- package/dist/test-generator.d.ts.map +1 -0
- package/dist/test-generator.js +180 -0
- package/dist/test-generator.js.map +1 -0
- package/dist/themes/index.d.ts +52 -0
- package/dist/themes/index.d.ts.map +1 -0
- package/dist/themes/index.js +273 -0
- package/dist/themes/index.js.map +1 -0
- package/dist/types.d.ts +9 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +81 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/constitutional-validator.d.ts +73 -0
- package/dist/utils/constitutional-validator.d.ts.map +1 -0
- package/dist/utils/constitutional-validator.js +249 -0
- package/dist/utils/constitutional-validator.js.map +1 -0
- package/library/auth-flow/app/api/auth/[...nextauth]/route.ts +31 -0
- package/library/auth-flow/app/api/auth/login/route.ts +90 -0
- package/library/auth-flow/app/api/auth/register/route.ts +91 -0
- package/library/auth-flow/components/auth/AuthMiddleware.tsx +139 -0
- package/library/auth-flow/components/auth/LoginForm.tsx +125 -0
- package/library/auth-flow/components/auth/RegisterForm.tsx +168 -0
- package/library/auth-flow/components/auth/nextauth-config.ts +99 -0
- package/library/auth-flow/manifest.json +29 -0
- package/library/auth-flow/schema.prisma +45 -0
- package/library/dashboard-analytics/components/dashboard/ActivityFeed.tsx +109 -0
- package/library/dashboard-analytics/components/dashboard/LineChart.tsx +180 -0
- package/library/dashboard-analytics/components/dashboard/StatsCard.tsx +47 -0
- package/library/dashboard-analytics/components/dashboard/SummaryGrid.tsx +39 -0
- package/library/dashboard-analytics/manifest.json +19 -0
- package/library/data-table/components/table/BulkActions.tsx +59 -0
- package/library/data-table/components/table/ColumnToggle.tsx +65 -0
- package/library/data-table/components/table/DataTable.tsx +318 -0
- package/library/data-table/components/table/ExportCSV.tsx +52 -0
- package/library/data-table/components/table/SearchFilter.tsx +48 -0
- package/library/data-table/manifest.json +20 -0
- package/library/file-upload/app/api/upload/route.ts +107 -0
- package/library/file-upload/components/upload/DropZone.tsx +268 -0
- package/library/file-upload/components/upload/FilePreview.tsx +82 -0
- package/library/file-upload/components/upload/UploadProgress.tsx +92 -0
- package/library/file-upload/components/upload/fileStorage.ts +142 -0
- package/library/file-upload/manifest.json +21 -0
- package/library/notification-system/app/api/notifications/route.ts +121 -0
- package/library/notification-system/components/notifications/NotificationBell.tsx +154 -0
- package/library/notification-system/components/notifications/NotificationProvider.tsx +161 -0
- package/library/notification-system/components/notifications/Toast.tsx +112 -0
- package/library/notification-system/manifest.json +20 -0
- package/package.json +66 -0
|
@@ -0,0 +1,628 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Helix Flutter Generator v11.0
|
|
4
|
+
* Generates Flutter mobile apps from natural language prompts
|
|
5
|
+
* Supports:
|
|
6
|
+
* - local (in-memory) and Supabase (cloud) database modes
|
|
7
|
+
* - OpenRouter AI integration with constitution-based persona extraction
|
|
8
|
+
*/
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
21
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
22
|
+
}) : function(o, v) {
|
|
23
|
+
o["default"] = v;
|
|
24
|
+
});
|
|
25
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
26
|
+
var ownKeys = function(o) {
|
|
27
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
28
|
+
var ar = [];
|
|
29
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
30
|
+
return ar;
|
|
31
|
+
};
|
|
32
|
+
return ownKeys(o);
|
|
33
|
+
};
|
|
34
|
+
return function (mod) {
|
|
35
|
+
if (mod && mod.__esModule) return mod;
|
|
36
|
+
var result = {};
|
|
37
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
38
|
+
__setModuleDefault(result, mod);
|
|
39
|
+
return result;
|
|
40
|
+
};
|
|
41
|
+
})();
|
|
42
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
43
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
44
|
+
};
|
|
45
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
+
exports.generateFlutterApp = generateFlutterApp;
|
|
47
|
+
exports.regenerateFlutterDart = regenerateFlutterDart;
|
|
48
|
+
exports.parseFlutterPrompt = parseFlutterPrompt;
|
|
49
|
+
const execa = require("execa");
|
|
50
|
+
const fs = __importStar(require("fs-extra"));
|
|
51
|
+
const path = __importStar(require("path"));
|
|
52
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
53
|
+
const ora_1 = __importDefault(require("ora"));
|
|
54
|
+
const openrouter_1 = require("../openrouter");
|
|
55
|
+
/**
|
|
56
|
+
* Extract AI directives from a constitution file
|
|
57
|
+
* Looks for sections headed by "## AI DIRECTIVES" or "## AI CONSTITUTION"
|
|
58
|
+
*/
|
|
59
|
+
function extractAIDirectives(constitution) {
|
|
60
|
+
// Look for ## AI DIRECTIVES or ## AI CONSTITUTION section
|
|
61
|
+
const patterns = [
|
|
62
|
+
/##\s*AI\s*DIRECTIVES[^\n]*\n([\s\S]*?)(?=\n##\s|\n#\s|$)/i,
|
|
63
|
+
/##\s*AI\s*CONSTITUTION[^\n]*\n([\s\S]*?)(?=\n##\s|\n#\s|$)/i,
|
|
64
|
+
/##\s*🤖\s*INSTRUCTIONS[^\n]*\n([\s\S]*?)(?=\n##\s|\n#\s|$)/i,
|
|
65
|
+
];
|
|
66
|
+
for (const pattern of patterns) {
|
|
67
|
+
const match = constitution.match(pattern);
|
|
68
|
+
if (match && match[1]) {
|
|
69
|
+
return match[1].trim();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Fallback: return default persona
|
|
73
|
+
return "You are a helpful strategic analyst.";
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Generate a Flutter mobile app from a prompt
|
|
77
|
+
* @param prompt - Natural language description
|
|
78
|
+
* @param constitution - Optional context/guidelines
|
|
79
|
+
* @param db - Database type: 'local' or 'supabase'
|
|
80
|
+
* @param ai - AI provider: 'none' or 'openrouter'
|
|
81
|
+
*/
|
|
82
|
+
async function generateFlutterApp(prompt, constitution, db = "local", ai = "none") {
|
|
83
|
+
console.log(chalk_1.default.magenta("\n📱 HELIX FLUTTER - Mobile App Generator\n"));
|
|
84
|
+
// Generate project name from prompt
|
|
85
|
+
const projectName = prompt
|
|
86
|
+
.toLowerCase()
|
|
87
|
+
.replace(/[^a-z0-9\s]/g, "")
|
|
88
|
+
.split(" ")
|
|
89
|
+
.slice(0, 3)
|
|
90
|
+
.join("_")
|
|
91
|
+
.substring(0, 30) || "helix_app";
|
|
92
|
+
const projectPath = path.join(process.cwd(), projectName);
|
|
93
|
+
// Check if directory exists
|
|
94
|
+
if (fs.existsSync(projectPath)) {
|
|
95
|
+
console.error(chalk_1.default.red(`❌ Directory "${projectName}" already exists`));
|
|
96
|
+
process.exit(1);
|
|
97
|
+
}
|
|
98
|
+
// Extract AI persona if OpenRouter mode is enabled
|
|
99
|
+
let aiPersona;
|
|
100
|
+
if (ai === "openrouter" && constitution) {
|
|
101
|
+
aiPersona = extractAIDirectives(constitution);
|
|
102
|
+
console.log(chalk_1.default.green("🧠 AI Persona extracted from constitution"));
|
|
103
|
+
}
|
|
104
|
+
// Phase 1: Create Flutter project
|
|
105
|
+
const spinner = (0, ora_1.default)("Creating Flutter project...").start();
|
|
106
|
+
try {
|
|
107
|
+
await execa("flutter", ["create", projectName, "--org", "com.helix"], {
|
|
108
|
+
cwd: process.cwd(),
|
|
109
|
+
stdio: "pipe",
|
|
110
|
+
});
|
|
111
|
+
spinner.succeed("Flutter project created");
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
spinner.fail("Failed to create Flutter project");
|
|
115
|
+
console.error(chalk_1.default.red("Make sure Flutter is installed and in your PATH"));
|
|
116
|
+
process.exit(1);
|
|
117
|
+
}
|
|
118
|
+
// Phase 2: Add dependencies
|
|
119
|
+
const depSpinner = (0, ora_1.default)("Installing dependencies...").start();
|
|
120
|
+
try {
|
|
121
|
+
const deps = ["provider"];
|
|
122
|
+
// Add Supabase if cloud mode
|
|
123
|
+
if (db === "supabase") {
|
|
124
|
+
deps.push("supabase_flutter");
|
|
125
|
+
}
|
|
126
|
+
// Add AI dependencies if OpenRouter mode
|
|
127
|
+
if (ai === "openrouter") {
|
|
128
|
+
deps.push("http");
|
|
129
|
+
deps.push("flutter_markdown");
|
|
130
|
+
}
|
|
131
|
+
for (const dep of deps) {
|
|
132
|
+
await execa("flutter", ["pub", "add", dep], {
|
|
133
|
+
cwd: projectPath,
|
|
134
|
+
stdio: "pipe",
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
depSpinner.succeed(`Dependencies installed (${deps.join(", ")})`);
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
depSpinner.fail("Failed to install dependencies");
|
|
141
|
+
}
|
|
142
|
+
// Phase 3: Generate main.dart with AI
|
|
143
|
+
const codeSpinner = (0, ora_1.default)("Generating Flutter code...").start();
|
|
144
|
+
try {
|
|
145
|
+
const mainDart = await generateMainDart(prompt, constitution, db, ai);
|
|
146
|
+
await fs.writeFile(path.join(projectPath, "lib", "main.dart"), mainDart);
|
|
147
|
+
codeSpinner.succeed("Flutter code generated");
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
codeSpinner.fail("Failed to generate code");
|
|
151
|
+
console.error(error);
|
|
152
|
+
}
|
|
153
|
+
// Phase 4: Generate Supabase-specific files if cloud mode
|
|
154
|
+
if (db === "supabase") {
|
|
155
|
+
const supabaseSpinner = (0, ora_1.default)("Generating Supabase architecture...").start();
|
|
156
|
+
try {
|
|
157
|
+
// Generate supabase_service.dart
|
|
158
|
+
const servicesDir = path.join(projectPath, "lib", "services");
|
|
159
|
+
await fs.ensureDir(servicesDir);
|
|
160
|
+
const serviceCode = await generateSupabaseService(prompt);
|
|
161
|
+
await fs.writeFile(path.join(servicesDir, "supabase_service.dart"), serviceCode);
|
|
162
|
+
// Generate supabase_schema.sql
|
|
163
|
+
const schemaSQL = await generateSupabaseSchema(prompt);
|
|
164
|
+
await fs.writeFile(path.join(projectPath, "supabase_schema.sql"), schemaSQL);
|
|
165
|
+
supabaseSpinner.succeed("Supabase service & schema generated");
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
supabaseSpinner.fail("Failed to generate Supabase files");
|
|
169
|
+
console.error(error);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// Phase 5: Generate OpenRouter AI files if AI mode
|
|
173
|
+
if (ai === "openrouter") {
|
|
174
|
+
const aiSpinner = (0, ora_1.default)("Generating AI architecture...").start();
|
|
175
|
+
try {
|
|
176
|
+
const servicesDir = path.join(projectPath, "lib", "services");
|
|
177
|
+
const screensDir = path.join(projectPath, "lib", "screens");
|
|
178
|
+
await fs.ensureDir(servicesDir);
|
|
179
|
+
await fs.ensureDir(screensDir);
|
|
180
|
+
// Generate ai_service.dart with extracted persona
|
|
181
|
+
const aiServiceCode = await generateAIService(aiPersona);
|
|
182
|
+
await fs.writeFile(path.join(servicesDir, "ai_service.dart"), aiServiceCode);
|
|
183
|
+
// Generate chat_screen.dart
|
|
184
|
+
const chatScreenCode = await generateChatScreen(prompt);
|
|
185
|
+
await fs.writeFile(path.join(screensDir, "chat_screen.dart"), chatScreenCode);
|
|
186
|
+
aiSpinner.succeed("AI service & chat screen generated");
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
aiSpinner.fail("Failed to generate AI files");
|
|
190
|
+
console.error(error);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// Phase 6: Success message
|
|
194
|
+
console.log(chalk_1.default.green("\n✅ Flutter app created successfully!\n"));
|
|
195
|
+
console.log(chalk_1.default.cyan("Next steps:"));
|
|
196
|
+
console.log(chalk_1.default.white(` cd ${projectName}`));
|
|
197
|
+
if (db === "supabase") {
|
|
198
|
+
console.log(chalk_1.default.yellow("\n☁️ Supabase Setup Required:"));
|
|
199
|
+
console.log(chalk_1.default.white(" 1. Create a Supabase project at https://supabase.com"));
|
|
200
|
+
console.log(chalk_1.default.white(" 2. Run the SQL in supabase_schema.sql in the SQL Editor"));
|
|
201
|
+
console.log(chalk_1.default.white(" 3. Copy your URL and anon key to lib/main.dart"));
|
|
202
|
+
}
|
|
203
|
+
if (ai === "openrouter") {
|
|
204
|
+
console.log(chalk_1.default.green("\n🤖 OpenRouter Setup Required:"));
|
|
205
|
+
console.log(chalk_1.default.white(" 1. Get an API key from https://openrouter.ai"));
|
|
206
|
+
console.log(chalk_1.default.white(" 2. Add OPENROUTER_API_KEY to lib/services/ai_service.dart"));
|
|
207
|
+
console.log(chalk_1.default.white(" 3. The AI persona has been extracted from your constitution"));
|
|
208
|
+
}
|
|
209
|
+
console.log(chalk_1.default.white("\n flutter run"));
|
|
210
|
+
console.log("");
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Regenerate main.dart for an EXISTING Flutter project
|
|
214
|
+
* Used by "helix generate blueprint.helix --target flutter"
|
|
215
|
+
*/
|
|
216
|
+
async function regenerateFlutterDart(prompt, constitution, db = "local", ai = "none") {
|
|
217
|
+
console.log(chalk_1.default.magenta("\n📱 HELIX FLUTTER - Regenerating main.dart\n"));
|
|
218
|
+
// Check if we're in a Flutter project
|
|
219
|
+
const libPath = path.join(process.cwd(), "lib");
|
|
220
|
+
const pubspecPath = path.join(process.cwd(), "pubspec.yaml");
|
|
221
|
+
if (!fs.existsSync(pubspecPath)) {
|
|
222
|
+
// Not in a Flutter project - create a new one
|
|
223
|
+
console.log(chalk_1.default.yellow("⚠️ Not in a Flutter project. Creating new app..."));
|
|
224
|
+
await generateFlutterApp(prompt, constitution, db, ai);
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
// Regenerate main.dart
|
|
228
|
+
const codeSpinner = (0, ora_1.default)("Regenerating Flutter code...").start();
|
|
229
|
+
try {
|
|
230
|
+
const mainDart = await generateMainDart(prompt, constitution, db, ai);
|
|
231
|
+
await fs.ensureDir(libPath);
|
|
232
|
+
await fs.writeFile(path.join(libPath, "main.dart"), mainDart);
|
|
233
|
+
codeSpinner.succeed("Flutter code regenerated");
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
codeSpinner.fail("Failed to regenerate code");
|
|
237
|
+
console.error(error);
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
console.log(chalk_1.default.green("\n✅ main.dart regenerated successfully!\n"));
|
|
241
|
+
console.log(chalk_1.default.cyan("Run your app:"));
|
|
242
|
+
console.log(chalk_1.default.white(" flutter run"));
|
|
243
|
+
console.log("");
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Generate main.dart content using AI
|
|
247
|
+
*/
|
|
248
|
+
async function generateMainDart(prompt, constitution, db = "local", ai = "none") {
|
|
249
|
+
// Build different system prompts based on database mode
|
|
250
|
+
const supabaseInstructions = db === "supabase" ? `
|
|
251
|
+
**SUPABASE CLOUD MODE (CRITICAL - MUST FOLLOW):**
|
|
252
|
+
You are generating a CLOUD-CONNECTED Flutter app using Supabase.
|
|
253
|
+
|
|
254
|
+
1. **Configuration:** Add these constants at the TOP of the file (after imports):
|
|
255
|
+
const String SUPABASE_URL = 'YOUR_SUPABASE_URL';
|
|
256
|
+
const String SUPABASE_ANON_KEY = 'YOUR_SUPABASE_ANON_KEY';
|
|
257
|
+
|
|
258
|
+
2. **Initialization:** In main(), initialize Supabase BEFORE runApp:
|
|
259
|
+
await Supabase.initialize(url: SUPABASE_URL, anonKey: SUPABASE_ANON_KEY);
|
|
260
|
+
|
|
261
|
+
3. **Imports:** Include:
|
|
262
|
+
import 'package:supabase_flutter/supabase_flutter.dart';
|
|
263
|
+
|
|
264
|
+
4. **Data Access:** Use SupabaseClient for ALL data operations:
|
|
265
|
+
- Get client: Supabase.instance.client
|
|
266
|
+
- Fetch: await client.from('table_name').select()
|
|
267
|
+
- Insert: await client.from('table_name').insert(data)
|
|
268
|
+
- Delete: await client.from('table_name').delete().eq('id', id)
|
|
269
|
+
|
|
270
|
+
5. **Realtime:** Use StreamBuilder with Supabase realtime:
|
|
271
|
+
final stream = client.from('table_name').stream(primaryKey: ['id']);
|
|
272
|
+
StreamBuilder<List<Map<String, dynamic>>>(stream: stream, ...)
|
|
273
|
+
|
|
274
|
+
6. **State Management:** The ChangeNotifier should:
|
|
275
|
+
- Initialize by fetching from Supabase
|
|
276
|
+
- Use Supabase for add/remove operations
|
|
277
|
+
- Subscribe to realtime changes
|
|
278
|
+
|
|
279
|
+
7. **Table Name:** Use lowercase plural of the model (e.g., 'tasks', 'agents', 'items')
|
|
280
|
+
|
|
281
|
+
8. **main() must be async:** void main() async { ... }
|
|
282
|
+
` : "";
|
|
283
|
+
const openrouterInstructions = ai === "openrouter" ? `
|
|
284
|
+
**OPENROUTER AI INTEGRATION (CRITICAL - MUST FOLLOW):**
|
|
285
|
+
You are generating a Flutter app with AI chat capabilities.
|
|
286
|
+
|
|
287
|
+
1. **Import AI Service:**
|
|
288
|
+
import 'services/ai_service.dart';
|
|
289
|
+
import 'screens/chat_screen.dart';
|
|
290
|
+
|
|
291
|
+
2. **AI FAB:** Add a SECOND FloatingActionButton for AI Analysis:
|
|
292
|
+
FloatingActionButton.extended(
|
|
293
|
+
heroTag: 'ai_fab',
|
|
294
|
+
onPressed: () => Navigator.push(context, MaterialPageRoute(builder: (_) => ChatScreen(dataContext: _serializeData()))),
|
|
295
|
+
icon: Icon(Icons.psychology),
|
|
296
|
+
label: Text('AI Analyst'),
|
|
297
|
+
backgroundColor: Color(0xFF7F00FF),
|
|
298
|
+
)
|
|
299
|
+
|
|
300
|
+
3. **Data Serialization:** Create a method that serializes current app data:
|
|
301
|
+
String _serializeData() {
|
|
302
|
+
// Convert current state to JSON string for AI context
|
|
303
|
+
return jsonEncode(items.map((i) => i.toJson()).toList());
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
4. **FloatingActionButton Layout:** Use a Column or Stack with two FABs:
|
|
307
|
+
- Primary FAB: Add item (bottom right)
|
|
308
|
+
- AI FAB: Open AI chat (above primary, with heroTag)
|
|
309
|
+
|
|
310
|
+
5. **Import json:** import 'dart:convert';
|
|
311
|
+
` : "";
|
|
312
|
+
const systemPrompt = `You are a Senior Flutter Architect specializing in mobile app development.
|
|
313
|
+
|
|
314
|
+
TASK: Generate a COMPLETE, WORKING Flutter application in a SINGLE main.dart file.
|
|
315
|
+
|
|
316
|
+
STRICT REQUIREMENTS:
|
|
317
|
+
1. OUTPUT: Generate ONLY the Dart code for lib/main.dart. No explanations, no markdown.
|
|
318
|
+
2. TECH STACK:
|
|
319
|
+
- Use MaterialApp with useMaterial3: true
|
|
320
|
+
- Use Provider for state management (already imported)
|
|
321
|
+
- Use ChangeNotifier pattern
|
|
322
|
+
3. THEME: Enforce 'Deep Void' Dark Mode:
|
|
323
|
+
- scaffoldBackgroundColor: Color(0xFF0a0a12)
|
|
324
|
+
- primaryColor: Color(0xFFFFD700) (gold accent)
|
|
325
|
+
- Card backgrounds: Color(0xFF1a1a2e)
|
|
326
|
+
- Text: Colors.white and Colors.white70
|
|
327
|
+
4. ARCHITECTURE:
|
|
328
|
+
- Create a Data Model class for the main entity (with toJson method)
|
|
329
|
+
- Create a ChangeNotifier class for state management
|
|
330
|
+
- Wrap app in ChangeNotifierProvider
|
|
331
|
+
- Create a Scaffold with AppBar
|
|
332
|
+
- Add a FloatingActionButton that opens showModalBottomSheet for adding items
|
|
333
|
+
- Use ListView.builder with Card widgets for the list
|
|
334
|
+
- Each Card should have an onLongPress to delete
|
|
335
|
+
5. IMPORTS: Include all necessary imports at the top:
|
|
336
|
+
import 'package:flutter/material.dart';
|
|
337
|
+
import 'package:provider/provider.dart';
|
|
338
|
+
${supabaseInstructions}${openrouterInstructions}
|
|
339
|
+
|
|
340
|
+
**STRICT DART TYPING RULES (CRITICAL - MUST FOLLOW):**
|
|
341
|
+
1. Text Widgets: You CANNOT pass a non-String variable directly to a Text widget.
|
|
342
|
+
- WRONG: Text(agent.rank)
|
|
343
|
+
- RIGHT: Text(agent.rank.toString())
|
|
344
|
+
- RIGHT: Text('\${agent.rank}')
|
|
345
|
+
2. String Interpolation: Always use interpolation for mixed content.
|
|
346
|
+
- RIGHT: Text('Value: \${asset.value}')
|
|
347
|
+
- RIGHT: Text('Count: \${items.length}')
|
|
348
|
+
3. Form Fields: When setting initialValue for TextFormField with numeric field, use .toString().
|
|
349
|
+
- RIGHT: initialValue: item.count.toString()
|
|
350
|
+
4. NEVER assign an int, double, or num to a String variable without .toString().
|
|
351
|
+
5. ALL model properties displayed in Text widgets MUST use .toString() or string interpolation.
|
|
352
|
+
|
|
353
|
+
${constitution ? `CONSTITUTION/CONTEXT:\n${constitution}\n` : ""}
|
|
354
|
+
|
|
355
|
+
Generate a production-ready Flutter app based on the user's description. Make it visually polished with proper spacing, icons, and animations.`;
|
|
356
|
+
const dbHint = db === "supabase"
|
|
357
|
+
? "\n\nIMPORTANT: This app uses SUPABASE for cloud database. Data must persist to Supabase, not local state. Use StreamBuilder for realtime updates."
|
|
358
|
+
: "";
|
|
359
|
+
const aiHint = ai === "openrouter"
|
|
360
|
+
? "\n\nIMPORTANT: This app has AI integration. Add an 'AI Analyst' FAB that opens a ChatScreen. Include data serialization for context injection."
|
|
361
|
+
: "";
|
|
362
|
+
const userPrompt = `Create a Flutter mobile app for: "${prompt}"${dbHint}${aiHint}
|
|
363
|
+
|
|
364
|
+
Generate the complete main.dart file with:
|
|
365
|
+
- A data model class (with toJson method for serialization)
|
|
366
|
+
- A ChangeNotifier state class with add/remove methods${db === "supabase" ? " (using Supabase client)" : ""}
|
|
367
|
+
- A main widget with the Deep Void dark theme
|
|
368
|
+
- ${db === "supabase" ? "StreamBuilder listening to Supabase realtime" : "ListView with Cards showing the data"}
|
|
369
|
+
- FloatingActionButton to add new items via bottom sheet
|
|
370
|
+
${ai === "openrouter" ? "- SECOND FloatingActionButton for 'AI Analyst' that navigates to ChatScreen" : ""}
|
|
371
|
+
- Form with TextFields for each property
|
|
372
|
+
- Delete on long press
|
|
373
|
+
|
|
374
|
+
Output ONLY the Dart code, no markdown or explanations.`;
|
|
375
|
+
const response = await (0, openrouter_1.createCompletion)(systemPrompt, userPrompt, {
|
|
376
|
+
model: openrouter_1.DEFAULT_MODEL,
|
|
377
|
+
maxTokens: 4096,
|
|
378
|
+
});
|
|
379
|
+
// Clean up the response - remove markdown if present
|
|
380
|
+
let code = response.trim();
|
|
381
|
+
if (code.startsWith("```dart")) {
|
|
382
|
+
code = code.slice(7);
|
|
383
|
+
}
|
|
384
|
+
else if (code.startsWith("```")) {
|
|
385
|
+
code = code.slice(3);
|
|
386
|
+
}
|
|
387
|
+
if (code.endsWith("```")) {
|
|
388
|
+
code = code.slice(0, -3);
|
|
389
|
+
}
|
|
390
|
+
return code.trim();
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Generate Supabase service layer
|
|
394
|
+
*/
|
|
395
|
+
async function generateSupabaseService(prompt) {
|
|
396
|
+
const systemPrompt = `You are a Senior Flutter Architect generating a Supabase service layer.
|
|
397
|
+
|
|
398
|
+
TASK: Generate a SupabaseService class in Dart.
|
|
399
|
+
|
|
400
|
+
REQUIREMENTS:
|
|
401
|
+
1. OUTPUT: Generate ONLY the Dart code. No explanations, no markdown.
|
|
402
|
+
2. IMPORTS:
|
|
403
|
+
import 'package:supabase_flutter/supabase_flutter.dart';
|
|
404
|
+
3. CLASS STRUCTURE:
|
|
405
|
+
- Class name: SupabaseService
|
|
406
|
+
- Get client via: Supabase.instance.client
|
|
407
|
+
- Methods:
|
|
408
|
+
* getAll() - Fetch all records with .select()
|
|
409
|
+
* insert(Map<String, dynamic> data) - Insert new record
|
|
410
|
+
* delete(String id) - Delete by id
|
|
411
|
+
* subscribe() - Return realtime stream
|
|
412
|
+
4. TABLE: Use lowercase plural based on the data model (guess from prompt)
|
|
413
|
+
5. ERROR HANDLING: Include try-catch blocks
|
|
414
|
+
|
|
415
|
+
Generate clean, well-documented Dart code.`;
|
|
416
|
+
const response = await (0, openrouter_1.createCompletion)(systemPrompt, `Generate a Supabase service for: "${prompt}"`, {
|
|
417
|
+
model: openrouter_1.DEFAULT_MODEL,
|
|
418
|
+
maxTokens: 2048,
|
|
419
|
+
});
|
|
420
|
+
let code = response.trim();
|
|
421
|
+
if (code.startsWith("```dart")) {
|
|
422
|
+
code = code.slice(7);
|
|
423
|
+
}
|
|
424
|
+
else if (code.startsWith("```")) {
|
|
425
|
+
code = code.slice(3);
|
|
426
|
+
}
|
|
427
|
+
if (code.endsWith("```")) {
|
|
428
|
+
code = code.slice(0, -3);
|
|
429
|
+
}
|
|
430
|
+
return code.trim();
|
|
431
|
+
}
|
|
432
|
+
/**
|
|
433
|
+
* Generate Supabase PostgreSQL schema
|
|
434
|
+
*/
|
|
435
|
+
async function generateSupabaseSchema(prompt) {
|
|
436
|
+
const systemPrompt = `You are a Senior Database Architect generating PostgreSQL schema for Supabase.
|
|
437
|
+
|
|
438
|
+
TASK: Generate a complete SQL schema file for Supabase.
|
|
439
|
+
|
|
440
|
+
REQUIREMENTS:
|
|
441
|
+
1. OUTPUT: Generate ONLY valid PostgreSQL SQL. No explanations, no markdown.
|
|
442
|
+
2. STRUCTURE:
|
|
443
|
+
- CREATE TABLE statement with appropriate columns
|
|
444
|
+
- Include: id (uuid, primary key, default gen_random_uuid())
|
|
445
|
+
- Include: created_at (timestamptz, default now())
|
|
446
|
+
- Include: updated_at (timestamptz, default now())
|
|
447
|
+
- Add relevant columns based on the app description
|
|
448
|
+
3. ROW LEVEL SECURITY (CRITICAL):
|
|
449
|
+
- ALTER TABLE ... ENABLE ROW LEVEL SECURITY;
|
|
450
|
+
- Create policies for SELECT, INSERT, UPDATE, DELETE
|
|
451
|
+
- Use permissive policies allowing authenticated AND anon access (for demo)
|
|
452
|
+
Example:
|
|
453
|
+
CREATE POLICY "Allow public read" ON table_name FOR SELECT USING (true);
|
|
454
|
+
CREATE POLICY "Allow public insert" ON table_name FOR INSERT WITH CHECK (true);
|
|
455
|
+
CREATE POLICY "Allow public delete" ON table_name FOR DELETE USING (true);
|
|
456
|
+
4. REALTIME:
|
|
457
|
+
- Add comment about enabling realtime in dashboard
|
|
458
|
+
5. TABLE NAME: Use lowercase plural (e.g., tasks, agents, items)
|
|
459
|
+
6. COLUMN TYPES: Use appropriate PostgreSQL types (text, integer, boolean, timestamptz, etc.)
|
|
460
|
+
|
|
461
|
+
Generate a production-ready PostgreSQL schema.`;
|
|
462
|
+
const response = await (0, openrouter_1.createCompletion)(systemPrompt, `Generate a Supabase PostgreSQL schema for: "${prompt}"`, {
|
|
463
|
+
model: openrouter_1.DEFAULT_MODEL,
|
|
464
|
+
maxTokens: 2048,
|
|
465
|
+
});
|
|
466
|
+
let code = response.trim();
|
|
467
|
+
if (code.startsWith("```sql")) {
|
|
468
|
+
code = code.slice(6);
|
|
469
|
+
}
|
|
470
|
+
else if (code.startsWith("```")) {
|
|
471
|
+
code = code.slice(3);
|
|
472
|
+
}
|
|
473
|
+
if (code.endsWith("```")) {
|
|
474
|
+
code = code.slice(0, -3);
|
|
475
|
+
}
|
|
476
|
+
// Add header comment
|
|
477
|
+
const header = `-- Helix Generated Supabase Schema
|
|
478
|
+
-- Generated for: ${prompt}
|
|
479
|
+
--
|
|
480
|
+
-- INSTRUCTIONS:
|
|
481
|
+
-- 1. Go to your Supabase project dashboard
|
|
482
|
+
-- 2. Navigate to SQL Editor
|
|
483
|
+
-- 3. Paste this entire file and run it
|
|
484
|
+
-- 4. Enable Realtime for the table in Table Editor > Realtime
|
|
485
|
+
--
|
|
486
|
+
-- ============================================================================
|
|
487
|
+
|
|
488
|
+
`;
|
|
489
|
+
return header + code.trim();
|
|
490
|
+
}
|
|
491
|
+
/**
|
|
492
|
+
* Generate OpenRouter AI service with persona injection
|
|
493
|
+
*/
|
|
494
|
+
async function generateAIService(persona) {
|
|
495
|
+
const defaultPersona = "You are a helpful strategic analyst.";
|
|
496
|
+
const finalPersona = persona || defaultPersona;
|
|
497
|
+
// Escape the persona for Dart string
|
|
498
|
+
const escapedPersona = finalPersona
|
|
499
|
+
.replace(/\\/g, "\\\\")
|
|
500
|
+
.replace(/'/g, "\\'")
|
|
501
|
+
.replace(/\n/g, "\\n")
|
|
502
|
+
.replace(/\r/g, "");
|
|
503
|
+
const systemPrompt = `You are a Senior Flutter Architect generating an OpenRouter AI service.
|
|
504
|
+
|
|
505
|
+
TASK: Generate an OpenRouterService class in Dart for AI chat functionality.
|
|
506
|
+
|
|
507
|
+
REQUIREMENTS:
|
|
508
|
+
1. OUTPUT: Generate ONLY the Dart code. No explanations, no markdown.
|
|
509
|
+
2. IMPORTS:
|
|
510
|
+
import 'dart:convert';
|
|
511
|
+
import 'package:http/http.dart' as http;
|
|
512
|
+
3. CONFIGURATION:
|
|
513
|
+
- const String OPENROUTER_API_KEY = 'YOUR_OPENROUTER_API_KEY';
|
|
514
|
+
- const String _endpoint = 'https://openrouter.ai/api/v1/chat/completions';
|
|
515
|
+
- const String _model = 'meta-llama/llama-3-8b-instruct:free';
|
|
516
|
+
4. SYSTEM PERSONA (CRITICAL - HARD-CODE THIS EXACT TEXT):
|
|
517
|
+
const String _systemPersona = '''${escapedPersona}''';
|
|
518
|
+
5. CLASS STRUCTURE:
|
|
519
|
+
- Class name: OpenRouterService
|
|
520
|
+
- Singleton pattern with static instance
|
|
521
|
+
- Method: Future<String> sendMessage(String userMessage, String dataContext)
|
|
522
|
+
* Creates messages array with:
|
|
523
|
+
- system message: _systemPersona + "\\n\\nCurrent Data Context: " + dataContext
|
|
524
|
+
- user message
|
|
525
|
+
* Makes POST request to _endpoint
|
|
526
|
+
* Parses response and returns assistant content
|
|
527
|
+
6. ERROR HANDLING: Return error message on failure, don't throw
|
|
528
|
+
7. HEADERS:
|
|
529
|
+
- 'Authorization': 'Bearer \$OPENROUTER_API_KEY'
|
|
530
|
+
- 'Content-Type': 'application/json'
|
|
531
|
+
- 'HTTP-Referer': 'https://helix-app.dev'
|
|
532
|
+
- 'X-Title': 'Helix AI'
|
|
533
|
+
|
|
534
|
+
Generate clean, well-documented Dart code.`;
|
|
535
|
+
const response = await (0, openrouter_1.createCompletion)(systemPrompt, `Generate an OpenRouter AI service with the embedded system persona.`, {
|
|
536
|
+
model: openrouter_1.DEFAULT_MODEL,
|
|
537
|
+
maxTokens: 2048,
|
|
538
|
+
});
|
|
539
|
+
let code = response.trim();
|
|
540
|
+
if (code.startsWith("```dart")) {
|
|
541
|
+
code = code.slice(7);
|
|
542
|
+
}
|
|
543
|
+
else if (code.startsWith("```")) {
|
|
544
|
+
code = code.slice(3);
|
|
545
|
+
}
|
|
546
|
+
if (code.endsWith("```")) {
|
|
547
|
+
code = code.slice(0, -3);
|
|
548
|
+
}
|
|
549
|
+
return code.trim();
|
|
550
|
+
}
|
|
551
|
+
/**
|
|
552
|
+
* Generate AI Chat Screen
|
|
553
|
+
*/
|
|
554
|
+
async function generateChatScreen(prompt) {
|
|
555
|
+
const systemPrompt = `You are a Senior Flutter Architect generating an AI chat screen.
|
|
556
|
+
|
|
557
|
+
TASK: Generate a ChatScreen widget in Dart for AI conversation.
|
|
558
|
+
|
|
559
|
+
REQUIREMENTS:
|
|
560
|
+
1. OUTPUT: Generate ONLY the Dart code. No explanations, no markdown.
|
|
561
|
+
2. IMPORTS:
|
|
562
|
+
import 'package:flutter/material.dart';
|
|
563
|
+
import 'package:flutter_markdown/flutter_markdown.dart';
|
|
564
|
+
import '../services/ai_service.dart';
|
|
565
|
+
3. WIDGET: ChatScreen (StatefulWidget)
|
|
566
|
+
- Constructor accepts: String dataContext (for app data context injection)
|
|
567
|
+
- State holds: List<Map<String, String>> messages, TextEditingController, bool isLoading
|
|
568
|
+
4. THEME: Deep Void Dark Mode:
|
|
569
|
+
- Scaffold background: Color(0xFF0a0a12)
|
|
570
|
+
- User messages: Color(0xFF1a1a2e) with gold border
|
|
571
|
+
- AI messages: Color(0xFF0f0f1a) with purple accent
|
|
572
|
+
5. UI STRUCTURE:
|
|
573
|
+
- AppBar with title "4See AI Analyst" and back button
|
|
574
|
+
- ListView.builder for messages
|
|
575
|
+
- Each message shows role (You/AI) and content (use MarkdownBody for AI)
|
|
576
|
+
- Bottom input area with TextField and send button
|
|
577
|
+
- Loading indicator when waiting for response
|
|
578
|
+
6. SEND LOGIC:
|
|
579
|
+
- Add user message to list
|
|
580
|
+
- Call OpenRouterService.instance.sendMessage(userMessage, dataContext)
|
|
581
|
+
- Add AI response to list
|
|
582
|
+
7. STYLING:
|
|
583
|
+
- Rounded message bubbles with proper padding
|
|
584
|
+
- Gold accent for user, purple for AI
|
|
585
|
+
- Smooth scroll to bottom on new message
|
|
586
|
+
|
|
587
|
+
Generate clean, visually polished Dart code.`;
|
|
588
|
+
const response = await (0, openrouter_1.createCompletion)(systemPrompt, `Generate an AI chat screen for an app about: "${prompt}"`, {
|
|
589
|
+
model: openrouter_1.DEFAULT_MODEL,
|
|
590
|
+
maxTokens: 2048,
|
|
591
|
+
});
|
|
592
|
+
let code = response.trim();
|
|
593
|
+
if (code.startsWith("```dart")) {
|
|
594
|
+
code = code.slice(7);
|
|
595
|
+
}
|
|
596
|
+
else if (code.startsWith("```")) {
|
|
597
|
+
code = code.slice(3);
|
|
598
|
+
}
|
|
599
|
+
if (code.endsWith("```")) {
|
|
600
|
+
code = code.slice(0, -3);
|
|
601
|
+
}
|
|
602
|
+
return code.trim();
|
|
603
|
+
}
|
|
604
|
+
/**
|
|
605
|
+
* Parse the prompt to extract data model structure
|
|
606
|
+
*/
|
|
607
|
+
function parseFlutterPrompt(prompt) {
|
|
608
|
+
// Simple extraction - AI will handle the actual interpretation
|
|
609
|
+
const strands = [];
|
|
610
|
+
// Look for common patterns like "with X, Y, and Z fields"
|
|
611
|
+
const match = prompt.match(/with\s+(.+?)(?:\.|$)/i);
|
|
612
|
+
if (match) {
|
|
613
|
+
const fieldsStr = match[1];
|
|
614
|
+
const fields = fieldsStr.split(/,\s*|\s+and\s+/i).map(f => ({
|
|
615
|
+
name: f.trim().replace(/\s+/g, "_"),
|
|
616
|
+
type: "String"
|
|
617
|
+
}));
|
|
618
|
+
// Extract main entity name
|
|
619
|
+
const entityMatch = prompt.match(/(?:a|an)\s+(\w+)/i);
|
|
620
|
+
const entityName = entityMatch ? entityMatch[1] : "Item";
|
|
621
|
+
strands.push({
|
|
622
|
+
name: entityName.charAt(0).toUpperCase() + entityName.slice(1),
|
|
623
|
+
fields
|
|
624
|
+
});
|
|
625
|
+
}
|
|
626
|
+
return strands;
|
|
627
|
+
}
|
|
628
|
+
//# sourceMappingURL=flutter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flutter.js","sourceRoot":"","sources":["../../src/generators/flutter.ts"],"names":[],"mappings":"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"}
|