luca 3.0.0 → 3.1.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 (388) hide show
  1. package/.github/workflows/release.yaml +1 -0
  2. package/CLAUDE.md +10 -2
  3. package/README.md +130 -112
  4. package/assistants/codingAssistant/CORE.md +6 -1
  5. package/assistants/codingAssistant/hooks.ts +1 -1
  6. package/assistants/inkbot/hooks.ts +1 -1
  7. package/assistants/inkbot/tools.ts +1 -1
  8. package/bun.lock +264 -321
  9. package/commands/audit-docs.ts +2 -2
  10. package/commands/build-bootstrap.ts +2 -3
  11. package/commands/build-python-bridge.ts +2 -3
  12. package/commands/build-scaffolds.ts +2 -3
  13. package/commands/bundle-consumer-project.ts +521 -0
  14. package/commands/generate-api-docs.ts +2 -2
  15. package/commands/inkbot.ts +2 -2
  16. package/commands/release.ts +2 -2
  17. package/commands/social.ts +137 -0
  18. package/commands/try-all-challenges.ts +3 -3
  19. package/commands/try-challenge.ts +3 -3
  20. package/datasets/lora/agentic-loop-session-candidates.jsonl +91 -0
  21. package/datasets/lora/agentic-loop-session-curation-summary.json +123 -0
  22. package/datasets/lora/luca-session-candidates.jsonl +29 -0
  23. package/datasets/lora/luca-session-curation-summary.json +121 -0
  24. package/datasets/lora/review-batch-1.jsonl +30 -0
  25. package/datasets/lora/review-manifest.json +41 -0
  26. package/datasets/lora/review-queue.jsonl +120 -0
  27. package/datasets/lora/review-schema.json +134 -0
  28. package/datasets/lora/review-template.jsonl +2 -0
  29. package/datasets/lora/review-ui.html +725 -0
  30. package/dist/agi/container.server.d.ts +2 -2
  31. package/dist/agi/features/assistant.d.ts +2 -2
  32. package/dist/agi/features/assistants-manager.d.ts +1 -1
  33. package/dist/agi/features/autonomous-assistant.d.ts +1 -1
  34. package/dist/agi/features/browser-use.d.ts +1 -1
  35. package/dist/agi/features/claude-code.d.ts +1 -1
  36. package/dist/agi/features/conversation-history.d.ts +2 -2
  37. package/dist/agi/features/conversation.d.ts +1 -1
  38. package/dist/agi/features/docs-reader.d.ts +1 -1
  39. package/dist/agi/features/file-tools.d.ts +1 -1
  40. package/dist/agi/features/luca-coder.d.ts +1 -1
  41. package/dist/agi/features/openai-codex.d.ts +1 -1
  42. package/dist/agi/features/skills-library.d.ts +1 -1
  43. package/dist/clients/civitai/index.d.ts +4 -4
  44. package/dist/clients/client-template.d.ts +4 -4
  45. package/dist/clients/comfyui/index.d.ts +2 -2
  46. package/dist/clients/elevenlabs/index.d.ts +2 -2
  47. package/dist/clients/openai/index.d.ts +2 -2
  48. package/dist/clients/supabase/index.d.ts +3 -3
  49. package/dist/command.d.ts +1 -1
  50. package/dist/node/container.d.ts +1 -1
  51. package/dist/node/features/helpers.d.ts +3 -3
  52. package/dist/node/features/semantic-search.d.ts +1 -1
  53. package/dist/node/features/vm.d.ts +3 -3
  54. package/dist/node.d.ts +1 -1
  55. package/dist/scaffolds/generated.d.ts +1 -1
  56. package/dist/selector.d.ts +1 -1
  57. package/features/cipher-social.ts +493 -0
  58. package/index.html +217 -190
  59. package/luca.console.ts +1 -1
  60. package/package.json +7 -2
  61. package/public/index.html +217 -190
  62. package/public/slides-ai-native.html +1 -1
  63. package/public/slides-intro.html +2 -2
  64. package/scripts/curate-claude-sessions.ts +561 -0
  65. package/scripts/examples/ask-luca-expert.ts +1 -1
  66. package/scripts/examples/assistant-questions.ts +1 -1
  67. package/scripts/examples/excalidraw-expert.ts +1 -1
  68. package/scripts/examples/file-manager.ts +1 -1
  69. package/scripts/examples/ideas.ts +1 -1
  70. package/scripts/examples/interactive-chat.ts +1 -1
  71. package/scripts/examples/opening-a-web-browser.ts +1 -1
  72. package/scripts/examples/telegram-bot.ts +1 -1
  73. package/scripts/examples/using-assistant-with-mcp.ts +1 -1
  74. package/scripts/examples/using-claude-code.ts +1 -1
  75. package/scripts/examples/using-contentdb.ts +2 -2
  76. package/scripts/examples/using-conversations.ts +1 -1
  77. package/scripts/examples/using-disk-cache.ts +1 -1
  78. package/scripts/examples/using-docker-shell.ts +1 -1
  79. package/scripts/examples/using-elevenlabs.ts +1 -1
  80. package/scripts/examples/using-google-calendar.ts +1 -1
  81. package/scripts/examples/using-google-docs.ts +1 -1
  82. package/scripts/examples/using-google-drive.ts +1 -1
  83. package/scripts/examples/using-google-sheets.ts +1 -1
  84. package/scripts/examples/using-nlp.ts +1 -1
  85. package/scripts/examples/using-ollama.ts +1 -1
  86. package/scripts/examples/using-postgres.ts +1 -1
  87. package/scripts/examples/using-runpod.ts +1 -1
  88. package/scripts/examples/using-tts.ts +1 -1
  89. package/scripts/scaffold.ts +5 -5
  90. package/scripts/scratch.ts +1 -1
  91. package/scripts/test-assistant-hooks.ts +1 -1
  92. package/scripts/test-docs-reader.ts +1 -1
  93. package/src/agi/container.server.ts +6 -2
  94. package/src/agi/features/agent-memory.ts +25 -25
  95. package/src/agi/features/assistant.ts +34 -5
  96. package/src/agi/features/assistants-manager.ts +122 -6
  97. package/src/agi/features/autonomous-assistant.ts +1 -1
  98. package/src/agi/features/browser-use.ts +20 -1
  99. package/src/agi/features/claude-code.ts +51 -5
  100. package/src/agi/features/coding-tools.ts +1 -1
  101. package/src/agi/features/conversation-history.ts +181 -4
  102. package/src/agi/features/conversation.ts +186 -15
  103. package/src/agi/features/docs-reader.ts +2 -2
  104. package/src/agi/features/file-tools.ts +49 -2
  105. package/src/agi/features/luca-coder.ts +7 -5
  106. package/src/agi/features/mcp-bridge.ts +532 -0
  107. package/src/agi/features/openai-codex.ts +2 -2
  108. package/src/agi/features/skills-library.ts +131 -52
  109. package/src/agi/lib/token-counter.ts +80 -0
  110. package/src/bootstrap/generated.ts +56 -57
  111. package/src/browser.ts +1 -1
  112. package/src/cli/build-info.ts +2 -2
  113. package/src/cli/cli.ts +2 -2
  114. package/src/clients/civitai/index.ts +5 -5
  115. package/src/clients/client-template.ts +4 -4
  116. package/src/clients/comfyui/index.ts +4 -4
  117. package/src/clients/elevenlabs/index.ts +4 -4
  118. package/src/clients/openai/index.ts +7 -7
  119. package/src/clients/supabase/index.ts +4 -4
  120. package/src/clients/voicebox/index.ts +4 -4
  121. package/src/command.ts +2 -1
  122. package/src/commands/chat.ts +1 -0
  123. package/src/commands/eval.ts +2 -56
  124. package/src/commands/introspect.ts +1 -1
  125. package/src/commands/prompt.ts +41 -9
  126. package/src/container-describer.ts +8 -1
  127. package/src/container.ts +13 -0
  128. package/src/entity.ts +2 -2
  129. package/src/helper.ts +1 -1
  130. package/src/introspection/generated.agi.ts +29596 -27654
  131. package/src/introspection/generated.node.ts +20284 -19247
  132. package/src/introspection/generated.web.ts +605 -584
  133. package/src/introspection/scan.ts +11 -6
  134. package/src/node/container.ts +9 -1
  135. package/src/node/features/content-db.ts +39 -2
  136. package/src/node/features/display-result.ts +57 -0
  137. package/src/node/features/helpers.ts +46 -7
  138. package/src/node/features/python.ts +25 -19
  139. package/src/node/features/repl.ts +1 -1
  140. package/src/node/features/secure-shell.ts +11 -17
  141. package/src/node/features/semantic-search.ts +2 -2
  142. package/src/node/features/socket-repl.ts +336 -0
  143. package/src/node/features/telnyx-assistant-connector.ts +1206 -0
  144. package/src/node/features/transpiler.ts +2 -3
  145. package/src/node/features/ui.ts +5 -0
  146. package/src/node/features/vm.ts +20 -3
  147. package/src/node.ts +3 -3
  148. package/src/python/generated.ts +0 -1
  149. package/src/scaffolds/generated.ts +82 -83
  150. package/src/selector.ts +1 -1
  151. package/src/servers/express.ts +1 -1
  152. package/src/web/features/helpers.ts +22 -0
  153. package/tsconfig.json +12 -12
  154. package/docs/CLI.md +0 -335
  155. package/docs/CNAME +0 -1
  156. package/docs/README.md +0 -60
  157. package/docs/TABLE-OF-CONTENTS.md +0 -183
  158. package/docs/apis/clients/elevenlabs.md +0 -308
  159. package/docs/apis/clients/graph.md +0 -107
  160. package/docs/apis/clients/openai.md +0 -429
  161. package/docs/apis/clients/rest.md +0 -161
  162. package/docs/apis/clients/websocket.md +0 -174
  163. package/docs/apis/features/agi/assistant.md +0 -625
  164. package/docs/apis/features/agi/assistants-manager.md +0 -282
  165. package/docs/apis/features/agi/auto-assistant.md +0 -279
  166. package/docs/apis/features/agi/browser-use.md +0 -802
  167. package/docs/apis/features/agi/claude-code.md +0 -884
  168. package/docs/apis/features/agi/conversation-history.md +0 -364
  169. package/docs/apis/features/agi/conversation.md +0 -548
  170. package/docs/apis/features/agi/docs-reader.md +0 -99
  171. package/docs/apis/features/agi/file-tools.md +0 -163
  172. package/docs/apis/features/agi/luca-coder.md +0 -407
  173. package/docs/apis/features/agi/openai-codex.md +0 -396
  174. package/docs/apis/features/agi/openapi.md +0 -138
  175. package/docs/apis/features/agi/semantic-search.md +0 -387
  176. package/docs/apis/features/agi/skills-library.md +0 -239
  177. package/docs/apis/features/node/container-link.md +0 -192
  178. package/docs/apis/features/node/content-db.md +0 -450
  179. package/docs/apis/features/node/disk-cache.md +0 -379
  180. package/docs/apis/features/node/dns.md +0 -652
  181. package/docs/apis/features/node/docker.md +0 -706
  182. package/docs/apis/features/node/downloader.md +0 -81
  183. package/docs/apis/features/node/esbuild.md +0 -60
  184. package/docs/apis/features/node/file-manager.md +0 -191
  185. package/docs/apis/features/node/fs.md +0 -1217
  186. package/docs/apis/features/node/git.md +0 -371
  187. package/docs/apis/features/node/google-auth.md +0 -193
  188. package/docs/apis/features/node/google-calendar.md +0 -202
  189. package/docs/apis/features/node/google-docs.md +0 -173
  190. package/docs/apis/features/node/google-drive.md +0 -246
  191. package/docs/apis/features/node/google-mail.md +0 -214
  192. package/docs/apis/features/node/google-sheets.md +0 -194
  193. package/docs/apis/features/node/grep.md +0 -292
  194. package/docs/apis/features/node/helpers.md +0 -164
  195. package/docs/apis/features/node/ink.md +0 -334
  196. package/docs/apis/features/node/ipc-socket.md +0 -249
  197. package/docs/apis/features/node/json-tree.md +0 -86
  198. package/docs/apis/features/node/networking.md +0 -316
  199. package/docs/apis/features/node/nlp.md +0 -133
  200. package/docs/apis/features/node/opener.md +0 -97
  201. package/docs/apis/features/node/os.md +0 -146
  202. package/docs/apis/features/node/package-finder.md +0 -392
  203. package/docs/apis/features/node/postgres.md +0 -234
  204. package/docs/apis/features/node/proc.md +0 -399
  205. package/docs/apis/features/node/process-manager.md +0 -305
  206. package/docs/apis/features/node/python.md +0 -604
  207. package/docs/apis/features/node/redis.md +0 -380
  208. package/docs/apis/features/node/repl.md +0 -88
  209. package/docs/apis/features/node/runpod.md +0 -674
  210. package/docs/apis/features/node/secure-shell.md +0 -176
  211. package/docs/apis/features/node/semantic-search.md +0 -408
  212. package/docs/apis/features/node/sqlite.md +0 -233
  213. package/docs/apis/features/node/telegram.md +0 -279
  214. package/docs/apis/features/node/transpiler.md +0 -74
  215. package/docs/apis/features/node/tts.md +0 -133
  216. package/docs/apis/features/node/ui.md +0 -701
  217. package/docs/apis/features/node/vault.md +0 -59
  218. package/docs/apis/features/node/vm.md +0 -75
  219. package/docs/apis/features/node/yaml-tree.md +0 -85
  220. package/docs/apis/features/node/yaml.md +0 -176
  221. package/docs/apis/features/web/asset-loader.md +0 -59
  222. package/docs/apis/features/web/container-link.md +0 -192
  223. package/docs/apis/features/web/esbuild.md +0 -54
  224. package/docs/apis/features/web/helpers.md +0 -164
  225. package/docs/apis/features/web/network.md +0 -44
  226. package/docs/apis/features/web/speech.md +0 -69
  227. package/docs/apis/features/web/vault.md +0 -59
  228. package/docs/apis/features/web/vm.md +0 -75
  229. package/docs/apis/features/web/voice.md +0 -84
  230. package/docs/apis/servers/express.md +0 -171
  231. package/docs/apis/servers/mcp.md +0 -238
  232. package/docs/apis/servers/websocket.md +0 -170
  233. package/docs/bootstrap/CLAUDE.md +0 -101
  234. package/docs/bootstrap/SKILL.md +0 -341
  235. package/docs/bootstrap/templates/about-command.ts +0 -41
  236. package/docs/bootstrap/templates/docs-models.ts +0 -22
  237. package/docs/bootstrap/templates/docs-readme.md +0 -43
  238. package/docs/bootstrap/templates/example-feature.ts +0 -53
  239. package/docs/bootstrap/templates/health-endpoint.ts +0 -15
  240. package/docs/bootstrap/templates/luca-cli.ts +0 -30
  241. package/docs/bootstrap/templates/runme.md +0 -54
  242. package/docs/challenges/caching-proxy.md +0 -16
  243. package/docs/challenges/content-db-round-trip.md +0 -14
  244. package/docs/challenges/custom-command.md +0 -9
  245. package/docs/challenges/file-watcher-pipeline.md +0 -11
  246. package/docs/challenges/grep-audit-report.md +0 -15
  247. package/docs/challenges/multi-feature-dashboard.md +0 -14
  248. package/docs/challenges/process-orchestrator.md +0 -17
  249. package/docs/challenges/rest-api-server-with-client.md +0 -12
  250. package/docs/challenges/script-runner-with-vm.md +0 -11
  251. package/docs/challenges/simple-rest-api.md +0 -15
  252. package/docs/challenges/websocket-serve-and-client.md +0 -11
  253. package/docs/challenges/yaml-config-system.md +0 -14
  254. package/docs/command-system-overhaul.md +0 -94
  255. package/docs/documentation-audit.md +0 -134
  256. package/docs/examples/assistant/CORE.md +0 -18
  257. package/docs/examples/assistant/hooks.ts +0 -3
  258. package/docs/examples/assistant/tools.ts +0 -10
  259. package/docs/examples/assistant-hooks-reference.ts +0 -171
  260. package/docs/examples/assistant-with-process-manager.md +0 -84
  261. package/docs/examples/content-db.md +0 -77
  262. package/docs/examples/disk-cache.md +0 -83
  263. package/docs/examples/docker.md +0 -101
  264. package/docs/examples/downloader.md +0 -70
  265. package/docs/examples/entity.md +0 -124
  266. package/docs/examples/esbuild.md +0 -80
  267. package/docs/examples/feature-as-tool-provider.md +0 -143
  268. package/docs/examples/file-manager.md +0 -82
  269. package/docs/examples/fs.md +0 -83
  270. package/docs/examples/git.md +0 -85
  271. package/docs/examples/google-auth.md +0 -88
  272. package/docs/examples/google-calendar.md +0 -94
  273. package/docs/examples/google-docs.md +0 -82
  274. package/docs/examples/google-drive.md +0 -96
  275. package/docs/examples/google-sheets.md +0 -95
  276. package/docs/examples/grep.md +0 -85
  277. package/docs/examples/ink-blocks.md +0 -75
  278. package/docs/examples/ink-renderer.md +0 -41
  279. package/docs/examples/ink.md +0 -103
  280. package/docs/examples/ipc-socket.md +0 -103
  281. package/docs/examples/json-tree.md +0 -91
  282. package/docs/examples/networking.md +0 -58
  283. package/docs/examples/nlp.md +0 -91
  284. package/docs/examples/opener.md +0 -78
  285. package/docs/examples/os.md +0 -72
  286. package/docs/examples/package-finder.md +0 -89
  287. package/docs/examples/postgres.md +0 -91
  288. package/docs/examples/proc.md +0 -81
  289. package/docs/examples/process-manager.md +0 -79
  290. package/docs/examples/python.md +0 -132
  291. package/docs/examples/repl.md +0 -93
  292. package/docs/examples/runpod.md +0 -119
  293. package/docs/examples/secure-shell.md +0 -92
  294. package/docs/examples/sqlite.md +0 -86
  295. package/docs/examples/structured-output-with-assistants.md +0 -144
  296. package/docs/examples/telegram.md +0 -77
  297. package/docs/examples/tts.md +0 -86
  298. package/docs/examples/ui.md +0 -80
  299. package/docs/examples/vault.md +0 -70
  300. package/docs/examples/vm.md +0 -86
  301. package/docs/examples/websocket-ask-and-reply-example.md +0 -128
  302. package/docs/examples/yaml-tree.md +0 -93
  303. package/docs/examples/yaml.md +0 -104
  304. package/docs/ideas/assistant-factory-pattern.md +0 -142
  305. package/docs/in-memory-fs.md +0 -4
  306. package/docs/introspection-audit.md +0 -49
  307. package/docs/introspection.md +0 -164
  308. package/docs/mcp/readme.md +0 -162
  309. package/docs/models.ts +0 -41
  310. package/docs/philosophy.md +0 -86
  311. package/docs/principles.md +0 -7
  312. package/docs/prompts/audit-codebase-for-failures-to-use-the-container.md +0 -34
  313. package/docs/prompts/check-for-undocumented-features.md +0 -27
  314. package/docs/prompts/mcp-test-easy-command.md +0 -27
  315. package/docs/scaffolds/client.md +0 -149
  316. package/docs/scaffolds/command.md +0 -120
  317. package/docs/scaffolds/endpoint.md +0 -171
  318. package/docs/scaffolds/feature.md +0 -158
  319. package/docs/scaffolds/selector.md +0 -91
  320. package/docs/scaffolds/server.md +0 -196
  321. package/docs/selectors.md +0 -115
  322. package/docs/sessions/custom-command/attempt-log-2.md +0 -195
  323. package/docs/sessions/file-watcher-pipeline/attempt-log-1.md +0 -728
  324. package/docs/sessions/file-watcher-pipeline/attempt-log-2.md +0 -555
  325. package/docs/sessions/grep-audit-report/attempt-log-1.md +0 -289
  326. package/docs/sessions/multi-feature-dashboard/attempt-log-2.md +0 -679
  327. package/docs/sessions/rest-api-server-with-client/attempt-log-1.md +0 -1
  328. package/docs/sessions/rest-api-server-with-client/attempt-log-3.md +0 -920
  329. package/docs/sessions/simple-rest-api/attempt-log-1.md +0 -593
  330. package/docs/sessions/websocket-serve-and-client/attempt-log-2.md +0 -995
  331. package/docs/tutorials/00-bootstrap.md +0 -166
  332. package/docs/tutorials/01-getting-started.md +0 -106
  333. package/docs/tutorials/02-container.md +0 -210
  334. package/docs/tutorials/03-scripts.md +0 -194
  335. package/docs/tutorials/04-features-overview.md +0 -196
  336. package/docs/tutorials/05-state-and-events.md +0 -171
  337. package/docs/tutorials/06-servers.md +0 -157
  338. package/docs/tutorials/07-endpoints.md +0 -198
  339. package/docs/tutorials/08-commands.md +0 -252
  340. package/docs/tutorials/09-clients.md +0 -162
  341. package/docs/tutorials/10-creating-features.md +0 -203
  342. package/docs/tutorials/11-contentbase.md +0 -191
  343. package/docs/tutorials/12-assistants.md +0 -215
  344. package/docs/tutorials/13-introspection.md +0 -157
  345. package/docs/tutorials/14-type-system.md +0 -174
  346. package/docs/tutorials/15-project-patterns.md +0 -222
  347. package/docs/tutorials/16-google-features.md +0 -534
  348. package/docs/tutorials/17-tui-blocks.md +0 -530
  349. package/docs/tutorials/18-semantic-search.md +0 -334
  350. package/docs/tutorials/19-python-sessions.md +0 -401
  351. package/docs/tutorials/20-browser-esm.md +0 -234
  352. package/index.ts +0 -1
  353. package/src/agi/endpoints/ask.ts +0 -60
  354. package/src/agi/endpoints/conversations/[id].ts +0 -45
  355. package/src/agi/endpoints/conversations.ts +0 -31
  356. package/src/agi/endpoints/experts.ts +0 -37
  357. package/test/assistant-hooks.test.ts +0 -306
  358. package/test/assistant.test.ts +0 -81
  359. package/test/bus.test.ts +0 -134
  360. package/test/clients-servers.test.ts +0 -217
  361. package/test/command.test.ts +0 -267
  362. package/test/container-link.test.ts +0 -274
  363. package/test/conversation.test.ts +0 -220
  364. package/test/features.test.ts +0 -160
  365. package/test/fork-and-research.test.ts +0 -450
  366. package/test/integration.test.ts +0 -787
  367. package/test/interceptor-chain.test.ts +0 -61
  368. package/test/node-container.test.ts +0 -121
  369. package/test/python-session.test.ts +0 -105
  370. package/test/rate-limit.test.ts +0 -272
  371. package/test/semantic-search.test.ts +0 -550
  372. package/test/state.test.ts +0 -121
  373. package/test/vm-context.test.ts +0 -146
  374. package/test/vm-loadmodule.test.ts +0 -213
  375. package/test/websocket-ask.test.ts +0 -101
  376. package/test-integration/assistant.test.ts +0 -138
  377. package/test-integration/assistants-manager.test.ts +0 -113
  378. package/test-integration/claude-code.test.ts +0 -98
  379. package/test-integration/conversation-history.test.ts +0 -205
  380. package/test-integration/conversation.test.ts +0 -137
  381. package/test-integration/elevenlabs.test.ts +0 -55
  382. package/test-integration/google-services.test.ts +0 -80
  383. package/test-integration/helpers.ts +0 -89
  384. package/test-integration/memory.test.ts +0 -204
  385. package/test-integration/openai-codex.test.ts +0 -93
  386. package/test-integration/runpod.test.ts +0 -58
  387. package/test-integration/server-endpoints.test.ts +0 -97
  388. package/test-integration/telegram.test.ts +0 -46
