@phenx-inc/ctlsurf 0.3.13 → 0.3.15

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 (35) hide show
  1. package/bin/ctlsurf-worker.js +38 -22
  2. package/out/headless/index.mjs +295 -3
  3. package/out/headless/index.mjs.map +4 -4
  4. package/out/main/index.js +351 -48
  5. package/out/preload/index.js +11 -0
  6. package/out/renderer/assets/{cssMode-CYoo4t9f.js → cssMode-D5dPwEy5.js} +3 -3
  7. package/out/renderer/assets/{freemarker2--UQnPZsn.js → freemarker2-c5jJjQ9s.js} +1 -1
  8. package/out/renderer/assets/{handlebars-DVDrmX0C.js → handlebars-BTbmOxx9.js} +1 -1
  9. package/out/renderer/assets/{html-D1-cXoLy.js → html-3cIIQcxO.js} +1 -1
  10. package/out/renderer/assets/{htmlMode-f5nBuprq.js → htmlMode-DYbpW1yY.js} +3 -3
  11. package/out/renderer/assets/{index-65hyKM_8.css → index-6KvOnYL1.css} +404 -0
  12. package/out/renderer/assets/{index-D23nru43.js → index-D2MUZin7.js} +332 -23
  13. package/out/renderer/assets/{javascript-CcarFzBL.js → javascript-CDuCMm-6.js} +2 -2
  14. package/out/renderer/assets/{jsonMode-BvF-xK9U.js → jsonMode-COLqbq0s.js} +3 -3
  15. package/out/renderer/assets/{liquid-CHLtUKl2.js → liquid-BFcqZizB.js} +1 -1
  16. package/out/renderer/assets/{lspLanguageFeatures-B9aNeatS.js → lspLanguageFeatures-CbkEcL-z.js} +1 -1
  17. package/out/renderer/assets/{mdx-HGDrkifZ.js → mdx-DyK93oEE.js} +1 -1
  18. package/out/renderer/assets/{python-B_dPzjJ6.js → python-D4lCwSVr.js} +1 -1
  19. package/out/renderer/assets/{razor-CHheM4ot.js → razor-DdkE9XVt.js} +1 -1
  20. package/out/renderer/assets/{tsMode-CdC3i1gG.js → tsMode-BrQ4Fsc-.js} +1 -1
  21. package/out/renderer/assets/{typescript-BX6guVRK.js → typescript-BakbYMnC.js} +1 -1
  22. package/out/renderer/assets/{xml-CpS-pOPE.js → xml-DHDW9Xhp.js} +1 -1
  23. package/out/renderer/assets/{yaml-Du0AjOHW.js → yaml-1Ayv_J3q.js} +1 -1
  24. package/out/renderer/index.html +2 -2
  25. package/package.json +1 -1
  26. package/src/main/agents.ts +36 -1
  27. package/src/main/ctlsurfApi.ts +11 -0
  28. package/src/main/headless.ts +5 -3
  29. package/src/main/index.ts +24 -2
  30. package/src/main/orchestrator.ts +66 -0
  31. package/src/main/ticketStore.ts +252 -0
  32. package/src/preload/index.ts +17 -0
  33. package/src/renderer/App.tsx +40 -1
  34. package/src/renderer/components/TicketPanel.tsx +308 -0
  35. package/src/renderer/styles.css +404 -0
