@soederpop/luca 0.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 (358) hide show
  1. package/CLAUDE.md +71 -0
  2. package/README.md +78 -0
  3. package/bun.lock +2928 -0
  4. package/bunfig.toml +3 -0
  5. package/commands/audit-docs.ts +740 -0
  6. package/commands/build-scaffolds.ts +154 -0
  7. package/commands/generate-api-docs.ts +114 -0
  8. package/commands/update-introspection.ts +67 -0
  9. package/docs/CLI.md +335 -0
  10. package/docs/README.md +88 -0
  11. package/docs/TABLE-OF-CONTENTS.md +157 -0
  12. package/docs/apis/clients/elevenlabs.md +84 -0
  13. package/docs/apis/clients/graph.md +56 -0
  14. package/docs/apis/clients/openai.md +69 -0
  15. package/docs/apis/clients/rest.md +41 -0
  16. package/docs/apis/clients/websocket.md +107 -0
  17. package/docs/apis/features/agi/assistant.md +471 -0
  18. package/docs/apis/features/agi/assistants-manager.md +154 -0
  19. package/docs/apis/features/agi/claude-code.md +602 -0
  20. package/docs/apis/features/agi/conversation-history.md +352 -0
  21. package/docs/apis/features/agi/conversation.md +333 -0
  22. package/docs/apis/features/agi/docs-reader.md +121 -0
  23. package/docs/apis/features/agi/openai-codex.md +318 -0
  24. package/docs/apis/features/agi/openapi.md +138 -0
  25. package/docs/apis/features/agi/semantic-search.md +387 -0
  26. package/docs/apis/features/agi/skills-library.md +216 -0
  27. package/docs/apis/features/node/container-link.md +133 -0
  28. package/docs/apis/features/node/content-db.md +313 -0
  29. package/docs/apis/features/node/disk-cache.md +379 -0
  30. package/docs/apis/features/node/dns.md +651 -0
  31. package/docs/apis/features/node/docker.md +705 -0
  32. package/docs/apis/features/node/downloader.md +81 -0
  33. package/docs/apis/features/node/esbuild.md +59 -0
  34. package/docs/apis/features/node/file-manager.md +182 -0
  35. package/docs/apis/features/node/fs.md +581 -0
  36. package/docs/apis/features/node/git.md +330 -0
  37. package/docs/apis/features/node/google-auth.md +174 -0
  38. package/docs/apis/features/node/google-calendar.md +187 -0
  39. package/docs/apis/features/node/google-docs.md +151 -0
  40. package/docs/apis/features/node/google-drive.md +225 -0
  41. package/docs/apis/features/node/google-sheets.md +179 -0
  42. package/docs/apis/features/node/grep.md +290 -0
  43. package/docs/apis/features/node/helpers.md +135 -0
  44. package/docs/apis/features/node/ink.md +334 -0
  45. package/docs/apis/features/node/ipc-socket.md +260 -0
  46. package/docs/apis/features/node/json-tree.md +86 -0
  47. package/docs/apis/features/node/launcher-app-command-listener.md +145 -0
  48. package/docs/apis/features/node/networking.md +281 -0
  49. package/docs/apis/features/node/nlp.md +133 -0
  50. package/docs/apis/features/node/opener.md +97 -0
  51. package/docs/apis/features/node/os.md +118 -0
  52. package/docs/apis/features/node/package-finder.md +402 -0
  53. package/docs/apis/features/node/postgres.md +212 -0
  54. package/docs/apis/features/node/proc.md +430 -0
  55. package/docs/apis/features/node/process-manager.md +210 -0
  56. package/docs/apis/features/node/python.md +278 -0
  57. package/docs/apis/features/node/repl.md +88 -0
  58. package/docs/apis/features/node/runpod.md +673 -0
  59. package/docs/apis/features/node/secure-shell.md +169 -0
  60. package/docs/apis/features/node/semantic-search.md +401 -0
  61. package/docs/apis/features/node/sqlite.md +211 -0
  62. package/docs/apis/features/node/telegram.md +254 -0
  63. package/docs/apis/features/node/tts.md +118 -0
  64. package/docs/apis/features/node/ui.md +703 -0
  65. package/docs/apis/features/node/vault.md +64 -0
  66. package/docs/apis/features/node/vm.md +84 -0
  67. package/docs/apis/features/node/window-manager.md +337 -0
  68. package/docs/apis/features/node/yaml-tree.md +85 -0
  69. package/docs/apis/features/node/yaml.md +176 -0
  70. package/docs/apis/features/web/asset-loader.md +47 -0
  71. package/docs/apis/features/web/container-link.md +133 -0
  72. package/docs/apis/features/web/esbuild.md +59 -0
  73. package/docs/apis/features/web/helpers.md +135 -0
  74. package/docs/apis/features/web/network.md +30 -0
  75. package/docs/apis/features/web/speech.md +55 -0
  76. package/docs/apis/features/web/vault.md +64 -0
  77. package/docs/apis/features/web/vm.md +84 -0
  78. package/docs/apis/features/web/voice.md +67 -0
  79. package/docs/apis/servers/express.md +127 -0
  80. package/docs/apis/servers/mcp.md +213 -0
  81. package/docs/apis/servers/websocket.md +99 -0
  82. package/docs/documentation-audit.md +134 -0
  83. package/docs/examples/content-db.md +77 -0
  84. package/docs/examples/disk-cache.md +83 -0
  85. package/docs/examples/docker.md +101 -0
  86. package/docs/examples/downloader.md +70 -0
  87. package/docs/examples/esbuild.md +80 -0
  88. package/docs/examples/file-manager.md +82 -0
  89. package/docs/examples/fs.md +83 -0
  90. package/docs/examples/git.md +85 -0
  91. package/docs/examples/google-auth.md +88 -0
  92. package/docs/examples/google-calendar.md +94 -0
  93. package/docs/examples/google-docs.md +82 -0
  94. package/docs/examples/google-drive.md +96 -0
  95. package/docs/examples/google-sheets.md +95 -0
  96. package/docs/examples/grep.md +85 -0
  97. package/docs/examples/ink-blocks.md +75 -0
  98. package/docs/examples/ink-renderer.md +41 -0
  99. package/docs/examples/ink.md +103 -0
  100. package/docs/examples/ipc-socket.md +103 -0
  101. package/docs/examples/json-tree.md +91 -0
  102. package/docs/examples/launcher-app-command-listener.md +120 -0
  103. package/docs/examples/networking.md +58 -0
  104. package/docs/examples/nlp.md +91 -0
  105. package/docs/examples/opener.md +78 -0
  106. package/docs/examples/os.md +72 -0
  107. package/docs/examples/package-finder.md +89 -0
  108. package/docs/examples/port-exposer.md +89 -0
  109. package/docs/examples/postgres.md +91 -0
  110. package/docs/examples/proc.md +81 -0
  111. package/docs/examples/process-manager.md +79 -0
  112. package/docs/examples/python.md +91 -0
  113. package/docs/examples/repl.md +93 -0
  114. package/docs/examples/runpod.md +119 -0
  115. package/docs/examples/secure-shell.md +92 -0
  116. package/docs/examples/sqlite.md +86 -0
  117. package/docs/examples/telegram.md +77 -0
  118. package/docs/examples/tts.md +86 -0
  119. package/docs/examples/ui.md +80 -0
  120. package/docs/examples/vault.md +70 -0
  121. package/docs/examples/vm.md +86 -0
  122. package/docs/examples/window-manager.md +125 -0
  123. package/docs/examples/yaml-tree.md +93 -0
  124. package/docs/examples/yaml.md +104 -0
  125. package/docs/ideas/class-registration-refactor-possibilities.md +197 -0
  126. package/docs/ideas/container-use-api.md +9 -0
  127. package/docs/ideas/easy-auth-for-express-servers-and-luca-serve.md +0 -0
  128. package/docs/ideas/feature-stacks.md +22 -0
  129. package/docs/ideas/luca-cli-self-sufficiency-demo.md +23 -0
  130. package/docs/ideas/mcp-design.md +9 -0
  131. package/docs/ideas/web-container-debugging-feature.md +13 -0
  132. package/docs/introspection-audit.md +49 -0
  133. package/docs/introspection.md +154 -0
  134. package/docs/mcp/readme.md +162 -0
  135. package/docs/models.ts +38 -0
  136. package/docs/philosophy.md +85 -0
  137. package/docs/principles.md +7 -0
  138. package/docs/prompts/audit-codebase-for-failures-to-use-the-container.md +34 -0
  139. package/docs/prompts/mcp-test-easy-command.md +27 -0
  140. package/docs/reports/assistant-bugs.md +38 -0
  141. package/docs/reports/attach-pattern-usage.md +18 -0
  142. package/docs/reports/code-audit-results.md +391 -0
  143. package/docs/reports/introspection-audit-tasks.md +378 -0
  144. package/docs/reports/luca-mcp-improvements.md +128 -0
  145. package/docs/scaffolds/client.md +140 -0
  146. package/docs/scaffolds/command.md +106 -0
  147. package/docs/scaffolds/endpoint.md +176 -0
  148. package/docs/scaffolds/feature.md +148 -0
  149. package/docs/scaffolds/server.md +187 -0
  150. package/docs/tasks/web-container-helper-discovery.md +71 -0
  151. package/docs/todos.md +1 -0
  152. package/docs/tutorials/01-getting-started.md +106 -0
  153. package/docs/tutorials/02-container.md +210 -0
  154. package/docs/tutorials/03-scripts.md +194 -0
  155. package/docs/tutorials/04-features-overview.md +196 -0
  156. package/docs/tutorials/05-state-and-events.md +171 -0
  157. package/docs/tutorials/06-servers.md +157 -0
  158. package/docs/tutorials/07-endpoints.md +198 -0
  159. package/docs/tutorials/08-commands.md +171 -0
  160. package/docs/tutorials/09-clients.md +162 -0
  161. package/docs/tutorials/10-creating-features.md +198 -0
  162. package/docs/tutorials/11-contentbase.md +191 -0
  163. package/docs/tutorials/12-assistants.md +215 -0
  164. package/docs/tutorials/13-introspection.md +147 -0
  165. package/docs/tutorials/14-type-system.md +174 -0
  166. package/docs/tutorials/15-project-patterns.md +222 -0
  167. package/docs/tutorials/16-google-features.md +534 -0
  168. package/docs/tutorials/17-tui-blocks.md +530 -0
  169. package/docs/tutorials/18-semantic-search.md +334 -0
  170. package/index.ts +1 -0
  171. package/luca.console.ts +9 -0
  172. package/main.py +6 -0
  173. package/package.json +154 -0
  174. package/pyproject.toml +7 -0
  175. package/scripts/animations/chrome-glitch.ts +55 -0
  176. package/scripts/animations/index.ts +16 -0
  177. package/scripts/animations/neon-pulse.ts +64 -0
  178. package/scripts/animations/types.ts +6 -0
  179. package/scripts/build-web.ts +28 -0
  180. package/scripts/examples/ask-luca-expert.ts +42 -0
  181. package/scripts/examples/assistant-questions.ts +12 -0
  182. package/scripts/examples/excalidraw-expert.ts +75 -0
  183. package/scripts/examples/expert-chat.ts +0 -0
  184. package/scripts/examples/file-manager.ts +14 -0
  185. package/scripts/examples/ideas.ts +12 -0
  186. package/scripts/examples/interactive-chat.ts +20 -0
  187. package/scripts/examples/openai-tool-calls.ts +113 -0
  188. package/scripts/examples/opening-a-web-browser.ts +5 -0
  189. package/scripts/examples/telegram-bot.ts +79 -0
  190. package/scripts/examples/telegram-ink-ui.ts +302 -0
  191. package/scripts/examples/using-assistant-with-mcp.ts +560 -0
  192. package/scripts/examples/using-claude-code.ts +10 -0
  193. package/scripts/examples/using-contentdb.ts +35 -0
  194. package/scripts/examples/using-conversations.ts +35 -0
  195. package/scripts/examples/using-disk-cache.ts +10 -0
  196. package/scripts/examples/using-docker-shell.ts +75 -0
  197. package/scripts/examples/using-elevenlabs.ts +25 -0
  198. package/scripts/examples/using-google-calendar.ts +57 -0
  199. package/scripts/examples/using-google-docs.ts +74 -0
  200. package/scripts/examples/using-google-drive.ts +74 -0
  201. package/scripts/examples/using-google-sheets.ts +89 -0
  202. package/scripts/examples/using-nlp.ts +55 -0
  203. package/scripts/examples/using-ollama.ts +10 -0
  204. package/scripts/examples/using-openai-codex.ts +23 -0
  205. package/scripts/examples/using-postgres.ts +55 -0
  206. package/scripts/examples/using-runpod.ts +32 -0
  207. package/scripts/examples/using-tts.ts +40 -0
  208. package/scripts/examples/vm-loading-esm-modules.ts +16 -0
  209. package/scripts/scaffold.ts +391 -0
  210. package/scripts/scratch.ts +15 -0
  211. package/scripts/test-command-listener.ts +123 -0
  212. package/scripts/test-window-manager-lifecycle.ts +86 -0
  213. package/scripts/test-window-manager.ts +43 -0
  214. package/scripts/update-introspection-data.ts +58 -0
  215. package/src/agi/README.md +14 -0
  216. package/src/agi/container.server.ts +114 -0
  217. package/src/agi/endpoints/ask.ts +60 -0
  218. package/src/agi/endpoints/conversations/[id].ts +45 -0
  219. package/src/agi/endpoints/conversations.ts +31 -0
  220. package/src/agi/endpoints/experts.ts +37 -0
  221. package/src/agi/features/assistant.ts +767 -0
  222. package/src/agi/features/assistants-manager.ts +260 -0
  223. package/src/agi/features/claude-code.ts +1111 -0
  224. package/src/agi/features/conversation-history.ts +497 -0
  225. package/src/agi/features/conversation.ts +799 -0
  226. package/src/agi/features/openai-codex.ts +631 -0
  227. package/src/agi/features/openapi.ts +438 -0
  228. package/src/agi/features/skills-library.ts +425 -0
  229. package/src/agi/index.ts +6 -0
  230. package/src/agi/lib/token-counter.ts +122 -0
  231. package/src/browser.ts +25 -0
  232. package/src/bus.ts +100 -0
  233. package/src/cli/cli.ts +70 -0
  234. package/src/client.ts +461 -0
  235. package/src/clients/civitai/index.ts +541 -0
  236. package/src/clients/client-template.ts +41 -0
  237. package/src/clients/comfyui/index.ts +597 -0
  238. package/src/clients/elevenlabs/index.ts +291 -0
  239. package/src/clients/openai/index.ts +451 -0
  240. package/src/clients/supabase/index.ts +366 -0
  241. package/src/command.ts +164 -0
  242. package/src/commands/chat.ts +182 -0
  243. package/src/commands/console.ts +192 -0
  244. package/src/commands/describe.ts +433 -0
  245. package/src/commands/eval.ts +116 -0
  246. package/src/commands/help.ts +214 -0
  247. package/src/commands/index.ts +14 -0
  248. package/src/commands/mcp.ts +64 -0
  249. package/src/commands/prompt.ts +807 -0
  250. package/src/commands/run.ts +257 -0
  251. package/src/commands/sandbox-mcp.ts +439 -0
  252. package/src/commands/scaffold.ts +79 -0
  253. package/src/commands/serve.ts +172 -0
  254. package/src/container.ts +781 -0
  255. package/src/endpoint.ts +340 -0
  256. package/src/feature.ts +75 -0
  257. package/src/hash-object.ts +97 -0
  258. package/src/helper.ts +543 -0
  259. package/src/introspection/generated.agi.ts +23388 -0
  260. package/src/introspection/generated.node.ts +18899 -0
  261. package/src/introspection/generated.web.ts +2021 -0
  262. package/src/introspection/index.ts +256 -0
  263. package/src/introspection/scan.ts +912 -0
  264. package/src/node/container.ts +354 -0
  265. package/src/node/feature.ts +13 -0
  266. package/src/node/features/container-link.ts +558 -0
  267. package/src/node/features/content-db.ts +475 -0
  268. package/src/node/features/disk-cache.ts +382 -0
  269. package/src/node/features/dns.ts +655 -0
  270. package/src/node/features/docker.ts +912 -0
  271. package/src/node/features/downloader.ts +92 -0
  272. package/src/node/features/esbuild.ts +68 -0
  273. package/src/node/features/file-manager.ts +357 -0
  274. package/src/node/features/fs.ts +534 -0
  275. package/src/node/features/git.ts +492 -0
  276. package/src/node/features/google-auth.ts +502 -0
  277. package/src/node/features/google-calendar.ts +300 -0
  278. package/src/node/features/google-docs.ts +404 -0
  279. package/src/node/features/google-drive.ts +339 -0
  280. package/src/node/features/google-sheets.ts +279 -0
  281. package/src/node/features/grep.ts +406 -0
  282. package/src/node/features/helpers.ts +374 -0
  283. package/src/node/features/ink.ts +490 -0
  284. package/src/node/features/ipc-socket.ts +459 -0
  285. package/src/node/features/json-tree.ts +188 -0
  286. package/src/node/features/launcher-app-command-listener.ts +388 -0
  287. package/src/node/features/networking.ts +925 -0
  288. package/src/node/features/nlp.ts +211 -0
  289. package/src/node/features/opener.ts +166 -0
  290. package/src/node/features/os.ts +157 -0
  291. package/src/node/features/package-finder.ts +539 -0
  292. package/src/node/features/port-exposer.ts +342 -0
  293. package/src/node/features/postgres.ts +273 -0
  294. package/src/node/features/proc.ts +502 -0
  295. package/src/node/features/process-manager.ts +542 -0
  296. package/src/node/features/python.ts +444 -0
  297. package/src/node/features/repl.ts +194 -0
  298. package/src/node/features/runpod.ts +802 -0
  299. package/src/node/features/secure-shell.ts +248 -0
  300. package/src/node/features/semantic-search.ts +924 -0
  301. package/src/node/features/sqlite.ts +289 -0
  302. package/src/node/features/telegram.ts +342 -0
  303. package/src/node/features/tts.ts +184 -0
  304. package/src/node/features/ui.ts +857 -0
  305. package/src/node/features/vault.ts +164 -0
  306. package/src/node/features/vm.ts +312 -0
  307. package/src/node/features/window-manager.ts +804 -0
  308. package/src/node/features/yaml-tree.ts +149 -0
  309. package/src/node/features/yaml.ts +132 -0
  310. package/src/node.ts +70 -0
  311. package/src/react/index.ts +175 -0
  312. package/src/registry.ts +199 -0
  313. package/src/scaffolds/generated.ts +1613 -0
  314. package/src/scaffolds/template.ts +37 -0
  315. package/src/schemas/base.ts +255 -0
  316. package/src/server.ts +135 -0
  317. package/src/servers/express.ts +209 -0
  318. package/src/servers/mcp.ts +805 -0
  319. package/src/servers/socket.ts +120 -0
  320. package/src/state.ts +101 -0
  321. package/src/web/clients/socket.ts +82 -0
  322. package/src/web/container.ts +74 -0
  323. package/src/web/extension.ts +30 -0
  324. package/src/web/feature.ts +12 -0
  325. package/src/web/features/asset-loader.ts +64 -0
  326. package/src/web/features/container-link.ts +385 -0
  327. package/src/web/features/esbuild.ts +79 -0
  328. package/src/web/features/helpers.ts +267 -0
  329. package/src/web/features/network.ts +61 -0
  330. package/src/web/features/speech.ts +87 -0
  331. package/src/web/features/vault.ts +189 -0
  332. package/src/web/features/vm.ts +78 -0
  333. package/src/web/features/voice-recognition.ts +129 -0
  334. package/src/web/shims/isomorphic-vm.ts +149 -0
  335. package/test/bus.test.ts +134 -0
  336. package/test/clients-servers.test.ts +216 -0
  337. package/test/container-link.test.ts +274 -0
  338. package/test/features.test.ts +160 -0
  339. package/test/integration.test.ts +787 -0
  340. package/test/node-container.test.ts +121 -0
  341. package/test/rate-limit.test.ts +272 -0
  342. package/test/semantic-search.test.ts +550 -0
  343. package/test/state.test.ts +121 -0
  344. package/test-integration/assistant.test.ts +138 -0
  345. package/test-integration/assistants-manager.test.ts +123 -0
  346. package/test-integration/claude-code.test.ts +98 -0
  347. package/test-integration/conversation-history.test.ts +205 -0
  348. package/test-integration/conversation.test.ts +137 -0
  349. package/test-integration/elevenlabs.test.ts +55 -0
  350. package/test-integration/google-services.test.ts +80 -0
  351. package/test-integration/helpers.ts +89 -0
  352. package/test-integration/openai-codex.test.ts +93 -0
  353. package/test-integration/runpod.test.ts +58 -0
  354. package/test-integration/server-endpoints.test.ts +97 -0
  355. package/test-integration/skills-library.test.ts +157 -0
  356. package/test-integration/telegram.test.ts +46 -0
  357. package/tsconfig.json +58 -0
  358. package/uv.lock +8 -0
