Skip to content

feat: migrate workers to namespace-aware iii-sdk 0.22 prereleases - #604

Draft
guibeira wants to merge 76 commits into
mainfrom
feat/new-sdk-migration
Draft

feat: migrate workers to namespace-aware iii-sdk 0.22 prereleases#604
guibeira wants to merge 76 commits into
mainfrom
feat/new-sdk-migration

Conversation

@guibeira

@guibeira guibeira commented Jul 26, 2026

Copy link
Copy Markdown
Collaborator

Summary

Migrates the workers to the namespace-aware iii-sdk 0.22.0 prerelease line. Most workers use 0.22.0-alpha.3; compatibility-sensitive crates that were already pinned to 0.22.0-alpha.2 remain on that version. A worker running with III_NAMESPACE registers its functions and routes cross-worker calls in that namespace, while engine builtins continue to use default. Without a namespace, existing behavior is unchanged.

The branch also incorporates the latest main changes and migrates the workers added since the previous integration.

What changed

SDK upgrade

  • Updates Rust workers and direct iii-helpers dependencies to the compatible 0.22.0-alpha.2 / 0.22.0-alpha.3 pins.
  • Updates the claude-code, opencode, and pi workers to iii-sdk@0.22.0-alpha.3.
  • Aligns the new computer, pdf, editor, eval, sandbox-code-runner, provider-claude-code, and provider-deepseek dependency graphs with the SDK version used by their shared crates.
  • Regenerates Cargo and pnpm lockfiles for the prerelease SDK line.

Namespace adoption

  • Trigger registrations pass each worker's resolved namespace so registrations target the correct worker namespace.
  • Cross-worker calls route to the worker namespace, while engine builtins (state::, stream::, queue::, pubsub::, configuration::, cron::, http::, engine::, sandbox::, log::, secret::, kv::, and iii::) remain in default.
  • Dynamic fan-out, hooks, conditions, ordinary function dispatch, and durable trigger delivery keep builtin-aware routing.
  • Provider-to-router registration paths are namespaced so providers and the router can operate together outside the default namespace.

Main integration

  • Integrates the latest main release, console UI, provider, computer, PDF, sandbox runner, and durable trigger-binding changes.
  • Keeps the new injectable console UI path dependencies while allowing the shared crate to unify with the branch's alpha.2 and alpha.3 SDK pins.
  • Adopts the current durable trigger-binding architecture and removes the obsolete harness::react implementation deleted on main.
  • Preserves namespace routing in the replacement binding delivery, hook, condition, and generic dispatch paths.

Validation

  • cargo test --manifest-path harness/Cargo.toml --lib --locked — 305 tests passed.
  • cargo check --locked for the conflicted crates and every worker linked to the shared console UI crate.
  • cargo check --locked for provider-claude-code and provider-deepseek after aligning them with llm-router.
  • cargo fmt --check for the Rust crates adapted during the integration.

Notes

  • The remaining Rust 0.21.x pins are limited to the harness test-support crates and the isolated workers-dev local orchestrator.

@vercel

vercel Bot commented Jul 26, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
workers Ready Ready Preview Aug 6, 2026 10:29pm
workers-tech-spec Ready Ready Preview Aug 6, 2026 10:29pm

Request Review

@coderabbitai

coderabbitai Bot commented Jul 26, 2026

Copy link
Copy Markdown

Important

Review skipped

Draft detected.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 34cbdbd7-2321-483f-8e69-46329e7dfd07

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/new-sdk-migration

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

skill-check — worker

0 verified, 55 skipped (no docs/).

Layer Result
structure
vale
ai
render

Four for four. Nicely done.

