Extra Chill Roadie
Role-aware chat tool surface for the Extra Chill agent: artist profiles, link pages, user profiles, community forums, plus team-gated GitHub issue filing and sandbox-backed code contributions — registered via the datamachine_tools filter.
by Chris Huber · github.com/extra-chill/extrachill-roadie · website
Install
The author publishes release zips, so WP-CLI can install straight from GitHub:
wp plugin install https://github.com/extra-chill/extrachill-roadie/releases/download/v0.23.0/extrachill-roadie.zipReadme
Extra Chill Roadie
Extra Chill platform integration for Frontend Agent Chat, powered by Data Machine agents. Roadie gives the Extra Chill chat agent the ability to manage artist profiles, link pages, user profiles, and community forums — and, for team members, to file GitHub issues and ship sandboxed code changes — all through natural language chat.
What It Does
Roadie is the bridge between Extra Chill's platform features and Data Machine's chat system. It registers nine chat tools via the datamachine_tools filter and composes a role-aware operating context (the roadie agent mode) into the AI prompt. The tool surface a caller actually sees depends on their tier (public / team / admin).
| Tool | Surface | Tier | Description |
|---|---|---|---|
manage_artist_profile |
artist.extrachill.com | team+ | Create, list, get, and update artist profiles |
manage_link_page |
artist.extrachill.com | team+ | Full link-in-bio page management (links, socials, styles, settings) |
manage_user_profile |
extrachill.com (network) | team+ | View and update the community profile (bio, title, city, links) |
manage_community |
community.extrachill.com | team+ | Browse forums, create topics, post replies, manage notifications |
propose_code_change |
sandbox | team+ | Dispatch a sandboxed coding agent that produces a reviewable patch + preview |
apply_code_change |
host | team+ | Apply an approved sandbox artifact: commit, push, open a PR |
file_feature_request |
GitHub | team+ | File / look up GitHub issues against the right EC repo (repo auto-inferred) |
search_content |
network catalog | public | Read-only search of Extra Chill's published catalog; returns results as chat citations to ground music/editorial answers |
present_question |
chat UI | public | Render a multiple-choice question as clickable buttons |
The four cross-site management tools require authentication (access_level: authenticated) and auto-resolve the artist ID when the user has a single artist profile. The code-contribution and feature-request tools additionally require the extrachill_propose_code capability. search_content and present_question are the two public-access tools and are the only tools visible to public-tier callers — search_content because the published catalog is public (logged-out visitors get grounded, sourced answers too), present_question because it is purely presentational.
Role-Aware Tier Surface
Roadie resolves every caller to one of three tiers and tailors both the visible tool set and the prompt guidance accordingly.
| Tier | Who | Tool surface |
|---|---|---|
public |
Logged-out / non-team callers, and system/pipeline runs (calling_user_id <= 0) |
search_content + present_question |
team |
extra_chill_team members (have the access_roadie cap) |
All 9 tools |
admin |
manage_options users |
All 9 tools, plus act-on-behalf-of another user via explicit user_id |
Tier resolution lives in extrachill_roadie_user_tier( int $user_id ) (inc/permissions.php) — a single auditable capability→tier map (highest wins): manage_options → admin, access_roadie → team, otherwise public.
Two enforcement layers back this:
- Tool visibility —
extrachill_roadie_filter_tools_by_tier()hooksdatamachine_resolved_toolsand, for public-tier callers,unset()s the seven management tools returned byextrachill_roadie_managed_tool_slugs()(everything except the two public tools,search_contentandpresent_question). This avoids offering the model dead options. - Per-call gates — independent of visibility: cross-site write capability checks,
assert_acting_user_allowed()(admin-only act-on-behalf-of), andcurrent_user_can( 'extrachill_propose_code' )on the code/issue tools.
Architecture
Roadie follows the Extra Chill platform pattern: business logic lives in domain plugins (extrachill-users, extrachill-api, extrachill-artist-platform, etc.), and Roadie provides the AI-facing tool interface on top.
User (chat) → Data Machine → Roadie Tool → ec_cross_site_rest_request() → Subsite REST API → Ability
ECRoadie_PlatformTool
The four cross-site management tools extend ECRoadie_PlatformTool (inc/tools/class-ec-platform-tool.php), which extends Data Machine's BaseTool and provides:
rest_request( $method, $path, $args )— Cross-site REST calls viaec_cross_site_rest_request(). Passuser_idin$argsto authenticate the request as that user; the underlying helper wrapswp_set_current_user()in a try/finally so context restores cleanly.get_blog_id()— Site key resolution for safe data reads viaswitch_to_blog().get_calling_user_id( $parameters )— Readscalling_user_idfrom the merged tool parameters. Data Machine's loop merges the invocation payload into$parametersbefore callinghandle_tool_call(), so the human caller is always available as$parameters['calling_user_id'].resolve_acting_user_id( $parameters )— Returns the user the tool should act as. Priority: explicituser_idinput →calling_user_id→get_current_user_id().assert_acting_user_allowed( $acting, $parameters )— Returns a clean permission-denied response (ornullwhen allowed). Non-admin callers attempting to act on another user are refused.
Each tool declares a $site_key (e.g. 'artist', 'community', 'main') and a $tool_slug for error context. The code-contribution, feature-request, and present-question tools extend BaseTool directly (they don't make cross-site REST calls).
Agent Mode
Roadie registers a roadie execution mode with Data Machine's AgentModeRegistry. The mode is the operating context for the EC platform tool surface — it composes EC-specific guidance (network topology, tool selection, identity contract, editorial voice, operating posture) into the AI prompt.
// inc/agent-mode/register.php
add_action( 'datamachine_agent_modes', function () {
\DataMachine\Engine\AI\AgentModeRegistry::register( 'roadie', 45, array(
'label' => __( 'Extra Chill Platform', 'extrachill-roadie' ),
'description' => __( 'Artist profiles, link pages, user profiles, community forum, and personal user-scoped operations on the EC multisite network.', 'extrachill-roadie' ),
) );
} );
add_filter( 'datamachine_agent_mode_roadie', 'extrachill_roadie_mode_guidance', 10, 2 );
The mode is agent-agnostic — any agent (extra-chill-bot, roadie, or a custom one) can run in this mode and inherit the same platform guidance. Priority 45 places it after data-machine-editor (40) so editor mode wins when both are active in the same invocation (rare).
The guidance is role-aware: extrachill_roadie_mode_guidance() resolves the caller's calling_user_id → tier and delegates to extrachill_roadie_compose_guidance( $tier, $uid ), which assembles tier-specific sections (intro, tool guidance, identity contract, operating posture) on top of shared sections (network topology, editorial voice). The composed prompt is titled # Extra Chill Platform Context.
Calling-User Identity Contract
Every Roadie tool sees the human caller via $parameters['calling_user_id']. The chat orchestrator sets this from the chat session caller; pipeline runs and system tasks set it to 0.
The contract for tool wiring:
- Resolve the acting user once at the top of
handle_tool_call():$acting_user_id = $this->resolve_acting_user_id( $parameters ); $denied = $this->assert_acting_user_allowed( $acting_user_id, $parameters ); if ( null !== $denied ) { return $denied; } - Pass
'user_id' => $acting_user_idinto everyrest_request()so the cross-site helper switches context correctly. - For tools that read user-scoped data directly (e.g.
get_user_meta), use$acting_user_idinstead ofget_current_user_id(). - Public read actions (e.g.
list_forums) can skip the resolve/assert pair entirely.
Admin agents may target another user by passing an explicit user_id input; non-admins attempting that get a clean permission-denied response.
Permissions
Roadie bridges Extra Chill team membership to Data Machine's agent access system:
- Hooks
datamachine_can_access_agentto grant EC team members access to the Roadie agent. - Uses the network-wide
access_roadiecapability (granted to theextra_chill_teamrole) as the source of truth. - Grants
extrachill_propose_codeto administrators, editors, andextra_chill_teamby default (filterable viaextrachill_roadie_propose_code_roles). - Bridges the events read/write capabilities (
datamachine_events_read_capability/datamachine_events_write_capability). - Agent policy (name, status, redirect URIs) is synced on
plugins_loaded(priority 20).
Bridge Onboarding
For external chat clients (like Beeper/Matrix via mautrix-data-machine), Roadie provides onboarding configuration via the datamachine_bridge_onboarding_config filter:
- Welcome message, description, login instructions.
- Room name and topic for the chat bridge.
- Consumer-facing capability list (artist profile, link page, user profile, community).
- Avatar URL (filterable via
extrachill_roadie_bridge_avatar_url).
The onboarding capability list is intentionally end-user-facing — the team-gated code and issue tools aren't advertised there because a public bridge user would never see them.
Chat Tool Reference
manage_artist_profile
| Action | Description | Required Params |
|---|---|---|
list |
List the current user's artist profiles | — |
get |
Get artist profile details | artist_id (auto-resolved) |
create |
Create a new artist profile | name |
update |
Update an existing artist profile | artist_id (auto-resolved), plus fields to update |
Optional fields for create/update: bio, genre, local_city, profile_image_id (0 to remove), header_image_id (0 to remove).
manage_link_page
| Action | Description | Required Params |
|---|---|---|
get |
View the full link page | artist_id (auto-resolved) |
add_link |
Add a single link | url, text, optional section |
remove_link |
Remove a link | url or link_id |
save_links |
Replace all link sections | links array |
save_socials |
Replace social links | socials array |
save_styles |
Update CSS variables (keys must start --link-page-) |
css_vars object |
save_settings |
Update settings | settings object |
Convenience actions (add_link, remove_link) handle the fetch-modify-save cycle internally so the AI doesn't need multi-step orchestration.
manage_user_profile
| Action | Description | Required Params |
|---|---|---|
get |
View the current user's profile | — |
update |
Update bio, title, or city | At least one of custom_title, bio, local_city |
update_links |
Replace profile links | links array |
Profile links support types: website, facebook, instagram, twitter, youtube, tiktok, spotify, soundcloud, bandcamp, github, other. These are the links on the user's community profile — distinct from artist link pages.
manage_community
| Action | Description | Required Params |
|---|---|---|
list_forums |
Browse available forums (public read) | — |
list_topics |
List topics (optionally filtered by forum) | Optional forum_id, page, per_page |
get_topic |
Read a topic with replies | topic_id |
create_topic |
Post a new topic | forum_id, title, content |
create_reply |
Reply to a topic | topic_id, content |
get_notifications |
Check notifications | Optional unread |
mark_notifications_read |
Mark all as read | — |
The first three actions are public reads (no user context); the rest resolve and authorize the acting user.
propose_code_change
Dispatches a sandboxed coding agent (WP Codebox Playground) that implements the described change against the subsite's stack and returns a reviewable patch artifact + live preview URL. It does not push code or open a PR.
| Param | Description |
|---|---|
task_description (required) |
Plain-language description of the change |
Returns status: pending-approval, artifact_id, preview_url, summary, changed_files. Requires the extrachill_propose_code capability. See docs/contribute-code.md for the full flow.
apply_code_change
Applies a previously-approved artifact: creates a worktree per affected repo, applies the patch, commits with a conventional commit message, pushes, and opens a pull request.
| Param | Description |
|---|---|
artifact_id (required) |
The artifact_id returned by propose_code_change |
commit_message_hint (optional) |
Hint for the commit subject |
Returns pr_urls. Only call after the user has explicitly approved the proposed change. Requires extrachill_propose_code.
Read the full README on GitHub →
Releases
| Tag | Published | Asset | Downloads |
|---|---|---|---|
| v0.23.0 | Aug 15, 2026 | extrachill-roadie.zip | 4 |
| v0.22.3 | Aug 12, 2026 | extrachill-roadie.zip | 4 |
| v0.22.2 | Aug 4, 2026 | extrachill-roadie.zip | 3 |
| v0.22.1 | Aug 2, 2026 | extrachill-roadie.zip | 1 |
| v0.22.0 | Aug 2, 2026 | extrachill-roadie.zip | 1 |
| v0.21.0 | Jul 30, 2026 | extrachill-roadie.zip | 1 |
| v0.20.1 | Jul 26, 2026 | extrachill-roadie.zip | 2 |
| v0.20.0 | Jul 26, 2026 | extrachill-roadie.zip | 1 |
| v0.19.0 | Jul 12, 2026 | 01-extrachill-roadie.zip | 0 |
| v0.19.0 | Jul 12, 2026 | extrachill-roadie.zip | 0 |
| v0.18.2 | Jul 9, 2026 | 01-extrachill-roadie.zip | 2 |
| v0.18.2 | Jul 9, 2026 | extrachill-roadie.zip | 0 |
| v0.18.1 | Jul 9, 2026 | 01-extrachill-roadie.zip | 1 |
| v0.18.1 | Jul 9, 2026 | extrachill-roadie.zip | 0 |
| v0.18.0 | Jul 3, 2026 | 01-extrachill-roadie.zip | 0 |
| v0.18.0 | Jul 3, 2026 | extrachill-roadie.zip | 1 |
| v0.17.1 | Jun 29, 2026 | 01-extrachill-roadie.zip | 0 |
| v0.17.1 | Jun 29, 2026 | extrachill-roadie.zip | 2 |
| v0.16.1 | Jun 29, 2026 | 01-extrachill-roadie.zip | 1 |
| v0.16.1 | Jun 29, 2026 | extrachill-roadie.zip | 2 |
| v0.15.0 | Jun 28, 2026 | 01-extrachill-roadie.zip | 0 |
| v0.15.0 | Jun 28, 2026 | extrachill-roadie.zip | 1 |
| v0.14.0 | Jun 19, 2026 | extrachill-roadie.zip | 1 |
| v0.13.0 | Jun 17, 2026 | extrachill-roadie.zip | 2 |
| v0.12.0 | Jun 17, 2026 | extrachill-roadie.zip | 1 |