lua-cli 3.9.2 → 3.10.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 (170) hide show
  1. package/README.md +90 -2
  2. package/dist/api/agent.api.service.d.ts +8 -0
  3. package/dist/api/agent.api.service.d.ts.map +1 -1
  4. package/dist/api/agent.api.service.js +12 -0
  5. package/dist/api/agent.api.service.js.map +1 -1
  6. package/dist/api/device.api.service.d.ts +61 -0
  7. package/dist/api/device.api.service.d.ts.map +1 -0
  8. package/dist/api/device.api.service.js +72 -0
  9. package/dist/api/device.api.service.js.map +1 -0
  10. package/dist/api/lazy-instances.d.ts +1 -0
  11. package/dist/api/lazy-instances.d.ts.map +1 -1
  12. package/dist/api/lazy-instances.js +12 -0
  13. package/dist/api/lazy-instances.js.map +1 -1
  14. package/dist/api-exports.d.ts +38 -2
  15. package/dist/api-exports.d.ts.map +1 -1
  16. package/dist/api-exports.js +45 -2
  17. package/dist/api-exports.js.map +1 -1
  18. package/dist/cli/command-definitions.d.ts.map +1 -1
  19. package/dist/cli/command-definitions.js +100 -33
  20. package/dist/cli/command-definitions.js.map +1 -1
  21. package/dist/commands/agents.d.ts.map +1 -1
  22. package/dist/commands/agents.js +2 -11
  23. package/dist/commands/agents.js.map +1 -1
  24. package/dist/commands/apiKey.d.ts +1 -21
  25. package/dist/commands/apiKey.d.ts.map +1 -1
  26. package/dist/commands/apiKey.js +7 -25
  27. package/dist/commands/apiKey.js.map +1 -1
  28. package/dist/commands/compile.d.ts.map +1 -1
  29. package/dist/commands/compile.js +11 -3
  30. package/dist/commands/compile.js.map +1 -1
  31. package/dist/commands/configure.d.ts +2 -2
  32. package/dist/commands/configure.js +2 -2
  33. package/dist/commands/destroy.d.ts +0 -24
  34. package/dist/commands/destroy.d.ts.map +1 -1
  35. package/dist/commands/destroy.js +8 -30
  36. package/dist/commands/destroy.js.map +1 -1
  37. package/dist/commands/devices.d.ts +6 -0
  38. package/dist/commands/devices.d.ts.map +1 -0
  39. package/dist/commands/devices.js +266 -0
  40. package/dist/commands/devices.js.map +1 -0
  41. package/dist/commands/index.d.ts +2 -0
  42. package/dist/commands/index.d.ts.map +1 -1
  43. package/dist/commands/index.js +2 -0
  44. package/dist/commands/index.js.map +1 -1
  45. package/dist/commands/init.d.ts +1 -0
  46. package/dist/commands/init.d.ts.map +1 -1
  47. package/dist/commands/init.js +102 -39
  48. package/dist/commands/init.js.map +1 -1
  49. package/dist/commands/jobs.js +29 -9
  50. package/dist/commands/jobs.js.map +1 -1
  51. package/dist/commands/models.d.ts +18 -0
  52. package/dist/commands/models.d.ts.map +1 -0
  53. package/dist/commands/models.js +206 -0
  54. package/dist/commands/models.js.map +1 -0
  55. package/dist/commands/push.d.ts.map +1 -1
  56. package/dist/commands/push.js +8 -4
  57. package/dist/commands/push.js.map +1 -1
  58. package/dist/commands/pushBackup.d.ts.map +1 -1
  59. package/dist/commands/pushBackup.js +9 -1
  60. package/dist/commands/pushBackup.js.map +1 -1
  61. package/dist/commands/sync.d.ts +2 -0
  62. package/dist/commands/sync.d.ts.map +1 -1
  63. package/dist/commands/sync.js +116 -17
  64. package/dist/commands/sync.js.map +1 -1
  65. package/dist/compiler/agent-traverser.d.ts.map +1 -1
  66. package/dist/compiler/agent-traverser.js +1 -0
  67. package/dist/compiler/agent-traverser.js.map +1 -1
  68. package/dist/compiler/index.d.ts +1 -1
  69. package/dist/compiler/index.d.ts.map +1 -1
  70. package/dist/compiler/index.js +1 -1
  71. package/dist/compiler/index.js.map +1 -1
  72. package/dist/compiler/plugins/device.plugin.d.ts +46 -0
  73. package/dist/compiler/plugins/device.plugin.d.ts.map +1 -0
  74. package/dist/compiler/plugins/device.plugin.js +279 -0
  75. package/dist/compiler/plugins/device.plugin.js.map +1 -0
  76. package/dist/compiler/plugins/registry.d.ts.map +1 -1
  77. package/dist/compiler/plugins/registry.js +2 -0
  78. package/dist/compiler/plugins/registry.js.map +1 -1
  79. package/dist/compiler/source-writer.d.ts +17 -1
  80. package/dist/compiler/source-writer.d.ts.map +1 -1
  81. package/dist/compiler/source-writer.js +114 -29
  82. package/dist/compiler/source-writer.js.map +1 -1
  83. package/dist/compiler/types.d.ts +44 -2
  84. package/dist/compiler/types.d.ts.map +1 -1
  85. package/dist/compiler/types.js +1 -0
  86. package/dist/compiler/types.js.map +1 -1
  87. package/dist/config/constants.d.ts +7 -11
  88. package/dist/config/constants.d.ts.map +1 -1
  89. package/dist/config/constants.js +7 -11
  90. package/dist/config/constants.js.map +1 -1
  91. package/dist/index.js +0 -0
  92. package/dist/interfaces/agent.d.ts +11 -0
  93. package/dist/interfaces/agent.d.ts.map +1 -1
  94. package/dist/interfaces/devices.d.ts +75 -0
  95. package/dist/interfaces/devices.d.ts.map +1 -0
  96. package/dist/interfaces/devices.js +5 -0
  97. package/dist/interfaces/devices.js.map +1 -0
  98. package/dist/primitives/base.handler.d.ts.map +1 -1
  99. package/dist/primitives/base.handler.js +31 -7
  100. package/dist/primitives/base.handler.js.map +1 -1
  101. package/dist/primitives/device.handler.d.ts +43 -0
  102. package/dist/primitives/device.handler.d.ts.map +1 -0
  103. package/dist/primitives/device.handler.js +82 -0
  104. package/dist/primitives/device.handler.js.map +1 -0
  105. package/dist/primitives/index.d.ts +2 -0
  106. package/dist/primitives/index.d.ts.map +1 -1
  107. package/dist/primitives/index.js +4 -0
  108. package/dist/primitives/index.js.map +1 -1
  109. package/dist/services/analytics.d.ts.map +1 -1
  110. package/dist/services/analytics.js +6 -2
  111. package/dist/services/analytics.js.map +1 -1
  112. package/dist/services/auth.d.ts +16 -26
  113. package/dist/services/auth.d.ts.map +1 -1
  114. package/dist/services/auth.js +45 -101
  115. package/dist/services/auth.js.map +1 -1
  116. package/dist/types/skill.d.ts +98 -0
  117. package/dist/types/skill.d.ts.map +1 -1
  118. package/dist/types/skill.js +21 -0
  119. package/dist/types/skill.js.map +1 -1
  120. package/dist/types/yaml.types.d.ts +8 -0
  121. package/dist/types/yaml.types.d.ts.map +1 -1
  122. package/dist/utils/auth-flows.d.ts.map +1 -1
  123. package/dist/utils/auth-flows.js +8 -12
  124. package/dist/utils/auth-flows.js.map +1 -1
  125. package/dist/utils/backup-helpers.d.ts +41 -10
  126. package/dist/utils/backup-helpers.d.ts.map +1 -1
  127. package/dist/utils/backup-helpers.js +227 -15
  128. package/dist/utils/backup-helpers.js.map +1 -1
  129. package/dist/utils/cli.d.ts.map +1 -1
  130. package/dist/utils/cli.js +2 -3
  131. package/dist/utils/cli.js.map +1 -1
  132. package/dist/utils/command-utils.d.ts +4 -3
  133. package/dist/utils/command-utils.d.ts.map +1 -1
  134. package/dist/utils/command-utils.js +9 -20
  135. package/dist/utils/command-utils.js.map +1 -1
  136. package/dist/utils/init-agent.d.ts +37 -1
  137. package/dist/utils/init-agent.d.ts.map +1 -1
  138. package/dist/utils/init-agent.js +69 -1
  139. package/dist/utils/init-agent.js.map +1 -1
  140. package/dist/utils/init-helpers.d.ts +2 -1
  141. package/dist/utils/init-helpers.d.ts.map +1 -1
  142. package/dist/utils/init-helpers.js +3 -2
  143. package/dist/utils/init-helpers.js.map +1 -1
  144. package/dist/utils/init-prompts.d.ts +11 -1
  145. package/dist/utils/init-prompts.d.ts.map +1 -1
  146. package/dist/utils/init-prompts.js +49 -22
  147. package/dist/utils/init-prompts.js.map +1 -1
  148. package/dist/utils/sandbox-storage.d.ts +24 -18
  149. package/dist/utils/sandbox-storage.d.ts.map +1 -1
  150. package/dist/utils/sandbox-storage.js +108 -101
  151. package/dist/utils/sandbox-storage.js.map +1 -1
  152. package/dist/utils/sandbox.d.ts.map +1 -1
  153. package/dist/utils/sandbox.js +23 -0
  154. package/dist/utils/sandbox.js.map +1 -1
  155. package/docs/CLI_REFERENCE.md +152 -2
  156. package/docs/README.md +5 -3
  157. package/node_modules/@lua/shared-types/dist/index.d.mts +188 -2
  158. package/node_modules/@lua/shared-types/dist/index.d.ts +188 -2
  159. package/node_modules/@lua/shared-types/dist/index.js +171 -2
  160. package/node_modules/@lua/shared-types/dist/index.mjs +164 -1
  161. package/node_modules/@lua/shared-types/src/channel.type.ts +1 -0
  162. package/node_modules/@lua/shared-types/src/device.types.ts +172 -0
  163. package/node_modules/@lua/shared-types/src/index.ts +2 -0
  164. package/node_modules/@lua/shared-types/src/persona-defaults.ts +59 -0
  165. package/package.json +5 -7
  166. package/template/package.json +1 -1
  167. package/dist/utils/keytar-loader.d.ts +0 -20
  168. package/dist/utils/keytar-loader.d.ts.map +0 -1
  169. package/dist/utils/keytar-loader.js +0 -35
  170. package/dist/utils/keytar-loader.js.map +0 -1
