lua-cli 3.12.2 → 3.14.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 (568) hide show
  1. package/README.md +14 -13
  2. package/dist/api/agent.api.service.d.ts +20 -20
  3. package/dist/api/agent.api.service.d.ts.map +1 -1
  4. package/dist/api/agent.api.service.js +1 -1
  5. package/dist/api/agent.api.service.js.map +1 -1
  6. package/dist/api/agents.api.service.d.ts +3 -3
  7. package/dist/api/agents.api.service.d.ts.map +1 -1
  8. package/dist/api/agents.api.service.js +11 -9
  9. package/dist/api/agents.api.service.js.map +1 -1
  10. package/dist/api/ai.api.service.d.ts +4 -4
  11. package/dist/api/ai.api.service.d.ts.map +1 -1
  12. package/dist/api/ai.api.service.js +10 -8
  13. package/dist/api/ai.api.service.js.map +1 -1
  14. package/dist/api/auth.api.service.d.ts +3 -3
  15. package/dist/api/auth.api.service.d.ts.map +1 -1
  16. package/dist/api/auth.api.service.js +1 -1
  17. package/dist/api/auth.api.service.js.map +1 -1
  18. package/dist/api/backup.api.service.d.ts.map +1 -1
  19. package/dist/api/backup.api.service.js +21 -7
  20. package/dist/api/backup.api.service.js.map +1 -1
  21. package/dist/api/basket.api.service.d.ts +5 -5
  22. package/dist/api/basket.api.service.d.ts.map +1 -1
  23. package/dist/api/basket.api.service.js +4 -4
  24. package/dist/api/basket.api.service.js.map +1 -1
  25. package/dist/api/cdn.api.service.d.ts +1 -1
  26. package/dist/api/cdn.api.service.js +3 -3
  27. package/dist/api/cdn.api.service.js.map +1 -1
  28. package/dist/api/chat.api.service.d.ts +4 -4
  29. package/dist/api/chat.api.service.js +3 -3
  30. package/dist/api/chat.api.service.js.map +1 -1
  31. package/dist/api/credentials.js +3 -3
  32. package/dist/api/custom.data.api.service.d.ts +4 -4
  33. package/dist/api/custom.data.api.service.d.ts.map +1 -1
  34. package/dist/api/custom.data.api.service.js +2 -2
  35. package/dist/api/custom.data.api.service.js.map +1 -1
  36. package/dist/api/developer.api.service.d.ts +3 -3
  37. package/dist/api/developer.api.service.d.ts.map +1 -1
  38. package/dist/api/developer.api.service.js +7 -3
  39. package/dist/api/developer.api.service.js.map +1 -1
  40. package/dist/api/device-trigger.api.service.d.ts +3 -3
  41. package/dist/api/device-trigger.api.service.d.ts.map +1 -1
  42. package/dist/api/device-trigger.api.service.js +1 -1
  43. package/dist/api/device-trigger.api.service.js.map +1 -1
  44. package/dist/api/device.api.service.d.ts +3 -3
  45. package/dist/api/device.api.service.d.ts.map +1 -1
  46. package/dist/api/device.api.service.js +1 -1
  47. package/dist/api/device.api.service.js.map +1 -1
  48. package/dist/api/http.client.d.ts +1 -1
  49. package/dist/api/http.client.d.ts.map +1 -1
  50. package/dist/api/http.client.js +6 -6
  51. package/dist/api/http.client.js.map +1 -1
  52. package/dist/api/job.api.service.d.ts +13 -14
  53. package/dist/api/job.api.service.d.ts.map +1 -1
  54. package/dist/api/job.api.service.js +12 -20
  55. package/dist/api/job.api.service.js.map +1 -1
  56. package/dist/api/lazy-instances.d.ts +12 -12
  57. package/dist/api/lazy-instances.js +14 -14
  58. package/dist/api/logs.api.service.d.ts +9 -6
  59. package/dist/api/logs.api.service.d.ts.map +1 -1
  60. package/dist/api/logs.api.service.js +12 -11
  61. package/dist/api/logs.api.service.js.map +1 -1
  62. package/dist/api/marketplace.api.service.d.ts +1 -1
  63. package/dist/api/marketplace.api.service.d.ts.map +1 -1
  64. package/dist/api/marketplace.api.service.js +18 -18
  65. package/dist/api/marketplace.api.service.js.map +1 -1
  66. package/dist/api/order.api.service.d.ts +4 -4
  67. package/dist/api/order.api.service.d.ts.map +1 -1
  68. package/dist/api/order.api.service.js +2 -2
  69. package/dist/api/order.api.service.js.map +1 -1
  70. package/dist/api/persona.api.service.d.ts +3 -3
  71. package/dist/api/persona.api.service.d.ts.map +1 -1
  72. package/dist/api/persona.api.service.js +2 -2
  73. package/dist/api/persona.api.service.js.map +1 -1
  74. package/dist/api/postprocessor.api.service.d.ts +8 -9
  75. package/dist/api/postprocessor.api.service.d.ts.map +1 -1
  76. package/dist/api/postprocessor.api.service.js +1 -2
  77. package/dist/api/postprocessor.api.service.js.map +1 -1
  78. package/dist/api/preprocessor.api.service.d.ts +8 -9
  79. package/dist/api/preprocessor.api.service.d.ts.map +1 -1
  80. package/dist/api/preprocessor.api.service.js +1 -2
  81. package/dist/api/preprocessor.api.service.js.map +1 -1
  82. package/dist/api/products.api.service.d.ts +9 -9
  83. package/dist/api/products.api.service.d.ts.map +1 -1
  84. package/dist/api/products.api.service.js +10 -10
  85. package/dist/api/products.api.service.js.map +1 -1
  86. package/dist/api/resource.api.service.d.ts +2 -2
  87. package/dist/api/resource.api.service.js +1 -1
  88. package/dist/api/skills.api.service.d.ts +4 -4
  89. package/dist/api/skills.api.service.d.ts.map +1 -1
  90. package/dist/api/skills.api.service.js +1 -1
  91. package/dist/api/skills.api.service.js.map +1 -1
  92. package/dist/api/tool.api.service.d.ts +2 -2
  93. package/dist/api/tool.api.service.js +1 -1
  94. package/dist/api/unifiedto.api.service.d.ts +3 -3
  95. package/dist/api/unifiedto.api.service.d.ts.map +1 -1
  96. package/dist/api/unifiedto.api.service.js +28 -10
  97. package/dist/api/unifiedto.api.service.js.map +1 -1
  98. package/dist/api/user.data.api.service.d.ts +6 -6
  99. package/dist/api/user.data.api.service.d.ts.map +1 -1
  100. package/dist/api/user.data.api.service.js +5 -5
  101. package/dist/api/user.data.api.service.js.map +1 -1
  102. package/dist/api/webhook.api.service.d.ts +3 -3
  103. package/dist/api/webhook.api.service.d.ts.map +1 -1
  104. package/dist/api/webhook.api.service.js +1 -1
  105. package/dist/api/webhook.api.service.js.map +1 -1
  106. package/dist/api/whatsapp-templates.api.service.d.ts +3 -3
  107. package/dist/api/whatsapp-templates.api.service.js +1 -1
  108. package/dist/api-exports.d.ts +25 -25
  109. package/dist/api-exports.d.ts.map +1 -1
  110. package/dist/api-exports.js +26 -26
  111. package/dist/api-exports.js.map +1 -1
  112. package/dist/cli/command-definitions.d.ts +1 -1
  113. package/dist/cli/command-definitions.d.ts.map +1 -1
  114. package/dist/cli/command-definitions.js +209 -196
  115. package/dist/cli/command-definitions.js.map +1 -1
  116. package/dist/commands/agents.js +2 -2
  117. package/dist/commands/apiKey.js +12 -12
  118. package/dist/commands/channels.d.ts.map +1 -1
  119. package/dist/commands/channels.js +165 -174
  120. package/dist/commands/channels.js.map +1 -1
  121. package/dist/commands/chat-log-probe.d.ts +59 -0
  122. package/dist/commands/chat-log-probe.d.ts.map +1 -0
  123. package/dist/commands/chat-log-probe.js +87 -0
  124. package/dist/commands/chat-log-probe.js.map +1 -0
  125. package/dist/commands/chat.d.ts.map +1 -1
  126. package/dist/commands/chat.js +143 -40
  127. package/dist/commands/chat.js.map +1 -1
  128. package/dist/commands/chatClear.d.ts.map +1 -1
  129. package/dist/commands/chatClear.js +10 -6
  130. package/dist/commands/chatClear.js.map +1 -1
  131. package/dist/commands/compile.d.ts +7 -0
  132. package/dist/commands/compile.d.ts.map +1 -1
  133. package/dist/commands/compile.js +49 -12
  134. package/dist/commands/compile.js.map +1 -1
  135. package/dist/commands/completion.d.ts.map +1 -1
  136. package/dist/commands/completion.js +8 -9
  137. package/dist/commands/completion.js.map +1 -1
  138. package/dist/commands/configure.js +5 -5
  139. package/dist/commands/deploy.d.ts.map +1 -1
  140. package/dist/commands/deploy.js +132 -35
  141. package/dist/commands/deploy.js.map +1 -1
  142. package/dist/commands/destroy.d.ts.map +1 -1
  143. package/dist/commands/destroy.js +27 -17
  144. package/dist/commands/destroy.js.map +1 -1
  145. package/dist/commands/devices.d.ts.map +1 -1
  146. package/dist/commands/devices.js +4 -5
  147. package/dist/commands/devices.js.map +1 -1
  148. package/dist/commands/env.d.ts.map +1 -1
  149. package/dist/commands/env.js +101 -80
  150. package/dist/commands/env.js.map +1 -1
  151. package/dist/commands/features.d.ts.map +1 -1
  152. package/dist/commands/features.js +71 -82
  153. package/dist/commands/features.js.map +1 -1
  154. package/dist/commands/governance.d.ts.map +1 -1
  155. package/dist/commands/governance.js +17 -15
  156. package/dist/commands/governance.js.map +1 -1
  157. package/dist/commands/index.d.ts +37 -36
  158. package/dist/commands/index.d.ts.map +1 -1
  159. package/dist/commands/index.js +37 -36
  160. package/dist/commands/index.js.map +1 -1
  161. package/dist/commands/init.d.ts.map +1 -1
  162. package/dist/commands/init.js +80 -70
  163. package/dist/commands/init.js.map +1 -1
  164. package/dist/commands/integrations.d.ts.map +1 -1
  165. package/dist/commands/integrations.js +373 -341
  166. package/dist/commands/integrations.js.map +1 -1
  167. package/dist/commands/jobs.d.ts.map +1 -1
  168. package/dist/commands/jobs.js +110 -78
  169. package/dist/commands/jobs.js.map +1 -1
  170. package/dist/commands/log-tip.d.ts +79 -0
  171. package/dist/commands/log-tip.d.ts.map +1 -0
  172. package/dist/commands/log-tip.js +83 -0
  173. package/dist/commands/log-tip.js.map +1 -0
  174. package/dist/commands/logs.d.ts.map +1 -1
  175. package/dist/commands/logs.js +166 -198
  176. package/dist/commands/logs.js.map +1 -1
  177. package/dist/commands/marketplace.d.ts.map +1 -1
  178. package/dist/commands/marketplace.js +381 -427
  179. package/dist/commands/marketplace.js.map +1 -1
  180. package/dist/commands/mcp.d.ts.map +1 -1
  181. package/dist/commands/mcp.js +54 -56
  182. package/dist/commands/mcp.js.map +1 -1
  183. package/dist/commands/models.d.ts.map +1 -1
  184. package/dist/commands/models.js +4 -3
  185. package/dist/commands/models.js.map +1 -1
  186. package/dist/commands/persona.d.ts.map +1 -1
  187. package/dist/commands/persona.js +100 -126
  188. package/dist/commands/persona.js.map +1 -1
  189. package/dist/commands/postprocessors.d.ts.map +1 -1
  190. package/dist/commands/postprocessors.js +87 -61
  191. package/dist/commands/postprocessors.js.map +1 -1
  192. package/dist/commands/preprocessors.d.ts.map +1 -1
  193. package/dist/commands/preprocessors.js +87 -61
  194. package/dist/commands/preprocessors.js.map +1 -1
  195. package/dist/commands/production.d.ts.map +1 -1
  196. package/dist/commands/production.js +101 -113
  197. package/dist/commands/production.js.map +1 -1
  198. package/dist/commands/push-helpers.d.ts +42 -0
  199. package/dist/commands/push-helpers.d.ts.map +1 -0
  200. package/dist/commands/push-helpers.js +48 -0
  201. package/dist/commands/push-helpers.js.map +1 -0
  202. package/dist/commands/push.d.ts +2 -0
  203. package/dist/commands/push.d.ts.map +1 -1
  204. package/dist/commands/push.js +388 -124
  205. package/dist/commands/push.js.map +1 -1
  206. package/dist/commands/pushBackup.d.ts.map +1 -1
  207. package/dist/commands/pushBackup.js +8 -4
  208. package/dist/commands/pushBackup.js.map +1 -1
  209. package/dist/commands/resources.d.ts.map +1 -1
  210. package/dist/commands/resources.js +47 -60
  211. package/dist/commands/resources.js.map +1 -1
  212. package/dist/commands/skills.d.ts.map +1 -1
  213. package/dist/commands/skills.js +117 -89
  214. package/dist/commands/skills.js.map +1 -1
  215. package/dist/commands/status.d.ts +14 -0
  216. package/dist/commands/status.d.ts.map +1 -0
  217. package/dist/commands/status.js +731 -0
  218. package/dist/commands/status.js.map +1 -0
  219. package/dist/commands/sync.d.ts.map +1 -1
  220. package/dist/commands/sync.js +70 -30
  221. package/dist/commands/sync.js.map +1 -1
  222. package/dist/commands/telemetry.d.ts.map +1 -1
  223. package/dist/commands/telemetry.js +4 -0
  224. package/dist/commands/telemetry.js.map +1 -1
  225. package/dist/commands/test-output.helpers.d.ts +24 -0
  226. package/dist/commands/test-output.helpers.d.ts.map +1 -0
  227. package/dist/commands/test-output.helpers.js +62 -0
  228. package/dist/commands/test-output.helpers.js.map +1 -0
  229. package/dist/commands/test.d.ts.map +1 -1
  230. package/dist/commands/test.js +291 -121
  231. package/dist/commands/test.js.map +1 -1
  232. package/dist/commands/update.d.ts.map +1 -1
  233. package/dist/commands/update.js +15 -3
  234. package/dist/commands/update.js.map +1 -1
  235. package/dist/commands/webhooks.d.ts.map +1 -1
  236. package/dist/commands/webhooks.js +94 -87
  237. package/dist/commands/webhooks.js.map +1 -1
  238. package/dist/compiler/agent-traverser.d.ts +50 -14
  239. package/dist/compiler/agent-traverser.d.ts.map +1 -1
  240. package/dist/compiler/agent-traverser.js +189 -86
  241. package/dist/compiler/agent-traverser.js.map +1 -1
  242. package/dist/compiler/bundler.d.ts.map +1 -1
  243. package/dist/compiler/bundler.js +5 -5
  244. package/dist/compiler/bundler.js.map +1 -1
  245. package/dist/compiler/compiler.d.ts +32 -0
  246. package/dist/compiler/compiler.d.ts.map +1 -1
  247. package/dist/compiler/compiler.js +154 -28
  248. package/dist/compiler/compiler.js.map +1 -1
  249. package/dist/compiler/index.d.ts +3 -3
  250. package/dist/compiler/index.d.ts.map +1 -1
  251. package/dist/compiler/index.js +3 -3
  252. package/dist/compiler/index.js.map +1 -1
  253. package/dist/compiler/plugins/agent.plugin.d.ts.map +1 -1
  254. package/dist/compiler/plugins/agent.plugin.js +2 -4
  255. package/dist/compiler/plugins/agent.plugin.js.map +1 -1
  256. package/dist/compiler/plugins/base.d.ts +21 -0
  257. package/dist/compiler/plugins/base.d.ts.map +1 -1
  258. package/dist/compiler/plugins/base.js +13 -3
  259. package/dist/compiler/plugins/base.js.map +1 -1
  260. package/dist/compiler/plugins/device-trigger.plugin.d.ts.map +1 -1
  261. package/dist/compiler/plugins/device-trigger.plugin.js +8 -4
  262. package/dist/compiler/plugins/device-trigger.plugin.js.map +1 -1
  263. package/dist/compiler/plugins/device.plugin.d.ts.map +1 -1
  264. package/dist/compiler/plugins/device.plugin.js +4 -4
  265. package/dist/compiler/plugins/device.plugin.js.map +1 -1
  266. package/dist/compiler/plugins/job.plugin.d.ts.map +1 -1
  267. package/dist/compiler/plugins/job.plugin.js +15 -11
  268. package/dist/compiler/plugins/job.plugin.js.map +1 -1
  269. package/dist/compiler/plugins/mcp-server.plugin.d.ts.map +1 -1
  270. package/dist/compiler/plugins/mcp-server.plugin.js +10 -4
  271. package/dist/compiler/plugins/mcp-server.plugin.js.map +1 -1
  272. package/dist/compiler/plugins/registry.js +2 -2
  273. package/dist/compiler/plugins/registry.js.map +1 -1
  274. package/dist/compiler/plugins/skill.plugin.d.ts +35 -9
  275. package/dist/compiler/plugins/skill.plugin.d.ts.map +1 -1
  276. package/dist/compiler/plugins/skill.plugin.js +129 -87
  277. package/dist/compiler/plugins/skill.plugin.js.map +1 -1
  278. package/dist/compiler/plugins/tool.plugin.d.ts.map +1 -1
  279. package/dist/compiler/plugins/tool.plugin.js +13 -9
  280. package/dist/compiler/plugins/tool.plugin.js.map +1 -1
  281. package/dist/compiler/plugins/webhook.plugin.d.ts.map +1 -1
  282. package/dist/compiler/plugins/webhook.plugin.js +7 -5
  283. package/dist/compiler/plugins/webhook.plugin.js.map +1 -1
  284. package/dist/compiler/source-writer.d.ts.map +1 -1
  285. package/dist/compiler/source-writer.js +2 -4
  286. package/dist/compiler/source-writer.js.map +1 -1
  287. package/dist/compiler/types.d.ts +33 -0
  288. package/dist/compiler/types.d.ts.map +1 -1
  289. package/dist/compiler/types.js.map +1 -1
  290. package/dist/compiler/utils/ast-helpers.d.ts +1 -16
  291. package/dist/compiler/utils/ast-helpers.d.ts.map +1 -1
  292. package/dist/compiler/utils/ast-helpers.js +14 -38
  293. package/dist/compiler/utils/ast-helpers.js.map +1 -1
  294. package/dist/compiler/utils/common.d.ts +14 -0
  295. package/dist/compiler/utils/common.d.ts.map +1 -1
  296. package/dist/compiler/utils/common.js +39 -11
  297. package/dist/compiler/utils/common.js.map +1 -1
  298. package/dist/compiler/utils/file-discovery.d.ts.map +1 -1
  299. package/dist/compiler/utils/file-discovery.js +2 -10
  300. package/dist/compiler/utils/file-discovery.js.map +1 -1
  301. package/dist/compiler/utils/path-resolver.d.ts +67 -10
  302. package/dist/compiler/utils/path-resolver.d.ts.map +1 -1
  303. package/dist/compiler/utils/path-resolver.js +120 -24
  304. package/dist/compiler/utils/path-resolver.js.map +1 -1
  305. package/dist/compiler/utils/reference-resolver.d.ts +196 -0
  306. package/dist/compiler/utils/reference-resolver.d.ts.map +1 -0
  307. package/dist/compiler/utils/reference-resolver.js +1026 -0
  308. package/dist/compiler/utils/reference-resolver.js.map +1 -0
  309. package/dist/compiler/utils/schema-converter.d.ts +25 -0
  310. package/dist/compiler/utils/schema-converter.d.ts.map +1 -1
  311. package/dist/compiler/utils/schema-converter.js +80 -4
  312. package/dist/compiler/utils/schema-converter.js.map +1 -1
  313. package/dist/compiler/utils/workspace.d.ts +35 -0
  314. package/dist/compiler/utils/workspace.d.ts.map +1 -0
  315. package/dist/compiler/utils/workspace.js +121 -0
  316. package/dist/compiler/utils/workspace.js.map +1 -0
  317. package/dist/compiler/utils/zod-runtime.mjs +5334 -0
  318. package/dist/config/compile.constants.d.ts.map +1 -1
  319. package/dist/config/compile.constants.js +3 -1
  320. package/dist/config/compile.constants.js.map +1 -1
  321. package/dist/config/constants.d.ts.map +1 -1
  322. package/dist/config/constants.js +1 -5
  323. package/dist/config/constants.js.map +1 -1
  324. package/dist/errors/auth.error.d.ts.map +1 -1
  325. package/dist/errors/auth.error.js +3 -5
  326. package/dist/errors/auth.error.js.map +1 -1
  327. package/dist/errors/index.d.ts +1 -1
  328. package/dist/errors/index.js +1 -1
  329. package/dist/index.js +9 -8
  330. package/dist/index.js.map +1 -1
  331. package/dist/instances/basket.instance.d.ts +3 -3
  332. package/dist/instances/basket.instance.d.ts.map +1 -1
  333. package/dist/instances/basket.instance.js +26 -8
  334. package/dist/instances/basket.instance.js.map +1 -1
  335. package/dist/instances/data.entry.instance.d.ts +2 -2
  336. package/dist/instances/data.entry.instance.d.ts.map +1 -1
  337. package/dist/instances/data.entry.instance.js +5 -5
  338. package/dist/instances/data.entry.instance.js.map +1 -1
  339. package/dist/instances/order.instance.d.ts +2 -2
  340. package/dist/instances/order.instance.d.ts.map +1 -1
  341. package/dist/instances/order.instance.js +20 -9
  342. package/dist/instances/order.instance.js.map +1 -1
  343. package/dist/instances/product.instance.d.ts +1 -1
  344. package/dist/instances/product.instance.d.ts.map +1 -1
  345. package/dist/instances/product.instance.js +3 -3
  346. package/dist/instances/product.instance.js.map +1 -1
  347. package/dist/instances/product.pagination.instance.d.ts +2 -2
  348. package/dist/instances/product.pagination.instance.d.ts.map +1 -1
  349. package/dist/instances/product.pagination.instance.js +6 -7
  350. package/dist/instances/product.pagination.instance.js.map +1 -1
  351. package/dist/instances/product.search.instance.d.ts +3 -3
  352. package/dist/instances/product.search.instance.d.ts.map +1 -1
  353. package/dist/instances/product.search.instance.js +3 -4
  354. package/dist/instances/product.search.instance.js.map +1 -1
  355. package/dist/instances/user.instance.d.ts +3 -3
  356. package/dist/instances/user.instance.d.ts.map +1 -1
  357. package/dist/instances/user.instance.js +19 -36
  358. package/dist/instances/user.instance.js.map +1 -1
  359. package/dist/interfaces/agent.d.ts +8 -8
  360. package/dist/interfaces/agent.d.ts.map +1 -1
  361. package/dist/interfaces/backup.d.ts +19 -1
  362. package/dist/interfaces/backup.d.ts.map +1 -1
  363. package/dist/interfaces/device-triggers.d.ts +0 -2
  364. package/dist/interfaces/device-triggers.d.ts.map +1 -1
  365. package/dist/interfaces/devices.d.ts +0 -1
  366. package/dist/interfaces/devices.d.ts.map +1 -1
  367. package/dist/interfaces/index.d.ts +8 -8
  368. package/dist/interfaces/index.d.ts.map +1 -1
  369. package/dist/interfaces/jobs.d.ts +2 -3
  370. package/dist/interfaces/jobs.d.ts.map +1 -1
  371. package/dist/interfaces/logs.d.ts +7 -4
  372. package/dist/interfaces/logs.d.ts.map +1 -1
  373. package/dist/interfaces/message.d.ts +3 -3
  374. package/dist/interfaces/message.d.ts.map +1 -1
  375. package/dist/interfaces/orders.d.ts +1 -1
  376. package/dist/interfaces/webhooks.d.ts +2 -2
  377. package/dist/interfaces/webhooks.d.ts.map +1 -1
  378. package/dist/primitives/agent.handler.d.ts.map +1 -1
  379. package/dist/primitives/agent.handler.js +1 -1
  380. package/dist/primitives/agent.handler.js.map +1 -1
  381. package/dist/primitives/base.handler.d.ts +12 -2
  382. package/dist/primitives/base.handler.d.ts.map +1 -1
  383. package/dist/primitives/base.handler.js +104 -73
  384. package/dist/primitives/base.handler.js.map +1 -1
  385. package/dist/primitives/device-trigger.handler.d.ts +1 -1
  386. package/dist/primitives/device-trigger.handler.d.ts.map +1 -1
  387. package/dist/primitives/device-trigger.handler.js +2 -3
  388. package/dist/primitives/device-trigger.handler.js.map +1 -1
  389. package/dist/primitives/device.handler.d.ts +1 -1
  390. package/dist/primitives/device.handler.d.ts.map +1 -1
  391. package/dist/primitives/device.handler.js +2 -3
  392. package/dist/primitives/device.handler.js.map +1 -1
  393. package/dist/primitives/index.d.ts +1 -1
  394. package/dist/primitives/index.d.ts.map +1 -1
  395. package/dist/primitives/index.js +2 -3
  396. package/dist/primitives/index.js.map +1 -1
  397. package/dist/primitives/job.handler.d.ts +6 -1
  398. package/dist/primitives/job.handler.d.ts.map +1 -1
  399. package/dist/primitives/job.handler.js +9 -3
  400. package/dist/primitives/job.handler.js.map +1 -1
  401. package/dist/primitives/mcp-server.handler.d.ts.map +1 -1
  402. package/dist/primitives/mcp-server.handler.js +2 -2
  403. package/dist/primitives/mcp-server.handler.js.map +1 -1
  404. package/dist/primitives/postprocessor.handler.d.ts.map +1 -1
  405. package/dist/primitives/postprocessor.handler.js.map +1 -1
  406. package/dist/primitives/preprocessor.handler.d.ts +1 -1
  407. package/dist/primitives/preprocessor.handler.d.ts.map +1 -1
  408. package/dist/primitives/preprocessor.handler.js +2 -3
  409. package/dist/primitives/preprocessor.handler.js.map +1 -1
  410. package/dist/primitives/skill.handler.d.ts +1 -1
  411. package/dist/primitives/skill.handler.d.ts.map +1 -1
  412. package/dist/primitives/skill.handler.js +34 -13
  413. package/dist/primitives/skill.handler.js.map +1 -1
  414. package/dist/primitives/types.d.ts +1 -1
  415. package/dist/primitives/types.d.ts.map +1 -1
  416. package/dist/primitives/types.js.map +1 -1
  417. package/dist/primitives/webhook.handler.d.ts +3 -2
  418. package/dist/primitives/webhook.handler.d.ts.map +1 -1
  419. package/dist/primitives/webhook.handler.js +9 -4
  420. package/dist/primitives/webhook.handler.js.map +1 -1
  421. package/dist/services/analytics.d.ts.map +1 -1
  422. package/dist/services/analytics.js +4 -5
  423. package/dist/services/analytics.js.map +1 -1
  424. package/dist/services/auth.d.ts +9 -1
  425. package/dist/services/auth.d.ts.map +1 -1
  426. package/dist/services/auth.js +26 -7
  427. package/dist/services/auth.js.map +1 -1
  428. package/dist/services/sandbox.service.d.ts.map +1 -1
  429. package/dist/services/sandbox.service.js +132 -80
  430. package/dist/services/sandbox.service.js.map +1 -1
  431. package/dist/types/api-contracts.d.ts +4 -4
  432. package/dist/types/api-contracts.d.ts.map +1 -1
  433. package/dist/types/index.d.ts +2 -2
  434. package/dist/types/index.d.ts.map +1 -1
  435. package/dist/types/index.js.map +1 -1
  436. package/dist/types/skill.d.ts +7 -7
  437. package/dist/types/skill.d.ts.map +1 -1
  438. package/dist/types/skill.js +2 -2
  439. package/dist/types/skill.js.map +1 -1
  440. package/dist/types/tool-validation.js.map +1 -1
  441. package/dist/types/yaml.types.js +0 -1
  442. package/dist/types/yaml.types.js.map +1 -1
  443. package/dist/utils/aliases.d.ts +7 -0
  444. package/dist/utils/aliases.d.ts.map +1 -0
  445. package/dist/utils/aliases.js +492 -0
  446. package/dist/utils/aliases.js.map +1 -0
  447. package/dist/utils/artifact-loader.d.ts +9 -0
  448. package/dist/utils/artifact-loader.d.ts.map +1 -1
  449. package/dist/utils/artifact-loader.js +16 -6
  450. package/dist/utils/artifact-loader.js.map +1 -1
  451. package/dist/utils/auth-flows.d.ts.map +1 -1
  452. package/dist/utils/auth-flows.js +54 -54
  453. package/dist/utils/auth-flows.js.map +1 -1
  454. package/dist/utils/backup-helpers.d.ts +24 -0
  455. package/dist/utils/backup-helpers.d.ts.map +1 -1
  456. package/dist/utils/backup-helpers.js +102 -22
  457. package/dist/utils/backup-helpers.js.map +1 -1
  458. package/dist/utils/bundle-upload.d.ts +42 -0
  459. package/dist/utils/bundle-upload.d.ts.map +1 -0
  460. package/dist/utils/bundle-upload.js +90 -0
  461. package/dist/utils/bundle-upload.js.map +1 -0
  462. package/dist/utils/chat-attachments.js +1 -1
  463. package/dist/utils/chat-attachments.js.map +1 -1
  464. package/dist/utils/cli.d.ts +24 -6
  465. package/dist/utils/cli.d.ts.map +1 -1
  466. package/dist/utils/cli.js +26 -14
  467. package/dist/utils/cli.js.map +1 -1
  468. package/dist/utils/command-utils.d.ts.map +1 -1
  469. package/dist/utils/command-utils.js +4 -4
  470. package/dist/utils/command-utils.js.map +1 -1
  471. package/dist/utils/deploy-helpers.d.ts.map +1 -1
  472. package/dist/utils/deploy-helpers.js +13 -13
  473. package/dist/utils/deploy-helpers.js.map +1 -1
  474. package/dist/utils/env-loader.utils.d.ts +1 -1
  475. package/dist/utils/env-loader.utils.d.ts.map +1 -1
  476. package/dist/utils/env-loader.utils.js +15 -22
  477. package/dist/utils/env-loader.utils.js.map +1 -1
  478. package/dist/utils/files.d.ts.map +1 -1
  479. package/dist/utils/files.js +23 -13
  480. package/dist/utils/files.js.map +1 -1
  481. package/dist/utils/hints.d.ts +81 -0
  482. package/dist/utils/hints.d.ts.map +1 -0
  483. package/dist/utils/hints.js +81 -0
  484. package/dist/utils/hints.js.map +1 -0
  485. package/dist/utils/init-agent.d.ts.map +1 -1
  486. package/dist/utils/init-agent.js +18 -20
  487. package/dist/utils/init-agent.js.map +1 -1
  488. package/dist/utils/init-helpers.d.ts.map +1 -1
  489. package/dist/utils/init-helpers.js +11 -11
  490. package/dist/utils/init-helpers.js.map +1 -1
  491. package/dist/utils/init-prompts.d.ts.map +1 -1
  492. package/dist/utils/init-prompts.js +34 -36
  493. package/dist/utils/init-prompts.js.map +1 -1
  494. package/dist/utils/prompt-handler.js +1 -1
  495. package/dist/utils/prompt-handler.js.map +1 -1
  496. package/dist/utils/sandbox-storage.d.ts.map +1 -1
  497. package/dist/utils/sandbox-storage.js.map +1 -1
  498. package/dist/utils/sandbox.d.ts +1 -1
  499. package/dist/utils/sandbox.d.ts.map +1 -1
  500. package/dist/utils/sandbox.js +107 -106
  501. package/dist/utils/sandbox.js.map +1 -1
  502. package/dist/utils/semver.js +1 -1
  503. package/dist/utils/semver.js.map +1 -1
  504. package/dist/utils/suggest.d.ts +3 -0
  505. package/dist/utils/suggest.d.ts.map +1 -0
  506. package/dist/utils/suggest.js +32 -0
  507. package/dist/utils/suggest.js.map +1 -0
  508. package/dist/utils/sync-display.d.ts.map +1 -1
  509. package/dist/utils/sync-display.js +15 -13
  510. package/dist/utils/sync-display.js.map +1 -1
  511. package/dist/utils/sync-fetch.d.ts.map +1 -1
  512. package/dist/utils/sync-fetch.js +33 -24
  513. package/dist/utils/sync-fetch.js.map +1 -1
  514. package/dist/utils/version-check.js +1 -1
  515. package/dist/utils/version-check.js.map +1 -1
  516. package/dist/utils/write-info.d.ts +9 -0
  517. package/dist/utils/write-info.d.ts.map +1 -0
  518. package/dist/utils/write-info.js +11 -0
  519. package/dist/utils/write-info.js.map +1 -0
  520. package/docs/README.md +1 -1
  521. package/node_modules/@lua/shared-types/dist/index.d.mts +76 -2
  522. package/node_modules/@lua/shared-types/dist/index.d.ts +76 -2
  523. package/node_modules/@lua/shared-types/dist/index.js +27 -0
  524. package/node_modules/@lua/shared-types/dist/index.mjs +24 -0
  525. package/node_modules/@lua/shared-types/src/ai-generate.types.ts +1 -6
  526. package/node_modules/@lua/shared-types/src/ai-generate.utils.ts +1 -4
  527. package/node_modules/@lua/shared-types/src/channel.type.ts +1 -0
  528. package/node_modules/@lua/shared-types/src/chat-stream.types.ts +11 -0
  529. package/node_modules/@lua/shared-types/src/client-tools.types.ts +47 -0
  530. package/node_modules/@lua/shared-types/src/device.types.ts +6 -6
  531. package/node_modules/@lua/shared-types/src/index.ts +3 -0
  532. package/node_modules/@lua/shared-types/src/sandbox-contract.ts +26 -5
  533. package/node_modules/@lua/shared-types/src/vm-execution-log.types.ts +41 -0
  534. package/package.json +10 -6
  535. package/scripts/build-vendor.mjs +53 -0
  536. package/scripts/vendor-entry.mjs +11 -0
  537. package/template/QUICKSTART.md +33 -33
  538. package/template/README.md +35 -34
  539. package/template/examples/README.md +44 -38
  540. package/template/examples/jobs/AbandonedBasketProcessorJob.ts +30 -31
  541. package/template/examples/jobs/DailyCleanupJob.ts +17 -18
  542. package/template/examples/jobs/DataMigrationJob.ts +18 -23
  543. package/template/examples/jobs/HealthCheckJob.ts +13 -14
  544. package/template/examples/postprocessors/modifyResponse.ts +14 -15
  545. package/template/examples/preprocessors/messageMatching.ts +28 -29
  546. package/template/examples/services/ApiService.ts +68 -64
  547. package/template/examples/services/GetWeather.ts +39 -33
  548. package/template/examples/skills/basket.skill.ts +27 -7
  549. package/template/examples/skills/product.skill.ts +21 -8
  550. package/template/examples/skills/tools/BasketTool.ts +97 -98
  551. package/template/examples/skills/tools/CreateInlineJob.ts +38 -36
  552. package/template/examples/skills/tools/CreatePostTool.ts +27 -28
  553. package/template/examples/skills/tools/CustomDataTool.ts +72 -67
  554. package/template/examples/skills/tools/GameScoreTrackerTool.ts +72 -78
  555. package/template/examples/skills/tools/GetWeatherTool.ts +43 -45
  556. package/template/examples/skills/tools/OrderTool.ts +58 -58
  557. package/template/examples/skills/tools/PaymentTool.ts +43 -43
  558. package/template/examples/skills/tools/PremiumFeatureTool.ts +81 -79
  559. package/template/examples/skills/tools/ProductsTool.ts +68 -69
  560. package/template/examples/skills/tools/SmartBasketTool.ts +43 -44
  561. package/template/examples/skills/tools/UserDataTool.ts +97 -98
  562. package/template/examples/skills/user.skill.ts +7 -8
  563. package/template/examples/webhooks/FileUploadWebhook.ts +38 -31
  564. package/template/examples/webhooks/PaymentWebhook.ts +23 -22
  565. package/template/examples/webhooks/UserEventWebhook.ts +16 -19
  566. package/template/lua.skill.yaml +2 -2
  567. package/template/package.json +1 -1
  568. package/template/src/index.ts +28 -28
