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,226 @@
1
+ // Auto-generated Python bridge script
2
+ // Source: src/python/bridge.py
3
+ //
4
+ // Do not edit manually. Run: luca build-python-bridge
5
+
6
+ export const bridgeScript = `#!/usr/bin/env python3
7
+ """Luca Python Bridge - persistent interactive Python session.
8
+
9
+ Communicates via JSON lines over stdin/stdout. Each request is a single
10
+ JSON object per line on stdin; each response is a single JSON object per
11
+ line on stdout. User print() output is captured per-execution via
12
+ io.StringIO so it never corrupts the protocol.
13
+
14
+ Python 3.8+ compatible (stdlib only).
15
+ """
16
+ import sys
17
+ import json
18
+ import io
19
+ import traceback
20
+ import os
21
+
22
+ # Persistent namespace shared across all exec/eval calls
23
+ _namespace = {"__builtins__": __builtins__}
24
+
25
+
26
+ def setup_sys_path(project_dir):
27
+ """Insert project_dir and common sub-paths into sys.path."""
28
+ paths_to_add = [project_dir]
29
+
30
+ # src/ layout (PEP 621 / setuptools)
31
+ src_dir = os.path.join(project_dir, "src")
32
+ if os.path.isdir(src_dir):
33
+ paths_to_add.append(src_dir)
34
+
35
+ # lib/ layout (less common but exists)
36
+ lib_dir = os.path.join(project_dir, "lib")
37
+ if os.path.isdir(lib_dir):
38
+ paths_to_add.append(lib_dir)
39
+
40
+ for p in reversed(paths_to_add):
41
+ if p not in sys.path:
42
+ sys.path.insert(0, p)
43
+
44
+
45
+ def _safe_serialize(value):
46
+ """Attempt JSON serialization; fall back to repr()."""
47
+ try:
48
+ json.dumps(value, default=str)
49
+ return value
50
+ except (TypeError, ValueError, OverflowError):
51
+ return repr(value)
52
+
53
+
54
+ def handle_exec(req):
55
+ """Execute code in the persistent namespace."""
56
+ code = req.get("code", "")
57
+ variables = req.get("variables", {})
58
+ _namespace.update(variables)
59
+
60
+ old_stdout = sys.stdout
61
+ captured = io.StringIO()
62
+ sys.stdout = captured
63
+ try:
64
+ exec(code, _namespace)
65
+ sys.stdout = old_stdout
66
+ return {"ok": True, "stdout": captured.getvalue(), "result": None}
67
+ except Exception as e:
68
+ sys.stdout = old_stdout
69
+ return {
70
+ "ok": False,
71
+ "error": str(e),
72
+ "traceback": traceback.format_exc(),
73
+ "stdout": captured.getvalue(),
74
+ }
75
+
76
+
77
+ def handle_eval(req):
78
+ """Evaluate an expression and return its value."""
79
+ expression = req.get("expression", "")
80
+
81
+ old_stdout = sys.stdout
82
+ captured = io.StringIO()
83
+ sys.stdout = captured
84
+ try:
85
+ result = eval(expression, _namespace)
86
+ sys.stdout = old_stdout
87
+ return {
88
+ "ok": True,
89
+ "result": _safe_serialize(result),
90
+ "stdout": captured.getvalue(),
91
+ }
92
+ except Exception as e:
93
+ sys.stdout = old_stdout
94
+ return {
95
+ "ok": False,
96
+ "error": str(e),
97
+ "traceback": traceback.format_exc(),
98
+ "stdout": captured.getvalue(),
99
+ }
100
+
101
+
102
+ def handle_import(req):
103
+ """Import a module into the namespace."""
104
+ module_name = req.get("module", "")
105
+ alias = req.get("alias", module_name.split(".")[-1])
106
+ try:
107
+ mod = __import__(
108
+ module_name,
109
+ fromlist=[module_name.split(".")[-1]] if "." in module_name else [],
110
+ )
111
+ _namespace[alias] = mod
112
+ return {"ok": True, "result": "Imported {} as {}".format(module_name, alias)}
113
+ except Exception as e:
114
+ return {
115
+ "ok": False,
116
+ "error": str(e),
117
+ "traceback": traceback.format_exc(),
118
+ }
119
+
120
+
121
+ def handle_call(req):
122
+ """Call a function by dotted path in the namespace."""
123
+ func_path = req.get("function", "")
124
+ args = req.get("args", [])
125
+ kwargs = req.get("kwargs", {})
126
+
127
+ old_stdout = sys.stdout
128
+ captured = io.StringIO()
129
+ sys.stdout = captured
130
+ try:
131
+ parts = func_path.split(".")
132
+ obj = _namespace[parts[0]]
133
+ for part in parts[1:]:
134
+ obj = getattr(obj, part)
135
+ result = obj(*args, **kwargs)
136
+ sys.stdout = old_stdout
137
+ return {
138
+ "ok": True,
139
+ "result": _safe_serialize(result),
140
+ "stdout": captured.getvalue(),
141
+ }
142
+ except Exception as e:
143
+ sys.stdout = old_stdout
144
+ return {
145
+ "ok": False,
146
+ "error": str(e),
147
+ "traceback": traceback.format_exc(),
148
+ "stdout": captured.getvalue(),
149
+ }
150
+
151
+
152
+ def handle_get_locals(req):
153
+ """Return all non-dunder keys from the namespace."""
154
+ safe = {}
155
+ for k, v in _namespace.items():
156
+ if k.startswith("__"):
157
+ continue
158
+ safe[k] = _safe_serialize(v)
159
+ return {"ok": True, "result": safe}
160
+
161
+
162
+ def handle_reset(req):
163
+ """Clear the namespace."""
164
+ _namespace.clear()
165
+ _namespace["__builtins__"] = __builtins__
166
+ return {"ok": True, "result": "Session reset"}
167
+
168
+
169
+ HANDLERS = {
170
+ "exec": handle_exec,
171
+ "eval": handle_eval,
172
+ "import": handle_import,
173
+ "call": handle_call,
174
+ "get_locals": handle_get_locals,
175
+ "reset": handle_reset,
176
+ }
177
+
178
+
179
+ def main():
180
+ # First line from stdin is the init handshake with project_dir
181
+ init_line = sys.stdin.readline().strip()
182
+ if init_line:
183
+ try:
184
+ init = json.loads(init_line)
185
+ if "project_dir" in init:
186
+ setup_sys_path(init["project_dir"])
187
+ except json.JSONDecodeError:
188
+ pass
189
+
190
+ # Signal ready
191
+ sys.stdout.write(json.dumps({"ok": True, "type": "ready"}) + "\\n")
192
+ sys.stdout.flush()
193
+
194
+ # Main loop: read JSON commands, execute, respond
195
+ for line in sys.stdin:
196
+ line = line.strip()
197
+ if not line:
198
+ continue
199
+
200
+ try:
201
+ req = json.loads(line)
202
+ except json.JSONDecodeError as e:
203
+ resp = {"ok": False, "error": "Invalid JSON: {}".format(e)}
204
+ sys.stdout.write(json.dumps(resp) + "\\n")
205
+ sys.stdout.flush()
206
+ continue
207
+
208
+ req_id = req.get("id")
209
+ req_type = req.get("type", "exec")
210
+ handler = HANDLERS.get(req_type)
211
+
212
+ if not handler:
213
+ resp = {"ok": False, "error": "Unknown request type: {}".format(req_type)}
214
+ else:
215
+ resp = handler(req)
216
+
217
+ if req_id:
218
+ resp["id"] = req_id
219
+
220
+ sys.stdout.write(json.dumps(resp, default=str) + "\\n")
221
+ sys.stdout.flush()
222
+
223
+
224
+ if __name__ == "__main__":
225
+ main()
226
+ `
@@ -0,0 +1,175 @@
1
+ import { createContext, useContext, useRef, useState, useEffect, useCallback, useMemo, createElement } from 'react'
2
+ import type { ReactNode } from 'react'
3
+ import type { Container, AvailableFeatures } from '../container'
4
+ import type { Helper } from '../helper'
5
+ import type { StateChangeType } from '../state'
6
+
7
+ // ── Context & Provider ──────────────────────────────────────────────
8
+
9
+ const ContainerContext = createContext<Container | null>(null)
10
+
11
+ function ContainerProvider({ container, children }: { container: Container; children: ReactNode }) {
12
+ return createElement(ContainerContext.Provider, { value: container }, children)
13
+ }
14
+
15
+ function useContainer<T extends Container = Container>(): T {
16
+ const container = useContext(ContainerContext)
17
+ if (!container) {
18
+ throw new Error('useContainer must be used within a <ContainerProvider>')
19
+ }
20
+ return container as T
21
+ }
22
+
23
+ // ── State Hooks ─────────────────────────────────────────────────────
24
+
25
+ type HasState = { state: { current: any; version: number; observe: (cb: (changeType: StateChangeType, key: any, value?: any) => void) => () => void } }
26
+
27
+ function useContainerState<T extends object = any>(target?: HasState): T {
28
+ const container = useContext(ContainerContext)
29
+ const resolved = target ?? container
30
+ if (!resolved) {
31
+ throw new Error('useContainerState requires a target or a ContainerProvider')
32
+ }
33
+ const [snapshot, setSnapshot] = useState<T>(() => ({ ...resolved.state.current }))
34
+
35
+ useEffect(() => {
36
+ setSnapshot({ ...resolved.state.current })
37
+ const unsub = resolved.state.observe(() => {
38
+ setSnapshot({ ...resolved.state.current })
39
+ })
40
+ return unsub
41
+ }, [resolved])
42
+
43
+ return snapshot
44
+ }
45
+
46
+ function useStateValue<V = any>(target: HasState, key: string): V | undefined {
47
+ const [value, setValue] = useState<V | undefined>(() => target.state.current[key])
48
+
49
+ useEffect(() => {
50
+ setValue(target.state.current[key])
51
+ const unsub = target.state.observe((_changeType: StateChangeType, changedKey: any, newValue?: any) => {
52
+ if (changedKey === key) {
53
+ setValue(newValue as V)
54
+ }
55
+ })
56
+ return unsub
57
+ }, [target, key])
58
+
59
+ return value
60
+ }
61
+
62
+ function useStateVersion(target?: HasState): number {
63
+ const container = useContext(ContainerContext)
64
+ const resolved = target ?? container
65
+ if (!resolved) {
66
+ throw new Error('useStateVersion requires a target or a ContainerProvider')
67
+ }
68
+ const [version, setVersion] = useState(() => resolved.state.version)
69
+
70
+ useEffect(() => {
71
+ setVersion(resolved.state.version)
72
+ const unsub = resolved.state.observe(() => {
73
+ setVersion(resolved.state.version)
74
+ })
75
+ return unsub
76
+ }, [resolved])
77
+
78
+ return version
79
+ }
80
+
81
+ // ── Event Hooks ─────────────────────────────────────────────────────
82
+
83
+ type HasEvents = { on: (event: string, listener: (...args: any[]) => void) => any; off: (event: string, listener?: (...args: any[]) => void) => any }
84
+
85
+ function useEvent(target: HasEvents, event: string, handler: (...args: any[]) => void): void {
86
+ const handlerRef = useRef(handler)
87
+ handlerRef.current = handler
88
+
89
+ useEffect(() => {
90
+ const listener = (...args: any[]) => handlerRef.current(...args)
91
+ target.on(event, listener)
92
+ return () => { target.off(event, listener) }
93
+ }, [target, event])
94
+ }
95
+
96
+ function useWaitFor<T = any>(target: HasEvents & { waitFor: (event: string) => Promise<any> }, event: string): { data: T | undefined; pending: boolean; error: Error | undefined } {
97
+ const [data, setData] = useState<T | undefined>(undefined)
98
+ const [pending, setPending] = useState(true)
99
+ const [error, setError] = useState<Error | undefined>(undefined)
100
+
101
+ useEffect(() => {
102
+ let cancelled = false
103
+ setPending(true)
104
+ setData(undefined)
105
+ setError(undefined)
106
+
107
+ target.waitFor(event).then(
108
+ (result) => {
109
+ if (!cancelled) {
110
+ setData(result as T)
111
+ setPending(false)
112
+ }
113
+ },
114
+ (err) => {
115
+ if (!cancelled) {
116
+ setError(err instanceof Error ? err : new Error(String(err)))
117
+ setPending(false)
118
+ }
119
+ }
120
+ )
121
+
122
+ return () => { cancelled = true }
123
+ }, [target, event])
124
+
125
+ return { data, pending, error }
126
+ }
127
+
128
+ // ── Feature Hook ────────────────────────────────────────────────────
129
+
130
+ function useFeature<K extends keyof AvailableFeatures>(
131
+ name: K,
132
+ options?: ConstructorParameters<AvailableFeatures[K]>[0]
133
+ ): InstanceType<AvailableFeatures[K]> {
134
+ const container = useContainer()
135
+ return useMemo(
136
+ () => container.feature(name, options),
137
+ [container, name]
138
+ )
139
+ }
140
+
141
+ // ── Helper State Hook ───────────────────────────────────────────────
142
+
143
+ function useHelperState<T extends object = any>(helper: Helper): [T, (value: any) => void] {
144
+ const [snapshot, setSnapshot] = useState<T>(() => ({ ...helper.state.current } as T))
145
+
146
+ useEffect(() => {
147
+ setSnapshot({ ...helper.state.current } as T)
148
+ const unsub = helper.state.observe(() => {
149
+ setSnapshot({ ...helper.state.current } as T)
150
+ })
151
+ return unsub
152
+ }, [helper])
153
+
154
+ const setState = useCallback(
155
+ (value: any) => helper.setState(value),
156
+ [helper]
157
+ )
158
+
159
+ return [snapshot, setState]
160
+ }
161
+
162
+ // ── Exports ─────────────────────────────────────────────────────────
163
+
164
+ export {
165
+ ContainerContext,
166
+ ContainerProvider,
167
+ useContainer,
168
+ useContainerState,
169
+ useStateValue,
170
+ useStateVersion,
171
+ useEvent,
172
+ useWaitFor,
173
+ useFeature,
174
+ useHelperState,
175
+ }
@@ -0,0 +1,210 @@
1
+ import type { Helper } from './helper.js';
2
+ import type { ContainerContext } from './container.js';
3
+ import { Bus } from './bus.js';
4
+ import { inspect } from 'util';
5
+
6
+ import { introspect, interceptRegistration } from './introspection/index.js';
7
+ import type { HelperIntrospection } from './introspection/index.js';
8
+
9
+ export type { HelperIntrospection }
10
+
11
+ abstract class Registry<T extends Helper> {
12
+ scope: string = "unspecified"
13
+
14
+ baseClass?: new (options: any, context: ContainerContext) => T
15
+
16
+ private readonly members! : Map<string, new (options: any, context: ContainerContext) => T>
17
+
18
+ private readonly _events! : Bus
19
+
20
+ constructor() {
21
+ Object.defineProperty(this, 'members', { enumerable: false, value: new Map<string, new (options: any, context: ContainerContext) => T>() })
22
+ Object.defineProperty(this, '_events', { enumerable: false, value: new Bus() })
23
+ Object.defineProperty(this, 'scope', { enumerable: false })
24
+ Object.defineProperty(this, 'baseClass', { enumerable: false })
25
+ }
26
+
27
+ [Symbol.for('nodejs.util.inspect.custom')]() {
28
+ const helpers = this.available
29
+ const methods: string[] = []
30
+ const getters: string[] = []
31
+
32
+ let proto = Object.getPrototypeOf(this)
33
+ while (proto && proto !== Object.prototype) {
34
+ for (const k of Object.getOwnPropertyNames(proto)) {
35
+ if (k === 'constructor' || k.startsWith('_')) continue
36
+ const desc = Object.getOwnPropertyDescriptor(proto, k)
37
+ if (!desc) continue
38
+ if (desc.get && !getters.includes(k)) getters.push(k)
39
+ else if (typeof desc.value === 'function' && !methods.includes(k)) methods.push(k)
40
+ }
41
+ proto = Object.getPrototypeOf(proto)
42
+ }
43
+
44
+ const parts = [`${this.constructor.name} [${this.scope}]`]
45
+ if (getters.length) parts.push(` getters: ${getters.sort().join(', ')}`)
46
+ if (methods.length) parts.push(` methods: ${methods.sort().map(m => m + '()').join(', ')}`)
47
+ parts.push(` registered: ${helpers.join(', ')}`)
48
+ return parts.join('\n')
49
+ }
50
+
51
+ /**
52
+ * Lists the keys of all available helpers in this registry.
53
+ */
54
+ get available() : string[] {
55
+ return Array.from(this.members.keys()).map(r => r.replace(`${this.scope}.`, '')).sort()
56
+ }
57
+
58
+ /**
59
+ * Register a new helper in this registry.
60
+ *
61
+ * @param id - The id of the helper to register.
62
+ * @param constructor - The constructor for the helper.
63
+ * @returns The constructor for the helper.
64
+ */
65
+ register(id: string, constructor: new (options: any, context: ContainerContext) => T) {
66
+ this.members.set(id.replace(`${this.scope}.`, ''), constructor);
67
+ interceptRegistration(this, constructor)
68
+ this.emit('helperRegistered', id, constructor)
69
+ return constructor
70
+ }
71
+
72
+ /**
73
+ * Remove a helper from this registry.
74
+ *
75
+ * @param id - The id of the helper to unregister.
76
+ * @returns True if the helper was removed, false if it wasn't registered.
77
+ */
78
+ unregister(id: string) : boolean {
79
+ const key = id.replace(`${this.scope}.`, '')
80
+ return this.members.delete(key)
81
+ }
82
+
83
+ /**
84
+ * Check if a helper is registered in this registry.
85
+ *
86
+ * @param id - The id of the helper to check.
87
+ * @returns True if the helper is registered, false otherwise.
88
+ */
89
+ has(id: string) : boolean {
90
+ return this.members.has(id) || this.members.has([this.scope, id].join('.'))
91
+ }
92
+
93
+ /**
94
+ * Lookup a helper by id.
95
+ *
96
+ * @param id - The id of the helper to lookup.
97
+ * @returns The constructor for the helper.
98
+ */
99
+ lookup(id: string) : new (options: any, context: ContainerContext) => T {
100
+ if (!this.members.has(id) && this.members.has([this.scope, id].join('.'))) {
101
+ id = [this.scope, id].join(".")
102
+ }
103
+
104
+ const Constructor = this.members.get(id);
105
+
106
+ if (!Constructor) {
107
+ const available = this.available
108
+ const suggestion = available.length > 0
109
+ ? `\n\nAvailable ${this.scope}: ${available.join(', ')}`
110
+ : `\n\nNo ${this.scope} are registered. Make sure the module is imported or .use()'d on the container.`
111
+
112
+ throw new Error(
113
+ `${this.scope} "${id}" is not registered.${suggestion}\n\n` +
114
+ `To fix this, ensure the module that defines "${id}" is imported (e.g. import './${this.scope}/${id}') ` +
115
+ `or registered on the container (e.g. container.use(${id ? id[0]!.toUpperCase() + id.slice(1) : 'MyHelper'})).`
116
+ )
117
+ }
118
+
119
+ return Constructor;
120
+ }
121
+
122
+ /**
123
+ * View data about the interface for a particular Helper. Will tell you about the options
124
+ * to create one, the state it maintains, the methods and properties it has, and the events it emits.
125
+ */
126
+ introspect(id: string) : HelperIntrospection | undefined {
127
+ return introspect(id)
128
+ }
129
+
130
+ /**
131
+ * Learn about the interface for a particular Helper. Will tell you about the options
132
+ * to create one, the state it maintains, the methods and properties it has, and the events it emits.
133
+ *
134
+ * Will return information as a markdown string.
135
+ */
136
+ describe(id: string) : string {
137
+ const Constructor = this.lookup(id) as any
138
+ return Constructor.introspectAsText()
139
+ }
140
+
141
+
142
+ /**
143
+ * Returns a condensed overview of all available helpers in this registry.
144
+ * Shows each helper's name and description, without the full introspection details.
145
+ *
146
+ * Use `describe(id)` to get the full details for a specific helper.
147
+ */
148
+ describeAll() : string {
149
+ const sections: string[] = [`# Available ${this.scope}\n`]
150
+
151
+ for (const id of this.available) {
152
+ const Constructor = this.lookup(id) as any
153
+ const introspection = Constructor.introspect?.()
154
+ const description = introspection?.description || Constructor.description || 'No description provided'
155
+ sections.push(`## ${id}\n\n${description}\n`)
156
+ }
157
+
158
+ return sections.join('\n')
159
+ }
160
+
161
+ /**
162
+ * Emit an event on the registry's event bus.
163
+ *
164
+ * @param event - The event to emit.
165
+ * @param args - The arguments to pass to the event listener.
166
+ * @returns The registry instance.
167
+ */
168
+ emit(event: string, ...args: any[]) {
169
+ this._events.emit(event, ...args)
170
+ return this
171
+ }
172
+
173
+ /**
174
+ * Subscribe to an event on the registry's event bus.
175
+ *
176
+ * @param event - The event to subscribe to.
177
+ * @param listener - The listener to call when the event is emitted.
178
+ * @returns The registry instance.
179
+ */
180
+ on(event: string, listener: (...args: any[]) => void) {
181
+ this._events.on(event, listener)
182
+ return this
183
+ }
184
+
185
+ /**
186
+ * Unsubscribe a listener from an event on the registry's event bus.
187
+ *
188
+ * @param event - The event to unsubscribe from.
189
+ * @param listener - The listener to unsubscribe.
190
+ * @returns The registry instance.
191
+ */
192
+ off(event: string, listener: (...args: any[]) => void) {
193
+ this._events.off(event, listener)
194
+ return this
195
+ }
196
+
197
+ /**
198
+ * Subscribe to an event on the registry's event bus, but only fire once.
199
+ *
200
+ * @param event - The event to subscribe to.
201
+ * @param listener - The listener to call when the event is emitted.
202
+ * @returns The registry instance.
203
+ */
204
+ once(event: string, listener: (...args: any[]) => void) {
205
+ this._events.once(event, listener)
206
+ return this
207
+ }
208
+ }
209
+
210
+ export { Registry }