π¦ New version release - #353
Merged
Merged
Conversation
brentrager
force-pushed
the
changeset-release/main
branch
from
August 14, 2026 00:36
b291839 to
a62a7a5
Compare
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.
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
@smooai/smooth-operator-server@1.9.0
Minor Changes
aeb275a: .NET server: resolve
send_message.skillserver-side (Rust PR th-b30a6a: send_message grows an optionalskillβ the engine resolves it, not the clientΒ #338 parity).The C# server had the generated
SendMessageRequest.Skillfield but ignored it β the same stagingimageswent through. It now resolves the skill and composes it into the turn, closing the last text-path gap with the Rust reference:SkillsβIsValidSkillName(ASCII alphanumerics +-/_, β€128 chars, so..,/,\and NUL are unrepresentable rather than filtered),StripFrontmatter(drops the discovery-metadata YAML block, leaving only the instructions the model should see; unterminated frontmatter is returned untouched rather than swallowing the file),SkillSection(the## Skill: <name>framing), andResolveSectionAsync.ISkillResolverβ the host seam, injected via theFrameDispatcherconstructor (the C# analog of Rust'sAppState::with_skill_resolver).DirSkillResolverβ the working default:<root>/<name>/SKILL.mdover the:-separated roots inSMOOTH_SKILLS_DIR, first root wins. The ASP.NET host prefers a DI-registeredISkillResolverand otherwise falls back toDirSkillResolver.FromEnv(), mirroring Rust'sinstall_skill_resolver_from_env. Unset β no resolver installed, so a multi-tenant deploy never serves host skills by accident.images: an unresolvable skill returnserror { code: "SKILL_NOT_FOUND" }and the turn does not run. A caller that asked for a code-review recipe and silently got a freeform answer has no way to tell. A blank/whitespaceskillis treated as absent, matching Rust's trim-then-filter.Tests:
SkillTestsports all five Rustskills.rsunit tests under their Rust names, plus dispatcher-level coverage for fail-closedSKILL_NOT_FOUND, system-prompt-not-user-message placement, blank-skill-as-absent, and unchanged behavior when the field is absent.RecordingChatClientwas promoted out ofFileTransferTestsinto a sharedTestChatClients.csso both suites use one double.Backward compatible: an absent
skillfield is byte-for-byte the previous behavior. Source-only β the engine stays the published NuGet.