@oh-my-pi/pi-coding-agent 6.8.5 → 6.9.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.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,16 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [6.9.0] - 2026-01-21
6
+ ### Removed
7
+
8
+ - Removed Git tool and all related functionality
9
+ - Removed voice control and TTS features
10
+ - Removed worktree management system
11
+ - Removed bundled wt custom command
12
+ - Removed voice-related settings and configuration options
13
+ - Removed @oh-my-pi/pi-git-tool dependency
14
+
5
15
  ## [6.8.5] - 2026-01-21
6
16
  ### Breaking Changes
7
17
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oh-my-pi/pi-coding-agent",
3
- "version": "6.8.5",
3
+ "version": "6.9.0",
4
4
  "description": "Coding agent CLI with read, bash, edit, write tools and session management",
5
5
  "type": "module",
6
6
  "ompConfig": {
@@ -40,11 +40,10 @@
40
40
  "prepublishOnly": "bun run generate-template && bun run clean && bun run build"
41
41
  },
42
42
  "dependencies": {
43
- "@oh-my-pi/pi-agent-core": "6.8.5",
44
- "@oh-my-pi/pi-ai": "6.8.5",
45
- "@oh-my-pi/pi-git-tool": "6.8.5",
46
- "@oh-my-pi/pi-tui": "6.8.5",
47
- "@oh-my-pi/pi-utils": "6.8.5",
43
+ "@oh-my-pi/pi-agent-core": "6.9.0",
44
+ "@oh-my-pi/pi-ai": "6.9.0",
45
+ "@oh-my-pi/pi-tui": "6.9.0",
46
+ "@oh-my-pi/pi-utils": "6.9.0",
48
47
  "@openai/agents": "^0.3.7",
49
48
  "@sinclair/typebox": "^0.34.46",
50
49
  "ajv": "^8.17.1",
package/src/core/sdk.ts CHANGED
@@ -86,7 +86,6 @@ import {
86
86
  createTools,
87
87
  EditTool,
88
88
  FindTool,
89
- GitTool,
90
89
  GrepTool,
91
90
  getWebSearchTools,
92
91
  LsTool,
@@ -218,7 +217,6 @@ export {
218
217
  createTools,
219
218
  EditTool,
220
219
  FindTool,
221
- GitTool,
222
220
  GrepTool,
223
221
  loadSshTool,
224
222
  LsTool,
@@ -98,10 +98,6 @@ export interface BashInterceptorSettings {
98
98
  patterns?: BashInterceptorRule[]; // default: built-in rules
99
99
  }
100
100
 
101
- export interface GitSettings {
102
- enabled?: boolean; // default: false (structured git tool; use bash for git commands when disabled)
103
- }
104
-
105
101
  export interface MCPSettings {
106
102
  enableProjectConfig?: boolean; // default: true (load .mcp.json from project root)
107
103
  }
@@ -145,15 +141,6 @@ export interface TodoCompletionSettings {
145
141
  maxReminders?: number; // default: 3 - maximum reminders before giving up
146
142
  }
147
143
 
148
- export interface VoiceSettings {
149
- enabled?: boolean; // default: false
150
- transcriptionModel?: string; // default: "whisper-1"
151
- transcriptionLanguage?: string; // optional language hint (e.g., "en")
152
- ttsModel?: string; // default: "gpt-4o-mini-tts"
153
- ttsVoice?: string; // default: "alloy"
154
- ttsFormat?: "wav" | "mp3" | "opus" | "aac" | "flac"; // default: "wav"
155
- }
156
-
157
144
  export type StatusLineSegmentId =
158
145
  | "pi"
159
146
  | "model"
@@ -224,14 +211,12 @@ export interface Settings {
224
211
  enabledModels?: string[]; // Model patterns for cycling (same format as --models CLI flag)
225
212
  exa?: ExaSettings;
226
213
  bashInterceptor?: BashInterceptorSettings;
227
- git?: GitSettings;
228
214
  mcp?: MCPSettings;
229
215
  lsp?: LspSettings;
230
216
  python?: PythonSettings;
231
217
  edit?: EditSettings;
232
218
  ttsr?: TtsrSettings;
233
219
  todoCompletion?: TodoCompletionSettings;
234
- voice?: VoiceSettings;
235
220
  providers?: ProviderSettings;
236
221
  disabledProviders?: string[]; // Discovery provider IDs that are disabled
237
222
  disabledExtensions?: string[]; // Individual extension IDs that are disabled (e.g., "skill:commit")
@@ -252,12 +237,6 @@ export const DEFAULT_BASH_INTERCEPTOR_RULES: BashInterceptorRule[] = [
252
237
  tool: "grep",
253
238
  message: "Use the `grep` tool instead of grep/rg. It respects .gitignore and provides structured output.",
254
239
  },
255
- {
256
- pattern: "^\\s*git(\\s+|$)",
257
- tool: "git",
258
- message:
259
- "Use the `git` tool instead of running git in bash. It provides structured output and safety confirmations.",
260
- },
261
240
  {
262
241
  pattern: "^\\s*(find|fd|locate)\\s+.*(-name|-iname|-type|--type|-glob)",
263
242
  tool: "find",
@@ -319,19 +298,11 @@ const DEFAULT_SETTINGS: Settings = {
319
298
  enableWebsets: false,
320
299
  },
321
300
  bashInterceptor: DEFAULT_BASH_INTERCEPTOR_SETTINGS,
322
- git: { enabled: false },
323
301
  mcp: { enableProjectConfig: true },
324
302
  lsp: { formatOnWrite: false, diagnosticsOnWrite: true, diagnosticsOnEdit: false },
325
303
  python: { toolMode: "both", kernelMode: "session", sharedGateway: true },
326
304
  edit: { fuzzyMatch: true, fuzzyThreshold: 0.95, streamingAbort: false },
327
305
  ttsr: { enabled: true, contextMode: "discard", repeatMode: "once", repeatGap: 10 },
328
- voice: {
329
- enabled: false,
330
- transcriptionModel: "whisper-1",
331
- ttsModel: "gpt-4o-mini-tts",
332
- ttsVoice: "alloy",
333
- ttsFormat: "wav",
334
- },
335
306
  providers: { webSearch: "auto", image: "auto" },
336
307
  } satisfies Settings;
337
308
 
@@ -1170,10 +1141,6 @@ export class SettingsManager {
1170
1141
  await this.save();
1171
1142
  }
1172
1143
 
1173
- getGitToolEnabled(): boolean {
1174
- return this.settings.git?.enabled ?? false;
1175
- }
1176
-
1177
1144
  getPythonToolMode(): PythonToolMode {
1178
1145
  return this.settings.python?.toolMode ?? "both";
1179
1146
  }
@@ -1210,14 +1177,6 @@ export class SettingsManager {
1210
1177
  await this.save();
1211
1178
  }
1212
1179
 
1213
- async setGitToolEnabled(enabled: boolean): Promise<void> {
1214
- if (!this.globalSettings.git) {
1215
- this.globalSettings.git = {};
1216
- }
1217
- this.globalSettings.git.enabled = enabled;
1218
- await this.save();
1219
- }
1220
-
1221
1180
  getMCPProjectConfigEnabled(): boolean {
1222
1181
  return this.settings.mcp?.enableProjectConfig ?? true;
1223
1182
  }
@@ -1430,70 +1389,6 @@ export class SettingsManager {
1430
1389
  await this.save();
1431
1390
  }
1432
1391
 
1433
- getVoiceSettings(): Required<VoiceSettings> {
1434
- return {
1435
- enabled: this.settings.voice?.enabled ?? false,
1436
- transcriptionModel: this.settings.voice?.transcriptionModel ?? "whisper-1",
1437
- transcriptionLanguage: this.settings.voice?.transcriptionLanguage ?? "",
1438
- ttsModel: this.settings.voice?.ttsModel ?? "tts-1",
1439
- ttsVoice: this.settings.voice?.ttsVoice ?? "alloy",
1440
- ttsFormat: this.settings.voice?.ttsFormat ?? "wav",
1441
- };
1442
- }
1443
-
1444
- async setVoiceSettings(settings: VoiceSettings): Promise<void> {
1445
- this.globalSettings.voice = { ...this.globalSettings.voice, ...settings };
1446
- await this.save();
1447
- }
1448
-
1449
- getVoiceEnabled(): boolean {
1450
- return this.settings.voice?.enabled ?? false;
1451
- }
1452
-
1453
- async setVoiceEnabled(enabled: boolean): Promise<void> {
1454
- if (!this.globalSettings.voice) {
1455
- this.globalSettings.voice = {};
1456
- }
1457
- this.globalSettings.voice.enabled = enabled;
1458
- await this.save();
1459
- }
1460
-
1461
- getVoiceTtsModel(): string {
1462
- return this.settings.voice?.ttsModel ?? "gpt-4o-mini-tts";
1463
- }
1464
-
1465
- async setVoiceTtsModel(model: string): Promise<void> {
1466
- if (!this.globalSettings.voice) {
1467
- this.globalSettings.voice = {};
1468
- }
1469
- this.globalSettings.voice.ttsModel = model;
1470
- await this.save();
1471
- }
1472
-
1473
- getVoiceTtsVoice(): string {
1474
- return this.settings.voice?.ttsVoice ?? "alloy";
1475
- }
1476
-
1477
- async setVoiceTtsVoice(voice: string): Promise<void> {
1478
- if (!this.globalSettings.voice) {
1479
- this.globalSettings.voice = {};
1480
- }
1481
- this.globalSettings.voice.ttsVoice = voice;
1482
- await this.save();
1483
- }
1484
-
1485
- getVoiceTtsFormat(): "wav" | "mp3" | "opus" | "aac" | "flac" {
1486
- return this.settings.voice?.ttsFormat ?? "wav";
1487
- }
1488
-
1489
- async setVoiceTtsFormat(format: "wav" | "mp3" | "opus" | "aac" | "flac"): Promise<void> {
1490
- if (!this.globalSettings.voice) {
1491
- this.globalSettings.voice = {};
1492
- }
1493
- this.globalSettings.voice.ttsFormat = format;
1494
- await this.save();
1495
- }
1496
-
1497
1392
  // ═══════════════════════════════════════════════════════════════════════════
1498
1393
  // Status Line Settings
1499
1394
  // ═══════════════════════════════════════════════════════════════════════════
@@ -7,7 +7,6 @@ export { exaTools } from "./exa/index";
7
7
  export type { ExaRenderDetails, ExaSearchResponse, ExaSearchResult } from "./exa/types";
8
8
  export { type FindOperations, FindTool, type FindToolDetails, type FindToolOptions } from "./find";
9
9
  export { setPreferredImageProvider } from "./gemini-image";
10
- export { GitTool, type GitToolDetails } from "./git";
11
10
  export { type GrepOperations, GrepTool, type GrepToolDetails, type GrepToolOptions } from "./grep";
12
11
  export { type LsOperations, LsTool, type LsToolDetails, type LsToolOptions } from "./ls";
13
12
  export {
@@ -72,7 +71,6 @@ import { BashTool } from "./bash";
72
71
  import { CalculatorTool } from "./calculator";
73
72
  import { CompleteTool } from "./complete";
74
73
  import { FindTool } from "./find";
75
- import { GitTool } from "./git";
76
74
  import { GrepTool } from "./grep";
77
75
  import { LsTool } from "./ls";
78
76
  import { LspTool } from "./lsp/index";
@@ -132,7 +130,6 @@ export interface ToolSession {
132
130
  getEditFuzzyMatch(): boolean;
133
131
  getEditFuzzyThreshold?(): number;
134
132
  getEditPatchMode?(): boolean;
135
- getGitToolEnabled(): boolean;
136
133
  getBashInterceptorEnabled(): boolean;
137
134
  getBashInterceptorSimpleLsEnabled(): boolean;
138
135
  getBashInterceptorRules(): BashInterceptorRule[];
@@ -152,7 +149,6 @@ export const BUILTIN_TOOLS: Record<string, ToolFactory> = {
152
149
  ssh: loadSshTool,
153
150
  edit: (s) => new EditTool(s),
154
151
  find: (s) => new FindTool(s),
155
- git: GitTool.createIf,
156
152
  grep: (s) => new GrepTool(s),
157
153
  ls: (s) => new LsTool(s),
158
154
  lsp: LspTool.createIf,
package/src/index.ts CHANGED
@@ -201,8 +201,6 @@ export {
201
201
  type FindToolDetails,
202
202
  type FindToolOptions,
203
203
  formatSize,
204
- GitTool,
205
- type GitToolDetails,
206
204
  type GrepOperations,
207
205
  type GrepToolDetails,
208
206
  type GrepToolOptions,
@@ -83,7 +83,6 @@ const THINKING_DESCRIPTIONS: Record<ThinkingLevel, string> = {
83
83
  * - behavior: Core agent behavior (compaction, modes, retries, notifications)
84
84
  * - tools: Tool-specific settings (bash, git, python, edit, MCP, skills)
85
85
  * - display: Visual/UI settings (theme, images, thinking)
86
- * - voice: Voice mode and TTS settings
87
86
  * - ttsr: Time Traveling Stream Rules settings
88
87
  * - status: Status line configuration
89
88
  * - lsp: LSP integration settings
@@ -250,15 +249,6 @@ export const SETTINGS_DEFS: SettingDef[] = [
250
249
  get: (sm) => sm.getBashInterceptorSimpleLsEnabled(),
251
250
  set: (sm, v) => sm.setBashInterceptorSimpleLsEnabled(v),
252
251
  },
253
- {
254
- id: "gitTool",
255
- tab: "tools",
256
- type: "boolean",
257
- label: "Git tool",
258
- description: "Enable structured Git tool",
259
- get: (sm) => sm.getGitToolEnabled(),
260
- set: (sm, v) => sm.setGitToolEnabled(v),
261
- },
262
252
  {
263
253
  id: "pythonToolMode",
264
254
  tab: "tools",
@@ -494,66 +484,6 @@ export const SETTINGS_DEFS: SettingDef[] = [
494
484
  set: (sm, v) => sm.setShowHardwareCursor(v),
495
485
  },
496
486
 
497
- // ═══════════════════════════════════════════════════════════════════════════
498
- // Voice tab - Voice mode and TTS settings
499
- // ═══════════════════════════════════════════════════════════════════════════
500
- {
501
- id: "voiceEnabled",
502
- tab: "voice",
503
- type: "boolean",
504
- label: "Voice mode",
505
- description: "Enable realtime voice input/output (Ctrl+Y toggle, auto-send on silence)",
506
- get: (sm) => sm.getVoiceEnabled(),
507
- set: (sm, v) => sm.setVoiceEnabled(v),
508
- },
509
- {
510
- id: "voiceTtsModel",
511
- tab: "voice",
512
- type: "submenu",
513
- label: "TTS model",
514
- description: "Text-to-speech model for voice output",
515
- get: (sm) => sm.getVoiceTtsModel(),
516
- set: (sm, v) => sm.setVoiceTtsModel(v),
517
- getOptions: () => [
518
- { value: "gpt-4o-mini-tts", label: "GPT-4o Mini TTS", description: "Fast and efficient" },
519
- { value: "tts-1", label: "TTS-1", description: "Standard quality" },
520
- { value: "tts-1-hd", label: "TTS-1 HD", description: "Higher quality" },
521
- ],
522
- },
523
- {
524
- id: "voiceTtsVoice",
525
- tab: "voice",
526
- type: "submenu",
527
- label: "TTS voice",
528
- description: "Voice for text-to-speech output",
529
- get: (sm) => sm.getVoiceTtsVoice(),
530
- set: (sm, v) => sm.setVoiceTtsVoice(v),
531
- getOptions: () => [
532
- { value: "alloy", label: "Alloy", description: "Neutral" },
533
- { value: "echo", label: "Echo", description: "Male" },
534
- { value: "fable", label: "Fable", description: "British" },
535
- { value: "onyx", label: "Onyx", description: "Deep male" },
536
- { value: "nova", label: "Nova", description: "Female" },
537
- { value: "shimmer", label: "Shimmer", description: "Female" },
538
- ],
539
- },
540
- {
541
- id: "voiceTtsFormat",
542
- tab: "voice",
543
- type: "submenu",
544
- label: "TTS format",
545
- description: "Audio format for voice output",
546
- get: (sm) => sm.getVoiceTtsFormat(),
547
- set: (sm, v) => sm.setVoiceTtsFormat(v as "wav" | "mp3" | "opus" | "aac" | "flac"),
548
- getOptions: () => [
549
- { value: "wav", label: "WAV", description: "Uncompressed, best quality" },
550
- { value: "mp3", label: "MP3", description: "Compressed, widely compatible" },
551
- { value: "opus", label: "Opus", description: "Efficient compression" },
552
- { value: "aac", label: "AAC", description: "Apple-friendly" },
553
- { value: "flac", label: "FLAC", description: "Lossless compression" },
554
- ],
555
- },
556
-
557
487
  // ═══════════════════════════════════════════════════════════════════════════
558
488
  // TTSR tab - Time Traveling Stream Rules
559
489
  // ═══════════════════════════════════════════════════════════════════════════
@@ -117,7 +117,6 @@ const SETTINGS_TABS: Tab[] = [
117
117
  { id: "behavior", label: "Behavior" },
118
118
  { id: "tools", label: "Tools" },
119
119
  { id: "display", label: "Display" },
120
- { id: "voice", label: "Voice" },
121
120
  { id: "ttsr", label: "TTSR" },
122
121
  { id: "status", label: "Status" },
123
122
  { id: "lsp", label: "LSP" },
@@ -68,7 +68,6 @@ export class EventController {
68
68
  getSymbolTheme().spinnerFrames,
69
69
  );
70
70
  this.ctx.statusContainer.addChild(this.ctx.loadingAnimation);
71
- this.ctx.startVoiceProgressTimer();
72
71
  this.ctx.ui.requestRender();
73
72
  break;
74
73
 
@@ -250,7 +249,6 @@ export class EventController {
250
249
  }
251
250
 
252
251
  case "agent_end":
253
- this.ctx.stopVoiceProgressTimer();
254
252
  if (this.ctx.loadingAnimation) {
255
253
  this.ctx.loadingAnimation.stop();
256
254
  this.ctx.loadingAnimation = undefined;
@@ -262,15 +260,6 @@ export class EventController {
262
260
  this.ctx.streamingMessage = undefined;
263
261
  }
264
262
  this.ctx.pendingTools.clear();
265
- if (this.ctx.settingsManager.getVoiceEnabled() && this.ctx.voiceAutoModeEnabled) {
266
- const lastAssistant = this.ctx.findLastAssistantMessage();
267
- if (lastAssistant && lastAssistant.stopReason !== "aborted" && lastAssistant.stopReason !== "error") {
268
- const text = this.ctx.extractAssistantText(lastAssistant);
269
- if (text) {
270
- this.ctx.voiceSupervisor.notifyResult(text);
271
- }
272
- }
273
- }
274
263
  this.ctx.ui.requestRender();
275
264
  this.sendCompletionNotification();
276
265
  break;
@@ -199,15 +199,6 @@ export class SelectorController {
199
199
  this.ctx.ui.invalidate();
200
200
  break;
201
201
  }
202
- case "voiceEnabled": {
203
- if (!value) {
204
- this.ctx.voiceAutoModeEnabled = false;
205
- this.ctx.stopVoiceProgressTimer();
206
- void this.ctx.voiceSupervisor.stop();
207
- this.ctx.setVoiceStatus(undefined);
208
- }
209
- break;
210
- }
211
202
  case "statusLinePreset":
212
203
  case "statusLineSeparator":
213
204
  case "statusLineShowHooks":
@@ -28,7 +28,6 @@ import { getRecentSessions } from "../../core/session-manager";
28
28
  import type { SettingsManager } from "../../core/settings-manager";
29
29
  import { loadSlashCommands } from "../../core/slash-commands";
30
30
  import { setTerminalTitle } from "../../core/title-generator";
31
- import { VoiceSupervisor } from "../../core/voice-supervisor";
32
31
  import type { AssistantMessageComponent } from "./components/assistant-message";
33
32
  import type { BashExecutionComponent } from "./components/bash-execution";
34
33
  import { CustomEditor } from "./components/custom-editor";
@@ -48,7 +47,6 @@ import type { Theme } from "./theme/theme";
48
47
  import { getEditorTheme, getMarkdownTheme, onThemeChange, theme } from "./theme/theme";
49
48
  import type { CompactionQueuedMessage, InteractiveModeContext, TodoItem } from "./types";
50
49
  import { UiHelpers } from "./utils/ui-helpers";
51
- import { VoiceManager } from "./utils/voice-manager";
52
50
 
53
51
  const TODO_FILE_NAME = "todos.json";
54
52
 
@@ -72,7 +70,6 @@ export class InteractiveMode implements InteractiveModeContext {
72
70
  public settingsManager: SettingsManager;
73
71
  public keybindings: KeybindingsManager;
74
72
  public agent: AgentSession["agent"];
75
- public voiceSupervisor: VoiceSupervisor;
76
73
  public historyStorage?: HistoryStorage;
77
74
 
78
75
  public ui: TUI;
@@ -107,13 +104,8 @@ export class InteractiveMode implements InteractiveModeContext {
107
104
  public onInputCallback?: (input: { text: string; images?: ImageContent[] }) => void;
108
105
  public lastSigintTime = 0;
109
106
  public lastEscapeTime = 0;
110
- public lastVoiceInterruptAt = 0;
111
- public voiceAutoModeEnabled = false;
112
107
  public shutdownRequested = false;
113
108
  private isShuttingDown = false;
114
- public voiceProgressTimer: ReturnType<typeof setTimeout> | undefined = undefined;
115
- public voiceProgressSpoken = false;
116
- public voiceProgressLastLength = 0;
117
109
  public hookSelector: HookSelectorComponent | undefined = undefined;
118
110
  public hookInput: HookInputComponent | undefined = undefined;
119
111
  public hookEditor: HookEditorComponent | undefined = undefined;
@@ -137,7 +129,6 @@ export class InteractiveMode implements InteractiveModeContext {
137
129
  private readonly inputController: InputController;
138
130
  private readonly selectorController: SelectorController;
139
131
  private readonly uiHelpers: UiHelpers;
140
- private readonly voiceManager: VoiceManager;
141
132
 
142
133
  constructor(
143
134
  session: AgentSession,
@@ -180,26 +171,6 @@ export class InteractiveMode implements InteractiveModeContext {
180
171
  this.editorContainer.addChild(this.editor);
181
172
  this.statusLine = new StatusLineComponent(session);
182
173
  this.statusLine.setAutoCompactEnabled(session.autoCompactionEnabled);
183
- this.voiceSupervisor = new VoiceSupervisor(this.session.modelRegistry, {
184
- onSendToAgent: async (text) => {
185
- await this.submitVoiceText(text);
186
- },
187
- onInterruptAgent: async (reason) => {
188
- await this.handleVoiceInterrupt(reason);
189
- },
190
- onStatus: (status) => {
191
- this.setVoiceStatus(status);
192
- },
193
- onError: (error) => {
194
- this.showError(error.message);
195
- this.voiceAutoModeEnabled = false;
196
- void this.voiceSupervisor.stop();
197
- this.setVoiceStatus(undefined);
198
- },
199
- onWarning: (message) => {
200
- this.showWarning(message);
201
- },
202
- });
203
174
 
204
175
  this.hideThinkingBlock = this.settingsManager.getHideThinkingBlock();
205
176
 
@@ -255,7 +226,6 @@ export class InteractiveMode implements InteractiveModeContext {
255
226
  this.pendingSlashCommands = [...slashCommands, ...hookCommands, ...customCommands, ...skillCommandList];
256
227
 
257
228
  this.uiHelpers = new UiHelpers(this);
258
- this.voiceManager = new VoiceManager(this);
259
229
  this.extensionUiController = new ExtensionUiController(this);
260
230
  this.eventController = new EventController(this);
261
231
  this.commandController = new CommandController(this);
@@ -511,9 +481,6 @@ export class InteractiveMode implements InteractiveModeContext {
511
481
  if (this.isShuttingDown) return;
512
482
  this.isShuttingDown = true;
513
483
 
514
- this.voiceAutoModeEnabled = false;
515
- await this.voiceSupervisor.stop();
516
-
517
484
  // Flush pending session writes before shutdown
518
485
  await this.sessionManager.flush();
519
486
 
@@ -783,31 +750,6 @@ export class InteractiveMode implements InteractiveModeContext {
783
750
  this.inputController.registerExtensionShortcuts();
784
751
  }
785
752
 
786
- // Voice handling
787
- setVoiceStatus(text: string | undefined): void {
788
- this.voiceManager.setVoiceStatus(text);
789
- }
790
-
791
- handleVoiceInterrupt(reason?: string): Promise<void> {
792
- return this.voiceManager.handleVoiceInterrupt(reason);
793
- }
794
-
795
- startVoiceProgressTimer(): void {
796
- this.voiceManager.startVoiceProgressTimer();
797
- }
798
-
799
- stopVoiceProgressTimer(): void {
800
- this.voiceManager.stopVoiceProgressTimer();
801
- }
802
-
803
- maybeSpeakProgress(): Promise<void> {
804
- return this.voiceManager.maybeSpeakProgress();
805
- }
806
-
807
- submitVoiceText(text: string): Promise<void> {
808
- return this.voiceManager.submitVoiceText(text);
809
- }
810
-
811
753
  // Hook UI methods
812
754
  initHooksAndCustomTools(): Promise<void> {
813
755
  return this.extensionUiController.initHooksAndCustomTools();
@@ -9,7 +9,6 @@ import type { KeybindingsManager } from "../../core/keybindings";
9
9
  import type { MCPManager } from "../../core/mcp/index";
10
10
  import type { SessionContext, SessionManager } from "../../core/session-manager";
11
11
  import type { SettingsManager } from "../../core/settings-manager";
12
- import type { VoiceSupervisor } from "../../core/voice-supervisor";
13
12
  import type { AssistantMessageComponent } from "./components/assistant-message";
14
13
  import type { BashExecutionComponent } from "./components/bash-execution";
15
14
  import type { CustomEditor } from "./components/custom-editor";
@@ -49,7 +48,6 @@ export interface InteractiveModeContext {
49
48
  settingsManager: SettingsManager;
50
49
  keybindings: KeybindingsManager;
51
50
  agent: AgentSession["agent"];
52
- voiceSupervisor: VoiceSupervisor;
53
51
  historyStorage?: HistoryStorage;
54
52
  mcpManager?: MCPManager;
55
53
  lspServers?: Array<{ name: string; status: "ready" | "error"; fileTypes: string[] }>;
@@ -77,12 +75,7 @@ export interface InteractiveModeContext {
77
75
  onInputCallback?: (input: { text: string; images?: ImageContent[] }) => void;
78
76
  lastSigintTime: number;
79
77
  lastEscapeTime: number;
80
- lastVoiceInterruptAt: number;
81
- voiceAutoModeEnabled: boolean;
82
78
  shutdownRequested: boolean;
83
- voiceProgressTimer: ReturnType<typeof setTimeout> | undefined;
84
- voiceProgressSpoken: boolean;
85
- voiceProgressLastLength: number;
86
79
  hookSelector: HookSelectorComponent | undefined;
87
80
  hookInput: HookInputComponent | undefined;
88
81
  hookEditor: HookEditorComponent | undefined;
@@ -174,14 +167,6 @@ export interface InteractiveModeContext {
174
167
  openExternalEditor(): void;
175
168
  registerExtensionShortcuts(): void;
176
169
 
177
- // Voice handling
178
- setVoiceStatus(text: string | undefined): void;
179
- handleVoiceInterrupt(reason?: string): Promise<void>;
180
- startVoiceProgressTimer(): void;
181
- stopVoiceProgressTimer(): void;
182
- maybeSpeakProgress(): Promise<void>;
183
- submitVoiceText(text: string): Promise<void>;
184
-
185
170
  // Hook UI methods
186
171
  initHooksAndCustomTools(): Promise<void>;
187
172
  emitCustomToolSessionEvent(