@soederpop/luca 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (358) hide show
  1. package/CLAUDE.md +71 -0
  2. package/README.md +78 -0
  3. package/bun.lock +2928 -0
  4. package/bunfig.toml +3 -0
  5. package/commands/audit-docs.ts +740 -0
  6. package/commands/build-scaffolds.ts +154 -0
  7. package/commands/generate-api-docs.ts +114 -0
  8. package/commands/update-introspection.ts +67 -0
  9. package/docs/CLI.md +335 -0
  10. package/docs/README.md +88 -0
  11. package/docs/TABLE-OF-CONTENTS.md +157 -0
  12. package/docs/apis/clients/elevenlabs.md +84 -0
  13. package/docs/apis/clients/graph.md +56 -0
  14. package/docs/apis/clients/openai.md +69 -0
  15. package/docs/apis/clients/rest.md +41 -0
  16. package/docs/apis/clients/websocket.md +107 -0
  17. package/docs/apis/features/agi/assistant.md +471 -0
  18. package/docs/apis/features/agi/assistants-manager.md +154 -0
  19. package/docs/apis/features/agi/claude-code.md +602 -0
  20. package/docs/apis/features/agi/conversation-history.md +352 -0
  21. package/docs/apis/features/agi/conversation.md +333 -0
  22. package/docs/apis/features/agi/docs-reader.md +121 -0
  23. package/docs/apis/features/agi/openai-codex.md +318 -0
  24. package/docs/apis/features/agi/openapi.md +138 -0
  25. package/docs/apis/features/agi/semantic-search.md +387 -0
  26. package/docs/apis/features/agi/skills-library.md +216 -0
  27. package/docs/apis/features/node/container-link.md +133 -0
  28. package/docs/apis/features/node/content-db.md +313 -0
  29. package/docs/apis/features/node/disk-cache.md +379 -0
  30. package/docs/apis/features/node/dns.md +651 -0
  31. package/docs/apis/features/node/docker.md +705 -0
  32. package/docs/apis/features/node/downloader.md +81 -0
  33. package/docs/apis/features/node/esbuild.md +59 -0
  34. package/docs/apis/features/node/file-manager.md +182 -0
  35. package/docs/apis/features/node/fs.md +581 -0
  36. package/docs/apis/features/node/git.md +330 -0
  37. package/docs/apis/features/node/google-auth.md +174 -0
  38. package/docs/apis/features/node/google-calendar.md +187 -0
  39. package/docs/apis/features/node/google-docs.md +151 -0
  40. package/docs/apis/features/node/google-drive.md +225 -0
  41. package/docs/apis/features/node/google-sheets.md +179 -0
  42. package/docs/apis/features/node/grep.md +290 -0
  43. package/docs/apis/features/node/helpers.md +135 -0
  44. package/docs/apis/features/node/ink.md +334 -0
  45. package/docs/apis/features/node/ipc-socket.md +260 -0
  46. package/docs/apis/features/node/json-tree.md +86 -0
  47. package/docs/apis/features/node/launcher-app-command-listener.md +145 -0
  48. package/docs/apis/features/node/networking.md +281 -0
  49. package/docs/apis/features/node/nlp.md +133 -0
  50. package/docs/apis/features/node/opener.md +97 -0
  51. package/docs/apis/features/node/os.md +118 -0
  52. package/docs/apis/features/node/package-finder.md +402 -0
  53. package/docs/apis/features/node/postgres.md +212 -0
  54. package/docs/apis/features/node/proc.md +430 -0
  55. package/docs/apis/features/node/process-manager.md +210 -0
  56. package/docs/apis/features/node/python.md +278 -0
  57. package/docs/apis/features/node/repl.md +88 -0
  58. package/docs/apis/features/node/runpod.md +673 -0
  59. package/docs/apis/features/node/secure-shell.md +169 -0
  60. package/docs/apis/features/node/semantic-search.md +401 -0
  61. package/docs/apis/features/node/sqlite.md +211 -0
  62. package/docs/apis/features/node/telegram.md +254 -0
  63. package/docs/apis/features/node/tts.md +118 -0
  64. package/docs/apis/features/node/ui.md +703 -0
  65. package/docs/apis/features/node/vault.md +64 -0
  66. package/docs/apis/features/node/vm.md +84 -0
  67. package/docs/apis/features/node/window-manager.md +337 -0
  68. package/docs/apis/features/node/yaml-tree.md +85 -0
  69. package/docs/apis/features/node/yaml.md +176 -0
  70. package/docs/apis/features/web/asset-loader.md +47 -0
  71. package/docs/apis/features/web/container-link.md +133 -0
  72. package/docs/apis/features/web/esbuild.md +59 -0
  73. package/docs/apis/features/web/helpers.md +135 -0
  74. package/docs/apis/features/web/network.md +30 -0
  75. package/docs/apis/features/web/speech.md +55 -0
  76. package/docs/apis/features/web/vault.md +64 -0
  77. package/docs/apis/features/web/vm.md +84 -0
  78. package/docs/apis/features/web/voice.md +67 -0
  79. package/docs/apis/servers/express.md +127 -0
  80. package/docs/apis/servers/mcp.md +213 -0
  81. package/docs/apis/servers/websocket.md +99 -0
  82. package/docs/documentation-audit.md +134 -0
  83. package/docs/examples/content-db.md +77 -0
  84. package/docs/examples/disk-cache.md +83 -0
  85. package/docs/examples/docker.md +101 -0
  86. package/docs/examples/downloader.md +70 -0
  87. package/docs/examples/esbuild.md +80 -0
  88. package/docs/examples/file-manager.md +82 -0
  89. package/docs/examples/fs.md +83 -0
  90. package/docs/examples/git.md +85 -0
  91. package/docs/examples/google-auth.md +88 -0
  92. package/docs/examples/google-calendar.md +94 -0
  93. package/docs/examples/google-docs.md +82 -0
  94. package/docs/examples/google-drive.md +96 -0
  95. package/docs/examples/google-sheets.md +95 -0
  96. package/docs/examples/grep.md +85 -0
  97. package/docs/examples/ink-blocks.md +75 -0
  98. package/docs/examples/ink-renderer.md +41 -0
  99. package/docs/examples/ink.md +103 -0
  100. package/docs/examples/ipc-socket.md +103 -0
  101. package/docs/examples/json-tree.md +91 -0
  102. package/docs/examples/launcher-app-command-listener.md +120 -0
  103. package/docs/examples/networking.md +58 -0
  104. package/docs/examples/nlp.md +91 -0
  105. package/docs/examples/opener.md +78 -0
  106. package/docs/examples/os.md +72 -0
  107. package/docs/examples/package-finder.md +89 -0
  108. package/docs/examples/port-exposer.md +89 -0
  109. package/docs/examples/postgres.md +91 -0
  110. package/docs/examples/proc.md +81 -0
  111. package/docs/examples/process-manager.md +79 -0
  112. package/docs/examples/python.md +91 -0
  113. package/docs/examples/repl.md +93 -0
  114. package/docs/examples/runpod.md +119 -0
  115. package/docs/examples/secure-shell.md +92 -0
  116. package/docs/examples/sqlite.md +86 -0
  117. package/docs/examples/telegram.md +77 -0
  118. package/docs/examples/tts.md +86 -0
  119. package/docs/examples/ui.md +80 -0
  120. package/docs/examples/vault.md +70 -0
  121. package/docs/examples/vm.md +86 -0
  122. package/docs/examples/window-manager.md +125 -0
  123. package/docs/examples/yaml-tree.md +93 -0
  124. package/docs/examples/yaml.md +104 -0
  125. package/docs/ideas/class-registration-refactor-possibilities.md +197 -0
  126. package/docs/ideas/container-use-api.md +9 -0
  127. package/docs/ideas/easy-auth-for-express-servers-and-luca-serve.md +0 -0
  128. package/docs/ideas/feature-stacks.md +22 -0
  129. package/docs/ideas/luca-cli-self-sufficiency-demo.md +23 -0
  130. package/docs/ideas/mcp-design.md +9 -0
  131. package/docs/ideas/web-container-debugging-feature.md +13 -0
  132. package/docs/introspection-audit.md +49 -0
  133. package/docs/introspection.md +154 -0
  134. package/docs/mcp/readme.md +162 -0
  135. package/docs/models.ts +38 -0
  136. package/docs/philosophy.md +85 -0
  137. package/docs/principles.md +7 -0
  138. package/docs/prompts/audit-codebase-for-failures-to-use-the-container.md +34 -0
  139. package/docs/prompts/mcp-test-easy-command.md +27 -0
  140. package/docs/reports/assistant-bugs.md +38 -0
  141. package/docs/reports/attach-pattern-usage.md +18 -0
  142. package/docs/reports/code-audit-results.md +391 -0
  143. package/docs/reports/introspection-audit-tasks.md +378 -0
  144. package/docs/reports/luca-mcp-improvements.md +128 -0
  145. package/docs/scaffolds/client.md +140 -0
  146. package/docs/scaffolds/command.md +106 -0
  147. package/docs/scaffolds/endpoint.md +176 -0
  148. package/docs/scaffolds/feature.md +148 -0
  149. package/docs/scaffolds/server.md +187 -0
  150. package/docs/tasks/web-container-helper-discovery.md +71 -0
  151. package/docs/todos.md +1 -0
  152. package/docs/tutorials/01-getting-started.md +106 -0
  153. package/docs/tutorials/02-container.md +210 -0
  154. package/docs/tutorials/03-scripts.md +194 -0
  155. package/docs/tutorials/04-features-overview.md +196 -0
  156. package/docs/tutorials/05-state-and-events.md +171 -0
  157. package/docs/tutorials/06-servers.md +157 -0
  158. package/docs/tutorials/07-endpoints.md +198 -0
  159. package/docs/tutorials/08-commands.md +171 -0
  160. package/docs/tutorials/09-clients.md +162 -0
  161. package/docs/tutorials/10-creating-features.md +198 -0
  162. package/docs/tutorials/11-contentbase.md +191 -0
  163. package/docs/tutorials/12-assistants.md +215 -0
  164. package/docs/tutorials/13-introspection.md +147 -0
  165. package/docs/tutorials/14-type-system.md +174 -0
  166. package/docs/tutorials/15-project-patterns.md +222 -0
  167. package/docs/tutorials/16-google-features.md +534 -0
  168. package/docs/tutorials/17-tui-blocks.md +530 -0
  169. package/docs/tutorials/18-semantic-search.md +334 -0
  170. package/index.ts +1 -0
  171. package/luca.console.ts +9 -0
  172. package/main.py +6 -0
  173. package/package.json +154 -0
  174. package/pyproject.toml +7 -0
  175. package/scripts/animations/chrome-glitch.ts +55 -0
  176. package/scripts/animations/index.ts +16 -0
  177. package/scripts/animations/neon-pulse.ts +64 -0
  178. package/scripts/animations/types.ts +6 -0
  179. package/scripts/build-web.ts +28 -0
  180. package/scripts/examples/ask-luca-expert.ts +42 -0
  181. package/scripts/examples/assistant-questions.ts +12 -0
  182. package/scripts/examples/excalidraw-expert.ts +75 -0
  183. package/scripts/examples/expert-chat.ts +0 -0
  184. package/scripts/examples/file-manager.ts +14 -0
  185. package/scripts/examples/ideas.ts +12 -0
  186. package/scripts/examples/interactive-chat.ts +20 -0
  187. package/scripts/examples/openai-tool-calls.ts +113 -0
  188. package/scripts/examples/opening-a-web-browser.ts +5 -0
  189. package/scripts/examples/telegram-bot.ts +79 -0
  190. package/scripts/examples/telegram-ink-ui.ts +302 -0
  191. package/scripts/examples/using-assistant-with-mcp.ts +560 -0
  192. package/scripts/examples/using-claude-code.ts +10 -0
  193. package/scripts/examples/using-contentdb.ts +35 -0
  194. package/scripts/examples/using-conversations.ts +35 -0
  195. package/scripts/examples/using-disk-cache.ts +10 -0
  196. package/scripts/examples/using-docker-shell.ts +75 -0
  197. package/scripts/examples/using-elevenlabs.ts +25 -0
  198. package/scripts/examples/using-google-calendar.ts +57 -0
  199. package/scripts/examples/using-google-docs.ts +74 -0
  200. package/scripts/examples/using-google-drive.ts +74 -0
  201. package/scripts/examples/using-google-sheets.ts +89 -0
  202. package/scripts/examples/using-nlp.ts +55 -0
  203. package/scripts/examples/using-ollama.ts +10 -0
  204. package/scripts/examples/using-openai-codex.ts +23 -0
  205. package/scripts/examples/using-postgres.ts +55 -0
  206. package/scripts/examples/using-runpod.ts +32 -0
  207. package/scripts/examples/using-tts.ts +40 -0
  208. package/scripts/examples/vm-loading-esm-modules.ts +16 -0
  209. package/scripts/scaffold.ts +391 -0
  210. package/scripts/scratch.ts +15 -0
  211. package/scripts/test-command-listener.ts +123 -0
  212. package/scripts/test-window-manager-lifecycle.ts +86 -0
  213. package/scripts/test-window-manager.ts +43 -0
  214. package/scripts/update-introspection-data.ts +58 -0
  215. package/src/agi/README.md +14 -0
  216. package/src/agi/container.server.ts +114 -0
  217. package/src/agi/endpoints/ask.ts +60 -0
  218. package/src/agi/endpoints/conversations/[id].ts +45 -0
  219. package/src/agi/endpoints/conversations.ts +31 -0
  220. package/src/agi/endpoints/experts.ts +37 -0
  221. package/src/agi/features/assistant.ts +767 -0
  222. package/src/agi/features/assistants-manager.ts +260 -0
  223. package/src/agi/features/claude-code.ts +1111 -0
  224. package/src/agi/features/conversation-history.ts +497 -0
  225. package/src/agi/features/conversation.ts +799 -0
  226. package/src/agi/features/openai-codex.ts +631 -0
  227. package/src/agi/features/openapi.ts +438 -0
  228. package/src/agi/features/skills-library.ts +425 -0
  229. package/src/agi/index.ts +6 -0
  230. package/src/agi/lib/token-counter.ts +122 -0
  231. package/src/browser.ts +25 -0
  232. package/src/bus.ts +100 -0
  233. package/src/cli/cli.ts +70 -0
  234. package/src/client.ts +461 -0
  235. package/src/clients/civitai/index.ts +541 -0
  236. package/src/clients/client-template.ts +41 -0
  237. package/src/clients/comfyui/index.ts +597 -0
  238. package/src/clients/elevenlabs/index.ts +291 -0
  239. package/src/clients/openai/index.ts +451 -0
  240. package/src/clients/supabase/index.ts +366 -0
  241. package/src/command.ts +164 -0
  242. package/src/commands/chat.ts +182 -0
  243. package/src/commands/console.ts +192 -0
  244. package/src/commands/describe.ts +433 -0
  245. package/src/commands/eval.ts +116 -0
  246. package/src/commands/help.ts +214 -0
  247. package/src/commands/index.ts +14 -0
  248. package/src/commands/mcp.ts +64 -0
  249. package/src/commands/prompt.ts +807 -0
  250. package/src/commands/run.ts +257 -0
  251. package/src/commands/sandbox-mcp.ts +439 -0
  252. package/src/commands/scaffold.ts +79 -0
  253. package/src/commands/serve.ts +172 -0
  254. package/src/container.ts +781 -0
  255. package/src/endpoint.ts +340 -0
  256. package/src/feature.ts +75 -0
  257. package/src/hash-object.ts +97 -0
  258. package/src/helper.ts +543 -0
  259. package/src/introspection/generated.agi.ts +23388 -0
  260. package/src/introspection/generated.node.ts +18899 -0
  261. package/src/introspection/generated.web.ts +2021 -0
  262. package/src/introspection/index.ts +256 -0
  263. package/src/introspection/scan.ts +912 -0
  264. package/src/node/container.ts +354 -0
  265. package/src/node/feature.ts +13 -0
  266. package/src/node/features/container-link.ts +558 -0
  267. package/src/node/features/content-db.ts +475 -0
  268. package/src/node/features/disk-cache.ts +382 -0
  269. package/src/node/features/dns.ts +655 -0
  270. package/src/node/features/docker.ts +912 -0
  271. package/src/node/features/downloader.ts +92 -0
  272. package/src/node/features/esbuild.ts +68 -0
  273. package/src/node/features/file-manager.ts +357 -0
  274. package/src/node/features/fs.ts +534 -0
  275. package/src/node/features/git.ts +492 -0
  276. package/src/node/features/google-auth.ts +502 -0
  277. package/src/node/features/google-calendar.ts +300 -0
  278. package/src/node/features/google-docs.ts +404 -0
  279. package/src/node/features/google-drive.ts +339 -0
  280. package/src/node/features/google-sheets.ts +279 -0
  281. package/src/node/features/grep.ts +406 -0
  282. package/src/node/features/helpers.ts +374 -0
  283. package/src/node/features/ink.ts +490 -0
  284. package/src/node/features/ipc-socket.ts +459 -0
  285. package/src/node/features/json-tree.ts +188 -0
  286. package/src/node/features/launcher-app-command-listener.ts +388 -0
  287. package/src/node/features/networking.ts +925 -0
  288. package/src/node/features/nlp.ts +211 -0
  289. package/src/node/features/opener.ts +166 -0
  290. package/src/node/features/os.ts +157 -0
  291. package/src/node/features/package-finder.ts +539 -0
  292. package/src/node/features/port-exposer.ts +342 -0
  293. package/src/node/features/postgres.ts +273 -0
  294. package/src/node/features/proc.ts +502 -0
  295. package/src/node/features/process-manager.ts +542 -0
  296. package/src/node/features/python.ts +444 -0
  297. package/src/node/features/repl.ts +194 -0
  298. package/src/node/features/runpod.ts +802 -0
  299. package/src/node/features/secure-shell.ts +248 -0
  300. package/src/node/features/semantic-search.ts +924 -0
  301. package/src/node/features/sqlite.ts +289 -0
  302. package/src/node/features/telegram.ts +342 -0
  303. package/src/node/features/tts.ts +184 -0
  304. package/src/node/features/ui.ts +857 -0
  305. package/src/node/features/vault.ts +164 -0
  306. package/src/node/features/vm.ts +312 -0
  307. package/src/node/features/window-manager.ts +804 -0
  308. package/src/node/features/yaml-tree.ts +149 -0
  309. package/src/node/features/yaml.ts +132 -0
  310. package/src/node.ts +70 -0
  311. package/src/react/index.ts +175 -0
  312. package/src/registry.ts +199 -0
  313. package/src/scaffolds/generated.ts +1613 -0
  314. package/src/scaffolds/template.ts +37 -0
  315. package/src/schemas/base.ts +255 -0
  316. package/src/server.ts +135 -0
  317. package/src/servers/express.ts +209 -0
  318. package/src/servers/mcp.ts +805 -0
  319. package/src/servers/socket.ts +120 -0
  320. package/src/state.ts +101 -0
  321. package/src/web/clients/socket.ts +82 -0
  322. package/src/web/container.ts +74 -0
  323. package/src/web/extension.ts +30 -0
  324. package/src/web/feature.ts +12 -0
  325. package/src/web/features/asset-loader.ts +64 -0
  326. package/src/web/features/container-link.ts +385 -0
  327. package/src/web/features/esbuild.ts +79 -0
  328. package/src/web/features/helpers.ts +267 -0
  329. package/src/web/features/network.ts +61 -0
  330. package/src/web/features/speech.ts +87 -0
  331. package/src/web/features/vault.ts +189 -0
  332. package/src/web/features/vm.ts +78 -0
  333. package/src/web/features/voice-recognition.ts +129 -0
  334. package/src/web/shims/isomorphic-vm.ts +149 -0
  335. package/test/bus.test.ts +134 -0
  336. package/test/clients-servers.test.ts +216 -0
  337. package/test/container-link.test.ts +274 -0
  338. package/test/features.test.ts +160 -0
  339. package/test/integration.test.ts +787 -0
  340. package/test/node-container.test.ts +121 -0
  341. package/test/rate-limit.test.ts +272 -0
  342. package/test/semantic-search.test.ts +550 -0
  343. package/test/state.test.ts +121 -0
  344. package/test-integration/assistant.test.ts +138 -0
  345. package/test-integration/assistants-manager.test.ts +123 -0
  346. package/test-integration/claude-code.test.ts +98 -0
  347. package/test-integration/conversation-history.test.ts +205 -0
  348. package/test-integration/conversation.test.ts +137 -0
  349. package/test-integration/elevenlabs.test.ts +55 -0
  350. package/test-integration/google-services.test.ts +80 -0
  351. package/test-integration/helpers.ts +89 -0
  352. package/test-integration/openai-codex.test.ts +93 -0
  353. package/test-integration/runpod.test.ts +58 -0
  354. package/test-integration/server-endpoints.test.ts +97 -0
  355. package/test-integration/skills-library.test.ts +157 -0
  356. package/test-integration/telegram.test.ts +46 -0
  357. package/tsconfig.json +58 -0
  358. package/uv.lock +8 -0
