Skip to content
Registry

iii-directory

v1.2.38

Engine introspection, workers registry proxy, filesystem-backed skills, system prompts, and agent profiles, kit install and update with reviewed plans, plus function search ranked by the judge worker (falling back to local hybrid/lexical) with a conditional pre-generate hint.

Install

bash
iii trigger compose::add worker=iii-directory@1.2.38

Run in your project with the iii engine running. Exact versions are immutable and digest-pinned.

iii-directory

Workers registry HTTP proxy and filesystem-backed skills, system prompts, and agent profiles for the iii engine. Every public function sits under a single directory::* namespace, split into five surfaces (all MCP-agnostic):

Surface What clients see When to use it
Skills (directory::skills::*) Enriched listing via directory::skills::list ({ id, title, type, function_id, disable_model_invocation, description, bytes, modified_at } per row), a single-skill reader directory::skills::get { id } returning { id, title, type, function_id, disable_model_invocation, path, body, modified_at } (the full body instead of the list teaser), and directory::skills::index which renders a short per-worker overview document (one ## </code> + first paragraph + <code class="readme-inline-code">read more</code> link per <code class="readme-inline-code">type: index</code> skill). Authored by <code class="readme-inline-code">create</code>, edited by <code class="readme-inline-code">update</code>, removed by <code class="readme-inline-code">delete</code>. <code class="readme-inline-code">title</code> prefers the YAML frontmatter <code class="readme-inline-code">title:</code> (then <code class="readme-inline-code">name:</code>) over the body H1; <code class="readme-inline-code">type</code> is lifted from frontmatter <code class="readme-inline-code">type:</code> (e.g. <code class="readme-inline-code">index</code>, <code class="readme-inline-code">how-to</code>, <code class="readme-inline-code">reference</code>) and serialised as <code class="readme-inline-code">null</code> when absent. System-installed agent skills under the read-only <code class="readme-inline-code">agents_skills_folder</code> are served too (see <a href="#on-disk-layout">On-disk layout</a>).</td> <td>Orientation: "when and why to use my worker's tools"</td> </tr> <tr> <td><strong>System prompts</strong> (<code class="readme-inline-code">directory::system-prompts::*</code>)</td> <td>Identity prompts listed by <code class="readme-inline-code">list</code>, read by <code class="readme-inline-code">get</code>, authored by <code class="readme-inline-code">create</code>, edited by <code class="readme-inline-code">update</code>, and removed by <code class="readme-inline-code">delete</code>. The list response keeps its <code class="readme-inline-code">prompts</code> field name. Stored under any <code class="readme-inline-code">system-prompts/</code> path segment; <code class="readme-inline-code">create</code> writes <code class="readme-inline-code"><skills_folder>/system-prompts/<name>.md</code>.</td> <td>What the chat's system-prompt picker offers as an identity prompt (enrich or replace)</td> </tr> <tr> <td><strong>Agent Profiles</strong> (<code class="readme-inline-code">directory::agents::*</code>)</td> <td>Reusable session identities whose file body is the system prompt, with display <code class="readme-inline-code">name</code>, emoji <code class="readme-inline-code">logo</code>, preloaded <code class="readme-inline-code">skills</code> and <code class="readme-inline-code">functions</code> (bodies and contracts the harness freezes into every session's prompt), and optional <code class="readme-inline-code">model</code> + <code class="readme-inline-code">reasoning_effort</code> in required frontmatter. <code class="readme-inline-code">list</code> rows carry the display/configuration metadata and <code class="readme-inline-code">get</code> adds <code class="readme-inline-code">system_prompt</code> and <code class="readme-inline-code">unknown_skills</code>. Stored as direct <code class="readme-inline-code"><agents_folder>/<id>.md</code> files. See <a href="../docs/architecture/agent-profile-storage.md">Agent profile storage</a>.</td> <td>A named identity selected with <code class="readme-inline-code">harness::send { options: { agent } }</code></td> </tr> <tr> <td><strong>Search</strong> (<code class="readme-inline-code">directory::search_functions</code>)</td> <td>One to six external capabilities → compact function-id candidates (installed, plus registry workers under <code class="readme-inline-code">installable</code>), with a conditional pre-generate hint pointing agents at it. The response also carries <code class="readme-inline-code">skills</code> (installed how-to documents) and <code class="readme-inline-code">triggers</code> (registered bindings that already fire, schedule, or hook a function, minus ephemeral console listeners), ranked in the same mode as the functions; <code class="readme-inline-code">search_mode</code> reports the mode that actually ranked.</td> <td>"Which functions do I call for this task?"</td> </tr> <tr> <td><strong>Registry</strong> (<code class="readme-inline-code">directory::registry::*</code>)</td> <td>HTTP proxy over <code class="readme-inline-code">api.workers.iii.dev</code> with <code class="readme-inline-code">workers::{list,info}</code>. Rows share the core <code class="readme-inline-code">name</code> / <code class="readme-inline-code">description</code> / <code class="readme-inline-code">version</code> fields with the engine's <code class="readme-inline-code">engine::workers::list</code> and add publication metadata (<code class="readme-inline-code">type</code>, <code class="readme-inline-code">config</code>, <code class="readme-inline-code">supported_targets</code>, <code class="readme-inline-code">total_downloads</code>, <code class="readme-inline-code">dependencies</code>, optional <code class="readme-inline-code">image</code>). <code class="readme-inline-code">workers::list</code> is cursor-paginated with a server-authored page size.</td> <td>"What's published in the public registry?"</td> </tr> </tbody></table> <p>Engine introspection (functions / triggers / registered triggers / workers) is served by the engine natively at <code class="readme-inline-code">engine::functions::*</code>, <code class="readme-inline-code">engine::triggers::*</code>, <code class="readme-inline-code">engine::registered-triggers::*</code>, and <code class="readme-inline-code">engine::workers::*</code>. Call the engine ids directly. One wrapper survives for callers that can only reach the <code class="readme-inline-code">directory::</code> namespace: <code class="readme-inline-code">directory::engine::functions::info</code> proxies a single function's schema (see its row below).</p> <p>This worker is where an agent's identity text LIVES. <code class="readme-inline-code">skills/system-prompts/iii-runtime.md</code> ships here and is the one copy of "how to work against a live iii engine" — <code class="readme-inline-code">claude-code</code> and <code class="readme-inline-code">pi</code> fetch it with <code class="readme-inline-code">directory::system-prompts::get name=iii-runtime</code> (plus <code class="readme-inline-code">directory::skills::index</code>) for both their headless turns and their console terminals, rather than compiling a prompt of their own. Edit that file and every agent reads the edit; no worker release involved.</p> <p>Skills and system prompts are sourced from <code class="readme-inline-code">skills_folder</code>; agent profiles use the dedicated <code class="readme-inline-code">agents_folder</code>. Writes are the <strong><code class="readme-inline-code">directory::skills::download*</code></strong> functions, which pull markdown from either the <a href="https://workers.iii.dev">workers registry</a> or a GitHub repo and route each supported family to its configured root, plus the per-kind single-file editors — <code class="readme-inline-code">directory::skills::{create,update,delete}</code>, <code class="readme-inline-code">directory::system-prompts::{create,update,delete}</code> and <code class="readme-inline-code">directory::agents::{create,update,delete}</code>. Once downloaded, files belong to the developer — edit them however you want, in the editor of your choice: a change made directly on disk fires the matching <code class="readme-inline-code">on-change</code> with <code class="readme-inline-code">op: "external"</code> (see <a href="#custom-trigger-types">Custom trigger types</a>).</p> <p><code class="readme-inline-code">directory::registry::workers::*</code> and the engine's <code class="readme-inline-code">engine::workers::*</code> share the core <code class="readme-inline-code">name</code> / <code class="readme-inline-code">description</code> / <code class="readme-inline-code">version</code> fields so a parser that touches only those keys works against either surface; the registry view also surfaces publication metadata (<code class="readme-inline-code">type</code>, <code class="readme-inline-code">config</code>, <code class="readme-inline-code">supported_targets</code>, <code class="readme-inline-code">total_downloads</code>, <code class="readme-inline-code">dependencies</code>, optional <code class="readme-inline-code">image</code>) and the engine view adds runtime / connection state.</p> <h2 id="table-of-contents" class="scroll-mt-20">Table of contents</h2> <ol> <li><a href="#install">Install</a></li> <li><a href="#configuration">Configuration</a></li> <li><a href="#quickstart-download-some-skills">Quickstart: download some skills</a></li> <li><a href="#on-disk-layout">On-disk layout</a></li> <li><a href="#skill-ids">Skill ids</a></li> <li><a href="#functions">Functions</a></li> <li><a href="#function-search--pre-generate-hint">Function search & pre-generate hint</a></li> <li><a href="#custom-trigger-types">Custom trigger types</a></li> <li><a href="#local-development--testing">Local development & testing</a></li> <li><a href="#migration-from-skills-v02x">Migration from skills v0.2.x</a></li> </ol> <hr> <h2 id="install" class="scroll-mt-20">Install</h2> <pre class="shiki shiki-themes min-light vesper" style="--shiki-light:#24292eff;--shiki-dark:#FFF;--shiki-light-bg:#ffffff;--shiki-dark-bg:#101010" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#FFC799">iii</span><span style="--shiki-light:#2B5581;--shiki-dark:#99FFE4"> trigger</span><span style="--shiki-light:#2B5581;--shiki-dark:#99FFE4"> compose::add</span><span style="--shiki-light:#2B5581;--shiki-dark:#99FFE4"> worker=iii-directory</span></span></code></pre><p><code class="readme-inline-code">iii trigger compose::add</code> resolves the worker and its dependencies, writes exact declarations to <code class="readme-inline-code">worker-compose.yaml</code>, and reconciles the Compose project.</p> <p>For container settings, fetch <code class="readme-inline-code">compose::schema { function_id: "compose::add" }</code> and use its <code class="readme-inline-code">workers</code> list. For example, after registering the completion wake described below:</p> <pre class="shiki shiki-themes min-light vesper" style="--shiki-light:#24292eff;--shiki-dark:#FFF;--shiki-light-bg:#ffffff;--shiki-dark-bg:#101010" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292EFF;--shiki-dark:#FFF">{</span></span> <span class="line"><span style="--shiki-light:#D32F2F;--shiki-dark:#FFC799"> "operation_id"</span><span style="--shiki-light:#212121;--shiki-dark:#FFF">:</span><span style="--shiki-light:#22863A;--shiki-dark:#99FFE4"> "<operation-id>"</span><span style="--shiki-light:#212121;--shiki-dark:#FFF">,</span></span> <span class="line"><span style="--shiki-light:#D32F2F;--shiki-dark:#FFC799"> "workers"</span><span style="--shiki-light:#212121;--shiki-dark:#FFF">:</span><span style="--shiki-light:#24292EFF;--shiki-dark:#FFF"> [</span></span> <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#99FFE4"> "state"</span><span style="--shiki-light:#212121;--shiki-dark:#FFF">,</span></span> <span class="line"><span style="--shiki-light:#24292EFF;--shiki-dark:#FFF"> {</span></span> <span class="line"><span style="--shiki-light:#D32F2F;--shiki-dark:#FFC799"> "worker"</span><span style="--shiki-light:#212121;--shiki-dark:#FFF">:</span><span style="--shiki-light:#22863A;--shiki-dark:#99FFE4"> "iii-directory"</span><span style="--shiki-light:#212121;--shiki-dark:#FFF">,</span></span> <span class="line"><span style="--shiki-light:#D32F2F;--shiki-dark:#FFC799"> "start_after"</span><span style="--shiki-light:#212121;--shiki-dark:#FFF">:</span><span style="--shiki-light:#24292EFF;--shiki-dark:#FFF"> [</span><span style="--shiki-light:#22863A;--shiki-dark:#99FFE4">"state"</span><span style="--shiki-light:#24292EFF;--shiki-dark:#FFF">]</span><span style="--shiki-light:#212121;--shiki-dark:#FFF">,</span></span> <span class="line"><span style="--shiki-light:#D32F2F;--shiki-dark:#FFC799"> "config_override"</span><span style="--shiki-light:#212121;--shiki-dark:#FFF">:</span><span style="--shiki-light:#24292EFF;--shiki-dark:#FFF"> { </span><span style="--shiki-light:#D32F2F;--shiki-dark:#FFC799">"registry_search"</span><span style="--shiki-light:#212121;--shiki-dark:#FFF">:</span><span style="--shiki-light:#1976D2;--shiki-dark:#FFF"> true</span><span style="--shiki-light:#24292EFF;--shiki-dark:#FFF"> }</span></span> <span class="line"><span style="--shiki-light:#24292EFF;--shiki-dark:#FFF"> }</span></span> <span class="line"><span style="--shiki-light:#24292EFF;--shiki-dark:#FFF"> ]</span></span> <span class="line"><span style="--shiki-light:#24292EFF;--shiki-dark:#FFF">}</span></span></code></pre><p>The list can mix worker names and objects. Each object accepts <code class="readme-inline-code">scripts</code>, <code class="readme-inline-code">config_name</code>, <code class="readme-inline-code">config_override</code>, <code class="readme-inline-code">working_dir</code>, <code class="readme-inline-code">environment</code>, <code class="readme-inline-code">env_file</code>, <code class="readme-inline-code">startup_timeout</code>, and package <code class="readme-inline-code">version</code> as well as <code class="readme-inline-code">worker</code> and <code class="readme-inline-code">start_after</code>. <code class="readme-inline-code">scripts.run</code> is for local workers only. Supplied maps replace the whole field; omitted settings are retained.</p> <p>The returned <code class="readme-inline-code">install.payload</code> from function search is a minimal shorthand. If the worker needs settings, replace its singular <code class="readme-inline-code">worker</code> with an object in <code class="readme-inline-code">workers</code>. Register a one-shot <code class="readme-inline-code">compose-operation</code> wake before calling <code class="readme-inline-code">compose::add</code>, use the same <code class="readme-inline-code">operation_id</code> in both calls, and wait for terminal success before using the new functions. An acceptance response does not mean the worker is ready. See the <a href="https://github.com/iii-hq/workers/blob/main/harness/README.md#adding-workers-with-container-settings">container settings example and completion flow</a> for field behavior, path resolution, and recovery.</p> <hr> <h2 id="skills" class="scroll-mt-20">Skills</h2> <p>Install the <code class="readme-inline-code">iii-directory</code> agent skill for Claude Code, Cursor, and 30+ other agents:</p> <pre class="shiki shiki-themes min-light vesper" style="--shiki-light:#24292eff;--shiki-dark:#FFF;--shiki-light-bg:#ffffff;--shiki-dark-bg:#101010" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#FFC799">npx</span><span style="--shiki-light:#2B5581;--shiki-dark:#99FFE4"> skills</span><span style="--shiki-light:#2B5581;--shiki-dark:#99FFE4"> add</span><span style="--shiki-light:#2B5581;--shiki-dark:#99FFE4"> iii-hq/workers</span><span style="--shiki-light:#2B5581;--shiki-dark:#99FFE4"> --skill</span><span style="--shiki-light:#2B5581;--shiki-dark:#99FFE4"> iii-directory</span></span></code></pre><p>Browse or install every worker skill at once:</p> <pre class="shiki shiki-themes min-light vesper" style="--shiki-light:#24292eff;--shiki-dark:#FFF;--shiki-light-bg:#ffffff;--shiki-dark-bg:#101010" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#FFC799">npx</span><span style="--shiki-light:#2B5581;--shiki-dark:#99FFE4"> skills</span><span style="--shiki-light:#2B5581;--shiki-dark:#99FFE4"> add</span><span style="--shiki-light:#2B5581;--shiki-dark:#99FFE4"> iii-hq/workers</span><span style="--shiki-light:#2B5581;--shiki-dark:#99FFE4"> --list</span></span> <span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#FFC799">npx</span><span style="--shiki-light:#2B5581;--shiki-dark:#99FFE4"> skills</span><span style="--shiki-light:#2B5581;--shiki-dark:#99FFE4"> add</span><span style="--shiki-light:#2B5581;--shiki-dark:#99FFE4"> iii-hq/workers</span><span style="--shiki-light:#2B5581;--shiki-dark:#99FFE4"> --all</span></span></code></pre><hr> <h2 id="configuration" class="scroll-mt-20">Configuration</h2> <p>Runtime settings live in the <strong><code class="readme-inline-code">configuration</code> worker</strong> under id <strong><code class="readme-inline-code">iii-directory</code></strong> (the same pattern <code class="readme-inline-code">database</code> and <code class="readme-inline-code">storage</code> use). At boot the worker registers its JSON Schema, reads the live value via <code class="readme-inline-code">configuration::get</code> (the configuration worker env-expands <code class="readme-inline-code">${VAR}</code>), and binds a <code class="readme-inline-code">configuration</code> trigger so it re-fetches on change.</p> <p>Persisted values default to <code class="readme-inline-code">./data/configuration/iii-directory.yaml</code> (fs adapter). Edit that file directly, call <code class="readme-inline-code">configuration::set id=iii-directory</code>, or use the Console's global Settings modal — all three propagate without a redeploy.</p> <h3 id="fields" class="scroll-mt-20">Fields</h3> <pre class="shiki shiki-themes min-light vesper" style="--shiki-light:#24292eff;--shiki-dark:#FFF;--shiki-light-bg:#ffffff;--shiki-dark-bg:#101010" tabindex="0"><code><span class="line"><span style="--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94"># TOPOLOGY — changing any of these requires a worker restart.</span></span> <span class="line"><span style="--shiki-light:#D32F2F;--shiki-dark:#FFC799">skills_folder</span><span style="--shiki-light:#D32F2F;--shiki-dark:#FFF">:</span><span style="--shiki-light:#22863A;--shiki-dark:#99FFE4"> skills</span><span style="--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94"> # under III_COMPOSE_DIR, or the process cwd standalone</span></span> <span class="line"><span style="--shiki-light:#D32F2F;--shiki-dark:#FFC799">local_skills_folder</span><span style="--shiki-light:#D32F2F;--shiki-dark:#FFF">:</span><span style="--shiki-light:#22863A;--shiki-dark:#99FFE4"> skills/iii</span><span style="--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94"> # project-scoped overrides (whole-namespace local-wins)</span></span> <span class="line"><span style="--shiki-light:#D32F2F;--shiki-dark:#FFC799">agents_folder</span><span style="--shiki-light:#D32F2F;--shiki-dark:#FFF">:</span><span style="--shiki-light:#22863A;--shiki-dark:#99FFE4"> agents</span><span style="--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94"> # direct <id>.md agent profiles</span></span> <span class="line"><span style="--shiki-light:#D32F2F;--shiki-dark:#FFC799">agents_skills_folder</span><span style="--shiki-light:#D32F2F;--shiki-dark:#FFF">:</span><span style="--shiki-light:#22863A;--shiki-dark:#99FFE4"> .agents/skills</span><span style="--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94"> # READ-ONLY agent skills, with the same relative-path base</span></span> <span class="line"><span style="--shiki-light:#D32F2F;--shiki-dark:#FFC799">auto_download</span><span style="--shiki-light:#D32F2F;--shiki-dark:#FFF">:</span><span style="--shiki-light:#1976D2;--shiki-dark:#FFC799"> true</span><span style="--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94"> # subscribe to worker-add + run the boot reconcile</span></span> <span class="line"><span style="--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94"># function_search_model_path: ~/.cache/iii/all-MiniLM-L6-v2-<revision> # pinned Hybrid bundle; null disables it</span></span> <span class="line"><span style="--shiki-light:#D32F2F;--shiki-dark:#FFC799">function_search_model_download</span><span style="--shiki-light:#D32F2F;--shiki-dark:#FFF">:</span><span style="--shiki-light:#1976D2;--shiki-dark:#FFC799"> true</span><span style="--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94"> # download the pinned bundle at boot in Hybrid mode</span></span> <span class="line"></span> <span class="line"><span style="--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94"># TUNABLE — hot-reload live on `configuration:updated`.</span></span> <span class="line"><span style="--shiki-light:#D32F2F;--shiki-dark:#FFC799">registry_url</span><span style="--shiki-light:#D32F2F;--shiki-dark:#FFF">:</span><span style="--shiki-light:#22863A;--shiki-dark:#99FFE4"> https://api.workers.iii.dev</span><span style="--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94"> # workers registry base URL</span></span> <span class="line"><span style="--shiki-light:#D32F2F;--shiki-dark:#FFC799">download_timeout_ms</span><span style="--shiki-light:#D32F2F;--shiki-dark:#FFF">:</span><span style="--shiki-light:#1976D2;--shiki-dark:#FFC799"> 60000</span><span style="--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94"> # per git-clone / HTTP request timeout (ms)</span></span> <span class="line"><span style="--shiki-light:#D32F2F;--shiki-dark:#FFC799">registry_cache_ttl_ms</span><span style="--shiki-light:#D32F2F;--shiki-dark:#FFF">:</span><span style="--shiki-light:#1976D2;--shiki-dark:#FFC799"> 60000</span><span style="--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94"> # in-process TTL for registry::workers::* responses</span></span> <span class="line"><span style="--shiki-light:#D32F2F;--shiki-dark:#FFC799">filter_unregistered</span><span style="--shiki-light:#D32F2F;--shiki-dark:#FFF">:</span><span style="--shiki-light:#1976D2;--shiki-dark:#FFC799"> true</span><span style="--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94"> # hide skills whose namespace isn't an installed worker</span></span> <span class="line"><span style="--shiki-light:#D32F2F;--shiki-dark:#FFC799">inject_hint</span><span style="--shiki-light:#D32F2F;--shiki-dark:#FFF">:</span><span style="--shiki-light:#1976D2;--shiki-dark:#FFC799"> false</span><span style="--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94"> # bind the directory::pre-generate search-hint hook (off: the harness identity prompt already teaches directory-first discovery)</span></span> <span class="line"><span style="--shiki-light:#D32F2F;--shiki-dark:#FFC799">hint_min_workers</span><span style="--shiki-light:#D32F2F;--shiki-dark:#FFF">:</span><span style="--shiki-light:#1976D2;--shiki-dark:#FFC799"> 2</span><span style="--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94"> # minimum surface width before the hint fires (0 = always)</span></span> <span class="line"><span style="--shiki-light:#D32F2F;--shiki-dark:#FFC799">registry_search</span><span style="--shiki-light:#D32F2F;--shiki-dark:#FFF">:</span><span style="--shiki-light:#1976D2;--shiki-dark:#FFC799"> true</span><span style="--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94"> # include installable registry workers in every search</span></span> <span class="line"><span style="--shiki-light:#D32F2F;--shiki-dark:#FFC799">function_search_mode</span><span style="--shiki-light:#D32F2F;--shiki-dark:#FFF">:</span><span style="--shiki-light:#22863A;--shiki-dark:#99FFE4"> judge</span><span style="--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94"> # lexical | hybrid | judge (default)</span></span> <span class="line"><span style="--shiki-light:#D32F2F;--shiki-dark:#FFC799">function_search_judge_timeout_ms</span><span style="--shiki-light:#D32F2F;--shiki-dark:#FFF">:</span><span style="--shiki-light:#1976D2;--shiki-dark:#FFC799"> 3000</span><span style="--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94"> # integer 1..30000; shared judge deadline per public search</span></span> <span class="line"><span style="--shiki-light:#D32F2F;--shiki-dark:#FFC799">function_search_judge_min_relevance</span><span style="--shiki-light:#D32F2F;--shiki-dark:#FFF">:</span><span style="--shiki-light:#1976D2;--shiki-dark:#FFC799"> 0.5</span><span style="--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94"> # finite 0..1 inclusive; noul floor (initial calibration value)</span></span> <span class="line"><span style="--shiki-light:#D32F2F;--shiki-dark:#FFC799">function_search_judge_side_lane_min_relevance</span><span style="--shiki-light:#D32F2F;--shiki-dark:#FFF">:</span><span style="--shiki-light:#1976D2;--shiki-dark:#FFC799"> 0.3</span><span style="--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94"> # finite 0..1 inclusive; noul floor for the skills and triggers sections</span></span> <span class="line"><span style="--shiki-light:#D32F2F;--shiki-dark:#FFC799">function_search_judge_question</span><span style="--shiki-light:#D32F2F;--shiki-dark:#FFF">:</span><span style="--shiki-light:#22863A;--shiki-dark:#99FFE4"> choice</span><span style="--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94"> # choice (default: one question per capability) | noul (one yes/no per shortlisted document) | tournament (whole catalog: compact rounds, then a final choice; no Hybrid shortlist)</span></span> <span class="line"><span style="--shiki-light:#D32F2F;--shiki-dark:#FFC799">function_search_judge_choice_min_probability</span><span style="--shiki-light:#D32F2F;--shiki-dark:#FFF">:</span><span style="--shiki-light:#1976D2;--shiki-dark:#FFC799"> 0.1</span><span style="--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94"> # finite 0..1 inclusive; with choice, the floor for all but the best document</span></span></code></pre><p>The writable <code class="readme-inline-code">skills_folder</code> and <code class="readme-inline-code">agents_folder</code> roots are created when needed.</p> <h3 id="zero-config-default-seed" class="scroll-mt-20">Zero-config default + seed</h3> <p>With no seed and no stored value the worker uses built-in defaults. Relative folder paths use <code class="readme-inline-code">III_COMPOSE_DIR</code> when set and the process current directory otherwise (<code class="readme-inline-code">skills_folder: skills</code>, <code class="readme-inline-code">agents_folder: agents</code>, <code class="readme-inline-code">registry_url: https://api.workers.iii.dev</code>). Pass <code class="readme-inline-code">--config <path></code> to supply a YAML seed: when present and no value is stored yet, its contents become <code class="readme-inline-code">initial_value</code> on <code class="readme-inline-code">configuration::register</code> (see <a href="config.yaml.example"><code class="readme-inline-code">config.yaml.example</code></a>). Engine-managed deployments inline the config under the worker entry; the engine delivers it via <code class="readme-inline-code">--config</code>.</p> <h3 id="hot-reload" class="scroll-mt-20">Hot reload</h3> <p>On <code class="readme-inline-code">configuration::set</code> (or an external edit to the persisted file), the worker re-fetches the authoritative value. Tunable changes apply in place and the registry caches are cleared so a repointed <code class="readme-inline-code">registry_url</code> takes effect immediately. Topology changes (<code class="readme-inline-code">skills_folder</code> / <code class="readme-inline-code">local_skills_folder</code> / <code class="readme-inline-code">agents_folder</code> / <code class="readme-inline-code">agents_skills_folder</code> / <code class="readme-inline-code">auto_download</code> / <code class="readme-inline-code">function_search_model_path</code> / <code class="readme-inline-code">function_search_model_download</code>) are refused with a "restart required" log; the previous configuration is kept until the worker restarts.</p> <p><code class="readme-inline-code">function_search_mode</code> and all <code class="readme-inline-code">function_search_judge_*</code> options hot-reload. Judge credentials and the model name are the <code class="readme-inline-code">judge-typesafe</code> worker's settings, not this worker's.</p> <p>The writable <code class="readme-inline-code">skills_folder</code>, <code class="readme-inline-code">local_skills_folder</code>, and <code class="readme-inline-code">agents_folder</code> are watch roots, and the watcher creates each one at boot if it is missing. Direct <code class="readme-inline-code"><id>.md</code> edits under <code class="readme-inline-code">agents_folder</code> fire <code class="readme-inline-code">directory::agents::on-change</code> with <code class="readme-inline-code">op: "external"</code>; nested files are ignored. <code class="readme-inline-code">agents_skills_folder</code> is a watch root too, but only when it already exists — the worker never creates (or writes) anything under it. Install your first agents skill while the worker is running and that root stays unwatched until the next restart: reads still serve it, since every read re-scans disk, but the live <code class="readme-inline-code">external</code> doorbell is missing until then. <code class="readme-inline-code">local_skills_folder</code> defaults to <code class="readme-inline-code">skills/iii</code> under <code class="readme-inline-code">III_COMPOSE_DIR</code>, or under the process current directory when the worker runs standalone. An empty local root shadows nothing. Because the roots are restart-required, the watch roots are fixed for the process lifetime.</p> <hr> <h2 id="quickstart-download-some-skills" class="scroll-mt-20">Quickstart: download some skills</h2> <pre class="shiki shiki-themes min-light vesper" style="--shiki-light:#24292eff;--shiki-dark:#FFF;--shiki-light-bg:#ffffff;--shiki-dark-bg:#101010" tabindex="0"><code><span class="line"><span style="--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94"># Pull a specific worker's directory bundle at a fixed semver from</span></span> <span class="line"><span style="--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94"># the registry. Files land under `<skills_folder>/agent-memory/`.</span></span> <span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#FFC799">iii</span><span style="--shiki-light:#2B5581;--shiki-dark:#99FFE4"> trigger</span><span style="--shiki-light:#2B5581;--shiki-dark:#99FFE4"> --function-id=directory::skills::download</span><span style="--shiki-light:#24292EFF;--shiki-dark:#A0A0A0"> \</span></span> <span class="line"><span style="--shiki-light:#2B5581;--shiki-dark:#99FFE4"> --payload=</span><span style="--shiki-light:#22863A;--shiki-dark:#99FFE4">'{"worker": "agent-memory", "version": "1.2.3"}'</span></span> <span class="line"></span> <span class="line"><span style="--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94"># Same, but always fetch whatever's tagged `latest` (also the default</span></span> <span class="line"><span style="--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94"># when neither version nor tag is given).</span></span> <span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#FFC799">iii</span><span style="--shiki-light:#2B5581;--shiki-dark:#99FFE4"> trigger</span><span style="--shiki-light:#2B5581;--shiki-dark:#99FFE4"> --function-id=directory::skills::download</span><span style="--shiki-light:#24292EFF;--shiki-dark:#A0A0A0"> \</span></span> <span class="line"><span style="--shiki-light:#2B5581;--shiki-dark:#99FFE4"> --payload=</span><span style="--shiki-light:#22863A;--shiki-dark:#99FFE4">'{"worker": "agent-memory"}'</span></span> <span class="line"></span> <span class="line"><span style="--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94"># Pull a single subfolder out of a public GitHub repo via</span></span> <span class="line"><span style="--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94"># `git clone --depth 1 --branch main`. Files land under</span></span> <span class="line"><span style="--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94"># `<skills_folder>/frontend-design/`. The `branch` field defaults to</span></span> <span class="line"><span style="--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94"># `main`; pass `"master"` for older repos that haven't migrated.</span></span> <span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#FFC799">iii</span><span style="--shiki-light:#2B5581;--shiki-dark:#99FFE4"> trigger</span><span style="--shiki-light:#2B5581;--shiki-dark:#99FFE4"> --function-id=directory::skills::download</span><span style="--shiki-light:#24292EFF;--shiki-dark:#A0A0A0"> \</span></span> <span class="line"><span style="--shiki-light:#2B5581;--shiki-dark:#99FFE4"> --payload=</span><span style="--shiki-light:#22863A;--shiki-dark:#99FFE4">'{</span></span> <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#99FFE4"> "repo": "https://github.com/anthropics/skills",</span></span> <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#99FFE4"> "skill": "frontend-design"</span></span> <span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#99FFE4"> }'</span></span></code></pre><p>The response is <code class="readme-inline-code">{ namespace, skills_written, system_prompts_written, agents_written, source }</code>. The three <code class="readme-inline-code">*_written</code> fields list the files materialised in this run. Registry entries shaped exactly as <code class="readme-inline-code">agents/<id>.md</code> land in <code class="readme-inline-code"><agents_folder>/<id>.md</code>; repo downloads do not install agent profiles.</p> <p>After every successful download the worker fires the <code class="readme-inline-code">directory::skills::on-change</code>, <code class="readme-inline-code">directory::system-prompts::on-change</code>, and/or <code class="readme-inline-code">directory::agents::on-change</code> trigger types so that subscribers like the <a href="https://github.com/iii-hq/workers/tree/main/mcp"><code class="readme-inline-code">mcp</code></a> worker can forward MCP <code class="readme-inline-code">notifications/list_changed</code> to their clients.</p> <hr> <h2 id="on-disk-layout" class="scroll-mt-20">On-disk layout</h2> <p>The worker uses separate roots for directory content and agent profiles:</p> <pre><code>skills_folder/ <namespace>/ # one folder per `directory::skills::download` namespace index.md # → iii://<namespace>/index contacts.md # → iii://<namespace>/contacts emails/send-email.md # → iii://<namespace>/emails/send-email system-prompts/ # ← magic marker for system prompts reviewer.md # ← identity prompt (needs YAML frontmatter) system-prompts/ # ← where system-prompts::create writes pirate.md agents_folder/ # ← where agents::create writes release-captain.md # ← agent profile (needs YAML frontmatter) frontend-design.md # ← `extends: iii` builds on the bundled base</code></pre><p>Three agent profiles ship inside the worker binary:</p> <ul> <li><code class="readme-inline-code">default</code> — shown as <strong>Default</strong> in the chat's new-session gallery: the minimal directory-first identity (the same text as the bundled <code class="readme-inline-code">iii-minimal</code> system prompt), with a composer example. New sessions in the ADE start on it.</li> <li><code class="readme-inline-code">iii</code> — the harness default identity, verbatim. <code class="readme-inline-code">hidden: true</code> keeps it out of the gallery; it stays a valid <code class="readme-inline-code">extends</code> parent and runs by id.</li> <li><code class="readme-inline-code">iii-minimal</code> — the previous id of <code class="readme-inline-code">default</code>, kept as a hidden alias (<code class="readme-inline-code">extends: default</code>, no body of its own) so existing <code class="readme-inline-code">extends: iii-minimal</code> chains, saved sessions, and explicit invocations resolve to the same identity. New profiles should use <code class="readme-inline-code">extends: default</code>.</li> </ul> <p>Each is always listed (<code class="readme-inline-code">builtin: true</code>), a local <code class="readme-inline-code">agents_folder/<id>.md</code> shadows it, <code class="readme-inline-code">update</code> on it copy-on-writes that local file, and deleting the file falls back to the bundled copy. No file is ever seeded on disk.</p> <p>An optional <code class="readme-inline-code">composer_placeholder:</code> frontmatter string is the example request the chat shows in an EMPTY composer while that profile is selected. It is presentation only — never sent, never added to the prompt — and profile-local: it does not inherit through <code class="readme-inline-code">extends</code>, so a child without its own example gets the chat's generic hint. Whitespace collapses to single spaces, blank means absent, and more than 200 characters is rejected like any other invalid frontmatter.</p> <p>A second, READ-ONLY root — <code class="readme-inline-code">agents_skills_folder</code> (default <code class="readme-inline-code">.agents/skills</code> under the same Compose or standalone base) — serves agent skills. It is scanned <strong>shallowly</strong>: only <code class="readme-inline-code"><skill-dir>/SKILL.md</code> becomes an entry (id <code class="readme-inline-code"><skill-dir>/index</code>, displayed as <code class="readme-inline-code"><skill-dir></code>); a skill's <code class="readme-inline-code">reference/</code>, <code class="readme-inline-code">scripts/</code>, or other support payload is never listed. A missing directory is silently empty. These skills bypass <code class="readme-inline-code">filter_unregistered</code> (their namespaces are skills, not workers), stay out of <code class="readme-inline-code">directory::skills::index</code> (a per-WORKER surface), and are refused by <code class="readme-inline-code">update</code>/<code class="readme-inline-code">delete</code> — edit them with their owning tool, or copy one into <code class="readme-inline-code">skills_folder</code> on disk to fork it. Precedence is <code class="readme-inline-code">local_skills_folder</code> > <code class="readme-inline-code">skills_folder</code> > <code class="readme-inline-code">agents_skills_folder</code>, namespace-wise: a top-level namespace directory in a higher root shadows the same namespace below.</p> <p>A few rules:</p> <ul> <li><strong>Skill ids</strong> are the relative path under <code class="readme-inline-code">skills_folder</code> with <code class="readme-inline-code">.md</code> stripped. Each segment must satisfy <code class="readme-inline-code">[a-z0-9_-]{1,64}</code>.</li> <li><strong>Skill frontmatter is optional.</strong> When present, the reader recognises <code class="readme-inline-code">title:</code> (preferred title), <code class="readme-inline-code">name:</code> (title fallback), <code class="readme-inline-code">type:</code> (free-form classifier), <code class="readme-inline-code">function_id:</code> (canonical bus function id surfaced by <code class="readme-inline-code">list</code> and <code class="readme-inline-code">get</code>), <code class="readme-inline-code">description:</code> (preferred <code class="readme-inline-code">list</code> teaser), and <code class="readme-inline-code">disable-model-invocation:</code> (boolean, default <code class="readme-inline-code">false</code>, surfaced as <code class="readme-inline-code">disable_model_invocation</code> by both responses). The body H1 and first paragraph are the title and list-description fallbacks, respectively. Disabled skills remain visible to ordinary directory clients; model index consumers decide whether to filter them. Any other YAML keys are ignored.</li> <li><strong>System prompts</strong> live under any <code class="readme-inline-code">*/system-prompts/*.md</code> path, with YAML frontmatter (<code class="readme-inline-code">description</code> required, <code class="readme-inline-code">name</code> optional). A path carrying both a <code class="readme-inline-code">prompts</code> and a <code class="readme-inline-code">system-prompts</code> segment is a system prompt because <code class="readme-inline-code">system-prompts</code> is classified first. Other paths containing a <code class="readme-inline-code">prompts</code> segment are ignored by scans and downloads.</li> <li><strong>What a system prompt can do, by design.</strong> The console's chat picker can send a selected system prompt with <code class="readme-inline-code">system_prompt_strategy: "override"</code>, which replaces the harness's built-in identity prompt with that file's body verbatim. Files reach <code class="readme-inline-code">system-prompts/</code> either by local authoring or via <code class="readme-inline-code">directory::skills::download</code> from a git repo or the registry, so a downloaded bundle can supply one. This is an accepted property, not a hole: it takes a deliberate selection in the UI, the same UI already accepts arbitrary typed text, and the operator owns <code class="readme-inline-code">skills_folder</code>. Worth knowing before you point <code class="readme-inline-code">skills_folder</code> at a directory other people can write to.</li> <li><strong>Agent profiles</strong> are direct <code class="readme-inline-code"><agents_folder>/<id>.md</code> files (unrelated to the read-only <code class="readme-inline-code">agents_skills_folder</code> above, which holds external tools' <em>skills</em>). Nested profiles and the former <code class="readme-inline-code"><skills_folder>/**/agents/*.md</code> layout are ignored. Frontmatter is required and must declare a non-empty <code class="readme-inline-code">name</code> (the display name — the id is always the file stem); <code class="readme-inline-code">description</code> may be empty, <code class="readme-inline-code">logo</code> is emoji-only (≤16 bytes, no path characters), <code class="readme-inline-code">skills:</code> filters the skill index (absent/empty = every skill), and <code class="readme-inline-code">model:</code> names a model id for sessions using this profile (absent = the send decides), and optional <code class="readme-inline-code">reasoning_effort:</code> names its provider-native effort. Both are stored verbatim and resolved against the live model catalog where they are used. The body is the system prompt, verbatim, and may be empty — a profile with no prompt of its own contributes only its parent chain (if any) and its non-prompt settings. Unknown <code class="readme-inline-code">skills</code> ids are warnings surfaced by <code class="readme-inline-code">get</code>, never load failures.</li> <li><strong>Agent profiles declare preloaded functions.</strong> <code class="readme-inline-code">functions:</code> lists engine function ids (<code class="readme-inline-code">coder::tree</code>, <code class="readme-inline-code">coder::search</code>, …) the profile uses routinely. The harness resolves their contracts once, when a session starts as this profile, and freezes them into the system prompt as a <code class="readme-inline-code"><preloaded_functions></code> block (id, description, compacted request schema), so the model calls them on the first step instead of spending a <code class="readme-inline-code">directory::search_functions</code> + <code class="readme-inline-code">engine::functions::info</code> round-trip per session; everything else still goes through discovery. Ids are stored verbatim (non-empty, no whitespace; duplicates collapse, order kept); <code class="readme-inline-code">get</code> reports ids the engine does not currently know in <code class="readme-inline-code">unknown_functions</code> (a warning — the harness renders them as unavailable), <code class="readme-inline-code">list</code> carries <code class="readme-inline-code">function_count</code>. <code class="readme-inline-code">directory::agents::functions::add</code> / <code class="readme-inline-code">::remove { id, functions }</code> edit only that frontmatter field — the rest of the file stays byte-identical — and fan out <code class="readme-inline-code">on-change</code> as an update. The console's profile editor picks them from the live registry with the same keyboard-first search + Selected/Available lists as skills.</li> <li><strong>Agent profiles inherit.</strong> <code class="readme-inline-code">extends: <id></code> names one parent profile (chains allowed, at most 8 hops). The resolved system prompt served by <code class="readme-inline-code">get</code> is the parent's resolved prompt followed by a blank line and this file's body — a blank body contributes nothing, so a profile with no prompt of its own serves its parent chain unchanged; <code class="readme-inline-code">model</code> and <code class="readme-inline-code">reasoning_effort</code> fall back to the nearest ancestor that sets them when omitted, while <code class="readme-inline-code">skills</code> and <code class="readme-inline-code">functions</code> inherit ADDITIVELY (the union of the chain's lists, root first, no duplicates — a child adds to what its parents allow / preload, it cannot remove); <code class="readme-inline-code">name</code>, <code class="readme-inline-code">description</code>, <code class="readme-inline-code">logo</code>, <code class="readme-inline-code">icon</code> and <code class="readme-inline-code">color</code> are always the profile's own. A chain that does not resolve (unknown parent, loop, too deep) is reported by <code class="readme-inline-code">list</code>/<code class="readme-inline-code">get</code> as <code class="readme-inline-code">inheritance_error</code> (<code class="readme-inline-code">D415</code> text) while the profile still serves its own file (so the editor can fix it); the harness refuses to run it.</li> <li>Under a skills root, files outside <code class="readme-inline-code">prompts/</code>, <code class="readme-inline-code">system-prompts/</code>, and reserved <code class="readme-inline-code">agents/</code> segments are skills.</li> </ul> <p>The download function namespaces by source:</p> <table> <thead> <tr> <th>Source</th> <th>Destination</th> </tr> </thead> <tbody><tr> <td><code class="readme-inline-code">repo=URL skill=NAME branch?=main</code></td> <td><code class="readme-inline-code"><skills_folder>/<NAME>/...</code></td> </tr> <tr> <td><code class="readme-inline-code">worker=NAME version=…</code></td> <td>Skills/prompts under <code class="readme-inline-code"><skills_folder>/<NAME>/...</code>; exact <code class="readme-inline-code">agents/<id>.md</code> entries under <code class="readme-inline-code"><agents_folder>/<id>.md</code></td> </tr> <tr> <td><code class="readme-inline-code">worker=NAME tag=…</code> (default <code class="readme-inline-code">tag=latest</code>)</td> <td>Same routing as the version form</td> </tr> </tbody></table> <p>Re-pulling the same source overwrites files <strong>file-by-file</strong> — existing siblings outside the response set are preserved (so hand-edited additions survive a re-pull).</p> <hr> <h2 id="skill-ids" class="scroll-mt-20">Skill ids</h2> <p>Skills are addressed by their relative path under <code class="readme-inline-code">skills_folder</code> with <code class="readme-inline-code">.md</code> stripped — e.g. <code class="readme-inline-code"><skills_folder>/agent-memory/observe.md</code> → id <code class="readme-inline-code">"agent-memory/observe"</code>. The same string is what <code class="readme-inline-code">directory::skills::list</code> returns and what <code class="readme-inline-code">directory::skills::get</code> expects in <code class="readme-inline-code">{ "id": ... }</code>. The legacy <code class="readme-inline-code">iii://{id}</code> link form is still accepted on <code class="readme-inline-code">get</code> (the prefix is auto-stripped), but the worker no longer parses any other <code class="readme-inline-code">iii://</code> URI shape — bodies are read solely by id, and the auto-rendered tree-shaped index that previous releases served at <code class="readme-inline-code">iii://directory/skills</code> is gone. Consumers that want a tree-shaped picker iterate <code class="readme-inline-code">list</code> rows themselves and indent by <code class="readme-inline-code">id.matches('/').count()</code>.</p> <hr> <h2 id="functions" class="scroll-mt-20">Functions</h2> <p>Functions sit under <code class="readme-inline-code">directory::*</code>. All registrations are namespace-clean; this worker is intentionally agnostic to MCP and any other adapter.</p> <h3 id="directoryskills-filesystem-reader-editor" class="scroll-mt-20"><code class="readme-inline-code">directory::skills::*</code> (filesystem reader + editor)</h3> <table> <thead> <tr> <th>Function ID</th> <th>Description</th> </tr> </thead> <tbody><tr> <td><code class="readme-inline-code">directory::skills::download</code></td> <td>Download directory content. Flexible alias accepting either source set: <code class="readme-inline-code">{repo, skill, branch?}</code> (defaults <code class="readme-inline-code">branch=main</code>) or <code class="readme-inline-code">{worker, version?|tag?}</code> (defaults <code class="readme-inline-code">tag=latest</code>). Prefer the two explicit forms below so the source is unambiguous.</td> </tr> <tr> <td><code class="readme-inline-code">directory::skills::download_from_repo</code></td> <td>Repo-only form: <code class="readme-inline-code">{repo, skill, branch?}</code>. Copies one skill folder out of a GitHub repo; paths under <code class="readme-inline-code">prompts/</code> and <code class="readme-inline-code">agents/</code> are ignored.</td> </tr> <tr> <td><code class="readme-inline-code">directory::skills::download_from_registry</code></td> <td>Registry-only form: <code class="readme-inline-code">{worker, version?|tag?}</code>. Installs a published worker's bundle from <code class="readme-inline-code">api.workers.iii.dev</code>, routing exact <code class="readme-inline-code">agents/<id>.md</code> entries to <code class="readme-inline-code">agents_folder</code>.</td> </tr> <tr> <td><code class="readme-inline-code">directory::skills::list</code></td> <td>Enriched listing of every fs-backed skill: <code class="readme-inline-code">{ id, title, type, function_id, disable_model_invocation, description, bytes, modified_at }</code> per row. <code class="readme-inline-code">title</code> prefers the YAML frontmatter <code class="readme-inline-code">title:</code> over the body H1, <code class="readme-inline-code">type</code> is lifted from frontmatter <code class="readme-inline-code">type:</code> (<code class="readme-inline-code">null</code> when absent), <code class="readme-inline-code">function_id</code> identifies the documented bus function when present, and <code class="readme-inline-code">description</code> is the frontmatter description or first body paragraph — so consumers can render a picker without a follow-up <code class="readme-inline-code">get</code> per row.</td> </tr> <tr> <td><code class="readme-inline-code">directory::skills::get</code></td> <td>Fetch one skill by id. Returns <code class="readme-inline-code">{ id, title, type, function_id, disable_model_invocation, path, body, modified_at }</code>. It shares the list row's identity, classification, function, and invocation metadata, but returns the raw markdown <code class="readme-inline-code">body</code> and absolute on-disk <code class="readme-inline-code">path</code> instead of the teaser and byte count; there is no <code class="readme-inline-code">description</code> field. The path's parent directory is the skill's base directory, where payload like <code class="readme-inline-code">scripts/</code> and <code class="readme-inline-code">reference/</code> lives, and is meaningful only to callers on this worker's machine. Accepts a bare id or the same id prefixed with <code class="readme-inline-code">iii://</code>. Pass <code class="readme-inline-code">raw: true</code> to additionally get the FULL on-disk file (frontmatter included) as <code class="readme-inline-code">raw</code> — the round-trip form <code class="readme-inline-code">update</code> takes.</td> </tr> <tr> <td><code class="readme-inline-code">directory::skills::update</code></td> <td>Overwrite one EXISTING skill file with new full-file content: <code class="readme-inline-code">{ id, content }</code> where <code class="readme-inline-code">content</code> is the edited <code class="readme-inline-code">raw</code> from <code class="readme-inline-code">get { raw: true }</code>. Validated against the read invariants (size cap, non-empty body after frontmatter); atomic write; fans out <code class="readme-inline-code">directory::skills::on-change</code> with <code class="readme-inline-code">op: "update"</code>. Never creates files (use <code class="readme-inline-code">create</code>). Refuses read-only system-installed skills under <code class="readme-inline-code">agents_skills_folder</code> (<code class="readme-inline-code">D116</code>).</td> </tr> <tr> <td><code class="readme-inline-code">directory::skills::create</code></td> <td>Create a NEW skill file at <code class="readme-inline-code"><skills_folder>/<id>.md</code> from full-file content: <code class="readme-inline-code">{ id, content }</code>. Frontmatter is optional (same rules as <code class="readme-inline-code">update</code>: size cap, non-empty body). Refuses an <code class="readme-inline-code">id</code> that already resolves in the visible set — including the <code class="readme-inline-code"><id></code> → <code class="readme-inline-code"><id>/index</code> overview alias and system-installed agents skills — or a target path that already exists on disk (<code class="readme-inline-code">D114</code>); an <code class="readme-inline-code">id</code> in a namespace reserved by a system-installed agents skill (<code class="readme-inline-code">D115</code>); and, while <code class="readme-inline-code">filter_unregistered</code> is on, an <code class="readme-inline-code">id</code> the visibility filter would immediately hide (<code class="readme-inline-code">D115</code>). Atomic write; fans out <code class="readme-inline-code">directory::skills::on-change</code> with <code class="readme-inline-code">op: "create"</code>. Returns the same shape as <code class="readme-inline-code">update</code>.</td> </tr> <tr> <td><code class="readme-inline-code">directory::skills::delete</code></td> <td>Permanently remove one EXISTING skill file by <code class="readme-inline-code">{ id }</code> (same id forms as <code class="readme-inline-code">get</code>). Resolves against the same visible set as <code class="readme-inline-code">list</code>/<code class="readme-inline-code">get</code>, refuses read-only system-installed skills under <code class="readme-inline-code">agents_skills_folder</code> (<code class="readme-inline-code">D116</code>), removes the file plus any parent directories left empty (so a deleted namespace can't keep shadowing a lower-precedence root), and fans out <code class="readme-inline-code">directory::skills::on-change</code> with <code class="readme-inline-code">op: "delete"</code>. Returns <code class="readme-inline-code">{ id }</code> (the resolved on-disk id).</td> </tr> <tr> <td><code class="readme-inline-code">directory::skills::index</code></td> <td>Render one short markdown entry per installed worker (skills with frontmatter <code class="readme-inline-code">type: index</code>). Returns <code class="readme-inline-code">{ body, workers_count }</code> where <code class="readme-inline-code">body</code> is a ready-to-paste page: <code class="readme-inline-code"># Skills index</code>, then one <code class="readme-inline-code">## <worker title></code> heading + the worker's first overview paragraph + a <code class="readme-inline-code">Read iii://<ns>/index</code> pointer the agent can follow with <code class="readme-inline-code">directory::skills::get</code>. Token-light by design; use <code class="readme-inline-code">directory::skills::list</code> for per-skill rows.</td> </tr> </tbody></table> <h3 id="directorysystem-prompts-filesystem-reader-editor" class="scroll-mt-20"><code class="readme-inline-code">directory::system-prompts::*</code> (filesystem reader + editor)</h3> <table> <thead> <tr> <th>Function ID</th> <th>Description</th> </tr> </thead> <tbody><tr> <td><code class="readme-inline-code">directory::system-prompts::list</code></td> <td>Metadata-only listing of every fs-backed system prompt.</td> </tr> <tr> <td><code class="readme-inline-code">directory::system-prompts::get</code></td> <td>Fetch one system prompt's body + <code class="readme-inline-code">{name, description, modified_at}</code>. Plain shape, no envelope. Pass <code class="readme-inline-code">raw: true</code> to additionally get the FULL on-disk file (frontmatter included) as <code class="readme-inline-code">raw</code>.</td> </tr> <tr> <td><code class="readme-inline-code">directory::system-prompts::update</code></td> <td>Overwrite one EXISTING system prompt file with new full-file content: <code class="readme-inline-code">{ name, content }</code>. The frontmatter must keep a non-empty <code class="readme-inline-code">description</code> (and a valid <code class="readme-inline-code">name</code> when declared) — the same rules the scanner enforces. Atomic write; fans out <code class="readme-inline-code">directory::system-prompts::on-change</code> with <code class="readme-inline-code">op: "update"</code>. Returns the system prompt's effective name after the write.</td> </tr> <tr> <td><code class="readme-inline-code">directory::system-prompts::create</code></td> <td>Create a NEW system prompt file at <code class="readme-inline-code"><skills_folder>/system-prompts/<name>.md</code> from full-file content: <code class="readme-inline-code">{ name, content }</code>, where <code class="readme-inline-code">content</code> is the FULL file including frontmatter. The frontmatter must carry a non-empty <code class="readme-inline-code">description</code> (and a <code class="readme-inline-code">name</code> matching the request, when declared) — the same rules <code class="readme-inline-code">update</code> enforces. Refuses a <code class="readme-inline-code">name</code> that already exists anywhere in the merged system-prompt scan, and a target path that already exists on disk even if the scanner would skip it. Atomic write; fans out <code class="readme-inline-code">directory::system-prompts::on-change</code> with <code class="readme-inline-code">op: "create"</code>. Returns <code class="readme-inline-code">{ name, description, bytes, modified_at }</code>.</td> </tr> <tr> <td><code class="readme-inline-code">directory::system-prompts::delete</code></td> <td>Permanently remove one EXISTING system prompt file by <code class="readme-inline-code">{ name }</code>. Resolves against the same merged scan as <code class="readme-inline-code">list</code>/<code class="readme-inline-code">get</code>, fans out <code class="readme-inline-code">directory::system-prompts::on-change</code> with <code class="readme-inline-code">op: "delete"</code>, and returns <code class="readme-inline-code">{ name }</code>.</td> </tr> </tbody></table> <h3 id="agent-profiles-directoryagents-filesystem-reader-editor" class="scroll-mt-20">Agent Profiles — <code class="readme-inline-code">directory::agents::*</code> (filesystem reader + editor)</h3> <table> <thead> <tr> <th>Function ID</th> <th>Description</th> </tr> </thead> <tbody><tr> <td><code class="readme-inline-code">directory::agents::list</code></td> <td>Metadata-only listing of every agent profile — fs-backed plus the bundled <code class="readme-inline-code">default</code> / <code class="readme-inline-code">iii</code> / <code class="readme-inline-code">iii-minimal</code> profiles (<code class="readme-inline-code">builtin: true</code> until a local file shadows one): <code class="readme-inline-code">{ id, name, description, logo, skill_count, model, reasoning_effort, icon, color, extends, hidden, composer_placeholder, modified_at }</code> per row (<code class="readme-inline-code">hidden</code> and <code class="readme-inline-code">composer_placeholder</code> omitted when unset; <code class="readme-inline-code">composer_placeholder</code> never inherits), <code class="readme-inline-code">skill_count</code>/<code class="readme-inline-code">model</code>/<code class="readme-inline-code">reasoning_effort</code> resolved through <code class="readme-inline-code">extends</code> (<code class="readme-inline-code">skill_count: null</code> = every skill; <code class="readme-inline-code">model: null</code> = the send decides). A row whose chain does not resolve carries <code class="readme-inline-code">inheritance_error</code>.</td> </tr> <tr> <td><code class="readme-inline-code">directory::agents::get</code></td> <td>Fetch one agent profile by <code class="readme-inline-code">{ id }</code>: the RESOLVED <code class="readme-inline-code">system_prompt</code> (each ancestor's body root-first, then this file's body), <code class="readme-inline-code">skills</code> + <code class="readme-inline-code">unknown_skills</code> (filter entries matching no visible skill — warnings), <code class="readme-inline-code">model</code> (<code class="readme-inline-code">null</code> = the send decides), provider-native <code class="readme-inline-code">reasoning_effort</code>, display <code class="readme-inline-code">icon</code>/<code class="readme-inline-code">color</code>, <code class="readme-inline-code">extends</code>, <code class="readme-inline-code">hidden</code>, the profile's own <code class="readme-inline-code">composer_placeholder</code> (omitted when unset), <code class="readme-inline-code">builtin</code>, <code class="readme-inline-code">modified_at</code>, and <code class="readme-inline-code">inheritance_error</code> when the chain does not resolve (own file served meanwhile). Pass <code class="readme-inline-code">raw: true</code> to additionally get this profile's FULL on-disk file as <code class="readme-inline-code">raw</code>.</td> </tr> <tr> <td><code class="readme-inline-code">directory::agents::update</code></td> <td>Overwrite one EXISTING agent profile file with new full-file content: <code class="readme-inline-code">{ id, content }</code>. Same rules the scanner enforces (required frontmatter with non-empty <code class="readme-inline-code">name</code>, emoji-only <code class="readme-inline-code">logo</code>; the body — the system prompt — may be empty); the id stays the file stem. Updating a bundled profile creates the local file that shadows it. Atomic write; fans out <code class="readme-inline-code">directory::agents::on-change</code> with <code class="readme-inline-code">op: "update"</code>.</td> </tr> <tr> <td><code class="readme-inline-code">directory::agents::create</code></td> <td>Create a NEW agent profile at <code class="readme-inline-code"><agents_folder>/<id>.md</code> from full-file content: <code class="readme-inline-code">{ id, content }</code>. Refuses an <code class="readme-inline-code">id</code> that already exists in the configured agent-profile root, and a target path that already exists on disk even if the scanner would skip it; creating a bundled id shadows the bundled copy. Atomic write; fans out <code class="readme-inline-code">directory::agents::on-change</code> with <code class="readme-inline-code">op: "create"</code>. Returns <code class="readme-inline-code">{ id, name, description, logo, bytes, modified_at }</code>.</td> </tr> <tr> <td><code class="readme-inline-code">directory::agents::delete</code></td> <td>Permanently remove one EXISTING agent profile file by <code class="readme-inline-code">{ id }</code>. Resolves against the same configured root as <code class="readme-inline-code">list</code>/<code class="readme-inline-code">get</code>, fans out <code class="readme-inline-code">directory::agents::on-change</code> with <code class="readme-inline-code">op: "delete"</code>, and returns <code class="readme-inline-code">{ id }</code>. Deleting the local shadow of a bundled profile falls back to the bundled copy; a bundled profile with no local file has nothing to delete (<code class="readme-inline-code">D414</code>). Sessions already using the profile are unaffected; profiles extending it stop resolving until fixed.</td> </tr> <tr> <td><code class="readme-inline-code">directory::agents::functions::add</code></td> <td><code class="readme-inline-code">{ id, functions: ["coder::tree", …] }</code> — append engine function ids to one EXISTING profile's OWN <code class="readme-inline-code">functions:</code> list (its <em>preloaded</em> functions: the contracts the harness pre-loads into the system prompt of every new session running as the profile). Ids already present are kept once; only that frontmatter field is rewritten (block style), every other byte of the file is untouched; writes atomically, copy-on-writes a bundled profile's shadow, fans out <code class="readme-inline-code">on-change</code> with <code class="readme-inline-code">op: "update"</code>. Returns <code class="readme-inline-code">{ id, functions, added, unchanged?, bytes, modified_at }</code> — <code class="readme-inline-code">unchanged: true</code> means nothing was written. <code class="readme-inline-code">D416</code> for a request with no valid ids (entries must be non-empty and whitespace-free).</td> </tr> <tr> <td><code class="readme-inline-code">directory::agents::functions::remove</code></td> <td><code class="readme-inline-code">{ id, functions }</code> — drop ids from one EXISTING profile's OWN <code class="readme-inline-code">functions:</code> list (absent ids are ignored; the field disappears when the list empties). Same write semantics and <code class="readme-inline-code">D416</code>; returns <code class="readme-inline-code">{ id, functions, removed, unchanged?, bytes, modified_at }</code>. Neither verb touches ids inherited through <code class="readme-inline-code">extends</code> — those stay in the resolved union and are removed on the parent that declares them.</td> </tr> </tbody></table> <h3 id="engine-introspection-native-plus-one-wrapper" class="scroll-mt-20">Engine introspection (native, plus one wrapper)</h3> <p>Engine introspection is served natively; call these ids directly — every one takes the same filters (<code class="readme-inline-code">prefix</code>, <code class="readme-inline-code">search</code>, <code class="readme-inline-code">worker</code>, <code class="readme-inline-code">include_internal</code> where applicable). One wrapper is kept for callers whose policy only admits the <code class="readme-inline-code">directory::</code> namespace:</p> <table> <thead> <tr> <th>Function ID</th> <th>Description</th> </tr> </thead> <tbody><tr> <td><code class="readme-inline-code">directory::engine::functions::info</code></td> <td>Thin proxy to <code class="readme-inline-code">engine::functions::info</code> for a single <code class="readme-inline-code">function_id</code>: request/response schemas, metadata, and registered triggers. The one <code class="readme-inline-code">directory::engine::*</code> helper that still exists — reach for it only when you cannot call <code class="readme-inline-code">engine::*</code> directly.</td> </tr> </tbody></table> <p>The native ids:</p> <table> <thead> <tr> <th>Function ID</th> <th>Description</th> </tr> </thead> <tbody><tr> <td><code class="readme-inline-code">engine::functions::list</code></td> <td>List functions registered with the engine.</td> </tr> <tr> <td><code class="readme-inline-code">engine::functions::info</code></td> <td>Single-function detail: schemas, owning worker.</td> </tr> <tr> <td><code class="readme-inline-code">engine::triggers::list</code></td> <td>List trigger TYPES (the providers, e.g. <code class="readme-inline-code">http</code>, <code class="readme-inline-code">cron</code>).</td> </tr> <tr> <td><code class="readme-inline-code">engine::triggers::info</code></td> <td>Single trigger-type detail: configuration schema, return schema.</td> </tr> <tr> <td><code class="readme-inline-code">engine::registered-triggers::list</code></td> <td>List trigger INSTANCES (subscriber rows).</td> </tr> <tr> <td><code class="readme-inline-code">engine::registered-triggers::info</code></td> <td>Single registered-trigger detail.</td> </tr> <tr> <td><code class="readme-inline-code">engine::workers::list</code></td> <td>List workers with an open engine WS connection. Daemon-managed providers (<code class="readme-inline-code">http</code>, <code class="readme-inline-code">cron</code>, <code class="readme-inline-code">state</code>) won't appear — call <code class="readme-inline-code">worker::list</code> from the supervisor to see those.</td> </tr> <tr> <td><code class="readme-inline-code">engine::workers::info</code></td> <td>One worker's detail by <code class="readme-inline-code">name</code>.</td> </tr> </tbody></table> <h3 id="directoryregistry-workers-registry-http-proxy" class="scroll-mt-20"><code class="readme-inline-code">directory::registry::*</code> (workers registry HTTP proxy)</h3> <table> <thead> <tr> <th>Function ID</th> <th>Description</th> </tr> </thead> <tbody><tr> <td><code class="readme-inline-code">directory::registry::workers::list</code></td> <td>Browse / search published workers in <code class="readme-inline-code">api.workers.iii.dev</code>. Optional free-text <code class="readme-inline-code">search</code> (matched fuzzy by <code class="readme-inline-code">pg_trgm</code>) and opaque <code class="readme-inline-code">cursor</code> for pagination; page size is server-authored. Response is <code class="readme-inline-code">{ workers: [...], pagination: { next_cursor, has_more, page_size } }</code>. Shares the core <code class="readme-inline-code">name</code> / <code class="readme-inline-code">description</code> / <code class="readme-inline-code">version</code> fields with the engine's <code class="readme-inline-code">engine::workers::list</code>.</td> </tr> <tr> <td><code class="readme-inline-code">directory::registry::workers::info</code></td> <td>Pre-install card for one worker. Fans out two parallel registry calls — <code class="readme-inline-code">GET /w/{slug}</code> for the worker envelope (publication metadata + readme + functions + triggers) and <code class="readme-inline-code">GET /w/{slug}/skills</code> for the skills tree — and merges them into <code class="readme-inline-code">{ worker, api_reference, skills_tree, readme? }</code>. The card keeps public function/trigger names and descriptions only: request/response schemas, metadata, internal and search-excluded functions are dropped (browser's schemas alone ran 65 KB; the contract is <code class="readme-inline-code">engine::functions::info</code> after installing), and <code class="readme-inline-code">readme</code> (10–25 KB) is included only with <code class="readme-inline-code">readme: true</code>. The full record stays cached in-process for <code class="readme-inline-code">directory::search_functions</code>. Input still accepts <code class="readme-inline-code">version:</code> (semver) or <code class="readme-inline-code">tag:</code> (e.g. <code class="readme-inline-code">latest</code>); both go on the wire as <code class="readme-inline-code">?version=…</code>.</td> </tr> </tbody></table> <p>Both <code class="readme-inline-code">directory::registry::*</code> responses are cached in-process for <code class="readme-inline-code">registry_cache_ttl_ms</code> (default 60s).</p> <p>There is <strong>no</strong> <code class="readme-inline-code">directory::skills::register</code> — see <a href="#migration-from-skills-v02x">Migration</a> below.</p> <hr> <h2 id="function-search-pre-generate-hint" class="scroll-mt-20">Function search & pre-generate hint</h2> <p>One-shot function search over the live engine catalog. <code class="readme-inline-code">judge</code> (the default) ranks through the optional <code class="readme-inline-code">judge</code> worker when it is registered and answers, and otherwise behaves as <code class="readme-inline-code">hybrid</code> (BM25 fused with the local MiniLM model, reranked); <code class="readme-inline-code">lexical</code> is BM25 only. Absorbed from the former <code class="readme-inline-code">discovery</code> worker, it returns only compact <code class="readme-inline-code">{ function_id, description }</code> candidates, grouped by worker in rank order. The model chooses the candidates it needs, then fetches their contracts in one <code class="readme-inline-code">engine::functions::info { function_ids: [...] }</code> call instead of walking the catalog with <code class="readme-inline-code">engine::functions::list</code>.</p> <table> <thead> <tr> <th>Function</th> <th>Kind</th> <th>What it does</th> </tr> </thead> <tbody><tr> <td><code class="readme-inline-code">directory::search_functions</code></td> <td>public</td> <td><code class="readme-inline-code">{ capabilities }</code> → <code class="readme-inline-code">{ guidance, workers[], installable[]?, skills[]?, triggers[]?, search_mode, latency_ms }</code>: rank with the configured mode over the live engine catalog in batches of six capabilities (12 candidates per batch across at most max(6, 2 × capabilities) workers, up to 3 batches) plus matching NOT-installed registry workers under <code class="readme-inline-code">installable</code>. <code class="readme-inline-code">capabilities</code> is a required list of non-empty unmet external capability searches (one to six is the norm); entries past the 18th are not searched and are named in <code class="readme-inline-code">guidance</code>. Requests to summarize provided text/content are ignored.</td> </tr> <tr> <td><code class="readme-inline-code">directory::pre-generate</code></td> <td>internal hook</td> <td>Injects the conditional search hint into a harness generation (at most once per turn).</td> </tr> <tr> <td><code class="readme-inline-code">directory::on-functions-change</code></td> <td>internal</td> <td>Refreshes the search catalog on the engine's functions-available push.</td> </tr> <tr> <td><code class="readme-inline-code">directory::hint-preview</code></td> <td>internal</td> <td>The exact hint text per exposure mode, for the configuration UI.</td> </tr> </tbody></table> <p>Lexical/Hybrid ranking pipeline:</p> <ol> <li><strong>Corpus</strong>: the live engine catalog (boot snapshot + push refresh), slimmed to name + first description sentence + argument names. <code class="readme-inline-code">engine::</code> ids, functions published with <code class="readme-inline-code">metadata.internal</code>, and the search itself never participate — the worker's own public <code class="readme-inline-code">directory::*</code> functions are searchable like any other capability.</li> <li><strong>Scoring</strong>: Okapi BM25 (k1 1.2, b 0.75) with the function name indexed at 3× weight, camelCase segmentation (<code class="readme-inline-code">presignUrl</code> → presign + url), a 22-word grammatical stoplist, conservative plural folding, JSON-key stripping from capability text, and a two-distinct-terms minimum match.</li> <li><strong>Capability queries</strong>: each <code class="readme-inline-code">capabilities</code> entry is ranked independently against its own leader and is authoritative. Include every currently unmet external capability once in the same call. Write every capability in English, translating non-English requests while preserving proper names, URLs, and function ids. Requests to summarize provided text or content are ignored. Results merge round-robin so every capability gets a candidate before any gets a rider.</li> <li><strong>Pruning</strong>: coverage-aware function floor (≥50% of the leader AND full term coverage or ≥85% score) drops same-worker family riders; a namespace-level floor (40% of the leader) drops trailing workers.</li> <li><strong>Registry search</strong> (<code class="readme-inline-code">registry_search</code>, default on): every call also consults the private workers registry in-process with the same capability queries plus informative-term retries (all concurrent; every listed worker is a candidate — the registry is team-authored). Candidates merge round-robin across search variants; their API references are pooled and ranked per capability with the configured mode. Hybrid fuses BM25 with the MiniLM dense lane (same 0.30 admission floor as the installed catalog), so a capability sharing no vocabulary with a contract ("retrieve web news articles" → <code class="readme-inline-code">web::fetch</code>) still surfaces. Returns up to 2 workers / 6 candidates per batch of six capabilities (so up to 6 workers / 18 candidates across three batches; a worker two batches both surface keeps one entry with its functions merged) that WOULD match if installed, with <code class="readme-inline-code">compose::add</code> guidance.</li> <li><strong>Session memory</strong> (keyed by caller-supplied OTel baggage, fail-open): repeat queries omit candidates already delivered.</li> </ol> <h3 id="judge-mode" class="scroll-mt-20">Judge mode</h3> <p>Function relevance is judged by the <a href="../judge"><code class="readme-inline-code">judge</code></a> worker (<code class="readme-inline-code">judge::evaluate</code>), which forwards to its configured provider (<a href="../judge-typesafe"><code class="readme-inline-code">judge-typesafe</code></a> by default). Both are optional: this worker does not declare them as dependencies, because Compose turns a dependency into a <code class="readme-inline-code">start_after</code> edge and stops the directory whenever the judge exits. The Harness and dev-template stacks do not run them. Install the hub with <code class="readme-inline-code">iii trigger compose::add worker=judge</code> (it brings <code class="readme-inline-code">judge-typesafe</code>) and set the TypeSafe key and model in the <strong>judge-typesafe</strong> settings. This worker holds no credentials.</p> <p><code class="readme-inline-code">judge</code> is the default mode for new installs. It ranks through the judge only while <code class="readme-inline-code">judge::evaluate</code> is in the live function catalog and answers. <strong>Whenever the judge is unavailable the search uses Hybrid</strong> (then Lexical if the local model is not ready), for functions, installable workers, skills and triggers alike:</p> <ul> <li><code class="readme-inline-code">judge::evaluate</code> is not registered: no call is made at all.</li> <li>the hub has no provider (<code class="readme-inline-code">provider_unavailable</code>), or the provider has no API key (<code class="readme-inline-code">missing_key</code>): logged once at info.</li> <li>a provider error, transport failure or invalid reply: logged once as a warning.</li> <li>the judge deadline runs out: that lane alone uses Hybrid.</li> </ul> <p>After an unavailable or failing judge (the second and third cases), every search skips it for 30 seconds and uses Hybrid, so a missing key costs one fast round trip per 30 s rather than one per search. A key added to judge-typesafe, or a judge that comes back, is used within 30 seconds. A missed deadline does not pause the judge.</p> <p>An install that already stored <code class="readme-inline-code">function_search_mode: hybrid</code> keeps it: the stored configuration wins over the new default. Set <code class="readme-inline-code">judge</code> with <code class="readme-inline-code">configuration::set</code> (or the console form) to opt in.</p> <pre class="shiki shiki-themes min-light vesper" style="--shiki-light:#24292eff;--shiki-dark:#FFF;--shiki-light-bg:#ffffff;--shiki-dark-bg:#101010" tabindex="0"><code><span class="line"><span style="--shiki-light:#D32F2F;--shiki-dark:#FFC799">function_search_mode</span><span style="--shiki-light:#D32F2F;--shiki-dark:#FFF">:</span><span style="--shiki-light:#22863A;--shiki-dark:#99FFE4"> judge</span></span> <span class="line"><span style="--shiki-light:#D32F2F;--shiki-dark:#FFC799">function_search_judge_timeout_ms</span><span style="--shiki-light:#D32F2F;--shiki-dark:#FFF">:</span><span style="--shiki-light:#1976D2;--shiki-dark:#FFC799"> 3000</span></span> <span class="line"><span style="--shiki-light:#D32F2F;--shiki-dark:#FFC799">function_search_judge_min_relevance</span><span style="--shiki-light:#D32F2F;--shiki-dark:#FFF">:</span><span style="--shiki-light:#1976D2;--shiki-dark:#FFC799"> 0.5</span></span> <span class="line"><span style="--shiki-light:#D32F2F;--shiki-dark:#FFC799">function_search_judge_side_lane_min_relevance</span><span style="--shiki-light:#D32F2F;--shiki-dark:#FFF">:</span><span style="--shiki-light:#1976D2;--shiki-dark:#FFC799"> 0.3</span></span> <span class="line"><span style="--shiki-light:#D32F2F;--shiki-dark:#FFC799">function_search_judge_question</span><span style="--shiki-light:#D32F2F;--shiki-dark:#FFF">:</span><span style="--shiki-light:#22863A;--shiki-dark:#99FFE4"> choice</span></span> <span class="line"><span style="--shiki-light:#D32F2F;--shiki-dark:#FFC799">function_search_judge_choice_min_probability</span><span style="--shiki-light:#D32F2F;--shiki-dark:#FFF">:</span><span style="--shiki-light:#1976D2;--shiki-dark:#FFC799"> 0.1</span></span></code></pre><p>These fields apply without a restart. The timeout is an integer from 1 to 30000 ms and relevance a finite number from 0 to 1 inclusive. YAML seeds and JSON configuration updates use the same validation. The relevance floors were calibrated against <code class="readme-inline-code">jev-1.13.0</code>; judge-typesafe defaults to the <code class="readme-inline-code">jev-latest</code> alias, so pin its model if you rely on the floors.</p> <p>The judge scores a shortlist per capability, not the whole catalog. A corpus of at most 16 documents goes whole, so the judge still finds functions whose wording shares nothing with the capability. A larger one is cut to the top 16 of raw BM25 fused with the raw MiniLM ranking (when the index is ready). Each capability is one evaluation, and all capabilities of a lane (functions, registry pool, skills or triggers) travel in one <code class="readme-inline-code">judge::evaluate</code> call, so the provider answers them together with one model, and cancels the rest when one fails. Requests carry normalized capabilities, function IDs, short descriptions and parameter names; no conversation history or argument values. Exact eligible IDs, internal-function exclusions, session deduplication and result limits stay local.</p> <p><code class="readme-inline-code">function_search_judge_question</code> sets how each capability's shortlist is asked. <code class="readme-inline-code">choice</code> (the default) asks one multiple-choice question per capability whose options are the shortlisted documents: 16× fewer questions, and the documents compete. The best document is always kept and every other needs <code class="readme-inline-code">function_search_judge_choice_min_probability</code> (the relevance floors do not apply). <code class="readme-inline-code">noul</code> asks one yes/no question per document and admits each by the relevance floors. Local judges need <code class="readme-inline-code">choice</code> to fit the deadline: judge-semif answers a capability in about 0.3 s on a GPU, where the Noul shortlist of every lane takes it past 30 s. On 22 English capabilities over the 16-document shortlist, <code class="readme-inline-code">choice</code> with 0.1 kept a correct function in every search for both <code class="readme-inline-code">jev-1.13.0</code> (precision 0.98, 1.2 functions per capability) and judge-semif (precision 0.87, 1.5 functions). Providers register their <code class="readme-inline-code">judge-<provider>::*</code> functions as internal, so search results show only the hub's <code class="readme-inline-code">judge::*</code>.</p> <p>With <code class="readme-inline-code">choice</code>, a judge whose models advertise a context window under 4096 tokens (<code class="readme-inline-code">context_window</code> in <code class="readme-inline-code">judge::models::list</code>, re-read when the judge hub's configuration changes and at least once a minute) gets compact options instead of the full description objects: each option is keyed by the function id and reads the first eight words of its description, and the state names the capability plainly (<code class="readme-inline-code">{"capability": …}</code>). laya (512 tokens) shares about 190 of them among the sixteen options, so the objects cut the function ids themselves: live, it found the expected function in 13/22 searches with objects and 17/22 compact. SemIf (16384) and judges that advertise no window keep the objects.</p> <p><code class="readme-inline-code">tournament</code> skips the Hybrid shortlist, following TypeSafe's skill-suggestion pattern (skim everything cheaply, then read the few in detail). The whole function catalog, sorted by id, is skimmed in rounds of compact Choices (the function id and the first eight words of its description) over groups of up to 128, or 16 for a judge that advertises a context window under 4096 tokens, and never more than the judge's advertised <code class="readme-inline-code">max_options</code> (SemIf: 16); each group's three best go on (only the winner, for a small-window judge, whose final Choice degrades with more options) until 16 or fewer remain, and those get one final Choice with their full descriptions, admitted like <code class="readme-inline-code">choice</code>. A 260-function catalog takes one round of three groups, then the final Choice over nine. It needs no local semantic model. Live through <code class="readme-inline-code">directory::search_functions</code> over 22 English capabilities (RX 6900 XT), hit / top-1 / precision and median search time: JEV 22 / 22 / 1.00 at 2.2 s, SemIf 22 / 22 / 0.90 at 6.1 s, decider 22 / 21 / 0.88 at 3.7 s, laya 20 / 19 / 0.80 at 2.2 s; the former winner-only rounds of 16 gave JEV 22 / 22 / 0.98, decider 21 / 21 / 0.81 at 9.1 s, and timed SemIf out at 10 s. The installed functions and the registry pools play it; skills and triggers keep their shortlists. With <code class="readme-inline-code">choice</code> (the default), a judge that advertises a context window under 4096 tokens gets a tournament automatically; SemIf and hosted judges keep <code class="readme-inline-code">choice</code>.</p> <p><code class="readme-inline-code">function_search_model_path: null</code> is valid in judge mode and makes the Hybrid fallback BM25-only, without the local-model warning. With a configured path, the worker keeps an installed MiniLM bundle and its catalog index current, downloads a missing bundle at boot like Hybrid does, and uses the index both for the shortlist and for the fallback.</p> <p>Registry discovery still starts with the registry API's lexical search. The judge evaluates a shortlist of the returned contract pool and <strong>cannot recover workers that upstream search did not return</strong>. Installable results remain suggestions until installation.</p> <p>Every response carries <code class="readme-inline-code">search_mode</code> — the mode that actually ranked the results (<code class="readme-inline-code">judge</code>, <code class="readme-inline-code">hybrid</code> or <code class="readme-inline-code">lexical</code>), which can be lower than the configured mode when the judge was unavailable or paused, or the local model is not loaded yet. The console's search card shows it as the card's badge. A search whose lanes partly fell back reports the highest tier any lane reached.</p> <p>Every mode also ranks the installed skill documents (the rows <code class="readme-inline-code">directory::skills::list</code> serves, minus <code class="readme-inline-code">disable_model_invocation</code> ones) against the same capabilities and lists the matches under <code class="readme-inline-code">skills</code> as <code class="readme-inline-code">{ id, title, description }</code>, at most six per call round-robin across the capabilities, with a guidance note to read them through <code class="readme-inline-code">directory::skills::get { id }</code>. Each skill's id and a trimmed <code class="readme-inline-code">title: description</code> (300 bytes) form the document. The judge judges them with a how-to question under the same deadline as the functions; Lexical ranks them with BM25 and Hybrid fuses in the dense lane, the same ad-hoc document ranking the <code class="readme-inline-code">installable</code> section uses, and that local ranking also serves whenever the judge fails. "Installed" is read off the live function catalog: a worker with no registered functions contributes no skills. The registered-trigger section (under <code class="readme-inline-code">triggers</code>) is ranked the same way in every mode.</p> <p>A valid response with no functions at or above the relevance threshold stays empty. Judge failures instead trigger <strong>Judge → Hybrid → Lexical</strong> fallback. Hybrid uses the existing local ranking policy; if the model is disabled, missing, not yet indexed for the current catalog, or fails, Lexical serves the results. A registry HTTP failure still omits the installable section.</p> <p>The judge deadline is shared by every judge call of one public search. Capability batches run concurrently, and each batch's registry lookup runs in parallel with its installed-function judge call; the registry judge call then gets what is left of the deadline and, if nothing is, the pool is ranked locally. Local Hybrid fallback runs outside the budget. Evaluations are split at local byte limits (48 KiB per evaluation, 16 KiB for state plus the largest question); these guards are not token counts. Retries are the provider's policy (judge-typesafe retries 408/429/5xx within the deadline); the 30-second pause keeps a failing provider from being retried on every search. The hub's returned usage (<code class="readme-inline-code">stats</code>) is logged per lane at debug level.</p> <p>Switch to <code class="readme-inline-code">lexical</code> at any time to use BM25 only. Switching from <code class="readme-inline-code">lexical</code> to <code class="readme-inline-code">hybrid</code> or <code class="readme-inline-code">judge</code> prepares the local index from the current catalog. If the MiniLM bundle is missing, both use lexical fallback; the boot-time download and changes to the local model path require a worker restart.</p> <p><strong>Upgrading from the in-worker <code class="readme-inline-code">jev</code> mode:</strong> the stored value <code class="readme-inline-code">function_search_mode: jev</code> no longer parses, and the worker refuses to boot on it. While the old worker still runs, its schema only accepts <code class="readme-inline-code">lexical</code>/<code class="readme-inline-code">hybrid</code>/<code class="readme-inline-code">jev</code>, so before upgrading set the mode to <code class="readme-inline-code">hybrid</code> (or remove the key) with <code class="readme-inline-code">configuration::set</code>, then set <code class="readme-inline-code">judge</code> once the new worker is up. The removed keys <code class="readme-inline-code">function_search_jev_api_key</code> and <code class="readme-inline-code">function_search_jev_model</code> are ignored, and the console form drops every <code class="readme-inline-code">function_search_jev_*</code> key on its next save; the remaining settings are read under their <code class="readme-inline-code">function_search_judge_*</code> names only.</p> <h3 id="pre-generate-hint" class="scroll-mt-20">Pre-generate hint</h3> <p>The pre-generate hook appends one <code class="readme-inline-code"><discovery_assist></code> block pointing the model at <code class="readme-inline-code">search_functions</code>, telling it to derive capabilities from the goal and current execution state and to batch selected ids through <code class="readme-inline-code">engine::functions::info</code> — at most once per turn, and only when every gate clears: the function is callable in the surface, no search result is in the current task window yet, the surface spans at least <code class="readme-inline-code">hint_min_workers</code> distinct workers, the current task (from the latest user message) has no real function results yet, and it does not already name a callable function id. Measured on 26 pre-existing e2e scenarios: an unconditional hint <em>induces</em> redundant discovery on guided tasks (up to +110% tokens). The hook ships OFF by default (<code class="readme-inline-code">inject_hint: false</code>): the harness identity prompt already teaches <code class="readme-inline-code">directory::search_functions</code> as the default discovery path, so the hint is for deployments running a custom identity prompt without that doctrine. The hook's transcript annotations (<code class="readme-inline-code">origin.directory</code>) carry only coarse outcome/reason and counts.</p> <p>Knobs (<code class="readme-inline-code">inject_hint</code>, <code class="readme-inline-code">hint_min_workers</code>, <code class="readme-inline-code">registry_search</code>) live in the <code class="readme-inline-code">iii-directory</code> configuration entry and hot-apply — see Configuration.</p> <h2 id="custom-trigger-types" class="scroll-mt-20">Custom trigger types</h2> <table> <thead> <tr> <th>Trigger type</th> <th>Fires when</th> <th>Payload to subscribers</th> </tr> </thead> <tbody><tr> <td><code class="readme-inline-code">directory::skills::on-change</code></td> <td>After a <code class="readme-inline-code">directory::skills::download</code> that wrote at least one skill markdown file, a <code class="readme-inline-code">directory::skills::update</code>, <code class="readme-inline-code">create</code>, or <code class="readme-inline-code">delete</code>, or external (file pasted/edited/deleted directly on disk — including under <code class="readme-inline-code">agents_skills_folder</code>)</td> <td>download: <code class="readme-inline-code">{ "op": "download", "namespace": "<ns>", "source": "repo" | "registry" }</code>; update/create/delete: <code class="readme-inline-code">{ "op": "<operation>", "namespace": "<ns>", "id": "<id>" }</code>; external (file pasted/edited/deleted directly on disk): <code class="readme-inline-code">{ "op": "external" }</code></td> </tr> <tr> <td><code class="readme-inline-code">directory::system-prompts::on-change</code></td> <td>After a <code class="readme-inline-code">directory::skills::download</code> that wrote at least one system prompt markdown file, a <code class="readme-inline-code">directory::system-prompts::update</code>, <code class="readme-inline-code">create</code>, <code class="readme-inline-code">delete</code>, or external file change</td> <td>download: <code class="readme-inline-code">{ "op": "download", "namespace": "<ns>", "source": "repo" | "registry" }</code>; update/create/delete: <code class="readme-inline-code">{ "op": "<operation>", "name": "<name>" }</code>; external: <code class="readme-inline-code">{ "op": "external" }</code></td> </tr> <tr> <td><code class="readme-inline-code">directory::agents::on-change</code></td> <td>After a <code class="readme-inline-code">directory::skills::download</code> that wrote at least one agent profile, a <code class="readme-inline-code">directory::agents::update</code>, <code class="readme-inline-code">create</code>, <code class="readme-inline-code">delete</code>, or external file change</td> <td>download: <code class="readme-inline-code">{ "op": "download", "namespace": "<ns>", "source": "repo" | "registry" }</code>; update/create/delete: <code class="readme-inline-code">{ "op": "<operation>", "name": "<id>" }</code>; external: <code class="readme-inline-code">{ "op": "external" }</code></td> </tr> </tbody></table> <p>Dispatches are fire-and-forget (Void), so the write path doesn't block on downstream latency.</p> <p>The <code class="readme-inline-code">external</code> op comes from a filesystem watch over <code class="readme-inline-code">skills_folder</code>, <code class="readme-inline-code">local_skills_folder</code>, and (when it already exists) the read-only <code class="readme-inline-code">agents_skills_folder</code>. It is a doorbell, not a ledger: every read re-scans disk, so a missed event costs a stale open view until the next call, never data. A burst coalesces into one event per kind, and this worker's own writes are suppressed — a <code class="readme-inline-code">create</code> or <code class="readme-inline-code">update</code> sends its precise op and never an extra <code class="readme-inline-code">external</code>.</p> <p><strong>Loop hazard for subscribers.</strong> Suppression covers writes made <em>through this worker</em>. A subscriber that reacts to <code class="readme-inline-code">{ "op": "external" }</code> by writing <code class="readme-inline-code">.md</code> files under <code class="readme-inline-code">skills_folder</code> by some other route — a shell or coder worker, a script — is not suppressed and will re-trigger itself. Either write through <code class="readme-inline-code">directory::*::update</code> / <code class="readme-inline-code">create</code>, or make the reaction idempotent and gated.</p> <hr> <h2 id="local-development-testing" class="scroll-mt-20">Local development & testing</h2> <h3 id="run-from-source" class="scroll-mt-20">Run from source</h3> <p>On targets with a pinned static ONNX Runtime (Linux glibc x86_64/aarch64, Apple Silicon macOS, Windows MSVC) every build links it and MiniLM retrieval and reranking are compiled in. With no <code class="readme-inline-code">ORT_LIB_PATH</code>, <code class="readme-inline-code">ort-sys</code> downloads the runtime for the build target at build time (SHA-256-verified). For offline or cached x86_64 Linux builds, provision it once and export the path it prints:</p> <pre class="shiki shiki-themes min-light vesper" style="--shiki-light:#24292eff;--shiki-dark:#FFF;--shiki-light-bg:#ffffff;--shiki-dark-bg:#101010" tabindex="0"><code><span class="line"><span style="--shiki-light:#D32F2F;--shiki-dark:#A0A0A0">export</span><span style="--shiki-light:#24292EFF;--shiki-dark:#FFF"> ORT_LIB_PATH</span><span style="--shiki-light:#D32F2F;--shiki-dark:#A0A0A0">=</span><span style="--shiki-light:#22863A;--shiki-dark:#99FFE4">"$(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#FFC799">scripts/provision-onnxruntime.sh</span><span style="--shiki-light:#22863A;--shiki-dark:#99FFE4">)"</span><span style="--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94"> # idempotent, SHA-256 verified</span></span> <span class="line"><span style="--shiki-light:#D32F2F;--shiki-dark:#A0A0A0">export</span><span style="--shiki-light:#24292EFF;--shiki-dark:#FFF"> ORT_PREFER_DYNAMIC_LINK</span><span style="--shiki-light:#D32F2F;--shiki-dark:#A0A0A0">=</span><span style="--shiki-light:#1976D2;--shiki-dark:#FFC799">0</span></span></code></pre><p>Other targets (musl, armv7, Intel macOS) build the BM25-only worker and need nothing extra.</p> <pre class="shiki shiki-themes min-light vesper" style="--shiki-light:#24292eff;--shiki-dark:#FFF;--shiki-light-bg:#ffffff;--shiki-dark-bg:#101010" tabindex="0"><code><span class="line"><span style="--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94"># --config is an optional YAML seed (see config.yaml.example); omit it to</span></span> <span class="line"><span style="--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94"># rely on the value stored in the `configuration` worker (or built-in defaults).</span></span> <span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#FFC799">cargo</span><span style="--shiki-light:#2B5581;--shiki-dark:#99FFE4"> run</span><span style="--shiki-light:#2B5581;--shiki-dark:#99FFE4"> --release</span><span style="--shiki-light:#2B5581;--shiki-dark:#99FFE4"> --</span><span style="--shiki-light:#2B5581;--shiki-dark:#99FFE4"> --url</span><span style="--shiki-light:#2B5581;--shiki-dark:#99FFE4"> ws://127.0.0.1:49134</span><span style="--shiki-light:#2B5581;--shiki-dark:#99FFE4"> --config</span><span style="--shiki-light:#2B5581;--shiki-dark:#99FFE4"> ./config.yaml.example</span></span></code></pre><h3 id="tests" class="scroll-mt-20">Tests</h3> <pre class="shiki shiki-themes min-light vesper" style="--shiki-light:#24292eff;--shiki-dark:#FFF;--shiki-light-bg:#ffffff;--shiki-dark-bg:#101010" tabindex="0"><code><span class="line"><span style="--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94"># Fast, offline — exercises the pure helpers (markdown / id validators</span></span> <span class="line"><span style="--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94"># / fs source) without needing an iii engine.</span></span> <span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#FFC799">cargo</span><span style="--shiki-light:#2B5581;--shiki-dark:#99FFE4"> test</span><span style="--shiki-light:#2B5581;--shiki-dark:#99FFE4"> --lib</span></span> <span class="line"></span> <span class="line"><span style="--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94"># Full BDD suite — requires an iii engine on ws://127.0.0.1:49134</span></span> <span class="line"><span style="--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94"># (or III_ENGINE_WS_URL). The git-backed download scenarios spin up</span></span> <span class="line"><span style="--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94"># a local fixture repo via `git init`; the registry-backed scenarios</span></span> <span class="line"><span style="--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94"># point a wiremock server at the worker's `registry_url` config.</span></span> <span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#FFC799">cargo</span><span style="--shiki-light:#2B5581;--shiki-dark:#99FFE4"> test</span></span> <span class="line"></span> <span class="line"><span style="--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94"># One feature group at a time. Available tags:</span></span> <span class="line"><span style="--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94"># @engine @read @download @download_repo @download_registry</span></span> <span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#FFC799">cargo</span><span style="--shiki-light:#2B5581;--shiki-dark:#99FFE4"> test</span><span style="--shiki-light:#2B5581;--shiki-dark:#99FFE4"> --test</span><span style="--shiki-light:#2B5581;--shiki-dark:#99FFE4"> bdd</span><span style="--shiki-light:#2B5581;--shiki-dark:#99FFE4"> --</span><span style="--shiki-light:#2B5581;--shiki-dark:#99FFE4"> --tags</span><span style="--shiki-light:#2B5581;--shiki-dark:#99FFE4"> @download</span></span></code></pre><p>The BDD harness lives under <a href="tests/">tests/</a>. Feature files mirror the modules in <a href="src/functions/">src/functions/</a>. Step definitions under <a href="tests/steps/">tests/steps/</a> drive each feature through the same <code class="readme-inline-code">iii.trigger</code> path the production binary uses.</p> </div></div></section></div><aside class="flex min-w-0 flex-col gap-y-6 @4xl:col-start-2 @4xl:row-start-2 @4xl:self-start"><dl class="grid grid-cols-2 gap-x-6"><div class="flex min-w-0 flex-col gap-y-1 border-t border-line py-3 col-span-2"><dt class="text-[13px] text-muted-foreground">Repository</dt><dd class="min-w-0 text-foreground"><a href="https://github.com/iii-hq/workers" target="_blank" rel="noreferrer" class="inline-flex max-w-full items-center gap-x-2 text-[14px] font-medium transition-colors duration-150 hover:text-brand"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" focusable="false" class="size-4 shrink-0"><path fill-rule="evenodd" clip-rule="evenodd" d="M12 2.69922C6.762 2.69922 2.5 6.96122 2.5 12.1992C2.5 16.3252 5.24 20.0532 9.164 21.2662C9.324 21.3182 9.498 21.2822 9.627 21.1762C9.757 21.0702 9.825 20.9062 9.809 20.7392C9.669 19.3462 10.47 17.8702 10.812 17.5162C10.944 17.3812 10.988 17.1822 10.925 17.0042C10.862 16.8252 10.704 16.6962 10.516 16.6732C8.725 16.4452 7.067 15.8372 7.067 12.9472C7.063 12.2282 7.337 11.5412 7.836 11.0122C7.968 10.8732 8.009 10.6712 7.941 10.4922C7.75 9.98722 7.729 9.42222 7.877 8.90022C8.168 8.94822 8.731 9.11922 9.608 9.70522C9.728 9.78622 9.877 9.80722 10.015 9.77222C11.312 9.42422 12.682 9.42422 13.979 9.77222C14.116 9.80722 14.266 9.78622 14.386 9.70522C15.27 9.11422 15.835 8.94522 16.115 8.89622C16.264 9.42022 16.245 9.98622 16.054 10.4932C15.986 10.6732 16.027 10.8752 16.16 11.0132C16.654 11.5332 16.927 12.2172 16.927 12.9382C16.927 15.8772 15.273 16.4642 13.486 16.6612C13.296 16.6812 13.135 16.8092 13.071 16.9882C13.006 17.1682 13.049 17.3692 13.182 17.5062C13.512 17.8472 14.321 19.3622 14.185 20.7502C14.168 20.9172 14.236 21.0812 14.367 21.1862C14.457 21.2612 14.569 21.2992 14.682 21.2992C14.732 21.2992 14.783 21.2912 14.832 21.2752C18.82 20.0202 21.5 16.3732 21.5 12.1992C21.5 6.96122 17.238 2.69922 12 2.69922Z"></path></svg><span class="truncate">iii-hq/workers</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right size-3.5 shrink-0 text-muted-foreground" aria-hidden="true"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></a></dd></div><div class="flex min-w-0 flex-col gap-y-1 border-t border-line py-3 col-span-2"><dt class="text-[13px] text-muted-foreground">Weekly installs</dt><dd class="min-w-0 text-foreground"><span class="font-[550] tabular-nums text-[24px] tracking-[-0.03em]">815</span><div role="img" aria-label="Daily installs over the last 7 completed days: 67, 114, 150, 79, 287, 83, 35" class="relative min-w-0 mt-3"><svg viewBox="0 0 340 52" aria-hidden="true" class="block h-auto w-full overflow-visible text-foreground"><defs><linearGradient id="installs-_R_k9sav5ubspb_" x1="0" y1="0" x2="0" y2="1"><stop offset="0%" stop-color="currentColor" stop-opacity="0.16"></stop><stop offset="100%" stop-color="currentColor" stop-opacity="0"></stop></linearGradient><linearGradient id="installs-_R_k9sav5ubspb_-fade" x1="0" y1="0" x2="1" y2="0"><stop offset="0%" stop-color="white" stop-opacity="0"></stop><stop offset="25%" stop-color="white" stop-opacity="1"></stop></linearGradient><mask id="installs-_R_k9sav5ubspb_-mask"><rect width="340" height="52" fill="url(#installs-_R_k9sav5ubspb_-fade)"></rect></mask></defs><path d="M4.00,41.67 C22.44,39.06 40.89,36.14 59.33,33.83 C77.78,31.53 96.22,27.83 114.67,27.83 C133.11,27.83 151.56,39.67 170.00,39.67 C188.44,39.67 206.89,5.00 225.33,5.00 C243.78,5.00 262.22,32.00 280.67,39.00 C299.11,46.00 317.56,44.33 336.00,47.00 L336,52 L4,52 Z" fill="url(#installs-_R_k9sav5ubspb_)" mask="url(#installs-_R_k9sav5ubspb_-mask)" style="opacity:0;transition:opacity 500ms cubic-bezier(0.2, 0.8, 0.3, 1) 200ms"></path><line x1="0" x2="0" y1="0" y2="52" stroke="currentColor" stroke-width="1" stroke-dasharray="2 2" style="opacity:0;translate:336px 0;transition:opacity 150ms cubic-bezier(0.2, 0.8, 0.3, 1), translate 180ms cubic-bezier(0.2, 0.8, 0.3, 1)"></line><path d="M4.00,41.67 C22.44,39.06 40.89,36.14 59.33,33.83 C77.78,31.53 96.22,27.83 114.67,27.83 C133.11,27.83 151.56,39.67 170.00,39.67 C188.44,39.67 206.89,5.00 225.33,5.00 C243.78,5.00 262.22,32.00 280.67,39.00 C299.11,46.00 317.56,44.33 336.00,47.00" pathLength="1" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="1 1.1" style="stroke-dashoffset:1.05;transition:stroke-dashoffset 650ms cubic-bezier(0.2, 0.8, 0.3, 1)"></path><g style="translate:336px 47px;transition:translate 180ms cubic-bezier(0.2, 0.8, 0.3, 1)"><circle r="3.25" fill="var(--background)" stroke="currentColor" stroke-width="1.5" class="origin-center [transform-box:fill-box]" style="scale:0;transition:scale 250ms cubic-bezier(0.34, 1.56, 0.64, 1) 550ms"></circle></g></svg></div></dd></div><div class="flex min-w-0 flex-col gap-y-1 border-t border-line py-3"><dt class="text-[13px] text-muted-foreground">Version</dt><dd class="min-w-0 text-foreground"><span class="text-[16px] font-[550] leading-tight tracking-[-0.02em] tabular-nums block truncate">v<!-- -->1.2.38</span></dd></div><div class="flex min-w-0 flex-col gap-y-1 border-t border-line py-3"><dt class="text-[13px] text-muted-foreground">License</dt><dd class="min-w-0 text-foreground"><span class="text-[16px] font-[550] leading-tight tracking-[-0.02em] tabular-nums block truncate">Apache-2.0</span></dd></div><div class="flex min-w-0 flex-col gap-y-1 border-t border-line py-3"><dt class="text-[13px] text-muted-foreground">Total installs</dt><dd class="min-w-0 text-foreground"><span class="text-[16px] font-[550] leading-tight tracking-[-0.02em] tabular-nums">5,963</span></dd></div><div class="flex min-w-0 flex-col gap-y-1 border-t border-line py-3"><dt class="text-[13px] text-muted-foreground">Type</dt><dd class="min-w-0 text-foreground"><span class="text-[16px] font-[550] leading-tight tracking-[-0.02em] tabular-nums block truncate">binary</span></dd></div><div class="flex min-w-0 flex-col gap-y-1 border-t border-line py-3"><dt class="text-[13px] text-muted-foreground">Functions</dt><dd class="min-w-0 text-foreground"><a class="text-[16px] font-[550] leading-tight tracking-[-0.02em] tabular-nums transition-colors duration-150 hover:text-brand" href="/registry/workers/iii-directory?version=1.2.38&tab=api">31</a></dd></div><div class="flex min-w-0 flex-col gap-y-1 border-t border-line py-3"><dt class="text-[13px] text-muted-foreground">Triggers</dt><dd class="min-w-0 text-foreground"><a class="text-[16px] font-[550] leading-tight tracking-[-0.02em] tabular-nums transition-colors duration-150 hover:text-brand" href="/registry/workers/iii-directory?version=1.2.38&tab=api">3</a></dd></div><div class="flex min-w-0 flex-col gap-y-1 border-t border-line py-3"><dt class="text-[13px] text-muted-foreground">Skills</dt><dd class="min-w-0 text-foreground"><a class="text-[16px] font-[550] leading-tight tracking-[-0.02em] tabular-nums transition-colors duration-150 hover:text-brand" href="/registry/workers/iii-directory?version=1.2.38&tab=skills">5</a></dd></div><div class="flex min-w-0 flex-col gap-y-1 border-t border-line py-3"><dt class="text-[13px] text-muted-foreground">Dependencies</dt><dd class="min-w-0 text-foreground"><a class="text-[16px] font-[550] leading-tight tracking-[-0.02em] tabular-nums transition-colors duration-150 hover:text-brand" href="/registry/workers/iii-directory?version=1.2.38&tab=deps">1</a></dd></div><div class="flex min-w-0 flex-col gap-y-1 border-t border-line py-3"><dt class="text-[13px] text-muted-foreground">Last publish</dt><dd class="min-w-0 text-foreground"><time dateTime="2026-10-08T17:14:07.257Z" title="2026-10-08T17:14:07.257Z" class="text-[16px] font-[550] leading-tight tracking-[-0.02em] tabular-nums block truncate">11d ago</time></dd></div><div class="flex min-w-0 flex-col gap-y-1 border-t border-line py-3 col-span-2"><dt class="text-[13px] text-muted-foreground">Platforms</dt><dd class="min-w-0 text-foreground"><ul aria-label="Supported platforms" class="flex flex-wrap items-center gap-2 mt-1"><li title="macOS: arm64, x64" class="inline-flex items-center rounded-md border border-line bg-background font-mono text-muted-foreground h-8 gap-x-2 px-2.5 text-[13px]"><img alt="" aria-hidden="true" loading="lazy" width="209" height="256" decoding="async" data-nimg="1" class="shrink-0 opacity-80 [filter:brightness(0)] dark:[filter:brightness(0)_invert(1)] h-3.5 w-auto" style="color:transparent" src="/registry/icons/apple_dark.svg?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC"/><span class="sr-only">macOS<!-- -->: </span><span class="tabular-nums">arm64 · x64</span></li><li title="Linux: arm64, armv7, x64" class="inline-flex items-center rounded-md border border-line bg-background font-mono text-muted-foreground h-8 gap-x-2 px-2.5 text-[13px]"><img alt="" aria-hidden="true" loading="lazy" width="256" height="295" decoding="async" data-nimg="1" class="shrink-0 opacity-80 [filter:brightness(0)] dark:[filter:brightness(0)_invert(1)] h-3.5 w-auto" style="color:transparent" src="/registry/icons/linux.svg?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC"/><span class="sr-only">Linux<!-- -->: </span><span class="tabular-nums">arm64 · armv7 · x64</span></li><li title="Windows: arm64, x64" class="inline-flex items-center rounded-md border border-line bg-background font-mono text-muted-foreground h-8 gap-x-2 px-2.5 text-[13px]"><img alt="" aria-hidden="true" loading="lazy" width="88" height="88" decoding="async" data-nimg="1" class="shrink-0 opacity-80 [filter:brightness(0)] dark:[filter:brightness(0)_invert(1)] h-3.5 w-auto" style="color:transparent" src="/registry/icons/windows.svg?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC"/><span class="sr-only">Windows<!-- -->: </span><span class="tabular-nums">arm64 · x64</span></li></ul></dd></div><div class="flex min-w-0 flex-col gap-y-1 border-t border-line py-3 col-span-2"><dt class="text-[13px] text-muted-foreground">Author</dt><dd class="min-w-0 text-foreground"><span class="inline-flex min-w-0 items-center gap-x-2"><img src="https://iii.dev/docs/_mintlify/favicons/motiadev/AFkVbz_UcSL_5jsm/_generated/favicon/apple-touch-icon.png" alt="" class="size-5 shrink-0 rounded-full border border-line object-cover"/><span class="truncate text-[13px] font-medium text-foreground">iii</span><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" focusable="false" class="size-3.5 shrink-0 text-verified" aria-label="Verified author"><path fill-rule="evenodd" clip-rule="evenodd" d="M15.5837 10.5577L11.5107 14.6327C11.3697 14.7737 11.1787 14.8527 10.9797 14.8527C10.7807 14.8527 10.5897 14.7737 10.4497 14.6327L8.47274 12.6527C8.18075 12.3587 8.18075 11.8837 8.47375 11.5907C8.76775 11.2987 9.24174 11.2997 9.53475 11.5917L10.9807 13.0407L14.5227 9.49667C14.8157 9.20367 15.2907 9.20367 15.5837 9.49667C15.8767 9.78967 15.8767 10.2647 15.5837 10.5577ZM20.7037 10.0857L20.0047 9.38667C19.6857 9.06667 19.5107 8.64067 19.5107 8.18967V7.18967C19.5107 5.70067 18.2987 4.48967 16.8107 4.48967H15.8087C15.3557 4.48967 14.9307 4.31467 14.6127 3.99667L13.9017 3.28667C12.8447 2.23867 11.1327 2.24367 10.0837 3.29767L9.38674 3.99667C9.06574 4.31567 8.64075 4.49067 8.18875 4.49067H7.18775C5.71675 4.49167 4.51675 5.67567 4.48975 7.14167C4.48874 7.15767 4.48775 7.17367 4.48775 7.19067V8.18767C4.48775 8.63967 4.31275 9.06467 3.99375 9.38367L3.28575 10.0927C3.28475 10.0957 3.28175 10.0967 3.27975 10.0987C2.23475 11.1567 2.24375 12.8687 3.29675 13.9117L3.99575 14.6127C4.31375 14.9317 4.48975 15.3557 4.48975 15.8077V16.8127C4.48975 18.3007 5.69975 19.5117 7.18775 19.5117H8.18675C8.63975 19.5127 9.06475 19.6877 9.38275 20.0047L10.0957 20.7157C10.6037 21.2207 11.2777 21.4987 11.9947 21.4987H12.0067C12.7277 21.4957 13.4037 21.2117 13.9097 20.7027L14.6107 20.0027C14.9257 19.6887 15.3617 19.5087 15.8067 19.5087H16.8127C18.2977 19.5087 19.5087 18.2997 19.5117 16.8127V15.8097C19.5117 15.3587 19.6867 14.9337 20.0037 14.6147L20.7147 13.9037C21.7647 12.8477 21.7587 11.1347 20.7037 10.0857Z"></path></svg></span></dd></div></dl><section id="used-in-kits" aria-labelledby="used-in-kits-title" class="overflow-hidden rounded-xl border border-line bg-paper scroll-mt-20"><div class="flex min-h-11 items-center justify-between gap-x-3 border-b border-line px-4"><span id="used-in-kits-title" class="font-mono text-[10px] uppercase tracking-[0.08em] text-muted-foreground">Used in <!-- -->1<!-- --> <!-- -->kit</span></div><ul class="flex flex-col p-2"><li><a class="group flex items-start gap-x-3 rounded-lg px-2 py-2 transition-colors duration-150 hover:bg-code focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:outline-brand" href="/registry/kits/iii/deepwork"><span class="grid size-8 shrink-0 place-items-center rounded-[9px] border border-line bg-background"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor" focusable="false" aria-hidden="true" class="shrink-0 text-foreground size-3.5"><g transform="translate(2 2)"><path d="M5.9199,11.4697 C7.3299,11.4697 8.4599,12.6107 8.4599,14.0307 L8.4599,14.0307 L8.4599,17.4397 C8.4599,18.8497 7.3299,19.9997 5.9199,19.9997 L5.9199,19.9997 L2.5399,19.9997 C1.1399,19.9997 -0.0001,18.8497 -0.0001,17.4397 L-0.0001,17.4397 L-0.0001,14.0307 C-0.0001,12.6107 1.1399,11.4697 2.5399,11.4697 L2.5399,11.4697 Z M17.46,11.4697 C18.86,11.4697 20,12.6107 20,14.0307 L20,14.0307 L20,17.4397 C20,18.8497 18.86,19.9997 17.46,19.9997 L17.46,19.9997 L14.08,19.9997 C12.67,19.9997 11.54,18.8497 11.54,17.4397 L11.54,17.4397 L11.54,14.0307 C11.54,12.6107 12.67,11.4697 14.08,11.4697 L14.08,11.4697 Z M5.9199,-9.32587341e-14 C7.3299,-9.32587341e-14 8.4599,1.15 8.4599,2.561 L8.4599,2.561 L8.4599,5.97 C8.4599,7.39 7.3299,8.53 5.9199,8.53 L5.9199,8.53 L2.5399,8.53 C1.1399,8.53 -0.0001,7.39 -0.0001,5.97 L-0.0001,5.97 L-0.0001,2.561 C-0.0001,1.15 1.1399,-9.32587341e-14 2.5399,-9.32587341e-14 L2.5399,-9.32587341e-14 Z M17.46,-9.32587341e-14 C18.86,-9.32587341e-14 20,1.15 20,2.561 L20,2.561 L20,5.97 C20,7.39 18.86,8.53 17.46,8.53 L17.46,8.53 L14.08,8.53 C12.67,8.53 11.54,7.39 11.54,5.97 L11.54,5.97 L11.54,2.561 C11.54,1.15 12.67,-9.32587341e-14 14.08,-9.32587341e-14 L14.08,-9.32587341e-14 Z"></path></g></svg></span><span class="min-w-0 flex flex-col gap-y-0.5"><span class="truncate text-[13px] font-medium text-foreground"><span class="text-muted-foreground">iii<!-- -->/</span>deepwork</span><span class="font-mono text-[13px] tabular-nums text-muted-foreground">v<!-- -->0.4.3<!-- --> · <!-- -->6<!-- --> <!-- -->profiles</span></span></a></li></ul></section><section class="shrink-0 overflow-hidden rounded-xl border border-line bg-paper scroll-mt-20"><div class="flex min-h-11 items-center justify-between gap-x-3 border-b border-line px-4"><span class="font-mono text-[10px] uppercase tracking-[0.08em] text-muted-foreground">api</span></div><div class="flex flex-col p-0 gap-y-0"><div class="flex flex-col gap-y-5 p-4"><div class="flex flex-col gap-y-2"><div class="flex items-baseline justify-between font-mono text-[10px] uppercase tracking-[0.08em] text-muted-foreground"><span>functions</span><span class="tabular-nums">31</span></div><ul class="-mx-2 flex flex-col"><li><a class="block truncate rounded-md px-2 py-1 font-mono text-[12px] transition-colors duration-150 focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:outline-brand text-muted-foreground hover:bg-code hover:text-foreground" href="/registry/workers/iii-directory?tab=api&version=1.2.38#fn-directory::__on_worker_added">directory::__on_worker_added</a></li><li><a class="block truncate rounded-md px-2 py-1 font-mono text-[12px] transition-colors duration-150 focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:outline-brand text-muted-foreground hover:bg-code hover:text-foreground" href="/registry/workers/iii-directory?tab=api&version=1.2.38#fn-directory::agents::create">directory::agents::create</a></li><li><a class="block truncate rounded-md px-2 py-1 font-mono text-[12px] transition-colors duration-150 focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:outline-brand text-muted-foreground hover:bg-code hover:text-foreground" href="/registry/workers/iii-directory?tab=api&version=1.2.38#fn-directory::agents::delete">directory::agents::delete</a></li><li><a class="block truncate rounded-md px-2 py-1 font-mono text-[12px] transition-colors duration-150 focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:outline-brand text-muted-foreground hover:bg-code hover:text-foreground" href="/registry/workers/iii-directory?tab=api&version=1.2.38#fn-directory::agents::functions::add">directory::agents::functions::add</a></li><li><a class="block truncate rounded-md px-2 py-1 font-mono text-[12px] transition-colors duration-150 focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:outline-brand text-muted-foreground hover:bg-code hover:text-foreground" href="/registry/workers/iii-directory?tab=api&version=1.2.38#fn-directory::agents::functions::remove">directory::agents::functions::remove</a></li><li><a class="block truncate rounded-md px-2 py-1 font-mono text-[12px] transition-colors duration-150 focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:outline-brand text-muted-foreground hover:bg-code hover:text-foreground" href="/registry/workers/iii-directory?tab=api&version=1.2.38#fn-directory::agents::get">directory::agents::get</a></li><li><a class="block truncate rounded-md px-2 py-1 font-mono text-[12px] transition-colors duration-150 focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:outline-brand text-muted-foreground hover:bg-code hover:text-foreground" href="/registry/workers/iii-directory?tab=api&version=1.2.38#fn-directory::agents::list">directory::agents::list</a></li><li><a class="block truncate rounded-md px-2 py-1 font-mono text-[12px] transition-colors duration-150 focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:outline-brand text-muted-foreground hover:bg-code hover:text-foreground" href="/registry/workers/iii-directory?tab=api&version=1.2.38#fn-directory::agents::update">directory::agents::update</a></li><li><a class="block truncate rounded-md px-2 py-1 font-mono text-[12px] transition-colors duration-150 focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:outline-brand text-muted-foreground hover:bg-code hover:text-foreground" href="/registry/workers/iii-directory?tab=api&version=1.2.38#fn-directory::engine::functions::info">directory::engine::functions::info</a></li><li><a class="block truncate rounded-md px-2 py-1 font-mono text-[12px] transition-colors duration-150 focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:outline-brand text-muted-foreground hover:bg-code hover:text-foreground" href="/registry/workers/iii-directory?tab=api&version=1.2.38#fn-directory::hint-preview">directory::hint-preview</a></li><li><a class="block truncate rounded-md px-2 py-1 font-mono text-[12px] transition-colors duration-150 focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:outline-brand text-muted-foreground hover:bg-code hover:text-foreground" href="/registry/workers/iii-directory?tab=api&version=1.2.38#fn-directory::on-config-change">directory::on-config-change</a></li><li><a class="block truncate rounded-md px-2 py-1 font-mono text-[12px] transition-colors duration-150 focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:outline-brand text-muted-foreground hover:bg-code hover:text-foreground" href="/registry/workers/iii-directory?tab=api&version=1.2.38#fn-directory::on-functions-change">directory::on-functions-change</a></li><li><a class="block truncate rounded-md px-2 py-1 font-mono text-[12px] transition-colors duration-150 focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:outline-brand text-muted-foreground hover:bg-code hover:text-foreground" href="/registry/workers/iii-directory?tab=api&version=1.2.38#fn-directory::pre-generate">directory::pre-generate</a></li><li><a class="block truncate rounded-md px-2 py-1 font-mono text-[12px] transition-colors duration-150 focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:outline-brand text-muted-foreground hover:bg-code hover:text-foreground" href="/registry/workers/iii-directory?tab=api&version=1.2.38#fn-directory::registry::workers::info">directory::registry::workers::info</a></li><li><a class="block truncate rounded-md px-2 py-1 font-mono text-[12px] transition-colors duration-150 focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:outline-brand text-muted-foreground hover:bg-code hover:text-foreground" href="/registry/workers/iii-directory?tab=api&version=1.2.38#fn-directory::registry::workers::list">directory::registry::workers::list</a></li><li><a class="block truncate rounded-md px-2 py-1 font-mono text-[12px] transition-colors duration-150 focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:outline-brand text-muted-foreground hover:bg-code hover:text-foreground" href="/registry/workers/iii-directory?tab=api&version=1.2.38#fn-directory::search_functions">directory::search_functions</a></li><li><a class="block truncate rounded-md px-2 py-1 font-mono text-[12px] transition-colors duration-150 focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:outline-brand text-muted-foreground hover:bg-code hover:text-foreground" href="/registry/workers/iii-directory?tab=api&version=1.2.38#fn-directory::skills::create">directory::skills::create</a></li><li><a class="block truncate rounded-md px-2 py-1 font-mono text-[12px] transition-colors duration-150 focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:outline-brand text-muted-foreground hover:bg-code hover:text-foreground" href="/registry/workers/iii-directory?tab=api&version=1.2.38#fn-directory::skills::delete">directory::skills::delete</a></li><li><a class="block truncate rounded-md px-2 py-1 font-mono text-[12px] transition-colors duration-150 focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:outline-brand text-muted-foreground hover:bg-code hover:text-foreground" href="/registry/workers/iii-directory?tab=api&version=1.2.38#fn-directory::skills::download">directory::skills::download</a></li><li><a class="block truncate rounded-md px-2 py-1 font-mono text-[12px] transition-colors duration-150 focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:outline-brand text-muted-foreground hover:bg-code hover:text-foreground" href="/registry/workers/iii-directory?tab=api&version=1.2.38#fn-directory::skills::download_from_registry">directory::skills::download_from_registry</a></li><li><a class="block truncate rounded-md px-2 py-1 font-mono text-[12px] transition-colors duration-150 focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:outline-brand text-muted-foreground hover:bg-code hover:text-foreground" href="/registry/workers/iii-directory?tab=api&version=1.2.38#fn-directory::skills::download_from_repo">directory::skills::download_from_repo</a></li><li><a class="block truncate rounded-md px-2 py-1 font-mono text-[12px] transition-colors duration-150 focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:outline-brand text-muted-foreground hover:bg-code hover:text-foreground" href="/registry/workers/iii-directory?tab=api&version=1.2.38#fn-directory::skills::get">directory::skills::get</a></li><li><a class="block truncate rounded-md px-2 py-1 font-mono text-[12px] transition-colors duration-150 focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:outline-brand text-muted-foreground hover:bg-code hover:text-foreground" href="/registry/workers/iii-directory?tab=api&version=1.2.38#fn-directory::skills::index">directory::skills::index</a></li><li><a class="block truncate rounded-md px-2 py-1 font-mono text-[12px] transition-colors duration-150 focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:outline-brand text-muted-foreground hover:bg-code hover:text-foreground" href="/registry/workers/iii-directory?tab=api&version=1.2.38#fn-directory::skills::list">directory::skills::list</a></li><li><a class="block truncate rounded-md px-2 py-1 font-mono text-[12px] transition-colors duration-150 focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:outline-brand text-muted-foreground hover:bg-code hover:text-foreground" href="/registry/workers/iii-directory?tab=api&version=1.2.38#fn-directory::skills::update">directory::skills::update</a></li><li><a class="block truncate rounded-md px-2 py-1 font-mono text-[12px] transition-colors duration-150 focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:outline-brand text-muted-foreground hover:bg-code hover:text-foreground" href="/registry/workers/iii-directory?tab=api&version=1.2.38#fn-directory::system-prompts::create">directory::system-prompts::create</a></li><li><a class="block truncate rounded-md px-2 py-1 font-mono text-[12px] transition-colors duration-150 focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:outline-brand text-muted-foreground hover:bg-code hover:text-foreground" href="/registry/workers/iii-directory?tab=api&version=1.2.38#fn-directory::system-prompts::delete">directory::system-prompts::delete</a></li><li><a class="block truncate rounded-md px-2 py-1 font-mono text-[12px] transition-colors duration-150 focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:outline-brand text-muted-foreground hover:bg-code hover:text-foreground" href="/registry/workers/iii-directory?tab=api&version=1.2.38#fn-directory::system-prompts::get">directory::system-prompts::get</a></li><li><a class="block truncate rounded-md px-2 py-1 font-mono text-[12px] transition-colors duration-150 focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:outline-brand text-muted-foreground hover:bg-code hover:text-foreground" href="/registry/workers/iii-directory?tab=api&version=1.2.38#fn-directory::system-prompts::list">directory::system-prompts::list</a></li><li><a class="block truncate rounded-md px-2 py-1 font-mono text-[12px] transition-colors duration-150 focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:outline-brand text-muted-foreground hover:bg-code hover:text-foreground" href="/registry/workers/iii-directory?tab=api&version=1.2.38#fn-directory::system-prompts::update">directory::system-prompts::update</a></li><li><a class="block truncate rounded-md px-2 py-1 font-mono text-[12px] transition-colors duration-150 focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:outline-brand text-muted-foreground hover:bg-code hover:text-foreground" href="/registry/workers/iii-directory?tab=api&version=1.2.38#fn-iii-directory::ui-content">iii-directory::ui-content</a></li></ul></div><div class="flex flex-col gap-y-2"><div class="flex items-baseline justify-between font-mono text-[10px] uppercase tracking-[0.08em] text-muted-foreground"><span>triggers</span><span class="tabular-nums">3</span></div><ul class="-mx-2 flex flex-col"><li><a class="block truncate rounded-md px-2 py-1 font-mono text-[12px] transition-colors duration-150 focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:outline-brand text-muted-foreground hover:bg-code hover:text-foreground" href="/registry/workers/iii-directory?tab=api&version=1.2.38#trigger-directory::agents::on-change">directory::agents::on-change</a></li><li><a class="block truncate rounded-md px-2 py-1 font-mono text-[12px] transition-colors duration-150 focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:outline-brand text-muted-foreground hover:bg-code hover:text-foreground" href="/registry/workers/iii-directory?tab=api&version=1.2.38#trigger-directory::skills::on-change">directory::skills::on-change</a></li><li><a class="block truncate rounded-md px-2 py-1 font-mono text-[12px] transition-colors duration-150 focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:outline-brand text-muted-foreground hover:bg-code hover:text-foreground" href="/registry/workers/iii-directory?tab=api&version=1.2.38#trigger-directory::system-prompts::on-change">directory::system-prompts::on-change</a></li></ul></div></div></div></section></aside></div></div></div><!--$--><!--/$--></main></div></div><footer class="border-t border-line bg-background text-foreground"><div class="mx-auto max-w-[1280px] px-9 pt-16 max-sm:px-[22px] max-sm:pt-11"><div class="grid grid-cols-[minmax(0,1fr)_minmax(0,1.4fr)] gap-20 max-[900px]:grid-cols-1 max-[900px]:gap-10"><div><a href="https://iii.dev" aria-label="iii home" class="inline-flex size-7 focus-visible:rounded-xs focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-foreground"><svg viewBox="0 0 1075.74 1075.74" aria-hidden="true" focusable="false" class="block shrink-0 size-full" fill="currentColor"><rect x="0" y="0.05" width="268.94" height="268.94"></rect><rect x="403.4" y="0.05" width="268.94" height="268.94"></rect><rect x="806.81" y="0.05" width="268.94" height="268.94"></rect><rect x="0" y="403.45" width="268.94" height="672.24"></rect><rect x="403.4" y="403.45" width="268.94" height="672.24"></rect><rect x="806.81" y="403.45" width="268.94" height="672.24"></rect></svg></a><p class="mt-[18px] max-w-[340px] text-[15px] leading-[1.65] text-muted-foreground">A next-generation software system.<br/>Workers. Triggers. Functions.</p><p class="mt-2 max-w-[340px] text-[13px] leading-[1.65] text-muted-foreground">Pronounced<!-- --> <span class="text-foreground">"three eye"</span></p></div><nav aria-label="Footer" class="grid grid-cols-3 gap-8 max-sm:grid-cols-2 max-sm:gap-x-4 max-sm:gap-y-6"><div><h3 class="mb-3 text-[13px] font-medium tracking-[0.06em] text-muted-foreground uppercase">Product</h3><ul class="list-none p-0"><li><a href="https://iii.dev/docs" class="group flex min-h-9 items-center gap-2.5 text-[14px] text-muted-foreground transition-[color] duration-150 ease-[ease] hover:text-foreground max-sm:min-h-11 focus-visible:rounded-xs focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-foreground"><span>Docs</span></a></li><li><a href="https://iii.dev/docs/quickstart" class="group flex min-h-9 items-center gap-2.5 text-[14px] text-muted-foreground transition-[color] duration-150 ease-[ease] hover:text-foreground max-sm:min-h-11 focus-visible:rounded-xs focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-foreground"><span>Quickstart</span></a></li><li><a href="/registry" class="group flex min-h-9 items-center gap-2.5 text-[14px] text-muted-foreground transition-[color] duration-150 ease-[ease] hover:text-foreground max-sm:min-h-11 focus-visible:rounded-xs focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-foreground"><span>Worker registry</span></a></li><li><a href="https://iii.dev/roadmap" class="group flex min-h-9 items-center gap-2.5 text-[14px] text-muted-foreground transition-[color] duration-150 ease-[ease] hover:text-foreground max-sm:min-h-11 focus-visible:rounded-xs focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-foreground"><span>Roadmap</span></a></li><li><a href="https://iii.dev/manifesto" class="group flex min-h-9 items-center gap-2.5 text-[14px] text-muted-foreground transition-[color] duration-150 ease-[ease] hover:text-foreground max-sm:min-h-11 focus-visible:rounded-xs focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-foreground"><span>Manifesto</span></a></li><li><a href="https://iii.dev/blog" class="group flex min-h-9 items-center gap-2.5 text-[14px] text-muted-foreground transition-[color] duration-150 ease-[ease] hover:text-foreground max-sm:min-h-11 focus-visible:rounded-xs focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-foreground"><span>Blog</span></a></li></ul></div><div><h3 class="mb-3 text-[13px] font-medium tracking-[0.06em] text-muted-foreground uppercase">Community</h3><ul class="list-none p-0"><li><a href="https://github.com/iii-hq/iii" class="group flex min-h-9 items-center gap-2.5 text-[14px] text-muted-foreground transition-[color] duration-150 ease-[ease] hover:text-foreground max-sm:min-h-11 focus-visible:rounded-xs focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-foreground" target="_blank" rel="noopener noreferrer"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" focusable="false" class="size-4 shrink-0"><path fill-rule="evenodd" clip-rule="evenodd" d="M12 2.69922C6.762 2.69922 2.5 6.96122 2.5 12.1992C2.5 16.3252 5.24 20.0532 9.164 21.2662C9.324 21.3182 9.498 21.2822 9.627 21.1762C9.757 21.0702 9.825 20.9062 9.809 20.7392C9.669 19.3462 10.47 17.8702 10.812 17.5162C10.944 17.3812 10.988 17.1822 10.925 17.0042C10.862 16.8252 10.704 16.6962 10.516 16.6732C8.725 16.4452 7.067 15.8372 7.067 12.9472C7.063 12.2282 7.337 11.5412 7.836 11.0122C7.968 10.8732 8.009 10.6712 7.941 10.4922C7.75 9.98722 7.729 9.42222 7.877 8.90022C8.168 8.94822 8.731 9.11922 9.608 9.70522C9.728 9.78622 9.877 9.80722 10.015 9.77222C11.312 9.42422 12.682 9.42422 13.979 9.77222C14.116 9.80722 14.266 9.78622 14.386 9.70522C15.27 9.11422 15.835 8.94522 16.115 8.89622C16.264 9.42022 16.245 9.98622 16.054 10.4932C15.986 10.6732 16.027 10.8752 16.16 11.0132C16.654 11.5332 16.927 12.2172 16.927 12.9382C16.927 15.8772 15.273 16.4642 13.486 16.6612C13.296 16.6812 13.135 16.8092 13.071 16.9882C13.006 17.1682 13.049 17.3692 13.182 17.5062C13.512 17.8472 14.321 19.3622 14.185 20.7502C14.168 20.9172 14.236 21.0812 14.367 21.1862C14.457 21.2612 14.569 21.2992 14.682 21.2992C14.732 21.2992 14.783 21.2912 14.832 21.2752C18.82 20.0202 21.5 16.3732 21.5 12.1992C21.5 6.96122 17.238 2.69922 12 2.69922Z"></path></svg><span>GitHub</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right ml-auto size-3 opacity-0 group-hover:opacity-100" aria-hidden="true"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></a></li><li><a href="https://discord.gg/iiidev" class="group flex min-h-9 items-center gap-2.5 text-[14px] text-muted-foreground transition-[color] duration-150 ease-[ease] hover:text-foreground max-sm:min-h-11 focus-visible:rounded-xs focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-foreground" target="_blank" rel="noopener noreferrer"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" focusable="false" class="size-4 shrink-0"><path fill-rule="evenodd" clip-rule="evenodd" d="M10.4919 12.798C10.4928 12.7793 10.4916 12.7606 10.489 12.7421C10.4613 12.5469 10.4514 12.347 10.3951 12.1599C10.1841 11.4539 9.74808 10.9469 9.00608 10.7969C8.29208 10.6539 7.71308 10.9269 7.28508 11.5059C6.70508 12.2879 6.76108 13.4529 7.40208 14.1859C8.09108 14.9729 9.21108 14.9939 9.92408 14.2269C10.2967 13.8258 10.4673 13.3434 10.4919 12.798ZM17.1383 12.7812C17.1389 12.7644 17.1379 12.7475 17.1357 12.7308C17.1132 12.5616 17.1039 12.3878 17.0601 12.2239C16.8721 11.5239 16.4651 11.0089 15.7441 10.8189C15.1071 10.6509 14.5481 10.8339 14.0951 11.3089C13.3501 12.0899 13.3461 13.4249 14.0781 14.2169C14.7981 14.9939 15.9331 14.9789 16.6201 14.1779C16.9636 13.7773 17.1191 13.306 17.1383 12.7812ZM17.0985 17.278C17.2735 17.1939 17.3406 16.9478 17.1827 16.8346C17.0669 16.7515 16.9741 16.7834 16.7571 16.8759C13.5891 18.2239 10.4191 18.2099 7.24908 16.8849C7.02096 16.7895 6.93273 16.7517 6.82128 16.8227C6.65302 16.93 6.71802 17.1898 6.89748 17.277C7.23862 17.4429 7.58015 17.609 7.93832 17.7829C8.09958 17.8613 8.15678 18.0626 8.06083 18.214C7.77618 18.6633 7.49507 19.108 7.20508 19.5459C7.17408 19.5919 7.04108 19.6069 6.97208 19.5859C5.25708 19.0449 3.67108 18.2459 2.22008 17.1829C2.14608 17.1289 2.08208 17.0159 2.07408 16.9239C1.74508 13.2929 2.51308 9.90588 4.35508 6.75988C5.05808 5.55888 5.05608 5.53788 6.55408 5.06188C7.34208 4.81188 8.15408 4.63988 8.95308 4.42288C9.12908 4.37588 9.21708 4.42788 9.28708 4.58688C9.37508 4.78388 9.50608 4.96388 9.57408 5.16688C9.65508 5.40888 9.77908 5.46588 10.0301 5.42988C11.4051 5.23188 12.7811 5.26188 14.1551 5.44288C14.2295 5.45351 14.3008 5.4087 14.3344 5.34142C14.4633 5.08312 14.5955 4.82606 14.7171 4.56288C14.7801 4.42488 14.8581 4.38688 15.0111 4.41588C16.3001 4.65988 17.5471 5.03488 18.7421 5.57688C18.8641 5.63288 18.9861 5.73388 19.0601 5.84488C20.4731 7.95488 21.4261 10.2489 21.8121 12.7659C22.0241 14.1449 22.0491 15.5309 21.9241 16.9189C21.9151 17.0179 21.8391 17.1399 21.7561 17.1989C20.3161 18.2439 18.7501 19.0439 17.0491 19.5739C16.9661 19.5999 16.8091 19.5849 16.7731 19.5309C16.4849 19.0998 16.2096 18.6599 15.9282 18.2116C15.8329 18.0598 15.8907 17.8587 16.0522 17.781C16.4087 17.6095 16.7514 17.4448 17.0985 17.278Z"></path></svg><span>Discord</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right ml-auto size-3 opacity-0 group-hover:opacity-100" aria-hidden="true"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></a></li><li><a href="https://x.com/iiidevs" class="group flex min-h-9 items-center gap-2.5 text-[14px] text-muted-foreground transition-[color] duration-150 ease-[ease] hover:text-foreground max-sm:min-h-11 focus-visible:rounded-xs focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-foreground" target="_blank" rel="noopener noreferrer"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" focusable="false" class="size-4 shrink-0"><path transform="translate(1.5 1.5) scale(0.875)" d="M18.901 1.153h3.68l-8.04 9.19L24 22.846h-7.406l-5.8-7.584-6.638 7.584H.474l8.6-9.83L0 1.154h7.594l5.243 6.932ZM17.61 20.644h2.039L6.486 3.24H4.298Z"></path></svg><span>Twitter / X</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right ml-auto size-3 opacity-0 group-hover:opacity-100" aria-hidden="true"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></a></li><li><a href="https://www.linkedin.com/company/iii-dev" class="group flex min-h-9 items-center gap-2.5 text-[14px] text-muted-foreground transition-[color] duration-150 ease-[ease] hover:text-foreground max-sm:min-h-11 focus-visible:rounded-xs focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-foreground" target="_blank" rel="noopener noreferrer"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" focusable="false" class="size-4 shrink-0"><path fill-rule="evenodd" clip-rule="evenodd" d="M5.4 2.5h13.2a2.9 2.9 0 0 1 2.9 2.9v13.2a2.9 2.9 0 0 1-2.9 2.9H5.4a2.9 2.9 0 0 1-2.9-2.9V5.4a2.9 2.9 0 0 1 2.9-2.9Zm2.33 7.1H5.6v7.9h2.13V9.6ZM6.67 6.1a1.24 1.24 0 1 0 0 2.48 1.24 1.24 0 0 0 0-2.48Zm11.73 7.1c0-2.26-1.21-3.31-2.82-3.31-1.3 0-1.88.72-2.21 1.22V9.6H11.2c.03.6 0 7.9 0 7.9h2.17v-4.41c0-.24.02-.47.09-.64.19-.47.62-.96 1.35-.96.95 0 1.33.73 1.33 1.79v4.22h2.26V13.2Z"></path></svg><span>LinkedIn</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right ml-auto size-3 opacity-0 group-hover:opacity-100" aria-hidden="true"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></a></li></ul></div><div><h3 class="mb-3 text-[13px] font-medium tracking-[0.06em] text-muted-foreground uppercase">Ask about iii</h3><ul class="list-none p-0"><li><a href="https://chatgpt.com/?q=Read%20https%3A%2F%2Fiii.dev%2Fllms.txt%20and%20explain%20iii%20to%20me%3A%20its%20three%20primitives%20(Worker%2C%20Trigger%2C%20Function)%2C%20what%20it%20replaces%20in%20a%20typical%20backend%2C%20and%20how%20I%20would%20install%20it%20and%20build%20a%20first%20service." class="group flex min-h-9 items-center gap-2.5 text-[14px] text-muted-foreground transition-[color] duration-150 ease-[ease] hover:text-foreground max-sm:min-h-11 focus-visible:rounded-xs focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-foreground" target="_blank" rel="noopener noreferrer"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" focusable="false" class="size-4 shrink-0"><path d="M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z"></path></svg><span>ChatGPT</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right ml-auto size-3 opacity-0 group-hover:opacity-100" aria-hidden="true"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></a></li><li><a href="https://claude.ai/new?q=Read%20https%3A%2F%2Fiii.dev%2Fllms.txt%20and%20explain%20iii%20to%20me%3A%20its%20three%20primitives%20(Worker%2C%20Trigger%2C%20Function)%2C%20what%20it%20replaces%20in%20a%20typical%20backend%2C%20and%20how%20I%20would%20install%20it%20and%20build%20a%20first%20service." class="group flex min-h-9 items-center gap-2.5 text-[14px] text-muted-foreground transition-[color] duration-150 ease-[ease] hover:text-foreground max-sm:min-h-11 focus-visible:rounded-xs focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-foreground" target="_blank" rel="noopener noreferrer"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" focusable="false" class="size-4 shrink-0"><path d="m4.7144 15.9555 4.7174-2.6471.079-.2307-.079-.1275h-.2307l-.7893-.0486-2.6956-.0729-2.3375-.0971-2.2646-.1214-.5707-.1215-.5343-.7042.0546-.3522.4797-.3218.686.0608 1.5179.1032 2.2767.1578 1.6514.0972 2.4468.255h.3886l.0546-.1579-.1336-.0971-.1032-.0972L6.973 9.8356l-2.55-1.6879-1.3356-.9714-.7225-.4918-.3643-.4614-.1578-1.0078.6557-.7225.8803.0607.2246.0607.8925.686 1.9064 1.4754 2.4893 1.8336.3643.3035.1457-.1032.0182-.0728-.164-.2733-1.3539-2.4467-1.445-2.4893-.6435-1.032-.17-.6194c-.0607-.255-.1032-.4674-.1032-.7285L6.287.1335 6.6997 0l.9957.1336.419.3642.6192 1.4147 1.0018 2.2282 1.5543 3.0296.4553.8985.2429.8318.091.255h.1579v-.1457l.1275-1.706.2368-2.0947.2307-2.6957.0789-.7589.3764-.9107.7468-.4918.5828.2793.4797.686-.0668.4433-.2853 1.8517-.5586 2.9021-.3643 1.9429h.2125l.2429-.2429.9835-1.3053 1.6514-2.0643.7286-.8196.85-.9046.5464-.4311h1.0321l.759 1.1293-.34 1.1657-1.0625 1.3478-.8804 1.1414-1.2628 1.7-.7893 1.36.0729.1093.1882-.0183 2.8535-.607 1.5421-.2794 1.8396-.3157.8318.3886.091.3946-.3278.8075-1.967.4857-2.3072.4614-3.4364.8136-.0425.0304.0486.0607 1.5482.1457.6618.0364h1.621l3.0175.2247.7892.522.4736.6376-.079.4857-1.2142.6193-1.6393-.3886-3.825-.9107-1.3113-.3279h-.1822v.1093l1.0929 1.0686 2.0035 1.8092 2.5075 2.3314.1275.5768-.3218.4554-.34-.0486-2.2039-1.6575-.85-.7468-1.9246-1.621h-.1275v.17l.4432.6496 2.3436 3.5214.1214 1.0807-.17.3521-.6071.2125-.6679-.1214-1.3721-1.9246L14.38 17.959l-1.1414-1.9428-.1397.079-.674 7.2552-.3156.3703-.7286.2793-.6071-.4614-.3218-.7468.3218-1.4753.3886-1.9246.3157-1.53.2853-1.9004.17-.6314-.0121-.0425-.1397.0182-1.4328 1.9672-2.1796 2.9446-1.7243 1.8456-.4128.164-.7164-.3704.0667-.6618.4008-.5889 2.386-3.0357 1.4389-1.882.929-1.0868-.0062-.1579h-.0546l-6.3385 4.1164-1.1293.1457-.4857-.4554.0608-.7467.2307-.2429 1.9064-1.3114Z"></path></svg><span>Claude</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right ml-auto size-3 opacity-0 group-hover:opacity-100" aria-hidden="true"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></a></li><li><a href="https://www.perplexity.ai/search?q=Read%20https%3A%2F%2Fiii.dev%2Fllms.txt%20and%20explain%20iii%20to%20me%3A%20its%20three%20primitives%20(Worker%2C%20Trigger%2C%20Function)%2C%20what%20it%20replaces%20in%20a%20typical%20backend%2C%20and%20how%20I%20would%20install%20it%20and%20build%20a%20first%20service." class="group flex min-h-9 items-center gap-2.5 text-[14px] text-muted-foreground transition-[color] duration-150 ease-[ease] hover:text-foreground max-sm:min-h-11 focus-visible:rounded-xs focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-foreground" target="_blank" rel="noopener noreferrer"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" focusable="false" class="size-4 shrink-0"><path d="M22.3977 7.0896h-2.3106V.0676l-7.5094 6.3542V.1577h-1.1554v6.1966L4.4904 0v7.0896H1.6023v10.3976h2.8882V24l6.932-6.3591v6.2005h1.1554v-6.0469l6.9318 6.1807v-6.4879h2.8882V7.0896zm-3.4657-4.531v4.531h-5.355l5.355-4.531zm-13.2862.0676 4.8691 4.4634H5.6458V2.6262zM2.7576 16.332V8.245h7.8476l-6.1149 6.1147v1.9723H2.7576zm2.8882 5.0404v-3.8852h.0001v-2.6488l5.7763-5.7764v7.0111l-5.7764 5.2993zm7.0212-7.0212v-7.0111l5.7764 5.7764v2.6488h.0001v3.8852l-5.7765-5.2993zm8.9765 2.0444h-1.9727l-6.1149-6.1147h8.0876v6.1147z"></path></svg><span>Perplexity</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right ml-auto size-3 opacity-0 group-hover:opacity-100" aria-hidden="true"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></a></li><li><a href="https://grok.com/?q=Read%20https%3A%2F%2Fiii.dev%2Fllms.txt%20and%20explain%20iii%20to%20me%3A%20its%20three%20primitives%20(Worker%2C%20Trigger%2C%20Function)%2C%20what%20it%20replaces%20in%20a%20typical%20backend%2C%20and%20how%20I%20would%20install%20it%20and%20build%20a%20first%20service." class="group flex min-h-9 items-center gap-2.5 text-[14px] text-muted-foreground transition-[color] duration-150 ease-[ease] hover:text-foreground max-sm:min-h-11 focus-visible:rounded-xs focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-foreground" target="_blank" rel="noopener noreferrer"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" focusable="false" class="size-4 shrink-0"><path d="M9.27 15.29l7.978-5.897c.391-.29.95-.177 1.137.272.98 2.369.542 5.215-1.41 7.169-1.951 1.954-4.667 2.382-7.149 1.406l-2.711 1.257c3.889 2.661 8.611 2.003 11.562-.953 2.341-2.344 3.066-5.539 2.388-8.42l.006.007c-.983-4.232.242-5.924 2.75-9.383.06-.082.12-.164.179-.248l-3.301 3.305v-.01L9.267 15.292M7.623 16.723c-2.792-2.67-2.31-6.801.071-9.184 1.761-1.763 4.647-2.483 7.166-1.425l2.705-1.25a7.808 7.808 0 00-1.829-1A8.975 8.975 0 005.984 5.83c-2.533 2.536-3.33 6.436-1.962 9.764 1.022 2.487-.653 4.246-2.34 6.022-.599.63-1.199 1.259-1.682 1.925l7.62-6.815"></path></svg><span>Grok</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right ml-auto size-3 opacity-0 group-hover:opacity-100" aria-hidden="true"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></a></li></ul></div></nav></div><div class="mt-13 border-t border-line py-[22px] text-[13px] text-muted-foreground max-sm:mt-9"><p class="flex items-center gap-2">© <!-- -->2026<!-- --> Motia LLC<!-- --> <span aria-hidden="true">·</span> <a href="https://iii.dev/privacy-policy" class="hover:text-foreground focus-visible:rounded-xs focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-foreground">Privacy</a></p></div></div></footer><div data-slot="dialog-header" class="flex flex-col gap-2 sr-only"><h2 id="base-ui-_R_2v9b_" data-slot="dialog-title" class="font-heading text-base leading-none font-medium">Search the registry</h2><p id="base-ui-_R_4v9b_" data-slot="dialog-description" class="text-sm text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground">Find workers, kits and executables, or jump to a page.</p></div><script src="/registry/_next/static/chunks/06o3ty5hs.tzu.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n3:I[90280,[\"/registry/_next/static/chunks/04ylibgf-0e6d.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/0f8jgu0hu0~vn.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\"],\"default\"]\n4:I[69616,[\"/registry/_next/static/chunks/04ylibgf-0e6d.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/0f8jgu0hu0~vn.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\"],\"default\"]\n6:I[51557,[\"/registry/_next/static/chunks/04ylibgf-0e6d.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/0f8jgu0hu0~vn.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\"],\"OutletBoundary\"]\n7:\"$Sreact.suspense\"\na:I[51557,[\"/registry/_next/static/chunks/04ylibgf-0e6d.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/0f8jgu0hu0~vn.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\"],\"ViewportBoundary\"]\nc:I[51557,[\"/registry/_next/static/chunks/04ylibgf-0e6d.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/0f8jgu0hu0~vn.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\"],\"MetadataBoundary\"]\ne:I[50609,[\"/registry/_next/static/chunks/0ov4a9hzi1oek.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/02q_l477hmi84.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/0xkym.2ps9qyc.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/0tclp6.7qxzgs.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/0w_agc1b2gf-n.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\"],\"default\"]\n:HL[\"/registry/_next/static/chunks/0qh42370pyoqz.css?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"style\"]\n:HL[\"/registry/_next/static/chunks/0.-bsgr3_7ked.css?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"style\"]\n:HL[\"/registry/_next/static/media/797e433ab948586e-s.p.08e28id.o-okb.woff2?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/registry/_next/static/media/83afe278b6a6bb3c-s.p.0q-301v4kxxnr.woff2?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"workers\",\"iii-directory?version=1.2.38\"],\"q\":\"?version=1.2.38\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"workers\",{\"children\":[[\"slug\",\"iii-directory\",\"d\",null],{\"children\":[\"__PAGE__?{\\\"version\\\":\\\"1.2.38\\\"}\",{}]}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/registry/_next/static/chunks/0qh42370pyoqz.css?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/registry/_next/static/chunks/0.-bsgr3_7ked.css?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/registry/_next/static/chunks/0ov4a9hzi1oek.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/registry/_next/static/chunks/02q_l477hmi84.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-2\",{\"src\":\"/registry/_next/static/chunks/0xkym.2ps9qyc.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-3\",{\"src\":\"/registry/_next/static/chunks/0tclp6.7qxzgs.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"async\":true,\"nonce\":\"$undefined\"}]],\"$L2\"]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[\"$L5\",[[\"$\",\"script\",\"script-0\",{\"src\":\"/registry/_next/static/chunks/0jm9zdrfsajnq.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L6\",null,{\"children\":[\"$\",\"$7\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@8\"}]}]]}],{},null,false,null]},null,false,\"$@9\"]},null,false,\"$@9\"]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$La\",null,{\"children\":\"$Lb\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Lc\",null,{\"children\":[\"$\",\"$7\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Ld\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$e\",[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/registry/_next/static/chunks/0qh42370pyoqz.css?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/registry/_next/static/chunks/0.-bsgr3_7ked.css?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]]],\"S\":false,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"f:[]\n9:\"$Wf\"\nb:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"11:I[77792,[\"/registry/_next/static/chunks/0ov4a9hzi1oek.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/02q_l477hmi84.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/0xkym.2ps9qyc.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/0tclp6.7qxzgs.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\"],\"Providers\"]\n12:I[84148,[\"/registry/_next/static/chunks/0ov4a9hzi1oek.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/02q_l477hmi84.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/0xkym.2ps9qyc.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/0tclp6.7qxzgs.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\"],\"SiteHeader\"]\n13:I[92439,[\"/registry/_next/static/chunks/0ov4a9hzi1oek.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/02q_l477hmi84.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/0xkym.2ps9qyc.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/0tclp6.7qxzgs.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/0jm9zdrfsajnq.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\"],\"Link\"]\n16:I[18418,[\"/registry/_next/static/chunks/04ylibgf-0e6d.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/0f8jgu0hu0~vn.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\"],\"IconMark\"]\n10:[\"$\",\"iframe\",null,{\"src\":\"https://www.googletagmanager.com/ns.html?id=GTM-N8DCTFB8\",\"height\":\"0\",\"width\":\"0\",\"style\":{\"display\":\"none\",\"visibility\":\"hidden\"},\"title\":\"Google Tag Manager\"}]\n"])</script><script>self.__next_f.push([1,"2:[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"antialiased inter_fe8b9d92-module__LINzvG__variable geist_mono_8d43a2aa-module__8Li5zG__variable\",\"data-theme\":\"light\",\"suppressHydrationWarning\":true,\"children\":[\"$\",\"body\",null,{\"className\":\"bg-background text-foreground font-sans min-h-full flex flex-col\",\"children\":[[[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\\n try {\\n var stored = localStorage.getItem('iii-theme');\\n if (stored === 'dark' || stored === 'light') {\\n document.documentElement.dataset.theme = stored;\\n } else {\\n document.documentElement.dataset.theme = 'light';\\n }\\n } catch (_) {\\n document.documentElement.dataset.theme = 'light';\\n }\\n\"}}],[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\\n (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':\\n new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],\\n j=d.createElement(s),dl=l!='dataLayer'?'\u0026l='+l:'';j.async=true;j.src=\\n 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);\\n })(window,document,'script','dataLayer','GTM-N8DCTFB8');\\n\"}}]],[\"$\",\"noscript\",null,{\"children\":\"$10\"}],[\"$\",\"a\",null,{\"href\":\"#main-content\",\"className\":\"sr-only focus:not-sr-only focus:fixed focus:top-3 focus:left-3 focus:z-[60] focus:rounded-lg focus:bg-foreground focus:px-3 focus:py-2 focus:text-sm focus:font-medium focus:text-background\",\"children\":\"Skip to content\"}],[\"$\",\"$L11\",null,{\"basePath\":\"/registry\",\"children\":[[\"$\",\"$L12\",null,{\"stats\":{\"stars\":\"18,848\",\"members\":\"2.4k\",\"starsCount\":18848,\"membersCount\":2405}}],[\"$\",\"div\",null,{\"className\":\"mx-auto w-full max-w-7xl has-[.registry-home]:max-w-none @container flex-1 bg-bg flex flex-col\",\"children\":[\"$\",\"div\",null,{\"className\":\"flex-1 overflow-x-clip flex flex-col\",\"children\":[\"$\",\"main\",null,{\"id\":\"main-content\",\"className\":\"flex-1\",\"tabIndex\":-1,\"children\":[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"div\",null,{\"className\":\"page-transition flex flex-1 flex-col\",\"children\":[[\"$\",\"header\",null,{\"className\":\"flex items-end justify-between flex-wrap gap-x-8 gap-y-5 px-[22px] pt-12 sm:px-9 sm:pt-16 pb-0 sm:pb-0\",\"children\":[[\"$\",\"div\",null,{\"className\":\"min-w-0\",\"children\":[[\"$\",\"div\",null,{\"className\":\"mb-3 font-mono text-[10px] leading-[normal] uppercase tracking-[0.08em] text-muted-foreground\",\"children\":\"error / not found\"}],[\"$\",\"div\",null,{\"className\":\"flex items-center flex-wrap gap-x-3 gap-y-2\",\"children\":[[\"$\",\"h1\",null,{\"className\":\"text-[32px] sm:text-[40px] font-[550] leading-[1.1] tracking-[-0.04em] text-foreground text-balance\",\"children\":[\"$\",\"span\",null,{\"className\":\"block text-[64px] leading-none tracking-[-0.05em] tabular-nums sm:text-[88px]\",\"children\":\"404\"}]}],\"$undefined\",null]}],[\"$\",\"p\",null,{\"className\":\"mt-4 max-w-[60ch] text-[15px] leading-[1.7] text-muted-foreground text-pretty\",\"children\":\"This page isn’t in the registry. It may have been renamed, or never published.\"}]]}],null]}],[\"$\",\"div\",null,{\"className\":\"flex flex-wrap items-center gap-3 px-[22px] pt-8 pb-24 sm:px-9 sm:pb-32\",\"children\":[[\"$\",\"$L13\",null,{\"href\":\"/\",\"className\":\"inline-flex items-center justify-center gap-x-2 whitespace-nowrap rounded-xl font-medium transition-[background-color,color,border-color,opacity,transform] duration-150 ease-out focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand disabled:pointer-events-none disabled:opacity-50 select-none active:scale-[0.96] motion-reduce:active:scale-100 [\u0026_svg]:size-3.5 [\u0026_svg]:shrink-0 bg-foreground text-background hover:opacity-[0.88] h-10 px-4 text-[14px]\",\"children\":\"Back to the registry\"}],[\"$\",\"$L13\",null,{\"href\":\"/search\",\"className\":\"inline-flex items-center justify-center gap-x-2 whitespace-nowrap rounded-xl font-medium transition-[background-color,color,border-color,opacity,transform] duration-150 ease-out focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand disabled:pointer-events-none disabled:opacity-50 select-none active:scale-[0.96] motion-reduce:active:scale-100 [\u0026_svg]:size-3.5 [\u0026_svg]:shrink-0 border border-line bg-background text-foreground hover:border-[color-mix(in_srgb,var(--foreground)_22%,var(--line))] hover:bg-paper h-10 px-4 text-[14px]\",\"children\":[\"$L14\",\"Search\"]}]]}]]}],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]}],\"$L15\"]}]]}]}]\n"])</script><script>self.__next_f.push([1,"8:null\n"])</script><script>self.__next_f.push([1,"d:[[\"$\",\"title\",\"0\",{\"children\":\"iii-directory worker · iii Registry\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Engine introspection, workers registry proxy, filesystem-backed skills, system prompts, and agent profiles, kit install and update with reviewed plans, plus…\"}],[\"$\",\"meta\",\"2\",{\"name\":\"application-name\",\"content\":\"iii Registry\"}],[\"$\",\"meta\",\"3\",{\"name\":\"publisher\",\"content\":\"iii\"}],[\"$\",\"meta\",\"4\",{\"name\":\"robots\",\"content\":\"index, follow\"}],[\"$\",\"meta\",\"5\",{\"name\":\"googlebot\",\"content\":\"index, follow, max-image-preview:large, max-snippet:-1\"}],[\"$\",\"link\",\"6\",{\"rel\":\"canonical\",\"href\":\"https://iii.dev/registry/workers/iii-directory\"}],[\"$\",\"link\",\"7\",{\"rel\":\"alternate\",\"type\":\"text/markdown\",\"href\":\"https://iii.dev/registry/workers/iii-directory.md\"}],[\"$\",\"meta\",\"8\",{\"property\":\"og:title\",\"content\":\"iii-directory worker · iii Registry\"}],[\"$\",\"meta\",\"9\",{\"property\":\"og:description\",\"content\":\"Engine introspection, workers registry proxy, filesystem-backed skills, system prompts, and agent profiles, kit install and update with reviewed plans, plus…\"}],[\"$\",\"meta\",\"10\",{\"property\":\"og:url\",\"content\":\"https://iii.dev/registry/workers/iii-directory\"}],[\"$\",\"meta\",\"11\",{\"property\":\"og:site_name\",\"content\":\"iii Registry\"}],[\"$\",\"meta\",\"12\",{\"property\":\"og:locale\",\"content\":\"en_US\"}],[\"$\",\"meta\",\"13\",{\"property\":\"og:image\",\"content\":\"https://iii.dev/registry/workers/iii-directory/opengraph-image?b747c5eeb0667fcb\"}],[\"$\",\"meta\",\"14\",{\"property\":\"og:image:type\",\"content\":\"image/png\"}],[\"$\",\"meta\",\"15\",{\"property\":\"og:image:width\",\"content\":\"1200\"}],[\"$\",\"meta\",\"16\",{\"property\":\"og:image:height\",\"content\":\"630\"}],[\"$\",\"meta\",\"17\",{\"property\":\"og:image:alt\",\"content\":\"An iii worker on the iii Registry\"}],[\"$\",\"meta\",\"18\",{\"property\":\"og:type\",\"content\":\"website\"}],[\"$\",\"meta\",\"19\",{\"name\":\"twitter:card\",\"content\":\"summary_large_image\"}],[\"$\",\"meta\",\"20\",{\"name\":\"twitter:site\",\"content\":\"@iiidevs\"}],[\"$\",\"meta\",\"21\",{\"name\":\"twitter:creator\",\"content\":\"@iiidevs\"}],[\"$\",\"meta\",\"22\",{\"name\":\"twitter:title\",\"content\":\"iii-directory worker · iii Registry\"}],[\"$\",\"meta\",\"23\",{\"name\":\"twitter:description\",\"content\":\"Engine introspection, workers registry proxy, filesystem-backed skills, system prompts, and agent profiles, kit install and update with reviewed plans, plus…\"}],[\"$\",\"meta\",\"24\",{\"name\":\"twitter:image\",\"content\":\"https://iii.dev/registry/workers/iii-directory/opengraph-image?b747c5eeb0667fcb\"}],[\"$\",\"meta\",\"25\",{\"name\":\"twitter:image:alt\",\"content\":\"An iii worker on the iii Registry\"}],[\"$\",\"meta\",\"26\",{\"name\":\"twitter:image:type\",\"content\":\"image/png\"}],[\"$\",\"meta\",\"27\",{\"name\":\"twitter:image:width\",\"content\":\"1200\"}],[\"$\",\"meta\",\"28\",{\"name\":\"twitter:image:height\",\"content\":\"630\"}],[\"$\",\"link\",\"29\",{\"rel\":\"icon\",\"href\":\"/registry/favicon.ico\",\"sizes\":\"48x48\"}],[\"$\",\"link\",\"30\",{\"rel\":\"icon\",\"href\":\"/registry/favicon.svg\",\"type\":\"image/svg+xml\"}],[\"$\",\"link\",\"31\",{\"rel\":\"apple-touch-icon\",\"href\":\"/registry/apple-touch-icon.png\",\"sizes\":\"180x180\"}],[\"$\",\"$L16\",\"32\",{}]]\n"])</script><script>self.__next_f.push([1,"17:I[41074,[\"/registry/_next/static/chunks/0ov4a9hzi1oek.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/02q_l477hmi84.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/0xkym.2ps9qyc.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/0tclp6.7qxzgs.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/0jm9zdrfsajnq.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\"],\"default\"]\n14:[\"$\",\"$L17\",null,{\"ref\":\"$undefined\",\"iconNode\":[[\"path\",{\"d\":\"m21 21-4.34-4.34\",\"key\":\"14j7rj\"}],[\"circle\",{\"cx\":\"11\",\"cy\":\"11\",\"r\":\"8\",\"key\":\"4ej97u\"}]],\"className\":\"lucide-search\",\"aria-hidden\":\"true\"}]\n"])</script><script>self.__next_f.push([1,"15:[\"$\",\"footer\",null,{\"className\":\"border-t border-line bg-background text-foreground\",\"children\":[\"$\",\"div\",null,{\"className\":\"mx-auto max-w-[1280px] px-9 pt-16 max-sm:px-[22px] max-sm:pt-11\",\"children\":[[\"$\",\"div\",null,{\"className\":\"grid grid-cols-[minmax(0,1fr)_minmax(0,1.4fr)] gap-20 max-[900px]:grid-cols-1 max-[900px]:gap-10\",\"children\":[[\"$\",\"div\",null,{\"children\":[[\"$\",\"a\",null,{\"href\":\"https://iii.dev\",\"aria-label\":\"iii home\",\"className\":\"inline-flex size-7 focus-visible:rounded-xs focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-foreground\",\"children\":[\"$\",\"svg\",null,{\"viewBox\":\"0 0 1075.74 1075.74\",\"aria-hidden\":\"true\",\"focusable\":\"false\",\"className\":\"block shrink-0 size-full\",\"fill\":\"currentColor\",\"children\":[[\"$\",\"rect\",\"0\",{\"x\":0,\"y\":0.05,\"width\":268.94,\"height\":268.94}],[\"$\",\"rect\",\"403.4\",{\"x\":403.4,\"y\":0.05,\"width\":268.94,\"height\":268.94}],[\"$\",\"rect\",\"806.81\",{\"x\":806.81,\"y\":0.05,\"width\":268.94,\"height\":268.94}],[\"$\",\"rect\",\"stem-0\",{\"x\":0,\"y\":403.45,\"width\":268.94,\"height\":672.24}],[\"$\",\"rect\",\"stem-403.4\",{\"x\":403.4,\"y\":403.45,\"width\":268.94,\"height\":672.24}],[\"$\",\"rect\",\"stem-806.81\",{\"x\":806.81,\"y\":403.45,\"width\":268.94,\"height\":672.24}]]}]}],[\"$\",\"p\",null,{\"className\":\"mt-[18px] max-w-[340px] text-[15px] leading-[1.65] text-muted-foreground\",\"children\":[\"A next-generation software system.\",[\"$\",\"br\",null,{}],\"Workers. Triggers. Functions.\"]}],[\"$\",\"p\",null,{\"className\":\"mt-2 max-w-[340px] text-[13px] leading-[1.65] text-muted-foreground\",\"children\":[\"Pronounced\",\" \",[\"$\",\"span\",null,{\"className\":\"text-foreground\",\"children\":\"\\\"three eye\\\"\"}]]}]]}],[\"$\",\"nav\",null,{\"aria-label\":\"Footer\",\"className\":\"grid grid-cols-3 gap-8 max-sm:grid-cols-2 max-sm:gap-x-4 max-sm:gap-y-6\",\"children\":[[\"$\",\"div\",\"Product\",{\"children\":[[\"$\",\"h3\",null,{\"className\":\"mb-3 text-[13px] font-medium tracking-[0.06em] text-muted-foreground uppercase\",\"children\":\"Product\"}],[\"$\",\"ul\",null,{\"className\":\"list-none p-0\",\"children\":[[\"$\",\"li\",\"Docs\",{\"children\":[\"$\",\"a\",null,{\"href\":\"https://iii.dev/docs\",\"className\":\"group flex min-h-9 items-center gap-2.5 text-[14px] text-muted-foreground transition-[color] duration-150 ease-[ease] hover:text-foreground max-sm:min-h-11 focus-visible:rounded-xs focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-foreground\",\"children\":[null,[\"$\",\"span\",null,{\"children\":\"Docs\"}],null]}]}],[\"$\",\"li\",\"Quickstart\",{\"children\":[\"$\",\"a\",null,{\"href\":\"https://iii.dev/docs/quickstart\",\"className\":\"group flex min-h-9 items-center gap-2.5 text-[14px] text-muted-foreground transition-[color] duration-150 ease-[ease] hover:text-foreground max-sm:min-h-11 focus-visible:rounded-xs focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-foreground\",\"children\":[null,[\"$\",\"span\",null,{\"children\":\"Quickstart\"}],null]}]}],[\"$\",\"li\",\"Worker registry\",{\"children\":[\"$\",\"a\",null,{\"href\":\"/registry\",\"className\":\"group flex min-h-9 items-center gap-2.5 text-[14px] text-muted-foreground transition-[color] duration-150 ease-[ease] hover:text-foreground max-sm:min-h-11 focus-visible:rounded-xs focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-foreground\",\"children\":[null,[\"$\",\"span\",null,{\"children\":\"Worker registry\"}],null]}]}],[\"$\",\"li\",\"Roadmap\",{\"children\":[\"$\",\"a\",null,{\"href\":\"https://iii.dev/roadmap\",\"className\":\"group flex min-h-9 items-center gap-2.5 text-[14px] text-muted-foreground transition-[color] duration-150 ease-[ease] hover:text-foreground max-sm:min-h-11 focus-visible:rounded-xs focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-foreground\",\"children\":[null,[\"$\",\"span\",null,{\"children\":\"Roadmap\"}],null]}]}],[\"$\",\"li\",\"Manifesto\",{\"children\":[\"$\",\"a\",null,{\"href\":\"https://iii.dev/manifesto\",\"className\":\"group flex min-h-9 items-center gap-2.5 text-[14px] text-muted-foreground transition-[color] duration-150 ease-[ease] hover:text-foreground max-sm:min-h-11 focus-visible:rounded-xs focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-foreground\",\"children\":[null,[\"$\",\"span\",null,{\"children\":\"Manifesto\"}],null]}]}],\"$L18\"]}]]}],\"$L19\",\"$L1a\"]}]]}],\"$L1b\"]}]}]\n"])</script><script>self.__next_f.push([1,"18:[\"$\",\"li\",\"Blog\",{\"children\":[\"$\",\"a\",null,{\"href\":\"https://iii.dev/blog\",\"className\":\"group flex min-h-9 items-center gap-2.5 text-[14px] text-muted-foreground transition-[color] duration-150 ease-[ease] hover:text-foreground max-sm:min-h-11 focus-visible:rounded-xs focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-foreground\",\"children\":[null,[\"$\",\"span\",null,{\"children\":\"Blog\"}],null]}]}]\n1c:T4c4,M12 2.69922C6.762 2.69922 2.5 6.96122 2.5 12.1992C2.5 16.3252 5.24 20.0532 9.164 21.2662C9.324 21.3182 9.498 21.2822 9.627 21.1762C9.757 21.0702 9.825 20.9062 9.809 20.7392C9.669 19.3462 10.47 17.8702 10.812 17.5162C10.944 17.3812 10.988 17.1822 10.925 17.0042C10.862 16.8252 10.704 16.6962 10.516 16.6732C8.725 16.4452 7.067 15.8372 7.067 12.9472C7.063 12.2282 7.337 11.5412 7.836 11.0122C7.968 10.8732 8.009 10.6712 7.941 10.4922C7.75 9.98722 7.729 9.42222 7.877 8.90022C8.168 8.94822 8.731 9.11922 9.608 9.70522C9.728 9.78622 9.877 9.80722 10.015 9.77222C11.312 9.42422 12.682 9.42422 13.979 9.77222C14.116 9.80722 14.266 9.78622 14.386 9.70522C15.27 9.11422 15.835 8.94522 16.115 8.89622C16.264 9.42022 16.245 9.98622 16.054 10.4932C15.986 10.6732 16.027 10.8752 16.16 11.0132C16.654 11.5332 16.927 12.2172 16.927 12.9382C16.927 15.8772 15.273 16.4642 13.486 16.6612C13.296 16.6812 13.135 16.8092 13.071 16.9882C13.006 17.1682 13.049 17.3692 13.182 17.5062C13.512 17.8472 14.321 19.3622 14.185 20.7502C14.168 20.9172 14.236 21.0812 14.367 21.1862C14.457 21.2612 14.569 21.2992 14.682 21.2992C14.732 21.2992 14.783 21.2912 14.832 21.2752C18.82 20.0202 21.5 16.3732 21.5 12.1992C21.5 6.96122 17.238 2.69922 12 2.69922Z1d:T894,"])</script><script>self.__next_f.push([1,"M10.4919 12.798C10.4928 12.7793 10.4916 12.7606 10.489 12.7421C10.4613 12.5469 10.4514 12.347 10.3951 12.1599C10.1841 11.4539 9.74808 10.9469 9.00608 10.7969C8.29208 10.6539 7.71308 10.9269 7.28508 11.5059C6.70508 12.2879 6.76108 13.4529 7.40208 14.1859C8.09108 14.9729 9.21108 14.9939 9.92408 14.2269C10.2967 13.8258 10.4673 13.3434 10.4919 12.798ZM17.1383 12.7812C17.1389 12.7644 17.1379 12.7475 17.1357 12.7308C17.1132 12.5616 17.1039 12.3878 17.0601 12.2239C16.8721 11.5239 16.4651 11.0089 15.7441 10.8189C15.1071 10.6509 14.5481 10.8339 14.0951 11.3089C13.3501 12.0899 13.3461 13.4249 14.0781 14.2169C14.7981 14.9939 15.9331 14.9789 16.6201 14.1779C16.9636 13.7773 17.1191 13.306 17.1383 12.7812ZM17.0985 17.278C17.2735 17.1939 17.3406 16.9478 17.1827 16.8346C17.0669 16.7515 16.9741 16.7834 16.7571 16.8759C13.5891 18.2239 10.4191 18.2099 7.24908 16.8849C7.02096 16.7895 6.93273 16.7517 6.82128 16.8227C6.65302 16.93 6.71802 17.1898 6.89748 17.277C7.23862 17.4429 7.58015 17.609 7.93832 17.7829C8.09958 17.8613 8.15678 18.0626 8.06083 18.214C7.77618 18.6633 7.49507 19.108 7.20508 19.5459C7.17408 19.5919 7.04108 19.6069 6.97208 19.5859C5.25708 19.0449 3.67108 18.2459 2.22008 17.1829C2.14608 17.1289 2.08208 17.0159 2.07408 16.9239C1.74508 13.2929 2.51308 9.90588 4.35508 6.75988C5.05808 5.55888 5.05608 5.53788 6.55408 5.06188C7.34208 4.81188 8.15408 4.63988 8.95308 4.42288C9.12908 4.37588 9.21708 4.42788 9.28708 4.58688C9.37508 4.78388 9.50608 4.96388 9.57408 5.16688C9.65508 5.40888 9.77908 5.46588 10.0301 5.42988C11.4051 5.23188 12.7811 5.26188 14.1551 5.44288C14.2295 5.45351 14.3008 5.4087 14.3344 5.34142C14.4633 5.08312 14.5955 4.82606 14.7171 4.56288C14.7801 4.42488 14.8581 4.38688 15.0111 4.41588C16.3001 4.65988 17.5471 5.03488 18.7421 5.57688C18.8641 5.63288 18.9861 5.73388 19.0601 5.84488C20.4731 7.95488 21.4261 10.2489 21.8121 12.7659C22.0241 14.1449 22.0491 15.5309 21.9241 16.9189C21.9151 17.0179 21.8391 17.1399 21.7561 17.1989C20.3161 18.2439 18.7501 19.0439 17.0491 19.5739C16.9661 19.5999 16.8091 19.5849 16.7731 19.5309C16.4849 19.0998 16.2096 18.6599 15.9282 18.2116C15.8329 18.0598 15.8907 17.8587 16.0522 17.781C16.4087 17.6095 16.7514 17.4448 17.0985 17.278Z"])</script><script>self.__next_f.push([1,"19:[\"$\",\"div\",\"Community\",{\"children\":[[\"$\",\"h3\",null,{\"className\":\"mb-3 text-[13px] font-medium tracking-[0.06em] text-muted-foreground uppercase\",\"children\":\"Community\"}],[\"$\",\"ul\",null,{\"className\":\"list-none p-0\",\"children\":[[\"$\",\"li\",\"GitHub\",{\"children\":[\"$\",\"a\",null,{\"href\":\"https://github.com/iii-hq/iii\",\"className\":\"group flex min-h-9 items-center gap-2.5 text-[14px] text-muted-foreground transition-[color] duration-150 ease-[ease] hover:text-foreground max-sm:min-h-11 focus-visible:rounded-xs focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-foreground\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"children\":[[\"$\",\"svg\",null,{\"viewBox\":\"0 0 24 24\",\"fill\":\"currentColor\",\"aria-hidden\":true,\"focusable\":\"false\",\"className\":\"size-4 shrink-0\",\"children\":[\"$\",\"path\",null,{\"fillRule\":\"evenodd\",\"clipRule\":\"evenodd\",\"d\":\"$1c\"}]}],[\"$\",\"span\",null,{\"children\":\"GitHub\"}],[\"$\",\"$L17\",null,{\"ref\":\"$undefined\",\"iconNode\":[[\"path\",{\"d\":\"M7 7h10v10\",\"key\":\"1tivn9\"}],[\"path\",{\"d\":\"M7 17 17 7\",\"key\":\"1vkiza\"}]],\"className\":\"lucide-arrow-up-right ml-auto size-3 opacity-0 group-hover:opacity-100\",\"aria-hidden\":\"true\"}]]}]}],[\"$\",\"li\",\"Discord\",{\"children\":[\"$\",\"a\",null,{\"href\":\"https://discord.gg/iiidev\",\"className\":\"group flex min-h-9 items-center gap-2.5 text-[14px] text-muted-foreground transition-[color] duration-150 ease-[ease] hover:text-foreground max-sm:min-h-11 focus-visible:rounded-xs focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-foreground\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"children\":[[\"$\",\"svg\",null,{\"viewBox\":\"0 0 24 24\",\"fill\":\"currentColor\",\"aria-hidden\":true,\"focusable\":\"false\",\"className\":\"size-4 shrink-0\",\"children\":[\"$\",\"path\",null,{\"fillRule\":\"evenodd\",\"clipRule\":\"evenodd\",\"d\":\"$1d\"}]}],\"$L1e\",\"$L1f\"]}]}],\"$L20\",\"$L21\"]}]]}]\n"])</script><script>self.__next_f.push([1,"22:T5b4,"])</script><script>self.__next_f.push([1,"M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z"])</script><script>self.__next_f.push([1,"1a:[\"$\",\"div\",\"Ask about iii\",{\"children\":[[\"$\",\"h3\",null,{\"className\":\"mb-3 text-[13px] font-medium tracking-[0.06em] text-muted-foreground uppercase\",\"children\":\"Ask about iii\"}],[\"$\",\"ul\",null,{\"className\":\"list-none p-0\",\"children\":[[\"$\",\"li\",\"ChatGPT\",{\"children\":[\"$\",\"a\",null,{\"href\":\"https://chatgpt.com/?q=Read%20https%3A%2F%2Fiii.dev%2Fllms.txt%20and%20explain%20iii%20to%20me%3A%20its%20three%20primitives%20(Worker%2C%20Trigger%2C%20Function)%2C%20what%20it%20replaces%20in%20a%20typical%20backend%2C%20and%20how%20I%20would%20install%20it%20and%20build%20a%20first%20service.\",\"className\":\"group flex min-h-9 items-center gap-2.5 text-[14px] text-muted-foreground transition-[color] duration-150 ease-[ease] hover:text-foreground max-sm:min-h-11 focus-visible:rounded-xs focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-foreground\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"children\":[[\"$\",\"svg\",null,{\"viewBox\":\"0 0 24 24\",\"fill\":\"currentColor\",\"aria-hidden\":true,\"focusable\":\"false\",\"className\":\"size-4 shrink-0\",\"children\":[\"$\",\"path\",null,{\"d\":\"$22\"}]}],[\"$\",\"span\",null,{\"children\":\"ChatGPT\"}],[\"$\",\"$L17\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$19:props:children:1:props:children:0:props:children:props:children:2:props:iconNode\",\"className\":\"lucide-arrow-up-right ml-auto size-3 opacity-0 group-hover:opacity-100\",\"aria-hidden\":\"true\"}]]}]}],[\"$\",\"li\",\"Claude\",{\"children\":[\"$\",\"a\",null,{\"href\":\"https://claude.ai/new?q=Read%20https%3A%2F%2Fiii.dev%2Fllms.txt%20and%20explain%20iii%20to%20me%3A%20its%20three%20primitives%20(Worker%2C%20Trigger%2C%20Function)%2C%20what%20it%20replaces%20in%20a%20typical%20backend%2C%20and%20how%20I%20would%20install%20it%20and%20build%20a%20first%20service.\",\"className\":\"group flex min-h-9 items-center gap-2.5 text-[14px] text-muted-foreground transition-[color] duration-150 ease-[ease] hover:text-foreground max-sm:min-h-11 focus-visible:rounded-xs focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-foreground\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"children\":[[\"$\",\"svg\",null,{\"viewBox\":\"0 0 24 24\",\"fill\":\"currentColor\",\"aria-hidden\":true,\"focusable\":\"false\",\"className\":\"size-4 shrink-0\",\"children\":\"$L23\"}],\"$L24\",\"$L25\"]}]}],\"$L26\",\"$L27\"]}]]}]\n"])</script><script>self.__next_f.push([1,"1b:[\"$\",\"div\",null,{\"className\":\"mt-13 border-t border-line py-[22px] text-[13px] text-muted-foreground max-sm:mt-9\",\"children\":[\"$\",\"p\",null,{\"className\":\"flex items-center gap-2\",\"children\":[\"© \",2026,\" Motia LLC\",\" \",[\"$\",\"span\",null,{\"aria-hidden\":\"true\",\"children\":\"·\"}],\" \",[\"$\",\"a\",null,{\"href\":\"https://iii.dev/privacy-policy\",\"className\":\"hover:text-foreground focus-visible:rounded-xs focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-foreground\",\"children\":\"Privacy\"}]]}]}]\n"])</script><script>self.__next_f.push([1,"1e:[\"$\",\"span\",null,{\"children\":\"Discord\"}]\n1f:[\"$\",\"$L17\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$19:props:children:1:props:children:0:props:children:props:children:2:props:iconNode\",\"className\":\"lucide-arrow-up-right ml-auto size-3 opacity-0 group-hover:opacity-100\",\"aria-hidden\":\"true\"}]\n20:[\"$\",\"li\",\"Twitter / X\",{\"children\":[\"$\",\"a\",null,{\"href\":\"https://x.com/iiidevs\",\"className\":\"group flex min-h-9 items-center gap-2.5 text-[14px] text-muted-foreground transition-[color] duration-150 ease-[ease] hover:text-foreground max-sm:min-h-11 focus-visible:rounded-xs focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-foreground\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"children\":[[\"$\",\"svg\",null,{\"viewBox\":\"0 0 24 24\",\"fill\":\"currentColor\",\"aria-hidden\":true,\"focusable\":\"false\",\"className\":\"size-4 shrink-0\",\"children\":[\"$\",\"path\",null,{\"transform\":\"translate(1.5 1.5) scale(0.875)\",\"d\":\"M18.901 1.153h3.68l-8.04 9.19L24 22.846h-7.406l-5.8-7.584-6.638 7.584H.474l8.6-9.83L0 1.154h7.594l5.243 6.932ZM17.61 20.644h2.039L6.486 3.24H4.298Z\"}]}],[\"$\",\"span\",null,{\"children\":\"Twitter / X\"}],[\"$\",\"$L17\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$19:props:children:1:props:children:0:props:children:props:children:2:props:iconNode\",\"className\":\"lucide-arrow-up-right ml-auto size-3 opacity-0 group-hover:opacity-100\",\"aria-hidden\":\"true\"}]]}]}]\n21:[\"$\",\"li\",\"LinkedIn\",{\"children\":[\"$\",\"a\",null,{\"href\":\"https://www.linkedin.com/company/iii-dev\",\"className\":\"group flex min-h-9 items-center gap-2.5 text-[14px] text-muted-foreground transition-[color] duration-150 ease-[ease] hover:text-foreground max-sm:min-h-11 focus-visible:rounded-xs focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-foreground\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"children\":[[\"$\",\"svg\",null,{\"viewBox\":\"0 0 24 24\",\"fill\":\"currentColor\",\"aria-hidden\":true,\"focusable\":\"false\",\"className\":\"size-4 shrink-0\",\"children\":[\"$\",\"path\",null,{\"fillRule\":\"evenodd\",\"clipRule\":\"evenodd\",\"d\":\"M5.4 2.5h13.2a2.9 2.9 0 0 1 2.9 2.9v13.2a2.9 2.9 0 0 1-2.9 2.9H5.4a2.9 2.9 0 0 1-2.9-2.9V5.4a2.9 2.9 0 0 1 2.9-2.9Zm2.33 7.1H5.6v7.9h2.13V9.6ZM6.67 6.1a1.24 1.24 0 1 0 0 2.48 1.24 1.24 0 0 0 0-2.48Zm11.73 7.1c0-2.26-1.21-3.31-2.82-3.31-1.3 0-1.88.72-2.21 1.22V9.6H11.2c.03.6 0 7.9 0 7.9h2.17v-4.41c0-.24.02-.47.09-.64.19-.47.62-.96 1.35-.96.95 0 1.33.73 1.33 1.79v4.22h2.26V13.2Z\"}]}],[\"$\",\"span\",null,{\"children\":\"LinkedIn\"}],[\"$\",\"$L17\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$19:props:children:1:props:children:0:props:children:props:children:2:props:iconNode\",\"className\":\"lucide-arrow-up-right ml-auto size-3 opacity-0 group-hover:opacity-100\",\"aria-hidden\":\"true\"}]]}]}]\n28:T713,"])</script><script>self.__next_f.push([1,"m4.7144 15.9555 4.7174-2.6471.079-.2307-.079-.1275h-.2307l-.7893-.0486-2.6956-.0729-2.3375-.0971-2.2646-.1214-.5707-.1215-.5343-.7042.0546-.3522.4797-.3218.686.0608 1.5179.1032 2.2767.1578 1.6514.0972 2.4468.255h.3886l.0546-.1579-.1336-.0971-.1032-.0972L6.973 9.8356l-2.55-1.6879-1.3356-.9714-.7225-.4918-.3643-.4614-.1578-1.0078.6557-.7225.8803.0607.2246.0607.8925.686 1.9064 1.4754 2.4893 1.8336.3643.3035.1457-.1032.0182-.0728-.164-.2733-1.3539-2.4467-1.445-2.4893-.6435-1.032-.17-.6194c-.0607-.255-.1032-.4674-.1032-.7285L6.287.1335 6.6997 0l.9957.1336.419.3642.6192 1.4147 1.0018 2.2282 1.5543 3.0296.4553.8985.2429.8318.091.255h.1579v-.1457l.1275-1.706.2368-2.0947.2307-2.6957.0789-.7589.3764-.9107.7468-.4918.5828.2793.4797.686-.0668.4433-.2853 1.8517-.5586 2.9021-.3643 1.9429h.2125l.2429-.2429.9835-1.3053 1.6514-2.0643.7286-.8196.85-.9046.5464-.4311h1.0321l.759 1.1293-.34 1.1657-1.0625 1.3478-.8804 1.1414-1.2628 1.7-.7893 1.36.0729.1093.1882-.0183 2.8535-.607 1.5421-.2794 1.8396-.3157.8318.3886.091.3946-.3278.8075-1.967.4857-2.3072.4614-3.4364.8136-.0425.0304.0486.0607 1.5482.1457.6618.0364h1.621l3.0175.2247.7892.522.4736.6376-.079.4857-1.2142.6193-1.6393-.3886-3.825-.9107-1.3113-.3279h-.1822v.1093l1.0929 1.0686 2.0035 1.8092 2.5075 2.3314.1275.5768-.3218.4554-.34-.0486-2.2039-1.6575-.85-.7468-1.9246-1.621h-.1275v.17l.4432.6496 2.3436 3.5214.1214 1.0807-.17.3521-.6071.2125-.6679-.1214-1.3721-1.9246L14.38 17.959l-1.1414-1.9428-.1397.079-.674 7.2552-.3156.3703-.7286.2793-.6071-.4614-.3218-.7468.3218-1.4753.3886-1.9246.3157-1.53.2853-1.9004.17-.6314-.0121-.0425-.1397.0182-1.4328 1.9672-2.1796 2.9446-1.7243 1.8456-.4128.164-.7164-.3704.0667-.6618.4008-.5889 2.386-3.0357 1.4389-1.882.929-1.0868-.0062-.1579h-.0546l-6.3385 4.1164-1.1293.1457-.4857-.4554.0608-.7467.2307-.2429 1.9064-1.3114Z"])</script><script>self.__next_f.push([1,"23:[\"$\",\"path\",null,{\"d\":\"$28\"}]\n24:[\"$\",\"span\",null,{\"children\":\"Claude\"}]\n25:[\"$\",\"$L17\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$19:props:children:1:props:children:0:props:children:props:children:2:props:iconNode\",\"className\":\"lucide-arrow-up-right ml-auto size-3 opacity-0 group-hover:opacity-100\",\"aria-hidden\":\"true\"}]\n"])</script><script>self.__next_f.push([1,"26:[\"$\",\"li\",\"Perplexity\",{\"children\":[\"$\",\"a\",null,{\"href\":\"https://www.perplexity.ai/search?q=Read%20https%3A%2F%2Fiii.dev%2Fllms.txt%20and%20explain%20iii%20to%20me%3A%20its%20three%20primitives%20(Worker%2C%20Trigger%2C%20Function)%2C%20what%20it%20replaces%20in%20a%20typical%20backend%2C%20and%20how%20I%20would%20install%20it%20and%20build%20a%20first%20service.\",\"className\":\"group flex min-h-9 items-center gap-2.5 text-[14px] text-muted-foreground transition-[color] duration-150 ease-[ease] hover:text-foreground max-sm:min-h-11 focus-visible:rounded-xs focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-foreground\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"children\":[[\"$\",\"svg\",null,{\"viewBox\":\"0 0 24 24\",\"fill\":\"currentColor\",\"aria-hidden\":true,\"focusable\":\"false\",\"className\":\"size-4 shrink-0\",\"children\":[\"$\",\"path\",null,{\"d\":\"M22.3977 7.0896h-2.3106V.0676l-7.5094 6.3542V.1577h-1.1554v6.1966L4.4904 0v7.0896H1.6023v10.3976h2.8882V24l6.932-6.3591v6.2005h1.1554v-6.0469l6.9318 6.1807v-6.4879h2.8882V7.0896zm-3.4657-4.531v4.531h-5.355l5.355-4.531zm-13.2862.0676 4.8691 4.4634H5.6458V2.6262zM2.7576 16.332V8.245h7.8476l-6.1149 6.1147v1.9723H2.7576zm2.8882 5.0404v-3.8852h.0001v-2.6488l5.7763-5.7764v7.0111l-5.7764 5.2993zm7.0212-7.0212v-7.0111l5.7764 5.7764v2.6488h.0001v3.8852l-5.7765-5.2993zm8.9765 2.0444h-1.9727l-6.1149-6.1147h8.0876v6.1147z\"}]}],[\"$\",\"span\",null,{\"children\":\"Perplexity\"}],[\"$\",\"$L17\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$19:props:children:1:props:children:0:props:children:props:children:2:props:iconNode\",\"className\":\"lucide-arrow-up-right ml-auto size-3 opacity-0 group-hover:opacity-100\",\"aria-hidden\":\"true\"}]]}]}]\n"])</script><script>self.__next_f.push([1,"27:[\"$\",\"li\",\"Grok\",{\"children\":[\"$\",\"a\",null,{\"href\":\"https://grok.com/?q=Read%20https%3A%2F%2Fiii.dev%2Fllms.txt%20and%20explain%20iii%20to%20me%3A%20its%20three%20primitives%20(Worker%2C%20Trigger%2C%20Function)%2C%20what%20it%20replaces%20in%20a%20typical%20backend%2C%20and%20how%20I%20would%20install%20it%20and%20build%20a%20first%20service.\",\"className\":\"group flex min-h-9 items-center gap-2.5 text-[14px] text-muted-foreground transition-[color] duration-150 ease-[ease] hover:text-foreground max-sm:min-h-11 focus-visible:rounded-xs focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-foreground\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"children\":[[\"$\",\"svg\",null,{\"viewBox\":\"0 0 24 24\",\"fill\":\"currentColor\",\"aria-hidden\":true,\"focusable\":\"false\",\"className\":\"size-4 shrink-0\",\"children\":[\"$\",\"path\",null,{\"d\":\"M9.27 15.29l7.978-5.897c.391-.29.95-.177 1.137.272.98 2.369.542 5.215-1.41 7.169-1.951 1.954-4.667 2.382-7.149 1.406l-2.711 1.257c3.889 2.661 8.611 2.003 11.562-.953 2.341-2.344 3.066-5.539 2.388-8.42l.006.007c-.983-4.232.242-5.924 2.75-9.383.06-.082.12-.164.179-.248l-3.301 3.305v-.01L9.267 15.292M7.623 16.723c-2.792-2.67-2.31-6.801.071-9.184 1.761-1.763 4.647-2.483 7.166-1.425l2.705-1.25a7.808 7.808 0 00-1.829-1A8.975 8.975 0 005.984 5.83c-2.533 2.536-3.33 6.436-1.962 9.764 1.022 2.487-.653 4.246-2.34 6.022-.599.63-1.199 1.259-1.682 1.925l7.62-6.815\"}]}],[\"$\",\"span\",null,{\"children\":\"Grok\"}],[\"$\",\"$L17\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$19:props:children:1:props:children:0:props:children:props:children:2:props:iconNode\",\"className\":\"lucide-arrow-up-right ml-auto size-3 opacity-0 group-hover:opacity-100\",\"aria-hidden\":\"true\"}]]}]}]\n"])</script><script>self.__next_f.push([1,"29:T7b5,"])</script><script>self.__next_f.push([1,"{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"ItemPage\",\"@id\":\"https://iii.dev/registry/workers/iii-directory#page\",\"url\":\"https://iii.dev/registry/workers/iii-directory\",\"name\":\"iii-directory · iii Registry\",\"isPartOf\":{\"@id\":\"https://iii.dev/registry#website\"},\"breadcrumb\":{\"@id\":\"https://iii.dev/registry/workers/iii-directory#breadcrumb\"},\"mainEntity\":{\"@id\":\"https://iii.dev/registry/workers/iii-directory#subject\"}},{\"@type\":\"SoftwareApplication\",\"@id\":\"https://iii.dev/registry/workers/iii-directory#subject\",\"name\":\"iii-directory\",\"description\":\"Engine introspection, workers registry proxy, filesystem-backed skills, system prompts, and agent profiles, kit install and update with reviewed plans, plus function search ranked by the judge worker (falling back to local hybrid/lexical) with a conditional pre-generate hint.\",\"url\":\"https://iii.dev/registry/workers/iii-directory\",\"applicationCategory\":\"DeveloperApplication\",\"applicationSubCategory\":\"iii worker\",\"softwareVersion\":\"1.2.38\",\"operatingSystem\":\"macOS, Linux, Windows\",\"softwareRequirements\":\"iii engine\",\"keywords\":\"agents, directory, functions, introspect, kits, registry, search, skills\",\"license\":\"Apache-2.0\",\"isAccessibleForFree\":true,\"offers\":{\"@type\":\"Offer\",\"price\":\"0\",\"priceCurrency\":\"USD\"},\"interactionStatistic\":{\"@type\":\"InteractionCounter\",\"interactionType\":\"https://schema.org/DownloadAction\",\"userInteractionCount\":5963},\"author\":{\"@id\":\"https://iii.dev/#organization\"},\"subjectOf\":{\"@type\":\"SoftwareSourceCode\",\"codeRepository\":\"https://github.com/iii-hq/workers\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://iii.dev/registry/workers/iii-directory#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"iii Registry\",\"item\":\"https://iii.dev/registry\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Workers\",\"item\":\"https://iii.dev/registry/workers\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"iii-directory\",\"item\":\"https://iii.dev/registry/workers/iii-directory\"}]}]}"])</script><script>self.__next_f.push([1,"5:[\"$\",\"div\",null,{\"className\":\"page-transition\",\"children\":[[\"$\",\"script\",null,{\"type\":\"application/ld+json\",\"dangerouslySetInnerHTML\":{\"__html\":\"$29\"}}],[\"$\",\"header\",null,{\"className\":\"flex items-end justify-between flex-wrap gap-x-8 gap-y-5 px-[22px] pt-12 sm:px-9 sm:pt-16 pb-6 sm:pb-6\",\"children\":[[\"$\",\"div\",null,{\"className\":\"min-w-0\",\"children\":[[\"$\",\"div\",null,{\"className\":\"mb-3 font-mono text-[10px] leading-[normal] uppercase tracking-[0.08em] text-muted-foreground\",\"children\":[\"$\",\"nav\",null,{\"aria-label\":\"Breadcrumb\",\"className\":\"flex items-center gap-x-1.5\",\"children\":[[\"$\",\"$L13\",null,{\"href\":\"/\",\"className\":\"transition-colors duration-150 hover:text-foreground\",\"children\":\"Registry\"}],[\"$\",\"span\",null,{\"aria-hidden\":true,\"children\":\"/\"}],[\"$\",\"$L13\",null,{\"href\":\"/workers\",\"className\":\"transition-colors duration-150 hover:text-foreground\",\"children\":\"Workers\"}]]}]}],[\"$\",\"div\",null,{\"className\":\"flex items-center flex-wrap gap-x-3 gap-y-2\",\"children\":[[\"$\",\"h1\",null,{\"className\":\"text-[32px] sm:text-[40px] font-[550] leading-[1.1] tracking-[-0.04em] text-foreground text-balance\",\"children\":\"iii-directory\"}],\"$undefined\",[\"$\",\"span\",null,{\"className\":\"inline-flex h-6 items-center gap-1.5 rounded-md bg-code px-2 font-mono text-[13px] tabular-nums text-muted-foreground\",\"children\":\"v1.2.38\"}]]}],[\"$\",\"p\",null,{\"className\":\"mt-4 max-w-[60ch] text-[15px] leading-[1.7] text-muted-foreground text-pretty\",\"children\":\"Engine introspection, workers registry proxy, filesystem-backed skills, system prompts, and agent profiles, kit install and update with reviewed plans, plus function search ranked by the judge worker (falling back to local hybrid/lexical) with a conditional pre-generate hint.\"}]]}],null]}],\"$L2a\",\"$L2b\"]}]\n"])</script><script>self.__next_f.push([1,"2f:I[21158,[\"/registry/_next/static/chunks/0ov4a9hzi1oek.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/02q_l477hmi84.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/0xkym.2ps9qyc.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/0tclp6.7qxzgs.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/0jm9zdrfsajnq.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\"],\"InstallPanel\"]\n30:I[84938,[\"/registry/_next/static/chunks/0ov4a9hzi1oek.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/02q_l477hmi84.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/0xkym.2ps9qyc.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/0tclp6.7qxzgs.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/0jm9zdrfsajnq.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\"],\"PageTabs\"]\n"])</script><script>self.__next_f.push([1,"2a:[\"$\",\"div\",null,{\"className\":\"flex flex-col gap-y-5 px-[22px] pb-10 sm:px-9 sm:pb-12\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex flex-wrap items-center gap-x-2.5 gap-y-2 text-[13px] text-muted-foreground\",\"children\":[[\"$\",\"span\",\"0\",{\"className\":\"contents\",\"children\":[null,[\"$\",\"span\",\"license\",{\"className\":\"inline-block first-letter:uppercase\",\"children\":[\"license: \",\"Apache-2.0\"]}]]}],[\"$\",\"span\",\"1\",{\"className\":\"contents\",\"children\":[[\"$\",\"span\",null,{\"aria-hidden\":true,\"className\":\"text-[color-mix(in_srgb,var(--muted-foreground)_55%,transparent)] max-sm:hidden\",\"children\":\"·\"}],[\"$\",\"time\",\"published\",{\"dateTime\":\"2026-10-08T17:14:07.257Z\",\"title\":\"2026-10-08T17:14:07.257Z\",\"className\":\"tabular-nums\",\"children\":[\"Published \",\"11d ago\"]}]]}],[\"$\",\"span\",\"2\",{\"className\":\"contents\",\"children\":[[\"$\",\"span\",null,{\"aria-hidden\":true,\"className\":\"text-[color-mix(in_srgb,var(--muted-foreground)_55%,transparent)] max-sm:hidden\",\"children\":\"·\"}],[\"$\",\"a\",\"kits\",{\"href\":\"#used-in-kits\",\"className\":\"transition-colors duration-150 hover:text-foreground\",\"children\":[\"Used in\",\" \",[\"$\",\"strong\",null,{\"className\":\"font-medium tabular-nums text-foreground\",\"children\":1}],\" \",\"kit\"]}]]}],[\"$\",\"span\",\"3\",{\"className\":\"contents\",\"children\":[[\"$\",\"span\",null,{\"aria-hidden\":true,\"className\":\"text-[color-mix(in_srgb,var(--muted-foreground)_55%,transparent)] max-sm:hidden\",\"children\":\"·\"}],[\"$\",\"span\",\"tags\",{\"className\":\"flex flex-wrap items-center gap-1.5\",\"children\":[[\"$\",\"$L13\",\"agents\",{\"href\":\"/search?tag=agents\",\"className\":\"rounded-md transition-opacity duration-150 hover:opacity-80 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand\",\"children\":[\"$\",\"span\",null,{\"className\":\"inline-flex h-6 items-center rounded-md bg-[color-mix(in_srgb,var(--foreground)_6%,transparent)] px-2 font-mono text-[13px] lowercase text-muted-foreground\",\"children\":\"agents\"}]}],[\"$\",\"$L13\",\"directory\",{\"href\":\"/search?tag=directory\",\"className\":\"rounded-md transition-opacity duration-150 hover:opacity-80 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand\",\"children\":[\"$\",\"span\",null,{\"className\":\"inline-flex h-6 items-center rounded-md bg-[color-mix(in_srgb,var(--foreground)_6%,transparent)] px-2 font-mono text-[13px] lowercase text-muted-foreground\",\"children\":\"directory\"}]}],[\"$\",\"$L13\",\"functions\",{\"href\":\"/search?tag=functions\",\"className\":\"rounded-md transition-opacity duration-150 hover:opacity-80 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand\",\"children\":[\"$\",\"span\",null,{\"className\":\"inline-flex h-6 items-center rounded-md bg-[color-mix(in_srgb,var(--foreground)_6%,transparent)] px-2 font-mono text-[13px] lowercase text-muted-foreground\",\"children\":\"functions\"}]}],[\"$\",\"$L13\",\"introspect\",{\"href\":\"/search?tag=introspect\",\"className\":\"rounded-md transition-opacity duration-150 hover:opacity-80 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand\",\"children\":[\"$\",\"span\",null,{\"className\":\"inline-flex h-6 items-center rounded-md bg-[color-mix(in_srgb,var(--foreground)_6%,transparent)] px-2 font-mono text-[13px] lowercase text-muted-foreground\",\"children\":\"introspect\"}]}],[\"$\",\"$L13\",\"kits\",{\"href\":\"/search?tag=kits\",\"className\":\"rounded-md transition-opacity duration-150 hover:opacity-80 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand\",\"children\":[\"$\",\"span\",null,{\"className\":\"inline-flex h-6 items-center rounded-md bg-[color-mix(in_srgb,var(--foreground)_6%,transparent)] px-2 font-mono text-[13px] lowercase text-muted-foreground\",\"children\":\"kits\"}]}],[\"$\",\"$L13\",\"registry\",{\"href\":\"/search?tag=registry\",\"className\":\"rounded-md transition-opacity duration-150 hover:opacity-80 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand\",\"children\":\"$L2c\"}],\"$L2d\",\"$L2e\"]}]]}]]}],null,null,false,false]}]\n"])</script><script>self.__next_f.push([1,"32:T4c4,M12 2.69922C6.762 2.69922 2.5 6.96122 2.5 12.1992C2.5 16.3252 5.24 20.0532 9.164 21.2662C9.324 21.3182 9.498 21.2822 9.627 21.1762C9.757 21.0702 9.825 20.9062 9.809 20.7392C9.669 19.3462 10.47 17.8702 10.812 17.5162C10.944 17.3812 10.988 17.1822 10.925 17.0042C10.862 16.8252 10.704 16.6962 10.516 16.6732C8.725 16.4452 7.067 15.8372 7.067 12.9472C7.063 12.2282 7.337 11.5412 7.836 11.0122C7.968 10.8732 8.009 10.6712 7.941 10.4922C7.75 9.98722 7.729 9.42222 7.877 8.90022C8.168 8.94822 8.731 9.11922 9.608 9.70522C9.728 9.78622 9.877 9.80722 10.015 9.77222C11.312 9.42422 12.682 9.42422 13.979 9.77222C14.116 9.80722 14.266 9.78622 14.386 9.70522C15.27 9.11422 15.835 8.94522 16.115 8.89622C16.264 9.42022 16.245 9.98622 16.054 10.4932C15.986 10.6732 16.027 10.8752 16.16 11.0132C16.654 11.5332 16.927 12.2172 16.927 12.9382C16.927 15.8772 15.273 16.4642 13.486 16.6612C13.296 16.6812 13.135 16.8092 13.071 16.9882C13.006 17.1682 13.049 17.3692 13.182 17.5062C13.512 17.8472 14.321 19.3622 14.185 20.7502C14.168 20.9172 14.236 21.0812 14.367 21.1862C14.457 21.2612 14.569 21.2992 14.682 21.2992C14.732 21.2992 14.783 21.2912 14.832 21.2752C18.82 20.0202 21.5 16.3732 21.5 12.1992C21.5 6.96122 17.238 2.69922 12 2.69922Z"])</script><script>self.__next_f.push([1,"2b:[\"$\",\"div\",null,{\"className\":\"px-[22px] pb-16 sm:px-9\",\"children\":[\"$\",\"div\",null,{\"className\":\"grid grid-cols-1 gap-x-12 gap-y-8 @4xl:grid-cols-[minmax(0,1fr)_360px] @4xl:grid-rows-[auto_1fr]\",\"children\":[[\"$\",\"section\",null,{\"aria-label\":\"Install\",\"className\":\"flex min-w-0 flex-col gap-y-3 @4xl:col-start-2 @4xl:row-start-1\",\"children\":[[\"$\",\"h2\",null,{\"className\":\"text-[15px] font-[550] tracking-[-0.01em] text-foreground\",\"children\":\"Install\"}],[\"$\",\"$L2f\",null,{\"command\":\"iii trigger compose::add worker=iii-directory@1.2.38\",\"html\":\"\u003cpre class=\\\"shiki shiki-themes min-light vesper\\\" style=\\\"--shiki-light:#24292eff;--shiki-dark:#FFF;--shiki-light-bg:#ffffff;--shiki-dark-bg:#101010\\\" tabindex=\\\"0\\\"\u003e\u003ccode\u003e\u003cspan class=\\\"line\\\"\u003e\u003cspan style=\\\"--shiki-light:#6F42C1;--shiki-dark:#FFC799\\\"\u003eiii\u003c/span\u003e\u003cspan style=\\\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\\\"\u003e trigger\u003c/span\u003e\u003cspan style=\\\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\\\"\u003e compose::add\u003c/span\u003e\u003cspan style=\\\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\\\"\u003e worker=iii-directory@1.2.38\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\",\"workerName\":\"iii-directory\",\"version\":\"1.2.38\",\"kind\":\"worker\"}],[\"$\",\"p\",null,{\"className\":\"text-[13px] leading-[1.6] text-pretty text-muted-foreground\",\"children\":\"Run in your project with the iii engine running. Exact versions are immutable and digest-pinned.\"}]]}],[\"$\",\"div\",null,{\"className\":\"min-w-0 flex flex-col gap-y-8 @4xl:col-start-1 @4xl:row-span-2 @4xl:row-start-1\",\"children\":[[\"$\",\"$L30\",null,{\"slug\":\"iii-directory\",\"activeTab\":\"readme\",\"version\":\"1.2.38\",\"basePath\":\"/workers\",\"tabs\":\"$undefined\"}],[null,[\"$\",\"section\",null,{\"aria-label\":\"Readme\",\"children\":\"$L31\"}]],false,false,false,false,false,false]}],[\"$\",\"aside\",null,{\"className\":\"flex min-w-0 flex-col gap-y-6 @4xl:col-start-2 @4xl:row-start-2 @4xl:self-start\",\"children\":[[\"$\",\"dl\",null,{\"className\":\"grid grid-cols-2 gap-x-6\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex min-w-0 flex-col gap-y-1 border-t border-line py-3 col-span-2\",\"children\":[[\"$\",\"dt\",null,{\"className\":\"text-[13px] text-muted-foreground\",\"children\":\"Repository\"}],[\"$\",\"dd\",null,{\"className\":\"min-w-0 text-foreground\",\"children\":[\"$\",\"a\",null,{\"href\":\"https://github.com/iii-hq/workers\",\"target\":\"_blank\",\"rel\":\"noreferrer\",\"className\":\"inline-flex max-w-full items-center gap-x-2 text-[14px] font-medium transition-colors duration-150 hover:text-brand\",\"children\":[[\"$\",\"svg\",null,{\"viewBox\":\"0 0 24 24\",\"fill\":\"currentColor\",\"aria-hidden\":true,\"focusable\":\"false\",\"className\":\"size-4 shrink-0\",\"children\":[\"$\",\"path\",null,{\"fillRule\":\"evenodd\",\"clipRule\":\"evenodd\",\"d\":\"$32\"}]}],\"$L33\",\"$L34\"]}]}]]}],\"$L35\",\"$L36\",\"$L37\",\"$L38\",\"$L39\",\"$L3a\",\"$L3b\",\"$L3c\",\"$L3d\",null,\"$L3e\",null,\"$L3f\"]}],\"$L40\",\"$L41\"]}]]}]}]\n"])</script><script>self.__next_f.push([1,"42:I[56877,[\"/registry/_next/static/chunks/0ov4a9hzi1oek.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/02q_l477hmi84.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/0xkym.2ps9qyc.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/0tclp6.7qxzgs.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/0jm9zdrfsajnq.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\"],\"InstallsChart\"]\n43:I[33516,[\"/registry/_next/static/chunks/0ov4a9hzi1oek.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/02q_l477hmi84.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/0xkym.2ps9qyc.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/0tclp6.7qxzgs.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/0jm9zdrfsajnq.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\"],\"Image\"]\n46:I[42794,[\"/registry/_next/static/chunks/0ov4a9hzi1oek.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/02q_l477hmi84.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/0xkym.2ps9qyc.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/0tclp6.7qxzgs.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\",\"/registry/_next/static/chunks/0jm9zdrfsajnq.js?dpl=dpl_7ms9wUW4fXckQVSyXNpxPeemM6aC\"],\"SummaryList\"]\n:HL[\"https://iii.dev/docs/_mintlify/favicons/motiadev/AFkVbz_UcSL_5jsm/_generated/favicon/apple-touch-icon.png\",\"image\"]\n2c:[\"$\",\"span\",null,{\"className\":\"inline-flex h-6 items-center rounded-md bg-[color-mix(in_srgb,var(--foreground)_6%,transparent)] px-2 font-mono text-[13px] lowercase text-muted-foreground\",\"children\":\"registry\"}]\n2d:[\"$\",\"$L13\",\"search\",{\"href\":\"/search?tag=search\",\"className\":\"rounded-md transition-opacity duration-150 hover:opacity-80 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand\",\"children\":[\"$\",\"span\",null,{\"className\":\"inline-flex h-6 items-center rounded-md bg-[color-mix(in_srgb,var(--foreground)_6%,transparent)] px-2 font-mono text-[13px] lowercase text-muted-foreground\",\"children\":\"search\"}]}]\n2e:[\"$\",\"$L13\",\"skills\",{\"href\":\"/search?tag=skills\",\"className\":\"rounded-md transition-opacity duration-150 hover:opacity-80 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand\",\"children\":[\"$\",\"span\",null,{\"className\":\"inline-flex h-6 items-center rounded-md bg-[color-mix(in_srgb,var(--foreground)_6%,transparent)] px-2 font-mono text-[13px] lowercase text-muted-foreground\",\"children\":\"skills\"}]}]\n33:[\"$\",\"span\",null,{\"className\":\"truncate\",\"children\":\"iii-hq/workers\"}]\n34:[\"$\",\"$L17\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$19:props:children:1:props:children:0:props:children:props:children:2:props:iconNode\",\"className\":\"lucide-arrow-up-right size-3.5 shrink-0 text-muted-foreground\",\"aria-hidden\":true}]\n35:[\"$\",\"div\",null,{\"className\":\"flex min-w-0 flex-col gap-y-1 border-t border-line py-3 col-span-2\",\"children\":[[\"$\",\"dt\",null,{\"className\":\"text-[13px] text-muted-foreground\",\"children\":\"Weekly installs\"}],[\"$\",\"dd\",null,{\"className\":\"min-w-0 text-foreground\",\"children\":[[\"$\",\"span\",null,{\"className\":\"font-[550] tabular-nums text-[24px] tracking-[-0.03em]\",\"children\":\"815\"}],[\"$\",\"$L42\",null,{\"series\":[67,114,150,79,287,83,35],\"width\":340,\"height\":52,\"className\":\"mt-3\"}]]}]]}]\n36:[\"$\",\"div\",null,{\"className\":\"flex min-w-0 flex-col gap-y-1 border-t border-line py-3\",\"children\":[[\"$\",\"dt\",null,{\"className\":\"text-[13px] text-muted-foreground\",\"children\":\"Version\"}],[\"$\",\"dd\",null,{\"className\":\"min-w-0 text-foreground\",\"children\":[\"$\",\"span\",null,{\"className\":\"text-[16px] font-[550] leading-tight tracking-[-0.02em] tabular-nums block truncate\",\"children\":[\"v\",\"1.2.38\"]}]}]]}]\n37:[\"$\",\"div\",null,{\"className\":\"flex min-w-0 flex-col gap-y-1 border-t border-line py-3\",\"children\":[[\"$\",\"dt\",null,{\"className\":\"text-[13px] text-muted-foreground\",\"children\":\"License\"}],[\"$\",\"dd\",null,{\"className\":\"min-w-0 text-foreground\",\"children\":[\"$\",\"span\",null,{\"className\":\"text-[16px] font-[550] leading-tight tracki"])</script><script>self.__next_f.push([1,"ng-[-0.02em] tabular-nums block truncate\",\"children\":\"Apache-2.0\"}]}]]}]\n38:[\"$\",\"div\",null,{\"className\":\"flex min-w-0 flex-col gap-y-1 border-t border-line py-3\",\"children\":[[\"$\",\"dt\",null,{\"className\":\"text-[13px] text-muted-foreground\",\"children\":\"Total installs\"}],[\"$\",\"dd\",null,{\"className\":\"min-w-0 text-foreground\",\"children\":[\"$\",\"span\",null,{\"className\":\"text-[16px] font-[550] leading-tight tracking-[-0.02em] tabular-nums\",\"children\":\"5,963\"}]}]]}]\n39:[\"$\",\"div\",null,{\"className\":\"flex min-w-0 flex-col gap-y-1 border-t border-line py-3\",\"children\":[[\"$\",\"dt\",null,{\"className\":\"text-[13px] text-muted-foreground\",\"children\":\"Type\"}],[\"$\",\"dd\",null,{\"className\":\"min-w-0 text-foreground\",\"children\":[\"$\",\"span\",null,{\"className\":\"text-[16px] font-[550] leading-tight tracking-[-0.02em] tabular-nums block truncate\",\"children\":\"binary\"}]}]]}]\n3a:[[\"$\",\"div\",null,{\"className\":\"flex min-w-0 flex-col gap-y-1 border-t border-line py-3\",\"children\":[[\"$\",\"dt\",null,{\"className\":\"text-[13px] text-muted-foreground\",\"children\":\"Functions\"}],[\"$\",\"dd\",null,{\"className\":\"min-w-0 text-foreground\",\"children\":[\"$\",\"$L13\",null,{\"href\":\"/workers/iii-directory?version=1.2.38\u0026tab=api\",\"className\":\"text-[16px] font-[550] leading-tight tracking-[-0.02em] tabular-nums transition-colors duration-150 hover:text-brand\",\"children\":\"31\"}]}]]}],[\"$\",\"div\",null,{\"className\":\"flex min-w-0 flex-col gap-y-1 border-t border-line py-3\",\"children\":[[\"$\",\"dt\",null,{\"className\":\"text-[13px] text-muted-foreground\",\"children\":\"Triggers\"}],[\"$\",\"dd\",null,{\"className\":\"min-w-0 text-foreground\",\"children\":[\"$\",\"$L13\",null,{\"href\":\"/workers/iii-directory?version=1.2.38\u0026tab=api\",\"className\":\"text-[16px] font-[550] leading-tight tracking-[-0.02em] tabular-nums transition-colors duration-150 hover:text-brand\",\"children\":\"3\"}]}]]}]]\n3b:[\"$\",\"div\",null,{\"className\":\"flex min-w-0 flex-col gap-y-1 border-t border-line py-3\",\"children\":[[\"$\",\"dt\",null,{\"className\":\"text-[13px] text-muted-foreground\",\"children\":\"Skills\"}],[\"$\",\"dd\",null,{\"className\":\"min-w-0 text-foreground\",\"children\":[\"$\",\"$L13\",null,{\"href\":\"/workers/iii-directory?version=1.2.38\u0026tab=skills\",\"className\":\"text-[16px] font-[550] leading-tight tracking-[-0.02em] tabular-nums transition-colors duration-150 hover:text-brand\",\"children\":\"5\"}]}]]}]\n3c:[\"$\",\"div\",null,{\"className\":\"flex min-w-0 flex-col gap-y-1 border-t border-line py-3\",\"children\":[[\"$\",\"dt\",null,{\"className\":\"text-[13px] text-muted-foreground\",\"children\":\"Dependencies\"}],[\"$\",\"dd\",null,{\"className\":\"min-w-0 text-foreground\",\"children\":[\"$\",\"$L13\",null,{\"href\":\"/workers/iii-directory?version=1.2.38\u0026tab=deps\",\"className\":\"text-[16px] font-[550] leading-tight tracking-[-0.02em] tabular-nums transition-colors duration-150 hover:text-brand\",\"children\":\"1\"}]}]]}]\n3d:[\"$\",\"div\",null,{\"className\":\"flex min-w-0 flex-col gap-y-1 border-t border-line py-3\",\"children\":[[\"$\",\"dt\",null,{\"className\":\"text-[13px] text-muted-foreground\",\"children\":\"Last publish\"}],[\"$\",\"dd\",null,{\"className\":\"min-w-0 text-foreground\",\"children\":[\"$\",\"time\",null,{\"dateTime\":\"2026-10-08T17:14:07.257Z\",\"title\":\"2026-10-08T17:14:07.257Z\",\"className\":\"text-[16px] font-[550] leading-tight tracking-[-0.02em] tabular-nums block truncate\",\"children\":\"11d ago\"}]}]]}]\n"])</script><script>self.__next_f.push([1,"3e:[\"$\",\"div\",null,{\"className\":\"flex min-w-0 flex-col gap-y-1 border-t border-line py-3 col-span-2\",\"children\":[[\"$\",\"dt\",null,{\"className\":\"text-[13px] text-muted-foreground\",\"children\":\"Platforms\"}],[\"$\",\"dd\",null,{\"className\":\"min-w-0 text-foreground\",\"children\":[\"$\",\"ul\",null,{\"aria-label\":\"Supported platforms\",\"className\":\"flex flex-wrap items-center gap-2 mt-1\",\"children\":[[\"$\",\"li\",\"apple\",{\"title\":\"macOS: arm64, x64\",\"className\":\"inline-flex items-center rounded-md border border-line bg-background font-mono text-muted-foreground h-8 gap-x-2 px-2.5 text-[13px]\",\"children\":[[\"$\",\"$L43\",null,{\"src\":\"/registry/icons/apple_dark.svg\",\"alt\":\"\",\"aria-hidden\":true,\"width\":209,\"height\":256,\"className\":\"shrink-0 opacity-80 [filter:brightness(0)] dark:[filter:brightness(0)_invert(1)] h-3.5 w-auto\"}],[\"$\",\"span\",null,{\"className\":\"sr-only\",\"children\":[\"macOS\",\": \"]}],[\"$\",\"span\",null,{\"className\":\"tabular-nums\",\"children\":\"arm64 · x64\"}]]}],[\"$\",\"li\",\"linux\",{\"title\":\"Linux: arm64, armv7, x64\",\"className\":\"inline-flex items-center rounded-md border border-line bg-background font-mono text-muted-foreground h-8 gap-x-2 px-2.5 text-[13px]\",\"children\":[[\"$\",\"$L43\",null,{\"src\":\"/registry/icons/linux.svg\",\"alt\":\"\",\"aria-hidden\":true,\"width\":256,\"height\":295,\"className\":\"shrink-0 opacity-80 [filter:brightness(0)] dark:[filter:brightness(0)_invert(1)] h-3.5 w-auto\"}],[\"$\",\"span\",null,{\"className\":\"sr-only\",\"children\":[\"Linux\",\": \"]}],[\"$\",\"span\",null,{\"className\":\"tabular-nums\",\"children\":\"arm64 · armv7 · x64\"}]]}],[\"$\",\"li\",\"windows\",{\"title\":\"Windows: arm64, x64\",\"className\":\"inline-flex items-center rounded-md border border-line bg-background font-mono text-muted-foreground h-8 gap-x-2 px-2.5 text-[13px]\",\"children\":[[\"$\",\"$L43\",null,{\"src\":\"/registry/icons/windows.svg\",\"alt\":\"\",\"aria-hidden\":true,\"width\":88,\"height\":88,\"className\":\"shrink-0 opacity-80 [filter:brightness(0)] dark:[filter:brightness(0)_invert(1)] h-3.5 w-auto\"}],[\"$\",\"span\",null,{\"className\":\"sr-only\",\"children\":[\"Windows\",\": \"]}],[\"$\",\"span\",null,{\"className\":\"tabular-nums\",\"children\":\"arm64 · x64\"}]]}]]}]}]]}]\n"])</script><script>self.__next_f.push([1,"44:T5da,"])</script><script>self.__next_f.push([1,"M15.5837 10.5577L11.5107 14.6327C11.3697 14.7737 11.1787 14.8527 10.9797 14.8527C10.7807 14.8527 10.5897 14.7737 10.4497 14.6327L8.47274 12.6527C8.18075 12.3587 8.18075 11.8837 8.47375 11.5907C8.76775 11.2987 9.24174 11.2997 9.53475 11.5917L10.9807 13.0407L14.5227 9.49667C14.8157 9.20367 15.2907 9.20367 15.5837 9.49667C15.8767 9.78967 15.8767 10.2647 15.5837 10.5577ZM20.7037 10.0857L20.0047 9.38667C19.6857 9.06667 19.5107 8.64067 19.5107 8.18967V7.18967C19.5107 5.70067 18.2987 4.48967 16.8107 4.48967H15.8087C15.3557 4.48967 14.9307 4.31467 14.6127 3.99667L13.9017 3.28667C12.8447 2.23867 11.1327 2.24367 10.0837 3.29767L9.38674 3.99667C9.06574 4.31567 8.64075 4.49067 8.18875 4.49067H7.18775C5.71675 4.49167 4.51675 5.67567 4.48975 7.14167C4.48874 7.15767 4.48775 7.17367 4.48775 7.19067V8.18767C4.48775 8.63967 4.31275 9.06467 3.99375 9.38367L3.28575 10.0927C3.28475 10.0957 3.28175 10.0967 3.27975 10.0987C2.23475 11.1567 2.24375 12.8687 3.29675 13.9117L3.99575 14.6127C4.31375 14.9317 4.48975 15.3557 4.48975 15.8077V16.8127C4.48975 18.3007 5.69975 19.5117 7.18775 19.5117H8.18675C8.63975 19.5127 9.06475 19.6877 9.38275 20.0047L10.0957 20.7157C10.6037 21.2207 11.2777 21.4987 11.9947 21.4987H12.0067C12.7277 21.4957 13.4037 21.2117 13.9097 20.7027L14.6107 20.0027C14.9257 19.6887 15.3617 19.5087 15.8067 19.5087H16.8127C18.2977 19.5087 19.5087 18.2997 19.5117 16.8127V15.8097C19.5117 15.3587 19.6867 14.9337 20.0037 14.6147L20.7147 13.9037C21.7647 12.8477 21.7587 11.1347 20.7037 10.0857Z"])</script><script>self.__next_f.push([1,"3f:[\"$\",\"div\",null,{\"className\":\"flex min-w-0 flex-col gap-y-1 border-t border-line py-3 col-span-2\",\"children\":[[\"$\",\"dt\",null,{\"className\":\"text-[13px] text-muted-foreground\",\"children\":\"Author\"}],[\"$\",\"dd\",null,{\"className\":\"min-w-0 text-foreground\",\"children\":[\"$\",\"span\",null,{\"className\":\"inline-flex min-w-0 items-center gap-x-2\",\"children\":[[\"$\",\"img\",null,{\"src\":\"https://iii.dev/docs/_mintlify/favicons/motiadev/AFkVbz_UcSL_5jsm/_generated/favicon/apple-touch-icon.png\",\"alt\":\"\",\"className\":\"size-5 shrink-0 rounded-full border border-line object-cover\"}],[\"$\",\"span\",null,{\"className\":\"truncate text-[13px] font-medium text-foreground\",\"children\":\"iii\"}],[\"$\",\"svg\",null,{\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 24 24\",\"width\":\"1em\",\"height\":\"1em\",\"fill\":\"currentColor\",\"focusable\":\"false\",\"aria-hidden\":\"$undefined\",\"className\":\"size-3.5 shrink-0 text-verified\",\"aria-label\":\"Verified author\",\"children\":[\"$\",\"path\",null,{\"fillRule\":\"evenodd\",\"clipRule\":\"evenodd\",\"d\":\"$44\"}]}]]}]}]]}]\n45:T4a7,M5.9199,11.4697 C7.3299,11.4697 8.4599,12.6107 8.4599,14.0307 L8.4599,14.0307 L8.4599,17.4397 C8.4599,18.8497 7.3299,19.9997 5.9199,19.9997 L5.9199,19.9997 L2.5399,19.9997 C1.1399,19.9997 -0.0001,18.8497 -0.0001,17.4397 L-0.0001,17.4397 L-0.0001,14.0307 C-0.0001,12.6107 1.1399,11.4697 2.5399,11.4697 L2.5399,11.4697 Z M17.46,11.4697 C18.86,11.4697 20,12.6107 20,14.0307 L20,14.0307 L20,17.4397 C20,18.8497 18.86,19.9997 17.46,19.9997 L17.46,19.9997 L14.08,19.9997 C12.67,19.9997 11.54,18.8497 11.54,17.4397 L11.54,17.4397 L11.54,14.0307 C11.54,12.6107 12.67,11.4697 14.08,11.4697 L14.08,11.4697 Z M5.9199,-9.32587341e-14 C7.3299,-9.32587341e-14 8.4599,1.15 8.4599,2.561 L8.4599,2.561 L8.4599,5.97 C8.4599,7.39 7.3299,8.53 5.9199,8.53 L5.9199,8.53 L2.5399,8.53 C1.1399,8.53 -0.0001,7.39 -0.0001,5.97 L-0.0001,5.97 L-0.0001,2.561 C-0.0001,1.15 1.1399,-9.32587341e-14 2.5399,-9.32587341e-14 L2.5399,-9.32587341e-14 Z M17.46,-9.32587341e-14 C18.86,-9.32587341e-14 20,1.15 20,2.561 L20,2.561 L20,5.97 C20,7.39 18.86,8.53 17.46,8.53 L17.46,8.53 L14.08,8.53 C12.67,8.53 11.54,7.39 11.54,5.97 L11.54,5.97 L11.54,2.561 C11.54,1.15 12.67,-9.32587341e-14 14.08,-9.32587341e-14 L14.08,-9.32587341e-14 Z"])</script><script>self.__next_f.push([1,"40:[\"$\",\"section\",null,{\"id\":\"used-in-kits\",\"aria-labelledby\":\"used-in-kits-title\",\"className\":\"overflow-hidden rounded-xl border border-line bg-paper scroll-mt-20\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex min-h-11 items-center justify-between gap-x-3 border-b border-line px-4\",\"children\":[\"$\",\"span\",null,{\"id\":\"used-in-kits-title\",\"className\":\"font-mono text-[10px] uppercase tracking-[0.08em] text-muted-foreground\",\"children\":[\"Used in \",1,\" \",\"kit\"]}]}],[\"$\",\"ul\",null,{\"className\":\"flex flex-col p-2\",\"children\":[[\"$\",\"li\",\"iii/deepwork\",{\"children\":[\"$\",\"$L13\",null,{\"href\":\"/kits/iii/deepwork\",\"className\":\"group flex items-start gap-x-3 rounded-lg px-2 py-2 transition-colors duration-150 hover:bg-code focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:outline-brand\",\"children\":[[\"$\",\"span\",null,{\"className\":\"grid size-8 shrink-0 place-items-center rounded-[9px] border border-line bg-background\",\"children\":[\"$\",\"svg\",null,{\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 24 24\",\"width\":\"1em\",\"height\":\"1em\",\"fill\":\"currentColor\",\"focusable\":\"false\",\"aria-hidden\":\"true\",\"className\":\"shrink-0 text-foreground size-3.5\",\"children\":[\"$\",\"g\",null,{\"transform\":\"translate(2 2)\",\"children\":[\"$\",\"path\",null,{\"d\":\"$45\"}]}]}]}],[\"$\",\"span\",null,{\"className\":\"min-w-0 flex flex-col gap-y-0.5\",\"children\":[[\"$\",\"span\",null,{\"className\":\"truncate text-[13px] font-medium text-foreground\",\"children\":[[\"$\",\"span\",null,{\"className\":\"text-muted-foreground\",\"children\":[\"iii\",\"/\"]}],\"deepwork\"]}],[\"$\",\"span\",null,{\"className\":\"font-mono text-[13px] tabular-nums text-muted-foreground\",\"children\":[\"v\",\"0.4.3\",\" · \",6,\" \",\"profiles\"]}]]}]]}]}]]}]]}]\n"])</script><script>self.__next_f.push([1,"41:[\"$\",\"section\",null,{\"id\":\"$undefined\",\"className\":\"shrink-0 overflow-hidden rounded-xl border border-line bg-paper scroll-mt-20\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex min-h-11 items-center justify-between gap-x-3 border-b border-line px-4\",\"children\":[[\"$\",\"span\",null,{\"className\":\"font-mono text-[10px] uppercase tracking-[0.08em] text-muted-foreground\",\"children\":\"api\"}],\"$undefined\"]}],[\"$\",\"div\",null,{\"className\":\"flex flex-col p-0 gap-y-0\",\"children\":[\"$\",\"$L46\",null,{\"slug\":\"iii-directory\",\"version\":\"1.2.38\",\"functions\":[{\"name\":\"directory::__on_worker_added\",\"anchor\":\"fn-directory::__on_worker_added\"},{\"name\":\"directory::agents::create\",\"anchor\":\"fn-directory::agents::create\"},{\"name\":\"directory::agents::delete\",\"anchor\":\"fn-directory::agents::delete\"},{\"name\":\"directory::agents::functions::add\",\"anchor\":\"fn-directory::agents::functions::add\"},{\"name\":\"directory::agents::functions::remove\",\"anchor\":\"fn-directory::agents::functions::remove\"},{\"name\":\"directory::agents::get\",\"anchor\":\"fn-directory::agents::get\"},{\"name\":\"directory::agents::list\",\"anchor\":\"fn-directory::agents::list\"},{\"name\":\"directory::agents::update\",\"anchor\":\"fn-directory::agents::update\"},{\"name\":\"directory::engine::functions::info\",\"anchor\":\"fn-directory::engine::functions::info\"},{\"name\":\"directory::hint-preview\",\"anchor\":\"fn-directory::hint-preview\"},{\"name\":\"directory::on-config-change\",\"anchor\":\"fn-directory::on-config-change\"},{\"name\":\"directory::on-functions-change\",\"anchor\":\"fn-directory::on-functions-change\"},{\"name\":\"directory::pre-generate\",\"anchor\":\"fn-directory::pre-generate\"},{\"name\":\"directory::registry::workers::info\",\"anchor\":\"fn-directory::registry::workers::info\"},{\"name\":\"directory::registry::workers::list\",\"anchor\":\"fn-directory::registry::workers::list\"},{\"name\":\"directory::search_functions\",\"anchor\":\"fn-directory::search_functions\"},{\"name\":\"directory::skills::create\",\"anchor\":\"fn-directory::skills::create\"},{\"name\":\"directory::skills::delete\",\"anchor\":\"fn-directory::skills::delete\"},{\"name\":\"directory::skills::download\",\"anchor\":\"fn-directory::skills::download\"},{\"name\":\"directory::skills::download_from_registry\",\"anchor\":\"fn-directory::skills::download_from_registry\"},{\"name\":\"directory::skills::download_from_repo\",\"anchor\":\"fn-directory::skills::download_from_repo\"},{\"name\":\"directory::skills::get\",\"anchor\":\"fn-directory::skills::get\"},{\"name\":\"directory::skills::index\",\"anchor\":\"fn-directory::skills::index\"},{\"name\":\"directory::skills::list\",\"anchor\":\"fn-directory::skills::list\"},{\"name\":\"directory::skills::update\",\"anchor\":\"fn-directory::skills::update\"},{\"name\":\"directory::system-prompts::create\",\"anchor\":\"fn-directory::system-prompts::create\"},{\"name\":\"directory::system-prompts::delete\",\"anchor\":\"fn-directory::system-prompts::delete\"},{\"name\":\"directory::system-prompts::get\",\"anchor\":\"fn-directory::system-prompts::get\"},{\"name\":\"directory::system-prompts::list\",\"anchor\":\"fn-directory::system-prompts::list\"},{\"name\":\"directory::system-prompts::update\",\"anchor\":\"fn-directory::system-prompts::update\"},{\"name\":\"iii-directory::ui-content\",\"anchor\":\"fn-iii-directory::ui-content\"}],\"triggers\":[{\"name\":\"directory::agents::on-change\",\"anchor\":\"trigger-directory::agents::on-change\"},{\"name\":\"directory::skills::on-change\",\"anchor\":\"trigger-directory::skills::on-change\"},{\"name\":\"directory::system-prompts::on-change\",\"anchor\":\"trigger-directory::system-prompts::on-change\"}]}]}]]}]\n"])</script><script>self.__next_f.push([1,"47:T197b2,"])</script><script>self.__next_f.push([1,"\u003ch1 id=\"iii-directory\" class=\"scroll-mt-20\"\u003eiii-directory\u003c/h1\u003e\n\u003cp\u003eWorkers registry HTTP proxy and filesystem-backed skills, system prompts,\nand agent profiles for the \u003ca href=\"https://github.com/iii-hq/iii\"\u003eiii engine\u003c/a\u003e. Every\npublic function sits under a single \u003ccode class=\"readme-inline-code\"\u003edirectory::*\u003c/code\u003e namespace, split\ninto five surfaces (all MCP-agnostic):\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eSurface\u003c/th\u003e\n\u003cth\u003eWhat clients see\u003c/th\u003e\n\u003cth\u003eWhen to use it\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eSkills\u003c/strong\u003e (\u003ccode class=\"readme-inline-code\"\u003edirectory::skills::*\u003c/code\u003e)\u003c/td\u003e\n\u003ctd\u003eEnriched listing via \u003ccode class=\"readme-inline-code\"\u003edirectory::skills::list\u003c/code\u003e (\u003ccode class=\"readme-inline-code\"\u003e{ id, title, type, function_id, disable_model_invocation, description, bytes, modified_at }\u003c/code\u003e per row), a single-skill reader \u003ccode class=\"readme-inline-code\"\u003edirectory::skills::get { id }\u003c/code\u003e returning \u003ccode class=\"readme-inline-code\"\u003e{ id, title, type, function_id, disable_model_invocation, path, body, modified_at }\u003c/code\u003e (the full body instead of the list teaser), and \u003ccode class=\"readme-inline-code\"\u003edirectory::skills::index\u003c/code\u003e which renders a short per-worker overview document (one \u003ccode class=\"readme-inline-code\"\u003e## \u003ctitle\u003e\u003c/code\u003e + first paragraph + \u003ccode class=\"readme-inline-code\"\u003eread more\u003c/code\u003e link per \u003ccode class=\"readme-inline-code\"\u003etype: index\u003c/code\u003e skill). Authored by \u003ccode class=\"readme-inline-code\"\u003ecreate\u003c/code\u003e, edited by \u003ccode class=\"readme-inline-code\"\u003eupdate\u003c/code\u003e, removed by \u003ccode class=\"readme-inline-code\"\u003edelete\u003c/code\u003e. \u003ccode class=\"readme-inline-code\"\u003etitle\u003c/code\u003e prefers the YAML frontmatter \u003ccode class=\"readme-inline-code\"\u003etitle:\u003c/code\u003e (then \u003ccode class=\"readme-inline-code\"\u003ename:\u003c/code\u003e) over the body H1; \u003ccode class=\"readme-inline-code\"\u003etype\u003c/code\u003e is lifted from frontmatter \u003ccode class=\"readme-inline-code\"\u003etype:\u003c/code\u003e (e.g. \u003ccode class=\"readme-inline-code\"\u003eindex\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003ehow-to\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003ereference\u003c/code\u003e) and serialised as \u003ccode class=\"readme-inline-code\"\u003enull\u003c/code\u003e when absent. System-installed agent skills under the read-only \u003ccode class=\"readme-inline-code\"\u003eagents_skills_folder\u003c/code\u003e are served too (see \u003ca href=\"#on-disk-layout\"\u003eOn-disk layout\u003c/a\u003e).\u003c/td\u003e\n\u003ctd\u003eOrientation: \u0026quot;when and why to use my worker\u0026#39;s tools\u0026quot;\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eSystem prompts\u003c/strong\u003e (\u003ccode class=\"readme-inline-code\"\u003edirectory::system-prompts::*\u003c/code\u003e)\u003c/td\u003e\n\u003ctd\u003eIdentity prompts listed by \u003ccode class=\"readme-inline-code\"\u003elist\u003c/code\u003e, read by \u003ccode class=\"readme-inline-code\"\u003eget\u003c/code\u003e, authored by \u003ccode class=\"readme-inline-code\"\u003ecreate\u003c/code\u003e, edited by \u003ccode class=\"readme-inline-code\"\u003eupdate\u003c/code\u003e, and removed by \u003ccode class=\"readme-inline-code\"\u003edelete\u003c/code\u003e. The list response keeps its \u003ccode class=\"readme-inline-code\"\u003eprompts\u003c/code\u003e field name. Stored under any \u003ccode class=\"readme-inline-code\"\u003esystem-prompts/\u003c/code\u003e path segment; \u003ccode class=\"readme-inline-code\"\u003ecreate\u003c/code\u003e writes \u003ccode class=\"readme-inline-code\"\u003e\u003cskills_folder\u003e/system-prompts/\u003cname\u003e.md\u003c/code\u003e.\u003c/td\u003e\n\u003ctd\u003eWhat the chat\u0026#39;s system-prompt picker offers as an identity prompt (enrich or replace)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eAgent Profiles\u003c/strong\u003e (\u003ccode class=\"readme-inline-code\"\u003edirectory::agents::*\u003c/code\u003e)\u003c/td\u003e\n\u003ctd\u003eReusable session identities whose file body is the system prompt, with display \u003ccode class=\"readme-inline-code\"\u003ename\u003c/code\u003e, emoji \u003ccode class=\"readme-inline-code\"\u003elogo\u003c/code\u003e, preloaded \u003ccode class=\"readme-inline-code\"\u003eskills\u003c/code\u003e and \u003ccode class=\"readme-inline-code\"\u003efunctions\u003c/code\u003e (bodies and contracts the harness freezes into every session\u0026#39;s prompt), and optional \u003ccode class=\"readme-inline-code\"\u003emodel\u003c/code\u003e + \u003ccode class=\"readme-inline-code\"\u003ereasoning_effort\u003c/code\u003e in required frontmatter. \u003ccode class=\"readme-inline-code\"\u003elist\u003c/code\u003e rows carry the display/configuration metadata and \u003ccode class=\"readme-inline-code\"\u003eget\u003c/code\u003e adds \u003ccode class=\"readme-inline-code\"\u003esystem_prompt\u003c/code\u003e and \u003ccode class=\"readme-inline-code\"\u003eunknown_skills\u003c/code\u003e. Stored as direct \u003ccode class=\"readme-inline-code\"\u003e\u003cagents_folder\u003e/\u003cid\u003e.md\u003c/code\u003e files. See \u003ca href=\"../docs/architecture/agent-profile-storage.md\"\u003eAgent profile storage\u003c/a\u003e.\u003c/td\u003e\n\u003ctd\u003eA named identity selected with \u003ccode class=\"readme-inline-code\"\u003eharness::send { options: { agent } }\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eSearch\u003c/strong\u003e (\u003ccode class=\"readme-inline-code\"\u003edirectory::search_functions\u003c/code\u003e)\u003c/td\u003e\n\u003ctd\u003eOne to six external capabilities → compact function-id candidates (installed, plus registry workers under \u003ccode class=\"readme-inline-code\"\u003einstallable\u003c/code\u003e), with a conditional pre-generate hint pointing agents at it. The response also carries \u003ccode class=\"readme-inline-code\"\u003eskills\u003c/code\u003e (installed how-to documents) and \u003ccode class=\"readme-inline-code\"\u003etriggers\u003c/code\u003e (registered bindings that already fire, schedule, or hook a function, minus ephemeral console listeners), ranked in the same mode as the functions; \u003ccode class=\"readme-inline-code\"\u003esearch_mode\u003c/code\u003e reports the mode that actually ranked.\u003c/td\u003e\n\u003ctd\u003e\u0026quot;Which functions do I call for this task?\u0026quot;\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eRegistry\u003c/strong\u003e (\u003ccode class=\"readme-inline-code\"\u003edirectory::registry::*\u003c/code\u003e)\u003c/td\u003e\n\u003ctd\u003eHTTP proxy over \u003ccode class=\"readme-inline-code\"\u003eapi.workers.iii.dev\u003c/code\u003e with \u003ccode class=\"readme-inline-code\"\u003eworkers::{list,info}\u003c/code\u003e. Rows share the core \u003ccode class=\"readme-inline-code\"\u003ename\u003c/code\u003e / \u003ccode class=\"readme-inline-code\"\u003edescription\u003c/code\u003e / \u003ccode class=\"readme-inline-code\"\u003eversion\u003c/code\u003e fields with the engine\u0026#39;s \u003ccode class=\"readme-inline-code\"\u003eengine::workers::list\u003c/code\u003e and add publication metadata (\u003ccode class=\"readme-inline-code\"\u003etype\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003econfig\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003esupported_targets\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003etotal_downloads\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003edependencies\u003c/code\u003e, optional \u003ccode class=\"readme-inline-code\"\u003eimage\u003c/code\u003e). \u003ccode class=\"readme-inline-code\"\u003eworkers::list\u003c/code\u003e is cursor-paginated with a server-authored page size.\u003c/td\u003e\n\u003ctd\u003e\u0026quot;What\u0026#39;s published in the public registry?\u0026quot;\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\u003cp\u003eEngine introspection (functions / triggers / registered triggers /\nworkers) is served by the engine natively at\n\u003ccode class=\"readme-inline-code\"\u003eengine::functions::*\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003eengine::triggers::*\u003c/code\u003e,\n\u003ccode class=\"readme-inline-code\"\u003eengine::registered-triggers::*\u003c/code\u003e, and \u003ccode class=\"readme-inline-code\"\u003eengine::workers::*\u003c/code\u003e. Call the\nengine ids directly. One wrapper survives for callers that can only\nreach the \u003ccode class=\"readme-inline-code\"\u003edirectory::\u003c/code\u003e namespace: \u003ccode class=\"readme-inline-code\"\u003edirectory::engine::functions::info\u003c/code\u003e\nproxies a single function\u0026#39;s schema (see its row below).\u003c/p\u003e\n\u003cp\u003eThis worker is where an agent\u0026#39;s identity text LIVES. \u003ccode class=\"readme-inline-code\"\u003eskills/system-prompts/iii-runtime.md\u003c/code\u003e\nships here and is the one copy of \u0026quot;how to work against a live iii engine\u0026quot; —\n\u003ccode class=\"readme-inline-code\"\u003eclaude-code\u003c/code\u003e and \u003ccode class=\"readme-inline-code\"\u003epi\u003c/code\u003e fetch it with \u003ccode class=\"readme-inline-code\"\u003edirectory::system-prompts::get name=iii-runtime\u003c/code\u003e (plus \u003ccode class=\"readme-inline-code\"\u003edirectory::skills::index\u003c/code\u003e) for both their headless\nturns and their console terminals, rather than compiling a prompt of their own.\nEdit that file and every agent reads the edit; no worker release involved.\u003c/p\u003e\n\u003cp\u003eSkills and system prompts are sourced from \u003ccode class=\"readme-inline-code\"\u003eskills_folder\u003c/code\u003e; agent profiles\nuse the dedicated \u003ccode class=\"readme-inline-code\"\u003eagents_folder\u003c/code\u003e. Writes are the\n\u003cstrong\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::skills::download*\u003c/code\u003e\u003c/strong\u003e functions, which pull markdown from either\nthe \u003ca href=\"https://workers.iii.dev\"\u003eworkers registry\u003c/a\u003e or a GitHub repo and route each\nsupported family to its configured root, plus the\nper-kind single-file editors — \u003ccode class=\"readme-inline-code\"\u003edirectory::skills::{create,update,delete}\u003c/code\u003e,\n\u003ccode class=\"readme-inline-code\"\u003edirectory::system-prompts::{create,update,delete}\u003c/code\u003e and\n\u003ccode class=\"readme-inline-code\"\u003edirectory::agents::{create,update,delete}\u003c/code\u003e. Once downloaded, files\nbelong to the developer — edit them however you want, in the editor of\nyour choice: a change made directly on disk fires the matching\n\u003ccode class=\"readme-inline-code\"\u003eon-change\u003c/code\u003e with \u003ccode class=\"readme-inline-code\"\u003eop: \"external\"\u003c/code\u003e (see \u003ca href=\"#custom-trigger-types\"\u003eCustom trigger\ntypes\u003c/a\u003e).\u003c/p\u003e\n\u003cp\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::registry::workers::*\u003c/code\u003e and the engine\u0026#39;s \u003ccode class=\"readme-inline-code\"\u003eengine::workers::*\u003c/code\u003e\nshare the core \u003ccode class=\"readme-inline-code\"\u003ename\u003c/code\u003e / \u003ccode class=\"readme-inline-code\"\u003edescription\u003c/code\u003e / \u003ccode class=\"readme-inline-code\"\u003eversion\u003c/code\u003e fields so a parser\nthat touches only those keys works against either surface; the\nregistry view also surfaces publication metadata (\u003ccode class=\"readme-inline-code\"\u003etype\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003econfig\u003c/code\u003e,\n\u003ccode class=\"readme-inline-code\"\u003esupported_targets\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003etotal_downloads\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003edependencies\u003c/code\u003e, optional\n\u003ccode class=\"readme-inline-code\"\u003eimage\u003c/code\u003e) and the engine view adds runtime / connection state.\u003c/p\u003e\n\u003ch2 id=\"table-of-contents\" class=\"scroll-mt-20\"\u003eTable of contents\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"#install\"\u003eInstall\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#configuration\"\u003eConfiguration\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#quickstart-download-some-skills\"\u003eQuickstart: download some skills\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#on-disk-layout\"\u003eOn-disk layout\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#skill-ids\"\u003eSkill ids\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#functions\"\u003eFunctions\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#function-search--pre-generate-hint\"\u003eFunction search \u0026amp; pre-generate hint\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#custom-trigger-types\"\u003eCustom trigger types\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#local-development--testing\"\u003eLocal development \u0026amp; testing\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#migration-from-skills-v02x\"\u003eMigration from skills v0.2.x\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch2 id=\"install\" class=\"scroll-mt-20\"\u003eInstall\u003c/h2\u003e\n\u003cpre class=\"shiki shiki-themes min-light vesper\" style=\"--shiki-light:#24292eff;--shiki-dark:#FFF;--shiki-light-bg:#ffffff;--shiki-dark-bg:#101010\" tabindex=\"0\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#FFC799\"\u003eiii\u003c/span\u003e\u003cspan style=\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\"\u003e trigger\u003c/span\u003e\u003cspan style=\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\"\u003e compose::add\u003c/span\u003e\u003cspan style=\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\"\u003e worker=iii-directory\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ccode class=\"readme-inline-code\"\u003eiii trigger compose::add\u003c/code\u003e resolves the worker and its dependencies, writes\nexact declarations to \u003ccode class=\"readme-inline-code\"\u003eworker-compose.yaml\u003c/code\u003e, and reconciles the Compose project.\u003c/p\u003e\n\u003cp\u003eFor container settings, fetch \u003ccode class=\"readme-inline-code\"\u003ecompose::schema { function_id: \"compose::add\" }\u003c/code\u003e and use\nits \u003ccode class=\"readme-inline-code\"\u003eworkers\u003c/code\u003e list. For example, after registering the completion wake described below:\u003c/p\u003e\n\u003cpre class=\"shiki shiki-themes min-light vesper\" style=\"--shiki-light:#24292eff;--shiki-dark:#FFF;--shiki-light-bg:#ffffff;--shiki-dark-bg:#101010\" tabindex=\"0\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#24292EFF;--shiki-dark:#FFF\"\u003e{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFC799\"\u003e \"operation_id\"\u003c/span\u003e\u003cspan style=\"--shiki-light:#212121;--shiki-dark:#FFF\"\u003e:\u003c/span\u003e\u003cspan style=\"--shiki-light:#22863A;--shiki-dark:#99FFE4\"\u003e \"\u0026#x3C;operation-id\u003e\"\u003c/span\u003e\u003cspan style=\"--shiki-light:#212121;--shiki-dark:#FFF\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFC799\"\u003e \"workers\"\u003c/span\u003e\u003cspan style=\"--shiki-light:#212121;--shiki-dark:#FFF\"\u003e:\u003c/span\u003e\u003cspan style=\"--shiki-light:#24292EFF;--shiki-dark:#FFF\"\u003e [\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#22863A;--shiki-dark:#99FFE4\"\u003e \"state\"\u003c/span\u003e\u003cspan style=\"--shiki-light:#212121;--shiki-dark:#FFF\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#24292EFF;--shiki-dark:#FFF\"\u003e {\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFC799\"\u003e \"worker\"\u003c/span\u003e\u003cspan style=\"--shiki-light:#212121;--shiki-dark:#FFF\"\u003e:\u003c/span\u003e\u003cspan style=\"--shiki-light:#22863A;--shiki-dark:#99FFE4\"\u003e \"iii-directory\"\u003c/span\u003e\u003cspan style=\"--shiki-light:#212121;--shiki-dark:#FFF\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFC799\"\u003e \"start_after\"\u003c/span\u003e\u003cspan style=\"--shiki-light:#212121;--shiki-dark:#FFF\"\u003e:\u003c/span\u003e\u003cspan style=\"--shiki-light:#24292EFF;--shiki-dark:#FFF\"\u003e [\u003c/span\u003e\u003cspan style=\"--shiki-light:#22863A;--shiki-dark:#99FFE4\"\u003e\"state\"\u003c/span\u003e\u003cspan style=\"--shiki-light:#24292EFF;--shiki-dark:#FFF\"\u003e]\u003c/span\u003e\u003cspan style=\"--shiki-light:#212121;--shiki-dark:#FFF\"\u003e,\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFC799\"\u003e \"config_override\"\u003c/span\u003e\u003cspan style=\"--shiki-light:#212121;--shiki-dark:#FFF\"\u003e:\u003c/span\u003e\u003cspan style=\"--shiki-light:#24292EFF;--shiki-dark:#FFF\"\u003e { \u003c/span\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFC799\"\u003e\"registry_search\"\u003c/span\u003e\u003cspan style=\"--shiki-light:#212121;--shiki-dark:#FFF\"\u003e:\u003c/span\u003e\u003cspan style=\"--shiki-light:#1976D2;--shiki-dark:#FFF\"\u003e true\u003c/span\u003e\u003cspan style=\"--shiki-light:#24292EFF;--shiki-dark:#FFF\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#24292EFF;--shiki-dark:#FFF\"\u003e }\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#24292EFF;--shiki-dark:#FFF\"\u003e ]\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#24292EFF;--shiki-dark:#FFF\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe list can mix worker names and objects. Each object accepts \u003ccode class=\"readme-inline-code\"\u003escripts\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003econfig_name\u003c/code\u003e,\n\u003ccode class=\"readme-inline-code\"\u003econfig_override\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003eworking_dir\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003eenvironment\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003eenv_file\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003estartup_timeout\u003c/code\u003e, and\npackage \u003ccode class=\"readme-inline-code\"\u003eversion\u003c/code\u003e as well as \u003ccode class=\"readme-inline-code\"\u003eworker\u003c/code\u003e and \u003ccode class=\"readme-inline-code\"\u003estart_after\u003c/code\u003e. \u003ccode class=\"readme-inline-code\"\u003escripts.run\u003c/code\u003e is for local\nworkers only. Supplied maps replace the whole field; omitted settings are retained.\u003c/p\u003e\n\u003cp\u003eThe returned \u003ccode class=\"readme-inline-code\"\u003einstall.payload\u003c/code\u003e from function search is a minimal shorthand. If the worker\nneeds settings, replace its singular \u003ccode class=\"readme-inline-code\"\u003eworker\u003c/code\u003e with an object in \u003ccode class=\"readme-inline-code\"\u003eworkers\u003c/code\u003e.\nRegister a one-shot \u003ccode class=\"readme-inline-code\"\u003ecompose-operation\u003c/code\u003e wake before calling \u003ccode class=\"readme-inline-code\"\u003ecompose::add\u003c/code\u003e, use the same\n\u003ccode class=\"readme-inline-code\"\u003eoperation_id\u003c/code\u003e in both calls, and wait for terminal success before using the new functions.\nAn acceptance response does not mean the worker is ready. See the\n\u003ca href=\"https://github.com/iii-hq/workers/blob/main/harness/README.md#adding-workers-with-container-settings\"\u003econtainer settings example and completion flow\u003c/a\u003e\nfor field behavior, path resolution, and recovery.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"skills\" class=\"scroll-mt-20\"\u003eSkills\u003c/h2\u003e\n\u003cp\u003eInstall the \u003ccode class=\"readme-inline-code\"\u003eiii-directory\u003c/code\u003e agent skill for Claude Code, Cursor, and 30+ other agents:\u003c/p\u003e\n\u003cpre class=\"shiki shiki-themes min-light vesper\" style=\"--shiki-light:#24292eff;--shiki-dark:#FFF;--shiki-light-bg:#ffffff;--shiki-dark-bg:#101010\" tabindex=\"0\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#FFC799\"\u003enpx\u003c/span\u003e\u003cspan style=\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\"\u003e skills\u003c/span\u003e\u003cspan style=\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\"\u003e add\u003c/span\u003e\u003cspan style=\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\"\u003e iii-hq/workers\u003c/span\u003e\u003cspan style=\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\"\u003e --skill\u003c/span\u003e\u003cspan style=\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\"\u003e iii-directory\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eBrowse or install every worker skill at once:\u003c/p\u003e\n\u003cpre class=\"shiki shiki-themes min-light vesper\" style=\"--shiki-light:#24292eff;--shiki-dark:#FFF;--shiki-light-bg:#ffffff;--shiki-dark-bg:#101010\" tabindex=\"0\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#FFC799\"\u003enpx\u003c/span\u003e\u003cspan style=\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\"\u003e skills\u003c/span\u003e\u003cspan style=\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\"\u003e add\u003c/span\u003e\u003cspan style=\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\"\u003e iii-hq/workers\u003c/span\u003e\u003cspan style=\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\"\u003e --list\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#FFC799\"\u003enpx\u003c/span\u003e\u003cspan style=\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\"\u003e skills\u003c/span\u003e\u003cspan style=\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\"\u003e add\u003c/span\u003e\u003cspan style=\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\"\u003e iii-hq/workers\u003c/span\u003e\u003cspan style=\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\"\u003e --all\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"configuration\" class=\"scroll-mt-20\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eRuntime settings live in the \u003cstrong\u003e\u003ccode class=\"readme-inline-code\"\u003econfiguration\u003c/code\u003e worker\u003c/strong\u003e under id\n\u003cstrong\u003e\u003ccode class=\"readme-inline-code\"\u003eiii-directory\u003c/code\u003e\u003c/strong\u003e (the same pattern \u003ccode class=\"readme-inline-code\"\u003edatabase\u003c/code\u003e and \u003ccode class=\"readme-inline-code\"\u003estorage\u003c/code\u003e use). At boot\nthe worker registers its JSON Schema, reads the live value via\n\u003ccode class=\"readme-inline-code\"\u003econfiguration::get\u003c/code\u003e (the configuration worker env-expands \u003ccode class=\"readme-inline-code\"\u003e${VAR}\u003c/code\u003e), and binds\na \u003ccode class=\"readme-inline-code\"\u003econfiguration\u003c/code\u003e trigger so it re-fetches on change.\u003c/p\u003e\n\u003cp\u003ePersisted values default to \u003ccode class=\"readme-inline-code\"\u003e./data/configuration/iii-directory.yaml\u003c/code\u003e (fs\nadapter). Edit that file directly, call \u003ccode class=\"readme-inline-code\"\u003econfiguration::set id=iii-directory\u003c/code\u003e,\nor use the Console\u0026#39;s global Settings modal — all three propagate without a redeploy.\u003c/p\u003e\n\u003ch3 id=\"fields\" class=\"scroll-mt-20\"\u003eFields\u003c/h3\u003e\n\u003cpre class=\"shiki shiki-themes min-light vesper\" style=\"--shiki-light:#24292eff;--shiki-dark:#FFF;--shiki-light-bg:#ffffff;--shiki-dark-bg:#101010\" tabindex=\"0\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94\"\u003e# TOPOLOGY — changing any of these requires a worker restart.\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFC799\"\u003eskills_folder\u003c/span\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFF\"\u003e:\u003c/span\u003e\u003cspan style=\"--shiki-light:#22863A;--shiki-dark:#99FFE4\"\u003e skills\u003c/span\u003e\u003cspan style=\"--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94\"\u003e # under III_COMPOSE_DIR, or the process cwd standalone\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFC799\"\u003elocal_skills_folder\u003c/span\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFF\"\u003e:\u003c/span\u003e\u003cspan style=\"--shiki-light:#22863A;--shiki-dark:#99FFE4\"\u003e skills/iii\u003c/span\u003e\u003cspan style=\"--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94\"\u003e # project-scoped overrides (whole-namespace local-wins)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFC799\"\u003eagents_folder\u003c/span\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFF\"\u003e:\u003c/span\u003e\u003cspan style=\"--shiki-light:#22863A;--shiki-dark:#99FFE4\"\u003e agents\u003c/span\u003e\u003cspan style=\"--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94\"\u003e # direct \u0026#x3C;id\u003e.md agent profiles\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFC799\"\u003eagents_skills_folder\u003c/span\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFF\"\u003e:\u003c/span\u003e\u003cspan style=\"--shiki-light:#22863A;--shiki-dark:#99FFE4\"\u003e .agents/skills\u003c/span\u003e\u003cspan style=\"--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94\"\u003e # READ-ONLY agent skills, with the same relative-path base\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFC799\"\u003eauto_download\u003c/span\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFF\"\u003e:\u003c/span\u003e\u003cspan style=\"--shiki-light:#1976D2;--shiki-dark:#FFC799\"\u003e true\u003c/span\u003e\u003cspan style=\"--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94\"\u003e # subscribe to worker-add + run the boot reconcile\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94\"\u003e# function_search_model_path: ~/.cache/iii/all-MiniLM-L6-v2-\u0026#x3C;revision\u003e # pinned Hybrid bundle; null disables it\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFC799\"\u003efunction_search_model_download\u003c/span\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFF\"\u003e:\u003c/span\u003e\u003cspan style=\"--shiki-light:#1976D2;--shiki-dark:#FFC799\"\u003e true\u003c/span\u003e\u003cspan style=\"--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94\"\u003e # download the pinned bundle at boot in Hybrid mode\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94\"\u003e# TUNABLE — hot-reload live on `configuration:updated`.\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFC799\"\u003eregistry_url\u003c/span\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFF\"\u003e:\u003c/span\u003e\u003cspan style=\"--shiki-light:#22863A;--shiki-dark:#99FFE4\"\u003e https://api.workers.iii.dev\u003c/span\u003e\u003cspan style=\"--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94\"\u003e # workers registry base URL\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFC799\"\u003edownload_timeout_ms\u003c/span\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFF\"\u003e:\u003c/span\u003e\u003cspan style=\"--shiki-light:#1976D2;--shiki-dark:#FFC799\"\u003e 60000\u003c/span\u003e\u003cspan style=\"--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94\"\u003e # per git-clone / HTTP request timeout (ms)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFC799\"\u003eregistry_cache_ttl_ms\u003c/span\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFF\"\u003e:\u003c/span\u003e\u003cspan style=\"--shiki-light:#1976D2;--shiki-dark:#FFC799\"\u003e 60000\u003c/span\u003e\u003cspan style=\"--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94\"\u003e # in-process TTL for registry::workers::* responses\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFC799\"\u003efilter_unregistered\u003c/span\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFF\"\u003e:\u003c/span\u003e\u003cspan style=\"--shiki-light:#1976D2;--shiki-dark:#FFC799\"\u003e true\u003c/span\u003e\u003cspan style=\"--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94\"\u003e # hide skills whose namespace isn't an installed worker\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFC799\"\u003einject_hint\u003c/span\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFF\"\u003e:\u003c/span\u003e\u003cspan style=\"--shiki-light:#1976D2;--shiki-dark:#FFC799\"\u003e false\u003c/span\u003e\u003cspan style=\"--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94\"\u003e # bind the directory::pre-generate search-hint hook (off: the harness identity prompt already teaches directory-first discovery)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFC799\"\u003ehint_min_workers\u003c/span\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFF\"\u003e:\u003c/span\u003e\u003cspan style=\"--shiki-light:#1976D2;--shiki-dark:#FFC799\"\u003e 2\u003c/span\u003e\u003cspan style=\"--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94\"\u003e # minimum surface width before the hint fires (0 = always)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFC799\"\u003eregistry_search\u003c/span\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFF\"\u003e:\u003c/span\u003e\u003cspan style=\"--shiki-light:#1976D2;--shiki-dark:#FFC799\"\u003e true\u003c/span\u003e\u003cspan style=\"--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94\"\u003e # include installable registry workers in every search\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFC799\"\u003efunction_search_mode\u003c/span\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFF\"\u003e:\u003c/span\u003e\u003cspan style=\"--shiki-light:#22863A;--shiki-dark:#99FFE4\"\u003e judge\u003c/span\u003e\u003cspan style=\"--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94\"\u003e # lexical | hybrid | judge (default)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFC799\"\u003efunction_search_judge_timeout_ms\u003c/span\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFF\"\u003e:\u003c/span\u003e\u003cspan style=\"--shiki-light:#1976D2;--shiki-dark:#FFC799\"\u003e 3000\u003c/span\u003e\u003cspan style=\"--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94\"\u003e # integer 1..30000; shared judge deadline per public search\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFC799\"\u003efunction_search_judge_min_relevance\u003c/span\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFF\"\u003e:\u003c/span\u003e\u003cspan style=\"--shiki-light:#1976D2;--shiki-dark:#FFC799\"\u003e 0.5\u003c/span\u003e\u003cspan style=\"--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94\"\u003e # finite 0..1 inclusive; noul floor (initial calibration value)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFC799\"\u003efunction_search_judge_side_lane_min_relevance\u003c/span\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFF\"\u003e:\u003c/span\u003e\u003cspan style=\"--shiki-light:#1976D2;--shiki-dark:#FFC799\"\u003e 0.3\u003c/span\u003e\u003cspan style=\"--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94\"\u003e # finite 0..1 inclusive; noul floor for the skills and triggers sections\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFC799\"\u003efunction_search_judge_question\u003c/span\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFF\"\u003e:\u003c/span\u003e\u003cspan style=\"--shiki-light:#22863A;--shiki-dark:#99FFE4\"\u003e choice\u003c/span\u003e\u003cspan style=\"--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94\"\u003e # choice (default: one question per capability) | noul (one yes/no per shortlisted document) | tournament (whole catalog: compact rounds, then a final choice; no Hybrid shortlist)\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFC799\"\u003efunction_search_judge_choice_min_probability\u003c/span\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFF\"\u003e:\u003c/span\u003e\u003cspan style=\"--shiki-light:#1976D2;--shiki-dark:#FFC799\"\u003e 0.1\u003c/span\u003e\u003cspan style=\"--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94\"\u003e # finite 0..1 inclusive; with choice, the floor for all but the best document\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe writable \u003ccode class=\"readme-inline-code\"\u003eskills_folder\u003c/code\u003e and \u003ccode class=\"readme-inline-code\"\u003eagents_folder\u003c/code\u003e roots are created when needed.\u003c/p\u003e\n\u003ch3 id=\"zero-config-default-seed\" class=\"scroll-mt-20\"\u003eZero-config default + seed\u003c/h3\u003e\n\u003cp\u003eWith no seed and no stored value the worker uses built-in defaults. Relative\nfolder paths use \u003ccode class=\"readme-inline-code\"\u003eIII_COMPOSE_DIR\u003c/code\u003e when set and the process current directory\notherwise (\u003ccode class=\"readme-inline-code\"\u003eskills_folder: skills\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003eagents_folder: agents\u003c/code\u003e,\n\u003ccode class=\"readme-inline-code\"\u003eregistry_url: https://api.workers.iii.dev\u003c/code\u003e).\nPass \u003ccode class=\"readme-inline-code\"\u003e--config \u003cpath\u003e\u003c/code\u003e to supply a YAML seed: when present and no value is\nstored yet, its contents become \u003ccode class=\"readme-inline-code\"\u003einitial_value\u003c/code\u003e on \u003ccode class=\"readme-inline-code\"\u003econfiguration::register\u003c/code\u003e\n(see \u003ca href=\"config.yaml.example\"\u003e\u003ccode class=\"readme-inline-code\"\u003econfig.yaml.example\u003c/code\u003e\u003c/a\u003e). Engine-managed deployments\ninline the config under the worker entry; the engine delivers it via \u003ccode class=\"readme-inline-code\"\u003e--config\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"hot-reload\" class=\"scroll-mt-20\"\u003eHot reload\u003c/h3\u003e\n\u003cp\u003eOn \u003ccode class=\"readme-inline-code\"\u003econfiguration::set\u003c/code\u003e (or an external edit to the persisted file), the worker\nre-fetches the authoritative value. Tunable changes apply in place and the\nregistry caches are cleared so a repointed \u003ccode class=\"readme-inline-code\"\u003eregistry_url\u003c/code\u003e takes effect\nimmediately. Topology changes (\u003ccode class=\"readme-inline-code\"\u003eskills_folder\u003c/code\u003e / \u003ccode class=\"readme-inline-code\"\u003elocal_skills_folder\u003c/code\u003e /\n\u003ccode class=\"readme-inline-code\"\u003eagents_folder\u003c/code\u003e / \u003ccode class=\"readme-inline-code\"\u003eagents_skills_folder\u003c/code\u003e / \u003ccode class=\"readme-inline-code\"\u003eauto_download\u003c/code\u003e /\n\u003ccode class=\"readme-inline-code\"\u003efunction_search_model_path\u003c/code\u003e / \u003ccode class=\"readme-inline-code\"\u003efunction_search_model_download\u003c/code\u003e) are refused with a \u0026quot;restart\nrequired\u0026quot; log; the previous configuration is kept until the worker restarts.\u003c/p\u003e\n\u003cp\u003e\u003ccode class=\"readme-inline-code\"\u003efunction_search_mode\u003c/code\u003e and all \u003ccode class=\"readme-inline-code\"\u003efunction_search_judge_*\u003c/code\u003e options hot-reload.\nJudge credentials and the model name are the \u003ccode class=\"readme-inline-code\"\u003ejudge-typesafe\u003c/code\u003e worker\u0026#39;s\nsettings, not this worker\u0026#39;s.\u003c/p\u003e\n\u003cp\u003eThe writable \u003ccode class=\"readme-inline-code\"\u003eskills_folder\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003elocal_skills_folder\u003c/code\u003e, and \u003ccode class=\"readme-inline-code\"\u003eagents_folder\u003c/code\u003e are\nwatch roots, and the watcher creates each one at boot if it is missing.\nDirect \u003ccode class=\"readme-inline-code\"\u003e\u003cid\u003e.md\u003c/code\u003e edits under \u003ccode class=\"readme-inline-code\"\u003eagents_folder\u003c/code\u003e fire\n\u003ccode class=\"readme-inline-code\"\u003edirectory::agents::on-change\u003c/code\u003e with \u003ccode class=\"readme-inline-code\"\u003eop: \"external\"\u003c/code\u003e; nested files are ignored.\n\u003ccode class=\"readme-inline-code\"\u003eagents_skills_folder\u003c/code\u003e is a watch root too,\nbut only when it already exists — the worker never creates (or writes)\nanything under it. Install your first agents skill while the worker is\nrunning and that root stays unwatched until the next restart: reads still\nserve it, since every read re-scans disk, but the live \u003ccode class=\"readme-inline-code\"\u003eexternal\u003c/code\u003e doorbell\nis missing until then. \u003ccode class=\"readme-inline-code\"\u003elocal_skills_folder\u003c/code\u003e defaults to \u003ccode class=\"readme-inline-code\"\u003eskills/iii\u003c/code\u003e under\n\u003ccode class=\"readme-inline-code\"\u003eIII_COMPOSE_DIR\u003c/code\u003e, or under the process current directory when the worker runs\nstandalone. An empty local root shadows nothing. Because the roots are\nrestart-required, the watch\nroots are fixed for the process lifetime.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"quickstart-download-some-skills\" class=\"scroll-mt-20\"\u003eQuickstart: download some skills\u003c/h2\u003e\n\u003cpre class=\"shiki shiki-themes min-light vesper\" style=\"--shiki-light:#24292eff;--shiki-dark:#FFF;--shiki-light-bg:#ffffff;--shiki-dark-bg:#101010\" tabindex=\"0\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94\"\u003e# Pull a specific worker's directory bundle at a fixed semver from\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94\"\u003e# the registry. Files land under `\u0026#x3C;skills_folder\u003e/agent-memory/`.\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#FFC799\"\u003eiii\u003c/span\u003e\u003cspan style=\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\"\u003e trigger\u003c/span\u003e\u003cspan style=\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\"\u003e --function-id=directory::skills::download\u003c/span\u003e\u003cspan style=\"--shiki-light:#24292EFF;--shiki-dark:#A0A0A0\"\u003e \\\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\"\u003e --payload=\u003c/span\u003e\u003cspan style=\"--shiki-light:#22863A;--shiki-dark:#99FFE4\"\u003e'{\"worker\": \"agent-memory\", \"version\": \"1.2.3\"}'\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94\"\u003e# Same, but always fetch whatever's tagged `latest` (also the default\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94\"\u003e# when neither version nor tag is given).\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#FFC799\"\u003eiii\u003c/span\u003e\u003cspan style=\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\"\u003e trigger\u003c/span\u003e\u003cspan style=\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\"\u003e --function-id=directory::skills::download\u003c/span\u003e\u003cspan style=\"--shiki-light:#24292EFF;--shiki-dark:#A0A0A0\"\u003e \\\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\"\u003e --payload=\u003c/span\u003e\u003cspan style=\"--shiki-light:#22863A;--shiki-dark:#99FFE4\"\u003e'{\"worker\": \"agent-memory\"}'\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94\"\u003e# Pull a single subfolder out of a public GitHub repo via\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94\"\u003e# `git clone --depth 1 --branch main`. Files land under\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94\"\u003e# `\u0026#x3C;skills_folder\u003e/frontend-design/`. The `branch` field defaults to\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94\"\u003e# `main`; pass `\"master\"` for older repos that haven't migrated.\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#FFC799\"\u003eiii\u003c/span\u003e\u003cspan style=\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\"\u003e trigger\u003c/span\u003e\u003cspan style=\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\"\u003e --function-id=directory::skills::download\u003c/span\u003e\u003cspan style=\"--shiki-light:#24292EFF;--shiki-dark:#A0A0A0\"\u003e \\\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\"\u003e --payload=\u003c/span\u003e\u003cspan style=\"--shiki-light:#22863A;--shiki-dark:#99FFE4\"\u003e'{\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#22863A;--shiki-dark:#99FFE4\"\u003e \"repo\": \"https://github.com/anthropics/skills\",\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#22863A;--shiki-dark:#99FFE4\"\u003e \"skill\": \"frontend-design\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#22863A;--shiki-dark:#99FFE4\"\u003e }'\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe response is\n\u003ccode class=\"readme-inline-code\"\u003e{ namespace, skills_written, system_prompts_written, agents_written, source }\u003c/code\u003e.\nThe three \u003ccode class=\"readme-inline-code\"\u003e*_written\u003c/code\u003e fields list the files materialised in this run.\nRegistry entries shaped exactly as \u003ccode class=\"readme-inline-code\"\u003eagents/\u003cid\u003e.md\u003c/code\u003e land in\n\u003ccode class=\"readme-inline-code\"\u003e\u003cagents_folder\u003e/\u003cid\u003e.md\u003c/code\u003e; repo downloads do not install agent profiles.\u003c/p\u003e\n\u003cp\u003eAfter every successful download the worker fires the\n\u003ccode class=\"readme-inline-code\"\u003edirectory::skills::on-change\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003edirectory::system-prompts::on-change\u003c/code\u003e,\nand/or \u003ccode class=\"readme-inline-code\"\u003edirectory::agents::on-change\u003c/code\u003e trigger types so that\nsubscribers like the \u003ca href=\"https://github.com/iii-hq/workers/tree/main/mcp\"\u003e\u003ccode class=\"readme-inline-code\"\u003emcp\u003c/code\u003e\u003c/a\u003e worker can\nforward MCP \u003ccode class=\"readme-inline-code\"\u003enotifications/list_changed\u003c/code\u003e to their clients.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"on-disk-layout\" class=\"scroll-mt-20\"\u003eOn-disk layout\u003c/h2\u003e\n\u003cp\u003eThe worker uses separate roots for directory content and agent profiles:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eskills_folder/\n \u0026lt;namespace\u0026gt;/ # one folder per `directory::skills::download` namespace\n index.md # → iii://\u0026lt;namespace\u0026gt;/index\n contacts.md # → iii://\u0026lt;namespace\u0026gt;/contacts\n emails/send-email.md # → iii://\u0026lt;namespace\u0026gt;/emails/send-email\n system-prompts/ # ← magic marker for system prompts\n reviewer.md # ← identity prompt (needs YAML frontmatter)\n system-prompts/ # ← where system-prompts::create writes\n pirate.md\n\nagents_folder/ # ← where agents::create writes\n release-captain.md # ← agent profile (needs YAML frontmatter)\n frontend-design.md # ← `extends: iii` builds on the bundled base\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThree agent profiles ship inside the worker binary:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode class=\"readme-inline-code\"\u003edefault\u003c/code\u003e — shown as \u003cstrong\u003eDefault\u003c/strong\u003e in the chat\u0026#39;s new-session gallery: the\nminimal directory-first identity (the same text as the bundled\n\u003ccode class=\"readme-inline-code\"\u003eiii-minimal\u003c/code\u003e system prompt), with a composer example. New sessions in the\nADE start on it.\u003c/li\u003e\n\u003cli\u003e\u003ccode class=\"readme-inline-code\"\u003eiii\u003c/code\u003e — the harness default identity, verbatim. \u003ccode class=\"readme-inline-code\"\u003ehidden: true\u003c/code\u003e keeps it\nout of the gallery; it stays a valid \u003ccode class=\"readme-inline-code\"\u003eextends\u003c/code\u003e parent and runs by id.\u003c/li\u003e\n\u003cli\u003e\u003ccode class=\"readme-inline-code\"\u003eiii-minimal\u003c/code\u003e — the previous id of \u003ccode class=\"readme-inline-code\"\u003edefault\u003c/code\u003e, kept as a hidden alias\n(\u003ccode class=\"readme-inline-code\"\u003eextends: default\u003c/code\u003e, no body of its own) so existing \u003ccode class=\"readme-inline-code\"\u003eextends: iii-minimal\u003c/code\u003e chains, saved sessions, and explicit invocations resolve to\nthe same identity. New profiles should use \u003ccode class=\"readme-inline-code\"\u003eextends: default\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eEach is always listed (\u003ccode class=\"readme-inline-code\"\u003ebuiltin: true\u003c/code\u003e), a local \u003ccode class=\"readme-inline-code\"\u003eagents_folder/\u003cid\u003e.md\u003c/code\u003e\nshadows it, \u003ccode class=\"readme-inline-code\"\u003eupdate\u003c/code\u003e on it copy-on-writes that local file, and deleting the\nfile falls back to the bundled copy. No file is ever seeded on disk.\u003c/p\u003e\n\u003cp\u003eAn optional \u003ccode class=\"readme-inline-code\"\u003ecomposer_placeholder:\u003c/code\u003e frontmatter string is the example request\nthe chat shows in an EMPTY composer while that profile is selected. It is\npresentation only — never sent, never added to the prompt — and\nprofile-local: it does not inherit through \u003ccode class=\"readme-inline-code\"\u003eextends\u003c/code\u003e, so a child without its\nown example gets the chat\u0026#39;s generic hint. Whitespace collapses to single\nspaces, blank means absent, and more than 200 characters is rejected like any\nother invalid frontmatter.\u003c/p\u003e\n\u003cp\u003eA second, READ-ONLY root — \u003ccode class=\"readme-inline-code\"\u003eagents_skills_folder\u003c/code\u003e (default \u003ccode class=\"readme-inline-code\"\u003e.agents/skills\u003c/code\u003e\nunder the same Compose or standalone base) — serves agent skills. It is\nscanned \u003cstrong\u003eshallowly\u003c/strong\u003e: only \u003ccode class=\"readme-inline-code\"\u003e\u003cskill-dir\u003e/SKILL.md\u003c/code\u003e becomes an entry\n(id \u003ccode class=\"readme-inline-code\"\u003e\u003cskill-dir\u003e/index\u003c/code\u003e, displayed as \u003ccode class=\"readme-inline-code\"\u003e\u003cskill-dir\u003e\u003c/code\u003e); a skill\u0026#39;s\n\u003ccode class=\"readme-inline-code\"\u003ereference/\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003escripts/\u003c/code\u003e, or other support payload is never listed. A\nmissing directory is silently empty. These skills bypass\n\u003ccode class=\"readme-inline-code\"\u003efilter_unregistered\u003c/code\u003e (their namespaces are skills, not workers), stay\nout of \u003ccode class=\"readme-inline-code\"\u003edirectory::skills::index\u003c/code\u003e (a per-WORKER surface), and are\nrefused by \u003ccode class=\"readme-inline-code\"\u003eupdate\u003c/code\u003e/\u003ccode class=\"readme-inline-code\"\u003edelete\u003c/code\u003e — edit them with their owning tool, or\ncopy one into \u003ccode class=\"readme-inline-code\"\u003eskills_folder\u003c/code\u003e on disk to fork it. Precedence is\n\u003ccode class=\"readme-inline-code\"\u003elocal_skills_folder\u003c/code\u003e \u0026gt; \u003ccode class=\"readme-inline-code\"\u003eskills_folder\u003c/code\u003e \u0026gt; \u003ccode class=\"readme-inline-code\"\u003eagents_skills_folder\u003c/code\u003e,\nnamespace-wise: a top-level namespace directory in a higher root\nshadows the same namespace below.\u003c/p\u003e\n\u003cp\u003eA few rules:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eSkill ids\u003c/strong\u003e are the relative path under \u003ccode class=\"readme-inline-code\"\u003eskills_folder\u003c/code\u003e with \u003ccode class=\"readme-inline-code\"\u003e.md\u003c/code\u003e\nstripped. Each segment must satisfy \u003ccode class=\"readme-inline-code\"\u003e[a-z0-9_-]{1,64}\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSkill frontmatter is optional.\u003c/strong\u003e When present, the reader recognises\n\u003ccode class=\"readme-inline-code\"\u003etitle:\u003c/code\u003e (preferred title), \u003ccode class=\"readme-inline-code\"\u003ename:\u003c/code\u003e (title fallback), \u003ccode class=\"readme-inline-code\"\u003etype:\u003c/code\u003e (free-form\nclassifier), \u003ccode class=\"readme-inline-code\"\u003efunction_id:\u003c/code\u003e (canonical bus function id surfaced by \u003ccode class=\"readme-inline-code\"\u003elist\u003c/code\u003e\nand \u003ccode class=\"readme-inline-code\"\u003eget\u003c/code\u003e), \u003ccode class=\"readme-inline-code\"\u003edescription:\u003c/code\u003e (preferred \u003ccode class=\"readme-inline-code\"\u003elist\u003c/code\u003e teaser), and\n\u003ccode class=\"readme-inline-code\"\u003edisable-model-invocation:\u003c/code\u003e (boolean, default \u003ccode class=\"readme-inline-code\"\u003efalse\u003c/code\u003e, surfaced as\n\u003ccode class=\"readme-inline-code\"\u003edisable_model_invocation\u003c/code\u003e by both responses). The body H1 and first\nparagraph are the title and list-description fallbacks, respectively.\nDisabled skills remain visible to ordinary directory clients; model\nindex consumers decide whether to filter them. Any other YAML keys are ignored.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSystem prompts\u003c/strong\u003e live under any \u003ccode class=\"readme-inline-code\"\u003e*/system-prompts/*.md\u003c/code\u003e path, with\nYAML frontmatter (\u003ccode class=\"readme-inline-code\"\u003edescription\u003c/code\u003e required, \u003ccode class=\"readme-inline-code\"\u003ename\u003c/code\u003e optional). A path carrying\nboth a \u003ccode class=\"readme-inline-code\"\u003eprompts\u003c/code\u003e and a \u003ccode class=\"readme-inline-code\"\u003esystem-prompts\u003c/code\u003e segment is a system prompt because\n\u003ccode class=\"readme-inline-code\"\u003esystem-prompts\u003c/code\u003e is classified first. Other paths containing a \u003ccode class=\"readme-inline-code\"\u003eprompts\u003c/code\u003e\nsegment are ignored by scans and downloads.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eWhat a system prompt can do, by design.\u003c/strong\u003e The console\u0026#39;s chat picker\ncan send a selected system prompt with\n\u003ccode class=\"readme-inline-code\"\u003esystem_prompt_strategy: \"override\"\u003c/code\u003e, which replaces the harness\u0026#39;s\nbuilt-in identity prompt with that file\u0026#39;s body verbatim. Files reach\n\u003ccode class=\"readme-inline-code\"\u003esystem-prompts/\u003c/code\u003e either by local authoring or via\n\u003ccode class=\"readme-inline-code\"\u003edirectory::skills::download\u003c/code\u003e from a git repo or the registry, so a\ndownloaded bundle can supply one. This is an accepted property, not a\nhole: it takes a deliberate selection in the UI, the same UI already\naccepts arbitrary typed text, and the operator owns \u003ccode class=\"readme-inline-code\"\u003eskills_folder\u003c/code\u003e.\nWorth knowing before you point \u003ccode class=\"readme-inline-code\"\u003eskills_folder\u003c/code\u003e at a directory other\npeople can write to.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAgent profiles\u003c/strong\u003e are direct \u003ccode class=\"readme-inline-code\"\u003e\u003cagents_folder\u003e/\u003cid\u003e.md\u003c/code\u003e files (unrelated to\nthe read-only \u003ccode class=\"readme-inline-code\"\u003eagents_skills_folder\u003c/code\u003e above, which holds external tools\u0026#39;\n\u003cem\u003eskills\u003c/em\u003e). Nested profiles and the former\n\u003ccode class=\"readme-inline-code\"\u003e\u003cskills_folder\u003e/**/agents/*.md\u003c/code\u003e layout are ignored. Frontmatter is required\nand must declare a non-empty \u003ccode class=\"readme-inline-code\"\u003ename\u003c/code\u003e\n(the display name — the id is always the file stem); \u003ccode class=\"readme-inline-code\"\u003edescription\u003c/code\u003e may\nbe empty, \u003ccode class=\"readme-inline-code\"\u003elogo\u003c/code\u003e is emoji-only (≤16 bytes, no path characters),\n\u003ccode class=\"readme-inline-code\"\u003eskills:\u003c/code\u003e filters the skill index (absent/empty = every skill), and\n\u003ccode class=\"readme-inline-code\"\u003emodel:\u003c/code\u003e names a model id for sessions using this profile (absent = the\nsend decides), and optional \u003ccode class=\"readme-inline-code\"\u003ereasoning_effort:\u003c/code\u003e names its provider-native\neffort. Both are stored verbatim and resolved against the live model\ncatalog where they are used. The body is the\nsystem prompt, verbatim, and may be empty — a profile with no prompt of\nits own contributes only its parent chain (if any) and its non-prompt\nsettings. Unknown \u003ccode class=\"readme-inline-code\"\u003eskills\u003c/code\u003e ids are\nwarnings surfaced by \u003ccode class=\"readme-inline-code\"\u003eget\u003c/code\u003e, never load failures.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAgent profiles declare preloaded functions.\u003c/strong\u003e \u003ccode class=\"readme-inline-code\"\u003efunctions:\u003c/code\u003e lists engine\nfunction ids (\u003ccode class=\"readme-inline-code\"\u003ecoder::tree\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003ecoder::search\u003c/code\u003e, …) the profile uses\nroutinely. The harness resolves their contracts once, when a session\nstarts as this profile, and freezes them into the system prompt as a\n\u003ccode class=\"readme-inline-code\"\u003e\u003cpreloaded_functions\u003e\u003c/code\u003e block (id, description, compacted request schema), so\nthe model calls them on the first step instead of spending a\n\u003ccode class=\"readme-inline-code\"\u003edirectory::search_functions\u003c/code\u003e + \u003ccode class=\"readme-inline-code\"\u003eengine::functions::info\u003c/code\u003e round-trip per\nsession; everything else still goes through discovery. Ids are stored\nverbatim (non-empty, no whitespace; duplicates collapse, order kept);\n\u003ccode class=\"readme-inline-code\"\u003eget\u003c/code\u003e reports ids the engine does not currently know in\n\u003ccode class=\"readme-inline-code\"\u003eunknown_functions\u003c/code\u003e (a warning — the harness renders them as unavailable),\n\u003ccode class=\"readme-inline-code\"\u003elist\u003c/code\u003e carries \u003ccode class=\"readme-inline-code\"\u003efunction_count\u003c/code\u003e. \u003ccode class=\"readme-inline-code\"\u003edirectory::agents::functions::add\u003c/code\u003e /\n\u003ccode class=\"readme-inline-code\"\u003e::remove { id, functions }\u003c/code\u003e edit only that frontmatter field — the rest\nof the file stays byte-identical — and fan out \u003ccode class=\"readme-inline-code\"\u003eon-change\u003c/code\u003e as an update.\nThe console\u0026#39;s profile editor picks them from the live registry with the\nsame keyboard-first search + Selected/Available lists as skills.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAgent profiles inherit.\u003c/strong\u003e \u003ccode class=\"readme-inline-code\"\u003eextends: \u003cid\u003e\u003c/code\u003e names one parent profile\n(chains allowed, at most 8 hops). The resolved system prompt served by\n\u003ccode class=\"readme-inline-code\"\u003eget\u003c/code\u003e is the parent\u0026#39;s resolved prompt followed by a blank line and this\nfile\u0026#39;s body — a blank body contributes nothing, so a profile with no\nprompt of its own serves its parent chain unchanged; \u003ccode class=\"readme-inline-code\"\u003emodel\u003c/code\u003e and\n\u003ccode class=\"readme-inline-code\"\u003ereasoning_effort\u003c/code\u003e fall back to the nearest ancestor that sets them when\nomitted, while \u003ccode class=\"readme-inline-code\"\u003eskills\u003c/code\u003e and \u003ccode class=\"readme-inline-code\"\u003efunctions\u003c/code\u003e inherit ADDITIVELY (the union of\nthe chain\u0026#39;s lists, root first, no duplicates — a child adds to what its\nparents allow / preload, it cannot remove); \u003ccode class=\"readme-inline-code\"\u003ename\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003edescription\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003elogo\u003c/code\u003e,\n\u003ccode class=\"readme-inline-code\"\u003eicon\u003c/code\u003e and \u003ccode class=\"readme-inline-code\"\u003ecolor\u003c/code\u003e are always the profile\u0026#39;s own. A chain that does not resolve\n(unknown parent, loop, too deep) is reported by \u003ccode class=\"readme-inline-code\"\u003elist\u003c/code\u003e/\u003ccode class=\"readme-inline-code\"\u003eget\u003c/code\u003e as\n\u003ccode class=\"readme-inline-code\"\u003einheritance_error\u003c/code\u003e (\u003ccode class=\"readme-inline-code\"\u003eD415\u003c/code\u003e text) while the profile still serves its own\nfile (so the editor can fix it); the harness refuses to run it.\u003c/li\u003e\n\u003cli\u003eUnder a skills root, files outside \u003ccode class=\"readme-inline-code\"\u003eprompts/\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003esystem-prompts/\u003c/code\u003e, and\nreserved \u003ccode class=\"readme-inline-code\"\u003eagents/\u003c/code\u003e segments are skills.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe download function namespaces by source:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eSource\u003c/th\u003e\n\u003cth\u003eDestination\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003erepo=URL skill=NAME branch?=main\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003e\u003cskills_folder\u003e/\u003cNAME\u003e/...\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003eworker=NAME version=…\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSkills/prompts under \u003ccode class=\"readme-inline-code\"\u003e\u003cskills_folder\u003e/\u003cNAME\u003e/...\u003c/code\u003e; exact \u003ccode class=\"readme-inline-code\"\u003eagents/\u003cid\u003e.md\u003c/code\u003e entries under \u003ccode class=\"readme-inline-code\"\u003e\u003cagents_folder\u003e/\u003cid\u003e.md\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003eworker=NAME tag=…\u003c/code\u003e (default \u003ccode class=\"readme-inline-code\"\u003etag=latest\u003c/code\u003e)\u003c/td\u003e\n\u003ctd\u003eSame routing as the version form\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\u003cp\u003eRe-pulling the same source overwrites files \u003cstrong\u003efile-by-file\u003c/strong\u003e —\nexisting siblings outside the response set are preserved (so\nhand-edited additions survive a re-pull).\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"skill-ids\" class=\"scroll-mt-20\"\u003eSkill ids\u003c/h2\u003e\n\u003cp\u003eSkills are addressed by their relative path under \u003ccode class=\"readme-inline-code\"\u003eskills_folder\u003c/code\u003e with\n\u003ccode class=\"readme-inline-code\"\u003e.md\u003c/code\u003e stripped — e.g. \u003ccode class=\"readme-inline-code\"\u003e\u003cskills_folder\u003e/agent-memory/observe.md\u003c/code\u003e →\nid \u003ccode class=\"readme-inline-code\"\u003e\"agent-memory/observe\"\u003c/code\u003e. The same string is what\n\u003ccode class=\"readme-inline-code\"\u003edirectory::skills::list\u003c/code\u003e returns and what \u003ccode class=\"readme-inline-code\"\u003edirectory::skills::get\u003c/code\u003e\nexpects in \u003ccode class=\"readme-inline-code\"\u003e{ \"id\": ... }\u003c/code\u003e. The legacy \u003ccode class=\"readme-inline-code\"\u003eiii://{id}\u003c/code\u003e link form is still\naccepted on \u003ccode class=\"readme-inline-code\"\u003eget\u003c/code\u003e (the prefix is auto-stripped), but the worker no\nlonger parses any other \u003ccode class=\"readme-inline-code\"\u003eiii://\u003c/code\u003e URI shape — bodies are read solely by\nid, and the auto-rendered tree-shaped index that previous releases\nserved at \u003ccode class=\"readme-inline-code\"\u003eiii://directory/skills\u003c/code\u003e is gone. Consumers that want a\ntree-shaped picker iterate \u003ccode class=\"readme-inline-code\"\u003elist\u003c/code\u003e rows themselves and indent by\n\u003ccode class=\"readme-inline-code\"\u003eid.matches('/').count()\u003c/code\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"functions\" class=\"scroll-mt-20\"\u003eFunctions\u003c/h2\u003e\n\u003cp\u003eFunctions sit under \u003ccode class=\"readme-inline-code\"\u003edirectory::*\u003c/code\u003e. All registrations are\nnamespace-clean; this worker is intentionally agnostic to MCP and any\nother adapter.\u003c/p\u003e\n\u003ch3 id=\"directoryskills-filesystem-reader-editor\" class=\"scroll-mt-20\"\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::skills::*\u003c/code\u003e (filesystem reader + editor)\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFunction ID\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::skills::download\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eDownload directory content. Flexible alias accepting either source set: \u003ccode class=\"readme-inline-code\"\u003e{repo, skill, branch?}\u003c/code\u003e (defaults \u003ccode class=\"readme-inline-code\"\u003ebranch=main\u003c/code\u003e) or \u003ccode class=\"readme-inline-code\"\u003e{worker, version?|tag?}\u003c/code\u003e (defaults \u003ccode class=\"readme-inline-code\"\u003etag=latest\u003c/code\u003e). Prefer the two explicit forms below so the source is unambiguous.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::skills::download_from_repo\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRepo-only form: \u003ccode class=\"readme-inline-code\"\u003e{repo, skill, branch?}\u003c/code\u003e. Copies one skill folder out of a GitHub repo; paths under \u003ccode class=\"readme-inline-code\"\u003eprompts/\u003c/code\u003e and \u003ccode class=\"readme-inline-code\"\u003eagents/\u003c/code\u003e are ignored.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::skills::download_from_registry\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRegistry-only form: \u003ccode class=\"readme-inline-code\"\u003e{worker, version?|tag?}\u003c/code\u003e. Installs a published worker\u0026#39;s bundle from \u003ccode class=\"readme-inline-code\"\u003eapi.workers.iii.dev\u003c/code\u003e, routing exact \u003ccode class=\"readme-inline-code\"\u003eagents/\u003cid\u003e.md\u003c/code\u003e entries to \u003ccode class=\"readme-inline-code\"\u003eagents_folder\u003c/code\u003e.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::skills::list\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eEnriched listing of every fs-backed skill: \u003ccode class=\"readme-inline-code\"\u003e{ id, title, type, function_id, disable_model_invocation, description, bytes, modified_at }\u003c/code\u003e per row. \u003ccode class=\"readme-inline-code\"\u003etitle\u003c/code\u003e prefers the YAML frontmatter \u003ccode class=\"readme-inline-code\"\u003etitle:\u003c/code\u003e over the body H1, \u003ccode class=\"readme-inline-code\"\u003etype\u003c/code\u003e is lifted from frontmatter \u003ccode class=\"readme-inline-code\"\u003etype:\u003c/code\u003e (\u003ccode class=\"readme-inline-code\"\u003enull\u003c/code\u003e when absent), \u003ccode class=\"readme-inline-code\"\u003efunction_id\u003c/code\u003e identifies the documented bus function when present, and \u003ccode class=\"readme-inline-code\"\u003edescription\u003c/code\u003e is the frontmatter description or first body paragraph — so consumers can render a picker without a follow-up \u003ccode class=\"readme-inline-code\"\u003eget\u003c/code\u003e per row.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::skills::get\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFetch one skill by id. Returns \u003ccode class=\"readme-inline-code\"\u003e{ id, title, type, function_id, disable_model_invocation, path, body, modified_at }\u003c/code\u003e. It shares the list row\u0026#39;s identity, classification, function, and invocation metadata, but returns the raw markdown \u003ccode class=\"readme-inline-code\"\u003ebody\u003c/code\u003e and absolute on-disk \u003ccode class=\"readme-inline-code\"\u003epath\u003c/code\u003e instead of the teaser and byte count; there is no \u003ccode class=\"readme-inline-code\"\u003edescription\u003c/code\u003e field. The path\u0026#39;s parent directory is the skill\u0026#39;s base directory, where payload like \u003ccode class=\"readme-inline-code\"\u003escripts/\u003c/code\u003e and \u003ccode class=\"readme-inline-code\"\u003ereference/\u003c/code\u003e lives, and is meaningful only to callers on this worker\u0026#39;s machine. Accepts a bare id or the same id prefixed with \u003ccode class=\"readme-inline-code\"\u003eiii://\u003c/code\u003e. Pass \u003ccode class=\"readme-inline-code\"\u003eraw: true\u003c/code\u003e to additionally get the FULL on-disk file (frontmatter included) as \u003ccode class=\"readme-inline-code\"\u003eraw\u003c/code\u003e — the round-trip form \u003ccode class=\"readme-inline-code\"\u003eupdate\u003c/code\u003e takes.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::skills::update\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOverwrite one EXISTING skill file with new full-file content: \u003ccode class=\"readme-inline-code\"\u003e{ id, content }\u003c/code\u003e where \u003ccode class=\"readme-inline-code\"\u003econtent\u003c/code\u003e is the edited \u003ccode class=\"readme-inline-code\"\u003eraw\u003c/code\u003e from \u003ccode class=\"readme-inline-code\"\u003eget { raw: true }\u003c/code\u003e. Validated against the read invariants (size cap, non-empty body after frontmatter); atomic write; fans out \u003ccode class=\"readme-inline-code\"\u003edirectory::skills::on-change\u003c/code\u003e with \u003ccode class=\"readme-inline-code\"\u003eop: \"update\"\u003c/code\u003e. Never creates files (use \u003ccode class=\"readme-inline-code\"\u003ecreate\u003c/code\u003e). Refuses read-only system-installed skills under \u003ccode class=\"readme-inline-code\"\u003eagents_skills_folder\u003c/code\u003e (\u003ccode class=\"readme-inline-code\"\u003eD116\u003c/code\u003e).\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::skills::create\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCreate a NEW skill file at \u003ccode class=\"readme-inline-code\"\u003e\u003cskills_folder\u003e/\u003cid\u003e.md\u003c/code\u003e from full-file content: \u003ccode class=\"readme-inline-code\"\u003e{ id, content }\u003c/code\u003e. Frontmatter is optional (same rules as \u003ccode class=\"readme-inline-code\"\u003eupdate\u003c/code\u003e: size cap, non-empty body). Refuses an \u003ccode class=\"readme-inline-code\"\u003eid\u003c/code\u003e that already resolves in the visible set — including the \u003ccode class=\"readme-inline-code\"\u003e\u003cid\u003e\u003c/code\u003e → \u003ccode class=\"readme-inline-code\"\u003e\u003cid\u003e/index\u003c/code\u003e overview alias and system-installed agents skills — or a target path that already exists on disk (\u003ccode class=\"readme-inline-code\"\u003eD114\u003c/code\u003e); an \u003ccode class=\"readme-inline-code\"\u003eid\u003c/code\u003e in a namespace reserved by a system-installed agents skill (\u003ccode class=\"readme-inline-code\"\u003eD115\u003c/code\u003e); and, while \u003ccode class=\"readme-inline-code\"\u003efilter_unregistered\u003c/code\u003e is on, an \u003ccode class=\"readme-inline-code\"\u003eid\u003c/code\u003e the visibility filter would immediately hide (\u003ccode class=\"readme-inline-code\"\u003eD115\u003c/code\u003e). Atomic write; fans out \u003ccode class=\"readme-inline-code\"\u003edirectory::skills::on-change\u003c/code\u003e with \u003ccode class=\"readme-inline-code\"\u003eop: \"create\"\u003c/code\u003e. Returns the same shape as \u003ccode class=\"readme-inline-code\"\u003eupdate\u003c/code\u003e.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::skills::delete\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePermanently remove one EXISTING skill file by \u003ccode class=\"readme-inline-code\"\u003e{ id }\u003c/code\u003e (same id forms as \u003ccode class=\"readme-inline-code\"\u003eget\u003c/code\u003e). Resolves against the same visible set as \u003ccode class=\"readme-inline-code\"\u003elist\u003c/code\u003e/\u003ccode class=\"readme-inline-code\"\u003eget\u003c/code\u003e, refuses read-only system-installed skills under \u003ccode class=\"readme-inline-code\"\u003eagents_skills_folder\u003c/code\u003e (\u003ccode class=\"readme-inline-code\"\u003eD116\u003c/code\u003e), removes the file plus any parent directories left empty (so a deleted namespace can\u0026#39;t keep shadowing a lower-precedence root), and fans out \u003ccode class=\"readme-inline-code\"\u003edirectory::skills::on-change\u003c/code\u003e with \u003ccode class=\"readme-inline-code\"\u003eop: \"delete\"\u003c/code\u003e. Returns \u003ccode class=\"readme-inline-code\"\u003e{ id }\u003c/code\u003e (the resolved on-disk id).\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::skills::index\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eRender one short markdown entry per installed worker (skills with frontmatter \u003ccode class=\"readme-inline-code\"\u003etype: index\u003c/code\u003e). Returns \u003ccode class=\"readme-inline-code\"\u003e{ body, workers_count }\u003c/code\u003e where \u003ccode class=\"readme-inline-code\"\u003ebody\u003c/code\u003e is a ready-to-paste page: \u003ccode class=\"readme-inline-code\"\u003e# Skills index\u003c/code\u003e, then one \u003ccode class=\"readme-inline-code\"\u003e## \u003cworker title\u003e\u003c/code\u003e heading + the worker\u0026#39;s first overview paragraph + a \u003ccode class=\"readme-inline-code\"\u003eRead iii://\u003cns\u003e/index\u003c/code\u003e pointer the agent can follow with \u003ccode class=\"readme-inline-code\"\u003edirectory::skills::get\u003c/code\u003e. Token-light by design; use \u003ccode class=\"readme-inline-code\"\u003edirectory::skills::list\u003c/code\u003e for per-skill rows.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\u003ch3 id=\"directorysystem-prompts-filesystem-reader-editor\" class=\"scroll-mt-20\"\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::system-prompts::*\u003c/code\u003e (filesystem reader + editor)\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFunction ID\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::system-prompts::list\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMetadata-only listing of every fs-backed system prompt.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::system-prompts::get\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFetch one system prompt\u0026#39;s body + \u003ccode class=\"readme-inline-code\"\u003e{name, description, modified_at}\u003c/code\u003e. Plain shape, no envelope. Pass \u003ccode class=\"readme-inline-code\"\u003eraw: true\u003c/code\u003e to additionally get the FULL on-disk file (frontmatter included) as \u003ccode class=\"readme-inline-code\"\u003eraw\u003c/code\u003e.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::system-prompts::update\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOverwrite one EXISTING system prompt file with new full-file content: \u003ccode class=\"readme-inline-code\"\u003e{ name, content }\u003c/code\u003e. The frontmatter must keep a non-empty \u003ccode class=\"readme-inline-code\"\u003edescription\u003c/code\u003e (and a valid \u003ccode class=\"readme-inline-code\"\u003ename\u003c/code\u003e when declared) — the same rules the scanner enforces. Atomic write; fans out \u003ccode class=\"readme-inline-code\"\u003edirectory::system-prompts::on-change\u003c/code\u003e with \u003ccode class=\"readme-inline-code\"\u003eop: \"update\"\u003c/code\u003e. Returns the system prompt\u0026#39;s effective name after the write.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::system-prompts::create\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCreate a NEW system prompt file at \u003ccode class=\"readme-inline-code\"\u003e\u003cskills_folder\u003e/system-prompts/\u003cname\u003e.md\u003c/code\u003e from full-file content: \u003ccode class=\"readme-inline-code\"\u003e{ name, content }\u003c/code\u003e, where \u003ccode class=\"readme-inline-code\"\u003econtent\u003c/code\u003e is the FULL file including frontmatter. The frontmatter must carry a non-empty \u003ccode class=\"readme-inline-code\"\u003edescription\u003c/code\u003e (and a \u003ccode class=\"readme-inline-code\"\u003ename\u003c/code\u003e matching the request, when declared) — the same rules \u003ccode class=\"readme-inline-code\"\u003eupdate\u003c/code\u003e enforces. Refuses a \u003ccode class=\"readme-inline-code\"\u003ename\u003c/code\u003e that already exists anywhere in the merged system-prompt scan, and a target path that already exists on disk even if the scanner would skip it. Atomic write; fans out \u003ccode class=\"readme-inline-code\"\u003edirectory::system-prompts::on-change\u003c/code\u003e with \u003ccode class=\"readme-inline-code\"\u003eop: \"create\"\u003c/code\u003e. Returns \u003ccode class=\"readme-inline-code\"\u003e{ name, description, bytes, modified_at }\u003c/code\u003e.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::system-prompts::delete\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePermanently remove one EXISTING system prompt file by \u003ccode class=\"readme-inline-code\"\u003e{ name }\u003c/code\u003e. Resolves against the same merged scan as \u003ccode class=\"readme-inline-code\"\u003elist\u003c/code\u003e/\u003ccode class=\"readme-inline-code\"\u003eget\u003c/code\u003e, fans out \u003ccode class=\"readme-inline-code\"\u003edirectory::system-prompts::on-change\u003c/code\u003e with \u003ccode class=\"readme-inline-code\"\u003eop: \"delete\"\u003c/code\u003e, and returns \u003ccode class=\"readme-inline-code\"\u003e{ name }\u003c/code\u003e.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\u003ch3 id=\"agent-profiles-directoryagents-filesystem-reader-editor\" class=\"scroll-mt-20\"\u003eAgent Profiles — \u003ccode class=\"readme-inline-code\"\u003edirectory::agents::*\u003c/code\u003e (filesystem reader + editor)\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFunction ID\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::agents::list\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMetadata-only listing of every agent profile — fs-backed plus the bundled \u003ccode class=\"readme-inline-code\"\u003edefault\u003c/code\u003e / \u003ccode class=\"readme-inline-code\"\u003eiii\u003c/code\u003e / \u003ccode class=\"readme-inline-code\"\u003eiii-minimal\u003c/code\u003e profiles (\u003ccode class=\"readme-inline-code\"\u003ebuiltin: true\u003c/code\u003e until a local file shadows one): \u003ccode class=\"readme-inline-code\"\u003e{ id, name, description, logo, skill_count, model, reasoning_effort, icon, color, extends, hidden, composer_placeholder, modified_at }\u003c/code\u003e per row (\u003ccode class=\"readme-inline-code\"\u003ehidden\u003c/code\u003e and \u003ccode class=\"readme-inline-code\"\u003ecomposer_placeholder\u003c/code\u003e omitted when unset; \u003ccode class=\"readme-inline-code\"\u003ecomposer_placeholder\u003c/code\u003e never inherits), \u003ccode class=\"readme-inline-code\"\u003eskill_count\u003c/code\u003e/\u003ccode class=\"readme-inline-code\"\u003emodel\u003c/code\u003e/\u003ccode class=\"readme-inline-code\"\u003ereasoning_effort\u003c/code\u003e resolved through \u003ccode class=\"readme-inline-code\"\u003eextends\u003c/code\u003e (\u003ccode class=\"readme-inline-code\"\u003eskill_count: null\u003c/code\u003e = every skill; \u003ccode class=\"readme-inline-code\"\u003emodel: null\u003c/code\u003e = the send decides). A row whose chain does not resolve carries \u003ccode class=\"readme-inline-code\"\u003einheritance_error\u003c/code\u003e.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::agents::get\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFetch one agent profile by \u003ccode class=\"readme-inline-code\"\u003e{ id }\u003c/code\u003e: the RESOLVED \u003ccode class=\"readme-inline-code\"\u003esystem_prompt\u003c/code\u003e (each ancestor\u0026#39;s body root-first, then this file\u0026#39;s body), \u003ccode class=\"readme-inline-code\"\u003eskills\u003c/code\u003e + \u003ccode class=\"readme-inline-code\"\u003eunknown_skills\u003c/code\u003e (filter entries matching no visible skill — warnings), \u003ccode class=\"readme-inline-code\"\u003emodel\u003c/code\u003e (\u003ccode class=\"readme-inline-code\"\u003enull\u003c/code\u003e = the send decides), provider-native \u003ccode class=\"readme-inline-code\"\u003ereasoning_effort\u003c/code\u003e, display \u003ccode class=\"readme-inline-code\"\u003eicon\u003c/code\u003e/\u003ccode class=\"readme-inline-code\"\u003ecolor\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003eextends\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003ehidden\u003c/code\u003e, the profile\u0026#39;s own \u003ccode class=\"readme-inline-code\"\u003ecomposer_placeholder\u003c/code\u003e (omitted when unset), \u003ccode class=\"readme-inline-code\"\u003ebuiltin\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003emodified_at\u003c/code\u003e, and \u003ccode class=\"readme-inline-code\"\u003einheritance_error\u003c/code\u003e when the chain does not resolve (own file served meanwhile). Pass \u003ccode class=\"readme-inline-code\"\u003eraw: true\u003c/code\u003e to additionally get this profile\u0026#39;s FULL on-disk file as \u003ccode class=\"readme-inline-code\"\u003eraw\u003c/code\u003e.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::agents::update\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOverwrite one EXISTING agent profile file with new full-file content: \u003ccode class=\"readme-inline-code\"\u003e{ id, content }\u003c/code\u003e. Same rules the scanner enforces (required frontmatter with non-empty \u003ccode class=\"readme-inline-code\"\u003ename\u003c/code\u003e, emoji-only \u003ccode class=\"readme-inline-code\"\u003elogo\u003c/code\u003e; the body — the system prompt — may be empty); the id stays the file stem. Updating a bundled profile creates the local file that shadows it. Atomic write; fans out \u003ccode class=\"readme-inline-code\"\u003edirectory::agents::on-change\u003c/code\u003e with \u003ccode class=\"readme-inline-code\"\u003eop: \"update\"\u003c/code\u003e.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::agents::create\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCreate a NEW agent profile at \u003ccode class=\"readme-inline-code\"\u003e\u003cagents_folder\u003e/\u003cid\u003e.md\u003c/code\u003e from full-file content: \u003ccode class=\"readme-inline-code\"\u003e{ id, content }\u003c/code\u003e. Refuses an \u003ccode class=\"readme-inline-code\"\u003eid\u003c/code\u003e that already exists in the configured agent-profile root, and a target path that already exists on disk even if the scanner would skip it; creating a bundled id shadows the bundled copy. Atomic write; fans out \u003ccode class=\"readme-inline-code\"\u003edirectory::agents::on-change\u003c/code\u003e with \u003ccode class=\"readme-inline-code\"\u003eop: \"create\"\u003c/code\u003e. Returns \u003ccode class=\"readme-inline-code\"\u003e{ id, name, description, logo, bytes, modified_at }\u003c/code\u003e.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::agents::delete\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePermanently remove one EXISTING agent profile file by \u003ccode class=\"readme-inline-code\"\u003e{ id }\u003c/code\u003e. Resolves against the same configured root as \u003ccode class=\"readme-inline-code\"\u003elist\u003c/code\u003e/\u003ccode class=\"readme-inline-code\"\u003eget\u003c/code\u003e, fans out \u003ccode class=\"readme-inline-code\"\u003edirectory::agents::on-change\u003c/code\u003e with \u003ccode class=\"readme-inline-code\"\u003eop: \"delete\"\u003c/code\u003e, and returns \u003ccode class=\"readme-inline-code\"\u003e{ id }\u003c/code\u003e. Deleting the local shadow of a bundled profile falls back to the bundled copy; a bundled profile with no local file has nothing to delete (\u003ccode class=\"readme-inline-code\"\u003eD414\u003c/code\u003e). Sessions already using the profile are unaffected; profiles extending it stop resolving until fixed.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::agents::functions::add\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003e{ id, functions: [\"coder::tree\", …] }\u003c/code\u003e — append engine function ids to one EXISTING profile\u0026#39;s OWN \u003ccode class=\"readme-inline-code\"\u003efunctions:\u003c/code\u003e list (its \u003cem\u003epreloaded\u003c/em\u003e functions: the contracts the harness pre-loads into the system prompt of every new session running as the profile). Ids already present are kept once; only that frontmatter field is rewritten (block style), every other byte of the file is untouched; writes atomically, copy-on-writes a bundled profile\u0026#39;s shadow, fans out \u003ccode class=\"readme-inline-code\"\u003eon-change\u003c/code\u003e with \u003ccode class=\"readme-inline-code\"\u003eop: \"update\"\u003c/code\u003e. Returns \u003ccode class=\"readme-inline-code\"\u003e{ id, functions, added, unchanged?, bytes, modified_at }\u003c/code\u003e — \u003ccode class=\"readme-inline-code\"\u003eunchanged: true\u003c/code\u003e means nothing was written. \u003ccode class=\"readme-inline-code\"\u003eD416\u003c/code\u003e for a request with no valid ids (entries must be non-empty and whitespace-free).\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::agents::functions::remove\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003e{ id, functions }\u003c/code\u003e — drop ids from one EXISTING profile\u0026#39;s OWN \u003ccode class=\"readme-inline-code\"\u003efunctions:\u003c/code\u003e list (absent ids are ignored; the field disappears when the list empties). Same write semantics and \u003ccode class=\"readme-inline-code\"\u003eD416\u003c/code\u003e; returns \u003ccode class=\"readme-inline-code\"\u003e{ id, functions, removed, unchanged?, bytes, modified_at }\u003c/code\u003e. Neither verb touches ids inherited through \u003ccode class=\"readme-inline-code\"\u003eextends\u003c/code\u003e — those stay in the resolved union and are removed on the parent that declares them.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\u003ch3 id=\"engine-introspection-native-plus-one-wrapper\" class=\"scroll-mt-20\"\u003eEngine introspection (native, plus one wrapper)\u003c/h3\u003e\n\u003cp\u003eEngine introspection is served natively; call these ids directly — every\none takes the same filters (\u003ccode class=\"readme-inline-code\"\u003eprefix\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003esearch\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003eworker\u003c/code\u003e,\n\u003ccode class=\"readme-inline-code\"\u003einclude_internal\u003c/code\u003e where applicable). One wrapper is kept for callers\nwhose policy only admits the \u003ccode class=\"readme-inline-code\"\u003edirectory::\u003c/code\u003e namespace:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFunction ID\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::engine::functions::info\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eThin proxy to \u003ccode class=\"readme-inline-code\"\u003eengine::functions::info\u003c/code\u003e for a single \u003ccode class=\"readme-inline-code\"\u003efunction_id\u003c/code\u003e: request/response schemas, metadata, and registered triggers. The one \u003ccode class=\"readme-inline-code\"\u003edirectory::engine::*\u003c/code\u003e helper that still exists — reach for it only when you cannot call \u003ccode class=\"readme-inline-code\"\u003eengine::*\u003c/code\u003e directly.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\u003cp\u003eThe native ids:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFunction ID\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003eengine::functions::list\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eList functions registered with the engine.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003eengine::functions::info\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSingle-function detail: schemas, owning worker.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003eengine::triggers::list\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eList trigger TYPES (the providers, e.g. \u003ccode class=\"readme-inline-code\"\u003ehttp\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003ecron\u003c/code\u003e).\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003eengine::triggers::info\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSingle trigger-type detail: configuration schema, return schema.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003eengine::registered-triggers::list\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eList trigger INSTANCES (subscriber rows).\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003eengine::registered-triggers::info\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eSingle registered-trigger detail.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003eengine::workers::list\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eList workers with an open engine WS connection. Daemon-managed providers (\u003ccode class=\"readme-inline-code\"\u003ehttp\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003ecron\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003estate\u003c/code\u003e) won\u0026#39;t appear — call \u003ccode class=\"readme-inline-code\"\u003eworker::list\u003c/code\u003e from the supervisor to see those.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003eengine::workers::info\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOne worker\u0026#39;s detail by \u003ccode class=\"readme-inline-code\"\u003ename\u003c/code\u003e.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\u003ch3 id=\"directoryregistry-workers-registry-http-proxy\" class=\"scroll-mt-20\"\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::registry::*\u003c/code\u003e (workers registry HTTP proxy)\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFunction ID\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::registry::workers::list\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBrowse / search published workers in \u003ccode class=\"readme-inline-code\"\u003eapi.workers.iii.dev\u003c/code\u003e. Optional free-text \u003ccode class=\"readme-inline-code\"\u003esearch\u003c/code\u003e (matched fuzzy by \u003ccode class=\"readme-inline-code\"\u003epg_trgm\u003c/code\u003e) and opaque \u003ccode class=\"readme-inline-code\"\u003ecursor\u003c/code\u003e for pagination; page size is server-authored. Response is \u003ccode class=\"readme-inline-code\"\u003e{ workers: [...], pagination: { next_cursor, has_more, page_size } }\u003c/code\u003e. Shares the core \u003ccode class=\"readme-inline-code\"\u003ename\u003c/code\u003e / \u003ccode class=\"readme-inline-code\"\u003edescription\u003c/code\u003e / \u003ccode class=\"readme-inline-code\"\u003eversion\u003c/code\u003e fields with the engine\u0026#39;s \u003ccode class=\"readme-inline-code\"\u003eengine::workers::list\u003c/code\u003e.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::registry::workers::info\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePre-install card for one worker. Fans out two parallel registry calls — \u003ccode class=\"readme-inline-code\"\u003eGET /w/{slug}\u003c/code\u003e for the worker envelope (publication metadata + readme + functions + triggers) and \u003ccode class=\"readme-inline-code\"\u003eGET /w/{slug}/skills\u003c/code\u003e for the skills tree — and merges them into \u003ccode class=\"readme-inline-code\"\u003e{ worker, api_reference, skills_tree, readme? }\u003c/code\u003e. The card keeps public function/trigger names and descriptions only: request/response schemas, metadata, internal and search-excluded functions are dropped (browser\u0026#39;s schemas alone ran 65 KB; the contract is \u003ccode class=\"readme-inline-code\"\u003eengine::functions::info\u003c/code\u003e after installing), and \u003ccode class=\"readme-inline-code\"\u003ereadme\u003c/code\u003e (10–25 KB) is included only with \u003ccode class=\"readme-inline-code\"\u003ereadme: true\u003c/code\u003e. The full record stays cached in-process for \u003ccode class=\"readme-inline-code\"\u003edirectory::search_functions\u003c/code\u003e. Input still accepts \u003ccode class=\"readme-inline-code\"\u003eversion:\u003c/code\u003e (semver) or \u003ccode class=\"readme-inline-code\"\u003etag:\u003c/code\u003e (e.g. \u003ccode class=\"readme-inline-code\"\u003elatest\u003c/code\u003e); both go on the wire as \u003ccode class=\"readme-inline-code\"\u003e?version=…\u003c/code\u003e.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\u003cp\u003eBoth \u003ccode class=\"readme-inline-code\"\u003edirectory::registry::*\u003c/code\u003e responses are cached in-process for\n\u003ccode class=\"readme-inline-code\"\u003eregistry_cache_ttl_ms\u003c/code\u003e (default 60s).\u003c/p\u003e\n\u003cp\u003eThere is \u003cstrong\u003eno\u003c/strong\u003e \u003ccode class=\"readme-inline-code\"\u003edirectory::skills::register\u003c/code\u003e — see\n\u003ca href=\"#migration-from-skills-v02x\"\u003eMigration\u003c/a\u003e below.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"function-search-pre-generate-hint\" class=\"scroll-mt-20\"\u003eFunction search \u0026amp; pre-generate hint\u003c/h2\u003e\n\u003cp\u003eOne-shot function search over the live engine catalog. \u003ccode class=\"readme-inline-code\"\u003ejudge\u003c/code\u003e (the default)\nranks through the optional \u003ccode class=\"readme-inline-code\"\u003ejudge\u003c/code\u003e worker when it is registered and answers,\nand otherwise behaves as \u003ccode class=\"readme-inline-code\"\u003ehybrid\u003c/code\u003e (BM25 fused with the local MiniLM model,\nreranked); \u003ccode class=\"readme-inline-code\"\u003elexical\u003c/code\u003e is BM25 only. Absorbed from the former \u003ccode class=\"readme-inline-code\"\u003ediscovery\u003c/code\u003e worker,\nit returns only compact \u003ccode class=\"readme-inline-code\"\u003e{ function_id, description }\u003c/code\u003e candidates, grouped by worker in rank order. The model chooses\nthe candidates it needs, then fetches their contracts in one\n\u003ccode class=\"readme-inline-code\"\u003eengine::functions::info { function_ids: [...] }\u003c/code\u003e call instead of walking the\ncatalog with \u003ccode class=\"readme-inline-code\"\u003eengine::functions::list\u003c/code\u003e.\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFunction\u003c/th\u003e\n\u003cth\u003eKind\u003c/th\u003e\n\u003cth\u003eWhat it does\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::search_functions\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003epublic\u003c/td\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003e{ capabilities }\u003c/code\u003e → \u003ccode class=\"readme-inline-code\"\u003e{ guidance, workers[], installable[]?, skills[]?, triggers[]?, search_mode, latency_ms }\u003c/code\u003e: rank with the configured mode over the live engine catalog in batches of six capabilities (12 candidates per batch across at most max(6, 2 × capabilities) workers, up to 3 batches) plus matching NOT-installed registry workers under \u003ccode class=\"readme-inline-code\"\u003einstallable\u003c/code\u003e. \u003ccode class=\"readme-inline-code\"\u003ecapabilities\u003c/code\u003e is a required list of non-empty unmet external capability searches (one to six is the norm); entries past the 18th are not searched and are named in \u003ccode class=\"readme-inline-code\"\u003eguidance\u003c/code\u003e. Requests to summarize provided text/content are ignored.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::pre-generate\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003einternal hook\u003c/td\u003e\n\u003ctd\u003eInjects the conditional search hint into a harness generation (at most once per turn).\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::on-functions-change\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003einternal\u003c/td\u003e\n\u003ctd\u003eRefreshes the search catalog on the engine\u0026#39;s functions-available push.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::hint-preview\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003einternal\u003c/td\u003e\n\u003ctd\u003eThe exact hint text per exposure mode, for the configuration UI.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\u003cp\u003eLexical/Hybrid ranking pipeline:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eCorpus\u003c/strong\u003e: the live engine catalog (boot snapshot + push refresh),\nslimmed to name + first description sentence + argument names. \u003ccode class=\"readme-inline-code\"\u003eengine::\u003c/code\u003e\nids, functions published with \u003ccode class=\"readme-inline-code\"\u003emetadata.internal\u003c/code\u003e, and the search itself\nnever participate — the worker\u0026#39;s own public \u003ccode class=\"readme-inline-code\"\u003edirectory::*\u003c/code\u003e functions are\nsearchable like any other capability.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eScoring\u003c/strong\u003e: Okapi BM25 (k1 1.2, b 0.75) with the function name indexed at\n3× weight, camelCase segmentation (\u003ccode class=\"readme-inline-code\"\u003epresignUrl\u003c/code\u003e → presign + url), a\n22-word grammatical stoplist, conservative plural folding, JSON-key\nstripping from capability text, and a two-distinct-terms minimum match.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCapability queries\u003c/strong\u003e: each \u003ccode class=\"readme-inline-code\"\u003ecapabilities\u003c/code\u003e entry is ranked independently\nagainst its own leader and is authoritative. Include every currently unmet\nexternal capability once in the same call. Write every capability in\nEnglish, translating non-English requests while preserving proper names,\nURLs, and function ids. Requests to summarize provided text or content are\nignored. Results merge round-robin so every capability gets a candidate\nbefore any gets a rider.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePruning\u003c/strong\u003e: coverage-aware function floor (≥50% of the leader AND full\nterm coverage or ≥85% score) drops same-worker family riders; a\nnamespace-level floor (40% of the leader) drops trailing workers.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eRegistry search\u003c/strong\u003e (\u003ccode class=\"readme-inline-code\"\u003eregistry_search\u003c/code\u003e, default on): every call also\nconsults the private workers registry in-process with the same capability\nqueries plus informative-term retries (all concurrent; every listed worker\nis a candidate — the registry is team-authored). Candidates merge\nround-robin across search variants; their API references are pooled and\nranked per capability with the configured mode. Hybrid fuses BM25 with the\nMiniLM dense lane (same 0.30 admission floor as the installed catalog), so a capability sharing no\nvocabulary with a contract (\u0026quot;retrieve web news articles\u0026quot; → \u003ccode class=\"readme-inline-code\"\u003eweb::fetch\u003c/code\u003e)\nstill surfaces. Returns up to 2 workers / 6 candidates per batch of six\ncapabilities (so up to 6 workers / 18 candidates across three batches; a\nworker two batches both surface keeps one entry with its functions merged)\nthat WOULD match if installed, with \u003ccode class=\"readme-inline-code\"\u003ecompose::add\u003c/code\u003e guidance.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSession memory\u003c/strong\u003e (keyed by caller-supplied OTel baggage, fail-open):\nrepeat queries omit candidates already delivered.\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"judge-mode\" class=\"scroll-mt-20\"\u003eJudge mode\u003c/h3\u003e\n\u003cp\u003eFunction relevance is judged by the \u003ca href=\"../judge\"\u003e\u003ccode class=\"readme-inline-code\"\u003ejudge\u003c/code\u003e\u003c/a\u003e worker\n(\u003ccode class=\"readme-inline-code\"\u003ejudge::evaluate\u003c/code\u003e), which forwards to its configured provider\n(\u003ca href=\"../judge-typesafe\"\u003e\u003ccode class=\"readme-inline-code\"\u003ejudge-typesafe\u003c/code\u003e\u003c/a\u003e by default). Both are optional: this\nworker does not declare them as dependencies, because Compose turns a\ndependency into a \u003ccode class=\"readme-inline-code\"\u003estart_after\u003c/code\u003e edge and stops the directory whenever the\njudge exits. The Harness and dev-template stacks do not run them. Install the\nhub with \u003ccode class=\"readme-inline-code\"\u003eiii trigger compose::add worker=judge\u003c/code\u003e (it brings \u003ccode class=\"readme-inline-code\"\u003ejudge-typesafe\u003c/code\u003e)\nand set the TypeSafe key and model in the \u003cstrong\u003ejudge-typesafe\u003c/strong\u003e settings. This\nworker holds no credentials.\u003c/p\u003e\n\u003cp\u003e\u003ccode class=\"readme-inline-code\"\u003ejudge\u003c/code\u003e is the default mode for new installs. It ranks through the judge\nonly while \u003ccode class=\"readme-inline-code\"\u003ejudge::evaluate\u003c/code\u003e is in the live function catalog and answers.\n\u003cstrong\u003eWhenever the judge is unavailable the search uses Hybrid\u003c/strong\u003e (then Lexical if\nthe local model is not ready), for functions, installable workers, skills and\ntriggers alike:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode class=\"readme-inline-code\"\u003ejudge::evaluate\u003c/code\u003e is not registered: no call is made at all.\u003c/li\u003e\n\u003cli\u003ethe hub has no provider (\u003ccode class=\"readme-inline-code\"\u003eprovider_unavailable\u003c/code\u003e), or the provider has no\nAPI key (\u003ccode class=\"readme-inline-code\"\u003emissing_key\u003c/code\u003e): logged once at info.\u003c/li\u003e\n\u003cli\u003ea provider error, transport failure or invalid reply: logged once as a\nwarning.\u003c/li\u003e\n\u003cli\u003ethe judge deadline runs out: that lane alone uses Hybrid.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAfter an unavailable or failing judge (the second and third cases), every\nsearch skips it for 30 seconds and uses Hybrid, so a missing key costs one\nfast round trip per 30 s rather than one per search. A key added to\njudge-typesafe, or a judge that comes back, is used within 30 seconds. A\nmissed deadline does not pause the judge.\u003c/p\u003e\n\u003cp\u003eAn install that already stored \u003ccode class=\"readme-inline-code\"\u003efunction_search_mode: hybrid\u003c/code\u003e keeps it: the\nstored configuration wins over the new default. Set \u003ccode class=\"readme-inline-code\"\u003ejudge\u003c/code\u003e with\n\u003ccode class=\"readme-inline-code\"\u003econfiguration::set\u003c/code\u003e (or the console form) to opt in.\u003c/p\u003e\n\u003cpre class=\"shiki shiki-themes min-light vesper\" style=\"--shiki-light:#24292eff;--shiki-dark:#FFF;--shiki-light-bg:#ffffff;--shiki-dark-bg:#101010\" tabindex=\"0\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFC799\"\u003efunction_search_mode\u003c/span\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFF\"\u003e:\u003c/span\u003e\u003cspan style=\"--shiki-light:#22863A;--shiki-dark:#99FFE4\"\u003e judge\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFC799\"\u003efunction_search_judge_timeout_ms\u003c/span\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFF\"\u003e:\u003c/span\u003e\u003cspan style=\"--shiki-light:#1976D2;--shiki-dark:#FFC799\"\u003e 3000\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFC799\"\u003efunction_search_judge_min_relevance\u003c/span\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFF\"\u003e:\u003c/span\u003e\u003cspan style=\"--shiki-light:#1976D2;--shiki-dark:#FFC799\"\u003e 0.5\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFC799\"\u003efunction_search_judge_side_lane_min_relevance\u003c/span\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFF\"\u003e:\u003c/span\u003e\u003cspan style=\"--shiki-light:#1976D2;--shiki-dark:#FFC799\"\u003e 0.3\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFC799\"\u003efunction_search_judge_question\u003c/span\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFF\"\u003e:\u003c/span\u003e\u003cspan style=\"--shiki-light:#22863A;--shiki-dark:#99FFE4\"\u003e choice\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFC799\"\u003efunction_search_judge_choice_min_probability\u003c/span\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#FFF\"\u003e:\u003c/span\u003e\u003cspan style=\"--shiki-light:#1976D2;--shiki-dark:#FFC799\"\u003e 0.1\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThese fields apply without a restart. The timeout is an integer from 1 to\n30000 ms and relevance a finite number from 0 to 1 inclusive. YAML seeds and\nJSON configuration updates use the same validation. The relevance floors were\ncalibrated against \u003ccode class=\"readme-inline-code\"\u003ejev-1.13.0\u003c/code\u003e; judge-typesafe defaults to the \u003ccode class=\"readme-inline-code\"\u003ejev-latest\u003c/code\u003e\nalias, so pin its model if you rely on the floors.\u003c/p\u003e\n\u003cp\u003eThe judge scores a shortlist per capability, not the whole catalog. A corpus\nof at most 16 documents goes whole, so the judge still finds functions whose\nwording shares nothing with the capability. A larger one is cut to the top 16\nof raw BM25 fused with the raw MiniLM ranking (when the index is ready). Each\ncapability is one evaluation, and all capabilities of a lane (functions,\nregistry pool, skills or triggers) travel in one \u003ccode class=\"readme-inline-code\"\u003ejudge::evaluate\u003c/code\u003e call, so\nthe provider answers them together with one model, and cancels the rest when\none fails. Requests carry normalized capabilities, function IDs, short\ndescriptions and parameter names; no conversation history or argument values.\nExact eligible IDs, internal-function exclusions, session deduplication and\nresult limits stay local.\u003c/p\u003e\n\u003cp\u003e\u003ccode class=\"readme-inline-code\"\u003efunction_search_judge_question\u003c/code\u003e sets how each capability\u0026#39;s shortlist is\nasked. \u003ccode class=\"readme-inline-code\"\u003echoice\u003c/code\u003e (the default) asks one multiple-choice question per capability\nwhose options are the shortlisted documents: 16× fewer questions, and the\ndocuments compete. The best document is always kept and every other needs\n\u003ccode class=\"readme-inline-code\"\u003efunction_search_judge_choice_min_probability\u003c/code\u003e (the relevance floors do not\napply). \u003ccode class=\"readme-inline-code\"\u003enoul\u003c/code\u003e asks one yes/no question per document and admits each by the\nrelevance floors. Local judges need \u003ccode class=\"readme-inline-code\"\u003echoice\u003c/code\u003e to fit the deadline: judge-semif answers a\ncapability in about 0.3 s on a GPU, where the Noul shortlist of every lane\ntakes it past 30 s. On 22 English capabilities over the 16-document\nshortlist, \u003ccode class=\"readme-inline-code\"\u003echoice\u003c/code\u003e with 0.1 kept a correct function in every search for both\n\u003ccode class=\"readme-inline-code\"\u003ejev-1.13.0\u003c/code\u003e (precision 0.98, 1.2 functions per capability) and judge-semif\n(precision 0.87, 1.5 functions). Providers register their \u003ccode class=\"readme-inline-code\"\u003ejudge-\u003cprovider\u003e::*\u003c/code\u003e\nfunctions as internal, so search results show only the hub\u0026#39;s \u003ccode class=\"readme-inline-code\"\u003ejudge::*\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eWith \u003ccode class=\"readme-inline-code\"\u003echoice\u003c/code\u003e, a judge whose models advertise a context window under 4096\ntokens (\u003ccode class=\"readme-inline-code\"\u003econtext_window\u003c/code\u003e in \u003ccode class=\"readme-inline-code\"\u003ejudge::models::list\u003c/code\u003e, re-read when the judge\nhub\u0026#39;s configuration changes and at least once a minute)\ngets compact options instead of the full description objects: each option is\nkeyed by the function id and reads the first eight words of its description,\nand the state names the capability plainly (\u003ccode class=\"readme-inline-code\"\u003e{\"capability\": …}\u003c/code\u003e). laya (512 tokens) shares about 190 of them among\nthe sixteen options, so the objects cut the function ids themselves: live, it\nfound the expected function in 13/22 searches with objects and 17/22 compact.\nSemIf (16384) and judges that advertise no window keep the objects.\u003c/p\u003e\n\u003cp\u003e\u003ccode class=\"readme-inline-code\"\u003etournament\u003c/code\u003e skips the Hybrid shortlist, following TypeSafe\u0026#39;s skill-suggestion\npattern (skim everything cheaply, then read the few in detail). The whole\nfunction catalog, sorted by id, is skimmed in rounds of compact Choices (the\nfunction id and the first eight words of its description) over groups of up to\n128, or 16 for a judge that advertises a context window under 4096 tokens, and\nnever more than the judge\u0026#39;s advertised \u003ccode class=\"readme-inline-code\"\u003emax_options\u003c/code\u003e (SemIf: 16); each group\u0026#39;s\nthree best go on (only the winner, for a small-window judge, whose final Choice\ndegrades with more options) until 16 or fewer remain, and those get one final\nChoice with their full descriptions, admitted like \u003ccode class=\"readme-inline-code\"\u003echoice\u003c/code\u003e. A 260-function\ncatalog takes one round of three groups, then the final Choice over nine. It\nneeds no local semantic model. Live through \u003ccode class=\"readme-inline-code\"\u003edirectory::search_functions\u003c/code\u003e over\n22 English capabilities (RX 6900 XT), hit / top-1 / precision and median search\ntime: JEV 22 / 22 / 1.00 at 2.2 s, SemIf 22 / 22 / 0.90 at 6.1 s, decider 22 /\n21 / 0.88 at 3.7 s, laya 20 / 19 / 0.80 at 2.2 s; the former winner-only rounds\nof 16 gave JEV 22 / 22 / 0.98, decider 21 / 21 / 0.81 at 9.1 s, and timed SemIf\nout at 10 s. The installed functions and the registry pools play it; skills and\ntriggers keep their shortlists. With \u003ccode class=\"readme-inline-code\"\u003echoice\u003c/code\u003e (the default), a judge that\nadvertises a context window under 4096 tokens gets a tournament automatically;\nSemIf and hosted judges keep \u003ccode class=\"readme-inline-code\"\u003echoice\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003ccode class=\"readme-inline-code\"\u003efunction_search_model_path: null\u003c/code\u003e is valid in judge mode and makes the Hybrid\nfallback BM25-only, without the local-model warning. With a configured path,\nthe worker keeps an installed MiniLM bundle and its catalog index current,\ndownloads a missing bundle at boot like Hybrid does, and uses the index both\nfor the shortlist and for the fallback.\u003c/p\u003e\n\u003cp\u003eRegistry discovery still starts with the registry API\u0026#39;s lexical search. The\njudge evaluates a shortlist of the returned contract pool and \u003cstrong\u003ecannot recover\nworkers that upstream search did not return\u003c/strong\u003e. Installable results remain\nsuggestions until installation.\u003c/p\u003e\n\u003cp\u003eEvery response carries \u003ccode class=\"readme-inline-code\"\u003esearch_mode\u003c/code\u003e — the mode that actually ranked the\nresults (\u003ccode class=\"readme-inline-code\"\u003ejudge\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003ehybrid\u003c/code\u003e or \u003ccode class=\"readme-inline-code\"\u003elexical\u003c/code\u003e), which can be lower than the\nconfigured mode when the judge was unavailable or paused, or the local model\nis not loaded yet. The console\u0026#39;s search card shows it as the card\u0026#39;s badge. A\nsearch whose lanes partly fell back reports the highest tier any lane reached.\u003c/p\u003e\n\u003cp\u003eEvery mode also ranks the installed skill documents (the rows\n\u003ccode class=\"readme-inline-code\"\u003edirectory::skills::list\u003c/code\u003e serves, minus \u003ccode class=\"readme-inline-code\"\u003edisable_model_invocation\u003c/code\u003e ones) against\nthe same capabilities and lists the matches under \u003ccode class=\"readme-inline-code\"\u003eskills\u003c/code\u003e as\n\u003ccode class=\"readme-inline-code\"\u003e{ id, title, description }\u003c/code\u003e, at most six per call round-robin across the\ncapabilities, with a guidance note to read them through\n\u003ccode class=\"readme-inline-code\"\u003edirectory::skills::get { id }\u003c/code\u003e. Each skill\u0026#39;s id and a trimmed\n\u003ccode class=\"readme-inline-code\"\u003etitle: description\u003c/code\u003e (300 bytes) form the document. The judge judges them with\na how-to question under the same deadline as the functions; Lexical ranks them\nwith BM25 and Hybrid fuses in the dense lane, the same ad-hoc document ranking\nthe \u003ccode class=\"readme-inline-code\"\u003einstallable\u003c/code\u003e section uses, and that local ranking also serves whenever the\njudge fails. \u0026quot;Installed\u0026quot; is read off the live function catalog: a worker with\nno registered functions contributes no skills. The registered-trigger section\n(under \u003ccode class=\"readme-inline-code\"\u003etriggers\u003c/code\u003e) is ranked the same way in every mode.\u003c/p\u003e\n\u003cp\u003eA valid response with no functions at or above the relevance threshold stays\nempty. Judge failures instead trigger \u003cstrong\u003eJudge → Hybrid → Lexical\u003c/strong\u003e fallback.\nHybrid uses the existing local ranking policy; if the model is disabled,\nmissing, not yet indexed for the current catalog, or fails, Lexical serves the\nresults. A registry HTTP failure still omits the installable section.\u003c/p\u003e\n\u003cp\u003eThe judge deadline is shared by every judge call of one public search.\nCapability batches run concurrently, and each batch\u0026#39;s registry lookup runs in\nparallel with its installed-function judge call; the registry judge call then\ngets what is left of the deadline and, if nothing is, the pool is ranked\nlocally. Local Hybrid fallback runs outside the budget. Evaluations are split\nat local byte limits (48 KiB per evaluation, 16 KiB for state plus the largest\nquestion); these guards are not token counts. Retries are the provider\u0026#39;s\npolicy (judge-typesafe retries 408/429/5xx within the deadline); the 30-second\npause keeps a failing provider from being retried on every search. The hub\u0026#39;s\nreturned usage (\u003ccode class=\"readme-inline-code\"\u003estats\u003c/code\u003e) is logged per lane at debug level.\u003c/p\u003e\n\u003cp\u003eSwitch to \u003ccode class=\"readme-inline-code\"\u003elexical\u003c/code\u003e at any time to use BM25 only. Switching from \u003ccode class=\"readme-inline-code\"\u003elexical\u003c/code\u003e to\n\u003ccode class=\"readme-inline-code\"\u003ehybrid\u003c/code\u003e or \u003ccode class=\"readme-inline-code\"\u003ejudge\u003c/code\u003e prepares the local index from the current catalog. If the\nMiniLM bundle is missing, both use lexical fallback; the boot-time download and\nchanges to the local model path require a worker restart.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eUpgrading from the in-worker \u003ccode class=\"readme-inline-code\"\u003ejev\u003c/code\u003e mode:\u003c/strong\u003e the stored value\n\u003ccode class=\"readme-inline-code\"\u003efunction_search_mode: jev\u003c/code\u003e no longer parses, and the worker refuses to boot on\nit. While the old worker still runs, its schema only accepts\n\u003ccode class=\"readme-inline-code\"\u003elexical\u003c/code\u003e/\u003ccode class=\"readme-inline-code\"\u003ehybrid\u003c/code\u003e/\u003ccode class=\"readme-inline-code\"\u003ejev\u003c/code\u003e, so before upgrading set the mode to \u003ccode class=\"readme-inline-code\"\u003ehybrid\u003c/code\u003e (or\nremove the key) with \u003ccode class=\"readme-inline-code\"\u003econfiguration::set\u003c/code\u003e, then set \u003ccode class=\"readme-inline-code\"\u003ejudge\u003c/code\u003e once the new worker\nis up. The removed keys \u003ccode class=\"readme-inline-code\"\u003efunction_search_jev_api_key\u003c/code\u003e and\n\u003ccode class=\"readme-inline-code\"\u003efunction_search_jev_model\u003c/code\u003e are ignored, and the console form drops every\n\u003ccode class=\"readme-inline-code\"\u003efunction_search_jev_*\u003c/code\u003e key on its next save; the remaining settings are read\nunder their \u003ccode class=\"readme-inline-code\"\u003efunction_search_judge_*\u003c/code\u003e names only.\u003c/p\u003e\n\u003ch3 id=\"pre-generate-hint\" class=\"scroll-mt-20\"\u003ePre-generate hint\u003c/h3\u003e\n\u003cp\u003eThe pre-generate hook appends one \u003ccode class=\"readme-inline-code\"\u003e\u003cdiscovery_assist\u003e\u003c/code\u003e block pointing the\nmodel at \u003ccode class=\"readme-inline-code\"\u003esearch_functions\u003c/code\u003e, telling it to derive capabilities from the goal\nand current execution state and to batch selected ids through\n\u003ccode class=\"readme-inline-code\"\u003eengine::functions::info\u003c/code\u003e — at most once per turn, and only when every gate\nclears: the function is callable in the surface, no search result is in the\ncurrent task window yet, the surface spans at least \u003ccode class=\"readme-inline-code\"\u003ehint_min_workers\u003c/code\u003e distinct\nworkers, the current task (from the latest user message) has no real function\nresults yet, and it does not already name a callable function id. Measured on\n26 pre-existing e2e scenarios: an unconditional hint \u003cem\u003einduces\u003c/em\u003e redundant\ndiscovery on guided tasks (up to +110% tokens). The hook ships OFF by default\n(\u003ccode class=\"readme-inline-code\"\u003einject_hint: false\u003c/code\u003e): the harness identity prompt already teaches\n\u003ccode class=\"readme-inline-code\"\u003edirectory::search_functions\u003c/code\u003e as the default discovery path, so the hint is\nfor deployments running a custom identity prompt without that doctrine. The\nhook\u0026#39;s transcript annotations (\u003ccode class=\"readme-inline-code\"\u003eorigin.directory\u003c/code\u003e) carry only coarse\noutcome/reason and counts.\u003c/p\u003e\n\u003cp\u003eKnobs (\u003ccode class=\"readme-inline-code\"\u003einject_hint\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003ehint_min_workers\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003eregistry_search\u003c/code\u003e) live in the\n\u003ccode class=\"readme-inline-code\"\u003eiii-directory\u003c/code\u003e configuration entry and hot-apply — see Configuration.\u003c/p\u003e\n\u003ch2 id=\"custom-trigger-types\" class=\"scroll-mt-20\"\u003eCustom trigger types\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eTrigger type\u003c/th\u003e\n\u003cth\u003eFires when\u003c/th\u003e\n\u003cth\u003ePayload to subscribers\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::skills::on-change\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAfter a \u003ccode class=\"readme-inline-code\"\u003edirectory::skills::download\u003c/code\u003e that wrote at least one skill markdown file, a \u003ccode class=\"readme-inline-code\"\u003edirectory::skills::update\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003ecreate\u003c/code\u003e, or \u003ccode class=\"readme-inline-code\"\u003edelete\u003c/code\u003e, or external (file pasted/edited/deleted directly on disk — including under \u003ccode class=\"readme-inline-code\"\u003eagents_skills_folder\u003c/code\u003e)\u003c/td\u003e\n\u003ctd\u003edownload: \u003ccode class=\"readme-inline-code\"\u003e{ \"op\": \"download\", \"namespace\": \"\u003cns\u003e\", \"source\": \"repo\" | \"registry\" }\u003c/code\u003e; update/create/delete: \u003ccode class=\"readme-inline-code\"\u003e{ \"op\": \"\u003coperation\u003e\", \"namespace\": \"\u003cns\u003e\", \"id\": \"\u003cid\u003e\" }\u003c/code\u003e; external (file pasted/edited/deleted directly on disk): \u003ccode class=\"readme-inline-code\"\u003e{ \"op\": \"external\" }\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::system-prompts::on-change\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAfter a \u003ccode class=\"readme-inline-code\"\u003edirectory::skills::download\u003c/code\u003e that wrote at least one system prompt markdown file, a \u003ccode class=\"readme-inline-code\"\u003edirectory::system-prompts::update\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003ecreate\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003edelete\u003c/code\u003e, or external file change\u003c/td\u003e\n\u003ctd\u003edownload: \u003ccode class=\"readme-inline-code\"\u003e{ \"op\": \"download\", \"namespace\": \"\u003cns\u003e\", \"source\": \"repo\" | \"registry\" }\u003c/code\u003e; update/create/delete: \u003ccode class=\"readme-inline-code\"\u003e{ \"op\": \"\u003coperation\u003e\", \"name\": \"\u003cname\u003e\" }\u003c/code\u003e; external: \u003ccode class=\"readme-inline-code\"\u003e{ \"op\": \"external\" }\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode class=\"readme-inline-code\"\u003edirectory::agents::on-change\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAfter a \u003ccode class=\"readme-inline-code\"\u003edirectory::skills::download\u003c/code\u003e that wrote at least one agent profile, a \u003ccode class=\"readme-inline-code\"\u003edirectory::agents::update\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003ecreate\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003edelete\u003c/code\u003e, or external file change\u003c/td\u003e\n\u003ctd\u003edownload: \u003ccode class=\"readme-inline-code\"\u003e{ \"op\": \"download\", \"namespace\": \"\u003cns\u003e\", \"source\": \"repo\" | \"registry\" }\u003c/code\u003e; update/create/delete: \u003ccode class=\"readme-inline-code\"\u003e{ \"op\": \"\u003coperation\u003e\", \"name\": \"\u003cid\u003e\" }\u003c/code\u003e; external: \u003ccode class=\"readme-inline-code\"\u003e{ \"op\": \"external\" }\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\u003cp\u003eDispatches are fire-and-forget (Void), so the write path doesn\u0026#39;t\nblock on downstream latency.\u003c/p\u003e\n\u003cp\u003eThe \u003ccode class=\"readme-inline-code\"\u003eexternal\u003c/code\u003e op comes from a filesystem watch over \u003ccode class=\"readme-inline-code\"\u003eskills_folder\u003c/code\u003e,\n\u003ccode class=\"readme-inline-code\"\u003elocal_skills_folder\u003c/code\u003e, and (when it already exists) the read-only\n\u003ccode class=\"readme-inline-code\"\u003eagents_skills_folder\u003c/code\u003e. It is a doorbell, not a ledger: every read re-scans\ndisk, so a missed event costs a stale open view until the next call, never\ndata. A burst coalesces into one event per kind, and this worker\u0026#39;s own writes\nare suppressed — a \u003ccode class=\"readme-inline-code\"\u003ecreate\u003c/code\u003e or \u003ccode class=\"readme-inline-code\"\u003eupdate\u003c/code\u003e sends its precise op and never an\nextra \u003ccode class=\"readme-inline-code\"\u003eexternal\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eLoop hazard for subscribers.\u003c/strong\u003e Suppression covers writes made \u003cem\u003ethrough this\nworker\u003c/em\u003e. A subscriber that reacts to \u003ccode class=\"readme-inline-code\"\u003e{ \"op\": \"external\" }\u003c/code\u003e by writing \u003ccode class=\"readme-inline-code\"\u003e.md\u003c/code\u003e\nfiles under \u003ccode class=\"readme-inline-code\"\u003eskills_folder\u003c/code\u003e by some other route — a shell or coder worker, a\nscript — is not suppressed and will re-trigger itself. Either write through\n\u003ccode class=\"readme-inline-code\"\u003edirectory::*::update\u003c/code\u003e / \u003ccode class=\"readme-inline-code\"\u003ecreate\u003c/code\u003e, or make the reaction idempotent and gated.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"local-development-testing\" class=\"scroll-mt-20\"\u003eLocal development \u0026amp; testing\u003c/h2\u003e\n\u003ch3 id=\"run-from-source\" class=\"scroll-mt-20\"\u003eRun from source\u003c/h3\u003e\n\u003cp\u003eOn targets with a pinned static ONNX Runtime (Linux glibc x86_64/aarch64,\nApple Silicon macOS, Windows MSVC) every build links it and MiniLM retrieval\nand reranking are compiled in. With no \u003ccode class=\"readme-inline-code\"\u003eORT_LIB_PATH\u003c/code\u003e, \u003ccode class=\"readme-inline-code\"\u003eort-sys\u003c/code\u003e downloads the\nruntime for the build target at build time (SHA-256-verified). For offline or\ncached x86_64 Linux builds, provision it once and export the path it prints:\u003c/p\u003e\n\u003cpre class=\"shiki shiki-themes min-light vesper\" style=\"--shiki-light:#24292eff;--shiki-dark:#FFF;--shiki-light-bg:#ffffff;--shiki-dark-bg:#101010\" tabindex=\"0\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#A0A0A0\"\u003eexport\u003c/span\u003e\u003cspan style=\"--shiki-light:#24292EFF;--shiki-dark:#FFF\"\u003e ORT_LIB_PATH\u003c/span\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#A0A0A0\"\u003e=\u003c/span\u003e\u003cspan style=\"--shiki-light:#22863A;--shiki-dark:#99FFE4\"\u003e\"$(\u003c/span\u003e\u003cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#FFC799\"\u003escripts/provision-onnxruntime.sh\u003c/span\u003e\u003cspan style=\"--shiki-light:#22863A;--shiki-dark:#99FFE4\"\u003e)\"\u003c/span\u003e\u003cspan style=\"--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94\"\u003e # idempotent, SHA-256 verified\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#A0A0A0\"\u003eexport\u003c/span\u003e\u003cspan style=\"--shiki-light:#24292EFF;--shiki-dark:#FFF\"\u003e ORT_PREFER_DYNAMIC_LINK\u003c/span\u003e\u003cspan style=\"--shiki-light:#D32F2F;--shiki-dark:#A0A0A0\"\u003e=\u003c/span\u003e\u003cspan style=\"--shiki-light:#1976D2;--shiki-dark:#FFC799\"\u003e0\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOther targets (musl, armv7, Intel macOS) build the BM25-only worker and need\nnothing extra.\u003c/p\u003e\n\u003cpre class=\"shiki shiki-themes min-light vesper\" style=\"--shiki-light:#24292eff;--shiki-dark:#FFF;--shiki-light-bg:#ffffff;--shiki-dark-bg:#101010\" tabindex=\"0\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94\"\u003e# --config is an optional YAML seed (see config.yaml.example); omit it to\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94\"\u003e# rely on the value stored in the `configuration` worker (or built-in defaults).\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#FFC799\"\u003ecargo\u003c/span\u003e\u003cspan style=\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\"\u003e run\u003c/span\u003e\u003cspan style=\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\"\u003e --release\u003c/span\u003e\u003cspan style=\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\"\u003e --\u003c/span\u003e\u003cspan style=\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\"\u003e --url\u003c/span\u003e\u003cspan style=\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\"\u003e ws://127.0.0.1:49134\u003c/span\u003e\u003cspan style=\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\"\u003e --config\u003c/span\u003e\u003cspan style=\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\"\u003e ./config.yaml.example\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"tests\" class=\"scroll-mt-20\"\u003eTests\u003c/h3\u003e\n\u003cpre class=\"shiki shiki-themes min-light vesper\" style=\"--shiki-light:#24292eff;--shiki-dark:#FFF;--shiki-light-bg:#ffffff;--shiki-dark-bg:#101010\" tabindex=\"0\"\u003e\u003ccode\u003e\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94\"\u003e# Fast, offline — exercises the pure helpers (markdown / id validators\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94\"\u003e# / fs source) without needing an iii engine.\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#FFC799\"\u003ecargo\u003c/span\u003e\u003cspan style=\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\"\u003e test\u003c/span\u003e\u003cspan style=\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\"\u003e --lib\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94\"\u003e# Full BDD suite — requires an iii engine on ws://127.0.0.1:49134\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94\"\u003e# (or III_ENGINE_WS_URL). The git-backed download scenarios spin up\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94\"\u003e# a local fixture repo via `git init`; the registry-backed scenarios\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94\"\u003e# point a wiremock server at the worker's `registry_url` config.\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#FFC799\"\u003ecargo\u003c/span\u003e\u003cspan style=\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\"\u003e test\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94\"\u003e# One feature group at a time. Available tags:\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#C2C3C5;--shiki-dark:#8B8B8B94\"\u003e# @engine @read @download @download_repo @download_registry\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"line\"\u003e\u003cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#FFC799\"\u003ecargo\u003c/span\u003e\u003cspan style=\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\"\u003e test\u003c/span\u003e\u003cspan style=\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\"\u003e --test\u003c/span\u003e\u003cspan style=\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\"\u003e bdd\u003c/span\u003e\u003cspan style=\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\"\u003e --\u003c/span\u003e\u003cspan style=\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\"\u003e --tags\u003c/span\u003e\u003cspan style=\"--shiki-light:#2B5581;--shiki-dark:#99FFE4\"\u003e @download\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe BDD harness lives under \u003ca href=\"tests/\"\u003etests/\u003c/a\u003e. Feature files mirror the\nmodules in \u003ca href=\"src/functions/\"\u003esrc/functions/\u003c/a\u003e. Step definitions under\n\u003ca href=\"tests/steps/\"\u003etests/steps/\u003c/a\u003e drive each feature through the same\n\u003ccode class=\"readme-inline-code\"\u003eiii.trigger\u003c/code\u003e path the production binary uses.\u003c/p\u003e\n"])</script><script>self.__next_f.push([1,"31:[\"$\",\"div\",null,{\"className\":\"overflow-hidden rounded-xl border border-line bg-background\",\"children\":[[\"$\",\"div\",null,{\"className\":\"bg-panel flex min-h-11 items-center justify-between gap-x-3 border-b border-line px-5 sm:px-6\",\"children\":[[\"$\",\"span\",null,{\"className\":\"truncate font-mono text-[10px] uppercase tracking-[0.08em] text-muted-foreground\",\"children\":\"README.md\"}],[\"$\",\"div\",null,{\"className\":\"shrink-0\",\"children\":[\"$\",\"a\",null,{\"href\":\"https://api.workers.iii.dev/w/iii-directory/readme?version=1.2.38\",\"target\":\"_blank\",\"rel\":\"noreferrer\",\"className\":\"inline-flex items-center gap-x-1.5 text-[12px] font-medium text-muted-foreground transition-colors duration-150 hover:text-foreground\",\"children\":[[\"$\",\"span\",null,{\"children\":\"Open as markdown\"}],[\"$\",\"$L17\",null,{\"ref\":\"$undefined\",\"iconNode\":\"$19:props:children:1:props:children:0:props:children:props:children:2:props:iconNode\",\"className\":\"lucide-arrow-up-right size-3.5\",\"aria-hidden\":true}]]}]}]]}],[\"$\",\"div\",null,{\"className\":\"readme-prose px-5 py-6 sm:px-8 sm:py-7\",\"dangerouslySetInnerHTML\":{\"__html\":\"$47\"}}]]}]\n"])</script></body></html>