agentgui 1.0.400 → 1.0.401

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentgui",
3
- "version": "1.0.400",
3
+ "version": "1.0.401",
4
4
  "description": "Multi-agent ACP client with real-time communication",
5
5
  "type": "module",
6
6
  "main": "server.js",
package/static/index.html CHANGED
@@ -3217,22 +3217,22 @@
3217
3217
  window._escHtml = function(t) { return t.replace(_escHtmlRe, function(c) { return _escHtmlMap[c]; }); };
3218
3218
  </script>
3219
3219
  <script defer src="/gm/js/event-processor.js"></script>
3220
- <script defer src="/gm/js/streaming-renderer.js"></script>
3221
- <script defer src="/gm/js/kalman-filter.js"></script>
3222
- <script defer src="/gm/js/event-consolidator.js"></script>
3223
- <script defer src="/gm/js/websocket-manager.js"></script>
3224
- <script defer src="/gm/js/ws-client.js"></script>
3225
- <script defer src="/gm/js/event-filter.js"></script>
3226
- <script defer src="/gm/js/syntax-highlighter.js"></script>
3227
- <script defer src="/gm/js/dialogs.js"></script>
3228
- <script defer src="/gm/js/ui-components.js"></script>
3229
- <script defer src="/gm/js/conversations.js"></script>
3230
- <script defer src="/gm/js/client.js"></script>
3231
- <script type="module" src="/gm/js/voice.js"></script>
3232
- <script defer src="/gm/js/features.js"></script>
3233
- <script defer src="/gm/js/terminal.js"></script>
3234
- <script defer src="/gm/js/script-runner.js"></script>
3235
- <script defer src="/gm/js/agent-auth.js"></script>
3220
+ <script defer src="/gm/js/streaming-renderer.js"></script>
3221
+ <script defer src="/gm/js/kalman-filter.js"></script>
3222
+ <script defer src="/gm/js/event-consolidator.js"></script>
3223
+ <script defer src="/gm/js/websocket-manager.js"></script>
3224
+ <script defer src="/gm/js/ws-client.js"></script>
3225
+ <script defer src="/gm/js/event-filter.js"></script>
3226
+ <script defer src="/gm/js/syntax-highlighter.js"></script>
3227
+ <script defer src="/gm/js/dialogs.js"></script>
3228
+ <script defer src="/gm/js/ui-components.js"></script>
3229
+ <script defer src="/gm/js/conversations.js"></script>
3230
+ <script defer src="/gm/js/terminal.js"></script>
3231
+ <script defer src="/gm/js/script-runner.js"></script>
3232
+ <script defer src="/gm/js/client.js"></script>
3233
+ <script type="module" src="/gm/js/voice.js"></script>
3234
+ <script defer src="/gm/js/features.js"></script>
3235
+ <script defer src="/gm/js/agent-auth.js"></script>
3236
3236
 
3237
3237
  <script>
3238
3238
  const savedTheme = localStorage.getItem('theme') || 'light';
