@phenx-inc/ctlsurf 0.10.0 → 0.12.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/out/headless/index.mjs +111 -5
- package/out/headless/index.mjs.map +3 -3
- package/out/main/index.js +357 -28
- package/out/preload/index.js +9 -0
- package/out/renderer/assets/{cssMode-BbCVOTaJ.js → cssMode-R8fTFLae.js} +3 -3
- package/out/renderer/assets/{freemarker2-DryLywQv.js → freemarker2-CyjWzWoP.js} +1 -1
- package/out/renderer/assets/{handlebars-CdUMtSdr.js → handlebars-CrhCGIRM.js} +1 -1
- package/out/renderer/assets/{html-Cwkf2GMH.js → html-Cc3dPNZr.js} +1 -1
- package/out/renderer/assets/{htmlMode-C7PzhXxH.js → htmlMode-BWtG6ywk.js} +3 -3
- package/out/renderer/assets/{index-BIceGcz3.css → index-BL9njXIL.css} +206 -46
- package/out/renderer/assets/{index-Dg1vMspf.js → index-kkG56aKv.js} +529 -156
- package/out/renderer/assets/{javascript-Cy7ROXJl.js → javascript-C8T_SdLC.js} +2 -2
- package/out/renderer/assets/{jsonMode-BtZtt3QW.js → jsonMode-D1zR4VVU.js} +3 -3
- package/out/renderer/assets/{liquid-xReAQeYs.js → liquid-COSMe9Uf.js} +1 -1
- package/out/renderer/assets/{lspLanguageFeatures-Dmx0L0Bw.js → lspLanguageFeatures-CXGfrtzl.js} +1 -1
- package/out/renderer/assets/{mdx-YMNFO1Zz.js → mdx-RfS44T-L.js} +1 -1
- package/out/renderer/assets/{python-BExaDVxv.js → python-DFSWKHUu.js} +1 -1
- package/out/renderer/assets/{razor-HL8ANmQ4.js → razor-DtH2_uvo.js} +1 -1
- package/out/renderer/assets/{tsMode-Dqd8vdLE.js → tsMode-BYIQ-S9Z.js} +1 -1
- package/out/renderer/assets/{typescript-Dysz1PTX.js → typescript-HhQUr1Rb.js} +1 -1
- package/out/renderer/assets/{xml-BHp5Z9nc.js → xml-KuhgdKfD.js} +1 -1
- package/out/renderer/assets/{yaml-CPDHxVup.js → yaml-W_kzCFH7.js} +1 -1
- package/out/renderer/index.html +2 -2
- package/package.json +1 -1
- package/src/main/agents.ts +9 -1
- package/src/main/ctlsurfApi.ts +7 -0
- package/src/main/index.ts +118 -34
- package/src/main/orchestrator.ts +105 -4
- package/src/main/ssh.ts +348 -0
- package/src/preload/index.ts +26 -0
- package/src/renderer/App.tsx +29 -7
- package/src/renderer/components/AgentPicker.tsx +18 -0
- package/src/renderer/components/ProjectPicker.tsx +121 -0
- package/src/renderer/components/RemoteConnect.tsx +315 -0
- package/src/renderer/components/TicketPanel.tsx +20 -25
- package/src/renderer/styles.css +206 -46
package/src/renderer/styles.css
CHANGED
|
@@ -1150,6 +1150,9 @@ html, body, #root {
|
|
|
1150
1150
|
border-radius: 12px;
|
|
1151
1151
|
padding: 32px 40px;
|
|
1152
1152
|
min-width: 360px;
|
|
1153
|
+
max-width: 460px;
|
|
1154
|
+
max-height: 88vh;
|
|
1155
|
+
overflow-y: auto;
|
|
1153
1156
|
text-align: center;
|
|
1154
1157
|
}
|
|
1155
1158
|
|
|
@@ -1218,6 +1221,7 @@ html, body, #root {
|
|
|
1218
1221
|
display: flex;
|
|
1219
1222
|
align-items: center;
|
|
1220
1223
|
justify-content: space-between;
|
|
1224
|
+
gap: 16px;
|
|
1221
1225
|
padding: 14px 18px;
|
|
1222
1226
|
background: #16161e;
|
|
1223
1227
|
border: 1px solid #2a2b3d;
|
|
@@ -1236,11 +1240,13 @@ html, body, #root {
|
|
|
1236
1240
|
font-size: 14px;
|
|
1237
1241
|
font-weight: 600;
|
|
1238
1242
|
color: #c0caf5;
|
|
1243
|
+
flex-shrink: 0;
|
|
1239
1244
|
}
|
|
1240
1245
|
|
|
1241
1246
|
.agent-picker-desc {
|
|
1242
1247
|
font-size: 11px;
|
|
1243
1248
|
color: #565f89;
|
|
1249
|
+
text-align: right;
|
|
1244
1250
|
}
|
|
1245
1251
|
|
|
1246
1252
|
.agent-picker-hint {
|
|
@@ -1265,6 +1271,201 @@ html, body, #root {
|
|
|
1265
1271
|
accent-color: #7aa2f7;
|
|
1266
1272
|
}
|
|
1267
1273
|
|
|
1274
|
+
/* ─── Remote (SSH) connect ───────────────────────── */
|
|
1275
|
+
|
|
1276
|
+
.remote-section-label {
|
|
1277
|
+
font-size: 10px;
|
|
1278
|
+
color: #565f89;
|
|
1279
|
+
text-transform: uppercase;
|
|
1280
|
+
letter-spacing: 1px;
|
|
1281
|
+
text-align: left;
|
|
1282
|
+
margin: 16px 0 8px;
|
|
1283
|
+
}
|
|
1284
|
+
|
|
1285
|
+
/* Scroll the host list rather than letting it grow the whole modal. */
|
|
1286
|
+
.remote-host-scroll {
|
|
1287
|
+
max-height: 40vh;
|
|
1288
|
+
overflow-y: auto;
|
|
1289
|
+
padding-right: 4px;
|
|
1290
|
+
}
|
|
1291
|
+
|
|
1292
|
+
/* Project rows: title on top, path muted + truncated below (paths are long). */
|
|
1293
|
+
.project-item {
|
|
1294
|
+
flex-direction: column;
|
|
1295
|
+
align-items: flex-start;
|
|
1296
|
+
gap: 4px;
|
|
1297
|
+
}
|
|
1298
|
+
|
|
1299
|
+
.project-item .agent-picker-name {
|
|
1300
|
+
max-width: 100%;
|
|
1301
|
+
overflow: hidden;
|
|
1302
|
+
text-overflow: ellipsis;
|
|
1303
|
+
white-space: nowrap;
|
|
1304
|
+
}
|
|
1305
|
+
|
|
1306
|
+
.project-item .agent-picker-desc {
|
|
1307
|
+
text-align: left;
|
|
1308
|
+
font-family: 'JetBrains Mono', 'Fira Code', monospace;
|
|
1309
|
+
font-size: 10px;
|
|
1310
|
+
max-width: 100%;
|
|
1311
|
+
overflow: hidden;
|
|
1312
|
+
text-overflow: ellipsis;
|
|
1313
|
+
white-space: nowrap;
|
|
1314
|
+
}
|
|
1315
|
+
|
|
1316
|
+
/* Compact host rows so more fit before scrolling. */
|
|
1317
|
+
.remote-host-scroll .agent-picker-item {
|
|
1318
|
+
padding: 10px 14px;
|
|
1319
|
+
}
|
|
1320
|
+
|
|
1321
|
+
.remote-toggle {
|
|
1322
|
+
display: flex;
|
|
1323
|
+
align-items: center;
|
|
1324
|
+
gap: 8px;
|
|
1325
|
+
margin-bottom: 4px;
|
|
1326
|
+
}
|
|
1327
|
+
|
|
1328
|
+
.remote-toggle-label {
|
|
1329
|
+
font-size: 12px;
|
|
1330
|
+
color: #565f89;
|
|
1331
|
+
}
|
|
1332
|
+
|
|
1333
|
+
.remote-toggle-btn {
|
|
1334
|
+
flex: 1;
|
|
1335
|
+
padding: 8px 10px;
|
|
1336
|
+
background: #16161e;
|
|
1337
|
+
border: 1px solid #2a2b3d;
|
|
1338
|
+
border-radius: 8px;
|
|
1339
|
+
color: #a9b1d6;
|
|
1340
|
+
font-size: 12px;
|
|
1341
|
+
cursor: pointer;
|
|
1342
|
+
transition: all 0.15s;
|
|
1343
|
+
}
|
|
1344
|
+
|
|
1345
|
+
.remote-toggle-btn:hover {
|
|
1346
|
+
border-color: #7aa2f7;
|
|
1347
|
+
}
|
|
1348
|
+
|
|
1349
|
+
.remote-toggle-btn.is-active {
|
|
1350
|
+
border-color: #7aa2f7;
|
|
1351
|
+
background: #1a1b2e;
|
|
1352
|
+
color: #c0caf5;
|
|
1353
|
+
font-weight: 600;
|
|
1354
|
+
}
|
|
1355
|
+
|
|
1356
|
+
.remote-manual {
|
|
1357
|
+
display: flex;
|
|
1358
|
+
gap: 8px;
|
|
1359
|
+
}
|
|
1360
|
+
|
|
1361
|
+
.remote-input {
|
|
1362
|
+
flex: 1;
|
|
1363
|
+
padding: 10px 12px;
|
|
1364
|
+
background: #16161e;
|
|
1365
|
+
border: 1px solid #2a2b3d;
|
|
1366
|
+
border-radius: 8px;
|
|
1367
|
+
color: #c0caf5;
|
|
1368
|
+
font-family: 'JetBrains Mono', 'Fira Code', monospace;
|
|
1369
|
+
font-size: 12px;
|
|
1370
|
+
outline: none;
|
|
1371
|
+
}
|
|
1372
|
+
|
|
1373
|
+
.remote-input:focus {
|
|
1374
|
+
border-color: #7aa2f7;
|
|
1375
|
+
}
|
|
1376
|
+
|
|
1377
|
+
.remote-btn {
|
|
1378
|
+
padding: 10px 16px;
|
|
1379
|
+
background: #7aa2f7;
|
|
1380
|
+
border: none;
|
|
1381
|
+
border-radius: 8px;
|
|
1382
|
+
color: #1f2335;
|
|
1383
|
+
font-size: 12px;
|
|
1384
|
+
font-weight: 600;
|
|
1385
|
+
cursor: pointer;
|
|
1386
|
+
}
|
|
1387
|
+
|
|
1388
|
+
.remote-btn:disabled {
|
|
1389
|
+
opacity: 0.4;
|
|
1390
|
+
cursor: default;
|
|
1391
|
+
}
|
|
1392
|
+
|
|
1393
|
+
.remote-link {
|
|
1394
|
+
margin-top: 18px;
|
|
1395
|
+
background: none;
|
|
1396
|
+
border: none;
|
|
1397
|
+
color: #7aa2f7;
|
|
1398
|
+
font-size: 12px;
|
|
1399
|
+
cursor: pointer;
|
|
1400
|
+
}
|
|
1401
|
+
|
|
1402
|
+
.remote-status {
|
|
1403
|
+
padding: 24px 8px;
|
|
1404
|
+
color: #a9b1d6;
|
|
1405
|
+
font-size: 13px;
|
|
1406
|
+
}
|
|
1407
|
+
|
|
1408
|
+
.remote-status-sub {
|
|
1409
|
+
margin-top: 6px;
|
|
1410
|
+
font-size: 11px;
|
|
1411
|
+
color: #565f89;
|
|
1412
|
+
word-break: break-word;
|
|
1413
|
+
}
|
|
1414
|
+
|
|
1415
|
+
.remote-spinner {
|
|
1416
|
+
width: 22px;
|
|
1417
|
+
height: 22px;
|
|
1418
|
+
margin: 0 auto 14px;
|
|
1419
|
+
border: 2px solid #2a2b3d;
|
|
1420
|
+
border-top-color: #7aa2f7;
|
|
1421
|
+
border-radius: 50%;
|
|
1422
|
+
animation: remote-spin 0.8s linear infinite;
|
|
1423
|
+
}
|
|
1424
|
+
|
|
1425
|
+
@keyframes remote-spin {
|
|
1426
|
+
to { transform: rotate(360deg); }
|
|
1427
|
+
}
|
|
1428
|
+
|
|
1429
|
+
.remote-target-line {
|
|
1430
|
+
font-size: 13px;
|
|
1431
|
+
color: #a9b1d6;
|
|
1432
|
+
margin-bottom: 4px;
|
|
1433
|
+
}
|
|
1434
|
+
|
|
1435
|
+
.remote-note {
|
|
1436
|
+
font-size: 11px;
|
|
1437
|
+
color: #e0af68;
|
|
1438
|
+
background: rgba(224, 175, 104, 0.08);
|
|
1439
|
+
border: 1px solid rgba(224, 175, 104, 0.25);
|
|
1440
|
+
border-radius: 8px;
|
|
1441
|
+
padding: 8px 12px;
|
|
1442
|
+
margin: 8px 0;
|
|
1443
|
+
text-align: left;
|
|
1444
|
+
line-height: 1.4;
|
|
1445
|
+
}
|
|
1446
|
+
|
|
1447
|
+
.remote-error {
|
|
1448
|
+
font-size: 13px;
|
|
1449
|
+
color: #f7768e;
|
|
1450
|
+
margin-bottom: 4px;
|
|
1451
|
+
}
|
|
1452
|
+
|
|
1453
|
+
.remote-pw {
|
|
1454
|
+
margin: 8px 0 4px;
|
|
1455
|
+
}
|
|
1456
|
+
|
|
1457
|
+
.remote-pw .remote-input {
|
|
1458
|
+
width: 100%;
|
|
1459
|
+
box-sizing: border-box;
|
|
1460
|
+
}
|
|
1461
|
+
|
|
1462
|
+
.remote-pw-hint {
|
|
1463
|
+
margin-top: 6px;
|
|
1464
|
+
font-size: 10px;
|
|
1465
|
+
color: #565f89;
|
|
1466
|
+
text-align: left;
|
|
1467
|
+
}
|
|
1468
|
+
|
|
1268
1469
|
/* Settings dialog */
|
|
1269
1470
|
.settings-overlay {
|
|
1270
1471
|
position: fixed;
|
|
@@ -1458,38 +1659,13 @@ html, body, #root {
|
|
|
1458
1659
|
|
|
1459
1660
|
/* ─── Ticket drawer ──────────────────────────────── */
|
|
1460
1661
|
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
inset: 0;
|
|
1464
|
-
background: rgba(13, 14, 22, 0.55);
|
|
1465
|
-
backdrop-filter: blur(2px);
|
|
1466
|
-
opacity: 0;
|
|
1467
|
-
pointer-events: none;
|
|
1468
|
-
transition: opacity 0.2s ease;
|
|
1469
|
-
z-index: 90;
|
|
1470
|
-
}
|
|
1471
|
-
.ticket-scrim.open {
|
|
1472
|
-
opacity: 1;
|
|
1473
|
-
pointer-events: auto;
|
|
1474
|
-
}
|
|
1475
|
-
|
|
1476
|
-
.ticket-drawer {
|
|
1477
|
-
position: fixed;
|
|
1478
|
-
top: 0;
|
|
1479
|
-
right: 0;
|
|
1480
|
-
bottom: 0;
|
|
1481
|
-
width: 380px;
|
|
1482
|
-
background: linear-gradient(180deg, #20243a 0%, #1b1e2e 100%);
|
|
1483
|
-
border-left: 1px solid #343860;
|
|
1484
|
-
box-shadow: -16px 0 48px rgba(0, 0, 0, 0.5);
|
|
1662
|
+
/* Docked side-pane variant: fills its pane (header/body/footer flex column). */
|
|
1663
|
+
.ticket-pane {
|
|
1485
1664
|
display: flex;
|
|
1486
1665
|
flex-direction: column;
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
}
|
|
1491
|
-
.ticket-drawer.open {
|
|
1492
|
-
transform: translateX(0);
|
|
1666
|
+
height: 100%;
|
|
1667
|
+
min-height: 0;
|
|
1668
|
+
background: linear-gradient(180deg, #20243a 0%, #1b1e2e 100%);
|
|
1493
1669
|
}
|
|
1494
1670
|
|
|
1495
1671
|
/* ── header ── */
|
|
@@ -1539,22 +1715,6 @@ html, body, #root {
|
|
|
1539
1715
|
.ticket-drawer-warn {
|
|
1540
1716
|
color: #e0af68;
|
|
1541
1717
|
}
|
|
1542
|
-
.ticket-drawer-close {
|
|
1543
|
-
background: none;
|
|
1544
|
-
border: none;
|
|
1545
|
-
color: #565f89;
|
|
1546
|
-
font-size: 20px;
|
|
1547
|
-
line-height: 1;
|
|
1548
|
-
cursor: pointer;
|
|
1549
|
-
padding: 2px 6px;
|
|
1550
|
-
border-radius: 6px;
|
|
1551
|
-
transition: background 0.12s ease, color 0.12s ease;
|
|
1552
|
-
}
|
|
1553
|
-
.ticket-drawer-close:hover {
|
|
1554
|
-
color: #d5dbf5;
|
|
1555
|
-
background: rgba(255, 255, 255, 0.06);
|
|
1556
|
-
}
|
|
1557
|
-
|
|
1558
1718
|
/* ── body ── */
|
|
1559
1719
|
.ticket-drawer-body {
|
|
1560
1720
|
flex: 1;
|