Skip to content

Publish the engine for harnesses: package sets, agents and skills - #196

Merged
somdoron merged 10 commits into
mainfrom
engine-stdlib-set
Oct 10, 2026
Merged

somdoron merged 10 commits into
mainfrom
engine-stdlib-set

Conversation

@somdoron

@somdoron somdoron commented Oct 10, 2026 •

Copy link
Copy Markdown
Contributor

The new Rust agents-server needs the engine from crates.io, and it needs sub-agents and skills inside programs.

  • Package set. Stdlib lets an embedder enable optional packages. Compile, discovery, the capability catalog and host functions all follow it, so the CLI and server behave exactly as before.
  • submilli:agents and submilli:skills. run<T> (typed like llm.call<T>), list, load and readFile, backed by AgentProvider and SkillProvider, whose data can cross a wire. Gated as agent.run and skill.load; invisible unless a harness enables them. Skill names and paths are checked before a provider sees them.
  • Rename. interpreter is now submilli-engine and is ready to publish. Dependents keep their interpreter dependency key, and CI runs a publish dry run. The directory move follows in a separate PR.
  • Fix. Call-site filter derivation now quotes literals the way the blueprint's filter parser reads them.

Tests: the full workspace suite, package tests (network skipped) and the publish dry run pass. No Linear issue was linked.

🤖 Generated with Claude Code

somdoron and others added 10 commits October 10, 2026 17:18
Stdlib names the packages an embedder offers: the core packages plus the
optional ones it enables. Compiling, discovery, the capability catalog and
host-function installation read the same set, so an optional package is
either fully present or fully absent. The existing free functions keep
their behavior through Stdlib::core().

No optional package exists yet.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Call-site derivation escaped only backslash and quote, so a literal holding
`${vars.` became a variable reference and control characters did not round
trip. filter_string_literal now matches the policy's canonical quoting, and
a value no literal can spell contributes no filter, with a warning.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Two optional standard-library packages a harness enables through Stdlib and
implements through a provider trait: AgentProvider runs sub-agents
(agents.run<T>, typed like llm.call<T>, and list), SkillProvider serves
skills (list, load, readFile). Both traits carry owned, serializable data
so a harness can implement them over the wire.

Neither package exists for the submilli CLI or server: importing one there
reports it as not available in this harness, and discovery and the
capability catalog list them only for a set that enables them. agent.run and
skill.load are policy-gated like llm.call, and list() filters each candidate
through the same rule.

The typechecker's llm-only typed-call hook becomes a small registry so
agents.run shares it; llm's diagnostics are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The permission rules, the filter language, session variables and auth-proxy
injection move out of submilli-blueprint into a format-neutral crate, so an
embedder that keeps policy outside a blueprint file evaluates it the same
way. Auth-proxy secrets resolve by name through SecretResolver; the
blueprint ties names to its secrets: block through DeclaredSecrets and the
source-keyed SourceSecretResolver.

Behind the engine feature, submilli_policy::host holds the adapters an
embedder installs on a store: PolicyCheck over a Policy, PolicyAuthProxy
and PolicySecretProvider. submilli-shared keeps the blueprint wiring on top
of them. submilli-blueprint keeps the YAML format, its validation with YAML
paths, and the diff and draft tooling, and re-exports the policy types under
their existing names.

A test in submilli-policy keeps the engine's filter-literal quoting in step
with the policy parser's.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…es.io

The interpreter crate compiles and runs programs, and its name was taken on
crates.io; it is now submilli-engine. Dependents keep their `interpreter`
key through `package = "submilli-engine"`, so their sources are unchanged;
the engine's own tests, unit-test snapshot names, CI and the release skill
use the new name. The directory stays crates/interpreter.

submilli-engine and submilli-policy now publish, with descriptions and
READMEs. The engine's package leaves out its tests and snapshots (2 MiB
compressed). CI packages both with a publish dry run.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Skill names are checked like paths before a provider sees them (one
segment; `:` allowed for namespaced names), providers must match names
byte for byte, and `load` refuses a skill answered under another name.
Refusals before dispatch are recorded as the call's error, echoed input is
truncated, and list() offers only loadable names. The typed agents.run
documents SyntaxError for a non-JSON answer.

Set-taking APIs share one `_for` suffix, the typechecker's schema-checked
path loses its llm-only names, and the free policy functions are hidden
behind the Policy methods.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ment

The directory now matches the crate name. Resolve permission's doc comment
had been stacked on resolve_permission_with_rule; it is back on its function.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Moving the directory touches every file in the crate, which buries the
reviewable change; the move follows in its own PR. The doc comment fix stays.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The engine never depended on the blueprint crate, so extracting
submilli-policy is not needed for this change. The blueprint, shared,
server and CLI sources go back to main; only the engine rename in their
manifests and the resolve_permission doc comment fix remain.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@somdoron somdoron changed the title Publish the engine for harnesses: package sets, agents and skills, submilli-policy Publish the engine for harnesses: package sets, agents and skills Oct 10, 2026
@somdoron
somdoron merged commit d7fd213 into main Oct 10, 2026
4 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