@@ -0,0 +1,134 @@
1
+ # Documentation Audit
2
+
3
+ Periodically do an audit of all Feature, Server, Client subclasses to make sure they are completely documented.
4
+
5
+
6
+ ## Files
7
+
8
+ - `src/node/features/*.ts` NodeContainer features
9
+ - `src/clients/*/index.ts` Client subclasses
10
+ - `src/agi/features.ts` AGIContainer features
11
+
12
+ ## Generating Introspection Data for Runtime consumption
13
+
14
+ After any changes to the above files, make sure to run:
15
+
16
+ ```shell
17
+ bun run build:introspection
18
+ ```
19
+
20
+ ## Documentation Guidelines
21
+
22
+ Here is a good example of a well documented feature, notice that:
23
+
24
+ - All of the Options, State, Event schema items have `describe()` calls
25
+ - There is a docblock above the class which uses a simple example with no imports, using the factory pattern
26
+ - getters are documented
27
+ - methods have jsdoc also with an example
28
+ - method options have jsdoc comments for typescript consumers
29
+
30
+ ```ts
31
+
32
+ export const TTSOptionsSchema = FeatureOptionsSchema.extend({
33
+ apiKey: z.string().optional().describe('RunPod API key (falls back to RUNPOD_API_KEY env var)'),
34
+ voice: z.string().optional().describe('Default preset voice name'),
35
+ outputDir: z.string().optional().describe('Directory to save generated audio files'),
36
+ format: z.enum(['wav', 'flac', 'ogg']).default('wav').describe('Audio output format'),
37
+ })
38
+ export type TTSOptions = z.infer<typeof TTSOptionsSchema>
39
+
40
+ export const TTSStateSchema = FeatureStateSchema.extend({
41
+ lastFile: z.string().optional().describe('Path to the last generated audio file'),
42
+ lastText: z.string().optional().describe('Text of the last synthesis request'),
43
+ generating: z.boolean().default(false).describe('Whether audio is currently being generated'),
44
+ })
45
+ export type TTSState = z.infer<typeof TTSStateSchema>
46
+
47
+ export const TTSEventsSchema = FeatureEventsSchema.extend({
48
+ synthesized: z.tuple([
49
+ z.string().describe('The text that was synthesized'),
50
+ z.string().describe('Path to the generated audio file'),
51
+ z.string().describe('Voice used'),
52
+ z.number().describe('Duration of the API call in milliseconds'),
53
+ ]).describe('Emitted when audio synthesis completes'),
54
+ error: z.tuple([
55
+ z.any().describe('The error'),
56
+ ]).describe('Emitted when synthesis fails'),
57
+ })
58
+
59
+ /**
60
+ * TTS feature — synthesizes text to audio files via RunPod's Chatterbox Turbo endpoint.
61
+ *
62
+ * Generates high-quality speech audio by calling the Chatterbox Turbo public endpoint
63
+ * on RunPod, downloads the resulting audio, and saves it locally. Supports 20 preset
64
+ * voices and voice cloning via a reference audio URL.
65
+ *
66
+ * @example
67
+ * ```typescript
68
+ * const tts = container.feature('tts', { enable: true })
69
+ * const path = await tts.synthesize('Hello, how are you?', { voice: 'lucy' })
70
+ * console.log(`Audio saved to: ${path}`)
71
+ * ```
72
+ */
73
+ export class TTS extends Feature<TTSState, TTSOptions> {
74
+ static override shortcut = 'features.tts' as const
75
+ static override envVars = ['RUNPOD_API_KEY']
76
+ static override stateSchema = TTSStateSchema
77
+ static override optionsSchema = TTSOptionsSchema
78
+ static override eventsSchema = TTSEventsSchema
79
+
80
+ /** RunPod API key from options or environment. */
81
+ get apiKey(): string {
82
+ return this.options.apiKey || process.env.RUNPOD_API_KEY || ''
83
+ }
84
+
85
+ /** Directory where generated audio files are saved. */
86
+ get outputDir(): string {
87
+ return this.options.outputDir || join(homedir(), '.luca', 'tts-cache')
88
+ }
89
+
90
+ /** The 20 preset voice names available in Chatterbox Turbo. */
91
+ get voices(): readonly string[] {
92
+ return PRESET_VOICES
93
+ }
94
+
95
+ /**
96
+ * Synthesize text to an audio file using Chatterbox Turbo.
97
+ *
98
+ * Calls the RunPod public endpoint, downloads the generated audio,
99
+ * and saves it to the output directory.
100
+ *
101
+ * @param text - The text to synthesize into speech
102
+ * @param options - Override voice, format, or provide a voiceUrl for cloning
103
+ * @returns Absolute path to the generated audio file
104
+ *
105
+ * @example
106
+ * ```typescript
107
+ * // Use a preset voice
108
+ * const path = await tts.synthesize('Good morning!', { voice: 'ethan' })
109
+ *
110
+ * // Clone a voice from a reference audio URL
111
+ * const path = await tts.synthesize('Hello world', {
112
+ * voiceUrl: 'https://example.com/reference.wav'
113
+ * })
114
+ * ```
115
+ */
116
+ async synthesize(text: string, options?: {
117
+ /* which voice to use */
118
+ voice?: string
119
+ /* which format to save the output in */
120
+ format?: 'wav' | 'flac' | 'ogg'
121
+ /* an optional url to use for voice cloning */
122
+ voiceUrl?: string
123
+ }): Promise<string> {
124
+ if (!this.apiKey) {
125
+ throw new Error('TTS requires a RunPod API key. Set RUNPOD_API_KEY or pass apiKey in options.')
126
+ }
127
+ // omitted
128
+ }
129
+
130
+ }
131
+
132
+ ```
133
+
134
+
@@ -0,0 +1,77 @@
1
+ ---
2
+ title: "Content Database"
3
+ tags: [contentDb, markdown, content, database]
4
+ lastTested: null
5
+ lastTestPassed: null
6
+ ---
7
+
8
+ # contentDb
9
+
10
+ Treat folders of structured markdown files as queryable databases. Each markdown file is a document with frontmatter metadata and content.
11
+
12
+ ## Overview
13
+
14
+ The `contentDb` feature is on-demand. Enable it with a `rootPath` pointing to a directory that contains a `models.ts` file and subfolders of markdown documents. It is perfect for documentation sites, knowledge bases, or any content-driven application where markdown is the source of truth.
15
+
16
+ ## Loading a Collection
17
+
18
+ We point the feature at the project's docs directory, which already has models and content.
19
+
20
+ ```ts
21
+ const contentDb = container.feature('contentDb', { rootPath: '.' })
22
+ await contentDb.load()
23
+ console.log('Loaded:', contentDb.isLoaded)
24
+ ```
25
+
26
+ The `load()` call discovers the models defined in `models.ts` and parses every markdown file in the matching prefix directories.
27
+
28
+ ## Discovering Models
29
+
30
+ Each collection has named models. Let us see what is available.
31
+
32
+ ```ts
33
+ const names = contentDb.modelNames
34
+ console.log('Available models:', names)
35
+ ```
36
+
37
+ Models correspond to subdirectories. Each model defines a schema for the frontmatter metadata its documents must conform to.
38
+
39
+ ## Querying Documents
40
+
41
+ Use `query()` to fetch documents belonging to a model. Here we query the Tutorial model.
42
+
43
+ ```ts
44
+ const tutorials = await contentDb.query(contentDb.models.Tutorial).fetchAll()
45
+ console.log('Tutorial count:', tutorials.length)
46
+ tutorials.slice(0, 3).forEach(doc => {
47
+ console.log('-', doc.id, '|', doc.meta?.title)
48
+ })
49
+ ```
50
+
51
+ Documents come back with their parsed frontmatter, content, and a unique id derived from the file path.
52
+
53
+ ## Parsing a Single File
54
+
55
+ You can also parse any markdown file directly without going through the query system.
56
+
57
+ ```ts
58
+ const doc = contentDb.parseMarkdownAtPath('./docs/tutorials/01-getting-started.md')
59
+ console.log('Title:', doc.meta?.title)
60
+ console.log('Tags:', doc.meta?.tags)
61
+ ```
62
+
63
+ This is useful when you know exactly which file you want and do not need to iterate over a collection.
64
+
65
+ ## Collection Summary
66
+
67
+ The feature tracks a model summary in its state, giving you a quick overview of the entire collection.
68
+
69
+ ```ts
70
+ console.log(contentDb.state.get('modelSummary'))
71
+ ```
72
+
73
+ This summary shows each model and how many documents belong to it.
74
+
75
+ ## Summary
76
+
77
+ This demo covered loading a contentbase collection, listing models, querying documents by model, parsing individual markdown files, and inspecting the collection summary. The `contentDb` feature turns your markdown files into a lightweight, schema-validated content database.
@@ -0,0 +1,83 @@
1
+ ---
2
+ title: "Disk Cache"
3
+ tags: [diskCache, storage, caching]
4
+ lastTested: null
5
+ lastTestPassed: null
6
+ ---
7
+
8
+ # diskCache
9
+
10
+ A file-backed key-value cache powered by cacache (the same store behind npm). Persist arbitrary data to disk with a simple get/set interface.
11
+
12
+ ## Overview
13
+
14
+ The `diskCache` feature is on-demand. Enable it with a `path` option pointing to a cache directory. It is ideal for persisting computed results, downloaded assets, or any data you want to survive across process restarts without setting up a full database.
15
+
16
+ ## Creating a Cache
17
+
18
+ We start by enabling the feature and pointing it at a temporary directory.
19
+
20
+ ```ts
21
+ const cache = container.feature('diskCache', { path: '/tmp/luca-example-cache' })
22
+ console.log('diskCache enabled:', cache.state.get('enabled'))
23
+ ```
24
+
25
+ The cache directory is created automatically when the first entry is written.
26
+
27
+ ## Storing and Retrieving Values
28
+
29
+ Use `set()` to write a key and `get()` to read it back.
30
+
31
+ ```ts
32
+ await cache.set('greeting', 'Hello from Luca!')
33
+ const value = await cache.get('greeting')
34
+ console.log('Retrieved:', value)
35
+ ```
36
+
37
+ The value comes back exactly as stored.
38
+
39
+ ## Checking for Keys
40
+
41
+ Use `has()` to check whether a key exists without reading it.
42
+
43
+ ```ts
44
+ const exists = await cache.has('greeting')
45
+ console.log('Has greeting?', exists)
46
+ const missing = await cache.has('nonexistent')
47
+ console.log('Has nonexistent?', missing)
48
+ ```
49
+
50
+ This is useful for conditional caching patterns where you want to skip expensive work if a result is already stored.
51
+
52
+ ## Listing All Keys
53
+
54
+ Use `keys()` to enumerate everything in the cache.
55
+
56
+ ```ts
57
+ await cache.set('user:1', JSON.stringify({ name: 'Alice' }))
58
+ await cache.set('user:2', JSON.stringify({ name: 'Bob' }))
59
+ const allKeys = await cache.keys()
60
+ console.log('All keys:', allKeys)
61
+ ```
62
+
63
+ Keys are plain strings, so you can use naming conventions like prefixes to organize entries.
64
+
65
+ ## Removing Entries
66
+
67
+ Use `rm()` to delete a single key, or `clearAll(true)` to wipe the entire cache.
68
+
69
+ ```ts
70
+ await cache.rm('user:2')
71
+ const afterRemove = await cache.keys()
72
+ console.log('After removing user:2:', afterRemove)
73
+
74
+ await cache.clearAll(true)
75
+ const afterClear = await cache.keys()
76
+ console.log('After clearAll:', afterClear)
77
+ ```
78
+
79
+ Note that `clearAll` requires passing `true` as a confirmation safeguard.
80
+
81
+ ## Summary
82
+
83
+ This demo covered creating a disk cache, storing and retrieving values, checking key existence, listing keys, and removing entries. The `diskCache` feature provides a lightweight persistence layer without any external dependencies.
@@ -0,0 +1,101 @@
1
+ ---
2
+ title: "Docker"
3
+ tags: [docker, containers, images, devops]
4
+ lastTested: null
5
+ lastTestPassed: null
6
+ ---
7
+
8
+ # docker
9
+
10
+ Docker CLI interface for managing containers, images, and executing commands inside running containers. Provides comprehensive Docker operations including build, run, exec, logs, and system pruning.
11
+
12
+ ## Overview
13
+
14
+ The `docker` feature wraps the Docker CLI to give you programmatic control over containers and images. It requires Docker to be installed and the Docker daemon to be running on the host machine. All methods return structured data rather than raw CLI output.
15
+
16
+ ## Enabling the Feature
17
+
18
+ ```ts
19
+ const docker = container.feature('docker', { enable: true })
20
+ console.log('Docker feature enabled:', docker.state.get('enabled'))
21
+ ```
22
+
23
+ ## Exploring the API
24
+
25
+ ```ts
26
+ const docs = container.features.describe('docker')
27
+ console.log(docs)
28
+ ```
29
+
30
+ ## Checking Availability
31
+
32
+ ```ts
33
+ const docker = container.feature('docker')
34
+ const available = await docker.checkDockerAvailability()
35
+ console.log('Docker available:', available)
36
+ console.log('State:', docker.state.get('isDockerAvailable'))
37
+ ```
38
+
39
+ ## Building an Image
40
+
41
+ Build a Docker image from a Dockerfile in a project directory.
42
+
43
+ ```ts skip
44
+ await docker.buildImage('./my-project', {
45
+ tag: 'my-app:latest',
46
+ buildArgs: { NODE_ENV: 'production' },
47
+ nocache: true
48
+ })
49
+ console.log('Image built successfully')
50
+ ```
51
+
52
+ If the build succeeds, the image appears in `docker.listImages()`. The `buildArgs` option passes `--build-arg` flags to the Docker build command.
53
+
54
+ ## Running a Container
55
+
56
+ Create and start a container from an image with port mappings, volumes, and environment variables.
57
+
58
+ ```ts skip
59
+ const containerId = await docker.runContainer('nginx:latest', {
60
+ name: 'web-server',
61
+ ports: ['8080:80'],
62
+ detach: true,
63
+ environment: { NGINX_HOST: 'localhost' }
64
+ })
65
+ console.log('Container started:', containerId)
66
+ ```
67
+
68
+ The `detach: true` option runs the container in the background and returns its ID. Without it, the call blocks until the container exits.
69
+
70
+ ## Executing Commands in a Container
71
+
72
+ Run commands inside a running container and capture the output.
73
+
74
+ ```ts skip
75
+ const result = await docker.execCommand('web-server', ['ls', '-la', '/usr/share/nginx/html'])
76
+ console.log('stdout:', result.stdout)
77
+ console.log('exit code:', result.exitCode)
78
+ ```
79
+
80
+ The command array avoids shell interpretation issues. The returned object includes `stdout`, `stderr`, and `exitCode`.
81
+
82
+ ## Creating a Shell
83
+
84
+ The `createShell` method returns a shell-like wrapper for running multiple commands against the same container.
85
+
86
+ ```ts skip
87
+ const shell = await docker.createShell('web-server', {
88
+ workdir: '/app'
89
+ })
90
+ await shell.run('ls -la')
91
+ console.log(shell.last.stdout)
92
+ await shell.run('cat package.json')
93
+ console.log(shell.last.stdout)
94
+ await shell.destroy()
95
+ ```
96
+
97
+ Call `destroy()` when finished to clean up any helper containers created for volume-mounted shells.
98
+
99
+ ## Summary
100
+
101
+ The `docker` feature provides a complete programmatic interface to Docker: build images, run and manage containers, execute commands inside them, retrieve logs, and prune unused resources. All operations require the Docker daemon to be running on the host.
@@ -0,0 +1,70 @@
1
+ ---
2
+ title: "Downloader"
3
+ tags: [downloader, network, files, http]
4
+ lastTested: null
5
+ lastTestPassed: null
6
+ ---
7
+
8
+ # downloader
9
+
10
+ Download files from remote URLs and save them to the local filesystem.
11
+
12
+ ## Overview
13
+
14
+ The `downloader` feature is an on-demand feature that fetches files from HTTP/HTTPS URLs and writes them to disk. It handles the network request, buffering, and file writing automatically. Use it when you need to programmatically pull remote assets -- images, documents, data files -- into your project.
15
+
16
+ ## Feature Documentation
17
+
18
+ Let us inspect the feature's built-in documentation to understand its API.
19
+
20
+ ```ts
21
+ const desc = container.features.describe('downloader')
22
+ console.log(desc)
23
+ ```
24
+
25
+ The feature exposes a single `download(url, targetPath)` method that fetches a URL and writes the response body to the specified path.
26
+
27
+ ## Enabling the Feature
28
+
29
+ Enable the downloader and inspect its initial state.
30
+
31
+ ```ts
32
+ const downloader = container.feature('downloader', { enable: true })
33
+ console.log('Downloader enabled:', downloader.state.enabled)
34
+ ```
35
+
36
+ Once enabled, the feature is ready to accept download requests.
37
+
38
+ ## Inspecting the API
39
+
40
+ The downloader has a straightforward interface: one method for downloading.
41
+
42
+ ```ts
43
+ const methods = Object.getOwnPropertyNames(Object.getPrototypeOf(downloader))
44
+ .filter(m => !m.startsWith('_') && m !== 'constructor')
45
+ console.log('Available methods:', methods.join(', '))
46
+ ```
47
+
48
+ The `download` method takes two arguments: a URL string and a target file path. The target path is resolved relative to the container's working directory.
49
+
50
+ ## How Downloading Works
51
+
52
+ Here is what happens when you call `download()`:
53
+
54
+ 1. The feature makes an HTTP fetch to the provided URL
55
+ 2. The response is buffered into memory
56
+ 3. The buffer is written to the filesystem at the target path
57
+ 4. The path is resolved using the container's path resolution
58
+
59
+ ```ts
60
+ // Example usage (not executed to avoid network calls):
61
+ // await downloader.download(
62
+ // 'https://example.com/data.json',
63
+ // 'downloads/data.json'
64
+ // )
65
+ console.log('Downloader is ready. Call downloader.download(url, path) to fetch files.')
66
+ ```
67
+
68
+ ## Summary
69
+
70
+ This demo covered the `downloader` feature, which provides a simple one-method API for fetching remote files and saving them locally. It handles HTTP requests, buffering, and file writing, making it the right choice for any task that involves pulling assets from the network.
@@ -0,0 +1,80 @@
1
+ ---
2
+ title: "esbuild"
3
+ tags: [esbuild, transpilation, bundling, typescript]
4
+ lastTested: null
5
+ lastTestPassed: null
6
+ ---
7
+
8
+ # esbuild
9
+
10
+ Transpile TypeScript, TSX, and JSX to JavaScript at runtime using Bun's built-in transpiler. Compile code strings on the fly without touching the filesystem.
11
+
12
+ ## Overview
13
+
14
+ The `esbuild` feature is a core feature, meaning it is auto-enabled on every container. You can access it directly as a global or via `container.feature('esbuild')`. It wraps Bun's transpiler and exposes both synchronous and asynchronous `transform` methods. Use it for runtime code generation, plugin systems, or any scenario where you need to compile TypeScript strings to runnable JavaScript.
15
+
16
+ ## Synchronous Transform
17
+
18
+ Use `transformSync()` to transpile a TypeScript string to JavaScript in a single blocking call.
19
+
20
+ ```ts
21
+ const result = esbuild.transformSync('const x: number = 42; console.log(x);')
22
+ console.log('Input: const x: number = 42; console.log(x);')
23
+ console.log('Output:', result.code.trim())
24
+ ```
25
+
26
+ The type annotations are stripped and the output is plain JavaScript.
27
+
28
+ ## Async Transform
29
+
30
+ The async `transform()` method does the same thing but returns a promise. Prefer this in hot paths where you do not want to block.
31
+
32
+ ```ts
33
+ const tsxCode = `
34
+ interface Props { name: string }
35
+ const Greet = (props: Props) => <h1>Hello {props.name}</h1>
36
+ `
37
+ const out = await esbuild.transform(tsxCode, { loader: 'tsx' })
38
+ console.log('TSX transpiled:')
39
+ console.log(out.code.trim())
40
+ ```
41
+
42
+ Notice the `loader: 'tsx'` option tells the transpiler to handle JSX syntax.
43
+
44
+ ## Minification
45
+
46
+ Pass `minify: true` to produce compact output with whitespace removed.
47
+
48
+ ```ts
49
+ const verbose = `
50
+ function greet(name: string): string {
51
+ const greeting = "Hello, " + name + "!";
52
+ return greeting;
53
+ }
54
+ `
55
+ const normal = esbuild.transformSync(verbose)
56
+ const minified = esbuild.transformSync(verbose, { minify: true })
57
+ console.log('Normal length:', normal.code.length)
58
+ console.log('Minified length:', minified.code.length)
59
+ console.log('Minified:', minified.code.trim())
60
+ ```
61
+
62
+ Minification is useful when generating code that will be sent to a browser or embedded in a response.
63
+
64
+ ## Different Loaders
65
+
66
+ The feature supports multiple source languages via the `loader` option.
67
+
68
+ ```ts
69
+ const jsxResult = esbuild.transformSync(
70
+ 'const App = () => <div className="app">Content</div>',
71
+ { loader: 'tsx' }
72
+ )
73
+ console.log('JSX output:', jsxResult.code.trim())
74
+ ```
75
+
76
+ Supported loaders include `ts` (default), `tsx`, `jsx`, and `js`.
77
+
78
+ ## Summary
79
+
80
+ This demo covered synchronous and asynchronous transpilation, minification, and using different source loaders. The `esbuild` feature gives you runtime TypeScript-to-JavaScript compilation with zero configuration.
@@ -0,0 +1,82 @@
1
+ ---
2
+ title: "File Manager"
3
+ tags: [fileManager, files, indexing, filesystem]
4
+ lastTested: null
5
+ lastTestPassed: null
6
+ ---
7
+
8
+ # fileManager
9
+
10
+ Builds an in-memory index of every file in your project with metadata and glob matching. Think of it as a fast, queryable snapshot of your file tree.
11
+
12
+ ## Overview
13
+
14
+ The `fileManager` feature is on-demand. After enabling it and calling `start()`, it scans the project directory and indexes every file. You can then match files by glob patterns, inspect metadata, and list unique extensions. It is useful for code analysis tools, documentation generators, or any script that needs to reason about project structure.
15
+
16
+ ## Starting the File Manager
17
+
18
+ Enable the feature and kick off the initial scan.
19
+
20
+ ```ts
21
+ const fm = container.feature('fileManager')
22
+ await fm.start()
23
+ console.log('Scan complete:', fm.isStarted)
24
+ console.log('Total files indexed:', fm.fileIds.length)
25
+ ```
26
+
27
+ The scan respects common ignore patterns (node_modules, .git, etc.) by default.
28
+
29
+ ## Matching Files by Glob
30
+
31
+ Use `match()` to find file paths matching a glob pattern.
32
+
33
+ ```ts
34
+ const tsFiles = fm.match('**/*.ts')
35
+ console.log('TypeScript files found:', tsFiles.length)
36
+ tsFiles.slice(0, 5).forEach(f => console.log(' ', f))
37
+ ```
38
+
39
+ This returns an array of relative file paths that match the pattern.
40
+
41
+ ## Inspecting File Metadata
42
+
43
+ Use `matchFiles()` to get full file objects instead of just paths. Each object contains metadata about the file.
44
+
45
+ ```ts
46
+ const pkgFiles = fm.matchFiles('package.json')
47
+ pkgFiles.forEach(f => {
48
+ console.log('File:', f.id)
49
+ console.log(' Extension:', f.extension)
50
+ console.log(' Directory:', f.directory)
51
+ })
52
+ ```
53
+
54
+ File objects include properties like `id` (relative path), `extension`, and `directory`.
55
+
56
+ ## Unique Extensions
57
+
58
+ The file manager tracks every file extension it encounters across the project.
59
+
60
+ ```ts
61
+ const extensions = fm.uniqueExtensions
62
+ console.log('Unique extensions:', extensions.length)
63
+ console.log('Extensions:', extensions.slice(0, 15).join(', '))
64
+ ```
65
+
66
+ This is handy for understanding the technology mix in a project at a glance.
67
+
68
+ ## Directory Listing
69
+
70
+ You can also get the unique set of directories that contain indexed files.
71
+
72
+ ```ts
73
+ const dirs = fm.directoryIds
74
+ console.log('Directories:', dirs.length)
75
+ dirs.slice(0, 8).forEach(d => console.log(' ', d))
76
+ ```
77
+
78
+ Combined with glob matching, this gives you a complete picture of the project layout.
79
+
80
+ ## Summary
81
+
82
+ This demo covered starting the file manager, glob matching, inspecting file metadata, listing unique extensions, and enumerating directories. The `fileManager` feature provides a fast, in-memory file index for project analysis and tooling.