luca 2.0.0 → 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 (763) 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 -9
  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 -12
  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 -58
  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/cli.js +0 -48
  734. package/dist/cli/common.d.ts +0 -2
  735. package/dist/cli/common.js +0 -6
  736. package/dist/cli/index.d.ts +0 -2
  737. package/dist/cli/index.js +0 -5
  738. package/dist/cli/run.d.ts +0 -1
  739. package/dist/cli/run.js +0 -38
  740. package/dist/core/index.d.ts +0 -4
  741. package/dist/core/index.js +0 -32
  742. package/dist/core/read.d.ts +0 -2
  743. package/dist/core/read.js +0 -29
  744. package/dist/core/request.d.ts +0 -1
  745. package/dist/core/request.js +0 -2
  746. package/dist/core/write.d.ts +0 -2
  747. package/dist/core/write.js +0 -21
  748. package/dist/index.d.ts +0 -1
  749. package/dist/index.js +0 -5
  750. package/dist/utils/common.d.ts +0 -9
  751. package/dist/utils/common.js +0 -57
  752. package/dist/utils/consts.d.ts +0 -3
  753. package/dist/utils/consts.js +0 -11
  754. package/dist/utils/dict.d.ts +0 -1
  755. package/dist/utils/dict.js +0 -7
  756. package/dist/utils/index.d.ts +0 -5
  757. package/dist/utils/index.js +0 -21
  758. package/dist/utils/log.d.ts +0 -1
  759. package/dist/utils/log.js +0 -5
  760. package/dist/utils/types.d.ts +0 -1
  761. package/dist/utils/types.js +0 -2
  762. package/dist/utils/utils.test.d.ts +0 -1
  763. package/dist/utils/utils.test.js +0 -7
