[{"data":1,"prerenderedAt":51},["ShallowReactive",2],{"docs:core-concepts/handlers":3},{"title":4,"navTitle":4,"description":5,"api":6,"html":7,"toc":8,"path":40,"tab":41,"group":42,"prev":43,"next":46,"markdownUrl":49,"sourceUrl":50,"lastModified":6},"Handlers","Back one side of an agent with a function that takes its turns",null,"\u003Ch2 id=\"what-is-a-handler\">\u003Ca class=\"docs-anchor\" href=\"#what-is-a-handler\" aria-label=\"Link to this section\">\u003C/a>What is a handler?\u003C/h2>\n\u003Cp>A handler is a function that takes one side's turns in a conversation. When a handler backs a side of an \u003Ca href=\"/docs/core-concepts/agents\">agent\u003C/a>, the runtime calls the handler once for each inbound message. The runtime sends no model request for that side.\u003C/p>\n\u003Cp>A handler has one role: it backs a side of an agent. Three other definitions cover the remaining roles:\u003C/p>\n\u003Cul>\n\u003Cli>A \u003Ca href=\"/docs/core-concepts/hooks\">hook\u003C/a> changes or observes a turn that a prompt or a handler owns.\u003C/li>\n\u003Cli>A \u003Ca href=\"/docs/core-concepts/tools\">tool\u003C/a> is a capability that a prompt chooses to call.\u003C/li>\n\u003Cli>An \u003Ca href=\"/docs/core-concepts/effects\">effect\u003C/a> runs outside the conversation flow.\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"defining-a-handler\">\u003Ca class=\"docs-anchor\" href=\"#defining-a-handler\" aria-label=\"Link to this section\">\u003C/a>Defining a handler\u003C/h2>\n\u003Cp>Create a file in \u003Ccode>agents/handlers/\u003C/code> and export a \u003Ccode>defineHandler\u003C/code> call as the default export. The file name is the handler name: \u003Ccode>agents/handlers/relay_pipe.ts\u003C/code> defines the handler \u003Ccode>relay_pipe\u003C/code>.\u003C/p>\n\u003Cfigure class=\"docs-code\" data-docs=\"code\" data-lang=\"typescript\">\u003Cpre class=\"shiki shiki-themes one-light github-dark\" style=\"--shiki-light:#383A42;--shiki-dark:#e1e4e8;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#24292e\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit\">// agents/handlers/relay_pipe.ts\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">import\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> { \u003C/span>\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">defineHandler\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> } \u003C/span>\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">from\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\"> '@standardagents/spec'\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">export\u003C/span>\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#F97583\"> default\u003C/span>\u003Cspan style=\"--shiki-light:#4078F2;--shiki-dark:#B392F0\"> defineHandler\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">({\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">  description\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#E1E4E8\">:\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\"> 'Forwards each user message to the assistant child.'\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#4078F2;--shiki-dark:#B392F0\">  execute\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#E1E4E8\">:\u003C/span>\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\"> async\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> (\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#FFAB70\">state\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">, \u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#FFAB70\">message\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">) \u003C/span>\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">=>\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">    const\u003C/span>\u003Cspan style=\"--shiki-light:#986801;--shiki-dark:#79B8FF\"> child\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#F97583\"> =\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> state.\u003C/span>\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">children\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">.\u003C/span>\u003Cspan style=\"--shiki-light:#4078F2;--shiki-dark:#B392F0\">find\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">((\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#FFAB70\">c\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">) \u003C/span>\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">=>\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> c.\u003C/span>\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">relationship\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#F97583\"> ===\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\"> 'assistant_agent'\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">    if\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> (\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#F97583\">!\u003C/span>\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">child\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">) \u003C/span>\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">return\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">    const\u003C/span>\u003Cspan style=\"--shiki-light:#986801;--shiki-dark:#79B8FF\"> thread\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#F97583\"> =\u003C/span>\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\"> await\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> state.\u003C/span>\u003Cspan style=\"--shiki-light:#4078F2;--shiki-dark:#B392F0\">getChildThread\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">(child.\u003C/span>\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">reference\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">    await\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> thread?.\u003C/span>\u003Cspan style=\"--shiki-light:#4078F2;--shiki-dark:#B392F0\">queueMessage\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">({ \u003C/span>\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">role\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#E1E4E8\">:\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\"> 'user'\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">, \u003C/span>\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">content\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#E1E4E8\">:\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> message.\u003C/span>\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">content\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#F97583\"> ??\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\"> ''\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> });\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">  },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">});\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\u003C/figure>\n\u003Cdiv class=\"docs-table\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Property\u003C/th>\n\u003Cth>Type\u003C/th>\n\u003Cth>Required\u003C/th>\n\u003Cth>Description\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>description\u003C/code>\u003C/td>\n\u003Ctd>\u003Ccode>string\u003C/code>\u003C/td>\n\u003Ctd>No\u003C/td>\n\u003Ctd>A summary for people who read the definition\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>execute\u003C/code>\u003C/td>\n\u003Ctd>\u003Ccode>(state: ThreadState, message: Message) => Promise&#x3C;void>\u003C/code>\u003C/td>\n\u003Ctd>Yes\u003C/td>\n\u003Ctd>The turn implementation\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\u003C/div>\n\u003Cp>\u003Ccode>message\u003C/code> is the complete persisted message, with its \u003Ccode>id\u003C/code>, \u003Ccode>role\u003C/code>, \u003Ccode>content\u003C/code>, \u003Ccode>silent\u003C/code> flag, \u003Ccode>metadata\u003C/code>, and \u003Ccode>created_at\u003C/code> timestamp.\u003C/p>\n\u003Ch2 id=\"referencing-a-handler\">\u003Ca class=\"docs-anchor\" href=\"#referencing-a-handler\" aria-label=\"Link to this section\">\u003C/a>Referencing a handler\u003C/h2>\n\u003Cp>Reference a handler from the \u003Ccode>handler\u003C/code> property of a side in \u003Ccode>defineAgent\u003C/code>. This is the only place that can reference a handler.\u003C/p>\n\u003Cfigure class=\"docs-code\" data-docs=\"code\" data-lang=\"typescript\">\u003Cpre class=\"shiki shiki-themes one-light github-dark\" style=\"--shiki-light:#383A42;--shiki-dark:#e1e4e8;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#24292e\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit\">// agents/agents/relay_agent.ts\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">import\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> { \u003C/span>\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">defineAgent\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> } \u003C/span>\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">from\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\"> '@standardagents/spec'\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">export\u003C/span>\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#F97583\"> default\u003C/span>\u003Cspan style=\"--shiki-light:#4078F2;--shiki-dark:#B392F0\"> defineAgent\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">({\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">  name\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#E1E4E8\">:\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\"> 'relay_agent'\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">  sideA\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#E1E4E8\">:\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">    handler\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#E1E4E8\">:\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\"> 'relay_pipe'\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">    subagents\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#E1E4E8\">:\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> [\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">      {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">        agent\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#E1E4E8\">:\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\"> 'assistant_agent'\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">        maxInstances\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#E1E4E8\">:\u003C/span>\u003Cspan style=\"--shiki-light:#986801;--shiki-dark:#79B8FF\"> 1\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">        immediate\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#E1E4E8\">:\u003C/span>\u003Cspan style=\"--shiki-light:#986801;--shiki-dark:#79B8FF\"> true\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">        parentCommunication\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#E1E4E8\">:\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\"> 'explicit'\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">      },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">    ],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">  },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">  sideB\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#E1E4E8\">:\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> { \u003C/span>\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">human\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#E1E4E8\">:\u003C/span>\u003Cspan style=\"--shiki-light:#986801;--shiki-dark:#79B8FF\"> true\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">});\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\u003C/figure>\n\u003Cp>A handler-backed side accepts \u003Ccode>handler\u003C/code>, \u003Ccode>label\u003C/code>, and \u003Ccode>subagents\u003C/code>. It does not accept \u003Ccode>maxSteps\u003C/code>, \u003Ccode>stopOnResponse\u003C/code>, \u003Ccode>stopTool\u003C/code>, or the session bindings, because a handler turn has no steps.\u003C/p>\n\u003Cp>Standard Agents Builder rejects a prompt whose \u003Ccode>tools\u003C/code> or \u003Ccode>hooks\u003C/code> array names a handler. The error is raised before the prompt's side runs.\u003C/p>\n\u003Ch2 id=\"example-a-chat-command\">\u003Ca class=\"docs-anchor\" href=\"#example-a-chat-command\" aria-label=\"Link to this section\">\u003C/a>Example: a chat command\u003C/h2>\n\u003Cp>This agent closes a GitHub issue when a person sends \u003Ccode>/close\u003C/code> and an issue number. The \u003Ccode>close_command\u003C/code> handler backs side A, so the agent sends no model request.\u003C/p>\n\u003Cdiv class=\"docs-agent\" data-docs=\"agent-diagram\" style=\"--docs-diagram-w: 475px\">\u003Cfigure class=\"docs-agent-diagram\">\u003Cdiv class=\"docs-agent-diagram-canvas\">\u003Csvg class=\"dg-svg\" viewBox=\"-1 -1 475 171\" width=\"475\" height=\"171\" role=\"img\" aria-labelledby=\"ad-yix12p-title\" aria-describedby=\"ad-yix12p-desc\">\u003Ctitle id=\"ad-yix12p-title\">Agent diagram: close_bot\u003C/title>\u003Cdesc id=\"ad-yix12p-desc\">The agent close_bot has two sides. Side B is a human. Side A is the close_command handler.\u003C/desc>\u003Cdefs>\u003Cmarker id=\"ad-yix12p-arrow\" viewBox=\"0 0 8 8\" refX=\"7.5\" refY=\"4\" markerWidth=\"8\" markerHeight=\"8\" markerUnits=\"userSpaceOnUse\" orient=\"auto\">\u003Cpath class=\"dg-arrowhead\" d=\"M0 .5 7.5 4 0 7.5z\"/>\u003C/marker>\u003C/defs>\u003Cg class=\"dg-node dg-node--person\" transform=\"translate(16 72)\">\u003Crect class=\"dg-panel\" x=\".5\" y=\".5\" width=\"127\" height=\"75\"/>\u003Crect class=\"dg-mark\" x=\"12\" y=\"13\" width=\"6\" height=\"6\"/>\u003Ctext class=\"dg-label\" x=\"24\" y=\"20\">SIDE B\u003C/text>\u003Ctext class=\"dg-title\" x=\"12\" y=\"54\">Human\u003C/text>\u003Cpath class=\"dg-fold\" d=\"M120 0h8v8z\"/>\u003C/g>\u003Cg class=\"dg-node dg-node--handler\" transform=\"translate(312 72)\" data-file=\"agents/handlers/close_command.ts\">\u003Crect class=\"dg-panel dg-panel--handler\" x=\".5\" y=\".5\" width=\"144\" height=\"75\"/>\u003Crect class=\"dg-mark\" x=\"12\" y=\"13\" width=\"6\" height=\"6\"/>\u003Ctext class=\"dg-label\" x=\"24\" y=\"20\">SIDE A\u003C/text>\u003Ctext class=\"dg-mono\" x=\"12\" y=\"52\">close_command\u003C/text>\u003Cpath class=\"dg-fold\" d=\"M137 0h8v8z\"/>\u003C/g>\u003Cg class=\"dg-lines\">\u003Crect class=\"dg-frame dg-frame--agent\" x=\"0.5\" y=\"0.5\" width=\"472\" height=\"168\"/>\u003Cg class=\"dg-pixel\">\u003Cpath class=\"dg-wire dg-wire--signal\" d=\"M144 120L312 120\" marker-end=\"url(#ad-yix12p-arrow)\"/>\u003Cpath class=\"dg-wire dg-wire--signal\" d=\"M312 132L144 132\" marker-end=\"url(#ad-yix12p-arrow)\"/>\u003C/g>\u003Ctext class=\"dg-edge-label\" x=\"160\" y=\"110\">message\u003C/text>\u003Ctext class=\"dg-edge-label\" x=\"211\" y=\"150\">reply\u003C/text>\u003C/g>\u003Cg class=\"dg-node dg-node--agent\" transform=\"translate(16 16)\" data-file=\"agents/agents/close_bot.ts\">\u003Crect class=\"dg-tag\" x=\".5\" y=\".5\" width=\"144\" height=\"31\"/>\u003Crect class=\"dg-mark\" x=\"12\" y=\"13\" width=\"6\" height=\"6\"/>\u003Ctext class=\"dg-label\" x=\"24\" y=\"20\">AGENT\u003C/text>\u003Ctext class=\"dg-mono\" x=\"66\" y=\"20\">close_bot\u003C/text>\u003Cpath class=\"dg-fold\" d=\"M137 0h8v8z\"/>\u003C/g>\u003C/svg>\u003C/div>\u003C/figure>\u003Cdiv class=\"docs-files\" id=\"docs-files-1\" data-docs=\"files\" style=\"--docs-files-h: 26.00rem\">\u003Cselect class=\"docs-files-select\" aria-label=\"Choose a file\" hidden>\u003Coption value=\"agents/agents/close_bot.ts\">agents/close_bot.ts\u003C/option>\u003Coption value=\"agents/handlers/close_command.ts\">handlers/close_command.ts\u003C/option>\u003C/select>\u003Cnav class=\"docs-files-nav\" aria-label=\"Files\">\u003Cspan class=\"docs-files-title\" aria-hidden=\"true\">Files\u003C/span>\u003Cul class=\"docs-files-tree\">\u003Cli>\u003Cspan class=\"docs-files-folder\">agents\u003C/span>\u003Cul class=\"docs-files-tree\">\u003Cli>\u003Ca class=\"docs-files-link\" href=\"#docs-files-1-agents-agents-close-bot-ts\" data-file=\"agents/agents/close_bot.ts\">close_bot.ts\u003C/a>\u003C/li>\u003C/ul>\u003C/li>\u003Cli>\u003Cspan class=\"docs-files-folder\">handlers\u003C/span>\u003Cul class=\"docs-files-tree\">\u003Cli>\u003Ca class=\"docs-files-link\" href=\"#docs-files-1-agents-handlers-close-command-ts\" data-file=\"agents/handlers/close_command.ts\">close_command.ts\u003C/a>\u003C/li>\u003C/ul>\u003C/li>\u003C/ul>\u003C/nav>\u003Cdiv class=\"docs-files-panels\">\u003Csection class=\"docs-files-panel\" id=\"docs-files-1-agents-agents-close-bot-ts\" data-file=\"agents/agents/close_bot.ts\" aria-label=\"agents/agents/close_bot.ts\">\u003Cfigure class=\"docs-code\" data-docs=\"code\" data-lang=\"ts\">\u003Cfigcaption class=\"docs-code-title\">\u003Cspan class=\"docs-files-dir\">agents/agents/\u003C/span>\u003Cb>close_bot.ts\u003C/b>\u003C/figcaption>\u003Cpre class=\"shiki shiki-themes one-light github-dark\" style=\"--shiki-light:#383A42;--shiki-dark:#e1e4e8;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#24292e\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">import\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> { \u003C/span>\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">defineAgent\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> } \u003C/span>\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">from\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\"> '@standardagents/spec'\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">export\u003C/span>\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#F97583\"> default\u003C/span>\u003Cspan style=\"--shiki-light:#4078F2;--shiki-dark:#B392F0\"> defineAgent\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">({\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">  name\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#E1E4E8\">:\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\"> 'close_bot'\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">  sideA\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#E1E4E8\">:\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> { \u003C/span>\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">handler\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#E1E4E8\">:\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\"> 'close_command'\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">  sideB\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#E1E4E8\">:\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> { \u003C/span>\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">human\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#E1E4E8\">:\u003C/span>\u003Cspan style=\"--shiki-light:#986801;--shiki-dark:#79B8FF\"> true\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">});\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\u003C/figure>\u003C/section>\u003Csection class=\"docs-files-panel\" id=\"docs-files-1-agents-handlers-close-command-ts\" data-file=\"agents/handlers/close_command.ts\" aria-label=\"agents/handlers/close_command.ts\">\u003Cfigure class=\"docs-code\" data-docs=\"code\" data-lang=\"ts\">\u003Cfigcaption class=\"docs-code-title\">\u003Cspan class=\"docs-files-dir\">agents/handlers/\u003C/span>\u003Cb>close_command.ts\u003C/b>\u003C/figcaption>\u003Cpre class=\"shiki shiki-themes one-light github-dark\" style=\"--shiki-light:#383A42;--shiki-dark:#e1e4e8;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#24292e\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">import\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> { \u003C/span>\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">defineHandler\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">, \u003C/span>\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">type\u003C/span>\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\"> ThreadState\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> } \u003C/span>\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">from\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\"> '@standardagents/spec'\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">const\u003C/span>\u003Cspan style=\"--shiki-light:#986801;--shiki-dark:#79B8FF\"> REPOSITORY\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#F97583\"> =\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\"> 'acme/widgets'\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">async\u003C/span>\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\"> function\u003C/span>\u003Cspan style=\"--shiki-light:#4078F2;--shiki-dark:#B392F0\"> closeIssue\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">(\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#FFAB70\">state\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#F97583\">:\u003C/span>\u003Cspan style=\"--shiki-light:#C18401;--shiki-dark:#B392F0\"> ThreadState\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">, \u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#FFAB70\">number\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#F97583\">:\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#79B8FF\"> string\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">)\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#F97583\">:\u003C/span>\u003Cspan style=\"--shiki-light:#C18401;--shiki-dark:#B392F0\"> Promise\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">&#x3C;\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#79B8FF\">string\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">  const\u003C/span>\u003Cspan style=\"--shiki-light:#986801;--shiki-dark:#79B8FF\"> token\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#F97583\"> =\u003C/span>\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\"> await\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> state.\u003C/span>\u003Cspan style=\"--shiki-light:#4078F2;--shiki-dark:#B392F0\">env\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">(\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\">'GITHUB_TOKEN'\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">).\u003C/span>\u003Cspan style=\"--shiki-light:#4078F2;--shiki-dark:#B392F0\">catch\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">(() \u003C/span>\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">=>\u003C/span>\u003Cspan style=\"--shiki-light:#986801;--shiki-dark:#79B8FF\"> null\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">  if\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> (\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#F97583\">!\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">token) \u003C/span>\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">return\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\"> `Issue \u003C/span>\u003Cspan style=\"--shiki-light:#CA1243;--shiki-dark:#9ECBFF\">${\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">number\u003C/span>\u003Cspan style=\"--shiki-light:#CA1243;--shiki-dark:#9ECBFF\">}\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\"> is still open. No GITHUB_TOKEN is set.`\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">  const\u003C/span>\u003Cspan style=\"--shiki-light:#986801;--shiki-dark:#79B8FF\"> response\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#F97583\"> =\u003C/span>\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\"> await\u003C/span>\u003Cspan style=\"--shiki-light:#4078F2;--shiki-dark:#B392F0\"> fetch\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">(\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\">    `https://api.github.com/repos/\u003C/span>\u003Cspan style=\"--shiki-light:#CA1243;--shiki-dark:#9ECBFF\">${\u003C/span>\u003Cspan style=\"--shiki-light:#986801;--shiki-dark:#79B8FF\">REPOSITORY\u003C/span>\u003Cspan style=\"--shiki-light:#CA1243;--shiki-dark:#9ECBFF\">}\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\">/issues/\u003C/span>\u003Cspan style=\"--shiki-light:#CA1243;--shiki-dark:#9ECBFF\">${\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">number\u003C/span>\u003Cspan style=\"--shiki-light:#CA1243;--shiki-dark:#9ECBFF\">}\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\">`\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">    {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">      method\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#E1E4E8\">:\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\"> 'PATCH'\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">      headers\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#E1E4E8\">:\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">        Accept\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#E1E4E8\">:\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\"> 'application/vnd.github+json'\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">        Authorization\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#E1E4E8\">:\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\"> `Bearer \u003C/span>\u003Cspan style=\"--shiki-light:#CA1243;--shiki-dark:#9ECBFF\">${\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">token\u003C/span>\u003Cspan style=\"--shiki-light:#CA1243;--shiki-dark:#9ECBFF\">}\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\">`\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\">        'User-Agent'\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#E1E4E8\">:\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\"> 'standard-agent-example'\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">      },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">      body\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#E1E4E8\">:\u003C/span>\u003Cspan style=\"--shiki-light:#986801;--shiki-dark:#79B8FF\"> JSON\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">.\u003C/span>\u003Cspan style=\"--shiki-light:#4078F2;--shiki-dark:#B392F0\">stringify\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">({ \u003C/span>\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">state\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#E1E4E8\">:\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\"> 'closed'\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> }),\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">    },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">  ).\u003C/span>\u003Cspan style=\"--shiki-light:#4078F2;--shiki-dark:#B392F0\">catch\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">(() \u003C/span>\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">=>\u003C/span>\u003Cspan style=\"--shiki-light:#986801;--shiki-dark:#79B8FF\"> null\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">  if\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> (\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#F97583\">!\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">response?.\u003C/span>\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">ok\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">    const\u003C/span>\u003Cspan style=\"--shiki-light:#986801;--shiki-dark:#79B8FF\"> reason\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#F97583\"> =\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> response \u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#F97583\">?\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\"> `GitHub returned \u003C/span>\u003Cspan style=\"--shiki-light:#CA1243;--shiki-dark:#9ECBFF\">${\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">response\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\">.\u003C/span>\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">status\u003C/span>\u003Cspan style=\"--shiki-light:#CA1243;--shiki-dark:#9ECBFF\">}\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\">`\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#F97583\"> :\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\"> 'GitHub did not respond'\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">    return\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\"> `Issue \u003C/span>\u003Cspan style=\"--shiki-light:#CA1243;--shiki-dark:#9ECBFF\">${\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">number\u003C/span>\u003Cspan style=\"--shiki-light:#CA1243;--shiki-dark:#9ECBFF\">}\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\"> is still open. \u003C/span>\u003Cspan style=\"--shiki-light:#CA1243;--shiki-dark:#9ECBFF\">${\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">reason\u003C/span>\u003Cspan style=\"--shiki-light:#CA1243;--shiki-dark:#9ECBFF\">}\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\">.`\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">  }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">  const\u003C/span>\u003Cspan style=\"--shiki-light:#986801;--shiki-dark:#79B8FF\"> issue\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#F97583\"> =\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> (\u003C/span>\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">await\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> response.\u003C/span>\u003Cspan style=\"--shiki-light:#4078F2;--shiki-dark:#B392F0\">json\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">()) \u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#F97583\">as\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> { \u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#FFAB70\">title\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#F97583\">:\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#79B8FF\"> string\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> };\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">  return\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\"> `Closed issue \u003C/span>\u003Cspan style=\"--shiki-light:#CA1243;--shiki-dark:#9ECBFF\">${\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">number\u003C/span>\u003Cspan style=\"--shiki-light:#CA1243;--shiki-dark:#9ECBFF\">}\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\">: \u003C/span>\u003Cspan style=\"--shiki-light:#CA1243;--shiki-dark:#9ECBFF\">${\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">issue\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\">.\u003C/span>\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">title\u003C/span>\u003Cspan style=\"--shiki-light:#CA1243;--shiki-dark:#9ECBFF\">}\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\">.`\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">export\u003C/span>\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#F97583\"> default\u003C/span>\u003Cspan style=\"--shiki-light:#4078F2;--shiki-dark:#B392F0\"> defineHandler\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">({\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">  description\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#E1E4E8\">:\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\"> 'Closes one GitHub issue when a person sends /close and its number.'\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#4078F2;--shiki-dark:#B392F0\">  execute\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#E1E4E8\">:\u003C/span>\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\"> async\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> (\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#FFAB70\">state\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">, \u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#FFAB70\">message\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">) \u003C/span>\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">=>\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">    const\u003C/span>\u003Cspan style=\"--shiki-light:#986801;--shiki-dark:#79B8FF\"> number\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#F97583\"> =\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> message.\u003C/span>\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">content\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">?.\u003C/span>\u003Cspan style=\"--shiki-light:#4078F2;--shiki-dark:#B392F0\">trim\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">().\u003C/span>\u003Cspan style=\"--shiki-light:#4078F2;--shiki-dark:#B392F0\">match\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">(\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#9ECBFF\">/\u003C/span>\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">^\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-light-font-weight:inherit;--shiki-dark:#85E89D;--shiki-dark-font-weight:bold\">\\/\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#DBEDFF\">close\u003C/span>\u003Cspan style=\"--shiki-light:#986801;--shiki-dark:#79B8FF\">\\s\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#F97583\">+\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#DBEDFF\">(\u003C/span>\u003Cspan style=\"--shiki-light:#986801;--shiki-dark:#79B8FF\">\\d\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#F97583\">+\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#DBEDFF\">)\u003C/span>\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">$\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#9ECBFF\">/\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">)?.[\u003C/span>\u003Cspan style=\"--shiki-light:#986801;--shiki-dark:#79B8FF\">1\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">];\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">    const\u003C/span>\u003Cspan style=\"--shiki-light:#986801;--shiki-dark:#79B8FF\"> content\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#F97583\"> =\u003C/span>\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\"> number\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#F97583\">      ?\u003C/span>\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\"> await\u003C/span>\u003Cspan style=\"--shiki-light:#4078F2;--shiki-dark:#B392F0\"> closeIssue\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">(\u003C/span>\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">state\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">, \u003C/span>\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">number\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#F97583\">      :\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\"> 'Send /close and an issue number, such as /close 42.'\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">    await\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> state.\u003C/span>\u003Cspan style=\"--shiki-light:#4078F2;--shiki-dark:#B392F0\">injectMessage\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">({ \u003C/span>\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">role\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#E1E4E8\">:\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\"> 'assistant'\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">, \u003C/span>\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">content\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> });\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">  },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">});\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\u003C/figure>\u003C/section>\u003C/div>\u003C/div>\u003C/div>\n\u003Cp>The handler replies with \u003Ccode>state.injectMessage\u003C/code>. It reads \u003Ccode>GITHUB_TOKEN\u003C/code> with \u003Ccode>state.env\u003C/code>. A handler declares no variables, so set the token for your user account or your instance.\u003C/p>\n\u003Ch2 id=\"execution-model\">\u003Ca class=\"docs-anchor\" href=\"#execution-model\" aria-label=\"Link to this section\">\u003C/a>Execution model\u003C/h2>\n\u003Cp>A turn of a handler-backed side has three stages:\u003C/p>\n\u003Col>\n\u003Cli>An inbound message arrives on the side's perspective. Side A acts on \u003Ccode>user\u003C/code> messages. Side B acts on \u003Ccode>assistant\u003C/code> messages.\u003C/li>\n\u003Cli>The runtime calls \u003Ccode>execute\u003C/code> once with the thread's \u003Ccode>ThreadState\u003C/code> and that message.\u003C/li>\n\u003Cli>\u003Ccode>execute\u003C/code> returns or throws. The turn is complete.\u003C/li>\n\u003C/ol>\n\u003Cp>When the agent sets \u003Ccode>maxSessionTurns\u003C/code>, a handler turn counts toward that limit in the same way as a prompt turn.\u003C/p>\n\u003Cp>Each handler call writes one row to the thread's logs. The row names the handler and records its duration.\u003C/p>\n\u003Ch2 id=\"delivery\">\u003Ca class=\"docs-anchor\" href=\"#delivery\" aria-label=\"Link to this section\">\u003C/a>Delivery\u003C/h2>\n\u003Cp>Standard Agents Builder delivers each inbound message to the handler one time:\u003C/p>\n\u003Cul>\n\u003Cli>The handler runs once for each inbound message, in the order the messages were stored.\u003C/li>\n\u003Cli>One thread never runs two handler calls at the same time. A message that arrives during a handler call waits and is delivered after that call returns.\u003C/li>\n\u003Cli>A message whose handler call failed is not delivered again. Send the message again to retry.\u003C/li>\n\u003Cli>The runtime records the delivery position before each call. A restart during a call does not deliver that message a second time.\u003C/li>\n\u003C/ul>\n\u003Caside class=\"docs-callout\" data-kind=\"warning\" role=\"note\">\u003Cp>A handler that runs for a long time delays every later message on its thread. A handler that waits for a \u003Ccode>blocking\u003C/code> child session holds the thread for the whole session. If that child can finish only after another message arrives on this thread, the thread stops making progress. Forward with \u003Ccode>queueMessage()\u003C/code> and handle the child's reply as a later turn.\u003C/p>\u003C/aside>\n\u003Ch2 id=\"errors\">\u003Ca class=\"docs-anchor\" href=\"#errors\" aria-label=\"Link to this section\">\u003C/a>Errors\u003C/h2>\n\u003Cp>A handler that throws fails that delivery only:\u003C/p>\n\u003Cul>\n\u003Cli>The log row for the call records the error with \u003Ccode>error_type\u003C/code> \u003Ccode>handler_execution_error\u003C/code> and a runtime origin.\u003C/li>\n\u003Cli>The inbound message stays stored. Nothing is rolled back.\u003C/li>\n\u003Cli>The session continues. The next inbound message starts a new handler call.\u003C/li>\n\u003C/ul>\n\u003Cp>To end the session after an error, catch the error and call \u003Ccode>state.stopSession()\u003C/code>.\u003C/p>\n\u003Ch2 id=\"what-a-handler-can-do\">\u003Ca class=\"docs-anchor\" href=\"#what-a-handler-can-do\" aria-label=\"Link to this section\">\u003C/a>What a handler can do\u003C/h2>\n\u003Cp>\u003Ccode>execute\u003C/code> receives the same \u003Ccode>ThreadState\u003C/code> that tools receive:\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Forward\u003C/strong>: \u003Ccode>(await state.getChildThread(reference))?.queueMessage(...)\u003C/code> sends a message to a child. \u003Ccode>state.notifyParent(...)\u003C/code> sends one to a parent.\u003C/li>\n\u003Cli>\u003Cstrong>Respond\u003C/strong>: \u003Ccode>state.injectMessage({ role, content })\u003C/code> writes a message in the side's own role. The role is \u003Ccode>assistant\u003C/code> for side A and \u003Ccode>user\u003C/code> for side B.\u003C/li>\n\u003Cli>\u003Cstrong>Use children\u003C/strong>: the side's \u003Ccode>subagents\u003C/code> declarations make child instances available through \u003Ccode>state.children\u003C/code>. A handler needs no lifecycle tools.\u003C/li>\n\u003Cli>\u003Cstrong>Control\u003C/strong>: \u003Ccode>state.stopSession()\u003C/code>, \u003Ccode>state.setStatus()\u003C/code>, \u003Ccode>state.scheduleEffect()\u003C/code>, the environment, the thread values, and the file system.\u003C/li>\n\u003C/ul>\n\u003Cfigure class=\"docs-code\" data-docs=\"code\" data-lang=\"typescript\">\u003Cpre class=\"shiki shiki-themes one-light github-dark\" style=\"--shiki-light:#383A42;--shiki-dark:#e1e4e8;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#24292e\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit\">// agents/handlers/echo_once.ts\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">import\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> { \u003C/span>\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">defineHandler\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> } \u003C/span>\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">from\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\"> '@standardagents/spec'\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">export\u003C/span>\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#F97583\"> default\u003C/span>\u003Cspan style=\"--shiki-light:#4078F2;--shiki-dark:#B392F0\"> defineHandler\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">({\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">  description\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#E1E4E8\">:\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\"> 'Replies to the first message and then ends the session.'\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#4078F2;--shiki-dark:#B392F0\">  execute\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#E1E4E8\">:\u003C/span>\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\"> async\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> (\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#FFAB70\">state\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">, \u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#FFAB70\">message\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">) \u003C/span>\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">=>\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">    await\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> state.\u003C/span>\u003Cspan style=\"--shiki-light:#4078F2;--shiki-dark:#B392F0\">injectMessage\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">({\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">      role\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#E1E4E8\">:\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\"> 'assistant'\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">      content\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#E1E4E8\">:\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\"> `Received: \u003C/span>\u003Cspan style=\"--shiki-light:#CA1243;--shiki-dark:#9ECBFF\">${\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">message\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\">.\u003C/span>\u003Cspan style=\"--shiki-light:#E45649;--shiki-dark:#E1E4E8\">content\u003C/span>\u003Cspan style=\"--shiki-light:#0184BC;--shiki-dark:#F97583\"> ??\u003C/span>\u003Cspan style=\"--shiki-light:#CA1243;--shiki-dark:#9ECBFF\"> ''}\u003C/span>\u003Cspan style=\"--shiki-light:#50A14F;--shiki-dark:#9ECBFF\">`\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">    });\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#A626A4;--shiki-dark:#F97583\">    await\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\"> state.\u003C/span>\u003Cspan style=\"--shiki-light:#4078F2;--shiki-dark:#B392F0\">stopSession\u003C/span>\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">();\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">  },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#383A42;--shiki-dark:#E1E4E8\">});\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\u003C/figure>\n\u003Cp>The runtime gives a handler no reply channel of its own. A handler that must reach a person or an external system calls that system in its own code.\u003C/p>\n\u003Ch2 id=\"avoiding-message-loops\">\u003Ca class=\"docs-anchor\" href=\"#avoiding-message-loops\" aria-label=\"Link to this section\">\u003C/a>Avoiding message loops\u003C/h2>\n\u003Cp>A handler runs only when a message arrives. A handler that replies to every inbound message can still exchange messages with a prompt-backed side without end. Use one of these controls:\u003C/p>\n\u003Cul>\n\u003Cli>Reply only when a condition holds.\u003C/li>\n\u003Cli>Set \u003Ccode>maxSessionTurns\u003C/code> on the agent.\u003C/li>\n\u003Cli>Call \u003Ccode>state.stopSession()\u003C/code> when the work is done.\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"next-steps\">\u003Ca class=\"docs-anchor\" href=\"#next-steps\" aria-label=\"Link to this section\">\u003C/a>Next steps\u003C/h2>\n\u003Cdiv class=\"docs-card-group\" data-cols=\"2\">\u003Ca class=\"docs-card\" href=\"/docs/core-concepts/agents\">\u003Cspan class=\"docs-icon\" data-icon=\"robot\">\u003C/span>\u003Cspan class=\"docs-card-title\">Agents\u003C/span>\u003Cdiv class=\"docs-card-body\">\u003Cp>Choose what backs each side of an agent\u003C/p>\u003C/div>\u003C/a>\u003Ca class=\"docs-card\" href=\"/docs/core-concepts/subagents\">\u003Cspan class=\"docs-icon\" data-icon=\"sitemap\">\u003C/span>\u003Cspan class=\"docs-card-title\">Subagents\u003C/span>\u003Cdiv class=\"docs-card-body\">\u003Cp>Declare the child relationships a handler forwards to\u003C/p>\u003C/div>\u003C/a>\u003Ca class=\"docs-card\" href=\"/docs/core-concepts/flowstate\">\u003Cspan class=\"docs-icon\" data-icon=\"database\">\u003C/span>\u003Cspan class=\"docs-card-title\">ThreadState\u003C/span>\u003Cdiv class=\"docs-card-body\">\u003Cp>See the state object a handler receives\u003C/p>\u003C/div>\u003C/a>\u003Ca class=\"docs-card\" href=\"/docs/core-concepts/effects\">\u003Cspan class=\"docs-icon\" data-icon=\"clock\">\u003C/span>\u003Cspan class=\"docs-card-title\">Effects\u003C/span>\u003Cdiv class=\"docs-card-body\">\u003Cp>Schedule work that runs outside a turn\u003C/p>\u003C/div>\u003C/a>\u003C/div>",[9,13,16,19,22,25,28,31,34,37],{"id":10,"text":11,"depth":12},"what-is-a-handler","What is a handler?",2,{"id":14,"text":15,"depth":12},"defining-a-handler","Defining a handler",{"id":17,"text":18,"depth":12},"referencing-a-handler","Referencing a handler",{"id":20,"text":21,"depth":12},"example-a-chat-command","Example: a chat command",{"id":23,"text":24,"depth":12},"execution-model","Execution model",{"id":26,"text":27,"depth":12},"delivery","Delivery",{"id":29,"text":30,"depth":12},"errors","Errors",{"id":32,"text":33,"depth":12},"what-a-handler-can-do","What a handler can do",{"id":35,"text":36,"depth":12},"avoiding-message-loops","Avoiding message loops",{"id":38,"text":39,"depth":12},"next-steps","Next steps","core-concepts/handlers","docs","Core Concepts",{"path":44,"title":45,"navTitle":45},"core-concepts/agents","Agents",{"path":47,"title":48,"navTitle":48},"core-concepts/subagents","Subagents","/docs/core-concepts/handlers.md","https://github.com/standardagents/agentbuilder/blob/main/docs/core-concepts/handlers.mdx",1794580508878]