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,604 @@
1
+ import {
2
+ Client,
3
+ } from "@soederpop/luca/client";
4
+ import { RestClient } from "../rest";
5
+ import type { ContainerContext } from "@soederpop/luca/container";
6
+ import { z } from 'zod'
7
+ import { ClientStateSchema, ClientOptionsSchema, ClientEventsSchema } from '@soederpop/luca/schemas/base.js'
8
+
9
+ declare module "@soederpop/luca/client" {
10
+ interface AvailableClients {
11
+ comfyui: typeof ComfyUIClient;
12
+ }
13
+ }
14
+
15
+ export const ComfyUIClientStateSchema = ClientStateSchema.extend({
16
+ clientId: z.string().default('').describe('Unique client ID used for WebSocket session tracking'),
17
+ queueRemaining: z.number().default(0).describe('Number of prompts remaining in the queue'),
18
+ executing: z.string().nullable().default(null).describe('Prompt ID currently being executed, or null'),
19
+ })
20
+
21
+ export const ComfyUIClientOptionsSchema = ClientOptionsSchema.extend({
22
+ wsURL: z.string().optional().describe('Override the WebSocket URL (defaults to ws version of baseURL)'),
23
+ })
24
+
25
+ export type ComfyUIClientState = z.infer<typeof ComfyUIClientStateSchema>
26
+ export type ComfyUIClientOptions = z.infer<typeof ComfyUIClientOptionsSchema>
27
+
28
+ export const ComfyUIClientEventsSchema = ClientEventsSchema.extend({
29
+ execution_start: z.tuple([z.object({ promptId: z.string().describe('The prompt ID that started executing') })]).describe('Emitted when prompt execution begins'),
30
+ executing: z.tuple([z.object({ node: z.string().describe('The node ID currently executing'), promptId: z.string().describe('The prompt ID') })]).describe('Emitted when a specific node begins executing'),
31
+ progress: z.tuple([z.object({ node: z.string().describe('The node ID'), value: z.number().describe('Current progress value'), max: z.number().describe('Maximum progress value'), promptId: z.string().describe('The prompt ID') })]).describe('Emitted during node execution with progress updates'),
32
+ executed: z.tuple([z.object({ node: z.string().describe('The node ID that finished'), output: z.any().describe('The node output data'), promptId: z.string().describe('The prompt ID') })]).describe('Emitted when a node finishes execution'),
33
+ execution_cached: z.tuple([z.object({ nodes: z.array(z.string()).describe('Array of cached node IDs'), promptId: z.string().describe('The prompt ID') })]).describe('Emitted when nodes are served from cache'),
34
+ execution_error: z.tuple([z.object({ promptId: z.string().describe('The prompt ID'), exception_message: z.string().optional().describe('Error message') }).passthrough()]).describe('Emitted when prompt execution fails'),
35
+ execution_complete: z.tuple([z.object({ promptId: z.string().describe('The prompt ID that completed') })]).describe('Emitted when prompt execution finishes successfully'),
36
+ }).describe('ComfyUI client events')
37
+
38
+ /** Maps a semantic input name to a specific node ID and field */
39
+ export type InputMapping = Record<string, { nodeId: string; field: string }>;
40
+
41
+ export type WorkflowRunOptions = {
42
+ /** Use polling instead of WebSocket for tracking execution */
43
+ poll?: boolean;
44
+ /** Polling interval in ms (default 1000) */
45
+ pollInterval?: number;
46
+ /** Named input mapping: semantic name -> { nodeId, field } */
47
+ inputMap?: InputMapping;
48
+ /** If provided, output images are downloaded to this directory */
49
+ outputDir?: string;
50
+ };
51
+
52
+ export type WorkflowResult = {
53
+ promptId: string;
54
+ outputs: Record<string, any>;
55
+ images?: Array<{ filename: string; subfolder: string; type: string; localPath?: string }>;
56
+ };
57
+
58
+ /**
59
+ * ComfyUI client — execute Stable Diffusion workflows via the ComfyUI API.
60
+ *
61
+ * Connects to a ComfyUI instance to queue prompts, track execution via WebSocket or polling,
62
+ * and download generated images. Supports both UI-format and API-format workflows with
63
+ * automatic conversion.
64
+ *
65
+ * @example
66
+ * ```typescript
67
+ * const comfy = container.client('comfyui', { baseURL: 'http://localhost:8188' })
68
+ * const result = await comfy.runWorkflow(workflow, {
69
+ * '6': { text: 'a beautiful sunset' }
70
+ * })
71
+ * console.log(result.images)
72
+ * ```
73
+ */
74
+ export class ComfyUIClient extends RestClient<ComfyUIClientState, ComfyUIClientOptions> {
75
+ static override shortcut = "clients.comfyui" as const;
76
+ static override description = "ComfyUI workflow execution client";
77
+ static override stateSchema = ComfyUIClientStateSchema;
78
+ static override optionsSchema = ComfyUIClientOptionsSchema;
79
+ static override eventsSchema = ComfyUIClientEventsSchema;
80
+
81
+ static { Client.register(this, 'comfyui') }
82
+
83
+ private ws: WebSocket | null = null;
84
+
85
+ constructor(options: ComfyUIClientOptions, context: ContainerContext) {
86
+ super(
87
+ {
88
+ ...options,
89
+ baseURL: options.baseURL || "http://127.0.0.1:8000",
90
+ json: options.json ?? true,
91
+ } as ComfyUIClientOptions,
92
+ context
93
+ );
94
+ }
95
+
96
+ /** Initial state with a random client ID. */
97
+ override get initialState(): ComfyUIClientState {
98
+ return {
99
+ connected: false,
100
+ clientId: crypto.randomUUID(),
101
+ queueRemaining: 0,
102
+ executing: null,
103
+ } as ComfyUIClientState;
104
+ }
105
+
106
+ /** The unique client ID used for WebSocket session tracking. */
107
+ get clientId(): string {
108
+ return this.state.get("clientId")!;
109
+ }
110
+
111
+ /** The WebSocket URL derived from baseURL or overridden via options. */
112
+ get wsURL(): string {
113
+ if (this.options.wsURL) return this.options.wsURL;
114
+ return this.baseURL.replace(/^http/, "ws") + "/ws";
115
+ }
116
+
117
+ // ---------------------------------------------------------------------------
118
+ // Core API methods
119
+ // ---------------------------------------------------------------------------
120
+
121
+ /**
122
+ * Queue a prompt (API-format workflow) for execution.
123
+ *
124
+ * @param prompt - The API-format workflow object
125
+ * @param clientId - Override the client ID for this request
126
+ * @returns The prompt ID and queue number
127
+ *
128
+ * @example
129
+ * ```typescript
130
+ * const { prompt_id } = await comfy.queuePrompt(apiWorkflow)
131
+ * ```
132
+ */
133
+ async queuePrompt(prompt: Record<string, any>, clientId?: string): Promise<{ prompt_id: string; number: number }> {
134
+ return this.post("/prompt", {
135
+ prompt,
136
+ client_id: clientId ?? this.clientId,
137
+ });
138
+ }
139
+
140
+ /**
141
+ * Get the current prompt queue status.
142
+ *
143
+ * @returns Running and pending queue items
144
+ */
145
+ async getQueue(): Promise<{ queue_running: any[]; queue_pending: any[] }> {
146
+ return this.get("/queue");
147
+ }
148
+
149
+ /**
150
+ * Get execution history, optionally for a specific prompt.
151
+ *
152
+ * @param promptId - If provided, returns history for this prompt only
153
+ * @returns History records keyed by prompt ID
154
+ */
155
+ async getHistory(promptId?: string): Promise<Record<string, any>> {
156
+ return this.get(promptId ? `/history/${promptId}` : "/history");
157
+ }
158
+
159
+ /**
160
+ * Get system stats including GPU memory and queue info.
161
+ *
162
+ * @returns System statistics
163
+ */
164
+ async getSystemStats(): Promise<any> {
165
+ return this.get("/system_stats");
166
+ }
167
+
168
+ /**
169
+ * Get node type info with input/output schemas.
170
+ *
171
+ * @param nodeClass - If provided, returns info for this node type only
172
+ * @returns Object info keyed by node class name
173
+ */
174
+ async getObjectInfo(nodeClass?: string): Promise<any> {
175
+ return this.get(nodeClass ? `/object_info/${nodeClass}` : "/object_info");
176
+ }
177
+
178
+ /** Interrupt the currently executing prompt. */
179
+ async interrupt(): Promise<void> {
180
+ await this.post("/interrupt", {});
181
+ }
182
+
183
+ /**
184
+ * List available models, optionally filtered by type.
185
+ *
186
+ * @param type - Model type filter (e.g., 'checkpoints', 'loras')
187
+ * @returns Array of model file names
188
+ */
189
+ async getModels(type?: string): Promise<string[]> {
190
+ return this.get(type ? `/models/${type}` : "/models");
191
+ }
192
+
193
+ /** List available embedding models. */
194
+ async getEmbeddings(): Promise<string[]> {
195
+ return this.get("/embeddings");
196
+ }
197
+
198
+ /**
199
+ * Upload an image to ComfyUI's input directory.
200
+ *
201
+ * @param file - The image data as Buffer or Blob
202
+ * @param filename - File name for the upload
203
+ * @param opts - Upload options (subfolder, type, overwrite)
204
+ * @returns Upload result from ComfyUI
205
+ */
206
+ async uploadImage(
207
+ file: Buffer | Blob,
208
+ filename: string,
209
+ opts: { subfolder?: string; type?: string; overwrite?: boolean } = {}
210
+ ): Promise<any> {
211
+ const formData = new FormData();
212
+ const blob = file instanceof Blob ? file : new Blob([file as BlobPart]);
213
+ formData.append("image", blob, filename);
214
+ if (opts.subfolder) formData.append("subfolder", opts.subfolder);
215
+ if (opts.type) formData.append("type", opts.type);
216
+ if (opts.overwrite) formData.append("overwrite", "true");
217
+
218
+ return this.axios
219
+ .post("/upload/image", formData, {
220
+ headers: { "Content-Type": "multipart/form-data" },
221
+ })
222
+ .then((r) => r.data);
223
+ }
224
+
225
+ /**
226
+ * Download a generated image from ComfyUI as a Buffer.
227
+ *
228
+ * @param filename - The image filename
229
+ * @param subfolder - Subfolder within the output directory
230
+ * @param type - Image type ('output', 'input', 'temp')
231
+ * @returns The image data as a Buffer
232
+ */
233
+ async viewImage(
234
+ filename: string,
235
+ subfolder = "",
236
+ type = "output"
237
+ ): Promise<Buffer> {
238
+ const resp = await this.axios.get("/view", {
239
+ params: { filename, subfolder, type },
240
+ responseType: "arraybuffer",
241
+ });
242
+ return Buffer.from(resp.data);
243
+ }
244
+
245
+ // ---------------------------------------------------------------------------
246
+ // WebSocket connection
247
+ // ---------------------------------------------------------------------------
248
+
249
+ /**
250
+ * Open a WebSocket connection to ComfyUI for real-time execution tracking.
251
+ *
252
+ * Events emitted: `execution_start`, `executing`, `progress`, `executed`,
253
+ * `execution_cached`, `execution_error`, `execution_complete`.
254
+ */
255
+ async connectWs(): Promise<void> {
256
+ if (this.ws) return;
257
+
258
+ const url = `${this.wsURL}?clientId=${this.clientId}`;
259
+
260
+ return new Promise<void>((resolve, reject) => {
261
+ const ws = new WebSocket(url);
262
+
263
+ ws.addEventListener("open", () => {
264
+ this.ws = ws;
265
+ this.state.set("connected", true);
266
+ resolve();
267
+ });
268
+
269
+ ws.addEventListener("error", (e) => {
270
+ reject(e);
271
+ });
272
+
273
+ ws.addEventListener("close", () => {
274
+ this.ws = null;
275
+ this.state.set("connected", false);
276
+ });
277
+
278
+ ws.addEventListener("message", (event) => {
279
+ try {
280
+ const msg = JSON.parse(typeof event.data === "string" ? event.data : event.data.toString());
281
+ this.handleWsMessage(msg);
282
+ } catch {
283
+ // binary data (e.g. preview images), ignore
284
+ }
285
+ });
286
+ });
287
+ }
288
+
289
+ /** Close the WebSocket connection. */
290
+ disconnectWs(): void {
291
+ if (this.ws) {
292
+ this.ws.close();
293
+ this.ws = null;
294
+ this.state.set("connected", false);
295
+ }
296
+ }
297
+
298
+ private handleWsMessage(msg: { type: string; data: any }) {
299
+ switch (msg.type) {
300
+ case "status":
301
+ if (msg.data?.status?.exec_info) {
302
+ this.state.set("queueRemaining", msg.data.status.exec_info.queue_remaining);
303
+ }
304
+ break;
305
+ case "execution_start":
306
+ this.state.set("executing", msg.data.prompt_id);
307
+ this.emit("execution_start", { promptId: msg.data.prompt_id });
308
+ break;
309
+ case "executing":
310
+ if (msg.data.node === null) {
311
+ this.state.set("executing", null);
312
+ this.emit("execution_complete", { promptId: msg.data.prompt_id });
313
+ } else {
314
+ this.emit("executing", { node: msg.data.node, promptId: msg.data.prompt_id });
315
+ }
316
+ break;
317
+ case "progress":
318
+ this.emit("progress", {
319
+ node: msg.data.node,
320
+ value: msg.data.value,
321
+ max: msg.data.max,
322
+ promptId: msg.data.prompt_id,
323
+ });
324
+ break;
325
+ case "executed":
326
+ this.emit("executed", {
327
+ node: msg.data.node,
328
+ output: msg.data.output,
329
+ promptId: msg.data.prompt_id,
330
+ });
331
+ break;
332
+ case "execution_cached":
333
+ this.emit("execution_cached", {
334
+ nodes: msg.data.nodes,
335
+ promptId: msg.data.prompt_id,
336
+ });
337
+ break;
338
+ case "execution_error":
339
+ this.emit("execution_error", {
340
+ promptId: msg.data.prompt_id,
341
+ ...msg.data,
342
+ });
343
+ break;
344
+ }
345
+ }
346
+
347
+ // ---------------------------------------------------------------------------
348
+ // Workflow format detection & conversion
349
+ // ---------------------------------------------------------------------------
350
+
351
+ /**
352
+ * Detect whether a workflow object is in UI format (exported from the graph
353
+ * editor) or API format (flat node-id-keyed object with class_type).
354
+ */
355
+ static isUIFormat(workflow: Record<string, any>): boolean {
356
+ return Array.isArray(workflow.nodes) && Array.isArray(workflow.links);
357
+ }
358
+
359
+ /**
360
+ * Convert a UI-format workflow to the API format that /prompt expects.
361
+ *
362
+ * Requires a running ComfyUI instance to fetch `object_info` so we can
363
+ * map positional `widgets_values` to their named input fields.
364
+ *
365
+ * If the workflow is already in API format, it's returned as-is.
366
+ */
367
+ async toApiFormat(workflow: Record<string, any>): Promise<Record<string, any>> {
368
+ if (!ComfyUIClient.isUIFormat(workflow)) return workflow;
369
+
370
+ const nodes: any[] = workflow.nodes;
371
+ const links: any[] = workflow.links;
372
+
373
+ // Build a lookup: linkId -> { sourceNodeId, sourceSlot }
374
+ const linkMap = new Map<number, { sourceNodeId: string; sourceSlot: number }>();
375
+ for (const link of links) {
376
+ // link format: [linkId, sourceNodeId, sourceSlot, targetNodeId, targetSlot, type]
377
+ linkMap.set(link[0], { sourceNodeId: String(link[1]), sourceSlot: link[2] });
378
+ }
379
+
380
+ // Fetch object_info for all node types present in the workflow
381
+ const nodeTypes = [...new Set(nodes.map((n) => n.type))];
382
+ const objectInfo: Record<string, any> = {};
383
+ await Promise.all(
384
+ nodeTypes.map(async (type) => {
385
+ try {
386
+ const info = await this.getObjectInfo(type);
387
+ objectInfo[type] = info[type];
388
+ } catch {
389
+ // Node type not found on server — we'll do our best without it
390
+ }
391
+ })
392
+ );
393
+
394
+ const apiWorkflow: Record<string, any> = {};
395
+
396
+ for (const node of nodes) {
397
+ const nodeId = String(node.id);
398
+ const classType = node.type;
399
+ const inputs: Record<string, any> = {};
400
+
401
+ // Resolve connected inputs (from the node's input slots)
402
+ if (node.inputs) {
403
+ for (const input of node.inputs) {
404
+ if (input.link != null) {
405
+ const source = linkMap.get(input.link);
406
+ if (source) {
407
+ inputs[input.name] = [source.sourceNodeId, source.sourceSlot];
408
+ }
409
+ }
410
+ }
411
+ }
412
+
413
+ // Map widgets_values to named inputs using object_info
414
+ if (node.widgets_values && objectInfo[classType]) {
415
+ const info = objectInfo[classType];
416
+ const requiredInputs = info.input?.required ?? {};
417
+ const optionalInputs = info.input?.optional ?? {};
418
+
419
+ // Collect the widget input names in order (skip ones that are link-connected)
420
+ const connectedNames = new Set(
421
+ (node.inputs || []).filter((i: any) => i.link != null).map((i: any) => i.name)
422
+ );
423
+
424
+ const widgetNames: string[] = [];
425
+ for (const [name, config] of Object.entries(requiredInputs) as [string, any][]) {
426
+ if (connectedNames.has(name)) continue;
427
+ // Skip non-widget types (these are slot connections, not widgets)
428
+ const inputType = Array.isArray(config) ? config[0] : config;
429
+ if (typeof inputType === "string" && inputType === inputType.toUpperCase() && inputType.length > 1 && !Array.isArray(config[0])) continue;
430
+ widgetNames.push(name);
431
+ }
432
+ for (const [name, config] of Object.entries(optionalInputs) as [string, any][]) {
433
+ if (connectedNames.has(name)) continue;
434
+ const inputType = Array.isArray(config) ? config[0] : config;
435
+ if (typeof inputType === "string" && inputType === inputType.toUpperCase() && inputType.length > 1 && !Array.isArray(config[0])) continue;
436
+ widgetNames.push(name);
437
+ }
438
+
439
+ // Assign values positionally
440
+ for (let i = 0; i < node.widgets_values.length && i < widgetNames.length; i++) {
441
+ inputs[widgetNames[i]!] = node.widgets_values[i];
442
+ }
443
+ }
444
+
445
+ apiWorkflow[nodeId] = { class_type: classType, inputs };
446
+ }
447
+
448
+ return apiWorkflow;
449
+ }
450
+
451
+ // ---------------------------------------------------------------------------
452
+ // High-level workflow execution
453
+ // ---------------------------------------------------------------------------
454
+
455
+ /**
456
+ * Run a ComfyUI workflow with optional runtime input overrides.
457
+ *
458
+ * Inputs can be provided in two forms:
459
+ *
460
+ * **Direct node mapping** (when no `inputMap` in options):
461
+ * ```
462
+ * { '3': { seed: 42 }, '6': { text: 'a cat' } }
463
+ * ```
464
+ *
465
+ * **Named inputs** (when `inputMap` is provided in options):
466
+ * ```
467
+ * inputs: { positive_prompt: 'a cat', seed: 42 }
468
+ * options.inputMap: {
469
+ * positive_prompt: { nodeId: '6', field: 'text' },
470
+ * seed: { nodeId: '3', field: 'seed' }
471
+ * }
472
+ * ```
473
+ */
474
+ async runWorkflow(
475
+ workflow: Record<string, any>,
476
+ inputs?: Record<string, any>,
477
+ options: WorkflowRunOptions = {}
478
+ ): Promise<WorkflowResult> {
479
+ // Auto-detect and convert UI format -> API format
480
+ const apiFormat = await this.toApiFormat(workflow);
481
+ const prompt = structuredClone(apiFormat);
482
+
483
+ // Apply inputs
484
+ if (inputs) {
485
+ if (options.inputMap) {
486
+ // Named input mode: resolve through the mapping
487
+ for (const [name, value] of Object.entries(inputs)) {
488
+ const mapping = options.inputMap[name];
489
+ if (!mapping) {
490
+ throw new Error(`No inputMap entry for "${name}". Available: ${Object.keys(options.inputMap).join(", ")}`);
491
+ }
492
+ if (!prompt[mapping.nodeId]) {
493
+ throw new Error(`Node "${mapping.nodeId}" not found in workflow (mapped from "${name}")`);
494
+ }
495
+ prompt[mapping.nodeId].inputs[mapping.field] = value;
496
+ }
497
+ } else {
498
+ // Direct node ID mapping
499
+ for (const [nodeId, fields] of Object.entries(inputs)) {
500
+ if (!prompt[nodeId]) {
501
+ throw new Error(`Node "${nodeId}" not found in workflow`);
502
+ }
503
+ if (typeof fields === "object" && fields !== null) {
504
+ Object.assign(prompt[nodeId].inputs, fields);
505
+ }
506
+ }
507
+ }
508
+ }
509
+
510
+ // Queue the prompt
511
+ const { prompt_id: promptId } = await this.queuePrompt(prompt);
512
+
513
+ // Track execution
514
+ let outputs: Record<string, any>;
515
+
516
+ if (options.poll) {
517
+ outputs = await this.pollForCompletion(promptId, options.pollInterval ?? 1000);
518
+ } else {
519
+ outputs = await this.waitForCompletionWs(promptId);
520
+ }
521
+
522
+ // Collect image outputs
523
+ const images: WorkflowResult["images"] = [];
524
+ for (const nodeOutputs of Object.values(outputs)) {
525
+ if (nodeOutputs.images) {
526
+ for (const img of nodeOutputs.images) {
527
+ images.push({
528
+ filename: img.filename,
529
+ subfolder: img.subfolder || "",
530
+ type: img.type || "output",
531
+ });
532
+ }
533
+ }
534
+ }
535
+
536
+ // Optionally download images to disk
537
+ if (options.outputDir && images.length) {
538
+ const { mkdir } = await import("fs/promises");
539
+ const { join } = await import("path");
540
+ await mkdir(options.outputDir, { recursive: true });
541
+
542
+ for (const img of images) {
543
+ const buf = await this.viewImage(img.filename, img.subfolder, img.type);
544
+ const localPath = join(options.outputDir, img.filename);
545
+ await Bun.write(localPath, buf);
546
+ img.localPath = localPath;
547
+ }
548
+ }
549
+
550
+ return { promptId, outputs, images };
551
+ }
552
+
553
+ private async waitForCompletionWs(promptId: string): Promise<Record<string, any>> {
554
+ const needsConnect = !this.ws;
555
+ if (needsConnect) await this.connectWs();
556
+
557
+ return new Promise<Record<string, any>>((resolve, reject) => {
558
+ const onComplete = (data: any) => {
559
+ if (data.promptId === promptId) {
560
+ cleanup();
561
+ this.getHistory(promptId).then((history) => {
562
+ const entry = history[promptId];
563
+ resolve(entry?.outputs ?? {});
564
+ });
565
+ }
566
+ };
567
+
568
+ const onError = (data: any) => {
569
+ if (data.promptId === promptId) {
570
+ cleanup();
571
+ reject(new Error(data.exception_message || "Execution error"));
572
+ }
573
+ };
574
+
575
+ const cleanup = () => {
576
+ this.off("execution_complete", onComplete);
577
+ this.off("execution_error", onError);
578
+ if (needsConnect) this.disconnectWs();
579
+ };
580
+
581
+ this.on("execution_complete", onComplete);
582
+ this.on("execution_error", onError);
583
+ });
584
+ }
585
+
586
+ private async pollForCompletion(promptId: string, interval: number): Promise<Record<string, any>> {
587
+ while (true) {
588
+ const history = await this.getHistory(promptId);
589
+ const entry = history[promptId];
590
+
591
+ if (entry?.status?.completed || entry?.outputs) {
592
+ return entry.outputs ?? {};
593
+ }
594
+
595
+ if (entry?.status?.status_str === "error") {
596
+ throw new Error("Workflow execution failed");
597
+ }
598
+
599
+ await new Promise((r) => setTimeout(r, interval));
600
+ }
601
+ }
602
+ }
603
+
604
+ export default ComfyUIClient;