35Tabel di bawah merangkum kapan setiap event dijalankan. Bagian [Hook events](#hook-events) mendokumentasikan skema input lengkap dan opsi kontrol keputusan untuk masing-masing.35Tabel di bawah merangkum kapan setiap event dijalankan. Bagian [Hook events](#hook-events) mendokumentasikan skema input lengkap dan opsi kontrol keputusan untuk masing-masing.
36 36
37| Event | Kapan event ini dipicu |37| Event | Kapan event ini dipicu |
38| :-------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |38| :- | :- |
39| `SessionStart` | Ketika sesi dimulai atau dilanjutkan |39| `SessionStart` | Ketika sesi dimulai atau dilanjutkan |
40| `Setup` | Ketika Anda memulai Claude Code dengan `--init-only`, atau dengan `--init` atau `--maintenance` dalam mode `-p`. Untuk persiapan satu kali dalam CI atau skrip |40| `Setup` | Ketika Anda memulai Claude Code dengan `--init-only`, atau dengan `--init` atau `--maintenance` dalam mode `-p`. Untuk persiapan satu kali dalam CI atau skrip |
41| `UserPromptSubmit` | Ketika Anda mengirimkan prompt, sebelum Claude memprosesnya |41| `UserPromptSubmit` | Ketika Anda mengirimkan prompt, sebelum Claude memprosesnya |
259Tempat Anda mendefinisikan hook menentukan cakupannya:259Tempat Anda mendefinisikan hook menentukan cakupannya:
260 260
261| Lokasi | Cakupan | Dapat Dibagikan |261| Lokasi | Cakupan | Dapat Dibagikan |
262| :------------------------------------------------ | :---------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------ |262| :- | :- | :- |
263| `~/.claude/settings.json` | Semua proyek Anda | Tidak, lokal ke mesin Anda |263| `~/.claude/settings.json` | Semua proyek Anda | Tidak, lokal ke mesin Anda |
264| `.claude/settings.json` | Proyek tunggal | Ya, dapat dikomit ke repo |264| `.claude/settings.json` | Proyek tunggal | Ya, dapat dikomit ke repo |
265| `.claude/settings.local.json` | Proyek tunggal | Tidak, gitignored saat Claude Code menyimpan pengaturan ke dalamnya |265| `.claude/settings.local.json` | Proyek tunggal | Tidak, gitignored saat Claude Code menyimpan pengaturan ke dalamnya |
297Bidang `matcher` memfilter kapan hooks dijalankan. Bagaimana matcher dievaluasi tergantung pada karakter yang dikandungnya:297Bidang `matcher` memfilter kapan hooks dijalankan. Bagaimana matcher dievaluasi tergantung pada karakter yang dikandungnya:
298 298
299| Nilai matcher | Dievaluasi sebagai | Contoh |299| Nilai matcher | Dievaluasi sebagai | Contoh |
300| :------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |300| :- | :- | :- |
301| `"*"`, `""`, atau dihilangkan | Cocokkan semua | dijalankan pada setiap kemunculan event |301| `"*"`, `""`, atau dihilangkan | Cocokkan semua | dijalankan pada setiap kemunculan event |
302| 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 |302| 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 |
303| Berisi karakter lain apa pun | Ekspresi reguler JavaScript, tidak berlabuh | `^Notebook` cocok dengan tool apa pun yang dimulai dengan Notebook; `mcp__memory__.*` cocok dengan setiap tool dari server `memory` |303| Berisi karakter lain apa pun | Ekspresi reguler JavaScript, tidak berlabuh | `^Notebook` cocok dengan tool apa pun yang dimulai dengan Notebook; `mcp__memory__.*` cocok dengan setiap tool dari server `memory` |
313Setiap tipe event cocok pada bidang yang berbeda:313Setiap tipe event cocok pada bidang yang berbeda:
314 314
315| Event | Apa yang difilter matcher | Contoh nilai matcher |315| Event | Apa yang difilter matcher | Contoh nilai matcher |
316| :------------------------------------------------------------------------------------------------------------------------------------------------ | :----------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |316| :- | :- | :- |
317| `PreToolUse`, `PostToolUse`, `PostToolUseFailure`, `PermissionRequest`, `PermissionDenied` | nama tool | `Bash`, `Edit\|Write`, `mcp__.*` |317| `PreToolUse`, `PostToolUse`, `PostToolUseFailure`, `PermissionRequest`, `PermissionDenied` | nama tool | `Bash`, `Edit\|Write`, `mcp__.*` |
318| `SessionStart` | bagaimana sesi dimulai | `startup`, `resume`, `clear`, `compact`, `fork` |318| `SessionStart` | bagaimana sesi dimulai | `startup`, `resume`, `clear`, `compact`, `fork` |
319| `Setup` | flag CLI mana yang memicu setup | `init`, `maintenance` |319| `Setup` | flag CLI mana yang memicu setup | `init`, `maintenance` |
438Bidang-bidang ini berlaku untuk semua tipe hook:438Bidang-bidang ini berlaku untuk semua tipe hook:
439 439
440| Bidang | Diperlukan | Deskripsi |440| Bidang | Diperlukan | Deskripsi |
441| :-------------- | :--------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |441| :- | :- | :- |
442| `type` | ya | `"command"`, `"http"`, `"mcp_tool"`, `"prompt"`, atau `"agent"` |442| `type` | ya | `"command"`, `"http"`, `"mcp_tool"`, `"prompt"`, atau `"agent"` |
443| `if` | tidak | Sintaks aturan izin untuk memfilter kapan hook ini dijalankan, seperti `"Bash(git *)"` atau `"Edit(*.ts)"`. Hook command hanya dijalankan jika pemanggilan tool cocok dengan pola. Lihat tabel [Bash matching](#bash-if-matching) di bawah untuk bagaimana pola Bash dievaluasi terhadap subperintah, `$()`, dan backticks. Hanya dievaluasi pada tool events: `PreToolUse`, `PostToolUse`, `PostToolUseFailure`, `PermissionRequest`, dan `PermissionDenied`. Pada event lain, hook dengan `if` yang ditetapkan tidak akan pernah dijalankan. Menggunakan sintaks yang sama seperti [aturan izin](/docs/id/permissions) |443| `if` | tidak | Sintaks aturan izin untuk memfilter kapan hook ini dijalankan, seperti `"Bash(git *)"` atau `"Edit(*.ts)"`. Hook command hanya dijalankan jika pemanggilan tool cocok dengan pola. Lihat tabel [Bash matching](#bash-if-matching) di bawah untuk bagaimana pola Bash dievaluasi terhadap subperintah, `$()`, dan backticks. Hanya dievaluasi pada tool events: `PreToolUse`, `PostToolUse`, `PostToolUseFailure`, `PermissionRequest`, dan `PermissionDenied`. Pada event lain, hook dengan `if` yang ditetapkan tidak akan pernah dijalankan. Menggunakan sintaks yang sama seperti [aturan izin](/docs/id/permissions) |
444| `timeout` | tidak | Detik sebelum membatalkan. Claude Code tidak memberlakukannya pada command hook yang Anda jalankan dengan [`async: true`](#run-hooks-in-the-background). Default: 600 untuk `command`, `http`, dan `mcp_tool`; 30 untuk `prompt`; 60 untuk `agent`. Claude Code menurunkan default `command`, `http`, dan `mcp_tool` menjadi 30 pada [`UserPromptSubmit`](#userpromptsubmit), [`PreModelSwitch`](#premodelswitch), dan [`PostModelSwitch`](#postmodelswitch), dan menjadi 10 pada [`MessageDisplay`](#messagedisplay). Hook [`SessionEnd`](#sessionend) berbagi anggaran 1,5 detik; jika pengaturan Anda menetapkan `timeout` per-hook yang lebih lama, Claude Code menaikkan anggaran untuk mencocokkan, hingga 60 detik |444| `timeout` | tidak | Detik sebelum membatalkan. Claude Code tidak memberlakukannya pada command hook yang Anda jalankan dengan [`async: true`](#run-hooks-in-the-background). Default: 600 untuk `command`, `http`, dan `mcp_tool`; 30 untuk `prompt`; 60 untuk `agent`. Claude Code menurunkan default `command`, `http`, dan `mcp_tool` menjadi 30 pada [`UserPromptSubmit`](#userpromptsubmit), [`PreModelSwitch`](#premodelswitch), dan [`PostModelSwitch`](#postmodelswitch), dan menjadi 10 pada [`MessageDisplay`](#messagedisplay). Hook [`SessionEnd`](#sessionend) berbagi anggaran 1,5 detik; jika pengaturan Anda menetapkan `timeout` per-hook yang lebih lama, Claude Code menaikkan anggaran untuk mencocokkan, hingga 60 detik |
452<span id="bash-if-matching" />Untuk pola Bash, apakah hook command Anda dijalankan tergantung pada bentuk pola dan perintah Bash yang Claude panggil. Penugasan `VAR=value` terkemuka dihapus sebelum pencocokan.452<span id="bash-if-matching" />Untuk pola Bash, apakah hook command Anda dijalankan tergantung pada bentuk pola dan perintah Bash yang Claude panggil. Penugasan `VAR=value` terkemuka dihapus sebelum pencocokan.
453 453
454| Pola `if` | Perintah Bash | Hook dijalankan? | Mengapa |454| Pola `if` | Perintah Bash | Hook dijalankan? | Mengapa |
455| :----------------- | :-------------------------- | :--------------- | :----------------------------------------------------------------------------------------------------------------------------------------- |455| :- | :- | :- | :- |
456| `Bash(git *)` | `FOO=bar git push` | ya | penugasan terkemuka dihapus; `git push` cocok |456| `Bash(git *)` | `FOO=bar git push` | ya | penugasan terkemuka dihapus; `git push` cocok |
457| `Bash(git *)` | `npm test && git push` | ya | setiap subperintah diperiksa; `git push` cocok |457| `Bash(git *)` | `npm test && git push` | ya | setiap subperintah diperiksa; `git push` cocok |
458| `Bash(rm *)` | `echo $(rm -rf /)` | ya | perintah di dalam `$()` dan backticks diperiksa; `rm -rf /` cocok |458| `Bash(rm *)` | `echo $(rm -rf /)` | ya | perintah di dalam `$()` dan backticks diperiksa; `rm -rf /` cocok |
470Selain [bidang umum](#common-fields), command hooks menerima bidang-bidang ini:470Selain [bidang umum](#common-fields), command hooks menerima bidang-bidang ini:
471 471
472| Bidang | Diperlukan | Deskripsi |472| Bidang | Diperlukan | Deskripsi |
473| :------------ | :--------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |473| :- | :- | :- |
474| `command` | ya | Perintah shell untuk dijalankan. Dengan `args`, executable untuk spawn secara langsung. Lihat [Exec form dan shell form](#exec-form-and-shell-form) |474| `command` | ya | Perintah shell untuk dijalankan. Dengan `args`, executable untuk spawn secara langsung. Lihat [Exec form dan shell form](#exec-form-and-shell-form) |
475| `args` | tidak | Daftar argumen. Ketika ada, `command` diselesaikan sebagai executable dan di-spawn secara langsung dengan `args` sebagai vektor argumen, tanpa shell yang terlibat. Lihat [Exec form dan shell form](#exec-form-and-shell-form) |475| `args` | tidak | Daftar argumen. Ketika ada, `command` diselesaikan sebagai executable dan di-spawn secara langsung dengan `args` sebagai vektor argumen, tanpa shell yang terlibat. Lihat [Exec form dan shell form](#exec-form-and-shell-form) |
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) |
529Selain [bidang umum](#common-fields), HTTP hooks menerima bidang-bidang ini:529Selain [bidang umum](#common-fields), HTTP hooks menerima bidang-bidang ini:
530 530
531| Bidang | Diperlukan | Deskripsi |531| Bidang | Diperlukan | Deskripsi |
532| :--------------- | :--------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |532| :- | :- | :- |
533| `url` | ya | URL untuk mengirimkan permintaan POST ke |533| `url` | ya | URL untuk mengirimkan permintaan POST ke |
534| `headers` | tidak | Header HTTP tambahan sebagai pasangan kunci-nilai. Nilai mendukung interpolasi variabel lingkungan menggunakan sintaks `$VAR_NAME` atau `${VAR_NAME}`. Hanya variabel yang tercantum dalam `allowedEnvVars` yang diselesaikan |534| `headers` | tidak | Header HTTP tambahan sebagai pasangan kunci-nilai. Nilai mendukung interpolasi variabel lingkungan menggunakan sintaks `$VAR_NAME` atau `${VAR_NAME}`. Hanya variabel yang tercantum dalam `allowedEnvVars` yang diselesaikan |
535| `allowedEnvVars` | tidak | Daftar nama variabel lingkungan yang dapat diinterpolasi ke nilai header. Referensi ke variabel yang tidak tercantum diganti dengan string kosong. Diperlukan untuk interpolasi variabel env apa pun untuk bekerja |535| `allowedEnvVars` | tidak | Daftar nama variabel lingkungan yang dapat diinterpolasi ke nilai header. Referensi ke variabel yang tidak tercantum diganti dengan string kosong. Diperlukan untuk interpolasi variabel env apa pun untuk bekerja |
570Selain [bidang umum](#common-fields), MCP tool hooks menerima bidang-bidang ini:570Selain [bidang umum](#common-fields), MCP tool hooks menerima bidang-bidang ini:
571 571
572| Bidang | Diperlukan | Deskripsi |572| Bidang | Diperlukan | Deskripsi |
573| :------- | :--------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |573| :- | :- | :- |
574| `server` | ya | Nama server MCP yang dikonfigurasi. Untuk [plugin-bundled server](/docs/id/mcp#plugin-provided-mcp-servers), ini adalah nama yang dibatasi `plugin:<plugin-name>:<server-name>`, seperti `plugin:my-plugin:db`, bukan kunci server bare. Server harus sudah terhubung; hook tidak pernah memicu alur OAuth atau koneksi |574| `server` | ya | Nama server MCP yang dikonfigurasi. Untuk [plugin-bundled server](/docs/id/mcp#plugin-provided-mcp-servers), ini adalah nama yang dibatasi `plugin:<plugin-name>:<server-name>`, seperti `plugin:my-plugin:db`, bukan kunci server bare. Server harus sudah terhubung; hook tidak pernah memicu alur OAuth atau koneksi |
575| `tool` | ya | Nama tool untuk dipanggil di server itu |575| `tool` | ya | Nama tool untuk dipanggil di server itu |
576| `input` | tidak | Argumen yang dilewatkan ke tool. Nilai string mendukung substitusi `${path}` dari [JSON input](#hook-input-and-output) hook, seperti `"${tool_input.file_path}"` |576| `input` | tidak | Argumen yang dilewatkan ke tool. Nilai string mendukung substitusi `${path}` dari [JSON input](#hook-input-and-output) hook, seperti `"${tool_input.file_path}"` |
634Selain [bidang umum](#common-fields), prompt dan agent hooks menerima bidang-bidang ini:634Selain [bidang umum](#common-fields), prompt dan agent hooks menerima bidang-bidang ini:
635 635
636| Bidang | Diperlukan | Deskripsi |636| Bidang | Diperlukan | Deskripsi |
637| :------- | :--------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |637| :- | :- | :- |
638| `prompt` | ya | Teks prompt untuk dikirim ke model. Gunakan `$ARGUMENTS` sebagai placeholder untuk JSON input hook. Escape dengan backslash untuk menyertakan teks literal: `\$1.00` dirender sebagai `$1.00` |638| `prompt` | ya | Teks prompt untuk dikirim ke model. Gunakan `$ARGUMENTS` sebagai placeholder untuk JSON input hook. Escape dengan backslash untuk menyertakan teks literal: `\$1.00` dirender sebagai `$1.00` |
639| `model` | tidak | Model untuk digunakan untuk evaluasi. Default ke model cepat |639| `model` | tidak | Model untuk digunakan untuk evaluasi. Default ke model cepat |
640 640
786Hook events menerima bidang-bidang ini sebagai JSON, selain bidang spesifik event yang didokumentasikan dalam setiap bagian [hook event](#hook-events). Untuk command hooks, JSON ini tiba melalui stdin. Untuk HTTP hooks, itu tiba sebagai badan permintaan POST.786Hook events menerima bidang-bidang ini sebagai JSON, selain bidang spesifik event yang didokumentasikan dalam setiap bagian [hook event](#hook-events). Untuk command hooks, JSON ini tiba melalui stdin. Untuk HTTP hooks, itu tiba sebagai badan permintaan POST.
787 787
788| Bidang | Deskripsi |788| Bidang | Deskripsi |
789| :---------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |789| :- | :- |
790| `session_id` | Pengenal sesi saat ini |790| `session_id` | Pengenal sesi saat ini |
791| `prompt_id` | UUID yang mengidentifikasi prompt pengguna yang sedang diproses. Cocok dengan atribut [`prompt.id` pada events OpenTelemetry](/docs/id/monitoring-usage#event-correlation-attributes), sehingga Anda dapat menghubungkan output hook dengan telemetri untuk satu prompt. Tidak ada sampai input pengguna pertama. Memerlukan Claude Code v2.1.196 atau lebih baru |791| `prompt_id` | UUID yang mengidentifikasi prompt pengguna yang sedang diproses. Cocok dengan atribut [`prompt.id` pada events OpenTelemetry](/docs/id/monitoring-usage#event-correlation-attributes), sehingga Anda dapat menghubungkan output hook dengan telemetri untuk satu prompt. Tidak ada sampai input pengguna pertama. Memerlukan Claude Code v2.1.196 atau lebih baru |
792| `transcript_path` | Path ke JSON percakapan. File transkrip ditulis secara asinkron dan mungkin tertinggal dari percakapan dalam memori, jadi mungkin belum menyertakan pesan terbaru giliran saat ini ketika hook dijalankan. Hooks yang memerlukan teks asisten akhir dari giliran saat ini harus menggunakan `last_assistant_message` pada [Stop](#stop) dan [SubagentStop](#subagentstop) alih-alih membaca transkrip |792| `transcript_path` | Path ke JSON percakapan. File transkrip ditulis secara asinkron dan mungkin tertinggal dari percakapan dalam memori, jadi mungkin belum menyertakan pesan terbaru giliran saat ini ketika hook dijalankan. Hooks yang memerlukan teks asisten akhir dari giliran saat ini harus menggunakan `last_assistant_message` pada [Stop](#stop) dan [SubagentStop](#subagentstop) alih-alih membaca transkrip |
799Saat berjalan dengan `--agent` atau di dalam subagent, dua bidang tambahan disertakan:799Saat berjalan dengan `--agent` atau di dalam subagent, dua bidang tambahan disertakan:
800 800
801| Bidang | Deskripsi |801| Bidang | Deskripsi |
802| :----------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |802| :- | :- |
803| `agent_id` | Pengenal unik untuk subagent. Hadir hanya ketika hook dijalankan di dalam pemanggilan subagent. Gunakan ini untuk membedakan pemanggilan hook subagent dari pemanggilan thread utama. |803| `agent_id` | Pengenal unik untuk subagent. Hadir hanya ketika hook dijalankan di dalam pemanggilan subagent. Gunakan ini untuk membedakan pemanggilan hook subagent dari pemanggilan thread utama. |
804| `agent_type` | Nama agent (misalnya, `"Explore"` atau `"security-reviewer"`). Hadir ketika sesi menggunakan `--agent` atau hook dijalankan di dalam subagent. Untuk subagents, tipe subagent mengambil alih nilai `--agent` sesi. Lihat [SubagentStart](#subagentstart) untuk nilai yang dilaporkan custom dan plugin subagents dan cara menulis matcher terhadap nama yang dibatasi plugin. |804| `agent_type` | Nama agent (misalnya, `"Explore"` atau `"security-reviewer"`). Hadir ketika sesi menggunakan `--agent` atau hook dijalankan di dalam subagent. Untuk subagents, tipe subagent mengambil alih nilai `--agent` sesi. Lihat [SubagentStart](#subagentstart) untuk nilai yang dilaporkan custom dan plugin subagents dan cara menulis matcher terhadap nama yang dibatasi plugin. |
805 805
926Exit code 2 adalah cara hook menandakan "berhenti, jangan lakukan ini." Efeknya tergantung pada event, karena beberapa event mewakili tindakan yang dapat diblokir (seperti pemanggilan tool yang belum terjadi) dan yang lain mewakili hal-hal yang sudah terjadi atau tidak dapat dicegah.926Exit code 2 adalah cara hook menandakan "berhenti, jangan lakukan ini." Efeknya tergantung pada event, karena beberapa event mewakili tindakan yang dapat diblokir (seperti pemanggilan tool yang belum terjadi) dan yang lain mewakili hal-hal yang sudah terjadi atau tidak dapat dicegah.
927 927
928| Hook event | Dapat diblokir? | Apa yang terjadi pada exit 2 |928| Hook event | Dapat diblokir? | Apa yang terjadi pada exit 2 |
929| :-------------------- | :-------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |929| :- | :- | :- |
930| `PreToolUse` | Ya | Memblokir pemanggilan tool |930| `PreToolUse` | Ya | Memblokir pemanggilan tool |
931| `PermissionRequest` | Tidak | Exit code 2 tidak dihormati untuk event ini dan aliran izin berlanjut tidak berubah. Tolak melalui objek [`decision`](#permissionrequest-decision-control) sebagai gantinya |931| `PermissionRequest` | Tidak | Exit code 2 tidak dihormati untuk event ini dan aliran izin berlanjut tidak berubah. Tolak melalui objek [`decision`](#permissionrequest-decision-control) sebagai gantinya |
932| `UserPromptSubmit` | Ya | Memblokir pemrosesan prompt dan menghapus prompt |932| `UserPromptSubmit` | Ya | Memblokir pemrosesan prompt dan menghapus prompt |
1003* **`hookSpecificOutput`** adalah objek bersarang untuk events yang memerlukan kontrol yang lebih kaya. Ini memerlukan bidang `hookEventName` yang diatur ke nama event.1003* **`hookSpecificOutput`** adalah objek bersarang untuk events yang memerlukan kontrol yang lebih kaya. Ini memerlukan bidang `hookEventName` yang diatur ke nama event.
1004 1004
1005| Bidang | Default | Deskripsi |1005| Bidang | Default | Deskripsi |
1006| :----------------- | :-------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1006| :- | :- | :- |
1007| `continue` | `true` | Jika `false`, Claude berhenti memproses sepenuhnya setelah hook dijalankan. Mengambil alih bidang keputusan spesifik event apa pun |1007| `continue` | `true` | Jika `false`, Claude berhenti memproses sepenuhnya setelah hook dijalankan. Mengambil alih bidang keputusan spesifik event apa pun |
1008| `stopReason` | tidak ada | Pesan ditampilkan ke pengguna saat `continue` adalah `false`. Itu tetap dalam percakapan, jadi Claude melihatnya jika percakapan berlanjut |1008| `stopReason` | tidak ada | Pesan ditampilkan ke pengguna saat `continue` adalah `false`. Itu tetap dalam percakapan, jadi Claude melihatnya jika percakapan berlanjut |
1009| `suppressOutput` | `false` | Tidak memiliki efek: Claude Code menerima bidang tetapi tidak bertindak. Stdout hook yang berhasil tidak pernah ditampilkan dalam transkrip dan dicatat dalam debug log |1009| `suppressOutput` | `false` | Tidak memiliki efek: Claude Code menerima bidang tetapi tidak bertindak. Stdout hook yang berhasil tidak pernah ditampilkan dalam transkrip dan dicatat dalam debug log |
1101Tidak setiap event mendukung pemblokiran atau kontrol perilaku melalui JSON. Events yang melakukannya masing-masing menggunakan set bidang yang berbeda untuk mengekspresikan keputusan itu. Gunakan tabel ini sebagai referensi cepat sebelum menulis hook:1101Tidak setiap event mendukung pemblokiran atau kontrol perilaku melalui JSON. Events yang melakukannya masing-masing menggunakan set bidang yang berbeda untuk mengekspresikan keputusan itu. Gunakan tabel ini sebagai referensi cepat sebelum menulis hook:
1102 1102
1103| Events | Pola keputusan | Bidang kunci |1103| Events | Pola keputusan | Bidang kunci |
1104| :---------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1104| :- | :- | :- |
1105| UserPromptSubmit, UserPromptExpansion, PostToolUse, PostToolUseFailure, PostToolBatch, Stop, SubagentStop, ConfigChange, PreCompact | Top-level `decision` | `decision: "block"`, `reason`. Stop dan SubagentStop juga menerima `hookSpecificOutput.additionalContext` untuk [umpan balik non-error yang melanjutkan percakapan](#stop-decision-control) |1105| UserPromptSubmit, UserPromptExpansion, PostToolUse, PostToolUseFailure, PostToolBatch, Stop, SubagentStop, ConfigChange, PreCompact | Top-level `decision` | `decision: "block"`, `reason`. Stop dan SubagentStop juga menerima `hookSpecificOutput.additionalContext` untuk [umpan balik non-error yang melanjutkan percakapan](#stop-decision-control) |
1106| TeammateIdle, TaskCompleted | Kode keluar atau `continue: false` | Kode keluar 2 memblokir tindakan dengan umpan balik stderr. JSON `{"continue": false, "stopReason": "..."}` juga menghentikan teammate sepenuhnya, mencocokkan perilaku hook `Stop`; [TaskCompleted mengabaikannya ketika tool `TaskUpdate` memicu event](#taskcompleted-decision-control) |1106| TeammateIdle, TaskCompleted | Kode keluar atau `continue: false` | Kode keluar 2 memblokir tindakan dengan umpan balik stderr. JSON `{"continue": false, "stopReason": "..."}` juga menghentikan teammate sepenuhnya, mencocokkan perilaku hook `Stop`; [TaskCompleted mengabaikannya ketika tool `TaskUpdate` memicu event](#taskcompleted-decision-control) |
1107| TaskCreated | Kode keluar atau top-level `decision` | Kode keluar 2 atau `decision: "block"` [membatalkan tugas](#taskcreated-decision-control) dan mengembalikan pesan ke Claude. `continue: false` diabaikan |1107| TaskCreated | Kode keluar atau top-level `decision` | Kode keluar 2 atau `decision: "block"` [membatalkan tugas](#taskcreated-decision-control) dan mengembalikan pesan ke Claude. `continue: false` diabaikan |
1192Nilai matcher sesuai dengan cara sesi dimulai:1192Nilai matcher sesuai dengan cara sesi dimulai:
1193 1193
1194| Matcher | Kapan dijalankan |1194| Matcher | Kapan dijalankan |
1195| :-------- | :---------------------------------------------------------------------------------------------------------------------------------------------- |1195| :- | :- |
1196| `startup` | Sesi baru |1196| `startup` | Sesi baru |
1197| `resume` | `--resume`, `--continue`, atau `/resume` |1197| `resume` | `--resume`, `--continue`, atau `/resume` |
1198| `clear` | `/clear` |1198| `clear` | `/clear` |
1216Selain [bidang input umum](#common-input-fields), SessionStart hooks menerima `source` dan secara opsional `model`, `agent_type`, dan `session_title`:1216Selain [bidang input umum](#common-input-fields), SessionStart hooks menerima `source` dan secara opsional `model`, `agent_type`, dan `session_title`:
1217 1217
1218| Bidang | Deskripsi |1218| Bidang | Deskripsi |
1219| :-------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1219| :- | :- |
1220| `source` | Bagaimana sesi dimulai: `"startup"` untuk sesi baru, `"resume"` untuk sesi yang dilanjutkan, `"clear"` setelah `/clear`, `"compact"` setelah compaction, atau `"fork"` untuk sesi baru yang di-fork dari sesi yang ada |1220| `source` | Bagaimana sesi dimulai: `"startup"` untuk sesi baru, `"resume"` untuk sesi yang dilanjutkan, `"clear"` setelah `/clear`, `"compact"` setelah compaction, atau `"fork"` untuk sesi baru yang di-fork dari sesi yang ada |
1221| `model` | Pengenal model aktif. Itu dapat dihilangkan, misalnya setelah `/clear` atau ketika sesi dipulihkan melalui conversation recovery, jadi periksa bidang sebelum membacanya |1221| `model` | Pengenal model aktif. Itu dapat dihilangkan, misalnya setelah `/clear` atau ketika sesi dipulihkan melalui conversation recovery, jadi periksa bidang sebelum membacanya |
1222| `agent_type` | Nama agent, hadir ketika Anda memulai Claude Code dengan `claude --agent <name>` |1222| `agent_type` | Nama agent, hadir ketika Anda memulai Claude Code dengan `claude --agent <name>` |
1225Ketika `source` adalah `"resume"` atau `"fork"` dan transkrip berisi setidaknya satu respons dari Claude, SessionStart hooks juga menerima empat bidang di bawah. Hook Anda dapat menggunakannya untuk melaporkan apa yang dilanjutkan percakapan basi biaya sebelum permintaan pertama, misalnya dalam [`systemMessage`](#json-output). Bidang-bidang ini memerlukan Claude Code v2.1.251 atau lebih baru.1225Ketika `source` adalah `"resume"` atau `"fork"` dan transkrip berisi setidaknya satu respons dari Claude, SessionStart hooks juga menerima empat bidang di bawah. Hook Anda dapat menggunakannya untuk melaporkan apa yang dilanjutkan percakapan basi biaya sebelum permintaan pertama, misalnya dalam [`systemMessage`](#json-output). Bidang-bidang ini memerlukan Claude Code v2.1.251 atau lebih baru.
1226 1226
1227| Bidang | Deskripsi |1227| Bidang | Deskripsi |
1228| :---------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1228| :- | :- |
1229| `seconds_since_last_response` | Detik wall-clock sejak respons terakhir dalam transkrip yang dilanjutkan |1229| `seconds_since_last_response` | Detik wall-clock sejak respons terakhir dalam transkrip yang dilanjutkan |
1230| `context_tokens` | Tokens yang diminta pertama dari sesi yang dilanjutkan mengirim ulang sebagai promptnya |1230| `context_tokens` | Tokens yang diminta pertama dari sesi yang dilanjutkan mengirim ulang sebagai promptnya |
1231| `prompt_cache_likely_expired` | `true` ketika respons terakhir lebih lama dari [lifetime prompt cache](/docs/id/prompt-caching#cache-lifetime) sesi atau compaction yang lebih baru menggantikan percakapan yang di-cache |1231| `prompt_cache_likely_expired` | `true` ketika respons terakhir lebih lama dari [lifetime prompt cache](/docs/id/prompt-caching#cache-lifetime) sesi atau compaction yang lebih baru menggantikan percakapan yang di-cache |
1255Claude Code menambahkan stdout yang [diperlakukan sebagai teks biasa](#exit-code-0) ke konteks Claude. Selain [bidang output JSON](#json-output) yang tersedia untuk semua hooks, Anda dapat mengembalikan bidang spesifik event ini:1255Claude Code menambahkan stdout yang [diperlakukan sebagai teks biasa](#exit-code-0) ke konteks Claude. Selain [bidang output JSON](#json-output) yang tersedia untuk semua hooks, Anda dapat mengembalikan bidang spesifik event ini:
1256 1256
1257| Bidang | Deskripsi |1257| Bidang | Deskripsi |
1258| :------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |1258| :- | :- |
1259| `additionalContext` | String ditambahkan ke konteks Claude pada awal percakapan, sebelum prompt pertama. Lihat [Add context for Claude](#add-context-for-claude) untuk cara teks disampaikan dan apa yang harus dimasukkan |1259| `additionalContext` | String ditambahkan ke konteks Claude pada awal percakapan, sebelum prompt pertama. Lihat [Add context for Claude](#add-context-for-claude) untuk cara teks disampaikan dan apa yang harus dimasukkan |
1260| `initialUserMessage` | String digunakan sebagai pesan pengguna pertama sesi. Berlaku dalam [mode non-interaktif](/docs/id/headless) dengan flag `-p`, di mana itu menjadi giliran pertama bahkan jika tidak ada prompt yang disediakan. Jika prompt disediakan, itu mengikuti sebagai giliran berikutnya. Tidak seperti `additionalContext`, yang menempel pada giliran yang ada, ini membuat giliran |1260| `initialUserMessage` | String digunakan sebagai pesan pengguna pertama sesi. Berlaku dalam [mode non-interaktif](/docs/id/headless) dengan flag `-p`, di mana itu menjadi giliran pertama bahkan jika tidak ada prompt yang disediakan. Jika prompt disediakan, itu mengikuti sebagai giliran berikutnya. Tidak seperti `additionalContext`, yang menempel pada giliran yang ada, ini membuat giliran |
1261| `sessionTitle` | Menetapkan judul sesi, dengan efek yang sama seperti `/rename`. Gunakan untuk memberi nama sesi secara otomatis dari folder peluncuran, cabang git, atau nama worktree. Berlaku ketika `source` adalah `"startup"`, `"resume"`, atau `"fork"`; diabaikan pada `"clear"` dan `"compact"` |1261| `sessionTitle` | Menetapkan judul sesi, dengan efek yang sama seperti `/rename`. Gunakan untuk memberi nama sesi secara otomatis dari folder peluncuran, cabang git, atau nama worktree. Berlaku ketika `source` adalah `"startup"`, `"resume"`, atau `"fork"`; diabaikan pada `"clear"` dan `"compact"` |
1339Nilai matcher sesuai dengan flag CLI yang memicu hook:1339Nilai matcher sesuai dengan flag CLI yang memicu hook:
1340 1340
1341| Matcher | Kapan dijalankan |1341| Matcher | Kapan dijalankan |
1342| :------------ | :------------------------------------------- |1342| :- | :- |
1343| `init` | `claude --init-only` atau `claude -p --init` |1343| `init` | `claude --init-only` atau `claude -p --init` |
1344| `maintenance` | `claude -p --maintenance` |1344| `maintenance` | `claude -p --maintenance` |
1345 1345
1392Selain [bidang input umum](#common-input-fields), InstructionsLoaded hooks menerima bidang-bidang ini:1392Selain [bidang input umum](#common-input-fields), InstructionsLoaded hooks menerima bidang-bidang ini:
1393 1393
1394| Bidang | Deskripsi |1394| Bidang | Deskripsi |
1395| :------------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1395| :- | :- |
1396| `file_path` | Path absolut ke file instruksi yang dimuat |1396| `file_path` | Path absolut ke file instruksi yang dimuat |
1397| `memory_type` | Cakupan file: `"User"`, `"Project"`, `"Local"`, atau `"Managed"` |1397| `memory_type` | Cakupan file: `"User"`, `"Project"`, `"Local"`, atau `"Managed"` |
1398| `load_reason` | Mengapa file dimuat: `"session_start"`, `"nested_traversal"`, `"path_glob_match"`, `"include"`, atau `"compact"`. Nilai `"compact"` dijalankan ketika file instruksi dimuat ulang setelah event compaction |1398| `load_reason` | Mengapa file dimuat: `"session_start"`, `"nested_traversal"`, `"path_glob_match"`, `"include"`, atau `"compact"`. Nilai `"compact"` dijalankan ketika file instruksi dimuat ulang setelah event compaction |
1463Untuk memblokir prompt, kembalikan objek JSON dengan `decision` diatur ke `"block"`:1463Untuk memblokir prompt, kembalikan objek JSON dengan `decision` diatur ke `"block"`:
1464 1464
1465| Bidang | Deskripsi |1465| Bidang | Deskripsi |
1466| :----------------------- | :--------------------------------------------------------------------------------------------------------------------------- |1466| :- | :- |
1467| `decision` | `"block"` mencegah prompt diproses dan menghapusnya dari konteks. Hilangkan untuk mengizinkan prompt dilanjutkan |1467| `decision` | `"block"` mencegah prompt diproses dan menghapusnya dari konteks. Hilangkan untuk mengizinkan prompt dilanjutkan |
1468| `reason` | Ditampilkan ke pengguna saat `decision` adalah `"block"`. Tidak ditambahkan ke konteks |1468| `reason` | Ditampilkan ke pengguna saat `decision` adalah `"block"`. Tidak ditambahkan ke konteks |
1469| `additionalContext` | String ditambahkan ke konteks Claude bersama prompt yang dikirimkan. Lihat [Add context for Claude](#add-context-for-claude) |1469| `additionalContext` | String ditambahkan ke konteks Claude bersama prompt yang dikirimkan. Lihat [Add context for Claude](#add-context-for-claude) |
1522Hooks `UserPromptExpansion` dapat memblokir ekspansi atau menambahkan konteks. Semua [bidang output JSON](#json-output) tersedia.1522Hooks `UserPromptExpansion` dapat memblokir ekspansi atau menambahkan konteks. Semua [bidang output JSON](#json-output) tersedia.
1523 1523
1524| Bidang | Deskripsi |1524| Bidang | Deskripsi |
1525| :------------------ | :--------------------------------------------------------------------------------------------------------------------------- |1525| :- | :- |
1526| `decision` | `"block"` mencegah slash command berkembang. Hilangkan untuk mengizinkannya dilanjutkan |1526| `decision` | `"block"` mencegah slash command berkembang. Hilangkan untuk mengizinkannya dilanjutkan |
1527| `reason` | Ditampilkan ke pengguna saat `decision` adalah `"block"` |1527| `reason` | Ditampilkan ke pengguna saat `decision` adalah `"block"` |
1528| `additionalContext` | String ditambahkan ke konteks Claude bersama prompt yang berkembang. Lihat [Add context for Claude](#add-context-for-claude) |1528| `additionalContext` | String ditambahkan ke konteks Claude bersama prompt yang berkembang. Lihat [Add context for Claude](#add-context-for-claude) |
1567Selain [bidang input umum](#common-input-fields), MessageDisplay hooks menerima pengenal untuk giliran dan pesan, posisi panggilan ini dalam pesan, dan teks baru dalam `delta`. Batas batch tergantung pada bagaimana teks mengalir, jadi gunakan `index` dan `final` untuk melacak kemajuan melalui pesan daripada mengharapkan baris dikelompokkan dengan cara tertentu.1567Selain [bidang input umum](#common-input-fields), MessageDisplay hooks menerima pengenal untuk giliran dan pesan, posisi panggilan ini dalam pesan, dan teks baru dalam `delta`. Batas batch tergantung pada bagaimana teks mengalir, jadi gunakan `index` dan `final` untuk melacak kemajuan melalui pesan daripada mengharapkan baris dikelompokkan dengan cara tertentu.
1568 1568
1569| Bidang | Deskripsi |1569| Bidang | Deskripsi |
1570| :----------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1570| :- | :- |
1571| `turn_id` | UUID dari giliran saat ini |1571| `turn_id` | UUID dari giliran saat ini |
1572| `message_id` | UUID dari pesan asisten yang ditampilkan. Stabil di setiap batch dari pesan yang sama. Ini bukan API `msg_…` id, jadi tidak dapat dikorelasikan dengan id pesan transkrip |1572| `message_id` | UUID dari pesan asisten yang ditampilkan. Stabil di setiap batch dari pesan yang sama. Ini bukan API `msg_…` id, jadi tidak dapat dikorelasikan dengan id pesan transkrip |
1573| `index` | Indeks berbasis nol dari batch ini dalam pesan |1573| `index` | Indeks berbasis nol dari batch ini dalam pesan |
1595Selain [bidang output JSON](#json-output) yang tersedia untuk semua hooks, MessageDisplay hooks dapat mengembalikan `displayContent` untuk mengganti delta di layar:1595Selain [bidang output JSON](#json-output) yang tersedia untuk semua hooks, MessageDisplay hooks dapat mengembalikan `displayContent` untuk mengganti delta di layar:
1596 1596
1597| Bidang | Deskripsi |1597| Bidang | Deskripsi |
1598| :--------------- | :------------------------------------------------------------------------- |1598| :- | :- |
1599| `displayContent` | Teks ditampilkan sebagai pengganti delta. Hilangkan untuk menampilkan asli |1599| `displayContent` | Teks ditampilkan sebagai pengganti delta. Hilangkan untuk menampilkan asli |
1600 1600
1601MessageDisplay hooks tidak memiliki kontrol keputusan. Mereka tidak dapat memblokir pesan atau mengubah apa yang disimpan dalam transkrip atau dikirim ke Claude. Claude Code bertindak atas `displayContent` dari output JSON mereka dan membuang `systemMessage` dan `continue`.1601MessageDisplay hooks tidak memiliki kontrol keputusan. Mereka tidak dapat memblokir pesan atau mengubah apa yang disimpan dalam transkrip atau dikirim ke Claude. Claude Code bertindak atas `displayContent` dari output JSON mereka dan membuang `systemMessage` dan `continue`.
1736Menjalankan perintah shell.1736Menjalankan perintah shell.
1737 1737
1738| Bidang | Tipe | Contoh | Deskripsi |1738| Bidang | Tipe | Contoh | Deskripsi |
1739| :------------------ | :------ | :----------------- | :---------------------------------------------------------------------------------------------------------------------------------------- |1739| :- | :- | :- | :- |
1740| `command` | string | `"npm test"` | Perintah shell untuk dijalankan |1740| `command` | string | `"npm test"` | Perintah shell untuk dijalankan |
1741| `description` | string | `"Run test suite"` | Deskripsi opsional tentang apa yang dilakukan perintah |1741| `description` | string | `"Run test suite"` | Deskripsi opsional tentang apa yang dilakukan perintah |
1742| `timeout` | number | `120000` | Timeout opsional dalam milidetik. Nilai di atas [maksimum](/docs/id/tools-reference#bash-tool-behavior) dikurangi ke maksimum daripada ditolak |1742| `timeout` | number | `120000` | Timeout opsional dalam milidetik. Nilai di atas [maksimum](/docs/id/tools-reference#bash-tool-behavior) dikurangi ke maksimum daripada ditolak |
1753`changedFiles` dan `files` mencantumkan apa yang diubah perintah; bidang yang tersisa mengatakan seberapa lengkap dan seberapa andal daftar itu.1753`changedFiles` dan `files` mencantumkan apa yang diubah perintah; bidang yang tersisa mengatakan seberapa lengkap dan seberapa andal daftar itu.
1754 1754
1755| Bidang | Tipe | Contoh | Deskripsi |1755| Bidang | Tipe | Contoh | Deskripsi |
1756| :------------- | :------ | :------------------------------------------------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1756| :- | :- | :- | :- |
1757| `changedFiles` | array | `["/path/to/src/app.ts"]` | Path absolut dari file yang diubah perintah, paling banyak 200. Hadir setiap kali `files` menyimpan diff atau `moreFiles` di atas nol |1757| `changedFiles` | array | `["/path/to/src/app.ts"]` | Path absolut dari file yang diubah perintah, paling banyak 200. Hadir setiap kali `files` menyimpan diff atau `moreFiles` di atas nol |
1758| `files` | array | `[{"filePath": "/path/to/src/app.ts", "hunks": [...]}]` | Diffs dari hingga 5 file yang berubah, untuk tampilan. `created` atau `deleted` adalah `true` untuk file yang ditambahkan atau dihapus perintah |1758| `files` | array | `[{"filePath": "/path/to/src/app.ts", "hunks": [...]}]` | Diffs dari hingga 5 file yang berubah, untuk tampilan. `created` atau `deleted` adalah `true` untuk file yang ditambahkan atau dihapus perintah |
1759| `moreFiles` | number | `2` | Jumlah file yang berubah tanpa diff dalam `files` |1759| `moreFiles` | number | `2` | Jumlah file yang berubah tanpa diff dalam `files` |
1772Bidang-bidang cocok dengan tool Bash, dengan string perintah dalam `command`:1772Bidang-bidang cocok dengan tool Bash, dengan string perintah dalam `command`:
1773 1773
1774| Bidang | Tipe | Contoh | Deskripsi |1774| Bidang | Tipe | Contoh | Deskripsi |
1775| :------------------ | :------ | :------------------------- | :----------------------------------------------------- |1775| :- | :- | :- | :- |
1776| `command` | string | `"Get-ChildItem -Recurse"` | Perintah PowerShell untuk dijalankan |1776| `command` | string | `"Get-ChildItem -Recurse"` | Perintah PowerShell untuk dijalankan |
1777| `description` | string | `"List files recursively"` | Deskripsi opsional tentang apa yang dilakukan perintah |1777| `description` | string | `"List files recursively"` | Deskripsi opsional tentang apa yang dilakukan perintah |
1778| `timeout` | number | `120000` | Timeout opsional dalam milidetik |1778| `timeout` | number | `120000` | Timeout opsional dalam milidetik |
1791Membuat atau menimpa file.1791Membuat atau menimpa file.
1792 1792
1793| Bidang | Tipe | Contoh | Deskripsi |1793| Bidang | Tipe | Contoh | Deskripsi |
1794| :---------- | :----- | :-------------------- | :--------------------------------- |1794| :- | :- | :- | :- |
1795| `file_path` | string | `"/path/to/file.txt"` | Path absolut ke file untuk ditulis |1795| `file_path` | string | `"/path/to/file.txt"` | Path absolut ke file untuk ditulis |
1796| `content` | string | `"file content"` | Konten untuk ditulis ke file |1796| `content` | string | `"file content"` | Konten untuk ditulis ke file |
1797 1797
1802Mengganti string dalam file yang ada.1802Mengganti string dalam file yang ada.
1803 1803
1804| Bidang | Tipe | Contoh | Deskripsi |1804| Bidang | Tipe | Contoh | Deskripsi |
1805| :------------ | :------ | :-------------------- | :-------------------------------- |1805| :- | :- | :- | :- |
1806| `file_path` | string | `"/path/to/file.txt"` | Path absolut ke file untuk diedit |1806| `file_path` | string | `"/path/to/file.txt"` | Path absolut ke file untuk diedit |
1807| `old_string` | string | `"original text"` | Teks untuk dicari dan diganti |1807| `old_string` | string | `"original text"` | Teks untuk dicari dan diganti |
1808| `new_string` | string | `"replacement text"` | Teks pengganti |1808| `new_string` | string | `"replacement text"` | Teks pengganti |
1815Membaca konten file.1815Membaca konten file.
1816 1816
1817| Bidang | Tipe | Contoh | Deskripsi |1817| Bidang | Tipe | Contoh | Deskripsi |
1818| :---------- | :----- | :-------------------- | :-------------------------------------------- |1818| :- | :- | :- | :- |
1819| `file_path` | string | `"/path/to/file.txt"` | Path absolut ke file untuk dibaca |1819| `file_path` | string | `"/path/to/file.txt"` | Path absolut ke file untuk dibaca |
1820| `offset` | number | `10` | Nomor baris opsional untuk mulai membaca dari |1820| `offset` | number | `10` | Nomor baris opsional untuk mulai membaca dari |
1821| `limit` | number | `50` | Jumlah baris opsional untuk dibaca |1821| `limit` | number | `50` | Jumlah baris opsional untuk dibaca |
1827Menemukan file yang cocok dengan pola glob.1827Menemukan file yang cocok dengan pola glob.
1828 1828
1829| Bidang | Tipe | Contoh | Deskripsi |1829| Bidang | Tipe | Contoh | Deskripsi |
1830| :-------- | :----- | :--------------- | :------------------------------------------------------------------- |1830| :- | :- | :- | :- |
1831| `pattern` | string | `"**/*.ts"` | Pola glob untuk mencocokkan file terhadap |1831| `pattern` | string | `"**/*.ts"` | Pola glob untuk mencocokkan file terhadap |
1832| `path` | string | `"/path/to/dir"` | Direktori opsional untuk dicari. Default ke direktori kerja saat ini |1832| `path` | string | `"/path/to/dir"` | Direktori opsional untuk dicari. Default ke direktori kerja saat ini |
1833 1833
1838Mencari konten file dengan ekspresi reguler.1838Mencari konten file dengan ekspresi reguler.
1839 1839
1840| Bidang | Tipe | Contoh | Deskripsi |1840| Bidang | Tipe | Contoh | Deskripsi |
1841| :------------ | :------ | :--------------- | :------------------------------------------------------------------------------------- |1841| :- | :- | :- | :- |
1842| `pattern` | string | `"TODO.*fix"` | Pola ekspresi reguler untuk dicari |1842| `pattern` | string | `"TODO.*fix"` | Pola ekspresi reguler untuk dicari |
1843| `path` | string | `"/path/to/dir"` | File atau direktori opsional untuk dicari |1843| `path` | string | `"/path/to/dir"` | File atau direktori opsional untuk dicari |
1844| `glob` | string | `"*.ts"` | Pola glob opsional untuk memfilter file |1844| `glob` | string | `"*.ts"` | Pola glob opsional untuk memfilter file |
1853Mengambil dan memproses konten web.1853Mengambil dan memproses konten web.
1854 1854
1855| Bidang | Tipe | Contoh | Deskripsi |1855| Bidang | Tipe | Contoh | Deskripsi |
1856| :------- | :----- | :---------------------------- | :----------------------------------------------- |1856| :- | :- | :- | :- |
1857| `url` | string | `"https://example.com/api"` | URL untuk mengambil konten dari |1857| `url` | string | `"https://example.com/api"` | URL untuk mengambil konten dari |
1858| `prompt` | string | `"Extract the API endpoints"` | Prompt untuk dijalankan pada konten yang diambil |1858| `prompt` | string | `"Extract the API endpoints"` | Prompt untuk dijalankan pada konten yang diambil |
1859 1859
1864Mencari web.1864Mencari web.
1865 1865
1866| Bidang | Tipe | Contoh | Deskripsi |1866| Bidang | Tipe | Contoh | Deskripsi |
1867| :---------------- | :----- | :----------------------------- | :--------------------------------------------- |1867| :- | :- | :- | :- |
1868| `query` | string | `"react hooks best practices"` | Query pencarian |1868| `query` | string | `"react hooks best practices"` | Query pencarian |
1869| `allowed_domains` | array | `["docs.example.com"]` | Opsional: hanya sertakan hasil dari domain ini |1869| `allowed_domains` | array | `["docs.example.com"]` | Opsional: hanya sertakan hasil dari domain ini |
1870| `blocked_domains` | array | `["spam.example.com"]` | Opsional: kecualikan hasil dari domain ini |1870| `blocked_domains` | array | `["spam.example.com"]` | Opsional: kecualikan hasil dari domain ini |
1876Spawn [subagent](/docs/id/sub-agents).1876Spawn [subagent](/docs/id/sub-agents).
1877 1877
1878| Bidang | Tipe | Contoh | Deskripsi |1878| Bidang | Tipe | Contoh | Deskripsi |
1879| :-------------- | :----- | :------------------------- | :----------------------------------------- |1879| :- | :- | :- | :- |
1880| `prompt` | string | `"Find all API endpoints"` | Tugas untuk agent lakukan |1880| `prompt` | string | `"Find all API endpoints"` | Tugas untuk agent lakukan |
1881| `description` | string | `"Find API endpoints"` | Deskripsi singkat tugas |1881| `description` | string | `"Find API endpoints"` | Deskripsi singkat tugas |
1882| `subagent_type` | string | `"Explore"` | Tipe agent khusus untuk digunakan |1882| `subagent_type` | string | `"Explore"` | Tipe agent khusus untuk digunakan |
1885Ketika panggilan Agent foreground selesai, hook [PostToolUse](#posttooluse) Anda menerima teks akhir subagent dan telemetri run dalam `tool_response`. Baca bidang-bidang ini untuk memeriksa run; untuk rollup token dan biaya di seluruh subagents, gunakan [token dan cost counters](/docs/id/monitoring-usage#token-counter) yang difilter ke `query_source` `"subagent"`, karena `totalTokens` dan `usage` mencakup permintaan akhir saja:1885Ketika panggilan Agent foreground selesai, hook [PostToolUse](#posttooluse) Anda menerima teks akhir subagent dan telemetri run dalam `tool_response`. Baca bidang-bidang ini untuk memeriksa run; untuk rollup token dan biaya di seluruh subagents, gunakan [token dan cost counters](/docs/id/monitoring-usage#token-counter) yang difilter ke `query_source` `"subagent"`, karena `totalTokens` dan `usage` mencakup permintaan akhir saja:
1886 1886
1887| Bidang | Tipe | Contoh | Deskripsi |1887| Bidang | Tipe | Contoh | Deskripsi |
1888| :------------------ | :----- | :---------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |1888| :- | :- | :- | :- |
1889| `status` | string | `"completed"` | `"completed"` untuk subagents foreground, `"async_launched"` untuk subagents background. Mulai dari v2.1.198, subagents berjalan di latar belakang secara default, jadi `run_in_background` yang dihilangkan juga menghasilkan `"async_launched"` |1889| `status` | string | `"completed"` | `"completed"` untuk subagents foreground, `"async_launched"` untuk subagents background. Mulai dari v2.1.198, subagents berjalan di latar belakang secara default, jadi `run_in_background` yang dihilangkan juga menghasilkan `"async_launched"` |
1890| `agentId` | string | `"a4d2c8f1e0b3a297"` | Pengenal untuk run subagent |1890| `agentId` | string | `"a4d2c8f1e0b3a297"` | Pengenal untuk run subagent |
1891| `content` | array | `[{"type": "text", "text": "Found 12 endpoints..."}]` | Blok teks akhir subagent, atau, untuk subagent yang laporannya melewati `SubagentHandback`, catatan singkat tentang hand-back itu di tempatnya |1891| `content` | array | `[{"type": "text", "text": "Found 12 endpoints..."}]` | Blok teks akhir subagent, atau, untuk subagent yang laporannya melewati `SubagentHandback`, catatan singkat tentang hand-back itu di tempatnya |
1911Mengajukan pertanyaan multiple-choice satu hingga empat kepada pengguna.1911Mengajukan pertanyaan multiple-choice satu hingga empat kepada pengguna.
1912 1912
1913| Bidang | Tipe | Contoh | Deskripsi |1913| Bidang | Tipe | Contoh | Deskripsi |
1914| :---------- | :----- | :----------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1914| :- | :- | :- | :- |
1915| `questions` | array | `[{"question": "Which framework?", "header": "Framework", "options": [{"label": "React"}], "multiSelect": false}]` | Pertanyaan untuk disajikan, masing-masing dengan string `question`, `header` pendek, array `options`, dan flag `multiSelect` opsional |1915| `questions` | array | `[{"question": "Which framework?", "header": "Framework", "options": [{"label": "React"}], "multiSelect": false}]` | Pertanyaan untuk disajikan, masing-masing dengan string `question`, `header` pendek, array `options`, dan flag `multiSelect` opsional |
1916| `answers` | object | `{"Which framework?": "React"}` | Opsional. Memetakan teks pertanyaan ke label opsi yang dipilih. Jawaban multi-select menggabungkan label dengan koma. Claude tidak menetapkan bidang ini; sediakan melalui `updatedInput` untuk menjawab secara programatis |1916| `answers` | object | `{"Which framework?": "React"}` | Opsional. Memetakan teks pertanyaan ke label opsi yang dipilih. Jawaban multi-select menggabungkan label dengan koma. Claude tidak menetapkan bidang ini; sediakan melalui `updatedInput` untuk menjawab secara programatis |
1917 1917
1922Menyajikan rencana dan meminta pengguna untuk menyetujuinya sebelum Claude meninggalkan [plan mode](/docs/id/permission-modes#analyze-before-you-edit-with-plan-mode). Claude menulis rencana ke file di disk sebelum memanggil tool, jadi `tool_input` literal dari model biasanya kosong. Claude Code menyuntikkan konten rencana dan path file sebelum meneruskan input ke hooks.1922Menyajikan rencana dan meminta pengguna untuk menyetujuinya sebelum Claude meninggalkan [plan mode](/docs/id/permission-modes#analyze-before-you-edit-with-plan-mode). Claude menulis rencana ke file di disk sebelum memanggil tool, jadi `tool_input` literal dari model biasanya kosong. Claude Code menyuntikkan konten rencana dan path file sebelum meneruskan input ke hooks.
1923 1923
1924| Bidang | Tipe | Contoh | Deskripsi |1924| Bidang | Tipe | Contoh | Deskripsi |
1925| :--------------- | :----- | :------------------------------------------ | :----------------------------------------------------------------------------------------------------------------------------------------------------------------- |1925| :- | :- | :- | :- |
1926| `plan` | string | `"## Refactor auth\n1. Extract..."` | Konten rencana dalam Markdown. Disuntikkan dari file rencana di disk |1926| `plan` | string | `"## Refactor auth\n1. Extract..."` | Konten rencana dalam Markdown. Disuntikkan dari file rencana di disk |
1927| `planFilePath` | string | `"/Users/.../plans/refactor-auth.md"` | Path ke file rencana. Disuntikkan |1927| `planFilePath` | string | `"/Users/.../plans/refactor-auth.md"` | Path ke file rencana. Disuntikkan |
1928| `allowedPrompts` | array | `[{"tool": "Bash", "prompt": "run tests"}]` | Usang. Claude Code menerima bidang tetapi mengabaikannya. Sebelum v2.1.205, itu membawa izin berbasis prompt yang diminta Claude untuk mengimplementasikan rencana |1928| `allowedPrompts` | array | `[{"tool": "Bash", "prompt": "run tests"}]` | Usang. Claude Code menerima bidang tetapi mengabaikannya. Sebelum v2.1.205, itu membawa izin berbasis prompt yang diminta Claude untuk mengimplementasikan rencana |
1936Hooks `PreToolUse` dapat mengontrol apakah pemanggilan tool dilanjutkan. Tidak seperti hooks lain yang menggunakan bidang `decision` tingkat atas, PreToolUse mengembalikan keputusannya di dalam objek `hookSpecificOutput`. Ini memberikannya kontrol yang lebih kaya: empat hasil (izinkan, tolak, tanya, atau tunda) ditambah kemampuan untuk memodifikasi input tool sebelum eksekusi.1936Hooks `PreToolUse` dapat mengontrol apakah pemanggilan tool dilanjutkan. Tidak seperti hooks lain yang menggunakan bidang `decision` tingkat atas, PreToolUse mengembalikan keputusannya di dalam objek `hookSpecificOutput`. Ini memberikannya kontrol yang lebih kaya: empat hasil (izinkan, tolak, tanya, atau tunda) ditambah kemampuan untuk memodifikasi input tool sebelum eksekusi.
1937 1937
1938| Bidang | Deskripsi |1938| Bidang | Deskripsi |
1939| :------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1939| :- | :- |
1940| `permissionDecision` | `"allow"` melewati prompt izin, kecuali untuk [actions yang tidak ada mode auto-approve](/docs/id/permission-modes#actions-no-mode-auto-approves) dan untuk `AskUserQuestion` dan `ExitPlanMode`, yang memerlukan [`updatedInput` dipasangkan dengannya](#allow-with-updatedinput). `"deny"` mencegah pemanggilan tool. `"ask"` meminta pengguna untuk mengkonfirmasi. `"defer"` keluar dengan baik sehingga tool dapat dilanjutkan nanti. [Deny and ask rules](/docs/id/permissions#manage-permissions) masih dievaluasi terlepas dari apa yang dikembalikan hook |1940| `permissionDecision` | `"allow"` melewati prompt izin, kecuali untuk [actions yang tidak ada mode auto-approve](/docs/id/permission-modes#actions-no-mode-auto-approves) dan untuk `AskUserQuestion` dan `ExitPlanMode`, yang memerlukan [`updatedInput` dipasangkan dengannya](#allow-with-updatedinput). `"deny"` mencegah pemanggilan tool. `"ask"` meminta pengguna untuk mengkonfirmasi. `"defer"` keluar dengan baik sehingga tool dapat dilanjutkan nanti. [Deny and ask rules](/docs/id/permissions#manage-permissions) masih dievaluasi terlepas dari apa yang dikembalikan hook |
1941| `permissionDecisionReason` | Untuk `"allow"` dan `"ask"`, ditampilkan ke pengguna tetapi bukan Claude. Untuk `"deny"`, ditampilkan ke Claude. Untuk `"defer"`, diabaikan |1941| `permissionDecisionReason` | Untuk `"allow"` dan `"ask"`, ditampilkan ke pengguna tetapi bukan Claude. Untuk `"deny"`, ditampilkan ke Claude. Untuk `"defer"`, diabaikan |
1942| `updatedInput` | Memodifikasi parameter input tool sebelum eksekusi. Menggantikan seluruh objek input, jadi sertakan bidang yang tidak berubah bersama yang dimodifikasi. Claude Code mengevaluasi aturan izin dan kelayakan [auto-background](/docs/id/tools-reference#background-commands) perintah Bash terhadap input yang dikembalikan hook Anda, bukan input yang dikirim Claude. Gabungkan dengan `"allow"` untuk persetujuan otomatis, atau `"ask"` untuk menampilkan input yang dimodifikasi ke pengguna. Untuk `"defer"`, diabaikan |1942| `updatedInput` | Memodifikasi parameter input tool sebelum eksekusi. Menggantikan seluruh objek input, jadi sertakan bidang yang tidak berubah bersama yang dimodifikasi. Claude Code mengevaluasi aturan izin dan kelayakan [auto-background](/docs/id/tools-reference#background-commands) perintah Bash terhadap input yang dikembalikan hook Anda, bukan input yang dikirim Claude. Gabungkan dengan `"allow"` untuk persetujuan otomatis, atau `"ask"` untuk menampilkan input yang dimodifikasi ke pengguna. Untuk `"defer"`, diabaikan |
2069Hooks `PermissionRequest` dapat mengizinkan atau menolak permintaan izin. Selain [bidang output JSON](#json-output) yang tersedia untuk semua hooks, skrip hook Anda dapat mengembalikan objek `decision` dengan bidang spesifik event ini:2069Hooks `PermissionRequest` dapat mengizinkan atau menolak permintaan izin. Selain [bidang output JSON](#json-output) yang tersedia untuk semua hooks, skrip hook Anda dapat mengembalikan objek `decision` dengan bidang spesifik event ini:
2070 2070
2071| Bidang | Deskripsi |2071| Bidang | Deskripsi |
2072| :------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |2072| :- | :- |
2073| `behavior` | `"allow"` memberikan izin, `"deny"` menolaknya. [Deny and ask rules](/docs/id/permissions#manage-permissions) masih dievaluasi, jadi hook yang mengembalikan `"allow"` tidak menimpa aturan deny yang cocok |2073| `behavior` | `"allow"` memberikan izin, `"deny"` menolaknya. [Deny and ask rules](/docs/id/permissions#manage-permissions) masih dievaluasi, jadi hook yang mengembalikan `"allow"` tidak menimpa aturan deny yang cocok |
2074| `updatedInput` | Untuk `"allow"` saja: memodifikasi parameter input tool sebelum eksekusi. Menggantikan seluruh objek input, jadi sertakan bidang yang tidak berubah bersama yang dimodifikasi. Input yang dimodifikasi dievaluasi ulang terhadap aturan deny dan ask |2074| `updatedInput` | Untuk `"allow"` saja: memodifikasi parameter input tool sebelum eksekusi. Menggantikan seluruh objek input, jadi sertakan bidang yang tidak berubah bersama yang dimodifikasi. Input yang dimodifikasi dievaluasi ulang terhadap aturan deny dan ask |
2075| `updatedPermissions` | Untuk `"allow"` saja: array dari [permission update entries](#permission-update-entries) untuk diterapkan, seperti menambahkan aturan allow atau mengubah mode izin sesi |2075| `updatedPermissions` | Untuk `"allow"` saja: array dari [permission update entries](#permission-update-entries) untuk diterapkan, seperti menambahkan aturan allow atau mengubah mode izin sesi |
2099Bidang output `updatedPermissions` dan bidang input [`permission_suggestions`](#permissionrequest-input) keduanya menggunakan array objek entry yang sama. Setiap entry memiliki `type` yang menentukan bidang lainnya, dan `destination` yang mengontrol di mana perubahan ditulis.2099Bidang output `updatedPermissions` dan bidang input [`permission_suggestions`](#permissionrequest-input) keduanya menggunakan array objek entry yang sama. Setiap entry memiliki `type` yang menentukan bidang lainnya, dan `destination` yang mengontrol di mana perubahan ditulis.
2100 2100
2101| `type` | Bidang | Efek |2101| `type` | Bidang | Efek |
2102| :------------------ | :--------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |2102| :- | :- | :- |
2103| `addRules` | `rules`, `behavior`, `destination` | Menambahkan aturan izin. `rules` adalah array dari objek `{toolName, ruleContent?}`. Hilangkan `ruleContent` untuk mencocokkan seluruh tool. `behavior` adalah `"allow"`, `"deny"`, atau `"ask"` |2103| `addRules` | `rules`, `behavior`, `destination` | Menambahkan aturan izin. `rules` adalah array dari objek `{toolName, ruleContent?}`. Hilangkan `ruleContent` untuk mencocokkan seluruh tool. `behavior` adalah `"allow"`, `"deny"`, atau `"ask"` |
2104| `replaceRules` | `rules`, `behavior`, `destination` | Mengganti semua aturan dari `behavior` yang diberikan di `destination` dengan `rules` yang disediakan |2104| `replaceRules` | `rules`, `behavior`, `destination` | Mengganti semua aturan dari `behavior` yang diberikan di `destination` dengan `rules` yang disediakan |
2105| `removeRules` | `rules`, `behavior`, `destination` | Menghapus aturan yang cocok dari `behavior` yang diberikan |2105| `removeRules` | `rules`, `behavior`, `destination` | Menghapus aturan yang cocok dari `behavior` yang diberikan |
2116Bidang `destination` pada setiap entry menentukan apakah perubahan tetap dalam memori atau persisten ke file pengaturan.2116Bidang `destination` pada setiap entry menentukan apakah perubahan tetap dalam memori atau persisten ke file pengaturan.
2117 2117
2118| `destination` | Menulis ke |2118| `destination` | Menulis ke |
2119| :---------------- | :----------------------------------------------- |2119| :- | :- |
2120| `session` | hanya dalam memori, dibuang ketika sesi berakhir |2120| `session` | hanya dalam memori, dibuang ketika sesi berakhir |
2121| `localSettings` | `.claude/settings.local.json` |2121| `localSettings` | `.claude/settings.local.json` |
2122| `projectSettings` | `.claude/settings.json` |2122| `projectSettings` | `.claude/settings.json` |
2165```2165```
2166 2166
2167| Bidang | Deskripsi |2167| Bidang | Deskripsi |
2168| :------------ | :------------------------------------------------------------------------------------------------------------------------ |2168| :- | :- |
2169| `duration_ms` | Opsional. Waktu eksekusi tool dalam milidetik. Mengecualikan waktu yang dihabiskan dalam prompt izin dan PreToolUse hooks |2169| `duration_ms` | Opsional. Waktu eksekusi tool dalam milidetik. Mengecualikan waktu yang dihabiskan dalam prompt izin dan PreToolUse hooks |
2170 2170
2171<h4 id="posttooluse-decision-control">2171<h4 id="posttooluse-decision-control">
2175Hooks `PostToolUse` dapat memberikan umpan balik ke Claude setelah eksekusi tool. Selain [bidang output JSON](#json-output) yang tersedia untuk semua hooks, skrip hook Anda dapat mengembalikan bidang spesifik event ini:2175Hooks `PostToolUse` dapat memberikan umpan balik ke Claude setelah eksekusi tool. Selain [bidang output JSON](#json-output) yang tersedia untuk semua hooks, skrip hook Anda dapat mengembalikan bidang spesifik event ini:
2176 2176
2177| Bidang | Deskripsi |2177| Bidang | Deskripsi |
2178| :--------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |2178| :- | :- |
2179| `decision` | `"block"` menambahkan `reason` di sebelah hasil tool. Claude masih melihat output asli; untuk menggantinya, gunakan `updatedToolOutput` |2179| `decision` | `"block"` menambahkan `reason` di sebelah hasil tool. Claude masih melihat output asli; untuk menggantinya, gunakan `updatedToolOutput` |
2180| `reason` | Penjelasan ditampilkan ke Claude saat `decision` adalah `"block"` |2180| `reason` | Penjelasan ditampilkan ke Claude saat `decision` adalah `"block"` |
2181| `additionalContext` | String ditambahkan ke konteks Claude bersama hasil tool. Lihat [Add context for Claude](#add-context-for-claude) |2181| `additionalContext` | String ditambahkan ke konteks Claude bersama hasil tool. Lihat [Add context for Claude](#add-context-for-claude) |
2277```2277```
2278 2278
2279| Bidang | Deskripsi |2279| Bidang | Deskripsi |
2280| :------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |2280| :- | :- |
2281| `error` | String menjelaskan apa yang salah. Format tergantung pada tool yang gagal |2281| `error` | String menjelaskan apa yang salah. Format tergantung pada tool yang gagal |
2282| `is_interrupt` | Boolean opsional. True ketika kegagalan mencapai Claude Code sebagai abort daripada sebagai kesalahan yang dilaporkan tool. Membatalkan tool yang berjalan tidak menjalankan hook ini; hasil tool membawa pesan interupsi sebagai gantinya |2282| `is_interrupt` | Boolean opsional. True ketika kegagalan mencapai Claude Code sebagai abort daripada sebagai kesalahan yang dilaporkan tool. Membatalkan tool yang berjalan tidak menjalankan hook ini; hasil tool membawa pesan interupsi sebagai gantinya |
2283| `duration_ms` | Opsional. Waktu eksekusi tool dalam milidetik. Mengecualikan waktu yang dihabiskan dalam prompt izin dan PreToolUse hooks |2283| `duration_ms` | Opsional. Waktu eksekusi tool dalam milidetik. Mengecualikan waktu yang dihabiskan dalam prompt izin dan PreToolUse hooks |
2295Hooks `PostToolUseFailure` dapat memberikan konteks ke Claude setelah kegagalan tool. Selain [bidang output JSON](#json-output) yang tersedia untuk semua hooks, skrip hook Anda dapat mengembalikan bidang spesifik event ini:2295Hooks `PostToolUseFailure` dapat memberikan konteks ke Claude setelah kegagalan tool. Selain [bidang output JSON](#json-output) yang tersedia untuk semua hooks, skrip hook Anda dapat mengembalikan bidang spesifik event ini:
2296 2296
2297| Bidang | Deskripsi |2297| Bidang | Deskripsi |
2298| :------------------ | :-------------------------------------------------------------------------------------------------------------- |2298| :- | :- |
2299| `additionalContext` | String ditambahkan ke konteks Claude bersama kesalahan. Lihat [Add context for Claude](#add-context-for-claude) |2299| `additionalContext` | String ditambahkan ke konteks Claude bersama kesalahan. Lihat [Add context for Claude](#add-context-for-claude) |
2300 2300
2301```json theme={null}2301```json theme={null}
2356Hooks `PostToolBatch` dapat menyuntikkan konteks untuk Claude. Selain [bidang output JSON](#json-output) yang tersedia untuk semua hooks, skrip hook Anda dapat mengembalikan bidang spesifik event ini:2356Hooks `PostToolBatch` dapat menyuntikkan konteks untuk Claude. Selain [bidang output JSON](#json-output) yang tersedia untuk semua hooks, skrip hook Anda dapat mengembalikan bidang spesifik event ini:
2357 2357
2358| Bidang | Deskripsi |2358| Bidang | Deskripsi |
2359| :------------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |2359| :- | :- |
2360| `additionalContext` | String konteks yang disuntikkan sekali sebelum panggilan model berikutnya. Lihat [Add context for Claude](#add-context-for-claude) untuk detail pengiriman, apa yang harus dimasukkan, dan cara sesi yang dilanjutkan menangani nilai masa lalu |2360| `additionalContext` | String konteks yang disuntikkan sekali sebelum panggilan model berikutnya. Lihat [Add context for Claude](#add-context-for-claude) untuk detail pengiriman, apa yang harus dimasukkan, dan cara sesi yang dilanjutkan menangani nilai masa lalu |
2361 2361
2362```json theme={null}2362```json theme={null}
2402```2402```
2403 2403
2404| Bidang | Deskripsi |2404| Bidang | Deskripsi |
2405| :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |2405| :- | :- |
2406| `reason` | Alasan penolakan. Untuk putusan pengklasifikasi, dalam sebagian besar sesi itu menamai aturan yang cocok dalam tanda kurung siku, seperti `[Data Exfiltration]`; lihat [Review denials](/docs/id/auto-mode-config#review-denials) untuk bentuk lainnya. Untuk [penolakan tanpa putusan](#permissiondenied-decision-control), itu dimulai dengan `Auto mode could not evaluate this action and is blocking it for safety`. Untuk penolakan karena model pengklasifikasi tidak tersedia, itu adalah teks tetap `Classifier unavailable` |2406| `reason` | Alasan penolakan. Untuk putusan pengklasifikasi, dalam sebagian besar sesi itu menamai aturan yang cocok dalam tanda kurung siku, seperti `[Data Exfiltration]`; lihat [Review denials](/docs/id/auto-mode-config#review-denials) untuk bentuk lainnya. Untuk [penolakan tanpa putusan](#permissiondenied-decision-control), itu dimulai dengan `Auto mode could not evaluate this action and is blocking it for safety`. Untuk penolakan karena model pengklasifikasi tidak tersedia, itu adalah teks tetap `Classifier unavailable` |
2407 2407
2408<h4 id="permissiondenied-decision-control">2408<h4 id="permissiondenied-decision-control">
2433Anda menerima hook events ini bahkan dengan notifikasi desktop dimatikan: pengaturan `preferredNotifChannel`, termasuk `notifications_disabled`, hanya mengubah cara Anda diperingatkan, bukan apakah hook Anda dijalankan.2433Anda menerima hook events ini bahkan dengan notifikasi desktop dimatikan: pengaturan `preferredNotifChannel`, termasuk `notifications_disabled`, hanya mengubah cara Anda diperingatkan, bukan apakah hook Anda dijalankan.
2434 2434
2435| Matcher | Kapan dijalankan |2435| Matcher | Kapan dijalankan |
2436| :--------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |2436| :- | :- |
2437| `permission_prompt` | Claude memerlukan Anda untuk menyetujui penggunaan tool atau [network request](/docs/id/sandboxing#network-isolation) perintah sandboxed, dan prompt telah menunggu sekitar enam detik |2437| `permission_prompt` | Claude memerlukan Anda untuk menyetujui penggunaan tool atau [network request](/docs/id/sandboxing#network-isolation) perintah sandboxed, dan prompt telah menunggu sekitar enam detik |
2438| `idle_prompt` | Claude selesai merespons sekitar 60 detik yang lalu dan Anda belum mengetik sejak itu |2438| `idle_prompt` | Claude selesai merespons sekitar 60 detik yang lalu dan Anda belum mengetik sejak itu |
2439| `auth_success` | Autentikasi selesai |2439| `auth_success` | Autentikasi selesai |
2550SubagentStart hooks tidak dapat memblokir pembuatan subagent, tetapi mereka dapat menyuntikkan konteks ke subagent. Selain [bidang output JSON](#json-output) yang tersedia untuk semua hooks, Anda dapat mengembalikan:2550SubagentStart hooks tidak dapat memblokir pembuatan subagent, tetapi mereka dapat menyuntikkan konteks ke subagent. Selain [bidang output JSON](#json-output) yang tersedia untuk semua hooks, Anda dapat mengembalikan:
2551 2551
2552| Bidang | Deskripsi |2552| Bidang | Deskripsi |
2553| :------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------- |2553| :- | :- |
2554| `additionalContext` | String ditambahkan ke konteks subagent pada awal percakapannya, sebelum prompt pertamanya. Lihat [Add context for Claude](#add-context-for-claude) |2554| `additionalContext` | String ditambahkan ke konteks subagent pada awal percakapannya, sebelum prompt pertamanya. Lihat [Add context for Claude](#add-context-for-claude) |
2555 2555
2556```json theme={null}2556```json theme={null}
2632```2632```
2633 2633
2634| Bidang | Deskripsi |2634| Bidang | Deskripsi |
2635| :----------------- | :---------------------------------------------------------------------- |2635| :- | :- |
2636| `task_id` | Pengenal tugas yang sedang dibuat |2636| `task_id` | Pengenal tugas yang sedang dibuat |
2637| `task_subject` | Judul tugas |2637| `task_subject` | Judul tugas |
2638| `task_description` | Deskripsi detail tugas. Mungkin tidak ada |2638| `task_description` | Deskripsi detail tugas. Mungkin tidak ada |
2693```2693```
2694 2694
2695| Bidang | Deskripsi |2695| Bidang | Deskripsi |
2696| :----------------- | :---------------------------------------------------------------------- |2696| :- | :- |
2697| `task_id` | Pengenal tugas yang sedang diselesaikan |2697| `task_id` | Pengenal tugas yang sedang diselesaikan |
2698| `task_subject` | Judul tugas |2698| `task_subject` | Judul tugas |
2699| `task_description` | Deskripsi detail tugas. Mungkin tidak ada |2699| `task_description` | Deskripsi detail tugas. Mungkin tidak ada |
2748Setiap entry dalam `background_tasks` menjelaskan satu tugas yang sedang berlangsung dan menggunakan bidang-bidang ini:2748Setiap entry dalam `background_tasks` menjelaskan satu tugas yang sedang berlangsung dan menggunakan bidang-bidang ini:
2749 2749
2750| Bidang | Deskripsi |2750| Bidang | Deskripsi |
2751| :------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |2751| :- | :- |
2752| `id` | Pengenal tugas |2752| `id` | Pengenal tugas |
2753| `type` | Label tipe tugas yang ramah seperti `shell`, `subagent`, `monitor`, `workflow`, `teammate`, `cloud session`, atau `MCP task`. Setiap label mengidentifikasi fitur Claude Code mana yang membuat tugas. Kembali ke diskriminan mentah untuk tipe yang tidak dikenali |2753| `type` | Label tipe tugas yang ramah seperti `shell`, `subagent`, `monitor`, `workflow`, `teammate`, `cloud session`, atau `MCP task`. Setiap label mengidentifikasi fitur Claude Code mana yang membuat tugas. Kembali ke diskriminan mentah untuk tipe yang tidak dikenali |
2754| `status` | Status tugas saat ini |2754| `status` | Status tugas saat ini |
2762Setiap entry dalam `session_crons` menjelaskan satu wakeup terjadwal yang bersifat sesi, bersumber dari `CronCreate`, `ScheduleWakeup`, dan `/loop`:2762Setiap entry dalam `session_crons` menjelaskan satu wakeup terjadwal yang bersifat sesi, bersumber dari `CronCreate`, `ScheduleWakeup`, dan `/loop`:
2763 2763
2764| Bidang | Deskripsi |2764| Bidang | Deskripsi |
2765| :---------- | :----------------------------------------------------------------------------------------------------------------------------------- |2765| :- | :- |
2766| `id` | Pengenal tugas cron |2766| `id` | Pengenal tugas cron |
2767| `schedule` | Ekspresi cron, misalnya `0 9 * * 1-5` |2767| `schedule` | Ekspresi cron, misalnya `0 9 * * 1-5` |
2768| `recurring` | `false` untuk wakeup satu kali yang jadwalnya mengkodekan waktu api tunggal, `true` untuk tugas yang api ulang pada setiap kecocokan |2768| `recurring` | `false` untuk wakeup satu kali yang jadwalnya mengkodekan waktu api tunggal, `true` untuk tugas yang api ulang pada setiap kecocokan |
2806Hooks `Stop` dan `SubagentStop` dapat mengontrol apakah Claude melanjutkan. Selain [bidang output JSON](#json-output) yang tersedia untuk semua hooks, skrip hook Anda dapat mengembalikan bidang spesifik event ini:2806Hooks `Stop` dan `SubagentStop` dapat mengontrol apakah Claude melanjutkan. Selain [bidang output JSON](#json-output) yang tersedia untuk semua hooks, skrip hook Anda dapat mengembalikan bidang spesifik event ini:
2807 2807
2808| Bidang | Deskripsi |2808| Bidang | Deskripsi |
2809| :------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |2809| :- | :- |
2810| `decision` | `"block"` mencegah Claude berhenti. Hilangkan untuk mengizinkan Claude berhenti |2810| `decision` | `"block"` mencegah Claude berhenti. Hilangkan untuk mengizinkan Claude berhenti |
2811| `reason` | Diperlukan saat `decision` adalah `"block"`. Memberitahu Claude mengapa itu harus melanjutkan |2811| `reason` | Diperlukan saat `decision` adalah `"block"`. Memberitahu Claude mengapa itu harus melanjutkan |
2812| `hookSpecificOutput.additionalContext` | Umpan balik non-error untuk Claude. Percakapan berlanjut sehingga Claude dapat bertindak atas itu, tetapi tidak seperti `decision: "block"` itu ditampilkan dalam transkrip sebagai umpan balik hook daripada kesalahan hook |2812| `hookSpecificOutput.additionalContext` | Umpan balik non-error untuk Claude. Percakapan berlanjut sehingga Claude dapat bertindak atas itu, tetapi tidak seperti `decision: "block"` itu ditampilkan dalam transkrip sebagai umpan balik hook daripada kesalahan hook |
2844Selain [bidang input umum](#common-input-fields), StopFailure hooks menerima `error`, `error_details` opsional, dan `last_assistant_message` opsional. Bidang `error` mengidentifikasi tipe kesalahan dan digunakan untuk pemfilteran matcher.2844Selain [bidang input umum](#common-input-fields), StopFailure hooks menerima `error`, `error_details` opsional, dan `last_assistant_message` opsional. Bidang `error` mengidentifikasi tipe kesalahan dan digunakan untuk pemfilteran matcher.
2845 2845
2846| Bidang | Deskripsi |2846| Bidang | Deskripsi |
2847| :----------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |2847| :- | :- |
2848| `error` | Tipe kesalahan: `rate_limit`, `overloaded`, `authentication_failed`, `oauth_org_not_allowed`, `account_on_hold`, `billing_error`, `invalid_request`, `model_not_found`, `server_error`, `max_output_tokens`, `cloud_credential_error`, atau `unknown` |2848| `error` | Tipe kesalahan: `rate_limit`, `overloaded`, `authentication_failed`, `oauth_org_not_allowed`, `account_on_hold`, `billing_error`, `invalid_request`, `model_not_found`, `server_error`, `max_output_tokens`, `cloud_credential_error`, atau `unknown` |
2849| `error_details` | Detail tambahan tentang kesalahan, ketika tersedia |2849| `error_details` | Detail tambahan tentang kesalahan, ketika tersedia |
2850| `last_assistant_message` | Teks kesalahan yang dirender ditampilkan dalam percakapan. Tidak seperti `Stop` dan `SubagentStop`, di mana bidang ini menyimpan output percakapan Claude, untuk `StopFailure` itu berisi string kesalahan API itu sendiri, seperti `"API Error: Rate limit reached"` |2850| `last_assistant_message` | Teks kesalahan yang dirender ditampilkan dalam percakapan. Tidak seperti `Stop` dan `SubagentStop`, di mana bidang ini menyimpan output percakapan Claude, untuk `StopFailure` itu berisi string kesalahan API itu sendiri, seperti `"API Error: Rate limit reached"` |
2890```2890```
2891 2891
2892| Bidang | Deskripsi |2892| Bidang | Deskripsi |
2893| :-------------- | :---------------------------------------------------------------------- |2893| :- | :- |
2894| `teammate_name` | Nama teammate yang akan menjadi idle |2894| `teammate_name` | Nama teammate yang akan menjadi idle |
2895| `team_name` | Nama team yang diturunkan dari sesi; akan dihapus dalam rilis mendatang |2895| `team_name` | Nama team yang diturunkan dari sesi; akan dihapus dalam rilis mendatang |
2896 2896
2927Matcher memfilter pada sumber konfigurasi:2927Matcher memfilter pada sumber konfigurasi:
2928 2928
2929| Matcher | Kapan dijalankan |2929| Matcher | Kapan dijalankan |
2930| :----------------- | :-------------------------------------------------------------------- |2930| :- | :- |
2931| `user_settings` | `~/.claude/settings.json` berubah |2931| `user_settings` | `~/.claude/settings.json` berubah |
2932| `project_settings` | `.claude/settings.json` berubah |2932| `project_settings` | `.claude/settings.json` berubah |
2933| `local_settings` | `.claude/settings.local.json` berubah |2933| `local_settings` | `.claude/settings.local.json` berubah |
2978ConfigChange hooks dapat memblokir perubahan konfigurasi dari berlaku. Gunakan kode keluar 2 atau JSON `decision` untuk mencegah perubahan. Ketika diblokir, pengaturan baru tidak diterapkan ke sesi yang berjalan.2978ConfigChange hooks dapat memblokir perubahan konfigurasi dari berlaku. Gunakan kode keluar 2 atau JSON `decision` untuk mencegah perubahan. Ketika diblokir, pengaturan baru tidak diterapkan ke sesi yang berjalan.
2979 2979
2980| Bidang | Deskripsi |2980| Bidang | Deskripsi |
2981| :--------- | :----------------------------------------------------------------------------------------- |2981| :- | :- |
2982| `decision` | `"block"` mencegah perubahan konfigurasi diterapkan. Hilangkan untuk mengizinkan perubahan |2982| `decision` | `"block"` mencegah perubahan konfigurasi diterapkan. Hilangkan untuk mengizinkan perubahan |
2983| `reason` | Diterima tetapi tidak pernah ditampilkan |2983| `reason` | Diterima tetapi tidak pernah ditampilkan |
2984 2984
3027Selain [bidang output JSON](#json-output) yang tersedia untuk semua hooks, CwdChanged hooks dapat mengembalikan `watchPaths` untuk secara dinamis menetapkan path file mana yang [FileChanged](#filechanged) pantau:3027Selain [bidang output JSON](#json-output) yang tersedia untuk semua hooks, CwdChanged hooks dapat mengembalikan `watchPaths` untuk secara dinamis menetapkan path file mana yang [FileChanged](#filechanged) pantau:
3028 3028
3029| Bidang | Deskripsi |3029| Bidang | Deskripsi |
3030| :----------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |3030| :- | :- |
3031| `watchPaths` | Array path absolut. Menggantikan daftar watch dinamis saat ini. Path dari konfigurasi `matcher` Anda selalu dipantau. Mengembalikan array kosong menghapus daftar dinamis, yang khas saat memasuki direktori baru |3031| `watchPaths` | Array path absolut. Menggantikan daftar watch dinamis saat ini. Path dari konfigurasi `matcher` Anda selalu dipantau. Mengembalikan array kosong menghapus daftar dinamis, yang khas saat memasuki direktori baru |
3032 3032
3033CwdChanged hooks tidak memiliki kontrol keputusan. Mereka tidak dapat memblokir perubahan direktori.3033CwdChanged hooks tidak memiliki kontrol keputusan. Mereka tidak dapat memblokir perubahan direktori.
3053Matcher memfilter pada cara direktori ditambahkan:3053Matcher memfilter pada cara direktori ditambahkan:
3054 3054
3055| Matcher | Kapan dijalankan |3055| Matcher | Kapan dijalankan |
3056| :------------------- | :----------------------------------------------------------------------------- |3056| :- | :- |
3057| `slash_command` | Anda menambahkan direktori dengan `/add-dir` |3057| `slash_command` | Anda menambahkan direktori dengan `/add-dir` |
3058| `register_repo_root` | Klien SDK menambahkan direktori dengan permintaan kontrol `register_repo_root` |3058| `register_repo_root` | Klien SDK menambahkan direktori dengan permintaan kontrol `register_repo_root` |
3059 3059
3064Selain [bidang input umum](#common-input-fields), DirectoryAdded hooks menerima `directory` dan `source`.3064Selain [bidang input umum](#common-input-fields), DirectoryAdded hooks menerima `directory` dan `source`.
3065 3065
3066| Bidang | Deskripsi |3066| Bidang | Deskripsi |
3067| :---------- | :--------------------------------------------------------------------------------------------------------------------------- |3067| :- | :- |
3068| `directory` | Path absolut dari direktori yang ditambahkan |3068| `directory` | Path absolut dari direktori yang ditambahkan |
3069| `source` | Bagaimana direktori ditambahkan, `"slash_command"` untuk `/add-dir` atau `"register_repo_root"` untuk permintaan kontrol SDK |3069| `source` | Bagaimana direktori ditambahkan, `"slash_command"` untuk `/add-dir` atau `"register_repo_root"` untuk permintaan kontrol SDK |
3070 3070
3138Selain [bidang input umum](#common-input-fields), FileChanged hooks menerima `file_path` dan `event`.3138Selain [bidang input umum](#common-input-fields), FileChanged hooks menerima `file_path` dan `event`.
3139 3139
3140| Bidang | Deskripsi |3140| Bidang | Deskripsi |
3141| :---------- | :--------------------------------------------------------------------------------------------------------------------------------- |3141| :- | :- |
3142| `file_path` | Path absolut ke file yang berubah |3142| `file_path` | Path absolut ke file yang berubah |
3143| `event` | Apa yang terjadi: `"change"` untuk file yang dimodifikasi, `"add"` untuk file yang dibuat, atau `"unlink"` untuk file yang dihapus |3143| `event` | Apa yang terjadi: `"change"` untuk file yang dimodifikasi, `"add"` untuk file yang dibuat, atau `"unlink"` untuk file yang dihapus |
3144 3144
3160Selain [bidang output JSON](#json-output) yang tersedia untuk semua hooks, FileChanged hooks dapat mengembalikan `watchPaths` untuk secara dinamis memperbarui path file mana yang dipantau:3160Selain [bidang output JSON](#json-output) yang tersedia untuk semua hooks, FileChanged hooks dapat mengembalikan `watchPaths` untuk secara dinamis memperbarui path file mana yang dipantau:
3161 3161
3162| Bidang | Deskripsi |3162| Bidang | Deskripsi |
3163| :----------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |3163| :- | :- |
3164| `watchPaths` | Array path absolut. Menggantikan daftar watch dinamis saat ini. Path dari konfigurasi `matcher` Anda selalu dipantau. Gunakan ini ketika skrip hook Anda menemukan file tambahan untuk dipantau berdasarkan file yang berubah |3164| `watchPaths` | Array path absolut. Menggantikan daftar watch dinamis saat ini. Path dari konfigurasi `matcher` Anda selalu dipantau. Gunakan ini ketika skrip hook Anda menemukan file tambahan untuk dipantau berdasarkan file yang berubah |
3165 3165
3166FileChanged hooks tidak memiliki kontrol keputusan. Mereka tidak dapat memblokir perubahan file dari terjadi.3166FileChanged hooks tidak memiliki kontrol keputusan. Mereka tidak dapat memblokir perubahan file dari terjadi.
3294Nilai matcher menunjukkan apakah compaction dipicu secara manual atau otomatis:3294Nilai matcher menunjukkan apakah compaction dipicu secara manual atau otomatis:
3295 3295
3296| Matcher | Kapan dijalankan |3296| Matcher | Kapan dijalankan |
3297| :------- | :---------------------------------------------------------------------------------------------------------- |3297| :- | :- |
3298| `manual` | `/compact` |3298| `manual` | `/compact` |
3299| `auto` | Auto-compact ketika percakapan mencapai [auto-compact window](/docs/id/model-config#set-the-auto-compact-window) |3299| `auto` | Auto-compact ketika percakapan mencapai [auto-compact window](/docs/id/model-config#set-the-auto-compact-window) |
3300 3300
3330Nilai matcher yang sama berlaku seperti untuk `PreCompact`:3330Nilai matcher yang sama berlaku seperti untuk `PreCompact`:
3331 3331
3332| Matcher | Kapan dijalankan |3332| Matcher | Kapan dijalankan |
3333| :------- | :------------------------------------------------------------------------------------------------------------------ |3333| :- | :- |
3334| `manual` | Setelah `/compact` |3334| `manual` | Setelah `/compact` |
3335| `auto` | Setelah auto-compact ketika percakapan mencapai [auto-compact window](/docs/id/model-config#set-the-auto-compact-window) |3335| `auto` | Setelah auto-compact ketika percakapan mencapai [auto-compact window](/docs/id/model-config#set-the-auto-compact-window) |
3336 3336
3448Selain [bidang input umum](#common-input-fields), PreModelSwitch hooks menerima bidang dalam tabel ini. Lima terakhir menjelaskan apa yang mengirim ulang percakapan ke model baru biaya, jadi hook dapat menampilkan angka itu sebelum switch terjadi.3448Selain [bidang input umum](#common-input-fields), PreModelSwitch hooks menerima bidang dalam tabel ini. Lima terakhir menjelaskan apa yang mengirim ulang percakapan ke model baru biaya, jadi hook dapat menampilkan angka itu sebelum switch terjadi.
3449 3449
3450| Bidang | Tipe | Deskripsi |3450| Bidang | Tipe | Deskripsi |
3451| :-------------------------- | :----------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |3451| :- | :- | :- |
3452| `from_model` | string | ID model yang switch ubah dari |3452| `from_model` | string | ID model yang switch ubah dari |
3453| `to_model` | string | ID model yang switch ubah ke. Matcher membandingkan terhadap nama kanonik model ini |3453| `to_model` | string | ID model yang switch ubah ke. Matcher membandingkan terhadap nama kanonik model ini |
3454| `requested_model` | string atau `null` | Model yang permintaan beri nama: alias seperti `opus`, ID model lengkap, atau `null` ketika permintaan adalah untuk model default |3454| `requested_model` | string atau `null` | Model yang permintaan beri nama: alias seperti `opus`, ID model lengkap, atau `null` ketika permintaan adalah untuk model default |
3488Untuk kontrol yang lebih halus, kembalikan `permissionDecision` dan `permissionDecisionReason` dalam objek `hookSpecificOutput`, seperti pada [PreToolUse](#pretooluse-decision-control). `PreModelSwitch` menerima `"allow"`, `"deny"`, dan `"ask"`. Itu tidak menerima `"defer"`, `updatedInput`, atau `additionalContext`. Tabel di bawah menjelaskan kedua bidang:3488Untuk kontrol yang lebih halus, kembalikan `permissionDecision` dan `permissionDecisionReason` dalam objek `hookSpecificOutput`, seperti pada [PreToolUse](#pretooluse-decision-control). `PreModelSwitch` menerima `"allow"`, `"deny"`, dan `"ask"`. Itu tidak menerima `"defer"`, `updatedInput`, atau `additionalContext`. Tabel di bawah menjelaskan kedua bidang:
3489 3489
3490| Bidang | Deskripsi |3490| Bidang | Deskripsi |
3491| :------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |3491| :- | :- |
3492| `permissionDecision` | `"allow"` melanjutkan dan melewati [konfirmasi Claude Code menampilkan sementara prompt cache hangat](/docs/id/prompt-caching#switching-models). `"deny"` membatalkan switch. `"ask"` meminta pengguna untuk mengkonfirmasinya |3492| `permissionDecision` | `"allow"` melanjutkan dan melewati [konfirmasi Claude Code menampilkan sementara prompt cache hangat](/docs/id/prompt-caching#switching-models). `"deny"` membatalkan switch. `"ask"` meminta pengguna untuk mengkonfirmasinya |
3493| `permissionDecisionReason` | Untuk `"deny"`, ditampilkan ke pengguna sebagai alasan switch diblokir, atau dikembalikan sebagai kesalahan untuk permintaan `set_model`. Untuk `"ask"`, ditampilkan dalam prompt konfirmasi. Diabaikan untuk `"allow"` |3493| `permissionDecisionReason` | Untuk `"deny"`, ditampilkan ke pengguna sebagai alasan switch diblokir, atau dikembalikan sebagai kesalahan untuk permintaan `set_model`. Untuk `"ask"`, ditampilkan dalam prompt konfirmasi. Diabaikan untuk `"allow"` |
3494 3494
3568Claude Code mengambil stdout [plain-text](#exit-code-0) hook Anda pada keluar 0, atau `additionalContext` dari output JSON, dan mengirimkannya ke Claude dengan permintaan setelah switch. Selain [bidang output JSON](#json-output) yang tersedia untuk semua hooks, Anda dapat mengembalikan:3568Claude Code mengambil stdout [plain-text](#exit-code-0) hook Anda pada keluar 0, atau `additionalContext` dari output JSON, dan mengirimkannya ke Claude dengan permintaan setelah switch. Selain [bidang output JSON](#json-output) yang tersedia untuk semua hooks, Anda dapat mengembalikan:
3569 3569
3570| Bidang | Deskripsi |3570| Bidang | Deskripsi |
3571| :------------------ | :------------------------------------------------------------------------------------------------------------------------- |3571| :- | :- |
3572| `additionalContext` | String ditambahkan ke konteks Claude dengan permintaan berikutnya. Lihat [Add context for Claude](#add-context-for-claude) |3572| `additionalContext` | String ditambahkan ke konteks Claude dengan permintaan berikutnya. Lihat [Add context for Claude](#add-context-for-claude) |
3573 3573
3574Jika hook belum selesai dalam lima detik setelah Anda mengirimkan permintaan berikutnya, Claude Code mengirimkan permintaan itu tanpa output dan melampirkannya ke permintaan berikutnya sebagai gantinya. Jika model berubah beberapa kali sebelum permintaan berikutnya, Claude Code mengirimkan hanya output untuk switch terakhir ke model target.3574Jika hook belum selesai dalam lima detik setelah Anda mengirimkan permintaan berikutnya, Claude Code mengirimkan permintaan itu tanpa output dan melampirkannya ke permintaan berikutnya sebagai gantinya. Jika model berubah beberapa kali sebelum permintaan berikutnya, Claude Code mengirimkan hanya output untuk switch terakhir ke model target.
3582Bidang `reason` dalam input hook menunjukkan mengapa sesi berakhir:3582Bidang `reason` dalam input hook menunjukkan mengapa sesi berakhir:
3583 3583
3584| Alasan | Deskripsi |3584| Alasan | Deskripsi |
3585| :---------------------------- | :------------------------------------------------------------------------------------------------ |3585| :- | :- |
3586| `clear` | Sesi dihapus dengan perintah `/clear` |3586| `clear` | Sesi dihapus dengan perintah `/clear` |
3587| `resume` | Sesi beralih melalui `/resume` interaktif |3587| `resume` | Sesi beralih melalui `/resume` interaktif |
3588| `logout` | Pengguna logout |3588| `logout` | Pengguna logout |
3684```3684```
3685 3685
3686| Bidang | Nilai | Deskripsi |3686| Bidang | Nilai | Deskripsi |
3687| :-------- | :---------------------------- | :------------------------------------------------------------------------------- |3687| :- | :- | :- |
3688| `action` | `accept`, `decline`, `cancel` | Apakah menerima, menolak, atau membatalkan permintaan |3688| `action` | `accept`, `decline`, `cancel` | Apakah menerima, menolak, atau membatalkan permintaan |
3689| `content` | object | Nilai field form untuk dikirimkan. Hanya digunakan saat `action` adalah `accept` |3689| `content` | object | Nilai field form untuk dikirimkan. Hanya digunakan saat `action` adalah `accept` |
3690 3690
3737```3737```
3738 3738
3739| Bidang | Nilai | Deskripsi |3739| Bidang | Nilai | Deskripsi |
3740| :-------- | :---------------------------- | :--------------------------------------------------------------------- |3740| :- | :- | :- |
3741| `action` | `accept`, `decline`, `cancel` | Menimpa tindakan pengguna |3741| `action` | `accept`, `decline`, `cancel` | Menimpa tindakan pengguna |
3742| `content` | object | Menimpa nilai field form. Hanya bermakna saat `action` adalah `accept` |3742| `content` | object | Menimpa nilai field form. Hanya bermakna saat `action` adalah `accept` |
3743 3743
3827```3827```
3828 3828
3829| Bidang | Diperlukan | Deskripsi |3829| Bidang | Diperlukan | Deskripsi |
3830| :---------------- | :--------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |3830| :- | :- | :- |
3831| `type` | ya | Harus `"prompt"` |3831| `type` | ya | Harus `"prompt"` |
3832| `prompt` | ya | Teks prompt untuk dikirim ke LLM. Gunakan `$ARGUMENTS` sebagai placeholder untuk JSON input hook. Jika `$ARGUMENTS` tidak ada, JSON input ditambahkan ke prompt |3832| `prompt` | ya | Teks prompt untuk dikirim ke LLM. Gunakan `$ARGUMENTS` sebagai placeholder untuk JSON input hook. Jika `$ARGUMENTS` tidak ada, JSON input ditambahkan ke prompt |
3833| `model` | tidak | Model untuk digunakan untuk evaluasi. Default ke model cepat |3833| `model` | tidak | Model untuk digunakan untuk evaluasi. Default ke model cepat |
3849```3849```
3850 3850
3851| Bidang | Deskripsi |3851| Bidang | Deskripsi |
3852| :----------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |3852| :- | :- |
3853| `ok` | `true` untuk mengizinkan. Untuk `false`, lihat perilaku per-event di bawah |3853| `ok` | `true` untuk mengizinkan. Untuk `false`, lihat perilaku per-event di bawah |
3854| `reason` | Diperlukan saat `ok` adalah `false` |3854| `reason` | Diperlukan saat `ok` adalah `false` |
3855| `impossible` | Opsional. Model mengembalikannya dengan `ok: false` ketika menilai kondisi tidak dapat pernah terpenuhi. Pada `Stop` dan `SubagentStop`, Claude Code kemudian membiarkan giliran berakhir alih-alih mengirimkan alasan kembali. Agent hooks dan events lainnya mengabaikannya |3855| `impossible` | Opsional. Model mengembalikannya dengan `ok: false` ketika menilai kondisi tidak dapat pernah terpenuhi. Pada `Stop` dan `SubagentStop`, Claude Code kemudian membiarkan giliran berakhir alih-alih mengirimkan alasan kembali. Agent hooks dan events lainnya mengabaikannya |