@@ -24,6 +24,12 @@ const api = {
24
24
  // App info
25
25
  getHomePath: () => electron.ipcRenderer.invoke("app:homePath"),
26
26
  getCwd: () => electron.ipcRenderer.invoke("app:cwd"),
27
+ getProjectName: () => electron.ipcRenderer.invoke("app:projectName"),
28
+ onProjectChanged: (callback) => {
29
+ const listener = (_event, name) => callback(name);
30
+ electron.ipcRenderer.on("app:projectChanged", listener);
31
+ return () => electron.ipcRenderer.removeListener("app:projectChanged", listener);
32
+ },
27
33
  browseCwd: () => electron.ipcRenderer.invoke("app:browseCwd"),
28
34
  getVersion: () => electron.ipcRenderer.invoke("app:getVersion"),
29
35
  getUpdateInfo: () => electron.ipcRenderer.invoke("app:getUpdateInfo"),
@@ -45,6 +51,11 @@ const api = {
45
51
  // Tracking (active tab)
46
52
  getTracking: () => electron.ipcRenderer.invoke("tracking:get"),
47
53
  setTracking: (enabled) => electron.ipcRenderer.invoke("tracking:set", enabled),
54
+ // Tickets (active tab)
55
+ getTicketProject: () => electron.ipcRenderer.invoke("tickets:project"),
56
+ addTicket: (input) => electron.ipcRenderer.invoke("tickets:add", input),
57
+ updateTicket: (rowId, input) => electron.ipcRenderer.invoke("tickets:update", rowId, input),
58
+ listTickets: () => electron.ipcRenderer.invoke("tickets:list"),
48
59
  // Chat logging (global)
49
60
  getLogChat: () => electron.ipcRenderer.invoke("logchat:get"),
50
61
  setLogChat: (enabled) => electron.ipcRenderer.invoke("logchat:set", enabled),
@@ -1,6 +1,6 @@
1
- import { c as createWebWorker, l as languages } from "./index-D23nru43.js";
2
- import { C as CompletionAdapter, H as HoverAdapter, D as DocumentHighlightAdapter, a as DefinitionAdapter, R as ReferenceAdapter, b as DocumentSymbolAdapter, c as RenameAdapter, d as DocumentColorAdapter, F as FoldingRangeAdapter, e as DiagnosticsAdapter, S as SelectionRangeAdapter, f as DocumentFormattingEditProvider, g as DocumentRangeFormattingEditProvider } from "./lspLanguageFeatures-B9aNeatS.js";
3
- import { h, i, j, t, k } from "./lspLanguageFeatures-B9aNeatS.js";
1
+ import { c as createWebWorker, l as languages } from "./index-D2MUZin7.js";
2
+ import { C as CompletionAdapter, H as HoverAdapter, D as DocumentHighlightAdapter, a as DefinitionAdapter, R as ReferenceAdapter, b as DocumentSymbolAdapter, c as RenameAdapter, d as DocumentColorAdapter, F as FoldingRangeAdapter, e as DiagnosticsAdapter, S as SelectionRangeAdapter, f as DocumentFormattingEditProvider, g as DocumentRangeFormattingEditProvider } from "./lspLanguageFeatures-CbkEcL-z.js";
3
+ import { h, i, j, t, k } from "./lspLanguageFeatures-CbkEcL-z.js";
4
4
  const STOP_WHEN_IDLE_FOR = 2 * 60 * 1e3;
5
5
  class WorkerManager {
6
6
  constructor(defaults) {
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-D23nru43.js";
1
+ import { l as languages } from "./index-D2MUZin7.js";
2
2
  const EMPTY_ELEMENTS = [
3
3
  "assign",
4
4
  "flush",
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-D23nru43.js";
1
+ import { l as languages } from "./index-D2MUZin7.js";
2
2
  const EMPTY_ELEMENTS = [
3
3
  "area",
4
4
  "base",
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-D23nru43.js";
1
+ import { l as languages } from "./index-D2MUZin7.js";
2
2
  const EMPTY_ELEMENTS = [
3
3
  "area",
4
4
  "base",
@@ -1,6 +1,6 @@
1
- import { c as createWebWorker, l as languages } from "./index-D23nru43.js";
2
- import { H as HoverAdapter, D as DocumentHighlightAdapter, h as DocumentLinkAdapter, F as FoldingRangeAdapter, b as DocumentSymbolAdapter, S as SelectionRangeAdapter, c as RenameAdapter, f as DocumentFormattingEditProvider, g as DocumentRangeFormattingEditProvider, C as CompletionAdapter } from "./lspLanguageFeatures-B9aNeatS.js";
3
- import { a, e, d, R, i, j, t, k } from "./lspLanguageFeatures-B9aNeatS.js";
1
+ import { c as createWebWorker, l as languages } from "./index-D2MUZin7.js";
2
+ import { H as HoverAdapter, D as DocumentHighlightAdapter, h as DocumentLinkAdapter, F as FoldingRangeAdapter, b as DocumentSymbolAdapter, S as SelectionRangeAdapter, c as RenameAdapter, f as DocumentFormattingEditProvider, g as DocumentRangeFormattingEditProvider, C as CompletionAdapter } from "./lspLanguageFeatures-CbkEcL-z.js";
3
+ import { a, e, d, R, i, j, t, k } from "./lspLanguageFeatures-CbkEcL-z.js";
4
4
  const STOP_WHEN_IDLE_FOR = 2 * 60 * 1e3;
5
5
  class WorkerManager {
6
6
  constructor(defaults) {
@@ -7422,6 +7422,24 @@ html, body, #root {
7422
7422
  .titlebar-title {
7423
7423
  font-weight: 600;
7424
7424
  color: #c0caf5;
7425
+ display: flex;
7426
+ align-items: center;
7427
+ gap: 6px;
7428
+ min-width: 0;
7429
+ }
7430
+
7431
+ .titlebar-title-sep {
7432
+ color: #565f89;
7433
+ font-weight: 400;
7434
+ }
7435
+
7436
+ .titlebar-project {
7437
+ color: #7aa2f7;
7438
+ font-weight: 600;
7439
+ white-space: nowrap;
7440
+ overflow: hidden;
7441
+ text-overflow: ellipsis;
7442
+ max-width: 280px;
7425
7443
  }
7426
7444
 
7427
7445
  .titlebar-controls {
@@ -8413,3 +8431,389 @@ html, body, #root {
8413
8431
  display: flex;
8414
8432
  gap: 4px;
8415
8433
  }
8434
+
8435
+ /* ─── Ticket drawer ──────────────────────────────── */
8436
+
8437
+ .ticket-scrim {
8438
+ position: fixed;
8439
+ inset: 0;
8440
+ background: rgba(13, 14, 22, 0.55);
8441
+ backdrop-filter: blur(2px);
8442
+ opacity: 0;
8443
+ pointer-events: none;
8444
+ transition: opacity 0.2s ease;
8445
+ z-index: 90;
8446
+ }
8447
+ .ticket-scrim.open {
8448
+ opacity: 1;
8449
+ pointer-events: auto;
8450
+ }
8451
+
8452
+ .ticket-drawer {
8453
+ position: fixed;
8454
+ top: 0;
8455
+ right: 0;
8456
+ bottom: 0;
8457
+ width: 380px;
8458
+ background: linear-gradient(180deg, #20243a 0%, #1b1e2e 100%);
8459
+ border-left: 1px solid #343860;
8460
+ box-shadow: -16px 0 48px rgba(0, 0, 0, 0.5);
8461
+ display: flex;
8462
+ flex-direction: column;
8463
+ transform: translateX(100%);
8464
+ transition: transform 0.24s cubic-bezier(0.32, 0.72, 0, 1);
8465
+ z-index: 100;
8466
+ }
8467
+ .ticket-drawer.open {
8468
+ transform: translateX(0);
8469
+ }
8470
+
8471
+ /* ── header ── */
8472
+ .ticket-drawer-header {
8473
+ display: flex;
8474
+ align-items: flex-start;
8475
+ justify-content: space-between;
8476
+ padding: 16px 16px 14px;
8477
+ border-bottom: 1px solid #2a2b3d;
8478
+ }
8479
+ .ticket-drawer-heading {
8480
+ display: flex;
8481
+ gap: 11px;
8482
+ align-items: center;
8483
+ }
8484
+ .ticket-drawer-badge {
8485
+ width: 34px;
8486
+ height: 34px;
8487
+ border-radius: 9px;
8488
+ background: rgba(122, 162, 247, 0.14);
8489
+ border: 1px solid rgba(122, 162, 247, 0.3);
8490
+ display: flex;
8491
+ align-items: center;
8492
+ justify-content: center;
8493
+ font-size: 16px;
8494
+ flex-shrink: 0;
8495
+ }
8496
+ .ticket-drawer-headtext {
8497
+ display: flex;
8498
+ flex-direction: column;
8499
+ gap: 1px;
8500
+ }
8501
+ .ticket-drawer-title {
8502
+ font-size: 14px;
8503
+ font-weight: 650;
8504
+ color: #d5dbf5;
8505
+ letter-spacing: 0.01em;
8506
+ }
8507
+ .ticket-drawer-subtitle {
8508
+ font-size: 11.5px;
8509
+ color: #6b739b;
8510
+ }
8511
+ .ticket-drawer-subtitle strong {
8512
+ color: #7aa2f7;
8513
+ font-weight: 600;
8514
+ }
8515
+ .ticket-drawer-warn {
8516
+ color: #e0af68;
8517
+ }
8518
+ .ticket-drawer-close {
8519
+ background: none;
8520
+ border: none;
8521
+ color: #565f89;
8522
+ font-size: 20px;
8523
+ line-height: 1;
8524
+ cursor: pointer;
8525
+ padding: 2px 6px;
8526
+ border-radius: 6px;
8527
+ transition: background 0.12s ease, color 0.12s ease;
8528
+ }
8529
+ .ticket-drawer-close:hover {
8530
+ color: #d5dbf5;
8531
+ background: rgba(255, 255, 255, 0.06);
8532
+ }
8533
+
8534
+ /* ── body ── */
8535
+ .ticket-drawer-body {
8536
+ flex: 1;
8537
+ overflow-y: auto;
8538
+ padding: 16px;
8539
+ display: flex;
8540
+ flex-direction: column;
8541
+ gap: 16px;
8542
+ }
8543
+
8544
+ .ticket-field {
8545
+ display: flex;
8546
+ flex-direction: column;
8547
+ gap: 7px;
8548
+ }
8549
+ .ticket-field-label {
8550
+ font-size: 10.5px;
8551
+ font-weight: 600;
8552
+ color: #6b739b;
8553
+ text-transform: uppercase;
8554
+ letter-spacing: 0.07em;
8555
+ }
8556
+
8557
+ .ticket-field input,
8558
+ .ticket-field textarea {
8559
+ background: #15161f;
8560
+ border: 1px solid #2a2b3d;
8561
+ border-radius: 8px;
8562
+ color: #d5dbf5;
8563
+ font-size: 13px;
8564
+ font-family: inherit;
8565
+ padding: 9px 11px;
8566
+ outline: none;
8567
+ transition: border-color 0.14s ease, box-shadow 0.14s ease;
8568
+ }
8569
+ .ticket-field input::placeholder,
8570
+ .ticket-field textarea::placeholder {
8571
+ color: #4a4f6e;
8572
+ }
8573
+ .ticket-field input:focus,
8574
+ .ticket-field textarea:focus {
8575
+ border-color: #7aa2f7;
8576
+ box-shadow: 0 0 0 3px rgba(122, 162, 247, 0.13);
8577
+ }
8578
+ .ticket-input-title {
8579
+ font-size: 14px !important;
8580
+ font-weight: 550;
8581
+ }
8582
+ .ticket-field textarea {
8583
+ resize: vertical;
8584
+ line-height: 1.5;
8585
+ }
8586
+
8587
+ /* ── segmented pill controls ── */
8588
+ .ticket-segmented {
8589
+ display: flex;
8590
+ flex-wrap: wrap;
8591
+ gap: 6px;
8592
+ }
8593
+ .ticket-seg {
8594
+ display: inline-flex;
8595
+ align-items: center;
8596
+ gap: 6px;
8597
+ background: #15161f;
8598
+ border: 1px solid #2a2b3d;
8599
+ border-radius: 999px;
8600
+ color: #8088ac;
8601
+ font-size: 12px;
8602
+ font-family: inherit;
8603
+ font-weight: 550;
8604
+ padding: 5px 11px 5px 9px;
8605
+ cursor: pointer;
8606
+ transition: background 0.13s ease, border-color 0.13s ease, color 0.13s ease;
8607
+ }
8608
+ .ticket-seg:hover {
8609
+ border-color: #3b3d57;
8610
+ color: #c0caf5;
8611
+ }
8612
+ .ticket-seg-dot {
8613
+ width: 7px;
8614
+ height: 7px;
8615
+ border-radius: 50%;
8616
+ flex-shrink: 0;
8617
+ }
8618
+ .ticket-seg.active {
8619
+ font-weight: 650;
8620
+ }
8621
+
8622
+ .ticket-drawer-error {
8623
+ background: rgba(247, 118, 142, 0.13);
8624
+ border: 1px solid rgba(247, 118, 142, 0.38);
8625
+ color: #f7768e;
8626
+ font-size: 12px;
8627
+ border-radius: 8px;
8628
+ padding: 8px 10px;
8629
+ }
8630
+
8631
+ /* ── footer ── */
8632
+ .ticket-drawer-footer {
8633
+ display: flex;
8634
+ align-items: center;
8635
+ justify-content: space-between;
8636
+ gap: 8px;
8637
+ padding: 12px 16px;
8638
+ border-top: 1px solid #2a2b3d;
8639
+ background: rgba(13, 14, 22, 0.35);
8640
+ }
8641
+ .ticket-drawer-hint {
8642
+ font-size: 11px;
8643
+ color: #565f89;
8644
+ }
8645
+ .ticket-drawer-footer-btns {
8646
+ display: flex;
8647
+ gap: 8px;
8648
+ }
8649
+ .ticket-btn-secondary,
8650
+ .ticket-btn-primary {
8651
+ font-size: 12.5px;
8652
+ font-family: inherit;
8653
+ font-weight: 600;
8654
+ border-radius: 8px;
8655
+ padding: 8px 14px;
8656
+ cursor: pointer;
8657
+ transition: background 0.13s ease, border-color 0.13s ease, transform 0.06s ease;
8658
+ }
8659
+ .ticket-btn-secondary {
8660
+ background: transparent;
8661
+ color: #c0caf5;
8662
+ border: 1px solid #2a2b3d;
8663
+ }
8664
+ .ticket-btn-secondary:hover {
8665
+ background: rgba(255, 255, 255, 0.05);
8666
+ border-color: #3b3d57;
8667
+ }
8668
+ .ticket-btn-primary {
8669
+ background: linear-gradient(180deg, #8db0fa 0%, #7aa2f7 100%);
8670
+ color: #11131f;
8671
+ border: 1px solid #7aa2f7;
8672
+ }
8673
+ .ticket-btn-primary:hover:not(:disabled) {
8674
+ background: linear-gradient(180deg, #9bbcfb 0%, #89b4fa 100%);
8675
+ }
8676
+ .ticket-btn-primary:active:not(:disabled) {
8677
+ transform: translateY(1px);
8678
+ }
8679
+ .ticket-btn-primary:disabled {
8680
+ opacity: 0.4;
8681
+ cursor: not-allowed;
8682
+ }
8683
+
8684
+ /* ── titlebar tickets icon ── */
8685
+ .ticket-tag-icon {
8686
+ display: inline-block;
8687
+ vertical-align: -2px;
8688
+ margin-right: 5px;
8689
+ }
8690
+
8691
+ /* ── drawer badge / back button ── */
8692
+ .ticket-drawer-badge {
8693
+ color: #7aa2f7;
8694
+ }
8695
+ .ticket-drawer-back {
8696
+ width: 34px;
8697
+ height: 34px;
8698
+ border-radius: 9px;
8699
+ background: rgba(122, 162, 247, 0.1);
8700
+ border: 1px solid rgba(122, 162, 247, 0.28);
8701
+ color: #7aa2f7;
8702
+ font-size: 22px;
8703
+ line-height: 1;
8704
+ cursor: pointer;
8705
+ flex-shrink: 0;
8706
+ transition: background 0.12s ease;
8707
+ }
8708
+ .ticket-drawer-back:hover {
8709
+ background: rgba(122, 162, 247, 0.2);
8710
+ }
8711
+
8712
+ /* ── ticket list ── */
8713
+ .ticket-list-body {
8714
+ flex: 1;
8715
+ overflow-y: auto;
8716
+ padding: 12px;
8717
+ display: flex;
8718
+ flex-direction: column;
8719
+ gap: 7px;
8720
+ }
8721
+ .ticket-list-msg {
8722
+ color: #6b739b;
8723
+ font-size: 12.5px;
8724
+ padding: 16px 4px;
8725
+ text-align: center;
8726
+ }
8727
+
8728
+ .ticket-empty {
8729
+ display: flex;
8730
+ flex-direction: column;
8731
+ align-items: center;
8732
+ gap: 5px;
8733
+ padding: 48px 16px;
8734
+ text-align: center;
8735
+ }
8736
+ .ticket-empty-icon {
8737
+ color: #3b3d57;
8738
+ margin-bottom: 4px;
8739
+ }
8740
+ .ticket-empty-title {
8741
+ font-size: 13.5px;
8742
+ font-weight: 600;
8743
+ color: #8088ac;
8744
+ }
8745
+ .ticket-empty-hint {
8746
+ font-size: 12px;
8747
+ color: #565f89;
8748
+ }
8749
+
8750
+ /* ── ticket card ── */
8751
+ .ticket-card {
8752
+ display: flex;
8753
+ align-items: stretch;
8754
+ gap: 10px;
8755
+ background: #15161f;
8756
+ border: 1px solid #262a3f;
8757
+ border-radius: 10px;
8758
+ padding: 10px 11px 10px 0;
8759
+ cursor: pointer;
8760
+ text-align: left;
8761
+ font-family: inherit;
8762
+ overflow: hidden;
8763
+ transition: border-color 0.13s ease, background 0.13s ease, transform 0.06s ease;
8764
+ }
8765
+ .ticket-card:hover {
8766
+ border-color: #3d425f;
8767
+ background: #181a26;
8768
+ }
8769
+ .ticket-card:active {
8770
+ transform: scale(0.99);
8771
+ }
8772
+ .ticket-card-bar {
8773
+ width: 3px;
8774
+ border-radius: 3px;
8775
+ flex-shrink: 0;
8776
+ align-self: stretch;
8777
+ }
8778
+ .ticket-card-main {
8779
+ flex: 1;
8780
+ min-width: 0;
8781
+ display: flex;
8782
+ flex-direction: column;
8783
+ gap: 5px;
8784
+ }
8785
+ .ticket-card-title {
8786
+ font-size: 13px;
8787
+ font-weight: 550;
8788
+ color: #d5dbf5;
8789
+ white-space: nowrap;
8790
+ overflow: hidden;
8791
+ text-overflow: ellipsis;
8792
+ }
8793
+ .ticket-card-meta {
8794
+ display: flex;
8795
+ align-items: center;
8796
+ gap: 10px;
8797
+ }
8798
+ .ticket-card-status {
8799
+ display: inline-flex;
8800
+ align-items: center;
8801
+ gap: 5px;
8802
+ font-size: 11px;
8803
+ font-weight: 600;
8804
+ }
8805
+ .ticket-card-date {
8806
+ font-size: 11px;
8807
+ color: #565f89;
8808
+ }
8809
+ .ticket-card-pri {
8810
+ align-self: center;
8811
+ font-size: 10px;
8812
+ font-weight: 700;
8813
+ letter-spacing: 0.04em;
8814
+ text-transform: uppercase;
8815
+ border: 1px solid;
8816
+ border-radius: 999px;
8817
+ padding: 2px 8px;
8818
+ flex-shrink: 0;
8819
+ }