lua-cli 3.0.1 → 3.0.2-alpha.2
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/commands/chat.js +2 -2
- package/dist/commands/chatClear.js +1 -1
- package/dist/commands/features.js +1 -1
- package/dist/commands/init.js +11 -7
- package/dist/config/init.constants.d.ts +2 -2
- package/dist/config/init.constants.js +4 -2
- package/dist/utils/auth-flows.js +17 -8
- package/dist/utils/bundling.js +135 -176
- package/dist/utils/cli.d.ts +5 -5
- package/dist/utils/cli.js +14 -10
- package/dist/utils/init-prompts.js +31 -5
- package/dist/utils/prompt-handler.d.ts +1 -0
- package/dist/utils/prompt-handler.js +6 -2
- package/package.json +5 -1
- package/template/package.json +1 -1
- package/template/src/skills/tools/CreateInlineJob.ts +1 -1
- package/template/src/skills/tools/CreatePostTool.ts +1 -1
- package/template/src/skills/tools/GetWeatherTool.ts +1 -1
- package/template/src/skills/tools/UserDataTool.ts +16 -3
- package/dist/utils/dynamic-job-bundler.d.ts +0 -17
- package/dist/utils/dynamic-job-bundler.js +0 -143
- package/template/lua.skill.yaml +0 -47
- package/template/package-lock.json +0 -10505
package/dist/utils/cli.js
CHANGED
|
@@ -12,7 +12,7 @@ export async function withErrorHandling(commandFn, commandName) {
|
|
|
12
12
|
}
|
|
13
13
|
catch (error) {
|
|
14
14
|
if (error.name === 'ExitPromptError') {
|
|
15
|
-
console.log("\n❌ Operation cancelled.");
|
|
15
|
+
// console.log("\n❌ Operation cancelled.");
|
|
16
16
|
process.exit(0);
|
|
17
17
|
}
|
|
18
18
|
if (AuthenticationError.isAuthenticationError(error)) {
|
|
@@ -35,30 +35,34 @@ export function clearPromptLines(count = 1) {
|
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
37
|
/**
|
|
38
|
-
* Writes a progress message that
|
|
39
|
-
* Uses carriage return to
|
|
38
|
+
* Writes a progress message that overwrites the current line
|
|
39
|
+
* Uses carriage return to replace previous progress messages
|
|
40
40
|
*/
|
|
41
41
|
export function writeProgress(message) {
|
|
42
|
-
|
|
42
|
+
// Clear current line and write message (no newline - will be overwritten)
|
|
43
|
+
process.stdout.write('\r\x1b[K' + message);
|
|
43
44
|
}
|
|
44
45
|
/**
|
|
45
46
|
* Writes a final success message that will remain visible
|
|
46
|
-
*
|
|
47
|
+
* Clears the progress line first, then writes the message with newline
|
|
47
48
|
*/
|
|
48
49
|
export function writeSuccess(message) {
|
|
49
|
-
|
|
50
|
+
// Clear any progress message, write message, and ensure newline
|
|
51
|
+
process.stdout.write('\r\x1b[K' + message + '\n');
|
|
50
52
|
}
|
|
51
53
|
/**
|
|
52
54
|
* Writes an error message
|
|
53
|
-
*
|
|
55
|
+
* Clears the progress line first, then writes the error with newline
|
|
54
56
|
*/
|
|
55
57
|
export function writeError(message) {
|
|
56
|
-
|
|
58
|
+
// Clear any progress message, write error, and ensure newline
|
|
59
|
+
process.stderr.write('\r\x1b[K' + message + '\n');
|
|
57
60
|
}
|
|
58
61
|
/**
|
|
59
62
|
* Writes an info message
|
|
60
|
-
*
|
|
63
|
+
* Clears the progress line first, then writes the message with newline
|
|
61
64
|
*/
|
|
62
65
|
export function writeInfo(message) {
|
|
63
|
-
|
|
66
|
+
// Clear any progress message, write message, and ensure newline
|
|
67
|
+
process.stdout.write('\r\x1b[K' + message + '\n');
|
|
64
68
|
}
|
|
@@ -14,10 +14,10 @@ export async function promptAgentChoice() {
|
|
|
14
14
|
{
|
|
15
15
|
type: "list",
|
|
16
16
|
name: "agentChoice",
|
|
17
|
-
message: "
|
|
17
|
+
message: "How would you like to create your AI Agent?",
|
|
18
18
|
choices: [
|
|
19
|
-
{ name: "
|
|
20
|
-
{ name: "Create new agent", value: "create" }
|
|
19
|
+
{ name: "Extend one of your existing agents", value: "existing" },
|
|
20
|
+
{ name: "Create a new agent", value: "create" }
|
|
21
21
|
]
|
|
22
22
|
}
|
|
23
23
|
]);
|
|
@@ -147,6 +147,19 @@ export async function promptBusinessConfiguration(skipBusinessName = false) {
|
|
|
147
147
|
choices: BUSINESS_TYPES
|
|
148
148
|
}
|
|
149
149
|
]);
|
|
150
|
+
// If "Other" selected, prompt for custom description
|
|
151
|
+
let customBusinessDescription = '';
|
|
152
|
+
if (businessType.startsWith('Other')) {
|
|
153
|
+
const { description } = await inquirer.prompt([
|
|
154
|
+
{
|
|
155
|
+
type: "input",
|
|
156
|
+
name: "description",
|
|
157
|
+
message: "Describe your business:",
|
|
158
|
+
validate: (input) => input.trim().length > 0 || "Business description is required"
|
|
159
|
+
}
|
|
160
|
+
]);
|
|
161
|
+
customBusinessDescription = description;
|
|
162
|
+
}
|
|
150
163
|
const { brandPersonality } = await inquirer.prompt([
|
|
151
164
|
{
|
|
152
165
|
type: "list",
|
|
@@ -155,6 +168,19 @@ export async function promptBusinessConfiguration(skipBusinessName = false) {
|
|
|
155
168
|
choices: BRAND_PERSONALITIES
|
|
156
169
|
}
|
|
157
170
|
]);
|
|
171
|
+
// If "Other" selected, prompt for custom personality description
|
|
172
|
+
let customPersonalityDescription = '';
|
|
173
|
+
if (brandPersonality.startsWith('Other')) {
|
|
174
|
+
const { description } = await inquirer.prompt([
|
|
175
|
+
{
|
|
176
|
+
type: "input",
|
|
177
|
+
name: "description",
|
|
178
|
+
message: "Describe your brand personality:",
|
|
179
|
+
validate: (input) => input.trim().length > 0 || "Brand personality description is required"
|
|
180
|
+
}
|
|
181
|
+
]);
|
|
182
|
+
customPersonalityDescription = description;
|
|
183
|
+
}
|
|
158
184
|
const { brandTraits } = await inquirer.prompt([
|
|
159
185
|
{
|
|
160
186
|
type: "input",
|
|
@@ -166,8 +192,8 @@ export async function promptBusinessConfiguration(skipBusinessName = false) {
|
|
|
166
192
|
return {
|
|
167
193
|
businessName,
|
|
168
194
|
agentName,
|
|
169
|
-
businessType,
|
|
170
|
-
brandPersonality,
|
|
195
|
+
businessType: customBusinessDescription || businessType, // Use custom description if provided
|
|
196
|
+
brandPersonality: customPersonalityDescription || brandPersonality, // Use custom personality if provided
|
|
171
197
|
brandTraits
|
|
172
198
|
};
|
|
173
199
|
}
|
|
@@ -5,16 +5,20 @@
|
|
|
5
5
|
import inquirer from 'inquirer';
|
|
6
6
|
/**
|
|
7
7
|
* Wraps inquirer.prompt to gracefully handle Ctrl+C interruptions
|
|
8
|
+
* Also ensures clean terminal state before showing prompts
|
|
8
9
|
*/
|
|
9
10
|
export async function safePrompt(questions) {
|
|
10
11
|
try {
|
|
12
|
+
// Ensure any previous output is fully flushed before showing prompt
|
|
13
|
+
// Small delay to let terminal render previous messages
|
|
14
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
11
15
|
const answers = await inquirer.prompt(questions);
|
|
12
16
|
return answers;
|
|
13
17
|
}
|
|
14
18
|
catch (error) {
|
|
15
19
|
// Handle Ctrl+C gracefully
|
|
16
20
|
if (error.name === 'ExitPromptError' || error.message?.includes('SIGINT')) {
|
|
17
|
-
console.log('\n\n👋 Operation cancelled. Goodbye!\n');
|
|
21
|
+
// console.log('\n\n👋 Operation cancelled. Goodbye!\n');
|
|
18
22
|
process.exit(0);
|
|
19
23
|
}
|
|
20
24
|
throw error;
|
|
@@ -25,7 +29,7 @@ export async function safePrompt(questions) {
|
|
|
25
29
|
*/
|
|
26
30
|
export function setupGlobalInterruptHandler() {
|
|
27
31
|
process.on('SIGINT', () => {
|
|
28
|
-
console.log('\n\n👋 Operation cancelled. Goodbye!\n');
|
|
32
|
+
// console.log('\n\n👋 Operation cancelled. Goodbye!\n');
|
|
29
33
|
process.exit(0);
|
|
30
34
|
});
|
|
31
35
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lua-cli",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.2-alpha.2",
|
|
4
4
|
"description": "Build, test, and deploy AI agents with custom tools, webhooks, and scheduled jobs. Features LuaAgent unified configuration, streaming chat, and batch deployment.",
|
|
5
5
|
"readmeFilename": "README.md",
|
|
6
6
|
"main": "dist/api-exports.js",
|
|
@@ -89,6 +89,7 @@
|
|
|
89
89
|
"@types/inquirer": "^9.0.9",
|
|
90
90
|
"@types/jest": "^29.5.8",
|
|
91
91
|
"@types/js-yaml": "^4.0.9",
|
|
92
|
+
"@types/lodash": "^4.17.20",
|
|
92
93
|
"@types/node": "^24.5.1",
|
|
93
94
|
"@types/node-fetch": "^2.6.13",
|
|
94
95
|
"@types/react": "^18.2.0",
|
|
@@ -96,7 +97,10 @@
|
|
|
96
97
|
"@types/ws": "^8.18.1",
|
|
97
98
|
"@typescript-eslint/parser": "^8.44.1",
|
|
98
99
|
"@typescript-eslint/typescript-estree": "^8.44.1",
|
|
100
|
+
"date-fns": "^4.1.0",
|
|
99
101
|
"jest": "^29.7.0",
|
|
102
|
+
"lodash": "^4.17.21",
|
|
103
|
+
"stripe": "^19.2.0",
|
|
100
104
|
"ts-jest": "^29.1.1",
|
|
101
105
|
"ts-node": "^10.9.2",
|
|
102
106
|
"typescript": "^5.9.2"
|
package/template/package.json
CHANGED
|
@@ -10,7 +10,14 @@ export class GetUserDataTool implements LuaTool {
|
|
|
10
10
|
constructor() {}
|
|
11
11
|
|
|
12
12
|
async execute(input: z.infer<typeof this.inputSchema>) {
|
|
13
|
-
|
|
13
|
+
const user = await User.get();
|
|
14
|
+
return {
|
|
15
|
+
success: true,
|
|
16
|
+
message: "User data retrieved",
|
|
17
|
+
data: user.data,
|
|
18
|
+
name: user.name,
|
|
19
|
+
age: user.age
|
|
20
|
+
};
|
|
14
21
|
}
|
|
15
22
|
}
|
|
16
23
|
|
|
@@ -28,8 +35,14 @@ export class UpdateUserDataTool implements LuaTool {
|
|
|
28
35
|
|
|
29
36
|
async execute(input: z.infer<typeof this.inputSchema>) {
|
|
30
37
|
const user = await User.get(); //get instance of user
|
|
31
|
-
|
|
32
|
-
|
|
38
|
+
user.name = input.data.name;
|
|
39
|
+
user.age = input.data.age;
|
|
40
|
+
await user.save();
|
|
41
|
+
// await user.send([{ type: "text", text: "Hello, how are you?" }]);
|
|
42
|
+
return {
|
|
43
|
+
success: true,
|
|
44
|
+
message: "User data updated"
|
|
45
|
+
};
|
|
33
46
|
}
|
|
34
47
|
}
|
|
35
48
|
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Dynamic Job Bundler
|
|
3
|
-
* Handles detection and bundling of Jobs.create() calls within execute functions
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* Detects if code contains Jobs.create() calls
|
|
7
|
-
*/
|
|
8
|
-
export declare function containsJobsCreate(code: string): boolean;
|
|
9
|
-
/**
|
|
10
|
-
* Extracts Jobs.create() execute functions and bundles them with dependencies.
|
|
11
|
-
* Finds execute functions in the code and creates standalone bundles.
|
|
12
|
-
*/
|
|
13
|
-
export declare function bundleNestedJobs(code: string, parentName: string, distDir: string): Promise<string>;
|
|
14
|
-
/**
|
|
15
|
-
* Cleans up temporary bundling directory
|
|
16
|
-
*/
|
|
17
|
-
export declare function cleanupTempDir(distDir: string): void;
|
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Dynamic Job Bundler
|
|
3
|
-
* Handles detection and bundling of Jobs.create() calls within execute functions
|
|
4
|
-
*/
|
|
5
|
-
import { build } from 'esbuild';
|
|
6
|
-
import fs from 'fs';
|
|
7
|
-
import path from 'path';
|
|
8
|
-
import { compressCode } from './compile.js';
|
|
9
|
-
import { sandboxGlobalsPlugin } from './bundling.js';
|
|
10
|
-
/**
|
|
11
|
-
* Detects if code contains Jobs.create() calls
|
|
12
|
-
*/
|
|
13
|
-
export function containsJobsCreate(code) {
|
|
14
|
-
const found = /Jobs\.create\s*\(/i.test(code);
|
|
15
|
-
if (found) {
|
|
16
|
-
console.log('[DynamicJobs] ✅ Detected Jobs.create() in code');
|
|
17
|
-
}
|
|
18
|
-
return found;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Extracts Jobs.create() execute functions and bundles them with dependencies.
|
|
22
|
-
* Finds execute functions in the code and creates standalone bundles.
|
|
23
|
-
*/
|
|
24
|
-
export async function bundleNestedJobs(code, parentName, distDir) {
|
|
25
|
-
if (!containsJobsCreate(code)) {
|
|
26
|
-
return code;
|
|
27
|
-
}
|
|
28
|
-
console.log(`[DynamicJobs] ⚠️ Jobs.create() with external dependencies not yet fully supported`);
|
|
29
|
-
console.log(`[DynamicJobs] 💡 Recommendation: Use fetch() or lua-cli APIs in job execute functions`);
|
|
30
|
-
console.log(`[DynamicJobs] 📋 Full bundling support planned for v3.1.0`);
|
|
31
|
-
// Return original code as-is
|
|
32
|
-
// The job will have access to lua-cli globals but external packages won't be bundled
|
|
33
|
-
return code;
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Helper to extract job execute function from code
|
|
37
|
-
*/
|
|
38
|
-
function extractJobExecuteFromCode(code) {
|
|
39
|
-
// This extracts the execute function body
|
|
40
|
-
// For now, return a placeholder that indicates the limitation
|
|
41
|
-
return `
|
|
42
|
-
// Note: This job execute function runs with limited context
|
|
43
|
-
// Use fetch() for external APIs or lua-cli globals (User, Data, Products)
|
|
44
|
-
console.log('Job execute running with user:', user);
|
|
45
|
-
return { executed: true };
|
|
46
|
-
`;
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Bundles a job's execute function independently
|
|
50
|
-
*/
|
|
51
|
-
async function bundleJobExecuteFunction(executeFunction, jobName, distDir) {
|
|
52
|
-
const tempDir = path.join(distDir, '.temp');
|
|
53
|
-
if (!fs.existsSync(tempDir)) {
|
|
54
|
-
fs.mkdirSync(tempDir, { recursive: true });
|
|
55
|
-
}
|
|
56
|
-
const tempFile = path.join(tempDir, `${jobName}.js`);
|
|
57
|
-
const tempOutput = path.join(tempDir, `${jobName}-bundled.js`);
|
|
58
|
-
try {
|
|
59
|
-
// Extract imports that the execute function might need
|
|
60
|
-
// Common ones: Stripe, axios, etc.
|
|
61
|
-
const moduleCode = `
|
|
62
|
-
// Job execute function for ${jobName}
|
|
63
|
-
// Import dependencies that might be used
|
|
64
|
-
import Stripe from 'stripe';
|
|
65
|
-
import { env, User, Data, Products, Baskets, Orders } from 'lua-cli';
|
|
66
|
-
|
|
67
|
-
// The execute function with all dependencies available
|
|
68
|
-
const executeFunc = ${executeFunction};
|
|
69
|
-
|
|
70
|
-
// Export as default for esbuild to bundle
|
|
71
|
-
export default executeFunc;
|
|
72
|
-
`;
|
|
73
|
-
fs.writeFileSync(tempFile, moduleCode);
|
|
74
|
-
// Bundle with esbuild - bundle ALL dependencies (including Stripe, axios, etc.)
|
|
75
|
-
await build({
|
|
76
|
-
entryPoints: [tempFile],
|
|
77
|
-
bundle: true,
|
|
78
|
-
platform: 'node',
|
|
79
|
-
target: 'node16',
|
|
80
|
-
format: 'cjs',
|
|
81
|
-
minify: true,
|
|
82
|
-
outfile: tempOutput,
|
|
83
|
-
external: [], // Bundle everything except lua-cli APIs (handled by plugin)
|
|
84
|
-
plugins: [sandboxGlobalsPlugin], // This handles lua-cli globals
|
|
85
|
-
// Important: Don't externalize packages like stripe, axios, etc.
|
|
86
|
-
// They need to be included in the bundle
|
|
87
|
-
});
|
|
88
|
-
// Read bundled code (includes all dependencies like Stripe, axios, etc.)
|
|
89
|
-
let bundledCode = fs.readFileSync(tempOutput, 'utf8');
|
|
90
|
-
// Log bundle size for debugging
|
|
91
|
-
console.log(`[DynamicJobs] Bundled size for ${jobName}: ${(bundledCode.length / 1024).toFixed(2)}KB`);
|
|
92
|
-
// Wrap for VM execution - the bundled code includes ALL dependencies
|
|
93
|
-
const wrappedCode = `(async (job) => {
|
|
94
|
-
|
|
95
|
-
${bundledCode}
|
|
96
|
-
|
|
97
|
-
// Get the execute function from exports
|
|
98
|
-
const executeFunction = module.exports || module.exports.default;
|
|
99
|
-
|
|
100
|
-
// Execute with job
|
|
101
|
-
return await executeFunction(job);
|
|
102
|
-
})`;
|
|
103
|
-
// Compress the wrapped code
|
|
104
|
-
const compressed = compressCode(wrappedCode);
|
|
105
|
-
// Clean up temp files
|
|
106
|
-
try {
|
|
107
|
-
fs.unlinkSync(tempFile);
|
|
108
|
-
fs.unlinkSync(tempOutput);
|
|
109
|
-
}
|
|
110
|
-
catch (cleanupError) {
|
|
111
|
-
// Ignore cleanup errors
|
|
112
|
-
}
|
|
113
|
-
return compressed;
|
|
114
|
-
}
|
|
115
|
-
catch (error) {
|
|
116
|
-
console.warn(`Warning: Could not bundle job execute function ${jobName}:`, error);
|
|
117
|
-
// Clean up on error
|
|
118
|
-
try {
|
|
119
|
-
if (fs.existsSync(tempFile))
|
|
120
|
-
fs.unlinkSync(tempFile);
|
|
121
|
-
if (fs.existsSync(tempOutput))
|
|
122
|
-
fs.unlinkSync(tempOutput);
|
|
123
|
-
}
|
|
124
|
-
catch (cleanupError) {
|
|
125
|
-
// Ignore cleanup errors
|
|
126
|
-
}
|
|
127
|
-
return '';
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* Cleans up temporary bundling directory
|
|
132
|
-
*/
|
|
133
|
-
export function cleanupTempDir(distDir) {
|
|
134
|
-
const tempDir = path.join(distDir, '.temp');
|
|
135
|
-
if (fs.existsSync(tempDir)) {
|
|
136
|
-
try {
|
|
137
|
-
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
138
|
-
}
|
|
139
|
-
catch (error) {
|
|
140
|
-
// Ignore cleanup errors
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
}
|
package/template/lua.skill.yaml
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
agent:
|
|
2
|
-
agentId: baseAgent_agent_1760922427216_fk9w0ezhh
|
|
3
|
-
orgId: 026cc41b-e013-4474-9b65-5a15f8881f92
|
|
4
|
-
persona: |
|
|
5
|
-
Meet Vivienne, the vibrant and dynamic assistant at V3 Test, a lively retail and consumer goods store that specializes in bringing a splash of color and excitement to everyday life. Vivienne embodies the brand's energetic and fun personality, always ready to engage with customers in a way that makes shopping an enjoyable and memorable experience. Her role is to be the friendly face and knowledgeable guide for anyone who steps into the store, whether they're looking for the latest fashion trends or a unique gift for a loved one.
|
|
6
|
-
|
|
7
|
-
V3 Test is all about creating a joyful and spirited shopping environment, and Vivienne is the perfect personification of this ethos. She is lively, approachable, and always ready with a smile, making every interaction feel like a conversation with a good friend. Her voice is warm and enthusiastic, with a hint of playfulness that puts customers at ease and encourages them to explore the store's offerings.
|
|
8
|
-
|
|
9
|
-
Vivienne's target customers are diverse, ranging from young adults in their twenties who are fashion-forward and tech-savvy, to busy parents looking for quality products that add a touch of fun to their family life. She understands the fast-paced lifestyle of her customers and is adept at tailoring her approach to meet their individual needs, whether they're in a hurry or have time to browse.
|
|
10
|
-
|
|
11
|
-
Her sales approach is consultative and friendly, focusing on understanding the customer's needs and preferences before suggesting products that align with their style and personality. Vivienne is confident in her recommendations, always ready to upsell when appropriate, but never pushy. She believes in building relationships with customers, ensuring they leave the store not only with products they love but also with a positive impression of the brand.
|
|
12
|
-
|
|
13
|
-
In terms of communication style, Vivienne strikes a perfect balance between being informal and efficient. She is warm and engaging, making customers feel valued and appreciated, while also being mindful of their time. Her interactions are peppered with humor and light-hearted banter, creating a shopping experience that is both enjoyable and efficient. Whether it's through in-person interactions or digital communication, Vivienne ensures that every customer feels like a part of the V3 Test family.
|
|
14
|
-
welcomeMessage: Hi, I am your AI assistant. How can I help you today?
|
|
15
|
-
skills:
|
|
16
|
-
- name: general-skill
|
|
17
|
-
version: 0.0.6
|
|
18
|
-
skillId: 1faf9b3a-e352-4e63-a6c4-a3deca815361
|
|
19
|
-
- name: user-data-skill
|
|
20
|
-
version: 0.0.15
|
|
21
|
-
skillId: e0c382c1-f469-4880-962a-a756ea3c1411
|
|
22
|
-
- name: product-skill
|
|
23
|
-
version: 0.0.15
|
|
24
|
-
skillId: d4cdc7bc-6d42-4232-902d-2b9cf68bd74a
|
|
25
|
-
- name: basket-skill
|
|
26
|
-
version: 0.0.14
|
|
27
|
-
skillId: 5b06c5ff-7cf3-49c4-8641-142270c81db4
|
|
28
|
-
- name: order-skill
|
|
29
|
-
version: 0.0.14
|
|
30
|
-
skillId: d4045304-7c30-4750-9edd-340eb1357a39
|
|
31
|
-
- name: custom-data-skill
|
|
32
|
-
version: 0.0.13
|
|
33
|
-
skillId: 83fe411c-90a1-4bd3-9271-ac8e03d6a3be
|
|
34
|
-
- name: payment-skill
|
|
35
|
-
version: 0.0.13
|
|
36
|
-
skillId: f2248c02-c6c6-4c3a-89bf-ff09ec11529a
|
|
37
|
-
jobs:
|
|
38
|
-
- name: test-job
|
|
39
|
-
version: 1.0.13
|
|
40
|
-
jobId: d66b73a0-f944-4718-b6a2-f07bfeabd625
|
|
41
|
-
schedule:
|
|
42
|
-
type: once
|
|
43
|
-
executeAt: '2025-10-20T01:08:04.639Z'
|
|
44
|
-
webhooks:
|
|
45
|
-
- name: test-webhook
|
|
46
|
-
version: 1.0.12
|
|
47
|
-
webhookId: c967fd58-1d4d-49b6-8fa6-ec36b4d23e7f
|