@@ -0,0 +1,266 @@
1
+ /**
2
+ * Devices Command
3
+ * Manages agent device definitions and tests device communication
4
+ */
5
+ import { withErrorHandling, writeProgress, writeSuccess, writeInfo } from '../utils/cli.js';
6
+ import { BASE_URLS } from '../config/constants.js';
7
+ import { safePrompt } from '../utils/prompt-handler.js';
8
+ import { initializeCommand } from '../utils/command-utils.js';
9
+ import DeviceApi from '../api/device.api.service.js';
10
+ import { trackEvent } from '../services/analytics.js';
11
+ // ─────────────────────────────────────────────────────────────────────────────
12
+ // Main Command Entry
13
+ // ─────────────────────────────────────────────────────────────────────────────
14
+ export async function devicesCommand(action, cmdObj) {
15
+ return withErrorHandling(async () => {
16
+ const options = {
17
+ deviceName: cmdObj?.deviceName || null,
18
+ group: cmdObj?.group || null,
19
+ payload: cmdObj?.payload || '{}',
20
+ timeout: cmdObj?.timeout || '30000',
21
+ };
22
+ const { apiKey, agentId } = await initializeCommand();
23
+ const api = new DeviceApi(BASE_URLS.API, apiKey, agentId);
24
+ let selectedAction;
25
+ if (action && ['list', 'status', 'enable', 'disable', 'remove', 'test', 'test-trigger'].includes(action)) {
26
+ selectedAction = action;
27
+ }
28
+ else {
29
+ const answer = await safePrompt([
30
+ {
31
+ type: 'list',
32
+ name: 'action',
33
+ message: 'What would you like to do?',
34
+ choices: [
35
+ { name: 'šŸ“‹ List devices', value: 'list' },
36
+ { name: 'šŸ“Š Device status', value: 'status' },
37
+ { name: 'āœ… Enable device', value: 'enable' },
38
+ { name: 'ā›” Disable device', value: 'disable' },
39
+ { name: 'šŸ—‘ļø Remove device', value: 'remove' },
40
+ { name: '🧪 Test command', value: 'test' },
41
+ { name: 'šŸ”” Test trigger', value: 'test-trigger' },
42
+ ],
43
+ },
44
+ ]);
45
+ if (!answer)
46
+ return;
47
+ selectedAction = answer.action;
48
+ }
49
+ switch (selectedAction) {
50
+ case 'list':
51
+ await listDevices(api, options);
52
+ break;
53
+ case 'status':
54
+ await deviceStatus(api, options);
55
+ break;
56
+ case 'enable':
57
+ await enableDevice(api, options);
58
+ break;
59
+ case 'disable':
60
+ await disableDevice(api, options);
61
+ break;
62
+ case 'remove':
63
+ await removeDevice(api, options, cmdObj?.force);
64
+ break;
65
+ case 'test':
66
+ await testCommand(api, options);
67
+ break;
68
+ case 'test-trigger':
69
+ await testTrigger(api, options);
70
+ break;
71
+ }
72
+ trackEvent('cli_devices_completed', {
73
+ action: selectedAction,
74
+ device_name: options.deviceName || undefined,
75
+ non_interactive: !!action,
76
+ });
77
+ }, 'devices');
78
+ }
79
+ // ─────────────────────────────────────────────────────────────────────────────
80
+ // Actions
81
+ // ─────────────────────────────────────────────────────────────────────────────
82
+ async function listDevices(api, options) {
83
+ writeProgress('Fetching devices...');
84
+ const response = await api.getDevices();
85
+ if (!response.success || !response.data) {
86
+ throw new Error(response.error?.message || 'Failed to fetch devices');
87
+ }
88
+ const devices = response.data.devices || response.data;
89
+ if (!Array.isArray(devices) || devices.length === 0) {
90
+ writeInfo('No devices registered. Connect a device using @lua/device-client.');
91
+ return;
92
+ }
93
+ let filtered = devices;
94
+ if (options.group) {
95
+ filtered = devices.filter((d) => d.group === options.group);
96
+ if (filtered.length === 0) {
97
+ writeInfo(`No devices found in group '${options.group}'.`);
98
+ return;
99
+ }
100
+ }
101
+ console.log(`\n Devices (${filtered.length}):\n`);
102
+ for (const d of filtered) {
103
+ const statusIcon = d.active === false ? 'ā›”' : 'šŸ“”';
104
+ console.log(` ${statusIcon} ${d.name}${d.group ? ` [${d.group}]` : ''}`);
105
+ console.log(` ID: ${d.id}`);
106
+ if (d.description)
107
+ console.log(` ${d.description}`);
108
+ console.log('');
109
+ }
110
+ }
111
+ async function deviceStatus(api, options) {
112
+ const name = await resolveDeviceName(api, options.deviceName, 'Check status of');
113
+ writeProgress(`Checking status of '${name}'...`);
114
+ const response = await api.getDeviceStatus(name);
115
+ if (!response.success) {
116
+ throw new Error(response.error?.message || 'Failed to get device status');
117
+ }
118
+ const status = response.data.status;
119
+ const icon = status === 'online' ? '🟢' : status === 'disabled' ? 'ā›”' : 'šŸ”“';
120
+ writeSuccess(`${icon} Device '${name}' is ${status}`);
121
+ }
122
+ async function enableDevice(api, options) {
123
+ const name = await resolveDeviceName(api, options.deviceName, 'Enable');
124
+ writeProgress(`Enabling '${name}'...`);
125
+ const response = await api.enableDevice(name);
126
+ if (!response.success) {
127
+ throw new Error(response.error?.message || 'Failed to enable device');
128
+ }
129
+ writeSuccess(`Device '${name}' enabled`);
130
+ }
131
+ async function disableDevice(api, options) {
132
+ const name = await resolveDeviceName(api, options.deviceName, 'Disable');
133
+ writeProgress(`Disabling '${name}'...`);
134
+ const response = await api.disableDevice(name);
135
+ if (!response.success) {
136
+ throw new Error(response.error?.message || 'Failed to disable device');
137
+ }
138
+ writeSuccess(`Device '${name}' disabled`);
139
+ }
140
+ async function removeDevice(api, options, force) {
141
+ const name = await resolveDeviceName(api, options.deviceName, 'Remove');
142
+ if (!force) {
143
+ const confirm = await safePrompt([
144
+ { type: 'confirm', name: 'yes', message: `Remove device '${name}'? This cannot be undone.`, default: false },
145
+ ]);
146
+ if (!confirm?.yes) {
147
+ console.log('Cancelled.');
148
+ return;
149
+ }
150
+ }
151
+ writeProgress(`Removing '${name}'...`);
152
+ const response = await api.deleteDevice(name);
153
+ if (!response.success) {
154
+ throw new Error(response.error?.message || 'Failed to remove device');
155
+ }
156
+ writeSuccess(`Device '${name}' removed`);
157
+ }
158
+ async function testCommand(api, options) {
159
+ const name = await resolveDeviceName(api, options.deviceName, 'Test command on');
160
+ let command;
161
+ if (cmdHasPositionalCommand(options)) {
162
+ command = options.command;
163
+ }
164
+ else {
165
+ const answer = await safePrompt([
166
+ { type: 'input', name: 'command', message: 'Command name:' },
167
+ ]);
168
+ if (!answer?.command)
169
+ return;
170
+ command = answer.command;
171
+ }
172
+ let payload;
173
+ try {
174
+ payload = JSON.parse(options.payload || '{}');
175
+ }
176
+ catch {
177
+ throw new Error(`Invalid JSON payload: ${options.payload}`);
178
+ }
179
+ const timeout = parseInt(options.timeout || '30000');
180
+ console.log(`\n Sending '${command}' to device '${name}'...`);
181
+ const start = Date.now();
182
+ const response = await api.sendCommand(name, command, payload, timeout);
183
+ const latency = Date.now() - start;
184
+ if (response.success && response.data) {
185
+ const data = response.data;
186
+ if (data.success !== false) {
187
+ writeSuccess(`Response received (${latency}ms):`);
188
+ console.log(JSON.stringify(data.data || data, null, 2));
189
+ }
190
+ else {
191
+ console.log(`\n āŒ Device returned error (${latency}ms):`);
192
+ console.log(` ${data.error || 'Unknown error'}`);
193
+ }
194
+ }
195
+ else {
196
+ const msg = response.error?.message || 'Command failed';
197
+ if (msg.includes('offline')) {
198
+ console.log(`\n āŒ Device '${name}' is offline`);
199
+ }
200
+ else if (msg.includes('timed out')) {
201
+ console.log(`\n āŒ Command timed out after ${timeout}ms`);
202
+ }
203
+ else {
204
+ throw new Error(msg);
205
+ }
206
+ }
207
+ }
208
+ async function testTrigger(api, options) {
209
+ const name = await resolveDeviceName(api, options.deviceName, 'Test trigger on');
210
+ let triggerName;
211
+ const answer = await safePrompt([
212
+ { type: 'input', name: 'trigger', message: 'Trigger name:' },
213
+ ]);
214
+ if (!answer?.trigger)
215
+ return;
216
+ triggerName = answer.trigger;
217
+ let payload;
218
+ try {
219
+ payload = JSON.parse(options.payload || '{}');
220
+ }
221
+ catch {
222
+ throw new Error(`Invalid JSON payload: ${options.payload}`);
223
+ }
224
+ console.log(`\n Simulating trigger '${triggerName}' on device '${name}'...`);
225
+ writeInfo('Note: This sends the trigger through the full execution pipeline on the server.');
226
+ // test-trigger sends a command to the server to simulate a trigger
227
+ // This could be a dedicated endpoint, but for now we use the command endpoint
228
+ // with a special command name that the gateway recognizes
229
+ const response = await api.sendCommand(name, `__test_trigger__${triggerName}`, payload, parseInt(options.timeout || '30000'));
230
+ if (response.success) {
231
+ writeSuccess('Trigger sent successfully. Check agent logs for execution results.');
232
+ }
233
+ else {
234
+ console.log(`\n āŒ ${response.error?.message || 'Failed to send trigger'}`);
235
+ }
236
+ }
237
+ // ─────────────────────────────────────────────────────────────────────────────
238
+ // Helpers
239
+ // ─────────────────────────────────────────────────────────────────────────────
240
+ async function resolveDeviceName(api, name, actionLabel) {
241
+ if (name)
242
+ return name;
243
+ const response = await api.getDevices();
244
+ const devices = response.data?.devices || response.data || [];
245
+ if (!Array.isArray(devices) || devices.length === 0) {
246
+ throw new Error('No devices registered.');
247
+ }
248
+ const answer = await safePrompt([
249
+ {
250
+ type: 'list',
251
+ name: 'device',
252
+ message: `${actionLabel} which device?`,
253
+ choices: devices.map((d) => ({
254
+ name: `${d.name}${d.group ? ` [${d.group}]` : ''}`,
255
+ value: d.name,
256
+ })),
257
+ },
258
+ ]);
259
+ if (!answer?.device)
260
+ throw new Error('No device selected.');
261
+ return answer.device;
262
+ }
263
+ function cmdHasPositionalCommand(options) {
264
+ return !!options.command;
265
+ }
266
+ //# sourceMappingURL=devices.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devices.js","sourceRoot":"","sources":["../../src/commands/devices.ts"],"names":[],"mappings":"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"}
@@ -20,6 +20,7 @@ export { logsCommand } from "./logs.js";
20
20
  export { completionCommand } from "./completion.js";
