476| `async` | tidak | Jika `true`, dijalankan di latar belakang tanpa memblokir. Lihat [Run hooks in the background](#run-hooks-in-the-background) |476| `async` | tidak | Jika `true`, dijalankan di latar belakang tanpa memblokir. Lihat [Run hooks in the background](#run-hooks-in-the-background) |
477| `asyncRewake` | tidak | Jika `true`, dijalankan di latar belakang dan membangunkan Claude pada kode keluar 2. Hook stderr, atau stdout jika stderr kosong, ditampilkan ke Claude sebagai [system reminder](/docs/id/glossary#system-reminder) sehingga dapat bereaksi terhadap kegagalan latar belakang yang berjalan lama |477| `asyncRewake` | tidak | Jika `true`, dijalankan di latar belakang dan membangunkan Claude pada kode keluar 2. Hook stderr, atau stdout jika stderr kosong, ditampilkan ke Claude sebagai [system reminder](/docs/id/glossary#system-reminder) sehingga dapat bereaksi terhadap kegagalan latar belakang yang berjalan lama |
478| `shell` | tidak | Shell untuk digunakan untuk hook ini. Menerima `"bash"` atau `"powershell"`. Default ke `"bash"`, atau ke `"powershell"` di Windows ketika Git Bash tidak diinstal. Menetapkan `"powershell"` menjalankan perintah melalui PowerShell di Windows. Tidak memerlukan `CLAUDE_CODE_USE_POWERSHELL_TOOL` karena hooks spawn PowerShell secara langsung. Diabaikan ketika `args` diatur |478| `shell` | tidak | Shell untuk digunakan untuk hook ini. Menerima `"bash"` atau `"powershell"`. Default ke `"bash"`, atau ke `"powershell"` di Windows ketika Git Bash tidak diinstal. Menetapkan `"powershell"` menjalankan perintah melalui PowerShell di Windows. Tidak memerlukan `CLAUDE_CODE_USE_POWERSHELL_TOOL` karena hooks spawn PowerShell secara langsung. Diabaikan ketika `args` diatur |
479| `onFailure` | tidak | Apa yang terjadi pada tindakan ketika hook gagal: `"continue"`, yang merupakan default, atau `"block"`. Lihat [Blokir tindakan ketika hook gagal](#block-the-action-when-a-hook-fails). Memerlukan Claude Code v2.1.295 atau lebih baru |479| `onFailure` | tidak | Apakah tindakan yang memicu hook tetap dilanjutkan ketika hook gagal: `"continue"` atau `"block"`. Lihat [Blokir tindakan ketika hook gagal](#block-the-action-when-a-hook-fails) untuk `"block"` dan untuk membiarkan bidang ini tidak diatur. Memerlukan Claude Code v2.1.295 atau lebih baru |
480 480
481<a id="exec-form-and-shell-form" />481<a id="exec-form-and-shell-form" />
482 482
829 829
830* **Berhasil**: hook Anda keluar dengan 0. Claude Code menerapkan field [output JSON](#json-output) apa pun yang dicetak hook Anda, dan tindakan dilanjutkan kecuali field tersebut memblokir atau menolaknya. [Hook yang memulai proses latar belakang](#hooks-that-start-a-background-process) membahas pengecualiannya.830* **Berhasil**: hook Anda keluar dengan 0. Claude Code menerapkan field [output JSON](#json-output) apa pun yang dicetak hook Anda, dan tindakan dilanjutkan kecuali field tersebut memblokir atau menolaknya. [Hook yang memulai proses latar belakang](#hooks-that-start-a-background-process) membahas pengecualiannya.
831* **Error blocking**: hook Anda keluar dengan 2. Pada [event yang dapat memblokir](#exit-code-2-behavior-per-event), Claude Code menghentikan tindakan.831* **Error blocking**: hook Anda keluar dengan 2. Pada [event yang dapat memblokir](#exit-code-2-behavior-per-event), Claude Code menghentikan tindakan.
832* **Error non-blocking**: hook Anda keluar dengan kode lain, atau gagal dengan cara lain, seperti tidak dapat dimulai atau mencetak JSON yang tidak valid. Tindakan dilanjutkan, dan pada event seperti `PreToolUse` Anda melihat pemberitahuan `<hook name> hook error` di transkrip. Jika Anda ingin hook yang gagal memblokir tindakan, atur [`onFailure: "block"`](#block-the-action-when-a-hook-fails).832* **Error non-blocking**: hook Anda keluar dengan kode lain, atau gagal dengan cara lain, seperti tidak dapat dimulai atau mencetak JSON yang tidak valid. Tindakan dilanjutkan, kecuali untuk hook [yang kegagalannya memblokir tindakan](#block-the-action-when-a-hook-fails), misalnya hook dengan `onFailure` diatur ke `"block"`. Pada event seperti `PreToolUse`, Anda melihat pemberitahuan `<hook name> hook error` di transkrip.
833 833
834Apa yang dicetak hook Anda ke stdout dapat mengubah hasilnya. Misalnya, jika hook `PreToolUse` keluar dengan 1 tetapi mencetak JSON yang lolos validasi, eksekusi dianggap berhasil dan field JSON menentukan apa yang terjadi. Untuk menemukan hasil hook Anda pada event seperti `PreToolUse`, cocokkan apa yang dicetaknya ke stdout di kolom pertama dengan exit code-nya di bagian atas:834Apa yang dicetak hook Anda ke stdout dapat mengubah hasilnya. Misalnya, ketika hook `PreToolUse` keluar dengan 1 tetapi mencetak JSON yang lolos validasi, JSON tersebut tetap dapat menentukan apa yang terjadi. Untuk menemukan hasil hook Anda pada event seperti `PreToolUse`, cocokkan apa yang dicetaknya ke stdout di kolom pertama dengan exit code-nya di bagian atas:
835 835
836| Stdout | Exit 0 | Exit 2 | Exit code lainnya |836| Stdout | Exit 0 | Exit 2 | Exit code lainnya |
837| :- | :- | :- | :- |837| :- | :- | :- | :- |
838| Objek JSON yang lolos [validasi skema](#json-output) | Berhasil. Field diterapkan | Error blocking. Claude Code tetap membaca field, tetapi field tersebut tidak dapat menimpa pemblokiran | Berhasil. Claude Code mengabaikan exit code, dan hanya field yang menentukan. Dengan [`onFailure: "block"`](#block-the-action-when-a-hook-fails), ini dihitung sebagai kegagalan |838| Objek JSON yang lolos [validasi skema](#json-output) | Berhasil. Field diterapkan | Error blocking. Claude Code tetap membaca field, tetapi field tersebut tidak dapat menimpa pemblokiran | Berhasil. Claude Code mengabaikan exit code, dan hanya field yang menentukan. Untuk hook [yang kegagalannya memblokir tindakan](#block-the-action-when-a-hook-fails), eksekusi ini justru dihitung sebagai kegagalan |
839| JSON yang [tidak dapat di-parse](#exit-code-0) atau gagal validasi skema | Error non-blocking. Pemberitahuan memuat pesan parse atau validasi | Error blocking. Stderr Anda menjadi alasannya | Error non-blocking. Pemberitahuan memuat pesan parse atau validasi |839| JSON yang [tidak dapat di-parse](#exit-code-0) atau gagal validasi skema | Error non-blocking. Pemberitahuan memuat pesan parse atau validasi | Error blocking. Stderr Anda menjadi alasannya | Error non-blocking. Pemberitahuan memuat pesan parse atau validasi |
840| [Teks biasa](#exit-code-0), atau tidak ada apa pun | Berhasil | Error blocking. Stderr Anda menjadi alasannya | Error non-blocking. Pemberitahuan memuat baris pertama stderr Anda |840| [Teks biasa](#exit-code-0), atau tidak ada apa pun | Berhasil | Error blocking. Stderr Anda menjadi alasannya | Error non-blocking. Pemberitahuan memuat baris pertama stderr Anda |
841 841
864* **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, dan kegagalan parse ketika ada baris yang demikian.864* **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, dan kegagalan parse ketika ada baris yang demikian.
865* **Apa pun lainnya yang diawali dengan `{` dan diakhiri dengan `}` tetapi bukan JSON yang valid**: kegagalan parse.865* **Apa pun lainnya yang diawali dengan `{` dan diakhiri dengan `}` tetapi bukan JSON yang valid**: kegagalan parse.
866 866
867Ketika Claude Code mencoba mem-parse stdout Anda sebagai JSON dan gagal, atau objek yang di-parse gagal [validasi skema](#json-output), eksekusi tersebut adalah [error non-blocking](#exit-code-output). Pemberitahuan `<hook name> hook error` memuat pesan parse atau validasi. Pada event yang menambahkan stdout teks biasa sebagai konteks, Claude Code tidak menambahkan stdout yang gagal di-parse.867Kecuali hook tersebut adalah hook [yang kegagalannya memblokir tindakan](#block-the-action-when-a-hook-fails), kegagalan parse atau objek yang di-parse tetapi gagal [validasi skema](#json-output) adalah [error non-blocking](#exit-code-output). Pemberitahuan `<hook name> hook error` memuat pesan parse atau validasi. Pada event yang menambahkan stdout teks biasa sebagai konteks, Claude Code tidak menambahkan stdout yang gagal di-parse.
868 868
869Claude 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.869Claude 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.
870 870
907 Exit code lainnya907 Exit code lainnya
908</h4>908</h4>
909 909
910Ketika hook Anda keluar dengan kode selain 0 atau 2 dan mencetak teks biasa atau tidak mencetak apa pun ke stdout, eksekusi tersebut adalah [error non-blocking](#exit-code-output). Anda melihat pemberitahuan `<hook name> hook error` di transkrip dengan `Failed with non-blocking status code:` dan baris pertama stderr hook Anda. Misalnya, ketika hook `PreToolUse` pada `Bash` mencetak `something broke` ke stderr dan keluar dengan 1, pemberitahuan `PreToolUse:Bash hook error` memuat baris ini:910Kecuali hook tersebut adalah hook [yang kegagalannya memblokir tindakan](#block-the-action-when-a-hook-fails), exit code selain 0 atau 2 dengan teks biasa atau tanpa apa pun di stdout adalah [error non-blocking](#exit-code-output). Jika tindakan dilanjutkan, Anda melihat pemberitahuan `<hook name> hook error` di transkrip dengan `Failed with non-blocking status code:` dan baris pertama stderr hook Anda.
911
912Misalnya, ketika hook `PreToolUse` pada `Bash` mencetak `something broke` ke stderr dan keluar dengan 1, pemberitahuan `PreToolUse:Bash hook error` memuat baris ini:
911 913
912```text theme={null}914```text theme={null}
913Failed with non-blocking status code: something broke915Failed with non-blocking status code: something broke
915 917
916Untuk menangkap stderr lengkap alih-alih hanya baris pertamanya, aktifkan [logging debug](#debug-hooks).918Untuk menangkap stderr lengkap alih-alih hanya baris pertamanya, aktifkan [logging debug](#debug-hooks).
917 919
918Hook yang tidak dapat dimulai juga merupakan error non-blocking. Dalam bentuk shell, ketika path skrip tidak ada atau tidak dapat dieksekusi, shell keluar dengan kode seperti 127 dan pemberitahuan memuat pesan interpreter, misalnya `Failed with non-blocking status code: /bin/sh: /path/to/hook.sh: No such file or directory`. Saat Anda menyiapkan hook kebijakan, perhatikan pemberitahuan ini pada eksekusi pertamanya, karena path yang salah ketik di `settings.json` berarti hook tidak pernah berjalan. Untuk memblokir tindakan sebagai gantinya, atur [`onFailure: "block"`](#block-the-action-when-a-hook-fails).920Kecuali hook tersebut adalah hook [yang kegagalannya memblokir tindakan](#block-the-action-when-a-hook-fails), hook yang tidak dapat dimulai juga merupakan error non-blocking. Dalam bentuk shell, ketika path skrip tidak ada atau tidak dapat dieksekusi, shell keluar dengan kode seperti 127 dan pemberitahuan memuat pesan interpreter. Misalnya, ketika path skrip tidak ada, pemberitahuan memuat baris seperti ini:
921
922```text theme={null}
923Failed with non-blocking status code: /bin/sh: /path/to/hook.sh: No such file or directory
924```
925
926Saat Anda menyiapkan hook kebijakan, perhatikan pemberitahuan ini pada eksekusi pertamanya, karena path yang salah ketik di `settings.json` berarti hook tidak pernah berjalan. Untuk memblokir tindakan ketika hook tidak dapat dimulai, atur [`onFailure: "block"`](#block-the-action-when-a-hook-fails).
919 927
920<Warning>928<Warning>
921 Tanpa JSON yang valid di stdout, Claude Code memperlakukan exit code 1 sebagai error non-blocking, meskipun 1 adalah kode kegagalan Unix yang konvensional. Jika hook Anda dimaksudkan untuk menegakkan kebijakan, gunakan `exit 2`.929 Exit code 1 tanpa output JSON yang valid adalah error non-blocking kecuali hook tersebut adalah hook [yang kegagalannya memblokir tindakan](#block-the-action-when-a-hook-fails), meskipun 1 adalah kode kegagalan Unix yang konvensional. Jika hook Anda dimaksudkan untuk menegakkan kebijakan, gunakan `exit 2`.
922</Warning>930</Warning>
923 931
924<h4 id="timeouts">932<h4 id="timeouts">
929 937
930Pada [`PreModelSwitch`](#premodelswitch), hook yang dibatalkan karena timeout memblokir pergantian model. Pada `PreToolUse`, kedua keluarga hook berbeda:938Pada [`PreModelSwitch`](#premodelswitch), hook yang dibatalkan karena timeout memblokir pergantian model. Pada `PreToolUse`, kedua keluarga hook berbeda:
931 939
932* Hook `command`, `http`, atau `mcp_tool` yang mengalami timeout tidak memblokir panggilan tool. Panggilan berlanjut melalui [alur izin](/docs/id/permissions) normal, jadi jangan mengandalkan hook yang macet untuk berfungsi sebagai gerbang. Untuk memblokir panggilan ketika hook `command` atau `http` mengalami timeout, atur [`onFailure: "block"`](#block-the-action-when-a-hook-fails).940* Hook `command`, `http`, atau `mcp_tool` yang mengalami timeout tidak memblokir panggilan tool, kecuali untuk hook [yang kegagalannya memblokir tindakan](#block-the-action-when-a-hook-fails). Panggilan berlanjut melalui [alur izin](/docs/id/permissions) normal, jadi jangan mengandalkan hook yang macet untuk berfungsi sebagai gerbang. Untuk memblokir panggilan ketika hook `command` atau `http` mengalami timeout, atur [`onFailure: "block"`](#block-the-action-when-a-hook-fails).
933* [Callback hook Agent SDK](/docs/id/agent-sdk/hooks) yang melebihi timeout-nya [memblokir panggilan tool](#pretooluse).941* [Callback hook Agent SDK](/docs/id/agent-sdk/hooks) yang melebihi timeout-nya [memblokir panggilan tool](#pretooluse).
934 942
935<h4 id="hooks-that-start-a-background-process">943<h4 id="hooks-that-start-a-background-process">
959 Memblokir tindakan ketika hook gagal967 Memblokir tindakan ketika hook gagal
960</h4>968</h4>
961 969
962Pada sebagian besar event, ketika hook gagal atau mengalami timeout, Claude Code tetap menjalankan tindakan, sehingga hook kebijakan dengan path yang salah atau skrip yang crash meloloskan semuanya. Untuk memblokir tindakan sebagai gantinya, atur `"onFailure": "block"` pada hook `command` atau `http`. Nilai default-nya adalah `"continue"`. Memerlukan Claude Code v2.1.295 atau lebih baru.970Pada sebagian besar event, ketika hook gagal atau mengalami timeout, Claude Code tetap menjalankan tindakan. Hook kebijakan dengan path yang salah atau skrip yang crash kemudian meloloskan semuanya. Untuk memblokir tindakan sebagai gantinya, atur `"onFailure": "block"` pada hook `command` atau `http`. Memerlukan Claude Code v2.1.295 atau lebih baru.
971
972<Note>
973 Di Windows tanpa Git Bash, hook perintah `PreToolUse` atau `PermissionRequest` berbentuk shell yang gagal dengan `onFailure` tidak diatur dapat [memblokir panggilan tool](#failed-hooks-on-windows-without-git-bash) sebagai gantinya.
974</Note>
963 975
964Hook `PreToolUse` di `.claude/settings.json` ini menjalankan skrip proyek sebelum setiap perintah Bash, dan memblokir perintah jika skrip gagal:976Hook `PreToolUse` di `.claude/settings.json` ini menjalankan skrip proyek sebelum setiap perintah Bash, dan memblokir perintah jika skrip gagal:
965 977
1007* **Hook `Stop`, `SubagentStop`, `TaskCompleted`, dan `TeammateIdle`**: exit code 2 pada event ini mengirim Claude kembali untuk terus bekerja, dan Claude tidak dapat memperbaiki hook yang tidak mau berjalan1019* **Hook `Stop`, `SubagentStop`, `TaskCompleted`, dan `TeammateIdle`**: exit code 2 pada event ini mengirim Claude kembali untuk terus bekerja, dan Claude tidak dapat memperbaiki hook yang tidak mau berjalan
1008* **Hook perintah latar belakang**: hook perintah yang mengatur [`async` atau `asyncRewake`](#run-hooks-in-the-background)1020* **Hook perintah latar belakang**: hook perintah yang mengatur [`async` atau `asyncRewake`](#run-hooks-in-the-background)
1009 1021
1022<h4 id="failed-hooks-on-windows-without-git-bash">
1023 Hook yang gagal di Windows tanpa Git Bash
1024</h4>
1025
1026Jika error untuk panggilan tool yang diblokir menyertakan teks ini, hook perintah `PreToolUse` atau `PermissionRequest` gagal atau mengalami timeout dan memblokir panggilan tersebut:
1027
1028```text theme={null}
1029blocking because Git Bash wasn't found and this hook doesn't set "shell" to "powershell", so only exit code 0 or 2 counts as its verdict.
1030```
1031
1032Hook berbentuk shell tanpa `shell` yang diatur berjalan di PowerShell ketika Git Bash tidak terinstal, dan skrip yang ditulis untuk Bash mungkin tidak berjalan sebagaimana ditulis di sana. Pilih perbaikan yang sesuai dengan hook Anda:
1033
1034* **Hook ditulis untuk Bash**: instal [Git for Windows](https://git-scm.com/downloads/win), atau atur [`CLAUDE_CODE_GIT_BASH_PATH`](/docs/id/env-vars) jika Git Bash terinstal di lokasi yang tidak ditemukan Claude Code, lalu mulai sesi baru
1035* **Hook menjalankan satu `.exe`, bukan file `.cmd` atau `.bat`**: letakkan program di `command` dan argumennya di `args` untuk menggunakan [bentuk exec](#exec-form-and-shell-form), lalu tambahkan [`"onFailure": "block"`](#block-the-action-when-a-hook-fails). Claude Code kemudian memulai program tanpa shell. Tanpa `"onFailure": "block"`, panggilan dapat dilanjutkan ketika program gagal, tidak ada, atau mengalami timeout
1036* **Hook ditulis untuk PowerShell**: tambahkan `"shell": "powershell"` dan [`"onFailure": "block"`](#block-the-action-when-a-hook-fails) ke hook. Tanpa `"onFailure": "block"`, panggilan dapat dilanjutkan ketika hook masih gagal atau mengalami timeout. Untuk mengetahui mengapa hook gagal, periksa [log debug](#debug-hooks)
1037* **Tindakan sebaiknya dilanjutkan ketika hook gagal**: tambahkan `"onFailure": "continue"` ke hook
1038
1039Untuk hook yang menampilkan error ini, exit code apa pun selain 0 atau 2 dihitung sebagai [kegagalan](#block-the-action-when-a-hook-fails), bahkan ketika hook mencetak JSON yang tidak menolak panggilan.
1040
1010<h4 id="exit-code-2-behavior-per-event">1041<h4 id="exit-code-2-behavior-per-event">
1011 Perilaku exit code 2 per event1042 Perilaku exit code 2 per event
1012</h4>1043</h4>
1060* **2xx dengan body kosong**: berhasil, setara dengan exit code 0 tanpa output1091* **2xx dengan body kosong**: berhasil, setara dengan exit code 0 tanpa output
1061* **2xx dengan body objek JSON**: di-parse menggunakan skema [output JSON](#json-output) yang sama seperti hook perintah. Body yang gagal validasi skema adalah error non-blocking1092* **2xx dengan body objek JSON**: di-parse menggunakan skema [output JSON](#json-output) yang sama seperti hook perintah. Body yang gagal validasi skema adalah error non-blocking
1062* **2xx dengan body lain, seperti teks biasa**: error non-blocking, ditangani sama seperti status non-2xx. Claude Code tidak menambahkan teks tersebut ke konteks Claude1093* **2xx dengan body lain, seperti teks biasa**: error non-blocking, ditangani sama seperti status non-2xx. Claude Code tidak menambahkan teks tersebut ke konteks Claude
1063* **Status non-2xx**: error non-blocking, eksekusi berlanjut1094* **Status non-2xx**: error non-blocking
1064* **Kegagalan koneksi**: error non-blocking, eksekusi berlanjut1095* **Kegagalan koneksi**: error non-blocking
1065* **Timeout**: hook dibatalkan, seperti dijelaskan di bagian [Timeout](#timeouts)1096* **Timeout**: hook dibatalkan, seperti dijelaskan di bagian [Timeout](#timeouts)
1066 1097
1067Hook HTTP tidak dapat memberi sinyal error blocking hanya melalui kode status: status non-2xx atau koneksi yang gagal adalah [error non-blocking](#exit-code-output). Untuk memblokir panggilan tool atau menolak izin, kembalikan respons 2xx dengan body JSON yang berisi field keputusan yang sesuai. Untuk memblokir tindakan ketika permintaan gagal atau mengembalikan status non-2xx, atur [`onFailure: "block"`](#block-the-action-when-a-hook-fails).1098Setelah [error non-blocking](#exit-code-output), tindakan dilanjutkan kecuali hook tersebut adalah hook [yang kegagalannya memblokir tindakan](#block-the-action-when-a-hook-fails). Untuk memblokir panggilan tool atau menolak izin, kembalikan respons 2xx dengan body JSON yang berisi [field keputusan](#decision-control) yang sesuai. Untuk memblokir tindakan ketika permintaan gagal atau mengembalikan status non-2xx, atur [`onFailure: "block"`](#block-the-action-when-a-hook-fails).
1068 1099
1069<h3 id="json-output">1100<h3 id="json-output">
1070 Output JSON1101 Output JSON
1573}1604}
1574```1605```
1575 1606
1607Saat prompt berupa [skill](/docs/id/skills) atau perintah kustom yang Anda ketik, seperti `/deploy staging`, hook menerima baris tersebut sebagaimana Anda mengetiknya, bukan konten skill yang diperluas. Jika hook memblokir prompt, perintah tidak dijalankan, sehingga perintah shell yang [disisipkan skill dengan `` !`<command>` ``](/docs/id/skills#inject-dynamic-context) juga tidak dijalankan. Untuk mencocokkan nama atau argumen perintah sebagai gantinya, gunakan [UserPromptExpansion](#userpromptexpansion).
1608
1576<h4 id="userpromptsubmit-decision-control">1609<h4 id="userpromptsubmit-decision-control">
1577 Kontrol keputusan UserPromptSubmit1610 Kontrol keputusan UserPromptSubmit
1578</h4>1611</h4>
2076 2109
2077| Kolom | Deskripsi |2110| Kolom | Deskripsi |
2078| :- | :- |2111| :- | :- |
2079| `permissionDecision` | `"allow"` melewati permintaan izin, kecuali untuk [tindakan yang tidak disetujui otomatis oleh mode mana pun](/docs/id/permission-modes#actions-no-mode-auto-approves), untuk [pembacaan dari path jaringan](/docs/id/permissions#network-paths), dan untuk `AskUserQuestion` serta `ExitPlanMode`, yang memerlukan [`updatedInput` yang dipasangkan dengannya](#allow-with-updatedinput). `"deny"` mencegah panggilan tool. `"ask"` meminta pengguna untuk mengonfirmasi. `"defer"` keluar dengan baik sehingga tool dapat dilanjutkan nanti. [Aturan deny dan ask](/docs/id/permissions#manage-permissions) tetap dievaluasi apa pun yang dikembalikan hook |2112| `permissionDecision` | `"allow"` melewati permintaan izin, kecuali untuk [tindakan yang tidak disetujui otomatis oleh mode apa pun](/docs/id/permission-modes#actions-no-mode-auto-approves) dan [pembacaan dari path jaringan](/docs/id/permissions#network-paths). `AskUserQuestion` dan `ExitPlanMode` memerlukan [`updatedInput` yang dipasangkan dengan `"allow"`](#allow-with-updatedinput). Untuk plan mode, lihat [Persetujuan hook di plan mode](/docs/id/permissions#hook-approvals-in-plan-mode). `"deny"` mencegah panggilan tool. `"ask"` meminta pengguna untuk mengonfirmasi. `"defer"` keluar dengan baik sehingga tool dapat dilanjutkan nanti. [Aturan deny dan ask](/docs/id/permissions#manage-permissions) tetap dievaluasi terlepas dari apa yang dikembalikan hook |
2080| `permissionDecisionReason` | Untuk `"ask"`, ditampilkan kepada pengguna dalam permintaan izin. Saat Claude Code [menolak panggilan](/docs/id/headless#turn-off-permission-prompts-in-unattended-runs) dalam eksekusi `-p` tempat tidak ada yang dapat menjawab permintaan tersebut, Claude membaca alasannya di hasil tool sebagai gantinya. Untuk `"deny"`, ditampilkan kepada Claude. Untuk `"allow"` dan `"defer"`, hanya ditulis ke [debug log](#debug-hooks) |2113| `permissionDecisionReason` | Untuk `"ask"`, ditampilkan kepada pengguna dalam permintaan izin. Saat Claude Code [menolak panggilan](/docs/id/headless#turn-off-permission-prompts-in-unattended-runs) dalam eksekusi `-p` tempat tidak ada yang dapat menjawab permintaan tersebut, Claude membaca alasannya di hasil tool sebagai gantinya. Untuk `"deny"`, ditampilkan kepada Claude. Untuk `"allow"` dan `"defer"`, hanya ditulis ke [debug log](#debug-hooks) |
2081| `updatedInput` | Mengubah parameter input tool sebelum eksekusi. Menggantikan seluruh objek input, jadi sertakan kolom yang tidak berubah bersama kolom yang diubah. Claude Code mengevaluasi aturan izin dan [kelayakan auto-background](/docs/id/tools-reference#foreground-commands-that-move-to-the-background) perintah Bash terhadap input yang dikembalikan hook Anda, bukan input yang dikirim Claude. Kombinasikan dengan `"allow"` untuk menyetujui otomatis, atau `"ask"` untuk menampilkan input yang diubah kepada pengguna. Untuk `"defer"`, diabaikan |2114| `updatedInput` | Mengubah parameter input tool sebelum eksekusi. Menggantikan seluruh objek input, jadi sertakan kolom yang tidak berubah bersama kolom yang diubah. Claude Code mengevaluasi aturan izin dan [kelayakan auto-background](/docs/id/tools-reference#foreground-commands-that-move-to-the-background) perintah Bash terhadap input yang dikembalikan hook Anda, bukan input yang dikirim Claude. Kombinasikan dengan `"allow"` untuk menyetujui otomatis, atau `"ask"` untuk menampilkan input yang diubah kepada pengguna. Untuk `"defer"`, diabaikan |
2082| `additionalContext` | String yang ditambahkan ke konteks Claude bersama hasil tool. Diabaikan saat `permissionDecision` bernilai `"defer"`. Lihat [Menambahkan konteks untuk Claude](#add-context-for-claude) |2115| `additionalContext` | String yang ditambahkan ke konteks Claude bersama hasil tool. Diabaikan saat `permissionDecision` bernilai `"defer"`. Lihat [Menambahkan konteks untuk Claude](#add-context-for-claude) |
3718 3751
3719Claude Code menampilkan kepada pengguna setiap `systemMessage` yang dikembalikan hook Anda terlepas dari keputusannya, sehingga hook pelaporan biaya dapat mengembalikan `{"systemMessage": "..."}` dan keluar dengan 0.3752Claude Code menampilkan kepada pengguna setiap `systemMessage` yang dikembalikan hook Anda terlepas dari keputusannya, sehingga hook pelaporan biaya dapat mengembalikan `{"systemMessage": "..."}` dan keluar dengan 0.
3720 3753
3721Hook PreModelSwitch yang tidak merespons sebelum timeout-nya akan memblokir pergantian. Untuk efek timeout pada event lain, lihat [Timeouts](#timeouts). Timeout default untuk event ini adalah 30 detik. `PreModelSwitch` hanya menjalankan hook `command`, `http`, dan `mcp_tool`, sehingga default `prompt` dan `agent` tidak berlaku.3754<h4 id="premodelswitch-timeouts-and-other-exit-codes">
3755 Timeout PreModelSwitch dan exit code lainnya
3756</h4>
3757
3758Hook PreModelSwitch yang tidak merespons sebelum timeout-nya memblokir peralihan. Timeout default untuk event ini adalah 30 detik.
3722 3759
3723Hook yang keluar dengan kode selain 0 atau 2 dan tidak mencetak keputusan JSON merupakan error non-blocking, seperti dijelaskan di [Exit code lainnya](#other-exit-codes).3760Untuk efek exit code selain 0 atau 2, lihat [Exit code lainnya](#other-exit-codes).
3724 3761
3725<h3 id="postmodelswitch">3762<h3 id="postmodelswitch">
3726 PostModelSwitch3763 PostModelSwitch