@@ -2,16 +2,18 @@
2
2
  * Test Command
3
3
  * Orchestrates the testing of individual tools in a local sandbox environment
4
4
  */
5
- import inquirer from "inquirer";
6
- import { compileCommand } from "./compile.js";
7
- import { withErrorHandling, clearPromptLines, writeProgress, writeSuccess } from "../utils/cli.js";
8
- import { initializeCommand } from "../utils/command-utils.js";
9
- import { executeTool, executeWebhook, executeJob, executePreProcessor, executePostProcessor, loadEnvironmentVariables } from "../utils/sandbox.js";
10
- import { hasEnvFile } from "../utils/files.js";
11
- import { safePrompt } from "../utils/prompt-handler.js";
12
- import { loadManifest, loadArtifact, getPrimitivesByKind } from "../utils/artifact-loader.js";
13
- import { PrimitiveKind } from "../compiler/types.js";
5
+ import inquirer from 'inquirer';
6
+ import { compileCommand } from './compile.js';
7
+ import { printToolOutput } from './test-output.helpers.js';
8
+ import { withErrorHandling, clearPromptLines, writeProgress, writeSuccess, writeNextStep, writeHintBlock, } from '../utils/cli.js';
9
+ import { initializeCommand } from '../utils/command-utils.js';
10
+ import { executeTool, executeWebhook, executeJob, executePreProcessor, executePostProcessor, loadEnvironmentVariables, } from '../utils/sandbox.js';
11
+ import { hasEnvFile } from '../utils/files.js';
12
+ import { safePrompt } from '../utils/prompt-handler.js';
13
+ import { loadManifest, loadArtifact, getPrimitivesByKind } from '../utils/artifact-loader.js';
14
+ import { PrimitiveKind, } from '../compiler/types.js';
14
15
  import { trackEvent } from '../services/analytics.js';