21
21
  export { skillsCommand } from "./skills.js";
22
22
  export { webhooksCommand } from "./webhooks.js";
23
+ export { devicesCommand } from "./devices.js";
23
24
  export { jobsCommand } from "./jobs.js";
24
25
  export { featuresCommand } from "./features.js";
25
26
  export { preprocessorsCommand } from "./preprocessors.js";
@@ -31,4 +32,5 @@ export { integrationsCommand } from "./integrations.js";
31
32
  export { agentsCommand } from "./agents.js";
32
33
  export { updateCommand } from "./update.js";
33
34
  export { telemetryCommand } from "./telemetry.js";
35
+ export { modelsCommand } from "./models.js";
34
36
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
@@ -20,6 +20,7 @@ export { logsCommand } from "./logs.js";
20
20
  export { completionCommand } from "./completion.js";
21
21
  export { skillsCommand } from "./skills.js";
22
22
  export { webhooksCommand } from "./webhooks.js";
23
+ export { devicesCommand } from "./devices.js";
23
24
  export { jobsCommand } from "./jobs.js";
24
25
  export { featuresCommand } from "./features.js";
25
26
  export { preprocessorsCommand } from "./preprocessors.js";
@@ -31,4 +32,5 @@ export { integrationsCommand } from "./integrations.js";
31
32
  export { agentsCommand } from "./agents.js";
