@defai.digital/ax-cli 3.7.2 → 3.8.1
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/README.md +128 -56
- package/dist/agent/context-manager.d.ts +15 -1
- package/dist/agent/context-manager.js +50 -19
- package/dist/agent/context-manager.js.map +1 -1
- package/dist/agent/dependency-resolver.js +13 -7
- package/dist/agent/dependency-resolver.js.map +1 -1
- package/dist/agent/llm-agent.d.ts +35 -0
- package/dist/agent/llm-agent.js +137 -4
- package/dist/agent/llm-agent.js.map +1 -1
- package/dist/agent/status-reporter.d.ts +114 -0
- package/dist/agent/status-reporter.js +335 -0
- package/dist/agent/status-reporter.js.map +1 -0
- package/dist/analyzers/best-practices/rules/typescript/no-magic-numbers.js +8 -2
- package/dist/analyzers/best-practices/rules/typescript/no-magic-numbers.js.map +1 -1
- package/dist/analyzers/best-practices/rules/typescript/no-unused-vars.js +3 -1
- package/dist/analyzers/best-practices/rules/typescript/no-unused-vars.js.map +1 -1
- package/dist/analyzers/best-practices/rules/typescript/prefer-const.js +3 -1
- package/dist/analyzers/best-practices/rules/typescript/prefer-const.js.map +1 -1
- package/dist/analyzers/best-practices/rules/typescript/prefer-readonly.js +3 -1
- package/dist/analyzers/best-practices/rules/typescript/prefer-readonly.js.map +1 -1
- package/dist/analyzers/code-smells/detectors/duplicate-code-detector.js +9 -3
- package/dist/analyzers/code-smells/detectors/duplicate-code-detector.js.map +1 -1
- package/dist/analyzers/git/churn-calculator.d.ts +1 -0
- package/dist/analyzers/git/churn-calculator.js +25 -6
- package/dist/analyzers/git/churn-calculator.js.map +1 -1
- package/dist/analyzers/git/hotspot-detector.js +2 -2
- package/dist/analyzers/git/hotspot-detector.js.map +1 -1
- package/dist/analyzers/metrics/metrics-analyzer.js +1 -1
- package/dist/analyzers/metrics/metrics-analyzer.js.map +1 -1
- package/dist/analyzers/security/security-analyzer.js +1 -1
- package/dist/analyzers/security/security-analyzer.js.map +1 -1
- package/dist/checkpoint/manager.d.ts +1 -0
- package/dist/checkpoint/manager.js +49 -9
- package/dist/checkpoint/manager.js.map +1 -1
- package/dist/checkpoint/storage.js +2 -2
- package/dist/checkpoint/storage.js.map +1 -1
- package/dist/commands/mcp-migrate.d.ts +9 -0
- package/dist/commands/mcp-migrate.js +172 -0
- package/dist/commands/mcp-migrate.js.map +1 -0
- package/dist/commands/status.d.ts +7 -0
- package/dist/commands/status.js +211 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/vscode.d.ts +7 -0
- package/dist/commands/vscode.js +363 -0
- package/dist/commands/vscode.js.map +1 -0
- package/dist/index.js +79 -30
- package/dist/index.js.map +1 -1
- package/dist/llm/client.js +22 -4
- package/dist/llm/client.js.map +1 -1
- package/dist/mcp/automatosx-loader.d.ts +84 -0
- package/dist/mcp/automatosx-loader.js +238 -0
- package/dist/mcp/automatosx-loader.js.map +1 -0
- package/dist/mcp/client-mutex-patch.d.ts +36 -0
- package/dist/mcp/client-mutex-patch.js +75 -0
- package/dist/mcp/client-mutex-patch.js.map +1 -0
- package/dist/mcp/client-v2.d.ts +229 -0
- package/dist/mcp/client-v2.js +740 -0
- package/dist/mcp/client-v2.js.map +1 -0
- package/dist/mcp/client.d.ts +111 -13
- package/dist/mcp/client.js +168 -253
- package/dist/mcp/client.js.map +1 -1
- package/dist/mcp/config-detector-v2.d.ts +83 -0
- package/dist/mcp/config-detector-v2.js +328 -0
- package/dist/mcp/config-detector-v2.js.map +1 -0
- package/dist/mcp/config-detector.d.ts +90 -0
- package/dist/mcp/config-detector.js +242 -0
- package/dist/mcp/config-detector.js.map +1 -0
- package/dist/mcp/config-migrator-v2.d.ts +89 -0
- package/dist/mcp/config-migrator-v2.js +288 -0
- package/dist/mcp/config-migrator-v2.js.map +1 -0
- package/dist/mcp/config-migrator.d.ts +63 -0
- package/dist/mcp/config-migrator.js +269 -0
- package/dist/mcp/config-migrator.js.map +1 -0
- package/dist/mcp/config-v2.d.ts +106 -0
- package/dist/mcp/config-v2.js +417 -0
- package/dist/mcp/config-v2.js.map +1 -0
- package/dist/mcp/config.d.ts +12 -1
- package/dist/mcp/config.js +95 -10
- package/dist/mcp/config.js.map +1 -1
- package/dist/mcp/error-formatter.d.ts +46 -0
- package/dist/mcp/error-formatter.js +244 -0
- package/dist/mcp/error-formatter.js.map +1 -0
- package/dist/mcp/health.d.ts +5 -0
- package/dist/mcp/health.js +22 -2
- package/dist/mcp/health.js.map +1 -1
- package/dist/mcp/invariants.d.ts +141 -0
- package/dist/mcp/invariants.js +243 -0
- package/dist/mcp/invariants.js.map +1 -0
- package/dist/mcp/mutex-safe.d.ts +153 -0
- package/dist/mcp/mutex-safe.js +260 -0
- package/dist/mcp/mutex-safe.js.map +1 -0
- package/dist/mcp/mutex.d.ts +73 -0
- package/dist/mcp/mutex.js +130 -0
- package/dist/mcp/mutex.js.map +1 -0
- package/dist/mcp/reconnection.d.ts +4 -0
- package/dist/mcp/reconnection.js +15 -0
- package/dist/mcp/reconnection.js.map +1 -1
- package/dist/mcp/transports-v2.d.ts +152 -0
- package/dist/mcp/transports-v2.js +481 -0
- package/dist/mcp/transports-v2.js.map +1 -0
- package/dist/mcp/type-safety.d.ts +231 -0
- package/dist/mcp/type-safety.js +273 -0
- package/dist/mcp/type-safety.js.map +1 -0
- package/dist/planner/task-planner.js +13 -0
- package/dist/planner/task-planner.js.map +1 -1
- package/dist/planner/types.d.ts +6 -6
- package/dist/schemas/confirmation-schemas.d.ts +2 -2
- package/dist/schemas/settings-schemas.d.ts +196 -0
- package/dist/schemas/settings-schemas.js +146 -5
- package/dist/schemas/settings-schemas.js.map +1 -1
- package/dist/sdk/index.d.ts +118 -2
- package/dist/sdk/index.js +146 -4
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/testing.d.ts +182 -0
- package/dist/sdk/testing.js +231 -0
- package/dist/sdk/testing.js.map +1 -1
- package/dist/sdk/version.d.ts +114 -15
- package/dist/sdk/version.js +137 -15
- package/dist/sdk/version.js.map +1 -1
- package/dist/tools/bash.js +54 -9
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/registry.d.ts +146 -0
- package/dist/tools/registry.js +170 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/search.js +12 -2
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/text-editor.js +84 -26
- package/dist/tools/text-editor.js.map +1 -1
- package/dist/ui/components/chat-history.js +6 -1
- package/dist/ui/components/chat-history.js.map +1 -1
- package/dist/ui/components/chat-input.d.ts +2 -1
- package/dist/ui/components/chat-input.js +5 -2
- package/dist/ui/components/chat-input.js.map +1 -1
- package/dist/ui/components/chat-interface.js +187 -5
- package/dist/ui/components/chat-interface.js.map +1 -1
- package/dist/ui/components/context-breakdown.d.ts +23 -0
- package/dist/ui/components/context-breakdown.js +124 -0
- package/dist/ui/components/context-breakdown.js.map +1 -0
- package/dist/ui/components/keyboard-help.d.ts +17 -0
- package/dist/ui/components/keyboard-help.js +116 -0
- package/dist/ui/components/keyboard-help.js.map +1 -0
- package/dist/ui/components/keyboard-hints.js +2 -2
- package/dist/ui/components/keyboard-hints.js.map +1 -1
- package/dist/ui/components/quick-actions.js +43 -7
- package/dist/ui/components/quick-actions.js.map +1 -1
- package/dist/ui/components/status-bar.d.ts +3 -0
- package/dist/ui/components/status-bar.js +25 -16
- package/dist/ui/components/status-bar.js.map +1 -1
- package/dist/ui/components/toast-notification.d.ts +42 -0
- package/dist/ui/components/toast-notification.js +30 -2
- package/dist/ui/components/toast-notification.js.map +1 -1
- package/dist/ui/components/tool-group-display.js +34 -4
- package/dist/ui/components/tool-group-display.js.map +1 -1
- package/dist/ui/components/welcome-panel.js +2 -2
- package/dist/ui/components/welcome-panel.js.map +1 -1
- package/dist/ui/hooks/use-enhanced-input.d.ts +9 -1
- package/dist/ui/hooks/use-enhanced-input.js +486 -41
- package/dist/ui/hooks/use-enhanced-input.js.map +1 -1
- package/dist/ui/hooks/use-input-handler.d.ts +11 -1
- package/dist/ui/hooks/use-input-handler.js +67 -3
- package/dist/ui/hooks/use-input-handler.js.map +1 -1
- package/dist/ui/hooks/use-input-history.d.ts +1 -1
- package/dist/ui/hooks/use-input-history.js +50 -14
- package/dist/ui/hooks/use-input-history.js.map +1 -1
- package/dist/ui/utils/bracketed-paste-handler.d.ts +97 -0
- package/dist/ui/utils/bracketed-paste-handler.js +322 -0
- package/dist/ui/utils/bracketed-paste-handler.js.map +1 -0
- package/dist/ui/utils/change-summarizer.js +16 -6
- package/dist/ui/utils/change-summarizer.js.map +1 -1
- package/dist/ui/utils/tool-grouper.d.ts +10 -1
- package/dist/ui/utils/tool-grouper.js +143 -30
- package/dist/ui/utils/tool-grouper.js.map +1 -1
- package/dist/utils/auto-accept-logger.d.ts +173 -0
- package/dist/utils/auto-accept-logger.js +420 -0
- package/dist/utils/auto-accept-logger.js.map +1 -0
- package/dist/utils/background-task-manager.d.ts +11 -0
- package/dist/utils/background-task-manager.js +124 -38
- package/dist/utils/background-task-manager.js.map +1 -1
- package/dist/utils/confirmation-service.d.ts +1 -0
- package/dist/utils/confirmation-service.js +6 -1
- package/dist/utils/confirmation-service.js.map +1 -1
- package/dist/utils/encryption.d.ts +8 -0
- package/dist/utils/encryption.js +44 -27
- package/dist/utils/encryption.js.map +1 -1
- package/dist/utils/enhanced-error-messages.d.ts +33 -0
- package/dist/utils/enhanced-error-messages.js +420 -0
- package/dist/utils/enhanced-error-messages.js.map +1 -0
- package/dist/utils/error-handler.d.ts +13 -3
- package/dist/utils/error-handler.js +16 -4
- package/dist/utils/error-handler.js.map +1 -1
- package/dist/utils/external-editor.d.ts +47 -0
- package/dist/utils/external-editor.js +179 -0
- package/dist/utils/external-editor.js.map +1 -0
- package/dist/utils/history-migration.d.ts +9 -0
- package/dist/utils/history-migration.js +36 -0
- package/dist/utils/history-migration.js.map +1 -0
- package/dist/utils/paste-utils.js +12 -11
- package/dist/utils/paste-utils.js.map +1 -1
- package/dist/utils/rate-limiter.js +7 -0
- package/dist/utils/rate-limiter.js.map +1 -1
- package/dist/utils/safety-rules.d.ts +64 -0
- package/dist/utils/safety-rules.js +225 -0
- package/dist/utils/safety-rules.js.map +1 -0
- package/dist/utils/settings-manager.d.ts +89 -1
- package/dist/utils/settings-manager.js +359 -3
- package/dist/utils/settings-manager.js.map +1 -1
- package/dist/utils/token-counter.d.ts +2 -0
- package/dist/utils/token-counter.js +17 -4
- package/dist/utils/token-counter.js.map +1 -1
- package/dist/utils/version.d.ts +11 -2
- package/dist/utils/version.js +54 -21
- package/dist/utils/version.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bracketed Paste Mode Handler
|
|
3
|
+
*
|
|
4
|
+
* Implements industry-standard bracketed paste detection for reliable paste handling
|
|
5
|
+
* across all terminal types (SSH, tmux, iTerm2, etc.)
|
|
6
|
+
*
|
|
7
|
+
* Bracketed paste mode sends special escape sequences:
|
|
8
|
+
* - Start: \x1b[200~ (ESC [200~)
|
|
9
|
+
* - End: \x1b[201~ (ESC [201~)
|
|
10
|
+
*
|
|
11
|
+
* This handler implements a state machine that:
|
|
12
|
+
* 1. Accumulates partial escape sequences across multiple input events
|
|
13
|
+
* 2. Handles timeout/recovery if end marker never arrives
|
|
14
|
+
* 3. Sanitizes escape sequences from pasted content (security)
|
|
15
|
+
* 4. Falls back to simple batched detection if not supported
|
|
16
|
+
*/
|
|
17
|
+
export interface PasteDetectionResult {
|
|
18
|
+
isPaste: boolean;
|
|
19
|
+
content: string;
|
|
20
|
+
isAccumulating: boolean;
|
|
21
|
+
}
|
|
22
|
+
export declare class BracketedPasteHandler {
|
|
23
|
+
private state;
|
|
24
|
+
private buffer;
|
|
25
|
+
private escapeBuffer;
|
|
26
|
+
private timeoutHandle;
|
|
27
|
+
private readonly PASTE_TIMEOUT_MS;
|
|
28
|
+
private readonly START_MARKER;
|
|
29
|
+
private readonly END_MARKER;
|
|
30
|
+
private readonly MAX_PASTE_SIZE;
|
|
31
|
+
private pasteCount;
|
|
32
|
+
/**
|
|
33
|
+
* Handle incoming input character(s)
|
|
34
|
+
* Returns detection result indicating if paste is complete, accumulating, or normal input
|
|
35
|
+
*/
|
|
36
|
+
handleInput(inputChar: string): PasteDetectionResult;
|
|
37
|
+
/**
|
|
38
|
+
* Handle idle state - detect paste start marker
|
|
39
|
+
*/
|
|
40
|
+
private handleIdleState;
|
|
41
|
+
/**
|
|
42
|
+
* Handle accumulating state - collect paste content until end marker
|
|
43
|
+
*/
|
|
44
|
+
private handleAccumulatingState;
|
|
45
|
+
/**
|
|
46
|
+
* Check if buffer is a partial match for a target string
|
|
47
|
+
* Used to detect incomplete escape sequences
|
|
48
|
+
*/
|
|
49
|
+
private isPartialMatch;
|
|
50
|
+
/**
|
|
51
|
+
* Sanitize pasted content - strip dangerous escape sequences
|
|
52
|
+
* Security: Prevent terminal injection attacks
|
|
53
|
+
*
|
|
54
|
+
* @param content - Content to sanitize
|
|
55
|
+
* @param removeLiteralMarkers - If true, also remove literal [200~ [201~ (for malformed pastes)
|
|
56
|
+
* If false, only remove escape sequences (for proper bracketed pastes)
|
|
57
|
+
*/
|
|
58
|
+
private sanitizeContent;
|
|
59
|
+
/**
|
|
60
|
+
* Start timeout for paste accumulation
|
|
61
|
+
* If paste doesn't complete within timeout, reset state
|
|
62
|
+
*/
|
|
63
|
+
private startTimeout;
|
|
64
|
+
/**
|
|
65
|
+
* Clear paste accumulation timeout
|
|
66
|
+
*/
|
|
67
|
+
private clearTimeout;
|
|
68
|
+
/**
|
|
69
|
+
* Reset handler to initial state
|
|
70
|
+
* Used when component unmounts or on errors
|
|
71
|
+
*/
|
|
72
|
+
reset(): void;
|
|
73
|
+
/**
|
|
74
|
+
* Check if currently accumulating paste
|
|
75
|
+
*/
|
|
76
|
+
isAccumulating(): boolean;
|
|
77
|
+
/**
|
|
78
|
+
* Get current state (for debugging/testing)
|
|
79
|
+
*/
|
|
80
|
+
getState(): string;
|
|
81
|
+
/**
|
|
82
|
+
* Get paste statistics (for debugging/telemetry)
|
|
83
|
+
*/
|
|
84
|
+
getStats(): {
|
|
85
|
+
pasteCount: number;
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* BUG FIX: Retrieve and clear orphaned buffer content
|
|
89
|
+
* Use this when state is idle but buffer is not empty (timeout occurred)
|
|
90
|
+
* @returns orphaned buffer content, or empty string if none
|
|
91
|
+
*/
|
|
92
|
+
retrieveOrphanedContent(): string;
|
|
93
|
+
/**
|
|
94
|
+
* Cleanup on destroy
|
|
95
|
+
*/
|
|
96
|
+
dispose(): void;
|
|
97
|
+
}
|
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bracketed Paste Mode Handler
|
|
3
|
+
*
|
|
4
|
+
* Implements industry-standard bracketed paste detection for reliable paste handling
|
|
5
|
+
* across all terminal types (SSH, tmux, iTerm2, etc.)
|
|
6
|
+
*
|
|
7
|
+
* Bracketed paste mode sends special escape sequences:
|
|
8
|
+
* - Start: \x1b[200~ (ESC [200~)
|
|
9
|
+
* - End: \x1b[201~ (ESC [201~)
|
|
10
|
+
*
|
|
11
|
+
* This handler implements a state machine that:
|
|
12
|
+
* 1. Accumulates partial escape sequences across multiple input events
|
|
13
|
+
* 2. Handles timeout/recovery if end marker never arrives
|
|
14
|
+
* 3. Sanitizes escape sequences from pasted content (security)
|
|
15
|
+
* 4. Falls back to simple batched detection if not supported
|
|
16
|
+
*/
|
|
17
|
+
export class BracketedPasteHandler {
|
|
18
|
+
// State machine states
|
|
19
|
+
state = 'idle';
|
|
20
|
+
// Content accumulation buffer
|
|
21
|
+
buffer = '';
|
|
22
|
+
// Escape sequence accumulation buffer (for partial sequences)
|
|
23
|
+
escapeBuffer = '';
|
|
24
|
+
// Timeout for paste accumulation (30 seconds max)
|
|
25
|
+
timeoutHandle = null;
|
|
26
|
+
PASTE_TIMEOUT_MS = 30000;
|
|
27
|
+
// Bracketed paste markers
|
|
28
|
+
START_MARKER = '\x1b[200~';
|
|
29
|
+
END_MARKER = '\x1b[201~';
|
|
30
|
+
// Maximum paste size (100MB hard limit for security)
|
|
31
|
+
MAX_PASTE_SIZE = 100 * 1024 * 1024;
|
|
32
|
+
// Statistics
|
|
33
|
+
pasteCount = 0;
|
|
34
|
+
/**
|
|
35
|
+
* Handle incoming input character(s)
|
|
36
|
+
* Returns detection result indicating if paste is complete, accumulating, or normal input
|
|
37
|
+
*/
|
|
38
|
+
handleInput(inputChar) {
|
|
39
|
+
// BUG FIX: Check for paste size limit (security)
|
|
40
|
+
// Return accumulated content instead of discarding it
|
|
41
|
+
if (this.buffer.length + inputChar.length > this.MAX_PASTE_SIZE) {
|
|
42
|
+
// Paste too large - return what we have so far
|
|
43
|
+
const accumulatedContent = this.buffer;
|
|
44
|
+
this.reset();
|
|
45
|
+
// If we accumulated meaningful content, return it as a paste
|
|
46
|
+
if (accumulatedContent.length > 0) {
|
|
47
|
+
this.pasteCount++;
|
|
48
|
+
return {
|
|
49
|
+
isPaste: true,
|
|
50
|
+
content: this.sanitizeContent(accumulatedContent),
|
|
51
|
+
isAccumulating: false,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
// Otherwise just return empty (nothing accumulated yet)
|
|
55
|
+
return {
|
|
56
|
+
isPaste: false,
|
|
57
|
+
content: inputChar, // Return current input at least
|
|
58
|
+
isAccumulating: false,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
// Handle idle state - looking for paste start
|
|
62
|
+
if (this.state === 'idle') {
|
|
63
|
+
return this.handleIdleState(inputChar);
|
|
64
|
+
}
|
|
65
|
+
// Handle accumulating state - collecting paste content
|
|
66
|
+
if (this.state === 'accumulating') {
|
|
67
|
+
return this.handleAccumulatingState(inputChar);
|
|
68
|
+
}
|
|
69
|
+
// Should never reach here
|
|
70
|
+
return {
|
|
71
|
+
isPaste: false,
|
|
72
|
+
content: inputChar,
|
|
73
|
+
isAccumulating: false,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Handle idle state - detect paste start marker
|
|
78
|
+
*/
|
|
79
|
+
handleIdleState(inputChar) {
|
|
80
|
+
// Accumulate input for escape sequence detection
|
|
81
|
+
this.escapeBuffer += inputChar;
|
|
82
|
+
// BUG FIX: Prevent escapeBuffer overflow - if it grows beyond reasonable escape sequence size,
|
|
83
|
+
// treat accumulated content as normal input (safety limit: 32 bytes, escape sequences are ~6 bytes)
|
|
84
|
+
const MAX_ESCAPE_BUFFER_SIZE = 32;
|
|
85
|
+
if (this.escapeBuffer.length > MAX_ESCAPE_BUFFER_SIZE) {
|
|
86
|
+
const content = this.escapeBuffer;
|
|
87
|
+
this.escapeBuffer = '';
|
|
88
|
+
return {
|
|
89
|
+
isPaste: false,
|
|
90
|
+
content: this.sanitizeContent(content, true),
|
|
91
|
+
isAccumulating: false,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
// Check for complete start marker
|
|
95
|
+
if (this.escapeBuffer.includes(this.START_MARKER)) {
|
|
96
|
+
// Found complete start marker
|
|
97
|
+
const startIdx = this.escapeBuffer.indexOf(this.START_MARKER);
|
|
98
|
+
// BUG FIX: If there's content before the start marker, return it first
|
|
99
|
+
if (startIdx > 0) {
|
|
100
|
+
const contentBefore = this.escapeBuffer.substring(0, startIdx);
|
|
101
|
+
// Keep the start marker and everything after for next call
|
|
102
|
+
this.escapeBuffer = this.escapeBuffer.substring(startIdx);
|
|
103
|
+
return {
|
|
104
|
+
isPaste: false,
|
|
105
|
+
// BUG FIX: Sanitize with removeLiteralMarkers=true (from escapeBuffer, not real paste)
|
|
106
|
+
content: this.sanitizeContent(contentBefore, true),
|
|
107
|
+
isAccumulating: false,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
// Transition to accumulating state
|
|
111
|
+
this.state = 'accumulating';
|
|
112
|
+
// Extract content after start marker
|
|
113
|
+
this.buffer = this.escapeBuffer.substring(this.START_MARKER.length);
|
|
114
|
+
this.escapeBuffer = '';
|
|
115
|
+
// Set timeout for paste accumulation
|
|
116
|
+
this.startTimeout();
|
|
117
|
+
// BUG FIX: Check if end marker is also in the buffer (single input with full paste)
|
|
118
|
+
// This handles the case where start+content+end arrive in one call
|
|
119
|
+
if (this.buffer.includes(this.END_MARKER)) {
|
|
120
|
+
const endIdx = this.buffer.indexOf(this.END_MARKER);
|
|
121
|
+
const content = this.buffer.substring(0, endIdx);
|
|
122
|
+
// Clear timeout
|
|
123
|
+
this.clearTimeout();
|
|
124
|
+
// Reset state
|
|
125
|
+
this.state = 'idle';
|
|
126
|
+
this.buffer = '';
|
|
127
|
+
this.pasteCount++;
|
|
128
|
+
// Sanitize and return content
|
|
129
|
+
return {
|
|
130
|
+
isPaste: true,
|
|
131
|
+
content: this.sanitizeContent(content),
|
|
132
|
+
isAccumulating: false,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
isPaste: false,
|
|
137
|
+
content: '',
|
|
138
|
+
isAccumulating: true,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
// Check if we're building toward a start marker (partial match)
|
|
142
|
+
if (this.isPartialMatch(this.escapeBuffer, this.START_MARKER)) {
|
|
143
|
+
// Keep accumulating - might be a partial escape sequence
|
|
144
|
+
return {
|
|
145
|
+
isPaste: false,
|
|
146
|
+
content: '',
|
|
147
|
+
isAccumulating: false,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
// No match - this is normal input
|
|
151
|
+
const content = this.escapeBuffer;
|
|
152
|
+
this.escapeBuffer = '';
|
|
153
|
+
// Return as normal input (not a paste via bracketed paste mode)
|
|
154
|
+
// The caller can decide if it wants to use fallback batched detection
|
|
155
|
+
// BUG FIX: Sanitize with removeLiteralMarkers=true (from escapeBuffer, may have malformed markers)
|
|
156
|
+
return {
|
|
157
|
+
isPaste: false,
|
|
158
|
+
content: this.sanitizeContent(content, true),
|
|
159
|
+
isAccumulating: false,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Handle accumulating state - collect paste content until end marker
|
|
164
|
+
*/
|
|
165
|
+
handleAccumulatingState(inputChar) {
|
|
166
|
+
// Accumulate content
|
|
167
|
+
this.buffer += inputChar;
|
|
168
|
+
// Check for end marker
|
|
169
|
+
if (this.buffer.includes(this.END_MARKER)) {
|
|
170
|
+
// Found end marker - paste complete
|
|
171
|
+
const endIdx = this.buffer.indexOf(this.END_MARKER);
|
|
172
|
+
const content = this.buffer.substring(0, endIdx);
|
|
173
|
+
// Clear timeout
|
|
174
|
+
this.clearTimeout();
|
|
175
|
+
// Reset state
|
|
176
|
+
this.state = 'idle';
|
|
177
|
+
this.buffer = '';
|
|
178
|
+
this.pasteCount++;
|
|
179
|
+
// Sanitize and return content
|
|
180
|
+
return {
|
|
181
|
+
isPaste: true,
|
|
182
|
+
content: this.sanitizeContent(content),
|
|
183
|
+
isAccumulating: false,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
// Still accumulating
|
|
187
|
+
return {
|
|
188
|
+
isPaste: false,
|
|
189
|
+
content: '',
|
|
190
|
+
isAccumulating: true,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Check if buffer is a partial match for a target string
|
|
195
|
+
* Used to detect incomplete escape sequences
|
|
196
|
+
*/
|
|
197
|
+
isPartialMatch(buffer, target) {
|
|
198
|
+
if (buffer.length === 0 || buffer.length >= target.length) {
|
|
199
|
+
return false;
|
|
200
|
+
}
|
|
201
|
+
// Check if buffer matches the start of target
|
|
202
|
+
return target.startsWith(buffer);
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Sanitize pasted content - strip dangerous escape sequences
|
|
206
|
+
* Security: Prevent terminal injection attacks
|
|
207
|
+
*
|
|
208
|
+
* @param content - Content to sanitize
|
|
209
|
+
* @param removeLiteralMarkers - If true, also remove literal [200~ [201~ (for malformed pastes)
|
|
210
|
+
* If false, only remove escape sequences (for proper bracketed pastes)
|
|
211
|
+
*/
|
|
212
|
+
sanitizeContent(content, removeLiteralMarkers = false) {
|
|
213
|
+
// Strip all escape sequences except newlines and common printable chars
|
|
214
|
+
// This prevents malicious pastes from executing terminal commands
|
|
215
|
+
let sanitized = content;
|
|
216
|
+
// Remove bracketed paste markers (ONLY escape sequences, not literal text)
|
|
217
|
+
sanitized = sanitized.replace(/\x1b\[200~/g, ''); // Full escape sequence
|
|
218
|
+
sanitized = sanitized.replace(/\x1b\[201~/g, ''); // Full escape sequence
|
|
219
|
+
// BUG FIX: Only remove literal markers for malformed pastes (escapeBuffer content)
|
|
220
|
+
// Do NOT remove from proper bracketed paste content (would corrupt user data like "[200~300]")
|
|
221
|
+
if (removeLiteralMarkers) {
|
|
222
|
+
sanitized = sanitized.replace(/\[200~/g, ''); // Literal text (ESC stripped by terminal)
|
|
223
|
+
sanitized = sanitized.replace(/\[201~/g, ''); // Literal text (ESC stripped by terminal)
|
|
224
|
+
}
|
|
225
|
+
// Remove other control sequences:
|
|
226
|
+
// - OSC (Operating System Command): \x1b] ... \x07
|
|
227
|
+
// - CSI (Control Sequence Introducer): \x1b[ ... (letters)
|
|
228
|
+
// - Other escape codes
|
|
229
|
+
// Remove OSC sequences (e.g., set window title)
|
|
230
|
+
sanitized = sanitized.replace(/\x1b\][\s\S]*?\x07/g, '');
|
|
231
|
+
// Remove CSI sequences (except bracketed paste which we already removed)
|
|
232
|
+
// Match: ESC [ <params> <letter>
|
|
233
|
+
sanitized = sanitized.replace(/\x1b\[[0-9;]*[A-Za-z]/g, '');
|
|
234
|
+
// BUG FIX: Remove other escape codes (ESC followed by single non-alphanumeric char)
|
|
235
|
+
// OLD: /\x1b[^[]]/g - This was matching ESC + any char except '[', eating content!
|
|
236
|
+
// NEW: Only match ESC followed by specific escape chars, not normal text
|
|
237
|
+
sanitized = sanitized.replace(/\x1b[()=>]/g, ''); // G0-G3 charset, keypad modes
|
|
238
|
+
sanitized = sanitized.replace(/\x1b[78]/g, ''); // Save/restore cursor
|
|
239
|
+
sanitized = sanitized.replace(/\x1b[DEHM]/g, ''); // Various control codes
|
|
240
|
+
// Normalize line endings (keep \n, convert \r to \n)
|
|
241
|
+
sanitized = sanitized.replace(/\r\n/g, '\n');
|
|
242
|
+
sanitized = sanitized.replace(/\r/g, '\n');
|
|
243
|
+
return sanitized;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Start timeout for paste accumulation
|
|
247
|
+
* If paste doesn't complete within timeout, reset state
|
|
248
|
+
*/
|
|
249
|
+
startTimeout() {
|
|
250
|
+
this.clearTimeout();
|
|
251
|
+
this.timeoutHandle = setTimeout(() => {
|
|
252
|
+
// BUG FIX: Timeout reached - paste took too long or end marker never arrived
|
|
253
|
+
// Don't discard the content! The caller will need to retrieve it.
|
|
254
|
+
// We just reset the state so new input can be processed normally.
|
|
255
|
+
// The accumulated content stays in this.buffer for the caller to retrieve.
|
|
256
|
+
if (this.state === 'accumulating') {
|
|
257
|
+
this.state = 'idle';
|
|
258
|
+
// NOTE: this.buffer is NOT cleared - caller must check and retrieve it
|
|
259
|
+
// This prevents data loss when end marker is missing
|
|
260
|
+
}
|
|
261
|
+
}, this.PASTE_TIMEOUT_MS);
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Clear paste accumulation timeout
|
|
265
|
+
*/
|
|
266
|
+
clearTimeout() {
|
|
267
|
+
if (this.timeoutHandle) {
|
|
268
|
+
clearTimeout(this.timeoutHandle);
|
|
269
|
+
this.timeoutHandle = null;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Reset handler to initial state
|
|
274
|
+
* Used when component unmounts or on errors
|
|
275
|
+
*/
|
|
276
|
+
reset() {
|
|
277
|
+
this.state = 'idle';
|
|
278
|
+
this.buffer = '';
|
|
279
|
+
this.escapeBuffer = '';
|
|
280
|
+
this.clearTimeout();
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Check if currently accumulating paste
|
|
284
|
+
*/
|
|
285
|
+
isAccumulating() {
|
|
286
|
+
return this.state === 'accumulating';
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Get current state (for debugging/testing)
|
|
290
|
+
*/
|
|
291
|
+
getState() {
|
|
292
|
+
return this.state;
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Get paste statistics (for debugging/telemetry)
|
|
296
|
+
*/
|
|
297
|
+
getStats() {
|
|
298
|
+
return {
|
|
299
|
+
pasteCount: this.pasteCount,
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* BUG FIX: Retrieve and clear orphaned buffer content
|
|
304
|
+
* Use this when state is idle but buffer is not empty (timeout occurred)
|
|
305
|
+
* @returns orphaned buffer content, or empty string if none
|
|
306
|
+
*/
|
|
307
|
+
retrieveOrphanedContent() {
|
|
308
|
+
if (this.state === 'idle' && this.buffer.length > 0) {
|
|
309
|
+
const content = this.buffer;
|
|
310
|
+
this.buffer = '';
|
|
311
|
+
return this.sanitizeContent(content);
|
|
312
|
+
}
|
|
313
|
+
return '';
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Cleanup on destroy
|
|
317
|
+
*/
|
|
318
|
+
dispose() {
|
|
319
|
+
this.reset();
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
//# sourceMappingURL=bracketed-paste-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bracketed-paste-handler.js","sourceRoot":"","sources":["../../../src/ui/utils/bracketed-paste-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAQH,MAAM,OAAO,qBAAqB;IAChC,uBAAuB;IACf,KAAK,GAA4B,MAAM,CAAC;IAEhD,8BAA8B;IACtB,MAAM,GAAW,EAAE,CAAC;IAE5B,8DAA8D;IACtD,YAAY,GAAW,EAAE,CAAC;IAElC,kDAAkD;IAC1C,aAAa,GAA0B,IAAI,CAAC;IACnC,gBAAgB,GAAG,KAAK,CAAC;IAE1C,0BAA0B;IACT,YAAY,GAAG,WAAW,CAAC;IAC3B,UAAU,GAAG,WAAW,CAAC;IAE1C,qDAAqD;IACpC,cAAc,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;IAEpD,aAAa;IACL,UAAU,GAAG,CAAC,CAAC;IAEvB;;;OAGG;IACH,WAAW,CAAC,SAAiB;QAC3B,iDAAiD;QACjD,sDAAsD;QACtD,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YAChE,+CAA+C;YAC/C,MAAM,kBAAkB,GAAG,IAAI,CAAC,MAAM,CAAC;YACvC,IAAI,CAAC,KAAK,EAAE,CAAC;YAEb,6DAA6D;YAC7D,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClC,IAAI,CAAC,UAAU,EAAE,CAAC;gBAClB,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC;oBACjD,cAAc,EAAE,KAAK;iBACtB,CAAC;YACJ,CAAC;YAED,wDAAwD;YACxD,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,SAAS,EAAE,gCAAgC;gBACpD,cAAc,EAAE,KAAK;aACtB,CAAC;QACJ,CAAC;QAED,8CAA8C;QAC9C,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QACzC,CAAC;QAED,uDAAuD;QACvD,IAAI,IAAI,CAAC,KAAK,KAAK,cAAc,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC;QACjD,CAAC;QAED,0BAA0B;QAC1B,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,SAAS;YAClB,cAAc,EAAE,KAAK;SACtB,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,SAAiB;QACvC,iDAAiD;QACjD,IAAI,CAAC,YAAY,IAAI,SAAS,CAAC;QAE/B,+FAA+F;QAC/F,oGAAoG;QACpG,MAAM,sBAAsB,GAAG,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,sBAAsB,EAAE,CAAC;YACtD,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC;YAClC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;YACvB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC;gBAC5C,cAAc,EAAE,KAAK;aACtB,CAAC;QACJ,CAAC;QAED,kCAAkC;QAClC,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YAClD,8BAA8B;YAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAE9D,uEAAuE;YACvE,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;gBACjB,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;gBAC/D,2DAA2D;gBAC3D,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;gBAC1D,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,uFAAuF;oBACvF,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,IAAI,CAAC;oBAClD,cAAc,EAAE,KAAK;iBACtB,CAAC;YACJ,CAAC;YAED,mCAAmC;YACnC,IAAI,CAAC,KAAK,GAAG,cAAc,CAAC;YAE5B,qCAAqC;YACrC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YACpE,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;YAEvB,qCAAqC;YACrC,IAAI,CAAC,YAAY,EAAE,CAAC;YAEpB,oFAAoF;YACpF,mEAAmE;YACnE,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACpD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;gBAEjD,gBAAgB;gBAChB,IAAI,CAAC,YAAY,EAAE,CAAC;gBAEpB,cAAc;gBACd,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;gBACpB,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;gBACjB,IAAI,CAAC,UAAU,EAAE,CAAC;gBAElB,8BAA8B;gBAC9B,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;oBACtC,cAAc,EAAE,KAAK;iBACtB,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,EAAE;gBACX,cAAc,EAAE,IAAI;aACrB,CAAC;QACJ,CAAC;QAED,gEAAgE;QAChE,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YAC9D,yDAAyD;YACzD,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,EAAE;gBACX,cAAc,EAAE,KAAK;aACtB,CAAC;QACJ,CAAC;QAED,kCAAkC;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC;QAClC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QAEvB,gEAAgE;QAChE,sEAAsE;QACtE,mGAAmG;QACnG,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC;YAC5C,cAAc,EAAE,KAAK;SACtB,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,uBAAuB,CAAC,SAAiB;QAC/C,qBAAqB;QACrB,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC;QAEzB,uBAAuB;QACvB,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAC1C,oCAAoC;YACpC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACpD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YAEjD,gBAAgB;YAChB,IAAI,CAAC,YAAY,EAAE,CAAC;YAEpB,cAAc;YACd,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;YACpB,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;YACjB,IAAI,CAAC,UAAU,EAAE,CAAC;YAElB,8BAA8B;YAC9B,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;gBACtC,cAAc,EAAE,KAAK;aACtB,CAAC;QACJ,CAAC;QAED,qBAAqB;QACrB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,EAAE;YACX,cAAc,EAAE,IAAI;SACrB,CAAC;IACJ,CAAC;IAED;;;OAGG;IACK,cAAc,CAAC,MAAc,EAAE,MAAc;QACnD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAC1D,OAAO,KAAK,CAAC;QACf,CAAC;QAED,8CAA8C;QAC9C,OAAO,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAED;;;;;;;OAOG;IACK,eAAe,CAAC,OAAe,EAAE,uBAAgC,KAAK;QAC5E,wEAAwE;QACxE,kEAAkE;QAElE,IAAI,SAAS,GAAG,OAAO,CAAC;QAExB,2EAA2E;QAC3E,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,CAAE,uBAAuB;QAC1E,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,CAAE,uBAAuB;QAE1E,mFAAmF;QACnF,+FAA+F;QAC/F,IAAI,oBAAoB,EAAE,CAAC;YACzB,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAM,0CAA0C;YAC7F,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAM,0CAA0C;QAC/F,CAAC;QAED,kCAAkC;QAClC,mDAAmD;QACnD,2DAA2D;QAC3D,uBAAuB;QAEvB,gDAAgD;QAChD,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;QAEzD,yEAAyE;QACzE,iCAAiC;QACjC,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;QAE5D,oFAAoF;QACpF,mFAAmF;QACnF,yEAAyE;QACzE,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,CAAC,8BAA8B;QAChF,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAG,sBAAsB;QACxE,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,CAAC,wBAAwB;QAE1E,qDAAqD;QACrD,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC7C,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAE3C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;OAGG;IACK,YAAY;QAClB,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;YACnC,6EAA6E;YAC7E,kEAAkE;YAClE,kEAAkE;YAClE,2EAA2E;YAC3E,IAAI,IAAI,CAAC,KAAK,KAAK,cAAc,EAAE,CAAC;gBAClC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;gBACpB,uEAAuE;gBACvE,qDAAqD;YACvD,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACK,YAAY;QAClB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACjC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;QACpB,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,KAAK,KAAK,cAAc,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO;YACL,UAAU,EAAE,IAAI,CAAC,UAAU;SAC5B,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,uBAAuB;QACrB,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC;YAC5B,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;OAEG;IACH,OAAO;QACL,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;CACF"}
|
|
@@ -45,21 +45,31 @@ function detectChangePatterns(content) {
|
|
|
45
45
|
if (!content)
|
|
46
46
|
return patterns;
|
|
47
47
|
const lower = content.toLowerCase();
|
|
48
|
-
// Function/method changes
|
|
49
|
-
|
|
48
|
+
// Function/method changes - check all patterns independently to catch combined changes
|
|
49
|
+
const hasAddedFunctions = lower.includes('+function') || lower.includes('+const ') || lower.includes('+export function');
|
|
50
|
+
const hasRemovedFunctions = lower.includes('-function') || lower.includes('-const ') || lower.includes('-export function');
|
|
51
|
+
if (hasAddedFunctions && hasRemovedFunctions) {
|
|
52
|
+
patterns.push('modified functions');
|
|
53
|
+
}
|
|
54
|
+
else if (hasAddedFunctions) {
|
|
50
55
|
patterns.push('added functions');
|
|
51
56
|
}
|
|
52
|
-
else if (
|
|
57
|
+
else if (hasRemovedFunctions) {
|
|
53
58
|
patterns.push('removed functions');
|
|
54
59
|
}
|
|
55
60
|
else if (lower.includes('function') || lower.includes('const ')) {
|
|
56
61
|
patterns.push('updated functions');
|
|
57
62
|
}
|
|
58
|
-
// Import changes
|
|
59
|
-
|
|
63
|
+
// Import changes - check independently
|
|
64
|
+
const hasAddedImports = lower.includes('+import') || lower.includes('+require');
|
|
65
|
+
const hasRemovedImports = lower.includes('-import') || lower.includes('-require');
|
|
66
|
+
if (hasAddedImports && hasRemovedImports) {
|
|
67
|
+
patterns.push('reorganized imports');
|
|
68
|
+
}
|
|
69
|
+
else if (hasAddedImports) {
|
|
60
70
|
patterns.push('added imports');
|
|
61
71
|
}
|
|
62
|
-
else if (
|
|
72
|
+
else if (hasRemovedImports) {
|
|
63
73
|
patterns.push('removed imports');
|
|
64
74
|
}
|
|
65
75
|
// Type/interface changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"change-summarizer.js","sourceRoot":"","sources":["../../../src/ui/utils/change-summarizer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAgB;IAC/C,8CAA8C;IAC9C,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,CACrC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,KAAK,oBAAoB,IAAI,EAAE,CAAC,UAAU,EAAE,OAAO,CACvF,CAAC;IAEF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8BAA8B;IAC9B,MAAM,QAAQ,GAAgB,IAAI,GAAG,EAAE,CAAC;IAExC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,UAAU,EAAE,MAAM,IAAI,EAAE,CAAC;QAClE,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACvD,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,kDAAkD;IAClD,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,UAAU,CAAC;IACzE,CAAC;IAED,wCAAwC;IACxC,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAE1C,uCAAuC;IACvC,MAAM,WAAW,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAE7C,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED;;;;;GAKG;AACH,SAAS,oBAAoB,CAAC,OAAe;IAC3C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,IAAI,CAAC,OAAO;QAAE,OAAO,QAAQ,CAAC;IAE9B,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAEpC,
|
|
1
|
+
{"version":3,"file":"change-summarizer.js","sourceRoot":"","sources":["../../../src/ui/utils/change-summarizer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAgB;IAC/C,8CAA8C;IAC9C,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,CACrC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,KAAK,oBAAoB,IAAI,EAAE,CAAC,UAAU,EAAE,OAAO,CACvF,CAAC;IAEF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8BAA8B;IAC9B,MAAM,QAAQ,GAAgB,IAAI,GAAG,EAAE,CAAC;IAExC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,UAAU,EAAE,MAAM,IAAI,EAAE,CAAC;QAClE,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACvD,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,kDAAkD;IAClD,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,UAAU,CAAC;IACzE,CAAC;IAED,wCAAwC;IACxC,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAE1C,uCAAuC;IACvC,MAAM,WAAW,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAE7C,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED;;;;;GAKG;AACH,SAAS,oBAAoB,CAAC,OAAe;IAC3C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,IAAI,CAAC,OAAO;QAAE,OAAO,QAAQ,CAAC;IAE9B,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAEpC,uFAAuF;IACvF,MAAM,iBAAiB,GAAG,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;IACzH,MAAM,mBAAmB,GAAG,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;IAE3H,IAAI,iBAAiB,IAAI,mBAAmB,EAAE,CAAC;QAC7C,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACtC,CAAC;SAAM,IAAI,iBAAiB,EAAE,CAAC;QAC7B,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACnC,CAAC;SAAM,IAAI,mBAAmB,EAAE,CAAC;QAC/B,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACrC,CAAC;SAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClE,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACrC,CAAC;IAED,uCAAuC;IACvC,MAAM,eAAe,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAChF,MAAM,iBAAiB,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAElF,IAAI,eAAe,IAAI,iBAAiB,EAAE,CAAC;QACzC,QAAQ,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACvC,CAAC;SAAM,IAAI,eAAe,EAAE,CAAC;QAC3B,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACjC,CAAC;SAAM,IAAI,iBAAiB,EAAE,CAAC;QAC7B,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACnC,CAAC;IAED,yBAAyB;IACzB,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1F,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC/B,CAAC;SAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAClE,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACjC,CAAC;IAED,iBAAiB;IACjB,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnF,QAAQ,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IAC3C,CAAC;SAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9D,QAAQ,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAC1C,CAAC;IAED,gBAAgB;IAChB,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3E,QAAQ,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACvC,CAAC;IAED,QAAQ;IACR,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QACvF,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC/B,CAAC;SAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC3F,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACjC,CAAC;IAED,gBAAgB;IAChB,IAAI,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5F,QAAQ,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACzC,CAAC;IAED,gBAAgB;IAChB,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACjH,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAChC,CAAC;IAED,kBAAkB;IAClB,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACrH,QAAQ,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IAC3C,CAAC;IAED,gBAAgB;IAChB,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9G,QAAQ,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACzC,CAAC;IAED,WAAW;IACX,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACpH,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACpC,CAAC;IAED,cAAc;IACd,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QAC3F,QAAQ,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACxC,CAAC;IAED,cAAc;IACd,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QACxG,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAe,EAAE,QAAgB;IACnE,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IAExB,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IAE7C,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,WAAW;YACd,IAAI,SAAS,KAAK,CAAC;gBAAE,OAAO,QAAQ,CAAC;YACrC,IAAI,SAAS,GAAG,EAAE;gBAAE,OAAO,GAAG,SAAS,QAAQ,CAAC;YAChD,IAAI,SAAS,GAAG,GAAG;gBAAE,OAAO,GAAG,SAAS,QAAQ,CAAC;YACjD,OAAO,GAAG,SAAS,gBAAgB,CAAC;QAEtC,KAAK,aAAa;YAChB,OAAO,GAAG,SAAS,gBAAgB,CAAC;QAEtC,KAAK,oBAAoB;YACvB,6BAA6B;YAC7B,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACzC,IAAI,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBAClC,OAAO,SAAS,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACrD,CAAC;YACD,qBAAqB;YACrB,MAAM,YAAY,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YAChE,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;gBACrB,OAAO,GAAG,YAAY,UAAU,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAChE,CAAC;YACD,OAAO,SAAS,CAAC;QAEnB,KAAK,MAAM;YACT,IAAI,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAC,EAAE,CAAC;gBAChD,OAAO,cAAc,CAAC;YACxB,CAAC;YACD,yBAAyB;YACzB,IAAI,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAClE,OAAO,WAAW,CAAC;YACrB,CAAC;YACD,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;gBACnC,OAAO,WAAW,CAAC;YACrB,CAAC;YACD,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBACjC,OAAO,QAAQ,CAAC;YAClB,CAAC;YACD,IAAI,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC7D,OAAO,QAAQ,CAAC;YAClB,CAAC;YACD,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;gBACnB,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC1E,CAAC;YACD,OAAO,GAAG,SAAS,QAAQ,CAAC;QAE9B,KAAK,QAAQ;YACX,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;YACnD,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACvC,OAAO,GAAG,KAAK,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACpD,CAAC;YACD,OAAO,GAAG,SAAS,UAAU,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAE5D,KAAK,kBAAkB,CAAC;QACxB,KAAK,kBAAkB;YACrB,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YACvD,OAAO,GAAG,KAAK,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAElD;YACE,IAAI,SAAS,IAAI,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;gBAC1C,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC;YACxB,CAAC;YACD,OAAO,GAAG,SAAS,QAAQ,CAAC;IAChC,CAAC;AACH,CAAC"}
|
|
@@ -3,6 +3,11 @@
|
|
|
3
3
|
* Groups consecutive tool operations for cleaner UX in quiet mode
|
|
4
4
|
*/
|
|
5
5
|
import type { ChatEntry } from '../../agent/llm-agent.js';
|
|
6
|
+
/**
|
|
7
|
+
* Clear the parsed arguments cache
|
|
8
|
+
* Useful when chat history is cleared to prevent memory leaks
|
|
9
|
+
*/
|
|
10
|
+
export declare function clearToolGroupCache(): void;
|
|
6
11
|
/**
|
|
7
12
|
* Represents a group of consecutive tool operations
|
|
8
13
|
*/
|
|
@@ -18,7 +23,7 @@ export interface ToolGroup {
|
|
|
18
23
|
/** Whether any operation in the group failed */
|
|
19
24
|
hasError: boolean;
|
|
20
25
|
/** Type of group (file-based, bash, search, etc) */
|
|
21
|
-
groupType: 'file' | 'bash' | 'search' | 'todo' | 'mixed';
|
|
26
|
+
groupType: 'file' | 'bash' | 'search' | 'todo' | 'web' | 'analysis' | 'mixed';
|
|
22
27
|
}
|
|
23
28
|
/**
|
|
24
29
|
* Union type for grouped or individual entries
|
|
@@ -50,13 +55,17 @@ export declare function getOperationCounts(group: ToolGroup): {
|
|
|
50
55
|
searches: number;
|
|
51
56
|
bash: number;
|
|
52
57
|
todos: number;
|
|
58
|
+
web: number;
|
|
59
|
+
analysis: number;
|
|
53
60
|
other: number;
|
|
54
61
|
};
|
|
55
62
|
/**
|
|
56
63
|
* Get execution duration for a group in milliseconds
|
|
64
|
+
* Returns 0 if timestamps are invalid
|
|
57
65
|
*/
|
|
58
66
|
export declare function getGroupDuration(group: ToolGroup): number;
|
|
59
67
|
/**
|
|
60
68
|
* Format duration in human-readable form
|
|
69
|
+
* Returns "0ms" for invalid durations (NaN, negative, etc.)
|
|
61
70
|
*/
|
|
62
71
|
export declare function formatDuration(ms: number): string;
|