Commit Graph

4786 Commits

Author SHA1 Message Date
dab246 ea8dedda46 feat(ai-scribe): Fix generate ai text is failed 2025-12-19 19:03:39 +07:00
dab246 27393d4cc8 feat(ai-scribe): Add method to collapse selection and insert/replace callback 2025-12-19 19:03:39 +07:00
Théo Poizat 3fe54e1847 Add Intl for Replace text 2025-12-19 19:03:39 +07:00
Théo Poizat 8ed8100e7e Add JS method to collapse selection in both composer
Collapsing a selection means removing it and keep the cursor at the
end. It will be needed by the scribe for "Insert" action where we
want to insert a text at the cursor even if the user selected text.
2025-12-19 19:03:39 +07:00
dab246 af5f316e31 feat(ai-scribe): Optimize imports to avoid having too many lines of code in a single file 2025-12-19 19:03:39 +07:00
dab246 860393fc90 feat(ai-scribe): Improve data & domain layer for ai scribe 2025-12-19 19:03:39 +07:00
dab246 1a1b8f489f feat(ai-scribe): Improve UI for AI Scribe suggestion modal 2025-12-19 19:03:39 +07:00
dab246 582b1ebe97 feat(ai-scribe): reorganize abstractions and update dialog modal UI 2025-12-19 19:03:39 +07:00
dab246 7ddccf2e1c feat(ai-scribe): Fix cannot parsing AI capability from Session 2025-12-19 19:03:39 +07:00
Théo Poizat 63d9a5d740 Strong typing AI exceptions 2025-12-19 19:03:39 +07:00
Théo Poizat 755e24895d Disable AI Scribe if on mobile 2025-12-19 19:03:39 +07:00
Théo Poizat 0075fd64b6 feat: Remove .env file for AI Scribe
It was used at the beginning for configuration purpose but now we
have the JMAP capability, no need anymore.
2025-12-19 19:03:39 +07:00
Théo Poizat 253f22c600 Remove value now unused
No more API key and url needed because everything is managed by the backend.

Also backend does not accept a model parameter for the moment.
2025-12-19 19:03:39 +07:00
Théo Poizat 2c364ea08a Use endpoint from AI capability instead of direct call to LLM 2025-12-19 19:03:39 +07:00
Théo Poizat 2325df616f Create an isAIScribeAvailable method
Check JMAP capability AND if AI is enabled in env.file and use this method everywhere  where we checked env.file
2025-12-19 19:03:39 +07:00
Théo Poizat 8c16bd1fad Add AI capability 2025-12-19 19:03:39 +07:00
Théo Poizat e7405051d1 fixup! Use html parser instead of regex to clean composer input
Improve efficiency and add more tests in convertHtmlContentToTextContent
2025-12-19 19:03:39 +07:00
Théo Poizat a9cfe86a59 Use html parser instead of regex to clean composer input
Before sending input to the LLM, we clean the composer input to
remove html tags. We relied on regex that we not complete enough and
could be bypassed easily. So let's use the html parser available in
Dart instead.

I also added some tests.
2025-12-19 19:03:39 +07:00
Théo Poizat f77580ed44 Fix tests by initializing DotEnv for testing 2025-12-19 19:03:39 +07:00
Théo Poizat 4d8d688afb Fix AI scribe menu going off screen to the top
If it was opened at the top of the composer, it could go off screen to the top.

modalHeight was missing so the calculateModalPosition method could not protect the AI scribe menu to go off screen from the top.
2025-12-19 19:03:39 +07:00
Théo Poizat c7886614cd Add tests to AI scribe calculcateModalPosition 2025-12-19 19:03:39 +07:00
Théo Poizat d1bec5af24 Use ValueNotifier instead of setState in AIScribeBar 2025-12-19 19:03:39 +07:00
Théo Poizat 0b139a41d2 Remove unused categoryKeys 2025-12-19 19:03:39 +07:00
Théo Poizat 77a56ae9b7 Export AI Scribe code from controller to a mixin
Avoid adding too much code in the controller
2025-12-19 19:03:39 +07:00
Théo Poizat 4d0880b8be fixup! Extract method to convert html content to text content
Move the method in utils
2025-12-19 19:03:39 +07:00
Théo Poizat d369fcbf5f Simplify observed values about text selection in composer
hasTextSelection had no interest.

