@phenx-inc/ctlsurf 0.13.1 → 0.13.4

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 (38) hide show
  1. package/LICENSE +22 -0
  2. package/out/headless/index.mjs +9 -18
  3. package/out/headless/index.mjs.map +3 -3
  4. package/out/main/index.js +17 -22
  5. package/out/preload/index.js +1 -0
  6. package/out/renderer/assets/{cssMode-KhYyY-BM.js → cssMode-CAEObGNt.js} +3 -3
  7. package/out/renderer/assets/{freemarker2-BFsSgcWk.js → freemarker2-D63hnnDq.js} +1 -1
  8. package/out/renderer/assets/{handlebars-Be6_aBsm.js → handlebars-UYo_IYpi.js} +1 -1
  9. package/out/renderer/assets/{html-G8mvsyfc.js → html-2dvYDi3g.js} +1 -1
  10. package/out/renderer/assets/{htmlMode-Cfd5VCjw.js → htmlMode-B6fxDDPF.js} +3 -3
  11. package/out/renderer/assets/{index-Bi_MjBqs.css → index-BEekQe3-.css} +116 -0
  12. package/out/renderer/assets/{index-MqgBcJzy.js → index-CMb4AqkZ.js} +552 -411
  13. package/out/renderer/assets/{javascript-XyDWi6dC.js → javascript-8RyFDDdk.js} +2 -2
  14. package/out/renderer/assets/{jsonMode-DZT5gBVW.js → jsonMode-CqspkWCb.js} +3 -3
  15. package/out/renderer/assets/{liquid-BuajCNJ9.js → liquid-DaEnAsYY.js} +1 -1
  16. package/out/renderer/assets/{lspLanguageFeatures-BYkg2Yc-.js → lspLanguageFeatures-Czkp5sZb.js} +1 -1
  17. package/out/renderer/assets/{mdx-D0Qx2GMS.js → mdx-Q-qSZsFg.js} +1 -1
  18. package/out/renderer/assets/{python-ChncNy6S.js → python-Sw0S0BJV.js} +1 -1
  19. package/out/renderer/assets/{razor-C6MUtfaS.js → razor-C7zQmabz.js} +1 -1
  20. package/out/renderer/assets/{tsMode-C2aMdzdU.js → tsMode-BWdOxk6v.js} +1 -1
  21. package/out/renderer/assets/{typescript-CB71AtAT.js → typescript-BrdIiKZf.js} +1 -1
  22. package/out/renderer/assets/{xml-tHS1Ec9w.js → xml-DbKLNPOq.js} +1 -1
  23. package/out/renderer/assets/{yaml-CZcp5ueF.js → yaml-ehupJBsZ.js} +1 -1
  24. package/out/renderer/index.html +2 -2
  25. package/package.json +2 -2
  26. package/src/main/bridge.ts +3 -2
  27. package/src/main/index.ts +6 -0
  28. package/src/main/pty.ts +2 -5
  29. package/src/main/ticketStore.ts +2 -1
  30. package/src/main/timeTracker.ts +4 -1
  31. package/src/main/transcripts.ts +3 -2
  32. package/src/preload/index.ts +2 -0
  33. package/src/renderer/App.tsx +1 -0
  34. package/src/renderer/components/SettingsDialog.tsx +13 -0
  35. package/src/renderer/components/SpeakControls.tsx +5 -0
  36. package/src/renderer/components/TerminalPanel.tsx +151 -30
  37. package/src/renderer/lib/speech.ts +2 -1
  38. package/src/renderer/styles.css +116 -0
package/out/main/index.js CHANGED
@@ -122,6 +122,12 @@ function getSettingsDir(useElectron) {
122
122
  return app.getPath("userData");
123
123
  }
124
124
  }
125
+ function log$3(...args) {
126
+ try {
127
+ console.log(...args);
128
+ } catch {
129
+ }
130
+ }
125
131
  const require$1 = module$1.createRequire(require("url").pathToFileURL(__filename).href);
