luca 1.1.2 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (754) hide show
  1. package/.github/workflows/release.yaml +169 -0
  2. package/AGENTS.md +99 -0
  3. package/CLAUDE.md +115 -0
  4. package/CNAME +1 -0
  5. package/README.md +257 -8
  6. package/RUNME.md +56 -0
  7. package/assistants/codingAssistant/ABOUT.md +5 -0
  8. package/assistants/codingAssistant/CORE.md +28 -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 +2769 -0
  20. package/bunfig.toml +3 -0
  21. package/commands/audit-docs.ts +740 -0
  22. package/commands/build-bootstrap.ts +118 -0
  23. package/commands/build-python-bridge.ts +43 -0
  24. package/commands/build-scaffolds.ts +176 -0
  25. package/commands/generate-api-docs.ts +114 -0
  26. package/commands/inkbot.ts +874 -0
  27. package/commands/release.ts +80 -0
  28. package/commands/try-all-challenges.ts +543 -0
  29. package/commands/try-challenge.ts +100 -0
  30. package/dist/agi/container.server.d.ts +63 -0
  31. package/dist/agi/container.server.d.ts.map +1 -0
  32. package/dist/agi/endpoints/ask.d.ts +20 -0
  33. package/dist/agi/endpoints/ask.d.ts.map +1 -0
  34. package/dist/agi/endpoints/conversations/[id].d.ts +27 -0
  35. package/dist/agi/endpoints/conversations/[id].d.ts.map +1 -0
  36. package/dist/agi/endpoints/conversations.d.ts +18 -0
  37. package/dist/agi/endpoints/conversations.d.ts.map +1 -0
  38. package/dist/agi/endpoints/experts.d.ts +8 -0
  39. package/dist/agi/endpoints/experts.d.ts.map +1 -0
  40. package/dist/agi/feature.d.ts +9 -0
  41. package/dist/agi/feature.d.ts.map +1 -0
  42. package/dist/agi/features/assistant.d.ts +509 -0
  43. package/dist/agi/features/assistant.d.ts.map +1 -0
  44. package/dist/agi/features/assistants-manager.d.ts +236 -0
  45. package/dist/agi/features/assistants-manager.d.ts.map +1 -0
  46. package/dist/agi/features/autonomous-assistant.d.ts +281 -0
  47. package/dist/agi/features/autonomous-assistant.d.ts.map +1 -0
  48. package/dist/agi/features/browser-use.d.ts +479 -0
  49. package/dist/agi/features/browser-use.d.ts.map +1 -0
  50. package/dist/agi/features/claude-code.d.ts +824 -0
  51. package/dist/agi/features/claude-code.d.ts.map +1 -0
  52. package/dist/agi/features/conversation-history.d.ts +245 -0
  53. package/dist/agi/features/conversation-history.d.ts.map +1 -0
  54. package/dist/agi/features/conversation.d.ts +464 -0
  55. package/dist/agi/features/conversation.d.ts.map +1 -0
  56. package/dist/agi/features/docs-reader.d.ts +72 -0
  57. package/dist/agi/features/docs-reader.d.ts.map +1 -0
  58. package/dist/agi/features/file-tools.d.ts +110 -0
  59. package/dist/agi/features/file-tools.d.ts.map +1 -0
  60. package/dist/agi/features/luca-coder.d.ts +323 -0
  61. package/dist/agi/features/luca-coder.d.ts.map +1 -0
  62. package/dist/agi/features/openai-codex.d.ts +381 -0
  63. package/dist/agi/features/openai-codex.d.ts.map +1 -0
  64. package/dist/agi/features/openapi.d.ts +200 -0
  65. package/dist/agi/features/openapi.d.ts.map +1 -0
  66. package/dist/agi/features/skills-library.d.ts +167 -0
  67. package/dist/agi/features/skills-library.d.ts.map +1 -0
  68. package/dist/agi/index.d.ts +5 -0
  69. package/dist/agi/index.d.ts.map +1 -0
  70. package/dist/agi/lib/interceptor-chain.d.ts +44 -0
  71. package/dist/agi/lib/interceptor-chain.d.ts.map +1 -0
  72. package/dist/agi/lib/token-counter.d.ts +13 -0
  73. package/dist/agi/lib/token-counter.d.ts.map +1 -0
  74. package/dist/bootstrap/generated.d.ts +5 -0
  75. package/dist/bootstrap/generated.d.ts.map +1 -0
  76. package/dist/browser.d.ts +12 -0
  77. package/dist/browser.d.ts.map +1 -0
  78. package/dist/bus.d.ts +29 -0
  79. package/dist/bus.d.ts.map +1 -0
  80. package/dist/cli/build-info.d.ts +4 -0
  81. package/dist/cli/build-info.d.ts.map +1 -0
  82. package/dist/cli/cli.d.ts +3 -0
  83. package/dist/cli/cli.d.ts.map +1 -0
  84. package/dist/client.d.ts +60 -0
  85. package/dist/client.d.ts.map +1 -0
  86. package/dist/clients/civitai/index.d.ts +472 -0
  87. package/dist/clients/civitai/index.d.ts.map +1 -0
  88. package/dist/clients/client-template.d.ts +30 -0
  89. package/dist/clients/client-template.d.ts.map +1 -0
  90. package/dist/clients/comfyui/index.d.ts +281 -0
  91. package/dist/clients/comfyui/index.d.ts.map +1 -0
  92. package/dist/clients/elevenlabs/index.d.ts +197 -0
  93. package/dist/clients/elevenlabs/index.d.ts.map +1 -0
  94. package/dist/clients/graph.d.ts +64 -0
  95. package/dist/clients/graph.d.ts.map +1 -0
  96. package/dist/clients/openai/index.d.ts +247 -0
  97. package/dist/clients/openai/index.d.ts.map +1 -0
  98. package/dist/clients/rest.d.ts +92 -0
  99. package/dist/clients/rest.d.ts.map +1 -0
  100. package/dist/clients/supabase/index.d.ts +176 -0
  101. package/dist/clients/supabase/index.d.ts.map +1 -0
  102. package/dist/clients/websocket.d.ts +127 -0
  103. package/dist/clients/websocket.d.ts.map +1 -0
  104. package/dist/command.d.ts +163 -0
  105. package/dist/command.d.ts.map +1 -0
  106. package/dist/commands/bootstrap.d.ts +20 -0
  107. package/dist/commands/bootstrap.d.ts.map +1 -0
  108. package/dist/commands/chat.d.ts +37 -0
  109. package/dist/commands/chat.d.ts.map +1 -0
  110. package/dist/commands/code.d.ts +28 -0
  111. package/dist/commands/code.d.ts.map +1 -0
  112. package/dist/commands/console.d.ts +22 -0
  113. package/dist/commands/console.d.ts.map +1 -0
  114. package/dist/commands/describe.d.ts +50 -0
  115. package/dist/commands/describe.d.ts.map +1 -0
  116. package/dist/commands/eval.d.ts +23 -0
  117. package/dist/commands/eval.d.ts.map +1 -0
  118. package/dist/commands/help.d.ts +25 -0
  119. package/dist/commands/help.d.ts.map +1 -0
  120. package/dist/commands/index.d.ts +18 -0
  121. package/dist/commands/index.d.ts.map +1 -0
  122. package/dist/commands/introspect.d.ts +24 -0
  123. package/dist/commands/introspect.d.ts.map +1 -0
  124. package/dist/commands/mcp.d.ts +35 -0
  125. package/dist/commands/mcp.d.ts.map +1 -0
  126. package/dist/commands/prompt.d.ts +38 -0
  127. package/dist/commands/prompt.d.ts.map +1 -0
  128. package/dist/commands/run.d.ts +24 -0
  129. package/dist/commands/run.d.ts.map +1 -0
  130. package/dist/commands/sandbox-mcp.d.ts +34 -0
  131. package/dist/commands/sandbox-mcp.d.ts.map +1 -0
  132. package/dist/commands/save-api-docs.d.ts +21 -0
  133. package/dist/commands/save-api-docs.d.ts.map +1 -0
  134. package/dist/commands/scaffold.d.ts +24 -0
  135. package/dist/commands/scaffold.d.ts.map +1 -0
  136. package/dist/commands/select.d.ts +22 -0
  137. package/dist/commands/select.d.ts.map +1 -0
  138. package/dist/commands/serve.d.ts +29 -0
  139. package/dist/commands/serve.d.ts.map +1 -0
  140. package/dist/container-describer.d.ts +144 -0
  141. package/dist/container-describer.d.ts.map +1 -0
  142. package/dist/container.d.ts +451 -0
  143. package/dist/container.d.ts.map +1 -0
  144. package/dist/endpoint.d.ts +113 -0
  145. package/dist/endpoint.d.ts.map +1 -0
  146. package/dist/feature.d.ts +47 -0
  147. package/dist/feature.d.ts.map +1 -0
  148. package/dist/graft.d.ts +29 -0
  149. package/dist/graft.d.ts.map +1 -0
  150. package/dist/hash-object.d.ts +8 -0
  151. package/dist/hash-object.d.ts.map +1 -0
  152. package/dist/helper.d.ts +209 -0
  153. package/dist/helper.d.ts.map +1 -0
  154. package/dist/introspection/generated.node.d.ts +44623 -0
  155. package/dist/introspection/generated.node.d.ts.map +1 -0
  156. package/dist/introspection/generated.web.d.ts +1412 -0
  157. package/dist/introspection/generated.web.d.ts.map +1 -0
  158. package/dist/introspection/index.d.ts +156 -0
  159. package/dist/introspection/index.d.ts.map +1 -0
  160. package/dist/introspection/scan.d.ts +147 -0
  161. package/dist/introspection/scan.d.ts.map +1 -0
  162. package/dist/node/container.d.ts +256 -0
  163. package/dist/node/container.d.ts.map +1 -0
  164. package/dist/node/feature.d.ts +9 -0
  165. package/dist/node/feature.d.ts.map +1 -0
  166. package/dist/node/features/container-link.d.ts +213 -0
  167. package/dist/node/features/container-link.d.ts.map +1 -0
  168. package/dist/node/features/content-db.d.ts +354 -0
  169. package/dist/node/features/content-db.d.ts.map +1 -0
  170. package/dist/node/features/disk-cache.d.ts +236 -0
  171. package/dist/node/features/disk-cache.d.ts.map +1 -0
  172. package/dist/node/features/dns.d.ts +511 -0
  173. package/dist/node/features/dns.d.ts.map +1 -0
  174. package/dist/node/features/docker.d.ts +485 -0
  175. package/dist/node/features/docker.d.ts.map +1 -0
  176. package/dist/node/features/downloader.d.ts +73 -0
  177. package/dist/node/features/downloader.d.ts.map +1 -0
  178. package/dist/node/features/figlet-fonts.d.ts +4 -0
  179. package/dist/node/features/figlet-fonts.d.ts.map +1 -0
  180. package/dist/node/features/file-manager.d.ts +177 -0
  181. package/dist/node/features/file-manager.d.ts.map +1 -0
  182. package/dist/node/features/fs.d.ts +635 -0
  183. package/dist/node/features/fs.d.ts.map +1 -0
  184. package/dist/node/features/git.d.ts +329 -0
  185. package/dist/node/features/git.d.ts.map +1 -0
  186. package/dist/node/features/google-auth.d.ts +200 -0
  187. package/dist/node/features/google-auth.d.ts.map +1 -0
  188. package/dist/node/features/google-calendar.d.ts +194 -0
  189. package/dist/node/features/google-calendar.d.ts.map +1 -0
  190. package/dist/node/features/google-docs.d.ts +138 -0
  191. package/dist/node/features/google-docs.d.ts.map +1 -0
  192. package/dist/node/features/google-drive.d.ts +202 -0
  193. package/dist/node/features/google-drive.d.ts.map +1 -0
  194. package/dist/node/features/google-mail.d.ts +221 -0
  195. package/dist/node/features/google-mail.d.ts.map +1 -0
  196. package/dist/node/features/google-sheets.d.ts +157 -0
  197. package/dist/node/features/google-sheets.d.ts.map +1 -0
  198. package/dist/node/features/grep.d.ts +207 -0
  199. package/dist/node/features/grep.d.ts.map +1 -0
  200. package/dist/node/features/helpers.d.ts +236 -0
  201. package/dist/node/features/helpers.d.ts.map +1 -0
  202. package/dist/node/features/ink.d.ts +332 -0
  203. package/dist/node/features/ink.d.ts.map +1 -0
  204. package/dist/node/features/ipc-socket.d.ts +298 -0
  205. package/dist/node/features/ipc-socket.d.ts.map +1 -0
  206. package/dist/node/features/json-tree.d.ts +140 -0
  207. package/dist/node/features/json-tree.d.ts.map +1 -0
  208. package/dist/node/features/networking.d.ts +373 -0
  209. package/dist/node/features/networking.d.ts.map +1 -0
  210. package/dist/node/features/nlp.d.ts +125 -0
  211. package/dist/node/features/nlp.d.ts.map +1 -0
  212. package/dist/node/features/opener.d.ts +93 -0
  213. package/dist/node/features/opener.d.ts.map +1 -0
  214. package/dist/node/features/os.d.ts +168 -0
  215. package/dist/node/features/os.d.ts.map +1 -0
  216. package/dist/node/features/package-finder.d.ts +419 -0
  217. package/dist/node/features/package-finder.d.ts.map +1 -0
  218. package/dist/node/features/postgres.d.ts +173 -0
  219. package/dist/node/features/postgres.d.ts.map +1 -0
  220. package/dist/node/features/proc.d.ts +285 -0
  221. package/dist/node/features/proc.d.ts.map +1 -0
  222. package/dist/node/features/process-manager.d.ts +427 -0
  223. package/dist/node/features/process-manager.d.ts.map +1 -0
  224. package/dist/node/features/python.d.ts +477 -0
  225. package/dist/node/features/python.d.ts.map +1 -0
  226. package/dist/node/features/redis.d.ts +247 -0
  227. package/dist/node/features/redis.d.ts.map +1 -0
  228. package/dist/node/features/repl.d.ts +84 -0
  229. package/dist/node/features/repl.d.ts.map +1 -0
  230. package/dist/node/features/runpod.d.ts +527 -0
  231. package/dist/node/features/runpod.d.ts.map +1 -0
  232. package/dist/node/features/secure-shell.d.ts +145 -0
  233. package/dist/node/features/secure-shell.d.ts.map +1 -0
  234. package/dist/node/features/semantic-search.d.ts +207 -0
  235. package/dist/node/features/semantic-search.d.ts.map +1 -0
  236. package/dist/node/features/sqlite.d.ts +180 -0
  237. package/dist/node/features/sqlite.d.ts.map +1 -0
  238. package/dist/node/features/telegram.d.ts +173 -0
  239. package/dist/node/features/telegram.d.ts.map +1 -0
  240. package/dist/node/features/transpiler.d.ts +51 -0
  241. package/dist/node/features/transpiler.d.ts.map +1 -0
  242. package/dist/node/features/tts.d.ts +108 -0
  243. package/dist/node/features/tts.d.ts.map +1 -0
  244. package/dist/node/features/ui.d.ts +562 -0
  245. package/dist/node/features/ui.d.ts.map +1 -0
  246. package/dist/node/features/vault.d.ts +90 -0
  247. package/dist/node/features/vault.d.ts.map +1 -0
  248. package/dist/node/features/vm.d.ts +285 -0
  249. package/dist/node/features/vm.d.ts.map +1 -0
  250. package/dist/node/features/yaml-tree.d.ts +118 -0
  251. package/dist/node/features/yaml-tree.d.ts.map +1 -0
  252. package/dist/node/features/yaml.d.ts +127 -0
  253. package/dist/node/features/yaml.d.ts.map +1 -0
  254. package/dist/node.d.ts +67 -0
  255. package/dist/node.d.ts.map +1 -0
  256. package/dist/python/generated.d.ts +2 -0
  257. package/dist/python/generated.d.ts.map +1 -0
  258. package/dist/react/index.d.ts +36 -0
  259. package/dist/react/index.d.ts.map +1 -0
  260. package/dist/registry.d.ts +97 -0
  261. package/dist/registry.d.ts.map +1 -0
  262. package/dist/scaffolds/generated.d.ts +13 -0
  263. package/dist/scaffolds/generated.d.ts.map +1 -0
  264. package/dist/scaffolds/template.d.ts +11 -0
  265. package/dist/scaffolds/template.d.ts.map +1 -0
  266. package/dist/schemas/base.d.ts +254 -0
  267. package/dist/schemas/base.d.ts.map +1 -0
  268. package/dist/selector.d.ts +130 -0
  269. package/dist/selector.d.ts.map +1 -0
  270. package/dist/server.d.ts +89 -0
  271. package/dist/server.d.ts.map +1 -0
  272. package/dist/servers/express.d.ts +104 -0
  273. package/dist/servers/express.d.ts.map +1 -0
  274. package/dist/servers/mcp.d.ts +201 -0
  275. package/dist/servers/mcp.d.ts.map +1 -0
  276. package/dist/servers/socket.d.ts +121 -0
  277. package/dist/servers/socket.d.ts.map +1 -0
  278. package/dist/state.d.ts +24 -0
  279. package/dist/state.d.ts.map +1 -0
  280. package/dist/web/clients/socket.d.ts +37 -0
  281. package/dist/web/clients/socket.d.ts.map +1 -0
  282. package/dist/web/container.d.ts +55 -0
  283. package/dist/web/container.d.ts.map +1 -0
  284. package/dist/web/extension.d.ts +4 -0
  285. package/dist/web/extension.d.ts.map +1 -0
  286. package/dist/web/feature.d.ts +8 -0
  287. package/dist/web/feature.d.ts.map +1 -0
  288. package/dist/web/features/asset-loader.d.ts +35 -0
  289. package/dist/web/features/asset-loader.d.ts.map +1 -0
  290. package/dist/web/features/container-link.d.ts +167 -0
  291. package/dist/web/features/container-link.d.ts.map +1 -0
  292. package/dist/web/features/esbuild.d.ts +51 -0
  293. package/dist/web/features/esbuild.d.ts.map +1 -0
  294. package/dist/web/features/helpers.d.ts +140 -0
  295. package/dist/web/features/helpers.d.ts.map +1 -0
  296. package/dist/web/features/network.d.ts +69 -0
  297. package/dist/web/features/network.d.ts.map +1 -0
  298. package/dist/web/features/speech.d.ts +71 -0
  299. package/dist/web/features/speech.d.ts.map +1 -0
  300. package/dist/web/features/vault.d.ts +62 -0
  301. package/dist/web/features/vault.d.ts.map +1 -0
  302. package/dist/web/features/vm.d.ts +48 -0
  303. package/dist/web/features/vm.d.ts.map +1 -0
  304. package/dist/web/features/voice-recognition.d.ts +96 -0
  305. package/dist/web/features/voice-recognition.d.ts.map +1 -0
  306. package/dist/web/shims/isomorphic-vm.d.ts +22 -0
  307. package/dist/web/shims/isomorphic-vm.d.ts.map +1 -0
  308. package/docs/CLI.md +335 -0
  309. package/docs/CNAME +1 -0
  310. package/docs/README.md +60 -0
  311. package/docs/TABLE-OF-CONTENTS.md +183 -0
  312. package/docs/apis/clients/elevenlabs.md +308 -0
  313. package/docs/apis/clients/graph.md +107 -0
  314. package/docs/apis/clients/openai.md +429 -0
  315. package/docs/apis/clients/rest.md +161 -0
  316. package/docs/apis/clients/websocket.md +174 -0
  317. package/docs/apis/features/agi/assistant.md +625 -0
  318. package/docs/apis/features/agi/assistants-manager.md +282 -0
  319. package/docs/apis/features/agi/auto-assistant.md +279 -0
  320. package/docs/apis/features/agi/browser-use.md +802 -0
  321. package/docs/apis/features/agi/claude-code.md +884 -0
  322. package/docs/apis/features/agi/conversation-history.md +364 -0
  323. package/docs/apis/features/agi/conversation.md +548 -0
  324. package/docs/apis/features/agi/docs-reader.md +99 -0
  325. package/docs/apis/features/agi/file-tools.md +163 -0
  326. package/docs/apis/features/agi/luca-coder.md +407 -0
  327. package/docs/apis/features/agi/openai-codex.md +396 -0
  328. package/docs/apis/features/agi/openapi.md +138 -0
  329. package/docs/apis/features/agi/semantic-search.md +387 -0
  330. package/docs/apis/features/agi/skills-library.md +239 -0
  331. package/docs/apis/features/node/container-link.md +192 -0
  332. package/docs/apis/features/node/content-db.md +450 -0
  333. package/docs/apis/features/node/disk-cache.md +379 -0
  334. package/docs/apis/features/node/dns.md +652 -0
  335. package/docs/apis/features/node/docker.md +706 -0
  336. package/docs/apis/features/node/downloader.md +81 -0
  337. package/docs/apis/features/node/esbuild.md +60 -0
  338. package/docs/apis/features/node/file-manager.md +191 -0
  339. package/docs/apis/features/node/fs.md +1217 -0
  340. package/docs/apis/features/node/git.md +371 -0
  341. package/docs/apis/features/node/google-auth.md +193 -0
  342. package/docs/apis/features/node/google-calendar.md +202 -0
  343. package/docs/apis/features/node/google-docs.md +173 -0
  344. package/docs/apis/features/node/google-drive.md +246 -0
  345. package/docs/apis/features/node/google-mail.md +214 -0
  346. package/docs/apis/features/node/google-sheets.md +194 -0
  347. package/docs/apis/features/node/grep.md +292 -0
  348. package/docs/apis/features/node/helpers.md +164 -0
  349. package/docs/apis/features/node/ink.md +334 -0
  350. package/docs/apis/features/node/ipc-socket.md +249 -0
  351. package/docs/apis/features/node/json-tree.md +86 -0
  352. package/docs/apis/features/node/networking.md +316 -0
  353. package/docs/apis/features/node/nlp.md +133 -0
  354. package/docs/apis/features/node/opener.md +97 -0
  355. package/docs/apis/features/node/os.md +146 -0
  356. package/docs/apis/features/node/package-finder.md +392 -0
  357. package/docs/apis/features/node/postgres.md +234 -0
  358. package/docs/apis/features/node/proc.md +399 -0
  359. package/docs/apis/features/node/process-manager.md +305 -0
  360. package/docs/apis/features/node/python.md +604 -0
  361. package/docs/apis/features/node/redis.md +380 -0
  362. package/docs/apis/features/node/repl.md +88 -0
  363. package/docs/apis/features/node/runpod.md +674 -0
  364. package/docs/apis/features/node/secure-shell.md +176 -0
  365. package/docs/apis/features/node/semantic-search.md +408 -0
  366. package/docs/apis/features/node/sqlite.md +233 -0
  367. package/docs/apis/features/node/telegram.md +279 -0
  368. package/docs/apis/features/node/transpiler.md +74 -0
  369. package/docs/apis/features/node/tts.md +133 -0
  370. package/docs/apis/features/node/ui.md +701 -0
  371. package/docs/apis/features/node/vault.md +59 -0
  372. package/docs/apis/features/node/vm.md +75 -0
  373. package/docs/apis/features/node/yaml-tree.md +85 -0
  374. package/docs/apis/features/node/yaml.md +176 -0
  375. package/docs/apis/features/web/asset-loader.md +59 -0
  376. package/docs/apis/features/web/container-link.md +192 -0
  377. package/docs/apis/features/web/esbuild.md +54 -0
  378. package/docs/apis/features/web/helpers.md +164 -0
  379. package/docs/apis/features/web/network.md +44 -0
  380. package/docs/apis/features/web/speech.md +69 -0
  381. package/docs/apis/features/web/vault.md +59 -0
  382. package/docs/apis/features/web/vm.md +75 -0
  383. package/docs/apis/features/web/voice.md +84 -0
  384. package/docs/apis/servers/express.md +171 -0
  385. package/docs/apis/servers/mcp.md +238 -0
  386. package/docs/apis/servers/websocket.md +170 -0
  387. package/docs/bootstrap/CLAUDE.md +101 -0
  388. package/docs/bootstrap/SKILL.md +341 -0
  389. package/docs/bootstrap/templates/about-command.ts +41 -0
  390. package/docs/bootstrap/templates/docs-models.ts +22 -0
  391. package/docs/bootstrap/templates/docs-readme.md +43 -0
  392. package/docs/bootstrap/templates/example-feature.ts +53 -0
  393. package/docs/bootstrap/templates/health-endpoint.ts +15 -0
  394. package/docs/bootstrap/templates/luca-cli.ts +30 -0
  395. package/docs/bootstrap/templates/runme.md +54 -0
  396. package/docs/challenges/caching-proxy.md +16 -0
  397. package/docs/challenges/content-db-round-trip.md +14 -0
  398. package/docs/challenges/custom-command.md +9 -0
  399. package/docs/challenges/file-watcher-pipeline.md +11 -0
  400. package/docs/challenges/grep-audit-report.md +15 -0
  401. package/docs/challenges/multi-feature-dashboard.md +14 -0
  402. package/docs/challenges/process-orchestrator.md +17 -0
  403. package/docs/challenges/rest-api-server-with-client.md +12 -0
  404. package/docs/challenges/script-runner-with-vm.md +11 -0
  405. package/docs/challenges/simple-rest-api.md +15 -0
  406. package/docs/challenges/websocket-serve-and-client.md +11 -0
  407. package/docs/challenges/yaml-config-system.md +14 -0
  408. package/docs/command-system-overhaul.md +94 -0
  409. package/docs/documentation-audit.md +134 -0
  410. package/docs/examples/assistant/CORE.md +18 -0
  411. package/docs/examples/assistant/hooks.ts +3 -0
  412. package/docs/examples/assistant/tools.ts +10 -0
  413. package/docs/examples/assistant-hooks-reference.ts +171 -0
  414. package/docs/examples/assistant-with-process-manager.md +84 -0
  415. package/docs/examples/content-db.md +77 -0
  416. package/docs/examples/disk-cache.md +83 -0
  417. package/docs/examples/docker.md +101 -0
  418. package/docs/examples/downloader.md +70 -0
  419. package/docs/examples/entity.md +124 -0
  420. package/docs/examples/esbuild.md +80 -0
  421. package/docs/examples/feature-as-tool-provider.md +143 -0
  422. package/docs/examples/file-manager.md +82 -0
  423. package/docs/examples/fs.md +83 -0
  424. package/docs/examples/git.md +85 -0
  425. package/docs/examples/google-auth.md +88 -0
  426. package/docs/examples/google-calendar.md +94 -0
  427. package/docs/examples/google-docs.md +82 -0
  428. package/docs/examples/google-drive.md +96 -0
  429. package/docs/examples/google-sheets.md +95 -0
  430. package/docs/examples/grep.md +85 -0
  431. package/docs/examples/ink-blocks.md +75 -0
  432. package/docs/examples/ink-renderer.md +41 -0
  433. package/docs/examples/ink.md +103 -0
  434. package/docs/examples/ipc-socket.md +103 -0
  435. package/docs/examples/json-tree.md +91 -0
  436. package/docs/examples/networking.md +58 -0
  437. package/docs/examples/nlp.md +91 -0
  438. package/docs/examples/opener.md +78 -0
  439. package/docs/examples/os.md +72 -0
  440. package/docs/examples/package-finder.md +89 -0
  441. package/docs/examples/postgres.md +91 -0
  442. package/docs/examples/proc.md +81 -0
  443. package/docs/examples/process-manager.md +79 -0
  444. package/docs/examples/python.md +132 -0
  445. package/docs/examples/repl.md +93 -0
  446. package/docs/examples/runpod.md +119 -0
  447. package/docs/examples/secure-shell.md +92 -0
  448. package/docs/examples/sqlite.md +86 -0
  449. package/docs/examples/structured-output-with-assistants.md +144 -0
  450. package/docs/examples/telegram.md +77 -0
  451. package/docs/examples/tts.md +86 -0
  452. package/docs/examples/ui.md +80 -0
  453. package/docs/examples/vault.md +70 -0
  454. package/docs/examples/vm.md +86 -0
  455. package/docs/examples/websocket-ask-and-reply-example.md +128 -0
  456. package/docs/examples/yaml-tree.md +93 -0
  457. package/docs/examples/yaml.md +104 -0
  458. package/docs/ideas/assistant-factory-pattern.md +142 -0
  459. package/docs/in-memory-fs.md +4 -0
  460. package/docs/introspection-audit.md +49 -0
  461. package/docs/introspection.md +164 -0
  462. package/docs/mcp/readme.md +162 -0
  463. package/docs/models.ts +41 -0
  464. package/docs/philosophy.md +86 -0
  465. package/docs/principles.md +7 -0
  466. package/docs/prompts/audit-codebase-for-failures-to-use-the-container.md +34 -0
  467. package/docs/prompts/check-for-undocumented-features.md +27 -0
  468. package/docs/prompts/mcp-test-easy-command.md +27 -0
  469. package/docs/scaffolds/client.md +149 -0
  470. package/docs/scaffolds/command.md +120 -0
  471. package/docs/scaffolds/endpoint.md +171 -0
  472. package/docs/scaffolds/feature.md +158 -0
  473. package/docs/scaffolds/selector.md +91 -0
  474. package/docs/scaffolds/server.md +196 -0
  475. package/docs/selectors.md +115 -0
  476. package/docs/sessions/custom-command/attempt-log-2.md +195 -0
  477. package/docs/sessions/file-watcher-pipeline/attempt-log-1.md +728 -0
  478. package/docs/sessions/file-watcher-pipeline/attempt-log-2.md +555 -0
  479. package/docs/sessions/grep-audit-report/attempt-log-1.md +289 -0
  480. package/docs/sessions/multi-feature-dashboard/attempt-log-2.md +679 -0
  481. package/docs/sessions/rest-api-server-with-client/attempt-log-1.md +1 -0
  482. package/docs/sessions/rest-api-server-with-client/attempt-log-3.md +920 -0
  483. package/docs/sessions/simple-rest-api/attempt-log-1.md +593 -0
  484. package/docs/sessions/websocket-serve-and-client/attempt-log-2.md +995 -0
  485. package/docs/tutorials/00-bootstrap.md +166 -0
  486. package/docs/tutorials/01-getting-started.md +106 -0
  487. package/docs/tutorials/02-container.md +210 -0
  488. package/docs/tutorials/03-scripts.md +194 -0
  489. package/docs/tutorials/04-features-overview.md +196 -0
  490. package/docs/tutorials/05-state-and-events.md +171 -0
  491. package/docs/tutorials/06-servers.md +157 -0
  492. package/docs/tutorials/07-endpoints.md +198 -0
  493. package/docs/tutorials/08-commands.md +252 -0
  494. package/docs/tutorials/09-clients.md +162 -0
  495. package/docs/tutorials/10-creating-features.md +203 -0
  496. package/docs/tutorials/11-contentbase.md +191 -0
  497. package/docs/tutorials/12-assistants.md +215 -0
  498. package/docs/tutorials/13-introspection.md +157 -0
  499. package/docs/tutorials/14-type-system.md +174 -0
  500. package/docs/tutorials/15-project-patterns.md +222 -0
  501. package/docs/tutorials/16-google-features.md +534 -0
  502. package/docs/tutorials/17-tui-blocks.md +530 -0
  503. package/docs/tutorials/18-semantic-search.md +334 -0
  504. package/docs/tutorials/19-python-sessions.md +401 -0
  505. package/docs/tutorials/20-browser-esm.md +234 -0
  506. package/index.html +1430 -0
  507. package/index.ts +1 -0
  508. package/install.sh +84 -0
  509. package/luca.cli.ts +16 -0
  510. package/luca.console.ts +9 -0
  511. package/main.py +6 -0
  512. package/package.json +219 -66
  513. package/public/index.html +1430 -0
  514. package/public/slides-ai-native.html +902 -0
  515. package/public/slides-intro.html +974 -0
  516. package/pyproject.toml +7 -0
  517. package/scripts/build-web.ts +28 -0
  518. package/scripts/examples/ask-luca-expert.ts +42 -0
  519. package/scripts/examples/assistant-questions.ts +12 -0
  520. package/scripts/examples/excalidraw-expert.ts +75 -0
  521. package/scripts/examples/expert-chat.ts +0 -0
  522. package/scripts/examples/file-manager.ts +14 -0
  523. package/scripts/examples/ideas.ts +12 -0
  524. package/scripts/examples/interactive-chat.ts +20 -0
  525. package/scripts/examples/openai-tool-calls.ts +113 -0
  526. package/scripts/examples/opening-a-web-browser.ts +5 -0
  527. package/scripts/examples/telegram-bot.ts +79 -0
  528. package/scripts/examples/using-assistant-with-mcp.ts +555 -0
  529. package/scripts/examples/using-claude-code.ts +10 -0
  530. package/scripts/examples/using-contentdb.ts +35 -0
  531. package/scripts/examples/using-conversations.ts +35 -0
  532. package/scripts/examples/using-disk-cache.ts +10 -0
  533. package/scripts/examples/using-docker-shell.ts +75 -0
  534. package/scripts/examples/using-elevenlabs.ts +25 -0
  535. package/scripts/examples/using-google-calendar.ts +57 -0
  536. package/scripts/examples/using-google-docs.ts +74 -0
  537. package/scripts/examples/using-google-drive.ts +74 -0
  538. package/scripts/examples/using-google-sheets.ts +89 -0
  539. package/scripts/examples/using-nlp.ts +55 -0
  540. package/scripts/examples/using-ollama.ts +11 -0
  541. package/scripts/examples/using-postgres.ts +55 -0
  542. package/scripts/examples/using-runpod.ts +32 -0
  543. package/scripts/examples/using-tts.ts +40 -0
  544. package/scripts/scaffold.ts +391 -0
  545. package/scripts/scratch.ts +15 -0
  546. package/scripts/stamp-build.sh +12 -0
  547. package/scripts/test-assistant-hooks.ts +13 -0
  548. package/scripts/test-docs-reader.ts +10 -0
  549. package/scripts/test-linux-binary.sh +80 -0
  550. package/scripts/update-introspection-data.ts +58 -0
  551. package/src/agi/README.md +14 -0
  552. package/src/agi/container.server.ts +152 -0
  553. package/src/agi/endpoints/ask.ts +60 -0
  554. package/src/agi/endpoints/conversations/[id].ts +45 -0
  555. package/src/agi/endpoints/conversations.ts +31 -0
  556. package/src/agi/endpoints/experts.ts +37 -0
  557. package/src/agi/feature.ts +13 -0
  558. package/src/agi/features/agent-memory.ts +694 -0
  559. package/src/agi/features/assistant.ts +1624 -0
  560. package/src/agi/features/assistants-manager.ts +418 -0
  561. package/src/agi/features/autonomous-assistant.ts +431 -0
  562. package/src/agi/features/browser-use.ts +653 -0
  563. package/src/agi/features/claude-code.ts +1538 -0
  564. package/src/agi/features/coding-tools.ts +175 -0
  565. package/src/agi/features/conversation-history.ts +495 -0
  566. package/src/agi/features/conversation.ts +1323 -0
  567. package/src/agi/features/docs-reader.ts +167 -0
  568. package/src/agi/features/file-tools.ts +293 -0
  569. package/src/agi/features/luca-coder.ts +639 -0
  570. package/src/agi/features/openai-codex.ts +651 -0
  571. package/src/agi/features/openapi.ts +445 -0
  572. package/src/agi/features/skills-library.ts +478 -0
  573. package/src/agi/index.ts +6 -0
  574. package/src/agi/lib/interceptor-chain.ts +89 -0
  575. package/src/agi/lib/token-counter.ts +122 -0
  576. package/src/bootstrap/generated.ts +9792 -0
  577. package/src/browser.ts +25 -0
  578. package/src/bus.ts +122 -0
  579. package/src/cli/build-info.ts +4 -0
  580. package/src/cli/cli.ts +355 -0
  581. package/src/client.ts +170 -0
  582. package/src/clients/civitai/index.ts +537 -0
  583. package/src/clients/client-template.ts +41 -0
  584. package/src/clients/comfyui/index.ts +604 -0
  585. package/src/clients/elevenlabs/index.ts +317 -0
  586. package/src/clients/graph.ts +87 -0
  587. package/src/clients/openai/index.ts +456 -0
  588. package/src/clients/rest.ts +207 -0
  589. package/src/clients/supabase/index.ts +357 -0
  590. package/src/clients/voicebox/index.ts +300 -0
  591. package/src/clients/websocket.ts +251 -0
  592. package/src/command.ts +505 -0
  593. package/src/commands/bootstrap.ts +244 -0
  594. package/src/commands/chat.ts +308 -0
  595. package/src/commands/code.ts +371 -0
  596. package/src/commands/console.ts +189 -0
  597. package/src/commands/describe.ts +243 -0
  598. package/src/commands/eval.ts +121 -0
  599. package/src/commands/help.ts +240 -0
  600. package/src/commands/index.ts +19 -0
  601. package/src/commands/introspect.ts +218 -0
  602. package/src/commands/mcp.ts +64 -0
  603. package/src/commands/prompt.ts +982 -0
  604. package/src/commands/run.ts +278 -0
  605. package/src/commands/sandbox-mcp.ts +343 -0
  606. package/src/commands/save-api-docs.ts +51 -0
  607. package/src/commands/scaffold.ts +225 -0
  608. package/src/commands/select.ts +99 -0
  609. package/src/commands/serve.ts +208 -0
  610. package/src/container-describer.ts +1084 -0
  611. package/src/container.ts +1186 -0
  612. package/src/endpoint.ts +365 -0
  613. package/src/entity.ts +173 -0
  614. package/src/feature.ts +118 -0
  615. package/src/graft.ts +181 -0
  616. package/src/hash-object.ts +97 -0
  617. package/src/helper.ts +849 -0
  618. package/src/introspection/generated.agi.ts +40208 -0
  619. package/src/introspection/generated.node.ts +28686 -0
  620. package/src/introspection/generated.web.ts +2251 -0
  621. package/src/introspection/index.ts +296 -0
  622. package/src/introspection/scan.ts +1131 -0
  623. package/src/node/container.ts +409 -0
  624. package/src/node/feature.ts +13 -0
  625. package/src/node/features/container-link.ts +559 -0
  626. package/src/node/features/content-db.ts +812 -0
  627. package/src/node/features/disk-cache.ts +388 -0
  628. package/src/node/features/dns.ts +669 -0
  629. package/src/node/features/docker.ts +921 -0
  630. package/src/node/features/downloader.ts +79 -0
  631. package/src/node/features/figlet-fonts.ts +600 -0
  632. package/src/node/features/file-manager.ts +535 -0
  633. package/src/node/features/fs.ts +1050 -0
  634. package/src/node/features/git.ts +592 -0
  635. package/src/node/features/google-auth.ts +504 -0
  636. package/src/node/features/google-calendar.ts +306 -0
  637. package/src/node/features/google-docs.ts +412 -0
  638. package/src/node/features/google-drive.ts +346 -0
  639. package/src/node/features/google-mail.ts +540 -0
  640. package/src/node/features/google-sheets.ts +286 -0
  641. package/src/node/features/grep.ts +427 -0
  642. package/src/node/features/helpers.ts +735 -0
  643. package/src/node/features/ink.ts +490 -0
  644. package/src/node/features/ipc-socket.ts +649 -0
  645. package/src/node/features/json-tree.ts +170 -0
  646. package/src/node/features/networking.ts +961 -0
  647. package/src/node/features/nlp.ts +212 -0
  648. package/src/node/features/opener.ts +180 -0
  649. package/src/node/features/os.ts +403 -0
  650. package/src/node/features/package-finder.ts +540 -0
  651. package/src/node/features/postgres.ts +289 -0
  652. package/src/node/features/proc.ts +503 -0
  653. package/src/node/features/process-manager.ts +844 -0
  654. package/src/node/features/python.ts +906 -0
  655. package/src/node/features/redis.ts +446 -0
  656. package/src/node/features/repl.ts +212 -0
  657. package/src/node/features/runpod.ts +811 -0
  658. package/src/node/features/secure-shell.ts +267 -0
  659. package/src/node/features/semantic-search.ts +935 -0
  660. package/src/node/features/sqlite.ts +289 -0
  661. package/src/node/features/telegram.ts +343 -0
  662. package/src/node/features/transpiler.ts +161 -0
  663. package/src/node/features/tts.ts +185 -0
  664. package/src/node/features/ui.ts +786 -0
  665. package/src/node/features/vault.ts +153 -0
  666. package/src/node/features/vm.ts +462 -0
  667. package/src/node/features/yaml-tree.ts +148 -0
  668. package/src/node/features/yaml.ts +133 -0
  669. package/src/node.ts +76 -0
  670. package/src/python/bridge.py +220 -0
  671. package/src/python/generated.ts +227 -0
  672. package/src/react/index.ts +175 -0
  673. package/src/registry.ts +210 -0
  674. package/src/scaffolds/generated.ts +1815 -0
  675. package/src/scaffolds/template.ts +46 -0
  676. package/src/schemas/base.ts +296 -0
  677. package/src/selector.ts +352 -0
  678. package/src/server.ts +229 -0
  679. package/src/servers/express.ts +283 -0
  680. package/src/servers/mcp.ts +802 -0
  681. package/src/servers/socket.ts +258 -0
  682. package/src/state.ts +101 -0
  683. package/src/web/clients/socket.ts +99 -0
  684. package/src/web/container.ts +75 -0
  685. package/src/web/extension.ts +30 -0
  686. package/src/web/feature.ts +12 -0
  687. package/src/web/features/asset-loader.ts +72 -0
  688. package/src/web/features/container-link.ts +382 -0
  689. package/src/web/features/esbuild.ts +93 -0
  690. package/src/web/features/helpers.ts +269 -0
  691. package/src/web/features/network.ts +85 -0
  692. package/src/web/features/speech.ts +104 -0
  693. package/src/web/features/vault.ts +207 -0
  694. package/src/web/features/vm.ts +85 -0
  695. package/src/web/features/voice-recognition.ts +161 -0
  696. package/src/web/shims/isomorphic-vm.ts +149 -0
  697. package/test/assistant-hooks.test.ts +306 -0
  698. package/test/assistant.test.ts +81 -0
  699. package/test/bus.test.ts +134 -0
  700. package/test/clients-servers.test.ts +217 -0
  701. package/test/command.test.ts +267 -0
  702. package/test/container-link.test.ts +274 -0
  703. package/test/conversation.test.ts +220 -0
  704. package/test/features.test.ts +160 -0
  705. package/test/fork-and-research.test.ts +450 -0
  706. package/test/integration.test.ts +787 -0
  707. package/test/interceptor-chain.test.ts +61 -0
  708. package/test/node-container.test.ts +121 -0
  709. package/test/python-session.test.ts +105 -0
  710. package/test/rate-limit.test.ts +272 -0
  711. package/test/semantic-search.test.ts +550 -0
  712. package/test/state.test.ts +121 -0
  713. package/test/vm-context.test.ts +146 -0
  714. package/test/vm-loadmodule.test.ts +213 -0
  715. package/test/websocket-ask.test.ts +101 -0
  716. package/test-integration/assistant.test.ts +138 -0
  717. package/test-integration/assistants-manager.test.ts +113 -0
  718. package/test-integration/claude-code.test.ts +98 -0
  719. package/test-integration/conversation-history.test.ts +205 -0
  720. package/test-integration/conversation.test.ts +137 -0
  721. package/test-integration/elevenlabs.test.ts +55 -0
  722. package/test-integration/google-services.test.ts +80 -0
  723. package/test-integration/helpers.ts +89 -0
  724. package/test-integration/memory.test.ts +204 -0
  725. package/test-integration/openai-codex.test.ts +93 -0
  726. package/test-integration/runpod.test.ts +58 -0
  727. package/test-integration/server-endpoints.test.ts +97 -0
  728. package/test-integration/telegram.test.ts +46 -0
  729. package/tsconfig.build.json +12 -0
  730. package/tsconfig.json +58 -0
  731. package/uv.lock +8 -0
  732. package/LICENSE +0 -21
  733. package/dist/cli/index.d.ts +0 -2
  734. package/dist/cli/index.js +0 -5
  735. package/dist/cli/run.d.ts +0 -12
  736. package/dist/cli/run.js +0 -42
  737. package/dist/config/consts.d.ts +0 -2
  738. package/dist/config/consts.js +0 -29
  739. package/dist/config/default.d.ts +0 -8
  740. package/dist/config/default.js +0 -15
  741. package/dist/config/initConfig.d.ts +0 -1
  742. package/dist/config/initConfig.js +0 -52
  743. package/dist/config/openConfig.d.ts +0 -2
  744. package/dist/config/openConfig.js +0 -24
  745. package/dist/config/runConfig.d.ts +0 -3
  746. package/dist/config/runConfig.js +0 -117
  747. package/dist/config/types.d.ts +0 -13
  748. package/dist/config/types.js +0 -2
  749. package/dist/index.d.ts +0 -1
  750. package/dist/index.js +0 -5
  751. package/dist/utils/common.d.ts +0 -2
  752. package/dist/utils/common.js +0 -52
  753. package/dist/utils/index.d.ts +0 -1
  754. package/dist/utils/index.js +0 -17
