directory::__on_worker_added
Internal: auto-download skills on worker add event.
- workerstring
- okbooleanrequired
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.
iii trigger compose::add worker=iii-directoryRun in your project with the iii engine running. Exact versions are immutable and digest-pinned.
Internal: auto-download skills on worker add event.
Create a new agent profile at <agents_folder>/<id>.md from full-file markdown (frontmatter with a non-empty `name`, emoji-only `logo`, optional `skills:` preloads, `skills_index: false` to start sessions without the skills index, and `functions:` list of engine function ids to pre-load into sessions; the body is the system prompt and may be empty). Rejects ids or paths that already exist; a bundled id is shadowed.
Full file content, frontmatter included; `name` is required, the body is the system prompt and may be empty.
New profile id, used as the file stem; lowercase ASCII, digits, `-` and `_` only, and not already taken.
Bytes written.
File mtime after the write, RFC 3339.
Display name parsed from the (new) frontmatter.
Delete one existing agent profile's markdown file by id. Deleting the local shadow of a bundled profile falls back to the bundled copy; profiles that extend it stop resolving until fixed.
Existing agent profile id, as returned by `directory::agents::list`.
Add preloaded functions to one existing agent profile: appends the given engine function ids (e.g. `coder::tree`) to the profile's own `functions:` list — the contracts the harness pre-loads into the system prompt of every new session running as this profile. Ids already present are kept once; the rest of the file is untouched. Editing a bundled profile creates the local file that shadows it.
Engine function ids (e.g. `coder::tree`), verbatim, one per entry.
Existing agent profile id, as returned by `directory::agents::list`.
Ids this call actually added (already-present ids are not repeated).
Bytes on disk after the call.
The profile's OWN `functions:` list after the write (not resolved through `extends`), in file order.
File mtime after the call, RFC 3339.
Ids this call actually removed (absent ids are ignored).
True when the request changed nothing; the file was not rewritten.
Remove preloaded functions from one existing agent profile: drops the given engine function ids from the profile's own `functions:` list (ids not present are ignored); the rest of the file is untouched. Only the profile's OWN list is edited; ids inherited through `extends` stay (the resolved list is the union of the chain) and are removed on the parent.
Engine function ids (e.g. `coder::tree`), verbatim, one per entry.
Existing agent profile id, as returned by `directory::agents::list`.
Ids this call actually added (already-present ids are not repeated).
Bytes on disk after the call.
The profile's OWN `functions:` list after the write (not resolved through `extends`), in file order.
File mtime after the call, RFC 3339.
Ids this call actually removed (absent ids are ignored).
True when the request changed nothing; the file was not rewritten.
Fetch one agent profile by id: the system prompt resolved through its `extends` chain, display fields, preloaded `skills` (skill ids whose bodies the harness pre-loads into the session prompt) plus `unknown_skills`, preloaded `functions` (engine function ids the harness pre-loads into the session prompt) plus `unknown_functions`, model, reasoning_effort, `skills_index` (false = sessions start without the skills index), and `inheritance_error` when the chain does not resolve. Pass raw: true for the exact on-disk file to edit with directory::agents::update.
When true, also return the exact on-disk file (frontmatter included) as `raw`, ready for directory::agents::update.
Bundled with the worker, no file behind it (see `list`).
Harness subagent color token (closed set, validated at write time); `null` = neutral.
Example request for the chat's empty composer (see `list`): this profile's own value, never inherited; omitted when absent or blank.
Parent profile id (`extends:`), as declared; `null` = none.
Preloaded functions, resolved through `extends` (the nearest profile with a non-empty list): engine function ids whose contracts the harness pre-loads into the system prompt of every session running as this profile, so the model calls them without discovery or a contract lookup. Empty = none.
Hidden from the chat's new-session gallery (still selectable by id).
Harness subagent icon token (closed set, validated at write time); `null` = caller picks.
Set when the `extends` chain does not resolve (unknown parent, loop, deeper than 8): `system_prompt` and the inherited fields then come from this file alone, `raw` still round-trips so the chain can be fixed, and the harness refuses to run the profile meanwhile.
Model id for sessions using this profile, resolved through `extends`; `null` = the send decides. Served verbatim — resolution against the live model catalog happens where it is used.
File mtime as RFC 3339; empty for a bundled profile.
FULL on-disk file content (this profile's own file, ancestors excluded). Present only when the request set `raw: true`.
Provider-native reasoning effort paired with `model`, resolved through `extends`; `null` = the model/provider default. Served verbatim and validated at use time.
Preloaded skills, resolved through `extends` (the union of the chain's lists, root first): skill ids whose bodies the harness pre-loads into the system prompt of every session running as this profile. Empty = none. Never a filter on the skills index.
`false` = sessions running as this profile start without the names-only skills index (`<available_skills>`), resolved through `extends`; omitted when no profile in the chain sets it (on).
Where the file came from (see `list`).
Owning kit (`<handle>/<name>`) when `kind` is `kit`.
The file differs from what its kit or worker wrote.
Version of the kit or worker that wrote the file.
Owning worker when `kind` is `worker`.
The RESOLVED identity: every ancestor's body root-first, then this file's body, frontmatter stripped, joined by a blank line; blank bodies are skipped, so a profile with no prompt of its own serves its parent chain unchanged and a prompt-less profile without `extends` serves `""`. A profile that has a body and no `extends` serves that body verbatim.
`functions` entries the engine does not currently know (not registered right now, or a typo). Warnings — the profile still loads and the harness skips them; an empty list also results when the engine could not be asked.
`skills` entries that resolve to no currently visible skill. Warnings — the agent profile still loads and the harness renders them as unavailable.
List agent profiles (id, name, description, logo, icon, color, model, reasoning_effort, skill_count, function_count, extends, hidden, composer_placeholder, source, modified_at) from the agents folder plus the bundled ones (`builtin: true`). `source` says where each file came from: kit, worker, local, global or builtin. Inherited fields resolve through `extends` (composer_placeholder never inherits); skill_count null means no preloaded skills, function_count counts the preloaded functions (contracts injected into new sessions).
Bundled with the worker, no file behind it: editing it creates the local file (which then shadows this entry); there is nothing to delete.
Harness subagent color token for display identities; `null` = neutral.
Example request for the chat's empty composer, from this profile's OWN frontmatter (never inherited through `extends`); omitted when absent or blank. Presentation only — never part of the prompt.
Parent profile id (`extends:`), as declared; `null` = none.
Number of preloaded functions (contracts the harness pre-loads into the session prompt), resolved through `extends`; `0` = none.
Hidden from the chat's new-session gallery (still selectable by id).
Harness subagent icon token for spawn display identities; `null` = caller picks.
Flat agent profile id (the file stem) — what `harness::send { options: { agent } }` will take.
Set when the `extends` chain does not resolve (unknown parent, loop, too deep): the row carries the profile's own fields only, and the harness refuses to run it until the chain is fixed.
Emoji logo, `null` when the agent profile has none.
Model id for sessions using this profile, resolved through `extends`; `null` = the send decides.
File mtime as RFC 3339; empty for a bundled profile.
Display name from frontmatter (`name:`).
Provider-native reasoning effort paired with `model`, resolved through `extends`; `null` = the model/provider default.
Number of preloaded skills (bodies the harness pre-loads into the session prompt), resolved through `extends`; `null` = none.
Where the file came from: an installed kit (`kits.lock`), a worker's skills bundle (its completion marker), the project itself (`local`), the user-global root (`global`) or the worker binary (`builtin`). `modified` says whether a kit's or worker's file was edited here.
Owning kit (`<handle>/<name>`) when `kind` is `kit`.
The file differs from what its kit or worker wrote.
Version of the kit or worker that wrote the file.
Owning worker when `kind` is `worker`.
Overwrite one existing agent profile with full-file markdown (frontmatter with a non-empty `name`, emoji-only `logo`, optional `skills:` and `functions:` lists and `skills_index`; the body is the system prompt and may be empty). Updating a bundled profile creates a local file that shadows it. To change only the preloaded functions, prefer directory::agents::functions::add / remove.
FULL new file content, frontmatter block included — the string `directory::agents::get { raw: true }` returns, edited.
Existing agent profile id, as returned by `directory::agents::list`.
Bytes written.
File mtime after the write, RFC 3339.
Display name parsed from the (new) frontmatter.
Plan the install of a kit — agent profiles, skills and registry workers published as <author>/<kit>[@version|tag|range] — without writing anything; an installed kit gets an update plan. The plan lists every file, collisions with existing profiles (kit profiles win, with a warning), worker changes and the functions the profiles preload. Review it in the ADE (Directory → Kits) or apply it with directory::kits::apply plan_id=…. apply=true applies at once only when the plan has no warnings, blocks or pending decisions.
Apply right away when the plan has no warnings, no blocking issue and no file that needs a decision (for scripts). Otherwise the plan waits for review.
`<author>/<kit>`, optionally `@<version|tag|range>` (default: the installed kit's `requested`, else `latest`).
One sentence for a terminal user.
`major` | `minor` | `patch` | `prerelease` (update).
Files whose `default` is `null`.
Kit profile frontmatter (agents; the side this plan installs, or the removed one).
Frontmatter changes versus the installed version (modified agents).
Scalar fields that changed: `field → [from, to]`.
Content hash the kit installed (the merge base).
The owner's copy was edited locally.
Who owns the file at the path today.
sha256 of the file there now.
Applied when the caller decides nothing; `null` = a decision is required.
Agent profile id, or skill id.
What the file is on disk right now, relative to the plan.
One-line explanation for the review.
Choices the apply accepts for this file.
Content hash of the local file when the plan was made.
Logical install path (`agents/<id>.md`, `skills/<handle>/<kit>/…`).
Skill frontmatter (skills).
The lock says the user kept someone else's file here.
Path inside the kit (`agents/<id>.md`, `skills/…`).
Content hash of the kit's version this plan installs.
Installed version (update, remove).
Functions the kit's profiles preload, with the worker that provides each.
The kit's page in the registry web app.
What was asked for (tag, version or range) — stored in the lock.
Where a human reviews it.
Version this plan installs (install, update).
`version:` selector in the compose file.
Version Compose has installed.
The operator's `path://` build; kits never manage it.
Range the kit declares (absent for a worker the kit dropped).
Range the installed kit version declared.
Version the range resolves to in the registry today.
Worker type (`binary`, `image`, …).
Other installed kits that declare this worker.
Agent profile ids this kit now provides.
Files left as they are (kept, skipped, or mine).
`workers` | `files` | `lock`.
Read full detail for one engine function: schemas, owning worker, and registered triggers that target it. Proxies to the engine's native engine::functions::info.
Fully-qualified function id on the bus (e.g. `sandbox::create`).
Internal: the exact search-hint text per exposure mode, for the configuration UI.
Apply a kit plan from directory::download-kit / plan-update / remove: re-checks the project, downloads the kit (counted), adds or moves its workers through Compose, writes the files atomically and records kits.lock last. decisions maps install paths to overwrite|keep|kit|mine|merged|remove (or {choice: merged, content}); files left out take the plan's default. If the project changed since the plan, nothing is applied and a fresh plan comes back (status replanned).
Per-file choices by install path: `"overwrite" | "keep" | "kit" | "mine" | "merged" | "remove"`, or `{ "choice": "merged", "content": "…" }`. Files left out take the plan's `default`.
Workers the kit no longer declares (update) or declares (removal) to remove from the compose file. Never removed otherwise.
One sentence for a terminal user.
`major` | `minor` | `patch` | `prerelease` (update).
Files whose `default` is `null`.
Kit profile frontmatter (agents; the side this plan installs, or the removed one).
Frontmatter changes versus the installed version (modified agents).
Scalar fields that changed: `field → [from, to]`.
Content hash the kit installed (the merge base).
The owner's copy was edited locally.
Who owns the file at the path today.
sha256 of the file there now.
Applied when the caller decides nothing; `null` = a decision is required.
Agent profile id, or skill id.
What the file is on disk right now, relative to the plan.
One-line explanation for the review.
Choices the apply accepts for this file.
Content hash of the local file when the plan was made.
Logical install path (`agents/<id>.md`, `skills/<handle>/<kit>/…`).
Skill frontmatter (skills).
The lock says the user kept someone else's file here.
Path inside the kit (`agents/<id>.md`, `skills/…`).
Content hash of the kit's version this plan installs.
Installed version (update, remove).
Functions the kit's profiles preload, with the worker that provides each.
The kit's page in the registry web app.
What was asked for (tag, version or range) — stored in the lock.
Where a human reviews it.
Version this plan installs (install, update).
`version:` selector in the compose file.
Version Compose has installed.
The operator's `path://` build; kits never manage it.
Range the kit declares (absent for a worker the kit dropped).
Range the installed kit version declared.
Version the range resolves to in the registry today.
Worker type (`binary`, `image`, …).
Other installed kits that declare this worker.
Agent profile ids this kit now provides.
Files left as they are (kept, skipped, or mine).
`workers` | `files` | `lock`.
Ask the registry whether installed kits (or one) have a newer release matching what they were installed with. Ignored versions are skipped. Also runs at boot and every 6 hours.
Check only this installed kit (default: every installed kit).
Installed kits with an update to offer.
Why the last check could not reach the registry, if it could not.
Newest version satisfying `requested`, unless the user ignored it.
`available` would be this version, but the user ignored it.
The two sides of an installed kit file: `base` (what the kit installed, from the registry) and `local` (the file on disk), for a "view my changes" diff.
Installed kit, `<author>/<kit>`.
Install path from `directory::kits::get` (`agents/<id>.md`, `skills/…`).
What the kit installed (the lock's base), from the registry; `null` when the registry does not have it.
The file on disk, `null` when it is missing.
Local state of an installed file relative to its lock entry.
Discard a pending kit plan.
One installed kit: every file with its state (intact, edited, missing, skipped), its workers as Compose has them, and with registry=true the installed version's detail and README.
Installed kit, `<author>/<kit>`.
Also fetch the installed version's registry detail and README.
Registry detail of the installed version, when reachable.
Agent id, or the skill id.
sha256 on disk, `null` when missing.
Base sha256 from the lock.
Local state of an installed file relative to its lock entry.
Plans of this kit waiting for review.
Newest version satisfying `requested`, unless the user ignored it.
`available` would be this version, but the user ignored it.
Workers as Compose has them now.
Skip (or, with ignore=false, stop skipping) one version of an installed kit in update checks; recorded in kits.lock ignored_versions.
`false` takes the version back off the list (default `true`).
Installed kit, `<author>/<kit>`.
Version to skip in update checks.
Installed kits (version, file states, worker ranges, available update) and the plans waiting for review. `attention` counts both.
Pending plans plus available updates: what the Kits badge counts.
Plans of this kit waiting for review.
Newest version satisfying `requested`, unless the user ignored it.
`available` would be this version, but the user ignored it.
Pending plans (summaries).
Read a pending kit plan, with contents=true the file bodies it refers to (kit blobs by sha256, local files and merge results by install path).
Include file bodies (`blobs` by sha256, `ours` and `merged` by path).
File bodies the plan refers to; only with `contents=true`.
Kit blobs by sha256 (theirs and bases).
Three-way merge results, by install path.
Local file bodies when the plan was made, by install path.
`major` | `minor` | `patch` | `prerelease` (update).
Files whose `default` is `null`.
Kit profile frontmatter (agents; the side this plan installs, or the removed one).
Frontmatter changes versus the installed version (modified agents).
Scalar fields that changed: `field → [from, to]`.
Content hash the kit installed (the merge base).
The owner's copy was edited locally.
Who owns the file at the path today.
sha256 of the file there now.
Applied when the caller decides nothing; `null` = a decision is required.
Agent profile id, or skill id.
What the file is on disk right now, relative to the plan.
One-line explanation for the review.
Choices the apply accepts for this file.
Content hash of the local file when the plan was made.
Logical install path (`agents/<id>.md`, `skills/<handle>/<kit>/…`).
Skill frontmatter (skills).
The lock says the user kept someone else's file here.
Path inside the kit (`agents/<id>.md`, `skills/…`).
Content hash of the kit's version this plan installs.
Installed version (update, remove).
Functions the kit's profiles preload, with the worker that provides each.
The kit's page in the registry web app.
What was asked for (tag, version or range) — stored in the lock.
Where a human reviews it.
Version this plan installs (install, update).
`version:` selector in the compose file.
Version Compose has installed.
The operator's `path://` build; kits never manage it.
Range the kit declares (absent for a worker the kit dropped).
Range the installed kit version declared.
Version the range resolves to in the registry today.
Worker type (`binary`, `image`, …).
Other installed kits that declare this worker.
`workers` | `files` | `lock`.
Install path → sha written (or `""` for a deletion) by an earlier, interrupted attempt. Re-validation accepts these as expected.
Plan the update of an installed kit to `version` (default: the newest release matching what it was installed with). Files you edited are merged three-way; conflicts need a decision before directory::kits::apply.
Installed kit, `<author>/<kit>`.
Target version, tag or range (default: what the kit was installed with).
One sentence for a terminal user.
`major` | `minor` | `patch` | `prerelease` (update).
Files whose `default` is `null`.
Kit profile frontmatter (agents; the side this plan installs, or the removed one).
Frontmatter changes versus the installed version (modified agents).
Scalar fields that changed: `field → [from, to]`.
Content hash the kit installed (the merge base).
The owner's copy was edited locally.
Who owns the file at the path today.
sha256 of the file there now.
Applied when the caller decides nothing; `null` = a decision is required.
Agent profile id, or skill id.
What the file is on disk right now, relative to the plan.
One-line explanation for the review.
Choices the apply accepts for this file.
Content hash of the local file when the plan was made.
Logical install path (`agents/<id>.md`, `skills/<handle>/<kit>/…`).
Skill frontmatter (skills).
The lock says the user kept someone else's file here.
Path inside the kit (`agents/<id>.md`, `skills/…`).
Content hash of the kit's version this plan installs.
Installed version (update, remove).
Functions the kit's profiles preload, with the worker that provides each.
The kit's page in the registry web app.
What was asked for (tag, version or range) — stored in the lock.
Where a human reviews it.
Version this plan installs (install, update).
`version:` selector in the compose file.
Version Compose has installed.
The operator's `path://` build; kits never manage it.
Range the kit declares (absent for a worker the kit dropped).
Range the installed kit version declared.
Version the range resolves to in the registry today.
Worker type (`binary`, `image`, …).
Other installed kits that declare this worker.
Agent profile ids this kit now provides.
Files left as they are (kept, skipped, or mine).
`workers` | `files` | `lock`.
Plan the removal of an installed kit: its files (edited ones are kept unless chosen) and, only if ticked in apply's remove_workers, its workers. Apply with directory::kits::apply.
Installed kit, `<author>/<kit>`.
One sentence for a terminal user.
`major` | `minor` | `patch` | `prerelease` (update).
Files whose `default` is `null`.
Kit profile frontmatter (agents; the side this plan installs, or the removed one).
Frontmatter changes versus the installed version (modified agents).
Scalar fields that changed: `field → [from, to]`.
Content hash the kit installed (the merge base).
The owner's copy was edited locally.
Who owns the file at the path today.
sha256 of the file there now.
Applied when the caller decides nothing; `null` = a decision is required.
Agent profile id, or skill id.
What the file is on disk right now, relative to the plan.
One-line explanation for the review.
Choices the apply accepts for this file.
Content hash of the local file when the plan was made.
Logical install path (`agents/<id>.md`, `skills/<handle>/<kit>/…`).
Skill frontmatter (skills).
The lock says the user kept someone else's file here.
Path inside the kit (`agents/<id>.md`, `skills/…`).
Content hash of the kit's version this plan installs.
Installed version (update, remove).
Functions the kit's profiles preload, with the worker that provides each.
The kit's page in the registry web app.
What was asked for (tag, version or range) — stored in the lock.
Where a human reviews it.
Version this plan installs (install, update).
`version:` selector in the compose file.
Version Compose has installed.
The operator's `path://` build; kits never manage it.
Range the kit declares (absent for a worker the kit dropped).
Range the installed kit version declared.
Version the range resolves to in the registry today.
Worker type (`binary`, `image`, …).
Other installed kits that declare this worker.
Agent profile ids this kit now provides.
Files left as they are (kept, skipped, or mine).
`workers` | `files` | `lock`.
Internal: reload tunable iii-directory settings from the authoritative configuration when it changes.
Internal: refresh the search catalog after the engine function set changes.
Internal: inject the conditional search hint into one harness generation.
How the harness exposes functions to the model for this generation. Absent on harnesses that predate the field, which only ever exposed through agent_trigger by default.
The durable transcript row for one hook pass. Coarse by design: outcome, reason, and counts only — no prompts, messages, tool contracts, session ids, or timings ever leave the hook.
Ephemeral tail messages for this generation only. The hint rides here rather than as a system-prompt mutation: the system prompt is the provider's first input item, and a once-per-turn append there invalidated the entire prompt-cache prefix twice per turn.
Preview one registry worker before installing: envelope (version, kind, dependencies, config), its public function and trigger names with descriptions, and skill file paths. Schemas are omitted — install, then read contracts with engine::functions::info. Pass `readme: true` for the README prose; `version` or `tag` (default tag "latest").
Worker name in the registry (e.g. `"resend"`).
Include the README markdown (10–25 KB for most workers). Off by default: the card is for judging fit before `compose::add`; the README is for setup prose and examples.
Mutually exclusive with `tag`. If neither is provided we fall back to `tag: "latest"`.
Same shape as `directory::registry::workers::list` rows (and the engine's `engine::workers::list` rows for the shared core fields).
Profile picture URL. `null` when the author hasn't uploaded one.
Free-form runtime configuration block from the publish payload.
Container image tag, populated only for `type=image` workers.
Worker kind — `binary`, `image`, or `engine`.
Latest published version (worker-list) or the resolved version (worker-info, when called with `version` / `tag`).
List workers from the public registry, optionally filtered by fuzzy `search` (default order: downloads). Cursor-paginated: pass back `pagination.next_cursor` as `cursor`.
Cursor from a previous call's `pagination.next_cursor`; omit for the first page.
Optional free-text query, fuzzy-matched by the registry; omitted means ordered by downloads.
Pagination envelope returned alongside a worker-list page. Mirrors the OpenAPI `Pagination` schema.
Opaque cursor for the next page. `null` on the last page.
Server-authored page size. The client cannot override this.
Profile picture URL. `null` when the author hasn't uploaded one.
Free-form runtime configuration block from the publish payload.
Container image tag, populated only for `type=image` workers.
Worker kind — `binary`, `image`, or `engine`.
Latest published version (worker-list) or the resolved version (worker-info, when called with `version` / `tag`).
Search available functions for the unmet external capabilities of a step (usually one to six, at most eighteen per call); returns compact function-id candidates grouped by worker, plus matching installed skill documents under `skills` and registered trigger bindings under `triggers`.
Non-empty capability searches derived from the goal and current execution state, usually one to six and at most eighteen per call (searched in batches of six). For one search at each decision point, include all unmet external capabilities once. Exclude intrinsic reasoning, summarization, planning, or formatting, and do not repeat needs already represented or satisfied. Requests to summarize provided text or content are ignored. Write every entry in English, translating non-English user requests while preserving proper names, URLs, and function IDs.
Matching workers from the private registry. Their functions are NOT callable until the worker is installed.
Compact candidates only. If the remaining task needs these functions, reuse their IDs and fetch the required contracts through `engine::functions::info`.
First description sentence, capped at 160 bytes.
The `compose::add` target and payload; agent-trigger callers add `description`.
The search mode that actually produced these results: `judge`, `hybrid` or `lexical`. It can be lower than the configured mode when a batch fell back (judge worker absent or failing, or no local model).
Installed skill documents matching the capabilities. Read one with `directory::skills::get { id }` before acting on it.
First description sentence, capped at 160 bytes.
Pass to `directory::skills::get { id }` to read the document.
Registered trigger bindings matching the capabilities: what already fires, schedules, or hooks a function for them.
The binding's configuration (cron expression, hook filters, …).
The function the trigger runs; inspect it with `engine::functions::info`.
First description sentence, capped at 160 bytes.
Create a new skill at <skills_folder>/<id>.md from full-file markdown (frontmatter optional, non-empty body). Rejects ids or paths that already exist, including system-installed skills. Use directory::skills::update to edit existing skills.
Full file content, frontmatter optional; only the size cap and a non-empty body are enforced.
New skill id, used as the file path under skills_folder (`/`-separated segments of `[a-z0-9_-]`), not already taken.
Bytes written.
Frontmatter `function_id:` of the content, `null` when absent.
The created skill's id (normalized form of the input id).
File mtime after the write, RFC 3339.
Title resolved from the content (frontmatter `title:`, then `name:`, then body H1, then the id) — what `list` rows will show.
Frontmatter `type:` of the content, `null` when absent.
Delete one existing skill's markdown file by id (same id forms as directory::skills::get); refuses read-only system-installed skills.
Existing skill id — the same forms `directory::skills::get` accepts (bare id, `<id>.md`, `SKILL(S).md`, `iii://<id>`).
Id of the skill whose file was removed — the RESOLVED on-disk id (e.g. `ns/index` for input `ns`), not the input form.
Download skills into skills_folder from exactly one source: {repo, skill, branch?} clones a GitHub skill folder; {worker, version?|tag?} pulls from the workers registry. Prefer the explicit download_from_registry / download_from_repo.
Source A: branch to clone. Defaults to `"main"`. Pass `"master"` (or any other branch name) for repos whose default branch is not `main`.
Source A: GitHub repo URL. Pair with `skill`.
Source A: subfolder under `skills/` inside the repo. Doubles as the destination namespace inside `skills_folder`.
Registry tag to pull (default `latest`); mutually exclusive with `version`.
Source B: explicit semver to pull. Mutually exclusive with `tag`.
Source B: workers registry name. Pair with exactly one of `version` / `tag`.
Agent profiles the bundle ships but an installed kit owns: left as the kit wrote them (kit profiles take precedence).
The owning kit, `<handle>/<name>`.
Download one worker's directory bundle from the workers registry into skills_folder. `worker` is required; pass `version` (exact semver) or `tag` (default "latest"), not both. Files are overwritten file-by-file.
Registry tag to pull (e.g. `"latest"`). Mutually exclusive with `version`. Defaults to `"latest"` when neither is provided.
Explicit semver to pull. Mutually exclusive with `tag`.
Worker name in the registry (e.g. `"shell"`).
Agent profiles the bundle ships but an installed kit owns: left as the kit wrote them (kit profiles take precedence).
The owning kit, `<handle>/<name>`.
Download one skill folder from a GitHub repo into skills_folder: `repo` (https/ssh/git@ URL) and `skill` (subfolder under `skills/`, also the destination namespace) are required; `branch` defaults to "main".
Branch to clone. Defaults to `"main"`.
GitHub repo URL (validated: https / ssh / git@ only).
Subfolder under `skills/` inside the repo. Doubles as the destination namespace inside `skills_folder`.
Agent profiles the bundle ships but an installed kit owns: left as the kit wrote them (kit profiles take precedence).
The owning kit, `<handle>/<name>`.
Fetch one skill by id and return its raw markdown body plus id, title, type, function_id, and modified_at. A worker overview is addressed by the bare worker name; `<id>.md` and `iii://<id>` forms are accepted. On a miss, D110 names the closest ids.
Skill id as returned by directory::skills::list (e.g. `directory/skills/list`); `<id>.md` and `iii://<id>` forms are accepted.
When true, also return the exact on-disk file (frontmatter included) as `raw`, ready for directory::skills::update.
Raw markdown body (post-frontmatter) from disk. Note: there is no `description` field. `description` is the body's first paragraph, which is already inside `body` — every caller asking for the body would otherwise pay for the prefix twice. Use `directory::skills::list` rows when you want the teaser without the full body.
Whether model-facing indexes should omit this skill from invocation candidates.
Frontmatter `function_id:` when present — the canonical bus function id this skill documents (e.g. `sandbox::create`). The response's `id` field is the SKILL path on disk; `function_id` is what the agent should pass to `agent_trigger`. `null` when the skill isn't 1:1 with a single function.
File mtime as RFC 3339.
Absolute on-disk path of the skill file. Its parent directory is the skill's base directory — where payload the body references by relative path (`scripts/`, `reference/`, agent-skills convention) lives. Only meaningful to callers sharing this worker's filesystem (shell/file tools on the same machine).
FULL on-disk file content (frontmatter block included). Present only when the request set `raw: true`. This is the exact string to hand back to `directory::skills::update`; fallback notes that `get` may prepend to `body` are never added here.
Frontmatter `title:` when present and non-empty, otherwise the first `# H1` line in the body, otherwise the bare `id`.
Frontmatter `type:` (e.g. `index`, `how-to`, `reference`). `null` when the file has no frontmatter or omits the key.
Read a per-worker overview: one markdown block per installed worker (title, first paragraph, and the directory::skills::get call for the reference). For per-skill rows use directory::skills::list.
Rendered markdown document — one short `## <title>` block per installed worker (each worker's root overview doc, whether or not it declares frontmatter `type: index`), carrying the worker's first-paragraph overview and a `directory::skills::get` call to read the full reference. Sorted lex by id.
Number of worker entries rendered (i.e. the count of worker overview rows that survived the filter). Cheap sanity check that doesn't require re-parsing the body.
List skills, one row per skill (id, title, type, function_id, description, bytes, modified_at). Filters: `search` (substring on id/title/description), `prefix` (worker namespace), `type`; `include_description: false` for lighter rows. Pass a row's `function_id`, not its `id`, to agent_trigger.
When `false`, the response omits the first-paragraph `description` field on every row. Useful for token-light pickers that only need `id` + `title` + `type`. Default `true`.
Exact prefix match against `id`. Combine with `search` to scope a fuzzy match to one worker namespace, e.g. `prefix: "sandbox/"`.
Case-insensitive substring match against `id`, `title`, and (when `include_description` is true) the first body paragraph. Omitted rows are filtered out cheaply on the FsSkill { id } pass before the per-file frontmatter read, so a narrowed list is dramatically cheaper for the caller than the unfiltered one.
Exact match against the frontmatter `type:` field (`index`, `how-to`, `reference`, ...). `null` for entries with no frontmatter `type:`.
First paragraph of the body, empty when the file has only headings. Also empty when the caller passed `list { include_description: false }` for a token-light row.
Whether model-facing indexes should omit this skill from invocation candidates.
Frontmatter `function_id:` when present — the canonical bus function id this skill documents (e.g. `sandbox::create`). The row's `id` field is the SKILL path on disk (e.g. `sandbox/skills/sandbox/create`); `function_id` is what an agent should pass to `agent_trigger`. `null` for skills that aren't 1:1 with a single function (index/reference).
File mtime as RFC 3339 (best effort; empty if unavailable).
Frontmatter `title:` when present and non-empty, otherwise the first `# H1` line in the body, otherwise the bare `id`.
Frontmatter `type:` (e.g. `index`, `how-to`, `reference`). `null` when the file has no frontmatter or omits the key.
Overwrite one existing skill with full-file markdown (pass back the `raw` from directory::skills::get { raw: true }, edited). Never creates files; refuses read-only system-installed skills.
FULL new file content, frontmatter block included — the string `directory::skills::get { raw: true }` returns, edited.
Skill id to overwrite (same forms directory::skills::get accepts); the file must already exist.
Bytes written.
Frontmatter `function_id:` of the new content, `null` when absent.
The id that was updated (normalized form of the input id).
File mtime after the write, RFC 3339.
Title resolved from the NEW content (frontmatter `title:`, then body H1, then the id) — what `list` rows will now show.
Frontmatter `type:` of the new content, `null` when absent.
Create a new system prompt at <skills_folder>/system-prompts/<name>.md from full-file markdown (non-empty frontmatter `description` required; a declared `name` must match). Rejects names or paths that already exist.
Full file content, frontmatter included; `description` is required and a declared `name` must match.
New system prompt name, used as the file stem; same charset as listed names and not already taken.
Bytes written.
Description parsed from the frontmatter.
File mtime after the write, RFC 3339.
The created system prompt's name (as requested).
Permanently delete one EXISTING filesystem-backed system prompt by name. Resolves against the same merged scan as directory::system-prompts::list, removes only that prompt's markdown file, and fans out directory::system-prompts::on-change with { op: "delete" }.
Existing system prompt name, as returned by `directory::system-prompts::list`.
Name of the system prompt whose file was removed.
Fetch one system prompt by name — a filesystem-backed entry, or a worker-bundled one (`builtin: true`) when no local file shadows it. Returns the raw markdown body plus name, description, and modified_at — no envelope, no templating.
When `true`, the response includes the full on-disk file content (frontmatter included) as `raw`, ready for `directory::system-prompts::update`.
Served from the copy bundled with the worker (no local file yet): an update creates the local file.
List system prompts (name, description, modified_at) from skills_folder's `system-prompts/` plus the ones bundled with this worker (`builtin: true` until a local file shadows one).
Bundled with the worker, no file behind it: editing it creates the local file (which then shadows this entry); there is nothing to delete.
Overwrite one existing system prompt with full-file markdown; the frontmatter must keep a non-empty `description`. Updating a bundled prompt (`builtin: true`) creates a local file that shadows it. Returns the effective name (frontmatter `name:` wins over the file stem).
Full file content, frontmatter included; `description` must stay non-empty.
System prompt name to overwrite, as listed; a bundled prompt (`builtin: true`) is copied to a local file first.
Bytes written.
Description parsed from the new frontmatter.
File mtime after the write, RFC 3339.
The system prompt's EFFECTIVE name after the write: the new frontmatter `name:` when declared, otherwise the file stem. Differs from the input name when the update renames the system prompt.
Serve the iii-directory worker's injected console UI assets (content function for its console:script / console:style / console:module triggers).
The asset path from the trigger config (e.g. `state/page.js`).
The asset source, verbatim.
MIME type the console should serve the asset with.
Fires after a directory::skills::download that wrote at least one agent profile, or a directory::agents::update, create, or delete. Also fires with { op: "external" } when a watched agents file changes on disk outside this worker.
Fires when kit state changes: a plan is created or discarded ({ op: "plan" | "discard", kit, plan_id }), an apply makes progress or finishes ({ op: "progress", plan_id, steps } / { op: "apply", kit, plan_id }), or an update check finds a different set of available updates ({ op: "updates" }).
Fires after a directory::skills::download that wrote at least one skill markdown file, or a directory::skills::update, create, or delete. Also fires with { op: "external" } when a watched skills root changes on disk outside this worker — including the read-only agents skills root, when that root exists at startup.
Fires after a directory::skills::download that wrote at least one system prompt, or a directory::system-prompts::update, create, or delete. Also fires with { op: "external" } when a watched system-prompts root changes on disk outside this worker.
Find workers, kits and executables, or jump to a page.