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.
- package/kernel/api/exec/index.js +67 -0
- package/kernel/api/index.js +1 -0
- package/kernel/bin/caddy.js +1 -1
- package/kernel/index.js +1 -6
- package/kernel/peer.js +23 -5
- package/kernel/plugin.js +24 -41
- package/kernel/prototype.js +25 -0
- package/kernel/router/index.js +13 -0
- package/kernel/router/localhost_home_router.js +11 -0
- package/kernel/shell.js +13 -10
- package/kernel/shells.js +52 -47
- package/kernel/util.js +0 -1
- package/package.json +2 -1
- package/server/index.js +307 -220
- package/server/public/modalinput.js +3 -1
- package/server/public/style.css +1 -1
- package/server/socket.js +0 -19
- package/server/views/500.ejs +7 -6
- package/server/views/app.ejs +76 -11
- package/server/views/d.ejs +123 -12
- package/server/views/index.ejs +69 -1
- package/server/views/init/index.ejs +299 -92
- package/server/views/install.ejs +7 -1
- package/server/views/net.ejs +94 -166
- package/server/views/network.ejs +3 -2
- package/server/views/partials/dynamic.ejs +1 -1
- package/server/views/start.ejs +268 -0
|
@@ -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
|
-
|
|
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.
|
|
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:
|
|
208
|
-
border-bottom-left-radius:
|
|
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:
|
|
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:
|
|
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
|
-
<
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
<
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
<!--
|
|
1509
|
-
<div class="
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
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
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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);
|
package/server/views/install.ejs
CHANGED
|
@@ -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: "
|
|
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)
|