@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 +10 -0
- package/package.json +5 -6
- package/src/core/sdk.ts +0 -2
- package/src/core/settings-manager.ts +0 -105
- package/src/core/tools/index.ts +0 -4
- package/src/index.ts +0 -2
- package/src/modes/interactive/components/settings-defs.ts +0 -70
- package/src/modes/interactive/components/settings-selector.ts +0 -1
- package/src/modes/interactive/controllers/event-controller.ts +0 -11
- package/src/modes/interactive/controllers/selector-controller.ts +0 -9
- package/src/modes/interactive/interactive-mode.ts +0 -58
- package/src/modes/interactive/types.ts +0 -15
- package/src/core/custom-commands/bundled/wt/index.ts +0 -435
- package/src/core/tools/git.ts +0 -213
- package/src/core/voice-controller.ts +0 -135
- package/src/core/voice-supervisor.ts +0 -976
- package/src/core/voice.ts +0 -314
- package/src/lib/worktree/collapse.ts +0 -180
- package/src/lib/worktree/constants.ts +0 -14
- package/src/lib/worktree/errors.ts +0 -23
- package/src/lib/worktree/git.ts +0 -60
- package/src/lib/worktree/index.ts +0 -15
- package/src/lib/worktree/operations.ts +0 -216
- package/src/lib/worktree/session.ts +0 -114
- package/src/lib/worktree/stats.ts +0 -67
- package/src/modes/interactive/utils/voice-manager.ts +0 -96
- package/src/prompts/tools/git.md +0 -9
- package/src/prompts/voice-summary.md +0 -12
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.
|
|
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.
|
|
44
|
-
"@oh-my-pi/pi-ai": "6.
|
|
45
|
-
"@oh-my-pi/pi-
|
|
46
|
-
"@oh-my-pi/pi-
|
|
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
|
// ═══════════════════════════════════════════════════════════════════════════
|
package/src/core/tools/index.ts
CHANGED
|
@@ -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
|
@@ -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(
|