luca 2.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 (532) hide show
  1. package/.github/workflows/release.yaml +170 -0
  2. package/AGENTS.md +99 -0
  3. package/CLAUDE.md +123 -0
  4. package/CNAME +1 -0
  5. package/README.md +275 -9
  6. package/RUNME.md +56 -0
  7. package/assistants/codingAssistant/ABOUT.md +5 -0
  8. package/assistants/codingAssistant/CORE.md +33 -0
  9. package/assistants/codingAssistant/hooks.ts +21 -0
  10. package/assistants/codingAssistant/tools.ts +12 -0
  11. package/assistants/inkbot/ABOUT.md +16 -0
  12. package/assistants/inkbot/CORE.md +330 -0
  13. package/assistants/inkbot/hooks.ts +6 -0
  14. package/assistants/inkbot/tools.ts +53 -0
  15. package/assistants/researcher/ABOUT.md +5 -0
  16. package/assistants/researcher/CORE.md +46 -0
  17. package/assistants/researcher/hooks.ts +16 -0
  18. package/assistants/researcher/tools.ts +237 -0
  19. package/bun.lock +2667 -0
  20. package/bunfig.toml +3 -0
  21. package/commands/audit-docs.ts +740 -0
  22. package/commands/build-bootstrap.ts +117 -0
  23. package/commands/build-python-bridge.ts +42 -0
  24. package/commands/build-scaffolds.ts +175 -0
  25. package/commands/bundle-consumer-project.ts +521 -0
  26. package/commands/generate-api-docs.ts +114 -0
  27. package/commands/inkbot.ts +874 -0
  28. package/commands/release.ts +80 -0
  29. package/commands/try-all-challenges.ts +543 -0
  30. package/commands/try-challenge.ts +100 -0
  31. package/dist/agi/container.server.d.ts +63 -0
  32. package/dist/agi/container.server.d.ts.map +1 -0
  33. package/dist/agi/endpoints/ask.d.ts +20 -0
  34. package/dist/agi/endpoints/ask.d.ts.map +1 -0
  35. package/dist/agi/endpoints/conversations/[id].d.ts +27 -0
  36. package/dist/agi/endpoints/conversations/[id].d.ts.map +1 -0
  37. package/dist/agi/endpoints/conversations.d.ts +18 -0
  38. package/dist/agi/endpoints/conversations.d.ts.map +1 -0
  39. package/dist/agi/endpoints/experts.d.ts +8 -0
  40. package/dist/agi/endpoints/experts.d.ts.map +1 -0
  41. package/dist/agi/feature.d.ts +9 -0
  42. package/dist/agi/feature.d.ts.map +1 -0
  43. package/dist/agi/features/assistant.d.ts +509 -0
  44. package/dist/agi/features/assistant.d.ts.map +1 -0
  45. package/dist/agi/features/assistants-manager.d.ts +236 -0
  46. package/dist/agi/features/assistants-manager.d.ts.map +1 -0
  47. package/dist/agi/features/autonomous-assistant.d.ts +281 -0
  48. package/dist/agi/features/autonomous-assistant.d.ts.map +1 -0
  49. package/dist/agi/features/browser-use.d.ts +479 -0
  50. package/dist/agi/features/browser-use.d.ts.map +1 -0
  51. package/dist/agi/features/claude-code.d.ts +824 -0
  52. package/dist/agi/features/claude-code.d.ts.map +1 -0
  53. package/dist/agi/features/conversation-history.d.ts +245 -0
  54. package/dist/agi/features/conversation-history.d.ts.map +1 -0
  55. package/dist/agi/features/conversation.d.ts +464 -0
  56. package/dist/agi/features/conversation.d.ts.map +1 -0
  57. package/dist/agi/features/docs-reader.d.ts +72 -0
  58. package/dist/agi/features/docs-reader.d.ts.map +1 -0
  59. package/dist/agi/features/file-tools.d.ts +110 -0
  60. package/dist/agi/features/file-tools.d.ts.map +1 -0
  61. package/dist/agi/features/luca-coder.d.ts +323 -0
  62. package/dist/agi/features/luca-coder.d.ts.map +1 -0
  63. package/dist/agi/features/openai-codex.d.ts +381 -0
  64. package/dist/agi/features/openai-codex.d.ts.map +1 -0
  65. package/dist/agi/features/openapi.d.ts +200 -0
  66. package/dist/agi/features/openapi.d.ts.map +1 -0
  67. package/dist/agi/features/skills-library.d.ts +167 -0
  68. package/dist/agi/features/skills-library.d.ts.map +1 -0
  69. package/dist/agi/index.d.ts +5 -0
  70. package/dist/agi/index.d.ts.map +1 -0
  71. package/dist/agi/lib/interceptor-chain.d.ts +44 -0
  72. package/dist/agi/lib/interceptor-chain.d.ts.map +1 -0
  73. package/dist/agi/lib/token-counter.d.ts +13 -0
  74. package/dist/agi/lib/token-counter.d.ts.map +1 -0
  75. package/dist/bootstrap/generated.d.ts +5 -0
  76. package/dist/bootstrap/generated.d.ts.map +1 -0
  77. package/dist/browser.d.ts +12 -0
  78. package/dist/browser.d.ts.map +1 -0
  79. package/dist/bus.d.ts +29 -0
  80. package/dist/bus.d.ts.map +1 -0
  81. package/dist/cli/build-info.d.ts +4 -0
  82. package/dist/cli/build-info.d.ts.map +1 -0
  83. package/dist/cli/cli.d.ts +3 -12
  84. package/dist/cli/cli.d.ts.map +1 -0
  85. package/dist/client.d.ts +60 -0
  86. package/dist/client.d.ts.map +1 -0
  87. package/dist/clients/civitai/index.d.ts +472 -0
  88. package/dist/clients/civitai/index.d.ts.map +1 -0
  89. package/dist/clients/client-template.d.ts +30 -0
  90. package/dist/clients/client-template.d.ts.map +1 -0
  91. package/dist/clients/comfyui/index.d.ts +281 -0
  92. package/dist/clients/comfyui/index.d.ts.map +1 -0
  93. package/dist/clients/elevenlabs/index.d.ts +197 -0
  94. package/dist/clients/elevenlabs/index.d.ts.map +1 -0
  95. package/dist/clients/graph.d.ts +64 -0
  96. package/dist/clients/graph.d.ts.map +1 -0
  97. package/dist/clients/openai/index.d.ts +247 -0
  98. package/dist/clients/openai/index.d.ts.map +1 -0
  99. package/dist/clients/rest.d.ts +92 -0
  100. package/dist/clients/rest.d.ts.map +1 -0
  101. package/dist/clients/supabase/index.d.ts +176 -0
  102. package/dist/clients/supabase/index.d.ts.map +1 -0
  103. package/dist/clients/websocket.d.ts +127 -0
  104. package/dist/clients/websocket.d.ts.map +1 -0
  105. package/dist/command.d.ts +163 -0
  106. package/dist/command.d.ts.map +1 -0
  107. package/dist/commands/bootstrap.d.ts +20 -0
  108. package/dist/commands/bootstrap.d.ts.map +1 -0
  109. package/dist/commands/chat.d.ts +37 -0
  110. package/dist/commands/chat.d.ts.map +1 -0
  111. package/dist/commands/code.d.ts +28 -0
  112. package/dist/commands/code.d.ts.map +1 -0
  113. package/dist/commands/console.d.ts +22 -0
  114. package/dist/commands/console.d.ts.map +1 -0
  115. package/dist/commands/describe.d.ts +50 -0
  116. package/dist/commands/describe.d.ts.map +1 -0
  117. package/dist/commands/eval.d.ts +23 -0
  118. package/dist/commands/eval.d.ts.map +1 -0
  119. package/dist/commands/help.d.ts +25 -0
  120. package/dist/commands/help.d.ts.map +1 -0
  121. package/dist/commands/index.d.ts +18 -0
  122. package/dist/commands/index.d.ts.map +1 -0
  123. package/dist/commands/introspect.d.ts +24 -0
  124. package/dist/commands/introspect.d.ts.map +1 -0
  125. package/dist/commands/mcp.d.ts +35 -0
  126. package/dist/commands/mcp.d.ts.map +1 -0
  127. package/dist/commands/prompt.d.ts +38 -0
  128. package/dist/commands/prompt.d.ts.map +1 -0
  129. package/dist/commands/run.d.ts +24 -0
  130. package/dist/commands/run.d.ts.map +1 -0
  131. package/dist/commands/sandbox-mcp.d.ts +34 -0
  132. package/dist/commands/sandbox-mcp.d.ts.map +1 -0
  133. package/dist/commands/save-api-docs.d.ts +21 -0
  134. package/dist/commands/save-api-docs.d.ts.map +1 -0
  135. package/dist/commands/scaffold.d.ts +24 -0
  136. package/dist/commands/scaffold.d.ts.map +1 -0
  137. package/dist/commands/select.d.ts +22 -0
  138. package/dist/commands/select.d.ts.map +1 -0
  139. package/dist/commands/serve.d.ts +29 -0
  140. package/dist/commands/serve.d.ts.map +1 -0
  141. package/dist/container-describer.d.ts +144 -0
  142. package/dist/container-describer.d.ts.map +1 -0
  143. package/dist/container.d.ts +451 -0
  144. package/dist/container.d.ts.map +1 -0
  145. package/dist/endpoint.d.ts +113 -0
  146. package/dist/endpoint.d.ts.map +1 -0
  147. package/dist/feature.d.ts +47 -0
  148. package/dist/feature.d.ts.map +1 -0
  149. package/dist/graft.d.ts +29 -0
  150. package/dist/graft.d.ts.map +1 -0
  151. package/dist/hash-object.d.ts +8 -0
  152. package/dist/hash-object.d.ts.map +1 -0
  153. package/dist/helper.d.ts +209 -0
  154. package/dist/helper.d.ts.map +1 -0
  155. package/dist/introspection/generated.node.d.ts +44623 -0
  156. package/dist/introspection/generated.node.d.ts.map +1 -0
  157. package/dist/introspection/generated.web.d.ts +1412 -0
  158. package/dist/introspection/generated.web.d.ts.map +1 -0
  159. package/dist/introspection/index.d.ts +156 -0
  160. package/dist/introspection/index.d.ts.map +1 -0
  161. package/dist/introspection/scan.d.ts +147 -0
  162. package/dist/introspection/scan.d.ts.map +1 -0
  163. package/dist/node/container.d.ts +256 -0
  164. package/dist/node/container.d.ts.map +1 -0
  165. package/dist/node/feature.d.ts +9 -0
  166. package/dist/node/feature.d.ts.map +1 -0
  167. package/dist/node/features/container-link.d.ts +213 -0
  168. package/dist/node/features/container-link.d.ts.map +1 -0
  169. package/dist/node/features/content-db.d.ts +354 -0
  170. package/dist/node/features/content-db.d.ts.map +1 -0
  171. package/dist/node/features/disk-cache.d.ts +236 -0
  172. package/dist/node/features/disk-cache.d.ts.map +1 -0
  173. package/dist/node/features/dns.d.ts +511 -0
  174. package/dist/node/features/dns.d.ts.map +1 -0
  175. package/dist/node/features/docker.d.ts +485 -0
  176. package/dist/node/features/docker.d.ts.map +1 -0
  177. package/dist/node/features/downloader.d.ts +73 -0
  178. package/dist/node/features/downloader.d.ts.map +1 -0
  179. package/dist/node/features/figlet-fonts.d.ts +4 -0
  180. package/dist/node/features/figlet-fonts.d.ts.map +1 -0
  181. package/dist/node/features/file-manager.d.ts +177 -0
  182. package/dist/node/features/file-manager.d.ts.map +1 -0
  183. package/dist/node/features/fs.d.ts +635 -0
  184. package/dist/node/features/fs.d.ts.map +1 -0
  185. package/dist/node/features/git.d.ts +329 -0
  186. package/dist/node/features/git.d.ts.map +1 -0
  187. package/dist/node/features/google-auth.d.ts +200 -0
  188. package/dist/node/features/google-auth.d.ts.map +1 -0
  189. package/dist/node/features/google-calendar.d.ts +194 -0
  190. package/dist/node/features/google-calendar.d.ts.map +1 -0
  191. package/dist/node/features/google-docs.d.ts +138 -0
  192. package/dist/node/features/google-docs.d.ts.map +1 -0
  193. package/dist/node/features/google-drive.d.ts +202 -0
  194. package/dist/node/features/google-drive.d.ts.map +1 -0
  195. package/dist/node/features/google-mail.d.ts +221 -0
  196. package/dist/node/features/google-mail.d.ts.map +1 -0
  197. package/dist/node/features/google-sheets.d.ts +157 -0
  198. package/dist/node/features/google-sheets.d.ts.map +1 -0
  199. package/dist/node/features/grep.d.ts +207 -0
  200. package/dist/node/features/grep.d.ts.map +1 -0
  201. package/dist/node/features/helpers.d.ts +236 -0
  202. package/dist/node/features/helpers.d.ts.map +1 -0
  203. package/dist/node/features/ink.d.ts +332 -0
  204. package/dist/node/features/ink.d.ts.map +1 -0
  205. package/dist/node/features/ipc-socket.d.ts +298 -0
  206. package/dist/node/features/ipc-socket.d.ts.map +1 -0
  207. package/dist/node/features/json-tree.d.ts +140 -0
  208. package/dist/node/features/json-tree.d.ts.map +1 -0
  209. package/dist/node/features/networking.d.ts +373 -0
  210. package/dist/node/features/networking.d.ts.map +1 -0
  211. package/dist/node/features/nlp.d.ts +125 -0
  212. package/dist/node/features/nlp.d.ts.map +1 -0
  213. package/dist/node/features/opener.d.ts +93 -0
  214. package/dist/node/features/opener.d.ts.map +1 -0
  215. package/dist/node/features/os.d.ts +168 -0
  216. package/dist/node/features/os.d.ts.map +1 -0
  217. package/dist/node/features/package-finder.d.ts +419 -0
  218. package/dist/node/features/package-finder.d.ts.map +1 -0
  219. package/dist/node/features/postgres.d.ts +173 -0
  220. package/dist/node/features/postgres.d.ts.map +1 -0
  221. package/dist/node/features/proc.d.ts +285 -0
  222. package/dist/node/features/proc.d.ts.map +1 -0
  223. package/dist/node/features/process-manager.d.ts +427 -0
  224. package/dist/node/features/process-manager.d.ts.map +1 -0
  225. package/dist/node/features/python.d.ts +477 -0
  226. package/dist/node/features/python.d.ts.map +1 -0
  227. package/dist/node/features/redis.d.ts +247 -0
  228. package/dist/node/features/redis.d.ts.map +1 -0
  229. package/dist/node/features/repl.d.ts +84 -0
  230. package/dist/node/features/repl.d.ts.map +1 -0
  231. package/dist/node/features/runpod.d.ts +527 -0
  232. package/dist/node/features/runpod.d.ts.map +1 -0
  233. package/dist/node/features/secure-shell.d.ts +145 -0
  234. package/dist/node/features/secure-shell.d.ts.map +1 -0
  235. package/dist/node/features/semantic-search.d.ts +207 -0
  236. package/dist/node/features/semantic-search.d.ts.map +1 -0
  237. package/dist/node/features/sqlite.d.ts +180 -0
  238. package/dist/node/features/sqlite.d.ts.map +1 -0
  239. package/dist/node/features/telegram.d.ts +173 -0
  240. package/dist/node/features/telegram.d.ts.map +1 -0
  241. package/dist/node/features/transpiler.d.ts +51 -0
  242. package/dist/node/features/transpiler.d.ts.map +1 -0
  243. package/dist/node/features/tts.d.ts +108 -0
  244. package/dist/node/features/tts.d.ts.map +1 -0
  245. package/dist/node/features/ui.d.ts +562 -0
  246. package/dist/node/features/ui.d.ts.map +1 -0
  247. package/dist/node/features/vault.d.ts +90 -0
  248. package/dist/node/features/vault.d.ts.map +1 -0
  249. package/dist/node/features/vm.d.ts +285 -0
  250. package/dist/node/features/vm.d.ts.map +1 -0
  251. package/dist/node/features/yaml-tree.d.ts +118 -0
  252. package/dist/node/features/yaml-tree.d.ts.map +1 -0
  253. package/dist/node/features/yaml.d.ts +127 -0
  254. package/dist/node/features/yaml.d.ts.map +1 -0
  255. package/dist/node.d.ts +67 -0
  256. package/dist/node.d.ts.map +1 -0
  257. package/dist/python/generated.d.ts +2 -0
  258. package/dist/python/generated.d.ts.map +1 -0
  259. package/dist/react/index.d.ts +36 -0
  260. package/dist/react/index.d.ts.map +1 -0
  261. package/dist/registry.d.ts +97 -0
  262. package/dist/registry.d.ts.map +1 -0
  263. package/dist/scaffolds/generated.d.ts +13 -0
  264. package/dist/scaffolds/generated.d.ts.map +1 -0
  265. package/dist/scaffolds/template.d.ts +11 -0
  266. package/dist/scaffolds/template.d.ts.map +1 -0
  267. package/dist/schemas/base.d.ts +254 -0
  268. package/dist/schemas/base.d.ts.map +1 -0
  269. package/dist/selector.d.ts +130 -0
  270. package/dist/selector.d.ts.map +1 -0
  271. package/dist/server.d.ts +89 -0
  272. package/dist/server.d.ts.map +1 -0
  273. package/dist/servers/express.d.ts +104 -0
  274. package/dist/servers/express.d.ts.map +1 -0
  275. package/dist/servers/mcp.d.ts +201 -0
  276. package/dist/servers/mcp.d.ts.map +1 -0
  277. package/dist/servers/socket.d.ts +121 -0
  278. package/dist/servers/socket.d.ts.map +1 -0
  279. package/dist/state.d.ts +24 -0
  280. package/dist/state.d.ts.map +1 -0
  281. package/dist/web/clients/socket.d.ts +37 -0
  282. package/dist/web/clients/socket.d.ts.map +1 -0
  283. package/dist/web/container.d.ts +55 -0
  284. package/dist/web/container.d.ts.map +1 -0
  285. package/dist/web/extension.d.ts +4 -0
  286. package/dist/web/extension.d.ts.map +1 -0
  287. package/dist/web/feature.d.ts +8 -0
  288. package/dist/web/feature.d.ts.map +1 -0
  289. package/dist/web/features/asset-loader.d.ts +35 -0
  290. package/dist/web/features/asset-loader.d.ts.map +1 -0
  291. package/dist/web/features/container-link.d.ts +167 -0
  292. package/dist/web/features/container-link.d.ts.map +1 -0
  293. package/dist/web/features/esbuild.d.ts +51 -0
  294. package/dist/web/features/esbuild.d.ts.map +1 -0
  295. package/dist/web/features/helpers.d.ts +140 -0
  296. package/dist/web/features/helpers.d.ts.map +1 -0
  297. package/dist/web/features/network.d.ts +69 -0
  298. package/dist/web/features/network.d.ts.map +1 -0
  299. package/dist/web/features/speech.d.ts +71 -0
  300. package/dist/web/features/speech.d.ts.map +1 -0
  301. package/dist/web/features/vault.d.ts +62 -0
  302. package/dist/web/features/vault.d.ts.map +1 -0
  303. package/dist/web/features/vm.d.ts +48 -0
  304. package/dist/web/features/vm.d.ts.map +1 -0
  305. package/dist/web/features/voice-recognition.d.ts +96 -0
  306. package/dist/web/features/voice-recognition.d.ts.map +1 -0
  307. package/dist/web/shims/isomorphic-vm.d.ts +22 -0
  308. package/dist/web/shims/isomorphic-vm.d.ts.map +1 -0
  309. package/index.html +1457 -0
  310. package/index.ts +1 -0
  311. package/install.sh +84 -0
  312. package/luca.cli.ts +16 -0
  313. package/luca.console.ts +9 -0
  314. package/main.py +6 -0
  315. package/package.json +219 -58
  316. package/public/index.html +1457 -0
  317. package/public/slides-ai-native.html +902 -0
  318. package/public/slides-intro.html +974 -0
  319. package/pyproject.toml +7 -0
  320. package/scripts/build-web.ts +28 -0
  321. package/scripts/examples/ask-luca-expert.ts +42 -0
  322. package/scripts/examples/assistant-questions.ts +12 -0
  323. package/scripts/examples/excalidraw-expert.ts +75 -0
  324. package/scripts/examples/expert-chat.ts +0 -0
  325. package/scripts/examples/file-manager.ts +14 -0
  326. package/scripts/examples/ideas.ts +12 -0
  327. package/scripts/examples/interactive-chat.ts +20 -0
  328. package/scripts/examples/openai-tool-calls.ts +113 -0
  329. package/scripts/examples/opening-a-web-browser.ts +5 -0
  330. package/scripts/examples/telegram-bot.ts +79 -0
  331. package/scripts/examples/using-assistant-with-mcp.ts +555 -0
  332. package/scripts/examples/using-claude-code.ts +10 -0
  333. package/scripts/examples/using-contentdb.ts +35 -0
  334. package/scripts/examples/using-conversations.ts +35 -0
  335. package/scripts/examples/using-disk-cache.ts +10 -0
  336. package/scripts/examples/using-docker-shell.ts +75 -0
  337. package/scripts/examples/using-elevenlabs.ts +25 -0
  338. package/scripts/examples/using-google-calendar.ts +57 -0
  339. package/scripts/examples/using-google-docs.ts +74 -0
  340. package/scripts/examples/using-google-drive.ts +74 -0
  341. package/scripts/examples/using-google-sheets.ts +89 -0
  342. package/scripts/examples/using-nlp.ts +55 -0
  343. package/scripts/examples/using-ollama.ts +11 -0
  344. package/scripts/examples/using-postgres.ts +55 -0
  345. package/scripts/examples/using-runpod.ts +32 -0
  346. package/scripts/examples/using-tts.ts +40 -0
  347. package/scripts/scaffold.ts +391 -0
  348. package/scripts/scratch.ts +15 -0
  349. package/scripts/stamp-build.sh +12 -0
  350. package/scripts/test-assistant-hooks.ts +13 -0
  351. package/scripts/test-docs-reader.ts +10 -0
  352. package/scripts/test-linux-binary.sh +80 -0
  353. package/scripts/update-introspection-data.ts +58 -0
  354. package/src/agi/README.md +14 -0
  355. package/src/agi/container.server.ts +156 -0
  356. package/src/agi/feature.ts +13 -0
  357. package/src/agi/features/agent-memory.ts +694 -0
  358. package/src/agi/features/assistant.ts +1653 -0
  359. package/src/agi/features/assistants-manager.ts +534 -0
  360. package/src/agi/features/autonomous-assistant.ts +431 -0
  361. package/src/agi/features/browser-use.ts +672 -0
  362. package/src/agi/features/claude-code.ts +1584 -0
  363. package/src/agi/features/coding-tools.ts +175 -0
  364. package/src/agi/features/conversation-history.ts +672 -0
  365. package/src/agi/features/conversation.ts +1494 -0
  366. package/src/agi/features/docs-reader.ts +167 -0
  367. package/src/agi/features/file-tools.ts +340 -0
  368. package/src/agi/features/luca-coder.ts +641 -0
  369. package/src/agi/features/mcp-bridge.ts +532 -0
  370. package/src/agi/features/openai-codex.ts +651 -0
  371. package/src/agi/features/openapi.ts +445 -0
  372. package/src/agi/features/skills-library.ts +557 -0
  373. package/src/agi/index.ts +6 -0
  374. package/src/agi/lib/interceptor-chain.ts +89 -0
  375. package/src/agi/lib/token-counter.ts +202 -0
  376. package/src/bootstrap/generated.ts +9791 -0
  377. package/src/browser.ts +25 -0
  378. package/src/bus.ts +122 -0
  379. package/src/cli/build-info.ts +4 -0
  380. package/src/cli/cli.ts +355 -0
  381. package/src/client.ts +170 -0
  382. package/src/clients/civitai/index.ts +537 -0
  383. package/src/clients/client-template.ts +41 -0
  384. package/src/clients/comfyui/index.ts +604 -0
  385. package/src/clients/elevenlabs/index.ts +317 -0
  386. package/src/clients/graph.ts +87 -0
  387. package/src/clients/openai/index.ts +456 -0
  388. package/src/clients/rest.ts +207 -0
  389. package/src/clients/supabase/index.ts +357 -0
  390. package/src/clients/voicebox/index.ts +300 -0
  391. package/src/clients/websocket.ts +251 -0
  392. package/src/command.ts +506 -0
  393. package/src/commands/bootstrap.ts +244 -0
  394. package/src/commands/chat.ts +309 -0
  395. package/src/commands/code.ts +371 -0
  396. package/src/commands/console.ts +189 -0
  397. package/src/commands/describe.ts +243 -0
  398. package/src/commands/eval.ts +67 -0
  399. package/src/commands/help.ts +240 -0
  400. package/src/commands/index.ts +19 -0
  401. package/src/commands/introspect.ts +218 -0
  402. package/src/commands/mcp.ts +64 -0
  403. package/src/commands/prompt.ts +1014 -0
  404. package/src/commands/run.ts +278 -0
  405. package/src/commands/sandbox-mcp.ts +343 -0
  406. package/src/commands/save-api-docs.ts +51 -0
  407. package/src/commands/scaffold.ts +225 -0
  408. package/src/commands/select.ts +99 -0
  409. package/src/commands/serve.ts +208 -0
  410. package/src/container-describer.ts +1091 -0
  411. package/src/container.ts +1199 -0
  412. package/src/endpoint.ts +365 -0
  413. package/src/entity.ts +173 -0
  414. package/src/feature.ts +118 -0
  415. package/src/graft.ts +181 -0
  416. package/src/hash-object.ts +97 -0
  417. package/src/helper.ts +849 -0
  418. package/src/introspection/generated.agi.ts +41200 -0
  419. package/src/introspection/generated.node.ts +28773 -0
  420. package/src/introspection/generated.web.ts +2272 -0
  421. package/src/introspection/index.ts +296 -0
  422. package/src/introspection/scan.ts +1136 -0
  423. package/src/node/container.ts +409 -0
  424. package/src/node/feature.ts +13 -0
  425. package/src/node/features/container-link.ts +559 -0
  426. package/src/node/features/content-db.ts +849 -0
  427. package/src/node/features/disk-cache.ts +388 -0
  428. package/src/node/features/display-result.ts +57 -0
  429. package/src/node/features/dns.ts +669 -0
  430. package/src/node/features/docker.ts +921 -0
  431. package/src/node/features/downloader.ts +79 -0
  432. package/src/node/features/figlet-fonts.ts +600 -0
  433. package/src/node/features/file-manager.ts +535 -0
  434. package/src/node/features/fs.ts +1050 -0
  435. package/src/node/features/git.ts +592 -0
  436. package/src/node/features/google-auth.ts +504 -0
  437. package/src/node/features/google-calendar.ts +306 -0
  438. package/src/node/features/google-docs.ts +412 -0
  439. package/src/node/features/google-drive.ts +346 -0
  440. package/src/node/features/google-mail.ts +540 -0
  441. package/src/node/features/google-sheets.ts +286 -0
  442. package/src/node/features/grep.ts +427 -0
  443. package/src/node/features/helpers.ts +762 -0
  444. package/src/node/features/ink.ts +490 -0
  445. package/src/node/features/ipc-socket.ts +649 -0
  446. package/src/node/features/json-tree.ts +170 -0
  447. package/src/node/features/networking.ts +961 -0
  448. package/src/node/features/nlp.ts +212 -0
  449. package/src/node/features/opener.ts +180 -0
  450. package/src/node/features/os.ts +403 -0
  451. package/src/node/features/package-finder.ts +540 -0
  452. package/src/node/features/postgres.ts +289 -0
  453. package/src/node/features/proc.ts +503 -0
  454. package/src/node/features/process-manager.ts +844 -0
  455. package/src/node/features/python.ts +912 -0
  456. package/src/node/features/redis.ts +446 -0
  457. package/src/node/features/repl.ts +212 -0
  458. package/src/node/features/runpod.ts +811 -0
  459. package/src/node/features/secure-shell.ts +261 -0
  460. package/src/node/features/semantic-search.ts +935 -0
  461. package/src/node/features/sqlite.ts +289 -0
  462. package/src/node/features/telegram.ts +343 -0
  463. package/src/node/features/transpiler.ts +160 -0
  464. package/src/node/features/tts.ts +185 -0
  465. package/src/node/features/ui.ts +791 -0
  466. package/src/node/features/vault.ts +153 -0
  467. package/src/node/features/vm.ts +462 -0
  468. package/src/node/features/yaml-tree.ts +148 -0
  469. package/src/node/features/yaml.ts +133 -0
  470. package/src/node.ts +76 -0
  471. package/src/python/bridge.py +220 -0
  472. package/src/python/generated.ts +226 -0
  473. package/src/react/index.ts +175 -0
  474. package/src/registry.ts +210 -0
  475. package/src/scaffolds/generated.ts +1814 -0
  476. package/src/scaffolds/template.ts +46 -0
  477. package/src/schemas/base.ts +296 -0
  478. package/src/selector.ts +352 -0
  479. package/src/server.ts +229 -0
  480. package/src/servers/express.ts +283 -0
  481. package/src/servers/mcp.ts +802 -0
  482. package/src/servers/socket.ts +258 -0
  483. package/src/state.ts +101 -0
  484. package/src/web/clients/socket.ts +99 -0
  485. package/src/web/container.ts +75 -0
  486. package/src/web/extension.ts +30 -0
  487. package/src/web/feature.ts +12 -0
  488. package/src/web/features/asset-loader.ts +72 -0
  489. package/src/web/features/container-link.ts +382 -0
  490. package/src/web/features/esbuild.ts +93 -0
  491. package/src/web/features/helpers.ts +291 -0
  492. package/src/web/features/network.ts +85 -0
  493. package/src/web/features/speech.ts +104 -0
  494. package/src/web/features/vault.ts +207 -0
  495. package/src/web/features/vm.ts +85 -0
  496. package/src/web/features/voice-recognition.ts +161 -0
  497. package/src/web/shims/isomorphic-vm.ts +149 -0
  498. package/tsconfig.build.json +12 -0
  499. package/tsconfig.json +58 -0
  500. package/uv.lock +8 -0
  501. package/LICENSE +0 -21
  502. package/dist/cli/cli.js +0 -48
  503. package/dist/cli/common.d.ts +0 -2
  504. package/dist/cli/common.js +0 -6
  505. package/dist/cli/index.d.ts +0 -2
  506. package/dist/cli/index.js +0 -5
  507. package/dist/cli/run.d.ts +0 -1
  508. package/dist/cli/run.js +0 -38
  509. package/dist/core/index.d.ts +0 -4
  510. package/dist/core/index.js +0 -32
  511. package/dist/core/read.d.ts +0 -2
  512. package/dist/core/read.js +0 -29
  513. package/dist/core/request.d.ts +0 -1
  514. package/dist/core/request.js +0 -2
  515. package/dist/core/write.d.ts +0 -2
  516. package/dist/core/write.js +0 -21
  517. package/dist/index.d.ts +0 -1
  518. package/dist/index.js +0 -5
  519. package/dist/utils/common.d.ts +0 -9
  520. package/dist/utils/common.js +0 -57
  521. package/dist/utils/consts.d.ts +0 -3
  522. package/dist/utils/consts.js +0 -11
  523. package/dist/utils/dict.d.ts +0 -1
  524. package/dist/utils/dict.js +0 -7
  525. package/dist/utils/index.d.ts +0 -5
  526. package/dist/utils/index.js +0 -21
  527. package/dist/utils/log.d.ts +0 -1
  528. package/dist/utils/log.js +0 -5
  529. package/dist/utils/types.d.ts +0 -1
  530. package/dist/utils/types.js +0 -2
  531. package/dist/utils/utils.test.d.ts +0 -1
  532. package/dist/utils/utils.test.js +0 -7
