@gxp-dev/tools 2.0.62 → 2.0.64

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 (182) hide show
  1. package/README.md +32 -31
  2. package/bin/gx-devtools.js +74 -54
  3. package/bin/lib/cli.js +23 -21
  4. package/bin/lib/commands/add-dependency.js +366 -325
  5. package/bin/lib/commands/assets.js +137 -139
  6. package/bin/lib/commands/build.js +169 -174
  7. package/bin/lib/commands/datastore.js +181 -183
  8. package/bin/lib/commands/dev.js +127 -131
  9. package/bin/lib/commands/extensions.js +147 -149
  10. package/bin/lib/commands/extract-config.js +73 -67
  11. package/bin/lib/commands/index.js +12 -12
  12. package/bin/lib/commands/init.js +342 -240
  13. package/bin/lib/commands/publish.js +69 -75
  14. package/bin/lib/commands/socket.js +69 -69
  15. package/bin/lib/commands/ssl.js +14 -14
  16. package/bin/lib/constants.js +10 -24
  17. package/bin/lib/tui/App.tsx +761 -705
  18. package/bin/lib/tui/components/AIPanel.tsx +191 -171
  19. package/bin/lib/tui/components/CommandInput.tsx +394 -343
  20. package/bin/lib/tui/components/GeminiPanel.tsx +175 -151
  21. package/bin/lib/tui/components/Header.tsx +23 -21
  22. package/bin/lib/tui/components/LogPanel.tsx +244 -220
  23. package/bin/lib/tui/components/TabBar.tsx +50 -48
  24. package/bin/lib/tui/components/WelcomeScreen.tsx +126 -71
  25. package/bin/lib/tui/index.tsx +37 -39
  26. package/bin/lib/tui/services/AIService.ts +518 -462
  27. package/bin/lib/tui/services/ExtensionService.ts +140 -129
  28. package/bin/lib/tui/services/GeminiService.ts +367 -337
  29. package/bin/lib/tui/services/ServiceManager.ts +344 -322
  30. package/bin/lib/tui/services/SocketService.ts +168 -168
  31. package/bin/lib/tui/services/ViteService.ts +88 -88
  32. package/bin/lib/tui/services/index.ts +47 -22
  33. package/bin/lib/utils/ai-scaffold.js +291 -280
  34. package/bin/lib/utils/extract-config.js +157 -140
  35. package/bin/lib/utils/files.js +82 -86
  36. package/bin/lib/utils/index.js +7 -7
  37. package/bin/lib/utils/paths.js +34 -34
  38. package/bin/lib/utils/prompts.js +194 -169
  39. package/bin/lib/utils/ssl.js +79 -81
  40. package/browser-extensions/README.md +0 -1
  41. package/browser-extensions/chrome/background.js +244 -237
  42. package/browser-extensions/chrome/content.js +32 -29
  43. package/browser-extensions/chrome/devtools.html +7 -7
  44. package/browser-extensions/chrome/devtools.js +19 -19
  45. package/browser-extensions/chrome/inspector.js +802 -767
  46. package/browser-extensions/chrome/manifest.json +71 -63
  47. package/browser-extensions/chrome/panel.html +674 -636
  48. package/browser-extensions/chrome/panel.js +722 -712
  49. package/browser-extensions/chrome/popup.html +586 -543
  50. package/browser-extensions/chrome/popup.js +282 -244
  51. package/browser-extensions/chrome/rules.json +1 -1
  52. package/browser-extensions/chrome/test-chrome.html +216 -136
  53. package/browser-extensions/chrome/test-mixed-content.html +284 -189
  54. package/browser-extensions/chrome/test-uri-pattern.html +221 -198
  55. package/browser-extensions/firefox/README.md +9 -6
  56. package/browser-extensions/firefox/background.js +221 -218
  57. package/browser-extensions/firefox/content.js +55 -52
  58. package/browser-extensions/firefox/debug-errors.html +386 -228
  59. package/browser-extensions/firefox/debug-https.html +153 -105
  60. package/browser-extensions/firefox/devtools.html +7 -7
  61. package/browser-extensions/firefox/devtools.js +23 -20
  62. package/browser-extensions/firefox/inspector.js +802 -767
  63. package/browser-extensions/firefox/manifest.json +68 -68
  64. package/browser-extensions/firefox/panel.html +674 -636
  65. package/browser-extensions/firefox/panel.js +722 -712
  66. package/browser-extensions/firefox/popup.html +572 -535
  67. package/browser-extensions/firefox/popup.js +281 -236
  68. package/browser-extensions/firefox/test-gramercy.html +170 -125
  69. package/browser-extensions/firefox/test-imports.html +59 -55
  70. package/browser-extensions/firefox/test-masking.html +231 -140
  71. package/browser-extensions/firefox/test-uri-pattern.html +221 -198
  72. package/dist/tui/App.d.ts +1 -1
  73. package/dist/tui/App.d.ts.map +1 -1
  74. package/dist/tui/App.js +154 -150
  75. package/dist/tui/App.js.map +1 -1
  76. package/dist/tui/components/AIPanel.d.ts.map +1 -1
  77. package/dist/tui/components/AIPanel.js +42 -35
  78. package/dist/tui/components/AIPanel.js.map +1 -1
  79. package/dist/tui/components/CommandInput.d.ts +1 -1
  80. package/dist/tui/components/CommandInput.d.ts.map +1 -1
  81. package/dist/tui/components/CommandInput.js +92 -62
  82. package/dist/tui/components/CommandInput.js.map +1 -1
  83. package/dist/tui/components/GeminiPanel.d.ts.map +1 -1
  84. package/dist/tui/components/GeminiPanel.js +37 -30
  85. package/dist/tui/components/GeminiPanel.js.map +1 -1
  86. package/dist/tui/components/Header.d.ts.map +1 -1
  87. package/dist/tui/components/Header.js +1 -1
  88. package/dist/tui/components/Header.js.map +1 -1
  89. package/dist/tui/components/LogPanel.d.ts +1 -1
  90. package/dist/tui/components/LogPanel.d.ts.map +1 -1
  91. package/dist/tui/components/LogPanel.js +26 -24
  92. package/dist/tui/components/LogPanel.js.map +1 -1
  93. package/dist/tui/components/TabBar.d.ts +2 -2
  94. package/dist/tui/components/TabBar.d.ts.map +1 -1
  95. package/dist/tui/components/TabBar.js +11 -11
  96. package/dist/tui/components/TabBar.js.map +1 -1
  97. package/dist/tui/components/WelcomeScreen.d.ts.map +1 -1
  98. package/dist/tui/components/WelcomeScreen.js +6 -6
  99. package/dist/tui/components/WelcomeScreen.js.map +1 -1
  100. package/dist/tui/index.d.ts.map +1 -1
  101. package/dist/tui/index.js +8 -8
  102. package/dist/tui/index.js.map +1 -1
  103. package/dist/tui/services/AIService.d.ts +2 -2
  104. package/dist/tui/services/AIService.d.ts.map +1 -1
  105. package/dist/tui/services/AIService.js +165 -125
  106. package/dist/tui/services/AIService.js.map +1 -1
  107. package/dist/tui/services/ExtensionService.d.ts +1 -1
  108. package/dist/tui/services/ExtensionService.d.ts.map +1 -1
  109. package/dist/tui/services/ExtensionService.js +33 -26
  110. package/dist/tui/services/ExtensionService.js.map +1 -1
  111. package/dist/tui/services/GeminiService.d.ts +1 -1
  112. package/dist/tui/services/GeminiService.d.ts.map +1 -1
  113. package/dist/tui/services/GeminiService.js +87 -76
  114. package/dist/tui/services/GeminiService.js.map +1 -1
  115. package/dist/tui/services/ServiceManager.d.ts +3 -3
  116. package/dist/tui/services/ServiceManager.d.ts.map +1 -1
  117. package/dist/tui/services/ServiceManager.js +72 -58
  118. package/dist/tui/services/ServiceManager.js.map +1 -1
  119. package/dist/tui/services/SocketService.d.ts.map +1 -1
  120. package/dist/tui/services/SocketService.js +32 -32
  121. package/dist/tui/services/SocketService.js.map +1 -1
  122. package/dist/tui/services/ViteService.d.ts.map +1 -1
  123. package/dist/tui/services/ViteService.js +26 -28
  124. package/dist/tui/services/ViteService.js.map +1 -1
  125. package/dist/tui/services/index.d.ts +6 -6
  126. package/dist/tui/services/index.d.ts.map +1 -1
  127. package/dist/tui/services/index.js +6 -6
  128. package/dist/tui/services/index.js.map +1 -1
  129. package/mcp/gxp-api-server.js +83 -81
  130. package/package.json +109 -93
  131. package/runtime/PortalContainer.vue +258 -234
  132. package/runtime/dev-tools/DevToolsModal.vue +153 -155
  133. package/runtime/dev-tools/LayoutSwitcher.vue +144 -140
  134. package/runtime/dev-tools/MockDataEditor.vue +456 -433
  135. package/runtime/dev-tools/SocketSimulator.vue +379 -371
  136. package/runtime/dev-tools/StoreInspector.vue +517 -455
  137. package/runtime/dev-tools/index.js +5 -5
  138. package/runtime/fallback-layouts/PrivateLayout.vue +2 -2
  139. package/runtime/fallback-layouts/PublicLayout.vue +2 -2
  140. package/runtime/fallback-layouts/SystemLayout.vue +2 -2
  141. package/runtime/gxpStringsPlugin.js +159 -134
  142. package/runtime/index.html +17 -19
  143. package/runtime/main.js +24 -22
  144. package/runtime/mock-api/auth-middleware.js +15 -15
  145. package/runtime/mock-api/image-generator.js +46 -46
  146. package/runtime/mock-api/index.js +55 -55
  147. package/runtime/mock-api/response-generator.js +116 -105
  148. package/runtime/mock-api/route-generator.js +107 -84
  149. package/runtime/mock-api/socket-triggers.js +94 -93
  150. package/runtime/mock-api/spec-loader.js +79 -80
  151. package/runtime/package.json +3 -0
  152. package/runtime/server.js +68 -68
  153. package/runtime/stores/gxpPortalConfigStore.js +204 -186
  154. package/runtime/stores/index.js +2 -2
  155. package/runtime/vite-inspector-plugin.js +858 -707
  156. package/runtime/vite-source-tracker-plugin.js +132 -113
  157. package/runtime/vite.config.js +207 -132
  158. package/scripts/launch-chrome.js +41 -41
  159. package/scripts/pack-chrome.js +38 -39
  160. package/socket-events/AiSessionMessageCreated.json +17 -17
  161. package/socket-events/SocialStreamPostCreated.json +23 -23
  162. package/socket-events/SocialStreamPostVariantCompleted.json +22 -22
  163. package/template/.claude/agents/gxp-developer.md +100 -99
  164. package/template/.claude/settings.json +7 -7
  165. package/template/AGENTS.md +30 -23
  166. package/template/GEMINI.md +20 -20
  167. package/template/README.md +70 -53
  168. package/template/app-manifest.json +2 -4
  169. package/template/configuration.json +10 -10
  170. package/template/default-styling.css +1 -1
  171. package/template/index.html +18 -20
  172. package/template/main.js +24 -22
  173. package/template/src/DemoPage.vue +415 -362
  174. package/template/src/Plugin.vue +76 -85
  175. package/template/src/stores/index.js +3 -3
  176. package/template/src/stores/test-data.json +164 -172
  177. package/template/theme-layouts/AdditionalStyling.css +50 -50
  178. package/template/theme-layouts/PrivateLayout.vue +8 -12
  179. package/template/theme-layouts/PublicLayout.vue +8 -12
  180. package/template/theme-layouts/SystemLayout.vue +8 -12
  181. package/template/vite.extend.js +45 -0
  182. package/template/vite.config.js +0 -409
