@kenkaiiii/ggcoder 4.3.242 → 4.4.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/dist/cli/shared.d.ts.map +1 -1
- package/dist/cli/shared.js +27 -5
- package/dist/cli/shared.js.map +1 -1
- package/dist/config.d.ts +3 -14
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +4 -17
- package/dist/config.js.map +1 -1
- package/dist/core/auth-storage.d.ts +1 -40
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +3 -200
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/auto-update.d.ts +4 -26
- package/dist/core/auto-update.d.ts.map +1 -1
- package/dist/core/auto-update.js +12 -237
- package/dist/core/auto-update.js.map +1 -1
- package/dist/core/claude-code-version.d.ts +1 -9
- package/dist/core/claude-code-version.d.ts.map +1 -1
- package/dist/core/claude-code-version.js +2 -105
- package/dist/core/claude-code-version.js.map +1 -1
- package/dist/core/file-lock.d.ts +1 -5
- package/dist/core/file-lock.d.ts.map +1 -1
- package/dist/core/file-lock.js +2 -75
- package/dist/core/file-lock.js.map +1 -1
- package/dist/core/logger.d.ts +4 -17
- package/dist/core/logger.d.ts.map +1 -1
- package/dist/core/logger.js +21 -110
- package/dist/core/logger.js.map +1 -1
- package/dist/core/model-registry.d.ts +1 -54
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +4 -296
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/oauth/anthropic.d.ts +1 -3
- package/dist/core/oauth/anthropic.d.ts.map +1 -1
- package/dist/core/oauth/anthropic.js +2 -96
- package/dist/core/oauth/anthropic.js.map +1 -1
- package/dist/core/oauth/gemini.d.ts +1 -3
- package/dist/core/oauth/gemini.d.ts.map +1 -1
- package/dist/core/oauth/gemini.js +2 -379
- package/dist/core/oauth/gemini.js.map +1 -1
- package/dist/core/oauth/openai.d.ts +1 -3
- package/dist/core/oauth/openai.d.ts.map +1 -1
- package/dist/core/oauth/openai.js +2 -187
- package/dist/core/oauth/openai.js.map +1 -1
- package/dist/core/oauth/pkce.d.ts +1 -4
- package/dist/core/oauth/pkce.d.ts.map +1 -1
- package/dist/core/oauth/pkce.js +2 -16
- package/dist/core/oauth/pkce.js.map +1 -1
- package/dist/core/oauth/types.d.ts +1 -13
- package/dist/core/oauth/types.d.ts.map +1 -1
- package/dist/core/telegram.d.ts +1 -112
- package/dist/core/telegram.d.ts.map +1 -1
- package/dist/core/telegram.js +2 -251
- package/dist/core/telegram.js.map +1 -1
- package/dist/core/thinking-level.d.ts +1 -4
- package/dist/core/thinking-level.d.ts.map +1 -1
- package/dist/core/thinking-level.js +3 -58
- package/dist/core/thinking-level.js.map +1 -1
- package/dist/core/voice-transcriber.d.ts +1 -32
- package/dist/core/voice-transcriber.d.ts.map +1 -1
- package/dist/core/voice-transcriber.js +3 -112
- package/dist/core/voice-transcriber.js.map +1 -1
- package/dist/ui/App.d.ts.map +1 -1
- package/dist/ui/App.js +27 -5
- package/dist/ui/App.js.map +1 -1
- package/dist/utils/plan-steps.d.ts +18 -0
- package/dist/utils/plan-steps.d.ts.map +1 -1
- package/dist/utils/plan-steps.js +32 -0
- package/dist/utils/plan-steps.js.map +1 -1
- package/dist/utils/plan-steps.test.js +57 -1
- package/dist/utils/plan-steps.test.js.map +1 -1
- package/package.json +4 -3
- package/dist/core/model-registry.test.d.ts +0 -2
- package/dist/core/model-registry.test.d.ts.map +0 -1
- package/dist/core/model-registry.test.js +0 -95
- package/dist/core/model-registry.test.js.map +0 -1
- package/dist/core/oauth/gemini.test.d.ts +0 -2
- package/dist/core/oauth/gemini.test.d.ts.map +0 -1
- package/dist/core/oauth/gemini.test.js +0 -154
- package/dist/core/oauth/gemini.test.js.map +0 -1
- package/dist/core/thinking-level.test.d.ts +0 -2
- package/dist/core/thinking-level.test.d.ts.map +0 -1
- package/dist/core/thinking-level.test.js +0 -38
- package/dist/core/thinking-level.test.js.map +0 -1
- package/dist/core/voice-transcriber.test.d.ts +0 -2
- package/dist/core/voice-transcriber.test.d.ts.map +0 -1
- package/dist/core/voice-transcriber.test.js +0 -88
- package/dist/core/voice-transcriber.test.js.map +0 -1
|
@@ -1,5 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
export declare function getSupportedThinkingLevels(provider: Provider, model: string): readonly ThinkingLevel[];
|
|
3
|
-
export declare function isThinkingLevelSupported(provider: Provider, model: string, level: ThinkingLevel): boolean;
|
|
4
|
-
export declare function getNextThinkingLevel(provider: Provider, model: string, current: ThinkingLevel | undefined): ThinkingLevel | undefined;
|
|
1
|
+
export { getSupportedThinkingLevels, isThinkingLevelSupported, getNextThinkingLevel, } from "@kenkaiiii/gg-core";
|
|
5
2
|
//# sourceMappingURL=thinking-level.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thinking-level.d.ts","sourceRoot":"","sources":["../../src/core/thinking-level.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"thinking-level.d.ts","sourceRoot":"","sources":["../../src/core/thinking-level.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC"}
|
|
@@ -1,59 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
"low",
|
|
5
|
-
"medium",
|
|
6
|
-
"high",
|
|
7
|
-
"xhigh",
|
|
8
|
-
"max",
|
|
9
|
-
];
|
|
10
|
-
const ANTHROPIC_ADAPTIVE_THINKING_LEVELS = [
|
|
11
|
-
"low",
|
|
12
|
-
"medium",
|
|
13
|
-
"high",
|
|
14
|
-
"max",
|
|
15
|
-
];
|
|
16
|
-
function isOpenAIGptModel(provider, model) {
|
|
17
|
-
return provider === "openai" && model.startsWith("gpt-");
|
|
18
|
-
}
|
|
19
|
-
function isAnthropicOpus48Or47Model(provider, model) {
|
|
20
|
-
return provider === "anthropic" && /opus-4-8|opus-4-7/.test(model);
|
|
21
|
-
}
|
|
22
|
-
function isAnthropicAdaptiveModel(provider, model) {
|
|
23
|
-
return provider === "anthropic" && /opus-4-8|opus-4-7|opus-4-6|sonnet-4-6/.test(model);
|
|
24
|
-
}
|
|
25
|
-
export function getSupportedThinkingLevels(provider, model) {
|
|
26
|
-
const maxLevel = getMaxThinkingLevel(model);
|
|
27
|
-
if (isAnthropicAdaptiveModel(provider, model)) {
|
|
28
|
-
const levels = isAnthropicOpus48Or47Model(provider, model)
|
|
29
|
-
? ANTHROPIC_OPUS_48_47_THINKING_LEVELS
|
|
30
|
-
: ANTHROPIC_ADAPTIVE_THINKING_LEVELS;
|
|
31
|
-
const maxIndex = levels.indexOf(maxLevel);
|
|
32
|
-
if (maxIndex === -1)
|
|
33
|
-
return ["low", "medium", "high"];
|
|
34
|
-
return levels.slice(0, maxIndex + 1);
|
|
35
|
-
}
|
|
36
|
-
if (!isOpenAIGptModel(provider, model))
|
|
37
|
-
return [maxLevel];
|
|
38
|
-
const maxIndex = OPENAI_GPT_THINKING_LEVELS.indexOf(maxLevel);
|
|
39
|
-
if (maxIndex === -1)
|
|
40
|
-
return ["medium"];
|
|
41
|
-
return OPENAI_GPT_THINKING_LEVELS.slice(0, maxIndex + 1);
|
|
42
|
-
}
|
|
43
|
-
export function isThinkingLevelSupported(provider, model, level) {
|
|
44
|
-
return getSupportedThinkingLevels(provider, model).includes(level);
|
|
45
|
-
}
|
|
46
|
-
export function getNextThinkingLevel(provider, model, current) {
|
|
47
|
-
const supportedLevels = getSupportedThinkingLevels(provider, model);
|
|
48
|
-
const shouldCycleLevels = isOpenAIGptModel(provider, model) || isAnthropicAdaptiveModel(provider, model);
|
|
49
|
-
if (!shouldCycleLevels) {
|
|
50
|
-
return current ? undefined : supportedLevels[0];
|
|
51
|
-
}
|
|
52
|
-
if (!current)
|
|
53
|
-
return supportedLevels[0];
|
|
54
|
-
const index = supportedLevels.indexOf(current);
|
|
55
|
-
if (index === -1)
|
|
56
|
-
return supportedLevels[0];
|
|
57
|
-
return supportedLevels[index + 1];
|
|
58
|
-
}
|
|
1
|
+
// Moved to @kenkaiiii/gg-core. This shim re-exports it so existing relative
|
|
2
|
+
// imports (`./thinking-level.js`) keep resolving unchanged.
|
|
3
|
+
export { getSupportedThinkingLevels, isThinkingLevelSupported, getNextThinkingLevel, } from "@kenkaiiii/gg-core";
|
|
59
4
|
//# sourceMappingURL=thinking-level.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thinking-level.js","sourceRoot":"","sources":["../../src/core/thinking-level.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"thinking-level.js","sourceRoot":"","sources":["../../src/core/thinking-level.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,4DAA4D;AAC5D,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC"}
|
|
@@ -1,33 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
* Voice note transcription using local Whisper model.
|
|
3
|
-
* Uses @huggingface/transformers (pure JS/WASM) — no native deps, no API keys.
|
|
4
|
-
* Model (~75MB) is downloaded on first use and cached locally.
|
|
5
|
-
*/
|
|
6
|
-
/** Optional callback for model download progress. */
|
|
7
|
-
export type ProgressCallback = (info: {
|
|
8
|
-
status: string;
|
|
9
|
-
progress?: number;
|
|
10
|
-
file?: string;
|
|
11
|
-
}) => void;
|
|
12
|
-
/** Set a callback to receive model download progress updates. */
|
|
13
|
-
export declare function setProgressCallback(cb: ProgressCallback | null): void;
|
|
14
|
-
/**
|
|
15
|
-
* Resample audio from one sample rate to another using linear interpolation.
|
|
16
|
-
*/
|
|
17
|
-
export declare function resample(audio: Float32Array, fromRate: number, toRate: number): Float32Array;
|
|
18
|
-
/**
|
|
19
|
-
* Downmix multi-channel audio to mono by averaging all channels.
|
|
20
|
-
*/
|
|
21
|
-
export declare function downmixToMono(channelData: Float32Array[]): Float32Array;
|
|
22
|
-
/**
|
|
23
|
-
* Decode OGG Opus audio buffer to 16kHz mono PCM Float32Array.
|
|
24
|
-
*/
|
|
25
|
-
export declare function decodeOggOpus(buffer: Uint8Array): Promise<Float32Array>;
|
|
26
|
-
/** Whether the model has been loaded already. */
|
|
27
|
-
export declare function isModelLoaded(): boolean;
|
|
28
|
-
/**
|
|
29
|
-
* Transcribe a voice message from its Telegram file URL.
|
|
30
|
-
* Downloads the OGG Opus file, decodes to PCM, and runs Whisper locally.
|
|
31
|
-
*/
|
|
32
|
-
export declare function transcribeVoice(fileUrl: string): Promise<string>;
|
|
1
|
+
export { setProgressCallback, resample, downmixToMono, decodeOggOpus, isModelLoaded, transcribeVoice, type ProgressCallback, } from "@kenkaiiii/gg-core";
|
|
33
2
|
//# sourceMappingURL=voice-transcriber.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"voice-transcriber.d.ts","sourceRoot":"","sources":["../../src/core/voice-transcriber.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"voice-transcriber.d.ts","sourceRoot":"","sources":["../../src/core/voice-transcriber.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,mBAAmB,EACnB,QAAQ,EACR,aAAa,EACb,aAAa,EACb,aAAa,EACb,eAAe,EACf,KAAK,gBAAgB,GACtB,MAAM,oBAAoB,CAAC"}
|
|
@@ -1,113 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
* Model (~75MB) is downloaded on first use and cached locally.
|
|
5
|
-
*/
|
|
6
|
-
const TARGET_SAMPLE_RATE = 16000;
|
|
7
|
-
const MODEL_ID = "Xenova/whisper-tiny.en";
|
|
8
|
-
let transcriber = null;
|
|
9
|
-
let loadPromise = null;
|
|
10
|
-
let onProgress = null;
|
|
11
|
-
/** Set a callback to receive model download progress updates. */
|
|
12
|
-
export function setProgressCallback(cb) {
|
|
13
|
-
onProgress = cb;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Resample audio from one sample rate to another using linear interpolation.
|
|
17
|
-
*/
|
|
18
|
-
export function resample(audio, fromRate, toRate) {
|
|
19
|
-
if (fromRate === toRate)
|
|
20
|
-
return audio;
|
|
21
|
-
const ratio = fromRate / toRate;
|
|
22
|
-
const newLength = Math.round(audio.length / ratio);
|
|
23
|
-
const result = new Float32Array(newLength);
|
|
24
|
-
for (let i = 0; i < newLength; i++) {
|
|
25
|
-
const srcIndex = i * ratio;
|
|
26
|
-
const low = Math.floor(srcIndex);
|
|
27
|
-
const high = Math.min(low + 1, audio.length - 1);
|
|
28
|
-
const frac = srcIndex - low;
|
|
29
|
-
result[i] = audio[low] * (1 - frac) + audio[high] * frac;
|
|
30
|
-
}
|
|
31
|
-
return result;
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Downmix multi-channel audio to mono by averaging all channels.
|
|
35
|
-
*/
|
|
36
|
-
export function downmixToMono(channelData) {
|
|
37
|
-
if (channelData.length === 0)
|
|
38
|
-
return new Float32Array();
|
|
39
|
-
if (channelData.length === 1)
|
|
40
|
-
return channelData[0];
|
|
41
|
-
const samples = channelData[0].length;
|
|
42
|
-
const out = new Float32Array(samples);
|
|
43
|
-
const scale = 1 / channelData.length;
|
|
44
|
-
for (let i = 0; i < samples; i++) {
|
|
45
|
-
let mixed = 0;
|
|
46
|
-
for (const channel of channelData)
|
|
47
|
-
mixed += channel[i] ?? 0;
|
|
48
|
-
out[i] = mixed * scale;
|
|
49
|
-
}
|
|
50
|
-
return out;
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Decode OGG Opus audio buffer to 16kHz mono PCM Float32Array.
|
|
54
|
-
*/
|
|
55
|
-
export async function decodeOggOpus(buffer) {
|
|
56
|
-
const { OggOpusDecoder } = await import("ogg-opus-decoder");
|
|
57
|
-
const decoder = new OggOpusDecoder();
|
|
58
|
-
await decoder.ready;
|
|
59
|
-
try {
|
|
60
|
-
const decoded = await decoder.decodeFile(buffer);
|
|
61
|
-
if (!decoded.channelData?.length || !decoded.channelData[0]?.length) {
|
|
62
|
-
throw new Error("Decoded audio is empty");
|
|
63
|
-
}
|
|
64
|
-
const mono = downmixToMono(decoded.channelData);
|
|
65
|
-
return resample(mono, decoded.sampleRate, TARGET_SAMPLE_RATE);
|
|
66
|
-
}
|
|
67
|
-
finally {
|
|
68
|
-
decoder.free();
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Get or initialize the Whisper transcription pipeline.
|
|
73
|
-
* Model is downloaded on first use and cached by transformers.js.
|
|
74
|
-
*/
|
|
75
|
-
async function getTranscriber() {
|
|
76
|
-
if (transcriber)
|
|
77
|
-
return transcriber;
|
|
78
|
-
if (!loadPromise) {
|
|
79
|
-
loadPromise = (async () => {
|
|
80
|
-
const { pipeline } = await import("@huggingface/transformers");
|
|
81
|
-
const instance = await pipeline("automatic-speech-recognition", MODEL_ID, {
|
|
82
|
-
dtype: "fp32",
|
|
83
|
-
progress_callback: onProgress ?? undefined,
|
|
84
|
-
});
|
|
85
|
-
transcriber = instance;
|
|
86
|
-
return instance;
|
|
87
|
-
})();
|
|
88
|
-
}
|
|
89
|
-
return loadPromise;
|
|
90
|
-
}
|
|
91
|
-
/** Whether the model has been loaded already. */
|
|
92
|
-
export function isModelLoaded() {
|
|
93
|
-
return transcriber !== null;
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Transcribe a voice message from its Telegram file URL.
|
|
97
|
-
* Downloads the OGG Opus file, decodes to PCM, and runs Whisper locally.
|
|
98
|
-
*/
|
|
99
|
-
export async function transcribeVoice(fileUrl) {
|
|
100
|
-
// Download the audio file
|
|
101
|
-
const response = await fetch(fileUrl);
|
|
102
|
-
if (!response.ok)
|
|
103
|
-
throw new Error(`Failed to download voice file: ${response.status}`);
|
|
104
|
-
const buffer = new Uint8Array(await response.arrayBuffer());
|
|
105
|
-
// Decode OGG Opus → 16kHz mono PCM
|
|
106
|
-
const pcm = await decodeOggOpus(buffer);
|
|
107
|
-
// Transcribe with Whisper
|
|
108
|
-
const asr = await getTranscriber();
|
|
109
|
-
const result = await asr(pcm);
|
|
110
|
-
const text = Array.isArray(result) ? result[0]?.text : result.text;
|
|
111
|
-
return (text ?? "").trim();
|
|
112
|
-
}
|
|
1
|
+
// Moved to @kenkaiiii/gg-core. Shim keeps `../core/voice-transcriber.js`
|
|
2
|
+
// imports working.
|
|
3
|
+
export { setProgressCallback, resample, downmixToMono, decodeOggOpus, isModelLoaded, transcribeVoice, } from "@kenkaiiii/gg-core";
|
|
113
4
|
//# sourceMappingURL=voice-transcriber.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"voice-transcriber.js","sourceRoot":"","sources":["../../src/core/voice-transcriber.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"voice-transcriber.js","sourceRoot":"","sources":["../../src/core/voice-transcriber.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,mBAAmB;AACnB,OAAO,EACL,mBAAmB,EACnB,QAAQ,EACR,aAAa,EACb,aAAa,EACb,aAAa,EACb,eAAe,GAEhB,MAAM,oBAAoB,CAAC"}
|
package/dist/ui/App.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/ui/App.tsx"],"names":[],"mappings":"AAqBA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,KAAK,aAAa,EAEnB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAcrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAwBjE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAkB,eAAe,EAAe,MAAM,6BAA6B,CAAC;AAEhG,OAAO,
|
|
1
|
+
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/ui/App.tsx"],"names":[],"mappings":"AAqBA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,KAAK,aAAa,EAEnB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAcrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAwBjE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAkB,eAAe,EAAe,MAAM,6BAA6B,CAAC;AAEhG,OAAO,EAOL,KAAK,QAAQ,EACd,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAY3D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAQpE,OAAO,EAIL,KAAK,UAAU,EAChB,MAAM,uBAAuB,CAAC;AAS/B,OAAO,EAOL,KAAK,YAAY,EAClB,MAAM,sBAAsB,CAAC;AAY9B,OAAO,KAAK,EACV,aAAa,EAYd,MAAM,gBAAgB,CAAC;AAExB,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAOnE,YAAY,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,+BAA+B,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC/F,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EACL,6BAA6B,EAC7B,oBAAoB,EACpB,8BAA8B,EAC9B,mBAAmB,EACnB,gCAAgC,EAChC,qBAAqB,EACrB,+BAA+B,EAC/B,mCAAmC,EACnC,kCAAkC,EAClC,uCAAuC,EACvC,wCAAwC,EACxC,gCAAgC,GACjC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,sBAAsB,EACtB,YAAY,EACZ,kBAAkB,EAClB,kCAAkC,GACnC,MAAM,mBAAmB,CAAC;AAiB3B,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC3D,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC/B,qBAAqB,CAAC,EAAE,MAAM,CAC5B,MAAM,EACN;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAClF,CAAC;IACF,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,WAAW,CAAC,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IACnC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;IACjB,qEAAqE;IACrE,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kBAAkB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;IAClD,sBAAsB,CAAC,EAAE,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IACpD,aAAa,CAAC,EAAE;QACd,WAAW,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACxD,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;KACpD,CAAC;IACF,sBAAsB,CAAC,EAAE,sBAAsB,CAAC;IAChD;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE;QACnB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;QACrB,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;QAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;QACvB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,aAAa,CAAC,EAAE;YACd,MAAM,EAAE,MAAM,CAAC;YACf,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,SAAS,CAAC,EAAE;gBAAE,KAAK,EAAE,UAAU,GAAG,UAAU,GAAG,WAAW,CAAC;gBAAC,MAAM,CAAC,EAAE,MAAM,CAAA;aAAE,CAAC;SAC/E,CAAC;KACH,KAAK,IAAI,CAAC;IACX;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,CAAC,OAAO,EAAE;QAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,QAAQ,CAAC;QACpB,QAAQ,CAAC,EAAE,aAAa,CAAC;KAC1B,KAAK,IAAI,CAAC;IACX;;;;;OAKG;IACH,YAAY,CAAC,EAAE;QACb,QAAQ,EAAE,OAAO,EAAE,CAAC;QACpB,OAAO,EAAE,aAAa,EAAE,CAAC;QACzB,SAAS,CAAC,EAAE,aAAa,EAAE,CAAC;QAC5B,UAAU,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;QAC/B,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,SAAS,EAAE,QAAQ,EAAE,CAAC;QACtB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,qBAAqB,EAAE,OAAO,CAAC;QAC/B,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC;QACjE,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,aAAa,CAAC,EAAE;YACd,MAAM,EAAE,MAAM,CAAC;YACf,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,SAAS,CAAC,EAAE;gBAAE,KAAK,EAAE,UAAU,GAAG,UAAU,GAAG,WAAW,CAAC;gBAAC,MAAM,CAAC,EAAE,MAAM,CAAA;aAAE,CAAC;SAC/E,CAAC;QACF,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,YAAY,CAAC,EAAE,YAAY,CAAC;QAC5B,kBAAkB,CAAC,EAAE,OAAO,CAAC;KAC9B,CAAC;CACH;AAuBD,wBAAgB,GAAG,CAAC,KAAK,EAAE,QAAQ,2CAgwFlC"}
|
package/dist/ui/App.js
CHANGED
|
@@ -35,7 +35,7 @@ import { loadCustomCommands } from "../core/custom-commands.js";
|
|
|
35
35
|
import { detectLanguages } from "../core/language-detector.js";
|
|
36
36
|
import { detectVerifyCommands } from "../core/verify-commands.js";
|
|
37
37
|
import { RewindOverlay } from "./components/RewindOverlay.js";
|
|
38
|
-
import { extractPlanSteps, findCompletedMarkers, markStepsCompleted, segmentDisplayText, stripDoneMarkers, } from "../utils/plan-steps.js";
|
|
38
|
+
import { extractPlanSteps, findCompletedMarkers, markStepsCompleted, rebasePlanSteps, segmentDisplayText, stripDoneMarkers, } from "../utils/plan-steps.js";
|
|
39
39
|
import { getAllMcpServers } from "../core/mcp/index.js";
|
|
40
40
|
import { trimFlushedItems, flushOnTurnText, flushOnTurnEnd, flushOverflow, } from "./live-item-flush.js";
|
|
41
41
|
import { splitAssistantStreamingText, estimateRenderedRows, } from "./utils/assistant-stream-split.js";
|
|
@@ -682,10 +682,32 @@ export function App(props) {
|
|
|
682
682
|
if (planStepsRef.current.length > 0) {
|
|
683
683
|
const completed = findCompletedMarkers(text);
|
|
684
684
|
if (completed.size > 0) {
|
|
685
|
-
const
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
685
|
+
const planPath = approvedPlanPathRef.current;
|
|
686
|
+
// The agent can rewrite/expand the approved plan mid-run, so the
|
|
687
|
+
// snapshot captured at approval goes stale (wrong total, and new
|
|
688
|
+
// [DONE:n] markers match nothing). Re-extract from the live plan
|
|
689
|
+
// file and re-base onto it before applying markers. The file read
|
|
690
|
+
// is async; apply markers inside the same async step to avoid a
|
|
691
|
+
// race with the snapshot. Fall back to the in-memory snapshot if
|
|
692
|
+
// there is no plan path or the read fails.
|
|
693
|
+
const applyMarkers = (base) => {
|
|
694
|
+
const updated = markStepsCompleted(base, completed);
|
|
695
|
+
if (updated !== planStepsRef.current) {
|
|
696
|
+
planStepsRef.current = updated;
|
|
697
|
+
setPlanSteps(updated);
|
|
698
|
+
}
|
|
699
|
+
};
|
|
700
|
+
if (planPath) {
|
|
701
|
+
void import("node:fs/promises")
|
|
702
|
+
.then(({ readFile }) => readFile(planPath, "utf-8"))
|
|
703
|
+
.then((planContent) => {
|
|
704
|
+
const fresh = extractPlanSteps(planContent);
|
|
705
|
+
applyMarkers(rebasePlanSteps(planStepsRef.current, fresh));
|
|
706
|
+
})
|
|
707
|
+
.catch(() => applyMarkers(planStepsRef.current));
|
|
708
|
+
}
|
|
709
|
+
else {
|
|
710
|
+
applyMarkers(planStepsRef.current);
|
|
689
711
|
}
|
|
690
712
|
// Real progress happened — reset the stuck-guard so the next
|
|
691
713
|
// step gets its own fresh nudge budget.
|