@gxp-dev/tools 2.0.5 → 2.0.6

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 (169) hide show
  1. package/dist/tui/App.d.ts +13 -0
  2. package/dist/tui/App.d.ts.map +1 -0
  3. package/dist/tui/App.js +480 -0
  4. package/dist/tui/App.js.map +1 -0
  5. package/dist/tui/components/CommandInput.d.ts +13 -0
  6. package/dist/tui/components/CommandInput.d.ts.map +1 -0
  7. package/dist/tui/components/CommandInput.js +180 -0
  8. package/dist/tui/components/CommandInput.js.map +1 -0
  9. package/dist/tui/components/GeminiPanel.d.ts +7 -0
  10. package/dist/tui/components/GeminiPanel.d.ts.map +1 -0
  11. package/dist/tui/components/GeminiPanel.js +99 -0
  12. package/dist/tui/components/GeminiPanel.js.map +1 -0
  13. package/dist/tui/components/Header.d.ts +6 -0
  14. package/dist/tui/components/Header.d.ts.map +1 -0
  15. package/dist/tui/components/Header.js +6 -0
  16. package/dist/tui/components/Header.js.map +1 -0
  17. package/dist/tui/components/LogPanel.d.ts +8 -0
  18. package/dist/tui/components/LogPanel.d.ts.map +1 -0
  19. package/dist/tui/components/LogPanel.js +89 -0
  20. package/dist/tui/components/LogPanel.js.map +1 -0
  21. package/dist/tui/components/TabBar.d.ts +9 -0
  22. package/dist/tui/components/TabBar.d.ts.map +1 -0
  23. package/dist/tui/components/TabBar.js +23 -0
  24. package/dist/tui/components/TabBar.js.map +1 -0
  25. package/dist/tui/components/WelcomeScreen.d.ts +2 -0
  26. package/dist/tui/components/WelcomeScreen.d.ts.map +1 -0
  27. package/dist/tui/components/WelcomeScreen.js +14 -0
  28. package/dist/tui/components/WelcomeScreen.js.map +1 -0
  29. package/dist/tui/index.d.ts +8 -0
  30. package/dist/tui/index.d.ts.map +1 -0
  31. package/dist/tui/index.js +47 -0
  32. package/dist/tui/index.js.map +1 -0
  33. package/dist/tui/package.json +1 -0
  34. package/dist/tui/services/ExtensionService.d.ts +11 -0
  35. package/dist/tui/services/ExtensionService.d.ts.map +1 -0
  36. package/dist/tui/services/ExtensionService.js +101 -0
  37. package/dist/tui/services/ExtensionService.js.map +1 -0
  38. package/dist/tui/services/GeminiService.d.ts +40 -0
  39. package/dist/tui/services/GeminiService.d.ts.map +1 -0
  40. package/dist/tui/services/GeminiService.js +327 -0
  41. package/dist/tui/services/GeminiService.js.map +1 -0
  42. package/dist/tui/services/ServiceManager.d.ts +40 -0
  43. package/dist/tui/services/ServiceManager.d.ts.map +1 -0
  44. package/dist/tui/services/ServiceManager.js +283 -0
  45. package/dist/tui/services/ServiceManager.js.map +1 -0
  46. package/dist/tui/services/SocketService.d.ts +19 -0
  47. package/dist/tui/services/SocketService.d.ts.map +1 -0
  48. package/dist/tui/services/SocketService.js +163 -0
  49. package/dist/tui/services/SocketService.js.map +1 -0
  50. package/dist/tui/services/ViteService.d.ts +8 -0
  51. package/dist/tui/services/ViteService.d.ts.map +1 -0
  52. package/dist/tui/services/ViteService.js +89 -0
  53. package/dist/tui/services/ViteService.js.map +1 -0
  54. package/dist/tui/services/index.d.ts +6 -0
  55. package/dist/tui/services/index.d.ts.map +1 -0
  56. package/dist/tui/services/index.js +6 -0
  57. package/dist/tui/services/index.js.map +1 -0
  58. package/package.json +6 -1
  59. package/.github/workflows/npm-publish.yml +0 -48
  60. package/CLAUDE.md +0 -400
  61. package/REFACTOR_PLAN.md +0 -194
  62. package/browser-extensions/README.md +0 -1
  63. package/browser-extensions/chrome/background.js +0 -857
  64. package/browser-extensions/chrome/content.js +0 -51
  65. package/browser-extensions/chrome/devtools.html +0 -9
  66. package/browser-extensions/chrome/devtools.js +0 -23
  67. package/browser-extensions/chrome/icons/gx_off_128.png +0 -0
  68. package/browser-extensions/chrome/icons/gx_off_16.png +0 -0
  69. package/browser-extensions/chrome/icons/gx_off_32.png +0 -0
  70. package/browser-extensions/chrome/icons/gx_off_64.png +0 -0
  71. package/browser-extensions/chrome/icons/gx_on_128.png +0 -0
  72. package/browser-extensions/chrome/icons/gx_on_16.png +0 -0
  73. package/browser-extensions/chrome/icons/gx_on_32.png +0 -0
  74. package/browser-extensions/chrome/icons/gx_on_64.png +0 -0
  75. package/browser-extensions/chrome/inspector.js +0 -1087
  76. package/browser-extensions/chrome/manifest.json +0 -70
  77. package/browser-extensions/chrome/panel.html +0 -638
  78. package/browser-extensions/chrome/panel.js +0 -862
  79. package/browser-extensions/chrome/popup.html +0 -399
  80. package/browser-extensions/chrome/popup.js +0 -515
  81. package/browser-extensions/chrome/rules.json +0 -1
  82. package/browser-extensions/chrome/test-chrome.html +0 -145
  83. package/browser-extensions/chrome/test-mixed-content.html +0 -190
  84. package/browser-extensions/chrome/test-uri-pattern.html +0 -199
  85. package/browser-extensions/firefox/README.md +0 -134
  86. package/browser-extensions/firefox/background.js +0 -804
  87. package/browser-extensions/firefox/content.js +0 -120
  88. package/browser-extensions/firefox/debug-errors.html +0 -229
  89. package/browser-extensions/firefox/debug-https.html +0 -113
  90. package/browser-extensions/firefox/devtools.html +0 -9
  91. package/browser-extensions/firefox/devtools.js +0 -24
  92. package/browser-extensions/firefox/icons/gx_off_128.png +0 -0
  93. package/browser-extensions/firefox/icons/gx_off_16.png +0 -0
  94. package/browser-extensions/firefox/icons/gx_off_32.png +0 -0
  95. package/browser-extensions/firefox/icons/gx_off_64.png +0 -0
  96. package/browser-extensions/firefox/icons/gx_on_128.png +0 -0
  97. package/browser-extensions/firefox/icons/gx_on_16.png +0 -0
  98. package/browser-extensions/firefox/icons/gx_on_32.png +0 -0
  99. package/browser-extensions/firefox/icons/gx_on_64.png +0 -0
  100. package/browser-extensions/firefox/inspector.js +0 -1087
  101. package/browser-extensions/firefox/manifest.json +0 -67
  102. package/browser-extensions/firefox/panel.html +0 -638
  103. package/browser-extensions/firefox/panel.js +0 -862
  104. package/browser-extensions/firefox/popup.html +0 -525
  105. package/browser-extensions/firefox/popup.js +0 -536
  106. package/browser-extensions/firefox/test-gramercy.html +0 -126
  107. package/browser-extensions/firefox/test-imports.html +0 -58
  108. package/browser-extensions/firefox/test-masking.html +0 -147
  109. package/browser-extensions/firefox/test-uri-pattern.html +0 -199
  110. package/docs/DOCUSAURUS_IMPORT.md +0 -378
  111. package/docs/_category_.json +0 -8
  112. package/docs/app-manifest.md +0 -272
  113. package/docs/building-for-platform.md +0 -315
  114. package/docs/dev-tools.md +0 -291
  115. package/docs/getting-started.md +0 -180
  116. package/docs/gxp-store.md +0 -305
  117. package/docs/index.md +0 -44
  118. package/runtime/PortalContainer.vue +0 -326
  119. package/runtime/dev-tools/DevToolsModal.vue +0 -217
  120. package/runtime/dev-tools/LayoutSwitcher.vue +0 -221
  121. package/runtime/dev-tools/MockDataEditor.vue +0 -621
  122. package/runtime/dev-tools/SocketSimulator.vue +0 -562
  123. package/runtime/dev-tools/StoreInspector.vue +0 -644
  124. package/runtime/dev-tools/index.js +0 -6
  125. package/runtime/gxpStringsPlugin.js +0 -428
  126. package/runtime/index.html +0 -22
  127. package/runtime/main.js +0 -32
  128. package/runtime/mock-api/auth-middleware.js +0 -97
  129. package/runtime/mock-api/image-generator.js +0 -221
  130. package/runtime/mock-api/index.js +0 -197
  131. package/runtime/mock-api/response-generator.js +0 -394
  132. package/runtime/mock-api/route-generator.js +0 -323
  133. package/runtime/mock-api/socket-triggers.js +0 -371
  134. package/runtime/mock-api/spec-loader.js +0 -300
  135. package/runtime/server.js +0 -180
  136. package/runtime/stores/gxpPortalConfigStore.js +0 -554
  137. package/runtime/stores/index.js +0 -6
  138. package/runtime/vite-inspector-plugin.js +0 -749
  139. package/runtime/vite-source-tracker-plugin.js +0 -232
  140. package/runtime/vite.config.js +0 -402
  141. package/scripts/launch-chrome.js +0 -90
  142. package/scripts/pack-chrome.js +0 -91
  143. package/socket-events/AiSessionMessageCreated.json +0 -18
  144. package/socket-events/SocialStreamPostCreated.json +0 -24
  145. package/socket-events/SocialStreamPostVariantCompleted.json +0 -23
  146. package/template/README.md +0 -332
  147. package/template/app-manifest.json +0 -32
  148. package/template/dev-assets/images/avatar-placeholder.png +0 -0
  149. package/template/dev-assets/images/background-placeholder.jpg +0 -0
  150. package/template/dev-assets/images/banner-placeholder.jpg +0 -0
  151. package/template/dev-assets/images/icon-placeholder.png +0 -0
  152. package/template/dev-assets/images/logo-placeholder.png +0 -0
  153. package/template/dev-assets/images/product-placeholder.jpg +0 -0
  154. package/template/dev-assets/images/thumbnail-placeholder.jpg +0 -0
  155. package/template/env.example +0 -51
  156. package/template/gitignore +0 -53
  157. package/template/index.html +0 -22
  158. package/template/main.js +0 -28
  159. package/template/src/DemoPage.vue +0 -459
  160. package/template/src/Plugin.vue +0 -38
  161. package/template/src/stores/index.js +0 -9
  162. package/template/src/stores/test-data.json +0 -173
  163. package/template/theme-layouts/AdditionalStyling.css +0 -0
  164. package/template/theme-layouts/PrivateLayout.vue +0 -39
  165. package/template/theme-layouts/PublicLayout.vue +0 -39
  166. package/template/theme-layouts/SystemLayout.vue +0 -39
  167. package/template/vite.config.js +0 -333
  168. package/tsconfig.tui.json +0 -21
  169. package/vite.config.js +0 -164