@guibeira guibeira changed the title feat: migrate all workers to iii-sdk 0.22.0-alpha.2 with namespace support feat: migrate all workers to iii-sdk 0.22.0-alpha.3 with namespace support Jul 27, 2026
@guibeira guibeira added the no-ticket PR deliberately has no Linear ticket (bump/typo/CI-only) label Jul 27, 2026
@guibeira guibeira changed the title feat: migrate all workers to iii-sdk 0.22.0-alpha.3 with namespace support feat: migrate all workers to iii-sdk 0.22.0-alpha.5 with namespace support Jul 29, 2026
@guibeira
guibeira force-pushed the feat/new-sdk-migration branch from b62355b to 8b60e96 Compare July 31, 2026 23:23
guibeira added 20 commits August 2, 2026 15:18
Non-builtin cross-worker trigger calls (e.g. router::/harness::/approval::/session::/context::/shell::/workflow:: and this worker's own functions) issued a TriggerRequest with no namespace, so a worker running in a namespace called those targets in default and missed them. Route each to the worker's namespace via iii.namespace() (None => engine default). Builtin targets (state::/stream::/queue::/pubsub::/configuration::/cron::/http::/engine::/...) intentionally stay in default.
…espace

Non-builtin cross-worker trigger calls (e.g. router::/harness::/approval::/session::/context::/shell::/workflow:: and this worker's own functions) issued a TriggerRequest with no namespace, so a worker running in a namespace called those targets in default and missed them. Route each to the worker's namespace via iii.namespace() (None => engine default). Builtin targets (state::/stream::/queue::/pubsub::/configuration::/cron::/http::/engine::/...) intentionally stay in default.
Non-builtin cross-worker trigger calls (e.g. router::/harness::/approval::/session::/context::/shell::/workflow:: and this worker's own functions) issued a TriggerRequest with no namespace, so a worker running in a namespace called those targets in default and missed them. Route each to the worker's namespace via iii.namespace() (None => engine default). Builtin targets (state::/stream::/queue::/pubsub::/configuration::/cron::/http::/engine::/...) intentionally stay in default.
Non-builtin cross-worker trigger calls (e.g. router::/harness::/approval::/session::/context::/shell::/workflow:: and this worker's own functions) issued a TriggerRequest with no namespace, so a worker running in a namespace called those targets in default and missed them. Route each to the worker's namespace via iii.namespace() (None => engine default). Builtin targets (state::/stream::/queue::/pubsub::/configuration::/cron::/http::/engine::/...) intentionally stay in default.
Non-builtin cross-worker trigger calls (e.g. router::/harness::/approval::/session::/context::/shell::/workflow:: and this worker's own functions) issued a TriggerRequest with no namespace, so a worker running in a namespace called those targets in default and missed them. Route each to the worker's namespace via iii.namespace() (None => engine default). Builtin targets (state::/stream::/queue::/pubsub::/configuration::/cron::/http::/engine::/...) intentionally stay in default.
Non-builtin cross-worker trigger calls (e.g. router::/harness::/approval::/session::/context::/shell::/workflow:: and this worker's own functions) issued a TriggerRequest with no namespace, so a worker running in a namespace called those targets in default and missed them. Route each to the worker's namespace via iii.namespace() (None => engine default). Builtin targets (state::/stream::/queue::/pubsub::/configuration::/cron::/http::/engine::/...) intentionally stay in default.
Dynamic subscriber/hook/notify targets carry a runtime function_id that can be either a builtin (e.g. state::set) or another worker's function. Route these to the worker's namespace ONLY when the target is NOT a builtin prefix; builtins keep default routing so a builtin subscribed to an event still resolves. Literal cross-worker targets are unchanged.
Dynamic subscriber/hook/notify targets carry a runtime function_id that can be either a builtin (e.g. state::set) or another worker's function. Route these to the worker's namespace ONLY when the target is NOT a builtin prefix; builtins keep default routing so a builtin subscribed to an event still resolves. Literal cross-worker targets are unchanged.
Dynamic subscriber/hook/notify targets carry a runtime function_id that can be either a builtin (e.g. state::set) or another worker's function. Route these to the worker's namespace ONLY when the target is NOT a builtin prefix; builtins keep default routing so a builtin subscribed to an event still resolves. Literal cross-worker targets are unchanged.
Dynamic subscriber/hook/notify targets carry a runtime function_id that can be either a builtin (e.g. state::set) or another worker's function. Route these to the worker's namespace ONLY when the target is NOT a builtin prefix; builtins keep default routing so a builtin subscribed to an event still resolves. Literal cross-worker targets are unchanged.
Dynamic subscriber/hook/notify targets carry a runtime function_id that can be either a builtin (e.g. state::set) or another worker's function. Route these to the worker's namespace ONLY when the target is NOT a builtin prefix; builtins keep default routing so a builtin subscribed to an event still resolves. Literal cross-worker targets are unchanged.
…heck

Dynamic subscriber/hook/notify targets carry a runtime function_id that can be either a builtin (e.g. state::set) or another worker's function. Route these to the worker's namespace ONLY when the target is NOT a builtin prefix; builtins keep default routing so a builtin subscribed to an event still resolves. Literal cross-worker targets are unchanged.
…heck

Dynamic subscriber/hook/notify targets carry a runtime function_id that can be either a builtin (e.g. state::set) or another worker's function. Route these to the worker's namespace ONLY when the target is NOT a builtin prefix; builtins keep default routing so a builtin subscribed to an event still resolves. Literal cross-worker targets are unchanged.
Picks up the namespace review fixes shipped in the 0.22.0-alpha.3 SDK release. Build-verified against the published crates.
Picks up the namespace review fixes shipped in the 0.22.0-alpha.3 SDK release. Build-verified against the published crates.
Picks up the namespace review fixes in the 0.22.0-alpha.3 SDK release.
Picks up the namespace review fixes in the 0.22.0-alpha.3 SDK release.
Picks up the namespace review fixes in the 0.22.0-alpha.3 SDK release.
A worker hardcodes its configuration id, which turns that id into a global
scarce name. Two instances of one worker share a single entry: the second
overwrites the first, and every write wakes both, because the id each watches
is the id being written. Two `state` workers cannot hold different settings,
and two `http` workers cannot bind different ports.

`III_CONFIG_NAME` names the entry a supervisor resolved for this instance, so
the id it reads is the one it was given rather than the one it was compiled
with. The built-in name remains the default, and an empty or blank value falls
back to it, so a worker started by hand — or by a supervisor that does not set
it — behaves exactly as before. Nothing here changes what is read, only where
it is read from.

The format strings that interpolated the id take it as a named argument. A
positional one would have shifted the other placeholders in every macro that
had more than one.
@guibeira guibeira changed the title feat: migrate all workers to iii-sdk 0.22.0-alpha.5 with namespace support feat: migrate workers to namespace-aware iii-sdk 0.22 prereleases Aug 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

no-ticket PR deliberately has no Linear ticket (bump/typo/CI-only)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant