@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.
- package/LICENSE +21 -0
- package/README.md +76 -0
- package/dist/agents/definition.d.ts +15 -0
- package/dist/agents/definition.d.ts.map +1 -0
- package/dist/agents/definition.js +41 -0
- package/dist/agents/definition.js.map +1 -0
- package/dist/agents/index.d.ts +12 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +11 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/registry.d.ts +17 -0
- package/dist/agents/registry.d.ts.map +1 -0
- package/dist/agents/registry.js +23 -0
- package/dist/agents/registry.js.map +1 -0
- package/dist/agents/specialized.d.ts +31 -0
- package/dist/agents/specialized.d.ts.map +1 -0
- package/dist/agents/specialized.js +75 -0
- package/dist/agents/specialized.js.map +1 -0
- package/dist/awareness/index.d.ts +14 -0
- package/dist/awareness/index.d.ts.map +1 -0
- package/dist/awareness/index.js +22 -0
- package/dist/awareness/index.js.map +1 -0
- package/dist/awareness/service.d.ts +180 -0
- package/dist/awareness/service.d.ts.map +1 -0
- package/dist/awareness/service.js +789 -0
- package/dist/awareness/service.js.map +1 -0
- package/dist/cli/entry.d.ts +13 -0
- package/dist/cli/entry.d.ts.map +1 -0
- package/dist/cli/entry.js +35 -0
- package/dist/cli/entry.js.map +1 -0
- package/dist/comms/telegram.d.ts +41 -0
- package/dist/comms/telegram.d.ts.map +1 -0
- package/dist/comms/telegram.js +332 -0
- package/dist/comms/telegram.js.map +1 -0
- package/dist/core/agent.d.ts +252 -0
- package/dist/core/agent.d.ts.map +1 -0
- package/dist/core/agent.js +1399 -0
- package/dist/core/agent.js.map +1 -0
- package/dist/core/auth.d.ts +23 -0
- package/dist/core/auth.d.ts.map +1 -0
- package/dist/core/auth.js +113 -0
- package/dist/core/auth.js.map +1 -0
- package/dist/core/authority.d.ts +118 -0
- package/dist/core/authority.d.ts.map +1 -0
- package/dist/core/authority.js +402 -0
- package/dist/core/authority.js.map +1 -0
- package/dist/core/backend/async_queue.d.ts +17 -0
- package/dist/core/backend/async_queue.d.ts.map +1 -0
- package/dist/core/backend/async_queue.js +66 -0
- package/dist/core/backend/async_queue.js.map +1 -0
- package/dist/core/backend/index.d.ts +24 -0
- package/dist/core/backend/index.d.ts.map +1 -0
- package/dist/core/backend/index.js +128 -0
- package/dist/core/backend/index.js.map +1 -0
- package/dist/core/backend/llama_server.d.ts +39 -0
- package/dist/core/backend/llama_server.d.ts.map +1 -0
- package/dist/core/backend/llama_server.js +182 -0
- package/dist/core/backend/llama_server.js.map +1 -0
- package/dist/core/backend/llamacpp.d.ts +40 -0
- package/dist/core/backend/llamacpp.d.ts.map +1 -0
- package/dist/core/backend/llamacpp.js +200 -0
- package/dist/core/backend/llamacpp.js.map +1 -0
- package/dist/core/backend/lmstudio.d.ts +53 -0
- package/dist/core/backend/lmstudio.d.ts.map +1 -0
- package/dist/core/backend/lmstudio.js +274 -0
- package/dist/core/backend/lmstudio.js.map +1 -0
- package/dist/core/backend/ollama.d.ts +25 -0
- package/dist/core/backend/ollama.d.ts.map +1 -0
- package/dist/core/backend/ollama.js +86 -0
- package/dist/core/backend/ollama.js.map +1 -0
- package/dist/core/backend/openai.d.ts +27 -0
- package/dist/core/backend/openai.d.ts.map +1 -0
- package/dist/core/backend/openai.js +84 -0
- package/dist/core/backend/openai.js.map +1 -0
- package/dist/core/backend/types.d.ts +73 -0
- package/dist/core/backend/types.d.ts.map +1 -0
- package/dist/core/backend/types.js +137 -0
- package/dist/core/backend/types.js.map +1 -0
- package/dist/core/chat_store.d.ts +77 -0
- package/dist/core/chat_store.d.ts.map +1 -0
- package/dist/core/chat_store.js +332 -0
- package/dist/core/chat_store.js.map +1 -0
- package/dist/core/cli.d.ts +82 -0
- package/dist/core/cli.d.ts.map +1 -0
- package/dist/core/cli.js +602 -0
- package/dist/core/cli.js.map +1 -0
- package/dist/core/config.d.ts +127 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +295 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/debug.d.ts +8 -0
- package/dist/core/debug.d.ts.map +1 -0
- package/dist/core/debug.js +8 -0
- package/dist/core/debug.js.map +1 -0
- package/dist/core/downloader.d.ts +31 -0
- package/dist/core/downloader.d.ts.map +1 -0
- package/dist/core/downloader.js +180 -0
- package/dist/core/downloader.js.map +1 -0
- package/dist/core/errors.d.ts +80 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +134 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/extras.d.ts +160 -0
- package/dist/core/extras.d.ts.map +1 -0
- package/dist/core/extras.js +553 -0
- package/dist/core/extras.js.map +1 -0
- package/dist/core/health.d.ts +27 -0
- package/dist/core/health.d.ts.map +1 -0
- package/dist/core/health.js +96 -0
- package/dist/core/health.js.map +1 -0
- package/dist/core/history.d.ts +50 -0
- package/dist/core/history.d.ts.map +1 -0
- package/dist/core/history.js +276 -0
- package/dist/core/history.js.map +1 -0
- package/dist/core/index.d.ts +6 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +6 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/intelligence/ast_index.d.ts +255 -0
- package/dist/core/intelligence/ast_index.d.ts.map +1 -0
- package/dist/core/intelligence/ast_index.js +1369 -0
- package/dist/core/intelligence/ast_index.js.map +1 -0
- package/dist/core/intelligence/confidence.d.ts +113 -0
- package/dist/core/intelligence/confidence.d.ts.map +1 -0
- package/dist/core/intelligence/confidence.js +298 -0
- package/dist/core/intelligence/confidence.js.map +1 -0
- package/dist/core/intelligence/context_compressor.d.ts +80 -0
- package/dist/core/intelligence/context_compressor.d.ts.map +1 -0
- package/dist/core/intelligence/context_compressor.js +245 -0
- package/dist/core/intelligence/context_compressor.js.map +1 -0
- package/dist/core/intelligence/daemon.d.ts +247 -0
- package/dist/core/intelligence/daemon.d.ts.map +1 -0
- package/dist/core/intelligence/daemon.js +842 -0
- package/dist/core/intelligence/daemon.js.map +1 -0
- package/dist/core/intelligence/index.d.ts +60 -0
- package/dist/core/intelligence/index.d.ts.map +1 -0
- package/dist/core/intelligence/index.js +101 -0
- package/dist/core/intelligence/index.js.map +1 -0
- package/dist/core/intelligence/predictor.d.ts +246 -0
- package/dist/core/intelligence/predictor.d.ts.map +1 -0
- package/dist/core/intelligence/predictor.js +590 -0
- package/dist/core/intelligence/predictor.js.map +1 -0
- package/dist/core/intelligence/reflex.d.ts +84 -0
- package/dist/core/intelligence/reflex.d.ts.map +1 -0
- package/dist/core/intelligence/reflex.js +344 -0
- package/dist/core/intelligence/reflex.js.map +1 -0
- package/dist/core/intelligence/self_correction.d.ts +121 -0
- package/dist/core/intelligence/self_correction.d.ts.map +1 -0
- package/dist/core/intelligence/self_correction.js +327 -0
- package/dist/core/intelligence/self_correction.js.map +1 -0
- package/dist/core/intelligence/skill_distiller.d.ts +100 -0
- package/dist/core/intelligence/skill_distiller.d.ts.map +1 -0
- package/dist/core/intelligence/skill_distiller.js +246 -0
- package/dist/core/intelligence/skill_distiller.js.map +1 -0
- package/dist/core/intelligence/swarm.d.ts +330 -0
- package/dist/core/intelligence/swarm.d.ts.map +1 -0
- package/dist/core/intelligence/swarm.js +1064 -0
- package/dist/core/intelligence/swarm.js.map +1 -0
- package/dist/core/intelligence/trajectory.d.ts +107 -0
- package/dist/core/intelligence/trajectory.d.ts.map +1 -0
- package/dist/core/intelligence/trajectory.js +330 -0
- package/dist/core/intelligence/trajectory.js.map +1 -0
- package/dist/core/logger.d.ts +111 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +640 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/loop.d.ts +123 -0
- package/dist/core/loop.d.ts.map +1 -0
- package/dist/core/loop.js +423 -0
- package/dist/core/loop.js.map +1 -0
- package/dist/core/memory.d.ts +81 -0
- package/dist/core/memory.d.ts.map +1 -0
- package/dist/core/memory.js +328 -0
- package/dist/core/memory.js.map +1 -0
- package/dist/core/metrics.d.ts +29 -0
- package/dist/core/metrics.d.ts.map +1 -0
- package/dist/core/metrics.js +109 -0
- package/dist/core/metrics.js.map +1 -0
- package/dist/core/models.d.ts +51 -0
- package/dist/core/models.d.ts.map +1 -0
- package/dist/core/models.js +146 -0
- package/dist/core/models.js.map +1 -0
- package/dist/core/optimizer.d.ts +34 -0
- package/dist/core/optimizer.d.ts.map +1 -0
- package/dist/core/optimizer.js +131 -0
- package/dist/core/optimizer.js.map +1 -0
- package/dist/core/persona.d.ts +35 -0
- package/dist/core/persona.d.ts.map +1 -0
- package/dist/core/persona.js +126 -0
- package/dist/core/persona.js.map +1 -0
- package/dist/core/rate_limit.d.ts +23 -0
- package/dist/core/rate_limit.d.ts.map +1 -0
- package/dist/core/rate_limit.js +62 -0
- package/dist/core/rate_limit.js.map +1 -0
- package/dist/core/runner.d.ts +63 -0
- package/dist/core/runner.d.ts.map +1 -0
- package/dist/core/runner.js +671 -0
- package/dist/core/runner.js.map +1 -0
- package/dist/core/stream_parser.d.ts +43 -0
- package/dist/core/stream_parser.d.ts.map +1 -0
- package/dist/core/stream_parser.js +140 -0
- package/dist/core/stream_parser.js.map +1 -0
- package/dist/core/tool_schemas.d.ts +26 -0
- package/dist/core/tool_schemas.d.ts.map +1 -0
- package/dist/core/tool_schemas.js +124 -0
- package/dist/core/tool_schemas.js.map +1 -0
- package/dist/core/which.d.ts +2 -0
- package/dist/core/which.d.ts.map +1 -0
- package/dist/core/which.js +35 -0
- package/dist/core/which.js.map +1 -0
- package/dist/goals/index.d.ts +9 -0
- package/dist/goals/index.d.ts.map +1 -0
- package/dist/goals/index.js +17 -0
- package/dist/goals/index.js.map +1 -0
- package/dist/goals/service.d.ts +115 -0
- package/dist/goals/service.d.ts.map +1 -0
- package/dist/goals/service.js +415 -0
- package/dist/goals/service.js.map +1 -0
- package/dist/goals/types.d.ts +47 -0
- package/dist/goals/types.d.ts.map +1 -0
- package/dist/goals/types.js +66 -0
- package/dist/goals/types.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/autonomous_startup.d.ts +51 -0
- package/dist/integrations/autonomous_startup.d.ts.map +1 -0
- package/dist/integrations/autonomous_startup.js +419 -0
- package/dist/integrations/autonomous_startup.js.map +1 -0
- package/dist/integrations/goose.d.ts +105 -0
- package/dist/integrations/goose.d.ts.map +1 -0
- package/dist/integrations/goose.js +408 -0
- package/dist/integrations/goose.js.map +1 -0
- package/dist/integrations/index.d.ts +21 -0
- package/dist/integrations/index.d.ts.map +1 -0
- package/dist/integrations/index.js +17 -0
- package/dist/integrations/index.js.map +1 -0
- package/dist/integrations/mcp.d.ts +73 -0
- package/dist/integrations/mcp.d.ts.map +1 -0
- package/dist/integrations/mcp.js +307 -0
- package/dist/integrations/mcp.js.map +1 -0
- package/dist/integrations/mempalace.d.ts +18 -0
- package/dist/integrations/mempalace.d.ts.map +1 -0
- package/dist/integrations/mempalace.js +25 -0
- package/dist/integrations/mempalace.js.map +1 -0
- package/dist/integrations/multi_agent.d.ts +82 -0
- package/dist/integrations/multi_agent.d.ts.map +1 -0
- package/dist/integrations/multi_agent.js +280 -0
- package/dist/integrations/multi_agent.js.map +1 -0
- package/dist/integrations/unified_memory.d.ts +415 -0
- package/dist/integrations/unified_memory.d.ts.map +1 -0
- package/dist/integrations/unified_memory.js +1489 -0
- package/dist/integrations/unified_memory.js.map +1 -0
- package/dist/roles/beru.yaml +48 -0
- package/dist/sidecar/client.d.ts +63 -0
- package/dist/sidecar/client.d.ts.map +1 -0
- package/dist/sidecar/client.js +222 -0
- package/dist/sidecar/client.js.map +1 -0
- package/dist/sidecar/index.d.ts +7 -0
- package/dist/sidecar/index.d.ts.map +1 -0
- package/dist/sidecar/index.js +6 -0
- package/dist/sidecar/index.js.map +1 -0
- package/dist/startup.d.ts +22 -0
- package/dist/startup.d.ts.map +1 -0
- package/dist/startup.js +194 -0
- package/dist/startup.js.map +1 -0
- package/dist/tools/_internal.d.ts +90 -0
- package/dist/tools/_internal.d.ts.map +1 -0
- package/dist/tools/_internal.js +375 -0
- package/dist/tools/_internal.js.map +1 -0
- package/dist/tools/_smoke.d.ts +2 -0
- package/dist/tools/_smoke.d.ts.map +1 -0
- package/dist/tools/_smoke.js +203 -0
- package/dist/tools/_smoke.js.map +1 -0
- package/dist/tools/axodex_tools.d.ts +51 -0
- package/dist/tools/axodex_tools.d.ts.map +1 -0
- package/dist/tools/axodex_tools.js +181 -0
- package/dist/tools/axodex_tools.js.map +1 -0
- package/dist/tools/code_tools.d.ts +33 -0
- package/dist/tools/code_tools.d.ts.map +1 -0
- package/dist/tools/code_tools.js +191 -0
- package/dist/tools/code_tools.js.map +1 -0
- package/dist/tools/computer_tools.d.ts +59 -0
- package/dist/tools/computer_tools.d.ts.map +1 -0
- package/dist/tools/computer_tools.js +348 -0
- package/dist/tools/computer_tools.js.map +1 -0
- package/dist/tools/file_tools.d.ts +51 -0
- package/dist/tools/file_tools.d.ts.map +1 -0
- package/dist/tools/file_tools.js +424 -0
- package/dist/tools/file_tools.js.map +1 -0
- package/dist/tools/index.d.ts +13 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +13 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/shell_tools.d.ts +39 -0
- package/dist/tools/shell_tools.d.ts.map +1 -0
- package/dist/tools/shell_tools.js +163 -0
- package/dist/tools/shell_tools.js.map +1 -0
- package/dist/tools/web_tools.d.ts +31 -0
- package/dist/tools/web_tools.d.ts.map +1 -0
- package/dist/tools/web_tools.js +117 -0
- package/dist/tools/web_tools.js.map +1 -0
- package/dist/voice/index.d.ts +41 -0
- package/dist/voice/index.d.ts.map +1 -0
- package/dist/voice/index.js +58 -0
- package/dist/voice/index.js.map +1 -0
- package/dist/voice/light_daemon.d.ts +197 -0
- package/dist/voice/light_daemon.d.ts.map +1 -0
- package/dist/voice/light_daemon.js +746 -0
- package/dist/voice/light_daemon.js.map +1 -0
- package/dist/voice/setup.d.ts +63 -0
- package/dist/voice/setup.d.ts.map +1 -0
- package/dist/voice/setup.js +443 -0
- package/dist/voice/setup.js.map +1 -0
- package/dist/voice/stt.d.ts +148 -0
- package/dist/voice/stt.d.ts.map +1 -0
- package/dist/voice/stt.js +361 -0
- package/dist/voice/stt.js.map +1 -0
- package/dist/voice/tts.d.ts +168 -0
- package/dist/voice/tts.d.ts.map +1 -0
- package/dist/voice/tts.js +698 -0
- package/dist/voice/tts.js.map +1 -0
- package/dist/voice/voice_loop.d.ts +101 -0
- package/dist/voice/voice_loop.d.ts.map +1 -0
- package/dist/voice/voice_loop.js +463 -0
- package/dist/voice/voice_loop.js.map +1 -0
- package/dist/voice/wake_word.d.ts +153 -0
- package/dist/voice/wake_word.d.ts.map +1 -0
- package/dist/voice/wake_word.js +458 -0
- package/dist/voice/wake_word.js.map +1 -0
- package/dist/voice/wav.d.ts +99 -0
- package/dist/voice/wav.d.ts.map +1 -0
- package/dist/voice/wav.js +306 -0
- package/dist/voice/wav.js.map +1 -0
- package/dist/web/broker.d.ts +33 -0
- package/dist/web/broker.d.ts.map +1 -0
- package/dist/web/broker.js +58 -0
- package/dist/web/broker.js.map +1 -0
- package/dist/web/open_browser.d.ts +2 -0
- package/dist/web/open_browser.d.ts.map +1 -0
- package/dist/web/open_browser.js +42 -0
- package/dist/web/open_browser.js.map +1 -0
- package/dist/web/server.d.ts +54 -0
- package/dist/web/server.d.ts.map +1 -0
- package/dist/web/server.js +831 -0
- package/dist/web/server.js.map +1 -0
- package/dist/web/static/app.js +4121 -0
- package/dist/web/static/index.html +2281 -0
- package/dist/web/static/js/MODULE_SUMMARY.md +124 -0
- package/dist/web/static/js/a11y.js +165 -0
- package/dist/web/static/js/admin.js +2145 -0
- package/dist/web/static/js/assistant.js +475 -0
- package/dist/web/static/js/calendar/reminders.js +114 -0
- package/dist/web/static/js/calendar/utils.js +166 -0
- package/dist/web/static/js/calendar.js +3348 -0
- package/dist/web/static/js/censor.js +356 -0
- package/dist/web/static/js/chat.js +4546 -0
- package/dist/web/static/js/chatRenderer.js +2294 -0
- package/dist/web/static/js/chatStream.js +276 -0
- package/dist/web/static/js/codeRunner.js +398 -0
- package/dist/web/static/js/color/hex.js +14 -0
- package/dist/web/static/js/colorPicker.js +453 -0
- package/dist/web/static/js/compare/icons.js +77 -0
- package/dist/web/static/js/compare/index.js +1482 -0
- package/dist/web/static/js/compare/models.js +104 -0
- package/dist/web/static/js/compare/panes.js +817 -0
- package/dist/web/static/js/compare/probe.js +78 -0
- package/dist/web/static/js/compare/scoreboard.js +223 -0
- package/dist/web/static/js/compare/selector.js +1335 -0
- package/dist/web/static/js/compare/state.js +58 -0
- package/dist/web/static/js/compare/stream.js +695 -0
- package/dist/web/static/js/compare/vote.js +254 -0
- package/dist/web/static/js/cookbook-diagnosis.js +694 -0
- package/dist/web/static/js/cookbook-hwfit.js +1888 -0
- package/dist/web/static/js/cookbook.js +2093 -0
- package/dist/web/static/js/cookbookDownload.js +633 -0
- package/dist/web/static/js/cookbookProgressSignal.js +29 -0
- package/dist/web/static/js/cookbookRunning.js +3506 -0
- package/dist/web/static/js/cookbookServe.js +2128 -0
- package/dist/web/static/js/document.js +9731 -0
- package/dist/web/static/js/documentLibrary.js +3376 -0
- package/dist/web/static/js/dragSort.js +265 -0
- package/dist/web/static/js/editor/ai-inpaint.js +374 -0
- package/dist/web/static/js/editor/ai-models.js +273 -0
- package/dist/web/static/js/editor/ai-rembg.js +230 -0
- package/dist/web/static/js/editor/ai-tool-runner.js +147 -0
- package/dist/web/static/js/editor/ai-tools-misc.js +216 -0
- package/dist/web/static/js/editor/build/controls.js +366 -0
- package/dist/web/static/js/editor/build/popups.js +112 -0
- package/dist/web/static/js/editor/build/right-panel.js +200 -0
- package/dist/web/static/js/editor/build/toolbar.js +73 -0
- package/dist/web/static/js/editor/build/topbar.js +131 -0
- package/dist/web/static/js/editor/build/transform-popup.js +109 -0
- package/dist/web/static/js/editor/canvas-coords.js +21 -0
- package/dist/web/static/js/editor/canvas-events.js +197 -0
- package/dist/web/static/js/editor/canvas-transforms.js +132 -0
- package/dist/web/static/js/editor/checkerboard.js +24 -0
- package/dist/web/static/js/editor/clipboard-and-drop.js +133 -0
- package/dist/web/static/js/editor/composite-helpers.js +83 -0
- package/dist/web/static/js/editor/filters/blur.js +118 -0
- package/dist/web/static/js/editor/filters/edge-feather.js +70 -0
- package/dist/web/static/js/editor/fx/adj-popup.js +677 -0
- package/dist/web/static/js/editor/fx/filter-string.js +38 -0
- package/dist/web/static/js/editor/fx/histogram.js +67 -0
- package/dist/web/static/js/editor/fx/pixel-pass.js +249 -0
- package/dist/web/static/js/editor/harmonize-masks.js +116 -0
- package/dist/web/static/js/editor/history-panel.js +176 -0
- package/dist/web/static/js/editor/keyboard-shortcuts.js +271 -0
- package/dist/web/static/js/editor/layer-helpers.js +131 -0
- package/dist/web/static/js/editor/layer-panel.js +600 -0
- package/dist/web/static/js/editor/mask-utils.js +91 -0
- package/dist/web/static/js/editor/shortcuts-popover.js +149 -0
- package/dist/web/static/js/editor/slider-ux.js +191 -0
- package/dist/web/static/js/editor/snap.js +107 -0
- package/dist/web/static/js/editor/state.js +257 -0
- package/dist/web/static/js/editor/stroke-pipeline.js +162 -0
- package/dist/web/static/js/editor/stroke-tool-sliders.js +64 -0
- package/dist/web/static/js/editor/tools/clone.js +81 -0
- package/dist/web/static/js/editor/tools/crop.js +137 -0
- package/dist/web/static/js/editor/tools/flood-fill.js +72 -0
- package/dist/web/static/js/editor/tools/lasso-mask.js +171 -0
- package/dist/web/static/js/editor/tools/lasso.js +65 -0
- package/dist/web/static/js/editor/tools/move.js +79 -0
- package/dist/web/static/js/editor/tools/stroke.js +123 -0
- package/dist/web/static/js/editor/tools/transform-drag.js +174 -0
- package/dist/web/static/js/editor/tools/transform-handles.js +271 -0
- package/dist/web/static/js/editor/tools/transform-session.js +381 -0
- package/dist/web/static/js/editor/tools/wand.js +46 -0
- package/dist/web/static/js/editor/wire-import.js +148 -0
- package/dist/web/static/js/editor/wire-inpaint-controls.js +164 -0
- package/dist/web/static/js/editor/wire-merge-buttons.js +103 -0
- package/dist/web/static/js/editor/wire-selection-controls.js +170 -0
- package/dist/web/static/js/editor/wire-topbar-menus.js +174 -0
- package/dist/web/static/js/editor/wire-topbar-overflow.js +49 -0
- package/dist/web/static/js/editor/wire-topbar.js +188 -0
- package/dist/web/static/js/emailInbox.js +1245 -0
- package/dist/web/static/js/emailLibrary/replyRecipients.js +27 -0
- package/dist/web/static/js/emailLibrary/signatureFold.js +339 -0
- package/dist/web/static/js/emailLibrary/state.js +34 -0
- package/dist/web/static/js/emailLibrary/utils.js +202 -0
- package/dist/web/static/js/emailLibrary.js +5217 -0
- package/dist/web/static/js/emojiPicker.js +311 -0
- package/dist/web/static/js/escMenuStack.js +102 -0
- package/dist/web/static/js/fileHandler.js +295 -0
- package/dist/web/static/js/gallery.js +2835 -0
- package/dist/web/static/js/galleryEditor.js +3798 -0
- package/dist/web/static/js/group.js +955 -0
- package/dist/web/static/js/init.js +405 -0
- package/dist/web/static/js/keyboard-shortcuts.js +292 -0
- package/dist/web/static/js/langIcons.js +187 -0
- package/dist/web/static/js/markdown/tableRow.js +19 -0
- package/dist/web/static/js/markdown.js +806 -0
- package/dist/web/static/js/memory.js +1418 -0
- package/dist/web/static/js/modalManager.js +1552 -0
- package/dist/web/static/js/modalSnap.js +782 -0
- package/dist/web/static/js/model/matchKey.js +19 -0
- package/dist/web/static/js/modelPicker.js +695 -0
- package/dist/web/static/js/modelSort.js +33 -0
- package/dist/web/static/js/models.js +642 -0
- package/dist/web/static/js/notes.js +5054 -0
- package/dist/web/static/js/package.json +1 -0
- package/dist/web/static/js/platform.js +47 -0
- package/dist/web/static/js/presets.js +1110 -0
- package/dist/web/static/js/providers.js +93 -0
- package/dist/web/static/js/rag.js +177 -0
- package/dist/web/static/js/research/jobs.js +335 -0
- package/dist/web/static/js/research/panel.js +1233 -0
- package/dist/web/static/js/researchSynapse.js +225 -0
- package/dist/web/static/js/search-chat.js +201 -0
- package/dist/web/static/js/search.js +52 -0
- package/dist/web/static/js/section-management.js +260 -0
- package/dist/web/static/js/sessions.js +3108 -0
- package/dist/web/static/js/settings.js +4991 -0
- package/dist/web/static/js/sidebar-layout.js +573 -0
- package/dist/web/static/js/signature.js +504 -0
- package/dist/web/static/js/skills.js +1908 -0
- package/dist/web/static/js/slashAutocomplete.js +267 -0
- package/dist/web/static/js/slashCommands.js +6099 -0
- package/dist/web/static/js/spinner.js +406 -0
- package/dist/web/static/js/storage.js +123 -0
- package/dist/web/static/js/tasks.js +2699 -0
- package/dist/web/static/js/theme.js +2086 -0
- package/dist/web/static/js/tileManager.js +386 -0
- package/dist/web/static/js/tourAutoplay.js +133 -0
- package/dist/web/static/js/tourHints.js +179 -0
- package/dist/web/static/js/tts-ai.js +521 -0
- package/dist/web/static/js/ui.js +1288 -0
- package/dist/web/static/js/util/ordinal.js +13 -0
- package/dist/web/static/js/voiceRecorder.js +283 -0
- package/dist/web/static/js/windowDrag.js +326 -0
- package/dist/web/static/js/windowResize.js +233 -0
- package/dist/web/static/landing.html +824 -0
- package/dist/web/static/lib/docx.umd.min.js +20116 -0
- package/dist/web/static/lib/highlight.min.js +1213 -0
- package/dist/web/static/lib/html2pdf.bundle.min.js +3 -0
- package/dist/web/static/lib/mammoth.browser.min.js +21 -0
- package/dist/web/static/lib/qrcode.min.js +8 -0
- package/dist/web/static/lib/xlsx.full.min.js +24 -0
- package/dist/web/static/login.html +582 -0
- package/dist/web/static/manifest.json +15 -0
- package/dist/web/static/style.css +35733 -0
- package/dist/web/static/sw.js +144 -0
- package/dist/workflows/engine.d.ts +162 -0
- package/dist/workflows/engine.d.ts.map +1 -0
- package/dist/workflows/engine.js +625 -0
- package/dist/workflows/engine.js.map +1 -0
- package/dist/workflows/index.d.ts +8 -0
- package/dist/workflows/index.d.ts.map +1 -0
- package/dist/workflows/index.js +14 -0
- package/dist/workflows/index.js.map +1 -0
- package/package.json +112 -0
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/voice/wake_word.ts
|
|
3
|
+
* =========================
|
|
4
|
+
* Always-on wake word detector. Runs as a cancellable async loop.
|
|
5
|
+
* Fires `on_wake(word)` the moment BERU's name is heard.
|
|
6
|
+
*
|
|
7
|
+
* Python backends tried in order (fully offline first):
|
|
8
|
+
* 1. openwakeword — ONNX model, ~1MB, zero latency
|
|
9
|
+
* 2. pvporcupine — Picovoice local engine
|
|
10
|
+
* 3. sr_polling — SpeechRecognition short-clip polling
|
|
11
|
+
* 4. whisper_polling — faster-whisper tiny on 2s clips
|
|
12
|
+
*
|
|
13
|
+
* ── Node reality ─────────────────────────────────────────────────────────────
|
|
14
|
+
* `openwakeword`, `pvporcupine`, `SpeechRecognition`, `faster-whisper`,
|
|
15
|
+
* `pyaudio` and `sounddevice` are all Python-only. Every backend name and the
|
|
16
|
+
* whole lifecycle API are preserved; a detector can be registered at runtime
|
|
17
|
+
* with `registerWakeDetector(name, detector)` and a clip recognizer with
|
|
18
|
+
* `registerClipRecognizer(recognizer)`.
|
|
19
|
+
*
|
|
20
|
+
* TODO(port): wake-word detection is fully degraded until a detector is
|
|
21
|
+
* registered. Recommended replacements to investigate:
|
|
22
|
+
* - `@huggingface/transformers` + an openWakeWord ONNX export (NOT installed)
|
|
23
|
+
* - `onnxruntime-node` running openWakeWord models (NOT installed)
|
|
24
|
+
* - Porcupine via a Node binding (none installed)
|
|
25
|
+
* - a `whisper.cpp` CLI binary shelled out from node:child_process
|
|
26
|
+
*/
|
|
27
|
+
export declare const WAKE_WORDS: string[];
|
|
28
|
+
/** Provider ids, matching the strings the Python `_backend` attribute held. */
|
|
29
|
+
export type WakeBackendName = "openwakeword" | "pvporcupine" | "sr_polling" | "whisper_polling" | "none";
|
|
30
|
+
/** Actionable error emitted when nothing is registered. */
|
|
31
|
+
export declare const WAKE_UNAVAILABLE_ERROR: string;
|
|
32
|
+
export declare const WAKE_RECOGNIZER_MISSING_ERROR: string;
|
|
33
|
+
/**
|
|
34
|
+
* A native (streaming) wake word engine, e.g. an openWakeWord ONNX port.
|
|
35
|
+
* `feed()` is called with 16-bit 16 kHz mono PCM frames; the detector invokes
|
|
36
|
+
* `wake()` when the phrase fires.
|
|
37
|
+
*/
|
|
38
|
+
export interface WakeDetector {
|
|
39
|
+
readonly name: string;
|
|
40
|
+
/** Start consuming audio. Called once from `start()`. */
|
|
41
|
+
run(wake: (word: string) => void, signal: AbortSignal): Promise<void>;
|
|
42
|
+
/** Extra keys are permitted; the detector object is logged via `backend`. */
|
|
43
|
+
[key: string]: unknown;
|
|
44
|
+
}
|
|
45
|
+
/** A short-clip recognizer used by the sr_polling / whisper_polling backends. */
|
|
46
|
+
export interface ClipRecognizer {
|
|
47
|
+
readonly name: string;
|
|
48
|
+
/** Transcribe raw 16-bit 16 kHz mono PCM. Returns "" when nothing is heard. */
|
|
49
|
+
recognizePcm(pcm: Buffer): Promise<string>;
|
|
50
|
+
}
|
|
51
|
+
/** Register (or replace) a native wake-word detector at runtime. */
|
|
52
|
+
export declare function registerWakeDetector(name: string, detector: WakeDetector): void;
|
|
53
|
+
export declare function unregisterWakeDetector(name: string): void;
|
|
54
|
+
export declare function getWakeDetector(name: string): WakeDetector | undefined;
|
|
55
|
+
/** Register the clip recognizer that powers the polling backends. */
|
|
56
|
+
export declare function registerClipRecognizer(recognizer: ClipRecognizer | null): void;
|
|
57
|
+
/** Small promise/flag signal replacing `threading.Event`. */
|
|
58
|
+
declare class Signal {
|
|
59
|
+
private _set;
|
|
60
|
+
private _waiters;
|
|
61
|
+
set(): void;
|
|
62
|
+
clear(): void;
|
|
63
|
+
is_set(): boolean;
|
|
64
|
+
/** Returns true immediately when already set, else races the timeout. */
|
|
65
|
+
wait(timeoutSeconds: number): Promise<boolean>;
|
|
66
|
+
}
|
|
67
|
+
export declare class WakeWordDetector {
|
|
68
|
+
/** Always-on wake word listener. Non-blocking — runs as a cancellable loop. */
|
|
69
|
+
on_wake: (word: string) => void;
|
|
70
|
+
wake_words: string[];
|
|
71
|
+
sensitivity: number;
|
|
72
|
+
protected _stop_ev: Signal;
|
|
73
|
+
protected _abort: AbortController | null;
|
|
74
|
+
protected _thread: Promise<void> | null;
|
|
75
|
+
protected _backend: string;
|
|
76
|
+
protected _active: boolean;
|
|
77
|
+
protected _lastError: string;
|
|
78
|
+
protected _loggedDegraded: string;
|
|
79
|
+
constructor(on_wake: (word: string) => void, wake_words?: string[] | null, sensitivity?: number);
|
|
80
|
+
/**
|
|
81
|
+
* Ports the Python `_detect_backend()`. Each `import` probe becomes "is an
|
|
82
|
+
* engine registered under that id".
|
|
83
|
+
*
|
|
84
|
+
* For multi-word phrases like "beru activate", openWakeWord cannot score them
|
|
85
|
+
* directly — its pretrained models are single keywords only — so text-based
|
|
86
|
+
* matching (sr_polling / whisper_polling) is preferred for those.
|
|
87
|
+
*/
|
|
88
|
+
private _detect_backend;
|
|
89
|
+
get backend(): string;
|
|
90
|
+
/** Last `[ERROR] …` string produced by a degraded path. */
|
|
91
|
+
get lastError(): string;
|
|
92
|
+
get isAvailable(): boolean;
|
|
93
|
+
start(): void;
|
|
94
|
+
stop(): void;
|
|
95
|
+
is_running(): boolean;
|
|
96
|
+
isRunning(): boolean;
|
|
97
|
+
private _run;
|
|
98
|
+
/**
|
|
99
|
+
* Fire the wake callback with a cooldown so it does not double-trigger.
|
|
100
|
+
* The Python version spawned a 2s reset thread; here it is a timer.
|
|
101
|
+
*/
|
|
102
|
+
protected _fire(word: string): void;
|
|
103
|
+
/**
|
|
104
|
+
* TODO(port): `openwakeword` (ONNX, ~1MB) and `pvporcupine` are Python-only.
|
|
105
|
+
* A registered detector supplies the same behaviour — the model download,
|
|
106
|
+
* 1280-frame streaming loop and score-threshold logic all live behind the
|
|
107
|
+
* `WakeDetector.run()` seam. Recommended replacement: an ONNX runtime
|
|
108
|
+
* (`onnxruntime-node`, NOT installed) running openWakeWord models.
|
|
109
|
+
*/
|
|
110
|
+
private _runRegistered;
|
|
111
|
+
/**
|
|
112
|
+
* Record short clips and check the transcription for wake words.
|
|
113
|
+
*
|
|
114
|
+
* TODO(port): Python used `speech_recognition` with pocketsphinx (offline) or
|
|
115
|
+
* Google STT. Neither is available for Node; a registered `ClipRecognizer`
|
|
116
|
+
* takes its place (see `registerClipRecognizer`).
|
|
117
|
+
*/
|
|
118
|
+
private _run_sr_polling;
|
|
119
|
+
/**
|
|
120
|
+
* Last-resort fallback: record ~2s clips and transcribe locally.
|
|
121
|
+
*
|
|
122
|
+
* TODO(port): Python used `faster_whisper.WhisperModel("tiny")` plus
|
|
123
|
+
* pyaudio/sounddevice. There is no Node STT engine installed — the registered
|
|
124
|
+
* `ClipRecognizer` (or an `registerSTTBackend` engine bridged in) fills in.
|
|
125
|
+
* Recommended replacement: `whisper.cpp` CLI or whisper ONNX via
|
|
126
|
+
* `@huggingface/transformers` (NOT installed).
|
|
127
|
+
*/
|
|
128
|
+
private _run_whisper_polling;
|
|
129
|
+
/**
|
|
130
|
+
* Record one short clip through the registered audio input driver.
|
|
131
|
+
* Returns null (with a descriptive `[ERROR]`) when no driver is registered.
|
|
132
|
+
*/
|
|
133
|
+
protected _recordClip(signal: AbortSignal, seconds: number): Promise<Buffer | null>;
|
|
134
|
+
/**
|
|
135
|
+
* Persist a captured clip as a hand-rolled 44-byte-header WAV.
|
|
136
|
+
* Replaces Python's `wave` module usage in `_run_whisper_polling`.
|
|
137
|
+
*/
|
|
138
|
+
protected saveClipWav(pcm: Buffer, filePath?: string): string;
|
|
139
|
+
protected unlinkClip(filePath: string): void;
|
|
140
|
+
protected _degraded(msg: string): void;
|
|
141
|
+
}
|
|
142
|
+
export declare function get_wake_detector(on_wake: (word: string) => void, kwargs?: {
|
|
143
|
+
wake_words?: string[];
|
|
144
|
+
sensitivity?: number;
|
|
145
|
+
}): WakeWordDetector;
|
|
146
|
+
/** camelCase alias of `get_wake_detector` (avoids colliding with the registry getter). */
|
|
147
|
+
export declare const getWakeDetectorInstance: typeof get_wake_detector;
|
|
148
|
+
/** Test/DI hook — replace the singleton. */
|
|
149
|
+
export declare function setWakeDetector(detector: WakeWordDetector | null): void;
|
|
150
|
+
/** Cancellable sleep — the async replacement for `time.sleep`. */
|
|
151
|
+
export declare function sleep(seconds: number, signal?: AbortSignal): Promise<void>;
|
|
152
|
+
export {};
|
|
153
|
+
//# sourceMappingURL=wake_word.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wake_word.d.ts","sourceRoot":"","sources":["../../src/voice/wake_word.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,458 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/voice/wake_word.ts
|
|
3
|
+
* =========================
|
|
4
|
+
* Always-on wake word detector. Runs as a cancellable async loop.
|
|
5
|
+
* Fires `on_wake(word)` the moment BERU's name is heard.
|
|
6
|
+
*
|
|
7
|
+
* Python backends tried in order (fully offline first):
|
|
8
|
+
* 1. openwakeword — ONNX model, ~1MB, zero latency
|
|
9
|
+
* 2. pvporcupine — Picovoice local engine
|
|
10
|
+
* 3. sr_polling — SpeechRecognition short-clip polling
|
|
11
|
+
* 4. whisper_polling — faster-whisper tiny on 2s clips
|
|
12
|
+
*
|
|
13
|
+
* ── Node reality ─────────────────────────────────────────────────────────────
|
|
14
|
+
* `openwakeword`, `pvporcupine`, `SpeechRecognition`, `faster-whisper`,
|
|
15
|
+
* `pyaudio` and `sounddevice` are all Python-only. Every backend name and the
|
|
16
|
+
* whole lifecycle API are preserved; a detector can be registered at runtime
|
|
17
|
+
* with `registerWakeDetector(name, detector)` and a clip recognizer with
|
|
18
|
+
* `registerClipRecognizer(recognizer)`.
|
|
19
|
+
*
|
|
20
|
+
* TODO(port): wake-word detection is fully degraded until a detector is
|
|
21
|
+
* registered. Recommended replacements to investigate:
|
|
22
|
+
* - `@huggingface/transformers` + an openWakeWord ONNX export (NOT installed)
|
|
23
|
+
* - `onnxruntime-node` running openWakeWord models (NOT installed)
|
|
24
|
+
* - Porcupine via a Node binding (none installed)
|
|
25
|
+
* - a `whisper.cpp` CLI binary shelled out from node:child_process
|
|
26
|
+
*/
|
|
27
|
+
import { getLogger } from "../core/logger.js";
|
|
28
|
+
import { AUDIO_INPUT_MISSING_ERROR, getAudioInputDriver, pcm16MeanAbs as meanAbs, writeWav, } from "./wav.js";
|
|
29
|
+
import fs from "node:fs";
|
|
30
|
+
import os from "node:os";
|
|
31
|
+
import path from "node:path";
|
|
32
|
+
const logger = getLogger();
|
|
33
|
+
export const WAKE_WORDS = ["beru activate", "beru", "shadow monarch", "marshal", "my liege"];
|
|
34
|
+
/** Actionable error emitted when nothing is registered. */
|
|
35
|
+
export const WAKE_UNAVAILABLE_ERROR = "[ERROR] wake word detection unavailable — no detector registered. The Python " +
|
|
36
|
+
"stack used openwakeword / pvporcupine / SpeechRecognition / faster-whisper, " +
|
|
37
|
+
"none of which have installable Node equivalents here. Call " +
|
|
38
|
+
"registerWakeDetector('my-detector', impl) or registerClipRecognizer(impl) " +
|
|
39
|
+
"(see src/voice/wake_word.ts).";
|
|
40
|
+
export const WAKE_RECOGNIZER_MISSING_ERROR = "[ERROR] wake word polling unavailable — no clip recognizer registered and no " +
|
|
41
|
+
"STT engine installed (whisper/faster-whisper are Python-only). Call " +
|
|
42
|
+
"registerClipRecognizer({ name, recognizePcm }) to enable sr_polling / " +
|
|
43
|
+
"whisper_polling.";
|
|
44
|
+
const _detectors = new Map();
|
|
45
|
+
let _clipRecognizer = null;
|
|
46
|
+
/** Register (or replace) a native wake-word detector at runtime. */
|
|
47
|
+
export function registerWakeDetector(name, detector) {
|
|
48
|
+
_detectors.set(name, detector);
|
|
49
|
+
}
|
|
50
|
+
export function unregisterWakeDetector(name) {
|
|
51
|
+
_detectors.delete(name);
|
|
52
|
+
}
|
|
53
|
+
export function getWakeDetector(name) {
|
|
54
|
+
return _detectors.get(name);
|
|
55
|
+
}
|
|
56
|
+
/** Register the clip recognizer that powers the polling backends. */
|
|
57
|
+
export function registerClipRecognizer(recognizer) {
|
|
58
|
+
_clipRecognizer = recognizer;
|
|
59
|
+
}
|
|
60
|
+
/** The engine currently registered under a polling backend id, if any. */
|
|
61
|
+
function pollRecognizerFor(backend) {
|
|
62
|
+
const detector = _detectors.get(backend);
|
|
63
|
+
if (detector && typeof detector["recognizePcm"] === "function") {
|
|
64
|
+
return detector;
|
|
65
|
+
}
|
|
66
|
+
return _clipRecognizer;
|
|
67
|
+
}
|
|
68
|
+
/** First registered streaming detector, regardless of the name it was filed under. */
|
|
69
|
+
function firstRegisteredDetector() {
|
|
70
|
+
for (const detector of _detectors.values()) {
|
|
71
|
+
if (typeof detector.run === "function")
|
|
72
|
+
return detector;
|
|
73
|
+
}
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
/* ────────────────────────────────────────────────────────────────────────────
|
|
77
|
+
* WakeWordDetector
|
|
78
|
+
* ──────────────────────────────────────────────────────────────────────────── */
|
|
79
|
+
/** Small promise/flag signal replacing `threading.Event`. */
|
|
80
|
+
class Signal {
|
|
81
|
+
_set = false;
|
|
82
|
+
_waiters = [];
|
|
83
|
+
set() {
|
|
84
|
+
this._set = true;
|
|
85
|
+
const waiters = this._waiters;
|
|
86
|
+
this._waiters = [];
|
|
87
|
+
for (const w of waiters)
|
|
88
|
+
w();
|
|
89
|
+
}
|
|
90
|
+
clear() {
|
|
91
|
+
this._set = false;
|
|
92
|
+
}
|
|
93
|
+
is_set() {
|
|
94
|
+
return this._set;
|
|
95
|
+
}
|
|
96
|
+
/** Returns true immediately when already set, else races the timeout. */
|
|
97
|
+
async wait(timeoutSeconds) {
|
|
98
|
+
if (this._set)
|
|
99
|
+
return true;
|
|
100
|
+
return await new Promise((resolve) => {
|
|
101
|
+
let settled = false;
|
|
102
|
+
const done = (v) => {
|
|
103
|
+
if (settled)
|
|
104
|
+
return;
|
|
105
|
+
settled = true;
|
|
106
|
+
resolve(v);
|
|
107
|
+
};
|
|
108
|
+
const timer = setTimeout(() => done(false), Math.max(0, timeoutSeconds * 1000));
|
|
109
|
+
this._waiters.push(() => {
|
|
110
|
+
clearTimeout(timer);
|
|
111
|
+
done(true);
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
export class WakeWordDetector {
|
|
117
|
+
/** Always-on wake word listener. Non-blocking — runs as a cancellable loop. */
|
|
118
|
+
on_wake;
|
|
119
|
+
wake_words;
|
|
120
|
+
sensitivity;
|
|
121
|
+
_stop_ev = new Signal();
|
|
122
|
+
_abort = null;
|
|
123
|
+
_thread = null;
|
|
124
|
+
_backend;
|
|
125
|
+
_active = false; // True while in cooldown after wake
|
|
126
|
+
_lastError = "";
|
|
127
|
+
_loggedDegraded = "";
|
|
128
|
+
constructor(on_wake, wake_words = null, sensitivity = 0.5) {
|
|
129
|
+
this.on_wake = on_wake;
|
|
130
|
+
this.wake_words = (wake_words ?? WAKE_WORDS).map((w) => w.toLowerCase());
|
|
131
|
+
this.sensitivity = sensitivity;
|
|
132
|
+
this._backend = this._detect_backend();
|
|
133
|
+
}
|
|
134
|
+
/* ── backend detection ──────────────────────────────────────────────────── */
|
|
135
|
+
/**
|
|
136
|
+
* Ports the Python `_detect_backend()`. Each `import` probe becomes "is an
|
|
137
|
+
* engine registered under that id".
|
|
138
|
+
*
|
|
139
|
+
* For multi-word phrases like "beru activate", openWakeWord cannot score them
|
|
140
|
+
* directly — its pretrained models are single keywords only — so text-based
|
|
141
|
+
* matching (sr_polling / whisper_polling) is preferred for those.
|
|
142
|
+
*/
|
|
143
|
+
_detect_backend() {
|
|
144
|
+
const primary = this.wake_words[0] ?? "";
|
|
145
|
+
const needsTextMatch = primary.includes(" ");
|
|
146
|
+
const candidates = [
|
|
147
|
+
["openwakeword", "openwakeword"],
|
|
148
|
+
["pvporcupine", "pvporcupine"],
|
|
149
|
+
["speech_recognition", "sr_polling"],
|
|
150
|
+
];
|
|
151
|
+
for (const [id, name] of candidates) {
|
|
152
|
+
if (!_detectors.has(id) && !(name === "sr_polling" && _clipRecognizer))
|
|
153
|
+
continue;
|
|
154
|
+
if (name === "openwakeword" && needsTextMatch)
|
|
155
|
+
continue; // can't match multi-word
|
|
156
|
+
return name;
|
|
157
|
+
}
|
|
158
|
+
// whisper/faster-whisper is already a dependency of light_daemon — final fallback.
|
|
159
|
+
if (_detectors.has("faster_whisper") || _detectors.has("whisper") || _clipRecognizer) {
|
|
160
|
+
return "whisper_polling";
|
|
161
|
+
}
|
|
162
|
+
// Any other registered streaming detector (e.g. a custom ONNX engine).
|
|
163
|
+
if (firstRegisteredDetector())
|
|
164
|
+
return "openwakeword";
|
|
165
|
+
return "none";
|
|
166
|
+
}
|
|
167
|
+
get backend() {
|
|
168
|
+
return this._backend;
|
|
169
|
+
}
|
|
170
|
+
/** Last `[ERROR] …` string produced by a degraded path. */
|
|
171
|
+
get lastError() {
|
|
172
|
+
return this._lastError;
|
|
173
|
+
}
|
|
174
|
+
get isAvailable() {
|
|
175
|
+
return this._backend !== "none";
|
|
176
|
+
}
|
|
177
|
+
/* ── lifecycle ──────────────────────────────────────────────────────────── */
|
|
178
|
+
start() {
|
|
179
|
+
if (this._thread)
|
|
180
|
+
return; // already running
|
|
181
|
+
this._stop_ev.clear();
|
|
182
|
+
this._abort = new AbortController();
|
|
183
|
+
const signal = this._abort.signal;
|
|
184
|
+
this._thread = this._run(signal)
|
|
185
|
+
.catch((e) => {
|
|
186
|
+
logger.error(`[WakeWord] run failed: ${errText(e)}`);
|
|
187
|
+
})
|
|
188
|
+
.finally(() => {
|
|
189
|
+
this._thread = null;
|
|
190
|
+
});
|
|
191
|
+
logger.info(`[WakeWord] started | backend=${this._backend} | words=${JSON.stringify(this.wake_words)}`);
|
|
192
|
+
}
|
|
193
|
+
stop() {
|
|
194
|
+
this._stop_ev.set();
|
|
195
|
+
this._abort?.abort();
|
|
196
|
+
this._abort = null;
|
|
197
|
+
logger.info("[WakeWord] stopped");
|
|
198
|
+
}
|
|
199
|
+
is_running() {
|
|
200
|
+
return this._thread !== null;
|
|
201
|
+
}
|
|
202
|
+
isRunning() {
|
|
203
|
+
return this.is_running();
|
|
204
|
+
}
|
|
205
|
+
/* ── dispatch ───────────────────────────────────────────────────────────── */
|
|
206
|
+
async _run(signal) {
|
|
207
|
+
switch (this._backend) {
|
|
208
|
+
case "openwakeword":
|
|
209
|
+
case "pvporcupine":
|
|
210
|
+
return this._runRegistered(signal);
|
|
211
|
+
case "sr_polling":
|
|
212
|
+
return this._run_sr_polling(signal);
|
|
213
|
+
case "whisper_polling":
|
|
214
|
+
return this._run_whisper_polling(signal);
|
|
215
|
+
default:
|
|
216
|
+
this._degraded(WAKE_UNAVAILABLE_ERROR);
|
|
217
|
+
logger.warning("[WakeWord] no audio backend found — wake word disabled");
|
|
218
|
+
logger.warning("[WakeWord] install: a Node detector or register one with registerWakeDetector()");
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Fire the wake callback with a cooldown so it does not double-trigger.
|
|
223
|
+
* The Python version spawned a 2s reset thread; here it is a timer.
|
|
224
|
+
*/
|
|
225
|
+
_fire(word) {
|
|
226
|
+
if (this._active)
|
|
227
|
+
return;
|
|
228
|
+
this._active = true;
|
|
229
|
+
logger.info(`[WakeWord] *** WAKE *** '${word}'`);
|
|
230
|
+
try {
|
|
231
|
+
this.on_wake(word);
|
|
232
|
+
}
|
|
233
|
+
catch (e) {
|
|
234
|
+
logger.error(`[WakeWord] on_wake error: ${errText(e)}`);
|
|
235
|
+
}
|
|
236
|
+
// Cooldown — reset `_active` after 2 seconds so the caller returns immediately.
|
|
237
|
+
const timer = setTimeout(() => {
|
|
238
|
+
this._active = false;
|
|
239
|
+
}, 2000);
|
|
240
|
+
if (typeof timer.unref === "function")
|
|
241
|
+
timer.unref();
|
|
242
|
+
}
|
|
243
|
+
/* ── registered streaming backend (openwakeword / porcupine slots) ──────── */
|
|
244
|
+
/**
|
|
245
|
+
* TODO(port): `openwakeword` (ONNX, ~1MB) and `pvporcupine` are Python-only.
|
|
246
|
+
* A registered detector supplies the same behaviour — the model download,
|
|
247
|
+
* 1280-frame streaming loop and score-threshold logic all live behind the
|
|
248
|
+
* `WakeDetector.run()` seam. Recommended replacement: an ONNX runtime
|
|
249
|
+
* (`onnxruntime-node`, NOT installed) running openWakeWord models.
|
|
250
|
+
*/
|
|
251
|
+
async _runRegistered(signal) {
|
|
252
|
+
const detector = _detectors.get(this._backend) ??
|
|
253
|
+
_detectors.get("openwakeword") ??
|
|
254
|
+
_detectors.get("pvporcupine") ??
|
|
255
|
+
firstRegisteredDetector();
|
|
256
|
+
if (!detector) {
|
|
257
|
+
this._degraded(WAKE_UNAVAILABLE_ERROR);
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
try {
|
|
261
|
+
// A registered detector owns the score threshold (it supplies `sensitivity`
|
|
262
|
+
// to its own model); we only gate on an explicit wake-word match.
|
|
263
|
+
await detector.run((word) => {
|
|
264
|
+
const lower = word.toLowerCase();
|
|
265
|
+
if (this.wake_words.length === 0 || this.wake_words.some((w) => lower.includes(w))) {
|
|
266
|
+
this._fire(lower);
|
|
267
|
+
}
|
|
268
|
+
}, signal);
|
|
269
|
+
}
|
|
270
|
+
catch (e) {
|
|
271
|
+
logger.error(`[WakeWord] ${detector.name} crashed: ${errText(e)}`);
|
|
272
|
+
this._degraded(`[ERROR] wake detector '${detector.name}' crashed: ${errText(e)}`);
|
|
273
|
+
// Port the Python fallback: switch to whisper_polling.
|
|
274
|
+
this._backend = "whisper_polling";
|
|
275
|
+
await this._run_whisper_polling(signal);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
/* ── SpeechRecognition polling fallback ─────────────────────────────────── */
|
|
279
|
+
/**
|
|
280
|
+
* Record short clips and check the transcription for wake words.
|
|
281
|
+
*
|
|
282
|
+
* TODO(port): Python used `speech_recognition` with pocketsphinx (offline) or
|
|
283
|
+
* Google STT. Neither is available for Node; a registered `ClipRecognizer`
|
|
284
|
+
* takes its place (see `registerClipRecognizer`).
|
|
285
|
+
*/
|
|
286
|
+
async _run_sr_polling(signal) {
|
|
287
|
+
const recognizer = pollRecognizerFor("sr_polling");
|
|
288
|
+
if (!recognizer) {
|
|
289
|
+
this._degraded(WAKE_RECOGNIZER_MISSING_ERROR);
|
|
290
|
+
logger.warning("[WakeWord] no clip recognizer registered — falling back to whisper_polling");
|
|
291
|
+
this._backend = "whisper_polling";
|
|
292
|
+
await this._run_whisper_polling(signal);
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
// Refuse to spin: without an audio driver there is nothing to poll.
|
|
296
|
+
if (!getAudioInputDriver()) {
|
|
297
|
+
this._degraded(AUDIO_INPUT_MISSING_ERROR);
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
logger.info("[WakeWord] sr_polling — listening (short clips)");
|
|
301
|
+
while (!this._stop_ev.is_set() && !signal.aborted) {
|
|
302
|
+
try {
|
|
303
|
+
const pcm = await this._recordClip(signal, 3);
|
|
304
|
+
if (!pcm) {
|
|
305
|
+
await sleep(0.5, signal); // no audio driver / empty clip — do not busy-loop
|
|
306
|
+
continue;
|
|
307
|
+
}
|
|
308
|
+
const text = (await recognizer.recognizePcm(pcm)).toLowerCase();
|
|
309
|
+
if (!text)
|
|
310
|
+
continue;
|
|
311
|
+
for (const w of this.wake_words) {
|
|
312
|
+
if (text.includes(w)) {
|
|
313
|
+
this._fire(w);
|
|
314
|
+
break;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
catch (e) {
|
|
319
|
+
logger.debug(`[WakeWord] clip error: ${errText(e)}`);
|
|
320
|
+
await sleep(0.3, signal);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
/* ── Whisper polling fallback ───────────────────────────────────────────── */
|
|
325
|
+
/**
|
|
326
|
+
* Last-resort fallback: record ~2s clips and transcribe locally.
|
|
327
|
+
*
|
|
328
|
+
* TODO(port): Python used `faster_whisper.WhisperModel("tiny")` plus
|
|
329
|
+
* pyaudio/sounddevice. There is no Node STT engine installed — the registered
|
|
330
|
+
* `ClipRecognizer` (or an `registerSTTBackend` engine bridged in) fills in.
|
|
331
|
+
* Recommended replacement: `whisper.cpp` CLI or whisper ONNX via
|
|
332
|
+
* `@huggingface/transformers` (NOT installed).
|
|
333
|
+
*/
|
|
334
|
+
async _run_whisper_polling(signal) {
|
|
335
|
+
const recognizer = pollRecognizerFor("whisper_polling");
|
|
336
|
+
if (!recognizer) {
|
|
337
|
+
this._degraded(WAKE_RECOGNIZER_MISSING_ERROR);
|
|
338
|
+
logger.error("[WakeWord] whisper_polling needs a registered recognizer " +
|
|
339
|
+
"(whisper/faster-whisper are Python-only)");
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
// Refuse to spin: without an audio driver there is nothing to poll.
|
|
343
|
+
if (!getAudioInputDriver()) {
|
|
344
|
+
this._degraded(AUDIO_INPUT_MISSING_ERROR);
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
347
|
+
logger.info("[WakeWord] whisper_polling — listening (2s clips)");
|
|
348
|
+
while (!this._stop_ev.is_set() && !signal.aborted) {
|
|
349
|
+
try {
|
|
350
|
+
const pcm = await this._recordClip(signal, 2);
|
|
351
|
+
// Quick energy check — skip silence (ported SILENCE/energy guard).
|
|
352
|
+
if (!pcm || meanAbs(pcm) < 150) {
|
|
353
|
+
await sleep(0.5, signal); // nothing captured — do not busy-loop
|
|
354
|
+
continue;
|
|
355
|
+
}
|
|
356
|
+
const text = (await recognizer.recognizePcm(pcm)).toLowerCase().trim();
|
|
357
|
+
if (text) {
|
|
358
|
+
logger.debug(`[WakeWord] whisper clip: '${text}'`);
|
|
359
|
+
for (const w of this.wake_words) {
|
|
360
|
+
if (text.includes(w)) {
|
|
361
|
+
this._fire(w);
|
|
362
|
+
break;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
catch (e) {
|
|
368
|
+
logger.debug(`[WakeWord] whisper clip error: ${errText(e)}`);
|
|
369
|
+
await sleep(0.5, signal);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
/* ── mic helpers ────────────────────────────────────────────────────────── */
|
|
374
|
+
/**
|
|
375
|
+
* Record one short clip through the registered audio input driver.
|
|
376
|
+
* Returns null (with a descriptive `[ERROR]`) when no driver is registered.
|
|
377
|
+
*/
|
|
378
|
+
async _recordClip(signal, seconds) {
|
|
379
|
+
const driver = getAudioInputDriver();
|
|
380
|
+
if (!driver) {
|
|
381
|
+
this._degraded(AUDIO_INPUT_MISSING_ERROR);
|
|
382
|
+
return null;
|
|
383
|
+
}
|
|
384
|
+
try {
|
|
385
|
+
const pcm = await driver.record({
|
|
386
|
+
maxSeconds: seconds,
|
|
387
|
+
sampleRate: 16_000,
|
|
388
|
+
silenceSeconds: seconds,
|
|
389
|
+
signal,
|
|
390
|
+
});
|
|
391
|
+
return pcm && pcm.length > 0 ? pcm : null;
|
|
392
|
+
}
|
|
393
|
+
catch (e) {
|
|
394
|
+
logger.debug(`[WakeWord] record failed: ${errText(e)}`);
|
|
395
|
+
return null;
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Persist a captured clip as a hand-rolled 44-byte-header WAV.
|
|
400
|
+
* Replaces Python's `wave` module usage in `_run_whisper_polling`.
|
|
401
|
+
*/
|
|
402
|
+
saveClipWav(pcm, filePath) {
|
|
403
|
+
const target = filePath ??
|
|
404
|
+
path.join(os.tmpdir(), `beru-wake-${Date.now()}-${Math.floor(Math.random() * 1e6)}.wav`);
|
|
405
|
+
writeWav(target, pcm, 16_000, 1);
|
|
406
|
+
return target;
|
|
407
|
+
}
|
|
408
|
+
unlinkClip(filePath) {
|
|
409
|
+
try {
|
|
410
|
+
fs.unlinkSync(filePath);
|
|
411
|
+
}
|
|
412
|
+
catch {
|
|
413
|
+
/* best effort */
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
_degraded(msg) {
|
|
417
|
+
this._lastError = msg;
|
|
418
|
+
// Deduplicate: the polling loops hit these paths every cycle.
|
|
419
|
+
if (this._loggedDegraded === msg)
|
|
420
|
+
return;
|
|
421
|
+
this._loggedDegraded = msg;
|
|
422
|
+
logger.warning(msg);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
/* ── singleton ─────────────────────────────────────────────────────────────── */
|
|
426
|
+
let _wwd = null;
|
|
427
|
+
export function get_wake_detector(on_wake, kwargs = {}) {
|
|
428
|
+
if (_wwd === null) {
|
|
429
|
+
_wwd = new WakeWordDetector(on_wake, kwargs.wake_words ?? null, kwargs.sensitivity ?? 0.5);
|
|
430
|
+
}
|
|
431
|
+
return _wwd;
|
|
432
|
+
}
|
|
433
|
+
/** camelCase alias of `get_wake_detector` (avoids colliding with the registry getter). */
|
|
434
|
+
export const getWakeDetectorInstance = get_wake_detector;
|
|
435
|
+
/** Test/DI hook — replace the singleton. */
|
|
436
|
+
export function setWakeDetector(detector) {
|
|
437
|
+
_wwd = detector;
|
|
438
|
+
}
|
|
439
|
+
/* ── helpers ───────────────────────────────────────────────────────────────── */
|
|
440
|
+
/** Cancellable sleep — the async replacement for `time.sleep`. */
|
|
441
|
+
export async function sleep(seconds, signal) {
|
|
442
|
+
if (signal?.aborted)
|
|
443
|
+
return;
|
|
444
|
+
await new Promise((resolve) => {
|
|
445
|
+
const timer = setTimeout(resolve, Math.max(0, seconds * 1000));
|
|
446
|
+
if (signal) {
|
|
447
|
+
const onAbort = () => {
|
|
448
|
+
clearTimeout(timer);
|
|
449
|
+
resolve();
|
|
450
|
+
};
|
|
451
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
452
|
+
}
|
|
453
|
+
});
|
|
454
|
+
}
|
|
455
|
+
function errText(e) {
|
|
456
|
+
return e instanceof Error ? e.message : String(e);
|
|
457
|
+
}
|
|
458
|
+
//# sourceMappingURL=wake_word.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wake_word.js","sourceRoot":"","sources":["../../src/voice/wake_word.ts"],"names":[],"mappings":"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"}
|