16
+ import { validateOrSuggest } from '../utils/aliases.js';
15
17
  // ─────────────────────────────────────────────────────────────────────────────
16
18
  // Shared Helpers
17
19
  // ─────────────────────────────────────────────────────────────────────────────
@@ -30,7 +32,7 @@ async function promptToolSelection(tools) {
30
32
  name: tool.skillName
31
33
  ? `${tool.name} (${tool.skillName}) - ${tool.description}`
32
34
  : `${tool.name} - ${tool.description}`,
33
- value: tool
35
+ value: tool,
34
36
  }));
35
37
  const { selectedTool } = await inquirer.prompt([
36
38
  {
@@ -38,8 +40,8 @@ async function promptToolSelection(tools) {
38
40
  name: 'selectedTool',
39
41
  message: 'šŸ”§ Select a tool to test:',
40
42
  choices: toolChoices,
41
- pageSize: 10
42
- }
43
+ pageSize: 10,
44
+ },
43
45
  ]);
44
46
  return selectedTool;
45
47
  }
@@ -76,14 +78,14 @@ function parseJsonInputOrFail(inputJson, expectedFormat) {
76
78
  * Selects an entity by name (non-interactive) or prompts user (interactive).
77
79
  */
78
80
  async function selectEntityOrPrompt(options) {
79
- const { items, entityName, entityType, idProperty, nameProperty, promptMessage, formatChoice } = options;
81
+ const { items, entityName, entityType, idProperty, nameProperty, promptMessage, formatChoice, asJson } = options;
80
82
  if (entityName) {
81
83
  const selected = items.find((item) => item[idProperty] === entityName || item[nameProperty] === entityName);
82
84
  if (!selected) {
83
85
  console.error(`āŒ ${entityType} "${entityName}" not found`);
84
- throw new Error("${entityType}");
86
+ throw new Error(`${entityType} "${entityName}" not found`);
85
87
  }
86
- writeProgress(`āœ… Selected ${entityType.toLowerCase()}: ${selected[nameProperty]}`);
88
+ progress(asJson ?? false, `āœ… Selected ${entityType.toLowerCase()}: ${selected[nameProperty]}`);
87
89
  return selected;
88
90
  }
89
91
  const answer = await safePrompt([
@@ -93,14 +95,63 @@ async function selectEntityOrPrompt(options) {
93
95
  message: promptMessage,
94
96
  choices: items.map((item) => ({
95
97
  name: formatChoice ? formatChoice(item) : `${item[nameProperty]}`,
96
- value: item
97
- }))
98
- }
98
+ value: item,
99
+ })),
100
+ },
99
101
  ]);
