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.
Files changed (121) hide show
  1. package/dist/api/logs.api.service.d.ts +1 -1
  2. package/dist/api/logs.api.service.js.map +1 -1
  3. package/dist/api/products.api.service.d.ts +17 -5
  4. package/dist/api/products.api.service.js +21 -9
  5. package/dist/api/products.api.service.js.map +1 -1
  6. package/dist/api/webhook.api.service.d.ts +4 -0
  7. package/dist/api/webhook.api.service.js.map +1 -1
  8. package/dist/api-exports.d.ts +19 -7
  9. package/dist/api-exports.js +20 -5
  10. package/dist/api-exports.js.map +1 -1
  11. package/dist/cli/command-definitions.js +323 -88
  12. package/dist/cli/command-definitions.js.map +1 -1
  13. package/dist/commands/apiKey.d.ts +5 -2
  14. package/dist/commands/apiKey.js +8 -2
  15. package/dist/commands/apiKey.js.map +1 -1
  16. package/dist/commands/channels.d.ts +4 -9
  17. package/dist/commands/channels.js +140 -84
  18. package/dist/commands/channels.js.map +1 -1
  19. package/dist/commands/chat.d.ts +4 -2
  20. package/dist/commands/chat.js +126 -32
  21. package/dist/commands/chat.js.map +1 -1
  22. package/dist/commands/chatClear.d.ts +3 -2
  23. package/dist/commands/chatClear.js +16 -15
  24. package/dist/commands/chatClear.js.map +1 -1
  25. package/dist/commands/compile.d.ts +5 -4
  26. package/dist/commands/compile.js +73 -9
  27. package/dist/commands/compile.js.map +1 -1
  28. package/dist/commands/deploy.d.ts +5 -24
  29. package/dist/commands/deploy.js +75 -48
  30. package/dist/commands/deploy.js.map +1 -1
  31. package/dist/commands/destroy.d.ts +5 -2
  32. package/dist/commands/destroy.js +14 -2
  33. package/dist/commands/destroy.js.map +1 -1
  34. package/dist/commands/env.d.ts +3 -1
  35. package/dist/commands/env.js +322 -122
  36. package/dist/commands/env.js.map +1 -1
  37. package/dist/commands/features.d.ts +5 -9
  38. package/dist/commands/features.js +249 -129
  39. package/dist/commands/features.js.map +1 -1
  40. package/dist/commands/init.d.ts +7 -1
  41. package/dist/commands/init.js +242 -59
  42. package/dist/commands/init.js.map +1 -1
  43. package/dist/commands/jobs.d.ts +5 -13
  44. package/dist/commands/jobs.js +523 -360
  45. package/dist/commands/jobs.js.map +1 -1
  46. package/dist/commands/logs.d.ts +5 -10
  47. package/dist/commands/logs.js +259 -103
  48. package/dist/commands/logs.js.map +1 -1
  49. package/dist/commands/marketplace.d.ts +23 -2
  50. package/dist/commands/marketplace.js +530 -7
  51. package/dist/commands/marketplace.js.map +1 -1
  52. package/dist/commands/mcp.d.ts +5 -11
  53. package/dist/commands/mcp.js +304 -294
  54. package/dist/commands/mcp.js.map +1 -1
  55. package/dist/commands/persona.d.ts +5 -9
  56. package/dist/commands/persona.js +349 -232
  57. package/dist/commands/persona.js.map +1 -1
  58. package/dist/commands/postprocessors.d.ts +6 -2
  59. package/dist/commands/postprocessors.js +387 -280
  60. package/dist/commands/postprocessors.js.map +1 -1
  61. package/dist/commands/preprocessors.d.ts +6 -2
  62. package/dist/commands/preprocessors.js +387 -280
  63. package/dist/commands/preprocessors.js.map +1 -1
  64. package/dist/commands/production.d.ts +5 -8
  65. package/dist/commands/production.js +317 -228
  66. package/dist/commands/production.js.map +1 -1
  67. package/dist/commands/push.js +385 -427
  68. package/dist/commands/push.js.map +1 -1
  69. package/dist/commands/resources.d.ts +5 -10
  70. package/dist/commands/resources.js +219 -154
  71. package/dist/commands/resources.js.map +1 -1
  72. package/dist/commands/skills.d.ts +5 -9
  73. package/dist/commands/skills.js +435 -275
  74. package/dist/commands/skills.js.map +1 -1
  75. package/dist/commands/sync.d.ts +10 -8
  76. package/dist/commands/sync.js +110 -19
  77. package/dist/commands/sync.js.map +1 -1
  78. package/dist/commands/test.d.ts +1 -11
  79. package/dist/commands/test.js +395 -438
  80. package/dist/commands/test.js.map +1 -1
  81. package/dist/commands/webhooks.d.ts +5 -11
  82. package/dist/commands/webhooks.js +431 -287
  83. package/dist/commands/webhooks.js.map +1 -1
  84. package/dist/interfaces/index.d.ts +1 -1
  85. package/dist/interfaces/mcp.d.ts +39 -19
  86. package/dist/interfaces/mcp.js +3 -0
  87. package/dist/interfaces/mcp.js.map +1 -1
  88. package/dist/interfaces/product.d.ts +26 -0
  89. package/dist/interfaces/skills.d.ts +5 -0
  90. package/dist/types/api-contracts.d.ts +8 -4
  91. package/dist/types/index.d.ts +1 -1
  92. package/dist/types/index.js.map +1 -1
  93. package/dist/types/skill.d.ts +146 -35
  94. package/dist/types/skill.js +31 -37
  95. package/dist/types/skill.js.map +1 -1
  96. package/dist/utils/bundling.d.ts +17 -0
  97. package/dist/utils/bundling.js +96 -0
  98. package/dist/utils/bundling.js.map +1 -1
  99. package/dist/utils/compile.d.ts +4 -0
  100. package/dist/utils/compile.js +5 -0
  101. package/dist/utils/compile.js.map +1 -1
  102. package/dist/utils/dev-helpers.d.ts +3 -2
  103. package/dist/utils/dev-helpers.js +3 -5
  104. package/dist/utils/dev-helpers.js.map +1 -1
  105. package/dist/utils/job-management.d.ts +4 -1
  106. package/dist/utils/job-management.js +15 -29
  107. package/dist/utils/job-management.js.map +1 -1
  108. package/dist/utils/mcp-server-management.d.ts +5 -2
  109. package/dist/utils/mcp-server-management.js +27 -43
  110. package/dist/utils/mcp-server-management.js.map +1 -1
  111. package/dist/utils/push-helpers.d.ts +1 -1
  112. package/dist/utils/push-helpers.js +5 -1
  113. package/dist/utils/push-helpers.js.map +1 -1
  114. package/dist/utils/skill-management.d.ts +7 -2
  115. package/dist/utils/skill-management.js +21 -30
  116. package/dist/utils/skill-management.js.map +1 -1
  117. package/dist/utils/webhook-management.d.ts +4 -1
  118. package/dist/utils/webhook-management.js +15 -29
  119. package/dist/utils/webhook-management.js.map +1 -1
  120. package/package.json +1 -1
  121. package/template/package.json +1 -1
