search finds tools by
description, and invoke calls one by id. Routing both through Rebuno records
every integration call as a tool_call step in the same execution as the
agent’s model calls. On a re-dispatch, completed calls replay instead of
reaching the integration again, so a worker that dies partway through a run
doesn’t repeat a write it already made. The kernel’s policy applies
to each call as well.
Connect to Executor
Load Executor’s MCP tools with the client your framework uses. With LangChain:Wrap the tools
Wrapsearch and invoke as Rebuno tools inside the handler:
search is defined with @tool so the model sees a schema with only query.
Executor’s own search also takes optional integration, owner, and
connection filters, which a model tends to fill with guesses that exclude the
tool it needs. invoke is passed through
wrap_tool as is, keeping Executor’s description and its tool and
arguments schema, which is the shape the policy matches on.
search only reads the catalog, so it keeps the default safe_to_retry.
invoke can create an issue or post a message, so it is at_most_once. See
idempotency.
Pass both to the agent as its tools, and tell the model in its prompt to search
first and then invoke a result by its id.
Write the policy
Every integration call is a step with targetexecutor_invoke. Its arguments
carry the integration tool’s id in tool and that tool’s own arguments in
arguments, so argument predicates can match
both:
acme/app, and needs approval to
open one there. Any other integration tool, and any other repository, is denied.
The model sees the denial reason as the tool result and can report it.
Argument paths follow each integration’s own schema. A Slack message’s channel
is in the request body, for example, so a rule matches it on
arguments.body.channel.
Run it
examples/integrations/executor
has the full agent, a policy covering GitHub and Slack, and a dev kernel config.
The example policy uses placeholder values. Before running it, replace the
repository acme/app and the Slack channel id C0123456789 with your own, and
the connection names github and slack in each tool id with the names of your
Executor connections. A tool id has the form
tools.<integration>.<owner>.<connection>.<resource>.<method>, and search
returns the exact ids for your workspace.
With EXECUTOR_URL, EXECUTOR_API_KEY, LLM_MODEL, LLM_BASE_URL, and
LLM_API_KEY set, start the kernel and the agent from that directory:
rebuno exec watch. See
Approvals to approve it.