pinokiod 3.24.0 → 3.26.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.
@@ -55,8 +55,21 @@ img.appicon {
55
55
  margin-bottom: 10px;
56
56
  opacity: 0.7;
57
57
  }
58
+ .explain .well {
59
+ margin-top: 20px;
60
+ background: rgba(0,0,0,0.04);
61
+ /*
62
+ border-left: 5px solid rgba(0,0,0,0.1);
63
+ */
64
+ padding: 20px;
65
+ }
66
+ .explain ol {
67
+ padding-inline-start: 15px;
68
+ }
58
69
  .container {
70
+ /*
59
71
  max-width: 800px;
72
+ */
60
73
  /*
61
74
  margin: 0 auto;
62
75
  padding: 2rem;
@@ -86,7 +99,6 @@ h2 {
86
99
  h1 {
87
100
  letter-spacing: 0px;
88
101
  font-size:40px;
89
- text-transform: uppercase;
90
102
  padding-bottom: 20px;
91
103
  }
92
104
 
@@ -169,9 +181,19 @@ body.dark .tab-nav {
169
181
  }
170
182
 
171
183
  */
184
+ .tab-button h5 {
185
+ font-size: 15px;
186
+ width: 100%;
187
+ }
172
188
  .tab-button {
189
+ /*
173
190
  display: block;
174
- padding: 10px 20px;
191
+ */
192
+ display: flex;
193
+ flex-direction: column;
194
+ width: 220px !important;
195
+ gap: 5px;
196
+ padding: 15px 20px;
175
197
  background: none;
176
198
  border: none;
177
199
  cursor: pointer;
@@ -186,9 +208,17 @@ body.dark .tab-nav {
186
208
  border-bottom: 2px solid rgba(0,0,0,0.1);
187
209
  */
188
210
  }
211
+ .tab-button .col {
212
+ display: block;
213
+ }
214
+ /*
215
+ .tab-button i {
216
+ padding: 5px;
217
+ }
218
+ */
189
219
 
190
220
  body.dark .tab-button {
191
- color: rgba(255,255,255,0.6);
221
+ color: rgba(255,255,255,0.5);
192
222
  }
193
223
 
194
224
  .tab-button:hover {
@@ -204,8 +234,8 @@ body.dark .tab-button:hover {
204
234
  .tab-button.active {
205
235
  color: #000;
206
236
  background: rgba(0,0,100,0.04);
207
- border-top-left-radius: 20px;
208
- border-bottom-left-radius: 20px;
237
+ border-top-left-radius: 50px;
238
+ border-bottom-left-radius: 50px;
209
239
  /*
210
240
  background: rgba(0,0,0,0.02);
211
241
  */
@@ -213,6 +243,16 @@ body.dark .tab-button:hover {
213
243
 
214
244
  body.dark .tab-button.active {
215
245
  background: rgba(255,255,255,0.06);
246
+ color: white;
247
+ }
248
+
249
+ .row {
250
+ display: flex;
251
+ align-items: center;
252
+ }
253
+ .row i {
254
+ font-size: 20px;
255
+ padding-right: 15px;
216
256
  }
217
257
 
218
258
  .tab-content {
@@ -367,7 +407,7 @@ body.dark textarea, body.dark input[type="url"], body.dark input[type="text"] {
367
407
  textarea, input[type="url"], input[type="text"] {
368
408
  width: 100%;
369
409
  padding: 10px;
370
- border: 1px solid rgba(0,0,0,0.1);
410
+ border: 2px solid rgba(0,0,0,0.1);
371
411
  font-family: inherit;
372
412
  background: white;
373
413
  }
@@ -441,9 +481,6 @@ textarea:focus, input[type="url"]:focus, input[type="text"]:focus {
441
481
 
442
482
 
443
483
 
444
-
445
-
446
-
447
484
  .online {
448
485
  width: 10px;
449
486
  height: 10px;
@@ -499,7 +536,7 @@ body.dark .m {
499
536
  flex-direction: column;
500
537
  flex-grow: 1;
501
538
  margin: 0 auto;
502
- padding: 50px 0;
539
+ padding: 20px;
503
540
  }
504
541
  body aside {
505
542
  /*
@@ -1106,6 +1143,79 @@ body.dark .bubble {
1106
1143
  body.dark .bubble:before {
1107
1144
  border-color: transparent rgba(0,0,0,0.4) transparent transparent;
1108
1145
  }
1146
+ .ai-prompt-section {
1147
+ display: flex;
1148
+ }
1149
+
1150
+ .ai-tabs {
1151
+ display: flex;
1152
+ flex-direction: column;
1153
+ gap: 5px;
1154
+ margin-bottom: 10px;
1155
+ }
1156
+ .ai-tab:hover {
1157
+ color: royalblue;
1158
+ }
1159
+ body.dark .ai-tab {
1160
+ color: silver;
1161
+ }
1162
+ .ai-tab {
1163
+ color: gray;
1164
+ cursor: pointer;
1165
+ padding: 10px 20px;
1166
+ font-size: 14px;
1167
+ width: 200px;
1168
+ }
1169
+ body.dark .ai-tab.selected {
1170
+ background: rgba(0,0,0,0.1);
1171
+ color: white;
1172
+ }
1173
+ .ai-tab.selected {
1174
+ color: black;
1175
+ background: white;
1176
+ border-top-left-radius: 20px;
1177
+ border-bottom-left-radius: 20px;
1178
+ font-weight: bold;
1179
+ }
1180
+ body.dark .ai-tab-content.selected {
1181
+ background: rgba(0,0,0,0.1);
1182
+ }
1183
+ .ai-tab-content.selected {
1184
+ display: flex;
1185
+ flex-direction: column;
1186
+ gap: 10px;
1187
+ background: white;
1188
+ }
1189
+ .ai-tab-content .ai-input {
1190
+ background: white !important;
1191
+ color: black !important;
1192
+ }
1193
+ .ai-tab-content {
1194
+ min-height: 300px;
1195
+ border-top-right-radius: 20px;
1196
+ border-bottom-right-radius: 20px;
1197
+ display: none;
1198
+ padding: 20px;
1199
+ }
1200
+ .ai-container {
1201
+ flex-grow: 1;
1202
+ }
1203
+ .ai-container h1 {
1204
+ padding: 0;
1205
+ font-size: 30px;
1206
+ /*
1207
+ font-weight: lighter;
1208
+ text-align: center;
1209
+ */
1210
+ font-weight: bold;
1211
+ letter-spacing: -1px;
1212
+ }
1213
+ .md-desc {
1214
+ /*
1215
+ padding-left: 10px;
1216
+ border-left: 10px solid white;
1217
+ */
1218
+ }
1109
1219
 
1110
1220
 
1111
1221
  @media only screen and (max-width: 480px) {
@@ -1244,24 +1354,42 @@ body.dark .ace-editor {
1244
1354
  -->
1245
1355
  <div class="tab-container">
1246
1356
  <div class="tab-nav">
1247
- <!--
1248
- <button type="button" class="tab-button active" data-tab="launcher">
1249
- <i class="fa-solid fa-robot" style="margin-right: 5px;"></i>
1250
- Quick Launcher
1251
- </button>
1252
- -->
1253
- <button type="button" class="tab-button active" data-tab="launcher">
1254
- <i class="fa-solid fa-cloud-arrow-down" style="margin-right: 5px;"></i>
1255
- Git Project Launcher
1256
- </button>
1257
- <button type="button" class="tab-button" data-tab="cli">
1258
- <i class="fa-solid fa-terminal" style="margin-right: 5px;"></i>
1259
- CLI App Launcher
1260
- </button>
1261
- <button type="button" class="tab-button" data-tab="project">
1262
- <i class="fa-regular fa-star" style="margin-right: 5px;"></i>
1263
- New project
1264
- </button>
1357
+ <button type="button" class="tab-button active" data-tab="launcher">
1358
+ <div class='row'>
1359
+ <i class="fa-solid fa-cloud-arrow-down"></i>
1360
+ <div>
1361
+ <h5>Git Launcher</h5>
1362
+ <div>Launch any git-based open source project</div>
1363
+ </div>
1364
+ </div>
1365
+ </button>
1366
+ <button type="button" class="tab-button" data-tab="cli">
1367
+ <div class='row'>
1368
+ <i class="fa-solid fa-terminal"></i>
1369
+ <div>
1370
+ <h5>CLI App Launcher</h5>
1371
+ <div>Run any Terminal app in the browser.</div>
1372
+ </div>
1373
+ </div>
1374
+ </button>
1375
+ <button type="button" class="tab-button" data-tab="project">
1376
+ <div class='row'>
1377
+ <i class="fa-regular fa-pen-to-square"></i>
1378
+ <div>
1379
+ <h5>Empty Launcher</h5>
1380
+ <div>Start a new project with a built-in 1-click launcher.</div>
1381
+ </div>
1382
+ </div>
1383
+ </button>
1384
+ <button type="button" class="tab-button" data-tab="quickcreate">
1385
+ <div class='row'>
1386
+ <i class="fa-solid fa-robot"></i>
1387
+ <div>
1388
+ <h5>AI Engineer</h5>
1389
+ <div>Let AI build a launcher for anything.</div>
1390
+ </div>
1391
+ </div>
1392
+ </button>
1265
1393
  </div>
1266
1394
 
1267
1395
  <form id="bootstrap-form">
@@ -1270,16 +1398,12 @@ body.dark .ace-editor {
1270
1398
  <!--
1271
1399
  <h2>Create a 1-Click Launcher</h2>
1272
1400
  -->
1401
+ <!--
1273
1402
  <div class="header-description">
1274
1403
  <img class='logo2' src="/pinokio-black.png"/>
1275
1404
  <div class='bubble'>Create a launcher for any open source project via git.</div>
1276
1405
  </div>
1277
- <div class="git-url-input">
1278
- <blockquote>Name</blockquote>
1279
- <div class='explain'>Enter a new folder name to create.</div>
1280
- <input type="text" name="foldername-launcher" id="foldername-launcher" placeholder="folder name">
1281
- </div>
1282
-
1406
+ -->
1283
1407
  <div class="git-url-input">
1284
1408
  <blockquote>Git URL</blockquote>
1285
1409
  <div class='explain'>Enter a git repository URL to clone from.</div>
@@ -1364,15 +1488,12 @@ body.dark .ace-editor {
1364
1488
 
1365
1489
  <!-- CLI Tab -->
1366
1490
  <div class="tab-content" id="cli-tab">
1491
+ <!--
1367
1492
  <div class="header-description">
1368
1493
  <img class='logo2' src="/pinokio-black.png"/>
1369
1494
  <div class='bubble'>Create a launcher for any terminal apps (npx, uvx, etc.)</div>
1370
1495
  </div>
1371
- <div class="git-url-input">
1372
- <blockquote>Name</blockquote>
1373
- <div class='explain'>Enter a new folder name to create.</div>
1374
- <input type="text" name="foldername-cli" id="foldername-cli" placeholder="folder name">
1375
- </div>
1496
+ -->
1376
1497
  <blockquote>Type</blockquote>
1377
1498
  <div class='explain'>Single-command apps vs. Installable apps.</div>
1378
1499
  <div class="project-options">
@@ -1419,15 +1540,12 @@ body.dark .ace-editor {
1419
1540
 
1420
1541
  <!-- Project Tab -->
1421
1542
  <div class="tab-content" id="project-tab">
1543
+ <!--
1422
1544
  <div class="header-description">
1423
1545
  <img class='logo2' src="/pinokio-black.png"/>
1424
1546
  <div class='bubble'>Create a new project with a built-in 1-click launcher</div>
1425
1547
  </div>
1426
- <div class="git-url-input">
1427
- <blockquote>Name</blockquote>
1428
- <div class='explain'>Enter a new folder name to create.</div>
1429
- <input type="text" name="foldername-new" id="foldername-new" placeholder="folder name">
1430
- </div>
1548
+ -->
1431
1549
  <blockquote>Type</blockquote>
1432
1550
  <div class='explain'>Set up a new 1-click launcher project.</div>
1433
1551
  <div class="project-options">
@@ -1505,18 +1623,49 @@ body.dark .ace-editor {
1505
1623
 
1506
1624
  </div>
1507
1625
 
1508
- <!-- AI Prompt Section (shared across both tabs) -->
1509
- <div class="ai-prompt-section" style="margin-top: 2rem;">
1510
- <!--
1511
- <h2>AI Prompt (Optional)</h2>
1512
- <p>Enter a prompt to build your app with AI assistance.</p>
1513
- -->
1514
- <blockquote>What do you want to build?</blockquote>
1515
- <div class='explain'>(Optional) Explain what the project should do. Will be saved as README.md, and will be automatically used by AI Coding tools to build the app.</div>
1626
+ <!-- Quick Create Tab -->
1627
+ <div class="tab-content" id="quickcreate-tab">
1628
+ <div class="ai-prompt-section">
1629
+ <div class='ai-tabs'>
1630
+ <% ai.forEach((item, i) => { %>
1631
+ <div data-title="<%=item.title%>" class='ai-tab <%=i===0 ? "selected" : ""%>'><%=item.title%></div>
1632
+ <% }) %>
1633
+ </div>
1634
+ <div class='ai-container'>
1635
+ <% ai.forEach((item, i) => { %>
1636
+ <div data-meta="<%=JSON.stringify(item.data)%>" class='ai-tab-content <%=i===0 ? "selected" : ""%>' data-title="<%=item.title%>">
1637
+ <h1><%=item.title%></h1>
1638
+ <div class='md-desc'><%=item.description%></div>
1639
+ <% Object.keys(item.meta).forEach((key) => { %>
1640
+ <% if (!key.startsWith(".")) { %>
1641
+ <input class='ai-input' type='text' placeholder='<%=item.meta[key]%>' name='<%=key%>'>
1642
+ <% } %>
1643
+ <% }) %>
1644
+ <textarea placeholder="<%=item.description%>"><%=item.content%></textarea>
1645
+ <pre class='hidden'><%=item.content%></pre>
1646
+ </div>
1647
+ <% }) %>
1648
+ </div>
1516
1649
  <!--
1517
- <blockquote>The prompt will be stored in README.md, and ANY AI coding tool will be automatically instructed about the project (Just say "build the app").</blockquote>
1518
- -->
1519
- <div id="aiPrompt" class="ace-editor" data-name="aiPrompt" data-placeholder="Describe what you want to build... (optional)" style="height: 150px;"></div>
1650
+ <blockquote>What do you want to build?</blockquote>
1651
+ -->
1652
+ <textarea class='hidden' id='aiPrompt' data-name="aiPrompt" data-placeholder="Describe what you want to build..." placeholder="What do you want to build?"></textarea>
1653
+ <!--
1654
+ <div id="aiPrompt" class="ace-editor" data-name="aiPrompt" data-placeholder="Describe what you want to build..." style="height: 150px;"></div>
1655
+ -->
1656
+
1657
+ <!--
1658
+ <div class='explain'>
1659
+ <div class='well'>
1660
+ <ol>
1661
+ <li>Describe what the project should do, and click "create".</li>
1662
+ <li>This will be saved inside README.md.</li>
1663
+ <li>AI coding tools will automatically read the README.md file to figure out what to build. You just need to tell them to "build".</li>
1664
+ </ol>
1665
+ </div>
1666
+ </div>
1667
+ -->
1668
+ </div>
1520
1669
  </div>
1521
1670
 
1522
1671
  <div class="button-group" style="margin-top: 2rem;">
@@ -1529,9 +1678,51 @@ body.dark .ace-editor {
1529
1678
  </div>
1530
1679
  </main>
1531
1680
  <script>
1681
+ const resizeAITextarea = () => {
1682
+ let textarea = document.querySelector(".ai-container .ai-tab-content.selected textarea")
1683
+ textarea.style.height = "";
1684
+ textarea.style.height = textarea.scrollHeight + "px";
1685
+ }
1532
1686
  document.addEventListener('DOMContentLoaded', function() {
1533
1687
  // Initialize tabs
1534
1688
  initializeTabs();
1689
+
1690
+ document.querySelector(".ai-tabs").addEventListener("click", (e) => {
1691
+ if (e.target.classList.contains("ai-tab")) {
1692
+ document.querySelectorAll(".ai-tab").forEach((el) => {
1693
+ el.classList.remove('selected')
1694
+ })
1695
+ e.target.classList.add("selected")
1696
+ document.querySelectorAll(`.ai-tab-content`).forEach((el) => {
1697
+ el.classList.remove("selected")
1698
+ })
1699
+ let title = e.target.getAttribute("data-title")
1700
+ document.querySelector(`.ai-tab-content[data-title="${title}"]`).classList.add('selected')
1701
+ resizeAITextarea()
1702
+ }
1703
+ })
1704
+ document.querySelectorAll(".ai-tab-content").forEach((tab) => {
1705
+ tab.addEventListener("input", (e) => {
1706
+ if (e.target.classList.contains("ai-input")) {
1707
+ let name = e.target.name
1708
+ // get all values from all ai-input and replace
1709
+ let els = e.target.closest(".ai-tab-content").querySelectorAll(".ai-input")
1710
+ let vals = {}
1711
+ let pre = e.target.closest(".ai-tab-content").querySelector("pre")
1712
+ let textarea = e.target.closest(".ai-tab-content").querySelector("textarea")
1713
+ resizeAITextarea()
1714
+ let md = pre.textContent
1715
+ for(let el of els) {
1716
+ let pattern = `{{${el.name}}}`
1717
+ md = md.replaceAll(pattern, el.value)
1718
+ }
1719
+ textarea.value = md
1720
+ document.querySelector("#aiPrompt").value = md
1721
+ console.log("MD", md)
1722
+ }
1723
+ })
1724
+ })
1725
+
1535
1726
 
1536
1727
  // Show launcher tab by default
1537
1728
  showTab('launcher');
@@ -1686,6 +1877,11 @@ function showTab(tabName) {
1686
1877
  if (tabName !== 'cli') {
1687
1878
  clearCliInputs();
1688
1879
  }
1880
+
1881
+ if (tabName === "quickcreate") {
1882
+ resizeAITextarea()
1883
+ }
1884
+
1689
1885
  }
1690
1886
 
1691
1887
  function hideAllConditionalOptions() {
@@ -1884,7 +2080,8 @@ function validateForm() {
1884
2080
  const activeTab = document.querySelector('.tab-content.active').id;
1885
2081
  const isLauncher = activeTab === 'launcher-tab';
1886
2082
  const isCli = activeTab === 'cli-tab';
1887
- const gitUrl = document.getElementById('gitUrl').value.trim();
2083
+ const isQuickCreate = activeTab === 'quickcreate-tab';
2084
+ const gitUrl = document.getElementById('gitUrl').value.trim();
1888
2085
 
1889
2086
  // Validate Git URL for launcher tab
1890
2087
  if (isLauncher) {
@@ -1893,15 +2090,6 @@ function validateForm() {
1893
2090
  alert('Please enter a Git repository URL.');
1894
2091
  return false;
1895
2092
  }
1896
- const name = document.getElementById('foldername-launcher').value.trim();
1897
- if (!name) {
1898
- alert('Please enter a folder name.');
1899
- return false;
1900
- }
1901
- if (name.includes(" ")) {
1902
- alert('No spaces allowed');
1903
- return false;
1904
- }
1905
2093
 
1906
2094
  const projectType = document.querySelector('input[name="projectType"]:checked');
1907
2095
  if (!projectType) {
@@ -1917,16 +2105,6 @@ function validateForm() {
1917
2105
  alert('Please select a CLI type.');
1918
2106
  return false;
1919
2107
  }
1920
-
1921
- const name = document.getElementById('foldername-cli').value.trim();
1922
- if (!name) {
1923
- alert('Please enter a folder name.');
1924
- return false;
1925
- }
1926
- if (name.includes(" ")) {
1927
- alert('No spaces allowed');
1928
- return false;
1929
- }
1930
2108
 
1931
2109
  if (cliType.value === 'instant') {
1932
2110
  const launchCommand = document.querySelector('input[name="launchCommand"]').value.trim();
@@ -1948,23 +2126,18 @@ function validateForm() {
1948
2126
  }
1949
2127
  }
1950
2128
 
2129
+ // Validate quick create tab
2130
+ if (isQuickCreate) {
2131
+ // No additional validation needed for quick create
2132
+ }
2133
+
1951
2134
  // Validate project tab
1952
- if (!isLauncher && !isCli) {
2135
+ if (!isLauncher && !isCli && !isQuickCreate) {
1953
2136
  const projectType = document.querySelector('input[name="projectType"]:checked');
1954
2137
  if (!projectType) {
1955
2138
  alert('Please select a project type.');
1956
2139
  return false;
1957
2140
  }
1958
-
1959
- const name = document.getElementById('foldername-new').value.trim();
1960
- if (!name) {
1961
- alert('Please enter a folder name.');
1962
- return false;
1963
- }
1964
- if (name.includes(" ")) {
1965
- alert('No spaces allowed');
1966
- return false;
1967
- }
1968
2141
 
1969
2142
  // Validate Documentation options
1970
2143
  if (projectType.value === 'documentation') {
@@ -1995,15 +2168,44 @@ function validateForm() {
1995
2168
 
1996
2169
  function handleSubmit(event) {
1997
2170
  event.preventDefault();
2171
+
2172
+ let aiTab = document.querySelector(".ai-tab-content.selected textarea")
2173
+ let aiMeta = null
2174
+ if (aiTab && aiTab.value) {
2175
+ document.querySelector("#aiPrompt").value = aiTab.value
2176
+ let ai_meta_str = aiTab.closest(".ai-tab-content").getAttribute("data-meta")
2177
+ aiMeta = JSON.parse(ai_meta_str)
2178
+ }
2179
+ console.log({ aiMeta })
2180
+
2181
+
1998
2182
 
1999
2183
  if (!validateForm()) {
2000
2184
  return;
2001
2185
  }
2002
2186
 
2187
+ // Prompt for folder name
2188
+ let name = prompt('Enter a folder name to create:');
2189
+ if (!name) {
2190
+ return; // User cancelled or entered empty name
2191
+ }
2192
+
2193
+ name = name.trim();
2194
+ if (!name) {
2195
+ alert('Please enter a valid folder name.');
2196
+ return;
2197
+ }
2198
+
2199
+ if (name.includes(' ')) {
2200
+ alert('No spaces allowed in folder names.');
2201
+ return;
2202
+ }
2203
+
2003
2204
  const formData = new FormData(event.target);
2004
2205
  const activeTab = document.querySelector('.tab-content.active').id;
2005
2206
  const isLauncher = activeTab === 'launcher-tab';
2006
2207
  const isCli = activeTab === 'cli-tab';
2208
+ const isQuickCreate = activeTab === 'quickcreate-tab';
2007
2209
  const gitUrl = isLauncher ? formData.get('gitUrl').trim() : '';
2008
2210
 
2009
2211
  // Get values from Ace editors and clean them
@@ -2011,22 +2213,26 @@ function handleSubmit(event) {
2011
2213
  const cloneStartCommandText = aceEditors['cloneStartCommand'] ? aceEditors['cloneStartCommand'].getValue().trim() : '';
2012
2214
  const installCommandText = aceEditors['installCommand'] ? aceEditors['installCommand'].getValue().trim() : '';
2013
2215
  const installableLaunchCommandText = aceEditors['installableLaunchCommand'] ? aceEditors['installableLaunchCommand'].getValue().trim() : '';
2014
- const aiPromptText = aceEditors['aiPrompt'] ? aceEditors['aiPrompt'].getValue().trim() : '';
2216
+
2217
+ // Only get AI prompt text if Quick Create tab is active
2218
+ // const aiPromptText = isQuickCreate && aceEditors['aiPrompt'] ? aceEditors['aiPrompt'].getValue().trim() : '';
2219
+ const aiPromptText = isQuickCreate && document.querySelector("#aiPrompt") ? document.querySelector("#aiPrompt").value.trim() : '';
2015
2220
 
2016
2221
  // Set startType and projectType based on active tab
2017
- let startType, projectType, name;
2222
+ let startType, projectType;
2018
2223
  if (isLauncher) {
2019
2224
  startType = 'clone';
2020
2225
  projectType = formData.get('projectType');
2021
- name = formData.get("foldername-launcher").trim();
2022
2226
  } else if (isCli) {
2023
2227
  startType = 'new';
2024
2228
  projectType = 'cli';
2025
- name = formData.get("foldername-cli").trim();
2229
+ } else if (isQuickCreate) {
2230
+ startType = 'new';
2231
+ //projectType = 'empty';
2232
+ projectType = 'ai';
2026
2233
  } else {
2027
2234
  startType = 'new';
2028
2235
  projectType = formData.get('projectType');
2029
- name = formData.get("foldername-new").trim();
2030
2236
  }
2031
2237
 
2032
2238
  // For CLI category, map the projectType to cliType for backwards compatibility
@@ -2056,7 +2262,8 @@ function handleSubmit(event) {
2056
2262
  docType: formData.get('docType'),
2057
2263
  localDocPath: formData.get('localDocPath'),
2058
2264
  remoteDocUrl: formData.get('remoteDocUrl'),
2059
- aiPrompt: aiPromptText
2265
+ aiPrompt: aiPromptText,
2266
+ aiMeta,
2060
2267
  };
2061
2268
 
2062
2269
  displayResults(config);
@@ -269,7 +269,7 @@ document.addEventListener("DOMContentLoaded", async () => {
269
269
  //term.write("\r\n" + packet.data + "\r\n")
270
270
  ModalInput({
271
271
  title: "Error",
272
- type: "moddal",
272
+ type: "modal",
273
273
  description: packet.data
274
274
  })
275
275
  } else if (packet.type === "notify3") {
@@ -285,6 +285,12 @@ document.addEventListener("DOMContentLoaded", async () => {
285
285
  document.querySelector("#status-screen").innerHTML = packet.data.html
286
286
  let audio = new Audio("/pop.mp3")
287
287
  audio.play()
288
+ ModalInput({
289
+ title: "Notice",
290
+ type: "modal",
291
+ description: packet.data.html,
292
+ confirm: "OK",
293
+ })
288
294
  }
289
295
  } else if (packet.type === "notify2") {
290
296
  console.log("HTML", packet.data)