luca 3.0.0 → 3.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (372) hide show
  1. package/.github/workflows/release.yaml +1 -0
  2. package/CLAUDE.md +10 -2
  3. package/README.md +130 -112
  4. package/assistants/codingAssistant/CORE.md +6 -1
  5. package/assistants/codingAssistant/hooks.ts +1 -1
  6. package/assistants/inkbot/hooks.ts +1 -1
  7. package/assistants/inkbot/tools.ts +1 -1
  8. package/bun.lock +220 -322
  9. package/commands/audit-docs.ts +2 -2
  10. package/commands/build-bootstrap.ts +2 -3
  11. package/commands/build-python-bridge.ts +2 -3
  12. package/commands/build-scaffolds.ts +2 -3
  13. package/commands/bundle-consumer-project.ts +521 -0
  14. package/commands/generate-api-docs.ts +2 -2
  15. package/commands/inkbot.ts +2 -2
  16. package/commands/release.ts +2 -2
  17. package/commands/try-all-challenges.ts +3 -3
  18. package/commands/try-challenge.ts +3 -3
  19. package/dist/agi/container.server.d.ts +2 -2
  20. package/dist/agi/features/assistant.d.ts +2 -2
  21. package/dist/agi/features/assistants-manager.d.ts +1 -1
  22. package/dist/agi/features/autonomous-assistant.d.ts +1 -1
  23. package/dist/agi/features/browser-use.d.ts +1 -1
  24. package/dist/agi/features/claude-code.d.ts +1 -1
  25. package/dist/agi/features/conversation-history.d.ts +2 -2
  26. package/dist/agi/features/conversation.d.ts +1 -1
  27. package/dist/agi/features/docs-reader.d.ts +1 -1
  28. package/dist/agi/features/file-tools.d.ts +1 -1
  29. package/dist/agi/features/luca-coder.d.ts +1 -1
  30. package/dist/agi/features/openai-codex.d.ts +1 -1
  31. package/dist/agi/features/skills-library.d.ts +1 -1
  32. package/dist/clients/civitai/index.d.ts +4 -4
  33. package/dist/clients/client-template.d.ts +4 -4
  34. package/dist/clients/comfyui/index.d.ts +2 -2
  35. package/dist/clients/elevenlabs/index.d.ts +2 -2
  36. package/dist/clients/openai/index.d.ts +2 -2
  37. package/dist/clients/supabase/index.d.ts +3 -3
  38. package/dist/command.d.ts +1 -1
  39. package/dist/node/container.d.ts +1 -1
  40. package/dist/node/features/helpers.d.ts +3 -3
  41. package/dist/node/features/semantic-search.d.ts +1 -1
  42. package/dist/node/features/vm.d.ts +3 -3
  43. package/dist/node.d.ts +1 -1
  44. package/dist/scaffolds/generated.d.ts +1 -1
  45. package/dist/selector.d.ts +1 -1
  46. package/index.html +217 -190
  47. package/luca.console.ts +1 -1
  48. package/package.json +2 -2
  49. package/public/index.html +217 -190
  50. package/public/slides-ai-native.html +1 -1
  51. package/public/slides-intro.html +2 -2
  52. package/scripts/examples/ask-luca-expert.ts +1 -1
  53. package/scripts/examples/assistant-questions.ts +1 -1
  54. package/scripts/examples/excalidraw-expert.ts +1 -1
  55. package/scripts/examples/file-manager.ts +1 -1
  56. package/scripts/examples/ideas.ts +1 -1
  57. package/scripts/examples/interactive-chat.ts +1 -1
  58. package/scripts/examples/opening-a-web-browser.ts +1 -1
  59. package/scripts/examples/telegram-bot.ts +1 -1
  60. package/scripts/examples/using-assistant-with-mcp.ts +1 -1
  61. package/scripts/examples/using-claude-code.ts +1 -1
  62. package/scripts/examples/using-contentdb.ts +2 -2
  63. package/scripts/examples/using-conversations.ts +1 -1
  64. package/scripts/examples/using-disk-cache.ts +1 -1
  65. package/scripts/examples/using-docker-shell.ts +1 -1
  66. package/scripts/examples/using-elevenlabs.ts +1 -1
  67. package/scripts/examples/using-google-calendar.ts +1 -1
  68. package/scripts/examples/using-google-docs.ts +1 -1
  69. package/scripts/examples/using-google-drive.ts +1 -1
  70. package/scripts/examples/using-google-sheets.ts +1 -1
  71. package/scripts/examples/using-nlp.ts +1 -1
  72. package/scripts/examples/using-ollama.ts +1 -1
  73. package/scripts/examples/using-postgres.ts +1 -1
  74. package/scripts/examples/using-runpod.ts +1 -1
  75. package/scripts/examples/using-tts.ts +1 -1
  76. package/scripts/scaffold.ts +5 -5
  77. package/scripts/scratch.ts +1 -1
  78. package/scripts/test-assistant-hooks.ts +1 -1
  79. package/scripts/test-docs-reader.ts +1 -1
  80. package/src/agi/container.server.ts +6 -2
  81. package/src/agi/features/agent-memory.ts +25 -25
  82. package/src/agi/features/assistant.ts +34 -5
  83. package/src/agi/features/assistants-manager.ts +122 -6
  84. package/src/agi/features/autonomous-assistant.ts +1 -1
  85. package/src/agi/features/browser-use.ts +20 -1
  86. package/src/agi/features/claude-code.ts +51 -5
  87. package/src/agi/features/coding-tools.ts +1 -1
  88. package/src/agi/features/conversation-history.ts +181 -4
  89. package/src/agi/features/conversation.ts +186 -15
  90. package/src/agi/features/docs-reader.ts +2 -2
  91. package/src/agi/features/file-tools.ts +49 -2
  92. package/src/agi/features/luca-coder.ts +7 -5
  93. package/src/agi/features/mcp-bridge.ts +532 -0
  94. package/src/agi/features/openai-codex.ts +2 -2
  95. package/src/agi/features/skills-library.ts +131 -52
  96. package/src/agi/lib/token-counter.ts +80 -0
  97. package/src/bootstrap/generated.ts +56 -57
  98. package/src/browser.ts +1 -1
  99. package/src/cli/build-info.ts +2 -2
  100. package/src/cli/cli.ts +2 -2
  101. package/src/clients/civitai/index.ts +5 -5
  102. package/src/clients/client-template.ts +4 -4
  103. package/src/clients/comfyui/index.ts +4 -4
  104. package/src/clients/elevenlabs/index.ts +4 -4
  105. package/src/clients/openai/index.ts +7 -7
  106. package/src/clients/supabase/index.ts +4 -4
  107. package/src/clients/voicebox/index.ts +4 -4
  108. package/src/command.ts +2 -1
  109. package/src/commands/chat.ts +1 -0
  110. package/src/commands/eval.ts +2 -56
  111. package/src/commands/introspect.ts +1 -1
  112. package/src/commands/prompt.ts +41 -9
  113. package/src/container-describer.ts +8 -1
  114. package/src/container.ts +13 -0
  115. package/src/entity.ts +2 -2
  116. package/src/helper.ts +1 -1
  117. package/src/introspection/generated.agi.ts +28563 -27571
  118. package/src/introspection/generated.node.ts +20281 -20194
  119. package/src/introspection/generated.web.ts +605 -584
  120. package/src/introspection/scan.ts +11 -6
  121. package/src/node/container.ts +1 -1
  122. package/src/node/features/content-db.ts +39 -2
  123. package/src/node/features/display-result.ts +57 -0
  124. package/src/node/features/helpers.ts +42 -15
  125. package/src/node/features/python.ts +25 -19
  126. package/src/node/features/repl.ts +1 -1
  127. package/src/node/features/secure-shell.ts +11 -17
  128. package/src/node/features/semantic-search.ts +2 -2
  129. package/src/node/features/transpiler.ts +2 -3
  130. package/src/node/features/ui.ts +5 -0
  131. package/src/node/features/vm.ts +3 -3
  132. package/src/node.ts +3 -3
  133. package/src/python/generated.ts +0 -1
  134. package/src/scaffolds/generated.ts +82 -83
  135. package/src/selector.ts +1 -1
  136. package/src/servers/express.ts +1 -1
  137. package/src/web/features/helpers.ts +22 -0
  138. package/tsconfig.json +12 -12
  139. package/docs/CLI.md +0 -335
  140. package/docs/CNAME +0 -1
  141. package/docs/README.md +0 -60
  142. package/docs/TABLE-OF-CONTENTS.md +0 -183
  143. package/docs/apis/clients/elevenlabs.md +0 -308
  144. package/docs/apis/clients/graph.md +0 -107
  145. package/docs/apis/clients/openai.md +0 -429
  146. package/docs/apis/clients/rest.md +0 -161
  147. package/docs/apis/clients/websocket.md +0 -174
  148. package/docs/apis/features/agi/assistant.md +0 -625
  149. package/docs/apis/features/agi/assistants-manager.md +0 -282
  150. package/docs/apis/features/agi/auto-assistant.md +0 -279
  151. package/docs/apis/features/agi/browser-use.md +0 -802
  152. package/docs/apis/features/agi/claude-code.md +0 -884
  153. package/docs/apis/features/agi/conversation-history.md +0 -364
  154. package/docs/apis/features/agi/conversation.md +0 -548
  155. package/docs/apis/features/agi/docs-reader.md +0 -99
  156. package/docs/apis/features/agi/file-tools.md +0 -163
  157. package/docs/apis/features/agi/luca-coder.md +0 -407
  158. package/docs/apis/features/agi/openai-codex.md +0 -396
  159. package/docs/apis/features/agi/openapi.md +0 -138
  160. package/docs/apis/features/agi/semantic-search.md +0 -387
  161. package/docs/apis/features/agi/skills-library.md +0 -239
  162. package/docs/apis/features/node/container-link.md +0 -192
  163. package/docs/apis/features/node/content-db.md +0 -450
  164. package/docs/apis/features/node/disk-cache.md +0 -379
  165. package/docs/apis/features/node/dns.md +0 -652
  166. package/docs/apis/features/node/docker.md +0 -706
  167. package/docs/apis/features/node/downloader.md +0 -81
  168. package/docs/apis/features/node/esbuild.md +0 -60
  169. package/docs/apis/features/node/file-manager.md +0 -191
  170. package/docs/apis/features/node/fs.md +0 -1217
  171. package/docs/apis/features/node/git.md +0 -371
  172. package/docs/apis/features/node/google-auth.md +0 -193
  173. package/docs/apis/features/node/google-calendar.md +0 -202
  174. package/docs/apis/features/node/google-docs.md +0 -173
  175. package/docs/apis/features/node/google-drive.md +0 -246
  176. package/docs/apis/features/node/google-mail.md +0 -214
  177. package/docs/apis/features/node/google-sheets.md +0 -194
  178. package/docs/apis/features/node/grep.md +0 -292
  179. package/docs/apis/features/node/helpers.md +0 -164
  180. package/docs/apis/features/node/ink.md +0 -334
  181. package/docs/apis/features/node/ipc-socket.md +0 -249
  182. package/docs/apis/features/node/json-tree.md +0 -86
  183. package/docs/apis/features/node/networking.md +0 -316
  184. package/docs/apis/features/node/nlp.md +0 -133
  185. package/docs/apis/features/node/opener.md +0 -97
  186. package/docs/apis/features/node/os.md +0 -146
  187. package/docs/apis/features/node/package-finder.md +0 -392
  188. package/docs/apis/features/node/postgres.md +0 -234
  189. package/docs/apis/features/node/proc.md +0 -399
  190. package/docs/apis/features/node/process-manager.md +0 -305
  191. package/docs/apis/features/node/python.md +0 -604
  192. package/docs/apis/features/node/redis.md +0 -380
  193. package/docs/apis/features/node/repl.md +0 -88
  194. package/docs/apis/features/node/runpod.md +0 -674
  195. package/docs/apis/features/node/secure-shell.md +0 -176
  196. package/docs/apis/features/node/semantic-search.md +0 -408
  197. package/docs/apis/features/node/sqlite.md +0 -233
  198. package/docs/apis/features/node/telegram.md +0 -279
  199. package/docs/apis/features/node/transpiler.md +0 -74
  200. package/docs/apis/features/node/tts.md +0 -133
  201. package/docs/apis/features/node/ui.md +0 -701
  202. package/docs/apis/features/node/vault.md +0 -59
  203. package/docs/apis/features/node/vm.md +0 -75
  204. package/docs/apis/features/node/yaml-tree.md +0 -85
  205. package/docs/apis/features/node/yaml.md +0 -176
  206. package/docs/apis/features/web/asset-loader.md +0 -59
  207. package/docs/apis/features/web/container-link.md +0 -192
  208. package/docs/apis/features/web/esbuild.md +0 -54
  209. package/docs/apis/features/web/helpers.md +0 -164
  210. package/docs/apis/features/web/network.md +0 -44
  211. package/docs/apis/features/web/speech.md +0 -69
  212. package/docs/apis/features/web/vault.md +0 -59
  213. package/docs/apis/features/web/vm.md +0 -75
  214. package/docs/apis/features/web/voice.md +0 -84
  215. package/docs/apis/servers/express.md +0 -171
  216. package/docs/apis/servers/mcp.md +0 -238
  217. package/docs/apis/servers/websocket.md +0 -170
  218. package/docs/bootstrap/CLAUDE.md +0 -101
  219. package/docs/bootstrap/SKILL.md +0 -341
  220. package/docs/bootstrap/templates/about-command.ts +0 -41
  221. package/docs/bootstrap/templates/docs-models.ts +0 -22
  222. package/docs/bootstrap/templates/docs-readme.md +0 -43
  223. package/docs/bootstrap/templates/example-feature.ts +0 -53
  224. package/docs/bootstrap/templates/health-endpoint.ts +0 -15
  225. package/docs/bootstrap/templates/luca-cli.ts +0 -30
  226. package/docs/bootstrap/templates/runme.md +0 -54
  227. package/docs/challenges/caching-proxy.md +0 -16
  228. package/docs/challenges/content-db-round-trip.md +0 -14
  229. package/docs/challenges/custom-command.md +0 -9
  230. package/docs/challenges/file-watcher-pipeline.md +0 -11
  231. package/docs/challenges/grep-audit-report.md +0 -15
  232. package/docs/challenges/multi-feature-dashboard.md +0 -14
  233. package/docs/challenges/process-orchestrator.md +0 -17
  234. package/docs/challenges/rest-api-server-with-client.md +0 -12
  235. package/docs/challenges/script-runner-with-vm.md +0 -11
  236. package/docs/challenges/simple-rest-api.md +0 -15
  237. package/docs/challenges/websocket-serve-and-client.md +0 -11
  238. package/docs/challenges/yaml-config-system.md +0 -14
  239. package/docs/command-system-overhaul.md +0 -94
  240. package/docs/documentation-audit.md +0 -134
  241. package/docs/examples/assistant/CORE.md +0 -18
  242. package/docs/examples/assistant/hooks.ts +0 -3
  243. package/docs/examples/assistant/tools.ts +0 -10
  244. package/docs/examples/assistant-hooks-reference.ts +0 -171
  245. package/docs/examples/assistant-with-process-manager.md +0 -84
  246. package/docs/examples/content-db.md +0 -77
  247. package/docs/examples/disk-cache.md +0 -83
  248. package/docs/examples/docker.md +0 -101
  249. package/docs/examples/downloader.md +0 -70
  250. package/docs/examples/entity.md +0 -124
  251. package/docs/examples/esbuild.md +0 -80
  252. package/docs/examples/feature-as-tool-provider.md +0 -143
  253. package/docs/examples/file-manager.md +0 -82
  254. package/docs/examples/fs.md +0 -83
  255. package/docs/examples/git.md +0 -85
  256. package/docs/examples/google-auth.md +0 -88
  257. package/docs/examples/google-calendar.md +0 -94
  258. package/docs/examples/google-docs.md +0 -82
  259. package/docs/examples/google-drive.md +0 -96
  260. package/docs/examples/google-sheets.md +0 -95
  261. package/docs/examples/grep.md +0 -85
  262. package/docs/examples/ink-blocks.md +0 -75
  263. package/docs/examples/ink-renderer.md +0 -41
  264. package/docs/examples/ink.md +0 -103
  265. package/docs/examples/ipc-socket.md +0 -103
  266. package/docs/examples/json-tree.md +0 -91
  267. package/docs/examples/networking.md +0 -58
  268. package/docs/examples/nlp.md +0 -91
  269. package/docs/examples/opener.md +0 -78
  270. package/docs/examples/os.md +0 -72
  271. package/docs/examples/package-finder.md +0 -89
  272. package/docs/examples/postgres.md +0 -91
  273. package/docs/examples/proc.md +0 -81
  274. package/docs/examples/process-manager.md +0 -79
  275. package/docs/examples/python.md +0 -132
  276. package/docs/examples/repl.md +0 -93
  277. package/docs/examples/runpod.md +0 -119
  278. package/docs/examples/secure-shell.md +0 -92
  279. package/docs/examples/sqlite.md +0 -86
  280. package/docs/examples/structured-output-with-assistants.md +0 -144
  281. package/docs/examples/telegram.md +0 -77
  282. package/docs/examples/tts.md +0 -86
  283. package/docs/examples/ui.md +0 -80
  284. package/docs/examples/vault.md +0 -70
  285. package/docs/examples/vm.md +0 -86
  286. package/docs/examples/websocket-ask-and-reply-example.md +0 -128
  287. package/docs/examples/yaml-tree.md +0 -93
  288. package/docs/examples/yaml.md +0 -104
  289. package/docs/ideas/assistant-factory-pattern.md +0 -142
  290. package/docs/in-memory-fs.md +0 -4
  291. package/docs/introspection-audit.md +0 -49
  292. package/docs/introspection.md +0 -164
  293. package/docs/mcp/readme.md +0 -162
  294. package/docs/models.ts +0 -41
  295. package/docs/philosophy.md +0 -86
  296. package/docs/principles.md +0 -7
  297. package/docs/prompts/audit-codebase-for-failures-to-use-the-container.md +0 -34
  298. package/docs/prompts/check-for-undocumented-features.md +0 -27
  299. package/docs/prompts/mcp-test-easy-command.md +0 -27
  300. package/docs/scaffolds/client.md +0 -149
  301. package/docs/scaffolds/command.md +0 -120
  302. package/docs/scaffolds/endpoint.md +0 -171
  303. package/docs/scaffolds/feature.md +0 -158
  304. package/docs/scaffolds/selector.md +0 -91
  305. package/docs/scaffolds/server.md +0 -196
  306. package/docs/selectors.md +0 -115
  307. package/docs/sessions/custom-command/attempt-log-2.md +0 -195
  308. package/docs/sessions/file-watcher-pipeline/attempt-log-1.md +0 -728
  309. package/docs/sessions/file-watcher-pipeline/attempt-log-2.md +0 -555
  310. package/docs/sessions/grep-audit-report/attempt-log-1.md +0 -289
  311. package/docs/sessions/multi-feature-dashboard/attempt-log-2.md +0 -679
  312. package/docs/sessions/rest-api-server-with-client/attempt-log-1.md +0 -1
  313. package/docs/sessions/rest-api-server-with-client/attempt-log-3.md +0 -920
  314. package/docs/sessions/simple-rest-api/attempt-log-1.md +0 -593
  315. package/docs/sessions/websocket-serve-and-client/attempt-log-2.md +0 -995
  316. package/docs/tutorials/00-bootstrap.md +0 -166
  317. package/docs/tutorials/01-getting-started.md +0 -106
  318. package/docs/tutorials/02-container.md +0 -210
  319. package/docs/tutorials/03-scripts.md +0 -194
  320. package/docs/tutorials/04-features-overview.md +0 -196
  321. package/docs/tutorials/05-state-and-events.md +0 -171
  322. package/docs/tutorials/06-servers.md +0 -157
  323. package/docs/tutorials/07-endpoints.md +0 -198
  324. package/docs/tutorials/08-commands.md +0 -252
  325. package/docs/tutorials/09-clients.md +0 -162
  326. package/docs/tutorials/10-creating-features.md +0 -203
  327. package/docs/tutorials/11-contentbase.md +0 -191
  328. package/docs/tutorials/12-assistants.md +0 -215
  329. package/docs/tutorials/13-introspection.md +0 -157
  330. package/docs/tutorials/14-type-system.md +0 -174
  331. package/docs/tutorials/15-project-patterns.md +0 -222
  332. package/docs/tutorials/16-google-features.md +0 -534
  333. package/docs/tutorials/17-tui-blocks.md +0 -530
  334. package/docs/tutorials/18-semantic-search.md +0 -334
  335. package/docs/tutorials/19-python-sessions.md +0 -401
  336. package/docs/tutorials/20-browser-esm.md +0 -234
  337. package/src/agi/endpoints/ask.ts +0 -60
  338. package/src/agi/endpoints/conversations/[id].ts +0 -45
  339. package/src/agi/endpoints/conversations.ts +0 -31
  340. package/src/agi/endpoints/experts.ts +0 -37
  341. package/test/assistant-hooks.test.ts +0 -306
  342. package/test/assistant.test.ts +0 -81
  343. package/test/bus.test.ts +0 -134
  344. package/test/clients-servers.test.ts +0 -217
  345. package/test/command.test.ts +0 -267
  346. package/test/container-link.test.ts +0 -274
  347. package/test/conversation.test.ts +0 -220
  348. package/test/features.test.ts +0 -160
  349. package/test/fork-and-research.test.ts +0 -450
  350. package/test/integration.test.ts +0 -787
  351. package/test/interceptor-chain.test.ts +0 -61
  352. package/test/node-container.test.ts +0 -121
  353. package/test/python-session.test.ts +0 -105
  354. package/test/rate-limit.test.ts +0 -272
  355. package/test/semantic-search.test.ts +0 -550
  356. package/test/state.test.ts +0 -121
  357. package/test/vm-context.test.ts +0 -146
  358. package/test/vm-loadmodule.test.ts +0 -213
  359. package/test/websocket-ask.test.ts +0 -101
  360. package/test-integration/assistant.test.ts +0 -138
  361. package/test-integration/assistants-manager.test.ts +0 -113
  362. package/test-integration/claude-code.test.ts +0 -98
  363. package/test-integration/conversation-history.test.ts +0 -205
  364. package/test-integration/conversation.test.ts +0 -137
  365. package/test-integration/elevenlabs.test.ts +0 -55
  366. package/test-integration/google-services.test.ts +0 -80
  367. package/test-integration/helpers.ts +0 -89
  368. package/test-integration/memory.test.ts +0 -204
  369. package/test-integration/openai-codex.test.ts +0 -93
  370. package/test-integration/runpod.test.ts +0 -58
  371. package/test-integration/server-endpoints.test.ts +0 -97
  372. package/test-integration/telegram.test.ts +0 -46
