Skip to content

πŸ¦‹ New version release - #358

Merged
brentrager merged 1 commit into
mainfrom
changeset-release/main
Aug 14, 2026
Merged

πŸ¦‹ New version release#358
brentrager merged 1 commit into
mainfrom
changeset-release/main

Conversation

@brentrager

Copy link
Copy Markdown
Contributor

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

Minor Changes

  • caa3678: TS server: resolve send_message.skill server-side (Rust PR th-b30a6a: send_message grows an optional skill β€” the engine resolves it, not the clientΒ #338 parity).

    The TS server carried the skill field on the wire and ignored it β€” its own 1.39.0 changelog said so outright ("the TS / Python / Go / .NET servers ignore the field for now"). It now resolves the skill and composes it into the turn:

    • skills.ts β€” isValidSkillName (ASCII alphanumerics + -/_, ≀128 chars, making .., /, \ and NUL unrepresentable rather than filtered), stripFrontmatter (drops the discovery-metadata YAML so the model sees only instructions; unterminated frontmatter is returned untouched rather than swallowing the file), skillSection, and resolveSection.
    • SkillResolver β€” the host seam, via serve({ skillResolver }).
    • DirSkillResolver β€” <root>/<name>/SKILL.md over the :-separated roots in SMOOTH_SKILLS_DIR, first root wins. serve() prefers an explicit resolver, else DirSkillResolver.fromEnv(), mirroring Rust's install_skill_resolver_from_env. Neither β‡’ no resolver, so a multi-tenant deploy never serves host skills by accident.
    • Fail-CLOSED, unlike images: an unresolvable skill returns error { code: "SKILL_NOT_FOUND" } and the turn does not run β€” resolved before the 202 ack, so a client never sees "accepted" for a turn that was never going to happen. A blank/whitespace skill is treated as absent, matching Rust's trim-then-filter.
    • The body is appended to the system prompt, last, so it is the most salient instruction into the turn while the persisted user message stays exactly what the user typed β€” skill prose never accumulates in history to be replayed on every later turn.

    Tests: all five Rust skills.rs unit tests ported under their Rust names, plus over-the-socket coverage for fail-closed (asserting the model is never called), system-prompt-not-user-message placement (including that frontmatter never reaches the model), and blank-as-absent with a resolver installed. 254 server tests green.

    Backward compatible: an absent skill field is byte-for-byte the previous behavior.

@smooai/smooth-operator-server@1.10.0

Minor Changes

  • caa3678: TS server: resolve send_message.skill server-side (Rust PR th-b30a6a: send_message grows an optional skill β€” the engine resolves it, not the clientΒ #338 parity).

    The TS server carried the skill field on the wire and ignored it β€” its own 1.39.0 changelog said so outright ("the TS / Python / Go / .NET servers ignore the field for now"). It now resolves the skill and composes it into the turn:

    • skills.ts β€” isValidSkillName (ASCII alphanumerics + -/_, ≀128 chars, making .., /, \ and NUL unrepresentable rather than filtered), stripFrontmatter (drops the discovery-metadata YAML so the model sees only instructions; unterminated frontmatter is returned untouched rather than swallowing the file), skillSection, and resolveSection.
    • SkillResolver β€” the host seam, via serve({ skillResolver }).
    • DirSkillResolver β€” <root>/<name>/SKILL.md over the :-separated roots in SMOOTH_SKILLS_DIR, first root wins. serve() prefers an explicit resolver, else DirSkillResolver.fromEnv(), mirroring Rust's install_skill_resolver_from_env. Neither β‡’ no resolver, so a multi-tenant deploy never serves host skills by accident.
    • Fail-CLOSED, unlike images: an unresolvable skill returns error { code: "SKILL_NOT_FOUND" } and the turn does not run β€” resolved before the 202 ack, so a client never sees "accepted" for a turn that was never going to happen. A blank/whitespace skill is treated as absent, matching Rust's trim-then-filter.
    • The body is appended to the system prompt, last, so it is the most salient instruction into the turn while the persisted user message stays exactly what the user typed β€” skill prose never accumulates in history to be replayed on every later turn.

    Tests: all five Rust skills.rs unit tests ported under their Rust names, plus over-the-socket coverage for fail-closed (asserting the model is never called), system-prompt-not-user-message placement (including that frontmatter never reaches the model), and blank-as-absent with a resolver installed. 254 server tests green.

    Backward compatible: an absent skill field is byte-for-byte the previous behavior.

@smooai/smooth-operator-web-chat-example@0.0.53

Patch Changes

  • Updated dependencies [caa3678]
    • @smooai/smooth-operator@1.41.0

@brentrager
brentrager force-pushed the changeset-release/main branch from 4f1f102 to 0214cab Compare August 14, 2026 01:20
@brentrager
brentrager merged commit 615527c into main Aug 14, 2026
8 checks passed
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.

1 participant