Buckets:

HuggingFaceDocBuilder's picture
download
raw
38.6 kB
import{s as Ie,o as be,n as F}from"../chunks/scheduler.b8c17244.js";import{S as xe,i as qe,e as w,s as d,c as v,h as Ve,a as C,d as s,b as u,f as ke,g as I,j as h,k as ve,l as _e,m as l,n as b,t as x,o as q,p as V}from"../chunks/index.d374165a.js";import{C as Ae,H as te,E as Ne}from"../chunks/MermaidChart.svelte_svelte_type_style_lang.8f6ea2ad.js";import{C as G}from"../chunks/CodeBlock.f49d9e4f.js";import{H as ye,a as B}from"../chunks/HfOption.f3c7356c.js";function He(A){let n,m="Claude Code has the richest event set of the three platforms. Every event uses <code>PascalCase</code> and is configured in <code>.claude/settings.json</code> (or inside a plugin’s <code>hooks/hooks.json</code>).",J,i,U="<strong>Core lifecycle events:</strong>",p,e,c="<li><code>SessionStart</code> — New session begins (fresh, resume, or compaction continuation).</li> <li><code>InstructionsLoaded</code> — <code>CLAUDE.md</code> files have been loaded.</li> <li><code>UserPromptSubmit</code> — User submitted a prompt, before the model sees it.</li> <li><code>PreToolUse</code> — Before a tool call runs.</li> <li><code>PermissionRequest</code> — Permission prompt about to be shown.</li> <li><code>PermissionDenied</code> — User denied a permission.</li> <li><code>PostToolUse</code> — After a tool call returns.</li> <li><code>PostToolUseFailure</code> — Tool call failed.</li> <li><code>Stop</code> — Turn finished.</li> <li><code>SessionEnd</code> — Session closed.</li>",o,T,$="<strong>Subagent and task events:</strong>",r,j,_="<li><code>SubagentStart</code>, <code>SubagentStop</code> — A delegated subagent starts or finishes.</li> <li><code>TaskCreated</code>, <code>TaskCompleted</code> — The TodoWrite task list changes.</li>",y,k,N="<strong>Environment events:</strong>",a,f,se="<li><code>CwdChanged</code>, <code>FileChanged</code> — Working directory or a tracked file changed.</li> <li><code>WorktreeCreate</code>, <code>WorktreeRemove</code> — Git worktree created or removed.</li> <li><code>PreCompact</code>, <code>PostCompact</code> — Context compaction about to happen / just finished.</li> <li><code>ConfigChange</code>, <code>Notification</code> — Settings changed; Claude raised a notification.</li>",L,S,R="Each event can match on tool name, command pattern, or permission rules. Matchers use the same permission-rule syntax you see elsewhere in Claude Code (e.g. <code>&quot;matcher&quot;: &quot;Bash&quot;</code>, <code>&quot;matcher&quot;: &quot;Edit(src/**)&quot;</code>).";return{c(){n=w("p"),n.innerHTML=m,J=d(),i=w("p"),i.innerHTML=U,p=d(),e=w("ul"),e.innerHTML=c,o=d(),T=w("p"),T.innerHTML=$,r=d(),j=w("ul"),j.innerHTML=_,y=d(),k=w("p"),k.innerHTML=N,a=d(),f=w("ul"),f.innerHTML=se,L=d(),S=w("p"),S.innerHTML=R},l(g){n=C(g,"P",{"data-svelte-h":!0}),h(n)!=="svelte-141exu1"&&(n.innerHTML=m),J=u(g),i=C(g,"P",{"data-svelte-h":!0}),h(i)!=="svelte-1qc384v"&&(i.innerHTML=U),p=u(g),e=C(g,"UL",{"data-svelte-h":!0}),h(e)!=="svelte-1eyulqb"&&(e.innerHTML=c),o=u(g),T=C(g,"P",{"data-svelte-h":!0}),h(T)!=="svelte-5o593n"&&(T.innerHTML=$),r=u(g),j=C(g,"UL",{"data-svelte-h":!0}),h(j)!=="svelte-1cli2q3"&&(j.innerHTML=_),y=u(g),k=C(g,"P",{"data-svelte-h":!0}),h(k)!=="svelte-11gn61x"&&(k.innerHTML=N),a=u(g),f=C(g,"UL",{"data-svelte-h":!0}),h(f)!=="svelte-yvv7f9"&&(f.innerHTML=se),L=u(g),S=C(g,"P",{"data-svelte-h":!0}),h(S)!=="svelte-28j1kl"&&(S.innerHTML=R)},m(g,H){l(g,n,H),l(g,J,H),l(g,i,H),l(g,p,H),l(g,e,H),l(g,o,H),l(g,T,H),l(g,r,H),l(g,j,H),l(g,y,H),l(g,k,H),l(g,a,H),l(g,f,H),l(g,L,H),l(g,S,H)},p:F,d(g){g&&(s(n),s(J),s(i),s(p),s(e),s(o),s(T),s(r),s(j),s(y),s(k),s(a),s(f),s(L),s(S))}}}function Se(A){let n,m="Codex hooks are experimental and must be enabled explicitly. In <code>~/.codex/config.toml</code>:",J,i,U,p,e="Codex ships a smaller core set of events, all <code>PascalCase</code>, configured in <code>~/.codex/hooks.json</code> or <code>&lt;repo&gt;/.codex/hooks.json</code>:",c,o,T="<li><code>SessionStart</code> — Session begins. Matcher filters the <code>source</code> field: <code>startup</code> or <code>resume</code>.</li> <li><code>UserPromptSubmit</code> — User prompt submitted.</li> <li><code>PreToolUse</code> — Before a tool call. Today this only fires for the <code>Bash</code> tool.</li> <li><code>PostToolUse</code> — After a tool call. Today this also only fires for <code>Bash</code>.</li> <li><code>Stop</code> — Turn finished.</li>",$,r,j="The Codex event set is intentionally close to the classic Claude Code lifecycle, which makes cross-agent hook scripts easier to share — but note the current Bash-only scope on the tool events.",_,y,k="Matchers are regexes evaluated against <code>tool_name</code> for tool events or <code>source</code> for <code>SessionStart</code>. Windows is not yet supported.",N;return i=new G({props:{code:"JTVCZmVhdHVyZXMlNUQlMEFjb2RleF9ob29rcyUyMCUzRCUyMHRydWU=",highlighted:`<span class="hljs-section">[features]</span>
<span class="hljs-attr">codex_hooks</span> = <span class="hljs-literal">true</span>`,wrap:!1}}),{c(){n=w("p"),n.innerHTML=m,J=d(),v(i.$$.fragment),U=d(),p=w("p"),p.innerHTML=e,c=d(),o=w("ul"),o.innerHTML=T,$=d(),r=w("p"),r.textContent=j,_=d(),y=w("p"),y.innerHTML=k},l(a){n=C(a,"P",{"data-svelte-h":!0}),h(n)!=="svelte-1e446s3"&&(n.innerHTML=m),J=u(a),I(i.$$.fragment,a),U=u(a),p=C(a,"P",{"data-svelte-h":!0}),h(p)!=="svelte-1a5imjz"&&(p.innerHTML=e),c=u(a),o=C(a,"UL",{"data-svelte-h":!0}),h(o)!=="svelte-1vfkqxh"&&(o.innerHTML=T),$=u(a),r=C(a,"P",{"data-svelte-h":!0}),h(r)!=="svelte-ya5c2s"&&(r.textContent=j),_=u(a),y=C(a,"P",{"data-svelte-h":!0}),h(y)!=="svelte-ts2st6"&&(y.innerHTML=k)},m(a,f){l(a,n,f),l(a,J,f),b(i,a,f),l(a,U,f),l(a,p,f),l(a,c,f),l(a,o,f),l(a,$,f),l(a,r,f),l(a,_,f),l(a,y,f),N=!0},p:F,i(a){N||(x(i.$$.fragment,a),N=!0)},o(a){q(i.$$.fragment,a),N=!1},d(a){a&&(s(n),s(J),s(U),s(p),s(c),s(o),s($),s(r),s(_),s(y)),V(i,a)}}}function Le(A){let n,m="OpenCode does not have a JSON event config. Plugins are TypeScript or JavaScript modules in <code>.opencode/plugins/</code>, and each exported plugin returns an object whose <strong>keys are event names</strong>. The runtime calls the matching key when the event fires.",J,i,U="<strong>Typed hook keys (first-class):</strong>",p,e,c="<li><code>&quot;tool.execute.before&quot;</code> — About to execute a tool.</li> <li><code>&quot;tool.execute.after&quot;</code> — Tool execution finished.</li> <li><code>&quot;shell.env&quot;</code> — About to launch a shell command; mutate the environment.</li> <li><code>&quot;experimental.session.compacting&quot;</code> — Session is being compacted.</li>",o,T,$="<strong>Generic <code>event</code> callback</strong> — receives <code>{ event }</code> with an <code>event.type</code> field. Types include lifecycle and UI events like:",r,j,_="<li><code>session.created</code>, <code>session.updated</code>, <code>session.idle</code>, <code>session.compacted</code>, <code>session.deleted</code>, <code>session.error</code>, <code>session.diff</code>, <code>session.status</code></li> <li><code>message.updated</code>, <code>message.removed</code>, <code>message.part.updated</code>, <code>message.part.removed</code></li> <li><code>command.executed</code>, <code>file.edited</code>, <code>file.watcher.updated</code></li> <li><code>permission.asked</code>, <code>permission.replied</code></li> <li><code>lsp.client.diagnostics</code>, <code>lsp.updated</code></li> <li><code>todo.updated</code>, <code>server.connected</code>, <code>installation.updated</code></li> <li><code>tui.prompt.append</code>, <code>tui.command.execute</code>, <code>tui.toast.show</code></li>",y,k,N="OpenCode has no <code>UserPromptSubmit</code> event. The nearest equivalent is reading the new user message through the generic <code>event</code> callback when <code>message.updated</code> fires.";return{c(){n=w("p"),n.innerHTML=m,J=d(),i=w("p"),i.innerHTML=U,p=d(),e=w("ul"),e.innerHTML=c,o=d(),T=w("p"),T.innerHTML=$,r=d(),j=w("ul"),j.innerHTML=_,y=d(),k=w("p"),k.innerHTML=N},l(a){n=C(a,"P",{"data-svelte-h":!0}),h(n)!=="svelte-1fn00c4"&&(n.innerHTML=m),J=u(a),i=C(a,"P",{"data-svelte-h":!0}),h(i)!=="svelte-1hxbh1w"&&(i.innerHTML=U),p=u(a),e=C(a,"UL",{"data-svelte-h":!0}),h(e)!=="svelte-p3qgyq"&&(e.innerHTML=c),o=u(a),T=C(a,"P",{"data-svelte-h":!0}),h(T)!=="svelte-4k3nl9"&&(T.innerHTML=$),r=u(a),j=C(a,"UL",{"data-svelte-h":!0}),h(j)!=="svelte-9iivco"&&(j.innerHTML=_),y=u(a),k=C(a,"P",{"data-svelte-h":!0}),h(k)!=="svelte-8xa3cf"&&(k.innerHTML=N)},m(a,f){l(a,n,f),l(a,J,f),l(a,i,f),l(a,p,f),l(a,e,f),l(a,o,f),l(a,T,f),l(a,r,f),l(a,j,f),l(a,y,f),l(a,k,f)},p:F,d(a){a&&(s(n),s(J),s(i),s(p),s(e),s(o),s(T),s(r),s(j),s(y),s(k))}}}function Be(A){let n,m,J,i,U,p;return n=new B({props:{id:"tool",option:"Claude Code",$$slots:{default:[He]},$$scope:{ctx:A}}}),J=new B({props:{id:"tool",option:"Codex",$$slots:{default:[Se]},$$scope:{ctx:A}}}),U=new B({props:{id:"tool",option:"OpenCode",$$slots:{default:[Le]},$$scope:{ctx:A}}}),{c(){v(n.$$.fragment),m=d(),v(J.$$.fragment),i=d(),v(U.$$.fragment)},l(e){I(n.$$.fragment,e),m=u(e),I(J.$$.fragment,e),i=u(e),I(U.$$.fragment,e)},m(e,c){b(n,e,c),l(e,m,c),b(J,e,c),l(e,i,c),b(U,e,c),p=!0},p(e,c){const o={};c&2&&(o.$$scope={dirty:c,ctx:e}),n.$set(o);const T={};c&2&&(T.$$scope={dirty:c,ctx:e}),J.$set(T);const $={};c&2&&($.$$scope={dirty:c,ctx:e}),U.$set($)},i(e){p||(x(n.$$.fragment,e),x(J.$$.fragment,e),x(U.$$.fragment,e),p=!0)},o(e){q(n.$$.fragment,e),q(J.$$.fragment,e),q(U.$$.fragment,e),p=!1},d(e){e&&(s(m),s(i)),V(n,e),V(J,e),V(U,e)}}}function Fe(A){let n,m="Command hooks receive a JSON payload on <strong>stdin</strong>. HTTP hooks receive the same payload as the POST body. Common fields across events:",J,i,U,p,e="Tool-related events add <code>tool_name</code>, <code>tool_input</code>, and (on <code>PostToolUse</code>) <code>tool_response</code>. Subagent events add <code>agent_id</code> and <code>agent_type</code>. The project root is also available as an environment variable <code>CLAUDE_PROJECT_DIR</code>.",c;return i=new G({props:{code:"JTdCJTBBJTIwJTIwJTIyc2Vzc2lvbl9pZCUyMiUzQSUyMCUyMi4uLiUyMiUyQyUwQSUyMCUyMCUyMnRyYW5zY3JpcHRfcGF0aCUyMiUzQSUyMCUyMiUyRnBhdGglMkZ0byUyRnRyYW5zY3JpcHQuanNvbmwlMjIlMkMlMEElMjAlMjAlMjJjd2QlMjIlM0ElMjAlMjIlMkZwYXRoJTJGdG8lMkZwcm9qZWN0JTIyJTJDJTBBJTIwJTIwJTIycGVybWlzc2lvbl9tb2RlJTIyJTNBJTIwJTIyZGVmYXVsdCUyMiUyQyUwQSUyMCUyMCUyMmhvb2tfZXZlbnRfbmFtZSUyMiUzQSUyMCUyMlByZVRvb2xVc2UlMjIlMEElN0Q=",highlighted:`<span class="hljs-punctuation">{</span>
<span class="hljs-attr">&quot;session_id&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;...&quot;</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">&quot;transcript_path&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;/path/to/transcript.jsonl&quot;</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">&quot;cwd&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;/path/to/project&quot;</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">&quot;permission_mode&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;default&quot;</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">&quot;hook_event_name&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;PreToolUse&quot;</span>
<span class="hljs-punctuation">}</span>`,wrap:!1}}),{c(){n=w("p"),n.innerHTML=m,J=d(),v(i.$$.fragment),U=d(),p=w("p"),p.innerHTML=e},l(o){n=C(o,"P",{"data-svelte-h":!0}),h(n)!=="svelte-5s69be"&&(n.innerHTML=m),J=u(o),I(i.$$.fragment,o),U=u(o),p=C(o,"P",{"data-svelte-h":!0}),h(p)!=="svelte-rjvz1d"&&(p.innerHTML=e)},m(o,T){l(o,n,T),l(o,J,T),b(i,o,T),l(o,U,T),l(o,p,T),c=!0},p:F,i(o){c||(x(i.$$.fragment,o),c=!0)},o(o){q(i.$$.fragment,o),c=!1},d(o){o&&(s(n),s(J),s(U),s(p)),V(i,o)}}}function Pe(A){let n,m="Command hooks receive JSON on stdin. Common fields:",J,i,U,p,e="Turn-scoped events add <code>turn_id</code>. Tool events add <code>tool_name</code>, <code>tool_use_id</code>, and <code>tool_input.command</code>. <code>PostToolUse</code> also includes <code>tool_response</code>. <code>UserPromptSubmit</code> adds <code>prompt</code>. <code>Stop</code> adds <code>stop_hook_active</code> and <code>last_assistant_message</code>.",c;return i=new G({props:{code:"JTdCJTBBJTIwJTIwJTIyc2Vzc2lvbl9pZCUyMiUzQSUyMCUyMi4uLiUyMiUyQyUwQSUyMCUyMCUyMnRyYW5zY3JpcHRfcGF0aCUyMiUzQSUyMCUyMiUyRnBhdGglMkZ0byUyRnRyYW5zY3JpcHQuanNvbmwlMjIlMkMlMEElMjAlMjAlMjJjd2QlMjIlM0ElMjAlMjIlMkZwYXRoJTJGdG8lMkZwcm9qZWN0JTIyJTJDJTBBJTIwJTIwJTIyaG9va19ldmVudF9uYW1lJTIyJTNBJTIwJTIyUHJlVG9vbFVzZSUyMiUyQyUwQSUyMCUyMCUyMm1vZGVsJTIyJTNBJTIwJTIyZ3B0LTUtY29kZXglMjIlMEElN0Q=",highlighted:`<span class="hljs-punctuation">{</span>
<span class="hljs-attr">&quot;session_id&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;...&quot;</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">&quot;transcript_path&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;/path/to/transcript.jsonl&quot;</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">&quot;cwd&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;/path/to/project&quot;</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">&quot;hook_event_name&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;PreToolUse&quot;</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">&quot;model&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;gpt-5-codex&quot;</span>
<span class="hljs-punctuation">}</span>`,wrap:!1}}),{c(){n=w("p"),n.textContent=m,J=d(),v(i.$$.fragment),U=d(),p=w("p"),p.innerHTML=e},l(o){n=C(o,"P",{"data-svelte-h":!0}),h(n)!=="svelte-1agiyrj"&&(n.textContent=m),J=u(o),I(i.$$.fragment,o),U=u(o),p=C(o,"P",{"data-svelte-h":!0}),h(p)!=="svelte-oj8soq"&&(p.innerHTML=e)},m(o,T){l(o,n,T),l(o,J,T),b(i,o,T),l(o,U,T),l(o,p,T),c=!0},p:F,i(o){c||(x(i.$$.fragment,o),c=!0)},o(o){q(i.$$.fragment,o),c=!1},d(o){o&&(s(n),s(J),s(U),s(p)),V(i,o)}}}function Ee(A){let n,m="OpenCode hooks are JS/TS functions, not stdin scripts. Each event type has a typed <code>(input, output)</code> signature:",J,i,U,p,e="<code>&quot;tool.execute.after&quot;</code> adds the result on <code>output</code>. <code>&quot;shell.env&quot;</code> gives you <code>output.env</code> to mutate. The generic <code>event</code> callback receives <code>{ event }</code> where <code>event.type</code> identifies the event.",c,o,T="The plugin also receives a context object at construction time: <code>{ project, directory, worktree, client, $ }</code>. Use <code>client.app.log({...})</code> for structured logging and <code>$</code> (Bun shell) to run commands.",$;return i=new G({props:{code:"JTIydG9vbC5leGVjdXRlLmJlZm9yZSUyMiUzQSUyMGFzeW5jJTIwKGlucHV0JTJDJTIwb3V0cHV0KSUyMCUzRCUzRSUyMCU3QiUwQSUyMCUyMCUyRiUyRiUyMGlucHV0LnRvb2wlMjAlMjAlMjAlMjAlMjAlMjAlMjAlRTIlODAlOTQlMjB0b29sJTIwbmFtZSUyMChlLmcuJTIwJTIycmVhZCUyMiUyQyUyMCUyMmJhc2glMjIpJTBBJTIwJTIwJTJGJTJGJTIwaW5wdXQuc2Vzc2lvbklEJTIwJTIwJUUyJTgwJTk0JTIwc2Vzc2lvbiUyMGlkZW50aWZpZXIlMEElMjAlMjAlMkYlMkYlMjBvdXRwdXQuYXJncyUyMCUyMCUyMCUyMCUyMCUyMCVFMiU4MCU5NCUyMHRvb2wlMjBhcmd1bWVudHMlMjAobXV0YWJsZSklMEElN0Q=",highlighted:`<span class="hljs-string">&quot;tool.execute.before&quot;</span>: <span class="hljs-keyword">async</span> (input, output) =&gt; {
<span class="hljs-comment">// input.tool — tool name (e.g. &quot;read&quot;, &quot;bash&quot;)</span>
<span class="hljs-comment">// input.sessionID — session identifier</span>
<span class="hljs-comment">// output.args — tool arguments (mutable)</span>
}`,wrap:!1}}),{c(){n=w("p"),n.innerHTML=m,J=d(),v(i.$$.fragment),U=d(),p=w("p"),p.innerHTML=e,c=d(),o=w("p"),o.innerHTML=T},l(r){n=C(r,"P",{"data-svelte-h":!0}),h(n)!=="svelte-1cdbirz"&&(n.innerHTML=m),J=u(r),I(i.$$.fragment,r),U=u(r),p=C(r,"P",{"data-svelte-h":!0}),h(p)!=="svelte-9uki2o"&&(p.innerHTML=e),c=u(r),o=C(r,"P",{"data-svelte-h":!0}),h(o)!=="svelte-11ordy6"&&(o.innerHTML=T)},m(r,j){l(r,n,j),l(r,J,j),b(i,r,j),l(r,U,j),l(r,p,j),l(r,c,j),l(r,o,j),$=!0},p:F,i(r){$||(x(i.$$.fragment,r),$=!0)},o(r){q(i.$$.fragment,r),$=!1},d(r){r&&(s(n),s(J),s(U),s(p),s(c),s(o)),V(i,r)}}}function Ge(A){let n,m,J,i,U,p;return n=new B({props:{id:"tool",option:"Claude Code",$$slots:{default:[Fe]},$$scope:{ctx:A}}}),J=new B({props:{id:"tool",option:"Codex",$$slots:{default:[Pe]},$$scope:{ctx:A}}}),U=new B({props:{id:"tool",option:"OpenCode",$$slots:{default:[Ee]},$$scope:{ctx:A}}}),{c(){v(n.$$.fragment),m=d(),v(J.$$.fragment),i=d(),v(U.$$.fragment)},l(e){I(n.$$.fragment,e),m=u(e),I(J.$$.fragment,e),i=u(e),I(U.$$.fragment,e)},m(e,c){b(n,e,c),l(e,m,c),b(J,e,c),l(e,i,c),b(U,e,c),p=!0},p(e,c){const o={};c&2&&(o.$$scope={dirty:c,ctx:e}),n.$set(o);const T={};c&2&&(T.$$scope={dirty:c,ctx:e}),J.$set(T);const $={};c&2&&($.$$scope={dirty:c,ctx:e}),U.$set($)},i(e){p||(x(n.$$.fragment,e),x(J.$$.fragment,e),x(U.$$.fragment,e),p=!0)},o(e){q(n.$$.fragment,e),q(J.$$.fragment,e),q(U.$$.fragment,e),p=!1},d(e){e&&(s(m),s(i)),V(n,e),V(J,e),V(U,e)}}}function Re(A){let n,m="<strong>Exit codes (command hooks):</strong>",J,i,U="<li>Exit <code>0</code> — allow, no change.</li> <li>Exit <code>2</code> with a message on stderr — block or continue per event semantics (e.g. block the tool call on <code>PreToolUse</code>, erase the prompt on <code>UserPromptSubmit</code>).</li>",p,e,c="<strong>JSON on stdout</strong> for finer control:",o,T,$,r,j="Also supported: top-level <code>continue</code>, <code>stopReason</code>, <code>suppressOutput</code>, <code>systemMessage</code>, and the legacy <code>{ &quot;decision&quot;: &quot;block&quot;, &quot;reason&quot;: &quot;...&quot; }</code> form.",_,y,k="<strong>HTTP hooks</strong> return the same JSON as a 2xx response body. Non-2xx responses or timeouts are treated as non-blocking errors.",N;return T=new G({props:{code:"JTdCJTBBJTIwJTIwJTIyaG9va1NwZWNpZmljT3V0cHV0JTIyJTNBJTIwJTdCJTBBJTIwJTIwJTIwJTIwJTIyaG9va0V2ZW50TmFtZSUyMiUzQSUyMCUyMlByZVRvb2xVc2UlMjIlMkMlMEElMjAlMjAlMjAlMjAlMjJwZXJtaXNzaW9uRGVjaXNpb24lMjIlM0ElMjAlMjJkZW55JTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIycGVybWlzc2lvbkRlY2lzaW9uUmVhc29uJTIyJTNBJTIwJTIyTm8lMjBuZXR3b3JrJTIwYWNjZXNzJTIwaW4lMjB0aGlzJTIwcHJvamVjdCUyMiUwQSUyMCUyMCU3RCUwQSU3RA==",highlighted:`<span class="hljs-punctuation">{</span>
<span class="hljs-attr">&quot;hookSpecificOutput&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
<span class="hljs-attr">&quot;hookEventName&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;PreToolUse&quot;</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">&quot;permissionDecision&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;deny&quot;</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">&quot;permissionDecisionReason&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;No network access in this project&quot;</span>
<span class="hljs-punctuation">}</span>
<span class="hljs-punctuation">}</span>`,wrap:!1}}),{c(){n=w("p"),n.innerHTML=m,J=d(),i=w("ul"),i.innerHTML=U,p=d(),e=w("p"),e.innerHTML=c,o=d(),v(T.$$.fragment),$=d(),r=w("p"),r.innerHTML=j,_=d(),y=w("p"),y.innerHTML=k},l(a){n=C(a,"P",{"data-svelte-h":!0}),h(n)!=="svelte-1fzmtmh"&&(n.innerHTML=m),J=u(a),i=C(a,"UL",{"data-svelte-h":!0}),h(i)!=="svelte-f9asw9"&&(i.innerHTML=U),p=u(a),e=C(a,"P",{"data-svelte-h":!0}),h(e)!=="svelte-9m8d3l"&&(e.innerHTML=c),o=u(a),I(T.$$.fragment,a),$=u(a),r=C(a,"P",{"data-svelte-h":!0}),h(r)!=="svelte-1qiqgin"&&(r.innerHTML=j),_=u(a),y=C(a,"P",{"data-svelte-h":!0}),h(y)!=="svelte-1xms62"&&(y.innerHTML=k)},m(a,f){l(a,n,f),l(a,J,f),l(a,i,f),l(a,p,f),l(a,e,f),l(a,o,f),b(T,a,f),l(a,$,f),l(a,r,f),l(a,_,f),l(a,y,f),N=!0},p:F,i(a){N||(x(T.$$.fragment,a),N=!0)},o(a){q(T.$$.fragment,a),N=!1},d(a){a&&(s(n),s(J),s(i),s(p),s(e),s(o),s($),s(r),s(_),s(y)),V(T,a)}}}function Ze(A){let n,m="<strong>Exit codes:</strong>",J,i,U="<li><code>0</code> — success.</li> <li><code>2</code> with stderr message — block or continue per event.</li>",p,e,c="<strong>JSON on stdout</strong> mirrors Claude Code’s shape:",o,T,$,r,j="For <code>SessionStart</code>, <code>UserPromptSubmit</code>, and <code>PostToolUse</code>, <code>hookSpecificOutput</code> can include <code>additionalContext</code> to inject text into the conversation.",_;return T=new G({props:{code:"JTdCJTBBJTIwJTIwJTIyY29udGludWUlMjIlM0ElMjB0cnVlJTJDJTBBJTIwJTIwJTIyc3lzdGVtTWVzc2FnZSUyMiUzQSUyMCUyMkluamVjdGVkJTIwY29udGV4dCUyMGZvciUyMHRoZSUyMG1vZGVsJTIyJTJDJTBBJTIwJTIwJTIyaG9va1NwZWNpZmljT3V0cHV0JTIyJTNBJTIwJTdCJTBBJTIwJTIwJTIwJTIwJTIyaG9va0V2ZW50TmFtZSUyMiUzQSUyMCUyMlByZVRvb2xVc2UlMjIlMkMlMEElMjAlMjAlMjAlMjAlMjJwZXJtaXNzaW9uRGVjaXNpb24lMjIlM0ElMjAlMjJkZW55JTIyJTBBJTIwJTIwJTdEJTBBJTdE",highlighted:`<span class="hljs-punctuation">{</span>
<span class="hljs-attr">&quot;continue&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-literal"><span class="hljs-keyword">true</span></span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">&quot;systemMessage&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;Injected context for the model&quot;</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">&quot;hookSpecificOutput&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
<span class="hljs-attr">&quot;hookEventName&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;PreToolUse&quot;</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">&quot;permissionDecision&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;deny&quot;</span>
<span class="hljs-punctuation">}</span>
<span class="hljs-punctuation">}</span>`,wrap:!1}}),{c(){n=w("p"),n.innerHTML=m,J=d(),i=w("ul"),i.innerHTML=U,p=d(),e=w("p"),e.innerHTML=c,o=d(),v(T.$$.fragment),$=d(),r=w("p"),r.innerHTML=j},l(y){n=C(y,"P",{"data-svelte-h":!0}),h(n)!=="svelte-cq9aax"&&(n.innerHTML=m),J=u(y),i=C(y,"UL",{"data-svelte-h":!0}),h(i)!=="svelte-154qgls"&&(i.innerHTML=U),p=u(y),e=C(y,"P",{"data-svelte-h":!0}),h(e)!=="svelte-1sb1ac3"&&(e.innerHTML=c),o=u(y),I(T.$$.fragment,y),$=u(y),r=C(y,"P",{"data-svelte-h":!0}),h(r)!=="svelte-1jiy78k"&&(r.innerHTML=j)},m(y,k){l(y,n,k),l(y,J,k),l(y,i,k),l(y,p,k),l(y,e,k),l(y,o,k),b(T,y,k),l(y,$,k),l(y,r,k),_=!0},p:F,i(y){_||(x(T.$$.fragment,y),_=!0)},o(y){q(T.$$.fragment,y),_=!1},d(y){y&&(s(n),s(J),s(i),s(p),s(e),s(o),s($),s(r)),V(T,y)}}}function Qe(A){let n,m="OpenCode hooks influence the agent by mutating the <code>output</code> object or by throwing. To rewrite a tool call, mutate <code>output.args</code>. To block it, throw an error:",J,i,U,p,e="There are no exit codes or JSON-over-stdin. All influence happens through code.",c;return i=new G({props:{code:"JTIydG9vbC5leGVjdXRlLmJlZm9yZSUyMiUzQSUyMGFzeW5jJTIwKGlucHV0JTJDJTIwb3V0cHV0KSUyMCUzRCUzRSUyMCU3QiUwQSUyMCUyMGlmJTIwKGlucHV0LnRvb2wlMjAlM0QlM0QlM0QlMjAlMjJiYXNoJTIyJTIwJTI2JTI2JTIwJTJGcm0lMjAtcmYlMkYudGVzdChvdXRwdXQuYXJncy5jb21tYW5kJTIwJTNGJTNGJTIwJTIyJTIyKSklMjAlN0IlMEElMjAlMjAlMjAlMjB0aHJvdyUyMG5ldyUyMEVycm9yKCUyMmRhbmdlcm91cyUyMGNvbW1hbmQlMjBibG9ja2VkJTIwYnklMjBwb2xpY3klMjIpJTBBJTIwJTIwJTdEJTBBJTdE",highlighted:`<span class="hljs-string">&quot;tool.execute.before&quot;</span>: <span class="hljs-keyword">async</span> (input, output) =&gt; {
<span class="hljs-keyword">if</span> (input.<span class="hljs-property">tool</span> === <span class="hljs-string">&quot;bash&quot;</span> &amp;&amp; <span class="hljs-regexp">/rm -rf/</span>.<span class="hljs-title function_">test</span>(output.<span class="hljs-property">args</span>.<span class="hljs-property">command</span> ?? <span class="hljs-string">&quot;&quot;</span>)) {
<span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Error</span>(<span class="hljs-string">&quot;dangerous command blocked by policy&quot;</span>)
}
}`,wrap:!1}}),{c(){n=w("p"),n.innerHTML=m,J=d(),v(i.$$.fragment),U=d(),p=w("p"),p.textContent=e},l(o){n=C(o,"P",{"data-svelte-h":!0}),h(n)!=="svelte-16f4sz3"&&(n.innerHTML=m),J=u(o),I(i.$$.fragment,o),U=u(o),p=C(o,"P",{"data-svelte-h":!0}),h(p)!=="svelte-1qsx3vv"&&(p.textContent=e)},m(o,T){l(o,n,T),l(o,J,T),b(i,o,T),l(o,U,T),l(o,p,T),c=!0},p:F,i(o){c||(x(i.$$.fragment,o),c=!0)},o(o){q(i.$$.fragment,o),c=!1},d(o){o&&(s(n),s(J),s(U),s(p)),V(i,o)}}}function ze(A){let n,m,J,i,U,p;return n=new B({props:{id:"tool",option:"Claude Code",$$slots:{default:[Re]},$$scope:{ctx:A}}}),J=new B({props:{id:"tool",option:"Codex",$$slots:{default:[Ze]},$$scope:{ctx:A}}}),U=new B({props:{id:"tool",option:"OpenCode",$$slots:{default:[Qe]},$$scope:{ctx:A}}}),{c(){v(n.$$.fragment),m=d(),v(J.$$.fragment),i=d(),v(U.$$.fragment)},l(e){I(n.$$.fragment,e),m=u(e),I(J.$$.fragment,e),i=u(e),I(U.$$.fragment,e)},m(e,c){b(n,e,c),l(e,m,c),b(J,e,c),l(e,i,c),b(U,e,c),p=!0},p(e,c){const o={};c&2&&(o.$$scope={dirty:c,ctx:e}),n.$set(o);const T={};c&2&&(T.$$scope={dirty:c,ctx:e}),J.$set(T);const $={};c&2&&($.$$scope={dirty:c,ctx:e}),U.$set($)},i(e){p||(x(n.$$.fragment,e),x(J.$$.fragment,e),x(U.$$.fragment,e),p=!0)},o(e){q(n.$$.fragment,e),q(J.$$.fragment,e),q(U.$$.fragment,e),p=!1},d(e){e&&(s(m),s(i)),V(n,e),V(J,e),V(U,e)}}}function Oe(A){let n,m,J,i,U,p,e,c,o,T="Before wiring anything up, it helps to know which events actually fire and when. The vocabulary is slightly different on each platform, but the lifecycle they describe is shared.",$,r,j,_,y="At the abstract level, every agent session moves through the same phases:",k,N,a,f,se="Any hook system worth using exposes at least these five moments. The three platforms in this course all do — they just use different names and offer different amounts of extra granularity.",L,S,R,g,H,Z,oe,P,ne,Q,ae,z,fe="Hooks are not purely observational — they can change what happens next.",ie,E,ce,O,pe,W,we="A quick reference for common goals:",Je,Y,Ce="<li><strong>Log every tool call</strong> → <code>PreToolUse</code> / <code>tool.execute.before</code>.</li> <li><strong>Run a linter after an edit</strong> → <code>PostToolUse</code> (match <code>Edit|Write</code>) / <code>tool.execute.after</code>.</li> <li><strong>Block dangerous commands</strong> → <code>PreToolUse</code> with exit code <code>2</code> or a thrown error.</li> <li><strong>Inject repo context on each turn</strong> → <code>UserPromptSubmit</code> with <code>additionalContext</code> (Claude Code / Codex), or the <code>event</code> callback on <code>message.updated</code> (OpenCode).</li> <li><strong>Persist conversation state</strong> → <code>Stop</code> / <code>SessionEnd</code>, or <code>session.idle</code> on OpenCode.</li> <li><strong>Add environment variables to shells</strong> → <code>shell.env</code> (OpenCode), or wrap the shell in a command hook on the other platforms.</li>",Ue,X,Te,D,me="The three platforms expose the same underlying lifecycle with different vocabulary and different levels of granularity. Claude Code has the richest event set and supports four handler types. Codex has a smaller, tightly focused set behind a feature flag. OpenCode folds hooks into its plugin system as typed function keys rather than a JSON config. Once you pick an event for the goal at hand, the rest of the work is the same on all three.",re,K,he="Next, a quick quiz before we wire these events into a live Gradio dashboard.",de,ee,ue,le,Me;return U=new Ae({props:{containerStyle:"float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"}}),e=new te({props:{title:"Hook Events and the Agent Lifecycle",local:"hook-events-and-the-agent-lifecycle",headingTag:"h1"}}),r=new te({props:{title:"The Shared Lifecycle",local:"the-shared-lifecycle",headingTag:"h2"}}),N=new G({props:{code:"JUUyJTk0JThDJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTkwJTBBJUUyJTk0JTgyJTIwU2Vzc2lvbiUyMHN0YXJ0cyUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCVFMiU5NCU4MiUyMCVFMiU4NiU5MCUyMFNlc3Npb25TdGFydCUwQSVFMiU5NCU5QyVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCVBNCUwQSVFMiU5NCU4MiUyMFJlcGVhdCUyMGZvciUyMGVhY2glMjB0dXJuJTNBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJUUyJTk0JTgyJTBBJUUyJTk0JTgyJTIwJTIwJTIwVXNlciUyMHN1Ym1pdHMlMjBhJTIwcHJvbXB0JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJUUyJTk0JTgyJTIwJUUyJTg2JTkwJTIwVXNlclByb21wdFN1Ym1pdCUwQSVFMiU5NCU4MiUyMCUyMCUyME1vZGVsJTIwcmVhc29ucyUyMGFuZCUyMG1heSUyMGNhbGwlMjB0b29scyUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCVFMiU5NCU4MiUwQSVFMiU5NCU4MiUyMCUyMCUyMCUyMCUyMEJlZm9yZSUyMGVhY2glMjB0b29sJTIwY2FsbCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCVFMiU5NCU4MiUyMCVFMiU4NiU5MCUyMFByZVRvb2xVc2UlMEElRTIlOTQlODIlMjAlMjAlMjAlMjAlMjBBZnRlciUyMGVhY2glMjB0b29sJTIwY2FsbCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCVFMiU5NCU4MiUyMCVFMiU4NiU5MCUyMFBvc3RUb29sVXNlJTBBJUUyJTk0JTgyJTIwJTIwJTIwVHVybiUyMGVuZHMlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlRTIlOTQlODIlMjAlRTIlODYlOTAlMjBTdG9wJTBBJUUyJTk0JTlDJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JUE0JTBBJUUyJTk0JTgyJTIwU2Vzc2lvbiUyMGVuZHMlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlRTIlOTQlODIlMjAlRTIlODYlOTAlMjBTZXNzaW9uRW5kJTBBJUUyJTk0JTk0JUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTk4",highlighted:`┌─────────────────────────────────────────────┐
│ <span class="hljs-keyword">Session</span> starts │ ← SessionStart
├─────────────────────────────────────────────┤
│ Repeat <span class="hljs-keyword">for</span> <span class="hljs-keyword">each</span> turn: │
│ <span class="hljs-keyword">User</span> submits a prompt │ ← UserPromptSubmit
│ Model reasons <span class="hljs-keyword">and</span> may <span class="hljs-keyword">call</span> tools │
│ <span class="hljs-keyword">Before</span> <span class="hljs-keyword">each</span> tool <span class="hljs-keyword">call</span> │ ← PreToolUse
│ <span class="hljs-keyword">After</span> <span class="hljs-keyword">each</span> tool <span class="hljs-keyword">call</span> │ ← PostToolUse
│ Turn ends │ ← Stop
├─────────────────────────────────────────────┤
│ <span class="hljs-keyword">Session</span> ends │ ← SessionEnd
└─────────────────────────────────────────────┘`,wrap:!1}}),S=new te({props:{title:"Events by Platform",local:"events-by-platform",headingTag:"h2"}}),g=new ye({props:{id:"tool",options:["Claude Code","Codex","OpenCode"],$$slots:{default:[Be]},$$scope:{ctx:A}}}),Z=new te({props:{title:"Event Input: What Your Hook Receives",local:"event-input-what-your-hook-receives",headingTag:"h2"}}),P=new ye({props:{id:"tool",options:["Claude Code","Codex","OpenCode"],$$slots:{default:[Ge]},$$scope:{ctx:A}}}),Q=new te({props:{title:"How Hooks Influence the Agent",local:"how-hooks-influence-the-agent",headingTag:"h2"}}),E=new ye({props:{id:"tool",options:["Claude Code","Codex","OpenCode"],$$slots:{default:[ze]},$$scope:{ctx:A}}}),O=new te({props:{title:"Choosing the Right Event",local:"choosing-the-right-event",headingTag:"h2"}}),X=new te({props:{title:"Key Takeaways",local:"key-takeaways",headingTag:"h2"}}),ee=new Ne({props:{source:"https://github.com/huggingface/context-course/blob/main/units/en/unit5/hook-events.mdx"}}),{c(){n=w("meta"),m=d(),J=w("p"),i=d(),v(U.$$.fragment),p=d(),v(e.$$.fragment),c=d(),o=w("p"),o.textContent=T,$=d(),v(r.$$.fragment),j=d(),_=w("p"),_.textContent=y,k=d(),v(N.$$.fragment),a=d(),f=w("p"),f.textContent=se,L=d(),v(S.$$.fragment),R=d(),v(g.$$.fragment),H=d(),v(Z.$$.fragment),oe=d(),v(P.$$.fragment),ne=d(),v(Q.$$.fragment),ae=d(),z=w("p"),z.textContent=fe,ie=d(),v(E.$$.fragment),ce=d(),v(O.$$.fragment),pe=d(),W=w("p"),W.textContent=we,Je=d(),Y=w("ul"),Y.innerHTML=Ce,Ue=d(),v(X.$$.fragment),Te=d(),D=w("p"),D.textContent=me,re=d(),K=w("p"),K.textContent=he,de=d(),v(ee.$$.fragment),ue=d(),le=w("p"),this.h()},l(t){const M=Ve("svelte-u9bgzb",document.head);n=C(M,"META",{name:!0,content:!0}),M.forEach(s),m=u(t),J=C(t,"P",{}),ke(J).forEach(s),i=u(t),I(U.$$.fragment,t),p=u(t),I(e.$$.fragment,t),c=u(t),o=C(t,"P",{"data-svelte-h":!0}),h(o)!=="svelte-ax3cag"&&(o.textContent=T),$=u(t),I(r.$$.fragment,t),j=u(t),_=C(t,"P",{"data-svelte-h":!0}),h(_)!=="svelte-htvhmo"&&(_.textContent=y),k=u(t),I(N.$$.fragment,t),a=u(t),f=C(t,"P",{"data-svelte-h":!0}),h(f)!=="svelte-d2r818"&&(f.textContent=se),L=u(t),I(S.$$.fragment,t),R=u(t),I(g.$$.fragment,t),H=u(t),I(Z.$$.fragment,t),oe=u(t),I(P.$$.fragment,t),ne=u(t),I(Q.$$.fragment,t),ae=u(t),z=C(t,"P",{"data-svelte-h":!0}),h(z)!=="svelte-1rxeadj"&&(z.textContent=fe),ie=u(t),I(E.$$.fragment,t),ce=u(t),I(O.$$.fragment,t),pe=u(t),W=C(t,"P",{"data-svelte-h":!0}),h(W)!=="svelte-bjxnxv"&&(W.textContent=we),Je=u(t),Y=C(t,"UL",{"data-svelte-h":!0}),h(Y)!=="svelte-1iwdvzl"&&(Y.innerHTML=Ce),Ue=u(t),I(X.$$.fragment,t),Te=u(t),D=C(t,"P",{"data-svelte-h":!0}),h(D)!=="svelte-nvfx9e"&&(D.textContent=me),re=u(t),K=C(t,"P",{"data-svelte-h":!0}),h(K)!=="svelte-qkrs6j"&&(K.textContent=he),de=u(t),I(ee.$$.fragment,t),ue=u(t),le=C(t,"P",{}),ke(le).forEach(s),this.h()},h(){ve(n,"name","hf:doc:metadata"),ve(n,"content",We)},m(t,M){_e(document.head,n),l(t,m,M),l(t,J,M),l(t,i,M),b(U,t,M),l(t,p,M),b(e,t,M),l(t,c,M),l(t,o,M),l(t,$,M),b(r,t,M),l(t,j,M),l(t,_,M),l(t,k,M),b(N,t,M),l(t,a,M),l(t,f,M),l(t,L,M),b(S,t,M),l(t,R,M),b(g,t,M),l(t,H,M),b(Z,t,M),l(t,oe,M),b(P,t,M),l(t,ne,M),b(Q,t,M),l(t,ae,M),l(t,z,M),l(t,ie,M),b(E,t,M),l(t,ce,M),b(O,t,M),l(t,pe,M),l(t,W,M),l(t,Je,M),l(t,Y,M),l(t,Ue,M),b(X,t,M),l(t,Te,M),l(t,D,M),l(t,re,M),l(t,K,M),l(t,de,M),b(ee,t,M),l(t,ue,M),l(t,le,M),Me=!0},p(t,[M]){const ge={};M&2&&(ge.$$scope={dirty:M,ctx:t}),g.$set(ge);const $e={};M&2&&($e.$$scope={dirty:M,ctx:t}),P.$set($e);const je={};M&2&&(je.$$scope={dirty:M,ctx:t}),E.$set(je)},i(t){Me||(x(U.$$.fragment,t),x(e.$$.fragment,t),x(r.$$.fragment,t),x(N.$$.fragment,t),x(S.$$.fragment,t),x(g.$$.fragment,t),x(Z.$$.fragment,t),x(P.$$.fragment,t),x(Q.$$.fragment,t),x(E.$$.fragment,t),x(O.$$.fragment,t),x(X.$$.fragment,t),x(ee.$$.fragment,t),Me=!0)},o(t){q(U.$$.fragment,t),q(e.$$.fragment,t),q(r.$$.fragment,t),q(N.$$.fragment,t),q(S.$$.fragment,t),q(g.$$.fragment,t),q(Z.$$.fragment,t),q(P.$$.fragment,t),q(Q.$$.fragment,t),q(E.$$.fragment,t),q(O.$$.fragment,t),q(X.$$.fragment,t),q(ee.$$.fragment,t),Me=!1},d(t){t&&(s(m),s(J),s(i),s(p),s(c),s(o),s($),s(j),s(_),s(k),s(a),s(f),s(L),s(R),s(H),s(oe),s(ne),s(ae),s(z),s(ie),s(ce),s(pe),s(W),s(Je),s(Y),s(Ue),s(Te),s(D),s(re),s(K),s(de),s(ue),s(le)),s(n),V(U,t),V(e,t),V(r,t),V(N,t),V(S,t),V(g,t),V(Z,t),V(P,t),V(Q,t),V(E,t),V(O,t),V(X,t),V(ee,t)}}}const We='{"title":"Hook Events and the Agent Lifecycle","local":"hook-events-and-the-agent-lifecycle","sections":[{"title":"The Shared Lifecycle","local":"the-shared-lifecycle","sections":[],"depth":2},{"title":"Events by Platform","local":"events-by-platform","sections":[],"depth":2},{"title":"Event Input: What Your Hook Receives","local":"event-input-what-your-hook-receives","sections":[],"depth":2},{"title":"How Hooks Influence the Agent","local":"how-hooks-influence-the-agent","sections":[],"depth":2},{"title":"Choosing the Right Event","local":"choosing-the-right-event","sections":[],"depth":2},{"title":"Key Takeaways","local":"key-takeaways","sections":[],"depth":2}],"depth":1}';function Ye(A){return be(()=>{new URLSearchParams(window.location.search).get("fw")}),[]}class st extends xe{constructor(n){super(),qe(this,n,Ye,Oe,Ie,{})}}export{st as component};

Xet Storage Details

Size:
38.6 kB
·
Xet hash:
987dc7bada101f8d462c3d13ec9093a862a21591315c67c0c603c8f8d23f5af8

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.