@phenx-inc/ctlsurf 0.6.0 → 0.8.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 (34) hide show
  1. package/out/headless/index.mjs +26 -10
  2. package/out/headless/index.mjs.map +2 -2
  3. package/out/main/index.js +31 -9
  4. package/out/preload/index.js +8 -0
  5. package/out/renderer/assets/{cssMode-DbMmcl1h.js → cssMode-BQN8v2ok.js} +3 -3
  6. package/out/renderer/assets/{freemarker2-CvaHiy92.js → freemarker2-DbxGYYVp.js} +1 -1
  7. package/out/renderer/assets/{handlebars-D58lUIOu.js → handlebars-3auU1CAd.js} +1 -1
  8. package/out/renderer/assets/{html-D1h1aJbM.js → html-D8xFiRmI.js} +1 -1
  9. package/out/renderer/assets/{htmlMode-BdkAp9qr.js → htmlMode-M3MApZ4n.js} +3 -3
  10. package/out/renderer/assets/{index-B60JU1yI.js → index---H6cxNl.js} +854 -38
  11. package/out/renderer/assets/{index-DJFYmHjz.css → index-B-iM7dFC.css} +269 -0
  12. package/out/renderer/assets/{javascript-CXqZcnvb.js → javascript-BO_ViZM5.js} +2 -2
  13. package/out/renderer/assets/{jsonMode-BuVr-eSl.js → jsonMode-CKp2zvZu.js} +3 -3
  14. package/out/renderer/assets/{liquid-LKu0Wd0B.js → liquid-C1eHcrht.js} +1 -1
  15. package/out/renderer/assets/{lspLanguageFeatures-Cjr_4HGs.js → lspLanguageFeatures-CHWJx_Tl.js} +1 -1
  16. package/out/renderer/assets/{mdx-Bl84ILla.js → mdx-Qqdtk7fL.js} +1 -1
  17. package/out/renderer/assets/{python-0sFd9G1k.js → python-DKu7rNbs.js} +1 -1
  18. package/out/renderer/assets/{razor-Cqcu1rLJ.js → razor-BOMpCo6z.js} +1 -1
  19. package/out/renderer/assets/{tsMode-CYd3NUkW.js → tsMode-yAjlPR-D.js} +1 -1
  20. package/out/renderer/assets/{typescript-rkc9lhpi.js → typescript-BiJRCUcL.js} +1 -1
  21. package/out/renderer/assets/{xml-EsHEUps1.js → xml-D4PvYeQq.js} +1 -1
  22. package/out/renderer/assets/{yaml-B9-nQ_s2.js → yaml-BeHVkmnS.js} +1 -1
  23. package/out/renderer/index.html +2 -2
  24. package/package.json +1 -1
  25. package/src/main/index.ts +7 -0
  26. package/src/main/orchestrator.ts +38 -9
  27. package/src/preload/index.ts +11 -0
  28. package/src/renderer/App.tsx +39 -6
  29. package/src/renderer/components/FloatingMic.tsx +128 -0
  30. package/src/renderer/components/SpeakControls.tsx +235 -0
  31. package/src/renderer/components/VoiceInput.tsx +170 -6
  32. package/src/renderer/lib/localWhisper.ts +48 -4
  33. package/src/renderer/lib/speech.ts +299 -0
  34. package/src/renderer/styles.css +269 -0