@@ -0,0 +1,11 @@
1
+ export type BrowserType = 'chrome' | 'firefox';
2
+ export interface ExtensionOptions {
3
+ browser: BrowserType;
4
+ cwd?: string;
5
+ useHttps?: boolean;
6
+ port?: number | string;
7
+ }
8
+ export declare function startExtension(options: ExtensionOptions): void;
9
+ export declare function stopExtension(browser: BrowserType): boolean;
10
+ export declare function isExtensionRunning(browser: BrowserType): boolean;
11
+ //# sourceMappingURL=ExtensionService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExtensionService.d.ts","sourceRoot":"","sources":["../../../bin/lib/tui/services/ExtensionService.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE/C,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,WAAW,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB;AA2BD,wBAAgB,cAAc,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CA0E9D;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAE3D;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAEhE"}
@@ -0,0 +1,101 @@
1
+ import { serviceManager } from './ServiceManager.js';
2
+ import path from 'path';
3
+ import fs from 'fs';
4
+ import { fileURLToPath } from 'url';
5
+ // Get the toolkit root directory
6
+ function getToolkitRoot() {
7
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
8
+ // Navigate from dist/tui/services to project root (3 levels up)
9
+ // dist/tui/services -> dist/tui -> dist -> gx-devtools
10
+ return path.resolve(__dirname, '..', '..', '..');
11
+ }
12
+ // Find the extension path (project-local or toolkit built-in)
13
+ function findExtensionPath(browser, cwd) {
14
+ // Check local project first
15
+ const localPath = path.join(cwd, 'browser-extensions', browser);
16
+ if (fs.existsSync(localPath)) {
17
+ return localPath;
18
+ }
19
+ // Fall back to toolkit's built-in extension
20
+ const toolkitPath = path.join(getToolkitRoot(), 'browser-extensions', browser);
21
+ if (fs.existsSync(toolkitPath)) {
22
+ return toolkitPath;
23
+ }
24
+ return null;
25
+ }
26
+ export function startExtension(options) {
27
+ const { browser, useHttps = true, port = 3060 } = options;
28
+ const cwd = options.cwd || process.cwd();
29
+ const serviceId = `ext-${browser}`;
30
+ // Compute the start URL based on options
31
+ const protocol = useHttps ? 'https' : 'http';
32
+ const startUrl = `${protocol}://localhost:${port}`;
33
+ // Check if already running
34
+ if (serviceManager.isRunning(serviceId)) {
35
+ return;
36
+ }
37
+ const extensionPath = findExtensionPath(browser, cwd);
38
+ if (!extensionPath) {
39
+ // Create a dummy service to show the error
40
+ const errorState = serviceManager.start({
41
+ id: serviceId,
42
+ name: `${browser.charAt(0).toUpperCase() + browser.slice(1)} Extension`,
43
+ command: 'echo',
44
+ args: [`Extension not found for ${browser}`],
45
+ cwd,
46
+ });
47
+ return;
48
+ }
49
+ if (browser === 'firefox') {
50
+ const config = {
51
+ id: serviceId,
52
+ name: 'Firefox Extension',
53
+ command: 'npx',
54
+ args: ['web-ext', 'run', '--source-dir', extensionPath, '--start-url', startUrl],
55
+ cwd,
56
+ env: {
57
+ FORCE_COLOR: '1',
58
+ },
59
+ };
60
+ serviceManager.start(config);
61
+ }
62
+ else if (browser === 'chrome') {
63
+ // For Chrome, we need to use the launch script
64
+ const toolkitRoot = getToolkitRoot();
65
+ let scriptPath = path.join(cwd, 'scripts', 'launch-chrome.js');
66
+ if (!fs.existsSync(scriptPath)) {
67
+ scriptPath = path.join(toolkitRoot, 'scripts', 'launch-chrome.js');
68
+ }
69
+ if (!fs.existsSync(scriptPath)) {
70
+ const errorState = serviceManager.start({
71
+ id: serviceId,
72
+ name: 'Chrome Extension',
73
+ command: 'echo',
74
+ args: ['Chrome launcher script not found'],
75
+ cwd,
76
+ });
77
+ return;
78
+ }
79
+ const config = {
80
+ id: serviceId,
81
+ name: 'Chrome Extension',
82
+ command: 'node',
83
+ args: [scriptPath],
84
+ cwd,
85
+ env: {
86
+ FORCE_COLOR: '1',
87
+ CHROME_EXTENSION_PATH: extensionPath,
88
+ USE_HTTPS: String(useHttps),
89
+ NODE_PORT: String(port),
90
+ },
91
+ };
92
+ serviceManager.start(config);
93
+ }
94
+ }
95
+ export function stopExtension(browser) {
96
+ return serviceManager.stop(`ext-${browser}`);
97
+ }
98
+ export function isExtensionRunning(browser) {
99
+ return serviceManager.isRunning(`ext-${browser}`);
100
+ }
101
+ //# sourceMappingURL=ExtensionService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExtensionService.js","sourceRoot":"","sources":["../../../bin/lib/tui/services/ExtensionService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { EventEmitter } from 'events';
2
+ export interface GeminiConfig {
3
+ systemPrompt?: string;
4
+ includeDocs?: string[];
5
+ projectContext?: boolean;
6
+ maxContextTokens?: number;
7
+ }
8
+ interface AuthTokens {
9
+ accessToken: string;
10
+ refreshToken: string;
11
+ expiresAt: number;
12
+ }
13
+ export declare function loadAuthTokens(): AuthTokens | null;
14
+ export declare function clearAuthTokens(): void;
15
+ export declare function loadGeminiConfig(): GeminiConfig;
16
+ export declare function saveGeminiConfig(config: GeminiConfig): void;
17
+ export declare function isAuthenticated(): boolean;
18
+ export declare class GeminiService extends EventEmitter {
19
+ private conversationHistory;
20
+ private projectContext;
21
+ constructor();
22
+ startOAuthFlow(): Promise<{
23
+ success: boolean;
24
+ message: string;
25
+ }>;
26
+ private exchangeCodeForTokens;
27
+ private refreshAccessToken;
28
+ private getAccessToken;
29
+ loadProjectContext(cwd: string): void;
30
+ loadCustomDocs(): string;
31
+ sendMessage(message: string): Promise<string>;
32
+ clearConversation(): void;
33
+ getConversationHistory(): Array<{
34
+ role: string;
35
+ content: string;
36
+ }>;
37
+ }
38
+ export declare const geminiService: GeminiService;
39
+ export {};
40
+ //# sourceMappingURL=GeminiService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GeminiService.d.ts","sourceRoot":"","sources":["../../../bin/lib/tui/services/GeminiService.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAGtC,MAAM,WAAW,YAAY;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAGD,UAAU,UAAU;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAgCD,wBAAgB,cAAc,IAAI,UAAU,GAAG,IAAI,CAWlD;AAUD,wBAAgB,eAAe,IAAI,IAAI,CAKtC;AAGD,wBAAgB,gBAAgB,IAAI,YAAY,CAgB/C;AAGD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAI3D;AAGD,wBAAgB,eAAe,IAAI,OAAO,CAKzC;AAGD,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,mBAAmB,CAAgD;IAC3E,OAAO,CAAC,cAAc,CAAc;;IAO9B,cAAc,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;YA+ExD,qBAAqB;YA8BrB,kBAAkB;YAiClB,cAAc;IAiB5B,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAoBrC,cAAc,IAAI,MAAM;IAqBlB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA2DnD,iBAAiB,IAAI,IAAI;IAKzB,sBAAsB,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAGnE;AAGD,eAAO,MAAM,aAAa,eAAsB,CAAC"}
@@ -0,0 +1,327 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import http from 'http';
4
+ import open from 'open';
5
+ import { EventEmitter } from 'events';
6
+ // Get the gxdev config directory
7
+ function getConfigDir() {
8
+ const home = process.env.HOME || process.env.USERPROFILE || '';
9
+ return path.join(home, '.gxdev');
10
+ }
11
+ // Ensure config directory exists
12
+ function ensureConfigDir() {
13
+ const configDir = getConfigDir();
14
+ if (!fs.existsSync(configDir)) {
15
+ fs.mkdirSync(configDir, { recursive: true });
16
+ }
17
+ }
18
+ // Get auth file path
19
+ function getAuthFilePath() {
20
+ return path.join(getConfigDir(), 'gemini-auth.json');
21
+ }
22
+ // Get config file path
23
+ function getConfigFilePath() {
24
+ return path.join(getConfigDir(), 'gemini-config.json');
25
+ }
26
+ // Get docs directory path
27
+ function getDocsDir() {
28
+ return path.join(getConfigDir(), 'gemini-docs');
29
+ }
30
+ // Load saved auth tokens
31
+ export function loadAuthTokens() {
32
+ try {
33
+ const authPath = getAuthFilePath();
34
+ if (fs.existsSync(authPath)) {
35
+ const content = fs.readFileSync(authPath, 'utf-8');
36
+ return JSON.parse(content);
37
+ }
38
+ }
39
+ catch {
40
+ // Invalid or missing auth file
41
+ }
42
+ return null;
43
+ }
44
+ // Save auth tokens
45
+ function saveAuthTokens(tokens) {
46
+ ensureConfigDir();
47
+ const authPath = getAuthFilePath();
48
+ fs.writeFileSync(authPath, JSON.stringify(tokens, null, 2));
49
+ }
50
+ // Clear auth tokens
51
+ export function clearAuthTokens() {
52
+ const authPath = getAuthFilePath();
53
+ if (fs.existsSync(authPath)) {
54
+ fs.unlinkSync(authPath);
55
+ }
56
+ }
57
+ // Load Gemini config
58
+ export function loadGeminiConfig() {
59
+ try {
60
+ const configPath = getConfigFilePath();
61
+ if (fs.existsSync(configPath)) {
62
+ const content = fs.readFileSync(configPath, 'utf-8');
63
+ return JSON.parse(content);
64
+ }
65
+ }
66
+ catch {
67
+ // Invalid or missing config file
68
+ }
69
+ return {
70
+ systemPrompt: 'You are a helpful assistant for GxP plugin development.',
71
+ includeDocs: [],
72
+ projectContext: true,
73
+ maxContextTokens: 4000,
74
+ };
75
+ }
76
+ // Save Gemini config
77
+ export function saveGeminiConfig(config) {
78
+ ensureConfigDir();
79
+ const configPath = getConfigFilePath();
80
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
81
+ }
82
+ // Check if authenticated
83
+ export function isAuthenticated() {
84
+ const tokens = loadAuthTokens();
85
+ if (!tokens)
86
+ return false;
87
+ // Check if token is expired (with 5 min buffer)
88
+ return tokens.expiresAt > Date.now() + 5 * 60 * 1000;
89
+ }
90
+ // Gemini Service class
91
+ export class GeminiService extends EventEmitter {
92
+ constructor() {
93
+ super();
94
+ this.conversationHistory = [];
95
+ this.projectContext = '';
96
+ }
97
+ // Start OAuth flow
98
+ async startOAuthFlow() {
99
+ return new Promise((resolve) => {
100
+ // Create local server for OAuth callback
101
+ const PORT = 8234;
102
+ let server;
103
+ const handleCallback = (req, res) => {
104
+ const url = new URL(req.url || '', `http://localhost:${PORT}`);
105
+ if (url.pathname === '/callback') {
106
+ const code = url.searchParams.get('code');
107
+ const error = url.searchParams.get('error');
108
+ if (error) {
109
+ res.writeHead(200, { 'Content-Type': 'text/html' });
110
+ res.end('<html><body><h1>Authentication Failed</h1><p>You can close this window.</p></body></html>');
111
+ server.close();
112
+ resolve({ success: false, message: `OAuth error: ${error}` });
113
+ return;
114
+ }
115
+ if (code) {
116
+ // Exchange code for tokens
117
+ this.exchangeCodeForTokens(code)
118
+ .then((tokens) => {
119
+ saveAuthTokens(tokens);
120
+ res.writeHead(200, { 'Content-Type': 'text/html' });
121
+ res.end('<html><body><h1>Authentication Successful!</h1><p>You can close this window and return to gxdev.</p></body></html>');
122
+ server.close();
123
+ resolve({ success: true, message: 'Successfully authenticated with Google.' });
124
+ })
125
+ .catch((err) => {
126
+ res.writeHead(200, { 'Content-Type': 'text/html' });
127
+ res.end('<html><body><h1>Authentication Failed</h1><p>Error exchanging code for tokens.</p></body></html>');
128
+ server.close();
129
+ resolve({ success: false, message: `Token exchange error: ${err.message}` });
130
+ });
131
+ return;
132
+ }
133
+ }
134
+ res.writeHead(404);
135
+ res.end('Not found');
136
+ };
137
+ server = http.createServer(handleCallback);
138
+ server.listen(PORT, () => {
139
+ // Construct OAuth URL
140
+ // Note: These are placeholder values - you'll need to set up actual Google Cloud credentials
141
+ const clientId = process.env.GOOGLE_CLIENT_ID || 'YOUR_CLIENT_ID';
142
+ const redirectUri = `http://localhost:${PORT}/callback`;
143
+ const scope = 'https://www.googleapis.com/auth/generative-language';
144
+ const authUrl = `https://accounts.google.com/o/oauth2/v2/auth?` +
145
+ `client_id=${encodeURIComponent(clientId)}` +
146
+ `&redirect_uri=${encodeURIComponent(redirectUri)}` +
147
+ `&response_type=code` +
148
+ `&scope=${encodeURIComponent(scope)}` +
149
+ `&access_type=offline` +
150
+ `&prompt=consent`;
151
+ this.emit('log', `Opening browser for Google authentication...`);
152
+ this.emit('log', `If browser doesn't open, visit: ${authUrl}`);
153
+ open(authUrl).catch(() => {
154
+ this.emit('log', `Could not open browser automatically. Please visit the URL above.`);
155
+ });
156
+ });
157
+ // Timeout after 5 minutes
158
+ setTimeout(() => {
159
+ server.close();
160
+ resolve({ success: false, message: 'Authentication timed out. Please try again.' });
161
+ }, 5 * 60 * 1000);
162
+ });
163
+ }
164
+ // Exchange authorization code for tokens
165
+ async exchangeCodeForTokens(code) {
166
+ const clientId = process.env.GOOGLE_CLIENT_ID || 'YOUR_CLIENT_ID';
167
+ const clientSecret = process.env.GOOGLE_CLIENT_SECRET || 'YOUR_CLIENT_SECRET';
168
+ const redirectUri = 'http://localhost:8234/callback';
169
+ const response = await fetch('https://oauth2.googleapis.com/token', {
170
+ method: 'POST',
171
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
172
+ body: new URLSearchParams({
173
+ code,
174
+ client_id: clientId,
175
+ client_secret: clientSecret,
176
+ redirect_uri: redirectUri,
177
+ grant_type: 'authorization_code',
178
+ }),
179
+ });
180
+ if (!response.ok) {
181
+ throw new Error(`Token exchange failed: ${response.statusText}`);
182
+ }
183
+ const data = await response.json();
184
+ return {
185
+ accessToken: data.access_token,
186
+ refreshToken: data.refresh_token,
187
+ expiresAt: Date.now() + (data.expires_in * 1000),
188
+ };
189
+ }
190
+ // Refresh access token
191
+ async refreshAccessToken() {
192
+ const tokens = loadAuthTokens();
193
+ if (!tokens?.refreshToken) {
194
+ throw new Error('No refresh token available');
195
+ }
196
+ const clientId = process.env.GOOGLE_CLIENT_ID || 'YOUR_CLIENT_ID';
197
+ const clientSecret = process.env.GOOGLE_CLIENT_SECRET || 'YOUR_CLIENT_SECRET';
198
+ const response = await fetch('https://oauth2.googleapis.com/token', {
199
+ method: 'POST',
200
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
201
+ body: new URLSearchParams({
202
+ refresh_token: tokens.refreshToken,
203
+ client_id: clientId,
204
+ client_secret: clientSecret,
205
+ grant_type: 'refresh_token',
206
+ }),
207
+ });
208
+ if (!response.ok) {
209
+ throw new Error('Failed to refresh token');
210
+ }
211
+ const data = await response.json();
212
+ saveAuthTokens({
213
+ accessToken: data.access_token,
214
+ refreshToken: tokens.refreshToken,
215
+ expiresAt: Date.now() + (data.expires_in * 1000),
216
+ });
217
+ }
218
+ // Get valid access token (refresh if needed)
219
+ async getAccessToken() {
220
+ const tokens = loadAuthTokens();
221
+ if (!tokens) {
222
+ throw new Error('Not authenticated. Run /gemini enable first.');
223
+ }
224
+ // Check if token needs refresh (with 5 min buffer)
225
+ if (tokens.expiresAt < Date.now() + 5 * 60 * 1000) {
226
+ await this.refreshAccessToken();
227
+ const newTokens = loadAuthTokens();
228
+ return newTokens.accessToken;
229
+ }
230
+ return tokens.accessToken;
231
+ }
232
+ // Load project context
233
+ loadProjectContext(cwd) {
234
+ const files = ['CLAUDE.md', 'README.md', 'package.json'];
235
+ const contextParts = [];
236
+ for (const file of files) {
237
+ const filePath = path.join(cwd, file);
238
+ if (fs.existsSync(filePath)) {
239
+ try {
240
+ const content = fs.readFileSync(filePath, 'utf-8');
241
+ contextParts.push(`=== ${file} ===\n${content.slice(0, 2000)}`);
242
+ }
243
+ catch {
244
+ // Skip unreadable files
245
+ }
246
+ }
247
+ }
248
+ this.projectContext = contextParts.join('\n\n');
249
+ }
250
+ // Load custom docs
251
+ loadCustomDocs() {
252
+ const docsDir = getDocsDir();
253
+ if (!fs.existsSync(docsDir)) {
254
+ return '';
255
+ }
256
+ const docParts = [];
257
+ try {
258
+ const files = fs.readdirSync(docsDir).filter(f => f.endsWith('.md'));
259
+ for (const file of files.slice(0, 5)) { // Limit to 5 docs
260
+ const content = fs.readFileSync(path.join(docsDir, file), 'utf-8');
261
+ docParts.push(`=== ${file} ===\n${content.slice(0, 2000)}`);
262
+ }
263
+ }
264
+ catch {
265
+ // Skip on error
266
+ }
267
+ return docParts.join('\n\n');
268
+ }
269
+ // Send message to Gemini
270
+ async sendMessage(message) {
271
+ const config = loadGeminiConfig();
272
+ const accessToken = await this.getAccessToken();
273
+ // Build context
274
+ let systemContext = config.systemPrompt || '';
275
+ if (config.projectContext && this.projectContext) {
276
+ systemContext += '\n\nProject Context:\n' + this.projectContext;
277
+ }
278
+ const customDocs = this.loadCustomDocs();
279
+ if (customDocs) {
280
+ systemContext += '\n\nDocumentation:\n' + customDocs;
281
+ }
282
+ // Add to conversation history
283
+ this.conversationHistory.push({ role: 'user', content: message });
284
+ // Prepare request body for Gemini API
285
+ const requestBody = {
286
+ contents: [
287
+ {
288
+ role: 'user',
289
+ parts: [{ text: systemContext + '\n\nUser: ' + message }]
290
+ }
291
+ ],
292
+ generationConfig: {
293
+ maxOutputTokens: 2048,
294
+ temperature: 0.7,
295
+ }
296
+ };
297
+ // Call Gemini API
298
+ const response = await fetch('https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent', {
299
+ method: 'POST',
300
+ headers: {
301
+ 'Authorization': `Bearer ${accessToken}`,
302
+ 'Content-Type': 'application/json',
303
+ },
304
+ body: JSON.stringify(requestBody),
305
+ });
306
+ if (!response.ok) {
307
+ const errorText = await response.text();
308
+ throw new Error(`Gemini API error: ${response.status} - ${errorText}`);
309
+ }
310
+ const data = await response.json();
311
+ const responseText = data.candidates?.[0]?.content?.parts?.[0]?.text || 'No response generated.';
312
+ // Add to conversation history
313
+ this.conversationHistory.push({ role: 'assistant', content: responseText });
314
+ return responseText;
315
+ }
316
+ // Clear conversation history
317
+ clearConversation() {
318
+ this.conversationHistory = [];
319
+ }
320
+ // Get conversation history
321
+ getConversationHistory() {
322
+ return [...this.conversationHistory];
323
+ }
324
+ }
325
+ // Singleton instance
326
+ export const geminiService = new GeminiService();
327
+ //# sourceMappingURL=GeminiService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GeminiService.js","sourceRoot":"","sources":["../../../bin/lib/tui/services/GeminiService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { ChildProcess } from 'child_process';
2
+ import { EventEmitter } from 'events';
3
+ export type ServiceStatus = 'stopped' | 'starting' | 'running' | 'error';
4
+ export interface ServiceConfig {
5
+ id: string;
6
+ name: string;
7
+ command: string;
8
+ args: string[];
9
+ cwd: string;
10
+ env?: Record<string, string>;
11
+ }
12
+ export interface ServiceState {
13
+ id: string;
14
+ name: string;
15
+ status: ServiceStatus;
16
+ logs: string[];
17
+ process?: ChildProcess;
18
+ pid?: number;
19
+ error?: string;
20
+ }
21
+ export declare class ServiceManager extends EventEmitter {
22
+ private services;
23
+ private maxLogLines;
24
+ private cleanupRegistered;
25
+ constructor();
26
+ private registerCleanupHandlers;
27
+ getService(id: string): ServiceState | undefined;
28
+ getAllServices(): ServiceState[];
29
+ isRunning(id: string): boolean;
30
+ start(config: ServiceConfig): ServiceState;
31
+ stop(id: string): boolean;
32
+ stopAll(): void;
33
+ forceStopAll(): void;
34
+ restart(id: string): boolean;
35
+ getConfig(id: string): ServiceConfig | undefined;
36
+ clearLogs(id: string): void;
37
+ private addLog;
38
+ }
39
+ export declare const serviceManager: ServiceManager;
40
+ //# sourceMappingURL=ServiceManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServiceManager.d.ts","sourceRoot":"","sources":["../../../bin/lib/tui/services/ServiceManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,YAAY,EAAY,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC;AAEzE,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAKD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,cAAe,SAAQ,YAAY;IAC9C,OAAO,CAAC,QAAQ,CAAwC;IACxD,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,iBAAiB,CAAS;;IAQlC,OAAO,CAAC,uBAAuB;IAuB/B,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIhD,cAAc,IAAI,YAAY,EAAE;IAIhC,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAK9B,KAAK,CAAC,MAAM,EAAE,aAAa,GAAG,YAAY;IAoH1C,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IA8BzB,OAAO,IAAI,IAAI;IAOf,YAAY,IAAI,IAAI;IAkCpB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IA8C5B,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAIhD,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAQ3B,OAAO,CAAC,MAAM;CAaf;AAGD,eAAO,MAAM,cAAc,gBAAuB,CAAC"}