@@ -145,16 +145,15 @@ export class Transpiler extends Feature {
145
145
  entrypoints: [filePath],
146
146
  target: 'bun',
147
147
  format: 'cjs',
148
- bundle: true,
149
148
  external,
150
- })
149
+ } as any)
151
150
 
152
151
  if (!result.success) {
153
152
  const msgs = result.logs.map((l: any) => l.message || String(l)).join('\n')
154
153
  throw new Error(`Bundle failed for ${filePath}:\n${msgs}`)
155
154
  }
156
155
 
157
- return await result.outputs[0].text()
156
+ return await result.outputs[0]!.text()
158
157
  }
159
158
  }
160
159
 
@@ -72,6 +72,11 @@ export class UI<T extends UIState = UIState> extends Feature<T> {
72
72
  print: ColoredPrintFunction = Object.assign((...args: any[]) => {
73
73
  return console.log(...args)
74
74
  }, {
75
+ error: (text: string) => console.log(colors.red(text)),
76
+ info: (text: string) => console.log(text),
77
+ success: (text: string) => console.log(colors.green(text)),
78
+ warn: (text: string) => console.log(colors.yellow(text)),
79
+ warning: (text: string) => console.log(colors.yellow(text)),
75
80
  red: (text: string) => console.log(colors.red(text)),
76
81
  green: (text: string) => console.log(colors.green(text)),
77
82
  blue: (text: string) => console.log(colors.blue(text)),
@@ -55,17 +55,17 @@ export class VM<
55
55
  * Register a virtual module that will be available to `require()` inside VM-executed code.
56
56
  * Modules registered here take precedence over Node's native resolution.
57
57
  *
58
- * @param id - The module specifier (e.g. `'@soederpop/luca'`, `'zod'`)
58
+ * @param id - The module specifier (e.g. `'luca'`, `'zod'`)
59
59
  * @param exports - The module's exports object
60
60
  *
61
61
  * @example
62
62
  * ```typescript
63
63
  * const vm = container.feature('vm')
64
- * vm.defineModule('@soederpop/luca', { Container, Feature, fs, proc })
64
+ * vm.defineModule('luca', { Container, Feature, fs, proc })
65
65
  * vm.defineModule('zod', { z })
66
66
  *
67
67
  * // Now loadModule can resolve these in user code:
68
- * // import { Container } from '@soederpop/luca' → works
68
+ * // import { Container } from 'luca' → works
69
69
  * ```
70
70
  */
71
71
  defineModule(id: string, exports: any): void {
@@ -165,6 +165,15 @@ export class VM<
165
165
  Buffer,
166
166
  URL,
167
167
  URLSearchParams,
168
+ AbortController,
169
+ AbortSignal,
170
+ FormData,
171
+ Blob,
172
+ File,
173
+ Headers,
174
+ Request,
175
+ Response,
176
+ fetch,
168
177
  ...this.container.context,
169
178
  ...ctx
170
179
  })
@@ -451,6 +460,14 @@ export class VM<
451
460
  Buffer,
452
461
  URL,
453
462
  URLSearchParams,
463
+ AbortController,
464
+ AbortSignal,
465
+ FormData,
466
+ Blob,
467
+ File,
468
+ Headers,
469
+ Request,
470
+ Response,
454
471
  fetch,
455
472
  ...ctx,
456
473
  })