@@ -0,0 +1,225 @@
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 { scaffolds, assistantFiles } from '../scaffolds/generated.js'
6
+ import { generateScaffold, toCamelCase, toKebabCase } from '../scaffolds/template.js'
7
+
8
+ declare module '../command.js' {
9
+ interface AvailableCommands {
10
+ scaffold: ReturnType<typeof commands.registerHandler>
11
+ }
12
+ }
13
+
14
+ const validTypes = [...Object.keys(scaffolds), 'assistant']
15
+
16
+ export const argsSchema = CommandOptionsSchema.extend({
17
+ description: z.string().optional().describe('Brief description of the helper'),
18
+ output: z.string().optional().describe('Output file path (overrides default location)'),
19
+ print: z.boolean().default(false).describe('Print the generated code to stdout instead of writing a file'),
20
+ tutorial: z.boolean().default(false).describe('Show the full tutorial instead of generating code'),
21
+ })
22
+
23
+ const TYPE_INFO: Record<string, { what: string; where: string; run: string }> = {
24
+ feature: {
25
+ what: 'A container-managed capability (caching, encryption, custom I/O)',
26
+ where: 'features/<name>.ts',
27
+ run: 'container.feature(\'<name>\') in any command, endpoint, or script',
28
+ },
29
+ client: {
30
+ what: 'A connection to an external service (REST API, WebSocket, GraphQL)',
31
+ where: 'clients/<name>.ts',
32
+ run: 'container.client(\'<name>\') in any command, endpoint, or script',
33
+ },
34
+ server: {
35
+ what: 'A listener accepting incoming connections (HTTP, WebSocket, custom protocol)',
36
+ where: 'servers/<name>.ts',
37
+ run: 'container.server(\'<name>\') then .start()',
38
+ },
39
+ command: {
40
+ what: 'A CLI task that extends `luca` (build scripts, generators, automation)',
41
+ where: 'commands/<name>.ts',
42
+ run: 'luca <name>',
43
+ },
44
+ endpoint: {
45
+ what: 'A REST API route auto-discovered by `luca serve`',
46
+ where: 'endpoints/<name>.ts',
47
+ run: 'luca serve → GET/POST /api/<name>',
48
+ },
49
+ selector: {
50
+ what: 'A cached data query — returns structured results from the container',
51
+ where: 'selectors/<name>.ts',
52
+ run: 'luca select <name> or container.select(\'<name>\')',
53
+ },
54
+ assistant: {
55
+ what: 'An AI assistant with a system prompt, tools, and lifecycle hooks',
56
+ where: 'assistants/<name>/',
57
+ run: 'luca chat <name>',
58
+ },
59
+ }
60
+
61
+ export default async function scaffoldCommand(options: z.infer<typeof argsSchema>, context: ContainerContext) {
62
+ const container = context.container as any
63
+ const args = container.argv._ as string[]
64
+ const ui = container.feature('ui')
65
+
66
+ // args: ["scaffold", type?, name?]
67
+ const type = args[1]
68
+ const name = args[2]
69
+
70
+ // ── No type or invalid type: show full help ──────────────────
71
+ if (!type || !validTypes.includes(type)) {
72
+ ui.print.cyan('\n luca scaffold — generate boilerplate for luca helpers\n')
73
+ ui.print(' Usage: luca scaffold <type> <name> [options]\n')
74
+ ui.print(' Options:')
75
+ ui.print(' --description "..." Brief description (shows in help text and docs)')
76
+ ui.print(' --output <path> Override the default output file path')
77
+ ui.print(' --print Print to stdout instead of writing a file')
78
+ ui.print(' --tutorial Show the full guide for a type instead of generating code\n')
79
+
80
+ ui.print(' Types:\n')
81
+ for (const [t, info] of Object.entries(TYPE_INFO)) {
82
+ ui.print.green(` ${t}`)
83
+ ui.print(` ${info.what}`)
84
+ ui.print.dim(` File: ${info.where} → Run: ${info.run}`)
85
+ ui.print('')
86
+ }
87
+
88
+ ui.print(' Examples:\n')
89
+ ui.print(' # Generate a command (writes to commands/deploy.ts)')
90
+ ui.print(' luca scaffold command deploy --description "Deploy to production"\n')
91
+ ui.print(' # Generate a feature (writes to features/disk-cache.ts)')
92
+ ui.print(' luca scaffold feature disk-cache --description "File-backed key-value cache"\n')
93
+ ui.print(' # Print to stdout instead of writing')
94
+ ui.print(' luca scaffold endpoint users --print\n')
95
+ ui.print(' # Read the full tutorial for a type')
96
+ ui.print(' luca scaffold feature --tutorial')
97
+ ui.print(' luca scaffold endpoint --tutorial\n')
98
+
99
+ ui.print(' Workflow:\n')
100
+ ui.print(' 1. luca scaffold <type> <name> Generate the file')
101
+ ui.print(' 2. Edit the generated file — add your logic')
102
+ ui.print(' 3. luca about Verify it was discovered')
103
+ ui.print(' 4. luca describe <name> See the generated docs\n')
104
+
105
+ if (type && !validTypes.includes(type)) {
106
+ ui.print.yellow(` "${type}" is not a valid type. Available: ${validTypes.join(', ')}\n`)
107
+ }
108
+ return
109
+ }
110
+
111
+ // ── Tutorial mode ────────────────────────────────────────────
112
+ if (options.tutorial) {
113
+ const scaffold = scaffolds[type]
114
+ if (scaffold?.tutorial) {
115
+ console.log(ui.markdown(scaffold.tutorial))
116
+ } else {
117
+ ui.print.yellow(`No tutorial available for type: ${type}`)
118
+ }
119
+ return
120
+ }
121
+
122
+ // ── Missing name ─────────────────────────────────────────────
123
+ if (!name) {
124
+ const info = TYPE_INFO[type]
125
+ ui.print.cyan(`\n luca scaffold ${type} <name> [options]\n`)
126
+ ui.print(` ${info?.what || ''}\n`)
127
+ ui.print(' Examples:')
128
+ if (type === 'feature') {
129
+ ui.print(` luca scaffold feature diskCache --description "File-backed cache"`)
130
+ ui.print(` luca scaffold feature diskCache --output features/diskCache.ts`)
131
+ } else if (type === 'client') {
132
+ ui.print(` luca scaffold client github --description "GitHub API client"`)
133
+ ui.print(` luca scaffold client github --output clients/github.ts`)
134
+ } else if (type === 'server') {
135
+ ui.print(` luca scaffold server grpc --description "gRPC server"`)
136
+ ui.print(` luca scaffold server grpc --output servers/grpc.ts`)
137
+ } else if (type === 'command') {
138
+ ui.print(` luca scaffold command deploy --description "Deploy to production"`)
139
+ ui.print(` luca scaffold command deploy --output commands/deploy.ts`)
140
+ } else if (type === 'endpoint') {
141
+ ui.print(` luca scaffold endpoint users --description "User management API"`)
142
+ ui.print(` luca scaffold endpoint users --output endpoints/users.ts`)
143
+ } else if (type === 'selector') {
144
+ ui.print(` luca scaffold selector package-info --description "Returns parsed package.json data"`)
145
+ ui.print(` luca scaffold selector package-info --output selectors/package-info.ts`)
146
+ } else if (type === 'assistant') {
147
+ ui.print(` luca scaffold assistant chief-of-staff`)
148
+ ui.print(` luca scaffold assistant chief-of-staff --output assistants/chief-of-staff`)
149
+ }
150
+ ui.print(`\n luca scaffold ${type} --tutorial Full guide with patterns and conventions\n`)
151
+ return
152
+ }
153
+
154
+ // ── Assistant: multi-file scaffold ───────────────────────────
155
+ if (type === 'assistant') {
156
+ if (!assistantFiles || Object.keys(assistantFiles).length === 0) {
157
+ ui.print.yellow('No assistant scaffold files bundled. Rebuild with: luca build-scaffolds')
158
+ return
159
+ }
160
+
161
+ const outputDir = options.output || `assistants/${toCamelCase(name)}`
162
+ const fs = container.feature('fs')
163
+ const resolvedDir = container.paths.resolve(outputDir)
164
+
165
+ await fs.ensureFolder(resolvedDir)
166
+
167
+ for (const [fileName, content] of Object.entries(assistantFiles)) {
168
+ const filePath = container.paths.resolve(resolvedDir, fileName)
169
+ await fs.writeFileAsync(filePath, content)
170
+ }
171
+
172
+ ui.print.green(`\n ✓ Scaffolded assistant "${name}" in ${outputDir}/`)
173
+ ui.print.dim(` CORE.md — system prompt (edit this to define your assistant's personality)`)
174
+ ui.print.dim(` tools.ts — tool functions the assistant can call`)
175
+ ui.print.dim(` hooks.ts — lifecycle event handlers`)
176
+ ui.print(`\n Start chatting: luca chat ${name}\n`)
177
+ return
178
+ }
179
+
180
+ const code = generateScaffold(type, name, options.description)
181
+
182
+ if (!code) {
183
+ ui.print.yellow(`No scaffold template available for type: ${type}`)
184
+ return
185
+ }
186
+
187
+ // --print: just output to stdout
188
+ if (options.print) {
189
+ console.log(code)
190
+ return
191
+ }
192
+
193
+ // Default: write to file
194
+ const kebabName = toKebabCase(name)
195
+ const defaultPaths: Record<string, string> = {
196
+ feature: `features/${kebabName}.ts`,
197
+ client: `clients/${kebabName}.ts`,
198
+ server: `servers/${kebabName}.ts`,
199
+ command: `commands/${kebabName}.ts`,
200
+ endpoint: `endpoints/${kebabName}.ts`,
201
+ selector: `selectors/${kebabName}.ts`,
202
+ }
203
+ const outputPath = options.output || defaultPaths[type] || `${type}s/${kebabName}.ts`
204
+ const fs = container.feature('fs')
205
+ const resolvedPath = container.paths.resolve(outputPath)
206
+
207
+ // Check if file already exists
208
+ if (await fs.existsAsync(resolvedPath)) {
209
+ ui.print.yellow(` ✗ File already exists: ${outputPath}`)
210
+ ui.print.dim(` Use --output <path> to write to a different location, or --print to view the code\n`)
211
+ return
212
+ }
213
+
214
+ const dir = container.paths.resolve(outputPath, '..')
215
+ await fs.ensureFolder(dir)
216
+ await fs.writeFileAsync(resolvedPath, code)
217
+ ui.print.green(` ✓ Wrote ${type} scaffold to ${outputPath}`)
218
+ ui.print.dim(` Next: edit the file, then run \`luca about\` to verify discovery\n`)
219
+ }
220
+
221
+ commands.registerHandler('scaffold', {
222
+ description: 'Generate boilerplate for a new luca feature, client, server, command, endpoint, or assistant',
223
+ argsSchema,
224
+ handler: scaffoldCommand,
225
+ })
@@ -0,0 +1,99 @@
1
+ import { z } from 'zod'
2
+ import { commands } from '../command.js'
3
+ import { selectors } from '../selector.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
+ select: ReturnType<typeof commands.registerHandler>
10
+ }
11
+ }
12
+
13
+ export const argsSchema = CommandOptionsSchema.extend({
14
+ json: z.boolean().default(false).describe('Output result as raw JSON (data only, no metadata)'),
15
+ noCache: z.boolean().default(false).describe('Skip cache lookup and force a fresh run'),
16
+ }).passthrough()
17
+
18
+ export default async function selectCommand(options: z.infer<typeof argsSchema>, context: ContainerContext) {
19
+ const container = context.container as any
20
+ const ui = container.feature('ui')
21
+ const args = container.argv._ as string[]
22
+ const name = args[1]
23
+
24
+ // Discover project selectors
25
+ await container.helpers.discoverAll()
26
+
27
+ if (!name) {
28
+ const available = selectors.available
29
+ if (available.length === 0) {
30
+ ui.print('No selectors available.')
31
+ ui.print.dim('Create one: luca scaffold selector <name>')
32
+ } else {
33
+ ui.print.cyan('\n luca select <name> [--json] [--no-cache]\n')
34
+ ui.print(' Available selectors:\n')
35
+ for (const s of available) {
36
+ ui.print.green(` ${s}`)
37
+ }
38
+ ui.print('')
39
+ }
40
+ return
41
+ }
42
+
43
+ const instance = container.select(name)
44
+
45
+ // Pass remaining args (after command name and selector name) as input.
46
+ // Pull from container.argv directly — the select command's own argsSchema
47
+ // would otherwise strip selector-specific keys during Zod parse.
48
+ const rawArgv = { ...(container as any).argv }
49
+ const selectorArgs: Record<string, any> = { ...rawArgv }
50
+ delete selectorArgs._
51
+ delete selectorArgs.json
52
+ delete selectorArgs.noCache
53
+ delete selectorArgs.cache
54
+ delete selectorArgs.dispatchSource
55
+ delete selectorArgs.help
56
+ delete selectorArgs.name
57
+
58
+ // minimist turns --no-cache into { cache: false }
59
+ const skipCache = options.noCache || (container.argv.cache === false)
60
+
61
+ if (skipCache) {
62
+ // Bypass cache by calling run() directly with proper lifecycle
63
+ const Cls = instance.constructor as any
64
+ const parsed = Cls.argsSchema.parse(selectorArgs)
65
+ instance.state.set('running', true)
66
+ instance.emit('started')
67
+ let data: any
68
+ try {
69
+ data = await instance.run(parsed, instance.context)
70
+ instance.state.set('running', false)
71
+ instance.state.set('lastRanAt', Date.now())
72
+ instance.emit('completed', data)
73
+ } catch (err: any) {
74
+ instance.state.set('running', false)
75
+ instance.emit('failed', err)
76
+ throw err
77
+ }
78
+ if (options.json) {
79
+ console.log(JSON.stringify(data, null, 2))
80
+ } else {
81
+ console.log(JSON.stringify({ data, cached: false }, null, 2))
82
+ }
83
+ return
84
+ }
85
+
86
+ const result = await instance.select(selectorArgs)
87
+
88
+ if (options.json) {
89
+ console.log(JSON.stringify(result.data, null, 2))
90
+ } else {
91
+ console.log(JSON.stringify(result, null, 2))
92
+ }
93
+ }
94
+
95
+ commands.registerHandler('select', {
96
+ description: 'Run a selector and display its cached or fresh data',
97
+ argsSchema,
98
+ handler: selectCommand,
99
+ })
@@ -0,0 +1,208 @@
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 { ExpressServer } from '../servers/express.js'
6
+
7
+ declare module '../command.js' {
8
+ interface AvailableCommands {
9
+ serve: ReturnType<typeof commands.registerHandler>
10
+ }
11
+ }
12
+
13
+ export const argsSchema = CommandOptionsSchema.extend({
14
+ port: z.number().default(3000).describe('Port to listen on'),
15
+ endpointsDir: z.string().optional().describe('Directory to load endpoints from'),
16
+ staticDir: z.string().optional().describe('Directory to serve static files from'),
17
+ setup: z.string().optional().describe('Path to a TS module whose default export receives the server instance'),
18
+ cors: z.boolean().default(true).describe('Enable CORS'),
19
+ force: z.boolean().default(false).describe('Kill any process currently using the target port'),
20
+ anyPort: z.boolean().default(false).describe('Find an available port starting above 3000'),
21
+ open: z.boolean().default(true).describe('Open the server URL in Google Chrome'),
22
+ watch: z.boolean().default(false).describe('Watch endpoint files and hot-reload handlers on change'),
23
+ })
24
+
25
+ export default async function serve(options: z.infer<typeof argsSchema>, context: ContainerContext) {
26
+ const container = context.container as any
27
+ const { fs, paths, manifest, networking, proc } = container
28
+
29
+ let port = options.port
30
+ const staticDir = options.staticDir ? paths.resolve(options.staticDir) : paths.resolve('public')
31
+
32
+ if (options.anyPort) {
33
+ port = await networking.findOpenPort(3001)
34
+ }
35
+
36
+ const isPortAvailable = await networking.isPortOpen(port)
37
+ if (!isPortAvailable) {
38
+ if (!options.force) {
39
+ console.error(`Port ${port} is already in use.`)
40
+ console.error(`Use --force to kill the process on this port, or --any-port to find another port.`)
41
+ process.exit(1)
42
+ }
43
+
44
+ const pids = proc.findPidsByPort(port)
45
+ if (!pids.length) {
46
+ console.error(`Port ${port} is in use, but no PID could be discovered for termination.`)
47
+ process.exit(1)
48
+ }
49
+
50
+ for (const pid of pids) {
51
+ proc.kill(pid)
52
+ }
53
+
54
+ let portFreed = false
55
+ for (let i = 0; i < 10; i++) {
56
+ if (await networking.isPortOpen(port)) {
57
+ portFreed = true
58
+ break
59
+ }
60
+ await new Promise((resolve) => setTimeout(resolve, 100))
61
+ }
62
+
63
+ if (!portFreed) {
64
+ console.error(`Failed to free port ${port} after terminating process(es): ${pids.join(', ')}`)
65
+ process.exit(1)
66
+ }
67
+ }
68
+
69
+ // Discover the endpoints directory from the project root.
70
+ // Checks explicit flag, then common conventions, then skips if absent.
71
+ const endpointsDir = resolveEndpointsDir(options, fs, paths)
72
+
73
+ // Resolve static directory: explicit flag > public/ > cwd (if index.html exists)
74
+ let resolvedStaticDir: string | undefined
75
+ if (fs.exists(staticDir)) {
76
+ resolvedStaticDir = staticDir
77
+ } else if (fs.exists(paths.resolve('index.html'))) {
78
+ resolvedStaticDir = paths.resolve('.')
79
+ }
80
+
81
+ // If there's nothing to serve at all, bail out.
82
+ if (!endpointsDir && !resolvedStaticDir) {
83
+ console.error(`Can't figure out what to serve in this folder.`)
84
+ console.error(`Expected one of: endpoints/, src/endpoints/, public/, or an index.html in the current directory.`)
85
+ process.exit(1)
86
+ }
87
+
88
+ const expressServer = container.server('express', {
89
+ port,
90
+ cors: options.cors,
91
+ static: resolvedStaticDir,
92
+ historyFallback: resolvedStaticDir && !options.staticDir,
93
+ }) as ExpressServer
94
+
95
+ if (endpointsDir) {
96
+ await expressServer.useEndpoints(endpointsDir)
97
+
98
+ expressServer.serveOpenAPISpec({
99
+ title: manifest.name || 'API',
100
+ version: manifest.version || '0.0.0',
101
+ description: manifest.description || '',
102
+ })
103
+ }
104
+
105
+ if (options.setup) {
106
+ const setupPath = paths.resolve(options.setup)
107
+ if (!fs.exists(setupPath)) {
108
+ console.error(`Setup module not found: ${setupPath}`)
109
+ process.exit(1)
110
+ }
111
+ const vmFeature = container.feature('vm')
112
+ const mod = vmFeature.loadModule(setupPath, { server: expressServer })
113
+ const setupFn = mod.default || mod
114
+ if (typeof setupFn === 'function') {
115
+ await setupFn(expressServer)
116
+ }
117
+ }
118
+
119
+ try {
120
+ await expressServer.start({ port })
121
+ } catch (error: any) {
122
+ if (error?.code === 'EADDRINUSE') {
123
+ console.error(`Port ${port} is already in use.`)
124
+ console.error(`Use --force to kill the process on this port, or --any-port to find another port.`)
125
+ process.exit(1)
126
+ }
127
+ throw error
128
+ }
129
+
130
+ const name = manifest.name || 'Server'
131
+ console.log(`\n${name} listening on http://localhost:${port}`)
132
+
133
+ if (endpointsDir) {
134
+ console.log(`OpenAPI spec at http://localhost:${port}/openapi.json`)
135
+ }
136
+
137
+ if (options.open) {
138
+ try {
139
+ const opener = container.feature('opener')
140
+ await opener.open(`http://localhost:${port}`)
141
+ } catch (error) {
142
+ console.warn(`Could not open browser automatically: ${(error as Error).message}`)
143
+ }
144
+ }
145
+
146
+ if (resolvedStaticDir) {
147
+ console.log(`\nStatic files from ${resolvedStaticDir}`)
148
+ }
149
+
150
+ if (endpointsDir) {
151
+ if (expressServer._mountedEndpoints.length) {
152
+ console.log(`\nEndpoints:`)
153
+ for (const ep of expressServer._mountedEndpoints) {
154
+ console.log(` ${ep.methods.map((m: string) => m.toUpperCase()).join(', ').padEnd(20)} ${ep.path}`)
155
+ }
156
+ } else {
157
+ console.log(`\nNo endpoints found in ${endpointsDir}`)
158
+ }
159
+ }
160
+
161
+ if (options.watch && endpointsDir) {
162
+ const fm = container.feature('fileManager')
163
+ await fm.watch({ paths: [endpointsDir] })
164
+
165
+ fm.on('file:change', async ({ type, path: filePath }: { type: string; path: string }) => {
166
+ if (!filePath.endsWith('.ts')) return
167
+
168
+ if (type === 'change') {
169
+ try {
170
+ const ep = await expressServer.reloadEndpoint(filePath)
171
+ if (ep) {
172
+ console.log(`[watch] Reloaded ${ep.methods.map((m: string) => m.toUpperCase()).join(',')} ${ep.path}`)
173
+ }
174
+ } catch (err: any) {
175
+ console.error(`[watch] Failed to reload ${filePath}: ${err.message}`)
176
+ }
177
+ } else if (type === 'add') {
178
+ console.log(`[watch] New file detected: ${filePath} (restart to mount)`)
179
+ } else if (type === 'delete') {
180
+ console.log(`[watch] File deleted: ${filePath} (restart to unmount)`)
181
+ }
182
+ })
183
+
184
+ console.log(`\n[watch] Watching ${endpointsDir} for changes`)
185
+ }
186
+
187
+ console.log()
188
+ }
189
+
190
+ function resolveEndpointsDir(options: any, fs: any, paths: any): string | null {
191
+ if (options.endpointsDir) {
192
+ const dir = paths.resolve(options.endpointsDir)
193
+ return fs.exists(dir) ? dir : null
194
+ }
195
+
196
+ for (const candidate of ['endpoints', 'src/endpoints']) {
197
+ const dir = paths.resolve(candidate)
198
+ if (fs.exists(dir)) return dir
199
+ }
200
+
201
+ return null
202
+ }
203
+
204
+ commands.registerHandler('serve', {
205
+ description: 'Start the API server with file-based endpoints',
206
+ argsSchema,
207
+ handler: serve,
208
+ })