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.
Files changed (147) hide show
  1. package/README.md +31 -192
  2. package/dist/app.d.ts +28 -0
  3. package/dist/app.d.ts.map +1 -0
  4. package/dist/app.js +184 -0
  5. package/dist/app.js.map +1 -0
  6. package/dist/context.d.ts +36 -0
  7. package/dist/context.d.ts.map +1 -0
  8. package/dist/context.js +95 -0
  9. package/dist/context.js.map +1 -0
  10. package/dist/index.d.ts +5 -7
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +5 -9
  13. package/dist/index.js.map +1 -1
  14. package/dist/middleware/cors.d.ts +11 -0
  15. package/dist/middleware/cors.d.ts.map +1 -0
  16. package/dist/middleware/cors.js +34 -0
  17. package/dist/middleware/cors.js.map +1 -0
  18. package/dist/middleware/serve-static.d.ts +6 -0
  19. package/dist/middleware/serve-static.d.ts.map +1 -0
  20. package/dist/middleware/serve-static.js +68 -0
  21. package/dist/middleware/serve-static.js.map +1 -0
  22. package/dist/node.d.ts +8 -0
  23. package/dist/node.d.ts.map +1 -0
  24. package/dist/node.js +52 -0
  25. package/dist/node.js.map +1 -0
  26. package/dist/path.d.ts +10 -0
  27. package/dist/path.d.ts.map +1 -0
  28. package/dist/path.js +45 -0
  29. package/dist/path.js.map +1 -0
  30. package/dist/vite.d.ts +31 -0
  31. package/dist/vite.d.ts.map +1 -0
  32. package/dist/vite.js +278 -0
  33. package/dist/vite.js.map +1 -0
  34. package/package.json +33 -40
  35. package/dist/cli.d.ts +0 -3
  36. package/dist/cli.d.ts.map +0 -1
  37. package/dist/cli.js +0 -137
  38. package/dist/cli.js.map +0 -1
  39. package/dist/components/BaseHead.d.ts +0 -5
  40. package/dist/components/BaseHead.d.ts.map +0 -1
  41. package/dist/components/BaseHead.js +0 -161
  42. package/dist/components/BaseHead.js.map +0 -1
  43. package/dist/components/ChatInput.d.ts +0 -7
  44. package/dist/components/ChatInput.d.ts.map +0 -1
  45. package/dist/components/ChatInput.js +0 -11
  46. package/dist/components/ChatInput.js.map +0 -1
  47. package/dist/components/Sidebar.d.ts +0 -8
  48. package/dist/components/Sidebar.d.ts.map +0 -1
  49. package/dist/components/Sidebar.js +0 -7
  50. package/dist/components/Sidebar.js.map +0 -1
  51. package/dist/components/SimpleLivePreview.d.ts +0 -7
  52. package/dist/components/SimpleLivePreview.d.ts.map +0 -1
  53. package/dist/components/SimpleLivePreview.js +0 -7
  54. package/dist/components/SimpleLivePreview.js.map +0 -1
  55. package/dist/components/Terminal.d.ts +0 -7
  56. package/dist/components/Terminal.d.ts.map +0 -1
  57. package/dist/components/Terminal.js +0 -14
  58. package/dist/components/Terminal.js.map +0 -1
  59. package/dist/components/VoiceRecorder.d.ts +0 -4
  60. package/dist/components/VoiceRecorder.d.ts.map +0 -1
  61. package/dist/components/VoiceRecorder.js +0 -5
  62. package/dist/components/VoiceRecorder.js.map +0 -1
  63. package/dist/components/icons/GeminiLogo.d.ts +0 -7
  64. package/dist/components/icons/GeminiLogo.d.ts.map +0 -1
  65. package/dist/components/icons/GeminiLogo.js +0 -5
  66. package/dist/components/icons/GeminiLogo.js.map +0 -1
  67. package/dist/components/icons/OllamaLogo.d.ts +0 -2
  68. package/dist/components/icons/OllamaLogo.d.ts.map +0 -1
  69. package/dist/components/icons/OllamaLogo.js +0 -5
  70. package/dist/components/icons/OllamaLogo.js.map +0 -1
  71. package/dist/layouts/Layout.d.ts +0 -9
  72. package/dist/layouts/Layout.d.ts.map +0 -1
  73. package/dist/layouts/Layout.js +0 -9
  74. package/dist/layouts/Layout.js.map +0 -1
  75. package/dist/layouts/NotFoundLayout.d.ts +0 -2
  76. package/dist/layouts/NotFoundLayout.d.ts.map +0 -1
  77. package/dist/layouts/NotFoundLayout.js +0 -6
  78. package/dist/layouts/NotFoundLayout.js.map +0 -1
  79. package/dist/pages/Code.d.ts +0 -7
  80. package/dist/pages/Code.d.ts.map +0 -1
  81. package/dist/pages/Code.js +0 -8
  82. package/dist/pages/Code.js.map +0 -1
  83. package/dist/pages/Home.d.ts +0 -7
  84. package/dist/pages/Home.d.ts.map +0 -1
  85. package/dist/pages/Home.js +0 -8
  86. package/dist/pages/Home.js.map +0 -1
  87. package/dist/pages/Welcome.d.ts +0 -2
  88. package/dist/pages/Welcome.d.ts.map +0 -1
  89. package/dist/pages/Welcome.js +0 -6
  90. package/dist/pages/Welcome.js.map +0 -1
  91. package/dist/server.d.ts +0 -11
  92. package/dist/server.d.ts.map +0 -1
  93. package/dist/server.js +0 -434
  94. package/dist/server.js.map +0 -1
  95. package/dist/services/dev-server.d.ts +0 -29
  96. package/dist/services/dev-server.d.ts.map +0 -1
  97. package/dist/services/dev-server.js +0 -201
  98. package/dist/services/dev-server.js.map +0 -1
  99. package/dist/services/terminal.d.ts +0 -46
  100. package/dist/services/terminal.d.ts.map +0 -1
  101. package/dist/services/terminal.js +0 -264
  102. package/dist/services/terminal.js.map +0 -1
  103. package/dist/services/websocket.d.ts +0 -48
  104. package/dist/services/websocket.d.ts.map +0 -1
  105. package/dist/services/websocket.js +0 -332
  106. package/dist/services/websocket.js.map +0 -1
  107. package/dist/static/components/ChatInput.js +0 -237
  108. package/dist/static/components/Sidebar.js +0 -225
  109. package/dist/static/components/SimpleLivePreview.js +0 -305
  110. package/dist/static/components/Terminal.js +0 -461
  111. package/dist/static/components/TerminalTabs.js +0 -383
  112. package/dist/static/favicon.svg +0 -14
  113. package/dist/static/signals/LivePreviewSignal.js +0 -71
  114. package/dist/static/signals/SidebarSignal.js +0 -123
  115. package/dist/static/signals/TerminalSignal.js +0 -273
  116. package/dist/static/styles/main.css +0 -1761
  117. package/src/cli.ts +0 -155
  118. package/src/components/BaseHead.ts +0 -164
  119. package/src/components/ChatInput.tsx +0 -56
  120. package/src/components/Sidebar.tsx +0 -99
  121. package/src/components/SimpleLivePreview.tsx +0 -40
  122. package/src/components/Terminal.tsx +0 -40
  123. package/src/components/VoiceRecorder.tsx +0 -33
  124. package/src/components/icons/GeminiLogo.tsx +0 -10
  125. package/src/components/icons/OllamaLogo.tsx +0 -5
  126. package/src/index.tsx +0 -12
  127. package/src/layouts/Layout.tsx +0 -41
  128. package/src/layouts/NotFoundLayout.tsx +0 -15
  129. package/src/pages/Code.tsx +0 -34
  130. package/src/pages/Welcome.tsx +0 -56
  131. package/src/server.tsx +0 -519
  132. package/src/services/dev-server.ts +0 -234
  133. package/src/services/terminal.ts +0 -325
  134. package/src/services/websocket.ts +0 -405
  135. package/src/static/components/ChatInput.js +0 -237
  136. package/src/static/components/Sidebar.js +0 -225
  137. package/src/static/components/SimpleLivePreview.js +0 -305
  138. package/src/static/components/Terminal.js +0 -461
  139. package/src/static/components/TerminalTabs.js +0 -383
  140. package/src/static/favicon.svg +0 -14
  141. package/src/static/signals/LivePreviewSignal.js +0 -71
  142. package/src/static/signals/SidebarSignal.js +0 -123
  143. package/src/static/signals/TerminalSignal.js +0 -273
  144. package/src/static/styles/main.css +0 -1761
  145. package/src/styles/input.css +0 -3
  146. package/tailwind.config.ts +0 -22
  147. 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();