@@ -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
- * Features:
17
- * - Environment selection (sandbox/staging or production)
18
- * - Sandbox: view, edit, save persona + create versions
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 - Interactive selection');
54
- console.log(' lua persona sandbox - Manage sandbox persona directly');
55
- console.log(' lua persona staging - Manage staging persona (alias for sandbox)');
56
- console.log(' lua persona production - Manage production persona directly');
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: Start management based on environment
86
+ // Step 5: Handle based on environment and action
83
87
  if (selectedEnvironment === 'sandbox') {
84
- await manageSandboxPersona(context);
88
+ // Sandbox mode is always interactive (editing requires editor)
89
+ await manageSandboxPersonaInteractive(context);
85
90
  }
86
91
  else {
87
- await manageProductionPersona(context);
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
- * Manage sandbox persona - edit and save
189
+ * Deploys a persona version.
93
190
  */
94
- async function manageSandboxPersona(context) {
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 viewPersona(currentPersona);
351
+ await viewPersonaInteractive(currentPersona);
134
352
  break;
135
353
  case 'edit':
136
- await editSandboxPersona(context, currentPersona);
354
+ await editSandboxPersonaInteractive(context, currentPersona);
137
355
  break;
138
356
  case 'create_version':
139
- await createPersonaVersion(context, currentPersona);
357
+ await createPersonaVersionInteractive(context, currentPersona);
140
358
  break;
141
359
  case 'list_versions':
142
- await listPersonaVersions(context);
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
- try {
307
- const response = await fetch(`${BASE_URLS.API}/developer/agents/${context.agentId}/persona/versions`, {
308
- method: 'GET',
309
- headers: {
310
- 'Authorization': `Bearer ${context.apiKey}`,
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
- * Deploy a persona version to production
397
- */
398
- async function deployPersonaVersion(context) {
399
- writeProgress("🔄 Loading persona versions...");
400
- try {
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("🌙 Select Persona Version to Deploy");
530
+ console.log("🌙 Production Persona Management");
434
531
  console.log("=".repeat(60) + "\n");
435
- const versionAnswer = await safePrompt([
532
+ const actionAnswer = await safePrompt([
436
533
  {
437
534
  type: 'list',
438
- name: 'selectedVersion',
439
- message: 'Select version to deploy:',
440
- choices: sortedVersions.map((v) => {
441
- const date = new Date(v.createdDate);
442
- const dateStr = date.toLocaleDateString();
443
- const timeStr = date.toLocaleTimeString();
444
- const currentMark = v.isCurrent ? ' ⭐ CURRENTLY DEPLOYED' : '';
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 (!confirmAnswer || !confirmAnswer.confirm) {
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
- catch (error) {
489
- console.error('❌ Error deploying persona version:', error);
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