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,669 @@
1
+ import { z } from 'zod'
2
+ import { Feature } from '../feature.js'
3
+ import { FeatureStateSchema, FeatureOptionsSchema } from '../../schemas/base.js'
4
+
5
+ /** Supported DNS record types. */
6
+ export type DnsRecordType = 'A' | 'AAAA' | 'CNAME' | 'MX' | 'NS' | 'TXT' | 'SOA' | 'PTR' | 'SRV' | 'CAA'
7
+
8
+ export const DnsRecordSchema = z.object({
9
+ name: z.string().describe('The queried domain name'),
10
+ ttl: z.number().describe('Time to live in seconds'),
11
+ class: z.string().describe('Record class (usually IN)'),
12
+ type: z.string().describe('DNS record type'),
13
+ value: z.string().describe('Record value/data'),
14
+ })
15
+ export type DnsRecord = z.infer<typeof DnsRecordSchema>
16
+
17
+ export const MxRecordSchema = DnsRecordSchema.extend({
18
+ priority: z.number().describe('MX priority value'),
19
+ exchange: z.string().describe('Mail exchange hostname'),
20
+ })
21
+ export type MxRecord = z.infer<typeof MxRecordSchema>
22
+
23
+ export const SoaRecordSchema = DnsRecordSchema.extend({
24
+ mname: z.string().describe('Primary nameserver'),
25
+ rname: z.string().describe('Responsible party email (dot notation)'),
26
+ serial: z.number().describe('Zone serial number'),
27
+ refresh: z.number().describe('Refresh interval in seconds'),
28
+ retry: z.number().describe('Retry interval in seconds'),
29
+ expire: z.number().describe('Expire time in seconds'),
30
+ minimum: z.number().describe('Minimum TTL in seconds'),
31
+ })
32
+ export type SoaRecord = z.infer<typeof SoaRecordSchema>
33
+
34
+ export const SrvRecordSchema = DnsRecordSchema.extend({
35
+ priority: z.number().describe('SRV priority'),
36
+ weight: z.number().describe('SRV weight'),
37
+ port: z.number().describe('SRV port'),
38
+ target: z.string().describe('SRV target hostname'),
39
+ })
40
+ export type SrvRecord = z.infer<typeof SrvRecordSchema>
41
+
42
+ export const CaaRecordSchema = DnsRecordSchema.extend({
43
+ flags: z.number().describe('CAA flags'),
44
+ tag: z.string().describe('CAA tag (issue, issuewild, iodef)'),
45
+ issuer: z.string().describe('CAA value/issuer'),
46
+ })
47
+ export type CaaRecord = z.infer<typeof CaaRecordSchema>
48
+
49
+ export const DnsQueryResultSchema = z.object({
50
+ domain: z.string().describe('The queried domain'),
51
+ type: z.string().describe('The record type queried'),
52
+ server: z.string().optional().describe('DNS server used for the query'),
53
+ records: z.array(DnsRecordSchema).describe('Returned DNS records'),
54
+ queryTime: z.number().optional().describe('Query time in milliseconds'),
55
+ })
56
+ export type DnsQueryResult = z.infer<typeof DnsQueryResultSchema>
57
+
58
+ export const DnsOverviewSchema = z.object({
59
+ domain: z.string().describe('The queried domain'),
60
+ a: z.array(DnsRecordSchema).describe('A records'),
61
+ aaaa: z.array(DnsRecordSchema).describe('AAAA records'),
62
+ cname: z.array(DnsRecordSchema).describe('CNAME records'),
63
+ mx: z.array(MxRecordSchema).describe('MX records'),
64
+ ns: z.array(DnsRecordSchema).describe('NS records'),
65
+ txt: z.array(DnsRecordSchema).describe('TXT records'),
66
+ soa: z.array(SoaRecordSchema).describe('SOA records'),
67
+ caa: z.array(CaaRecordSchema).describe('CAA records'),
68
+ })
69
+ export type DnsOverview = z.infer<typeof DnsOverviewSchema>
70
+
71
+ export const DnsStateSchema = FeatureStateSchema.extend({
72
+ lastQuery: z.object({
73
+ domain: z.string(),
74
+ type: z.string(),
75
+ timestamp: z.number(),
76
+ }).optional().describe('The most recent DNS query'),
77
+ })
78
+ export type DnsState = z.infer<typeof DnsStateSchema>
79
+
80
+ export const DnsOptionsSchema = FeatureOptionsSchema.extend({
81
+ server: z.string().optional().describe('Default DNS server to use for queries'),
82
+ timeout: z.number().optional().describe('Default timeout in seconds for dig queries'),
83
+ })
84
+ export type DnsOptions = z.infer<typeof DnsOptionsSchema>
85
+
86
+ type QueryOptions = {
87
+ server?: string
88
+ timeout?: number
89
+ short?: boolean
90
+ }
91
+
92
+ /**
93
+ * The Dns feature provides structured DNS lookups by wrapping the `dig` CLI.
94
+ *
95
+ * All query methods parse dig output into typed JSON objects, making it easy
96
+ * to explore and audit a domain's DNS configuration programmatically.
97
+ *
98
+ * @example
99
+ * ```typescript
100
+ * const dns = container.feature('dns')
101
+ *
102
+ * // Look up A records
103
+ * const result = await dns.resolve('example.com', 'A')
104
+ * console.log(result.records)
105
+ *
106
+ * // Get a full overview of all record types
107
+ * const overview = await dns.overview('example.com')
108
+ * console.log(overview.mx) // mail servers
109
+ * console.log(overview.ns) // nameservers
110
+ * console.log(overview.txt) // TXT records (SPF, DKIM, etc.)
111
+ *
112
+ * // Reverse lookup
113
+ * const ptr = await dns.reverse('8.8.8.8')
114
+ * console.log(ptr) // ['dns.google.']
115
+ * ```
116
+ *
117
+ * @extends Feature
118
+ */
119
+ export class Dns extends Feature<DnsState, DnsOptions> {
120
+ static override shortcut = 'features.dns' as const
121
+ static override description = 'DNS lookup utilities wrapping the dig CLI'
122
+ static override stateSchema = DnsStateSchema
123
+ static override optionsSchema = DnsOptionsSchema
124
+ static { Feature.register(this, 'dns') }
125
+
126
+ override get initialState(): DnsState {
127
+ return {
128
+ ...super.initialState,
129
+ enabled: false,
130
+ lastQuery: undefined,
131
+ }
132
+ }
133
+
134
+ private _resolvedDigPath: string | null = null
135
+
136
+ get proc() {
137
+ return this.container.feature('proc')
138
+ }
139
+
140
+ /** Resolved path to the dig binary */
141
+ get digPath(): string {
142
+ if (this._resolvedDigPath) return this._resolvedDigPath
143
+ try {
144
+ this._resolvedDigPath = this.proc.exec('which dig').trim()
145
+ } catch {
146
+ this._resolvedDigPath = 'dig'
147
+ }
148
+ return this._resolvedDigPath
149
+ }
150
+
151
+ /**
152
+ * Checks whether the `dig` binary is available on the system.
153
+ *
154
+ * @returns True if dig is installed and accessible
155
+ *
156
+ * @example
157
+ * ```typescript
158
+ * if (await dns.isAvailable()) {
159
+ * const records = await dns.a('example.com')
160
+ * }
161
+ * ```
162
+ */
163
+ async isAvailable(): Promise<boolean> {
164
+ const result = await this.proc.spawnAndCapture(this.digPath, ['-v'])
165
+ // dig -v prints version to stderr and exits 0
166
+ return result.exitCode === 0
167
+ }
168
+
169
+ /**
170
+ * Resolves DNS records of a given type for a domain.
171
+ *
172
+ * This is the core query method. All convenience methods (a, aaaa, mx, etc.)
173
+ * delegate to this method.
174
+ *
175
+ * @param domain - The domain name to query
176
+ * @param type - The DNS record type to look up
177
+ * @param options - Optional query parameters
178
+ * @param options.server - DNS server to use (e.g. '8.8.8.8')
179
+ * @param options.timeout - Query timeout in seconds
180
+ * @param options.short - If true, returns only values (no TTL, class, etc.)
181
+ * @returns Parsed query result with typed records
182
+ *
183
+ * @example
184
+ * ```typescript
185
+ * const result = await dns.resolve('example.com', 'A')
186
+ * for (const record of result.records) {
187
+ * console.log(`${record.name} -> ${record.value} (TTL: ${record.ttl}s)`)
188
+ * }
189
+ *
190
+ * // Query a specific DNS server
191
+ * const result = await dns.resolve('example.com', 'A', { server: '1.1.1.1' })
192
+ * ```
193
+ */
194
+ async resolve(domain: string, type: DnsRecordType, options: QueryOptions = {}): Promise<DnsQueryResult> {
195
+ const args = this.buildDigArgs(domain, type, options)
196
+ const result = await this.proc.spawnAndCapture(this.digPath, args)
197
+
198
+ if (result.exitCode !== 0) {
199
+ throw new Error(`dig query failed: ${result.stderr || 'unknown error'}`)
200
+ }
201
+
202
+ const records = this.parseDigAnswer(result.stdout)
203
+ const queryTime = this.parseQueryTime(result.stdout)
204
+ const server = options.server || this.options.server
205
+
206
+ this.setState({
207
+ lastQuery: {
208
+ domain,
209
+ type,
210
+ timestamp: Date.now(),
211
+ },
212
+ })
213
+
214
+ return {
215
+ domain,
216
+ type,
217
+ server,
218
+ records,
219
+ queryTime,
220
+ }
221
+ }
222
+
223
+ /**
224
+ * Looks up A (IPv4 address) records for a domain.
225
+ *
226
+ * @param domain - The domain name to query
227
+ * @param options - Optional query parameters
228
+ * @returns Array of A records
229
+ *
230
+ * @example
231
+ * ```typescript
232
+ * const records = await dns.a('google.com')
233
+ * // [{ name: 'google.com.', ttl: 300, class: 'IN', type: 'A', value: '142.250.x.x' }]
234
+ * ```
235
+ */
236
+ async a(domain: string, options: QueryOptions = {}): Promise<DnsRecord[]> {
237
+ const result = await this.resolve(domain, 'A', options)
238
+ return result.records
239
+ }
240
+
241
+ /**
242
+ * Looks up AAAA (IPv6 address) records for a domain.
243
+ *
244
+ * @param domain - The domain name to query
245
+ * @param options - Optional query parameters
246
+ * @returns Array of AAAA records
247
+ *
248
+ * @example
249
+ * ```typescript
250
+ * const records = await dns.aaaa('google.com')
251
+ * // [{ name: 'google.com.', ttl: 300, class: 'IN', type: 'AAAA', value: '2607:f8b0:...' }]
252
+ * ```
253
+ */
254
+ async aaaa(domain: string, options: QueryOptions = {}): Promise<DnsRecord[]> {
255
+ const result = await this.resolve(domain, 'AAAA', options)
256
+ return result.records
257
+ }
258
+
259
+ /**
260
+ * Looks up CNAME (canonical name) records for a domain.
261
+ *
262
+ * @param domain - The domain name to query
263
+ * @param options - Optional query parameters
264
+ * @returns Array of CNAME records
265
+ *
266
+ * @example
267
+ * ```typescript
268
+ * const records = await dns.cname('www.github.com')
269
+ * // [{ name: 'www.github.com.', ttl: 3600, class: 'IN', type: 'CNAME', value: 'github.com.' }]
270
+ * ```
271
+ */
272
+ async cname(domain: string, options: QueryOptions = {}): Promise<DnsRecord[]> {
273
+ const result = await this.resolve(domain, 'CNAME', options)
274
+ return result.records
275
+ }
276
+
277
+ /**
278
+ * Looks up MX (mail exchange) records for a domain.
279
+ *
280
+ * Returns enriched records with parsed priority and exchange fields.
281
+ *
282
+ * @param domain - The domain name to query
283
+ * @param options - Optional query parameters
284
+ * @returns Array of MX records with priority and exchange
285
+ *
286
+ * @example
287
+ * ```typescript
288
+ * const records = await dns.mx('google.com')
289
+ * // [{ name: 'google.com.', ttl: 300, type: 'MX', priority: 10, exchange: 'smtp.google.com.' }]
290
+ * ```
291
+ */
292
+ async mx(domain: string, options: QueryOptions = {}): Promise<MxRecord[]> {
293
+ const result = await this.resolve(domain, 'MX', options)
294
+ return result.records.map((record) => {
295
+ const parts = record.value.split(/\s+/)
296
+ const priority = parseInt(parts[0] || '0', 10)
297
+ const exchange = parts[1] || record.value
298
+ return { ...record, priority, exchange }
299
+ })
300
+ }
301
+
302
+ /**
303
+ * Looks up NS (nameserver) records for a domain.
304
+ *
305
+ * @param domain - The domain name to query
306
+ * @param options - Optional query parameters
307
+ * @returns Array of NS records
308
+ *
309
+ * @example
310
+ * ```typescript
311
+ * const records = await dns.ns('google.com')
312
+ * // [{ name: 'google.com.', ttl: 86400, type: 'NS', value: 'ns1.google.com.' }, ...]
313
+ * ```
314
+ */
315
+ async ns(domain: string, options: QueryOptions = {}): Promise<DnsRecord[]> {
316
+ const result = await this.resolve(domain, 'NS', options)
317
+ return result.records
318
+ }
319
+
320
+ /**
321
+ * Looks up TXT records for a domain.
322
+ *
323
+ * TXT records often contain SPF policies, DKIM keys, domain verification tokens,
324
+ * and other metadata.
325
+ *
326
+ * @param domain - The domain name to query
327
+ * @param options - Optional query parameters
328
+ * @returns Array of TXT records
329
+ *
330
+ * @example
331
+ * ```typescript
332
+ * const records = await dns.txt('google.com')
333
+ * const spf = records.find(r => r.value.includes('v=spf1'))
334
+ * console.log(spf?.value) // 'v=spf1 include:_spf.google.com ~all'
335
+ * ```
336
+ */
337
+ async txt(domain: string, options: QueryOptions = {}): Promise<DnsRecord[]> {
338
+ const result = await this.resolve(domain, 'TXT', options)
339
+ return result.records.map((record) => ({
340
+ ...record,
341
+ value: record.value.replace(/^"(.*)"$/, '$1'),
342
+ }))
343
+ }
344
+
345
+ /**
346
+ * Looks up the SOA (Start of Authority) record for a domain.
347
+ *
348
+ * Returns enriched records with parsed SOA fields including primary nameserver,
349
+ * responsible party, serial number, and timing parameters.
350
+ *
351
+ * @param domain - The domain name to query
352
+ * @param options - Optional query parameters
353
+ * @returns Array of SOA records (typically one)
354
+ *
355
+ * @example
356
+ * ```typescript
357
+ * const records = await dns.soa('google.com')
358
+ * console.log(records[0].mname) // 'ns1.google.com.'
359
+ * console.log(records[0].serial) // 879543655
360
+ * ```
361
+ */
362
+ async soa(domain: string, options: QueryOptions = {}): Promise<SoaRecord[]> {
363
+ const result = await this.resolve(domain, 'SOA', options)
364
+ return result.records.map((record) => {
365
+ const parts = record.value.split(/\s+/)
366
+ return {
367
+ ...record,
368
+ mname: parts[0] || '',
369
+ rname: parts[1] || '',
370
+ serial: parseInt(parts[2] || '0', 10),
371
+ refresh: parseInt(parts[3] || '0', 10),
372
+ retry: parseInt(parts[4] || '0', 10),
373
+ expire: parseInt(parts[5] || '0', 10),
374
+ minimum: parseInt(parts[6] || '0', 10),
375
+ }
376
+ })
377
+ }
378
+
379
+ /**
380
+ * Looks up SRV (service) records for a domain.
381
+ *
382
+ * SRV records specify the location of services. The domain should include
383
+ * the service and protocol prefix (e.g. `_sip._tcp.example.com`).
384
+ *
385
+ * @param domain - The full SRV domain (e.g. `_sip._tcp.example.com`)
386
+ * @param options - Optional query parameters
387
+ * @returns Array of SRV records with priority, weight, port, and target
388
+ *
389
+ * @example
390
+ * ```typescript
391
+ * const records = await dns.srv('_sip._tcp.example.com')
392
+ * // [{ priority: 10, weight: 60, port: 5060, target: 'sip.example.com.' }]
393
+ * ```
394
+ */
395
+ async srv(domain: string, options: QueryOptions = {}): Promise<SrvRecord[]> {
396
+ const result = await this.resolve(domain, 'SRV', options)
397
+ return result.records.map((record) => {
398
+ const parts = record.value.split(/\s+/)
399
+ return {
400
+ ...record,
401
+ priority: parseInt(parts[0] || '0', 10),
402
+ weight: parseInt(parts[1] || '0', 10),
403
+ port: parseInt(parts[2] || '0', 10),
404
+ target: parts[3] || '',
405
+ }
406
+ })
407
+ }
408
+
409
+ /**
410
+ * Looks up CAA (Certificate Authority Authorization) records for a domain.
411
+ *
412
+ * CAA records specify which certificate authorities are allowed to issue
413
+ * certificates for a domain.
414
+ *
415
+ * @param domain - The domain name to query
416
+ * @param options - Optional query parameters
417
+ * @returns Array of CAA records with flags, tag, and issuer
418
+ *
419
+ * @example
420
+ * ```typescript
421
+ * const records = await dns.caa('google.com')
422
+ * // [{ flags: 0, tag: 'issue', issuer: 'pki.goog' }]
423
+ * ```
424
+ */
425
+ async caa(domain: string, options: QueryOptions = {}): Promise<CaaRecord[]> {
426
+ const result = await this.resolve(domain, 'CAA', options)
427
+ return result.records.map((record) => {
428
+ const parts = record.value.split(/\s+/)
429
+ return {
430
+ ...record,
431
+ flags: parseInt(parts[0] || '0', 10),
432
+ tag: (parts[1] || '').replace(/"/g, ''),
433
+ issuer: (parts.slice(2).join(' ') || '').replace(/"/g, ''),
434
+ }
435
+ })
436
+ }
437
+
438
+ /**
439
+ * Performs a reverse DNS lookup for an IP address.
440
+ *
441
+ * Converts the IP to its in-addr.arpa form and queries for PTR records.
442
+ *
443
+ * @param ip - The IPv4 address to look up
444
+ * @param options - Optional query parameters
445
+ * @returns Array of hostnames (PTR record values)
446
+ *
447
+ * @example
448
+ * ```typescript
449
+ * const hostnames = await dns.reverse('8.8.8.8')
450
+ * // ['dns.google.']
451
+ * ```
452
+ */
453
+ async reverse(ip: string, options: QueryOptions = {}): Promise<string[]> {
454
+ const args = this.buildDigArgs('', 'PTR', options)
455
+ // Replace domain arg with -x flag
456
+ const idx = args.indexOf('')
457
+ if (idx !== -1) {
458
+ args.splice(idx, 1)
459
+ }
460
+ args.unshift('-x', ip)
461
+
462
+ const result = await this.proc.spawnAndCapture(this.digPath, args)
463
+
464
+ if (result.exitCode !== 0) {
465
+ throw new Error(`dig reverse lookup failed: ${result.stderr || 'unknown error'}`)
466
+ }
467
+
468
+ const records = this.parseDigAnswer(result.stdout)
469
+ return records.map((r) => r.value)
470
+ }
471
+
472
+ /**
473
+ * Retrieves a comprehensive DNS overview for a domain.
474
+ *
475
+ * Queries all common record types (A, AAAA, CNAME, MX, NS, TXT, SOA, CAA)
476
+ * in parallel and returns a consolidated view. This is the go-to method for
477
+ * exploring a domain's full DNS configuration.
478
+ *
479
+ * @param domain - The domain name to query
480
+ * @param options - Optional query parameters applied to all queries
481
+ * @returns Complete DNS overview with all record types
482
+ *
483
+ * @example
484
+ * ```typescript
485
+ * const overview = await dns.overview('example.com')
486
+ * console.log('IPs:', overview.a.map(r => r.value))
487
+ * console.log('Mail:', overview.mx.map(r => r.exchange))
488
+ * console.log('Nameservers:', overview.ns.map(r => r.value))
489
+ * console.log('TXT:', overview.txt.map(r => r.value))
490
+ * ```
491
+ */
492
+ async overview(domain: string, options: QueryOptions = {}): Promise<DnsOverview> {
493
+ const [a, aaaa, cname, mx, ns, txt, soa, caa] = await Promise.all([
494
+ this.a(domain, options),
495
+ this.aaaa(domain, options),
496
+ this.cname(domain, options),
497
+ this.mx(domain, options),
498
+ this.ns(domain, options),
499
+ this.txt(domain, options),
500
+ this.soa(domain, options),
501
+ this.caa(domain, options),
502
+ ])
503
+
504
+ return { domain, a, aaaa, cname, mx, ns, txt, soa, caa }
505
+ }
506
+
507
+ /**
508
+ * Compares DNS resolution between two nameservers for a given record type.
509
+ *
510
+ * Useful for verifying DNS propagation or checking for inconsistencies
511
+ * between authoritative and recursive resolvers.
512
+ *
513
+ * @param domain - The domain name to query
514
+ * @param type - The DNS record type to compare
515
+ * @param serverA - First DNS server (e.g. '8.8.8.8')
516
+ * @param serverB - Second DNS server (e.g. '1.1.1.1')
517
+ * @returns Object with results from both servers and whether they match
518
+ *
519
+ * @example
520
+ * ```typescript
521
+ * const diff = await dns.compare('example.com', 'A', '8.8.8.8', '1.1.1.1')
522
+ * console.log(diff.match) // true if both return the same values
523
+ * console.log(diff.serverA) // records from 8.8.8.8
524
+ * console.log(diff.serverB) // records from 1.1.1.1
525
+ * ```
526
+ */
527
+ async compare(
528
+ domain: string,
529
+ type: DnsRecordType,
530
+ serverA: string,
531
+ serverB: string,
532
+ ): Promise<{ serverA: DnsQueryResult; serverB: DnsQueryResult; match: boolean }> {
533
+ const [resultA, resultB] = await Promise.all([
534
+ this.resolve(domain, type, { server: serverA }),
535
+ this.resolve(domain, type, { server: serverB }),
536
+ ])
537
+
538
+ const valuesA = resultA.records.map((r) => r.value).sort()
539
+ const valuesB = resultB.records.map((r) => r.value).sort()
540
+ const match = JSON.stringify(valuesA) === JSON.stringify(valuesB)
541
+
542
+ return { serverA: resultA, serverB: resultB, match }
543
+ }
544
+
545
+ /**
546
+ * Queries a domain's authoritative nameservers directly.
547
+ *
548
+ * First resolves the NS records, then queries each nameserver for the
549
+ * specified record type. Useful for bypassing caches and checking what
550
+ * the authoritative servers actually report.
551
+ *
552
+ * @param domain - The domain name to query
553
+ * @param type - The DNS record type to look up
554
+ * @returns Array of results, one per authoritative nameserver
555
+ *
556
+ * @example
557
+ * ```typescript
558
+ * const results = await dns.queryAuthoritative('example.com', 'A')
559
+ * for (const r of results) {
560
+ * console.log(`${r.server}: ${r.records.map(rec => rec.value).join(', ')}`)
561
+ * }
562
+ * ```
563
+ */
564
+ async queryAuthoritative(domain: string, type: DnsRecordType): Promise<DnsQueryResult[]> {
565
+ const nsRecords = await this.ns(domain)
566
+
567
+ if (nsRecords.length === 0) {
568
+ return []
569
+ }
570
+
571
+ const results = await Promise.all(
572
+ nsRecords.map((ns) => this.resolve(domain, type, { server: ns.value.replace(/\.$/, '') })),
573
+ )
574
+
575
+ return results
576
+ }
577
+
578
+ /**
579
+ * Checks whether a domain has a specific TXT record containing the given text.
580
+ *
581
+ * Useful for verifying domain ownership tokens, SPF records, DKIM entries, etc.
582
+ *
583
+ * @param domain - The domain name to query
584
+ * @param search - The text to search for in TXT record values
585
+ * @returns True if any TXT record contains the search string
586
+ *
587
+ * @example
588
+ * ```typescript
589
+ * // Check for SPF record
590
+ * const hasSPF = await dns.hasTxtRecord('google.com', 'v=spf1')
591
+ *
592
+ * // Check for domain verification
593
+ * const verified = await dns.hasTxtRecord('example.com', 'google-site-verification=')
594
+ * ```
595
+ */
596
+ async hasTxtRecord(domain: string, search: string): Promise<boolean> {
597
+ const records = await this.txt(domain)
598
+ return records.some((r) => r.value.includes(search))
599
+ }
600
+
601
+ /** Builds the dig CLI arguments for a query. */
602
+ private buildDigArgs(domain: string, type: DnsRecordType | 'PTR', options: QueryOptions = {}): string[] {
603
+ const args: string[] = []
604
+ const server = options.server || this.options.server
605
+
606
+ if (server) {
607
+ args.push(`@${server}`)
608
+ }
609
+
610
+ if (domain) {
611
+ args.push(domain)
612
+ }
613
+
614
+ args.push(type)
615
+
616
+ if (options.short) {
617
+ args.push('+short')
618
+ } else {
619
+ args.push('+noall', '+answer', '+stats')
620
+ }
621
+
622
+ const timeout = options.timeout ?? this.options.timeout
623
+ if (timeout) {
624
+ args.push(`+time=${timeout}`)
625
+ }
626
+
627
+ return args
628
+ }
629
+
630
+ /** Parses dig's answer section into structured records. */
631
+ private parseDigAnswer(output: string): DnsRecord[] {
632
+ const records: DnsRecord[] = []
633
+ const lines = output.split(/\r?\n/)
634
+
635
+ for (const line of lines) {
636
+ const trimmed = line.trim()
637
+ // Skip comments, empty lines, and non-record lines
638
+ if (!trimmed || trimmed.startsWith(';') || trimmed.startsWith(';;')) {
639
+ continue
640
+ }
641
+
642
+ // Record format: name ttl class type value...
643
+ const match = trimmed.match(/^(\S+)\s+(\d+)\s+(\S+)\s+(\S+)\s+(.+)$/)
644
+ if (!match) {
645
+ continue
646
+ }
647
+
648
+ const [, name, ttlStr, cls, recordType, value] = match
649
+
650
+ records.push({
651
+ name: name!,
652
+ ttl: parseInt(ttlStr!, 10),
653
+ class: cls!,
654
+ type: recordType!,
655
+ value: value!.trim(),
656
+ })
657
+ }
658
+
659
+ return records
660
+ }
661
+
662
+ /** Extracts query time from dig's stats section. */
663
+ private parseQueryTime(output: string): number | undefined {
664
+ const match = output.match(/;; Query time:\s+(\d+)\s+msec/)
665
+ return match ? parseInt(match[1]!, 10) : undefined
666
+ }
667
+ }
668
+
669
+ export default Dns