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
@@ -1,7 +1,70 @@
1
1
  import { setBuildTimeData, setContainerBuildTimeData } from './index.js';
2
2
 
3
3
  // Auto-generated introspection registry data
4
- // Generated at: 2026-04-10T05:00:52.540Z
4
+
5
+ setBuildTimeData('features.assetLoader', {
6
+ "id": "features.assetLoader",
7
+ "description": "Injects scripts and stylesheets into the page at runtime. Provides helpers for loading external libraries from unpkg.com, injecting arbitrary script/link tags, and managing load state. Used by other web features (e.g. Esbuild) to pull in dependencies on demand.",
8
+ "shortcut": "features.assetLoader",
9
+ "className": "AssetLoader",
10
+ "methods": {
11
+ "removeStylesheet": {
12
+ "description": "",
13
+ "parameters": {
14
+ "href": {
15
+ "type": "string",
16
+ "description": "Parameter href"
17
+ }
18
+ },
19
+ "required": [
20
+ "href"
21
+ ],
22
+ "returns": "void"
23
+ },
24
+ "loadScript": {
25
+ "description": "",
26
+ "parameters": {
27
+ "url": {
28
+ "type": "string",
29
+ "description": "Parameter url"
30
+ }
31
+ },
32
+ "required": [
33
+ "url"
34
+ ],
35
+ "returns": "Promise<void>"
36
+ },
37
+ "unpkg": {
38
+ "description": "",
39
+ "parameters": {
40
+ "packageName": {
41
+ "type": "string",
42
+ "description": "Parameter packageName"
43
+ },
44
+ "globalName": {
45
+ "type": "string",
46
+ "description": "Parameter globalName"
47
+ }
48
+ },
49
+ "required": [
50
+ "packageName",
51
+ "globalName"
52
+ ],
53
+ "returns": "Promise<any>"
54
+ }
55
+ },
56
+ "getters": {},
57
+ "events": {},
58
+ "state": {},
59
+ "options": {},
60
+ "envVars": [],
61
+ "examples": [
62
+ {
63
+ "language": "ts",
64
+ "code": "const loader = container.feature('assetLoader')\nawait loader.loadScript('https://unpkg.com/lodash')\nawait AssetLoader.loadStylesheet('https://unpkg.com/normalize.css')"
65
+ }
66
+ ]
67
+ });
5
68
 
