@vedangiitb/qwintly-core 1.2.1 → 1.3.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/dist/ai/prompts/codegen.prompt.d.ts +9 -0
- package/dist/ai/prompts/codegen.prompt.d.ts.map +1 -0
- package/dist/ai/prompts/codegen.prompt.js +53 -0
- package/dist/ai/prompts/codegen.prompt.js.map +1 -0
- package/dist/ai/prompts/examples/codegen.examples.d.ts +2 -0
- package/dist/ai/prompts/examples/codegen.examples.d.ts.map +1 -0
- package/dist/ai/prompts/examples/codegen.examples.js +81 -0
- package/dist/ai/prompts/examples/codegen.examples.js.map +1 -0
- package/dist/ai/prompts/examples/planner.examples.d.ts +2 -0
- package/dist/ai/prompts/examples/planner.examples.d.ts.map +1 -0
- package/dist/ai/prompts/examples/planner.examples.js +3 -0
- package/dist/ai/prompts/examples/planner.examples.js.map +1 -0
- package/dist/ai/prompts/helpers/promptParts.helper.d.ts +8 -0
- package/dist/ai/prompts/helpers/promptParts.helper.d.ts.map +1 -0
- package/dist/ai/prompts/helpers/promptParts.helper.js +37 -0
- package/dist/ai/prompts/helpers/promptParts.helper.js.map +1 -0
- package/dist/ai/prompts/planner.prompt.d.ts +10 -0
- package/dist/ai/prompts/planner.prompt.d.ts.map +1 -0
- package/dist/ai/prompts/planner.prompt.js +49 -0
- package/dist/ai/prompts/planner.prompt.js.map +1 -0
- package/dist/ai/prompts/prompts.d.ts +4 -0
- package/dist/ai/prompts/prompts.d.ts.map +1 -0
- package/dist/ai/prompts/prompts.js +4 -0
- package/dist/ai/prompts/prompts.js.map +1 -0
- package/dist/ai/prompts/validator.prompt.d.ts +15 -0
- package/dist/ai/prompts/validator.prompt.d.ts.map +1 -0
- package/dist/ai/prompts/validator.prompt.js +55 -0
- package/dist/ai/prompts/validator.prompt.js.map +1 -0
- package/dist/ai/tools/helpers/elementid.helpers.d.ts +4 -0
- package/dist/ai/tools/helpers/elementid.helpers.d.ts.map +1 -0
- package/dist/ai/tools/helpers/elementid.helpers.js +19 -0
- package/dist/ai/tools/helpers/elementid.helpers.js.map +1 -0
- package/dist/ai/tools/helpers/getImage.helper.d.ts +2 -0
- package/dist/ai/tools/helpers/getImage.helper.d.ts.map +1 -0
- package/dist/ai/tools/helpers/getImage.helper.js +2 -0
- package/dist/ai/tools/helpers/getImage.helper.js.map +1 -0
- package/dist/ai/tools/helpers/pageConfigJson.helpers.d.ts +15 -0
- package/dist/ai/tools/helpers/pageConfigJson.helpers.d.ts.map +1 -0
- package/dist/ai/tools/helpers/pageConfigJson.helpers.js +172 -0
- package/dist/ai/tools/helpers/pageConfigJson.helpers.js.map +1 -0
- package/dist/ai/tools/implementations/createNewRoute.impl.d.ts +5 -0
- package/dist/ai/tools/implementations/createNewRoute.impl.d.ts.map +1 -0
- package/dist/ai/tools/implementations/createNewRoute.impl.js +101 -0
- package/dist/ai/tools/implementations/createNewRoute.impl.js.map +1 -0
- package/dist/ai/tools/implementations/deleteElement.impl.d.ts +18 -0
- package/dist/ai/tools/implementations/deleteElement.impl.d.ts.map +1 -0
- package/dist/ai/tools/implementations/deleteElement.impl.js +60 -0
- package/dist/ai/tools/implementations/deleteElement.impl.js.map +1 -0
- package/dist/ai/tools/implementations/factories.d.ts +72 -0
- package/dist/ai/tools/implementations/factories.d.ts.map +1 -1
- package/dist/ai/tools/implementations/factories.js +20 -0
- package/dist/ai/tools/implementations/factories.js.map +1 -1
- package/dist/ai/tools/implementations/insertElement.impl.d.ts +14 -0
- package/dist/ai/tools/implementations/insertElement.impl.d.ts.map +1 -0
- package/dist/ai/tools/implementations/insertElement.impl.js +73 -0
- package/dist/ai/tools/implementations/insertElement.impl.js.map +1 -0
- package/dist/ai/tools/implementations/updateClassName.impl.d.ts +13 -0
- package/dist/ai/tools/implementations/updateClassName.impl.d.ts.map +1 -0
- package/dist/ai/tools/implementations/updateClassName.impl.js +61 -0
- package/dist/ai/tools/implementations/updateClassName.impl.js.map +1 -0
- package/dist/ai/tools/implementations/updateProps.impl.d.ts +33 -0
- package/dist/ai/tools/implementations/updateProps.impl.d.ts.map +1 -0
- package/dist/ai/tools/implementations/updateProps.impl.js +90 -0
- package/dist/ai/tools/implementations/updateProps.impl.js.map +1 -0
- package/dist/ai/tools/schemas/createNewRoute.schema.d.ts +20 -0
- package/dist/ai/tools/schemas/createNewRoute.schema.d.ts.map +1 -0
- package/dist/ai/tools/schemas/createNewRoute.schema.js +20 -0
- package/dist/ai/tools/schemas/createNewRoute.schema.js.map +1 -0
- package/dist/ai/tools/schemas/deleteElement.schema.d.ts +20 -0
- package/dist/ai/tools/schemas/deleteElement.schema.d.ts.map +1 -0
- package/dist/ai/tools/schemas/deleteElement.schema.js +20 -0
- package/dist/ai/tools/schemas/deleteElement.schema.js.map +1 -0
- package/dist/ai/tools/schemas/insertElement.schema.d.ts +23 -0
- package/dist/ai/tools/schemas/insertElement.schema.d.ts.map +1 -0
- package/dist/ai/tools/schemas/insertElement.schema.js +133 -0
- package/dist/ai/tools/schemas/insertElement.schema.js.map +1 -0
- package/dist/ai/tools/schemas/updateClassName.schema.d.ts +23 -0
- package/dist/ai/tools/schemas/updateClassName.schema.d.ts.map +1 -0
- package/dist/ai/tools/schemas/updateClassName.schema.js +21 -0
- package/dist/ai/tools/schemas/updateClassName.schema.js.map +1 -0
- package/dist/ai/tools/schemas/updateProps.schema.d.ts +91 -0
- package/dist/ai/tools/schemas/updateProps.schema.d.ts.map +1 -0
- package/dist/ai/tools/schemas/updateProps.schema.js +87 -0
- package/dist/ai/tools/schemas/updateProps.schema.js.map +1 -0
- package/dist/ai/tools/toolsets/codegenTools.d.ts.map +1 -1
- package/dist/ai/tools/toolsets/codegenTools.js +12 -4
- package/dist/ai/tools/toolsets/codegenTools.js.map +1 -1
- package/dist/core.d.ts +4 -0
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js +7 -0
- package/dist/core.js.map +1 -1
- package/dist/image/unsplash.service.d.ts +22 -0
- package/dist/image/unsplash.service.d.ts.map +1 -0
- package/dist/image/unsplash.service.js +120 -0
- package/dist/image/unsplash.service.js.map +1 -0
- package/dist/indexer/codegenIndex.d.ts.map +1 -1
- package/dist/indexer/codegenIndex.js +2 -5
- package/dist/indexer/codegenIndex.js.map +1 -1
- package/dist/indexer/data/configs.constants.d.ts +32 -56
- package/dist/indexer/data/configs.constants.d.ts.map +1 -1
- package/dist/indexer/data/configs.constants.js +61 -88
- package/dist/indexer/data/configs.constants.js.map +1 -1
- package/dist/indexer/plannerIndex.d.ts.map +1 -1
- package/dist/indexer/plannerIndex.js +2 -7
- package/dist/indexer/plannerIndex.js.map +1 -1
- package/dist/indexer/validatorIndex.d.ts.map +1 -1
- package/dist/indexer/validatorIndex.js +1 -0
- package/dist/indexer/validatorIndex.js.map +1 -1
- package/dist/tests/createNewRoute.impl.test.d.ts +2 -0
- package/dist/tests/createNewRoute.impl.test.d.ts.map +1 -0
- package/dist/tests/createNewRoute.impl.test.js +72 -0
- package/dist/tests/createNewRoute.impl.test.js.map +1 -0
- package/dist/tests/deleteElement.impl.test.d.ts +2 -0
- package/dist/tests/deleteElement.impl.test.d.ts.map +1 -0
- package/dist/tests/deleteElement.impl.test.js +88 -0
- package/dist/tests/deleteElement.impl.test.js.map +1 -0
- package/dist/tests/insertUpdate.impl.test.d.ts +2 -0
- package/dist/tests/insertUpdate.impl.test.d.ts.map +1 -0
- package/dist/tests/insertUpdate.impl.test.js +68 -0
- package/dist/tests/insertUpdate.impl.test.js.map +1 -0
- package/dist/types/elements.d.ts +43 -0
- package/dist/types/elements.d.ts.map +1 -0
- package/dist/types/elements.js +13 -0
- package/dist/types/elements.js.map +1 -0
- package/dist/types/image.d.ts +19 -0
- package/dist/types/image.d.ts.map +1 -0
- package/dist/types/image.js +3 -0
- package/dist/types/image.js.map +1 -0
- package/dist/types/index/configs.types.d.ts +2 -3
- package/dist/types/index/configs.types.d.ts.map +1 -1
- package/dist/types/index/configs.types.js.map +1 -1
- package/dist/types/index/index.types.d.ts +4 -6
- package/dist/types/index/index.types.d.ts.map +1 -1
- package/dist/types/index/index.types.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { resolveUnsplashImagesDeep } from "../../../image/unsplash.service.js";
|
|
2
|
+
import { ensureElementIds, extractAllIdsDeep, findElementById, getPageConfigJsonPath, parsePageConfigJson, stringifyPageConfigJson, writeFileAtomic, } from "../helpers/pageConfigJson.helpers.js";
|
|
3
|
+
export const createInsertElementImpl = (deps) => {
|
|
4
|
+
const { workspaceRoot, fs } = deps;
|
|
5
|
+
return async (route, parentId, element) => {
|
|
6
|
+
const parent_id = String(parentId ?? "").trim();
|
|
7
|
+
if (!parent_id)
|
|
8
|
+
return { success: false, error: "invalid parent_id" };
|
|
9
|
+
let configPath;
|
|
10
|
+
try {
|
|
11
|
+
configPath = getPageConfigJsonPath(workspaceRoot, route);
|
|
12
|
+
}
|
|
13
|
+
catch (err) {
|
|
14
|
+
return {
|
|
15
|
+
success: false,
|
|
16
|
+
error: err instanceof Error ? err.message : String(err),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
let before = "";
|
|
20
|
+
try {
|
|
21
|
+
before = await fs.readFile(configPath);
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
const code = err?.code;
|
|
25
|
+
if (code === "ENOENT")
|
|
26
|
+
return { success: false, error: "not found" };
|
|
27
|
+
return {
|
|
28
|
+
success: false,
|
|
29
|
+
error: err instanceof Error ? err.message : String(err),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
let parsed;
|
|
33
|
+
try {
|
|
34
|
+
parsed = parsePageConfigJson(before);
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
return {
|
|
38
|
+
success: false,
|
|
39
|
+
error: err instanceof Error ? err.message : String(err),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
const elements = parsed.elements ?? [];
|
|
43
|
+
const existingIds = extractAllIdsDeep(elements);
|
|
44
|
+
ensureElementIds(elements, existingIds);
|
|
45
|
+
// Clone + inject ids for the inserted element subtree.
|
|
46
|
+
const toInsert = JSON.parse(JSON.stringify(element ?? null));
|
|
47
|
+
await resolveUnsplashImagesDeep(toInsert);
|
|
48
|
+
ensureElementIds([toInsert], existingIds);
|
|
49
|
+
const parent = findElementById(elements, parent_id);
|
|
50
|
+
if (!parent)
|
|
51
|
+
return { success: false, error: "parent not found" };
|
|
52
|
+
const anyParent = parent;
|
|
53
|
+
if (!Array.isArray(anyParent.children))
|
|
54
|
+
anyParent.children = [];
|
|
55
|
+
anyParent.children.push(toInsert);
|
|
56
|
+
const after = stringifyPageConfigJson({ elements });
|
|
57
|
+
try {
|
|
58
|
+
await writeFileAtomic(configPath, after);
|
|
59
|
+
return {
|
|
60
|
+
success: true,
|
|
61
|
+
changed: true,
|
|
62
|
+
inserted_id: toInsert.id,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
return {
|
|
67
|
+
success: false,
|
|
68
|
+
error: err instanceof Error ? err.message : String(err),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
};
|
|
73
|
+
//# sourceMappingURL=insertElement.impl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insertElement.impl.js","sourceRoot":"","sources":["../../../../src/ai/tools/implementations/insertElement.impl.ts"],"names":[],"mappings":"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","sourcesContent":["import { resolveUnsplashImagesDeep } from \"../../../image/unsplash.service.js\";\nimport type { BuilderElement } from \"../../../types/elements.js\";\nimport {\n ensureElementIds,\n extractAllIdsDeep,\n findElementById,\n getPageConfigJsonPath,\n parsePageConfigJson,\n stringifyPageConfigJson,\n writeFileAtomic,\n} from \"../helpers/pageConfigJson.helpers.js\";\nimport { type WorkspaceDeps } from \"./workspaceDeps.js\";\n\nexport const createInsertElementImpl = (deps: WorkspaceDeps) => {\n const { workspaceRoot, fs } = deps;\n\n return async (route: string, parentId: string, element: BuilderElement) => {\n const parent_id = String(parentId ?? \"\").trim();\n if (!parent_id) return { success: false, error: \"invalid parent_id\" };\n\n let configPath: string;\n try {\n configPath = getPageConfigJsonPath(workspaceRoot, route);\n } catch (err) {\n return {\n success: false,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n\n let before = \"\";\n try {\n before = await fs.readFile(configPath);\n } catch (err) {\n const code = (err as NodeJS.ErrnoException | null)?.code;\n if (code === \"ENOENT\") return { success: false, error: \"not found\" };\n return {\n success: false,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n\n let parsed: ReturnType<typeof parsePageConfigJson>;\n try {\n parsed = parsePageConfigJson(before);\n } catch (err) {\n return {\n success: false,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n\n const elements = parsed.elements ?? [];\n const existingIds = extractAllIdsDeep(elements);\n ensureElementIds(elements, existingIds);\n\n // Clone + inject ids for the inserted element subtree.\n const toInsert = JSON.parse(\n JSON.stringify(element ?? null),\n ) as BuilderElement;\n await resolveUnsplashImagesDeep(toInsert);\n ensureElementIds([toInsert], existingIds);\n\n const parent = findElementById(elements, parent_id);\n if (!parent) return { success: false, error: \"parent not found\" };\n\n const anyParent = parent as any;\n if (!Array.isArray(anyParent.children)) anyParent.children = [];\n (anyParent.children as BuilderElement[]).push(toInsert);\n\n const after = stringifyPageConfigJson({ elements });\n try {\n await writeFileAtomic(configPath, after);\n return {\n success: true,\n changed: true,\n inserted_id: (toInsert as any).id,\n };\n } catch (err) {\n return {\n success: false,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n };\n};\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type WorkspaceDeps } from "./workspaceDeps.js";
|
|
2
|
+
export declare const createUpdateClassNameImpl: (deps: WorkspaceDeps) => (route: string, elementId: string, className: string) => Promise<{
|
|
3
|
+
success: boolean;
|
|
4
|
+
error: string;
|
|
5
|
+
changed?: undefined;
|
|
6
|
+
updated_id?: undefined;
|
|
7
|
+
} | {
|
|
8
|
+
success: boolean;
|
|
9
|
+
changed: boolean;
|
|
10
|
+
updated_id: string;
|
|
11
|
+
error?: undefined;
|
|
12
|
+
}>;
|
|
13
|
+
//# sourceMappingURL=updateClassName.impl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updateClassName.impl.d.ts","sourceRoot":"","sources":["../../../../src/ai/tools/implementations/updateClassName.impl.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,eAAO,MAAM,yBAAyB,GAAI,MAAM,aAAa,MAG7C,OAAO,MAAM,EAAE,WAAW,MAAM,EAAE,WAAW,MAAM;;;;;;;;;;EAwDlE,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { ensureElementIds, extractAllIdsDeep, findElementById, getPageConfigJsonPath, parsePageConfigJson, stringifyPageConfigJson, writeFileAtomic, } from "../helpers/pageConfigJson.helpers.js";
|
|
2
|
+
export const createUpdateClassNameImpl = (deps) => {
|
|
3
|
+
const { workspaceRoot, fs } = deps;
|
|
4
|
+
return async (route, elementId, className) => {
|
|
5
|
+
const id = String(elementId ?? "").trim();
|
|
6
|
+
if (!id)
|
|
7
|
+
return { success: false, error: "invalid element_id" };
|
|
8
|
+
let configPath;
|
|
9
|
+
try {
|
|
10
|
+
configPath = getPageConfigJsonPath(workspaceRoot, route);
|
|
11
|
+
}
|
|
12
|
+
catch (err) {
|
|
13
|
+
return {
|
|
14
|
+
success: false,
|
|
15
|
+
error: err instanceof Error ? err.message : String(err),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
let before = "";
|
|
19
|
+
try {
|
|
20
|
+
before = await fs.readFile(configPath);
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
const code = err?.code;
|
|
24
|
+
if (code === "ENOENT")
|
|
25
|
+
return { success: false, error: "not found" };
|
|
26
|
+
return {
|
|
27
|
+
success: false,
|
|
28
|
+
error: err instanceof Error ? err.message : String(err),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
let parsed;
|
|
32
|
+
try {
|
|
33
|
+
parsed = parsePageConfigJson(before);
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
return {
|
|
37
|
+
success: false,
|
|
38
|
+
error: err instanceof Error ? err.message : String(err),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
const elements = parsed.elements ?? [];
|
|
42
|
+
const existingIds = extractAllIdsDeep(elements);
|
|
43
|
+
ensureElementIds(elements, existingIds);
|
|
44
|
+
const el = findElementById(elements, id);
|
|
45
|
+
if (!el)
|
|
46
|
+
return { success: false, error: "element not found" };
|
|
47
|
+
el.className = String(className ?? "");
|
|
48
|
+
const after = stringifyPageConfigJson({ elements });
|
|
49
|
+
try {
|
|
50
|
+
await writeFileAtomic(configPath, after);
|
|
51
|
+
return { success: true, changed: true, updated_id: id };
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
return {
|
|
55
|
+
success: false,
|
|
56
|
+
error: err instanceof Error ? err.message : String(err),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=updateClassName.impl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updateClassName.impl.js","sourceRoot":"","sources":["../../../../src/ai/tools/implementations/updateClassName.impl.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ensureElementIds,\n extractAllIdsDeep,\n findElementById,\n getPageConfigJsonPath,\n parsePageConfigJson,\n stringifyPageConfigJson,\n writeFileAtomic,\n} from \"../helpers/pageConfigJson.helpers.js\";\nimport { type WorkspaceDeps } from \"./workspaceDeps.js\";\n\nexport const createUpdateClassNameImpl = (deps: WorkspaceDeps) => {\n const { workspaceRoot, fs } = deps;\n\n return async (route: string, elementId: string, className: string) => {\n const id = String(elementId ?? \"\").trim();\n if (!id) return { success: false, error: \"invalid element_id\" };\n\n let configPath: string;\n try {\n configPath = getPageConfigJsonPath(workspaceRoot, route);\n } catch (err) {\n return {\n success: false,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n\n let before = \"\";\n try {\n before = await fs.readFile(configPath);\n } catch (err) {\n const code = (err as NodeJS.ErrnoException | null)?.code;\n if (code === \"ENOENT\") return { success: false, error: \"not found\" };\n return {\n success: false,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n\n let parsed: ReturnType<typeof parsePageConfigJson>;\n try {\n parsed = parsePageConfigJson(before);\n } catch (err) {\n return {\n success: false,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n\n const elements = parsed.elements ?? [];\n const existingIds = extractAllIdsDeep(elements);\n ensureElementIds(elements, existingIds);\n\n const el = findElementById(elements, id);\n if (!el) return { success: false, error: \"element not found\" };\n\n (el as any).className = String(className ?? \"\");\n\n const after = stringifyPageConfigJson({ elements });\n try {\n await writeFileAtomic(configPath, after);\n return { success: true, changed: true, updated_id: id };\n } catch (err) {\n return {\n success: false,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n };\n};\n"]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { OnClickAction } from "../../../types/elements.js";
|
|
2
|
+
import { type WorkspaceDeps } from "./workspaceDeps.js";
|
|
3
|
+
type UpdatePropsArgs = {
|
|
4
|
+
route: string;
|
|
5
|
+
element_id: string;
|
|
6
|
+
} & Partial<{
|
|
7
|
+
onClick: OnClickAction;
|
|
8
|
+
text: string;
|
|
9
|
+
href: string;
|
|
10
|
+
placeholder: string;
|
|
11
|
+
alt: string;
|
|
12
|
+
target: string;
|
|
13
|
+
rel: string;
|
|
14
|
+
value: string;
|
|
15
|
+
type: string;
|
|
16
|
+
name: string;
|
|
17
|
+
size: number;
|
|
18
|
+
color: string;
|
|
19
|
+
strokeWidth: number;
|
|
20
|
+
}>;
|
|
21
|
+
export declare const createUpdatePropsImpl: (deps: WorkspaceDeps) => (args: UpdatePropsArgs) => Promise<{
|
|
22
|
+
success: boolean;
|
|
23
|
+
error: string;
|
|
24
|
+
changed?: undefined;
|
|
25
|
+
updated_id?: undefined;
|
|
26
|
+
} | {
|
|
27
|
+
success: boolean;
|
|
28
|
+
changed: boolean;
|
|
29
|
+
updated_id: string;
|
|
30
|
+
error?: undefined;
|
|
31
|
+
}>;
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=updateProps.impl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updateProps.impl.d.ts","sourceRoot":"","sources":["../../../../src/ai/tools/implementations/updateProps.impl.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAkB,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAUhF,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,KAAK,eAAe,GAAG;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC;IACV,OAAO,EAAE,aAAa,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC,CAAC;AA2BH,eAAO,MAAM,qBAAqB,GAAI,MAAM,aAAa,MAGzC,MAAM,eAAe;;;;;;;;;;EA8DpC,CAAC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { resolveUnsplashImageForElement } from "../../../image/unsplash.service.js";
|
|
2
|
+
import { ensureElementIds, extractAllIdsDeep, findElementById, getPageConfigJsonPath, parsePageConfigJson, stringifyPageConfigJson, writeFileAtomic, } from "../helpers/pageConfigJson.helpers.js";
|
|
3
|
+
const applyPropsPatch = (el, patch) => {
|
|
4
|
+
const anyEl = el;
|
|
5
|
+
if (!anyEl.props || typeof anyEl.props !== "object")
|
|
6
|
+
anyEl.props = {};
|
|
7
|
+
const apply = (key, value) => {
|
|
8
|
+
if (value === undefined || value === null)
|
|
9
|
+
return;
|
|
10
|
+
anyEl.props[key] = value;
|
|
11
|
+
};
|
|
12
|
+
apply("onClick", patch.onClick);
|
|
13
|
+
apply("text", patch.text);
|
|
14
|
+
apply("href", patch.href);
|
|
15
|
+
apply("placeholder", patch.placeholder);
|
|
16
|
+
apply("alt", patch.alt);
|
|
17
|
+
apply("target", patch.target);
|
|
18
|
+
apply("rel", patch.rel);
|
|
19
|
+
apply("value", patch.value);
|
|
20
|
+
apply("type", patch.type);
|
|
21
|
+
apply("name", patch.name);
|
|
22
|
+
apply("size", patch.size);
|
|
23
|
+
apply("color", patch.color);
|
|
24
|
+
apply("strokeWidth", patch.strokeWidth);
|
|
25
|
+
};
|
|
26
|
+
export const createUpdatePropsImpl = (deps) => {
|
|
27
|
+
const { workspaceRoot, fs } = deps;
|
|
28
|
+
return async (args) => {
|
|
29
|
+
const id = String(args?.element_id ?? "").trim();
|
|
30
|
+
if (!id)
|
|
31
|
+
return { success: false, error: "invalid element_id" };
|
|
32
|
+
let configPath;
|
|
33
|
+
try {
|
|
34
|
+
configPath = getPageConfigJsonPath(workspaceRoot, args.route);
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
return {
|
|
38
|
+
success: false,
|
|
39
|
+
error: err instanceof Error ? err.message : String(err),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
let before = "";
|
|
43
|
+
try {
|
|
44
|
+
before = await fs.readFile(configPath);
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
const code = err?.code;
|
|
48
|
+
if (code === "ENOENT")
|
|
49
|
+
return { success: false, error: "not found" };
|
|
50
|
+
return {
|
|
51
|
+
success: false,
|
|
52
|
+
error: err instanceof Error ? err.message : String(err),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
let parsed;
|
|
56
|
+
try {
|
|
57
|
+
parsed = parsePageConfigJson(before);
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
return {
|
|
61
|
+
success: false,
|
|
62
|
+
error: err instanceof Error ? err.message : String(err),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
const elements = parsed.elements ?? [];
|
|
66
|
+
const existingIds = extractAllIdsDeep(elements);
|
|
67
|
+
ensureElementIds(elements, existingIds);
|
|
68
|
+
const el = findElementById(elements, id);
|
|
69
|
+
if (!el)
|
|
70
|
+
return { success: false, error: "element not found" };
|
|
71
|
+
applyPropsPatch(el, args);
|
|
72
|
+
if (el.type === "image") {
|
|
73
|
+
const anyEl = el;
|
|
74
|
+
const alt = String(args.alt ?? anyEl?.props?.alt ?? "").trim();
|
|
75
|
+
await resolveUnsplashImageForElement(el, alt);
|
|
76
|
+
}
|
|
77
|
+
const after = stringifyPageConfigJson({ elements });
|
|
78
|
+
try {
|
|
79
|
+
await writeFileAtomic(configPath, after);
|
|
80
|
+
return { success: true, changed: true, updated_id: id };
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
return {
|
|
84
|
+
success: false,
|
|
85
|
+
error: err instanceof Error ? err.message : String(err),
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
};
|
|
90
|
+
//# sourceMappingURL=updateProps.impl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updateProps.impl.js","sourceRoot":"","sources":["../../../../src/ai/tools/implementations/updateProps.impl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,oCAAoC,CAAC;AAEpF,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,qBAAqB,EACrB,mBAAmB,EACnB,uBAAuB,EACvB,eAAe,GAChB,MAAM,sCAAsC,CAAC;AAsB9C,MAAM,eAAe,GAAG,CAAC,EAAkB,EAAE,KAAsB,EAAE,EAAE;IACrE,MAAM,KAAK,GAAG,EAAS,CAAC;IACxB,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;QAAE,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC;IAEtE,MAAM,KAAK,GAAG,CAAC,GAAW,EAAE,KAAc,EAAE,EAAE;QAC5C,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO;QAClD,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC3B,CAAC,CAAC;IAEF,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAChC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;IACxC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IACxB,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC9B,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IACxB,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5B,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAE1B,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5B,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;AAC1C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,IAAmB,EAAE,EAAE;IAC3D,MAAM,EAAE,aAAa,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC;IAEnC,OAAO,KAAK,EAAE,IAAqB,EAAE,EAAE;QACrC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACjD,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC;QAEhE,IAAI,UAAkB,CAAC;QACvB,IAAI,CAAC;YACH,UAAU,GAAG,qBAAqB,CAAC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAChE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,GAAI,GAAoC,EAAE,IAAI,CAAC;YACzD,IAAI,IAAI,KAAK,QAAQ;gBAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;YACrE,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC;QACJ,CAAC;QAED,IAAI,MAA8C,CAAC;QACnD,IAAI,CAAC;YACH,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;QACvC,MAAM,WAAW,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAChD,gBAAgB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAExC,MAAM,EAAE,GAAG,eAAe,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;QAE/D,eAAe,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAE1B,IAAI,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,EAAS,CAAC;YACxB,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAC/D,MAAM,8BAA8B,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAChD,CAAC;QAED,MAAM,KAAK,GAAG,uBAAuB,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,eAAe,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;QAC1D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { resolveUnsplashImageForElement } from \"../../../image/unsplash.service.js\";\nimport type { BuilderElement, OnClickAction } from \"../../../types/elements.js\";\nimport {\n ensureElementIds,\n extractAllIdsDeep,\n findElementById,\n getPageConfigJsonPath,\n parsePageConfigJson,\n stringifyPageConfigJson,\n writeFileAtomic,\n} from \"../helpers/pageConfigJson.helpers.js\";\nimport { type WorkspaceDeps } from \"./workspaceDeps.js\";\n\ntype UpdatePropsArgs = {\n route: string;\n element_id: string;\n} & Partial<{\n onClick: OnClickAction;\n text: string;\n href: string;\n placeholder: string;\n alt: string;\n target: string;\n rel: string;\n value: string;\n type: string;\n name: string;\n size: number;\n color: string;\n strokeWidth: number;\n}>;\n\nconst applyPropsPatch = (el: BuilderElement, patch: UpdatePropsArgs) => {\n const anyEl = el as any;\n if (!anyEl.props || typeof anyEl.props !== \"object\") anyEl.props = {};\n\n const apply = (key: string, value: unknown) => {\n if (value === undefined || value === null) return;\n anyEl.props[key] = value;\n };\n\n apply(\"onClick\", patch.onClick);\n apply(\"text\", patch.text);\n apply(\"href\", patch.href);\n apply(\"placeholder\", patch.placeholder);\n apply(\"alt\", patch.alt);\n apply(\"target\", patch.target);\n apply(\"rel\", patch.rel);\n apply(\"value\", patch.value);\n apply(\"type\", patch.type);\n\n apply(\"name\", patch.name);\n apply(\"size\", patch.size);\n apply(\"color\", patch.color);\n apply(\"strokeWidth\", patch.strokeWidth);\n};\n\nexport const createUpdatePropsImpl = (deps: WorkspaceDeps) => {\n const { workspaceRoot, fs } = deps;\n\n return async (args: UpdatePropsArgs) => {\n const id = String(args?.element_id ?? \"\").trim();\n if (!id) return { success: false, error: \"invalid element_id\" };\n\n let configPath: string;\n try {\n configPath = getPageConfigJsonPath(workspaceRoot, args.route);\n } catch (err) {\n return {\n success: false,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n\n let before = \"\";\n try {\n before = await fs.readFile(configPath);\n } catch (err) {\n const code = (err as NodeJS.ErrnoException | null)?.code;\n if (code === \"ENOENT\") return { success: false, error: \"not found\" };\n return {\n success: false,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n\n let parsed: ReturnType<typeof parsePageConfigJson>;\n try {\n parsed = parsePageConfigJson(before);\n } catch (err) {\n return {\n success: false,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n\n const elements = parsed.elements ?? [];\n const existingIds = extractAllIdsDeep(elements);\n ensureElementIds(elements, existingIds);\n\n const el = findElementById(elements, id);\n if (!el) return { success: false, error: \"element not found\" };\n\n applyPropsPatch(el, args);\n\n if (el.type === \"image\") {\n const anyEl = el as any;\n const alt = String(args.alt ?? anyEl?.props?.alt ?? \"\").trim();\n await resolveUnsplashImageForElement(el, alt);\n }\n\n const after = stringifyPageConfigJson({ elements });\n try {\n await writeFileAtomic(configPath, after);\n return { success: true, changed: true, updated_id: id };\n } catch (err) {\n return {\n success: false,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n };\n};\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Type } from "@google/genai";
|
|
2
|
+
export declare const CreateNewRouteSchema: {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
parameters: {
|
|
6
|
+
type: Type;
|
|
7
|
+
properties: {
|
|
8
|
+
parent_route: {
|
|
9
|
+
type: Type;
|
|
10
|
+
description: string;
|
|
11
|
+
};
|
|
12
|
+
route_name: {
|
|
13
|
+
type: Type;
|
|
14
|
+
description: string;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
required: string[];
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=createNewRoute.schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createNewRoute.schema.d.ts","sourceRoot":"","sources":["../../../../src/ai/tools/schemas/createNewRoute.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;CAmBhC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Type } from "@google/genai";
|
|
2
|
+
export const CreateNewRouteSchema = {
|
|
3
|
+
name: "create_new_route",
|
|
4
|
+
description: "Creates a new Next.js App Router route folder under /app/<parent_route>/<route_name> with a page.tsx and pageConfig.json.",
|
|
5
|
+
parameters: {
|
|
6
|
+
type: Type.OBJECT,
|
|
7
|
+
properties: {
|
|
8
|
+
parent_route: {
|
|
9
|
+
type: Type.STRING,
|
|
10
|
+
description: 'The parent route ("/" for app root). Example: "/" or "/dashboard".',
|
|
11
|
+
},
|
|
12
|
+
route_name: {
|
|
13
|
+
type: Type.STRING,
|
|
14
|
+
description: 'The new route segment to create under the parent route. Example: "about" or "settings".',
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
required: ["parent_route", "route_name"],
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=createNewRoute.schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createNewRoute.schema.js","sourceRoot":"","sources":["../../../../src/ai/tools/schemas/createNewRoute.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,IAAI,EAAE,kBAAkB;IACxB,WAAW,EACT,2HAA2H;IAC7H,UAAU,EAAE;QACV,IAAI,EAAE,IAAI,CAAC,MAAM;QACjB,UAAU,EAAE;YACV,YAAY,EAAE;gBACZ,IAAI,EAAE,IAAI,CAAC,MAAM;gBACjB,WAAW,EAAE,oEAAoE;aAClF;YACD,UAAU,EAAE;gBACV,IAAI,EAAE,IAAI,CAAC,MAAM;gBACjB,WAAW,EACT,yFAAyF;aAC5F;SACF;QACD,QAAQ,EAAE,CAAC,cAAc,EAAE,YAAY,CAAC;KACzC;CACF,CAAC","sourcesContent":["import { Type } from \"@google/genai\";\n\nexport const CreateNewRouteSchema = {\n name: \"create_new_route\",\n description:\n \"Creates a new Next.js App Router route folder under /app/<parent_route>/<route_name> with a page.tsx and pageConfig.json.\",\n parameters: {\n type: Type.OBJECT,\n properties: {\n parent_route: {\n type: Type.STRING,\n description: 'The parent route (\"/\" for app root). Example: \"/\" or \"/dashboard\".',\n },\n route_name: {\n type: Type.STRING,\n description:\n 'The new route segment to create under the parent route. Example: \"about\" or \"settings\".',\n },\n },\n required: [\"parent_route\", \"route_name\"],\n },\n};\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Type } from "@google/genai";
|
|
2
|
+
export declare const DeleteElementSchema: {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
parameters: {
|
|
6
|
+
type: Type;
|
|
7
|
+
properties: {
|
|
8
|
+
route: {
|
|
9
|
+
type: Type;
|
|
10
|
+
description: string;
|
|
11
|
+
};
|
|
12
|
+
element_id: {
|
|
13
|
+
type: Type;
|
|
14
|
+
description: string;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
required: string[];
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=deleteElement.schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deleteElement.schema.d.ts","sourceRoot":"","sources":["../../../../src/ai/tools/schemas/deleteElement.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;CAkB/B,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Type } from "@google/genai";
|
|
2
|
+
export const DeleteElementSchema = {
|
|
3
|
+
name: "delete_element",
|
|
4
|
+
description: "Deletes element code.",
|
|
5
|
+
parameters: {
|
|
6
|
+
type: Type.OBJECT,
|
|
7
|
+
properties: {
|
|
8
|
+
route: {
|
|
9
|
+
type: Type.STRING,
|
|
10
|
+
description: "The route to delete the element at. Example. '/' or '/about' etc.",
|
|
11
|
+
},
|
|
12
|
+
element_id: {
|
|
13
|
+
type: Type.STRING,
|
|
14
|
+
description: "The id of the element to be deleted.",
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
required: ["route", "element_id"],
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=deleteElement.schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deleteElement.schema.js","sourceRoot":"","sources":["../../../../src/ai/tools/schemas/deleteElement.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,IAAI,EAAE,gBAAgB;IACtB,WAAW,EAAE,uBAAuB;IACpC,UAAU,EAAE;QACV,IAAI,EAAE,IAAI,CAAC,MAAM;QACjB,UAAU,EAAE;YACV,KAAK,EAAE;gBACL,IAAI,EAAE,IAAI,CAAC,MAAM;gBACjB,WAAW,EACT,mEAAmE;aACtE;YACD,UAAU,EAAE;gBACV,IAAI,EAAE,IAAI,CAAC,MAAM;gBACjB,WAAW,EAAE,sCAAsC;aACpD;SACF;QACD,QAAQ,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC;KAClC;CACF,CAAC","sourcesContent":["import { Type } from \"@google/genai\";\r\n\r\nexport const DeleteElementSchema = {\r\n name: \"delete_element\",\r\n description: \"Deletes element code.\",\r\n parameters: {\r\n type: Type.OBJECT,\r\n properties: {\r\n route: {\r\n type: Type.STRING,\r\n description:\r\n \"The route to delete the element at. Example. '/' or '/about' etc.\",\r\n },\r\n element_id: {\r\n type: Type.STRING,\r\n description: \"The id of the element to be deleted.\",\r\n },\r\n },\r\n required: [\"route\", \"element_id\"],\r\n },\r\n};\r\n"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Type } from "@google/genai";
|
|
2
|
+
export declare const ELEMENT_TYPES: readonly ["fragment", "div", "text", "image", "button", "input", "textarea", "link", "icon"];
|
|
3
|
+
export declare const BuilderElementSchema: any;
|
|
4
|
+
export declare const InsertElementSchema: {
|
|
5
|
+
name: string;
|
|
6
|
+
description: string;
|
|
7
|
+
parameters: {
|
|
8
|
+
type: Type;
|
|
9
|
+
properties: {
|
|
10
|
+
route: {
|
|
11
|
+
type: Type;
|
|
12
|
+
description: string;
|
|
13
|
+
};
|
|
14
|
+
parent_id: {
|
|
15
|
+
type: Type;
|
|
16
|
+
description: string;
|
|
17
|
+
};
|
|
18
|
+
element: any;
|
|
19
|
+
};
|
|
20
|
+
required: string[];
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=insertElement.schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insertElement.schema.d.ts","sourceRoot":"","sources":["../../../../src/ai/tools/schemas/insertElement.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,eAAO,MAAM,aAAa,8FAUhB,CAAC;AA6BX,eAAO,MAAM,oBAAoB,EAAE,GAkFlC,CAAC;AAIF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;CAuB/B,CAAC"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { Type } from "@google/genai";
|
|
2
|
+
export const ELEMENT_TYPES = [
|
|
3
|
+
"fragment",
|
|
4
|
+
"div",
|
|
5
|
+
"text",
|
|
6
|
+
"image",
|
|
7
|
+
"button",
|
|
8
|
+
"input",
|
|
9
|
+
"textarea",
|
|
10
|
+
"link",
|
|
11
|
+
"icon",
|
|
12
|
+
];
|
|
13
|
+
const OnClickActionSchema = {
|
|
14
|
+
type: Type.OBJECT,
|
|
15
|
+
properties: {
|
|
16
|
+
kind: {
|
|
17
|
+
type: Type.STRING,
|
|
18
|
+
enum: ["route", "back", "reload", "external"],
|
|
19
|
+
description: "What happens when the element is clicked. 'route' navigates within the app, 'external' opens a URL, 'back' goes back, 'reload' refreshes.",
|
|
20
|
+
},
|
|
21
|
+
href: {
|
|
22
|
+
type: Type.STRING,
|
|
23
|
+
description: "URL to navigate to (used for kind='route' and kind='external').",
|
|
24
|
+
},
|
|
25
|
+
replace: {
|
|
26
|
+
type: Type.BOOLEAN,
|
|
27
|
+
description: "For kind='route': replace history instead of pushing.",
|
|
28
|
+
},
|
|
29
|
+
newTab: {
|
|
30
|
+
type: Type.BOOLEAN,
|
|
31
|
+
description: "For kind='external': open link in a new tab.",
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
required: ["kind"],
|
|
35
|
+
};
|
|
36
|
+
// Self-referential schema (children.items -> BuilderElementSchema)
|
|
37
|
+
export const BuilderElementSchema = {
|
|
38
|
+
type: Type.OBJECT,
|
|
39
|
+
properties: {
|
|
40
|
+
type: {
|
|
41
|
+
type: Type.STRING,
|
|
42
|
+
enum: ELEMENT_TYPES,
|
|
43
|
+
description: "Element type to render. 'text' renders a <p>, 'image' renders an <img>, 'link' renders an <a>, 'icon' renders a Lucide icon, 'fragment' renders children only.",
|
|
44
|
+
},
|
|
45
|
+
className: {
|
|
46
|
+
type: Type.STRING,
|
|
47
|
+
description: "Tailwind CSS className applied to the rendered element (Tailwind only).",
|
|
48
|
+
},
|
|
49
|
+
visible: {
|
|
50
|
+
type: Type.BOOLEAN,
|
|
51
|
+
description: "Whether the element should be shown.",
|
|
52
|
+
},
|
|
53
|
+
props: {
|
|
54
|
+
type: Type.OBJECT,
|
|
55
|
+
properties: {
|
|
56
|
+
onClick: OnClickActionSchema,
|
|
57
|
+
text: {
|
|
58
|
+
type: Type.STRING,
|
|
59
|
+
description: "Text content used by 'text' (<p>), 'button' (label), and as a fallback for 'link' when it has no children.",
|
|
60
|
+
},
|
|
61
|
+
href: {
|
|
62
|
+
type: Type.STRING,
|
|
63
|
+
description: "For 'link': the href attribute (defaults to '#').",
|
|
64
|
+
},
|
|
65
|
+
placeholder: {
|
|
66
|
+
type: Type.STRING,
|
|
67
|
+
description: "For 'input' and 'textarea': placeholder shown when empty.",
|
|
68
|
+
},
|
|
69
|
+
alt: {
|
|
70
|
+
type: Type.STRING,
|
|
71
|
+
description: "For 'image': alt text for accessibility AND the query used to fetch a suitable Unsplash image (src is auto-resolved from alt).",
|
|
72
|
+
},
|
|
73
|
+
target: {
|
|
74
|
+
type: Type.STRING,
|
|
75
|
+
description: "For 'link': target attribute (e.g. '_blank').",
|
|
76
|
+
},
|
|
77
|
+
rel: {
|
|
78
|
+
type: Type.STRING,
|
|
79
|
+
description: "For 'link': rel attribute (e.g. 'noreferrer').",
|
|
80
|
+
},
|
|
81
|
+
value: {
|
|
82
|
+
type: Type.STRING,
|
|
83
|
+
description: "For 'input' and 'textarea': default value (maps to defaultValue).",
|
|
84
|
+
},
|
|
85
|
+
type: {
|
|
86
|
+
type: Type.STRING,
|
|
87
|
+
description: "For 'input': input type (e.g. 'text', 'email', 'password'). Defaults to 'text'.",
|
|
88
|
+
},
|
|
89
|
+
// icon
|
|
90
|
+
name: {
|
|
91
|
+
type: Type.STRING,
|
|
92
|
+
description: "For 'icon': Lucide icon name (e.g. 'ArrowRight', 'Menu').",
|
|
93
|
+
},
|
|
94
|
+
size: { type: Type.NUMBER, description: "For 'icon': size in px." },
|
|
95
|
+
color: { type: Type.STRING, description: "For 'icon': stroke color." },
|
|
96
|
+
strokeWidth: {
|
|
97
|
+
type: Type.NUMBER,
|
|
98
|
+
description: "For 'icon': stroke width.",
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
children: {
|
|
103
|
+
type: Type.ARRAY,
|
|
104
|
+
description: "Nested children. Used by 'fragment' and 'div' directly, and by 'button'/'link' when present (otherwise they use props.text).",
|
|
105
|
+
items: {},
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
required: ["type"],
|
|
109
|
+
};
|
|
110
|
+
BuilderElementSchema.properties.children.items = BuilderElementSchema;
|
|
111
|
+
export const InsertElementSchema = {
|
|
112
|
+
name: "insert_element",
|
|
113
|
+
description: "Inserts element code. The element should be valid following the BuilderElement schema.",
|
|
114
|
+
parameters: {
|
|
115
|
+
type: Type.OBJECT,
|
|
116
|
+
properties: {
|
|
117
|
+
route: {
|
|
118
|
+
type: Type.STRING,
|
|
119
|
+
description: "The route to insert the element at. Example. '/' or '/about' etc.",
|
|
120
|
+
},
|
|
121
|
+
parent_id: {
|
|
122
|
+
type: Type.STRING,
|
|
123
|
+
description: "The parent id to insert the element at.",
|
|
124
|
+
},
|
|
125
|
+
element: {
|
|
126
|
+
...BuilderElementSchema,
|
|
127
|
+
description: "The element to insert.",
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
required: ["route", "parent_id", "element"],
|
|
131
|
+
},
|
|
132
|
+
};
|
|
133
|
+
//# sourceMappingURL=insertElement.schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insertElement.schema.js","sourceRoot":"","sources":["../../../../src/ai/tools/schemas/insertElement.schema.ts"],"names":[],"mappings":"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","sourcesContent":["import { Type } from \"@google/genai\";\n\nexport const ELEMENT_TYPES = [\n \"fragment\",\n \"div\",\n \"text\",\n \"image\",\n \"button\",\n \"input\",\n \"textarea\",\n \"link\",\n \"icon\",\n] as const;\n\nconst OnClickActionSchema = {\n type: Type.OBJECT,\n properties: {\n kind: {\n type: Type.STRING,\n enum: [\"route\", \"back\", \"reload\", \"external\"],\n description:\n \"What happens when the element is clicked. 'route' navigates within the app, 'external' opens a URL, 'back' goes back, 'reload' refreshes.\",\n },\n href: {\n type: Type.STRING,\n description:\n \"URL to navigate to (used for kind='route' and kind='external').\",\n },\n replace: {\n type: Type.BOOLEAN,\n description: \"For kind='route': replace history instead of pushing.\",\n },\n newTab: {\n type: Type.BOOLEAN,\n description: \"For kind='external': open link in a new tab.\",\n },\n },\n required: [\"kind\"],\n};\n\n// Self-referential schema (children.items -> BuilderElementSchema)\nexport const BuilderElementSchema: any = {\n type: Type.OBJECT,\n properties: {\n type: {\n type: Type.STRING,\n enum: ELEMENT_TYPES,\n description:\n \"Element type to render. 'text' renders a <p>, 'image' renders an <img>, 'link' renders an <a>, 'icon' renders a Lucide icon, 'fragment' renders children only.\",\n },\n className: {\n type: Type.STRING,\n description:\n \"Tailwind CSS className applied to the rendered element (Tailwind only).\",\n },\n visible: {\n type: Type.BOOLEAN,\n description: \"Whether the element should be shown.\",\n },\n props: {\n type: Type.OBJECT,\n properties: {\n onClick: OnClickActionSchema,\n text: {\n type: Type.STRING,\n description:\n \"Text content used by 'text' (<p>), 'button' (label), and as a fallback for 'link' when it has no children.\",\n },\n href: {\n type: Type.STRING,\n description: \"For 'link': the href attribute (defaults to '#').\",\n },\n placeholder: {\n type: Type.STRING,\n description:\n \"For 'input' and 'textarea': placeholder shown when empty.\",\n },\n alt: {\n type: Type.STRING,\n description:\n \"For 'image': alt text for accessibility AND the query used to fetch a suitable Unsplash image (src is auto-resolved from alt).\",\n },\n target: {\n type: Type.STRING,\n description: \"For 'link': target attribute (e.g. '_blank').\",\n },\n rel: {\n type: Type.STRING,\n description: \"For 'link': rel attribute (e.g. 'noreferrer').\",\n },\n value: {\n type: Type.STRING,\n description:\n \"For 'input' and 'textarea': default value (maps to defaultValue).\",\n },\n type: {\n type: Type.STRING,\n description:\n \"For 'input': input type (e.g. 'text', 'email', 'password'). Defaults to 'text'.\",\n },\n\n // icon\n name: {\n type: Type.STRING,\n description:\n \"For 'icon': Lucide icon name (e.g. 'ArrowRight', 'Menu').\",\n },\n size: { type: Type.NUMBER, description: \"For 'icon': size in px.\" },\n color: { type: Type.STRING, description: \"For 'icon': stroke color.\" },\n strokeWidth: {\n type: Type.NUMBER,\n description: \"For 'icon': stroke width.\",\n },\n },\n },\n children: {\n type: Type.ARRAY,\n description:\n \"Nested children. Used by 'fragment' and 'div' directly, and by 'button'/'link' when present (otherwise they use props.text).\",\n items: {},\n },\n },\n required: [\"type\"],\n};\n\nBuilderElementSchema.properties.children.items = BuilderElementSchema;\n\nexport const InsertElementSchema = {\n name: \"insert_element\",\n description:\n \"Inserts element code. The element should be valid following the BuilderElement schema.\",\n parameters: {\n type: Type.OBJECT,\n properties: {\n route: {\n type: Type.STRING,\n description:\n \"The route to insert the element at. Example. '/' or '/about' etc.\",\n },\n parent_id: {\n type: Type.STRING,\n description: \"The parent id to insert the element at.\",\n },\n element: {\n ...BuilderElementSchema,\n description: \"The element to insert.\",\n },\n },\n required: [\"route\", \"parent_id\", \"element\"],\n },\n};\n"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Type } from "@google/genai";
|
|
2
|
+
export declare const UpdateClassNameSchema: {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
parameters: {
|
|
6
|
+
type: Type;
|
|
7
|
+
properties: {
|
|
8
|
+
route: {
|
|
9
|
+
type: Type;
|
|
10
|
+
description: string;
|
|
11
|
+
};
|
|
12
|
+
element_id: {
|
|
13
|
+
type: Type;
|
|
14
|
+
description: string;
|
|
15
|
+
};
|
|
16
|
+
className: {
|
|
17
|
+
type: Type;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
required: string[];
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=updateClassName.schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updateClassName.schema.d.ts","sourceRoot":"","sources":["../../../../src/ai/tools/schemas/updateClassName.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;CAoBjC,CAAC"}
|