126
132
  const pty = require$1("node-pty");
127
133
  class PtyManager {
@@ -131,10 +137,7 @@ class PtyManager {
131
137
  constructor(agent, cwd) {
132
138
  const shell = agent.command;
133
139
  const args = agent.args || [];
134
- try {
135
- console.log(`[pty] Spawning: ${shell} ${args.join(" ")} in ${cwd}`);
136
- } catch {
137
- }
140
+ log$3(`[pty] Spawning: ${shell} ${args.join(" ")} in ${cwd}`);
138
141
  this.process = pty.spawn(shell, args, {
139
142
  name: "xterm-256color",
140
143
  cwd,
@@ -5963,7 +5966,7 @@ class ConversationBridge {
5963
5966
  this.inputBuffer = "";
5964
5967
  this.terminalCapture.reset();
5965
5968
  this.sessionActive = true;
5966
- console.log("[bridge] Session started");
5969
+ log$3("[bridge] Session started");
5967
5970
  }
5968
5971
  feedOutput(data) {
5969
5972
  if (!this.sessionActive || !this.loggingEnabled) return;
@@ -6043,7 +6046,7 @@ class ConversationBridge {
6043
6046
  this.sessionActive = false;
6044
6047
  this.inputBuffer = "";
6045
6048
  this.outputBuffer = "";
6046
- console.log("[bridge] Session ended");
6049
+ log$3("[bridge] Session ended");
6047
6050
  }
6048
6051
  }
6049
6052
  const DEFAULT_COLS = 80;
@@ -6252,7 +6255,7 @@ class TranscriptTailer {
6252
6255
  this.sinceMs = Date.now();
6253
6256
  this.files.clear();
6254
6257
  this.pollTimer = setInterval(() => this.poll(), POLL_INTERVAL_MS);
6255
- console.log(`[transcripts] Tailing ${this.agentId} transcripts for ${this.cwd}`);
6258
+ log$3(`[transcripts] Tailing ${this.agentId} transcripts for ${this.cwd}`);
6256
6259
  }
6257
6260
  stop() {
6258
6261
  if (!this.pollTimer) return;
@@ -6260,7 +6263,7 @@ class TranscriptTailer {
6260
6263
  this.pollTimer = null;
6261
6264
  this.poll();
6262
6265
  this.files.clear();
6263
- console.log("[transcripts] Stopped");
6266
+ log$3("[transcripts] Stopped");
6264
6267
  }
6265
6268
  poll() {
6266
6269
  try {
@@ -10689,12 +10692,6 @@ function requireWebsocketServer() {
10689
10692
  return websocketServer;
10690
10693
  }
10691
10694
  requireWebsocketServer();
10692
- function log$3(...args) {
10693
- try {
10694
- console.log(...args);
10695
- } catch {
10696
- }
10697
- }
10698
10695
  const WS = typeof WebSocket !== "undefined" ? WebSocket : WebSocket$1;
10699
10696
  const HEARTBEAT_INTERVAL_MS = 3e4;
10700
10697
  const RECONNECT_DELAY_MS = 5e3;
@@ -10969,10 +10966,7 @@ function isSameLocalDay(a, b2) {
10969
10966
  return da.getFullYear() === db.getFullYear() && da.getMonth() === db.getMonth() && da.getDate() === db.getDate();
10970
10967
  }
10971
10968
  function log$2(...args) {
10972
- try {
10973
- console.log("[time-tracker]", ...args);
10974
- } catch {
10975
- }
10969
+ log$3("[time-tracker]", ...args);
10976
10970
  }
10977
10971
  function findPageByTitle$1(pages, title) {
10978
10972
  for (const p2 of pages) {
@@ -11259,10 +11253,7 @@ const COLUMNS = [
11259
11253
  { name: "Created", type: "date" }
11260
11254
  ];
11261
11255
  function log$1(...args) {
11262
- try {
11263
- console.log("[ticket-store]", ...args);
11264
- } catch {
11265
- }
11256
+ log$3("[ticket-store]", ...args);
11266
11257
  }
11267
11258
  function findPageByTitle(pages, title) {
11268
11259
  for (const p2 of pages) {
@@ -12324,6 +12315,10 @@ electron.ipcMain.handle("clipboard:writeTable", (_event, html, text) => {
12324
12315
  electron.clipboard.write({ html, text });
12325
12316
  return { ok: true };
12326
12317
  });
12318
+ electron.ipcMain.handle("clipboard:writeText", (_event, text) => {
12319
+ electron.clipboard.writeText(text);
12320
+ return { ok: true };
12321
+ });
12327
12322
  electron.ipcMain.handle("pty:spawn", async (_event, tabId, agent, cwd) => {
12328
12323
  await orchestrator.spawnAgent(tabId, agent, cwd);
12329
12324
  return { ok: true };
@@ -42,6 +42,7 @@ const api = {
42
42
  browseCwd: () => electron.ipcRenderer.invoke("app:browseCwd"),
43
43
  // Clipboard — write a rich-HTML table (+ plain-text fallback) for email paste.
44
44
  copyEmailTable: (html, text) => electron.ipcRenderer.invoke("clipboard:writeTable", html, text),
45
+ copyText: (text) => electron.ipcRenderer.invoke("clipboard:writeText", text),
45
46
  getVersion: () => electron.ipcRenderer.invoke("app:getVersion"),
46
47
  getUpdateInfo: () => electron.ipcRenderer.invoke("app:getUpdateInfo"),
47
48
  onUpdateInfo: (callback) => {
@@ -1,6 +1,6 @@
1
- import { c as createWebWorker, l as languages } from "./index-MqgBcJzy.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-BYkg2Yc-.js";
3
- import { h, i, j, t, k } from "./lspLanguageFeatures-BYkg2Yc-.js";
1
+ import { c as createWebWorker, l as languages } from "./index-CMb4AqkZ.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-Czkp5sZb.js";
3
+ import { h, i, j, t, k } from "./lspLanguageFeatures-Czkp5sZb.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-MqgBcJzy.js";
1
+ import { l as languages } from "./index-CMb4AqkZ.js";
2
2
  const EMPTY_ELEMENTS = [
3
3
  "assign",
4
4
  "flush",
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-MqgBcJzy.js";
1
+ import { l as languages } from "./index-CMb4AqkZ.js";
2
2
  const EMPTY_ELEMENTS = [
3
3
  "area",
4
4
  "base",
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-MqgBcJzy.js";
1
+ import { l as languages } from "./index-CMb4AqkZ.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-MqgBcJzy.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-BYkg2Yc-.js";
3
- import { a, e, d, R, i, j, t, k } from "./lspLanguageFeatures-BYkg2Yc-.js";
1
+ import { c as createWebWorker, l as languages } from "./index-CMb4AqkZ.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-Czkp5sZb.js";
3
+ import { a, e, d, R, i, j, t, k } from "./lspLanguageFeatures-Czkp5sZb.js";
4
4
  const STOP_WHEN_IDLE_FOR = 2 * 60 * 1e3;
5
5
  class WorkerManager {
6
6
  constructor(defaults) {
@@ -9002,6 +9002,22 @@ html, body, #root {
9002
9002
  font-size: 16px;
9003
9003
  }
9004
9004
 
9005
+ /* About section inside the Settings dialog. */
9006
+ .settings-about {
9007
+ border-top: 1px solid #2a2b3d;
9008
+ padding-top: 16px;
9009
+ }
9010
+ .settings-about .about-name {
9011
+ color: #c0caf5;
9012
+ font-size: 14px;
9013
+ font-weight: 600;
9014
+ }
9015
+ .settings-about .about-copyright {
9016
+ color: #9aa5ce;
9017
+ font-size: 12px;
9018
+ margin: 6px 0 8px;
9019
+ }
9020
+
9005
9021
  .settings-section {
9006
9022
  margin-bottom: 20px;
9007
9023
  }
@@ -9638,6 +9654,106 @@ html, body, #root {
9638
9654
  .term-context-menu button:hover {
9639
9655
  background: #2a2b3d;
9640
9656
  }
9657
+ /* Always-visible utility button (top-right) — opens the snapshot panel. */
9658
+ .term-util-btn {
9659
+ position: absolute;
9660
+ top: 6px;
9661
+ right: 14px;
9662
+ z-index: 6;
9663
+ width: 26px;
9664
+ height: 26px;
9665
+ display: inline-flex;
9666
+ align-items: center;
9667
+ justify-content: center;
9668
+ border-radius: 6px;
9669
+ background: #2a2b3d;
9670
+ border: 1px solid #414868;
9671
+ color: #c0caf5;
9672
+ font-size: 16px;
9673
+ line-height: 1;
9674
+ cursor: pointer;
9675
+ opacity: 0.55;
9676
+ transition: opacity 0.13s ease, background 0.13s ease;
9677
+ }
9678
+ .term-util-btn:hover {
9679
+ opacity: 1;
9680
+ background: #343650;
9681
+ }
9682
+
9683
+ /* Snapshot panel: a frozen, selectable copy of the screen text. */
9684
+ .term-snapshot {
9685
+ position: absolute;
9686
+ inset: 0;
9687
+ z-index: 20;
9688
+ display: flex;
9689
+ flex-direction: column;
9690
+ background: #16161e;
9691
+ border: 1px solid #414868;
9692
+ }
9693
+ .term-snapshot-head {
9694
+ display: flex;
9695
+ align-items: center;
9696
+ justify-content: space-between;
9697
+ gap: 12px;
9698
+ padding: 8px 12px;
9699
+ background: #1f2335;
9700
+ border-bottom: 1px solid #414868;
9701
+ color: #9aa5ce;
9702
+ font-size: 12px;
9703
+ }
9704
+ .term-snapshot-x {
9705
+ background: transparent;
9706
+ border: none;
9707
+ color: #9aa5ce;
9708
+ font-size: 14px;
9709
+ cursor: pointer;
9710
+ padding: 2px 6px;
9711
+ border-radius: 4px;
9712
+ }
9713
+ .term-snapshot-x:hover {
9714
+ background: #2a2b3d;
9715
+ color: #c0caf5;
9716
+ }
9717
+ .term-snapshot-text {
9718
+ flex: 1;
9719
+ min-height: 0;
9720
+ overflow: auto;
9721
+ margin: 0;
9722
+ padding: 10px 12px;
9723
+ white-space: pre;
9724
+ user-select: text;
9725
+ cursor: text;
9726
+ color: #c0caf5;
9727
+ background: #16161e;
9728
+ font-family: 'JetBrains Mono', 'Fira Code', 'SF Mono', monospace;
9729
+ font-size: 13px;
9730
+ line-height: 1.4;
9731
+ }
9732
+ .term-snapshot-text::selection {
9733
+ background: #33467c;
9734
+ }
9735
+ .term-snapshot-actions {
9736
+ display: flex;
9737
+ gap: 6px;
9738
+ padding: 8px 12px;
9739
+ background: #1f2335;
9740
+ border-top: 1px solid #414868;
9741
+ }
9742
+ .term-snapshot-actions button {
9743
+ background: #2a2b3d;
9744
+ border: 1px solid #414868;
9745
+ border-radius: 5px;
9746
+ color: #c0caf5;
9747
+ font-size: 12.5px;
9748
+ padding: 6px 12px;
9749
+ cursor: pointer;
9750
+ }
9751
+ .term-snapshot-actions button:hover {
9752
+ background: #343650;
9753
+ }
9754
+ .term-snapshot-done {
9755
+ margin-left: auto;
9756
+ }
9641
9757
  .term-toast {
9642
9758
  position: fixed;
9643
9759
  bottom: 24px;