6
69
  setBuildTimeData('features.containerLink', {
7
70
  "id": "features.containerLink",
@@ -150,37 +213,139 @@ setBuildTimeData('features.esbuild', {
150
213
  ]
151
214
  });
152
215
 
153
- setBuildTimeData('features.voice', {
154
- "id": "features.voice",
155
- "description": "Speech-to-text recognition using the Web Speech API (SpeechRecognition). Wraps the browser's built-in speech recognition, supporting continuous listening, interim results, and language selection. Recognized text is accumulated in state and emitted as events for real-time transcription UIs.",
156
- "shortcut": "features.voice",
157
- "className": "VoiceRecognition",
216
+ setBuildTimeData('features.helpers', {
217
+ "id": "features.helpers",
218
+ "description": "The Helpers feature discovers and loads project-level helpers from a JSON manifest served over HTTP. Scripts are injected via AssetLoader and self-register into the container's registries. This is the web equivalent of the node Helpers feature, which scans the filesystem. Instead of filesystem scanning, this feature fetches a manifest from a well-known URL and uses AssetLoader.loadScript() to inject each helper's script tag.",
219
+ "shortcut": "features.helpers",
220
+ "className": "Helpers",
158
221
  "methods": {
159
- "whenFinished": {
222
+ "setManifestURL": {
223
+ "description": "Set a new manifest URL. Invalidates any cached manifest.",
224
+ "parameters": {
225
+ "url": {
226
+ "type": "string",
227
+ "description": "The new URL to fetch the manifest from"
228
+ }
229
+ },
230
+ "required": [
231
+ "url"
232
+ ],
233
+ "returns": "void"
234
+ },
235
+ "getInstances": {
160
236
  "description": "",
237
+ "parameters": {
238
+ "FilterClass": {
239
+ "type": "new (...args: any[]) => T",
240
+ "description": "Parameter FilterClass"
241
+ }
242
+ },
243
+ "required": [],
244
+ "returns": "Helper[] | T[]"
245
+ },
246
+ "discover": {
247
+ "description": "Discover and register helpers of the given type from the manifest. Fetches the manifest, then for each entry of the requested type, loads the script via AssetLoader and checks what got newly registered.",
248
+ "parameters": {
249
+ "type": {
250
+ "type": "RegistryType",
251
+ "description": "Which type of helpers to discover ('features' or 'clients')"
252
+ }
253
+ },
254
+ "required": [
255
+ "type"
256
+ ],
257
+ "returns": "Promise<string[]>"
258
+ },
259
+ "discoverAll": {
260
+ "description": "Discover all helper types from the manifest.",
161
261
  "parameters": {},
162
262
  "required": [],
163
- "returns": "void"
263
+ "returns": "Promise<Record<string, string[]>>"
164
264
  },
165
- "start": {
166
- "description": "",
265
+ "discoverFeatures": {
266
+ "description": "Convenience method to discover only features.",
167
267
  "parameters": {},
168
268
  "required": [],
169
- "returns": "void"
269
+ "returns": "Promise<string[]>"
170
270
  },
171
- "stop": {
172
- "description": "",
271
+ "discoverClients": {
272
+ "description": "Convenience method to discover only clients.",
173
273
  "parameters": {},
174
274
  "required": [],
175
- "returns": "void"
275
+ "returns": "Promise<string[]>"
176
276
  },
177
- "abort": {
277
+ "lookup": {
278
+ "description": "Look up a helper class by type and name.",
279
+ "parameters": {
280
+ "type": {
281
+ "type": "RegistryType",
282
+ "description": "The registry type"
283
+ },
284
+ "name": {
285
+ "type": "string",
286
+ "description": "The helper name within that registry"
287
+ }
288
+ },
289
+ "required": [
290
+ "type",
291
+ "name"
292
+ ],
293
+ "returns": "any"
294
+ },
295
+ "describe": {
296
+ "description": "Get the introspection description for a specific helper.",
297
+ "parameters": {
298
+ "type": {
299
+ "type": "RegistryType",
300
+ "description": "The registry type"
301
+ },
302
+ "name": {
303
+ "type": "string",
304
+ "description": "The helper name"
305
+ }
306
+ },
307
+ "required": [
308
+ "type",
309
+ "name"
310
+ ],
311
+ "returns": "string"
312
+ }
313
+ },
314
+ "getters": {
315
+ "manifestURL": {
316
+ "description": "The URL to fetch the helpers manifest from.",
317
+ "returns": "string"
318
+ },
319
+ "available": {
320
+ "description": "Returns a unified view of all available helpers across all registries. Each key is a registry type, each value is the list of helper names in that registry.",
321
+ "returns": "Record<string, string[]>"
322
+ }
323
+ },
324
+ "events": {},
325
+ "state": {},
326
+ "options": {},
327
+ "envVars": [],
328
+ "examples": [
329
+ {
330
+ "language": "ts",
331
+ "code": "const helpers = container.feature('helpers', { enable: true })\n\n// Discover all helper types from the manifest\nawait helpers.discoverAll()\n\n// Discover a specific type\nawait helpers.discover('features')\n\n// Unified view of all available helpers\nconsole.log(helpers.available)"
332
+ }
333
+ ]
334
+ });
335
+
336
+ setBuildTimeData('features.network', {
337
+ "id": "features.network",
338
+ "description": "Tracks browser online/offline connectivity state. Listens for the browser's `online` and `offline` events and keeps the feature state in sync. Other features can observe the `offline` state value or listen for change events to react to connectivity changes.",
339
+ "shortcut": "features.network",
340
+ "className": "Network",
341
+ "methods": {
342
+ "start": {
178
343
  "description": "",
179
344
  "parameters": {},
180
345
  "required": [],
181
346
  "returns": "void"
182
347
  },
183
- "clearTranscript": {
348
+ "disable": {
184
349
  "description": "",
185
350
  "parameters": {},
186
351
  "required": [],
@@ -188,96 +353,86 @@ setBuildTimeData('features.voice', {
188
353
  }
189
354
  },
190
355
  "getters": {
191
- "listening": {
192
- "description": "Whether the speech recognizer is currently listening for audio input.",
356
+ "isOffline": {
357
+ "description": "Whether the browser is currently offline.",
193
358
  "returns": "any"
194
359
  },
195
- "transcript": {
196
- "description": "Returns the accumulated final transcript text from recognition results.",
360
+ "isOnline": {
361
+ "description": "Whether the browser is currently online.",
197
362
  "returns": "any"
198
363
  }
199
364
  },
200
- "events": {
201
- "start": {
202
- "name": "start",
203
- "description": "Event emitted by VoiceRecognition",
204
- "arguments": {}
205
- },
206
- "stop": {
207
- "name": "stop",
208
- "description": "Event emitted by VoiceRecognition",
209
- "arguments": {}
210
- },
211
- "abort": {
212
- "name": "abort",
213
- "description": "Event emitted by VoiceRecognition",
214
- "arguments": {}
215
- }
216
- },
365
+ "events": {},
217
366
  "state": {},
218
367
  "options": {},
219
368
  "envVars": [],
220
369
  "examples": [
221
370
  {
222
371
  "language": "ts",
223
- "code": "const voice = container.feature('voice', { continuous: true, autoListen: true })\n\nvoice.on('transcript', ({ text }) => {\n console.log('Heard:', text)\n})\n\n// Or start manually\nvoice.start()"
372
+ "code": "const network = container.feature('network')\nconsole.log(network.state.get('offline')) // false when online\n\nnetwork.on('stateChanged', ({ offline }) => {\n console.log(offline ? 'Went offline' : 'Back online')\n})"
224
373
  }
225
374
  ]
226
375
  });
227
376
 
228
- setBuildTimeData('features.vm', {
229
- "id": "features.vm",
230
- "description": "Sandboxed JavaScript execution environment for the browser. Automatically injects the container's context object into the global scope, so evaluated code can use anything provided by the container. Useful for live code playgrounds, plugin systems, and dynamic script evaluation.",
231
- "shortcut": "features.vm",
232
- "className": "VM",
377
+ setBuildTimeData('features.speech', {
378
+ "id": "features.speech",
379
+ "description": "Text-to-speech synthesis using the Web Speech API (SpeechSynthesis). Wraps the browser's built-in speech synthesis, providing voice selection, queue management, and state tracking. Voices are discovered on init and exposed via state for UI binding.",
380
+ "shortcut": "features.speech",
381
+ "className": "Speech",
233
382
  "methods": {
234
- "createScript": {
383
+ "loadVoices": {
384
+ "description": "",
385
+ "parameters": {},
386
+ "required": [],
387
+ "returns": "void"
388
+ },
389
+ "setDefaultVoice": {
235
390
  "description": "",
236
391
  "parameters": {
237
- "code": {
392
+ "name": {
238
393
  "type": "string",
239
- "description": "Parameter code"
394
+ "description": "Parameter name"
240
395
  }
241
396
  },
242
397
  "required": [
243
- "code"
398
+ "name"
244
399
  ],
245
400
  "returns": "void"
246
401
  },
247
- "createContext": {
402
+ "cancel": {
248
403
  "description": "",
249
- "parameters": {
250
- "ctx": {
251
- "type": "any",
252
- "description": "Parameter ctx"
253
- }
254
- },
404
+ "parameters": {},
255
405
  "required": [],
256
406
  "returns": "void"
257
407
  },
258
- "run": {
408
+ "say": {
259
409
  "description": "",
260
410
  "parameters": {
261
- "code": {
411
+ "text": {
262
412
  "type": "string",
263
- "description": "Parameter code"
264
- },
265
- "ctx": {
266
- "type": "any",
267
- "description": "Parameter ctx"
413
+ "description": "Parameter text"
268
414
  },
269
415
  "options": {
270
- "type": "any",
416
+ "type": "{ voice?: Voice }",
271
417
  "description": "Parameter options"
272
418
  }
273
419
  },
274
420
  "required": [
275
- "code"
421
+ "text"
276
422
  ],
277
423
  "returns": "void"
278
424
  }
279
425
  },
280
- "getters": {},
426
+ "getters": {
427
+ "voices": {
428
+ "description": "Returns the array of available speech synthesis voices.",
429
+ "returns": "any"
430
+ },
431
+ "defaultVoice": {
432
+ "description": "Returns the Voice object matching the currently selected default voice name.",
433
+ "returns": "any"
434
+ }
435
+ },
281
436
  "events": {},
282
437
  "state": {},
283
438
  "options": {},
@@ -285,73 +440,36 @@ setBuildTimeData('features.vm', {
285
440
  "examples": [
286
441
  {
287
442
  "language": "ts",
288
- "code": "const vm = container.feature('vm')\nconst result = vm.run('1 + 2 + 3') // 6\nconst greeting = vm.run('container.uuid') // accesses container globals"
443
+ "code": "const speech = container.feature('speech')\nspeech.say('Hello from the browser!')\n\n// Choose a specific voice\nconst speech = container.feature('speech', { voice: 'Google UK English Female' })\nspeech.say('Cheerio!')"
289
444
  }
290
- ]
291
- });
292
-
293
- setBuildTimeData('features.assetLoader', {
294
- "id": "features.assetLoader",
295
- "description": "Injects scripts and stylesheets into the page at runtime. Provides helpers for loading external libraries from unpkg.com, injecting arbitrary script/link tags, and managing load state. Used by other web features (e.g. Esbuild) to pull in dependencies on demand.",
296
- "shortcut": "features.assetLoader",
297
- "className": "AssetLoader",
298
- "methods": {
299
- "removeStylesheet": {
300
- "description": "",
301
- "parameters": {
302
- "href": {
303
- "type": "string",
304
- "description": "Parameter href"
305
- }
306
- },
307
- "required": [
308
- "href"
309
- ],
310
- "returns": "void"
311
- },
312
- "loadScript": {
445
+ ],
446
+ "types": {
447
+ "Voice": {
313
448
  "description": "",
314
- "parameters": {
315
- "url": {
449
+ "properties": {
450
+ "voiceURI": {
316
451
  "type": "string",
317
- "description": "Parameter url"
318
- }
319
- },
320
- "required": [
321
- "url"
322
- ],
323
- "returns": "Promise<void>"
324
- },
325
- "unpkg": {
326
- "description": "",
327
- "parameters": {
328
- "packageName": {
452
+ "description": ""
453
+ },
454
+ "name": {
329
455
  "type": "string",
330
- "description": "Parameter packageName"
456
+ "description": ""
331
457
  },
332
- "globalName": {
458
+ "lang": {
333
459
  "type": "string",
334
- "description": "Parameter globalName"
460
+ "description": ""
461
+ },
462
+ "localService": {
463
+ "type": "boolean",
464
+ "description": ""
465
+ },
466
+ "default": {
467
+ "type": "boolean",
468
+ "description": ""
335
469
  }
336
- },
337
- "required": [
338
- "packageName",
339
- "globalName"
340
- ],
341
- "returns": "Promise<any>"
342
- }
343
- },
344
- "getters": {},
345
- "events": {},
346
- "state": {},
347
- "options": {},
348
- "envVars": [],
349
- "examples": [
350
- {
351
- "language": "ts",
352
- "code": "const loader = container.feature('assetLoader')\nawait loader.loadScript('https://unpkg.com/lodash')\nawait AssetLoader.loadStylesheet('https://unpkg.com/normalize.css')"
470
+ }
353
471
  }
354
- ]
472
+ }
355
473
  });
356
474
 
357
475
  setBuildTimeData('features.vault', {
@@ -411,106 +529,59 @@ setBuildTimeData('features.vault', {
411
529
  ]
412
530
  });
413
531
 
414
- setBuildTimeData('features.network', {
415
- "id": "features.network",
416
- "description": "Tracks browser online/offline connectivity state. Listens for the browser's `online` and `offline` events and keeps the feature state in sync. Other features can observe the `offline` state value or listen for change events to react to connectivity changes.",
417
- "shortcut": "features.network",
418
- "className": "Network",
419
- "methods": {
420
- "start": {
421
- "description": "",
422
- "parameters": {},
423
- "required": [],
424
- "returns": "void"
425
- },
426
- "disable": {
427
- "description": "",
428
- "parameters": {},
429
- "required": [],
430
- "returns": "void"
431
- }
432
- },
433
- "getters": {
434
- "isOffline": {
435
- "description": "Whether the browser is currently offline.",
436
- "returns": "any"
437
- },
438
- "isOnline": {
439
- "description": "Whether the browser is currently online.",
440
- "returns": "any"
441
- }
442
- },
443
- "events": {},
444
- "state": {},
445
- "options": {},
446
- "envVars": [],
447
- "examples": [
448
- {
449
- "language": "ts",
450
- "code": "const network = container.feature('network')\nconsole.log(network.state.get('offline')) // false when online\n\nnetwork.on('stateChanged', ({ offline }) => {\n console.log(offline ? 'Went offline' : 'Back online')\n})"
451
- }
452
- ]
453
- });
454
-
455
- setBuildTimeData('features.speech', {
456
- "id": "features.speech",
457
- "description": "Text-to-speech synthesis using the Web Speech API (SpeechSynthesis). Wraps the browser's built-in speech synthesis, providing voice selection, queue management, and state tracking. Voices are discovered on init and exposed via state for UI binding.",
458
- "shortcut": "features.speech",
459
- "className": "Speech",
532
+ setBuildTimeData('features.vm', {
533
+ "id": "features.vm",
534
+ "description": "Sandboxed JavaScript execution environment for the browser. Automatically injects the container's context object into the global scope, so evaluated code can use anything provided by the container. Useful for live code playgrounds, plugin systems, and dynamic script evaluation.",
535
+ "shortcut": "features.vm",
536
+ "className": "VM",
460
537
  "methods": {
461
- "loadVoices": {
462
- "description": "",
463
- "parameters": {},
464
- "required": [],
465
- "returns": "void"
466
- },
467
- "setDefaultVoice": {
538
+ "createScript": {
468
539
  "description": "",
469
540
  "parameters": {
470
- "name": {
541
+ "code": {
471
542
  "type": "string",
472
- "description": "Parameter name"
543
+ "description": "Parameter code"
473
544
  }
474
545
  },
475
546
  "required": [
476
- "name"
547
+ "code"
477
548
  ],
478
549
  "returns": "void"
479
550
  },
480
- "cancel": {
551
+ "createContext": {
481
552
  "description": "",
482
- "parameters": {},
553
+ "parameters": {
554
+ "ctx": {
555
+ "type": "any",
556
+ "description": "Parameter ctx"
557
+ }
558
+ },
483
559
  "required": [],
484
560
  "returns": "void"
485
561
  },
486
- "say": {
562
+ "run": {
487
563
  "description": "",
488
564
  "parameters": {
489
- "text": {
565
+ "code": {
490
566
  "type": "string",
491
- "description": "Parameter text"
567
+ "description": "Parameter code"
568
+ },
569
+ "ctx": {
570
+ "type": "any",
571
+ "description": "Parameter ctx"
492
572
  },
493
573
  "options": {
494
- "type": "{ voice?: Voice }",
574
+ "type": "any",
495
575
  "description": "Parameter options"
496
576
  }
497
577
  },
498
578
  "required": [
499
- "text"
579
+ "code"
500
580
  ],
501
581
  "returns": "void"
502
582
  }
503
583
  },
504
- "getters": {
505
- "voices": {
506
- "description": "Returns the array of available speech synthesis voices.",
507
- "returns": "any"
508
- },
509
- "defaultVoice": {
510
- "description": "Returns the Voice object matching the currently selected default voice name.",
511
- "returns": "any"
512
- }
513
- },
584
+ "getters": {},
514
585
  "events": {},
515
586
  "state": {},
516
587
  "options": {},
@@ -518,143 +589,82 @@ setBuildTimeData('features.speech', {
518
589
  "examples": [
519
590
  {
520
591
  "language": "ts",
521
- "code": "const speech = container.feature('speech')\nspeech.say('Hello from the browser!')\n\n// Choose a specific voice\nconst speech = container.feature('speech', { voice: 'Google UK English Female' })\nspeech.say('Cheerio!')"
522
- }
523
- ],
524
- "types": {
525
- "Voice": {
526
- "description": "",
527
- "properties": {
528
- "voiceURI": {
529
- "type": "string",
530
- "description": ""
531
- },
532
- "name": {
533
- "type": "string",
534
- "description": ""
535
- },
536
- "lang": {
537
- "type": "string",
538
- "description": ""
539
- },
540
- "localService": {
541
- "type": "boolean",
542
- "description": ""
543
- },
544
- "default": {
545
- "type": "boolean",
546
- "description": ""
547
- }
548
- }
592
+ "code": "const vm = container.feature('vm')\nconst result = vm.run('1 + 2 + 3') // 6\nconst greeting = vm.run('container.uuid') // accesses container globals"
549
593
  }
550
- }
594
+ ]
551
595
  });
552
596
 
553
- setBuildTimeData('features.helpers', {
554
- "id": "features.helpers",
555
- "description": "The Helpers feature discovers and loads project-level helpers from a JSON manifest served over HTTP. Scripts are injected via AssetLoader and self-register into the container's registries. This is the web equivalent of the node Helpers feature, which scans the filesystem. Instead of filesystem scanning, this feature fetches a manifest from a well-known URL and uses AssetLoader.loadScript() to inject each helper's script tag.",
556
- "shortcut": "features.helpers",
557
- "className": "Helpers",
597
+ setBuildTimeData('features.voice', {
598
+ "id": "features.voice",
599
+ "description": "Speech-to-text recognition using the Web Speech API (SpeechRecognition). Wraps the browser's built-in speech recognition, supporting continuous listening, interim results, and language selection. Recognized text is accumulated in state and emitted as events for real-time transcription UIs.",
600
+ "shortcut": "features.voice",
601
+ "className": "VoiceRecognition",
558
602
  "methods": {
559
- "setManifestURL": {
560
- "description": "Set a new manifest URL. Invalidates any cached manifest.",
561
- "parameters": {
562
- "url": {
563
- "type": "string",
564
- "description": "The new URL to fetch the manifest from"
565
- }
566
- },
567
- "required": [
568
- "url"
569
- ],
603
+ "whenFinished": {
604
+ "description": "",
605
+ "parameters": {},
606
+ "required": [],
570
607
  "returns": "void"
571
608
  },
572
- "discover": {
573
- "description": "Discover and register helpers of the given type from the manifest. Fetches the manifest, then for each entry of the requested type, loads the script via AssetLoader and checks what got newly registered.",
574
- "parameters": {
575
- "type": {
576
- "type": "RegistryType",
577
- "description": "Which type of helpers to discover ('features' or 'clients')"
578
- }
579
- },
580
- "required": [
581
- "type"
582
- ],
583
- "returns": "Promise<string[]>"
584
- },
585
- "discoverAll": {
586
- "description": "Discover all helper types from the manifest.",
609
+ "start": {
610
+ "description": "",
587
611
  "parameters": {},
588
612
  "required": [],
589
- "returns": "Promise<Record<string, string[]>>"
613
+ "returns": "void"
590
614
  },
591
- "discoverFeatures": {
592
- "description": "Convenience method to discover only features.",
615
+ "stop": {
616
+ "description": "",
593
617
  "parameters": {},
594
618
  "required": [],
595
- "returns": "Promise<string[]>"
619
+ "returns": "void"
596
620
  },
597
- "discoverClients": {
598
- "description": "Convenience method to discover only clients.",
621
+ "abort": {
622
+ "description": "",
599
623
  "parameters": {},
600
624
  "required": [],
601
- "returns": "Promise<string[]>"
625
+ "returns": "void"
602
626
  },
603
- "lookup": {
604
- "description": "Look up a helper class by type and name.",
605
- "parameters": {
606
- "type": {
607
- "type": "RegistryType",
608
- "description": "The registry type"
609
- },
610
- "name": {
611
- "type": "string",
612
- "description": "The helper name within that registry"
613
- }
614
- },
615
- "required": [
616
- "type",
617
- "name"
618
- ],
627
+ "clearTranscript": {
628
+ "description": "",
629
+ "parameters": {},
630
+ "required": [],
631
+ "returns": "void"
632
+ }
633
+ },
634
+ "getters": {
635
+ "listening": {
636
+ "description": "Whether the speech recognizer is currently listening for audio input.",
619
637
  "returns": "any"
620
638
  },
621
- "describe": {
622
- "description": "Get the introspection description for a specific helper.",
623
- "parameters": {
624
- "type": {
625
- "type": "RegistryType",
626
- "description": "The registry type"
627
- },
628
- "name": {
629
- "type": "string",
630
- "description": "The helper name"
631
- }
632
- },
633
- "required": [
634
- "type",
635
- "name"
636
- ],
637
- "returns": "string"
639
+ "transcript": {
640
+ "description": "Returns the accumulated final transcript text from recognition results.",
641
+ "returns": "any"
638
642
  }
639
643
  },
640
- "getters": {
641
- "manifestURL": {
642
- "description": "The URL to fetch the helpers manifest from.",
643
- "returns": "string"
644
+ "events": {
645
+ "start": {
646
+ "name": "start",
647
+ "description": "Event emitted by VoiceRecognition",
648
+ "arguments": {}
644
649
  },
645
- "available": {
646
- "description": "Returns a unified view of all available helpers across all registries. Each key is a registry type, each value is the list of helper names in that registry.",
647
- "returns": "Record<string, string[]>"
650
+ "stop": {
651
+ "name": "stop",
652
+ "description": "Event emitted by VoiceRecognition",
653
+ "arguments": {}
654
+ },
655
+ "abort": {
656
+ "name": "abort",
657
+ "description": "Event emitted by VoiceRecognition",
658
+ "arguments": {}
648
659
  }
649
660
  },
650
- "events": {},
651
661
  "state": {},
652
662
  "options": {},
653
663
  "envVars": [],
654
664
  "examples": [
655
665
  {
656
666
  "language": "ts",
657
- "code": "const helpers = container.feature('helpers', { enable: true })\n\n// Discover all helper types from the manifest\nawait helpers.discoverAll()\n\n// Discover a specific type\nawait helpers.discover('features')\n\n// Unified view of all available helpers\nconsole.log(helpers.available)"
667
+ "code": "const voice = container.feature('voice', { continuous: true, autoListen: true })\n\nvoice.on('transcript', ({ text }) => {\n console.log('Heard:', text)\n})\n\n// Or start manually\nvoice.start()"
658
668
  }
659
669
  ]
660
670
  });
@@ -1122,14 +1132,77 @@ setContainerBuildTimeData('WebContainer', {
1122
1132
  "description": "Returns the SocketClient class for WebSocket connections.",
1123
1133
  "returns": "any"
1124
1134
  },
1125
- "RestClient": {
1126
- "description": "Returns the RestClient class for HTTP REST API connections.",
1127
- "returns": "any"
1128
- }
1135
+ "RestClient": {
1136
+ "description": "Returns the RestClient class for HTTP REST API connections.",
1137
+ "returns": "any"
1138
+ }
1139
+ },
1140
+ "events": {}
1141
+ });
1142
+ export const introspectionData = [
1143
+ {
1144
+ "id": "features.assetLoader",
1145
+ "description": "Injects scripts and stylesheets into the page at runtime. Provides helpers for loading external libraries from unpkg.com, injecting arbitrary script/link tags, and managing load state. Used by other web features (e.g. Esbuild) to pull in dependencies on demand.",
1146
+ "shortcut": "features.assetLoader",
1147
+ "className": "AssetLoader",
1148
+ "methods": {
1149
+ "removeStylesheet": {
1150
+ "description": "",
1151
+ "parameters": {
1152
+ "href": {
1153
+ "type": "string",
1154
+ "description": "Parameter href"
1155
+ }
1156
+ },
1157
+ "required": [
1158
+ "href"
1159
+ ],
1160
+ "returns": "void"
1161
+ },
1162
+ "loadScript": {
1163
+ "description": "",
1164
+ "parameters": {
1165
+ "url": {
1166
+ "type": "string",
1167
+ "description": "Parameter url"
1168
+ }
1169
+ },
1170
+ "required": [
1171
+ "url"
1172
+ ],
1173
+ "returns": "Promise<void>"
1174
+ },
1175
+ "unpkg": {
1176
+ "description": "",
1177
+ "parameters": {
1178
+ "packageName": {
1179
+ "type": "string",
1180
+ "description": "Parameter packageName"
1181
+ },
1182
+ "globalName": {
1183
+ "type": "string",
1184
+ "description": "Parameter globalName"
1185
+ }
1186
+ },
1187
+ "required": [
1188
+ "packageName",
1189
+ "globalName"
1190
+ ],
1191
+ "returns": "Promise<any>"
1192
+ }
1193
+ },
1194
+ "getters": {},
1195
+ "events": {},
1196
+ "state": {},
1197
+ "options": {},
1198
+ "envVars": [],
1199
+ "examples": [
1200
+ {
1201
+ "language": "ts",
1202
+ "code": "const loader = container.feature('assetLoader')\nawait loader.loadScript('https://unpkg.com/lodash')\nawait AssetLoader.loadStylesheet('https://unpkg.com/normalize.css')"
1203
+ }
1204
+ ]
1129
1205
  },
1130
- "events": {}
1131
- });
1132
- export const introspectionData = [
1133
1206
  {
1134
1207
  "id": "features.containerLink",
1135
1208
  "description": "ContainerLink (Web-side) — WebSocket client that connects to a node host. Connects to a ContainerLink host over WebSocket. The host can evaluate code in this container, and the web side can emit structured events to the host. The web side can NEVER eval code in the host — trust is strictly one-way.",
@@ -1276,251 +1349,113 @@ export const introspectionData = [
1276
1349
  ]
1277
1350
  },
1278
1351
  {
1279
- "id": "features.voice",
1280
- "description": "Speech-to-text recognition using the Web Speech API (SpeechRecognition). Wraps the browser's built-in speech recognition, supporting continuous listening, interim results, and language selection. Recognized text is accumulated in state and emitted as events for real-time transcription UIs.",
1281
- "shortcut": "features.voice",
1282
- "className": "VoiceRecognition",
1283
- "methods": {
1284
- "whenFinished": {
1285
- "description": "",
1286
- "parameters": {},
1287
- "required": [],
1288
- "returns": "void"
1289
- },
1290
- "start": {
1291
- "description": "",
1292
- "parameters": {},
1293
- "required": [],
1294
- "returns": "void"
1295
- },
1296
- "stop": {
1297
- "description": "",
1298
- "parameters": {},
1299
- "required": [],
1300
- "returns": "void"
1301
- },
1302
- "abort": {
1303
- "description": "",
1304
- "parameters": {},
1305
- "required": [],
1306
- "returns": "void"
1307
- },
1308
- "clearTranscript": {
1309
- "description": "",
1310
- "parameters": {},
1311
- "required": [],
1312
- "returns": "void"
1313
- }
1314
- },
1315
- "getters": {
1316
- "listening": {
1317
- "description": "Whether the speech recognizer is currently listening for audio input.",
1318
- "returns": "any"
1319
- },
1320
- "transcript": {
1321
- "description": "Returns the accumulated final transcript text from recognition results.",
1322
- "returns": "any"
1323
- }
1324
- },
1325
- "events": {
1326
- "start": {
1327
- "name": "start",
1328
- "description": "Event emitted by VoiceRecognition",
1329
- "arguments": {}
1330
- },
1331
- "stop": {
1332
- "name": "stop",
1333
- "description": "Event emitted by VoiceRecognition",
1334
- "arguments": {}
1335
- },
1336
- "abort": {
1337
- "name": "abort",
1338
- "description": "Event emitted by VoiceRecognition",
1339
- "arguments": {}
1340
- }
1341
- },
1342
- "state": {},
1343
- "options": {},
1344
- "envVars": [],
1345
- "examples": [
1346
- {
1347
- "language": "ts",
1348
- "code": "const voice = container.feature('voice', { continuous: true, autoListen: true })\n\nvoice.on('transcript', ({ text }) => {\n console.log('Heard:', text)\n})\n\n// Or start manually\nvoice.start()"
1349
- }
1350
- ]
1351
- },
1352
- {
1353
- "id": "features.vm",
1354
- "description": "Sandboxed JavaScript execution environment for the browser. Automatically injects the container's context object into the global scope, so evaluated code can use anything provided by the container. Useful for live code playgrounds, plugin systems, and dynamic script evaluation.",
1355
- "shortcut": "features.vm",
1356
- "className": "VM",
1352
+ "id": "features.helpers",
1353
+ "description": "The Helpers feature discovers and loads project-level helpers from a JSON manifest served over HTTP. Scripts are injected via AssetLoader and self-register into the container's registries. This is the web equivalent of the node Helpers feature, which scans the filesystem. Instead of filesystem scanning, this feature fetches a manifest from a well-known URL and uses AssetLoader.loadScript() to inject each helper's script tag.",
1354
+ "shortcut": "features.helpers",
1355
+ "className": "Helpers",
1357
1356
  "methods": {
1358
- "createScript": {
1359
- "description": "",
1357
+ "setManifestURL": {
1358
+ "description": "Set a new manifest URL. Invalidates any cached manifest.",
1360
1359
  "parameters": {
1361
- "code": {
1360
+ "url": {
1362
1361
  "type": "string",
1363
- "description": "Parameter code"
1362
+ "description": "The new URL to fetch the manifest from"
1364
1363
  }
1365
1364
  },
1366
1365
  "required": [
1367
- "code"
1366
+ "url"
1368
1367
  ],
1369
1368
  "returns": "void"
1370
1369
  },
1371
- "createContext": {
1370
+ "getInstances": {
1372
1371
  "description": "",
1373
1372
  "parameters": {
1374
- "ctx": {
1375
- "type": "any",
1376
- "description": "Parameter ctx"
1373
+ "FilterClass": {
1374
+ "type": "new (...args: any[]) => T",
1375
+ "description": "Parameter FilterClass"
1377
1376
  }
1378
1377
  },
1379
1378
  "required": [],
1380
- "returns": "void"
1379
+ "returns": "Helper[] | T[]"
1381
1380
  },
1382
- "run": {
1383
- "description": "",
1384
- "parameters": {
1385
- "code": {
1386
- "type": "string",
1387
- "description": "Parameter code"
1388
- },
1389
- "ctx": {
1390
- "type": "any",
1391
- "description": "Parameter ctx"
1392
- },
1393
- "options": {
1394
- "type": "any",
1395
- "description": "Parameter options"
1396
- }
1397
- },
1398
- "required": [
1399
- "code"
1400
- ],
1401
- "returns": "void"
1402
- }
1403
- },
1404
- "getters": {},
1405
- "events": {},
1406
- "state": {},
1407
- "options": {},
1408
- "envVars": [],
1409
- "examples": [
1410
- {
1411
- "language": "ts",
1412
- "code": "const vm = container.feature('vm')\nconst result = vm.run('1 + 2 + 3') // 6\nconst greeting = vm.run('container.uuid') // accesses container globals"
1413
- }
1414
- ]
1415
- },
1416
- {
1417
- "id": "features.assetLoader",
1418
- "description": "Injects scripts and stylesheets into the page at runtime. Provides helpers for loading external libraries from unpkg.com, injecting arbitrary script/link tags, and managing load state. Used by other web features (e.g. Esbuild) to pull in dependencies on demand.",
1419
- "shortcut": "features.assetLoader",
1420
- "className": "AssetLoader",
1421
- "methods": {
1422
- "removeStylesheet": {
1423
- "description": "",
1381
+ "discover": {
1382
+ "description": "Discover and register helpers of the given type from the manifest. Fetches the manifest, then for each entry of the requested type, loads the script via AssetLoader and checks what got newly registered.",
1424
1383
  "parameters": {
1425
- "href": {
1426
- "type": "string",
1427
- "description": "Parameter href"
1384
+ "type": {
1385
+ "type": "RegistryType",
1386
+ "description": "Which type of helpers to discover ('features' or 'clients')"
1428
1387
  }
1429
1388
  },
1430
1389
  "required": [
1431
- "href"
1390
+ "type"
1432
1391
  ],
1433
- "returns": "void"
1392
+ "returns": "Promise<string[]>"
1434
1393
  },
1435
- "loadScript": {
1436
- "description": "",
1437
- "parameters": {
1438
- "url": {
1439
- "type": "string",
1440
- "description": "Parameter url"
1441
- }
1442
- },
1443
- "required": [
1444
- "url"
1445
- ],
1446
- "returns": "Promise<void>"
1394
+ "discoverAll": {
1395
+ "description": "Discover all helper types from the manifest.",
1396
+ "parameters": {},
1397
+ "required": [],
1398
+ "returns": "Promise<Record<string, string[]>>"
1447
1399
  },
1448
- "unpkg": {
1449
- "description": "",
1450
- "parameters": {
1451
- "packageName": {
1452
- "type": "string",
1453
- "description": "Parameter packageName"
1454
- },
1455
- "globalName": {
1456
- "type": "string",
1457
- "description": "Parameter globalName"
1458
- }
1459
- },
1460
- "required": [
1461
- "packageName",
1462
- "globalName"
1463
- ],
1464
- "returns": "Promise<any>"
1465
- }
1466
- },
1467
- "getters": {},
1468
- "events": {},
1469
- "state": {},
1470
- "options": {},
1471
- "envVars": [],
1472
- "examples": [
1473
- {
1474
- "language": "ts",
1475
- "code": "const loader = container.feature('assetLoader')\nawait loader.loadScript('https://unpkg.com/lodash')\nawait AssetLoader.loadStylesheet('https://unpkg.com/normalize.css')"
1476
- }
1477
- ]
1478
- },
1479
- {
1480
- "id": "features.vault",
1481
- "description": "AES-256-GCM encryption and decryption for the browser using the Web Crypto API. Generates or accepts a secret key and provides `encrypt()` / `decrypt()` methods that work entirely client-side. Keys are stored as base64-encoded state so they can persist across sessions when needed.",
1482
- "shortcut": "features.vault",
1483
- "className": "WebVault",
1484
- "methods": {
1485
- "secret": {
1486
- "description": "",
1487
- "parameters": {
1488
- "{ refresh = false, set = true }": {
1489
- "type": "any",
1490
- "description": "Parameter { refresh = false, set = true }"
1491
- }
1492
- },
1400
+ "discoverFeatures": {
1401
+ "description": "Convenience method to discover only features.",
1402
+ "parameters": {},
1493
1403
  "required": [],
1494
- "returns": "Promise<ArrayBuffer>"
1404
+ "returns": "Promise<string[]>"
1495
1405
  },
1496
- "decrypt": {
1497
- "description": "",
1406
+ "discoverClients": {
1407
+ "description": "Convenience method to discover only clients.",
1408
+ "parameters": {},
1409
+ "required": [],
1410
+ "returns": "Promise<string[]>"
1411
+ },
1412
+ "lookup": {
1413
+ "description": "Look up a helper class by type and name.",
1498
1414
  "parameters": {
1499
- "payload": {
1415
+ "type": {
1416
+ "type": "RegistryType",
1417
+ "description": "The registry type"
1418
+ },
1419
+ "name": {
1500
1420
  "type": "string",
1501
- "description": "Parameter payload"
1421
+ "description": "The helper name within that registry"
1502
1422
  }
1503
1423
  },
1504
1424
  "required": [
1505
- "payload"
1425
+ "type",
1426
+ "name"
1506
1427
  ],
1507
- "returns": "void"
1428
+ "returns": "any"
1508
1429
  },
1509
- "encrypt": {
1510
- "description": "",
1430
+ "describe": {
1431
+ "description": "Get the introspection description for a specific helper.",
1511
1432
  "parameters": {
1512
- "payload": {
1433
+ "type": {
1434
+ "type": "RegistryType",
1435
+ "description": "The registry type"
1436
+ },
1437
+ "name": {
1513
1438
  "type": "string",
1514
- "description": "Parameter payload"
1439
+ "description": "The helper name"
1515
1440
  }
1516
1441
  },
1517
1442
  "required": [
1518
- "payload"
1443
+ "type",
1444
+ "name"
1519
1445
  ],
1520
- "returns": "void"
1446
+ "returns": "string"
1447
+ }
1448
+ },
1449
+ "getters": {
1450
+ "manifestURL": {
1451
+ "description": "The URL to fetch the helpers manifest from.",
1452
+ "returns": "string"
1453
+ },
1454
+ "available": {
1455
+ "description": "Returns a unified view of all available helpers across all registries. Each key is a registry type, each value is the list of helper names in that registry.",
1456
+ "returns": "Record<string, string[]>"
1521
1457
  }
1522
1458
  },
1523
- "getters": {},
1524
1459
  "events": {},
1525
1460
  "state": {},
1526
1461
  "options": {},
@@ -1528,7 +1463,7 @@ export const introspectionData = [
1528
1463
  "examples": [
1529
1464
  {
1530
1465
  "language": "ts",
1531
- "code": "const vault = container.feature('vault')\nconst encrypted = await vault.encrypt('secret data')\nconst decrypted = await vault.decrypt(encrypted)\nconsole.log(decrypted) // 'secret data'"
1466
+ "code": "const helpers = container.feature('helpers', { enable: true })\n\n// Discover all helper types from the manifest\nawait helpers.discoverAll()\n\n// Discover a specific type\nawait helpers.discover('features')\n\n// Unified view of all available helpers\nconsole.log(helpers.available)"
1532
1467
  }
1533
1468
  ]
1534
1469
  },
@@ -1670,110 +1605,196 @@ export const introspectionData = [
1670
1605
  }
1671
1606
  },
1672
1607
  {
1673
- "id": "features.helpers",
1674
- "description": "The Helpers feature discovers and loads project-level helpers from a JSON manifest served over HTTP. Scripts are injected via AssetLoader and self-register into the container's registries. This is the web equivalent of the node Helpers feature, which scans the filesystem. Instead of filesystem scanning, this feature fetches a manifest from a well-known URL and uses AssetLoader.loadScript() to inject each helper's script tag.",
1675
- "shortcut": "features.helpers",
1676
- "className": "Helpers",
1608
+ "id": "features.vault",
1609
+ "description": "AES-256-GCM encryption and decryption for the browser using the Web Crypto API. Generates or accepts a secret key and provides `encrypt()` / `decrypt()` methods that work entirely client-side. Keys are stored as base64-encoded state so they can persist across sessions when needed.",
1610
+ "shortcut": "features.vault",
1611
+ "className": "WebVault",
1677
1612
  "methods": {
1678
- "setManifestURL": {
1679
- "description": "Set a new manifest URL. Invalidates any cached manifest.",
1613
+ "secret": {
1614
+ "description": "",
1680
1615
  "parameters": {
1681
- "url": {
1616
+ "{ refresh = false, set = true }": {
1617
+ "type": "any",
1618
+ "description": "Parameter { refresh = false, set = true }"
1619
+ }
1620
+ },
1621
+ "required": [],
1622
+ "returns": "Promise<ArrayBuffer>"
1623
+ },
1624
+ "decrypt": {
1625
+ "description": "",
1626
+ "parameters": {
1627
+ "payload": {
1682
1628
  "type": "string",
1683
- "description": "The new URL to fetch the manifest from"
1629
+ "description": "Parameter payload"
1684
1630
  }
1685
1631
  },
1686
1632
  "required": [
1687
- "url"
1633
+ "payload"
1688
1634
  ],
1689
1635
  "returns": "void"
1690
1636
  },
1691
- "discover": {
1692
- "description": "Discover and register helpers of the given type from the manifest. Fetches the manifest, then for each entry of the requested type, loads the script via AssetLoader and checks what got newly registered.",
1637
+ "encrypt": {
1638
+ "description": "",
1693
1639
  "parameters": {
1694
- "type": {
1695
- "type": "RegistryType",
1696
- "description": "Which type of helpers to discover ('features' or 'clients')"
1640
+ "payload": {
1641
+ "type": "string",
1642
+ "description": "Parameter payload"
1697
1643
  }
1698
1644
  },
1699
1645
  "required": [
1700
- "type"
1646
+ "payload"
1701
1647
  ],
1702
- "returns": "Promise<string[]>"
1703
- },
1704
- "discoverAll": {
1705
- "description": "Discover all helper types from the manifest.",
1706
- "parameters": {},
1707
- "required": [],
1708
- "returns": "Promise<Record<string, string[]>>"
1709
- },
1710
- "discoverFeatures": {
1711
- "description": "Convenience method to discover only features.",
1712
- "parameters": {},
1713
- "required": [],
1714
- "returns": "Promise<string[]>"
1715
- },
1716
- "discoverClients": {
1717
- "description": "Convenience method to discover only clients.",
1718
- "parameters": {},
1719
- "required": [],
1720
- "returns": "Promise<string[]>"
1721
- },
1722
- "lookup": {
1723
- "description": "Look up a helper class by type and name.",
1648
+ "returns": "void"
1649
+ }
1650
+ },
1651
+ "getters": {},
1652
+ "events": {},
1653
+ "state": {},
1654
+ "options": {},
1655
+ "envVars": [],
1656
+ "examples": [
1657
+ {
1658
+ "language": "ts",
1659
+ "code": "const vault = container.feature('vault')\nconst encrypted = await vault.encrypt('secret data')\nconst decrypted = await vault.decrypt(encrypted)\nconsole.log(decrypted) // 'secret data'"
1660
+ }
1661
+ ]
1662
+ },
1663
+ {
1664
+ "id": "features.vm",
1665
+ "description": "Sandboxed JavaScript execution environment for the browser. Automatically injects the container's context object into the global scope, so evaluated code can use anything provided by the container. Useful for live code playgrounds, plugin systems, and dynamic script evaluation.",
1666
+ "shortcut": "features.vm",
1667
+ "className": "VM",
1668
+ "methods": {
1669
+ "createScript": {
1670
+ "description": "",
1724
1671
  "parameters": {
1725
- "type": {
1726
- "type": "RegistryType",
1727
- "description": "The registry type"
1728
- },
1729
- "name": {
1672
+ "code": {
1730
1673
  "type": "string",
1731
- "description": "The helper name within that registry"
1674
+ "description": "Parameter code"
1732
1675
  }
1733
1676
  },
1734
1677
  "required": [
1735
- "type",
1736
- "name"
1678
+ "code"
1737
1679
  ],
1738
- "returns": "any"
1680
+ "returns": "void"
1739
1681
  },
1740
- "describe": {
1741
- "description": "Get the introspection description for a specific helper.",
1682
+ "createContext": {
1683
+ "description": "",
1742
1684
  "parameters": {
1743
- "type": {
1744
- "type": "RegistryType",
1745
- "description": "The registry type"
1746
- },
1747
- "name": {
1685
+ "ctx": {
1686
+ "type": "any",
1687
+ "description": "Parameter ctx"
1688
+ }
1689
+ },
1690
+ "required": [],
1691
+ "returns": "void"
1692
+ },
1693
+ "run": {
1694
+ "description": "",
1695
+ "parameters": {
1696
+ "code": {
1748
1697
  "type": "string",
1749
- "description": "The helper name"
1698
+ "description": "Parameter code"
1699
+ },
1700
+ "ctx": {
1701
+ "type": "any",
1702
+ "description": "Parameter ctx"
1703
+ },
1704
+ "options": {
1705
+ "type": "any",
1706
+ "description": "Parameter options"
1750
1707
  }
1751
1708
  },
1752
1709
  "required": [
1753
- "type",
1754
- "name"
1710
+ "code"
1755
1711
  ],
1756
- "returns": "string"
1712
+ "returns": "void"
1713
+ }
1714
+ },
1715
+ "getters": {},
1716
+ "events": {},
1717
+ "state": {},
1718
+ "options": {},
1719
+ "envVars": [],
1720
+ "examples": [
1721
+ {
1722
+ "language": "ts",
1723
+ "code": "const vm = container.feature('vm')\nconst result = vm.run('1 + 2 + 3') // 6\nconst greeting = vm.run('container.uuid') // accesses container globals"
1724
+ }
1725
+ ]
1726
+ },
1727
+ {
1728
+ "id": "features.voice",
1729
+ "description": "Speech-to-text recognition using the Web Speech API (SpeechRecognition). Wraps the browser's built-in speech recognition, supporting continuous listening, interim results, and language selection. Recognized text is accumulated in state and emitted as events for real-time transcription UIs.",
1730
+ "shortcut": "features.voice",
1731
+ "className": "VoiceRecognition",
1732
+ "methods": {
1733
+ "whenFinished": {
1734
+ "description": "",
1735
+ "parameters": {},
1736
+ "required": [],
1737
+ "returns": "void"
1738
+ },
1739
+ "start": {
1740
+ "description": "",
1741
+ "parameters": {},
1742
+ "required": [],
1743
+ "returns": "void"
1744
+ },
1745
+ "stop": {
1746
+ "description": "",
1747
+ "parameters": {},
1748
+ "required": [],
1749
+ "returns": "void"
1750
+ },
1751
+ "abort": {
1752
+ "description": "",
1753
+ "parameters": {},
1754
+ "required": [],
1755
+ "returns": "void"
1756
+ },
1757
+ "clearTranscript": {
1758
+ "description": "",
1759
+ "parameters": {},
1760
+ "required": [],
1761
+ "returns": "void"
1757
1762
  }
1758
1763
  },
1759
1764
  "getters": {
1760
- "manifestURL": {
1761
- "description": "The URL to fetch the helpers manifest from.",
1762
- "returns": "string"
1765
+ "listening": {
1766
+ "description": "Whether the speech recognizer is currently listening for audio input.",
1767
+ "returns": "any"
1763
1768
  },
1764
- "available": {
1765
- "description": "Returns a unified view of all available helpers across all registries. Each key is a registry type, each value is the list of helper names in that registry.",
1766
- "returns": "Record<string, string[]>"
1769
+ "transcript": {
1770
+ "description": "Returns the accumulated final transcript text from recognition results.",
1771
+ "returns": "any"
1772
+ }
1773
+ },
1774
+ "events": {
1775
+ "start": {
1776
+ "name": "start",
1777
+ "description": "Event emitted by VoiceRecognition",
1778
+ "arguments": {}
1779
+ },
1780
+ "stop": {
1781
+ "name": "stop",
1782
+ "description": "Event emitted by VoiceRecognition",
1783
+ "arguments": {}
1784
+ },
1785
+ "abort": {
1786
+ "name": "abort",
1787
+ "description": "Event emitted by VoiceRecognition",
1788
+ "arguments": {}
1767
1789
  }
1768
1790
  },
1769
- "events": {},
1770
1791
  "state": {},
1771
1792
  "options": {},
1772
1793
  "envVars": [],
1773
1794
  "examples": [
1774
1795
  {
1775
1796
  "language": "ts",
1776
- "code": "const helpers = container.feature('helpers', { enable: true })\n\n// Discover all helper types from the manifest\nawait helpers.discoverAll()\n\n// Discover a specific type\nawait helpers.discover('features')\n\n// Unified view of all available helpers\nconsole.log(helpers.available)"
1797
+ "code": "const voice = container.feature('voice', { continuous: true, autoListen: true })\n\nvoice.on('transcript', ({ text }) => {\n console.log('Heard:', text)\n})\n\n// Or start manually\nvoice.start()"
1777
1798
  }
1778
1799
  ]
1779
1800
  }