@gxp-dev/tools 2.0.16 → 2.0.18

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.
@@ -0,0 +1,429 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { spawn, execSync } from 'child_process';
4
+ import { EventEmitter } from 'events';
5
+ // Get the gxdev config directory
6
+ function getConfigDir() {
7
+ const home = process.env.HOME || process.env.USERPROFILE || '';
8
+ return path.join(home, '.gxdev');
9
+ }
10
+ // Ensure config directory exists
11
+ function ensureConfigDir() {
12
+ const configDir = getConfigDir();
13
+ if (!fs.existsSync(configDir)) {
14
+ fs.mkdirSync(configDir, { recursive: true });
15
+ }
16
+ }
17
+ // Get AI config file path
18
+ function getAIConfigPath() {
19
+ return path.join(getConfigDir(), 'ai-config.json');
20
+ }
21
+ // Load AI config
22
+ export function loadAIConfig() {
23
+ try {
24
+ const configPath = getAIConfigPath();
25
+ if (fs.existsSync(configPath)) {
26
+ const content = fs.readFileSync(configPath, 'utf-8');
27
+ return JSON.parse(content);
28
+ }
29
+ }
30
+ catch {
31
+ // Invalid or missing config file
32
+ }
33
+ return {
34
+ provider: 'claude', // Default to Claude
35
+ systemPrompt: 'You are a helpful assistant for GxP plugin development. Help the user build Vue.js components for the GxP kiosk platform.',
36
+ projectContext: true,
37
+ maxContextTokens: 4000,
38
+ };
39
+ }
40
+ // Save AI config
41
+ export function saveAIConfig(config) {
42
+ ensureConfigDir();
43
+ const configPath = getAIConfigPath();
44
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
45
+ }
46
+ // Check if a command exists
47
+ function commandExists(cmd) {
48
+ try {
49
+ execSync(`which ${cmd}`, { stdio: 'pipe' });
50
+ return true;
51
+ }
52
+ catch {
53
+ return false;
54
+ }
55
+ }
56
+ // Check available AI providers
57
+ export function getAvailableProviders() {
58
+ const providers = [];
59
+ // Check Claude CLI
60
+ if (commandExists('claude')) {
61
+ providers.push({
62
+ id: 'claude',
63
+ name: 'Claude',
64
+ available: true,
65
+ });
66
+ }
67
+ else {
68
+ providers.push({
69
+ id: 'claude',
70
+ name: 'Claude',
71
+ available: false,
72
+ reason: 'Install: npm i -g @anthropic-ai/claude-code && claude login',
73
+ });
74
+ }
75
+ // Check Codex CLI
76
+ if (commandExists('codex')) {
77
+ providers.push({
78
+ id: 'codex',
79
+ name: 'Codex',
80
+ available: true,
81
+ });
82
+ }
83
+ else {
84
+ providers.push({
85
+ id: 'codex',
86
+ name: 'Codex',
87
+ available: false,
88
+ reason: 'Install: npm i -g @openai/codex && codex auth',
89
+ });
90
+ }
91
+ // Check Gemini (CLI, API key, or gcloud)
92
+ if (commandExists('gemini')) {
93
+ providers.push({
94
+ id: 'gemini',
95
+ name: 'Gemini',
96
+ available: true,
97
+ method: 'cli',
98
+ });
99
+ }
100
+ else if (process.env.GEMINI_API_KEY || process.env.GOOGLE_API_KEY) {
101
+ providers.push({
102
+ id: 'gemini',
103
+ name: 'Gemini',
104
+ available: true,
105
+ method: 'api_key',
106
+ });
107
+ }
108
+ else if (commandExists('gcloud')) {
109
+ try {
110
+ const authList = execSync("gcloud auth list --format='value(account)'", { stdio: 'pipe' }).toString();
111
+ if (authList.trim()) {
112
+ providers.push({
113
+ id: 'gemini',
114
+ name: 'Gemini',
115
+ available: true,
116
+ method: 'gcloud',
117
+ });
118
+ }
119
+ }
120
+ catch {
121
+ providers.push({
122
+ id: 'gemini',
123
+ name: 'Gemini',
124
+ available: false,
125
+ reason: 'Install: npm i -g @google/gemini-cli && gemini',
126
+ });
127
+ }
128
+ }
129
+ else {
130
+ providers.push({
131
+ id: 'gemini',
132
+ name: 'Gemini',
133
+ available: false,
134
+ reason: 'Install: npm i -g @google/gemini-cli && gemini',
135
+ });
136
+ }
137
+ return providers;
138
+ }
139
+ // Get provider display name with status
140
+ export function getProviderStatus(provider) {
141
+ if (!provider.available) {
142
+ return `${provider.name} (not available)`;
143
+ }
144
+ if (provider.method) {
145
+ switch (provider.method) {
146
+ case 'cli':
147
+ return `${provider.name} (CLI)`;
148
+ case 'api_key':
149
+ return `${provider.name} (API key)`;
150
+ case 'gcloud':
151
+ return `${provider.name} (gcloud)`;
152
+ }
153
+ }
154
+ return `${provider.name} (logged in)`;
155
+ }
156
+ // AI Service class
157
+ export class AIService extends EventEmitter {
158
+ constructor() {
159
+ super();
160
+ this.conversationHistory = [];
161
+ this.projectContext = '';
162
+ const config = loadAIConfig();
163
+ this.currentProvider = config.provider;
164
+ // Determine gemini method if that's the current provider
165
+ const providers = getAvailableProviders();
166
+ const geminiProvider = providers.find(p => p.id === 'gemini');
167
+ if (geminiProvider?.available) {
168
+ this.geminiMethod = geminiProvider.method;
169
+ }
170
+ }
171
+ // Get current provider
172
+ getProvider() {
173
+ return this.currentProvider;
174
+ }
175
+ // Set current provider
176
+ setProvider(provider) {
177
+ const providers = getAvailableProviders();
178
+ const providerInfo = providers.find(p => p.id === provider);
179
+ if (!providerInfo) {
180
+ return { success: false, message: `Unknown provider: ${provider}` };
181
+ }
182
+ if (!providerInfo.available) {
183
+ return { success: false, message: `${providerInfo.name} is not available. ${providerInfo.reason || ''}` };
184
+ }
185
+ this.currentProvider = provider;
186
+ if (provider === 'gemini') {
187
+ this.geminiMethod = providerInfo.method;
188
+ }
189
+ // Save to config
190
+ const config = loadAIConfig();
191
+ config.provider = provider;
192
+ saveAIConfig(config);
193
+ this.clearConversation();
194
+ return { success: true, message: `Switched to ${providerInfo.name}` };
195
+ }
196
+ // Check if current provider is available
197
+ isAvailable() {
198
+ const providers = getAvailableProviders();
199
+ const current = providers.find(p => p.id === this.currentProvider);
200
+ return current?.available || false;
201
+ }
202
+ // Get provider info
203
+ getProviderInfo() {
204
+ const providers = getAvailableProviders();
205
+ return providers.find(p => p.id === this.currentProvider);
206
+ }
207
+ // Load project context
208
+ loadProjectContext(cwd) {
209
+ const files = ['CLAUDE.md', 'AGENTS.md', 'GEMINI.md', 'README.md', 'package.json', 'app-manifest.json'];
210
+ const contextParts = [];
211
+ for (const file of files) {
212
+ const filePath = path.join(cwd, file);
213
+ if (fs.existsSync(filePath)) {
214
+ try {
215
+ const content = fs.readFileSync(filePath, 'utf-8');
216
+ // Limit each file to 2000 chars
217
+ contextParts.push(`=== ${file} ===\n${content.slice(0, 2000)}`);
218
+ }
219
+ catch {
220
+ // Skip unreadable files
221
+ }
222
+ }
223
+ }
224
+ this.projectContext = contextParts.join('\n\n');
225
+ }
226
+ // Send message using current provider
227
+ async sendMessage(message) {
228
+ const config = loadAIConfig();
229
+ // Build context
230
+ let systemContext = config.systemPrompt || '';
231
+ if (config.projectContext && this.projectContext) {
232
+ systemContext += '\n\nProject Context:\n' + this.projectContext;
233
+ }
234
+ switch (this.currentProvider) {
235
+ case 'claude':
236
+ return this.sendWithClaude(message, systemContext);
237
+ case 'codex':
238
+ return this.sendWithCodex(message, systemContext);
239
+ case 'gemini':
240
+ return this.sendWithGemini(message, systemContext);
241
+ default:
242
+ throw new Error(`Unknown provider: ${this.currentProvider}`);
243
+ }
244
+ }
245
+ // Send message with Claude CLI
246
+ async sendWithClaude(message, systemContext) {
247
+ return new Promise((resolve, reject) => {
248
+ let output = '';
249
+ let errorOutput = '';
250
+ const fullPrompt = systemContext ? `${systemContext}\n\nUser: ${message}` : message;
251
+ const claude = spawn('claude', ['--print', '-p', fullPrompt], {
252
+ stdio: ['pipe', 'pipe', 'pipe'],
253
+ shell: true,
254
+ });
255
+ claude.stdout.on('data', (data) => {
256
+ output += data.toString();
257
+ });
258
+ claude.stderr.on('data', (data) => {
259
+ errorOutput += data.toString();
260
+ });
261
+ claude.on('close', (code) => {
262
+ if (code !== 0) {
263
+ reject(new Error(`Claude error: ${errorOutput || 'Unknown error'}`));
264
+ return;
265
+ }
266
+ this.conversationHistory.push({ role: 'user', content: message });
267
+ this.conversationHistory.push({ role: 'assistant', content: output });
268
+ resolve(output.trim());
269
+ });
270
+ claude.on('error', (err) => {
271
+ reject(new Error(`Failed to run Claude: ${err.message}`));
272
+ });
273
+ });
274
+ }
275
+ // Send message with Codex CLI
276
+ async sendWithCodex(message, systemContext) {
277
+ return new Promise((resolve, reject) => {
278
+ let output = '';
279
+ let errorOutput = '';
280
+ const fullPrompt = systemContext ? `${systemContext}\n\nUser: ${message}` : message;
281
+ const codex = spawn('codex', ['--quiet', '-p', fullPrompt], {
282
+ stdio: ['pipe', 'pipe', 'pipe'],
283
+ shell: true,
284
+ });
285
+ codex.stdout.on('data', (data) => {
286
+ output += data.toString();
287
+ });
288
+ codex.stderr.on('data', (data) => {
289
+ errorOutput += data.toString();
290
+ });
291
+ codex.on('close', (code) => {
292
+ if (code !== 0) {
293
+ reject(new Error(`Codex error: ${errorOutput || 'Unknown error'}`));
294
+ return;
295
+ }
296
+ this.conversationHistory.push({ role: 'user', content: message });
297
+ this.conversationHistory.push({ role: 'assistant', content: output });
298
+ resolve(output.trim());
299
+ });
300
+ codex.on('error', (err) => {
301
+ reject(new Error(`Failed to run Codex: ${err.message}`));
302
+ });
303
+ });
304
+ }
305
+ // Send message with Gemini
306
+ async sendWithGemini(message, systemContext) {
307
+ const fullPrompt = systemContext ? `${systemContext}\n\nUser: ${message}` : message;
308
+ if (this.geminiMethod === 'cli') {
309
+ return this.sendWithGeminiCli(fullPrompt);
310
+ }
311
+ else if (this.geminiMethod === 'api_key') {
312
+ return this.sendWithGeminiApi(fullPrompt);
313
+ }
314
+ else if (this.geminiMethod === 'gcloud') {
315
+ return this.sendWithGeminiGcloud(fullPrompt);
316
+ }
317
+ throw new Error('Gemini is not properly configured');
318
+ }
319
+ // Send with Gemini CLI
320
+ async sendWithGeminiCli(prompt) {
321
+ return new Promise((resolve, reject) => {
322
+ let output = '';
323
+ let errorOutput = '';
324
+ const gemini = spawn('gemini', ['-p', prompt], {
325
+ stdio: ['pipe', 'pipe', 'pipe'],
326
+ shell: true,
327
+ });
328
+ gemini.stdout.on('data', (data) => {
329
+ output += data.toString();
330
+ });
331
+ gemini.stderr.on('data', (data) => {
332
+ errorOutput += data.toString();
333
+ });
334
+ gemini.on('close', (code) => {
335
+ if (code !== 0) {
336
+ reject(new Error(`Gemini error: ${errorOutput || 'Unknown error'}`));
337
+ return;
338
+ }
339
+ this.conversationHistory.push({ role: 'user', content: prompt });
340
+ this.conversationHistory.push({ role: 'assistant', content: output });
341
+ resolve(output.trim());
342
+ });
343
+ gemini.on('error', (err) => {
344
+ reject(new Error(`Failed to run Gemini: ${err.message}`));
345
+ });
346
+ });
347
+ }
348
+ // Send with Gemini API
349
+ async sendWithGeminiApi(prompt) {
350
+ const apiKey = process.env.GEMINI_API_KEY || process.env.GOOGLE_API_KEY;
351
+ if (!apiKey) {
352
+ throw new Error('GEMINI_API_KEY not set');
353
+ }
354
+ const response = await fetch(`https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${apiKey}`, {
355
+ method: 'POST',
356
+ headers: { 'Content-Type': 'application/json' },
357
+ body: JSON.stringify({
358
+ contents: [{ role: 'user', parts: [{ text: prompt }] }],
359
+ generationConfig: { maxOutputTokens: 2048, temperature: 0.7 },
360
+ }),
361
+ });
362
+ if (!response.ok) {
363
+ const errorText = await response.text();
364
+ throw new Error(`Gemini API error: ${response.status} - ${errorText}`);
365
+ }
366
+ const data = await response.json();
367
+ const responseText = data.candidates?.[0]?.content?.parts?.[0]?.text || 'No response generated.';
368
+ this.conversationHistory.push({ role: 'user', content: prompt });
369
+ this.conversationHistory.push({ role: 'assistant', content: responseText });
370
+ return responseText;
371
+ }
372
+ // Send with Gemini via gcloud
373
+ async sendWithGeminiGcloud(prompt) {
374
+ return new Promise((resolve, reject) => {
375
+ let accessToken;
376
+ let projectId;
377
+ try {
378
+ accessToken = execSync('gcloud auth print-access-token', { stdio: 'pipe' }).toString().trim();
379
+ projectId = execSync('gcloud config get-value project', { stdio: 'pipe' }).toString().trim();
380
+ }
381
+ catch (error) {
382
+ reject(new Error('Failed to get gcloud credentials'));
383
+ return;
384
+ }
385
+ const requestBody = JSON.stringify({
386
+ contents: [{ role: 'user', parts: [{ text: prompt }] }],
387
+ generationConfig: { maxOutputTokens: 2048, temperature: 0.7 },
388
+ });
389
+ const curl = spawn('curl', [
390
+ '-s', '-X', 'POST',
391
+ `https://us-central1-aiplatform.googleapis.com/v1/projects/${projectId}/locations/us-central1/publishers/google/models/gemini-1.5-flash:generateContent`,
392
+ '-H', `Authorization: Bearer ${accessToken}`,
393
+ '-H', 'Content-Type: application/json',
394
+ '-d', requestBody,
395
+ ], { stdio: ['pipe', 'pipe', 'pipe'] });
396
+ let output = '';
397
+ let errorOutput = '';
398
+ curl.stdout.on('data', (data) => { output += data.toString(); });
399
+ curl.stderr.on('data', (data) => { errorOutput += data.toString(); });
400
+ curl.on('close', (code) => {
401
+ if (code !== 0) {
402
+ reject(new Error(`Gemini gcloud error: ${errorOutput}`));
403
+ return;
404
+ }
405
+ try {
406
+ const data = JSON.parse(output);
407
+ const responseText = data.candidates?.[0]?.content?.parts?.[0]?.text || 'No response generated.';
408
+ this.conversationHistory.push({ role: 'user', content: prompt });
409
+ this.conversationHistory.push({ role: 'assistant', content: responseText });
410
+ resolve(responseText);
411
+ }
412
+ catch (parseError) {
413
+ reject(new Error(`Failed to parse Gemini response`));
414
+ }
415
+ });
416
+ });
417
+ }
418
+ // Clear conversation history
419
+ clearConversation() {
420
+ this.conversationHistory = [];
421
+ }
422
+ // Get conversation history
423
+ getConversationHistory() {
424
+ return [...this.conversationHistory];
425
+ }
426
+ }
427
+ // Singleton instance
428
+ export const aiService = new AIService();
429
+ //# sourceMappingURL=AIService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AIService.js","sourceRoot":"","sources":["../../../bin/lib/tui/services/AIService.ts"],"names":[],"mappings":"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"}
@@ -3,4 +3,5 @@ export { startVite, stopVite, isViteRunning, ViteOptions } from './ViteService.j
3
3
  export { startSocket, stopSocket, isSocketRunning, listSocketEvents, sendSocketEvent, SocketOptions, SocketEvent } from './SocketService.js';
4
4
  export { startExtension, stopExtension, isExtensionRunning, BrowserType, ExtensionOptions } from './ExtensionService.js';
5
5
  export { geminiService, GeminiService, GeminiConfig, isAuthenticated, loadGeminiConfig, saveGeminiConfig, clearAuthTokens } from './GeminiService.js';
6
+ export { aiService, AIService, AIProvider, AIProviderInfo, AIConfig, loadAIConfig, saveAIConfig, getAvailableProviders, getProviderStatus } from './AIService.js';
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../bin/lib/tui/services/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACjH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC7I,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,kBAAkB,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzH,OAAO,EACL,aAAa,EACb,aAAa,EACb,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EAChB,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../bin/lib/tui/services/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACjH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC7I,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,kBAAkB,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzH,OAAO,EACL,aAAa,EACb,aAAa,EACb,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,SAAS,EACT,SAAS,EACT,UAAU,EACV,cAAc,EACd,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,gBAAgB,CAAC"}
@@ -3,4 +3,5 @@ export { startVite, stopVite, isViteRunning } from './ViteService.js';
3
3
  export { startSocket, stopSocket, isSocketRunning, listSocketEvents, sendSocketEvent } from './SocketService.js';
4
4
  export { startExtension, stopExtension, isExtensionRunning } from './ExtensionService.js';
5
5
  export { geminiService, GeminiService, isAuthenticated, loadGeminiConfig, saveGeminiConfig, clearAuthTokens } from './GeminiService.js';
6
+ export { aiService, AIService, loadAIConfig, saveAIConfig, getAvailableProviders, getProviderStatus } from './AIService.js';
6
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../bin/lib/tui/services/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAA8C,MAAM,qBAAqB,CAAC;AACjH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAe,MAAM,kBAAkB,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAA8B,MAAM,oBAAoB,CAAC;AAC7I,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,kBAAkB,EAAiC,MAAM,uBAAuB,CAAC;AACzH,OAAO,EACL,aAAa,EACb,aAAa,EAEb,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EAChB,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../bin/lib/tui/services/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAA8C,MAAM,qBAAqB,CAAC;AACjH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAe,MAAM,kBAAkB,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAA8B,MAAM,oBAAoB,CAAC;AAC7I,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,kBAAkB,EAAiC,MAAM,uBAAuB,CAAC;AACzH,OAAO,EACL,aAAa,EACb,aAAa,EAEb,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,SAAS,EACT,SAAS,EAIT,YAAY,EACZ,YAAY,EACZ,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,gBAAgB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gxp-dev/tools",
3
- "version": "2.0.16",
3
+ "version": "2.0.18",
4
4
  "description": "Dev tools to create platform plugins",
5
5
  "type": "commonjs",
6
6
  "publishConfig": {