synthos 0.10.0 → 0.11.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 +5 -5
- package/default-pages/elevenlabs_effects_studio/chat-history.json +1 -0
- package/default-pages/elevenlabs_effects_studio/page.html +1345 -1363
- package/default-pages/elevenlabs_effects_studio/page.json +13 -11
- package/default-pages/elevenlabs_voice_studio/chat-history.json +1 -0
- package/default-pages/elevenlabs_voice_studio/page.html +782 -801
- package/default-pages/elevenlabs_voice_studio/page.json +13 -11
- package/default-pages/json_tools/chat-history.json +1 -0
- package/default-pages/json_tools/page.html +70 -90
- package/default-pages/json_tools/page.json +12 -10
- package/default-pages/my_notes/chat-history.json +1 -0
- package/default-pages/my_notes/page.html +115 -131
- package/default-pages/my_notes/page.json +14 -12
- package/default-pages/neon_asteroids/chat-history.json +1 -0
- package/default-pages/neon_asteroids/page.html +1777 -1803
- package/default-pages/neon_asteroids/page.json +14 -12
- package/default-pages/oregon_trail/chat-history.json +1 -0
- package/default-pages/oregon_trail/page.html +290 -307
- package/default-pages/oregon_trail/page.json +14 -12
- package/default-pages/solar_explorer/chat-history.json +1 -0
- package/default-pages/solar_explorer/page.html +1929 -1951
- package/default-pages/solar_explorer/page.json +14 -12
- package/default-pages/solar_tutorial/chat-history.json +1 -0
- package/default-pages/solar_tutorial/page.html +464 -478
- package/default-pages/solar_tutorial/page.json +12 -10
- package/default-pages/us_map/chat-history.json +1 -0
- package/default-pages/us_map/page.html +170 -193
- package/default-pages/us_map/page.json +14 -12
- package/default-pages/us_map/page.light.png +0 -0
- package/default-pages/us_map_1850/chat-history.json +1 -0
- package/default-pages/us_map_1850/page.html +302 -326
- package/default-pages/us_map_1850/page.json +14 -12
- package/default-pages/western_cities_1850/chat-history.json +1 -0
- package/default-pages/western_cities_1850/page.html +503 -527
- package/default-pages/western_cities_1850/page.json +14 -12
- package/default-themes/aurora-dawn.v3.css +15 -14
- package/default-themes/aurora-dusk.v3.css +26 -26
- package/default-themes/cosmos-dawn.v3.css +15 -14
- package/default-themes/cosmos-dusk.v3.css +26 -26
- package/default-themes/elemental-dawn.v3.css +200 -0
- package/default-themes/nebula-dawn.v3.css +15 -14
- package/default-themes/nebula-dusk.v3.css +24 -24
- package/default-themes/solar-flare-dawn.v3.css +15 -14
- package/default-themes/solar-flare-dusk.v3.css +26 -26
- package/dist/builders/anthropic.d.ts +26 -2
- package/dist/builders/anthropic.d.ts.map +1 -1
- package/dist/builders/anthropic.js +132 -31
- package/dist/builders/anthropic.js.map +1 -1
- package/dist/builders/claudecode.d.ts +13 -0
- package/dist/builders/claudecode.d.ts.map +1 -0
- package/dist/builders/claudecode.js +253 -0
- package/dist/builders/claudecode.js.map +1 -0
- package/dist/builders/index.d.ts +2 -1
- package/dist/builders/index.d.ts.map +1 -1
- package/dist/builders/index.js +8 -1
- package/dist/builders/index.js.map +1 -1
- package/dist/builders/openai.js +2 -1
- package/dist/builders/openai.js.map +1 -1
- package/dist/builders/types.d.ts +31 -7
- package/dist/builders/types.d.ts.map +1 -1
- package/dist/builders/types.js +60 -28
- package/dist/builders/types.js.map +1 -1
- package/dist/connectors/types.d.ts +8 -0
- package/dist/connectors/types.d.ts.map +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +13 -6
- package/dist/init.js.map +1 -1
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +161 -14
- package/dist/migrations.js.map +1 -1
- package/dist/models/anthropic.d.ts +1 -0
- package/dist/models/anthropic.d.ts.map +1 -1
- package/dist/models/anthropic.js +129 -29
- package/dist/models/anthropic.js.map +1 -1
- package/dist/models/chainOfThought.d.ts.map +1 -1
- package/dist/models/chainOfThought.js +32 -19
- package/dist/models/chainOfThought.js.map +1 -1
- package/dist/models/index.d.ts +2 -2
- package/dist/models/index.d.ts.map +1 -1
- package/dist/models/index.js +2 -1
- package/dist/models/index.js.map +1 -1
- package/dist/models/providers.d.ts +1 -0
- package/dist/models/providers.d.ts.map +1 -1
- package/dist/models/providers.js +12 -4
- package/dist/models/providers.js.map +1 -1
- package/dist/models/types.d.ts +15 -1
- package/dist/models/types.d.ts.map +1 -1
- package/dist/models/types.js.map +1 -1
- package/dist/pages.d.ts +57 -8
- package/dist/pages.d.ts.map +1 -1
- package/dist/pages.js +258 -45
- package/dist/pages.js.map +1 -1
- package/dist/service/createCompletePrompt.d.ts.map +1 -1
- package/dist/service/createCompletePrompt.js +5 -0
- package/dist/service/createCompletePrompt.js.map +1 -1
- package/dist/service/mediaCache.d.ts +36 -0
- package/dist/service/mediaCache.d.ts.map +1 -0
- package/dist/service/mediaCache.js +182 -0
- package/dist/service/mediaCache.js.map +1 -0
- package/dist/service/pageValidator.d.ts +25 -0
- package/dist/service/pageValidator.d.ts.map +1 -0
- package/dist/service/pageValidator.js +315 -0
- package/dist/service/pageValidator.js.map +1 -0
- package/dist/service/server.d.ts.map +1 -1
- package/dist/service/server.js +4 -0
- package/dist/service/server.js.map +1 -1
- package/dist/service/sharedTableSchema.d.ts +73 -0
- package/dist/service/sharedTableSchema.d.ts.map +1 -0
- package/dist/service/sharedTableSchema.js +206 -0
- package/dist/service/sharedTableSchema.js.map +1 -0
- package/dist/service/transformPage.d.ts +49 -11
- package/dist/service/transformPage.d.ts.map +1 -1
- package/dist/service/transformPage.js +354 -241
- package/dist/service/transformPage.js.map +1 -1
- package/dist/service/useApiRoutes.d.ts.map +1 -1
- package/dist/service/useApiRoutes.js +288 -34
- package/dist/service/useApiRoutes.js.map +1 -1
- package/dist/service/useConnectorRoutes.d.ts.map +1 -1
- package/dist/service/useConnectorRoutes.js +170 -32
- package/dist/service/useConnectorRoutes.js.map +1 -1
- package/dist/service/useDataRoutes.d.ts.map +1 -1
- package/dist/service/useDataRoutes.js +59 -2
- package/dist/service/useDataRoutes.js.map +1 -1
- package/dist/service/useExtractRoutes.d.ts +4 -0
- package/dist/service/useExtractRoutes.d.ts.map +1 -0
- package/dist/service/useExtractRoutes.js +304 -0
- package/dist/service/useExtractRoutes.js.map +1 -0
- package/dist/service/usePageRoutes.d.ts +17 -0
- package/dist/service/usePageRoutes.d.ts.map +1 -1
- package/dist/service/usePageRoutes.js +1385 -483
- package/dist/service/usePageRoutes.js.map +1 -1
- package/dist/service/useSharedDataRoutes.d.ts.map +1 -1
- package/dist/service/useSharedDataRoutes.js +54 -2
- package/dist/service/useSharedDataRoutes.js.map +1 -1
- package/dist/settings.d.ts +27 -0
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +40 -1
- package/dist/settings.js.map +1 -1
- package/dist/themes.d.ts +0 -5
- package/dist/themes.d.ts.map +1 -1
- package/dist/themes.js +3 -95
- package/dist/themes.js.map +1 -1
- package/migration-rules/v2-to-v3.md +277 -119
- package/package.json +5 -1
- package/{default-pages/application → required-pages/_shell}/page.html +56 -42
- package/required-pages/_shell/page.json +14 -0
- package/required-pages/_starters/page.html +534 -0
- package/required-pages/_starters/page.json +12 -0
- package/required-pages/builder/page.html +353 -43
- package/required-pages/builder/page.json +12 -10
- package/required-pages/pages/page.html +697 -924
- package/required-pages/pages/page.json +12 -10
- package/required-pages/settings/page.html +1879 -1753
- package/required-pages/settings/page.json +12 -10
- package/required-pages/synthos_apis/page.html +834 -845
- package/required-pages/synthos_apis/page.json +12 -10
- package/required-pages/synthos_scripts/page.html +74 -88
- package/required-pages/synthos_scripts/page.json +12 -10
- package/scripts/append-instructions.py +90 -0
- package/scripts/audit-instructions.py +76 -0
- package/scripts/cleanup-shell-markup.mjs +112 -0
- package/service-connectors/buffer/connector.json +46 -0
- package/service-connectors/canva/connector.json +67 -0
- package/service-connectors/elevenlabs/connector.json +1 -1
- package/src/builders/anthropic.ts +155 -30
- package/src/builders/claudecode.ts +310 -0
- package/src/builders/index.ts +7 -1
- package/src/builders/openai.ts +2 -1
- package/src/builders/types.ts +93 -32
- package/src/connectors/types.ts +8 -0
- package/src/init.ts +13 -7
- package/src/migrations.ts +187 -16
- package/src/models/anthropic.ts +140 -30
- package/src/models/chainOfThought.ts +33 -18
- package/src/models/index.ts +2 -2
- package/src/models/providers.ts +12 -3
- package/src/models/types.ts +21 -1
- package/src/pages.ts +271 -35
- package/src/service/createCompletePrompt.ts +6 -0
- package/src/service/mediaCache.ts +206 -0
- package/src/service/pageValidator.ts +337 -0
- package/src/service/server.ts +4 -0
- package/src/service/sharedTableSchema.ts +236 -0
- package/src/service/transformPage.ts +370 -260
- package/src/service/useApiRoutes.ts +282 -32
- package/src/service/useConnectorRoutes.ts +189 -34
- package/src/service/useDataRoutes.ts +198 -116
- package/src/service/useExtractRoutes.ts +331 -0
- package/src/service/usePageRoutes.ts +1411 -394
- package/src/service/useSharedDataRoutes.ts +184 -109
- package/src/settings.ts +65 -0
- package/src/themes.ts +78 -180
- package/starters/blank_starter/chat-history.json +1 -0
- package/starters/blank_starter/page.dark.png +0 -0
- package/starters/blank_starter/page.html +47 -0
- package/starters/blank_starter/page.json +13 -0
- package/starters/blank_starter/page.light.png +0 -0
- package/starters/calculator_starter/chat-history.json +1 -0
- package/starters/calculator_starter/page.dark.png +0 -0
- package/starters/calculator_starter/page.html +232 -0
- package/starters/calculator_starter/page.json +13 -0
- package/starters/calculator_starter/page.light.png +0 -0
- package/starters/calendar_starter/chat-history.json +1 -0
- package/starters/calendar_starter/page.dark.png +0 -0
- package/starters/calendar_starter/page.html +495 -0
- package/starters/calendar_starter/page.json +13 -0
- package/starters/calendar_starter/page.light.png +0 -0
- package/starters/chat_starter/chat-history.json +1 -0
- package/starters/chat_starter/page.dark.png +0 -0
- package/starters/chat_starter/page.html +351 -0
- package/starters/chat_starter/page.json +13 -0
- package/starters/chat_starter/page.light.png +0 -0
- package/starters/checklist_starter/chat-history.json +1 -0
- package/starters/checklist_starter/page.dark.png +0 -0
- package/starters/checklist_starter/page.html +437 -0
- package/starters/checklist_starter/page.json +13 -0
- package/starters/checklist_starter/page.light.png +0 -0
- package/starters/dashboard_starter/chat-history.json +1 -0
- package/starters/dashboard_starter/page.dark.png +0 -0
- package/starters/dashboard_starter/page.html +195 -0
- package/starters/dashboard_starter/page.json +13 -0
- package/starters/dashboard_starter/page.light.png +0 -0
- package/starters/form_starter/chat-history.json +1 -0
- package/starters/form_starter/page.dark.png +0 -0
- package/starters/form_starter/page.html +313 -0
- package/starters/form_starter/page.json +13 -0
- package/starters/form_starter/page.light.png +0 -0
- package/starters/gallery_starter/chat-history.json +1 -0
- package/starters/gallery_starter/page.dark.png +0 -0
- package/starters/gallery_starter/page.html +418 -0
- package/starters/gallery_starter/page.json +13 -0
- package/starters/gallery_starter/page.light.png +0 -0
- package/starters/generator_starter/chat-history.json +1 -0
- package/starters/generator_starter/page.dark.png +0 -0
- package/starters/generator_starter/page.html +261 -0
- package/starters/generator_starter/page.json +13 -0
- package/starters/generator_starter/page.light.png +0 -0
- package/starters/index.html +538 -0
- package/starters/kanban_starter/chat-history.json +1 -0
- package/starters/kanban_starter/page.dark.png +0 -0
- package/starters/kanban_starter/page.html +432 -0
- package/starters/kanban_starter/page.json +13 -0
- package/starters/kanban_starter/page.light.png +0 -0
- package/starters/presentation_builder/chat-history.json +1 -0
- package/starters/presentation_builder/page.dark.png +0 -0
- package/starters/presentation_builder/page.html +970 -0
- package/starters/presentation_builder/page.json +15 -0
- package/starters/presentation_builder/page.light.png +0 -0
- package/starters/presentation_builder/presentation_voice/voice_config.json +9 -0
- package/starters/pulse_starter/chat-history.json +1 -0
- package/starters/pulse_starter/page.dark.png +0 -0
- package/starters/pulse_starter/page.html +698 -0
- package/starters/pulse_starter/page.json +13 -0
- package/starters/pulse_starter/page.light.png +0 -0
- package/starters/quiz_starter/chat-history.json +1 -0
- package/starters/quiz_starter/page.dark.png +0 -0
- package/starters/quiz_starter/page.html +292 -0
- package/starters/quiz_starter/page.json +13 -0
- package/starters/quiz_starter/page.light.png +0 -0
- package/starters/reference_starter/chat-history.json +1 -0
- package/starters/reference_starter/page.dark.png +0 -0
- package/starters/reference_starter/page.html +250 -0
- package/starters/reference_starter/page.json +13 -0
- package/starters/reference_starter/page.light.png +0 -0
- package/starters/retro_game_starter/chat-history.json +1 -0
- package/starters/retro_game_starter/page.dark.png +0 -0
- package/{default-pages → starters}/retro_game_starter/page.html +1281 -1308
- package/starters/retro_game_starter/page.json +15 -0
- package/starters/retro_game_starter/page.light.png +0 -0
- package/starters/roster_starter/chat-history.json +1 -0
- package/starters/roster_starter/page.dark.png +0 -0
- package/starters/roster_starter/page.html +600 -0
- package/starters/roster_starter/page.json +13 -0
- package/starters/roster_starter/page.light.png +0 -0
- package/starters/server.js +182 -0
- package/starters/start.cmd +1 -0
- package/starters/timeline_starter/chat-history.json +1 -0
- package/starters/timeline_starter/page.dark.png +0 -0
- package/starters/timeline_starter/page.html +446 -0
- package/starters/timeline_starter/page.json +13 -0
- package/starters/timeline_starter/page.light.png +0 -0
- package/starters/tutorial_starter/chat-history.json +1 -0
- package/starters/tutorial_starter/page.dark.png +0 -0
- package/starters/tutorial_starter/page.html +283 -0
- package/starters/tutorial_starter/page.json +13 -0
- package/starters/tutorial_starter/page.light.png +0 -0
- package/static-files/agent.v3.js +122 -0
- package/static-files/connector.v3.js +48 -0
- package/static-files/extract.v3.js +188 -0
- package/static-files/helpers.v3.js +50 -6
- package/static-files/page-bridge.js +114 -0
- package/static-files/page.v3.js +1292 -1290
- package/static-files/script.v3.js +32 -0
- package/static-files/server.v3.js +89 -0
- package/static-files/shell-bridge.v3.js +174 -0
- package/static-files/shell-modals.v3.js +521 -0
- package/static-files/{shell.css → shell.v3.css} +271 -22
- package/static-files/shell.v3.js +1865 -0
- package/static-files/storage.v3.js +176 -0
- package/tests/anthropic.spec.ts +42 -7
- package/tests/builders.spec.ts +72 -4
- package/tests/pageValidator.spec.ts +548 -0
- package/tests/profiles.spec.ts +122 -0
- package/tests/providers.spec.ts +1 -1
- package/tests/sharedTableSchema.spec.ts +242 -0
- package/tests/transformPage.spec.ts +62 -81
- package/default-pages/application/page.json +0 -10
- package/default-pages/retro_game_starter/page.json +0 -12
- package/default-pages/sidebar_page/page.html +0 -51
- package/default-pages/sidebar_page/page.json +0 -10
- package/default-pages/two-panel_page/page.html +0 -68
- package/default-pages/two-panel_page/page.json +0 -10
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.createMediaCache = void 0;
|
|
7
|
+
const crypto_1 = require("crypto");
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
function hashKey(key) {
|
|
10
|
+
return (0, crypto_1.createHash)('sha256').update(key).digest('hex');
|
|
11
|
+
}
|
|
12
|
+
const MAX_ENTRIES = 500;
|
|
13
|
+
const CATEGORIES = ['images', 'audio'];
|
|
14
|
+
function createMediaCache(options) {
|
|
15
|
+
const { storage, cacheRoot } = options;
|
|
16
|
+
function categoryDir(category) {
|
|
17
|
+
return path_1.default.join(cacheRoot, category);
|
|
18
|
+
}
|
|
19
|
+
async function ensureCategory(category) {
|
|
20
|
+
await storage.ensureFolderExists(categoryDir(category));
|
|
21
|
+
}
|
|
22
|
+
async function get(category, key) {
|
|
23
|
+
const hash = hashKey(key);
|
|
24
|
+
const dir = categoryDir(category);
|
|
25
|
+
const metaPath = path_1.default.join(dir, `${hash}.meta.json`);
|
|
26
|
+
if (!(await storage.checkIfExists(metaPath))) {
|
|
27
|
+
return { hit: false };
|
|
28
|
+
}
|
|
29
|
+
const meta = JSON.parse(await storage.loadFile(metaPath));
|
|
30
|
+
const dataPath = path_1.default.join(dir, `${hash}${meta.extension}`);
|
|
31
|
+
try {
|
|
32
|
+
const buffer = await storage.loadBuffer(dataPath);
|
|
33
|
+
// Update last access time for eviction tracking
|
|
34
|
+
meta.lastAccessedAt = new Date().toISOString();
|
|
35
|
+
await storage.saveFile(metaPath, JSON.stringify(meta, null, 2));
|
|
36
|
+
return { hit: true, buffer, contentType: meta.contentType };
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return { hit: false };
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async function put(category, key, data, contentType, meta) {
|
|
43
|
+
await ensureCategory(category);
|
|
44
|
+
const hash = hashKey(key);
|
|
45
|
+
const dir = categoryDir(category);
|
|
46
|
+
const extension = extensionForContentType(contentType);
|
|
47
|
+
const dataPath = path_1.default.join(dir, `${hash}${extension}`);
|
|
48
|
+
const metaPath = path_1.default.join(dir, `${hash}.meta.json`);
|
|
49
|
+
const now = new Date().toISOString();
|
|
50
|
+
await storage.saveBuffer(dataPath, data);
|
|
51
|
+
await storage.saveFile(metaPath, JSON.stringify({
|
|
52
|
+
...meta,
|
|
53
|
+
contentType,
|
|
54
|
+
extension,
|
|
55
|
+
createdAt: now,
|
|
56
|
+
lastAccessedAt: now,
|
|
57
|
+
}, null, 2));
|
|
58
|
+
// Run eviction after writing the new entry
|
|
59
|
+
await evict();
|
|
60
|
+
}
|
|
61
|
+
async function evict() {
|
|
62
|
+
// Collect all entries across categories
|
|
63
|
+
const entries = [];
|
|
64
|
+
for (const category of CATEGORIES) {
|
|
65
|
+
const dir = categoryDir(category);
|
|
66
|
+
if (!(await storage.checkIfExists(dir)))
|
|
67
|
+
continue;
|
|
68
|
+
const files = await storage.listFiles(dir);
|
|
69
|
+
for (const file of files) {
|
|
70
|
+
if (!file.endsWith('.meta.json'))
|
|
71
|
+
continue;
|
|
72
|
+
const metaPath = path_1.default.join(dir, file);
|
|
73
|
+
try {
|
|
74
|
+
const meta = JSON.parse(await storage.loadFile(metaPath));
|
|
75
|
+
const hash = file.replace('.meta.json', '');
|
|
76
|
+
const dataPath = path_1.default.join(dir, `${hash}${meta.extension}`);
|
|
77
|
+
let size = 0;
|
|
78
|
+
try {
|
|
79
|
+
const info = await storage.stat(dataPath);
|
|
80
|
+
size = info.size;
|
|
81
|
+
}
|
|
82
|
+
catch { /* data file missing, size stays 0 */ }
|
|
83
|
+
entries.push({
|
|
84
|
+
category,
|
|
85
|
+
hash,
|
|
86
|
+
lastAccessedAt: meta.lastAccessedAt || meta.createdAt || '1970-01-01T00:00:00.000Z',
|
|
87
|
+
size,
|
|
88
|
+
metaPath,
|
|
89
|
+
extension: meta.extension,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
catch { /* skip unreadable meta */ }
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (entries.length <= MAX_ENTRIES)
|
|
96
|
+
return;
|
|
97
|
+
// Sort by lastAccessedAt descending — most recent first
|
|
98
|
+
entries.sort((a, b) => b.lastAccessedAt.localeCompare(a.lastAccessedAt));
|
|
99
|
+
// Evict everything beyond the first 500
|
|
100
|
+
const toEvict = entries.slice(MAX_ENTRIES);
|
|
101
|
+
for (const entry of toEvict) {
|
|
102
|
+
const dir = categoryDir(entry.category);
|
|
103
|
+
const dataPath = path_1.default.join(dir, `${entry.hash}${entry.extension}`);
|
|
104
|
+
try {
|
|
105
|
+
await storage.deleteFile(dataPath);
|
|
106
|
+
}
|
|
107
|
+
catch { /* ignore */ }
|
|
108
|
+
try {
|
|
109
|
+
await storage.deleteFile(entry.metaPath);
|
|
110
|
+
}
|
|
111
|
+
catch { /* ignore */ }
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
async function invalidate(category, key) {
|
|
115
|
+
const hash = hashKey(key);
|
|
116
|
+
const dir = categoryDir(category);
|
|
117
|
+
const metaPath = path_1.default.join(dir, `${hash}.meta.json`);
|
|
118
|
+
if (await storage.checkIfExists(metaPath)) {
|
|
119
|
+
const meta = JSON.parse(await storage.loadFile(metaPath));
|
|
120
|
+
const dataPath = path_1.default.join(dir, `${hash}${meta.extension}`);
|
|
121
|
+
try {
|
|
122
|
+
await storage.deleteFile(dataPath);
|
|
123
|
+
}
|
|
124
|
+
catch { /* ignore */ }
|
|
125
|
+
try {
|
|
126
|
+
await storage.deleteFile(metaPath);
|
|
127
|
+
}
|
|
128
|
+
catch { /* ignore */ }
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
async function clearCategory(category) {
|
|
132
|
+
const dir = categoryDir(category);
|
|
133
|
+
if (await storage.checkIfExists(dir)) {
|
|
134
|
+
await storage.deleteFolder(dir);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
async function clearAll() {
|
|
138
|
+
await clearCategory('images');
|
|
139
|
+
await clearCategory('audio');
|
|
140
|
+
}
|
|
141
|
+
async function stats() {
|
|
142
|
+
const result = {
|
|
143
|
+
images: { count: 0, totalBytes: 0 },
|
|
144
|
+
audio: { count: 0, totalBytes: 0 },
|
|
145
|
+
};
|
|
146
|
+
for (const category of CATEGORIES) {
|
|
147
|
+
const dir = categoryDir(category);
|
|
148
|
+
if (!(await storage.checkIfExists(dir)))
|
|
149
|
+
continue;
|
|
150
|
+
const files = await storage.listFiles(dir);
|
|
151
|
+
for (const file of files) {
|
|
152
|
+
if (file.endsWith('.meta.json'))
|
|
153
|
+
continue;
|
|
154
|
+
try {
|
|
155
|
+
const info = await storage.stat(path_1.default.join(dir, file));
|
|
156
|
+
result[category].count++;
|
|
157
|
+
result[category].totalBytes += info.size;
|
|
158
|
+
}
|
|
159
|
+
catch { /* skip missing */ }
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return result;
|
|
163
|
+
}
|
|
164
|
+
return { get, put, invalidate, clearCategory, clearAll, stats, evict };
|
|
165
|
+
}
|
|
166
|
+
exports.createMediaCache = createMediaCache;
|
|
167
|
+
function extensionForContentType(contentType) {
|
|
168
|
+
if (contentType.includes('png'))
|
|
169
|
+
return '.png';
|
|
170
|
+
if (contentType.includes('jpeg') || contentType.includes('jpg'))
|
|
171
|
+
return '.jpg';
|
|
172
|
+
if (contentType.includes('webp'))
|
|
173
|
+
return '.webp';
|
|
174
|
+
if (contentType.includes('mpeg') || contentType.includes('mp3'))
|
|
175
|
+
return '.mp3';
|
|
176
|
+
if (contentType.includes('wav'))
|
|
177
|
+
return '.wav';
|
|
178
|
+
if (contentType.includes('ogg'))
|
|
179
|
+
return '.ogg';
|
|
180
|
+
return '.bin';
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=mediaCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mediaCache.js","sourceRoot":"","sources":["../../src/service/mediaCache.ts"],"names":[],"mappings":";;;;;;AAAA,mCAAoC;AACpC,gDAAwB;AAyBxB,SAAS,OAAO,CAAC,GAAW;IACxB,OAAO,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,WAAW,GAAG,GAAG,CAAC;AACxB,MAAM,UAAU,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAU,CAAC;AAEhD,SAAgB,gBAAgB,CAAC,OAA0B;IACvD,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAEvC,SAAS,WAAW,CAAC,QAAgB;QACjC,OAAO,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,UAAU,cAAc,CAAC,QAAgB;QAC1C,MAAM,OAAO,CAAC,kBAAkB,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,UAAU,GAAG,CAAC,QAAgB,EAAE,GAAW;QAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1B,MAAM,GAAG,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,YAAY,CAAC,CAAC;QAErD,IAAI,CAAC,CAAC,MAAM,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,EAAE;YAC1C,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;SACzB;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QAC5D,IAAI;YACA,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAElD,gDAAgD;YAChD,IAAI,CAAC,cAAc,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC/C,MAAM,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAEhE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;SAC/D;QAAC,MAAM;YACJ,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;SACzB;IACL,CAAC;IAED,KAAK,UAAU,GAAG,CACd,QAAgB,EAChB,GAAW,EACX,IAAY,EACZ,WAAmB,EACnB,IAA6B;QAE7B,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1B,MAAM,GAAG,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;QAClC,MAAM,SAAS,GAAG,uBAAuB,CAAC,WAAW,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,SAAS,EAAE,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,YAAY,CAAC,CAAC;QAErD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACzC,MAAM,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC;YAC5C,GAAG,IAAI;YACP,WAAW;YACX,SAAS;YACT,SAAS,EAAE,GAAG;YACd,cAAc,EAAE,GAAG;SACtB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAEb,2CAA2C;QAC3C,MAAM,KAAK,EAAE,CAAC;IAClB,CAAC;IAED,KAAK,UAAU,KAAK;QAChB,wCAAwC;QACxC,MAAM,OAAO,GAAoH,EAAE,CAAC;QAEpI,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE;YAC/B,MAAM,GAAG,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;YAClC,IAAI,CAAC,CAAC,MAAM,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;gBAAE,SAAS;YAElD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAC3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;gBACtB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;oBAAE,SAAS;gBAC3C,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBACtC,IAAI;oBACA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;oBAC5C,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;oBAC5D,IAAI,IAAI,GAAG,CAAC,CAAC;oBACb,IAAI;wBACA,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;wBAC1C,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;qBACpB;oBAAC,MAAM,EAAE,qCAAqC,EAAE;oBACjD,OAAO,CAAC,IAAI,CAAC;wBACT,QAAQ;wBACR,IAAI;wBACJ,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,SAAS,IAAI,0BAA0B;wBACnF,IAAI;wBACJ,QAAQ;wBACR,SAAS,EAAE,IAAI,CAAC,SAAS;qBAC5B,CAAC,CAAC;iBACN;gBAAC,MAAM,EAAE,0BAA0B,EAAE;aACzC;SACJ;QAED,IAAI,OAAO,CAAC,MAAM,IAAI,WAAW;YAAE,OAAO;QAE1C,wDAAwD;QACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;QAEzE,wCAAwC;QACxC,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC3C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;YACzB,MAAM,GAAG,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACxC,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;YACnE,IAAI;gBAAE,MAAM,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;aAAE;YAAC,MAAM,EAAE,YAAY,EAAE;YAClE,IAAI;gBAAE,MAAM,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;aAAE;YAAC,MAAM,EAAE,YAAY,EAAE;SAC3E;IACL,CAAC;IAED,KAAK,UAAU,UAAU,CAAC,QAAgB,EAAE,GAAW;QACnD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1B,MAAM,GAAG,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,YAAY,CAAC,CAAC;QAErD,IAAI,MAAM,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE;YACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC1D,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;YAC5D,IAAI;gBAAE,MAAM,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;aAAE;YAAC,MAAM,EAAE,YAAY,EAAE;YAClE,IAAI;gBAAE,MAAM,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;aAAE;YAAC,MAAM,EAAE,YAAY,EAAE;SACrE;IACL,CAAC;IAED,KAAK,UAAU,aAAa,CAAC,QAAgB;QACzC,MAAM,GAAG,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;QAClC,IAAI,MAAM,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE;YAClC,MAAM,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;SACnC;IACL,CAAC;IAED,KAAK,UAAU,QAAQ;QACnB,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC9B,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,UAAU,KAAK;QAChB,MAAM,MAAM,GAAe;YACvB,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE;YACnC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE;SACrC,CAAC;QAEF,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE;YAC/B,MAAM,GAAG,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;YAClC,IAAI,CAAC,CAAC,MAAM,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;gBAAE,SAAS;YAClD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAC3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;gBACtB,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;oBAAE,SAAS;gBAC1C,IAAI;oBACA,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;oBACtD,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,CAAC;oBACzB,MAAM,CAAC,QAAQ,CAAC,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC;iBAC5C;gBAAC,MAAM,EAAE,kBAAkB,EAAE;aACjC;SACJ;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC3E,CAAC;AAhKD,4CAgKC;AAED,SAAS,uBAAuB,CAAC,WAAmB;IAChD,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAC/C,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAC/E,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,OAAO,CAAC;IACjD,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAC/E,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAC/C,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAC/C,OAAO,MAAM,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pageValidator.ts — Lightweight page validation for LLM-generated HTML.
|
|
3
|
+
*
|
|
4
|
+
* Catches common errors (syntax, missing DOM elements, bad synthos.* calls)
|
|
5
|
+
* before serving pages. No browser binary — static analysis only.
|
|
6
|
+
*
|
|
7
|
+
* Layers:
|
|
8
|
+
* 1. Script extraction + Acorn parse → syntax errors
|
|
9
|
+
* 2. DOM element ID inventory → missing element references
|
|
10
|
+
* 3. SynthOS API pattern checks → hallucinated method calls
|
|
11
|
+
*/
|
|
12
|
+
export interface PageValidationError {
|
|
13
|
+
type: 'syntax-error' | 'missing-element' | 'unknown-api';
|
|
14
|
+
message: string;
|
|
15
|
+
source?: string;
|
|
16
|
+
line?: number;
|
|
17
|
+
col?: number;
|
|
18
|
+
}
|
|
19
|
+
export interface PageValidationResult {
|
|
20
|
+
valid: boolean;
|
|
21
|
+
errors: PageValidationError[];
|
|
22
|
+
durationMs: number;
|
|
23
|
+
}
|
|
24
|
+
export declare function validatePage(html: string): PageValidationResult;
|
|
25
|
+
//# sourceMappingURL=pageValidator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pageValidator.d.ts","sourceRoot":"","sources":["../../src/service/pageValidator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AASH,MAAM,WAAW,mBAAmB;IAChC,IAAI,EAAE,cAAc,GAAG,iBAAiB,GAAG,aAAa,CAAC;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACjC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;CACtB;AAsRD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,oBAAoB,CA2B/D"}
|
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* pageValidator.ts — Lightweight page validation for LLM-generated HTML.
|
|
4
|
+
*
|
|
5
|
+
* Catches common errors (syntax, missing DOM elements, bad synthos.* calls)
|
|
6
|
+
* before serving pages. No browser binary — static analysis only.
|
|
7
|
+
*
|
|
8
|
+
* Layers:
|
|
9
|
+
* 1. Script extraction + Acorn parse → syntax errors
|
|
10
|
+
* 2. DOM element ID inventory → missing element references
|
|
11
|
+
* 3. SynthOS API pattern checks → hallucinated method calls
|
|
12
|
+
*/
|
|
13
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
16
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
17
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
18
|
+
}
|
|
19
|
+
Object.defineProperty(o, k2, desc);
|
|
20
|
+
}) : (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
o[k2] = m[k];
|
|
23
|
+
}));
|
|
24
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
25
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
26
|
+
}) : function(o, v) {
|
|
27
|
+
o["default"] = v;
|
|
28
|
+
});
|
|
29
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
30
|
+
if (mod && mod.__esModule) return mod;
|
|
31
|
+
var result = {};
|
|
32
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
33
|
+
__setModuleDefault(result, mod);
|
|
34
|
+
return result;
|
|
35
|
+
};
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
exports.validatePage = void 0;
|
|
38
|
+
const acorn = __importStar(require("acorn"));
|
|
39
|
+
const cheerio = __importStar(require("cheerio"));
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
// Known injected script IDs — skip these during validation
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
const INJECTED_SCRIPT_IDS = new Set([
|
|
44
|
+
'page-bridge',
|
|
45
|
+
'page-helpers',
|
|
46
|
+
'page-info',
|
|
47
|
+
'page-script',
|
|
48
|
+
'synthos-error-capture',
|
|
49
|
+
// V3 module scripts
|
|
50
|
+
'shell-v3',
|
|
51
|
+
'server-v3',
|
|
52
|
+
'storage-v3',
|
|
53
|
+
'script-v3',
|
|
54
|
+
'connector-v3',
|
|
55
|
+
'agent-v3',
|
|
56
|
+
]);
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
// Known SynthOS API surface (from helpers.v3.js)
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
const KNOWN_SYNTHOS_METHODS = new Set([
|
|
61
|
+
// data
|
|
62
|
+
'synthos.data',
|
|
63
|
+
'synthos.data.list',
|
|
64
|
+
'synthos.data.get',
|
|
65
|
+
'synthos.data.save',
|
|
66
|
+
'synthos.data.remove',
|
|
67
|
+
// files
|
|
68
|
+
'synthos.files',
|
|
69
|
+
'synthos.files.list',
|
|
70
|
+
'synthos.files.upload',
|
|
71
|
+
'synthos.files.url',
|
|
72
|
+
'synthos.files.remove',
|
|
73
|
+
// shared.data
|
|
74
|
+
'synthos.shared',
|
|
75
|
+
'synthos.shared.data',
|
|
76
|
+
'synthos.shared.data.list',
|
|
77
|
+
'synthos.shared.data.get',
|
|
78
|
+
'synthos.shared.data.save',
|
|
79
|
+
'synthos.shared.data.remove',
|
|
80
|
+
// shared.files
|
|
81
|
+
'synthos.shared.files',
|
|
82
|
+
'synthos.shared.files.list',
|
|
83
|
+
'synthos.shared.files.upload',
|
|
84
|
+
'synthos.shared.files.url',
|
|
85
|
+
'synthos.shared.files.remove',
|
|
86
|
+
// generate
|
|
87
|
+
'synthos.generate',
|
|
88
|
+
'synthos.generate.image',
|
|
89
|
+
'synthos.generate.completion',
|
|
90
|
+
// script
|
|
91
|
+
'synthos.script',
|
|
92
|
+
'synthos.script.run',
|
|
93
|
+
// page
|
|
94
|
+
'synthos.page',
|
|
95
|
+
'synthos.page.list',
|
|
96
|
+
'synthos.page.get',
|
|
97
|
+
'synthos.page.update',
|
|
98
|
+
'synthos.page.remove',
|
|
99
|
+
'synthos.page.ask',
|
|
100
|
+
// search
|
|
101
|
+
'synthos.search',
|
|
102
|
+
'synthos.search.web',
|
|
103
|
+
// connector
|
|
104
|
+
'synthos.connector',
|
|
105
|
+
'synthos.connector.call',
|
|
106
|
+
'synthos.connector.list',
|
|
107
|
+
// agent
|
|
108
|
+
'synthos.agent',
|
|
109
|
+
'synthos.agent.list',
|
|
110
|
+
'synthos.agent.send',
|
|
111
|
+
'synthos.agent.sendStream',
|
|
112
|
+
'synthos.agent.chat',
|
|
113
|
+
'synthos.agent.chat.send',
|
|
114
|
+
'synthos.agent.chat.sendStream',
|
|
115
|
+
'synthos.agent.chat.history',
|
|
116
|
+
'synthos.agent.chat.abort',
|
|
117
|
+
'synthos.agent.chat.clear',
|
|
118
|
+
'synthos.agent.isEnabled',
|
|
119
|
+
'synthos.agent.getCapabilities',
|
|
120
|
+
// shell
|
|
121
|
+
'synthos.shell',
|
|
122
|
+
'synthos.shell.navigate',
|
|
123
|
+
'synthos.shell.submitChat',
|
|
124
|
+
'synthos.shell.setDirty',
|
|
125
|
+
'synthos.shell.showLoading',
|
|
126
|
+
'synthos.shell.hideLoading',
|
|
127
|
+
'synthos.shell.focusChat',
|
|
128
|
+
'synthos.shell.openSaveModal',
|
|
129
|
+
'synthos.shell.toggleBuilder',
|
|
130
|
+
'synthos.shell.openBuilder',
|
|
131
|
+
'synthos.shell.closeBuilder',
|
|
132
|
+
'synthos.shell.on',
|
|
133
|
+
]);
|
|
134
|
+
// ---------------------------------------------------------------------------
|
|
135
|
+
// Layer 1: Script Extraction + Acorn Parse
|
|
136
|
+
// ---------------------------------------------------------------------------
|
|
137
|
+
function estimateLineOffset(html, scriptHtml) {
|
|
138
|
+
const idx = html.indexOf(scriptHtml);
|
|
139
|
+
if (idx === -1)
|
|
140
|
+
return 0;
|
|
141
|
+
let line = 1;
|
|
142
|
+
for (let i = 0; i < idx; i++) {
|
|
143
|
+
if (html[i] === '\n')
|
|
144
|
+
line++;
|
|
145
|
+
}
|
|
146
|
+
return line;
|
|
147
|
+
}
|
|
148
|
+
function extractScripts(html) {
|
|
149
|
+
const $ = cheerio.load(html);
|
|
150
|
+
const scripts = [];
|
|
151
|
+
let index = 0;
|
|
152
|
+
$('script').each((_, el) => {
|
|
153
|
+
const $el = $(el);
|
|
154
|
+
// Skip external scripts (have src attribute)
|
|
155
|
+
if ($el.attr('src'))
|
|
156
|
+
return;
|
|
157
|
+
// Skip known injected scripts
|
|
158
|
+
const id = $el.attr('id');
|
|
159
|
+
if (id && INJECTED_SCRIPT_IDS.has(id))
|
|
160
|
+
return;
|
|
161
|
+
const source = $el.text();
|
|
162
|
+
if (!source.trim())
|
|
163
|
+
return;
|
|
164
|
+
scripts.push({
|
|
165
|
+
index: index++,
|
|
166
|
+
source,
|
|
167
|
+
startLine: estimateLineOffset(html, $.html(el)),
|
|
168
|
+
isModule: $el.attr('type') === 'module',
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
return scripts;
|
|
172
|
+
}
|
|
173
|
+
function parseSyntax(script) {
|
|
174
|
+
try {
|
|
175
|
+
acorn.parse(script.source, {
|
|
176
|
+
ecmaVersion: 'latest',
|
|
177
|
+
sourceType: script.isModule ? 'module' : 'script',
|
|
178
|
+
allowAwaitOutsideFunction: true,
|
|
179
|
+
});
|
|
180
|
+
return null;
|
|
181
|
+
}
|
|
182
|
+
catch (err) {
|
|
183
|
+
const e = err;
|
|
184
|
+
return {
|
|
185
|
+
type: 'syntax-error',
|
|
186
|
+
message: e.message ?? 'Unknown syntax error',
|
|
187
|
+
source: `inline-script-${script.index}`,
|
|
188
|
+
line: e.loc ? script.startLine + e.loc.line : undefined,
|
|
189
|
+
col: e.loc?.column,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// ---------------------------------------------------------------------------
|
|
194
|
+
// Layer 2: DOM Element ID Inventory
|
|
195
|
+
// ---------------------------------------------------------------------------
|
|
196
|
+
function buildIdInventory(html) {
|
|
197
|
+
const $ = cheerio.load(html);
|
|
198
|
+
const ids = new Set();
|
|
199
|
+
$('[id]').each((_, el) => {
|
|
200
|
+
const id = $(el).attr('id');
|
|
201
|
+
if (id)
|
|
202
|
+
ids.add(id);
|
|
203
|
+
});
|
|
204
|
+
return ids;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Patterns that CREATE element IDs inside script source text. Scripts that
|
|
208
|
+
* build DOM via `innerHTML = \`...<input id="btnSaveAll">...\`` or assign
|
|
209
|
+
* `el.id = 'foo'` produce IDs at runtime that `buildIdInventory` misses.
|
|
210
|
+
* Seeding those IDs as "known" prevents false-positive missing-element
|
|
211
|
+
* errors for dynamically constructed UI.
|
|
212
|
+
*/
|
|
213
|
+
const ID_CREATE_PATTERNS = [
|
|
214
|
+
// id="foo" / id='foo' in string literals (innerHTML templates, etc.)
|
|
215
|
+
/\bid\s*=\s*["']([a-zA-Z_][\w-]*)["']/g,
|
|
216
|
+
// el.id = 'foo' / obj.id = "foo"
|
|
217
|
+
/\.id\s*=\s*["']([a-zA-Z_][\w-]*)["']/g,
|
|
218
|
+
];
|
|
219
|
+
function collectDynamicIds(scripts) {
|
|
220
|
+
const ids = new Set();
|
|
221
|
+
for (const script of scripts) {
|
|
222
|
+
for (const pattern of ID_CREATE_PATTERNS) {
|
|
223
|
+
pattern.lastIndex = 0;
|
|
224
|
+
let match;
|
|
225
|
+
while ((match = pattern.exec(script.source)) !== null) {
|
|
226
|
+
ids.add(match[1]);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return ids;
|
|
231
|
+
}
|
|
232
|
+
/** Patterns that reference element IDs in JS code. */
|
|
233
|
+
const ID_REF_PATTERNS = [
|
|
234
|
+
/getElementById\(\s*['"]([^'"]+)['"]\s*\)/g,
|
|
235
|
+
/querySelector(?:All)?\(\s*['"]#([^'"]+)['"]\s*\)/g,
|
|
236
|
+
/\$\(\s*['"]#([^'"]+)['"]\s*\)/g,
|
|
237
|
+
];
|
|
238
|
+
function checkIdReferences(scripts, ids) {
|
|
239
|
+
const errors = [];
|
|
240
|
+
for (const script of scripts) {
|
|
241
|
+
for (const pattern of ID_REF_PATTERNS) {
|
|
242
|
+
pattern.lastIndex = 0;
|
|
243
|
+
let match;
|
|
244
|
+
while ((match = pattern.exec(script.source)) !== null) {
|
|
245
|
+
const refId = match[1];
|
|
246
|
+
if (!ids.has(refId)) {
|
|
247
|
+
errors.push({
|
|
248
|
+
type: 'missing-element',
|
|
249
|
+
message: `Script references element '#${refId}' which does not exist in the page`,
|
|
250
|
+
source: `inline-script-${script.index}`,
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return errors;
|
|
257
|
+
}
|
|
258
|
+
// ---------------------------------------------------------------------------
|
|
259
|
+
// Layer 3: SynthOS API Pattern Checks
|
|
260
|
+
// ---------------------------------------------------------------------------
|
|
261
|
+
const SYNTHOS_CALL_PATTERN = /synthos(?:\.[\w]+)+/g;
|
|
262
|
+
function checkSynthosApi(scripts) {
|
|
263
|
+
const errors = [];
|
|
264
|
+
const seen = new Set();
|
|
265
|
+
for (const script of scripts) {
|
|
266
|
+
SYNTHOS_CALL_PATTERN.lastIndex = 0;
|
|
267
|
+
let match;
|
|
268
|
+
while ((match = SYNTHOS_CALL_PATTERN.exec(script.source)) !== null) {
|
|
269
|
+
const call = match[0];
|
|
270
|
+
// Deduplicate within a single validation run
|
|
271
|
+
if (seen.has(call))
|
|
272
|
+
continue;
|
|
273
|
+
if (!KNOWN_SYNTHOS_METHODS.has(call)) {
|
|
274
|
+
seen.add(call);
|
|
275
|
+
errors.push({
|
|
276
|
+
type: 'unknown-api',
|
|
277
|
+
message: `Unknown SynthOS API call: ${call}`,
|
|
278
|
+
source: `inline-script-${script.index}`,
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
return errors;
|
|
284
|
+
}
|
|
285
|
+
// ---------------------------------------------------------------------------
|
|
286
|
+
// Public API
|
|
287
|
+
// ---------------------------------------------------------------------------
|
|
288
|
+
function validatePage(html) {
|
|
289
|
+
const start = Date.now();
|
|
290
|
+
const errors = [];
|
|
291
|
+
// Layer 1: Extract and parse scripts
|
|
292
|
+
const scripts = extractScripts(html);
|
|
293
|
+
for (const script of scripts) {
|
|
294
|
+
const err = parseSyntax(script);
|
|
295
|
+
if (err)
|
|
296
|
+
errors.push(err);
|
|
297
|
+
}
|
|
298
|
+
// Layer 2: DOM ID reference checks (only if no syntax errors)
|
|
299
|
+
if (errors.length === 0) {
|
|
300
|
+
const ids = buildIdInventory(html);
|
|
301
|
+
const dynamicIds = collectDynamicIds(scripts);
|
|
302
|
+
for (const id of dynamicIds)
|
|
303
|
+
ids.add(id);
|
|
304
|
+
errors.push(...checkIdReferences(scripts, ids));
|
|
305
|
+
}
|
|
306
|
+
// Layer 3: SynthOS API pattern checks (always runs)
|
|
307
|
+
errors.push(...checkSynthosApi(scripts));
|
|
308
|
+
return {
|
|
309
|
+
valid: errors.length === 0,
|
|
310
|
+
errors,
|
|
311
|
+
durationMs: Date.now() - start,
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
exports.validatePage = validatePage;
|
|
315
|
+
//# sourceMappingURL=pageValidator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pageValidator.js","sourceRoot":"","sources":["../../src/service/pageValidator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/service/server.ts"],"names":[],"mappings":"AAAA,OAAgB,EAAC,WAAW,EAAC,MAAM,SAAS,CAAC;AAG7C,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/service/server.ts"],"names":[],"mappings":"AAAA,OAAgB,EAAC,WAAW,EAAC,MAAM,SAAS,CAAC;AAG7C,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AASxC,OAAO,EAAmC,UAAU,EAAE,MAAM,eAAe,CAAC;AAE5E,wBAAgB,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,UAAU,GAAE,UAA8B,GAAG,WAAW,CA+DrG"}
|
package/dist/service/server.js
CHANGED
|
@@ -9,6 +9,7 @@ const usePageRoutes_1 = require("./usePageRoutes");
|
|
|
9
9
|
const useApiRoutes_1 = require("./useApiRoutes");
|
|
10
10
|
const useDataRoutes_1 = require("./useDataRoutes");
|
|
11
11
|
const useFileRoutes_1 = require("./useFileRoutes");
|
|
12
|
+
const useExtractRoutes_1 = require("./useExtractRoutes");
|
|
12
13
|
const useSharedDataRoutes_1 = require("./useSharedDataRoutes");
|
|
13
14
|
const useSharedFileRoutes_1 = require("./useSharedFileRoutes");
|
|
14
15
|
const useConnectorRoutes_1 = require("./useConnectorRoutes");
|
|
@@ -57,6 +58,9 @@ function server(config, customizer = customizer_1.customizer) {
|
|
|
57
58
|
// File routes
|
|
58
59
|
if (customizer.isEnabled('files'))
|
|
59
60
|
(0, useFileRoutes_1.useFileRoutes)(config, app);
|
|
61
|
+
// Extract routes — schema-typed file extraction via active chat model
|
|
62
|
+
if (customizer.isEnabled('extract'))
|
|
63
|
+
(0, useExtractRoutes_1.useExtractRoutes)(config, app);
|
|
60
64
|
// Shared data routes
|
|
61
65
|
if (customizer.isEnabled('shared-data'))
|
|
62
66
|
(0, useSharedDataRoutes_1.useSharedDataRoutes)(config, app);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/service/server.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/service/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { SynthOSConfig } from '../init';
|
|
2
|
+
/**
|
|
3
|
+
* Schema sidecar IO + additive-merge logic. Used by both shared-table and
|
|
4
|
+
* per-page-table routes — the only difference is the parent folder where the
|
|
5
|
+
* `<table>.schema.json` file lives.
|
|
6
|
+
*
|
|
7
|
+
* Spec: docs/specs/shared-tables-schema-sidecar.md
|
|
8
|
+
*/
|
|
9
|
+
export interface SchemaWrapper {
|
|
10
|
+
version: number;
|
|
11
|
+
schema: Record<string, unknown>;
|
|
12
|
+
createdAt: string;
|
|
13
|
+
updatedAt: string;
|
|
14
|
+
definedBy?: string;
|
|
15
|
+
}
|
|
16
|
+
export type MergeMode = 'additive' | 'replace';
|
|
17
|
+
export interface MergeConflict {
|
|
18
|
+
field: string;
|
|
19
|
+
existing: unknown;
|
|
20
|
+
incoming: unknown;
|
|
21
|
+
}
|
|
22
|
+
/** Sidecar file path: `<parent>/<table>.schema.json`. */
|
|
23
|
+
export declare function schemaFile(parent: string, table: string): string;
|
|
24
|
+
/** Load the wrapper. Returns undefined if missing or unparsable. */
|
|
25
|
+
export declare function loadSchema(config: SynthOSConfig, parent: string, table: string): Promise<SchemaWrapper | undefined>;
|
|
26
|
+
/** Persist a wrapper to disk. */
|
|
27
|
+
export declare function saveSchema(config: SynthOSConfig, parent: string, table: string, wrapper: SchemaWrapper): Promise<void>;
|
|
28
|
+
/** Delete the schema sidecar. No-op if it doesn't exist. */
|
|
29
|
+
export declare function deleteSchema(config: SynthOSConfig, parent: string, table: string): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Apply `incoming` against `existing` per `mode`:
|
|
32
|
+
* - 'replace' → drop existing entirely; incoming wins.
|
|
33
|
+
* - 'additive' → union of `properties` (existing wins on overlap if types match;
|
|
34
|
+
* conflicting types reported via `conflicts`); union of `required`.
|
|
35
|
+
*
|
|
36
|
+
* Returns the merged schema and any conflicts. On conflict, callers should
|
|
37
|
+
* surface them as a 409 and NOT persist the result.
|
|
38
|
+
*/
|
|
39
|
+
export declare function mergeSchema(existing: Record<string, unknown> | undefined, incoming: Record<string, unknown>, mode: MergeMode): {
|
|
40
|
+
merged: Record<string, unknown>;
|
|
41
|
+
conflicts: MergeConflict[];
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Validate the structural shape of an incoming JSON Schema. Strict-mode
|
|
45
|
+
* validation against the meta-schema is out of scope; we only check that the
|
|
46
|
+
* payload is a plain object so we don't persist garbage.
|
|
47
|
+
*/
|
|
48
|
+
export declare function isValidSchemaPayload(s: unknown): s is Record<string, unknown>;
|
|
49
|
+
/**
|
|
50
|
+
* Build a SchemaWrapper from a plain JSON Schema, using `now` for both
|
|
51
|
+
* timestamps when no existing wrapper is being preserved.
|
|
52
|
+
*/
|
|
53
|
+
export declare function newSchemaWrapper(schema: Record<string, unknown>, now: string, definedBy?: string): SchemaWrapper;
|
|
54
|
+
/**
|
|
55
|
+
* Update an existing wrapper, preserving createdAt and bumping updatedAt.
|
|
56
|
+
*/
|
|
57
|
+
export declare function updateSchemaWrapper(existing: SchemaWrapper, schema: Record<string, unknown>, now: string, definedBy?: string): SchemaWrapper;
|
|
58
|
+
/**
|
|
59
|
+
* Enumerate tables in a namespace folder. A "table" is either:
|
|
60
|
+
* - a subfolder containing record files, OR
|
|
61
|
+
* - a `<name>.schema.json` sidecar (table may be schemaless until first save).
|
|
62
|
+
*
|
|
63
|
+
* Returns one entry per unique table name, with hasSchema + recordCount.
|
|
64
|
+
*
|
|
65
|
+
* `reserved` filters out names that occupy the namespace for non-table use
|
|
66
|
+
* (e.g. `files`, the per-page uploads folder).
|
|
67
|
+
*/
|
|
68
|
+
export declare function listTables(config: SynthOSConfig, parent: string, reserved?: ReadonlySet<string>): Promise<Array<{
|
|
69
|
+
name: string;
|
|
70
|
+
hasSchema: boolean;
|
|
71
|
+
recordCount: number;
|
|
72
|
+
}>>;
|
|
73
|
+
//# sourceMappingURL=sharedTableSchema.d.ts.map
|