agent-sdk/hooks.md +11 −11
24 </Step>24 </Step>
25 25
26 <Step title="SDK mengumpulkan hooks terdaftar">26 <Step title="SDK mengumpulkan hooks terdaftar">
2727 SDK memeriksa hooks yang terdaftar untuk tipe event tersebut. Ini termasuk callback hooks yang Anda berikan di `options.hooks` dan shell command hooks dari file pengaturan ketika [`settingSources`](/id/agent-sdk/typescript#setting-source) atau [`setting_sources`](/id/agent-sdk/python#setting-source) entry yang sesuai diaktifkan, yang mana untuk opsi `query()` default. SDK memeriksa hooks yang terdaftar untuk tipe event tersebut. Ini termasuk callback hooks yang Anda berikan di `options.hooks` dan shell command hooks dari file pengaturan ketika [`settingSources`](/id/agent-sdk/typescript#settingsource) atau [`setting_sources`](/id/agent-sdk/python#settingsource) entry yang sesuai diaktifkan, yang mana untuk opsi `query()` default.
28 </Step>28 </Step>
29 29
30 <Step title="Matchers memfilter hooks mana yang berjalan">30 <Step title="Matchers memfilter hooks mana yang berjalan">
225 225
226Setiap hook callback menerima tiga argumen:226Setiap hook callback menerima tiga argumen:
227 227
228228* **Input data:** object yang diketik berisi detail event. Setiap tipe hook memiliki bentuk input sendiri (misalnya, `PreToolUseHookInput` mencakup `tool_name` dan `tool_input`, sementara `NotificationHookInput` mencakup `message`). Lihat definisi tipe lengkap di referensi SDK [TypeScript](/id/agent-sdk/typescript#hook-input) dan [Python](/id/agent-sdk/python#hook-input).* **Input data:** object yang diketik berisi detail event. Setiap tipe hook memiliki bentuk input sendiri (misalnya, `PreToolUseHookInput` mencakup `tool_name` dan `tool_input`, sementara `NotificationHookInput` mencakup `message`). Lihat definisi tipe lengkap di referensi SDK [TypeScript](/id/agent-sdk/typescript#hookinput) dan [Python](/id/agent-sdk/python#hookinput).
229 * Semua hook inputs berbagi `session_id`, `cwd`, dan `hook_event_name`.229 * Semua hook inputs berbagi `session_id`, `cwd`, dan `hook_event_name`.
230 * `agent_id` dan `agent_type` diisi ketika hook terjadi di dalam subagent. Di TypeScript, ini berada di base hook input dan tersedia untuk semua tipe hook. Di Python, ini hanya ada di `PreToolUse`, `PostToolUse`, dan `PostToolUseFailure`.230 * `agent_id` dan `agent_type` diisi ketika hook terjadi di dalam subagent. Di TypeScript, ini berada di base hook input dan tersedia untuk semua tipe hook. Di Python, ini hanya ada di `PreToolUse`, `PostToolUse`, dan `PostToolUseFailure`.
231* **Tool use ID** (`str | None` / `string | undefined`): mengkorelasikan events `PreToolUse` dan `PostToolUse` untuk pemanggilan tool yang sama.231* **Tool use ID** (`str | None` / `string | undefined`): mengkorelasikan events `PreToolUse` dan `PostToolUse` untuk pemanggilan tool yang sama.
236Callback Anda mengembalikan object dengan dua kategori fields:236Callback Anda mengembalikan object dengan dua kategori fields:
237 237
238* **Top-level fields** mengontrol percakapan: `systemMessage` menyuntikkan pesan ke dalam percakapan yang terlihat oleh model, dan `continue` (`continue_` di Python) menentukan apakah agent terus berjalan setelah hook ini.238* **Top-level fields** mengontrol percakapan: `systemMessage` menyuntikkan pesan ke dalam percakapan yang terlihat oleh model, dan `continue` (`continue_` di Python) menentukan apakah agent terus berjalan setelah hook ini.
239239* **`hookSpecificOutput`** mengontrol operasi saat ini. Fields di dalamnya tergantung pada tipe hook event. Untuk hooks `PreToolUse`, di sinilah Anda menetapkan `permissionDecision` (`"allow"`, `"deny"`, atau `"ask"`), `permissionDecisionReason`, dan `updatedInput`. Di TypeScript SDK, `permissionDecision` juga menerima `"defer"` untuk mengakhiri query dan [resume nanti](/id/hooks#defer-a-tool-call-for-later); nilai ini tidak tersedia di Python SDK. Untuk hooks `PostToolUse`, Anda dapat menetapkan `additionalContext` untuk menambahkan informasi ke hasil tool, atau `updatedToolOutput` untuk mengganti output tool sepenuhnya sebelum Claude melihatnya.* **`hookSpecificOutput`** mengontrol operasi saat ini. Fields di dalamnya tergantung pada tipe hook event. Untuk hooks `PreToolUse`, di sinilah Anda menetapkan `permissionDecision` (`"allow"`, `"deny"`, `"ask"`, atau `"defer"`), `permissionDecisionReason`, dan `updatedInput`. Mengembalikan `"defer"` mengakhiri query sehingga Anda dapat [melanjutkannya nanti](/id/hooks#defer-a-tool-call-for-later). Untuk hooks `PostToolUse`, Anda dapat menetapkan `additionalContext` untuk menambahkan informasi ke hasil tool, atau `updatedToolOutput` untuk mengganti output tool sepenuhnya sebelum Claude melihatnya.
240 240
241241Kembalikan `{}` untuk mengizinkan operasi tanpa perubahan. SDK callback hooks menggunakan format output JSON yang sama dengan [Claude Code shell command hooks](/id/hooks#json-output), yang mendokumentasikan setiap field dan opsi spesifik event. Untuk definisi tipe SDK, lihat referensi SDK [TypeScript](/id/agent-sdk/typescript#sync-hook-json-output) dan [Python](/id/agent-sdk/python#sync-hook-json-output).Kembalikan `{}` untuk mengizinkan operasi tanpa perubahan. SDK callback hooks menggunakan format output JSON yang sama dengan [Claude Code shell command hooks](/id/hooks#json-output), yang mendokumentasikan setiap field dan opsi spesifik event. Untuk definisi tipe SDK, lihat referensi SDK [TypeScript](/id/agent-sdk/typescript#synchookjsonoutput) dan [Python](/id/agent-sdk/python#synchookjsonoutput).
242 242
243<Note>243<Note>
244 Ketika multiple hooks atau permission rules berlaku, **deny** mengambil prioritas atas **defer**, yang mengambil prioritas atas **ask**, yang mengambil prioritas atas **allow**. Jika hook apa pun mengembalikan `deny`, operasi diblokir terlepas dari hooks lainnya.244 Ketika multiple hooks atau permission rules berlaku, **deny** mengambil prioritas atas **defer**, yang mengambil prioritas atas **ask**, yang mengambil prioritas atas **allow**. Jika hook apa pun mengembalikan `deny`, operasi diblokir terlepas dari hooks lainnya.
326</CodeGroup>326</CodeGroup>
327 327
328<Note>328<Note>
329329 Ketika menggunakan `updatedInput`, Anda juga harus menyertakan `permissionDecision: 'allow'`. Selalu kembalikan object baru daripada mutating `tool_input` asli. Ketika menggunakan `updatedInput`, Anda juga harus menyertakan `permissionDecision: 'allow'` untuk auto-approve input yang dimodifikasi atau `permissionDecision: 'ask'` untuk menampilkannya kepada pengguna. Dengan `'defer'`, `updatedInput` diabaikan. Selalu kembalikan object baru daripada mutating `tool_input` asli.
330</Note>330</Note>
331 331
332### Tambahkan konteks dan blokir tool332### Tambahkan konteks dan blokir tool
489 489
490### Lacak aktivitas subagent490### Lacak aktivitas subagent
491 491
492492Gunakan hooks `SubagentStop` untuk memantau ketika subagents menyelesaikan pekerjaan mereka. Lihat tipe input lengkap di referensi SDK [TypeScript](/id/agent-sdk/typescript#hook-input) dan [Python](/id/agent-sdk/python#hook-input). Contoh ini mencatat ringkasan setiap kali subagent selesai:Gunakan hooks `SubagentStop` untuk memantau ketika subagents menyelesaikan pekerjaan mereka. Lihat tipe input lengkap di referensi SDK [TypeScript](/id/agent-sdk/typescript#hookinput) dan [Python](/id/agent-sdk/python#hookinput). Contoh ini mencatat ringkasan setiap kali subagent selesai:
493 493
494<CodeGroup>494<CodeGroup>
495 ```python Python theme={null}495 ```python Python theme={null}
621 621
622### Teruskan notifikasi ke Slack622### Teruskan notifikasi ke Slack
623 623
624624Gunakan hooks `Notification` untuk menerima notifikasi sistem dari agent dan meneruskannya ke layanan eksternal. Notifikasi terjadi untuk tipe event spesifik: `permission_prompt` (Claude memerlukan permission), `idle_prompt` (Claude menunggu input), `auth_success` (authentication selesai), dan `elicitation_dialog` (Claude meminta pengguna). Setiap notifikasi mencakup field `message` dengan deskripsi yang dapat dibaca manusia dan secara opsional `title`.Gunakan hooks `Notification` untuk menerima notifikasi sistem dari agent dan meneruskannya ke layanan eksternal. Notifikasi terjadi untuk tipe event spesifik: `permission_prompt` (Claude memerlukan permission), `idle_prompt` (Claude menunggu input), `auth_success` (authentication selesai), `elicitation_dialog` (Claude meminta pengguna), `elicitation_response` (pengguna menjawab elicitation), dan `elicitation_complete` (elicitation ditutup). Setiap notifikasi mencakup field `message` dengan deskripsi yang dapat dibaca manusia dan secara opsional `title`.
625 625
626Contoh ini meneruskan setiap notifikasi ke channel Slack. Ini memerlukan [Slack incoming webhook URL](https://api.slack.com/messaging/webhooks), yang Anda buat dengan menambahkan app ke workspace Slack Anda dan mengaktifkan incoming webhooks:626Contoh ini meneruskan setiap notifikasi ke channel Slack. Ini memerlukan [Slack incoming webhook URL](https://api.slack.com/messaging/webhooks), yang Anda buat dengan menambahkan app ke workspace Slack Anda dan mengaktifkan incoming webhooks:
627 627
719 ```719 ```
720</CodeGroup>720</CodeGroup>
721 721
722722## Fix common issues## Perbaiki masalah umum
723 723
724### Hook not firing724### Hook not firing
725 725
727* Periksa bahwa pola matcher Anda cocok dengan nama tool dengan tepat727* Periksa bahwa pola matcher Anda cocok dengan nama tool dengan tepat
728* Pastikan hook berada di bawah tipe event yang benar di `options.hooks`728* Pastikan hook berada di bawah tipe event yang benar di `options.hooks`
729* Untuk non-tool hooks seperti `Stop` dan `SubagentStop`, matchers cocok dengan fields berbeda (lihat [matcher patterns](/id/hooks#matcher-patterns))729* Untuk non-tool hooks seperti `Stop` dan `SubagentStop`, matchers cocok dengan fields berbeda (lihat [matcher patterns](/id/hooks#matcher-patterns))
730730* Hooks mungkin tidak terjadi ketika agent mencapai batas [`max_turns`](/id/agent-sdk/python#claude-agent-options) karena sesi berakhir sebelum hooks dapat dieksekusi* Hooks mungkin tidak terjadi ketika agent mencapai batas [`max_turns`](/id/agent-sdk/python#claudeagentoptions) karena sesi berakhir sebelum hooks dapat dieksekusi
731 731
732### Matcher not filtering as expected732### Matcher not filtering as expected
733 733
769 };769 };
770 ```770 ```
771 771
772772* Anda juga harus mengembalikan `permissionDecision: 'allow'` agar modifikasi input berlaku* Anda juga harus mengembalikan `permissionDecision: 'allow'` atau `'ask'` agar modifikasi input berlaku
773 773
774* Sertakan `hookEventName` di `hookSpecificOutput` untuk mengidentifikasi tipe hook mana output-nya774* Sertakan `hookEventName` di `hookSpecificOutput` untuk mengidentifikasi tipe hook mana output-nya
775 775
776### Session hooks not available in Python776### Session hooks not available in Python
777 777
778778`SessionStart` dan `SessionEnd` dapat didaftarkan sebagai SDK callback hooks di TypeScript, tetapi tidak tersedia di Python SDK (`HookEvent` menghilangkannya). Di Python, mereka hanya tersedia sebagai [shell command hooks](/id/hooks#hook-events) yang didefinisikan dalam file pengaturan (misalnya, `.claude/settings.json`). Untuk memuat shell command hooks dari aplikasi SDK Anda, sertakan setting source yang sesuai dengan [`setting_sources`](/id/agent-sdk/python#setting-source) atau [`settingSources`](/id/agent-sdk/typescript#setting-source):`SessionStart` dan `SessionEnd` dapat didaftarkan sebagai SDK callback hooks di TypeScript, tetapi tidak tersedia di Python SDK (`HookEvent` menghilangkannya). Di Python, mereka hanya tersedia sebagai [shell command hooks](/id/hooks#hook-events) yang didefinisikan dalam file pengaturan (misalnya, `.claude/settings.json`). Untuk memuat shell command hooks dari aplikasi SDK Anda, sertakan setting source yang sesuai dengan [`setting_sources`](/id/agent-sdk/python#settingsource) atau [`settingSources`](/id/agent-sdk/typescript#settingsource):
779 779
780<CodeGroup>780<CodeGroup>
781 ```python Python theme={null}781 ```python Python theme={null}