lua-cli 2.5.8 → 3.0.0-alpha.10
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/dist/api/chat.api.service.d.ts +8 -0
- package/dist/api/chat.api.service.js +50 -0
- package/dist/api/job.api.service.d.ts +219 -0
- package/dist/api/job.api.service.js +216 -0
- package/dist/api/lazy-instances.d.ts +24 -0
- package/dist/api/lazy-instances.js +48 -0
- package/dist/api/postprocessor.api.service.d.ts +158 -0
- package/dist/api/postprocessor.api.service.js +111 -0
- package/dist/api/preprocessor.api.service.d.ts +158 -0
- package/dist/api/preprocessor.api.service.js +111 -0
- package/dist/api/user.data.api.service.d.ts +13 -0
- package/dist/api/user.data.api.service.js +20 -0
- package/dist/api/webhook.api.service.d.ts +151 -0
- package/dist/api/webhook.api.service.js +134 -0
- package/dist/api-exports.d.ts +176 -41
- package/dist/api-exports.js +195 -21
- package/dist/cli/command-definitions.js +85 -8
- package/dist/commands/chat.js +73 -36
- package/dist/commands/compile.js +140 -7
- package/dist/commands/dev.js +23 -2
- package/dist/commands/index.d.ts +4 -0
- package/dist/commands/index.js +4 -0
- package/dist/commands/init.js +53 -7
- package/dist/commands/jobs.d.ts +20 -0
- package/dist/commands/jobs.js +533 -0
- package/dist/commands/logs.js +2 -5
- package/dist/commands/postprocessors.d.ts +8 -0
- package/dist/commands/postprocessors.js +431 -0
- package/dist/commands/preprocessors.d.ts +8 -0
- package/dist/commands/preprocessors.js +431 -0
- package/dist/commands/push.d.ts +3 -2
- package/dist/commands/push.js +1216 -7
- package/dist/commands/test.d.ts +9 -18
- package/dist/commands/test.js +574 -82
- package/dist/commands/webhooks.d.ts +18 -0
- package/dist/commands/webhooks.js +424 -0
- package/dist/common/job.instance.d.ts +80 -0
- package/dist/common/job.instance.js +116 -0
- package/dist/common/user.instance.d.ts +1 -0
- package/dist/common/user.instance.js +9 -0
- package/dist/config/constants.d.ts +4 -3
- package/dist/config/constants.js +10 -8
- package/dist/interfaces/agent.d.ts +2 -1
- package/dist/interfaces/chat.d.ts +52 -1
- package/dist/interfaces/index.d.ts +10 -0
- package/dist/interfaces/index.js +7 -0
- package/dist/interfaces/jobs.d.ts +193 -0
- package/dist/interfaces/jobs.js +5 -0
- package/dist/interfaces/postprocessors.d.ts +35 -0
- package/dist/interfaces/postprocessors.js +4 -0
- package/dist/interfaces/preprocessors.d.ts +35 -0
- package/dist/interfaces/preprocessors.js +4 -0
- package/dist/interfaces/webhooks.d.ts +104 -0
- package/dist/interfaces/webhooks.js +5 -0
- package/dist/services/auth.d.ts +8 -2
- package/dist/services/auth.js +35 -3
- package/dist/types/api-contracts.d.ts +5 -0
- package/dist/types/compile.types.d.ts +49 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.js +1 -1
- package/dist/types/skill.d.ts +521 -0
- package/dist/types/skill.js +471 -0
- package/dist/utils/agent-management.d.ts +25 -0
- package/dist/utils/agent-management.js +67 -0
- package/dist/utils/bundling.d.ts +44 -5
- package/dist/utils/bundling.js +723 -23
- package/dist/utils/compile.d.ts +63 -0
- package/dist/utils/compile.js +712 -36
- package/dist/utils/deployment.d.ts +2 -1
- package/dist/utils/deployment.js +16 -2
- package/dist/utils/dev-api.d.ts +42 -2
- package/dist/utils/dev-api.js +177 -4
- package/dist/utils/dev-server.d.ts +1 -1
- package/dist/utils/dev-server.js +4 -4
- package/dist/utils/dynamic-job-bundler.d.ts +17 -0
- package/dist/utils/dynamic-job-bundler.js +143 -0
- package/dist/utils/init-agent.d.ts +3 -1
- package/dist/utils/init-agent.js +6 -4
- package/dist/utils/init-prompts.d.ts +2 -1
- package/dist/utils/init-prompts.js +14 -9
- package/dist/utils/job-management.d.ts +24 -0
- package/dist/utils/job-management.js +264 -0
- package/dist/utils/postprocessor-management.d.ts +9 -0
- package/dist/utils/postprocessor-management.js +118 -0
- package/dist/utils/pre-bundle-jobs.d.ts +26 -0
- package/dist/utils/pre-bundle-jobs.js +176 -0
- package/dist/utils/preprocessor-management.d.ts +9 -0
- package/dist/utils/preprocessor-management.js +118 -0
- package/dist/utils/sandbox-storage.d.ts +48 -0
- package/dist/utils/sandbox-storage.js +114 -0
- package/dist/utils/sandbox.d.ts +61 -1
- package/dist/utils/sandbox.js +299 -72
- package/dist/utils/tool-detection.d.ts +3 -2
- package/dist/utils/tool-detection.js +18 -4
- package/dist/utils/webhook-management.d.ts +24 -0
- package/dist/utils/webhook-management.js +256 -0
- package/package.json +1 -1
- package/template/README.md +30 -2
- package/template/env.example +5 -0
- package/template/lua.skill.yaml +47 -0
- package/template/package-lock.json +10505 -0
- package/template/package.json +2 -1
- package/template/src/index.ts +103 -2
- package/template/src/jobs/AbandonedBasketProcessorJob.ts +139 -0
- package/template/src/jobs/DailyCleanupJob.ts +100 -0
- package/template/src/jobs/DataMigrationJob.ts +133 -0
- package/template/src/jobs/HealthCheckJob.ts +87 -0
- package/template/src/tools/CreateInlineJob.ts +42 -0
- package/template/src/tools/GameScoreTrackerTool.ts +356 -0
- package/template/src/tools/SmartBasketTool.ts +188 -0
- package/template/src/webhooks/PaymentWebhook.ts +113 -0
- package/template/src/webhooks/UserEventWebhook.ts +77 -0
- package/API_REFERENCE.md +0 -1408
- package/CHANGELOG.md +0 -236
- package/CLI_REFERENCE.md +0 -908
- package/GETTING_STARTED.md +0 -1040
- package/INSTANCE_TYPES.md +0 -1158
- package/README.md +0 -865
- package/TEMPLATE_GUIDE.md +0 -1398
- package/USER_DATA_INSTANCE.md +0 -621
- package/template/TOOL_EXAMPLES.md +0 -655
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Webhooks Command
|
|
3
|
+
* Manages agent webhooks for sandbox and production environments
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Main webhooks command - manages agent webhooks
|
|
7
|
+
*
|
|
8
|
+
* Features:
|
|
9
|
+
* - View deployed webhooks
|
|
10
|
+
* - View webhook versions
|
|
11
|
+
* - Deploy webhook versions to production
|
|
12
|
+
* - Activate/deactivate webhooks
|
|
13
|
+
*
|
|
14
|
+
* Note: For local testing, use `lua test webhook`
|
|
15
|
+
*
|
|
16
|
+
* @returns Promise that resolves when command completes
|
|
17
|
+
*/
|
|
18
|
+
export declare function webhooksCommand(): Promise<void>;
|
|
@@ -0,0 +1,424 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Webhooks Command
|
|
3
|
+
* Manages agent webhooks for sandbox and production environments
|
|
4
|
+
*/
|
|
5
|
+
import { loadApiKey, checkApiKey } from '../services/auth.js';
|
|
6
|
+
import { readSkillConfig } from '../utils/files.js';
|
|
7
|
+
import { withErrorHandling, writeProgress, writeSuccess, writeInfo } from '../utils/cli.js';
|
|
8
|
+
import { BASE_URLS } from '../config/constants.js';
|
|
9
|
+
import { safePrompt } from '../utils/prompt-handler.js';
|
|
10
|
+
import { validateConfig, validateAgentConfig, } from '../utils/dev-helpers.js';
|
|
11
|
+
import WebhookApi from '../api/webhook.api.service.js';
|
|
12
|
+
/**
|
|
13
|
+
* Main webhooks command - manages agent webhooks
|
|
14
|
+
*
|
|
15
|
+
* Features:
|
|
16
|
+
* - View deployed webhooks
|
|
17
|
+
* - View webhook versions
|
|
18
|
+
* - Deploy webhook versions to production
|
|
19
|
+
* - Activate/deactivate webhooks
|
|
20
|
+
*
|
|
21
|
+
* Note: For local testing, use `lua test webhook`
|
|
22
|
+
*
|
|
23
|
+
* @returns Promise that resolves when command completes
|
|
24
|
+
*/
|
|
25
|
+
export async function webhooksCommand() {
|
|
26
|
+
return withErrorHandling(async () => {
|
|
27
|
+
// Step 1: Load configuration first (to get agentId)
|
|
28
|
+
const config = readSkillConfig();
|
|
29
|
+
validateConfig(config);
|
|
30
|
+
validateAgentConfig(config);
|
|
31
|
+
const agentId = config.agent.agentId;
|
|
32
|
+
// Step 2: Authenticate
|
|
33
|
+
const apiKey = await loadApiKey();
|
|
34
|
+
if (!apiKey) {
|
|
35
|
+
console.error("❌ No API key found. Please run 'lua auth configure' to set up your API key.");
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
await checkApiKey(apiKey);
|
|
39
|
+
writeProgress("✅ Authenticated");
|
|
40
|
+
const context = {
|
|
41
|
+
environment: 'production',
|
|
42
|
+
agentId,
|
|
43
|
+
apiKey,
|
|
44
|
+
};
|
|
45
|
+
// Start webhook management
|
|
46
|
+
await manageProductionWebhooks(context, config);
|
|
47
|
+
}, "webhooks");
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Manage production webhooks - view and deploy versions
|
|
51
|
+
*/
|
|
52
|
+
async function manageProductionWebhooks(context, config) {
|
|
53
|
+
let continueManaging = true;
|
|
54
|
+
while (continueManaging) {
|
|
55
|
+
console.log("\n" + "=".repeat(60));
|
|
56
|
+
console.log("🚀 Production Webhooks");
|
|
57
|
+
console.log("=".repeat(60) + "\n");
|
|
58
|
+
const actionAnswer = await safePrompt([
|
|
59
|
+
{
|
|
60
|
+
type: 'list',
|
|
61
|
+
name: 'action',
|
|
62
|
+
message: 'What would you like to do?',
|
|
63
|
+
choices: [
|
|
64
|
+
{ name: '👁️ View deployed webhooks', value: 'view' },
|
|
65
|
+
{ name: '📜 View webhook versions', value: 'versions' },
|
|
66
|
+
{ name: '🚀 Deploy a version', value: 'deploy' },
|
|
67
|
+
{ name: '✅ Activate a webhook', value: 'activate' },
|
|
68
|
+
{ name: '🚫 Deactivate a webhook', value: 'deactivate' },
|
|
69
|
+
{ name: '❌ Exit', value: 'exit' }
|
|
70
|
+
]
|
|
71
|
+
}
|
|
72
|
+
]);
|
|
73
|
+
if (!actionAnswer)
|
|
74
|
+
return;
|
|
75
|
+
const { action } = actionAnswer;
|
|
76
|
+
switch (action) {
|
|
77
|
+
case 'view':
|
|
78
|
+
await viewDeployedWebhooks(context, config);
|
|
79
|
+
break;
|
|
80
|
+
case 'versions':
|
|
81
|
+
await viewWebhookVersions(context, config);
|
|
82
|
+
break;
|
|
83
|
+
case 'deploy':
|
|
84
|
+
await deployWebhookVersion(context, config);
|
|
85
|
+
break;
|
|
86
|
+
case 'activate':
|
|
87
|
+
await activateWebhook(context, config);
|
|
88
|
+
break;
|
|
89
|
+
case 'deactivate':
|
|
90
|
+
await deactivateWebhook(context, config);
|
|
91
|
+
break;
|
|
92
|
+
case 'exit':
|
|
93
|
+
continueManaging = false;
|
|
94
|
+
console.log("\n👋 Goodbye!\n");
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* View deployed webhooks in production
|
|
101
|
+
*/
|
|
102
|
+
async function viewDeployedWebhooks(context, config) {
|
|
103
|
+
writeProgress("🔄 Loading webhook information...");
|
|
104
|
+
try {
|
|
105
|
+
const webhooks = config.webhooks || [];
|
|
106
|
+
if (webhooks.length === 0) {
|
|
107
|
+
console.log("\nℹ️ No webhooks found in configuration.\n");
|
|
108
|
+
await safePrompt([{ type: 'input', name: 'continue', message: 'Press Enter to continue...' }]);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
console.log("\n" + "=".repeat(60));
|
|
112
|
+
console.log("⚙️ Production Webhooks");
|
|
113
|
+
console.log("=".repeat(60) + "\n");
|
|
114
|
+
const webhookApi = new WebhookApi(BASE_URLS.API, context.apiKey, context.agentId);
|
|
115
|
+
// Fetch version info for each webhook
|
|
116
|
+
for (const webhook of webhooks) {
|
|
117
|
+
try {
|
|
118
|
+
const response = await webhookApi.getWebhookVersions(webhook.webhookId);
|
|
119
|
+
if (response.success && response.data) {
|
|
120
|
+
const versions = response.data.versions || [];
|
|
121
|
+
const activeVersionId = response.data.activeVersionId;
|
|
122
|
+
// Find active version
|
|
123
|
+
const activeVersion = versions.find((v) => v.webhookId === activeVersionId);
|
|
124
|
+
console.log(`🪝 ${webhook.name}`);
|
|
125
|
+
console.log(` Webhook ID: ${webhook.webhookId}`);
|
|
126
|
+
if (activeVersion) {
|
|
127
|
+
console.log(` Deployed Version: ${activeVersion.version} ⭐`);
|
|
128
|
+
const date = new Date(activeVersion.createdAt);
|
|
129
|
+
console.log(` Deployed: ${date.toLocaleString()}`);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
console.log(` Deployed Version: Not deployed`);
|
|
133
|
+
}
|
|
134
|
+
console.log(` Total Versions: ${versions.length}`);
|
|
135
|
+
console.log();
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
console.log(`🪝 ${webhook.name}`);
|
|
139
|
+
console.log(` Webhook ID: ${webhook.webhookId}`);
|
|
140
|
+
console.log(` Status: Unable to fetch version info`);
|
|
141
|
+
console.log();
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
console.log(`🪝 ${webhook.name}`);
|
|
146
|
+
console.log(` Webhook ID: ${webhook.webhookId}`);
|
|
147
|
+
console.log(` Status: Error loading versions`);
|
|
148
|
+
console.log();
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
console.log("=".repeat(60) + "\n");
|
|
152
|
+
await safePrompt([{ type: 'input', name: 'continue', message: 'Press Enter to continue...' }]);
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
console.error('❌ Error loading webhook information:', error);
|
|
156
|
+
await safePrompt([{ type: 'input', name: 'continue', message: 'Press Enter to continue...' }]);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* View versions for a specific webhook
|
|
161
|
+
*/
|
|
162
|
+
async function viewWebhookVersions(context, config) {
|
|
163
|
+
const webhooks = config.webhooks || [];
|
|
164
|
+
if (webhooks.length === 0) {
|
|
165
|
+
console.log("\nℹ️ No webhooks found in configuration.\n");
|
|
166
|
+
await safePrompt([{ type: 'input', name: 'continue', message: 'Press Enter to continue...' }]);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
// Prompt to select a webhook
|
|
170
|
+
const webhookAnswer = await safePrompt([
|
|
171
|
+
{
|
|
172
|
+
type: 'list',
|
|
173
|
+
name: 'selectedWebhook',
|
|
174
|
+
message: 'Select a webhook to view versions:',
|
|
175
|
+
choices: webhooks.map((webhook) => ({
|
|
176
|
+
name: `${webhook.name} (${webhook.webhookId})`,
|
|
177
|
+
value: webhook
|
|
178
|
+
}))
|
|
179
|
+
}
|
|
180
|
+
]);
|
|
181
|
+
if (!webhookAnswer)
|
|
182
|
+
return;
|
|
183
|
+
const selectedWebhook = webhookAnswer.selectedWebhook;
|
|
184
|
+
writeProgress(`🔄 Loading versions for ${selectedWebhook.name}...`);
|
|
185
|
+
try {
|
|
186
|
+
const response = await fetch(`${BASE_URLS.API}/developer/webhooks/${context.agentId}/${selectedWebhook.webhookId}/versions`, {
|
|
187
|
+
method: 'GET',
|
|
188
|
+
headers: {
|
|
189
|
+
'Authorization': `Bearer ${context.apiKey}`,
|
|
190
|
+
'Content-Type': 'application/json'
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
if (!response.ok) {
|
|
194
|
+
throw new Error(`HTTP error! status: ${response.status}`);
|
|
195
|
+
}
|
|
196
|
+
const data = await response.json();
|
|
197
|
+
const versions = data.data?.versions || data.versions || [];
|
|
198
|
+
const activeVersionId = data.data?.activeVersionId || data.activeVersionId;
|
|
199
|
+
if (versions.length === 0) {
|
|
200
|
+
console.log(`\nℹ️ No versions found for ${selectedWebhook.name}.\n`);
|
|
201
|
+
console.log("💡 Push a version first using 'lua push webhook'.\n");
|
|
202
|
+
await safePrompt([{ type: 'input', name: 'continue', message: 'Press Enter to continue...' }]);
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
console.log("\n" + "=".repeat(60));
|
|
206
|
+
console.log(`📜 Versions for ${selectedWebhook.name}`);
|
|
207
|
+
console.log("=".repeat(60) + "\n");
|
|
208
|
+
// Sort versions by date (newest first)
|
|
209
|
+
const sortedVersions = versions.sort((a, b) => {
|
|
210
|
+
const dateA = new Date(a.createdAt).getTime();
|
|
211
|
+
const dateB = new Date(b.createdAt).getTime();
|
|
212
|
+
return dateB - dateA;
|
|
213
|
+
});
|
|
214
|
+
sortedVersions.forEach((version, index) => {
|
|
215
|
+
const isActive = version.webhookId === activeVersionId;
|
|
216
|
+
const date = new Date(version.createdAt);
|
|
217
|
+
console.log(`${index + 1}. Version ${version.version}${isActive ? ' ⭐ DEPLOYED' : ''}`);
|
|
218
|
+
console.log(` Created: ${date.toLocaleString()}`);
|
|
219
|
+
console.log(` Version ID: ${version.webhookId}`);
|
|
220
|
+
console.log();
|
|
221
|
+
});
|
|
222
|
+
console.log("=".repeat(60) + "\n");
|
|
223
|
+
await safePrompt([{ type: 'input', name: 'continue', message: 'Press Enter to continue...' }]);
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
console.error('❌ Error loading versions:', error);
|
|
227
|
+
await safePrompt([{ type: 'input', name: 'continue', message: 'Press Enter to continue...' }]);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Deploy a webhook version to production
|
|
232
|
+
*/
|
|
233
|
+
async function deployWebhookVersion(context, config) {
|
|
234
|
+
const webhooks = config.webhooks || [];
|
|
235
|
+
if (webhooks.length === 0) {
|
|
236
|
+
console.log("\nℹ️ No webhooks found in configuration.\n");
|
|
237
|
+
await safePrompt([{ type: 'input', name: 'continue', message: 'Press Enter to continue...' }]);
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
// Prompt to select a webhook
|
|
241
|
+
const webhookAnswer = await safePrompt([
|
|
242
|
+
{
|
|
243
|
+
type: 'list',
|
|
244
|
+
name: 'selectedWebhook',
|
|
245
|
+
message: 'Select a webhook to deploy:',
|
|
246
|
+
choices: webhooks.map((webhook) => ({
|
|
247
|
+
name: `${webhook.name} (${webhook.webhookId})`,
|
|
248
|
+
value: webhook
|
|
249
|
+
}))
|
|
250
|
+
}
|
|
251
|
+
]);
|
|
252
|
+
if (!webhookAnswer)
|
|
253
|
+
return;
|
|
254
|
+
const selectedWebhook = webhookAnswer.selectedWebhook;
|
|
255
|
+
writeProgress(`🔄 Loading versions for ${selectedWebhook.name}...`);
|
|
256
|
+
try {
|
|
257
|
+
const webhookApi = new WebhookApi(BASE_URLS.API, context.apiKey, context.agentId);
|
|
258
|
+
const response = await webhookApi.getWebhookVersions(selectedWebhook.webhookId);
|
|
259
|
+
if (!response.success || !response.data) {
|
|
260
|
+
throw new Error(response.error?.message || 'Failed to fetch versions');
|
|
261
|
+
}
|
|
262
|
+
const versions = response.data.versions || [];
|
|
263
|
+
const activeVersionId = response.data.activeVersionId;
|
|
264
|
+
if (versions.length === 0) {
|
|
265
|
+
console.log(`\nℹ️ No versions found for ${selectedWebhook.name}.\n`);
|
|
266
|
+
console.log("💡 Push a version first using 'lua push webhook'.\n");
|
|
267
|
+
await safePrompt([{ type: 'input', name: 'continue', message: 'Press Enter to continue...' }]);
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
// Sort versions by date (newest first)
|
|
271
|
+
const sortedVersions = versions.sort((a, b) => {
|
|
272
|
+
const dateA = new Date(a.createdAt).getTime();
|
|
273
|
+
const dateB = new Date(b.createdAt).getTime();
|
|
274
|
+
return dateB - dateA;
|
|
275
|
+
});
|
|
276
|
+
// Prompt to select a version
|
|
277
|
+
const versionAnswer = await safePrompt([
|
|
278
|
+
{
|
|
279
|
+
type: 'list',
|
|
280
|
+
name: 'selectedVersion',
|
|
281
|
+
message: 'Select a version to deploy:',
|
|
282
|
+
choices: sortedVersions.map((version) => {
|
|
283
|
+
const isActive = version.webhookId === activeVersionId;
|
|
284
|
+
const date = new Date(version.createdAt);
|
|
285
|
+
return {
|
|
286
|
+
name: `Version ${version.version} (${date.toLocaleDateString()})${isActive ? ' ⭐ CURRENT' : ''}`,
|
|
287
|
+
value: version
|
|
288
|
+
};
|
|
289
|
+
})
|
|
290
|
+
}
|
|
291
|
+
]);
|
|
292
|
+
if (!versionAnswer)
|
|
293
|
+
return;
|
|
294
|
+
const selectedVersion = versionAnswer.selectedVersion;
|
|
295
|
+
// Show warning
|
|
296
|
+
console.log("\n⚠️ WARNING: You are about to deploy to PRODUCTION!");
|
|
297
|
+
console.log("⚠️ This will affect ALL users immediately.\n");
|
|
298
|
+
console.log(`Webhook: ${selectedWebhook.name}`);
|
|
299
|
+
console.log(`Version: ${selectedVersion.version}\n`);
|
|
300
|
+
const confirmAnswer = await safePrompt([
|
|
301
|
+
{
|
|
302
|
+
type: 'confirm',
|
|
303
|
+
name: 'confirm',
|
|
304
|
+
message: 'Are you absolutely sure you want to deploy this version?',
|
|
305
|
+
default: false
|
|
306
|
+
}
|
|
307
|
+
]);
|
|
308
|
+
if (!confirmAnswer || !confirmAnswer.confirm) {
|
|
309
|
+
console.log("\n❌ Deployment cancelled.\n");
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
writeProgress("🔄 Deploying version...");
|
|
313
|
+
// Reuse the same webhookApi instance
|
|
314
|
+
const deployResponse = await webhookApi.publishWebhookVersion(selectedWebhook.webhookId, selectedVersion.version);
|
|
315
|
+
if (!deployResponse.success) {
|
|
316
|
+
console.error(`\n❌ Deploy Error: ${deployResponse.error?.message || 'Unknown error'}\n`);
|
|
317
|
+
throw new Error(deployResponse.error?.message || 'Failed to publish webhook version');
|
|
318
|
+
}
|
|
319
|
+
writeSuccess(`\n✅ Version ${selectedVersion.version} of "${selectedWebhook.name}" deployed successfully to production\n`);
|
|
320
|
+
writeInfo("💡 The new version is now active for all users.");
|
|
321
|
+
await safePrompt([{ type: 'input', name: 'continue', message: 'Press Enter to continue...' }]);
|
|
322
|
+
}
|
|
323
|
+
catch (error) {
|
|
324
|
+
console.error('\n❌ Error deploying version:', error);
|
|
325
|
+
await safePrompt([{ type: 'input', name: 'continue', message: 'Press Enter to continue...' }]);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Activate a webhook
|
|
330
|
+
*/
|
|
331
|
+
async function activateWebhook(context, config) {
|
|
332
|
+
const webhooks = config.webhooks || [];
|
|
333
|
+
if (webhooks.length === 0) {
|
|
334
|
+
console.log("\nℹ️ No webhooks found in configuration.\n");
|
|
335
|
+
await safePrompt([{ type: 'input', name: 'continue', message: 'Press Enter to continue...' }]);
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
338
|
+
// Prompt to select a webhook
|
|
339
|
+
const webhookAnswer = await safePrompt([
|
|
340
|
+
{
|
|
341
|
+
type: 'list',
|
|
342
|
+
name: 'selectedWebhook',
|
|
343
|
+
message: 'Select a webhook to activate:',
|
|
344
|
+
choices: webhooks.map((webhook) => ({
|
|
345
|
+
name: `${webhook.name} (${webhook.webhookId})`,
|
|
346
|
+
value: webhook
|
|
347
|
+
}))
|
|
348
|
+
}
|
|
349
|
+
]);
|
|
350
|
+
if (!webhookAnswer)
|
|
351
|
+
return;
|
|
352
|
+
const selectedWebhook = webhookAnswer.selectedWebhook;
|
|
353
|
+
writeProgress(`🔄 Activating webhook "${selectedWebhook.name}"...`);
|
|
354
|
+
try {
|
|
355
|
+
const webhookApi = new WebhookApi(BASE_URLS.API, context.apiKey, context.agentId);
|
|
356
|
+
const response = await webhookApi.activateWebhook(selectedWebhook.webhookId);
|
|
357
|
+
if (!response.success) {
|
|
358
|
+
console.error(`\n❌ Error: ${response.error?.message || 'Unknown error'}\n`);
|
|
359
|
+
throw new Error(response.error?.message || 'Failed to activate webhook');
|
|
360
|
+
}
|
|
361
|
+
writeSuccess(`\n✅ Webhook "${selectedWebhook.name}" activated successfully\n`);
|
|
362
|
+
writeInfo("💡 The webhook is now enabled and can receive requests.");
|
|
363
|
+
await safePrompt([{ type: 'input', name: 'continue', message: 'Press Enter to continue...' }]);
|
|
364
|
+
}
|
|
365
|
+
catch (error) {
|
|
366
|
+
console.error('\n❌ Error activating webhook:', error);
|
|
367
|
+
await safePrompt([{ type: 'input', name: 'continue', message: 'Press Enter to continue...' }]);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Deactivate a webhook
|
|
372
|
+
*/
|
|
373
|
+
async function deactivateWebhook(context, config) {
|
|
374
|
+
const webhooks = config.webhooks || [];
|
|
375
|
+
if (webhooks.length === 0) {
|
|
376
|
+
console.log("\nℹ️ No webhooks found in configuration.\n");
|
|
377
|
+
await safePrompt([{ type: 'input', name: 'continue', message: 'Press Enter to continue...' }]);
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
// Prompt to select a webhook
|
|
381
|
+
const webhookAnswer = await safePrompt([
|
|
382
|
+
{
|
|
383
|
+
type: 'list',
|
|
384
|
+
name: 'selectedWebhook',
|
|
385
|
+
message: 'Select a webhook to deactivate:',
|
|
386
|
+
choices: webhooks.map((webhook) => ({
|
|
387
|
+
name: `${webhook.name} (${webhook.webhookId})`,
|
|
388
|
+
value: webhook
|
|
389
|
+
}))
|
|
390
|
+
}
|
|
391
|
+
]);
|
|
392
|
+
if (!webhookAnswer)
|
|
393
|
+
return;
|
|
394
|
+
const selectedWebhook = webhookAnswer.selectedWebhook;
|
|
395
|
+
// Confirm deactivation
|
|
396
|
+
const confirmAnswer = await safePrompt([
|
|
397
|
+
{
|
|
398
|
+
type: 'confirm',
|
|
399
|
+
name: 'confirm',
|
|
400
|
+
message: `Are you sure you want to deactivate "${selectedWebhook.name}"? It will stop receiving requests.`,
|
|
401
|
+
default: false
|
|
402
|
+
}
|
|
403
|
+
]);
|
|
404
|
+
if (!confirmAnswer || !confirmAnswer.confirm) {
|
|
405
|
+
console.log("\n❌ Deactivation cancelled.\n");
|
|
406
|
+
return;
|
|
407
|
+
}
|
|
408
|
+
writeProgress(`🔄 Deactivating webhook "${selectedWebhook.name}"...`);
|
|
409
|
+
try {
|
|
410
|
+
const webhookApi = new WebhookApi(BASE_URLS.API, context.apiKey, context.agentId);
|
|
411
|
+
const response = await webhookApi.deactivateWebhook(selectedWebhook.webhookId);
|
|
412
|
+
if (!response.success) {
|
|
413
|
+
console.error(`\n❌ Error: ${response.error?.message || 'Unknown error'}\n`);
|
|
414
|
+
throw new Error(response.error?.message || 'Failed to deactivate webhook');
|
|
415
|
+
}
|
|
416
|
+
writeSuccess(`\n✅ Webhook "${selectedWebhook.name}" deactivated successfully\n`);
|
|
417
|
+
writeInfo("💡 The webhook is now disabled and will not receive requests.");
|
|
418
|
+
await safePrompt([{ type: 'input', name: 'continue', message: 'Press Enter to continue...' }]);
|
|
419
|
+
}
|
|
420
|
+
catch (error) {
|
|
421
|
+
console.error('\n❌ Error deactivating webhook:', error);
|
|
422
|
+
await safePrompt([{ type: 'input', name: 'continue', message: 'Press Enter to continue...' }]);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Job Instance
|
|
3
|
+
* Provides a convenient interface for interacting with a job
|
|
4
|
+
*/
|
|
5
|
+
import JobApi from '../api/job.api.service.js';
|
|
6
|
+
import UserDataInstance from './user.instance.js';
|
|
7
|
+
/**
|
|
8
|
+
* Job Instance class.
|
|
9
|
+
* Represents a single job with helper methods for common operations.
|
|
10
|
+
*
|
|
11
|
+
* This class provides:
|
|
12
|
+
* - Direct property access to job data via Proxy
|
|
13
|
+
* - Helper methods for job operations (delete, updateMetadata)
|
|
14
|
+
* - Metadata access and modification
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* const job = await Jobs.create({
|
|
19
|
+
* name: 'my-job',
|
|
20
|
+
* schedule: { type: 'once', executeAt: new Date() },
|
|
21
|
+
* execute: async (job) => {
|
|
22
|
+
* // Access metadata
|
|
23
|
+
* console.log(job.metadata);
|
|
24
|
+
*
|
|
25
|
+
* // Update metadata
|
|
26
|
+
* await job.updateMetadata({ processed: true });
|
|
27
|
+
*
|
|
28
|
+
* // Delete job when done
|
|
29
|
+
* await job.delete();
|
|
30
|
+
* }
|
|
31
|
+
* });
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare class JobInstance {
|
|
35
|
+
private jobApi;
|
|
36
|
+
private _data;
|
|
37
|
+
readonly id: string;
|
|
38
|
+
readonly name: string;
|
|
39
|
+
readonly jobId: string;
|
|
40
|
+
readonly schedule: any;
|
|
41
|
+
metadata: Record<string, any>;
|
|
42
|
+
private userApi;
|
|
43
|
+
constructor(jobApi: JobApi, jobData: any);
|
|
44
|
+
/**
|
|
45
|
+
* Gets the full job data.
|
|
46
|
+
*/
|
|
47
|
+
get data(): any;
|
|
48
|
+
/**
|
|
49
|
+
* Updates the job's metadata.
|
|
50
|
+
*
|
|
51
|
+
* @param metadata - The new metadata to set
|
|
52
|
+
* @returns Promise resolving when update is complete
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```typescript
|
|
56
|
+
* await job.updateMetadata({
|
|
57
|
+
* lastProcessed: new Date().toISOString(),
|
|
58
|
+
* status: 'completed'
|
|
59
|
+
* });
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
updateMetadata(metadata: Record<string, any>): Promise<void>;
|
|
63
|
+
/**
|
|
64
|
+
* Deletes the job from the backend.
|
|
65
|
+
*
|
|
66
|
+
* @returns Promise resolving when deletion is complete
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```typescript
|
|
70
|
+
* // Delete a one-time job after it completes
|
|
71
|
+
* await job.delete();
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
delete(): Promise<void>;
|
|
75
|
+
user(): Promise<UserDataInstance>;
|
|
76
|
+
/**
|
|
77
|
+
* Converts the job instance to JSON.
|
|
78
|
+
*/
|
|
79
|
+
toJSON(): any;
|
|
80
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Job Instance
|
|
3
|
+
* Provides a convenient interface for interacting with a job
|
|
4
|
+
*/
|
|
5
|
+
import UserDataInstance from './user.instance.js';
|
|
6
|
+
import UserDataApi from '../api/user.data.api.service.js';
|
|
7
|
+
import { BASE_URLS } from '../config/constants.js';
|
|
8
|
+
/**
|
|
9
|
+
* Job Instance class.
|
|
10
|
+
* Represents a single job with helper methods for common operations.
|
|
11
|
+
*
|
|
12
|
+
* This class provides:
|
|
13
|
+
* - Direct property access to job data via Proxy
|
|
14
|
+
* - Helper methods for job operations (delete, updateMetadata)
|
|
15
|
+
* - Metadata access and modification
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* const job = await Jobs.create({
|
|
20
|
+
* name: 'my-job',
|
|
21
|
+
* schedule: { type: 'once', executeAt: new Date() },
|
|
22
|
+
* execute: async (job) => {
|
|
23
|
+
* // Access metadata
|
|
24
|
+
* console.log(job.metadata);
|
|
25
|
+
*
|
|
26
|
+
* // Update metadata
|
|
27
|
+
* await job.updateMetadata({ processed: true });
|
|
28
|
+
*
|
|
29
|
+
* // Delete job when done
|
|
30
|
+
* await job.delete();
|
|
31
|
+
* }
|
|
32
|
+
* });
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export class JobInstance {
|
|
36
|
+
constructor(jobApi, jobData) {
|
|
37
|
+
this.jobApi = jobApi;
|
|
38
|
+
this._data = jobData;
|
|
39
|
+
this.id = jobData.id || jobData.jobId;
|
|
40
|
+
this.jobId = jobData.id || jobData.jobId;
|
|
41
|
+
this.name = jobData.name;
|
|
42
|
+
this.schedule = jobData.schedule;
|
|
43
|
+
this.metadata = jobData.metadata || {};
|
|
44
|
+
this.userApi = new UserDataApi(BASE_URLS.API, jobApi.apiKey, jobApi.agentId);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Gets the full job data.
|
|
48
|
+
*/
|
|
49
|
+
get data() {
|
|
50
|
+
return this._data;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Updates the job's metadata.
|
|
54
|
+
*
|
|
55
|
+
* @param metadata - The new metadata to set
|
|
56
|
+
* @returns Promise resolving when update is complete
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* ```typescript
|
|
60
|
+
* await job.updateMetadata({
|
|
61
|
+
* lastProcessed: new Date().toISOString(),
|
|
62
|
+
* status: 'completed'
|
|
63
|
+
* });
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
async updateMetadata(metadata) {
|
|
67
|
+
this.metadata = { ...this.metadata, ...metadata };
|
|
68
|
+
const result = await this.jobApi.updateMetadata(this.jobId, this.metadata);
|
|
69
|
+
if (!result.success) {
|
|
70
|
+
throw new Error(result.error?.message || 'Failed to update job metadata');
|
|
71
|
+
}
|
|
72
|
+
return result.data;
|
|
73
|
+
// Update metadata on the server if the job has versions
|
|
74
|
+
// Note: Metadata updates may require updating the active version
|
|
75
|
+
// For now, we just update the local instance
|
|
76
|
+
// In the future, this could call an API endpoint to update job metadata
|
|
77
|
+
console.warn('Note: Job metadata updates are stored locally. Deploy a new version to persist changes.');
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Deletes the job from the backend.
|
|
81
|
+
*
|
|
82
|
+
* @returns Promise resolving when deletion is complete
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* ```typescript
|
|
86
|
+
* // Delete a one-time job after it completes
|
|
87
|
+
* await job.delete();
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
async delete() {
|
|
91
|
+
const result = await this.jobApi.deleteJob(this.jobId);
|
|
92
|
+
if (!result.success) {
|
|
93
|
+
throw new Error(result.error?.message || 'Failed to delete job');
|
|
94
|
+
}
|
|
95
|
+
if (result.data?.deactivated) {
|
|
96
|
+
console.warn(`Job "${this.name}" has versions and was deactivated instead of deleted.`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async user() {
|
|
100
|
+
const result = await this.userApi.get();
|
|
101
|
+
return new UserDataInstance(this.userApi, result);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Converts the job instance to JSON.
|
|
105
|
+
*/
|
|
106
|
+
toJSON() {
|
|
107
|
+
return {
|
|
108
|
+
id: this.id,
|
|
109
|
+
jobId: this.jobId,
|
|
110
|
+
name: this.name,
|
|
111
|
+
schedule: this.schedule,
|
|
112
|
+
metadata: this.metadata,
|
|
113
|
+
...this._data
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
}
|
|
@@ -158,4 +158,13 @@ export default class UserDataInstance {
|
|
|
158
158
|
throw new Error('Failed to send message');
|
|
159
159
|
}
|
|
160
160
|
}
|
|
161
|
+
//get chat history
|
|
162
|
+
async getChatHistory() {
|
|
163
|
+
try {
|
|
164
|
+
return await this.userAPI.getChatHistory();
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
throw new Error('Failed to get chat history');
|
|
168
|
+
}
|
|
169
|
+
}
|
|
161
170
|
}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Base URLs for the API, Auth, and Chat - Production
|
|
3
3
|
*/
|
|
4
|
+
/**
|
|
5
|
+
* Base URLs for the API, Auth, and Chat - Development
|
|
6
|
+
*/
|
|
4
7
|
export declare const BASE_URLS: {
|
|
5
8
|
readonly API: "https://api.heylua.ai";
|
|
6
9
|
readonly AUTH: "https://auth.heylua.ai";
|
|
7
10
|
readonly CHAT: "https://api.heylua.ai";
|
|
11
|
+
readonly WEBHOOK: "https://webhook.heylua.ai";
|
|
8
12
|
};
|
|
9
|
-
/**
|
|
10
|
-
* Base URLs for the API, Auth, and Chat - Development
|
|
11
|
-
*/
|