Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 27 additions & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,36 @@
# Changelog

## [2.1.1a1](https://github.com/OpenVoiceOS/ovos-core/tree/2.1.1a1) (2025-11-05)
## [2.1.3a2](https://github.com/OpenVoiceOS/ovos-core/tree/2.1.3a2) (2026-03-07)

[Full Changelog](https://github.com/OpenVoiceOS/ovos-core/compare/2.1.0...2.1.1a1)
[Full Changelog](https://github.com/OpenVoiceOS/ovos-core/compare/2.1.3a1...2.1.3a2)

**Merged pull requests:**

- Update ovos-plugin-manager version range [\#734](https://github.com/OpenVoiceOS/ovos-core/pull/734) ([JarbasAl](https://github.com/JarbasAl))
- Prevent duplicate skill loads during overlapping rescans [\#744](https://github.com/OpenVoiceOS/ovos-core/pull/744) ([goldyfruit](https://github.com/goldyfruit))

## [2.1.3a1](https://github.com/OpenVoiceOS/ovos-core/tree/2.1.3a1) (2026-03-04)

[Full Changelog](https://github.com/OpenVoiceOS/ovos-core/compare/2.1.2a2...2.1.3a1)

**Merged pull requests:**

- fix: skill dependencies [\#742](https://github.com/OpenVoiceOS/ovos-core/pull/742) ([JarbasAl](https://github.com/JarbasAl))

## [2.1.2a2](https://github.com/OpenVoiceOS/ovos-core/tree/2.1.2a2) (2026-01-19)

[Full Changelog](https://github.com/OpenVoiceOS/ovos-core/compare/2.1.2a1...2.1.2a2)

**Merged pull requests:**

- gl-es/translate [\#739](https://github.com/OpenVoiceOS/ovos-core/pull/739) ([gitlocalize-app[bot]](https://github.com/apps/gitlocalize-app))

## [2.1.2a1](https://github.com/OpenVoiceOS/ovos-core/tree/2.1.2a1) (2025-11-10)

[Full Changelog](https://github.com/OpenVoiceOS/ovos-core/compare/2.1.1...2.1.2a1)

**Merged pull requests:**

- Update ovos-workshop requirement from \<8.0.0,\>=7.0.6 to \>=7.0.6,\<9.0.0 in /requirements [\#736](https://github.com/OpenVoiceOS/ovos-core/pull/736) ([dependabot[bot]](https://github.com/apps/dependabot))



Expand Down
4 changes: 2 additions & 2 deletions ovos_core/intent_services/locale/gl-es/global_stop.intent
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ Parar todas as accións
Parar todas as actividades activas
Parar todas as tarefas actuais
Parar todo agora
Rematar todas as accións en marcha
Rematar todas as actividades
Rematar todas as actividades en execución
Rematar todas as operacións
Rematar todas as tarefas abertas
Rematar todos os procesos
Expand All @@ -18,6 +18,7 @@ acabar todo
cancelalo todo
cancelar todo
detelo todo
detelo todo
deter todo
finalizalo todo
finalizar todo
Expand All @@ -27,5 +28,4 @@ paralo todo
paralo todo
parar todo
parar todo
rematalo todo
rematar todo
10 changes: 5 additions & 5 deletions ovos_core/intent_services/locale/gl-es/stop.intent
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
Acaba isto
Cancela a tarefa actual
Interrompe a acción actual
Acaba iso
Cancela a tarefa en curso
Detén a tarefa en curso
Para isto
Parar a acción actual
Parar a acción en curso
Parar a actividade actual
Parar a operación actual
Parar de executar esta tarefa
Parar de executar o comando actual
Parar de traballar niso
Parar o proceso en curso
Parar o proceso en curso
Parar o que estás a facer
Podes parar agora?
Remata a tarefa actual
parar
parar de facer iso
parar iso
42 changes: 21 additions & 21 deletions ovos_core/intent_services/locale/nl-nl/global_stop.intent
Original file line number Diff line number Diff line change
@@ -1,31 +1,31 @@
Annuleer alle lopende acties
Annuleer alle taken
Beëindig alle acties
Beëindig alle lopende acties
Alle lopende processen afbreken
Alle taken annuleren
Beëindig alle bewerkingen
Beëindig alle processen
Rond alle activiteiten af
Stop alle activiteiten
Stop alle acties
Stop alle huidige taken
Stop alle lopende acties
Stop alle lopende processen
Stop alle lopende processen
Stop met alle acties
Stop nu met alles
Stop onmiddellijk alle acties
Voltooi alle openstaande taken
Stop nu alles
Stop onmiddellijk alle activiteiten
Voltooi alle activiteiten
alles afbreken
alles afbreken
alles afmaken
alles afmaken
alles annuleren
alles annuleren
alles beëindigen
alles beëindigen
alles stoppen
alles stoppen
alles stoppen
alles stoppen
alles stoppen
alles stopzetten
annuleer alles
beëindig alles
beëindig alles
genoeg
hou op
hou op met praten
kappen
kappen nu
niet meer praten
nu ophouden
stop alles
stop alles
stop alles
stop alles
stop met alles
stop met praten
18 changes: 9 additions & 9 deletions ovos_core/intent_services/locale/nl-nl/stop.intent
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
(kun|kan) je nu stoppen
Annuleer de huidige taak
Beëindig de huidige actie
Beëindig de huidige taak
Beëindig the current action
Ga niet verder
Hou daar alsjeblieft mee op
Maak er een einde aan
Stop de huidige actie
Kun je nu stoppen?
Maak er alsjeblieft een einde aan
Stop a.u.b.
Stop alstublieft met de huidige actie
Stop daar alsjeblieft mee
Stop de huidige actie
Stop de huidige activiteit
Stop het lopende proces
Stop met het uitvoeren van de huidige opdracht
Stop met het uitvoeren van die taak
Stop waar je mee bezig bent
Stop wat je doet
Stoppen maar
stop
stop dit
stop daarmee
stop ermee
59 changes: 46 additions & 13 deletions ovos_core/skill_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,8 @@ def __init__(self, bus, watchdog=None, alive_hook=on_alive, started_hook=on_star
self.config = Configuration()

self.plugin_skills = {}
self._plugin_skills_lock = threading.RLock()
self._loading_plugin_skills = set()
self.enclosure = EnclosureAPI(bus)
self.num_install_retries = 0
self.empty_skill_dirs = set() # Save a record of empty skill dirs.
Expand Down Expand Up @@ -209,6 +211,25 @@ def skills_config(self):
"""
return self.config['skills']

def _is_plugin_skill_tracked(self, skill_id):
"""Check whether a skill is loaded or currently being loaded."""
with self._plugin_skills_lock:
return (skill_id in self.plugin_skills or
skill_id in self._loading_plugin_skills)

def _reserve_plugin_skill_load(self, skill_id):
"""Mark a skill as loading so overlapping scans skip it."""
with self._plugin_skills_lock:
if skill_id in self.plugin_skills or skill_id in self._loading_plugin_skills:
return False
self._loading_plugin_skills.add(skill_id)
return True

def _release_plugin_skill_load(self, skill_id):
"""Clear the in-progress marker for a skill load attempt."""
with self._plugin_skills_lock:
self._loading_plugin_skills.discard(skill_id)

def handle_gui_connected(self, message):
"""Handle GUI connection event.

Expand Down Expand Up @@ -295,16 +316,19 @@ def load_plugin_skills(self, network=None, internet=None):
LOG.warning(f"{skill_id} is blacklisted, it will NOT be loaded")
LOG.info(f"Consider uninstalling {skill_id} instead of blacklisting it")
continue
if skill_id not in self.plugin_skills:
skill_loader = self._get_plugin_skill_loader(skill_id, init_bus=False,
skill_class=plug)
requirements = skill_loader.runtime_requirements
if not network and requirements.network_before_load:
continue
if not internet and requirements.internet_before_load:
continue
self._load_plugin_skill(skill_id, plug)
loaded_new = True
if self._is_plugin_skill_tracked(skill_id):
continue
skill_loader = self._get_plugin_skill_loader(skill_id, init_bus=False,
skill_class=plug)
requirements = skill_loader.runtime_requirements
if not network and requirements.network_before_load:
continue
if not internet and requirements.internet_before_load:
continue
if not self._reserve_plugin_skill_load(skill_id):
continue
self._load_plugin_skill(skill_id, plug, reserved=True)
loaded_new = True
return loaded_new

def _get_internal_skill_bus(self):
Expand Down Expand Up @@ -342,26 +366,35 @@ def _get_plugin_skill_loader(self, skill_id, init_bus=True, skill_class=None):
loader.skill_class = skill_class
return loader

def _load_plugin_skill(self, skill_id, skill_plugin):
def _load_plugin_skill(self, skill_id, skill_plugin, reserved=False):
"""Load a plugin skill.

Args:
skill_id (str): ID of the skill.
skill_plugin: Plugin skill instance.
reserved (bool): True if the caller already marked the skill as loading.

Returns:
PluginSkillLoader: Loaded plugin skill loader instance if successful, None otherwise.
"""
skill_loader = self._get_plugin_skill_loader(skill_id, skill_class=skill_plugin)
if not reserved and not self._reserve_plugin_skill_load(skill_id):
LOG.debug(f"Skipping duplicate load attempt for {skill_id}; load already in progress")
return None

skill_loader = None
try:
skill_loader = self._get_plugin_skill_loader(skill_id, skill_class=skill_plugin)
load_status = skill_loader.load(skill_plugin)
if load_status:
self.bus.emit(Message("mycroft.skill.loaded", {"skill_id": skill_id}))
except Exception:
LOG.exception(f'Load of skill {skill_id} failed!')
load_status = False
finally:
self.plugin_skills[skill_id] = skill_loader
if skill_loader is not None:
with self._plugin_skills_lock:
self.plugin_skills[skill_id] = skill_loader
self._release_plugin_skill_load(skill_id)

return skill_loader if load_status else None

Expand Down
4 changes: 2 additions & 2 deletions ovos_core/version.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# START_VERSION_BLOCK
VERSION_MAJOR = 2
VERSION_MINOR = 1
VERSION_BUILD = 1
VERSION_ALPHA = 0
VERSION_BUILD = 3
VERSION_ALPHA = 2
# END_VERSION_BLOCK

# for compat with old imports
Expand Down
2 changes: 1 addition & 1 deletion requirements/requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ ovos-utils>=0.8.2a1,<1.0.0
ovos_bus_client>=1.3.6a1,<2.0.0
ovos-plugin-manager>=1.0.3,<3.0.0
ovos-config>=0.0.13,<3.0.0
ovos-workshop>=7.0.6,<8.0.0
ovos-workshop>=7.0.6,<9.0.0

rapidfuzz>=3.6,<4.0
langcodes
11 changes: 6 additions & 5 deletions requirements/skills-audio.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# skills that run in audio enabled devices (require mic/speaker)
ovos-skill-boot-finished>=0.4.8,<1.0.0
ovos-skill-audio-recording>=0.2.4,<1.0.0
ovos-skill-dictation>=0.2.5,<1.0.0
ovos-skill-volume>=0.1.16,<1.0.0
ovos-skill-naptime>=0.3.15,<1.0.0
# NOTE: we do not set upper range on purpose, it is up to release channel being used to do that
ovos-skill-boot-finished>=0.4.8
ovos-skill-audio-recording>=0.2.4
ovos-skill-dictation>=0.2.5
ovos-skill-volume>=0.1.16
ovos-skill-naptime>=0.3.15
1 change: 1 addition & 0 deletions requirements/skills-ca.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
# skills providing catalan specific functionality
# NOTE: we do not set upper range on purpose, it is up to release channel being used to do that
ovos-skill-fuster-quotes
ovos-skill-word-of-the-day
7 changes: 4 additions & 3 deletions requirements/skills-desktop.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# skills that require a linux desktop environment
ovos-skill-application-launcher>=0.5.14,<1.0.0
ovos-skill-wallpapers>=1.0.2,<3.0.0
ovos-skill-screenshot>=0.0.2,<1.0.0
# NOTE: we do not set upper range on purpose, it is up to release channel being used to do that
ovos-skill-application-launcher>=0.5.14
ovos-skill-wallpapers>=1.0.2
ovos-skill-screenshot>=0.0.2
3 changes: 2 additions & 1 deletion requirements/skills-en.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# skills providing english specific functionality
# NOTE: we do not set upper range on purpose, it is up to release channel being used to do that
ovos-skill-word-of-the-day
# skills below need translation before they are moved to skill-extras.txt
ovos-skill-days-in-history>=0.3.11,<1.0.0
ovos-skill-days-in-history>=0.3.11
19 changes: 10 additions & 9 deletions requirements/skills-essential.txt
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
# skills providing core functionality (offline)
ovos-skill-fallback-unknown>=0.1.9,<1.0.0
ovos-skill-alerts>=0.1.10,<1.0.0
ovos-skill-personal>=0.1.19,<1.0.0
# NOTE: we do not set upper range on purpose, it is up to release channel being used to do that
ovos-skill-fallback-unknown>=0.1.9
ovos-skill-alerts>=0.1.10
ovos-skill-personal>=0.1.19
ovos-skill-date-time>=1.1.3,<2.0.0
ovos-skill-hello-world>=0.1.10,<1.0.0
ovos-skill-spelling>=0.2.5,<1.0.0
ovos-skill-diagnostics>=0.0.2,<1.0.0
ovos-skill-parrot>=0.1.25,<1.0.0
ovos-skill-count>=0.0.1,<1.0.0
ovos-skill-randomness>=0.1.2,<1.0.0; python_version >= "3.10"
ovos-skill-hello-world>=0.1.10
ovos-skill-spelling>=0.2.5
ovos-skill-diagnostics>=0.0.2
ovos-skill-parrot>=0.1.25
ovos-skill-count>=0.0.1
ovos-skill-randomness>=0.1.2; python_version >= "3.10"
17 changes: 9 additions & 8 deletions requirements/skills-extra.txt
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
# skills providing non essential functionality
ovos-skill-wordnet>=0.2.5,<1.0.0
ovos-skill-laugh>=0.1.1,<1.0.0
ovos-skill-number-facts>=0.1.12,<1.0.0
ovos-skill-iss-location>=0.2.16,<1.0.0
ovos-skill-cmd>=0.2.11,<1.0.0
ovos-skill-moviemaster>=0.0.12,<1.0.0
ovos-skill-confucius-quotes>=0.1.13,<1.0.0
ovos-skill-icanhazdadjokes>=0.3.7,<1.0.0
# NOTE: we do not set upper range on purpose, it is up to release channel being used to do that
ovos-skill-wordnet>=0.2.5
ovos-skill-laugh>=0.1.1
ovos-skill-number-facts>=0.1.12
ovos-skill-iss-location>=0.2.16
ovos-skill-cmd>=0.2.11
ovos-skill-moviemaster>=0.0.12
ovos-skill-confucius-quotes>=0.1.13
ovos-skill-icanhazdadjokes>=0.3.7
ovos-skill-camera
1 change: 1 addition & 0 deletions requirements/skills-gl.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
# skills providing galician specific functionality
# NOTE: we do not set upper range on purpose, it is up to release channel being used to do that
ovos-skill-word-of-the-day>=0.2.0
7 changes: 4 additions & 3 deletions requirements/skills-gui.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
ovos-skill-homescreen>=3.0.3,<4.0.0
ovos-skill-screenshot>=0.0.2,<1.0.0
ovos-skill-color-picker>=0.0.2,<1.0.0
# NOTE: we do not set upper rage on purpose, it is up to release channel being used to do that
ovos-skill-homescreen>=3.0.3
ovos-skill-screenshot>=0.0.2
ovos-skill-color-picker>=0.0.2
Loading
Loading