@@ -1,77 +0,0 @@
1
- ---
2
- title: "Telegram Bot"
3
- tags: [telegram, bot, messaging, grammy]
4
- lastTested: null
5
- lastTestPassed: null
6
- ---
7
-
8
- # telegram
9
-
10
- Telegram bot feature powered by grammY. Supports long-polling and webhook modes, with the full grammY Bot instance exposed for direct API access. Events bridge to Luca's event bus.
11
-
12
- ## Overview
13
-
14
- Use the `telegram` feature when you need to build a Telegram bot. It wraps the grammY library and handles bot lifecycle (start, stop, polling, webhooks) while bridging Telegram events into Luca's event system.
15
-
16
- Requires a `TELEGRAM_BOT_TOKEN` environment variable or a `token` option from [@BotFather](https://t.me/BotFather).
17
-
18
- ## Enabling the Feature
19
-
20
- ```ts
21
- const tg = container.feature('telegram', {
22
- mode: 'polling',
23
- dropPendingUpdates: true
24
- })
25
- console.log('Telegram feature created, mode:', tg.mode)
26
- ```
27
-
28
- The feature reads `TELEGRAM_BOT_TOKEN` from the environment automatically. You can also pass `token` explicitly as an option.
29
-
30
- ## API Documentation
31
-
32
- ```ts
33
- const info = await container.features.describe('telegram')
34
- console.log(info)
35
- ```
36
-
37
- ## Registering Commands
38
-
39
- Bot commands are registered with `.command()` and also emit events on Luca's event bus.
40
-
41
- ```ts skip
42
- tg.command('start', (ctx) => ctx.reply('Welcome! I am your Luca bot.'))
43
- tg.command('help', (ctx) => ctx.reply('Available: /start, /help, /ping'))
44
- tg.command('ping', (ctx) => ctx.reply('Pong!'))
45
- console.log('Registered commands:', tg.state.commandsRegistered)
46
- ```
47
-
48
- If the bot were running with a valid token, sending `/start` in Telegram would reply with "Welcome! I am your Luca bot." and the `command` event would fire on the Luca event bus.
49
-
50
- ## Handling Messages
51
-
52
- Use `.handle()` to register grammY update handlers for any filter query.
53
-
54
- ```ts skip
55
- tg.handle('message:text', (ctx) => {
56
- ctx.reply(`Echo: ${ctx.message.text}`)
57
- })
58
- tg.handle('callback_query:data', (ctx) => {
59
- ctx.answerCallbackQuery('Button clicked!')
60
- })
61
- ```
62
-
63
- The `.handle()` method maps directly to grammY's `bot.on()` and supports all grammY filter queries like `message:photo`, `edited_message`, and `callback_query:data`.
64
-
65
- ## Starting the Bot
66
-
67
- ```ts skip
68
- await tg.start()
69
- console.log('Bot is running:', tg.isRunning)
70
- console.log('Mode:', tg.mode)
71
- ```
72
-
73
- Once started in polling mode, the bot continuously fetches updates from Telegram. Call `await tg.stop()` to shut down gracefully. The `started` and `stopped` events fire on the Luca event bus.
74
-
75
- ## Summary
76
-
77
- The `telegram` feature provides a complete Telegram bot lifecycle manager. Register commands and handlers, then start polling or set up a webhook. All Telegram events are bridged to Luca's event bus for integration with other features. Key methods: `command()`, `handle()`, `start()`, `stop()`, `setupWebhook()`.
@@ -1,86 +0,0 @@
1
- ---
2
- title: "Text-to-Speech"
3
- tags: [tts, speech, audio, runpod, chatterbox]
4
- lastTested: null
5
- lastTestPassed: null
6
- ---
7
-
8
- # tts
9
-
10
- Text-to-speech feature that synthesizes audio files via RunPod's Chatterbox Turbo endpoint. Supports 20 preset voices and voice cloning from a reference audio URL.
11
-
12
- ## Overview
13
-
14
- Use the `tts` feature when you need to generate speech audio from text. It calls the Chatterbox Turbo public endpoint on RunPod, downloads the resulting audio, and saves it locally. Choose from 20 preset voices or clone any voice by providing a reference audio URL.
15
-
16
- Requires a `RUNPOD_API_KEY` environment variable or an `apiKey` option.
17
-
18
- ## Enabling the Feature
19
-
20
- ```ts
21
- const tts = container.feature('tts', {
22
- voice: 'lucy',
23
- format: 'wav',
24
- outputDir: '/tmp/tts-output'
25
- })
26
- console.log('TTS feature created')
27
- console.log('Default voice:', tts.options.voice)
28
- console.log('Output format:', tts.options.format)
29
- ```
30
-
31
- ## API Documentation
32
-
33
- ```ts
34
- const info = await container.features.describe('tts')
35
- console.log(info)
36
- ```
37
-
38
- ## Available Voices
39
-
40
- List all 20 preset voice names.
41
-
42
- ```ts
43
- console.log('Available voices:', tts.voices.join(', '))
44
- ```
45
-
46
- ## Generating Speech
47
-
48
- Synthesize text with a preset voice.
49
-
50
- ```ts skip
51
- const path = await tts.synthesize('Good morning! Here is your daily briefing.', {
52
- voice: 'ethan'
53
- })
54
- console.log('Audio saved to:', path)
55
- console.log('Last generated file:', tts.state.lastFile)
56
- ```
57
-
58
- The synthesize method sends the text to RunPod, waits for generation, downloads the audio, and saves it to the output directory. The `synthesized` event fires with the file path on completion.
59
-
60
- ## Voice Cloning
61
-
62
- Clone any voice by providing a reference audio URL.
63
-
64
- ```ts skip
65
- const path = await tts.synthesize('Hello world, this is a cloned voice.', {
66
- voiceUrl: 'https://example.com/reference-voice.wav'
67
- })
68
- console.log('Cloned voice audio saved to:', path)
69
- ```
70
-
71
- The reference audio should be a clear recording of the voice you want to clone. The Chatterbox Turbo model uses it to match the voice characteristics.
72
-
73
- ## Output Formats
74
-
75
- ```ts skip
76
- const wav = await tts.synthesize('WAV format', { format: 'wav' })
77
- const flac = await tts.synthesize('FLAC format', { format: 'flac' })
78
- const ogg = await tts.synthesize('OGG format', { format: 'ogg' })
79
- console.log('Generated files:', wav, flac, ogg)
80
- ```
81
-
82
- Three output formats are supported: WAV (default, uncompressed), FLAC (lossless compressed), and OGG (lossy compressed).
83
-
84
- ## Summary
85
-
86
- The `tts` feature generates speech audio via RunPod's Chatterbox Turbo. Choose from 20 preset voices or clone a custom voice with a reference URL. Supports WAV, FLAC, and OGG output formats. Key methods: `synthesize()`. Key getters: `voices`, `outputDir`.
@@ -1,80 +0,0 @@
1
- ---
2
- title: "ui"
3
- tags: [ui, terminal, colors, ascii-art, core]
4
- lastTested: null
5
- lastTestPassed: null
6
- ---
7
-
8
- # ui
9
-
10
- Terminal UI utilities including colors, ASCII art, gradients, and markdown rendering.
11
-
12
- ## Overview
13
-
14
- The `ui` feature is a core feature, auto-enabled on every container. You can access it directly as a global or via `container.feature('ui')`. It provides chalk-based color styling, figlet-powered ASCII art, color gradient effects, and terminal markdown rendering. Use it to make CLI output readable and visually organized.
15
-
16
- ## Text Colors
17
-
18
- The `colors` getter provides the full chalk API for coloring and styling terminal text.
19
-
20
- ```ts
21
- const { colors } = ui
22
- console.log(colors.green('Success: all tests passed'))
23
- console.log(colors.red('Error: file not found'))
24
- console.log(colors.yellow('Warning: deprecated API'))
25
- console.log(colors.bold.cyan('Info: build complete'))
26
- ```
27
-
28
- Colors can be chained with styles like `bold`, `italic`, `underline`, and `dim`.
29
-
30
- ## ASCII Art
31
-
32
- Use `asciiArt()` to render text in large figlet fonts. Pass the text and a font name.
33
-
34
- ```ts
35
- const art = ui.asciiArt('LUCA', 'Standard')
36
- console.log(art)
37
- ```
38
-
39
- The `fonts` getter lists all available figlet fonts if you want to explore options.
40
-
41
- ## Banner with Gradient
42
-
43
- Use `banner()` to combine ASCII art with a color gradient for eye-catching headers.
44
-
45
- ```ts
46
- const result = ui.banner('Hello', { font: 'Small', colors: ['cyan', 'blue', 'magenta'] })
47
- console.log(result)
48
- ```
49
-
50
- The gradient is applied automatically across the lines of the ASCII art.
51
-
52
- ## Color Gradients
53
-
54
- Use `applyGradient()` to apply color transitions to any text. Choose between horizontal (per-character) and vertical (per-line) directions.
55
-
56
- ```ts
57
- const horizontal = ui.applyGradient('Horizontal gradient across this text', ['red', 'yellow', 'green'], 'horizontal')
58
- console.log(horizontal)
59
-
60
- const lines = 'Line one\nLine two\nLine three\nLine four'
61
- const vertical = ui.applyGradient(lines, ['cyan', 'blue', 'magenta'], 'vertical')
62
- console.log(vertical)
63
- ```
64
-
65
- Horizontal gradients color each character individually. Vertical gradients color each line uniformly.
66
-
67
- ## Markdown Rendering
68
-
69
- Use `markdown()` to render a markdown string for terminal display with formatting preserved.
70
-
71
- ```ts
72
- const md = ui.markdown('## Features\n\n- **Bold** text\n- `inline code`\n- Regular paragraph text\n')
73
- console.log(md)
74
- ```
75
-
76
- This uses marked-terminal under the hood to produce styled terminal output from markdown source.
77
-
78
- ## Summary
79
-
80
- This demo covered text coloring with chalk, ASCII art generation with figlet, gradient banners, horizontal and vertical color gradients, and markdown rendering. The `ui` feature handles all the visual polish for terminal applications.
@@ -1,70 +0,0 @@
1
- ---
2
- title: "Vault"
3
- tags: [vault, encryption, security, crypto]
4
- lastTested: null
5
- lastTestPassed: null
6
- ---
7
-
8
- # vault
9
-
10
- AES-256-GCM encryption and decryption for sensitive data. Encrypt strings and get them back with a simple two-method API.
11
-
12
- ## Overview
13
-
14
- The `vault` feature is on-demand. It generates or accepts a secret key and provides `encrypt()` and `decrypt()` methods using AES-256-GCM, an authenticated encryption scheme. Use it to protect sensitive configuration values, tokens, or any data that should not be stored in plaintext.
15
-
16
- ## Enabling the Vault
17
-
18
- Create a vault instance. It will generate a secret key automatically.
19
-
20
- ```ts
21
- const vault = container.feature('vault')
22
- console.log('Vault enabled:', vault.state.get('enabled'))
23
- ```
24
-
25
- The vault is ready to use immediately after creation.
26
-
27
- ## Encrypting a String
28
-
29
- Pass any plaintext string to `encrypt()` and receive an opaque encrypted payload.
30
-
31
- ```ts
32
- const secret = 'my-database-password-12345'
33
- const encrypted = vault.encrypt(secret)
34
- console.log('Original:', secret)
35
- console.log('Encrypted:', encrypted)
36
- console.log('Encrypted length:', encrypted.length)
37
- ```
38
-
39
- The encrypted output is a base64-encoded string containing the IV, auth tag, and ciphertext. It is safe to store in config files or databases.
40
-
41
- ## Decrypting Back to Plaintext
42
-
43
- Use `decrypt()` with the same vault instance to recover the original value.
44
-
45
- ```ts
46
- const decrypted = vault.decrypt(encrypted)
47
- console.log('Decrypted:', decrypted)
48
- console.log('Round-trip matches:', decrypted === secret)
49
- ```
50
-
51
- The decrypted value is identical to the original input.
52
-
53
- ## Encrypting Multiple Values
54
-
55
- Each call to `encrypt()` produces a unique ciphertext, even for the same input, because a fresh IV is generated every time.
56
-
57
- ```ts
58
- const a = vault.encrypt('same-input')
59
- const b = vault.encrypt('same-input')
60
- console.log('Encryption A:', a)
61
- console.log('Encryption B:', b)
62
- console.log('Same ciphertext?', a === b)
63
- console.log('Both decrypt correctly?', vault.decrypt(a) === vault.decrypt(b))
64
- ```
65
-
66
- This property (semantic security) means an attacker cannot tell if two ciphertexts contain the same plaintext.
67
-
68
- ## Summary
69
-
70
- This demo covered enabling the vault, encrypting strings, decrypting them back, and verifying that repeated encryption produces unique ciphertexts. The `vault` feature provides straightforward authenticated encryption for any sensitive data your application handles.
@@ -1,86 +0,0 @@
1
- ---
2
- title: "vm"
3
- tags: [vm, sandbox, evaluation, core]
4
- lastTested: null
5
- lastTestPassed: null
6
- ---
7
-
8
- # vm
9
-
10
- JavaScript VM for evaluating code in isolated contexts with shared or independent state.
11
-
12
- ## Overview
13
-
14
- The `vm` feature is a core feature, auto-enabled on every container. You can access it directly as a global or via `container.feature('vm')`. It provides methods for running JavaScript in sandboxed contexts, passing variables in, and optionally preserving state across multiple runs. Use it for plugin systems, dynamic code evaluation, or testing snippets in isolation.
15
-
16
- ## Simple Expression Evaluation
17
-
18
- Use `runSync()` to evaluate a JavaScript expression and get the result back immediately.
19
-
20
- ```ts
21
- const sum = vm.runSync('2 + 3 * 4')
22
- console.log('2 + 3 * 4 =', sum)
23
-
24
- const greeting = vm.runSync('`Hello ${name}!`', { name: 'Luca' })
25
- console.log(greeting)
26
- ```
27
-
28
- The second argument is an optional context object whose keys become variables in the evaluated code.
29
-
30
- ## Running with Context Variables
31
-
32
- Use `run()` for async evaluation with injected variables. This is the async equivalent of `runSync()`.
33
-
34
- ```ts
35
- const result = await vm.run('numbers.reduce((a, b) => a + b, 0)', {
36
- numbers: [10, 20, 30, 40]
37
- })
38
- console.log('Sum of [10, 20, 30, 40]:', result)
39
- ```
40
-
41
- Any JavaScript value can be passed through the context -- arrays, objects, functions, and primitives.
42
-
43
- ## Getting the Context Back
44
-
45
- Use `performSync()` to run code and get both the result and the modified context. This lets you inspect variables that were set during execution.
46
-
47
- ```ts
48
- const { result, context } = vm.performSync('x = x * 2; x + 1', { x: 21 })
49
- console.log('Result:', result)
50
- console.log('x after execution:', context.x)
51
- ```
52
-
53
- The context is mutated in place, so you can see side effects of the evaluated code.
54
-
55
- ## Shared State Across Runs
56
-
57
- Use `createContext()` to build a persistent context that carries state across multiple evaluations.
58
-
59
- ```ts
60
- const ctx = vm.createContext({ counter: 0 })
61
- vm.runSync('counter += 1', ctx)
62
- vm.runSync('counter += 1', ctx)
63
- vm.runSync('counter += 10', ctx)
64
- console.log('Counter after 3 runs:', vm.runSync('counter', ctx))
65
- ```
66
-
67
- The same context object is reused, so variables accumulate across calls.
68
-
69
- ## Error Handling
70
-
71
- When evaluated code might throw, wrap the call in a try/catch to handle it gracefully.
72
-
73
- ```ts
74
- try {
75
- vm.runSync('undefinedFunction()')
76
- } catch (err) {
77
- console.log('Error caught:', err.constructor.name)
78
- console.log('Message:', err.message)
79
- }
80
- ```
81
-
82
- This keeps a bad snippet from crashing the rest of your program.
83
-
84
- ## Summary
85
-
86
- This demo covered synchronous and async expression evaluation, passing context variables into the sandbox, inspecting mutated context after execution, maintaining shared state across runs, and safe error handling. The `vm` feature is the foundation for dynamic code execution in any Luca application.
@@ -1,128 +0,0 @@
1
- ---
2
- title: "websocket-ask-and-reply"
3
- tags: [websocket, client, server, ask, reply, rpc]
4
- lastTested: null
5
- lastTestPassed: null
6
- ---
7
-
8
- # websocket-ask-and-reply
9
-
10
- Request/response conversations over WebSocket using `ask()` and `reply()`.
11
-
12
- ## Overview
13
-
14
- The WebSocket client and server both support a request/response protocol on top of the normal fire-and-forget message stream. The client can `ask()` the server a question and await the answer. The server can `ask()` a connected client the same way. Under the hood it works with correlation IDs — `requestId` on the request, `replyTo` on the response — but you never have to touch those directly.
15
-
16
- ## Setup
17
-
18
- Declare the shared references that all blocks will use, and wire up the server's message handler. This block is synchronous so the variables persist across subsequent blocks.
19
-
20
- ```ts
21
- var port = 0
22
- var server = container.server('websocket', { json: true })
23
- var client = null
24
-
25
- server.on('message', (data, ws) => {
26
- if (data.type === 'add') {
27
- data.reply({ sum: data.data.a + data.data.b })
28
- } else if (data.type === 'divide') {
29
- if (data.data.b === 0) {
30
- data.replyError('division by zero')
31
- } else {
32
- data.reply({ result: data.data.a / data.data.b })
33
- }
34
- }
35
- })
36
- console.log('Server and handlers configured')
37
- ```
38
-
39
- ## Start Server and Connect Client
40
-
41
- ```ts
42
- port = await networking.findOpenPort(19900)
43
- await server.start({ port })
44
- console.log('Server listening on port', port)
45
-
46
- client = container.client('websocket', { baseURL: `ws://localhost:${port}` })
47
- await client.connect()
48
- console.log('Client connected')
49
- ```
50
-
51
- ## Client Asks the Server
52
-
53
- `ask(type, data, timeout?)` sends a message and returns a promise that resolves with the response payload.
54
-
55
- ```ts
56
- var sum = await client.ask('add', { a: 3, b: 4 })
57
- console.log('3 + 4 =', sum.sum)
58
-
59
- var quotient = await client.ask('divide', { a: 10, b: 3 })
60
- console.log('10 / 3 =', quotient.result.toFixed(2))
61
- ```
62
-
63
- ## Handling Errors
64
-
65
- When the server calls `replyError(message)`, the client's `ask()` promise rejects with that message.
66
-
67
- ```ts
68
- try {
69
- await client.ask('divide', { a: 1, b: 0 })
70
- } catch (err) {
71
- console.log('Caught error:', err.message)
72
- }
73
- ```
74
-
75
- ## Server Asks the Client
76
-
77
- The server can also ask a connected client. The client handles incoming requests by listening for messages with a `requestId` and sending back a `replyTo` response.
78
-
79
- ```ts
80
- client.on('message', (data) => {
81
- if (data.requestId && data.type === 'whoAreYou') {
82
- client.send({ replyTo: data.requestId, data: { name: 'luca-client', version: '1.0' } })
83
- }
84
- })
85
-
86
- var firstClient = [...server.connections][0]
87
- var identity = await server.ask(firstClient, 'whoAreYou')
88
- console.log('Client identified as:', identity.name, identity.version)
89
- ```
90
-
91
- ## Timeouts
92
-
93
- If nobody replies, `ask()` rejects after the timeout (default 10s, configurable as the third argument).
94
-
95
- ```ts
96
- try {
97
- await client.ask('noop', {}, 500)
98
- } catch (err) {
99
- console.log('Timed out as expected:', err.message)
100
- }
101
- ```
102
-
103
- ## Regular Messages Still Work
104
-
105
- Messages without `requestId` flow through the normal `message` event as always. The ask/reply protocol is purely additive.
106
-
107
- ```ts
108
- var received = null
109
- server.on('message', (data) => {
110
- if (data.type === 'ping') received = data
111
- })
112
-
113
- await client.send({ type: 'ping', ts: Date.now() })
114
- await new Promise(r => setTimeout(r, 50))
115
- console.log('Regular message received:', received.type, '— no requestId:', received.requestId === undefined)
116
- ```
117
-
118
- ## Cleanup
119
-
120
- ```ts
121
- await client.disconnect()
122
- await server.stop()
123
- console.log('Done')
124
- ```
125
-
126
- ## Summary
127
-
128
- The ask/reply protocol gives you awaitable request/response over WebSocket without leaving the Luca helper API. The client calls `ask(type, data)` and gets back a promise. The server's message handler gets `reply()` and `replyError()` injected on any message that carries a `requestId`. The server can also `ask()` a specific client. Timeouts, error propagation, and cleanup of pending requests on disconnect are all handled automatically.
@@ -1,93 +0,0 @@
1
- ---
2
- title: "YAML Tree"
3
- tags: [yamlTree, yaml, files, data-loading]
4
- lastTested: null
5
- lastTestPassed: null
6
- ---
7
-
8
- # yamlTree
9
-
10
- Load YAML files from directory structures into a nested object tree.
11
-
12
- ## Overview
13
-
14
- The `yamlTree` feature is an on-demand feature that recursively scans a directory for `.yml` and `.yaml` files and builds a hierarchical JavaScript object from them. It works identically to `jsonTree` but for YAML content. File paths are converted to camelCased property paths, so `config/database/production.yml` becomes `tree.config.database.production`. This is useful for projects that store configuration, infrastructure definitions, or data in YAML format.
15
-
16
- ## Feature Documentation
17
-
18
- Let us inspect the feature's built-in documentation.
19
-
20
- ```ts
21
- const desc = container.features.describe('yamlTree')
22
- console.log(desc)
23
- ```
24
-
25
- Like jsonTree, the key method is `loadTree(basePath, key?)` and the data is accessed through the `tree` getter.
26
-
27
- ## Enabling the Feature
28
-
29
- Enable yamlTree and check its initial state.
30
-
31
- ```ts
32
- const yamlTree = container.feature('yamlTree', { enable: true })
33
- console.log('yamlTree enabled:', yamlTree.state.enabled)
34
- console.log('Initial tree:', JSON.stringify(yamlTree.tree))
35
- ```
36
-
37
- The tree starts empty until you load directories into it.
38
-
39
- ## Loading YAML Files
40
-
41
- We can attempt to load YAML files from the project. If the project has any `.yml` or `.yaml` files, they will appear in the tree.
42
-
43
- ```ts
44
- await yamlTree.loadTree('.', 'root')
45
- const keys = Object.keys(yamlTree.tree.root || {})
46
- console.log('Keys loaded under root:', keys.length ? keys.join(', ') : '(no YAML files found)')
47
- ```
48
-
49
- If no YAML files are found, the tree for that key will be empty. This is expected for projects that do not use YAML.
50
-
51
- ## How It Compares to jsonTree
52
-
53
- The yamlTree and jsonTree features share the same design pattern:
54
-
55
- - Both recursively scan directories
56
- - Both convert file paths to camelCased property paths
57
- - Both store results in a `tree` getter
58
- - Both accept a custom key for namespacing
59
-
60
- The only difference is the file extensions they look for and the parser they use.
61
-
62
- ```ts
63
- const comparison = {
64
- jsonTree: { extensions: ['.json'], parser: 'JSON.parse' },
65
- yamlTree: { extensions: ['.yml', '.yaml'], parser: 'YAML parser' },
66
- }
67
- for (const [name, info] of Object.entries(comparison)) {
68
- console.log(`${name}: scans ${info.extensions.join(', ')} files, uses ${info.parser}`)
69
- }
70
- ```
71
-
72
- ## Path Transformation Rules
73
-
74
- The same path transformation rules apply as in jsonTree:
75
-
76
- - Directory names become nested object properties
77
- - File names (without extension) become leaf properties
78
- - All names are converted to camelCase
79
-
80
- ```ts
81
- const mappings = {
82
- 'infra/k8s/deployment.yml': 'tree.infra.k8s.deployment',
83
- 'config/app-settings.yaml': 'tree.config.appSettings',
84
- 'data/seed/users.yml': 'tree.data.seed.users',
85
- }
86
- for (const [file, path] of Object.entries(mappings)) {
87
- console.log(`${file} => ${path}`)
88
- }
89
- ```
90
-
91
- ## Summary
92
-
93
- This demo covered the `yamlTree` feature, which scans directories for YAML files (.yml and .yaml) and builds a nested object tree. It follows the same pattern as `jsonTree` and is ideal for projects that rely on YAML for configuration, infrastructure definitions, or structured data.