package/src/node.ts CHANGED
@@ -17,7 +17,7 @@ export default container as NodeContainer
17
17
  export function createContainer() {
18
18
  console.warn(
19
19
  '[luca] createContainer() is unnecessary — import the default export instead.\n' +
20
- ' `import container from "@soederpop/luca"`\n' +
20
+ ' `import container from "luca"`\n' +
21
21
  ' For a separate instance, use container.subcontainer().'
22
22
  )
23
23
  return container
@@ -45,7 +45,7 @@ export { Client, ClientsRegistry } from './client'
45
45
  export { RestClient } from './clients/rest'
46
46
  export { GraphClient } from './clients/graph'
47
47
  export { WebSocketClient } from './clients/websocket'
48
- export { Command, CommandsRegistry, commands } from './command'
48
+ export { Command, CommandsRegistry, commands, graftModule } from './command'
49
49
  export { Endpoint, EndpointsRegistry, endpoints } from './endpoint'
50
50
  export { Selector, SelectorsRegistry, selectors } from './selector'
51
51
  export { Server, ServersRegistry } from './server'
@@ -69,7 +69,7 @@ export type { Entity } from './entity'
69
69
  export type { EventMap } from './bus'
70
70
  export type { SetStateValue, StateChangeType } from './state'
71
71
 
72
- // Zod — so consumer code can `import { z } from '@soederpop/luca'`
72
+ // Zod — so consumer code can `import { z } from 'luca'`
73
73
  export { z } from 'zod'
74
74
 
75
75
  // Schemas
@@ -1,5 +1,4 @@
1
1
  // Auto-generated Python bridge script
2
- // Generated at: 2026-04-10T05:00:55.842Z
3
2
  // Source: src/python/bridge.py
4
3
  //
5
4
  // Do not edit manually. Run: luca build-python-bridge
@@ -1,5 +1,4 @@
1
1
  // Auto-generated scaffold and MCP readme content
2
- // Generated at: 2026-04-10T05:00:53.697Z
3
2
  // Source: docs/scaffolds/*.md, docs/examples/assistant/, and docs/mcp/readme.md
4
3
  //
5
4
  // Do not edit manually. Run: luca build-scaffolds
@@ -19,8 +18,8 @@ export const scaffolds: Record<string, ScaffoldData> = {
19
18
  feature: {
20
19
  sections: [
21
20
  { heading: "Imports", code: `import { z } from 'zod'
22
- import { FeatureStateSchema, FeatureOptionsSchema, FeatureEventsSchema } from '@soederpop/luca'
23
- import { Feature } from '@soederpop/luca'` },
21
+ import { FeatureStateSchema, FeatureOptionsSchema, FeatureEventsSchema } from 'luca'
22
+ import { Feature } from 'luca'` },
24
23
  { heading: "Schemas", code: `export const {{PascalName}}StateSchema = FeatureStateSchema.extend({
25
24
  // Add your state fields here. These are observable — changes emit events.
26
25
  // Example: itemCount: z.number().default(0).describe('Number of items stored'),
@@ -61,7 +60,7 @@ export class {{PascalName}} extends Feature<{{PascalName}}State, {{PascalName}}O
61
60
  // Set up initial state, start background tasks, etc.
62
61
  }
63
62
  }` },
64
- { heading: "Module Augmentation", code: `declare module '@soederpop/luca' {
63
+ { heading: "Module Augmentation", code: `declare module 'luca' {
65
64
  interface AvailableFeatures {
66
65
  {{camelName}}: typeof {{PascalName}}
67
66
  }
@@ -72,10 +71,10 @@ static { Feature.register(this, '{{camelName}}') }
72
71
  // At module level:
73
72
  export default {{PascalName}}` },
74
73
  { heading: "Complete Example", code: `import { z } from 'zod'
75
- import { FeatureStateSchema, FeatureOptionsSchema } from '@soederpop/luca'
76
- import { Feature } from '@soederpop/luca'
74
+ import { FeatureStateSchema, FeatureOptionsSchema } from 'luca'
75
+ import { Feature } from 'luca'
77
76
 
78
- declare module '@soederpop/luca' {
77
+ declare module 'luca' {
79
78
  interface AvailableFeatures {
80
79
  {{camelName}}: typeof {{PascalName}}
81
80
  }
@@ -111,10 +110,10 @@ export class {{PascalName}} extends Feature<{{PascalName}}State, {{PascalName}}O
111
110
  export default {{PascalName}}` }
112
111
  ],
113
112
  full: `import { z } from 'zod'
114
- import { FeatureStateSchema, FeatureOptionsSchema } from '@soederpop/luca'
115
- import { Feature } from '@soederpop/luca'
113
+ import { FeatureStateSchema, FeatureOptionsSchema } from 'luca'
114
+ import { Feature } from 'luca'
116
115
 
117
- declare module '@soederpop/luca' {
116
+ declare module 'luca' {
118
117
  interface AvailableFeatures {
119
118
  {{camelName}}: typeof {{PascalName}}
120
119
  }
@@ -161,8 +160,8 @@ When to build a feature:
161
160
 
162
161
  \`\`\`ts
163
162
  import { z } from 'zod'
164
- import { FeatureStateSchema, FeatureOptionsSchema, FeatureEventsSchema } from '@soederpop/luca'
165
- import { Feature } from '@soederpop/luca'
163
+ import { FeatureStateSchema, FeatureOptionsSchema, FeatureEventsSchema } from 'luca'
164
+ import { Feature } from 'luca'
166
165
  \`\`\`
167
166
 
168
167
  These are the only imports your feature file needs from luca. If your feature wraps a third-party library, import it here too — feature implementations are the ONE place where direct library imports are allowed.
@@ -234,7 +233,7 @@ export class {{PascalName}} extends Feature<{{PascalName}}State, {{PascalName}}O
234
233
  This is what gives \`container.feature('yourName')\` TypeScript autocomplete. Without it, the feature works but TypeScript won't know about it.
235
234
 
236
235
  \`\`\`ts
237
- declare module '@soederpop/luca' {
236
+ declare module 'luca' {
238
237
  interface AvailableFeatures {
239
238
  {{camelName}}: typeof {{PascalName}}
240
239
  }
@@ -259,10 +258,10 @@ Here's a minimal but complete feature. This is what a real feature file looks li
259
258
 
260
259
  \`\`\`ts
261
260
  import { z } from 'zod'
262
- import { FeatureStateSchema, FeatureOptionsSchema } from '@soederpop/luca'
263
- import { Feature } from '@soederpop/luca'
261
+ import { FeatureStateSchema, FeatureOptionsSchema } from 'luca'
262
+ import { Feature } from 'luca'
264
263
 
265
- declare module '@soederpop/luca' {
264
+ declare module 'luca' {
266
265
  interface AvailableFeatures {
267
266
  {{camelName}}: typeof {{PascalName}}
268
267
  }
@@ -311,8 +310,8 @@ export default {{PascalName}}
311
310
  client: {
312
311
  sections: [
313
312
  { heading: "Imports", code: `import { z } from 'zod'
314
- import { Client, RestClient } from '@soederpop/luca/client'
315
- import { ClientStateSchema, ClientOptionsSchema, ClientEventsSchema } from '@soederpop/luca'` },
313
+ import { Client, RestClient } from 'luca/client'
314
+ import { ClientStateSchema, ClientOptionsSchema, ClientEventsSchema } from 'luca'` },
316
315
  { heading: "Schemas", code: `export const {{PascalName}}StateSchema = ClientStateSchema.extend({
317
316
  // Add your state fields here.
318
317
  // Example: authenticated: z.boolean().default(false).describe('Whether API auth is configured'),
@@ -354,7 +353,7 @@ export class {{PascalName}} extends RestClient<{{PascalName}}State, {{PascalName
354
353
  // return this.get('/items')
355
354
  // }
356
355
  }` },
357
- { heading: "Module Augmentation", code: `declare module '@soederpop/luca/client' {
356
+ { heading: "Module Augmentation", code: `declare module 'luca/client' {
358
357
  interface AvailableClients {
359
358
  {{camelName}}: typeof {{PascalName}}
360
359
  }
@@ -365,10 +364,10 @@ static { Client.register(this, '{{camelName}}') }
365
364
  // At module level:
366
365
  export default {{PascalName}}` },
367
366
  { heading: "Complete Example", code: `import { z } from 'zod'
368
- import { Client, RestClient } from '@soederpop/luca/client'
369
- import { ClientStateSchema, ClientOptionsSchema } from '@soederpop/luca'
367
+ import { Client, RestClient } from 'luca/client'
368
+ import { ClientStateSchema, ClientOptionsSchema } from 'luca'
370
369
 
371
- declare module '@soederpop/luca/client' {
370
+ declare module 'luca/client' {
372
371
  interface AvailableClients {
373
372
  {{camelName}}: typeof {{PascalName}}
374
373
  }
@@ -406,10 +405,10 @@ export class {{PascalName}} extends RestClient<{{PascalName}}State, {{PascalName
406
405
  export default {{PascalName}}` }
407
406
  ],
408
407
  full: `import { z } from 'zod'
409
- import { Client, RestClient } from '@soederpop/luca/client'
410
- import { ClientStateSchema, ClientOptionsSchema } from '@soederpop/luca'
408
+ import { Client, RestClient } from 'luca/client'
409
+ import { ClientStateSchema, ClientOptionsSchema } from 'luca'
411
410
 
412
- declare module '@soederpop/luca/client' {
411
+ declare module 'luca/client' {
413
412
  interface AvailableClients {
414
413
  {{camelName}}: typeof {{PascalName}}
415
414
  }
@@ -458,8 +457,8 @@ When to build a client:
458
457
 
459
458
  \`\`\`ts
460
459
  import { z } from 'zod'
461
- import { Client, RestClient } from '@soederpop/luca/client'
462
- import { ClientStateSchema, ClientOptionsSchema, ClientEventsSchema } from '@soederpop/luca'
460
+ import { Client, RestClient } from 'luca/client'
461
+ import { ClientStateSchema, ClientOptionsSchema, ClientEventsSchema } from 'luca'
463
462
  \`\`\`
464
463
 
465
464
  Use \`RestClient\` for HTTP APIs (most common). It gives you \`get\`, \`post\`, \`put\`, \`patch\`, \`delete\` methods that handle JSON, headers, and error wrapping.
@@ -522,7 +521,7 @@ export class {{PascalName}} extends RestClient<{{PascalName}}State, {{PascalName
522
521
  ## Module Augmentation
523
522
 
524
523
  \`\`\`ts
525
- declare module '@soederpop/luca/client' {
524
+ declare module 'luca/client' {
526
525
  interface AvailableClients {
527
526
  {{camelName}}: typeof {{PascalName}}
528
527
  }
@@ -545,10 +544,10 @@ export default {{PascalName}}
545
544
 
546
545
  \`\`\`ts
547
546
  import { z } from 'zod'
548
- import { Client, RestClient } from '@soederpop/luca/client'
549
- import { ClientStateSchema, ClientOptionsSchema } from '@soederpop/luca'
547
+ import { Client, RestClient } from 'luca/client'
548
+ import { ClientStateSchema, ClientOptionsSchema } from 'luca'
550
549
 
551
- declare module '@soederpop/luca/client' {
550
+ declare module 'luca/client' {
552
551
  interface AvailableClients {
553
552
  {{camelName}}: typeof {{PascalName}}
554
553
  }
@@ -599,10 +598,10 @@ export default {{PascalName}}
599
598
  server: {
600
599
  sections: [
601
600
  { heading: "Imports", code: `import { z } from 'zod'
602
- import { Server } from '@soederpop/luca'
603
- import { ServerStateSchema, ServerOptionsSchema, ServerEventsSchema } from '@soederpop/luca'
604
- import type { NodeContainer } from '@soederpop/luca'
605
- import type { ServersInterface } from '@soederpop/luca'` },
601
+ import { Server } from 'luca'
602
+ import { ServerStateSchema, ServerOptionsSchema, ServerEventsSchema } from 'luca'
603
+ import type { NodeContainer } from 'luca'
604
+ import type { ServersInterface } from 'luca'` },
606
605
  { heading: "Schemas", code: `export const {{PascalName}}StateSchema = ServerStateSchema.extend({
607
606
  // Add your state fields here.
608
607
  // Example: connectionCount: z.number().default(0).describe('Active connections'),
@@ -667,7 +666,7 @@ export class {{PascalName}} extends Server<{{PascalName}}State, {{PascalName}}Op
667
666
  return this
668
667
  }
669
668
  }` },
670
- { heading: "Module Augmentation", code: `declare module '@soederpop/luca' {
669
+ { heading: "Module Augmentation", code: `declare module 'luca' {
671
670
  interface AvailableServers {
672
671
  {{camelName}}: typeof {{PascalName}}
673
672
  }
@@ -678,12 +677,12 @@ static { Server.register(this, '{{camelName}}') }
678
677
  // At module level:
679
678
  export default {{PascalName}}` },
680
679
  { heading: "Complete Example", code: `import { z } from 'zod'
681
- import { Server } from '@soederpop/luca'
682
- import { ServerStateSchema, ServerOptionsSchema, ServerEventsSchema } from '@soederpop/luca'
683
- import type { NodeContainer } from '@soederpop/luca'
684
- import type { ServersInterface } from '@soederpop/luca'
680
+ import { Server } from 'luca'
681
+ import { ServerStateSchema, ServerOptionsSchema, ServerEventsSchema } from 'luca'
682
+ import type { NodeContainer } from 'luca'
683
+ import type { ServersInterface } from 'luca'
685
684
 
686
- declare module '@soederpop/luca' {
685
+ declare module 'luca' {
687
686
  interface AvailableServers {
688
687
  {{camelName}}: typeof {{PascalName}}
689
688
  }
@@ -745,12 +744,12 @@ export class {{PascalName}} extends Server<{{PascalName}}State, {{PascalName}}Op
745
744
  export default {{PascalName}}` }
746
745
  ],
747
746
  full: `import { z } from 'zod'
748
- import { Server } from '@soederpop/luca'
749
- import { ServerStateSchema, ServerOptionsSchema, ServerEventsSchema } from '@soederpop/luca'
750
- import type { NodeContainer } from '@soederpop/luca'
751
- import type { ServersInterface } from '@soederpop/luca'
747
+ import { Server } from 'luca'
748
+ import { ServerStateSchema, ServerOptionsSchema, ServerEventsSchema } from 'luca'
749
+ import type { NodeContainer } from 'luca'
750
+ import type { ServersInterface } from 'luca'
752
751
 
753
- declare module '@soederpop/luca' {
752
+ declare module 'luca' {
754
753
  interface AvailableServers {
755
754
  {{camelName}}: typeof {{PascalName}}
756
755
  }
@@ -823,10 +822,10 @@ When to build a server:
823
822
 
824
823
  \`\`\`ts
825
824
  import { z } from 'zod'
826
- import { Server } from '@soederpop/luca'
827
- import { ServerStateSchema, ServerOptionsSchema, ServerEventsSchema } from '@soederpop/luca'
828
- import type { NodeContainer } from '@soederpop/luca'
829
- import type { ServersInterface } from '@soederpop/luca'
825
+ import { Server } from 'luca'
826
+ import { ServerStateSchema, ServerOptionsSchema, ServerEventsSchema } from 'luca'
827
+ import type { NodeContainer } from 'luca'
828
+ import type { ServersInterface } from 'luca'
830
829
  \`\`\`
831
830
 
832
831
  ## Schemas
@@ -908,7 +907,7 @@ export class {{PascalName}} extends Server<{{PascalName}}State, {{PascalName}}Op
908
907
  ## Module Augmentation
909
908
 
910
909
  \`\`\`ts
911
- declare module '@soederpop/luca' {
910
+ declare module 'luca' {
912
911
  interface AvailableServers {
913
912
  {{camelName}}: typeof {{PascalName}}
914
913
  }
@@ -931,12 +930,12 @@ export default {{PascalName}}
931
930
 
932
931
  \`\`\`ts
933
932
  import { z } from 'zod'
934
- import { Server } from '@soederpop/luca'
935
- import { ServerStateSchema, ServerOptionsSchema, ServerEventsSchema } from '@soederpop/luca'
936
- import type { NodeContainer } from '@soederpop/luca'
937
- import type { ServersInterface } from '@soederpop/luca'
933
+ import { Server } from 'luca'
934
+ import { ServerStateSchema, ServerOptionsSchema, ServerEventsSchema } from 'luca'
935
+ import type { NodeContainer } from 'luca'
936
+ import type { ServersInterface } from 'luca'
938
937
 
939
- declare module '@soederpop/luca' {
938
+ declare module 'luca' {
940
939
  interface AvailableServers {
941
940
  {{camelName}}: typeof {{PascalName}}
942
941
  }
@@ -1011,7 +1010,7 @@ export default {{PascalName}}
1011
1010
  command: {
1012
1011
  sections: [
1013
1012
  { heading: "Imports", code: `import { z } from 'zod'
1014
- import type { ContainerContext } from '@soederpop/luca'` },
1013
+ import type { ContainerContext } from 'luca'` },
1015
1014
  { heading: "Positional Arguments", code: `// luca {{kebabName}} ./src => options.target === './src'
1016
1015
  export const positionals = ['target']` },
1017
1016
  { heading: "Args Schema", code: `export const argsSchema = z.object({
@@ -1033,7 +1032,7 @@ export const positionals = ['target']` },
1033
1032
  // Your implementation here
1034
1033
  }` },
1035
1034
  { heading: "Complete Example", code: `import { z } from 'zod'
1036
- import type { ContainerContext } from '@soederpop/luca'
1035
+ import type { ContainerContext } from 'luca'
1037
1036
 
1038
1037
  export const description = '{{description}}'
1039
1038
 
@@ -1070,7 +1069,7 @@ export default async function {{camelName}}(options: z.infer<typeof argsSchema>,
1070
1069
  }` }
1071
1070
  ],
1072
1071
  full: `import { z } from 'zod'
1073
- import type { ContainerContext } from '@soederpop/luca'
1072
+ import type { ContainerContext } from 'luca'
1074
1073
 
1075
1074
  export const description = '{{description}}'
1076
1075
 
@@ -1100,7 +1099,7 @@ When to build a command:
1100
1099
 
1101
1100
  \`\`\`ts
1102
1101
  import { z } from 'zod'
1103
- import type { ContainerContext } from '@soederpop/luca'
1102
+ import type { ContainerContext } from 'luca'
1104
1103
  \`\`\`
1105
1104
 
1106
1105
  ## Positional Arguments
@@ -1155,7 +1154,7 @@ export default async function {{camelName}}(options: z.infer<typeof argsSchema>,
1155
1154
 
1156
1155
  \`\`\`ts
1157
1156
  import { z } from 'zod'
1158
- import type { ContainerContext } from '@soederpop/luca'
1157
+ import type { ContainerContext } from 'luca'
1159
1158
 
1160
1159
  export const description = '{{description}}'
1161
1160
 
@@ -1322,7 +1321,7 @@ Run \`luca serve\` and they're automatically discovered and mounted.
1322
1321
 
1323
1322
  Endpoints are lightweight — just exports and handler functions. No imports are required.
1324
1323
 
1325
- If your project has \`@soederpop/luca\` as an npm dependency, you can import \`z\` from \`zod\` and \`EndpointContext\` from \`@soederpop/luca\` for type safety. Otherwise, use \`any\` types — the framework handles validation and context injection for you.
1324
+ If your project has \`luca\` as an npm dependency, you can import \`z\` from \`zod\` and \`EndpointContext\` from \`luca\` for type safety. Otherwise, use \`any\` types — the framework handles validation and context injection for you.
1326
1325
 
1327
1326
  Access framework capabilities through the \`ctx\` parameter:
1328
1327
  - \`ctx.container.feature('fs')\` for file operations
@@ -1368,7 +1367,7 @@ Return any object — it's automatically JSON-serialized as the response.
1368
1367
 
1369
1368
  ## Validation Schemas
1370
1369
 
1371
- If \`zod\` is available (via \`@soederpop/luca\` dependency or \`node_modules\`), export Zod schemas to validate parameters for each method. Name them \`{method}Schema\`:
1370
+ If \`zod\` is available (via \`luca\` dependency or \`node_modules\`), export Zod schemas to validate parameters for each method. Name them \`{method}Schema\`:
1372
1371
 
1373
1372
  \`\`\`ts
1374
1373
  import { z } from 'zod'
@@ -1476,7 +1475,7 @@ export { del as delete }
1476
1475
  selector: {
1477
1476
  sections: [
1478
1477
  { heading: "Imports", code: `import { z } from 'zod'
1479
- import type { ContainerContext } from '@soederpop/luca'` },
1478
+ import type { ContainerContext } from 'luca'` },
1480
1479
  { heading: "Args Schema", code: `export const argsSchema = z.object({
1481
1480
  // Add your input arguments here.
1482
1481
  // Example: field: z.string().optional().describe('Specific field to return'),
@@ -1492,7 +1491,7 @@ import type { ContainerContext } from '@soederpop/luca'` },
1492
1491
  return { /* your data */ }
1493
1492
  }` },
1494
1493
  { heading: "Complete Example", code: `import { z } from 'zod'
1495
- import type { ContainerContext } from '@soederpop/luca'
1494
+ import type { ContainerContext } from 'luca'
1496
1495
 
1497
1496
  export const description = '{{description}}'
1498
1497
 
@@ -1506,7 +1505,7 @@ export async function run(args: z.infer<typeof argsSchema>, context: ContainerCo
1506
1505
  }` }
1507
1506
  ],
1508
1507
  full: `import { z } from 'zod'
1509
- import type { ContainerContext } from '@soederpop/luca'
1508
+ import type { ContainerContext } from 'luca'
1510
1509
 
1511
1510
  export const description = '{{description}}'
1512
1511
 
@@ -1531,7 +1530,7 @@ When to build a selector:
1531
1530
 
1532
1531
  \`\`\`ts
1533
1532
  import { z } from 'zod'
1534
- import type { ContainerContext } from '@soederpop/luca'
1533
+ import type { ContainerContext } from 'luca'
1535
1534
  \`\`\`
1536
1535
 
1537
1536
  ## Args Schema
@@ -1587,7 +1586,7 @@ export async function run(args: z.infer<typeof argsSchema>, context: ContainerCo
1587
1586
 
1588
1587
  \`\`\`ts
1589
1588
  import { z } from 'zod'
1590
- import type { ContainerContext } from '@soederpop/luca'
1589
+ import type { ContainerContext } from 'luca'
1591
1590
 
1592
1591
  export const description = '{{description}}'
1593
1592
 
@@ -1660,20 +1659,20 @@ Every capability goes through the container. If you need something that doesn't
1660
1659
 
1661
1660
  ## Import Rule
1662
1661
 
1663
- All consumer code imports from \`@soederpop/luca\` only:
1662
+ All consumer code imports from \`luca\` only:
1664
1663
 
1665
1664
  \`\`\`ts
1666
- import { Feature, features, z, FeatureStateSchema, FeatureOptionsSchema } from '@soederpop/luca'
1667
- import { Client, clients, RestClient, ClientStateSchema } from '@soederpop/luca/client'
1668
- import { Server, servers, ServerStateSchema } from '@soederpop/luca'
1669
- import { commands, CommandOptionsSchema } from '@soederpop/luca'
1665
+ import { Feature, features, z, FeatureStateSchema, FeatureOptionsSchema } from 'luca'
1666
+ import { Client, clients, RestClient, ClientStateSchema } from 'luca/client'
1667
+ import { Server, servers, ServerStateSchema } from 'luca'
1668
+ import { commands, CommandOptionsSchema } from 'luca'
1670
1669
  \`\`\`
1671
1670
 
1672
1671
  Never import from \`fs\`, \`path\`, \`crypto\`, or other Node builtins. Never import third-party packages in consumer code. If a container feature wraps the functionality, use it.
1673
1672
 
1674
1673
  ## Zod v4
1675
1674
 
1676
- This project uses **Zod v4** — import \`z\` from \`@soederpop/luca\`, never from \`'zod'\` directly. All option, state, and event schemas use Zod v4 syntax. Key patterns:
1675
+ This project uses **Zod v4** — import \`z\` from \`luca\`, never from \`'zod'\` directly. All option, state, and event schemas use Zod v4 syntax. Key patterns:
1677
1676
 
1678
1677
  \`\`\`ts
1679
1678
  // Extending base schemas (options, state, events)
@@ -1700,7 +1699,7 @@ Zod v4 differences from v3 that matter:
1700
1699
 
1701
1700
  ## Dependencies
1702
1701
 
1703
- If the project has \`node_modules\` and a package manager, helper implementations can import third-party libraries internally. If not (e.g. running via the \`luca\` binary's VM), all code must import only from \`@soederpop/luca\`.
1702
+ If the project has \`node_modules\` and a package manager, helper implementations can import third-party libraries internally. If not (e.g. running via the \`luca\` binary's VM), all code must import only from \`luca\`.
1704
1703
 
1705
1704
  ## Discovering Capabilities
1706
1705
 
@@ -1719,9 +1718,9 @@ Features access other features via \`this.container.feature(...)\`:
1719
1718
 
1720
1719
  \`\`\`ts
1721
1720
  import { z } from 'zod'
1722
- import { FeatureStateSchema, FeatureOptionsSchema, FeatureEventsSchema } from '@soederpop/luca'
1723
- import { Feature, features } from '@soederpop/luca'
1724
- import type { ContainerContext } from '@soederpop/luca'
1721
+ import { FeatureStateSchema, FeatureOptionsSchema, FeatureEventsSchema } from 'luca'
1722
+ import { Feature, features } from 'luca'
1723
+ import type { ContainerContext } from 'luca'
1725
1724
 
1726
1725
  export const ConfigStateSchema = FeatureStateSchema.extend({
1727
1726
  loaded: z.boolean().default(false).describe('Whether config has been loaded'),
@@ -1753,7 +1752,7 @@ export class Config extends Feature<z.infer<typeof ConfigStateSchema>, z.infer<t
1753
1752
  }
1754
1753
  }
1755
1754
 
1756
- declare module '@soederpop/luca' {
1755
+ declare module 'luca' {
1757
1756
  interface AvailableFeatures { config: typeof Config }
1758
1757
  }
1759
1758
  export default features.register('config', Config)
@@ -1765,8 +1764,8 @@ Clients access features and other clients via \`this.container\`:
1765
1764
 
1766
1765
  \`\`\`ts
1767
1766
  import { z } from 'zod'
1768
- import { Client, clients, ClientStateSchema, ClientOptionsSchema, ClientEventsSchema } from '@soederpop/luca'
1769
- import type { ContainerContext } from '@soederpop/luca'
1767
+ import { Client, clients, ClientStateSchema, ClientOptionsSchema, ClientEventsSchema } from 'luca'
1768
+ import type { ContainerContext } from 'luca'
1770
1769
 
1771
1770
  export const GithubOptionsSchema = ClientOptionsSchema.extend({
1772
1771
  token: z.string().describe('GitHub personal access token'),
@@ -1795,7 +1794,7 @@ export class GithubClient extends Client<z.infer<typeof ClientStateSchema>, z.in
1795
1794
  }
1796
1795
  }
1797
1796
 
1798
- declare module '@soederpop/luca' {
1797
+ declare module 'luca' {
1799
1798
  interface AvailableClients { github: typeof GithubClient }
1800
1799
  }
1801
1800
  export default clients.register('github', GithubClient)
@@ -1811,5 +1810,5 @@ export default clients.register('github', GithubClient)
1811
1810
 
1812
1811
  ## Portability
1813
1812
 
1814
- Code that only imports from \`@soederpop/luca\` can be copied between any luca project. That's the goal. Features, clients, servers, and commands written this way are portable building blocks.
1813
+ Code that only imports from \`luca\` can be copied between any luca project. That's the goal. Features, clients, servers, and commands written this way are portable building blocks.
1815
1814
  `
package/src/selector.ts CHANGED
@@ -29,7 +29,7 @@ export interface SelectorsInterface {
29
29
  *
30
30
  * @example
31
31
  * ```typescript
32
- * declare module '@soederpop/luca' {
32
+ * declare module 'luca' {
33
33
  * interface AvailableSelectors {
34
34
  * packageInfo: SimpleSelector<typeof argsSchema>
35
35
  * }
@@ -183,7 +183,7 @@ export class ExpressServer<T extends ServerState = ServerState, K extends Expres
183
183
  const glob = new Glob('**/*.ts')
184
184
 
185
185
  // Use the helpers feature's VM-aware loader so endpoints can resolve
186
- // packages like zod and @soederpop/luca even from the compiled binary
186
+ // packages like zod and luca even from the compiled binary
187
187
  const helpers = this.container.feature('helpers') as any
188
188
 
189
189
  for await (const file of glob.scan({ cwd: dir, absolute: true })) {
@@ -2,6 +2,8 @@ import { z } from 'zod'
2
2
  import { FeatureStateSchema, FeatureOptionsSchema, FeatureEventsSchema } from '../../schemas/base.js'
3
3
  import { Feature } from '../feature.js'
4
4
  import { Client } from '../../client.js'
5
+ import { allHelperInstances } from '../../container.js'
6
+ import type { Helper } from '../../helper.js'
5
7
  import type { Registry } from '../../registry.js'
6
8
  import type { AssetLoader } from './asset-loader.js'
7
9
 
@@ -106,6 +108,26 @@ export class Helpers extends Feature<HelpersState, HelpersOptions> {
106
108
  this.state.set('manifestLoaded', false)
107
109
  }
108
110
 
111
+ /**
112
+ * Returns all instantiated helper instances across all types, optionally filtered by class.
113
+ *
114
+ * @param FilterClass - When provided, only instances of this class are returned.
115
+ *
116
+ * @example
117
+ * ```typescript
118
+ * // All instances of any type
119
+ * container.helpers.getInstances()
120
+ *
121
+ * // All Assistant instances
122
+ * const assistants = container.helpers.getInstances(Assistant)
123
+ * ```
124
+ */
125
+ getInstances(): Helper[]
126
+ getInstances<T extends Helper>(FilterClass: new (...args: any[]) => T): T[]
127
+ getInstances<T extends Helper>(FilterClass?: new (...args: any[]) => T): Helper[] | T[] {
128
+ return FilterClass ? allHelperInstances(FilterClass) : allHelperInstances()
129
+ }
130
+
109
131
  /**
110
132
  * Returns a unified view of all available helpers across all registries.
111
133
  * Each key is a registry type, each value is the list of helper names in that registry.
package/tsconfig.json CHANGED
@@ -21,18 +21,18 @@
21
21
  "@/*": ["src/*"],
22
22
  "@/web/*": ["src/web/*"],
23
23
  "@/node/*": ["src/node/*"],
24
- "@soederpop/luca": ["src/node.ts"],
25
- "@soederpop/luca/node": ["src/node.ts"],
26
- "@soederpop/luca/node/*": ["src/node/*"],
27
- "@soederpop/luca/agi": ["src/agi/index.ts"],
28
- "@soederpop/luca/agi/*": ["src/agi/*"],
29
- "@soederpop/luca/web": ["src/browser.ts"],
30
- "@soederpop/luca/web/*": ["src/web/*"],
31
- "@soederpop/luca/schemas": ["src/schemas/base.ts"],
32
- "@soederpop/luca/schemas/*": ["src/schemas/*"],
33
- "@soederpop/luca/container": ["src/container.ts"],
34
- "@soederpop/luca/client": ["src/client.ts"],
35
- "@soederpop/luca/feature": ["src/feature.ts"]
24
+ "luca": ["src/node.ts"],
25
+ "luca/node": ["src/node.ts"],
26
+ "luca/node/*": ["src/node/*"],
27
+ "luca/agi": ["src/agi/index.ts"],
28
+ "luca/agi/*": ["src/agi/*"],
29
+ "luca/web": ["src/browser.ts"],
30
+ "luca/web/*": ["src/web/*"],
31
+ "luca/schemas": ["src/schemas/base.ts"],
32
+ "luca/schemas/*": ["src/schemas/*"],
33
+ "luca/container": ["src/container.ts"],
34
+ "luca/client": ["src/client.ts"],
35
+ "luca/feature": ["src/feature.ts"]
36
36
  },
37
37
 
38
38
  // Best practices