feat: add node branch for single-shot sms/email compose - #28
Open
mikejgray wants to merge 6 commits into
Open
Conversation
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).
Member
This PR is defining unit tests where none existed previously. Please, un-comment the |
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
marked this pull request as ready for review
September 9, 2026 02:19
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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_smsandhandle_send_email, checked before the existing mobile draft-and-confirm flow. The branch reads the recipient, subject, and body already extracted byCMS_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, pluslaunch_sms_app.dialogandlaunch_email_app.dialogholding 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 atestextra insetup.py.Test plan
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'sSendMessageIntent— 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 inskill-communication, a different repo.Email. The phrase "draft an email to X about Y" matched
DraftEmailIntent, a skill-messaging intent, instead of going throughCMS_match_message_phraseas expected.DraftEmailIntentonly 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.txtfloorsneon-utilsat1.14.2a5(the alpha published from NeonGeckoCom/neon-utils#568) andneon-data-modelsat0.0.3a2(the first prerelease withNodeNativeAction). Neither spec resolved a prerelease before.This PR also turns on the
skill_unit_testsjob in the test workflow, per review, sotest/test_skill.pynow runs in CI.skill_intent_testsandskill_resource_testsstay commented out because this repo has notest_intents.yamlortest_resources.yamlyet.Depends on NeonGeckoCom/neon-utils#568.