32
33
  export { updateCommand } from "./update.js";
33
34
  export { telemetryCommand } from "./telemetry.js";
35
+ export { modelsCommand } from "./models.js";
34
36
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
@@ -11,6 +11,7 @@ interface InitCommandOptions {
11
11
  agentName?: string;
12
12
  orgId?: string;
13
13
  orgName?: string;
14
+ model?: string;
14
15
  force?: boolean;
15
16
  restoreSources?: boolean;
16
17
  promoCode?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAyCH;;GAEG;AACH,UAAU,kBAAkB;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA4ED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAsB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8OjF"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA6CH;;GAEG;AACH,UAAU,kBAAkB;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA4ED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAsB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+QjF"}
@@ -6,8 +6,8 @@ import inquirer from 'inquirer';
6
6
  import { checkApiKey } from "../services/auth.js";
7
7
  import { requireAuthOrExit } from "../utils/command-utils.js";
8
8
  import { withErrorHandling, writeProgress, writeSuccess, writeInfo, writeError, } from "../utils/cli.js";
9
- import { promptAgentChoice, promptOrganizationSelection, promptAgentSelection, promptMetadataCollection, promptAgentName, displayPersonaInstructions, } from "../utils/init-prompts.js";
10
- import { fetchAgentTypes, selectBaseAgentType, createNewAgent, fetchExistingAgentDetails, } from "../utils/init-agent.js";
9
+ import { promptAgentChoice, promptOrganizationSelection, promptAgentSelection, promptMetadataCollection, promptAgentName, promptModelSelection, displayPersonaInstructions, } from "../utils/init-prompts.js";
10
+ import { fetchAgentTypes, selectBaseAgentType, createNewAgent, fetchExistingAgentDetails, fetchApprovedModels, validateModelCode, updateAgentModel, } from "../utils/init-agent.js";
11
11
  import { initializeProject, installDependencies, clearLinesIfNeeded, } from "../utils/init-helpers.js";
