Skip to content

feat: add node branch for single-shot sms/email compose - #28

Merged
NeonDaniel merged 8 commits into
NeonGeckoCom:devfrom
OscillateLabsLLC:FEAT_NodeNativeActions
Sep 16, 2026
Merged

NeonDaniel merged 8 commits into
NeonGeckoCom:devfrom
OscillateLabsLLC:FEAT_NodeNativeActions

Conversation

@mikejgray

@mikejgray mikejgray commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Summary

This PR lets a Node send a text or email by voice, in one turn — no back-and-forth. It adds a Node branch to handle_send_sms and handle_send_email, checked before the existing mobile draft-and-confirm flow. The branch reads the recipient, subject, and body already extracted by CMS_match_message_phrase, then calls the shared helper in NeonGeckoCom/neon-utils#568 to check support, dispatch, and speak the result. A Node request never enters the mobile draft state.

Spoken text for these actions lives in this skill's dialog files: the same four native_action_* dialogs as skill-launcher#54, plus launch_sms_app.dialog and launch_email_app.dialog holding the spoken name of each action. The shared helper has no built-in fallback text; a missing file gets the standard OVOS behavior of speaking the key.

This PR also adds test/test_skill.py, the first unit tests for this skill. The requirements/test.txt and test extra it originally introduced landed upstream in #29 and are no longer part of this diff.

Test plan

  • 11 unit tests pass, including a check that the existing mobile SMS path still works and never touches the new Node branch.
  • Resource tests (3) and intent tests (4) from Add intent and resource tests #29 pass locally on this branch via minerva. The six new dialog files are registered in test/test_resources.yaml.
  • End-to-end test against a live Hub: not yet passing. See below.

End-to-end status: blocked

Live testing found two problems upstream of this PR's code, in how the utterance reaches this skill at all.

Text messages. The phrase "send a text to X that says Y" should match skill-communication's SendMessageIntent — it has both a trigger word (send) and a content word (text). In testing it did not match anything, and fell through to the fallback LLM skill instead. This needs investigation in skill-communication, a different repo.

Email. The phrase "draft an email to X about Y" matched DraftEmailIntent, a skill-messaging intent, instead of going through CMS_match_message_phrase as expected. DraftEmailIntent only checks for the words "draft" and "email" — it does not read a recipient or subject from the utterance, because it was built to start the mobile draft flow, not to fill in Node fields directly. So it wins the match and hands the new Node branch an empty result. The branch handles that correctly — it speaks an error instead of failing silently — but the wrong intent is answering the request.

Neither of these is a bug in this PR's code: the dispatch and error-handling logic behaves correctly given what it receives. The Node branch cannot be called end-to-end validated until these two matching problems are fixed.

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. skill.json carries the same specs so the update-skill-json workflow has nothing to push.

This PR turns on the skill_unit_tests job in the test workflow, per review, so test/test_skill.py runs in CI alongside the intent and resource jobs enabled in #29.

Rebased onto dev after #29 (2026-09-16); the only conflict was the test workflow, resolved with all three test jobs enabled.

Depends on NeonGeckoCom/neon-utils#568.

@NeonDaniel

Copy link
Copy Markdown
Member

CI shows all green, but this repo's test workflow has skill_unit_tests, skill_intent_tests, and skill_resource_tests commented out — already true on dev, not something this PR changed. So the new test/test_skill.py never runs in CI. Green here means no tests ran, not that tests passed.

This PR is defining unit tests where none existed previously. Please, un-comment the skill_unit_tests automation since there are valid tests to run now

@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
Adds a Node capability-gated path at the top of handle_send_sms and
handle_send_email, dispatching through neon-utils' shared
invoke_native_action helper. Reuses recipient/subject/body already
extracted by CMS_match_message_phrase; never enters the mobile
draft-and-confirm state machine.

Also adds test infrastructure for this skill (none existed before).
The neon-utils helper renders <NodeNativeAction value>.dialog for the
spoken action name and has no built-in fallback text, so both actions
this skill invokes need their own dialog file. Timeout wording matches
the review suggestion on skill-launcher#54.
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 resolves the 0.0.2 stable, which does not have
it.
Requested in review. Intent and resource jobs stay off; this repo has
no test_intents.yaml or test_resources.yaml yet.
NeonCore requires neon-utils[network]>=1.14.1 without allowing
prereleases, so pip resolved that node to 1.14.1 and it conflicted with
this skill's 1.14.2a5 floor on the plain neon-utils node. Requesting the
same extra lets one prerelease candidate satisfy both, as skill-launcher
already does. The same conflict would break a Hub install.
Upstream regenerated skill.json in NeonGeckoCom#29, which dropped this branch's
neon-utils and neon-data-models floors. Match requirements.txt so the
update_skill_json workflow has nothing to push.
The resource test file landed upstream in NeonGeckoCom#29 after these dialogs were
added; register them so the resource test covers them.
@mikejgray
mikejgray force-pushed the FEAT_NodeNativeActions branch 2 times, most recently from 302a26c to 7c319a3 Compare September 16, 2026 18:11
@NeonDaniel
NeonDaniel merged commit 8dec09e into NeonGeckoCom:dev Sep 16, 2026
32 checks passed
@mikejgray
mikejgray deleted the FEAT_NodeNativeActions branch September 19, 2026 01:49
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