The other two values have been put inside an object to observe only one object.
2025-12-19 19:03:39 +07:00
Théo Poizat 2228596c1c Mutualize event listener in web editor widget
Instead of listening multiple times for message from editor JS side,
let's add only one listener and route inside the callback.
2025-12-19 19:03:39 +07:00
Théo Poizat 75f5817e1c fixup! Implement text selection mixin in mobile and web editor
Add try/catch to JSON parse
2025-12-19 19:03:39 +07:00
Théo Poizat 0b8a814ad6 Show AI Scribe submenu on hover instead of on click 2025-12-19 19:03:39 +07:00
Théo Poizat 2f3bbe3bbb Do not display AI scribe if AI is not enabled in env.file 2025-12-19 19:03:39 +07:00
Théo Poizat bb23792fe3 Use bindings to better separate scribe presentation and data layer 2025-12-19 19:03:39 +07:00
Théo Poizat 6dc58e2eb6 Extract method to convert html content to text content
Editor exposes html content (so with html tags) and we do not want to send them to AI backend
2025-12-19 19:03:39 +07:00
Théo Poizat 7d7ccaf874 Open AI Scribe from text selection 2025-12-19 19:03:39 +07:00
Théo Poizat 96c95866c6 Open AI Scribe from bottom bar button 2025-12-19 19:03:39 +07:00
Théo Poizat b122928a38 Add methods to display AI scribe 2025-12-19 19:03:39 +07:00
Théo Poizat dced5b5dc7 Add AI scribe widgets
- Button : the button with sparkle icon to display AI scribe
- Menu : the menu where you can select the action (eg: translate)
- Bar : the input where you can write a custom action
- Suggestion : the wrapper of the result of the LLM
2025-12-19 19:03:39 +07:00
Théo Poizat 23065aa76d Forward text selection callback from editor view to editor 2025-12-19 19:03:39 +07:00
Théo Poizat 57124f70a8 Implement text selection mixin in mobile and web editor 2025-12-19 19:03:39 +07:00
Théo Poizat aaf60cf222 Update AI models default and optional values
To have stronger code
2025-12-19 19:03:39 +07:00
Théo Poizat 0c787d3d98 Throw error if AI API return null or empty reponse 2025-12-19 19:03:39 +07:00
Théo Poizat c858ac40f5 Add translations for scribe module
Added a separated ScribeLocalizations to keep it separated from main app.
2025-12-19 19:03:39 +07:00
Théo Poizat 2557c68a94 Use absolute path for scribe files 2025-12-19 19:03:39 +07:00
Théo Poizat 7e0c98b080 Add scribe module 2025-12-19 19:03:39 +07:00
Théo Poizat 26593b50ef Move AI env var from main to scribe package 2025-12-19 19:03:39 +07:00
Théo Poizat f19993bb30 Use json_serializable and const to improve AI data model 2025-12-19 19:03:39 +07:00
Théo Poizat 8b17fcdc54 fixup! Add text selection mixin 2025-12-19 19:03:39 +07:00
Théo Poizat 4013973110 Add text selection mixin
This mixin leverages HTML callbacks that can be set by WebView editor
to send text selection event to the composer so the composer will
receive text selection event necessary to display buttons related to
text selection.
2025-12-19 19:03:39 +07:00
Théo Poizat 2ccb203610 Add AI text state 2025-12-19 19:03:39 +07:00
Théo Poizat 1e2718e678 Add AI text interactor 2025-12-19 19:03:39 +07:00
Théo Poizat 52295c8c0c Add AI repository implementation 2025-12-19 19:03:39 +07:00