Compare commits

...

2419 Commits

Author SHA1 Message Date
Louistiti 547c8d764a fix(tool/grok): use supported grok-4.3 model 2026-07-21 00:16:54 +08:00
louistiti 3677a82efb fix(scripts): reject corrupt native package installs 2026-07-19 23:51:02 +08:00
louistiti 00e23ae1ad build(agent mode): upgrade providers to AI SDK 7 2026-07-19 19:02:26 +08:00
louistiti 4823bffb37 feat: improved TypeScript 7 support; weekly fresh install workflow 2026-07-19 07:41:22 +08:00
louistiti bc2854c33f chore: merge feat/remote-multi-user-runtime 2026-07-18 08:55:00 +08:00
Louistiti 12749b8d03 chore: merge branch 'develop' into feat/remote-multi-user-runtime 2026-07-18 08:52:00 +08:00
Octopus e45e3d322b fix(provider/minimax): support endpoint variants (#580)
Co-authored-by: octo-patch <266937838+octo-patch@users.noreply.github.com>
Co-authored-by: Louis Grenard <louis.grenard@gmail.com>
2026-07-18 08:50:05 +08:00
Louistiti 9c465101f1 feat(scripts): add Kimi K3 as model suggestion on setup 2026-07-18 08:32:10 +08:00
louistiti 0e1cdc5641 chore: sync context files 2026-07-15 02:29:00 +08:00
louistiti 4e02224e33 fix(setup): honor tool build policies 2026-07-15 02:28:10 +08:00
louistiti fd6ca467ed fix(server): validate action parameters 2026-07-15 02:12:09 +08:00
louistiti 4633c50fb7 fix(server): restore conversation NLU context 2026-07-15 01:55:52 +08:00
louistiti 4ac896e08d fix(server): preserve Satellite progress profile 2026-07-15 01:09:37 +08:00
louistiti 22d4586b6e feat(server): forward skill tool progress 2026-07-15 01:01:00 +08:00
louistiti 78f08eede0 fix(server): release completed controlled turns 2026-07-15 00:35:16 +08:00
louistiti f8a46e1812 fix(server): preserve replacement Satellite connections 2026-07-15 00:10:55 +08:00
louistiti 9d6d4a5dfb fix(bridge/nodejs): release completed skill stdin 2026-07-14 23:56:58 +08:00
louistiti e6ae6bc446 fix: keep profile HTTP commands responsive 2026-07-14 22:23:37 +08:00
louistiti 6b5bab7dda refactor(server): remove legacy profile tokens 2026-07-14 21:54:21 +08:00
louistiti e480c72736 fix(web app): reveal profile authentication form 2026-07-14 21:09:22 +08:00
louistiti 8e8c6da0f4 chore(web app): revert init connection attempts 2026-07-14 20:40:27 +08:00
louistiti b3f6c08d4d fix(web app): preserve early initialization statuses 2026-07-14 20:26:10 +08:00
louistiti 97c0f2f4dc fix(web app): avoid unauthorized auth status checks 2026-07-14 20:19:23 +08:00
louistiti bab9813c5d fix: stabilize remote client and Satellite startup 2026-07-14 19:35:47 +08:00
louistiti 269655aa0e refactor(server): rename Link to Satellite 2026-07-14 18:13:43 +08:00
louistiti 2ddd662ce0 docs(server): document remote profile runtime 2026-07-14 18:08:42 +08:00
louistiti ff190ad63a refactor(server): rename Companion to Link 2026-07-14 17:59:27 +08:00
louistiti 304cf1a78a refactor(scripts): rename profile token generator 2026-07-14 17:14:09 +08:00
louistiti a2be039016 feat: add multi-profile remote runtime 2026-07-14 16:48:52 +08:00
Louistiti 5057f4cfc0 feat(agent mode): adopt continuous agent loop 2026-07-13 21:50:30 +08:00
louistiti 659077299a fix(agent mode): stop redundant plan steps 2026-07-13 02:06:11 +08:00
louistiti e8e7736448 fix(tool/yt-dlp): resolve moved subtitle files 2026-07-13 01:57:43 +08:00
Louistiti d0e85a664e chore(tool/yt-dlp): upgrade to 2026.07.04 2026-07-13 01:44:15 +08:00
Octopus 60fcb9a824 feat(provider/minimax): add MiniMax LLM support (#579)
* feat(provider/minimax): add MiniMax LLM support

* fix(provider/minimax): align model behavior

* fix(provider/minimax): recommend MiniMax-M3

---------

Co-authored-by: octo-patch <266937838+octo-patch@users.noreply.github.com>
Co-authored-by: kapelame <kape@kapedeMacBook-Air.local>
Co-authored-by: Louistiti <louis.grenard@gmail.com>
2026-07-13 00:38:50 +08:00
louistiti e40e282fee feat: support latest ecosystem models 2026-07-10 23:51:21 +08:00
Louistiti f9ac31a128 fix(server): context file static generation 2026-07-12 23:25:57 +08:00
Louistiti 8f7ec5fda3 feat(server): HTTP plugins support 2026-06-22 22:02:10 +08:00
louistiti d3be7b95ef chore(tool/yt-dlp): upgrade to 2026.06.09 2026-06-21 16:02:14 +08:00
Louistiti be1216830e Merge branch 'feat/web-app-2-0' into develop 2026-06-28 21:38:30 +08:00
Louistiti 316f926d0d Merge branch 'feat/web-app-2-0' into develop 2026-06-28 21:34:25 +08:00
Louistiti edc4026a2c Merge branch 'feat/web-app-2-0' into develop 2026-06-28 21:05:03 +08:00
Louistiti 86810a6260 Merge branch 'feat/custom-client-extension-endpoint' into develop 2026-06-27 11:14:48 +08:00
louistiti 00e601de6c fix(web app): tooltip shortcut hints default modifier key 2026-06-20 21:36:52 +08:00
louistiti 9be1631d8d feat(web app): add tooltip shortcut hints 2026-06-19 22:46:20 +08:00
Louistiti c0de69945a feat(scripts): add GLM 5.2 suggestion on setup 2026-06-19 05:53:50 +08:00
louistiti ba1316cbb9 feat(web app): search sessions dialog 2026-06-18 23:11:36 +08:00
louistiti fdc72ebf2d feat(web app): improve dialog pulse animation 2026-06-17 21:40:21 +08:00
louistiti ac46e97703 feat(web app): final modal window component 2026-06-16 22:51:02 +08:00
Louistiti 66fe3cd281 feat(server): add extension file read endpoint 2026-06-16 11:45:26 +08:00
louistiti 4e68fdb2a3 perf(web app): improve components based on portals 2026-06-15 22:02:10 +08:00
louistiti 318958e945 feat(web app): dialog backbone 2026-06-14 09:12:45 +08:00
louistiti f109bb115d chore(web app): remove unused sidebar action components 2026-06-13 20:11:46 +08:00
louistiti df4c704bbd feat(web app): hide session actions while editing 2026-06-13 15:19:26 +08:00
louistiti df85df8034 feat(web app): new selection style 2026-06-12 21:33:06 +08:00
louistiti 0d14cf82ec feat(web app): align input border style 2026-06-11 23:56:12 +08:00
louistiti e7af942f61 feat(web app): mute sidebar scrollbar by default 2026-06-19 06:46:06 +08:00
Louistiti 5c90740a48 Merge branch 'feat/web-app-2-0' into develop 2026-06-08 00:33:37 +08:00
Louistiti 4ef622a690 feat(web app): animate stacked toasts 2026-06-08 00:31:05 +08:00
Louistiti 1a9a84d2dd fix(web app): render info toast icon; better toast spacing 2026-06-07 23:38:41 +08:00
Louistiti 0247a24d3d feat(web app): toast component and session renaming kick off 2026-06-07 23:29:48 +08:00
Louistiti d93f209e8f feat(web app): add session item dropdown 2026-06-06 21:35:20 +08:00
Louistiti c8bf7f513d feat(web app): add session list item options button icon 2026-06-06 21:05:05 +08:00
Louistiti 00e5e1326d refactor(web app): add active surface states 2026-06-06 20:40:55 +08:00
Louistiti 0cb109cf5f fix(web app): smooth session list mask color transition 2026-06-06 18:09:09 +08:00
Louistiti 502f8c3cf7 refactor(web app): fade session list on sidebar fold 2026-06-06 18:01:23 +08:00
Louistiti d4225e8e5f refactor(web app): align session list item spacing 2026-06-06 17:45:29 +08:00
Louistiti be8b253ef8 feat(web app): add first session list version 2026-06-06 17:39:39 +08:00
Louistiti 1e3c75dc12 refactor(web app): adjust tooltip theme 2026-06-06 11:20:37 +08:00
Louistiti ac2dc1372c fix(web app): center search menu icon scale 2026-06-06 10:53:47 +08:00
Louistiti 0be61e1929 feat(web app): natural sidebar toggle transition 2026-06-06 10:46:50 +08:00
Louistiti 22fe5a35b5 fix(web app): blur tooltip trigger on click 2026-06-06 09:01:21 +08:00
Louistiti 82e8f150a5 feat(web app): persist sidebar control state 2026-06-06 08:39:25 +08:00
Louistiti 2cfbbaeeb7 fix(web app): render tooltips through portal 2026-06-06 08:35:04 +08:00
Louistiti f75ee6f91e refactor(web app): size shortcut keycaps by label 2026-06-06 08:28:53 +08:00
Louistiti 0d3a0460e6 Merge branch 'feat/web-app-2-0' into develop 2026-06-06 01:57:05 +08:00
Louistiti 680c992c55 feat(web app): sidebar header and menu 2026-06-06 01:56:42 +08:00
louistiti 0f88072736 feat(web app): add TanStack Virtual 2026-06-03 00:25:14 +08:00
louistiti 5e45a41964 feat(web app): prepare TanStack Query 2026-06-03 00:24:25 +08:00
louistiti 87f91f484f fix(web app): serve favicon from public assets 2026-06-03 00:22:40 +08:00
louistiti b28274ad76 feat(web app): all logo variants 2026-06-03 00:21:06 +08:00
Louistiti 1223421478 Merge branch 'develop' into feat/web-app-2-0 2026-06-03 09:20:04 +08:00
louistiti ad95eb9eb9 fix(agent mode): avoid stalled self-observation streams 2026-06-03 00:18:01 +08:00
Louistiti 1f5a116219 Merge branch 'develop' into feat/web-app-2-0 2026-06-02 10:07:58 +08:00
louistiti 03b7a9a429 perf(web app): split Vite vendor chunks 2026-06-02 00:11:35 +08:00
louistiti b6d69ef8c1 fix: replace deprecated Sass imports 2026-06-02 00:03:19 +08:00
Louistiti 6805dba502 Merge branch 'develop' into feat/web-app-2-0 2026-06-01 15:32:12 +08:00
Louistiti b20ef0ec1b feat(web app): 2.0 UI backbone 2026-05-31 23:18:48 +08:00
louistiti c717309647 test: Git ignore tests and benchmarks reports in skills 2026-05-31 18:02:26 +08:00
louistiti 5af0df23b0 refactor: default OpenRouter model to google/gemini-3.1-flash-liteacross usages 2026-05-31 16:15:23 +08:00
Louistiti 141cc105be build: update QMD to 2.5.3 2026-05-30 09:59:49 +08:00
louistiti 302e0154ae fix(provider/openrouter): include json hint for structured output 2026-05-29 01:07:11 +08:00
louistiti bd07cb604a feat: add support for Claude Opus 4.8 2026-05-29 01:01:32 +08:00
Louistiti c7a5fb39d2 fix(server): improve macOS free RAM check 2026-05-27 21:30:13 +08:00
Louistiti 5178cf1144 docs: document client interface boundary 2026-05-27 21:21:45 +08:00
Louistiti e3b65176ea Merge branch 'feat/leon-client-interface' into develop 2026-05-27 21:13:51 +08:00
Louistiti 88ef8320a2 feat: support Leon custom client interface 2026-05-25 23:56:08 +08:00
Louistiti 7803ca788f fix(provider/anthropic): show adaptive thinking summaries 2026-05-25 23:05:15 +08:00
louistiti 4216798c45 perf(provider/openai): tune response latency options 2026-05-24 18:51:06 +08:00
louistiti 2b91de3e46 chore(server): upgrade Socket.IO packages 2026-05-23 15:02:57 +08:00
louistiti 7ec19b728a feat(built-in command): add restart command 2026-05-22 21:21:15 +08:00
louistiti ccc6266a96 refactor: rename STT voice config to ASR 2026-05-21 22:06:41 +08:00
louistiti 1c55b71b3a feat(built-in command): add voice setup command 2026-05-20 23:11:19 +08:00
Louistiti 59e9d50e01 fix(scripts): preserve profile env on setup start 2026-05-19 23:40:09 +08:00
Louistiti aa341de195 feat(server): select only controlled skill directly 2026-05-19 23:32:13 +08:00
Louistiti 587a824d63 fix(server): scope skill router list to profile 2026-05-19 23:26:51 +08:00
Louistiti bf5d630bad fix(server): rename routing workflow mode 2026-05-19 21:52:00 +08:00
Louistiti e92071736c refactor(built-in command): do not show /open usage in main suggestions 2026-05-19 21:13:52 +08:00
Louistiti 25cd9dd0af feat(built-in command): add open command 2026-05-19 21:10:06 +08:00
Louistiti b2dd482e43 feat(built-in command): add config command 2026-05-19 21:03:30 +08:00
Louistiti fd97ce5221 refactor(server): migrate core settings to config yml 2026-05-19 20:42:02 +08:00
louistiti 0c6ac8b72e feat(server): add memory mechanism toggles 2026-05-18 22:46:51 +08:00
louistiti 9c09d27d8e fix: skill priority settings 2026-05-18 00:12:26 +08:00
louistiti 36a990ca46 feat(server): add profile allow-only policy 2026-05-18 00:09:16 +08:00
Louistiti 5846949020 fix(agent mode): stop pre-executing shell help probes 2026-05-17 10:45:18 +08:00
Louistiti 5c50411472 fix(tool/file): add settings sample 2026-05-17 10:28:05 +08:00
Louistiti a28e4adf75 Merge branch 'feat/react-loop-improvements' into develop 2026-05-17 08:57:01 +08:00
Louistiti a5dbac505a refactor(agent mode): refine shell help verification guidance 2026-05-17 08:56:43 +08:00
Louistiti 87f3dfd3f0 fix(agent mode): reduce ReAct prompt repetition 2026-05-17 08:48:56 +08:00
Louistiti 78ee89b7dc perf(scripts): only lint staged files 2026-05-17 08:20:43 +08:00
Louistiti 70c762733a feat(agent mode): strengthen ReAct grounding prompts 2026-05-17 08:16:08 +08:00
Louistiti ff570aae33 Merge branch 'feat/session-support' into develop 2026-05-17 00:01:50 +08:00
Louistiti 33a6e72469 refactor(agent mode): clarify planning prompt policies 2026-05-16 23:56:45 +08:00
Louistiti 2cb08dcfb9 fix(agent mode): expose tool artifact paths 2026-05-16 23:29:35 +08:00
Louistiti 0b564d5ef9 feat(agent mode): surface live tool output 2026-05-16 23:18:31 +08:00
Louistiti cea248f085 fix(agent mode): improve tool execution 2026-05-16 21:46:50 +08:00
Louistiti 9c74f1d8e2 fix: stream local planning reasoning 2026-05-16 19:30:27 +08:00
Louistiti 08e20e0efc fix(server): harden react recovery 2026-05-16 19:19:10 +08:00
Louistiti 2ece915bae Merge branch 'feat/session-support' into develop 2026-05-16 17:14:36 +08:00
Louistiti 8c1e7dc70b perf(server): reduce post-turn inference noise 2026-05-16 17:14:20 +08:00
Louistiti 03d7bf8d78 perf(server): gate owner profile sync 2026-05-16 16:54:38 +08:00
Louistiti d70bfaa4fd feat(server): serialize post-turn maintenance 2026-05-16 16:48:44 +08:00
Louistiti ec8a83b3e6 feat(tool/shell): expose command attempts 2026-05-16 16:17:04 +08:00
Louistiti c9b639d73d test(agent mode): stabilize provider smoke scenario 2026-05-16 16:07:49 +08:00
Louistiti 00d4bcf56c refactor(tool/shell): replace bash command tool 2026-05-16 15:59:24 +08:00
Louistiti 39fba53c78 fix(agent mode): reuse prior tool artifacts 2026-05-16 15:21:55 +08:00
Louistiti 2d86a46d84 fix(agent mode): retry stalled react prompts longer 2026-05-16 13:40:38 +08:00
Louistiti 55bf265823 Merge branch 'feat/session-support' into develop 2026-05-14 21:19:11 +08:00
Louistiti 78c0ba9050 fix(agent mode): handle local plain text planning 2026-05-14 08:13:31 +08:00
Louistiti 8cc0e9e635 fix(scripts): prompt only for missing setup 2026-05-14 07:18:00 +08:00
Louistiti e09551e838 Merge branch 'feat/session-support' into develop 2026-05-14 00:17:01 +08:00
Louistiti d7ad65b364 fix(agent mode): share planning fallback for local models 2026-05-14 00:11:40 +08:00
Louistiti 28054ac6b1 fix(agent mode): prevent fake execution on follow-ups 2026-05-14 00:08:27 +08:00
Louistiti f1b3df286a feat(agent mode): improve bash failure recovery 2026-05-13 23:52:16 +08:00
Louistiti 74f38eab1a fix(tool/bash): preserve bash failure output 2026-05-13 23:18:58 +08:00
Louistiti 5658f62e59 Merge branch 'feat/session-support' into develop 2026-05-13 23:01:25 +08:00
Louistiti d8e3fa7c9b fix(agent mode): derive tool failure details dynamically 2026-05-13 23:01:12 +08:00
Louistiti 9bb34ee41c fix(agent mode): stabilize managed node usage in bash tools 2026-05-13 22:41:51 +08:00
Louistiti 7b8db43c4c fix(web app): allow init after local LLM boot error 2026-05-13 22:33:30 +08:00
Louistiti 5585dda2eb fix(agent mode): defer session title generation 2026-05-13 22:25:42 +08:00
Louistiti 04d6bc6bb2 fix(server): render system widget history text 2026-05-13 21:06:23 +08:00
louistiti 219ec7371d fix(agent mode): sanitize local final answers 2026-05-13 01:02:57 +08:00
louistiti d340d4bbfb fix(agent mode): disable llama.cpp thinking for tool calls 2026-05-13 00:55:18 +08:00
louistiti 1f8cf750b9 build: update CMake to 4.3.2 2026-05-13 00:43:11 +08:00
louistiti 0c69af84d1 build: update llama.cpp to the b9128 release 2026-05-13 00:41:22 +08:00
Louistiti 9305ad4d3e Merge branch 'develop' into feat/session-support 2026-05-12 23:22:19 +08:00
Louistiti 99b84a6800 fix: hide Windows child processes 2026-05-12 23:20:23 +08:00
Louistiti bb22c59737 Merge branch 'feat/session-support' into develop 2026-05-12 22:42:27 +08:00
Louistiti 242f8fbaeb build(scripts): update managed runtimes 2026-05-12 22:38:27 +08:00
Louistiti 4f54c05cda fix(scripts): support pnpm 11 setup installs 2026-05-12 22:28:48 +08:00
Louistiti 6a40d3e2d8 feat(agent mode): compose agent skills in plans 2026-05-12 21:05:41 +08:00
Louistiti c02b0f1f7a fix(agent mode): restrict hosted search providers 2026-05-12 20:30:58 +08:00
Louistiti 58a12f56d3 Merge branch 'feat/session-support' into develop 2026-05-12 00:11:36 +08:00
Louistiti 3292cfe7a2 docs: add thanks 2026-05-12 00:10:37 +08:00
Louistiti c064e3f3e2 docs: add thanks 2026-05-12 00:05:26 +08:00
Louistiti 7571b9477d docs: add thanks 2026-05-11 23:56:02 +08:00
Louistiti 6df245b0ae docs: add thanks 2026-05-11 23:51:46 +08:00
Louistiti d691d15b2a docs: add thanks 2026-05-11 23:44:59 +08:00
Louistiti 0613cf445d docs: add thanks 2026-05-11 23:41:50 +08:00
Louistiti 7dac629402 Merge branch 'develop' into feat/session-support 2026-05-11 22:40:14 +08:00
Louistiti f56201190e chore: force static context files update 2026-05-11 22:39:47 +08:00
Louistiti 6965419971 Merge branch 'feat/session-support' into develop 2026-05-11 22:25:37 +08:00
Louistiti ec104d9ffc fix(agent mode): reduce local execution thinking loops 2026-05-11 22:22:38 +08:00
Louistiti 5a4be0fda7 feat(agent mode): report tool preparation progress 2026-05-11 21:52:01 +08:00
louistiti 4dc0cc8080 fix(agent mode): avoid upfront fallback steps 2026-05-11 01:21:09 +08:00
louistiti 491223963d fix(tool/ytdlp): auto-select subtitle language 2026-05-11 01:17:31 +08:00
louistiti ae00f70033 fix(agent mode): recover before advancing failed steps 2026-05-11 01:13:58 +08:00
louistiti 073a38bb1b feat(agent mode): add hosted search tool availability; tool state support 2026-05-11 01:08:39 +08:00
louistiti 55e060249c fix(agent mode): enable execution reasoning 2026-05-10 23:57:02 +08:00
Louistiti 0cc511d4dd Merge branch 'feat/session-support' into develop 2026-05-10 22:37:08 +08:00
Louistiti 904141e2ab chore(server): update @fastify/static to 9.1.3; fastify to 5.8.5 2026-05-10 22:33:25 +08:00
Louistiti 20f3d54e38 feat(agent mode): show tool icons in activity cards 2026-05-10 22:24:27 +08:00
Louistiti 65ff1af676 fix(agent mode): continue HITL pending steps 2026-05-10 22:11:21 +08:00
Louistiti 375e9d32a3 fix(agent mode): preserve history during execution 2026-05-10 21:54:26 +08:00
louistiti bedba2aba3 refactor(agent mode): longer final answer timeout 2026-05-09 23:41:56 +08:00
Louistiti 50fd6f2908 fix(tool/ytdlp): resolve paths from merged output and fallback files 2026-05-08 22:46:36 +08:00
louistiti d12ee78021 feat(tool/bash): prefer managed runtimes in bash commands 2026-05-07 23:17:05 +08:00
Louistiti f90b78020c feat: first shot of the conversation sessions support 2026-05-05 17:47:03 +08:00
Louistiti 23d8db139a feat(built-in command): add tool command 2026-05-05 15:12:00 +08:00
Louistiti 75e392d554 refactor: update default local ports 2026-05-05 14:34:35 +08:00
Louistiti e337252f48 fix(agent mode): select skills by metadata match 2026-05-05 11:54:57 +08:00
Louistiti 97eb123faf fix(server): inject managed binaries for agent skills 2026-05-05 11:44:52 +08:00
Louistiti d3c92a6aea feat(skill/tiny-web-crawler): reduce crawler token usage 2026-05-05 11:18:28 +08:00
Louistiti 3829cc8a6e fix(server): store static context in codebase for LEON.md and ARCHITECTURE.md 2026-05-05 00:00:07 +08:00
Louistiti 6c0cfc45d9 fix(tool/bash): normalize command timeout units 2026-05-04 22:59:16 +08:00
Louistiti e3e3db29be feat(web app): add file path autocomplete dropdown 2026-05-04 21:45:18 +08:00
Louistiti 62db21848c fix(tool/ytdlp): quote output templates 2026-05-04 19:17:22 +08:00
Louistiti e5ada3fbf9 feat(web app): add file path autocomplete dropdown 2026-05-04 18:58:14 +08:00
Louistiti b6f10eb60c fix(tool/ytdlp): return converted audio path 2026-05-04 10:31:41 +08:00
Louistiti 246118cef5 refactor: remove legacy bridges/toolkits/ 2026-05-04 01:42:16 +08:00
Louistiti 9dc3e0035c refactor: tools merge/sync settings on install (same as skills logic) 2026-05-04 01:38:24 +08:00
Louistiti c65b475c22 refactor(built-in command): cleaner split structure 2026-05-04 00:45:18 +08:00
Louistiti 2af8efc6e5 feat(built-in command): support /skill remove <skill_name> 2026-05-04 00:20:56 +08:00
Louistiti 4e56f3f5ca feat(server): list managed binaries 2026-05-03 21:04:37 +08:00
Louistiti 023581f883 refactor(web app): reduce footer logo size 2026-05-03 20:32:43 +08:00
Louistiti 75fc86c0cf refactor(web app): more compact and spacious 2026-05-03 20:21:55 +08:00
Louistiti fbcd07336c chore: update @openrouter/ai-sdk-provider to 2.9.0 2026-05-03 19:32:30 +08:00
Louistiti bb7e939de2 fix: correct native schema paths for native skills 2026-05-03 19:15:18 +08:00
Louistiti 65aad70ae2 Merge branch 'feat/agent-skill-support' into develop 2026-05-03 19:09:22 +08:00
Louistiti 38c60b9107 refactor(controlled mode): drop skill guidance 2026-05-03 18:56:46 +08:00
Louistiti ec78c5dc5b docs: clarify skill architecture 2026-05-03 18:46:00 +08:00
Louistiti 1d0883ca44 feat(skill/tiny-web-crawler): add Tiny Web Crawler built-in agent skill 2026-05-03 18:31:18 +08:00
Louistiti e500dc6765 fix(agent mode): harden agent skill planning 2026-05-03 15:57:01 +08:00
Louistiti 7f49886562 refactor(server): remove dotenv helper 2026-05-02 22:15:40 +08:00
Louistiti ed15ae3cbb feat: support agent skill; split native and agent skills 2026-05-02 21:25:02 +08:00
Louistiti ee57ee1250 fix(agent mode): prevent stalled tool calls 2026-05-02 14:00:07 +08:00
Louistiti d383b6a3f5 feat(web app): focus query input after command modal closes 2026-05-02 10:41:03 +08:00
Louistiti a7f1eafa96 refactor: remove stale SDK tool sources 2026-05-02 10:38:33 +08:00
Louistiti 8a2cad6fc1 feat(built-in command): support /skill enable|disable <skill_name> 2026-05-01 22:33:56 +08:00
Louistiti b55c47cd7f feat: migrate tools and skills to the new architecture; support profile-owned skills 2026-04-30 22:02:18 +08:00
Louistiti e67a50a48a Merge remote-tracking branch 'origin/chore/update-binaries-20260429-200801' into develop 2026-04-30 11:27:11 +08:00
github-actions[bot] ed94488250 chore: update tool binary URLs (opencode → v1.14.29) 2026-04-29 20:08:01 +00:00
Louistiti aa150e4779 feat: bump default local Qwen model support to 3.6 2026-04-29 00:01:10 +08:00
Louistiti f722c0faa5 fix(python tcp server): install TTS NLTK data 2026-04-28 15:05:46 +08:00
louistiti 8040e5c94f fix(web app): format agent turn duration 2026-04-26 11:09:46 +08:00
Louistiti 6dd0ab24fa Merge remote-tracking branch 'origin/chore/update-binaries-20260422-200300' into develop 2026-04-27 18:39:41 +08:00
louistiti 4f740b7bfb refactor(scripts): update latest model list on install 2026-04-25 16:21:55 +08:00
louistiti 7f465830e2 fix(python tcp server): download NLTK data on install 2026-04-24 23:46:33 +08:00
Louistiti d0730c2481 fix(web app): built-in modal API key icon 2026-04-23 16:12:02 +08:00
github-actions[bot] a3ef526889 chore: update tool binary URLs (opencode → v1.14.20) 2026-04-22 20:03:00 +00:00
Louistiti 674615608e fix(scripts): create Leon's home directories before install tasks 2026-04-22 11:34:14 +08:00
Louistiti f623d7d235 Merge branch 'refactor/runtime-data-pref-migration' into develop 2026-04-21 23:27:58 +08:00
Louistiti 5031b9eed8 refactor: use node instead of tsx for production start 2026-04-21 23:16:13 +08:00
Louistiti 98918cca7a BREAKING: migration to .leon/ user's folder completed 2026-04-21 23:07:52 +08:00
Louistiti be5ec46c4e BREAKING: first migration draft to .leon/ user's folder 2026-04-20 22:47:03 +08:00
Louistiti 94e5b8e8eb refactor(server): replace async IIFE in index bootstrap 2026-04-19 12:00:49 +08:00
Louistiti dc0927c7ff fix(aurora): avoid duplicating remix icon type suffixes 2026-04-19 08:35:47 +08:00
Louistiti 5609455af1 fix(server): prioritize tool errors over post-execution hooks 2026-04-19 08:32:51 +08:00
Louistiti 6fe9601c03 Merge branch 'feat/built-in-commands' into develop 2026-04-18 22:47:31 +08:00
Louistiti ef595cf162 feat(built-in command): /skill list support 2026-04-18 22:47:22 +08:00
Louistiti db80565a14 fix(built-in command): allow /skill submission without query 2026-04-18 21:57:45 +08:00
Louistiti ea2a12b76d Merge branch 'develop' into feat/built-in-commands 2026-04-18 21:29:29 +08:00
Louistiti 36750ab7c2 Merge remote-tracking branch 'origin/chore/update-binaries-20260415-200117' into develop 2026-04-18 21:28:49 +08:00
Louistiti 490e56bba2 Merge branch 'feat/built-in-commands' into develop 2026-04-18 21:28:34 +08:00
louistiti aa6988e622 refactor: use explicit remix icon names in manifests 2026-04-17 13:02:57 +08:00
louistiti a9ba958900 fix(built-in command): show actual /skill query in suggestions 2026-04-16 22:55:16 +08:00
louistiti 2cbca313d5 fix(built-in command): normalize built-in command input whitespace 2026-04-16 22:04:22 +08:00
github-actions[bot] ff759a7680 chore: update tool binary URLs (opencode → v1.4.6) 2026-04-15 20:01:17 +00:00
louistiti 34882ca62d feat(web app): support tab completion in built-in commands modal 2026-04-15 15:05:38 +08:00
louistiti 8530769278 feat(built-in command): add built-in /skill command 2026-04-14 22:19:20 +08:00
Louistiti 8047fff06a Merge branch 'feat/built-in-commands' into develop 2026-04-13 22:28:24 +08:00
Louistiti a3afdef81c feat(built-in command): add model download command 2026-04-13 22:24:34 +08:00
Louistiti 157634f6f4 Merge branch 'feat/built-in-commands' into develop 2026-04-13 10:41:19 +08:00
Louistiti 8f0258f1de fix(built-in command): validate local model path before persisting 2026-04-13 10:40:10 +08:00
Louistiti 292472079a Merge branch 'develop' into feat/built-in-commands 2026-04-12 00:25:55 +08:00
Louistiti 4ea4aab5c5 feat: show tool activity cards in web app 2026-04-12 00:25:39 +08:00
Louistiti c210b5c981 feat(agent mode): show tool inputs and outputs in web app 2026-04-11 23:58:31 +08:00
Louistiti cc25484d37 Merge branch 'develop' into feat/built-in-commands 2026-04-11 23:55:44 +08:00
Louistiti 0790dbb4ae fix(agent mode): preserve execution replan labels 2026-04-11 23:55:13 +08:00
Louistiti 307f2d3537 chore(bridge/nodejs): update deps to latest 2026-04-11 23:28:38 +08:00
Louistiti 9987c96523 chore: update new needed-to-be-updated deps 2026-04-11 23:19:23 +08:00
Louistiti 7c386a7017 chore: update needed-to-be-updated deps w/ ESLint 10+ migration 2026-04-11 22:57:44 +08:00
Louistiti f7f1354f05 chore: update @ai-sdk/* to latest 2026-04-11 22:24:23 +08:00
Louistiti fd30525886 Merge branch 'feat/built-in-commands' into develop 2026-04-11 15:18:17 +08:00
Louistiti 23463c54cd feat(built-in command): share model provider API key links 2026-04-11 15:18:08 +08:00
Louistiti 4f5310b8f1 Merge branch 'develop' into feat/built-in-commands 2026-04-10 14:52:44 +08:00
Louistiti 3a705869a6 feat(web app): show relative calendar timestamps in LLM metrics 2026-04-10 14:52:29 +08:00
Louistiti 917e966e38 fix(agent mode): recover compaction state from saved summary boundary 2026-04-10 12:50:34 +08:00
Louistiti 480e861e10 Merge branch 'develop' into feat/built-in-commands 2026-04-10 11:33:28 +08:00
Louistiti ee377a5182 Merge branch 'develop' into feat/built-in-commands 2026-04-10 00:53:46 +08:00
Louistiti 15fb86d595 Merge branch 'chore/update-binaries-20260408-195658' into develop 2026-04-10 00:53:12 +08:00
louistiti 6e3d481aee feat(agent mode): persist per-message llm metrics in history 2026-04-09 16:24:31 +08:00
github-actions[bot] ee82a450ec chore: update tool binary URLs (opencode → v1.4.0) 2026-04-08 19:56:58 +00:00
louistiti d584451bd2 fix(agent mode): track fresh history entries before re-compacting 2026-04-08 23:16:47 +08:00
Louistiti ce90f75f19 Merge branch 'develop' into feat/built-in-commands 2026-04-07 20:10:50 +08:00
Louistiti cd9bcd3d6d refactor(scripts): update commit messages 2026-04-07 20:10:32 +08:00
Louistiti b10634fd2f Merge branch 'feat/built-in-commands' into develop 2026-04-07 20:09:31 +08:00
Louistiti 353e2e979d feat: add /model built-in command for configuration flow 2026-04-07 20:09:15 +08:00
Louistiti cd45c32b6d Merge branch 'feat/built-in-commands' into develop 2026-04-06 00:20:55 +08:00
Louistiti 52357ddc17 feat(server): add stop command to terminate server 2026-04-05 21:04:00 +08:00
Louistiti 0f8738e69a Merge branch 'develop' into feat/built-in-commands 2026-04-04 18:34:24 +08:00
Louistiti 77159b91ff fix(server): preserve context tool content in execution summaries 2026-04-04 18:34:00 +08:00
Louistiti 8c8fc9eae3 fix(scripts): use managed Node for pnpm lifecycle scripts 2026-04-04 17:20:15 +08:00
Louistiti 18108ccc1e Merge branch 'feat/built-in-commands' into develop 2026-04-03 22:55:39 +08:00
Louistiti b2b06b5ee4 fix(aurora): preserve scroll container state across rerenders 2026-04-03 22:55:14 +08:00
Louistiti 0c1b67184c Merge branch 'feat/built-in-commands' into develop 2026-04-03 22:51:34 +08:00
Louistiti 10f0e3ab54 feat: add recently used built-in commands 2026-04-03 22:48:48 +08:00
Louistiti 801427f767 feat(server): display built-in commands suggestions in alphabetical order 2026-04-03 22:06:31 +08:00
Louistiti b1d14f3538 feat(server): support /mood built-in command 2026-04-03 22:03:01 +08:00
Louistiti b1a95221f8 Merge branch 'feat/built-in-commands' into develop 2026-04-03 21:06:43 +08:00
Louistiti 74b93699a5 feat(server): support pnpm cmd alias for built-in commands 2026-04-03 21:06:24 +08:00
Louistiti ef1bb7105d refactor(server): create config state aggregator 2026-04-03 20:21:59 +08:00
Louistiti c5a79be93e chore(web app): fix linter 2026-04-03 20:15:30 +08:00
Louistiti 2ff398433e feat(web app): add shortcut tip for built-in commands 2026-04-03 20:11:33 +08:00
Louistiti 29093437c5 feat: built-in commands support with first /help, /routing and /status commands 2026-04-03 20:07:04 +08:00
Louistiti 08a99f2b4a Merge remote-tracking branch 'origin/chore/update-binaries-20260401-195649' into develop 2026-04-02 23:11:37 +08:00
github-actions[bot] 5d1f66359f chore: update tool binary URLs (opencode → v1.3.13) 2026-04-01 19:56:49 +00:00
Louistiti c81099b240 feat(server): built-in commands entry points 2026-04-01 23:32:04 +08:00
Louistiti b1062d1f3e perf(server): skip paraphrase for skill errors and oversized answers 2026-03-31 11:38:52 +08:00
Louistiti 03e8eb091d Merge branch 'feat/history-sync' into develop 2026-03-31 11:15:23 +08:00
Louistiti 7922a4828e perf(web app): hydrate fetched widgets without blocking feed 2026-03-31 11:15:14 +08:00
Louistiti 6fb4ca1ada feat(server): add isAddedToHistory property for cleaner and faster processing on history 2026-03-31 10:33:44 +08:00
Louistiti 1a3baa7e0f fix(server): display system widgets and widgets in sync 2026-03-31 10:18:05 +08:00
Louistiti a1c4322fb1 feat: keep system widgets persistent as well 2026-03-31 09:16:27 +08:00
Louistiti 946984fb52 feat: synchronize history; broadcast messages to clients 2026-03-30 22:52:05 +08:00
Louistiti c362d89195 chore: do not open browser on dev runtime 2026-03-30 16:09:34 +08:00
Louistiti ccd6694b25 feat(server): fine tune token budgets on workflow mode 2026-03-30 16:08:40 +08:00
Louistiti 99615b8ccb docs: update main progress channel in README.md 2026-03-29 21:47:25 +08:00
Louistiti dceee25212 docs: reorganize badges from README.md 2026-03-29 21:41:47 +08:00
Louistiti c9cbc09c3c docs: reflect new state in README.md 2026-03-29 20:20:47 +08:00
Louistiti 6adfa81578 docs: keep installation simple and technical focus 2026-03-29 14:07:43 +08:00
Louistiti 2fd571687a feat: simplify installation with custom Node.js script 2026-03-29 13:14:24 +08:00
Louistiti 596adc3bc3 Merge branch 'fix/setup' into develop 2026-03-28 13:24:49 +08:00
Louistiti 46ae45566f feat(server): open Leon automatically when the server starts 2026-03-28 13:24:41 +08:00
Louistiti 10f525bb82 Merge branch 'fix/setup' into develop 2026-03-28 09:25:52 +08:00
Louistiti 3e4be85d91 fix(scripts): enforce managed uv runtime during setup 2026-03-28 09:25:44 +08:00
Louistiti 4dc2d222be Merge branch 'fix/setup' into develop 2026-03-27 23:08:07 +08:00
Louistiti 0560e3b79c fix(web app): wait for init UI completion before sending intro messages 2026-03-27 23:07:42 +08:00
Louistiti 2fa71c8f85 Merge branch 'fix/setup' into develop 2026-03-27 22:42:06 +08:00
Louistiti 60abe86502 fix(scripts): run server with managed Node.js; rebuild managed native modules when needed 2026-03-27 22:41:56 +08:00
Louistiti cf60e673fd Merge branch 'fix/setup' into develop 2026-03-27 18:09:49 +08:00
Louistiti f3f94e39bf feat(provider/llamacpp): auto port discovery fallback 2026-03-27 18:09:38 +08:00
Louistiti 61ccde4c57 Merge branch 'fix/setup' into develop 2026-03-27 11:26:00 +08:00
Louistiti fae5807ca8 fix: enforce managed Python runtime 2026-03-27 11:25:27 +08:00
Louistiti e66b105380 Merge branch 'fix/setup' into develop 2026-03-26 23:44:00 +08:00
Louistiti cc43b6dbdc fix: do not throw right away on Windows common file status 2026-03-26 23:43:41 +08:00
Louistiti 592978c7d9 Merge branch 'fix/setup' into develop 2026-03-26 23:33:47 +08:00
Louistiti 72a2a07ead fix(server): switch to 127.0.0.1 as default llama.cpp host 2026-03-26 23:33:39 +08:00
Louistiti 932f53c137 Merge branch 'fix/setup' into develop 2026-03-26 23:30:13 +08:00
Louistiti fee1e4cb22 fix(scripts): .env CRLF-safe on Windows and avoid creation race 2026-03-26 23:29:55 +08:00
Louistiti f336c34707 Merge branch 'fix/setup' into develop 2026-03-26 23:25:12 +08:00
Louistiti 45bf7cbace feat: add llama.cpp CPU support 2026-03-26 23:15:11 +08:00
Louistiti 6c0039be27 Merge branch 'fix/setup' into develop 2026-03-26 23:04:05 +08:00
Louistiti 3e671efc72 fix(scripts): remove chmod noise for Windows on setup 2026-03-26 23:03:49 +08:00
Louistiti 852e848aed Merge branch 'fix/setup' into develop 2026-03-26 23:01:18 +08:00
Louistiti 8c41befaed fix(scripts): use .cmd for tsc binary on Windows and add fallback 2026-03-26 23:01:09 +08:00
Louistiti bbc32b79df Merge branch 'fix/setup' into develop 2026-03-26 22:53:49 +08:00
Louistiti 2165f32e92 feat(scripts): use a dedicate file to clean up Leon's processes 2026-03-26 22:53:37 +08:00
Louistiti d20269bf40 Merge branch 'develop' into fix/setup 2026-03-26 22:32:15 +08:00
Louistiti 439b596a97 Merge remote-tracking branch 'origin/chore/update-binaries-20260325-194416' into develop 2026-03-26 22:32:00 +08:00
Louistiti 395c9b2b56 Merge branch 'fix/setup' into develop 2026-03-26 22:31:54 +08:00
Louistiti eb69a1147a feat: upgrade @ark-ui/react to latest and add Aurora dev preview 2026-03-26 22:31:43 +08:00
Louistiti cf77a431b6 fix: use tar to uncompress .zip, .whl on Windows 2026-03-26 16:13:06 +08:00
github-actions[bot] a42d147644 chore: update tool binary URLs (opencode → v1.3.2) 2026-03-25 19:44:16 +00:00
Louistiti a9f8e1d45f Merge branch 'fix/setup' into develop 2026-03-25 17:41:03 +08:00
Louistiti bd4ee16261 fix(scripts): merge setup preferences 2026-03-25 17:40:54 +08:00
Louistiti 1e7cd0f4be feat(scripts): set remote LLM during setup 2026-03-25 02:04:17 +08:00
Louistiti 8a9ce2ff0f Merge branch 'fix/setup' into develop 2026-03-25 00:42:45 +08:00
Louistiti a8a8567ed3 BREAKING: remove offline setup legacy code 2026-03-25 00:42:34 +08:00
Louistiti 574fb329ff Merge branch 'fix/setup' into develop 2026-03-24 21:42:23 +08:00
Louistiti b947eecfe2 feat: if no LLM has been configured yet, we should mentioned it 2026-03-24 21:38:10 +08:00
Louistiti 2ce5b197b0 Merge branch 'fix/setup' into develop 2026-03-24 20:28:46 +08:00
Louistiti dd214b6b09 feat(scripts): move questions at the start of the setup 2026-03-24 20:28:38 +08:00
Louistiti 1cc2f77bea Merge branch 'fix/setup' into develop 2026-03-24 20:15:29 +08:00
Louistiti 0b10f5f265 chore: disable voice by default 2026-03-24 20:15:20 +08:00
Louistiti 620381a066 Merge branch 'fix/setup' into develop 2026-03-24 20:06:38 +08:00
Louistiti aa8bc63b1e feat(scripts): silent husky 2026-03-24 20:06:28 +08:00
Louistiti 8509832acb Merge branch 'fix/setup' into develop 2026-03-24 19:49:13 +08:00
Louistiti 1104407b1f feat(scripts): readjust local AI check 2026-03-24 19:48:48 +08:00
Louistiti f91ce8f37b Merge branch 'fix/setup' into develop 2026-03-24 19:39:28 +08:00
Louistiti cf35e17741 chore: clean up stdout 2026-03-24 19:39:16 +08:00
Louistiti 45e1ea4643 Merge branch 'fix/setup' into develop 2026-03-24 19:25:45 +08:00
Louistiti 07718d06e8 chore: clean up dependencies and re-enable lock file 2026-03-24 19:25:35 +08:00
Louistiti 37a9499a45 BREAKING: migrate Aurora to the core repo; upgrade TypeScript and ESLint deps 2026-03-24 18:57:06 +08:00
Louistiti 18a44e0bd1 Merge branch 'fix/setup' into develop 2026-03-24 16:52:05 +08:00
Louistiti df12892951 BREAKING: use pnpm 2026-03-24 16:51:56 +08:00
Louistiti fbc7851d2a style(scripts): new lines in setup summary 2026-03-24 14:52:46 +08:00
Louistiti 9487eb363e feat(scripts): merge fetch status 2026-03-24 14:50:09 +08:00
Louistiti 7e261de8eb feat: universal abort controller on network requests 2026-03-24 13:11:29 +08:00
Louistiti 272851d875 feat(scripts): complete revamp of the setup process 2026-03-24 12:54:06 +08:00
Louistiti 3c9dccefb8 Merge branch 'fix/setup' into develop 2026-03-23 12:58:48 +08:00
Louistiti c60269d077 feat: completely replace ipull with custom built-in fetch module 2026-03-23 12:52:40 +08:00
Louistiti 696c287a33 feat(scripts): improve stability over ipull on large files download 2026-03-23 11:48:35 +08:00
Louistiti 50c87f37a2 Merge branch 'fix/setup' into develop 2026-03-22 23:28:47 +08:00
Louistiti 2d9c6648c2 fix(server): on fresh install and no default LLM installed yet 2026-03-22 23:00:17 +08:00
Louistiti 145bf6cdd8 fix: minor distribution 2026-03-22 19:25:04 +08:00
Louistiti 05ab034302 feat(scripts): update check compatibility 2026-03-22 18:16:54 +08:00
Louistiti 3ab746e449 refactor(server): use built-in node and pnpm to probe context 2026-03-22 17:54:09 +08:00
Louistiti 89279de4a5 Merge branch 'feat/skill-distribution' into develop 2026-03-22 17:29:05 +08:00
Louistiti abfac8eeb8 BREAKING: replace Pipenv with uv; full use of sources with sidecar binaries 2026-03-22 17:28:26 +08:00
Louistiti ebfe84daf1 BREAKING: remove TCP server, Python bridge and Node.js binaries 2026-03-22 14:57:37 +08:00
Louistiti ab9b770800 feat: portable runtimes and skill deps sync 2026-03-21 22:58:20 +08:00
Louistiti ae6b82ecbe test(workflow mode): cover workflow routing 2026-03-21 18:10:26 +08:00
Louistiti 9731990b81 feat(server): provide a cancel choice for skill/action not found 2026-03-21 17:37:38 +08:00
Louistiti dfed0db892 feat(server): when workflow mode and cannot match a skill or action, then suggest 2026-03-21 17:19:04 +08:00
Louistiti cab7d81f2a fix(server): widget status should not stall on action loops 2026-03-21 17:11:42 +08:00
Louistiti d7ee8db704 feat: solidify the skill bridge runtime for runnable actions 2026-03-21 16:53:55 +08:00
Louistiti c8035b27b6 feat: allow tools to not be explicitely added to toolkit.json for workflow usage 2026-03-21 16:44:05 +08:00
Louistiti e8c62fb829 feat: add explicit exit on actions 2026-03-21 15:34:27 +08:00
Louistiti 5daf5cca9f feat(server): add history for skill router duty 2026-03-21 15:15:00 +08:00
Louistiti 7661a55bf2 feat: handle stderr outputs on workflow mode; refactor workflow progress 2026-03-21 14:53:39 +08:00
Louistiti df6d4b2aa0 Merge branch 'feat/workflow-refactoring' into develop 2026-03-21 14:44:08 +08:00
Louistiti 042e2c5106 feat: add granular progress to the workflow steps 2026-03-21 14:39:41 +08:00
Louistiti f74a0fda5d feat: new LLM routing format 2026-03-21 13:52:12 +08:00
Louistiti b2e3592170 BREAKING: remove legacy local LLM provider and reorganize configs 2026-03-21 11:59:24 +08:00
Louistiti 1a03328910 fix(web app): init awaiting 2026-03-21 11:10:01 +08:00
Louistiti bb6a382f09 BREAKING: legacy farewell 2026-03-21 01:36:47 +08:00
Louistiti 877bea1477 Merge branch 'feat/llamacpp' into develop 2026-03-19 22:49:32 +08:00
Louistiti ff1a8764f0 Merge remote-tracking branch 'origin/chore/update-binaries-20260318-194657' into develop 2026-03-19 22:49:27 +08:00
Louistiti fc8025dd6f feat: full built-in llama.cpp support 2026-03-19 22:48:28 +08:00
github-actions[bot] 6f5f2e1d9a chore: update tool binary URLs (opencode → v1.2.27, yt-dlp → v2026.03.17) 2026-03-18 19:46:57 +00:00
Louistiti 5bc47c39f0 fix: add new built-in libs for CUDA runtime for broader PyTorch compatibility 2026-03-18 15:01:09 +08:00
Louistiti ea121104df fix(provider/llamacpp): force tool vs auto tool selection for remote providers 2026-03-17 01:54:19 +08:00
Louistiti b04cde4369 feat(web app): add seperators to token number metrics 2026-03-17 01:27:52 +08:00
Louistiti ca2a0bd7a1 feat: calculate and display token metrics 2026-03-17 01:25:27 +08:00
Louistiti 17d10b449c feat(web app): add turn metrics 2026-03-16 14:40:41 +08:00
Louistiti c87615c91a feat(provider/llamacpp): reuse llama-server if already running 2026-03-16 14:09:54 +08:00
Louistiti 375cb14d0c feat(provider/llamacpp): forward server logs to logs/llama-server.log 2026-03-16 12:19:19 +08:00
Louistiti 93e921c13f refactor: remove Ollama 2026-03-16 12:01:31 +08:00
Louistiti b0f1d81d22 feat: use Llama.cpp as default local provider 2026-03-16 11:42:05 +08:00
Louistiti 87c6676dee feat: introduce Ollama as local LLM provider 2026-03-15 12:34:34 +08:00
Louistiti ed1bb65325 feat(agentic loop): provide more optional tool function params by default 2026-03-14 23:09:58 +08:00
Louistiti 9937eea1a1 feat: expose current owner location with to weather to impact mood status 2026-03-14 22:49:56 +08:00
Louistiti 7b90fc6223 feat: provide owner context file to Leon's knowledge 2026-03-14 22:22:18 +08:00
Louistiti dce2c5229e feat: introduce owner context file 2026-03-14 22:18:41 +08:00
Louistiti dfb23deb86 test(agentic loop): introduce unit and E2E tests 2026-03-14 17:31:01 +08:00
Louistiti 82fd7a172f Merge branch 'feat/better-agentic-loop' into develop 2026-03-14 14:33:55 +08:00
Louistiti b71f1632d9 fix: streaming chunk deduplication 2026-03-14 14:26:06 +08:00
Louistiti 3cca459376 perf(agentic loop): reduce on compaction size according to steps number 2026-03-14 14:08:01 +08:00
Louistiti 07f76e48c3 feat(agentic loop): respect prompting standards 2026-03-14 13:31:21 +08:00
Louistiti 96192e0578 feat(tool/bash): improve risky filtering 2026-03-14 13:14:03 +08:00
Louistiti d1a945fe3a fix(agentic loop): keep execution reasoning minimal; use present progressive on progress message 2026-03-14 12:49:01 +08:00
Louistiti 7b75e779f4 feat(agentic loop): add human-in-the-loop mechanism for root credentials matters 2026-03-14 12:35:59 +08:00
Louistiti 6eac081669 fix(server): tmp crash on embeddings writting 2026-03-13 21:10:43 +08:00
Louistiti 7882fc07fb feat: introduce tool hooks with jq parsing on post execution 2026-03-13 20:50:53 +08:00
Louistiti 0545414693 feat(web app): add reasoning block for every agentic phase 2026-03-13 00:49:05 +08:00
Louistiti e18ba06db7 feat(server): create a tool output logger 2026-03-13 00:13:17 +08:00
Louistiti 194d50548a fix(agentic loop): avoid meta commentary on self reflections 2026-03-12 23:43:03 +08:00
Louistiti 7b32beb56d Merge remote-tracking branch 'origin/chore/update-binaries-20260311-193929' into develop 2026-03-12 23:26:20 +08:00
Louistiti fbb91fb545 fix: alignment between phases and QMD 2026-03-12 23:26:14 +08:00
github-actions[bot] 35af397a80 chore: update tool binary URLs (opencode → v1.2.24) 2026-03-11 19:39:29 +00:00
Louistiti f64c6422bd fix(server): improve QMD error handling and unexpected exit 2026-03-11 14:26:23 +08:00
Louistiti c1ce44b6a3 perf(server): remove history on ReAct execution phase 2026-03-11 13:35:23 +08:00
Louistiti a71d22b8d3 refactor(server): migrate to QMD 2+ 2026-03-11 13:21:16 +08:00
Louistiti efa21bd9f4 feat(server): improve memory weak score threshold 2026-03-11 11:45:13 +08:00
Louistiti d521318e94 feat: improve proactivity and wired awareness 2026-03-11 11:16:19 +08:00
Louistiti 8fe532a501 feat: send pulse 2026-03-11 09:28:44 +08:00
Louistiti e0b5ea78ae feat: implement self-reflection and behavioral habits state via private diary 2026-03-10 19:29:59 +08:00
Louistiti 991fdbddcc feat(server): clearly split system prompts across ReAct loop phases 2026-03-10 16:03:41 +08:00
Louistiti 89a9928e29 feat(server): implement minimal tool call logger 2026-03-09 13:50:38 +08:00
Louistiti 107c786786 perf(server): non-blocking context file generation 2026-03-09 13:42:57 +08:00
Louistiti d76c57710c fix(server): progress/update messages natural tone 2026-03-09 13:29:40 +08:00
Louistiti 0e796d2d1d feat: advanced adaptive memory retrieval 2026-03-09 13:24:23 +08:00
Louistiti 32722501d5 fix(web app): widget priority display 2026-03-08 18:05:49 +08:00
Louistiti c1b9d99690 feat(server): improve mood and personality wiring 2026-03-08 17:30:06 +08:00
Louistiti a5cbbbd7b6 feat(server): improve long tool call timeout handling 2026-03-08 15:49:36 +08:00
Louistiti ae26b976bf refactor(server): centralize remote provider failure 2026-03-08 14:53:52 +08:00
Louistiti e9ba3321df feat(server): support OpenAI WebSocket transport by default for the agentic loop 2026-03-08 14:33:16 +08:00
Louistiti 13a626c2f3 feat(server): compaction mechanism on the ReAct loop 2026-03-07 18:41:16 +08:00
Louistiti df7904232a feat(server): resolve path alias and default OS file opener 2026-03-06 23:01:30 +08:00
Louistiti 4e8a98bf52 feat(server): optimize agentic loop reasoning across providers 2026-03-06 22:46:26 +08:00
Louistiti 05f3640b4f feat(server): improve ReAct progress messages 2026-03-06 14:31:58 +08:00
Louistiti 992e00776e feat(server): improve Leon's identity and more 2026-03-06 03:33:55 +08:00
Louistiti a3cff28de8 feat(server): remove formatting rules for non user-facing phases 2026-03-06 02:13:47 +08:00
Louistiti e41f94dc8b feat(server): improve human-in-the-loop preflight 2026-03-06 01:52:07 +08:00
Louistiti 19edd70440 feat(server): set policy for owner-facing messages to always be the final answer phase from the agentic loop 2026-03-06 01:16:33 +08:00
Louistiti ba1f2c7321 Merge remote-tracking branch 'origin/chore/update-binaries-20260304-193622' into develop 2026-03-05 15:18:18 +08:00
Louistiti 69224361c3 feat: enhance recovery planning and execution from the agentic loop 2026-03-05 15:18:12 +08:00
github-actions[bot] d5bef789a1 chore: update tool binary URLs (opencode → v1.2.17, yt-dlp → v2026.03.03) 2026-03-04 19:36:22 +00:00
Louistiti e38bfc0311 feat(server): planning safety fallback for agentic loop 2026-03-04 21:53:15 +08:00
Louistiti d4a698500d fix(server): JSON structure fallback on ReAct planning 2026-03-04 21:21:49 +08:00
Louistiti b8dbb596d0 feat(server): add continuous planning for ReAct 2026-03-04 21:12:36 +08:00
Louistiti eecdf87618 feat(server): toggle thinking per toolkit and tools policies 2026-03-04 16:26:02 +08:00
Louistiti 4899a9530a feat(server): force memory read when necessary 2026-03-04 15:40:42 +08:00
Louistiti 50ac5c307b feat(python tcp server): disable TCP server when agent route mode and no ASR/TTS enabled 2026-03-04 14:55:02 +08:00
Louistiti a41bf61497 feat(web app): breathing animation for tool/toolkit icon 2026-03-04 11:06:45 +08:00
Louistiti 201122a12f feat: display ongoing tool function with icon 2026-03-04 10:21:39 +08:00
Louistiti 6915f371d1 perf(server): non-temporary blocker context file manifest refresh on query 2026-03-04 00:38:34 +08:00
Louistiti 142adc175e feat: memory cold/hot types and rollout; with deeper memory depth 2026-03-04 00:22:50 +08:00
Louistiti 2b593793e2 perf(server): faster and more accurate memory retrieval 2026-03-03 22:42:27 +08:00
Louistiti e1aab445ef feat(server): generate context files in the background 2026-03-03 21:44:38 +08:00
Louistiti 2b28df0e52 Merge branch 'feat/unified-llm-providers' into develop 2026-03-03 21:24:13 +08:00
Louistiti 0468903cef fix(server): automatic memory 2026-03-03 21:23:59 +08:00
Louistiti 21d640f9b5 fix(server): better OpenRouter compatibility 2026-03-03 20:22:26 +08:00
Louistiti 50268e8f04 fix(server): Moonshot AI provider default temperature 2026-03-03 20:08:13 +08:00
Louistiti d731e28e06 feat(server): organize high-level props for LLM providers 2026-03-03 19:00:07 +08:00
Louistiti 6493fa5ea5 feat(server): unify streaming robustness across providers 2026-03-03 18:39:43 +08:00
Louistiti a916b6c20a feat(server): context update 2026-03-03 17:53:47 +08:00
Louistiti 42414fbcdb feat(server): use dedicated SDK per LLM provider for better TTFT and more 2026-03-03 17:49:17 +08:00
Louistiti a76e9e14c8 feat(server): OpenAI LLM provider stable 2026-03-03 16:30:45 +08:00
Louistiti 99eb5e59a0 feat(server): enable personality/mood on planning 2026-03-03 14:11:28 +08:00
Louistiti d03a09c9f8 feat: more unified inferences across LLM providers 2026-03-03 13:30:30 +08:00
Louistiti 2eb0e0a274 feat: auto bind context files to context tool read function; explicit thinking param across prompts; persona stability improvement 2026-03-03 11:56:30 +08:00
Louistiti 841e9c1655 feat: wire persona with mood changing and personality 2026-03-02 18:33:15 +08:00
Louistiti bba5e38061 feat(tool/openmeteo): add start_date and end_date params 2026-03-02 17:06:33 +08:00
Louistiti ce7dac75bd feat(server): quick time update at runtime 2026-03-02 15:39:26 +08:00
Louistiti b7272543e0 feat(server): add static type for context files 2026-03-02 13:56:18 +08:00
Louistiti 8999e7dc0b perf(server): memory queries optimization 2026-03-02 13:44:11 +08:00
Louistiti 254b56f7a9 feat(web app): improve scrolling UX 2026-03-02 12:24:42 +08:00
Louistiti b58c26d553 feat(web app): pimp reasoning block 2026-03-02 03:09:04 +08:00
Louistiti fee3be8837 feat: display reasoning UI 2026-03-02 02:50:21 +08:00
Louistiti 25d148c33d Merge branch 'feat/memory' into develop 2026-03-02 02:12:45 +08:00
Louistiti 114c286e72 feat(server): new tools data structure fallback when LLM providers fail 2026-03-02 02:06:56 +08:00
Louistiti 8fe3e57680 feat(server): add memory and context tools; optimize retrieval 2026-03-02 00:46:35 +08:00
Louistiti cf7e223c15 feat(server): make use of QMD as retrieval backend 2026-03-01 03:25:42 +08:00
Louistiti 3e3eae7bc4 feat(server): second memory draft 2026-03-01 00:46:46 +08:00
Louistiti 5d2603cbd7 Merge branch 'develop' into feat/memory 2026-02-28 14:48:07 +08:00
Louistiti f8673394ae Merge branch 'feat/progressive-context-injection' into develop 2026-02-28 14:47:28 +08:00
Louistiti 41501cdea9 feat: remove unnecessary awareness to toolkits 2026-02-28 14:46:42 +08:00
Louistiti 8d3ec0cf8e feat(server): add more awareness 2026-02-28 14:39:06 +08:00
Louistiti fa6e64f115 feat(server): first memory draft 2026-02-28 11:10:25 +08:00
Louistiti 596017b3b9 feat(server): improve self-awareness and allow manifest toggle 2026-02-28 03:01:45 +08:00
Louistiti 8d6dfc2906 Merge branch 'feat/progressive-context-injection' into develop 2026-02-28 02:25:45 +08:00
Louistiti 6e1e514788 feat(server): add LEON and ARCHITECTURE awareness 2026-02-28 02:25:32 +08:00
Louistiti 8235830261 feat(server): context manager for progressive context injection 2026-02-28 01:58:01 +08:00
Louistiti 91547ebbd8 chore: fix linter 2026-02-27 21:42:31 +08:00
Louistiti 9ec4e6acff fix(server): disabled checkbox on agentic loop thinking 2026-02-27 21:33:49 +08:00
Louistiti e3bc3736ca feat(server): add Z.AI LLM provider; provide thinking widget 2026-02-27 01:51:27 +08:00
Louistiti 14e26b1cd1 refactor(server): ReAct / agentic loop more modulable 2026-02-27 00:51:27 +08:00
Louistiti 52a63dbf7d feat(server): stabilize LLM providers for ReAct with self-healing mechanisms; implement new providers 2026-02-27 00:13:02 +08:00
Louistiti 480be6aec3 Merge branch 'feat/progressive-context-injection' into develop 2026-02-26 09:06:44 +08:00
Louistiti bedfd40cec feat(server): enable streaming by default 2026-02-25 21:13:53 +08:00
Louistiti 27431991e3 feat(server): improve UX on long-tail tasks for ReAct 2026-02-25 15:37:09 +08:00
Louistiti b2c1ee77e5 feat(server): incremental timeouts for ReAct 2026-02-25 15:18:23 +08:00
Louistiti 1853bc47e3 feat(server): ReAct loop fails earlier 2026-02-25 14:30:53 +08:00
Louistiti 6957bdae93 feat(server): smarter sub ReAct loop and final answer retrials 2026-02-25 14:04:51 +08:00
Louistiti 9fc1d15fb4 feat: extra fallback mechanism in the agentic loop 2026-02-25 11:55:05 +08:00
Louistiti 98ae198dde feat: first shot of the progressive context injection 2026-02-25 11:09:21 +08:00
Louistiti 50f0d28c5b feat(server): inject history in tool callings step from the agentic loop 2026-02-25 01:51:03 +08:00
Louistiti 38a3c5df15 feat(server): function call retrials 2026-02-24 22:58:16 +08:00
Louistiti 16a226c103 refactor(server): ReAct / agentic loop 2026-02-24 22:05:03 +08:00
Louistiti 2d11750089 feat(server): specific bash handler in agentic loop 2026-02-24 21:28:59 +08:00
Louistiti a5dc01bcab feat(server): agentic loop parsing improvement 2026-02-24 17:36:56 +08:00
Louistiti fcd1422b4f refactor(scripts): update prompting on tool creation 2026-02-24 14:45:57 +08:00
Louistiti bf68660922 Merge remote-tracking branch 'origin/chore/update-binaries-20260224-063438' into develop 2026-02-24 14:38:42 +08:00
github-actions[bot] 07ad988944 chore: update tool binary URLs (yt-dlp → v2026.02.21) 2026-02-24 06:34:38 +00:00
Louistiti e2d5431b04 Merge branch 'feat/react-agentic-loop-and-tool-refactoring' into develop 2026-02-24 14:27:13 +08:00
Louistiti 7ad6d60b0c feat(server): optimize agentic loop for local provider and make workflow skill action calling compatible with remote providers 2026-02-24 13:43:01 +08:00
Louistiti 40138e2bda chore: provide default ordered LLM list with OpenRouter provider 2026-02-24 12:59:35 +08:00
Louistiti bc9c96f033 feat(server): expose HTTP errors of LLM providers 2026-02-24 12:33:24 +08:00
Louistiti cd7d65b075 feat(server): add builtin tool calls and logs 2026-02-24 12:12:16 +08:00
Louistiti 1942d8f835 feat(server): more efficient agentic loop; HuggingFace provider implemented 2026-02-24 11:13:39 +08:00
Louistiti 1798d691a8 feat(server): ReAct fallback optimization 2026-02-24 09:45:20 +08:00
Louistiti 5125d908ec feat(server): return answer when plain text in ReAct loop 2026-02-24 01:42:02 +08:00
Louistiti 8c23671e0c chore: fix linting 2026-02-24 01:07:22 +08:00
Louistiti 3037c2c93a chore: upgrade nodemon to latest 2026-02-24 00:06:54 +08:00
Louistiti fe30a03f6b chore: remove Prettier 2026-02-23 23:39:07 +08:00
Louistiti 728bb2fd02 perf(server): improve ReAct prompting 2026-02-23 23:23:29 +08:00
Louistiti 39ea8eae13 feat(server): implement Cerebras LLM provider 2026-02-23 20:16:14 +08:00
Louistiti ccfdff6a9a feat: define nested objects in tool functions definitions and improve agentic loop reliability 2026-02-23 19:34:39 +08:00
Louistiti bb1cee5b59 feat(server): implement OpenRouter as LLM provider 2026-02-23 14:16:02 +08:00
Louistiti 5c5c28414b feat(server): parse paths from ReAct loop 2026-02-23 13:51:32 +08:00
Louistiti 525ea6d7b4 feat: better parsing for the tool runtime 2026-02-23 13:26:49 +08:00
Louistiti 923a5f91c1 feat: first shot of the ReAct agentic loop and new tools structure 2026-02-23 11:16:38 +08:00
Louistiti 17e35c717d fix(server): Groq up-to-date model 2026-02-22 10:57:14 +08:00
Louistiti d7bccb0985 Merge remote-tracking branch 'origin/chore/update-binaries-20260221-165703' into develop 2026-02-22 01:27:45 +08:00
Louistiti c9df0dbb58 feat(tool/opencode): custom config provided at runtime 2026-02-22 01:27:41 +08:00
github-actions[bot] 704ecf44b0 chore: update toolkit binary URLs (opencode → v1.2.10) 2026-02-21 16:57:03 +00:00
Louistiti b2f728b4d9 feat: check required settings for tool at runtime and provide smooth experience to set them 2026-02-21 23:50:38 +08:00
Louistiti 13a29160d3 feat: create settings standard for skills with required settings for better onboarding for tools usage 2026-02-21 13:38:15 +08:00
Louistiti 66c82ad734 fix(skill/search_web_toolkit_skill): correct answers data structure 2026-02-20 16:23:06 +08:00
Louistiti ca247033a8 feat(skill/skill_writer): allow skill changes 2026-02-20 13:54:40 +08:00
Louistiti fa3dfccb83 feat(skill/video_summarizer): implemented by Leon 2026-02-20 12:36:41 +08:00
Louistiti bd40ccc5f1 feat(tool/ytdlp): isolate default config into config file 2026-02-19 23:32:17 +08:00
Louistiti b2d5dc7a59 feat(skill/voice_designer_skill): implemented by Leon 2026-02-19 20:53:54 +08:00
Louistiti 64028ed8e1 feat(server): if only action is found in a skill, then force use it 2026-02-19 19:05:08 +08:00
Louistiti 54f1886871 feat: enable local ASR/TTS/LLM by default 2026-02-19 17:43:56 +08:00
Louistiti 431ee245ec ci: install PortAudio 2026-02-19 16:54:06 +08:00
Louistiti d551aa274d ci: verify assets naming 2026-02-19 16:31:06 +08:00
Louistiti e306859c86 ci: add lockfile only in CI 2026-02-19 16:07:22 +08:00
Louistiti 77fb3d7a2c ci: add lockfile only in CI 2026-02-19 16:04:16 +08:00
Louistiti 4164dfed41 ci: add lockfile only in CI 2026-02-19 16:01:13 +08:00
Louistiti c17bb3fcb9 ci: remove caching since we do not use lock file 2026-02-19 15:30:55 +08:00
Louistiti 1d058cb9c8 ci: use pnpm and caching 2026-02-19 15:28:29 +08:00
Louistiti af6fd656fc ci: use pnpm and caching 2026-02-19 15:26:00 +08:00
Louistiti 88fdbe9b06 ci: apply different artifact naming 2026-02-19 15:23:03 +08:00
Louistiti efc9f3b477 ci: support new OSes and archs from GitHub workflows 2026-02-19 15:08:03 +08:00
Louistiti 0d272b5bcc build: bump core deps to latest 2026-02-19 14:58:33 +08:00
Louistiti cfa79e0eb3 feat(python tcp server): make TCP server standalone compatible with external paths changes 2026-02-19 14:52:53 +08:00
Louistiti 2ab5e10f6a feat(scripts): remove PyTorch installation and force use core shared libraries 2026-02-19 13:47:07 +08:00
Louistiti cb8911c06b perf(python tcp server): use shared NVIDIA and PyTorch libraries to reduce binary size 2026-02-19 13:37:56 +08:00
Louistiti 6f69743df4 feat(server): only time record long tasks 2026-02-19 12:33:34 +08:00
Louistiti d500ab6fb7 Merge remote-tracking branch 'origin/chore/update-binaries-20260218-194555' into develop 2026-02-19 12:17:36 +08:00
Louistiti 6ab0adc9ef feat: upgrade to current Node.js LTS 2026-02-19 12:17:30 +08:00
github-actions[bot] 0a152afe9c chore: update toolkit binary URLs (opencode → v1.2.6) 2026-02-18 19:45:55 +00:00
Louistiti ae587ba327 feat: improve skill writer skill; report command execution output; and more 2026-02-19 01:02:11 +08:00
Louistiti 3f1b3da750 refactor(skill/weather_forecast): better icon mapping for the widget 2026-02-18 21:27:34 +08:00
Louistiti 404d7fbec7 feat: embed OpenCode in the Skill Writer skill; restructure tools; create simple forecast skill and more 2026-02-18 21:23:27 +08:00
Louistiti aff4d619da feat(scripts): explicit mention about the tmp files deletion 2026-02-18 11:15:56 +08:00
Louistiti ada9c25b3e feat(skill/video_translator): use Qwen3-TTS tool by default 2026-02-18 11:13:21 +08:00
Louistiti 3bdabaf943 feat(tool/qwen3_tts): implement Qwen3-TTS tool 2026-02-18 00:40:36 +08:00
Louistiti 4c23382c11 Merge branch 'feat/prompt-generator' into develop 2026-02-18 00:24:24 +08:00
Louistiti c3b389ce5b feat(scripts): tool creation prompt generator 2026-02-18 00:24:16 +08:00
Louistiti d32b43787a Merge remote-tracking branch 'origin/chore/update-binaries-20260211-195424' into develop 2026-02-15 12:04:49 +08:00
Louistiti 077bcd2f5b feat(scripts): prompt generator tmp 2026-02-15 12:04:27 +08:00
github-actions[bot] 85afab3594 chore: update toolkit binary URLs (opencode → v1.1.59) 2026-02-11 19:54:24 +00:00
Louistiti 6d6551505b Merge remote-tracking branch 'origin/develop' into develop 2026-02-08 12:21:50 +08:00
Louistiti 08b7e040fd fix(python tcp server): deps conflicts 2026-02-08 12:21:42 +08:00
louistiti 6f44bb40f0 fix: torch versioning 2026-02-08 10:07:56 +08:00
louistiti 261a7f2162 fix: torch versioning 2026-02-08 10:04:12 +08:00
Louistiti 7e573c2b7d feat(tool/qwen3_asr): implement Qwen3-ASR tool 2026-02-07 23:14:26 +08:00
Louistiti a03a59b4e5 Merge remote-tracking branch 'origin/chore/update-binaries-20260204-193714' into develop 2026-02-07 14:30:27 +08:00
Louistiti cd782b2095 feat(scripts): auto download pre-built PyTorch libs on install 2026-02-07 14:28:49 +08:00
Louistiti ce7ae583e7 feat(scripts): auto download NVIDIA NVSHMEM on install 2026-02-07 13:36:39 +08:00
Louistiti a05045c406 feat(scripts): download NVIDIA cuSPARSELt and NCCL 2026-02-06 16:11:45 +08:00
Louistiti 66dd2fe2c0 refactor: rename CUDA runtime with NVIDIA libs 2026-02-06 15:54:02 +08:00
Louistiti 8ecc049827 Merge branch 'develop' into origin/develop 2026-02-06 15:28:07 +08:00
Louistiti 5c30ca894c fix(scripts): download CUDA runtime and tools for other Linux archs and Windows 2026-02-06 15:16:06 +08:00
github-actions[bot] 7ed184adc0 chore: update toolkit binary URLs (opencode → v1.1.51, yt-dlp → v2026.02.04) 2026-02-04 19:37:14 +00:00
Louistiti 8c5d9d07f2 Merge remote-tracking branch 'origin/chore/update-binaries-20260201-073348' into develop 2026-02-01 16:27:50 +08:00
github-actions[bot] 09fab81b33 chore: update toolkit binary URLs (yt-dlp → v2026.01.31) 2026-02-01 07:33:48 +00:00
Louistiti 018d6a4e91 chore: ignore README.md when prettier 2026-02-01 14:38:11 +08:00
Louistiti d831833d49 feat: add settings at toolkits/tools level where skills settings has higher priority than tool settings 2026-02-01 14:25:30 +08:00
Louistiti fbd74ddc62 Merge remote-tracking branch 'origin/chore/update-binaries-20260131-141450' into develop 2026-01-31 22:18:05 +08:00
github-actions[bot] 38caaa9cfc chore: update toolkit binary URLs (opencode → v1.1.48, yt-dlp → v2026.01.29) 2026-01-31 14:14:51 +00:00
Louistiti c04cf5a5fc chore(skill/video_translator): TSLint 2026-01-30 00:14:35 +08:00
Louistiti 32b60f1298 feat(tool/openrouter): remove models mapping 2026-01-30 00:04:57 +08:00
Louistiti 4ddb12246d feat(tool/chatterbox): built-in text segmentation 2026-01-27 18:36:13 +08:00
Louistiti 50b21532fc fix(tool/grok): search output parsing 2026-01-26 23:40:26 +08:00
Louistiti 35bd421b84 feat(tool/grok): implement deep research (WIP) 2026-01-26 21:16:40 +08:00
Louistiti 3045985952 feat(tool/opencode): add deep guidelines following Leon's granular architecture 2026-01-25 23:40:06 +08:00
Louistiti ebe4375834 Merge branch 'feat/skill-writer-skill' into develop 2026-01-24 13:34:07 +08:00
Louistiti 6ab6cfd9ba feat(tool/opencode): Leon writes his own skills (WIP) 2026-01-24 13:33:36 +08:00
Louistiti b0fdd38532 feat(tool/cerebras): add Cerebras tool for faster inference 2026-01-20 19:30:31 +08:00
Louistiti 8b5b810f88 feat(tool/ytdlp): fallback web_safari when 403 2026-01-18 16:58:27 +08:00
Louistiti a42f78cf9d Merge branch 'feat/core-llm' into develop 2026-01-12 00:47:32 +08:00
Louistiti 1249f6a92f chore(tool/chatterbox_onnx): bump to 1.1.2 2026-01-12 00:47:18 +08:00
Louistiti b9508abfef chore(tool/ultimate_vocal_remover_onnx): bump 2026-01-12 00:29:55 +08:00
Louistiti 80e636df5c fix(tool/ffmpeg): remove stderr output non-necessary logs 2026-01-12 00:19:22 +08:00
Louistiti 4b477ccd76 fix(tool/ytdlp): update on progress download regex 2026-01-11 22:19:11 +08:00
Louis Grenard 9d0e6ee096 docs: update README.md 2026-01-11 15:47:53 +08:00
louistiti 1a1acccfdb chore(tool/chatterbox_onnx): bump to 1.1.1 2026-01-11 15:24:10 +08:00
louistiti 0273099ea6 feat(skill/video_translator): split vocals/instrumental and merge back audio 2026-01-11 15:22:50 +08:00
Louistiti 183ba56c32 feat(skill/video_translator): audio segmentation and merge 2026-01-06 19:25:23 +08:00
Louistiti c85b849206 feat: Video Translator skill nearly completed; delete previous versions of tool binaries on download; and more 2026-01-06 02:01:33 +08:00
Louistiti 7d798b13f9 feat(tool/chatterbox_onnx): auto set CUDA runtime path for Windows and Linux x86_64 2026-01-04 22:22:16 +08:00
Louistiti 26728b283a feat(tool/chatterbox_onnx): new text-to-speech and voice cloning tool 2026-01-04 21:15:33 +08:00
Louistiti 232538fffb feat(scripts): install CUDA runtime on postinstall 2026-01-03 22:54:07 +08:00
Louistiti ec3d8ec293 chore: upgrade ytdlp version from video_streaming toolkit 2025-12-31 12:53:21 +08:00
Louistiti 6ca96e3deb feat(skill/video_translator): find longest segment to get speaker ref as 10-secs fallback 2025-12-31 11:13:37 +08:00
Louistiti 9d1d66a07d feat(tool/ytdlp): reduce time intervals for faster download 2025-12-30 22:27:47 +08:00
Louistiti 208229b153 fix(tool/assemblyai_audio): no need audio_duration ms conversion in Python 2025-12-30 20:42:19 +08:00
louistiti 7b5860410b feat(skill/video_translator): ECAPA gender voice recognition; AssemblyAI tool for transcription; and more 2025-12-30 20:35:45 +08:00
louistiti 2454a0676f fix(server): keep correct track of the flow after a cross-skill execution 2025-11-06 09:02:14 +08:00
Louistiti d488109ce7 chore: TODOs comment 2025-11-05 22:13:07 +08:00
Louistiti 6c7e8d8af4 feat(tool/ffmpeg): merge audio to video 2025-11-05 22:10:30 +08:00
louistiti b4f4fffa5e feat(tool/elevanlabs_audio): dubbing function implementation 2025-11-05 20:47:28 +08:00
louistiti 118ed10817 feat(tool/elevenlabs_audio): transcription function implementation 2025-11-05 08:32:12 +08:00
Louistiti 3aa45fcc64 feat(tool/openai_audio): add chunking_strategy param for diarization 2025-11-04 22:30:06 +08:00
louistiti 8063cc6074 feat: support speaker diarization when transcribing from third-party providers 2025-11-04 21:56:20 +08:00
louistiti 0013ffc888 feat: execute actions from other skills; push/get data from context across flow; OpenAI audio tool and more 2025-11-01 17:38:32 +08:00
louistiti f075d7c922 feat: format path when resource already exists 2025-09-14 17:41:20 +08:00
Louistiti 884d027610 feat: clean up dev runtime 2025-09-14 09:48:42 +08:00
louistiti dc26074881 docs(server): todos 2025-09-13 23:44:02 +08:00
louistiti 612d773fe8 feat(tool/yt-dlp): add common args 2025-09-13 23:41:38 +08:00
louistiti 8715e71903 feat: tool logger and tool download progress report 2025-09-13 11:39:25 +08:00
louistiti 17ec4ed348 fix: auto download binary and resources from bridges 2025-09-13 10:23:06 +08:00
louistiti 2ad3fe7d91 feat: faster_whisper download model resources and end-to-end flow 2025-09-11 00:12:12 +08:00
louistiti dacbd5aab9 feat: add new faster_whisper tool binaries 2025-09-10 23:15:29 +08:00
louistiti a9e22de8ca feat: auto download tool resources (models, etc.); Faster Whisper tool 2025-09-09 23:45:49 +08:00
Louistiti 75981287ca docs(server): one more todo 2025-09-07 22:19:58 +08:00
Louistiti f513713959 feat: more robust audio extraction across bridges 2025-09-07 22:11:04 +08:00
louistiti 1fed246ca9 feat: OpenRouter tool; bash tool 2025-09-07 14:52:27 +08:00
louistiti 4e0d0cf91d feat: tool output UI 2025-09-07 11:58:11 +08:00
louistiti 1aea646c6c feat: unify binary tool calls for both bridges 2025-09-07 10:52:13 +08:00
louistiti 58fe7691ec feat: describe taken actions in binary tools 2025-09-07 01:23:41 +08:00
louistiti fcb522a69a feat: file path built-in opening; report tool progress from Python SDK 2025-09-06 13:24:37 +08:00
louistiti c263c7a7a8 feat: atomic architecture skills > actions > toolkits > tools > functions; tool management; tool progress sync and more 2025-09-06 02:06:17 +08:00
louistiti e8209d60c9 feat: action loop optimization; action hit optimization; suggestions; custom LLM duty context/sequence timeout caching; and more 2025-08-29 22:43:30 +08:00
louistiti 6f1d037c9a feat: action loop; next action from skill 2025-08-25 00:11:44 +08:00
louistiti bc832bc723 chore(server): upgrade node-llama-cpp to latest 2025-08-24 20:07:41 +08:00
louistiti b0329695f3 refactor(server): slot filling type parsing 2025-08-23 20:52:43 +08:00
louistiti d55977d60b feat: common_answer across actions; better slot filling; flow implementation 2025-08-23 20:30:59 +08:00
louistiti 66f60c0145 feat: multi action callings; new widget parsing and more 2025-08-21 21:36:39 +08:00
Louistiti e7e5bcb25e fix(server): slot filling debugging 2025-08-04 00:10:32 +08:00
Louistiti 519d226c92 feat(bridge/python): inspect action call to allow optional args 2025-08-03 17:35:21 +08:00
louistiti 892919b8c9 feat: bridge params helper 2025-08-03 14:11:21 +08:00
louistiti 24e5d27999 feat(server): bind bridges with the new core rewrite 2025-07-31 00:01:17 +08:00
louistiti f55e856720 feat(server): better bridge typing 2025-07-27 15:06:18 +08:00
louistiti 25ccbe0044 feat(server): brain dialog skill answer mechanism 2025-07-27 02:21:52 +08:00
louistiti 3b04e1f767 feat(server): NLU rewrite + brain logic skill mechanism rewrite 2025-07-26 23:43:21 +08:00
Louistiti 91487506f9 feat(server): merge built-in entities 2025-07-07 23:01:21 +08:00
louistiti 24f92630d8 feat(server): missing params and slot filling 2025-07-07 21:36:53 +08:00
Louistiti 5caa936b5d feat(server): action calling routing 2025-07-01 22:38:18 +08:00
louistiti 4ac2377fcc feat(server): action calling getting ready for pre and post-process 2025-07-01 09:51:12 +08:00
Louistiti c85d192a0f feat(server): recursive action calling properties schema 2025-06-24 23:14:08 +08:00
louistiti 5619481b8c feat(server): action calling progress 2025-06-24 21:51:04 +08:00
louistiti 2ea42fcb87 feat(server): main backbone on skill action calling 2025-06-22 19:03:02 +08:00
louistiti 334bebb0ef feat(server): Ollama server tmp 2025-05-25 17:13:11 +08:00
louistiti 7aed4a53f2 feat: tmp function calling description 2025-05-10 17:34:59 +08:00
Louistiti d482cb4d15 feat: new skill description 2025-05-05 21:05:56 +08:00
Louistiti 35a3f37173 feat(server): PoC on default new classification powered by LLM 2025-05-03 19:58:06 +08:00
Louistiti c15795187c fix: file downloader helper cross-OS compatibility 2025-04-24 13:42:08 +08:00
louistiti 8bf89df4ee build: add guidance for binaries on Windows 2025-04-24 21:18:15 +08:00
louistiti 28d3153d24 refactor(python tcp server): NVIDIA cuDNN Windows path 2025-04-24 08:24:41 +08:00
louistiti 3b06996fbd refactor: Python TCP server and Python bridge setup paths 2025-04-24 08:17:21 +08:00
louistiti bda9da79c0 fix(python tcp server): correct dist path for Windows 2025-04-24 08:13:52 +08:00
Louistiti 302341e1c7 fix: Windows import from absolute path 2025-04-23 20:42:31 +08:00
Louistiti 2e0e01e9d9 fix(server): is typing conflicts 2025-04-23 20:14:11 +08:00
Louistiti 738f44aee7 fix: postinstall deps pnpm scripts by default 2025-04-23 11:48:40 +08:00
louistiti 0978bc5811 feat(web app): upgrade Aurora to 1.0.0-beta.15 2025-04-22 08:35:31 +08:00
Louistiti 6417397761 feat(web app): render Aurora component for suggestions 2025-04-21 23:10:18 +08:00
Louistiti c0622df993 feat(server): upgrade node-llama-cpp to 3.7.0 2025-04-12 17:48:15 +08:00
Louistiti c938ff60b3 chore: add comments 2025-03-22 11:37:48 +08:00
Louistiti bea26f6ea6 test(server): use of Qwen, Gemma 3 and Llama SuperNova 2025-03-22 10:59:52 +08:00
Louistiti 16fa7f860b docs: minimum Node.js/npm version in README 2025-02-25 21:04:50 +08:00
Louistiti b028e68204 feat(server): upgrade node-llama-cpp to 3.6.0 2025-02-23 12:29:51 +08:00
Louistiti 17db772f59 ci: add Volta pin 2025-02-10 20:38:50 +08:00
Louistiti 0d18bb6f26 Merge branch 'feat/new-wake-word-engine' into develop 2025-02-09 20:32:38 +08:00
Louistiti cc892519c8 feat(python tcp server): wake word engine completed 2025-02-09 20:32:28 +08:00
Louistiti 71d24d4142 fix(python tcp server): wake word and ASR loop 2025-02-06 23:10:45 +08:00
louistiti 71e9de654a feat(scripts): verify Rust setup first before install 2025-02-05 09:18:59 +08:00
Louistiti 970cbfbb88 feat(python tcp server): wake word wip 2025-02-04 22:57:27 +08:00
Louistiti ae788f7cf1 feat(python tcp server): wake word deps 2025-02-03 17:31:43 +08:00
Louistiti 1959d185d8 feat(python tcp server): wake word settings 2025-02-03 17:23:10 +08:00
Louistiti ec0cd9d330 feat(python tcp server): set wake word models 2025-02-03 17:20:02 +08:00
louistiti 47306c3370 feat(server): upgrade node-llama-cpp to 3.5.0 2025-01-31 09:57:28 +08:00
louistiti a3d5c21afc BREAKING: use Node.js 22.13.1+ and npm 10.9.2+ as minimum engines 2025-01-28 13:58:36 +08:00
louistiti 199b172cd7 fix(server): fail import after build 2025-01-28 13:51:04 +08:00
Louistiti 11f22715f4 feat(python tcp server): configurable ASR durations 2025-01-27 11:29:08 +08:00
louistiti c976499ff3 chore: downgrade cx_Freeze to 7.1.1 for Python bridge 2025-01-26 08:27:43 +08:00
Louistiti d7f18b2bcb chore: upgrade nodemon to 3.1.9 2025-01-25 22:36:51 +08:00
Louistiti dfc321b1a3 feat(python tcp server): upgrade PyTorch to 2.5.1 for CUDA Toolkit 12.4.1 2025-01-25 22:28:24 +08:00
Louistiti f87c69b30c refactor(python tcp server): use constant for Python version 2025-01-25 20:14:15 +08:00
Louistiti 27bb49e373 fix(python tcp server): explicitely includes about module from the av package 2025-01-25 17:33:23 +08:00
Louistiti b6a94e7a26 fix: husky settings 2025-01-25 10:36:40 +08:00
Louistiti cb67717712 chore: upgrade husky to 9.1.7 2025-01-25 10:27:03 +08:00
Louistiti 53c8e6a175 feat(server): upgrade node-llama-cpp to 3.4.1 2025-01-25 09:25:39 +08:00
louistiti b1f9627c12 feat(python tcp server): upgrade Faster Whisper to 1.1.1 2025-01-04 12:17:53 +08:00
louistiti 1ef2693872 perf(server): use imatrix model to improve quantized model quality 2025-01-04 11:51:56 +08:00
louistiti 1a11bf755c perf(scripts): improve files download strategy 2025-01-04 10:46:26 +08:00
louistiti 9cb68d5c13 chore: remove unused script 2025-01-04 10:06:22 +08:00
louistiti 025234dbe8 feat(scripts): stop compiling llama.cpp from source and upgrade node-llama-cpp 2025-01-04 09:51:02 +08:00
Ciphreon 067dac6f98 feat(scripts): Update LLM setup script (#547) 2025-01-04 09:18:17 +08:00
Louis Grenard c5c1a4d24a docs: update README 2025-01-01 20:57:41 +08:00
louistiti bde86630d5 fix(bridge/python): widget default wrapper_props 2024-11-20 21:51:25 +08:00
louistiti ea8ba0f1fd feat(server): move to ESM 2024-11-20 21:47:05 +08:00
louistiti 529620b83a fix(server): set ffprobe needed permissions 2024-11-16 23:47:57 +08:00
louistiti fe46e8c733 feat(server): upgrade node-llama-cpp to 3.2.0 2024-11-16 23:07:24 +08:00
louistiti 2accdc3d16 feat: download NLTK datasets on Python env setup 2024-11-16 22:45:10 +08:00
louistiti 0eeb9bb141 feat: support Node.js 22 2024-11-16 22:44:17 +08:00
louistiti f88e26b452 feat(python tcp server): improve city entity accuracy 2024-11-16 21:13:37 +08:00
louistiti 6d230498c4 fix(server): avoid conflict when booting TCP server with npm script 2024-11-16 20:53:21 +08:00
louistiti eeceae5d36 feat(python tcp server): force spaCy to run on CPU 2024-11-16 19:30:30 +08:00
louistiti 2b2e32be95 chore(python tcp server): upgrade geonamescache to 2.0.0 2024-11-12 09:40:57 +08:00
louistiti cae634dfd4 Merge branch 'feat/akinator-rewrite' into develop 2024-09-05 22:14:32 +08:00
louistiti 185be39172 feat(skill/akinator): complete rewrite 2024-09-05 22:14:18 +08:00
louistiti 67bc7ddb32 Merge branch 'develop' into feat/todo-list-widgets 2024-09-04 22:01:56 +08:00
louistiti ffb1aa6bdc Merge branch 'feat/todo-list-widgets' into develop 2024-09-04 22:01:48 +08:00
louistiti ae0e5b0643 fix(bridge/python): bump requests to 2.32.3 for a better compatibility with new Python version 2024-09-04 22:01:41 +08:00
louistiti fe28a80908 feat(skill/todo_list): add widget on add_totos action 2024-09-04 22:00:13 +08:00
louistiti e0e3e59960 Merge branch 'develop' into feat/todo-list-widgets 2024-09-04 08:31:50 +08:00
louistiti fbe47e98bd Merge branch 'feat/todo-list-widgets' into develop 2024-09-04 08:31:41 +08:00
louistiti aa5d76333c feat(skill/todo_list): add widgets to actions 2024-09-04 08:31:19 +08:00
louistiti 8bca0595b4 feat: new onFetch skill API and more 2024-09-01 23:16:14 +08:00
louistiti 9aa9e0ba49 Merge branch 'develop' into feat/todo-list-widgets 2024-09-01 07:24:49 +08:00
louistiti c9828b7524 Merge branch 'feat/todo-list-widgets' into develop 2024-09-01 07:24:29 +08:00
louistiti d8902f9cb6 fix: upgrade Aurora for a smoother text rendering 2024-09-01 07:23:35 +08:00
louistiti 2de7e3cad3 feat(skill/todo_list): view list widget 2024-09-01 07:08:38 +08:00
louistiti a64fed2444 feat(skill/todo_list): list of lists widget 2024-08-30 07:52:34 +08:00
louistiti d679ae8c3c feat(server): execute skill action over HTTP from widget trigger 2024-08-29 09:40:31 +08:00
louistiti 3fd78c0d4c feat(server): add widget event error handler 2024-08-29 09:24:42 +08:00
louistiti e72f2bda8c feat(server): run skill action from widget (WIP) 2024-08-29 09:20:17 +08:00
louistiti c24be71585 fix(bridge/python): event handlers binding 2024-08-28 09:32:20 +08:00
louistiti 457422687d fix(bridge/python): event handlers 2024-08-28 08:41:03 +08:00
louistiti f6fa166d87 refactor(skill/todo_list): remove unnecessary params on view_lists action 2024-08-27 09:17:20 +08:00
louistiti ee732ceca8 feat(skill/todo_list): view_lists widget action kick off 2024-08-27 09:13:59 +08:00
louistiti 719664d1e5 fix(skill/todo_list): French utterance samples 2024-08-27 08:18:04 +08:00
louistiti effbdc1976 Merge branch 'feat/python-sdk-widget-and-more' into develop 2024-08-26 22:06:48 +08:00
louistiti be0da3d1e2 feat(bridge/python): widgets support 2024-08-26 22:06:20 +08:00
louistiti 534853d67a Merge branch 'feat/widgets' into develop 2024-08-25 21:55:51 +08:00
louistiti 2e2e766d77 feat: allow skill speech answer only 2024-08-25 21:53:06 +08:00
louistiti d49912e9a0 feat(web app): render deleted widget 2024-08-25 18:34:00 +08:00
louistiti dc9e9df907 feat(skill/timer): create cancel_timer action 2024-08-25 08:11:20 +08:00
louistiti 25af621e09 fix(web app): delayed next event loop tick for auto scroll down 2024-08-25 08:04:00 +08:00
louistiti 2c809331b4 fix(skill/timer): initial progress when remaining time is negative 2024-08-24 21:21:51 +08:00
louistiti 505ba15806 Merge branch 'develop' into feat/widgets 2024-08-24 21:10:14 +08:00
louistiti d417384204 Merge branch 'feat/widgets' into develop 2024-08-24 21:10:02 +08:00
louistiti 83a561c7b9 feat(web app): finish widget fetching 2024-08-24 21:09:51 +08:00
louistiti 543513b982 refactor(bridge/nodejs): redefine widget fetch API 2024-08-24 09:44:21 +08:00
louistiti f7bb8a1100 feat: widget fetching API 2024-08-24 08:22:28 +08:00
louistiti c0d9c3d4c7 feat: fetch widget without duplicates 2024-08-23 09:19:52 +08:00
louistiti 556650d471 feat: widget fetching backbone (WIP) 2024-08-22 08:42:41 +08:00
louistiti c695aadfbe feat(skill/timer): add check_timer action 2024-08-21 09:32:07 +08:00
louistiti ff83e272c0 feat(server): skill on fetch backbone (WIP) 2024-08-20 08:45:59 +08:00
louistiti cc4e90f397 Merge branch 'develop' into feat/widgets 2024-08-16 08:13:13 +08:00
louistiti 5462151e3f Merge branch 'feat/widgets' into develop 2024-08-16 08:13:00 +08:00
louistiti 470889a797 feat(skill/timer): custom timer component 2024-08-16 08:12:46 +08:00
louistiti d77c975800 feat(skill/timer): kick off (WIP) 2024-08-15 08:09:32 +08:00
louistiti 3b5d0432ae feat(server): get NER duration unit 2024-08-14 08:19:03 +08:00
louistiti 7b81fd05da Merge branch 'develop' into feat/widgets 2024-08-13 08:39:23 +08:00
louistiti 897acf0f2c fix(web app): load feed correctly in case of broken formatted strings from local storage 2024-08-13 08:39:14 +08:00
louistiti b4df4cf747 Merge branch 'feat/widgets' into develop 2024-08-13 08:35:17 +08:00
louistiti ee9835248f feat: load widgets from the feed 2024-08-13 08:34:42 +08:00
louistiti e4d9ea737a Merge branch 'feat/widgets' into develop 2024-08-12 21:58:02 +08:00
louistiti 840ee56423 feat: upgrade @leon-ai/aurora to 1.0.0-beta.13 2024-08-12 21:57:47 +08:00
louistiti ff29aa4ddd feat: bind widget event methods 2024-08-12 21:52:03 +08:00
louistiti 7176630ef7 Merge branch 'feat/widgets' into develop 2024-08-12 00:07:23 +08:00
louistiti b66027d22f feat: Aurora components bottom to top hydration 2024-08-12 00:07:03 +08:00
louistiti 7271e9673a Merge branch 'feat/widgets' into develop 2024-08-11 09:10:37 +08:00
louistiti 2486784250 feat: form event binding 2024-08-11 09:09:53 +08:00
louistiti 782085059b Merge branch 'develop' into feat/widgets 2024-08-10 17:04:37 +08:00
louistiti 7e9800be47 feat(server): upgrade node-llama-cpp to 3.0.0-beta.44 2024-08-10 11:51:37 +08:00
louistiti c9cd93b264 perf(server): try new Lexi V2 LLM 2024-08-10 11:35:53 +08:00
louistiti 7a69714efb feat: nested widget components rendering PoC 2024-08-06 08:25:45 +08:00
louistiti 29f44f3aed chore: merge branch 'develop' into feat/widgets 2024-08-06 07:47:35 +08:00
louistiti 0a10810cf2 feat: widget interaction PoC 2024-08-06 07:45:55 +08:00
louistiti b891a22d2d fix(server): HuggingFace alternative and Llama 3.1 trial 2024-08-05 23:00:36 +08:00
louistiti 82f495acb1 fix(server): upgrade node-llama-cpp to 3.0.0-beta.41 for context error 2024-08-05 21:22:36 +08:00
louistiti bb05adb483 feat: widget hydration PoC kickoff 2024-08-04 22:54:18 +08:00
louistiti edb9b367c1 fix(server): rollback to node-llama-cpp@3.0.0-beta.37 as further version can't compile well 2024-08-01 22:05:41 +08:00
louistiti 7ecb8589fb Merge branch 'develop' into feat/widgets 2024-07-28 21:11:07 +08:00
louistiti feebb22094 feat: upgrade typescript to 5.5.4 2024-07-28 21:10:49 +08:00
louistiti 98be8a0022 feat: widget hydration (WIP) 2024-07-28 21:09:21 +08:00
louistiti e135a5fcce feat: upgrade typescript to 5.5.3 2024-07-17 10:03:49 +08:00
louistiti d23925c7d5 perf(bridge/nodejs): faster cold start by avoiding to compile unnecessary chunks 2024-07-17 09:47:27 +08:00
louistiti f8289fa809 chore: upgrade React to latest 2024-07-16 09:38:51 +08:00
louistiti fd5e952695 feat(server): enable FlashAttention for faster inference 2024-07-14 21:19:42 +08:00
louistiti 626c77d340 feat(server): upgrade node-llama-cpp to 3.0.0-beta.38 2024-07-14 21:16:40 +08:00
louistiti ac3e61d7b2 feat(server): allow custom LLM duties from skills 2024-07-07 18:48:47 +08:00
louistiti db33126664 fix(server): update duties system prompt on mood and context info set 2024-07-07 17:49:37 +08:00
louistiti 822e20f80b fix(scripts): remove description property on LLM action classifier training 2024-07-07 16:03:20 +08:00
louistiti c21051b9a7 feat(server): upgrade llama.cpp to b3322 release; node-llama-cpp to node-llama-cpp 2024-07-07 15:51:34 +08:00
louistiti dcda888de6 fix(server): persona typo 2024-07-04 09:21:02 +08:00
louistiti 0c775ba2e5 feat: use VRAM as LLM unit requirements 2024-07-03 23:41:23 +08:00
louistiti 6867e9c6db feat(server): VRAM helpers 2024-07-03 13:42:10 +08:00
louistiti 1334c2013c feat(server): has GPU helper 2024-07-03 13:34:05 +08:00
louistiti 94885de71b feat(server): get graphics compute API 2024-07-03 13:31:26 +08:00
louistiti b86775846b feat(server): get GPU device names 2024-07-03 13:24:53 +08:00
louistiti 4019bd877b chore: better comments on LLM action matching 2024-07-03 09:11:25 +08:00
louistiti 7e483b9123 feat: add inspect:gpu npm script 2024-07-02 22:12:48 +08:00
louistiti ee615e6ade refactor(python tcp server): rename the RMS threshold setting for ASR 2024-07-01 22:53:34 +08:00
louistiti b092947e2e feat(web app): add headset tips for a better voice experience 2024-07-01 22:52:16 +08:00
louistiti 1d96655b01 fix(python tcp server): overflowed on ASR 2024-07-01 22:28:18 +08:00
louistiti 8ed7c78074 fix(web app): use correct config property for LLM warm up 2024-07-01 09:45:58 +08:00
louistiti be3df774dc feat(server): boost free RAM delta for LLM 2024-07-01 09:38:20 +08:00
louistiti 2c89041b3f feat(server): upgrade node-llama-cpp to 3.0.0-beta.36 2024-07-01 09:03:02 +08:00
louistiti e4277bfcf4 feat(web app): add more info data 2024-06-30 20:04:08 +08:00
louistiti 2e351d4218 feat(web app): add info 2024-06-30 19:58:26 +08:00
louistiti e24dee3b07 feat(server): VRAM context size management 2024-06-30 19:15:24 +08:00
louistiti 8eeff3a01c feat(python tcp server): map speech synthesis hardware device choice to settings 2024-06-30 16:54:59 +08:00
louistiti a05f34422e feat(server): upgrade node-llama-cpp to 3.0.0-beta.34 2024-06-30 16:47:57 +08:00
louistiti 74241b43fe feat(python tcp server): run speech synthesis inference on CPU 2024-06-30 16:30:12 +08:00
louistiti fae15c9f4d feat(server): kill existing PyTorch thread from TCP server on start 2024-06-30 16:03:11 +08:00
louistiti 2c1b35144d feat(server): use debug verbosity by default in LLM manager 2024-06-30 15:54:51 +08:00
louistiti c25c52532f feat(server): increase LLM threads number 2024-06-30 15:54:12 +08:00
louistiti 805c65b2b2 fix(web app): init state when shouldWarmUpLLM is not enabled 2024-06-30 15:53:49 +08:00
louistiti 0bb61e5301 Merge remote-tracking branch 'origin/develop' into develop 2024-06-29 23:29:52 +08:00
louistiti d2038061e7 feat(server): disable onToken when LLM duties are warming up 2024-06-29 23:29:25 +08:00
Louis Grenard 7a42f4df93 feat(server): disable onToken when LLM duties are warming up 2024-06-29 23:28:19 +08:00
louistiti ed9961c822 feat(server): sync LLM duties warmup with UI 2024-06-27 23:36:32 +08:00
louistiti fb91551364 feat(server): warm up LLM duties when necessary (WIP) 2024-06-25 23:49:09 +08:00
louistiti 8dc725a697 refactor(scripts): differentiate PyTorch info log on macOS 2024-06-24 08:28:32 +08:00
louistiti 6c3abf30b0 fix(server): sometimes the action recognition LLM duty add whitespace to intent 2024-06-23 23:36:11 +08:00
louistiti 1314217e00 BREAKING: upgrade from Python 3.9 to Python 3.11 2024-06-23 23:29:09 +08:00
louistiti 871617649a chore(bridge/python): upgrade cx_Freeze to 7.1.1 2024-06-23 22:42:42 +08:00
louistiti 85c3a40457 chore(python tcp server): upgrade cx_Freeze to 7.1.1 2024-06-23 22:41:46 +08:00
louistiti 0661e9e04f refactor(scripts): only install PyTorch when the targeted setup is the TCP server 2024-06-23 22:39:39 +08:00
louistiti 6045eb5105 feat(server): speed up translation LLM duty 2024-06-23 22:27:12 +08:00
louistiti 72954a3557 feat(server): speed up summarization LLM duty 2024-06-23 22:13:36 +08:00
louistiti cd65b84b7c feat(server): init LLM duty on inference requested by skills 2024-06-23 18:47:58 +08:00
louistiti c0e9fdcd8b feat(server): speed up paraphrase LLM duty 2024-06-23 18:46:32 +08:00
louistiti 780fd97006 feat(server): speed up NER custom LLM duty 2024-06-23 18:31:18 +08:00
louistiti e985d65165 feat(server): improve action recognition LLM duty to not hallucinate 2024-06-23 17:45:29 +08:00
louistiti 223cfdc0c9 fix(server): force lowercase on intent name for the action recognition LLM duty 2024-06-23 17:43:29 +08:00
louistiti 38a700feb0 fix: whitelist config.json for the TTS model 2024-06-23 17:24:38 +08:00
louistiti faee688924 feat: keep .gitkeep on audio models 2024-06-23 17:07:45 +08:00
louistiti a9e5a2978f feat(server): prepare LLM duties speed improvement on context/session creation 2024-06-22 23:23:39 +08:00
louistiti ab0e1493a0 feat(server): speed up LLM action recognition 2024-06-22 23:19:21 +08:00
louistiti 76b197baeb refactor(python tcp server): ASR CUDA log notification on bootup 2024-06-22 21:03:27 +08:00
louistiti aa63a6dabc chore(server): upgrade nodemon to 3.1.4 2024-06-22 12:44:23 +08:00
louistiti 1b4a1f15a9 feat(server): upgrade node-llama-cpp to 3.0.0-beta.32 2024-06-21 23:34:54 +08:00
louistiti 3734a16b6a fix(python tcp server): TTS inference correct params mapping 2024-06-21 09:51:52 +08:00
louistiti 8e28466cae feat(python tcp server): improve TTS performance by using generator for inference 2024-06-21 09:38:53 +08:00
louistiti a8ece30ced fix(python tcp server): use CPU on macOS as a tmp fix against the memory leak for TTS 2024-06-20 22:24:25 +08:00
louistiti a8b3f7c9bd feat(python tcp server): upgrade PyTorch to 2.3.1 (better MPS compatibility) 2024-06-20 09:54:16 +08:00
louistiti 963660db19 feat(python tcp server): empty cache on MPS PyTorch backend for TTS 2024-06-19 08:59:20 +08:00
louistiti 5b176c90f5 fix(server): use correct LLM action recognition judgement 2024-06-19 08:57:39 +08:00
Louis Grenard 200b425e0b docs: important notice on README 2024-06-18 09:11:56 +08:00
louistiti 8d3bffb64d fix: skill settings 2024-06-18 09:07:17 +08:00
louistiti 32dc3ced0b feat: Apple Silicon support for voice models 2024-06-18 09:02:09 +08:00
louistiti c9afb25ed3 feat(python tcp server): allow ASR device setting 2024-06-17 09:33:48 +08:00
louistiti de3ceb76be feat(python tcp server): unify settings to a single place, model settings included 2024-06-17 09:17:00 +08:00
louistiti 72d55870fe fix(web app): dynamic init states 2024-06-17 08:33:36 +08:00
louistiti 858b5090b4 feat(python tcp server): settings.json to store settings that can be edited on the fly 2024-06-16 23:33:47 +08:00
louistiti ebe156e2d8 feat: new universal ASR logic for OS cross compatibility 2024-06-16 21:26:23 +08:00
louistiti 3fc01d1906 feat: ignore Pipfile.lock files 2024-06-16 16:02:42 +08:00
louistiti 582b2aa572 feat: kick off ASR engine support for Apple Silicon 2024-06-12 00:31:47 +08:00
louistiti 04c3e88224 chore(server): upgrade llama.cpp to newer version 2024-06-11 00:40:49 +08:00
louistiti 52128039cb feat: synchronize major states between core and client 2024-06-11 00:11:03 +08:00
louistiti 1b66cc6218 feat(web app): better tips and prepare React components injection to init 2024-06-10 11:31:32 +08:00
louistiti 60e8b532de feat(web app): load fonts from local instead of Google Fonts APIs 2024-06-10 09:49:37 +08:00
louistiti d0b5b63840 feat(web app): allow multilines 2024-06-09 14:45:00 +08:00
louistiti c2849758e1 fix(server): avoid conversation loop 2024-06-08 11:27:47 +08:00
louistiti 7699739712 feat: add better quality TTS checkpoint 2024-06-08 02:17:26 +08:00
louistiti 7b8b702f92 fix(python tcp server): switch cx_Freeze to 7.1.0.post0 as 7.1.0 has been removed from the pip registry 2024-06-07 23:27:50 +08:00
louistiti 53e8cd2182 fix(bridge/python): switch cx_Freeze to 7.1.0.post0 as 7.1.0 has been removed from the pip registry 2024-06-07 23:27:09 +08:00
louistiti e0c10d4769 feat(bridge/python): upgrade cx_Freeze to 7.1.0 2024-06-07 09:55:41 +08:00
louistiti 65681521ab docs: add note on Git GUI clients 2024-06-07 09:49:08 +08:00
louistiti 22f892760f feat(server): boost free RAM for LLM usage 2024-06-07 09:46:24 +08:00
louistiti 4ce470d3e7 feat(python tcp server): force TTS BERT local files 2024-06-06 08:43:06 +08:00
louistiti 7c9487b62b feat(scripts): download and install TTS BERT model files for the Python TCP server env setup 2024-06-06 07:56:03 +08:00
louistiti 6df34d48ee feat(scripts): test comment 2024-06-05 23:58:01 +08:00
Louis Grenard d3f3c4e3a7 feat(scripts): setup Python TCP server TTS language model files kick off 2024-06-05 23:39:59 +08:00
louistiti 11e8ad43ae feat(python tcp server): use new V1_1 voice for TTS 2024-06-04 00:18:33 +08:00
louistiti 88457e4b7a feat(server): new V1_1 voice naming 2024-06-03 23:58:01 +08:00
louistiti 181f68109e chore: upgrade @ffprobe-installer/ffprobe to 2.1.2 2024-06-02 01:01:27 +08:00
louistiti 00f1dcef38 feat(server): catch exception on STT and TTS init 2024-06-02 00:29:43 +08:00
louistiti 4cb374e64d fix(python tcp server): exclude NVIDIA libs injection for non-macOS platforms on build 2024-06-02 00:10:25 +08:00
louistiti fd76681f81 chore(python tcp server): upgrade cx_Freeze to 7.1.0 (may fix macOS wheel build) 2024-06-01 23:33:02 +08:00
louistiti eb72065e5e feat(scripts): auto delete .venv when Python packages failed to be installed on setup 2024-06-01 23:23:00 +08:00
louistiti e9f1aadc67 feat(scripts): add Apple Metal developer tools error hint on Apple Silicon for llama.cpp setup 2024-06-01 21:57:20 +08:00
louistiti f1c6db6053 fix(scripts): llama.cpp release tag not failing when null 2024-06-01 21:33:07 +08:00
louistiti 40fd5fac88 fix(scripts): llama.cpp default tag number on LLM setup 2024-06-01 21:04:46 +08:00
Louis Grenard 97e0e04987 docs: update README (#527) 2024-05-30 23:17:49 +08:00
louistiti e250519c1b feat: voice engine status sync with UI status 2024-05-29 23:39:44 +08:00
louistiti 2e866cd2d7 feat(web app): add Leon voice animation states 2024-05-29 15:07:14 +08:00
louistiti 3bfd8ad893 perf(web app): slightly improve rendered text perf 2024-05-28 20:48:33 +08:00
louistiti a3f6cb1aba feat(web app): core animation on voice 2024-05-28 17:40:56 +08:00
louistiti 0804dc7be6 fix(server): confusion between owner and creator in Leon's persona 2024-05-28 11:05:18 +08:00
louistiti e328bd7f4c feat(server): add time zone to context persona 2024-05-28 11:01:58 +08:00
louistiti e435e526b4 feat(web app): improve text streaming animation 2024-05-28 10:58:22 +08:00
louistiti 747ec51143 feat(web app): text animation on stream 2024-05-28 10:43:24 +08:00
louistiti 96dabd9e6e feat(server): when utterance is sent, interrupt Leon's voice 2024-05-27 22:36:57 +08:00
louistiti 8eefe53473 feat(web app): prevent from sending utterance while Leon is generating answer 2024-05-27 19:25:57 +08:00
louistiti 0ce1f62c0d feat: support default conversations powered by LLM with action-first in mind 2024-05-27 18:54:54 +08:00
louistiti 4bad34278b feat(server): LLM action recognition management 2024-05-26 10:09:03 +08:00
louistiti 1516b18a11 refactor: unify Python TCP server warnings to ignore 2024-05-26 09:55:48 +08:00
louistiti fb5c258cf6 refactor: unify NLP models paths 2024-05-26 09:47:13 +08:00
louistiti 34170a38ac fix(server): provide correct duty type from LLM provider completion 2024-05-25 23:31:44 +08:00
louistiti a846eb9131 refactor(server): replace LLM providers options with params 2024-05-25 23:20:51 +08:00
louistiti 32db721f0e feat(server): create action recognition LLM duty 2024-05-25 23:05:19 +08:00
louistiti c18458ac41 feat(python tcp server): decrease throttling to 0.3s on ASR speech 2024-05-24 18:40:44 +08:00
louistiti 2fac3881eb feat: support (very) long speech on ASR 2024-05-24 18:38:00 +08:00
louistiti 37fe307035 feat: support speech interruption 2024-05-24 10:25:05 +08:00
louistiti c1349c930a feat: support incremental active listening for ASR 2024-05-24 01:26:28 +08:00
louistiti c54ad18cc3 feat(server): do not mention about context switch 2024-05-23 20:47:41 +08:00
louistiti be1a4d2ad3 feat(server): persona rules improvement 2024-05-23 19:46:22 +08:00
louistiti 9e43a78ecb feat(server): provide time of the day to persona 2024-05-23 19:45:11 +08:00
louistiti 22529a4348 feat(server): include more dynamic info in persona 2024-05-23 19:25:59 +08:00
louistiti 91fb441dcd feat: auto update mood on client; fix NER on slot filling 2024-05-23 17:49:55 +08:00
louistiti 9c8db3364b chore: upgrade nodemon to 3.1.0 and minor improvements 2024-05-23 13:46:21 +08:00
louistiti 8a80f4fce6 feat(server): allow emojis with streamed answer and unify token clean up 2024-05-23 12:32:15 +08:00
louistiti a762b3cbfe chore: upgrade tsx to 4.10.5 2024-05-23 10:47:38 +08:00
louistiti b238170e7c fix: memory leak in dev mode 2024-05-23 10:38:41 +08:00
louistiti 6b24e4280c fix(python tcp server): correctly load .env variables 2024-05-23 09:43:03 +08:00
louistiti beb208973f feat(python tcp server): warm up TTS model on start 2024-05-23 09:24:46 +08:00
louistiti 528257664a feat(server): clean up existing Python TCP server processes on start 2024-05-23 09:12:17 +08:00
louistiti f278ca16b8 feat: support stream for LLM outputs 2024-05-23 01:05:21 +08:00
louistiti 0d370a8c7e feat(python tcp server): fine tune parameters for the ASR 2024-05-22 20:52:01 +08:00
louistiti 7299f5fc4d feat(python tcp server): add new wake word alternative 2024-05-22 18:58:22 +08:00
louistiti 8acdbec6e3 feat(python tcp server): increase voice speed on TTS engine 2024-05-22 18:56:11 +08:00
louistiti e2bdbe9e8a feat(python tcp server): add new wake word alternative 2024-05-22 17:57:07 +08:00
louistiti c440a51f51 fix(server): if no action match the utterance, then immediately return the NLU result object as it is 2024-05-22 17:52:15 +08:00
louistiti c172f2d6af fix(server): handle exception on NLU 2024-05-22 17:32:13 +08:00
louistiti 0ff26739e7 feat(web app): display Leon's mood when LLM is enabled 2024-05-22 16:17:02 +08:00
louistiti 9b13520b9e feat(web app): increase font size on chat bubbles 2024-05-22 15:30:57 +08:00
louistiti b02d510490 feat(server): always load ASR model from local 2024-05-22 15:22:30 +08:00
louistiti 5855990bd5 feat(server): add TCP message listener for ASR 2024-05-22 01:23:41 +08:00
louistiti 596b7552dd feat: new ASR engine ready 2024-05-21 23:57:36 +08:00
louistiti f051c1d2cd feat(python tcp server): ASR engine communication with core 2024-05-21 19:20:09 +08:00
louistiti ef368f89fb feat(python tcp server): multi threading and new ASR engine 2024-05-21 16:38:45 +08:00
louistiti 72390e2fe6 feat(python tcp server): update to latest TTS checkpoint 2024-05-20 09:06:03 +08:00
louistiti 580289e05d feat(scripts): add error hint about PortAudio for audio stream 2024-05-20 00:39:33 +08:00
louistiti 39dae08b6b feat(python tcp server): ASR PoC kick off 2024-05-20 00:29:39 +08:00
louistiti e16782e2db feat(server): add Leon mood info on init 2024-05-19 11:58:01 +08:00
louistiti ed42f9b752 feat(python tcp server): prepare ASR entry point 2024-05-19 11:46:47 +08:00
louistiti b25b82b9dc feat(python tcp server): add break after : character on new TTS engine 2024-05-18 22:42:48 +08:00
louistiti fd36eafb91 feat(python tcp server): increase socket content length 2024-05-18 22:42:12 +08:00
louistiti a2e6466bb9 feat(python tcp server): clean up emojis on TTS engine 2024-05-18 22:20:15 +08:00
louistiti f776913ca3 feat(server): complete first version of the new TTS engine 2024-05-18 21:45:46 +08:00
louistiti 9a065175ca feat: prepare TCP server and core to communicate for the new TTS engine 2024-05-18 10:42:31 +08:00
louistiti a7cab344f8 feat(python tcp server): embed new text-to-speech engine in TCP server binary 2024-05-18 01:11:12 +08:00
louistiti e455a9d96b feat(scripts): TCP server setup add PyTorch nightly install 2024-05-17 12:20:34 +08:00
louistiti 85af31b614 feat(python tcp server): TTS tmp inference 2024-05-16 12:03:24 +08:00
louistiti 0e959412d5 feat(python tcp server): TTS cleaned up, ready to be implemented and embedded 2024-05-16 01:03:15 +08:00
Louis Grenard 6f24f50497 feat(python tcp server): kick off new TTS implementation 2024-05-15 00:09:49 +08:00
louistiti 74e2ffeb96 Merge branch 'mistral-llm-ner' into develop 2024-05-09 01:06:17 +08:00
louistiti bbb533f49f ci(bridge/python): tmp disable Windows build 2024-05-09 00:14:03 +08:00
louistiti bdff917e04 feat(scripts): avoid LLM setup when running in CI 2024-05-08 19:21:52 +08:00
louistiti 52cf4afbec ci(python tcp server): set macOS runner to macos-12 2024-05-08 19:13:35 +08:00
louistiti 0ef1ec9247 ci(bridge/python): set macOS runner to macos-12 2024-05-08 19:12:51 +08:00
louistiti aa862a6b5f fix(scripts): TCP_SERVER_SRC_PATH to PYTHON_TCP_SERVER_SRC_PATH to set up Python env 2024-05-08 19:04:15 +08:00
louistiti f10f310aef build(bridge/nodejs): bump to 1.2.0 2024-05-08 18:53:30 +08:00
louistiti 18b47f168a build(bridge/python): bump to 1.3.0 2024-05-08 18:53:01 +08:00
louistiti f7ad05275b chore(server): clean up comments 2024-05-08 01:39:01 +08:00
louistiti d62e0cd56c feat(server): Groq support as LLM provider; agnostic LLM provider 2024-05-08 01:37:47 +08:00
louistiti 1caa73a13a fix(server): init LLM provider; completed 2024-05-07 18:53:37 +08:00
louistiti 844af50008 feat(server): LLM provider architecture (WIP) 2024-05-07 02:51:18 +08:00
louistiti b26d924890 feat(server): improve Paraphrase duty accuracy 2024-05-06 11:22:28 +08:00
louistiti da1b469f8d chore(server): remove unused countTokens method 2024-05-06 01:00:31 +08:00
louistiti 0189c74a0e feat(server): finalize Leon's personality and optimize LLM duties 2024-05-06 00:57:20 +08:00
louistiti a0a4f9d7b0 feat(server): emit socket message when a new update is available 2024-05-05 11:08:16 +08:00
louistiti eeb1b07898 feat(server): chit-chat duty and skill and more 2024-05-05 00:20:59 +08:00
louistiti 78e5f79bce feat(server): make Leon's personality more lively 2024-05-04 00:24:21 +08:00
louistiti 764e815204 feat(server): switch LLM duties back to using ChatWrapper instead of completions 2024-05-03 23:23:46 +08:00
louistiti 03d25f2a48 feat(server): Leon's personality done 2024-05-03 23:00:32 +08:00
louistiti aa36c8cb2a feat(server): personality support kick off; answer queue 2024-05-02 16:40:05 +08:00
louistiti 2146637022 feat(server): add paraphrase LLM duty to kick off personality attribution 2024-05-01 01:04:29 +08:00
louistiti 0a4e0ed90d feat(server): add confidence value in logs 2024-04-30 11:48:09 +08:00
louistiti ceeb5bd70e feat(server): use Lexi-Llama-3-8B-Uncensored-Q5_K_S as default LLM 2024-04-30 09:58:30 +08:00
louistiti f77343918d chore: upgrade socket.io-client to latest 2024-04-29 21:28:20 +08:00
louistiti e2984ea87e chore: upgrade socket.io to latest 2024-04-29 21:27:16 +08:00
louistiti 694d398d7b chore: upgrade fastify to latest 2024-04-29 21:25:25 +08:00
louistiti a2bca433f6 chore: upgrade dotenv to latest 2024-04-29 21:24:21 +08:00
louistiti 60698704ca chore: uninstall async npm package 2024-04-29 21:15:47 +08:00
louistiti 7d4e64d575 chore: upgrade tsc-watch to latest 2024-04-29 21:08:49 +08:00
louistiti 2c03efc167 refactor(server): warning message on explicit deactivation of LLM 2024-04-29 19:33:30 +08:00
louistiti 539281110a feat(server): allow explicit deactivation of LLM 2024-04-29 19:31:57 +08:00
louistiti 3ed88544f8 fix(server): specify correct minimem total/free RAM for LLM 2024-04-29 19:18:27 +08:00
louistiti 9ee73ea5f9 feat(server): map resolved slots to dialog answers 2024-04-29 18:37:20 +08:00
louistiti c934d0e30d feat(server): support dialog type action after slots filled 2024-04-29 18:02:41 +08:00
louistiti d9f0144e62 feat(server): action loop support 2024-04-29 11:25:18 +08:00
louistiti 57923f83ee fix(scripts): always update manifest on LLM setup 2024-04-28 10:10:57 +08:00
louistiti a38eee71f0 feat(server): set Phi-3 as default LLM 2024-04-26 15:14:28 +08:00
louistiti c8e03ec401 fix(server): utterance as expected_item loop indefinitely 2024-04-22 23:29:30 +08:00
louistiti 4ca32b5070 feat(scripts): fallback to mirror in case of error to download LLM 2024-04-22 00:00:46 +08:00
louistiti d8660251af feat: use mistral-7b-instruct-v0.2.Q4_K_S as final choice 2024-04-20 14:33:37 +08:00
louistiti 26af271edc feat(server): add utterance as expected_item type 2024-04-20 14:29:00 +08:00
louistiti da49a4dd82 feat(scripts): llama.cpp compatible build 2024-04-18 20:38:02 +08:00
louistiti cf02f0f91d feat(server): final LLM setup 2024-04-17 00:10:41 +08:00
louistiti 2de95c4ef9 feat(server): Gemma support (prototype) 2024-04-16 20:18:18 +08:00
louistiti 2434d36564 feat(skill/translator-poc): short translate action kick off 2024-04-15 20:42:11 +08:00
louistiti 73d919868b feat(server): LLM entities support 2024-04-14 17:41:39 +08:00
Théo LUDWIG 39cbd7114e fix(bridge/python): usage of dict instead of empty TypedDict to avoid types errors
We might in the future generate automatically from the TypeScript types, generate the Python types.
For the moment, it is not typed, so we use a dict.
2024-02-25 20:57:02 +01:00
louistiti a16ab4abfa feat(server): add response data to LLM inference endpoint 2024-02-19 18:31:56 +08:00
louistiti 6e12d2638d feat(server): verify whether LLM is enabled on inference 2024-02-19 18:30:10 +08:00
louistiti 0d3c42beb2 feat(server): implement PoC skill to validate LLM execution 2024-02-19 18:01:41 +08:00
louistiti 66f65b25b4 feat(server): expose LLM duties behind HTTP endpoint 2024-02-19 17:00:14 +08:00
louistiti 3f85a93a03 feat(server): LLM duties architecture + custom NER, summarization and translation duties 2024-02-18 23:43:25 +08:00
Louis Grenard e9e9155366 feat(server): bootstrap LLM TCP server <> LLM duties <> TCP client (tmp) 2024-02-15 00:13:16 +08:00
Louis Grenard 30c9d3bce5 feat(server): create updater 2024-02-14 17:37:21 +08:00
Louis Grenard dba5d90b94 chore: add LLM TCP server to Git commit message 2024-02-14 09:45:26 +08:00
Louis Grenard 0705659f3e fix(scripts): Python TCP server setup 2024-02-14 09:44:50 +08:00
louistiti 4815651a1d feat(server): bootstrap LLM TCP server (tmp) 2024-02-14 09:27:22 +08:00
louistiti 71ebdc5d80 refactor(server): prepare LLM TCP client connection 2024-02-13 18:51:45 +08:00
louistiti 49ac3218f7 feat(server): preparing LLM TCP server loading 2024-02-13 16:22:32 +08:00
louistiti 1c0c8080bf feat(scripts): download and compile llama.cpp 2024-02-08 21:05:06 +08:00
louistiti 46f6c09739 scripts(setup-llm): tell when LLM is up-to-date 2024-01-30 00:09:20 +08:00
louistiti 93eb2d22b3 scripts(setup-llm): set up LLM 2024-01-29 23:57:23 +08:00
louistiti c4d2524922 scripts(setup-llm): kick off LLM setup and unify common functions 2024-01-29 00:20:38 +08:00
louistiti 7482edde0a Merge branch 'widget-backbone' into mistral-llm-ner 2024-01-28 22:22:48 +08:00
louistiti 09b9a02284 feat(skill/random_number): widget rendering 2024-01-28 17:16:10 +08:00
Théo LUDWIG f895963ab9 feat(bridge/python): add Text component 2023-12-12 19:48:03 +01:00
Théo LUDWIG 637ab43626 feat(bridge/python): add TextInput component 2023-12-12 19:47:44 +01:00
Théo LUDWIG 811bb7ab44 feat(bridge/python): add Tab component 2023-12-12 19:47:22 +01:00
Théo LUDWIG a65d330256 feat(bridge/python): add TabList component 2023-12-12 19:47:02 +01:00
Théo LUDWIG 04cff622b2 feat(bridge/python): add TabGroup component 2023-12-12 19:46:04 +01:00
Théo LUDWIG b2f260d04d feat(bridge/python): add TabContent component 2023-12-12 19:45:29 +01:00
Théo LUDWIG adda7bc6ac feat(bridge/python): add Switch component 2023-12-12 19:45:03 +01:00
Théo LUDWIG fb936c45b6 feat(bridge/python): add Slider component 2023-12-12 19:44:33 +01:00
Théo LUDWIG d0ade211ad feat(bridge/python): add Select component 2023-12-12 19:44:11 +01:00
Théo LUDWIG 90397f8029 feat(bridge/python): add SelectOption component 2023-12-12 19:43:48 +01:00
Théo LUDWIG 7ee89d9e58 feat(bridge/python): add ScrollContainer component 2023-12-12 19:43:14 +01:00
Théo LUDWIG 050fcec835 feat(bridge/python): add Radio component 2023-12-12 19:42:32 +01:00
Théo LUDWIG f714a99108 feat(bridge/python): add RadioGroup component 2023-12-12 19:42:10 +01:00
Théo LUDWIG 5623c33d04 feat(bridge/python): add Progress component 2023-12-12 19:41:42 +01:00
Théo LUDWIG 8d937b1e5f feat(bridge/python): add Loader component 2023-12-12 19:41:16 +01:00
Théo LUDWIG 1613b12765 feat(bridge/python): add List component 2023-12-12 19:40:54 +01:00
Théo LUDWIG db13c1b51e feat(bridge/python): add ListItem component 2023-12-12 19:40:33 +01:00
Théo LUDWIG 78e577114e feat(bridge/python): add ListHeader component 2023-12-12 19:40:02 +01:00
Théo LUDWIG f5999bef99 feat(bridge/python): add Link component 2023-12-12 19:39:30 +01:00
Théo LUDWIG 1284a8f6aa feat(bridge/python): add Image component 2023-12-12 19:38:57 +01:00
Théo LUDWIG 1a89eec108 feat(bridge/python): add Icon component 2023-12-12 19:38:33 +01:00
Théo LUDWIG dfb9b81c8b feat(bridge/python): add IconButton component 2023-12-12 19:37:24 +01:00
Théo LUDWIG 68ca55c82e feat(bridge/python): add Flexbox component 2023-12-12 19:36:55 +01:00
Théo LUDWIG f68a338dec feat(bridge/python): add CircularProgress component 2023-12-12 19:36:11 +01:00
Théo LUDWIG 435170659e feat(bridge/python): add Checkbox component 2023-12-12 19:34:12 +01:00
Théo LUDWIG 1a0e29e6dd feat(bridge/python): add Card component 2023-12-12 19:33:25 +01:00
Théo LUDWIG c9cf7d3ae8 style: format python with autopep8 2023-12-12 19:30:54 +01:00
Théo LUDWIG 0d4104b629 feat(bridge/python): render widgets 2023-12-10 18:33:07 +01:00
Théo LUDWIG c361682cab fix(bridge/nodejs): types improvements 2023-12-10 16:44:25 +01:00
louistiti 55b81a3c8f feat(bridge/python): widget renderer kick off 2023-12-10 23:06:44 +08:00
louistiti c5e1ed8e86 chore: remove html-react-parser 2023-12-10 10:47:23 +08:00
louistiti 4baf8f0d55 feat: add widgets folder to skills 2023-12-10 10:02:34 +08:00
louistiti 5a55397ef8 refactor(bridge/nodejs): render return type 2023-12-10 08:59:19 +08:00
louistiti 05200a195b feat: final widget new structure 2023-12-10 08:48:13 +08:00
louistiti 7167849d6a feat: widget new structure 2023-12-09 23:07:34 +08:00
louistiti edfa90d820 refactor(skill/widget-playground): flexbox component usage 2023-12-03 22:48:24 +08:00
louistiti 3511452d93 chore: upgrade Aurora to 1.0.0-beta.9 2023-12-03 22:31:31 +08:00
louistiti 1408f358c7 feat(bridge/nodejs): add Text component 2023-12-03 22:07:12 +08:00
louistiti 0297e1d22b feat(bridge/nodejs): add TabList component 2023-12-03 22:06:30 +08:00
louistiti 10a17b0146 feat(bridge/nodejs): add TabGroup component 2023-12-03 22:05:52 +08:00
louistiti bba60ea45d feat(bridge/nodejs): add TabContent component 2023-12-03 22:05:02 +08:00
louistiti 64e1e7da3e feat(bridge/nodejs): add Tab component 2023-12-03 22:04:27 +08:00
louistiti 14e5bee7d6 feat(bridge/nodejs): add Switch component 2023-12-03 22:03:53 +08:00
louistiti 2576987c44 feat(bridge/nodejs): add Status component 2023-12-03 22:03:15 +08:00
louistiti ea7d6c48db feat(bridge/nodejs): add Slider component 2023-12-03 22:02:37 +08:00
louistiti 52f37fc3ed feat(bridge/nodejs): add SelectOption component 2023-12-03 22:02:04 +08:00
louistiti 8cb0816f24 feat(bridge/nodejs): add Select component 2023-12-03 22:01:28 +08:00
louistiti ca59f02f4f feat(bridge/nodejs): add ScrollContainer component 2023-12-03 22:00:50 +08:00
louistiti 7af761c5f6 feat(bridge/nodejs): add RadioGroup component 2023-12-03 22:00:11 +08:00
louistiti f2b75fc184 feat(bridge/nodejs): add Radio component 2023-12-03 21:59:41 +08:00
louistiti 3bf457caef feat(bridge/nodejs): add Progress component 2023-12-03 21:58:55 +08:00
louistiti 90b5596b76 feat(bridge/nodejs): add Loader component 2023-12-03 21:58:01 +08:00
louistiti 93c0d6c83b chore: upgrade Aurora to1.0.0-beta.8 2023-12-03 21:57:10 +08:00
louistiti 9b5aa5f901 feat(bridge/nodejs): add ListItem component 2023-12-03 21:49:00 +08:00
louistiti bad92d3569 feat(bridge/nodejs): add ListHeader component 2023-12-03 21:48:23 +08:00
louistiti 1f0e4d2260 feat(bridge/nodejs): add List component 2023-12-03 21:47:41 +08:00
louistiti d460dc59f5 feat(bridge/nodejs): add Link component 2023-12-03 21:46:47 +08:00
louistiti eb64695697 feat(bridge/nodejs): add TextInput component 2023-12-03 21:44:00 +08:00
louistiti 308bebeb48 feat(bridge/nodejs): add Image component 2023-12-03 21:41:08 +08:00
louistiti bd71866342 feat(bridge/nodejs): add IconButton component 2023-12-03 21:40:21 +08:00
louistiti b55d58ec30 feat(bridge/nodejs): add Icon component 2023-12-03 21:39:34 +08:00
louistiti 2cf4ef54c3 feat(bridge/nodejs): add Flexbox component 2023-12-03 21:38:36 +08:00
louistiti 34a5e8bac1 feat(bridge/nodejs): add CircularProgress component 2023-12-03 21:37:10 +08:00
louistiti 502ec8ba2e feat(bridge/nodejs): add Checkbox component 2023-12-03 21:35:56 +08:00
louistiti ac25897e9e feat(bridge/nodejs): add Card component 2023-12-03 21:32:38 +08:00
louistiti c44824c89d feat: Aurora components auto mapping of types 2023-11-27 23:17:51 +08:00
louistiti 673de84936 chore: upgrade @leon-ai/aurora to latest (component types exports) 2023-11-27 22:41:19 +08:00
louistiti 78aa9c6ddc feat: new rendering engine prototype on widgets 2023-11-26 23:22:32 +08:00
Théo LUDWIG ea2e5b9747 chore: bump @leon-ai/aurora to v1.0.0-beta.5 2023-11-22 18:10:45 +01:00
louistiti ea1a33b51f refactor(web app): fonts change 2023-11-22 21:39:38 +08:00
louistiti 7a441d50b9 chore: remove ark-ui from core 2023-11-22 20:51:26 +08:00
Théo LUDWIG 364b74568e chore: usage of @leon-ai/aurora 2023-11-21 23:09:12 +01:00
Théo LUDWIG 5f5cb1f55b chore: remove aurora 2023-11-21 23:04:17 +01:00
louistiti 4479fcd655 feat: tmp understanding of the JSX parser 2023-11-21 22:19:06 +08:00
louistiti ad56672819 feat: add checkbox component to skill renderer test 2023-11-21 20:48:05 +08:00
louistiti b4bcabbb9e feat: use TSX template for widget format 2023-11-20 21:52:44 +08:00
louistiti aaf1a1989b feat(web app): cast props value as boolean when necessary 2023-11-18 17:05:29 +08:00
louistiti 2025e366d2 feat(web app): widget components tmp case parsing 2023-11-17 00:33:27 +08:00
louistiti 201d1ce4e4 feat(web app): widget PoC 2023-11-17 00:06:30 +08:00
louistiti 2d1e27926d chore: add classnames npm dep 2023-11-16 23:20:01 +08:00
louistiti e449011f90 chore: merge branch 'develop' into widget-backbone 2023-11-16 23:18:25 +08:00
louistiti 84b84453a7 Merge branch 'chore/clean-up' into develop 2023-11-15 22:38:53 +08:00
louistiti 00cee2d2fd ci: remove macOS ARM64 test runner 2023-11-15 21:56:59 +08:00
Louis Grenard 78cce1970e ci: macOS ARM64 runner test 2023-11-15 21:46:51 +08:00
louistiti 977a822cc8 fix(scripts): clone intent-object JSON files for bridges on check command 2023-11-15 21:15:29 +08:00
Théo LUDWIG 1558970619 chore: forgotten tsconfig.json to update 2023-11-15 02:00:57 +01:00
Théo LUDWIG 86de211fa8 BREAKING: drop support for Docker 2023-11-15 01:23:05 +01:00
Théo LUDWIG 2923c6504b chore: update dependencies + usage of tsx instead of ts-node 2023-11-15 01:10:06 +01:00
Théo LUDWIG 3e23950519 chore: remove dependabot 2023-11-14 23:59:10 +01:00
louistiti 92eb32b4da build(tcp server): 1.1.0 2023-11-14 23:31:10 +08:00
louistiti 754bd7380f build(bridge/python): 1.2.0 2023-11-14 22:38:34 +08:00
louistiti d32cda3663 build(bridge/nodejs): 1.1.0 2023-11-14 22:35:27 +08:00
louistiti e175ea5c12 feat(web app): widget PoC beginning 2023-11-12 23:19:51 +08:00
louistiti 167c97120d Merge branch 'develop' into widget-backbone 2023-11-12 22:23:18 +08:00
louistiti c8d2e8c985 chore: bump to 1.0.0-beta.10+dev 2023-11-12 22:22:56 +08:00
louistiti e73bd632f5 feat: progress on widget brainstorming 2023-11-12 18:34:09 +08:00
louistiti 2a15434919 Merge branch 'feat-improve-ner-types' into develop 2023-11-12 18:16:37 +08:00
louistiti b2c375861b feat: identify entities from utterance samples for a better prioritization of classifications 2023-11-12 18:14:16 +08:00
Théo LUDWIG ae6fec335d fix(skill/date_time): add follow up utterance samples 2023-07-24 23:00:30 +02:00
louistiti 16302ec6e4 Merge branch 'develop' into feat-improve-ner-types 2023-07-23 11:26:38 +08:00
Louis Grenard 4d03e1bb4e docs(README): add knowledge base LLM scenario 2023-07-23 11:15:23 +08:00
Théo LUDWIG 69ce669b4c feat(tcp server): remove unnecessary data from entity + detect most populated city 2023-07-02 11:09:22 +02:00
Théo LUDWIG c512b422e7 feat(web app): add "Show more" when answer is "too big" 2023-07-01 23:33:41 +02:00
Théo LUDWIG 2ad6541c3e feat(skill/help): helps you get started with Leon 2023-07-01 23:28:55 +02:00
Théo LUDWIG 379326d7c1 feat(bridge/nodejs): simplify leon.setAnswerData 2023-07-01 23:24:29 +02:00
Théo LUDWIG 1359f5d210 feat(bridge/python): simplify leon.set_answer_data 2023-07-01 23:23:34 +02:00
Théo LUDWIG 64858ec6fe feat(tcp server): add Country information to City 2023-07-01 19:01:57 +02:00
Théo LUDWIG 166175192d feat(tcp server): better detect cities thanks to alternate names 2023-07-01 19:00:34 +02:00
Théo LUDWIG 97de1d1c3f fix(skill/date_time): correct time zone with toLocaleString method 2023-07-01 18:24:19 +02:00
louistiti 563792bd0a fix(tcp server): use root path for the time_zones.txt file 2023-06-30 22:35:58 +08:00
Théo LUDWIG 076db4c3eb fix(skill/date_time): determine correctly isDaylightSavingTime 2023-06-30 15:11:17 +02:00
Théo LUDWIG 02e1de8ffa fix: precise units used in time zone data 2023-06-29 23:14:14 +02:00
Théo LUDWIG cc01bd18b2 feat(skill/date_time): time zone 2023-06-29 23:03:03 +02:00
Théo LUDWIG 2478adbaa2 feat(server): add spacy data in entity resolution 2023-06-29 22:33:25 +02:00
Théo LUDWIG 45b177d0fb feat(tcp server): add support for time zone and more city/country data 2023-06-29 22:32:12 +02:00
louistiti f61e4f08a4 feat(web app): import Aurora 2023-06-29 22:18:46 +08:00
Théo LUDWIG c0deafcd69 feat(server): improve NER types 2023-06-29 00:04:37 +02:00
louistiti 0ad8b9e8e5 chore: merge 2023-06-29 00:28:39 +08:00
louistiti eea6b0392d feat(skill/date_time): add new utterance samples 2023-06-29 00:17:29 +08:00
louistiti 9845612c68 Merge branch 'feat/skill-utilities-date-time' into develop 2023-06-28 23:39:25 +08:00
louistiti d46ec1d3d5 Merge branch 'feat/skill-leon-age' into develop 2023-06-28 23:39:15 +08:00
louistiti f1a65f53bc feat(skill/age): add new utterance samples 2023-06-28 23:39:07 +08:00
Théo LUDWIG 1410b72362 chore(skill/date_time): add test folder 2023-06-27 18:35:03 +02:00
Théo LUDWIG e9245b522f fix(skill/date_time): separate current date and current time 2023-06-25 22:46:10 +02:00
Théo LUDWIG 636eb0f139 feat(skill/date_time): days countdown 2023-06-25 12:27:30 +02:00
Théo LUDWIG 8645ef01fd fix: improve types for Node.js skill SDK 2023-06-25 12:08:36 +02:00
Théo LUDWIG 18867bde89 fix(server): improve json schema description for skill config 2023-06-25 12:07:41 +02:00
Théo LUDWIG d061a6c4bf feat(skill/date_time): get current week number of the year 2023-06-24 19:57:47 +02:00
Théo LUDWIG e2ec76275a feat(skill/date_time): get current date and time 2023-06-24 19:30:55 +02:00
Théo LUDWIG 767bace201 feat(skill/age): ask Leon his age 2023-06-24 13:23:19 +02:00
louistiti dbed559799 feat(skill/widget-playground): forecast backbone draft 2023-06-04 17:47:29 +08:00
louistiti 305d9cd581 feat(skill/widget-playground): first widget components draft structure 2023-06-04 17:06:24 +08:00
louistiti 212df695f2 feat(skill/widget-playground): tmp skill to develop widgets 2023-06-04 15:51:35 +08:00
louistiti e70d0a0029 feat(web app): add init messages 2023-05-30 23:52:35 +08:00
louistiti 595fe78679 Merge branch 'python-sdk' into develop 2023-05-29 22:55:36 +08:00
louistiti 69cb6a610f build(bridge/nodejs): bump to 1.0.0 2023-05-29 22:01:32 +08:00
louistiti 10a03d90e3 build(bridge/python): bump to 1.1.0 2023-05-29 22:01:06 +08:00
louistiti 251950384e refactor(server): rename obj to skillAnswer 2023-05-28 12:53:44 +08:00
louistiti 8c91d245e8 refactor(server): remove speech prop from skill output backward compatibility 2023-05-28 12:49:56 +08:00
louistiti df343ce94f fix(skill/akinator): typo ShowNextActionSuggestions to showNextActionSuggestions 2023-05-28 10:12:40 +08:00
louistiti 7c73f435af fix(skill/akinator): disable urllib3 cert warning 2023-05-28 10:07:23 +08:00
louistiti b5ef7242af fix(skill/have_i_been_pwned): use current_entities instead of entities 2023-05-28 09:23:50 +08:00
Divlo 16e1f7a34a chore: remove dead code 2023-05-28 01:32:57 +02:00
Divlo e42a54d593 refactor(skill/akinator): usage of new SDK 2023-05-28 01:10:03 +02:00
Divlo cd3bcd5d6e refactor(server): leon over http with /api/utterance 2023-05-28 00:31:40 +02:00
Divlo 2ea6237b1f chore: remove /api/downloads 2023-05-27 23:53:20 +02:00
Divlo 9782526c42 chore: remove legacy Python bridge/utils 2023-05-27 23:48:39 +02:00
Divlo 3bf7150387 refactor(skill/have_i_been_pwned): usage of new SDK 2023-05-27 23:34:15 +02:00
Divlo c00c85fd4f fix(bridge): better types and network error 2023-05-27 20:29:01 +02:00
Divlo a76d05f68a refactor(skill/product_hunt_trends): usage of new SDK 2023-05-27 20:21:03 +02:00
Divlo f17a4d3a2a refactor(skill/github_trends): usage of new SDK 2023-05-27 18:06:31 +02:00
Divlo 850ea46ec6 style(skill/mbti): add missing space for consistency (oops) 2023-05-27 12:54:16 +02:00
Divlo a540307241 refactor(skill/mbti): usage of new SDK 2023-05-27 12:43:19 +02:00
Divlo e440e4f715 refactor(skill/speed_test): usage of new SDK 2023-05-27 12:00:13 +02:00
louistiti d1fe81ddc6 refactor: modify settings method from isAlreadySet to isSettingSet 2023-05-27 09:47:09 +08:00
louistiti 3648fef5fb refactor(bridge/python): add key to settings.isAlreadySet 2023-05-27 09:00:00 +08:00
louistiti 1f9137bb20 refactor(bridge/nodejs): add key to setting.isAlreadySet 2023-05-27 08:47:24 +08:00
louistiti 2e6abef507 chore: lint 2023-05-27 08:06:11 +08:00
louistiti a55fbcd532 fix: ignore error if skill.json isn't found when getting skill info 2023-05-27 08:05:22 +08:00
Divlo 924317c614 refactor(skill/is_it_down): usage of new SDK 2023-05-27 00:14:51 +02:00
Divlo 0c44916aa2 chore(bridge): add comments (jsdoc/docstring) for settings 2023-05-26 23:50:36 +02:00
Divlo 2a0cc0644e chore: remove youtube_downloader skill 2023-05-26 23:34:37 +02:00
Divlo 4f5b385fd7 chore: rename config.json to settings.json 2023-05-26 23:31:25 +02:00
Divlo 30e405bbe3 feat(bridge/python): add Settings module 2023-05-26 23:03:02 +02:00
Divlo 8c105a043d feat(bridge/nodejs): add Settings module 2023-05-26 23:01:54 +02:00
Divlo 99b5e7ab6d chore: remove synchronization capability 2023-05-26 22:58:26 +02:00
Divlo b9dbc5012c Revert "chore: add __init__.py files to avoid mypy linting error"
This reverts commit 0b16eebfbd.
2023-05-26 10:12:43 +02:00
Divlo 0b16eebfbd chore: add __init__.py files to avoid mypy linting error
Ref: https://github.com/python/mypy/issues/8686#issuecomment-1178977365
2023-05-25 22:56:38 +02:00
Divlo c078505846 refactor(skill/todo_list): usage of new SDK 2023-05-25 22:47:58 +02:00
Divlo 421232a6dc refactor(skills): usage of datetime ISO 8601 string format instead of timestamp 2023-05-25 19:05:51 +02:00
louistiti c62368ddad chore: comments and French punctuation 2023-05-25 08:34:20 +08:00
Divlo f956e1abc6 fix(bridge): memory path always defined 2023-05-25 01:04:28 +02:00
Divlo dc88ac244d perf(skill/guess_the_number): only store one game at a time to avoid increasing the size of memory unnecessarily 2023-05-25 00:38:34 +02:00
Divlo 4cd01a4baf refactor(skill/random_number): usage of new SDK 2023-05-25 00:12:59 +02:00
Divlo 06cda4a1f0 fix(bridge/nodejs): allow memory that stores null value 2023-05-25 00:04:25 +02:00
Divlo dc7615723d fix(bridge/python): allow memory that stores null value 2023-05-24 23:57:44 +02:00
Divlo 14275be5f7 refactor(skill/introduction): usage of new SDK 2023-05-24 23:57:18 +02:00
Divlo 158df2f0f1 refactor(skill/greeting): usage of new SDK 2023-05-24 23:57:05 +02:00
Divlo 6bed516f89 refactor(skill/rochambeau): usage of new SDK 2023-05-24 23:22:43 +02:00
Divlo 7e72928ad6 refactor(skill/guess_the_number): usage of new SDK 2023-05-24 23:10:14 +02:00
louistiti 4a7e77141e refactor: remove Python shebangs 2023-05-24 20:32:43 +08:00
louistiti 25ab60e5a2 feat: add Leon user agent from bridges 2023-05-24 19:53:34 +08:00
Divlo f8e6012cbe fix(bridge/python): add types 2023-05-23 19:50:19 +02:00
louistiti 1c5d2874b0 refactor(bridge/python): add memory comments 2023-05-23 21:37:12 +08:00
louistiti 3449c14d47 feat(bridge/python): functional memory 2023-05-23 21:27:35 +08:00
louistiti 51f57e3255 feat(bridge/python): memory write method 2023-05-23 20:10:48 +08:00
louistiti 7fd4be1248 feat(bridge/python): memory read method 2023-05-23 20:09:09 +08:00
louistiti 3b77d64d4f feat(bridge/python): memory clear method 2023-05-23 20:06:35 +08:00
louistiti ab7e2a9b10 refactor(bridge/nodejs): remove Aurora index file 2023-05-22 22:54:00 +08:00
louistiti b2e4ebf1be feat(bridge/python): support widget answer 2023-05-22 22:17:53 +08:00
louistiti 3c9a210081 feat(bridge/python): leon.answer usage 2023-05-22 21:14:52 +08:00
louistiti 7a9068283b refactor(bridge/python): new bridge main file 2023-05-22 20:32:36 +08:00
louistiti 66dc0aab0f feat(skill/timekeeper): boilerplate 2023-05-22 20:18:13 +08:00
Divlo 91e48af263 feat(bridge/python): add Network module (WIP) 2023-05-21 23:20:58 +02:00
louistiti 3a230633d8 feat(bridge/python): memory kick off 2023-05-21 19:12:30 +08:00
louistiti 6c3a03d16a feat(bridge/python): add widget class 2023-05-21 19:03:54 +08:00
louistiti 8a60b3d0d3 Merge branch 'python-sdk-fixes' into python-sdk 2023-05-21 18:51:42 +08:00
Divlo cb3d3bf5a8 fix(bridge/nodejs): add lang to action params 2023-05-20 20:34:12 +02:00
Divlo f3257ad7b0 style(bridge/python): format with autopep8 2023-05-20 20:33:37 +02:00
Divlo cb29848f45 fix(bridge/python): better typings 2023-05-20 19:49:56 +02:00
Divlo ebaa3c4f9b fix(bridge/python): inconsistent indentation TabError 2023-05-20 19:49:07 +02:00
louistiti de17719537 feat(bridge/python): typing (WIP) 2023-05-20 23:28:44 +08:00
louistiti 47d5a48ac9 fix(bridge/python): import INTENT_OBJECT to leon 2023-05-20 23:17:42 +08:00
louistiti e8ceed62eb feat(bridge/python): leon.answer 2023-05-20 23:16:50 +08:00
louistiti bbc1f8a79c feat(bridge/python): leon.set_answer_data 2023-05-20 23:09:45 +08:00
louistiti 289efb5610 feat(bridge/python): leon.get_src_config 2023-05-20 22:49:17 +08:00
louistiti 05a4b2c773 feat(bridge/python): Leon singleton 2023-05-20 22:42:30 +08:00
louistiti a32ad86342 feat(bridge/python): add constants 2023-05-20 22:40:38 +08:00
louistiti a2eacc3930 fix(server): add lang back to the intent object till Python bridge is updated 2023-05-19 22:09:01 +08:00
louistiti a8c079fd5c feat: provide built-in context data to skills 2023-05-19 21:47:23 +08:00
louistiti b389bdd8c6 feat(server): provide sentiment analysis to NLU result 2023-05-19 21:40:24 +08:00
louistiti 750d1de8b4 chore: merge branch 'skill-text-n-speech-difference' into develop 2023-05-18 21:14:09 +08:00
louistiti d295105fa6 chore: disable import/order ESLint rule for skills 2023-05-18 21:06:04 +08:00
louistiti e2899c8d9a refactor(skill/good_bye): rollback as speech/text answer is only supported in logic skills 2023-05-18 20:38:26 +08:00
louistiti 7f9b60a6cd feat(server): differentiate skill text answer from speech answer (WIP) 2023-05-18 00:00:40 +08:00
louistiti 9e77953976 refactor(bridge/nodejs): use AnswerConfig type from core schema 2023-05-17 22:21:11 +08:00
louistiti cb6462b749 feat: define new skill answer format 2023-05-17 18:31:39 +08:00
Louis Grenard 07a3b1701d docs: update README.md 2023-05-16 23:14:02 +08:00
Louis Grenard f6300a3fb8 docs: update README.md 2023-05-16 23:14:02 +08:00
louistiti 46299ef4eb Merge branch 'skill-widget-ideas' into develop 2023-05-16 23:08:00 +08:00
louistiti 259dc53213 Merge branch 'skill-widget-ideas' into develop 2023-05-16 23:08:00 +08:00
louistiti 51152a0fe3 refactor(bridge/nodejs): protected memory constructor 2023-05-16 23:07:12 +08:00
louistiti 01305af669 refactor(bridge/nodejs): protected memory constructor 2023-05-16 23:07:12 +08:00
Divlo 5539130dd9 fix: typo missing "GB" for Free RAM 2023-05-15 23:42:27 +02:00
Divlo efd1061f30 fix: typo missing "GB" for Free RAM 2023-05-15 23:42:27 +02:00
Divlo f6a501d4e1 fix(bridge/nodejs): improve Memory types with external skill memory 2023-05-15 22:58:40 +02:00
Divlo 839c7bfc3c fix(bridge/nodejs): improve Memory types with external skill memory 2023-05-15 22:58:40 +02:00
Divlo d3ba85cb36 feat(bridge/nodejs): add Widget abstract class 2023-05-15 21:18:54 +02:00
Divlo 623039415a feat(bridge/nodejs): add Widget abstract class 2023-05-15 21:18:54 +02:00
louistiti 7a75c985e0 Merge branch 'skill-widget-poc' into develop 2023-05-15 21:31:02 +08:00
louistiti 0f2a579a66 refactor(web app): remove original app rendering 2023-05-15 21:30:42 +08:00
louistiti 63573083fa feat(web app): render widget 2023-05-15 21:25:20 +08:00
louistiti 34aa188643 feat: skill -> core -> client widget support 2023-05-15 01:13:18 +08:00
louistiti 76dfe72f5f feat(web app): kick off Aurora structure 2023-05-15 00:00:21 +08:00
louistiti 7a31158497 feat(web app): set up React 2023-05-14 23:43:42 +08:00
louistiti 96145bb2f7 feat(web app): add vite React plugin 2023-05-14 23:23:17 +08:00
louistiti 17cb808aab chore: install required npm deps 2023-05-14 23:22:01 +08:00
louistiti b757d2d4ae chore: upgrade vite to latest 2023-05-14 23:20:41 +08:00
louistiti ce001c2e65 feat(bridge/nodejs): support read memory from other skills 2023-05-14 21:00:52 +08:00
louistiti a3b8c40714 refactor(scripts): unify skills setup over one iteration only 2023-05-14 12:10:55 +08:00
louistiti 0283878a90 refactor(bridge/nodejs): force run to be the skill action entry point 2023-05-14 09:15:05 +08:00
louistiti 3ed19bd6d0 Merge branch 'nodejs-bridge-memory' into develop 2023-05-14 08:58:28 +08:00
louistiti c163f5971c feat(bridge/nodejs): sync return new memory value on write 2023-05-14 08:58:19 +08:00
louistiti 6a01e1e743 Merge branch 'nodejs-bridge-improvements' into nodejs-bridge-memory 2023-05-14 08:52:03 +08:00
louistiti b06eab9107 style(bridge/nodejs): memory exception/error renaming 2023-05-14 08:51:52 +08:00
Divlo 12ce47b937 fix(bridge/nodejs): usage of getleon.ai to try network available 2023-05-14 00:39:56 +02:00
Divlo c8fc0068d1 feat(bridge/nodejs): improvements to memory 2023-05-14 00:39:30 +02:00
louistiti e32bf370db Merge branch 'nodejs-bridge-memory' into develop 2023-05-14 00:11:10 +08:00
louistiti 9ef4f234b8 Merge branch 'develop' into nodejs-bridge-memory 2023-05-14 00:08:18 +08:00
louistiti 6d2292f508 fix(server): pre-check add process.cwd() to all constant paths 2023-05-14 00:06:43 +08:00
louistiti b897ae160f feat(bridge/nodejs): simple get / set memory 2023-05-13 23:52:54 +08:00
louistiti a51d92bf08 refactor(bridge/nodejs): remove Prisma 2023-05-13 19:04:54 +08:00
louistiti 6d495cf43c refactor(scripts): explicit Node.js bridge npm packages install 2023-05-13 00:30:15 +08:00
louistiti d6933a9e35 refactor(bridge/nodejs): remove lowdb and tiny custom ORM in favor of Prisma 2023-05-13 00:26:51 +08:00
louistiti 127a10f8ed feat(scripts): install Node.js bridge npm packages on setup 2023-05-12 23:54:57 +08:00
louistiti ef223a2901 feat(bridge/nodejs): make use of Prisma from skill action (PoC) 2023-05-11 23:39:17 +08:00
louistiti 9a06c64a5d feat(bridge/nodejs): Prisma SQLite setup 2023-05-11 23:26:42 +08:00
louistiti ad5edb5ad5 feat(bridge/nodejs): support nested props find in memory 2023-05-11 22:30:22 +08:00
louistiti ee0b080522 feat(bridge/nodejs): support updateOne memory method 2023-05-11 21:50:29 +08:00
louistiti be04b10645 feat(bridge/nodejs): support findMany memory method 2023-05-11 21:41:51 +08:00
louistiti ab62a65e57 feat(bridge/nodejs): support findOne memory method 2023-05-11 21:40:22 +08:00
louistiti 99ac5f18c8 feat(bridge/nodejs): give public access to Low instance 2023-05-11 21:21:26 +08:00
louistiti 87a7077854 refactor(bridge/nodejs): rename create with createOne 2023-05-11 21:04:18 +08:00
louistiti af2a124165 refactor(bridge/nodejs): rename insert to create 2023-05-11 20:59:26 +08:00
louistiti 8e55c481d4 feat(bridge/nodejs): support insertMany memory method 2023-05-11 20:51:19 +08:00
louistiti d7b814761f feat(bridge/nodejs): tiny ORM kick off 2023-05-11 20:49:40 +08:00
louistiti 4dde49e545 feat(bridge/nodejs): memory database pattern (WIP) 2023-05-10 23:29:41 +08:00
Divlo 34b29d0e61 fix(bridge/nodejs): memory ESM dynamic imports 2023-05-10 00:45:21 +02:00
louistiti 954126315f refactor(bridge/nodejs): TSConfig ESM NCC 2023-05-09 21:48:07 +08:00
louistiti e240a2db3c feat(bridge/nodejs): memory ESM debugging (WIP) 2023-05-09 21:39:18 +08:00
louistiti 4abb68c1b3 Merge branch 'nodejs-bridge' into develop 2023-05-08 22:05:42 +08:00
louistiti 3ea1a3666b feat(bridge/nodejs): add isNetworkAvailable network method 2023-05-08 22:03:30 +08:00
louistiti d3e0810298 fix(bridge/nodejs): temporize data buffer on output 2023-05-08 22:01:46 +08:00
louistiti ef6d46cf8e refactor(scripts): remove cmd output on install Node.js skills packages 2023-05-08 21:57:41 +08:00
louistiti e65ecd5b67 fix(scripts): install Node.js skills packages timestamp comparison 2023-05-08 21:45:06 +08:00
louistiti 5946a00427 feat(scripts): skill package install/uninstall package script 2023-05-08 21:35:14 +08:00
louistiti 6b239ae38b style(scripts): fix linting 2023-05-08 21:24:26 +08:00
louistiti 224158812f feat(scripts): install Node.js skills packages 2023-05-08 21:23:33 +08:00
Divlo ee9794cd9f Revert "feat(bridge/nodejs): add leon.getVersions"
This reverts commit ec819e1765.
2023-05-08 10:58:31 +02:00
Divlo ad497d36c3 style: fix linting 2023-05-07 21:44:55 +02:00
Divlo 5eb62ddcf5 chore: add leon-nodejs-bridge as local dependency 2023-05-07 21:43:03 +02:00
Divlo ec819e1765 feat(bridge/nodejs): add leon.getVersions 2023-05-07 21:38:09 +02:00
louistiti 2c2f49290a Merge branch 'nodejs-bridge' into develop 2023-05-07 21:28:28 +08:00
louistiti f936652007 Merge branch 'nodejs-bridge-improvements' into nodejs-bridge 2023-05-07 21:26:12 +08:00
Divlo 950985ca86 feat(bridge/nodejs): finish network implementation 2023-05-07 15:07:20 +02:00
louistiti 8147d8423b feat(scripts): add Node.js bridge on check script 2023-05-07 20:09:37 +08:00
louistiti 3f556494c2 Merge branch 'nodejs-bridge-improvements' into nodejs-bridge 2023-05-07 19:07:05 +08:00
Divlo 426c816ca4 build(bridge/nodejs): avoid installing dependencies each time we build 2023-05-07 01:14:44 +02:00
louistiti dd0eab51b6 Merge branch 'HEAD' into nodejs-bridge 2023-05-06 22:47:36 +08:00
Divlo 07e253f663 build(bridge/nodejs): usage of ncc 2023-05-06 15:38:49 +02:00
Divlo de08807f1a feat(bridge/nodejs): add Network module (WIP) 2023-05-06 14:21:24 +02:00
Divlo 2cb030f47b fix(bridge/nodejs): usage of types from server/core/brain/types 2023-05-06 14:03:56 +02:00
Divlo 673cf0426f fix(bridge/nodejs): build error 2023-05-06 13:55:43 +02:00
louistiti e89b5b0ea3 refactor(bridge/nodejs): isolate types from bridge 2023-05-06 18:26:22 +08:00
Divlo 6b76e6a102 fix(bridge/nodejs): stricter leon.getSRCConfig types 2023-05-05 20:24:01 +02:00
Divlo 1625aaf3cd fix(bridge/nodejs): typings improvements 2023-05-05 20:00:51 +02:00
louistiti b65cfb70d6 feat(bridge/nodejs): final answer bridge 2023-05-05 21:21:27 +08:00
louistiti 89a6c04a1e refactor(bridge/nodejs): new answer types (WIP) 2023-05-05 00:34:16 +08:00
louistiti e42655a5ff refactor(server): remove skill answer type complexity 2023-05-04 22:34:29 +08:00
louistiti c9678fe34f refactor(bridge/python): flush standard output every time 2023-05-04 21:40:11 +08:00
louistiti 8349e41205 feat(bridge/nodejs): answers 2023-05-03 23:28:12 +08:00
louistiti 759e67ac40 fix(bridge/nodejs): SDK mapping 2023-05-03 16:02:57 +08:00
louistiti fc1fa56eab Merge branch 'develop' into nodejs-bridge 2023-05-03 14:54:51 +08:00
louistiti 8f5bd3a9a5 feat: add free RAM check 2023-05-03 14:54:23 +08:00
louistiti a836a7cc8c feat(bridge/nodejs): resolve SDK mapping 2023-05-03 09:27:23 +08:00
louistiti 2df22770e0 refactor(bridge/nodejs): SDK mapping 2023-05-03 08:39:06 +08:00
louistiti 9b839d3e66 feat(bridge/nodejs): first draft 2023-05-02 23:53:41 +08:00
louistiti 2e3796642d refactor(server): send heartbeat every 6 hours instead 2023-05-02 16:43:04 +08:00
louistiti b027905ed0 refactor(bridge/nodejs): package.json new dist entry point path 2023-05-01 23:01:46 +08:00
louistiti 4c9dfe667b build(bridge/nodejs): bump 0.0.1-alpha.0 2023-05-01 22:49:32 +08:00
louistiti ed215feb81 refactor(scripts): Node.js bridge bin dist 2023-05-01 22:48:31 +08:00
louistiti cd82a3a11b chore: bump to 1.0.0-beta.9+dev 2023-05-01 10:23:19 +08:00
louistiti b7a4f69565 build: release 1.0.0-beta.8 2023-05-01 10:09:29 +08:00
louistiti 7b8a324658 fix(server): catch error on start for telemetry client 2023-05-01 01:54:19 +08:00
louistiti 59cfded2bb feat(server): send Node.js bridge version to telemetry 2023-05-01 01:26:28 +08:00
louistiti 8dc8c05d7d refactor(scripts): add bin level for Node.js bridge 2023-05-01 01:13:19 +08:00
louistiti 0e4ec4fb97 refactor(scripts): exclude current Node.js bridge archive from new archive 2023-05-01 00:49:35 +08:00
louistiti bb00677568 feat(scripts): add build for Node.js bridge 2023-05-01 00:36:03 +08:00
louistiti 308b63f576 fix(scripts): tmp setup Node.js bridge removal 2023-04-30 23:49:21 +08:00
louistiti 40819e8e17 feat(bridge/nodejs): release process 2023-04-30 23:39:39 +08:00
louistiti 0fba50905f feat(bridge/nodejs): entry point build 2023-04-30 21:36:07 +08:00
louistiti 419bfe3d78 refactor(scripts): commit-msg scopes 2023-04-30 20:35:56 +08:00
louistiti 1847248f12 feat: add instanceID on check script 2023-04-30 10:45:51 +08:00
louistiti eed4a9597c refactor(server): get Node.js version from process.versions.node 2023-04-30 10:32:01 +08:00
louistiti c3452d2170 feat(server): add minimum RAM requirement on pre-check 2023-04-30 10:31:18 +08:00
louistiti 0a14567776 refactor: round up total RAM on check script 2023-04-30 10:13:41 +08:00
louistiti 71573b78d1 refactor: instance ID log on postinstall 2023-04-29 21:04:29 +08:00
louistiti 722dba875b feat: do not download binaries if the latest version is already installed 2023-04-29 20:58:10 +08:00
louistiti 593419639e refactor: naming 2023-04-27 20:24:16 +08:00
louistiti 8b2f06e305 feat(server): bootstrap Node.js bridge entry point 2023-04-27 20:16:08 +08:00
louistiti 12e4b7bccf ci: use ubuntu-20.04 for the draft-release job 2023-04-26 23:00:01 +08:00
louistiti 63a6c2d161 ci: force ubuntu-20.04 and npm install as there is no package-lock.json anymore 2023-04-26 22:49:54 +08:00
louistiti f0e898e3c0 ci: remove npm caching 2023-04-26 22:45:34 +08:00
louistiti 10bb4af4dc build: bump Python bridge to 1.0.1 2023-04-26 22:35:48 +08:00
louistiti 1af3fc2011 style: better info message on prompt false for pre release binaries 2023-04-26 22:34:47 +08:00
louistiti 781cb072a3 fix: use version.py to prompt version bump confirmation on pre-release binaries 2023-04-26 22:33:10 +08:00
louistiti 73fe21f02e Merge branch 'fix-python-bridge-requests-certs' into develop 2023-04-26 22:24:44 +08:00
louistiti 0947bd7877 fix(server): close error log file handler 2023-04-26 21:31:12 +08:00
Divlo 07d2a41ecb fix(python bridge): include requests.certs file 2023-04-23 22:32:43 +02:00
louistiti 9a66b677e0 feat(server): sanitize current OS profile session name on telemetry error 2023-04-23 22:14:06 +08:00
louistiti fe580cfb92 feat: sanitize current OS profile session name for better privacy 2023-04-23 22:12:19 +08:00
louistiti 075f4458a0 feat(server): support isGitpod telemetry 2023-04-22 23:51:08 +08:00
louistiti 094b1218e6 refactor(server): replace HAS_LOGGER by IS_TELEMETRY_ENABLED for the Telemetry service 2023-04-18 20:09:42 +08:00
louistiti b16475766a fix(server): create errors.log if it does not exist before parsing logs 2023-04-18 09:21:05 +08:00
louistiti e5fdeba50b fix(server): ensure the errors.log file exist before reporting errors 2023-04-18 09:05:35 +08:00
louistiti 12b0fe6525 Merge branch 'telemetry' into develop 2023-04-16 16:46:58 +08:00
louistiti 302e1e11e0 feat(server): switch telemetry to production mode 2023-04-16 16:46:51 +08:00
louistiti 8d5bca0d2b refactor(server): handle telemetry on NLU edge cases 2023-04-16 15:36:59 +08:00
louistiti 994cca7bf4 refactor: do not call any core singletons during setup 2023-04-15 00:32:28 +08:00
louistiti a03afa78be refactor(server): telemetry utterance less parameters 2023-04-13 22:44:28 +08:00
louistiti a1f93a6922 fix(server): await for logical skill execution 2023-04-13 22:20:06 +08:00
louistiti 2678f6f04a feat(server): add isProduction data to telemetry 2023-04-13 00:41:02 +08:00
louistiti 03acb35e84 feat(server): complete telemetry client 2023-04-13 00:11:23 +08:00
louistiti 337854ab02 feat: kick off telemetry client 2023-04-12 00:25:40 +08:00
louistiti 19c569b76a Merge branch 'develop' into telemetry 2023-04-11 22:39:50 +08:00
louistiti 5b4cd9da81 Merge branch 'feat/better-json-schemas-developer-experience' into develop 2023-04-11 20:20:07 +08:00
louistiti 40069ab5f0 feat(server): kick off telemetry 2023-04-10 22:35:37 +08:00
Divlo 8c89cbf43c Merge branch 'develop' into feat/better-json-schemas-developer-experience 2023-04-05 00:13:34 +02:00
louistiti 5061cac591 Merge branch 'http-server-refactoring' into develop 2023-04-04 23:09:49 +08:00
louistiti f660506d98 chore(server): add TODO for HTTP API skills routes 2023-04-04 23:08:54 +08:00
louistiti 25f81d3c3c Merge branch 'refactor/fastify-api' into http-server-refactoring 2023-04-04 23:03:03 +08:00
Divlo d261967920 refactor(server): http-server with over http enabled 2023-04-03 20:58:02 +02:00
Divlo 907fb1a129 Merge branch 'http-server-refactoring' into refactor/fastify-api 2023-04-03 19:19:21 +02:00
Divlo 7d63108e8d fix(server): async hooks http-server 2023-04-03 19:12:54 +02:00
louistiti 274d7d52fd refactor(server): remove legacy server/src/tts/tts.js 2023-04-03 23:26:52 +08:00
louistiti d815ab8bff refactor(server): socket server interfaces 2023-04-03 23:24:54 +08:00
louistiti 35da3a388a refactor(server): socket server typing 2023-04-03 23:22:07 +08:00
Divlo a29296c612 refactor(server): api and plugins for http-server 2023-04-03 17:20:00 +02:00
louistiti b93180a822 fix(server): ASR not getting ready 2023-04-03 23:04:18 +08:00
louistiti 9fa0c2e1ba chore: re-enable linter on commit 2023-04-03 22:29:21 +08:00
louistiti 2115054de6 Merge branch 'refactor/fs-promises' into http-server-refactoring 2023-04-03 21:59:20 +08:00
louistiti f167f64cfb fix: simultaneous skills execution; Akinator new step 0 2023-04-03 21:55:36 +08:00
Divlo abc6b21df2 fix: make cleanActiveContext synchronous 2023-04-03 08:33:45 +02:00
Divlo bd66bb5cb7 refactor: usage of fs.promises 2023-04-02 20:34:50 +02:00
Divlo c49f931da4 style: fix linting 2023-04-02 19:18:15 +02:00
louistiti 070f0e1469 refactor(server): change HTTP server props accessiblity 2023-04-02 19:11:37 +08:00
louistiti bf4806c987 refactor(server): finish NLU typing 2023-04-02 18:42:00 +08:00
louistiti 37e5ca0e87 refactor(server): simpler error handler from the NLU action execution 2023-04-02 18:04:25 +08:00
louistiti a6011e3cc6 refactor(server): NLP.js process raw type 2023-04-02 18:00:10 +08:00
louistiti 44882129a7 refactor(server): NLU default values 2023-04-02 16:56:53 +08:00
louistiti 8282c37a5a refactor(server): slot filling 2023-03-27 22:23:10 +08:00
louistiti 26ff4520c8 refactor(server): action loop 2023-03-27 22:09:32 +08:00
louistiti e2f0df2cb6 refactor(server): unify join path 2023-03-27 21:51:40 +08:00
louistiti 7259ceda59 refactor(server): unify skill config getter 2023-03-27 21:42:33 +08:00
louistiti 7f99372130 Merge branch 'develop' into http-server-refactoring 2023-03-26 18:52:19 +08:00
Louis Grenard 0cbd438a34 docs: question LLMs to large language models 2023-03-26 10:23:11 +08:00
Louis Grenard 71b30a7f97 docs: add current state to the README 2023-03-26 10:21:22 +08:00
louistiti bfdc60fa65 refactor(server): slot filling 2023-03-22 23:54:58 +08:00
louistiti 99af936803 refactor(server): action loop 2023-03-22 23:34:39 +08:00
louistiti d41e960373 refactor(server): brain types 2023-03-22 22:31:42 +08:00
louistiti ae04ba369c refactor(server): NLP conversation 2023-03-22 22:19:29 +08:00
louistiti afff309d43 refactor(server): skillConfigPath naming unification 2023-03-22 22:08:35 +08:00
louistiti 16c25c9036 chore: upgrade async to latest 2023-03-20 23:46:27 +08:00
louistiti cd551197ea chore: upgrade Fastify to latest 2023-03-20 23:37:55 +08:00
louistiti f6077d58f1 chore: upgrade to TypeScript 5+ 2023-03-20 23:35:07 +08:00
louistiti eb026cb74a refactor(server): move some NER methods from NLU to NER 2023-03-20 23:15:26 +08:00
louistiti 7d6698df17 refactor(server): NLU method accessibility 2023-03-20 22:45:11 +08:00
louistiti a215fc8770 refactor(server): default NLU result 2023-03-20 22:35:44 +08:00
louistiti a8e3fb8b87 refactor(server): NER 2023-03-20 22:04:04 +08:00
louistiti 6820501da6 refactor(server): remove JavaScript NER and NLU 2023-03-20 21:22:33 +08:00
louistiti b51bf4b1c2 refactor(server): model loader error handling 2023-03-20 20:52:42 +08:00
louistiti 5369da1734 refactor(server): models loader 2023-03-18 10:47:44 +08:00
louistiti d5d8d56124 refactor(server): brain done 2023-03-15 22:30:22 +08:00
louistiti fbcc089e2b refactor(server): brain options 2023-03-07 23:22:35 +08:00
louistiti 76dacb4f5e refactor(server): brain logic action skill execution 2023-03-07 22:20:40 +08:00
louistiti 24ec0f0927 refactor(server): start brain refactoring 2023-03-05 23:07:34 +08:00
louistiti b8aac89c4d refactor(server): brain NLU result renaming 2023-03-04 06:48:04 +08:00
louistiti 72a4f787a3 refactor(server): brain typing done 2023-02-25 09:32:11 +08:00
louistiti 137032b1c0 refactor(server): fix brain answers types 2023-02-25 08:46:23 +08:00
louistiti 5011d906e7 chore: more comment and remove socket server legacy comments 2023-02-21 00:15:42 +08:00
louistiti 35d171e421 chore: comment for what to do next 2023-02-21 00:11:32 +08:00
louistiti 20e7a98241 refactor(server): continue brain typing 2023-02-21 00:00:14 +08:00
louistiti abf811f2e4 refactor(server): handle skill result in brain 2023-02-20 22:58:15 +08:00
louistiti 4d7c49e1ee refactor(server): load models and init core instances only once 2023-02-20 21:56:22 +08:00
louistiti e182da0048 refactor(server): remove unecessary socket connections 2023-02-20 20:26:38 +08:00
louistiti f81255aa20 refactor(server): better STT/TTS logs 2023-02-20 20:31:42 +08:00
louistiti 7aaca4dfc8 refactor(server): only keep types file at the first-node level 2023-02-20 00:30:17 +08:00
louistiti 4a74ee030a refactor(server): BrainProcessResult action; nextAction type to skill config schema action [string] 2023-02-20 00:09:38 +08:00
louistiti 7c76e538ab refactor(server): define BrainProcessResult and refactor schema types naming 2023-02-20 00:07:42 +08:00
louistiti 87ed70d313 refactor(server): define NLUSlot 2023-02-19 23:15:34 +08:00
louistiti 98bb70bee6 refactor(server): define SkillOutputType 2023-02-19 20:56:35 +08:00
louistiti a77f0e2473 refactor(server): implement all NER entity types 2023-02-19 20:48:48 +08:00
louistiti 03b128a544 chore: new ESLint rules for TypeScript 2023-02-19 00:02:15 +08:00
louistiti 9c6a60f92c refactor(server): set SkillConfig actions type in brain 2023-02-18 23:49:10 +08:00
louistiti 311923255e fix(server): fail when first execute a dialog action 2023-02-18 19:51:56 +08:00
louistiti cb77b4fc95 refactor(server): get correct audio duration from TTS 2023-02-18 19:16:26 +08:00
louistiti 4883d7723b refactor(server): synthesizers and parsers debug (tmp) 2023-02-13 23:57:29 +08:00
louistiti eb72a61bad refactor(server): brain tmp 2023-02-12 23:21:19 +08:00
louistiti 6dfeb6480f chore: add save-exact npm option to install exact packages version 2023-02-11 19:35:15 +08:00
louistiti 51f9a29679 chore: lock all deps 2023-02-11 11:36:08 +08:00
louistiti d51bf36566 refactor(server): NLU and brain kick off (tmp) 2023-02-10 22:18:56 +08:00
louistiti 9c9f944350 refactor(server): switch from brain instance within NLU to singleton brain 2023-02-09 21:15:49 +08:00
louistiti 7b557da549 refactor(server): NLP.js TS declarations + NLU kick off 2023-02-09 21:01:33 +08:00
louistiti 849749b900 refactor(server): add lang to TTS init 2023-02-07 22:41:02 +08:00
louistiti 528da32d03 refactor(server): STT parser abstract class 2023-02-07 22:36:59 +08:00
louistiti 9ef7476267 refactor(server): Watson synthesizer + synthesizer abstract class 2023-02-07 22:21:42 +08:00
louistiti 0f897942fa refactor(server): remove already-refactored synthesizers 2023-02-07 21:55:14 +08:00
louistiti 885f3738fc refactor(server): TTS Google Cloud synthesizer 2023-02-07 21:35:27 +08:00
louistiti ab0d88accf refactor(server): add STT parser parent class 2023-02-07 21:30:47 +08:00
louistiti 1146322196 refactor(server): TTS Flite synthesizer + synthesizer parent class 2023-02-07 21:26:14 +08:00
louistiti 157e28a063 Merge remote-tracking branch 'origin/develop' into http-server-refactoring 2023-02-03 00:18:56 +08:00
louistiti c8bc9ecbb0 refactor(server): HTTP server; brain entries; STT parsers; TTS synthesizers (WIP) 2023-02-03 00:14:23 +08:00
Louis Grenard 18ba094647 docs: add sponsor to README.md 2023-01-31 23:22:31 +08:00
Divlo 31e44cde37 fix(server): improve schemas by adding descriptions 2023-01-06 22:20:55 +01:00
Divlo 248dbb84f0 chore: add $schema property to all JSON files 2023-01-06 21:48:35 +01:00
Divlo 609fb676e4 feat(server): pre-check validate $schema property 2023-01-06 21:48:14 +01:00
Divlo 5d866664b2 fix(server): remove additionalProperties in schemas to allow $schema property 2023-01-06 21:18:27 +01:00
Divlo ba09ef10b1 feat: add generate:json-schemas script 2023-01-06 21:18:19 +01:00
louistiti 19ce6eb9c2 refactor(server): socket server and brain (WIP) 2022-11-20 23:21:06 +08:00
louistiti 934689ecf7 chore: merge branch 'develop' into http-server-refactoring 2022-11-19 21:15:35 +08:00
louistiti 2f56a14d68 chore: delete package-lock.json file due to @ffmpeg-installer/ffmpeg optionalDependencies binaries 2022-11-19 21:14:36 +08:00
louistiti cc05ce3d76 chore: format pre-check 2022-11-19 21:13:00 +08:00
louistiti 5959b43e0a chore: upgrade TypeScript to latest 2022-11-19 21:12:43 +08:00
louistiti b9a6ee08fe refactor(server): split socket server (WIP) 2022-11-19 20:57:45 +08:00
louistiti b1739bbe6b Merge branch 'develop' into http-server-refactoring 2022-11-14 23:57:41 +08:00
louistiti cad6d7f725 Merge branch 'feat/add-typebox-ajv' into develop 2022-11-14 23:56:08 +08:00
louistiti a08ddb2e26 Merge branch 'develop' into feat/add-typebox-ajv 2022-11-14 23:56:03 +08:00
louistiti c7aa84f9c4 docs: remove sponsor 2022-11-14 23:50:58 +08:00
louistiti ec10030951 refactor: modify voice config samples default values 2022-11-14 23:49:44 +08:00
louistiti b298667e3d Merge branch 'docs/fix-contributing-python-environment' into develop 2022-11-14 23:41:13 +08:00
louistiti 69e90c3b5f refactor(server): HTTP server and structure (wip) 2022-11-14 00:49:24 +08:00
Divlo 2ada7f2efa docs: make clear that commands should be run on Ubuntu in CONTRIBUTING to set up the Python Environment 2022-11-13 13:41:51 +01:00
Divlo 28c15885fd fix: improve error display in pre-check 2022-11-13 13:36:54 +01:00
Divlo 194a9b1bbb fix: add http_api property to skill config schema
http_api is used by `skills/news/github_trends/config/en.json`.
2022-11-13 13:08:32 +01:00
Divlo 4ce9676319 fix: include voice configuration sample schemas 2022-11-13 13:02:51 +01:00
Divlo fb75b40fb6 feat: validate JSON Schemas with AJV 2022-11-13 13:00:15 +01:00
Divlo d973ab4318 chore: delete schemas.ts files outside server 2022-11-13 12:48:43 +01:00
Divlo f8b08f38b1 fix: stricter JSON Schemas
- Type.Strict()
- Type.Object({ additionalProperties: false })
- Type.String({ format: 'email' | 'uri' })
2022-11-13 12:46:31 +01:00
louistiti b3b10e326f refactor(server): prepare upcoming core singletons registration 2022-11-13 01:12:20 +08:00
louistiti efe865a4c5 refactor(server): reorganize TCP client accessors 2022-11-13 00:40:14 +08:00
louistiti a37ac96411 refactor(server): protect TCP client from mutability 2022-11-13 00:16:53 +08:00
louistiti 8a16a3d97e refactor(server): LEON_NODE_ENV constant 2022-11-12 23:20:48 +08:00
louistiti 3d9d9496b7 fix(server): reset connection state and connection counter 2022-11-12 23:09:22 +08:00
louistiti 862112ed5f refactor(server): TCP client connect method 2022-11-12 22:51:47 +08:00
louistiti ea76739d88 refactor(server): TCP client to singleton 2022-11-12 22:31:49 +08:00
louistiti c53feba8f5 chore: latest package-lock.json 2022-11-12 10:00:22 +08:00
louistiti 62d511f967 chore: merge 2022-11-12 09:48:14 +08:00
louistiti 664359158e chore: merge 2022-11-12 09:46:50 +08:00
louistiti 8ecde83b89 refactor(server): TCP client to TypeScript 2022-11-11 23:32:33 +08:00
louistiti 420f87daca docs: add contributing guide for the Python bridge and TCP server 2022-11-11 22:54:28 +08:00
louistiti c722050aec refactor: add types to schemas object on pre-checking 2022-11-11 22:27:47 +08:00
louistiti c434b550a5 Merge branch 'feat/add-typebox-ajv' into develop 2022-11-11 21:50:55 +08:00
louistiti 06a2adf62b feat: add pre-checking for all JSON configs 2022-11-11 21:43:24 +08:00
louistiti bb0cf69659 feat: add pre-checking for all JSON configs 2022-11-11 11:43:24 +08:00
louistiti e50fadd142 Merge branch 'develop' into feat/add-typebox-ajv 2022-11-08 20:59:25 +08:00
louistiti 327cbff184 Merge branch 'develop' into feat/add-typebox-ajv 2022-11-08 20:59:25 +08:00
louistiti 62853a340f feat: add total RAM data to the checking script 2022-11-08 20:10:46 +08:00
louistiti 86852a8cac feat: add total RAM data to the checking script 2022-11-08 20:10:46 +08:00
louistiti efc94a2ac3 Merge branch 'develop' into feat/add-typebox-ajv 2022-11-06 23:13:49 +08:00
louistiti fd4f429b86 Merge branch 'develop' into feat/add-typebox-ajv 2022-11-06 23:13:49 +08:00
louistiti f5404920fa Merge branch 'develop' into feat/add-typebox-ajv 2022-11-06 23:13:49 +08:00
louistiti a0d8c7251c refactor: add full intent object path on skill execution during checking 2022-11-06 22:25:39 +08:00
louistiti 303ebea3f3 refactor: add full intent object path on skill execution during checking 2022-11-06 22:25:39 +08:00
louistiti c38012afcf refactor: add full intent object path on skill execution during checking 2022-11-06 22:25:39 +08:00
louistiti becac3b0f6 fix(server): Python bridge fails to execute on Windows intent object absolute path because of whitespace 2022-11-06 22:18:09 +08:00
louistiti 0245712e24 fix(server): Python bridge fails to execute on Windows intent object absolute path because of whitespace 2022-11-06 22:18:09 +08:00
louistiti 4b003a852e fix(server): Python bridge fails to execute on Windows intent object absolute path because of whitespace 2022-11-06 22:18:09 +08:00
louistiti ddf389ffd1 chore: add Python bridge npm script 2022-11-06 21:57:04 +08:00
louistiti 1d59b0a774 chore: add Python bridge npm script 2022-11-06 21:57:04 +08:00
louistiti 74582899a2 chore: add Python bridge npm script 2022-11-06 21:57:04 +08:00
louistiti 8a91dcb85d refactor(web app): minor style improvements 2022-11-05 23:33:15 +08:00
louistiti 8fbc4bb23f refactor(web app): minor style improvements 2022-11-05 23:33:15 +08:00
louistiti 61d31d9b52 refactor(web app): minor style improvements 2022-11-05 23:33:15 +08:00
louistiti a81e536fd5 refactor(web app): adapt new Vite config 2022-11-05 23:17:18 +08:00
louistiti 25fdaeeab2 refactor(web app): adapt new Vite config 2022-11-05 23:17:18 +08:00
louistiti c4885cb324 refactor(web app): adapt new Vite config 2022-11-05 23:17:18 +08:00
Divlo 71e0f1933c refactor: domain, skill-config and skill in skills/schemas.ts 2022-11-01 21:51:19 +01:00
Divlo 65246dc7cd refactor: domain, skill-config and skill in skills/schemas.ts 2022-11-01 21:51:19 +01:00
Divlo 32fd041495 refactor: domain, skill-config and skill in skills/schemas.ts 2022-11-01 21:51:19 +01:00
louistiti 6c292994fd feat: add data schemas 2022-11-02 00:21:14 +08:00
louistiti 6e8c326a9c feat: add data schemas 2022-11-02 00:21:14 +08:00
louistiti a4e9b1e1cc feat: add data schemas 2022-11-02 00:21:14 +08:00
louistiti 29d7f16b2c feat: add voice configuration schemas 2022-11-01 22:09:52 +08:00
louistiti e3c0a180af feat: add voice configuration schemas 2022-11-01 22:09:52 +08:00
louistiti 360c4d4f6f feat: add voice configuration schemas 2022-11-01 22:09:52 +08:00
louistiti 1a580d1051 Merge branch 'develop' into feat/add-typebox-ajv 2022-11-01 21:45:50 +08:00
louistiti f13df6ab76 Merge branch 'develop' into feat/add-typebox-ajv 2022-11-01 21:45:50 +08:00
louistiti 239472b61e Merge branch 'develop' into feat/add-typebox-ajv 2022-11-01 21:45:50 +08:00
Louis Grenard 83c501dc8d docs: add new sponsor 2022-11-01 21:44:44 +08:00
Louis Grenard 67d07ed7e6 docs: add new sponsor 2022-11-01 21:44:44 +08:00
Louis Grenard 18a728ff4b docs: add new sponsor 2022-10-30 22:23:40 +08:00
Louis Grenard b77e3a99e9 docs: add new sponsor 2022-10-30 22:23:40 +08:00
louistiti daba510755 feat: add distro level info in check report 2022-10-29 11:48:16 +08:00
louistiti dcc04de6bc feat: add distro level info in check report 2022-10-29 11:48:16 +08:00
louistiti 38693e42ef Merge branch 'fix/docker-issues-with-ssl' into develop 2022-10-23 22:55:04 +08:00
louistiti ceaff26d2d Merge branch 'fix/docker-issues-with-ssl' into develop 2022-10-23 22:55:04 +08:00
Divlo db373b66a6 fix(docker): issues with SSL 2022-10-23 12:37:36 +02:00
Divlo fb03359400 fix(docker): issues with SSL 2022-10-23 12:37:36 +02:00
Divlo d8e40c9cce refactor(server): replace unknown return type with TypeBox schema types 2022-10-23 11:09:07 +02:00
Divlo ecca030ab9 refactor(server): replace unknown return type with TypeBox schema types 2022-10-23 11:09:07 +02:00
Divlo 35322b39e3 refactor(server): replace unknown return type with TypeBox schema types 2022-10-23 11:09:07 +02:00
Divlo be079b87c8 feat(server): add JSON models with TypeBox
Later, we will be able to validate JSON files thanks to AJV.
2022-10-23 11:05:55 +02:00
Divlo 2a7b2f45d6 feat(server): add JSON models with TypeBox
Later, we will be able to validate JSON files thanks to AJV.
2022-10-23 11:05:55 +02:00
Divlo 2a48bc6343 feat(server): add JSON models with TypeBox
Later, we will be able to validate JSON files thanks to AJV.
2022-10-23 11:05:55 +02:00
louistiti 5acd22a885 Merge branch 'python-bridge-tcp-server-binaries' into develop 2022-10-23 12:01:21 +08:00
louistiti 632a048c6b Merge branch 'python-bridge-tcp-server-binaries' into develop 2022-10-23 12:01:21 +08:00
louistiti e1e4910399 fix(docker): based on Ubuntu image 2022-10-23 11:46:15 +08:00
louistiti 5bd67be2e5 fix(docker): based on Ubuntu image 2022-10-23 11:46:15 +08:00
louistiti 482f7bfbb8 chore(docker): .dockerignore path 2022-10-23 10:58:25 +08:00
louistiti 2d6f16a311 chore(docker): .dockerignore path 2022-10-23 10:58:25 +08:00
louistiti 3f8027af2a refactor: from superagent to axios 2022-10-23 10:55:03 +08:00
louistiti da063b73bc refactor: from superagent to axios 2022-10-23 10:55:03 +08:00
louistiti 3f97a12153 fix(python bridge): remove unecessary sqlite3 import 2022-10-23 10:07:14 +08:00
louistiti 6bee56580b fix(python bridge): remove unecessary sqlite3 import 2022-10-23 10:07:14 +08:00
louistiti ad1708abbb feat: ignore given warnings for TCP server binary on check script 2022-10-23 01:58:13 +08:00
louistiti bd1671c440 feat: ignore given warnings for TCP server binary on check script 2022-10-23 01:58:13 +08:00
louistiti e527110b9c feat: add binaries download progress 2022-10-23 01:00:55 +08:00
louistiti 0cf39c181f feat: add binaries download progress 2022-10-23 01:00:55 +08:00
louistiti c0886c086f Merge branch 'feat/download-unzip-python-bridge-tcp-server-binaries' into python-bridge-tcp-server-binaries 2022-10-22 23:23:08 +08:00
louistiti e459c1011c Merge branch 'feat/download-unzip-python-bridge-tcp-server-binaries' into python-bridge-tcp-server-binaries 2022-10-22 23:23:08 +08:00
louistiti 9928509171 refactor: minor setup-python-binaries renaming 2022-10-22 23:22:50 +08:00
louistiti 16444ae79f refactor: minor setup-python-binaries renaming 2022-10-22 23:22:50 +08:00
louistiti 75a351e77d chore: fix typo in report logs 2022-10-22 17:50:35 +08:00
louistiti 5c02e906fa chore: fix typo in report logs 2022-10-22 17:50:35 +08:00
louistiti b74e7beb29 ci: pre-release TCP server workflow 2022-10-22 15:14:17 +08:00
louistiti 03b0d08ae0 ci: pre-release TCP server workflow 2022-10-22 15:14:17 +08:00
louistiti 2183ffa4f0 refactor: send check report to the production URL 2022-10-19 23:28:33 +08:00
louistiti 6dbdfe7ba5 refactor: send check report to the production URL 2022-10-19 23:28:33 +08:00
Divlo 8ab9c2e4df feat: download and unzip TCP Server + Python Bridge on postinstall 2022-10-19 13:23:28 +02:00
Divlo c912b637ee feat: download and unzip TCP Server + Python Bridge on postinstall 2022-10-19 13:23:28 +02:00
louistiti fcce24d68c feat: send report to Pastebin and generate URL 2022-10-19 01:17:57 +08:00
louistiti 4df23cfe45 feat: send report to Pastebin and generate URL 2022-10-19 01:17:57 +08:00
louistiti 76e700e9ce feat: provide Python bridge and TCP server version in report 2022-10-19 00:40:34 +08:00
louistiti 65592b9af5 feat: provide Python bridge and TCP server version in report 2022-10-19 00:40:34 +08:00
louistiti 2463759717 refactor: check script according to binaries changes 2022-10-19 00:22:37 +08:00
louistiti 8f9937ddee refactor: check script according to binaries changes 2022-10-19 00:22:37 +08:00
louistiti 02c28b85f6 refactor: remove unnecessary checks 2022-10-16 23:25:58 +08:00
louistiti 5042bcc95d refactor: remove unnecessary checks 2022-10-16 23:25:58 +08:00
louistiti f54e8407c0 ci: remove tests for Ubuntu AArch64 2022-10-16 01:14:45 +08:00
louistiti cc6503e6f7 ci: remove tests for Ubuntu AArch64 2022-10-16 01:14:45 +08:00
louistiti 46a8bc61ea ci: test Ubuntu AArch64 2022-10-15 23:36:34 +08:00
louistiti 8de9d84f1f ci: test Ubuntu AArch64 2022-10-15 23:36:34 +08:00
louistiti 9aaa3d740d ci: build on Ubuntu AArch64 2022-10-15 23:24:45 +08:00
louistiti 29c582c89e ci: build on Ubuntu AArch64 2022-10-15 23:24:45 +08:00
louistiti 401f60e05b ci: split macOS ARM64 build into isolated job 2022-10-15 22:25:05 +08:00
louistiti bc53a36cd8 ci: split macOS ARM64 build into isolated job 2022-10-15 22:25:05 +08:00
louistiti a4fbba5fd0 ci: add macOS ARM64 self-hosted runner 2022-10-15 22:09:12 +08:00
louistiti 84cdc7fa60 ci: add macOS ARM64 self-hosted runner 2022-10-15 22:09:12 +08:00
louistiti 6ea6c84b3d refactor: remove setuptools and wheel force install for macOS ARM64 arch 2022-10-15 21:38:22 +08:00
louistiti 1dc0451f0f refactor: remove setuptools and wheel force install for macOS ARM64 arch 2022-10-15 21:38:22 +08:00
louistiti 6e2790b738 refactor: remove Rust compiler version number from TCP server setup 2022-10-15 21:11:29 +08:00
louistiti 1beebcccd2 refactor: remove Rust compiler version number from TCP server setup 2022-10-15 21:11:29 +08:00
louistiti 92ea9a081e feat: install additional resources for macOS ARM64 arch 2022-10-15 21:03:44 +08:00
louistiti b6b42c422c feat: install additional resources for macOS ARM64 arch 2022-10-15 21:03:44 +08:00
louistiti 23d6dd5e91 chore: ignore Fleet folder 2022-10-15 20:46:57 +08:00
louistiti bda75915b2 chore: ignore Fleet folder 2022-10-15 20:46:57 +08:00
Divlo b099d53871 fix(docker): install Python binaries from postinstall script 2022-10-13 22:59:39 +02:00
Divlo c6ad1968e7 fix(docker): install Python binaries from postinstall script 2022-10-13 22:59:39 +02:00
louistiti a5cbbf93a9 ci: try pre-release with all OSes 2022-10-13 01:42:36 +08:00
louistiti bc37bd1687 ci: try pre-release with all OSes 2022-10-13 01:42:36 +08:00
louistiti fc3e36713c ci: remove the lock file for Windows 2022-10-13 01:29:37 +08:00
louistiti 7161cd5996 ci: remove the lock file for Windows 2022-10-13 01:29:37 +08:00
louistiti 350072cf8c ci: remove skip lock for Windows 2022-10-13 01:22:40 +08:00
louistiti 23b7d5b49e ci: remove skip lock for Windows 2022-10-13 01:22:40 +08:00
louistiti b0849c0046 ci: add PIP_NO_BINARY 2022-10-13 01:11:12 +08:00
louistiti 599f9561e4 ci: add PIP_NO_BINARY 2022-10-13 01:11:12 +08:00
louistiti 0efed9d5f3 ci: set up MSBuild if Windows 2022-10-13 01:03:14 +08:00
louistiti bd45220c66 ci: set up MSBuild if Windows 2022-10-13 01:03:14 +08:00
louistiti 08d7fdf0dd ci: make use of Pipenv 2022.7.24 and skip lock on Windows 2022-10-13 00:53:58 +08:00
louistiti 53757651c8 ci: make use of Pipenv 2022.7.24 and skip lock on Windows 2022-10-13 00:53:58 +08:00
louistiti 42a3130394 ci: try with --deploy flag to install Python deps 2022-10-13 00:10:45 +08:00
louistiti bd1bde0814 ci: try with --deploy flag to install Python deps 2022-10-13 00:10:45 +08:00
louistiti 24c15c73c8 Merge branch 'develop' into python-bridge-tcp-server-binaries 2022-10-12 23:53:16 +08:00
louistiti ad044814a5 Merge branch 'develop' into python-bridge-tcp-server-binaries 2022-10-12 23:53:16 +08:00
louistiti 7d7552e95b docs: remove typo 2022-10-12 23:52:53 +08:00
louistiti fc2a37a7a6 ci: try Windows Pipenv deps install 2022-10-12 23:50:46 +08:00
louistiti aede3cbf52 ci: try Windows Pipenv deps install 2022-10-12 23:50:46 +08:00
louistiti a863c872b0 ci: try to build on Windows without catching exceptions 2022-10-12 23:37:23 +08:00
louistiti 79115d1b25 ci: try to build on Windows without catching exceptions 2022-10-12 23:37:23 +08:00
louistiti e5eeffa2bc Merge branch 'develop' into python-bridge-tcp-server-binaries 2022-10-12 23:11:07 +08:00
louistiti 404a1d5b3f Merge branch 'develop' into python-bridge-tcp-server-binaries 2022-10-12 23:11:07 +08:00
Louis Grenard 5e6caf7521 docs: add MacStadium to the README thanks section 2022-10-12 23:10:20 +08:00
louistiti 050d1f35b2 ci: tru the Windows runner without the rm command 2022-10-11 00:47:45 +08:00
louistiti 8a191b9c91 ci: tru the Windows runner without the rm command 2022-10-11 00:47:45 +08:00
louistiti 8a746d7ff8 ci: remove Pipfile.lock on Windows 2022-10-11 00:43:31 +08:00
louistiti 56a9a796bd ci: remove Pipfile.lock on Windows 2022-10-11 00:43:31 +08:00
louistiti 39bf7c678a ci: upgrade Pip to latest and try Windows runner 2022-10-11 00:36:27 +08:00
louistiti 5bc0a7f97b ci: upgrade Pip to latest and try Windows runner 2022-10-11 00:36:27 +08:00
louistiti 0188dd7ed8 ci: test to upload artifact with default name 2022-10-11 00:03:36 +08:00
louistiti 7fe7b2feaa ci: test to upload artifact with default name 2022-10-11 00:03:36 +08:00
louistiti adc63c94ba ci: upload artifacts then download and pre-release 2022-10-10 09:11:56 +08:00
louistiti ee0134598c ci: upload artifacts then download and pre-release 2022-10-10 09:11:56 +08:00
louistiti 47e9c291b4 ci: remove Windows 2022-10-10 09:02:03 +08:00
louistiti b19e5ad0cb ci: remove Windows 2022-10-10 09:02:03 +08:00
louistiti ff53b7a3f2 ci: remove Pipenv cache from pre-release binaries workflows 2022-10-10 00:14:37 +08:00
louistiti de442741e5 ci: remove Pipenv cache from pre-release binaries workflows 2022-10-10 00:14:37 +08:00
louistiti aafde0543f ci: install Pipenv on pre-release binaries workflows 2022-10-10 00:04:28 +08:00
louistiti f43e17aad4 ci: install Pipenv on pre-release binaries workflows 2022-10-10 00:04:28 +08:00
louistiti 4760c4d6de ci: checkout repo first on pre-release binaries workflows 2022-10-10 00:01:24 +08:00
louistiti ddbe4f0fd1 ci: checkout repo first on pre-release binaries workflows 2022-10-10 00:01:24 +08:00
louistiti c2865f73fb refactor: exit pre-release binaries script 2022-10-09 23:58:59 +08:00
louistiti f17a601d8e refactor: exit pre-release binaries script 2022-10-09 23:58:59 +08:00
louistiti 32ee4fef51 ci: add environment variables to locate virtual env 2022-10-09 23:58:05 +08:00
louistiti 5bace9545a ci: add environment variables to locate virtual env 2022-10-09 23:58:05 +08:00
louistiti 0f348ba48e Merge remote-tracking branch 'origin/develop' into python-bridge-tcp-server-binaries 2022-10-09 23:53:49 +08:00
louistiti f170a1dd8e Merge remote-tracking branch 'origin/develop' into python-bridge-tcp-server-binaries 2022-10-09 23:53:49 +08:00
louistiti cb37b4fcd2 refactor: pre-release binaries script give only workflow name 2022-10-09 23:53:40 +08:00
louistiti 91eac5c875 refactor: pre-release binaries script give only workflow name 2022-10-09 23:53:40 +08:00
Louis Grenard 4c19994fed ci: pre-release-tcp-server.yml GitHub Action workflow 2022-10-09 23:52:37 +08:00
Louis Grenard 8d4e8ba3a8 ci: pre-release-python-bridge.yml GitHub Action workflow 2022-10-09 23:51:22 +08:00
louistiti 6618f3a6a5 fix: rename GitHub workflows from the pre-release-binaries script 2022-10-09 23:39:22 +08:00
louistiti 518889b459 fix: rename GitHub workflows from the pre-release-binaries script 2022-10-09 23:39:22 +08:00
louistiti 0df61ae714 ci: pre-release TCP server 2022-10-09 22:03:26 +08:00
louistiti cc8a32d17d ci: pre-release TCP server 2022-10-09 22:03:26 +08:00
louistiti b9792d28d7 ci: pre-release Python bridge 2022-10-09 22:00:56 +08:00
louistiti a00b01c041 ci: pre-release Python bridge 2022-10-09 22:00:56 +08:00
louistiti 3f6e6ccdea refactor: rename GitHub workflows release script as pre-release 2022-10-09 21:27:12 +08:00
louistiti 7db5c064d9 refactor: rename GitHub workflows release script as pre-release 2022-10-09 21:27:12 +08:00
louistiti 4fcf8dceda feat: trigger GitHub workflows script done 2022-10-09 21:16:42 +08:00
louistiti ed8390a36c feat: trigger GitHub workflows script done 2022-10-09 21:16:42 +08:00
louistiti 3fe89bfda3 feat(tcp server): versioning 2022-10-09 00:31:52 +08:00
louistiti 1d45c2e715 feat(tcp server): versioning 2022-10-09 00:31:52 +08:00
louistiti 2b8ac0eb2b feat(python bridge): versioning 2022-10-09 00:29:30 +08:00
louistiti 784f86f6f3 feat(python bridge): versioning 2022-10-09 00:29:30 +08:00
louistiti 0ae31f6cc8 feat(server): add warning hint on macOS TCP server cold start 2022-10-07 19:18:36 +08:00
louistiti 9d865291f0 feat(server): add warning hint on macOS TCP server cold start 2022-10-07 19:18:36 +08:00
louistiti cb1a192a6d fix: comply macOS x86_64 and macOS arm64 to Python sysconfig.get_platform() 2022-10-07 18:25:51 +08:00
louistiti bc7dd0f836 fix: comply macOS x86_64 and macOS arm64 to Python sysconfig.get_platform() 2022-10-07 18:25:51 +08:00
louistiti 90530e4e60 refactor: remove LC_ALL and LANG env vars 2022-10-07 18:23:10 +08:00
louistiti 8d64ad9650 refactor: remove LC_ALL and LANG env vars 2022-10-07 18:23:10 +08:00
louistiti 6a4bde6c88 chore: explicit exclusion of TCP server and Python bridge on TypeScript watcher 2022-10-07 15:47:55 +08:00
louistiti b3fdde9d83 chore: explicit exclusion of TCP server and Python bridge on TypeScript watcher 2022-10-07 15:47:55 +08:00
louistiti 7111983ef5 perf(tcp server): option to download spaCy models through mirror in China 2022-10-07 15:31:37 +08:00
louistiti ea6fc4108a perf(tcp server): option to download spaCy models through mirror in China 2022-10-07 15:31:37 +08:00
louistiti b201f3f1b1 fix(tcp server): handle Windows child process does not throw exception 2022-10-07 14:10:32 +08:00
louistiti 40958f2fb4 fix(tcp server): handle Windows child process does not throw exception 2022-10-07 14:10:32 +08:00
louistiti cace69e9af perf(tcp server): do not download Python deps but spaCy models when necessary 2022-10-07 13:44:48 +08:00
louistiti 8e0d18a596 perf(tcp server): do not download Python deps but spaCy models when necessary 2022-10-07 13:44:48 +08:00
louistiti 432c590ee7 feat: on Python dev env setup, provide Windows hint related to Microsoft C++ Build Tools 2022-10-07 13:24:58 +08:00
louistiti 861d773cdd feat: on Python dev env setup, provide Windows hint related to Microsoft C++ Build Tools 2022-10-07 13:24:58 +08:00
louistiti 061f555e11 fix: always make use of latest Python build deps 2022-10-07 13:16:35 +08:00
louistiti 6bd9f0ef9d fix: always make use of latest Python build deps 2022-10-07 13:16:35 +08:00
louistiti 7bb9780ab1 feat: add hint on failed build 2022-10-07 12:07:48 +08:00
louistiti d69157439c feat: add hint on failed build 2022-10-07 12:07:48 +08:00
louistiti 999328819a feat: map Python bridge and TCP server binaries to runtime code 2022-10-07 11:53:43 +08:00
louistiti 1a3d4f2204 feat: map Python bridge and TCP server binaries to runtime code 2022-10-07 11:53:43 +08:00
louistiti 0e697183b2 perf(tcp server): optimize spaCy models checking 2022-10-07 11:26:39 +08:00
louistiti b59f6a7264 perf(tcp server): optimize spaCy models checking 2022-10-07 11:26:39 +08:00
louistiti 05b62871fb feat: universal build binaries script 2022-10-07 10:41:04 +08:00
louistiti bf902fd2d9 feat: universal build binaries script 2022-10-07 10:41:04 +08:00
louistiti 9724d7b943 feat: pack TCP server and optimize setup scripts 2022-10-07 02:37:43 +08:00
louistiti a8272e1bf9 feat: pack TCP server and optimize setup scripts 2022-10-07 02:37:43 +08:00
louistiti 109561495c feat(tcp server): set up script 2022-10-06 23:20:30 +08:00
louistiti b96070085b feat(tcp server): set up script 2022-10-06 23:20:30 +08:00
louistiti 286892eb30 chore: upgrade archiver to latest 2022-10-06 19:48:17 +08:00
louistiti 48688dc6e6 chore: upgrade archiver to latest 2022-10-06 19:48:17 +08:00
louistiti 3eea6a8fe8 feat(python bridge): pack build 2022-10-06 19:45:35 +08:00
louistiti 9dd9b010ed feat(python bridge): pack build 2022-10-06 19:45:35 +08:00
louistiti 472e388508 feat(python bridge): build script 2022-10-06 19:01:50 +08:00
louistiti 0888ae5033 feat(python bridge): build script 2022-10-06 19:01:50 +08:00
louistiti 1a953e007d feat(python bridge): set up script 2022-10-06 16:27:20 +08:00
louistiti 2d7be3348a feat(python bridge): set up script 2022-10-06 16:27:20 +08:00
louistiti 0fd4dd67c7 refactor(tcp server): move tokenizers private libraries to lib location 2022-10-06 08:34:30 +08:00
louistiti bee3fbb9e2 refactor(tcp server): move tokenizers private libraries to lib location 2022-10-06 08:34:30 +08:00
louistiti 6146fa1f15 fix(tcp server): include private libraries of the tokenizers package 2022-10-06 01:25:26 +08:00
louistiti 55db68400d fix(tcp server): include private libraries of the tokenizers package 2022-10-06 01:25:26 +08:00
louistiti 3361d9b37e feat(tcp server): include tokenizers files on build 2022-10-06 01:11:52 +08:00
louistiti 7d2432c56c feat(tcp server): include tokenizers files on build 2022-10-06 01:11:52 +08:00
louistiti 39dacb87e0 chore(tcp server): upgrade to latest setuptools version 2022-10-06 00:59:20 +08:00
louistiti 48731e8ddf chore(tcp server): upgrade to latest setuptools version 2022-10-06 00:59:20 +08:00
louistiti 2c9b675cae refactor(tcp server): remove cx_Freeze from Pipfile to install it individually during the dev phase 2022-10-06 00:13:54 +08:00
louistiti 4d0a97f9c2 refactor(tcp server): remove cx_Freeze from Pipfile to install it individually during the dev phase 2022-10-06 00:13:54 +08:00
louistiti 0d02b2e9fa fix: remove requests.certs import from the TCP server and Python bridge setups 2022-10-05 01:31:46 +08:00
louistiti 133310bd7d fix: remove requests.certs import from the TCP server and Python bridge setups 2022-10-05 01:31:46 +08:00
louistiti d8b20660a2 fix: upgrade cx_Freeze to 6.11.1 with --no-binary to avoid OpenSSL conflict with urllib3 2022-10-04 23:57:18 +08:00
louistiti 69bf9cebb3 fix: upgrade cx_Freeze to 6.11.1 with --no-binary to avoid OpenSSL conflict with urllib3 2022-10-04 23:57:18 +08:00
louistiti 5715786be2 chore: add TCP server and Python bridge as high-level nodes 2022-10-04 17:16:41 +08:00
louistiti 91e39a0a37 chore: add TCP server and Python bridge as high-level nodes 2022-10-04 17:16:41 +08:00
louistiti 0a4baf67ac feat: isolate TCP server 2022-10-04 17:10:14 +08:00
louistiti 586ca11106 feat: isolate TCP server 2022-10-04 17:10:14 +08:00
louistiti 39b605f6f4 chore: transparent distribution structure 2022-10-04 14:30:10 +08:00
louistiti 20b967b4ea chore: transparent distribution structure 2022-10-04 14:30:10 +08:00
louistiti a27ab96e18 feat: Python bridge binary build with cx_Freeze 2022-10-04 14:19:56 +08:00
louistiti dd9d024975 feat: Python bridge binary build with cx_Freeze 2022-10-04 14:19:56 +08:00
louistiti f1dcb07d5b feat: Python bridge build on macOS x86_64 arch 2022-10-02 15:43:48 +08:00
louistiti 8d1ab6973a feat: Python bridge build on macOS x86_64 arch 2022-10-02 15:43:48 +08:00
louistiti 38226ca84e feat(server): add execution time 2022-09-27 19:49:09 +08:00
louistiti b7d496e6d6 feat: add skill execution time in check script 2022-09-27 19:46:41 +08:00
louistiti 4d2fb56109 Merge branch 'chore/eslint-rule-prefer-node-protocol' into develop 2022-09-27 08:46:48 +08:00
Divlo f4a53da7fd chore: add unicorn/prefer-node-protocol ESLint rule 2022-09-26 22:10:27 +02:00
louistiti defc70128c refactor: add ESLint rules about imports 2022-09-27 00:01:03 +08:00
louistiti f68da11f6b refactor(server): make use of node:* import for all Node.js built-in modules 2022-09-26 23:28:25 +08:00
louistiti 0a49cb17fa refactor(server): remove node:* imports 2022-09-26 22:48:12 +08:00
louistiti 7081464abc refactor(server): add explicit return types 2022-09-26 22:46:12 +08:00
louistiti 7544534ea4 refactor(server): skill domain helper to static class 2022-09-26 21:36:07 +08:00
louistiti 46c0b579aa refactor(server): OS helper to static class 2022-09-26 21:32:59 +08:00
louistiti a80e8ba65d refactor(server): log helper to static class 2022-09-26 21:29:56 +08:00
louistiti 88d86117ac refactor(server): loader helper to static class 2022-09-26 21:24:07 +08:00
louistiti f4d625500f refactor(server): lang helper to static class 2022-09-26 21:17:36 +08:00
louistiti afec850fc9 refactor(server): date helper to static class 2022-09-26 21:13:33 +08:00
louistiti 9065d713e9 refactor(server): string helper from singleton to static 2022-09-26 00:44:40 +08:00
louistiti 1a4e09f908 refactor(server): simplify helpers singleton 2022-09-25 23:37:30 +08:00
Louis Grenard 4a59ba1d9c chore: update sponsor 2022-09-25 08:44:31 +08:00
louistiti cc317842d8 chore: clean up ESLint comments and new Prettier/ESLint script 2022-09-21 23:29:29 +08:00
louistiti c65f60e2b7 refactor(server): provide explicit class name to helpers 2022-09-21 23:08:11 +08:00
louistiti 2378dc37b1 Merge branch 'refactor/server-helpers' into develop 2022-09-21 23:01:36 +08:00
louistiti 82f6ee80fe refactor(server): skill domain helper to singleton 2022-09-21 23:01:16 +08:00
louistiti 84aadc0245 refactor(server): string helper to singleton 2022-09-21 22:24:48 +08:00
louistiti a5e48ec9e7 refactor(server): OS helper to singleton 2022-09-21 22:15:02 +08:00
louistiti e7cb31e706 chore(server): add comments on loader helper 2022-09-21 21:51:19 +08:00
louistiti 713ece380b refactor(server): rename lang helper methods 2022-09-21 21:46:05 +08:00
louistiti 8d3aee8da7 refactor(server): lang helper to singleton 2022-09-21 21:31:19 +08:00
louistiti f21e43c16a refactor(server): date helper to singleton 2022-09-21 20:43:50 +08:00
louistiti 4f1683dc55 refactor(server): capitalize singleton helpers instance constants 2022-09-21 20:25:00 +08:00
Divlo 74be62b812 chore: ignore core/skills-endpoints.json 2022-09-20 22:19:06 +02:00
Divlo 8d6a1167da chore: delete old unused ISSUE_TEMPLATE 2022-09-20 21:51:57 +02:00
Divlo c68b16191a chore: remove unneeded eslint disable comments 2022-09-20 21:49:41 +02:00
Divlo ef8374d03b perf: improve scripts/lint 2022-09-20 21:47:29 +02:00
Divlo 285bfa6e78 refactor(server): add getSkillConfig 2022-09-20 21:43:34 +02:00
Divlo a28eede95b refactor(server): os helper to TypeScript 2022-09-20 21:34:56 +02:00
Divlo 247167202d refactor(server): remove inconsistencies 2022-09-20 21:33:02 +02:00
Divlo 949138627e refactor(server): loader helper to TypeScript 2022-09-16 20:58:24 +02:00
Divlo b7f20710db refactor(server): log helper to TypeScript 2022-09-16 19:36:58 +02:00
Divlo c979a9ea08 refactor(server): lang helper to TypeScript 2022-09-16 17:17:54 +02:00
louistiti dabd657acf refactor(server): add comments to the skill domain helper 2022-09-13 23:16:12 +08:00
louistiti 6f7bcc5e37 refactor(server): skill domain helper to TypeScript 2022-09-13 23:06:57 +08:00
louistiti dbd659d75f feat: add OS info in the checking report 2022-09-13 00:45:23 +08:00
louistiti ed97b9361f feat: add spaCy model checking 2022-09-13 00:09:37 +08:00
louistiti 35a9f6e0ea refactor(server): string helper to TypeScript 2022-09-12 16:00:46 +08:00
louistiti da0233495d refactor(server): replace Moment.js by Day.js 2022-09-12 12:45:25 +08:00
louistiti ebe31f4b60 chore: upgrade moment-timezone to latest 2022-09-12 10:45:04 +08:00
louistiti 6dbe1e514f refactor(server): date helper to TypeScript 2022-09-12 10:41:16 +08:00
louistiti b4909564c7 chore: upgrade Coqui STT to latest 2022-09-10 11:51:23 +08:00
louistiti e8b596a8d8 chore: upgrade hotword deps 2022-09-10 10:55:13 +08:00
Louis Grenard 54336cdd01 docs: update skills list link 2022-09-05 13:45:01 +08:00
louistiti bf065fcbc6 chore: upgrade FFprobe to latest 2022-09-04 23:59:18 +08:00
louistiti e541e32c53 chore: upgrade Socket.IO to latest 2022-09-04 23:53:05 +08:00
louistiti 6872ee9735 chore: upgrade Vite to latest 2022-09-04 23:50:17 +08:00
louistiti e0bb25b1d9 fix(web app): when suggestions are null new npm deps tree was creating conflict 2022-09-04 23:48:55 +08:00
louistiti cf563f5f32 feat(server): detach the TCP server from the main process in dev 2022-09-04 18:54:16 +08:00
louistiti 891b032543 fix: recursive compilation through the server folder 2022-09-04 14:28:36 +08:00
louistiti 49ffb0b1f3 style(server): typo 2022-09-04 14:25:41 +08:00
louistiti aa7a152f7b refactor(server): make use of consts for TCP server matters 2022-09-04 14:23:23 +08:00
louistiti 58dc881a83 refactor(server): make use of consts for logger matters 2022-09-04 14:18:53 +08:00
louistiti 819e57a2c2 refactor(server): make use of consts for HTTP API matters 2022-09-04 14:17:06 +08:00
louistiti d05d572b70 refactor(server): make use of consts for voice config matters 2022-09-04 14:10:42 +08:00
louistiti e07ec87838 refactor(server): init dotenv earlier and make use of consts for time zone matters 2022-09-04 13:56:05 +08:00
louistiti cb173a6319 refactor(server): make use of consts for HTTP config matters 2022-09-04 13:32:58 +08:00
louistiti ddffd80985 refactor(server): make use of consts for lang matters 2022-09-04 13:28:10 +08:00
louistiti e1719115ea refactor(server): make use of consts for env matters 2022-09-04 13:13:03 +08:00
louistiti a903f20d7e chore: merge 2022-09-04 11:57:05 +08:00
louistiti 783858f811 chore: keep an exact ESLint version for JetBrains IDEs issue 2022-09-04 11:56:02 +08:00
louistiti 4e7ee1bb5e feat: make sure there is no .venv folder before the Python deps setup 2022-09-03 21:12:53 +08:00
louistiti a79459e5a6 chore: Prettier and lint-staged setup 2022-09-03 20:59:18 +08:00
louistiti 6d836d2d93 chore: upgrade Fastify to latest 2022-09-03 20:56:44 +08:00
louistiti e905dcc86b feat: lint-staged config 2022-09-03 20:56:15 +08:00
louistiti 4485b97ec2 chore: upgrade Fastify to latest 2022-09-03 19:57:19 +08:00
louistiti 0ea9bec001 Merge branch 'ts-kickoff' into develop 2022-09-03 19:25:04 +08:00
louistiti be4761602c chore: new deps tree 2022-09-03 19:24:06 +08:00
louistiti 27bd5a082f feat: remove Babel 2022-09-03 19:16:13 +08:00
louistiti 019c462bfa feat: complete Prettier setup 2022-09-03 19:12:41 +08:00
louistiti ba9f3f22f6 feat: basic Prettier setup 2022-09-03 18:37:56 +08:00
louistiti b9945729bb feat: new ESLint config 2022-09-03 18:17:16 +08:00
louistiti 935246d09a feat: make use of tsc-watch for dev server 2022-09-03 17:29:22 +08:00
louistiti ebda0da64e chore: install resolve-tspaths dev dep. 2022-09-03 13:08:54 +08:00
louistiti 36730025fc chore: upgrade nodemon to latest 2022-09-03 12:06:00 +08:00
louistiti 6d3d441fbf feat: extend from main TypeScript config 2022-09-03 12:02:40 +08:00
louistiti 9e48c5264c fix: resolve alias paths after compilation 2022-09-03 11:58:10 +08:00
louistiti 844fcc8a86 refactor: correct build:server executions order 2022-09-03 10:12:49 +08:00
louistiti 04c5bedd2b chore: move nodemon config to a config file 2022-09-03 10:05:27 +08:00
louistiti 4ca98cdbab chore: extend TypeScript config 2022-09-03 09:51:35 +08:00
louistiti 9645c3de68 refactor: TypeScript build kick off 2022-08-29 00:59:35 +08:00
louistiti 781e072b23 refactor: TypeScript entry point 2022-08-28 14:12:59 +08:00
louistiti 3498293098 refactor: make use of ts-node 2022-08-28 11:37:32 +08:00
louistiti fa7bc53ee9 chore: bump 1.0.0-beta.8+dev 2022-08-24 21:35:26 +08:00
louistiti 0bd07cba5c docs: add blog post to the changelog 2022-08-24 21:19:20 +08:00
louistiti 04b95e20c3 docs: clean up changelog 2022-08-24 21:17:03 +08:00
louistiti 3fb7ed691f build: release 1.0.0-beta.7 2022-08-24 21:12:30 +08:00
Louis Grenard e4a0a4556e docs: change notice from the README 2022-08-24 21:03:04 +08:00
louistiti 4bf2a9af96 docs: change newsletter link 2022-08-23 23:40:55 +08:00
louistiti 41435b3cbc chore: change email address 2022-08-23 23:01:46 +08:00
louistiti afdb71f766 perf: check Pipfile instead of Pipfile.lock to judge whether Python packages must be installed 2022-08-23 21:19:23 +08:00
louistiti 0580cfc54a chore: upgrade to spaCy latest and PyTorch latest 2022-08-23 21:05:49 +08:00
Divlo f507f6f7e4 fix(docker): usage of Ubuntu base image with pyenv and nvm (#408) 2022-08-23 20:59:09 +08:00
louistiti f17b894907 refactor: legacy package/module naming to skills naming 2022-08-20 22:47:06 +08:00
louistiti 01f7515e6f refactor: switch from skill NLU config to skill config naming 2022-08-20 22:35:34 +08:00
louistiti 141c89ecbf feat(web app): join us on Discord 2022-08-14 21:19:04 +08:00
Divlo 81ae87f0d9 chore: improve Gitpod usage (using current source code) (#398) 2022-07-30 17:20:40 +08:00
louistiti 5219e41d31 chore: simplify Gitpod initialization 2022-07-27 23:16:37 +08:00
louistiti bf679495fa chore: Gitpod makes use of the Leon CLI 2022-07-27 23:02:55 +08:00
louistiti 65bfa6cf37 chore: enable site-packages for the virtual env 2022-07-27 22:51:42 +08:00
louistiti 58ab0acdd8 refactor(server): auto capitalize first letter of spaCy entities 2022-07-21 23:03:48 +08:00
louistiti cb18ed6397 fix(skill/color): more appropriate answer 2022-07-21 21:47:29 +08:00
louistiti fdf0a389b7 fix: check script with new intent-object format 2022-07-19 22:01:48 +08:00
louistiti cfd8f7cbe5 fix: check new resolvers paths 2022-07-19 21:57:00 +08:00
louistiti a1d390dd3e style(server): format as project convention 2022-07-16 18:51:31 +08:00
Najim 6e7c0aac57 fix(server): make leon handle multiple socket.io-client instances 2022-07-15 08:45:28 +01:00
rangi376w e83a1c4230 docs: README - Edited sentence for clarity (#389)
The sentence ended with a preposition and was grammatically incorrect. Updated for clarity.

Co-authored-by: Louis Grenard <louis.grenard@gmail.com>
2022-07-13 23:35:04 +08:00
louistiti 79e7df022f feat(skill/akinator): finish up 2022-07-13 23:26:15 +08:00
louistiti 244d08c0bd feat(server): trigger next action suggestions or current ones 2022-07-13 22:51:10 +08:00
louistiti 7134c9dbc1 refactor(server): make difference between next suggestions and current suggestions 2022-07-13 22:31:11 +08:00
louistiti 93f09685b5 refactor(server): controlled suggestions 2022-07-13 09:05:53 +08:00
louistiti 602604e437 feat: create new NLP skills resolvers model + NLP global resolvers model 2022-07-12 22:27:38 +08:00
louistiti 29c5348b5a chore: use original intent object sample file 2022-07-11 08:41:21 +08:00
louistiti f6461f733b fix(skill/akinator): remove direct end on guess action 2022-07-10 20:47:51 +08:00
louistiti f9865b71c3 refactor(skill/rochambeau): move handsign global entity to skill enum entity 2022-07-10 20:07:29 +08:00
louistiti 905d248ebf feat: better isolate skill resolvers from global resolvers + finish up Akinator skill 2022-07-10 19:58:07 +08:00
louistiti b35a249bf6 feat: transfer language from core to skills + support thematics on Akinator skill 2022-07-10 09:21:43 +08:00
louistiti 76cae42fde feat(skill/akinator): finished main business logic 2022-07-10 00:26:41 +08:00
louistiti 239ce6fb36 chore: add Leon version in check report 2022-07-09 19:07:17 +08:00
louistiti ec77dd0f02 fix(server): fallback on global resolver during resolver classification 2022-07-09 18:59:25 +08:00
louistiti fa558a447a docs: edit newsletter link 2022-07-07 00:04:08 +08:00
louistiti 7101b8b4b8 feat: actions on slot level + akinator skill progress 2022-07-04 21:50:57 +08:00
louistiti 02a2f71470 feat(skill/akinator): backbone 2022-07-04 00:47:10 +08:00
louistiti aad9f3f1ef feat(skill/mbti): complete form resolver 2022-07-03 12:32:15 +08:00
louistiti 99a3f103e0 feat(skill/mbti): finish business logic 2022-07-03 12:17:05 +08:00
louistiti 0f4576c27d refactor(skill/mbti): change some questions 2022-07-03 10:00:42 +08:00
louistiti ae4f69f7c7 feat(skill/mbti): questions mapping 2022-07-03 00:00:48 +08:00
louistiti 7f1f887159 feat(skill/mbti): complete questionnaire 2022-07-02 23:46:48 +08:00
louistiti 33109a4c8b feat(skill/mbti): main logic backbone 2022-07-02 23:21:46 +08:00
louistiti 6ed88a5946 feat: add Cartesian sample training on resolvers + enum entities 2022-07-02 01:42:23 +08:00
louistiti eb5ade7684 feat: map skills resolvers intents 2022-07-01 01:07:48 +08:00
louistiti 82df0a3c23 feat: train skills resolvers and remap as per changes 2022-07-01 00:19:36 +08:00
louistiti 0fe0e9a717 refactor(server): remove resolvers ghosting as it uses its own model now 2022-06-30 22:48:40 +08:00
louistiti e37526d905 feat(server): introduce main NLP model and resolvers NLP model 2022-06-30 22:35:54 +08:00
louistiti 899676110a chore: tmp disable GitHub Actions on the develop branch 2022-06-30 21:32:06 +08:00
louistiti 86d5040a7d feat(skill/mbti): main NLU structure [skip ci] 2022-06-30 00:31:21 +08:00
louistiti aebe513599 Merge branch 'from-modules-to-skills' into develop [skip ci] 2022-06-26 23:23:57 +08:00
louistiti 07743657cd BREAKING: remove legacy packages 2022-06-26 23:11:37 +08:00
louistiti 68514cbc07 Merge branch 'from-modules-to-skills' into develop 2022-06-26 19:47:20 +08:00
louistiti ce00989b01 feat(skill/color): introduce color skill 2022-06-26 19:32:49 +08:00
louistiti f1f8b472b4 refactor(skill/todo_list): adapt to Cartesian training samples 2022-06-26 17:54:49 +08:00
louistiti a1e9011d5d feat: achieve Cartesian training 2022-06-26 17:37:21 +08:00
louistiti e3b20a320d chore: add global entities logs on training phase 2022-06-26 17:28:19 +08:00
louistiti a8d82050c8 fix(server): make use of current entities to match global entities 2022-06-26 12:40:29 +08:00
louistiti 2e66be25ef refactor: train global entities at a higher level 2022-06-26 12:01:43 +08:00
louistiti aa995d46c8 refactor: move up the rest of the config to the higher level 2022-06-20 21:17:30 +08:00
louistiti 3713521b08 refactor: move up /server/src/config to /core level 2022-06-19 23:57:36 +08:00
louistiti dcddacca29 feat: introduce suggestions 2022-06-19 14:37:21 +08:00
louistiti 4b5a883510 feat: communicate suggestions to the client 2022-06-19 13:47:43 +08:00
louistiti 192dd0a87a feat(skill/rochambeau): add start answers 2022-06-19 12:18:23 +08:00
louistiti 573704706c feat(skill/rochambeau): introduce paper scissors rock 2022-06-19 12:00:17 +08:00
louistiti fba80966c9 feat(skill/guess_the_number): introduce the Guess the Number skill 2022-06-16 23:38:35 +08:00
louistiti af0fdd1e18 feat(skill/introduction): add one utterance sample 2022-06-16 22:24:42 +08:00
louistiti 843bc428b8 feat(server): change log emojis 2022-06-16 22:21:15 +08:00
louistiti be0b345d3f feat(skill/birthday): remove birthday skill 2022-06-16 21:52:30 +08:00
louistiti c5cc9bdd52 feat(skill/introduction): ask about owner info if necessary 2022-06-16 21:52:00 +08:00
louistiti 795acc5bdd feat: shared skills memory 2022-06-16 21:31:30 +08:00
louistiti 8377c63db4 feat(server): provide nextAction even when no slot is set and clean up NLU object on context switch 2022-06-15 23:16:13 +08:00
louistiti e1485c2ed3 refactor: simplify skills outputs 2022-06-12 17:58:57 +08:00
louistiti 10d10a1690 feat: support dynamic variables on skill NLU settings for logic type 2022-06-12 10:49:07 +08:00
louistiti c5edf6488b refactor: simplify slots mapping data structure between core and skills 2022-06-11 23:02:49 +08:00
louistiti b69b1fea16 feat(server): report full traceback from skills execution 2022-06-11 10:01:47 +08:00
louistiti 567b030c4f feat(server): support on-the-fly entity annotation for built-in entities 2022-06-11 07:54:20 +08:00
louistiti 2ac1bc63cc fix(server): multiple slots filling 2022-06-10 22:57:31 +08:00
louistiti fce47cdbd5 feat(server): save slots within conversation context 2022-06-08 00:20:26 +08:00
louistiti 9139215971 chore: remove logs 2022-06-07 22:05:51 +08:00
louistiti 6712ae5539 fix(server): context switching on action loop 2022-06-06 23:42:36 +08:00
louistiti ceea47ff7d feat(server): resolve resolvers tmp 2022-06-06 00:26:24 +08:00
louistiti f4d782b69e refactor(server): split anonymous collaborative logger request 2022-06-05 10:58:00 +08:00
louistiti 8a33980260 refactor(server): split language switching 2022-06-05 10:54:58 +08:00
louistiti a42bf40b93 Merge branch 'develop' into from-modules-to-skills 2022-06-05 10:43:53 +08:00
louistiti 782a3aaa0a fix(server): check one-shot slot filling case causing infinite loop 2022-06-05 10:43:38 +08:00
Louis Grenard f30ddb6be5 docs: update sponsor [skip ci] 2022-06-03 08:47:21 +08:00
louistiti 6cfbabfe73 refactor(server): tmp NLU split 2022-05-29 17:14:28 +08:00
louistiti b1a332bab6 feat: tmp resolvers mapping 2022-05-23 23:19:25 +08:00
louistiti e88495a9a9 feat: start to map resolvers between the core and skills 2022-05-23 22:33:56 +08:00
louistiti 993d52e868 feat: train affirmation and denial resolver 2022-05-23 22:23:32 +08:00
louistiti 0acb31a9c6 feat(server): prepare the next action on non-slot-filled skills 2022-05-22 13:11:07 +08:00
louistiti ffe0c8d217 Merge branch 'develop' into from-modules-to-skills 2022-05-14 12:59:55 +08:00
Louis Grenard 5dbc010fa6 docs: remove sponsor [skip ci] 2022-05-14 12:59:02 +08:00
Louis Grenard f36dd20f82 docs: remove sponsor [skip ci] 2022-05-14 12:54:35 +08:00
louistiti 870ab2e87e feat(server): add more affirmative utterance samples 2022-05-14 12:53:31 +08:00
louistiti 0ebc0518e6 fix(skill/rochambeau): final logic 2022-05-09 22:31:47 +08:00
louistiti 7f5e30ac82 feat(skill/rochambeau): init 2022-05-09 21:47:35 +08:00
louistiti f4446ef177 feat(server): restart a skill with the original utterance saved in context 2022-05-09 01:09:33 +08:00
louistiti 035c9d5240 feat(server): clean up context if the action loop does not meet the expected items 2022-05-08 23:37:03 +08:00
louistiti 1529c72039 feat(server): add handsigns custom entity 2022-05-08 22:16:28 +08:00
louistiti 9e242d77d3 feat(server): reprocess NLU in case of slot filling interruption 2022-05-08 12:40:49 +08:00
louistiti 250e16e4e4 refactor: rename "source" to "item" 2022-05-08 11:31:05 +08:00
louistiti f88305020a feat(server): handle action loop when slots have all been filled at once 2022-05-05 22:49:39 +08:00
louistiti 27dc801cf5 feat(server): break the action loop from the skill 2022-05-05 21:37:59 +08:00
louistiti 05e0911009 chore: upgrade spaCy to 3.3.0 2022-05-05 21:26:02 +08:00
louistiti 99681e2577 feat(server): stop action loop from skill to core 2022-05-05 21:11:48 +08:00
louistiti c5b3840082 feat(server): introduce basic concept of action loop 2022-05-04 22:52:05 +08:00
louistiti 7a9db1363d chore: require Python 3.9.10 to run 2022-05-01 10:53:52 +08:00
louistiti c988a456f4 Merge branch 'develop' into from-modules-to-skills 2022-05-01 08:50:05 +08:00
Louis Grenard 5ee57ddf2a docs: remove sponsor [skip ci] 2022-05-01 08:49:35 +08:00
louistiti 6c59f17207 chore: tmp 2022-05-01 08:48:07 +08:00
Louis Grenard b47cbc3a5e docs: add @ant-media sponsor [skip ci] 2022-04-27 22:04:24 +08:00
louistiti fa4bd6a8a1 Merge branch 'develop' into from-modules-to-skills 2022-04-11 22:53:52 +08:00
louistiti 3dd9039678 fix: use ports.ubuntu.com mirror for the offline TTS [skip ci] 2022-04-11 22:53:26 +08:00
louistiti 19e1aa22f6 feat(server): prepare action loop feature 2022-04-07 22:09:01 +08:00
louistiti 8b56a1850c feat(server): add current utterance entities to differentiate from the whole context 2022-04-06 02:10:05 +08:00
louistiti 8e1868798c feat(server): when a context is activated, pick up the most probable classification 2022-04-06 01:44:40 +08:00
louistiti 875757739f feat(server): persist entities into contexts 2022-04-06 00:25:58 +08:00
louistiti 860571bcb6 refactor: persistent entities in dynamic contexts (wip) 2022-04-05 20:27:15 +08:00
louistiti efc2a3a7c0 refactor: normalize entities 2022-04-05 10:41:18 +08:00
louistiti 9d6ae0aecd refactor: comply skills params to new structure 2022-04-05 10:22:49 +08:00
louistiti 68e40f65df feat(server): forward slots to skill + add original utterance 2022-04-01 00:45:07 +08:00
louistiti 22e9234b3d feat(server): handle case when all slots have been filled in one utterance 2022-04-01 00:02:37 +08:00
louistiti 8746175eca refactor(server): NLU process method 2022-03-31 00:21:53 +08:00
louistiti 39f8dc2bae refactor(server): slotFill method 2022-03-30 23:21:43 +08:00
louistiti 6b37195d9d refactor(server): make use of setter for activeContext 2022-03-30 00:10:27 +08:00
louistiti faabc2c7b0 fix(server): clean up active context after all slots have been filled 2022-03-29 20:11:33 +08:00
louistiti 7513aa7d20 fix: set skill config only when a bridge is set 2022-03-29 20:04:55 +08:00
louistiti 9b870010dd feat(server): trigger next action once all slots have been filled 2022-03-29 00:11:08 +08:00
louistiti 9124687eb0 feat(server): complete slot filling before triggering the next action 2022-03-28 01:09:30 +08:00
louistiti 77ebaf4a9c feat(server): from modules to skills with type at the actions level 2022-03-28 00:27:42 +08:00
louistiti 81c7eb83c5 refactor(server): move from skill type to action type 2022-03-28 00:01:57 +08:00
louistiti e27c1b9c8f feat(server): verify if all slots are filled 2022-03-27 22:49:59 +08:00
louistiti b6f79e04b9 refactor(server): disable builtin boolean entity 2022-03-27 21:59:44 +08:00
louistiti 25adf406c8 feat(server): context and slot filling, keep context and await for entities 2022-03-27 19:50:35 +08:00
louistiti 1ece25a497 feat(server): unstack oldest context 2022-03-27 12:30:34 +08:00
louistiti 49a7da9117 refactor(server): context and slot filling into a specific class 2022-03-27 10:24:08 +08:00
louistiti 2a535a8898 refactor(server): start slot filling / context refactor (wip) 2022-03-27 01:32:12 +08:00
louistiti 8257eb8792 feat(server): context setup with slot for each conversation (wip) 2022-03-27 01:05:56 +08:00
louistiti 960a6dc71c feat(server): resolve slots from slot filling 2022-03-26 19:51:50 +08:00
louistiti 3bbc2f8a25 feat(server): pickup questions for slot filling 2022-03-26 17:36:21 +08:00
louistiti 6aa60bfbd8 fix(server): correctly extract all spaCy entities 2022-03-26 15:51:12 +08:00
louistiti 368c57928a refactor(server): spaCy entities extracting 2022-03-22 23:40:35 +08:00
louistiti 1d9b18093b feat(server): main slots structure (wip) 2022-03-22 22:43:57 +08:00
louistiti 334bf393f2 feat(server): introduce resolvers for slot filling (wip) 2022-03-22 00:39:36 +08:00
louistiti 7e70f41774 refactor(server): find spaCy entities before extracting entities 2022-03-21 23:40:10 +08:00
louistiti bc228a6860 feat(web app): wait for TCP client to be connected first 2022-03-21 22:48:52 +08:00
louistiti 95bfcfe422 feat(server): slot filling PoC (tmp wip) 2022-03-21 00:01:44 +08:00
louistiti 2b03d981ab refactor(server): add prefix for system intents 2022-03-20 20:01:24 +08:00
louistiti 969a83e608 feat(server): slot filling (wip) 2022-03-20 19:25:42 +08:00
louistiti 1845eed71d feat(server): trigger unsupported language 2022-03-20 18:07:16 +08:00
louistiti cbb48213d2 Merge remote-tracking branch 'origin/develop' into from-modules-to-skills 2022-03-19 20:47:15 +08:00
Louis Grenard 499be77d50 docs: add long dev notice to README [skip ci] 2022-03-19 19:47:45 +08:00
louistiti d1c2a11d82 feat(server): context (wip) 2022-03-14 00:06:23 +08:00
louistiti a9a43ac478 feat(server): context (wip) 2022-03-13 18:30:45 +08:00
louistiti bf9bf231f7 feat(server): differenciate cities from countries for location entities 2022-03-13 13:34:53 +08:00
louistiti 1e6835a9e5 chore: context (wip) 2022-03-12 13:18:13 +08:00
louistiti 9be7c70076 feat(server): auto restart the TCP server when language is switching 2022-03-06 22:09:04 +08:00
louistiti fd7234c827 chore(server): remove unnecessary Python packages 2022-03-06 15:13:34 +08:00
louistiti 0f7a6f6bed refactor(server): TCP server for better structure 2022-03-06 14:26:36 +08:00
louistiti 1e988350b4 refactor: rename skills folder to match PEP 8 convention 2022-03-06 11:08:05 +08:00
louistiti a808742c92 feat(server): support multi languages on TCP server 2022-03-06 02:33:32 +08:00
louistiti cbe89ed6cc feat(server): add auto reconnect on TCP client 2022-03-06 01:32:34 +08:00
louistiti 006e9fb011 feat(server): make TCP client global 2022-03-06 00:19:14 +08:00
louistiti 8acb82da9b feat(server): fully implement low-level networking for IPC 2022-03-05 23:41:39 +08:00
louistiti 8476d5fc3c refactor(server): add entities data to TCP server message 2022-03-05 21:32:43 +08:00
louistiti 5970ec9e8e feat: Python TCP server and Node.js TCP client for IPC (wip) 2022-03-05 18:46:34 +08:00
louistiti caa86fc8a6 feat: introduce spaCy for complete NER (wip) 2022-03-05 01:43:49 +08:00
louistiti f17db82509 refactor(skill/birthday): main NLU structure 2022-03-04 00:16:59 +08:00
louistiti 64e8742aad refactor(skill/birthday): birthday != birth date 2022-03-04 00:03:34 +08:00
louistiti 76547d9411 feat: slot filling (wip) 2022-03-03 23:50:45 +08:00
louistiti 9ce9a8bc4f fix: only set skill config when it is a logic type 2022-03-02 01:08:03 +08:00
louistiti f4f9fff978 feat: share data across domains 2022-03-02 01:00:55 +08:00
louistiti 0367b44f21 feat: dynamic variable binding on NLG 2022-03-02 00:16:03 +08:00
louistiti 8280c65897 fix(server): intent not found 2022-02-28 23:06:21 +08:00
louistiti d5577b1ef5 feat(server): more accurate NLG 2022-02-28 22:54:31 +08:00
louistiti 28efe6e7d5 feat(server): unknown_answers fallback on dialog type 2022-02-28 22:03:15 +08:00
louistiti b0d4bf6e1f refactor: remove src/ when skills are dialog type 2022-02-28 21:32:35 +08:00
louistiti a853de4558 refactor(skill/partner_assistant): use dialog type 2022-02-28 21:27:06 +08:00
louistiti 3ca48265e7 feat(server): deep data mapping on enum NER 2022-02-28 01:00:01 +08:00
louistiti 8f2f935b94 feat(server): NLG and entities mapping 2022-02-27 16:32:01 +08:00
louistiti 29b32f66f2 Merge branch 'develop' into from-modules-to-skills 2022-02-27 11:30:22 +08:00
Divlo 4372b45fc6 fix(docker): check should not allocate a pseudo-TTY (#359)
LGTM 👍
2022-02-27 11:28:25 +08:00
louistiti 4d255dd1d1 Merge branch 'develop' into from-modules-to-skills 2022-02-24 23:42:20 +08:00
Louis Grenard 8825d6877c docs: move sponsor to new section [skip ci] 2022-02-24 23:40:42 +08:00
louistiti 975b8ebcf0 feat: context and slot filling preparation (wip) 2022-02-23 21:33:47 +08:00
louistiti 4107932d00 feat: annotate entities on the fly + prepare for dialog skill type and cross-domains data 2022-02-22 22:31:06 +08:00
louistiti cf6340b3ca refactor(skill/youtube_downloader): from module to skill 2022-02-22 09:21:05 +08:00
louistiti 131659928e refactor(skill/product_hunt_trends): from module to skill 2022-02-22 09:04:18 +08:00
louistiti 4029759ba7 refactor(skill/github_trend): from module to skill 2022-02-22 08:44:21 +08:00
louistiti 6f04e36342 refactor(skill/speed_test): from module to skill 2022-02-22 08:29:57 +08:00
louistiti c658425913 refactor(skill/who_am_i): from module to skill 2022-02-21 23:13:26 +08:00
louistiti b19bb0e3eb refactor(skill/welcome): from module to skill 2022-02-21 23:10:06 +08:00
louistiti 41c4436924 refactor(skill/random_number): from module to skill 2022-02-21 23:06:08 +08:00
louistiti dc4b6ff296 refactor(skill/partner_assistant): from module to skill 2022-02-21 23:02:50 +08:00
louistiti 13132279f3 refactor(skill/meaning_of_life): from module to skill 2022-02-21 22:52:24 +08:00
louistiti 195278f975 refactor(skill/joke): from module to skill 2022-02-21 22:49:12 +08:00
louistiti 3403e8cc12 refactor(skill/greeting): from module to skill 2022-02-21 22:44:58 +08:00
louistiti 5fecc1fd85 refactor(skill/good_bye): from module to skill 2022-02-21 22:41:54 +08:00
louistiti 053d53bb10 refactor(skill/todo_list): French translations 2022-02-21 00:29:45 +08:00
louistiti 9d5ceb03cb refactor(skill/have_i_been_pwned): from module to skill 2022-02-20 23:55:21 +08:00
louistiti 3fea149497 refactor(skill/is_it_down): from module to skill 2022-02-20 23:28:13 +08:00
louistiti d49bc5f63f refactor(skill/todo_list): finish refactor 2022-02-20 20:24:55 +08:00
louistiti 98a0382103 refactor: stop crash on brain + new skills DB calls 2022-02-20 19:25:08 +08:00
louistiti 7977d55b81 Merge branch 'develop' into from-modules-to-skills 2022-02-19 09:25:02 +08:00
louistiti c1afc11cdb docs: change Twitter handle [skip ci] 2022-02-19 09:24:47 +08:00
louistiti f5bdf2c888 Merge branch 'develop' into from-modules-to-skills 2022-02-18 23:07:57 +08:00
Louis Grenard 99b401a668 docs: remove sponsor [skip ci] 2022-02-18 23:07:22 +08:00
louistiti da51f3ee30 refactor(skill/todo_list): slightly improve NLU 2022-02-17 22:15:34 +08:00
louistiti 4e36843c96 refactor(skill/todo_list): inject all actions 2022-02-17 21:45:14 +08:00
louistiti 098f3ea85f Merge branch 'develop' into from-modules-to-skills 2022-02-17 20:29:46 +08:00
Louis Grenard 238d928cac docs: add new sponsor self-hosted img [skip ci] 2022-02-17 20:28:52 +08:00
louistiti 717faf8580 Merge remote-tracking branch 'origin/develop' into from-modules-to-skills 2022-02-17 20:23:45 +08:00
Louis Grenard 254f2848aa docs: remove new sponsor link (broken) [skip ci] 2022-02-17 20:22:08 +08:00
louistiti 4a5480a3cc docs: in GitHub BUG.md from modules to skills 2022-02-17 20:17:46 +08:00
louistiti b775ec4e9d refactor: continue from modules to skills transition 2022-02-17 20:10:42 +08:00
louistiti 51f14320e9 refactor(server): synchronizer due to modules to skills refactoring 2022-02-17 08:27:25 +08:00
louistiti ef0c54b226 fix(server): fallback due to modules to skills refactoring 2022-02-17 08:20:48 +08:00
louistiti cad072c3a6 refactor: skills over HTTP 2022-02-16 22:28:05 +08:00
louistiti 963e4de8df refactor: setup skills config with skill friendly name naming 2022-02-16 21:16:57 +08:00
louistiti dc80135cd0 refactor: setup skills config 2022-02-16 21:08:47 +08:00
louistiti 7d5cadbb82 Merge remote-tracking branch 'origin/develop' into from-modules-to-skills 2022-02-15 23:51:22 +08:00
Louis Grenard 1a118b718e docs: change @FluxIndustries sponsorship [skip ci] 2022-02-15 23:46:37 +08:00
louistiti 08e6c9de54 refactor(skill/todo_list): add French NLG 2022-02-15 22:42:10 +08:00
louistiti 2b547c304b refactor(skill/todo_list): NLG level 2022-02-15 22:26:06 +08:00
louistiti 42e2346663 refactor(skill/todo_list): from modules to skills add custom functions 2022-02-15 21:05:40 +08:00
louistiti 0e3555f1e3 refactor(server): from modules to skills for the connection between core and skills 2022-02-14 23:06:37 +08:00
louistiti 0fc475e572 refactor(server): from modules to skills for the brain 2022-02-14 17:19:51 +08:00
louistiti e4d3904cee fix(server): NER due to modules to skills refactoring 2022-02-14 16:48:03 +08:00
louistiti 65398d8231 Merge branch 'develop' into from-modules-to-skills 2022-02-14 14:45:16 +08:00
Louis Grenard 9a604d7ccc docs: add @FluxIndustries sponsor [skip ci] 2022-02-14 11:44:25 +08:00
louistiti d8023308d0 feat: new NLP training 2022-02-13 12:20:27 +08:00
louistiti db1246735c refactor(skill/todo_list): replace <strike> by <s> 2022-02-13 07:54:51 +08:00
louistiti fe90c68ea0 feat(server): bootstrap skill structure 2022-02-13 07:48:45 +08:00
louistiti 18286800ed refactor(server): keep STT and TTS inside the brain 2022-02-13 05:39:17 +08:00
louistiti f24513a223 feat(server): on-the-fly language switching 2022-02-13 01:42:29 +08:00
louistiti 5edcc679f8 chore(server): remove uncessary NLP deps 2022-02-12 19:11:53 +08:00
louistiti 34b2aa5655 feat(server): new NLP containers 2022-02-12 19:10:27 +08:00
louistiti ca3f5f42da feat(server): (WIP) NLU refactoring 2022-02-11 21:34:39 +08:00
louistiti 763d19069b refactor(server): expressions to utterance samples 2022-02-10 22:11:17 +08:00
louistiti 8dd7642d3b refactor(server): queries to intents 2022-02-10 21:49:51 +08:00
louistiti 226468f6ab refactor(server): query to utterance 2022-02-10 21:47:43 +08:00
louistiti cf2a28aac2 feat(server): add skills domains 2022-02-09 22:47:52 +08:00
louistiti a0107d6294 docs: new #LeonAI link [skip ci] 2022-02-09 00:19:09 +08:00
louistiti 94eebbbf20 chore: add tag prefix on new version on changelog diff URL [skip ci] 2022-02-08 11:09:09 +08:00
louistiti e14c249826 docs: changelog new version diff link fix [skip ci] 2022-02-08 11:05:04 +08:00
louistiti 5544c3c5a2 chore: bump 1.0.0-beta.7+dev 2022-02-07 17:10:35 +08:00
louistiti 6862778645 build: release 1.0.0-beta.6 2022-02-07 17:03:15 +08:00
louistiti d265377a43 fix: do not ask to regenerate the HTTP API key if this one isn't available yet 2022-02-04 14:02:07 +08:00
louistiti 36b0f68afc Merge branch 'skip-pip-deps' into develop 2022-02-04 13:48:05 +08:00
louistiti c6c0129158 fix: Python deps tree check 2022-02-04 13:44:40 +08:00
louistiti 2d0b0f1365 perf: check if Python deps tree has been updated before going through deps install 2022-02-04 13:33:32 +08:00
Louis Grenard 699ded22ad docs: add new sponsor @KeithIMyers 2022-02-04 10:22:52 +08:00
louistiti 5d58f5d918 ci: fix over HTTP test 2022-02-03 22:05:09 +08:00
louistiti 553d5df070 ci: over HTTP test 2022-02-03 22:02:13 +08:00
louistiti 4e4d1cc136 ci: add over HTTP tests 2022-02-03 21:52:37 +08:00
louistiti 6b9d53e0cc Merge branch 'over-http' into develop 2022-02-03 21:47:00 +08:00
louistiti 7bdbd0dcd0 chore: more explicit comment on over HTTP test 2022-02-03 21:46:13 +08:00
louistiti 58f5f2d21c test(server): add minimal e2e tests for over HTTP 2022-02-03 21:44:49 +08:00
louistiti aa0136baec test(server): e2e modules fix due to breaking changes 2022-02-03 20:42:31 +08:00
louistiti 1535fa67ac test(server): over HTTP unit testing 2022-02-03 19:37:56 +08:00
louistiti 62eadb10d4 docs: use leon-cli for bugs related to setup 2022-02-03 11:28:15 +08:00
louistiti af26ecac0f refactor(server): rename query HTTP endpoint from /api/core/query to /api/query 2022-02-02 20:32:08 +08:00
louistiti f61eef4882 refactor(server): rename over HTTP option toggle 2022-02-02 19:52:41 +08:00
louistiti 5c88c134f4 Merge branch 'develop' into over-http 2022-02-02 18:37:00 +08:00
louistiti 7039918760 feat(server): make Coqui STT the default STT solution 2022-01-31 14:43:54 +08:00
louistiti 79be099cc5 chore: remove DeepSpeech binary folder; add Coqui binary folder to gitignore 2022-01-31 14:11:48 +08:00
Louis Grenard 4d644ce3fd Merge branch 'develop' into develop 2022-01-31 06:10:57 +00:00
johba f563d01d07 fix: hotword offline (#342) 2022-01-31 12:09:54 +08:00
louistiti bd53641a81 docs: add Divlo to the README 2022-01-31 10:01:09 +08:00
louistiti b9b204d212 Merge branch 'cli-arrival' into develop 2022-01-29 21:10:58 +08:00
louistiti 3ec38bfb6b refactor(server): add /api/ on HTTP API endpoints 2022-01-28 18:34:35 +08:00
louistiti 706c528334 chore: remove npm dep vulns 2022-01-25 23:31:54 +08:00
louistiti 429dce6f37 Merge branch 'develop' into cli-arrival 2022-01-25 21:49:40 +08:00
louistiti bfc50154f0 docs(README): change new npm setup with npm registry 2022-01-25 21:48:20 +08:00
louistiti 3ce5b74e94 Merge branch 'develop' into over-http 2022-01-25 20:21:10 +08:00
louistiti 93a138f77c chore: use jsconfig instead of IDE config 2022-01-25 20:20:49 +08:00
Johann Barbie b1c6f5c883 fix: addressed comments by @JRMeyer 2022-01-24 08:20:04 +01:00
Johann Barbie 04d6228841 fix: allow to detect STT offline capabilities 2022-01-23 18:00:06 +01:00
Johann Barbie 86a4816b77 feat: simple coqui-ai stt integration 2022-01-23 12:50:51 +01:00
louistiti cdf4149939 feat(server): add HTTP API key middleware 2022-01-18 21:57:35 +08:00
louistiti e6246d1f8f fix: Amazon Polly is always configured on check script due to new structure 2022-01-17 21:46:08 +08:00
louistiti d10a7fa788 feat: HTTP API key generator 2022-01-16 22:22:49 +08:00
louistiti b6428d0384 feat(server): expose queries over HTTP 2022-01-10 22:37:54 +08:00
louistiti 115f9c1645 feat(server): add timeout action over HTTP 2022-01-09 21:22:24 +08:00
louistiti 82fb967af8 feat(server): handle built-in and trim entities over HTTP + add "disabled" HTTP API action option 2022-01-09 21:03:28 +08:00
louistiti 2e5b2c59da feat(server): execute modules over HTTP 2022-01-09 02:32:02 +08:00
louistiti cc0fb92351 feat: avoid unnecessary routes generation 2022-01-08 19:55:26 +08:00
louistiti 5b41713a68 feat(server): generate Fastify routes on the file to expose packages over HTTP 2021-12-30 23:06:30 +08:00
louistiti f1f48757e2 docs: fix changelog tags diff 2021-12-28 22:02:58 +08:00
louistiti 8e45da75ce chore: bump 1.0.0-beta.6+dev 2021-12-28 21:33:06 +08:00
louistiti 38d0436101 build: release 1.0.0-beta.5 2021-12-28 21:26:00 +08:00
louistiti 89e216fd49 ci: remove unecessary step on lint 2021-12-28 21:06:48 +08:00
louistiti 7cf7f97912 feat(server): support arrays on NER between conditions 2021-12-28 18:08:13 +08:00
louistiti 10f3132d09 ci: disable Husky on lint 2021-12-27 23:09:30 +08:00
louistiti c86a0df3f4 chore: resetup Husky 2021-12-27 22:57:06 +08:00
louistiti 99e111b52d chore: fix deep deps vulns 2021-12-27 20:03:06 +08:00
louistiti d23ea0e289 chore: upgrade Socket.IO deps to latest 2021-12-27 19:46:18 +08:00
louistiti da2ebdb520 chore: upgrade Fastify deps to latest 2021-12-27 19:18:40 +08:00
louistiti dc2d36be95 chore: upgrade ffmpeg/ffprobe deps to latest 2021-12-27 19:05:52 +08:00
louistiti 02f766d6a8 fix: jest-extended new setup due to latest update 2021-12-27 19:02:46 +08:00
louistiti c73a26a11e chore: upgrade Vite to latest 2021-12-27 18:39:30 +08:00
louistiti aa9a494a4b chore: upgrade Jest deps to latest 2021-12-27 18:37:42 +08:00
louistiti 920b4b2a4f fix: linter 2021-12-27 18:02:32 +08:00
louistiti 13f5a49f67 perf: Windows setup on DeepSpeech dep removal 2021-12-27 17:54:50 +08:00
louistiti ddfebb0d74 refactor: remove training type 2021-12-27 17:09:12 +08:00
louistiti a5769dce6e refactor(web app): change listen mic shortcut 2021-12-27 14:58:04 +08:00
louistiti b09eaed63d docs(README): modify newsletter link 2021-12-24 09:20:44 +08:00
Louis Grenard a0dffbedb1 docs(README): add new sponsor 2021-12-21 22:28:15 +08:00
louistiti b4bb48def0 docs: append leon check alternative while reporting issue 2021-12-12 15:58:51 +08:00
louistiti 97b5e2086b docs(README): new getting started with CLI arrival 2021-12-12 15:50:25 +08:00
louistiti c16d5b280b docs: URL redirect managed by registrar 2021-12-12 12:31:22 +08:00
Louis Grenard 065225a7f5 docs(README): add special thanks 2021-12-07 22:44:22 +08:00
Louis Grenard acf3f9a0d2 docs(README): fix hero animation 2021-12-05 23:24:42 +08:00
Louis Grenard 607a51eead docs(README): update main asset link 2021-12-05 21:18:47 +08:00
Louis Grenard 1e612f766e docs(README): new assets 2021-12-05 21:13:44 +08:00
Louis Grenard b3affa0fc1 docs: update sponsors in README.md 2021-11-09 20:48:59 +08:00
Divlo 2f66f1c17b refactor: prerequisites Node.js >= 16.0.0 and npm >= 8.0.0 (#322)
BREAKING CHANGE: minimum supported Node.js v16.0.0 and npm v8.0.0
2021-11-07 10:24:00 +08:00
louistiti cf6d7d0749 docs: add new sponsor to README 2021-08-17 23:43:01 +08:00
Louis Grenard d13a9e3aa7 docs: add new sponsor to README 2021-08-07 17:54:16 +08:00
dependabot[bot] 2ee57490df chore(deps-dev): bump @babel/preset-env from 7.14.4 to 7.14.5 (#273) 2021-06-13 02:23:02 +02:00
dependabot[bot] 7852b8dbac chore(deps): bump dotenv from 8.2.0 to 10.0.0 (#275) 2021-06-13 02:05:26 +02:00
dependabot[bot] de7c3ad68e chore(deps): bump fastify from 3.14.0 to 3.17.0 (#271) 2021-06-13 02:00:45 +02:00
louistiti 37946b6a90 docs: add sponsoring purposes 2021-06-05 23:08:10 +08:00
dependabot[bot] a7ffdd19bd chore(deps): bump @aws-sdk/client-polly from 3.16.0 to 3.18.0 (#269)
Bumps [@aws-sdk/client-polly](https://github.com/aws/aws-sdk-js-v3/tree/HEAD/clients/client-polly) from 3.16.0 to 3.18.0.
- [Release notes](https://github.com/aws/aws-sdk-js-v3/releases)
- [Changelog](https://github.com/aws/aws-sdk-js-v3/blob/main/clients/client-polly/CHANGELOG.md)
- [Commits](https://github.com/aws/aws-sdk-js-v3/commits/v3.18.0/clients/client-polly)

---
updated-dependencies:
- dependency-name: "@aws-sdk/client-polly"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Louis Grenard <louis.grenard@gmail.com>
2021-06-05 09:21:14 +08:00
dependabot[bot] 6b23d23b06 chore(deps): bump ibm-watson from 6.1.0 to 6.1.1 (#266)
Bumps [ibm-watson](https://github.com/watson-developer-cloud/node-sdk) from 6.1.0 to 6.1.1.
- [Release notes](https://github.com/watson-developer-cloud/node-sdk/releases)
- [Changelog](https://github.com/watson-developer-cloud/node-sdk/blob/master/CHANGELOG.md)
- [Commits](https://github.com/watson-developer-cloud/node-sdk/compare/v6.1.0...v6.1.1)

---
updated-dependencies:
- dependency-name: ibm-watson
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Louis Grenard <louis.grenard@gmail.com>
2021-06-05 09:19:06 +08:00
dependabot[bot] 9381fb2916 chore(deps-dev): bump inquirer from 8.0.0 to 8.1.0 (#265)
Bumps [inquirer](https://github.com/SBoudrias/Inquirer.js) from 8.0.0 to 8.1.0.
- [Release notes](https://github.com/SBoudrias/Inquirer.js/releases)
- [Commits](https://github.com/SBoudrias/Inquirer.js/compare/inquirer@8.0.0...inquirer@8.1.0)

---
updated-dependencies:
- dependency-name: inquirer
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Louis Grenard <louis.grenard@gmail.com>
2021-06-05 09:17:42 +08:00
dependabot[bot] 2f1266764a chore(deps-dev): bump eslint from 7.26.0 to 7.28.0 (#268)
Bumps [eslint](https://github.com/eslint/eslint) from 7.26.0 to 7.28.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v7.26.0...v7.28.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-06-05 09:16:05 +08:00
dependabot[bot] e3427149f6 chore(deps-dev): bump @babel/cli from 7.13.0 to 7.14.3 (#263)
Bumps [@babel/cli](https://github.com/babel/babel/tree/HEAD/packages/babel-cli) from 7.13.0 to 7.14.3.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.14.3/packages/babel-cli)

---
updated-dependencies:
- dependency-name: "@babel/cli"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-06-05 09:13:00 +08:00
louistiti 3b47cb5ee8 docs: trim .html ext 2021-05-31 07:53:49 +08:00
louistiti cd607768ed docs: edit sponsor links 2021-05-30 23:22:03 +08:00
louistiti fbbcf2eb50 docs: add sponsor button 2021-05-30 22:25:03 +08:00
louistiti 4128c3a01a chore: fix npm deps vulns 2021-05-29 09:54:53 +08:00
dependabot[bot] 2044de408c chore(deps-dev): bump @babel/node from 7.13.0 to 7.14.2 (#261)
Bumps [@babel/node](https://github.com/babel/babel/tree/HEAD/packages/babel-node) from 7.13.0 to 7.14.2.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.14.2/packages/babel-node)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Louis Grenard <louis.grenard@gmail.com>
2021-05-29 09:52:46 +08:00
dependabot[bot] d002610ac7 chore(deps-dev): bump eslint-plugin-jest from 24.3.1 to 24.3.6 (#260)
Bumps [eslint-plugin-jest](https://github.com/jest-community/eslint-plugin-jest) from 24.3.1 to 24.3.6.
- [Release notes](https://github.com/jest-community/eslint-plugin-jest/releases)
- [Changelog](https://github.com/jest-community/eslint-plugin-jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/jest-community/eslint-plugin-jest/compare/v24.3.1...v24.3.6)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Louis Grenard <louis.grenard@gmail.com>
2021-05-29 09:51:05 +08:00
dependabot[bot] 5066895827 chore(deps-dev): bump @babel/preset-env from 7.13.9 to 7.14.4 (#259)
Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.13.9 to 7.14.4.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.14.4/packages/babel-preset-env)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Louis Grenard <louis.grenard@gmail.com>
2021-05-29 09:49:51 +08:00
dependabot[bot] 19cd427daa chore(deps-dev): bump vite from 2.3.2 to 2.3.4 (#258)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 2.3.2 to 2.3.4.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v2.3.4/packages/vite)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Louis Grenard <louis.grenard@gmail.com>
2021-05-29 09:48:22 +08:00
dependabot[bot] fa3eefb220 chore(deps): bump ibm-watson from 6.0.3 to 6.1.0 (#257)
Bumps [ibm-watson](https://github.com/watson-developer-cloud/node-sdk) from 6.0.3 to 6.1.0.
- [Release notes](https://github.com/watson-developer-cloud/node-sdk/releases)
- [Changelog](https://github.com/watson-developer-cloud/node-sdk/blob/master/CHANGELOG.md)
- [Commits](https://github.com/watson-developer-cloud/node-sdk/compare/v6.0.3...v6.1.0)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-05-29 09:46:31 +08:00
louistiti 1775b07bf6 ci: set npm and pipenv caching 2021-05-22 09:37:13 +08:00
dependabot[bot] 1ce04224b2 chore(deps-dev): bump semver from 7.3.4 to 7.3.5 (#255)
Bumps [semver](https://github.com/npm/node-semver) from 7.3.4 to 7.3.5.
- [Release notes](https://github.com/npm/node-semver/releases)
- [Changelog](https://github.com/npm/node-semver/blob/master/CHANGELOG.md)
- [Commits](https://github.com/npm/node-semver/compare/v7.3.4...v7.3.5)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Louis Grenard <louis.grenard@gmail.com>
2021-05-22 09:22:06 +08:00
dependabot[bot] b39d441177 chore(deps): bump archiver from 5.2.0 to 5.3.0 (#254)
Bumps [archiver](https://github.com/archiverjs/node-archiver) from 5.2.0 to 5.3.0.
- [Release notes](https://github.com/archiverjs/node-archiver/releases)
- [Changelog](https://github.com/archiverjs/node-archiver/blob/master/CHANGELOG.md)
- [Commits](https://github.com/archiverjs/node-archiver/compare/5.2.0...5.3.0)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Louis Grenard <louis.grenard@gmail.com>
2021-05-22 09:21:42 +08:00
dependabot[bot] ad701e12a9 chore(deps): upgrade Socket.IO to 4.1.2 (#253)
* chore(deps): bump socket.io-client from 4.1.1 to 4.1.2

Bumps [socket.io-client](https://github.com/socketio/socket.io-client) from 4.1.1 to 4.1.2.
- [Release notes](https://github.com/socketio/socket.io-client/releases)
- [Changelog](https://github.com/socketio/socket.io-client/blob/master/CHANGELOG.md)
- [Commits](https://github.com/socketio/socket.io-client/compare/4.1.1...4.1.2)

Signed-off-by: dependabot[bot] <support@github.com>

* chore: upgrade Socket.IO to 4.1.2

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Louis Grenard <louis.grenard@gmail.com>
2021-05-22 09:21:00 +08:00
dependabot[bot] d60eebd2a0 chore(deps-dev): bump eslint-import-resolver-babel-module (#252)
Bumps [eslint-import-resolver-babel-module](https://github.com/tleunen/eslint-import-resolver-babel-module) from 5.2.0 to 5.3.1.
- [Release notes](https://github.com/tleunen/eslint-import-resolver-babel-module/releases)
- [Changelog](https://github.com/tleunen/eslint-import-resolver-babel-module/blob/master/CHANGELOG.md)
- [Commits](https://github.com/tleunen/eslint-import-resolver-babel-module/compare/v5.2.0...v5.3.1)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-05-22 09:16:49 +08:00
louistiti 68b86e1eae chore: upgrade Vite to latest 2021-05-17 11:47:31 +08:00
louistiti e780868004 chore: audit fix lock file 2021-05-17 11:18:43 +08:00
dependabot[bot] 68bcb4269a chore(deps-dev): bump eslint from 7.21.0 to 7.26.0 (#249)
Bumps [eslint](https://github.com/eslint/eslint) from 7.21.0 to 7.26.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v7.21.0...v7.26.0)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Louis Grenard <louis.grenard@gmail.com>
2021-05-17 11:11:32 +08:00
dependabot[bot] 1ee2ffed4b chore: upgrade Socket.IO to latest (#248)
* chore(deps): bump socket.io-client from 4.0.0 to 4.1.1

Bumps [socket.io-client](https://github.com/socketio/socket.io-client) from 4.0.0 to 4.1.1.
- [Release notes](https://github.com/socketio/socket.io-client/releases)
- [Changelog](https://github.com/socketio/socket.io-client/blob/master/CHANGELOG.md)
- [Commits](https://github.com/socketio/socket.io-client/compare/4.0.0...4.1.1)

Signed-off-by: dependabot[bot] <support@github.com>

* chore: upgrade Socket.IO to latest

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Louis Grenard <louis.grenard@gmail.com>
2021-05-17 11:10:24 +08:00
dependabot[bot] b178a3a8dd chore(deps): bump @google-cloud/text-to-speech from 3.1.3 to 3.2.1 (#247)
Bumps [@google-cloud/text-to-speech](https://github.com/googleapis/nodejs-text-to-speech) from 3.1.3 to 3.2.1.
- [Release notes](https://github.com/googleapis/nodejs-text-to-speech/releases)
- [Changelog](https://github.com/googleapis/nodejs-text-to-speech/blob/master/CHANGELOG.md)
- [Commits](https://github.com/googleapis/nodejs-text-to-speech/compare/v3.1.3...v3.2.1)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Louis Grenard <louis.grenard@gmail.com>
2021-05-17 11:05:23 +08:00
dependabot[bot] 3dba8fd713 chore(deps-dev): bump eslint-plugin-import from 2.22.1 to 2.23.2 (#246)
Bumps [eslint-plugin-import](https://github.com/benmosher/eslint-plugin-import) from 2.22.1 to 2.23.2.
- [Release notes](https://github.com/benmosher/eslint-plugin-import/releases)
- [Changelog](https://github.com/benmosher/eslint-plugin-import/blob/master/CHANGELOG.md)
- [Commits](https://github.com/benmosher/eslint-plugin-import/compare/v2.22.1...v2.23.2)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Louis Grenard <louis.grenard@gmail.com>
2021-05-17 11:02:33 +08:00
dependabot[bot] 621fd48591 chore(deps): bump @aws-sdk/client-polly from 3.8.0 to 3.16.0 (#245)
Bumps [@aws-sdk/client-polly](https://github.com/aws/aws-sdk-js-v3/tree/HEAD/clients/client-polly) from 3.8.0 to 3.16.0.
- [Release notes](https://github.com/aws/aws-sdk-js-v3/releases)
- [Changelog](https://github.com/aws/aws-sdk-js-v3/blob/main/clients/client-polly/CHANGELOG.md)
- [Commits](https://github.com/aws/aws-sdk-js-v3/commits/v3.16.0/clients/client-polly)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-05-17 10:58:57 +08:00
louistiti b30940b9fa chore: add dependabot 2021-05-17 10:34:19 +08:00
Divlo 72ed68599c chore(docker-dev): ignore node_modules in the volume (#243) 2021-05-08 10:37:26 +08:00
louistiti 5f9e9b5ad4 chore: bump 1.0.0-beta.5+dev 2021-05-01 21:40:09 +08:00
louistiti 28326ae1cd build: release 1.0.0-beta.4 2021-05-01 21:34:00 +08:00
Divlo ede7e78bd6 chore(docker): fix docker in dev env and fix wrong LEON_PORT (#240)
* chore(docker-dev): ignore node_modules in the volume

* chore(docker): fix wrong LEON_PORT env variable
2021-04-28 12:01:26 +08:00
Divlo a576ecfc7d chore: add Gitpod (#238)
* chore: add Gitpod

* docs: add single-click setup with Gitpod

Co-authored-by: louistiti <louis.grenard@gmail.com>
2021-04-23 10:20:16 +08:00
louistiti e09e9b02e8 test(package/checker): use another domain name to test down domain on isitdown module 2021-04-22 19:06:02 +08:00
louistiti 0c925626df fix(package/network): make use of new compatible speedtest lib 2021-04-22 19:02:26 +08:00
louistiti 9323de930e docs: add specific branch on status badges 2021-04-22 16:52:40 +08:00
helloausrine 5da91b76bf docs(readme): highlight the name of Leon (#144) 2021-04-06 10:18:47 +02:00
Louis Grenard 3f5d4c9d78 Merge pull request #231 from leon-ai/chore/improve-docker
chore: add docker-compose and dev environment
2021-04-06 09:59:15 +08:00
divlo 062ff4f75b chore: add docker-compose and dev environment 2021-04-05 17:47:34 +02:00
louistiti 3b976d55b4 chore: run cleaning test module DBs script before running e2e modules tests 2021-04-05 14:16:31 +08:00
louistiti 72e46bd6c1 docs: add minimum Pipenv version requirement to README 2021-04-05 13:42:46 +08:00
louistiti 8c715e82bf Merge branch 'modules-testing-dbs' into develop 2021-04-05 11:47:02 +08:00
louistiti 81ec213ff2 chore: use different modules DBs while testing and flush them at the end of the tests 2021-04-05 11:46:42 +08:00
louistiti 0f02e5b9dc chore: add Python config in EditorConfig 2021-04-04 12:41:25 +08:00
louistiti 122a52dd40 Merge branch 'broken-links-hunt' into develop 2021-04-04 10:31:58 +08:00
louistiti b2a2279243 docs: hunt broken links 2021-04-04 10:31:40 +08:00
louistiti 86dd7fae91 chore: force Jest to exit if a process is still running 2021-04-03 11:43:55 +08:00
louistiti 4cddb702f2 Merge branch 'wip-new-nlp' into develop 2021-04-03 11:09:17 +08:00
louistiti 9891d3058e test(network/speedtest): replace NLP utterance 2021-04-03 11:08:57 +08:00
louistiti e1d5bed3e6 fix(server): make use of Basic plugin from the main NLP container 2021-04-03 10:59:07 +08:00
louistiti 18edc68dfb chore(server): upgrade @nlpjs/ner to latest 2021-04-02 19:52:17 +08:00
louistiti fcdc0820cf test(server): adjust server unit tests 2021-04-02 19:02:37 +08:00
louistiti f9b67badd8 Merge branch 'wip-new-nlp' into develop 2021-04-02 17:34:42 +08:00
louistiti 6501a2f6c4 test(server): review according to new NLP 2021-04-02 17:32:23 +08:00
louistiti 71d80f3407 refactor(server): remove unnecessary NLP settings 2021-04-01 17:39:07 +08:00
louistiti 99dba81122 refactor(server): switch from classifier to NLP model 2021-04-01 17:24:59 +08:00
louistiti ed7f0bf455 refactor(server): make new NLU and NER compatible 2021-04-01 17:07:09 +08:00
louistiti 09e2672b0b docs: add "ci" commit type in CONTRIBUTING.md 2021-04-01 09:25:02 +08:00
Louis Grenard 71d2b7e440 Merge pull request #233 from leon-ai/ci/update-event
ci: update event that triggers the workflow
2021-04-01 09:01:03 +08:00
divlo 5d425eab17 ci: update event that triggers the workflow 2021-03-31 19:15:29 +02:00
louistiti cc0c4bee10 chore: create .nvmrc with latest LTS version 2021-03-28 13:21:32 +08:00
louistiti 05a6c66205 chore: force mimimun Node.js requirement 2021-03-28 13:20:06 +08:00
louistiti 23353b5227 chore: set new Python dependencies tree 2021-03-28 13:07:06 +08:00
louistiti 8a9f018b18 refactor(server): make use of NLP sub package instead of the monolith one 2021-03-28 13:02:54 +08:00
louistiti 6b01262fa0 chore(server): make use of @nlpjs/core-loader instead of @nlpjs/core 2021-03-26 20:15:10 +08:00
Louis Grenard 114579008d Merge pull request #227 from Divlo/chore/migrate-from-express-to-fastify
refactor: migrate from Express.js to Fastify
2021-03-25 14:45:43 +08:00
louistiti da592f4413 refactor(server): adapt to new NER 2021-03-24 20:26:34 +08:00
divlo 690f1841d6 fix: set correct status code for GET /downloads 2021-03-22 21:09:43 +01:00
divlo 458ff938fc docs(readme): add link to npm 2021-03-22 20:24:06 +01:00
divlo dd827bf61b ci: add build and tests on pull_request 2021-03-22 20:23:43 +01:00
divlo 71f47ef898 chore: migrate from express to fastify 2021-03-22 20:23:23 +01:00
louistiti 37165ef658 chore: lock files update 2021-03-22 09:41:30 +08:00
louistiti 17d547c6c6 chore: upgrade node-nlp to latest 2021-03-22 09:26:20 +08:00
louistiti 83dff5b47b chore: disable Jest notifications 2021-03-21 15:09:18 +08:00
louistiti 525a8bab8c docs: change license badge in README 2021-03-21 15:08:20 +08:00
louistiti 8c29dce0c6 chore: migrate from CircleCI to GitHub Actions 2021-03-21 14:58:14 +08:00
louistiti cd570de43b Merge branch 'haveibeenpwned-module-api-v3' into develop 2021-03-16 23:01:56 +08:00
louistiti 0ca89fe32d BREAKING(checker/haveibeenpwned): introduce v3 API with API key 2021-03-16 23:01:22 +08:00
louistiti a42ecb4288 fix(web app): add back the main.js file 2021-03-16 21:39:47 +08:00
louistiti b508f95b2f Merge branch 'pipenv-skip-lock' into develop 2021-03-16 21:38:30 +08:00
louistiti c6f1126a5c chore: remove --skip-lock on pipenv install 2021-03-16 21:28:59 +08:00
louistiti 3082866601 Merge branch 'beautify-readme' into develop 2021-03-16 21:21:18 +08:00
louistiti 8f894ea256 docs: replace roadmap emoji with compass in README 2021-03-16 21:20:49 +08:00
louistiti 0ea7a78b7c docs: use emojies in README 2021-03-16 21:16:17 +08:00
louistiti 1977119ddb chore(hotword): upgrade socket.io-client to 4.0.0 2021-03-16 15:04:09 +08:00
louistiti f1cf7328b5 Merge branch 'vite-app' into develop 2021-03-16 11:21:43 +08:00
louistiti a777ce36af style: fix new linting 2021-03-16 01:39:52 +08:00
louistiti 6849e9fc2e refactor(web app): remove vendor static Socket.IO client 2021-03-16 01:14:32 +08:00
louistiti 00c475ea00 refactor(web app): introduce Vite 2021-03-16 01:11:40 +08:00
louistiti 77e5357c0a refactor(server): specify CORS parameter in dev app mode due to Socket.IO 3+ 2021-03-15 17:14:10 +08:00
louistiti e104bb1eeb docs: remove target="_blank" attribute from the README 2021-03-13 17:08:55 +08:00
louistiti 2f5426db29 docs: open new tab for external GitHub URLs in README header 2021-03-13 17:06:07 +08:00
louistiti c55c7532b2 docs: add social badges to README 2021-03-13 16:59:52 +08:00
louistiti d1034bd135 docs: Node.js 14 requirement 2021-03-13 15:48:33 +08:00
louistiti 11c307174b chore: upgrade to custom fork hotword 2021-03-13 15:17:11 +08:00
louistiti 5e7706390c chore: use node:14-alpine in Dockerfile 2021-03-07 12:39:07 +08:00
louistiti 4c126848ee chore: upgrade node-nlp to latest 2021-03-07 12:15:06 +08:00
louistiti e50b0e4833 chore: upgrade @ffprobe-installer/ffprobe to latest 2021-03-07 10:17:10 +08:00
louistiti 96488935a6 chore: upgrade @ffmpeg-installer/ffmpeg to latest 2021-03-07 10:01:41 +08:00
louistiti 631c28db94 style(server): remove unecessary console.log() from DeepSpeech parser 2021-03-06 13:08:02 +08:00
louistiti 297fd75ced refactor(server): offline text-to-speech with latest DeepSpeech model 2021-03-06 13:04:24 +08:00
louistiti f15f2db78e BREAKING(server): AWS SDK new structure due to v3 and adapt Amazon Polly changes 2021-03-06 11:09:32 +08:00
louistiti 2668c29588 BREAKING(server): use complete IBM Watson URL instead of location 2021-03-05 17:42:24 +08:00
louistiti f41ea0e9a1 BREAKING(server): IBM Watson TTS and STT new structure 2021-03-05 16:41:25 +08:00
louistiti 9f338a16b3 refactor(app): use right Socket.IO client files for version 3.1.2 2021-03-05 13:32:14 +08:00
louistiti 26c43e05f4 chore: upgrade @google-cloud/speech to latest 2021-03-05 13:10:43 +08:00
louistiti f3bc04da69 chore: upgrade @google-cloud/text-to-speech to latest 2021-03-05 13:08:29 +08:00
louistiti 9b897e1b85 chore: upgrade googleapis to latest 2021-03-05 12:53:57 +08:00
louistiti b43caafe09 chore: upgrade archiver to latest 2021-03-05 12:48:31 +08:00
louistiti 1d8be0226b chore: ugrade async to latest 2021-03-05 12:47:01 +08:00
louistiti b6a89f7c34 chore: upgrade body-parser to latest 2021-03-05 12:43:45 +08:00
louistiti 05f9118a25 chore: upgrade cross-env to latest 2021-03-05 12:35:27 +08:00
louistiti 44e664d94e chore: upgrade dotenv to latest 2021-03-05 12:32:27 +08:00
louistiti f5debe3bb5 chore: upgrade execa to latest and adapt to new API 2021-03-04 22:49:52 +08:00
louistiti 0fce6a1574 chore: upgrade express to latest 2021-03-04 20:31:04 +08:00
louistiti 1e1e85b7b8 chore: upgrade moment-timezone to latest 2021-03-04 20:28:56 +08:00
louistiti c02f35b4c2 chore: upgrade superagent to latest 2021-03-04 20:24:48 +08:00
louistiti 636602750a test(server): fix removed require.requireActual() to jest.requireActual 2021-03-04 20:17:16 +08:00
louistiti 340054d8a7 chore: upgrade all Jest dependencies 2021-03-04 20:16:06 +08:00
louistiti 4d08fd0498 chore: upgrade nodemon to latest 2021-03-04 20:04:24 +08:00
louistiti 4ff9eb4b64 chore: upgrade json and git-changelog to latest 2021-03-04 20:01:00 +08:00
louistiti 23bb3b64d9 chore: upgrade semver to latest 2021-03-04 19:56:26 +08:00
louistiti 7cebaaef96 chore: upgrade inquirer to latest 2021-03-04 19:45:18 +08:00
louistiti 7b74c0337b chore: remove commit-msg git hook script 2021-03-04 19:42:12 +08:00
louistiti c8b7ba1256 chore: remove husky 2021-03-04 19:38:44 +08:00
louistiti a18240d53f docs: remove focus on another project from the README 2021-03-04 09:51:25 +08:00
louistiti bc28c2ce79 chore: upgrade cli-spinner to latest 2021-03-04 09:41:41 +08:00
louistiti a17b63b444 chore: upgrade browserify to latest 2021-03-04 09:39:47 +08:00
louistiti c93f2bef9e chore: upgrade shx to latest (solve build warnings) 2021-03-04 09:36:18 +08:00
louistiti bfa1f1daaf chore: upgrade Babel to latest 2021-03-04 09:30:01 +08:00
louistiti cae620bfad refactor(server): latest Socket.IO version structure 2021-03-03 21:33:08 +08:00
louistiti 5cbed51e16 chore: upgrade most of the unsecured dependencies 2021-03-03 20:05:52 +08:00
louistiti 309730e1e9 chore: upgrade ESLint to latest 2021-03-03 17:14:57 +08:00
louistiti 0e093da5af chore: remove strict mode 2021-03-03 17:09:31 +08:00
louistiti 89778e1921 Merge branch 'basic-cleanup' into develop 2021-03-02 17:07:02 +08:00
louistiti 52e0682fc6 chore: bump to 1.0.0-beta.4+dev 2021-03-02 17:05:04 +08:00
louistiti 328eeff144 style: semicolons and comments clean up 2021-03-02 17:02:55 +08:00
Louis Grenard 9daa1a7630 docs: update readme 2019-07-11 20:16:15 +08:00
Louis Grenard 344cc11ac5 docs: mention that I'm focusing on 2aud.io for a while 2019-07-11 19:34:35 +08:00
Louistiti 56c7cb25cb fix(server): DeepSpeech setup on 0.5.0 2019-06-18 20:53:20 +02:00
Louistiti eda7189f40 docs: support for Node.js 12 2019-06-18 20:48:40 +02:00
Louistiti 88bdb3634e Merge branch 'deepspeech-0.5.0' into develop 2019-06-18 20:22:48 +02:00
Louistiti ca3d3b169c refactor(server): Google Cloud TTS French voice to WaveNet 2019-06-18 18:21:10 +02:00
Louistiti b9f4079bda chore: upgrade DeepSpeech to 0.5.0 2019-06-18 18:13:03 +02:00
Louistiti 6841493740 fix(package/trend): GitHub module new scraping 2019-06-17 18:08:20 +02:00
Louis Grenard 22a3b223ab Merge pull request #110 from Imperator26/develop
fix(package/leon): Fixes english translations
2019-06-10 22:59:12 +08:00
SuperHelios 90225707f9 fix(package/leon): Fixes english translations 2019-06-09 13:13:54 +02:00
Louistiti 08bdae5bca refactor: delete utils.info() in favor of utils.getqueryobj() 2019-06-09 07:42:02 +08:00
Louistiti a72348602e refactor(package/calendar): edit To-Do List module answers and expressions 2019-06-08 22:29:00 +08:00
Louistiti 824ac45f24 chore(hotword): new French model 2019-06-08 21:35:48 +08:00
Louistiti 1e95d0abfd refactor(web app): enable sound on After Speech option 2019-06-08 20:43:44 +08:00
Louistiti 6b25106f56 Merge remote-tracking branch 'origin/develop' into develop 2019-06-08 20:11:27 +08:00
Louistiti 77669cf3aa refactor: major improvement of the After Speech feature 2019-06-08 20:11:02 +08:00
Louis Grenard 02541933ba docs: fix FUNDING.yml 2019-06-08 17:23:27 +08:00
Louistiti 3e133ea88c refactor(server): replace HTML entities to whitespaces to respect TTS punctuations 2019-06-08 15:33:07 +08:00
Louistiti d91a62ea7e build: merge To-Do List module 2019-06-08 15:18:24 +08:00
Louistiti 654617ac97 chore: upgrade Watson STT/TTS to ibm-watson 2019-06-08 15:03:01 +08:00
Louistiti 5a7d369122 chore: no need to mention Node.js version for the hotword node 2019-06-08 12:55:48 +08:00
Louistiti b2a897032f chore: bump snowboy to 1.3.1-alpha.1 for Node.js 8+ support 2019-06-08 12:46:58 +08:00
Louistiti 7499e06c68 chore: support Python 3+ range 2019-06-08 11:33:22 +08:00
Louistiti f1bab9b9fb chore: update package-lock.json 2019-06-08 02:42:17 +08:00
Louistiti 387d73fc3c Merge branch 'develop' into babel-7+ 2019-06-08 02:36:31 +08:00
Louistiti 6007549aa3 chore: use self-hosted git-changelog package 2019-06-08 02:30:19 +08:00
Louistiti 7093b7f037 chore: upgrade to Babel 7+ 2019-06-08 02:09:48 +08:00
Louistiti b7713e2fc9 fix(server): Google Drive synchronizer 2019-06-07 23:37:08 +08:00
Louistiti 544f2ca022 chore: bump @google-cloud/speech to 3.2.0 2019-06-07 22:04:57 +08:00
Louistiti 439196b90e chore: bump @google-cloud/text-to-speech to 1.1.0 2019-06-07 22:01:53 +08:00
Louistiti 0f223ae894 chore: bump browser-sync to 2.26.7 2019-06-07 21:58:45 +08:00
Louistiti 182089b57a test(package/calendar): done 2019-06-06 23:15:33 +08:00
Louistiti c003e1ffcc docs(package/calendar): typo readme 2019-06-06 21:49:33 +08:00
Louistiti 37e61c3152 docs(package/calendar): fill readme 2019-06-06 20:41:13 +08:00
Louistiti ae0739717b feat(package/calendar): French translation done 2019-06-06 20:26:58 +08:00
Louistiti a67a4475b6 style: use "impératif" tense for French language 2019-06-06 19:39:48 +08:00
Louistiti 751298d6c5 refactor(package/calendar): use completed todo answer to display new completed todo 2019-06-06 19:08:07 +08:00
Louistiti 53f7db55c6 feat(package/calendar): finalize English translation 2019-06-06 18:49:20 +08:00
Louistiti aeb065ce0f refactor(server): merge built-in and named entities 2019-06-06 18:07:42 +08:00
Louistiti 581da8cd98 feat(package/calendar): WIP done 2019-06-06 18:05:52 +08:00
Louistiti d38e6095f9 fix: take .env in consideration when using Docker 2019-06-06 09:06:48 +08:00
Louistiti 88b81105e2 chore: remove "setup:offline" npm script
until Snowboy update to Node.js 10+
2019-05-25 13:19:10 +08:00
Louis Grenard 3776fa3e31 chore: add FUNDING.yml file 2019-05-25 13:06:12 +08:00
Louistiti e6bdb3eedb Merge branch 'reverse-proxy-improvement' into develop 2019-05-25 12:45:35 +08:00
Louistiti cdef5f8d15 refactor: remove web app env variables 2019-05-25 12:16:10 +08:00
Louis Grenard 23e9070640 Merge branch 'develop' into reverse-proxy-improvement 2019-05-25 12:11:47 +08:00
Sandro Jäckel a3d7a2a735 refactor: try to use relative urls instead of absolute ones 2019-05-22 00:53:03 +02:00
Louistiti b9693df90c feat(package/calendar): WIP complete todo To-Do List module 2019-05-21 21:54:19 +08:00
Louistiti 9071c92790 fix: spinner test 2019-05-21 14:41:22 +08:00
Louistiti 15543a7bfb chore: bump @google-cloud/speech to latest 2019-05-21 14:23:22 +08:00
Louistiti 7c4403fdaf refactor: give a try for better reverse proxy 2019-05-20 08:24:59 +08:00
Louistiti 602aa694ac feat(package/calendar): complete todos WIP 2019-05-19 20:40:24 +08:00
Louistiti 1a3dab0e56 refactor(package/calendar): transform todos to dicts in the To-Do List module 2019-05-19 16:30:21 +08:00
Louistiti 5e128df023 feat(package/calendar): add todos to list in the To-Do List module 2019-05-19 16:16:34 +08:00
Louistiti 23996ad0a8 refactor(package/calendar): review To-Do List action entities 2019-05-19 14:55:08 +08:00
Louistiti 8575e9e3ef feat(package/calendar): delete list in the To-Do List module 2019-05-19 14:47:42 +08:00
Louistiti 12e8f5c3bf feat(package/calendar): view lists in the To-Do List module 2019-05-19 14:30:53 +08:00
Louistiti 2041be14db feat(package/calendar): rename a list in the To-Do List module 2019-05-19 12:42:46 +08:00
Louistiti 857be94779 feat(package/calendar): create a list in the To-Do List module 2019-05-19 11:53:26 +08:00
Louistiti 82a910b59b Merge branch 'nlp-ner' into develop 2019-05-18 21:28:50 +08:00
Louistiti 7654407fba refactor(server): stop removing accent for NLU 2019-05-18 21:23:06 +08:00
Louistiti fa6a5a43a6 fix(server): NER trim entity on after conditions 2019-05-18 19:28:50 +08:00
Louistiti 68c81875dc docs: add configuration docs URL in the dotenv file 2019-05-13 08:07:38 +08:00
Louistiti 97311aa1b4 chore: add "docker:check" npm script 2019-05-12 09:21:58 +08:00
Louis Grenard 1e7fc8a2e1 Merge pull request #95 from SuperSandro2000/patch-1
chore: optimize Docker image
2019-05-12 09:21:24 +08:00
Louistiti 815dbc9e2e test(server): NER done 2019-05-11 23:37:59 +08:00
Sandro Jäckel 0b812777f7 Don't upgrade pip, optimize pip3 install, remove build-base
Don't cache packages for smaller final image
Don't show progress bar for better CI integration
Move COPY to better utilize cache
2019-05-11 16:24:27 +02:00
Louistiti 8a68440221 test(server): add new string helpers unit tests 2019-05-11 19:39:38 +08:00
Louistiti 226b410639 test(server): fix fallbacks unit tests 2019-05-11 19:31:35 +08:00
Louistiti b38014decd refactor(server): improve entity recognition 2019-05-11 19:02:53 +08:00
Louistiti 3fda3526c7 feat(server): add regex entity type 2019-05-11 18:09:05 +08:00
Louistiti 27c323ab42 refactor(server): NER split per entity type 2019-05-11 16:42:08 +08:00
Louistiti 5bc6c3f116 feat(server): catch unsupported action entity type 2019-05-11 13:34:26 +08:00
Louistiti d2de9a87e0 refactor(server): snake_case action entities conditions to PascalCase 2019-05-11 11:57:05 +08:00
Louistiti 62a6536b1f refactor(server): split NER to a different class 2019-05-11 11:38:25 +08:00
Louistiti 9bd7f63062 refactor(server): no NLU double entities 2019-05-11 09:39:35 +08:00
Louistiti 97c2329104 docs: use specific branch on the building badge 2019-05-10 12:42:37 +08:00
Louistiti 24cf3c9a4f feat(server): NER backbone 2019-05-10 08:45:43 +08:00
Louistiti e2e5455555 chore: upgrade node-nlp to latest 2019-05-06 18:56:30 +08:00
Louistiti 232efad74c Merge branch 'modules-actions' into develop 2019-05-04 15:23:00 +08:00
Louistiti 39284d9cae chore: bump to 1.0.0-beta.3 2019-05-04 15:22:46 +08:00
Louistiti 4d929dc4fa refactor(server): actions to fallbacks 2019-05-04 11:20:35 +08:00
Louistiti cfed8c39f5 docs: update contributing file for development setup 2019-05-04 09:51:33 +08:00
Louistiti 5cf77d9011 fix: e2e tests by adding modules actions level 2019-05-04 09:41:37 +08:00
Louistiti 0c2d846ace test(package/calendar): mock first test 2019-05-04 09:28:19 +08:00
Louistiti 0cdd73d6c2 feat(package/calendar): To-Do List module backbone 2019-05-04 09:26:11 +08:00
Louistiti 352c39a46b test(server): fix units to introduce modules actions 2019-05-04 08:48:59 +08:00
Louistiti b449376f61 feat(server): introduce actions module 2019-05-03 23:31:09 +08:00
Louistiti e5f2996e5f docs: new beers GitHub asset 2019-05-03 14:21:05 +08:00
Louistiti f05d155f1b docs: update readme to Docker run on Windows 2019-05-03 09:06:31 +08:00
Louistiti 0d70387ba3 chore(web app): upgrade browser-sync to latest 2019-05-01 16:31:47 +08:00
Louistiti 18f144cb57 docs(package/checker): readme typo 2019-05-01 16:10:55 +08:00
Louistiti 9d66fd7bf2 Merge branch 'latest-node-nlp' into develop 2019-05-01 16:07:33 +08:00
Louistiti d34ddde843 refactor(server): min confidence 2019-05-01 16:00:01 +08:00
Louistiti a6f55ef400 test(server): fix language attribution before NLP testing 2019-05-01 14:32:50 +08:00
Louistiti d910eb153c chore: add post and pre expressions training to all the tests 2019-05-01 13:15:36 +08:00
Louistiti 238f6f2fe1 docs: remove unnecessary dot on readme 2019-04-30 07:45:53 +08:00
Louistiti f55cc8f772 chore: upgrade to latest node-nlp 2019-04-29 07:21:47 +08:00
Louistiti c6cc807593 docs: update Node.js prerequisites 2019-04-29 07:02:57 +08:00
Louistiti 8f3bb5ab80 chore: do not execute any module during the NLP testing 2019-04-27 21:46:05 +08:00
Louis Grenard da2e7e935d Merge pull request #56 from fkeloks/speedtest_package
feat: Add network package
2019-04-27 21:41:22 +08:00
Louistiti 4e8b3f064f refactor(package/network): Speed Test module finalized + edit other packages readmes 2019-04-27 21:35:31 +08:00
Louis Grenard 593f264724 Merge branch 'develop' into speedtest_package 2019-04-27 13:12:22 +08:00
Louis Grenard 50d63b044d Merge pull request #80 from iifeoluwa/been_pwned
Have I Been Pwned module
2019-04-27 13:05:35 +08:00
Louis Grenard 167babf6ed Merge branch 'develop' into been_pwned 2019-04-27 12:58:58 +08:00
Louistiti 5f2458184f docs(package/checker): add readme instructions 2019-04-27 12:56:54 +08:00
Louistiti a476fd0f38 feat(package/checker): allow multiple breaches output in the Have I Been Pwned module 2019-04-27 12:12:04 +08:00
Louistiti 563fb40955 fix(package/trend): when there is no star provided on the GitHub module 2019-04-25 08:10:01 +08:00
Ifeoluwa Arowosegbe 8374e54810 feat(package/checker): Add proper punctuations 2019-04-17 15:51:19 +01:00
Ifeoluwa Arowosegbe c73ba52ba8 feat(package/checker): Handle case where request is blocked by HaveIBeenPwned service 2019-04-17 15:40:16 +01:00
Ifeoluwa Arowosegbe 6d0c0b6892 Merge branch 'develop' of https://github.com/leon-ai/leon into been_pwned 2019-04-17 12:01:12 +01:00
Ifeoluwa Arowosegbe a7a6d885a8 feat(package/checker): Add test for haveibeenpwned module 2019-04-17 12:00:54 +01:00
Ifeoluwa Arowosegbe 36368664fc feat(package/checker): Add French translations for answers and expressions 2019-04-16 19:05:27 +01:00
Ifeoluwa Arowosegbe 5a999bc63a feat(package/checker): Conclude implementation for haveibeenpwned module 2019-04-16 15:55:16 +01:00
Florian B 91181221fc Merge branch 'develop' into speedtest_package 2019-04-09 19:10:52 +02:00
Florian B 0395d27d1d Merge branch 'develop' into speedtest_package 2019-04-06 10:21:06 +02:00
Ifeoluwa Arowosegbe 61c1b55af5 feat(package/checker): add expressions and answers 2019-04-03 11:17:24 +01:00
Florian / Fkeloks ae1926ea90 Merge branch 'develop' into speedtest_package 2019-03-17 16:41:59 +01:00
Florian / Fkeloks 09ad43406d feat: Add speedtest package 2019-03-09 18:20:35 +01:00
1410 changed files with 279118 additions and 24926 deletions
-23
View File
@@ -1,23 +0,0 @@
{
"presets": [
["env", {
"targets": {
"node": "current"
}
}]
],
"plugins": [
["module-resolver", {
"alias": {
"@@": ".",
"@": "./server/src"
},
"compilerOptions": {
"paths": {
"@@": ".",
"@": "./server/src"
}
}
}]
]
}
-151
View File
@@ -1,151 +0,0 @@
version: 2
defaults: &defaults
working_directory: ~/project/leon-ai/leon
docker:
- image: leonai/ci:latest
environment:
LC_ALL: C.UTF-8 # Fix https://click.palletsprojects.com/en/7.x/python3/#python-3-surrogate-handling
LANG: C.UTF-8 # Fix https://click.palletsprojects.com/en/7.x/python3/#python-3-surrogate-handling
PIPENV_PIPFILE: bridges/python/Pipfile
jobs:
check-stack:
<<: *defaults
steps:
- checkout
- run:
name: Checking Node.js
command: node --version
- run:
name: Checking npm
command: npm --version
- run:
name: Checking Python
command: python3 --version
- run:
name: Checking Pipenv
command: pipenv --version
- persist_to_workspace:
root: ~/project/leon-ai
paths:
- leon
install-npm-dep:
<<: *defaults
steps:
- attach_workspace:
at: ~/project/leon-ai
- restore_cache:
keys:
- v1-leon-ai-leon-{{ .Branch }}-{{ checksum "package-lock.json" }}
- v1-leon-ai-leon-{{ .Branch }}-
- v1-leon-ai-leon-
- run:
name: Installing npm dependencies
command: npm install
- save_cache:
key: v1-leon-ai-leon-{{ .Branch }}-{{ checksum "package-lock.json" }}
paths:
- node_modules
- persist_to_workspace:
root: ~/project/leon-ai
paths:
- leon
init:
<<: *defaults
steps:
- attach_workspace:
at: ~/project/leon-ai
- restore_cache:
keys:
- v1-leon-ai-leon-{{ .Branch }}-{{ checksum "bridges/python/Pipfile.lock" }}
- v1-leon-ai-leon-{{ .Branch }}-
- v1-leon-ai-leon-
- run:
name: Setting up
command: npm run postinstall
- save_cache:
key: v1-leon-ai-leon-{{ .Branch }}-{{ checksum "bridges/python/Pipfile.lock" }}
paths:
- bridges/python/.venv
- persist_to_workspace:
root: ~/project/leon-ai
paths:
- leon
lint:
<<: *defaults
steps:
- attach_workspace:
at: ~/project/leon-ai
- run:
name: Linting
command: npm run lint
test-json:
<<: *defaults
steps:
- attach_workspace:
at: ~/project/leon-ai
- run:
name: JSON testing
command: npm run test:json
test-e2e:
<<: *defaults
steps:
- attach_workspace:
at: ~/project/leon-ai
- run:
name: End-to-end testing
command: npm run test:e2e
test-unit:
<<: *defaults
steps:
- attach_workspace:
at: ~/project/leon-ai
- run:
name: Installing offline STT
command: npm run setup:offline-stt
- run:
name: Installing offline TTS
command: npm run setup:offline-tts
- run:
name: Unit testing
command: npm run test:unit
workflows:
version: 2
install-test:
jobs:
- check-stack
- install-npm-dep:
requires:
- check-stack
- init:
requires:
- check-stack
- install-npm-dep
- lint:
requires:
- check-stack
- install-npm-dep
- init
- test-json:
requires:
- check-stack
- install-npm-dep
- init
- test-e2e:
requires:
- check-stack
- install-npm-dep
- init
- test-unit:
requires:
- check-stack
- install-npm-dep
- init
-5
View File
@@ -1,5 +0,0 @@
node_modules/
bridges/python/.venv/*
.env
!bridges/python/.venv/.gitkeep
+4 -1
View File
@@ -1,4 +1,4 @@
# EditorConfig is awesome: http://EditorConfig.org
# EditorConfig is awesome: https://EditorConfig.org
# top-most EditorConfig file
root = true
@@ -10,3 +10,6 @@ indent_size = 2
charset = utf-8
end_of_line = lf
insert_final_newline = true
[*.py]
indent_size = 4
+31 -36
View File
@@ -1,47 +1,42 @@
# Language currently used
LEON_LANG=en-US
# Leon profile secrets.
# Non-secret profile configuration lives in config.yml.
# Current env
LEON_NODE_ENV=development
# LLM provider API keys
# Server
LEON_SERVER_HOST=localhost
LEON_SERVER_PORT=1337
# Optional local llama.cpp API key
LEON_LLAMACPP_API_KEY=
# Web app
LEON_WEBAPP_HOST=localhost
LEON_WEBAPP_PORT=4242
# Optional Linux high-performance local provider API key (OpenAI-compatible)
LEON_SGLANG_API_KEY=
# Time zone (current one by default)
LEON_TIME_ZONE=
# OpenRouter API key
LEON_OPENROUTER_API_KEY=
# Enable/disable after speech
LEON_AFTER_SPEECH=false
# Z.AI API key
LEON_ZAI_API_KEY=
# Enable/disable Leon's speech-to-text
LEON_STT=false
# Speech-to-text provider
LEON_STT_PROVIDER=deepspeech
# MiniMax API key
LEON_MINIMAX_API_KEY=
# Enable/disable Leon's text-to-speech
LEON_TTS=false
# Text-to-speech provider
LEON_TTS_PROVIDER=flite
# OpenAI API key
LEON_OPENAI_API_KEY=
# Enable/disable collaborative logger
LEON_LOGGER=true
# Anthropic API key
LEON_ANTHROPIC_API_KEY=
# Path to the Pipfile
PIPENV_PIPFILE=bridges/python/Pipfile
# Moonshot AI API key
LEON_MOONSHOTAI_API_KEY=
# Path to the virtual env in .venv/
PIPENV_VENV_IN_PROJECT=true
# HuggingFace API key
LEON_HUGGINGFACE_API_KEY=
# Fix https://click.palletsprojects.com/en/7.x/python3/#python-3-surrogate-handling
# If Leon replies you something like "Sorry, it seems I have a problem with the ... module" but
# still gives you the right answer, then:
## 1. Run `locale -a`
## 2. Pick a locale
## 3. Replace the LC_ALL and LANG values with the needed locale
LC_ALL=C.UTF-8
LANG=C.UTF-8
# Cerebras API key
LEON_CEREBRAS_API_KEY=
# Groq API key
LEON_GROQ_API_KEY=
# Misc
# Token used to authenticate every remote request for this profile
LEON_PROFILE_TOKEN=
-39
View File
@@ -1,39 +0,0 @@
{
"extends": "airbnb-base",
"env": {
"node": true,
"es6": true,
"browser": true,
"jest/globals": true
},
"globals": {
"io": true,
"webkitSpeechRecognition": true
},
"plugins": [
"import",
"jest"
],
"settings": {
"import/resolver": {
"babel-module": { }
}
},
"rules": {
"no-multi-assign": "off",
"no-trailing-spaces": "off",
"linebreak-style": "off",
"indent": "off",
"strict": "off",
"no-console": "off",
"no-param-reassign": "off",
"no-shadow": "off",
"import/no-extraneous-dependencies": "off",
"import/no-dynamic-require": "off",
"no-underscore-dangle": ["error", { "allowAfterThis": true }],
"space-before-function-paren": ["error", "always"],
"prefer-destructuring": ["error", { "array": true, "object": true }],
"comma-dangle": ["error", "never"],
"semi": ["error", "never"]
}
}
+11 -11
View File
@@ -14,21 +14,21 @@ appearance, race, religion, or sexual identity and orientation.
Examples of behavior that contributes to creating a positive environment
include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
- Using welcoming and inclusive language
- Being respectful of differing viewpoints and experiences
- Gracefully accepting constructive criticism
- Focusing on what is best for the community
- Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or
- The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
- Trolling, insulting/derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or electronic
address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
- Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
@@ -55,7 +55,7 @@ further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at <louis.grenard@gmail.com>. All
reported by contacting the project team at <louis@getleon.ai>. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
+131 -48
View File
@@ -2,7 +2,7 @@
Thanks a lot for your interest in contributing to Leon! :heart:
**Leon needs open source to live**, the more modules he has, the more skillful he becomes.
**Leon needs open source to live**, the more skills he has, the more skillful he becomes.
**Before submitting your contribution**, please take a moment to review this document.
@@ -12,59 +12,74 @@ Please note we have a [code of conduct](https://github.com/leon-ai/leon/blob/dev
Here are few examples about how you could help on Leon, by:
- [Creating a new module](https://docs.getleon.ai/packages-modules.html).
- [Working on new features](https://roadmap.getleon.ai) (what is in backlog or todo).
- [Creating a new module](https://docs.getleon.ai/packages-modules).
- [Working on new features](http://roadmap.getleon.ai) (what is in backlog or todo).
- [Suggesting new ideas](https://github.com/leon-ai/leon/issues/new/choose).
- [Reporting a bug](https://github.com/leon-ai/leon/issues/new?labels=bug&template=BUG.md).
- [Improving the documentation](https://github.com/leon-ai/docs.getleon.ai) (translations, typos, better writing, etc.).
- [Buying me a fruit juice](https://donate.getleon.ai).
- [Sponsoring Leon](http://sponsor.getleon.ai).
## Pull Requests
**Working on your first Pull Request?** You can learn how from this *free* series [How to Contribute to an Open Source Project on GitHub](https://egghead.io/series/how-to-contribute-to-an-open-source-project-on-github).
**Working on your first Pull Request?** You can learn how from this _free_ series [How to Contribute to an Open Source Project on GitHub](https://egghead.io/courses/how-to-contribute-to-an-open-source-project-on-github).
- **Please first discuss** the change you wish to make via [issue](https://github.com/leon-ai/leon/issues),
email, or any other method with the owners of this repository before making a change.
It might avoid a waste of your time.
email, or any other method with the owners of this repository before making a change.
It might avoid a waste of your time.
- The `master` branch is actually used as a snapshot of the latest stable release. **Do not submit your PRs
against the `master` branch**.
against the `master` branch**.
- Ensure your code **respect our coding standards** (cf. [.eslintrc.json](https://github.com/leon-ai/leon/blob/develop/.eslintrc.json)).
To do so, you can run:
To do so, you can run:
```sh
npm run lint
pnpm run lint
```
- Make sure your **code passes the tests**. You can run the tests via the following command:
```sh
npm test
```
If you're adding new features to Leon, please include tests.
## Development Setup
- Follow the [basic setup](https://github.com/leon-ai/leon/blob/develop/README.md#getting-started).
- Then:
Choose the setup method you want to go for.
```sh
# run development server
npm run dev:server
# run development web app
npm run dev:app
# run the wake word node (optional)
npm run wake
```
### Single-Click
Gitpod will automatically set up an environment and run an instance for you.
[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/leon-ai/leon)
### Basic
```sh
# Clone the repository
git clone https://github.com/leon-ai/leon.git leon
# Go to the project root
cd leon
# Install
pnpm install
# Check the setup went well
pnpm run check
# Run the development server
pnpm run dev:server
# Run the development web app
pnpm run dev:app
```
## Versioning
- We use [Semantic Versioning](https://semver.org) for releases.
- A new Leon module creation increases the MINOR version number of its relevant Leon package.
- Each time a MAJOR or MINOR version number of a Leon package is increased, then the MINOR version number of the project should also be increased.
- Each time a PATCH version number of a Leon package is increased, then the PATCH version number of the projet should also be increased.
## Commits
@@ -74,41 +89,109 @@ The commit message guideline is adapted from the [AngularJS Git Commit Guideline
Types define which kind of changes you made to the project.
| Types | Description |
| ------------- |-------------|
| BREAKING | Changes including breaking changes. |
| build | New build version. |
| chore | Changes to the build process or auxiliary tools such as changelog generation. No production code change. |
| docs | Documentation only changes. |
| feat | A new feature. |
| fix | A big fix. |
| perf | A code change that improves performance. |
| refactor | A code change that neither fixes a bug nor adds a feature. |
| style | Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc.). |
| test | Adding missing or correcting existing tests. |
| Types | Description |
| -------- | -------------------------------------------------------------------------------------------------------- |
| BREAKING | Changes including breaking changes. |
| build | New build version. |
| chore | Changes to the build process or auxiliary tools such as changelog generation. No production code change. |
| ci | Changes related to continuous integration only (GitHub Actions, CircleCI, etc.). |
| docs | Documentation only changes. |
| feat | A new feature. |
| fix | A bug fix. |
| perf | A code change that improves performance. |
| refactor | A code change that neither fixes a bug nor adds a feature. |
| style | Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc.). |
| test | Adding missing or correcting existing tests. |
### Scopes
Scopes define high-level nodes of Leon.
- web app
- server
- bridge/python
- bridge/nodejs
- hotword
- package/package_name
- scripts
- server
- tcp server
- web app
- skill/skill_name
### Examples
```sh
git commit -m "feat(server): awesome new server feature"
git commit -m "docs(package/leon): fix spelling"
git commit -m "docs(skill/leon): fix spelling"
git commit -m "chore: split training script into awesome blocks"
git commit -m "style(web app): remove chatbot useless parentheses"
```
## Donate
### GUI Clients
You can also contribute by [buying me a fruit juice](https://donate.getleon.ai).
If you are using a GUI client such as GitKraken, you may need to disable the default Git executable to make sure to use your default shell.
Otherwise you may encounter an error such as "npx not found".
## Sponsor
You can also contribute by [sponsoring Leon](http://sponsor.getleon.ai).
Please note that I dedicate most of my free time to Leon.
By sponsoring the project you make the project sustainable and faster to develop features.
The focus is not only limited to the activity you see on GitHub but also a lot of thinking about the direction of the project. Which is naturally related to the overall design, architecture, vision, learning process and so on...
## Contributing to the Python Bridge or TCP HttpServer
Leon makes use of two binaries, the Python bridge and the TCP server. These binaries are compiled from Python sources.
The Python bridge is used to communicate between the core and skills made with Python.
The TCP server is used to communicate between the core and third-party nodes, such as spaCy.
### Set Up the Python Environment
To contribute to these parts, you need to set up a Python environment running with a specific Python version and a specific Pipenv version.
It is recommended to use Pyenv to manage your Python versions.
If you are on GNU/Linux Ubuntu, you can run the following to install Pyenv, otherwise, please refer to the [Pyenv documentation to install it](https://github.com/pyenv/pyenv#installation):
```bash
# Update registry
sudo apt-get update
# Install Pyenv deps
sudo apt-get install make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
# Install Pyenv
curl https://pyenv.run | bash
# Add output lines to .bashrc
# Restart shell
exec "$SHELL"
```
Once Pyenv installed, run:
```bash
# Install Python
pyenv install 3.11.9 --force
pyenv global 3.11.9
```
Your Python environment should be ready now. Leon uses `uv` as the Python dependency standard, and `postinstall` provisions the Python bridge and TCP server environments automatically from `pyproject.toml`:
```bash
# Run the Python bridge
npm run python-bridge
# Run the TCP server
npm run start:tcp-server
```
## Spread the Word
Use [#LeonAI](https://twitter.com/hashtag/LeonAI) if you tweet about Leon and/or mention [@louistiti_fr](https://twitter.com/louistiti_fr).
Use [#LeonAI](<https://twitter.com/search?f=live&q=%23LeonAI%20(from%3Agrenlouis%20OR%20from%3Alouistiti_fr)&src=typed_query>) if you tweet about Leon and/or mention [@grenlouis](https://twitter.com/grenlouis).
+8
View File
@@ -0,0 +1,8 @@
# These are supported funding model platforms
github: [louistiti]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
custom: # http://sponsor.getleon.ai
-7
View File
@@ -1,7 +0,0 @@
<!--
Thanks for your interest in Leon! ❤️
Please check if there is no similar issue before creating this one.
-->
+3 -2
View File
@@ -7,6 +7,7 @@ labels: bug
<!--
Thanks for your interest in Leon! ❤️
Please check if there is no similar issue before creating this one.
If the bug is related to the setup, please submit the issue at: https://github.com/leon-ai/leon-cli/issues/new/choose
-->
### Specs
@@ -14,8 +15,8 @@ Please check if there is no similar issue before creating this one.
- Leon version:
- OS (or browser) version:
- Node.js version:
- Complete "npm run check" output:
- (optional) Leon package version:
- Complete "leon check" (or "pnpm run check") output:
- (optional) Leon skill version:
### Expected Behavior
+1
View File
@@ -12,6 +12,7 @@ Please place an x (no spaces - [x]) in all [ ] that apply.
-->
### Documentation Is:
- [ ] Missing
- [ ] Needed
- [ ] Confusing
+2 -1
View File
@@ -14,6 +14,7 @@ Please place an x (no spaces - [x]) in all [ ] that apply.
-->
### What type of change does this PR introduce?
- [ ] Bugfix
- [ ] Feature
- [ ] Refactor
@@ -21,10 +22,10 @@ Please place an x (no spaces - [x]) in all [ ] that apply.
- [ ] Not Sure?
### Does this PR introduce breaking changes?
- [ ] Yes
- [ ] No
### List any relevant issue numbers:
### Description:
@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="301" height="70" fill="none" viewBox="0 0 301 70">
<path fill="#000" d="M89.4844 43.5858c0 .8464-.1792 1.5933-.5377 2.2505-.3585.6573-.8564 1.1651-1.5137 1.5236-.6572.3585-1.3941.5378-2.2406.5378H81v6.1044h5.0787c1.912 0 3.6248-.4282 5.1484-1.2846 1.5236-.8564 2.7186-2.0415 3.585-3.5452.8663-1.5037 1.3045-3.1966 1.3045-5.0886V24.0178h-6.6322v19.568Zm17.8556-1.8224h13.891v-5.6065H107.34v-6.3633h15.355v-5.7758h-21.818v29.9743h22.246v-5.7757H107.34v-6.453Zm17.865-11.8005h8.882v24.0193h6.633V29.9629h8.842v-5.9451h-24.367v5.9551l.01-.01Zm47.022 9.0022c-.517-.2788-1.085-.4879-1.673-.6472.449-.1295.877-.2888 1.275-.488 1.096-.5676 1.962-1.3643 2.579-2.39.618-1.0257.936-2.2007.936-3.5351 0-1.5237-.418-2.8879-1.244-4.0929-.827-1.195-1.992-2.131-3.486-2.8082-1.494-.6672-3.206-1.0058-5.118-1.0058h-13.315v29.9743h13.574c2.011 0 3.804-.3485 5.387-1.0556 1.573-.707 2.798-1.6829 3.675-2.9476.866-1.2547 1.304-2.6887 1.304-4.302 0-1.4837-.338-2.8082-1.026-3.9833-.687-1.175-1.633-2.0812-2.858-2.7285l-.01.0099Zm-13.603-9.9184h5.886c.816 0 1.533.1494 2.161.4382.627.2888 1.115.707 1.464 1.2547.348.5378.527 1.1751.527 1.9021 0 .7269-.179 1.414-.527 1.9817-.349.5676-.837.9958-1.464 1.3045-.628.3087-1.345.4581-2.161.4581h-5.886v-7.3492.0099Zm10.138 18.134c-.378.5676-.916 1.0058-1.603 1.3145-.697.3087-1.484.4581-2.39.4581h-6.145v-7.6878h6.145c.886 0 1.673.1693 2.37.4979.687.3286 1.235.7867 1.613 1.3842.378.5975.578 1.2747.578 2.0414 0 .7668-.19 1.4241-.568 1.9917Zm29.596-5.3077c1.663-.7967 2.947-1.922 3.864-3.3659.916-1.444 1.374-3.117 1.374-5.0289 0-1.912-.448-3.5253-1.344-4.9592-.897-1.434-2.171-2.5394-3.814-3.3261-1.644-.7867-3.546-1.1751-5.717-1.1751h-13.124v29.9743h6.642V43.0779h4.322l6.084 10.9142h7.578l-6.851-11.7208c.339-.1195.677-.249.996-.3983h-.01Zm-2.151-6.1244c-.369.6274-.896 1.1154-1.583 1.444-.688.3386-1.494.5078-2.42.5078h-5.975v-8.2952h5.975c.926 0 1.732.1693 2.42.4979.687.3287 1.214.8166 1.583 1.434.368.6174.558 1.3544.558 2.1908 0 .8365-.19 1.5734-.558 2.2008v.0199Zm20.594-11.7308-10.706 29.9743h6.742l2.121-6.6122h11.114l2.27 6.6122h6.612L223.99 24.0178h-7.189Zm-.339 18.3431 3.445-10.5756.409-1.922.408 1.922 3.685 10.5756h-7.947Zm20.693 11.6312h6.851V24.0178h-6.851v29.9743Zm31.02-9.6993-12.896-20.275h-6.463v29.9743h6.055V33.7172l12.826 20.2749h6.533V24.0178h-6.055v20.275Zm31.528-3.3559c-.647-1.2448-1.564-2.2904-2.729-3.1369-1.165-.8464-2.509-1.4041-4.023-1.6929l-5.098-1.0456c-.797-.1892-1.434-.5178-1.902-.9958-.469-.478-.708-1.0755-.708-1.7825 0-.6473.17-1.205.518-1.683.339-.478.827-.8464 1.444-1.1153.618-.2689 1.335-.3983 2.151-.3983.817 0 1.554.1394 2.181.4182.627.2788 1.115.6672 1.464 1.1751s.528 1.0755.528 1.7228h6.642c-.04-1.7427-.528-3.2863-1.444-4.6207-.916-1.3443-2.201-2.3899-3.834-3.1468-1.633-.7568-3.505-1.1352-5.597-1.1352-2.091 0-3.943.3884-5.566 1.1751-1.623.7867-2.898 1.8721-3.804 3.2663-.906 1.3941-1.364 2.9775-1.364 4.76 0 1.444.288 2.7485.876 3.9036.587 1.1652 1.414 2.1311 2.479 2.8979 1.076.7668 2.311 1.3045 3.725 1.6033l5.397 1.1153c.886.2091 1.584.5975 2.101 1.1551.518.5577.767 1.2448.767 2.0813 0 .6672-.189 1.2747-.567 1.8025-.379.5277-.907.936-1.584 1.2248-.677.2888-1.474.4282-2.39.4282-.916 0-1.782-.1593-2.529-.478-.747-.3186-1.325-.7767-1.733-1.3742-.418-.5875-.617-1.2747-.617-2.0414h-6.642c.029 1.8721.527 3.5152 1.513 4.9492.976 1.424 2.32 2.5394 4.033 3.336 1.713.7967 3.675 1.195 5.886 1.195 2.21 0 4.202-.4083 5.915-1.2249 1.723-.8165 3.057-1.9418 4.023-3.3758.966-1.434 1.444-3.0572 1.444-4.8696 0-1.4838-.329-2.848-.976-4.1028l.02.01Z"/>
<path fill="#000" fill-rule="evenodd" d="M6.83994 69.9901H37.9378V70c3.9071 0 7.5856-1.5308 10.3693-4.2942l17.398-17.3957C68.4391 45.5765 70 41.7992 70 37.9423V6.83897C70 3.06163 66.928 0 63.1601 0H32.0523c-3.8972 0-7.5856 1.53082-10.3594 4.29424L4.29484 21.6799C1.56086 24.4135 0 28.1909 0 32.0477v31.1034c0 3.7773 3.07201 6.839 6.83994 6.839ZM11.5583 19 23.9795 6.58052c2.1674-2.15706 5.0306-3.33996 8.0728-3.33996h31.1078c1.9883 0 3.5989 1.62028 3.5989 3.59841V37.9423c0 3.002-1.2129 5.9444-3.3405 8.0716L51 58.4307V19H11.5583ZM11 19.5582V59h39.4306l-4.4101 4.4095c-2.1574 2.1472-5.0306 3.34-8.0728 3.34H6.83994c-1.98836 0-3.59892-1.6203-3.59892-3.5984V32.0477c0-3.002 1.21289-5.9443 3.34043-8.0716L11 19.5582ZM33 50H16v4h17v-4Z" clip-rule="evenodd"/>
</svg>

After

Width:  |  Height:  |  Size: 4.2 KiB

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="298" height="64" fill="none" viewBox="0 0 298 64">
<path fill="#fff" d="M86.484 40.586c0 .846-.179 1.593-.537 2.25a3.718 3.718 0 0 1-1.514 1.524c-.657.358-1.394.538-2.24.538H78v6.104h5.079c1.912 0 3.625-.428 5.148-1.285a9.36 9.36 0 0 0 3.585-3.545c.866-1.503 1.305-3.196 1.305-5.088V21.018h-6.633v19.568Zm17.856-1.823h13.891v-5.606H104.34v-6.363h15.355v-5.776H97.877v29.974h22.246v-5.776H104.34v-6.453Zm17.865-11.8h8.882v24.02h6.633v-24.02h8.842v-5.945h-24.367v5.955l.01-.01Zm47.022 9.002a7.85 7.85 0 0 0-1.673-.647 7.47 7.47 0 0 0 1.275-.488c1.096-.568 1.962-1.364 2.579-2.39.618-1.026.936-2.2.936-3.535 0-1.524-.418-2.888-1.244-4.093-.827-1.195-1.992-2.131-3.486-2.808-1.494-.668-3.206-1.006-5.118-1.006h-13.315v29.974h13.574c2.011 0 3.804-.348 5.387-1.055 1.573-.707 2.798-1.683 3.675-2.948.866-1.255 1.304-2.689 1.304-4.302 0-1.484-.338-2.808-1.026-3.983a7.05 7.05 0 0 0-2.858-2.729l-.01.01Zm-13.603-9.918h5.886c.816 0 1.533.15 2.161.438a3.353 3.353 0 0 1 1.464 1.255c.348.537.527 1.175.527 1.902 0 .727-.179 1.414-.527 1.981-.349.568-.837.996-1.464 1.305-.628.309-1.345.458-2.161.458h-5.886v-7.35.01Zm10.138 18.134c-.378.567-.916 1.006-1.603 1.314-.697.309-1.484.458-2.39.458h-6.145v-7.688h6.145c.886 0 1.673.17 2.37.498.687.329 1.235.787 1.613 1.385.378.597.578 1.274.578 2.041 0 .767-.19 1.424-.568 1.992Zm29.596-5.308c1.663-.797 2.947-1.922 3.864-3.366.916-1.444 1.374-3.117 1.374-5.029s-.448-3.525-1.344-4.959c-.897-1.434-2.171-2.54-3.814-3.326-1.644-.787-3.546-1.175-5.717-1.175h-13.124v29.974h6.642V40.078h4.322l6.084 10.914h7.578l-6.851-11.72c.339-.12.677-.25.996-.399h-.01Zm-2.151-6.124a3.599 3.599 0 0 1-1.583 1.444c-.688.338-1.494.507-2.42.507h-5.975v-8.295h5.975c.926 0 1.732.17 2.42.498a3.637 3.637 0 0 1 1.583 1.434c.368.617.558 1.355.558 2.19 0 .837-.19 1.574-.558 2.202v.02Zm20.594-11.731-10.706 29.974h6.742l2.121-6.612h11.114l2.27 6.612h6.612L220.99 21.018h-7.189Zm-.339 18.343 3.445-10.576.409-1.922.408 1.922 3.685 10.576h-7.947Zm20.693 11.631h6.851V21.018h-6.851v29.974Zm31.02-9.7-12.896-20.274h-6.463v29.974h6.055V30.717l12.826 20.275h6.533V21.018h-6.055v20.275Zm31.528-3.355c-.647-1.245-1.564-2.29-2.729-3.137-1.165-.846-2.509-1.404-4.023-1.693l-5.098-1.045c-.797-.19-1.434-.518-1.902-.996-.469-.478-.708-1.076-.708-1.783 0-.647.17-1.205.518-1.683.339-.478.827-.846 1.444-1.115.618-.269 1.335-.398 2.151-.398.817 0 1.554.139 2.181.418.627.279 1.115.667 1.464 1.175a2.96 2.96 0 0 1 .528 1.723h6.642c-.04-1.743-.528-3.287-1.444-4.621-.916-1.344-2.201-2.39-3.834-3.147-1.633-.757-3.505-1.135-5.597-1.135-2.091 0-3.943.388-5.566 1.175-1.623.787-2.898 1.872-3.804 3.266-.906 1.395-1.364 2.978-1.364 4.76 0 1.444.288 2.749.876 3.904a7.908 7.908 0 0 0 2.479 2.898c1.076.767 2.311 1.304 3.725 1.603l5.397 1.115c.886.21 1.584.598 2.101 1.156.518.557.767 1.244.767 2.08a3.03 3.03 0 0 1-.567 1.803c-.379.528-.907.936-1.584 1.225-.677.289-1.474.428-2.39.428-.916 0-1.782-.159-2.529-.478-.747-.318-1.325-.776-1.733-1.374-.418-.587-.617-1.275-.617-2.041h-6.642c.029 1.872.527 3.515 1.513 4.949.976 1.424 2.32 2.54 4.033 3.336 1.713.797 3.675 1.195 5.886 1.195 2.21 0 4.202-.408 5.915-1.225 1.723-.816 3.057-1.942 4.023-3.376.966-1.434 1.444-3.057 1.444-4.87 0-1.483-.329-2.847-.976-4.102l.02.01ZM13 47h17v4H13v-4Z"/>
<path fill="#fff" fill-rule="evenodd" d="M20.34 3.66 8 16l-4.34 4.34A12.504 12.504 0 0 0 0 29.18V59c0 2.76 2.24 5 5 5h29.82c3.32 0 6.49-1.32 8.84-3.66L48 56l12.34-12.34c2.34-2.34 3.66-5.52 3.66-8.84V5c0-2.76-2.24-5-5-5H29.18c-3.32 0-6.49 1.32-8.84 3.66ZM48 56V16H8v40h40Z" clip-rule="evenodd"/>
</svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Layer_2" xmlns="http://www.w3.org/2000/svg" version="1.1" width="180" height="70" viewBox="0 0 1525.6 589.8">
<defs>
<style>
.st0 {
fill: #fe9000;
}
.st1 {
fill: #fff;
}
</style>
</defs>
<g>
<rect class="st0" x="281" y="444.8" width="29" height="145"/>
<rect class="st0" x="280" width="29" height="145"/>
<rect class="st0" x="153.1" y="491.6" width="145" height="29" transform="translate(-325.8 560.4) rotate(-71.6)"/>
<rect class="st0" x="90.9" y="460.1" width="145" height="29" transform="translate(-316.6 327.8) rotate(-54)"/>
<rect class="st0" x="41.9" y="409.9" width="145" height="29" transform="translate(-225.7 145.9) rotate(-35.6)"/>
<rect class="st0" x="10.4" y="348.3" width="145" height="29" transform="translate(-108.1 43.4) rotate(-18)"/>
<rect class="st0" y="279.8" width="145" height="29"/>
<rect class="st0" x="68.3" y="153.9" width="29" height="145" transform="translate(-158.1 235.1) rotate(-72)"/>
<rect class="st0" x="99.7" y="91.3" width="29" height="145" transform="translate(-85.4 158.9) rotate(-53.7)"/>
<rect class="st0" x="211.1" y="10.8" width="29" height="145" transform="translate(-14.7 74.2) rotate(-18.1)"/>
<rect class="st0" x="149.6" y="41.3" width="29" height="145" transform="translate(-35.5 119.2) rotate(-36.3)"/>
</g>
<g>
<g>
<path class="st1" d="M349,307.4c-.8-20.3-1.5-44.5-1.5-69.3h-.5c-5.5,21.5-12.5,45.5-19,65.3l-20.5,65.8h-29.8l-18-65.2c-5.5-19.8-11-43.5-15.2-65.8h-.5c-.8,22.8-1.8,48.8-2.8,69.8l-3.2,64h-35.2l10.8-168.5h50.8l16.5,56.2c5.5,19.5,10.5,40.5,14.2,60.3h1c4.5-19.5,10.2-41.8,16-60.5l17.8-56h50l9,168.5h-37l-2.9-64.6h0Z"/>
<path class="st1" d="M518.5,342.4c0,11.5.5,22.8,2,29.5h-34.2l-2.2-12.2h-.8c-8,9.8-20.5,15-35,15-24.8,0-39.5-18-39.5-37.5,0-31.8,28.5-46.8,71.8-46.8v-1.5c0-6.5-3.5-15.8-22.2-15.8s-25.8,4.2-33.8,9l-7-24.2c8.5-4.8,25.2-11,47.5-11,40.8,0,53.5,24,53.5,52.8v42.7h0ZM481.8,314.1c-20,0-35.5,4.8-35.5,19.2s6.5,14.5,15,14.5,17.2-6.2,19.8-14c.5-2,.8-4.2.8-6.5v-13.2h0Z"/>
<path class="st1" d="M640.5,368.6c-6.8,3.2-19.5,5.8-34,5.8-39.5,0-64.8-24.2-64.8-62.5s24.5-64.8,70-64.8,21,1.8,29,4.8l-6,28.2c-4.5-2-11.2-3.8-21.2-3.8-20,0-33,14.3-32.8,34,0,22.5,15,34.2,33.5,34.2s16-1.5,21.8-4l4.5,28.1h0Z"/>
</g>
<g>
<path class="st1" d="M687.5,345.4c9.8,6,24,11,39,11,22.2,0,35.2-11.8,35.2-28.8s-9-24.8-31.8-33.5c-27.5-9.8-44.5-24-44.5-47.8s21.8-45.8,54.5-45.8,29.7,4,37.2,8.2l-6,17.8c-5.5-3-16.7-8-32-8-23,0-31.8,13.8-31.8,25.2s10.2,23.5,33.5,32.5c28.5,11,43,24.8,43,49.5s-19.2,48.5-59,48.5-34-4.8-43-10.8l5.7-18h0Z"/>
<path class="st1" d="M838.8,222v28.8h31.5v16.8h-31.5v65.2c0,15,4.2,23.5,16.5,23.5s10-.8,12.8-1.5l1,16.5c-4.2,1.8-11,3-19.5,3s-18.5-3.2-23.8-9.2c-6.2-6.5-8.5-17.2-8.5-31.5v-66h-18.8v-16.8h18.8v-22.3l21.5-6.5h0Z"/>
<path class="st1" d="M962,371.9l-1.8-15.2h-.8c-6.8,9.5-19.8,18-37,18-24.5,0-37-17.2-37-34.8,0-29.2,26-45.2,72.8-45v-2.5c0-10-2.8-28-27.5-28s-23,3.5-31.5,9l-5-14.5c10-6.5,24.5-10.8,39.8-10.8,37,0,46,25.2,46,49.5v45.2c0,10.5.5,20.8,2,29h-20ZM958.8,310.1c-24-.5-51.2,3.8-51.2,27.2s9.5,21,20.8,21,25.8-10,29.2-20.2c.8-2.2,1.2-4.8,1.2-7v-21h0Z"/>
<path class="st1" d="M1120,194.4v146.2c0,10.8.2,23,1,31.2h-19.8l-1-21h-.5c-6.8,13.5-21.5,23.8-41.2,23.8-29.2,0-51.8-24.8-51.8-61.5-.2-40.2,24.8-65,54.2-65s31,8.8,36.5,18.5h.5v-72.2h22.1ZM1098,300.1c0-2.8-.2-6.5-1-9.2-3.2-14-15.2-25.5-31.8-25.5s-36.2,20-36.2,46.8,12,44.8,35.8,44.8,28.2-9.8,32.2-26.2c.8-3,1-6,1-9.5v-21.2h0Z"/>
<path class="st1" d="M1181,216.9c.2,7.5-5.2,13.5-14,13.5s-13.2-6-13.2-13.5,5.8-13.8,13.8-13.8,13.4,6,13.4,13.8h0ZM1156.5,371.9v-121h22v121h-22Z"/>
<path class="st1" d="M1316.3,338.9c0,12.5.2,23.5,1,33h-19.5l-1.2-19.8h-.5c-5.8,9.8-18.5,22.5-40,22.5s-41.8-10.5-41.8-53v-70.8h22v67c0,23,7,38.5,27,38.5s25-10.2,29-20c1.2-3.2,2-7.2,2-11.2v-74.2h22v88h0Z"/>
<path class="st1" d="M1352.8,283.6c0-12.5-.2-22.8-1-32.8h19.2l1,19.5h.8c6.8-11.5,18-22.2,38-22.2s29,10,34.2,24.2h.5c3.8-6.8,8.5-12,13.5-15.8,7.2-5.5,15.2-8.5,26.8-8.5s39.8,10.5,39.8,52.5v71.2h-21.6v-68.5c0-23.2-8.5-37.2-26.2-37.2s-22.2,9.2-26,20c-1,3-1.8,7-1.8,11v74.8h-21.5v-72.5c0-19.2-8.5-33.2-25.2-33.2s-23.8,11-27.2,22c-1.2,3.2-1.8,7-1.8,10.8v73h-21.5v-88.3h0Z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.2 KiB

@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Layer_2" xmlns="http://www.w3.org/2000/svg" version="1.1" width="180" height="70" viewBox="0 0 1525.6 589.8">
<defs>
<style>
.st0 {
fill: #fe9000;
}
.st1 {
fill: #111;
}
</style>
</defs>
<g>
<rect class="st0" x="281" y="444.8" width="29" height="145"/>
<rect class="st0" x="280" width="29" height="145"/>
<rect class="st0" x="153.1" y="491.6" width="145" height="29" transform="translate(-325.8 560.4) rotate(-71.6)"/>
<rect class="st0" x="90.9" y="460.1" width="145" height="29" transform="translate(-316.6 327.8) rotate(-54)"/>
<rect class="st0" x="41.9" y="409.9" width="145" height="29" transform="translate(-225.7 145.9) rotate(-35.6)"/>
<rect class="st0" x="10.4" y="348.3" width="145" height="29" transform="translate(-108.1 43.4) rotate(-18)"/>
<rect class="st0" y="279.8" width="145" height="29"/>
<rect class="st0" x="68.3" y="153.9" width="29" height="145" transform="translate(-158.1 235.1) rotate(-72)"/>
<rect class="st0" x="99.7" y="91.3" width="29" height="145" transform="translate(-85.4 158.9) rotate(-53.7)"/>
<rect class="st0" x="211.1" y="10.8" width="29" height="145" transform="translate(-14.7 74.2) rotate(-18.1)"/>
<rect class="st0" x="149.6" y="41.3" width="29" height="145" transform="translate(-35.5 119.2) rotate(-36.3)"/>
</g>
<g>
<g>
<path class="st1" d="M349,307.4c-.8-20.3-1.5-44.5-1.5-69.3h-.5c-5.5,21.5-12.5,45.5-19,65.3l-20.5,65.8h-29.8l-18-65.2c-5.5-19.8-11-43.5-15.2-65.8h-.5c-.8,22.8-1.8,48.8-2.8,69.8l-3.2,64h-35.2l10.8-168.5h50.8l16.5,56.2c5.5,19.5,10.5,40.5,14.2,60.3h1c4.5-19.5,10.2-41.8,16-60.5l17.8-56h50l9,168.5h-37l-2.9-64.6h0Z"/>
<path class="st1" d="M518.5,342.4c0,11.5.5,22.8,2,29.5h-34.2l-2.2-12.2h-.8c-8,9.8-20.5,15-35,15-24.8,0-39.5-18-39.5-37.5,0-31.8,28.5-46.8,71.8-46.8v-1.5c0-6.5-3.5-15.8-22.2-15.8s-25.8,4.2-33.8,9l-7-24.2c8.5-4.8,25.2-11,47.5-11,40.8,0,53.5,24,53.5,52.8v42.7h0ZM481.8,314.1c-20,0-35.5,4.8-35.5,19.2s6.5,14.5,15,14.5,17.2-6.2,19.8-14c.5-2,.8-4.2.8-6.5v-13.2h0Z"/>
<path class="st1" d="M640.5,368.6c-6.8,3.2-19.5,5.8-34,5.8-39.5,0-64.8-24.2-64.8-62.5s24.5-64.8,70-64.8,21,1.8,29,4.8l-6,28.2c-4.5-2-11.2-3.8-21.2-3.8-20,0-33,14.3-32.8,34,0,22.5,15,34.2,33.5,34.2s16-1.5,21.8-4l4.5,28.1h0Z"/>
</g>
<g>
<path class="st1" d="M687.5,345.4c9.8,6,24,11,39,11,22.2,0,35.2-11.8,35.2-28.8s-9-24.8-31.8-33.5c-27.5-9.8-44.5-24-44.5-47.8s21.8-45.8,54.5-45.8,29.7,4,37.2,8.2l-6,17.8c-5.5-3-16.7-8-32-8-23,0-31.8,13.8-31.8,25.2s10.2,23.5,33.5,32.5c28.5,11,43,24.8,43,49.5s-19.2,48.5-59,48.5-34-4.8-43-10.8l5.7-18h0Z"/>
<path class="st1" d="M838.8,222v28.8h31.5v16.8h-31.5v65.2c0,15,4.2,23.5,16.5,23.5s10-.8,12.8-1.5l1,16.5c-4.2,1.8-11,3-19.5,3s-18.5-3.2-23.8-9.2c-6.2-6.5-8.5-17.2-8.5-31.5v-66h-18.8v-16.8h18.8v-22.3l21.5-6.5h0Z"/>
<path class="st1" d="M962,371.9l-1.8-15.2h-.8c-6.8,9.5-19.8,18-37,18-24.5,0-37-17.2-37-34.8,0-29.2,26-45.2,72.8-45v-2.5c0-10-2.8-28-27.5-28s-23,3.5-31.5,9l-5-14.5c10-6.5,24.5-10.8,39.8-10.8,37,0,46,25.2,46,49.5v45.2c0,10.5.5,20.8,2,29h-20ZM958.8,310.1c-24-.5-51.2,3.8-51.2,27.2s9.5,21,20.8,21,25.8-10,29.2-20.2c.8-2.2,1.2-4.8,1.2-7v-21h0Z"/>
<path class="st1" d="M1120,194.4v146.2c0,10.8.2,23,1,31.2h-19.8l-1-21h-.5c-6.8,13.5-21.5,23.8-41.2,23.8-29.2,0-51.8-24.8-51.8-61.5-.2-40.2,24.8-65,54.2-65s31,8.8,36.5,18.5h.5v-72.2h22.1ZM1098,300.1c0-2.8-.2-6.5-1-9.2-3.2-14-15.2-25.5-31.8-25.5s-36.2,20-36.2,46.8,12,44.8,35.8,44.8,28.2-9.8,32.2-26.2c.8-3,1-6,1-9.5v-21.2h0Z"/>
<path class="st1" d="M1181,216.9c.2,7.5-5.2,13.5-14,13.5s-13.2-6-13.2-13.5,5.8-13.8,13.8-13.8,13.4,6,13.4,13.8h0ZM1156.5,371.9v-121h22v121h-22Z"/>
<path class="st1" d="M1316.3,338.9c0,12.5.2,23.5,1,33h-19.5l-1.2-19.8h-.5c-5.8,9.8-18.5,22.5-40,22.5s-41.8-10.5-41.8-53v-70.8h22v67c0,23,7,38.5,27,38.5s25-10.2,29-20c1.2-3.2,2-7.2,2-11.2v-74.2h22v88h0Z"/>
<path class="st1" d="M1352.8,283.6c0-12.5-.2-22.8-1-32.8h19.2l1,19.5h.8c6.8-11.5,18-22.2,38-22.2s29,10,34.2,24.2h.5c3.8-6.8,8.5-12,13.5-15.8,7.2-5.5,15.2-8.5,26.8-8.5s39.8,10.5,39.8,52.5v71.2h-21.6v-68.5c0-23.2-8.5-37.2-26.2-37.2s-22.2,9.2-26,20c-1,3-1.8,7-1.8,11v74.8h-21.5v-72.5c0-19.2-8.5-33.2-25.2-33.2s-23.8,11-27.2,22c-1.2,3.2-1.8,7-1.8,10.8v73h-21.5v-88.3h0Z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.2 KiB

@@ -0,0 +1,15 @@
<svg width="180" height="48" viewBox="220 230 1165 310" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_1637_3573)">
<path d="M358.8 240.1C293.02 240.1 239.2 293.92 239.2 359.7C239.2 425.48 293.02 479.3 358.8 479.3C424.58 479.3 478.4 425.812 478.4 359.7C478.4 293.587 424.912 240.1 358.8 240.1ZM358.8 436.443C317.937 436.443 285.046 402.889 285.046 359.7C285.046 316.511 317.937 282.956 358.8 282.956C399.663 282.956 432.553 316.511 432.553 359.7C432.553 402.889 399.663 436.443 358.8 436.443Z" fill="white"/>
<path d="M599.326 306.544C577.732 306.544 556.802 315.182 545.838 329.8V309.866H502.649V542.422H545.838V458.37C556.802 471.991 577.067 479.3 599.326 479.3C645.837 479.3 682.382 442.755 682.382 392.922C682.382 343.089 645.837 306.544 599.326 306.544ZM592.017 441.759C567.433 441.759 545.506 422.49 545.506 392.922C545.506 363.354 567.433 344.085 592.017 344.085C616.602 344.085 638.528 363.354 638.528 392.922C638.528 422.49 616.602 441.759 592.017 441.759Z" fill="white"/>
<path d="M784.046 306.544C736.871 306.544 699.662 343.421 699.662 392.922C699.662 442.423 732.22 479.3 785.375 479.3C828.896 479.3 856.803 453.054 865.441 423.486H823.249C817.933 435.779 802.983 444.416 785.043 444.416C762.784 444.416 745.841 428.802 741.854 406.543H867.434V389.6C867.434 344.417 835.873 306.544 784.046 306.544ZM742.186 375.979C746.838 355.049 764.113 341.428 785.043 341.428C807.302 341.428 824.245 356.045 826.239 375.979H742.186Z" fill="white"/>
<path d="M982.38 306.544C963.111 306.544 942.845 315.182 933.543 329.468V309.866H890.354V475.978H933.543V386.61C933.543 360.696 947.496 343.753 970.087 343.753C991.017 343.753 1002.31 359.7 1002.31 381.959V475.978H1045.5V374.982C1045.5 333.786 1020.25 306.544 982.38 306.544Z" fill="white"/>
<path d="M1156.12 243.428L1062.1 475.984H1108.28L1128.21 425.154H1235.19L1255.12 475.984H1301.96L1208.61 243.428H1156.12ZM1143.16 386.616L1181.7 289.275L1219.9 386.616H1143.16Z" fill="white"/>
<path d="M1363.42 243.428H1319.57V475.984H1363.42V243.428Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0_1637_3573">
<rect width="1603.2" height="717.6" fill="white" transform="translate(0 0.899902)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

@@ -0,0 +1,15 @@
<svg width="180" height="48" viewBox="220 230 1165 310" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_1637_2932)">
<path d="M358.8 239.3C293.02 239.3 239.2 293.12 239.2 358.9C239.2 424.68 293.02 478.5 358.8 478.5C424.58 478.5 478.4 425.012 478.4 358.9C478.4 292.787 424.912 239.3 358.8 239.3ZM358.8 435.643C317.937 435.643 285.046 402.089 285.046 358.9C285.046 315.711 317.937 282.156 358.8 282.156C399.663 282.156 432.553 315.711 432.553 358.9C432.553 402.089 399.663 435.643 358.8 435.643Z" fill="black"/>
<path d="M599.326 305.744C577.732 305.744 556.802 314.382 545.838 329V309.066H502.649V541.622H545.838V457.57C556.802 471.191 577.067 478.5 599.326 478.5C645.837 478.5 682.382 441.955 682.382 392.122C682.382 342.289 645.837 305.744 599.326 305.744ZM592.017 440.959C567.433 440.959 545.506 421.69 545.506 392.122C545.506 362.554 567.433 343.285 592.017 343.285C616.602 343.285 638.528 362.554 638.528 392.122C638.528 421.69 616.602 440.959 592.017 440.959Z" fill="black"/>
<path d="M784.046 305.744C736.871 305.744 699.662 342.621 699.662 392.122C699.662 441.623 732.22 478.5 785.375 478.5C828.896 478.5 856.803 452.254 865.441 422.686H823.249C817.933 434.979 802.983 443.616 785.043 443.616C762.784 443.616 745.841 428.002 741.854 405.743H867.434V388.8C867.434 343.617 835.873 305.744 784.046 305.744ZM742.186 375.179C746.838 354.249 764.113 340.627 785.043 340.627C807.302 340.627 824.245 355.245 826.239 375.179H742.186Z" fill="black"/>
<path d="M982.38 305.744C963.111 305.744 942.845 314.382 933.543 328.667V309.066H890.354V475.177H933.543V385.81C933.543 359.896 947.496 342.953 970.087 342.953C991.017 342.953 1002.31 358.9 1002.31 381.159V475.177H1045.5V374.182C1045.5 332.986 1020.25 305.744 982.38 305.744Z" fill="black"/>
<path d="M1156.12 242.628L1062.1 475.184H1108.28L1128.21 424.354H1235.19L1255.12 475.184H1301.96L1208.61 242.628H1156.12ZM1143.16 385.816L1181.7 288.475L1219.9 385.816H1143.16Z" fill="black"/>
<path d="M1363.42 242.628H1319.57V475.184H1363.42V242.628Z" fill="black"/>
</g>
<defs>
<clipPath id="clip0_1637_2932">
<rect width="1603.2" height="717.6" fill="white" transform="translate(0 0.0999756)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

+39
View File
@@ -0,0 +1,39 @@
name: Build
on:
push:
# branches: [master, develop]
branches: [master]
pull_request:
# branches: [master, develop]
branches: [master]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Use Python
uses: actions/setup-python@v2
with:
python-version: 3.x
- name: Use Node.js
uses: actions/setup-node@v2
with:
node-version: 24.x
cache: pnpm
- name: Enable Corepack
run: corepack enable
- name: Install
run: pnpm install
- name: Check setup
run: pnpm run check
- name: Build
run: pnpm run build
+60
View File
@@ -0,0 +1,60 @@
name: Fresh installation
on:
schedule:
- cron: '17 4 * * 1'
workflow_dispatch:
permissions:
contents: read
concurrency:
group: fresh-install-${{ github.ref }}
cancel-in-progress: false
jobs:
fresh-install:
runs-on: ubuntu-latest
timeout-minutes: 60
steps:
# Scheduled workflows are loaded from the default branch, but Leon's
# integration work lands on develop before it reaches a release branch.
- name: Check out Leon
uses: actions/checkout@v6
with:
ref: ${{ github.event_name == 'schedule' && 'develop' || github.ref }}
- name: Read runtime versions
id: versions
shell: bash
run: |
echo "node=$(jq -r '.node' bin/node/versions.json)" >> "$GITHUB_OUTPUT"
echo "pnpm=$(jq -r '.pnpm' bin/pnpm/versions.json)" >> "$GITHUB_OUTPUT"
- name: Use Node.js
uses: actions/setup-node@v6
with:
node-version: ${{ steps.versions.outputs.node }}
package-manager-cache: false
- name: Install fresh pnpm
shell: bash
run: |
corepack enable
corepack install --global "pnpm@${{ steps.versions.outputs.pnpm }}"
- name: Test the interactive installation
env:
LEON_FRESH_INSTALL_API_KEY: xxx
LEON_FRESH_INSTALL_LOG_PATH: /tmp/leon-fresh-install.log
run: node scripts/ci/test-fresh-install.js
- name: Upload installer log on failure
if: failure()
uses: actions/upload-artifact@v4
with:
name: fresh-install-log
path: /tmp/leon-fresh-install.log
if-no-files-found: ignore
retention-days: 7
+36
View File
@@ -0,0 +1,36 @@
name: Lint
on:
push:
# branches: [master, develop]
branches: [master]
pull_request:
# branches: [master, develop]
branches: [master]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Use Python
uses: actions/setup-python@v2
with:
python-version: 3.x
- name: Use Node.js
uses: actions/setup-node@v2
with:
node-version: 24.x
cache: pnpm
- name: Enable Corepack
run: corepack enable
- name: Install
run: pnpm install
- name: Run linter
run: pnpm run lint
+42
View File
@@ -0,0 +1,42 @@
name: Tests
on:
push:
# branches: [master, develop]
branches: [master]
pull_request:
# branches: [master, develop]
branches: [master]
jobs:
tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Use Python
uses: actions/setup-python@v2
with:
python-version: 3.x
- name: Use Node.js
uses: actions/setup-node@v2
with:
node-version: 24.x
cache: pnpm
- name: Enable Corepack
run: corepack enable
- name: Install
run: pnpm install
- name: Run agent unit tests
run: pnpm run test:agent:unit
- name: Run workflow unit tests
run: pnpm run test:workflow:unit
- name: Run workflow e2e tests
run: pnpm run test:workflow:e2e
+22 -13
View File
@@ -1,27 +1,36 @@
__pycache__/
.idea/
**/dist/
.fleet/
.vscode/
**/dist/*
**/build/
**/node_modules/
**/.venv/
**/.last-skill-deps-sync
**/.last-source-deps-sync
skills/**/reports/*
test/coverage/
**/tmp/*
bridges/python/.venv/*
downloads/*
logs/*
server/src/config/**/*.json
bin/deepspeech/*
bin/flite/*
core/config/**/*.json
scripts/out/*.md
package-lock.json
*.pyc
.DS_Store
*.sublime-workspace
npm-debug.log
debug.log
# Keep ignoring a repo-root .env on the safe side.
.env
!**/.gitkeep
!bridges/python/.venv/.gitkeep
.last-native-node-modules-rebuild
bridges/nodejs/.last-nodejs-bridge-deps-sync
bridges/python/src/.last-python-bridge-deps-sync
tcp_server/src/.last-tcp-server-deps-sync
bridges/python/src/Pipfile.lock
tcp_server/src/Pipfile.lock
!bridges/python/**/.gitkeep
!bridges/nodejs/**/.gitkeep
!**/*.sample*
packages/**/config/config.json
packages/**/data/db/*.json
server/src/data/expressions/classifier.json
app/js/main.js
package.json.backup
.python-version
schemas/**/*.json
+19
View File
@@ -0,0 +1,19 @@
image: gitpod/workspace-full
tasks:
- before: npm install -g @leon-ai/cli
init: leon create birth
command: leon start
ports:
- port: 1337
onOpen: notify
github:
prebuilds:
master: true
branches: true
pullRequests: true
addComment: true
addBadge: true
addLabel: true
+1
View File
@@ -0,0 +1 @@
tsx scripts/commit-msg.js
+1
View File
@@ -0,0 +1 @@
lint-staged
+3
View File
@@ -0,0 +1,3 @@
{
"*.{js,jsx,ts,tsx,mjs,cjs}": ["eslint --fix --ignore-pattern .gitignore"]
}
+1
View File
@@ -0,0 +1 @@
lts/*
+325 -42
View File
@@ -1,79 +1,362 @@
# [1.0.0-beta.2](https://github.com/leon-ai/leon/compare/1.0.0-beta.1...1.0.0-beta.2) (2019-04-24)
# [1.0.0-beta.8](https://github.com/leon-ai/leon/compare/v1.0.0-beta.7...v1.0.0-beta.8) (2023-05-01) / Binaries and TypeScript Rewrite
_Please refer to [our latest blog post](https://blog.getleon.ai/binaries-and-typescript-rewrite-1-0-0-beta-8/) for more information on the new release of our dear Leon._
# [1.0.0-beta.7](https://github.com/leon-ai/leon/compare/v1.0.0-beta.6...v1.0.0-beta.7) (2022-08-24) / A Much Better NLP
_Please [read this blog post](https://blog.getleon.ai/a-much-better-nlp-and-future-1-0-0-beta-7/) to know more about all the new features and the exciting future of Leon._
### BREAKING CHANGES
- remove legacy packages [07743657](https://github.com/leon-ai/leon/commit/07743657cd2954e7f850c08eea7c032c24b28a96)
### Features
- can send custom HTTP headers
- create new NLP skills resolvers model + NLP global resolvers model [602604e4](https://github.com/leon-ai/leon/commit/602604e43788c6b6be8c402d54fe54342d0cd5d6)
- better isolate skill resolvers from global resolvers + finish up Akinator skill [905d248e](https://github.com/leon-ai/leon/commit/905d248ebf7e84b1ccc74450520228aef9a8804a)
- transfer language from core to skills + support thematics on Akinator skill [b35a249b](https://github.com/leon-ai/leon/commit/b35a249bf68000d6708aaee4abc4cd97f5b80035)
- actions on slot level + akinator skill progress [7101b8b4](https://github.com/leon-ai/leon/commit/7101b8b4b828b49e009da2fcdac7c5ed2e48c8f8)
- add Cartesian sample training on resolvers + enum entities [6ed88a59](https://github.com/leon-ai/leon/commit/6ed88a5946c77b356e49fe8b9cbe890b8dd1f037)
- map skills resolvers intents [eb5ade76](https://github.com/leon-ai/leon/commit/eb5ade76844dd14f5d5a5c5eeb434eed70fe62f4)
- train skills resolvers and remap as per changes [82df0a3c](https://github.com/leon-ai/leon/commit/82df0a3c235fbd50ad0cfe12e23a51f777dcd658)
- achieve Cartesian training [a1e9011d](https://github.com/leon-ai/leon/commit/a1e9011d5db48ed8e9f49cef2d813ee7e2400ec2)
- introduce suggestions [dcddacca](https://github.com/leon-ai/leon/commit/dcddacca2956529de0aea8ff98e1e6f16104966a)
- communicate suggestions to the client [4b5a8835](https://github.com/leon-ai/leon/commit/4b5a883510fd4421a491f999cc21d8f7dd369a03)
- shared skills memory [795acc5b](https://github.com/leon-ai/leon/commit/795acc5bdd29e9a27d1cf3b4407453648d573973)
- support dynamic variables on skill NLU settings for logic type [10d10a16](https://github.com/leon-ai/leon/commit/10d10a1690cb65970932ee7230e3f324ec67dbce)
- tmp resolvers mapping [b1a332ba](https://github.com/leon-ai/leon/commit/b1a332bab6af8b74a8c58c07bac3ef3a1cebad89)
- start to map resolvers between the core and skills [e88495a9](https://github.com/leon-ai/leon/commit/e88495a9a94e86026fd0c7c4c44f3ff06edb2e80)
- train affirmation and denial resolver [993d52e8](https://github.com/leon-ai/leon/commit/993d52e8686f335039ff3d5e2a82c1a37efb1825)
- Python TCP server and Node.js TCP client for IPC (wip) [5970ec9e](https://github.com/leon-ai/leon/commit/5970ec9e8e4c2784c50e2ddc76b34b71aa4310e6)
- introduce spaCy for complete NER (wip) [caa86fc8](https://github.com/leon-ai/leon/commit/caa86fc8a6850b18f67ba7bedb423be693a88d17)
- slot filling (wip) [76547d94](https://github.com/leon-ai/leon/commit/76547d9411c32e0eb2ccfdac3a4901d2d2fb37f6)
- share data across domains [f4f9fff9](https://github.com/leon-ai/leon/commit/f4f9fff9783861be183990d7869973c7a30c8104)
- dynamic variable binding on NLG [0367b44f](https://github.com/leon-ai/leon/commit/0367b44f211c1629fffe6981a730f171707bf0c0)
- context and slot filling preparation (wip) [975b8ebc](https://github.com/leon-ai/leon/commit/975b8ebcf00db91b44dd067be6dde5c1bf32fff1)
- annotate entities on the fly + prepare for dialog skill type and cross-domains data [4107932d](https://github.com/leon-ai/leon/commit/4107932d000086188d6f44ef67b73cc322fc58e5)
- new NLP training [d8023308](https://github.com/leon-ai/leon/commit/d8023308d0ef1f3eede37f21f45daa2f893031b0)
- **server:**
- trigger next action suggestions or current ones [244d08c0](https://github.com/leon-ai/leon/commit/244d08c0bd0fea315269f52ab899f9b7fe083f51)
- introduce main NLP model and resolvers NLP model [e37526d9](https://github.com/leon-ai/leon/commit/e37526d9056d858ebcf17b81f6714f47b67c77cb)
- change log emojis [843bc428](https://github.com/leon-ai/leon/commit/843bc428b8deb397e2d051a8e0bfaf1b82b459a2)
- provide nextAction even when no slot is set and clean up NLU object on context switch [8377c63d](https://github.com/leon-ai/leon/commit/8377c63db4e4e42ed929171cd8b9abdb13c44b2a)
- report full traceback from skills execution [b69b1fea](https://github.com/leon-ai/leon/commit/b69b1fea16250421bc7d5def1c973dd43e453071)
- support on-the-fly entity annotation for built-in entities [567b030c](https://github.com/leon-ai/leon/commit/567b030c4fcf8df266c39cca61a146fb33b9e0fc)
- save slots within conversation context [fce47cdb](https://github.com/leon-ai/leon/commit/fce47cdbd570993ac5cca2b4ff5bc97969df4e40)
- resolve resolvers tmp [ceea47ff](https://github.com/leon-ai/leon/commit/ceea47ff7dd536bfd3adf3cc355e90e3e94b1cbd)
- prepare the next action on non-slot-filled skills [0acb31a9](https://github.com/leon-ai/leon/commit/0acb31a9c61c1c094b29f3d0ff2647d625eab0be)
- add more affirmative utterance samples [870ab2e8](https://github.com/leon-ai/leon/commit/870ab2e87eba2c548d38dc90d30553e7fa380c1e)
- restart a skill with the original utterance saved in context [f4446ef1](https://github.com/leon-ai/leon/commit/f4446ef17796d38d0f98d5b7e889503622a1a998)
- clean up context if the action loop does not meet the expected items [035c9d52](https://github.com/leon-ai/leon/commit/035c9d5240472ac19a84ae8c1a87844fa0d0af5d)
- add handsigns custom entity [1529c720](https://github.com/leon-ai/leon/commit/1529c72039092c7b8f37304d6064e04f2dc7b795)
- reprocess NLU in case of slot filling interruption [9e242d77](https://github.com/leon-ai/leon/commit/9e242d77d32109e9355eec422790a5a66fd18f9c)
- handle action loop when slots have all been filled at once [f8830502](https://github.com/leon-ai/leon/commit/f88305020a5bc79056b7ff9c1a31f8d3c3a7cdce)
- break the action loop from the skill [27dc801c](https://github.com/leon-ai/leon/commit/27dc801cf53de5af3d54b95f42d2b9e627090867)
- stop action loop from skill to core [99681e25](https://github.com/leon-ai/leon/commit/99681e257795a18361be379b93244088401f640b)
- introduce basic concept of action loop [c5b38400](https://github.com/leon-ai/leon/commit/c5b38400821e5bc5edc4402d007f815f24319d44)
- prepare action loop feature [19e1aa22](https://github.com/leon-ai/leon/commit/19e1aa22f6e989e90eb745e3a7b7ccb8ff5adbfa)
- add current utterance entities to differentiate from the whole context [8b56a185](https://github.com/leon-ai/leon/commit/8b56a1850c9d76e335f1bad1b4395d73ddc5ea19)
- when a context is activated, pick up the most probable classification [8e186879](https://github.com/leon-ai/leon/commit/8e1868798c8750c19b1719a44dc6fb8bca68b250)
- persist entities into contexts [87575773](https://github.com/leon-ai/leon/commit/875757739f6701f54805eeff2c7c350cff36c4ac)
- forward slots to skill + add original utterance [68e40f65](https://github.com/leon-ai/leon/commit/68e40f65df0d1fe29ccad991868a2408c6e1015e)
- handle case when all slots have been filled in one utterance [22e9234b](https://github.com/leon-ai/leon/commit/22e9234b3d2c97e83eaafaeeb5aa9d27c351c95a)
- trigger next action once all slots have been filled [9b870010](https://github.com/leon-ai/leon/commit/9b870010dd929bc1aed6d87696f1cc4e9f177c0b)
- complete slot filling before triggering the next action [9124687e](https://github.com/leon-ai/leon/commit/9124687eb0e17295a30f860752ee622ba44d1440)
- from modules to skills with type at the actions level [77ebaf4a](https://github.com/leon-ai/leon/commit/77ebaf4a9c78b2e471d39872e361ea05b163580d)
- verify if all slots are filled [e27c1b9c](https://github.com/leon-ai/leon/commit/e27c1b9c8f5c2f668f464f152ad227d65ba5ef6b)
- context and slot filling, keep context and await for entities [25adf406](https://github.com/leon-ai/leon/commit/25adf406c810e48b1277105dd6c269a2ed601d28)
- unstack oldest context [1ece25a4](https://github.com/leon-ai/leon/commit/1ece25a497acc9f9876fe158ace5da38beec31e6)
- context setup with slot for each conversation (wip) [8257eb87](https://github.com/leon-ai/leon/commit/8257eb8792c9f4fc90bcc1b393d3fddf8ff541dc)
- resolve slots from slot filling [960a6dc7](https://github.com/leon-ai/leon/commit/960a6dc71c2efb50ad6a8448d447ebd79c559c41)
- pickup questions for slot filling [3bbc2f8a](https://github.com/leon-ai/leon/commit/3bbc2f8a254d10f0c37cdb7abf016b3e418f594a)
- main slots structure (wip) [1d9b1809](https://github.com/leon-ai/leon/commit/1d9b18093b6e042ae49f557149a7822b4420cdb8)
- introduce resolvers for slot filling (wip) [334bf393](https://github.com/leon-ai/leon/commit/334bf393f2c43edd326d9de2e93c037ffeebeab5)
- slot filling PoC (tmp wip) [95bfcfe4](https://github.com/leon-ai/leon/commit/95bfcfe422f21a2946e50031a3623675dfe81b9d)
- slot filling (wip) [969a83e6](https://github.com/leon-ai/leon/commit/969a83e6081de20ec5e2bdd0329a21a3fe448f13)
- trigger unsupported language [1845eed7](https://github.com/leon-ai/leon/commit/1845eed71dadd5f693d76abd7633864014bf8af1)
- context (wip) [d1c2a11d](https://github.com/leon-ai/leon/commit/d1c2a11d8284ca4e1d4563b871c50c006e8ef8a0)
- context (wip) [a9a43ac4](https://github.com/leon-ai/leon/commit/a9a43ac478c46f3832d2af49c287bb574a70cc14)
- differenciate cities from countries for location entities [bf9bf231](https://github.com/leon-ai/leon/commit/bf9bf231f714e1edc1417e43af12fa54c00ba064)
- auto restart the TCP server when language is switching [9be7c700](https://github.com/leon-ai/leon/commit/9be7c700767672ac6e0c875d3b5ae7fa6414e4fa)
- support multi languages on TCP server [a808742c](https://github.com/leon-ai/leon/commit/a808742c927d45c18df45af133e67c98d4a0415a)
- add auto reconnect on TCP client [cbe89ed6](https://github.com/leon-ai/leon/commit/cbe89ed6ccfd727356eb34078a8a4348b2fd696f)
- make TCP client global [006e9fb0](https://github.com/leon-ai/leon/commit/006e9fb01148c2107f6acc6a562ace4809da92be)
- fully implement low-level networking for IPC [8acb82da](https://github.com/leon-ai/leon/commit/8acb82da9bacdb9b7952c4a4d130d094e07def5e)
- more accurate NLG [d5577b1e](https://github.com/leon-ai/leon/commit/d5577b1ef5cf1b8b4a924636ba4425b8b4ae133d)
- unknown_answers fallback on dialog type [28efe6e7](https://github.com/leon-ai/leon/commit/28efe6e7d542f19bf12ddede1815f7fa8cf01036)
- deep data mapping on enum NER [3ca48265](https://github.com/leon-ai/leon/commit/3ca48265e7115c8e0f02c65ba92d90412325ad76)
- NLG and entities mapping [8f2f935b](https://github.com/leon-ai/leon/commit/8f2f935b949ceb965941460d4ff1ed0084b72442)
- bootstrap skill structure [fe90c68e](https://github.com/leon-ai/leon/commit/fe90c68ea0e9b0e857b62aa9f3b0a42ba1ffed6b)
- on-the-fly language switching [f24513a2](https://github.com/leon-ai/leon/commit/f24513a22395d1903e485883f4813cdceccdbd18)
- new NLP containers [34b2aa56](https://github.com/leon-ai/leon/commit/34b2aa5655e55284d59db4569960c49965a0483c)
- (WIP) NLU refactoring [ca3f5f42](https://github.com/leon-ai/leon/commit/ca3f5f42da26eb634e10b56e9b84bd45b5543024)
- add skills domains [cf2a28aa](https://github.com/leon-ai/leon/commit/cf2a28aac2d936cc15e6aa9aa13747015d952053)
- **skill/akinator:**
- finish up [79e7df02](https://github.com/leon-ai/leon/commit/79e7df022f7daedf43db7f892e049a31924ce985)
- finished main business logic [76cae42f](https://github.com/leon-ai/leon/commit/76cae42fdeac0edcd3ebd6aa7718728617687b1b)
- backbone [02a2f714](https://github.com/leon-ai/leon/commit/02a2f71470bb4c0c6ca04526e89461d863d17145)
- **skill/birthday:**
remove birthday skill [be0b345d](https://github.com/leon-ai/leon/commit/be0b345d3f7fea562548e3fbed62b65c32eff4c0)
- **skill/color:**
introduce color skill [ce00989b](https://github.com/leon-ai/leon/commit/ce00989b01f65c5cbb5a2e13f454207c1ba7741c)
- **skill/guess_the_number:**
introduce the Guess the Number skill [fba80966](https://github.com/leon-ai/leon/commit/fba80966c937a32182e48670c47358babb539d64)
- **skill/introduction:**
- add one utterance sample [af0fdd1e](https://github.com/leon-ai/leon/commit/af0fdd1e18975bf8b60abb2957ddf79831281817)
- ask about owner info if necessary [c5cc9bdd](https://github.com/leon-ai/leon/commit/c5cc9bdd52afaaa710f9476d1e9918f3d168e243)
- **skill/mbti:**
- complete form resolver [aad9f3f1](https://github.com/leon-ai/leon/commit/aad9f3f1ef61499d438ea40c9d2d95764667678d)
- finish business logic [99a3f103](https://github.com/leon-ai/leon/commit/99a3f103e00b5a58745ee851d2fa95c61871f75a)
- questions mapping [ae4f69f7](https://github.com/leon-ai/leon/commit/ae4f69f7c7189ff75e004f68c9a2a8b6bb37b6bd)
- complete questionnaire [7f1f8871](https://github.com/leon-ai/leon/commit/7f1f8871598746c5475b24e086ea6e581f2a988e)
- main logic backbone [33109a4c](https://github.com/leon-ai/leon/commit/33109a4c8b5df82e7b98e48e66f8d53f0cc114fb)
- main NLU structure [skip ci] [86d5040a](https://github.com/leon-ai/leon/commit/86d5040a7dc2006036c7e67a2cf54a4c992e64aa)
- **skill/rochambeau:**
- add start answers [192dd0a8](https://github.com/leon-ai/leon/commit/192dd0a87ab5dc025bb90b20b187e36a58be54ea)
- introduce paper scissors rock [57370470](https://github.com/leon-ai/leon/commit/573704706c843d870f2498146bc3cd659bab4f06)
- init [7f5e30ac](https://github.com/leon-ai/leon/commit/7f5e30ac82f2a2d7579e361229a4044348915867)
- **web app:**
- join us on Discord [141c89ec](https://github.com/leon-ai/leon/commit/141c89ecbfd329a8e63d5a603d0ae6b42f9abf38)
- wait for TCP client to be connected first [bc228a68](https://github.com/leon-ai/leon/commit/bc228a68600c07871c489d6624bbc837971079a6)
### Bug Fixes
- check script with new intent-object format [fdf0a389](https://github.com/leon-ai/leon/commit/fdf0a389b76caba5dd47996a43a34c0c7821c70a)
- check new resolvers paths [cfd8f7cb](https://github.com/leon-ai/leon/commit/cfd8f7cbe5e8fd9ce3d1659c725d7af261db8d71)
- use ports.ubuntu.com mirror for the offline TTS [skip ci] [3dd90396](https://github.com/leon-ai/leon/commit/3dd9039678820fceb7ccbb1c96358c8d2f188ede)
- set skill config only when a bridge is set [7513aa7d](https://github.com/leon-ai/leon/commit/7513aa7d20fee1fe9ca5442a7909d22fd1c3b39e)
- only set skill config when it is a logic type [9ce9a8bc](https://github.com/leon-ai/leon/commit/9ce9a8bc4fe0864730a08d8e9a436982f1365aa5)
- **docker:**
- usage of Ubuntu base image with pyenv and nvm (#408) [f507f6f7](https://github.com/leon-ai/leon/commit/f507f6f7e499f56768b3e624164cbcd58193b153)
- check should not allocate a pseudo-TTY (#359) [4372b45f](https://github.com/leon-ai/leon/commit/4372b45fc605893d4130cf7110dd87519b934345)
- **server:**
- make leon handle multiple socket.io-client instances [6e7c0aac](https://github.com/leon-ai/leon/commit/6e7c0aac57008b152b45f1b0f3886ae38777467b)
- fallback on global resolver during resolver classification [ec77dd0f](https://github.com/leon-ai/leon/commit/ec77dd0f02a8ae94fb3f02c7b7847b5509d71406)
- make use of current entities to match global entities [a8d82050](https://github.com/leon-ai/leon/commit/a8d82050c86b5c24c4c898c06e5ffc3882524c0b)
- multiple slots filling [2ac1bc63](https://github.com/leon-ai/leon/commit/2ac1bc63ccd11757d586adfb2e75ce04e3ffbcb5)
- context switching on action loop [6712ae55](https://github.com/leon-ai/leon/commit/6712ae5539ef44ed33e360cfcad71c760c4b13b1)
- check one-shot slot filling case causing infinite loop [782a3aaa](https://github.com/leon-ai/leon/commit/782a3aaa0a07dda667557bc84db906b3fa9b237c)
- clean up active context after all slots have been filled [faabc2c7](https://github.com/leon-ai/leon/commit/faabc2c7b0992fcea035eedf66103d84b101e1a7)
- correctly extract all spaCy entities [6aa60bfb](https://github.com/leon-ai/leon/commit/6aa60bfbd8c72e678fe3faf5e7f9dbd37dfd209f)
- intent not found [8280c658](https://github.com/leon-ai/leon/commit/8280c65897dba0fe470a3589d151b391c51e344e)
- fallback due to modules to skills refactoring [ef0c54b2](https://github.com/leon-ai/leon/commit/ef0c54b22667ef2bd1d2c07003f6b4beb5fa25c0)
- NER due to modules to skills refactoring [e4d3904c](https://github.com/leon-ai/leon/commit/e4d3904ceeb2a3ee2c0187a1817331fac916e1a7)
- **skill/akinator:**
remove direct end on guess action [f6461f73](https://github.com/leon-ai/leon/commit/f6461f733b4a5d944dfa4a987dd1109628c6cbca)
- **skill/color:**
more appropriate answer [cb18ed63](https://github.com/leon-ai/leon/commit/cb18ed6397cb0e0ad8fbea30c57d7d40137441ee)
- **skill/rochambeau:**
final logic [0ebc0518](https://github.com/leon-ai/leon/commit/0ebc0518e61b899c35dd13df65a43f69399e784d)
### Performance Improvements
- check Pipfile instead of Pipfile.lock to judge whether Python packages must be installed [afdb71f7](https://github.com/leon-ai/leon/commit/afdb71f766f2956c5cb4a5e0be9025340d1a89db)
### Documentation Changes
- change newsletter link [4bf2a9af](https://github.com/leon-ai/leon/commit/4bf2a9af963f75aeff96f4a43da8ec1024ac583a)
- README - Edited sentence for clarity (#389) [e83a1c42](https://github.com/leon-ai/leon/commit/e83a1c4230897e8b63251ef86225cf773148c38e)
- edit newsletter link [fa558a44](https://github.com/leon-ai/leon/commit/fa558a447ade4071f352d56f14602690ed90f521)
- update sponsor [skip ci] [f30ddb6b](https://github.com/leon-ai/leon/commit/f30ddb6be5f531df2b0042be0ed5ffbe79f73b07)
- remove sponsor [skip ci] [5dbc010f](https://github.com/leon-ai/leon/commit/5dbc010fa643279a24081f3148022e2211af63f4)
- remove sponsor [skip ci] [f36dd20f](https://github.com/leon-ai/leon/commit/f36dd20f822cd33c9e8a03efc2849c8d8d1fc75e)
- remove sponsor [skip ci] [5ee57ddf](https://github.com/leon-ai/leon/commit/5ee57ddf2a9f7817ec35b2e70d49e5bb422d8f78)
- add @ant-media sponsor [skip ci] [b47cbc3a](https://github.com/leon-ai/leon/commit/b47cbc3a5ecb6591f7abb4f62feae8102b9a6468)
- add long dev notice to README [skip ci] [499be77d](https://github.com/leon-ai/leon/commit/499be77d509231b853f591e27f726381da5a50d8)
- move sponsor to new section [skip ci] [8825d687](https://github.com/leon-ai/leon/commit/8825d6877c19d86495e89a858b859b7ab1f9ae37)
- change Twitter handle [skip ci] [c1afc11c](https://github.com/leon-ai/leon/commit/c1afc11cdb283526540d0fecdf83efddf3f3a9f7)
- remove sponsor [skip ci] [99b401a6](https://github.com/leon-ai/leon/commit/99b401a668a6fb248e33c22782940402be7c9b17)
- add new sponsor self-hosted img [skip ci] [238d928c](https://github.com/leon-ai/leon/commit/238d928cace13d4ecd174ca14b136967d8845e0f)
- remove new sponsor link (broken) [skip ci] [254f2848](https://github.com/leon-ai/leon/commit/254f2848aab622b79cce16d10c58d53ff6db9a8f)
- in GitHub BUG.md from modules to skills [4a5480a3](https://github.com/leon-ai/leon/commit/4a5480a3ccc54ee34d42f6edcec2a40224dee7ed)
- change @FluxIndustries sponsorship [skip ci] [1a118b71](https://github.com/leon-ai/leon/commit/1a118b718e5d4ade123756ac94758a01c50b12ae)
- add @FluxIndustries sponsor [skip ci] [9a604d7c](https://github.com/leon-ai/leon/commit/9a604d7ccc0c6aaec257299078141dd0c3077933)
- new #LeonAI link [skip ci] [a0107d62](https://github.com/leon-ai/leon/commit/a0107d629473f7fd057d367926e83822d46f1227)
- changelog new version diff link fix [skip ci] [e14c2498](https://github.com/leon-ai/leon/commit/e14c249826db92af7b85422e566be6aa834a7fb7)
# [1.0.0-beta.6](https://github.com/leon-ai/leon/compare/v1.0.0-beta.5...v1.0.0-beta.6) (2022-02-07) / Leon Over HTTP + Making Friends with Coqui STT
### Features
- simple coqui-ai stt integration [86a4816b](https://github.com/leon-ai/leon/commit/86a4816b777fee8ec9c89648c5866a75de56c017)
- HTTP API key generator [d10a7fa7](https://github.com/leon-ai/leon/commit/d10a7fa7880a0bf2fb1cae7904d1ef4257f05257)
- avoid unnecessary routes generation
- **server:**
- make Coqui STT the default STT solution [70399187](https://github.com/leon-ai/leon/commit/7039918760c0ef7ba93bf45820e3cae774c42d8c)
- add HTTP API key middleware [cdf41499](https://github.com/leon-ai/leon/commit/cdf4149939cbe3f3ae81039957dba3377a78f5a6)
- expose queries over HTTP [b6428d03](https://github.com/leon-ai/leon/commit/b6428d038452619f1682c863892cd8f376efca84)
- add timeout action over HTTP [115f9c16](https://github.com/leon-ai/leon/commit/115f9c164559d761625cc6f362749f7d2417d300)
- handle built-in and trim entities over HTTP + add "disabled" HTTP API action option [82fb967a](https://github.com/leon-ai/leon/commit/82fb967af8f49421e3b2474184da3d34fb17294f)
- execute modules over HTTP [2e5b2c59](https://github.com/leon-ai/leon/commit/2e5b2c59da0bafe3acd966773c6fac3611b3bd0c)
- generate Fastify routes on the file to expose packages over HTTP [5b41713a](https://github.com/leon-ai/leon/commit/5b41713a68ee628e695212dbebc88f6b9a94b461)
### Bug Fixes
- do not ask to regenerate the HTTP API key if this one isn't available yet [d265377a](https://github.com/leon-ai/leon/commit/d265377a43fd4506cf12db46f261b891f2054ed2)
- Python deps tree check [c6c01291](https://github.com/leon-ai/leon/commit/c6c012915824227efdf0c50df6a8f1cd8d70ed42)
- hotword offline (#342) [f563d01d](https://github.com/leon-ai/leon/commit/f563d01d077499c836e94c86f85cedc2ad4d56e6)
- addressed comments by @JRMeyer [b1c6f5c8](https://github.com/leon-ai/leon/commit/b1c6f5c883103d57d4fe566af640fc3ac5ce713d)
- allow to detect STT offline capabilities [04d62288](https://github.com/leon-ai/leon/commit/04d622884165e0bde65785569a659f59cf9e8582)
- Amazon Polly is always configured on check script due to new structure [e6246d1f](https://github.com/leon-ai/leon/commit/e6246d1f8f9ec15a4ebe9600764afffbaa7e62d9)
### Performance Improvements
- check if Python deps tree has been updated before going through deps install [2d0b0f13](https://github.com/leon-ai/leon/commit/2d0b0f1365d8e4d6eadf9f7cc0a16b7b4b4306f4)
# [1.0.0-beta.5](https://github.com/leon-ai/leon/compare/v1.0.0-beta.4...v1.0.0-beta.5) (2021-12-28) / Refocus
_This release marks a major turn in the future versions of the Leon core. Please [read this blog post](https://blog.getleon.ai/i-ran-away-from-open-source/) to know more._
### BREAKING CHANGES
- Node.js 16+ and npm 8+ minimum requirements [2f66f1c1](https://github.com/leon-ai/leon/commit/2f66f1c17bb2e4a1c18b4251d49de252b8d87344)
### Features
- **server:** support arrays on NER between conditions [7cf7f979](https://github.com/leon-ai/leon/commit/7cf7f9791254e1950fe9128ce1b3a58079cc2ada)
### Bug Fixes
- jest-extended new setup due to latest update [02f766d6](https://github.com/leon-ai/leon/commit/02f766d6a8453609ebaec78356aa6e6d4df0967b)
### Performance Improvements
- Windows setup on DeepSpeech dep removal [13f5a49f](https://github.com/leon-ai/leon/commit/13f5a49f678f8f67a93b67d4f558cddcf237e204)
### Documentation Changes
- URL redirect managed by registrar [c16d5b28](https://github.com/leon-ai/leon/commit/c16d5b280b758f7e18305e30678adec79f0a0716)
# [1.0.0-beta.4](https://github.com/leon-ai/leon/compare/1.0.0-beta.2...v1.0.0-beta.4) (2021-05-01) / Getting Rid of Dust
_This release includes a lot of changes that are made under the hood and are not displayed here, please **[read the blog post](https://blog.getleon.ai/getting-rid-of-dust-1-0-0-beta-4/)** to know more._
### BREAKING CHANGES
- **package/checker:** introduce Have I Been Pwned v3 API with API key ([0ca89fe3](https://github.com/leon-ai/leon/commit/0ca89fe32d51c80cec5f9446acf14990390a5917))
- **server:**
- AWS SDK new structure due to v3 and adapt Amazon Polly changes ([f15f2db7](https://github.com/leon-ai/leon/commit/f15f2db78e5781d05e5e2bcb186645966d17debf))
- IBM Watson TTS and STT new structure ([f41ea0e9](https://github.com/leon-ai/leon/commit/f41ea0e9a1479bfd6a1cb2e8d1f70aec744c685b) | [2668c295](https://github.com/leon-ai/leon/commit/2668c295880ee753ef7ca26a91dbc7e0901febff))
### Features
- **package/calendar:** introduce To-Do list module ([0cdd73d6](https://github.com/leon-ai/leon/commit/0cdd73d6c24a287915f691e3b12edacd75fd383a) | [857be947](https://github.com/leon-ai/leon/commit/857be947792c650ac35847e14fc41064008cef24) | [2041be14](https://github.com/leon-ai/leon/commit/2041be14dbc01640a61de96d1982cc20cd05a8b3) | [12e8f5c3](https://github.com/leon-ai/leon/commit/12e8f5c3bfb436aa212557cd99d9926aa431ab4f) | [8575e9e3](https://github.com/leon-ai/leon/commit/8575e9e3ef01499d9f7be6d313a85d48549e9107) | [5e128df0](https://github.com/leon-ai/leon/commit/5e128df023977525de3e66ce2826aace87569308) | [602aa694](https://github.com/leon-ai/leon/commit/602aa694ac49333f48c119cf2ca2aa7f54b8ae44) | [b9693df9](https://github.com/leon-ai/leon/commit/b9693df90cbc01067e18e64db4d377e41b3fd1d4) | [581da8cd](https://github.com/leon-ai/leon/commit/581da8cd9806323aabb0e85778d645df3c0948b9) | [53f7db55](https://github.com/leon-ai/leon/commit/53f7db55c6e916751f1d59c239628d5ea8914009) | [ae073971](https://github.com/leon-ai/leon/commit/ae0739717b6a17373d8f9bc69571c67c1c571b4a))
- **package/checker:** introduce Have I Been Pwned module ([61c1b55a](https://github.com/leon-ai/leon/commit/61c1b55af5691c03f6a6dae0cf3f236a374f1fe7) | [5a999bc6](https://github.com/leon-ai/leon/commit/5a999bc63aa0c667c4e3092daac6a05a6c4b4499) | [36368664](https://github.com/leon-ai/leon/commit/36368664fce8bcf0c17c4c83818aeb418f1e2f23) | [a7a6d885](https://github.com/leon-ai/leon/commit/a7a6d885a83455163eeca74a355177d65db156b8) | [c73ba52b](https://github.com/leon-ai/leon/commit/c73ba52ba8575a64b3329e59a50050d15281d0ec) | [8374e548](https://github.com/leon-ai/leon/commit/8374e5481022de9b134f49180a8dfe28db136261) | [a476fd0f](https://github.com/leon-ai/leon/commit/a476fd0f38f18bf8035db213be2c55f83871038d))
- **package/network:** add speedtest module ([09ad4340](https://github.com/leon-ai/leon/commit/09ad43406d3df8ca65f385a91c159def51f91811))
- **server:**
- add regex entity type [3fda3526](https://github.com/leon-ai/leon/commit/3fda3526c7425bdea4b669474fa77efd61c06a8e)
- catch unsupported action entity type [5bc6c3f1](https://github.com/leon-ai/leon/commit/5bc6c3f116d6b9ece2cc3bebdbdb08f019ee90b9)
- NER backbone [24cf3c9a](https://github.com/leon-ai/leon/commit/24cf3c9a4facd05a4c626ff9d2e7c83a5ae15298)
- introduce actions module [b449376f](https://github.com/leon-ai/leon/commit/b449376f61dc995e2e264c6a14ba123926f5cc58)
### Bug Fixes
- set correct status code for GET /downloads [690f1841](https://github.com/leon-ai/leon/commit/690f1841d681a1e48e1837e3e166228d6c2ddaf6)
- take `.env` in consideration when using Docker [d38e6095](https://github.com/leon-ai/leon/commit/d38e6095f9b71467b8486430fba4bb7007ec4c5a)
- spinner test [9071c927](https://github.com/leon-ai/leon/commit/9071c92790be674687590e4a896bbf44bc26fb43)
- e2e tests by adding modules actions level [5cf77d90](https://github.com/leon-ai/leon/commit/5cf77d9011a80b326f229b2309a6910ac0f1cfa2)
- **package/leon:** fix english translations [90225707](https://github.com/leon-ai/leon/commit/90225707f94154021cadeb9c61bdc48c3de5aa29)
- **package/network:** make use of new compatible speedtest lib [0c925626](https://github.com/leon-ai/leon/commit/0c925626df65858fa039972b3f3d5f38fde93eb6)
- **package/trend:**
- GitHub module new scraping [68414937](https://github.com/leon-ai/leon/commit/6841493740ca859000c1fd8d692b73fc79fcf500)
- when there is no star provided on the GitHub module [563fb409](https://github.com/leon-ai/leon/commit/563fb40955e2deb5c6d0bd064fc9cc8766a6fcaf)
- **server:**
- make use of Basic plugin from the main NLP container [e1d5bed3](https://github.com/leon-ai/leon/commit/e1d5bed3e688db566a0cb803dda5c2d57c599d8c)
- NER trim entity on after conditions [fa6a5a43](https://github.com/leon-ai/leon/commit/fa6a5a43a60b493aa403a44957082382494c129b)
### Documentation Changes
- add minimum Pipenv version requirement to README [72e46bd6](https://github.com/leon-ai/leon/commit/72e46bd6c175a4a149fb6b14522823b224d7c152)
- hunt broken links [b2a22792](https://github.com/leon-ai/leon/commit/b2a2279243e7566b57fb7f696024bdf08294e853)
- add "ci" commit type in CONTRIBUTING.md [09e2672b](https://github.com/leon-ai/leon/commit/09e2672b0b399f5ce9dd7cd446d04f4d6fd7c13a)
- use emojies in README [0ea7a78b](https://github.com/leon-ai/leon/commit/0ea7a78b7c94dc44c992913ae1c90fb1cf8a7692)
- add social badges to README [c55c7532](https://github.com/leon-ai/leon/commit/c55c7532b25bf420c4819be71b0f9c21ccc58711)
- Node.js 14 requirement [d1034bd1](https://github.com/leon-ai/leon/commit/d1034bd135fd5a6314a1571d4088fd85a8e6a1da)
# [1.0.0-beta.2](https://github.com/leon-ai/leon/compare/1.0.0-beta.1...1.0.0-beta.2) (2019-04-24)
### Features
- can send custom HTTP headers
([2685cdab](https://github.com/leon-ai/leon/commit/2685cdab07cc1a9ea418eab812e5163d2dd0da90))
- allow HTML output
- allow HTML output
([ec3f02df](https://github.com/leon-ai/leon/commit/ec3f02dfaf2f4b7623ce350350ebee28cf18740e))
- NLU improvement with node-nlp
- NLU improvement with node-nlp
([6585db71](https://github.com/leon-ai/leon/commit/6585db718ccae1d750a35783075cf61cc8fe84f1))
- **package/trend:**
- add answer when the Product Hunt developer token is not provided
([f40b479b](https://github.com/leon-ai/leon/commit/f40b479b295247c5a8a0e6ed81afe56fadfd2730))
- Product Hunt module done
([37794306](https://github.com/leon-ai/leon/commit/3779430621bef970be0e8d048eb0b4bf160ae8a4))
- basics done on the Product Hunt module
([32cc7dbe](https://github.com/leon-ai/leon/commit/32cc7dbe36592fb9618d9c10da5f05a4be7e41b6))
- complete dedicated answers according to the technology and given time
([8997d691](https://github.com/leon-ai/leon/commit/8997d6917445f837c9647a5a9b4d6998d2df4952))
- GitHub module done
([7c6f3922](https://github.com/leon-ai/leon/commit/7c6f3922f299193ee0fb54d0fc97f8b436fc706b))
- be able to choose a limit and a date range for the GitHub module
([3c088371](https://github.com/leon-ai/leon/commit/3c0883716e1c10371c399843a578095a1e16781d))
- format GitHub results in one message
([9d026b94](https://github.com/leon-ai/leon/commit/9d026b94efa8871d421ae2b593b96622a98537ac))
- simple GitHub module results
([5baec074](https://github.com/leon-ai/leon/commit/5baec07455f453d4ad003f1da360b2663b7e15e0))
- list GitHub trends in HTML raw
([3441629e](https://github.com/leon-ai/leon/commit/3441629e3cde933b322cb114d9f1bc3ef0eb3944) | [6b932e94](https://github.com/leon-ai/leon/commit/6b932e947fc365ea6435fda798b7cca32708b443))
- expressions dataset and structure
([f406a5a0](https://github.com/leon-ai/leon/commit/f406a5a09894e12c56a1e76dda609adada00b0d7) | [f54c2272](https://github.com/leon-ai/leon/commit/f54c2272b4b4dc5c56b512b0ccc1519d77ef15a3))
- **package/trend:**
- add answer when the Product Hunt developer token is not provided
([f40b479b](https://github.com/leon-ai/leon/commit/f40b479b295247c5a8a0e6ed81afe56fadfd2730))
- Product Hunt module done
([37794306](https://github.com/leon-ai/leon/commit/3779430621bef970be0e8d048eb0b4bf160ae8a4))
- basics done on the Product Hunt module
([32cc7dbe](https://github.com/leon-ai/leon/commit/32cc7dbe36592fb9618d9c10da5f05a4be7e41b6))
- complete dedicated answers according to the technology and given time
([8997d691](https://github.com/leon-ai/leon/commit/8997d6917445f837c9647a5a9b4d6998d2df4952))
- GitHub module done
([7c6f3922](https://github.com/leon-ai/leon/commit/7c6f3922f299193ee0fb54d0fc97f8b436fc706b))
- be able to choose a limit and a date range for the GitHub module
([3c088371](https://github.com/leon-ai/leon/commit/3c0883716e1c10371c399843a578095a1e16781d))
- format GitHub results in one message
([9d026b94](https://github.com/leon-ai/leon/commit/9d026b94efa8871d421ae2b593b96622a98537ac))
- simple GitHub module results
([5baec074](https://github.com/leon-ai/leon/commit/5baec07455f453d4ad003f1da360b2663b7e15e0))
- list GitHub trends in HTML raw
([3441629e](https://github.com/leon-ai/leon/commit/3441629e3cde933b322cb114d9f1bc3ef0eb3944) | [6b932e94](https://github.com/leon-ai/leon/commit/6b932e947fc365ea6435fda798b7cca32708b443))
- expressions dataset and structure
([f406a5a0](https://github.com/leon-ai/leon/commit/f406a5a09894e12c56a1e76dda609adada00b0d7) | [f54c2272](https://github.com/leon-ai/leon/commit/f54c2272b4b4dc5c56b512b0ccc1519d77ef15a3))
### Bug Fixes
- Leon was not fully installed with Docker if a `.env` file was existing
- Leon was not fully installed with Docker if a `.env` file was existing
([c8a68ab0](https://github.com/leon-ai/leon/commit/c8a68ab02eec9ddaf803b6e36cd7e91a4989cdea))
- **package/trend:**
- **package/trend:**
when there is no contributor on GitHub module
([d845e49b](https://github.com/leon-ai/leon/commit/d845e49b0f18caeb306e2d399c50a03883b2f55d))
- **server:**
- skip Pipenv locking until they fix it
([029381e3](https://github.com/leon-ai/leon/commit/029381e3256933f37f5c2950c4eb1f0192f55ec6) | [ecfdc73f](https://github.com/leon-ai/leon/commit/ecfdc73f8290dd9e1910df9519095516a1227763))
- **server:**
- skip Pipenv locking until they fix it
([029381e3](https://github.com/leon-ai/leon/commit/029381e3256933f37f5c2950c4eb1f0192f55ec6) | [ecfdc73f](https://github.com/leon-ai/leon/commit/ecfdc73f8290dd9e1910df9519095516a1227763))
### Documentation Changes
- add `What is Leon able to do?` section in the readme
- add `What is Leon able to do?` section in the readme
([87f53c91](https://github.com/leon-ai/leon/commit/87f53c91368141966959f3ad7299bb7b643828a5) | [d558fc8b](https://github.com/leon-ai/leon/commit/d558fc8b7c6494babf5dec799802227f77c33d8a))
- open-source != open source
- open-source != open source
([16a9372e](https://github.com/leon-ai/leon/commit/16a9372e05d4d31a7a39a65a52d4708b72499d4c) | [2155cd88](https://github.com/leon-ai/leon/commit/2155cd88decbbd671bd58840291d9330ce06ebba))
# [1.0.0-beta.1](https://github.com/leon-ai/leon/compare/1.0.0-beta.0...1.0.0-beta.1) (2019-02-24)
### Features
- add Docker support
- add Docker support
([209760db](https://github.com/leon-ai/leon/commit/209760dba747001300692fb6a6af97543de584d6))
### Bug Fixes
- **package/checker:**
- **package/checker:**
isitdown module fails with capital letters in URL
([ada6aaef](https://github.com/leon-ai/leon/commit/ada6aaef4bada47e87d28f9f6eaa05b9e23f58d2))
- **web app:**
- **web app:**
enable environment variables
([a438d6f9](https://github.com/leon-ai/leon/commit/a438d6f942812f74e3dda75a9875609f8bea21cd))
### Performance Improvements
- **web app:**
- **web app:**
favicon compression
([33dbcb42](https://github.com/leon-ai/leon/commit/33dbcb425eaafba90176ff64e5f689eb36bc6ce1))
### Documentation Changes
- update README to make the reader genderless
- update README to make the reader genderless
([58662658](https://github.com/leon-ai/leon/commit/586626586b7a2f84cb2cd84028111976bc5172f0))
- use "to rule them all" in README
- use "to rule them all" in README
([c74dda4c](https://github.com/leon-ai/leon/commit/c74dda4cb9acc78de143ae01fdc6b4ef0a5ec3ef))
- **readme:**
- **readme:**
add story write-up
([08a68e37](https://github.com/leon-ai/leon/commit/08a68e376b6a9367425947380564120943376500))
# [1.0.0-beta.0](https://github.com/leon-ai/leon/compare/https://github.com/leon-ai/leon.git...1.0.0-beta.0) (2019-02-10)
Initial release.
-26
View File
@@ -1,26 +0,0 @@
FROM node:10-alpine
WORKDIR /app
COPY . .
# Install system packages
RUN apk add --no-cache \
ca-certificates \
build-base \
python3 \
git \
tzdata
# Upgrade pip and install Pipenv
RUN pip3 install --upgrade pip \
&& pip install pipenv
# Install Leon
# Need to explicitly run the npm preinstall and npm posinstall scripts
# because npm tries to downgrade its privileges, and these scripts are not executed
RUN npm run preinstall
RUN npm install
RUN npm run postinstall
RUN npm run build
# Let's run it
CMD ["npm", "start"]
+1 -1
View File
@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2019-present, Louis Grenard <louis.grenard@gmail.com>
Copyright (c) 2019-present, Louis Grenard <louis@getleon.ai>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
+120 -92
View File
@@ -1,155 +1,183 @@
<p align="center">
<a href="https://getleon.ai"><img width="96" src="https://getleon.ai/img/logo.svg"></a><br><br>
<a href="https://www.youtube.com/watch?v=p7GRGiicO1c"><img width="512" src="https://getleon.ai/img/1.0.0-beta.0_preview_en.png"></a><br>
<a href="https://getleon.ai"><img width="800" src="https://getleon.ai/img/hero-animation.gif" /></a>
</p>
<h1 align="center">Leon</h1>
<h1 align="center">
<a href="https://getleon.ai"><img width="96" src="https://getleon.ai/img/logo.svg" alt="Leon"></a><br>
Leon
</h1>
*<p align="center">Your open-source personal assistant.</p>*
_<p align="center">Your open-source personal AI assistant.</p>_
<p align="center">
<a href="https://github.com/leon-ai/leon/blob/develop/LICENSE.md"><img src="https://img.shields.io/badge/license-MIT-blue.svg?style=flat"/></a>
<a href="https://circleci.com/gh/leon-ai/leon/tree/develop"><img src="https://img.shields.io/circleci/project/github/leon-ai/leon.svg?style=flat"/></a>
<a href="https://github.com/leon-ai/leon/blob/develop/.github/CONTRIBUTING.md"><img src="https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat"/></a>
<a href="https://discord.gg/MNQqqKg"><img src="https://img.shields.io/badge/Discord-%235865F2.svg?style=for-the-badge&logo=discord&logoColor=white" /></a>
<a href="https://github.com/leon-ai/leon/blob/develop/LICENSE.md"><img src="https://img.shields.io/badge/License-MIT-1c75db?style=for-the-badge" /></a>
</p>
<p align="center">
<a href="https://getleon.ai">Website</a> ::
<a href="https://docs.getleon.ai">Documentation</a> ::
<a href="https://roadmap.getleon.ai">Roadmap</a> ::
<a href="https://github.com/leon-ai/leon/blob/develop/.github/CONTRIBUTING.md">Contributing</a> ::
I share Leon progress most regularly on <a href="https://x.com/grenlouis"><strong>X / @grenlouis</strong></a>
</p>
<p align="center">
<a href="https://x.com/grenlouis">Follow progress on X / @grenlouis</a> ·
<a href="https://getleon.ai">Website</a> ·
<a href="https://leonai.substack.com/subscribe">Newsletter</a> ·
<a href="http://roadmap.getleon.ai">Roadmap</a> ·
<a href="https://blog.getleon.ai/the-story-behind-leon/">Story</a>
</p>
---
## Introduction
## ⚠️ Important Notice (as of 2026-03-29)
Leon is an **open-source personal assistant** who can live **on your server**.
> [!IMPORTANT]
> Leon is currently focused on the **2.0 Developer Preview** on the `develop` branch.
>
> - The new documentation is **not ready yet**.
> - The current docs site and older guides mostly reflect the legacy architecture.
> - If you want the legacy, more stable pre-agentic version of Leon, use the `master` branch.
> - If you want to explore or contribute to Leon's new core, `develop` is the right place.
He **does stuff** when you **ask him for**.
The most accurate high-level references for Leon's current state are:
You can **talk to him** and he can **talk to you**.
You can also **text him** and he can also **text you**.
If you want to, Leon can communicate with you by being **offline to protect your privacy**.
- [`core/context/LEON.md`](./core/context/LEON.md)
- [`core/context/ARCHITECTURE.md`](./core/context/ARCHITECTURE.md)
### Why?
## 👋 Introduction
> 1. If you are a developer (or not), you may want to build many things that could help in your daily life.
> Instead of building a dedicated project for each of those ideas, Leon can help you with his
> packages/modules (skills) structure.
> 2. With this generic structure, everyone can create their own modules and share them with others.
> Therefore there is only one core (to rule them all).
> 3. Leon uses AI concepts, which is cool.
> 4. Privacy matters, you can configure Leon to talk with him offline. You can already text with him without any third party services.
> 5. Open source is great.
**Leon** is **your open-source personal AI assistant** built around **tools, context, memory, and agentic execution**.
### What is this repository for?
Leon is designed to stay practical, privacy-aware, and grounded in your real environment. It can operate locally, use dedicated tools instead of relying on free-form guessing, and complete tasks from start to finish across deterministic workflows and agent-style execution.
> This repository contains the following nodes of Leon:
> - The server
> - The packages/modules
> - The web app
> - The hotword node
## 🧠 What Leon Is Today
### What is Leon able to do?
Leon is no longer just a classic intent-classification assistant like it was for its first release in 2019.
> Today, the most interesting part is about his core and the way he can scale up. He is pretty young but can easily scale to have new features (packages/modules).
> You can find what he is able to do by browsing the [packages list](https://github.com/leon-ai/leon/tree/develop/packages).
Today, Leon is being built as a more capable assistant that can understand a goal, choose how to handle it, use tools, remember useful information, and recover when something goes wrong.
Sounds good for you? Then let's get started!
- Leon can run in different ways depending on the task: `smart` mode chooses for you, `controlled` mode follows deterministic native skills and actions, and `agent` mode can plan step by step.
- Leon supports native skills for controlled actions and agent skills for `SKILL.md`-backed workflows.
- Leon can use real tools to get work done instead of only replying with plain text.
- Leon can use context about your environment so answers stay grounded in what is actually happening on your machine and setup.
- Leon keeps layered memory so it can remember durable preferences, day-to-day context, and recent discussion context.
- Leon supports both local and remote AI providers, which helps balance privacy, control, and capability.
- Under the hood, Leon-native skills follow `Skills -> Actions -> Tools -> Functions (-> Binaries)`.
## Getting Started
Leon also keeps a compact self-model and a bounded proactive pulse system so it can stay more consistent over time without flooding itself with unnecessary context.
## Why?
- **Privacy matters**: Leon can work with local models and local context instead of forcing everything through third-party services.
- **Grounded behavior matters**: Leon prefers explicit tools, context, and memory over vague model-only responses.
- **Extensibility matters**: skills, toolkits, bridges, and binaries make it possible to keep Leon modular.
- **Open source matters**: anyone can inspect the architecture, build on top of it, and help shape where it goes next.
## 🚀 Getting Started
### Prerequisites
- [Node.js](https://nodejs.org/) >= 10
- npm >= 5
- [Python](https://www.python.org/downloads/) 3.6.x
- [Pipenv](https://docs.pipenv.org)
- Supported OSes: Linux, macOS and Windows
- [Node.js](https://nodejs.org/) >= 24.0.0
- Supported OSes: Linux, macOS, and Windows
To install these prerequisites, you can follow the [How To section](https://docs.getleon.ai/how-to/) of the documentation.
Recommended: manage Node.js with [Volta](https://volta.sh/).
### Installation
```sh
# Clone the repository (stable branch)
git clone -b master https://github.com/leon-ai/leon.git leon
# OR download the latest release at: https://github.com/leon-ai/leon/releases/latest
# Clone the repository
git clone https://github.com/leon-ai/leon.git
# Go to the project root
cd leon
# Install
npm install
# Install pnpm
npm install --global pnpm@latest
# Install dependencies
pnpm install
```
### Usage
### Run Leon
```sh
# Run Leon
pnpm start
```
### Check Your Setup
```sh
# Check the setup went well
npm run check
# Build
npm run build
# Run
npm start
# Go to http://localhost:1337
# Hooray! Leon is running
pnpm run check
```
### Docker Installation
By default, Leon runs locally and the app is available on `http://localhost:5366`.
```sh
# Build
npm run docker:build
## 🏗️ Architecture Snapshot
# Run
npm run docker:run
At a high level, Leon currently consists of:
# Go to http://localhost:1337
# Hooray! Leon is running
```
- `server/`: the main runtime, routing, memory, context management, HTTP API, and agent/controlled execution
- `app/`: the web application
- `aurora/`: UI components and preview environment
- `skills/`: built-in capabilities, split between `native/` skills and `agent/` skills
- `bridges/`: Node.js and Python bridges plus toolkit definitions and tool runtimes
- `tcp_server/`: Python services used by parts of the runtime stack
- `core/context/`: generated identity and architecture context documents that describe Leon's current behavior
## Documentation
This repository already includes skills and toolkits for areas such as search, productivity, system utilities, media workflows, coding assistance, memory-backed interactions, and voice/audio features.
For full documentation, visit [docs.getleon.ai](https://docs.getleon.ai).
## 📚 Documentation Status
## Roadmap
The new docs for Leon 2.0 are not ready yet.
To know what is going on, follow [roadmap.getleon.ai](https://roadmap.getleon.ai).
For now:
## Contributing
- treat this repository as the source of truth for the **2.0 Developer Preview**
- use [`core/context/LEON.md`](./core/context/LEON.md) for Leon's current identity and behavior
- use [`core/context/ARCHITECTURE.md`](./core/context/ARCHITECTURE.md) for the current architecture overview
- expect the public docs site to lag behind the new core until the updated documentation is published
If you have an idea for improving Leon, do not hesitate.
## ❤️ Contributing
**Leon needs open source to live**, the more modules he has, the more skillful he becomes.
We are starting to progressively onboard contributors for the **2.0 Developer Preview**.
## The Story Behind Leon
If you want to follow the project or express interest in joining that onboarding:
You'll find a write-up on this [blog post](https://blog.getleon.ai/the-story-behind-leon/).
## Stay Tuned
- [Newsletter](https://getleon.ai)
- [Blog](https://blog.getleon.ai)
- [2.0 Developer Preview contributor form](https://forms.gle/6PCG2D5rYo1q8tKMA)
- [Roadmap](http://roadmap.getleon.ai)
- [Discord](https://discord.gg/MNQqqKg)
- [GitHub issues](https://github.com/leon-ai/leon/issues)
- [Twitter](https://twitter.com/louistiti_fr)
- [#LeonAI](https://twitter.com/hashtag/LeonAI)
## Author
**Louis Grenard** ([@louistiti_fr](https://twitter.com/louistiti_fr))
### Why is there a small amount of contributors?
## Donate
Leon has been evolving for a long time, but the current 2.0 work is a major transition period.
You can also contribute by [buying me a fruit juice](https://donate.getleon.ai).
For a long time, Leon was a smaller assistant project with a simpler architecture. Today, the core is being rebuilt into a much more capable system around tools, memory, context, and agent-style execution. That means a lot of things are still moving, and it makes contribution harder than it will be once the new docs and architecture settle down.
## License
[MIT License](https://github.com/leon-ai/leon/blob/develop/LICENSE.md)
Another important reason is simply time: Leon is still developed largely during spare time. So progress can be uneven, and opening the project more broadly has to be balanced with keeping the direction coherent while the 2.0 Developer Preview is still taking shape.
Copyright (c) 2019-present, Louis Grenard <louis.grenard@gmail.com>
## 📖 The Story Behind Leon
## Cheers!
![Cheers!](https://assets-cdn.github.com/images/icons/emoji/unicode/1f37b.png?v6 "Cheers!")
Leon started in 2017 and has been active since 2019. If you want the longer backstory, read [the story behind Leon](https://blog.getleon.ai/the-story-behind-leon/).
## 🔔 Stay Tuned
- [X / Twitter](https://x.com/grenlouis) is the main place where I share Leon progress updates
- [Newsletter](https://leonai.substack.com/subscribe)
- [Blog](https://blog.getleon.ai)
- [YouTube](https://www.youtube.com/channel/UCW6mk6j6nQUzFYY97r47emQ)
## 👨 Author
**Louis Grenard** ([@grenlouis](https://x.com/grenlouis))
## 👍 Sponsors
You can also contribute by [sponsoring Leon](http://sponsor.getleon.ai).
## Thanks
| ![OpenAI logo.](./.github/assets/thanks/openai-logo-light-mode.svg?v=2#gh-light-mode-only)![OpenAI logo.](./.github/assets/thanks/openai-logo-dark-mode.svg?v=2#gh-dark-mode-only) | ![JetBrains logo.](./.github/assets/thanks/jetbrains-mono-black.svg?v=2#gh-light-mode-only)![JetBrains logo.](./.github/assets/thanks/jetbrains-mono-white.svg?v=2#gh-dark-mode-only) | ![MacStadium logo.](./.github/assets/thanks/macstadium-logo-light-mode.svg?v=2#gh-light-mode-only)![MacStadium logo.](./.github/assets/thanks/macstadium-logo-dark-mode.svg?v=2#gh-dark-mode-only) |
| --- | --- | --- |
| [openai.com/form/codex-for-oss](https://openai.com/form/codex-for-oss/) | [jb.gg/OpenSource](https://jb.gg/OpenSource) | [macstadium.com/company/opensource](https://macstadium.com/company/opensource) |
-289
View File
@@ -1,289 +0,0 @@
@import url(https://fonts.googleapis.com/css?family=Open+Sans:400,600,700,800);
html, body, div, span, applet, object, iframes,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, sub, sup, tt, var,
u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed,
figure, figcaption, footer, header, hgroup,
menu, nav, output, ruby, section, summary,
time, mark, audio, video {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
font: inherit;
vertical-align: baseline;
}
article, aside, details, figcaption, figure,
footer, header, hgroup, menu, nav, section {
display: block;
}
blockquote, q {
quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
content: '';
content: none;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
* {
box-sizing: border-box;
outline: none;
}
a {
color: inherit;
}
body {
color: #FFF;
background-color: #151718;
font-family: 'Open Sans', sans-serif;
font-weight: 400;
}
body > * {
transition: opacity .5s;
}
body.settingup > * {
opacity: 0;
}
body.settingup::after {
position: absolute;
content: '';
width: 32px;
height: 32px;
background-color: #777;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
border-radius: 50%;
animation: scaleout .6s infinite ease-in-out;
}
@keyframes scaleout {
0% {
transform: scale(0);
}
100% {
transform: scale(1.0);
opacity: 0;
}
}
main {
position: absolute;
width: 63%;
top: 0;
left: 50%;
height: 100%;
transform: translate(-50%, 0);
}
footer {
position: absolute;
text-align: center;
left: 50%;
bottom: 0;
transform: translate(-50%, -50%);
}
input {
text-align: center;
color: #FFF;
width: 100%;
border: none;
border-bottom: 2px solid #FFF;
background: none;
font-weight: 400;
font-size: 4em;
padding-right: 39px;
}
small {
color: #FFF;
font-size: .7em;
}
.hide {
display: none;
}
#logo {
background: no-repeat url(../img/logo.svg);
margin: 0 auto;
width: 40px;
height: 40px;
}
#feed {
position: absolute;
width: 100%;
top: 10%;
height: 50%;
overflow-y: auto;
border: 2px solid #FFF;
border-radius: 12px;
}
#feed::-webkit-scrollbar {
width: 6px;
}
#feed::-webkit-scrollbar-thumb {
background-color: rgba(255, 255, 255, .2);
border-radius: 12px;
}
#no-bubble {
margin-top: 64px;
text-align: center;
}
#is-typing {
position: absolute;
top: 59%;
padding: 0 8px;
opacity: 0;
margin-top: 20px;
transition: opacity .3s;
}
#is-typing.on {
opacity: 1;
}
#is-typing .circle {
display: inline-block;
border-radius: 50%;
width: 10px;
height: 10px;
background-color: #FFF;
transform: scale(1);
}
#is-typing .circle:nth-child(1) {
animation: typing .2s linear infinite alternate;
background-color: #0071F0;
}
#is-typing .circle:nth-child(2) {
animation: typing .2s .2s linear infinite alternate;
background-color: #FFF;
}
#is-typing .circle:nth-child(3) {
animation: typing .2s linear infinite alternate;
background-color: #EC297A;
}
@keyframes typing {
100% {
transform: scale(1.5);
}
}
.bubble-container {
padding: 6px;
}
.bubble-container.me {
text-align: right;
}
.bubble-container.leon {
text-align: left;
}
.bubble {
padding: 6px 12px;
border-radius: 16px;
display: inline-block;
max-width: 60%;
word-break: break-word;
text-align: left;
opacity: 0;
animation: fadeIn .2s ease-in forwards;
}
#feed .me .bubble {
background-color: #1C75DB;
color: #FFF;
right: 0;
}
#feed .leon .bubble {
background-color: #EEE;
color: #151718;
}
@keyframes fadeIn {
100% {
opacity: 1;
}
}
#input-container {
position: absolute;
width: 100%;
bottom: 25%;
}
#mic-container {
position: absolute;
right: 0;
margin-top: 38px;
}
.italic {
font-style: italic;
}
button {
position: absolute;
border: none;
cursor: pointer;
height: 26px;
width: 26px;
border-radius: 50%;
background-color: #888;
-webkit-mask-image: url(../img/mic.svg);
mask-image: url(../img/mic.svg);
transition: background-color .2s;
}
button:not(.enabled) {
margin-left: -26px;
}
button:hover {
background-color: #FFF;
}
button.enabled {
background-color: #00E676;
}
button.enabled + #sonar {
width: 26px;
height: 26px;
border-radius: 50%;
opacity: .3;
background-color: #575757;
pointer-events: none;
animation: sonar 1.3s linear infinite;
}
@keyframes sonar {
25% {
transform: scale(1.5);
}
50% {
transform: scale(1.2);
}
60% {
transform: scale(1.5);
}
75% {
transform: scale(2);
}
100% {
transform: scale(1);
}
}
-49
View File
@@ -1,49 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="css/style.css">
<link rel="icon" type="image/png" href="img/favicon.png">
<title>Leon</title>
</head>
<body class="settingup">
<main>
<div id="feed">
<p id="no-bubble" class="hide">
You can start to interact with Leon, don't be shy.
</p>
</div>
<div id="is-typing">
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
</div>
<div id="input-container">
<div id="mic-container">
<button></button>
<div id="sonar"></div>
</div>
<label for="query"></label>
<input type="text" id="query" autocomplete="off" autofocus>
<small>
Use <kbd></kbd> <kbd></kbd> to browse history;
<kbd></kbd> to submit;
<kbd>alt + t to listen.</kbd>
</small>
</div>
</main>
<footer>
<div id="logo"></div>
<div id="version">
<small>v</small>
</div>
<div id="logger">
<small class="italic">
<a href="https://docs.getleon.ai/collaborative-logger.html" target="_blank">Collaborative logger</a>
</small>
</div>
</footer>
<script src="vendor/socket.io/2.0.3/socket.io.js"></script>
<script src="js/main.js"></script>
</body>
</html>
-117
View File
@@ -1,117 +0,0 @@
'use strict'
import EventEmitter from 'events'
export default class Chatbot {
constructor () {
this.em = new EventEmitter()
this.feed = document.querySelector('#feed')
this.typing = document.querySelector('#is-typing')
this.noBubbleMessage = document.querySelector('#no-bubble')
this.bubbles = localStorage.getItem('bubbles')
this.parsedBubbles = JSON.parse(this.bubbles)
}
async init () {
await this.loadFeed()
this.scrollDown()
this.em.on('to-leon', (string) => {
this.createBubble('me', string)
})
this.em.on('me-received', (string) => {
this.createBubble('leon', string)
})
}
sendTo (who, string) {
if (who === 'leon') {
this.em.emit('to-leon', string)
}
}
receivedFrom (who, string) {
if (who === 'leon') {
this.em.emit('me-received', string)
}
}
isTyping (who, value) {
if (who === 'leon') {
if (value === true) {
this.enableTyping()
} else if (value === false) {
this.disableTyping()
}
}
}
enableTyping () {
if (!this.typing.classList.contains('on')) {
this.typing.classList.add('on')
}
}
disableTyping () {
if (this.typing.classList.contains('on')) {
this.typing.classList.remove('on')
}
}
scrollDown () {
this.feed.scrollTo(0, this.feed.scrollHeight)
}
loadFeed () {
return new Promise((resolve) => {
if (this.parsedBubbles === null || this.parsedBubbles.length === 0) {
this.noBubbleMessage.classList.remove('hide')
localStorage.setItem('bubbles', JSON.stringify([]))
this.parsedBubbles = []
resolve()
} else {
for (let i = 0; i < this.parsedBubbles.length; i += 1) {
const bubble = this.parsedBubbles[i]
this.createBubble(bubble.who, bubble.string, false)
if ((i + 1) === this.parsedBubbles.length) {
setTimeout(() => {
resolve()
}, 100)
}
}
}
})
}
createBubble (who, string, save = true) {
const container = document.createElement('div')
const bubble = document.createElement('p')
container.className = `bubble-container ${who}`
bubble.className = 'bubble'
bubble.innerHTML = string
this.feed.appendChild(container).appendChild(bubble)
if (save === true) {
this.saveBubble(who, string)
}
}
saveBubble (who, string) {
if (!this.noBubbleMessage.classList.contains('hide')) {
this.noBubbleMessage.classList.add('hide')
}
if (this.parsedBubbles.length === 62) {
this.parsedBubbles.shift()
}
this.parsedBubbles.push({ who, string })
localStorage.setItem('bubbles', JSON.stringify(this.parsedBubbles))
this.scrollDown()
}
}
-103
View File
@@ -1,103 +0,0 @@
'use strict'
import Chatbot from './chatbot.es6'
export default class Client {
constructor (client, host, port, input, res) {
this.client = client
this.host = host
this.port = port
this._input = input
this.socket = io.connect(`http://${this.host}:${this.port}`)
this.history = localStorage.getItem('history')
this.parsedHistory = []
this.info = res
this.chatbot = new Chatbot()
}
set input (newInput) {
if (typeof newInput !== 'undefined') {
this._input.value = newInput
}
}
init (config) {
this.chatbot.init()
this.socket.on('connect', () => {
this.socket.emit('init', this.client)
})
this.socket.on('answer', (data) => {
this.chatbot.receivedFrom('leon', data)
})
this.socket.on('is-typing', (data) => {
this.chatbot.isTyping('leon', data)
})
this.socket.on('recognized', (data, cb) => {
this._input.value = data
this.send('query')
cb('string-received')
})
this.socket.on('audio-forwarded', (data, cb) => {
const ctx = new AudioContext()
const source = ctx.createBufferSource()
ctx.decodeAudioData(data, (buffer) => {
source.buffer = buffer
source.connect(ctx.destination)
source.start(0)
})
cb('audio-received')
})
this.socket.on('download', (data) => {
window.location = `http://${config.server_host}:${config.server_port}/v1/downloads?package=${data.package}&module=${data.module}`
})
if (this.history !== null) {
this.parsedHistory = JSON.parse(this.history)
}
}
send (keyword) {
if (this._input.value !== '') {
this.socket.emit(keyword, { client: this.client, value: this._input.value.trim() })
this.chatbot.sendTo('leon', this._input.value)
this.save()
return true
}
return false
}
save () {
let val = this._input.value
if (localStorage.getItem('history') === null) {
localStorage.setItem('history', JSON.stringify([]))
this.parsedHistory = JSON.parse(localStorage.getItem('history'))
} else if (this.parsedHistory.length >= 32) {
this.parsedHistory.shift()
}
if (val[0] === ' ') {
val = val.substr(1, val.length - 1)
}
if (this.parsedHistory[this.parsedHistory.length - 1] !== val) {
this.parsedHistory.push(val)
localStorage.setItem('history', JSON.stringify(this.parsedHistory))
}
this._input.value = ''
}
}
-26
View File
@@ -1,26 +0,0 @@
'use strict'
import EventEmitter from 'events'
export default class Loader {
constructor () {
this.load = new EventEmitter()
this.body = document.querySelector('body')
this.load.on('settingup', (state) => {
if (state === true) {
this.body.classList.add('settingup')
} else {
this.body.classList.remove('settingup')
}
})
}
start () {
this.load.emit('settingup', true)
}
stop () {
this.load.emit('settingup', false)
}
}
-163
View File
@@ -1,163 +0,0 @@
'use strict'
import request from 'superagent'
import Loader from './loader.es6'
import Client from './client.es6'
import Recorder from './recorder.es6'
import listener from './listener.es6'
import { onkeydowndocument, onkeydowninput } from './onkeydown.es6'
const config = {
app: 'webapp',
server_host: process.env.LEON_SERVER_HOST,
server_port: process.env.LEON_SERVER_PORT,
min_decibels: -40, // Noise detection sensitivity
max_blank_time: 1000 // Maximum time to consider a blank (ms)
}
document.addEventListener('DOMContentLoaded', () => {
const loader = new Loader()
loader.start()
request.get(`http://${config.server_host}:${config.server_port}/v1/info`)
.end((err, res) => {
if (err || !res.ok) {
console.error(err.response.error.message)
} else {
const input = document.querySelector('#query')
const mic = document.querySelector('button')
const v = document.querySelector('#version small')
const logger = document.querySelector('#logger small')
const client = new Client(config.app, config.server_host,
config.server_port, input, res.body)
let rec = { }
let chunks = []
let enabled = false
let hotwordTriggered = false
let autoStartedAfterTalk = false
let noiseDetected = false
let countSilenceAfterTalk = 0
let sLogger = ' enabled, thank you.'
v.innerHTML += client.info.version
if (client.info.logger === false) {
sLogger = ' disabled.'
}
logger.innerHTML += sLogger
client.init(config)
if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
navigator.mediaDevices.getUserMedia({ audio: true }).then((stream) => {
if (MediaRecorder) {
rec = new Recorder(stream, mic, client.info)
rec.ondataavailable((e) => {
chunks.push(e.data)
})
rec.onstart(() => { /* */ })
rec.onstop(() => {
const blob = new Blob(chunks)
chunks = []
enabled = false
// Ensure there are some data
if (blob.size >= 1000) {
client.socket.emit('recognize', blob)
}
})
listener.listening(stream, config.min_decibels, config.max_blank_time, () => {
// Noise detected
noiseDetected = true
}, () => {
// Noise ended
noiseDetected = false
if (enabled === true && hotwordTriggered === false) {
rec.stop()
enabled = false
hotwordTriggered = false
countSilenceAfterTalk = 0
if (client.info.after_speech === true) {
// Auto enable recording after talk
setTimeout(() => {
rec.start(false)
enabled = true
autoStartedAfterTalk = true
}, 500)
}
}
})
if (client.info.after_speech === true) {
setInterval(() => {
// If record after talk has started
if (autoStartedAfterTalk === true && countSilenceAfterTalk <= 3) {
// Stop recording if there was no noise for 3 seconds
if (countSilenceAfterTalk === 3) {
rec.stop(false)
enabled = false
autoStartedAfterTalk = false
countSilenceAfterTalk = 0
} else if (noiseDetected === false) {
countSilenceAfterTalk += 1
}
}
}, 1000)
}
client.socket.on('enable-record', () => {
hotwordTriggered = true
rec.start()
setTimeout(() => { hotwordTriggered = false }, config.max_blank_time)
enabled = true
})
} else {
console.error('MediaRecorder is not supported on your browser.')
}
}).catch((err) => {
console.error('MediaDevices.getUserMedia() threw the following error:', err)
})
} else {
console.error('MediaDevices.getUserMedia() is not supported on your browser.')
}
loader.stop()
document.addEventListener('keydown', (e) => {
onkeydowndocument(e, () => {
if (enabled === false) {
input.value = ''
rec.start()
enabled = true
} else {
rec.stop()
enabled = false
}
})
})
input.addEventListener('keydown', (e) => {
onkeydowninput(e, client)
})
mic.addEventListener('click', (e) => {
e.preventDefault()
if (enabled === false) {
rec.start()
enabled = true
} else {
rec.stop()
enabled = false
}
})
}
})
})
-41
View File
@@ -1,41 +0,0 @@
'use strict'
let index = -1
let parsedHistory = null
const onkeydowninput = (e, client) => {
const key = e.which || e.keyCode
if (localStorage.getItem('history') !== null && (key === 38 || key === 40)) {
parsedHistory = JSON.parse(localStorage.getItem('history')).reverse()
}
if (key === 13) {
if (client.send('query')) {
parsedHistory = JSON.parse(localStorage.getItem('history')).reverse()
index = -1
}
} else if (localStorage.getItem('history') !== null) {
if (key === 38 && index < (parsedHistory.length - 1)) {
index += 1
client.input = parsedHistory[index]
} else if (key === 40 && (index - 1) >= 0) {
index -= 1
client.input = parsedHistory[index]
} else if (key === 40 && (index - 1) < 0) {
client.input = ''
index = -1
}
}
}
const onkeydowndocument = (e, cb) => {
if (e.altKey === true && e.key === 't') {
cb()
}
}
export {
onkeydowninput,
onkeydowndocument
}
+220
View File
@@ -0,0 +1,220 @@
.built-in-commands-modal {
position: fixed;
inset: 0;
z-index: 120;
display: block;
opacity: 0;
visibility: visible;
pointer-events: none;
transition:
opacity 0.18s ease,
visibility 0.18s ease;
}
.built-in-commands-modal--hidden {
opacity: 0;
visibility: hidden;
pointer-events: none;
}
.built-in-commands-modal--open {
opacity: 1;
visibility: visible;
pointer-events: auto;
}
.built-in-commands-modal__mask {
position: absolute;
inset: 0;
background: rgba(0, 0, 0, 0.56);
backdrop-filter: blur(10px);
}
.built-in-commands-modal__panel {
position: absolute;
top: 33%;
left: 50%;
transform: translate(-50%, -33%) scale(0.985);
width: min(864px, 100%);
min-height: 400px;
max-height: min(78vh, 756px);
display: flex;
flex-direction: column;
border: 1px solid transparent;
border-radius: 24px;
background:
linear-gradient(
var(--a-color-background-surface),
var(--a-color-background-surface)
)
padding-box,
linear-gradient(135deg, rgba(28, 117, 219, 0.8) 0%, rgba(237, 41, 122, 0.4) 100%)
border-box;
box-shadow:
0 28px 60px rgba(0, 0, 0, 0.45),
0 0 0 1px rgba(255, 255, 255, 0.03) inset;
overflow: hidden;
opacity: 0;
transition:
transform 0.18s cubic-bezier(0.18, 0.89, 0.32, 1.08),
opacity 0.18s ease;
}
.built-in-commands-modal--open .built-in-commands-modal__panel {
transform: translate(-50%, -33%) scale(1);
opacity: 1;
}
.built-in-commands-modal__section {
padding: 20px 22px;
}
.built-in-commands-modal__section--top {
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
}
.built-in-commands-modal__section--bottom {
border-top: 1px solid rgba(255, 255, 255, 0.08);
}
.built-in-commands-modal__section--middle {
flex: 0 0 512px;
height: 512px;
min-height: 512px;
padding: 12px;
overflow: hidden;
}
.built-in-commands-modal__scroll-area {
height: 100%;
}
.built-in-commands-modal__input-field {
flex: 1;
}
.built-in-commands-modal__input-field .aurora-input-container {
--a-icon-container-width: 72px;
}
.built-in-commands-modal__input-field .aurora-input {
height: 72px;
font-size: 28px;
font-weight: 600;
}
.built-in-commands-modal__input-field .aurora-input-icon-container {
height: 72px;
}
.built-in-commands-modal__return-button .aurora-button {
min-height: 44px;
min-width: 44px;
padding: 0 14px;
font-size: var(--a-font-size-md);
}
.built-in-commands-modal__return-button .aurora-button .aurora-icon {
font-size: 22px;
}
.built-in-commands-modal__suggestion-copy {
min-width: 0;
}
.built-in-commands-modal .aurora-list-item > .aurora-flexbox .aurora-icon {
font-size: 28px;
padding: 23px;
border-radius: 12px;
}
.built-in-commands-modal
.aurora-list-item--selected
.aurora-list-item-clickable-icon
.aurora-icon {
color: var(--a-color-accent);
}
.built-in-commands-modal__result-item {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 16px;
width: 100%;
}
.built-in-commands-modal__result-copy,
.built-in-commands-modal__result-value {
min-width: 0;
}
.built-in-commands-modal__result-value {
margin-left: auto;
}
.built-in-commands-modal .aurora-scroll-container-scrollview {
color-scheme: dark;
scrollbar-width: thin;
scrollbar-color: rgba(255, 255, 255, 0.2) rgba(10, 14, 18, 0.9);
}
.built-in-commands-modal .aurora-scroll-container-scrollview::-webkit-scrollbar {
width: 10px;
}
.built-in-commands-modal
.aurora-scroll-container-scrollview::-webkit-scrollbar-track {
background: rgba(10, 14, 18, 0.9);
border-radius: 999px;
}
.built-in-commands-modal
.aurora-scroll-container-scrollview::-webkit-scrollbar-thumb {
background: linear-gradient(
180deg,
rgba(54, 65, 76, 0.95) 0%,
rgba(30, 38, 46, 0.95) 100%
);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 999px;
}
.built-in-commands-modal
.aurora-scroll-container-scrollview::-webkit-scrollbar-thumb:hover {
background: linear-gradient(
180deg,
rgba(70, 82, 95, 0.98) 0%,
rgba(40, 49, 58, 0.98) 100%
);
}
@media (max-width: 900px) {
.built-in-commands-modal__panel {
width: auto;
min-height: 360px;
max-height: calc(100vh - 24px);
left: 12px;
right: 12px;
top: 18%;
transform: translate(0, 0) scale(0.985);
}
.built-in-commands-modal--open .built-in-commands-modal__panel {
transform: translate(0, 0) scale(1);
}
.built-in-commands-modal__section {
padding: 16px;
}
.built-in-commands-modal__section--middle {
flex-basis: 280px;
height: 280px;
min-height: 280px;
}
.built-in-commands-modal__result-item {
flex-direction: column;
gap: 6px;
}
}
+69
View File
@@ -0,0 +1,69 @@
.file-system-autocomplete {
position: fixed;
z-index: 150;
overflow-y: auto;
padding: 6px;
border: 1px solid rgba(255, 255, 255, 0.12);
border-radius: 8px;
background: #111315;
box-shadow:
0 18px 42px rgba(0, 0, 0, 0.42),
0 0 0 1px rgba(255, 255, 255, 0.03) inset;
color: var(--white-color);
}
.file-system-autocomplete--hidden {
display: none;
}
.file-system-autocomplete__item {
display: flex;
align-items: center;
gap: 10px;
width: 100%;
min-height: 42px;
padding: 9px 10px;
border: 0;
border-radius: 6px;
background: transparent;
color: inherit;
cursor: pointer;
font: inherit;
line-height: 1.35;
text-align: left;
}
.file-system-autocomplete__item:hover,
.file-system-autocomplete__item--selected {
background: rgba(28, 117, 219, 0.22);
}
.file-system-autocomplete__item i {
flex: 0 0 auto;
width: 18px;
color: var(--blue-color);
font-size: 18px;
}
.file-system-autocomplete__label {
min-width: 0;
overflow: hidden;
line-height: 1.35;
text-overflow: ellipsis;
white-space: nowrap;
}
.file-system-autocomplete__empty {
padding: 10px;
color: rgba(255, 255, 255, 0.58);
font-size: 0.95rem;
}
.file-system-autocomplete::-webkit-scrollbar {
width: 6px;
}
.file-system-autocomplete::-webkit-scrollbar-thumb {
background-color: rgba(255, 255, 255, 0.2);
border-radius: 12px;
}
+919
View File
@@ -0,0 +1,919 @@
@use 'sass:meta';
@import '@fontsource/source-sans-pro/200.css';
@import '@fontsource/source-sans-pro/300.css';
@import '@fontsource/source-sans-pro/400.css';
@import '@fontsource/source-sans-pro/600.css';
@import '@fontsource/source-sans-pro/700.css';
@import '@fontsource/source-sans-pro/900.css';
@import 'remixicon/fonts/remixicon.css';
@include meta.load-css('tool-ui');
@include meta.load-css('voice-energy/main');
@include meta.load-css('file-system-autocomplete');
html,
body,
div,
span,
applet,
object,
iframes,
h1,
h2,
h3,
h4,
h5,
h6,
p,
blockquote,
pre,
a,
abbr,
acronym,
address,
big,
cite,
code,
del,
dfn,
em,
img,
ins,
kbd,
q,
s,
samp,
small,
strike,
sub,
sup,
tt,
var,
u,
i,
center,
dl,
dt,
dd,
ol,
ul,
li,
fieldset,
form,
label,
legend,
table,
caption,
tbody,
tfoot,
thead,
tr,
th,
td,
article,
aside,
canvas,
details,
embed,
figure,
figcaption,
footer,
header,
hgroup,
menu,
nav,
output,
ruby,
section,
summary,
time,
mark,
audio,
video {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
vertical-align: baseline;
}
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
menu,
nav,
section {
display: block;
}
blockquote,
q {
quotes: none;
}
blockquote:before,
blockquote:after,
q:before,
q:after {
content: '';
content: none;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
* {
box-sizing: border-box;
outline: none;
}
:root {
color-scheme: dark;
--black-color: #000;
--light-black-color: #222426;
--white-color: #fff;
--grey-color: #323739;
--blue-color: #1c75db;
--pink-color: #ed297a;
--sessions-panel-width: 292px;
--a-loader-size-md: 20px !important;
}
a {
color: inherit;
}
#feed ul li:not(.aurora-list-item) {
margin-left: 20px;
}
body {
color: var(--white-color);
background-color: var(--black-color);
font-family:
'Source Sans Pro',
system-ui,
-apple-system,
BlinkMacSystemFont,
'Segoe UI',
Roboto,
'Helvetica Neue',
Arial,
'Noto Sans',
sans-serif,
'Apple Color Emoji',
'Segoe UI Emoji',
'Segoe UI Symbol',
'Noto Color Emoji';
font-weight: 400;
}
.profile-auth {
position: fixed;
inset: 0;
z-index: 10000;
display: grid;
place-items: center;
padding: 24px;
background: var(--black-color);
}
.profile-auth__form {
display: grid;
width: min(100%, 380px);
gap: 16px;
padding: 28px;
border: 1px solid var(--grey-color);
border-radius: 12px;
background: var(--light-black-color);
h1 {
font-size: 24px;
font-weight: 600;
}
p {
color: #b9bdbf;
}
input,
button {
width: 100%;
min-height: 44px;
padding: 0 12px;
border: 1px solid var(--grey-color);
border-radius: 8px;
color: var(--white-color);
background: var(--black-color);
}
button {
border-color: var(--blue-color);
background: var(--blue-color);
cursor: pointer;
}
button:disabled {
cursor: wait;
opacity: 0.6;
}
.profile-auth__error {
min-height: 20px;
color: var(--pink-color);
}
}
@keyframes plan-tool-status-cozy-shine {
0% {
opacity: 0.4;
filter: drop-shadow(0 0 0 rgba(255, 255, 255, 0));
}
50% {
opacity: 1;
filter: drop-shadow(0 0 5px rgba(255, 255, 255, 0.22));
}
100% {
opacity: 0.4;
filter: drop-shadow(0 0 0 rgba(255, 255, 255, 0));
}
}
#feed
.bubble-container[data-message-id^='plan-']
.aurora-list
.aurora-list-item--center:last-child
.aurora-status
.aurora-icon {
animation: plan-tool-status-cozy-shine 2.6s ease-in-out infinite;
}
body > * {
transition: opacity 0.5s;
}
body.settingup > *:not(#init):not(.profile-auth) {
opacity: 0;
}
#init .not-initialized {
visibility: hidden;
}
#init .initialized {
opacity: 0;
visibility: hidden;
}
kbd {
font-family: 'Source Sans Pro', monospace;
display: inline-block;
background-color: var(--light-black-color);
color: rgba(255, 255, 255, 0.4);
border-radius: 4px;
text-align: center;
min-width: 16px;
min-height: 16px;
line-height: 16px !important;
padding: 2px 6px !important;
margin: 0 !important;
}
#sessions-panel {
position: absolute;
left: 2%;
top: 2%;
bottom: 8%;
width: var(--sessions-panel-width);
border-right: 1px solid rgba(255, 255, 255, 0.12);
color: var(--white-color);
overflow: hidden;
}
#sessions-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 14px 14px 0;
}
#sessions-eyebrow {
color: rgba(255, 255, 255, 0.42);
font-size: 0.9rem;
font-weight: 700;
text-transform: uppercase;
}
#new-session,
.session-action {
border: 0;
background: rgba(255, 255, 255, 0.08);
color: var(--white-color);
cursor: pointer;
transition:
background-color 0.18s,
color 0.18s,
transform 0.18s;
}
#new-session {
width: 34px;
height: 34px;
border-radius: 8px;
font-size: 1.2rem;
}
#new-session:hover,
.session-action:hover {
background: rgba(28, 117, 219, 0.22);
color: #86bdff;
}
#sessions-list {
height: calc(100% - 48px);
padding-right: 14px;
overflow-y: auto;
}
#sessions-list::-webkit-scrollbar {
width: 6px;
}
#sessions-list::-webkit-scrollbar-thumb {
background-color: rgba(255, 255, 255, 0.16);
border-radius: 12px;
}
.session-group {
position: relative;
padding: 0 0 12px 14px;
}
.session-group::before {
content: '';
position: absolute;
left: 3px;
top: 22px;
bottom: 0;
width: 1px;
background: linear-gradient(
rgba(28, 117, 219, 0.7),
rgba(237, 41, 122, 0.22)
);
}
.session-group-title {
position: relative;
margin-bottom: 8px;
color: rgba(255, 255, 255, 0.44);
font-size: 0.78rem;
font-weight: 700;
text-transform: uppercase;
}
.session-group-title::before {
content: '';
position: absolute;
left: -14px;
top: 7px;
width: 7px;
height: 7px;
border-radius: 50%;
background: var(--blue-color);
box-shadow: 0 0 12px rgba(28, 117, 219, 0.8);
}
.session-item {
position: relative;
padding: 10px 8px;
border-radius: 8px;
cursor: pointer;
animation: sessionTimelineIn 0.24s ease-out both;
}
.session-item:hover,
.session-item--active {
background: rgba(255, 255, 255, 0.07);
}
.session-item--active::before {
content: '';
position: absolute;
left: -11px;
top: 18px;
width: 5px;
height: 5px;
border-radius: 50%;
background: var(--pink-color);
box-shadow: 0 0 10px rgba(237, 41, 122, 0.9);
}
.session-title {
overflow: hidden;
color: rgba(255, 255, 255, 0.9);
font-size: 0.98rem;
font-weight: 700;
line-height: 1.2rem;
text-overflow: ellipsis;
white-space: nowrap;
}
.session-meta {
overflow: hidden;
margin-top: 2px;
color: rgba(255, 255, 255, 0.36);
font-size: 0.8rem;
line-height: 1rem;
text-overflow: ellipsis;
white-space: nowrap;
}
.session-actions {
display: flex;
gap: 4px;
margin-top: 8px;
opacity: 0;
transition: opacity 0.16s;
}
.session-item:hover .session-actions,
.session-item--active .session-actions {
opacity: 1;
}
.session-action {
width: 26px;
height: 26px;
border-radius: 6px;
}
.session-action[aria-pressed='true'] {
color: #ff7caf;
}
@keyframes sessionTimelineIn {
from {
opacity: 0;
transform: translateY(8px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
main {
position: absolute;
width: calc(94% - var(--sessions-panel-width));
top: 0;
left: calc(4% + var(--sessions-panel-width));
height: 100%;
}
#footer {
display: flex;
position: absolute;
align-items: center;
justify-content: space-between;
left: calc(4% + var(--sessions-panel-width));
bottom: 2%;
width: calc(94% - var(--sessions-panel-width));
line-height: 18px;
}
#logo-container {
display: flex;
gap: 6px;
align-items: center;
}
#version {
color: var(--grey-color);
}
textarea {
font-family: inherit;
text-align: center;
color: var(--white-color);
width: 100%;
border: none;
border-bottom: 2px solid var(--grey-color);
background: none;
font-weight: 600;
font-size: 4em;
padding-right: 39px;
height: 140px;
resize: none;
overflow-y: auto;
}
textarea::-webkit-scrollbar {
width: 6px;
}
textarea::-webkit-scrollbar-thumb {
background-color: rgba(255, 255, 255, 0.2);
border-radius: 12px;
}
#tip {
display: inline-flex;
margin-top: 2px;
color: var(--white-color);
line-height: 22px;
font-size: 0.9em;
gap: 20px;
li {
margin-left: 0;
}
}
.hide {
display: none;
}
#logo {
background: no-repeat url(../img/logo.svg);
width: 34px;
height: 34px;
}
#top-container {
position: absolute;
top: 2%;
color: var(--grey-color);
display: flex;
width: 100%;
justify-content: space-between;
}
#mood {
position: relative;
font-size: 16px;
}
#info {
position: relative;
text-decoration: underline;
background: none;
border: none;
color: var(--grey-color);
cursor: pointer;
font-size: inherit;
}
#feed {
position: absolute;
width: 100%;
top: 6%;
height: 58%;
overflow-y: auto;
border: 2px solid var(--grey-color);
border-radius: 12px;
}
#feed::-webkit-scrollbar {
width: 6px;
}
#feed::-webkit-scrollbar-thumb {
background-color: rgba(255, 255, 255, 0.2);
border-radius: 12px;
}
#no-bubble {
margin-top: 64px;
text-align: center;
}
#is-typing {
position: absolute;
top: 65%;
padding: 0 8px;
opacity: 0;
transition: opacity 0.3s;
}
#is-typing.on {
opacity: 1;
}
#is-typing .circle {
display: inline-block;
border-radius: 50%;
width: 10px;
height: 10px;
background-color: var(--white-color);
transform: scale(1);
}
#is-typing .circle:nth-child(1) {
animation: typing 0.2s linear infinite alternate;
background-color: #0071f0;
}
#is-typing .circle:nth-child(2) {
animation: typing 0.2s 0.2s linear infinite alternate;
background-color: var(--white-color);
}
#is-typing .circle:nth-child(3) {
animation: typing 0.2s linear infinite alternate;
background-color: #ec297a;
}
@keyframes typing {
100% {
transform: scale(1.5);
}
}
.llm-token {
opacity: 0;
transition: opacity 2.5s;
}
.llm-token.fade-in {
animation: fadeIn 2.5s forwards;
}
.reasoning-block-container {
padding: 6px;
text-align: left;
}
.reasoning-block {
max-width: 72%;
border: 1px solid rgba(255, 255, 255, 0.16);
border-radius: 12px;
background-color: #111315;
overflow: hidden;
animation: fadeIn 0.2s ease-in forwards;
}
.reasoning-header {
display: flex;
align-items: center;
gap: 6px;
padding: 8px 12px;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
background-color: rgba(255, 255, 255, 0.03);
}
.reasoning-icon {
color: var(--blue-color);
font-size: 15px;
}
.reasoning-title {
font-size: 0.85rem;
letter-spacing: 0.04em;
text-transform: uppercase;
color: rgba(255, 255, 255, 0.8);
}
.reasoning-content {
padding: 10px 12px;
font-family: 'Courier New', Consolas, monospace;
font-size: 0.95rem;
line-height: 1.45;
color: rgba(255, 255, 255, 0.82);
white-space: pre-wrap;
word-break: break-word;
max-height: 296px;
overflow-y: auto;
}
.reasoning-content::-webkit-scrollbar {
width: 6px;
}
.reasoning-content::-webkit-scrollbar-thumb {
background-color: rgba(255, 255, 255, 0.2);
border-radius: 12px;
}
.reasoning-token {
opacity: 0;
}
.reasoning-token.fade-in {
animation: fadeIn 0.35s forwards;
}
.bubble-container {
padding: 6px;
display: flex;
flex-direction: column;
width: fit-content;
max-width: 85%;
}
.bubble-container.me {
margin-left: auto;
align-items: flex-end;
text-align: right;
}
.bubble-container.leon {
margin-right: auto;
align-items: flex-start;
text-align: left;
}
.show-more {
margin: 3px;
text-decoration: underline;
}
.show-more:hover {
cursor: pointer;
text-decoration: none;
}
.show-all {
max-height: 100% !important;
}
.bubble {
padding: 10px 16px;
border-radius: 16px;
display: inline-block;
max-width: 100%;
word-break: break-word;
text-align: left;
opacity: 0;
animation: fadeIn 0.2s ease-in forwards;
overflow: hidden;
font-size: 1.8rem;
line-height: 2.4rem;
}
.bubble-metrics {
cursor: default;
margin-top: 2px;
padding: 0 4px;
display: inline-flex;
flex-wrap: wrap;
justify-content: flex-end;
gap: 10px;
font-size: 0.95rem;
line-height: 1.2rem;
color: var(--grey-color);
align-self: flex-end;
text-align: right;
}
.bubble-metric-item {
display: inline-flex;
align-items: center;
gap: 4px;
}
.bubble-metric-item i {
font-size: 1rem;
}
#feed .me .bubble-metrics {
text-align: right;
}
#feed .me .bubble {
background-color: #1c75db;
color: var(--white-color);
right: 0;
}
#feed .leon .bubble {
background-color: var(--light-black-color);
color: var(--white-color);
}
@keyframes fadeIn {
100% {
opacity: 1;
}
}
#input-container {
position: absolute;
width: 100%;
bottom: 13%;
}
#mic-container {
position: absolute;
right: 0;
margin-top: 38px;
}
.italic {
font-style: italic;
}
#mic-button {
position: absolute;
border: none;
cursor: pointer;
height: 26px;
width: 26px;
border-radius: 50%;
background-color: #888;
-webkit-mask-image: url(../img/mic.svg);
mask-image: url(../img/mic.svg);
transition: background-color 0.2s;
}
#mic-button:not(.enabled) {
margin-left: -26px;
}
#mic-button:hover {
background-color: var(--white-color);
}
#mic-button.enabled {
background-color: #00e676;
}
#mic-button.enabled + #sonar {
width: 26px;
height: 26px;
border-radius: 50%;
opacity: 0.3;
background-color: #575757;
pointer-events: none;
animation: sonar 1.3s linear infinite;
}
@keyframes sonar {
25% {
transform: scale(1.5);
}
50% {
transform: scale(1.2);
}
60% {
transform: scale(1.5);
}
75% {
transform: scale(2);
}
100% {
transform: scale(1);
}
}
/* Clickable URL styles */
.clickable-url {
text-decoration: underline;
}
/* Clickable file path styles */
.clickable-path {
cursor: pointer;
text-decoration: underline;
}
@media (max-width: 940px) {
:root {
--sessions-panel-width: 100%;
}
#sessions-panel {
left: 4%;
right: 4%;
top: 1%;
bottom: auto;
width: auto;
height: 168px;
border-right: 0;
border-bottom: 1px solid rgba(255, 255, 255, 0.12);
}
#sessions-list {
display: flex;
gap: 12px;
height: 112px;
overflow-x: auto;
overflow-y: hidden;
}
.session-group {
min-width: 220px;
}
main {
top: 176px;
left: 4%;
width: 92%;
height: calc(100% - 176px);
}
#footer {
display: none;
}
#top-container {
top: 1%;
}
#feed {
top: 7%;
height: 50%;
}
#is-typing {
top: 58%;
}
textarea {
font-size: 2.4em;
}
#tip {
flex-wrap: wrap;
gap: 8px;
}
}
+418
View File
@@ -0,0 +1,418 @@
/* Tool Output Container Styles */
.tool-group-container {
margin: 10px 6px;
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 14px;
background:
linear-gradient(
180deg,
rgba(255, 255, 255, 0.04) 0%,
rgba(255, 255, 255, 0.02) 100%
),
#15181a;
box-shadow:
0 10px 30px rgba(0, 0, 0, 0.24),
inset 0 1px 0 rgba(255, 255, 255, 0.03);
opacity: 0;
animation: fadeIn 0.3s ease-in forwards;
overflow: hidden;
}
.tool-header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
width: 100%;
padding: 14px 16px;
background: transparent;
border: 0;
cursor: pointer;
color: inherit;
text-align: left;
transition: background-color 0.2s ease;
}
.tool-header:hover {
background-color: rgba(255, 255, 255, 0.03);
}
.tool-icon {
color: var(--blue-color);
font-size: 18px;
flex-shrink: 0;
}
.tool-name {
flex: 1;
font-weight: 600;
color: var(--white-color);
font-size: 0.95em;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.expand-icon {
color: rgba(255, 255, 255, 0.48);
font-size: 18px;
transition: transform 0.2s ease;
}
.expand-icon.rotated {
transform: rotate(180deg);
}
.tool-content {
max-height: 0;
overflow: hidden;
transition: max-height 0.3s ease, border-top-color 0.2s ease;
border-top: 1px solid transparent;
}
.tool-content.expanded {
max-height: 900px;
overflow-y: auto;
border-top-color: rgba(255, 255, 255, 0.06);
}
.tool-content::-webkit-scrollbar {
width: 4px;
}
.tool-content::-webkit-scrollbar-thumb {
background-color: rgba(255, 255, 255, 0.1);
border-radius: 2px;
}
.shell-output {
padding: 12px;
background-color: #0d1117;
border-radius: 0 0 14px 14px;
min-height: 40px;
font-family: 'Courier New', Consolas, monospace;
font-size: 0.9em;
}
.shell-message {
margin: 2px 0;
line-height: 1.4;
color: #e6edf3;
word-break: break-word;
}
.shell-prompt {
color: var(--pink-color);
font-weight: bold;
margin-right: 8px;
}
.shell-message .clickable-path {
color: var(--blue-color);
background-color: rgba(28, 117, 219, 0.1);
padding: 1px 4px;
border-radius: 3px;
border: 1px solid rgba(28, 117, 219, 0.3);
}
.shell-message .clickable-url {
color: var(--blue-color);
}
.tool-activity-card {
background:
radial-gradient(
circle at top right,
rgba(28, 117, 219, 0.14),
transparent 32%
),
linear-gradient(
180deg,
rgba(255, 255, 255, 0.04) 0%,
rgba(255, 255, 255, 0.02) 100%
),
#15181a;
}
.agent-skill-activity-card {
background:
radial-gradient(
circle at top right,
rgba(237, 41, 122, 0.14),
transparent 32%
),
linear-gradient(
180deg,
rgba(255, 255, 255, 0.04) 0%,
rgba(255, 255, 255, 0.02) 100%
),
#15181a;
}
.agent-skill-activity-card .tool-icon {
color: #ed297a;
}
.tool-activity-header {
align-items: flex-start;
}
.tool-activity-heading {
display: flex;
align-items: flex-start;
gap: 12px;
min-width: 0;
flex: 1;
}
.tool-activity-title-block {
display: flex;
flex-direction: column;
min-width: 0;
gap: 2px;
}
.tool-title {
color: var(--white-color);
font-size: 1rem;
font-weight: 700;
line-height: 1.2;
}
.tool-subtitle {
color: rgba(255, 255, 255, 0.58);
font-size: 0.86rem;
line-height: 1.2;
}
.tool-activity-meta {
display: flex;
align-items: center;
gap: 10px;
flex-shrink: 0;
}
.tool-status-chip {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 72px;
padding: 5px 10px;
border-radius: 999px;
border: 1px solid transparent;
font-size: 0.76rem;
font-weight: 700;
letter-spacing: 0.02em;
text-transform: uppercase;
}
.tool-status-chip.running {
color: #9fd2ff;
background-color: rgba(28, 117, 219, 0.14);
border-color: rgba(28, 117, 219, 0.28);
}
.tool-status-chip.success {
color: #93f0c1;
background-color: rgba(36, 178, 101, 0.15);
border-color: rgba(36, 178, 101, 0.28);
}
.tool-status-chip.selected {
color: #93f0c1;
background-color: rgba(36, 178, 101, 0.15);
border-color: rgba(36, 178, 101, 0.28);
}
.tool-status-chip.observed {
color: #f5d48a;
background-color: rgba(210, 157, 38, 0.15);
border-color: rgba(210, 157, 38, 0.3);
}
.tool-status-chip.error {
color: #ffb0b0;
background-color: rgba(237, 41, 122, 0.14);
border-color: rgba(237, 41, 122, 0.28);
}
.tool-activity-summary {
padding: 16px 16px 4px;
color: rgba(255, 255, 255, 0.82);
font-size: 0.95rem;
line-height: 1.45;
}
.tool-activity-sections {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 12px;
padding: 12px 16px 16px;
}
.tool-activity-sections.single {
grid-template-columns: 1fr;
}
.tool-activity-panel {
border: 1px solid rgba(255, 255, 255, 0.07);
border-radius: 12px;
background-color: rgba(255, 255, 255, 0.025);
min-width: 0;
}
.tool-panel-heading {
display: flex;
flex-direction: column;
gap: 2px;
padding: 12px 14px 10px;
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
}
.tool-panel-title {
color: var(--white-color);
font-size: 0.84rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.04em;
}
.tool-panel-description {
color: rgba(255, 255, 255, 0.5);
font-size: 0.78rem;
}
.tool-panel-body {
padding: 12px 14px 14px;
min-height: 72px;
}
.tool-output-summary {
margin-bottom: 10px;
color: rgba(255, 255, 255, 0.86);
line-height: 1.45;
}
.tool-empty-state {
color: rgba(255, 255, 255, 0.45);
font-size: 0.88rem;
line-height: 1.4;
}
.tool-kv-list {
display: flex;
flex-direction: column;
gap: 10px;
}
.tool-kv-row {
display: flex;
flex-direction: column;
gap: 4px;
}
.tool-kv-key {
color: rgba(255, 255, 255, 0.52);
font-size: 0.75rem;
font-weight: 700;
letter-spacing: 0.03em;
text-transform: uppercase;
}
.tool-kv-value {
color: rgba(255, 255, 255, 0.88);
min-width: 0;
}
.tool-rich-text {
color: rgba(255, 255, 255, 0.88);
line-height: 1.45;
word-break: break-word;
}
.tool-command-output {
margin: 0;
max-height: 320px;
overflow: auto;
color: rgba(255, 255, 255, 0.86);
font-family: 'Courier New', Consolas, monospace;
font-size: 0.84rem;
line-height: 1.45;
white-space: pre-wrap;
word-break: break-word;
}
.tool-rich-text .clickable-path {
color: var(--blue-color);
background-color: rgba(28, 117, 219, 0.1);
padding: 1px 4px;
border-radius: 3px;
border: 1px solid rgba(28, 117, 219, 0.3);
}
.tool-rich-text .clickable-url {
color: var(--blue-color);
}
.tool-value-list {
display: flex;
flex-direction: column;
gap: 8px;
margin-left: 18px;
}
.tool-value-list li {
color: rgba(255, 255, 255, 0.88);
line-height: 1.4;
}
.tool-raw-details {
margin: 0 16px 16px;
border-top: 1px solid rgba(255, 255, 255, 0.06);
padding-top: 12px;
}
.tool-raw-details summary {
cursor: pointer;
color: rgba(255, 255, 255, 0.62);
font-size: 0.82rem;
font-weight: 700;
letter-spacing: 0.03em;
text-transform: uppercase;
list-style: none;
}
.tool-raw-details summary::-webkit-details-marker {
display: none;
}
.tool-raw-content {
margin-top: 12px;
padding: 12px 14px;
border-radius: 10px;
background-color: rgba(0, 0, 0, 0.3);
color: rgba(255, 255, 255, 0.78);
font-family: 'Courier New', Consolas, monospace;
font-size: 0.84rem;
line-height: 1.45;
overflow-x: auto;
}
@media screen and (max-width: 700px) {
.tool-activity-sections {
grid-template-columns: 1fr;
}
.tool-activity-header {
gap: 10px;
}
.tool-activity-meta {
align-items: flex-end;
}
.tool-status-chip {
min-width: 64px;
padding: 5px 8px;
}
}
+8
View File
@@ -0,0 +1,8 @@
@use 'sass:color';
$voice-neon-pink-color: #ed297a;
$voice-neon-blue-color: #1c75db;
$voice-neon-shadow-color: color.mix(
$voice-neon-pink-color,
$voice-neon-blue-color
);
+162
View File
@@ -0,0 +1,162 @@
/**
* Overlay and containers
*/
body.voice-mode-enabled {
#voice-overlay-transitor,
#voice-overlay-bg {
visibility: visible;
}
#voice-overlay-bg {
opacity: 1;
}
}
#voice-overlay-transitor {
position: fixed;
background-color: var(--black-color);
z-index: 10;
width: 12px;
height: 12px;
border-radius: 50%;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
will-change: transform;
animation: scaleIn 1s;
}
@keyframes scaleIn {
0% {
transform: scale3d(0, 0, 1);
}
100% {
transform: scale3d(172, 172, 1);
}
}
#voice-status,
#voice-tips {
color: var(--grey-color);
text-align: center;
}
#voice-status {
font-size: 17px;
font-style: italic;
}
#voice-tips {
margin-top: 32px;
line-height: 18px;
font-size: 15px;
}
#voice-overlay-bg {
visibility: hidden;
cursor: pointer;
opacity: 0;
position: fixed;
width: 100vw;
height: 100vh;
z-index: 100;
will-change: opacity;
display: flex;
justify-content: center;
// backdrop-filter: saturate(140%) blur(5px);
/*background-color: rgba(0, 0, 0, .9);*/
background-color: var(--black-color);
}
@keyframes skipFadeIn {
0% {
opacity: 1;
}
100% {
opacity: 1;
}
}
#voice-container {
opacity: 0;
position: relative;
top: 64px;
display: flex;
flex-direction: column;
width: 1024px;
height: 756px;
align-items: center;
gap: 64px;
animation: fadeIn 1s 3s both;
}
#voice-energy-container {
--neon-size: 228px;
// animation: fadeIn 1s 1.5s both;
//opacity: 0;
overflow: hidden;
position: relative;
height: 400px;
border-radius: 50%;
display: flex;
justify-content: center;
align-items: center;
}
p#voice-speech {
width: 100%;
height: 100%;
flex: 1;
text-align: center;
font-size: 3rem;
font-weight: 600;
}
/**
* Neons
*/
.voice-neon {
position: absolute;
z-index: 10;
width: var(--neon-size);
height: var(--neon-size);
}
#purple-neon-blur {
--neon-blur: calc(var(--neon-size) + 96px);
position: absolute;
z-index: 0;
opacity: 0.7;
width: var(--neon-blur);
height: var(--neon-blur);
}
#blue-neon-1 {
margin-top: -8px;
margin-left: 12px;
}
#blue-neon-2 {
margin-top: 8px;
margin-right: 12px;
}
/**
* Particles
*/
.voice-particle {
position: absolute;
width: 3px;
height: 3px;
border-radius: 50%;
opacity: 1;
will-change: transform, opacity;
animation-duration: 1s;
animation-iteration-count: infinite;
}
.voice-particle.blue {
background-color: #c4e0ff;
box-shadow: 0 0 2px 2px var(--blue-color);
}
.voice-particle.pink {
background-color: #ffb9d7;
box-shadow: 0 0 2px 2px var(--pink-color);
}
+61
View File
@@ -0,0 +1,61 @@
@use 'variables' as *;
/**
* IDLE status
*/
#voice-energy-container.idle {
.voice-particle {
visibility: hidden;
animation-play-state: paused;
opacity: 0;
}
.voice-neon {
margin: 0;
}
#purple-neon-blur {
transform: scale(1);
}
#purple-neon-blur circle {
filter: drop-shadow(0px 0px 64px $voice-neon-shadow-color);
animation: idleNeonBlurBreath 2.2s infinite alternate;
}
#pink-neon-1 {
transform: scale(1);
animation: idleBouncePinkNeon1 1.8s 1s infinite alternate;
}
#blue-neon-1 {
transform: scale(0.8);
animation: idleMoveBlueNeon1 1.8s infinite alternate;
}
#blue-neon-2 {
transform: scale(0.9);
animation: idleMoveBlueNeon2 1.8s 0.5s infinite alternate;
}
}
@keyframes idleNeonBlurBreath {
100% {
filter: drop-shadow(0px 0px 0px $voice-neon-shadow-color);
}
}
@keyframes idleBouncePurpleNeonBlur {
100% {
transform: scale(1);
}
}
@keyframes idleBouncePinkNeon1 {
100% {
transform: scale(1.1);
}
}
@keyframes idleMoveBlueNeon1 {
100% {
transform: scale(0.9);
}
}
@keyframes idleMoveBlueNeon2 {
100% {
transform: scale(1);
}
}
+61
View File
@@ -0,0 +1,61 @@
@use 'variables' as *;
/**
* Listening status
*/
#voice-energy-container.listening {
.voice-particle {
visibility: hidden;
animation-play-state: paused;
opacity: 0;
}
.voice-neon {
margin: 0;
}
#purple-neon-blur {
transform: scale(1);
}
#purple-neon-blur circle {
filter: drop-shadow(0px 0px 64px $voice-neon-shadow-color);
animation: listeningNeonBlurBreath 0.7s infinite alternate;
}
#pink-neon-1 {
transform: scale(1);
animation: listeningBouncePinkNeon1 0.3s 1s infinite alternate;
}
#blue-neon-1 {
transform: scale(0.8);
animation: listeningMoveBlueNeon1 0.3s infinite alternate;
}
#blue-neon-2 {
transform: scale(0.9);
animation: listeningMoveBlueNeon2 0.3s 0.5s infinite alternate;
}
}
@keyframes listeningNeonBlurBreath {
100% {
filter: drop-shadow(0px 0px 0px $voice-neon-shadow-color);
}
}
@keyframes listeningBouncePurpleNeonBlur {
100% {
transform: scale(1);
}
}
@keyframes listeningBouncePinkNeon1 {
100% {
transform: scale(1.1);
}
}
@keyframes listeningMoveBlueNeon1 {
100% {
transform: scale(0.9);
}
}
@keyframes listeningMoveBlueNeon2 {
100% {
transform: scale(1);
}
}
+5
View File
@@ -0,0 +1,5 @@
@use 'base';
@use 'listening';
@use 'idle';
@use 'processing';
@use 'talking';
+88
View File
@@ -0,0 +1,88 @@
@use 'sass:math';
/**
* Processing status
*/
#voice-energy-container.processing {
#purple-neon-blur {
animation: processingBouncePurpleNeonBlur 1s infinite alternate;
}
#pink-neon-1 {
animation: processingBouncePinkNeon1 0.5s infinite alternate;
}
#blue-neon-1 {
animation: processingMoveBlueNeon1 0.5s infinite alternate;
}
#blue-neon-2 {
animation: processingMoveBlueNeon2 0.5s infinite alternate;
}
}
@keyframes processingBouncePurpleNeonBlur {
50% {
transform: scale(1.07);
}
100% {
transform: scale(1);
}
}
@keyframes processingBouncePinkNeon1 {
50% {
transform: scale(1.02);
}
100% {
transform: scale(1);
}
}
@keyframes processingMoveBlueNeon1 {
0% {
transform: translateX(0) translateY(0);
}
33% {
transform: translateY(-3px) translateX(-2px);
}
66% {
transform: translateY(-3px) translateX(3px);
}
100% {
transform: translateY(-3px) translateX(1px);
}
}
@keyframes processingMoveBlueNeon2 {
0% {
transform: translateX(0) translateY(0);
}
33% {
transform: translateY(3px) translateX(2px);
}
66% {
transform: translateY(3px) translateX(3px);
}
100% {
transform: translateY(3px) translateX(-1px);
}
}
@for $i from 0 through 31 {
.processing .voice-particle[data-particle='#{$i}'] {
animation-delay: #{$i * 0.1}s;
}
.processing .voice-particle[data-particle='#{$i}'] {
animation-name: processingMoveParticle#{$i};
}
#voice-energy-container.processing {
@keyframes processingMoveParticle#{$i} {
75% {
opacity: 0.1;
}
100% {
opacity: 1;
transform: translateX(math.cos(11.25deg * $i) * 110px)
translateY(math.sin(11.25deg * $i) * 110px);
}
}
}
}
+82
View File
@@ -0,0 +1,82 @@
@use 'sass:math';
/**
* Talking status
*/
#voice-energy-container.talking {
.voice-neon {
margin: 0;
}
#purple-neon-blur {
animation: talkingBouncePurpleNeonBlur 1s infinite alternate;
}
#pink-neon-1 {
transform: scale(1);
animation: talkingBouncePinkNeon1 0.5s 1s infinite alternate;
}
#blue-neon-1 {
transform: scale(0.8);
animation: talkingMoveBlueNeon1 0.5s infinite alternate;
}
#blue-neon-2 {
transform: scale(0.9);
animation: talkingMoveBlueNeon2 0.5s 0.3s infinite alternate;
}
}
@keyframes talkingBouncePurpleNeonBlur {
50% {
transform: scale(1.07);
}
100% {
transform: scale(1);
}
}
@keyframes talkingBouncePinkNeon1 {
100% {
transform: scale(1.1);
}
}
@keyframes talkingMoveBlueNeon1 {
100% {
transform: scale(0.9);
}
}
@keyframes talkingMoveBlueNeon2 {
100% {
transform: scale(1);
}
}
.talking .voice-particle {
opacity: 0;
animation-duration: 2s;
}
@for $i from 0 through 31 {
.talking .voice-particle[data-particle='#{$i}'] {
animation-delay: #{$i * 0.2}s;
// animation-duration: #{$i * 0.5}s;
}
.talking .voice-particle[data-particle='#{$i}'] {
animation-name: talkingMoveParticle#{$i};
}
#voice-energy-container.talking {
@keyframes talkingMoveParticle#{$i} {
0% {
opacity: 1;
transform: translate(0);
}
50% {
opacity: 0;
}
100% {
opacity: 0;
transform: translateX(math.cos(math.random() * 360deg))
translateY(math.sin(math.random() * 360deg));
}
}
}
}
@@ -0,0 +1 @@
export * from './timer'
@@ -0,0 +1 @@
export * from './timer'
@@ -0,0 +1,71 @@
import { useState, useEffect } from 'react'
import { CircularProgress, Flexbox, Text } from '@aurora'
interface TimerProps {
initialTime: number
interval: number
totalTimeContent: string
initialProgress?: number
onEnd?: () => void
}
function formatTime(seconds: number): string {
const minutes = seconds >= 60 ? Math.floor(seconds / 60) : 0
const remainingSeconds = seconds % 60
const formattedMinutes = minutes < 10 ? `0${minutes}` : minutes
const formattedSeconds =
remainingSeconds < 10 ? `0${remainingSeconds}` : remainingSeconds
return `${formattedMinutes}:${formattedSeconds}`
}
export function Timer({
initialTime,
initialProgress,
interval,
totalTimeContent,
onEnd
}: TimerProps) {
const [progress, setProgress] = useState(initialProgress || 0)
const [timeLeft, setTimeLeft] = useState(initialTime)
useEffect(() => {
setTimeLeft(initialTime)
setProgress(progress)
}, [initialTime])
useEffect(() => {
if (timeLeft <= 0) {
return
}
const timer = setInterval(() => {
setTimeLeft((prevTime) => {
const newTime = prevTime - 1
if (newTime <= 0 && onEnd) {
onEnd()
}
return newTime
})
setProgress((prevProgress) => prevProgress + 100 / initialTime)
}, interval)
return () => clearInterval(timer)
}, [initialTime, interval, timeLeft])
return (
<CircularProgress value={progress} size="lg">
<Flexbox gap="xs" alignItems="center" justifyContent="center">
<Text fontSize="lg" fontWeight="semi-bold">
{formatTime(timeLeft)}
</Text>
<Text fontSize="xs" secondary>
{totalTimeContent}
</Text>
</Flexbox>
</CircularProgress>
)
}

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Before

Width:  |  Height:  |  Size: 7.6 KiB

After

Width:  |  Height:  |  Size: 7.6 KiB

Before

Width:  |  Height:  |  Size: 772 B

After

Width:  |  Height:  |  Size: 772 B

+366
View File
@@ -0,0 +1,366 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" type="image/png" href="/img/favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Leon</title>
<style>
@import './css/style.scss';
</style>
</head>
<body class="settingup">
<div id="init"></div>
<div id="voice-overlay-bg">
<div id="voice-container">
<div>
<div id="voice-energy-container">
<svg
class="voice-neon"
id="pink-neon-1"
viewBox="0 0 237 237"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<g filter="url(#filter0_i_6_16)">
<circle
cx="118.5"
cy="118.5"
r="113.5"
stroke="#FFF"
stroke-width="10"
/>
</g>
<defs>
<filter
id="filter0_i_6_16"
x="0"
y="0"
width="237"
height="237"
filterUnits="userSpaceOnUse"
color-interpolation-filters="sRGB"
>
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend
mode="normal"
in="SourceGraphic"
in2="BackgroundImageFix"
result="shape"
/>
<feColorMatrix
in="SourceAlpha"
type="matrix"
values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
result="hardAlpha"
/>
<feMorphology
radius="1"
operator="erode"
in="SourceAlpha"
result="effect1_innerShadow_6_16"
/>
<feOffset />
<feGaussianBlur stdDeviation="1" />
<feComposite
in2="hardAlpha"
operator="arithmetic"
k2="-1"
k3="1"
/>
<feColorMatrix
type="matrix"
values="0 0 0 0 0.929412 0 0 0 0 0.160784 0 0 0 0 0.478431 0 0 0 1 0"
/>
<feBlend
mode="normal"
in2="shape"
result="effect1_innerShadow_6_16"
/>
</filter>
</defs>
</svg>
<svg
class="voice-neon"
id="blue-neon-1"
viewBox="0 0 237 237"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<g filter="url(#filter0_i_6_24)">
<circle
cx="118.5"
cy="118.5"
r="116.5"
stroke="#FFF"
stroke-width="4"
/>
</g>
<defs>
<filter
id="filter0_i_6_24"
x="0"
y="0"
width="237"
height="237"
filterUnits="userSpaceOnUse"
color-interpolation-filters="sRGB"
>
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend
mode="normal"
in="SourceGraphic"
in2="BackgroundImageFix"
result="shape"
/>
<feColorMatrix
in="SourceAlpha"
type="matrix"
values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
result="hardAlpha"
/>
<feMorphology
radius="1"
operator="erode"
in="SourceAlpha"
result="effect1_innerShadow_6_24"
/>
<feOffset />
<feGaussianBlur stdDeviation="1" />
<feComposite
in2="hardAlpha"
operator="arithmetic"
k2="-1"
k3="1"
/>
<feColorMatrix
type="matrix"
values="0 0 0 0 0.109804 0 0 0 0 0.458824 0 0 0 0 0.858824 0 0 0 1 0"
/>
<feBlend
mode="normal"
in2="shape"
result="effect1_innerShadow_6_24"
/>
</filter>
</defs>
</svg>
<svg
class="voice-neon"
id="blue-neon-2"
viewBox="0 0 237 237"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<g filter="url(#filter0_i_6_24)">
<circle
cx="118.5"
cy="118.5"
r="116.5"
stroke="#FFF"
stroke-width="4"
/>
</g>
<defs>
<filter
id="filter0_i_6_24"
x="0"
y="0"
width="237"
height="237"
filterUnits="userSpaceOnUse"
color-interpolation-filters="sRGB"
>
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend
mode="normal"
in="SourceGraphic"
in2="BackgroundImageFix"
result="shape"
/>
<feColorMatrix
in="SourceAlpha"
type="matrix"
values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
result="hardAlpha"
/>
<feMorphology
radius="5"
operator="erode"
in="SourceAlpha"
result="effect1_innerShadow_6_24"
/>
<feOffset />
<feGaussianBlur stdDeviation="1" />
<feComposite
in2="hardAlpha"
operator="arithmetic"
k2="-1"
k3="1"
/>
<feColorMatrix
type="matrix"
values="0 0 0 0 0.109804 0 0 0 0 0.458824 0 0 0 0 0.858824 0 0 0 1 0"
/>
<feBlend
mode="normal"
in2="shape"
result="effect1_innerShadow_6_24"
/>
</filter>
</defs>
</svg>
<svg
id="purple-neon-blur"
viewBox="0 0 341 341"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<g opacity="0.72" filter="url(#filter0_f_18_61)">
<circle
cx="170.5"
cy="170.5"
r="116.5"
stroke="#ED297A"
stroke-width="24"
/>
</g>
<g opacity="0.72" filter="url(#filter1_f_18_61)">
<circle
cx="170.5"
cy="170.5"
r="116.5"
stroke="#1C75DB"
stroke-width="24"
/>
</g>
<defs>
<filter
id="filter0_f_18_61"
x="0"
y="0"
width="341"
height="341"
filterUnits="userSpaceOnUse"
color-interpolation-filters="sRGB"
>
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend
mode="normal"
in="SourceGraphic"
in2="BackgroundImageFix"
result="shape"
/>
<feGaussianBlur
stdDeviation="21"
result="effect1_foregroundBlur_18_61"
/>
</filter>
<filter
id="filter1_f_18_61"
x="0"
y="0"
width="341"
height="341"
filterUnits="userSpaceOnUse"
color-interpolation-filters="sRGB"
>
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend
mode="normal"
in="SourceGraphic"
in2="BackgroundImageFix"
result="shape"
/>
<feGaussianBlur
stdDeviation="21"
result="effect1_foregroundBlur_18_61"
/>
</filter>
</defs>
</svg>
</div>
<div id="voice-status"></div>
<div id="voice-tips">
It is recommended to use a headset for a better voice experience.
<br />
Otherwise, if your microphone is too sensitive or speakers are too
loud,
<br />
Leon may hear his own voice and get confused.
</div>
</div>
<p id="voice-speech"></p>
</div>
</div>
<aside id="sessions-panel" aria-label="Sessions">
<div id="sessions-header">
<div>
<span id="sessions-eyebrow">Sessions</span>
</div>
<button id="new-session" type="button" aria-label="New session">
<i class="ri-add-line"></i>
</button>
</div>
<div id="sessions-list"></div>
</aside>
<main>
<div id="top-container">
<div id="mood"></div>
<button id="info">Info</button>
</div>
<div id="feed">
<p id="no-bubble" class="hide">
You can start to interact with me, don't be shy.
</p>
</div>
<div id="is-typing">
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
</div>
<div id="input-container">
<div id="mic-container">
<button id="mic-button"></button>
<div id="sonar"></div>
</div>
<label for="utterance"></label>
<textarea id="utterance" autocomplete="off" autofocus></textarea>
<ul id="tip">
<li><kbd>enter</kbd> to submit.</li>
<li><kbd>shift</kbd> + <kbd>enter</kbd> for new line.</li>
<li>
<kbd>shift</kbd> + <kbd></kbd> / <kbd></kbd> to browse history.
</li>
<li><kbd>alt</kbd> / <kbd>cmd</kbd> + <kbd>c</kbd> to listen.</li>
<li><kbd>/</kbd> for commands.</li>
<li><kbd>@</kbd> for files.</li>
</ul>
</div>
</main>
<footer id="footer">
<div id="logo-container">
<div id="logo"></div>
<div>
<small>Leon AI</small>
<div id="version">
<small>v</small>
</div>
</div>
</div>
<div id="discord-container">
<div>
<small>
<a href="https://discord.gg/MNQqqKg" target="_blank"
>Join us on Discord</a
>
</small>
</div>
</div>
</footer>
<script type="module" src="/js/main.js"></script>
</body>
</html>
+7
View File
@@ -0,0 +1,7 @@
import axios from 'axios'
export async function requestBuiltInCommand(serverUrl, payload) {
const response = await axios.post(`${serverUrl}/api/v1/command`, payload)
return response.data
}
@@ -0,0 +1,750 @@
import { createRef } from 'react'
import { createRoot } from 'react-dom/client'
import { requestBuiltInCommand } from './api'
import { BuiltInCommandsModal } from './modal'
import FileSystemAutocomplete from '../file-system-autocomplete'
const AUTOCOMPLETE_DELAY_MS = 90
const CLOSE_ANIMATION_DURATION_MS = 180
const ROOT_COMMAND_INPUT = '/'
const EDITABLE_ACTION_KEYS = new Set(['Backspace', 'Delete'])
const NAVIGATION_DIRECTIONS = {
next: 1,
previous: -1
}
function isEditableElement(element) {
if (!element) {
return false
}
const tagName = element.tagName?.toLowerCase()
return (
tagName === 'input' ||
tagName === 'textarea' ||
element.isContentEditable === true
)
}
export default class BuiltInCommands {
constructor({
serverUrl,
input,
onSubmitToChat,
getActiveSessionId,
onCommandExecuted
}) {
this.serverUrl = serverUrl
this.input = input
this.onSubmitToChat = onSubmitToChat
this.getActiveSessionId = getActiveSessionId
this.onCommandExecuted = onCommandExecuted
this.sessionId = null
this.origin = 'shortcut'
this.commandValue = ''
this.selectedSuggestionIndex = -1
this.suggestions = []
this.recentSuggestions = []
this.result = null
this.loadingMessage = null
this.pendingInput = null
this.isOpen = false
this.isClosing = false
this.isLoading = false
this.hasSubmitted = false
this.autocompleteTimeout = null
this.closeTimeout = null
this.shouldFocusInput = false
this.modalInputRef = createRef()
this.fileSystemAutocomplete = new FileSystemAutocomplete({
serverUrl,
onValueChange: (value) => {
this.handleCommandChange(value)
}
})
}
init() {
this.mount()
this.attachEvents()
this.render()
}
mount() {
this.container = document.createElement('div')
document.body.appendChild(this.container)
this.root = createRoot(this.container)
}
attachEvents() {
document.addEventListener('keydown', (event) => {
this.handleDocumentKeyDown(event)
})
this.input.addEventListener('input', () => {
this.handleMainInput()
})
this.input.addEventListener('focus', () => {
this.handleMainInput()
})
}
render() {
const focusedInputElement = this.modalInputRef.current
const shouldRestoreCommandInputFocus =
focusedInputElement && document.activeElement === focusedInputElement
const selectionStart = shouldRestoreCommandInputFocus
? focusedInputElement.selectionStart
: null
const selectionEnd = shouldRestoreCommandInputFocus
? focusedInputElement.selectionEnd
: null
const { recentSelectedSuggestionIndex, suggestionSelectedSuggestionIndex } =
this.getSelectedSuggestionIndices()
this.root.render(
<BuiltInCommandsModal
isOpen={this.isOpen}
isVisible={this.isOpen || this.isClosing}
isLoading={this.isLoading}
loadingMessage={this.loadingMessage}
commandValue={this.commandValue}
suggestions={this.suggestions}
recentSuggestions={this.recentSuggestions}
recentSelectedSuggestionIndex={recentSelectedSuggestionIndex}
suggestionSelectedSuggestionIndex={suggestionSelectedSuggestionIndex}
result={this.result}
pendingInput={this.pendingInput}
hasSubmitted={this.hasSubmitted}
inputRef={this.modalInputRef}
onCommandChange={(value) => {
this.handleCommandChange(value)
}}
onMaskClick={() => {
this.close()
}}
onSuggestionSelect={(suggestion) => {
this.handleSuggestionSelect(suggestion)
}}
onReturn={() => {
this.returnToSuggestions()
}}
/>
)
if (this.shouldFocusInput) {
this.shouldFocusInput = false
window.requestAnimationFrame(() => {
this.focusCommandInput()
})
} else if (shouldRestoreCommandInputFocus) {
window.requestAnimationFrame(() => {
this.restoreCommandInputFocus(selectionStart, selectionEnd)
})
}
if (
this.isOpen &&
!this.hasSubmitted &&
!this.result &&
this.selectedSuggestionIndex >= 0
) {
window.requestAnimationFrame(() => {
this.scrollSelectedSuggestionIntoView()
})
}
window.requestAnimationFrame(() => {
this.attachFileSystemAutocomplete()
})
}
attachFileSystemAutocomplete() {
const inputElement = this.modalInputRef.current
if (!inputElement) {
return
}
this.fileSystemAutocomplete.attach(inputElement)
}
handleDocumentKeyDown(event) {
if (this.isOpen) {
if (event.metaKey || event.ctrlKey || event.altKey) {
return
}
if (event.key === 'Escape') {
event.preventDefault()
this.close()
return
}
if (event.key === 'ArrowDown') {
event.preventDefault()
this.blurCommandInput()
this.moveSelection(NAVIGATION_DIRECTIONS.next)
return
}
if (event.key === 'ArrowUp') {
event.preventDefault()
this.blurCommandInput()
this.moveSelection(NAVIGATION_DIRECTIONS.previous)
return
}
if (event.key === 'Tab') {
const suggestion =
this.selectedSuggestionIndex >= 0
? this.getVisibleSuggestions()[this.selectedSuggestionIndex]
: null
if (suggestion) {
event.preventDefault()
this.applySuggestion(suggestion, {
appendTrailingSpace: true
})
}
return
}
if (event.key === 'Enter' && !event.shiftKey) {
event.preventDefault()
if (this.selectedSuggestionIndex >= 0) {
const suggestion =
this.getVisibleSuggestions()[this.selectedSuggestionIndex]
if (suggestion) {
this.applySuggestion(suggestion)
void this.submit()
return
}
}
this.submit()
return
}
if (this.shouldHandleDetachedInputKey(event)) {
event.preventDefault()
this.handleDetachedInputKey(event)
return
}
return
}
if (
event.key !== '/' ||
event.metaKey ||
event.ctrlKey ||
event.altKey ||
event.shiftKey
) {
return
}
const activeElement = document.activeElement
if (
activeElement === this.input ||
(activeElement && isEditableElement(activeElement))
) {
return
}
event.preventDefault()
this.open({
origin: 'shortcut',
rawInput: '/'
})
}
handleMainInput() {
if (document.activeElement !== this.input) {
return
}
const rawValue = this.input.value || ''
if (!rawValue.startsWith('/')) {
return
}
this.open({
origin: 'input',
rawInput: rawValue
})
}
handleCommandChange(value) {
this.commandValue = value
this.hasSubmitted = false
if (!this.pendingInput) {
this.result = null
this.loadingMessage = null
this.queueAutocomplete()
}
this.render()
}
open({ origin, rawInput }) {
window.clearTimeout(this.closeTimeout)
if (this.isOpen) {
this.origin = origin
this.commandValue = this.normalizeCommandValue(rawInput)
this.result = null
this.loadingMessage = null
this.pendingInput = null
this.hasSubmitted = false
this.shouldFocusInput = true
this.input.value = ''
this.queueAutocomplete()
this.render()
return
}
this.origin = origin
this.sessionId = null
this.commandValue = this.normalizeCommandValue(rawInput)
this.suggestions = []
this.result = null
this.loadingMessage = null
this.pendingInput = null
this.selectedSuggestionIndex = -1
this.hasSubmitted = false
this.isOpen = true
this.isClosing = false
this.shouldFocusInput = true
this.input.value = ''
if (this.origin === 'input') {
this.input.blur()
}
this.queueAutocomplete()
this.render()
}
close() {
if (!this.isOpen || this.isClosing) {
return
}
this.isClosing = true
this.isOpen = false
this.fileSystemAutocomplete.close()
this.render()
this.closeTimeout = window.setTimeout(() => {
this.resetState()
this.render()
this.focusMainInput()
}, CLOSE_ANIMATION_DURATION_MS)
}
queueAutocomplete() {
window.clearTimeout(this.autocompleteTimeout)
this.isLoading = true
this.autocompleteTimeout = window.setTimeout(() => {
void this.fetchAutocomplete()
}, AUTOCOMPLETE_DELAY_MS)
}
async fetchAutocomplete() {
try {
const data = await requestBuiltInCommand(this.serverUrl, {
mode: 'autocomplete',
input: this.buildCommandInput(),
session_id: this.sessionId,
conversation_session_id: this.getActiveSessionId?.()
})
if (!this.isOpen || this.hasSubmitted) {
return
}
this.sessionId = data.session.id
this.suggestions = data.suggestions || []
this.recentSuggestions = data.recent_suggestions || []
this.loadingMessage = data.session.loading_message || null
this.pendingInput = data.session.pending_input || null
this.selectedSuggestionIndex =
this.getVisibleSuggestions().length > 0 ? 0 : -1
this.isLoading = false
this.render()
} catch (error) {
if (!this.isOpen || this.hasSubmitted) {
return
}
this.isLoading = false
this.result = {
title: 'Command Error',
tone: 'error',
blocks: [
{
type: 'list',
items: [
{
label: error.message || 'Failed to load built-in commands.',
tone: 'error'
}
]
}
]
}
this.loadingMessage = null
this.render()
}
}
async submit() {
const commandInput = this.buildCommandInput()
if (commandInput === ROOT_COMMAND_INPUT) {
return
}
window.clearTimeout(this.autocompleteTimeout)
this.autocompleteTimeout = null
await this.resolveLoadingMessageForSubmission(commandInput)
this.isLoading = true
this.hasSubmitted = true
this.result = null
this.commandValue = ''
this.suggestions = []
this.selectedSuggestionIndex = -1
this.render()
try {
const data = await requestBuiltInCommand(this.serverUrl, {
mode: 'execute',
input: commandInput,
session_id: this.sessionId,
conversation_session_id: this.getActiveSessionId?.()
})
if (data.client_action?.type === 'submit_to_chat') {
const wasSubmitted = this.onSubmitToChat?.(data.client_action)
if (!wasSubmitted) {
throw new Error('Failed to submit the built-in command to chat.')
}
this.isLoading = false
this.close()
return
}
this.sessionId = data.session.id
this.isLoading = false
this.result = data.result
this.onCommandExecuted?.(commandInput, data)
this.loadingMessage = data.session.loading_message || null
this.recentSuggestions = data.recent_suggestions || []
this.pendingInput = data.session.pending_input || null
this.commandValue = ''
this.render()
} catch (error) {
this.isLoading = false
this.result = {
title: 'Command Error',
tone: 'error',
blocks: [
{
type: 'list',
items: [
{
label:
error.message || 'Failed to execute the built-in command.',
tone: 'error'
}
]
}
]
}
this.loadingMessage = null
this.render()
}
}
async resolveLoadingMessageForSubmission(commandInput) {
try {
const data = await requestBuiltInCommand(this.serverUrl, {
mode: 'autocomplete',
input: commandInput,
session_id: this.sessionId,
conversation_session_id: this.getActiveSessionId?.()
})
this.sessionId = data.session.id
this.loadingMessage = data.session.loading_message || null
} catch {
this.loadingMessage = null
}
}
moveSelection(direction) {
if (this.hasSubmitted || this.result) {
return
}
const visibleSuggestions = this.getVisibleSuggestions()
if (visibleSuggestions.length === 0) {
return
}
if (this.selectedSuggestionIndex === -1) {
this.selectedSuggestionIndex = 0
} else {
this.selectedSuggestionIndex =
(this.selectedSuggestionIndex +
direction +
visibleSuggestions.length) %
visibleSuggestions.length
}
this.render()
}
handleSuggestionSelect(suggestion) {
const normalizedSuggestionValue = this.normalizeCommandValue(suggestion.value)
if (normalizedSuggestionValue.trim() === this.commandValue.trim()) {
void this.submit()
return
}
this.applySuggestion(suggestion, {
appendTrailingSpace: true
})
}
applySuggestion(suggestion, options = {}) {
this.commandValue = `${this.normalizeCommandValue(suggestion.value)}${
options.appendTrailingSpace ? ' ' : ''
}`
this.loadingMessage = null
this.queueAutocomplete()
this.shouldFocusInput = true
this.render()
}
returnToSuggestions() {
this.sessionId = null
this.hasSubmitted = false
this.result = null
this.loadingMessage = null
this.pendingInput = null
this.commandValue = ''
this.suggestions = []
this.selectedSuggestionIndex = -1
this.shouldFocusInput = true
this.queueAutocomplete()
this.render()
}
focusCommandInput() {
const inputElement = this.modalInputRef.current
if (!inputElement) {
return
}
inputElement.focus()
if (typeof inputElement.setSelectionRange === 'function') {
inputElement.setSelectionRange(
inputElement.value.length,
inputElement.value.length
)
}
}
restoreCommandInputFocus(selectionStart, selectionEnd) {
const inputElement = this.modalInputRef.current
if (!inputElement) {
return
}
if (document.activeElement !== inputElement) {
try {
inputElement.focus({ preventScroll: true })
} catch {
inputElement.focus()
}
}
if (
typeof inputElement.setSelectionRange === 'function' &&
selectionStart !== null &&
selectionEnd !== null
) {
inputElement.setSelectionRange(selectionStart, selectionEnd)
}
}
blurCommandInput() {
const inputElement = this.modalInputRef.current
if (!inputElement || document.activeElement !== inputElement) {
return
}
inputElement.blur()
}
focusMainInput() {
if (!this.input) {
return
}
window.requestAnimationFrame(() => {
try {
this.input.focus({ preventScroll: true })
} catch {
this.input.focus()
}
if (typeof this.input.setSelectionRange === 'function') {
this.input.setSelectionRange(
this.input.value.length,
this.input.value.length
)
}
})
}
scrollSelectedSuggestionIntoView() {
const selectedSuggestionElement = this.container?.querySelector(
'.aurora-list-item--selected'
)
if (!selectedSuggestionElement) {
return
}
selectedSuggestionElement.scrollIntoView({
block: 'nearest'
})
}
shouldHandleDetachedInputKey(event) {
const inputElement = this.modalInputRef.current
if (!inputElement || document.activeElement === inputElement) {
return false
}
return (
event.key.length === 1 ||
EDITABLE_ACTION_KEYS.has(event.key)
)
}
handleDetachedInputKey(event) {
if (event.key.length === 1) {
this.commandValue += event.key
} else if (event.key === 'Backspace') {
this.commandValue = this.commandValue.slice(0, -1)
} else if (event.key === 'Delete') {
this.commandValue = ''
}
this.hasSubmitted = false
this.result = null
this.loadingMessage = null
this.queueAutocomplete()
this.shouldFocusInput = true
this.render()
}
normalizeCommandValue(rawInput) {
const normalizedValue = String(rawInput || '').trim()
if (!normalizedValue.startsWith('/')) {
return normalizedValue
}
return normalizedValue.slice(1)
}
buildCommandInput() {
if (this.pendingInput) {
return this.commandValue
}
return `/${this.commandValue}`.trim()
}
getVisibleSuggestions() {
if (this.commandValue.trim() === '') {
return [...this.recentSuggestions, ...this.suggestions]
}
return this.suggestions
}
getSelectedSuggestionIndices() {
if (this.commandValue.trim() !== '') {
return {
recentSelectedSuggestionIndex: -1,
suggestionSelectedSuggestionIndex: this.selectedSuggestionIndex
}
}
const recentSuggestionsLength = this.recentSuggestions.length
if (this.selectedSuggestionIndex < 0) {
return {
recentSelectedSuggestionIndex: -1,
suggestionSelectedSuggestionIndex: -1
}
}
if (this.selectedSuggestionIndex < recentSuggestionsLength) {
return {
recentSelectedSuggestionIndex: this.selectedSuggestionIndex,
suggestionSelectedSuggestionIndex: -1
}
}
return {
recentSelectedSuggestionIndex: -1,
suggestionSelectedSuggestionIndex:
this.selectedSuggestionIndex - recentSuggestionsLength
}
}
resetState() {
window.clearTimeout(this.autocompleteTimeout)
this.isClosing = false
this.isLoading = false
this.sessionId = null
this.origin = 'shortcut'
this.commandValue = ''
this.suggestions = []
this.result = null
this.loadingMessage = null
this.pendingInput = null
this.selectedSuggestionIndex = -1
this.hasSubmitted = false
this.shouldFocusInput = false
this.autocompleteTimeout = null
}
}
+3
View File
@@ -0,0 +1,3 @@
import '../../css/built-in-commands.scss'
export { default as BuiltInCommands } from './built-in-commands.jsx'
+263
View File
@@ -0,0 +1,263 @@
import {
Button,
Flexbox,
Icon,
Input,
List,
ListHeader,
ListItem,
Loader,
ScrollContainer,
Text
} from '@aurora'
import { BuiltInCommandResultRenderer } from './result-renderer'
const SLASH_COMMAND_ICON_SVG = (
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="currentColor"
>
<path d="M9.78839 21H7.66003L14.2115 3H16.3398L9.78839 21Z" />
</svg>
)
function parseRemixIcon(rawIconName, rawIconType) {
const fallbackIcon = {
iconName: 'terminal-box',
type: 'line'
}
const normalizedIconName = String(rawIconName || '').trim()
const normalizedIconType = ['line', 'fill', 'notype'].includes(rawIconType)
? rawIconType
: null
if (!normalizedIconName) {
return fallbackIcon
}
const iconWithoutPrefix = normalizedIconName.replace(/^ri-/, '')
if (iconWithoutPrefix.endsWith('-line')) {
return {
iconName: iconWithoutPrefix.slice(0, -5),
type: 'line'
}
}
if (iconWithoutPrefix.endsWith('-fill')) {
return {
iconName: iconWithoutPrefix.slice(0, -5),
type: 'fill'
}
}
return {
iconName: iconWithoutPrefix,
type: normalizedIconType || 'notype'
}
}
function SuggestionList({
headerTitle,
suggestions,
selectedSuggestionIndex,
onSuggestionSelect
}) {
return (
<List>
<ListHeader>{headerTitle}</ListHeader>
{suggestions.map((suggestion, index) => {
const parsedIcon = parseRemixIcon(
suggestion.icon_name,
suggestion.icon_type
)
return (
<ListItem
key={`suggestion-${suggestion.value}-${index}`}
name="built-in-command-suggestion"
value={suggestion.value}
selected={index === selectedSuggestionIndex}
onClick={() => {
onSuggestionSelect(suggestion)
}}
>
<Flexbox flexDirection="row" alignItems="center" gap="md">
<Icon
iconName={parsedIcon.iconName}
type={parsedIcon.type}
size="md"
bgShape="square"
color="blue"
bgColor="transparent-blue"
/>
<div className="built-in-commands-modal__suggestion-copy">
<Text fontWeight="semi-bold">{suggestion.usage}</Text>
<Text secondary>{suggestion.description}</Text>
</div>
</Flexbox>
</ListItem>
)
})}
</List>
)
}
function LoadingState({ loadingMessage }) {
return (
<List>
<ListHeader>Working</ListHeader>
<ListItem>
<Flexbox flexDirection="row" alignItems="center" gap="sm">
<Loader size="sm" />
<Text>{loadingMessage || 'Working on it...'}</Text>
</Flexbox>
</ListItem>
</List>
)
}
function EmptyState() {
return (
<List>
<ListHeader>Suggestions</ListHeader>
<ListItem>
<Text secondary>No matching built-in command.</Text>
</ListItem>
</List>
)
}
export function BuiltInCommandsModal({
isOpen,
isVisible,
isLoading,
loadingMessage,
commandValue,
suggestions,
recentSuggestions,
recentSelectedSuggestionIndex,
suggestionSelectedSuggestionIndex,
result,
pendingInput,
hasSubmitted,
inputRef,
onCommandChange,
onMaskClick,
onSuggestionSelect,
onReturn
}) {
const isCommandInputEmpty = commandValue.trim() === ''
const pendingInputIcon = pendingInput?.icon_name
? parseRemixIcon(pendingInput.icon_name, pendingInput.icon_type)
: null
return (
<div
className={`built-in-commands-modal ${
isOpen
? 'built-in-commands-modal--open'
: isVisible
? ''
: 'built-in-commands-modal--hidden'
}`}
aria-hidden={!isVisible}
>
<div className="built-in-commands-modal__mask" onClick={onMaskClick} />
<div
className="built-in-commands-modal__panel"
role="dialog"
aria-modal="true"
aria-label="Built-in commands"
onClick={(event) => {
event.stopPropagation()
}}
>
<div className="built-in-commands-modal__section built-in-commands-modal__section--top">
<Flexbox flexDirection="row" alignItems="center" gap="md">
{hasSubmitted && result ? (
<div className="built-in-commands-modal__return-button">
<Button
light
iconName="arrow-left-double"
iconSize="lg"
onClick={() => {
onReturn()
}}
/>
</div>
) : null}
<div className="built-in-commands-modal__input-field">
<Input
name="built-in-commands"
type={pendingInput?.type || 'text'}
placeholder={
pendingInput?.placeholder || 'Type a built-in command'
}
maxLength={2_048}
iconName={pendingInputIcon?.iconName}
iconType={pendingInputIcon ? pendingInputIcon.type : undefined}
iconSVG={pendingInput ? undefined : SLASH_COMMAND_ICON_SVG}
iconSize="lg"
value={commandValue}
autofocus={isOpen}
inputRef={inputRef}
onChange={onCommandChange}
/>
</div>
</Flexbox>
</div>
<div className="built-in-commands-modal__section built-in-commands-modal__section--middle">
<div className="built-in-commands-modal__scroll-area">
<ScrollContainer orientation="vertical" height="100%">
{isLoading ? (
<LoadingState loadingMessage={loadingMessage} />
) : result ? (
<BuiltInCommandResultRenderer result={result} />
) : suggestions.length > 0 ? (
<Flexbox gap="md">
{isCommandInputEmpty && recentSuggestions.length > 0 ? (
<SuggestionList
headerTitle="Recently Used Commands"
suggestions={recentSuggestions}
selectedSuggestionIndex={recentSelectedSuggestionIndex}
onSuggestionSelect={onSuggestionSelect}
/>
) : null}
<SuggestionList
headerTitle={
isCommandInputEmpty ? 'All Commands' : 'Suggested Commands'
}
suggestions={suggestions}
selectedSuggestionIndex={suggestionSelectedSuggestionIndex}
onSuggestionSelect={onSuggestionSelect}
/>
</Flexbox>
) : (
<EmptyState />
)}
</ScrollContainer>
</div>
</div>
<div className="built-in-commands-modal__section built-in-commands-modal__section--bottom">
<Flexbox flexDirection="row" gap="md">
<Text fontSize="xs" secondary>
<kbd></kbd> <kbd></kbd> navigate
</Text>
<Text fontSize="xs" secondary>
<kbd>tab</kbd> complete
</Text>
<Text fontSize="xs" secondary>
<kbd>enter</kbd> submit
</Text>
<Text fontSize="xs" secondary>
<kbd>esc</kbd> close
</Text>
</Flexbox>
</div>
</div>
</div>
)
}
@@ -0,0 +1,145 @@
import {
Flexbox,
Icon,
Link,
List,
ListHeader,
ListItem,
Text
} from '@aurora'
function InlineLabel({ item }) {
if (item.inline_link_label && item.inline_link_href) {
return (
<Text>
{item.label}{' '}
<Link href={item.inline_link_href} fontSize="md">
{item.inline_link_label}
</Link>.
</Text>
)
}
return <Text>{item.label}</Text>
}
function ToneListItem({ item }) {
if (item.tone === 'success') {
return (
<ListItem>
<Flexbox flexDirection="row" alignItems="center" gap="sm">
<Icon
iconName="check"
size="sm"
type="fill"
bgShape="circle"
color="green"
bgColor="transparent-green"
/>
<InlineLabel item={item} />
</Flexbox>
</ListItem>
)
}
if (item.tone === 'warning') {
return (
<ListItem>
<Flexbox flexDirection="row" alignItems="center" gap="sm">
<Icon
iconName="alert"
size="sm"
type="fill"
bgShape="circle"
color="yellow"
bgColor="transparent-yellow"
/>
<InlineLabel item={item} />
</Flexbox>
</ListItem>
)
}
if (item.tone === 'error') {
return (
<ListItem>
<Flexbox flexDirection="row" alignItems="center" gap="sm">
<Icon
iconName="close"
size="sm"
type="fill"
bgShape="circle"
color="red"
bgColor="transparent-red"
/>
<InlineLabel item={item} />
</Flexbox>
</ListItem>
)
}
if (item.value || item.description) {
return (
<ListItem>
<div className="built-in-commands-modal__result-item">
<div className="built-in-commands-modal__result-copy">
<Text fontWeight="semi-bold">{item.label}</Text>
{item.description ? <Text secondary>{item.description}</Text> : null}
</div>
{item.value ? (
<div className="built-in-commands-modal__result-value">
{item.href ? (
<Link href={item.href} fontSize="md">
{item.value}
</Link>
) : (
<Text secondary textAlign="right">
{item.value}
</Text>
)}
</div>
) : null}
</div>
</ListItem>
)
}
if (item.inline_link_label && item.inline_link_href) {
return (
<ListItem>
<InlineLabel item={item} />
</ListItem>
)
}
return (
<ListItem>
<InlineLabel item={item} />
</ListItem>
)
}
export function BuiltInCommandResultRenderer({ result }) {
const blocks = Array.isArray(result?.blocks) ? result.blocks : []
return (
<Flexbox flexDirection="column" gap="sm">
{blocks.map((block, index) => {
if (block.type !== 'list') {
return null
}
const header = block.header || (index === 0 ? result.title : '')
return (
<List key={`result-block-${index}`}>
{header ? <ListHeader>{header}</ListHeader> : null}
{block.items.map((item, itemIndex) => (
<ToneListItem item={item} key={`result-item-${itemIndex}`} />
))}
</List>
)
})}
</Flexbox>
)
}
+951
View File
@@ -0,0 +1,951 @@
import { createElement } from 'react'
import { createRoot } from 'react-dom/client'
import axios from 'axios'
import { WidgetWrapper, Flexbox, Loader, Text } from '@aurora'
import renderAuroraComponent from './render-aurora-component'
import ToolUIHandler from './tool-ui-handler'
const WIDGETS_TO_FETCH = []
const WIDGETS_FETCH_CACHE = new Map()
const REPLACED_MESSAGES = new Set()
const AUTO_SCROLL_BOTTOM_THRESHOLD_PX = 24
const MAXIMUM_BUBBLES_IN_MEMORY = 62
const MAXIMUM_WIDGET_FETCH_CONCURRENCY = 4
const SECONDS_PER_MINUTE = 60
function escapeHTML(value) {
return String(value || '')
.replace(/&/g, '&amp;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
.replace(/"/g, '&quot;')
.replace(/'/g, '&#39;')
}
export default class Chatbot {
constructor(socket, serverURL, sessionId = null) {
this.socket = socket
this.serverURL = serverURL
this.sessionId = sessionId
this.et = new EventTarget()
this.feed = document.querySelector('#feed')
this.typing = document.querySelector('#is-typing')
this.noBubbleMessage = document.querySelector('#no-bubble')
this.parsedBubbles = []
this.reasoningBlocks = new Map()
this.feedAutoScrollEnabled = true
this.isProgrammaticFeedScroll = false
this.widgetHydrationPromise = null
// Initialize tool UI handler
this.toolUIHandler = new ToolUIHandler(
this.feed,
this.scrollDown.bind(this),
this.formatMessage.bind(this)
)
}
async init() {
await this.loadFeed()
this.scrollDown()
this.et.addEventListener('to-leon', (event) => {
this.createBubble({
who: 'me',
string: event.detail.string,
sentAt: event.detail.sentAt
})
})
this.et.addEventListener('me-received', (event) => {
this.createBubble({
who: 'leon',
string: event.detail
})
})
// Add event delegation for clickable paths
this.feed.addEventListener('click', (event) => {
if (event.target.classList.contains('clickable-path')) {
const path = event.target.getAttribute('data-path')
if (path) {
this.openPath(path)
}
}
})
this.feed.addEventListener(
'scroll',
() => {
this.handleFeedScroll()
},
{ passive: true }
)
}
sendTo(who, string, sentAt = Date.now()) {
if (who === 'leon') {
this.et.dispatchEvent(
new CustomEvent('to-leon', {
detail: {
string,
sentAt
}
})
)
}
}
receivedFrom(who, string) {
if (who === 'leon') {
this.et.dispatchEvent(new CustomEvent('me-received', { detail: string }))
}
}
isTyping(who, value) {
if (who === 'leon') {
if (value) {
this.enableTyping()
} else if (value === false) {
this.disableTyping()
}
}
}
enableTyping() {
if (!this.typing.classList.contains('on')) {
this.typing.classList.add('on')
}
}
disableTyping() {
if (this.typing.classList.contains('on')) {
this.typing.classList.remove('on')
}
}
isElementNearBottom(element) {
if (!element) {
return true
}
const remainingScrollableDistance =
element.scrollHeight - (element.scrollTop + element.clientHeight)
return remainingScrollableDistance <= AUTO_SCROLL_BOTTOM_THRESHOLD_PX
}
handleFeedScroll() {
if (!this.feed || this.isProgrammaticFeedScroll) {
return
}
this.feedAutoScrollEnabled = this.isElementNearBottom(this.feed)
}
scrollDown(options = {}) {
if (!this.feed) {
return
}
const { force = false } = options
if (!force && !this.feedAutoScrollEnabled) {
return
}
this.isProgrammaticFeedScroll = true
this.feed.scrollTo(0, this.feed.scrollHeight)
requestAnimationFrame(() => {
this.isProgrammaticFeedScroll = false
this.feedAutoScrollEnabled = this.isElementNearBottom(this.feed)
})
}
scrollReasoningContentToBottom(reasoningBlock) {
if (!reasoningBlock?.content || !reasoningBlock.isAutoScrollEnabled) {
return
}
reasoningBlock.isProgrammaticScroll = true
reasoningBlock.content.scrollTop = reasoningBlock.content.scrollHeight
requestAnimationFrame(() => {
reasoningBlock.isProgrammaticScroll = false
reasoningBlock.isAutoScrollEnabled = this.isElementNearBottom(
reasoningBlock.content
)
})
}
getWidgetPayload(formattedString) {
if (
typeof formattedString !== 'string' ||
!formattedString.includes('"component":"WidgetWrapper"')
) {
return null
}
try {
return JSON.parse(formattedString)
} catch {
return null
}
}
getPlanWidgetInsertionPoint(widgetPayload) {
if (!widgetPayload || widgetPayload.widget !== 'PlanWidget') {
return null
}
// Always append new plan widgets as new bubbles.
// Widget updates are handled via replaceMessageId targeting the same
// messageId, so insertion-point heuristics are unnecessary and can cause
// visual reuse across turns.
return null
}
isPlanWidgetData(data) {
return Boolean(data && typeof data === 'object' && data.widget === 'PlanWidget')
}
isSystemWidgetData(data) {
return Boolean(
data &&
typeof data === 'object' &&
data.historyMode &&
data.historyMode === 'system_widget'
)
}
getTimelineItemWeight(item) {
if (item.who === 'owner') {
return 0
}
if (item.source === 'system_widget') {
return 1
}
return 2
}
async hydrateFetchedWidgets() {
if (this.widgetHydrationPromise) {
return this.widgetHydrationPromise
}
const widgetContainers = [...WIDGETS_TO_FETCH].reverse()
WIDGETS_TO_FETCH.length = 0
if (widgetContainers.length === 0) {
return Promise.resolve()
}
const hydrateWidgetContainer = async (widgetContainer) => {
const hasWidgetBeenFetched = WIDGETS_FETCH_CACHE.has(
widgetContainer.widgetId
)
if (hasWidgetBeenFetched) {
const fetchedWidget = WIDGETS_FETCH_CACHE.get(widgetContainer.widgetId)
widgetContainer.reactRootNode.render(fetchedWidget.reactNode)
setTimeout(() => {
this.scrollDown()
}, 100)
return
}
const data = await axios.get(
`${this.serverURL}/api/v1/fetch-widget?skill_action=${widgetContainer.onFetch.actionName}&widget_id=${widgetContainer.widgetId}${this.sessionId ? `&session_id=${encodeURIComponent(this.sessionId)}` : ''}`
)
const fetchedWidget = data.data.widget
const reactNode = fetchedWidget
? renderAuroraComponent(
this.socket,
fetchedWidget.componentTree,
fetchedWidget.supportedEvents
)
: createElement(WidgetWrapper, {
children: createElement(Flexbox, {
alignItems: 'center',
justifyContent: 'center',
children: createElement(Text, {
secondary: true,
children: 'This widget has been deleted.'
})
})
})
widgetContainer.reactRootNode.render(reactNode)
WIDGETS_FETCH_CACHE.set(widgetContainer.widgetId, {
...fetchedWidget,
reactNode
})
setTimeout(() => {
this.scrollDown()
}, 100)
}
const workerCount = Math.min(
MAXIMUM_WIDGET_FETCH_CONCURRENCY,
widgetContainers.length
)
let currentIndex = 0
this.widgetHydrationPromise = Promise.all(
Array.from({ length: workerCount }, async () => {
while (currentIndex < widgetContainers.length) {
const widgetContainer = widgetContainers[currentIndex]
currentIndex += 1
if (!widgetContainer) {
continue
}
await hydrateWidgetContainer(widgetContainer)
}
})
)
.catch((error) => {
console.error('Failed to hydrate fetched widgets:', error)
})
.finally(() => {
this.widgetHydrationPromise = null
})
return this.widgetHydrationPromise
}
setSessionId(sessionId) {
this.sessionId = sessionId
}
resetFeed() {
WIDGETS_TO_FETCH.length = 0
this.feed.innerHTML = ''
this.noBubbleMessage = document.createElement('p')
this.noBubbleMessage.id = 'no-bubble'
this.noBubbleMessage.className = 'hide'
this.noBubbleMessage.textContent =
'You can start to interact with me, don\'t be shy.'
this.feed.appendChild(this.noBubbleMessage)
this.parsedBubbles = []
this.reasoningBlocks.clear()
this.feedAutoScrollEnabled = true
}
async loadFeed() {
WIDGETS_TO_FETCH.length = 0
this.resetFeed()
const sessionQuery = this.sessionId
? `&session_id=${encodeURIComponent(this.sessionId)}`
: ''
const [historyResponse, systemWidgetsResponse] = await Promise.all([
axios.get(
`${this.serverURL}/api/v1/conversation-history?supports_widgets=true${sessionQuery}`
),
axios.get(
`${this.serverURL}/api/v1/system-widgets?supports_widgets=true${sessionQuery}`
)
])
const history = Array.isArray(historyResponse.data?.history)
? historyResponse.data.history
: []
const systemWidgets = Array.isArray(systemWidgetsResponse.data?.widgets)
? systemWidgetsResponse.data.widgets
: []
const timelineItems = [...history, ...systemWidgets]
.map((item, index) => ({
...item,
sortIndex: index
}))
.sort((left, right) => {
if (left.sentAt !== right.sentAt) {
return left.sentAt - right.sentAt
}
const leftWeight = this.getTimelineItemWeight(left)
const rightWeight = this.getTimelineItemWeight(right)
if (leftWeight !== rightWeight) {
return leftWeight - rightWeight
}
return left.sortIndex - right.sortIndex
})
this.parsedBubbles = history
if (timelineItems.length === 0) {
this.noBubbleMessage.classList.remove('hide')
return
}
for (let i = 0; i < timelineItems.length; i += 1) {
const bubble = timelineItems[i]
if (
bubble.originalString &&
ToolUIHandler.isToolOutputMarker(bubble.originalString)
) {
continue
}
this.createBubble({
who: bubble.who === 'owner' ? 'me' : bubble.who,
string: bubble.originalString ? bubble.originalString : bubble.string,
metrics: bubble.llmMetrics || null,
sentAt: bubble.sentAt,
save: false,
isCreatingFromLoadingFeed: true,
messageId: bubble.messageId
})
}
void this.hydrateFetchedWidgets()
}
createBubble(params) {
const {
who,
string,
metrics = null,
save = true,
bubbleId,
isCreatingFromLoadingFeed = false,
messageId,
sentAt = null,
beforeElement = null
} = params
const container = document.createElement('div')
const bubble = document.createElement('p')
if (!this.noBubbleMessage.classList.contains('hide')) {
this.noBubbleMessage.classList.add('hide')
}
container.className = `bubble-container ${who}`
bubble.className = 'bubble'
if (messageId) {
container.setAttribute('data-message-id', messageId)
}
// Store original string before formatting
const originalString = string
const formattedString = this.formatMessage(string)
const widgetPayload = this.getWidgetPayload(formattedString)
const autoPlanInsertionPoint = this.getPlanWidgetInsertionPoint(widgetPayload)
const resolvedBeforeElement = beforeElement || autoPlanInsertionPoint
bubble.innerHTML = formattedString
if (bubbleId) {
container.classList.add(bubbleId)
}
if (resolvedBeforeElement && resolvedBeforeElement.parentNode === this.feed) {
this.feed.insertBefore(container, resolvedBeforeElement)
} else {
this.feed.appendChild(container)
}
container.appendChild(bubble)
if (who === 'leon' && metrics) {
container.appendChild(this.createMetricsElement(metrics, sentAt))
} else if (who === 'me') {
const timestampElement = this.createTimestampElement(sentAt)
if (timestampElement) {
container.appendChild(timestampElement)
}
}
let widgetComponentTree = null
let widgetSupportedEvents = null
/**
* Widget rendering
*/
if (
formattedString.includes &&
formattedString.includes('"component":"WidgetWrapper"')
) {
const parsedWidget = widgetPayload || JSON.parse(formattedString)
container.setAttribute('data-widget-id', parsedWidget.id)
/**
* On widget fetching, render the loader
*/
if (isCreatingFromLoadingFeed && parsedWidget.onFetch) {
const root = createRoot(container)
root.render(
createElement(WidgetWrapper, {
children: createElement(Flexbox, {
alignItems: 'center',
justifyContent: 'center',
children: createElement(Loader)
})
})
)
WIDGETS_TO_FETCH.push({
reactRootNode: root,
widgetId: parsedWidget.id,
onFetch: parsedWidget.onFetch
})
return container
}
widgetComponentTree = parsedWidget.componentTree
widgetSupportedEvents = parsedWidget.supportedEvents
/**
* On widget creation
*/
const root = createRoot(container)
const reactNode = renderAuroraComponent(
this.socket,
widgetComponentTree,
widgetSupportedEvents
)
root.render(reactNode)
}
if (save) {
this.saveBubble(who, originalString, formattedString, messageId, metrics, sentAt)
}
return container
}
formatReasoningPhaseTitle(phase) {
const normalizedPhase =
typeof phase === 'string' && phase.trim()
? phase.replaceAll('_', ' ').toUpperCase()
: 'EXECUTION'
return `REASONING - ${normalizedPhase}`
}
createOrUpdateReasoningBlock(generationId, token, phase) {
if (!generationId || !token) {
return null
}
if (!this.noBubbleMessage.classList.contains('hide')) {
this.noBubbleMessage.classList.add('hide')
}
let reasoningBlock = this.reasoningBlocks.get(generationId)
if (!reasoningBlock) {
const container = document.createElement('div')
const block = document.createElement('div')
const header = document.createElement('div')
const icon = document.createElement('i')
const title = document.createElement('span')
const content = document.createElement('div')
container.className = 'reasoning-block-container leon'
container.setAttribute('data-reasoning-id', generationId)
block.className = 'reasoning-block'
header.className = 'reasoning-header'
icon.className = 'ri-brain-ai-3-line reasoning-icon'
title.className = 'reasoning-title'
title.textContent = this.formatReasoningPhaseTitle(phase)
content.className = 'reasoning-content'
header.appendChild(icon)
header.appendChild(title)
block.appendChild(header)
block.appendChild(content)
container.appendChild(block)
this.feed.appendChild(container)
reasoningBlock = {
container,
content,
text: '',
isAutoScrollEnabled: true,
isProgrammaticScroll: false
}
content.addEventListener(
'scroll',
() => {
if (reasoningBlock.isProgrammaticScroll) {
return
}
reasoningBlock.isAutoScrollEnabled = this.isElementNearBottom(content)
},
{ passive: true }
)
this.reasoningBlocks.set(generationId, reasoningBlock)
}
reasoningBlock.text += token
reasoningBlock.content.textContent = reasoningBlock.text
this.scrollReasoningContentToBottom(reasoningBlock)
return reasoningBlock.container
}
handleToolOutput(data) {
const result = this.toolUIHandler.handleToolOutput(data)
// Save in memory if it's a new group
if (result && result.isNewGroup) {
const { toolkitName, toolName, answer } = data
const toolInfo = this.toolUIHandler.getToolGroupInfo(
result.groupId,
toolkitName,
toolName,
answer
)
this.saveBubble(
'leon',
toolInfo.originalString,
toolInfo.formattedMessage,
toolInfo.messageId
)
}
}
saveBubble(
who,
originalString,
string,
messageId,
metrics = null,
sentAt = null
) {
if (!this.noBubbleMessage.classList.contains('hide')) {
this.noBubbleMessage.classList.add('hide')
}
if (this.parsedBubbles.length === MAXIMUM_BUBBLES_IN_MEMORY) {
this.parsedBubbles.shift()
}
// Store both original and formatted strings
this.parsedBubbles.push({
who,
sentAt,
string,
originalString,
messageId,
llmMetrics: metrics
})
this.scrollDown()
}
formatMessage(message) {
const isWidget =
message.includes && message.includes('"component":"WidgetWrapper"')
if (typeof message === 'string' && !isWidget) {
message = escapeHTML(message)
message = message.replace(/\n/g, '<br />')
// Handle HTTP/HTTPS URLs with simple regex
message = message.replace(/https?:\/\/[^\s<>"{}|\\^`[\]]+/gi, (match) => {
return `<a href="${match}" target="_blank" rel="noopener noreferrer" class="clickable-url" title="Open URL in browser">${match}</a>`
})
// Handle file paths with delimiters for exact matching
message = message.replace(
/\[FILE_PATH\](.*?)\[\/FILE_PATH\]/g,
(match, filePath) => {
return `<span class="clickable-path" data-path="${filePath}" title="Open in file explorer">${filePath}</span>`
}
)
}
return message
}
formatMetricTimestamp(sentAt) {
if (typeof sentAt !== 'number' || !Number.isFinite(sentAt)) {
return ''
}
const date = new Date(sentAt)
const now = new Date()
if (Number.isNaN(date.getTime()) || Number.isNaN(now.getTime())) {
return ''
}
const timeFormatter = new Intl.DateTimeFormat(undefined, {
hour: '2-digit',
minute: '2-digit',
hour12: false
})
const formattedTime = timeFormatter.format(date)
const startOfToday = new Date(
now.getFullYear(),
now.getMonth(),
now.getDate()
)
const startOfTargetDay = new Date(
date.getFullYear(),
date.getMonth(),
date.getDate()
)
const dayDifference = Math.round(
(startOfToday.getTime() - startOfTargetDay.getTime()) / 86_400_000
)
if (dayDifference === 0) {
return `Today, ${formattedTime}`
}
if (dayDifference === 1) {
return `Yesterday, ${formattedTime}`
}
if (dayDifference > 1 && dayDifference < 7) {
const weekdayFormatter = new Intl.DateTimeFormat(undefined, {
weekday: 'long'
})
return `${weekdayFormatter.format(date)}, ${formattedTime}`
}
const monthDayFormatter = new Intl.DateTimeFormat(undefined, {
month: 'short',
day: 'numeric'
})
return `${monthDayFormatter.format(date)}, ${formattedTime}`
}
formatFullMetricTimestamp(sentAt) {
if (typeof sentAt !== 'number' || !Number.isFinite(sentAt)) {
return ''
}
const date = new Date(sentAt)
if (Number.isNaN(date.getTime())) {
return ''
}
const year = date.getFullYear()
const month = String(date.getMonth() + 1).padStart(2, '0')
const day = String(date.getDate()).padStart(2, '0')
const hours = String(date.getHours()).padStart(2, '0')
const minutes = String(date.getMinutes()).padStart(2, '0')
const seconds = String(date.getSeconds()).padStart(2, '0')
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
}
formatTimestampMarkup(sentAt) {
const formattedTimestamp = this.formatMetricTimestamp(sentAt)
const fullFormattedTimestamp = this.formatFullMetricTimestamp(sentAt)
if (!formattedTimestamp) {
return ''
}
return `
<span class="bubble-metric-item">
<i class="ri-time-line" aria-hidden="true"></i>
<span title="${fullFormattedTimestamp || formattedTimestamp}">${formattedTimestamp}</span>
</span>
`.trim()
}
formatTurnDuration(durationMs) {
const durationSeconds = Number(durationMs || 0) / 1_000
const roundedDurationSeconds = Math.max(0, Number(durationSeconds.toFixed(1)))
if (roundedDurationSeconds < SECONDS_PER_MINUTE) {
return `${roundedDurationSeconds.toFixed(1)}s`
}
const minutes = Math.floor(roundedDurationSeconds / SECONDS_PER_MINUTE)
const seconds = roundedDurationSeconds % SECONDS_PER_MINUTE
return `${minutes}m${seconds.toFixed(1)}s`
}
formatMetrics(metrics, sentAt = null) {
if (!metrics) {
return ''
}
const inputTokens = Number(metrics.inputTokens || 0)
const outputTokens = Number(metrics.outputTokens || 0)
const totalTokens = Number(metrics.totalTokens || inputTokens + outputTokens)
const turnDuration = this.formatTurnDuration(metrics.durationMs)
const tokensPerSecond = Number(
metrics.tokensPerSecond || metrics.averagedPhaseTokensPerSecond || 0
)
const tokenFormatter = new Intl.NumberFormat()
const timestampMarkup = this.formatTimestampMarkup(sentAt)
return `
<span class="bubble-metric-item">
<i class="ri-copper-coin-line" aria-hidden="true"></i>
<span>${tokenFormatter.format(totalTokens)} (i:${tokenFormatter.format(inputTokens)}/o:${tokenFormatter.format(outputTokens)}) tok</span>
</span>
<span class="bubble-metric-item">
<i class="ri-timer-flash-line" aria-hidden="true"></i>
<span>${turnDuration}</span>
</span>
<span class="bubble-metric-item">
<i class="ri-flashlight-line" aria-hidden="true"></i>
<span>${tokensPerSecond.toFixed(2)} t/s</span>
</span>
${timestampMarkup}
`.trim()
}
createMetricsElement(metrics, sentAt = null) {
const metricsElement = document.createElement('div')
metricsElement.className = 'bubble-metrics'
metricsElement.innerHTML = this.formatMetrics(metrics, sentAt)
return metricsElement
}
createTimestampElement(sentAt) {
const timestampMarkup = this.formatTimestampMarkup(sentAt)
if (!timestampMarkup) {
return null
}
const timestampElement = document.createElement('div')
timestampElement.className = 'bubble-metrics'
timestampElement.innerHTML = timestampMarkup
return timestampElement
}
updateBubbleMetrics(container, metrics, sentAt = null) {
if (!container) {
return
}
const existingMetricsElement = container.querySelector('.bubble-metrics')
if (!metrics) {
if (existingMetricsElement) {
existingMetricsElement.remove()
}
return
}
if (existingMetricsElement) {
existingMetricsElement.innerHTML = this.formatMetrics(metrics, sentAt)
return
}
container.appendChild(this.createMetricsElement(metrics, sentAt))
}
getLatestReasoningContainer() {
const reasoningContainers = this.feed.querySelectorAll(
'.reasoning-block-container'
)
if (reasoningContainers.length === 0) {
return null
}
return reasoningContainers[reasoningContainers.length - 1] || null
}
replaceMessage(replaceMessageId, newData) {
const existingBubble = document.querySelector(
`[data-message-id="${replaceMessageId}"]`
)
const isPlanWidget = this.isPlanWidgetData(newData)
const nextSibling = existingBubble ? existingBubble.nextSibling : null
if (existingBubble) {
existingBubble.remove()
const bubbleIndex = this.parsedBubbles.findIndex(
(bubble) => bubble.messageId === replaceMessageId
)
if (bubbleIndex !== -1) {
this.parsedBubbles.splice(bubbleIndex, 1)
}
}
const isTextAnswerPayload = Boolean(
newData &&
typeof newData === 'object' &&
typeof newData.answer === 'string' &&
!newData.widget &&
!newData.componentTree
)
const bubbleString = isTextAnswerPayload
? newData.answer
: typeof newData === 'string'
? newData
: JSON.stringify(newData)
const metrics =
isTextAnswerPayload && newData.llmMetrics ? newData.llmMetrics : null
const shouldSaveMessage = !this.isSystemWidgetData(newData)
const beforeElement = isPlanWidget ? null : nextSibling
this.createBubble({
who: 'leon',
string: bubbleString,
save: shouldSaveMessage,
messageId: replaceMessageId,
beforeElement,
metrics,
sentAt:
newData && typeof newData === 'object' && typeof newData.sentAt === 'number'
? newData.sentAt
: Date.now()
})
/**
* Only scroll down on the first replacement of this message
* to avoid repeating scrolling for every message replacement
*/
if (!REPLACED_MESSAGES.has(replaceMessageId)) {
REPLACED_MESSAGES.add(replaceMessageId)
this.scrollDown()
}
}
openPath(filePath) {
// Send request to server to open the file path in system file explorer
axios
.post(`${this.serverURL}/api/v1/open-path`, { path: filePath })
.then(({ data }) => {
if (!data.success) {
console.error('Failed to open path:', data.error)
}
})
.catch((error) => {
console.error('Error opening path:', error)
})
}
}
+651
View File
@@ -0,0 +1,651 @@
import { io } from 'socket.io-client'
import Chatbot from './chatbot'
import VoiceEnergy from './voice-energy'
import { ASR_DISABLED_MESSAGE, INIT_MESSAGES } from './constants'
import handleSuggestions from './suggestion-handler.js'
const LEON_CLIENT_INTERFACE_PROTOCOL_VERSION = 1
const LEON_EVENTS = {
init: 'leon:init',
utterance: 'leon:utterance',
ready: 'leon:ready',
answer: 'leon:answer',
isTyping: 'leon:is-typing',
suggest: 'leon:suggest',
llmToken: 'leon:llm-token',
llmReasoningToken: 'leon:llm-reasoning-token',
ownerUtterance: 'leon:owner-utterance',
error: 'leon:error'
}
export default class Client {
constructor(client, serverUrl, input, options = {}) {
this.client = client
this._input = input
this.voiceSpeechElement = document.querySelector('#voice-speech')
this.serverUrl = serverUrl
this.socket = io(this.serverUrl, { withCredentials: true })
this.activeSessionId = options.activeSessionId || null
this.history = localStorage.getItem('history')
this.parsedHistory = []
this.chatbot = new Chatbot(this.socket, this.serverUrl, this.activeSessionId)
this.voiceEnergy = new VoiceEnergy(this)
this._recorder = {}
this._suggestions = []
this._answerGenerationId = 'xxx'
this._activeStreamGenerationId = null
this._ttsAudioContext = null
this._isLeonGeneratingAnswer = false
this._isVoiceModeEnabled = false
this._hasSentInitMessages = false
this._chatbotInitPromise = null
// this._ttsAudioContextes = {}
}
set input(newInput) {
if (typeof newInput !== 'undefined') {
this._input.value = newInput
}
}
get input() {
return this._input
}
set recorder(recorder) {
this._recorder = recorder
}
get recorder() {
return this._recorder
}
updateMood(mood) {
const moodContainer = document.querySelector('#mood')
if (!moodContainer || !mood?.emoji || !mood?.type) {
return
}
moodContainer.textContent = `Leon's mood: ${mood.emoji}`
moodContainer.setAttribute('title', mood.type)
}
setSessionPanel(sessionPanel) {
this.sessionPanel = sessionPanel
}
async setActiveSession(sessionId) {
if (!sessionId || sessionId === this.activeSessionId) {
return
}
this.activeSessionId = sessionId
this.chatbot.setSessionId(sessionId)
this.socket.emit('session-change', sessionId)
await this.chatbot.loadFeed()
this.chatbot.scrollDown({ force: true })
}
async sendInitMessages() {
for (let i = 0; i < INIT_MESSAGES.length; i++) {
const messages = INIT_MESSAGES[i]
const message = messages[Math.floor(Math.random() * messages.length)]
const sendingDelay = Math.floor(Math.random() * 2000) + 1000
const typingFactorDelay = Math.floor(Math.random() * 4) + 2
setTimeout(() => {
this.chatbot.isTyping('leon', true)
}, sendingDelay / typingFactorDelay)
await new Promise((resolve) => setTimeout(resolve, sendingDelay))
this.chatbot.receivedFrom('leon', message)
this.chatbot.isTyping('leon', false)
}
}
setInitStatus(statusName, statusType) {
window.leonInitStatusEvent.dispatchEvent(
new CustomEvent('initStatusChange', {
detail: {
statusName,
statusType
}
})
)
}
waitForInitUICompletion() {
if (this._hasSentInitMessages || this.chatbot.parsedBubbles?.length > 0) {
return
}
const trySendInitMessages = () => {
const initializedInitElement = document.querySelector('#init .initialized')
if (!initializedInitElement) {
return false
}
this._hasSentInitMessages = true
this.sendInitMessages()
return true
}
if (trySendInitMessages()) {
return
}
const interval = setInterval(() => {
if (trySendInitMessages()) {
clearInterval(interval)
}
}, 100)
}
asrStartRecording() {
if (!window.leonConfigInfo.asr.enabled) {
alert(ASR_DISABLED_MESSAGE)
return
}
if (!this._isVoiceModeEnabled) {
this.enableVoiceMode()
this.voiceEnergy.status = 'listening'
this.socket.emit('asr-start-record')
}
}
init() {
this._chatbotInitPromise = this.chatbot.init()
this.voiceEnergy.init()
if (window.leonConfigInfo?.tcpServer?.enabled === false) {
this.setInitStatus('tcpServerBoot', 'success')
}
this.socket.on('connect', () => {
this.socket.emit(LEON_EVENTS.init, {
protocolVersion: LEON_CLIENT_INTERFACE_PROTOCOL_VERSION,
client: {
id: this.client,
type: 'web_app',
name: 'Leon Web App'
},
sessionId: this.activeSessionId,
capabilities: {
supportsWidgets: true,
supportsTokenStreaming: true,
supportsVoice: true
}
})
})
/**
* Init status listeners
*/
this.socket.on('init-llama-server-boot', (status) => {
this.setInitStatus('llamaServerBoot', status)
})
this.socket.on(LEON_EVENTS.ready, () => {
this.setInitStatus('clientCoreServerHandshake', 'success')
this.setInitStatus('tcpServerBoot', 'success')
void this._chatbotInitPromise?.then(() => {
setTimeout(() => {
const body = document.querySelector('body')
body.classList.remove('settingup')
}, 250)
this.waitForInitUICompletion()
})
})
this.socket.on(LEON_EVENTS.answer, (data) => {
/*if (this._isVoiceModeEnabled) {
this.voiceEnergy.status = 'listening'
}*/
// Leon has finished to answer
this._isLeonGeneratingAnswer = false
const isPlanWidget =
data && typeof data === 'object' && data.widget === 'PlanWidget'
if (isPlanWidget) {
this.chatbot.isTyping('leon', false)
}
/**
* Handle message replacement if replaceMessageId is provided
*/
if (data.replaceMessageId) {
this.chatbot.replaceMessage(data.replaceMessageId, data)
return
}
/**
* Handle tool output messages
*/
if (data.isToolOutput) {
this.chatbot.handleToolOutput(data)
return
}
/**
* Handle widget data directly
*/
if (data.widget || data.componentTree) {
const isSystemWidget = this.chatbot.isSystemWidgetData(data)
// Pass the entire widget data as JSON string for chatbot.js to handle
const widgetString =
typeof data === 'string' ? data : JSON.stringify(data)
this.chatbot.createBubble({
who: 'leon',
string: widgetString,
save: !isSystemWidget,
messageId: data.widget?.id || data.id || `msg-${Date.now()}`
})
return
}
const answerText = typeof data === 'string' ? data : data.answer
const llmMetrics =
data && typeof data === 'object' && data.llmMetrics
? data.llmMetrics
: null
/**
* Just save the bubble if the newest bubble is from the streaming.
* Otherwise, create a new bubble
*/
const streamGenerationId =
this._activeStreamGenerationId || this._answerGenerationId
const streamedBubbleContainerElement = streamGenerationId
? document.querySelector(
`.bubble-container.leon.${streamGenerationId}`
)
: null
const isBubbleFromStreaming = Boolean(streamedBubbleContainerElement)
if (isBubbleFromStreaming && streamedBubbleContainerElement) {
this.chatbot.saveBubble(
'leon',
answerText,
answerText,
null,
llmMetrics,
data && typeof data === 'object' && typeof data.sentAt === 'number'
? data.sentAt
: Date.now()
)
// Slightly delay the update to avoid the stream animation to be interrupted
setTimeout(() => {
// Update the text of the bubble (quick emoji fix)
streamedBubbleContainerElement.querySelector('p.bubble').innerHTML =
this.chatbot.formatMessage(answerText)
this.chatbot.updateBubbleMetrics(
streamedBubbleContainerElement,
llmMetrics,
data && typeof data === 'object' && typeof data.sentAt === 'number'
? data.sentAt
: Date.now()
)
}, 2_500)
} else {
this.chatbot.createBubble({
who: 'leon',
string: answerText,
save:
!(
data &&
typeof data === 'object' &&
data.historyMode === 'system_widget'
),
metrics: llmMetrics,
messageId: data && typeof data === 'object' ? data.messageId : null,
sentAt:
data && typeof data === 'object' && typeof data.sentAt === 'number'
? data.sentAt
: Date.now()
})
}
this.chatbot.scrollDown({ force: true })
this._activeStreamGenerationId = null
this._answerGenerationId = 'xxx'
void this.sessionPanel?.refresh()
})
this.socket.on(LEON_EVENTS.suggest, (data) => {
setTimeout(() => {
handleSuggestions(data, this.chatbot, this)
}, 400)
setTimeout(() => {
this.chatbot.scrollDown()
}, 450)
/*data?.forEach((suggestionText) => {
this.addSuggestion(suggestionText)
})*/
})
this.socket.on(LEON_EVENTS.isTyping, (data) => {
this.chatbot.isTyping('leon', data)
})
this.socket.on(LEON_EVENTS.ownerUtterance, (data) => {
if (!data?.utterance) {
return
}
this.chatbot.createBubble({
who: 'me',
string: data.utterance,
messageId: data.messageId,
sentAt: typeof data.sentAt === 'number' ? data.sentAt : Date.now()
})
})
this.socket.on('recognized', (data, cb) => {
this._input.value = data
this.send('utterance')
cb('string-received')
})
this.socket.on('widget-send-utterance', (utterance) => {
this._input.value = utterance
this.send('utterance')
})
this.socket.on('new-mood', (mood) => {
this.updateMood(mood)
})
this.socket.on(LEON_EVENTS.llmToken, (data) => {
if (this._isVoiceModeEnabled) {
this.voiceEnergy.status = 'processing'
}
this._isLeonGeneratingAnswer = true
const previousGenerationId = this._answerGenerationId
const newGenerationId = data.generationId
this._answerGenerationId = newGenerationId
this._activeStreamGenerationId = newGenerationId
const isSameGeneration = previousGenerationId === newGenerationId
let bubbleContainerElement = null
if (!isSameGeneration) {
bubbleContainerElement = this.chatbot.createBubble({
who: 'leon',
string: data.token,
save: false,
bubbleId: newGenerationId
})
} else {
bubbleContainerElement = document.querySelector(
`.${previousGenerationId}`
)
}
const bubbleElement = bubbleContainerElement.querySelector('p.bubble')
// Token is already appened when it's a new generation
if (isSameGeneration) {
// bubbleElement.textContent += data.token
const tokenSpan = document.createElement('span')
tokenSpan.className = 'llm-token fade-in'
tokenSpan.textContent = data.token
bubbleElement.appendChild(tokenSpan)
}
this.chatbot.scrollDown()
})
this.socket.on(LEON_EVENTS.llmReasoningToken, (data) => {
if (!data?.generationId || !data?.token) {
return
}
if (this._isVoiceModeEnabled) {
this.voiceEnergy.status = 'processing'
}
this._isLeonGeneratingAnswer = true
this.chatbot.createOrUpdateReasoningBlock(
data.generationId,
data.token,
data.phase
)
this.chatbot.scrollDown()
})
this.socket.on('asr-speech', (text) => {
if (!this._isVoiceModeEnabled) {
this.enableVoiceMode()
}
this.voiceEnergy.status = 'listening'
this._input.value = text
if (this.voiceSpeechElement) {
this.voiceSpeechElement.textContent = text
}
})
this.socket.on('asr-end-of-owner-speech', () => {
this.voiceEnergy.status = 'processing'
setTimeout(() => {
this.send('utterance')
}, 200)
})
this.socket.on('asr-active-listening-disabled', () => {
this.voiceEnergy.status = 'idle'
})
/**
* Only used for "local" TTS provider as a PoC for now.
* Target to do a better implementation in the future
* with streaming support
*/
this.socket.on('tts-stream', (data) => {
this.voiceEnergy.status = 'talking'
// const { audioId, chunk } = data
const { chunk } = data
this._ttsAudioContext = new AudioContext()
// this._ttsAudioContextes[audioId] = ctx
const source = this._ttsAudioContext.createBufferSource()
this._ttsAudioContext.decodeAudioData(chunk, (buffer) => {
source.buffer = buffer
source.connect(this._ttsAudioContext.destination)
source.start(0)
})
})
/**
* When Leon got interrupted by the owner voice
* while he is speaking
*/
this.socket.on('tts-interruption', async () => {
if (this._ttsAudioContext) {
await this._ttsAudioContext.close()
}
})
this.socket.on('tts-end-of-speech', async () => {
this.voiceEnergy.status = 'listening'
if (window.leonConfigInfo?.asr?.enabled) {
this.socket.emit('asr-start-record')
}
})
this.socket.on('audio-forwarded', (data, cb) => {
const ctx = new AudioContext()
const source = ctx.createBufferSource()
ctx.decodeAudioData(data.buffer, (buffer) => {
source.buffer = buffer
source.connect(ctx.destination)
source.start(0)
/**
* When the after speech option is enabled and
* the answer is a final one
*/
if (window.leonConfigInfo.after_speech && data.is_final_answer) {
// Enable recording after the speech + 500ms
setTimeout(() => {
this._recorder.start()
this._recorder.enabled = true
// Check every second if the recorder is enabled to stop it
const id = setInterval(() => {
if (this._recorder.enabled) {
if (this._recorder.countSilenceAfterTalk <= 8) {
// Stop recording if there was no noise for 8 seconds
if (this._recorder.countSilenceAfterTalk === 8) {
this._recorder.stop()
this._recorder.enabled = false
this._recorder.countSilenceAfterTalk = 0
clearInterval(id)
} else if (!this._recorder.noiseDetected) {
this._recorder.countSilenceAfterTalk += 1
} else {
clearInterval(id)
}
}
}
}, 1_000)
}, data.duration + 500)
}
})
cb('audio-received')
})
this.socket.on(LEON_EVENTS.error, (data) => {
console.error('Leon client interface error:', data)
})
if (this.history !== null) {
this.parsedHistory = JSON.parse(this.history)
}
}
send(keyword) {
if (keyword === 'utterance') {
return this.sendUtterance(this._input.value)
}
return false
}
sendUtterance(value, options = {}) {
if (this._isLeonGeneratingAnswer) {
return false
}
const trimmedValue = String(value || '').trim()
if (trimmedValue === '') {
return false
}
const sentAt =
typeof options.sentAt === 'number' ? options.sentAt : Date.now()
this.socket.emit(LEON_EVENTS.utterance, {
value: trimmedValue,
sentAt,
sessionId: this.activeSessionId,
...(options.commandContext
? { commandContext: options.commandContext }
: {})
})
this.chatbot.sendTo('leon', trimmedValue, sentAt)
this.chatbot.scrollDown({ force: true })
this.save(trimmedValue)
return true
}
save(value = this._input.value) {
let val = value
if (localStorage.getItem('history') === null) {
localStorage.setItem('history', JSON.stringify([]))
this.parsedHistory = JSON.parse(localStorage.getItem('history'))
} else if (this.parsedHistory.length >= 32) {
this.parsedHistory.shift()
}
if (val[0] === ' ') {
val = val.substr(1, val.length - 1)
}
if (this.parsedHistory[this.parsedHistory.length - 1] !== val) {
this.parsedHistory.push(val)
localStorage.setItem('history', JSON.stringify(this.parsedHistory))
}
this._input.value = ''
setTimeout(() => {
// Remove the last character to avoid the space
this._input.value = this._input.value.slice(0, -1)
}, 0)
}
enableVoiceMode() {
if (!this._isVoiceModeEnabled) {
this._isVoiceModeEnabled = true
const body = document.querySelector('body')
if (!body.classList.contains('voice-mode-enabled')) {
body.classList.add('voice-mode-enabled')
const voiceOverlayTransitor = document.createElement('div')
voiceOverlayTransitor.id = 'voice-overlay-transitor'
body.appendChild(voiceOverlayTransitor)
voiceOverlayTransitor.addEventListener('animationend', () => {
voiceOverlayTransitor.removeEventListener('animationend', () => {})
voiceOverlayTransitor.remove()
})
}
}
}
disableVoiceMode() {
if (this._isVoiceModeEnabled) {
this._isVoiceModeEnabled = false
const body = document.querySelector('body')
const voiceContainer = document.querySelector('#voice-container')
if (voiceContainer) {
voiceContainer.style.animation = 'none'
voiceContainer.style.animation = null
}
if (body.classList.contains('voice-mode-enabled')) {
body.classList.remove('voice-mode-enabled')
}
}
}
}
+22
View File
@@ -0,0 +1,22 @@
export const INIT_MESSAGES = [
[
'Hi, I\'m Leon, your open-source personal assistant. I\'m still evolving, but I\'m here to help.'
],
[
`Want to follow the project?
- Regular progress updates: https://x.com/grenlouis
- Blog posts: https://blog.getleon.ai/
- Email updates: https://leonai.substack.com/subscribe`
],
[
`Come hang out on Discord: https://discord.gg/MNQqqKg
That's where people will help shape the ecosystem and build what comes next.`
],
[
'Leon is built independently in spare time. If you want to help accelerate development, you can support the project here: http://sponsor.getleon.ai/'
]
]
export const ASR_DISABLED_MESSAGE =
'Voice mode is not enabled yet. Run /voice setup from the chat, wait for the resources to install, then restart Leon by using /restart.'
+386
View File
@@ -0,0 +1,386 @@
import axios from 'axios'
const AUTOCOMPLETE_DELAY_MS = 80
const CLOSE_DELAY_MS = 120
const DROPDOWN_MARGIN_PX = 8
const MINIMUM_DROPDOWN_HEIGHT_PX = 196
const MAXIMUM_DROPDOWN_HEIGHT_PX = 280
const FILE_SYSTEM_TRIGGER = '@'
const FOLDER_TYPE = 'folder'
const DEFAULT_FILE_ICON_NAME = 'file-line'
const DEFAULT_FOLDER_ICON_NAME = 'folder-3-line'
const NAVIGATION_DIRECTIONS = {
next: 1,
previous: -1
}
function isWhitespace(character) {
return character.trim() === ''
}
function findPathToken(input) {
const selectionStart = input.selectionStart ?? input.value.length
let tokenStart = selectionStart
while (
tokenStart > 0 &&
!isWhitespace(input.value.charAt(tokenStart - 1))
) {
tokenStart -= 1
}
if (input.value.charAt(tokenStart) !== FILE_SYSTEM_TRIGGER) {
return null
}
return {
start: tokenStart,
end: selectionStart,
value: input.value.slice(tokenStart, selectionStart)
}
}
export default class FileSystemAutocomplete {
constructor({ serverUrl, input = null, onValueChange = null }) {
this.serverUrl = serverUrl
this.input = null
this.onValueChange = onValueChange
this.dropdown = document.createElement('div')
this.dropdown.className = 'file-system-autocomplete file-system-autocomplete--hidden'
this.entries = []
this.selectedEntryIndex = -1
this.token = null
this.isOpen = false
this.requestCounter = 0
this.autocompleteTimeout = null
this.closeTimeout = null
this.shouldScrollSelectedEntry = false
this.handleInput = this.handleInput.bind(this)
this.handleKeyDown = this.handleKeyDown.bind(this)
this.handleFocus = this.handleFocus.bind(this)
this.handleClick = this.handleClick.bind(this)
this.handleBlur = this.handleBlur.bind(this)
this.handleWindowChange = this.handleWindowChange.bind(this)
document.body.appendChild(this.dropdown)
if (input) {
this.attach(input)
}
}
attach(input) {
if (this.input === input) {
return
}
window.clearTimeout(this.closeTimeout)
if (this.input) {
this.removeInputListeners()
}
this.input = input
this.input.addEventListener('input', this.handleInput)
this.input.addEventListener('keydown', this.handleKeyDown)
this.input.addEventListener('focus', this.handleFocus)
this.input.addEventListener('click', this.handleClick)
this.input.addEventListener('blur', this.handleBlur)
window.addEventListener('resize', this.handleWindowChange)
window.addEventListener('scroll', this.handleWindowChange, true)
}
removeInputListeners() {
if (!this.input) {
return
}
this.input.removeEventListener('input', this.handleInput)
this.input.removeEventListener('keydown', this.handleKeyDown)
this.input.removeEventListener('focus', this.handleFocus)
this.input.removeEventListener('click', this.handleClick)
this.input.removeEventListener('blur', this.handleBlur)
window.removeEventListener('resize', this.handleWindowChange)
window.removeEventListener('scroll', this.handleWindowChange, true)
this.input = null
}
detach() {
this.removeInputListeners()
this.close()
}
handleInput() {
window.clearTimeout(this.closeTimeout)
this.queueAutocomplete()
}
handleFocus() {
window.clearTimeout(this.closeTimeout)
this.queueAutocomplete()
}
handleClick() {
this.queueAutocomplete()
}
handleBlur() {
this.queueClose()
}
queueClose() {
window.clearTimeout(this.closeTimeout)
this.closeTimeout = window.setTimeout(() => {
this.close()
}, CLOSE_DELAY_MS)
}
handleWindowChange() {
if (this.isOpen) {
this.positionDropdown()
}
}
handleKeyDown(event) {
if (!this.isOpen) {
return
}
if (event.key === 'Escape') {
event.preventDefault()
event.stopImmediatePropagation()
this.close()
return
}
if (event.key === 'ArrowDown') {
event.preventDefault()
event.stopImmediatePropagation()
this.moveSelection(NAVIGATION_DIRECTIONS.next)
return
}
if (event.key === 'ArrowUp') {
event.preventDefault()
event.stopImmediatePropagation()
this.moveSelection(NAVIGATION_DIRECTIONS.previous)
return
}
if (event.key === 'Tab' || event.key === 'Enter') {
const selectedEntry = this.entries[this.selectedEntryIndex]
if (selectedEntry) {
event.preventDefault()
event.stopImmediatePropagation()
this.applyEntry(selectedEntry)
}
}
}
queueAutocomplete() {
window.clearTimeout(this.autocompleteTimeout)
this.autocompleteTimeout = window.setTimeout(() => {
void this.fetchAutocomplete()
}, AUTOCOMPLETE_DELAY_MS)
}
async fetchAutocomplete() {
if (!this.input) {
this.close()
return
}
if (document.activeElement !== this.input) {
this.queueClose()
return
}
const token = findPathToken(this.input)
if (!token) {
this.close()
return
}
const requestId = this.requestCounter + 1
this.requestCounter = requestId
this.token = token
try {
const response = await axios.post(
`${this.serverUrl}/api/v1/file-system/list`,
{
value: token.value
}
)
if (requestId !== this.requestCounter) {
return
}
this.entries = response.data.entries || []
this.selectedEntryIndex = this.entries.length > 0 ? 0 : -1
this.render()
} catch {
if (requestId !== this.requestCounter) {
return
}
this.entries = []
this.selectedEntryIndex = -1
this.render()
}
}
render() {
if (!this.input || !this.token) {
this.close()
return
}
this.dropdown.innerHTML = ''
if (this.entries.length === 0) {
const emptyElement = document.createElement('div')
emptyElement.className = 'file-system-autocomplete__empty'
emptyElement.textContent = 'No matching file system entry.'
this.dropdown.appendChild(emptyElement)
} else {
this.entries.forEach((entry, index) => {
const item = document.createElement('button')
const icon = document.createElement('i')
const label = document.createElement('span')
item.type = 'button'
item.className = `file-system-autocomplete__item${
index === this.selectedEntryIndex
? ' file-system-autocomplete__item--selected'
: ''
}`
icon.className = `ri-${
entry.iconName ||
(entry.type === FOLDER_TYPE
? DEFAULT_FOLDER_ICON_NAME
: DEFAULT_FILE_ICON_NAME)
}`
label.className = 'file-system-autocomplete__label'
label.textContent = entry.value
item.addEventListener('mousedown', (event) => {
event.preventDefault()
})
item.addEventListener('click', () => {
this.applyEntry(entry)
})
item.appendChild(icon)
item.appendChild(label)
this.dropdown.appendChild(item)
})
}
this.isOpen = true
this.dropdown.classList.remove('file-system-autocomplete--hidden')
this.positionDropdown()
if (this.shouldScrollSelectedEntry) {
this.shouldScrollSelectedEntry = false
this.scrollSelectedEntryIntoView()
}
}
positionDropdown() {
const inputRect = this.input.getBoundingClientRect()
const spaceBelow = window.innerHeight - inputRect.bottom
const spaceAbove = inputRect.top
const shouldOpenAbove =
spaceBelow < MINIMUM_DROPDOWN_HEIGHT_PX && spaceAbove > spaceBelow
const availableHeight =
(shouldOpenAbove ? spaceAbove : spaceBelow) - DROPDOWN_MARGIN_PX * 2
const maxHeight = Math.min(
MAXIMUM_DROPDOWN_HEIGHT_PX,
Math.max(MINIMUM_DROPDOWN_HEIGHT_PX, availableHeight)
)
this.dropdown.style.left = `${inputRect.left}px`
this.dropdown.style.width = `${inputRect.width}px`
this.dropdown.style.maxHeight = `${maxHeight}px`
if (shouldOpenAbove) {
this.dropdown.style.top = ''
this.dropdown.style.bottom = `${
window.innerHeight - inputRect.top + DROPDOWN_MARGIN_PX
}px`
} else {
this.dropdown.style.top = `${inputRect.bottom + DROPDOWN_MARGIN_PX}px`
this.dropdown.style.bottom = ''
}
}
moveSelection(direction) {
if (this.entries.length === 0) {
return
}
this.selectedEntryIndex =
(this.selectedEntryIndex + direction + this.entries.length) %
this.entries.length
this.shouldScrollSelectedEntry = true
this.render()
}
scrollSelectedEntryIntoView() {
const selectedEntryElement = this.dropdown.querySelector(
'.file-system-autocomplete__item--selected'
)
if (!selectedEntryElement) {
return
}
selectedEntryElement.scrollIntoView({
block: 'nearest'
})
}
applyEntry(entry) {
if (!this.input || !this.token) {
return
}
const completedValue = entry.absolutePath || entry.value
const nextCharacter = this.input.value.charAt(this.token.end)
const shouldAddTrailingWhitespace =
nextCharacter === '' || !isWhitespace(nextCharacter)
const insertedValue = `${completedValue}${
shouldAddTrailingWhitespace ? ' ' : ''
}`
const nextValue = `${this.input.value.slice(0, this.token.start)}${
insertedValue
}${this.input.value.slice(this.token.end)}`
const nextCursorPosition = this.token.start + insertedValue.length
this.input.value = nextValue
this.input.setSelectionRange(nextCursorPosition, nextCursorPosition)
this.input.dispatchEvent(new Event('input', { bubbles: true }))
if (this.onValueChange) {
this.onValueChange(nextValue)
window.requestAnimationFrame(() => {
this.input?.setSelectionRange(nextCursorPosition, nextCursorPosition)
})
}
this.close()
}
close() {
this.isOpen = false
this.entries = []
this.selectedEntryIndex = -1
this.token = null
this.dropdown.classList.add('file-system-autocomplete--hidden')
}
}
+252
View File
@@ -0,0 +1,252 @@
import { useEffect, useState, useRef } from 'react'
import { createRoot } from 'react-dom/client'
import {
WidgetWrapper,
Text,
Icon,
Flexbox,
List,
ListHeader,
ListItem,
Loader
} from '@aurora'
const container = document.querySelector('#init')
const root = createRoot(container)
const LLAMA_SERVER_BOOT_STATUS = 'llamaServerBoot'
const INIT_ERROR_STATUS = 'error'
const INIT_ERROR_DISMISS_SECONDS = 10
const INIT_ERROR_DISMISS_INTERVAL_MS = 1_000
function Item({ children, status }) {
if (status === 'error') {
return <ErrorListItem>{children}</ErrorListItem>
}
if (status === 'warning') {
return <WarningListItem>{children}</WarningListItem>
}
if (status === 'success') {
return <SuccessListItem>{children}</SuccessListItem>
}
if (status === 'loading') {
return <LoadingListItem>{children}</LoadingListItem>
}
return <ListItem>{children}</ListItem>
}
function LoadingListItem({ children }) {
return (
<ListItem>
<Flexbox flexDirection="row" alignItems="center" gap="sm">
<Loader size="sm" />
<Text>{children}</Text>
</Flexbox>
</ListItem>
)
}
function ErrorListItem({ children }) {
return (
<ListItem>
<Flexbox flexDirection="row" alignItems="center" gap="sm">
<Icon
iconName="close"
size="sm"
type="fill"
bgShape="circle"
color="red"
bgColor="transparent-red"
/>
<Text>{children}</Text>
</Flexbox>
</ListItem>
)
}
function WarningListItem({ children }) {
return (
<ListItem>
<Flexbox flexDirection="row" alignItems="center" gap="sm">
<Icon
iconName="alert"
size="sm"
type="fill"
bgShape="circle"
color="yellow"
bgColor="transparent-yellow"
/>
<Text>{children}</Text>
</Flexbox>
</ListItem>
)
}
function SuccessListItem({ children }) {
return (
<ListItem>
<Flexbox flexDirection="row" alignItems="center" gap="sm">
<Icon
iconName="check"
size="sm"
type="fill"
bgShape="circle"
color="green"
bgColor="transparent-green"
/>
<Text>{children}</Text>
</Flexbox>
</ListItem>
)
}
function Init() {
const parentRef = useRef(null)
const [config, setConfig] = useState(() => ({ ...window.leonConfigInfo }))
const usesLlamaCPP =
config.llm?.workflowProvider === 'llamacpp' ||
config.llm?.agentProvider === 'llamacpp'
const [initErrorCountdown, setInitErrorCountdown] = useState(null)
const [areInitErrorsDismissed, setAreInitErrorsDismissed] = useState(false)
const [statusMap, setStatusMap] = useState({
clientCoreServerHandshake: 'loading',
tcpServerBoot:
window.leonConfigInfo?.tcpServer?.enabled === false ? 'success' : 'loading',
[LLAMA_SERVER_BOOT_STATUS]:
window.leonConfigInfo?.llm?.workflowProvider === 'llamacpp' ||
window.leonConfigInfo?.llm?.agentProvider === 'llamacpp'
? 'loading'
: 'success'
})
const hasInitError = Object.values(statusMap).some(
(status) => status === INIT_ERROR_STATUS
)
useEffect(() => {
setTimeout(() => {
if (parentRef.current) {
parentRef.current.classList.remove('not-initialized')
}
}, 250)
function handleStatusChange(event) {
const { statusName, statusType } = event.detail
if (statusType === INIT_ERROR_STATUS) {
setAreInitErrorsDismissed(false)
}
setStatusMap((prev) => ({ ...prev, [statusName]: statusType }))
}
window.leonInitStatusEvent.addEventListener(
'initStatusChange',
handleStatusChange
)
return () =>
window.leonInitStatusEvent.removeEventListener(
'initStatusChange',
handleStatusChange
)
}, [])
useEffect(() => {
if (!hasInitError || areInitErrorsDismissed) {
setInitErrorCountdown(null)
return
}
let secondsLeft = INIT_ERROR_DISMISS_SECONDS
setInitErrorCountdown(secondsLeft)
const interval = setInterval(() => {
secondsLeft -= 1
setInitErrorCountdown(secondsLeft)
if (secondsLeft <= 0) {
clearInterval(interval)
setAreInitErrorsDismissed(true)
}
}, INIT_ERROR_DISMISS_INTERVAL_MS)
return () => clearInterval(interval)
}, [hasInitError, areInitErrorsDismissed])
const statuses = []
for (let key of Object.keys(statusMap)) {
if (key === 'tcpServerBoot' && config.tcpServer?.enabled === false) {
statuses.push('success')
} else if (statusMap[key] === INIT_ERROR_STATUS && areInitErrorsDismissed) {
statuses.push('success')
} else if (
key === LLAMA_SERVER_BOOT_STATUS &&
!usesLlamaCPP
) {
statuses.push('success')
} else {
statuses.push(statusMap[key])
}
}
const areAllStatusesSuccess = statuses.every((status) => status === 'success')
const getInitMessage = (status, defaultMessage) => {
if (status === INIT_ERROR_STATUS && initErrorCountdown !== null) {
return `An error occurred during the initialization. This message will disappear in ${initErrorCountdown} seconds`
}
return defaultMessage
}
useEffect(() => {
if (window.leonConfigInfo) {
setConfig({ ...window.leonConfigInfo })
}
}, [window.leonConfigInfo])
return (
<div
style={{
position: 'fixed',
width: '100vw',
height: '100vh',
zIndex: 9999,
backgroundColor: 'var(--black-color)'
}}
ref={parentRef}
className={areAllStatusesSuccess ? 'initialized' : 'not-initialized'}
>
<div
style={{
position: 'absolute',
top: '33%',
left: '50%',
transform: 'translate(-50%, -50%)'
}}
>
<WidgetWrapper noPadding>
<List>
<ListHeader>Leon is getting ready...</ListHeader>
<Item status={statusMap.clientCoreServerHandshake}>
{getInitMessage(
statusMap.clientCoreServerHandshake,
'Client and core server handshaked'
)}
</Item>
{config.tcpServer?.enabled !== false && (
<Item status={statusMap.tcpServerBoot}>
{getInitMessage(statusMap.tcpServerBoot, 'TCP server booted')}
</Item>
)}
{usesLlamaCPP && (
<Item status={statusMap[LLAMA_SERVER_BOOT_STATUS]}>
{getInitMessage(
statusMap[LLAMA_SERVER_BOOT_STATUS],
'llama-server booted'
)}
</Item>
)}
</List>
</WidgetWrapper>
</div>
</div>
)
}
root.render(<Init />)
@@ -1,9 +1,12 @@
'use strict'
const listener = {}
const listener = { }
listener.listening = (stream, minDecibels, maxBlankTime,
cbOnStart, cbOnEnd) => {
listener.listening = (
stream,
minDecibels,
maxBlankTime,
cbOnStart,
cbOnEnd
) => {
const ctx = new AudioContext()
const analyser = ctx.createAnalyser()
const streamNode = ctx.createMediaStreamSource(stream)
@@ -19,7 +22,7 @@ listener.listening = (stream, minDecibels, maxBlankTime,
analyser.getByteFrequencyData(data)
if (data.some(v => v)) {
if (data.some((v) => v)) {
if (triggered) {
triggered = false
@@ -28,7 +31,7 @@ listener.listening = (stream, minDecibels, maxBlankTime,
silenceStart = time
}
if (!triggered && (time - silenceStart) > maxBlankTime) {
if (!triggered && time - silenceStart > maxBlankTime) {
cbOnEnd()
triggered = true
+216
View File
@@ -0,0 +1,216 @@
import axios from 'axios'
import '@aurora/style.css'
window.leonInitStatusEvent = new EventTarget()
import './init'
import Client from './client'
import { BuiltInCommands } from './built-in-commands'
import FileSystemAutocomplete from './file-system-autocomplete'
import SessionsPanel from './sessions'
import { ensureProfileAuthentication } from './profile-auth'
// import Recorder from './recorder'
// import listener from './listener'
import { onkeydownstartrecording, onkeydowninput } from './onkeydown'
const config = {
app: 'webapp',
server_host: import.meta.env.VITE_LEON_HOST,
server_port: import.meta.env.VITE_LEON_PORT,
min_decibels: -40, // Noise detection sensitivity
max_blank_time: 1_000 // Maximum time to consider a blank (ms)
}
const serverUrl =
import.meta.env.VITE_LEON_NODE_ENV === 'production'
? ''
: `${config.server_host}:${config.server_port}`
document.addEventListener('DOMContentLoaded', async () => {
try {
await ensureProfileAuthentication(serverUrl)
const [response, sessionsResponse] = await Promise.all([
axios.get(`${serverUrl}/api/v1/info`),
axios.get(`${serverUrl}/api/v1/sessions`)
])
const input = document.querySelector('#utterance')
const mic = document.querySelector('#mic-button')
const v = document.querySelector('#version small')
const infoButton = document.querySelector('#info')
const client = new Client(config.app, serverUrl, input, {
activeSessionId: sessionsResponse.data.active_session_id
})
const sessionsPanel = new SessionsPanel({
serverUrl,
socket: client.socket,
activeSessionId: sessionsResponse.data.active_session_id,
initialPayload: sessionsResponse.data,
onSelect: (sessionId) => client.setActiveSession(sessionId)
})
const fileSystemAutocomplete = new FileSystemAutocomplete({
serverUrl,
input
})
const builtInCommands = new BuiltInCommands({
serverUrl,
input,
getActiveSessionId: () => sessionsPanel.getActiveSessionId(),
onCommandExecuted: (commandInput) => {
if (commandInput.trim().startsWith('/session')) {
void sessionsPanel.refresh()
}
},
onSubmitToChat: (clientAction) => {
return client.sendUtterance(clientAction.utterance, {
commandContext: {
forcedRoutingMode: clientAction.command_context?.forced_routing_mode,
forcedSkillName: clientAction.command_context?.forced_skill_name,
forcedToolName: clientAction.command_context?.forced_tool_name
}
})
}
})
// let rec = {}
// let chunks = []
window.leonConfigInfo = response.data
const infoKeys = [
'timeZone',
'telemetry',
'gpu',
'graphicsComputeAPI',
'totalVRAM',
'freeVRAM',
'usedVRAM',
'llm',
'asr',
'tts',
'mood',
'version'
]
const infoToDisplay = {}
infoKeys.forEach((key) => {
infoToDisplay[key] = window.leonConfigInfo[key]
})
v.textContent += window.leonConfigInfo.version
client.updateMood(window.leonConfigInfo.mood)
client.setSessionPanel(sessionsPanel)
sessionsPanel.init()
client.init()
fileSystemAutocomplete.attach(input)
builtInCommands.init()
infoButton.addEventListener('click', () => {
alert(JSON.stringify(infoToDisplay, null, 2))
})
/*if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
navigator.mediaDevices
.getUserMedia({ audio: true })
.then((stream) => {
if (MediaRecorder) {
rec = new Recorder(stream, mic, window.leonConfigInfo)
client.recorder = rec
rec.ondataavailable((e) => {
chunks.push(e.data)
})
rec.onstart(() => {
/!* *!/
})
rec.onstop(() => {
const blob = new Blob(chunks)
chunks = []
rec.enabled = false
// Ensure there are some data
if (blob.size >= 1_000) {
client.socket.emit('recognize', blob)
}
})
listener.listening(
stream,
config.min_decibels,
config.max_blank_time,
() => {
// Noise detected
rec.noiseDetected = true
},
() => {
// Noise ended
rec.noiseDetected = false
if (rec.enabled && !rec.hotwordTriggered) {
rec.stop()
rec.enabled = false
rec.hotwordTriggered = false
rec.countSilenceAfterTalk = 0
}
}
)
client.socket.on('enable-record', () => {
rec.hotwordTriggered = true
rec.start()
setTimeout(() => {
rec.hotwordTriggered = false
}, config.max_blank_time)
rec.enabled = true
})
} else {
console.error('MediaRecorder is not supported on your browser.')
}
})
.catch((err) => {
console.error(
'MediaDevices.getUserMedia() threw the following error:',
err
)
})
} else {
console.error(
'MediaDevices.getUserMedia() is not supported on your browser.'
)
}*/
document.addEventListener('keydown', (e) => {
onkeydownstartrecording(e, () => {
client.asrStartRecording()
/*if (rec.enabled === false) {
input.value = ''
rec.start()
rec.enabled = true
} else {
rec.stop()
rec.enabled = false
}*/
})
})
input.addEventListener('keydown', (e) => {
onkeydowninput(e, client)
})
mic.addEventListener('click', (e) => {
e.preventDefault()
client.asrStartRecording()
/*if (rec.enabled === false) {
rec.start()
rec.enabled = true
} else {
rec.stop()
rec.enabled = false
}*/
})
} catch (e) {
alert(`Error: ${e.message}; ${JSON.stringify(e.response?.data)}`)
console.error(e)
}
})
+38
View File
@@ -0,0 +1,38 @@
let index = -1
let parsedHistory = null
const onkeydowninput = (e, client) => {
const key = e.which || e.keyCode
if (localStorage.getItem('history') !== null && (key === 38 || key === 40)) {
parsedHistory = JSON.parse(localStorage.getItem('history')).reverse()
}
if (key === 13 && !e.shiftKey) {
if (client.send('utterance')) {
parsedHistory = JSON.parse(localStorage.getItem('history')).reverse()
index = -1
}
} else if (localStorage.getItem('history') !== null) {
if (e.shiftKey) {
if (key === 38 && index < parsedHistory.length - 1) {
index += 1
client.input = parsedHistory[index]
} else if (key === 40 && index - 1 >= 0) {
index -= 1
client.input = parsedHistory[index]
} else if (key === 40 && index - 1 < 0) {
client.input = ''
index = -1
}
}
}
}
const onkeydownstartrecording = (e, cb) => {
if ((e.metaKey || e.altKey) && e.key === 'c') {
cb()
}
}
export { onkeydowninput, onkeydownstartrecording }
+74
View File
@@ -0,0 +1,74 @@
import axios from 'axios'
const PROFILE_AUTH_API_PATH = '/api/v1/profile-auth'
function createElement(tagName, options = {}) {
const element = document.createElement(tagName)
if (options.className) {
element.className = options.className
}
if (options.text) {
element.textContent = options.text
}
return element
}
function requestProfileToken(serverUrl) {
return new Promise((resolve) => {
const overlay = createElement('div', { className: 'profile-auth' })
const form = createElement('form', { className: 'profile-auth__form' })
const title = createElement('h1', { text: 'Connect to Leon' })
const description = createElement('p', {
text: 'Enter the profile token generated by your Leon instance.'
})
const input = createElement('input')
const button = createElement('button', { text: 'Connect' })
const error = createElement('p', { className: 'profile-auth__error' })
input.type = 'password'
input.name = 'profile-token'
input.placeholder = 'profile:token'
input.autocomplete = 'current-password'
input.required = true
button.type = 'submit'
form.append(title, description, input, button, error)
overlay.append(form)
document.body.append(overlay)
input.focus()
form.addEventListener('submit', async (event) => {
event.preventDefault()
button.disabled = true
error.textContent = ''
try {
await axios.post(
`${serverUrl}${PROFILE_AUTH_API_PATH}`,
{ token: input.value.trim() },
{ withCredentials: true }
)
overlay.remove()
resolve()
} catch (requestError) {
error.textContent =
requestError.response?.data?.message ||
'Unable to authenticate this profile.'
button.disabled = false
input.select()
}
})
})
}
/** Ensure the browser has a profile cookie before initializing the Leon app. */
export async function ensureProfileAuthentication(serverUrl) {
axios.defaults.withCredentials = true
const response = await axios.get(`${serverUrl}${PROFILE_AUTH_API_PATH}`)
if (!response.data.authenticated) {
await requestProfileToken(serverUrl)
}
}
@@ -1,36 +1,41 @@
'use strict'
import on from '../sounds/on.mp3'
import off from '../sounds/off.mp3'
export default class Recorder {
constructor (stream, el, info) {
constructor(stream, el, info) {
this.recorder = new MediaRecorder(stream, { audioBitsPerSecond: 16000 })
this.el = el
this.audioOn = new Audio('../sounds/on.mp3')
this.audioOff = new Audio('../sounds/off.mp3')
this.audioOn = new Audio(on)
this.audioOff = new Audio(off)
this.playSound = true
this.info = info
this.enabled = false
this.hotwordTriggered = false
this.noiseDetected = false
this.countSilenceAfterTalk = 0
}
start (playSound = true) {
if (this.info.stt.enabled === false) {
console.warn('Speech-to-text disabled')
start(playSound = true) {
if (this.info.asr.enabled === false) {
console.warn('ASR disabled')
} else {
this.playSound = playSound
this.recorder.start(playSound)
}
}
stop (playSound = true) {
if (this.info.stt.enabled === false) {
console.warn('Speech-to-text disabled')
stop(playSound = true) {
if (this.info.asr.enabled === false) {
console.warn('ASR disabled')
} else {
this.playSound = playSound
this.recorder.stop(playSound)
}
}
onstart (cb) {
onstart(cb) {
this.recorder.onstart = (e) => {
if (this.playSound === true) {
if (this.playSound) {
this.audioOn.play()
}
this.el.classList.add('enabled')
@@ -39,9 +44,9 @@ export default class Recorder {
}
}
onstop (cb) {
onstop(cb) {
this.recorder.onstop = (e) => {
if (this.playSound === true) {
if (this.playSound) {
this.audioOff.play()
}
this.el.classList.remove('enabled')
@@ -50,7 +55,7 @@ export default class Recorder {
}
}
ondataavailable (cb) {
ondataavailable(cb) {
this.recorder.ondataavailable = (e) => {
cb(e)
}
+56
View File
@@ -0,0 +1,56 @@
import { createElement } from 'react'
import * as auroraComponents from '@aurora'
import * as customAuroraComponents from '../custom-aurora-components'
export default function renderAuroraComponent(
socket,
component,
supportedEvents
) {
if (component) {
// `import-x/namespace` cannot statically validate dynamic component lookups.
// eslint-disable-next-line import-x/namespace
let reactComponent = auroraComponents[component.component]
/**
* Find custom component if a former component is not found
*/
if (!reactComponent) {
// eslint-disable-next-line import-x/namespace
reactComponent = customAuroraComponents[component.component]
}
if (!reactComponent) {
console.error(`Component ${component.component} not found`)
return null
}
// Check if the browsed component has a supported event and bind it
if (reactComponent && Array.isArray(component.events)) {
component.events.forEach((event) => {
if (supportedEvents.includes(event.type)) {
component.props[event.type] = (data) => {
const { method } = event
socket.emit('widget-event', { method, data })
}
}
})
}
// When children is a component, then wrap it in an array to render properly
const isComponent = !!component.props?.children?.component
if (isComponent) {
component.props.children = [component.props.children]
}
if (component.props?.children && Array.isArray(component.props.children)) {
component.props.children = component.props.children.map((child) => {
return renderAuroraComponent(socket, child, supportedEvents)
})
}
return createElement(reactComponent, component.props)
}
}
+288
View File
@@ -0,0 +1,288 @@
import axios from 'axios'
const DAY_MS = 24 * 60 * 60 * 1_000
const GROUP_DATE_FORMATTER = new Intl.DateTimeFormat(undefined, {
month: 'long',
day: 'numeric',
year: 'numeric'
})
function createElement(tagName, className, textContent = '') {
const element = document.createElement(tagName)
if (className) {
element.className = className
}
if (textContent) {
element.textContent = textContent
}
return element
}
function getDayKey(timestamp) {
const date = new Date(timestamp)
return new Date(
date.getFullYear(),
date.getMonth(),
date.getDate()
).getTime()
}
function getGroupLabel(timestamp) {
const now = Date.now()
const todayKey = getDayKey(now)
const yesterdayKey = todayKey - DAY_MS
const itemKey = getDayKey(timestamp)
if (itemKey === todayKey) {
return 'Today'
}
if (itemKey === yesterdayKey) {
return 'Yesterday'
}
return GROUP_DATE_FORMATTER.format(new Date(timestamp))
}
export default class SessionsPanel {
constructor({
serverUrl,
socket,
activeSessionId,
initialPayload,
onSelect
}) {
this.serverUrl = serverUrl
this.socket = socket
this.activeSessionId = activeSessionId
this.sessions = initialPayload?.sessions || []
this.supportedProviders = initialPayload?.supported_providers || []
this.currentModelTarget = initialPayload?.current_model_target || ''
this.onSelect = onSelect
this.container = document.querySelector('#sessions-panel')
this.list = document.querySelector('#sessions-list')
this.newButton = document.querySelector('#new-session')
}
init() {
this.newButton.addEventListener('click', () => {
void this.createSession()
})
this.list.addEventListener('click', (event) => {
void this.handleClick(event)
})
this.render()
}
getActiveSessionId() {
return this.activeSessionId
}
async refresh() {
const previousActiveSessionId = this.activeSessionId
const response = await axios.get(`${this.serverUrl}/api/v1/sessions`)
this.applyPayload(response.data)
if (
response.data.active_session_id &&
response.data.active_session_id !== previousActiveSessionId
) {
await this.onSelect?.(response.data.active_session_id)
}
}
async createSession() {
const response = await axios.post(`${this.serverUrl}/api/v1/sessions`)
this.applyPayload(response.data)
await this.selectSession(response.data.session.id)
}
async selectSession(sessionId) {
this.activeSessionId = sessionId
this.socket.emit('session-change', sessionId)
await this.onSelect?.(sessionId)
await axios.patch(`${this.serverUrl}/api/v1/sessions/${sessionId}`, {
is_active: true
})
await this.refresh()
}
async updateSession(sessionId, payload) {
const response = await axios.patch(
`${this.serverUrl}/api/v1/sessions/${sessionId}`,
payload
)
this.applyPayload(response.data)
}
async deleteSession(sessionId) {
const wasActiveSession = this.activeSessionId === sessionId
const response = await axios.delete(
`${this.serverUrl}/api/v1/sessions/${sessionId}`
)
this.applyPayload(response.data)
if (wasActiveSession) {
await this.selectSession(response.data.active_session_id)
}
}
async handleClick(event) {
const button = event.target.closest('button')
const item = event.target.closest('.session-item')
if (!item) {
return
}
const sessionId = item.getAttribute('data-session-id')
if (!button) {
await this.selectSession(sessionId)
return
}
const action = button.getAttribute('data-action')
if (action === 'rename') {
const currentTitle = item.getAttribute('data-session-title') || ''
const title = window.prompt('Session title', currentTitle)
if (title && title.trim()) {
await this.updateSession(sessionId, { title: title.trim() })
}
} else if (action === 'pin') {
await this.updateSession(sessionId, {
is_pinned: button.getAttribute('aria-pressed') !== 'true'
})
} else if (action === 'delete') {
await this.deleteSession(sessionId)
} else if (action === 'model') {
await this.updateSessionModel(sessionId)
}
}
async updateSessionModel(sessionId) {
const provider = window.prompt(
`Provider (${this.supportedProviders.join(', ')})`
)
if (!provider) {
return
}
const model = window.prompt('Model')
if (!model) {
return
}
await this.updateSession(sessionId, {
provider: provider.trim(),
model: model.trim()
})
}
applyPayload(payload) {
this.sessions = payload.sessions || []
this.supportedProviders = payload.supported_providers || []
this.currentModelTarget = payload.current_model_target || ''
this.activeSessionId = payload.active_session_id || this.activeSessionId
this.render()
}
render() {
this.list.innerHTML = ''
const pinnedSessions = this.sessions.filter((session) => session.isPinned)
const unpinnedSessions = this.sessions.filter((session) => !session.isPinned)
if (pinnedSessions.length > 0) {
this.renderGroup('Pinned', pinnedSessions)
}
const groupedSessions = new Map()
for (const session of unpinnedSessions) {
const timestamp = session.lastMessageAt || session.updatedAt
const groupLabel = getGroupLabel(timestamp)
const group = groupedSessions.get(groupLabel) || []
group.push(session)
groupedSessions.set(groupLabel, group)
}
for (const [label, sessions] of groupedSessions.entries()) {
this.renderGroup(label, sessions)
}
}
renderGroup(label, sessions) {
const group = createElement('section', 'session-group')
const heading = createElement('h2', 'session-group-title', label)
group.appendChild(heading)
for (const session of sessions) {
group.appendChild(this.createSessionItem(session))
}
this.list.appendChild(group)
}
createSessionItem(session) {
const item = createElement('article', 'session-item')
const title = createElement('div', 'session-title', session.title)
const meta = createElement(
'div',
'session-meta',
session.modelTarget || this.currentModelTarget || 'Default model'
)
const actions = createElement('div', 'session-actions')
item.setAttribute('data-session-id', session.id)
item.setAttribute('data-session-title', session.title)
if (session.id === this.activeSessionId) {
item.classList.add('session-item--active')
}
actions.appendChild(
this.createActionButton(
'pin',
session.isPinned ? 'ri-pushpin-fill' : 'ri-pushpin-line',
session.isPinned
)
)
actions.appendChild(this.createActionButton('rename', 'ri-edit-line'))
actions.appendChild(this.createActionButton('model', 'ri-brain-line'))
actions.appendChild(this.createActionButton('delete', 'ri-delete-bin-line'))
item.appendChild(title)
item.appendChild(meta)
item.appendChild(actions)
return item
}
createActionButton(action, iconClassName, isPressed = false) {
const button = createElement('button', 'session-action')
const icon = createElement('i', iconClassName)
button.type = 'button'
button.setAttribute('data-action', action)
button.setAttribute('aria-label', action)
button.setAttribute('aria-pressed', String(isPressed))
button.appendChild(icon)
return button
}
}
+43
View File
@@ -0,0 +1,43 @@
import { createElement } from 'react'
import { createRoot } from 'react-dom/client'
import { WidgetWrapper, List, ListHeader, ListItem } from '@aurora'
export default function handleSuggestions(data, chatbot, client) {
const container = document.createElement('div')
container.className = 'bubble-container leon'
chatbot.feed.appendChild(container)
const root = createRoot(container)
root.render(
createElement(WidgetWrapper, {
noPadding: true,
children: createElement(List, {
children: [
createElement(ListHeader, {
children: 'Suggestions'
}),
...data.map((suggestionText) => {
return createElement(ListItem, {
children: suggestionText,
name: 'suggestion',
value: suggestionText,
onClick: (suggestion) => {
const parent = container.parentNode
if (parent) {
parent.removeChild(container)
}
client.input.value = suggestion.value
client.send('utterance')
}
})
})
]
})
})
)
}
File diff suppressed because it is too large Load Diff
+74
View File
@@ -0,0 +1,74 @@
const STATUS = {
listening: 'Listening...',
processing: 'Processing...',
talking: 'Talking...',
idle: 'Idle'
}
export default class VoiceEnergy {
constructor(client) {
this.client = client
this.voiceEnergyContainerElement = document.querySelector(
'#voice-energy-container'
)
this.voiceOverlayElement = document.querySelector('#voice-overlay-bg')
this.statusElement = document.querySelector('#voice-status')
this._status = 'idle'
}
get status() {
return this._status
}
set status(newStatus) {
if (this._status !== newStatus) {
this._status = newStatus
if (this.statusElement) {
this.statusElement.textContent = STATUS[newStatus]
}
// Clean up speech text when listening
if (newStatus === 'listening' && this.client.voiceSpeechElement) {
this.client.voiceSpeechElement.textContent = ''
}
if (this.voiceEnergyContainerElement) {
this.voiceEnergyContainerElement.className = ''
this.voiceEnergyContainerElement.classList.add(newStatus)
}
}
}
init() {
if (this.voiceEnergyContainerElement) {
if (this.voiceOverlayElement) {
this.voiceOverlayElement.addEventListener('click', (e) => {
e.preventDefault()
this.client.disableVoiceMode()
})
}
const particles = new Set()
const particleColors = ['blue', 'pink']
for (let i = 0; i < 32; i += 1) {
const particle = document.createElement('div')
const randomColor = Math.floor(Math.random() * 2)
let random = Math.floor(Math.random() * 32)
while (particles.has(random)) {
random = Math.floor(Math.random() * 32)
}
particles.add(random)
particle.setAttribute('data-particle', String(random))
particle.classList.add('voice-particle', particleColors[randomColor])
particle.style.transform = `rotate(${
i * 11.25
}deg) translate(110px) rotate(-${i * 11.25}deg)`
this.voiceEnergyContainerElement.appendChild(particle)
}
}
}
}
+9
View File
@@ -0,0 +1,9 @@
{
"extends": "../tsconfig.json",
"compilerOptions": {
"jsx": "react-jsx",
"noEmit": true
},
"include": ["./src/**/*", "../aurora/src/**/*", "../aurora/global.d.ts"],
"exclude": ["./dist", "../node_modules"]
}
-3
View File
File diff suppressed because one or more lines are too long
-1
View File
File diff suppressed because one or more lines are too long
+143
View File
@@ -0,0 +1,143 @@
import dns from 'node:dns'
import fs from 'node:fs'
import { fileURLToPath } from 'node:url'
import dotenv from 'dotenv'
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import YAML from 'yaml'
import {
PROFILE_CONFIG_PATH,
PROFILE_DOT_ENV_PATH
} from '../server/src/leon-roots.ts'
const APP_DEV_SERVER_PORT = 5_173
const NODE_MODULES_PATH_SEGMENT = '/node_modules/'
const REACT_VENDOR_PACKAGES = ['react', 'react-dom', 'scheduler']
const REALTIME_VENDOR_PACKAGES = [
'socket.io-client',
'socket.io-parser',
'engine.io-client',
'engine.io-parser'
]
const UI_VENDOR_PACKAGE_PREFIXES = ['@ark-ui/', '@zag-js/', '@floating-ui/']
dotenv.config({ path: PROFILE_DOT_ENV_PATH })
dns.setDefaultResultOrder('verbatim')
function readAppLeonConfig() {
if (!fs.existsSync(PROFILE_CONFIG_PATH)) {
throw new Error(`Profile config file not found at "${PROFILE_CONFIG_PATH}".`)
}
const config = YAML.parse(fs.readFileSync(PROFILE_CONFIG_PATH, 'utf8'))
const server = config?.server
if (
!server ||
typeof server.host !== 'string' ||
!Number.isInteger(server.port)
) {
throw new Error(
`Profile config file "${PROFILE_CONFIG_PATH}" must define server.host and server.port.`
)
}
return {
host: server.host,
port: server.port
}
}
function normalizeModuleId(moduleId) {
return moduleId.replaceAll('\\', '/')
}
function isNodeModule(moduleId) {
return normalizeModuleId(moduleId).includes(NODE_MODULES_PATH_SEGMENT)
}
function includesVendorPackage(moduleId, packageName) {
return normalizeModuleId(moduleId).includes(
`${NODE_MODULES_PATH_SEGMENT}${packageName}/`
)
}
function includesVendorPackagePrefix(moduleId, packagePrefix) {
return normalizeModuleId(moduleId).includes(
`${NODE_MODULES_PATH_SEGMENT}${packagePrefix}`
)
}
// Map necessary Leon's env vars as Vite only expose VITE_*
const leonConfig = readAppLeonConfig()
process.env.VITE_LEON_NODE_ENV = process.env.LEON_NODE_ENV
process.env.VITE_LEON_HOST = leonConfig.host
process.env.VITE_LEON_PORT = String(leonConfig.port)
export default defineConfig({
root: 'app/src',
resolve: {
alias: [
{
find: '@aurora/style.css',
replacement: fileURLToPath(
new URL('../aurora/style.css', import.meta.url)
)
},
{
find: '@aurora',
replacement: fileURLToPath(
new URL('../aurora/src/index.ts', import.meta.url)
)
}
]
},
build: {
outDir: '../dist',
emptyOutDir: true,
rolldownOptions: {
output: {
codeSplitting: {
groups: [
{
name: 'react-vendor',
test: (moduleId) =>
REACT_VENDOR_PACKAGES.some((packageName) =>
includesVendorPackage(moduleId, packageName)
),
priority: 30
},
{
name: 'realtime-vendor',
test: (moduleId) =>
REALTIME_VENDOR_PACKAGES.some((packageName) =>
includesVendorPackage(moduleId, packageName)
),
priority: 20
},
{
name: 'ui-vendor',
test: (moduleId) =>
UI_VENDOR_PACKAGE_PREFIXES.some((packagePrefix) =>
includesVendorPackagePrefix(moduleId, packagePrefix)
),
priority: 10
},
{
name: 'vendor',
test: isNodeModule,
priority: 0
}
]
}
}
}
},
server: {
port: APP_DEV_SERVER_PORT
},
plugins: [react()]
})
+3
View File
@@ -0,0 +1,3 @@
declare module '*.css'
declare module '*.scss'
declare module '*.sass'
File diff suppressed because it is too large Load Diff
+31
View File
@@ -0,0 +1,31 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Aurora</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="/main.tsx"></script>
</body>
<style>
body {
background-color: #000;
color: #fff;
margin: 32px 0;
font-family: var(--a-font-family);
}
#root {
width: 900px;
margin: 0 auto;
}
h2 {
margin: 24px 0;
font-size: 1.4rem;
font-weight: 600;
}
</style>
</html>
+24
View File
@@ -0,0 +1,24 @@
import React from 'react'
import ReactDOM from 'react-dom/client'
import '@fontsource/source-sans-pro/200.css'
import '@fontsource/source-sans-pro/300.css'
import '@fontsource/source-sans-pro/400.css'
import '@fontsource/source-sans-pro/600.css'
import '@fontsource/source-sans-pro/700.css'
import '@fontsource/source-sans-pro/900.css'
import 'remixicon/fonts/remixicon.css'
import '../src/styles/main.sass'
import { App } from './App.tsx'
const rootElement = document.getElementById('root')
if (rootElement != null) {
ReactDOM.createRoot(rootElement).render(
<React.StrictMode>
<App />
</React.StrictMode>
)
} else {
console.error('Error: Root element not found!')
}
+3
View File
@@ -0,0 +1,3 @@
<svg width="800" height="192" viewBox="0 0 800 192" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M126.205 101.717C125.951 86.239 132.637 74.1902 146.246 65.5659C138.571 54.4049 127.251 48.1317 112.283 46.7293C106.959 46.2293 100.151 47.4878 91.8707 50.5366C82.9634 53.839 77.9488 55.4805 76.8366 55.4805C74.4854 55.4805 69.9707 54.0927 63.2805 51.2951C56.6049 48.5049 50.9098 47.1098 46.2073 47.1098C38.2902 47.239 30.9244 49.4268 24.122 53.6732C17.3171 57.9244 11.8756 63.7317 7.79512 71.0805C2.59268 80.2171 0 91.1268 0 103.807C0 115.222 1.91219 126.634 5.74634 138.056C9.33415 148.966 13.9195 158.541 19.4805 166.778C24.4244 174.263 28.7707 179.717 32.4707 183.146C37.7976 188.471 43.2341 191.012 48.8098 190.754C52.3951 190.622 57.0927 189.293 62.9098 186.749C68.3488 184.351 73.7976 183.144 79.2439 183.144C84.3146 183.144 89.5683 184.344 95.0195 186.749C101.078 189.293 106.032 190.559 109.866 190.559C115.559 190.31 120.876 187.834 125.832 183.146C127.556 181.617 129.446 179.527 131.485 176.863C133.839 173.761 136.1 170.589 138.263 167.351C140.066 164.559 141.769 161.704 143.368 158.79C145.084 155.653 146.602 152.412 147.915 149.085C148.527 147.69 149.083 146.266 149.583 144.807C150.076 143.349 150.571 141.863 151.066 140.339C146.488 138.315 142.341 135.449 138.632 131.768C130.476 123.663 126.329 113.639 126.205 101.717ZM260.783 135.634H259.883L222.193 49.5024H192.595V188.471H218.39V98.4683H219.588L251.085 169.937H269.176L300.573 98.4683H301.776V188.471H327.868V49.5024H298.473L260.783 135.634ZM102.815 31.322C109.376 23.0756 112.656 14.1976 112.656 4.68293V2.78293C112.656 2.14391 112.593 1.5122 112.471 0.878052C107.89 1.13171 103.037 2.59269 97.8976 5.25122C92.7659 7.91952 88.5293 11.2854 85.1829 15.3366C78.5049 23.3341 75.161 31.8902 75.161 41.0244V42.8268C75.161 43.4024 75.2244 44.0024 75.3463 44.6415C85.6195 45.6537 94.7756 41.2122 102.815 31.322ZM629.351 49.5024H658.344V188.473H629.351V49.5024ZM745.91 71.5927C763.105 71.5927 772.198 84.8293 772.198 99.0829H800V96.1293C800 69.2537 779.502 46.8585 745.707 46.8585C709.512 46.8585 687.92 70.6805 687.92 111.305V126.985C687.92 167.598 709.312 191.124 745.605 191.124C780.3 191.124 800 168.412 800 143.168V140.115H772.2C772.2 154.476 763.305 166.385 746.115 166.385C728.512 166.385 717.312 153.861 717.312 127.08V111.412C717.312 84.7244 728.615 71.5927 745.91 71.5927ZM438.756 137.259C438.756 155.895 427.859 166.173 411.863 166.173C395.766 166.173 384.871 155.993 384.871 137.259V49.5024H356.073V141.332C356.073 170.966 377.066 191.122 411.859 191.122C446.554 191.122 467.646 170.966 467.646 141.332V49.5024H438.756V137.259ZM563.571 107.534L542.878 102.856C530.683 100.302 524.283 94.9098 524.283 86.8634C524.283 76.1781 532.978 69.4561 546.983 69.4561C562.778 69.4561 570.676 78.5171 571.373 88.2927H598.368C598.068 63.7537 577.576 46.6512 547.078 46.6512C518.188 46.6512 495.39 61.8244 495.39 89.1073C495.39 112.727 511.39 123.715 530.585 127.9L551.078 132.68C564.876 135.837 571.873 140.422 571.873 149.883C571.873 160.683 563.273 168.015 547.18 168.015C529.883 168.015 520.783 158.849 519.988 148.563H492.19C492.598 168.215 505.593 191.122 545.785 191.122C579.576 191.122 600.476 174.324 600.476 147.029C600.466 121.78 583.568 111.905 563.571 107.534Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

+64
View File
@@ -0,0 +1,64 @@
<svg width="103" height="21" viewBox="0 0 103 21" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_22_189)">
<path d="M20.4846 6.48553H16.075V9.05876H20.4846V6.48553Z" fill="#29AB70"/>
<path d="M20.4846 10.0692H16.075V12.6424H20.4846V10.0692Z" fill="url(#paint0_linear_22_189)"/>
<path d="M20.4846 13.6511H16.075V16.2243H20.4846V13.6511Z" fill="url(#paint1_linear_22_189)"/>
<path d="M4.5 17.2348H0.0905304V19.808H4.5V17.2348Z" fill="url(#paint2_linear_22_189)"/>
<path d="M9.82757 17.2348H5.41811V19.808H9.82757V17.2348Z" fill="url(#paint3_linear_22_189)"/>
<path d="M15.1569 17.2348H10.7474V19.808H15.1569V17.2348Z" fill="url(#paint4_linear_22_189)"/>
<path d="M20.4846 17.2348H16.075V19.808H20.4846V17.2348Z" fill="url(#paint5_linear_22_189)"/>
<path d="M15.1569 13.6511H10.7474V16.2243H15.1569V13.6511Z" fill="url(#paint6_linear_22_189)"/>
<path d="M9.82757 13.6511H5.41811V16.2243H9.82757V13.6511Z" fill="url(#paint7_linear_22_189)"/>
<path d="M9.82757 10.0692H5.41811V12.6424H9.82757V10.0692Z" fill="url(#paint8_linear_22_189)"/>
<path d="M59.5733 17.011C57.6607 17.011 56.0872 15.8585 56.0588 13.834H65.1157C65.2344 13.2988 65.294 12.7521 65.2933 12.2038C65.2933 8.54729 62.7911 6.21381 59.108 6.21381C55.1709 6.21381 52.4716 9.27894 52.4716 13.074C52.4716 17.2916 55.3964 20.1046 59.5289 20.1046C62.6508 20.1046 64.8156 18.5294 65.7444 15.942L62.6668 14.7397C62.2442 16.2528 61.2035 17.011 59.5733 17.011ZM59.0956 9.11024C60.6938 9.11024 61.7949 9.98218 61.7949 11.3318L61.7664 11.4437H56.0588C56.3962 9.98219 57.634 9.11024 59.0956 9.11024Z" fill="white"/>
<path d="M77.7348 9.44758V6.49432H66.1224V9.58788H73.2081L65.8969 16.7304V19.8222H77.9319V16.5883H70.3952L77.7348 9.44758Z" fill="white"/>
<path d="M99.4234 10.7973C99.4245 11.0212 99.4096 11.245 99.379 11.4668H102.79C102.873 11.0331 102.913 10.5924 102.909 10.1509C102.909 7.87246 101.476 6.21381 99.086 6.21381C97.5392 6.21381 96.4435 6.97387 95.8806 8.20987V6.49617H92.2827V19.8151H95.8806V11.2466C95.8806 9.89694 96.6122 9.13865 97.7363 9.13865C98.7486 9.13865 99.4234 9.81348 99.4234 10.7973Z" fill="white"/>
<path d="M34.6291 8.49219C33.8122 7.11412 32.2939 6.21376 30.4115 6.21376C26.755 6.21376 24.0841 9.02673 24.0841 13.216C24.0841 17.3484 26.7283 20.1046 30.4949 20.1046C32.3791 20.1046 33.8975 19.2877 34.7694 17.9114V19.8222H38.227V0.14032H34.6291V8.49219ZM31.2248 17.0483C29.2287 17.0483 27.6731 15.5868 27.6731 13.2249C27.6731 10.8346 29.2199 9.31797 31.2248 9.31797C33.1641 9.31797 34.7677 10.8363 34.7677 13.2249C34.7677 15.5779 33.1641 17.0483 31.2248 17.0483Z" fill="white"/>
<path d="M85.2076 17.011C83.295 17.011 81.7216 15.8585 81.6932 13.834H90.7501C90.8689 13.2988 90.9284 12.7521 90.9277 12.2038C90.9277 8.54729 88.4255 6.21381 84.7424 6.21381C80.8053 6.21381 78.106 9.27894 78.106 13.074C78.106 17.2916 81.0308 20.1046 85.1632 20.1046C88.2852 20.1046 90.45 18.5294 91.3788 15.942L88.2994 14.7397C87.8785 16.2528 86.8397 17.011 85.2076 17.011ZM84.7299 9.11024C86.3282 9.11024 87.4292 9.98218 87.4292 11.3318L87.4008 11.4437H81.6897C82.0306 9.98219 83.2666 9.11024 84.7299 9.11024Z" fill="white"/>
<path d="M46.2843 17.011C44.3717 17.011 42.7983 15.8585 42.7699 13.834H51.8268C51.9434 13.2986 51.9999 12.7518 51.9955 12.2038C51.9955 8.54729 49.4933 6.21381 45.8101 6.21381C41.873 6.21381 39.1737 9.27894 39.1737 13.074C39.1737 17.2916 42.0986 20.1046 46.231 20.1046C49.353 20.1046 51.5178 18.5294 52.4465 15.942L49.3778 14.7397C48.9552 16.2528 47.9145 17.011 46.2843 17.011ZM45.8066 9.11024C47.4049 9.11024 48.5059 9.98218 48.5059 11.3318L48.4775 11.4437H42.7699C43.1073 9.98219 44.345 9.11024 45.8066 9.11024Z" fill="white"/>
</g>
<defs>
<linearGradient id="paint0_linear_22_189" x1="18.5666" y1="12.9798" x2="17.993" y2="9.72996" gradientUnits="userSpaceOnUse">
<stop stop-color="#2C8C9D"/>
<stop offset="0.04" stop-color="#298E9A"/>
<stop offset="0.39" stop-color="#129C83"/>
<stop offset="0.72" stop-color="#05A475"/>
<stop offset="1" stop-color="#00A770"/>
</linearGradient>
<linearGradient id="paint1_linear_22_189" x1="16.0093" y1="16.0946" x2="20.5503" y2="13.7807" gradientUnits="userSpaceOnUse">
<stop stop-color="#2839BA"/>
<stop offset="1" stop-color="#148CB3"/>
</linearGradient>
<linearGradient id="paint2_linear_22_189" x1="0.0905304" y1="18.5205" x2="4.5" y2="18.5205" gradientUnits="userSpaceOnUse">
<stop stop-color="#F6A500"/>
<stop offset="1" stop-color="#F29100"/>
</linearGradient>
<linearGradient id="paint3_linear_22_189" x1="5.41811" y1="18.5205" x2="9.82757" y2="18.5205" gradientUnits="userSpaceOnUse">
<stop stop-color="#F29100"/>
<stop offset="1" stop-color="#D12F5F"/>
</linearGradient>
<linearGradient id="paint4_linear_22_189" x1="10.7474" y1="18.5205" x2="15.1569" y2="18.5205" gradientUnits="userSpaceOnUse">
<stop stop-color="#B4197C"/>
<stop offset="1" stop-color="#472EAD"/>
</linearGradient>
<linearGradient id="paint5_linear_22_189" x1="16.075" y1="18.5205" x2="20.4846" y2="18.5205" gradientUnits="userSpaceOnUse">
<stop stop-color="#2839BA"/>
<stop offset="1" stop-color="#3072B7"/>
</linearGradient>
<linearGradient id="paint6_linear_22_189" x1="10.5734" y1="15.6329" x2="15.3291" y2="14.2424" gradientUnits="userSpaceOnUse">
<stop stop-color="#B4197C"/>
<stop offset="1" stop-color="#373AAC"/>
</linearGradient>
<linearGradient id="paint7_linear_22_189" x1="5.26361" y1="14.079" x2="9.98385" y2="15.7963" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFCB00"/>
<stop offset="1" stop-color="#D12F5F"/>
</linearGradient>
<linearGradient id="paint8_linear_22_189" x1="5.79104" y1="9.66424" x2="9.45464" y2="13.0455" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFCF00"/>
<stop offset="1" stop-color="#ED743B"/>
</linearGradient>
<clipPath id="clip0_22_189">
<rect width="103" height="20.2448" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

+11
View File
@@ -0,0 +1,11 @@
<svg width="102" height="31" viewBox="0 0 102 31" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M24.7443 13.5867C19.8876 10.7025 11.8767 10.4373 7.24037 11.8444C6.49582 12.0702 5.70854 11.6499 5.48295 10.9054C5.25735 10.1606 5.6772 9.37381 6.42224 9.14747C11.7444 7.53182 20.5916 7.84398 26.1827 11.1629C26.8525 11.5603 27.0722 12.4252 26.6751 13.0939C26.2779 13.7635 25.4123 13.9842 24.7443 13.5867ZM24.5852 17.8586C24.2446 18.4116 23.5217 18.5848 22.9696 18.2455C18.9205 15.7566 12.7463 15.0356 7.95602 16.4896C7.33483 16.6773 6.67869 16.3271 6.49006 15.7071C6.30283 15.0859 6.65325 14.4309 7.27333 14.242C12.7456 12.5815 19.5483 13.3858 24.1987 16.2437C24.7509 16.5837 24.9247 17.3071 24.5852 17.8586ZM22.7416 21.9613C22.471 22.4051 21.8928 22.5444 21.4505 22.2738C17.9124 20.1114 13.4591 19.6229 8.21451 20.821C7.70905 20.9369 7.20543 20.62 7.0901 20.1148C6.97436 19.6094 7.28985 19.1059 7.79642 18.9905C13.5357 17.6785 18.4589 18.2432 22.4302 20.6699C22.8729 20.9402 23.0124 21.5187 22.7416 21.9613ZM15.8319 0.229734C7.51087 0.229734 0.76506 6.97516 0.76506 15.2962C0.76506 23.618 7.51087 30.3632 15.8319 30.3632C24.1532 30.3632 30.8987 23.618 30.8987 15.2962C30.8987 6.97516 24.1532 0.229734 15.8319 0.229734Z" fill="#1ED760"/>
<path d="M41.7566 14.1389C39.1552 13.5186 38.6919 13.0831 38.6919 12.1685C38.6919 11.304 39.5059 10.7225 40.716 10.7225C41.889 10.7225 43.052 11.1642 44.2717 12.0735C44.3086 12.101 44.3548 12.112 44.4003 12.1048C44.4458 12.0979 44.486 12.0731 44.5128 12.0353L45.783 10.2448C45.8351 10.1712 45.8209 10.0694 45.7506 10.0131C44.2992 8.84846 42.6648 8.28227 40.7545 8.28227C37.9456 8.28227 35.9836 9.96772 35.9836 12.3797C35.9836 14.9661 37.6761 15.8817 40.6008 16.5886C43.0902 17.162 43.5103 17.6423 43.5103 18.5012C43.5103 19.4527 42.6607 20.0443 41.2935 20.0443C39.7752 20.0443 38.5365 19.5328 37.1509 18.3329C37.1166 18.3034 37.0694 18.2898 37.0259 18.2923C36.9802 18.2961 36.9383 18.3173 36.9091 18.3523L35.4849 20.0473C35.4252 20.1177 35.4327 20.2228 35.5016 20.2836C37.1139 21.7227 39.0964 22.483 41.2359 22.483C44.2627 22.483 46.2185 20.8291 46.2185 18.2694C46.2185 16.1061 44.926 14.9098 41.7566 14.1389Z" fill="#1ED760"/>
<path d="M55.2635 17.0382C55.2635 18.8649 54.1383 20.1396 52.5271 20.1396C50.9343 20.1396 49.7328 18.807 49.7328 17.0382C49.7328 15.2697 50.9343 13.9369 52.5271 13.9369C54.1124 13.9369 55.2635 15.2409 55.2635 17.0382ZM53.0663 11.5732C51.7544 11.5732 50.6783 12.09 49.791 13.1488V11.957C49.791 11.8629 49.7147 11.7863 49.6206 11.7863H47.2914C47.1973 11.7863 47.1212 11.8629 47.1212 11.957V25.1992C47.1212 25.2933 47.1973 25.3699 47.2914 25.3699H49.6206C49.7147 25.3699 49.791 25.2933 49.791 25.1992V21.0194C50.6785 22.0154 51.7548 22.5019 53.0663 22.5019C55.504 22.5019 57.9718 20.6253 57.9718 17.0382C57.9718 13.4503 55.504 11.5732 53.0663 11.5732Z" fill="#1ED760"/>
<path d="M64.2972 20.1587C62.6274 20.1587 61.3686 18.817 61.3686 17.0382C61.3686 15.2519 62.5839 13.9556 64.2587 13.9556C65.9393 13.9556 67.2067 15.2972 67.2067 17.0772C67.2067 18.8633 65.9831 20.1587 64.2972 20.1587ZM64.2972 11.5733C61.1579 11.5733 58.6984 13.9907 58.6984 17.0772C58.6984 20.1302 61.141 22.5223 64.2587 22.5223C67.4093 22.5223 69.8763 20.113 69.8763 17.0382C69.8763 13.9737 67.4262 11.5733 64.2972 11.5733Z" fill="#1ED760"/>
<path d="M76.5803 11.7863H74.0171V9.16561C74.0171 9.07152 73.9411 8.99505 73.847 8.99505H71.518C71.4237 8.99505 71.3471 9.07152 71.3471 9.16561V11.7863H70.2271C70.1332 11.7863 70.0574 11.8629 70.0574 11.957V13.9589C70.0574 14.0529 70.1332 14.1295 70.2271 14.1295H71.3471V19.3096C71.3471 21.403 72.389 22.4643 74.4438 22.4643C75.2793 22.4643 75.9726 22.2918 76.6258 21.9213C76.6789 21.8917 76.712 21.8344 76.712 21.7736V19.8673C76.712 19.8084 76.6812 19.753 76.6311 19.722C76.5803 19.6902 76.5172 19.6886 76.4652 19.7143C76.0165 19.94 75.5827 20.0443 75.0978 20.0443C74.3506 20.0443 74.0171 19.7051 74.0171 18.9446V14.1295H76.5803C76.6744 14.1295 76.7502 14.0529 76.7502 13.9589V11.957C76.7502 11.8629 76.6744 11.7863 76.5803 11.7863Z" fill="#1ED760"/>
<path d="M85.5108 11.7966V11.4747C85.5108 10.5278 85.8739 10.1055 86.6882 10.1055C87.1738 10.1055 87.5639 10.202 88.0007 10.3477C88.0545 10.3646 88.1106 10.3561 88.1543 10.3239C88.1993 10.2917 88.2247 10.2401 88.2247 10.1854V8.22252C88.2247 8.14749 88.1765 8.0811 88.1043 8.05915C87.6428 7.92188 87.0524 7.78082 86.1682 7.78082C84.0166 7.78082 82.8796 8.99238 82.8796 11.2833V11.7762H81.7605C81.6666 11.7762 81.5895 11.8527 81.5895 11.9468V13.9589C81.5895 14.053 81.6666 14.1295 81.7605 14.1295H82.8796V22.1196C82.8796 22.2137 82.9555 22.2902 83.0494 22.2902H85.3786C85.4727 22.2902 85.5493 22.2137 85.5493 22.1196V14.1295H87.7242L91.0557 22.1175C90.6775 22.9568 90.3056 23.1238 89.7979 23.1238C89.3875 23.1238 88.9553 23.0012 88.5135 22.7594C88.4719 22.7365 88.4228 22.7328 88.3778 22.7466C88.3334 22.7625 88.2959 22.7954 88.277 22.8388L87.4876 24.5708C87.45 24.6526 87.482 24.7488 87.5608 24.7912C88.385 25.2376 89.1291 25.4281 90.0485 25.4281C91.7685 25.4281 92.7192 24.6268 93.5574 22.4714L97.5985 12.029C97.6187 11.9765 97.6127 11.9173 97.5805 11.8705C97.5485 11.8244 97.4969 11.7966 97.4404 11.7966H95.0154C94.9429 11.7966 94.8778 11.8426 94.8541 11.9108L92.37 19.0063L89.6491 11.9061C89.6243 11.8401 89.5607 11.7966 89.49 11.7966H85.5108Z" fill="#1ED760"/>
<path d="M80.3336 11.7863H78.0042C77.9101 11.7863 77.8336 11.8629 77.8336 11.957V22.1196C77.8336 22.2137 77.9101 22.2902 78.0042 22.2902H80.3336C80.4275 22.2902 80.5041 22.2137 80.5041 22.1196V11.957C80.5041 11.8629 80.4275 11.7863 80.3336 11.7863Z" fill="#1ED760"/>
<path d="M79.1806 7.15901C78.258 7.15901 77.509 7.90621 77.509 8.82882C77.509 9.75215 78.258 10.5001 79.1806 10.5001C80.1031 10.5001 80.8512 9.75215 80.8512 8.82882C80.8512 7.90621 80.1031 7.15901 79.1806 7.15901Z" fill="#1ED760"/>
<path d="M99.6825 12.7972H99.2557V13.3415H99.6825C99.8955 13.3415 100.023 13.2372 100.023 13.0692C100.023 12.8922 99.8955 12.7972 99.6825 12.7972ZM99.9592 13.5736L100.423 14.2228H100.032L99.6145 13.6274H99.2557V14.2228H98.9285V12.502H99.6958C100.095 12.502 100.358 12.7066 100.358 13.0509C100.358 13.333 100.195 13.5054 99.9592 13.5736ZM99.5958 11.9295C98.7561 11.9295 98.1206 12.5969 98.1206 13.4143C98.1206 14.2313 98.7516 14.8898 99.5871 14.8898C100.427 14.8898 101.063 14.2228 101.063 13.405C101.063 12.588 100.431 11.9295 99.5958 11.9295ZM99.5871 15.0538C98.6652 15.0538 97.9479 14.3134 97.9479 13.4143C97.9479 12.5152 98.6746 11.7664 99.5958 11.7664C100.517 11.7664 101.235 12.5067 101.235 13.405C101.235 14.3042 100.509 15.0538 99.5871 15.0538Z" fill="#1ED760"/>
</svg>

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Some files were not shown because too many files have changed in this diff Show More