@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.
Files changed (36) hide show
  1. package/out/headless/index.mjs +111 -5
  2. package/out/headless/index.mjs.map +3 -3
  3. package/out/main/index.js +357 -28
  4. package/out/preload/index.js +9 -0
  5. package/out/renderer/assets/{cssMode-BbCVOTaJ.js → cssMode-R8fTFLae.js} +3 -3
  6. package/out/renderer/assets/{freemarker2-DryLywQv.js → freemarker2-CyjWzWoP.js} +1 -1
  7. package/out/renderer/assets/{handlebars-CdUMtSdr.js → handlebars-CrhCGIRM.js} +1 -1
  8. package/out/renderer/assets/{html-Cwkf2GMH.js → html-Cc3dPNZr.js} +1 -1
  9. package/out/renderer/assets/{htmlMode-C7PzhXxH.js → htmlMode-BWtG6ywk.js} +3 -3
  10. package/out/renderer/assets/{index-BIceGcz3.css → index-BL9njXIL.css} +206 -46
  11. package/out/renderer/assets/{index-Dg1vMspf.js → index-kkG56aKv.js} +529 -156
  12. package/out/renderer/assets/{javascript-Cy7ROXJl.js → javascript-C8T_SdLC.js} +2 -2
  13. package/out/renderer/assets/{jsonMode-BtZtt3QW.js → jsonMode-D1zR4VVU.js} +3 -3
  14. package/out/renderer/assets/{liquid-xReAQeYs.js → liquid-COSMe9Uf.js} +1 -1
  15. package/out/renderer/assets/{lspLanguageFeatures-Dmx0L0Bw.js → lspLanguageFeatures-CXGfrtzl.js} +1 -1
  16. package/out/renderer/assets/{mdx-YMNFO1Zz.js → mdx-RfS44T-L.js} +1 -1
  17. package/out/renderer/assets/{python-BExaDVxv.js → python-DFSWKHUu.js} +1 -1
  18. package/out/renderer/assets/{razor-HL8ANmQ4.js → razor-DtH2_uvo.js} +1 -1
  19. package/out/renderer/assets/{tsMode-Dqd8vdLE.js → tsMode-BYIQ-S9Z.js} +1 -1
  20. package/out/renderer/assets/{typescript-Dysz1PTX.js → typescript-HhQUr1Rb.js} +1 -1
  21. package/out/renderer/assets/{xml-BHp5Z9nc.js → xml-KuhgdKfD.js} +1 -1
  22. package/out/renderer/assets/{yaml-CPDHxVup.js → yaml-W_kzCFH7.js} +1 -1
  23. package/out/renderer/index.html +2 -2
  24. package/package.json +1 -1
  25. package/src/main/agents.ts +9 -1
  26. package/src/main/ctlsurfApi.ts +7 -0
  27. package/src/main/index.ts +118 -34
  28. package/src/main/orchestrator.ts +105 -4
  29. package/src/main/ssh.ts +348 -0
  30. package/src/preload/index.ts +26 -0
  31. package/src/renderer/App.tsx +29 -7
  32. package/src/renderer/components/AgentPicker.tsx +18 -0
  33. package/src/renderer/components/ProjectPicker.tsx +121 -0
  34. package/src/renderer/components/RemoteConnect.tsx +315 -0
  35. package/src/renderer/components/TicketPanel.tsx +20 -25
  36. package/src/renderer/styles.css +206 -46
@@ -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
- .ticket-scrim {
1462
- position: fixed;
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
- transform: translateX(100%);
1488
- transition: transform 0.24s cubic-bezier(0.32, 0.72, 0, 1);
1489
- z-index: 100;
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;