@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
@@ -8536,6 +8536,9 @@ html, body, #root {
8536
8536
  border-radius: 12px;
8537
8537
  padding: 32px 40px;
8538
8538
  min-width: 360px;
8539
+ max-width: 460px;
8540
+ max-height: 88vh;
8541
+ overflow-y: auto;
8539
8542
  text-align: center;
8540
8543
  }
8541
8544
 
@@ -8604,6 +8607,7 @@ html, body, #root {
8604
8607
  display: flex;
8605
8608
  align-items: center;
8606
8609
  justify-content: space-between;
8610
+ gap: 16px;
8607
8611
  padding: 14px 18px;
8608
8612
  background: #16161e;
8609
8613
  border: 1px solid #2a2b3d;
@@ -8622,11 +8626,13 @@ html, body, #root {
8622
8626
  font-size: 14px;
8623
8627
  font-weight: 600;
8624
8628
  color: #c0caf5;
8629
+ flex-shrink: 0;
8625
8630
  }
8626
8631
 
8627
8632
  .agent-picker-desc {
8628
8633
  font-size: 11px;
8629
8634
  color: #565f89;
8635
+ text-align: right;
8630
8636
  }
8631
8637
 
8632
8638
  .agent-picker-hint {
@@ -8651,6 +8657,201 @@ html, body, #root {
8651
8657
  accent-color: #7aa2f7;
8652
8658
  }
8653
8659
 
8660
+ /* ─── Remote (SSH) connect ───────────────────────── */
8661
+
8662
+ .remote-section-label {
8663
+ font-size: 10px;
8664
+ color: #565f89;
8665
+ text-transform: uppercase;
8666
+ letter-spacing: 1px;
8667
+ text-align: left;
8668
+ margin: 16px 0 8px;
8669
+ }
8670
+
8671
+ /* Scroll the host list rather than letting it grow the whole modal. */
8672
+ .remote-host-scroll {
8673
+ max-height: 40vh;
8674
+ overflow-y: auto;
8675
+ padding-right: 4px;
8676
+ }
8677
+
8678
+ /* Project rows: title on top, path muted + truncated below (paths are long). */
8679
+ .project-item {
8680
+ flex-direction: column;
8681
+ align-items: flex-start;
8682
+ gap: 4px;
8683
+ }
8684
+
8685
+ .project-item .agent-picker-name {
8686
+ max-width: 100%;
8687
+ overflow: hidden;
8688
+ text-overflow: ellipsis;
8689
+ white-space: nowrap;
8690
+ }
8691
+
8692
+ .project-item .agent-picker-desc {
8693
+ text-align: left;
8694
+ font-family: 'JetBrains Mono', 'Fira Code', monospace;
8695
+ font-size: 10px;
8696
+ max-width: 100%;
8697
+ overflow: hidden;
8698
+ text-overflow: ellipsis;
8699
+ white-space: nowrap;
8700
+ }
8701
+
8702
+ /* Compact host rows so more fit before scrolling. */
8703
+ .remote-host-scroll .agent-picker-item {
8704
+ padding: 10px 14px;
8705
+ }
8706
+
8707
+ .remote-toggle {
8708
+ display: flex;
8709
+ align-items: center;
8710
+ gap: 8px;
8711
+ margin-bottom: 4px;
8712
+ }
8713
+
8714
+ .remote-toggle-label {
8715
+ font-size: 12px;
8716
+ color: #565f89;
8717
+ }
8718
+
8719
+ .remote-toggle-btn {
8720
+ flex: 1;
8721
+ padding: 8px 10px;
8722
+ background: #16161e;
8723
+ border: 1px solid #2a2b3d;
8724
+ border-radius: 8px;
8725
+ color: #a9b1d6;
8726
+ font-size: 12px;
8727
+ cursor: pointer;
8728
+ transition: all 0.15s;
8729
+ }
8730
+
8731
+ .remote-toggle-btn:hover {
8732
+ border-color: #7aa2f7;
8733
+ }
8734
+
8735
+ .remote-toggle-btn.is-active {
8736
+ border-color: #7aa2f7;
8737
+ background: #1a1b2e;
8738
+ color: #c0caf5;
8739
+ font-weight: 600;
8740
+ }
8741
+
8742
+ .remote-manual {
8743
+ display: flex;
8744
+ gap: 8px;
8745
+ }
8746
+
8747
+ .remote-input {
8748
+ flex: 1;
8749
+ padding: 10px 12px;
8750
+ background: #16161e;
8751
+ border: 1px solid #2a2b3d;
8752
+ border-radius: 8px;
8753
+ color: #c0caf5;
8754
+ font-family: 'JetBrains Mono', 'Fira Code', monospace;
8755
+ font-size: 12px;
8756
+ outline: none;
8757
+ }
8758
+
8759
+ .remote-input:focus {
8760
+ border-color: #7aa2f7;
8761
+ }
8762
+
8763
+ .remote-btn {
8764
+ padding: 10px 16px;
8765
+ background: #7aa2f7;
8766
+ border: none;
8767
+ border-radius: 8px;
8768
+ color: #1f2335;
8769
+ font-size: 12px;
8770
+ font-weight: 600;
8771
+ cursor: pointer;
8772
+ }
8773
+
8774
+ .remote-btn:disabled {
8775
+ opacity: 0.4;
8776
+ cursor: default;
8777
+ }
8778
+
8779
+ .remote-link {
8780
+ margin-top: 18px;
8781
+ background: none;
8782
+ border: none;
8783
+ color: #7aa2f7;
8784
+ font-size: 12px;
8785
+ cursor: pointer;
8786
+ }
8787
+
8788
+ .remote-status {
8789
+ padding: 24px 8px;
8790
+ color: #a9b1d6;
8791
+ font-size: 13px;
8792
+ }
8793
+
8794
+ .remote-status-sub {
8795
+ margin-top: 6px;
8796
+ font-size: 11px;
8797
+ color: #565f89;
8798
+ word-break: break-word;
8799
+ }
8800
+
8801
+ .remote-spinner {
8802
+ width: 22px;
8803
+ height: 22px;
8804
+ margin: 0 auto 14px;
8805
+ border: 2px solid #2a2b3d;
8806
+ border-top-color: #7aa2f7;
8807
+ border-radius: 50%;
8808
+ animation: remote-spin 0.8s linear infinite;
8809
+ }
8810
+
8811
+ @keyframes remote-spin {
8812
+ to { transform: rotate(360deg); }
8813
+ }
8814
+
8815
+ .remote-target-line {
8816
+ font-size: 13px;
8817
+ color: #a9b1d6;
8818
+ margin-bottom: 4px;
8819
+ }
8820
+
8821
+ .remote-note {
8822
+ font-size: 11px;
8823
+ color: #e0af68;
8824
+ background: rgba(224, 175, 104, 0.08);
8825
+ border: 1px solid rgba(224, 175, 104, 0.25);
8826
+ border-radius: 8px;
8827
+ padding: 8px 12px;
8828
+ margin: 8px 0;
8829
+ text-align: left;
8830
+ line-height: 1.4;
8831
+ }
8832
+
8833
+ .remote-error {
8834
+ font-size: 13px;
8835
+ color: #f7768e;
8836
+ margin-bottom: 4px;
8837
+ }
8838
+
8839
+ .remote-pw {
8840
+ margin: 8px 0 4px;
8841
+ }
8842
+
8843
+ .remote-pw .remote-input {
8844
+ width: 100%;
8845
+ box-sizing: border-box;
8846
+ }
8847
+
8848
+ .remote-pw-hint {
8849
+ margin-top: 6px;
8850
+ font-size: 10px;
8851
+ color: #565f89;
8852
+ text-align: left;
8853
+ }
8854
+
8654
8855
  /* Settings dialog */
