luca 2.0.0 → 3.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (532) hide show
  1. package/.github/workflows/release.yaml +170 -0
  2. package/AGENTS.md +99 -0
  3. package/CLAUDE.md +123 -0
  4. package/CNAME +1 -0
  5. package/README.md +275 -9
  6. package/RUNME.md +56 -0
  7. package/assistants/codingAssistant/ABOUT.md +5 -0
  8. package/assistants/codingAssistant/CORE.md +33 -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 +2667 -0
  20. package/bunfig.toml +3 -0
  21. package/commands/audit-docs.ts +740 -0
  22. package/commands/build-bootstrap.ts +117 -0
  23. package/commands/build-python-bridge.ts +42 -0
  24. package/commands/build-scaffolds.ts +175 -0
  25. package/commands/bundle-consumer-project.ts +521 -0
  26. package/commands/generate-api-docs.ts +114 -0
  27. package/commands/inkbot.ts +874 -0
  28. package/commands/release.ts +80 -0
  29. package/commands/try-all-challenges.ts +543 -0
  30. package/commands/try-challenge.ts +100 -0
  31. package/dist/agi/container.server.d.ts +63 -0
  32. package/dist/agi/container.server.d.ts.map +1 -0
  33. package/dist/agi/endpoints/ask.d.ts +20 -0
  34. package/dist/agi/endpoints/ask.d.ts.map +1 -0
  35. package/dist/agi/endpoints/conversations/[id].d.ts +27 -0
  36. package/dist/agi/endpoints/conversations/[id].d.ts.map +1 -0
  37. package/dist/agi/endpoints/conversations.d.ts +18 -0
  38. package/dist/agi/endpoints/conversations.d.ts.map +1 -0
  39. package/dist/agi/endpoints/experts.d.ts +8 -0
  40. package/dist/agi/endpoints/experts.d.ts.map +1 -0
  41. package/dist/agi/feature.d.ts +9 -0
  42. package/dist/agi/feature.d.ts.map +1 -0
  43. package/dist/agi/features/assistant.d.ts +509 -0
  44. package/dist/agi/features/assistant.d.ts.map +1 -0
  45. package/dist/agi/features/assistants-manager.d.ts +236 -0
  46. package/dist/agi/features/assistants-manager.d.ts.map +1 -0
  47. package/dist/agi/features/autonomous-assistant.d.ts +281 -0
  48. package/dist/agi/features/autonomous-assistant.d.ts.map +1 -0
  49. package/dist/agi/features/browser-use.d.ts +479 -0
  50. package/dist/agi/features/browser-use.d.ts.map +1 -0
  51. package/dist/agi/features/claude-code.d.ts +824 -0
  52. package/dist/agi/features/claude-code.d.ts.map +1 -0
  53. package/dist/agi/features/conversation-history.d.ts +245 -0
  54. package/dist/agi/features/conversation-history.d.ts.map +1 -0
  55. package/dist/agi/features/conversation.d.ts +464 -0
  56. package/dist/agi/features/conversation.d.ts.map +1 -0
  57. package/dist/agi/features/docs-reader.d.ts +72 -0
  58. package/dist/agi/features/docs-reader.d.ts.map +1 -0
  59. package/dist/agi/features/file-tools.d.ts +110 -0
  60. package/dist/agi/features/file-tools.d.ts.map +1 -0
  61. package/dist/agi/features/luca-coder.d.ts +323 -0
  62. package/dist/agi/features/luca-coder.d.ts.map +1 -0
  63. package/dist/agi/features/openai-codex.d.ts +381 -0
  64. package/dist/agi/features/openai-codex.d.ts.map +1 -0
  65. package/dist/agi/features/openapi.d.ts +200 -0
  66. package/dist/agi/features/openapi.d.ts.map +1 -0
  67. package/dist/agi/features/skills-library.d.ts +167 -0
  68. package/dist/agi/features/skills-library.d.ts.map +1 -0
  69. package/dist/agi/index.d.ts +5 -0
  70. package/dist/agi/index.d.ts.map +1 -0
  71. package/dist/agi/lib/interceptor-chain.d.ts +44 -0
  72. package/dist/agi/lib/interceptor-chain.d.ts.map +1 -0
  73. package/dist/agi/lib/token-counter.d.ts +13 -0
  74. package/dist/agi/lib/token-counter.d.ts.map +1 -0
  75. package/dist/bootstrap/generated.d.ts +5 -0
  76. package/dist/bootstrap/generated.d.ts.map +1 -0
  77. package/dist/browser.d.ts +12 -0
  78. package/dist/browser.d.ts.map +1 -0
  79. package/dist/bus.d.ts +29 -0
  80. package/dist/bus.d.ts.map +1 -0
  81. package/dist/cli/build-info.d.ts +4 -0
  82. package/dist/cli/build-info.d.ts.map +1 -0
  83. package/dist/cli/cli.d.ts +3 -12
  84. package/dist/cli/cli.d.ts.map +1 -0
  85. package/dist/client.d.ts +60 -0
  86. package/dist/client.d.ts.map +1 -0
  87. package/dist/clients/civitai/index.d.ts +472 -0
  88. package/dist/clients/civitai/index.d.ts.map +1 -0
  89. package/dist/clients/client-template.d.ts +30 -0
  90. package/dist/clients/client-template.d.ts.map +1 -0
  91. package/dist/clients/comfyui/index.d.ts +281 -0
  92. package/dist/clients/comfyui/index.d.ts.map +1 -0
  93. package/dist/clients/elevenlabs/index.d.ts +197 -0
  94. package/dist/clients/elevenlabs/index.d.ts.map +1 -0
  95. package/dist/clients/graph.d.ts +64 -0
  96. package/dist/clients/graph.d.ts.map +1 -0
  97. package/dist/clients/openai/index.d.ts +247 -0
  98. package/dist/clients/openai/index.d.ts.map +1 -0
  99. package/dist/clients/rest.d.ts +92 -0
  100. package/dist/clients/rest.d.ts.map +1 -0
  101. package/dist/clients/supabase/index.d.ts +176 -0
  102. package/dist/clients/supabase/index.d.ts.map +1 -0
  103. package/dist/clients/websocket.d.ts +127 -0
  104. package/dist/clients/websocket.d.ts.map +1 -0
  105. package/dist/command.d.ts +163 -0
  106. package/dist/command.d.ts.map +1 -0
  107. package/dist/commands/bootstrap.d.ts +20 -0
  108. package/dist/commands/bootstrap.d.ts.map +1 -0
  109. package/dist/commands/chat.d.ts +37 -0
  110. package/dist/commands/chat.d.ts.map +1 -0
  111. package/dist/commands/code.d.ts +28 -0
  112. package/dist/commands/code.d.ts.map +1 -0
  113. package/dist/commands/console.d.ts +22 -0
  114. package/dist/commands/console.d.ts.map +1 -0
  115. package/dist/commands/describe.d.ts +50 -0
  116. package/dist/commands/describe.d.ts.map +1 -0
  117. package/dist/commands/eval.d.ts +23 -0
  118. package/dist/commands/eval.d.ts.map +1 -0
  119. package/dist/commands/help.d.ts +25 -0
  120. package/dist/commands/help.d.ts.map +1 -0
  121. package/dist/commands/index.d.ts +18 -0
  122. package/dist/commands/index.d.ts.map +1 -0
  123. package/dist/commands/introspect.d.ts +24 -0
  124. package/dist/commands/introspect.d.ts.map +1 -0
  125. package/dist/commands/mcp.d.ts +35 -0
  126. package/dist/commands/mcp.d.ts.map +1 -0
  127. package/dist/commands/prompt.d.ts +38 -0
  128. package/dist/commands/prompt.d.ts.map +1 -0
  129. package/dist/commands/run.d.ts +24 -0
  130. package/dist/commands/run.d.ts.map +1 -0
  131. package/dist/commands/sandbox-mcp.d.ts +34 -0
  132. package/dist/commands/sandbox-mcp.d.ts.map +1 -0
  133. package/dist/commands/save-api-docs.d.ts +21 -0
  134. package/dist/commands/save-api-docs.d.ts.map +1 -0
  135. package/dist/commands/scaffold.d.ts +24 -0
  136. package/dist/commands/scaffold.d.ts.map +1 -0
  137. package/dist/commands/select.d.ts +22 -0
  138. package/dist/commands/select.d.ts.map +1 -0
  139. package/dist/commands/serve.d.ts +29 -0
  140. package/dist/commands/serve.d.ts.map +1 -0
  141. package/dist/container-describer.d.ts +144 -0
  142. package/dist/container-describer.d.ts.map +1 -0
  143. package/dist/container.d.ts +451 -0
  144. package/dist/container.d.ts.map +1 -0
  145. package/dist/endpoint.d.ts +113 -0
  146. package/dist/endpoint.d.ts.map +1 -0
  147. package/dist/feature.d.ts +47 -0
  148. package/dist/feature.d.ts.map +1 -0
  149. package/dist/graft.d.ts +29 -0
  150. package/dist/graft.d.ts.map +1 -0
  151. package/dist/hash-object.d.ts +8 -0
  152. package/dist/hash-object.d.ts.map +1 -0
  153. package/dist/helper.d.ts +209 -0
  154. package/dist/helper.d.ts.map +1 -0
  155. package/dist/introspection/generated.node.d.ts +44623 -0
  156. package/dist/introspection/generated.node.d.ts.map +1 -0
  157. package/dist/introspection/generated.web.d.ts +1412 -0
  158. package/dist/introspection/generated.web.d.ts.map +1 -0
  159. package/dist/introspection/index.d.ts +156 -0
  160. package/dist/introspection/index.d.ts.map +1 -0
  161. package/dist/introspection/scan.d.ts +147 -0
  162. package/dist/introspection/scan.d.ts.map +1 -0
  163. package/dist/node/container.d.ts +256 -0
  164. package/dist/node/container.d.ts.map +1 -0
  165. package/dist/node/feature.d.ts +9 -0
  166. package/dist/node/feature.d.ts.map +1 -0
  167. package/dist/node/features/container-link.d.ts +213 -0
  168. package/dist/node/features/container-link.d.ts.map +1 -0
  169. package/dist/node/features/content-db.d.ts +354 -0
  170. package/dist/node/features/content-db.d.ts.map +1 -0
  171. package/dist/node/features/disk-cache.d.ts +236 -0
  172. package/dist/node/features/disk-cache.d.ts.map +1 -0
  173. package/dist/node/features/dns.d.ts +511 -0
  174. package/dist/node/features/dns.d.ts.map +1 -0
  175. package/dist/node/features/docker.d.ts +485 -0
  176. package/dist/node/features/docker.d.ts.map +1 -0
  177. package/dist/node/features/downloader.d.ts +73 -0
  178. package/dist/node/features/downloader.d.ts.map +1 -0
  179. package/dist/node/features/figlet-fonts.d.ts +4 -0
  180. package/dist/node/features/figlet-fonts.d.ts.map +1 -0
  181. package/dist/node/features/file-manager.d.ts +177 -0
  182. package/dist/node/features/file-manager.d.ts.map +1 -0
  183. package/dist/node/features/fs.d.ts +635 -0
  184. package/dist/node/features/fs.d.ts.map +1 -0
  185. package/dist/node/features/git.d.ts +329 -0
  186. package/dist/node/features/git.d.ts.map +1 -0
  187. package/dist/node/features/google-auth.d.ts +200 -0
  188. package/dist/node/features/google-auth.d.ts.map +1 -0
  189. package/dist/node/features/google-calendar.d.ts +194 -0
  190. package/dist/node/features/google-calendar.d.ts.map +1 -0
  191. package/dist/node/features/google-docs.d.ts +138 -0
  192. package/dist/node/features/google-docs.d.ts.map +1 -0
  193. package/dist/node/features/google-drive.d.ts +202 -0
  194. package/dist/node/features/google-drive.d.ts.map +1 -0
  195. package/dist/node/features/google-mail.d.ts +221 -0
  196. package/dist/node/features/google-mail.d.ts.map +1 -0
  197. package/dist/node/features/google-sheets.d.ts +157 -0
  198. package/dist/node/features/google-sheets.d.ts.map +1 -0
  199. package/dist/node/features/grep.d.ts +207 -0
  200. package/dist/node/features/grep.d.ts.map +1 -0
  201. package/dist/node/features/helpers.d.ts +236 -0
  202. package/dist/node/features/helpers.d.ts.map +1 -0
  203. package/dist/node/features/ink.d.ts +332 -0
  204. package/dist/node/features/ink.d.ts.map +1 -0
  205. package/dist/node/features/ipc-socket.d.ts +298 -0
  206. package/dist/node/features/ipc-socket.d.ts.map +1 -0
  207. package/dist/node/features/json-tree.d.ts +140 -0
  208. package/dist/node/features/json-tree.d.ts.map +1 -0
  209. package/dist/node/features/networking.d.ts +373 -0
  210. package/dist/node/features/networking.d.ts.map +1 -0
  211. package/dist/node/features/nlp.d.ts +125 -0
  212. package/dist/node/features/nlp.d.ts.map +1 -0
  213. package/dist/node/features/opener.d.ts +93 -0
  214. package/dist/node/features/opener.d.ts.map +1 -0
  215. package/dist/node/features/os.d.ts +168 -0
  216. package/dist/node/features/os.d.ts.map +1 -0
  217. package/dist/node/features/package-finder.d.ts +419 -0
  218. package/dist/node/features/package-finder.d.ts.map +1 -0
  219. package/dist/node/features/postgres.d.ts +173 -0
  220. package/dist/node/features/postgres.d.ts.map +1 -0
  221. package/dist/node/features/proc.d.ts +285 -0
  222. package/dist/node/features/proc.d.ts.map +1 -0
  223. package/dist/node/features/process-manager.d.ts +427 -0
  224. package/dist/node/features/process-manager.d.ts.map +1 -0
  225. package/dist/node/features/python.d.ts +477 -0
  226. package/dist/node/features/python.d.ts.map +1 -0
  227. package/dist/node/features/redis.d.ts +247 -0
  228. package/dist/node/features/redis.d.ts.map +1 -0
  229. package/dist/node/features/repl.d.ts +84 -0
  230. package/dist/node/features/repl.d.ts.map +1 -0
  231. package/dist/node/features/runpod.d.ts +527 -0
  232. package/dist/node/features/runpod.d.ts.map +1 -0
  233. package/dist/node/features/secure-shell.d.ts +145 -0
  234. package/dist/node/features/secure-shell.d.ts.map +1 -0
  235. package/dist/node/features/semantic-search.d.ts +207 -0
  236. package/dist/node/features/semantic-search.d.ts.map +1 -0
  237. package/dist/node/features/sqlite.d.ts +180 -0
  238. package/dist/node/features/sqlite.d.ts.map +1 -0
  239. package/dist/node/features/telegram.d.ts +173 -0
  240. package/dist/node/features/telegram.d.ts.map +1 -0
  241. package/dist/node/features/transpiler.d.ts +51 -0
  242. package/dist/node/features/transpiler.d.ts.map +1 -0
  243. package/dist/node/features/tts.d.ts +108 -0
  244. package/dist/node/features/tts.d.ts.map +1 -0
  245. package/dist/node/features/ui.d.ts +562 -0
  246. package/dist/node/features/ui.d.ts.map +1 -0
  247. package/dist/node/features/vault.d.ts +90 -0
  248. package/dist/node/features/vault.d.ts.map +1 -0
  249. package/dist/node/features/vm.d.ts +285 -0
  250. package/dist/node/features/vm.d.ts.map +1 -0
  251. package/dist/node/features/yaml-tree.d.ts +118 -0
  252. package/dist/node/features/yaml-tree.d.ts.map +1 -0
  253. package/dist/node/features/yaml.d.ts +127 -0
  254. package/dist/node/features/yaml.d.ts.map +1 -0
  255. package/dist/node.d.ts +67 -0
  256. package/dist/node.d.ts.map +1 -0
  257. package/dist/python/generated.d.ts +2 -0
  258. package/dist/python/generated.d.ts.map +1 -0
  259. package/dist/react/index.d.ts +36 -0
  260. package/dist/react/index.d.ts.map +1 -0
  261. package/dist/registry.d.ts +97 -0
  262. package/dist/registry.d.ts.map +1 -0
  263. package/dist/scaffolds/generated.d.ts +13 -0
  264. package/dist/scaffolds/generated.d.ts.map +1 -0
  265. package/dist/scaffolds/template.d.ts +11 -0
  266. package/dist/scaffolds/template.d.ts.map +1 -0
  267. package/dist/schemas/base.d.ts +254 -0
  268. package/dist/schemas/base.d.ts.map +1 -0
  269. package/dist/selector.d.ts +130 -0
  270. package/dist/selector.d.ts.map +1 -0
  271. package/dist/server.d.ts +89 -0
  272. package/dist/server.d.ts.map +1 -0
  273. package/dist/servers/express.d.ts +104 -0
  274. package/dist/servers/express.d.ts.map +1 -0
  275. package/dist/servers/mcp.d.ts +201 -0
  276. package/dist/servers/mcp.d.ts.map +1 -0
  277. package/dist/servers/socket.d.ts +121 -0
  278. package/dist/servers/socket.d.ts.map +1 -0
  279. package/dist/state.d.ts +24 -0
  280. package/dist/state.d.ts.map +1 -0
  281. package/dist/web/clients/socket.d.ts +37 -0
  282. package/dist/web/clients/socket.d.ts.map +1 -0
  283. package/dist/web/container.d.ts +55 -0
  284. package/dist/web/container.d.ts.map +1 -0
  285. package/dist/web/extension.d.ts +4 -0
  286. package/dist/web/extension.d.ts.map +1 -0
  287. package/dist/web/feature.d.ts +8 -0
  288. package/dist/web/feature.d.ts.map +1 -0
  289. package/dist/web/features/asset-loader.d.ts +35 -0
  290. package/dist/web/features/asset-loader.d.ts.map +1 -0
  291. package/dist/web/features/container-link.d.ts +167 -0
  292. package/dist/web/features/container-link.d.ts.map +1 -0
  293. package/dist/web/features/esbuild.d.ts +51 -0
  294. package/dist/web/features/esbuild.d.ts.map +1 -0
  295. package/dist/web/features/helpers.d.ts +140 -0
  296. package/dist/web/features/helpers.d.ts.map +1 -0
  297. package/dist/web/features/network.d.ts +69 -0
  298. package/dist/web/features/network.d.ts.map +1 -0
  299. package/dist/web/features/speech.d.ts +71 -0
  300. package/dist/web/features/speech.d.ts.map +1 -0
  301. package/dist/web/features/vault.d.ts +62 -0
  302. package/dist/web/features/vault.d.ts.map +1 -0
  303. package/dist/web/features/vm.d.ts +48 -0
  304. package/dist/web/features/vm.d.ts.map +1 -0
  305. package/dist/web/features/voice-recognition.d.ts +96 -0
  306. package/dist/web/features/voice-recognition.d.ts.map +1 -0
  307. package/dist/web/shims/isomorphic-vm.d.ts +22 -0
  308. package/dist/web/shims/isomorphic-vm.d.ts.map +1 -0
  309. package/index.html +1457 -0
  310. package/index.ts +1 -0
  311. package/install.sh +84 -0
  312. package/luca.cli.ts +16 -0
  313. package/luca.console.ts +9 -0
  314. package/main.py +6 -0
  315. package/package.json +219 -58
  316. package/public/index.html +1457 -0
  317. package/public/slides-ai-native.html +902 -0
  318. package/public/slides-intro.html +974 -0
  319. package/pyproject.toml +7 -0
  320. package/scripts/build-web.ts +28 -0
  321. package/scripts/examples/ask-luca-expert.ts +42 -0
  322. package/scripts/examples/assistant-questions.ts +12 -0
  323. package/scripts/examples/excalidraw-expert.ts +75 -0
  324. package/scripts/examples/expert-chat.ts +0 -0
  325. package/scripts/examples/file-manager.ts +14 -0
  326. package/scripts/examples/ideas.ts +12 -0
  327. package/scripts/examples/interactive-chat.ts +20 -0
  328. package/scripts/examples/openai-tool-calls.ts +113 -0
  329. package/scripts/examples/opening-a-web-browser.ts +5 -0
  330. package/scripts/examples/telegram-bot.ts +79 -0
  331. package/scripts/examples/using-assistant-with-mcp.ts +555 -0
  332. package/scripts/examples/using-claude-code.ts +10 -0
  333. package/scripts/examples/using-contentdb.ts +35 -0
  334. package/scripts/examples/using-conversations.ts +35 -0
  335. package/scripts/examples/using-disk-cache.ts +10 -0
  336. package/scripts/examples/using-docker-shell.ts +75 -0
  337. package/scripts/examples/using-elevenlabs.ts +25 -0
  338. package/scripts/examples/using-google-calendar.ts +57 -0
  339. package/scripts/examples/using-google-docs.ts +74 -0
  340. package/scripts/examples/using-google-drive.ts +74 -0
  341. package/scripts/examples/using-google-sheets.ts +89 -0
  342. package/scripts/examples/using-nlp.ts +55 -0
  343. package/scripts/examples/using-ollama.ts +11 -0
  344. package/scripts/examples/using-postgres.ts +55 -0
  345. package/scripts/examples/using-runpod.ts +32 -0
  346. package/scripts/examples/using-tts.ts +40 -0
  347. package/scripts/scaffold.ts +391 -0
  348. package/scripts/scratch.ts +15 -0
  349. package/scripts/stamp-build.sh +12 -0
  350. package/scripts/test-assistant-hooks.ts +13 -0
  351. package/scripts/test-docs-reader.ts +10 -0
  352. package/scripts/test-linux-binary.sh +80 -0
  353. package/scripts/update-introspection-data.ts +58 -0
  354. package/src/agi/README.md +14 -0
  355. package/src/agi/container.server.ts +156 -0
  356. package/src/agi/feature.ts +13 -0
  357. package/src/agi/features/agent-memory.ts +694 -0
  358. package/src/agi/features/assistant.ts +1653 -0
  359. package/src/agi/features/assistants-manager.ts +534 -0
  360. package/src/agi/features/autonomous-assistant.ts +431 -0
  361. package/src/agi/features/browser-use.ts +672 -0
  362. package/src/agi/features/claude-code.ts +1584 -0
  363. package/src/agi/features/coding-tools.ts +175 -0
  364. package/src/agi/features/conversation-history.ts +672 -0
  365. package/src/agi/features/conversation.ts +1494 -0
  366. package/src/agi/features/docs-reader.ts +167 -0
  367. package/src/agi/features/file-tools.ts +340 -0
  368. package/src/agi/features/luca-coder.ts +641 -0
  369. package/src/agi/features/mcp-bridge.ts +532 -0
  370. package/src/agi/features/openai-codex.ts +651 -0
  371. package/src/agi/features/openapi.ts +445 -0
  372. package/src/agi/features/skills-library.ts +557 -0
  373. package/src/agi/index.ts +6 -0
  374. package/src/agi/lib/interceptor-chain.ts +89 -0
  375. package/src/agi/lib/token-counter.ts +202 -0
  376. package/src/bootstrap/generated.ts +9791 -0
  377. package/src/browser.ts +25 -0
  378. package/src/bus.ts +122 -0
  379. package/src/cli/build-info.ts +4 -0
  380. package/src/cli/cli.ts +355 -0
  381. package/src/client.ts +170 -0
  382. package/src/clients/civitai/index.ts +537 -0
  383. package/src/clients/client-template.ts +41 -0
  384. package/src/clients/comfyui/index.ts +604 -0
  385. package/src/clients/elevenlabs/index.ts +317 -0
  386. package/src/clients/graph.ts +87 -0
  387. package/src/clients/openai/index.ts +456 -0
  388. package/src/clients/rest.ts +207 -0
  389. package/src/clients/supabase/index.ts +357 -0
  390. package/src/clients/voicebox/index.ts +300 -0
  391. package/src/clients/websocket.ts +251 -0
  392. package/src/command.ts +506 -0
  393. package/src/commands/bootstrap.ts +244 -0
  394. package/src/commands/chat.ts +309 -0
  395. package/src/commands/code.ts +371 -0
  396. package/src/commands/console.ts +189 -0
  397. package/src/commands/describe.ts +243 -0
  398. package/src/commands/eval.ts +67 -0
  399. package/src/commands/help.ts +240 -0
  400. package/src/commands/index.ts +19 -0
  401. package/src/commands/introspect.ts +218 -0
  402. package/src/commands/mcp.ts +64 -0
  403. package/src/commands/prompt.ts +1014 -0
  404. package/src/commands/run.ts +278 -0
  405. package/src/commands/sandbox-mcp.ts +343 -0
  406. package/src/commands/save-api-docs.ts +51 -0
  407. package/src/commands/scaffold.ts +225 -0
  408. package/src/commands/select.ts +99 -0
  409. package/src/commands/serve.ts +208 -0
  410. package/src/container-describer.ts +1091 -0
  411. package/src/container.ts +1199 -0
  412. package/src/endpoint.ts +365 -0
  413. package/src/entity.ts +173 -0
  414. package/src/feature.ts +118 -0
  415. package/src/graft.ts +181 -0
  416. package/src/hash-object.ts +97 -0
  417. package/src/helper.ts +849 -0
  418. package/src/introspection/generated.agi.ts +41200 -0
  419. package/src/introspection/generated.node.ts +28773 -0
  420. package/src/introspection/generated.web.ts +2272 -0
  421. package/src/introspection/index.ts +296 -0
  422. package/src/introspection/scan.ts +1136 -0
  423. package/src/node/container.ts +409 -0
  424. package/src/node/feature.ts +13 -0
  425. package/src/node/features/container-link.ts +559 -0
  426. package/src/node/features/content-db.ts +849 -0
  427. package/src/node/features/disk-cache.ts +388 -0
  428. package/src/node/features/display-result.ts +57 -0
  429. package/src/node/features/dns.ts +669 -0
  430. package/src/node/features/docker.ts +921 -0
  431. package/src/node/features/downloader.ts +79 -0
  432. package/src/node/features/figlet-fonts.ts +600 -0
  433. package/src/node/features/file-manager.ts +535 -0
  434. package/src/node/features/fs.ts +1050 -0
  435. package/src/node/features/git.ts +592 -0
  436. package/src/node/features/google-auth.ts +504 -0
  437. package/src/node/features/google-calendar.ts +306 -0
  438. package/src/node/features/google-docs.ts +412 -0
  439. package/src/node/features/google-drive.ts +346 -0
  440. package/src/node/features/google-mail.ts +540 -0
  441. package/src/node/features/google-sheets.ts +286 -0
  442. package/src/node/features/grep.ts +427 -0
  443. package/src/node/features/helpers.ts +762 -0
  444. package/src/node/features/ink.ts +490 -0
  445. package/src/node/features/ipc-socket.ts +649 -0
  446. package/src/node/features/json-tree.ts +170 -0
  447. package/src/node/features/networking.ts +961 -0
  448. package/src/node/features/nlp.ts +212 -0
  449. package/src/node/features/opener.ts +180 -0
  450. package/src/node/features/os.ts +403 -0
  451. package/src/node/features/package-finder.ts +540 -0
  452. package/src/node/features/postgres.ts +289 -0
  453. package/src/node/features/proc.ts +503 -0
  454. package/src/node/features/process-manager.ts +844 -0
  455. package/src/node/features/python.ts +912 -0
  456. package/src/node/features/redis.ts +446 -0
  457. package/src/node/features/repl.ts +212 -0
  458. package/src/node/features/runpod.ts +811 -0
  459. package/src/node/features/secure-shell.ts +261 -0
  460. package/src/node/features/semantic-search.ts +935 -0
  461. package/src/node/features/sqlite.ts +289 -0
  462. package/src/node/features/telegram.ts +343 -0
  463. package/src/node/features/transpiler.ts +160 -0
  464. package/src/node/features/tts.ts +185 -0
  465. package/src/node/features/ui.ts +791 -0
  466. package/src/node/features/vault.ts +153 -0
  467. package/src/node/features/vm.ts +462 -0
  468. package/src/node/features/yaml-tree.ts +148 -0
  469. package/src/node/features/yaml.ts +133 -0
  470. package/src/node.ts +76 -0
  471. package/src/python/bridge.py +220 -0
  472. package/src/python/generated.ts +226 -0
  473. package/src/react/index.ts +175 -0
  474. package/src/registry.ts +210 -0
  475. package/src/scaffolds/generated.ts +1814 -0
  476. package/src/scaffolds/template.ts +46 -0
  477. package/src/schemas/base.ts +296 -0
  478. package/src/selector.ts +352 -0
  479. package/src/server.ts +229 -0
  480. package/src/servers/express.ts +283 -0
  481. package/src/servers/mcp.ts +802 -0
  482. package/src/servers/socket.ts +258 -0
  483. package/src/state.ts +101 -0
  484. package/src/web/clients/socket.ts +99 -0
  485. package/src/web/container.ts +75 -0
  486. package/src/web/extension.ts +30 -0
  487. package/src/web/feature.ts +12 -0
  488. package/src/web/features/asset-loader.ts +72 -0
  489. package/src/web/features/container-link.ts +382 -0
  490. package/src/web/features/esbuild.ts +93 -0
  491. package/src/web/features/helpers.ts +291 -0
  492. package/src/web/features/network.ts +85 -0
  493. package/src/web/features/speech.ts +104 -0
  494. package/src/web/features/vault.ts +207 -0
  495. package/src/web/features/vm.ts +85 -0
  496. package/src/web/features/voice-recognition.ts +161 -0
  497. package/src/web/shims/isomorphic-vm.ts +149 -0
  498. package/tsconfig.build.json +12 -0
  499. package/tsconfig.json +58 -0
  500. package/uv.lock +8 -0
  501. package/LICENSE +0 -21
  502. package/dist/cli/cli.js +0 -48
  503. package/dist/cli/common.d.ts +0 -2
  504. package/dist/cli/common.js +0 -6
  505. package/dist/cli/index.d.ts +0 -2
  506. package/dist/cli/index.js +0 -5
  507. package/dist/cli/run.d.ts +0 -1
  508. package/dist/cli/run.js +0 -38
  509. package/dist/core/index.d.ts +0 -4
  510. package/dist/core/index.js +0 -32
  511. package/dist/core/read.d.ts +0 -2
  512. package/dist/core/read.js +0 -29
  513. package/dist/core/request.d.ts +0 -1
  514. package/dist/core/request.js +0 -2
  515. package/dist/core/write.d.ts +0 -2
  516. package/dist/core/write.js +0 -21
  517. package/dist/index.d.ts +0 -1
  518. package/dist/index.js +0 -5
  519. package/dist/utils/common.d.ts +0 -9
  520. package/dist/utils/common.js +0 -57
  521. package/dist/utils/consts.d.ts +0 -3
  522. package/dist/utils/consts.js +0 -11
  523. package/dist/utils/dict.d.ts +0 -1
  524. package/dist/utils/dict.js +0 -7
  525. package/dist/utils/index.d.ts +0 -5
  526. package/dist/utils/index.js +0 -21
  527. package/dist/utils/log.d.ts +0 -1
  528. package/dist/utils/log.js +0 -5
  529. package/dist/utils/types.d.ts +0 -1
  530. package/dist/utils/types.js +0 -2
  531. package/dist/utils/utils.test.d.ts +0 -1
  532. package/dist/utils/utils.test.js +0 -7
