vibecodingmachine-core 1.0.2 → 2025.11.2-7.1239
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/.babelrc +13 -13
- package/README.md +28 -28
- package/__tests__/applescript-manager-claude-fix.test.js +286 -286
- package/__tests__/requirement-2-auto-start-looping.test.js +69 -69
- package/__tests__/requirement-3-auto-start-looping.test.js +69 -69
- package/__tests__/requirement-4-auto-start-looping.test.js +69 -69
- package/__tests__/requirement-6-auto-start-looping.test.js +73 -73
- package/__tests__/requirement-7-status-tracking.test.js +332 -332
- package/jest.config.js +18 -18
- package/jest.setup.js +12 -12
- package/package.json +48 -48
- package/src/auth/access-denied.html +119 -119
- package/src/auth/shared-auth-storage.js +230 -230
- package/src/autonomous-mode/feature-implementer.cjs +70 -70
- package/src/autonomous-mode/feature-implementer.js +425 -425
- package/src/chat-management/chat-manager.cjs +71 -71
- package/src/chat-management/chat-manager.js +342 -342
- package/src/ide-integration/__tests__/applescript-manager-thread-closure.test.js +227 -227
- package/src/ide-integration/aider-cli-manager.cjs +850 -850
- package/src/ide-integration/applescript-manager.cjs +1088 -1088
- package/src/ide-integration/applescript-manager.js +2802 -2802
- package/src/ide-integration/applescript-utils.js +306 -306
- package/src/ide-integration/cdp-manager.cjs +221 -221
- package/src/ide-integration/cdp-manager.js +321 -321
- package/src/ide-integration/claude-code-cli-manager.cjs +301 -301
- package/src/ide-integration/cline-cli-manager.cjs +2252 -2252
- package/src/ide-integration/continue-cli-manager.js +431 -431
- package/src/ide-integration/provider-manager.cjs +354 -354
- package/src/ide-integration/quota-detector.cjs +34 -34
- package/src/ide-integration/quota-detector.js +349 -349
- package/src/ide-integration/windows-automation-manager.js +262 -262
- package/src/index.cjs +47 -43
- package/src/index.js +17 -17
- package/src/llm/direct-llm-manager.cjs +609 -609
- package/src/ui/ButtonComponents.js +247 -247
- package/src/ui/ChatInterface.js +499 -499
- package/src/ui/StateManager.js +259 -259
- package/src/utils/audit-logger.cjs +116 -116
- package/src/utils/config-helpers.cjs +94 -94
- package/src/utils/config-helpers.js +94 -94
- package/src/utils/electron-update-checker.js +113 -85
- package/src/utils/gcloud-auth.cjs +394 -394
- package/src/utils/logger.cjs +193 -193
- package/src/utils/logger.js +191 -191
- package/src/utils/repo-helpers.cjs +120 -120
- package/src/utils/repo-helpers.js +120 -120
- package/src/utils/requirement-helpers.js +432 -432
- package/src/utils/update-checker.js +227 -167
- package/src/utils/version-checker.js +169 -0
package/src/ui/StateManager.js
CHANGED
|
@@ -1,259 +1,259 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared State Manager
|
|
3
|
-
* Manages state synchronization between electron app and VSCode extension
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
class StateManager {
|
|
7
|
-
constructor() {
|
|
8
|
-
this.state = {
|
|
9
|
-
autonomousMode: false,
|
|
10
|
-
isPaused: false,
|
|
11
|
-
isStopped: false,
|
|
12
|
-
isCheckingQuota: false,
|
|
13
|
-
isOpeningIde: false,
|
|
14
|
-
currentIde: 'vscode', // Default IDE
|
|
15
|
-
featureProgress: 0,
|
|
16
|
-
currentFeature: null,
|
|
17
|
-
status: 'Ready to chat',
|
|
18
|
-
messages: [],
|
|
19
|
-
tabs: [],
|
|
20
|
-
activeTabId: null
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
this.listeners = new Set();
|
|
24
|
-
this.storageKey = 'vibecodingmachine-shared-state';
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
// Get current state
|
|
28
|
-
getState() {
|
|
29
|
-
return { ...this.state };
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
// Update state and notify listeners
|
|
33
|
-
setState(updates) {
|
|
34
|
-
const oldState = { ...this.state };
|
|
35
|
-
this.state = { ...this.state, ...updates };
|
|
36
|
-
|
|
37
|
-
// Save to localStorage for persistence
|
|
38
|
-
this.saveToStorage();
|
|
39
|
-
|
|
40
|
-
// Notify all listeners
|
|
41
|
-
this.listeners.forEach(listener => {
|
|
42
|
-
try {
|
|
43
|
-
listener(this.state, oldState);
|
|
44
|
-
} catch (error) {
|
|
45
|
-
console.error('State listener error:', error);
|
|
46
|
-
}
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
// Subscribe to state changes
|
|
51
|
-
subscribe(listener) {
|
|
52
|
-
this.listeners.add(listener);
|
|
53
|
-
|
|
54
|
-
// Return unsubscribe function
|
|
55
|
-
return () => {
|
|
56
|
-
this.listeners.delete(listener);
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// Save state to localStorage
|
|
61
|
-
saveToStorage() {
|
|
62
|
-
try {
|
|
63
|
-
localStorage.setItem(this.storageKey, JSON.stringify(this.state));
|
|
64
|
-
} catch (error) {
|
|
65
|
-
console.error('Failed to save state to storage:', error);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// Load state from localStorage
|
|
70
|
-
loadFromStorage() {
|
|
71
|
-
try {
|
|
72
|
-
const saved = localStorage.getItem(this.storageKey);
|
|
73
|
-
if (saved) {
|
|
74
|
-
const parsed = JSON.parse(saved);
|
|
75
|
-
this.setState(parsed);
|
|
76
|
-
}
|
|
77
|
-
} catch (error) {
|
|
78
|
-
console.error('Failed to load state from storage:', error);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
// Autonomous mode actions
|
|
83
|
-
startAutonomousMode(ide) {
|
|
84
|
-
this.setState({
|
|
85
|
-
autonomousMode: true,
|
|
86
|
-
isPaused: false,
|
|
87
|
-
isStopped: false,
|
|
88
|
-
currentIde: ide,
|
|
89
|
-
status: 'Starting autonomous mode...',
|
|
90
|
-
featureProgress: 0
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
stopAutonomousMode() {
|
|
95
|
-
this.setState({
|
|
96
|
-
autonomousMode: false,
|
|
97
|
-
isPaused: false,
|
|
98
|
-
isStopped: true,
|
|
99
|
-
status: 'Autonomous mode stopped',
|
|
100
|
-
featureProgress: 0,
|
|
101
|
-
currentFeature: null
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
pauseAutonomousMode() {
|
|
106
|
-
this.setState({
|
|
107
|
-
isPaused: true,
|
|
108
|
-
status: 'Autonomous mode paused'
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
resumeAutonomousMode() {
|
|
113
|
-
this.setState({
|
|
114
|
-
isPaused: false,
|
|
115
|
-
status: 'Autonomous mode resumed'
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
togglePause() {
|
|
120
|
-
if (this.state.isPaused) {
|
|
121
|
-
this.resumeAutonomousMode();
|
|
122
|
-
} else {
|
|
123
|
-
this.pauseAutonomousMode();
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
// Quota checking
|
|
128
|
-
startQuotaCheck() {
|
|
129
|
-
this.setState({
|
|
130
|
-
isCheckingQuota: true,
|
|
131
|
-
status: 'Checking quota...'
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
finishQuotaCheck(result) {
|
|
136
|
-
this.setState({
|
|
137
|
-
isCheckingQuota: false,
|
|
138
|
-
status: result.success ? 'Quota check completed' : 'Quota check failed'
|
|
139
|
-
});
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
// IDE opening
|
|
143
|
-
startOpeningIde() {
|
|
144
|
-
this.setState({
|
|
145
|
-
isOpeningIde: true,
|
|
146
|
-
status: 'Opening IDE...'
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
finishOpeningIde(result) {
|
|
151
|
-
this.setState({
|
|
152
|
-
isOpeningIde: false,
|
|
153
|
-
status: result.success ? 'IDE opened successfully' : 'Failed to open IDE'
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
// Feature progress
|
|
158
|
-
updateFeatureProgress(progress, feature = null) {
|
|
159
|
-
this.setState({
|
|
160
|
-
featureProgress: progress,
|
|
161
|
-
currentFeature: feature,
|
|
162
|
-
status: `Autonomous mode progress: ${progress}%`
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
// Message management
|
|
167
|
-
addMessage(role, text) {
|
|
168
|
-
const message = {
|
|
169
|
-
id: Date.now(),
|
|
170
|
-
role,
|
|
171
|
-
text,
|
|
172
|
-
timestamp: new Date().toISOString()
|
|
173
|
-
};
|
|
174
|
-
|
|
175
|
-
this.setState({
|
|
176
|
-
messages: [...this.state.messages, message]
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
clearMessages() {
|
|
181
|
-
this.setState({
|
|
182
|
-
messages: []
|
|
183
|
-
});
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
// Tab management
|
|
187
|
-
setTabs(tabs) {
|
|
188
|
-
this.setState({
|
|
189
|
-
tabs,
|
|
190
|
-
activeTabId: tabs.length > 0 ? tabs[0].id : null
|
|
191
|
-
});
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
setActiveTab(tabId) {
|
|
195
|
-
this.setState({
|
|
196
|
-
activeTabId: tabId
|
|
197
|
-
});
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
// Status updates
|
|
201
|
-
updateStatus(status) {
|
|
202
|
-
this.setState({
|
|
203
|
-
status
|
|
204
|
-
});
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
// Reset state
|
|
208
|
-
reset() {
|
|
209
|
-
this.setState({
|
|
210
|
-
autonomousMode: false,
|
|
211
|
-
isPaused: false,
|
|
212
|
-
isStopped: false,
|
|
213
|
-
isCheckingQuota: false,
|
|
214
|
-
isOpeningIde: false,
|
|
215
|
-
currentIde: 'vscode', // Default IDE
|
|
216
|
-
featureProgress: 0,
|
|
217
|
-
currentFeature: null,
|
|
218
|
-
status: 'Ready to chat',
|
|
219
|
-
messages: [],
|
|
220
|
-
tabs: [],
|
|
221
|
-
activeTabId: null
|
|
222
|
-
});
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
// Get specific state values
|
|
226
|
-
isAutonomousMode() {
|
|
227
|
-
return this.state.autonomousMode;
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
isPaused() {
|
|
231
|
-
return this.state.isPaused;
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
isStopped() {
|
|
235
|
-
return this.state.isStopped;
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
getCurrentIde() {
|
|
239
|
-
return this.state.currentIde;
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
getStatus() {
|
|
243
|
-
return this.state.status;
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
getProgress() {
|
|
247
|
-
return this.state.featureProgress;
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
// Create singleton instance
|
|
252
|
-
const stateManager = new StateManager();
|
|
253
|
-
|
|
254
|
-
// Load initial state from storage
|
|
255
|
-
if (typeof window !== 'undefined') {
|
|
256
|
-
stateManager.loadFromStorage();
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
export { StateManager, stateManager };
|
|
1
|
+
/**
|
|
2
|
+
* Shared State Manager
|
|
3
|
+
* Manages state synchronization between electron app and VSCode extension
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
class StateManager {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.state = {
|
|
9
|
+
autonomousMode: false,
|
|
10
|
+
isPaused: false,
|
|
11
|
+
isStopped: false,
|
|
12
|
+
isCheckingQuota: false,
|
|
13
|
+
isOpeningIde: false,
|
|
14
|
+
currentIde: 'vscode', // Default IDE
|
|
15
|
+
featureProgress: 0,
|
|
16
|
+
currentFeature: null,
|
|
17
|
+
status: 'Ready to chat',
|
|
18
|
+
messages: [],
|
|
19
|
+
tabs: [],
|
|
20
|
+
activeTabId: null
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
this.listeners = new Set();
|
|
24
|
+
this.storageKey = 'vibecodingmachine-shared-state';
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Get current state
|
|
28
|
+
getState() {
|
|
29
|
+
return { ...this.state };
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Update state and notify listeners
|
|
33
|
+
setState(updates) {
|
|
34
|
+
const oldState = { ...this.state };
|
|
35
|
+
this.state = { ...this.state, ...updates };
|
|
36
|
+
|
|
37
|
+
// Save to localStorage for persistence
|
|
38
|
+
this.saveToStorage();
|
|
39
|
+
|
|
40
|
+
// Notify all listeners
|
|
41
|
+
this.listeners.forEach(listener => {
|
|
42
|
+
try {
|
|
43
|
+
listener(this.state, oldState);
|
|
44
|
+
} catch (error) {
|
|
45
|
+
console.error('State listener error:', error);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Subscribe to state changes
|
|
51
|
+
subscribe(listener) {
|
|
52
|
+
this.listeners.add(listener);
|
|
53
|
+
|
|
54
|
+
// Return unsubscribe function
|
|
55
|
+
return () => {
|
|
56
|
+
this.listeners.delete(listener);
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Save state to localStorage
|
|
61
|
+
saveToStorage() {
|
|
62
|
+
try {
|
|
63
|
+
localStorage.setItem(this.storageKey, JSON.stringify(this.state));
|
|
64
|
+
} catch (error) {
|
|
65
|
+
console.error('Failed to save state to storage:', error);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Load state from localStorage
|
|
70
|
+
loadFromStorage() {
|
|
71
|
+
try {
|
|
72
|
+
const saved = localStorage.getItem(this.storageKey);
|
|
73
|
+
if (saved) {
|
|
74
|
+
const parsed = JSON.parse(saved);
|
|
75
|
+
this.setState(parsed);
|
|
76
|
+
}
|
|
77
|
+
} catch (error) {
|
|
78
|
+
console.error('Failed to load state from storage:', error);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Autonomous mode actions
|
|
83
|
+
startAutonomousMode(ide) {
|
|
84
|
+
this.setState({
|
|
85
|
+
autonomousMode: true,
|
|
86
|
+
isPaused: false,
|
|
87
|
+
isStopped: false,
|
|
88
|
+
currentIde: ide,
|
|
89
|
+
status: 'Starting autonomous mode...',
|
|
90
|
+
featureProgress: 0
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
stopAutonomousMode() {
|
|
95
|
+
this.setState({
|
|
96
|
+
autonomousMode: false,
|
|
97
|
+
isPaused: false,
|
|
98
|
+
isStopped: true,
|
|
99
|
+
status: 'Autonomous mode stopped',
|
|
100
|
+
featureProgress: 0,
|
|
101
|
+
currentFeature: null
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
pauseAutonomousMode() {
|
|
106
|
+
this.setState({
|
|
107
|
+
isPaused: true,
|
|
108
|
+
status: 'Autonomous mode paused'
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
resumeAutonomousMode() {
|
|
113
|
+
this.setState({
|
|
114
|
+
isPaused: false,
|
|
115
|
+
status: 'Autonomous mode resumed'
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
togglePause() {
|
|
120
|
+
if (this.state.isPaused) {
|
|
121
|
+
this.resumeAutonomousMode();
|
|
122
|
+
} else {
|
|
123
|
+
this.pauseAutonomousMode();
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Quota checking
|
|
128
|
+
startQuotaCheck() {
|
|
129
|
+
this.setState({
|
|
130
|
+
isCheckingQuota: true,
|
|
131
|
+
status: 'Checking quota...'
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
finishQuotaCheck(result) {
|
|
136
|
+
this.setState({
|
|
137
|
+
isCheckingQuota: false,
|
|
138
|
+
status: result.success ? 'Quota check completed' : 'Quota check failed'
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// IDE opening
|
|
143
|
+
startOpeningIde() {
|
|
144
|
+
this.setState({
|
|
145
|
+
isOpeningIde: true,
|
|
146
|
+
status: 'Opening IDE...'
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
finishOpeningIde(result) {
|
|
151
|
+
this.setState({
|
|
152
|
+
isOpeningIde: false,
|
|
153
|
+
status: result.success ? 'IDE opened successfully' : 'Failed to open IDE'
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Feature progress
|
|
158
|
+
updateFeatureProgress(progress, feature = null) {
|
|
159
|
+
this.setState({
|
|
160
|
+
featureProgress: progress,
|
|
161
|
+
currentFeature: feature,
|
|
162
|
+
status: `Autonomous mode progress: ${progress}%`
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Message management
|
|
167
|
+
addMessage(role, text) {
|
|
168
|
+
const message = {
|
|
169
|
+
id: Date.now(),
|
|
170
|
+
role,
|
|
171
|
+
text,
|
|
172
|
+
timestamp: new Date().toISOString()
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
this.setState({
|
|
176
|
+
messages: [...this.state.messages, message]
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
clearMessages() {
|
|
181
|
+
this.setState({
|
|
182
|
+
messages: []
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// Tab management
|
|
187
|
+
setTabs(tabs) {
|
|
188
|
+
this.setState({
|
|
189
|
+
tabs,
|
|
190
|
+
activeTabId: tabs.length > 0 ? tabs[0].id : null
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
setActiveTab(tabId) {
|
|
195
|
+
this.setState({
|
|
196
|
+
activeTabId: tabId
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// Status updates
|
|
201
|
+
updateStatus(status) {
|
|
202
|
+
this.setState({
|
|
203
|
+
status
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// Reset state
|
|
208
|
+
reset() {
|
|
209
|
+
this.setState({
|
|
210
|
+
autonomousMode: false,
|
|
211
|
+
isPaused: false,
|
|
212
|
+
isStopped: false,
|
|
213
|
+
isCheckingQuota: false,
|
|
214
|
+
isOpeningIde: false,
|
|
215
|
+
currentIde: 'vscode', // Default IDE
|
|
216
|
+
featureProgress: 0,
|
|
217
|
+
currentFeature: null,
|
|
218
|
+
status: 'Ready to chat',
|
|
219
|
+
messages: [],
|
|
220
|
+
tabs: [],
|
|
221
|
+
activeTabId: null
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// Get specific state values
|
|
226
|
+
isAutonomousMode() {
|
|
227
|
+
return this.state.autonomousMode;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
isPaused() {
|
|
231
|
+
return this.state.isPaused;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
isStopped() {
|
|
235
|
+
return this.state.isStopped;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
getCurrentIde() {
|
|
239
|
+
return this.state.currentIde;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
getStatus() {
|
|
243
|
+
return this.state.status;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
getProgress() {
|
|
247
|
+
return this.state.featureProgress;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// Create singleton instance
|
|
252
|
+
const stateManager = new StateManager();
|
|
253
|
+
|
|
254
|
+
// Load initial state from storage
|
|
255
|
+
if (typeof window !== 'undefined') {
|
|
256
|
+
stateManager.loadFromStorage();
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
export { StateManager, stateManager };
|