diff --git a/.github/scripts/build_publish_payload.py b/.github/scripts/build_publish_payload.py index d9023573..bd91cce0 100644 --- a/.github/scripts/build_publish_payload.py +++ b/.github/scripts/build_publish_payload.py @@ -26,6 +26,24 @@ def normalize_dependencies(raw_deps: Any) -> list[dict[str, Any]]: raise ValueError(f"`dependencies` must be a map or list, got {type(raw_deps).__name__}") +def normalize_tags(raw_tags: Any) -> list[str]: + if raw_tags is None: + return [] + if not isinstance(raw_tags, list): + raise ValueError(f"`tags` must be a list, got {type(raw_tags).__name__}") + + normalized: list[str] = [] + seen: set[str] = set() + for tag in raw_tags: + if not isinstance(tag, str): + raise ValueError("tags entries must be strings") + value = tag.strip().lower() + if value and value not in seen: + normalized.append(value) + seen.add(value) + return normalized + + def derive_registry_function_name(function_id: str, metadata: dict[str, Any] | None) -> str: metadata = metadata or {} for key in ("registry_name", "name"): @@ -348,6 +366,10 @@ def build_payload( ], } + tags = normalize_tags(meta.get("tags")) + if tags: + payload["tags"] = tags + if deploy == "binary": if not binaries: raise ValueError("deploy=binary requires non-empty binaries") diff --git a/.github/scripts/tests/test_build_publish_payload.py b/.github/scripts/tests/test_build_publish_payload.py new file mode 100644 index 00000000..c0b78589 --- /dev/null +++ b/.github/scripts/tests/test_build_publish_payload.py @@ -0,0 +1,55 @@ +"""Tests for registry payload metadata assembled from iii.worker.yaml.""" +from pathlib import Path + +import pytest +from build_publish_payload import build_payload + + +def build_binary_payload(tmp_path: Path, manifest: str) -> dict[str, object]: + worker_dir = tmp_path / "smoke" + worker_dir.mkdir(parents=True) + (worker_dir / "iii.worker.yaml").write_text(manifest) + (worker_dir / "README.md").write_text("# smoke\n") + return build_payload( + repo_root=tmp_path, + worker="smoke", + version="1.0.0", + registry_tag="latest", + deploy="binary", + repo_url="https://github.com/iii-hq/workers", + interface={"functions": [], "triggers": []}, + binaries={"x86_64-unknown-linux-gnu": {"url": "https://example.test/smoke.tgz"}}, + image_tag="", + ) + + +def test_manifest_tags_are_normalized_validated_and_optional(tmp_path: Path) -> None: + payload = build_binary_payload( + tmp_path, + "name: smoke\ntags:\n - ' SQL '\n - postgres\n - sql\n - ' '\n", + ) + assert payload["tags"] == ["sql", "postgres"] + + without_tags = tmp_path / "without-tags" + payload = build_binary_payload(without_tags, "name: smoke\n") + assert "tags" not in payload + + empty_tags = tmp_path / "empty-tags" + payload = build_binary_payload(empty_tags, "name: smoke\ntags: []\n") + assert "tags" not in payload + + whitespace_tags = tmp_path / "whitespace-tags" + payload = build_binary_payload(whitespace_tags, "name: smoke\ntags:\n - ' '\n") + assert "tags" not in payload + + scalar = tmp_path / "scalar" + with pytest.raises(ValueError, match="`tags` must be a list"): + build_binary_payload(scalar, "name: smoke\ntags: sql\n") + + empty_scalar = tmp_path / "empty-scalar" + with pytest.raises(ValueError, match="`tags` must be a list"): + build_binary_payload(empty_scalar, "name: smoke\ntags: ''\n") + + invalid = tmp_path / "invalid" + with pytest.raises(ValueError, match="tags entries must be strings"): + build_binary_payload(invalid, "name: smoke\ntags:\n - sql\n - 7\n") diff --git a/.github/scripts/tests/test_validate_worker.py b/.github/scripts/tests/test_validate_worker.py index 75bfd505..900646a5 100644 --- a/.github/scripts/tests/test_validate_worker.py +++ b/.github/scripts/tests/test_validate_worker.py @@ -6,8 +6,6 @@ import sys from pathlib import Path -import pytest - from _test_helpers import GIT_HERMETIC_ENV SCRIPT = Path(__file__).resolve().parents[1] / "validate_worker.py" @@ -101,6 +99,23 @@ def test_wrong_deploy_value_fails(self, tmp_path): assert r.returncode != 0 assert "deploy" in r.stdout + r.stderr + def test_invalid_tags_fail(self, tmp_path): + for case, tags_yaml, expected in [ + ("scalar", "tags: sql\n", "must be a list"), + ("entry", "tags:\n - sql\n - 7\n", "entries must be strings"), + ]: + case_root = tmp_path / case + case_root.mkdir() + repo = make_worker(case_root, "smoke") + meta = repo / "smoke" / "iii.worker.yaml" + meta.write_text(meta.read_text() + tags_yaml) + init_git(repo) + + r = run_script(repo, "smoke", source_changed=["smoke"]) + + assert r.returncode != 0 + assert expected in r.stdout + r.stderr + def test_binary_bin_name_mismatch_fails(self, tmp_path): # A binary worker whose `bin` differs from the worker name ships a # release archive the resolver can't find (web/v1.1.x regression). diff --git a/.github/scripts/validate_worker.py b/.github/scripts/validate_worker.py index 9d8b9ddd..24ab1cb2 100644 --- a/.github/scripts/validate_worker.py +++ b/.github/scripts/validate_worker.py @@ -118,6 +118,12 @@ def soft(msg: str) -> None: hard( f"{worker}/iii.worker.yaml language must be 'rust' | 'node' | 'python' | 'javascript'" ) + tags = m.raw.get("tags") + if tags is not None: + if not isinstance(tags, list): + hard(f"{worker}/iii.worker.yaml tags must be a list") + elif any(not isinstance(tag, str) for tag in tags): + hard(f"{worker}/iii.worker.yaml tags entries must be strings") # The release archive's binary is named after `bin` (defaulting to the # worker name); the resolver looks it up by worker name. They must match # or `iii worker add {worker}` fails with "Binary not found in archive". diff --git a/approval-gate/iii.worker.yaml b/approval-gate/iii.worker.yaml index 360c5d44..727ac729 100644 --- a/approval-gate/iii.worker.yaml +++ b/approval-gate/iii.worker.yaml @@ -4,6 +4,7 @@ language: rust deploy: binary manifest: Cargo.toml bin: approval-gate +tags: [approval, human-in-the-loop, permissions, policy, security] description: Policy and decision surface for human-held function calls — pre_trigger gate, pending inbox, per-session permission settings, and two notification trigger types. dependencies: diff --git a/bridge/iii.worker.yaml b/bridge/iii.worker.yaml index 7ed6b5e1..dc07938e 100644 --- a/bridge/iii.worker.yaml +++ b/bridge/iii.worker.yaml @@ -4,6 +4,7 @@ language: rust deploy: binary manifest: Cargo.toml bin: bridge +tags: [bridge, remote, websocket, federation, engine] description: Bridge two iii engines — expose local functions on a remote engine and invoke/forward remote functions locally. config: url: ws://0.0.0.0:49134 diff --git a/browser/iii.worker.yaml b/browser/iii.worker.yaml index 0e105864..76a762c9 100644 --- a/browser/iii.worker.yaml +++ b/browser/iii.worker.yaml @@ -4,4 +4,5 @@ language: rust deploy: binary manifest: Cargo.toml bin: browser +tags: [browser, chromium, automation, web, cdp] description: Interactive Chromium sessions on the iii bus. Navigate, act, read the page console, pick elements. diff --git a/claude-code/iii.worker.yaml b/claude-code/iii.worker.yaml index 3002f8f9..c67b1baf 100644 --- a/claude-code/iii.worker.yaml +++ b/claude-code/iii.worker.yaml @@ -3,6 +3,7 @@ name: claude-code language: javascript deploy: bundle manifest: package.json +tags: [coding-agent, claude, anthropic, cli, headless] description: Claude Code as an iii worker — claude::* functions run headless Claude Code turns, mirror raw messages onto claude::events, and stream AgentEvent frames onto agent::events. runtime: diff --git a/codex/iii.worker.yaml b/codex/iii.worker.yaml index 02e0d962..4265038f 100644 --- a/codex/iii.worker.yaml +++ b/codex/iii.worker.yaml @@ -4,4 +4,5 @@ language: rust deploy: binary manifest: Cargo.toml bin: codex +tags: [coding-agent, openai, codex-cli, headless, agent] description: OpenAI Codex as an iii worker; codex::run/start/stop/status/sessions::list spawn the codex CLI for headless turns, mirror raw thread events onto codex::events, and stream AgentEvent frames onto agent::events. diff --git a/console/iii.worker.yaml b/console/iii.worker.yaml index fbd38b21..44e58457 100644 --- a/console/iii.worker.yaml +++ b/console/iii.worker.yaml @@ -4,4 +4,5 @@ language: rust deploy: binary manifest: Cargo.toml bin: console +tags: [console, dashboard, ui, web, admin] description: Web console for iii — bundles the React UI and proxies the engine WebSocket on a single port. diff --git a/context-manager/iii.worker.yaml b/context-manager/iii.worker.yaml index 36c8fa1e..dba96c90 100644 --- a/context-manager/iii.worker.yaml +++ b/context-manager/iii.worker.yaml @@ -4,6 +4,7 @@ language: rust deploy: binary manifest: Cargo.toml bin: context-manager +tags: [context, tokens, compaction, pruning, llm] description: Turns a raw conversation history plus a target model into a model-ready context — token counting, function-result pruning, and history compaction. dependencies: diff --git a/cron/iii.worker.yaml b/cron/iii.worker.yaml index 92e65828..6c8e1b3a 100644 --- a/cron/iii.worker.yaml +++ b/cron/iii.worker.yaml @@ -4,6 +4,7 @@ language: rust deploy: binary manifest: Cargo.toml bin: cron +tags: [cron, schedule, timer, job] description: Schedule functions with cron expressions - registers the `cron` trigger type. config: adapter: diff --git a/database/iii.worker.yaml b/database/iii.worker.yaml index 2698d88d..10c01bcb 100644 --- a/database/iii.worker.yaml +++ b/database/iii.worker.yaml @@ -4,4 +4,5 @@ language: rust deploy: binary manifest: Cargo.toml bin: database +tags: [sql, sqlite, postgres, mysql, db] description: Talk to PostgreSQL, MySQL, and SQLite from iii — query, execute, transactions, prepared statements, and change feeds. diff --git a/devin/iii.worker.yaml b/devin/iii.worker.yaml index 3539eff6..b80e41f7 100644 --- a/devin/iii.worker.yaml +++ b/devin/iii.worker.yaml @@ -4,4 +4,5 @@ language: rust deploy: binary manifest: Cargo.toml bin: devin +tags: [coding-agent, devin, cloud, pr-review, agent] description: Devin CLI + API as an iii worker; devin::run/start/stop/status/sessions::list follow the agent-worker family and stream AgentEvent frames onto agent::events, devin::session::* wrap the Devin cloud session lifecycle, devin::pr-review::* exposes Devin's review surface, and devin::api reaches any Devin v1/v3 endpoint. diff --git a/docs/architecture/iii-worker-yaml.md b/docs/architecture/iii-worker-yaml.md index 83f0c2f7..0211d6b6 100644 --- a/docs/architecture/iii-worker-yaml.md +++ b/docs/architecture/iii-worker-yaml.md @@ -33,6 +33,19 @@ aarch64 gnu, and armv7 gnueabihf (the matrix lives in | `interface_smoke: false` | Skip interface boot smoke + registry publish | `ci.yml`, `release.yml` | | `runtime` / `scripts.start` | Local boot definition; presence routes publish boot to `iii-add` for non-binary/bundle deploys | `manifest_version.py deploy-mode`, `iii worker add` | | `scripts.install` | Build command for local install | `iii worker add` (local source) | +| `tags` | Optional discovery aliases included in `POST /publish` | `build_publish_payload.py` | + +`tags` must be a list of strings. The publish pipeline trims values, converts them to lowercase, +removes duplicates, and omits the field when no non-empty tags remain. +Workers with `interface_smoke: false` skip registry publishing entirely, so their manifests do not +declare tags. + +```yaml +tags: + - http + - rest + - api +``` ## Bundle-specific diff --git a/docs/sops/release.md b/docs/sops/release.md index 7335875b..cd28d44f 100644 --- a/docs/sops/release.md +++ b/docs/sops/release.md @@ -84,7 +84,7 @@ flowchart LR - `cargo-run` — `cargo run` from source (remaining Rust workers) 3. Uses `config.collect.yaml` when present (sidecar-free boot). 4. Collects function + trigger interface (120 s timeout); asserts non-empty. -5. Resolves release assets into `payload.json`. +5. Resolves release assets and normalized manifest `tags` into `payload.json`. 6. `POST /publish` to `https://api.workers.iii.dev`. 7. `POST /w//skills` when `skills/*.md` exist (skipped when absent). diff --git a/email/iii.worker.yaml b/email/iii.worker.yaml index 4046bfb1..0b7cd3a9 100644 --- a/email/iii.worker.yaml +++ b/email/iii.worker.yaml @@ -4,6 +4,7 @@ language: rust deploy: binary manifest: Cargo.toml bin: email +tags: [email, smtp, imap, inbox, messaging] description: Email worker — SMTP send and real-time IMAP read with IDLE push (email::*). runtime: diff --git a/fp/iii.worker.yaml b/fp/iii.worker.yaml index bf6cca6c..41402272 100644 --- a/fp/iii.worker.yaml +++ b/fp/iii.worker.yaml @@ -4,4 +4,5 @@ language: rust deploy: binary manifest: Cargo.toml bin: fp +tags: [fp, functional, pipeline, transform, lodash] description: Lodash-style value transforms (fp::get/pick/take/…) and fp::pipe — worker-side pipelines that move big values function→function without routing them through the model. diff --git a/grok/iii.worker.yaml b/grok/iii.worker.yaml index f377a7bf..bd1b34a7 100644 --- a/grok/iii.worker.yaml +++ b/grok/iii.worker.yaml @@ -4,4 +4,5 @@ language: rust deploy: binary manifest: Cargo.toml bin: grok +tags: [coding-agent, grok, xai, cli, headless] description: xAI Grok CLI as an iii worker; grok::run/start/stop/status/sessions::list spawn the grok CLI for headless turns, mirror raw streaming-json events onto grok::events, and stream AgentEvent frames onto agent::events. diff --git a/harness/iii.worker.yaml b/harness/iii.worker.yaml index b374dc08..e1d06c6a 100644 --- a/harness/iii.worker.yaml +++ b/harness/iii.worker.yaml @@ -4,6 +4,7 @@ language: rust deploy: binary manifest: Cargo.toml bin: harness +tags: [agent, harness, loop, autonomous] description: Thin durable turn loop that wires session-manager, context-manager, and llm-router into an agent loop; spawns sub-agents as child sessions. dependencies: diff --git a/hermes/iii.worker.yaml b/hermes/iii.worker.yaml index 1e389755..8e45b464 100644 --- a/hermes/iii.worker.yaml +++ b/hermes/iii.worker.yaml @@ -3,6 +3,7 @@ name: hermes language: python deploy: image manifest: pyproject.toml +tags: [agent, messaging, chat, webhook, multi-channel] description: Hermes agent as an iii worker — hermes::run runs headless Hermes turns with the iii runtime context, hermes::send delivers to 27+ messaging platforms, and inbound platform/webhook deliveries are republished onto hermes::events for iii workers to react to. env: diff --git a/http/iii.worker.yaml b/http/iii.worker.yaml index b6809a4d..35deed30 100644 --- a/http/iii.worker.yaml +++ b/http/iii.worker.yaml @@ -4,6 +4,7 @@ language: rust deploy: binary manifest: Cargo.toml bin: http +tags: [http, rest, api, endpoint] description: Expose functions as HTTP endpoints — registers the `http` trigger type and serves matched routes. config: port: 3111 diff --git a/iii-directory/iii.worker.yaml b/iii-directory/iii.worker.yaml index 9ac44132..5809d66c 100644 --- a/iii-directory/iii.worker.yaml +++ b/iii-directory/iii.worker.yaml @@ -4,6 +4,7 @@ language: rust deploy: binary manifest: Cargo.toml bin: iii-directory +tags: [introspect, registry, skills, directory] description: Engine introspection (functions / triggers / workers), workers registry proxy, and filesystem-backed skill + prompt reader. dependencies: diff --git a/image-resize/iii.worker.yaml b/image-resize/iii.worker.yaml index 6f921b4c..af7f364f 100644 --- a/image-resize/iii.worker.yaml +++ b/image-resize/iii.worker.yaml @@ -4,4 +4,5 @@ language: rust deploy: binary manifest: Cargo.toml bin: image-resize +tags: [image, resize, jpeg, png, webp, media] description: III engine image resize worker (JPEG/PNG/WebP, EXIF orient, scale-to-fit / crop-to-fit) diff --git a/llm-router/iii.worker.yaml b/llm-router/iii.worker.yaml index 66a9a480..c7664c1c 100644 --- a/llm-router/iii.worker.yaml +++ b/llm-router/iii.worker.yaml @@ -4,6 +4,7 @@ language: rust deploy: binary manifest: Cargo.toml bin: llm-router +tags: [llm, router, models, providers] description: One front door + provider protocol in front of every LLM provider. dependencies: diff --git a/mcp/iii.worker.yaml b/mcp/iii.worker.yaml index 81c09013..4392f974 100644 --- a/mcp/iii.worker.yaml +++ b/mcp/iii.worker.yaml @@ -4,6 +4,7 @@ language: rust deploy: binary manifest: Cargo.toml bin: mcp +tags: [mcp, model-context-protocol, bridge, http, agents] description: MCP 2025-06-18 Streamable HTTP bridge for the iii engine. dependencies: diff --git a/memory-consolidate/iii.worker.yaml b/memory-consolidate/iii.worker.yaml index 208d749c..afec79fd 100644 --- a/memory-consolidate/iii.worker.yaml +++ b/memory-consolidate/iii.worker.yaml @@ -4,6 +4,7 @@ language: rust deploy: binary manifest: Cargo.toml bin: memory-consolidate +tags: [memory, deduplication, cleanup, schedule, maintenance] description: Scheduled hygiene for the memory worker — deterministic dedup of near-duplicate memories, applied supersede-only through the public memory functions, pinned untouchable, with catch-up-on-boot scheduling. Install, stop, or remove it without touching stored memory. dependencies: diff --git a/memory/iii.worker.yaml b/memory/iii.worker.yaml index 70c6bbf0..789b12b7 100644 --- a/memory/iii.worker.yaml +++ b/memory/iii.worker.yaml @@ -4,6 +4,7 @@ language: rust deploy: binary manifest: Cargo.toml bin: memory +tags: [memory, rag, bm25, recall, agent, context] description: Durable cross-session agent memory — named banks of always-injected markdown rules and auto-extracted memories, hybrid BM25 + entity recall, pinning, and supersede-never-delete history. Plain files on disk; every operation is a traced function. dependencies: diff --git a/opencode/iii.worker.yaml b/opencode/iii.worker.yaml index 0f68ad27..a7eb76d0 100644 --- a/opencode/iii.worker.yaml +++ b/opencode/iii.worker.yaml @@ -3,6 +3,7 @@ name: opencode language: javascript deploy: bundle manifest: package.json +tags: [coding-agent, opencode, cli, headless, agent] description: OpenCode as an iii worker — opencode::* functions run headless OpenCode turns, mirror raw JSON events onto opencode::events, and stream AgentEvent frames onto agent::events. runtime: diff --git a/pi/iii.worker.yaml b/pi/iii.worker.yaml index 8aa9537e..139f6249 100644 --- a/pi/iii.worker.yaml +++ b/pi/iii.worker.yaml @@ -3,6 +3,7 @@ name: pi language: javascript deploy: bundle manifest: package.json +tags: [coding-agent, pi, cli, headless, agent] description: Pi coding agent as an iii worker — pi::* functions run headless Pi turns, mirror raw events onto pi::events, and stream AgentEvent frames onto agent::events. runtime: diff --git a/provider-anthropic/iii.worker.yaml b/provider-anthropic/iii.worker.yaml index 7895f34e..b0de2887 100644 --- a/provider-anthropic/iii.worker.yaml +++ b/provider-anthropic/iii.worker.yaml @@ -4,6 +4,7 @@ language: rust deploy: binary manifest: Cargo.toml bin: provider-anthropic +tags: [llm, anthropic, claude, messages, provider] description: Anthropic Messages API provider worker; implements provider::anthropic::stream and provider::anthropic::refresh_models behind llm-router. dependencies: diff --git a/provider-kimi/iii.worker.yaml b/provider-kimi/iii.worker.yaml index 54f0d8f5..58e7d4c7 100644 --- a/provider-kimi/iii.worker.yaml +++ b/provider-kimi/iii.worker.yaml @@ -4,6 +4,7 @@ language: rust deploy: binary manifest: Cargo.toml bin: provider-kimi +tags: [llm, kimi, moonshot, chat-completions, provider] description: Moonshot (Kimi) Chat Completions provider worker; implements provider::kimi::stream and provider::kimi::refresh_models behind llm-router. dependencies: diff --git a/provider-llamacpp/iii.worker.yaml b/provider-llamacpp/iii.worker.yaml index e479a3bf..29282c03 100644 --- a/provider-llamacpp/iii.worker.yaml +++ b/provider-llamacpp/iii.worker.yaml @@ -4,6 +4,7 @@ language: rust deploy: binary manifest: Cargo.toml bin: provider-llamacpp +tags: [llm, llama.cpp, local, open-source, provider] description: llama.cpp server (llama-server) Chat Completions provider worker; implements provider::llamacpp::stream and provider::llamacpp::refresh_models behind llm-router. dependencies: diff --git a/provider-openai-codex/iii.worker.yaml b/provider-openai-codex/iii.worker.yaml index 2556a894..6c167a63 100644 --- a/provider-openai-codex/iii.worker.yaml +++ b/provider-openai-codex/iii.worker.yaml @@ -4,6 +4,7 @@ language: rust deploy: binary manifest: Cargo.toml bin: provider-openai-codex +tags: [llm, openai, codex, chatgpt, subscription, provider] description: OpenAI Codex (ChatGPT subscription) provider; implements provider::openai-codex::stream and provider::openai-codex::refresh_models behind llm-router, sourcing credentials from the auth-credentials vault. dependencies: diff --git a/provider-openai/iii.worker.yaml b/provider-openai/iii.worker.yaml index 48e81aed..346bc297 100644 --- a/provider-openai/iii.worker.yaml +++ b/provider-openai/iii.worker.yaml @@ -4,6 +4,7 @@ language: rust deploy: binary manifest: Cargo.toml bin: provider-openai +tags: [llm, openai, responses, chat-completions, provider] description: OpenAI Responses provider worker with Chat Completions compatibility; implements provider::openai::stream and provider::openai::refresh_models behind llm-router. dependencies: diff --git a/provider-xai/iii.worker.yaml b/provider-xai/iii.worker.yaml index 09861531..a4c22914 100644 --- a/provider-xai/iii.worker.yaml +++ b/provider-xai/iii.worker.yaml @@ -4,6 +4,7 @@ language: rust deploy: binary manifest: Cargo.toml bin: provider-xai +tags: [llm, xai, grok, chat-completions, provider] description: xAI Chat Completions provider worker; implements provider::xai::stream and provider::xai::refresh_models behind llm-router. dependencies: diff --git a/provider-zai/iii.worker.yaml b/provider-zai/iii.worker.yaml index 518defbe..d497bf50 100644 --- a/provider-zai/iii.worker.yaml +++ b/provider-zai/iii.worker.yaml @@ -4,6 +4,7 @@ language: rust deploy: binary manifest: Cargo.toml bin: provider-zai +tags: [llm, zai, glm, chat-completions, provider] description: Z.AI Chat Completions provider worker; implements provider::zai::stream and provider::zai::refresh_models behind llm-router. dependencies: diff --git a/pubsub/iii.worker.yaml b/pubsub/iii.worker.yaml index 307bad48..54bcfc02 100644 --- a/pubsub/iii.worker.yaml +++ b/pubsub/iii.worker.yaml @@ -4,6 +4,7 @@ language: rust deploy: binary manifest: Cargo.toml bin: pubsub +tags: [pubsub, messaging, events, topics] description: Topic-based publish/subscribe messaging — registers the `subscribe` trigger type and the `publish` function. config: adapter: diff --git a/queue/iii.worker.yaml b/queue/iii.worker.yaml index be73d09b..63e5e3c3 100644 --- a/queue/iii.worker.yaml +++ b/queue/iii.worker.yaml @@ -4,6 +4,7 @@ language: rust deploy: binary manifest: Cargo.toml bin: queue +tags: [queue, async, jobs, retry, rabbitmq, redis] description: Durable function queues - registers the `durable:subscriber` trigger type and the queue/DLQ service functions. # `config` seeds the `configuration` worker's `queue` entry on first boot; # runtime edits after that go through the configuration worker, not this diff --git a/rbac-proxy/iii.worker.yaml b/rbac-proxy/iii.worker.yaml index 2155dc3e..3d0e1849 100644 --- a/rbac-proxy/iii.worker.yaml +++ b/rbac-proxy/iii.worker.yaml @@ -4,6 +4,7 @@ language: rust deploy: binary manifest: Cargo.toml bin: rbac-proxy +tags: [rbac, authorization, security, proxy, middleware] description: "RBAC boundary proxy for the iii worker protocol — auth, gating, namespacing, middleware, and engine:: result filtering on its own port." dependencies: diff --git a/scrapling/iii.worker.yaml b/scrapling/iii.worker.yaml index 341e0f46..faee7330 100644 --- a/scrapling/iii.worker.yaml +++ b/scrapling/iii.worker.yaml @@ -9,6 +9,7 @@ name: scrapling language: python deploy: bundle manifest: pyproject.toml +tags: [scraping, browser, crawler, anti-bot, extraction, http] description: >- Scrapling as an iii worker — scrapling::* functions run HTTP / anti-bot / browser fetches, CSS/XPath/regex/adaptive extraction, persistent sessions, diff --git a/session-manager/iii.worker.yaml b/session-manager/iii.worker.yaml index 062635e0..287fe5b5 100644 --- a/session-manager/iii.worker.yaml +++ b/session-manager/iii.worker.yaml @@ -4,6 +4,7 @@ language: rust deploy: binary manifest: Cargo.toml bin: session-manager +tags: [session, conversation, chat, history] description: Durable, reactive, branching store of typed conversation entries with six emitted trigger types. dependencies: diff --git a/shell/iii.worker.yaml b/shell/iii.worker.yaml index 57e72233..e4575e11 100644 --- a/shell/iii.worker.yaml +++ b/shell/iii.worker.yaml @@ -4,6 +4,7 @@ language: rust deploy: binary manifest: Cargo.toml bin: shell +tags: [shell, exec, filesystem, bash, terminal] description: Unix shell + filesystem worker — exec with denylist/timeout/output caps and background jobs; fs::ls|stat|mkdir|rm|chmod|mv|grep|sed|read|write with host jail, denylist, size caps, and sandbox-target forwarding # POSIX-only: src/fs/host.rs uses std::os::unix::fs::PermissionsExt / chown / diff --git a/slack/iii.worker.yaml b/slack/iii.worker.yaml index f3fc0d3c..f6db057a 100644 --- a/slack/iii.worker.yaml +++ b/slack/iii.worker.yaml @@ -4,6 +4,7 @@ language: rust deploy: binary manifest: Cargo.toml bin: slack +tags: [slack, messaging, chat, bot, approvals] description: Slack as an iii worker — exposes the Slack Web API as slack::* functions, plus a harness bridge (inbound events → harness::send, native streaming, approvals). Configurable from the console. dependencies: diff --git a/state/iii.worker.yaml b/state/iii.worker.yaml index 78342972..8a230c34 100644 --- a/state/iii.worker.yaml +++ b/state/iii.worker.yaml @@ -4,6 +4,7 @@ language: rust deploy: binary manifest: Cargo.toml bin: state +tags: [key-value, kv, state, distributed, cache] description: Distributed key-value state management with reactive change triggers — registers the `state` trigger type and the `state::*` functions. config: adapter: diff --git a/storage/iii.worker.yaml b/storage/iii.worker.yaml index 1ac9bc74..d7cb9dfa 100644 --- a/storage/iii.worker.yaml +++ b/storage/iii.worker.yaml @@ -4,4 +4,5 @@ language: rust deploy: binary manifest: Cargo.toml bin: storage +tags: [s3, object-storage, gcs, r2, blob] description: S3-compatible object storage across AWS S3, GCS, Cloudflare R2, and a managed local rustfs backend. Streamed uploads, presigned URLs, and object change triggers. diff --git a/telegram-bot/iii.worker.yaml b/telegram-bot/iii.worker.yaml index ebdec45a..d301b236 100644 --- a/telegram-bot/iii.worker.yaml +++ b/telegram-bot/iii.worker.yaml @@ -4,6 +4,7 @@ language: rust deploy: binary manifest: Cargo.toml bin: telegram-bot +tags: [telegram, bot, messaging, chat, webhook] description: Telegram bridge to the harness stack — polling or webhook ingress, live message edits, approvals, and configurable verbosity. dependencies: diff --git a/web/iii.worker.yaml b/web/iii.worker.yaml index 518adb83..8d363dca 100644 --- a/web/iii.worker.yaml +++ b/web/iii.worker.yaml @@ -4,6 +4,7 @@ language: rust deploy: binary manifest: Cargo.toml bin: web +tags: [http, client, fetch, rest, api] description: Outbound HTTP client on the iii bus (web::fetch). dependencies: diff --git a/workflow/iii.worker.yaml b/workflow/iii.worker.yaml index 919f940b..d1b704b6 100644 --- a/workflow/iii.worker.yaml +++ b/workflow/iii.worker.yaml @@ -4,4 +4,5 @@ language: rust deploy: binary manifest: Cargo.toml bin: workflow +tags: [workflow, orchestration, multi-agent, durable, automation] description: Deterministic, crash-resumable multi-agent workflow orchestrator over harness turns. \ No newline at end of file diff --git a/worktree/iii.worker.yaml b/worktree/iii.worker.yaml index 20a7a597..3e1483bd 100644 --- a/worktree/iii.worker.yaml +++ b/worktree/iii.worker.yaml @@ -4,6 +4,7 @@ language: rust deploy: binary manifest: Cargo.toml bin: worktree +tags: [git, worktree, parallel, agents, branches, ci] description: Git worktree lifecycle for parallel agents — mint, claim, and track isolated worktrees per repo, emit lifecycle trigger types, and land branches back through a per-repo FIFO queue (rebase, test gate, ff-only merge). dependencies: