luna-agents 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (290) hide show
  1. package/.claude-plugin/LICENSE +21 -0
  2. package/.claude-plugin/README.md +285 -0
  3. package/.claude-plugin/claude-plugin.json +106 -0
  4. package/.claude-plugin/index.js +318 -0
  5. package/.claude-plugin/lib/api-client.js +504 -0
  6. package/.claude-plugin/lib/rag-utils.js +442 -0
  7. package/.claude-plugin/package.json +418 -0
  8. package/LICENSE +21 -0
  9. package/README.md +350 -0
  10. package/agents/json/design-architect.json +57 -0
  11. package/agents/json/luna-auth.json +71 -0
  12. package/agents/json/luna-brand.json +66 -0
  13. package/agents/json/luna-cloudflare.json +261 -0
  14. package/agents/json/luna-code-review.json +63 -0
  15. package/agents/json/luna-deployment.json +68 -0
  16. package/agents/json/luna-documentation.json +85 -0
  17. package/agents/json/luna-hig.json +128 -0
  18. package/agents/json/luna-layout-designer.json +178 -0
  19. package/agents/json/luna-monitoring-observability.json +64 -0
  20. package/agents/json/luna-post-launch-review.json +68 -0
  21. package/agents/json/luna-requirements-analyzer.json +53 -0
  22. package/agents/json/luna-task-executor.json +63 -0
  23. package/agents/json/luna-task-planner.json +62 -0
  24. package/agents/json/luna-testing-validation.json +66 -0
  25. package/agents/luna-365-security.md +96 -0
  26. package/agents/luna-analytics.md +318 -0
  27. package/agents/luna-api-generator.md +654 -0
  28. package/agents/luna-auth.md +396 -0
  29. package/agents/luna-brand.md +248 -0
  30. package/agents/luna-cloudflare.md +728 -0
  31. package/agents/luna-code-review.md +487 -0
  32. package/agents/luna-database.md +453 -0
  33. package/agents/luna-deployment.md +202 -0
  34. package/agents/luna-design-architect.md +353 -0
  35. package/agents/luna-docker.md +615 -0
  36. package/agents/luna-documentation.md +177 -0
  37. package/agents/luna-full-test.md +910 -0
  38. package/agents/luna-glm-vision.md +211 -0
  39. package/agents/luna-hig.md +430 -0
  40. package/agents/luna-lemonsqueezy.md +441 -0
  41. package/agents/luna-monitoring-observability.md +199 -0
  42. package/agents/luna-openai-app.md +499 -0
  43. package/agents/luna-post-launch-review.md +191 -0
  44. package/agents/luna-rag-enhanced.md +1619 -0
  45. package/agents/luna-rag.md +1733 -0
  46. package/agents/luna-requirements-analyzer.md +189 -0
  47. package/agents/luna-run.md +620 -0
  48. package/agents/luna-seo.md +338 -0
  49. package/agents/luna-task-executor.md +371 -0
  50. package/agents/luna-task-planner.md +275 -0
  51. package/agents/luna-testing-validation.md +681 -0
  52. package/agents/luna-ui-fix.md +591 -0
  53. package/agents/luna-ui-test.md +600 -0
  54. package/agents/luna-user-guide.md +409 -0
  55. package/agents/site-auditor.md +83 -0
  56. package/commands/3d-mesh.md +12 -0
  57. package/commands/3d.md +12 -0
  58. package/commands/agent-boost.md +13 -0
  59. package/commands/ai-index.md +16 -0
  60. package/commands/api.md +12 -0
  61. package/commands/assert.md +17 -0
  62. package/commands/audience.md +12 -0
  63. package/commands/auth.md +17 -0
  64. package/commands/autopilot.md +12 -0
  65. package/commands/boost-finsavvy.md +10 -0
  66. package/commands/boost-org.md +10 -0
  67. package/commands/boost-project.md +12 -0
  68. package/commands/brand.md +17 -0
  69. package/commands/browser-test.md +18 -0
  70. package/commands/cf.md +26 -0
  71. package/commands/cfg.md +33 -0
  72. package/commands/chain.md +12 -0
  73. package/commands/challenge.md +13 -0
  74. package/commands/clone.md +12 -0
  75. package/commands/cmds.md +243 -0
  76. package/commands/collab.md +12 -0
  77. package/commands/compete.md +12 -0
  78. package/commands/config-rules.md +21 -0
  79. package/commands/connect-infra.md +10 -0
  80. package/commands/context-pack.md +13 -0
  81. package/commands/curb.md +12 -0
  82. package/commands/des.md +38 -0
  83. package/commands/devto.md +20 -0
  84. package/commands/dock.md +26 -0
  85. package/commands/docs.md +33 -0
  86. package/commands/e2e-flow.md +18 -0
  87. package/commands/email-routing.md +10 -0
  88. package/commands/feature.md +12 -0
  89. package/commands/figma.md +12 -0
  90. package/commands/fix.md +12 -0
  91. package/commands/flaky.md +12 -0
  92. package/commands/flow-record.md +12 -0
  93. package/commands/gamify.md +12 -0
  94. package/commands/ghost.md +12 -0
  95. package/commands/git-insights.md +12 -0
  96. package/commands/go-viral.md +16 -0
  97. package/commands/go.md +42 -0
  98. package/commands/graph-rag.md +13 -0
  99. package/commands/guard.md +12 -0
  100. package/commands/heal.md +17 -0
  101. package/commands/heygen.md +12 -0
  102. package/commands/hig.md +33 -0
  103. package/commands/idea.md +12 -0
  104. package/commands/imagine.md +12 -0
  105. package/commands/inbox.md +12 -0
  106. package/commands/lam.md +12 -0
  107. package/commands/landing.md +12 -0
  108. package/commands/launch.md +12 -0
  109. package/commands/learn.md +12 -0
  110. package/commands/leverage.md +12 -0
  111. package/commands/ll-365-secure.md +179 -0
  112. package/commands/ll-3d-mesh.md +94 -0
  113. package/commands/ll-3d.md +123 -0
  114. package/commands/ll-a11y-scan.md +143 -0
  115. package/commands/ll-a11y.md +71 -0
  116. package/commands/ll-agent-boost.md +92 -0
  117. package/commands/ll-agent-chain.md +104 -0
  118. package/commands/ll-ai-index.md +120 -0
  119. package/commands/ll-api-client.md +77 -0
  120. package/commands/ll-api.md +99 -0
  121. package/commands/ll-assert.md +73 -0
  122. package/commands/ll-audience.md +308 -0
  123. package/commands/ll-auth.md +145 -0
  124. package/commands/ll-autopilot.md +113 -0
  125. package/commands/ll-boost-finsavvy.md +106 -0
  126. package/commands/ll-boost-org.md +161 -0
  127. package/commands/ll-boost-project.md +118 -0
  128. package/commands/ll-brand.md +150 -0
  129. package/commands/ll-browser-test.md +203 -0
  130. package/commands/ll-challenge.md +124 -0
  131. package/commands/ll-changelog.md +80 -0
  132. package/commands/ll-ci.md +78 -0
  133. package/commands/ll-claude-instructions.md +80 -0
  134. package/commands/ll-clone.md +82 -0
  135. package/commands/ll-cloudflare.md +580 -0
  136. package/commands/ll-codemap.md +78 -0
  137. package/commands/ll-collab.md +87 -0
  138. package/commands/ll-compete.md +67 -0
  139. package/commands/ll-config-rules.md +255 -0
  140. package/commands/ll-config.md +434 -0
  141. package/commands/ll-connect-infra.md +123 -0
  142. package/commands/ll-context-pack.md +100 -0
  143. package/commands/ll-curb.md +164 -0
  144. package/commands/ll-debug.md +76 -0
  145. package/commands/ll-deploy.md +101 -0
  146. package/commands/ll-deps.md +70 -0
  147. package/commands/ll-design.md +86 -0
  148. package/commands/ll-devto-publish.md +172 -0
  149. package/commands/ll-dockerize.md +273 -0
  150. package/commands/ll-docs.md +123 -0
  151. package/commands/ll-e2e-flow.md +132 -0
  152. package/commands/ll-e2e-test.md +231 -0
  153. package/commands/ll-email-routing.md +130 -0
  154. package/commands/ll-env.md +70 -0
  155. package/commands/ll-execute.md +98 -0
  156. package/commands/ll-feature.md +80 -0
  157. package/commands/ll-figma.md +82 -0
  158. package/commands/ll-fix.md +76 -0
  159. package/commands/ll-flaky.md +151 -0
  160. package/commands/ll-flow-record.md +180 -0
  161. package/commands/ll-flowdocs.md +83 -0
  162. package/commands/ll-gamify.md +131 -0
  163. package/commands/ll-gemma4.md +84 -0
  164. package/commands/ll-ghost.md +79 -0
  165. package/commands/ll-git-insights.md +152 -0
  166. package/commands/ll-go-viral.md +171 -0
  167. package/commands/ll-graph-rag.md +113 -0
  168. package/commands/ll-guard.md +92 -0
  169. package/commands/ll-heal.md +135 -0
  170. package/commands/ll-heygen.md +203 -0
  171. package/commands/ll-hig.md +578 -0
  172. package/commands/ll-hld.md +84 -0
  173. package/commands/ll-i18n.md +74 -0
  174. package/commands/ll-idea.md +101 -0
  175. package/commands/ll-imagine.md +72 -0
  176. package/commands/ll-inbox.md +116 -0
  177. package/commands/ll-lam.md +93 -0
  178. package/commands/ll-landing.md +171 -0
  179. package/commands/ll-launch.md +100 -0
  180. package/commands/ll-learn.md +87 -0
  181. package/commands/ll-leverage.md +137 -0
  182. package/commands/ll-local-llm.md +131 -0
  183. package/commands/ll-ls-products.md +160 -0
  184. package/commands/ll-marketplace.md +130 -0
  185. package/commands/ll-mcp-publish.md +104 -0
  186. package/commands/ll-migrate.md +68 -0
  187. package/commands/ll-mock.md +79 -0
  188. package/commands/ll-money.md +87 -0
  189. package/commands/ll-monitor.md +120 -0
  190. package/commands/ll-morph.md +117 -0
  191. package/commands/ll-multi-agent.md +170 -0
  192. package/commands/ll-native.md +93 -0
  193. package/commands/ll-nexa.md +79 -0
  194. package/commands/ll-onboarding.md +84 -0
  195. package/commands/ll-openhands.md +78 -0
  196. package/commands/ll-organic-promote.md +260 -0
  197. package/commands/ll-parallel.md +74 -0
  198. package/commands/ll-payments.md +83 -0
  199. package/commands/ll-perf-trace.md +147 -0
  200. package/commands/ll-perf.md +65 -0
  201. package/commands/ll-persona.md +280 -0
  202. package/commands/ll-pipe.md +296 -0
  203. package/commands/ll-plan-impl.js +570 -0
  204. package/commands/ll-plan-v2.md +297 -0
  205. package/commands/ll-plan.md +87 -0
  206. package/commands/ll-postlaunch.md +109 -0
  207. package/commands/ll-pr.md +84 -0
  208. package/commands/ll-present.md +110 -0
  209. package/commands/ll-product-map.md +152 -0
  210. package/commands/ll-promote.md +352 -0
  211. package/commands/ll-publish.md +124 -0
  212. package/commands/ll-pulse.md +96 -0
  213. package/commands/ll-rag-guided.md +345 -0
  214. package/commands/ll-rag-upgrade.md +504 -0
  215. package/commands/ll-rag.md +343 -0
  216. package/commands/ll-record.md +114 -0
  217. package/commands/ll-refactor.md +71 -0
  218. package/commands/ll-requirements.md +71 -0
  219. package/commands/ll-review.md +92 -0
  220. package/commands/ll-rollback.md +66 -0
  221. package/commands/ll-routemap.md +79 -0
  222. package/commands/ll-rules.md +90 -0
  223. package/commands/ll-shortcuts.md +229 -0
  224. package/commands/ll-sing.md +99 -0
  225. package/commands/ll-site-audit.md +228 -0
  226. package/commands/ll-smart-route.md +92 -0
  227. package/commands/ll-smart-search.md +58 -0
  228. package/commands/ll-storybook.md +86 -0
  229. package/commands/ll-swarm.md +101 -0
  230. package/commands/ll-test.md +97 -0
  231. package/commands/ll-time-machine.md +72 -0
  232. package/commands/ll-ui-convert.md +433 -0
  233. package/commands/ll-video.md +108 -0
  234. package/commands/ll-vision-pipeline.md +247 -0
  235. package/commands/ll-vision.md +74 -0
  236. package/commands/ll-visual-diff.md +118 -0
  237. package/commands/ll-visual-qa.md +204 -0
  238. package/commands/ll-visual-regression.md +96 -0
  239. package/commands/ll-voice.md +138 -0
  240. package/commands/ll-watch.md +65 -0
  241. package/commands/ll-workflow.md +108 -0
  242. package/commands/ll-zen.md +98 -0
  243. package/commands/local-llm.md +12 -0
  244. package/commands/marketplace.md +13 -0
  245. package/commands/mcp-publish.md +16 -0
  246. package/commands/migrate.md +12 -0
  247. package/commands/money.md +12 -0
  248. package/commands/morph.md +12 -0
  249. package/commands/multi-agent.md +12 -0
  250. package/commands/native.md +12 -0
  251. package/commands/nexa.md +12 -0
  252. package/commands/oh.md +12 -0
  253. package/commands/organic-promote.md +16 -0
  254. package/commands/perf-trace.md +12 -0
  255. package/commands/perf.md +12 -0
  256. package/commands/persona.md +12 -0
  257. package/commands/pipe.md +21 -0
  258. package/commands/plan.md +38 -0
  259. package/commands/pr.md +12 -0
  260. package/commands/present.md +12 -0
  261. package/commands/product-map.md +13 -0
  262. package/commands/promote.md +16 -0
  263. package/commands/publish.md +12 -0
  264. package/commands/pulse.md +12 -0
  265. package/commands/q.md +35 -0
  266. package/commands/record.md +12 -0
  267. package/commands/refactor.md +12 -0
  268. package/commands/req.md +40 -0
  269. package/commands/retro.md +33 -0
  270. package/commands/rev.md +39 -0
  271. package/commands/rules.md +19 -0
  272. package/commands/search.md +12 -0
  273. package/commands/sec.md +34 -0
  274. package/commands/ship.md +39 -0
  275. package/commands/sing.md +12 -0
  276. package/commands/site-audit.md +12 -0
  277. package/commands/smart-route.md +13 -0
  278. package/commands/swarm.md +12 -0
  279. package/commands/test.md +39 -0
  280. package/commands/time-machine.md +12 -0
  281. package/commands/ui.md +33 -0
  282. package/commands/video.md +12 -0
  283. package/commands/vision.md +12 -0
  284. package/commands/voice.md +12 -0
  285. package/commands/vr.md +18 -0
  286. package/commands/watch.md +39 -0
  287. package/commands/workflow.md +19 -0
  288. package/commands/zen.md +12 -0
  289. package/package.json +76 -0
  290. package/setup.sh +382 -0
