synthos 0.10.1 → 0.11.1
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 +285 -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 +1388 -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 +1888 -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 +150 -25
- 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 +10 -1
- 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 +283 -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 +1414 -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 +70 -2
- package/tests/pageValidator.spec.ts +548 -0
- package/tests/profiles.spec.ts +122 -0
- 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,351 @@
|
|
|
1
|
+
<!DOCTYPE html><html lang="en"><head>
|
|
2
|
+
<meta charset="UTF-8">
|
|
3
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
4
|
+
<title>SynthOS - Chat Starter</title>
|
|
5
|
+
<script id="theme-info" src="/api/theme-info.js" data-locked="true"></script>
|
|
6
|
+
<link id="theme-css" rel="stylesheet" href="/api/theme.css" data-locked="true">
|
|
7
|
+
<style>
|
|
8
|
+
html, body { height: 100%; }
|
|
9
|
+
body { margin: 0; }
|
|
10
|
+
.viewer-panel { height: 100%; }
|
|
11
|
+
.chat-app {
|
|
12
|
+
display: flex;
|
|
13
|
+
flex-direction: column;
|
|
14
|
+
height: 100%;
|
|
15
|
+
min-height: 100%;
|
|
16
|
+
box-sizing: border-box;
|
|
17
|
+
}
|
|
18
|
+
.chat-header {
|
|
19
|
+
display: flex;
|
|
20
|
+
justify-content: space-between;
|
|
21
|
+
align-items: center;
|
|
22
|
+
padding: 14px 24px;
|
|
23
|
+
border-bottom: 1px solid var(--bodyDivider, #edebe9);
|
|
24
|
+
background: var(--defaultStateBackground, #faf9f8);
|
|
25
|
+
gap: 12px;
|
|
26
|
+
flex: 0 0 auto;
|
|
27
|
+
}
|
|
28
|
+
.chat-header h1 {
|
|
29
|
+
margin: 0;
|
|
30
|
+
font-size: 18px;
|
|
31
|
+
font-weight: 700;
|
|
32
|
+
color: var(--bodyText, #333333);
|
|
33
|
+
}
|
|
34
|
+
.chat-header .subtitle {
|
|
35
|
+
margin: 2px 0 0;
|
|
36
|
+
font-size: 12px;
|
|
37
|
+
color: var(--bodySubtext, #605e5c);
|
|
38
|
+
}
|
|
39
|
+
.chat-actions { display: flex; gap: 8px; align-items: center; }
|
|
40
|
+
.transcript {
|
|
41
|
+
flex: 1 1 auto;
|
|
42
|
+
min-height: 0;
|
|
43
|
+
overflow-y: auto;
|
|
44
|
+
padding: 20px 24px;
|
|
45
|
+
display: flex;
|
|
46
|
+
flex-direction: column;
|
|
47
|
+
gap: 10px;
|
|
48
|
+
background: var(--bodyBackground, #ffffff);
|
|
49
|
+
}
|
|
50
|
+
.empty-state {
|
|
51
|
+
margin: auto;
|
|
52
|
+
text-align: center;
|
|
53
|
+
color: var(--bodySubtext, #605e5c);
|
|
54
|
+
font-size: 13px;
|
|
55
|
+
max-width: 360px;
|
|
56
|
+
line-height: 1.5;
|
|
57
|
+
}
|
|
58
|
+
.bubble-row {
|
|
59
|
+
display: flex;
|
|
60
|
+
width: 100%;
|
|
61
|
+
}
|
|
62
|
+
.bubble-row.user { justify-content: flex-end; }
|
|
63
|
+
.bubble-row.assistant { justify-content: flex-start; }
|
|
64
|
+
.bubble {
|
|
65
|
+
max-width: min(560px, 78%);
|
|
66
|
+
padding: 10px 14px;
|
|
67
|
+
border-radius: 14px;
|
|
68
|
+
font-size: 14px;
|
|
69
|
+
line-height: 1.45;
|
|
70
|
+
white-space: pre-wrap;
|
|
71
|
+
word-wrap: break-word;
|
|
72
|
+
box-sizing: border-box;
|
|
73
|
+
}
|
|
74
|
+
.bubble.user {
|
|
75
|
+
background: var(--themePrimary, #0078d4);
|
|
76
|
+
color: #ffffff;
|
|
77
|
+
border-bottom-right-radius: 4px;
|
|
78
|
+
}
|
|
79
|
+
.bubble.assistant {
|
|
80
|
+
background: var(--defaultStateBackground, #faf9f8);
|
|
81
|
+
color: var(--bodyText, #333333);
|
|
82
|
+
border: 1px solid var(--bodyDivider, #edebe9);
|
|
83
|
+
border-bottom-left-radius: 4px;
|
|
84
|
+
}
|
|
85
|
+
.bubble .ts {
|
|
86
|
+
display: block;
|
|
87
|
+
margin-top: 6px;
|
|
88
|
+
font-size: 10px;
|
|
89
|
+
opacity: 0.7;
|
|
90
|
+
}
|
|
91
|
+
.bubble.assistant .ts { color: var(--bodySubtext, #605e5c); }
|
|
92
|
+
.typing {
|
|
93
|
+
display: inline-flex;
|
|
94
|
+
gap: 3px;
|
|
95
|
+
padding: 4px 0;
|
|
96
|
+
}
|
|
97
|
+
.typing span {
|
|
98
|
+
width: 6px;
|
|
99
|
+
height: 6px;
|
|
100
|
+
border-radius: 50%;
|
|
101
|
+
background: var(--bodySubtext, #605e5c);
|
|
102
|
+
opacity: 0.5;
|
|
103
|
+
animation: tdot 1.2s infinite ease-in-out;
|
|
104
|
+
}
|
|
105
|
+
.typing span:nth-child(2) { animation-delay: 0.2s; }
|
|
106
|
+
.typing span:nth-child(3) { animation-delay: 0.4s; }
|
|
107
|
+
@keyframes tdot { 0%,80%,100% { transform: scale(0.7); opacity: 0.4; } 40% { transform: scale(1); opacity: 0.9; } }
|
|
108
|
+
|
|
109
|
+
.composer {
|
|
110
|
+
flex: 0 0 auto;
|
|
111
|
+
padding: 12px 16px 16px;
|
|
112
|
+
border-top: 1px solid var(--bodyDivider, #edebe9);
|
|
113
|
+
background: var(--defaultStateBackground, #faf9f8);
|
|
114
|
+
}
|
|
115
|
+
.composer-row {
|
|
116
|
+
display: flex;
|
|
117
|
+
gap: 8px;
|
|
118
|
+
align-items: flex-end;
|
|
119
|
+
background: var(--bodyBackground, #ffffff);
|
|
120
|
+
border: 1px solid var(--inputBorder, #d2d0ce);
|
|
121
|
+
border-radius: 10px;
|
|
122
|
+
padding: 8px 8px 8px 12px;
|
|
123
|
+
}
|
|
124
|
+
.composer-row:focus-within { border-color: var(--themePrimary, #0078d4); }
|
|
125
|
+
.composer textarea {
|
|
126
|
+
flex: 1 1 auto;
|
|
127
|
+
border: none;
|
|
128
|
+
outline: none;
|
|
129
|
+
resize: none;
|
|
130
|
+
background: transparent;
|
|
131
|
+
color: var(--bodyText, #333333);
|
|
132
|
+
font: inherit;
|
|
133
|
+
font-size: 14px;
|
|
134
|
+
line-height: 1.4;
|
|
135
|
+
max-height: 160px;
|
|
136
|
+
min-height: 22px;
|
|
137
|
+
padding: 4px 0;
|
|
138
|
+
}
|
|
139
|
+
.composer-hint {
|
|
140
|
+
margin-top: 6px;
|
|
141
|
+
font-size: 11px;
|
|
142
|
+
color: var(--bodySubtext, #605e5c);
|
|
143
|
+
text-align: right;
|
|
144
|
+
}
|
|
145
|
+
</style>
|
|
146
|
+
</head>
|
|
147
|
+
<body>
|
|
148
|
+
<div class="viewer-panel" id="viewerPanel" style="padding: 0;">
|
|
149
|
+
<div class="chat-app">
|
|
150
|
+
<div class="chat-header">
|
|
151
|
+
<div>
|
|
152
|
+
<h1>[Conversation Title]</h1>
|
|
153
|
+
<div class="subtitle">[Optional one-line description of the chat purpose]</div>
|
|
154
|
+
</div>
|
|
155
|
+
<div class="chat-actions">
|
|
156
|
+
<button class="flm-button" id="clearBtn" data-icon="Delete">Clear</button>
|
|
157
|
+
</div>
|
|
158
|
+
</div>
|
|
159
|
+
<div class="transcript" id="transcript">
|
|
160
|
+
<div class="empty-state" id="emptyState">
|
|
161
|
+
<strong>Start the conversation</strong>
|
|
162
|
+
<p>Type a message below and press Enter to send. Shift+Enter inserts a newline.</p>
|
|
163
|
+
</div>
|
|
164
|
+
</div>
|
|
165
|
+
<div class="composer">
|
|
166
|
+
<div class="composer-row">
|
|
167
|
+
<textarea id="composerInput" rows="1" placeholder="[Type a message…]"></textarea>
|
|
168
|
+
<button class="flm-button flm-button--primary" id="sendBtn" data-icon="Send">Send</button>
|
|
169
|
+
</div>
|
|
170
|
+
<div class="composer-hint">Enter to send · Shift+Enter for newline</div>
|
|
171
|
+
</div>
|
|
172
|
+
</div>
|
|
173
|
+
</div>
|
|
174
|
+
|
|
175
|
+
<div id="instructions" style="display: none;" data-locked="true">Chat archetype (STARTERS.md §3.8). Turn-based transcript with alternating bubbles. User bubbles right-aligned with themePrimary fill and white text; assistant bubbles left-aligned with subtle fill and body text. Composer is pinned to the bottom of the viewer-panel via flex layout (transcript: flex:1 + min-height:0 + overflow-y:auto; composer: flex:0 0 auto). Auto-scroll fires only on append (not on every render) so a user reading earlier history is not yanked back to the bottom. Persist messages with synthos.shared.data.save("<table>", msg) and load via .list("<table>") sorted by createdAt ascending. The assistant call (sendToAssistant) is left as a commented stub — wire it to synthos.generate.completion with the conversation history, or to a page-specific agent, depending on the chat scenario. Replace [Conversation Title] and the subtitle with the user's domain. Use theme tokens (avoid the natural pallet) unless the user requests an alternative color.</div>
|
|
176
|
+
<div id="thoughts" style="display: none;" data-locked="true"></div>
|
|
177
|
+
|
|
178
|
+
<script>
|
|
179
|
+
(function () {
|
|
180
|
+
var transcript = document.getElementById('transcript');
|
|
181
|
+
var emptyState = document.getElementById('emptyState');
|
|
182
|
+
var input = document.getElementById('composerInput');
|
|
183
|
+
var sendBtn = document.getElementById('sendBtn');
|
|
184
|
+
var clearBtn = document.getElementById('clearBtn');
|
|
185
|
+
|
|
186
|
+
var messages = [];
|
|
187
|
+
var pendingTyping = false;
|
|
188
|
+
|
|
189
|
+
function escapeHtml(s) {
|
|
190
|
+
return String(s).replace(/[&<>"']/g, function (c) {
|
|
191
|
+
return ({ '&':'&','<':'<','>':'>','"':'"',"'":''' })[c];
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function fmtTime(iso) {
|
|
196
|
+
if (!iso) return '';
|
|
197
|
+
try {
|
|
198
|
+
var d = new Date(iso);
|
|
199
|
+
return d.toLocaleTimeString([], { hour: 'numeric', minute: '2-digit' });
|
|
200
|
+
} catch (e) { return ''; }
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// Auto-scroll only when the user is already near the bottom
|
|
204
|
+
// (preserves position when user has scrolled up to read history).
|
|
205
|
+
function isPinnedToBottom() {
|
|
206
|
+
var threshold = 80;
|
|
207
|
+
return transcript.scrollHeight - transcript.scrollTop - transcript.clientHeight <= threshold;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
function scrollToBottom() {
|
|
211
|
+
transcript.scrollTop = transcript.scrollHeight;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
function renderMessage(msg) {
|
|
215
|
+
var row = document.createElement('div');
|
|
216
|
+
row.className = 'bubble-row ' + (msg.role === 'user' ? 'user' : 'assistant');
|
|
217
|
+
row.setAttribute('data-id', msg.id);
|
|
218
|
+
var bubble = document.createElement('div');
|
|
219
|
+
bubble.className = 'bubble ' + (msg.role === 'user' ? 'user' : 'assistant');
|
|
220
|
+
bubble.innerHTML = escapeHtml(msg.text) + '<span class="ts">' + escapeHtml(fmtTime(msg.createdAt)) + '</span>';
|
|
221
|
+
row.appendChild(bubble);
|
|
222
|
+
return row;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
function renderAll() {
|
|
226
|
+
transcript.innerHTML = '';
|
|
227
|
+
if (!messages.length) {
|
|
228
|
+
transcript.appendChild(emptyState);
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
messages.forEach(function (m) { transcript.appendChild(renderMessage(m)); });
|
|
232
|
+
scrollToBottom();
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
function appendMessage(msg) {
|
|
236
|
+
if (emptyState.parentNode === transcript) {
|
|
237
|
+
transcript.removeChild(emptyState);
|
|
238
|
+
}
|
|
239
|
+
var pinned = isPinnedToBottom();
|
|
240
|
+
messages.push(msg);
|
|
241
|
+
transcript.appendChild(renderMessage(msg));
|
|
242
|
+
if (pinned) scrollToBottom();
|
|
243
|
+
// synthos.shared.data.save('chat_messages', msg);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
function showTyping() {
|
|
247
|
+
if (pendingTyping) return;
|
|
248
|
+
pendingTyping = true;
|
|
249
|
+
var row = document.createElement('div');
|
|
250
|
+
row.className = 'bubble-row assistant';
|
|
251
|
+
row.id = 'typingRow';
|
|
252
|
+
row.innerHTML = '<div class="bubble assistant"><span class="typing"><span></span><span></span><span></span></span></div>';
|
|
253
|
+
transcript.appendChild(row);
|
|
254
|
+
scrollToBottom();
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
function hideTyping() {
|
|
258
|
+
pendingTyping = false;
|
|
259
|
+
var row = document.getElementById('typingRow');
|
|
260
|
+
if (row) row.parentNode.removeChild(row);
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
function autoSize() {
|
|
264
|
+
input.style.height = 'auto';
|
|
265
|
+
input.style.height = Math.min(input.scrollHeight, 160) + 'px';
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
function send() {
|
|
269
|
+
var text = (input.value || '').trim();
|
|
270
|
+
if (!text) return;
|
|
271
|
+
var userMsg = {
|
|
272
|
+
id: 'm_' + Math.random().toString(36).slice(2, 9),
|
|
273
|
+
role: 'user',
|
|
274
|
+
text: text,
|
|
275
|
+
createdAt: new Date().toISOString()
|
|
276
|
+
};
|
|
277
|
+
appendMessage(userMsg);
|
|
278
|
+
input.value = '';
|
|
279
|
+
autoSize();
|
|
280
|
+
sendToAssistant(userMsg);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
// Replace this stub with a real assistant call.
|
|
284
|
+
// For an LLM-backed chat, plumb the conversation history into
|
|
285
|
+
// synthos.generate.completion (or a page-specific agent) and
|
|
286
|
+
// append the response as a role: 'assistant' message.
|
|
287
|
+
function sendToAssistant(_userMsg) {
|
|
288
|
+
showTyping();
|
|
289
|
+
setTimeout(function () {
|
|
290
|
+
hideTyping();
|
|
291
|
+
var reply = {
|
|
292
|
+
id: 'm_' + Math.random().toString(36).slice(2, 9),
|
|
293
|
+
role: 'assistant',
|
|
294
|
+
text: '[Assistant reply goes here. Wire this stub to synthos.generate.completion or a page-specific agent.]',
|
|
295
|
+
createdAt: new Date().toISOString()
|
|
296
|
+
};
|
|
297
|
+
appendMessage(reply);
|
|
298
|
+
}, 600);
|
|
299
|
+
|
|
300
|
+
// Real wiring (uncomment + adapt):
|
|
301
|
+
// var convo = messages.map(function (m) { return { role: m.role, content: m.text }; });
|
|
302
|
+
// synthos.generate.completion({ messages: convo }).then(function (text) {
|
|
303
|
+
// hideTyping();
|
|
304
|
+
// appendMessage({
|
|
305
|
+
// id: 'm_' + Math.random().toString(36).slice(2, 9),
|
|
306
|
+
// role: 'assistant',
|
|
307
|
+
// text: text,
|
|
308
|
+
// createdAt: new Date().toISOString()
|
|
309
|
+
// });
|
|
310
|
+
// }).catch(function (err) {
|
|
311
|
+
// hideTyping();
|
|
312
|
+
// appendMessage({
|
|
313
|
+
// id: 'm_' + Math.random().toString(36).slice(2, 9),
|
|
314
|
+
// role: 'assistant',
|
|
315
|
+
// text: 'Sorry — could not get a reply (' + (err && err.message ? err.message : 'unknown') + ').',
|
|
316
|
+
// createdAt: new Date().toISOString()
|
|
317
|
+
// });
|
|
318
|
+
// });
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
input.addEventListener('input', autoSize);
|
|
322
|
+
input.addEventListener('keydown', function (e) {
|
|
323
|
+
if (e.key === 'Enter' && !e.shiftKey) {
|
|
324
|
+
e.preventDefault();
|
|
325
|
+
send();
|
|
326
|
+
}
|
|
327
|
+
});
|
|
328
|
+
sendBtn.addEventListener('click', send);
|
|
329
|
+
|
|
330
|
+
clearBtn.addEventListener('click', function () {
|
|
331
|
+
if (!messages.length) return;
|
|
332
|
+
if (!confirm('Clear the conversation?')) return;
|
|
333
|
+
// Remove persisted messages: messages.forEach(function (m) { synthos.shared.data.remove('chat_messages', m.id); });
|
|
334
|
+
messages = [];
|
|
335
|
+
renderAll();
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
// Load persisted history (uncomment to enable):
|
|
339
|
+
// synthos.shared.data.list('chat_messages').then(function (rows) {
|
|
340
|
+
// if (rows && rows.length) {
|
|
341
|
+
// messages = rows.slice().sort(function (a, b) {
|
|
342
|
+
// return (a.createdAt || '').localeCompare(b.createdAt || '');
|
|
343
|
+
// });
|
|
344
|
+
// renderAll();
|
|
345
|
+
// }
|
|
346
|
+
// });
|
|
347
|
+
|
|
348
|
+
renderAll();
|
|
349
|
+
})();
|
|
350
|
+
</script>
|
|
351
|
+
</body></html>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "Chat",
|
|
3
|
+
"description": "Create a turn-based conversation surface for AI companions, support transcripts, role-play, or tutors.",
|
|
4
|
+
"categories": [
|
|
5
|
+
"_Starters"
|
|
6
|
+
],
|
|
7
|
+
"pinned": false,
|
|
8
|
+
"showInAll": false,
|
|
9
|
+
"pageVersion": 3,
|
|
10
|
+
"mode": "unlocked",
|
|
11
|
+
"greeting": "Welcome to the Chat starter — a turn-based transcript scaffold. Tell me what kind of conversation you'd like to build (e.g. customer-support log, AI companion, role-play assistant, language tutor, interview prep) and I'll wire the bubbles, composer, and assistant call.",
|
|
12
|
+
"firstRunGreeting": ""
|
|
13
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
[{"role":"assistant","content":"Welcome to the Checklist starter — a flat list with done/not-done state. Tell me what you'd like to track (e.g. grocery list, packing list, daily tasks, bug-bash list, onboarding checklist, study to-do) and I'll wire the items, filters, and any extra metadata you need."}]
|
|
Binary file
|