treesap 0.1.13 → 0.2.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 +31 -192
- package/dist/app.d.ts +28 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +184 -0
- package/dist/app.js.map +1 -0
- package/dist/context.d.ts +36 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +95 -0
- package/dist/context.js.map +1 -0
- package/dist/index.d.ts +5 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -9
- package/dist/index.js.map +1 -1
- package/dist/middleware/cors.d.ts +11 -0
- package/dist/middleware/cors.d.ts.map +1 -0
- package/dist/middleware/cors.js +34 -0
- package/dist/middleware/cors.js.map +1 -0
- package/dist/middleware/serve-static.d.ts +6 -0
- package/dist/middleware/serve-static.d.ts.map +1 -0
- package/dist/middleware/serve-static.js +68 -0
- package/dist/middleware/serve-static.js.map +1 -0
- package/dist/node.d.ts +8 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +52 -0
- package/dist/node.js.map +1 -0
- package/dist/path.d.ts +10 -0
- package/dist/path.d.ts.map +1 -0
- package/dist/path.js +45 -0
- package/dist/path.js.map +1 -0
- package/dist/vite.d.ts +31 -0
- package/dist/vite.d.ts.map +1 -0
- package/dist/vite.js +278 -0
- package/dist/vite.js.map +1 -0
- package/package.json +33 -40
- package/dist/cli.d.ts +0 -3
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -137
- package/dist/cli.js.map +0 -1
- package/dist/components/BaseHead.d.ts +0 -5
- package/dist/components/BaseHead.d.ts.map +0 -1
- package/dist/components/BaseHead.js +0 -161
- package/dist/components/BaseHead.js.map +0 -1
- package/dist/components/ChatInput.d.ts +0 -7
- package/dist/components/ChatInput.d.ts.map +0 -1
- package/dist/components/ChatInput.js +0 -11
- package/dist/components/ChatInput.js.map +0 -1
- package/dist/components/Sidebar.d.ts +0 -8
- package/dist/components/Sidebar.d.ts.map +0 -1
- package/dist/components/Sidebar.js +0 -7
- package/dist/components/Sidebar.js.map +0 -1
- package/dist/components/SimpleLivePreview.d.ts +0 -7
- package/dist/components/SimpleLivePreview.d.ts.map +0 -1
- package/dist/components/SimpleLivePreview.js +0 -7
- package/dist/components/SimpleLivePreview.js.map +0 -1
- package/dist/components/Terminal.d.ts +0 -7
- package/dist/components/Terminal.d.ts.map +0 -1
- package/dist/components/Terminal.js +0 -14
- package/dist/components/Terminal.js.map +0 -1
- package/dist/components/VoiceRecorder.d.ts +0 -4
- package/dist/components/VoiceRecorder.d.ts.map +0 -1
- package/dist/components/VoiceRecorder.js +0 -5
- package/dist/components/VoiceRecorder.js.map +0 -1
- package/dist/components/icons/GeminiLogo.d.ts +0 -7
- package/dist/components/icons/GeminiLogo.d.ts.map +0 -1
- package/dist/components/icons/GeminiLogo.js +0 -5
- package/dist/components/icons/GeminiLogo.js.map +0 -1
- package/dist/components/icons/OllamaLogo.d.ts +0 -2
- package/dist/components/icons/OllamaLogo.d.ts.map +0 -1
- package/dist/components/icons/OllamaLogo.js +0 -5
- package/dist/components/icons/OllamaLogo.js.map +0 -1
- package/dist/layouts/Layout.d.ts +0 -9
- package/dist/layouts/Layout.d.ts.map +0 -1
- package/dist/layouts/Layout.js +0 -9
- package/dist/layouts/Layout.js.map +0 -1
- package/dist/layouts/NotFoundLayout.d.ts +0 -2
- package/dist/layouts/NotFoundLayout.d.ts.map +0 -1
- package/dist/layouts/NotFoundLayout.js +0 -6
- package/dist/layouts/NotFoundLayout.js.map +0 -1
- package/dist/pages/Code.d.ts +0 -7
- package/dist/pages/Code.d.ts.map +0 -1
- package/dist/pages/Code.js +0 -8
- package/dist/pages/Code.js.map +0 -1
- package/dist/pages/Home.d.ts +0 -7
- package/dist/pages/Home.d.ts.map +0 -1
- package/dist/pages/Home.js +0 -8
- package/dist/pages/Home.js.map +0 -1
- package/dist/pages/Welcome.d.ts +0 -2
- package/dist/pages/Welcome.d.ts.map +0 -1
- package/dist/pages/Welcome.js +0 -6
- package/dist/pages/Welcome.js.map +0 -1
- package/dist/server.d.ts +0 -11
- package/dist/server.d.ts.map +0 -1
- package/dist/server.js +0 -434
- package/dist/server.js.map +0 -1
- package/dist/services/dev-server.d.ts +0 -29
- package/dist/services/dev-server.d.ts.map +0 -1
- package/dist/services/dev-server.js +0 -201
- package/dist/services/dev-server.js.map +0 -1
- package/dist/services/terminal.d.ts +0 -46
- package/dist/services/terminal.d.ts.map +0 -1
- package/dist/services/terminal.js +0 -264
- package/dist/services/terminal.js.map +0 -1
- package/dist/services/websocket.d.ts +0 -48
- package/dist/services/websocket.d.ts.map +0 -1
- package/dist/services/websocket.js +0 -332
- package/dist/services/websocket.js.map +0 -1
- package/dist/static/components/ChatInput.js +0 -237
- package/dist/static/components/Sidebar.js +0 -225
- package/dist/static/components/SimpleLivePreview.js +0 -305
- package/dist/static/components/Terminal.js +0 -461
- package/dist/static/components/TerminalTabs.js +0 -383
- package/dist/static/favicon.svg +0 -14
- package/dist/static/signals/LivePreviewSignal.js +0 -71
- package/dist/static/signals/SidebarSignal.js +0 -123
- package/dist/static/signals/TerminalSignal.js +0 -273
- package/dist/static/styles/main.css +0 -1761
- package/src/cli.ts +0 -155
- package/src/components/BaseHead.ts +0 -164
- package/src/components/ChatInput.tsx +0 -56
- package/src/components/Sidebar.tsx +0 -99
- package/src/components/SimpleLivePreview.tsx +0 -40
- package/src/components/Terminal.tsx +0 -40
- package/src/components/VoiceRecorder.tsx +0 -33
- package/src/components/icons/GeminiLogo.tsx +0 -10
- package/src/components/icons/OllamaLogo.tsx +0 -5
- package/src/index.tsx +0 -12
- package/src/layouts/Layout.tsx +0 -41
- package/src/layouts/NotFoundLayout.tsx +0 -15
- package/src/pages/Code.tsx +0 -34
- package/src/pages/Welcome.tsx +0 -56
- package/src/server.tsx +0 -519
- package/src/services/dev-server.ts +0 -234
- package/src/services/terminal.ts +0 -325
- package/src/services/websocket.ts +0 -405
- package/src/static/components/ChatInput.js +0 -237
- package/src/static/components/Sidebar.js +0 -225
- package/src/static/components/SimpleLivePreview.js +0 -305
- package/src/static/components/Terminal.js +0 -461
- package/src/static/components/TerminalTabs.js +0 -383
- package/src/static/favicon.svg +0 -14
- package/src/static/signals/LivePreviewSignal.js +0 -71
- package/src/static/signals/SidebarSignal.js +0 -123
- package/src/static/signals/TerminalSignal.js +0 -273
- package/src/static/styles/main.css +0 -1761
- package/src/styles/input.css +0 -3
- package/tailwind.config.ts +0 -22
- package/tsconfig.json +0 -37
|
@@ -1,273 +0,0 @@
|
|
|
1
|
-
import { signal, computed } from 'https://esm.sh/@preact/signals@1.2.2';
|
|
2
|
-
|
|
3
|
-
// Terminal state management for multiple terminals with cross-tab sync
|
|
4
|
-
class TerminalStore {
|
|
5
|
-
constructor() {
|
|
6
|
-
// Core state signals
|
|
7
|
-
this.terminals = signal([]); // Array of terminal objects: {id, sessionId, status, index, clientCount}
|
|
8
|
-
this.activeTerminalId = signal('terminal-1'); // Currently active terminal
|
|
9
|
-
this.nextTerminalIndex = signal(1); // For generating new terminal indices
|
|
10
|
-
|
|
11
|
-
// Cross-tab sync signals
|
|
12
|
-
this.sessionClients = signal(new Map()); // sessionId -> client count
|
|
13
|
-
this.globalStatus = signal('initializing'); // Overall connection status
|
|
14
|
-
|
|
15
|
-
// Computed values
|
|
16
|
-
this.activeTerminal = computed(() =>
|
|
17
|
-
this.terminals.value.find(t => t.id === this.activeTerminalId.value)
|
|
18
|
-
);
|
|
19
|
-
this.terminalCount = computed(() => this.terminals.value.length);
|
|
20
|
-
this.hasConnectedTerminals = computed(() =>
|
|
21
|
-
this.terminals.value.some(t => t.status === 'connected')
|
|
22
|
-
);
|
|
23
|
-
|
|
24
|
-
// Initialize cross-tab communication
|
|
25
|
-
this.initializeCrossTabSync();
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
// Actions for managing terminals
|
|
29
|
-
addTerminal(index = null) {
|
|
30
|
-
const terminalIndex = index || this.nextTerminalIndex.value;
|
|
31
|
-
const terminalId = `terminal-${terminalIndex}`;
|
|
32
|
-
const sessionId = `terminal-${terminalIndex}`;
|
|
33
|
-
|
|
34
|
-
// Check if terminal already exists
|
|
35
|
-
const existingTerminal = this.terminals.value.find(t => t.id === terminalId);
|
|
36
|
-
if (existingTerminal) {
|
|
37
|
-
console.log(`Terminal ${terminalId} already exists, updating status`);
|
|
38
|
-
this.updateTerminalStatus(terminalId, 'connecting');
|
|
39
|
-
return existingTerminal;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const newTerminal = {
|
|
43
|
-
id: terminalId,
|
|
44
|
-
sessionId: sessionId,
|
|
45
|
-
index: terminalIndex,
|
|
46
|
-
status: 'connecting',
|
|
47
|
-
createdAt: new Date()
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
this.terminals.value = [...this.terminals.value, newTerminal];
|
|
51
|
-
|
|
52
|
-
// Set as active if it's the first terminal
|
|
53
|
-
if (this.terminals.value.length === 1) {
|
|
54
|
-
this.activeTerminalId.value = terminalId;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// Update next index counter
|
|
58
|
-
if (terminalIndex >= this.nextTerminalIndex.value) {
|
|
59
|
-
this.nextTerminalIndex.value = terminalIndex + 1;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
console.log(`Added terminal: ${terminalId}`);
|
|
63
|
-
return newTerminal;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
removeTerminal(terminalId) {
|
|
67
|
-
const terminals = this.terminals.value.filter(t => t.id !== terminalId);
|
|
68
|
-
this.terminals.value = terminals;
|
|
69
|
-
|
|
70
|
-
// If we removed the active terminal, switch to another one
|
|
71
|
-
if (this.activeTerminalId.value === terminalId) {
|
|
72
|
-
if (terminals.length > 0) {
|
|
73
|
-
this.activeTerminalId.value = terminals[0].id;
|
|
74
|
-
} else {
|
|
75
|
-
this.activeTerminalId.value = 'terminal-1';
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
console.log(`Removed terminal: ${terminalId}`);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
setActiveTerminal(terminalId) {
|
|
83
|
-
const terminal = this.terminals.value.find(t => t.id === terminalId);
|
|
84
|
-
if (terminal) {
|
|
85
|
-
this.activeTerminalId.value = terminalId;
|
|
86
|
-
console.log(`Set active terminal: ${terminalId}`);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
updateTerminalStatus(terminalId, status) {
|
|
91
|
-
const terminals = this.terminals.value.map(t =>
|
|
92
|
-
t.id === terminalId ? { ...t, status, lastUpdated: new Date() } : t
|
|
93
|
-
);
|
|
94
|
-
this.terminals.value = terminals;
|
|
95
|
-
console.log(`Updated terminal ${terminalId} status to: ${status}`);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
getTerminalByIndex(index) {
|
|
99
|
-
return this.terminals.value.find(t => t.index === index);
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
getTerminalById(terminalId) {
|
|
103
|
-
return this.terminals.value.find(t => t.id === terminalId);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
getSessionId(terminalId) {
|
|
107
|
-
const terminal = this.getTerminalById(terminalId);
|
|
108
|
-
return terminal ? terminal.sessionId : null;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// Get next available terminal index
|
|
112
|
-
getNextIndex() {
|
|
113
|
-
return this.nextTerminalIndex.value;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
// Debug helpers
|
|
117
|
-
getState() {
|
|
118
|
-
return {
|
|
119
|
-
terminals: this.terminals.value,
|
|
120
|
-
activeTerminalId: this.activeTerminalId.value,
|
|
121
|
-
nextTerminalIndex: this.nextTerminalIndex.value,
|
|
122
|
-
activeTerminal: this.activeTerminal.value,
|
|
123
|
-
terminalCount: this.terminalCount.value
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
logState() {
|
|
128
|
-
console.log('Terminal Store State:', this.getState());
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
// Initialize cross-tab communication
|
|
132
|
-
initializeCrossTabSync() {
|
|
133
|
-
// Listen for WebSocket events from terminal managers
|
|
134
|
-
this.setupWebSocketEventListeners();
|
|
135
|
-
|
|
136
|
-
// Listen for browser storage events for cross-tab sync
|
|
137
|
-
this.setupStorageEventListeners();
|
|
138
|
-
|
|
139
|
-
// Initialize from any existing state in localStorage
|
|
140
|
-
this.loadStateFromStorage();
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
setupWebSocketEventListeners() {
|
|
144
|
-
// Custom events dispatched by TerminalManager
|
|
145
|
-
document.addEventListener('terminal:clients_count', (event) => {
|
|
146
|
-
this.updateSessionClientCount(event.detail.sessionId, event.detail.count);
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
document.addEventListener('terminal:session_closed', (event) => {
|
|
150
|
-
this.handleSessionClosed(event.detail.sessionId);
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
document.addEventListener('terminal:global_status', (event) => {
|
|
154
|
-
this.globalStatus.value = event.detail.status;
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
setupStorageEventListeners() {
|
|
159
|
-
// Listen for changes from other tabs
|
|
160
|
-
window.addEventListener('storage', (event) => {
|
|
161
|
-
if (event.key === 'treesap_terminal_state') {
|
|
162
|
-
this.syncFromStorage(event.newValue);
|
|
163
|
-
}
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
// Save state to storage when terminals change
|
|
167
|
-
this.terminals.subscribe(() => {
|
|
168
|
-
this.saveStateToStorage();
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
loadStateFromStorage() {
|
|
173
|
-
try {
|
|
174
|
-
const savedState = localStorage.getItem('treesap_terminal_state');
|
|
175
|
-
if (savedState) {
|
|
176
|
-
const state = JSON.parse(savedState);
|
|
177
|
-
// Only sync certain properties, not connection status which is per-tab
|
|
178
|
-
if (state.activeTerminalId) {
|
|
179
|
-
this.activeTerminalId.value = state.activeTerminalId;
|
|
180
|
-
}
|
|
181
|
-
if (state.nextTerminalIndex) {
|
|
182
|
-
this.nextTerminalIndex.value = state.nextTerminalIndex;
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
} catch (error) {
|
|
186
|
-
console.error('Error loading terminal state from storage:', error);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
saveStateToStorage() {
|
|
191
|
-
try {
|
|
192
|
-
const state = {
|
|
193
|
-
activeTerminalId: this.activeTerminalId.value,
|
|
194
|
-
nextTerminalIndex: this.nextTerminalIndex.value,
|
|
195
|
-
timestamp: Date.now()
|
|
196
|
-
};
|
|
197
|
-
localStorage.setItem('treesap_terminal_state', JSON.stringify(state));
|
|
198
|
-
} catch (error) {
|
|
199
|
-
console.error('Error saving terminal state to storage:', error);
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
syncFromStorage(newValueStr) {
|
|
204
|
-
if (!newValueStr) return;
|
|
205
|
-
|
|
206
|
-
try {
|
|
207
|
-
const newState = JSON.parse(newValueStr);
|
|
208
|
-
// Only sync if the change is from another tab (newer timestamp)
|
|
209
|
-
const currentTimestamp = this.lastSaveTimestamp || 0;
|
|
210
|
-
if (newState.timestamp && newState.timestamp > currentTimestamp) {
|
|
211
|
-
if (newState.activeTerminalId) {
|
|
212
|
-
this.activeTerminalId.value = newState.activeTerminalId;
|
|
213
|
-
}
|
|
214
|
-
if (newState.nextTerminalIndex) {
|
|
215
|
-
this.nextTerminalIndex.value = newState.nextTerminalIndex;
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
} catch (error) {
|
|
219
|
-
console.error('Error syncing terminal state from storage:', error);
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
updateSessionClientCount(sessionId, count) {
|
|
224
|
-
const currentMap = new Map(this.sessionClients.value);
|
|
225
|
-
currentMap.set(sessionId, count);
|
|
226
|
-
this.sessionClients.value = currentMap;
|
|
227
|
-
|
|
228
|
-
// Update terminal objects with client count
|
|
229
|
-
this.terminals.value = this.terminals.value.map(terminal => {
|
|
230
|
-
if (terminal.sessionId === sessionId) {
|
|
231
|
-
return { ...terminal, clientCount: count, lastUpdated: new Date() };
|
|
232
|
-
}
|
|
233
|
-
return terminal;
|
|
234
|
-
});
|
|
235
|
-
|
|
236
|
-
console.log(`Session ${sessionId} now has ${count} clients`);
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
handleSessionClosed(sessionId) {
|
|
240
|
-
console.log(`Session ${sessionId} was closed`);
|
|
241
|
-
|
|
242
|
-
// Update terminals for this session
|
|
243
|
-
this.terminals.value = this.terminals.value.map(terminal => {
|
|
244
|
-
if (terminal.sessionId === sessionId) {
|
|
245
|
-
return { ...terminal, status: 'closed', lastUpdated: new Date() };
|
|
246
|
-
}
|
|
247
|
-
return terminal;
|
|
248
|
-
});
|
|
249
|
-
|
|
250
|
-
// Remove from session clients
|
|
251
|
-
const currentMap = new Map(this.sessionClients.value);
|
|
252
|
-
currentMap.delete(sessionId);
|
|
253
|
-
this.sessionClients.value = currentMap;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
// Initialize default terminal
|
|
257
|
-
initializeDefaultTerminal() {
|
|
258
|
-
if (this.terminals.value.length === 0) {
|
|
259
|
-
this.addTerminal(1);
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
// Create and export singleton instance
|
|
265
|
-
export const terminalStore = new TerminalStore();
|
|
266
|
-
|
|
267
|
-
// Make it available globally for debugging
|
|
268
|
-
if (typeof window !== 'undefined') {
|
|
269
|
-
window.terminalStore = terminalStore;
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
// Initialize default terminal on load
|
|
273
|
-
terminalStore.initializeDefaultTerminal();
|