@@ -0,0 +1,651 @@
1
+ // @ts-nocheck
2
+ import { z } from 'zod'
3
+ import { FeatureStateSchema, FeatureOptionsSchema, FeatureEventsSchema } from '../../schemas/base.js'
4
+ import { type AvailableFeatures } from '@soederpop/luca/feature'
5
+ import { Feature } from '../feature.js'
6
+
7
+ declare module '@soederpop/luca/feature' {
8
+ interface AvailableFeatures {
9
+ openaiCodex: typeof OpenAICodex
10
+ }
11
+ }
12
+
13
+ // --- Stream JSON types from the Codex CLI (codex exec --json) ---
14
+
15
+ export interface CodexItem {
16
+ id: string
17
+ type: 'agent_message' | 'reasoning' | 'command_execution' | string
18
+ text?: string
19
+ command?: string
20
+ aggregated_output?: string
21
+ exit_code?: number | null
22
+ status?: 'in_progress' | 'completed' | string
23
+ }
24
+
25
+ export interface CodexItemEvent {
26
+ type: 'item.completed' | 'item.started'
27
+ item: CodexItem
28
+ }
29
+
30
+ export interface CodexTurnEvent {
31
+ type: 'turn.completed' | 'turn.started'
32
+ usage?: { input_tokens?: number; cached_input_tokens?: number; output_tokens?: number }
33
+ }
34
+
35
+ export interface CodexThreadEvent {
36
+ type: 'thread.started'
37
+ thread_id: string
38
+ }
39
+
40
+ /** Normalized message emitted via session:message for downstream consumers. */
41
+ export interface CodexMessageEvent {
42
+ type: 'message'
43
+ role: 'assistant' | 'system'
44
+ content: Array<{ type: 'text'; text: string } | { type: string; [key: string]: any }>
45
+ }
46
+
47
+ export interface CodexExecEvent {
48
+ type: 'exec'
49
+ command: string
50
+ cwd?: string
51
+ exit_code?: number | null
52
+ stdout?: string
53
+ stderr?: string
54
+ }
55
+
56
+ export type CodexEvent =
57
+ | CodexItemEvent
58
+ | CodexTurnEvent
59
+ | CodexThreadEvent
60
+ | { type: string; [key: string]: any }
61
+
62
+ // --- Session types ---
63
+
64
+ export interface CodexSession {
65
+ id: string
66
+ status: 'idle' | 'running' | 'completed' | 'error'
67
+ prompt: string
68
+ result?: string
69
+ error?: string
70
+ turns: number
71
+ messages: CodexMessageEvent[]
72
+ executions: CodexExecEvent[]
73
+ items: CodexItem[]
74
+ process?: any
75
+ threadId?: string
76
+ usage?: { input_tokens?: number; output_tokens?: number }
77
+ }
78
+
79
+ // --- Feature state and options ---
80
+
81
+ export const OpenAICodexStateSchema = FeatureStateSchema.extend({
82
+ sessions: z.record(z.string(), z.any()).describe('Map of session IDs to CodexSession objects'),
83
+ activeSessions: z.array(z.string()).describe('List of currently running session IDs'),
84
+ codexAvailable: z.boolean().describe('Whether the codex CLI binary is available'),
85
+ codexVersion: z.string().optional().describe('Detected codex CLI version string'),
86
+ })
87
+
88
+ export const OpenAICodexOptionsSchema = FeatureOptionsSchema.extend({
89
+ codexPath: z.string().optional().describe('Path to the codex CLI binary'),
90
+ model: z.string().optional().describe('Default model to use for sessions'),
91
+ cwd: z.string().optional().describe('Default working directory for sessions'),
92
+ sandbox: z.enum(['read-only', 'workspace-write', 'danger-full-access']).optional().describe('Sandbox policy for shell commands'),
93
+ approvalMode: z.enum(['suggest', 'auto-edit', 'full-auto']).optional().describe('Approval mode for codex operations'),
94
+ projectDoc: z.string().optional().describe('Path to additional project doc to include'),
95
+ noProjectDoc: z.boolean().optional().describe('Disable automatic codex.md inclusion'),
96
+ fullStdout: z.boolean().optional().describe('Do not truncate stdout/stderr from command outputs'),
97
+ })
98
+
99
+ export const OpenAICodexEventsSchema = FeatureEventsSchema.extend({
100
+ 'session:start': z.tuple([z.object({ sessionId: z.string(), prompt: z.string() })]).describe('Fired when a new Codex session is spawned'),
101
+ 'session:event': z.tuple([z.object({ sessionId: z.string(), event: z.any() })]).describe('Fired for every parsed JSON event from the Codex CLI stream'),
102
+ 'session:delta': z.tuple([z.object({ sessionId: z.string(), text: z.string(), role: z.string() })]).describe('Fired for each text delta from an agent message'),
103
+ 'session:message': z.tuple([z.object({ sessionId: z.string(), message: z.any() })]).describe('Fired when a complete agent message is received'),
104
+ 'session:exec': z.tuple([z.object({ sessionId: z.string(), exec: z.any() })]).describe('Fired when a command execution item completes'),
105
+ 'session:exec-start': z.tuple([z.object({ sessionId: z.string(), command: z.string() })]).describe('Fired when a command execution item starts'),
106
+ 'session:reasoning': z.tuple([z.object({ sessionId: z.string(), text: z.string() })]).describe('Fired when a reasoning item is received'),
107
+ 'session:result': z.tuple([z.object({ sessionId: z.string(), result: z.string() })]).describe('Fired when a session completes with a final result'),
108
+ 'session:error': z.tuple([z.object({ sessionId: z.string(), error: z.any(), exitCode: z.number().optional() })]).describe('Fired when a session encounters an error'),
109
+ 'session:abort': z.tuple([z.object({ sessionId: z.string() })]).describe('Fired when a session is aborted by the user'),
110
+ 'session:parse-error': z.tuple([z.object({ sessionId: z.string(), line: z.string() })]).describe('Fired when a JSON line from the CLI cannot be parsed'),
111
+ }).describe('OpenAICodex events')
112
+
113
+ export type OpenAICodexState = z.infer<typeof OpenAICodexStateSchema>
114
+ export type OpenAICodexOptions = z.infer<typeof OpenAICodexOptionsSchema>
115
+
116
+ export interface CodexRunOptions {
117
+ model?: string
118
+ cwd?: string
119
+ sandbox?: 'read-only' | 'workspace-write' | 'danger-full-access'
120
+ approvalMode?: 'suggest' | 'auto-edit' | 'full-auto'
121
+ projectDoc?: string
122
+ noProjectDoc?: boolean
123
+ fullStdout?: boolean
124
+ images?: string[]
125
+ fullAuto?: boolean
126
+ /** Resume a previous session by ID. */
127
+ resumeSessionId?: string
128
+ /** Resume the most recent session. */
129
+ resumeLast?: boolean
130
+ /** Skip all approvals and sandboxing. */
131
+ dangerouslyAutoApproveEverything?: boolean
132
+ /** Additional CLI flags. */
133
+ extraArgs?: string[]
134
+ }
135
+
136
+ /**
137
+ * OpenAI Codex CLI wrapper feature. Spawns and manages Codex sessions
138
+ * as subprocesses, streaming structured JSON events back through the
139
+ * container's event system.
140
+ *
141
+ * Mirrors the ClaudeCode feature pattern: each call to `run()` spawns a
142
+ * `codex exec --json` process, parses NDJSON from stdout line-by-line,
143
+ * and emits typed events on the feature's event bus.
144
+ *
145
+ * @extends Feature
146
+ *
147
+ * @example
148
+ * ```typescript
149
+ * const codex = container.feature('openaiCodex')
150
+ *
151
+ * // Listen for events
152
+ * codex.on('session:message', ({ sessionId, message }) => console.log(message))
153
+ * codex.on('session:patch', ({ sessionId, patch }) => console.log('File changed:', patch.path))
154
+ *
155
+ * // Run a prompt
156
+ * const session = await codex.run('Fix the failing tests in src/')
157
+ * console.log(session.result)
158
+ * ```
159
+ */
160
+ export class OpenAICodex extends Feature<OpenAICodexState, OpenAICodexOptions> {
161
+ static override stateSchema = OpenAICodexStateSchema
162
+ static override optionsSchema = OpenAICodexOptionsSchema
163
+ static override eventsSchema = OpenAICodexEventsSchema
164
+ static override shortcut = 'features.openaiCodex' as const
165
+
166
+ static { Feature.register(this, 'openaiCodex') }
167
+
168
+ override get initialState(): OpenAICodexState {
169
+ return {
170
+ ...super.initialState,
171
+ sessions: {},
172
+ activeSessions: [],
173
+ codexAvailable: false
174
+ }
175
+ }
176
+
177
+ private _resolvedCodexPath: string | null = null
178
+
179
+ /** @returns The path to the codex CLI binary, falling back to 'codex' on the PATH. */
180
+ get codexPath(): string {
181
+ if (this.options.codexPath) return this.options.codexPath
182
+ if (this._resolvedCodexPath) return this._resolvedCodexPath
183
+ try {
184
+ this._resolvedCodexPath = this.container.feature('proc').resolveRealPath('codex')
185
+ } catch {
186
+ this._resolvedCodexPath = 'codex'
187
+ }
188
+ return this._resolvedCodexPath
189
+ }
190
+
191
+ /**
192
+ * Check if the Codex CLI is available and capture its version.
193
+ *
194
+ * @returns {Promise<boolean>} True if the codex binary was found and responded to --version
195
+ */
196
+ async checkAvailability(): Promise<boolean> {
197
+ try {
198
+ const proc = this.container.feature('proc')
199
+ const result = await proc.spawnAndCapture(this.codexPath, ['--version'])
200
+ const stdout = result.stdout
201
+ const exitCode = result.exitCode
202
+
203
+ if (exitCode === 0) {
204
+ const version = stdout.trim()
205
+ this.setState({ codexAvailable: true, codexVersion: version })
206
+ return true
207
+ }
208
+
209
+ this.setState({ codexAvailable: false })
210
+ return false
211
+ } catch {
212
+ this.setState({ codexAvailable: false })
213
+ return false
214
+ }
215
+ }
216
+
217
+ /**
218
+ * Build the argument array for a codex CLI invocation.
219
+ */
220
+ private buildArgs(options: CodexRunOptions = {}): string[] {
221
+ const args: string[] = ['exec', '--json']
222
+
223
+ const model = options.model ?? this.options.model
224
+ if (model) args.push('--model', model)
225
+
226
+ const sandbox = options.sandbox ?? this.options.sandbox
227
+ if (sandbox) args.push('--sandbox', sandbox)
228
+
229
+ if (options.fullAuto) {
230
+ args.push('--full-auto')
231
+ } else {
232
+ const approvalMode = options.approvalMode ?? this.options.approvalMode
233
+ if (approvalMode === 'auto-edit') args.push('--auto-edit')
234
+ else if (approvalMode === 'full-auto') args.push('--full-auto')
235
+ }
236
+
237
+ const noProjectDoc = options.noProjectDoc ?? this.options.noProjectDoc
238
+ if (noProjectDoc) args.push('--no-project-doc')
239
+
240
+ const projectDoc = options.projectDoc ?? this.options.projectDoc
241
+ if (projectDoc) args.push('--project-doc', projectDoc)
242
+
243
+ const fullStdout = options.fullStdout ?? this.options.fullStdout
244
+ if (fullStdout) args.push('--full-stdout')
245
+
246
+ if (options.images?.length) {
247
+ for (const img of options.images) {
248
+ args.push('--image', img)
249
+ }
250
+ }
251
+
252
+ if (options.resumeSessionId) {
253
+ args.push('resume', options.resumeSessionId)
254
+ } else if (options.resumeLast) {
255
+ args.push('resume', '--last')
256
+ }
257
+
258
+ if (options.dangerouslyAutoApproveEverything) {
259
+ args.push('--dangerously-auto-approve-everything')
260
+ }
261
+
262
+ if (options.extraArgs?.length) {
263
+ args.push(...options.extraArgs)
264
+ }
265
+
266
+ // Read the prompt from stdin to avoid prompt content being parsed as flags.
267
+ args.push('-')
268
+
269
+ return args
270
+ }
271
+
272
+ private createSessionId(): string {
273
+ return crypto.randomUUID()
274
+ }
275
+
276
+ private updateSession(id: string, update: Partial<CodexSession>): void {
277
+ const sessions = { ...this.state.current.sessions }
278
+ const existing = sessions[id]
279
+ if (existing) {
280
+ sessions[id] = { ...existing, ...update }
281
+ this.setState({ sessions })
282
+ }
283
+ }
284
+
285
+ /**
286
+ * Process a parsed JSON event from the Codex CLI stream.
287
+ *
288
+ * The codex CLI (codex exec --json) emits NDJSON with these event types:
289
+ * thread.started — { thread_id }
290
+ * turn.started — (no payload)
291
+ * item.started — { item: { id, type, ... } }
292
+ * item.completed — { item: { id, type, text?, command?, exit_code?, ... } }
293
+ * turn.completed — { usage: { input_tokens, output_tokens } }
294
+ *
295
+ * Item types within item.completed:
296
+ * agent_message — assistant text response
297
+ * reasoning — model thinking/reasoning
298
+ * command_execution — shell command with output
299
+ */
300
+ private handleEvent(sessionId: string, event: CodexEvent): void {
301
+ this.emit('session:event', { sessionId, event })
302
+
303
+ switch (event.type) {
304
+ case 'thread.started': {
305
+ const threadEvent = event as CodexThreadEvent
306
+ this.updateSession(sessionId, { threadId: threadEvent.thread_id })
307
+ break
308
+ }
309
+
310
+ case 'turn.started': {
311
+ const session = this.state.current.sessions[sessionId]
312
+ if (session) {
313
+ this.updateSession(sessionId, { turns: session.turns + 1 })
314
+ }
315
+ break
316
+ }
317
+
318
+ case 'item.completed': {
319
+ const { item } = event as CodexItemEvent
320
+ const session = this.state.current.sessions[sessionId]
321
+ if (!session) break
322
+
323
+ this.updateSession(sessionId, { items: [...session.items, item] })
324
+
325
+ if (item.type === 'agent_message' && item.text) {
326
+ // Normalize to a CodexMessageEvent for downstream consumers
327
+ const msg: CodexMessageEvent = {
328
+ type: 'message',
329
+ role: 'assistant',
330
+ content: [{ type: 'text', text: item.text }]
331
+ }
332
+ this.updateSession(sessionId, { messages: [...session.messages, msg] })
333
+ this.emit('session:delta', { sessionId, text: item.text, role: 'assistant' })
334
+ this.emit('session:message', { sessionId, message: msg })
335
+ } else if (item.type === 'command_execution') {
336
+ const exec: CodexExecEvent = {
337
+ type: 'exec',
338
+ command: item.command || '',
339
+ exit_code: item.exit_code,
340
+ stdout: item.aggregated_output,
341
+ }
342
+ this.updateSession(sessionId, { executions: [...session.executions, exec] })
343
+ this.emit('session:exec', { sessionId, exec })
344
+ } else if (item.type === 'reasoning' && item.text) {
345
+ this.emit('session:reasoning', { sessionId, text: item.text })
346
+ }
347
+ break
348
+ }
349
+
350
+ case 'item.started': {
351
+ const { item } = event as CodexItemEvent
352
+ if (item.type === 'command_execution' && item.command) {
353
+ this.emit('session:exec-start', { sessionId, command: item.command })
354
+ }
355
+ break
356
+ }
357
+
358
+ case 'turn.completed': {
359
+ const turnEvent = event as CodexTurnEvent
360
+ if (turnEvent.usage) {
361
+ this.updateSession(sessionId, { usage: turnEvent.usage })
362
+ }
363
+ break
364
+ }
365
+
366
+ default: {
367
+ // Forward unknown events for extensibility
368
+ this.emit(`session:${event.type}`, { sessionId, event })
369
+ break
370
+ }
371
+ }
372
+ }
373
+
374
+ /**
375
+ * Run a prompt in a new Codex session. Spawns a subprocess,
376
+ * streams NDJSON events, and resolves when the session completes.
377
+ *
378
+ * @param {string} prompt - The natural language instruction for the Codex agent
379
+ * @param {CodexRunOptions} [options] - Optional overrides for model, cwd, sandbox policy, etc.
380
+ * @returns {Promise<CodexSession>} The completed session with result, messages, patches, and executions
381
+ *
382
+ * @example
383
+ * ```typescript
384
+ * const session = await codex.run('Fix the failing tests')
385
+ * console.log(session.result)
386
+ *
387
+ * const session = await codex.run('Refactor the auth module', {
388
+ * model: 'o4-mini',
389
+ * fullAuto: true,
390
+ * cwd: '/path/to/project'
391
+ * })
392
+ * ```
393
+ */
394
+ async run(prompt: string, options: CodexRunOptions = {}): Promise<CodexSession> {
395
+ const id = this.createSessionId()
396
+ const args = this.buildArgs(options)
397
+ const cwd = options.cwd ?? this.options.cwd ?? (this.container as any).cwd
398
+
399
+ const session: CodexSession = {
400
+ id,
401
+ status: 'running',
402
+ prompt,
403
+ turns: 0,
404
+ messages: [],
405
+ executions: [],
406
+ items: []
407
+ }
408
+
409
+ const sessions = { ...this.state.current.sessions, [id]: session }
410
+ const activeSessions = [...this.state.current.activeSessions, id]
411
+ this.setState({ sessions, activeSessions })
412
+
413
+ this.emit('session:start', { sessionId: id, prompt })
414
+
415
+ const proc = this.container.feature('proc').spawn(this.codexPath, args, {
416
+ cwd,
417
+ stdout: 'pipe',
418
+ stderr: 'pipe',
419
+ stdin: Buffer.from(prompt),
420
+ environment: { ...process.env },
421
+ })
422
+
423
+ this.updateSession(id, { process: proc })
424
+ await this.consumeStream(id, proc)
425
+
426
+ return this.state.current.sessions[id]!
427
+ }
428
+
429
+ /**
430
+ * Run a prompt without waiting for completion. Returns the session ID
431
+ * immediately so you can subscribe to events.
432
+ *
433
+ * @param {string} prompt - The natural language instruction for the Codex agent
434
+ * @param {CodexRunOptions} [options] - Optional overrides for model, cwd, sandbox policy, etc.
435
+ * @returns {string} The session ID, which can be used with getSession() or waitForSession()
436
+ *
437
+ * @example
438
+ * ```typescript
439
+ * const sessionId = codex.start('Build a REST API for users')
440
+ *
441
+ * codex.on('session:delta', ({ sessionId: sid, text }) => {
442
+ * if (sid === sessionId) process.stdout.write(text)
443
+ * })
444
+ * ```
445
+ */
446
+ start(prompt: string, options: CodexRunOptions = {}): string {
447
+ const id = this.createSessionId()
448
+ const args = this.buildArgs(options)
449
+ const cwd = options.cwd ?? this.options.cwd ?? (this.container as any).cwd
450
+
451
+ const session: CodexSession = {
452
+ id,
453
+ status: 'running',
454
+ prompt,
455
+ turns: 0,
456
+ messages: [],
457
+ executions: [],
458
+ items: []
459
+ }
460
+
461
+ const sessions = { ...this.state.current.sessions, [id]: session }
462
+ const activeSessions = [...this.state.current.activeSessions, id]
463
+ this.setState({ sessions, activeSessions })
464
+
465
+ this.emit('session:start', { sessionId: id, prompt })
466
+
467
+ const proc = this.container.feature('proc').spawn(this.codexPath, args, {
468
+ cwd,
469
+ stdout: 'pipe',
470
+ stderr: 'pipe',
471
+ stdin: Buffer.from(prompt),
472
+ environment: { ...process.env },
473
+ })
474
+
475
+ this.updateSession(id, { process: proc })
476
+ this.consumeStream(id, proc)
477
+
478
+ return id
479
+ }
480
+
481
+ private async consumeStream(sessionId: string, proc: any): Promise<void> {
482
+ if (!proc?.stdout || !proc?.stderr) {
483
+ const error = 'Process streams are not available'
484
+ this.updateSession(sessionId, { status: 'error', error })
485
+ this.emit('session:error', { sessionId, error })
486
+ return
487
+ }
488
+
489
+ let buffer = ''
490
+ let lastText = ''
491
+ let stderr = ''
492
+
493
+ proc.stderr.on('data', (chunk: Buffer | string) => {
494
+ stderr += Buffer.isBuffer(chunk) ? chunk.toString() : String(chunk)
495
+ })
496
+
497
+ const stdoutDone = new Promise<void>((resolve, reject) => {
498
+ proc.stdout.on('data', (chunk: Buffer | string) => {
499
+ buffer += Buffer.isBuffer(chunk) ? chunk.toString() : String(chunk)
500
+ const lines = buffer.split('\n')
501
+ buffer = lines.pop() || ''
502
+
503
+ for (const line of lines) {
504
+ const trimmed = line.trim()
505
+ if (!trimmed) continue
506
+
507
+ try {
508
+ const event = JSON.parse(trimmed) as CodexEvent
509
+ this.handleEvent(sessionId, event)
510
+
511
+ if (event.type === 'item.completed') {
512
+ const { item } = event as CodexItemEvent
513
+ if (item.type === 'agent_message' && item.text) {
514
+ lastText = item.text
515
+ }
516
+ }
517
+ } catch {
518
+ this.emit('session:parse-error', { sessionId, line: trimmed })
519
+ }
520
+ }
521
+ })
522
+
523
+ proc.stdout.on('end', () => {
524
+ if (buffer.trim()) {
525
+ try {
526
+ const event = JSON.parse(buffer.trim()) as CodexEvent
527
+ this.handleEvent(sessionId, event)
528
+ } catch {
529
+ // ignore trailing partial data
530
+ }
531
+ }
532
+ resolve()
533
+ })
534
+
535
+ proc.stdout.on('error', reject)
536
+ })
537
+
538
+ const exitCodePromise = new Promise<number>((resolve, reject) => {
539
+ proc.once('error', reject)
540
+ proc.once('close', (code: number | null) => resolve(code ?? 0))
541
+ })
542
+
543
+ try {
544
+ await stdoutDone
545
+ } catch (err) {
546
+ this.updateSession(sessionId, {
547
+ status: 'error',
548
+ error: err instanceof Error ? err.message : String(err)
549
+ })
550
+ this.emit('session:error', { sessionId, error: err })
551
+ }
552
+
553
+ let exitCode = 1
554
+ try {
555
+ exitCode = await exitCodePromise
556
+ } catch (err) {
557
+ this.updateSession(sessionId, {
558
+ status: 'error',
559
+ error: err instanceof Error ? err.message : String(err),
560
+ })
561
+ this.emit('session:error', { sessionId, error: err })
562
+ }
563
+
564
+ if (exitCode !== 0 && this.state.current.sessions[sessionId]?.status !== 'completed') {
565
+ this.updateSession(sessionId, {
566
+ status: 'error',
567
+ error: stderr || `Process exited with code ${exitCode}`
568
+ })
569
+ this.emit('session:error', { sessionId, error: stderr, exitCode })
570
+ } else if (this.state.current.sessions[sessionId]?.status === 'running') {
571
+ this.updateSession(sessionId, {
572
+ status: 'completed',
573
+ result: lastText || undefined
574
+ })
575
+
576
+ const activeSessions = this.state.current.activeSessions.filter(s => s !== sessionId)
577
+ this.setState({ activeSessions })
578
+
579
+ this.emit('session:result', {
580
+ sessionId,
581
+ result: lastText,
582
+ })
583
+ }
584
+ }
585
+
586
+ /**
587
+ * Kill a running session's subprocess.
588
+ *
589
+ * @param {string} sessionId - The session ID to abort
590
+ * @returns {void}
591
+ */
592
+ abort(sessionId: string): void {
593
+ const session = this.state.current.sessions[sessionId]
594
+ if (session?.process && session.status === 'running') {
595
+ session.process.kill()
596
+ this.updateSession(sessionId, { status: 'error', error: 'Aborted by user' })
597
+ const activeSessions = this.state.current.activeSessions.filter(id => id !== sessionId)
598
+ this.setState({ activeSessions })
599
+ this.emit('session:abort', { sessionId })
600
+ }
601
+ }
602
+
603
+ /**
604
+ * Retrieve the current state of a session by its ID.
605
+ *
606
+ * @param {string} sessionId - The session ID to look up
607
+ * @returns {CodexSession | undefined} The session object, or undefined if not found
608
+ */
609
+ getSession(sessionId: string): CodexSession | undefined {
610
+ return this.state.current.sessions[sessionId]
611
+ }
612
+
613
+ /**
614
+ * Wait for a running session to complete or error. Resolves immediately
615
+ * if the session is already in a terminal state.
616
+ *
617
+ * @param {string} sessionId - The session ID to wait for
618
+ * @returns {Promise<CodexSession>} The completed or errored session
619
+ * @throws {Error} If the session ID is not found
620
+ */
621
+ async waitForSession(sessionId: string): Promise<CodexSession> {
622
+ const session = this.state.current.sessions[sessionId]
623
+ if (!session) throw new Error(`Session ${sessionId} not found`)
624
+ if (session.status === 'completed' || session.status === 'error') return session
625
+
626
+ return new Promise((resolve) => {
627
+ const handler = (data: { sessionId: string }) => {
628
+ if (data.sessionId === sessionId) {
629
+ this.off('session:result')
630
+ this.off('session:error')
631
+ resolve(this.state.current.sessions[sessionId]!)
632
+ }
633
+ }
634
+ this.on('session:result', handler)
635
+ this.on('session:error', handler)
636
+ })
637
+ }
638
+
639
+ /**
640
+ * Enable the feature. Delegates to the base Feature enable() lifecycle.
641
+ *
642
+ * @param {object} [options] - Options to merge into the feature configuration
643
+ * @returns {Promise<this>} This instance, for chaining
644
+ */
645
+ override async enable(options: any = {}): Promise<this> {
646
+ await super.enable(options)
647
+ return this
648
+ }
649
+ }
650
+
651
+ export default OpenAICodex