@fraziym/axoniz 0.1.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 (512) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +76 -0
  3. package/dist/agents/definition.d.ts +15 -0
  4. package/dist/agents/definition.d.ts.map +1 -0
  5. package/dist/agents/definition.js +41 -0
  6. package/dist/agents/definition.js.map +1 -0
  7. package/dist/agents/index.d.ts +12 -0
  8. package/dist/agents/index.d.ts.map +1 -0
  9. package/dist/agents/index.js +11 -0
  10. package/dist/agents/index.js.map +1 -0
  11. package/dist/agents/registry.d.ts +17 -0
  12. package/dist/agents/registry.d.ts.map +1 -0
  13. package/dist/agents/registry.js +23 -0
  14. package/dist/agents/registry.js.map +1 -0
  15. package/dist/agents/specialized.d.ts +31 -0
  16. package/dist/agents/specialized.d.ts.map +1 -0
  17. package/dist/agents/specialized.js +75 -0
  18. package/dist/agents/specialized.js.map +1 -0
  19. package/dist/awareness/index.d.ts +14 -0
  20. package/dist/awareness/index.d.ts.map +1 -0
  21. package/dist/awareness/index.js +22 -0
  22. package/dist/awareness/index.js.map +1 -0
  23. package/dist/awareness/service.d.ts +180 -0
  24. package/dist/awareness/service.d.ts.map +1 -0
  25. package/dist/awareness/service.js +789 -0
  26. package/dist/awareness/service.js.map +1 -0
  27. package/dist/cli/entry.d.ts +13 -0
  28. package/dist/cli/entry.d.ts.map +1 -0
  29. package/dist/cli/entry.js +35 -0
  30. package/dist/cli/entry.js.map +1 -0
  31. package/dist/comms/telegram.d.ts +41 -0
  32. package/dist/comms/telegram.d.ts.map +1 -0
  33. package/dist/comms/telegram.js +332 -0
  34. package/dist/comms/telegram.js.map +1 -0
  35. package/dist/core/agent.d.ts +252 -0
  36. package/dist/core/agent.d.ts.map +1 -0
  37. package/dist/core/agent.js +1399 -0
  38. package/dist/core/agent.js.map +1 -0
  39. package/dist/core/auth.d.ts +23 -0
  40. package/dist/core/auth.d.ts.map +1 -0
  41. package/dist/core/auth.js +113 -0
  42. package/dist/core/auth.js.map +1 -0
  43. package/dist/core/authority.d.ts +118 -0
  44. package/dist/core/authority.d.ts.map +1 -0
  45. package/dist/core/authority.js +402 -0
  46. package/dist/core/authority.js.map +1 -0
  47. package/dist/core/backend/async_queue.d.ts +17 -0
  48. package/dist/core/backend/async_queue.d.ts.map +1 -0
  49. package/dist/core/backend/async_queue.js +66 -0
  50. package/dist/core/backend/async_queue.js.map +1 -0
  51. package/dist/core/backend/index.d.ts +24 -0
  52. package/dist/core/backend/index.d.ts.map +1 -0
  53. package/dist/core/backend/index.js +128 -0
  54. package/dist/core/backend/index.js.map +1 -0
  55. package/dist/core/backend/llama_server.d.ts +39 -0
  56. package/dist/core/backend/llama_server.d.ts.map +1 -0
  57. package/dist/core/backend/llama_server.js +182 -0
  58. package/dist/core/backend/llama_server.js.map +1 -0
  59. package/dist/core/backend/llamacpp.d.ts +40 -0
  60. package/dist/core/backend/llamacpp.d.ts.map +1 -0
  61. package/dist/core/backend/llamacpp.js +200 -0
  62. package/dist/core/backend/llamacpp.js.map +1 -0
  63. package/dist/core/backend/lmstudio.d.ts +53 -0
  64. package/dist/core/backend/lmstudio.d.ts.map +1 -0
  65. package/dist/core/backend/lmstudio.js +274 -0
  66. package/dist/core/backend/lmstudio.js.map +1 -0
  67. package/dist/core/backend/ollama.d.ts +25 -0
  68. package/dist/core/backend/ollama.d.ts.map +1 -0
  69. package/dist/core/backend/ollama.js +86 -0
  70. package/dist/core/backend/ollama.js.map +1 -0
  71. package/dist/core/backend/openai.d.ts +27 -0
  72. package/dist/core/backend/openai.d.ts.map +1 -0
  73. package/dist/core/backend/openai.js +84 -0
  74. package/dist/core/backend/openai.js.map +1 -0
  75. package/dist/core/backend/types.d.ts +73 -0
  76. package/dist/core/backend/types.d.ts.map +1 -0
  77. package/dist/core/backend/types.js +137 -0
  78. package/dist/core/backend/types.js.map +1 -0
  79. package/dist/core/chat_store.d.ts +77 -0
  80. package/dist/core/chat_store.d.ts.map +1 -0
  81. package/dist/core/chat_store.js +332 -0
  82. package/dist/core/chat_store.js.map +1 -0
  83. package/dist/core/cli.d.ts +82 -0
  84. package/dist/core/cli.d.ts.map +1 -0
  85. package/dist/core/cli.js +602 -0
  86. package/dist/core/cli.js.map +1 -0
  87. package/dist/core/config.d.ts +127 -0
  88. package/dist/core/config.d.ts.map +1 -0
  89. package/dist/core/config.js +295 -0
  90. package/dist/core/config.js.map +1 -0
  91. package/dist/core/debug.d.ts +8 -0
  92. package/dist/core/debug.d.ts.map +1 -0
  93. package/dist/core/debug.js +8 -0
  94. package/dist/core/debug.js.map +1 -0
  95. package/dist/core/downloader.d.ts +31 -0
  96. package/dist/core/downloader.d.ts.map +1 -0
  97. package/dist/core/downloader.js +180 -0
  98. package/dist/core/downloader.js.map +1 -0
  99. package/dist/core/errors.d.ts +80 -0
  100. package/dist/core/errors.d.ts.map +1 -0
  101. package/dist/core/errors.js +134 -0
  102. package/dist/core/errors.js.map +1 -0
  103. package/dist/core/extras.d.ts +160 -0
  104. package/dist/core/extras.d.ts.map +1 -0
  105. package/dist/core/extras.js +553 -0
  106. package/dist/core/extras.js.map +1 -0
  107. package/dist/core/health.d.ts +27 -0
  108. package/dist/core/health.d.ts.map +1 -0
  109. package/dist/core/health.js +96 -0
  110. package/dist/core/health.js.map +1 -0
  111. package/dist/core/history.d.ts +50 -0
  112. package/dist/core/history.d.ts.map +1 -0
  113. package/dist/core/history.js +276 -0
  114. package/dist/core/history.js.map +1 -0
  115. package/dist/core/index.d.ts +6 -0
  116. package/dist/core/index.d.ts.map +1 -0
  117. package/dist/core/index.js +6 -0
  118. package/dist/core/index.js.map +1 -0
  119. package/dist/core/intelligence/ast_index.d.ts +255 -0
  120. package/dist/core/intelligence/ast_index.d.ts.map +1 -0
  121. package/dist/core/intelligence/ast_index.js +1369 -0
  122. package/dist/core/intelligence/ast_index.js.map +1 -0
  123. package/dist/core/intelligence/confidence.d.ts +113 -0
  124. package/dist/core/intelligence/confidence.d.ts.map +1 -0
  125. package/dist/core/intelligence/confidence.js +298 -0
  126. package/dist/core/intelligence/confidence.js.map +1 -0
  127. package/dist/core/intelligence/context_compressor.d.ts +80 -0
  128. package/dist/core/intelligence/context_compressor.d.ts.map +1 -0
  129. package/dist/core/intelligence/context_compressor.js +245 -0
  130. package/dist/core/intelligence/context_compressor.js.map +1 -0
  131. package/dist/core/intelligence/daemon.d.ts +247 -0
  132. package/dist/core/intelligence/daemon.d.ts.map +1 -0
  133. package/dist/core/intelligence/daemon.js +842 -0
  134. package/dist/core/intelligence/daemon.js.map +1 -0
  135. package/dist/core/intelligence/index.d.ts +60 -0
  136. package/dist/core/intelligence/index.d.ts.map +1 -0
  137. package/dist/core/intelligence/index.js +101 -0
  138. package/dist/core/intelligence/index.js.map +1 -0
  139. package/dist/core/intelligence/predictor.d.ts +246 -0
  140. package/dist/core/intelligence/predictor.d.ts.map +1 -0
  141. package/dist/core/intelligence/predictor.js +590 -0
  142. package/dist/core/intelligence/predictor.js.map +1 -0
  143. package/dist/core/intelligence/reflex.d.ts +84 -0
  144. package/dist/core/intelligence/reflex.d.ts.map +1 -0
  145. package/dist/core/intelligence/reflex.js +344 -0
  146. package/dist/core/intelligence/reflex.js.map +1 -0
  147. package/dist/core/intelligence/self_correction.d.ts +121 -0
  148. package/dist/core/intelligence/self_correction.d.ts.map +1 -0
  149. package/dist/core/intelligence/self_correction.js +327 -0
  150. package/dist/core/intelligence/self_correction.js.map +1 -0
  151. package/dist/core/intelligence/skill_distiller.d.ts +100 -0
  152. package/dist/core/intelligence/skill_distiller.d.ts.map +1 -0
  153. package/dist/core/intelligence/skill_distiller.js +246 -0
  154. package/dist/core/intelligence/skill_distiller.js.map +1 -0
  155. package/dist/core/intelligence/swarm.d.ts +330 -0
  156. package/dist/core/intelligence/swarm.d.ts.map +1 -0
  157. package/dist/core/intelligence/swarm.js +1064 -0
  158. package/dist/core/intelligence/swarm.js.map +1 -0
  159. package/dist/core/intelligence/trajectory.d.ts +107 -0
  160. package/dist/core/intelligence/trajectory.d.ts.map +1 -0
  161. package/dist/core/intelligence/trajectory.js +330 -0
  162. package/dist/core/intelligence/trajectory.js.map +1 -0
  163. package/dist/core/logger.d.ts +111 -0
  164. package/dist/core/logger.d.ts.map +1 -0
  165. package/dist/core/logger.js +640 -0
  166. package/dist/core/logger.js.map +1 -0
  167. package/dist/core/loop.d.ts +123 -0
  168. package/dist/core/loop.d.ts.map +1 -0
  169. package/dist/core/loop.js +423 -0
  170. package/dist/core/loop.js.map +1 -0
  171. package/dist/core/memory.d.ts +81 -0
  172. package/dist/core/memory.d.ts.map +1 -0
  173. package/dist/core/memory.js +328 -0
  174. package/dist/core/memory.js.map +1 -0
  175. package/dist/core/metrics.d.ts +29 -0
  176. package/dist/core/metrics.d.ts.map +1 -0
  177. package/dist/core/metrics.js +109 -0
  178. package/dist/core/metrics.js.map +1 -0
  179. package/dist/core/models.d.ts +51 -0
  180. package/dist/core/models.d.ts.map +1 -0
  181. package/dist/core/models.js +146 -0
  182. package/dist/core/models.js.map +1 -0
  183. package/dist/core/optimizer.d.ts +34 -0
  184. package/dist/core/optimizer.d.ts.map +1 -0
  185. package/dist/core/optimizer.js +131 -0
  186. package/dist/core/optimizer.js.map +1 -0
  187. package/dist/core/persona.d.ts +35 -0
  188. package/dist/core/persona.d.ts.map +1 -0
  189. package/dist/core/persona.js +126 -0
  190. package/dist/core/persona.js.map +1 -0
  191. package/dist/core/rate_limit.d.ts +23 -0
  192. package/dist/core/rate_limit.d.ts.map +1 -0
  193. package/dist/core/rate_limit.js +62 -0
  194. package/dist/core/rate_limit.js.map +1 -0
  195. package/dist/core/runner.d.ts +63 -0
  196. package/dist/core/runner.d.ts.map +1 -0
  197. package/dist/core/runner.js +671 -0
  198. package/dist/core/runner.js.map +1 -0
  199. package/dist/core/stream_parser.d.ts +43 -0
  200. package/dist/core/stream_parser.d.ts.map +1 -0
  201. package/dist/core/stream_parser.js +140 -0
  202. package/dist/core/stream_parser.js.map +1 -0
  203. package/dist/core/tool_schemas.d.ts +26 -0
  204. package/dist/core/tool_schemas.d.ts.map +1 -0
  205. package/dist/core/tool_schemas.js +124 -0
  206. package/dist/core/tool_schemas.js.map +1 -0
  207. package/dist/core/which.d.ts +2 -0
  208. package/dist/core/which.d.ts.map +1 -0
  209. package/dist/core/which.js +35 -0
  210. package/dist/core/which.js.map +1 -0
  211. package/dist/goals/index.d.ts +9 -0
  212. package/dist/goals/index.d.ts.map +1 -0
  213. package/dist/goals/index.js +17 -0
  214. package/dist/goals/index.js.map +1 -0
  215. package/dist/goals/service.d.ts +115 -0
  216. package/dist/goals/service.d.ts.map +1 -0
  217. package/dist/goals/service.js +415 -0
  218. package/dist/goals/service.js.map +1 -0
  219. package/dist/goals/types.d.ts +47 -0
  220. package/dist/goals/types.d.ts.map +1 -0
  221. package/dist/goals/types.js +66 -0
  222. package/dist/goals/types.js.map +1 -0
  223. package/dist/index.d.ts +22 -0
  224. package/dist/index.d.ts.map +1 -0
  225. package/dist/index.js +22 -0
  226. package/dist/index.js.map +1 -0
  227. package/dist/integrations/autonomous_startup.d.ts +51 -0
  228. package/dist/integrations/autonomous_startup.d.ts.map +1 -0
  229. package/dist/integrations/autonomous_startup.js +419 -0
  230. package/dist/integrations/autonomous_startup.js.map +1 -0
  231. package/dist/integrations/goose.d.ts +105 -0
  232. package/dist/integrations/goose.d.ts.map +1 -0
  233. package/dist/integrations/goose.js +408 -0
  234. package/dist/integrations/goose.js.map +1 -0
  235. package/dist/integrations/index.d.ts +21 -0
  236. package/dist/integrations/index.d.ts.map +1 -0
  237. package/dist/integrations/index.js +17 -0
  238. package/dist/integrations/index.js.map +1 -0
  239. package/dist/integrations/mcp.d.ts +73 -0
  240. package/dist/integrations/mcp.d.ts.map +1 -0
  241. package/dist/integrations/mcp.js +307 -0
  242. package/dist/integrations/mcp.js.map +1 -0
  243. package/dist/integrations/mempalace.d.ts +18 -0
  244. package/dist/integrations/mempalace.d.ts.map +1 -0
  245. package/dist/integrations/mempalace.js +25 -0
  246. package/dist/integrations/mempalace.js.map +1 -0
  247. package/dist/integrations/multi_agent.d.ts +82 -0
  248. package/dist/integrations/multi_agent.d.ts.map +1 -0
  249. package/dist/integrations/multi_agent.js +280 -0
  250. package/dist/integrations/multi_agent.js.map +1 -0
  251. package/dist/integrations/unified_memory.d.ts +415 -0
  252. package/dist/integrations/unified_memory.d.ts.map +1 -0
  253. package/dist/integrations/unified_memory.js +1489 -0
  254. package/dist/integrations/unified_memory.js.map +1 -0
  255. package/dist/roles/beru.yaml +48 -0
  256. package/dist/sidecar/client.d.ts +63 -0
  257. package/dist/sidecar/client.d.ts.map +1 -0
  258. package/dist/sidecar/client.js +222 -0
  259. package/dist/sidecar/client.js.map +1 -0
  260. package/dist/sidecar/index.d.ts +7 -0
  261. package/dist/sidecar/index.d.ts.map +1 -0
  262. package/dist/sidecar/index.js +6 -0
  263. package/dist/sidecar/index.js.map +1 -0
  264. package/dist/startup.d.ts +22 -0
  265. package/dist/startup.d.ts.map +1 -0
  266. package/dist/startup.js +194 -0
  267. package/dist/startup.js.map +1 -0
  268. package/dist/tools/_internal.d.ts +90 -0
  269. package/dist/tools/_internal.d.ts.map +1 -0
  270. package/dist/tools/_internal.js +375 -0
  271. package/dist/tools/_internal.js.map +1 -0
  272. package/dist/tools/_smoke.d.ts +2 -0
  273. package/dist/tools/_smoke.d.ts.map +1 -0
  274. package/dist/tools/_smoke.js +203 -0
  275. package/dist/tools/_smoke.js.map +1 -0
  276. package/dist/tools/axodex_tools.d.ts +51 -0
  277. package/dist/tools/axodex_tools.d.ts.map +1 -0
  278. package/dist/tools/axodex_tools.js +181 -0
  279. package/dist/tools/axodex_tools.js.map +1 -0
  280. package/dist/tools/code_tools.d.ts +33 -0
  281. package/dist/tools/code_tools.d.ts.map +1 -0
  282. package/dist/tools/code_tools.js +191 -0
  283. package/dist/tools/code_tools.js.map +1 -0
  284. package/dist/tools/computer_tools.d.ts +59 -0
  285. package/dist/tools/computer_tools.d.ts.map +1 -0
  286. package/dist/tools/computer_tools.js +348 -0
  287. package/dist/tools/computer_tools.js.map +1 -0
  288. package/dist/tools/file_tools.d.ts +51 -0
  289. package/dist/tools/file_tools.d.ts.map +1 -0
  290. package/dist/tools/file_tools.js +424 -0
  291. package/dist/tools/file_tools.js.map +1 -0
  292. package/dist/tools/index.d.ts +13 -0
  293. package/dist/tools/index.d.ts.map +1 -0
  294. package/dist/tools/index.js +13 -0
  295. package/dist/tools/index.js.map +1 -0
  296. package/dist/tools/shell_tools.d.ts +39 -0
  297. package/dist/tools/shell_tools.d.ts.map +1 -0
  298. package/dist/tools/shell_tools.js +163 -0
  299. package/dist/tools/shell_tools.js.map +1 -0
  300. package/dist/tools/web_tools.d.ts +31 -0
  301. package/dist/tools/web_tools.d.ts.map +1 -0
  302. package/dist/tools/web_tools.js +117 -0
  303. package/dist/tools/web_tools.js.map +1 -0
  304. package/dist/voice/index.d.ts +41 -0
  305. package/dist/voice/index.d.ts.map +1 -0
  306. package/dist/voice/index.js +58 -0
  307. package/dist/voice/index.js.map +1 -0
  308. package/dist/voice/light_daemon.d.ts +197 -0
  309. package/dist/voice/light_daemon.d.ts.map +1 -0
  310. package/dist/voice/light_daemon.js +746 -0
  311. package/dist/voice/light_daemon.js.map +1 -0
  312. package/dist/voice/setup.d.ts +63 -0
  313. package/dist/voice/setup.d.ts.map +1 -0
  314. package/dist/voice/setup.js +443 -0
  315. package/dist/voice/setup.js.map +1 -0
  316. package/dist/voice/stt.d.ts +148 -0
  317. package/dist/voice/stt.d.ts.map +1 -0
  318. package/dist/voice/stt.js +361 -0
  319. package/dist/voice/stt.js.map +1 -0
  320. package/dist/voice/tts.d.ts +168 -0
  321. package/dist/voice/tts.d.ts.map +1 -0
  322. package/dist/voice/tts.js +698 -0
  323. package/dist/voice/tts.js.map +1 -0
  324. package/dist/voice/voice_loop.d.ts +101 -0
  325. package/dist/voice/voice_loop.d.ts.map +1 -0
  326. package/dist/voice/voice_loop.js +463 -0
  327. package/dist/voice/voice_loop.js.map +1 -0
  328. package/dist/voice/wake_word.d.ts +153 -0
  329. package/dist/voice/wake_word.d.ts.map +1 -0
  330. package/dist/voice/wake_word.js +458 -0
  331. package/dist/voice/wake_word.js.map +1 -0
  332. package/dist/voice/wav.d.ts +99 -0
  333. package/dist/voice/wav.d.ts.map +1 -0
  334. package/dist/voice/wav.js +306 -0
  335. package/dist/voice/wav.js.map +1 -0
  336. package/dist/web/broker.d.ts +33 -0
  337. package/dist/web/broker.d.ts.map +1 -0
  338. package/dist/web/broker.js +58 -0
  339. package/dist/web/broker.js.map +1 -0
  340. package/dist/web/open_browser.d.ts +2 -0
  341. package/dist/web/open_browser.d.ts.map +1 -0
  342. package/dist/web/open_browser.js +42 -0
  343. package/dist/web/open_browser.js.map +1 -0
  344. package/dist/web/server.d.ts +54 -0
  345. package/dist/web/server.d.ts.map +1 -0
  346. package/dist/web/server.js +831 -0
  347. package/dist/web/server.js.map +1 -0
  348. package/dist/web/static/app.js +4121 -0
  349. package/dist/web/static/index.html +2281 -0
  350. package/dist/web/static/js/MODULE_SUMMARY.md +124 -0
  351. package/dist/web/static/js/a11y.js +165 -0
  352. package/dist/web/static/js/admin.js +2145 -0
  353. package/dist/web/static/js/assistant.js +475 -0
  354. package/dist/web/static/js/calendar/reminders.js +114 -0
  355. package/dist/web/static/js/calendar/utils.js +166 -0
  356. package/dist/web/static/js/calendar.js +3348 -0
  357. package/dist/web/static/js/censor.js +356 -0
  358. package/dist/web/static/js/chat.js +4546 -0
  359. package/dist/web/static/js/chatRenderer.js +2294 -0
  360. package/dist/web/static/js/chatStream.js +276 -0
  361. package/dist/web/static/js/codeRunner.js +398 -0
  362. package/dist/web/static/js/color/hex.js +14 -0
  363. package/dist/web/static/js/colorPicker.js +453 -0
  364. package/dist/web/static/js/compare/icons.js +77 -0
  365. package/dist/web/static/js/compare/index.js +1482 -0
  366. package/dist/web/static/js/compare/models.js +104 -0
  367. package/dist/web/static/js/compare/panes.js +817 -0
  368. package/dist/web/static/js/compare/probe.js +78 -0
  369. package/dist/web/static/js/compare/scoreboard.js +223 -0
  370. package/dist/web/static/js/compare/selector.js +1335 -0
  371. package/dist/web/static/js/compare/state.js +58 -0
  372. package/dist/web/static/js/compare/stream.js +695 -0
  373. package/dist/web/static/js/compare/vote.js +254 -0
  374. package/dist/web/static/js/cookbook-diagnosis.js +694 -0
  375. package/dist/web/static/js/cookbook-hwfit.js +1888 -0
  376. package/dist/web/static/js/cookbook.js +2093 -0
  377. package/dist/web/static/js/cookbookDownload.js +633 -0
  378. package/dist/web/static/js/cookbookProgressSignal.js +29 -0
  379. package/dist/web/static/js/cookbookRunning.js +3506 -0
  380. package/dist/web/static/js/cookbookServe.js +2128 -0
  381. package/dist/web/static/js/document.js +9731 -0
  382. package/dist/web/static/js/documentLibrary.js +3376 -0
  383. package/dist/web/static/js/dragSort.js +265 -0
  384. package/dist/web/static/js/editor/ai-inpaint.js +374 -0
  385. package/dist/web/static/js/editor/ai-models.js +273 -0
  386. package/dist/web/static/js/editor/ai-rembg.js +230 -0
  387. package/dist/web/static/js/editor/ai-tool-runner.js +147 -0
  388. package/dist/web/static/js/editor/ai-tools-misc.js +216 -0
  389. package/dist/web/static/js/editor/build/controls.js +366 -0
  390. package/dist/web/static/js/editor/build/popups.js +112 -0
  391. package/dist/web/static/js/editor/build/right-panel.js +200 -0
  392. package/dist/web/static/js/editor/build/toolbar.js +73 -0
  393. package/dist/web/static/js/editor/build/topbar.js +131 -0
  394. package/dist/web/static/js/editor/build/transform-popup.js +109 -0
  395. package/dist/web/static/js/editor/canvas-coords.js +21 -0
  396. package/dist/web/static/js/editor/canvas-events.js +197 -0
  397. package/dist/web/static/js/editor/canvas-transforms.js +132 -0
  398. package/dist/web/static/js/editor/checkerboard.js +24 -0
  399. package/dist/web/static/js/editor/clipboard-and-drop.js +133 -0
  400. package/dist/web/static/js/editor/composite-helpers.js +83 -0
  401. package/dist/web/static/js/editor/filters/blur.js +118 -0
  402. package/dist/web/static/js/editor/filters/edge-feather.js +70 -0
  403. package/dist/web/static/js/editor/fx/adj-popup.js +677 -0
  404. package/dist/web/static/js/editor/fx/filter-string.js +38 -0
  405. package/dist/web/static/js/editor/fx/histogram.js +67 -0
  406. package/dist/web/static/js/editor/fx/pixel-pass.js +249 -0
  407. package/dist/web/static/js/editor/harmonize-masks.js +116 -0
  408. package/dist/web/static/js/editor/history-panel.js +176 -0
  409. package/dist/web/static/js/editor/keyboard-shortcuts.js +271 -0
  410. package/dist/web/static/js/editor/layer-helpers.js +131 -0
  411. package/dist/web/static/js/editor/layer-panel.js +600 -0
  412. package/dist/web/static/js/editor/mask-utils.js +91 -0
  413. package/dist/web/static/js/editor/shortcuts-popover.js +149 -0
  414. package/dist/web/static/js/editor/slider-ux.js +191 -0
  415. package/dist/web/static/js/editor/snap.js +107 -0
  416. package/dist/web/static/js/editor/state.js +257 -0
  417. package/dist/web/static/js/editor/stroke-pipeline.js +162 -0
  418. package/dist/web/static/js/editor/stroke-tool-sliders.js +64 -0
  419. package/dist/web/static/js/editor/tools/clone.js +81 -0
  420. package/dist/web/static/js/editor/tools/crop.js +137 -0
  421. package/dist/web/static/js/editor/tools/flood-fill.js +72 -0
  422. package/dist/web/static/js/editor/tools/lasso-mask.js +171 -0
  423. package/dist/web/static/js/editor/tools/lasso.js +65 -0
  424. package/dist/web/static/js/editor/tools/move.js +79 -0
  425. package/dist/web/static/js/editor/tools/stroke.js +123 -0
  426. package/dist/web/static/js/editor/tools/transform-drag.js +174 -0
  427. package/dist/web/static/js/editor/tools/transform-handles.js +271 -0
  428. package/dist/web/static/js/editor/tools/transform-session.js +381 -0
  429. package/dist/web/static/js/editor/tools/wand.js +46 -0
  430. package/dist/web/static/js/editor/wire-import.js +148 -0
  431. package/dist/web/static/js/editor/wire-inpaint-controls.js +164 -0
  432. package/dist/web/static/js/editor/wire-merge-buttons.js +103 -0
  433. package/dist/web/static/js/editor/wire-selection-controls.js +170 -0
  434. package/dist/web/static/js/editor/wire-topbar-menus.js +174 -0
  435. package/dist/web/static/js/editor/wire-topbar-overflow.js +49 -0
  436. package/dist/web/static/js/editor/wire-topbar.js +188 -0
  437. package/dist/web/static/js/emailInbox.js +1245 -0
  438. package/dist/web/static/js/emailLibrary/replyRecipients.js +27 -0
  439. package/dist/web/static/js/emailLibrary/signatureFold.js +339 -0
  440. package/dist/web/static/js/emailLibrary/state.js +34 -0
  441. package/dist/web/static/js/emailLibrary/utils.js +202 -0
  442. package/dist/web/static/js/emailLibrary.js +5217 -0
  443. package/dist/web/static/js/emojiPicker.js +311 -0
  444. package/dist/web/static/js/escMenuStack.js +102 -0
  445. package/dist/web/static/js/fileHandler.js +295 -0
  446. package/dist/web/static/js/gallery.js +2835 -0
  447. package/dist/web/static/js/galleryEditor.js +3798 -0
  448. package/dist/web/static/js/group.js +955 -0
  449. package/dist/web/static/js/init.js +405 -0
  450. package/dist/web/static/js/keyboard-shortcuts.js +292 -0
  451. package/dist/web/static/js/langIcons.js +187 -0
  452. package/dist/web/static/js/markdown/tableRow.js +19 -0
  453. package/dist/web/static/js/markdown.js +806 -0
  454. package/dist/web/static/js/memory.js +1418 -0
  455. package/dist/web/static/js/modalManager.js +1552 -0
  456. package/dist/web/static/js/modalSnap.js +782 -0
  457. package/dist/web/static/js/model/matchKey.js +19 -0
  458. package/dist/web/static/js/modelPicker.js +695 -0
  459. package/dist/web/static/js/modelSort.js +33 -0
  460. package/dist/web/static/js/models.js +642 -0
  461. package/dist/web/static/js/notes.js +5054 -0
  462. package/dist/web/static/js/package.json +1 -0
  463. package/dist/web/static/js/platform.js +47 -0
  464. package/dist/web/static/js/presets.js +1110 -0
  465. package/dist/web/static/js/providers.js +93 -0
  466. package/dist/web/static/js/rag.js +177 -0
  467. package/dist/web/static/js/research/jobs.js +335 -0
  468. package/dist/web/static/js/research/panel.js +1233 -0
  469. package/dist/web/static/js/researchSynapse.js +225 -0
  470. package/dist/web/static/js/search-chat.js +201 -0
  471. package/dist/web/static/js/search.js +52 -0
  472. package/dist/web/static/js/section-management.js +260 -0
  473. package/dist/web/static/js/sessions.js +3108 -0
  474. package/dist/web/static/js/settings.js +4991 -0
  475. package/dist/web/static/js/sidebar-layout.js +573 -0
  476. package/dist/web/static/js/signature.js +504 -0
  477. package/dist/web/static/js/skills.js +1908 -0
  478. package/dist/web/static/js/slashAutocomplete.js +267 -0
  479. package/dist/web/static/js/slashCommands.js +6099 -0
  480. package/dist/web/static/js/spinner.js +406 -0
  481. package/dist/web/static/js/storage.js +123 -0
  482. package/dist/web/static/js/tasks.js +2699 -0
  483. package/dist/web/static/js/theme.js +2086 -0
  484. package/dist/web/static/js/tileManager.js +386 -0
  485. package/dist/web/static/js/tourAutoplay.js +133 -0
  486. package/dist/web/static/js/tourHints.js +179 -0
  487. package/dist/web/static/js/tts-ai.js +521 -0
  488. package/dist/web/static/js/ui.js +1288 -0
  489. package/dist/web/static/js/util/ordinal.js +13 -0
  490. package/dist/web/static/js/voiceRecorder.js +283 -0
  491. package/dist/web/static/js/windowDrag.js +326 -0
  492. package/dist/web/static/js/windowResize.js +233 -0
  493. package/dist/web/static/landing.html +824 -0
  494. package/dist/web/static/lib/docx.umd.min.js +20116 -0
  495. package/dist/web/static/lib/highlight.min.js +1213 -0
  496. package/dist/web/static/lib/html2pdf.bundle.min.js +3 -0
  497. package/dist/web/static/lib/mammoth.browser.min.js +21 -0
  498. package/dist/web/static/lib/qrcode.min.js +8 -0
  499. package/dist/web/static/lib/xlsx.full.min.js +24 -0
  500. package/dist/web/static/login.html +582 -0
  501. package/dist/web/static/manifest.json +15 -0
  502. package/dist/web/static/style.css +35733 -0
  503. package/dist/web/static/sw.js +144 -0
  504. package/dist/workflows/engine.d.ts +162 -0
  505. package/dist/workflows/engine.d.ts.map +1 -0
  506. package/dist/workflows/engine.js +625 -0
  507. package/dist/workflows/engine.js.map +1 -0
  508. package/dist/workflows/index.d.ts +8 -0
  509. package/dist/workflows/index.d.ts.map +1 -0
  510. package/dist/workflows/index.js +14 -0
  511. package/dist/workflows/index.js.map +1 -0
  512. package/package.json +112 -0