8655
8856
  .settings-overlay {
8656
8857
  position: fixed;
@@ -8844,38 +9045,13 @@ html, body, #root {
8844
9045
 
8845
9046
  /* ─── Ticket drawer ──────────────────────────────── */
8846
9047
 
8847
- .ticket-scrim {
8848
- position: fixed;
8849
- inset: 0;
8850
- background: rgba(13, 14, 22, 0.55);
8851
- backdrop-filter: blur(2px);
8852
- opacity: 0;
8853
- pointer-events: none;
8854
- transition: opacity 0.2s ease;
8855
- z-index: 90;
8856
- }
8857
- .ticket-scrim.open {
8858
- opacity: 1;
8859
- pointer-events: auto;
8860
- }
8861
-
8862
- .ticket-drawer {
8863
- position: fixed;
8864
- top: 0;
8865
- right: 0;
8866
- bottom: 0;
8867
- width: 380px;
8868
- background: linear-gradient(180deg, #20243a 0%, #1b1e2e 100%);
8869
- border-left: 1px solid #343860;
8870
- box-shadow: -16px 0 48px rgba(0, 0, 0, 0.5);
9048
+ /* Docked side-pane variant: fills its pane (header/body/footer flex column). */
9049
+ .ticket-pane {
8871
9050
  display: flex;
8872
9051
  flex-direction: column;
8873
- transform: translateX(100%);
8874
- transition: transform 0.24s cubic-bezier(0.32, 0.72, 0, 1);
8875
- z-index: 100;
8876
- }
8877
- .ticket-drawer.open {
8878
- transform: translateX(0);
9052
+ height: 100%;
9053
+ min-height: 0;
9054
+ background: linear-gradient(180deg, #20243a 0%, #1b1e2e 100%);
8879
9055
  }
8880
9056
 
8881
9057
  /* ── header ── */
@@ -8925,22 +9101,6 @@ html, body, #root {
8925
9101
  .ticket-drawer-warn {
8926
9102
  color: #e0af68;
8927
9103
  }
8928
- .ticket-drawer-close {
8929
- background: none;
8930
- border: none;
8931
- color: #565f89;
8932
- font-size: 20px;
8933
- line-height: 1;
8934
- cursor: pointer;
8935
- padding: 2px 6px;
8936
- border-radius: 6px;
8937
- transition: background 0.12s ease, color 0.12s ease;
8938
- }
8939
- .ticket-drawer-close:hover {
8940
- color: #d5dbf5;
8941
- background: rgba(255, 255, 255, 0.06);
8942
- }
8943
-
8944
9104
  /* ── body ── */
8945
9105
  .ticket-drawer-body {
8946
9106
  flex: 1;