The agent exposes a built-in tool catalogue and a per-session effective tool list. You can inspect schemas, list the tools a live session actually has on PATH (including its MCP subset), and run tools either inside a live session (gated, claims the serial turn slot) or sessionless (gated, read-only by default). Sessionless runs ship in three forms: synchronous (run), async (runAsync — returns a job id you poll), and streamed (stream — SSE envelopes).
List the full tool catalogue. Returns each tool’s name, description, JSON-Schema input, and read_only flag. Catalogue-wide and realm-independent — a per-request realm header is rejected with realm_scope_unsupported.
Name In Type Required Description pagequery integer No 1-based page number for pagination. limitquery integer No Maximum items per page (0 = no pagination). X-Hoody-Cwdheader string No Per-request working-directory scope. X-Hoody-Config-Dirheader string No Per-request --config-dir override. X-Hoody-Containerheader string No Per-request bound remote container (omitted = local). X-Hoody-Realmheader string No Per-request realm selector ("global" or a 24-hex id). Rejected on this route. realmquery string No Realm selector (in:query alias of X-Hoody-Realm). Rejected on this route.
" description " : " Run a shell command in the session's working directory. " ,
" command " : { " type " : " string " },
" timeout_ms " : { " type " : " integer " }
" description " : " Read a UTF-8 text file from the workspace. " ,
" path " : { " type " : " string " }
" code " : " realm_scope_unsupported " ,
" message " : " realm scope not supported on this route "
Error Code Title Description Resolution bad_requestBad request The request was malformed or carried invalid parameters. Correct the request body or query parameters. realm_scope_unsupportedRealm scope unsupported A per-request realm header was supplied to a global-no-realm RPC. Omit the realm header on this route, or open a session to scope by realm.
" message " : " request must arrive through the Hoody proxy "
Error Code Title Description Resolution forbiddenForbidden (not via the Hoody proxy) The request did not reach the service through the public endpoint. Reach the agent through hoody-proxy, not by connecting to the container directly.
" message " : " request rate limit exceeded "
Error Code Title Description Resolution rate_limitedToo many requests The per-client request rate limit was exceeded. Honor the Retry-After header and retry; reduce the request rate.
" code " : " internal_error " ,
" message " : " internal server error "
Error Code Title Description Resolution internal_errorInternal error An unexpected error occurred while handling the request. Retry; if persistent, inspect the daemon logs.
curl -X GET " https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com/api/v1/agent/tools?page=1&limit=20 " \
-H " Authorization: Bearer $HOODY_TOKEN "
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com ' , token : process . env . HOODY_TOKEN });
await client . agent . tools . listToolsIterator ({ page : 1 , limit : 20 });
Get the schema for a single built-in tool by name. Returns the tool’s full descriptor — the body is the forwarded daemon reply (free-form). 404 tool_not_found for an unknown name.
Name In Type Required Description namepath string Yes Path identifier. X-Hoody-Cwdheader string No Per-request working-directory scope. X-Hoody-Config-Dirheader string No Per-request --config-dir override. X-Hoody-Containerheader string No Per-request bound remote container (omitted = local). X-Hoody-Realmheader string No Per-request realm selector. Rejected on this route. realmquery string No Realm selector (in:query alias). Rejected on this route.
" description " : " Run a shell command in the session's working directory. " ,
" command " : { " type " : " string " },
" timeout_ms " : { " type " : " integer " }
" message " : " invalid request "
Error Code Title Description Resolution bad_requestBad request The request was malformed or carried invalid parameters. Correct the request body or query parameters. realm_scope_unsupportedRealm scope unsupported A per-request realm header was supplied to a global-no-realm RPC. Omit the realm header on this route, or open a session to scope by realm.
" message " : " request must arrive through the Hoody proxy "
Error Code Title Description Resolution forbiddenForbidden (not via the Hoody proxy) The request did not reach the service through the public endpoint. Reach the agent through hoody-proxy, not by connecting to the container directly.
" code " : " tool_not_found " ,
" message " : " no tool with that name "
Error Code Title Description Resolution tool_not_foundTool not found No tool with the given name exists in the catalogue or in the session’s effective tool list. List the catalogue (GET /tools) or the session’s tools (GET /sessions/{id}/tools) and use a valid name.
" message " : " request rate limit exceeded "
Error Code Title Description Resolution rate_limitedToo many requests The per-client request rate limit was exceeded. Honor the Retry-After header and retry; reduce the request rate.
" code " : " internal_error " ,
" message " : " internal server error "
Error Code Title Description Resolution internal_errorInternal error An unexpected error occurred while handling the request. Retry; if persistent, inspect the daemon logs.
curl -X GET " https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com/api/v1/agent/tools/bash " \
-H " Authorization: Bearer $HOODY_TOKEN "
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com ' , token : process . env . HOODY_TOKEN });
await client . agent . tools . getTool ( ' bash ' );
List the read-only tool subset — tools safe for planning and sessionless runs. Same envelope and pagination as the full catalogue.
Name In Type Required Description pagequery integer No 1-based page number for pagination. limitquery integer No Maximum items per page (0 = no pagination). X-Hoody-Cwdheader string No Per-request working-directory scope. X-Hoody-Config-Dirheader string No Per-request --config-dir override. X-Hoody-Containerheader string No Per-request bound remote container (omitted = local). X-Hoody-Realmheader string No Per-request realm selector. Rejected on this route. realmquery string No Realm selector (in:query alias). Rejected on this route.
" description " : " Read a UTF-8 text file from the workspace. " ,
" properties " : { " path " : { " type " : " string " } },
" description " : " List a directory. " ,
" properties " : { " path " : { " type " : " string " } },
" message " : " invalid request "
Error Code Title Description Resolution bad_requestBad request The request was malformed or carried invalid parameters. Correct the request body or query parameters. realm_scope_unsupportedRealm scope unsupported A per-request realm header was supplied to a global-no-realm RPC. Omit the realm header on this route, or open a session to scope by realm.
" message " : " request must arrive through the Hoody proxy "
Error Code Title Description Resolution forbiddenForbidden (not via the Hoody proxy) The request did not reach the service through the public endpoint. Reach the agent through hoody-proxy, not by connecting to the container directly.
" message " : " request rate limit exceeded "
Error Code Title Description Resolution rate_limitedToo many requests The per-client request rate limit was exceeded. Honor the Retry-After header and retry; reduce the request rate.
" code " : " internal_error " ,
" message " : " internal server error "
Error Code Title Description Resolution internal_errorInternal error An unexpected error occurred while handling the request. Retry; if persistent, inspect the daemon logs.
curl -X GET " https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com/api/v1/agent/tools/read-only " \
-H " Authorization: Bearer $HOODY_TOKEN "
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com ' , token : process . env . HOODY_TOKEN });
await client . agent . tools . listReadOnlyToolsIterator ();
These endpoints return the effective tool list for a live session — the subset of the catalogue that is both enabled in config and on the session’s compute PATH, gated by the session’s tool mode, agent allowlist, and headless exclusions. Both return 404 when the session is not live.
List a session’s effective tool set.
Name In Type Required Description idpath string Yes Session identifier. pagequery integer No 1-based page number for pagination. limitquery integer No Maximum items per page (0 = no pagination). X-Hoody-Cwdheader string No Per-request working-directory scope. X-Hoody-Config-Dirheader string No Per-request --config-dir override. X-Hoody-Containerheader string No Per-request bound remote container (omitted = local). X-Hoody-Realmheader string No Per-request realm selector. Rejected on this route. realmquery string No Realm selector (in:query alias). Rejected on this route.
" description " : " Run a shell command in the session's working directory. " ,
" command " : { " type " : " string " },
" timeout_ms " : { " type " : " integer " }
" description " : " Read a UTF-8 text file from the workspace. " ,
" properties " : { " path " : { " type " : " string " } },
" code " : " realm_scope_unsupported " ,
" message " : " realm scope not supported on this route "
Error Code Title Description Resolution bad_requestBad request The request was malformed or carried invalid parameters. Correct the request body or query parameters. realm_scope_unsupportedRealm scope unsupported A per-request realm header was supplied to an active-only RPC. Omit the realm header on this route, or open a session to scope by realm.
" message " : " request must arrive through the Hoody proxy "
Error Code Title Description Resolution forbiddenForbidden (not via the Hoody proxy) The request did not reach the service through the public endpoint. Reach the agent through hoody-proxy, not by connecting to the container directly.
" message " : " resource not found "
Error Code Title Description Resolution not_foundNot found The requested resource does not exist. Verify the path and identifier.
" message " : " request rate limit exceeded "
Error Code Title Description Resolution rate_limitedToo many requests The per-client request rate limit was exceeded. Honor the Retry-After header and retry; reduce the request rate.
" code " : " internal_error " ,
" message " : " internal server error "
Error Code Title Description Resolution internal_errorInternal error An unexpected error occurred while handling the request. Retry; if persistent, inspect the daemon logs.
" code " : " service_unavailable " ,
" message " : " service unavailable "
Error Code Title Description Resolution service_unavailableService unavailable The daemon could not service the request. Honor Retry-After and retry.
curl -X GET " https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com/api/v1/agent/sessions/{id}/tools " \
-H " Authorization: Bearer $HOODY_TOKEN "
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com ' , token : process . env . HOODY_TOKEN });
await client . agent . tools . listSessionToolsIterator ( ' {id} ' );
List a session’s MCP tools (mcp__*). Same envelope and semantics as the effective tool list, but filtered to the MCP subset of the session’s compute PATH snapshot.
Name In Type Required Description idpath string Yes Session identifier. pagequery integer No 1-based page number for pagination. limitquery integer No Maximum items per page (0 = no pagination). X-Hoody-Cwdheader string No Per-request working-directory scope. X-Hoody-Config-Dirheader string No Per-request --config-dir override. X-Hoody-Containerheader string No Per-request bound remote container (omitted = local). X-Hoody-Realmheader string No Per-request realm selector. Rejected on this route. realmquery string No Realm selector (in:query alias). Rejected on this route.
" name " : " mcp__github__create_issue " ,
" description " : " Open a new issue on a GitHub repo. " ,
" repo " : { " type " : " string " },
" title " : { " type " : " string " },
" body " : { " type " : " string " }
" required " : [ " repo " , " title " ]
" name " : " mcp__github__list_issues " ,
" description " : " List open issues on a GitHub repo. " ,
" repo " : { " type " : " string " },
" state " : { " type " : " string " , " enum " : [ " open " , " closed " , " all " ] }
" code " : " realm_scope_unsupported " ,
" message " : " realm scope not supported on this route "
Error Code Title Description Resolution bad_requestBad request The request was malformed or carried invalid parameters. Correct the request body or query parameters. realm_scope_unsupportedRealm scope unsupported A per-request realm header was supplied to an active-only RPC. Omit the realm header on this route, or open a session to scope by realm.
" message " : " request must arrive through the Hoody proxy "
Error Code Title Description Resolution forbiddenForbidden (not via the Hoody proxy) The request did not reach the service through the public endpoint. Reach the agent through hoody-proxy, not by connecting to the container directly.
" message " : " resource not found "
Error Code Title Description Resolution not_foundNot found The requested resource does not exist. Verify the path and identifier.
" message " : " request rate limit exceeded "
Error Code Title Description Resolution rate_limitedToo many requests The per-client request rate limit was exceeded. Honor the Retry-After header and retry; reduce the request rate.
" code " : " internal_error " ,
" message " : " internal server error "
Error Code Title Description Resolution internal_errorInternal error An unexpected error occurred while handling the request. Retry; if persistent, inspect the daemon logs.
" code " : " service_unavailable " ,
" message " : " service unavailable "
Error Code Title Description Resolution service_unavailableService unavailable The daemon could not service the request. Honor Retry-After and retry.
curl -X GET " https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com/api/v1/agent/sessions/{id}/tools/mcp " \
-H " Authorization: Bearer $HOODY_TOKEN "
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com ' , token : process . env . HOODY_TOKEN });
await client . agent . tools . listSessionMCPToolsIterator ( ' {id} ' );
Sessionless runs create an ephemeral local session from the scope headers (X-Hoody-Cwd, X-Hoody-Config-Dir) and run the full permission checks. They are read-only by default — a mutating tool requires allow_mutations: true or confirm: true, otherwise the run is refused with tool_mutation_refused. A parked confirmation returns 409 tool_needs_confirmation with the echoed tool+params; re-issue with confirm: true (and the confirm_token returned in the 409 details).
A sessionless run resolves paths under the caller-supplied X-Hoody-Cwd subtree (dir-scope defaults to home, restricted to cwd).
A session-scoped run claims the session’s single serial turn slot — it never races the turn loop. Concurrent activity returns 409 turn_in_flight or 409 gate_parked. A parked confirmation returns 409 tool_needs_confirmation.
Caution
A session created with headless: true hard-denies the dangerous bash shapes (rm -rf /, curl|sh, git push --force) and outside-cwd file writes. A headless live session has no interactive confirmer, so those confirm-gated shapes are not parkable on it.
Run a tool sessionless, gated. Returns the tool result directly.
Name In Type Required Description namepath string Yes Tool name. confirmquery boolean No Query alias of the body confirm field — re-issue a previously-parked confirmation. confirm_tokenquery string No Query alias of the body confirm_token field — the single-use token returned in the 409 details. X-Hoody-Tool-Modeheader string No Sessionless tool-mode for the ephemeral session (e.g. read_only, full). X-Hoody-Dir-Scopeheader string No Sessionless directory-access scope (home or full); default home. X-Hoody-Cwdheader string No Per-request working-directory scope. X-Hoody-Config-Dirheader string No Per-request --config-dir override. X-Hoody-Containerheader string No Per-request bound remote container (omitted = local). X-Hoody-Realmheader string No Per-request realm selector. Rejected on this route. realmquery string No Realm selector (in:query alias). Rejected on this route.
Name Type Required Description paramsobject No The tool’s input parameters (its JSON-Schema body). confirmboolean No Re-issue a previously-parked confirmation. MUST be paired with a valid confirm_token. confirm_tokenstring No The single-use token returned in the 409 tool_needs_confirmation details. allow_mutationsboolean No Sessionless only: opt a non-read-only tool into running under the full permission checks.
" stdout " : " total 12 \n drwxr-xr-x 3 user user 4096 May 1 12:00 . \n drwxr-xr-x 6 user user 4096 May 1 12:00 .. \n -rw-r--r-- 1 user user 220 May 1 12:00 README.md " ,
" code " : " tool_mutation_refused " ,
" message " : " sessionless run refused for a non-read-only tool "
Error Code Title Description Resolution bad_requestBad request The request was malformed or carried invalid parameters. Correct the request body or query parameters. tool_mutation_refusedTool mutation refused A sessionless run resolved to a mutating tool with no confirmation posture. Sessionless runs are read-only by default. Open a session and run the tool there, or supply allow_mutations: true / confirm: true on the sessionless run. realm_scope_unsupportedRealm scope unsupported A per-request realm header was supplied to a global-no-realm RPC. Omit the realm header on this route, or open a session to scope by realm.
" message " : " request must arrive through the Hoody proxy "
Error Code Title Description Resolution forbiddenForbidden (not via the Hoody proxy) The request did not reach the service through the public endpoint. Reach the agent through hoody-proxy, not by connecting to the container directly.
" code " : " tool_not_found " ,
" message " : " no tool with that name "
Error Code Title Description Resolution tool_not_foundTool not found No tool with the given name exists in the catalogue. List the catalogue (GET /tools) and use a valid name.
" code " : " tool_needs_confirmation " ,
" message " : " tool requires confirmation before execution "
Error Code Title Description Resolution tool_needs_confirmationTool needs confirmation The tool was NOT executed: the permission checks requires confirmation first. Re-issue the run with confirm: true (or ?confirm=true), preserving the echoed params.
" code " : " payload_too_large " ,
" message " : " request body exceeds the configured size limit "
Error Code Title Description Resolution payload_too_largePayload too large The request body exceeds the configured size cap (MaxBodyBytes). Reduce the request body below the limit (default 8 MiB); split a large payload into smaller requests.
" message " : " request rate limit exceeded "
Error Code Title Description Resolution rate_limitedToo many requests The per-client request rate limit was exceeded. Honor the Retry-After header and retry; reduce the request rate.
" code " : " internal_error " ,
" message " : " internal server error "
Error Code Title Description Resolution internal_errorInternal error An unexpected error occurred while handling the request. Retry; if persistent, inspect the daemon logs.
curl -X POST " https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com/api/v1/agent/tools/bash/run " \
-H " Authorization: Bearer $HOODY_TOKEN " \
-H " Content-Type: application/json " \
-H " X-Hoody-Cwd: /home/user/project " \
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com ' , token : process . env . HOODY_TOKEN });
await client . agent . tools . runTool ( ' bash ' , {
}, { // X-Hoody-Cwd option omitted for brevity
Async form of runTool. Returns {job_id} immediately; the gated tool runs in the background. Poll GET /jobs/{id}/result for the result, a parked confirmation, or an execution error.
Name In Type Required Description namepath string Yes Tool name. confirmquery boolean No Query alias of the body confirm field. confirm_tokenquery string No Query alias of the body confirm_token field. X-Hoody-Tool-Modeheader string No Sessionless tool-mode for the ephemeral session. X-Hoody-Dir-Scopeheader string No Sessionless directory-access scope. X-Hoody-Cwdheader string No Per-request working-directory scope. X-Hoody-Config-Dirheader string No Per-request --config-dir override. X-Hoody-Containerheader string No Per-request bound remote container (omitted = local). X-Hoody-Realmheader string No Per-request realm selector. Rejected on this route. realmquery string No Realm selector (in:query alias). Rejected on this route.
Name Type Required Description paramsobject No The tool’s input parameters. confirmboolean No Re-issue a previously-parked confirmation. confirm_tokenstring No The single-use token returned in the 409 details. allow_mutationsboolean No Sessionless only: opt a non-read-only tool into running under the full permission checks.
" job_id " : " job_67e89abc123def456789abcd "
" message " : " invalid request "
Error Code Title Description Resolution bad_requestBad request The request was malformed or carried invalid parameters. Correct the request body or query parameters. realm_scope_unsupportedRealm scope unsupported A per-request realm header was supplied to a global-no-realm RPC. Omit the realm header on this route.
" message " : " request must arrive through the Hoody proxy "
Error Code Title Description Resolution forbiddenForbidden (not via the Hoody proxy) The request did not reach the service through the public endpoint. Reach the agent through hoody-proxy, not by connecting to the container directly.
" code " : " payload_too_large " ,
" message " : " request body exceeds the configured size limit "
Error Code Title Description Resolution payload_too_largePayload too large The request body exceeds the configured size cap. Reduce the request body below the limit (default 8 MiB).
" message " : " request rate limit exceeded "
Error Code Title Description Resolution rate_limitedToo many requests The per-client request rate limit was exceeded. Honor the Retry-After header and retry; reduce the request rate.
" code " : " internal_error " ,
" message " : " internal server error "
Error Code Title Description Resolution internal_errorInternal error An unexpected error occurred while handling the request. Retry; if persistent, inspect the daemon logs.
curl -X POST " https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com/api/v1/agent/tools/bash/runAsync " \
-H " Authorization: Bearer $HOODY_TOKEN " \
-H " Content-Type: application/json " \
-H " X-Hoody-Cwd: /home/user/project " \
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com ' , token : process . env . HOODY_TOKEN });
// Kick off the async run
const { job_id } = await client . agent . tools . runToolAsync ( ' bash ' , {
// Later: poll the job result
const result = await client . agent . jobs . getJobResult ({ id : job_id });
Stream a tool run over Server-Sent Events. Frame sequence: a start frame, then a single result / needs_confirmation / error frame, then end. The gated work is a one-shot RPC, so there is no per-token stream — the SSE shape mirrors the kit streaming convention for symmetry with the session stream.
Name In Type Required Description namepath string Yes Tool name. confirmquery boolean No Query alias of the body confirm field. confirm_tokenquery string No Query alias of the body confirm_token field. X-Hoody-Tool-Modeheader string No Sessionless tool-mode for the ephemeral session. X-Hoody-Dir-Scopeheader string No Sessionless directory-access scope. X-Hoody-Cwdheader string No Per-request working-directory scope. X-Hoody-Config-Dirheader string No Per-request --config-dir override. X-Hoody-Containerheader string No Per-request bound remote container (omitted = local). X-Hoody-Realmheader string No Per-request realm selector. Rejected on this route. realmquery string No Realm selector (in:query alias). Rejected on this route.
Name Type Required Description paramsobject No The tool’s input parameters. confirmboolean No Re-issue a previously-parked confirmation. confirm_tokenstring No The single-use token returned in the 409 details. allow_mutationsboolean No Sessionless only: opt a non-read-only tool into running.
" command " : " tail -f /var/log/app.log " ,
data: {"id":"job_67e89abc123def456789abcd"}
data: {"stdout":"INFO listening on :3000\n","stderr":"","exit_code":0}
" message " : " invalid request "
Error Code Title Description Resolution bad_requestBad request The request was malformed or carried invalid parameters. Correct the request body or query parameters. realm_scope_unsupportedRealm scope unsupported A per-request realm header was supplied to a global-no-realm RPC. Omit the realm header on this route.
" message " : " request must arrive through the Hoody proxy "
Error Code Title Description Resolution forbiddenForbidden (not via the Hoody proxy) The request did not reach the service through the public endpoint. Reach the agent through hoody-proxy, not by connecting to the container directly.
" code " : " payload_too_large " ,
" message " : " request body exceeds the configured size limit "
Error Code Title Description Resolution payload_too_largePayload too large The request body exceeds the configured size cap. Reduce the request body below the limit (default 8 MiB).
" message " : " request rate limit exceeded "
Error Code Title Description Resolution rate_limitedToo many requests The per-client request rate limit was exceeded. Honor the Retry-After header and retry; reduce the request rate.
" code " : " internal_error " ,
" message " : " internal server error "
Error Code Title Description Resolution internal_errorInternal error An unexpected error occurred while handling the request. Retry; if persistent, inspect the daemon logs.
" code " : " service_unavailable " ,
" message " : " service unavailable "
Error Code Title Description Resolution service_unavailableService unavailable The daemon could not service the request (too busy, or a per-client stream concurrency cap was hit). Honor Retry-After and retry.
curl -N -X POST " https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com/api/v1/agent/tools/bash/stream " \
-H " Authorization: Bearer $HOODY_TOKEN " \
-H " Content-Type: application/json " \
-H " X-Hoody-Cwd: /home/user/project " \
"command": "tail -f /var/log/app.log",
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com ' , token : process . env . HOODY_TOKEN });
await client . agent . tools . streamTool ( ' bash ' , {
command : ' tail -f /var/log/app.log ' ,
Run a named tool inside a live session, gated and constrained to the session’s frozen realm/container/cwd/tool-mode/dir-scope. Claims the session’s single serial turn slot, so a direct tool run never races the turn loop. The run is also cancellable (concurrent POST /sessions/{id}/cancel, a WS cancel frame, or session close aborts an in-flight run).
Name In Type Required Description idpath string Yes Session identifier. namepath string Yes Tool name. confirmquery boolean No Query alias of the body confirm field. confirm_tokenquery string No Query alias of the body confirm_token field. X-Hoody-Cwdheader string No Per-request working-directory scope. X-Hoody-Config-Dirheader string No Per-request --config-dir override. X-Hoody-Containerheader string No Per-request bound remote container (omitted = local). X-Hoody-Realmheader string No Per-request realm selector. Rejected on this route. realmquery string No Realm selector (in:query alias). Rejected on this route.
Name Type Required Description paramsobject No The tool’s input parameters (its JSON-Schema body). confirmboolean No Re-issue a previously-parked confirmation. confirm_tokenstring No The single-use token returned in the 409 details. allow_mutationsboolean No Sessionless only: opt a non-read-only tool into running. Omitted for in-session runs.
" stdout " : " On branch main \n nothing to commit, working tree clean " ,
" code " : " realm_scope_unsupported " ,
" message " : " realm scope not supported on this route "
Error Code Title Description Resolution bad_requestBad request The request was malformed or carried invalid parameters. Correct the request body or query parameters. realm_scope_unsupportedRealm scope unsupported A per-request realm header was supplied to an active-only RPC. Omit the realm header on this route.
" message " : " request must arrive through the Hoody proxy "
Error Code Title Description Resolution forbiddenForbidden (not via the Hoody proxy) The request did not reach the service through the public endpoint. Reach the agent through hoody-proxy, not by connecting to the container directly.
" code " : " tool_not_found " ,
" message " : " no tool with that name "
Error Code Title Description Resolution not_foundNot found The requested resource does not exist. Verify the path and identifier. tool_not_foundTool not found The tool is not in the session’s effective tool list. List the session’s tools (GET /sessions/{id}/tools) and use a valid name.
" code " : " tool_needs_confirmation " ,
" message " : " tool requires confirmation before execution "
Error Code Title Description Resolution tool_needs_confirmationTool needs confirmation The tool was NOT executed: the permission checks requires confirmation first. Re-issue the run with confirm: true (or ?confirm=true), preserving the echoed params. turn_in_flightTurn in flight A turn is already running on this session; the single serial turn slot is occupied. Wait for the running turn to finish (observe agent_done on the session stream), then retry. gate_parkedGate parked A confirm/question gate is parked on this session, so a new turn/workflow run is refused until it is answered. Answer the parked gate (/confirm or /answer) and retry; read it via GET /sessions/{id} or details.pending_gate.
" code " : " payload_too_large " ,
" message " : " request body exceeds the configured size limit "
Error Code Title Description Resolution payload_too_largePayload too large The request body exceeds the configured size cap. Reduce the request body below the limit (default 8 MiB).
" message " : " request rate limit exceeded "
Error Code Title Description Resolution rate_limitedToo many requests The per-client request rate limit was exceeded. Honor the Retry-After header and retry; reduce the request rate.
" code " : " internal_error " ,
" message " : " internal server error "
Error Code Title Description Resolution internal_errorInternal error An unexpected error occurred while handling the request. Retry; if persistent, inspect the daemon logs.
curl -X POST " https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com/api/v1/agent/sessions/{id}/tools/bash/run " \
-H " Authorization: Bearer $HOODY_TOKEN " \
-H " Content-Type: application/json " \
import { HoodyClient } from ' hoody-sdk ' ;
const client = new HoodyClient ({ baseURL : ' https://{projectId}-{containerId}-agent-1.{server}.containers.hoody.com ' , token : process . env . HOODY_TOKEN });
await client . agent . tools . runSessionTool ( ' {id} ' , ' bash ' , {