Skip to content

feat: add node branch for bare app-launch requests - #54

Open
mikejgray wants to merge 7 commits into
NeonGeckoCom:devfrom
OscillateLabsLLC:FEAT_NodeNativeActions
Open

mikejgray wants to merge 7 commits into
NeonGeckoCom:devfrom
OscillateLabsLLC:FEAT_NodeNativeActions

Conversation

@mikejgray

@mikejgray mikejgray commented Aug 17, 2026

Copy link
Copy Markdown

Summary

This PR lets a Node open apps by voice: camera, clock, reminders, voice recorder, and bare "open messages"/"open mail" (no content). It adds a Node branch to handle_launch_program, checked before the existing mobile and Klat branches. The branch resolves the spoken program name to a native action, then calls the shared helper in NeonGeckoCom/neon-utils#568 to check support, dispatch, and speak the result.

Program names live in one .voc file per NodeNativeAction value (launch_clock_app.voc holds clock, alarm, timer, and so on), resolved with voc_match. Other languages add program names by adding vocab, with no code change. Programs that match no vocab still get the existing "not supported" message. handle_browse_website is untouched.

Spoken text for these actions lives in this skill's dialog files, like any other dialog: the four native_action_* dialogs (not supported, success, timeout, error) plus one <NodeNativeAction value>.dialog per action holding its spoken name. The shared helper has no built-in fallback text; a missing file gets the standard OVOS behavior of speaking the key.

Test plan

  • 13 tests and 16 subtests pass. The vocab test reads every <action>.voc in the skill and checks that every line resolves to its action, so the vocab and the code cannot drift apart.
  • minerva test-resources and minerva test-intents pass locally against test/test_resources.yaml and test/test_intents.yaml.
  • End-to-end test against a live Hub: camera, clock, and reminders all confirmed working. Voice command in, correct app opens on the Node, correct result reported back.

CI note

requirements.txt floors neon-utils at 1.14.2a5 (the alpha published from NeonGeckoCom/neon-utils#568) and neon-data-models at 0.0.3a2 (the first prerelease with NodeNativeAction). Neither spec resolved a prerelease before, so earlier CI runs failed at import: first No module named 'neon_utils.native_actions', then cannot import name 'NodeNativeAction' from 'neon_data_models.enum' after neon-utils published.

Depends on NeonGeckoCom/neon-utils#568.

Extends handle_launch_program with a Node capability-gated path,
mapping the free-text program slot to a NodeNativeAction and
dispatching through neon-utils' shared invoke_native_action helper.
Unmapped programs keep the existing not_supported fallback.
Was added to trace a context.node stamping issue during live E2E
testing; no longer needed now that the round trip is confirmed working.
@NeonDaniel

Copy link
Copy Markdown
Member

CI fails today with ModuleNotFoundError: No module named 'neon_utils.native_actions'. This branch's requirements.txt still points at the released neon-utils package, which does not have this module yet. It will resolve once neon-utils#568 merges and releases.

Depends on NeonGeckoCom/neon-utils#568.

@mikejgray can you update requirements.txt to point at this branch to confirm tests all pass with that issue addressed?

@NeonDaniel NeonDaniel left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested refactoring PROGRAM_TO_NATIVE_ACTION to use voc resources for future language support

Comment thread locale/en-us/dialog/native_action_timeout.dialog Outdated
Comment thread __init__.py Outdated
The neon-utils helper renders <NodeNativeAction value>.dialog for the
spoken action name and has no built-in fallback text, so every action
this skill launches needs its own dialog file. Timeout wording per
review.
Replace the hardcoded program-to-action dict with one .voc file per
NodeNativeAction value, resolved with voc_match, so other languages can
add program names without touching code. Whole-word matching also
handles slots like "the camera" without an entry per phrasing.
neon-utils~=1.12 does not resolve a prerelease, so the alpha published
from NeonGeckoCom/neon-utils#568 needs an explicit floor.
The enum this skill imports first shipped in the 0.0.3a2 prerelease;
the ~=0.0,>=0.0.2 spec resolved the 0.0.2 stable in CI, which does not
have it.
@mikejgray
mikejgray marked this pull request as ready for review September 9, 2026 02:19
@mikejgray
mikejgray requested a review from NeonDaniel September 9, 2026 02:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants