Skip to content

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

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

feat: add node branch for single-shot sms/email compose#28
mikejgray wants to merge 6 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 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 infrastructure to this repo for the first time: test/test_skill.py, requirements/test.txt, and a test extra in setup.py.

Test plan

  • 11 unit tests pass, including a check that the existing mobile SMS path still works and never touches the new Node branch.
  • 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.

This PR also turns on the skill_unit_tests job in the test workflow, per review, so test/test_skill.py now runs in CI. skill_intent_tests and skill_resource_tests stay commented out because this repo has no test_intents.yaml or test_resources.yaml yet.

Depends on NeonGeckoCom/neon-utils#568.

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).
@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

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.
@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