archetype-engine 2.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/LICENSE +21 -0
- package/README.md +241 -0
- package/dist/src/ai/adapters/anthropic.d.ts +31 -0
- package/dist/src/ai/adapters/anthropic.d.ts.map +1 -0
- package/dist/src/ai/adapters/anthropic.js +75 -0
- package/dist/src/ai/adapters/openai.d.ts +33 -0
- package/dist/src/ai/adapters/openai.d.ts.map +1 -0
- package/dist/src/ai/adapters/openai.js +120 -0
- package/dist/src/ai/adapters/vercel.d.ts +434 -0
- package/dist/src/ai/adapters/vercel.d.ts.map +1 -0
- package/dist/src/ai/adapters/vercel.js +162 -0
- package/dist/src/ai/index.d.ts +492 -0
- package/dist/src/ai/index.d.ts.map +1 -0
- package/dist/src/ai/index.js +71 -0
- package/dist/src/ai/state.d.ts +13 -0
- package/dist/src/ai/state.d.ts.map +1 -0
- package/dist/src/ai/state.js +215 -0
- package/dist/src/ai/tools.d.ts +13 -0
- package/dist/src/ai/tools.d.ts.map +1 -0
- package/dist/src/ai/tools.js +257 -0
- package/dist/src/ai/types.d.ts +196 -0
- package/dist/src/ai/types.d.ts.map +1 -0
- package/dist/src/ai/types.js +9 -0
- package/dist/src/cli.d.ts +3 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +540 -0
- package/dist/src/core/utils.d.ts +27 -0
- package/dist/src/core/utils.d.ts.map +1 -0
- package/dist/src/core/utils.js +56 -0
- package/dist/src/entity.d.ts +165 -0
- package/dist/src/entity.d.ts.map +1 -0
- package/dist/src/entity.js +108 -0
- package/dist/src/fields.d.ts +207 -0
- package/dist/src/fields.d.ts.map +1 -0
- package/dist/src/fields.js +291 -0
- package/dist/src/generators/erd-ir.d.ts +10 -0
- package/dist/src/generators/erd-ir.d.ts.map +1 -0
- package/dist/src/generators/erd-ir.js +119 -0
- package/dist/src/index.d.ts +51 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +101 -0
- package/dist/src/init/dependencies.d.ts +31 -0
- package/dist/src/init/dependencies.d.ts.map +1 -0
- package/dist/src/init/dependencies.js +101 -0
- package/dist/src/init/entity-templates.d.ts +42 -0
- package/dist/src/init/entity-templates.d.ts.map +1 -0
- package/dist/src/init/entity-templates.js +367 -0
- package/dist/src/init/index.d.ts +10 -0
- package/dist/src/init/index.d.ts.map +1 -0
- package/dist/src/init/index.js +250 -0
- package/dist/src/init/prompts.d.ts +11 -0
- package/dist/src/init/prompts.d.ts.map +1 -0
- package/dist/src/init/prompts.js +275 -0
- package/dist/src/init/templates.d.ts +24 -0
- package/dist/src/init/templates.d.ts.map +1 -0
- package/dist/src/init/templates.js +587 -0
- package/dist/src/json/index.d.ts +11 -0
- package/dist/src/json/index.d.ts.map +1 -0
- package/dist/src/json/index.js +26 -0
- package/dist/src/json/parser.d.ts +61 -0
- package/dist/src/json/parser.d.ts.map +1 -0
- package/dist/src/json/parser.js +309 -0
- package/dist/src/json/types.d.ts +275 -0
- package/dist/src/json/types.d.ts.map +1 -0
- package/dist/src/json/types.js +10 -0
- package/dist/src/manifest.d.ts +147 -0
- package/dist/src/manifest.d.ts.map +1 -0
- package/dist/src/manifest.js +104 -0
- package/dist/src/relations.d.ts +96 -0
- package/dist/src/relations.d.ts.map +1 -0
- package/dist/src/relations.js +108 -0
- package/dist/src/source.d.ts +93 -0
- package/dist/src/source.d.ts.map +1 -0
- package/dist/src/source.js +89 -0
- package/dist/src/template/context.d.ts +34 -0
- package/dist/src/template/context.d.ts.map +1 -0
- package/dist/src/template/context.js +31 -0
- package/dist/src/template/index.d.ts +6 -0
- package/dist/src/template/index.d.ts.map +1 -0
- package/dist/src/template/index.js +12 -0
- package/dist/src/template/registry.d.ts +18 -0
- package/dist/src/template/registry.d.ts.map +1 -0
- package/dist/src/template/registry.js +89 -0
- package/dist/src/template/runner.d.ts +9 -0
- package/dist/src/template/runner.d.ts.map +1 -0
- package/dist/src/template/runner.js +125 -0
- package/dist/src/template/types.d.ts +73 -0
- package/dist/src/template/types.d.ts.map +1 -0
- package/dist/src/template/types.js +3 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/api.d.ts +22 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/api.d.ts.map +1 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/api.js +866 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/auth.d.ts +20 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/auth.d.ts.map +1 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/auth.js +273 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/crud-hooks.d.ts +22 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/crud-hooks.d.ts.map +1 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/crud-hooks.js +237 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/hooks.d.ts +30 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/hooks.d.ts.map +1 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/hooks.js +345 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/i18n.d.ts +25 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/i18n.d.ts.map +1 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/i18n.js +199 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/index.d.ts +8 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/index.d.ts.map +1 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/index.js +18 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/schema.d.ts +22 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/schema.d.ts.map +1 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/schema.js +270 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/service.d.ts +23 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/service.d.ts.map +1 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/service.js +304 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/validation.d.ts +21 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/validation.d.ts.map +1 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/validation.js +248 -0
- package/dist/src/templates/nextjs-drizzle-trpc/index.d.ts +30 -0
- package/dist/src/templates/nextjs-drizzle-trpc/index.d.ts.map +1 -0
- package/dist/src/templates/nextjs-drizzle-trpc/index.js +71 -0
- package/dist/src/validation/index.d.ts +71 -0
- package/dist/src/validation/index.d.ts.map +1 -0
- package/dist/src/validation/index.js +314 -0
- package/package.json +86 -0
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ManifestBuilder - State manager for AI tool calls
|
|
4
|
+
*
|
|
5
|
+
* Tracks the manifest being built across multiple AI tool calls.
|
|
6
|
+
*
|
|
7
|
+
* @module ai/state
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.createManifestBuilder = createManifestBuilder;
|
|
11
|
+
const validation_1 = require("../validation");
|
|
12
|
+
const parser_1 = require("../json/parser");
|
|
13
|
+
const template_1 = require("../template");
|
|
14
|
+
/**
|
|
15
|
+
* Create a new ManifestBuilder instance
|
|
16
|
+
*/
|
|
17
|
+
function createManifestBuilder() {
|
|
18
|
+
let entities = [];
|
|
19
|
+
let database;
|
|
20
|
+
let auth;
|
|
21
|
+
const builder = {
|
|
22
|
+
get entities() {
|
|
23
|
+
return [...entities];
|
|
24
|
+
},
|
|
25
|
+
get database() {
|
|
26
|
+
return database;
|
|
27
|
+
},
|
|
28
|
+
get auth() {
|
|
29
|
+
return auth;
|
|
30
|
+
},
|
|
31
|
+
addEntity(params) {
|
|
32
|
+
// Check if entity already exists
|
|
33
|
+
const existing = entities.find(e => e.name === params.name);
|
|
34
|
+
if (existing) {
|
|
35
|
+
return {
|
|
36
|
+
success: false,
|
|
37
|
+
message: `Entity '${params.name}' already exists. Use update_entity to modify it.`,
|
|
38
|
+
errors: [{ code: 'DUPLICATE_ENTITY', message: `Entity '${params.name}' already exists` }],
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
// Convert params to EntityJSON
|
|
42
|
+
const fields = {};
|
|
43
|
+
for (const [name, field] of Object.entries(params.fields)) {
|
|
44
|
+
fields[name] = {
|
|
45
|
+
type: field.type,
|
|
46
|
+
required: field.required,
|
|
47
|
+
unique: field.unique,
|
|
48
|
+
email: field.email,
|
|
49
|
+
url: field.url,
|
|
50
|
+
min: field.min,
|
|
51
|
+
max: field.max,
|
|
52
|
+
oneOf: field.oneOf,
|
|
53
|
+
integer: field.integer,
|
|
54
|
+
positive: field.positive,
|
|
55
|
+
default: field.default,
|
|
56
|
+
label: field.label,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
const relations = params.relations
|
|
60
|
+
? Object.fromEntries(Object.entries(params.relations).map(([name, rel]) => [
|
|
61
|
+
name,
|
|
62
|
+
{ type: rel.type, entity: rel.entity },
|
|
63
|
+
]))
|
|
64
|
+
: undefined;
|
|
65
|
+
const entity = {
|
|
66
|
+
name: params.name,
|
|
67
|
+
fields,
|
|
68
|
+
relations,
|
|
69
|
+
behaviors: params.behaviors,
|
|
70
|
+
protected: params.protected,
|
|
71
|
+
};
|
|
72
|
+
entities.push(entity);
|
|
73
|
+
return {
|
|
74
|
+
success: true,
|
|
75
|
+
message: `Entity '${params.name}' added with ${Object.keys(fields).length} fields.`,
|
|
76
|
+
data: { entities: entities.map(e => e.name) },
|
|
77
|
+
};
|
|
78
|
+
},
|
|
79
|
+
updateEntity(params) {
|
|
80
|
+
const index = entities.findIndex(e => e.name === params.name);
|
|
81
|
+
if (index === -1) {
|
|
82
|
+
return {
|
|
83
|
+
success: false,
|
|
84
|
+
message: `Entity '${params.name}' not found. Use add_entity to create it first.`,
|
|
85
|
+
errors: [{ code: 'ENTITY_NOT_FOUND', message: `Entity '${params.name}' not found` }],
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
const entity = entities[index];
|
|
89
|
+
// Update fields if provided
|
|
90
|
+
if (params.fields) {
|
|
91
|
+
for (const [name, field] of Object.entries(params.fields)) {
|
|
92
|
+
entity.fields[name] = {
|
|
93
|
+
...entity.fields[name],
|
|
94
|
+
type: field.type ?? entity.fields[name]?.type ?? 'text',
|
|
95
|
+
required: field.required,
|
|
96
|
+
unique: field.unique,
|
|
97
|
+
email: field.email,
|
|
98
|
+
url: field.url,
|
|
99
|
+
min: field.min,
|
|
100
|
+
max: field.max,
|
|
101
|
+
oneOf: field.oneOf,
|
|
102
|
+
integer: field.integer,
|
|
103
|
+
positive: field.positive,
|
|
104
|
+
default: field.default,
|
|
105
|
+
label: field.label,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Update relations if provided
|
|
110
|
+
if (params.relations) {
|
|
111
|
+
entity.relations = entity.relations ?? {};
|
|
112
|
+
for (const [name, rel] of Object.entries(params.relations)) {
|
|
113
|
+
entity.relations[name] = { type: rel.type, entity: rel.entity };
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Update behaviors if provided
|
|
117
|
+
if (params.behaviors) {
|
|
118
|
+
entity.behaviors = { ...entity.behaviors, ...params.behaviors };
|
|
119
|
+
}
|
|
120
|
+
// Update protected if provided
|
|
121
|
+
if (params.protected !== undefined) {
|
|
122
|
+
entity.protected = params.protected;
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
success: true,
|
|
126
|
+
message: `Entity '${params.name}' updated.`,
|
|
127
|
+
data: { entity: entity.name, fields: Object.keys(entity.fields) },
|
|
128
|
+
};
|
|
129
|
+
},
|
|
130
|
+
removeEntity(params) {
|
|
131
|
+
const index = entities.findIndex(e => e.name === params.name);
|
|
132
|
+
if (index === -1) {
|
|
133
|
+
return {
|
|
134
|
+
success: false,
|
|
135
|
+
message: `Entity '${params.name}' not found.`,
|
|
136
|
+
errors: [{ code: 'ENTITY_NOT_FOUND', message: `Entity '${params.name}' not found` }],
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
entities.splice(index, 1);
|
|
140
|
+
return {
|
|
141
|
+
success: true,
|
|
142
|
+
message: `Entity '${params.name}' removed.`,
|
|
143
|
+
data: { entities: entities.map(e => e.name) },
|
|
144
|
+
};
|
|
145
|
+
},
|
|
146
|
+
setDatabase(params) {
|
|
147
|
+
database = {
|
|
148
|
+
type: params.type,
|
|
149
|
+
file: params.file,
|
|
150
|
+
url: params.url,
|
|
151
|
+
};
|
|
152
|
+
return {
|
|
153
|
+
success: true,
|
|
154
|
+
message: `Database configured: ${params.type}`,
|
|
155
|
+
data: { database },
|
|
156
|
+
};
|
|
157
|
+
},
|
|
158
|
+
setAuth(params) {
|
|
159
|
+
auth = {
|
|
160
|
+
enabled: params.enabled,
|
|
161
|
+
providers: params.providers,
|
|
162
|
+
sessionStrategy: params.sessionStrategy,
|
|
163
|
+
};
|
|
164
|
+
return {
|
|
165
|
+
success: true,
|
|
166
|
+
message: params.enabled
|
|
167
|
+
? `Auth enabled with providers: ${params.providers?.join(', ') ?? 'credentials'}`
|
|
168
|
+
: 'Auth disabled',
|
|
169
|
+
data: { auth },
|
|
170
|
+
};
|
|
171
|
+
},
|
|
172
|
+
toManifest() {
|
|
173
|
+
return {
|
|
174
|
+
entities,
|
|
175
|
+
database,
|
|
176
|
+
auth,
|
|
177
|
+
template: 'nextjs-drizzle-trpc',
|
|
178
|
+
};
|
|
179
|
+
},
|
|
180
|
+
validate() {
|
|
181
|
+
return (0, validation_1.validateManifest)(this.toManifest());
|
|
182
|
+
},
|
|
183
|
+
async generate() {
|
|
184
|
+
const manifest = this.toManifest();
|
|
185
|
+
const validation = (0, validation_1.validateManifest)(manifest);
|
|
186
|
+
if (!validation.valid) {
|
|
187
|
+
return {
|
|
188
|
+
files: [],
|
|
189
|
+
success: false,
|
|
190
|
+
errors: validation.errors.map(e => e.message),
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
const ir = (0, parser_1.parseManifestJSON)(manifest);
|
|
194
|
+
const template = await (0, template_1.getTemplate)('nextjs-drizzle-trpc');
|
|
195
|
+
if (!template) {
|
|
196
|
+
return {
|
|
197
|
+
files: [],
|
|
198
|
+
success: false,
|
|
199
|
+
errors: ['Template not found'],
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
const files = await (0, template_1.runTemplate)(template, ir);
|
|
203
|
+
return {
|
|
204
|
+
files,
|
|
205
|
+
success: true,
|
|
206
|
+
};
|
|
207
|
+
},
|
|
208
|
+
reset() {
|
|
209
|
+
entities = [];
|
|
210
|
+
database = undefined;
|
|
211
|
+
auth = undefined;
|
|
212
|
+
},
|
|
213
|
+
};
|
|
214
|
+
return builder;
|
|
215
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Framework-agnostic tool definitions
|
|
3
|
+
*
|
|
4
|
+
* These definitions can be converted to OpenAI, Anthropic, or Vercel AI SDK formats.
|
|
5
|
+
*
|
|
6
|
+
* @module ai/tools
|
|
7
|
+
*/
|
|
8
|
+
import type { ToolDefinition } from './types';
|
|
9
|
+
/**
|
|
10
|
+
* All available tools
|
|
11
|
+
*/
|
|
12
|
+
export declare const toolDefinitions: Record<string, ToolDefinition>;
|
|
13
|
+
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/ai/tools.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAqF7C;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAgL1D,CAAA"}
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Framework-agnostic tool definitions
|
|
4
|
+
*
|
|
5
|
+
* These definitions can be converted to OpenAI, Anthropic, or Vercel AI SDK formats.
|
|
6
|
+
*
|
|
7
|
+
* @module ai/tools
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.toolDefinitions = void 0;
|
|
11
|
+
/**
|
|
12
|
+
* Field type JSON schema
|
|
13
|
+
* Note: Type assertion required because of deeply nested schema structure
|
|
14
|
+
*/
|
|
15
|
+
const fieldSchema = {
|
|
16
|
+
type: 'object',
|
|
17
|
+
description: 'Field definition',
|
|
18
|
+
properties: {
|
|
19
|
+
type: {
|
|
20
|
+
type: 'string',
|
|
21
|
+
description: 'Field data type',
|
|
22
|
+
enum: ['text', 'number', 'boolean', 'date'],
|
|
23
|
+
},
|
|
24
|
+
required: {
|
|
25
|
+
type: 'boolean',
|
|
26
|
+
description: 'Whether the field is required (default: true)',
|
|
27
|
+
},
|
|
28
|
+
unique: {
|
|
29
|
+
type: 'boolean',
|
|
30
|
+
description: 'Add unique constraint',
|
|
31
|
+
},
|
|
32
|
+
email: {
|
|
33
|
+
type: 'boolean',
|
|
34
|
+
description: 'Validate as email (text fields only)',
|
|
35
|
+
},
|
|
36
|
+
url: {
|
|
37
|
+
type: 'boolean',
|
|
38
|
+
description: 'Validate as URL (text fields only)',
|
|
39
|
+
},
|
|
40
|
+
min: {
|
|
41
|
+
type: 'number',
|
|
42
|
+
description: 'Minimum length (text) or value (number)',
|
|
43
|
+
},
|
|
44
|
+
max: {
|
|
45
|
+
type: 'number',
|
|
46
|
+
description: 'Maximum length (text) or value (number)',
|
|
47
|
+
},
|
|
48
|
+
oneOf: {
|
|
49
|
+
type: 'array',
|
|
50
|
+
description: 'Enum values - field must be one of these',
|
|
51
|
+
items: { type: 'string' },
|
|
52
|
+
},
|
|
53
|
+
integer: {
|
|
54
|
+
type: 'boolean',
|
|
55
|
+
description: 'Must be integer (number fields only)',
|
|
56
|
+
},
|
|
57
|
+
positive: {
|
|
58
|
+
type: 'boolean',
|
|
59
|
+
description: 'Must be positive (number fields only)',
|
|
60
|
+
},
|
|
61
|
+
default: {
|
|
62
|
+
type: 'string',
|
|
63
|
+
description: 'Default value',
|
|
64
|
+
},
|
|
65
|
+
label: {
|
|
66
|
+
type: 'string',
|
|
67
|
+
description: 'Display label for UI',
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
required: ['type'],
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Relation type JSON schema
|
|
74
|
+
* Note: Type assertion required because of deeply nested schema structure
|
|
75
|
+
*/
|
|
76
|
+
const relationSchema = {
|
|
77
|
+
type: 'object',
|
|
78
|
+
description: 'Relation definition',
|
|
79
|
+
properties: {
|
|
80
|
+
type: {
|
|
81
|
+
type: 'string',
|
|
82
|
+
description: 'Relation type',
|
|
83
|
+
enum: ['hasOne', 'hasMany', 'belongsToMany'],
|
|
84
|
+
},
|
|
85
|
+
entity: {
|
|
86
|
+
type: 'string',
|
|
87
|
+
description: 'Target entity name (PascalCase)',
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
required: ['type', 'entity'],
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* All available tools
|
|
94
|
+
*/
|
|
95
|
+
exports.toolDefinitions = {
|
|
96
|
+
add_entity: {
|
|
97
|
+
name: 'add_entity',
|
|
98
|
+
description: 'Add a new entity to the app. Entities represent data types like User, Post, Product. Each entity will get a database table, API endpoints, and React hooks.',
|
|
99
|
+
parameters: {
|
|
100
|
+
name: {
|
|
101
|
+
type: 'string',
|
|
102
|
+
description: 'Entity name in PascalCase (e.g., User, BlogPost, ProductCategory)',
|
|
103
|
+
required: true,
|
|
104
|
+
},
|
|
105
|
+
fields: {
|
|
106
|
+
type: 'object',
|
|
107
|
+
description: 'Field definitions. Keys are field names in camelCase. Values define type and validations.',
|
|
108
|
+
required: true,
|
|
109
|
+
properties: {
|
|
110
|
+
'[fieldName]': fieldSchema,
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
relations: {
|
|
114
|
+
type: 'object',
|
|
115
|
+
description: 'Relations to other entities. hasOne = foreign key on this entity, hasMany = foreign key on target, belongsToMany = junction table.',
|
|
116
|
+
properties: {
|
|
117
|
+
'[relationName]': relationSchema,
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
behaviors: {
|
|
121
|
+
type: 'object',
|
|
122
|
+
description: 'Entity behaviors',
|
|
123
|
+
properties: {
|
|
124
|
+
timestamps: {
|
|
125
|
+
type: 'boolean',
|
|
126
|
+
description: 'Add createdAt/updatedAt fields (default: true)',
|
|
127
|
+
},
|
|
128
|
+
softDelete: {
|
|
129
|
+
type: 'boolean',
|
|
130
|
+
description: 'Use deletedAt instead of hard delete',
|
|
131
|
+
},
|
|
132
|
+
audit: {
|
|
133
|
+
type: 'boolean',
|
|
134
|
+
description: 'Log all changes',
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
|
+
protected: {
|
|
139
|
+
type: 'string',
|
|
140
|
+
description: 'Auth protection level. false=public, true=all protected, "write"=read public/write protected',
|
|
141
|
+
enum: ['false', 'true', 'write', 'all'],
|
|
142
|
+
},
|
|
143
|
+
},
|
|
144
|
+
required: ['name', 'fields'],
|
|
145
|
+
},
|
|
146
|
+
update_entity: {
|
|
147
|
+
name: 'update_entity',
|
|
148
|
+
description: 'Update an existing entity. Use this to add/modify fields or relations.',
|
|
149
|
+
parameters: {
|
|
150
|
+
name: {
|
|
151
|
+
type: 'string',
|
|
152
|
+
description: 'Name of the entity to update',
|
|
153
|
+
required: true,
|
|
154
|
+
},
|
|
155
|
+
fields: {
|
|
156
|
+
type: 'object',
|
|
157
|
+
description: 'Fields to add or update',
|
|
158
|
+
properties: {
|
|
159
|
+
'[fieldName]': fieldSchema,
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
relations: {
|
|
163
|
+
type: 'object',
|
|
164
|
+
description: 'Relations to add or update',
|
|
165
|
+
properties: {
|
|
166
|
+
'[relationName]': relationSchema,
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
behaviors: {
|
|
170
|
+
type: 'object',
|
|
171
|
+
description: 'Behaviors to update',
|
|
172
|
+
properties: {
|
|
173
|
+
timestamps: { type: 'boolean', description: 'Add createdAt/updatedAt' },
|
|
174
|
+
softDelete: { type: 'boolean', description: 'Use soft delete' },
|
|
175
|
+
audit: { type: 'boolean', description: 'Enable audit logging' },
|
|
176
|
+
},
|
|
177
|
+
},
|
|
178
|
+
protected: {
|
|
179
|
+
type: 'string',
|
|
180
|
+
description: 'Auth protection level',
|
|
181
|
+
enum: ['false', 'true', 'write', 'all'],
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
required: ['name'],
|
|
185
|
+
},
|
|
186
|
+
remove_entity: {
|
|
187
|
+
name: 'remove_entity',
|
|
188
|
+
description: 'Remove an entity from the app.',
|
|
189
|
+
parameters: {
|
|
190
|
+
name: {
|
|
191
|
+
type: 'string',
|
|
192
|
+
description: 'Name of the entity to remove',
|
|
193
|
+
required: true,
|
|
194
|
+
},
|
|
195
|
+
},
|
|
196
|
+
required: ['name'],
|
|
197
|
+
},
|
|
198
|
+
set_database: {
|
|
199
|
+
name: 'set_database',
|
|
200
|
+
description: 'Configure the database. Required before generating the app.',
|
|
201
|
+
parameters: {
|
|
202
|
+
type: {
|
|
203
|
+
type: 'string',
|
|
204
|
+
description: 'Database type',
|
|
205
|
+
required: true,
|
|
206
|
+
enum: ['sqlite', 'postgres', 'mysql'],
|
|
207
|
+
},
|
|
208
|
+
file: {
|
|
209
|
+
type: 'string',
|
|
210
|
+
description: 'SQLite file path (required for SQLite, e.g., "./app.db")',
|
|
211
|
+
},
|
|
212
|
+
url: {
|
|
213
|
+
type: 'string',
|
|
214
|
+
description: 'Connection URL for Postgres/MySQL. Use env: prefix for env vars (e.g., "env:DATABASE_URL")',
|
|
215
|
+
},
|
|
216
|
+
},
|
|
217
|
+
required: ['type'],
|
|
218
|
+
},
|
|
219
|
+
set_auth: {
|
|
220
|
+
name: 'set_auth',
|
|
221
|
+
description: 'Configure authentication. Enables user login with various providers.',
|
|
222
|
+
parameters: {
|
|
223
|
+
enabled: {
|
|
224
|
+
type: 'boolean',
|
|
225
|
+
description: 'Whether to enable authentication',
|
|
226
|
+
required: true,
|
|
227
|
+
},
|
|
228
|
+
providers: {
|
|
229
|
+
type: 'array',
|
|
230
|
+
description: 'Login providers to enable',
|
|
231
|
+
items: {
|
|
232
|
+
type: 'string',
|
|
233
|
+
description: 'Provider name',
|
|
234
|
+
enum: ['credentials', 'google', 'github', 'discord'],
|
|
235
|
+
},
|
|
236
|
+
},
|
|
237
|
+
sessionStrategy: {
|
|
238
|
+
type: 'string',
|
|
239
|
+
description: 'Session storage strategy',
|
|
240
|
+
enum: ['jwt', 'database'],
|
|
241
|
+
},
|
|
242
|
+
},
|
|
243
|
+
required: ['enabled'],
|
|
244
|
+
},
|
|
245
|
+
validate: {
|
|
246
|
+
name: 'validate',
|
|
247
|
+
description: 'Validate the current manifest. Returns structured errors with suggestions. Call this before generate to check for issues.',
|
|
248
|
+
parameters: {},
|
|
249
|
+
required: [],
|
|
250
|
+
},
|
|
251
|
+
generate: {
|
|
252
|
+
name: 'generate',
|
|
253
|
+
description: 'Generate the app. Creates all files: database schema, API routes, React hooks, validation schemas. Call validate first to check for errors.',
|
|
254
|
+
parameters: {},
|
|
255
|
+
required: [],
|
|
256
|
+
},
|
|
257
|
+
};
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Module Types
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for AI tool integrations.
|
|
5
|
+
*
|
|
6
|
+
* @module ai/types
|
|
7
|
+
*/
|
|
8
|
+
import type { EntityJSON, DatabaseJSON, AuthJSON, ManifestJSON } from '../json/types';
|
|
9
|
+
import type { ValidationResult } from '../validation';
|
|
10
|
+
import type { GeneratedFile } from '../template/types';
|
|
11
|
+
/**
|
|
12
|
+
* Tool parameter definition
|
|
13
|
+
*/
|
|
14
|
+
export interface ToolParameter {
|
|
15
|
+
type: 'string' | 'number' | 'boolean' | 'object' | 'array';
|
|
16
|
+
description: string;
|
|
17
|
+
required?: boolean;
|
|
18
|
+
enum?: string[];
|
|
19
|
+
properties?: Record<string, ToolParameter>;
|
|
20
|
+
items?: ToolParameter;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* JSON Schema property (for tool schemas)
|
|
24
|
+
*/
|
|
25
|
+
export interface SchemaProperty {
|
|
26
|
+
type: string;
|
|
27
|
+
description: string;
|
|
28
|
+
enum?: string[];
|
|
29
|
+
items?: SchemaProperty;
|
|
30
|
+
additionalProperties?: boolean;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Tool definition (framework-agnostic)
|
|
34
|
+
*/
|
|
35
|
+
export interface ToolDefinition {
|
|
36
|
+
name: string;
|
|
37
|
+
description: string;
|
|
38
|
+
parameters: Record<string, ToolParameter>;
|
|
39
|
+
required?: string[];
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Result of a tool execution
|
|
43
|
+
*/
|
|
44
|
+
export interface ToolResult {
|
|
45
|
+
success: boolean;
|
|
46
|
+
message?: string;
|
|
47
|
+
data?: unknown;
|
|
48
|
+
errors?: Array<{
|
|
49
|
+
code: string;
|
|
50
|
+
message: string;
|
|
51
|
+
suggestion?: string;
|
|
52
|
+
}>;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Add entity parameters
|
|
56
|
+
*/
|
|
57
|
+
export interface AddEntityParams {
|
|
58
|
+
name: string;
|
|
59
|
+
fields: Record<string, {
|
|
60
|
+
type: 'text' | 'number' | 'boolean' | 'date';
|
|
61
|
+
required?: boolean;
|
|
62
|
+
unique?: boolean;
|
|
63
|
+
email?: boolean;
|
|
64
|
+
url?: boolean;
|
|
65
|
+
min?: number;
|
|
66
|
+
max?: number;
|
|
67
|
+
oneOf?: string[];
|
|
68
|
+
integer?: boolean;
|
|
69
|
+
positive?: boolean;
|
|
70
|
+
default?: unknown;
|
|
71
|
+
label?: string;
|
|
72
|
+
}>;
|
|
73
|
+
relations?: Record<string, {
|
|
74
|
+
type: 'hasOne' | 'hasMany' | 'belongsToMany';
|
|
75
|
+
entity: string;
|
|
76
|
+
}>;
|
|
77
|
+
behaviors?: {
|
|
78
|
+
timestamps?: boolean;
|
|
79
|
+
softDelete?: boolean;
|
|
80
|
+
audit?: boolean;
|
|
81
|
+
};
|
|
82
|
+
protected?: boolean | 'write' | 'all';
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Update entity parameters
|
|
86
|
+
*/
|
|
87
|
+
export interface UpdateEntityParams {
|
|
88
|
+
name: string;
|
|
89
|
+
fields?: Record<string, {
|
|
90
|
+
type?: 'text' | 'number' | 'boolean' | 'date';
|
|
91
|
+
required?: boolean;
|
|
92
|
+
unique?: boolean;
|
|
93
|
+
email?: boolean;
|
|
94
|
+
url?: boolean;
|
|
95
|
+
min?: number;
|
|
96
|
+
max?: number;
|
|
97
|
+
oneOf?: string[];
|
|
98
|
+
integer?: boolean;
|
|
99
|
+
positive?: boolean;
|
|
100
|
+
default?: unknown;
|
|
101
|
+
label?: string;
|
|
102
|
+
}>;
|
|
103
|
+
relations?: Record<string, {
|
|
104
|
+
type: 'hasOne' | 'hasMany' | 'belongsToMany';
|
|
105
|
+
entity: string;
|
|
106
|
+
}>;
|
|
107
|
+
behaviors?: {
|
|
108
|
+
timestamps?: boolean;
|
|
109
|
+
softDelete?: boolean;
|
|
110
|
+
audit?: boolean;
|
|
111
|
+
};
|
|
112
|
+
protected?: boolean | 'write' | 'all';
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Remove entity parameters
|
|
116
|
+
*/
|
|
117
|
+
export interface RemoveEntityParams {
|
|
118
|
+
name: string;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Set database parameters
|
|
122
|
+
*/
|
|
123
|
+
export interface SetDatabaseParams {
|
|
124
|
+
type: 'sqlite' | 'postgres' | 'mysql';
|
|
125
|
+
file?: string;
|
|
126
|
+
url?: string;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Set auth parameters
|
|
130
|
+
*/
|
|
131
|
+
export interface SetAuthParams {
|
|
132
|
+
enabled: boolean;
|
|
133
|
+
providers?: ('credentials' | 'google' | 'github' | 'discord')[];
|
|
134
|
+
sessionStrategy?: 'jwt' | 'database';
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* ManifestBuilder interface for tracking state across tool calls
|
|
138
|
+
*/
|
|
139
|
+
export interface ManifestBuilder {
|
|
140
|
+
readonly entities: EntityJSON[];
|
|
141
|
+
readonly database: DatabaseJSON | undefined;
|
|
142
|
+
readonly auth: AuthJSON | undefined;
|
|
143
|
+
addEntity(params: AddEntityParams): ToolResult;
|
|
144
|
+
updateEntity(params: UpdateEntityParams): ToolResult;
|
|
145
|
+
removeEntity(params: RemoveEntityParams): ToolResult;
|
|
146
|
+
setDatabase(params: SetDatabaseParams): ToolResult;
|
|
147
|
+
setAuth(params: SetAuthParams): ToolResult;
|
|
148
|
+
toManifest(): ManifestJSON;
|
|
149
|
+
validate(): ValidationResult;
|
|
150
|
+
generate(): Promise<{
|
|
151
|
+
files: GeneratedFile[];
|
|
152
|
+
success: boolean;
|
|
153
|
+
errors?: string[];
|
|
154
|
+
}>;
|
|
155
|
+
reset(): void;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* OpenAI function calling format
|
|
159
|
+
*/
|
|
160
|
+
export interface OpenAITool {
|
|
161
|
+
type: 'function';
|
|
162
|
+
function: {
|
|
163
|
+
name: string;
|
|
164
|
+
description: string;
|
|
165
|
+
parameters: {
|
|
166
|
+
type: 'object';
|
|
167
|
+
properties: Record<string, unknown>;
|
|
168
|
+
required?: string[];
|
|
169
|
+
};
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Anthropic tool use format
|
|
174
|
+
*/
|
|
175
|
+
export interface AnthropicTool {
|
|
176
|
+
name: string;
|
|
177
|
+
description: string;
|
|
178
|
+
input_schema: {
|
|
179
|
+
type: 'object';
|
|
180
|
+
properties: Record<string, unknown>;
|
|
181
|
+
required?: string[];
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Vercel AI SDK tool format
|
|
186
|
+
*/
|
|
187
|
+
export interface VercelAITool {
|
|
188
|
+
description: string;
|
|
189
|
+
parameters: {
|
|
190
|
+
type: 'object';
|
|
191
|
+
properties: Record<string, unknown>;
|
|
192
|
+
required?: string[];
|
|
193
|
+
};
|
|
194
|
+
execute: (params: unknown) => Promise<unknown>;
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/ai/types.ts"],"names":[],"mappings":"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"}
|