package/out/main/index.js CHANGED
@@ -11008,31 +11008,47 @@ class Orchestrator {
11008
11008
  get logChatEnabled() {
11009
11009
  return !!this.settings.logChat;
11010
11010
  }
11011
+ get speakRepliesEnabled() {
11012
+ return !!this.settings.speakReplies;
11013
+ }
11011
11014
  setLogChat(enabled) {
11012
11015
  this.settings.logChat = enabled;
11013
11016
  this.saveSettings();
11014
11017
  this.bridge.setLoggingEnabled(enabled);
11015
- if (!enabled) {
11016
- this.stopChatLogging();
11017
- } else if (this.activeTabId) {
11018
- const tab = this.tabs.get(this.activeTabId);
11019
- if (tab) this.startChatLogging(tab.agent, tab.cwd);
11020
- }
11018
+ this.restartActiveChatLogging();
11019
+ }
11020
+ setSpeakReplies(enabled) {
11021
+ this.settings.speakReplies = enabled;
11022
+ this.saveSettings();
11023
+ this.restartActiveChatLogging();
11024
+ }
11025
+ // Re-evaluate the transcript tailer for the active tab against the current
11026
+ // logChat / speakReplies flags. Both setters funnel through here.
11027
+ restartActiveChatLogging() {
11028
+ this.stopChatLogging();
11029
+ if (!this.activeTabId) return;
11030
+ const tab = this.tabs.get(this.activeTabId);
11031
+ if (tab) this.startChatLogging(tab.agent, tab.cwd);
11021
11032
  }
11022
11033
  // Agents with native session transcripts (Claude Code, Codex) get exact
11023
11034
  // chat text tailed from their JSONL logs; everything else falls back to
11024
11035
  // the terminal screen-scraper bridge.
11025
11036
  startChatLogging(agent, cwd) {
11026
11037
  this.stopChatLogging();
11027
- if (!this.settings.logChat) return;
11038
+ if (!this.settings.logChat && !this.settings.speakReplies) return;
11028
11039
  if (supportsTranscriptLogging(agent.id)) {
11029
11040
  this.transcriptTailer = new TranscriptTailer({
11030
11041
  agentId: agent.id,
11031
11042
  cwd,
11032
- sink: (entry) => this.workerWs.sendChatLog(entry)
11043
+ sink: (entry) => {
11044
+ if (this.settings.logChat) this.workerWs.sendChatLog(entry);
11045
+ if (this.settings.speakReplies && entry.type === "terminal_output") {
11046
+ this.events.onAgentMessage?.(entry.content);
11047
+ }
11048
+ }
11033
11049
  });
11034
11050
  this.transcriptTailer.start();
11035
- } else {
11051
+ } else if (this.settings.logChat) {
11036
11052
  this.bridge.startSession();
11037
11053
  }
11038
11054
  }
@@ -11536,6 +11552,7 @@ const orchestrator = new Orchestrator(
11536
11552
  onWorkerMessage: (message) => mainWindow?.webContents.send("worker:message", message),
11537
11553
  onWorkerRegistered: (data) => mainWindow?.webContents.send("worker:registered", data),
11538
11554
  onProjectChanged: (name) => mainWindow?.webContents.send("app:projectChanged", name),
11555
+ onAgentMessage: (text) => mainWindow?.webContents.send("agent:message", text),
11539
11556
  onCwdChanged: () => {
11540
11557
  mainWindow?.webContents.send("app:cwdChanged");
11541
11558
  updateProjectBadge(orchestrator.cwd);
@@ -11771,6 +11788,11 @@ electron.ipcMain.handle("logchat:set", (_event, enabled) => {
11771
11788
  orchestrator.setLogChat(!!enabled);
11772
11789
  return { enabled: orchestrator.logChatEnabled };
11773
11790
  });
11791
+ electron.ipcMain.handle("speak:get", () => ({ enabled: orchestrator.speakRepliesEnabled }));
11792
+ electron.ipcMain.handle("speak:set", (_event, enabled) => {
11793
+ orchestrator.setSpeakReplies(!!enabled);
11794
+ return { enabled: orchestrator.speakRepliesEnabled };
11795
+ });
11774
11796
  electron.ipcMain.handle("tracking:get", () => ({ active: orchestrator.isActiveTabTracking() }));
11775
11797
  electron.ipcMain.handle("tracking:set", async (_event, enabled) => {
11776
11798
  await orchestrator.setActiveTabTracking(enabled);
@@ -61,6 +61,14 @@ const api = {
61
61
  // Chat logging (global)
62
62
  getLogChat: () => electron.ipcRenderer.invoke("logchat:get"),
63
63
  setLogChat: (enabled) => electron.ipcRenderer.invoke("logchat:set", enabled),
64
+ // Speak agent replies (global, Electron-only)
65
+ getSpeakReplies: () => electron.ipcRenderer.invoke("speak:get"),
66
+ setSpeakReplies: (enabled) => electron.ipcRenderer.invoke("speak:set", enabled),
67
+ onAgentMessage: (callback) => {
68
+ const listener = (_event, text) => callback(text);
69
+ electron.ipcRenderer.on("agent:message", listener);
70
+ return () => electron.ipcRenderer.removeListener("agent:message", listener);
71
+ },
64
72
  // Filesystem
65
73
  readDir: (dirPath) => electron.ipcRenderer.invoke("fs:readDir", dirPath),
66
74
  readFile: (filePath) => electron.ipcRenderer.invoke("fs:readFile", filePath),
@@ -1,6 +1,6 @@
1
- import { c as createWebWorker, l as languages } from "./index-B60JU1yI.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-Cjr_4HGs.js";
3
- import { h, i, j, t, k } from "./lspLanguageFeatures-Cjr_4HGs.js";
1
+ import { c as createWebWorker, l as languages } from "./index---H6cxNl.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-CHWJx_Tl.js";
3
+ import { h, i, j, t, k } from "./lspLanguageFeatures-CHWJx_Tl.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-B60JU1yI.js";
1
+ import { l as languages } from "./index---H6cxNl.js";
2
2
  const EMPTY_ELEMENTS = [
3
3
  "assign",
4
4
  "flush",
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-B60JU1yI.js";
1
+ import { l as languages } from "./index---H6cxNl.js";
2
2
  const EMPTY_ELEMENTS = [
3
3
  "area",
4
4
  "base",
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-B60JU1yI.js";
1
+ import { l as languages } from "./index---H6cxNl.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-B60JU1yI.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-Cjr_4HGs.js";
3
- import { a, e, d, R, i, j, t, k } from "./lspLanguageFeatures-Cjr_4HGs.js";
1
+ import { c as createWebWorker, l as languages } from "./index---H6cxNl.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-CHWJx_Tl.js";
3
+ import { a, e, d, R, i, j, t, k } from "./lspLanguageFeatures-CHWJx_Tl.js";
4
4
  const STOP_WHEN_IDLE_FOR = 2 * 60 * 1e3;
5
5
  class WorkerManager {
6
6
  constructor(defaults) {