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.
- package/.claude-plugin/LICENSE +21 -0
- package/.claude-plugin/README.md +285 -0
- package/.claude-plugin/claude-plugin.json +106 -0
- package/.claude-plugin/index.js +318 -0
- package/.claude-plugin/lib/api-client.js +504 -0
- package/.claude-plugin/lib/rag-utils.js +442 -0
- package/.claude-plugin/package.json +418 -0
- package/LICENSE +21 -0
- package/README.md +350 -0
- package/agents/json/design-architect.json +57 -0
- package/agents/json/luna-auth.json +71 -0
- package/agents/json/luna-brand.json +66 -0
- package/agents/json/luna-cloudflare.json +261 -0
- package/agents/json/luna-code-review.json +63 -0
- package/agents/json/luna-deployment.json +68 -0
- package/agents/json/luna-documentation.json +85 -0
- package/agents/json/luna-hig.json +128 -0
- package/agents/json/luna-layout-designer.json +178 -0
- package/agents/json/luna-monitoring-observability.json +64 -0
- package/agents/json/luna-post-launch-review.json +68 -0
- package/agents/json/luna-requirements-analyzer.json +53 -0
- package/agents/json/luna-task-executor.json +63 -0
- package/agents/json/luna-task-planner.json +62 -0
- package/agents/json/luna-testing-validation.json +66 -0
- package/agents/luna-365-security.md +96 -0
- package/agents/luna-analytics.md +318 -0
- package/agents/luna-api-generator.md +654 -0
- package/agents/luna-auth.md +396 -0
- package/agents/luna-brand.md +248 -0
- package/agents/luna-cloudflare.md +728 -0
- package/agents/luna-code-review.md +487 -0
- package/agents/luna-database.md +453 -0
- package/agents/luna-deployment.md +202 -0
- package/agents/luna-design-architect.md +353 -0
- package/agents/luna-docker.md +615 -0
- package/agents/luna-documentation.md +177 -0
- package/agents/luna-full-test.md +910 -0
- package/agents/luna-glm-vision.md +211 -0
- package/agents/luna-hig.md +430 -0
- package/agents/luna-lemonsqueezy.md +441 -0
- package/agents/luna-monitoring-observability.md +199 -0
- package/agents/luna-openai-app.md +499 -0
- package/agents/luna-post-launch-review.md +191 -0
- package/agents/luna-rag-enhanced.md +1619 -0
- package/agents/luna-rag.md +1733 -0
- package/agents/luna-requirements-analyzer.md +189 -0
- package/agents/luna-run.md +620 -0
- package/agents/luna-seo.md +338 -0
- package/agents/luna-task-executor.md +371 -0
- package/agents/luna-task-planner.md +275 -0
- package/agents/luna-testing-validation.md +681 -0
- package/agents/luna-ui-fix.md +591 -0
- package/agents/luna-ui-test.md +600 -0
- package/agents/luna-user-guide.md +409 -0
- package/agents/site-auditor.md +83 -0
- package/commands/3d-mesh.md +12 -0
- package/commands/3d.md +12 -0
- package/commands/agent-boost.md +13 -0
- package/commands/ai-index.md +16 -0
- package/commands/api.md +12 -0
- package/commands/assert.md +17 -0
- package/commands/audience.md +12 -0
- package/commands/auth.md +17 -0
- package/commands/autopilot.md +12 -0
- package/commands/boost-finsavvy.md +10 -0
- package/commands/boost-org.md +10 -0
- package/commands/boost-project.md +12 -0
- package/commands/brand.md +17 -0
- package/commands/browser-test.md +18 -0
- package/commands/cf.md +26 -0
- package/commands/cfg.md +33 -0
- package/commands/chain.md +12 -0
- package/commands/challenge.md +13 -0
- package/commands/clone.md +12 -0
- package/commands/cmds.md +243 -0
- package/commands/collab.md +12 -0
- package/commands/compete.md +12 -0
- package/commands/config-rules.md +21 -0
- package/commands/connect-infra.md +10 -0
- package/commands/context-pack.md +13 -0
- package/commands/curb.md +12 -0
- package/commands/des.md +38 -0
- package/commands/devto.md +20 -0
- package/commands/dock.md +26 -0
- package/commands/docs.md +33 -0
- package/commands/e2e-flow.md +18 -0
- package/commands/email-routing.md +10 -0
- package/commands/feature.md +12 -0
- package/commands/figma.md +12 -0
- package/commands/fix.md +12 -0
- package/commands/flaky.md +12 -0
- package/commands/flow-record.md +12 -0
- package/commands/gamify.md +12 -0
- package/commands/ghost.md +12 -0
- package/commands/git-insights.md +12 -0
- package/commands/go-viral.md +16 -0
- package/commands/go.md +42 -0
- package/commands/graph-rag.md +13 -0
- package/commands/guard.md +12 -0
- package/commands/heal.md +17 -0
- package/commands/heygen.md +12 -0
- package/commands/hig.md +33 -0
- package/commands/idea.md +12 -0
- package/commands/imagine.md +12 -0
- package/commands/inbox.md +12 -0
- package/commands/lam.md +12 -0
- package/commands/landing.md +12 -0
- package/commands/launch.md +12 -0
- package/commands/learn.md +12 -0
- package/commands/leverage.md +12 -0
- package/commands/ll-365-secure.md +179 -0
- package/commands/ll-3d-mesh.md +94 -0
- package/commands/ll-3d.md +123 -0
- package/commands/ll-a11y-scan.md +143 -0
- package/commands/ll-a11y.md +71 -0
- package/commands/ll-agent-boost.md +92 -0
- package/commands/ll-agent-chain.md +104 -0
- package/commands/ll-ai-index.md +120 -0
- package/commands/ll-api-client.md +77 -0
- package/commands/ll-api.md +99 -0
- package/commands/ll-assert.md +73 -0
- package/commands/ll-audience.md +308 -0
- package/commands/ll-auth.md +145 -0
- package/commands/ll-autopilot.md +113 -0
- package/commands/ll-boost-finsavvy.md +106 -0
- package/commands/ll-boost-org.md +161 -0
- package/commands/ll-boost-project.md +118 -0
- package/commands/ll-brand.md +150 -0
- package/commands/ll-browser-test.md +203 -0
- package/commands/ll-challenge.md +124 -0
- package/commands/ll-changelog.md +80 -0
- package/commands/ll-ci.md +78 -0
- package/commands/ll-claude-instructions.md +80 -0
- package/commands/ll-clone.md +82 -0
- package/commands/ll-cloudflare.md +580 -0
- package/commands/ll-codemap.md +78 -0
- package/commands/ll-collab.md +87 -0
- package/commands/ll-compete.md +67 -0
- package/commands/ll-config-rules.md +255 -0
- package/commands/ll-config.md +434 -0
- package/commands/ll-connect-infra.md +123 -0
- package/commands/ll-context-pack.md +100 -0
- package/commands/ll-curb.md +164 -0
- package/commands/ll-debug.md +76 -0
- package/commands/ll-deploy.md +101 -0
- package/commands/ll-deps.md +70 -0
- package/commands/ll-design.md +86 -0
- package/commands/ll-devto-publish.md +172 -0
- package/commands/ll-dockerize.md +273 -0
- package/commands/ll-docs.md +123 -0
- package/commands/ll-e2e-flow.md +132 -0
- package/commands/ll-e2e-test.md +231 -0
- package/commands/ll-email-routing.md +130 -0
- package/commands/ll-env.md +70 -0
- package/commands/ll-execute.md +98 -0
- package/commands/ll-feature.md +80 -0
- package/commands/ll-figma.md +82 -0
- package/commands/ll-fix.md +76 -0
- package/commands/ll-flaky.md +151 -0
- package/commands/ll-flow-record.md +180 -0
- package/commands/ll-flowdocs.md +83 -0
- package/commands/ll-gamify.md +131 -0
- package/commands/ll-gemma4.md +84 -0
- package/commands/ll-ghost.md +79 -0
- package/commands/ll-git-insights.md +152 -0
- package/commands/ll-go-viral.md +171 -0
- package/commands/ll-graph-rag.md +113 -0
- package/commands/ll-guard.md +92 -0
- package/commands/ll-heal.md +135 -0
- package/commands/ll-heygen.md +203 -0
- package/commands/ll-hig.md +578 -0
- package/commands/ll-hld.md +84 -0
- package/commands/ll-i18n.md +74 -0
- package/commands/ll-idea.md +101 -0
- package/commands/ll-imagine.md +72 -0
- package/commands/ll-inbox.md +116 -0
- package/commands/ll-lam.md +93 -0
- package/commands/ll-landing.md +171 -0
- package/commands/ll-launch.md +100 -0
- package/commands/ll-learn.md +87 -0
- package/commands/ll-leverage.md +137 -0
- package/commands/ll-local-llm.md +131 -0
- package/commands/ll-ls-products.md +160 -0
- package/commands/ll-marketplace.md +130 -0
- package/commands/ll-mcp-publish.md +104 -0
- package/commands/ll-migrate.md +68 -0
- package/commands/ll-mock.md +79 -0
- package/commands/ll-money.md +87 -0
- package/commands/ll-monitor.md +120 -0
- package/commands/ll-morph.md +117 -0
- package/commands/ll-multi-agent.md +170 -0
- package/commands/ll-native.md +93 -0
- package/commands/ll-nexa.md +79 -0
- package/commands/ll-onboarding.md +84 -0
- package/commands/ll-openhands.md +78 -0
- package/commands/ll-organic-promote.md +260 -0
- package/commands/ll-parallel.md +74 -0
- package/commands/ll-payments.md +83 -0
- package/commands/ll-perf-trace.md +147 -0
- package/commands/ll-perf.md +65 -0
- package/commands/ll-persona.md +280 -0
- package/commands/ll-pipe.md +296 -0
- package/commands/ll-plan-impl.js +570 -0
- package/commands/ll-plan-v2.md +297 -0
- package/commands/ll-plan.md +87 -0
- package/commands/ll-postlaunch.md +109 -0
- package/commands/ll-pr.md +84 -0
- package/commands/ll-present.md +110 -0
- package/commands/ll-product-map.md +152 -0
- package/commands/ll-promote.md +352 -0
- package/commands/ll-publish.md +124 -0
- package/commands/ll-pulse.md +96 -0
- package/commands/ll-rag-guided.md +345 -0
- package/commands/ll-rag-upgrade.md +504 -0
- package/commands/ll-rag.md +343 -0
- package/commands/ll-record.md +114 -0
- package/commands/ll-refactor.md +71 -0
- package/commands/ll-requirements.md +71 -0
- package/commands/ll-review.md +92 -0
- package/commands/ll-rollback.md +66 -0
- package/commands/ll-routemap.md +79 -0
- package/commands/ll-rules.md +90 -0
- package/commands/ll-shortcuts.md +229 -0
- package/commands/ll-sing.md +99 -0
- package/commands/ll-site-audit.md +228 -0
- package/commands/ll-smart-route.md +92 -0
- package/commands/ll-smart-search.md +58 -0
- package/commands/ll-storybook.md +86 -0
- package/commands/ll-swarm.md +101 -0
- package/commands/ll-test.md +97 -0
- package/commands/ll-time-machine.md +72 -0
- package/commands/ll-ui-convert.md +433 -0
- package/commands/ll-video.md +108 -0
- package/commands/ll-vision-pipeline.md +247 -0
- package/commands/ll-vision.md +74 -0
- package/commands/ll-visual-diff.md +118 -0
- package/commands/ll-visual-qa.md +204 -0
- package/commands/ll-visual-regression.md +96 -0
- package/commands/ll-voice.md +138 -0
- package/commands/ll-watch.md +65 -0
- package/commands/ll-workflow.md +108 -0
- package/commands/ll-zen.md +98 -0
- package/commands/local-llm.md +12 -0
- package/commands/marketplace.md +13 -0
- package/commands/mcp-publish.md +16 -0
- package/commands/migrate.md +12 -0
- package/commands/money.md +12 -0
- package/commands/morph.md +12 -0
- package/commands/multi-agent.md +12 -0
- package/commands/native.md +12 -0
- package/commands/nexa.md +12 -0
- package/commands/oh.md +12 -0
- package/commands/organic-promote.md +16 -0
- package/commands/perf-trace.md +12 -0
- package/commands/perf.md +12 -0
- package/commands/persona.md +12 -0
- package/commands/pipe.md +21 -0
- package/commands/plan.md +38 -0
- package/commands/pr.md +12 -0
- package/commands/present.md +12 -0
- package/commands/product-map.md +13 -0
- package/commands/promote.md +16 -0
- package/commands/publish.md +12 -0
- package/commands/pulse.md +12 -0
- package/commands/q.md +35 -0
- package/commands/record.md +12 -0
- package/commands/refactor.md +12 -0
- package/commands/req.md +40 -0
- package/commands/retro.md +33 -0
- package/commands/rev.md +39 -0
- package/commands/rules.md +19 -0
- package/commands/search.md +12 -0
- package/commands/sec.md +34 -0
- package/commands/ship.md +39 -0
- package/commands/sing.md +12 -0
- package/commands/site-audit.md +12 -0
- package/commands/smart-route.md +13 -0
- package/commands/swarm.md +12 -0
- package/commands/test.md +39 -0
- package/commands/time-machine.md +12 -0
- package/commands/ui.md +33 -0
- package/commands/video.md +12 -0
- package/commands/vision.md +12 -0
- package/commands/voice.md +12 -0
- package/commands/vr.md +18 -0
- package/commands/watch.md +39 -0
- package/commands/workflow.md +19 -0
- package/commands/zen.md +12 -0
- package/package.json +76 -0
- 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;
|