@@ -0,0 +1,243 @@
1
+ import { z } from 'zod'
2
+ import { commands } from '../command.js'
3
+ import { CommandOptionsSchema } from '../schemas/base.js'
4
+ import type { ContainerContext } from '../container.js'
5
+ import type { HelperIntrospection, IntrospectionSection } from '../introspection/index.js'
6
+ import { __INTROSPECTION__, __BROWSER_INTROSPECTION__ } from '../introspection/index.js'
7
+ import { features } from '../feature.js'
8
+ import { ContainerDescriber } from '../container-describer.js'
9
+ import type { BrowserFeatureData } from '../container-describer.js'
10
+ import { presentIntrospectionAsTypeScript } from '../helper.js'
11
+
12
+ declare module '../command.js' {
13
+ interface AvailableCommands {
14
+ describe: ReturnType<typeof commands.registerHandler>
15
+ }
16
+ }
17
+
18
+ export const argsSchema = CommandOptionsSchema.extend({
19
+ json: z.boolean().default(false).describe('Output introspection data as JSON instead of markdown'),
20
+ typescript: z.boolean().default(false).describe('Output introspection data as TypeScript interface declarations'),
21
+ ts: z.boolean().default(false).describe('Alias for --typescript'),
22
+ pretty: z.boolean().default(false).describe('Render markdown with terminal styling via ui.markdown'),
23
+ title: z.boolean().default(true).describe('Include the title header in the output (use --no-title to omit)'),
24
+ // Clean section flags (can be combined: --description --usage)
25
+ description: z.boolean().default(false).describe('Show the description section'),
26
+ usage: z.boolean().default(false).describe('Show the usage section'),
27
+ methods: z.boolean().default(false).describe('Show the methods section'),
28
+ getters: z.boolean().default(false).describe('Show the getters section'),
29
+ events: z.boolean().default(false).describe('Show the events section'),
30
+ state: z.boolean().default(false).describe('Show the state section'),
31
+ options: z.boolean().default(false).describe('Show the options section'),
32
+ 'env-vars': z.boolean().default(false).describe('Show the envVars section'),
33
+ envvars: z.boolean().default(false).describe('Show the envVars section'),
34
+ examples: z.boolean().default(false).describe('Show the examples section'),
35
+ // Legacy --only-* flags
36
+ 'only-methods': z.boolean().default(false).describe('Show only the methods section'),
37
+ 'only-getters': z.boolean().default(false).describe('Show only the getters section'),
38
+ 'only-events': z.boolean().default(false).describe('Show only the events section'),
39
+ 'only-state': z.boolean().default(false).describe('Show only the state section'),
40
+ 'only-options': z.boolean().default(false).describe('Show only the options section'),
41
+ 'only-env-vars': z.boolean().default(false).describe('Show only the envVars section'),
42
+ 'only-envvars': z.boolean().default(false).describe('Show only the envVars section'),
43
+ 'only-examples': z.boolean().default(false).describe('Show only the examples section'),
44
+ platform: z.enum(['browser', 'web', 'server', 'node', 'all']).default('all').describe('Which platform features to show: browser/web, server/node, or all'),
45
+ })
46
+
47
+ // --- Browser feature loading (build-time concern, lives here not in ContainerDescriber) ---
48
+
49
+ const WEB_FEATURE_IDS = ['speech', 'voice', 'assetLoader', 'network', 'vault', 'vm', 'esbuild', 'helpers', 'containerLink']
50
+
51
+ let _browserData: BrowserFeatureData | null = null
52
+
53
+ /**
54
+ * Load web/browser feature introspection data into a separate map.
55
+ * This is a build-time hack: we import web feature classes into the node process,
56
+ * snapshot their introspection, then restore the node registry.
57
+ * The ContainerDescriber itself knows nothing about this.
58
+ */
59
+ async function loadBrowserFeatures(): Promise<BrowserFeatureData> {
60
+ if (_browserData) return _browserData
61
+
62
+ const nodeFeatureIds = new Set(features.available)
63
+ const nodeIntrospection = new Map<string, HelperIntrospection>()
64
+ const nodeConstructors = new Map<string, any>()
65
+
66
+ for (const id of nodeFeatureIds) {
67
+ const data = __INTROSPECTION__.get(`features.${id}`)
68
+ if (data) nodeIntrospection.set(`features.${id}`, structuredClone(data))
69
+ try { nodeConstructors.set(id, features.lookup(id)) } catch {}
70
+ }
71
+
72
+ await import('../introspection/generated.web.js')
73
+
74
+ await Promise.all([
75
+ import('../web/features/speech.js'),
76
+ import('../web/features/voice-recognition.js'),
77
+ import('../web/features/asset-loader.js'),
78
+ import('../web/features/network.js'),
79
+ import('../web/features/vault.js'),
80
+ import('../web/features/vm.js'),
81
+ import('../web/features/esbuild.js'),
82
+ import('../web/features/helpers.js'),
83
+ import('../web/features/container-link.js'),
84
+ ])
85
+
86
+ const browserIntrospection = new Map<string, HelperIntrospection>()
87
+ const browserConstructors = new Map<string, any>()
88
+ const collidingIds = new Set<string>()
89
+
90
+ for (const id of WEB_FEATURE_IDS) {
91
+ const key = `features.${id}`
92
+ const data = __INTROSPECTION__.get(key)
93
+ if (data) browserIntrospection.set(key, structuredClone(data))
94
+ try { browserConstructors.set(id, features.lookup(id)) } catch {}
95
+ if (nodeFeatureIds.has(id)) collidingIds.add(id)
96
+ }
97
+
98
+ for (const [id, ctor] of nodeConstructors) {
99
+ features.register(id, ctor)
100
+ }
101
+
102
+ for (const [key, data] of nodeIntrospection) {
103
+ __INTROSPECTION__.set(key, data)
104
+ }
105
+
106
+ for (const id of WEB_FEATURE_IDS) {
107
+ const key = `features.${id}`
108
+ if (!nodeIntrospection.has(key)) __INTROSPECTION__.delete(key)
109
+ if (!nodeFeatureIds.has(id)) features.unregister(id)
110
+ }
111
+
112
+ for (const [key, data] of browserIntrospection) {
113
+ __BROWSER_INTROSPECTION__.set(key, data)
114
+ }
115
+
116
+ _browserData = {
117
+ introspection: browserIntrospection,
118
+ constructors: browserConstructors,
119
+ available: WEB_FEATURE_IDS.filter(id => browserIntrospection.has(`features.${id}`)),
120
+ collidingIds,
121
+ }
122
+
123
+ return _browserData
124
+ }
125
+
126
+ function shouldIncludeBrowser(platform: string): boolean {
127
+ return platform === 'browser' || platform === 'web' || platform === 'all'
128
+ }
129
+
130
+ // --- Command handler ---
131
+
132
+ export default async function describe(options: z.infer<typeof argsSchema>, context: ContainerContext) {
133
+ const container = context.container as any
134
+ const describer = new ContainerDescriber(container)
135
+
136
+ const args = container.argv._ as string[]
137
+ const targets = args.slice(1)
138
+
139
+ // No targets: show help screen
140
+ if (targets.length === 0) {
141
+ const { formatCommandHelp } = await import('./help.js')
142
+ const ui = container.feature('ui') as any
143
+ const Cmd = container.commands.lookup('describe')
144
+ console.log(formatCommandHelp('describe', Cmd, ui.colors))
145
+ return
146
+ }
147
+
148
+ // Build-time hack: load browser features into the describer if needed
149
+ if (shouldIncludeBrowser(options.platform)) {
150
+ const browserData = await loadBrowserFeatures()
151
+ describer.setBrowserData(browserData)
152
+ }
153
+
154
+ const sections = ContainerDescriber.getSectionsFromFlags(options)
155
+
156
+ const result = await describer.describe(targets, {
157
+ sections,
158
+ noTitle: !options.title,
159
+ platform: options.platform as any,
160
+ })
161
+
162
+ const wantsTypeScript = options.typescript || options.ts
163
+
164
+ if (wantsTypeScript) {
165
+ const output = renderResultAsTypeScript(result, targets, describer, sections)
166
+ if (options.pretty) {
167
+ const ui = container.feature('ui')
168
+ console.log(ui.markdown('```ts\n' + output + '\n```'))
169
+ } else {
170
+ console.log(output)
171
+ }
172
+ } else if (options.json) {
173
+ console.log(JSON.stringify(result.json, null, 2))
174
+ } else if (options.pretty) {
175
+ const ui = container.feature('ui')
176
+ console.log(ui.markdown(result.text))
177
+ } else {
178
+ console.log(result.text)
179
+ }
180
+ }
181
+
182
+ /**
183
+ * Renders the describe result as TypeScript interface declarations.
184
+ * Handles single helpers, arrays of helpers (registry describes), and the container.
185
+ */
186
+ function renderResultAsTypeScript(result: { json: any; text: string }, targets: string[], describer: ContainerDescriber, sections: (IntrospectionSection | 'description')[]): string {
187
+ const json = result.json
188
+ const section = sections.length === 1 && sections[0] !== 'description' ? sections[0] as IntrospectionSection : undefined
189
+
190
+ // Single helper introspection object (has shortcut = full data, or id = filtered data)
191
+ if (json && (json.shortcut || json.id)) {
192
+ // If sections were applied, the JSON is partial — get full data and pass section to renderer
193
+ const fullData = json.shortcut ? json : __INTROSPECTION__.get(json.id) || json
194
+ return presentIntrospectionAsTypeScript(fullData, section)
195
+ }
196
+
197
+ // Container introspection (has className, registries, factories)
198
+ if (json && json.className && json.registries) {
199
+ const container = (describer as any).container
200
+ return container.introspectAsType()
201
+ }
202
+
203
+ // Array of results (e.g. from registry describe or multiple targets)
204
+ if (Array.isArray(json)) {
205
+ const interfaces = json
206
+ .filter((item: any) => item && (item.shortcut || item.id))
207
+ .map((item: any) => {
208
+ const fullData = item.shortcut ? item : __INTROSPECTION__.get(item.id) || item
209
+ return presentIntrospectionAsTypeScript(fullData, section)
210
+ })
211
+ return interfaces.join('\n\n')
212
+ }
213
+
214
+ // Object keyed by helper id (registry describe format — has _shared and per-helper summaries)
215
+ if (json && typeof json === 'object' && !json._helper && json._shared) {
216
+ const ids = Object.keys(json).filter(k => k !== '_shared')
217
+ const interfaces = ids
218
+ .map((id: string) => {
219
+ // Try qualified key first (e.g. "clients.rest"), then scan the introspection map
220
+ for (const prefix of ['features', 'clients', 'servers', 'commands', 'endpoints']) {
221
+ const data = __INTROSPECTION__.get(`${prefix}.${id}`)
222
+ if (data) return presentIntrospectionAsTypeScript(data, section)
223
+ }
224
+ return null
225
+ })
226
+ .filter(Boolean)
227
+ if (interfaces.length > 0) return interfaces.join('\n\n')
228
+ }
229
+
230
+ // Member-level result (has _helper and _type) — render the full helper interface
231
+ if (json && json._helper) {
232
+ const fullData = __INTROSPECTION__.get(json._helper) || __INTROSPECTION__.get(`features.${json._helper}`)
233
+ if (fullData) return presentIntrospectionAsTypeScript(fullData)
234
+ }
235
+
236
+ return result.text
237
+ }
238
+
239
+ commands.registerHandler('describe', {
240
+ description: 'Describe the container, registries, or individual helpers',
241
+ argsSchema,
242
+ handler: describe,
243
+ })
@@ -0,0 +1,67 @@
1
+ import { z } from 'zod'
2
+ import { commands } from '../command.js'
3
+ import { displayResult } from '../node/features/display-result.js'
4
+ import { CommandOptionsSchema } from '../schemas/base.js'
5
+ import type { ContainerContext } from '../container.js'
6
+
7
+ declare module '../command.js' {
8
+ interface AvailableCommands {
9
+ eval: ReturnType<typeof commands.registerHandler>
10
+ }
11
+ }
12
+
13
+ export const argsSchema = CommandOptionsSchema.extend({
14
+ json: z.boolean().default(false).describe('Serialize output as JSON'),
15
+ enable: z.string().optional().describe('Enable a feature before evaluating (e.g. --enable diskCache)'),
16
+ })
17
+
18
+ export default async function evalCommand(options: z.infer<typeof argsSchema>, context: ContainerContext) {
19
+ const container = context.container as any
20
+
21
+ container.addContext('feature', (...args: any) => container.feature(...args))
22
+
23
+ await container.helpers.discoverAll()
24
+
25
+ const args = container.argv._ as string[]
26
+ // args[0] is "eval", the rest is the code snippet
27
+ let code = args.slice(1).join(' ')
28
+
29
+ // Read from stdin if no inline code was provided
30
+ if (!code.trim()) {
31
+ code = await Bun.stdin.text()
32
+ }
33
+
34
+ if (!code.trim()) {
35
+ console.error('Usage: luca eval "<code>" [--json]')
36
+ return
37
+ }
38
+
39
+ const vm = container.feature('vm')
40
+
41
+ // HACK
42
+ Array(container.argv.enable).filter(Boolean).map((id) => {
43
+ container.feature(id, { ...container.argv, enable: true }).enable()
44
+ })
45
+
46
+ // Build context with container and all enabled feature instances
47
+ const ctx: Record<string, any> = { container }
48
+ for (const [name, instance] of Object.entries(container.enabledFeatures ?? {})) {
49
+ ctx[name] = instance
50
+ }
51
+
52
+ const result = await vm.run(code, ctx)
53
+
54
+ if (options.json) {
55
+ console.log(JSON.stringify(result, null, 2))
56
+ } else {
57
+ displayResult(result)
58
+ }
59
+ }
60
+
61
+ export { displayResult } from '../node/features/display-result.js'
62
+
63
+ commands.registerHandler('eval', {
64
+ description: 'Evaluate a JavaScript/TypeScript expression with the container in scope',
65
+ argsSchema,
66
+ handler: evalCommand,
67
+ })
@@ -0,0 +1,240 @@
1
+ import { z } from 'zod'
2
+ import { commands } from '../command.js'
3
+ import { CommandOptionsSchema } from '../schemas/base.js'
4
+ import type { ContainerContext } from '../container.js'
5
+
6
+ declare module '../command.js' {
7
+ interface AvailableCommands {
8
+ help: ReturnType<typeof commands.registerHandler>
9
+ }
10
+ }
11
+
12
+ export const argsSchema = CommandOptionsSchema.extend({})
13
+
14
+ /** Hidden option prefixes — legacy aliases that shouldn't clutter help output. */
15
+ const HIDDEN_PREFIXES = ['only-']
16
+ const HIDDEN_KEYS = new Set(['_', 'name', '_cacheKey', 'dispatchSource'])
17
+
18
+ /**
19
+ * Extract CLI option info from a Zod schema.
20
+ * Walks through Zod v4 wrapper types (default, optional) to find descriptions, types, and defaults.
21
+ */
22
+ function extractOptions(schema: any): Array<{ flag: string; description: string; type: string; defaultValue?: any }> {
23
+ if (!schema?.shape) return []
24
+
25
+ const options: Array<{ flag: string; description: string; type: string; defaultValue?: any }> = []
26
+
27
+ for (const [key, field] of Object.entries(schema.shape)) {
28
+ if (HIDDEN_KEYS.has(key)) continue
29
+ if (HIDDEN_PREFIXES.some((p) => key.startsWith(p))) continue
30
+
31
+ const f = field as any
32
+ // In Zod v4, description lives on the schema object itself
33
+ const description = f.description || ''
34
+ let type = 'string'
35
+ let defaultValue: any = undefined
36
+
37
+ // Walk through wrapper types to find leaf type and default
38
+ let current = f
39
+ while (current) {
40
+ const defType = current._def?.type || current.type
41
+ if (defType === 'default') {
42
+ defaultValue = current._def?.defaultValue
43
+ if (typeof defaultValue === 'function') defaultValue = defaultValue()
44
+ }
45
+ if (defType === 'boolean') { type = 'boolean'; break }
46
+ if (defType === 'string') { type = 'string'; break }
47
+ if (defType === 'number') { type = 'number'; break }
48
+ if (defType === 'enum') { type = current.options?.join(' | ') || 'enum'; break }
49
+ // Unwrap
50
+ current = current._def?.innerType
51
+ }
52
+
53
+ options.push({ flag: key, description, type, defaultValue })
54
+ }
55
+
56
+ return options
57
+ }
58
+
59
+ /**
60
+ * Format CLI-oriented help text for a single command.
61
+ * Exported so other commands (like describe) can reuse it.
62
+ */
63
+ export function formatCommandHelp(name: string, Cmd: any, colors: any): string {
64
+ const desc = Cmd.commandDescription || ''
65
+ const schema = Cmd.argsSchema
66
+ const lines: string[] = []
67
+
68
+ lines.push('')
69
+ lines.push(` ${colors.cyan.bold(`luca ${name}`)} ${desc ? `${colors.dim('—')} ${desc}` : ''}`)
70
+ lines.push('')
71
+
72
+ const options = extractOptions(schema)
73
+
74
+ if (options.length === 0) {
75
+ lines.push(` ${colors.white('Usage:')} ${colors.cyan(`luca ${name}`)}`)
76
+ } else {
77
+ const booleans = options.filter((o) => o.type === 'boolean')
78
+ const valued = options.filter((o) => o.type !== 'boolean')
79
+
80
+ lines.push(` ${colors.white('Usage:')} ${colors.cyan(`luca ${name}`)} ${colors.dim('[options]')}`)
81
+ lines.push('')
82
+
83
+ if (valued.length > 0) {
84
+ lines.push(` ${colors.white('Options:')}`)
85
+ lines.push('')
86
+ const maxLen = Math.max(...valued.map((o) => `--${o.flag} <${o.type}>`.length))
87
+ for (const opt of valued) {
88
+ const flag = `--${opt.flag} <${opt.type}>`
89
+ let line = ` ${colors.green(flag.padEnd(maxLen + 2))} ${opt.description}`
90
+ if (opt.defaultValue !== undefined && opt.defaultValue !== false) {
91
+ line += ` ${colors.dim(`(default: ${opt.defaultValue})`)}`
92
+ }
93
+ lines.push(line)
94
+ }
95
+ lines.push('')
96
+ }
97
+
98
+ if (booleans.length > 0) {
99
+ lines.push(` ${colors.white('Flags:')}`)
100
+ lines.push('')
101
+ const maxLen = Math.max(...booleans.map((o) => `--${o.flag}`.length))
102
+ for (const opt of booleans) {
103
+ const flag = `--${opt.flag}`
104
+ let line = ` ${colors.green(flag.padEnd(maxLen + 2))} ${opt.description}`
105
+ if (opt.defaultValue === true) {
106
+ line += ` ${colors.dim('(default: true)')}`
107
+ }
108
+ lines.push(line)
109
+ }
110
+ lines.push('')
111
+ }
112
+ }
113
+
114
+ return lines.join('\n')
115
+ }
116
+
117
+ /** Strip ANSI escape codes for visible width calculation. */
118
+ function stripAnsi(s: string): string {
119
+ return s.replace(/\x1B\[[0-9;]*m/g, '')
120
+ }
121
+
122
+ /** Merge two multi-line blocks side by side with a gap. */
123
+ function sideBySide(left: string[], right: string[], gap = 3): string[] {
124
+ const maxLeftWidth = Math.max(...left.map((l) => stripAnsi(l).length))
125
+ const maxLines = Math.max(left.length, right.length)
126
+ const result: string[] = []
127
+
128
+ for (let i = 0; i < maxLines; i++) {
129
+ const l = left[i] || ''
130
+ const r = right[i] || ''
131
+ const visLen = stripAnsi(l).length
132
+ const pad = Math.max(0, maxLeftWidth - visLen) + gap
133
+ result.push(l + ' '.repeat(pad) + r)
134
+ }
135
+
136
+ return result
137
+ }
138
+
139
+ const LEGO_ROBOT = [
140
+ ' ┌─○○─┐ ',
141
+ ' │ ●● │ ',
142
+ ' ├○──○┤ ',
143
+ ' └─╨╨─┘ ',
144
+ ]
145
+
146
+ const BANNER_COLORS: string[] = ['cyan', 'blue', 'magenta']
147
+
148
+ export default async function help(_options: z.infer<typeof argsSchema>, context: ContainerContext) {
149
+ const container = context.container as any
150
+ const ui = container.feature('ui') as any
151
+ const c = ui.colors
152
+
153
+ const args = container.argv._ as string[]
154
+ const target = args[1] as string
155
+
156
+ if (!target) {
157
+ // Robot (left) + banner (right), same height — direct 1:1 alignment
158
+ const banner = ui.banner('luca', { font: 'Small Slant', colors: BANNER_COLORS })
159
+ const bannerLines = banner.split('\n').filter((l: string) => l.trim())
160
+ const coloredRobot = ui.applyGradient(LEGO_ROBOT.join('\n'), BANNER_COLORS)
161
+ const robotLines = coloredRobot.split('\n') as string[]
162
+ const robotWidth = Math.max(...LEGO_ROBOT.map((l: string) => l.length))
163
+
164
+ const headerLines: string[] = []
165
+ const maxLines = Math.max(robotLines.length, bannerLines.length)
166
+ for (let i = 0; i < maxLines; i++) {
167
+ const rLine = robotLines[i] || ''
168
+ const rPad = robotWidth - stripAnsi(rLine).length
169
+ const bLine = bannerLines[i] || ''
170
+ headerLines.push(rLine + ' '.repeat(rPad + 2) + bLine)
171
+ }
172
+
173
+ console.log('\n')
174
+ console.log(headerLines.join('\n'))
175
+ console.log(c.dim(' Lightweight Universal Conversational Architecture'))
176
+ console.log()
177
+ console.log(c.white(' Usage: ') + c.cyan('luca') + c.dim(' <command|file> [options]'))
178
+ console.log()
179
+ const allNames = (container.commands.available as string[]).filter((n: string) => n !== 'help')
180
+ const maxNameLen = Math.max(...allNames.map((n: string) => n.length)) + 2
181
+
182
+ const sources = (container as any)._commandSources as
183
+ | { builtinCommands: Set<string>; projectCommands: Set<string>; userCommands: Set<string> }
184
+ | undefined
185
+
186
+ const printCommands = (names: string[]) => {
187
+ for (const name of names) {
188
+ const Cmd = container.commands.lookup(name) as any
189
+ const desc = Cmd.commandDescription || ''
190
+ console.log(` ${c.cyan(name.padEnd(maxNameLen))} ${c.dim(desc)}`)
191
+ }
192
+ }
193
+
194
+ // Built-in commands
195
+ const builtinNames = sources
196
+ ? allNames.filter((n) => sources.builtinCommands.has(n))
197
+ : allNames
198
+ console.log(c.white(' Commands:'))
199
+ console.log()
200
+ printCommands(builtinNames)
201
+
202
+ // Project-local commands
203
+ if (sources && sources.projectCommands.size > 0) {
204
+ console.log()
205
+ console.log(c.white(' Project Commands') + c.dim(' (./commands/*)'))
206
+ console.log()
207
+ printCommands(allNames.filter((n) => sources.projectCommands.has(n)))
208
+ }
209
+
210
+ // User-level commands
211
+ if (sources && sources.userCommands.size > 0) {
212
+ console.log()
213
+ console.log(c.white(' User Commands') + c.dim(' (~/.luca/commands/*)'))
214
+ console.log()
215
+ printCommands(allNames.filter((n) => sources.userCommands.has(n)))
216
+ }
217
+
218
+ console.log()
219
+ console.log(c.dim(' Run ') + c.cyan('luca <file>') + c.dim(' to execute a script or markdown (.ts, .js, .md)'))
220
+ console.log(c.dim(' Run ') + c.cyan('luca help <command>') + c.dim(' for detailed usage of a command'))
221
+ console.log()
222
+ return
223
+ }
224
+
225
+ if (!container.commands.has(target)) {
226
+ console.error(` Unknown command: ${c.red(target)}`)
227
+ console.error()
228
+ console.error(` Run ${c.cyan('luca help')} to see available commands.`)
229
+ return
230
+ }
231
+
232
+ const Cmd = container.commands.lookup(target) as any
233
+ console.log(formatCommandHelp(target, Cmd, c))
234
+ }
235
+
236
+ commands.registerHandler('help', {
237
+ description: 'Show help for luca commands',
238
+ argsSchema,
239
+ handler: help,
240
+ })
@@ -0,0 +1,19 @@
1
+ export { Command, commands, CommandsRegistry, type AvailableCommands, type CommandsInterface, type CommandHandler, type CommandState, type CommandOptions } from '../command.js'
2
+
3
+ // Side-effect imports register each command
4
+ import './run.js'
5
+ import './console.js'
6
+ import './serve.js'
7
+ import './chat.js'
8
+ import './prompt.js'
9
+ import './mcp.js'
10
+ import './sandbox-mcp.js'
11
+ import './describe.js'
12
+ import './eval.js'
13
+ import './help.js'
14
+ import './scaffold.js'
15
+ import './introspect.js'
16
+ import './save-api-docs.js'
17
+ import './bootstrap.js'
18
+ import './select.js'
19
+ import './code.js'