package/dist/tui/App.js CHANGED
@@ -1,13 +1,13 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useState, useEffect, useCallback } from 'react';
3
- import { Box, useApp, useInput, useStdout } from 'ink';
4
- import WelcomeScreen from './components/WelcomeScreen.js';
5
- import Header from './components/Header.js';
6
- import TabBar from './components/TabBar.js';
7
- import LogPanel from './components/LogPanel.js';
8
- import CommandInput from './components/CommandInput.js';
9
- import AIPanel from './components/AIPanel.js';
10
- import { serviceManager, startVite, stopVite, startSocket, stopSocket, startExtension, stopExtension, listSocketEvents, sendSocketEvent, aiService, getAvailableProviders, getProviderStatus, } from './services/index.js';
2
+ import { useState, useEffect, useCallback } from "react";
3
+ import { Box, useApp, useInput, useStdout } from "ink";
4
+ import WelcomeScreen from "./components/WelcomeScreen.js";
5
+ import Header from "./components/Header.js";
6
+ import TabBar from "./components/TabBar.js";
7
+ import LogPanel from "./components/LogPanel.js";
8
+ import CommandInput from "./components/CommandInput.js";
9
+ import AIPanel from "./components/AIPanel.js";
10
+ import { serviceManager, startVite, stopVite, startSocket, stopSocket, startExtension, stopExtension, listSocketEvents, sendSocketEvent, aiService, getAvailableProviders, getProviderStatus, } from "./services/index.js";
11
11
  export default function App({ autoStart, args }) {
12
12
  const { exit } = useApp();
13
13
  const { stdout } = useStdout();
@@ -24,7 +24,7 @@ export default function App({ autoStart, args }) {
24
24
  // Sync services from ServiceManager
25
25
  const syncServices = useCallback(() => {
26
26
  const managerServices = serviceManager.getAllServices();
27
- setServices(managerServices.map(s => ({
27
+ setServices(managerServices.map((s) => ({
28
28
  id: s.id,
29
29
  name: s.name,
30
30
  status: s.status,
@@ -34,21 +34,21 @@ export default function App({ autoStart, args }) {
34
34
  // Set up ServiceManager event listeners
35
35
  useEffect(() => {
36
36
  const onLog = (id, message) => {
37
- setServices(prev => prev.map(s => s.id === id ? { ...s, logs: [...s.logs, message] } : s));
37
+ setServices((prev) => prev.map((s) => s.id === id ? { ...s, logs: [...s.logs, message] } : s));
38
38
  };
39
39
  const onStatusChange = (id, status) => {
40
- setServices(prev => prev.map(s => s.id === id ? { ...s, status } : s));
40
+ setServices((prev) => prev.map((s) => (s.id === id ? { ...s, status } : s)));
41
41
  };
42
42
  const onLogsCleared = (id) => {
43
- setServices(prev => prev.map(s => s.id === id ? { ...s, logs: [] } : s));
43
+ setServices((prev) => prev.map((s) => (s.id === id ? { ...s, logs: [] } : s)));
44
44
  };
45
- serviceManager.on('log', onLog);
46
- serviceManager.on('statusChange', onStatusChange);
47
- serviceManager.on('logsCleared', onLogsCleared);
45
+ serviceManager.on("log", onLog);
46
+ serviceManager.on("statusChange", onStatusChange);
47
+ serviceManager.on("logsCleared", onLogsCleared);
48
48
  return () => {
49
- serviceManager.off('log', onLog);
50
- serviceManager.off('statusChange', onStatusChange);
51
- serviceManager.off('logsCleared', onLogsCleared);
49
+ serviceManager.off("log", onLog);
50
+ serviceManager.off("statusChange", onStatusChange);
51
+ serviceManager.off("logsCleared", onLogsCleared);
52
52
  };
53
53
  }, []);
54
54
  // Cleanup on exit
@@ -56,32 +56,32 @@ export default function App({ autoStart, args }) {
56
56
  const cleanup = () => {
57
57
  serviceManager.forceStopAll();
58
58
  };
59
- process.on('SIGINT', cleanup);
60
- process.on('SIGTERM', cleanup);
59
+ process.on("SIGINT", cleanup);
60
+ process.on("SIGTERM", cleanup);
61
61
  return () => {
62
62
  cleanup();
63
- process.off('SIGINT', cleanup);
64
- process.off('SIGTERM', cleanup);
63
+ process.off("SIGINT", cleanup);
64
+ process.off("SIGTERM", cleanup);
65
65
  };
66
66
  }, []);
67
67
  // Handle keyboard shortcuts
68
68
  useInput((input, key) => {
69
69
  // Ctrl+C to exit
70
- if (key.ctrl && input === 'c') {
70
+ if (key.ctrl && input === "c") {
71
71
  serviceManager.forceStopAll();
72
72
  exit();
73
73
  return;
74
74
  }
75
75
  // Ctrl+L to clear current log
76
- if (key.ctrl && input === 'l') {
76
+ if (key.ctrl && input === "l") {
77
77
  if (services[activeTab]) {
78
78
  serviceManager.clearLogs(services[activeTab].id);
79
79
  }
80
80
  return;
81
81
  }
82
82
  // Ctrl+K to stop current service
83
- if (key.ctrl && input === 'k') {
84
- if (services[activeTab] && services[activeTab].id !== 'system') {
83
+ if (key.ctrl && input === "k") {
84
+ if (services[activeTab] && services[activeTab].id !== "system") {
85
85
  stopService(services[activeTab].id);
86
86
  }
87
87
  return;
@@ -108,7 +108,7 @@ export default function App({ autoStart, args }) {
108
108
  useEffect(() => {
109
109
  if (autoStart?.length) {
110
110
  setTimeout(() => {
111
- autoStart.forEach(cmd => {
111
+ autoStart.forEach((cmd) => {
112
112
  handleCommand(`/${cmd}`);
113
113
  });
114
114
  }, 100);
@@ -116,62 +116,62 @@ export default function App({ autoStart, args }) {
116
116
  }, []);
117
117
  const handleCommand = (input) => {
118
118
  const trimmed = input.trim();
119
- if (!trimmed.startsWith('/'))
119
+ if (!trimmed.startsWith("/"))
120
120
  return;
121
- const parts = trimmed.slice(1).split(' ');
121
+ const parts = trimmed.slice(1).split(" ");
122
122
  const command = parts[0];
123
123
  const cmdArgs = parts.slice(1);
124
124
  switch (command) {
125
- case 'help':
125
+ case "help":
126
126
  addSystemLog(getHelpText());
127
127
  break;
128
- case 'dev':
128
+ case "dev":
129
129
  startDevServer(cmdArgs);
130
130
  break;
131
- case 'socket':
132
- if (cmdArgs[0] === 'send') {
131
+ case "socket":
132
+ if (cmdArgs[0] === "send") {
133
133
  handleSocketSend(cmdArgs.slice(1));
134
134
  }
135
- else if (cmdArgs[0] === 'list') {
135
+ else if (cmdArgs[0] === "list") {
136
136
  handleSocketList();
137
137
  }
138
138
  else {
139
- const socketWithMock = cmdArgs.includes('--with-mock') || args?.withMock === true;
139
+ const socketWithMock = cmdArgs.includes("--with-mock") || args?.withMock === true;
140
140
  startSocketServer(socketWithMock);
141
141
  }
142
142
  break;
143
- case 'mock':
143
+ case "mock":
144
144
  // Shorthand for /socket --with-mock
145
145
  startSocketServer(true);
146
146
  break;
147
- case 'ext':
148
- const browser = cmdArgs[0] || 'chrome';
147
+ case "ext":
148
+ const browser = cmdArgs[0] || "chrome";
149
149
  launchExtension(browser);
150
150
  break;
151
- case 'stop':
151
+ case "stop":
152
152
  stopService(cmdArgs[0]);
153
153
  break;
154
- case 'restart':
154
+ case "restart":
155
155
  restartService(cmdArgs[0]);
156
156
  break;
157
- case 'clear':
157
+ case "clear":
158
158
  if (services[activeTab]) {
159
159
  serviceManager.clearLogs(services[activeTab].id);
160
160
  }
161
161
  break;
162
- case 'quit':
163
- case 'exit':
162
+ case "quit":
163
+ case "exit":
164
164
  serviceManager.forceStopAll();
165
165
  exit();
166
166
  break;
167
- case 'ai':
167
+ case "ai":
168
168
  handleAICommand(cmdArgs);
169
169
  break;
170
- case 'extract-config':
171
- case 'extract':
170
+ case "extract-config":
171
+ case "extract":
172
172
  handleExtractConfig(cmdArgs);
173
173
  break;
174
- case 'add-dependency':
174
+ case "add-dependency":
175
175
  handleAddDependency(cmdArgs);
176
176
  break;
177
177
  default:
@@ -179,41 +179,41 @@ export default function App({ autoStart, args }) {
179
179
  }
180
180
  };
181
181
  const startDevServer = (cmdArgs) => {
182
- const noHttps = cmdArgs.includes('--no-https') || args?.noHttps === true;
183
- const noSocket = cmdArgs.includes('--no-socket') || args?.noSocket === true;
184
- const withMock = cmdArgs.includes('--with-mock') || args?.withMock === true;
185
- const withFirefox = cmdArgs.includes('--firefox') || args?.firefox === true;
186
- const withChrome = cmdArgs.includes('--chrome') || args?.chrome === true;
182
+ const noHttps = cmdArgs.includes("--no-https") || args?.noHttps === true;
183
+ const noSocket = cmdArgs.includes("--no-socket") || args?.noSocket === true;
184
+ const withMock = cmdArgs.includes("--with-mock") || args?.withMock === true;
185
+ const withFirefox = cmdArgs.includes("--firefox") || args?.firefox === true;
186
+ const withChrome = cmdArgs.includes("--chrome") || args?.chrome === true;
187
187
  // Determine port from env or default
188
188
  const port = process.env.NODE_PORT || 3060;
189
189
  const useHttps = !noHttps;
190
190
  // Socket server starts by default unless --no-socket is passed
191
191
  const shouldStartSocket = !noSocket;
192
192
  // Check if already running
193
- if (serviceManager.isRunning('vite')) {
194
- addSystemLog('Vite dev server is already running.');
193
+ if (serviceManager.isRunning("vite")) {
194
+ addSystemLog("Vite dev server is already running.");
195
195
  // Switch to vite tab
196
- const viteIdx = services.findIndex(s => s.id === 'vite');
196
+ const viteIdx = services.findIndex((s) => s.id === "vite");
197
197
  if (viteIdx >= 0)
198
198
  setActiveTab(viteIdx);
199
199
  return;
200
200
  }
201
201
  startVite({ noHttps });
202
202
  // Also start socket server based on flags/env (with mock if requested)
203
- if (shouldStartSocket && !serviceManager.isRunning('socket')) {
203
+ if (shouldStartSocket && !serviceManager.isRunning("socket")) {
204
204
  startSocket({ withMock });
205
205
  }
206
206
  // Launch browser extensions if requested (pass URL options)
207
- if (withFirefox && !serviceManager.isRunning('ext-firefox')) {
208
- startExtension({ browser: 'firefox', useHttps, port });
207
+ if (withFirefox && !serviceManager.isRunning("ext-firefox")) {
208
+ startExtension({ browser: "firefox", useHttps, port });
209
209
  }
210
- if (withChrome && !serviceManager.isRunning('ext-chrome')) {
211
- startExtension({ browser: 'chrome', useHttps, port });
210
+ if (withChrome && !serviceManager.isRunning("ext-chrome")) {
211
+ startExtension({ browser: "chrome", useHttps, port });
212
212
  }
213
213
  // Sync and switch to the new vite tab
214
214
  const updatedServices = serviceManager.getAllServices();
215
- const viteIdx = updatedServices.findIndex(s => s.id === 'vite');
216
- setServices(updatedServices.map(s => ({
215
+ const viteIdx = updatedServices.findIndex((s) => s.id === "vite");
216
+ setServices(updatedServices.map((s) => ({
217
217
  id: s.id,
218
218
  name: s.name,
219
219
  status: s.status,
@@ -222,9 +222,9 @@ export default function App({ autoStart, args }) {
222
222
  setActiveTab(viteIdx >= 0 ? viteIdx : Math.max(0, updatedServices.length - 1));
223
223
  };
224
224
  const startSocketServer = (withMock = false) => {
225
- if (serviceManager.isRunning('socket')) {
226
- addSystemLog('Socket.IO server is already running.');
227
- const socketIdx = services.findIndex(s => s.id === 'socket');
225
+ if (serviceManager.isRunning("socket")) {
226
+ addSystemLog("Socket.IO server is already running.");
227
+ const socketIdx = services.findIndex((s) => s.id === "socket");
228
228
  if (socketIdx >= 0)
229
229
  setActiveTab(socketIdx);
230
230
  return;
@@ -232,8 +232,8 @@ export default function App({ autoStart, args }) {
232
232
  startSocket({ withMock });
233
233
  // Sync and switch to the new socket tab
234
234
  const updatedServices = serviceManager.getAllServices();
235
- const socketIdx = updatedServices.findIndex(s => s.id === 'socket');
236
- setServices(updatedServices.map(s => ({
235
+ const socketIdx = updatedServices.findIndex((s) => s.id === "socket");
236
+ setServices(updatedServices.map((s) => ({
237
237
  id: s.id,
238
238
  name: s.name,
239
239
  status: s.status,
@@ -243,14 +243,14 @@ export default function App({ autoStart, args }) {
243
243
  };
244
244
  const launchExtension = (browser) => {
245
245
  const browserType = browser.toLowerCase();
246
- if (browserType !== 'chrome' && browserType !== 'firefox') {
246
+ if (browserType !== "chrome" && browserType !== "firefox") {
247
247
  addSystemLog(`Invalid browser: ${browser}. Use 'chrome' or 'firefox'.`);
248
248
  return;
249
249
  }
250
250
  const serviceId = `ext-${browserType}`;
251
251
  if (serviceManager.isRunning(serviceId)) {
252
252
  addSystemLog(`${browser} extension is already running.`);
253
- const extIdx = services.findIndex(s => s.id === serviceId);
253
+ const extIdx = services.findIndex((s) => s.id === serviceId);
254
254
  if (extIdx >= 0)
255
255
  setActiveTab(extIdx);
256
256
  return;
@@ -258,8 +258,8 @@ export default function App({ autoStart, args }) {
258
258
  startExtension({ browser: browserType });
259
259
  // Sync and switch to the new extension tab
260
260
  const updatedServices = serviceManager.getAllServices();
261
- const extIdx = updatedServices.findIndex(s => s.id === serviceId);
262
- setServices(updatedServices.map(s => ({
261
+ const extIdx = updatedServices.findIndex((s) => s.id === serviceId);
262
+ setServices(updatedServices.map((s) => ({
263
263
  id: s.id,
264
264
  name: s.name,
265
265
  status: s.status,
@@ -270,17 +270,17 @@ export default function App({ autoStart, args }) {
270
270
  const stopService = (serviceId) => {
271
271
  const targetId = serviceId || services[activeTab]?.id;
272
272
  if (!targetId) {
273
- addSystemLog('No service specified. Usage: /stop <service-id>');
273
+ addSystemLog("No service specified. Usage: /stop <service-id>");
274
274
  return;
275
275
  }
276
- if (targetId === 'vite') {
276
+ if (targetId === "vite") {
277
277
  stopVite();
278
278
  }
279
- else if (targetId === 'socket') {
279
+ else if (targetId === "socket") {
280
280
  stopSocket();
281
281
  }
282
- else if (targetId.startsWith('ext-')) {
283
- const browser = targetId.replace('ext-', '');
282
+ else if (targetId.startsWith("ext-")) {
283
+ const browser = targetId.replace("ext-", "");
284
284
  stopExtension(browser);
285
285
  }
286
286
  else {
@@ -291,11 +291,11 @@ export default function App({ autoStart, args }) {
291
291
  const restartService = (serviceId) => {
292
292
  const targetId = serviceId || services[activeTab]?.id;
293
293
  if (!targetId) {
294
- addSystemLog('No service to restart. Usage: /restart [service-id]');
294
+ addSystemLog("No service to restart. Usage: /restart [service-id]");
295
295
  return;
296
296
  }
297
- if (targetId === 'system') {
298
- addSystemLog('Cannot restart the system service.');
297
+ if (targetId === "system") {
298
+ addSystemLog("Cannot restart the system service.");
299
299
  return;
300
300
  }
301
301
  const success = serviceManager.restart(targetId);
@@ -307,7 +307,7 @@ export default function App({ autoStart, args }) {
307
307
  const handleAICommand = async (cmdArgs) => {
308
308
  const subCommand = cmdArgs[0];
309
309
  switch (subCommand) {
310
- case 'model':
310
+ case "model":
311
311
  // Set or show current AI provider
312
312
  const providerArg = cmdArgs[1];
313
313
  if (providerArg) {
@@ -323,27 +323,29 @@ export default function App({ autoStart, args }) {
323
323
  // Show current provider and available providers
324
324
  const current = aiService.getProviderInfo();
325
325
  const providers = getAvailableProviders();
326
- let message = `Current AI provider: ${current ? getProviderStatus(current) : 'None'}\n\nAvailable providers:`;
326
+ let message = `Current AI provider: ${current ? getProviderStatus(current) : "None"}\n\nAvailable providers:`;
327
327
  for (const p of providers) {
328
- const status = p.available ? getProviderStatus(p) : `${p.name} (not available)`;
329
- const marker = p.id === current?.id ? ' ← current' : '';
328
+ const status = p.available
329
+ ? getProviderStatus(p)
330
+ : `${p.name} (not available)`;
331
+ const marker = p.id === current?.id ? " ← current" : "";
330
332
  message += `\n ${p.id}: ${status}${marker}`;
331
333
  if (!p.available && p.reason) {
332
334
  message += `\n ${p.reason}`;
333
335
  }
334
336
  }
335
- message += '\n\nUsage: /ai model <claude|codex|gemini>';
337
+ message += "\n\nUsage: /ai model <claude|codex|gemini>";
336
338
  addSystemLog(message);
337
339
  }
338
340
  break;
339
- case 'status':
341
+ case "status":
340
342
  // Show detailed status of all providers
341
343
  const providers = getAvailableProviders();
342
344
  const currentProvider = aiService.getProvider();
343
- let statusMsg = 'AI Provider Status:\n';
345
+ let statusMsg = "AI Provider Status:\n";
344
346
  for (const p of providers) {
345
- const icon = p.available ? '' : '';
346
- const current = p.id === currentProvider ? ' (current)' : '';
347
+ const icon = p.available ? "" : "";
348
+ const current = p.id === currentProvider ? " (current)" : "";
347
349
  statusMsg += `\n ${icon} ${getProviderStatus(p)}${current}`;
348
350
  if (!p.available && p.reason) {
349
351
  statusMsg += `\n ${p.reason}`;
@@ -351,18 +353,18 @@ export default function App({ autoStart, args }) {
351
353
  }
352
354
  addSystemLog(statusMsg);
353
355
  break;
354
- case 'ask':
356
+ case "ask":
355
357
  // Quick question without opening panel
356
- const question = cmdArgs.slice(1).join(' ');
358
+ const question = cmdArgs.slice(1).join(" ");
357
359
  if (!question) {
358
- addSystemLog('Usage: /ai ask <your question>');
360
+ addSystemLog("Usage: /ai ask <your question>");
359
361
  return;
360
362
  }
361
363
  if (!aiService.isAvailable()) {
362
364
  addSystemLog(`Current provider (${aiService.getProvider()}) is not available. Run /ai model to select a different provider.`);
363
365
  return;
364
366
  }
365
- const providerName = aiService.getProviderInfo()?.name || 'AI';
367
+ const providerName = aiService.getProviderInfo()?.name || "AI";
366
368
  addSystemLog(`Asking ${providerName}: ${question}`);
367
369
  try {
368
370
  aiService.loadProjectContext(process.cwd());
@@ -370,14 +372,14 @@ export default function App({ autoStart, args }) {
370
372
  addSystemLog(`${providerName}: ${response}`);
371
373
  }
372
374
  catch (err) {
373
- addSystemLog(`Error: ${err instanceof Error ? err.message : 'Unknown error'}`);
375
+ addSystemLog(`Error: ${err instanceof Error ? err.message : "Unknown error"}`);
374
376
  }
375
377
  break;
376
- case 'clear':
378
+ case "clear":
377
379
  aiService.clearConversation();
378
- addSystemLog('Conversation history cleared.');
380
+ addSystemLog("Conversation history cleared.");
379
381
  break;
380
- case 'chat':
382
+ case "chat":
381
383
  default:
382
384
  // Open AI chat panel
383
385
  if (!aiService.isAvailable()) {
@@ -389,18 +391,18 @@ export default function App({ autoStart, args }) {
389
391
  };
390
392
  const addSystemLog = (message) => {
391
393
  // Use functional update to properly handle rapid successive calls
392
- setServices(prev => {
393
- const existingSystem = prev.find(s => s.id === 'system');
394
+ setServices((prev) => {
395
+ const existingSystem = prev.find((s) => s.id === "system");
394
396
  if (existingSystem) {
395
397
  // Add message to existing system service
396
- return prev.map(s => s.id === 'system' ? { ...s, logs: [...s.logs, message] } : s);
398
+ return prev.map((s) => s.id === "system" ? { ...s, logs: [...s.logs, message] } : s);
397
399
  }
398
400
  else {
399
401
  // Create new system service with the message
400
402
  const newService = {
401
- id: 'system',
402
- name: 'System',
403
- status: 'running',
403
+ id: "system",
404
+ name: "System",
405
+ status: "running",
404
406
  logs: [message],
405
407
  };
406
408
  return [...prev, newService];
@@ -408,8 +410,8 @@ export default function App({ autoStart, args }) {
408
410
  });
409
411
  // Switch to system tab
410
412
  setTimeout(() => {
411
- setServices(current => {
412
- const sysIdx = current.findIndex(s => s.id === 'system');
413
+ setServices((current) => {
414
+ const sysIdx = current.findIndex((s) => s.id === "system");
413
415
  if (sysIdx >= 0)
414
416
  setActiveTab(sysIdx);
415
417
  return current; // Don't modify, just read
@@ -418,7 +420,7 @@ export default function App({ autoStart, args }) {
418
420
  };
419
421
  const handleSocketSend = async (eventArgs) => {
420
422
  if (!eventArgs.length) {
421
- addSystemLog('Usage: /socket send <event-name> [identifier]');
423
+ addSystemLog("Usage: /socket send <event-name> [identifier]");
422
424
  return;
423
425
  }
424
426
  const eventName = eventArgs[0];
@@ -435,44 +437,44 @@ export default function App({ autoStart, args }) {
435
437
  const handleSocketList = () => {
436
438
  const events = listSocketEvents();
437
439
  if (events.length === 0) {
438
- addSystemLog('No socket events found. Check your socket-events directory.');
440
+ addSystemLog("No socket events found. Check your socket-events directory.");
439
441
  return;
440
442
  }
441
- let message = 'Available socket events:\n';
443
+ let message = "Available socket events:\n";
442
444
  for (const event of events) {
443
445
  message += `\n ${event.name}\n`;
444
446
  message += ` Event: ${event.event}\n`;
445
447
  message += ` Channel: ${event.channel}`;
446
448
  }
447
- message += '\n\nUsage: /socket send <event-name> [identifier]';
449
+ message += "\n\nUsage: /socket send <event-name> [identifier]";
448
450
  addSystemLog(message);
449
451
  };
450
452
  const handleExtractConfig = async (cmdArgs) => {
451
- const dryRun = cmdArgs.includes('--dry-run') || cmdArgs.includes('-d');
452
- const overwrite = cmdArgs.includes('--overwrite') || cmdArgs.includes('-o');
453
- addSystemLog('Scanning source files for GxP configuration...');
453
+ const dryRun = cmdArgs.includes("--dry-run") || cmdArgs.includes("-d");
454
+ const overwrite = cmdArgs.includes("--overwrite") || cmdArgs.includes("-o");
455
+ addSystemLog("Scanning source files for GxP configuration...");
454
456
  try {
455
457
  // Use dynamic imports for ES modules
456
- const path = await import('path');
457
- const fs = await import('fs');
458
- const url = await import('url');
459
- const { createRequire } = await import('module');
458
+ const path = await import("path");
459
+ const fs = await import("fs");
460
+ const url = await import("url");
461
+ const { createRequire } = await import("module");
460
462
  // Get the directory of this file and resolve to the utils directory
461
463
  const __filename = url.fileURLToPath(import.meta.url);
462
464
  const __dirname = path.dirname(__filename);
463
465
  // The compiled JS is in dist/tui/, utils is in bin/lib/utils/
464
466
  // From dist/tui/ we need to go up to package root, then into bin/lib/utils/
465
- const packageRoot = path.resolve(__dirname, '..', '..');
466
- const utilsPath = path.join(packageRoot, 'bin', 'lib', 'utils', 'extract-config.js');
467
+ const packageRoot = path.resolve(__dirname, "..", "..");
468
+ const utilsPath = path.join(packageRoot, "bin", "lib", "utils", "extract-config.js");
467
469
  // Create a require function to load CommonJS modules
468
470
  const requireCjs = createRequire(import.meta.url);
469
471
  const extractConfigUtils = requireCjs(utilsPath);
470
472
  const projectPath = process.cwd();
471
- const srcDir = path.join(projectPath, 'src');
472
- const manifestPath = path.join(projectPath, 'app-manifest.json');
473
+ const srcDir = path.join(projectPath, "src");
474
+ const manifestPath = path.join(projectPath, "app-manifest.json");
473
475
  // Check if src directory exists
474
476
  if (!fs.existsSync(srcDir)) {
475
- addSystemLog('Source directory not found: src/');
477
+ addSystemLog("Source directory not found: src/");
476
478
  return;
477
479
  }
478
480
  // Extract configuration
@@ -486,60 +488,60 @@ export default function App({ autoStart, args }) {
486
488
  Object.keys(extractedConfig.triggerState).length +
487
489
  extractedConfig.dependencies.length;
488
490
  if (totalItems === 0) {
489
- addSystemLog('No GxP configuration found in source files.');
491
+ addSystemLog("No GxP configuration found in source files.");
490
492
  return;
491
493
  }
492
494
  if (dryRun) {
493
- addSystemLog('Dry run mode - no changes made.');
494
- addSystemLog('Run /extract-config without --dry-run to apply changes.');
495
+ addSystemLog("Dry run mode - no changes made.");
496
+ addSystemLog("Run /extract-config without --dry-run to apply changes.");
495
497
  return;
496
498
  }
497
499
  // Load or create manifest
498
500
  let existingManifest = {};
499
501
  if (fs.existsSync(manifestPath)) {
500
502
  try {
501
- existingManifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
503
+ existingManifest = JSON.parse(fs.readFileSync(manifestPath, "utf-8"));
502
504
  }
503
505
  catch {
504
- addSystemLog('Could not parse existing manifest, creating new one.');
506
+ addSystemLog("Could not parse existing manifest, creating new one.");
505
507
  existingManifest = getDefaultManifest();
506
508
  }
507
509
  }
508
510
  else {
509
- addSystemLog('Creating new app-manifest.json');
511
+ addSystemLog("Creating new app-manifest.json");
510
512
  existingManifest = getDefaultManifest();
511
513
  }
512
514
  // Merge and write
513
515
  const mergedManifest = extractConfigUtils.mergeConfig(existingManifest, extractedConfig, { overwrite });
514
- fs.writeFileSync(manifestPath, JSON.stringify(mergedManifest, null, '\t'));
515
- addSystemLog('Updated app-manifest.json');
516
+ fs.writeFileSync(manifestPath, JSON.stringify(mergedManifest, null, "\t"));
517
+ addSystemLog("Updated app-manifest.json");
516
518
  }
517
519
  catch (err) {
518
- addSystemLog(`Error: ${err instanceof Error ? err.message : 'Unknown error'}`);
520
+ addSystemLog(`Error: ${err instanceof Error ? err.message : "Unknown error"}`);
519
521
  }
520
522
  };
521
523
  const handleAddDependency = async (cmdArgs) => {
522
524
  // The add-dependency wizard requires interactive terminal access (raw stdin)
523
525
  // which conflicts with Ink's own stdin handling. Run it in a separate terminal.
524
- const envFlag = cmdArgs.find(a => a === '-e' || a === '--env');
525
- const envVal = envFlag ? cmdArgs[cmdArgs.indexOf(envFlag) + 1] : '';
526
- const cmd = `gxdev add-dependency${envVal ? ` -e ${envVal}` : ''}`;
527
- addSystemLog('');
528
- addSystemLog('The Add Dependency wizard requires interactive terminal access.');
529
- addSystemLog('Run this command in a separate terminal:');
530
- addSystemLog('');
526
+ const envFlag = cmdArgs.find((a) => a === "-e" || a === "--env");
527
+ const envVal = envFlag ? cmdArgs[cmdArgs.indexOf(envFlag) + 1] : "";
528
+ const cmd = `gxdev add-dependency${envVal ? ` -e ${envVal}` : ""}`;
529
+ addSystemLog("");
530
+ addSystemLog("The Add Dependency wizard requires interactive terminal access.");
531
+ addSystemLog("Run this command in a separate terminal:");
532
+ addSystemLog("");
531
533
  addSystemLog(` \x1B[36m${cmd}\x1B[0m`);
532
- addSystemLog('');
534
+ addSystemLog("");
533
535
  };
534
536
  const getDefaultManifest = () => ({
535
- name: 'GxToolkit',
536
- version: '1.0.0',
537
- description: 'GxToolkit Plugin',
537
+ name: "GxToolkit",
538
+ version: "1.0.0",
539
+ description: "GxToolkit Plugin",
538
540
  manifest_version: 3,
539
- asset_dir: '/src/assets/',
540
- configurationFile: 'configuration.json',
541
- appInstructionsFile: 'app-instructions.md',
542
- defaultStylingFile: 'default-styling.css',
541
+ asset_dir: "/src/assets/",
542
+ configurationFile: "configuration.json",
543
+ appInstructionsFile: "app-instructions.md",
544
+ defaultStylingFile: "default-styling.css",
543
545
  settings: {},
544
546
  strings: { default: {} },
545
547
  assets: {},
@@ -615,10 +617,12 @@ Keyboard shortcuts:
615
617
  const fixedRows = 10;
616
618
  const availableForLog = terminalHeight - fixedRows - suggestionRows;
617
619
  const logPanelHeight = Math.max(3, availableForLog); // Minimum 3 rows for log panel
618
- return (_jsxs(Box, { flexDirection: "column", height: terminalHeight, children: [_jsx(Header, { projectName: process.cwd().split('/').pop() || 'gxdev' }), services.length > 0 && (_jsx(TabBar, { services: services, activeTab: activeTab, onTabChange: setActiveTab })), _jsx(Box, { height: logPanelHeight, flexDirection: "column", borderStyle: "single", borderColor: "gray", overflow: "hidden", children: currentService ? (_jsx(LogPanel, { logs: currentService.logs, maxHeight: logPanelHeight })) : (_jsx(WelcomeScreen, {})) }), _jsx(CommandInput, { onSubmit: handleCommand, activeService: currentService ? {
619
- id: currentService.id,
620
- name: currentService.name,
621
- status: currentService.status
622
- } : null, onSuggestionsChange: handleSuggestionsChange })] }));
620
+ return (_jsxs(Box, { flexDirection: "column", height: terminalHeight, children: [_jsx(Header, { projectName: process.cwd().split("/").pop() || "gxdev" }), services.length > 0 && (_jsx(TabBar, { services: services, activeTab: activeTab, onTabChange: setActiveTab })), _jsx(Box, { height: logPanelHeight, flexDirection: "column", borderStyle: "single", borderColor: "gray", overflow: "hidden", children: currentService ? (_jsx(LogPanel, { logs: currentService.logs, maxHeight: logPanelHeight })) : (_jsx(WelcomeScreen, {})) }), _jsx(CommandInput, { onSubmit: handleCommand, activeService: currentService
621
+ ? {
622
+ id: currentService.id,
623
+ name: currentService.name,
624
+ status: currentService.status,
625
+ }
626
+ : null, onSuggestionsChange: handleSuggestionsChange })] }));
623
627
  }
624
628
  //# sourceMappingURL=App.js.map