@@ -1,219 +1,211 @@
1
- (function() {
2
- const BASE = window.__BASE_URL || '';
3
- let currentConversationId = null;
4
- let scriptState = { running: false, script: null, hasStart: false, hasDev: false };
5
- let terminal = null;
6
- let fitAddon = null;
7
- let hasTerminalContent = false;
8
- let resizeObserver = null;
9
-
10
- function init() {
11
- setupListeners();
12
- setupButtons();
13
- }
14
-
15
- function setupListeners() {
16
- window.addEventListener('conversation-selected', function(e) {
17
- currentConversationId = e.detail.conversationId;
18
- hasTerminalContent = false;
19
- if (terminal) terminal.clear();
20
- hideTerminalTab();
21
- checkScripts();
22
- });
23
-
24
- window.addEventListener('ws-message', function(e) {
25
- const data = e.detail;
26
- if (!data || !currentConversationId) return;
27
- if (data.conversationId !== currentConversationId) return;
28
-
29
- if (data.type === 'script_started') {
30
- scriptState.running = true;
31
- scriptState.script = data.script;
32
- hasTerminalContent = false;
33
- if (terminal) terminal.clear();
34
- updateButtons();
35
- showTerminalTab();
36
- } else if (data.type === 'script_stopped') {
37
- scriptState.running = false;
38
- const msg = data.error ? data.error : ('exited with code ' + (data.code || 0));
39
- if (terminal) terminal.writeln('\r\n\x1b[90m[process ' + msg + ']\x1b[0m');
40
- updateButtons();
41
- } else if (data.type === 'script_output') {
42
- hasTerminalContent = true;
43
- showTerminalTab();
44
- if (terminal) terminal.write(data.data);
45
- }
46
- });
47
-
48
- window.addEventListener('resize', debounce(fitTerminal, 200));
49
- }
50
-
51
- function setupButtons() {
52
- var startBtn = document.getElementById('scriptStartBtn');
53
- var devBtn = document.getElementById('scriptDevBtn');
54
- var stopBtn = document.getElementById('scriptStopBtn');
55
-
56
- if (startBtn) startBtn.addEventListener('click', function() { runScript('start'); });
57
- if (devBtn) devBtn.addEventListener('click', function() { runScript('dev'); });
58
- if (stopBtn) stopBtn.addEventListener('click', function() { stopScript(); });
59
- }
60
-
61
- function checkScripts() {
62
- if (!currentConversationId) return;
63
- fetch(BASE + '/api/conversations/' + currentConversationId + '/scripts')
64
- .then(function(r) { return r.json(); })
65
- .then(function(data) {
66
- scriptState.hasStart = data.hasStart;
67
- scriptState.hasDev = data.hasDev;
68
- scriptState.running = data.running;
69
- scriptState.script = data.runningScript;
70
- updateButtons();
71
- if (data.running || hasTerminalContent) showTerminalTab();
72
- })
73
- .catch(function() {
74
- scriptState.hasStart = false;
75
- scriptState.hasDev = false;
76
- updateButtons();
77
- });
78
- }
79
-
80
- function updateButtons() {
81
- var container = document.getElementById('scriptButtons');
82
- var startBtn = document.getElementById('scriptStartBtn');
83
- var devBtn = document.getElementById('scriptDevBtn');
84
- var stopBtn = document.getElementById('scriptStopBtn');
85
-
86
- var showAny = scriptState.hasStart || scriptState.hasDev || scriptState.running;
87
- if (container) container.style.display = showAny ? 'flex' : 'none';
88
-
89
- if (scriptState.running) {
90
- if (startBtn) startBtn.style.display = 'none';
91
- if (devBtn) devBtn.style.display = 'none';
92
- if (stopBtn) stopBtn.style.display = 'flex';
93
- } else {
94
- if (startBtn) startBtn.style.display = scriptState.hasStart ? 'flex' : 'none';
95
- if (devBtn) devBtn.style.display = scriptState.hasDev ? 'flex' : 'none';
96
- if (stopBtn) stopBtn.style.display = 'none';
97
- }
98
- }
99
-
100
- function runScript(script) {
101
- if (!currentConversationId || scriptState.running) return;
102
- fetch(BASE + '/api/conversations/' + currentConversationId + '/run-script', {
103
- method: 'POST',
104
- headers: { 'Content-Type': 'application/json' },
105
- body: JSON.stringify({ script: script })
106
- })
107
- .then(function(r) { return r.json(); })
108
- .then(function(data) {
109
- if (data.ok) {
110
- scriptState.running = true;
111
- scriptState.script = script;
112
- hasTerminalContent = false;
113
- updateButtons();
114
- showTerminalTab();
115
- switchToTerminalView();
116
- ensureTerminal();
117
- if (terminal) {
118
- terminal.clear();
119
- terminal.writeln('\x1b[36m[running npm run ' + script + ']\x1b[0m\r\n');
120
- }
121
- }
122
- })
123
- .catch(function(err) {
124
- console.error('Failed to start script:', err);
125
- });
126
- }
127
-
128
- function stopScript() {
129
- if (!currentConversationId) return;
130
- fetch(BASE + '/api/conversations/' + currentConversationId + '/stop-script', {
131
- method: 'POST',
132
- headers: { 'Content-Type': 'application/json' },
133
- body: '{}'
134
- }).catch(function(err) {
135
- console.error('Failed to stop script:', err);
136
- });
137
- }
138
-
139
- function showTerminalTab() {
140
- var btn = document.getElementById('terminalTabBtn');
141
- if (btn) btn.style.display = '';
142
- }
143
-
144
- function hideTerminalTab() {
145
- var btn = document.getElementById('terminalTabBtn');
146
- if (btn) btn.style.display = 'none';
147
- }
148
-
149
- function switchToTerminalView() {
150
- var bar = document.getElementById('viewToggleBar');
151
- if (!bar) return;
152
- var termBtn = bar.querySelector('[data-view="terminal"]');
153
- if (termBtn) termBtn.click();
154
- }
155
-
156
- function ensureTerminal() {
157
- if (terminal) return;
158
- if (typeof window.Terminal === 'undefined') {
159
- setTimeout(ensureTerminal, 200);
160
- return;
161
- }
162
- var container = document.getElementById('terminalOutput');
163
- if (!container) return;
164
-
165
- terminal = new window.Terminal({
166
- cursorBlink: false,
167
- scrollback: 10000,
168
- fontSize: 13,
169
- fontFamily: "'JetBrains Mono', 'Fira Code', 'Cascadia Code', Menlo, Monaco, 'Courier New', monospace",
170
- theme: { background: '#1e1e1e', foreground: '#d4d4d4' },
171
- convertEol: true,
172
- disableStdin: true
173
- });
174
-
175
- if (window.FitAddon) {
176
- fitAddon = new window.FitAddon.FitAddon();
177
- terminal.loadAddon(fitAddon);
178
- }
179
-
180
- terminal.open(container);
181
- fitTerminal();
182
-
183
- if (resizeObserver) resizeObserver.disconnect();
184
- resizeObserver = new ResizeObserver(debounce(fitTerminal, 100));
185
- resizeObserver.observe(container);
186
- }
187
-
188
- function fitTerminal() {
189
- if (fitAddon) {
190
- try { fitAddon.fit(); } catch {}
191
- }
192
- }
193
-
194
- function debounce(fn, ms) {
195
- var timer;
196
- return function() {
197
- clearTimeout(timer);
198
- timer = setTimeout(fn, ms);
199
- };
200
- }
201
-
202
- window.addEventListener('view-switched', function(e) {
203
- if (e.detail && e.detail.view === 'terminal') {
204
- ensureTerminal();
205
- setTimeout(fitTerminal, 50);
206
- }
207
- });
208
-
209
- if (document.readyState === 'loading') {
210
- document.addEventListener('DOMContentLoaded', init);
211
- } else {
212
- init();
213
- }
214
-
215
- window.scriptRunner = {
216
- getState: function() { return scriptState; },
217
- getTerminal: function() { return terminal; }
218
- };
219
- })();
1
+ (function() {
2
+ const BASE = window.__BASE_URL || '';
3
+ let currentConversationId = null;
4
+ let currentWorkingDirectory = null;
5
+ let scriptState = { running: false, script: null, hasStart: false, hasDev: false };
6
+ let hasTerminalContent = false;
7
+
8
+ function init() {
9
+ setupListeners();
10
+ setupButtons();
11
+ }
12
+
13
+ function setupListeners() {
14
+ window.addEventListener('conversation-selected', function(e) {
15
+ currentConversationId = e.detail.conversationId;
16
+ hasTerminalContent = false;
17
+ hideTerminalTab();
18
+ fetchConversationAndCheckScripts();
19
+ });
20
+
21
+ window.addEventListener('ws-message', function(e) {
22
+ const data = e.detail;
23
+ if (!data || !currentConversationId) return;
24
+ if (data.conversationId !== currentConversationId) return;
25
+
26
+ const term = getTerminal();
27
+
28
+ if (data.type === 'script_started') {
29
+ scriptState.running = true;
30
+ scriptState.script = data.script;
31
+ hasTerminalContent = false;
32
+ if (term) term.clear();
33
+ updateButtons();
34
+ showTerminalTab();
35
+ } else if (data.type === 'script_stopped') {
36
+ scriptState.running = false;
37
+ const msg = data.error ? data.error : ('exited with code ' + (data.code || 0));
38
+ if (term) term.writeln('\r\n\x1b[90m[process ' + msg + ']\x1b[0m');
39
+ updateButtons();
40
+ } else if (data.type === 'script_output') {
41
+ hasTerminalContent = true;
42
+ showTerminalTab();
43
+ if (term) term.write(data.data);
44
+ }
45
+ });
46
+
47
+ window.addEventListener('resize', debounce(fitTerminal, 200));
48
+ }
49
+
50
+ function setupButtons() {
51
+ var startBtn = document.getElementById('scriptStartBtn');
52
+ var devBtn = document.getElementById('scriptDevBtn');
53
+ var stopBtn = document.getElementById('scriptStopBtn');
54
+
55
+ if (startBtn) startBtn.addEventListener('click', function() { runScript('start'); });
56
+ if (devBtn) devBtn.addEventListener('click', function() { runScript('dev'); });
57
+ if (stopBtn) stopBtn.addEventListener('click', function() { stopScript(); });
58
+ }
59
+
60
+ function fetchConversationAndCheckScripts() {
61
+ if (!currentConversationId) return;
62
+
63
+ fetch(BASE + '/api/conversations/' + currentConversationId)
64
+ .then(function(r) { return r.json(); })
65
+ .then(function(data) {
66
+ currentWorkingDirectory = data.conversation?.workingDirectory || null;
67
+ if (currentWorkingDirectory) {
68
+ showTerminalTab();
69
+ }
70
+ checkScripts();
71
+ })
72
+ .catch(function() {
73
+ checkScripts();
74
+ });
75
+ }
76
+
77
+ function checkScripts() {
78
+ if (!currentConversationId) return;
79
+ fetch(BASE + '/api/conversations/' + currentConversationId + '/scripts')
80
+ .then(function(r) { return r.json(); })
81
+ .then(function(data) {
82
+ scriptState.hasStart = data.hasStart;
83
+ scriptState.hasDev = data.hasDev;
84
+ scriptState.running = data.running;
85
+ scriptState.script = data.runningScript;
86
+ updateButtons();
87
+ if (data.running || hasTerminalContent) showTerminalTab();
88
+ })
89
+ .catch(function() {
90
+ scriptState.hasStart = false;
91
+ scriptState.hasDev = false;
92
+ updateButtons();
93
+ });
94
+ }
95
+
96
+ function updateButtons() {
97
+ var container = document.getElementById('scriptButtons');
98
+ var startBtn = document.getElementById('scriptStartBtn');
99
+ var devBtn = document.getElementById('scriptDevBtn');
100
+ var stopBtn = document.getElementById('scriptStopBtn');
101
+
102
+ var showAny = scriptState.hasStart || scriptState.hasDev || scriptState.running;
103
+ if (container) container.style.display = showAny ? 'flex' : 'none';
104
+
105
+ if (scriptState.running) {
106
+ if (startBtn) startBtn.style.display = 'none';
107
+ if (devBtn) devBtn.style.display = 'none';
108
+ if (stopBtn) stopBtn.style.display = 'flex';
109
+ } else {
110
+ if (startBtn) startBtn.style.display = scriptState.hasStart ? 'flex' : 'none';
111
+ if (devBtn) devBtn.style.display = scriptState.hasDev ? 'flex' : 'none';
112
+ if (stopBtn) stopBtn.style.display = 'none';
113
+ }
114
+ }
115
+
116
+ function runScript(script) {
117
+ if (!currentConversationId || scriptState.running) return;
118
+ fetch(BASE + '/api/conversations/' + currentConversationId + '/run-script', {
119
+ method: 'POST',
120
+ headers: { 'Content-Type': 'application/json' },
121
+ body: JSON.stringify({ script: script })
122
+ })
123
+ .then(function(r) { return r.json(); })
124
+ .then(function(data) {
125
+ if (data.ok) {
126
+ scriptState.running = true;
127
+ scriptState.script = script;
128
+ hasTerminalContent = false;
129
+ updateButtons();
130
+ showTerminalTab();
131
+ switchToTerminalView();
132
+
133
+ var term = getTerminal();
134
+ if (term) {
135
+ term.clear();
136
+ term.writeln('\x1b[36m[running npm run ' + script + ']\x1b[0m\r\n');
137
+ }
138
+ }
139
+ })
140
+ .catch(function(err) {
141
+ console.error('Failed to start script:', err);
142
+ });
143
+ }
144
+
145
+ function stopScript() {
146
+ if (!currentConversationId) return;
147
+ fetch(BASE + '/api/conversations/' + currentConversationId + '/stop-script', {
148
+ method: 'POST',
149
+ headers: { 'Content-Type': 'application/json' },
150
+ body: '{}'
151
+ }).catch(function(err) {
152
+ console.error('Failed to stop script:', err);
153
+ });
154
+ }
155
+
156
+ function showTerminalTab() {
157
+ var btn = document.getElementById('terminalTabBtn');
158
+ if (btn) btn.style.display = '';
159
+ }
160
+
161
+ function hideTerminalTab() {
162
+ var btn = document.getElementById('terminalTabBtn');
163
+ if (btn) btn.style.display = 'none';
164
+ }
165
+
166
+ function switchToTerminalView() {
167
+ var bar = document.getElementById('viewToggleBar');
168
+ if (!bar) return;
169
+ var termBtn = bar.querySelector('[data-view="terminal"]');
170
+ if (termBtn) termBtn.click();
171
+ }
172
+
173
+ function getTerminal() {
174
+ if (window.terminalModule && window.terminalModule.getTerminal) {
175
+ return window.terminalModule.getTerminal();
176
+ }
177
+ return null;
178
+ }
179
+
180
+ function fitTerminal() {
181
+ var term = getTerminal();
182
+ if (term && term._core && term._core._renderService) {
183
+ try { term.fit(); } catch {}
184
+ }
185
+ }
186
+
187
+ function debounce(fn, ms) {
188
+ var timer;
189
+ return function() {
190
+ clearTimeout(timer);
191
+ timer = setTimeout(fn, ms);
192
+ };
193
+ }
194
+
195
+ window.addEventListener('view-switched', function(e) {
196
+ if (e.detail && e.detail.view === 'terminal') {
197
+ setTimeout(fitTerminal, 100);
198
+ }
199
+ });
200
+
201
+ if (document.readyState === 'loading') {
202
+ document.addEventListener('DOMContentLoaded', init);
203
+ } else {
204
+ init();
205
+ }
206
+
207
+ window.scriptRunner = {
208
+ getState: function() { return scriptState; },
209
+ getTerminal: getTerminal
210
+ };
211
+ })();
@@ -101,5 +101,10 @@
101
101
  }
102
102
  });
103
103
 
104
- window.terminalModule = { start: startTerminal, stop: stopTerminal };
105
- })();
104
+ window.terminalModule = {
105
+ start: startTerminal,
106
+ stop: stopTerminal,
107
+ getTerminal: function() { return term; },
108
+ isActive: function() { return termActive; }
109
+ };
110
+ })();