@@ -0,0 +1,256 @@
1
+ import { z } from 'zod'
2
+ import { describeZodShape, describeEventsSchema } from '../schemas/base.js'
3
+
4
+ /**
5
+ * Inspection is a feature that is available to all containers, its purpose is to provide
6
+ * runtime inspection of a particular helper's public API:
7
+ * - methods
8
+ * - properties
9
+ * - events that it emits
10
+ * - the shape of its state at any given point
11
+ *
12
+ * So that if you have an instance of a helper in e.g. a REPL, or if an AI Agent wants to
13
+ * work with a helper, there is a common way of getting the information needed in a way that
14
+ * it can be formatted e.g. as OpenAI Tool Calls or as OpenAPI Spec for a ChatGPT Plugin,
15
+ * or a custom UI for a helper.
16
+ *
17
+ * Because Javascript doesn't have runtime introspection capabilities, we solve this problem by
18
+ * exposing this runtime registry on the container, and then using a build time tool to analyze
19
+ * specific class definitions ( since the Luca framework encourages this pattern ) to extract
20
+ * the jsdoc comments for the class along with any type information that is available and then
21
+ * populate the registry with the information we need.
22
+ *
23
+ * Each Helper class will have a method that will return information about itself found in the
24
+ * central introspection registry. This registry can be loaded at runtime from a remote source,
25
+ * depending on the container. In node, we can load it from a file, or from a URL.
26
+ */
27
+
28
+ export type ExampleIntrospection = { language: string; code: string }
29
+
30
+ export type MethodIntrospection = {
31
+ description: string
32
+ parameters: Record<string, { type: string, description: string, properties?: Record<string, { type: string, description: string }> }>
33
+ required: string[]
34
+ returns: string
35
+ examples?: ExampleIntrospection[]
36
+ }
37
+
38
+ /** Sections that can be requested individually from introspect / inspect */
39
+ export type IntrospectionSection = 'methods' | 'getters' | 'events' | 'state' | 'options' | 'envVars' | 'examples' | 'usage'
40
+
41
+ export type GetterIntrospection = {
42
+ description: string
43
+ returns: string
44
+ examples?: ExampleIntrospection[]
45
+ }
46
+
47
+ export type EventIntrospection = {
48
+ name: string
49
+ description: string
50
+ arguments: Record<string, { type: string, description: string }>
51
+ }
52
+
53
+ // Every subclass of Helper will have its own Subclasses that will want to document themselves
54
+ // it will store that information at the class level as a HelperIntroSpection
55
+ export type HelperIntrospection = {
56
+ // id will be e.g. features.vm, clients.openai, etc
57
+ id: string;
58
+ // a description of the helper, the main jsdoc comment for the class
59
+ description: string;
60
+ // a shortcut for the helper, e.g. "vm" for the VM feature, which will be what it is registered as with the registry and what the key is in AvailableFeatures, etc
61
+ shortcut: string;
62
+ // the class name, e.g. "FileManagerFeature", "RESTClient"
63
+ className?: string;
64
+ // a map of method names to their introspection
65
+ methods: Record<string, MethodIntrospection>
66
+ // a map of getter names to their introspection
67
+ getters: Record<string, GetterIntrospection>
68
+ // a map of event names to their introspection
69
+ events: Record<string, EventIntrospection>
70
+ // a map of state properties to their introspection
71
+ state: Record<string, { type: string, description: string }>
72
+ // a map of options properties to their introspection
73
+ options: Record<string, { type: string, description: string }>
74
+ // environment variables used by this helper
75
+ envVars?: string[]
76
+ // class-level @example blocks from JSDoc
77
+ examples?: ExampleIntrospection[]
78
+ }
79
+
80
+ export type RegistryIntrospection = {
81
+ /** The name of the registry, e.g. "features", "clients", "servers" */
82
+ name: string
83
+ /** The base class for this registry (e.g. "Feature", "Client", "Server") */
84
+ baseClass: string
85
+ /** The IDs of all registered members available in this registry */
86
+ available: string[]
87
+ }
88
+
89
+ export type ContainerIntrospection = {
90
+ /** The class name, e.g. "NodeContainer", "AGIContainer" */
91
+ className: string
92
+ /** UUID of this container instance */
93
+ uuid: string
94
+ /** JSDoc-derived description of the container class */
95
+ description: string
96
+ /** Available registries (features, clients, servers, etc.) */
97
+ registries: RegistryIntrospection[]
98
+ /** Available factory method names (feature, client, server, etc.) */
99
+ factories: string[]
100
+ /** Container methods extracted from JSDoc/AST */
101
+ methods: Record<string, MethodIntrospection>
102
+ /** Container getters extracted from JSDoc/AST */
103
+ getters: Record<string, GetterIntrospection>
104
+ /** Container events */
105
+ events: Record<string, EventIntrospection>
106
+ /** Container state shape */
107
+ state: Record<string, { type: string, description: string }>
108
+ /** List of currently enabled feature shortcut IDs */
109
+ enabledFeatures: string[]
110
+ /** Environment flags */
111
+ environment: {
112
+ isBrowser: boolean
113
+ isNode: boolean
114
+ isBun: boolean
115
+ isElectron: boolean
116
+ isDevelopment: boolean
117
+ isProduction: boolean
118
+ isCI: boolean
119
+ }
120
+ }
121
+
122
+ export const __INTROSPECTION__ = new Map<string, HelperIntrospection>()
123
+ export const __CONTAINER_INTROSPECTION__ = new Map<string, Partial<ContainerIntrospection>>()
124
+
125
+ /** Option keys inherited from base schemas that are internal and should be hidden from introspection output */
126
+ const INTERNAL_OPTION_KEYS = new Set(['name', '_cacheKey', 'cached', 'enable'])
127
+
128
+ /** Event names inherited from the base Helper lifecycle that are internal and should be hidden from introspection output */
129
+ const INTERNAL_EVENT_NAMES = new Set(['stateChange', 'enabled'])
130
+
131
+ export function introspect(id: string) : HelperIntrospection | undefined {
132
+ return __INTROSPECTION__.get(id)
133
+ }
134
+
135
+ /**
136
+ * Called by generated files to seed build-time AST data for Container classes.
137
+ * Merges into any existing entry.
138
+ */
139
+ export function setContainerBuildTimeData(className: string, data: Partial<ContainerIntrospection>) {
140
+ const existing = __CONTAINER_INTROSPECTION__.get(className)
141
+ __CONTAINER_INTROSPECTION__.set(className, {
142
+ ...existing,
143
+ ...data,
144
+ methods: data.methods || existing?.methods || {},
145
+ getters: data.getters || existing?.getters || {},
146
+ events: data.events || existing?.events || {},
147
+ })
148
+ }
149
+
150
+ /**
151
+ * Retrieves build-time AST data for a Container class by name.
152
+ */
153
+ export function getContainerBuildTimeData(className: string): Partial<ContainerIntrospection> | undefined {
154
+ return __CONTAINER_INTROSPECTION__.get(className)
155
+ }
156
+
157
+ /**
158
+ * Called by generated files to seed build-time AST data (description, methods, events).
159
+ * Merges into any existing entry without overwriting runtime-derived state/options.
160
+ */
161
+ export function setBuildTimeData(key: string, data: HelperIntrospection) {
162
+ const existing = __INTROSPECTION__.get(key)
163
+
164
+ __INTROSPECTION__.set(key, {
165
+ ...data,
166
+ // preserve runtime-derived className/state/options if registration already happened
167
+ className: data.className || existing?.className,
168
+ state: existing?.state || data.state || {},
169
+ options: existing?.options || data.options || {},
170
+ getters: data.getters || existing?.getters || {},
171
+ envVars: existing?.envVars || data.envVars || [],
172
+ examples: data.examples || existing?.examples,
173
+ })
174
+ }
175
+
176
+ /**
177
+ * Called at registry.register() time to merge runtime Zod schema data
178
+ * into the introspection entry. Preserves build-time methods/events
179
+ * regardless of import order.
180
+ */
181
+ export function interceptRegistration(registry: any, helperConstructor: any) {
182
+
183
+ if (!helperConstructor.shortcut) {
184
+ console.error("Helper has no shortcut", helperConstructor)
185
+ return
186
+ }
187
+
188
+ // Warn if a concrete Helper subclass inherits its schemas from a parent
189
+ // instead of setting its own. This usually means a custom schema was
190
+ // defined but never assigned via `static override optionsSchema = ...`,
191
+ // causing Zod's safeParse to silently strip custom option/state keys.
192
+ /*
193
+ if (helperConstructor.shortcut !== 'unspecified') {
194
+ if (!helperConstructor.hasOwnProperty('optionsSchema')) {
195
+ console.warn(
196
+ `[luca] ${helperConstructor.shortcut}: no \`static override optionsSchema\` — ` +
197
+ `custom options will be stripped during construction. ` +
198
+ `Set \`static override optionsSchema\` on the class if it accepts custom options.`
199
+ )
200
+ }
201
+ if (!helperConstructor.hasOwnProperty('stateSchema')) {
202
+ console.warn(
203
+ `[luca] ${helperConstructor.shortcut}: no \`static override stateSchema\` — ` +
204
+ `introspection will report the base state shape. ` +
205
+ `Set \`static override stateSchema\` on the class if it has custom state.`
206
+ )
207
+ }
208
+ }
209
+ */
210
+
211
+ const key = helperConstructor.shortcut
212
+ const existing = __INTROSPECTION__.get(key)
213
+
214
+ const introspection: HelperIntrospection = {
215
+ id: key,
216
+ description: helperConstructor.description || existing?.description || '',
217
+ shortcut: helperConstructor.shortcut,
218
+ className: helperConstructor.name || existing?.className,
219
+ // preserve build-time AST data if generated file already loaded
220
+ methods: existing?.methods || {},
221
+ getters: existing?.getters || {},
222
+ events: existing?.events || {},
223
+ state: {},
224
+ options: {},
225
+ envVars: Array.isArray(helperConstructor.envVars)
226
+ ? helperConstructor.envVars
227
+ : (existing?.envVars || []),
228
+ examples: existing?.examples,
229
+ }
230
+
231
+ // Always populate state and options from Zod schemas at runtime
232
+ if (helperConstructor.stateSchema && helperConstructor.stateSchema instanceof z.ZodObject) {
233
+ introspection.state = describeZodShape(helperConstructor.stateSchema)
234
+ }
235
+
236
+ if (helperConstructor.optionsSchema && helperConstructor.optionsSchema instanceof z.ZodObject) {
237
+ const allOptions = describeZodShape(helperConstructor.optionsSchema)
238
+ // Strip internal/base option keys so introspection only shows helper-specific options
239
+ for (const key of INTERNAL_OPTION_KEYS) delete allOptions[key]
240
+ introspection.options = allOptions
241
+ }
242
+
243
+ // Merge event argument types from Zod eventsSchema, preserving build-time AST descriptions
244
+ if (helperConstructor.eventsSchema && helperConstructor.eventsSchema instanceof z.ZodObject) {
245
+ introspection.events = describeEventsSchema(helperConstructor.eventsSchema, introspection.events)
246
+ }
247
+
248
+ // Strip internal/base event names so introspection only shows helper-specific events
249
+ for (const name of INTERNAL_EVENT_NAMES) delete introspection.events[name]
250
+
251
+ __INTROSPECTION__.set(key, introspection)
252
+
253
+ return introspection
254
+ }
255
+
256
+