luca 1.1.2 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (754) hide show
  1. package/.github/workflows/release.yaml +169 -0
  2. package/AGENTS.md +99 -0
  3. package/CLAUDE.md +115 -0
  4. package/CNAME +1 -0
  5. package/README.md +257 -8
  6. package/RUNME.md +56 -0
  7. package/assistants/codingAssistant/ABOUT.md +5 -0
  8. package/assistants/codingAssistant/CORE.md +28 -0
  9. package/assistants/codingAssistant/hooks.ts +21 -0
  10. package/assistants/codingAssistant/tools.ts +12 -0
  11. package/assistants/inkbot/ABOUT.md +16 -0
  12. package/assistants/inkbot/CORE.md +330 -0
  13. package/assistants/inkbot/hooks.ts +6 -0
  14. package/assistants/inkbot/tools.ts +53 -0
  15. package/assistants/researcher/ABOUT.md +5 -0
  16. package/assistants/researcher/CORE.md +46 -0
  17. package/assistants/researcher/hooks.ts +16 -0
  18. package/assistants/researcher/tools.ts +237 -0
  19. package/bun.lock +2769 -0
  20. package/bunfig.toml +3 -0
  21. package/commands/audit-docs.ts +740 -0
  22. package/commands/build-bootstrap.ts +118 -0
  23. package/commands/build-python-bridge.ts +43 -0
  24. package/commands/build-scaffolds.ts +176 -0
  25. package/commands/generate-api-docs.ts +114 -0
  26. package/commands/inkbot.ts +874 -0
  27. package/commands/release.ts +80 -0
  28. package/commands/try-all-challenges.ts +543 -0
  29. package/commands/try-challenge.ts +100 -0
  30. package/dist/agi/container.server.d.ts +63 -0
  31. package/dist/agi/container.server.d.ts.map +1 -0
  32. package/dist/agi/endpoints/ask.d.ts +20 -0
  33. package/dist/agi/endpoints/ask.d.ts.map +1 -0
  34. package/dist/agi/endpoints/conversations/[id].d.ts +27 -0
  35. package/dist/agi/endpoints/conversations/[id].d.ts.map +1 -0
  36. package/dist/agi/endpoints/conversations.d.ts +18 -0
  37. package/dist/agi/endpoints/conversations.d.ts.map +1 -0
  38. package/dist/agi/endpoints/experts.d.ts +8 -0
  39. package/dist/agi/endpoints/experts.d.ts.map +1 -0
  40. package/dist/agi/feature.d.ts +9 -0
  41. package/dist/agi/feature.d.ts.map +1 -0
  42. package/dist/agi/features/assistant.d.ts +509 -0
  43. package/dist/agi/features/assistant.d.ts.map +1 -0
  44. package/dist/agi/features/assistants-manager.d.ts +236 -0
  45. package/dist/agi/features/assistants-manager.d.ts.map +1 -0
  46. package/dist/agi/features/autonomous-assistant.d.ts +281 -0
  47. package/dist/agi/features/autonomous-assistant.d.ts.map +1 -0
  48. package/dist/agi/features/browser-use.d.ts +479 -0
  49. package/dist/agi/features/browser-use.d.ts.map +1 -0
  50. package/dist/agi/features/claude-code.d.ts +824 -0
  51. package/dist/agi/features/claude-code.d.ts.map +1 -0
  52. package/dist/agi/features/conversation-history.d.ts +245 -0
  53. package/dist/agi/features/conversation-history.d.ts.map +1 -0
  54. package/dist/agi/features/conversation.d.ts +464 -0
  55. package/dist/agi/features/conversation.d.ts.map +1 -0
  56. package/dist/agi/features/docs-reader.d.ts +72 -0
  57. package/dist/agi/features/docs-reader.d.ts.map +1 -0
  58. package/dist/agi/features/file-tools.d.ts +110 -0
  59. package/dist/agi/features/file-tools.d.ts.map +1 -0
  60. package/dist/agi/features/luca-coder.d.ts +323 -0
  61. package/dist/agi/features/luca-coder.d.ts.map +1 -0
  62. package/dist/agi/features/openai-codex.d.ts +381 -0
  63. package/dist/agi/features/openai-codex.d.ts.map +1 -0
  64. package/dist/agi/features/openapi.d.ts +200 -0
  65. package/dist/agi/features/openapi.d.ts.map +1 -0
  66. package/dist/agi/features/skills-library.d.ts +167 -0
  67. package/dist/agi/features/skills-library.d.ts.map +1 -0
  68. package/dist/agi/index.d.ts +5 -0
  69. package/dist/agi/index.d.ts.map +1 -0
  70. package/dist/agi/lib/interceptor-chain.d.ts +44 -0
  71. package/dist/agi/lib/interceptor-chain.d.ts.map +1 -0
  72. package/dist/agi/lib/token-counter.d.ts +13 -0
  73. package/dist/agi/lib/token-counter.d.ts.map +1 -0
  74. package/dist/bootstrap/generated.d.ts +5 -0
  75. package/dist/bootstrap/generated.d.ts.map +1 -0
  76. package/dist/browser.d.ts +12 -0
  77. package/dist/browser.d.ts.map +1 -0
  78. package/dist/bus.d.ts +29 -0
  79. package/dist/bus.d.ts.map +1 -0
  80. package/dist/cli/build-info.d.ts +4 -0
  81. package/dist/cli/build-info.d.ts.map +1 -0
  82. package/dist/cli/cli.d.ts +3 -0
  83. package/dist/cli/cli.d.ts.map +1 -0
  84. package/dist/client.d.ts +60 -0
  85. package/dist/client.d.ts.map +1 -0
  86. package/dist/clients/civitai/index.d.ts +472 -0
  87. package/dist/clients/civitai/index.d.ts.map +1 -0
  88. package/dist/clients/client-template.d.ts +30 -0
  89. package/dist/clients/client-template.d.ts.map +1 -0
  90. package/dist/clients/comfyui/index.d.ts +281 -0
  91. package/dist/clients/comfyui/index.d.ts.map +1 -0
  92. package/dist/clients/elevenlabs/index.d.ts +197 -0
  93. package/dist/clients/elevenlabs/index.d.ts.map +1 -0
  94. package/dist/clients/graph.d.ts +64 -0
  95. package/dist/clients/graph.d.ts.map +1 -0
  96. package/dist/clients/openai/index.d.ts +247 -0
  97. package/dist/clients/openai/index.d.ts.map +1 -0
  98. package/dist/clients/rest.d.ts +92 -0
  99. package/dist/clients/rest.d.ts.map +1 -0
  100. package/dist/clients/supabase/index.d.ts +176 -0
  101. package/dist/clients/supabase/index.d.ts.map +1 -0
  102. package/dist/clients/websocket.d.ts +127 -0
  103. package/dist/clients/websocket.d.ts.map +1 -0
  104. package/dist/command.d.ts +163 -0
  105. package/dist/command.d.ts.map +1 -0
  106. package/dist/commands/bootstrap.d.ts +20 -0
  107. package/dist/commands/bootstrap.d.ts.map +1 -0
  108. package/dist/commands/chat.d.ts +37 -0
  109. package/dist/commands/chat.d.ts.map +1 -0
  110. package/dist/commands/code.d.ts +28 -0
  111. package/dist/commands/code.d.ts.map +1 -0
  112. package/dist/commands/console.d.ts +22 -0
  113. package/dist/commands/console.d.ts.map +1 -0
  114. package/dist/commands/describe.d.ts +50 -0
  115. package/dist/commands/describe.d.ts.map +1 -0
  116. package/dist/commands/eval.d.ts +23 -0
  117. package/dist/commands/eval.d.ts.map +1 -0
  118. package/dist/commands/help.d.ts +25 -0
  119. package/dist/commands/help.d.ts.map +1 -0
  120. package/dist/commands/index.d.ts +18 -0
  121. package/dist/commands/index.d.ts.map +1 -0
  122. package/dist/commands/introspect.d.ts +24 -0
  123. package/dist/commands/introspect.d.ts.map +1 -0
  124. package/dist/commands/mcp.d.ts +35 -0
  125. package/dist/commands/mcp.d.ts.map +1 -0
  126. package/dist/commands/prompt.d.ts +38 -0
  127. package/dist/commands/prompt.d.ts.map +1 -0
  128. package/dist/commands/run.d.ts +24 -0
  129. package/dist/commands/run.d.ts.map +1 -0
  130. package/dist/commands/sandbox-mcp.d.ts +34 -0
  131. package/dist/commands/sandbox-mcp.d.ts.map +1 -0
  132. package/dist/commands/save-api-docs.d.ts +21 -0
  133. package/dist/commands/save-api-docs.d.ts.map +1 -0
  134. package/dist/commands/scaffold.d.ts +24 -0
  135. package/dist/commands/scaffold.d.ts.map +1 -0
  136. package/dist/commands/select.d.ts +22 -0
  137. package/dist/commands/select.d.ts.map +1 -0
  138. package/dist/commands/serve.d.ts +29 -0
  139. package/dist/commands/serve.d.ts.map +1 -0
  140. package/dist/container-describer.d.ts +144 -0
  141. package/dist/container-describer.d.ts.map +1 -0
  142. package/dist/container.d.ts +451 -0
  143. package/dist/container.d.ts.map +1 -0
  144. package/dist/endpoint.d.ts +113 -0
  145. package/dist/endpoint.d.ts.map +1 -0
  146. package/dist/feature.d.ts +47 -0
  147. package/dist/feature.d.ts.map +1 -0
  148. package/dist/graft.d.ts +29 -0
  149. package/dist/graft.d.ts.map +1 -0
  150. package/dist/hash-object.d.ts +8 -0
  151. package/dist/hash-object.d.ts.map +1 -0
  152. package/dist/helper.d.ts +209 -0
  153. package/dist/helper.d.ts.map +1 -0
  154. package/dist/introspection/generated.node.d.ts +44623 -0
  155. package/dist/introspection/generated.node.d.ts.map +1 -0
  156. package/dist/introspection/generated.web.d.ts +1412 -0
  157. package/dist/introspection/generated.web.d.ts.map +1 -0
  158. package/dist/introspection/index.d.ts +156 -0
  159. package/dist/introspection/index.d.ts.map +1 -0
  160. package/dist/introspection/scan.d.ts +147 -0
  161. package/dist/introspection/scan.d.ts.map +1 -0
  162. package/dist/node/container.d.ts +256 -0
  163. package/dist/node/container.d.ts.map +1 -0
  164. package/dist/node/feature.d.ts +9 -0
  165. package/dist/node/feature.d.ts.map +1 -0
  166. package/dist/node/features/container-link.d.ts +213 -0
  167. package/dist/node/features/container-link.d.ts.map +1 -0
  168. package/dist/node/features/content-db.d.ts +354 -0
  169. package/dist/node/features/content-db.d.ts.map +1 -0
  170. package/dist/node/features/disk-cache.d.ts +236 -0
  171. package/dist/node/features/disk-cache.d.ts.map +1 -0
  172. package/dist/node/features/dns.d.ts +511 -0
  173. package/dist/node/features/dns.d.ts.map +1 -0
  174. package/dist/node/features/docker.d.ts +485 -0
  175. package/dist/node/features/docker.d.ts.map +1 -0
  176. package/dist/node/features/downloader.d.ts +73 -0
  177. package/dist/node/features/downloader.d.ts.map +1 -0
  178. package/dist/node/features/figlet-fonts.d.ts +4 -0
  179. package/dist/node/features/figlet-fonts.d.ts.map +1 -0
  180. package/dist/node/features/file-manager.d.ts +177 -0
  181. package/dist/node/features/file-manager.d.ts.map +1 -0
  182. package/dist/node/features/fs.d.ts +635 -0
  183. package/dist/node/features/fs.d.ts.map +1 -0
  184. package/dist/node/features/git.d.ts +329 -0
  185. package/dist/node/features/git.d.ts.map +1 -0
  186. package/dist/node/features/google-auth.d.ts +200 -0
  187. package/dist/node/features/google-auth.d.ts.map +1 -0
  188. package/dist/node/features/google-calendar.d.ts +194 -0
  189. package/dist/node/features/google-calendar.d.ts.map +1 -0
  190. package/dist/node/features/google-docs.d.ts +138 -0
  191. package/dist/node/features/google-docs.d.ts.map +1 -0
  192. package/dist/node/features/google-drive.d.ts +202 -0
  193. package/dist/node/features/google-drive.d.ts.map +1 -0
  194. package/dist/node/features/google-mail.d.ts +221 -0
  195. package/dist/node/features/google-mail.d.ts.map +1 -0
  196. package/dist/node/features/google-sheets.d.ts +157 -0
  197. package/dist/node/features/google-sheets.d.ts.map +1 -0
  198. package/dist/node/features/grep.d.ts +207 -0
  199. package/dist/node/features/grep.d.ts.map +1 -0
  200. package/dist/node/features/helpers.d.ts +236 -0
  201. package/dist/node/features/helpers.d.ts.map +1 -0
  202. package/dist/node/features/ink.d.ts +332 -0
  203. package/dist/node/features/ink.d.ts.map +1 -0
  204. package/dist/node/features/ipc-socket.d.ts +298 -0
  205. package/dist/node/features/ipc-socket.d.ts.map +1 -0
  206. package/dist/node/features/json-tree.d.ts +140 -0
  207. package/dist/node/features/json-tree.d.ts.map +1 -0
  208. package/dist/node/features/networking.d.ts +373 -0
  209. package/dist/node/features/networking.d.ts.map +1 -0
  210. package/dist/node/features/nlp.d.ts +125 -0
  211. package/dist/node/features/nlp.d.ts.map +1 -0
  212. package/dist/node/features/opener.d.ts +93 -0
  213. package/dist/node/features/opener.d.ts.map +1 -0
  214. package/dist/node/features/os.d.ts +168 -0
  215. package/dist/node/features/os.d.ts.map +1 -0
  216. package/dist/node/features/package-finder.d.ts +419 -0
  217. package/dist/node/features/package-finder.d.ts.map +1 -0
  218. package/dist/node/features/postgres.d.ts +173 -0
  219. package/dist/node/features/postgres.d.ts.map +1 -0
  220. package/dist/node/features/proc.d.ts +285 -0
  221. package/dist/node/features/proc.d.ts.map +1 -0
  222. package/dist/node/features/process-manager.d.ts +427 -0
  223. package/dist/node/features/process-manager.d.ts.map +1 -0
  224. package/dist/node/features/python.d.ts +477 -0
  225. package/dist/node/features/python.d.ts.map +1 -0
  226. package/dist/node/features/redis.d.ts +247 -0
  227. package/dist/node/features/redis.d.ts.map +1 -0
  228. package/dist/node/features/repl.d.ts +84 -0
  229. package/dist/node/features/repl.d.ts.map +1 -0
  230. package/dist/node/features/runpod.d.ts +527 -0
  231. package/dist/node/features/runpod.d.ts.map +1 -0
  232. package/dist/node/features/secure-shell.d.ts +145 -0
  233. package/dist/node/features/secure-shell.d.ts.map +1 -0
  234. package/dist/node/features/semantic-search.d.ts +207 -0
  235. package/dist/node/features/semantic-search.d.ts.map +1 -0
  236. package/dist/node/features/sqlite.d.ts +180 -0
  237. package/dist/node/features/sqlite.d.ts.map +1 -0
  238. package/dist/node/features/telegram.d.ts +173 -0
  239. package/dist/node/features/telegram.d.ts.map +1 -0
  240. package/dist/node/features/transpiler.d.ts +51 -0
  241. package/dist/node/features/transpiler.d.ts.map +1 -0
  242. package/dist/node/features/tts.d.ts +108 -0
  243. package/dist/node/features/tts.d.ts.map +1 -0
  244. package/dist/node/features/ui.d.ts +562 -0
  245. package/dist/node/features/ui.d.ts.map +1 -0
  246. package/dist/node/features/vault.d.ts +90 -0
  247. package/dist/node/features/vault.d.ts.map +1 -0
  248. package/dist/node/features/vm.d.ts +285 -0
  249. package/dist/node/features/vm.d.ts.map +1 -0
  250. package/dist/node/features/yaml-tree.d.ts +118 -0
  251. package/dist/node/features/yaml-tree.d.ts.map +1 -0
  252. package/dist/node/features/yaml.d.ts +127 -0
  253. package/dist/node/features/yaml.d.ts.map +1 -0
  254. package/dist/node.d.ts +67 -0
  255. package/dist/node.d.ts.map +1 -0
  256. package/dist/python/generated.d.ts +2 -0
  257. package/dist/python/generated.d.ts.map +1 -0
  258. package/dist/react/index.d.ts +36 -0
  259. package/dist/react/index.d.ts.map +1 -0
  260. package/dist/registry.d.ts +97 -0
  261. package/dist/registry.d.ts.map +1 -0
  262. package/dist/scaffolds/generated.d.ts +13 -0
  263. package/dist/scaffolds/generated.d.ts.map +1 -0
  264. package/dist/scaffolds/template.d.ts +11 -0
  265. package/dist/scaffolds/template.d.ts.map +1 -0
  266. package/dist/schemas/base.d.ts +254 -0
  267. package/dist/schemas/base.d.ts.map +1 -0
  268. package/dist/selector.d.ts +130 -0
  269. package/dist/selector.d.ts.map +1 -0
  270. package/dist/server.d.ts +89 -0
  271. package/dist/server.d.ts.map +1 -0
  272. package/dist/servers/express.d.ts +104 -0
  273. package/dist/servers/express.d.ts.map +1 -0
  274. package/dist/servers/mcp.d.ts +201 -0
  275. package/dist/servers/mcp.d.ts.map +1 -0
  276. package/dist/servers/socket.d.ts +121 -0
  277. package/dist/servers/socket.d.ts.map +1 -0
  278. package/dist/state.d.ts +24 -0
  279. package/dist/state.d.ts.map +1 -0
  280. package/dist/web/clients/socket.d.ts +37 -0
  281. package/dist/web/clients/socket.d.ts.map +1 -0
  282. package/dist/web/container.d.ts +55 -0
  283. package/dist/web/container.d.ts.map +1 -0
  284. package/dist/web/extension.d.ts +4 -0
  285. package/dist/web/extension.d.ts.map +1 -0
  286. package/dist/web/feature.d.ts +8 -0
  287. package/dist/web/feature.d.ts.map +1 -0
  288. package/dist/web/features/asset-loader.d.ts +35 -0
  289. package/dist/web/features/asset-loader.d.ts.map +1 -0
  290. package/dist/web/features/container-link.d.ts +167 -0
  291. package/dist/web/features/container-link.d.ts.map +1 -0
  292. package/dist/web/features/esbuild.d.ts +51 -0
  293. package/dist/web/features/esbuild.d.ts.map +1 -0
  294. package/dist/web/features/helpers.d.ts +140 -0
  295. package/dist/web/features/helpers.d.ts.map +1 -0
  296. package/dist/web/features/network.d.ts +69 -0
  297. package/dist/web/features/network.d.ts.map +1 -0
  298. package/dist/web/features/speech.d.ts +71 -0
  299. package/dist/web/features/speech.d.ts.map +1 -0
  300. package/dist/web/features/vault.d.ts +62 -0
  301. package/dist/web/features/vault.d.ts.map +1 -0
  302. package/dist/web/features/vm.d.ts +48 -0
  303. package/dist/web/features/vm.d.ts.map +1 -0
  304. package/dist/web/features/voice-recognition.d.ts +96 -0
  305. package/dist/web/features/voice-recognition.d.ts.map +1 -0
  306. package/dist/web/shims/isomorphic-vm.d.ts +22 -0
  307. package/dist/web/shims/isomorphic-vm.d.ts.map +1 -0
  308. package/docs/CLI.md +335 -0
  309. package/docs/CNAME +1 -0
  310. package/docs/README.md +60 -0
  311. package/docs/TABLE-OF-CONTENTS.md +183 -0
  312. package/docs/apis/clients/elevenlabs.md +308 -0
  313. package/docs/apis/clients/graph.md +107 -0
  314. package/docs/apis/clients/openai.md +429 -0
  315. package/docs/apis/clients/rest.md +161 -0
  316. package/docs/apis/clients/websocket.md +174 -0
  317. package/docs/apis/features/agi/assistant.md +625 -0
  318. package/docs/apis/features/agi/assistants-manager.md +282 -0
  319. package/docs/apis/features/agi/auto-assistant.md +279 -0
  320. package/docs/apis/features/agi/browser-use.md +802 -0
  321. package/docs/apis/features/agi/claude-code.md +884 -0
  322. package/docs/apis/features/agi/conversation-history.md +364 -0
  323. package/docs/apis/features/agi/conversation.md +548 -0
  324. package/docs/apis/features/agi/docs-reader.md +99 -0
  325. package/docs/apis/features/agi/file-tools.md +163 -0
  326. package/docs/apis/features/agi/luca-coder.md +407 -0
  327. package/docs/apis/features/agi/openai-codex.md +396 -0
  328. package/docs/apis/features/agi/openapi.md +138 -0
  329. package/docs/apis/features/agi/semantic-search.md +387 -0
  330. package/docs/apis/features/agi/skills-library.md +239 -0
  331. package/docs/apis/features/node/container-link.md +192 -0
  332. package/docs/apis/features/node/content-db.md +450 -0
  333. package/docs/apis/features/node/disk-cache.md +379 -0
  334. package/docs/apis/features/node/dns.md +652 -0
  335. package/docs/apis/features/node/docker.md +706 -0
  336. package/docs/apis/features/node/downloader.md +81 -0
  337. package/docs/apis/features/node/esbuild.md +60 -0
  338. package/docs/apis/features/node/file-manager.md +191 -0
  339. package/docs/apis/features/node/fs.md +1217 -0
  340. package/docs/apis/features/node/git.md +371 -0
  341. package/docs/apis/features/node/google-auth.md +193 -0
  342. package/docs/apis/features/node/google-calendar.md +202 -0
  343. package/docs/apis/features/node/google-docs.md +173 -0
  344. package/docs/apis/features/node/google-drive.md +246 -0
  345. package/docs/apis/features/node/google-mail.md +214 -0
  346. package/docs/apis/features/node/google-sheets.md +194 -0
  347. package/docs/apis/features/node/grep.md +292 -0
  348. package/docs/apis/features/node/helpers.md +164 -0
  349. package/docs/apis/features/node/ink.md +334 -0
  350. package/docs/apis/features/node/ipc-socket.md +249 -0
  351. package/docs/apis/features/node/json-tree.md +86 -0
  352. package/docs/apis/features/node/networking.md +316 -0
  353. package/docs/apis/features/node/nlp.md +133 -0
  354. package/docs/apis/features/node/opener.md +97 -0
  355. package/docs/apis/features/node/os.md +146 -0
  356. package/docs/apis/features/node/package-finder.md +392 -0
  357. package/docs/apis/features/node/postgres.md +234 -0
  358. package/docs/apis/features/node/proc.md +399 -0
  359. package/docs/apis/features/node/process-manager.md +305 -0
  360. package/docs/apis/features/node/python.md +604 -0
  361. package/docs/apis/features/node/redis.md +380 -0
  362. package/docs/apis/features/node/repl.md +88 -0
  363. package/docs/apis/features/node/runpod.md +674 -0
  364. package/docs/apis/features/node/secure-shell.md +176 -0
  365. package/docs/apis/features/node/semantic-search.md +408 -0
  366. package/docs/apis/features/node/sqlite.md +233 -0
  367. package/docs/apis/features/node/telegram.md +279 -0
  368. package/docs/apis/features/node/transpiler.md +74 -0
  369. package/docs/apis/features/node/tts.md +133 -0
  370. package/docs/apis/features/node/ui.md +701 -0
  371. package/docs/apis/features/node/vault.md +59 -0
  372. package/docs/apis/features/node/vm.md +75 -0
  373. package/docs/apis/features/node/yaml-tree.md +85 -0
  374. package/docs/apis/features/node/yaml.md +176 -0
  375. package/docs/apis/features/web/asset-loader.md +59 -0
  376. package/docs/apis/features/web/container-link.md +192 -0
  377. package/docs/apis/features/web/esbuild.md +54 -0
  378. package/docs/apis/features/web/helpers.md +164 -0
  379. package/docs/apis/features/web/network.md +44 -0
  380. package/docs/apis/features/web/speech.md +69 -0
  381. package/docs/apis/features/web/vault.md +59 -0
  382. package/docs/apis/features/web/vm.md +75 -0
  383. package/docs/apis/features/web/voice.md +84 -0
  384. package/docs/apis/servers/express.md +171 -0
  385. package/docs/apis/servers/mcp.md +238 -0
  386. package/docs/apis/servers/websocket.md +170 -0
  387. package/docs/bootstrap/CLAUDE.md +101 -0
  388. package/docs/bootstrap/SKILL.md +341 -0
  389. package/docs/bootstrap/templates/about-command.ts +41 -0
  390. package/docs/bootstrap/templates/docs-models.ts +22 -0
  391. package/docs/bootstrap/templates/docs-readme.md +43 -0
  392. package/docs/bootstrap/templates/example-feature.ts +53 -0
  393. package/docs/bootstrap/templates/health-endpoint.ts +15 -0
  394. package/docs/bootstrap/templates/luca-cli.ts +30 -0
  395. package/docs/bootstrap/templates/runme.md +54 -0
  396. package/docs/challenges/caching-proxy.md +16 -0
  397. package/docs/challenges/content-db-round-trip.md +14 -0
  398. package/docs/challenges/custom-command.md +9 -0
  399. package/docs/challenges/file-watcher-pipeline.md +11 -0
  400. package/docs/challenges/grep-audit-report.md +15 -0
  401. package/docs/challenges/multi-feature-dashboard.md +14 -0
  402. package/docs/challenges/process-orchestrator.md +17 -0
  403. package/docs/challenges/rest-api-server-with-client.md +12 -0
  404. package/docs/challenges/script-runner-with-vm.md +11 -0
  405. package/docs/challenges/simple-rest-api.md +15 -0
  406. package/docs/challenges/websocket-serve-and-client.md +11 -0
  407. package/docs/challenges/yaml-config-system.md +14 -0
  408. package/docs/command-system-overhaul.md +94 -0
  409. package/docs/documentation-audit.md +134 -0
  410. package/docs/examples/assistant/CORE.md +18 -0
  411. package/docs/examples/assistant/hooks.ts +3 -0
  412. package/docs/examples/assistant/tools.ts +10 -0
  413. package/docs/examples/assistant-hooks-reference.ts +171 -0
  414. package/docs/examples/assistant-with-process-manager.md +84 -0
  415. package/docs/examples/content-db.md +77 -0
  416. package/docs/examples/disk-cache.md +83 -0
  417. package/docs/examples/docker.md +101 -0
  418. package/docs/examples/downloader.md +70 -0
  419. package/docs/examples/entity.md +124 -0
  420. package/docs/examples/esbuild.md +80 -0
  421. package/docs/examples/feature-as-tool-provider.md +143 -0
  422. package/docs/examples/file-manager.md +82 -0
  423. package/docs/examples/fs.md +83 -0
  424. package/docs/examples/git.md +85 -0
  425. package/docs/examples/google-auth.md +88 -0
  426. package/docs/examples/google-calendar.md +94 -0
  427. package/docs/examples/google-docs.md +82 -0
  428. package/docs/examples/google-drive.md +96 -0
  429. package/docs/examples/google-sheets.md +95 -0
  430. package/docs/examples/grep.md +85 -0
  431. package/docs/examples/ink-blocks.md +75 -0
  432. package/docs/examples/ink-renderer.md +41 -0
  433. package/docs/examples/ink.md +103 -0
  434. package/docs/examples/ipc-socket.md +103 -0
  435. package/docs/examples/json-tree.md +91 -0
  436. package/docs/examples/networking.md +58 -0
  437. package/docs/examples/nlp.md +91 -0
  438. package/docs/examples/opener.md +78 -0
  439. package/docs/examples/os.md +72 -0
  440. package/docs/examples/package-finder.md +89 -0
  441. package/docs/examples/postgres.md +91 -0
  442. package/docs/examples/proc.md +81 -0
  443. package/docs/examples/process-manager.md +79 -0
  444. package/docs/examples/python.md +132 -0
  445. package/docs/examples/repl.md +93 -0
  446. package/docs/examples/runpod.md +119 -0
  447. package/docs/examples/secure-shell.md +92 -0
  448. package/docs/examples/sqlite.md +86 -0
  449. package/docs/examples/structured-output-with-assistants.md +144 -0
  450. package/docs/examples/telegram.md +77 -0
  451. package/docs/examples/tts.md +86 -0
  452. package/docs/examples/ui.md +80 -0
  453. package/docs/examples/vault.md +70 -0
  454. package/docs/examples/vm.md +86 -0
  455. package/docs/examples/websocket-ask-and-reply-example.md +128 -0
  456. package/docs/examples/yaml-tree.md +93 -0
  457. package/docs/examples/yaml.md +104 -0
  458. package/docs/ideas/assistant-factory-pattern.md +142 -0
  459. package/docs/in-memory-fs.md +4 -0
  460. package/docs/introspection-audit.md +49 -0
  461. package/docs/introspection.md +164 -0
  462. package/docs/mcp/readme.md +162 -0
  463. package/docs/models.ts +41 -0
  464. package/docs/philosophy.md +86 -0
  465. package/docs/principles.md +7 -0
  466. package/docs/prompts/audit-codebase-for-failures-to-use-the-container.md +34 -0
  467. package/docs/prompts/check-for-undocumented-features.md +27 -0
  468. package/docs/prompts/mcp-test-easy-command.md +27 -0
  469. package/docs/scaffolds/client.md +149 -0
  470. package/docs/scaffolds/command.md +120 -0
  471. package/docs/scaffolds/endpoint.md +171 -0
  472. package/docs/scaffolds/feature.md +158 -0
  473. package/docs/scaffolds/selector.md +91 -0
  474. package/docs/scaffolds/server.md +196 -0
  475. package/docs/selectors.md +115 -0
  476. package/docs/sessions/custom-command/attempt-log-2.md +195 -0
  477. package/docs/sessions/file-watcher-pipeline/attempt-log-1.md +728 -0
  478. package/docs/sessions/file-watcher-pipeline/attempt-log-2.md +555 -0
  479. package/docs/sessions/grep-audit-report/attempt-log-1.md +289 -0
  480. package/docs/sessions/multi-feature-dashboard/attempt-log-2.md +679 -0
  481. package/docs/sessions/rest-api-server-with-client/attempt-log-1.md +1 -0
  482. package/docs/sessions/rest-api-server-with-client/attempt-log-3.md +920 -0
  483. package/docs/sessions/simple-rest-api/attempt-log-1.md +593 -0
  484. package/docs/sessions/websocket-serve-and-client/attempt-log-2.md +995 -0
  485. package/docs/tutorials/00-bootstrap.md +166 -0
  486. package/docs/tutorials/01-getting-started.md +106 -0
  487. package/docs/tutorials/02-container.md +210 -0
  488. package/docs/tutorials/03-scripts.md +194 -0
  489. package/docs/tutorials/04-features-overview.md +196 -0
  490. package/docs/tutorials/05-state-and-events.md +171 -0
  491. package/docs/tutorials/06-servers.md +157 -0
  492. package/docs/tutorials/07-endpoints.md +198 -0
  493. package/docs/tutorials/08-commands.md +252 -0
  494. package/docs/tutorials/09-clients.md +162 -0
  495. package/docs/tutorials/10-creating-features.md +203 -0
  496. package/docs/tutorials/11-contentbase.md +191 -0
  497. package/docs/tutorials/12-assistants.md +215 -0
  498. package/docs/tutorials/13-introspection.md +157 -0
  499. package/docs/tutorials/14-type-system.md +174 -0
  500. package/docs/tutorials/15-project-patterns.md +222 -0
  501. package/docs/tutorials/16-google-features.md +534 -0
  502. package/docs/tutorials/17-tui-blocks.md +530 -0
  503. package/docs/tutorials/18-semantic-search.md +334 -0
  504. package/docs/tutorials/19-python-sessions.md +401 -0
  505. package/docs/tutorials/20-browser-esm.md +234 -0
  506. package/index.html +1430 -0
  507. package/index.ts +1 -0
  508. package/install.sh +84 -0
  509. package/luca.cli.ts +16 -0
  510. package/luca.console.ts +9 -0
  511. package/main.py +6 -0
  512. package/package.json +219 -66
  513. package/public/index.html +1430 -0
  514. package/public/slides-ai-native.html +902 -0
  515. package/public/slides-intro.html +974 -0
  516. package/pyproject.toml +7 -0
  517. package/scripts/build-web.ts +28 -0
  518. package/scripts/examples/ask-luca-expert.ts +42 -0
  519. package/scripts/examples/assistant-questions.ts +12 -0
  520. package/scripts/examples/excalidraw-expert.ts +75 -0
  521. package/scripts/examples/expert-chat.ts +0 -0
  522. package/scripts/examples/file-manager.ts +14 -0
  523. package/scripts/examples/ideas.ts +12 -0
  524. package/scripts/examples/interactive-chat.ts +20 -0
  525. package/scripts/examples/openai-tool-calls.ts +113 -0
  526. package/scripts/examples/opening-a-web-browser.ts +5 -0
  527. package/scripts/examples/telegram-bot.ts +79 -0
  528. package/scripts/examples/using-assistant-with-mcp.ts +555 -0
  529. package/scripts/examples/using-claude-code.ts +10 -0
  530. package/scripts/examples/using-contentdb.ts +35 -0
  531. package/scripts/examples/using-conversations.ts +35 -0
  532. package/scripts/examples/using-disk-cache.ts +10 -0
  533. package/scripts/examples/using-docker-shell.ts +75 -0
  534. package/scripts/examples/using-elevenlabs.ts +25 -0
  535. package/scripts/examples/using-google-calendar.ts +57 -0
  536. package/scripts/examples/using-google-docs.ts +74 -0
  537. package/scripts/examples/using-google-drive.ts +74 -0
  538. package/scripts/examples/using-google-sheets.ts +89 -0
  539. package/scripts/examples/using-nlp.ts +55 -0
  540. package/scripts/examples/using-ollama.ts +11 -0
  541. package/scripts/examples/using-postgres.ts +55 -0
  542. package/scripts/examples/using-runpod.ts +32 -0
  543. package/scripts/examples/using-tts.ts +40 -0
  544. package/scripts/scaffold.ts +391 -0
  545. package/scripts/scratch.ts +15 -0
  546. package/scripts/stamp-build.sh +12 -0
  547. package/scripts/test-assistant-hooks.ts +13 -0
  548. package/scripts/test-docs-reader.ts +10 -0
  549. package/scripts/test-linux-binary.sh +80 -0
  550. package/scripts/update-introspection-data.ts +58 -0
  551. package/src/agi/README.md +14 -0
  552. package/src/agi/container.server.ts +152 -0
  553. package/src/agi/endpoints/ask.ts +60 -0
  554. package/src/agi/endpoints/conversations/[id].ts +45 -0
  555. package/src/agi/endpoints/conversations.ts +31 -0
  556. package/src/agi/endpoints/experts.ts +37 -0
  557. package/src/agi/feature.ts +13 -0
  558. package/src/agi/features/agent-memory.ts +694 -0
  559. package/src/agi/features/assistant.ts +1624 -0
  560. package/src/agi/features/assistants-manager.ts +418 -0
  561. package/src/agi/features/autonomous-assistant.ts +431 -0
  562. package/src/agi/features/browser-use.ts +653 -0
  563. package/src/agi/features/claude-code.ts +1538 -0
  564. package/src/agi/features/coding-tools.ts +175 -0
  565. package/src/agi/features/conversation-history.ts +495 -0
  566. package/src/agi/features/conversation.ts +1323 -0
  567. package/src/agi/features/docs-reader.ts +167 -0
  568. package/src/agi/features/file-tools.ts +293 -0
  569. package/src/agi/features/luca-coder.ts +639 -0
  570. package/src/agi/features/openai-codex.ts +651 -0
  571. package/src/agi/features/openapi.ts +445 -0
  572. package/src/agi/features/skills-library.ts +478 -0
  573. package/src/agi/index.ts +6 -0
  574. package/src/agi/lib/interceptor-chain.ts +89 -0
  575. package/src/agi/lib/token-counter.ts +122 -0
  576. package/src/bootstrap/generated.ts +9792 -0
  577. package/src/browser.ts +25 -0
  578. package/src/bus.ts +122 -0
  579. package/src/cli/build-info.ts +4 -0
  580. package/src/cli/cli.ts +355 -0
  581. package/src/client.ts +170 -0
  582. package/src/clients/civitai/index.ts +537 -0
  583. package/src/clients/client-template.ts +41 -0
  584. package/src/clients/comfyui/index.ts +604 -0
  585. package/src/clients/elevenlabs/index.ts +317 -0
  586. package/src/clients/graph.ts +87 -0
  587. package/src/clients/openai/index.ts +456 -0
  588. package/src/clients/rest.ts +207 -0
  589. package/src/clients/supabase/index.ts +357 -0
  590. package/src/clients/voicebox/index.ts +300 -0
  591. package/src/clients/websocket.ts +251 -0
  592. package/src/command.ts +505 -0
  593. package/src/commands/bootstrap.ts +244 -0
  594. package/src/commands/chat.ts +308 -0
  595. package/src/commands/code.ts +371 -0
  596. package/src/commands/console.ts +189 -0
  597. package/src/commands/describe.ts +243 -0
  598. package/src/commands/eval.ts +121 -0
  599. package/src/commands/help.ts +240 -0
  600. package/src/commands/index.ts +19 -0
  601. package/src/commands/introspect.ts +218 -0
  602. package/src/commands/mcp.ts +64 -0
  603. package/src/commands/prompt.ts +982 -0
  604. package/src/commands/run.ts +278 -0
  605. package/src/commands/sandbox-mcp.ts +343 -0
  606. package/src/commands/save-api-docs.ts +51 -0
  607. package/src/commands/scaffold.ts +225 -0
  608. package/src/commands/select.ts +99 -0
  609. package/src/commands/serve.ts +208 -0
  610. package/src/container-describer.ts +1084 -0
  611. package/src/container.ts +1186 -0
  612. package/src/endpoint.ts +365 -0
  613. package/src/entity.ts +173 -0
  614. package/src/feature.ts +118 -0
  615. package/src/graft.ts +181 -0
  616. package/src/hash-object.ts +97 -0
  617. package/src/helper.ts +849 -0
  618. package/src/introspection/generated.agi.ts +40208 -0
  619. package/src/introspection/generated.node.ts +28686 -0
  620. package/src/introspection/generated.web.ts +2251 -0
  621. package/src/introspection/index.ts +296 -0
  622. package/src/introspection/scan.ts +1131 -0
  623. package/src/node/container.ts +409 -0
  624. package/src/node/feature.ts +13 -0
  625. package/src/node/features/container-link.ts +559 -0
  626. package/src/node/features/content-db.ts +812 -0
  627. package/src/node/features/disk-cache.ts +388 -0
  628. package/src/node/features/dns.ts +669 -0
  629. package/src/node/features/docker.ts +921 -0
  630. package/src/node/features/downloader.ts +79 -0
  631. package/src/node/features/figlet-fonts.ts +600 -0
  632. package/src/node/features/file-manager.ts +535 -0
  633. package/src/node/features/fs.ts +1050 -0
  634. package/src/node/features/git.ts +592 -0
  635. package/src/node/features/google-auth.ts +504 -0
  636. package/src/node/features/google-calendar.ts +306 -0
  637. package/src/node/features/google-docs.ts +412 -0
  638. package/src/node/features/google-drive.ts +346 -0
  639. package/src/node/features/google-mail.ts +540 -0
  640. package/src/node/features/google-sheets.ts +286 -0
  641. package/src/node/features/grep.ts +427 -0
  642. package/src/node/features/helpers.ts +735 -0
  643. package/src/node/features/ink.ts +490 -0
  644. package/src/node/features/ipc-socket.ts +649 -0
  645. package/src/node/features/json-tree.ts +170 -0
  646. package/src/node/features/networking.ts +961 -0
  647. package/src/node/features/nlp.ts +212 -0
  648. package/src/node/features/opener.ts +180 -0
  649. package/src/node/features/os.ts +403 -0
  650. package/src/node/features/package-finder.ts +540 -0
  651. package/src/node/features/postgres.ts +289 -0
  652. package/src/node/features/proc.ts +503 -0
  653. package/src/node/features/process-manager.ts +844 -0
  654. package/src/node/features/python.ts +906 -0
  655. package/src/node/features/redis.ts +446 -0
  656. package/src/node/features/repl.ts +212 -0
  657. package/src/node/features/runpod.ts +811 -0
  658. package/src/node/features/secure-shell.ts +267 -0
  659. package/src/node/features/semantic-search.ts +935 -0
  660. package/src/node/features/sqlite.ts +289 -0
  661. package/src/node/features/telegram.ts +343 -0
  662. package/src/node/features/transpiler.ts +161 -0
  663. package/src/node/features/tts.ts +185 -0
  664. package/src/node/features/ui.ts +786 -0
  665. package/src/node/features/vault.ts +153 -0
  666. package/src/node/features/vm.ts +462 -0
  667. package/src/node/features/yaml-tree.ts +148 -0
  668. package/src/node/features/yaml.ts +133 -0
  669. package/src/node.ts +76 -0
  670. package/src/python/bridge.py +220 -0
  671. package/src/python/generated.ts +227 -0
  672. package/src/react/index.ts +175 -0
  673. package/src/registry.ts +210 -0
  674. package/src/scaffolds/generated.ts +1815 -0
  675. package/src/scaffolds/template.ts +46 -0
  676. package/src/schemas/base.ts +296 -0
  677. package/src/selector.ts +352 -0
  678. package/src/server.ts +229 -0
  679. package/src/servers/express.ts +283 -0
  680. package/src/servers/mcp.ts +802 -0
  681. package/src/servers/socket.ts +258 -0
  682. package/src/state.ts +101 -0
  683. package/src/web/clients/socket.ts +99 -0
  684. package/src/web/container.ts +75 -0
  685. package/src/web/extension.ts +30 -0
  686. package/src/web/feature.ts +12 -0
  687. package/src/web/features/asset-loader.ts +72 -0
  688. package/src/web/features/container-link.ts +382 -0
  689. package/src/web/features/esbuild.ts +93 -0
  690. package/src/web/features/helpers.ts +269 -0
  691. package/src/web/features/network.ts +85 -0
  692. package/src/web/features/speech.ts +104 -0
  693. package/src/web/features/vault.ts +207 -0
  694. package/src/web/features/vm.ts +85 -0
  695. package/src/web/features/voice-recognition.ts +161 -0
  696. package/src/web/shims/isomorphic-vm.ts +149 -0
  697. package/test/assistant-hooks.test.ts +306 -0
  698. package/test/assistant.test.ts +81 -0
  699. package/test/bus.test.ts +134 -0
  700. package/test/clients-servers.test.ts +217 -0
  701. package/test/command.test.ts +267 -0
  702. package/test/container-link.test.ts +274 -0
  703. package/test/conversation.test.ts +220 -0
  704. package/test/features.test.ts +160 -0
  705. package/test/fork-and-research.test.ts +450 -0
  706. package/test/integration.test.ts +787 -0
  707. package/test/interceptor-chain.test.ts +61 -0
  708. package/test/node-container.test.ts +121 -0
  709. package/test/python-session.test.ts +105 -0
  710. package/test/rate-limit.test.ts +272 -0
  711. package/test/semantic-search.test.ts +550 -0
  712. package/test/state.test.ts +121 -0
  713. package/test/vm-context.test.ts +146 -0
  714. package/test/vm-loadmodule.test.ts +213 -0
  715. package/test/websocket-ask.test.ts +101 -0
  716. package/test-integration/assistant.test.ts +138 -0
  717. package/test-integration/assistants-manager.test.ts +113 -0
  718. package/test-integration/claude-code.test.ts +98 -0
  719. package/test-integration/conversation-history.test.ts +205 -0
  720. package/test-integration/conversation.test.ts +137 -0
  721. package/test-integration/elevenlabs.test.ts +55 -0
  722. package/test-integration/google-services.test.ts +80 -0
  723. package/test-integration/helpers.ts +89 -0
  724. package/test-integration/memory.test.ts +204 -0
  725. package/test-integration/openai-codex.test.ts +93 -0
  726. package/test-integration/runpod.test.ts +58 -0
  727. package/test-integration/server-endpoints.test.ts +97 -0
  728. package/test-integration/telegram.test.ts +46 -0
  729. package/tsconfig.build.json +12 -0
  730. package/tsconfig.json +58 -0
  731. package/uv.lock +8 -0
  732. package/LICENSE +0 -21
  733. package/dist/cli/index.d.ts +0 -2
  734. package/dist/cli/index.js +0 -5
  735. package/dist/cli/run.d.ts +0 -12
  736. package/dist/cli/run.js +0 -42
  737. package/dist/config/consts.d.ts +0 -2
  738. package/dist/config/consts.js +0 -29
  739. package/dist/config/default.d.ts +0 -8
  740. package/dist/config/default.js +0 -15
  741. package/dist/config/initConfig.d.ts +0 -1
  742. package/dist/config/initConfig.js +0 -52
  743. package/dist/config/openConfig.d.ts +0 -2
  744. package/dist/config/openConfig.js +0 -24
  745. package/dist/config/runConfig.d.ts +0 -3
  746. package/dist/config/runConfig.js +0 -117
  747. package/dist/config/types.d.ts +0 -13
  748. package/dist/config/types.js +0 -2
  749. package/dist/index.d.ts +0 -1
  750. package/dist/index.js +0 -5
  751. package/dist/utils/common.d.ts +0 -2
  752. package/dist/utils/common.js +0 -52
  753. package/dist/utils/index.d.ts +0 -1
  754. package/dist/utils/index.js +0 -17
