@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,93 @@
|
|
|
1
|
+
// AI provider logo SVGs — regex-based matching for self-hosted model names
|
|
2
|
+
// Uses official logos from Simple Icons where available, custom minimal SVGs otherwise
|
|
3
|
+
// All SVGs use viewBox="0 0 24 24" fill="currentColor"
|
|
4
|
+
|
|
5
|
+
const _PROVIDERS = [
|
|
6
|
+
// Ollama
|
|
7
|
+
[/ollama|:11434/i,
|
|
8
|
+
'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M12 2.5c-3.1 0-5.65 2.43-5.86 5.48A6.62 6.62 0 0 0 3 13.62C3 18 6.8 21.5 12 21.5s9-3.5 9-7.88a6.62 6.62 0 0 0-3.14-5.64C17.65 4.93 15.1 2.5 12 2.5Zm-2.7 8.25a1.15 1.15 0 1 1 0 2.3 1.15 1.15 0 0 1 0-2.3Zm5.4 0a1.15 1.15 0 1 1 0 2.3 1.15 1.15 0 0 1 0-2.3Zm-5.15 5.15c.75.7 1.55 1.04 2.45 1.04s1.7-.34 2.45-1.04c.26-.24.66-.23.9.03.24.26.23.66-.03.9-.98.91-2.08 1.37-3.32 1.37s-2.34-.46-3.32-1.37a.64.64 0 0 1-.03-.9.64.64 0 0 1 .9-.03Z"/></svg>'],
|
|
9
|
+
|
|
10
|
+
// OpenAI — GPT, o1, o3, dall-e, chatgpt
|
|
11
|
+
[/openai|gpt-|^o[13]-|chatgpt|dall-e/i,
|
|
12
|
+
'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M22.282 9.821a5.985 5.985 0 0 0-.516-4.91 6.046 6.046 0 0 0-6.51-2.9A6.065 6.065 0 0 0 10.696.453a6.023 6.023 0 0 0-5.75 4.172 6.061 6.061 0 0 0-3.946 2.945 6.024 6.024 0 0 0 .742 7.099 5.98 5.98 0 0 0 .516 4.911 6.046 6.046 0 0 0 6.51 2.9A5.996 5.996 0 0 0 13.26 23.547a6.023 6.023 0 0 0 5.75-4.172 6.061 6.061 0 0 0 3.946-2.945 6.024 6.024 0 0 0-.674-6.609zM13.26 21.047a4.508 4.508 0 0 1-2.886-1.041l.143-.082 4.793-2.769a.777.777 0 0 0 .391-.676V10.34l2.026 1.17a.072.072 0 0 1 .039.061v5.596a4.532 4.532 0 0 1-4.506 4.48zM3.968 17.64a4.473 4.473 0 0 1-.537-3.018l.143.086 4.793 2.769a.79.79 0 0 0 .782 0l5.852-3.379v2.34a.072.072 0 0 1-.029.062l-4.845 2.796a4.532 4.532 0 0 1-6.159-1.656zM2.804 7.922a4.49 4.49 0 0 1 2.348-1.973V11.6a.778.778 0 0 0 .391.676l5.852 3.378-2.026 1.17a.072.072 0 0 1-.068 0L4.456 14.03a4.532 4.532 0 0 1-1.652-6.108zm16.423 3.823L13.375 8.367l2.026-1.17a.072.072 0 0 1 .068 0l4.845 2.796a4.525 4.525 0 0 1-.7 8.08V12.42a.778.778 0 0 0-.387-.676zm2.015-3.025l-.143-.086-4.793-2.769a.79.79 0 0 0-.782 0L9.672 9.243V6.903a.072.072 0 0 1 .029-.062l4.845-2.796a4.525 4.525 0 0 1 6.696 4.675zM8.598 12.66L6.57 11.49a.072.072 0 0 1-.039-.061V5.833a4.525 4.525 0 0 1 7.413-3.48l-.143.082-4.793 2.769a.777.777 0 0 0-.391.676l-.019 6.78zm1.1-2.379l2.607-1.505 2.607 1.505v3.01l-2.607 1.505-2.607-1.505z"/></svg>'],
|
|
13
|
+
|
|
14
|
+
// OpenRouter
|
|
15
|
+
[/openrouter|open router/i,
|
|
16
|
+
'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="5" cy="12" r="2.5"/><circle cx="19" cy="6" r="2.5"/><circle cx="19" cy="18" r="2.5"/><path d="M7.5 12h4.5c2 0 2.5-6 4.5-6"/><path d="M12 12c2 0 2.5 6 4.5 6"/></svg>'],
|
|
17
|
+
|
|
18
|
+
// Ollama / Ollama Cloud
|
|
19
|
+
[/ollama/i,
|
|
20
|
+
'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M7.4 10.2a4.8 4.8 0 0 1 9.1-1.9 4.1 4.1 0 0 1 1 .1A4.8 4.8 0 0 1 17 18H7.4a3.9 3.9 0 0 1 0-7.8Zm0 2a1.9 1.9 0 0 0 0 3.8H17a2.8 2.8 0 0 0 .2-5.6 2.7 2.7 0 0 0-1.3.2l-.9.4-.4-.9a2.8 2.8 0 0 0-5.4 1.1v1H7.4Z"/></svg>'],
|
|
21
|
+
|
|
22
|
+
// Anthropic — Claude (official Simple Icons)
|
|
23
|
+
[/anthropic|claude/i,
|
|
24
|
+
'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M17.3041 3.541h-3.6718l6.696 16.918H24Zm-10.6082 0L0 20.459h3.7442l1.3693-3.5527h7.0052l1.3693 3.5528h3.7442L10.5363 3.5409Zm-.3712 10.2232 2.2914-5.9456 2.2914 5.9456Z"/></svg>'],
|
|
25
|
+
|
|
26
|
+
// Google Gemini (official Simple Icons)
|
|
27
|
+
[/google|gemini|gemma/i,
|
|
28
|
+
'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M11.04 19.32Q12 21.51 12 24q0-2.49.93-4.68.96-2.19 2.58-3.81t3.81-2.55Q21.51 12 24 12q-2.49 0-4.68-.93a12.3 12.3 0 0 1-3.81-2.58 12.3 12.3 0 0 1-2.58-3.81Q12 2.49 12 0q0 2.49-.96 4.68-.93 2.19-2.55 3.81a12.3 12.3 0 0 1-3.81 2.58Q2.49 12 0 12q2.49 0 4.68.96 2.19.93 3.81 2.55t2.55 3.81"/></svg>'],
|
|
29
|
+
|
|
30
|
+
// Meta — Llama models (official Simple Icons). Exclude the llama.cpp / llama-cpp
|
|
31
|
+
// / llamacpp inference engine — that's an independent project (ggml), not Meta.
|
|
32
|
+
[/meta|llama(?![.\-_ ]?cpp)/i,
|
|
33
|
+
'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M6.915 4.03c-1.968 0-3.683 1.28-4.871 3.113C.704 9.208 0 11.883 0 14.449c0 .706.07 1.369.21 1.973a6.624 6.624 0 0 0 .265.86 5.297 5.297 0 0 0 .371.761c.696 1.159 1.818 1.927 3.593 1.927 1.497 0 2.633-.671 3.965-2.444.76-1.012 1.144-1.626 2.663-4.32l.756-1.339.186-.325c.061.1.121.196.183.3l2.152 3.595c.724 1.21 1.665 2.556 2.47 3.314 1.046.987 1.992 1.22 3.06 1.22 1.075 0 1.876-.355 2.455-.843a3.743 3.743 0 0 0 .81-.973c.542-.939.861-2.127.861-3.745 0-2.72-.681-5.357-2.084-7.45-1.282-1.912-2.957-2.93-4.716-2.93-1.047 0-2.088.467-3.053 1.308-.652.57-1.257 1.29-1.82 2.05-.69-.875-1.335-1.547-1.958-2.056-1.182-.966-2.315-1.303-3.454-1.303zm10.16 2.053c1.147 0 2.188.758 2.992 1.999 1.132 1.748 1.647 4.195 1.647 6.4 0 1.548-.368 2.9-1.839 2.9-.58 0-1.027-.23-1.664-1.004-.496-.601-1.343-1.878-2.832-4.358l-.617-1.028a44.908 44.908 0 0 0-1.255-1.98c.07-.109.141-.224.211-.327 1.12-1.667 2.118-2.602 3.358-2.602zm-10.201.553c1.265 0 2.058.791 2.675 1.446.307.327.737.871 1.234 1.579l-1.02 1.566c-.757 1.163-1.882 3.017-2.837 4.338-1.191 1.649-1.81 1.817-2.486 1.817-.524 0-1.038-.237-1.383-.794-.263-.426-.464-1.13-.464-2.046 0-2.221.63-4.535 1.66-6.088.454-.687.964-1.226 1.533-1.533a2.264 2.264 0 0 1 1.088-.285z"/></svg>'],
|
|
34
|
+
|
|
35
|
+
// Mistral AI (official Simple Icons). Match Mixtral and Ministral too.
|
|
36
|
+
[/mi[sx]tral|ministral/i,
|
|
37
|
+
'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M17.143 3.429v3.428h-3.429v3.429h-3.428V6.857H6.857V3.43H3.43v13.714H0v3.428h10.286v-3.428H6.857v-3.429h3.429v3.429h3.429v-3.429h3.428v3.429h-3.428v3.428H24v-3.428h-3.43V3.429z"/></svg>'],
|
|
38
|
+
|
|
39
|
+
// Qwen (Tongyi Qianwen) — official geometric hexagonal logo
|
|
40
|
+
[/qwen|alibaba/i,
|
|
41
|
+
'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M12.604 1.34c.393.69.784 1.382 1.174 2.075a.18.18 0 00.157.091h5.552c.174 0 .322.11.446.327l1.454 2.57c.19.337.24.478.024.837-.26.43-.513.864-.76 1.3l-.367.658c-.106.196-.223.28-.04.512l2.652 4.637c.172.301.111.494-.043.77-.437.785-.882 1.564-1.335 2.34-.159.272-.352.375-.68.37-.777-.016-1.552-.01-2.327.016a.099.099 0 00-.081.05 575.097 575.097 0 01-2.705 4.74c-.169.293-.38.363-.725.364-.997.003-2.002.004-3.017.002a.537.537 0 01-.465-.271l-1.335-2.323a.09.09 0 00-.083-.049H4.982c-.285.03-.553-.001-.805-.092l-1.603-2.77a.543.543 0 01-.002-.54l1.207-2.12a.198.198 0 000-.197 550.951 550.951 0 01-1.875-3.272l-.79-1.395c-.16-.31-.173-.496.095-.965.465-.813.927-1.625 1.387-2.436.132-.234.304-.334.584-.335a338.3 338.3 0 012.589-.001.124.124 0 00.107-.063l2.806-4.895a.488.488 0 01.422-.246c.524-.001 1.053 0 1.583-.006L11.704 1c.341-.003.724.032.9.34zm-3.432.403a.06.06 0 00-.052.03L6.254 6.788a.157.157 0 01-.135.078H3.253c-.056 0-.07.025-.041.074l5.81 10.156c.025.042.013.062-.034.063l-2.795.015a.218.218 0 00-.2.116l-1.32 2.31c-.044.078-.021.118.068.118l5.716.008c.046 0 .08.02.104.061l1.403 2.454c.046.081.092.082.139 0l5.006-8.76.783-1.382a.055.055 0 01.096 0l1.424 2.53a.122.122 0 00.107.062l2.763-.02a.04.04 0 00.035-.02.041.041 0 000-.04l-2.9-5.086a.108.108 0 010-.113l.293-.507 1.12-1.977c.024-.041.012-.062-.035-.062H9.2c-.059 0-.073-.026-.043-.077l1.434-2.505a.107.107 0 000-.114L9.225 1.774a.06.06 0 00-.053-.031zm6.29 8.02c.046 0 .058.02.034.06l-.832 1.465-2.613 4.585a.056.056 0 01-.05.029.058.058 0 01-.05-.029L8.498 9.841c-.02-.034-.01-.052.028-.054l.216-.012 6.722-.012z"/></svg>'],
|
|
42
|
+
|
|
43
|
+
// DeepSeek (official whale logo from LobeHub icons)
|
|
44
|
+
[/deepseek/i,
|
|
45
|
+
'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M23.748 4.482c-.254-.124-.364.113-.512.234-.051.039-.094.09-.137.136-.372.397-.806.657-1.373.626-.829-.046-1.537.214-2.163.848-.133-.782-.575-1.248-1.247-1.548-.352-.156-.708-.311-.955-.65-.172-.241-.219-.51-.305-.774-.055-.16-.11-.323-.293-.35-.2-.031-.278.136-.356.276-.313.572-.434 1.202-.422 1.84.027 1.436.633 2.58 1.838 3.393.137.093.172.187.129.323-.082.28-.18.552-.266.833-.055.179-.137.217-.329.14a5.526 5.526 0 01-1.736-1.18c-.857-.828-1.631-1.742-2.597-2.458a11.365 11.365 0 00-.689-.471c-.985-.957.13-1.743.388-1.836.27-.098.093-.432-.779-.428-.872.004-1.67.295-2.687.684a3.055 3.055 0 01-.465.137 9.597 9.597 0 00-2.883-.102c-1.885.21-3.39 1.102-4.497 2.623C.082 8.606-.231 10.684.152 12.85c.403 2.284 1.569 4.175 3.36 5.653 1.858 1.533 3.997 2.284 6.438 2.14 1.482-.085 3.133-.284 4.994-1.86.47.234.962.327 1.78.397.63.059 1.236-.03 1.705-.128.735-.156.684-.837.419-.961-2.155-1.004-1.682-.595-2.113-.926 1.096-1.296 2.746-2.642 3.392-7.003.05-.347.007-.565 0-.845-.004-.17.035-.237.23-.256a4.173 4.173 0 001.545-.475c1.396-.763 1.96-2.015 2.093-3.517.02-.23-.004-.467-.247-.588zM11.581 18c-2.089-1.642-3.102-2.183-3.52-2.16-.392.024-.321.471-.235.763.09.288.207.486.371.739.114.167.192.416-.113.603-.673.416-1.842-.14-1.897-.167-1.361-.802-2.5-1.86-3.301-3.307-.774-1.393-1.224-2.887-1.298-4.482-.02-.386.093-.522.477-.592a4.696 4.696 0 011.529-.039c2.132.312 3.946 1.265 5.468 2.774.868.86 1.525 1.887 2.202 2.891.72 1.066 1.494 2.082 2.48 2.914.348.292.625.514.891.677-.802.09-2.14.11-3.054-.614zm1-6.44a.306.306 0 01.415-.287.302.302 0 01.2.288.306.306 0 01-.31.307.303.303 0 01-.304-.308zm3.11 1.596c-.2.081-.399.151-.59.16a1.245 1.245 0 01-.798-.254c-.274-.23-.47-.358-.552-.758a1.73 1.73 0 01.016-.588c.07-.327-.008-.537-.239-.727-.187-.156-.426-.199-.688-.199a.559.559 0 01-.254-.078c-.11-.054-.2-.19-.114-.358.028-.054.16-.186.192-.21.356-.202.767-.136 1.146.016.352.144.618.408 1.001.782.391.451.462.576.685.914.176.265.336.537.445.848.067.195-.019.354-.25.452z"/></svg>'],
|
|
46
|
+
|
|
47
|
+
// xAI — Grok (stylized X)
|
|
48
|
+
[/x-ai|xai|grok/i,
|
|
49
|
+
'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M14.234 10.162 22.977 0h-2.072l-7.591 8.824L7.251 0H.258l9.168 13.343L.258 24H2.33l8.016-9.318L16.749 24h6.993zm-2.837 3.299-.929-1.329L3.076 1.56h3.182l5.965 8.532.929 1.329 7.754 11.09h-3.182z"/></svg>'],
|
|
50
|
+
|
|
51
|
+
// Cohere — Command (stylized C)
|
|
52
|
+
[/cohere|command-r/i,
|
|
53
|
+
'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M12 2C6.477 2 2 6.477 2 12s4.477 10 10 10c2.15 0 4.14-.68 5.77-1.83l-.01-.01A5.5 5.5 0 0 0 14 11.5c0-.99.26-1.92.72-2.72A4.5 4.5 0 0 1 12 7.5c-2.49 0-4.5 2.01-4.5 4.5s2.01 4.5 4.5 4.5c.89 0 1.72-.26 2.42-.71a5.45 5.45 0 0 0 1.04 2.34A7.97 7.97 0 0 1 12 19.5c-4.14 0-7.5-3.36-7.5-7.5S7.86 4.5 12 4.5s7.5 3.36 7.5 7.5c0 .71-.1 1.4-.29 2.05a5.5 5.5 0 0 0-1.1-1.8c.06-.4.09-.82.09-1.25 0-3.45-2.55-6.2-6.2-6.2z"/></svg>'],
|
|
54
|
+
|
|
55
|
+
// Perplexity (official Simple Icons)
|
|
56
|
+
[/perplexity|sonar/i,
|
|
57
|
+
'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M22.3977 7.0896h-2.3106V.0676l-7.5094 6.3542V.1577h-1.1554v6.1966L4.4904 0v7.0896H1.6023v10.3976h2.8882V24l6.932-6.3591v6.2005h1.1554v-6.0469l6.9318 6.1807v-6.4879h2.8882V7.0896zm-3.4657-4.531v4.531h-5.355l5.355-4.531zm-13.2862.0676 4.8691 4.4634H5.6458V2.6262zM2.7576 16.332V8.245h7.8476l-6.1149 6.1147v1.9723H2.7576zm2.8882 5.0404v-3.8852h.0001v-2.6488l5.7763-5.7764v7.0111l-5.7764 5.2993zm12.7086.0248-5.7766-5.1509V9.0618l5.7766 5.7766v6.5588zm2.8882-5.0652h-1.733v-1.9723L13.3948 8.245h7.8478v8.087z"/></svg>'],
|
|
58
|
+
|
|
59
|
+
// Nous Research / Hermes
|
|
60
|
+
[/nous|hermes/i,
|
|
61
|
+
'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5" stroke="currentColor" stroke-width="1.5" fill="none"/></svg>'],
|
|
62
|
+
|
|
63
|
+
// Microsoft / Phi (four squares)
|
|
64
|
+
[/microsoft|phi-/i,
|
|
65
|
+
'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M1 1h10v10H1zm12 0h10v10H13zM1 13h10v10H1zm12 0h10v10H13z"/></svg>'],
|
|
66
|
+
|
|
67
|
+
// Zhipu AI — GLM, ChatGLM (official Z logo)
|
|
68
|
+
[/zhipu|glm|chatglm/i,
|
|
69
|
+
'<svg viewBox="0 0 24 24" fill="currentColor"><polygon points="19.44,5.68 10.51,18.32 4.56,18.32 13.49,5.68"/><path d="M12.38 5.68l-1.04 1.48a.86.86 0 0 1-.72.38H4.93V5.68h7.45z"/><path d="M11.62 18.32l1.05-1.49a.86.86 0 0 1 .72-.37h5.68v1.86h-7.45z"/></svg>'],
|
|
70
|
+
|
|
71
|
+
// MiniMax
|
|
72
|
+
[/minimax/i,
|
|
73
|
+
'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M4 4h4v16H4zm6 4h4v12h-4zm6-4h4v16h-4z"/></svg>'],
|
|
74
|
+
|
|
75
|
+
// Kimi / Moonshot AI (crescent moon)
|
|
76
|
+
[/kimi|moonshot/i,
|
|
77
|
+
'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M12 2A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 0-20zm0 2a8 8 0 0 1 0 16A6.5 6.5 0 0 0 12 4z"/></svg>'],
|
|
78
|
+
|
|
79
|
+
// NVIDIA / Nemotron (official Simple Icons)
|
|
80
|
+
[/nvidia|nemotron/i,
|
|
81
|
+
'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M8.948 8.798v-1.43a6.7 6.7 0 0 1 .424-.018c3.922-.124 6.493 3.374 6.493 3.374s-2.774 3.851-5.75 3.851c-.398 0-.787-.062-1.158-.185v-4.346c1.528.185 1.837.857 2.747 2.385l2.04-1.714s-1.492-1.952-4-1.952a6.016 6.016 0 0 0-.796.035m0-4.735v2.138l.424-.027c5.45-.185 9.01 4.47 9.01 4.47s-4.08 4.964-8.33 4.964c-.37 0-.733-.035-1.095-.097v1.325c.3.035.61.062.91.062 3.957 0 6.82-2.023 9.593-4.408.459.371 2.34 1.263 2.73 1.652-2.633 2.208-8.772 3.984-12.253 3.984-.335 0-.653-.018-.971-.053v1.864H24V4.063zm0 10.326v1.131c-3.657-.654-4.673-4.46-4.673-4.46s1.758-1.944 4.673-2.262v1.237H8.94c-1.528-.186-2.73 1.245-2.73 1.245s.68 2.412 2.739 3.11M2.456 10.9s2.164-3.197 6.5-3.533V6.201C4.153 6.59 0 10.653 0 10.653s2.35 6.802 8.948 7.42v-1.237c-4.84-.6-6.492-5.936-6.492-5.936z"/></svg>'],
|
|
82
|
+
];
|
|
83
|
+
|
|
84
|
+
// Returns an SVG string for the given model ID, or null if no match
|
|
85
|
+
export function providerLogo(modelId) {
|
|
86
|
+
if (!modelId) return null;
|
|
87
|
+
for (const [re, svg] of _PROVIDERS) {
|
|
88
|
+
if (re.test(modelId)) return svg;
|
|
89
|
+
}
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export default { providerLogo };
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
// static/js/rag.js
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* RAG (Retrieval Augmented Generation) management
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import uiModule from './ui.js';
|
|
8
|
+
import spinnerModule from './spinner.js';
|
|
9
|
+
|
|
10
|
+
let API_BASE = '';
|
|
11
|
+
|
|
12
|
+
export function init(apiBase) {
|
|
13
|
+
API_BASE = apiBase;
|
|
14
|
+
_setupUploadZone();
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function _humanSize(bytes) {
|
|
18
|
+
if (bytes < 1024) return bytes + ' B';
|
|
19
|
+
if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB';
|
|
20
|
+
return (bytes / (1024 * 1024)).toFixed(1) + ' MB';
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Load and display RAG documents with delete buttons
|
|
25
|
+
*/
|
|
26
|
+
export async function loadPersonalDocs() {
|
|
27
|
+
const box = document.getElementById('docs-view');
|
|
28
|
+
if (!box) return;
|
|
29
|
+
|
|
30
|
+
box.innerHTML = '';
|
|
31
|
+
const { element: wpEl } = spinnerModule.createWhirlpool(24);
|
|
32
|
+
wpEl.title = 'Loading…';
|
|
33
|
+
box.appendChild(wpEl);
|
|
34
|
+
|
|
35
|
+
try {
|
|
36
|
+
const res = await fetch(`${API_BASE}/api/personal`, { credentials: 'same-origin' });
|
|
37
|
+
const data = await res.json();
|
|
38
|
+
const files = data.files || [];
|
|
39
|
+
|
|
40
|
+
box.innerHTML = '';
|
|
41
|
+
|
|
42
|
+
if (files.length === 0) {
|
|
43
|
+
const placeholder = document.createElement('div');
|
|
44
|
+
placeholder.textContent = 'Drop files above to add to RAG';
|
|
45
|
+
placeholder.style.cssText = 'color:var(--color-muted);font-size:12px;padding:4px 0;';
|
|
46
|
+
box.appendChild(placeholder);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
files.forEach(f => {
|
|
51
|
+
const row = document.createElement('div');
|
|
52
|
+
row.className = 'list-item';
|
|
53
|
+
row.style.cssText = 'display:flex;align-items:center;gap:4px;';
|
|
54
|
+
|
|
55
|
+
const name = document.createElement('span');
|
|
56
|
+
name.className = 'grow';
|
|
57
|
+
name.textContent = f.name.split('/').pop();
|
|
58
|
+
name.title = f.path || f.name;
|
|
59
|
+
name.style.cssText = 'overflow:hidden;text-overflow:ellipsis;white-space:nowrap;';
|
|
60
|
+
row.appendChild(name);
|
|
61
|
+
|
|
62
|
+
const size = document.createElement('span');
|
|
63
|
+
size.style.cssText = 'color:var(--color-muted);font-size:11px;flex-shrink:0;';
|
|
64
|
+
size.textContent = _humanSize(f.size);
|
|
65
|
+
row.appendChild(size);
|
|
66
|
+
|
|
67
|
+
const del = document.createElement('button');
|
|
68
|
+
del.className = 'rag-file-delete';
|
|
69
|
+
del.textContent = 'x';
|
|
70
|
+
del.title = 'Remove from RAG';
|
|
71
|
+
del.style.cssText = 'background:none;border:none;color:var(--color-error);cursor:pointer;padding:2px 4px;font-size:12px;flex-shrink:0;';
|
|
72
|
+
del.addEventListener('click', (e) => {
|
|
73
|
+
e.stopPropagation();
|
|
74
|
+
_deleteFile(f.path || f.name, f.name.split('/').pop());
|
|
75
|
+
});
|
|
76
|
+
row.appendChild(del);
|
|
77
|
+
|
|
78
|
+
box.appendChild(row);
|
|
79
|
+
});
|
|
80
|
+
} catch (e) {
|
|
81
|
+
console.error(e);
|
|
82
|
+
box.innerHTML = '';
|
|
83
|
+
const error = document.createElement('div');
|
|
84
|
+
error.textContent = 'Failed to load files';
|
|
85
|
+
error.style.color = 'var(--color-error)';
|
|
86
|
+
box.appendChild(error);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
async function _deleteFile(filepath, displayName) {
|
|
91
|
+
if (!await uiModule.styledConfirm(`Remove "${displayName}" from RAG?`, { confirmText: 'Remove', danger: true })) return;
|
|
92
|
+
try {
|
|
93
|
+
const res = await fetch(`${API_BASE}/api/personal/file?filepath=${encodeURIComponent(filepath)}`, {
|
|
94
|
+
method: 'DELETE',
|
|
95
|
+
credentials: 'same-origin'
|
|
96
|
+
});
|
|
97
|
+
if (!res.ok) throw new Error(await res.text());
|
|
98
|
+
await loadPersonalDocs();
|
|
99
|
+
} catch (e) {
|
|
100
|
+
console.error('Delete failed:', e);
|
|
101
|
+
alert('Failed to delete file: ' + e.message);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Upload files to RAG
|
|
107
|
+
*/
|
|
108
|
+
export async function uploadRagFiles(fileList) {
|
|
109
|
+
if (!fileList || !fileList.length) return;
|
|
110
|
+
|
|
111
|
+
const zone = document.getElementById('rag-upload-zone');
|
|
112
|
+
if (zone) zone.textContent = 'Uploading…';
|
|
113
|
+
|
|
114
|
+
const fd = new FormData();
|
|
115
|
+
for (const file of fileList) {
|
|
116
|
+
fd.append('files', file);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
try {
|
|
120
|
+
const res = await fetch(`${API_BASE}/api/personal/upload`, {
|
|
121
|
+
method: 'POST',
|
|
122
|
+
credentials: 'same-origin',
|
|
123
|
+
body: fd
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
if (!res.ok) throw new Error(await res.text());
|
|
127
|
+
|
|
128
|
+
const data = await res.json();
|
|
129
|
+
if (zone) zone.textContent = 'Drop files here or click to upload';
|
|
130
|
+
await loadPersonalDocs();
|
|
131
|
+
return data;
|
|
132
|
+
} catch (e) {
|
|
133
|
+
console.error('Upload failed:', e);
|
|
134
|
+
if (zone) zone.textContent = 'Drop files here or click to upload';
|
|
135
|
+
alert('Upload failed: ' + e.message);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function _setupUploadZone() {
|
|
140
|
+
const zone = document.getElementById('rag-upload-zone');
|
|
141
|
+
const input = document.getElementById('rag-file-input');
|
|
142
|
+
if (!zone || !input) return;
|
|
143
|
+
|
|
144
|
+
zone.addEventListener('click', () => input.click());
|
|
145
|
+
|
|
146
|
+
zone.addEventListener('dragover', (e) => {
|
|
147
|
+
e.preventDefault();
|
|
148
|
+
zone.classList.add('dragover');
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
zone.addEventListener('dragleave', () => {
|
|
152
|
+
zone.classList.remove('dragover');
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
zone.addEventListener('drop', (e) => {
|
|
156
|
+
e.preventDefault();
|
|
157
|
+
zone.classList.remove('dragover');
|
|
158
|
+
if (e.dataTransfer.files.length) {
|
|
159
|
+
uploadRagFiles(e.dataTransfer.files);
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
input.addEventListener('change', () => {
|
|
164
|
+
if (input.files.length) {
|
|
165
|
+
uploadRagFiles(input.files);
|
|
166
|
+
input.value = '';
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
const ragModule = {
|
|
172
|
+
init,
|
|
173
|
+
loadPersonalDocs,
|
|
174
|
+
uploadRagFiles
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
export default ragModule;
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Research job queue — add, start, monitor, cancel research jobs.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
let _jobs = [];
|
|
6
|
+
let _apiBase = '';
|
|
7
|
+
let _renderCb = null;
|
|
8
|
+
let _idCounter = 0;
|
|
9
|
+
|
|
10
|
+
// Dismissed-from-panel IDs persist across reloads so Clear actually sticks.
|
|
11
|
+
// (Items still live on disk and in the Library; this just hides them here.)
|
|
12
|
+
const _DISMISSED_KEY = 'zero-research-dismissed';
|
|
13
|
+
function _loadDismissed() {
|
|
14
|
+
try {
|
|
15
|
+
const raw = localStorage.getItem(_DISMISSED_KEY);
|
|
16
|
+
return new Set(raw ? JSON.parse(raw) : []);
|
|
17
|
+
} catch { return new Set(); }
|
|
18
|
+
}
|
|
19
|
+
function _saveDismissed(set) {
|
|
20
|
+
try { localStorage.setItem(_DISMISSED_KEY, JSON.stringify([...set])); } catch {}
|
|
21
|
+
}
|
|
22
|
+
function _isDismissed(id) { return _loadDismissed().has(id); }
|
|
23
|
+
function _markDismissed(ids) {
|
|
24
|
+
const set = _loadDismissed();
|
|
25
|
+
for (const id of ids) set.add(id);
|
|
26
|
+
_saveDismissed(set);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
let _activePollInterval = null;
|
|
30
|
+
|
|
31
|
+
export function init(apiBase) {
|
|
32
|
+
_apiBase = apiBase;
|
|
33
|
+
_reconnectActive();
|
|
34
|
+
// Poll for active sessions periodically so research started elsewhere
|
|
35
|
+
// (e.g. by the agent via trigger_research) gets adopted into the
|
|
36
|
+
// sidebar — _reconnectActive only ran once at load before, so
|
|
37
|
+
// agent-started jobs never appeared until a page reload.
|
|
38
|
+
if (_activePollInterval) clearInterval(_activePollInterval);
|
|
39
|
+
_activePollInterval = setInterval(() => { _reconnectActive(); }, 12000);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Allow an immediate adopt when the chat stream signals a new research
|
|
43
|
+
// session (research_started ui_event) — faster than the 12s poll.
|
|
44
|
+
export function adoptSession(sessionId) {
|
|
45
|
+
if (!sessionId || _jobs.some(j => j.id === sessionId)) return;
|
|
46
|
+
_reconnectActive();
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
async function _reconnectActive() {
|
|
50
|
+
try {
|
|
51
|
+
// Reconnect to running tasks
|
|
52
|
+
const res = await fetch(`${_apiBase}/api/research/active`, { credentials: 'same-origin' });
|
|
53
|
+
if (res.ok) {
|
|
54
|
+
const data = await res.json();
|
|
55
|
+
for (const task of (data.active || [])) {
|
|
56
|
+
if (_jobs.some(j => j.id === task.session_id)) continue;
|
|
57
|
+
const job = {
|
|
58
|
+
id: task.session_id, query: task.query, status: 'running',
|
|
59
|
+
progress: task.progress || {},
|
|
60
|
+
startedAt: task.started_at ? task.started_at * 1000 : Date.now(),
|
|
61
|
+
elapsed: task.started_at ? Date.now() - task.started_at * 1000 : 0,
|
|
62
|
+
result: null, sources: null, findings: null,
|
|
63
|
+
errorMsg: null, avgDuration: null, modelName: null,
|
|
64
|
+
settings: {}, _es: null, _timerInterval: null,
|
|
65
|
+
};
|
|
66
|
+
_jobs.push(job);
|
|
67
|
+
_connectStream(job);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Load recent completed research from disk
|
|
72
|
+
const libRes = await fetch(`${_apiBase}/api/research/library?sort=recent&limit=20`, { credentials: 'same-origin' });
|
|
73
|
+
if (libRes.ok) {
|
|
74
|
+
const libData = await libRes.json();
|
|
75
|
+
const dismissed = _loadDismissed();
|
|
76
|
+
for (const item of (libData.research || [])) {
|
|
77
|
+
if (item.status !== 'done') continue;
|
|
78
|
+
if (dismissed.has(item.id)) continue;
|
|
79
|
+
if (_jobs.some(j => j.id === item.id)) continue;
|
|
80
|
+
const elapsed = item.duration ? _parseDuration(item.duration) : 0;
|
|
81
|
+
_jobs.push({
|
|
82
|
+
id: item.id, query: item.query, status: 'done',
|
|
83
|
+
progress: {}, startedAt: (item.started_at || 0) * 1000,
|
|
84
|
+
elapsed, result: null, sources: null, findings: null,
|
|
85
|
+
sourceCount: item.source_count || 0,
|
|
86
|
+
category: item.category || '',
|
|
87
|
+
errorMsg: null, avgDuration: null, modelName: null,
|
|
88
|
+
settings: { max_rounds: item.rounds || 8 },
|
|
89
|
+
_es: null, _timerInterval: null, _fromLibrary: true,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
_notify();
|
|
95
|
+
} catch {}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function _parseDuration(s) {
|
|
99
|
+
if (!s) return 0;
|
|
100
|
+
const m = s.match(/(\d+)/);
|
|
101
|
+
return m ? parseInt(m[1], 10) * 1000 : 0;
|
|
102
|
+
}
|
|
103
|
+
export function setRenderCallback(cb) { _renderCb = cb; }
|
|
104
|
+
export function getJobs() { return _jobs; }
|
|
105
|
+
|
|
106
|
+
export function addToQueue(query, settings) {
|
|
107
|
+
const job = _makeJob(query, settings);
|
|
108
|
+
_jobs.push(job);
|
|
109
|
+
_notify();
|
|
110
|
+
return job;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export async function startJob(query, settings) {
|
|
114
|
+
const job = addToQueue(query, settings);
|
|
115
|
+
await _launchJob(job);
|
|
116
|
+
return job;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export async function startQueued(jobId) {
|
|
120
|
+
const job = _jobs.find(j => j.id === jobId);
|
|
121
|
+
if (!job || job.status !== 'queued') return;
|
|
122
|
+
await _launchJob(job);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export async function startAllQueued() {
|
|
126
|
+
const queued = _jobs.filter(j => j.status === 'queued');
|
|
127
|
+
await Promise.all(queued.map(j => _launchJob(j)));
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/** Run queued jobs one at a time — waits for each to finish before launching
|
|
131
|
+
* the next. Useful when you want to avoid hammering the same model server. */
|
|
132
|
+
export async function startAllQueuedSequential() {
|
|
133
|
+
const queued = _jobs.filter(j => j.status === 'queued');
|
|
134
|
+
for (const job of queued) {
|
|
135
|
+
await _launchJob(job);
|
|
136
|
+
// Wait until this specific job is no longer running
|
|
137
|
+
await new Promise(resolve => {
|
|
138
|
+
const tick = setInterval(() => {
|
|
139
|
+
if (job.status !== 'running') { clearInterval(tick); resolve(); }
|
|
140
|
+
}, 1000);
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
export async function retryJob(jobId) {
|
|
146
|
+
const job = _jobs.find(j => j.id === jobId);
|
|
147
|
+
if (!job) return;
|
|
148
|
+
job.status = 'queued';
|
|
149
|
+
job.progress = {};
|
|
150
|
+
job.errorMsg = null;
|
|
151
|
+
job.result = null;
|
|
152
|
+
job.sources = null;
|
|
153
|
+
job.findings = null;
|
|
154
|
+
job.elapsed = 0;
|
|
155
|
+
job.avgDuration = null;
|
|
156
|
+
_notify();
|
|
157
|
+
await _launchJob(job);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
export async function cancelJob(id) {
|
|
161
|
+
const job = _jobs.find(j => j.id === id);
|
|
162
|
+
if (!job) return;
|
|
163
|
+
if (job.status === 'queued') { job.status = 'cancelled'; _notify(); return; }
|
|
164
|
+
try { await fetch(`${_apiBase}/api/research/cancel/${id}`, { method: 'POST', credentials: 'same-origin' }); } catch {}
|
|
165
|
+
_finishJob(job, 'cancelled');
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
export function removeJob(id) {
|
|
169
|
+
const idx = _jobs.findIndex(j => j.id === id);
|
|
170
|
+
if (idx >= 0) {
|
|
171
|
+
const job = _jobs[idx];
|
|
172
|
+
// Persist dismissal so it doesn't reappear from the library on reload.
|
|
173
|
+
if (job.status === 'done') _markDismissed([id]);
|
|
174
|
+
_jobs.splice(idx, 1);
|
|
175
|
+
}
|
|
176
|
+
_notify();
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
export function clearAll() {
|
|
180
|
+
// Mark all completed jobs as dismissed so they don't reappear on reload.
|
|
181
|
+
const doneIds = _jobs.filter(j => j.status === 'done').map(j => j.id);
|
|
182
|
+
if (doneIds.length) _markDismissed(doneIds);
|
|
183
|
+
for (const job of _jobs) {
|
|
184
|
+
if (job._es) { job._es.close(); job._es = null; }
|
|
185
|
+
if (job._timerInterval) { clearInterval(job._timerInterval); job._timerInterval = null; }
|
|
186
|
+
}
|
|
187
|
+
_jobs = [];
|
|
188
|
+
_notify();
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export function formatElapsed(ms) {
|
|
192
|
+
if (!ms) return '0:00';
|
|
193
|
+
const s = Math.floor(ms / 1000);
|
|
194
|
+
return `${Math.floor(s / 60)}:${String(s % 60).padStart(2, '0')}`;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
export function formatPhase(progress, maxRounds) {
|
|
198
|
+
if (!progress || !progress.phase) return 'Starting...';
|
|
199
|
+
const p = progress;
|
|
200
|
+
const rn = p.round ? (maxRounds ? `Round ${p.round}/${maxRounds}: ` : `Round ${p.round}: `) : '';
|
|
201
|
+
switch (p.phase) {
|
|
202
|
+
case 'probing': return 'Probing model...';
|
|
203
|
+
case 'planning': return 'Planning research strategy...';
|
|
204
|
+
case 'searching': return `${rn}Searching (${p.queries || 0} queries)`;
|
|
205
|
+
case 'reading': return `${rn}Reading ${p.total_sources || 0} sources`;
|
|
206
|
+
case 'analyzing': return `${rn}Analyzing ${p.total_findings || 0} findings`;
|
|
207
|
+
case 'writing': return `Writing report -- ${p.total_sources || 0} sources`;
|
|
208
|
+
default: return p.phase;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
function _makeJob(query, settings) {
|
|
213
|
+
return {
|
|
214
|
+
id: `pending-${++_idCounter}`,
|
|
215
|
+
query, settings, status: 'queued',
|
|
216
|
+
progress: {}, startedAt: null, elapsed: 0,
|
|
217
|
+
result: null, sources: null, findings: null,
|
|
218
|
+
category: settings?.category || '',
|
|
219
|
+
errorMsg: null, avgDuration: null,
|
|
220
|
+
modelName: null, endpointName: null,
|
|
221
|
+
_es: null, _timerInterval: null,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
async function _launchJob(job) {
|
|
226
|
+
const body = { query: job.query, ...job.settings };
|
|
227
|
+
let data;
|
|
228
|
+
try {
|
|
229
|
+
const res = await fetch(`${_apiBase}/api/research/start`, {
|
|
230
|
+
method: 'POST', credentials: 'same-origin',
|
|
231
|
+
headers: { 'Content-Type': 'application/json' },
|
|
232
|
+
body: JSON.stringify(body),
|
|
233
|
+
});
|
|
234
|
+
if (!res.ok) {
|
|
235
|
+
const txt = await res.text();
|
|
236
|
+
try { job.errorMsg = JSON.parse(txt).detail || txt; } catch { job.errorMsg = txt; }
|
|
237
|
+
job.status = 'error';
|
|
238
|
+
_notify();
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
data = await res.json();
|
|
242
|
+
} catch (e) {
|
|
243
|
+
job.errorMsg = e.message;
|
|
244
|
+
job.status = 'error';
|
|
245
|
+
_notify();
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
job.id = data.session_id;
|
|
249
|
+
job.status = 'running';
|
|
250
|
+
job.startedAt = Date.now();
|
|
251
|
+
_connectStream(job);
|
|
252
|
+
_notify();
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
function _connectStream(job) {
|
|
256
|
+
job._timerInterval = setInterval(() => {
|
|
257
|
+
job.elapsed = Date.now() - job.startedAt;
|
|
258
|
+
_notify();
|
|
259
|
+
}, 1000);
|
|
260
|
+
|
|
261
|
+
const es = new EventSource(`${_apiBase}/api/research/stream/${job.id}`);
|
|
262
|
+
job._es = es;
|
|
263
|
+
|
|
264
|
+
es.onmessage = (evt) => {
|
|
265
|
+
try {
|
|
266
|
+
const d = JSON.parse(evt.data);
|
|
267
|
+
if (d.status === 'not_found') { _finishJob(job, 'error'); return; }
|
|
268
|
+
job.progress = d;
|
|
269
|
+
if (d.model && !job.modelName) job.modelName = d.model;
|
|
270
|
+
if (d.final) {
|
|
271
|
+
if (d.error) job.errorMsg = d.error;
|
|
272
|
+
_finishJob(job, d.status === 'done' ? 'done' : d.status === 'cancelled' ? 'cancelled' : 'error');
|
|
273
|
+
if (d.status === 'done') _fetchResult(job);
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
_notify();
|
|
277
|
+
} catch {}
|
|
278
|
+
};
|
|
279
|
+
|
|
280
|
+
es.onerror = () => {
|
|
281
|
+
es.close();
|
|
282
|
+
if (job.status === 'running') setTimeout(() => _pollFallback(job), 3000);
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
async function _pollFallback(job) {
|
|
287
|
+
if (job.status !== 'running') return;
|
|
288
|
+
try {
|
|
289
|
+
const res = await fetch(`${_apiBase}/api/research/status/${job.id}`, { credentials: 'same-origin' });
|
|
290
|
+
if (!res.ok) { _finishJob(job, 'error'); return; }
|
|
291
|
+
const d = await res.json();
|
|
292
|
+
job.progress = d.progress || {};
|
|
293
|
+
if (d.avg_duration) job.avgDuration = d.avg_duration;
|
|
294
|
+
if (d.status !== 'running') {
|
|
295
|
+
_finishJob(job, d.status === 'done' ? 'done' : 'error');
|
|
296
|
+
if (d.status === 'done') _fetchResult(job);
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
setTimeout(() => _pollFallback(job), 2000);
|
|
300
|
+
} catch { _finishJob(job, 'error'); }
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
function _finishJob(job, status) {
|
|
304
|
+
job.status = status;
|
|
305
|
+
if (job._es) { job._es.close(); job._es = null; }
|
|
306
|
+
if (job._timerInterval) { clearInterval(job._timerInterval); job._timerInterval = null; }
|
|
307
|
+
job.elapsed = Date.now() - (job.startedAt || Date.now());
|
|
308
|
+
if (status === 'done') {
|
|
309
|
+
if ('Notification' in window && Notification.permission === 'granted') {
|
|
310
|
+
try { new Notification('Research Complete', { body: job.query.slice(0, 80) }); } catch {}
|
|
311
|
+
}
|
|
312
|
+
if (_onCompleteCb) _onCompleteCb(job);
|
|
313
|
+
}
|
|
314
|
+
_notify();
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
let _onCompleteCb = null;
|
|
318
|
+
export function onComplete(cb) { _onCompleteCb = cb; }
|
|
319
|
+
|
|
320
|
+
async function _fetchResult(job) {
|
|
321
|
+
try {
|
|
322
|
+
const res = await fetch(`${_apiBase}/api/research/result-peek/${job.id}`, {
|
|
323
|
+
method: 'POST', credentials: 'same-origin',
|
|
324
|
+
});
|
|
325
|
+
if (!res.ok) return;
|
|
326
|
+
const d = await res.json();
|
|
327
|
+
job.result = d.result;
|
|
328
|
+
job.sources = d.sources;
|
|
329
|
+
job.findings = d.raw_findings;
|
|
330
|
+
if (d.category && !job.category) job.category = d.category;
|
|
331
|
+
_notify();
|
|
332
|
+
} catch {}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
function _notify() { if (_renderCb) _renderCb(); }
|