lua-cli 3.2.0 → 3.4.0
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/logs.api.service.d.ts +1 -1
- package/dist/api/logs.api.service.js.map +1 -1
- package/dist/api/products.api.service.d.ts +17 -5
- package/dist/api/products.api.service.js +21 -9
- package/dist/api/products.api.service.js.map +1 -1
- package/dist/api/webhook.api.service.d.ts +4 -0
- package/dist/api/webhook.api.service.js.map +1 -1
- package/dist/api-exports.d.ts +19 -7
- package/dist/api-exports.js +20 -5
- package/dist/api-exports.js.map +1 -1
- package/dist/cli/command-definitions.js +323 -88
- package/dist/cli/command-definitions.js.map +1 -1
- package/dist/commands/apiKey.d.ts +5 -2
- package/dist/commands/apiKey.js +8 -2
- package/dist/commands/apiKey.js.map +1 -1
- package/dist/commands/channels.d.ts +4 -9
- package/dist/commands/channels.js +140 -84
- package/dist/commands/channels.js.map +1 -1
- package/dist/commands/chat.d.ts +4 -2
- package/dist/commands/chat.js +126 -32
- package/dist/commands/chat.js.map +1 -1
- package/dist/commands/chatClear.d.ts +3 -2
- package/dist/commands/chatClear.js +16 -15
- package/dist/commands/chatClear.js.map +1 -1
- package/dist/commands/compile.d.ts +5 -4
- package/dist/commands/compile.js +73 -9
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/deploy.d.ts +5 -24
- package/dist/commands/deploy.js +75 -48
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/destroy.d.ts +5 -2
- package/dist/commands/destroy.js +14 -2
- package/dist/commands/destroy.js.map +1 -1
- package/dist/commands/env.d.ts +3 -1
- package/dist/commands/env.js +322 -122
- package/dist/commands/env.js.map +1 -1
- package/dist/commands/features.d.ts +5 -9
- package/dist/commands/features.js +249 -129
- package/dist/commands/features.js.map +1 -1
- package/dist/commands/init.d.ts +7 -1
- package/dist/commands/init.js +242 -59
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/jobs.d.ts +5 -13
- package/dist/commands/jobs.js +523 -360
- package/dist/commands/jobs.js.map +1 -1
- package/dist/commands/logs.d.ts +5 -10
- package/dist/commands/logs.js +259 -103
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/marketplace.d.ts +23 -2
- package/dist/commands/marketplace.js +530 -7
- package/dist/commands/marketplace.js.map +1 -1
- package/dist/commands/mcp.d.ts +5 -11
- package/dist/commands/mcp.js +304 -294
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/persona.d.ts +5 -9
- package/dist/commands/persona.js +349 -232
- package/dist/commands/persona.js.map +1 -1
- package/dist/commands/postprocessors.d.ts +6 -2
- package/dist/commands/postprocessors.js +387 -280
- package/dist/commands/postprocessors.js.map +1 -1
- package/dist/commands/preprocessors.d.ts +6 -2
- package/dist/commands/preprocessors.js +387 -280
- package/dist/commands/preprocessors.js.map +1 -1
- package/dist/commands/production.d.ts +5 -8
- package/dist/commands/production.js +317 -228
- package/dist/commands/production.js.map +1 -1
- package/dist/commands/push.js +385 -427
- package/dist/commands/push.js.map +1 -1
- package/dist/commands/resources.d.ts +5 -10
- package/dist/commands/resources.js +219 -154
- package/dist/commands/resources.js.map +1 -1
- package/dist/commands/skills.d.ts +5 -9
- package/dist/commands/skills.js +435 -275
- package/dist/commands/skills.js.map +1 -1
- package/dist/commands/sync.d.ts +10 -8
- package/dist/commands/sync.js +110 -19
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/test.d.ts +1 -11
- package/dist/commands/test.js +395 -438
- package/dist/commands/test.js.map +1 -1
- package/dist/commands/webhooks.d.ts +5 -11
- package/dist/commands/webhooks.js +431 -287
- package/dist/commands/webhooks.js.map +1 -1
- package/dist/interfaces/index.d.ts +1 -1
- package/dist/interfaces/mcp.d.ts +39 -19
- package/dist/interfaces/mcp.js +3 -0
- package/dist/interfaces/mcp.js.map +1 -1
- package/dist/interfaces/product.d.ts +26 -0
- package/dist/interfaces/skills.d.ts +5 -0
- package/dist/types/api-contracts.d.ts +8 -4
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/skill.d.ts +146 -35
- package/dist/types/skill.js +31 -37
- package/dist/types/skill.js.map +1 -1
- package/dist/utils/bundling.d.ts +17 -0
- package/dist/utils/bundling.js +96 -0
- package/dist/utils/bundling.js.map +1 -1
- package/dist/utils/compile.d.ts +4 -0
- package/dist/utils/compile.js +5 -0
- package/dist/utils/compile.js.map +1 -1
- package/dist/utils/dev-helpers.d.ts +3 -2
- package/dist/utils/dev-helpers.js +3 -5
- package/dist/utils/dev-helpers.js.map +1 -1
- package/dist/utils/job-management.d.ts +4 -1
- package/dist/utils/job-management.js +15 -29
- package/dist/utils/job-management.js.map +1 -1
- package/dist/utils/mcp-server-management.d.ts +5 -2
- package/dist/utils/mcp-server-management.js +27 -43
- package/dist/utils/mcp-server-management.js.map +1 -1
- package/dist/utils/push-helpers.d.ts +1 -1
- package/dist/utils/push-helpers.js +5 -1
- package/dist/utils/push-helpers.js.map +1 -1
- package/dist/utils/skill-management.d.ts +7 -2
- package/dist/utils/skill-management.js +21 -30
- package/dist/utils/skill-management.js.map +1 -1
- package/dist/utils/webhook-management.d.ts +4 -1
- package/dist/utils/webhook-management.js +15 -29
- package/dist/utils/webhook-management.js.map +1 -1
- package/package.json +1 -1
- package/template/package.json +1 -1
package/dist/commands/persona.js
CHANGED
|
@@ -10,19 +10,22 @@ import { BASE_URLS } from '../config/constants.js';
|
|
|
10
10
|
import { safePrompt } from '../utils/prompt-handler.js';
|
|
11
11
|
import { validateConfig, validateAgentConfig, } from '../utils/dev-helpers.js';
|
|
12
12
|
import { loadPersonaFromCode, savePersonaToCode } from '../utils/agent-code-utils.js';
|
|
13
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
14
|
+
// Main Command Entry
|
|
15
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
13
16
|
/**
|
|
14
|
-
* Main persona command - manages agent persona
|
|
17
|
+
* Main persona command - manages agent persona.
|
|
15
18
|
*
|
|
16
|
-
*
|
|
17
|
-
* -
|
|
18
|
-
* -
|
|
19
|
-
* - Production: list versions, view details, deploy versions
|
|
20
|
-
*
|
|
21
|
-
* @param env - Optional environment argument ('sandbox', 'staging', or 'production')
|
|
22
|
-
* @returns Promise that resolves when command completes
|
|
19
|
+
* Supports both interactive and non-interactive modes:
|
|
20
|
+
* - Interactive: prompts for environment and action selection
|
|
21
|
+
* - Non-interactive (production): use env + action with optional flags
|
|
23
22
|
*/
|
|
24
|
-
export async function personaCommand(env) {
|
|
23
|
+
export async function personaCommand(env, action, cmdObj) {
|
|
25
24
|
return withErrorHandling(async () => {
|
|
25
|
+
const options = {
|
|
26
|
+
personaVersion: cmdObj?.personaVersion || null,
|
|
27
|
+
force: cmdObj?.force || false,
|
|
28
|
+
};
|
|
26
29
|
// Step 1: Load configuration first (to get agentId)
|
|
27
30
|
const config = readSkillConfig();
|
|
28
31
|
validateConfig(config);
|
|
@@ -39,7 +42,6 @@ export async function personaCommand(env) {
|
|
|
39
42
|
let selectedEnvironment;
|
|
40
43
|
// Step 3: Check if environment was provided as argument
|
|
41
44
|
if (env) {
|
|
42
|
-
// Normalize the environment (staging is an alias for sandbox)
|
|
43
45
|
const normalizedEnv = env.toLowerCase();
|
|
44
46
|
if (normalizedEnv === 'sandbox' || normalizedEnv === 'staging') {
|
|
45
47
|
selectedEnvironment = 'sandbox';
|
|
@@ -50,10 +52,12 @@ export async function personaCommand(env) {
|
|
|
50
52
|
else {
|
|
51
53
|
console.error(`❌ Invalid environment: "${env}". Must be "sandbox", "staging", or "production".`);
|
|
52
54
|
console.log('\nUsage:');
|
|
53
|
-
console.log(' lua persona
|
|
54
|
-
console.log(' lua persona sandbox
|
|
55
|
-
console.log(' lua persona
|
|
56
|
-
console.log(' lua persona production
|
|
55
|
+
console.log(' lua persona Interactive selection');
|
|
56
|
+
console.log(' lua persona sandbox Manage sandbox persona');
|
|
57
|
+
console.log(' lua persona production Manage production persona');
|
|
58
|
+
console.log(' lua persona production view View current persona');
|
|
59
|
+
console.log(' lua persona production versions List all versions');
|
|
60
|
+
console.log(' lua persona production deploy -v 5 Deploy version 5');
|
|
57
61
|
process.exit(1);
|
|
58
62
|
}
|
|
59
63
|
}
|
|
@@ -79,24 +83,238 @@ export async function personaCommand(env) {
|
|
|
79
83
|
agentId,
|
|
80
84
|
apiKey,
|
|
81
85
|
};
|
|
82
|
-
// Step 5:
|
|
86
|
+
// Step 5: Handle based on environment and action
|
|
83
87
|
if (selectedEnvironment === 'sandbox') {
|
|
84
|
-
|
|
88
|
+
// Sandbox mode is always interactive (editing requires editor)
|
|
89
|
+
await manageSandboxPersonaInteractive(context);
|
|
85
90
|
}
|
|
86
91
|
else {
|
|
87
|
-
|
|
92
|
+
// Production mode supports non-interactive actions
|
|
93
|
+
if (action) {
|
|
94
|
+
await executeProductionNonInteractive(context, action, options);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
await manageProductionPersonaInteractive(context);
|
|
98
|
+
}
|
|
88
99
|
}
|
|
89
100
|
}, "persona");
|
|
90
101
|
}
|
|
102
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
103
|
+
// Shared Core Functions
|
|
104
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
105
|
+
/**
|
|
106
|
+
* Fetches all persona versions from the API.
|
|
107
|
+
*/
|
|
108
|
+
async function fetchVersionsCore(context) {
|
|
109
|
+
try {
|
|
110
|
+
const response = await fetch(`${BASE_URLS.API}/developer/agents/${context.agentId}/persona/versions`, {
|
|
111
|
+
method: 'GET',
|
|
112
|
+
headers: {
|
|
113
|
+
'Authorization': `Bearer ${context.apiKey}`,
|
|
114
|
+
'Content-Type': 'application/json'
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
if (!response.ok) {
|
|
118
|
+
const errorText = await response.text();
|
|
119
|
+
console.error(`❌ API Error: ${response.status} - ${errorText}`);
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
const data = await response.json();
|
|
123
|
+
let versions = [];
|
|
124
|
+
if (Array.isArray(data)) {
|
|
125
|
+
versions = data;
|
|
126
|
+
}
|
|
127
|
+
else if (data.data && Array.isArray(data.data)) {
|
|
128
|
+
versions = data.data;
|
|
129
|
+
}
|
|
130
|
+
else if (data.versions && Array.isArray(data.versions)) {
|
|
131
|
+
versions = data.versions;
|
|
132
|
+
}
|
|
133
|
+
return versions.sort((a, b) => b.createdDate - a.createdDate);
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
console.error('❌ Error loading persona versions:', error);
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Displays the current deployed persona.
|
|
142
|
+
*/
|
|
143
|
+
function displayCurrentPersonaCore(versions) {
|
|
144
|
+
const currentVersion = versions.find(v => v.isCurrent);
|
|
145
|
+
console.log("\n" + "=".repeat(60));
|
|
146
|
+
console.log("🤖 Current Production Persona");
|
|
147
|
+
console.log("=".repeat(60) + "\n");
|
|
148
|
+
if (currentVersion) {
|
|
149
|
+
const date = new Date(currentVersion.createdDate);
|
|
150
|
+
console.log(`Version: ${currentVersion.version} ⭐`);
|
|
151
|
+
console.log(`Deployed: ${date.toLocaleString()}`);
|
|
152
|
+
if (currentVersion.createdBy) {
|
|
153
|
+
console.log(`Created by: ${currentVersion.createdBy}`);
|
|
154
|
+
}
|
|
155
|
+
console.log("\n" + "-".repeat(60) + "\n");
|
|
156
|
+
console.log(currentVersion.persona);
|
|
157
|
+
console.log("\n" + "=".repeat(60));
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
console.log("⚠️ No persona currently deployed.");
|
|
161
|
+
console.log("💡 Deploy a version using: lua persona production deploy -v <version>\n");
|
|
162
|
+
console.log("=".repeat(60));
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Displays all persona versions.
|
|
167
|
+
*/
|
|
168
|
+
function displayVersionsCore(versions) {
|
|
169
|
+
console.log("\n" + "=".repeat(60));
|
|
170
|
+
console.log("🌙 Persona Versions");
|
|
171
|
+
console.log("=".repeat(60) + "\n");
|
|
172
|
+
if (versions.length === 0) {
|
|
173
|
+
console.log("ℹ️ No persona versions found.");
|
|
174
|
+
console.log("💡 Create a version first from sandbox mode.\n");
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
versions.forEach((v) => {
|
|
178
|
+
const date = new Date(v.createdDate);
|
|
179
|
+
const dateStr = date.toLocaleDateString();
|
|
180
|
+
const timeStr = date.toLocaleTimeString();
|
|
181
|
+
const currentMark = v.isCurrent ? ' ⭐ CURRENT' : '';
|
|
182
|
+
const status = v.status === 'draft' ? ' [DRAFT]' : '';
|
|
183
|
+
console.log(` Version ${v.version}${status} - ${dateStr} ${timeStr}${currentMark}`);
|
|
184
|
+
});
|
|
185
|
+
console.log("\n" + "=".repeat(60));
|
|
186
|
+
console.log(`Total: ${versions.length} version(s)`);
|
|
187
|
+
}
|
|
91
188
|
/**
|
|
92
|
-
*
|
|
189
|
+
* Deploys a persona version.
|
|
93
190
|
*/
|
|
94
|
-
async function
|
|
191
|
+
async function deployVersionCore(context, version) {
|
|
192
|
+
writeProgress(`🔄 Deploying persona version ${version}...`);
|
|
193
|
+
try {
|
|
194
|
+
const deployResponse = await fetch(`${BASE_URLS.API}/developer/agents/${context.agentId}/persona/version/${version}`, {
|
|
195
|
+
method: 'POST',
|
|
196
|
+
headers: {
|
|
197
|
+
'Authorization': `Bearer ${context.apiKey}`,
|
|
198
|
+
'Content-Type': 'application/json'
|
|
199
|
+
},
|
|
200
|
+
body: JSON.stringify({})
|
|
201
|
+
});
|
|
202
|
+
if (!deployResponse.ok) {
|
|
203
|
+
const errorText = await deployResponse.text();
|
|
204
|
+
console.error(`❌ Deploy Error: ${deployResponse.status} - ${errorText}`);
|
|
205
|
+
return false;
|
|
206
|
+
}
|
|
207
|
+
writeSuccess(`✅ Persona version ${version} deployed successfully to production`);
|
|
208
|
+
writeInfo("💡 The new persona is now active for all users.");
|
|
209
|
+
return true;
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
console.error('❌ Error deploying persona version:', error);
|
|
213
|
+
return false;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
217
|
+
// Non-Interactive Mode (Production)
|
|
218
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
219
|
+
async function executeProductionNonInteractive(context, action, options) {
|
|
220
|
+
const validActions = ['view', 'versions', 'deploy'];
|
|
221
|
+
const normalizedAction = action.toLowerCase();
|
|
222
|
+
if (!validActions.includes(normalizedAction)) {
|
|
223
|
+
console.error(`❌ Invalid action: "${action}"`);
|
|
224
|
+
console.log('\nValid actions for production: view, versions, deploy');
|
|
225
|
+
console.log('\nExamples:');
|
|
226
|
+
console.log(' lua persona production view View current persona');
|
|
227
|
+
console.log(' lua persona production versions List all versions');
|
|
228
|
+
console.log(' lua persona production deploy -v 5 Deploy version 5');
|
|
229
|
+
console.log(' lua persona production deploy -v latest Deploy latest version');
|
|
230
|
+
process.exit(1);
|
|
231
|
+
}
|
|
232
|
+
writeProgress("🔄 Loading persona versions...");
|
|
233
|
+
const versions = await fetchVersionsCore(context);
|
|
234
|
+
if (!versions)
|
|
235
|
+
process.exit(1);
|
|
236
|
+
switch (normalizedAction) {
|
|
237
|
+
case 'view':
|
|
238
|
+
displayCurrentPersonaCore(versions);
|
|
239
|
+
break;
|
|
240
|
+
case 'versions':
|
|
241
|
+
displayVersionsCore(versions);
|
|
242
|
+
break;
|
|
243
|
+
case 'deploy': {
|
|
244
|
+
if (!options.personaVersion) {
|
|
245
|
+
console.error('❌ --persona-version is required for deploy action');
|
|
246
|
+
console.log('\nUsage: lua persona production deploy --persona-version <version>');
|
|
247
|
+
console.log(' lua persona production deploy -v latest');
|
|
248
|
+
if (versions.length > 0) {
|
|
249
|
+
console.log('\nAvailable versions:');
|
|
250
|
+
versions.slice(0, 5).forEach(v => {
|
|
251
|
+
const mark = v.isCurrent ? ' (current)' : '';
|
|
252
|
+
console.log(` - ${v.version}${mark}`);
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
process.exit(1);
|
|
256
|
+
}
|
|
257
|
+
// Resolve version number
|
|
258
|
+
let versionNumber;
|
|
259
|
+
if (options.personaVersion.toLowerCase() === 'latest') {
|
|
260
|
+
if (versions.length === 0) {
|
|
261
|
+
console.error('❌ No versions available to deploy');
|
|
262
|
+
process.exit(1);
|
|
263
|
+
}
|
|
264
|
+
versionNumber = versions[0].version; // Already sorted newest first
|
|
265
|
+
console.log(`ℹ️ Latest version is ${versionNumber}`);
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
versionNumber = parseInt(options.personaVersion, 10);
|
|
269
|
+
if (isNaN(versionNumber)) {
|
|
270
|
+
console.error(`❌ Invalid version number: "${options.personaVersion}"`);
|
|
271
|
+
process.exit(1);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
// Check if version exists
|
|
275
|
+
const versionExists = versions.find(v => v.version === versionNumber);
|
|
276
|
+
if (!versionExists) {
|
|
277
|
+
console.error(`❌ Version ${versionNumber} not found`);
|
|
278
|
+
console.log('\nAvailable versions:');
|
|
279
|
+
versions.forEach(v => console.log(` - ${v.version}`));
|
|
280
|
+
process.exit(1);
|
|
281
|
+
}
|
|
282
|
+
// Check if already current
|
|
283
|
+
if (versionExists.isCurrent) {
|
|
284
|
+
console.log(`ℹ️ Version ${versionNumber} is already deployed.`);
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
// Confirm unless --force
|
|
288
|
+
if (!options.force) {
|
|
289
|
+
console.log("\n⚠️ WARNING: You are about to deploy to PRODUCTION!");
|
|
290
|
+
console.log("⚠️ This will affect ALL users immediately.\n");
|
|
291
|
+
const confirmAnswer = await safePrompt([
|
|
292
|
+
{
|
|
293
|
+
type: 'confirm',
|
|
294
|
+
name: 'confirm',
|
|
295
|
+
message: `Deploy version ${versionNumber} to production?`,
|
|
296
|
+
default: false
|
|
297
|
+
}
|
|
298
|
+
]);
|
|
299
|
+
if (!confirmAnswer || !confirmAnswer.confirm) {
|
|
300
|
+
console.log("\n❌ Deployment cancelled.\n");
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
const success = await deployVersionCore(context, versionNumber);
|
|
305
|
+
if (!success)
|
|
306
|
+
process.exit(1);
|
|
307
|
+
break;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
312
|
+
// Interactive Mode (Sandbox)
|
|
313
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
314
|
+
async function manageSandboxPersonaInteractive(context) {
|
|
95
315
|
let continueManaging = true;
|
|
96
316
|
while (continueManaging) {
|
|
97
|
-
// Load current persona directly from code
|
|
98
317
|
const currentPersona = loadPersonaFromCode();
|
|
99
|
-
// Show menu
|
|
100
318
|
console.log("\n" + "=".repeat(60));
|
|
101
319
|
console.log("🌙 Sandbox Persona Management");
|
|
102
320
|
console.log("=".repeat(60) + "\n");
|
|
@@ -130,54 +348,16 @@ async function manageSandboxPersona(context) {
|
|
|
130
348
|
const { action } = actionAnswer;
|
|
131
349
|
switch (action) {
|
|
132
350
|
case 'view':
|
|
133
|
-
await
|
|
351
|
+
await viewPersonaInteractive(currentPersona);
|
|
134
352
|
break;
|
|
135
353
|
case 'edit':
|
|
136
|
-
await
|
|
354
|
+
await editSandboxPersonaInteractive(context, currentPersona);
|
|
137
355
|
break;
|
|
138
356
|
case 'create_version':
|
|
139
|
-
await
|
|
357
|
+
await createPersonaVersionInteractive(context, currentPersona);
|
|
140
358
|
break;
|
|
141
359
|
case 'list_versions':
|
|
142
|
-
await
|
|
143
|
-
break;
|
|
144
|
-
case 'exit':
|
|
145
|
-
continueManaging = false;
|
|
146
|
-
console.log("\n👋 Goodbye!\n");
|
|
147
|
-
break;
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* Manage production persona - view and deploy versions
|
|
153
|
-
*/
|
|
154
|
-
async function manageProductionPersona(context) {
|
|
155
|
-
let continueManaging = true;
|
|
156
|
-
while (continueManaging) {
|
|
157
|
-
console.log("\n" + "=".repeat(60));
|
|
158
|
-
console.log("🌙 Production Persona Management");
|
|
159
|
-
console.log("=".repeat(60) + "\n");
|
|
160
|
-
const actionAnswer = await safePrompt([
|
|
161
|
-
{
|
|
162
|
-
type: 'list',
|
|
163
|
-
name: 'action',
|
|
164
|
-
message: 'What would you like to do?',
|
|
165
|
-
choices: [
|
|
166
|
-
{ name: '👁️ View persona versions', value: 'view' },
|
|
167
|
-
{ name: '🚀 Deploy persona version', value: 'deploy' },
|
|
168
|
-
{ name: '❌ Exit', value: 'exit' }
|
|
169
|
-
]
|
|
170
|
-
}
|
|
171
|
-
]);
|
|
172
|
-
if (!actionAnswer)
|
|
173
|
-
return;
|
|
174
|
-
const { action } = actionAnswer;
|
|
175
|
-
switch (action) {
|
|
176
|
-
case 'view':
|
|
177
|
-
await listPersonaVersions(context);
|
|
178
|
-
break;
|
|
179
|
-
case 'deploy':
|
|
180
|
-
await deployPersonaVersion(context);
|
|
360
|
+
await listPersonaVersionsInteractive(context);
|
|
181
361
|
break;
|
|
182
362
|
case 'exit':
|
|
183
363
|
continueManaging = false;
|
|
@@ -186,10 +366,7 @@ async function manageProductionPersona(context) {
|
|
|
186
366
|
}
|
|
187
367
|
}
|
|
188
368
|
}
|
|
189
|
-
|
|
190
|
-
* View full persona content
|
|
191
|
-
*/
|
|
192
|
-
async function viewPersona(persona) {
|
|
369
|
+
async function viewPersonaInteractive(persona) {
|
|
193
370
|
console.log("\n" + "=".repeat(60));
|
|
194
371
|
console.log("Agent Persona");
|
|
195
372
|
console.log("=".repeat(60));
|
|
@@ -208,11 +385,7 @@ async function viewPersona(persona) {
|
|
|
208
385
|
}
|
|
209
386
|
]);
|
|
210
387
|
}
|
|
211
|
-
|
|
212
|
-
* Edit sandbox persona
|
|
213
|
-
*/
|
|
214
|
-
async function editSandboxPersona(context, currentPersona) {
|
|
215
|
-
// Provide helpful default if empty
|
|
388
|
+
async function editSandboxPersonaInteractive(context, currentPersona) {
|
|
216
389
|
const defaultPersona = currentPersona || `# Write your agent persona here
|
|
217
390
|
#
|
|
218
391
|
# Example:
|
|
@@ -229,7 +402,6 @@ async function editSandboxPersona(context, currentPersona) {
|
|
|
229
402
|
if (!input.trim()) {
|
|
230
403
|
return 'Persona cannot be empty';
|
|
231
404
|
}
|
|
232
|
-
// Remove comment lines for validation
|
|
233
405
|
const withoutComments = input.split('\n')
|
|
234
406
|
.filter((line) => !line.trim().startsWith('#'))
|
|
235
407
|
.join('\n')
|
|
@@ -254,10 +426,7 @@ async function editSandboxPersona(context, currentPersona) {
|
|
|
254
426
|
console.error("❌ Failed to save persona to code");
|
|
255
427
|
}
|
|
256
428
|
}
|
|
257
|
-
|
|
258
|
-
* Create a new persona version
|
|
259
|
-
*/
|
|
260
|
-
async function createPersonaVersion(context, currentPersona) {
|
|
429
|
+
async function createPersonaVersionInteractive(context, currentPersona) {
|
|
261
430
|
if (!currentPersona || !currentPersona.trim()) {
|
|
262
431
|
console.log("\n❌ No persona to create version from. Please edit and save a persona first.\n");
|
|
263
432
|
return;
|
|
@@ -298,78 +467,37 @@ async function createPersonaVersion(context, currentPersona) {
|
|
|
298
467
|
console.error('❌ Error creating persona version:', error);
|
|
299
468
|
}
|
|
300
469
|
}
|
|
301
|
-
|
|
302
|
-
* List persona versions
|
|
303
|
-
*/
|
|
304
|
-
async function listPersonaVersions(context) {
|
|
470
|
+
async function listPersonaVersionsInteractive(context) {
|
|
305
471
|
writeProgress("🔄 Loading persona versions...");
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
'Content-Type': 'application/json'
|
|
312
|
-
}
|
|
313
|
-
});
|
|
314
|
-
if (!response.ok) {
|
|
315
|
-
const errorText = await response.text();
|
|
316
|
-
console.error(`\n❌ API Error: ${response.status} - ${errorText}\n`);
|
|
317
|
-
throw new Error(`HTTP error! status: ${response.status}`);
|
|
318
|
-
}
|
|
319
|
-
const data = await response.json();
|
|
320
|
-
// Handle different response formats
|
|
321
|
-
let versions = [];
|
|
322
|
-
if (Array.isArray(data)) {
|
|
323
|
-
versions = data;
|
|
324
|
-
}
|
|
325
|
-
else if (data.data && Array.isArray(data.data)) {
|
|
326
|
-
versions = data.data;
|
|
327
|
-
}
|
|
328
|
-
else if (data.versions && Array.isArray(data.versions)) {
|
|
329
|
-
versions = data.versions;
|
|
330
|
-
}
|
|
331
|
-
if (versions.length === 0) {
|
|
332
|
-
console.log("\nℹ️ No persona versions found.\n");
|
|
333
|
-
console.log("💡 Create a version first from sandbox mode.\n");
|
|
334
|
-
return;
|
|
335
|
-
}
|
|
336
|
-
// Sort versions by date (newest first)
|
|
337
|
-
const sortedVersions = versions.sort((a, b) => {
|
|
338
|
-
return b.createdDate - a.createdDate;
|
|
339
|
-
});
|
|
340
|
-
// Let user select a version to view
|
|
341
|
-
const versionAnswer = await safePrompt([
|
|
342
|
-
{
|
|
343
|
-
type: 'list',
|
|
344
|
-
name: 'selectedVersionIndex',
|
|
345
|
-
message: 'Select a persona version to view:',
|
|
346
|
-
choices: sortedVersions.map((version, index) => {
|
|
347
|
-
const date = new Date(version.createdDate);
|
|
348
|
-
const dateStr = date.toLocaleDateString();
|
|
349
|
-
const timeStr = date.toLocaleTimeString();
|
|
350
|
-
const status = version.status === 'draft' ? '[DRAFT]' : '';
|
|
351
|
-
const currentMark = version.isCurrent ? ' ⭐ CURRENT' : '';
|
|
352
|
-
return {
|
|
353
|
-
name: `Version ${version.version} ${status} - (${dateStr}) ${timeStr} ${currentMark}`,
|
|
354
|
-
value: index
|
|
355
|
-
};
|
|
356
|
-
})
|
|
357
|
-
}
|
|
358
|
-
]);
|
|
359
|
-
if (!versionAnswer)
|
|
360
|
-
return;
|
|
361
|
-
// Show the selected version's full persona
|
|
362
|
-
await viewVersionDetails([sortedVersions[versionAnswer.selectedVersionIndex]]);
|
|
363
|
-
}
|
|
364
|
-
catch (error) {
|
|
365
|
-
console.error('❌ Error loading persona versions:', error);
|
|
472
|
+
const versions = await fetchVersionsCore(context);
|
|
473
|
+
if (!versions || versions.length === 0) {
|
|
474
|
+
console.log("\nℹ️ No persona versions found.\n");
|
|
475
|
+
console.log("💡 Create a version first from sandbox mode.\n");
|
|
476
|
+
return;
|
|
366
477
|
}
|
|
478
|
+
const versionAnswer = await safePrompt([
|
|
479
|
+
{
|
|
480
|
+
type: 'list',
|
|
481
|
+
name: 'selectedVersionIndex',
|
|
482
|
+
message: 'Select a persona version to view:',
|
|
483
|
+
choices: versions.map((version, index) => {
|
|
484
|
+
const date = new Date(version.createdDate);
|
|
485
|
+
const dateStr = date.toLocaleDateString();
|
|
486
|
+
const timeStr = date.toLocaleTimeString();
|
|
487
|
+
const status = version.status === 'draft' ? '[DRAFT]' : '';
|
|
488
|
+
const currentMark = version.isCurrent ? ' ⭐ CURRENT' : '';
|
|
489
|
+
return {
|
|
490
|
+
name: `Version ${version.version} ${status} - (${dateStr}) ${timeStr} ${currentMark}`,
|
|
491
|
+
value: index
|
|
492
|
+
};
|
|
493
|
+
})
|
|
494
|
+
}
|
|
495
|
+
]);
|
|
496
|
+
if (!versionAnswer)
|
|
497
|
+
return;
|
|
498
|
+
await viewVersionDetailsInteractive(versions[versionAnswer.selectedVersionIndex]);
|
|
367
499
|
}
|
|
368
|
-
|
|
369
|
-
* View details of a specific version
|
|
370
|
-
*/
|
|
371
|
-
async function viewVersionDetails(versions) {
|
|
372
|
-
const version = versions[0]; // Already pre-selected
|
|
500
|
+
async function viewVersionDetailsInteractive(version) {
|
|
373
501
|
const date = new Date(version.createdDate);
|
|
374
502
|
console.log("\n" + "=".repeat(60));
|
|
375
503
|
console.log(`Persona Version ${version.version}`);
|
|
@@ -392,101 +520,90 @@ async function viewVersionDetails(versions) {
|
|
|
392
520
|
}
|
|
393
521
|
]);
|
|
394
522
|
}
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
async function
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
const response = await fetch(`${BASE_URLS.API}/developer/agents/${context.agentId}/persona/versions`, {
|
|
402
|
-
method: 'GET',
|
|
403
|
-
headers: {
|
|
404
|
-
'Authorization': `Bearer ${context.apiKey}`,
|
|
405
|
-
'Content-Type': 'application/json'
|
|
406
|
-
}
|
|
407
|
-
});
|
|
408
|
-
if (!response.ok) {
|
|
409
|
-
const errorText = await response.text();
|
|
410
|
-
console.error(`\n❌ API Error: ${response.status} - ${errorText}\n`);
|
|
411
|
-
throw new Error(`HTTP error! status: ${response.status}`);
|
|
412
|
-
}
|
|
413
|
-
const data = await response.json();
|
|
414
|
-
// Handle different response formats
|
|
415
|
-
let versions = [];
|
|
416
|
-
if (Array.isArray(data)) {
|
|
417
|
-
versions = data;
|
|
418
|
-
}
|
|
419
|
-
else if (data.data && Array.isArray(data.data)) {
|
|
420
|
-
versions = data.data;
|
|
421
|
-
}
|
|
422
|
-
else if (data.versions && Array.isArray(data.versions)) {
|
|
423
|
-
versions = data.versions;
|
|
424
|
-
}
|
|
425
|
-
if (versions.length === 0) {
|
|
426
|
-
console.log("\nℹ️ No persona versions available to deploy.\n");
|
|
427
|
-
console.log("💡 Create a version first from sandbox mode.\n");
|
|
428
|
-
return;
|
|
429
|
-
}
|
|
430
|
-
// Sort versions by date (newest first)
|
|
431
|
-
const sortedVersions = versions.sort((a, b) => b.createdDate - a.createdDate);
|
|
523
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
524
|
+
// Interactive Mode (Production)
|
|
525
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
526
|
+
async function manageProductionPersonaInteractive(context) {
|
|
527
|
+
let continueManaging = true;
|
|
528
|
+
while (continueManaging) {
|
|
432
529
|
console.log("\n" + "=".repeat(60));
|
|
433
|
-
console.log("🌙
|
|
530
|
+
console.log("🌙 Production Persona Management");
|
|
434
531
|
console.log("=".repeat(60) + "\n");
|
|
435
|
-
const
|
|
532
|
+
const actionAnswer = await safePrompt([
|
|
436
533
|
{
|
|
437
534
|
type: 'list',
|
|
438
|
-
name: '
|
|
439
|
-
message: '
|
|
440
|
-
choices:
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
const status = v.status === "draft" ? "[DRAFT]" : "";
|
|
446
|
-
return {
|
|
447
|
-
name: `Version ${v.version} ${status} - (${dateStr}) ${timeStr} ${currentMark}`,
|
|
448
|
-
value: v.version
|
|
449
|
-
};
|
|
450
|
-
})
|
|
451
|
-
}
|
|
452
|
-
]);
|
|
453
|
-
if (!versionAnswer)
|
|
454
|
-
return;
|
|
455
|
-
const { selectedVersion } = versionAnswer;
|
|
456
|
-
// Show confirmation
|
|
457
|
-
console.log("\n⚠️ WARNING: You are about to deploy to PRODUCTION!");
|
|
458
|
-
console.log("⚠️ This will affect ALL users immediately.\n");
|
|
459
|
-
const confirmAnswer = await safePrompt([
|
|
460
|
-
{
|
|
461
|
-
type: 'confirm',
|
|
462
|
-
name: 'confirm',
|
|
463
|
-
message: 'Are you absolutely sure you want to deploy this persona version?',
|
|
464
|
-
default: false
|
|
535
|
+
name: 'action',
|
|
536
|
+
message: 'What would you like to do?',
|
|
537
|
+
choices: [
|
|
538
|
+
{ name: '👁️ View persona versions', value: 'view' },
|
|
539
|
+
{ name: '🚀 Deploy persona version', value: 'deploy' },
|
|
540
|
+
{ name: '❌ Exit', value: 'exit' }
|
|
541
|
+
]
|
|
465
542
|
}
|
|
466
543
|
]);
|
|
467
|
-
if (!
|
|
468
|
-
console.log("\n❌ Deployment cancelled.\n");
|
|
544
|
+
if (!actionAnswer)
|
|
469
545
|
return;
|
|
546
|
+
const { action } = actionAnswer;
|
|
547
|
+
switch (action) {
|
|
548
|
+
case 'view':
|
|
549
|
+
await listPersonaVersionsInteractive(context);
|
|
550
|
+
break;
|
|
551
|
+
case 'deploy':
|
|
552
|
+
await deployPersonaVersionInteractive(context);
|
|
553
|
+
break;
|
|
554
|
+
case 'exit':
|
|
555
|
+
continueManaging = false;
|
|
556
|
+
console.log("\n👋 Goodbye!\n");
|
|
557
|
+
break;
|
|
470
558
|
}
|
|
471
|
-
writeProgress("🔄 Deploying persona version...");
|
|
472
|
-
const deployResponse = await fetch(`${BASE_URLS.API}/developer/agents/${context.agentId}/persona/version/${selectedVersion}`, {
|
|
473
|
-
method: 'POST',
|
|
474
|
-
headers: {
|
|
475
|
-
'Authorization': `Bearer ${context.apiKey}`,
|
|
476
|
-
'Content-Type': 'application/json'
|
|
477
|
-
},
|
|
478
|
-
body: JSON.stringify({})
|
|
479
|
-
});
|
|
480
|
-
if (!deployResponse.ok) {
|
|
481
|
-
const errorText = await deployResponse.text();
|
|
482
|
-
console.error(`\n❌ Deploy Error: ${deployResponse.status} - ${errorText}\n`);
|
|
483
|
-
throw new Error(`HTTP error! status: ${deployResponse.status}`);
|
|
484
|
-
}
|
|
485
|
-
writeSuccess(`✅ Persona version ${selectedVersion} deployed successfully to production`);
|
|
486
|
-
writeInfo("💡 The new persona is now active for all users.");
|
|
487
559
|
}
|
|
488
|
-
|
|
489
|
-
|
|
560
|
+
}
|
|
561
|
+
async function deployPersonaVersionInteractive(context) {
|
|
562
|
+
writeProgress("🔄 Loading persona versions...");
|
|
563
|
+
const versions = await fetchVersionsCore(context);
|
|
564
|
+
if (!versions || versions.length === 0) {
|
|
565
|
+
console.log("\nℹ️ No persona versions available to deploy.\n");
|
|
566
|
+
console.log("💡 Create a version first from sandbox mode.\n");
|
|
567
|
+
return;
|
|
568
|
+
}
|
|
569
|
+
console.log("\n" + "=".repeat(60));
|
|
570
|
+
console.log("🌙 Select Persona Version to Deploy");
|
|
571
|
+
console.log("=".repeat(60) + "\n");
|
|
572
|
+
const versionAnswer = await safePrompt([
|
|
573
|
+
{
|
|
574
|
+
type: 'list',
|
|
575
|
+
name: 'selectedVersion',
|
|
576
|
+
message: 'Select version to deploy:',
|
|
577
|
+
choices: versions.map((v) => {
|
|
578
|
+
const date = new Date(v.createdDate);
|
|
579
|
+
const dateStr = date.toLocaleDateString();
|
|
580
|
+
const timeStr = date.toLocaleTimeString();
|
|
581
|
+
const currentMark = v.isCurrent ? ' ⭐ CURRENTLY DEPLOYED' : '';
|
|
582
|
+
const status = v.status === "draft" ? "[DRAFT]" : "";
|
|
583
|
+
return {
|
|
584
|
+
name: `Version ${v.version} ${status} - (${dateStr}) ${timeStr} ${currentMark}`,
|
|
585
|
+
value: v.version
|
|
586
|
+
};
|
|
587
|
+
})
|
|
588
|
+
}
|
|
589
|
+
]);
|
|
590
|
+
if (!versionAnswer)
|
|
591
|
+
return;
|
|
592
|
+
const { selectedVersion } = versionAnswer;
|
|
593
|
+
console.log("\n⚠️ WARNING: You are about to deploy to PRODUCTION!");
|
|
594
|
+
console.log("⚠️ This will affect ALL users immediately.\n");
|
|
595
|
+
const confirmAnswer = await safePrompt([
|
|
596
|
+
{
|
|
597
|
+
type: 'confirm',
|
|
598
|
+
name: 'confirm',
|
|
599
|
+
message: 'Are you absolutely sure you want to deploy this persona version?',
|
|
600
|
+
default: false
|
|
601
|
+
}
|
|
602
|
+
]);
|
|
603
|
+
if (!confirmAnswer || !confirmAnswer.confirm) {
|
|
604
|
+
console.log("\n❌ Deployment cancelled.\n");
|
|
605
|
+
return;
|
|
490
606
|
}
|
|
607
|
+
await deployVersionCore(context, selectedVersion);
|
|
491
608
|
}
|
|
492
609
|
//# sourceMappingURL=persona.js.map
|