100
102
  if (!answer)
101
103
  return null;
102
104
  return answer.selected;
103
105
  }
106
+ /**
107
+ * Writes a progress message. In `--json` mode, routes to stderr so stdout
108
+ * stays clean for the final JSON payload (allowing `| jq` etc.).
109
+ */
110
+ function progress(asJson, message) {
111
+ if (asJson) {
112
+ process.stderr.write('\r\x1b[K' + message + '\n');
113
+ }
114
+ else {
115
+ writeProgress(message);
116
+ }
117
+ }
118
+ /**
119
+ * Writes a success message. In `--json` mode, routes to stderr (see `progress`).
120
+ */
121
+ function success(asJson, message) {
122
+ if (asJson) {
123
+ process.stderr.write('\r\x1b[K' + message + '\n');
124
+ }
125
+ else {
126
+ writeSuccess(message);
127
+ }
128
+ }
129
+ /**
130
+ * Runs `compileCommand` with stdout redirected to stderr when `asJson` is
131
+ * true, so compile output (which uses `console.log` and direct stdout writes)
132
+ * doesn't pollute the JSON stream piped from `lua test --json`.
133
+ */
134
+ async function compileQuietly(asJson) {
135
+ if (!asJson) {
136
+ await compileCommand();
137
+ return;
138
+ }
139
+ const originalLog = console.log;
140
+ const originalInfo = console.info;
141
+ const originalStdoutWrite = process.stdout.write.bind(process.stdout);
142
+ // Re-route stdout writes to stderr for the duration of compile.
143
+ console.log = console.error;
144
+ console.info = console.error;
145
+ process.stdout.write = process.stderr.write.bind(process.stderr);
146
+ try {
147
+ await compileCommand();
148
+ }
149
+ finally {
150
+ console.log = originalLog;
151
+ console.info = originalInfo;
152
+ process.stdout.write = originalStdoutWrite;
153
+ }
154
+ }
104
155
  /**
105
156
  * Handles execution errors with consistent formatting.
106
157
  */