@@ -0,0 +1,456 @@
1
+ import { z } from 'zod'
2
+ import { ClientStateSchema, ClientOptionsSchema, ClientEventsSchema } from '@soederpop/luca/schemas/base.js'
3
+ import { Client } from "@soederpop/luca/client";
4
+ import type { Container, ContainerContext } from "@soederpop/luca/container";
5
+
6
+ import OpenAI from "openai";
7
+
8
+ export const OpenAIClientStateSchema = ClientStateSchema.extend({
9
+ requestCount: z.number().default(0).describe('Total number of API requests made'),
10
+ lastRequestTime: z.number().nullable().default(null).describe('Timestamp of the last API request'),
11
+ tokenUsage: z.object({
12
+ prompt: z.number().default(0).describe('Total prompt tokens consumed'),
13
+ completion: z.number().default(0).describe('Total completion tokens consumed'),
14
+ total: z.number().default(0).describe('Total tokens consumed (prompt + completion)'),
15
+ }).default({ prompt: 0, completion: 0, total: 0 }).describe('Cumulative token usage across all requests'),
16
+ })
17
+ export type OpenAIClientState = z.infer<typeof OpenAIClientStateSchema>
18
+
19
+ export const OpenAIClientOptionsSchema = ClientOptionsSchema.extend({
20
+ apiKey: z.string().optional().describe('OpenAI API key (falls back to OPENAI_API_KEY env var)'),
21
+ organization: z.string().optional().describe('OpenAI organization ID'),
22
+ project: z.string().optional().describe('OpenAI project ID'),
23
+ dangerouslyAllowBrowser: z.boolean().optional().describe('Allow usage in browser environments'),
24
+ defaultModel: z.string().optional().describe('Default model for completions (default: gpt-4o)'),
25
+ timeout: z.number().optional().describe('Request timeout in milliseconds'),
26
+ maxRetries: z.number().optional().describe('Maximum number of retries on failure'),
27
+ })
28
+ export type OpenAIClientOptions = z.infer<typeof OpenAIClientOptionsSchema>
29
+
30
+ export const OpenAIClientEventsSchema = ClientEventsSchema.extend({
31
+ connected: z.tuple([]).describe('Emitted when the API connection is verified'),
32
+ completion: z.tuple([z.any().describe('The completion or response object')]).describe('Emitted after a chat completion, legacy completion, or response is created'),
33
+ embedding: z.tuple([z.any().describe('The embedding response object')]).describe('Emitted after embeddings are created'),
34
+ image: z.tuple([z.any().describe('The image generation response object')]).describe('Emitted after an image is generated'),
35
+ models: z.tuple([z.any().describe('The models list response')]).describe('Emitted after listing available models'),
36
+ }).describe('OpenAI client events')
37
+
38
+ /**
39
+ * OpenAI client — wraps the OpenAI SDK for chat completions, responses API, embeddings, and image generation.
40
+ *
41
+ * Provides convenience methods for common operations while tracking token usage and request counts.
42
+ * Supports both the Chat Completions API and the newer Responses API.
43
+ *
44
+ * @example
45
+ * ```typescript
46
+ * const openai = container.client('openai', { defaultModel: 'gpt-4o' })
47
+ * const answer = await openai.ask('What is the meaning of life?')
48
+ * console.log(answer)
49
+ * ```
50
+ */
51
+ export class OpenAIClient extends Client<OpenAIClientState, OpenAIClientOptions> {
52
+ private openai!: OpenAI;
53
+
54
+ static override shortcut = "clients.openai" as const
55
+ static override envVars = ['OPENAI_API_KEY']
56
+ static override stateSchema = OpenAIClientStateSchema
57
+ static override optionsSchema = OpenAIClientOptionsSchema
58
+ static override eventsSchema = OpenAIClientEventsSchema
59
+
60
+ static { Client.register(this, 'openai') }
61
+
62
+ /** Initial state with zeroed token usage counters. */
63
+ override get initialState(): OpenAIClientState {
64
+ return {
65
+ ...super.initialState,
66
+ requestCount: 0,
67
+ lastRequestTime: null,
68
+ tokenUsage: {
69
+ prompt: 0,
70
+ completion: 0,
71
+ total: 0
72
+ }
73
+ };
74
+ }
75
+
76
+ constructor(options: OpenAIClientOptions, context: ContainerContext) {
77
+ super(options, context);
78
+ this.initializeOpenAI();
79
+ }
80
+
81
+ private initializeOpenAI() {
82
+ this.openai = new OpenAI({
83
+ apiKey: this.options.apiKey || process.env.OPENAI_API_KEY,
84
+ organization: this.options.organization,
85
+ project: this.options.project,
86
+ dangerouslyAllowBrowser: this.options.dangerouslyAllowBrowser,
87
+ timeout: this.options.timeout,
88
+ maxRetries: this.options.maxRetries,
89
+ baseURL: this.options.baseURL,
90
+ });
91
+ }
92
+
93
+ /**
94
+ * Test the API connection by listing models.
95
+ *
96
+ * @returns This client instance
97
+ * @throws If the API key is invalid or the connection fails
98
+ *
99
+ * @example
100
+ * ```typescript
101
+ * await openai.connect()
102
+ * ```
103
+ */
104
+ override async connect(): Promise<this> {
105
+ try {
106
+ // Test the connection by making a simple request
107
+ await this.openai.models.list();
108
+ await super.connect();
109
+ this.emit('connected');
110
+ return this;
111
+ } catch (error) {
112
+ this.emit('failure', error);
113
+ throw error;
114
+ }
115
+ }
116
+
117
+ /** The default model used for completions, from options or 'gpt-4o'. */
118
+ get defaultModel(): string {
119
+ return this.options.defaultModel || 'gpt-4o';
120
+ }
121
+
122
+ private updateTokenUsage(usage?: OpenAI.CompletionUsage | OpenAI.Embeddings.CreateEmbeddingResponse.Usage) {
123
+ if (usage) {
124
+ const currentUsage = this.state.get('tokenUsage') || { prompt: 0, completion: 0, total: 0 };
125
+ this.setState({
126
+ tokenUsage: {
127
+ prompt: currentUsage.prompt + (usage.prompt_tokens || 0),
128
+ completion: currentUsage.completion + ('completion_tokens' in usage ? usage.completion_tokens || 0 : 0),
129
+ total: currentUsage.total + (usage.total_tokens || 0)
130
+ }
131
+ });
132
+ }
133
+ }
134
+
135
+ private updateResponsesTokenUsage(usage?: OpenAI.Responses.ResponseUsage) {
136
+ if (usage) {
137
+ const currentUsage = this.state.get('tokenUsage') || { prompt: 0, completion: 0, total: 0 };
138
+ this.setState({
139
+ tokenUsage: {
140
+ prompt: currentUsage.prompt + (usage.input_tokens || 0),
141
+ completion: currentUsage.completion + (usage.output_tokens || 0),
142
+ total: currentUsage.total + (usage.total_tokens || 0),
143
+ }
144
+ });
145
+ }
146
+ }
147
+
148
+ private trackRequest() {
149
+ const requestCount = this.state.get('requestCount') || 0;
150
+ this.setState({
151
+ requestCount: requestCount + 1,
152
+ lastRequestTime: Date.now()
153
+ });
154
+ }
155
+
156
+ /**
157
+ * Create a chat completion using the Chat Completions API.
158
+ *
159
+ * @param messages - Array of chat messages
160
+ * @param options - Additional parameters for the completion
161
+ * @returns The complete chat completion response
162
+ *
163
+ * @example
164
+ * ```typescript
165
+ * const response = await openai.createChatCompletion([
166
+ * { role: 'system', content: 'You are a helpful assistant.' },
167
+ * { role: 'user', content: 'Hello!' }
168
+ * ])
169
+ * console.log(response.choices[0]?.message?.content)
170
+ * ```
171
+ */
172
+ async createChatCompletion(
173
+ messages: OpenAI.Chat.Completions.ChatCompletionMessageParam[],
174
+ options: Partial<OpenAI.Chat.Completions.ChatCompletionCreateParams> = {}
175
+ ): Promise<OpenAI.Chat.Completions.ChatCompletion> {
176
+ this.trackRequest();
177
+
178
+ try {
179
+ const response = await this.openai.chat.completions.create({
180
+ model: this.defaultModel,
181
+ messages,
182
+ stream: false, // Ensure non-streaming response
183
+ ...options
184
+ }) as OpenAI.Chat.Completions.ChatCompletion;
185
+
186
+ this.updateTokenUsage(response.usage);
187
+ this.emit('completion', response);
188
+
189
+ return response;
190
+ } catch (error) {
191
+ this.emit('failure', error);
192
+ throw error;
193
+ }
194
+ }
195
+
196
+ /**
197
+ * Create a response using the Responses API.
198
+ *
199
+ * @param input - The input prompt or message array
200
+ * @param options - Additional parameters for the response
201
+ * @returns The complete response object
202
+ *
203
+ * @example
204
+ * ```typescript
205
+ * const response = await openai.createResponse('Explain quantum computing')
206
+ * ```
207
+ */
208
+ async createResponse(
209
+ input: OpenAI.Responses.ResponseInput | string,
210
+ options: Partial<OpenAI.Responses.ResponseCreateParamsNonStreaming> = {}
211
+ ): Promise<OpenAI.Responses.Response> {
212
+ this.trackRequest();
213
+
214
+ try {
215
+ const response = await this.openai.responses.create({
216
+ model: this.defaultModel as OpenAI.Responses.ResponseCreateParams['model'],
217
+ input,
218
+ ...options,
219
+ stream: false,
220
+ }) as OpenAI.Responses.Response;
221
+
222
+ this.updateResponsesTokenUsage(response.usage || undefined);
223
+ this.emit('completion', response);
224
+
225
+ return response;
226
+ } catch (error) {
227
+ this.emit('failure', error);
228
+ throw error;
229
+ }
230
+ }
231
+
232
+ /**
233
+ * Stream a response using the Responses API.
234
+ *
235
+ * @param input - The input prompt or message array
236
+ * @param options - Additional parameters for the streaming response
237
+ * @returns An async iterable of response stream events
238
+ *
239
+ * @example
240
+ * ```typescript
241
+ * const stream = await openai.streamResponse('Write a poem')
242
+ * for await (const event of stream) {
243
+ * if (event.type === 'response.output_text.delta') {
244
+ * process.stdout.write(event.delta)
245
+ * }
246
+ * }
247
+ * ```
248
+ */
249
+ async streamResponse(
250
+ input: OpenAI.Responses.ResponseInput | string,
251
+ options: Partial<OpenAI.Responses.ResponseCreateParamsStreaming> = {}
252
+ ): Promise<AsyncIterable<OpenAI.Responses.ResponseStreamEvent>> {
253
+ this.trackRequest();
254
+
255
+ try {
256
+ const stream = await this.openai.responses.create({
257
+ model: this.defaultModel as OpenAI.Responses.ResponseCreateParams['model'],
258
+ input,
259
+ ...options,
260
+ stream: true,
261
+ }) as AsyncIterable<OpenAI.Responses.ResponseStreamEvent>;
262
+
263
+ return stream;
264
+ } catch (error) {
265
+ this.emit('failure', error);
266
+ throw error;
267
+ }
268
+ }
269
+
270
+ /**
271
+ * Create a legacy text completion.
272
+ *
273
+ * @param prompt - The text prompt to complete
274
+ * @param options - Additional parameters for the completion
275
+ * @returns The complete completion response
276
+ *
277
+ * @example
278
+ * ```typescript
279
+ * const response = await openai.createCompletion('Once upon a time')
280
+ * ```
281
+ */
282
+ async createCompletion(
283
+ prompt: string,
284
+ options: Partial<OpenAI.Completions.CompletionCreateParams> = {}
285
+ ): Promise<OpenAI.Completions.Completion> {
286
+ this.trackRequest();
287
+
288
+ try {
289
+ const response = await this.openai.completions.create({
290
+ model: options.model || 'gpt-5',
291
+ prompt,
292
+ stream: false, // Ensure non-streaming response
293
+ ...options
294
+ }) as OpenAI.Completions.Completion;
295
+
296
+ this.updateTokenUsage(response.usage);
297
+ this.emit('completion', response);
298
+
299
+ return response;
300
+ } catch (error) {
301
+ this.emit('failure', error);
302
+ throw error;
303
+ }
304
+ }
305
+
306
+ /**
307
+ * Create text embeddings for semantic search or similarity comparisons.
308
+ *
309
+ * @param input - A string or array of strings to embed
310
+ * @param options - Additional parameters (model, etc.)
311
+ * @returns The embedding response with vectors
312
+ *
313
+ * @example
314
+ * ```typescript
315
+ * const response = await openai.createEmbedding('Hello world')
316
+ * console.log(response.data[0].embedding.length)
317
+ * ```
318
+ */
319
+ async createEmbedding(
320
+ input: string | string[],
321
+ options: Partial<OpenAI.Embeddings.EmbeddingCreateParams> = {}
322
+ ): Promise<OpenAI.Embeddings.CreateEmbeddingResponse> {
323
+ this.trackRequest();
324
+
325
+ try {
326
+ const response = await this.openai.embeddings.create({
327
+ model: options.model || 'text-embedding-ada-002',
328
+ input,
329
+ ...options
330
+ });
331
+
332
+ this.updateTokenUsage(response.usage);
333
+ this.emit('embedding', response);
334
+
335
+ return response;
336
+ } catch (error) {
337
+ this.emit('failure', error);
338
+ throw error;
339
+ }
340
+ }
341
+
342
+ /**
343
+ * Generate an image from a text prompt using DALL-E.
344
+ *
345
+ * @param prompt - Description of the image to generate
346
+ * @param options - Additional parameters (size, n, etc.)
347
+ * @returns The image response with URLs or base64 data
348
+ *
349
+ * @example
350
+ * ```typescript
351
+ * const response = await openai.createImage('A sunset over mountains')
352
+ * console.log(response.data[0].url)
353
+ * ```
354
+ */
355
+ async createImage(
356
+ prompt: string,
357
+ options: Partial<OpenAI.Images.ImageGenerateParams> = {}
358
+ ): Promise<OpenAI.Images.ImagesResponse> {
359
+ this.trackRequest();
360
+
361
+ try {
362
+ const response = await this.openai.images.generate({
363
+ prompt,
364
+ n: 1,
365
+ size: '1024x1024',
366
+ ...options
367
+ });
368
+
369
+ this.emit('image', response);
370
+
371
+ return response;
372
+ } catch (error) {
373
+ this.emit('failure', error);
374
+ throw error;
375
+ }
376
+ }
377
+
378
+ /**
379
+ * List all available models.
380
+ *
381
+ * @returns Paginated list of available models
382
+ *
383
+ * @example
384
+ * ```typescript
385
+ * const models = await openai.listModels()
386
+ * ```
387
+ */
388
+ async listModels(): Promise<OpenAI.Models.ModelsPage> {
389
+ try {
390
+ const response = await this.openai.models.list();
391
+ this.emit('models', response);
392
+ return response;
393
+ } catch (error) {
394
+ this.emit('failure', error);
395
+ throw error;
396
+ }
397
+ }
398
+
399
+ /**
400
+ * Ask a single question and get a text response.
401
+ *
402
+ * Convenience wrapper around `createChatCompletion` for simple Q&A.
403
+ *
404
+ * @param question - The question to ask
405
+ * @param options - Additional completion parameters
406
+ * @returns The assistant's text response
407
+ *
408
+ * @example
409
+ * ```typescript
410
+ * const answer = await openai.ask('What is 2 + 2?')
411
+ * console.log(answer) // '4'
412
+ * ```
413
+ */
414
+ async ask(
415
+ question: string,
416
+ options: Partial<OpenAI.Chat.Completions.ChatCompletionCreateParams> = {}
417
+ ): Promise<string> {
418
+ const response = await this.createChatCompletion([
419
+ { role: 'user', content: question }
420
+ ], options);
421
+
422
+ return response.choices[0]?.message?.content || '';
423
+ }
424
+
425
+ /**
426
+ * Send a multi-turn conversation and get a text response.
427
+ *
428
+ * Convenience wrapper around `createChatCompletion` that returns just the text.
429
+ *
430
+ * @param messages - Array of chat messages
431
+ * @param options - Additional completion parameters
432
+ * @returns The assistant's text response
433
+ *
434
+ * @example
435
+ * ```typescript
436
+ * const reply = await openai.chat([
437
+ * { role: 'system', content: 'You are a pirate.' },
438
+ * { role: 'user', content: 'Hello!' }
439
+ * ])
440
+ * ```
441
+ */
442
+ async chat(
443
+ messages: OpenAI.Chat.Completions.ChatCompletionMessageParam[],
444
+ options: Partial<OpenAI.Chat.Completions.ChatCompletionCreateParams> = {}
445
+ ): Promise<string> {
446
+ const response = await this.createChatCompletion(messages, options);
447
+ return response.choices[0]?.message?.content || '';
448
+ }
449
+
450
+ /** The underlying OpenAI SDK instance for advanced use cases. */
451
+ get raw(): OpenAI {
452
+ return this.openai;
453
+ }
454
+ }
455
+
456
+ export default OpenAIClient;
@@ -0,0 +1,207 @@
1
+ import axios, { type AxiosError, type AxiosInstance, type AxiosRequestConfig } from "axios";
2
+ import { Client, type ClientOptions, type ClientState } from '../client.js'
3
+ import type { ContainerContext } from '../container.js'
4
+ import { ClientEventsSchema } from '../schemas/base.js'
5
+ import { z } from 'zod'
6
+
7
+ export const RestClientEventsSchema = ClientEventsSchema.extend({}).describe('REST client events')
8
+
9
+ declare module '../client' {
10
+ interface AvailableClients {
11
+ rest: typeof RestClient
12
+ }
13
+ }
14
+
15
+ /**
16
+ * HTTP REST client built on top of axios. Provides convenience methods for
17
+ * GET, POST, PUT, PATCH, and DELETE requests with automatic JSON handling,
18
+ * configurable base URL, and error event emission.
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * const api = container.client('rest', { baseURL: 'https://api.example.com', json: true })
23
+ * const users = await api.get('/users')
24
+ * await api.post('/users', { name: 'Alice' })
25
+ * ```
26
+ */
27
+ export class RestClient<
28
+ T extends ClientState = ClientState,
29
+ K extends ClientOptions = ClientOptions
30
+ > extends Client<T, K> {
31
+ axios!: AxiosInstance;
32
+
33
+ static override shortcut: string = "clients.rest"
34
+ static override eventsSchema = RestClientEventsSchema
35
+ static { Client.register(this, 'rest') }
36
+
37
+ constructor(options: K, context: ContainerContext) {
38
+ super(options, context);
39
+
40
+ this.axios = axios.create({
41
+ baseURL: this.baseURL,
42
+ });
43
+
44
+ if (this.useJSON) {
45
+ this.axios.defaults.headers.common = {
46
+ ...this.axios.defaults.headers.common,
47
+ "Content-Type": "application/json",
48
+ Accept: "application/json",
49
+ }
50
+ }
51
+ }
52
+
53
+ async beforeRequest(): Promise<void> {
54
+ }
55
+
56
+ /** Whether JSON content-type headers should be set automatically. */
57
+ get useJSON() {
58
+ return !!this.options.json
59
+ }
60
+
61
+ override get baseURL() {
62
+ return this.options.baseURL || '/'
63
+ }
64
+
65
+ /**
66
+ * Send a PATCH request. Returns the parsed response body directly (not an
67
+ * axios Response wrapper). On HTTP errors, returns the error as JSON instead
68
+ * of throwing.
69
+ * @param url - Request path relative to baseURL
70
+ * @param data - Request body
71
+ * @param options - Additional axios request config
72
+ * @returns Parsed response body
73
+ */
74
+ async patch(url: string, data: any = {}, options: AxiosRequestConfig = {}): Promise<any> {
75
+ await this.beforeRequest();
76
+ return this.axios({
77
+ ...options,
78
+ method: "PATCH",
79
+ url,
80
+ data,
81
+ })
82
+ .then((r) => r.data)
83
+ .catch((e: any) => {
84
+ if (e.isAxiosError) {
85
+ return this.handleError(e);
86
+ } else {
87
+ throw e;
88
+ }
89
+ });
90
+ }
91
+
92
+ /**
93
+ * Send a PUT request. Returns the parsed response body directly (not an
94
+ * axios Response wrapper). On HTTP errors, returns the error as JSON instead
95
+ * of throwing.
96
+ * @param url - Request path relative to baseURL
97
+ * @param data - Request body
98
+ * @param options - Additional axios request config
99
+ * @returns Parsed response body
100
+ */
101
+ async put(url: string, data: any = {}, options: AxiosRequestConfig = {}): Promise<any> {
102
+ await this.beforeRequest();
103
+ return this.axios({
104
+ ...options,
105
+ method: "PUT",
106
+ url,
107
+ data,
108
+ })
109
+ .then((r) => r.data)
110
+ .catch((e: any) => {
111
+ if (e.isAxiosError) {
112
+ return this.handleError(e);
113
+ } else {
114
+ throw e;
115
+ }
116
+ });
117
+ }
118
+
119
+ /**
120
+ * Send a POST request. Returns the parsed response body directly (not an
121
+ * axios Response wrapper). On HTTP errors, returns the error as JSON instead
122
+ * of throwing.
123
+ * @param url - Request path relative to baseURL
124
+ * @param data - Request body
125
+ * @param options - Additional axios request config
126
+ * @returns Parsed response body
127
+ */
128
+ async post(url: string, data: any = {}, options: AxiosRequestConfig = {}): Promise<any> {
129
+ await this.beforeRequest();
130
+ return this.axios({
131
+ ...options,
132
+ method: "POST",
133
+ url,
134
+ data,
135
+ })
136
+ .then((r) => r.data)
137
+ .catch((e: any) => {
138
+ if (e.isAxiosError) {
139
+ return this.handleError(e);
140
+ } else {
141
+ throw e;
142
+ }
143
+ });
144
+ }
145
+
146
+ /**
147
+ * Send a DELETE request. Returns the parsed response body directly (not an
148
+ * axios Response wrapper). On HTTP errors, returns the error as JSON instead
149
+ * of throwing.
150
+ * @param url - Request path relative to baseURL
151
+ * @param params - Query parameters
152
+ * @param options - Additional axios request config
153
+ * @returns Parsed response body
154
+ */
155
+ async delete(url: string, params: any = {}, options: AxiosRequestConfig = {}): Promise<any> {
156
+ await this.beforeRequest();
157
+ return this.axios({
158
+ ...options,
159
+ method: "DELETE",
160
+ url,
161
+ params,
162
+ })
163
+ .then((r) => r.data)
164
+ .catch((e: any) => {
165
+ if (e.isAxiosError) {
166
+ return this.handleError(e);
167
+ } else {
168
+ throw e;
169
+ }
170
+ });
171
+ }
172
+
173
+ /**
174
+ * Send a GET request. Returns the parsed response body directly (not an
175
+ * axios Response wrapper). On HTTP errors, returns the error as JSON instead
176
+ * of throwing.
177
+ * @param url - Request path relative to baseURL
178
+ * @param params - Query parameters
179
+ * @param options - Additional axios request config
180
+ * @returns Parsed response body
181
+ */
182
+ async get(url: string, params: any = {}, options: AxiosRequestConfig = {}): Promise<any> {
183
+ await this.beforeRequest()
184
+ return this.axios({
185
+ ...options,
186
+ method: "GET",
187
+ url,
188
+ params,
189
+ })
190
+ .then((r) => r.data)
191
+ .catch((e: any) => {
192
+ if (e.isAxiosError) {
193
+ return this.handleError(e);
194
+ } else {
195
+ throw e;
196
+ }
197
+ });
198
+ }
199
+
200
+ /** Handle an axios error by emitting 'failure' and returning the error as JSON. */
201
+ async handleError(error: AxiosError): Promise<object> {
202
+ this.emit('failure', error)
203
+ return error.toJSON();
204
+ }
205
+ }
206
+
207
+ export default RestClient