12
12
  import { readYamlConfig, updateYamlAgent } from "../utils/files.js";
13
13
  import BackupApi from "../api/backup.api.service.js";
@@ -196,75 +196,75 @@ export async function initCommand(options = {}) {
196
196
  let selectedAgent;
197
197
  let selectedOrg;
198
198
  let persona;
199
+ let serverModel;
199
200
  let isNewAgent = false;
200
- // Step 4: Execute based on mode
201
+ let selectedModel;
202
+ // Non-interactive --model flag: validate early
203
+ if (options.model) {
204
+ const models = await fetchApprovedModels(apiKey);
205
+ selectedModel = validateModelCode(models, options.model);
206
+ }
207
+ // Step 4: Execute based on mode — select or create agent
201
208
  if (mode.type === 'existing-agent') {
202
- // Non-interactive: use existing agent by ID
203
209
  const result = await selectExistingAgentById(userData, apiKey, mode.agentId);
204
210
  selectedAgent = result.agent;
205
211
  selectedOrg = result.org;
206
212
  persona = result.persona;
213
+ serverModel = result.model;
207
214
  }
208
215
  else if (mode.type === 'new-agent') {
209
- // Non-interactive: create new agent
210
216
  const result = await createNewAgentNonInteractive(apiKey, userData, mode.agentName, mode.orgId, mode.orgName, options.promoCode);
211
217
  selectedAgent = result.agent;
212
218
  selectedOrg = result.org;
213
219
  persona = result.persona;
214
220
  isNewAgent = true;
215
- // Show persona configuration instructions for new agents
216
- displayPersonaInstructions();
217
221
  }
218
222
  else {
219
223
  // Interactive mode
220
224
  const agentChoice = await promptAgentChoice();
221
225
  if (agentChoice === "existing") {
222
- // Step 4a: Select existing agent
223
226
  const result = await selectExistingAgent(userData, apiKey);
224
227
  selectedAgent = result.agent;
225
228
  selectedOrg = result.org;
226
229
  persona = result.persona;
230
+ serverModel = result.model;
227
231
  }
228
232
  else {
229
- // Step 4b: Create new agent
230
233
  const result = await createNewAgentFlow(apiKey, userData, options.promoCode);
231
234
  selectedAgent = result.agent;
232
235
  selectedOrg = result.org;
233
236
  persona = result.persona;
237
+ selectedModel = result.model;
234
238
  isNewAgent = true;
235
- // Show persona configuration instructions for new agents
236
- displayPersonaInstructions();
237
239
  }
238
240
  }
239
241
  // Step 4.5: Check for backup restoration (existing agents only)
240
242
  let sourcesRestored = false;
241
243
  if (!isNewAgent && !yamlExists) {
242
- // Only check backup for existing agents during fresh init (not when YAML exists)
243
244
  sourcesRestored = await checkAndRestoreBackup(apiKey, selectedAgent.agentId, {
244
245
  interactive: mode.type === 'interactive',
245
246
  autoRestore: options.restoreSources === true
246
247
  });
247
248
  }
248
- // Step 4.6: After restoration, mirror server config (persona/name/model) into source.
249
- // Fetch server state directly rather than going through agentHandler.checkDrift —
250
- // drift detection reads local state from the compilation manifest, which doesn't
251
- // exist yet right after a fresh init + restore.
249
+ // Step 4.6: After restoration, mirror server config (name/persona/model) into source.
250
+ // Fetch server state directly rather than agentHandler.checkDrift — drift detection
251
+ // reads from the compilation manifest, which doesn't exist after a fresh init + restore.
252
252
  if (sourcesRestored && !isNewAgent) {
253
253
  try {
254
254
  console.log('\nSyncing agent configuration from server...');
255
- const [serverName, serverPersonaData, serverModel] = await Promise.all([
255
+ const [syncName, syncPersonaData, syncModel] = await Promise.all([
256
256
  fetchServerName(apiKey, selectedAgent.agentId),
257
257
  fetchServerPersona(apiKey, selectedAgent.agentId),
258
258
  fetchServerModel(apiKey, selectedAgent.agentId),
259
259
  ]);
260
- if (serverPersonaData?.persona) {
261
- agentHandler.pullPersona(serverPersonaData.persona);
260
+ if (syncPersonaData?.persona) {
261
+ agentHandler.pullPersona(syncPersonaData.persona);
262
262
  }
263
- if (serverName) {
264
- agentHandler.pullName(serverName);
263
+ if (syncName) {
264
+ agentHandler.pullName(syncName);
265
265
  }
266
- if (serverModel) {
267
- agentHandler.pullModel(serverModel);
266
+ if (syncModel) {
267
+ agentHandler.pullModel(syncModel);
268
268
  }
269
269
  writeSuccess(' āœ… Agent configuration synced');
270
270
  }
@@ -272,22 +272,52 @@ export async function initCommand(options = {}) {
272
272
  writeInfo(' ⚠ Failed to sync agent config — run "lua sync" manually');
273
273
  }
274
274
  }
275
+ // Resolve model for existing agents (new agents already prompted above).
276
+ // Backup restored: server sync (Step 4.6) already handled it.
277
+ // Existing (no backup): use server model if present, else prompt.
278
+ if (!sourcesRestored && !isNewAgent && !selectedModel) {
279
+ if (serverModel) {
280
+ selectedModel = serverModel;
281
+ }
282
+ else if (mode.type === 'interactive') {
283
+ const models = await fetchApprovedModels(apiKey);
284
+ if (models.length > 0) {
285
+ selectedModel = await promptModelSelection(models);
286
+ }
287
+ }
288
+ }
289
+ // Show persona instructions (new agents only, after all prompts)
290
+ if (isNewAgent) {
291
+ displayPersonaInstructions();
292
+ }
293
+ // Push model to server only if the user explicitly selected/overrode it
294
+ // (don't push back a model we just fetched from the server)
295
+ const userChoseModel = selectedModel && selectedModel !== serverModel;
296
+ if (userChoseModel) {
297
+ try {
298
+ writeProgress(`šŸ¤– Setting model: ${selectedModel}...`);
299
+ await updateAgentModel(apiKey, selectedAgent.agentId, selectedModel);
300
+ writeProgress(`āœ… Model set: ${selectedModel}`);
301
+ }
302
+ catch (error) {
303
+ writeInfo(`āš ļø Could not set model on server — you can push it later with \`lua push agent\``);
304
+ }
305
+ }
275
306
  // Step 5: Initialize or update project
276
307
  if (yamlExists) {
277
308
  // Update existing YAML and LuaAgent in index.ts
278
309
  writeInfo("šŸ“ Updating existing lua.skill.yaml with new agent...");
279
310
  updateYamlAgent(selectedAgent.agentId, selectedOrg.id);
280
- // Also update LuaAgent in index.ts if it exists
281
311
  const { updateAgentConfig } = await import("../compiler/index.js");
282
- updateAgentConfig({ name: selectedAgent.name, persona }, { projectDir: process.cwd() });
312
+ updateAgentConfig({ name: selectedAgent.name, persona, model: selectedModel }, { projectDir: process.cwd() });
283
313
  writeSuccess("āœ… lua.skill.yaml updated successfully!");
284
314
  writeSuccess("āœ… LuaAgent configuration updated!");
285
315
  }
286
316
  else {
287
317
  // Full project initialization
288
318
  // Skip template source files if sources were restored from backup
289
- const currentDir = initializeProject(selectedAgent.agentId, selectedOrg.id, persona, selectedAgent.name, withExamples, sourcesRestored // skipSourceTemplates - don't copy src/ templates if restored
290
- );
319
+ const currentDir = initializeProject(selectedAgent.agentId, selectedOrg.id, persona, selectedAgent.name, withExamples, sourcesRestored, // skipSourceTemplates - don't copy src/ if restored
320
+ selectedModel);
291
321
  // Step 6: Install dependencies
292
322
  await installDependencies(currentDir);
293
323
  if (sourcesRestored) {
@@ -311,6 +341,8 @@ export async function initCommand(options = {}) {
311
341
  restore_from_backup: options.restoreSources || false,
312
342
  examples_included: withExamples,
313
343
  sources_restored: sourcesRestored,
344
+ model_selected: !!selectedModel,
345
+ model: selectedModel,
314
346
  });
315
347
  }, "initialization");
316
348
  }
@@ -332,12 +364,13 @@ async function selectExistingAgent(userData, apiKey) {
332
364
  const selectedOrg = await promptOrganizationSelection(orgs);
333
365
  // Select agent from organization
334
366
  const selectedAgent = await promptAgentSelection(selectedOrg);
335
- // Fetch agent details to get persona
367
+ // Fetch agent details to get persona and model
336
368
  const agentDetails = await fetchExistingAgentDetails(apiKey, selectedAgent.agentId);
337
369
  return {
338
370
  agent: selectedAgent,
339
371
  org: selectedOrg,
340
- persona: agentDetails.persona
372
+ persona: agentDetails.persona,
373
+ model: agentDetails.model,
341
374
  };
342
375
  }
343
376
  /**
@@ -360,12 +393,13 @@ async function selectExistingAgentById(userData, apiKey, agentId) {
360
393
  const agent = org.agents?.find((a) => a.agentId === agentId);
361
394
  if (agent) {
362
395
  writeProgress(`āœ… Found agent: ${agent.name}`);
363
- // Fetch agent details to get persona
396
+ // Fetch agent details to get persona and model
364
397
  const agentDetails = await fetchExistingAgentDetails(apiKey, agentId);
365
398
  return {
366
399
  agent: { agentId: agent.agentId, name: agent.name },
367
400
  org: { id: org.id, name: org.registeredName, agents: org.agents },
368
- persona: agentDetails.persona
401
+ persona: agentDetails.persona,
402
+ model: agentDetails.model,
369
403
  };
370
404
  }
371
405
  }
@@ -494,11 +528,17 @@ async function createNewAgentFlow(apiKey, userData, promoCode) {
494
528
  // Collect agent name
495
529
  const agentName = await promptAgentName();
496
530
  linesToClear += 1; // agentName prompt
531
+ // Prompt for model (last config step before creation)
532
+ let selectedModel;
533
+ const models = await fetchApprovedModels(apiKey);
534
+ if (models.length > 0) {
535
+ selectedModel = await promptModelSelection(models);
536
+ }
497
537
  // Clear all prompts
498
538
  clearLinesIfNeeded(linesToClear);
499
539
  // Create the agent
500
540
  const result = await createNewAgent(apiKey, selectedAgentType, agentName, metadata, features, orgId, orgName, promoCode);
501
- return result;
541
+ return { ...result, model: selectedModel };
502
542
  }
503
543
  /**
504
544
  * Check if user has access to a specific agent
@@ -518,39 +558,62 @@ function checkUserHasAccessToAgent(userData, agentId) {
518
558
  */
519
559
  async function handleAgentSwitch(userData, apiKey, existingYaml) {
520
560
  writeInfo("\nšŸ”„ Let's switch to a different agent...\n");
521
- // Prompt for agent choice
522
561
  const agentChoice = await promptAgentChoice();
523
562
  let selectedAgent;
524
563
  let selectedOrg;
525
564
  let persona;
565
+ let serverModel;
566
+ let isNewAgent = false;
567
+ let selectedModel;
526
568
  if (agentChoice === "existing") {
527
- // Select existing agent
528
569
  const result = await selectExistingAgent(userData, apiKey);
529
570
  selectedAgent = result.agent;
530
571
  selectedOrg = result.org;
531
572
  persona = result.persona;
573
+ serverModel = result.model;
574
+ // Use server model if present, else prompt
575
+ if (serverModel) {
576
+ selectedModel = serverModel;
577
+ }
578
+ else {
579
+ const models = await fetchApprovedModels(apiKey);
580
+ if (models.length > 0) {
581
+ selectedModel = await promptModelSelection(models);
582
+ }
583
+ }
532
584
  }
533
585
  else {
534
- // Create new agent
535
586
  const result = await createNewAgentFlow(apiKey, userData);
536
587
  selectedAgent = result.agent;
537
588
  selectedOrg = result.org;
538
589
  persona = result.persona;
539
- // Show persona configuration instructions for new agents
590
+ selectedModel = result.model;
591
+ isNewAgent = true;
540
592
  displayPersonaInstructions();
541
593
  }
542
594
  // Ask about persona
543
595
  const finalPersona = await promptPersonaReplacement(existingYaml, persona);
596
+ // Push model to server only if user explicitly chose a new one
597
+ const userChoseModel = selectedModel && selectedModel !== serverModel;
598
+ if (userChoseModel) {
599
+ try {
600
+ writeProgress(`šŸ¤– Setting model: ${selectedModel}...`);
601
+ await updateAgentModel(apiKey, selectedAgent.agentId, selectedModel);
602
+ writeProgress(`āœ… Model set: ${selectedModel}`);
603
+ }
604
+ catch (error) {
605
+ writeInfo(`āš ļø Could not set model on server — you can push it later with \`lua push agent\``);
606
+ }
607
+ }
544
608
  // Update existing YAML file with new agent
545
609
  writeInfo("\nšŸ“ Updating lua.skill.yaml with new agent...");
546
610
  updateYamlAgent(selectedAgent.agentId, selectedOrg.id);
547
- // Also update LuaAgent in index.ts if it exists
548
611
  const { updateAgentConfig } = await import("../compiler/index.js");
549
- updateAgentConfig({ name: selectedAgent.name, persona: finalPersona }, { projectDir: process.cwd() });
612
+ updateAgentConfig({ name: selectedAgent.name, persona: finalPersona, model: selectedModel }, { projectDir: process.cwd() });
550
613
  writeSuccess("āœ… lua.skill.yaml updated successfully!");
551
614
  writeSuccess("āœ… LuaAgent configuration updated!");
552
615
  writeInfo("\nšŸ’” Your project now uses the new agent. Run 'lua compile' to update your skills.\n");
553
- trackEvent('cli_init_agent_switched');
616
+ trackEvent('cli_init_agent_switched', { model_selected: !!selectedModel, model: selectedModel });
554
617
  }
555
618
  /**
556
619
  * Prompt user about replacing existing persona