@phenx-inc/ctlsurf 0.13.1 → 0.13.5
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/LICENSE +22 -0
- package/out/headless/index.mjs +9 -23
- package/out/headless/index.mjs.map +3 -3
- package/out/main/index.js +17 -22
- package/out/preload/index.js +1 -0
- package/out/renderer/assets/{cssMode-KhYyY-BM.js → cssMode-CAEObGNt.js} +3 -3
- package/out/renderer/assets/{freemarker2-BFsSgcWk.js → freemarker2-D63hnnDq.js} +1 -1
- package/out/renderer/assets/{handlebars-Be6_aBsm.js → handlebars-UYo_IYpi.js} +1 -1
- package/out/renderer/assets/{html-G8mvsyfc.js → html-2dvYDi3g.js} +1 -1
- package/out/renderer/assets/{htmlMode-Cfd5VCjw.js → htmlMode-B6fxDDPF.js} +3 -3
- package/out/renderer/assets/{index-Bi_MjBqs.css → index-BEekQe3-.css} +116 -0
- package/out/renderer/assets/{index-MqgBcJzy.js → index-CMb4AqkZ.js} +552 -411
- package/out/renderer/assets/{javascript-XyDWi6dC.js → javascript-8RyFDDdk.js} +2 -2
- package/out/renderer/assets/{jsonMode-DZT5gBVW.js → jsonMode-CqspkWCb.js} +3 -3
- package/out/renderer/assets/{liquid-BuajCNJ9.js → liquid-DaEnAsYY.js} +1 -1
- package/out/renderer/assets/{lspLanguageFeatures-BYkg2Yc-.js → lspLanguageFeatures-Czkp5sZb.js} +1 -1
- package/out/renderer/assets/{mdx-D0Qx2GMS.js → mdx-Q-qSZsFg.js} +1 -1
- package/out/renderer/assets/{python-ChncNy6S.js → python-Sw0S0BJV.js} +1 -1
- package/out/renderer/assets/{razor-C6MUtfaS.js → razor-C7zQmabz.js} +1 -1
- package/out/renderer/assets/{tsMode-C2aMdzdU.js → tsMode-BWdOxk6v.js} +1 -1
- package/out/renderer/assets/{typescript-CB71AtAT.js → typescript-BrdIiKZf.js} +1 -1
- package/out/renderer/assets/{xml-tHS1Ec9w.js → xml-DbKLNPOq.js} +1 -1
- package/out/renderer/assets/{yaml-CZcp5ueF.js → yaml-ehupJBsZ.js} +1 -1
- package/out/renderer/index.html +2 -2
- package/package.json +2 -2
- package/src/main/bridge.ts +3 -2
- package/src/main/headless.ts +9 -13
- package/src/main/index.ts +6 -0
- package/src/main/pty.ts +2 -5
- package/src/main/ticketStore.ts +2 -1
- package/src/main/timeTracker.ts +4 -1
- package/src/main/transcripts.ts +3 -2
- package/src/preload/index.ts +2 -0
- package/src/renderer/App.tsx +1 -0
- package/src/renderer/components/SettingsDialog.tsx +13 -0
- package/src/renderer/components/SpeakControls.tsx +5 -0
- package/src/renderer/components/TerminalPanel.tsx +151 -30
- package/src/renderer/lib/speech.ts +2 -1
- 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 };
|
package/out/preload/index.js
CHANGED
|
@@ -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-
|
|
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-
|
|
3
|
-
import { h, i, j, t, k } from "./lspLanguageFeatures-
|
|
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,6 +1,6 @@
|
|
|
1
|
-
import { c as createWebWorker, l as languages } from "./index-
|
|
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-
|
|
3
|
-
import { a, e, d, R, i, j, t, k } from "./lspLanguageFeatures-
|
|
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;
|