@@ -0,0 +1,163 @@
1
+ /**
2
+ * AXONIZ ShellTools — Windows-aware shell execution (TypeScript port).
3
+ *
4
+ * Ported from `axoniz/tools/shell_tools.py`. Keeps: unix→windows command
5
+ * translation, output truncation limits, env injection, timeout handling and
6
+ * background process launch.
7
+ *
8
+ * Python-stdlib mapping:
9
+ * subprocess.run(shell=True, capture_output=True, timeout=…) -> runCaptured
10
+ * subprocess.Popen(DEVNULL, CREATE_NO_WINDOW) -> spawn + detached
11
+ * shutil.which -> core whichSync
12
+ * exec(compile(code)) -> a real Python
13
+ * interpreter via `python -c`. This is a Node process, so there is no
14
+ * in-process Python VM; the capability degrades gracefully with a clear
15
+ * string when no interpreter is installed.
16
+ */
17
+ import { spawn } from "node:child_process";
18
+ import os from "node:os";
19
+ import path from "node:path";
20
+ import { whichSync } from "../core/which.js";
21
+ import { errText, execFileCaptured, runCaptured } from "./_internal.js";
22
+ const IS_WINDOWS = process.platform === "win32";
23
+ const MAX_OUTPUT = 8000; // chars, to avoid context overflow
24
+ const _UNIX_TO_WIN = {
25
+ ls: "dir /b",
26
+ cat: "type",
27
+ rm: "del",
28
+ cp: "copy",
29
+ mv: "move",
30
+ grep: "findstr",
31
+ touch: "echo.>",
32
+ clear: "cls",
33
+ pwd: "cd",
34
+ which: "where",
35
+ echo: "echo",
36
+ };
37
+ export class ShellTools {
38
+ workspace;
39
+ constructor(workspace = ".") {
40
+ this.workspace = path.resolve(workspace);
41
+ }
42
+ /** Run a shell command. Windows-aware, auto-translates unix basics. */
43
+ async run(command, timeout = 60, env) {
44
+ let cmd = command.trim();
45
+ if (!cmd)
46
+ return "[ERROR] Empty command";
47
+ if (IS_WINDOWS) {
48
+ const first = (cmd.split(/\s+/)[0] ?? "").toLowerCase();
49
+ let note = "";
50
+ if (Object.prototype.hasOwnProperty.call(_UNIX_TO_WIN, first)) {
51
+ const win = _UNIX_TO_WIN[first];
52
+ // Python's `str.replace(first, win, 1)`: replaces the first occurrence.
53
+ cmd = cmd.replace(first, win);
54
+ note = `[auto] '${first}' → '${win}'\n`;
55
+ }
56
+ const result = await this._runRaw(cmd, timeout, env);
57
+ return note ? note + result : result;
58
+ }
59
+ return this._runRaw(cmd, timeout, env);
60
+ }
61
+ async _runRaw(command, timeout = 60, env) {
62
+ const mergedEnv = { ...process.env };
63
+ if (env)
64
+ Object.assign(mergedEnv, env);
65
+ try {
66
+ const res = await runCaptured(command, {
67
+ cwd: this.workspace,
68
+ env: mergedEnv,
69
+ timeoutMs: Math.max(0, timeout) * 1000,
70
+ });
71
+ if (res.timedOut)
72
+ return `[TIMEOUT] Command killed after ${timeout}s: ${command}`;
73
+ let out = res.stdout.trim();
74
+ let err = res.stderr.trim();
75
+ const code = res.code ?? 0;
76
+ if (out.length > MAX_OUTPUT) {
77
+ // Python re-reads `len(out)` after the slice for the reported total.
78
+ out = out.slice(0, MAX_OUTPUT);
79
+ out = `${out}\n… [truncated, ${out.length} total chars]`;
80
+ }
81
+ if (err.length > 2000) {
82
+ err = `${err.slice(0, 2000)}… [truncated]`;
83
+ }
84
+ const parts = [`$ ${command} [exit ${code}]`];
85
+ if (out)
86
+ parts.push(out);
87
+ if (err)
88
+ parts.push(`stderr: ${err}`);
89
+ if (!out && !err)
90
+ parts.push("(no output)");
91
+ return parts.join("\n");
92
+ }
93
+ catch (e) {
94
+ return `[ERROR] Shell: ${errText(e)}`;
95
+ }
96
+ }
97
+ /** Start a background process (non-blocking). Returns PID. */
98
+ runBg(command) {
99
+ try {
100
+ const child = spawn(command, {
101
+ shell: true,
102
+ cwd: this.workspace,
103
+ stdio: "ignore",
104
+ detached: true,
105
+ windowsHide: true,
106
+ });
107
+ child.unref();
108
+ return `[OK] Background process started pid=${child.pid} cmd=${command}`;
109
+ }
110
+ catch (e) {
111
+ return `[ERROR] Background process failed: ${errText(e)}`;
112
+ }
113
+ }
114
+ /**
115
+ * Execute Python inline, capture output.
116
+ *
117
+ * NOTE: the Python original used in-process `exec()`. A Node process has no
118
+ * Python VM, so the code is handed to an interpreter found on PATH
119
+ * (`python`, then `python3`); if none exists a clear `[PYTHON ERROR]` string
120
+ * is returned rather than throwing.
121
+ */
122
+ async runPython(code) {
123
+ const python = whichSync("python") ?? whichSync("python3");
124
+ if (!python) {
125
+ return ("[PYTHON ERROR]\n" +
126
+ "The 'python' interpreter was not found on PATH. Inline Python execution " +
127
+ "requires a Python installation (the Python original ran the code in-process).");
128
+ }
129
+ try {
130
+ const res = await execFileCaptured(python, ["-c", code], {
131
+ cwd: this.workspace,
132
+ timeoutMs: 60_000,
133
+ });
134
+ const out = res.stdout;
135
+ const err = res.stderr;
136
+ const parts = [`python (${code.length} chars)`];
137
+ if (out)
138
+ parts.push(out.slice(0, MAX_OUTPUT));
139
+ if (err)
140
+ parts.push(`stderr:\n${err.slice(0, 2000)}`);
141
+ if (!out && !err)
142
+ parts.push("(no output)");
143
+ return parts.join("\n");
144
+ }
145
+ catch (e) {
146
+ return `[PYTHON ERROR]\n${errText(e).slice(0, 3000)}`;
147
+ }
148
+ }
149
+ /** Check if a program is available in PATH. */
150
+ which(name) {
151
+ const p = whichSync(name);
152
+ return p ? `[OK] ${name} → ${p}` : `[NOT FOUND] ${name} not in PATH`;
153
+ }
154
+ /** Return useful environment info. */
155
+ envInfo() {
156
+ const pathEntries = (process.env.PATH ?? "").split(path.delimiter).length;
157
+ return (`Node ${process.version}\n` +
158
+ `OS: ${os.type()} ${os.release()}\n` +
159
+ `CWD: ${this.workspace}\n` +
160
+ `PATH entries: ${pathEntries}`);
161
+ }
162
+ }
163
+ //# sourceMappingURL=shell_tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell_tools.js","sourceRoot":"","sources":["../../src/tools/shell_tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * AXONIZ WebTools — web access (TypeScript port).
3
+ *
4
+ * Ported from `axoniz/tools/web_tools.py`. Keeps the DuckDuckGo HTML-scrape
5
+ * search (no external API keys) and the HTML→text sanitisation pipeline.
6
+ *
7
+ * Python-stdlib mapping:
8
+ * urllib.request.urlopen(req, timeout=15) -> global fetch + AbortSignal.timeout
9
+ * re.sub(re.DOTALL) -> RegExp with the `s` flag
10
+ */
11
+ export declare class WebTools {
12
+ /**
13
+ * NOTE: the Python original also carried `self.workspace`. It was never read
14
+ * in `web_tools.py`, so it is accepted for constructor-signature parity but
15
+ * intentionally unused.
16
+ */
17
+ readonly workspace: string;
18
+ readonly HEADERS: Record<string, string>;
19
+ constructor(workspace?: string);
20
+ /**
21
+ * Retrieve the textual content of a URL, stripping HTML boilerplate and
22
+ * focusing on readable text.
23
+ */
24
+ get(url: string, maxChars?: number): Promise<string>;
25
+ /**
26
+ * Web search via DuckDuckGo's lightweight HTML interface.
27
+ * Returns a structured summary of titles, URLs and snippets.
28
+ */
29
+ search(query: string, maxResults?: number): Promise<string>;
30
+ }
31
+ //# sourceMappingURL=web_tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web_tools.d.ts","sourceRoot":"","sources":["../../src/tools/web_tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,qBAAa,QAAQ;IACnB;;;;OAIG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAG3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAEtC;IAEF,YAAY,SAAS,SAAM,EAE1B;IAED;;;OAGG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,SAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAyBvD;IAED;;;OAGG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,SAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAuC3D;CACF"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * AXONIZ WebTools — web access (TypeScript port).
3
+ *
4
+ * Ported from `axoniz/tools/web_tools.py`. Keeps the DuckDuckGo HTML-scrape
5
+ * search (no external API keys) and the HTML→text sanitisation pipeline.
6
+ *
7
+ * Python-stdlib mapping:
8
+ * urllib.request.urlopen(req, timeout=15) -> global fetch + AbortSignal.timeout
9
+ * re.sub(re.DOTALL) -> RegExp with the `s` flag
10
+ */
11
+ export class WebTools {
12
+ /**
13
+ * NOTE: the Python original also carried `self.workspace`. It was never read
14
+ * in `web_tools.py`, so it is accepted for constructor-signature parity but
15
+ * intentionally unused.
16
+ */
17
+ workspace;
18
+ // Standard identification header for reliable communication with servers.
19
+ HEADERS = {
20
+ "User-Agent": "Mozilla/5.0 (AXONIZ-ZERO Intelligence Agent/1.0)",
21
+ };
22
+ constructor(workspace = ".") {
23
+ this.workspace = workspace;
24
+ }
25
+ /**
26
+ * Retrieve the textual content of a URL, stripping HTML boilerplate and
27
+ * focusing on readable text.
28
+ */
29
+ async get(url, maxChars = 8000) {
30
+ try {
31
+ const resp = await fetch(url, {
32
+ headers: this.HEADERS,
33
+ signal: AbortSignal.timeout(15_000),
34
+ redirect: "follow",
35
+ });
36
+ if (!resp.ok)
37
+ throw new Error(`HTTP ${resp.status} ${resp.statusText}`);
38
+ const raw = await readBodyText(resp);
39
+ // High-efficiency sanitization: removal of non-content elements.
40
+ let text = raw.replace(/<style[^>]*>[\s\S]*?<\/style>/g, "");
41
+ text = text.replace(/<script[^>]*>[\s\S]*?<\/script>/g, "");
42
+ text = text.replace(/<[^>]+>/g, " ");
43
+ text = text.replace(/\s+/g, " ").trim();
44
+ // Enforcing a safe buffer limit to prevent context overflow.
45
+ if (text.length > maxChars) {
46
+ text = `${text.slice(0, maxChars)}\n... (Content truncated for brevity, ${text.length} total characters)`;
47
+ }
48
+ return `Retrieved Content from ${url}:\n${text}`;
49
+ }
50
+ catch (e) {
51
+ return `Error: Unable to access ${url}. ${errorText(e)}`;
52
+ }
53
+ }
54
+ /**
55
+ * Web search via DuckDuckGo's lightweight HTML interface.
56
+ * Returns a structured summary of titles, URLs and snippets.
57
+ */
58
+ async search(query, maxResults = 5) {
59
+ try {
60
+ // Preparing the search query for the URL (urllib.parse.quote_plus).
61
+ const encoded = encodeURIComponent(query).replace(/%20/g, "+");
62
+ const url = `https://html.duckduckgo.com/html/?q=${encoded}`;
63
+ const resp = await fetch(url, {
64
+ headers: { ...this.HEADERS, "Accept-Language": "en-US" },
65
+ signal: AbortSignal.timeout(15_000),
66
+ redirect: "follow",
67
+ });
68
+ if (!resp.ok)
69
+ throw new Error(`HTTP ${resp.status} ${resp.statusText}`);
70
+ const raw = await readBodyText(resp);
71
+ // Parsing the search result blocks from the raw response.
72
+ const results = [];
73
+ const blocks = raw.match(/class="result__body"[\s\S]*?(?=class="result__body"|$)/g) ?? [];
74
+ for (const block of blocks.slice(0, maxResults)) {
75
+ const titleM = /class="result__a[^"]*"[^>]*>([\s\S]*?)<\/a>/.exec(block);
76
+ const urlM = /href="(https?:\/\/[^"]+)"/.exec(block);
77
+ const snippetM = /class="result__snippet"[^>]*>([\s\S]*?)<\/span>/.exec(block);
78
+ const title = titleM ? stripTags(titleM[1]).trim() : "Untitled Result";
79
+ const resultUrl = urlM ? urlM[1] : "No link available";
80
+ const snippet = snippetM ? stripTags(snippetM[1]).trim() : "No summary available.";
81
+ results.push(` [${results.length + 1}] ${title}\n Source: ${resultUrl}\n Summary: ${snippet}`);
82
+ }
83
+ if (results.length === 0) {
84
+ return `Intelligence Report: No relevant information found for '${query}'.`;
85
+ }
86
+ return `Web Search Results for '${query}':\n${results.join("\n\n")}`;
87
+ }
88
+ catch (e) {
89
+ return `Error: Search operation failed. ${errorText(e)}`;
90
+ }
91
+ }
92
+ }
93
+ /* ── helpers ─────────────────────────────────────────────────────────────── */
94
+ function stripTags(html) {
95
+ return html.replace(/<[^>]+>/g, "");
96
+ }
97
+ /** Python's `str(e)` rendering for an unknown thrown value. */
98
+ function errorText(e) {
99
+ if (e instanceof Error)
100
+ return e.message || e.name;
101
+ if (typeof e === "string")
102
+ return e;
103
+ try {
104
+ return JSON.stringify(e);
105
+ }
106
+ catch {
107
+ return String(e);
108
+ }
109
+ }
110
+ /** Read a response body as UTF-8 with undecodable bytes replaced, with a cap. */
111
+ async function readBodyText(resp) {
112
+ const buf = Buffer.from(await resp.arrayBuffer());
113
+ const capped = buf.length > WebTools_MAX_BODY ? buf.subarray(0, WebTools_MAX_BODY) : buf;
114
+ return capped.toString("utf8");
115
+ }
116
+ const WebTools_MAX_BODY = 20 * 1024 * 1024;
117
+ //# sourceMappingURL=web_tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web_tools.js","sourceRoot":"","sources":["../../src/tools/web_tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * src/voice/index.ts
3
+ * ====================
4
+ * BERU voice stack — offline-first.
5
+ *
6
+ * STT: Moonshine → faster-whisper → whisper → SpeechRecognition
7
+ * TTS: Kokoro-82M → Piper → edge-tts → pyttsx3
8
+ * Wake: openwakeword → sr_polling
9
+ *
10
+ * Quick start:
11
+ * import { start_light_daemon } from "./index.js";
12
+ * const d = start_light_daemon(); // boots in the background
13
+ * d.say("BERU is online.");
14
+ *
15
+ * ── Node capability note ─────────────────────────────────────────────────────
16
+ * The Python engines named above are Python-only and not installable here. The
17
+ * public surface below is identical; the working path is `msedge-tts`, and STT /
18
+ * wake word / audio I/O use runtime-registered backends
19
+ * (`registerSTTBackend`, `registerWakeDetector`, `setAudioInputDriver`).
20
+ * Degraded calls return or emit a descriptive `[ERROR] …` string.
21
+ */
22
+ import { TTSEngine, get_tts } from "./tts.js";
23
+ import { STTEngine, get_stt } from "./stt.js";
24
+ import { WakeWordDetector, get_wake_detector } from "./wake_word.js";
25
+ import { VoiceLoop, start_voice_loop, get_voice_loop } from "./voice_loop.js";
26
+ import { LightDaemon, start_light_daemon, get_daemon } from "./light_daemon.js";
27
+ export { TTSEngine, get_tts, STTEngine, get_stt, WakeWordDetector, get_wake_detector, VoiceLoop, start_voice_loop, get_voice_loop, LightDaemon, start_light_daemon, get_daemon, };
28
+ export { getTts, registerTTSBackend, unregisterTTSBackend, speakWithFallback } from "./tts.js";
29
+ export { getStt, registerSTTBackend, unregisterSTTBackend } from "./stt.js";
30
+ export { getWakeDetector, registerWakeDetector, registerClipRecognizer } from "./wake_word.js";
31
+ export {
32
+ /** Register a live microphone capture driver (was `sounddevice`/`pyaudio`). */
33
+ setAudioInputDriver, getAudioInputDriver,
34
+ /** Register a live playback driver (was `soundplay`/`sounddevice`). */
35
+ setAudioOutputDriver, getAudioOutputDriver, writeWav, readWav, encodeWavPcm16, SAMPLE_RATE as AUDIO_SAMPLE_RATE, type AudioInputDriver, type AudioOutputDriver, type AudioRecordOptions, } from "./wav.js";
36
+ export { LightVoiceDaemon, LightDaemon as LightDaemonAlias, getDaemon, startLightDaemon } from "./light_daemon.js";
37
+ export { getVoiceLoop, startVoiceLoop, VoiceState } from "./voice_loop.js";
38
+ export { getTts as getTTSEngine } from "./tts.js";
39
+ /** Python `__init__.py` `__all__` equivalent. */
40
+ export declare const __all__: readonly ["TTSEngine", "get_tts", "STTEngine", "get_stt", "WakeWordDetector", "get_wake_detector", "VoiceLoop", "start_voice_loop", "get_voice_loop", "LightDaemon", "start_light_daemon", "get_daemon"];
41
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/voice/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEhF,OAAO,EACL,SAAS,EACT,OAAO,EACP,SAAS,EACT,OAAO,EACP,gBAAgB,EAChB,iBAAiB,EACjB,SAAS,EACT,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,kBAAkB,EAClB,UAAU,GACX,CAAC;AAOF,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC/F,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAE/F,OAAO;AACL,+EAA+E;AAC/E,mBAAmB,EACnB,mBAAmB;AACnB,uEAAuE;AACvE,oBAAoB,EACpB,oBAAoB,EACpB,QAAQ,EACR,OAAO,EACP,cAAc,EACd,WAAW,IAAI,iBAAiB,EAChC,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,GACxB,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,gBAAgB,EAAE,WAAW,IAAI,gBAAgB,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACnH,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,UAAU,CAAC;AAElD,iDAAiD;AACjD,eAAO,MAAM,OAAO,YAClB,WAAW,EACX,SAAS,EACT,WAAW,EACX,SAAS,EACT,kBAAkB,EAClB,mBAAmB,EACnB,WAAW,EACX,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,oBAAoB,EACpB,YAAY,CACJ,CAAC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * src/voice/index.ts
3
+ * ====================
4
+ * BERU voice stack — offline-first.
5
+ *
6
+ * STT: Moonshine → faster-whisper → whisper → SpeechRecognition
7
+ * TTS: Kokoro-82M → Piper → edge-tts → pyttsx3
8
+ * Wake: openwakeword → sr_polling
9
+ *
10
+ * Quick start:
11
+ * import { start_light_daemon } from "./index.js";
12
+ * const d = start_light_daemon(); // boots in the background
13
+ * d.say("BERU is online.");
14
+ *
15
+ * ── Node capability note ─────────────────────────────────────────────────────
16
+ * The Python engines named above are Python-only and not installable here. The
17
+ * public surface below is identical; the working path is `msedge-tts`, and STT /
18
+ * wake word / audio I/O use runtime-registered backends
19
+ * (`registerSTTBackend`, `registerWakeDetector`, `setAudioInputDriver`).
20
+ * Degraded calls return or emit a descriptive `[ERROR] …` string.
21
+ */
22
+ import { TTSEngine, get_tts } from "./tts.js";
23
+ import { STTEngine, get_stt } from "./stt.js";
24
+ import { WakeWordDetector, get_wake_detector } from "./wake_word.js";
25
+ import { VoiceLoop, start_voice_loop, get_voice_loop } from "./voice_loop.js";
26
+ import { LightDaemon, start_light_daemon, get_daemon } from "./light_daemon.js";
27
+ export { TTSEngine, get_tts, STTEngine, get_stt, WakeWordDetector, get_wake_detector, VoiceLoop, start_voice_loop, get_voice_loop, LightDaemon, start_light_daemon, get_daemon, };
28
+ /* ── Extra surface (Node port) ─────────────────────────────────────────────────
29
+ * camelCase aliases plus the runtime-registration seams for the capabilities
30
+ * whose Python engines have no Node equivalent.
31
+ * --------------------------------------------------------------------------- */
32
+ export { getTts, registerTTSBackend, unregisterTTSBackend, speakWithFallback } from "./tts.js";
33
+ export { getStt, registerSTTBackend, unregisterSTTBackend } from "./stt.js";
34
+ export { getWakeDetector, registerWakeDetector, registerClipRecognizer } from "./wake_word.js";
35
+ export {
36
+ /** Register a live microphone capture driver (was `sounddevice`/`pyaudio`). */
37
+ setAudioInputDriver, getAudioInputDriver,
38
+ /** Register a live playback driver (was `soundplay`/`sounddevice`). */
39
+ setAudioOutputDriver, getAudioOutputDriver, writeWav, readWav, encodeWavPcm16, SAMPLE_RATE as AUDIO_SAMPLE_RATE, } from "./wav.js";
40
+ export { LightVoiceDaemon, LightDaemon as LightDaemonAlias, getDaemon, startLightDaemon } from "./light_daemon.js";
41
+ export { getVoiceLoop, startVoiceLoop, VoiceState } from "./voice_loop.js";
42
+ export { getTts as getTTSEngine } from "./tts.js";
43
+ /** Python `__init__.py` `__all__` equivalent. */
44
+ export const __all__ = [
45
+ "TTSEngine",
46
+ "get_tts",
47
+ "STTEngine",
48
+ "get_stt",
49
+ "WakeWordDetector",
50
+ "get_wake_detector",
51
+ "VoiceLoop",
52
+ "start_voice_loop",
53
+ "get_voice_loop",
54
+ "LightDaemon",
55
+ "start_light_daemon",
56
+ "get_daemon",
57
+ ];
58
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/voice/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEhF,OAAO,EACL,SAAS,EACT,OAAO,EACP,SAAS,EACT,OAAO,EACP,gBAAgB,EAChB,iBAAiB,EACjB,SAAS,EACT,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,kBAAkB,EAClB,UAAU,GACX,CAAC;AAEF;;;iFAGiF;AAEjF,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC/F,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAE/F,OAAO;AACL,+EAA+E;AAC/E,mBAAmB,EACnB,mBAAmB;AACnB,uEAAuE;AACvE,oBAAoB,EACpB,oBAAoB,EACpB,QAAQ,EACR,OAAO,EACP,cAAc,EACd,WAAW,IAAI,iBAAiB,GAIjC,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,gBAAgB,EAAE,WAAW,IAAI,gBAAgB,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACnH,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,UAAU,CAAC;AAElD,iDAAiD;AACjD,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,WAAW;IACX,SAAS;IACT,WAAW;IACX,SAAS;IACT,kBAAkB;IAClB,mBAAmB;IACnB,WAAW;IACX,kBAAkB;IAClB,gBAAgB;IAChB,aAAa;IACb,oBAAoB;IACpB,YAAY;CACJ,CAAC"}
@@ -0,0 +1,197 @@
1
+ /**
2
+ * src/voice/light_daemon.ts
3
+ * ============================
4
+ * BERU Light Voice Daemon — two-tier, minimal RAM.
5
+ *
6
+ * Architecture
7
+ * ------------
8
+ * ALWAYS ON (idle RAM ~80-160 MB total):
9
+ * openwakeword ONNX — ~1 MB — wake word detection
10
+ * faster-whisper tiny — ~75 MB — speech-to-text (int8 CPU)
11
+ * edge-tts — 0 MB — text-to-speech (MS cloud stream)
12
+ *
13
+ * ON DEMAND (no weights ever loaded locally):
14
+ * Tier 1 — regex classifier answers simple queries instantly (time, date, …)
15
+ * Tier 2 — one stateless HTTP call to Anthropic / Groq / OpenAI
16
+ * only fires when the query is complex
17
+ * zero model weights in RAM
18
+ *
19
+ * NEVER LOADED:
20
+ * The full axoniz Agent, LM Studio, Ollama, or any local LLM.
21
+ *
22
+ * Usage
23
+ * -----
24
+ * const d = start_light_daemon();
25
+ * // runs forever — say "Beru" to wake
26
+ * // d.say("BERU is online.")
27
+ *
28
+ * ── Node reality ─────────────────────────────────────────────────────────────
29
+ * Scheduling, watching, intent classification, LLM calls, trimming and event
30
+ * emission are ported faithfully. Only the OS-level audio primitives degrade:
31
+ * - wake word → `WakeWordDetector` from src/voice/wake_word.ts (register a
32
+ * detector; `openwakeword`/`pvporcupine` are Python-only)
33
+ * - mic → registered audio input driver (was `pyaudio`)
34
+ * - STT → `_WhisperSTT` wraps the pluggable `STTEngine` (was
35
+ * `faster-whisper`; no Node engine is installed)
36
+ * - TTS → `msedge-tts` (installed) via `src/voice/tts.ts`
37
+ * Every degraded path returns/emits a clear `[ERROR] …` string and never throws.
38
+ */
39
+ import { type TTSEngine } from "./tts.js";
40
+ import { STTEngine } from "./stt.js";
41
+ import { type WakeWordDetector } from "./wake_word.js";
42
+ export declare const WHISPER_MODEL: string;
43
+ export declare const WHISPER_DEVICE = "cpu";
44
+ export declare const SAMPLE_RATE = 16000;
45
+ export declare const LISTEN_SECS = 7;
46
+ export declare const SILENCE_THRESH = 500;
47
+ export declare const SILENCE_FRAMES = 20;
48
+ /** Master debug flag — set to false to quiet down. */
49
+ export declare let DBG: boolean;
50
+ export declare function setDbg(on: boolean): void;
51
+ export declare const _STOP_WORDS: Set<string>;
52
+ export type IntentTier = "stop" | "local" | "llm";
53
+ /** Returns 'stop', 'local', or 'llm'. */
54
+ export declare function _classify(text: string): IntentTier;
55
+ /** Answer without any network call. */
56
+ export declare function _local_response(text: string): string;
57
+ /**
58
+ * TODO(port): Python imported the `anthropic`, `groq` and `openai` SDKs. None is
59
+ * installed here, so each provider is called over plain `fetch` against the same
60
+ * REST endpoints — same models, same prompts, same shapes, zero new dependencies.
61
+ * Recommended replacement: keep the HTTP path; add `undici` ProxyAgent only if a
62
+ * corporate proxy is required.
63
+ */
64
+ export declare class _LLMClient {
65
+ static readonly SYSTEM: string;
66
+ provider: string;
67
+ apiKey: string | null;
68
+ model: string | null;
69
+ baseUrl: string | null;
70
+ private _backend;
71
+ constructor(provider?: string, apiKey?: string | null, model?: string | null, baseUrl?: string | null);
72
+ private _detect;
73
+ get backend(): string;
74
+ get available(): boolean;
75
+ ask(prompt: string, maxTokens?: number): Promise<string>;
76
+ private _ask_anthropic;
77
+ private _ask_groq;
78
+ private _ask_openai;
79
+ }
80
+ /**
81
+ * TODO(port): Python held a `faster_whisper.WhisperModel` here. No Node STT
82
+ * engine is installed. `_WhisperSTT` now wraps the pluggable `STTEngine` from
83
+ * src/voice/stt.ts (register one with `registerSTTBackend`, or put a whisper.cpp
84
+ * `whisper-cli` on PATH). Until then `available` is false and `transcribe_pcm`
85
+ * returns "" while emitting a descriptive `[ERROR] …` via `lastError`.
86
+ */
87
+ export declare class _WhisperSTT {
88
+ /** Exposed because the Python daemon printed it in `start()`/`info()`. */
89
+ readonly _model_size: string;
90
+ private _engine;
91
+ private _lastError;
92
+ constructor(modelSize?: string, engine?: STTEngine | null);
93
+ get lastError(): string;
94
+ get available(): boolean;
95
+ /** Transcribe raw 16-bit 16 kHz mono PCM. Returns text or empty string. */
96
+ transcribe_pcm(pcmBytes: Buffer): Promise<string>;
97
+ transcribePcm(pcmBytes: Buffer): Promise<string>;
98
+ }
99
+ export interface RecordMicOptions {
100
+ max_secs?: number;
101
+ signal?: AbortSignal;
102
+ }
103
+ /**
104
+ * Record from mic until silence or timeout. Returns raw 16-bit PCM bytes.
105
+ *
106
+ * TODO(port): Python used `pyaudio` (PortAudio) with a 1024-frame read loop.
107
+ * There is no Node audio I/O dependency installed — a driver registered through
108
+ * `setAudioInputDriver()` supplies the frames; without one this logs a clear
109
+ * `[ERROR] …` and returns an empty buffer.
110
+ */
111
+ export declare function _record_mic(arg?: number | RecordMicOptions, signal?: AbortSignal): Promise<Buffer>;
112
+ /** Test/DI hook. */
113
+ export declare function setSpeakEngine(engine: TTSEngine | null): void;
114
+ /**
115
+ * Speak text aloud. Priority (ported from the Python module-level `_speak()`):
116
+ * 1. msedge-tts → audio output driver (best quality, free)
117
+ * 2. msedge-tts → OS player fallback (PowerShell MediaPlayer on Windows)
118
+ * 3. offline OS TTS slot (was pyttsx3 — NOT implemented)
119
+ * 4. print (last resort)
120
+ *
121
+ * TODO(port): step 1/2 require a registered audio output driver; step 3 needs a
122
+ * Node offline TTS backend (see `OFFLINE_TTS_ERROR` in src/voice/tts.ts). All
123
+ * failures are logged as `[ERROR] …` and never throw.
124
+ */
125
+ export declare function _speak(text: string): Promise<void>;
126
+ export declare function _speak_sync_fallback(text: string): void;
127
+ export declare function _trim(text: string, maxChars?: number): string;
128
+ export interface LightDaemonOptions {
129
+ provider?: string;
130
+ api_key?: string;
131
+ model?: string;
132
+ base_url?: string;
133
+ whisper_model?: string;
134
+ on_state_change?: (state: string) => void;
135
+ }
136
+ export declare class LightVoiceDaemon {
137
+ /**
138
+ * BERU light voice daemon.
139
+ *
140
+ * Idle RAM: ~80 MB (whisper-tiny int8 CPU + openwakeword ONNX)
141
+ * NO local LLM is ever loaded. Complex queries go to the API only.
142
+ */
143
+ private _llm;
144
+ private _stt;
145
+ private _wwd;
146
+ private _on_state;
147
+ private _state;
148
+ private _stop_ev;
149
+ private _wake_ev;
150
+ private _abort;
151
+ private _thread;
152
+ constructor(options?: LightDaemonOptions);
153
+ start(): void;
154
+ stop(): void;
155
+ is_running(): boolean;
156
+ isRunning(): boolean;
157
+ get state(): string;
158
+ /** Speak text immediately (compat with the old LightDaemon API). */
159
+ say(text: string, async_?: boolean): void;
160
+ /** Capture one utterance and return its transcription. */
161
+ listen_once(): Promise<string | null>;
162
+ listenOnce(): Promise<string | null>;
163
+ info(): Record<string, unknown>;
164
+ private _set_state;
165
+ /**
166
+ * Wire the whisper-polling fallback so the wake detector can reuse this
167
+ * daemon's STT engine — this is the Node equivalent of the Python "faster-whisper
168
+ * is already a dep of light_daemon" coupling.
169
+ */
170
+ private _init_wake_word;
171
+ private _on_wake;
172
+ private _loop;
173
+ /** Expose the wake detector for tests/embedding. */
174
+ get wakeDetector(): WakeWordDetector | null;
175
+ }
176
+ /** Keep LightDaemon as an alias so older code doesn't break. */
177
+ export declare const LightDaemon: typeof LightVoiceDaemon;
178
+ export type LightDaemonType = LightVoiceDaemon;
179
+ export interface StartLightDaemonOptions extends LightDaemonOptions {
180
+ /** Legacy kwargs silently ignored so old call sites don't crash. */
181
+ agent?: unknown;
182
+ verbose?: boolean;
183
+ auto_start?: boolean;
184
+ }
185
+ /**
186
+ * Start BERU's light voice daemon in the background.
187
+ * No local LLM is ever loaded. Returns immediately.
188
+ */
189
+ export declare function start_light_daemon(options?: StartLightDaemonOptions): LightVoiceDaemon;
190
+ /** camelCase alias of `start_light_daemon`. */
191
+ export declare const startLightDaemon: typeof start_light_daemon;
192
+ export declare function get_daemon(): LightVoiceDaemon | null;
193
+ /** camelCase alias of `get_daemon`. */
194
+ export declare const getDaemon: typeof get_daemon;
195
+ /** Test/DI hook — replace the singleton. */
196
+ export declare function setDaemon(d: LightVoiceDaemon | null): void;
197
+ //# sourceMappingURL=light_daemon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"light_daemon.d.ts","sourceRoot":"","sources":["../../src/voice/light_daemon.ts"],"names":[],"mappings":"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"}