70 70
71> [tab] macOS/Linux71> [tab] macOS/Linux
72>72>
73> `matcher` mempersempit ke pemanggilan tool Bash dan kondisi `if` mempersempit lebih lanjut ke subperintah Bash yang cocok dengan `rm *`, jadi `block-rm.sh` hanya spawn ketika kedua filter cocok:73> `matcher` mempersempit ke panggilan tool Bash dan [perintah Monitor](#match-monitor-commands), dan kondisi `if` mempersempit lebih lanjut ke subperintah Bash yang cocok dengan `rm *`, jadi `block-rm.sh` hanya spawn ketika kedua filter cocok:
74>74>
75> ```json theme={null}75> ```json theme={null}
76> {76> {
116 116
117> [tab] Windows (PowerShell)117> [tab] Windows (PowerShell)
118>118>
119> Matcher `Bash|PowerShell` mencakup [tool PowerShell](#powershell) serta Bash. Satu aturan `if` hanya cocok dengan pemanggilan satu tool, jadi setiap tool mendapat handler-nya sendiri: yang pertama mempersempit ke subperintah Bash yang cocok dengan `rm *`, yang kedua ke perintah PowerShell yang cocok dengan `Remove-Item *`. Keduanya menjalankan skrip yang sama melalui `powershell.exe`:119> Matcher `Bash|PowerShell` mencakup [tool PowerShell](#powershell) serta Bash. Satu aturan `if` hanya menyebutkan satu tool, jadi setiap tool mendapat handler-nya sendiri: yang pertama mempersempit ke subperintah Bash yang cocok dengan `rm *`, yang kedua ke perintah PowerShell yang cocok dengan `Remove-Item *`. Keduanya menjalankan skrip yang sama melalui `powershell.exe`:
120>120>
121> ```json theme={null}121> ```json theme={null}
122> {122> {
225Hooks didefinisikan dalam file pengaturan JSON. Konfigurasi memiliki tiga tingkat nesting:225Hooks didefinisikan dalam file pengaturan JSON. Konfigurasi memiliki tiga tingkat nesting:
226 226
2271. Pilih [hook event](#hook-events) untuk merespons, seperti `PreToolUse` atau `Stop`2271. Pilih [hook event](#hook-events) untuk merespons, seperti `PreToolUse` atau `Stop`
2282. Tambahkan [matcher group](#matcher-patterns) untuk memfilter kapan dijalankan, seperti "hanya untuk tool Bash"2282. Tambahkan [grup matcher](#matcher-patterns) untuk memfilter kapan hook dijalankan, seperti "untuk tool Bash"
2293. Tentukan satu atau lebih [hook handlers](#hook-handler-fields) untuk dijalankan saat cocok2293. Tentukan satu atau lebih [hook handlers](#hook-handler-fields) untuk dijalankan saat cocok
230 230
231Lihat [Bagaimana hook diselesaikan](#how-a-hook-resolves) di atas untuk panduan lengkap dengan contoh beranotasi.231Lihat [Bagaimana hook diselesaikan](#how-a-hook-resolves) di atas untuk panduan lengkap dengan contoh beranotasi.
277| Nilai matcher | Dievaluasi sebagai | Contoh |277| Nilai matcher | Dievaluasi sebagai | Contoh |
278| :- | :- | :- |278| :- | :- | :- |
279| `"*"`, `""`, atau dihilangkan | Cocokkan semua | dijalankan pada setiap kemunculan event |279| `"*"`, `""`, atau dihilangkan | Cocokkan semua | dijalankan pada setiap kemunculan event |
280| Hanya huruf, digit, `_`, `-`, spasi, `,`, dan `\|` | String yang tepat, atau daftar string yang tepat dipisahkan `\|` atau `,` dengan whitespace opsional di sekitarnya | `Bash` cocok hanya dengan tool Bash; `Edit\|Write` dan `Edit, Write` masing-masing cocok dengan salah satu tool dengan tepat; `code-reviewer` cocok hanya dengan tipe agent itu |280| Hanya huruf, digit, `_`, `-`, spasi, `,`, dan `\|` | String yang tepat, atau daftar string yang tepat dipisahkan `\|` atau `,` dengan whitespace opsional di sekitarnya | `Bash` cocok dengan tool Bash, dan pada `PreToolUse` serta `PermissionRequest` juga dengan [perintah Monitor](#match-monitor-commands); `Edit\|Write` dan `Edit, Write` masing-masing cocok dengan salah satu tool dengan tepat; `code-reviewer` cocok hanya dengan tipe agent itu |
281| Berisi karakter lain apa pun | Ekspresi reguler JavaScript, tidak berlabuh | `^Notebook` cocok dengan tool apa pun yang namanya dimulai dengan `Notebook`; `mcp__memory__.*` cocok dengan setiap tool dari server `memory` |281| Berisi karakter lain apa pun | Ekspresi reguler JavaScript, tidak berlabuh | `^Notebook` cocok dengan tool apa pun yang namanya dimulai dengan `Notebook`; `mcp__memory__.*` cocok dengan setiap tool dari server `memory` |
282 282
283Matcher pada jalur ekspresi reguler diuji dengan `RegExp.prototype.test` JavaScript, yang berhasil pada kecocokan di mana pun dalam nilai. `Edit.*` cocok dengan `Edit` dan `NotebookEdit`; bungkus pola dalam `^` dan `$`, seperti `^Edit$`, ketika Anda memerlukan kecocokan seluruh string.283Matcher pada jalur ekspresi reguler diuji dengan `RegExp.prototype.test` JavaScript, yang berhasil pada kecocokan di mana pun dalam nilai. `Edit.*` cocok dengan `Edit` dan `NotebookEdit`; bungkus pola dalam `^` dan `$`, seperti `^Edit$`, ketika Anda memerlukan kecocokan seluruh string.
294| `SessionStart` | bagaimana sesi dimulai | `startup`, `resume`, `clear`, `compact`, `fork` |294| `SessionStart` | bagaimana sesi dimulai | `startup`, `resume`, `clear`, `compact`, `fork` |
295| `Setup` | flag CLI mana yang memicu setup | `init`, `maintenance` |295| `Setup` | flag CLI mana yang memicu setup | `init`, `maintenance` |
296| `SessionEnd` | mengapa sesi berakhir | `clear`, `resume`, `logout`, `prompt_input_exit`, `other` |296| `SessionEnd` | mengapa sesi berakhir | `clear`, `resume`, `logout`, `prompt_input_exit`, `other` |
297| `Notification` | tipe notifikasi | `permission_prompt`, `idle_prompt`, `auth_success`, `elicitation_dialog`, `elicitation_url_dialog`, `elicitation_complete`, `elicitation_response`, `agent_needs_input`, `agent_completed`, `quota_auto_resume_fired`, `quota_auto_resume_stale`, `quota_auto_resume_disabled`, `plugin_notification` |297| `Notification` | tipe notifikasi | `permission_prompt`, `idle_prompt`, `auth_success`, `auth_storage_failure`, `elicitation_dialog`, `elicitation_url_dialog`, `elicitation_complete`, `elicitation_response`, `agent_needs_input`, `agent_completed`, `quota_auto_resume_fired`, `quota_auto_resume_stale`, `quota_auto_resume_disabled`, `plugin_notification` |
298| `SubagentStart` | tipe agent | `general-purpose`, `Explore`, `Plan`, nama agent kustom, atau nama dengan cakupan plugin seperti `^my-plugin:reviewer$` |298| `SubagentStart` | tipe agent | `general-purpose`, `Explore`, `Plan`, nama agent kustom, atau nama dengan cakupan plugin seperti `^my-plugin:reviewer$` |
299| `PreCompact`, `PostCompact` | apa yang memicu compaction | `manual`, `auto` |299| `PreCompact`, `PostCompact` | apa yang memicu compaction | `manual`, `auto` |
300| `PreModelSwitch`, `PostModelSwitch` | nama kanonik model yang sesi beralih ke, seperti dijelaskan di bawah [PreModelSwitch](#premodelswitch) | `claude-opus-5`, `claude-opus-4-6\|claude-opus-5`, `.*opus.*` |300| `PreModelSwitch`, `PostModelSwitch` | nama kanonik model yang sesi beralih ke, seperti dijelaskan di bawah [PreModelSwitch](#premodelswitch) | `claude-opus-5`, `claude-opus-4-6\|claude-opus-5`, `.*opus.*` |
385}385}
386```386```
387 387
388#### Cocokkan perintah Monitor
389
390Hook [`PreToolUse`](#pretooluse) atau [`PermissionRequest`](#permissionrequest) dengan matcher `Bash` juga berjalan pada perintah shell yang Claude mulai dengan [tool Monitor](https://code.claude.com/docs/id/tools-reference.md#monitor-tool), tetapi `allow` dan [`updatedInput`](#pretooluse-decision-control)-nya tidak berpengaruh pada perintah tersebut. Memerlukan Claude Code v2.1.314 atau lebih baru. Matcher seperti `Bash|PowerShell`, `^Bash$`, dan `Bash.*` juga merupakan matcher `Bash`. Hook dengan matcher `Bash` tidak berjalan untuk [WebSocket watch](https://code.claude.com/docs/id/tools-reference.md#websocket-source), dan hook `PostToolUse` dengan matcher tersebut tidak berjalan untuk Monitor.
391
392Hook yang berjalan untuk perintah Monitor dapat menolaknya atau membuat Claude Code menanyakannya kepada Anda. Untuk mengizinkan atau menulis ulang perintah tersebut, beralihlah dari matcher `Bash` ke matcher yang menyertakan Monitor:
393
394* **Matcher yang menyertakan Monitor**: dengan matcher seperti `Bash|Monitor` atau `.*`, atau tanpa matcher, hook mendapatkan input milik panggilan Monitor itu sendiri, dan `allow` serta `updatedInput` berlaku. Dalam [`if`](#common-fields), sebutkan Monitor, seperti `Monitor(tail *)`, yang mencocokkan berdasarkan [aturan yang diikuti `Bash(tail *)`](#bash-if-matching). Jika `if`-nya menyebutkan Bash, hook tetap mendapatkan input panggilan Monitor, tetapi `allow` dan `updatedInput` tidak berpengaruh
395* **Matcher `Bash`**: hook mendapatkan panggilan Bash. Dalam `if`, sebutkan Bash, seperti `Bash(tail *)`. Hook tidak berjalan jika `if`-nya menyebutkan Monitor
396
388### Bidang hook handler397### Bidang hook handler
389 398
390Setiap objek dalam array `hooks` inner adalah hook handler: perintah shell, endpoint HTTP, tool MCP, prompt LLM, atau agent yang dijalankan saat matcher cocok. Ada lima tipe:399Setiap objek dalam array `hooks` inner adalah hook handler: perintah shell, endpoint HTTP, tool MCP, prompt LLM, atau agent yang dijalankan saat matcher cocok. Ada lima tipe:
811* **Dua baris atau lebih yang masing-masing dapat di-parse sebagai JSON secara terpisah, dengan baris pertama diawali `{` dan baris terakhir diakhiri `}`**: teks biasa ketika tidak ada baris yang merupakan objek output JSON yang mengatur suatu field. Ketika ada baris yang demikian, output tersebut adalah kegagalan parse, jadi cetak objek tersebut tanpa apa pun lainnya di stdout.820* **Dua baris atau lebih yang masing-masing dapat di-parse sebagai JSON secara terpisah, dengan baris pertama diawali `{` dan baris terakhir diakhiri `}`**: teks biasa ketika tidak ada baris yang merupakan objek output JSON yang mengatur suatu field. Ketika ada baris yang demikian, output tersebut adalah kegagalan parse, jadi cetak objek tersebut tanpa apa pun lainnya di stdout.
812* **Apa pun lainnya yang diawali dengan `{` dan diakhiri dengan `}` tetapi bukan JSON yang valid**: kegagalan parse.821* **Apa pun lainnya yang diawali dengan `{` dan diakhiri dengan `}` tetapi bukan JSON yang valid**: kegagalan parse.
813 822
814Untuk sebagian besar event, Claude Code menulis stdout ke log debug dan tidak menampilkannya di transkrip. Pengecualiannya adalah `UserPromptSubmit`, `UserPromptExpansion`, `SessionStart`, dan `PostModelSwitch`, di mana Claude Code menambahkan stdout teks biasa sebagai konteks yang dapat dilihat dan ditindaklanjuti oleh Claude. Pada event tersebut, Claude Code tidak menambahkan stdout yang gagal di-parse.823Untuk sebagian besar event, Claude Code menulis stdout ke log debug dan tidak menampilkannya di transkrip. Pada event berikut, stdout Anda sampai ke Claude atau ke ringkasan compaction:
824
825* **`UserPromptSubmit`, `UserPromptExpansion`, `SessionStart`, dan `PostModelSwitch`**: Claude Code menambahkan stdout teks biasa sebagai konteks yang dapat dilihat dan ditindaklanjuti oleh Claude. Claude Code tidak menambahkan stdout yang gagal di-parse.
826* **`PreCompact`**: stdout Anda menjadi [instruksi untuk ringkasan compaction](#precompact-output)
815 827
816Claude tidak pernah melihat stderr dari hook yang keluar dengan 0. Untuk membacanya sendiri pada event seperti `PreToolUse`, aktifkan [logging debug](#debug-hooks). Untuk menyampaikan peringatan kepada Claude dari hook `PostToolUse` atau `PostToolUseFailure`, gunakan exit 2 sehingga [Claude melihat stderr](#exit-code-2-behavior-per-event) meskipun tool sudah berjalan.828Claude tidak pernah melihat stderr dari hook yang keluar dengan 0. Untuk membacanya sendiri pada event seperti `PreToolUse`, aktifkan [logging debug](#debug-hooks). Untuk menyampaikan peringatan kepada Claude dari hook `PostToolUse` atau `PostToolUseFailure`, gunakan exit 2 sehingga [Claude melihat stderr](#exit-code-2-behavior-per-event) meskipun tool sudah berjalan.
817 829
1050String `additionalContext`, `systemMessage`, dan `initialUserMessage` dari hook, serta stdout biasanya, dibatasi hingga 10.000 karakter:1062String `additionalContext`, `systemMessage`, dan `initialUserMessage` dari hook, serta stdout biasanya, dibatasi hingga 10.000 karakter:
1051 1063
1052* **Cakupan**: Claude Code mengukur setiap string secara terpisah, bahkan ketika beberapa hook berjalan untuk event yang sama. Untuk output JSON, setiap field diukur secara terpisah; stdout biasa diukur secara keseluruhan.1064* **Cakupan**: Claude Code mengukur setiap string secara terpisah, bahkan ketika beberapa hook berjalan untuk event yang sama. Untuk output JSON, setiap field diukur secara terpisah; stdout biasa diukur secara keseluruhan.
1053* **Melebihi batas**: Claude Code menyimpan output ke file di direktori sesi dan menggantinya dengan path file serta pratinjau hingga 2.000 karakter pertama. Hasil Bash valid yang besar ditangani dengan cara yang sama, seperti dijelaskan di bagian [Batas output](https://code.claude.com/docs/id/tools-reference.md#output-limits). Tidak seperti batas atas Bash tersebut, batas ini tidak memiliki pengaturan atau environment variable untuk menaikkannya.1065* **Melebihi batas**: kecuali untuk [stdout PreCompact](#precompact-output), Claude Code menyimpan output ke file di direktori sesi. Claude Code mengganti output tersebut dengan path file serta pratinjau hingga 2.000 karakter pertama. Hasil Bash valid yang besar ditangani dengan cara yang sama, seperti dijelaskan di bagian [Batas output](https://code.claude.com/docs/id/tools-reference.md#output-limits). Tidak seperti batas atas Bash tersebut, batas ini tidak memiliki pengaturan atau environment variable untuk menaikkannya.
1054* **Membaca file**: Claude Code tidak meminta Claude untuk membaca file tersebut, jadi pastikan apa pun yang harus selalu dilihat Claude tetap berada dalam batas.1066* **Membaca file**: Claude Code tidak meminta Claude untuk membaca file tersebut, jadi pastikan apa pun yang harus selalu dilihat Claude tetap berada dalam batas.
1055 1067
1056Objek JSON mendukung tiga jenis field:1068Objek JSON mendukung tiga jenis field:
1954 1966
1955#### Kontrol keputusan PreToolUse1967#### Kontrol keputusan PreToolUse
1956 1968
1957Hook `PreToolUse` dapat mengontrol apakah panggilan tool dilanjutkan. Tidak seperti hook lain yang menggunakan kolom `decision` tingkat atas, PreToolUse mengembalikan keputusannya di dalam objek `hookSpecificOutput`. Ini memberinya kontrol yang lebih kaya: empat hasil (allow, deny, ask, atau defer) ditambah kemampuan untuk mengubah input tool sebelum eksekusi.1969Hook `PreToolUse` dapat mengontrol apakah panggilan tool berlanjut. Tidak seperti hook lain yang menggunakan field `decision` tingkat atas, PreToolUse mengembalikan keputusannya di dalam objek `hookSpecificOutput`. Ini memberinya kontrol yang lebih kaya: empat hasil (allow, deny, ask, atau defer) ditambah kemampuan untuk memodifikasi input tool sebelum eksekusi. Untuk mengizinkan atau menulis ulang perintah Monitor, lihat [Mencocokkan perintah Monitor](#match-monitor-commands).
1958 1970
1959| Kolom | Deskripsi |1971| Kolom | Deskripsi |
1960| :- | :- |1972| :- | :- |
2051 2063
2052#### Menangguhkan panggilan tool untuk nanti2064#### Menangguhkan panggilan tool untuk nanti
2053 2065
2054`"defer"` ditujukan untuk integrasi yang menjalankan `claude -p` sebagai subproses dan membaca output JSON-nya, seperti aplikasi Agent SDK atau UI kustom yang dibangun di atas Claude Code. Nilai ini memungkinkan proses pemanggil tersebut menjeda Claude pada panggilan tool, mengumpulkan input melalui antarmukanya sendiri, dan melanjutkan dari titik terakhir. Claude Code hanya mematuhi nilai ini dalam [mode non-interaktif](https://code.claude.com/docs/id/headless.md) dengan flag `-p`. Dalam sesi interaktif, Claude Code mencatat peringatan dan mengabaikan hasil hook.2066`"defer"` ditujukan untuk integrasi yang menjalankan `claude -p` sebagai subproses dan membaca output JSON-nya, seperti aplikasi Agent SDK atau UI kustom yang dibangun di atas Claude Code. Ini memungkinkan proses pemanggil tersebut menjeda Claude pada suatu panggilan tool, mengumpulkan input melalui antarmukanya sendiri, lalu melanjutkan dari titik terakhir.
2067
2068Claude Code hanya mematuhi `"defer"` dalam [mode non-interaktif](https://code.claude.com/docs/id/headless.md) dengan flag `-p`, dan hanya ketika Claude melakukan satu panggilan tool dalam giliran tersebut:
2069
2070* **Dalam sesi interaktif**: Claude Code mencatat peringatan ke log dan mengabaikan hasil hook
2071* **Beberapa panggilan tool sekaligus**: `"defer"` diabaikan dengan peringatan dan tool berjalan melalui alur izin normal
2055 2072
2056Tool `AskUserQuestion` adalah kasus yang umum: Claude ingin menanyakan sesuatu kepada pengguna, tetapi tidak ada terminal untuk menjawabnya. Eksekusi `-p` hanya menawarkan `AskUserQuestion` saat memiliki [host izin](https://code.claude.com/docs/id/headless.md#turn-off-permission-prompts-in-unattended-runs), seperti tool MCP yang Anda berikan dengan `--permission-prompt-tool`, jadi mulailah eksekusi dengan salah satunya. Alur bolak-baliknya berjalan seperti ini:2073Tool `AskUserQuestion` adalah kasus yang umum: Claude ingin menanyakan sesuatu kepada pengguna, tetapi tidak ada terminal untuk menjawabnya. Eksekusi `-p` hanya menawarkan `AskUserQuestion` saat memiliki [host izin](https://code.claude.com/docs/id/headless.md#turn-off-permission-prompts-in-unattended-runs), seperti tool MCP yang Anda berikan dengan `--permission-prompt-tool`, jadi mulailah eksekusi dengan salah satunya. Alur bolak-baliknya berjalan seperti ini:
2057 2074
20614. Proses pemanggil menjalankan `claude -p --resume <session-id>` dengan host izin yang sama. Panggilan tool yang sama memicu `PreToolUse` lagi.20784. Proses pemanggil menjalankan `claude -p --resume <session-id>` dengan host izin yang sama. Panggilan tool yang sama memicu `PreToolUse` lagi.
20625. Hook mengembalikan `permissionDecision: "allow"` dengan jawaban di `updatedInput`. Tool dieksekusi dan Claude melanjutkan.20795. Hook mengembalikan `permissionDecision: "allow"` dengan jawaban di `updatedInput`. Tool dieksekusi dan Claude melanjutkan.
2063 2080
2064Kolom `deferred_tool_use` membawa `id`, `name`, dan `input` dari tool. `input` adalah parameter yang dihasilkan Claude untuk panggilan tool, yang ditangkap sebelum eksekusi:2081Field `deferred_tool_use` membawa `id`, `name`, dan `input` dari tool:
2065 2082
2066```json theme={null}2083```json theme={null}
2067{2084{
2077}2094}
2078```2095```
2079 2096
2080Tidak ada timeout atau batas retry. Sesi tetap ada di disk hingga Anda melanjutkannya, dengan tunduk pada pembersihan retensi [`cleanupPeriodDays`](https://code.claude.com/docs/id/settings-reference#cleanupperioddays), yang menghapus file sesi setelah 30 hari secara default, mengikuti [aturan pembersihan retensi](https://code.claude.com/docs/id/claude-directory.md#cleaned-up-automatically).2097Tidak ada timeout atau batas retry. Sesi tetap tersimpan di disk sampai [pembersihan retensi](https://code.claude.com/docs/id/claude-directory.md#cleaned-up-automatically) [`cleanupPeriodDays`](https://code.claude.com/docs/id/settings-reference#cleanupperioddays) menghapusnya, setelah 30 hari secara default.
2081
2082Jika tool yang ditunda tidak lagi tersedia saat Anda melanjutkan, hasil pertama dari pelanjutan tersebut memiliki `stop_reason: "tool_deferred_unavailable"` dan `is_error: true`, dan hook tidak dipicu. Ini terjadi saat server MCP yang menyediakan tool tersebut tidak terhubung untuk sesi yang dilanjutkan. Payload `deferred_tool_use` tetap disertakan sehingga Anda dapat mengidentifikasi tool mana yang hilang.
2083
2084* **Jika Anda tidak mengirim prompt, baik bersama pelanjutan maupun setelahnya**, panggilan masih tertunda. Lanjutkan lagi dengan tool tersedia dan panggilan tersebut akan berjalan terlebih dahulu.
2085* **Jika Anda mengirim prompt, baik bersama pelanjutan maupun setelahnya**, Claude Code menjawabnya tanpa hasil tool dan membuang panggilan yang ditunda. Kirim prompt baru setelah tool tersedia jika Anda masih memerlukan tool tersebut dipanggil.
2086 2098
2087Jika jawaban yang Anda tunggu belum siap saat Anda melanjutkan tanpa prompt, hook dapat mengembalikan `"defer"` lagi. Jika Anda mengirim prompt dan hook menunda lagi, Claude Code memperlakukan prompt dengan cara yang sama: menjawab tanpa hasil tool dan membuang panggilan. Lanjutkan tanpa prompt hingga hook mengembalikan `"allow"` atau `"deny"`, yang merupakan cara proses pemanggil memutus perulangan.2099Jika jawaban belum siap saat Anda melanjutkan, hook dapat mengembalikan `"defer"` lagi. Jika Anda mengirim prompt bersama resume tersebut, Claude menjawabnya tanpa hasil tool dan tidak menjalankan panggilan itu. Lanjutkan tanpa prompt sampai hook mengembalikan `"allow"` atau `"deny"`.
2088
2089`"defer"` hanya berfungsi saat Claude melakukan satu panggilan tool dalam giliran tersebut. Jika Claude melakukan beberapa panggilan tool sekaligus, `"defer"` diabaikan dengan peringatan dan tool berlanjut melalui alur izin normal. Batasan ini ada karena resume hanya dapat menjalankan ulang satu tool: tidak ada cara untuk menangguhkan satu panggilan dari sekumpulan panggilan tanpa membiarkan yang lain tidak terselesaikan.
2090 2100
2091> [!NOTE]2101> [!NOTE]
2092>2102>
2093> Untuk melanjutkan sesi yang ditangguhkan dalam plan mode, berikan [`--permission-prompt-tool`](https://code.claude.com/docs/id/cli-reference#cli-flags) bersama `--resume` agar Claude Code dapat menampilkan rencana untuk disetujui. Untuk kondisi lainnya, lihat [Melanjutkan dalam plan mode dengan `-p`](https://code.claude.com/docs/id/sessions#resume-in-plan-mode-with-p). Memerlukan Claude Code v2.1.246 atau lebih baru.2103> Untuk melanjutkan sesi yang ditangguhkan dalam plan mode, berikan [`--permission-prompt-tool`](https://code.claude.com/docs/id/cli-reference#cli-flags) bersama `--resume` agar Claude Code dapat menampilkan rencana untuk disetujui. Untuk kondisi lainnya, lihat [Melanjutkan dalam plan mode dengan `-p`](https://code.claude.com/docs/id/sessions#resume-in-plan-mode-with-p). Memerlukan Claude Code v2.1.246 atau lebih baru.
2094>2104>
2095> Saat Anda melanjutkan dengan `-p`, Claude Code tidak memulihkan mode izin tersimpan lainnya. Claude Code memulai eksekusi dalam mode izin yang akan digunakan oleh eksekusi `claude -p` baru, jadi berikan `--permission-mode` atau `--dangerously-skip-permissions` lagi jika sesi yang ditangguhkan menggunakannya. Saat Anda melanjutkan dengan `claude --resume <session-id>` tanpa `-p`, Claude Code memulihkan mode izin yang tersimpan, dengan pengecualian yang tercantum di [mode izin saat resume](https://code.claude.com/docs/id/sessions.md#permission-mode-on-resume).2105> Saat Anda melanjutkan dengan `-p`, Claude Code tidak memulihkan mode izin tersimpan lainnya. Claude Code memulai run dalam mode izin yang akan digunakan oleh run `claude -p` baru, jadi berikan `--permission-mode` atau `--dangerously-skip-permissions` lagi jika sesi yang ditunda menggunakan salah satunya.
2106
2107##### Melanjutkan ketika tool yang ditunda tidak tersedia
2108
2109Hasil dengan `stop_reason: "tool_deferred_unavailable"` berarti tool dari panggilan yang ditunda tidak tersedia di sesi yang dilanjutkan, misalnya karena server MCP-nya tidak terhubung. Hook `PreToolUse` Anda tidak dijalankan, dan field `deferred_tool_use` pada hasil menyebutkan nama tool tersebut.
2110
2111Selama panggilan masih tertunda, prompt apa pun yang Anda kirim tidak sampai ke Claude dan run keluar dengan kode 1. Field `result` diawali dengan `<tool> isn't available, so its deferred call didn't run.` Jalankan panggilan tersebut, atau buang agar tidak dijalankan:
2112
2113* **Untuk menjalankan panggilan**: buat tool tersedia dan lanjutkan lagi.
2114* **Untuk membuang panggilan**: lanjutkan dengan prompt dan [`CLAUDE_CODE_DROP_UNAVAILABLE_DEFERRED_TOOL`](https://code.claude.com/docs/id/env-vars#variables) diatur ke `1`. Claude menerima error sebagai hasil panggilan dan menjawab prompt Anda. Saat Anda melanjutkan nanti, tidak ada panggilan yang tertunda.
2115
2116Saat Anda membuang panggilan, run menulis hasil `tool_deferred_unavailable` dengan field `result` kosong, lalu jawaban Claude dalam hasil kedua. Run keluar dengan kode 0 kecuali jawaban tersebut berupa error. Jika Anda mengatur variabel tersebut dan tidak mengirim prompt, run tetap membuang panggilan dan keluar dengan kode 1.
2117
2118Sebelum v2.1.319, Claude Code menjawab prompt tanpa hasil tool dan membuang panggilan tersebut. Pada versi-versi tersebut, kirim prompt baru setelah tool tersedia.
2096 2119
2097### PermissionRequest2120### PermissionRequest
2098 2121
2148| `message` | Hanya untuk `"deny"`: memberi tahu Claude mengapa izin ditolak |2171| `message` | Hanya untuk `"deny"`: memberi tahu Claude mengapa izin ditolak |
2149| `interrupt` | Hanya untuk `"deny"`: jika `true`, menghentikan Claude |2172| `interrupt` | Hanya untuk `"deny"`: jika `true`, menghentikan Claude |
2150 2173
2174Untuk mengizinkan atau menulis ulang perintah Monitor, lihat [Mencocokkan perintah Monitor](#match-monitor-commands).
2175
2151Hook yang keluar dengan kode 2 tanpa objek `decision` membiarkan alur izin tidak berubah, dan stderr-nya dibuang. Untuk memberikan atau menolak permintaan, kembalikan objek `decision`.2176Hook yang keluar dengan kode 2 tanpa objek `decision` membiarkan alur izin tidak berubah, dan stderr-nya dibuang. Untuk memberikan atau menolak permintaan, kembalikan objek `decision`.
2152 2177
2153```json theme={null}2178```json theme={null}
2205* Untuk menjalankan hook setelah tool apa pun berhasil diselesaikan, hilangkan `matcher` atau atur ke `"*"`. Hook Anda kemudian dapat menemukan sendiri apa yang berubah, misalnya dengan menjalankan `git status --porcelain`, yang juga mencantumkan file yang tidak terlacak yang terlewat oleh `git diff`. Untuk panggilan tool yang gagal, tambahkan hook yang sama di bawah [PostToolUseFailure](#posttoolusefailure).2230* Untuk menjalankan hook setelah tool apa pun berhasil diselesaikan, hilangkan `matcher` atau atur ke `"*"`. Hook Anda kemudian dapat menemukan sendiri apa yang berubah, misalnya dengan menjalankan `git status --porcelain`, yang juga mencantumkan file yang tidak terlacak yang terlewat oleh `git diff`. Untuk panggilan tool yang gagal, tambahkan hook yang sama di bawah [PostToolUseFailure](#posttoolusefailure).
2206* Untuk menjalankan hook ketika file tertentu berubah di disk, apa pun yang menulisnya, gunakan [FileChanged](#filechanged). Claude Code tidak menjalankan hook `PostToolUse` yang mencocokkan `Edit|Write` ketika perintah `Bash` atau proses di luar Claude Code menulis ulang file yang sama.2231* Untuk menjalankan hook ketika file tertentu berubah di disk, apa pun yang menulisnya, gunakan [FileChanged](#filechanged). Claude Code tidak menjalankan hook `PostToolUse` yang mencocokkan `Edit|Write` ketika perintah `Bash` atau proses di luar Claude Code menulis ulang file yang sama.
2207 2232
2233#### PostToolUse setelah interupsi
2234
2235Jika hook `PostToolUse` berhenti lebih awal setelah Anda mengirim pesan atau menginterupsi selama panggilan tool, periksa apakah Anda menekan `Ctrl+Enter`, `Enter`, atau `Esc`:
2236
2237* **`Ctrl+Enter`**: jika menekannya [mengakhiri giliran](https://code.claude.com/docs/id/interactive-mode.md#when-claude-code-sends-what-you-queued) saat tool sedang berjalan dan tool selesai, hook `PostToolUse` Anda berjalan pada hasilnya dan memiliki waktu 10 detik untuk selesai. Tombol ini berfungsi sebagai `Esc` jika Anda mengantrekan perintah `!` sebelum pesan Anda atau tugas latar belakang dinonaktifkan, misalnya dengan [`CLAUDE_CODE_DISABLE_BACKGROUND_TASKS`](https://code.claude.com/docs/id/env-vars#variables).
2238* **`Enter`**: pesan yang Anda antrekan dengan `Enter` tidak menginterupsi giliran, sehingga hook mempertahankan `timeout` biasanya.
2239* **`Esc`**: Anda langsung membatalkan hook, jadi kirim pesan dengan `Enter` atau `Ctrl+Enter` ketika hook harus berjalan.
2240
2241Ketika 10 detik habis, Claude Code menghentikan paksa command hook yang masih berjalan, berapa pun [`timeout`](#common-fields)-nya. Agar command hook yang lebih lama dapat selesai, jalankan dengan [`async: true`](#run-hooks-in-the-background), yang berarti hook tidak dapat memblokir atau menulis ulang hasilnya.
2242
2243Sebelum v2.1.319, hook tidak dimulai setelah Anda menginterupsi giliran dengan pesan, dan hook yang sedang berjalan dihentikan.
2244
2208#### Input PostToolUse2245#### Input PostToolUse
2209 2246
2210Hook `PostToolUse` dipicu setelah tool berhasil dieksekusi. Input mencakup `tool_input`, yaitu argumen yang dikirim ke tool, dan `tool_response`, yaitu hasil yang dikembalikannya. Skema persis untuk keduanya bergantung pada tool. Path `tool_input` pada tool file tiba dalam format yang sama seperti untuk [PreToolUse](#pretooluse-input): selalu absolut, dengan separator native platform, jadi backslash di Windows. Untuk tool MCP, input juga membawa objek [`mcp_server`](#pretooluse-input).2247Hook `PostToolUse` dipicu setelah tool berhasil dieksekusi. Input mencakup `tool_input`, yaitu argumen yang dikirim ke tool, dan `tool_response`, yaitu hasil yang dikembalikannya. Skema persis untuk keduanya bergantung pada tool. Path `tool_input` pada tool file tiba dalam format yang sama seperti untuk [PreToolUse](#pretooluse-input): selalu absolut, dengan separator native platform, jadi backslash di Windows. Untuk tool MCP, input juga membawa objek [`mcp_server`](#pretooluse-input).
2479| `permission_prompt` | Claude membutuhkan Anda untuk menyetujui penggunaan tool atau [permintaan jaringan](https://code.claude.com/docs/id/sandboxing.md#network-isolation) dari perintah yang di-sandbox, dan permintaan izin telah menunggu sekitar enam detik |2516| `permission_prompt` | Claude membutuhkan Anda untuk menyetujui penggunaan tool atau [permintaan jaringan](https://code.claude.com/docs/id/sandboxing.md#network-isolation) dari perintah yang di-sandbox, dan permintaan izin telah menunggu sekitar enam detik |
2480| `idle_prompt` | Claude selesai merespons sekitar 60 detik yang lalu dan Anda belum mengetik sejak itu |2517| `idle_prompt` | Claude selesai merespons sekitar 60 detik yang lalu dan Anda belum mengetik sejak itu |
2481| `auth_success` | Autentikasi selesai |2518| `auth_success` | Autentikasi selesai |
2519| `auth_storage_failure` | Proses masuk Anda selesai, tetapi Claude Code tidak dapat menyimpan kredensial baru ke [penyimpanan kredensial](https://code.claude.com/docs/id/authentication.md#credential-management) miliknya. Dipicu sebagai pengganti `auth_success` |
2482| `elicitation_dialog` | Server MCP membuka formulir elicitation dan Anda belum mengetik selama sekitar enam detik |2520| `elicitation_dialog` | Server MCP membuka formulir elicitation dan Anda belum mengetik selama sekitar enam detik |
2483| `elicitation_url_dialog` | Server MCP meminta Anda membuka URL browser dan Anda belum mengetik selama sekitar enam detik |2521| `elicitation_url_dialog` | Server MCP meminta Anda membuka URL browser dan Anda belum mengetik selama sekitar enam detik |
2484| `elicitation_complete` | Server MCP melaporkan bahwa [elicitation mode URL](#elicitation-input) telah selesai |2522| `elicitation_complete` | Server MCP melaporkan bahwa [elicitation mode URL](#elicitation-input) telah selesai |
2490| `quota_auto_resume_disabled` | Claude Code mengakhiri penantiannya untuk batas penggunaan claude.ai tanpa melanjutkan tugas Anda: [`autoContinueAtUsageLimit`](https://code.claude.com/docs/id/settings-reference#autocontinueatusagelimit) dimatikan atau reset bergeser lebih dari 24 jam selama penantian yang dimulai Claude Code sendiri, tugas yang dilanjutkan terus mencapai batas, atau kelanjutan diblokir sebelum mencapai model. Tidak dipicu ketika Anda menekan `Esc` atau `Ctrl+C`, atau memilih **Don't continue automatically** |2528| `quota_auto_resume_disabled` | Claude Code mengakhiri penantiannya untuk batas penggunaan claude.ai tanpa melanjutkan tugas Anda: [`autoContinueAtUsageLimit`](https://code.claude.com/docs/id/settings-reference#autocontinueatusagelimit) dimatikan atau reset bergeser lebih dari 24 jam selama penantian yang dimulai Claude Code sendiri, tugas yang dilanjutkan terus mencapai batas, atau kelanjutan diblokir sebelum mencapai model. Tidak dipicu ketika Anda menekan `Esc` atau `Ctrl+C`, atau memilih **Don't continue automatically** |
2491| `plugin_notification` | Sebuah [mod](https://code.claude.com/docs/id/plugins/mods/api.md#show-something-without-starting-a-turn) memunculkan notifikasi dengan `$.ui.notify`. `title` hook adalah nama mod kecuali mod tersebut menetapkannya |2529| `plugin_notification` | Sebuah [mod](https://code.claude.com/docs/id/plugins/mods/api.md#show-something-without-starting-a-turn) memunculkan notifikasi dengan `$.ui.notify`. `title` hook adalah nama mod kecuali mod tersebut menetapkannya |
2492 2530
2493Jenis `quota_auto_resume_fired`, `quota_auto_resume_stale`, dan `quota_auto_resume_disabled` memerlukan Claude Code v2.1.234 atau lebih baru.2531Tipe `quota_auto_resume_fired`, `quota_auto_resume_stale`, dan `quota_auto_resume_disabled` memerlukan Claude Code v2.1.234 atau yang lebih baru. Tipe `auth_storage_failure` memerlukan v2.1.288 atau yang lebih baru.
2494 2532
2495Dalam sesi terminal, `permission_prompt` untuk permintaan jaringan dari perintah yang di-sandbox memerlukan Claude Code v2.1.246 atau lebih baru.2533Dalam sesi terminal, `permission_prompt` untuk permintaan jaringan dari perintah yang di-sandbox memerlukan Claude Code v2.1.246 atau lebih baru.
2496 2534
3326}3364}
3327```3365```
3328 3366
3367#### Output PreCompact
3368
3369Ketika hook PreCompact keluar dengan 0 dan tidak memblokir, Claude Code menggunakan stdout-nya sebagai instruksi untuk ringkasan compaction. Jaga stdout tersebut di bawah 10.000 karakter per hook. Claude Code memotong output yang lebih panjang pada batas tersebut dan menambahkan penanda.
3370
3329### PostCompact3371### PostCompact
3330 3372
3331Berjalan setelah Claude Code menyelesaikan operasi compact. Gunakan event ini untuk bereaksi terhadap state baru yang sudah di-compact, misalnya untuk mencatat ringkasan yang dihasilkan atau memperbarui state eksternal. Claude Code membuang field `systemMessage` dan `continue` dari hook PostCompact.3373Berjalan setelah Claude Code menyelesaikan operasi compact. Gunakan event ini untuk bereaksi terhadap state baru yang sudah di-compact, misalnya untuk mencatat ringkasan yang dihasilkan atau memperbarui state eksternal. Claude Code membuang field `systemMessage` dan `continue` dari hook PostCompact.