@@ -124,7 +175,7 @@ function extractToolsFromManifest(manifest) {
124
175
  toolToSkill.set(toolName, skill.name);
125
176
  }
126
177
  }
127
- return tools.map(tool => ({
178
+ return tools.map((tool) => ({
128
179
  ...tool,
129
180
  id: tool.name,
130
181
  skillName: toolToSkill.get(tool.name) || 'unknown',
@@ -140,19 +191,10 @@ export async function testCommand(type, cmdObj) {
140
191
  return withErrorHandling(async () => {
141
192
  const entityName = cmdObj?.name || null;
142
193
  const inputJson = cmdObj?.input || null;
194
+ const asJson = !!cmdObj?.json;
143
195
  let selectedType;
144
196
  if (type) {
145
- if (!['skill', 'webhook', 'job', 'preprocessor', 'postprocessor'].includes(type)) {
146
- console.error(`āŒ Invalid type: "${type}". Must be "skill", "webhook", "job", "preprocessor", or "postprocessor".`);
147
- console.log('\nUsage:');
148
- console.log(' lua test - Interactive selection');
149
- console.log(' lua test skill - Test a skill/tool directly');
150
- console.log(' lua test webhook - Test a webhook directly');
151
- console.log(' lua test job - Test a job directly');
152
- console.log(' lua test preprocessor - Test a preprocessor directly');
153
- console.log(' lua test postprocessor - Test a postprocessor directly');
154
- throw new Error("Invalid type:");
155
- }
197
+ type = validateOrSuggest('test.type', type);
156
198
  selectedType = type;
157
199
  }
158
200
  else if (entityName) {
@@ -160,7 +202,7 @@ export async function testCommand(type, cmdObj) {
160
202
  console.log('\nUsage:');
161
203
  console.log(' lua test skill --name mySkill --input "{...}" Test skill with JSON input');
162
204
  console.log(' lua test webhook --name myWebhook --input "{...}" Test webhook with JSON input');
163
- throw new Error("Type must be specified when using the --name option.");
205
+ throw new Error('Type must be specified when using the --name option.');
164
206
  }
165
207
  else {
166
208
  const typeAnswer = await safePrompt([
@@ -173,31 +215,31 @@ export async function testCommand(type, cmdObj) {
173
215
  { name: 'šŸŖ Webhook', value: 'webhook' },
174
216
  { name: 'ā° Job', value: 'job' },
175
217
  { name: 'šŸ“„ PreProcessor', value: 'preprocessor' },
176
- { name: 'šŸ“¤ PostProcessor', value: 'postprocessor' }
177
- ]
178
- }
218
+ { name: 'šŸ“¤ PostProcessor', value: 'postprocessor' },
219
+ ],
220
+ },
179
221
  ]);
180
222
  if (!typeAnswer) {
181
- console.log("Test cancelled.");
223
+ console.log('Test cancelled.');
182
224
  return;
183
225
  }
184
226
  selectedType = typeAnswer.type;
185
227
  }
186
228
  switch (selectedType) {
187
229
  case 'skill':
188
- await testSkill(entityName, inputJson);
230
+ await testSkill(entityName, inputJson, asJson);
189
231
  break;
190
232
  case 'webhook':
191
- await testWebhook(entityName, inputJson);
233
+ await testWebhook(entityName, inputJson, asJson);
192
234
  break;
193
235
  case 'job':
194
- await testJob(entityName);
236
+ await testJob(entityName, asJson);
195
237
  break;
196
238
  case 'preprocessor':
197
- await testPreProcessor(entityName, inputJson);
239
+ await testPreProcessor(entityName, inputJson, asJson);
198
240
  break;
199
241
  case 'postprocessor':
200
- await testPostProcessor(entityName, inputJson);
242
+ await testPostProcessor(entityName, inputJson, asJson);
201
243
  break;
202
244
  }
203
245
  trackEvent('cli_test_executed', {
@@ -206,24 +248,24 @@ export async function testCommand(type, cmdObj) {
206
248
  input_provided_json: !!inputJson,
207
249
  non_interactive: !!type,
208
250
  });
209
- }, "testing");
251
+ }, 'testing');
210
252
  }
211
253
  // ─────────────────────────────────────────────────────────────────────────────
212
254
  // Test Functions
213
255
  // ─────────────────────────────────────────────────────────────────────────────
214
- async function testSkill(entityName, inputJson) {
215
- writeProgress("🧪 Testing Lua skill...");
216
- writeProgress("šŸ“¦ Compiling code first...");
217
- await compileCommand();
256
+ async function testSkill(entityName, inputJson, asJson = false) {
257
+ progress(asJson, '🧪 Testing Lua skill...');
258
+ progress(asJson, 'šŸ“¦ Compiling code first...');
259
+ await compileQuietly(asJson);
218
260
  const manifest = loadManifest();
219
261
  const allTools = extractToolsFromManifest(manifest);
220
262
  const { apiKey, agentId } = await loadAuthOrFail();
221
263
  if (hasEnvFile()) {
222
- writeProgress(`šŸ“„ Loaded environment variables from .env file`);
264
+ progress(asJson, `šŸ“„ Loaded environment variables from .env file`);
223
265
  }
224
266
  if (allTools.length === 0) {
225
- console.error("āŒ No tools found in compiled output.");
226
- throw new Error("No tools found in compiled output.");
267
+ console.error('āŒ No tools found in compiled output.');
268
+ throw new Error('No tools found in compiled output.');
227
269
  }
228
270
  // Select tool
229
271
  let selectedTool;
@@ -231,25 +273,25 @@ async function testSkill(entityName, inputJson) {
231
273
  selectedTool = allTools.find((t) => t.id === entityName || t.name === entityName);
232
274
  if (!selectedTool) {
233
275
  console.error(`āŒ Tool "${entityName}" not found`);
234
- throw new Error("Tool");
276
+ throw new Error('Tool');
235
277
  }
236
- writeProgress(`āœ… Selected tool: ${selectedTool.name}`);
278
+ progress(asJson, `āœ… Selected tool: ${selectedTool.name}`);
237
279
  }
238
280
  else {
239
281
  selectedTool = await promptToolSelection(allTools);
240
282
  clearPromptLines(2);
241
- writeProgress(`āœ… Selected tool: ${selectedTool.name}`);
283
+ progress(asJson, `āœ… Selected tool: ${selectedTool.name}`);
242
284
  }
243
285
  // Get input values - for now, use simple prompts since schemas are in the bundled code
244
286
  let inputValues = {};
245
287
  if (inputJson) {
246
288
  inputValues = parseJsonInputOrFail(inputJson, '{"param1": "value1", ...}');
247
- writeProgress(`Input: ${JSON.stringify(inputValues, null, 2)}`);
289
+ progress(asJson, `Input: ${JSON.stringify(inputValues, null, 2)}`);
248
290
  }
249
291
  else {
250
292
  // Simple input prompt since we don't have schema metadata at this point
251
293
  const inputAnswer = await safePrompt([
252
- { type: 'input', name: 'input', message: 'Enter input JSON (or empty for {}):', default: '{}' }
294
+ { type: 'input', name: 'input', message: 'Enter input JSON (or empty for {}):', default: '{}' },
253
295
  ]);
254
296
  if (inputAnswer) {
255
297
  try {
@@ -261,7 +303,7 @@ async function testSkill(entityName, inputJson) {
261
303
  }
262
304
  }
263
305
  // Execute - load uncompressed code from dist-v2
264
- writeProgress("\nšŸš€ Executing tool...");
306
+ progress(asJson, '\nšŸš€ Executing tool...');
265
307
  const toolCode = loadArtifact(selectedTool, process.cwd());
266
308
  await withSandboxEnv(async () => {
267
309
  try {
@@ -272,24 +314,42 @@ async function testSkill(entityName, inputJson) {
272
314
  agentId,
273
315
  channel: 'dev',
274
316
  });
275
- writeSuccess("āœ… Tool execution successful!");
276
- console.log(`Output: ${JSON.stringify(result, null, 2)}`);
317
+ success(asJson, 'āœ… Tool execution successful!');
318
+ printToolOutput('Tool', result, asJson);
319
+ // Skip post-action hints in --json mode so they don't pollute the JSON stream.
320
+ if (!asJson) {
321
+ writeNextStep({
322
+ command: 'lua chat -e sandbox -m "test message"',
323
+ rationale: 'to verify the tool integrates correctly with the agent',
324
+ when: 'success',
325
+ });
326
+ }
277
327
  }
278
328
  catch (error) {
279
329
  handleExecutionError(error, 'Tool');
330
+ if (!asJson) {
331
+ writeHintBlock({
332
+ headline: 'Tool ran locally — no server logs exist for this execution.',
333
+ lines: [
334
+ { label: 'Try with --json:', command: `lua test skill --name ${selectedTool.name} --json` },
335
+ { label: 'Test in sandbox:', command: 'lua chat -e sandbox -m "trigger the tool"' },
336
+ ],
337
+ when: 'error',
338
+ });
339
+ }
280
340
  }
281
341
  });
282
342
  }
283
- async function testWebhook(entityName, inputJson) {
284
- writeProgress("šŸŖ Testing webhook...");
285
- writeProgress("šŸ“¦ Compiling code first...");
286
- await compileCommand();
343
+ async function testWebhook(entityName, inputJson, asJson = false) {
344
+ progress(asJson, 'šŸŖ Testing webhook...');
345
+ progress(asJson, 'šŸ“¦ Compiling code first...');
346
+ await compileQuietly(asJson);
287
347
  const { apiKey, agentId, config } = await loadAuthOrFail();
288
348
  const manifest = loadManifest();
289
349
  const webhooks = getPrimitivesByKind(manifest, PrimitiveKind.WEBHOOK);
290
350
  if (webhooks.length === 0) {
291
- console.error("āŒ No webhooks found in compiled output.");
292
- console.log("šŸ’” Create a webhook using LuaWebhook in your code.");
351
+ console.error('āŒ No webhooks found in compiled output.');
352
+ console.log('šŸ’” Create a webhook using LuaWebhook in your code.');
293
353
  return;
294
354
  }
295
355
  // Select webhook
@@ -300,12 +360,14 @@ async function testWebhook(entityName, inputJson) {
300
360
  idProperty: 'name',
301
361
  nameProperty: 'name',
302
362
  promptMessage: 'Select a webhook to test:',
303
- formatChoice: (w) => `${w.name}`
363
+ formatChoice: (w) => `${w.name}`,
364
+ asJson,
304
365
  });
305
366
  if (!selectedWebhook) {
306
- console.log("Test cancelled.");
367
+ console.log('Test cancelled.');
307
368
  return;
308
369
  }
370
+ const webhookName = selectedWebhook.name;
309
371
  // Get inputs
310
372
  let query = {};
311
373
  let headers = {};
@@ -319,48 +381,69 @@ async function testWebhook(entityName, inputJson) {
319
381
  else {
320
382
  // Simple JSON input prompts
321
383
  const queryAnswer = await safePrompt([
322
- { type: 'input', name: 'query', message: 'Enter query params JSON (or empty):', default: '{}' }
384
+ { type: 'input', name: 'query', message: 'Enter query params JSON (or empty):', default: '{}' },
323
385
  ]);
324
386
  if (queryAnswer)
325
387
  query = JSON.parse(queryAnswer.query || '{}');
326
388
  const headersAnswer = await safePrompt([
327
- { type: 'input', name: 'headers', message: 'Enter headers JSON (or empty):', default: '{}' }
389
+ { type: 'input', name: 'headers', message: 'Enter headers JSON (or empty):', default: '{}' },
328
390
  ]);
329
391
  if (headersAnswer)
330
392
  headers = JSON.parse(headersAnswer.headers || '{}');
331
393
  const bodyAnswer = await safePrompt([
332
- { type: 'input', name: 'body', message: 'Enter body JSON (or empty):', default: '{}' }
394
+ { type: 'input', name: 'body', message: 'Enter body JSON (or empty):', default: '{}' },
333
395
  ]);
334
396
  if (bodyAnswer)
335
397
  body = JSON.parse(bodyAnswer.body || '{}');
336
398
  }
337
399
  // Execute
338
- writeProgress("\nšŸš€ Executing webhook...");
339
- writeProgress(`Query: ${JSON.stringify(query, null, 2)}`);
340
- writeProgress(`Headers: ${JSON.stringify(headers, null, 2)}`);
341
- writeProgress(`Body: ${JSON.stringify(body, null, 2)}`);
400
+ progress(asJson, '\nšŸš€ Executing webhook...');
401
+ progress(asJson, `Query: ${JSON.stringify(query, null, 2)}`);
402
+ progress(asJson, `Headers: ${JSON.stringify(headers, null, 2)}`);
403
+ progress(asJson, `Body: ${JSON.stringify(body, null, 2)}`);
342
404
  const webhookCode = loadArtifact(selectedWebhook, process.cwd());
343
405
  await withSandboxEnv(async () => {
344
406
  try {
345
407
  const result = await executeWebhook({ webhookCode, query, headers, body, apiKey, agentId });
346
- writeSuccess("\nāœ… Webhook execution successful!");
347
- console.log(`Output: ${JSON.stringify(result, null, 2)}`);
408
+ success(asJson, '\nāœ… Webhook execution successful!');
409
+ printToolOutput('Webhook', result, asJson);
410
+ if (!asJson) {
411
+ writeHintBlock({
412
+ headline: 'Webhook works locally. To test in production:',
413
+ lines: [
414
+ { label: 'Trigger via HTTP:', command: 'curl -X POST <your webhook URL>' },
415
+ { label: 'Inspect logs:', command: `lua logs --type webhook --name ${webhookName} --limit 5` },
416
+ ],
417
+ when: 'success',
418
+ });
419
+ }
348
420
  }
349
421
  catch (error) {
350
422
  handleExecutionError(error, 'Webhook');
423
+ if (!asJson) {
424
+ writeHintBlock({
425
+ headline: 'Webhook ran locally — no server logs exist for this execution.',
426
+ lines: [
427
+ { label: 'Try with --json:', command: `lua test webhook --name ${webhookName} --json` },
428
+ { label: 'Trigger in production:', command: 'curl -X POST <your webhook URL>' },
429
+ { label: 'Then inspect:', command: `lua logs --type webhook --name ${webhookName} --limit 5` },
430
+ ],
431
+ when: 'error',
432
+ });
433
+ }
351
434
  }
352
435
  });
353
436
  }
354
- async function testJob(entityName) {
355
- writeProgress("ā° Testing job...");
356
- writeProgress("šŸ“¦ Compiling code first...");
357
- await compileCommand();
437
+ async function testJob(entityName, asJson = false) {
438
+ progress(asJson, 'ā° Testing job...');
439
+ progress(asJson, 'šŸ“¦ Compiling code first...');
440
+ await compileQuietly(asJson);
358
441
  const { apiKey, agentId, config } = await loadAuthOrFail();
359
442
  const manifest = loadManifest();
360
443
  const jobs = getPrimitivesByKind(manifest, PrimitiveKind.JOB);
361
444
  if (jobs.length === 0) {
362
- console.error("āŒ No jobs found in compiled output.");
363
- console.log("šŸ’” Create a job using LuaJob in your code.");
445
+ console.error('āŒ No jobs found in compiled output.');
446
+ console.log('šŸ’” Create a job using LuaJob in your code.');
364
447
  return;
365
448
  }
366
449
  // Select job
@@ -371,19 +454,21 @@ async function testJob(entityName) {
371
454
  idProperty: 'name',
372
455
  nameProperty: 'name',
373
456
  promptMessage: 'Select a job to test:',
374
- formatChoice: (j) => `${j.name} - ${formatSchedule(j.schedule)}`
457
+ formatChoice: (j) => `${j.name} - ${formatSchedule(j.schedule)}`,
458
+ asJson,
375
459
  });
376
460
  if (!selectedJob) {
377
- console.log("Test cancelled.");
461
+ console.log('Test cancelled.');
378
462
  return;
379
463
  }
464
+ const jobNameForHints = selectedJob.name;
380
465
  // Get jobId from YAML config
381
466
  const yamlJobs = config.jobs || [];
382
467
  const yamlJob = yamlJobs.find((j) => j.name === selectedJob.name);
383
468
  const jobId = yamlJob?.jobId || selectedJob.name;
384
469
  // Execute
385
- writeProgress(`\nšŸš€ Executing job: ${selectedJob.name}...`);
386
- writeProgress(`šŸ“… Schedule: ${formatSchedule(selectedJob.schedule)}`);
470
+ progress(asJson, `\nšŸš€ Executing job: ${selectedJob.name}...`);
471
+ progress(asJson, `šŸ“… Schedule: ${formatSchedule(selectedJob.schedule)}`);
387
472
  const jobCode = loadArtifact(selectedJob, process.cwd());
388
473
  await withSandboxEnv(async () => {
389
474
  try {
@@ -396,25 +481,46 @@ async function testJob(entityName) {
396
481
  jobId: jobId,
397
482
  name: selectedJob.name,
398
483
  schedule: selectedJob.schedule,
399
- metadata: {}
400
- }
484
+ metadata: {},
485
+ },
401
486
  });
402
- writeSuccess("\nāœ… Job execution successful!");
403
- console.log(`Output: ${JSON.stringify(result, null, 2)}`);
487
+ success(asJson, '\nāœ… Job execution successful!');
488
+ printToolOutput('Job', result, asJson);
489
+ if (!asJson) {
490
+ writeHintBlock({
491
+ headline: 'Job works locally. To test in production:',
492
+ lines: [
493
+ { label: 'Trigger now:', command: `lua jobs trigger --job-name ${jobNameForHints}` },
494
+ { label: 'Inspect logs:', command: `lua logs --type job --name ${jobNameForHints} --limit 5` },
495
+ ],
496
+ when: 'success',
497
+ });
498
+ }
404
499
  }
405
500
  catch (error) {
406
501
  handleExecutionError(error, 'Job');
502
+ if (!asJson) {
503
+ writeHintBlock({
504
+ headline: 'Job ran locally — no server logs exist for this execution.',
505
+ lines: [
506
+ { label: 'Try with --json:', command: `lua test job --name ${jobNameForHints} --json` },
507
+ { label: 'Trigger in production:', command: `lua jobs trigger --job-name ${jobNameForHints}` },
508
+ { label: 'Then inspect:', command: `lua logs --type job --name ${jobNameForHints} --limit 5` },
509
+ ],
510
+ when: 'error',
511
+ });
512
+ }
407
513
  }
408
514
  });
409
515
  }
410
- async function testPreProcessor(entityName, inputJson) {
411
- writeProgress("šŸ“„ Testing preprocessor...");
412
- writeProgress("šŸ“¦ Compiling code first...");
413
- await compileCommand();
516
+ async function testPreProcessor(entityName, inputJson, asJson = false) {
517
+ progress(asJson, 'šŸ“„ Testing preprocessor...');
518
+ progress(asJson, 'šŸ“¦ Compiling code first...');
519
+ await compileQuietly(asJson);
414
520
  const manifest = loadManifest();
415
521
  const preprocessors = getPrimitivesByKind(manifest, PrimitiveKind.PREPROCESSOR);
416
522
  if (preprocessors.length === 0) {
417
- console.error("āŒ No preprocessors found in compiled output.");
523
+ console.error('āŒ No preprocessors found in compiled output.');
418
524
  return;
419
525
  }
420
526
  // Select preprocessor
@@ -425,10 +531,12 @@ async function testPreProcessor(entityName, inputJson) {
425
531
  idProperty: 'name',
426
532
  nameProperty: 'name',
427
533
  promptMessage: 'Select a preprocessor to test:',
428
- formatChoice: (p) => `${p.name}`
534
+ formatChoice: (p) => `${p.name}`,
535
+ asJson,
429
536
  });
430
537
  if (!selected)
431
538
  return;
539
+ const preprocessorName = selected.name;
432
540
  // Get inputs
433
541
  let message;
434
542
  let channel;
@@ -439,22 +547,22 @@ async function testPreProcessor(entityName, inputJson) {
439
547
  }
440
548
  else {
441
549
  const messageAnswer = await safePrompt([
442
- { type: 'input', name: 'message', message: 'Enter test message:', default: 'Hello, I need help with my order' }
550
+ { type: 'input', name: 'message', message: 'Enter test message:', default: 'Hello, I need help with my order' },
443
551
  ]);
444
552
  if (!messageAnswer)
445
553
  return;
446
554
  message = messageAnswer.message;
447
555
  const channelAnswer = await safePrompt([
448
- { type: 'input', name: 'channel', message: 'Enter channel:', default: 'web' }
556
+ { type: 'input', name: 'channel', message: 'Enter channel:', default: 'web' },
449
557
  ]);
450
558
  if (!channelAnswer)
451
559
  return;
452
560
  channel = channelAnswer.channel;
453
561
  }
454
562
  // Execute
455
- writeProgress("\nšŸš€ Executing preprocessor...");
456
- writeProgress(`Input message: ${message}`);
457
- writeProgress(`Channel: ${channel}`);
563
+ progress(asJson, '\nšŸš€ Executing preprocessor...');
564
+ progress(asJson, `Input message: ${message}`);
565
+ progress(asJson, `Channel: ${channel}`);
458
566
  const { apiKey, agentId } = await loadAuthOrFail();
459
567
  const preprocessorCode = loadArtifact(selected, process.cwd());
460
568
  await withSandboxEnv(async () => {
@@ -465,9 +573,9 @@ async function testPreProcessor(entityName, inputJson) {
465
573
  messages,
466
574
  channel,
467
575
  apiKey,
468
- agentId
576
+ agentId,
469
577
  });
470
- writeSuccess("\nāœ… PreProcessor execution successful!");
578
+ success(asJson, '\nāœ… PreProcessor execution successful!');
471
579
  // Helper to display messages
472
580
  const displayMessages = (outputMessages) => {
473
581
  console.log(`Processed messages (${outputMessages.length}):`);
@@ -486,7 +594,10 @@ async function testPreProcessor(entityName, inputJson) {
486
594
  }
487
595
  });
488
596
  };
489
- if (result.action === 'block') {
597
+ if (asJson) {
598
+ printToolOutput('PreProcessor', result, true);
599
+ }
600
+ else if (result.action === 'block') {
490
601
  console.log(`\nAction: BLOCK`);
491
602
  console.log(`Response: ${result.response}`);
492
603
  if (result.metadata) {
@@ -504,22 +615,43 @@ async function testPreProcessor(entityName, inputJson) {
504
615
  else {
505
616
  console.log(`\nAction: PROCEED (no valid action returned, messages unchanged)`);
506
617
  displayMessages(messages);
507
- console.log(`\nRaw result: ${JSON.stringify(result, null, 2)}`);
618
+ console.log(`\nRaw result:`);
619
+ printToolOutput('PreProcessor', result, false);
620
+ }
621
+ if (!asJson) {
622
+ writeHintBlock({
623
+ headline: 'Preprocessor works locally. To test in production:',
624
+ lines: [
625
+ { label: 'Send a message:', command: 'lua chat -e production -m "test message"' },
626
+ { label: 'Inspect logs:', command: 'lua logs --type preprocessor --limit 5' },
627
+ ],
628
+ when: 'success',
629
+ });
508
630
  }
509
631
  }
510
632
  catch (error) {
511
633
  handleExecutionError(error, 'PreProcessor');
634
+ if (!asJson) {
635
+ writeHintBlock({
636
+ headline: 'Preprocessor ran locally — no server logs exist for this execution.',
637
+ lines: [
638
+ { label: 'Try with --json:', command: `lua test preprocessor --name ${preprocessorName} --json` },
639
+ { label: 'Then inspect:', command: 'lua logs --type preprocessor --limit 5' },
640
+ ],
641
+ when: 'error',
642
+ });
643
+ }
512
644
  }
513
645
  });
514
646
  }
515
- async function testPostProcessor(entityName, inputJson) {
516
- writeProgress("šŸ“¤ Testing postprocessor...");
517
- writeProgress("šŸ“¦ Compiling code first...");
518
- await compileCommand();
647
+ async function testPostProcessor(entityName, inputJson, asJson = false) {
648
+ progress(asJson, 'šŸ“¤ Testing postprocessor...');
649
+ progress(asJson, 'šŸ“¦ Compiling code first...');
650
+ await compileQuietly(asJson);
519
651
  const manifest = loadManifest();
520
652
  const postprocessors = getPrimitivesByKind(manifest, PrimitiveKind.POSTPROCESSOR);
521
653
  if (postprocessors.length === 0) {
522
- console.error("āŒ No postprocessors found in compiled output.");
654
+ console.error('āŒ No postprocessors found in compiled output.');
523
655
  return;
524
656
  }
525
657
  // Select postprocessor
@@ -530,10 +662,12 @@ async function testPostProcessor(entityName, inputJson) {
530
662
  idProperty: 'name',
531
663
  nameProperty: 'name',
532
664
  promptMessage: 'Select a postprocessor to test:',
533
- formatChoice: (p) => `${p.name}`
665
+ formatChoice: (p) => `${p.name}`,
666
+ asJson,
534
667
  });
535
668
  if (!selected)
536
669
  return;
670
+ const postprocessorName = selected.name;
537
671
  // Get inputs
538
672
  let message;
539
673
  let response;
@@ -546,29 +680,39 @@ async function testPostProcessor(entityName, inputJson) {
546
680
  }
547
681
  else {
548
682
  const messageAnswer = await safePrompt([
549
- { type: 'input', name: 'message', message: 'Enter original user message:', default: 'What products do you have?' }
683
+ {
684
+ type: 'input',
685
+ name: 'message',
686
+ message: 'Enter original user message:',
687
+ default: 'What products do you have?',
688
+ },
550
689
  ]);
551
690
  if (!messageAnswer)
552
691
  return;
553
692
  message = messageAnswer.message;
554
693
  const responseAnswer = await safePrompt([
555
- { type: 'input', name: 'response', message: 'Enter agent response to process:', default: 'We have laptops, phones, and tablets available.' }
694
+ {
695
+ type: 'input',
696
+ name: 'response',
697
+ message: 'Enter agent response to process:',
698
+ default: 'We have laptops, phones, and tablets available.',
699
+ },
556
700
  ]);
557
701
  if (!responseAnswer)
558
702
  return;
559
703
  response = responseAnswer.response;
560
704
  const channelAnswer = await safePrompt([
561
- { type: 'input', name: 'channel', message: 'Enter channel:', default: 'web' }
705
+ { type: 'input', name: 'channel', message: 'Enter channel:', default: 'web' },
562
706
  ]);
563
707
  if (!channelAnswer)
564
708
  return;
565
709
  channel = channelAnswer.channel;
566
710
  }
567
711
  // Execute
568
- writeProgress("\nšŸš€ Executing postprocessor...");
569
- writeProgress(`Original message: ${message}`);
570
- writeProgress(`Agent response: ${response}`);
571
- writeProgress(`Channel: ${channel}`);
712
+ progress(asJson, '\nšŸš€ Executing postprocessor...');
713
+ progress(asJson, `Original message: ${message}`);
714
+ progress(asJson, `Agent response: ${response}`);
715
+ progress(asJson, `Channel: ${channel}`);
572
716
  const { apiKey, agentId } = await loadAuthOrFail();
573
717
  const postprocessorCode = loadArtifact(selected, process.cwd());
574
718
  await withSandboxEnv(async () => {
@@ -579,21 +723,47 @@ async function testPostProcessor(entityName, inputJson) {
579
723
  response,
580
724
  channel,
581
725
  apiKey,
582
- agentId
726
+ agentId,
583
727
  });
584
- writeSuccess("\nāœ… PostProcessor execution successful!");
585
- // Result is a string, but handle both cases for robustness
586
- if (typeof result === 'object' && result !== null) {
728
+ success(asJson, '\nāœ… PostProcessor execution successful!');
729
+ if (asJson) {
730
+ printToolOutput('PostProcessor', result, true);
731
+ }
732
+ else if (typeof result === 'object' && result !== null) {
587
733
  const resultObj = result;
588
- const text = resultObj.modifiedResponse || JSON.stringify(result, null, 2);
589
- console.log(`Processed response: ${text}`);
734
+ if (resultObj.modifiedResponse) {
735
+ console.log(`Processed response: ${resultObj.modifiedResponse}`);
736
+ }
737
+ else {
738
+ printToolOutput('PostProcessor', result, false);
739
+ }
590
740
  }
591
741
  else {
592
742
  console.log(`Processed response: ${result}`);
593
743
  }
744
+ if (!asJson) {
745
+ writeHintBlock({
746
+ headline: 'Postprocessor works locally. To test in production:',
747
+ lines: [
748
+ { label: 'Send a message:', command: 'lua chat -e production -m "test message"' },
749
+ { label: 'Inspect logs:', command: 'lua logs --type postprocessor --limit 5' },
750
+ ],
751
+ when: 'success',
752
+ });
753
+ }
594
754
  }
595
755
  catch (error) {
596
756
  handleExecutionError(error, 'PostProcessor');
757
+ if (!asJson) {
758
+ writeHintBlock({
759
+ headline: 'Postprocessor ran locally — no server logs exist for this execution.',
760
+ lines: [
761
+ { label: 'Try with --json:', command: `lua test postprocessor --name ${postprocessorName} --json` },
762
+ { label: 'Test in production:', command: 'lua logs --type postprocessor --limit 5' },
763
+ ],
764
+ when: 'error',
765
+ });
766
+ }
597
767
  }
598
768
  });
599
769
  }