@@ -0,0 +1,503 @@
1
+ import { Feature } from "../feature.js";
2
+ import { FeatureStateSchema, FeatureOptionsSchema } from '../../schemas/base.js'
3
+ import { execSync, spawn as nodeSpawn } from "child_process";
4
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync } from "fs";
5
+ import { dirname, resolve } from "path";
6
+ import * as asyncProc from "child-process-promise";
7
+
8
+ interface SpawnOptions {
9
+ /** Standard I/O mode for the child process */
10
+ stdio?: "ignore" | "inherit";
11
+ /** Stdout mode for the child process */
12
+ stdout?: "ignore" | "inherit";
13
+ /** Stderr mode for the child process */
14
+ stderr?: "ignore" | "inherit";
15
+ /** Working directory for the child process */
16
+ cwd?: string;
17
+ /** Environment variables to pass to the child process */
18
+ environment?: Record<string, any>;
19
+ /** Callback invoked when stderr data is received */
20
+ onError?: (data: string) => void;
21
+ /** Callback invoked when stdout data is received */
22
+ onOutput?: (data: string) => void;
23
+ /** Callback invoked when the process exits */
24
+ onExit?: (code: number) => void;
25
+ /** Callback invoked when the process starts */
26
+ onStart?: (childProcess: ChildProcess) => void;
27
+ }
28
+
29
+ interface RawSpawnOptions {
30
+ /** Working directory for the child process */
31
+ cwd?: string;
32
+ /** Environment variables to pass to the child process */
33
+ environment?: Record<string, any>;
34
+ /** Optional stdin payload written immediately after spawn */
35
+ stdin?: string | Buffer;
36
+ /** Stdout mode for the child process */
37
+ stdout?: "pipe" | "inherit" | "ignore";
38
+ /** Stderr mode for the child process */
39
+ stderr?: "pipe" | "inherit" | "ignore";
40
+ }
41
+
42
+ /**
43
+ * The ChildProcess feature provides utilities for executing external processes and commands.
44
+ *
45
+ * This feature wraps Node.js child process functionality to provide convenient methods
46
+ * for executing shell commands, spawning processes, and capturing their output.
47
+ * It supports both synchronous and asynchronous execution with various options.
48
+ *
49
+ * @example
50
+ * ```typescript
51
+ * const proc = container.feature('proc')
52
+ *
53
+ * // Execute a simple command synchronously
54
+ * const result = proc.exec('echo "Hello World"')
55
+ * console.log(result) // 'Hello World'
56
+ *
57
+ * // Execute and capture output asynchronously
58
+ * const { stdout, stderr } = await proc.spawnAndCapture('npm', ['--version'])
59
+ * console.log(`npm version: ${stdout}`)
60
+ *
61
+ * // Execute with callbacks for real-time output
62
+ * await proc.spawnAndCapture('npm', ['install'], {
63
+ * onOutput: (data) => console.log('OUT:', data),
64
+ * onError: (data) => console.log('ERR:', data)
65
+ * })
66
+ * ```
67
+ *
68
+ * @extends Feature
69
+ */
70
+ export class ChildProcess extends Feature {
71
+ static override shortcut = "features.proc" as const
72
+ static override stateSchema = FeatureStateSchema
73
+ static override optionsSchema = FeatureOptionsSchema
74
+ // @ts-ignore TODO: fix this
75
+ static { Feature.register(this, 'proc') }
76
+
77
+ /**
78
+ * Executes a command string and captures its output asynchronously.
79
+ *
80
+ * This method takes a complete command string, splits it into command and arguments,
81
+ * and executes it using the spawnAndCapture method. It's a convenient wrapper
82
+ * for simple command execution.
83
+ *
84
+ * @param {string} cmd - The complete command string to execute (e.g., "git status --porcelain")
85
+ * @param {any} [options] - Options to pass to the underlying spawn process
86
+ * @returns {Promise<object>} Promise resolving to execution result with stdout, stderr, exitCode, pid, and error
87
+ *
88
+ * @example
89
+ * ```typescript
90
+ * // Execute a git command
91
+ * const result = await proc.execAndCapture('git status --porcelain')
92
+ * if (result.exitCode === 0) {
93
+ * console.log('Git status:', result.stdout)
94
+ * } else {
95
+ * console.error('Git error:', result.stderr)
96
+ * }
97
+ *
98
+ * // Execute with options
99
+ * const result = await proc.execAndCapture('npm list --depth=0', {
100
+ * cwd: '/path/to/project'
101
+ * })
102
+ * ```
103
+ */
104
+ async execAndCapture(
105
+ cmd: string,
106
+ options?: any
107
+ ): Promise<{
108
+ stderr: string;
109
+ stdout: string;
110
+ error: null | any;
111
+ exitCode: number;
112
+ pid: number | null;
113
+ }> {
114
+ const [command, ...args] = cmd.split(" ");
115
+ return this.spawnAndCapture(command!, args, options);
116
+ }
117
+
118
+ /**
119
+ * Spawns a process and captures its output with real-time monitoring capabilities.
120
+ *
121
+ * This method provides comprehensive process execution with the ability to capture
122
+ * output, monitor real-time data streams, and handle process lifecycle events.
123
+ * It's ideal for long-running processes where you need to capture output as it happens.
124
+ *
125
+ * @param {string} command - The command to execute (e.g., 'node', 'npm', 'git')
126
+ * @param {string[]} args - Array of arguments to pass to the command
127
+ * @param {SpawnOptions} [options] - Options for process execution and monitoring
128
+ * @param {string} [options.cwd] - Working directory for the process
129
+ * @param {Function} [options.onOutput] - Callback for stdout data
130
+ * @param {Function} [options.onError] - Callback for stderr data
131
+ * @param {Function} [options.onExit] - Callback for process exit
132
+ * @returns {Promise<object>} Promise resolving to complete execution result
133
+ *
134
+ * @example
135
+ * ```typescript
136
+ * // Basic usage
137
+ * const result = await proc.spawnAndCapture('node', ['--version'])
138
+ * console.log(`Node version: ${result.stdout}`)
139
+ *
140
+ * // With real-time output monitoring
141
+ * const result = await proc.spawnAndCapture('npm', ['install'], {
142
+ * onOutput: (data) => console.log('📦 ', data.trim()),
143
+ * onError: (data) => console.error('❌ ', data.trim()),
144
+ * onExit: (code) => console.log(`Process exited with code ${code}`)
145
+ * })
146
+ *
147
+ * // Long-running process with custom working directory
148
+ * const buildResult = await proc.spawnAndCapture('npm', ['run', 'build'], {
149
+ * cwd: '/path/to/project',
150
+ * onOutput: (data) => {
151
+ * if (data.includes('error')) {
152
+ * console.error('Build error detected:', data)
153
+ * }
154
+ * }
155
+ * })
156
+ * ```
157
+ */
158
+ async spawnAndCapture(
159
+ command: string,
160
+ args: string[],
161
+ options?: SpawnOptions
162
+ ): Promise<{
163
+ stderr: string;
164
+ stdout: string;
165
+ error: null | any;
166
+ exitCode: number;
167
+ pid: number | null;
168
+ }> {
169
+ let stderr = "";
170
+ let stdout = "";
171
+ let pid: number | null = null;
172
+ let exitCode: number = 0;
173
+ let error: any = null;
174
+
175
+ const {
176
+ cwd = this.container.cwd,
177
+ onError = (data: string) => {},
178
+ onOutput = (data: string) => {},
179
+ onExit = (code: number) => {}
180
+ } = options || {};
181
+
182
+ const proc = asyncProc.spawn(command, args, {
183
+ ...options,
184
+ cwd,
185
+ });
186
+
187
+ const childProcess = proc.childProcess!;
188
+
189
+ if (typeof options?.onStart === 'function') {
190
+ options.onStart(childProcess as any)
191
+ }
192
+
193
+ if (childProcess.stdout && childProcess.stderr) {
194
+ childProcess.stdout.on("data", (buf: Buffer) => {
195
+ stdout = stdout + buf.toString();
196
+ onOutput(buf.toString());
197
+ });
198
+
199
+ childProcess.stderr.on("data", (buf: Buffer) => {
200
+ stderr = stderr + buf.toString();
201
+ onError(buf.toString());
202
+ });
203
+ } else {
204
+ throw new Error(`Unable to spawn process ${command}`);
205
+ }
206
+
207
+ if (typeof childProcess.exitCode === "number") {
208
+ exitCode = childProcess.exitCode;
209
+ }
210
+
211
+ if (typeof childProcess.pid === "number") {
212
+ pid = childProcess.pid;
213
+ }
214
+
215
+ await proc.catch((err: any) => {
216
+ error = err;
217
+ });
218
+
219
+ onExit(exitCode)
220
+
221
+ return {
222
+ stderr,
223
+ stdout,
224
+ exitCode,
225
+ pid,
226
+ error,
227
+ };
228
+ }
229
+
230
+ /**
231
+ * Spawn a raw child process and return the handle immediately.
232
+ *
233
+ * Useful when callers need streaming access to stdout/stderr and
234
+ * direct lifecycle control (for example, cancellation via kill()).
235
+ */
236
+ spawn(command: string, args: string[] = [], options: RawSpawnOptions = {}): import('child_process').ChildProcess {
237
+ const cwd = options.cwd ?? this.container.cwd
238
+ const stdout = options.stdout ?? 'pipe'
239
+ const stderr = options.stderr ?? 'pipe'
240
+ const child = nodeSpawn(command, args, {
241
+ cwd,
242
+ env: { ...process.env, ...(options.environment ?? {}) },
243
+ stdio: ['pipe', stdout, stderr],
244
+ })
245
+
246
+ if (options.stdin != null && child.stdin) {
247
+ child.stdin.write(options.stdin)
248
+ child.stdin.end()
249
+ }
250
+
251
+ return child
252
+ }
253
+
254
+
255
+
256
+ /**
257
+ * Execute a command synchronously and return its output.
258
+ *
259
+ * Runs a shell command and waits for it to complete before returning.
260
+ * Useful for simple commands where you need the result immediately.
261
+ *
262
+ * @param command - The command to execute
263
+ * @param options - Options for command execution (cwd, encoding, etc.)
264
+ * @returns The trimmed stdout from the command execution
265
+ * @throws If the command fails or returns non-zero exit code
266
+ *
267
+ * @example
268
+ * ```typescript
269
+ * const branch = proc.exec('git branch --show-current')
270
+ * const version = proc.exec('node --version')
271
+ * ```
272
+ */
273
+ exec(command: string, options?: any): string {
274
+ return execSync(command, {
275
+ cwd: this.container.cwd,
276
+ stdio: ['pipe', 'pipe', 'pipe'],
277
+ ...options,
278
+ })
279
+ .toString()
280
+ .trim();
281
+ }
282
+
283
+ execSync(command: string, options?: any): string {
284
+ return this.exec(command,options)
285
+ }
286
+
287
+ /**
288
+ * Establishes a PID-file lock to prevent duplicate process instances.
289
+ *
290
+ * Writes the current process PID to the given file path. If the file already exists
291
+ * and the PID inside it refers to a running process, the current process exits immediately.
292
+ * Stale PID files (where the process is no longer running) are automatically cleaned up.
293
+ *
294
+ * Cleanup handlers are registered on SIGTERM, SIGINT, and process exit to remove the
295
+ * PID file when the process shuts down.
296
+ *
297
+ * @param {string} pidPath - Path to the PID file, resolved relative to container.cwd
298
+ * @returns {{ release: () => void }} Object with a release function to manually remove the lock
299
+ *
300
+ * @example
301
+ * ```typescript
302
+ * // In a command handler — exits if already running
303
+ * const lock = proc.establishLock('tmp/luca-main.pid')
304
+ *
305
+ * // Later, if you need to release manually
306
+ * lock.release()
307
+ * ```
308
+ */
309
+ establishLock(pidPath: string): { release: () => void } {
310
+ const fullPath = resolve(this.container.cwd, pidPath)
311
+
312
+ mkdirSync(dirname(fullPath), { recursive: true })
313
+
314
+ if (existsSync(fullPath)) {
315
+ const existingPid = parseInt(readFileSync(fullPath, 'utf8').trim(), 10)
316
+
317
+ if (!isNaN(existingPid)) {
318
+ try {
319
+ // signal 0 doesn't kill — just checks if process exists
320
+ process.kill(existingPid, 0)
321
+ // Process is alive — bail out
322
+ console.error(`[lock] Process already running (PID ${existingPid}, lock: ${pidPath}). Exiting.`)
323
+ process.exit(1)
324
+ } catch {
325
+ // Process is gone — stale PID file, clean it up
326
+ unlinkSync(fullPath)
327
+ }
328
+ } else {
329
+ // Corrupt PID file — remove it
330
+ unlinkSync(fullPath)
331
+ }
332
+ }
333
+
334
+ // Write our PID
335
+ writeFileSync(fullPath, String(process.pid), 'utf8')
336
+
337
+ let released = false
338
+
339
+ const release = () => {
340
+ if (released) return
341
+ released = true
342
+ try {
343
+ // Only remove if it's still our PID (guard against race)
344
+ if (existsSync(fullPath)) {
345
+ const contents = readFileSync(fullPath, 'utf8').trim()
346
+ if (contents === String(process.pid)) {
347
+ unlinkSync(fullPath)
348
+ }
349
+ }
350
+ } catch {
351
+ // Best effort — process is dying anyway
352
+ }
353
+ }
354
+
355
+ process.on('SIGTERM', release)
356
+ process.on('SIGINT', release)
357
+ process.on('exit', release)
358
+
359
+ return { release }
360
+ }
361
+
362
+ /**
363
+ * Kills a process by its PID.
364
+ *
365
+ * @param {number} pid - The process ID to kill
366
+ * @param {NodeJS.Signals | number} [signal='SIGTERM'] - The signal to send (e.g. 'SIGTERM', 'SIGKILL', 9)
367
+ * @returns {boolean} True if the signal was sent successfully, false if the process was not found
368
+ *
369
+ * @example
370
+ * ```typescript
371
+ * // Gracefully terminate a process
372
+ * proc.kill(12345)
373
+ *
374
+ * // Force kill a process
375
+ * proc.kill(12345, 'SIGKILL')
376
+ * ```
377
+ */
378
+ kill(pid: number, signal: NodeJS.Signals | number = 'SIGTERM'): boolean {
379
+ try {
380
+ process.kill(pid, signal)
381
+ return true
382
+ } catch (err: any) {
383
+ if (err.code === 'ESRCH') return false
384
+ throw err
385
+ }
386
+ }
387
+
388
+ /**
389
+ * Finds PIDs of processes listening on a given port.
390
+ *
391
+ * Uses `lsof` on macOS/Linux to discover which processes have a socket bound to the specified port.
392
+ *
393
+ * @param {number} port - The port number to search for
394
+ * @returns {number[]} Array of PIDs listening on that port (empty if none found)
395
+ *
396
+ * @example
397
+ * ```typescript
398
+ * const pids = proc.findPidsByPort(3000)
399
+ * console.log(`Processes on port 3000: ${pids}`)
400
+ *
401
+ * // Kill everything on port 3000
402
+ * for (const pid of proc.findPidsByPort(3000)) {
403
+ * proc.kill(pid)
404
+ * }
405
+ * ```
406
+ */
407
+ findPidsByPort(port: number): number[] {
408
+ try {
409
+ const isWindows = process.platform === 'win32'
410
+ const cmd = isWindows
411
+ ? `netstat -ano | findstr :${port} | findstr LISTENING`
412
+ : `lsof -ti :${port}`
413
+ const output = execSync(cmd, { stdio: ['pipe', 'pipe', 'pipe'] })
414
+ .toString()
415
+ .trim()
416
+
417
+ if (!output) return []
418
+
419
+ if (isWindows) {
420
+ // netstat lines end with the PID: " TCP 0.0.0.0:3000 0.0.0.0:0 LISTENING 1234"
421
+ return [...new Set(
422
+ output.split(/\r?\n/).map((line) => {
423
+ const parts = line.trim().split(/\s+/)
424
+ return parseInt(parts[parts.length - 1]!, 10)
425
+ }).filter((pid) => !isNaN(pid))
426
+ )]
427
+ }
428
+
429
+ return [...new Set(
430
+ output.split(/\r?\n/).map((line) => parseInt(line.trim(), 10)).filter((pid) => !isNaN(pid))
431
+ )]
432
+ } catch {
433
+ return []
434
+ }
435
+ }
436
+
437
+ /**
438
+ * Registers a handler for a process signal (e.g. SIGINT, SIGTERM, SIGUSR1).
439
+ *
440
+ * Returns a cleanup function that removes the listener when called.
441
+ *
442
+ * @param {NodeJS.Signals} signal - The signal name to listen for (e.g. 'SIGINT', 'SIGTERM', 'SIGUSR2')
443
+ * @param {() => void} handler - The function to call when the signal is received
444
+ * @returns {() => void} A function that removes the listener when called
445
+ *
446
+ * @example
447
+ * ```typescript
448
+ * // Graceful shutdown
449
+ * proc.onSignal('SIGTERM', () => {
450
+ * console.log('Shutting down gracefully...')
451
+ * process.exit(0)
452
+ * })
453
+ *
454
+ * // Remove the listener later
455
+ * const off = proc.onSignal('SIGUSR2', () => {
456
+ * console.log('Received SIGUSR2')
457
+ * })
458
+ * off()
459
+ * ```
460
+ */
461
+ /**
462
+ * Checks whether any process matching a given name is currently running.
463
+ *
464
+ * Uses `pgrep -x` for an exact match against process names.
465
+ *
466
+ * @param {string} name - The process name to look for (e.g. 'afplay', 'node', 'nginx')
467
+ * @returns {boolean} True if at least one matching process is running
468
+ *
469
+ * @example
470
+ * ```typescript
471
+ * if (proc.isProcessRunning('afplay')) {
472
+ * console.log('Audio is currently playing')
473
+ * }
474
+ * ```
475
+ */
476
+ isProcessRunning(name: string): boolean {
477
+ try {
478
+ const isWindows = process.platform === 'win32'
479
+ const cmd = isWindows
480
+ ? `tasklist /FI "IMAGENAME eq ${name}" /NH`
481
+ : `pgrep -x ${name}`
482
+ const output = execSync(cmd, { stdio: ['pipe', 'pipe', 'pipe'] })
483
+ .toString()
484
+ .trim()
485
+
486
+ if (isWindows) {
487
+ // tasklist returns "INFO: No tasks are running..." when not found
488
+ return !output.toLowerCase().includes('no tasks') && output.length > 0
489
+ }
490
+
491
+ return output.length > 0
492
+ } catch {
493
+ return false
494
+ }
495
+ }
496
+
497
+ onSignal(signal: NodeJS.Signals, handler: () => void): () => void {
498
+ process.on(signal, handler)
499
+ return () => process.removeListener(signal, handler)
500
+ }
501
+ }
502
+
503
+ export default ChildProcess