@@ -0,0 +1,504 @@
1
+ /**
2
+ * Luna API Client
3
+ *
4
+ * Handles communication between the Luna plugin and the Claude Agent Platform API
5
+ */
6
+
7
+ class LunaAPIClient {
8
+ constructor() {
9
+ this.baseURL = null;
10
+ this.apiKey = null;
11
+ this.projectId = null;
12
+ this.initialized = false;
13
+ this.cache = new Map();
14
+ this.cacheTimeout = 5 * 60 * 1000; // 5 minutes
15
+ }
16
+
17
+ /**
18
+ * Initialize the API client with configuration
19
+ */
20
+ async initialize(config = {}) {
21
+ try {
22
+ // Load configuration from multiple sources
23
+ this.baseURL = config.baseURL ||
24
+ process.env.LUNA_API_URL ||
25
+ 'https://luna-rag-api-prod.broad-dew-49ad.workers.dev/api/v1';
26
+
27
+ this.apiKey = config.apiKey ||
28
+ process.env.LUNA_API_KEY ||
29
+ this.loadStoredApiKey();
30
+
31
+ this.projectId = config.projectId ||
32
+ await this.detectProjectId();
33
+
34
+ // Validate configuration
35
+ if (!this.baseURL) {
36
+ throw new Error('API base URL is required');
37
+ }
38
+
39
+ // Test connection
40
+ await this.testConnection();
41
+
42
+ this.initialized = true;
43
+ console.log('🌙 Luna API Client initialized successfully');
44
+ console.log(`📡 Connected to: ${this.baseURL}`);
45
+ console.log(`🏠 Project ID: ${this.projectId}`);
46
+
47
+ return true;
48
+ } catch (error) {
49
+ console.error('❌ Failed to initialize Luna API Client:', error.message);
50
+ throw error;
51
+ }
52
+ }
53
+
54
+ /**
55
+ * Test API connection
56
+ */
57
+ async testConnection() {
58
+ try {
59
+ const response = await this.makeRequest('GET', '/health');
60
+ return response.status === 'healthy';
61
+ } catch (error) {
62
+ throw new Error(`API connection failed: ${error.message}`);
63
+ }
64
+ }
65
+
66
+ /**
67
+ * Make HTTP request with authentication
68
+ */
69
+ async makeRequest(method, endpoint, data = null, options = {}) {
70
+ if (!this.initialized) {
71
+ throw new Error('API client not initialized. Call initialize() first.');
72
+ }
73
+
74
+ const url = `${this.baseURL}${endpoint}`;
75
+ const headers = {
76
+ 'Content-Type': 'application/json',
77
+ ...(this.apiKey && { 'Authorization': `Bearer ${this.apiKey}` }),
78
+ ...options.headers,
79
+ };
80
+
81
+ const config = {
82
+ method,
83
+ headers,
84
+ ...(data && { body: JSON.stringify(data) }),
85
+ ...options,
86
+ };
87
+
88
+ try {
89
+ const response = await fetch(url, config);
90
+
91
+ if (!response.ok) {
92
+ const errorData = await response.json().catch(() => ({}));
93
+ throw new Error(`API Error: ${response.status} - ${errorData.message || response.statusText}`);
94
+ }
95
+
96
+ return await response.json();
97
+ } catch (error) {
98
+ if (error.name === 'TypeError' && error.message.includes('fetch')) {
99
+ throw new Error(`Network error: Could not connect to ${this.baseURL}`);
100
+ }
101
+ throw error;
102
+ }
103
+ }
104
+
105
+ /**
106
+ * Authentication methods
107
+ */
108
+ async login(email, password) {
109
+ try {
110
+ const response = await this.makeRequest('POST', '/auth/login', {
111
+ email,
112
+ password
113
+ });
114
+
115
+ if (response.accessToken) {
116
+ this.apiKey = response.accessToken;
117
+ this.storeApiKey(this.apiKey);
118
+
119
+ // Store user info
120
+ this.currentUser = response.user;
121
+ this.storeUserData(response.user);
122
+ }
123
+
124
+ return response;
125
+ } catch (error) {
126
+ throw new Error(`Login failed: ${error.message}`);
127
+ }
128
+ }
129
+
130
+ async register(userData) {
131
+ try {
132
+ const response = await this.makeRequest('POST', '/auth/register', userData);
133
+
134
+ if (response.accessToken) {
135
+ this.apiKey = response.accessToken;
136
+ this.storeApiKey(this.apiKey);
137
+ this.currentUser = response.user;
138
+ this.storeUserData(response.user);
139
+ }
140
+
141
+ return response;
142
+ } catch (error) {
143
+ throw new Error(`Registration failed: ${error.message}`);
144
+ }
145
+ }
146
+
147
+ /**
148
+ * Project management
149
+ */
150
+ async createProject(projectData) {
151
+ return this.makeRequest('POST', '/projects', projectData);
152
+ }
153
+
154
+ async getProjects() {
155
+ return this.makeRequest('GET', '/projects');
156
+ }
157
+
158
+ async getProject(projectId) {
159
+ return this.makeRequest('GET', `/projects/${projectId}`);
160
+ }
161
+
162
+ /**
163
+ * Agent management
164
+ */
165
+ async getAgents(filters = {}) {
166
+ const params = new URLSearchParams(filters);
167
+ return this.makeRequest('GET', `/agents?${params}`);
168
+ }
169
+
170
+ async getAgent(agentId) {
171
+ return this.makeRequest('GET', `/agents/${agentId}`);
172
+ }
173
+
174
+ async startAgent(agentId, options = {}) {
175
+ return this.makeRequest('POST', `/agents/${agentId}/start`, options);
176
+ }
177
+
178
+ async stopAgent(agentId) {
179
+ return this.makeRequest('POST', `/agents/${agentId}/stop`);
180
+ }
181
+
182
+ async getAgentHealth(agentId) {
183
+ return this.makeRequest('GET', `/agents/${agentId}/health`);
184
+ }
185
+
186
+ /**
187
+ * Task management
188
+ */
189
+ async createTask(taskData) {
190
+ const payload = {
191
+ ...taskData,
192
+ projectId: this.projectId || taskData.projectId
193
+ };
194
+ return this.makeRequest('POST', '/tasks', payload);
195
+ }
196
+
197
+ async getTasks(filters = {}) {
198
+ const params = new URLSearchParams({
199
+ projectId: this.projectId,
200
+ ...filters
201
+ });
202
+ return this.makeRequest('GET', `/tasks?${params}`);
203
+ }
204
+
205
+ async getTask(taskId) {
206
+ return this.makeRequest('GET', `/tasks/${taskId}`);
207
+ }
208
+
209
+ async cancelTask(taskId) {
210
+ return this.makeRequest('POST', `/tasks/${taskId}/cancel`);
211
+ }
212
+
213
+ async retryTask(taskId) {
214
+ return this.makeRequest('POST', `/tasks/${taskId}/retry`);
215
+ }
216
+
217
+ /**
218
+ * RAG (Context) management - Enhanced with comprehensive repository processing
219
+ */
220
+ async indexProject(indexOptions = {}) {
221
+ const payload = {
222
+ projectId: this.projectId,
223
+ ...indexOptions
224
+ };
225
+ return this.makeRequest('POST', '/rag/index', payload);
226
+ }
227
+
228
+ async indexRepository(repositoryPath, options = {}) {
229
+ const payload = {
230
+ repositoryPath,
231
+ projectId: this.projectId,
232
+ filePatterns: options.filePatterns || [
233
+ '**/*.ts',
234
+ '**/*.js',
235
+ '**/*.tsx',
236
+ '**/*.jsx',
237
+ '**/*.py',
238
+ '**/*.java',
239
+ '**/*.go',
240
+ '**/*.rs',
241
+ '**/*.cpp',
242
+ '**/*.c',
243
+ '**/*.md',
244
+ '**/*.json',
245
+ '**/*.yaml',
246
+ '**/*.yml'
247
+ ],
248
+ excludePatterns: options.excludePatterns || [
249
+ '**/node_modules/**',
250
+ '**/dist/**',
251
+ '**/build/**',
252
+ '**/.git/**',
253
+ '**/.next/**',
254
+ '**/coverage/**'
255
+ ],
256
+ metadata: {
257
+ ...options.metadata,
258
+ projectId: this.projectId,
259
+ indexedAt: new Date().toISOString(),
260
+ indexingVersion: '2.0.0'
261
+ }
262
+ };
263
+ return this.makeRequest('POST', '/rag/repository/index', payload);
264
+ }
265
+
266
+ async indexFile(filePath, content, metadata = {}) {
267
+ const payload = {
268
+ filePath,
269
+ content,
270
+ projectId: this.projectId,
271
+ metadata: {
272
+ ...metadata,
273
+ projectId: this.projectId,
274
+ indexedAt: new Date().toISOString()
275
+ }
276
+ };
277
+ return this.makeRequest('POST', '/rag/file/index', payload);
278
+ }
279
+
280
+ async queryRAG(query, options = {}) {
281
+ const payload = {
282
+ query,
283
+ projectId: this.projectId,
284
+ maxResults: options.maxResults || 5,
285
+ temperature: options.temperature || 0.7,
286
+ filters: {
287
+ ...options.filters,
288
+ projectId: this.projectId
289
+ },
290
+ includeContext: options.includeContext !== false,
291
+ includeSources: options.includeSources !== false
292
+ };
293
+ return this.makeRequest('POST', '/rag/query', payload);
294
+ }
295
+
296
+ async searchDocuments(query, options = {}) {
297
+ const payload = {
298
+ query,
299
+ projectId: this.projectId,
300
+ maxResults: options.maxResults || 10,
301
+ filters: options.filters || {}
302
+ };
303
+ return this.makeRequest('POST', '/rag/search', payload);
304
+ }
305
+
306
+ async getRAGStatus() {
307
+ const params = new URLSearchParams({
308
+ projectId: this.projectId
309
+ });
310
+ return this.makeRequest('GET', `/rag/status?${params}`);
311
+ }
312
+
313
+ async getRAGStatistics() {
314
+ const params = new URLSearchParams({
315
+ projectId: this.projectId
316
+ });
317
+ return this.makeRequest('GET', `/rag/statistics?${params}`);
318
+ }
319
+
320
+ async deleteDocuments(documentIds) {
321
+ const payload = {
322
+ documentIds,
323
+ projectId: this.projectId
324
+ };
325
+ return this.makeRequest('DELETE', '/rag/documents', payload);
326
+ }
327
+
328
+ async getConversationHistory(limit = 10) {
329
+ const params = new URLSearchParams({
330
+ projectId: this.projectId,
331
+ limit: limit.toString()
332
+ });
333
+ return this.makeRequest('GET', `/rag/conversation/history?${params}`);
334
+ }
335
+
336
+ async clearConversationHistory() {
337
+ return this.makeRequest('DELETE', '/rag/conversation/history', {
338
+ projectId: this.projectId
339
+ });
340
+ }
341
+
342
+ async getTokenUsage() {
343
+ const params = new URLSearchParams({
344
+ projectId: this.projectId
345
+ });
346
+ return this.makeRequest('GET', `/rag/tokens/usage?${params}`);
347
+ }
348
+
349
+ /**
350
+ * AI generation methods
351
+ */
352
+ async generateText(prompt, options = {}) {
353
+ const payload = {
354
+ prompt,
355
+ ...options,
356
+ context: {
357
+ projectId: this.projectId,
358
+ ...options.context
359
+ }
360
+ };
361
+ return this.makeRequest('POST', '/ai/generate/text', payload);
362
+ }
363
+
364
+ async generateImage(prompt, options = {}) {
365
+ const payload = {
366
+ prompt,
367
+ ...options
368
+ };
369
+ return this.makeRequest('POST', '/ai/generate/image', payload);
370
+ }
371
+
372
+ async analyzeCode(code, analysisType, options = {}) {
373
+ const payload = {
374
+ code,
375
+ analysisType,
376
+ ...options,
377
+ context: {
378
+ projectId: this.projectId,
379
+ ...options.context
380
+ }
381
+ };
382
+ return this.makeRequest('POST', '/ai/analyze/code', payload);
383
+ }
384
+
385
+ /**
386
+ * Utility methods
387
+ */
388
+ async detectProjectId() {
389
+ try {
390
+ // Try to detect project from current directory
391
+ const currentDir = process.cwd();
392
+ const projectName = currentDir.split('/').pop();
393
+
394
+ // Check if a project with this name exists
395
+ const projects = await this.getProjects();
396
+ const existingProject = projects.projects?.find(p =>
397
+ p.name === projectName || p.name?.toLowerCase() === projectName.toLowerCase()
398
+ );
399
+
400
+ if (existingProject) {
401
+ return existingProject.id;
402
+ }
403
+
404
+ // Create a new project if none exists
405
+ const newProject = await this.createProject({
406
+ name: projectName,
407
+ description: `Project for ${currentDir}`,
408
+ settings: {
409
+ type: 'auto-detected',
410
+ detectedAt: new Date().toISOString()
411
+ }
412
+ });
413
+
414
+ return newProject.id;
415
+ } catch (error) {
416
+ console.warn('Could not detect/create project:', error.message);
417
+ return null;
418
+ }
419
+ }
420
+
421
+ /**
422
+ * Storage methods for API keys and user data
423
+ */
424
+ storeApiKey(apiKey) {
425
+ // In a real implementation, you'd use secure storage
426
+ // For now, using environment variable as fallback
427
+ if (typeof localStorage !== 'undefined') {
428
+ localStorage.setItem('luna_api_key', apiKey);
429
+ }
430
+ }
431
+
432
+ loadStoredApiKey() {
433
+ if (typeof localStorage !== 'undefined') {
434
+ return localStorage.getItem('luna_api_key');
435
+ }
436
+ return process.env.LUNA_API_KEY;
437
+ }
438
+
439
+ storeUserData(userData) {
440
+ if (typeof localStorage !== 'undefined') {
441
+ localStorage.setItem('luna_user_data', JSON.stringify(userData));
442
+ }
443
+ }
444
+
445
+ loadStoredUserData() {
446
+ if (typeof localStorage !== 'undefined') {
447
+ const data = localStorage.getItem('luna_user_data');
448
+ return data ? JSON.parse(data) : null;
449
+ }
450
+ return null;
451
+ }
452
+
453
+ /**
454
+ * Cache management
455
+ */
456
+ setCache(key, data) {
457
+ this.cache.set(key, {
458
+ data,
459
+ timestamp: Date.now()
460
+ });
461
+ }
462
+
463
+ getCache(key) {
464
+ const cached = this.cache.get(key);
465
+ if (cached && (Date.now() - cached.timestamp) < this.cacheTimeout) {
466
+ return cached.data;
467
+ }
468
+ this.cache.delete(key);
469
+ return null;
470
+ }
471
+
472
+ clearCache() {
473
+ this.cache.clear();
474
+ }
475
+
476
+ /**
477
+ * Status and health
478
+ */
479
+ async getStatus() {
480
+ try {
481
+ const [health, agents, tasks] = await Promise.all([
482
+ this.makeRequest('GET', '/health'),
483
+ this.getAgents({ limit: 1 }),
484
+ this.getTasks({ limit: 1 })
485
+ ]);
486
+
487
+ return {
488
+ connected: true,
489
+ api: health,
490
+ agentsAvailable: agents.total > 0,
491
+ tasksActive: tasks.tasks?.some(t => t.status === 'running') || false,
492
+ project: this.projectId
493
+ };
494
+ } catch (error) {
495
+ return {
496
+ connected: false,
497
+ error: error.message,
498
+ project: this.projectId
499
+ };
500
+ }
501
+ }
502
+ }
503
+
504
+ module.exports = LunaAPIClient;