1159 Event hook1159 Event hook
1160</h2>1160</h2>
1161 1161
1162Setiap event berkaitan dengan satu titik dalam siklus hidup Claude Code tempat hook dapat berjalan. Bagian-bagian di bawah ini diurutkan sesuai siklus hidup tersebut: mulai dari penyiapan sesi, melalui agentic loop, hingga akhir sesi. Setiap bagian menjelaskan kapan event dipicu, matcher apa yang didukungnya, input JSON yang diterimanya, dan cara mengontrol perilaku melalui output.1162Setiap event berkaitan dengan suatu titik dalam siklus hidup Claude Code tempat hook dapat berjalan. Bagian-bagian di bawah ini diurutkan sesuai siklus hidup tersebut: mulai dari penyiapan sesi, melalui agentic loop, hingga akhir sesi. Setiap bagian menjelaskan kapan event dipicu, matcher apa yang didukungnya, input JSON yang diterimanya, dan cara mengontrol perilaku melalui output.
1163 1163
1164<h3 id="sessionstart">1164<h3 id="sessionstart">
1165 SessionStart1165 SessionStart
1166</h3>1166</h3>
1167 1167
1168Berjalan saat Claude Code memulai sesi baru atau melanjutkan sesi yang sudah ada. Berguna untuk memuat konteks pengembangan seperti issue yang ada atau perubahan terbaru pada codebase Anda, atau untuk menyiapkan environment variable. Untuk konteks statis yang tidak memerlukan skrip, gunakan [CLAUDE.md](/docs/id/memory) sebagai gantinya.1168Berjalan ketika Claude Code memulai sesi baru atau melanjutkan sesi yang sudah ada. Berguna untuk memuat konteks pengembangan seperti issue yang ada atau perubahan terbaru pada codebase Anda, atau untuk menyiapkan environment variable. Untuk konteks statis yang tidak memerlukan skrip, gunakan [CLAUDE.md](/docs/id/memory) sebagai gantinya.
1169 1169
1170SessionStart berjalan pada setiap sesi, jadi pastikan hook ini tetap cepat. Hanya hook `type: "command"` dan `type: "mcp_tool"` yang didukung. Lihat [kolom hook tool MCP](#mcp-tool-hook-fields) untuk mengetahui kapan hook `mcp_tool` berjalan.1170SessionStart berjalan pada setiap sesi, jadi jaga agar hook ini tetap cepat. Hanya hook `type: "command"` dan `type: "mcp_tool"` yang didukung. Lihat [Field hook tool MCP](#mcp-tool-hook-fields) untuk mengetahui kapan hook `mcp_tool` berjalan.
1171 1171
1172Nilai matcher berkaitan dengan cara sesi dimulai:1172Nilai matcher berkaitan dengan cara sesi dimulai:
1173 1173
1181 1181
1182Sebelum v2.1.214, sesi hasil fork melaporkan source `"resume"`.1182Sebelum v2.1.214, sesi hasil fork melaporkan source `"resume"`.
1183 1183
1184Saat Anda memulai sesi interaktif, melanjutkan percakapan saat peluncuran dengan `--continue` atau `--resume`, atau menjalankan `/clear`, hook SessionStart berjalan di latar belakang. Anda dapat langsung mengetik, dan percakapan yang Anda lanjutkan muncul tanpa menunggu hook. Respons pertama Claude tetap menunggu hook selesai, sehingga konteksnya sampai ke Claude.1184Ketika Anda memulai sesi interaktif, melanjutkan percakapan saat peluncuran dengan `--continue` atau `--resume`, atau menjalankan `/clear`, hook SessionStart berjalan di latar belakang. Anda dapat langsung mengetik, dan percakapan yang Anda lanjutkan muncul tanpa menunggu hook. Respons pertama Claude tetap menunggu hook selesai, sehingga konteksnya sampai ke Claude.
1185 1185
1186Saat Anda berpindah percakapan dengan `/resume` di dalam sesi, perpindahan tersebut justru menunggu hook selesai. Jika Anda menjalankan `/clear` atau berpindah ke percakapan lain saat hook latar belakang masih berjalan, apa pun yang dikembalikannya tidak diterapkan ke sesi.1186Ketika Anda berpindah percakapan dengan `/resume` di dalam sesi, perpindahan tersebut justru menunggu hook selesai. Jika Anda menjalankan `/clear` atau berpindah ke percakapan lain saat hook latar belakang masih berjalan, apa pun yang dikembalikannya tidak diterapkan ke sesi.
1187 1187
1188Penantian yang sama berlaku saat peluncuran, termasuk sesi yang dilanjutkan: prompt yang Anda kirim saat hook SessionStart masih berjalan tidak sampai ke Claude hingga hook tersebut selesai.1188Penantian yang sama berlaku saat peluncuran, termasuk sesi yang dilanjutkan: prompt yang Anda kirim saat hook SessionStart masih berjalan tidak akan sampai ke Claude hingga hook tersebut selesai.
1189 1189
1190Selama salah satu penantian tersebut, tekan `Esc` untuk mengambil kembali prompt ke input tanpa mengirimkannya. Hook tetap berjalan.1190Selama penantian mana pun, tekan `Esc` untuk mengambil kembali prompt ke input tanpa mengirimnya. Hook tetap berjalan.
1191 1191
1192<h4 id="sessionstart-input">1192<h4 id="sessionstart-input">
1193 Input SessionStart1193 Input SessionStart
1194</h4>1194</h4>
1195 1195
1196Selain [kolom input umum](#common-input-fields), hook SessionStart menerima `source` dan secara opsional `model`, `agent_type`, dan `session_title`:1196Selain [field input umum](#common-input-fields), hook SessionStart menerima `source` dan secara opsional `model`, `agent_type`, dan `session_title`:
1197 1197
1198| Kolom | Deskripsi |1198| Field | Deskripsi |
1199| :- | :- |1199| :- | :- |
1200| `source` | Cara 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 sudah ada |1200| `source` | Cara 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 sudah ada |
1201| `model` | Pengidentifikasi model yang aktif. Kolom ini dapat dihilangkan, misalnya setelah `/clear` atau saat sesi dipulihkan melalui pemulihan percakapan, jadi periksa keberadaan kolom ini sebelum membacanya |1201| `model` | Pengidentifikasi model yang aktif. Field ini dapat dihilangkan, misalnya setelah `/clear` atau ketika sesi dipulihkan melalui pemulihan percakapan, jadi periksa keberadaan field sebelum membacanya |
1202| `agent_type` | Nama agent, ada saat Anda memulai Claude Code dengan `claude --agent <name>` |1202| `agent_type` | Nama agent, ada ketika Anda memulai Claude Code dengan `claude --agent <name>` |
1203| `session_title` | Judul kustom sesi, ada saat judul tersebut diatur, misalnya dengan `--name`, `/rename`, output `sessionTitle` dari hook, atau `renameSession()` dari Agent SDK. Hook yang mengeluarkan `sessionTitle` dapat memeriksa kolom ini terlebih dahulu agar tidak menimpa judul kustom yang sudah ada |1203| `session_title` | Judul kustom sesi, ada ketika judul tersebut diatur, misalnya dengan `--name`, `/rename`, output `sessionTitle` dari hook, atau `renameSession()` dari Agent SDK. Hook yang menghasilkan `sessionTitle` dapat memeriksa field ini terlebih dahulu untuk menghindari penimpaan judul kustom yang sudah ada |
1204 1204
1205Sesi yang belum Anda beri nama tetap dapat memiliki [judul yang dihasilkan](/docs/id/sessions#name-your-sessions). Judul tersebut bukan judul kustom dan tidak muncul di `session_title`.1205Sesi yang belum Anda beri nama tetap dapat memiliki [judul yang dihasilkan](/docs/id/sessions#name-your-sessions). Judul tersebut bukan judul kustom dan tidak muncul di `session_title`.
1206 1206
1207Saat `source` bernilai `"resume"` atau `"fork"` dan transkrip berisi setidaknya satu respons dari Claude, hook SessionStart juga menerima empat kolom di bawah ini. Hook Anda dapat menggunakannya untuk melaporkan biaya melanjutkan percakapan yang sudah basi sebelum permintaan pertama, misalnya dalam [`systemMessage`](#json-output). Kolom-kolom ini memerlukan Claude Code v2.1.251 atau yang lebih baru.1207Ketika `source` bernilai `"resume"` atau `"fork"` dan transkrip berisi setidaknya satu respons dari Claude, hook SessionStart juga menerima empat field di bawah ini. Hook Anda dapat menggunakannya untuk melaporkan biaya melanjutkan percakapan yang sudah lama sebelum permintaan pertama, misalnya dalam [`systemMessage`](#json-output). Field ini memerlukan Claude Code v2.1.251 atau yang lebih baru.
1208 1208
1209| Kolom | Deskripsi |1209| Field | Deskripsi |
1210| :- | :- |1210| :- | :- |
1211| `seconds_since_last_response` | Detik waktu nyata sejak respons terakhir dalam transkrip yang dilanjutkan |1211| `seconds_since_last_response` | Detik waktu nyata sejak respons terakhir dalam transkrip yang dilanjutkan |
1212| `context_tokens` | Token yang dikirim ulang oleh permintaan pertama sesi yang dilanjutkan sebagai prompt-nya |1212| `context_tokens` | Token yang dikirim ulang oleh permintaan pertama dari sesi yang dilanjutkan sebagai prompt-nya |
1213| `prompt_cache_likely_expired` | `true` saat respons terakhir lebih lama dari [masa hidup prompt cache](/docs/id/prompt-caching#cache-lifetime) sesi atau compaction setelahnya menggantikan percakapan yang di-cache |1213| `prompt_cache_likely_expired` | `true` ketika respons terakhir lebih lama dari [masa berlaku prompt cache](/docs/id/prompt-caching#cache-lifetime) sesi atau compaction berikutnya telah menggantikan percakapan yang di-cache |
1214| `estimated_cache_write_usd` | Perkiraan biaya dalam dolar AS untuk menulis `context_tokens` ke prompt cache pada model sesi, tidak termasuk respons |1214| `estimated_cache_write_usd` | Estimasi biaya dalam dolar AS untuk menulis `context_tokens` ke prompt cache pada model sesi, tidak termasuk respons |
1215 1215
1216Contoh ini menunjukkan input untuk sesi yang dilanjutkan 90 menit setelah respons terakhirnya:1216Contoh ini menunjukkan input untuk sesi yang dilanjutkan 90 menit setelah respons terakhirnya:
1217 1217
1234 Kontrol keputusan SessionStart1234 Kontrol keputusan SessionStart
1235</h4>1235</h4>
1236 1236
1237Claude Code menambahkan stdout yang [diperlakukannya sebagai teks biasa](#exit-code-0) ke konteks Claude. Selain [kolom output JSON](#json-output) yang tersedia untuk semua hook, Anda dapat mengembalikan kolom khusus event berikut:1237Claude Code menambahkan stdout yang [diperlakukannya sebagai teks biasa](#exit-code-0) ke konteks Claude. Selain [field output JSON](#json-output) yang tersedia untuk semua hook, Anda dapat mengembalikan field khusus event berikut:
1238 1238
1239| Kolom | Deskripsi |1239| Field | Deskripsi |
1240| :- | :- |1240| :- | :- |
1241| `additionalContext` | String yang ditambahkan ke konteks Claude di awal percakapan, sebelum prompt pertama. Lihat [Menambahkan konteks untuk Claude](#add-context-for-claude) untuk cara teks dikirimkan dan apa yang perlu dimasukkan ke dalamnya |1241| `additionalContext` | String yang ditambahkan ke konteks Claude di awal percakapan, sebelum prompt pertama. Lihat [Menambahkan konteks untuk Claude](#add-context-for-claude) untuk cara teks dikirimkan dan apa yang perlu dimasukkan |
1242| `initialUserMessage` | String yang digunakan sebagai pesan pengguna pertama dalam sesi. Berlaku dalam [mode non-interaktif](/docs/id/headless) dengan flag `-p`, tempat string ini menjadi giliran pertama meskipun tidak ada prompt yang diberikan. Jika prompt diberikan, prompt tersebut menyusul sebagai giliran berikutnya. Tidak seperti `additionalContext`, yang dilampirkan ke giliran yang sudah ada, kolom ini membuat giliran tersebut |1242| `initialUserMessage` | String yang digunakan sebagai pesan pengguna pertama dalam sesi. Berlaku dalam [mode non-interaktif](/docs/id/headless) dengan flag `-p`, tempat string ini menjadi giliran pertama meskipun tidak ada prompt yang diberikan. Jika prompt diberikan, prompt tersebut mengikuti sebagai giliran berikutnya. Tidak seperti `additionalContext`, yang dilampirkan ke giliran yang sudah ada, field ini membuat giliran |
1243| `sessionTitle` | Mengatur judul sesi, dengan efek yang sama seperti `/rename`. Gunakan untuk memberi nama sesi secara otomatis dari folder peluncuran, branch git, atau nama worktree. Berlaku saat `source` bernilai `"startup"`, `"resume"`, atau `"fork"`; diabaikan pada `"clear"` dan `"compact"` |1243| `sessionTitle` | Mengatur judul sesi, dengan efek yang sama seperti `/rename`. Gunakan untuk memberi nama sesi secara otomatis dari folder peluncuran, branch git, atau nama worktree. Berlaku ketika `source` bernilai `"startup"`, `"resume"`, atau `"fork"`; diabaikan pada `"clear"` dan `"compact"` |
1244| `watchPaths` | Array path absolut yang dipantau untuk event [FileChanged](#filechanged) selama sesi ini |1244| `watchPaths` | Array path absolut yang dipantau untuk event [FileChanged](#filechanged) selama sesi ini |
1245| `reloadSkills` | Boolean. Saat `true`, Claude Code memindai ulang direktori [skill](/docs/id/skills) dan perintah setelah hook SessionStart selesai, sehingga skill yang diinstal oleh hook tersedia dalam sesi yang sama, mulai dari prompt pertama |1245| `reloadSkills` | Boolean. Ketika `true`, Claude Code memindai ulang direktori [skill](/docs/id/skills) dan perintah setelah hook SessionStart selesai, sehingga skill yang dipasang oleh hook tersedia dalam sesi yang sama, mulai dari prompt pertama |
1246 1246
1247```json theme={null}1247```json theme={null}
1248{1248{
1254}1254}
1255```1255```
1256 1256
1257Karena stdout biasa sudah sampai ke Claude untuk event ini, hook yang hanya memuat konteks dapat langsung mencetak ke stdout tanpa membangun JSON. Gunakan bentuk JSON saat Anda perlu menggabungkan konteks dengan kolom lain seperti `sessionTitle`.1257Karena stdout biasa sudah sampai ke Claude untuk event ini, hook yang hanya memuat konteks dapat mencetak langsung ke stdout tanpa membangun JSON. Gunakan bentuk JSON ketika Anda perlu menggabungkan konteks dengan field lain seperti `sessionTitle`.
1258 1258
1259Gunakan `reloadSkills` saat hook SessionStart menginstal atau memperbarui skill. Penemuan skill biasanya berjalan sebelum hook SessionStart selesai, sehingga file yang ditulis hook ke `~/.claude/skills/` atau `.claude/skills/` jika tidak demikian hanya akan muncul di sesi berikutnya. Contoh ini menyinkronkan repositori skill bersama dan meminta pemindaian ulang:1259Gunakan `reloadSkills` ketika hook SessionStart memasang atau memperbarui skill. Penemuan skill biasanya berjalan sebelum hook SessionStart selesai, sehingga file yang ditulis hook ke `~/.claude/skills/` atau `.claude/skills/` sebaliknya hanya akan muncul di sesi berikutnya. Contoh ini menyinkronkan repositori skill bersama dan meminta pemindaian ulang:
1260 1260
1261```bash theme={null}1261```bash theme={null}
1262#!/bin/bash1262#!/bin/bash
1267echo '{"hookSpecificOutput": {"hookEventName": "SessionStart", "reloadSkills": true}}'1267echo '{"hookSpecificOutput": {"hookEventName": "SessionStart", "reloadSkills": true}}'
1268```1268```
1269 1269
1270URL repositori tersebut adalah placeholder; ganti dengan repositori skill Anda sendiri. Dengan placeholder tersebut, clone gagal dan mencetak pesan `fatal:` ke stderr. Stderr dari hook SessionStart yang keluar dengan 0 hanya bersifat informasional, sehingga permintaan `reloadSkills` tetap berlaku.1270URL repositori tersebut adalah placeholder; ganti dengan repositori skill Anda sendiri. Dengan placeholder tersebut, clone gagal dan mencetak pesan `fatal:` ke stderr. Stderr dari hook SessionStart yang keluar dengan 0 hanya bersifat informatif, sehingga permintaan `reloadSkills` tetap berlaku.
1271 1271
1272<h4 id="persist-environment-variables">1272<h4 id="persist-environment-variables">
1273 Mempertahankan environment variable1273 Mempertahankan environment variable
1289exit 01289exit 0
1290```1290```
1291 1291
1292Untuk menangkap semua perubahan lingkungan dari perintah penyiapan, bandingkan variabel yang diekspor sebelum dan sesudahnya:1292Untuk menangkap semua perubahan environment dari perintah penyiapan, bandingkan variabel yang diekspor sebelum dan sesudahnya:
1293 1293
1294```bash theme={null}1294```bash theme={null}
1295#!/bin/bash1295#!/bin/bash
1316 Setup1316 Setup
1317</h3>1317</h3>
1318 1318
1319Hanya dipicu saat Anda meluncurkan Claude Code dengan `--init-only`, atau dengan `--init` atau `--maintenance` dalam [mode non-interaktif](/docs/id/headless) dengan flag `-p`. Event ini tidak dipicu pada startup normal. Gunakan untuk instalasi dependensi satu kali atau pembersihan terjadwal yang Anda picu secara eksplisit dari CI atau skrip, terpisah dari startup sesi normal. Untuk inisialisasi per sesi, gunakan [SessionStart](#sessionstart) sebagai gantinya.1319Hanya dipicu ketika Anda meluncurkan Claude Code dengan `--init-only`, atau dengan `--init` atau `--maintenance` dalam [mode non-interaktif](/docs/id/headless) dengan flag `-p`. Event ini tidak dipicu pada startup normal. Gunakan untuk instalasi dependensi satu kali atau pembersihan terjadwal yang Anda picu secara eksplisit dari CI atau skrip, terpisah dari startup sesi normal. Untuk inisialisasi per sesi, gunakan [SessionStart](#sessionstart) sebagai gantinya.
1320 1320
1321Nilai matcher berkaitan dengan flag CLI yang memicu hook:1321Nilai matcher berkaitan dengan flag CLI yang memicu hook:
1322 1322
1325| `init` | `claude --init-only` atau `claude -p --init` |1325| `init` | `claude --init-only` atau `claude -p --init` |
1326| `maintenance` | `claude -p --maintenance` |1326| `maintenance` | `claude -p --maintenance` |
1327 1327
1328Saat Anda menjalankan `claude --init-only`, Claude Code menjalankan hook Setup dan hook `SessionStart` dengan matcher `startup`, lalu keluar tanpa memulai percakapan.1328Ketika Anda menjalankan `claude --init-only`, Claude Code menjalankan hook Setup dan hook `SessionStart` dengan matcher `startup`, lalu keluar tanpa memulai percakapan.
1329 1329
1330Saat Anda memulai atau melanjutkan percakapan dengan `-p`, Anda juga perlu memberikan prompt, sebagai argumen atau melalui pipe ke stdin. Anda dapat melewatkan prompt saat hook `SessionStart` menyediakan [`initialUserMessage`](#sessionstart-decision-control) atau saat Anda melanjutkan sesi dengan [panggilan tool yang ditunda](#defer-a-tool-call-for-later).1330Ketika Anda memulai atau melanjutkan percakapan dengan `-p`, Anda juga perlu menyediakan prompt, sebagai argumen atau disalurkan melalui stdin. Anda dapat melewatkan prompt ketika hook `SessionStart` menyediakan [`initialUserMessage`](#sessionstart-decision-control) atau ketika Anda melanjutkan sesi dengan [panggilan tool yang ditangguhkan](#defer-a-tool-call-for-later).
1331 1331
1332Jika berhasil, `--init-only` tidak mencetak apa pun ke terminal. Untuk memastikan hook berjalan, mulai dengan `claude --debug-file <path> --init-only`, ganti `<path>` dengan lokasi file log, lalu periksa log untuk entri hook Setup dan SessionStart.1332Jika berhasil, `--init-only` tidak mencetak apa pun ke terminal. Untuk memastikan hook telah berjalan, mulai dengan `claude --debug-file <path> --init-only`, ganti `<path>` dengan lokasi file log, lalu periksa log untuk entri hook Setup dan SessionStart.
1333 1333
1334Karena Setup tidak dipicu pada setiap peluncuran, plugin yang memerlukan dependensi terinstal tidak dapat hanya mengandalkan Setup. Pola praktisnya adalah memeriksa dependensi saat penggunaan pertama dan menginstalnya jika tidak ada, misalnya hook atau skill yang memeriksa `${CLAUDE_PLUGIN_DATA}/node_modules` dan menjalankan `npm install` jika tidak ada. Lihat [direktori data persisten](/docs/id/plugins/components#path-variables-and-persistent-data) untuk lokasi menyimpan dependensi yang diinstal. Jika Anda mendistribusikan plugin melalui marketplace, Anda mungkin tidak memerlukan pola ini: Claude Code [menginstal dependensi paket Node.js yang memenuhi syarat secara otomatis](/docs/id/plugins/loading#node-js-package-dependencies) saat melakukan cache pada plugin.1334Karena Setup tidak dipicu pada setiap peluncuran, plugin yang membutuhkan dependensi terpasang tidak dapat hanya mengandalkan Setup. Pola praktisnya adalah memeriksa dependensi saat penggunaan pertama dan memasangnya jika belum ada, misalnya hook atau skill yang memeriksa `${CLAUDE_PLUGIN_DATA}/node_modules` dan menjalankan `npm install` jika tidak ada. Lihat [direktori data persisten](/docs/id/plugins/components#path-variables-and-persistent-data) untuk lokasi penyimpanan dependensi yang dipasang. Jika Anda mendistribusikan plugin melalui marketplace, Anda mungkin tidak memerlukan pola ini: Claude Code [memasang dependensi paket Node.js yang memenuhi syarat secara otomatis](/docs/id/plugins/loading#node-js-package-dependencies) ketika menyimpan plugin ke cache.
1335 1335
1336<h4 id="setup-input">1336<h4 id="setup-input">
1337 Input Setup1337 Input Setup
1338</h4>1338</h4>
1339 1339
1340Selain [kolom input umum](#common-input-fields), hook Setup menerima kolom `trigger` yang bernilai `"init"` atau `"maintenance"`:1340Selain [field input umum](#common-input-fields), hook Setup menerima field `trigger` yang bernilai `"init"` atau `"maintenance"`:
1341 1341
1342```json theme={null}1342```json theme={null}
1343{1343{
1353 Kontrol keputusan Setup1353 Kontrol keputusan Setup
1354</h4>1354</h4>
1355 1355
1356Hook Setup tidak dapat memblokir; eksekusi berlanjut pada exit code apa pun. Pada setiap exit code, Claude Code membuang [kolom output JSON](#json-output) hook Setup, seperti `systemMessage`, `continue`, dan `hookSpecificOutput.additionalContext`. Dengan `-p`, stdout, stderr, dan exit code hook Setup muncul dalam output run hanya sebagai [event `hook_response`](/docs/id/headless#read-session-metadata) saat Anda meluncurkan dengan `--output-format stream-json --verbose`.1356Hook Setup tidak dapat memblokir; eksekusi berlanjut pada exit code apa pun. Pada setiap exit code, Claude Code membuang [field output JSON](#json-output) dari hook Setup, seperti `systemMessage`, `continue`, dan `hookSpecificOutput.additionalContext`. Dengan `-p`, stdout, stderr, dan exit code dari hook Setup hanya muncul di output run sebagai [event `hook_response`](/docs/id/headless#read-session-metadata) ketika Anda meluncurkan dengan `--output-format stream-json --verbose`.
1357 1357
1358Hook Setup memiliki akses ke `CLAUDE_ENV_FILE`. Variabel yang ditulis ke file tersebut dipertahankan untuk perintah Bash berikutnya dalam sesi, sama seperti pada [hook SessionStart](#persist-environment-variables). Hanya hook `type: "command"` yang berjalan pada `Setup`. Hook `type: "mcp_tool"` pada `Setup` selalu dilewati, seperti dijelaskan di [kolom hook tool MCP](#mcp-tool-hook-fields).1358Hook Setup memiliki akses ke `CLAUDE_ENV_FILE`. Variabel yang ditulis ke file tersebut bertahan ke perintah Bash berikutnya dalam sesi, sama seperti pada [hook SessionStart](#persist-environment-variables). Hanya hook `type: "command"` yang berjalan pada `Setup`. Hook `type: "mcp_tool"` pada `Setup` selalu dilewati, seperti dijelaskan di [Field hook tool MCP](#mcp-tool-hook-fields).
1359 1359
1360<h3 id="instructionsloaded">1360<h3 id="instructionsloaded">
1361 InstructionsLoaded1361 InstructionsLoaded
1362</h3>1362</h3>
1363 1363
1364Dipicu saat file `CLAUDE.md` atau `.claude/rules/*.md` dimuat ke dalam konteks. Event ini dipicu di awal sesi untuk file yang dimuat secara eager dan dipicu lagi nanti saat file dimuat secara lazy, misalnya saat Claude mengakses subdirektori yang berisi `CLAUDE.md` bersarang atau saat aturan kondisional dengan frontmatter `paths:` cocok. Hook ini tidak mendukung pemblokiran atau kontrol keputusan. Hook ini berjalan secara asinkron untuk tujuan observabilitas.1364Dipicu ketika file `CLAUDE.md` atau `.claude/rules/*.md` dimuat ke dalam konteks. Event ini dipicu saat sesi dimulai untuk file yang dimuat segera dan dipicu lagi nanti ketika file dimuat secara lazy, misalnya ketika Claude mengakses subdirektori yang berisi `CLAUDE.md` bersarang atau ketika aturan kondisional dengan frontmatter `paths:` cocok. Hook ini tidak mendukung pemblokiran atau kontrol keputusan. Hook ini berjalan secara asinkron untuk keperluan observabilitas.
1365 1365
1366Event ini tidak dipicu saat Claude [membaca `AGENTS.md` secara langsung](/docs/id/memory#agents-md) melalui pengaturan **Project instructions**. Event ini dipicu saat `CLAUDE.md` mengimpor `AGENTS.md` Anda, dengan `load_reason` diatur ke `include` seperti untuk file impor lainnya, dan saat `CLAUDE.md` adalah symlink ke file tersebut, sebagai pemuatan `CLAUDE.md` biasa.1366Event ini tidak dipicu ketika Claude [membaca `AGENTS.md` secara langsung](/docs/id/memory#agents-md) melalui pengaturan **Project instructions**. Event ini dipicu ketika `CLAUDE.md` mengimpor `AGENTS.md` Anda, dengan `load_reason` bernilai `include` seperti file impor lainnya, dan ketika `CLAUDE.md` adalah symlink ke file tersebut, sebagai pemuatan `CLAUDE.md` biasa.
1367 1367
1368Matcher dijalankan terhadap `load_reason`. Misalnya, gunakan `"matcher": "session_start"` agar hanya dipicu untuk file yang dimuat di awal sesi, atau `"matcher": "path_glob_match|nested_traversal"` agar hanya dipicu untuk pemuatan lazy.1368Matcher dijalankan terhadap `load_reason`. Misalnya, gunakan `"matcher": "session_start"` untuk hanya memicu pada file yang dimuat saat sesi dimulai, atau `"matcher": "path_glob_match|nested_traversal"` untuk hanya memicu pada pemuatan lazy.
1369 1369
1370<h4 id="instructionsloaded-input">1370<h4 id="instructionsloaded-input">
1371 Input InstructionsLoaded1371 Input InstructionsLoaded
1372</h4>1372</h4>
1373 1373
1374Selain [kolom input umum](#common-input-fields), hook InstructionsLoaded menerima kolom-kolom berikut:1374Selain [field input umum](#common-input-fields), hook InstructionsLoaded menerima field berikut:
1375 1375
1376| Kolom | Deskripsi |1376| Field | Deskripsi |
1377| :- | :- |1377| :- | :- |
1378| `file_path` | Path absolut ke file instruksi yang dimuat |1378| `file_path` | Path absolut ke file instruksi yang dimuat |
1379| `memory_type` | Cakupan file: `"User"`, `"Project"`, `"Local"`, atau `"Managed"` |1379| `memory_type` | Cakupan file: `"User"`, `"Project"`, `"Local"`, atau `"Managed"` |
1380| `load_reason` | Alasan file dimuat: `"session_start"`, `"nested_traversal"`, `"path_glob_match"`, `"include"`, atau `"compact"`. Nilai `"compact"` dipicu saat file instruksi dimuat ulang setelah event compaction |1380| `load_reason` | Alasan file dimuat: `"session_start"`, `"nested_traversal"`, `"path_glob_match"`, `"include"`, atau `"compact"`. Nilai `"compact"` dipicu ketika file instruksi dimuat ulang setelah event compaction |
1381| `globs` | Pola glob path dari frontmatter `paths:` file, jika ada. Hanya ada untuk pemuatan `path_glob_match` |1381| `globs` | Pola glob path dari frontmatter `paths:` file, jika ada. Hanya ada untuk pemuatan `path_glob_match` |
1382| `trigger_file_path` | Path ke file yang aksesnya memicu pemuatan ini, untuk pemuatan lazy |1382| `trigger_file_path` | Path ke file yang aksesnya memicu pemuatan ini, untuk pemuatan lazy |
1383| `parent_file_path` | Path ke file instruksi induk yang menyertakan file ini, untuk pemuatan `include` |1383| `parent_file_path` | Path ke file instruksi induk yang menyertakan file ini, untuk pemuatan `include` |
1398 Kontrol keputusan InstructionsLoaded1398 Kontrol keputusan InstructionsLoaded
1399</h4>1399</h4>
1400 1400
1401Hook InstructionsLoaded tidak memiliki kontrol keputusan. Hook ini tidak dapat memblokir atau memodifikasi pemuatan instruksi. Claude Code membuang [kolom output JSON](#json-output) hook ini, seperti `systemMessage` dan `continue`. Gunakan event ini untuk log audit, pelacakan kepatuhan, atau observabilitas.1401Hook InstructionsLoaded tidak memiliki kontrol keputusan. Hook ini tidak dapat memblokir atau memodifikasi pemuatan instruksi. Claude Code membuang [field output JSON](#json-output)-nya, seperti `systemMessage` dan `continue`. Gunakan event ini untuk audit logging, pelacakan kepatuhan, atau observabilitas.
1402 1402
1403<h3 id="userpromptsubmit">1403<h3 id="userpromptsubmit">
1404 UserPromptSubmit1404 UserPromptSubmit
1405</h3>1405</h3>
1406 1406
1407Berjalan saat pengguna mengirimkan prompt, sebelum Claude memprosesnya. Ini memungkinkan Anda1407Berjalan ketika pengguna mengirimkan prompt, sebelum Claude memprosesnya. Ini memungkinkan Anda
1408menambahkan konteks tambahan berdasarkan prompt/percakapan, memvalidasi prompt, atau1408menambahkan konteks tambahan berdasarkan prompt/percakapan, memvalidasi prompt, atau
1409memblokir jenis prompt tertentu.1409memblokir jenis prompt tertentu.
1410 1410
1411Hook `UserPromptSubmit` memiliki timeout default 30 detik untuk jenis `command`, `http`, dan `mcp_tool`, lebih singkat daripada default 600 detik untuk jenis-jenis tersebut pada sebagian besar event lain. Karena hook ini berjalan sebelum setiap prompt dan memblokir pemrosesan model hingga selesai, hook yang macet akan menghentikan sesi. Jika hook Anda memerlukan waktu lebih lama, atur kolom `timeout` dalam entri hook.1411Hook `UserPromptSubmit` memiliki timeout default 30 detik untuk jenis `command`, `http`, dan `mcp_tool`, lebih pendek daripada default 600 detik untuk jenis tersebut pada sebagian besar event lainnya. Karena hook ini berjalan sebelum setiap prompt dan memblokir pemrosesan model hingga selesai, hook yang macet akan menghentikan sesi. Jika hook Anda membutuhkan waktu lebih lama, atur field `timeout` dalam entri hook.
1412 1412
1413Selain hook perintah yang Anda jalankan dengan [`async: true`](#run-hooks-in-the-background), hook perintah, HTTP, atau tool MCP `UserPromptSubmit` yang mencapai timeout-nya akan dibatalkan dan output-nya, termasuk `additionalContext` apa pun, dibuang. Prompt tetap sampai ke Claude tanpa konteks tersebut. Transkrip menampilkan pemberitahuan yang menyebutkan nama hook, timeout yang terpicu, dan bahwa output-nya dibuang.1413Selain hook perintah yang Anda jalankan dengan [`async: true`](#run-hooks-in-the-background), hook perintah, HTTP, atau tool MCP `UserPromptSubmit` yang mencapai timeout-nya akan dibatalkan dan output-nya, termasuk `additionalContext` apa pun, dibuang. Prompt tetap sampai ke Claude tanpa konteks tersebut. Transkrip menampilkan pemberitahuan yang menyebutkan nama hook, timeout yang terpicu, dan bahwa output telah dibuang.
1414 1414
1415[Hook callback Agent SDK](/docs/id/agent-sdk/hooks) pada `UserPromptSubmit` yang mencapai timeout-nya memblokir prompt dengan pesan yang menyebutkan nama hook dan timeout-nya, karena callback di sana dapat berfungsi sebagai gerbang kebijakan yang tidak boleh gagal secara terbuka. Sesi tetap berlanjut. Sebelum v2.1.208, timeout callback pada event tersebut mengakhiri giliran dengan error eksekusi.1415[Hook callback Agent SDK](/docs/id/agent-sdk/hooks) pada `UserPromptSubmit` yang mencapai timeout-nya akan memblokir prompt dengan pesan yang menyebutkan nama hook dan timeout, karena callback di sana dapat bertindak sebagai gerbang kebijakan yang tidak boleh gagal dalam keadaan terbuka. Sesi tetap berlanjut. Sebelum v2.1.208, timeout callback pada event tersebut mengakhiri giliran dengan error eksekusi.
1416 1416
1417<h4 id="userpromptsubmit-input">1417<h4 id="userpromptsubmit-input">
1418 Input UserPromptSubmit1418 Input UserPromptSubmit
1419</h4>1419</h4>
1420 1420
1421Selain [kolom input umum](#common-input-fields), hook UserPromptSubmit menerima kolom `prompt` yang berisi teks yang dikirimkan pengguna. Konten tempelan yang diciutkan menjadi placeholder `[Pasted text #N]` tiba dalam keadaan diperluas di tempatnya. Dalam sesi tempat Claude Code [menandai teks tempelan untuk Claude](/docs/id/terminal-config#how-claude-treats-pasted-text), konten yang diperluas tersebut berada di antara baris `<pasted_content id="…">` dan baris `</pasted_content id="…">`, jadi perhitungkan baris-baris tersebut jika hook Anda mengurai prompt.1421Selain [field input umum](#common-input-fields), hook UserPromptSubmit menerima field `prompt` yang berisi teks yang dikirimkan pengguna. Konten tempelan yang diciutkan menjadi placeholder `[Pasted text #N]` tiba dalam keadaan diperluas di tempatnya. Dalam sesi tempat Claude Code [menandai teks tempelan untuk Claude](/docs/id/terminal-config#how-claude-treats-pasted-text), konten yang diperluas tersebut berada di antara baris `<pasted_content id="…">` dan baris `</pasted_content id="…">`, jadi perhitungkan baris-baris tersebut jika hook Anda mem-parse prompt.
1422 1422
1423Hook UserPromptSubmit juga menerima `session_title` saat sesi memiliki judul kustom, dengan arti yang sama seperti [kolom `session_title` SessionStart](#sessionstart-input).1423Hook UserPromptSubmit juga menerima `session_title` ketika sesi memiliki judul kustom, dengan arti yang sama seperti [field `session_title` SessionStart](#sessionstart-input).
1424 1424
1425```json theme={null}1425```json theme={null}
1426{1426{
1437 Kontrol keputusan UserPromptSubmit1437 Kontrol keputusan UserPromptSubmit
1438</h4>1438</h4>
1439 1439
1440Hook `UserPromptSubmit` dapat mengontrol apakah prompt pengguna diproses dan menambahkan konteks. Semua [kolom output JSON](#json-output) tersedia.1440Hook `UserPromptSubmit` dapat mengontrol apakah prompt pengguna diproses dan menambahkan konteks. Semua [field output JSON](#json-output) tersedia.
1441 1441
1442Ada dua cara untuk menambahkan konteks ke percakapan pada exit code 0:1442Ada dua cara untuk menambahkan konteks ke percakapan pada exit code 0:
1443 1443
1444* **Stdout teks biasa**: Claude Code menambahkan stdout yang [diperlakukannya sebagai teks biasa](#exit-code-0) ke konteks Claude1444* **Stdout teks biasa**: Claude Code menambahkan stdout yang [diperlakukannya sebagai teks biasa](#exit-code-0) ke konteks Claude
1445* **JSON dengan `additionalContext`**: gunakan format JSON di bawah ini untuk kontrol lebih. Kolom `additionalContext` ditambahkan sebagai konteks1445* **JSON dengan `additionalContext`**: gunakan format JSON di bawah untuk kontrol lebih. Field `additionalContext` ditambahkan sebagai konteks
1446 1446
1447Kedua saluran tersebut tidak menghasilkan entri transkrip yang terlihat. Stdout biasa dan nilai `additionalContext` masing-masing disisipkan sebagai system reminder yang diawali dengan nama hook; Claude membaca keduanya. Untuk memastikan pengirimannya, periksa [log debug](#debug-hooks).1447Tidak satu pun saluran tersebut menghasilkan entri transkrip yang terlihat. Stdout biasa dan nilai `additionalContext` masing-masing disisipkan sebagai system reminder yang diawali dengan nama hook; Claude membaca keduanya. Untuk memastikan pengiriman, periksa [log debug](#debug-hooks).
1448 1448
1449Untuk memblokir prompt, kembalikan objek JSON dengan `decision` diatur ke `"block"`:1449Untuk memblokir prompt, kembalikan objek JSON dengan `decision` bernilai `"block"`:
1450 1450
1451| Kolom | Deskripsi |1451| Field | Deskripsi |
1452| :- | :- |1452| :- | :- |
1453| `decision` | `"block"` menghentikan prompt sebelum sampai ke Claude. Hilangkan agar prompt dapat berlanjut |1453| `decision` | `"block"` menghentikan prompt sebelum sampai ke Claude. Hilangkan untuk mengizinkan prompt berlanjut |
1454| `reason` | Ditampilkan kepada pengguna saat `decision` bernilai `"block"`. Tidak ditambahkan ke konteks |1454| `reason` | Ditampilkan kepada pengguna ketika `decision` bernilai `"block"`. Tidak ditambahkan ke konteks |
1455| `additionalContext` | String yang ditambahkan ke konteks Claude bersama prompt yang dikirimkan. Lihat [Menambahkan konteks untuk Claude](#add-context-for-claude) |1455| `additionalContext` | String yang ditambahkan ke konteks Claude bersama prompt yang dikirimkan. Lihat [Menambahkan konteks untuk Claude](#add-context-for-claude) |
1456| `sessionTitle` | Mengatur judul sesi. Gunakan untuk memberi nama sesi secara otomatis berdasarkan konten prompt |1456| `sessionTitle` | Mengatur judul sesi. Gunakan untuk memberi nama sesi secara otomatis berdasarkan konten prompt |
1457| `suppressOriginalPrompt` | Jika `true` saat hook memblokir prompt, teks prompt tidak disertakan dalam pesan blokir. Lihat [Apa yang ditinggalkan oleh prompt yang diblokir](#what-a-blocked-prompt-leaves-behind) |1457| `suppressOriginalPrompt` | Jika `true` ketika hook memblokir prompt, teks prompt tidak dimasukkan ke pesan blokir. Lihat [Apa yang ditinggalkan oleh prompt yang diblokir](#what-a-blocked-prompt-leaves-behind) |
1458 1458
1459Hook yang memblokir dengan keluar dengan kode 2 diarahkan dengan cara yang sama seperti `reason`: pesan blokir menampilkan teks stderr kepada pengguna, dan teks tersebut tidak ditambahkan ke konteks.1459Hook yang memblokir dengan keluar menggunakan kode 2 diarahkan dengan cara yang sama seperti `reason`: pesan blokir menampilkan teks stderr kepada pengguna, dan teks tersebut tidak ditambahkan ke konteks.
1460 1460
1461```json theme={null}1461```json theme={null}
1462{1462{
1475 Apa yang ditinggalkan oleh prompt yang diblokir1475 Apa yang ditinggalkan oleh prompt yang diblokir
1476</h4>1476</h4>
1477 1477
1478Prompt yang diblokir tidak pernah sampai ke Claude, tetapi teksnya tidak dihapus dari semua tempat. Secara default, pesan blokir yang ditampilkan kepada pengguna diakhiri dengan `Original prompt:` diikuti teks yang dikirimkan, dan Claude Code menulis pesan tersebut ke file transkrip sesi di disk. Agar teks tidak disertakan dalam pesan, cetak JSON dengan `"suppressOriginalPrompt": true` di dalam `hookSpecificOutput`. Ini berfungsi baik saat hook memblokir dengan `decision: "block"` maupun dengan keluar dengan kode 2. Hook exit-2 yang tidak mencetak JSON selalu menyertakan teks prompt dalam pesan blokirnya.1478Prompt yang diblokir tidak pernah sampai ke Claude, tetapi teksnya tidak dihapus dari semua tempat. Secara default, pesan blokir yang ditampilkan kepada pengguna diakhiri dengan `Original prompt:` diikuti teks yang dikirimkan, dan Claude Code menulis pesan tersebut ke file transkrip sesi di disk. Untuk menghilangkan teks dari pesan, cetak JSON dengan `"suppressOriginalPrompt": true` di dalam `hookSpecificOutput`. Ini berfungsi baik ketika hook memblokir dengan `decision: "block"` maupun dengan keluar menggunakan kode 2. Hook exit-2 yang tidak mencetak JSON selalu menyertakan teks prompt dalam pesan blokirnya.
1479 1479
1480`suppressOriginalPrompt` hanya mengubah pesan blokir. Teks yang dikirimkan masih dapat muncul di file lokal seperti transkrip sesi dan riwayat prompt Anda, jadi hook pemblokiran bukan cara untuk menjauhkan rahasia dari disk. Untuk membatasi atau menghapus file-file tersebut, lihat [Penyimpanan plaintext](/docs/id/claude-directory#plaintext-storage) dan [Menghapus data lokal](/docs/id/claude-directory#clear-local-data).1480`suppressOriginalPrompt` hanya mengubah pesan blokir. Teks yang dikirimkan masih dapat muncul di file lokal seperti transkrip sesi dan riwayat prompt Anda, sehingga hook yang memblokir bukanlah cara untuk menjaga rahasia agar tidak tersimpan di disk. Untuk membatasi atau menghapus file tersebut, lihat [Penyimpanan plaintext](/docs/id/claude-directory#plaintext-storage) dan [Menghapus data lokal](/docs/id/claude-directory#clear-local-data).
1481 1481
1482<h3 id="userpromptexpansion">1482<h3 id="userpromptexpansion">
1483 UserPromptExpansion1483 UserPromptExpansion
1484</h3>1484</h3>
1485 1485
1486Berjalan saat perintah yang diketik pengguna diperluas menjadi prompt sebelum sampai ke Claude. Gunakan ini untuk memblokir perintah tertentu agar tidak dipanggil secara langsung, menyisipkan konteks untuk skill tertentu, atau mencatat perintah mana yang dipanggil pengguna. Misalnya, hook yang cocok dengan `deploy` dapat memblokir `/deploy` kecuali ada file persetujuan, atau hook yang cocok dengan skill review dapat menambahkan daftar periksa review tim sebagai `additionalContext`.1486Berjalan ketika perintah yang diketik pengguna diperluas menjadi prompt sebelum sampai ke Claude. Gunakan ini untuk memblokir perintah tertentu agar tidak dipanggil secara langsung, menyisipkan konteks untuk skill tertentu, atau mencatat perintah mana yang dipanggil pengguna. Misalnya, hook yang cocok dengan `deploy` dapat memblokir `/deploy` kecuali ada file persetujuan, atau hook yang cocok dengan skill review dapat menambahkan daftar periksa review tim sebagai `additionalContext`.
1487 1487
1488Event ini mencakup jalur yang tidak dicakup `PreToolUse`: hook `PreToolUse` yang cocok dengan tool `Skill` hanya dipicu saat Claude memanggil tool tersebut, tetapi mengetik `/skillname` secara langsung melewati `PreToolUse`. `UserPromptExpansion` dipicu pada jalur langsung tersebut.1488Event ini mencakup jalur yang tidak dicakup `PreToolUse`: hook `PreToolUse` yang cocok dengan tool `Skill` hanya dipicu ketika Claude memanggil tool tersebut, tetapi mengetik `/skillname` secara langsung melewati `PreToolUse`. `UserPromptExpansion` dipicu pada jalur langsung tersebut.
1489 1489
1490Dicocokkan dengan `command_name`. Biarkan matcher kosong agar dipicu pada setiap perintah bertipe prompt.1490Mencocokkan pada `command_name`. Biarkan matcher kosong untuk memicu pada setiap perintah jenis prompt.
1491 1491
1492<h4 id="userpromptexpansion-input">1492<h4 id="userpromptexpansion-input">
1493 Input UserPromptExpansion1493 Input UserPromptExpansion
1494</h4>1494</h4>
1495 1495
1496Selain [kolom input umum](#common-input-fields), hook UserPromptExpansion menerima `expansion_type`, `command_name`, `command_args`, `command_source`, dan string `prompt` asli. Kolom `expansion_type` bernilai `slash_command` untuk skill dan perintah kustom, atau `mcp_prompt` untuk prompt server MCP.1496Selain [field input umum](#common-input-fields), hook UserPromptExpansion menerima `expansion_type`, `command_name`, `command_args`, `command_source`, dan string `prompt` asli. Field `expansion_type` bernilai `slash_command` untuk skill dan perintah kustom, atau `mcp_prompt` untuk prompt server MCP.
1497 1497
1498```json theme={null}1498```json theme={null}
1499{1499{
1514 Kontrol keputusan UserPromptExpansion1514 Kontrol keputusan UserPromptExpansion
1515</h4>1515</h4>
1516 1516
1517Hook `UserPromptExpansion` dapat memblokir perluasan atau menambahkan konteks. Semua [kolom output JSON](#json-output) tersedia.1517Hook `UserPromptExpansion` dapat memblokir perluasan atau menambahkan konteks. Semua [field output JSON](#json-output) tersedia.
1518 1518
1519| Kolom | Deskripsi |1519| Field | Deskripsi |
1520| :- | :- |1520| :- | :- |
1521| `decision` | `"block"` mencegah perintah diperluas. Hilangkan agar dapat berlanjut |1521| `decision` | `"block"` mencegah perintah diperluas. Hilangkan untuk mengizinkannya berlanjut |
1522| `reason` | Ditampilkan kepada pengguna saat `decision` bernilai `"block"` |1522| `reason` | Ditampilkan kepada pengguna ketika `decision` bernilai `"block"` |
1523| `additionalContext` | String yang ditambahkan ke konteks Claude bersama prompt yang diperluas. Lihat [Menambahkan konteks untuk Claude](#add-context-for-claude) |1523| `additionalContext` | String yang ditambahkan ke konteks Claude bersama prompt yang diperluas. Lihat [Menambahkan konteks untuk Claude](#add-context-for-claude) |
1524 1524
1525Hook yang memblokir dengan keluar dengan kode 2 diarahkan dengan cara yang sama seperti `reason`: pesan blokir menampilkan teks stderr kepada pengguna.1525Hook yang memblokir dengan keluar menggunakan kode 2 diarahkan dengan cara yang sama seperti `reason`: pesan blokir menampilkan teks stderr kepada pengguna.
1526 1526
1527```json theme={null}1527```json theme={null}
1528{1528{
1539 MessageDisplay1539 MessageDisplay
1540</h3>1540</h3>
1541 1541
1542Berjalan saat pesan asisten di-stream ke layar. Claude Code menampilkan pesan secara bertahap: setiap kali sekelompok baris yang baru selesai siap dirender, hook berjalan sekali dengan baris-baris tersebut dan Claude Code merender teks pengganti dari hook di tempatnya. Pesan yang panjang menghasilkan beberapa panggilan; pesan yang pendek mungkin hanya menghasilkan satu.1542Berjalan saat pesan asisten di-stream ke layar. Claude Code menampilkan pesan secara bertahap: setiap kali sekumpulan baris yang baru selesai siap untuk dirender, hook berjalan sekali dengan baris-baris tersebut dan Claude Code merender teks pengganti dari hook di tempatnya. Pesan panjang menghasilkan beberapa panggilan; pesan pendek mungkin hanya menghasilkan satu.
1543 1543
1544Gunakan MessageDisplay untuk:1544Gunakan MessageDisplay untuk:
1545 1545
1547* mengubah teks yang ditampilkan aplikasi Agent SDK kepada penggunanya1547* mengubah teks yang ditampilkan aplikasi Agent SDK kepada penggunanya
1548* menyamarkan kunci API atau hostname internal dari respons Claude1548* menyamarkan kunci API atau hostname internal dari respons Claude
1549 1549
1550Claude Code menahan setiap kelompok hingga hook Anda mengembalikan hasil, jadi pastikan hook tetap cepat. Jika hook gagal atau mengalami timeout, Claude Code menampilkan teks asli. Timeout default untuk event ini adalah 10 detik; jika hook Anda memerlukan waktu lebih lama, atur kolom `timeout` dalam entri hook.1550Claude Code menahan setiap kumpulan hingga hook Anda kembali, jadi jaga agar hook tetap cepat. Jika hook gagal atau mengalami timeout, Claude Code menampilkan teks asli. Timeout default untuk event ini adalah 10 detik; jika hook Anda membutuhkan waktu lebih lama, atur field `timeout` dalam entri hook.
1551 1551
1552MessageDisplay hanya untuk tampilan: teks pengganti hanya mengubah apa yang dirender di layar. Transkrip dan apa yang dilihat Claude tetap menggunakan teks asli, sehingga Claude tidak pernah melihat teks pengganti, dan mode verbose menampilkan teks asli. Hook hanya menerima teks pesan asisten, sehingga hasil tool dan teks yang Anda ketik dirender tanpa perubahan.1552MessageDisplay hanya untuk tampilan: teks pengganti hanya mengubah apa yang dirender di layar. Transkrip dan apa yang dilihat Claude tetap menggunakan teks asli, sehingga Claude tidak pernah melihat penggantinya, dan mode verbose menampilkan teks asli. Hook hanya menerima teks pesan asisten, sehingga hasil tool dan teks yang Anda ketik dirender tanpa perubahan.
1553 1553
1554MessageDisplay tidak mendukung matcher dan dipicu untuk setiap pesan asisten yang men-stream teks; pesan tanpa teks, seperti respons yang hanya berisi panggilan tool, tidak memicunya.1554MessageDisplay tidak mendukung matcher dan dipicu untuk setiap pesan asisten yang men-stream teks; pesan tanpa teks, seperti respons yang hanya berisi panggilan tool, tidak memicunya.
1555 1555
1556Dalam run non-interaktif, termasuk kueri Agent SDK dan `claude -p`, MessageDisplay berjalan sekali per pesan asisten, bukan sekali per kelompok baris. Panggilan tunggal tersebut tiba setelah pesan selesai dan membawa teks pesan lengkap: `index` bernilai `0`, `final` bernilai `true`, dan `delta` berisi seluruh pesan. Hook yang mengumpulkan teks `delta` untuk setiap pesan menerima total teks yang sama dalam kedua mode.1556Dalam run non-interaktif, termasuk kueri Agent SDK dan `claude -p`, MessageDisplay berjalan sekali per pesan asisten, bukan sekali per kumpulan baris. Panggilan tunggal tersebut tiba setelah pesan selesai dan membawa seluruh teks pesan: `index` bernilai `0`, `final` bernilai `true`, dan `delta` berisi seluruh pesan. Hook yang mengumpulkan teks `delta` untuk setiap pesan menerima total teks yang sama di kedua mode.
1557 1557
1558<h4 id="messagedisplay-input">1558<h4 id="messagedisplay-input">
1559 Input MessageDisplay1559 Input MessageDisplay
1560</h4>1560</h4>
1561 1561
1562Selain [kolom input umum](#common-input-fields), hook MessageDisplay menerima pengidentifikasi untuk giliran dan pesan, posisi panggilan ini dalam pesan, dan teks baru dalam `delta`. Batas kelompok bergantung pada cara teks di-stream, jadi gunakan `index` dan `final` untuk melacak kemajuan dalam sebuah pesan alih-alih mengharapkan baris dikelompokkan dengan cara tertentu.1562Selain [field input umum](#common-input-fields), hook MessageDisplay menerima pengidentifikasi untuk giliran dan pesan, posisi panggilan ini di dalam pesan, dan teks baru dalam `delta`. Batas kumpulan bergantung pada cara teks di-stream, jadi gunakan `index` dan `final` untuk melacak kemajuan dalam pesan alih-alih mengharapkan baris dikelompokkan dengan cara tertentu.
1563 1563
1564| Kolom | Deskripsi |1564| Field | Deskripsi |
1565| :- | :- |1565| :- | :- |
1566| `turn_id` | UUID giliran saat ini |1566| `turn_id` | UUID dari giliran saat ini |
1567| `message_id` | UUID pesan asisten yang sedang ditampilkan. Stabil di setiap kelompok dari pesan yang sama. Ini bukan id API `msg_…`, sehingga tidak dapat dikorelasikan dengan id pesan transkrip |1567| `message_id` | UUID dari pesan asisten yang sedang ditampilkan. Stabil di setiap kumpulan dari pesan yang sama. Ini bukan id `msg_…` API, sehingga tidak dapat dikorelasikan dengan id pesan transkrip |
1568| `index` | Indeks berbasis nol dari kelompok ini dalam pesan |1568| `index` | Indeks berbasis nol dari kumpulan ini di dalam pesan |
1569| `final` | `true` pada kelompok terakhir pesan. Setiap pesan memiliki tepat satu kelompok terakhir |1569| `final` | `true` pada kumpulan terakhir pesan. Setiap pesan memiliki tepat satu kumpulan final |
1570| `delta` | Baris-baris yang baru selesai sejak kelompok sebelumnya, termasuk baris baru penutup. Selalu berupa baris utuh, kecuali kelompok terakhir yang dapat berakhir di tengah baris. Dalam run interaktif, delta kelompok terakhir kosong saat pesan berakhir dengan baris baru, jadi perlakukan `final`, bukan delta yang tidak kosong, sebagai sinyal akhir pesan. Dalam run Agent SDK dan `claude -p`, panggilan tunggal membawa seluruh pesan |1570| `delta` | Baris-baris yang baru selesai sejak kumpulan sebelumnya, termasuk baris baru penutup. Selalu berupa baris utuh, kecuali kumpulan final yang dapat berakhir di tengah baris. Dalam run interaktif, delta kumpulan final kosong ketika pesan berakhir dengan baris baru, jadi perlakukan `final`, bukan delta yang tidak kosong, sebagai sinyal akhir pesan. Dalam run Agent SDK dan `claude -p`, panggilan tunggal membawa seluruh pesan |
1571 1571
1572```json theme={null}1572```json theme={null}
1573{1573{
1587 Output MessageDisplay1587 Output MessageDisplay
1588</h4>1588</h4>
1589 1589
1590Selain [kolom output JSON](#json-output) yang tersedia untuk semua hook, hook MessageDisplay dapat mengembalikan `displayContent` untuk menggantikan delta di layar:1590Selain [field output JSON](#json-output) yang tersedia untuk semua hook, hook MessageDisplay dapat mengembalikan `displayContent` untuk menggantikan delta di layar:
1591 1591
1592| Kolom | Deskripsi |1592| Field | Deskripsi |
1593| :- | :- |1593| :- | :- |
1594| `displayContent` | Teks yang ditampilkan sebagai pengganti delta. Hilangkan untuk menampilkan teks asli |1594| `displayContent` | Teks yang ditampilkan sebagai pengganti delta. Hilangkan untuk menampilkan teks asli |
1595 1595
1596Hook MessageDisplay tidak memiliki kontrol keputusan. Hook ini tidak dapat memblokir pesan atau mengubah apa yang disimpan dalam transkrip atau dikirim ke Claude. Claude Code menindaklanjuti `displayContent` dari output JSON-nya dan membuang `systemMessage` dan `continue`.1596Hook MessageDisplay tidak memiliki kontrol keputusan. Hook ini tidak dapat memblokir pesan atau mengubah apa yang disimpan di transkrip atau dikirim ke Claude. Claude Code menindaklanjuti `displayContent` dari output JSON-nya dan membuang `systemMessage` dan `continue`.
1597 1597
1598Contoh ini menghapus format markdown dari respons Claude untuk tampilan teks biasa. Skrip membaca setiap kelompok dari stdin, menghapus penanda tebal dan backtick kode inline dari `delta`, lalu mengembalikan hasilnya sebagai `displayContent`.1598Contoh ini menghapus format markdown dari respons Claude untuk tampilan teks biasa. Skrip membaca setiap kumpulan dari stdin, menghapus penanda tebal dan backtick kode inline dari `delta`, dan mengembalikan hasilnya sebagai `displayContent`.
1599 1599
1600<Tabs>1600<Tabs>
1601 <Tab title="macOS/Linux">1601 <Tab title="macOS/Linux">
1602 Daftarkan hook perintah untuk event ini di file pengaturan Anda:1602 Daftarkan hook perintah untuk event tersebut di file pengaturan Anda:
1603 1603
1604 ```json theme={null}1604 ```json theme={null}
1605 {1605 {
1654 }1654 }
1655 ```1655 ```
1656 1656
1657 Flag `-NoProfile` melewatkan pemuatan profil PowerShell Anda sehingga hook dimulai dengan cepat, dan `-ExecutionPolicy Bypass` memungkinkan PowerShell menjalankan file skrip lokal.1657 Flag `-NoProfile` melewati pemuatan profil PowerShell Anda agar hook dimulai dengan cepat, dan `-ExecutionPolicy Bypass` memungkinkan PowerShell menjalankan file skrip lokal.
1658 1658
1659 Simpan skrip ini ke `.claude/hooks/plain-display.ps1` di proyek Anda:1659 Simpan skrip ini ke `.claude/hooks/plain-display.ps1` di proyek Anda:
1660 1660
1671 </Tab>1671 </Tab>
1672</Tabs>1672</Tabs>
1673 1673
1674Kelompok tanpa markdown diteruskan tanpa perubahan. Jika skrip gagal, misalnya karena `jq` tidak ada, Claude Code menampilkan teks asli dan mencatat kegagalan tersebut hanya di [output debug](#debug-hooks), bukan di sesi.1674Kumpulan tanpa markdown diteruskan tanpa perubahan. Jika skrip gagal, misalnya karena `jq` tidak ada, Claude Code menampilkan teks asli dan mencatat kegagalan hanya di [output debug](#debug-hooks), bukan di sesi.
1675 1675
1676<h3 id="pretooluse">1676<h3 id="pretooluse">
1677 PreToolUse1677 PreToolUse
1678</h3>1678</h3>
1679 1679
1680Berjalan setelah Claude membuat parameter tool dan sebelum memproses panggilan tool. Dicocokkan dengan nama tool apa pun kecuali `EndConversation`: tool bawaan seperti `Bash`, `PowerShell`, `Edit`, `Write`, `Read`, `Glob`, `Grep`, `Agent`, `Workflow`, `WebFetch`, `WebSearch`, `AskUserQuestion`, dan `ExitPlanMode`, serta [nama tool MCP](#match-mcp-tools) apa pun.1680Berjalan setelah Claude membuat parameter tool dan sebelum memproses panggilan tool. Mencocokkan nama tool apa pun kecuali `EndConversation`: tool bawaan seperti `Bash`, `PowerShell`, `Edit`, `Write`, `Read`, `Glob`, `Grep`, `Agent`, `Workflow`, `WebFetch`, `WebSearch`, `AskUserQuestion`, dan `ExitPlanMode`, serta [nama tool MCP](#match-mcp-tools) apa pun.
1681 1681
1682Untuk menjalankan hook saat file tertentu berubah di disk, apa pun yang menulisnya, gunakan [FileChanged](#filechanged) alih-alih mencocokkan tool pengeditan file berdasarkan nama. Tidak seperti PreToolUse, Claude Code menjalankan hook FileChanged setelah perubahan terjadi, dan hook tersebut tidak memiliki kontrol keputusan, sehingga tidak dapat memblokir penulisan.1682Untuk menjalankan hook ketika file tertentu berubah di disk, apa pun yang menulisnya, gunakan [FileChanged](#filechanged) alih-alih mencocokkan tool pengedit file berdasarkan nama. Tidak seperti PreToolUse, Claude Code menjalankan hook FileChanged setelah perubahan terjadi, dan hook tersebut tidak memiliki kontrol keputusan, sehingga tidak dapat memblokir penulisan.
1683 1683
1684<Warning>1684<Warning>
1685 PreToolUse hanya berjalan saat Claude memanggil tool. File yang Anda [referensikan dengan `@` dalam prompt](/docs/id/common-workflows#reference-files-and-directories) ditambahkan tanpa panggilan tool apa pun: Claude Code menyisipkan isinya saat membangun prompt, sehingga tidak ada hook PreToolUse yang dipicu untuk file tersebut, termasuk hook yang cocok dengan `Read`. Untuk memblokir path tertentu dari referensi `@`, gunakan [aturan deny `Read`](/docs/id/permissions#read-and-edit) sebagai gantinya.1685 PreToolUse hanya berjalan ketika Claude memanggil tool. File yang Anda [referensikan dengan `@` di prompt Anda](/docs/id/common-workflows#reference-files-and-directories) ditambahkan tanpa panggilan tool apa pun: Claude Code menyisipkan isinya saat membangun prompt, sehingga tidak ada hook PreToolUse yang dipicu untuk file tersebut, termasuk hook yang cocok dengan `Read`. Untuk memblokir path tertentu dari referensi `@`, gunakan [aturan deny `Read`](/docs/id/permissions#read-and-edit) sebagai gantinya.
1686 1686
1687 PreToolUse juga tidak dipicu untuk [`EndConversation`](/docs/id/tools-reference#endconversation-tool-behavior).1687 PreToolUse juga tidak dipicu untuk [`EndConversation`](/docs/id/tools-reference#endconversation-tool-behavior).
1688</Warning>1688</Warning>
1689 1689
1690Gunakan [kontrol keputusan PreToolUse](#pretooluse-decision-control) untuk mengizinkan, menolak, meminta konfirmasi, atau menunda panggilan tool.1690Gunakan [kontrol keputusan PreToolUse](#pretooluse-decision-control) untuk mengizinkan, menolak, meminta konfirmasi, atau menangguhkan panggilan tool.
1691 1691
1692[Hook callback Agent SDK](/docs/id/agent-sdk/hooks) pada `PreToolUse` yang melebihi timeout-nya memblokir panggilan tool, dan Claude menerima hasil error yang menyebutkan timeout tersebut. Deny eksplisit yang dikembalikan oleh hook lain tetap diutamakan.1692[Hook callback Agent SDK](/docs/id/agent-sdk/hooks) pada `PreToolUse` yang melebihi timeout-nya akan memblokir panggilan tool, dan Claude menerima hasil error yang menyebutkan timeout tersebut. Deny eksplisit yang dikembalikan oleh hook lain tetap diutamakan.
1693 1693
1694<h4 id="pretooluse-input">1694<h4 id="pretooluse-input">
1695 Input PreToolUse1695 Input PreToolUse
1696</h4>1696</h4>
1697 1697
1698Selain [kolom input umum](#common-input-fields), hook PreToolUse menerima `tool_name`, `tool_input`, dan `tool_use_id`.1698Selain [field input umum](#common-input-fields), hook PreToolUse menerima `tool_name`, `tool_input`, dan `tool_use_id`.
1699 1699
1700Untuk [tool MCP](#match-mcp-tools), input juga membawa `mcp_server`, sebuah objek dengan `name` server dan `source` yang menyatakan dari mana definisi server berasal. Nilai `source` mencakup `plugin`, `sdk`, dan cakupan konfigurasi seperti `user` dan `project`. [`McpServerProvenance`](/docs/id/agent-sdk/typescript#mcpserverprovenance) dalam referensi Agent SDK mencantumkan semuanya dan menjelaskan cara memperlakukan nilai yang tidak Anda kenali. Dasarkan keputusan kepercayaan pada `source`, bukan pada `name` atau prefiks nama tool `mcp__<server>__`. Kolom `mcp_server` memerlukan Claude Code v2.1.274 atau yang lebih baru.1700Untuk [tool MCP](#match-mcp-tools), input juga membawa `mcp_server`, sebuah objek dengan `name` server dan `source` yang menyatakan asal definisi server tersebut. Nilai `source` mencakup `plugin`, `sdk`, dan cakupan konfigurasi seperti `user` dan `project`. [`McpServerProvenance`](/docs/id/agent-sdk/typescript#mcpserverprovenance) dalam referensi Agent SDK mencantumkan semuanya dan menjelaskan cara menangani nilai yang tidak Anda kenali. Dasarkan keputusan kepercayaan pada `source`, bukan pada `name` atau prefiks nama tool `mcp__<server>__`. Field `mcp_server` memerlukan Claude Code v2.1.274 atau yang lebih baru.
1701 1701
1702Untuk tool file `Write`, `Edit`, dan `Read`, `tool_input.file_path` selalu absolut:1702Untuk tool file `Write`, `Edit`, dan `Read`, `tool_input.file_path` selalu absolut:
1703 1703
1704* Claude Code memperluas `~` dan path relatif sebelum hook berjalan, sehingga hook yang mencocokkan path tidak dapat dilewati melalui `~` atau penulisan relatif dari path yang sama1704* Claude Code memperluas `~` dan path relatif sebelum hook berjalan, sehingga hook yang mencocokkan path tidak dapat dilewati melalui `~` atau penulisan relatif dari path yang sama
1705* Di Windows, path tiba dengan pemisah backslash, bahkan saat hook Anda berjalan di Git Bash tempat `$PWD` terlihat seperti `/c/project`1705* Di Windows, path tiba dengan pemisah backslash, bahkan ketika hook Anda berjalan di bawah Git Bash tempat `$PWD` terlihat seperti `/c/project`
1706* Perbandingan yang ditulis dengan garis miring maju, seperti pemeriksaan `/src/`, tidak pernah cocok dengan path backslash, dan panggilan tool berlanjut seolah-olah hook tidak memiliki apa pun untuk diblokir1706* Perbandingan yang ditulis dengan garis miring maju, seperti pemeriksaan `/src/`, tidak pernah cocok dengan path backslash, dan panggilan tool berlanjut seolah-olah hook tidak memiliki apa pun untuk diblokir
1707* Normalkan pemisah sebelum membandingkan: `FILE_PATH="${FILE_PATH//\\//}"` di Bash, atau `file_path.replace("\\", "/")` di Python, lalu cocokkan segmen path seperti `/src/` alih-alih menambatkan dengan `^`, karena path bersifat absolut1707* Normalisasikan pemisah sebelum membandingkan: `FILE_PATH="${FILE_PATH//\\//}"` di Bash, atau `file_path.replace("\\", "/")` di Python, lalu cocokkan segmen path seperti `/src/` alih-alih menjangkar dengan `^`, karena path bersifat absolut
1708 1708
1709Panggilan `Write` di Windows mengirimkan:1709Panggilan `Write` di Windows mengirimkan:
1710 1710
1720}1720}
1721```1721```
1722 1722
1723Kolom `tool_input` bergantung pada tool-nya:1723Field `tool_input` bergantung pada tool:
1724 1724
1725<a id="bash" />1725<a id="bash" />
1726 1726
1728 Bash1728 Bash
1729</h5>1729</h5>
1730 1730
1731Mengeksekusi perintah shell.1731Menjalankan perintah shell.
1732 1732
1733| Kolom | Tipe | Contoh | Deskripsi |1733| Field | Tipe | Contoh | Deskripsi |
1734| :- | :- | :- | :- |1734| :- | :- | :- | :- |
1735| `command` | string | `"npm test"` | Perintah shell yang akan dieksekusi |1735| `command` | string | `"npm test"` | Perintah shell yang akan dijalankan |
1736| `description` | string | `"Run test suite"` | Deskripsi opsional tentang apa yang dilakukan perintah |1736| `description` | string | `"Run test suite"` | Deskripsi opsional tentang apa yang dilakukan perintah |
1737| `timeout` | number | `120000` | Timeout opsional dalam milidetik. Nilai di atas [maksimum](/docs/id/tools-reference#bash-tool-behavior) dikurangi ke nilai maksimum alih-alih ditolak |1737| `timeout` | number | `120000` | Timeout opsional dalam milidetik. Nilai di atas [maksimum](/docs/id/tools-reference#bash-tool-behavior) dikurangi menjadi nilai maksimum alih-alih ditolak |
1738| `run_in_background` | boolean | `false` | Apakah perintah dijalankan di latar belakang |1738| `run_in_background` | boolean | `false` | Apakah perintah dijalankan di latar belakang |
1739 1739
1740Saat perintah Bash mengubah file di repositori Git, Claude Code dapat merekam apa yang berubah. Claude Code merekam perubahan di setiap mode izin saat pengaturan [`bashEditDiffEnabled`](/docs/id/settings-reference#basheditdiffenabled) mengaktifkan perekaman; entri pengaturan tersebut menyebutkan file mana yang dapat mengaturnya. Jika tidak, Claude Code hanya merekamnya dalam auto mode dan mode `bypassPermissions`, dan hanya saat Claude Code mengarahkan Claude untuk mengedit file melalui Bash. Atur `bashEditDiffEnabled` ke `false` untuk mematikan perekaman. Perintah latar belakang dan perintah read-only tidak membawa diff.1740Ketika perintah Bash mengubah file di repositori Git, Claude Code dapat merekam apa yang berubah. Claude Code merekam perubahan di setiap mode izin ketika pengaturan [`bashEditDiffEnabled`](/docs/id/settings-reference#basheditdiffenabled) mengaktifkan perekaman; entri pengaturan tersebut menyebutkan file mana yang dapat mengaturnya. Jika tidak, perubahan hanya direkam dalam auto mode dan mode `bypassPermissions`, dan hanya ketika Claude Code mengarahkan Claude untuk mengedit file melalui Bash. Atur `bashEditDiffEnabled` ke `false` untuk mematikan perekaman. Perintah latar belakang dan perintah read-only tidak membawa diff.
1741 1741
1742[Hook PostToolUse](#posttooluse) Anda kemudian menerima file yang berubah dalam `tool_response.bashEditDiff`. Daftar tersebut mencakup apa yang berubah di bawah repositori selama perintah berjalan. File yang diabaikan Git dan file di submodule tidak dicantumkan. Memerlukan Claude Code v2.1.269 atau yang lebih baru.1742[Hook PostToolUse](#posttooluse) Anda kemudian menerima file yang berubah di `tool_response.bashEditDiff`. Daftar tersebut mencakup apa yang berubah di bawah repositori selama perintah berjalan. File yang diabaikan Git dan file di submodule tidak dicantumkan. Memerlukan Claude Code v2.1.269 atau yang lebih baru.
1743 1743
1744<Note>1744<Note>
1745 Daftar ini bersifat upaya terbaik dan dalam beta publik. Claude Code dapat melewatkan perubahan, menyertakan file yang diubah oleh proses lain pada saat yang sama, atau berhenti pada batas ukurannya. Bentuk kolom dapat berubah. Gunakan daftar ini untuk menemukan apa yang perlu ditinjau, bukan untuk menegakkan kebijakan.1745 Daftar ini bersifat upaya terbaik dan dalam beta publik. Claude Code dapat melewatkan perubahan, menyertakan file yang diubah oleh proses lain pada saat yang sama, atau berhenti pada batas ukurannya. Bentuk field dapat berubah. Gunakan daftar ini untuk menemukan apa yang perlu ditinjau, bukan untuk menegakkan kebijakan.
1746</Note>1746</Note>
1747 1747
1748`changedFiles` dan `files` mencantumkan apa yang diubah oleh perintah; kolom-kolom lainnya menyatakan seberapa lengkap dan seberapa andal daftar tersebut.1748`changedFiles` dan `files` mencantumkan apa yang diubah perintah; field lainnya menyatakan seberapa lengkap dan seberapa andal daftar tersebut.
1749 1749
1750| Kolom | Tipe | Contoh | Deskripsi |1750| Field | Tipe | Contoh | Deskripsi |
1751| :- | :- | :- | :- |1751| :- | :- | :- | :- |
1752| `changedFiles` | array | `["/path/to/src/app.ts"]` | Path absolut file-file yang diubah oleh perintah, paling banyak 200. Ada setiap kali `files` berisi diff atau `moreFiles` di atas nol |1752| `changedFiles` | array | `["/path/to/src/app.ts"]` | Path absolut dari file yang diubah perintah, paling banyak 200. Ada setiap kali `files` berisi diff atau `moreFiles` lebih dari nol |
1753| `files` | array | `[{"filePath": "/path/to/src/app.ts", "hunks": [...]}]` | Diff dari hingga 5 file yang berubah, untuk ditampilkan. `created` atau `deleted` bernilai `true` untuk file yang ditambahkan atau dihapus oleh perintah |1753| `files` | array | `[{"filePath": "/path/to/src/app.ts", "hunks": [...]}]` | Diff dari hingga 5 file yang berubah, untuk ditampilkan. `created` atau `deleted` bernilai `true` untuk file yang ditambahkan atau dihapus perintah |
1754| `moreFiles` | number | `2` | Jumlah file yang berubah tanpa diff di `files` |1754| `moreFiles` | number | `2` | Jumlah file yang berubah tanpa diff di `files` |
1755| `unavailable` | boolean | `true` | Diatur saat diff tidak lengkap atau tidak dapat diambil |1755| `unavailable` | boolean | `true` | Diatur ketika diff tidak lengkap atau tidak dapat diambil |
1756| `skipped` | boolean | `true` | Diatur untuk perintah Git yang memindahkan working tree, seperti `git checkout` atau `git stash`, sehingga Claude Code tidak mengambil diff |1756| `skipped` | boolean | `true` | Diatur untuk perintah Git yang memindahkan working tree, seperti `git checkout` atau `git stash`, sehingga Claude Code tidak mengambil diff |
1757| `shared` | boolean | `true` | Diatur saat panggilan tool Bash lain, seperti milik subagent, berjalan di repositori yang sama pada saat yang sama, sehingga beberapa perubahan yang tercantum mungkin berasal dari perintah tersebut |1757| `shared` | boolean | `true` | Diatur ketika panggilan tool Bash lain, seperti milik subagent, berjalan di repositori yang sama pada saat yang sama, sehingga beberapa perubahan yang tercantum mungkin berasal dari perintah tersebut |
1758 1758
1759<a id="powershell" />1759<a id="powershell" />
1760 1760
1762 PowerShell1762 PowerShell
1763</h5>1763</h5>
1764 1764
1765Mengeksekusi perintah PowerShell. Lihat [tool PowerShell](/docs/id/tools-reference#powershell-tool) untuk ketersediaan berdasarkan platform.1765Menjalankan perintah PowerShell. Lihat [tool PowerShell](/docs/id/tools-reference#powershell-tool) untuk ketersediaan berdasarkan platform.
1766 1766
1767Kolom-kolomnya sama dengan tool Bash, dengan string perintah di `command`:1767Field-nya sama dengan tool Bash, dengan string perintah di `command`:
1768 1768
1769| Kolom | Tipe | Contoh | Deskripsi |1769| Field | Tipe | Contoh | Deskripsi |
1770| :- | :- | :- | :- |1770| :- | :- | :- | :- |
1771| `command` | string | `"Get-ChildItem -Recurse"` | Perintah PowerShell yang akan dieksekusi |1771| `command` | string | `"Get-ChildItem -Recurse"` | Perintah PowerShell yang akan dijalankan |
1772| `description` | string | `"List files recursively"` | Deskripsi opsional tentang apa yang dilakukan perintah |1772| `description` | string | `"List files recursively"` | Deskripsi opsional tentang apa yang dilakukan perintah |
1773| `timeout` | number | `120000` | Timeout opsional dalam milidetik |1773| `timeout` | number | `120000` | Timeout opsional dalam milidetik |
1774| `run_in_background` | boolean | `false` | Apakah perintah dijalankan di latar belakang |1774| `run_in_background` | boolean | `false` | Apakah perintah dijalankan di latar belakang |
1775 1775
1776Cocokkan `Bash|PowerShell` dalam hook yang memeriksa perintah shell, sehingga hook tersebut mencakup kedua tool:1776Cocokkan `Bash|PowerShell` dalam hook yang memeriksa perintah shell, agar mencakup kedua tool:
1777 1777
1778* Di Windows, di mana pun tool PowerShell diaktifkan, Claude memperlakukan PowerShell sebagai shell utama dan mengarahkan perintah shell melaluinya.1778* Di Windows, di mana pun tool PowerShell diaktifkan, Claude memperlakukan PowerShell sebagai shell utama dan mengarahkan perintah shell melaluinya.
1779* Di Windows tanpa Git Bash, tool ini diaktifkan secara otomatis dan Claude Code sama sekali tidak mendaftarkan tool Bash.1779* Di Windows tanpa Git Bash, tool ini diaktifkan secara otomatis dan Claude Code sama sekali tidak mendaftarkan tool Bash.
1785 1785
1786Membuat atau menimpa file.1786Membuat atau menimpa file.
1787 1787
1788| Kolom | Tipe | Contoh | Deskripsi |1788| Field | Tipe | Contoh | Deskripsi |
1789| :- | :- | :- | :- |1789| :- | :- | :- | :- |
1790| `file_path` | string | `"/path/to/file.txt"` | Path absolut ke file yang akan ditulis |1790| `file_path` | string | `"/path/to/file.txt"` | Path absolut ke file yang akan ditulis |
1791| `content` | string | `"file content"` | Konten yang akan ditulis ke file |1791| `content` | string | `"file content"` | Konten yang akan ditulis ke file |
1796 1796
1797Mengganti string dalam file yang sudah ada.1797Mengganti string dalam file yang sudah ada.
1798 1798
1799| Kolom | Tipe | Contoh | Deskripsi |1799| Field | Tipe | Contoh | Deskripsi |
1800| :- | :- | :- | :- |1800| :- | :- | :- | :- |
1801| `file_path` | string | `"/path/to/file.txt"` | Path absolut ke file yang akan diedit |1801| `file_path` | string | `"/path/to/file.txt"` | Path absolut ke file yang akan diedit |
1802| `old_string` | string | `"original text"` | Teks yang akan dicari dan diganti |1802| `old_string` | string | `"original text"` | Teks yang akan dicari dan diganti |
1807 Read1807 Read
1808</h5>1808</h5>
1809 1809
1810Membaca isi file.1810Membaca konten file.
1811 1811
1812| Kolom | Tipe | Contoh | Deskripsi |1812| Field | Tipe | Contoh | Deskripsi |
1813| :- | :- | :- | :- |1813| :- | :- | :- | :- |
1814| `file_path` | string | `"/path/to/file.txt"` | Path absolut ke file yang akan dibaca |1814| `file_path` | string | `"/path/to/file.txt"` | Path absolut ke file yang akan dibaca |
1815| `offset` | number | `10` | Nomor baris opsional untuk mulai membaca |1815| `offset` | number | `10` | Nomor baris opsional untuk mulai membaca |
1821 1821
1822Menemukan file yang cocok dengan pola glob.1822Menemukan file yang cocok dengan pola glob.
1823 1823
1824| Kolom | Tipe | Contoh | Deskripsi |1824| Field | Tipe | Contoh | Deskripsi |
1825| :- | :- | :- | :- |1825| :- | :- | :- | :- |
1826| `pattern` | string | `"**/*.ts"` | Pola glob untuk mencocokkan file |1826| `pattern` | string | `"**/*.ts"` | Pola glob untuk mencocokkan file |
1827| `path` | string | `"/path/to/dir"` | Direktori opsional untuk pencarian. Default-nya adalah direktori kerja saat ini |1827| `path` | string | `"/path/to/dir"` | Direktori opsional untuk pencarian. Default-nya adalah direktori kerja saat ini |
1830 Grep1830 Grep
1831</h5>1831</h5>
1832 1832
1833Mencari isi file dengan ekspresi reguler.1833Mencari konten file dengan regular expression.
1834 1834
1835| Kolom | Tipe | Contoh | Deskripsi |1835| Field | Tipe | Contoh | Deskripsi |
1836| :- | :- | :- | :- |1836| :- | :- | :- | :- |
1837| `pattern` | string | `"TODO.*fix"` | Pola ekspresi reguler yang akan dicari |1837| `pattern` | string | `"TODO.*fix"` | Pola regular expression yang akan dicari |
1838| `path` | string | `"/path/to/dir"` | File atau direktori opsional untuk pencarian |1838| `path` | string | `"/path/to/dir"` | File atau direktori opsional untuk pencarian |
1839| `glob` | string | `"*.ts"` | Pola glob opsional untuk memfilter file |1839| `glob` | string | `"*.ts"` | Pola glob opsional untuk memfilter file |
1840| `output_mode` | string | `"content"` | `"content"`, `"files_with_matches"`, atau `"count"`. Default-nya adalah `"files_with_matches"` |1840| `output_mode` | string | `"content"` | `"content"`, `"files_with_matches"`, atau `"count"`. Default-nya adalah `"files_with_matches"` |
1841| `-i` | boolean | `true` | Pencarian tanpa membedakan huruf besar/kecil |1841| `-i` | boolean | `true` | Pencarian tidak peka huruf besar-kecil |
1842| `multiline` | boolean | `false` | Mengaktifkan pencocokan multibaris |1842| `multiline` | boolean | `false` | Mengaktifkan pencocokan multibaris |
1843 1843
1844<h5 id="webfetch">1844<h5 id="webfetch">
1847 1847
1848Mengambil dan memproses konten web.1848Mengambil dan memproses konten web.
1849 1849
1850| Kolom | Tipe | Contoh | Deskripsi |1850| Field | Tipe | Contoh | Deskripsi |
1851| :- | :- | :- | :- |1851| :- | :- | :- | :- |
1852| `url` | string | `"https://example.com/api"` | URL untuk mengambil konten |1852| `url` | string | `"https://example.com/api"` | URL untuk mengambil konten |
1853| `prompt` | string | `"Extract the API endpoints"` | Prompt yang dijalankan pada konten yang diambil |1853| `prompt` | string | `"Extract the API endpoints"` | Prompt yang dijalankan pada konten yang diambil |
1858 1858
1859Mencari di web.1859Mencari di web.
1860 1860
1861| Kolom | Tipe | Contoh | Deskripsi |1861| Field | Tipe | Contoh | Deskripsi |
1862| :- | :- | :- | :- |1862| :- | :- | :- | :- |
1863| `query` | string | `"react hooks best practices"` | Kueri pencarian |1863| `query` | string | `"react hooks best practices"` | Kueri pencarian |
1864| `allowed_domains` | array | `["docs.example.com"]` | Opsional: hanya sertakan hasil dari domain-domain ini |1864| `allowed_domains` | array | `["docs.example.com"]` | Opsional: hanya sertakan hasil dari domain ini |
1865| `blocked_domains` | array | `["spam.example.com"]` | Opsional: kecualikan hasil dari domain-domain ini |1865| `blocked_domains` | array | `["spam.example.com"]` | Opsional: kecualikan hasil dari domain ini |
1866 1866
1867<h5 id="agent">1867<h5 id="agent">
1868 Agent1868 Agent
1869</h5>1869</h5>
1870 1870
1871Membuat [subagent](/docs/id/sub-agents).1871Memunculkan [subagent](/docs/id/sub-agents).
1872 1872
1873| Kolom | Tipe | Contoh | Deskripsi |1873| Field | Tipe | Contoh | Deskripsi |
1874| :- | :- | :- | :- |1874| :- | :- | :- | :- |
1875| `prompt` | string | `"Find all API endpoints"` | Tugas yang akan dilakukan agent |1875| `prompt` | string | `"Find all API endpoints"` | Tugas yang akan dilakukan agent |
1876| `description` | string | `"Find API endpoints"` | Deskripsi singkat tugas |1876| `description` | string | `"Find API endpoints"` | Deskripsi singkat tugas |
1877| `subagent_type` | string | `"Explore"` | Jenis agent khusus yang akan digunakan |1877| `subagent_type` | string | `"Explore"` | Jenis agent khusus yang akan digunakan |
1878| `model` | string | `"sonnet"` | Alias model opsional untuk menimpa default |1878| `model` | string | `"sonnet"` | Alias model opsional untuk menimpa default |
1879 1879
1880Saat panggilan Agent di latar depan selesai, [hook PostToolUse](#posttooluse) Anda menerima hasil dan telemetri run subagent dalam `tool_response`. Baca kolom-kolom ini untuk memeriksa run; untuk rekapitulasi token dan biaya di seluruh subagent, gunakan [penghitung token dan biaya](/docs/id/monitoring-usage#token-counter) yang difilter ke `query_source` `"subagent"`, karena `totalTokens` dan `usage` hanya mencakup permintaan terakhir:1880Ketika panggilan Agent latar depan selesai, [hook PostToolUse](#posttooluse) Anda menerima hasil subagent dan telemetri run di `tool_response`. Baca field ini untuk memeriksa run; untuk rekapitulasi token dan biaya di seluruh subagent, gunakan [penghitung token dan biaya](/docs/id/monitoring-usage#token-counter) yang difilter ke `query_source` `"subagent"`, karena `totalTokens` dan `usage` hanya mencakup permintaan terakhir:
1881 1881
1882| Kolom | Tipe | Contoh | Deskripsi |1882| Field | Tipe | Contoh | Deskripsi |
1883| :- | :- | :- | :- |1883| :- | :- | :- | :- |
1884| `status` | string | `"completed"` | `"completed"` untuk subagent foreground, `"async_launched"` untuk subagent latar belakang. Subagent berjalan di latar belakang secara default, sehingga panggilan Agent yang menghilangkan `run_in_background` juga menghasilkan `"async_launched"` |1884| `status` | string | `"completed"` | `"completed"` untuk subagent latar depan, `"async_launched"` untuk subagent latar belakang. Subagent berjalan di latar belakang secara default, sehingga panggilan Agent yang menghilangkan `run_in_background` juga menghasilkan `"async_launched"` |
1885| `agentId` | string | `"a4d2c8f1e0b3a297"` | Pengidentifikasi untuk run subagent |1885| `agentId` | string | `"a4d2c8f1e0b3a297"` | Pengidentifikasi untuk run subagent |
1886| `content` | array | `[{"type": "text", "text": "Found 12 endpoints..."}]` | Blok teks terakhir subagent, atau, untuk subagent yang laporannya melalui `SubagentHandback`, catatan singkat tentang penyerahan tersebut sebagai gantinya |1886| `content` | array | `[{"type": "text", "text": "Found 12 endpoints..."}]` | Blok teks terakhir subagent, atau, untuk subagent yang laporannya melalui `SubagentHandback`, catatan singkat tentang penyerahan tersebut sebagai penggantinya |
1887| `resolvedModel` | string | `"claude-sonnet-4-5"` | Model yang digunakan subagent saat memulai, yang dapat berbeda dari model yang diminta |1887| `resolvedModel` | string | `"claude-sonnet-4-5"` | Model tempat subagent dimulai, yang mungkin berbeda dari model yang diminta |
1888| `modelsUsed` | array | `["claude-sonnet-4-5", "claude-haiku-4-5"]` | Model yang digunakan secara berurutan, dengan pengulangan berturut-turut diciutkan; diatur hanya saat model ditukar di tengah run. Memerlukan Claude Code v2.1.212 atau yang lebih baru |1888| `modelsUsed` | array | `["claude-sonnet-4-5", "claude-haiku-4-5"]` | Model yang digunakan secara berurutan, dengan pengulangan berturut-turut diciutkan; hanya diatur ketika model diganti di tengah run. Memerlukan Claude Code v2.1.212 atau yang lebih baru |
1889| `totalTokens` | number | `12450` | Jumlah token dari permintaan API terakhir subagent: token input, output, dan cache digabungkan. Ini bukan total untuk seluruh run |1889| `totalTokens` | number | `12450` | Jumlah token dari permintaan API terakhir subagent: token input, output, dan cache digabungkan. Ini bukan total di seluruh run |
1890| `totalDurationMs` | number | `48211` | Durasi waktu nyata run subagent |1890| `totalDurationMs` | number | `48211` | Durasi waktu nyata dari run subagent |
1891| `totalToolUseCount` | number | `7` | Jumlah panggilan tool yang dilakukan subagent |1891| `totalToolUseCount` | number | `7` | Jumlah panggilan tool yang dilakukan subagent |
1892| `usage` | object | `{"input_tokens": 8320, ...}` | Rincian token per jenis dari permintaan API terakhir: `input_tokens`, `output_tokens`, `cache_creation_input_tokens`, `cache_read_input_tokens` |1892| `usage` | object | `{"input_tokens": 8320, ...}` | Rincian token per jenis dari permintaan API terakhir: `input_tokens`, `output_tokens`, `cache_creation_input_tokens`, `cache_read_input_tokens` |
1893 1893
1894Pada Claude Code v2.1.271 atau yang lebih baru, subagent yang berjalan dengan tool [`SubagentHandback`](/docs/id/tools-reference), yang disediakan Claude Code dalam [auto mode](/docs/id/permission-modes#eliminate-prompts-with-auto-mode), mengirimkan laporannya melalui tool tersebut alih-alih mengembalikannya sebagai teks. Kolom `content` dari hasil `completed`-nya kemudian membawa catatan singkat tentang penyerahan tersebut, bukan laporan itu sendiri. Untuk membaca laporan, cocokkan hook `PreToolUse` atau `PostToolUse` pada `SubagentHandback` dan baca `tool_input.message`.1894Pada Claude Code v2.1.271 atau yang lebih baru, subagent yang berjalan dengan tool [`SubagentHandback`](/docs/id/tools-reference), yang disediakan Claude Code dalam [auto mode](/docs/id/permission-modes#eliminate-prompts-with-auto-mode), mengirimkan laporannya melalui tool tersebut alih-alih mengembalikannya sebagai teks. Field `content` dari hasil `completed`-nya kemudian membawa catatan singkat tentang penyerahan tersebut, bukan laporan itu sendiri. Untuk membaca laporan, cocokkan hook `PreToolUse` atau `PostToolUse` pada `SubagentHandback` dan baca `tool_input.message`.
1895 1895
1896Untuk subagent latar belakang, tool mengembalikan hasil saat tugas berpindah ke latar belakang, sehingga `tool_response` tidak membawa kolom penggunaan: peluncuran latar belakang langsung mengembalikan hasil, dan tugas latar depan yang dipindahkan Claude Code ke latar belakang di tengah run mengembalikan hasil pada transisi tersebut. Respons ini memiliki `status: "async_launched"`, `agentId`, `description`, `prompt`, `outputFile`, dan `resolvedModel`.1896Untuk subagent latar belakang, tool kembali ketika tugas berpindah ke latar belakang, sehingga `tool_response` tidak membawa field penggunaan: peluncuran latar belakang kembali segera, dan tugas latar depan yang dipindahkan Claude Code ke latar belakang di tengah run kembali pada transisi tersebut. Field-nya adalah `status: "async_launched"`, `agentId`, `description`, `prompt`, `outputFile`, dan `resolvedModel`.
1897 1897
1898Pada respons `completed`, `resolvedModel` menyebutkan model yang digunakan subagent saat memulai, yang dapat berbeda dari nilai `model` di `tool_input`, misalnya saat `availableModels` atau override lain berlaku. Pada respons `async_launched`, `resolvedModel` menyebutkan model yang digunakan saat agent berpindah ke latar belakang, sehingga pertukaran yang terjadi sebelum pemindahan ke latar belakang tercermin di sana. `modelsUsed` dan perilaku `resolvedModel` pada saat pemindahan ke latar belakang memerlukan Claude Code v2.1.212 atau yang lebih baru.1898Pada respons `completed`, `resolvedModel` menyebutkan model tempat subagent dimulai, yang dapat berbeda dari nilai `model` di `tool_input`, seperti ketika `availableModels` atau override lain berlaku. Pada respons `async_launched`, `resolvedModel` menyebutkan model yang digunakan ketika agent berpindah ke latar belakang, sehingga penggantian yang terjadi sebelum pemindahan ke latar belakang tercermin di sana. `modelsUsed` dan perilaku `resolvedModel` saat pemindahan ke latar belakang memerlukan Claude Code v2.1.212 atau yang lebih baru.
1899 1899
1900<a id="askuserquestion" />1900<a id="askuserquestion" />
1901 1901
1905 1905
1906Mengajukan satu hingga empat pertanyaan pilihan ganda kepada pengguna.1906Mengajukan satu hingga empat pertanyaan pilihan ganda kepada pengguna.
1907 1907
1908| Kolom | Tipe | Contoh | Deskripsi |1908| Field | Tipe | Contoh | Deskripsi |
1909| :- | :- | :- | :- |1909| :- | :- | :- | :- |
1910| `questions` | array | `[{"question": "Which framework?", "header": "Framework", "options": [{"label": "React"}], "multiSelect": false}]` | Pertanyaan yang akan ditampilkan, masing-masing dengan string `question`, `header` singkat, array `options`, dan flag `multiSelect` opsional |1910| `questions` | array | `[{"question": "Which framework?", "header": "Framework", "options": [{"label": "React"}], "multiSelect": false}]` | Pertanyaan yang akan diajukan, masing-masing dengan string `question`, `header` singkat, array `options`, dan flag `multiSelect` opsional |
1911| `answers` | object | `{"Which framework?": "React"}` | Opsional. Memetakan teks pertanyaan ke label opsi yang dipilih. Jawaban pilihan ganda menggabungkan label dengan koma. Claude tidak mengatur kolom ini; berikan melalui `updatedInput` untuk menjawab secara terprogram |1911| `answers` | object | `{"Which framework?": "React"}` | Opsional. Memetakan teks pertanyaan ke label opsi yang dipilih. Jawaban multi-pilihan menggabungkan label dengan koma. Claude tidak mengatur field ini; berikan melalui `updatedInput` untuk menjawab secara terprogram |
1912 1912
1913<h5 id="exitplanmode">1913<h5 id="exitplanmode">
1914 ExitPlanMode1914 ExitPlanMode
1915</h5>1915</h5>
1916 1916
1917Menyajikan rencana dan meminta pengguna 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, sehingga `tool_input` literal dari model biasanya kosong. Claude Code menyisipkan konten rencana dan path file sebelum meneruskan input ke hook.1917Menyajikan 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, sehingga `tool_input` literal dari model biasanya kosong. Claude Code menyisipkan konten rencana dan path file sebelum meneruskan input ke hook.
1918 1918
1919| Kolom | Tipe | Contoh | Deskripsi |1919| Field | Tipe | Contoh | Deskripsi |
1920| :- | :- | :- | :- |1920| :- | :- | :- | :- |
1921| `plan` | string | `"## Refactor auth\n1. Extract..."` | Konten rencana dalam Markdown. Disisipkan dari file rencana di disk |1921| `plan` | string | `"## Refactor auth\n1. Extract..."` | Konten rencana dalam Markdown. Disisipkan dari file rencana di disk |
1922| `planFilePath` | string | `"/Users/.../plans/refactor-auth.md"` | Path ke file rencana. Disisipkan |1922| `planFilePath` | string | `"/Users/.../plans/refactor-auth.md"` | Path ke file rencana. Disisipkan |
1923| `allowedPrompts` | array | `[{"tool": "Bash", "prompt": "run tests"}]` | Deprecated. Claude Code menerima kolom ini tetapi mengabaikannya. Sebelum v2.1.205, kolom ini membawa izin berbasis prompt yang diminta Claude untuk mengimplementasikan rencana |1923| `allowedPrompts` | array | `[{"tool": "Bash", "prompt": "run tests"}]` | Deprecated. Claude Code menerima field ini tetapi mengabaikannya. Sebelum v2.1.205, field ini membawa izin berbasis prompt yang diminta Claude untuk mengimplementasikan rencana |
1924 1924
1925Di `PostToolUse`, `tool_response` adalah objek dengan kolom `plan` dan `filePath` yang berisi rencana yang disetujui, ditambah flag status internal. Baca `tool_response.plan` untuk konten rencana alih-alih membaca ulang file dari disk.1925Dalam `PostToolUse`, `tool_response` adalah objek dengan field `plan` dan `filePath` yang berisi rencana yang disetujui, ditambah flag status internal. Baca `tool_response.plan` untuk konten rencana alih-alih membaca ulang file dari disk.
1926 1926
1927<h4 id="pretooluse-decision-control">1927<h4 id="pretooluse-decision-control">
1928 Kontrol keputusan PreToolUse1928 Kontrol keputusan PreToolUse
1929</h4>1929</h4>
1930 1930
1931Hook `PreToolUse` dapat mengontrol apakah panggilan tool berlanjut. Tidak seperti hook lain yang menggunakan kolom `decision` tingkat atas, PreToolUse mengembalikan keputusannya di dalam objek `hookSpecificOutput`. Ini memberikan kontrol yang lebih kaya: empat hasil (allow, deny, ask, atau defer) ditambah kemampuan untuk memodifikasi input tool sebelum eksekusi.1931Hook `PreToolUse` dapat mengontrol apakah panggilan tool berlanjut. Tidak seperti hook lain yang menggunakan field `decision` tingkat atas, PreToolUse mengembalikan keputusannya di dalam objek `hookSpecificOutput`. Ini memberinya kontrol yang lebih kaya: empat hasil (allow, deny, ask, atau defer) ditambah kemampuan untuk memodifikasi input tool sebelum eksekusi.
1932 1932
1933| Kolom | Deskripsi |1933| Field | Deskripsi |
1934| :- | :- |1934| :- | :- |
1935| `permissionDecision` | `"allow"` melewati permintaan izin, kecuali untuk [tindakan yang tidak disetujui otomatis oleh mode apa pun](/docs/id/permission-modes#actions-no-mode-auto-approves) dan untuk `AskUserQuestion` dan `ExitPlanMode`, yang memerlukan [`updatedInput` yang dipasangkan dengannya](#allow-with-updatedinput). `"deny"` mencegah panggilan tool. `"ask"` meminta pengguna untuk mengonfirmasi. `"defer"` keluar dengan baik sehingga tool dapat dilanjutkan nanti. [Aturan deny dan ask](/docs/id/permissions#manage-permissions) tetap dievaluasi apa pun yang dikembalikan hook |1935| `permissionDecision` | `"allow"` melewati permintaan izin, kecuali untuk [tindakan yang tidak disetujui otomatis oleh mode apa pun](/docs/id/permission-modes#actions-no-mode-auto-approves) dan untuk `AskUserQuestion` dan `ExitPlanMode`, yang memerlukan [`updatedInput` yang dipasangkan dengannya](#allow-with-updatedinput). `"deny"` mencegah panggilan tool. `"ask"` meminta pengguna untuk mengonfirmasi. `"defer"` keluar dengan baik sehingga tool dapat dilanjutkan nanti. [Aturan deny dan ask](/docs/id/permissions#manage-permissions) tetap dievaluasi terlepas dari apa yang dikembalikan hook |
1936| `permissionDecisionReason` | Untuk `"ask"`, ditampilkan kepada pengguna tetapi tidak kepada Claude. Untuk `"deny"`, ditampilkan kepada Claude. Untuk `"allow"` dan `"defer"`, hanya ditulis ke [log debug](#debug-hooks) |1936| `permissionDecisionReason` | Untuk `"ask"`, ditampilkan kepada pengguna dalam permintaan izin. Ketika Claude Code [menolak panggilan](/docs/id/headless#turn-off-permission-prompts-in-unattended-runs) dalam run `-p` tempat tidak ada yang dapat menjawab permintaan tersebut, Claude membaca alasannya di hasil tool sebagai gantinya. Untuk `"deny"`, ditampilkan kepada Claude. Untuk `"allow"` dan `"defer"`, hanya ditulis ke [log debug](#debug-hooks) |
1937| `updatedInput` | Memodifikasi parameter input tool sebelum eksekusi. Menggantikan seluruh objek input, jadi sertakan kolom yang tidak berubah bersama kolom yang dimodifikasi. Claude Code mengevaluasi aturan izin dan [kelayakan auto-background](/docs/id/tools-reference#foreground-commands-that-move-to-the-background) perintah Bash terhadap input yang dikembalikan hook Anda, bukan input yang dikirim Claude. Gabungkan dengan `"allow"` untuk menyetujui otomatis, atau `"ask"` untuk menampilkan input yang dimodifikasi kepada pengguna. Untuk `"defer"`, diabaikan |1937| `updatedInput` | Memodifikasi parameter input tool sebelum eksekusi. Menggantikan seluruh objek input, jadi sertakan field yang tidak berubah bersama field yang dimodifikasi. Claude Code mengevaluasi aturan izin dan [kelayakan auto-background](/docs/id/tools-reference#foreground-commands-that-move-to-the-background) perintah Bash terhadap input yang dikembalikan hook Anda, bukan input yang dikirim Claude. Gabungkan dengan `"allow"` untuk menyetujui otomatis, atau `"ask"` untuk menampilkan input yang dimodifikasi kepada pengguna. Untuk `"defer"`, diabaikan |
1938| `additionalContext` | String yang ditambahkan ke konteks Claude bersama hasil tool. Diabaikan saat `permissionDecision` bernilai `"defer"`. Lihat [Menambahkan konteks untuk Claude](#add-context-for-claude) |1938| `additionalContext` | String yang ditambahkan ke konteks Claude bersama hasil tool. Diabaikan ketika `permissionDecision` bernilai `"defer"`. Lihat [Menambahkan konteks untuk Claude](#add-context-for-claude) |
1939 1939
1940Saat beberapa hook PreToolUse mengembalikan keputusan yang berbeda, urutan prioritasnya adalah `deny` > `defer` > `ask` > `allow`.1940Ketika beberapa hook PreToolUse mengembalikan keputusan yang berbeda, urutan prioritasnya adalah `deny` > `defer` > `ask` > `allow`.
1941 1941
1942Hook yang memblokir dengan keluar dengan kode 2 diarahkan dengan cara yang sama seperti `"deny"`: Claude melihat pesan stderr sebagai alasan penolakan.1942Hook yang memblokir dengan keluar menggunakan kode 2 diarahkan dengan cara yang sama seperti `"deny"`: Claude melihat pesan stderr sebagai alasan penolakan.
1943 1943
1944Saat hook mengembalikan `"ask"`, permintaan izin yang ditampilkan kepada pengguna menyertakan label yang mengidentifikasi asal hook: `[settings]` untuk hook dari file pengaturan mana pun atau dari frontmatter agent, `[plugin:<name>]` untuk hook plugin, atau `[skill]` untuk hook dari frontmatter skill. Ini membantu pengguna memahami sumber konfigurasi mana yang meminta konfirmasi.1944Ketika hook mengembalikan `"ask"`, permintaan izin yang ditampilkan kepada pengguna menyertakan label yang mengidentifikasi asal hook: `[settings]` untuk hook dari file pengaturan mana pun atau dari frontmatter agent, `[plugin:<name>]` untuk hook plugin, atau `[skill]` untuk hook dari frontmatter skill. Ini membantu pengguna memahami sumber konfigurasi mana yang meminta konfirmasi.
1945 1945
1946`"ask"` dari hook juga memaksa permintaan izin dalam [auto mode](/docs/id/permission-modes#eliminate-prompts-with-auto-mode): pengklasifikasi tetap dapat menolak panggilan tool, tetapi tidak dapat menyetujui panggilan tersebut secara diam-diam. Sebelum v2.1.211, pengklasifikasi dapat menyetujui perintah Bash yang berjalan di luar [sandbox](/docs/id/sandboxing) tanpa menampilkan permintaan yang diminta hook; pengklasifikasi tetap menerapkan aturan keamanannya sendiri pada perintah tersebut, dan `"deny"` dari hook selalu dihormati.1946`"ask"` dari hook juga memaksa permintaan izin dalam [auto mode](/docs/id/permission-modes#eliminate-prompts-with-auto-mode): pengklasifikasi masih dapat menolak panggilan tool, tetapi tidak dapat menyetujui panggilan tersebut secara diam-diam. Sebelum v2.1.211, pengklasifikasi dapat menyetujui perintah Bash yang berjalan di luar [sandbox](/docs/id/sandboxing) tanpa menampilkan permintaan yang diminta hook; pengklasifikasi tetap menerapkan aturan keamanannya sendiri pada perintah tersebut, dan `"deny"` dari hook selalu dihormati.
1947 1947
1948```json theme={null}1948```json theme={null}
1949{1949{
1961 1961
1962<span id="allow-with-updatedinput" />1962<span id="allow-with-updatedinput" />
1963 1963
1964Dalam [mode non-interaktif](/docs/id/headless) dengan flag `-p`, Claude Code menawarkan `AskUserQuestion` dan `ExitPlanMode` hanya saat run memiliki [host izin](/docs/id/headless#turn-off-permission-prompts-in-unattended-runs) untuk menerima permintaan, seperti callback `canUseTool` Agent SDK. Tool-tool ini memerlukan interaksi pengguna. Mengembalikan `permissionDecision: "allow"` bersama dengan `updatedInput` memenuhi persyaratan tersebut: hook membaca input tool dari stdin, mengumpulkan jawaban melalui UI Anda sendiri, dan mengembalikannya dalam `updatedInput` sehingga tool berjalan tanpa meminta konfirmasi. Mengembalikan `"allow"` saja tidak cukup untuk tool-tool ini. Untuk `AskUserQuestion`, kembalikan array `questions` asli dan tambahkan objek [`answers`](#askuserquestion) yang memetakan teks setiap pertanyaan ke jawaban yang dipilih.1964Dalam [mode non-interaktif](/docs/id/headless) dengan flag `-p`, Claude Code menawarkan `AskUserQuestion` dan `ExitPlanMode` hanya ketika run memiliki [host izin](/docs/id/headless#turn-off-permission-prompts-in-unattended-runs) untuk menerima permintaan, seperti callback `canUseTool` Agent SDK. Tool-tool ini memerlukan interaksi pengguna. Mengembalikan `permissionDecision: "allow"` bersama dengan `updatedInput` memenuhi persyaratan tersebut: hook membaca input tool dari stdin, mengumpulkan jawaban melalui UI Anda sendiri, dan mengembalikannya di `updatedInput` sehingga tool berjalan tanpa meminta. Mengembalikan `"allow"` saja tidak cukup untuk tool-tool ini. Untuk `AskUserQuestion`, kembalikan array `questions` asli dan tambahkan objek [`answers`](#askuserquestion) yang memetakan teks setiap pertanyaan ke jawaban yang dipilih.
1965 1965
1966Mulai v2.1.199, tool MCP yang ditandai server-nya dengan [`_meta["anthropic/requiresUserInteraction"]`](/docs/id/mcp#require-approval-for-a-specific-tool) lebih ketat: hook tidak dapat melewati permintaan persetujuannya dengan `"allow"`, dengan atau tanpa `updatedInput`, karena Claude Code tidak dapat memastikan bahwa hook telah mengumpulkan interaksi yang dibutuhkan tool tersebut.1966Tool MCP yang ditandai server-nya dengan [`_meta["anthropic/requiresUserInteraction"]`](/docs/id/mcp#require-approval-for-a-specific-tool) lebih ketat: hook tidak dapat melewati permintaan persetujuannya dengan `"allow"`, dengan atau tanpa `updatedInput`, karena Claude Code tidak dapat memastikan bahwa hook telah mengumpulkan interaksi yang dibutuhkan tool tersebut.
1967 1967
1968<Note>1968<Note>
1969 PreToolUse sebelumnya menggunakan kolom `decision` dan `reason` tingkat atas, tetapi kolom-kolom ini sudah deprecated untuk event ini. Gunakan `hookSpecificOutput.permissionDecision` dan `hookSpecificOutput.permissionDecisionReason` sebagai gantinya. Nilai deprecated `"approve"` dan `"block"` masing-masing dipetakan ke `"allow"` dan `"deny"`. Event lain seperti PostToolUse dan Stop tetap menggunakan `decision` dan `reason` tingkat atas sebagai format saat ini.1969 PreToolUse sebelumnya menggunakan field `decision` dan `reason` tingkat atas, tetapi field tersebut sudah deprecated untuk event ini. Gunakan `hookSpecificOutput.permissionDecision` dan `hookSpecificOutput.permissionDecisionReason` sebagai gantinya. Nilai deprecated `"approve"` dan `"block"` masing-masing dipetakan ke `"allow"` dan `"deny"`. Event lain seperti PostToolUse dan Stop tetap menggunakan `decision` dan `reason` tingkat atas sebagai format terkininya.
1970</Note>1970</Note>
1971 1971
1972<h4 id="defer-a-tool-call-for-later">1972<h4 id="defer-a-tool-call-for-later">
1973 Menunda panggilan tool untuk nanti1973 Menangguhkan panggilan tool untuk nanti
1974</h4>1974</h4>
1975 1975
1976`"defer"` ditujukan untuk integrasi yang menjalankan `claude -p` sebagai subproses dan membaca output JSON-nya, seperti aplikasi Agent SDK atau UI kustom yang dibangun di atas Claude Code. Nilai ini memungkinkan proses pemanggil menjeda Claude pada panggilan tool, mengumpulkan input melalui antarmukanya sendiri, dan melanjutkan dari titik terakhir. Claude Code hanya menghormati nilai ini dalam [mode non-interaktif](/docs/id/headless) dengan flag `-p`. Dalam sesi interaktif, Claude Code mencatat peringatan ke log dan mengabaikan hasil hook.1976`"defer"` ditujukan untuk integrasi yang menjalankan `claude -p` sebagai subproses dan membaca output JSON-nya, seperti aplikasi Agent SDK atau UI kustom yang dibangun di atas Claude Code. Ini memungkinkan proses pemanggil tersebut menjeda Claude pada panggilan tool, mengumpulkan input melalui antarmukanya sendiri, dan melanjutkan dari titik terakhir. Claude Code hanya menghormati nilai ini dalam [mode non-interaktif](/docs/id/headless) dengan flag `-p`. Dalam sesi interaktif, Claude Code mencatat peringatan dan mengabaikan hasil hook.
1977 1977
1978Tool `AskUserQuestion` adalah kasus yang umum: Claude ingin menanyakan sesuatu kepada pengguna, tetapi tidak ada terminal untuk menjawabnya. Run `-p` menawarkan `AskUserQuestion` hanya saat memiliki [host izin](/docs/id/headless#turn-off-permission-prompts-in-unattended-runs), seperti tool MCP yang Anda berikan dengan `--permission-prompt-tool`, jadi mulai run dengan salah satunya. Alur bolak-baliknya bekerja seperti ini:1978Tool `AskUserQuestion` adalah kasus yang umum: Claude ingin menanyakan sesuatu kepada pengguna, tetapi tidak ada terminal untuk menjawabnya. Run `-p` hanya menawarkan `AskUserQuestion` ketika memiliki [host izin](/docs/id/headless#turn-off-permission-prompts-in-unattended-runs), seperti tool MCP yang Anda teruskan dengan `--permission-prompt-tool`, jadi mulai run dengan salah satunya. Alur bolak-baliknya bekerja seperti ini:
1979 1979
19801. Claude memanggil `AskUserQuestion`. Hook `PreToolUse` dipicu.19801. Claude memanggil `AskUserQuestion`. Hook `PreToolUse` dipicu.
19812. Hook mengembalikan `permissionDecision: "defer"`. Tool tidak dieksekusi. Proses keluar dengan `stop_reason: "tool_deferred"` dan panggilan tool yang tertunda dipertahankan dalam transkrip.19812. Hook mengembalikan `permissionDecision: "defer"`. Tool tidak dieksekusi. Proses keluar dengan `stop_reason: "tool_deferred"` dan panggilan tool yang tertunda disimpan di transkrip.
19823. Proses pemanggil membaca `deferred_tool_use` dari hasil SDK, menampilkan pertanyaan di UI-nya sendiri, dan menunggu jawaban.19823. Proses pemanggil membaca `deferred_tool_use` dari hasil SDK, menampilkan pertanyaan di UI-nya sendiri, dan menunggu jawaban.
19834. Proses pemanggil menjalankan `claude -p --resume <session-id>` dengan host izin yang sama. Panggilan tool yang sama memicu `PreToolUse` lagi.19834. Proses pemanggil menjalankan `claude -p --resume <session-id>` dengan host izin yang sama. Panggilan tool yang sama memicu `PreToolUse` lagi.
19845. Hook mengembalikan `permissionDecision: "allow"` dengan jawaban di `updatedInput`. Tool dieksekusi dan Claude melanjutkan.19845. Hook mengembalikan `permissionDecision: "allow"` dengan jawaban di `updatedInput`. Tool dieksekusi dan Claude melanjutkan.
1985 1985
1986Kolom `deferred_tool_use` membawa `id`, `name`, dan `input` tool. `input` adalah parameter yang dihasilkan Claude untuk panggilan tool, ditangkap sebelum eksekusi:1986Field `deferred_tool_use` membawa `id`, `name`, dan `input` dari tool. `input` adalah parameter yang dihasilkan Claude untuk panggilan tool, yang ditangkap sebelum eksekusi:
1987 1987
1988```json theme={null}1988```json theme={null}
1989{1989{
1999}1999}
2000```2000```
2001 2001
2002Tidak ada timeout atau batas retry. Sesi tetap ada di disk hingga Anda melanjutkannya, tunduk pada pembersihan retensi [`cleanupPeriodDays`](/docs/id/settings-reference#cleanupperioddays), yang menghapus file sesi setelah 30 hari secara default, mengikuti [aturan pembersihan retensi](/docs/id/claude-directory#cleaned-up-automatically). Jika jawaban belum siap saat Anda melanjutkan, hook dapat mengembalikan `"defer"` lagi dan proses keluar dengan cara yang sama. Proses pemanggil mengontrol kapan loop dihentikan dengan akhirnya mengembalikan `"allow"` atau `"deny"` dari hook.2002Tidak ada timeout atau batas retry. Sesi tetap tersimpan di disk hingga Anda melanjutkannya, dengan tunduk pada pembersihan retensi [`cleanupPeriodDays`](/docs/id/settings-reference#cleanupperioddays), yang menghapus file sesi setelah 30 hari secara default, mengikuti [aturan pembersihan retensi](/docs/id/claude-directory#cleaned-up-automatically). Jika jawaban belum siap saat Anda melanjutkan, hook dapat mengembalikan `"defer"` lagi dan proses keluar dengan cara yang sama. Proses pemanggil mengontrol kapan memutus perulangan dengan pada akhirnya mengembalikan `"allow"` atau `"deny"` dari hook.
2003 2003
2004`"defer"` hanya berfungsi saat Claude melakukan satu panggilan tool dalam giliran tersebut. Jika Claude melakukan beberapa panggilan tool sekaligus, `"defer"` diabaikan dengan peringatan dan tool berlanjut melalui alur izin normal. Batasan ini ada karena resume hanya dapat menjalankan ulang satu tool: tidak ada cara untuk menunda satu panggilan dari sekelompok panggilan tanpa membiarkan panggilan lainnya tidak terselesaikan.2004`"defer"` hanya berfungsi ketika Claude melakukan satu panggilan tool dalam giliran tersebut. Jika Claude melakukan beberapa panggilan tool sekaligus, `"defer"` diabaikan dengan peringatan dan tool berlanjut melalui alur izin normal. Batasan ini ada karena resume hanya dapat menjalankan ulang satu tool: tidak ada cara untuk menangguhkan satu panggilan dari sekumpulan panggilan tanpa membiarkan yang lain tidak terselesaikan.
2005 2005
2006Jika tool yang ditunda tidak lagi tersedia saat Anda melanjutkan, proses keluar dengan `stop_reason: "tool_deferred_unavailable"` dan `is_error: true` sebelum hook dipicu. Ini terjadi saat server MCP yang menyediakan tool tersebut tidak terhubung untuk sesi yang dilanjutkan. Payload `deferred_tool_use` tetap disertakan sehingga Anda dapat mengidentifikasi tool mana yang hilang.2006Jika tool yang ditangguhkan tidak lagi tersedia saat Anda melanjutkan, proses keluar dengan `stop_reason: "tool_deferred_unavailable"` dan `is_error: true` sebelum hook dipicu. Ini terjadi ketika server MCP yang menyediakan tool tidak terhubung untuk sesi yang dilanjutkan. Payload `deferred_tool_use` tetap disertakan sehingga Anda dapat mengidentifikasi tool mana yang hilang.
2007 2007
2008<Note>2008<Note>
2009 Untuk melanjutkan sesi yang ditunda dalam plan mode, berikan [`--permission-prompt-tool`](/docs/id/cli-reference#cli-flags) bersama `--resume` agar Claude Code dapat menyajikan rencana untuk persetujuan. Jika Anda memberikan flag peluncuran tertentu lainnya, run yang dilanjutkan tidak kembali ke plan mode; lihat [Melanjutkan dalam plan mode dengan `-p`](/docs/id/sessions#resume-in-plan-mode-with-p). Memerlukan Claude Code v2.1.246 atau yang lebih baru.2009 Untuk melanjutkan sesi yang ditangguhkan dalam plan mode, teruskan [`--permission-prompt-tool`](/docs/id/cli-reference#cli-flags) bersama `--resume` agar Claude Code dapat menyajikan rencana untuk disetujui. Jika Anda meneruskan flag peluncuran tertentu lainnya, run yang dilanjutkan tidak kembali ke plan mode; lihat [Melanjutkan dalam plan mode dengan `-p`](/docs/id/sessions#resume-in-plan-mode-with-p). Memerlukan Claude Code v2.1.246 atau yang lebih baru.
2010 2010
2011 Saat Anda melanjutkan dengan `-p`, Claude Code tidak memulihkan mode izin tersimpan lainnya. Claude Code memulai run dalam mode izin yang akan digunakan oleh run `claude -p` baru, jadi berikan `--permission-mode` atau `--dangerously-skip-permissions` lagi jika sesi yang ditunda menggunakan salah satunya. Saat Anda melanjutkan dengan `claude --resume <session-id>` tanpa `-p`, Claude Code memulihkan mode izin yang tersimpan, dengan pengecualian yang tercantum di [mode izin saat melanjutkan](/docs/id/sessions#permission-mode-on-resume).2011 Ketika Anda melanjutkan dengan `-p`, Claude Code tidak memulihkan mode izin tersimpan lainnya. Claude Code memulai run dalam mode izin yang akan digunakan oleh run `claude -p` baru, jadi teruskan `--permission-mode` atau `--dangerously-skip-permissions` lagi jika sesi yang ditangguhkan menggunakannya. Ketika Anda melanjutkan dengan `claude --resume <session-id>` tanpa `-p`, Claude Code memulihkan mode izin yang tersimpan, dengan pengecualian yang tercantum di [mode izin saat resume](/docs/id/sessions#permission-mode-on-resume).
2012</Note>2012</Note>
2013 2013
2014<h3 id="permissionrequest">2014<h3 id="permissionrequest">
2015 PermissionRequest2015 PermissionRequest
2016</h3>2016</h3>
2017 2017
2018Berjalan ketika Claude Code akan meminta izin Anda untuk menggunakan tool. Dalam sesi yang tidak dapat menampilkan permintaan, seperti subagent latar belakang dalam [mode non-interaktif](/docs/id/headless), Claude Code tetap menjalankan hook ini, dan jika tidak ada hook yang mengembalikan keputusan, Claude Code menolak panggilan tool. Untuk panggilan yang mencapai `--permission-prompt-tool` atau [callback `canUseTool`](/docs/id/agent-sdk/permissions) Agent SDK, hook berjalan bersama host Anda, dan mana pun yang memutuskan terlebih dahulu yang berlaku.2018Berjalan ketika Claude Code akan meminta izin Anda untuk menggunakan tool. Dalam sesi yang tidak dapat menampilkan permintaan, seperti subagent latar belakang dalam [mode non-interaktif](/docs/id/headless), Claude Code tetap menjalankan hook ini, dan jika tidak ada hook yang mengembalikan keputusan, Claude Code menolak panggilan tool. Untuk panggilan yang mencapai `--permission-prompt-tool` atau [callback `canUseTool`](/docs/id/agent-sdk/permissions) Agent SDK, hook berjalan bersama host Anda, dan mana pun yang memutuskan lebih dulu yang berlaku.
2019Gunakan [kontrol keputusan PermissionRequest](#permissionrequest-decision-control) untuk mengizinkan atau menolak atas nama pengguna.2019Gunakan [kontrol keputusan PermissionRequest](#permissionrequest-decision-control) untuk mengizinkan atau menolak atas nama pengguna.
2020 2020
2021Gunakan event ini saat Anda memerlukan sinyal tepat pada saat Claude meminta izin untuk menggunakan tool. Claude Code menjalankan hook [Notification](#notification) dengan jenis `permission_prompt` hanya setelah permintaan izin menunggu sekitar enam detik.2021Gunakan event ini ketika Anda membutuhkan sinyal pada saat Claude meminta izin untuk menggunakan tool. Claude Code menjalankan hook [Notification](#notification) dengan jenis `permission_prompt` hanya setelah permintaan menunggu sekitar enam detik.
2022 2022
2023Claude Code tidak menjalankan hook PermissionRequest untuk [permintaan jaringan](/docs/id/sandboxing#network-isolation) dari perintah yang berjalan dalam sandbox. Untuk mendapatkan sinyal untuk permintaan izin tersebut, gunakan jenis notifikasi `permission_prompt`.2023Claude Code tidak menjalankan hook PermissionRequest untuk [permintaan jaringan](/docs/id/sandboxing#network-isolation) dari perintah yang di-sandbox. Untuk mendapatkan sinyal untuk permintaan tersebut, gunakan jenis notifikasi `permission_prompt`.
2024 2024
2025Dicocokkan dengan nama tool, nilai yang sama seperti PreToolUse.2025Mencocokkan pada nama tool, dengan nilai yang sama seperti PreToolUse.
2026 2026
2027<h4 id="permissionrequest-input">2027<h4 id="permissionrequest-input">
2028 Input PermissionRequest2028 Input PermissionRequest
2029</h4>2029</h4>
2030 2030
2031Hook PermissionRequest menerima kolom `tool_name` dan `tool_input` seperti hook PreToolUse, tetapi tanpa `tool_use_id`. Untuk tool MCP, hook ini juga menerima objek [`mcp_server`](#pretooluse-input). Array `permission_suggestions` opsional berisi [pembaruan izin](#permission-update-entries) yang disarankan Claude Code untuk permintaan ini, seperti menambahkan aturan allow atau mengubah mode izin.2031Hook PermissionRequest menerima field `tool_name` dan `tool_input` seperti hook PreToolUse, tetapi tanpa `tool_use_id`. Untuk tool MCP, hook ini juga menerima objek [`mcp_server`](#pretooluse-input). Array `permission_suggestions` opsional berisi [pembaruan izin](#permission-update-entries) yang disarankan Claude Code untuk permintaan ini, seperti menambahkan aturan allow atau mengubah mode izin.
2032 2032
2033Array `permission_suggestions` bukan daftar persis dari opsi yang Anda lihat, karena setiap dialog izin membangun opsinya sendiri. Beberapa dialog, seperti dialog untuk pengeditan file, sama sekali tidak membaca array tersebut dan menurunkan opsinya dari permintaan itu sendiri. Dialog yang membacanya tetap dapat menahan opsi yang sarannya tetap ada di array, misalnya saat [`allowManagedPermissionRulesOnly`](/docs/id/settings-reference#allowmanagedpermissionrulesonly) menyembunyikan opsi penyimpanan aturan. Dialog juga dapat menawarkan opsi yang tidak memiliki entri saran, seperti [**Yes, and switch to auto mode**](/docs/id/permission-modes#switch-permission-modes), yang mengubah mode izin secara langsung alih-alih melalui pembaruan izin.2033Array `permission_suggestions` bukanlah daftar persis dari opsi yang Anda lihat, karena setiap dialog izin membangun opsinya sendiri. Beberapa dialog, seperti dialog untuk pengeditan file, sama sekali tidak membaca array tersebut dan menurunkan opsinya dari permintaan itu sendiri. Dialog yang membacanya masih dapat menahan opsi yang sarannya tetap ada di array, misalnya ketika [`allowManagedPermissionRulesOnly`](/docs/id/settings-reference#allowmanagedpermissionrulesonly) menyembunyikan opsi penyimpanan aturan. Dialog juga dapat menawarkan opsi yang tidak memiliki entri saran, seperti [**Yes, and switch to auto mode**](/docs/id/permission-modes#switch-permission-modes), yang mengubah mode izin secara langsung alih-alih melalui pembaruan izin.
2034 2034
2035Hook PreToolUse berjalan sebelum setiap panggilan tool, baik memerlukan izin maupun tidak. Hook PermissionRequest hanya berjalan saat Claude Code akan meminta izin Anda, atau saat Claude Code akan menolak secara otomatis panggilan yang tidak dapat menampilkan permintaan izin. Kedua event tersebut tidak dipicu untuk [`EndConversation`](/docs/id/tools-reference#endconversation-tool-behavior).2035Hook PreToolUse berjalan sebelum setiap panggilan tool, baik memerlukan izin maupun tidak. Hook PermissionRequest hanya berjalan ketika Claude Code akan meminta izin Anda, atau ketika Claude Code sebaliknya akan menolak otomatis panggilan yang tidak dapat menampilkan permintaan. Tidak satu pun event tersebut dipicu untuk [`EndConversation`](/docs/id/tools-reference#endconversation-tool-behavior).
2036 2036
2037```json theme={null}2037```json theme={null}
2038{2038{
2061 Kontrol keputusan PermissionRequest2061 Kontrol keputusan PermissionRequest
2062</h4>2062</h4>
2063 2063
2064Hook `PermissionRequest` dapat mengizinkan atau menolak permintaan izin. Selain [kolom output JSON](#json-output) yang tersedia untuk semua hook, skrip hook Anda dapat mengembalikan objek `decision` dengan kolom khusus event berikut:2064Hook `PermissionRequest` dapat mengizinkan atau menolak permintaan izin. Selain [field output JSON](#json-output) yang tersedia untuk semua hook, skrip hook Anda dapat mengembalikan objek `decision` dengan field khusus event berikut:
2065 2065
2066| Kolom | Deskripsi |2066| Field | Deskripsi |
2067| :- | :- |2067| :- | :- |
2068| `behavior` | `"allow"` memberikan izin, `"deny"` menolaknya. [Aturan deny dan ask](/docs/id/permissions#manage-permissions) tetap dievaluasi, sehingga hook yang mengembalikan `"allow"` tidak menimpa aturan deny yang cocok |2068| `behavior` | `"allow"` memberikan izin, `"deny"` menolaknya. [Aturan deny dan ask](/docs/id/permissions#manage-permissions) tetap dievaluasi, sehingga hook yang mengembalikan `"allow"` tidak menimpa aturan deny yang cocok |
2069| `updatedInput` | Hanya untuk `"allow"`: memodifikasi parameter input tool sebelum eksekusi. Menggantikan seluruh objek input, jadi sertakan kolom yang tidak berubah bersama kolom yang dimodifikasi. Input yang dimodifikasi dievaluasi ulang terhadap aturan deny dan ask |2069| `updatedInput` | Hanya untuk `"allow"`: memodifikasi parameter input tool sebelum eksekusi. Menggantikan seluruh objek input, jadi sertakan field yang tidak berubah bersama field yang dimodifikasi. Input yang dimodifikasi dievaluasi ulang terhadap aturan deny dan ask |
2070| `updatedPermissions` | Hanya untuk `"allow"`: array [entri pembaruan izin](#permission-update-entries) yang akan diterapkan, seperti menambahkan aturan allow atau mengubah mode izin sesi |2070| `updatedPermissions` | Hanya untuk `"allow"`: array [entri pembaruan izin](#permission-update-entries) yang akan diterapkan, seperti menambahkan aturan allow atau mengubah mode izin sesi |
2071| `message` | Hanya untuk `"deny"`: memberi tahu Claude mengapa izin ditolak |2071| `message` | Hanya untuk `"deny"`: memberi tahu Claude mengapa izin ditolak |
2072| `interrupt` | Hanya untuk `"deny"`: jika `true`, menghentikan Claude |2072| `interrupt` | Hanya untuk `"deny"`: jika `true`, menghentikan Claude |
2091 Entri pembaruan izin2091 Entri pembaruan izin
2092</h4>2092</h4>
2093 2093
2094Kolom output `updatedPermissions` dan [kolom input `permission_suggestions`](#permissionrequest-input) sama-sama menggunakan array objek entri yang sama. Setiap entri memiliki `type` yang menentukan kolom-kolom lainnya, dan `destination` yang mengontrol tempat perubahan ditulis.2094Field output `updatedPermissions` dan [field input `permission_suggestions`](#permissionrequest-input) keduanya menggunakan array objek entri yang sama. Setiap entri memiliki `type` yang menentukan field lainnya, dan `destination` yang mengontrol tempat perubahan ditulis.
2095 2095
2096| `type` | Kolom | Efek |2096| `type` | Field | Efek |
2097| :- | :- | :- |2097| :- | :- | :- |
2098| `addRules` | `rules`, `behavior`, `destination` | Menambahkan aturan izin. `rules` adalah array objek `{toolName, ruleContent?}`. Hilangkan `ruleContent` untuk mencocokkan seluruh tool. `behavior` bernilai `"allow"`, `"deny"`, atau `"ask"` |2098| `addRules` | `rules`, `behavior`, `destination` | Menambahkan aturan izin. `rules` adalah array objek `{toolName, ruleContent?}`. Hilangkan `ruleContent` untuk mencocokkan seluruh tool. `behavior` bernilai `"allow"`, `"deny"`, atau `"ask"` |
2099| `replaceRules` | `rules`, `behavior`, `destination` | Mengganti semua aturan dengan `behavior` yang diberikan di `destination` dengan `rules` yang disediakan |2099| `replaceRules` | `rules`, `behavior`, `destination` | Mengganti semua aturan dengan `behavior` yang diberikan di `destination` dengan `rules` yang disediakan |
2103| `removeDirectories` | `directories`, `destination` | Menghapus direktori kerja |2103| `removeDirectories` | `directories`, `destination` | Menghapus direktori kerja |
2104 2104
2105<Note>2105<Note>
2106 `setMode` dengan `bypassPermissions` hanya berlaku jika Anda meluncurkan sesi dengan mode bypass yang sudah tersedia: `--dangerously-skip-permissions`, `--permission-mode bypassPermissions`, `--allow-dangerously-skip-permissions`, atau `permissions.defaultMode: "bypassPermissions"` di [pengaturan pengguna, `--settings`, atau pengaturan terkelola](/docs/id/settings-reference#permissions-defaultmode). Jika tidak, pembaruan tersebut tidak berpengaruh apa pun. Pembaruan juga tidak berpengaruh apa pun ketika [`permissions.disableBypassPermissionsMode`](/docs/id/permissions#managed-settings) menonaktifkan mode tersebut, atau ketika sesi dimulai dalam [mode terbatas](/docs/id/cli-reference#cli-flags).2106 `setMode` dengan `bypassPermissions` hanya berlaku jika Anda meluncurkan sesi dengan mode bypass yang sudah tersedia: `--dangerously-skip-permissions`, `--permission-mode bypassPermissions`, `--allow-dangerously-skip-permissions`, atau `permissions.defaultMode: "bypassPermissions"` di [pengaturan pengguna, `--settings`, atau pengaturan terkelola](/docs/id/settings-reference#permissions-defaultmode). Jika tidak, pembaruan tersebut tidak berpengaruh apa pun. Pembaruan tersebut juga tidak berpengaruh ketika [`permissions.disableBypassPermissionsMode`](/docs/id/permissions#managed-settings) menonaktifkan mode tersebut, atau ketika sesi dimulai dalam [mode terbatas](/docs/id/cli-reference#cli-flags).
2107 2107
2108 `bypassPermissions` tidak pernah disimpan sebagai `defaultMode` terlepas dari nilai `destination`.2108 `bypassPermissions` tidak pernah disimpan sebagai `defaultMode` terlepas dari `destination`.
2109</Note>2109</Note>
2110 2110
2111Field `destination` pada setiap entri menentukan apakah perubahan tetap berada di memori atau disimpan ke file pengaturan.2111Field `destination` pada setiap entri menentukan apakah perubahan tetap berada di memori atau disimpan ke file pengaturan.
2123 PostToolUse2123 PostToolUse
2124</h3>2124</h3>
2125 2125
2126Berjalan segera setelah sebuah tool berhasil diselesaikan.2126Berjalan segera setelah sebuah tool selesai dengan sukses.
2127 2127
2128Mencocokkan berdasarkan nama tool, dengan nilai yang sama seperti PreToolUse.2128Mencocokkan berdasarkan nama tool, dengan nilai yang sama seperti PreToolUse.
2129 2129
2130Lakukan pencocokan yang lebih luas ketika nama tool bukan filter yang tepat:2130Cocokkan secara lebih luas ketika nama tool bukan filter yang tepat:
2131 2131
2132* Untuk menjalankan hook setelah tool apa pun berhasil diselesaikan, hilangkan `matcher` atau atur ke `"*"`. Hook Anda kemudian dapat mengetahui sendiri apa yang berubah, misalnya dengan menjalankan `git status --porcelain`, yang juga mencantumkan file yang tidak dilacak yang terlewat oleh `git diff`. Untuk panggilan tool yang gagal, tambahkan hook yang sama di bawah [PostToolUseFailure](#posttoolusefailure).2132* Untuk menjalankan hook setelah tool apa pun selesai dengan sukses, hilangkan `matcher` atau atur ke `"*"`. Hook Anda kemudian dapat menemukan sendiri apa yang berubah, misalnya dengan menjalankan `git status --porcelain`, yang juga mencantumkan file yang tidak terlacak yang terlewat oleh `git diff`. Untuk panggilan tool yang gagal, tambahkan hook yang sama di bawah [PostToolUseFailure](#posttoolusefailure).
2133* Untuk menjalankan hook ketika file tertentu berubah di disk, apa pun yang menulisnya, gunakan [FileChanged](#filechanged). Claude Code tidak menjalankan hook `PostToolUse` yang mencocokkan `Edit|Write` ketika perintah `Bash` atau proses di luar Claude Code menulis ulang file yang sama.2133* Untuk menjalankan hook ketika file tertentu berubah di disk, apa pun yang menulisnya, gunakan [FileChanged](#filechanged). Claude Code tidak menjalankan hook `PostToolUse` yang mencocokkan `Edit|Write` ketika perintah `Bash` atau proses di luar Claude Code menulis ulang file yang sama.
2134 2134
2135<h4 id="posttooluse-input">2135<h4 id="posttooluse-input">
2136 Input PostToolUse2136 Input PostToolUse
2137</h4>2137</h4>
2138 2138
2139Hook `PostToolUse` dipicu setelah sebuah tool berhasil dieksekusi. Input mencakup `tool_input`, yaitu argumen yang dikirim ke tool, dan `tool_response`, yaitu hasil yang dikembalikannya. Skema persis untuk keduanya bergantung pada tool. Path `tool_input` pada tool file datang dalam format yang sama seperti untuk [PreToolUse](#pretooluse-input): selalu absolut, dengan pemisah native platform, sehingga menggunakan backslash di Windows. Untuk tool MCP, input juga membawa objek [`mcp_server`](#pretooluse-input).2139Hook `PostToolUse` dipicu setelah sebuah tool sudah dieksekusi dengan sukses. Input mencakup `tool_input`, yaitu argumen yang dikirim ke tool, dan `tool_response`, yaitu hasil yang dikembalikannya. Skema persis untuk keduanya bergantung pada tool. Path `tool_input` untuk tool file tiba dalam format yang sama seperti untuk [PreToolUse](#pretooluse-input): selalu absolut, dengan pemisah native platform, jadi backslash di Windows. Untuk tool MCP, input juga membawa objek [`mcp_server`](#pretooluse-input).
2140 2140
2141```json theme={null}2141```json theme={null}
2142{2142{
2172| Field | Deskripsi |2172| Field | Deskripsi |
2173| :- | :- |2173| :- | :- |
2174| `decision` | `"block"` menambahkan `reason` di samping hasil tool. Claude tetap melihat output asli; untuk menggantinya, gunakan `updatedToolOutput` |2174| `decision` | `"block"` menambahkan `reason` di samping hasil tool. Claude tetap melihat output asli; untuk menggantinya, gunakan `updatedToolOutput` |
2175| `reason` | Penjelasan yang ditampilkan kepada Claude ketika `decision` adalah `"block"` |2175| `reason` | Penjelasan yang ditampilkan kepada Claude ketika `decision` bernilai `"block"` |
2176| `additionalContext` | String yang ditambahkan ke konteks Claude bersama hasil tool. Lihat [Menambahkan konteks untuk Claude](#add-context-for-claude) |2176| `additionalContext` | String yang ditambahkan ke konteks Claude bersama hasil tool. Lihat [Menambahkan konteks untuk Claude](#add-context-for-claude) |
2177| `classifierContext` | Catatan singkat tentang hasil panggilan ini untuk pengklasifikasi [auto mode](/docs/id/permission-modes#eliminate-prompts-with-auto-mode), bukan untuk Claude. Lihat [Memberi anotasi pada hasil untuk pengklasifikasi auto mode](#annotate-a-result-for-the-auto-mode-classifier). Memerlukan Claude Code v2.1.236 atau lebih baru |2177| `classifierContext` | Catatan singkat tentang hasil panggilan ini untuk pengklasifikasi [auto mode](/docs/id/permission-modes#eliminate-prompts-with-auto-mode), bukan untuk Claude. Lihat [Menganotasi hasil untuk pengklasifikasi auto mode](#annotate-a-result-for-the-auto-mode-classifier). Memerlukan Claude Code v2.1.236 atau yang lebih baru |
2178| `updatedToolOutput` | Mengganti output tool dengan nilai yang diberikan sebelum dikirim ke Claude. Nilai harus sesuai dengan bentuk output tool |2178| `updatedToolOutput` | Mengganti output tool dengan nilai yang diberikan sebelum dikirim ke Claude. Nilai harus sesuai dengan bentuk output tool |
2179| `updatedMCPToolOutput` | Mengganti output hanya untuk [tool MCP](#match-mcp-tools). Sebaiknya gunakan `updatedToolOutput`, yang berfungsi untuk semua tool |2179| `updatedMCPToolOutput` | Mengganti output hanya untuk [tool MCP](#match-mcp-tools). Utamakan `updatedToolOutput`, yang berfungsi untuk semua tool |
2180 2180
2181Contoh di bawah ini mengganti output dari panggilan `Bash`. Nilai pengganti sesuai dengan bentuk output tool `Bash`:2181Contoh di bawah ini mengganti output dari panggilan `Bash`. Nilai pengganti sesuai dengan bentuk output tool `Bash`:
2182 2182
2196```2196```
2197 2197
2198<Warning>2198<Warning>
2199 `updatedToolOutput` hanya mengubah apa yang dilihat Claude. Tool sudah berjalan saat hook dipicu, sehingga setiap file yang ditulis, perintah yang dieksekusi, atau permintaan jaringan yang dikirim sudah berlaku. Telemetri seperti span tool OpenTelemetry dan event analitik juga menangkap output asli sebelum hook berjalan. Untuk mencegah atau memodifikasi panggilan tool sebelum berjalan, gunakan hook [PreToolUse](#pretooluse) sebagai gantinya.2199 `updatedToolOutput` hanya mengubah apa yang dilihat Claude. Tool sudah berjalan pada saat hook dipicu, sehingga setiap file yang ditulis, perintah yang dieksekusi, atau permintaan jaringan yang dikirim sudah berlaku. Telemetri seperti span tool OpenTelemetry dan event analitik juga menangkap output asli sebelum hook berjalan. Untuk mencegah atau memodifikasi panggilan tool sebelum berjalan, gunakan hook [PreToolUse](#pretooluse) sebagai gantinya.
2200 2200
2201 Nilai pengganti harus sesuai dengan bentuk output tool. Tool bawaan mengembalikan objek terstruktur, bukan string biasa. Misalnya, `Bash` mengembalikan objek dengan field `stdout`, `stderr`, `interrupted`, dan `isImage`. Untuk tool bawaan, nilai yang tidak sesuai dengan skema output tool akan diabaikan dan output asli yang digunakan. Output tool MCP diteruskan tanpa validasi skema. Menghapus detail error yang dibutuhkan Claude dapat menyebabkannya melanjutkan berdasarkan asumsi yang salah.2201 Nilai pengganti harus sesuai dengan bentuk output tool. Tool bawaan mengembalikan objek terstruktur, bukan string biasa. Misalnya, `Bash` mengembalikan objek dengan field `stdout`, `stderr`, `interrupted`, dan `isImage`. Untuk tool bawaan, nilai yang tidak sesuai dengan skema output tool akan diabaikan dan output asli yang digunakan. Output tool MCP diteruskan tanpa validasi skema. Menghapus detail error yang dibutuhkan Claude dapat menyebabkannya melanjutkan berdasarkan asumsi yang salah.
2202</Warning>2202</Warning>
2203 2203
2204<h4 id="annotate-a-result-for-the-auto-mode-classifier">2204<h4 id="annotate-a-result-for-the-auto-mode-classifier">
2205 Memberi anotasi pada hasil untuk pengklasifikasi auto mode2205 Menganotasi hasil untuk pengklasifikasi auto mode
2206</h4>2206</h4>
2207 2207
2208Kembalikan `classifierContext` untuk mengirim catatan singkat tentang hasil panggilan tool ke pengklasifikasi [auto mode](/docs/id/permission-modes#eliminate-prompts-with-auto-mode), bukan ke Claude. Pengklasifikasi [tidak pernah menerima hasil tool itu sendiri](/docs/id/permission-modes#how-the-classifier-evaluates-actions), sehingga field ini adalah cara yang didukung untuk memberitahunya sesuatu tentang apa yang dikembalikan suatu panggilan sebelum ia meninjau tindakan berikutnya. Field ini memerlukan Claude Code v2.1.236 atau lebih baru.2208Kembalikan `classifierContext` untuk mengirim catatan singkat tentang hasil panggilan tool ke pengklasifikasi [auto mode](/docs/id/permission-modes#eliminate-prompts-with-auto-mode), bukan ke Claude. Pengklasifikasi [tidak pernah menerima hasil tool itu sendiri](/docs/id/permission-modes#how-the-classifier-evaluates-actions), sehingga field ini adalah cara yang didukung untuk memberi tahu sesuatu tentang apa yang dikembalikan oleh sebuah panggilan sebelum pengklasifikasi meninjau tindakan berikutnya. Field ini memerlukan Claude Code v2.1.236 atau yang lebih baru.
2209 2209
2210Contoh di bawah ini memberi tahu pengklasifikasi dari mana output sebuah query berasal:2210Contoh di bawah ini memberi tahu pengklasifikasi dari mana output sebuah kueri berasal:
2211 2211
2212```json theme={null}2212```json theme={null}
2213{2213{
2220 2220
2221Seberapa besar bobot yang diberikan pengklasifikasi pada catatan tersebut bergantung pada tempat Anda mengonfigurasi hook:2221Seberapa besar bobot yang diberikan pengklasifikasi pada catatan tersebut bergantung pada tempat Anda mengonfigurasi hook:
2222 2222
2223* **Hook yang dikonfigurasi di Claude Code**: untuk hook dari file pengaturan, plugin, skill, dan frontmatter agent, pengklasifikasi memperlakukan catatan tersebut sebagai konteks yang belum diverifikasi dan disediakan oleh aplikasi. Catatan tersebut tidak pernah menetapkan niat pengguna, dan jika catatan itu mengklaim bahwa Anda menyetujui atau meminta sesuatu, pengklasifikasi memeriksa klaim tersebut terhadap pesan Anda sendiri dalam percakapan2223* **Hook yang dikonfigurasi di Claude Code**: untuk hook dari file pengaturan, plugin, skill, dan frontmatter agent, pengklasifikasi memperlakukan catatan sebagai konteks yang belum terverifikasi dan disediakan oleh aplikasi. Catatan tidak pernah menetapkan niat pengguna, dan jika catatan mengklaim bahwa Anda menyetujui atau meminta sesuatu, pengklasifikasi memeriksa klaim tersebut terhadap pesan Anda sendiri dalam percakapan
2224* **Callback Agent SDK dalam proses**: ketika aplikasi yang menyematkan Claude Code mendaftarkan hook sebagai [callback TypeScript SDK](/docs/id/agent-sdk/hooks) dan mengembalikan catatan selama sesi aktif, pengklasifikasi dapat menimbang pernyataan pengguna yang diteruskan dalam catatan sebagai niat pengguna. Pernyataan seperti itu dapat memenuhi persyaratan persetujuan yang akan diterima pengklasifikasi dari pesan yang Anda kirim, tetapi tidak pernah mencabut blokir yang juga tidak dapat dicabut oleh pesan Anda sendiri. Setelah sesi dilanjutkan, Claude Code memperlakukan catatan yang dipulihkan sebagai konteks yang belum diverifikasi. Ketika hook dari kedua kelompok memberi anotasi pada panggilan yang sama, pengklasifikasi memperlakukan catatan gabungan sebagai belum diverifikasi2224* **Callback Agent SDK in-process**: ketika aplikasi yang menyematkan Claude Code mendaftarkan hook sebagai [callback TypeScript SDK](/docs/id/agent-sdk/hooks) dan mengembalikan catatan selama sesi aktif, pengklasifikasi dapat menganggap pernyataan pengguna yang diteruskan dalam catatan sebagai niat pengguna. Pernyataan semacam itu dapat memenuhi persyaratan persetujuan yang akan diterima pengklasifikasi dari pesan yang Anda kirim, tetapi tidak pernah mencabut blokir yang juga tidak dapat dicabut oleh pesan Anda sendiri. Setelah sesi dilanjutkan, Claude Code memperlakukan catatan yang dipulihkan sebagai konteks yang belum terverifikasi. Ketika hook dari kedua kelompok menganotasi panggilan yang sama, pengklasifikasi memperlakukan gabungan catatan sebagai belum terverifikasi
2225 2225
2226Claude Code menerapkan batasan berikut saat mengirimkan catatan:2226Claude Code menerapkan batasan berikut saat mengirimkan catatan:
2227 2227
2228* **Panjang**: Claude Code membatasi catatan untuk satu panggilan tool hingga 2.000 karakter dan memotong sisanya. Batas ini dibagi di antara setiap hook yang merespons panggilan tersebut2228* **Panjang**: Claude Code membatasi catatan untuk satu panggilan tool hingga 2.000 karakter dan memotong sisanya. Batas ini dibagi di antara setiap hook yang merespons panggilan tersebut
2229* **Hanya respons sinkron**: Claude Code mengabaikan field ini dalam respons hook yang [berjalan di latar belakang](#run-hooks-in-the-background), karena respons tersebut tiba setelah Claude Code mencatat hasil tool2229* **Hanya respons sinkron**: Claude Code mengabaikan field ini dalam respons hook yang [berjalan di latar belakang](#run-hooks-in-the-background), karena respons tersebut tiba setelah Claude Code mencatat hasil tool
2230* **Panggilan yang tidak dicatat oleh pengklasifikasi**: transkrip pengklasifikasi menghilangkan pencarian read-only seperti pembacaan file dan pencarian. Claude Code membuang catatan yang dilampirkan ke salah satu panggilan tersebut2230* **Panggilan yang tidak dicatat oleh pengklasifikasi**: transkrip pengklasifikasi menghilangkan pencarian read-only seperti pembacaan file dan penelusuran. Claude Code membuang catatan yang dilampirkan pada salah satu panggilan tersebut
2231* **Interaksi dengan penulisan ulang**: ketika catatan menjelaskan output yang Anda ganti dengan `updatedToolOutput`, kembalikan kedua field dalam respons hook yang sama. Claude Code membuang catatan tersebut jika penulisan ulang itu ditolak atau penulisan ulang hook lain menggantikannya. Claude Code mengirimkan catatan yang Anda kembalikan tanpa penulisan ulang bahkan ketika hook lain menulis ulang output2231* **Interaksi dengan penulisan ulang**: ketika catatan menjelaskan output yang Anda ganti dengan `updatedToolOutput`, kembalikan kedua field dalam respons hook yang sama. Claude Code membuang catatan jika penulisan ulang tersebut ditolak atau penulisan ulang dari hook lain menggantikannya. Claude Code mengirimkan catatan yang Anda kembalikan tanpa penulisan ulang bahkan ketika hook lain menulis ulang output
2232 2232
2233<Warning>2233<Warning>
2234 Pengklasifikasi membaca konten yang Anda tempatkan di `classifierContext` sebagai informasi dari aplikasi yang menghosting sesi, jadi jangan menyalin output tool yang tidak tepercaya atau teks pihak ketiga ke dalamnya. Buat catatan tetap berupa pernyataan singkat tentang satu panggilan ini, seperti fakta tentang asal-usulnya atau pernyataan pengguna tentangnya; jangan gunakan field ini untuk menyampaikan pesan yang tidak terkait atau aliran event.2234 Pengklasifikasi membaca konten yang Anda tempatkan di `classifierContext` sebagai informasi dari aplikasi yang meng-host sesi, jadi jangan menyalin output tool yang tidak tepercaya atau teks pihak ketiga ke dalamnya. Batasi catatan pada pernyataan singkat tentang satu panggilan ini, seperti fakta tentang asal-usulnya atau pernyataan pengguna tentangnya; jangan gunakan field ini untuk mengirimkan pesan yang tidak terkait atau aliran event.
2235</Warning>2235</Warning>
2236 2236
2237<h3 id="posttoolusefailure">2237<h3 id="posttoolusefailure">
2238 PostToolUseFailure2238 PostToolUseFailure
2239</h3>2239</h3>
2240 2240
2241Berjalan ketika sebuah tool yang sudah mulai dieksekusi gagal: tool melempar error, atau tool MCP mengembalikan hasil error. Gunakan ini untuk mencatat kegagalan, mengirim peringatan, atau memberikan umpan balik korektif kepada Claude.2241Berjalan ketika sebuah tool yang mulai dieksekusi gagal: tool melemparkan error, atau tool MCP mengembalikan hasil error. Gunakan ini untuk mencatat kegagalan, mengirim peringatan, atau memberikan umpan balik korektif kepada Claude.
2242 2242
2243Mencocokkan berdasarkan nama tool, dengan nilai yang sama seperti PreToolUse.2243Mencocokkan berdasarkan nama tool, dengan nilai yang sama seperti PreToolUse.
2244 2244
2245<Note>2245<Note>
2246 Event ini tidak dipicu untuk panggilan tool yang ditolak sebelum eksekusi: nama tool yang tidak dikenal, input yang gagal dalam validasi skema atau validasi khusus tool, atau penolakan izin. Penolakan validasi dikembalikan sebagai hasil `tool_use_error` dan terjadi sebelum hook berjalan, sehingga tidak memicu `PreToolUse` maupun `PostToolUseFailure`. Penolakan izin memicu `PreToolUse` tetapi tidak memicu event ini; lihat [PermissionDenied](#permissiondenied).2246 Event ini tidak dipicu untuk panggilan tool yang ditolak sebelum eksekusi: nama tool yang tidak dikenal, input yang gagal validasi skema atau validasi khusus tool, atau penolakan izin. Penolakan validasi dikembalikan sebagai hasil `tool_use_error` dan terjadi sebelum hook berjalan, sehingga tidak memicu `PreToolUse` maupun `PostToolUseFailure`. Penolakan izin memicu `PreToolUse` tetapi tidak memicu event ini; lihat [PermissionDenied](#permissiondenied).
2247</Note>2247</Note>
2248 2248
2249<h4 id="posttoolusefailure-input">2249<h4 id="posttoolusefailure-input">
2250 Input PostToolUseFailure2250 Input PostToolUseFailure
2251</h4>2251</h4>
2252 2252
2253Hook PostToolUseFailure menerima field `tool_name` dan `tool_input` yang sama seperti PostToolUse, bersama dengan informasi error sebagai field tingkat atas. Untuk tool MCP, hook juga menerima objek [`mcp_server`](#pretooluse-input). Misalnya, perintah `npm test` yang gagal mungkin mengirimkan:2253Hook PostToolUseFailure menerima field `tool_name` dan `tool_input` yang sama seperti PostToolUse, beserta informasi error sebagai field tingkat atas. Untuk tool MCP, hook ini juga menerima objek [`mcp_server`](#pretooluse-input). Misalnya, perintah `npm test` yang gagal mungkin mengirimkan:
2254 2254
2255```json theme={null}2255```json theme={null}
2256{2256{
2274| Field | Deskripsi |2274| Field | Deskripsi |
2275| :- | :- |2275| :- | :- |
2276| `error` | String yang menjelaskan apa yang salah. Formatnya bergantung pada tool yang gagal |2276| `error` | String yang menjelaskan apa yang salah. Formatnya bergantung pada tool yang gagal |
2277| `is_interrupt` | Boolean opsional. True ketika kegagalan mencapai Claude Code sebagai pembatalan, bukan sebagai error yang dilaporkan oleh tool. Membatalkan tool yang sedang berjalan tidak memicu hook ini; hasil tool membawa pesan interupsi sebagai gantinya |2277| `is_interrupt` | Boolean opsional. True ketika kegagalan mencapai Claude Code sebagai pembatalan, bukan sebagai error yang dilaporkan tool. Membatalkan tool yang sedang berjalan tidak memicu hook ini; hasil tool membawa pesan interupsi sebagai gantinya |
2278| `duration_ms` | Opsional. Waktu eksekusi tool dalam milidetik. Tidak termasuk waktu yang dihabiskan dalam permintaan izin dan hook PreToolUse |2278| `duration_ms` | Opsional. Waktu eksekusi tool dalam milidetik. Tidak termasuk waktu yang dihabiskan dalam permintaan izin dan hook PreToolUse |
2279 2279
2280String `error` umumnya merupakan teks yang sama yang diterima Claude sebagai hasil tool yang gagal. Formatnya bervariasi menurut tool dan jenis kegagalan. Dasarkan hook Anda pada `tool_name`, `is_interrupt`, dan baris pertama `Exit code N`; perlakukan sisa string sebagai teks tampilan, bukan format yang stabil.2280String `error` umumnya merupakan teks yang sama dengan yang diterima Claude sebagai hasil tool yang gagal. Formatnya bervariasi menurut tool dan kegagalan. Dasarkan hook Anda pada `tool_name`, `is_interrupt`, dan baris pertama `Exit code N`; perlakukan sisa string sebagai teks tampilan, bukan format yang stabil.
2281 2281
2282* Untuk Bash dan PowerShell, perintah yang berjalan dan keluar menghasilkan baris pertama `Exit code N`, lalu output apa pun yang dihasilkan perintah sebagai satu blok dengan stdout dan stderr yang saling berselang-seling2282* Untuk Bash dan PowerShell, perintah yang berjalan lalu keluar menghasilkan baris pertama `Exit code N`, lalu output apa pun yang dihasilkan perintah sebagai satu blok dengan stdout dan stderr yang diselingi
2283* Sebuah payload juga dapat membawa pesan kegagalan polos tanpa baris exit code, ketika Claude Code tidak dapat memulai proses shell itu sendiri2283* Sebuah payload juga dapat membawa pesan kegagalan polos tanpa baris exit code, ketika Claude Code tidak dapat memulai proses shell itu sendiri
2284* Claude Code memotong bagian tengah string panjang di sekitar penanda `... [N characters truncated] ...`, dan dapat menyisipkan baris miliknya sendiri, seperti `Command timed out after 2m 0s`2284* Claude Code memotong bagian tengah string panjang di sekitar penanda `... [N characters truncated] ...`, dan dapat menyisipkan baris miliknya sendiri, seperti `Command timed out after 2m 0s`
2285 2285
2306 PostToolBatch2306 PostToolBatch
2307</h3>2307</h3>
2308 2308
2309Berjalan sekali setelah setiap panggilan tool dalam satu batch selesai diproses, sebelum Claude Code mengirim permintaan berikutnya ke model. `PostToolUse` dipicu sekali per tool, yang berarti ia dipicu secara bersamaan ketika Claude melakukan panggilan tool paralel. `PostToolBatch` dipicu tepat sekali dengan batch lengkap, sehingga merupakan tempat yang tepat untuk menyuntikkan konteks yang bergantung pada kumpulan tool yang berjalan, bukan pada satu tool tertentu. Tidak ada matcher untuk event ini.2309Berjalan sekali setelah setiap panggilan tool dalam satu batch telah selesai, sebelum Claude Code mengirim permintaan berikutnya ke model. `PostToolUse` dipicu sekali per tool, yang berarti hook tersebut dipicu secara bersamaan ketika Claude melakukan panggilan tool paralel. `PostToolBatch` dipicu tepat sekali dengan batch lengkap, sehingga ini adalah tempat yang tepat untuk menyisipkan konteks yang bergantung pada kumpulan tool yang berjalan, bukan pada satu tool saja. Tidak ada matcher untuk event ini.
2310 2310
2311<h4 id="posttoolbatch-input">2311<h4 id="posttoolbatch-input">
2312 Input PostToolBatch2312 Input PostToolBatch
2338}2338}
2339```2339```
2340 2340
2341`tool_response` berisi konten yang sama yang diterima model dalam blok `tool_result` yang sesuai. Nilainya adalah string terserialisasi atau array content-block, persis seperti yang dikeluarkan tool. Untuk `Read`, itu berarti teks dengan awalan nomor baris, bukan konten file mentah. Respons bisa berukuran besar, jadi parse hanya field yang Anda butuhkan.2341`tool_response` berisi konten yang sama dengan yang diterima model dalam blok `tool_result` yang bersesuaian. Nilainya adalah string terserialisasi atau array content-block, persis seperti yang dikeluarkan tool. Untuk `Read`, itu berarti teks berawalan nomor baris, bukan konten file mentah. Respons bisa berukuran besar, jadi parse hanya field yang Anda butuhkan.
2342 2342
2343<Note>2343<Note>
2344 Bentuk `tool_response` berbeda dengan milik `PostToolUse`. `PostToolUse` meneruskan objek `Output` terstruktur milik tool, seperti `{filePath: "...", type: "create"}` untuk `Write`; `PostToolBatch` meneruskan konten `tool_result` terserialisasi yang dilihat model.2344 Bentuk `tool_response` berbeda dari milik `PostToolUse`. `PostToolUse` meneruskan objek `Output` terstruktur milik tool, seperti `{filePath: "...", type: "create"}` untuk `Write`; `PostToolBatch` meneruskan konten `tool_result` terserialisasi yang dilihat model.
2345</Note>2345</Note>
2346 2346
2347<h4 id="posttoolbatch-decision-control">2347<h4 id="posttoolbatch-decision-control">
2348 Kontrol keputusan PostToolBatch2348 Kontrol keputusan PostToolBatch
2349</h4>2349</h4>
2350 2350
2351Hook `PostToolBatch` dapat menyuntikkan konteks untuk Claude. Selain [field output JSON](#json-output) yang tersedia untuk semua hook, skrip hook Anda dapat mengembalikan field khusus event berikut:2351Hook `PostToolBatch` dapat menyisipkan konteks untuk Claude. Selain [field output JSON](#json-output) yang tersedia untuk semua hook, skrip hook Anda dapat mengembalikan field khusus event berikut:
2352 2352
2353| Field | Deskripsi |2353| Field | Deskripsi |
2354| :- | :- |2354| :- | :- |
2355| `additionalContext` | String konteks yang disuntikkan sekali sebelum panggilan model berikutnya. Lihat [Menambahkan konteks untuk Claude](#add-context-for-claude) untuk detail pengiriman, apa yang perlu dimasukkan, dan bagaimana sesi yang dilanjutkan menangani nilai sebelumnya |2355| `additionalContext` | String konteks yang disisipkan sekali sebelum panggilan model berikutnya. Lihat [Menambahkan konteks untuk Claude](#add-context-for-claude) untuk detail pengiriman, apa yang perlu dimasukkan, dan bagaimana sesi yang dilanjutkan menangani nilai sebelumnya |
2356 2356
2357```json theme={null}2357```json theme={null}
2358{2358{
2363}2363}
2364```2364```
2365 2365
2366Mengembalikan `decision: "block"` atau `continue: false` menghentikan agentic loop sebelum panggilan model berikutnya. Pesan pemblokiran berasal dari `reason` atau `stopReason` JSON, atau dari stderr pada exit 2. Anda melihatnya sebagai peringatan di transkrip, dan pesan itu tetap ada dalam percakapan, sehingga Claude melihatnya ketika percakapan berlanjut.2366Mengembalikan `decision: "block"` atau `continue: false` menghentikan agentic loop sebelum panggilan model berikutnya. Pesan pemblokiran berasal dari `reason` atau `stopReason` JSON, atau dari stderr pada exit 2. Anda melihatnya sebagai peringatan dalam transkrip, dan pesan tersebut tetap berada dalam percakapan, sehingga Claude melihatnya ketika percakapan berlanjut.
2367 2367
2368<h3 id="permissiondenied">2368<h3 id="permissiondenied">
2369 PermissionDenied2369 PermissionDenied
2370</h3>2370</h3>
2371 2371
2372Berjalan ketika [auto mode](/docs/id/permission-modes#eliminate-prompts-with-auto-mode) menolak panggilan tool, termasuk ketika ia menolak tanpa putusan pengklasifikasi karena [pemeriksaan keamanan yang terpisah dari auto mode menolak permintaan pengklasifikasi itu sendiri](/docs/id/errors#auto-mode-cannot-determine-the-safety-of-an-action) atau responsnya tidak dapat di-parse. Hook ini hanya dipicu dalam auto mode: hook ini tidak berjalan ketika Anda menolak dialog izin secara manual, ketika hook `PreToolUse` memblokir panggilan, atau ketika aturan `deny` cocok. Gunakan ini untuk mencatat penolakan, menyesuaikan konfigurasi, atau memberi tahu model bahwa ia boleh mencoba ulang panggilan tool.2372Berjalan ketika [auto mode](/docs/id/permission-modes#eliminate-prompts-with-auto-mode) menolak panggilan tool, termasuk ketika menolak tanpa putusan pengklasifikasi karena [pemeriksaan keamanan yang terpisah dari auto mode menolak permintaan pengklasifikasi itu sendiri](/docs/id/errors#auto-mode-cannot-determine-the-safety-of-an-action) atau responsnya tidak dapat di-parse. Hook ini hanya dipicu dalam auto mode: hook ini tidak berjalan ketika Anda menolak dialog izin secara manual, ketika hook `PreToolUse` memblokir panggilan, atau ketika aturan `deny` cocok. Gunakan ini untuk mencatat penolakan, menyesuaikan konfigurasi, atau memberi tahu model bahwa ia boleh mencoba ulang panggilan tool.
2373 2373
2374Mencocokkan berdasarkan nama tool, dengan nilai yang sama seperti PreToolUse.2374Mencocokkan berdasarkan nama tool, dengan nilai yang sama seperti PreToolUse.
2375 2375
2377 Input PermissionDenied2377 Input PermissionDenied
2378</h4>2378</h4>
2379 2379
2380Selain [field input umum](#common-input-fields), hook PermissionDenied menerima `tool_name`, `tool_input`, `tool_use_id`, dan `reason`. Untuk tool MCP, hook juga menerima objek [`mcp_server`](#pretooluse-input).2380Selain [field input umum](#common-input-fields), hook PermissionDenied menerima `tool_name`, `tool_input`, `tool_use_id`, dan `reason`. Untuk tool MCP, hook ini juga menerima objek [`mcp_server`](#pretooluse-input).
2381 2381
2382```json theme={null}2382```json theme={null}
2383{2383{
2398 2398
2399| Field | Deskripsi |2399| Field | Deskripsi |
2400| :- | :- |2400| :- | :- |
2401| `reason` | Alasan penolakan. Untuk putusan pengklasifikasi, di sebagian besar sesi alasan ini menyebutkan aturan yang cocok dalam kurung siku, seperti `[Data Exfiltration]`; lihat [Meninjau penolakan](/docs/id/auto-mode-config#review-denials) untuk bentuk lainnya. Untuk [penolakan tanpa putusan](#permissiondenied-decision-control), alasan dimulai dengan `Auto mode could not evaluate this action and is blocking it for safety`. Untuk penolakan karena model pengklasifikasi tidak tersedia, alasannya adalah teks tetap `Classifier unavailable` |2401| `reason` | Alasan penolakan. Untuk putusan pengklasifikasi, di sebagian besar sesi alasan ini menyebutkan aturan yang cocok dalam tanda kurung siku, seperti `[Data Exfiltration]`; lihat [Meninjau penolakan](/docs/id/auto-mode-config#review-denials) untuk bentuk lainnya. Untuk [penolakan tanpa putusan](#permissiondenied-decision-control), alasan diawali dengan `Auto mode could not evaluate this action and is blocking it for safety`. Untuk penolakan karena model pengklasifikasi tidak tersedia, alasannya adalah teks tetap `Classifier unavailable` |
2402 2402
2403<h4 id="permissiondenied-decision-control">2403<h4 id="permissiondenied-decision-control">
2404 Kontrol keputusan PermissionDenied2404 Kontrol keputusan PermissionDenied
2425 2425
2426Berjalan ketika Claude Code mengirim notifikasi. Mencocokkan berdasarkan jenis notifikasi. Hilangkan matcher untuk menjalankan hook untuk semua jenis notifikasi.2426Berjalan ketika Claude Code mengirim notifikasi. Mencocokkan berdasarkan jenis notifikasi. Hilangkan matcher untuk menjalankan hook untuk semua jenis notifikasi.
2427 2427
2428Anda menerima event hook ini bahkan ketika notifikasi desktop dimatikan: pengaturan `preferredNotifChannel`, termasuk `notifications_disabled`, hanya mengubah cara Anda diberi peringatan, bukan apakah hook Anda berjalan.2428Anda menerima event hook ini bahkan ketika notifikasi desktop dimatikan: pengaturan `preferredNotifChannel`, termasuk `notifications_disabled`, hanya mengubah cara Anda diberi tahu, bukan apakah hook Anda berjalan.
2429 2429
2430| Matcher | Kapan dipicu |2430| Matcher | Kapan dipicu |
2431| :- | :- |2431| :- | :- |
2432| `permission_prompt` | Claude memerlukan Anda untuk menyetujui penggunaan tool atau [permintaan jaringan](/docs/id/sandboxing#network-isolation) dari perintah yang di-sandbox, dan permintaan izin telah menunggu sekitar enam detik |2432| `permission_prompt` | Claude membutuhkan Anda untuk menyetujui penggunaan tool atau [permintaan jaringan](/docs/id/sandboxing#network-isolation) dari perintah yang di-sandbox, dan permintaan izin telah menunggu sekitar enam detik |
2433| `idle_prompt` | Claude selesai merespons sekitar 60 detik yang lalu dan Anda belum mengetik sejak itu |2433| `idle_prompt` | Claude selesai merespons sekitar 60 detik yang lalu dan Anda belum mengetik sejak itu |
2434| `auth_success` | Autentikasi selesai |2434| `auth_success` | Autentikasi selesai |
2435| `elicitation_dialog` | Server MCP membuka formulir elicitation dan Anda belum mengetik selama sekitar enam detik |2435| `elicitation_dialog` | Server MCP membuka formulir elicitation dan Anda belum mengetik selama sekitar enam detik |
2438| `elicitation_response` | Respons elicitation MCP dikirim kembali ke server |2438| `elicitation_response` | Respons elicitation MCP dikirim kembali ke server |
2439| `agent_needs_input` | Sesi latar belakang mulai menunggu input Anda saat [agent view](/docs/id/agent-view) terbuka di terminal. Juga dipicu ketika sesi terminal menampilkan kepada Anda [pertanyaan penyiapan terminal dari rekan tim agent](/docs/id/agent-teams#choose-a-display-mode) atau pemberitahuan auto mode tentang [biaya permintaan pengklasifikasi](/docs/id/auto-mode-classifier-billing) dan Anda belum mengetik selama sekitar enam detik |2439| `agent_needs_input` | Sesi latar belakang mulai menunggu input Anda saat [agent view](/docs/id/agent-view) terbuka di terminal. Juga dipicu ketika sesi terminal menampilkan kepada Anda [pertanyaan penyiapan terminal dari rekan tim agent](/docs/id/agent-teams#choose-a-display-mode) atau pemberitahuan auto mode tentang [biaya permintaan pengklasifikasi](/docs/id/auto-mode-classifier-billing) dan Anda belum mengetik selama sekitar enam detik |
2440| `agent_completed` | Sesi latar belakang selesai atau gagal. Hanya dipicu saat [agent view](/docs/id/agent-view) terbuka di terminal |2440| `agent_completed` | Sesi latar belakang selesai atau gagal. Hanya dipicu saat [agent view](/docs/id/agent-view) terbuka di terminal |
2441| `quota_auto_resume_fired` | Claude Code melanjutkan tugas Anda setelah batas penggunaan claude.ai menjedanya: pada saat reset, atau lebih cepat ketika sesuatu yang Anda lakukan di Claude Code selama menunggu, seperti menambahkan kredit penggunaan, meningkatkan paket Anda, atau beralih model, membuat penggunaan tersedia kembali, dengan [pengecualian pengaturan model](/docs/id/interactive-mode#wait-for-a-usage-limit-to-reset) |2441| `quota_auto_resume_fired` | Claude Code melanjutkan tugas Anda setelah batas penggunaan claude.ai menjedanya: pada saat reset, atau lebih cepat ketika sesuatu yang Anda lakukan di Claude Code selama menunggu, seperti menambahkan kredit penggunaan, meningkatkan paket, atau berganti model, membuat penggunaan tersedia kembali, dengan [pengecualian pengaturan model](/docs/id/interactive-mode#wait-for-a-usage-limit-to-reset) |
2442| `quota_auto_resume_stale` | Batas penggunaan claude.ai direset saat komputer Anda dalam mode tidur selama lebih dari sekitar 30 menit. Claude Code menunggu Anda menekan `Enter` alih-alih melanjutkan. Setelah tidur yang lebih singkat, Claude Code melanjutkan dan memicu `quota_auto_resume_fired` sebagai gantinya |2442| `quota_auto_resume_stale` | Batas penggunaan claude.ai di-reset saat komputer Anda dalam mode tidur selama lebih dari sekitar 30 menit. Claude Code menunggu Anda menekan `Enter` alih-alih melanjutkan. Setelah tidur yang lebih singkat, Claude Code melanjutkan dan memicu `quota_auto_resume_fired` sebagai gantinya |
2443| `quota_auto_resume_disabled` | Claude Code mengakhiri penantiannya untuk batas penggunaan claude.ai tanpa melanjutkan tugas Anda: [`autoContinueAtUsageLimit`](/docs/id/settings-reference#autocontinueatusagelimit) dimatikan atau waktu reset bergeser lebih dari 24 jam selama penantian yang dimulai Claude Code sendiri, tugas yang dilanjutkan terus mencapai batas, atau kelanjutan diblokir sebelum mencapai model. Tidak dipicu ketika Anda menekan `Esc` atau `Ctrl+C`, atau memilih **Don't continue automatically** |2443| `quota_auto_resume_disabled` | Claude Code mengakhiri penantiannya terhadap batas penggunaan claude.ai tanpa melanjutkan tugas Anda: [`autoContinueAtUsageLimit`](/docs/id/settings-reference#autocontinueatusagelimit) dimatikan atau waktu reset bergeser lebih dari 24 jam selama penantian yang dimulai Claude Code sendiri, tugas yang dilanjutkan terus mencapai batas, atau kelanjutan diblokir sebelum mencapai model. Tidak dipicu ketika Anda menekan `Esc` atau `Ctrl+C`, atau memilih **Don't continue automatically** |
2444 2444
2445Jenis `quota_auto_resume_fired`, `quota_auto_resume_stale`, dan `quota_auto_resume_disabled` memerlukan Claude Code v2.1.234 atau lebih baru.2445Jenis `quota_auto_resume_fired`, `quota_auto_resume_stale`, dan `quota_auto_resume_disabled` memerlukan Claude Code v2.1.234 atau yang lebih baru.
2446 2446
2447Dalam sesi terminal, `permission_prompt` untuk permintaan jaringan dari perintah yang di-sandbox memerlukan Claude Code v2.1.246 atau lebih baru.2447Dalam sesi terminal, `permission_prompt` untuk permintaan jaringan dari perintah yang di-sandbox memerlukan Claude Code v2.1.246 atau yang lebih baru.
2448 2448
2449`agent_needs_input` untuk pertanyaan penyiapan terminal dari rekan tim memerlukan Claude Code v2.1.248 atau lebih baru.2449`agent_needs_input` untuk pertanyaan penyiapan terminal dari rekan tim memerlukan Claude Code v2.1.248 atau yang lebih baru.
2450 2450
2451<Note>2451<Note>
2452 Jenis `permission_prompt`, `idle_prompt`, `elicitation_dialog`, dan `elicitation_url_dialog` berbagi waktu yang sama dengan notifikasi desktop, sehingga dalam sesi terminal Anda hanya melihatnya ketika Anda tampak sedang jauh dari terminal:2452 Jenis `permission_prompt`, `idle_prompt`, `elicitation_dialog`, dan `elicitation_url_dialog` berbagi pengaturan waktu dengan notifikasi desktop, sehingga dalam sesi terminal Anda hanya melihatnya ketika Anda tampak sedang tidak berada di depan terminal:
2453 2453
2454 * `permission_prompt` akan muncul setelah Anda tidak mengetik selama sekitar enam detik. Timer dimulai ketika permintaan izin muncul, dan setiap ketukan tombol menundanya. Untuk menjalankan hook segera ketika Claude meminta izin untuk menggunakan tool, gunakan [PermissionRequest](#permissionrequest) sebagai gantinya.2454 * Harapkan `permission_prompt` setelah Anda tidak mengetik selama sekitar enam detik. Timer dimulai ketika permintaan izin muncul, dan setiap ketukan tombol menundanya. Untuk menjalankan hook segera ketika Claude meminta izin untuk menggunakan tool, gunakan [PermissionRequest](#permissionrequest) sebagai gantinya.
2455 * `idle_prompt` akan muncul sekitar 60 detik setelah Claude selesai merespons, dan hanya jika Anda belum mengetik sejak itu. Claude Code tidak mengirim `idle_prompt` saat menunggu batas penggunaan claude.ai direset. Ketika penantian berakhir dengan sendirinya, salah satu jenis `quota_auto_resume_*` akan dipicu sebagai gantinya.2455 * Harapkan `idle_prompt` sekitar 60 detik setelah Claude selesai merespons, dan hanya jika Anda belum mengetik sejak itu serta tidak ada agent latar belakang, seperti [subagent](/docs/id/sub-agents) latar belakang, yang masih berjalan. Claude Code tidak mengirim `idle_prompt` saat menunggu batas penggunaan claude.ai di-reset. Ketika penantian berakhir dengan sendirinya, salah satu jenis `quota_auto_resume_*` dipicu sebagai gantinya.
2456 * `elicitation_dialog` untuk formulir elicitation, atau `elicitation_url_dialog` untuk permintaan URL browser, akan muncul setelah Anda tidak mengetik selama sekitar enam detik. Keduanya berbagi batas enam detik yang sama dengan `permission_prompt`: timer dimulai ketika dialog muncul, dan setiap ketukan tombol menundanya.2456 * Harapkan `elicitation_dialog` untuk formulir elicitation, atau `elicitation_url_dialog` untuk permintaan URL browser, setelah Anda tidak mengetik selama sekitar enam detik. Keduanya berbagi batas enam detik yang sama dengan `permission_prompt`: timer dimulai ketika dialog muncul, dan setiap ketukan tombol menundanya.
2457 2457
2458 Permintaan izin atau elicitation yang tiba saat dialog lain sedang ditampilkan tetap menggunakan batas enam detik yang sama, dihitung sejak permintaan tiba. Notifikasinya dapat sampai kepada Anda saat permintaan masih menunggu di balik dialog yang terbuka.2458 Permintaan izin atau elicitation yang tiba saat dialog lain sedang tampil di layar tetap menggunakan batas enam detik yang sama, dihitung sejak permintaan tiba. Notifikasinya dapat sampai kepada Anda saat permintaan masih menunggu di belakang dialog yang terbuka.
2459</Note>2459</Note>
2460 2460
2461Claude Code mengatur waktu `permission_prompt` secara berbeda dalam sesi di mana ia mengirim permintaan izin ke [callback `canUseTool`](/docs/id/agent-sdk/user-input) milik Agent SDK, yang merupakan cara Claude Desktop dan ekstensi VS Code menghosting Claude Code:2461Claude Code mengatur waktu `permission_prompt` secara berbeda dalam sesi di mana Claude Code mengirim permintaan izin ke [callback `canUseTool`](/docs/id/agent-sdk/user-input) milik Agent SDK, yang merupakan cara Claude Desktop dan ekstensi VS Code meng-host Claude Code:
2462 2462
2463* `permission_prompt` akan muncul sekitar enam detik setelah Claude meminta izin. Claude Code tidak menundanya saat Anda mengetik.2463* Harapkan `permission_prompt` sekitar enam detik setelah Claude meminta izin. Claude Code tidak menundanya saat Anda mengetik.
2464* Jika Anda atau hook [PermissionRequest](#permissionrequest) menjawab lebih cepat, Claude Code tidak menjalankan `permission_prompt`.2464* Jika Anda atau hook [PermissionRequest](#permissionrequest) menjawab lebih cepat, Claude Code tidak menjalankan `permission_prompt`.
2465* Atur [`CLAUDE_CODE_DISABLE_PERMISSION_PROMPT_NOTIFY_HOOKS`](/docs/id/env-vars) ke `1` untuk mematikan `permission_prompt` dalam sesi ini.2465* Atur [`CLAUDE_CODE_DISABLE_PERMISSION_PROMPT_NOTIFY_HOOKS`](/docs/id/env-vars) ke `1` untuk mematikan `permission_prompt` dalam sesi-sesi ini.
2466 2466
2467Sebelum v2.1.233, `permission_prompt` tidak dipicu dalam sesi ini.2467Sebelum v2.1.233, `permission_prompt` tidak dipicu dalam sesi-sesi ini.
2468 2468
2469Gunakan matcher terpisah untuk menjalankan handler yang berbeda bergantung pada jenis notifikasi. Konfigurasi ini memicu skrip peringatan khusus izin ketika Claude memerlukan persetujuan izin dan notifikasi yang berbeda ketika Claude dalam keadaan idle:2469Gunakan matcher terpisah untuk menjalankan handler yang berbeda tergantung pada jenis notifikasi. Konfigurasi ini memicu skrip peringatan khusus izin ketika Claude membutuhkan persetujuan izin dan notifikasi yang berbeda ketika Claude sedang idle:
2470 2470
2471```json theme={null}2471```json theme={null}
2472{2472{
2519 SubagentStart2519 SubagentStart
2520</h3>2520</h3>
2521 2521
2522Berjalan ketika Claude memunculkan subagent dengan tool Agent, ketika Claude [melanjutkan subagent](/docs/id/sub-agents#resume-subagents), dan setiap kali rekan tim [tim agent](/docs/id/agent-teams) dalam proses menangani pesan baru. Mendukung matcher untuk memfilter berdasarkan nama jenis agent. Untuk agent bawaan, ini adalah nama agent seperti `general-purpose`, `Explore`, atau `Plan`. Untuk [subagent kustom](/docs/id/sub-agents), ini adalah field `name` dari frontmatter agent, bukan nama file.2522Berjalan ketika Claude memunculkan subagent dengan tool Agent, ketika Claude [melanjutkan subagent](/docs/id/sub-agents#resume-subagents), dan setiap kali rekan tim [tim agent](/docs/id/agent-teams) in-process menangani pesan baru. Mendukung matcher untuk memfilter berdasarkan nama jenis agent. Untuk agent bawaan, ini adalah nama agent seperti `general-purpose`, `Explore`, atau `Plan`. Untuk [subagent kustom](/docs/id/sub-agents), ini adalah field `name` dari frontmatter agent, bukan nama file.
2523 2523
2524Untuk subagent yang disertakan oleh [plugin](/docs/id/plugins/overview), jenis agent adalah pengidentifikasi dengan cakupan plugin seperti `my-plugin:reviewer`, bukan nama frontmatter polos. Titik dua menempatkan nama dengan cakupan plugin pada jalur regular expression, jadi jangkarkan matcher dengan `^` dan `$` untuk kecocokan persis: `^my-plugin:reviewer$`.2524Untuk subagent yang disertakan oleh [plugin](/docs/id/plugins/overview), jenis agent adalah pengidentifikasi dengan cakupan plugin seperti `my-plugin:reviewer`, bukan nama frontmatter polos. Titik dua menempatkan nama dengan cakupan plugin pada jalur ekspresi reguler, jadi jangkarkan matcher dengan `^` dan `$` untuk pencocokan persis: `^my-plugin:reviewer$`.
2525 2525
2526<h4 id="subagentstart-input">2526<h4 id="subagentstart-input">
2527 Input SubagentStart2527 Input SubagentStart
2540}2540}
2541```2541```
2542 2542
2543Hook SubagentStart tidak dapat memblokir pembuatan subagent, tetapi dapat menyuntikkan konteks ke dalam subagent. Selain [field output JSON](#json-output) yang tersedia untuk semua hook, Anda dapat mengembalikan:2543Hook SubagentStart tidak dapat memblokir pembuatan subagent, tetapi dapat menyisipkan konteks ke dalam subagent. Selain [field output JSON](#json-output) yang tersedia untuk semua hook, Anda dapat mengembalikan:
2544 2544
2545| Field | Deskripsi |2545| Field | Deskripsi |
2546| :- | :- |2546| :- | :- |
2555}2555}
2556```2556```
2557 2557
2558Ketika hook berjalan lagi untuk subagent yang sama, Claude Code menyuntikkan konteks yang dikembalikan hanya jika konteks subagent belum menyimpan salinan dari eksekusi sebelumnya. Salinan yang disuntikkan saat peluncuran tetap di tempatnya, sehingga [prompt cache](/docs/id/prompt-caching#subagents-and-the-cache) subagent tetap utuh. Setelah [auto-compaction](/docs/id/sub-agents#auto-compaction) membuang salinan tersebut, Claude Code menyuntikkan konteks dari eksekusi berikutnya lagi.2558Ketika hook berjalan lagi untuk subagent yang sama, Claude Code menyisipkan konteks yang dikembalikan hanya ketika konteks subagent belum memuat salinan dari proses sebelumnya. Salinan yang disisipkan saat peluncuran tetap di tempatnya, sehingga [prompt cache](/docs/id/prompt-caching#subagents-and-the-cache) subagent tetap utuh. Setelah [auto-compaction](/docs/id/sub-agents#auto-compaction) membuang salinan tersebut, Claude Code menyisipkan kembali konteks dari proses berikutnya.
2559 2559
2560<h3 id="subagentstop">2560<h3 id="subagentstop">
2561 SubagentStop2561 SubagentStop
2567 Input SubagentStop2567 Input SubagentStop
2568</h4>2568</h4>
2569 2569
2570Selain [field input umum](#common-input-fields), hook SubagentStop menerima `stop_hook_active`, `agent_id`, `agent_type`, `agent_transcript_path`, dan `last_assistant_message`. Field `agent_type` adalah nilai yang digunakan untuk pemfilteran matcher. `transcript_path` adalah transkrip sesi utama, sedangkan `agent_transcript_path` adalah transkrip milik subagent sendiri yang disimpan dalam folder `subagents/` bersarang. Field `last_assistant_message` berisi konten teks dari respons akhir subagent, sehingga hook dapat mengaksesnya tanpa mem-parse file transkrip.2570Selain [field input umum](#common-input-fields), hook SubagentStop menerima `stop_hook_active`, `agent_id`, `agent_type`, `agent_transcript_path`, dan `last_assistant_message`. Field `agent_type` adalah nilai yang digunakan untuk pemfilteran matcher. `transcript_path` adalah transkrip sesi utama, sedangkan `agent_transcript_path` adalah transkrip milik subagent sendiri yang disimpan dalam folder bertingkat `subagents/`. Field `last_assistant_message` berisi konten teks dari respons akhir subagent, sehingga hook dapat mengaksesnya tanpa mem-parse file transkrip.
2571 2571
2572Tidak setiap event SubagentStop berasal dari subagent yang dimunculkan Claude. Claude Code juga menjalankan agent internal untuk beberapa fiturnya sendiri, seperti [saran prompt](/docs/id/interactive-mode#prompt-suggestions) dan [pertanyaan sampingan `/btw`](/docs/id/interactive-mode#side-questions-with-%2Fbtw), dan SubagentStop juga dipicu ketika salah satunya selesai. Untuk event tersebut, `agent_type` adalah nama agent yang dijalankan oleh sesi itu sendiri, seperti yang diatur dengan [`--agent`](/docs/id/cli-reference#cli-flags) atau [pengaturan `agent`](/docs/id/settings-reference#agent), dan berupa string kosong ketika sesi berjalan tanpa agent tersebut.2572Tidak setiap event SubagentStop berasal dari subagent yang dimunculkan Claude. Claude Code juga menjalankan agent internal untuk beberapa fiturnya sendiri, seperti [saran prompt](/docs/id/interactive-mode#prompt-suggestions) dan [pertanyaan sampingan `/btw`](/docs/id/interactive-mode#side-questions-with-%2Fbtw), dan SubagentStop juga dipicu ketika salah satunya selesai. Untuk event tersebut, `agent_type` adalah nama agent yang dijalankan oleh sesi itu sendiri, seperti yang diatur dengan [`--agent`](/docs/id/cli-reference#cli-flags) atau [pengaturan `agent`](/docs/id/settings-reference#agent), dan berupa string kosong ketika sesi berjalan tanpanya.
2573 2573
2574`matcher` yang menyebutkan jenis agent tidak cocok dengan `agent_type` yang kosong. Hook yang matcher-nya dihilangkan, `""`, atau `"*"`, atau berupa regular expression yang cocok dengan string kosong, juga berjalan untuk event dengan `agent_type` kosong.2574`matcher` yang menyebutkan jenis agent tidak cocok dengan `agent_type` kosong. Hook yang matcher-nya dihilangkan, `""`, atau `"*"`, atau berupa ekspresi reguler yang cocok dengan string kosong, juga berjalan untuk event dengan `agent_type` kosong.
2575 2575
2576Pada Claude Code v2.1.271 atau lebih baru, subagent yang berjalan dengan tool [`SubagentHandback`](/docs/id/tools-reference) mengirimkan laporannya melalui tool tersebut sebelum berhenti. Field `last_assistant_message` kemudian berisi teks penutup subagent, jika ada, yang bukan laporan yang dikirimkan. Laporan tersebut adalah input `message` dari panggilan itu, yang diterima oleh hook `PreToolUse` atau `PostToolUse` yang mencocokkan `SubagentHandback` sebagai `tool_input.message`.2576Pada Claude Code v2.1.271 atau yang lebih baru, subagent yang berjalan dengan tool [`SubagentHandback`](/docs/id/tools-reference) mengirimkan laporannya melalui tool tersebut sebelum berhenti. Field `last_assistant_message` kemudian memuat teks penutup subagent, jika ada, yang bukan laporan yang dikirimkan. Laporan tersebut adalah input `message` dari panggilan itu, yang diterima hook `PreToolUse` atau `PostToolUse` yang dicocokkan pada `SubagentHandback` sebagai `tool_input.message`.
2577 2577
2578Hook SubagentStop juga menerima array `background_tasks` dan `session_crons` yang dijelaskan di bawah [Input Stop](#stop-input). Kedua array tersebut dicakup ke sesi induk, bukan subagent.2578Hook SubagentStop juga menerima array `background_tasks` dan `session_crons` yang dijelaskan di [Input Stop](#stop-input). Kedua array tersebut dicakup ke sesi induk, bukan subagent.
2579 2579
2580```json theme={null}2580```json theme={null}
2581{2581{
2594}2594}
2595```2595```
2596 2596
2597Hook SubagentStop menggunakan format kontrol keputusan yang sama seperti [hook Stop](#stop-decision-control), termasuk `hookSpecificOutput.additionalContext` dengan `hookEventName` diatur ke `"SubagentStop"`, untuk umpan balik non-error yang membuat subagent tetap berjalan. Mengembalikan `decision: "block"` dengan `reason` membuat subagent tetap berjalan dan mengirimkan `reason` ke subagent sebagai instruksi berikutnya. Hook yang memblokir dengan keluar menggunakan kode 2 mengirimkan pesan stderr-nya dengan cara yang sama. Untuk menyuntikkan konteks ke sesi induk setelah subagent kembali, gunakan hook [`PostToolUse`](#posttooluse) pada tool `Agent` sebagai gantinya.2597Hook SubagentStop menggunakan format kontrol keputusan yang sama seperti [hook Stop](#stop-decision-control), termasuk `hookSpecificOutput.additionalContext` dengan `hookEventName` diatur ke `"SubagentStop"`, untuk umpan balik non-error yang membuat subagent tetap berjalan. Mengembalikan `decision: "block"` dengan `reason` membuat subagent tetap berjalan dan mengirimkan `reason` ke subagent sebagai instruksi berikutnya. Hook yang memblokir dengan keluar menggunakan exit 2 mengirimkan pesan stderr-nya dengan cara yang sama. Untuk menyisipkan konteks ke sesi induk setelah subagent kembali, gunakan hook [`PostToolUse`](#posttooluse) pada tool `Agent` sebagai gantinya.
2598 2598
2599<h3 id="taskcreated">2599<h3 id="taskcreated">
2600 TaskCreated2600 TaskCreated
2601</h3>2601</h3>
2602 2602
2603Berjalan ketika sebuah tugas sedang dibuat melalui tool `TaskCreate`. Gunakan ini untuk menegakkan konvensi penamaan, mewajibkan deskripsi tugas, atau mencegah tugas tertentu dibuat. Dalam [sesi tanpa tool Task](/docs/id/tools-reference#task-tool-availability), event ini tidak dipicu.2603Berjalan ketika sebuah task sedang dibuat melalui tool `TaskCreate`. Gunakan ini untuk menerapkan konvensi penamaan, mewajibkan deskripsi task, atau mencegah task tertentu dibuat. Dalam [sesi tanpa tool Task](/docs/id/tools-reference#task-tool-availability), event ini tidak dipicu.
2604 2604
2605Hook TaskCreated tidak mendukung matcher dan dipicu pada setiap kejadian.2605Hook TaskCreated tidak mendukung matcher dan dipicu pada setiap kejadian.
2606 2606
2626 2626
2627| Field | Deskripsi |2627| Field | Deskripsi |
2628| :- | :- |2628| :- | :- |
2629| `task_id` | Pengidentifikasi tugas yang sedang dibuat |2629| `task_id` | Pengidentifikasi task yang sedang dibuat |
2630| `task_subject` | Judul tugas |2630| `task_subject` | Judul task |
2631| `task_description` | Deskripsi terperinci tugas. Mungkin tidak ada |2631| `task_description` | Deskripsi terperinci task. Mungkin tidak ada |
2632| `teammate_name` | Nama rekan tim yang membuat tugas. Mungkin tidak ada |2632| `teammate_name` | Nama rekan tim yang membuat task. Mungkin tidak ada |
2633| `team_name` | Deprecated. Nama tim yang diturunkan dari sesi; akan dihapus dalam rilis mendatang |2633| `team_name` | Deprecated. Nama tim yang diturunkan dari sesi; akan dihapus dalam rilis mendatang |
2634 2634
2635<h4 id="taskcreated-decision-control">2635<h4 id="taskcreated-decision-control">
2636 Kontrol keputusan TaskCreated2636 Kontrol keputusan TaskCreated
2637</h4>2637</h4>
2638 2638
2639Hook TaskCreated dapat memblokir pembuatan dengan dua cara. Dengan cara mana pun, Claude Code menghapus tugas dan mengembalikan pesan Anda kepada Claude sebagai error tool. Claude Code mengabaikan `continue: false` dari event ini dan Claude tetap bekerja.2639Hook TaskCreated dapat memblokir pembuatan dengan dua cara. Dengan cara mana pun, Claude Code menghapus task dan mengembalikan pesan Anda kepada Claude sebagai error tool. Claude Code mengabaikan `continue: false` dari event ini dan Claude terus bekerja.
2640 2640
2641* **Exit code 2**: Claude Code mengembalikan teks stderr sebagai pesan.2641* **Exit code 2**: Claude Code mengembalikan teks stderr sebagai pesan.
2642* **JSON `{"decision": "block", "reason": "..."}`**: Claude Code mengembalikan `reason` sebagai pesan.2642* **JSON `{"decision": "block", "reason": "..."}`**: Claude Code mengembalikan `reason` sebagai pesan.
2643 2643
2644Contoh ini memblokir tugas yang subjeknya tidak mengikuti format yang diwajibkan:2644Contoh ini memblokir task yang subjeknya tidak mengikuti format yang diwajibkan:
2645 2645
2646```bash theme={null}2646```bash theme={null}
2647#!/bin/bash2647#!/bin/bash
2660 TaskCompleted2660 TaskCompleted
2661</h3>2661</h3>
2662 2662
2663Berjalan ketika sebuah tugas sedang ditandai sebagai selesai. Ini dipicu dalam dua situasi: ketika agent mana pun secara eksplisit menandai tugas sebagai selesai melalui tool TaskUpdate, atau ketika rekan tim [tim agent](/docs/id/agent-teams) menyelesaikan gilirannya dengan tugas yang sedang berlangsung. Gunakan ini untuk menegakkan kriteria penyelesaian seperti lolos pengujian atau pemeriksaan lint sebelum tugas dapat ditutup.2663Berjalan ketika sebuah task sedang ditandai sebagai selesai. Ini dipicu dalam dua situasi: ketika agent mana pun secara eksplisit menandai task sebagai selesai melalui tool TaskUpdate, atau ketika rekan tim [tim agent](/docs/id/agent-teams) menyelesaikan gilirannya dengan task yang sedang dikerjakan. Gunakan ini untuk menerapkan kriteria penyelesaian seperti lulus tes atau pemeriksaan lint sebelum task dapat ditutup.
2664 2664
2665Hook TaskCompleted tidak mendukung matcher dan dipicu pada setiap kejadian.2665Hook TaskCompleted tidak mendukung matcher dan dipicu pada setiap kejadian.
2666 2666
2687 2687
2688| Field | Deskripsi |2688| Field | Deskripsi |
2689| :- | :- |2689| :- | :- |
2690| `task_id` | Pengidentifikasi tugas yang sedang diselesaikan |2690| `task_id` | Pengidentifikasi task yang sedang diselesaikan |
2691| `task_subject` | Judul tugas |2691| `task_subject` | Judul task |
2692| `task_description` | Deskripsi terperinci tugas. Mungkin tidak ada |2692| `task_description` | Deskripsi terperinci task. Mungkin tidak ada |
2693| `teammate_name` | Nama rekan tim yang menyelesaikan tugas. Mungkin tidak ada |2693| `teammate_name` | Nama rekan tim yang menyelesaikan task. Mungkin tidak ada |
2694| `team_name` | Deprecated. Nama tim yang diturunkan dari sesi; akan dihapus dalam rilis mendatang |2694| `team_name` | Deprecated. Nama tim yang diturunkan dari sesi; akan dihapus dalam rilis mendatang |
2695 2695
2696<h4 id="taskcompleted-decision-control">2696<h4 id="taskcompleted-decision-control">
2697 Kontrol keputusan TaskCompleted2697 Kontrol keputusan TaskCompleted
2698</h4>2698</h4>
2699 2699
2700Hook TaskCompleted mendukung dua cara untuk mengontrol penyelesaian tugas:2700Hook TaskCompleted mendukung dua cara untuk mengontrol penyelesaian task:
2701 2701
2702* **Exit code 2**: tugas tidak ditandai sebagai selesai dan pesan stderr diumpankan kembali ke model sebagai umpan balik.2702* **Exit code 2**: task tidak ditandai sebagai selesai dan pesan stderr diumpankan kembali ke model sebagai umpan balik.
2703* **JSON `{"continue": false, "stopReason": "..."}`**: ketika rekan tim yang menyelesaikan gilirannya memicu event, rekan tim dihentikan sepenuhnya, sesuai dengan perilaku hook `Stop`. `stopReason` ditampilkan kepada pengguna. Ketika tool `TaskUpdate` memicu event, Claude Code mengabaikan `continue: false`; exit code 2 tetap memblokir penyelesaian.2703* **JSON `{"continue": false, "stopReason": "..."}`**: ketika rekan tim yang menyelesaikan gilirannya memicu event, menghentikan rekan tim sepenuhnya, sesuai dengan perilaku hook `Stop`. `stopReason` ditampilkan kepada pengguna. Ketika tool `TaskUpdate` memicu event, Claude Code mengabaikan `continue: false`; exit code 2 tetap memblokir penyelesaian.
2704 2704
2705Contoh ini menjalankan pengujian dan memblokir penyelesaian tugas jika pengujian gagal:2705Contoh ini menjalankan tes dan memblokir penyelesaian task jika tes gagal:
2706 2706
2707```bash theme={null}2707```bash theme={null}
2708#!/bin/bash2708#!/bin/bash
2734 Input Stop2734 Input Stop
2735</h4>2735</h4>
2736 2736
2737Selain [field input umum](#common-input-fields), hook Stop menerima `stop_hook_active`, `last_assistant_message`, `background_tasks`, dan `session_crons`. Field `stop_hook_active` bernilai `true` ketika Claude Code sudah melanjutkan sebagai akibat dari hook stop. Periksa nilai ini atau proses transkrip untuk menghindari pemblokiran pada kondisi yang tidak akan pernah terselesaikan. Claude Code menerapkan batas 8 kelanjutan berturut-turut: setelah hook stop melanjutkan giliran delapan kali berturut-turut, Claude Code menimpa blokir berikutnya dan mengakhiri giliran. Untuk menaikkan batas, atur [`CLAUDE_CODE_STOP_HOOK_BLOCK_CAP`](/docs/id/env-vars).2737Selain [field input umum](#common-input-fields), hook Stop menerima `stop_hook_active`, `last_assistant_message`, `background_tasks`, dan `session_crons`. Field `stop_hook_active` bernilai `true` ketika Claude Code sudah melanjutkan sebagai akibat dari stop hook. Periksa nilai ini atau proses transkrip untuk menghindari pemblokiran pada kondisi yang tidak akan pernah terselesaikan. Claude Code menerapkan batas 8 kelanjutan berturut-turut: setelah stop hook melanjutkan giliran delapan kali berturut-turut, Claude Code menimpa blokir berikutnya dan mengakhiri giliran. Untuk menaikkan batas tersebut, atur [`CLAUDE_CODE_STOP_HOOK_BLOCK_CAP`](/docs/id/env-vars).
2738 2738
2739Field `last_assistant_message` berisi konten teks dari respons akhir Claude, sehingga hook dapat mengaksesnya tanpa mem-parse file transkrip. Untuk hook yang bertindak pada giliran yang baru saja selesai, seperti hook pembacaan dengan suara keras atau notifikasi, gunakan field ini alih-alih membaca `transcript_path`: file transkrip tidak dijamin menyertakan pesan akhir pada saat Stop di semua versi.2739Field `last_assistant_message` berisi konten teks dari respons akhir Claude, sehingga hook dapat mengaksesnya tanpa mem-parse file transkrip. Untuk hook yang bertindak atas giliran yang baru selesai, seperti hook baca-nyaring atau notifikasi, gunakan field ini alih-alih membaca `transcript_path`: file transkrip tidak dijamin menyertakan pesan akhir pada saat Stop di semua versi.
2740 2740
2741Array `background_tasks` dan `session_crons` memungkinkan hook membedakan "sesi sudah selesai" dari "sesi dijeda menunggu pekerjaan latar belakang untuk membangunkannya kembali". Kedua array hadir ketika registri tugas dapat dijangkau dan kosong ketika tidak ada yang sedang berjalan atau dijadwalkan.2741Array `background_tasks` dan `session_crons` memungkinkan hook membedakan antara "sesi sudah selesai" dan "sesi dijeda menunggu pekerjaan latar belakang untuk membangunkannya kembali". Kedua array ada ketika registri task dapat dijangkau dan kosong ketika tidak ada yang sedang berjalan atau dijadwalkan.
2742 2742
2743Setiap entri dalam `background_tasks` menjelaskan satu tugas yang sedang berjalan dan menggunakan field berikut:2743Setiap entri dalam `background_tasks` menjelaskan satu task yang sedang berjalan dan menggunakan field berikut:
2744 2744
2745| Field | Deskripsi |2745| Field | Deskripsi |
2746| :- | :- |2746| :- | :- |
2747| `id` | Pengidentifikasi tugas |2747| `id` | Pengidentifikasi task |
2748| `type` | Label jenis tugas yang mudah dibaca seperti `shell`, `subagent`, `monitor`, `workflow`, `teammate`, `cloud session`, atau `MCP task`. Setiap label mengidentifikasi fitur Claude Code mana yang membuat tugas tersebut. Menggunakan diskriminan mentah sebagai cadangan untuk jenis yang tidak dikenali |2748| `type` | Label jenis task yang mudah dibaca seperti `shell`, `subagent`, `monitor`, `workflow`, `teammate`, `cloud session`, atau `MCP task`. Setiap label mengidentifikasi fitur Claude Code mana yang membuat task tersebut. Kembali ke diskriminan mentah untuk jenis yang tidak dikenali |
2749| `status` | Status tugas saat ini |2749| `status` | Status task saat ini |
2750| `description` | Deskripsi teks bebas, dibatasi hingga 1000 karakter dengan penanda `… [+N chars]` di dalam string ketika dipotong |2750| `description` | Deskripsi teks bebas, dibatasi hingga 1000 karakter dengan penanda `… [+N chars]` di dalam string ketika dipotong |
2751| `command` | Baris perintah shell, dibatasi hingga 1000 karakter. Hanya ada untuk tugas `shell` |2751| `command` | Baris perintah shell, dibatasi hingga 1000 karakter. Hanya ada untuk task `shell` |
2752| `agent_type` | Nama jenis subagent. Hanya ada untuk tugas `subagent` |2752| `agent_type` | Nama jenis subagent. Hanya ada untuk task `subagent` |
2753| `server` | Nama server MCP. Hanya ada untuk tugas `monitor` dan `MCP task` |2753| `server` | Nama server MCP. Hanya ada untuk task `monitor` dan `MCP task` |
2754| `tool` | Nama tool MCP. Hanya ada untuk tugas `monitor` dan `MCP task` |2754| `tool` | Nama tool MCP. Hanya ada untuk task `monitor` dan `MCP task` |
2755| `name` | Nama workflow. Hanya ada untuk tugas `workflow` |2755| `name` | Nama workflow. Hanya ada untuk task `workflow` |
2756 2756
2757Setiap entri dalam `session_crons` menjelaskan satu wakeup terjadwal dengan cakupan sesi, yang bersumber dari `CronCreate`, `ScheduleWakeup`, dan `/loop`:2757Setiap entri dalam `session_crons` menjelaskan satu wakeup terjadwal dengan cakupan sesi, yang bersumber dari `CronCreate`, `ScheduleWakeup`, dan `/loop`:
2758 2758
2759| Field | Deskripsi |2759| Field | Deskripsi |
2760| :- | :- |2760| :- | :- |
2761| `id` | Pengidentifikasi tugas cron |2761| `id` | Pengidentifikasi task cron |
2762| `schedule` | Ekspresi cron, misalnya `0 9 * * 1-5` |2762| `schedule` | Ekspresi cron, misalnya `0 9 * * 1-5` |
2763| `recurring` | `false` untuk wakeup sekali jalan yang jadwalnya mengodekan satu waktu pemicu, `true` untuk tugas yang dipicu ulang pada setiap kecocokan |2763| `recurring` | `false` untuk wakeup sekali jalan yang jadwalnya mengodekan satu waktu pemicu, `true` untuk task yang dipicu ulang pada setiap kecocokan |
2764| `prompt` | Prompt yang dikirim ketika cron dipicu, dibatasi hingga 1000 karakter dengan penanda `… [+N chars]` yang sama |2764| `prompt` | Prompt yang dikirim ketika cron dipicu, dibatasi hingga 1000 karakter dengan penanda `… [+N chars]` yang sama |
2765 2765
2766Contoh ini menunjukkan input Stop dengan satu tugas shell yang sedang berjalan dan satu cron berulang:2766Contoh ini menunjukkan input Stop dengan satu task shell yang sedang berjalan dan satu cron berulang:
2767 2767
2768```json theme={null}2768```json theme={null}
2769{2769{
2803| Field | Deskripsi |2803| Field | Deskripsi |
2804| :- | :- |2804| :- | :- |
2805| `decision` | `"block"` mencegah Claude berhenti. Hilangkan untuk mengizinkan Claude berhenti |2805| `decision` | `"block"` mencegah Claude berhenti. Hilangkan untuk mengizinkan Claude berhenti |
2806| `reason` | Wajib ketika `decision` adalah `"block"`. Memberi tahu Claude mengapa ia harus melanjutkan |2806| `reason` | Wajib ketika `decision` bernilai `"block"`. Memberi tahu Claude mengapa ia harus melanjutkan |
2807| `hookSpecificOutput.additionalContext` | Umpan balik non-error untuk Claude. Percakapan berlanjut sehingga Claude dapat menindaklanjutinya, tetapi tidak seperti `decision: "block"`, umpan balik ini ditampilkan di transkrip sebagai umpan balik hook, bukan error hook |2807| `hookSpecificOutput.additionalContext` | Umpan balik non-error untuk Claude. Percakapan berlanjut sehingga Claude dapat menindaklanjutinya, tetapi tidak seperti `decision: "block"`, umpan balik ini ditampilkan dalam transkrip sebagai umpan balik hook, bukan error hook |
2808 2808
2809Hook yang memblokir dengan keluar menggunakan kode 2 dirutekan dengan cara yang sama seperti `reason`: Claude menerima pesan stderr sebagai penjelasan mengapa ia harus melanjutkan.2809Hook yang memblokir dengan keluar menggunakan exit 2 dirutekan dengan cara yang sama seperti `reason`: Claude menerima pesan stderr sebagai penjelasan mengapa ia harus melanjutkan.
2810 2810
2811```json theme={null}2811```json theme={null}
2812{2812{
2815}2815}
2816```2816```
2817 2817
2818Gunakan `additionalContext` ketika hook berfungsi sesuai rancangan dan memberikan panduan kepada Claude, seperti "jalankan test suite sebelum selesai". Ini menjaga percakapan tetap berjalan melalui perlindungan loop yang sama seperti `decision: "block"`, yaitu input `stop_hook_active` dan batas 8 kelanjutan berturut-turut, tetapi transkrip melabelinya `Stop hook feedback` dan tidak ada notifikasi error hook yang ditampilkan:2818Gunakan `additionalContext` ketika hook bekerja sesuai rancangan dan memberikan panduan kepada Claude, seperti "jalankan test suite sebelum selesai". Ini membuat percakapan tetap berjalan melalui perlindungan loop yang sama seperti `decision: "block"`, yaitu input `stop_hook_active` dan batas 8 kelanjutan berturut-turut, tetapi transkrip melabelinya sebagai `Stop hook feedback` dan tidak ada notifikasi error hook yang ditampilkan:
2819 2819
2820```json theme={null}2820```json theme={null}
2821{2821{
2842| :- | :- |2842| :- | :- |
2843| `error` | Jenis error: `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` |2843| `error` | Jenis error: `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` |
2844| `error_details` | Detail tambahan tentang error, jika tersedia |2844| `error_details` | Detail tambahan tentang error, jika tersedia |
2845| `last_assistant_message` | Teks error yang dirender dan ditampilkan dalam percakapan. Tidak seperti `Stop` dan `SubagentStop`, di mana field ini berisi output percakapan Claude, untuk `StopFailure` field ini berisi string error API itu sendiri, seperti `"API Error: Rate limit reached"` |2845| `last_assistant_message` | Teks error yang dirender dan ditampilkan dalam percakapan. Tidak seperti `Stop` dan `SubagentStop`, di mana field ini memuat output percakapan Claude, untuk `StopFailure` field ini berisi string error API itu sendiri, seperti `"API Error: Rate limit reached"` |
2846 2846
2847```json theme={null}2847```json theme={null}
2848{2848{
2862 TeammateIdle2862 TeammateIdle
2863</h3>2863</h3>
2864 2864
2865Berjalan ketika rekan tim [tim agent](/docs/id/agent-teams) akan menjadi idle setelah menyelesaikan gilirannya. Gunakan ini untuk menegakkan gerbang kualitas sebelum rekan tim berhenti bekerja, seperti mewajibkan lolos pemeriksaan lint atau memverifikasi bahwa file output ada.2865Berjalan ketika rekan tim [tim agent](/docs/id/agent-teams) akan menjadi idle setelah menyelesaikan gilirannya. Gunakan ini untuk menerapkan gerbang kualitas sebelum rekan tim berhenti bekerja, seperti mewajibkan pemeriksaan lint yang lulus atau memverifikasi bahwa file output ada.
2866 2866
2867Hook TeammateIdle tidak mendukung matcher dan dipicu pada setiap kejadian.2867Hook TeammateIdle tidak mendukung matcher dan dipicu pada setiap kejadian.
2868 2868
2915 ConfigChange2915 ConfigChange
2916</h3>2916</h3>
2917 2917
2918Berjalan ketika file konfigurasi berubah selama sesi. Gunakan ini untuk mengaudit perubahan pengaturan, menegakkan kebijakan keamanan, atau memblokir modifikasi yang tidak sah pada file konfigurasi.2918Berjalan ketika file konfigurasi berubah selama sesi. Gunakan ini untuk mengaudit perubahan pengaturan, menerapkan kebijakan keamanan, atau memblokir modifikasi yang tidak sah pada file konfigurasi.
2919 2919
2920Claude Code menjalankan hook ConfigChange ketika file pengaturan, file kebijakan terkelola, atau file skill berubah. Untuk kebijakan terkelola, Claude Code menjalankannya hanya ketika `managed-settings.json` atau file di `managed-settings.d/` berubah. Claude Code menerapkan [pengaturan yang dikelola server](/docs/id/server-managed-settings) dan perubahan pada preferensi terkelola macOS atau kebijakan registri Windows tanpa menjalankannya. Di WSL dengan [`wslInheritsWindowsSettings`](/docs/id/settings-reference#wslinheritswindowssettings), Claude Code juga menerapkan file pengaturan terkelola sisi Windows yang berubah pada polling kebijakannya tanpa menjalankannya.2920Claude Code menjalankan hook ConfigChange ketika file pengaturan, file kebijakan terkelola, atau file skill berubah. Untuk kebijakan terkelola, Claude Code menjalankannya hanya ketika `managed-settings.json` atau file di `managed-settings.d/` berubah. Claude Code menerapkan [pengaturan yang dikelola server](/docs/id/server-managed-settings) dan perubahan pada preferensi terkelola macOS atau kebijakan registri Windows tanpa menjalankannya. Di WSL dengan [`wslInheritsWindowsSettings`](/docs/id/settings-reference#wslinheritswindowssettings), Claude Code juga menerapkan file pengaturan terkelola sisi Windows yang berubah pada polling kebijakannya tanpa menjalankannya.
2921 2921
2984}2984}
2985```2985```
2986 2986
2987Perubahan `policy_settings` tidak dapat diblokir. Hook tetap dipicu untuk sumber `policy_settings` ketika file pengaturan terkelola di mesin berubah, sehingga Anda dapat menggunakannya untuk mencatat pengeditan tersebut, tetapi keputusan pemblokiran apa pun akan diabaikan. Ini memastikan pengaturan yang dikelola perusahaan selalu berlaku. Claude Code tidak menjalankan hook `ConfigChange` ketika [pengaturan yang dikelola server](/docs/id/server-managed-settings) tiba atau diperbarui.2987Perubahan `policy_settings` tidak dapat diblokir. Hook tetap dipicu untuk sumber `policy_settings` ketika file pengaturan terkelola di mesin berubah, sehingga Anda dapat menggunakannya untuk mencatat suntingan tersebut, tetapi setiap keputusan pemblokiran diabaikan. Ini memastikan pengaturan yang dikelola perusahaan selalu berlaku. Claude Code tidak menjalankan hook `ConfigChange` ketika [pengaturan yang dikelola server](/docs/id/server-managed-settings) tiba atau diperbarui.
2988 2988
2989Claude Code menindaklanjuti keputusan pemblokiran dari output JSON hook ConfigChange dan membuang `systemMessage` dan `continue`. Perubahan yang diblokir tidak memunculkan pesan apa pun kepada Anda atau kepada Claude, baik Anda memblokir dengan `reason` maupun dengan stderr pada exit 2. Claude Code hanya menulis satu baris ke log debug.2989Claude Code menindaklanjuti keputusan pemblokiran dari output JSON hook ConfigChange dan membuang `systemMessage` dan `continue`. Perubahan yang diblokir tidak memunculkan pesan apa pun kepada Anda atau Claude, baik Anda memblokir dengan `reason` maupun dengan stderr pada exit 2. Claude Code hanya menulis satu baris ke log debug.
2990 2990
2991<h3 id="cwdchanged">2991<h3 id="cwdchanged">
2992 CwdChanged2992 CwdChanged
2993</h3>2993</h3>
2994 2994
2995Berjalan ketika perintah shell dalam percakapan utama mengubah direktori kerja, misalnya ketika Claude mengeksekusi perintah `cd`. Gunakan ini untuk bereaksi terhadap perubahan direktori: memuat ulang environment variable, mengaktifkan toolchain khusus proyek, atau menjalankan skrip penyiapan secara otomatis. Berpasangan dengan [FileChanged](#filechanged) untuk tool seperti [direnv](https://direnv.net/) yang mengelola environment per direktori.2995Berjalan ketika perintah shell dalam percakapan utama mengubah direktori kerja, misalnya ketika Claude mengeksekusi perintah `cd`. Gunakan ini untuk bereaksi terhadap perubahan direktori: memuat ulang environment variable, mengaktifkan toolchain khusus proyek, atau menjalankan skrip penyiapan secara otomatis. Berpasangan dengan [FileChanged](#filechanged) untuk alat seperti [direnv](https://direnv.net/) yang mengelola environment per direktori.
2996 2996
2997Hook CwdChanged memiliki akses ke [`CLAUDE_ENV_FILE`](#persist-environment-variables). Variabel yang ditulis ke file tersebut bertahan ke perintah Bash berikutnya hingga event CwdChanged berikutnya, ketika Claude Code menghapusnya.2997Hook CwdChanged memiliki akses ke [`CLAUDE_ENV_FILE`](#persist-environment-variables). Variabel yang ditulis ke file tersebut bertahan ke perintah Bash berikutnya hingga event CwdChanged selanjutnya, ketika Claude Code menghapusnya.
2998 2998
2999CwdChanged tidak mendukung matcher dan dipicu pada setiap kejadian.2999CwdChanged tidak mendukung matcher dan dipicu pada setiap kejadian.
3000 3000
3019 Output CwdChanged3019 Output CwdChanged
3020</h4>3020</h4>
3021 3021
3022Selain [field output JSON](#json-output) yang tersedia untuk semua hook, hook CwdChanged dapat mengembalikan `watchPaths` untuk secara dinamis mengatur path file mana yang dipantau oleh [FileChanged](#filechanged):3022Selain [field output JSON](#json-output) yang tersedia untuk semua hook, hook CwdChanged dapat mengembalikan `watchPaths` untuk mengatur secara dinamis path file mana yang dipantau oleh [FileChanged](#filechanged):
3023 3023
3024| Field | Deskripsi |3024| Field | Deskripsi |
3025| :- | :- |3025| :- | :- |
3026| `watchPaths` | Array path absolut. Menggantikan daftar pantauan dinamis saat ini. Path dari konfigurasi `matcher` Anda selalu dipantau. Mengembalikan array kosong akan mengosongkan daftar dinamis, yang umum dilakukan saat memasuki direktori baru |3026| `watchPaths` | Array path absolut. Menggantikan daftar pantau dinamis saat ini. Path dari konfigurasi `matcher` Anda selalu dipantau. Mengembalikan array kosong akan mengosongkan daftar dinamis, yang umum dilakukan saat memasuki direktori baru |
3027 3027
3028Hook CwdChanged tidak memiliki kontrol keputusan. Hook ini tidak dapat memblokir perubahan direktori.3028Hook CwdChanged tidak memiliki kontrol keputusan. Hook ini tidak dapat memblokir perubahan direktori.
3029 3029
3038Claude Code tidak memicu event ini ketika:3038Claude Code tidak memicu event ini ketika:
3039 3039
3040* Anda meneruskan direktori dengan flag startup `--add-dir`; [SessionStart](#sessionstart) mencakup direktori tersebut3040* Anda meneruskan direktori dengan flag startup `--add-dir`; [SessionStart](#sessionstart) mencakup direktori tersebut
3041* Anda menambahkan direktori pada tab Workspace di `/permissions`3041* Anda menambahkan direktori di tab Workspace `/permissions`
3042* Anda menambahkan direktori yang sudah merupakan direktori kerja atau berada di dalamnya3042* Anda menambahkan direktori yang sudah menjadi direktori kerja atau berada di dalamnya
3043 3043
3044Claude Code memicu DirectoryAdded setelah menyegarkan status sandbox dan izin, sehingga tool yang di-sandbox sudah melihat direktori baru ketika hook Anda berjalan. Perintah hook itu sendiri berjalan tanpa sandbox.3044Claude Code memicu DirectoryAdded setelah memperbarui status sandbox dan izin, sehingga tool yang di-sandbox sudah melihat direktori baru ketika hook Anda berjalan. Perintah hook itu sendiri berjalan tanpa sandbox.
3045 3045
3046Claude Code tidak menunggu hook: penambahan selesai segera, dan hook berjalan di latar belakang dengan timeout default 600 detik.3046Claude Code tidak menunggu hook: penambahan selesai segera, dan hook berjalan di latar belakang dengan timeout default 600 detik.
3047 3047
3074}3074}
3075```3075```
3076 3076
3077Hook DirectoryAdded tidak memiliki kontrol keputusan. Hook ini tidak dapat memblokir penambahan, yang sudah selesai saat hook berjalan. Claude Code membuang field `continue` dari output JSON-nya dan memunculkan sisanya secara berbeda per sumber:3077Hook DirectoryAdded tidak memiliki kontrol keputusan. Hook ini tidak dapat memblokir penambahan, yang sudah selesai ketika hook berjalan. Claude Code membuang field `continue` dari output JSON-nya dan memunculkan sisanya secara berbeda per sumber:
3078 3078
3079* `slash_command`: Claude Code mengirimkan `systemMessage` hook kepada Claude sebagai konteks pada giliran percakapan berikutnya, alih-alih menampilkannya kepada Anda. Jumlah hook yang gagal muncul di transkrip. Output kegagalan lengkap masuk ke log debug3079* `slash_command`: Claude Code mengirimkan `systemMessage` hook kepada Claude sebagai konteks pada giliran percakapan berikutnya, alih-alih menampilkannya kepada Anda. Jumlah hook yang gagal muncul dalam transkrip. Output kegagalan lengkap masuk ke log debug
3080* `register_repo_root`: Claude Code menulis output `systemMessage` dan output kegagalan hanya ke log debug3080* `register_repo_root`: Claude Code menulis output `systemMessage` dan output kegagalan hanya ke log debug
3081 3081
3082<h3 id="filechanged">3082<h3 id="filechanged">
3083 FileChanged3083 FileChanged
3084</h3>3084</h3>
3085 3085
3086Berjalan ketika file yang dipantau berubah di disk. Claude Code mendeteksi perubahan dengan pemantau filesystem, bukan dengan memeriksa panggilan tool, sehingga ia menjalankan hook apa pun yang mengubah file tersebut: panggilan tool `Edit` atau `Write`, skrip yang dijalankan Claude dengan `Bash`, atau proses yang sepenuhnya berada di luar Claude Code. Penggunaan umum adalah memuat ulang environment variable ketika file konfigurasi proyek berubah.3086Berjalan ketika file yang dipantau berubah di disk. Claude Code mendeteksi perubahan dengan pemantau filesystem, bukan dengan memeriksa panggilan tool, sehingga Claude Code menjalankan hook apa pun yang mengubah file tersebut: panggilan tool `Edit` atau `Write`, skrip yang dijalankan Claude dengan `Bash`, atau proses yang sepenuhnya di luar Claude Code. Penggunaan umum adalah memuat ulang environment variable ketika file konfigurasi proyek berubah.
3087 3087
3088`matcher` untuk event ini memiliki dua peran:3088`matcher` untuk event ini memiliki dua peran:
3089 3089
3090* **Membangun daftar pantauan**: nilainya dipisah berdasarkan `|` dan setiap segmen didaftarkan sebagai nama file literal di direktori kerja, sehingga `".envrc|.env"` memantau tepat kedua file tersebut. Pola regex tidak berguna di sini: nilai seperti `^\.env` akan memantau file yang secara literal bernama `^\.env`.3090* **Membangun daftar pantau**: nilai dipisahkan pada `|` dan setiap segmen didaftarkan sebagai nama file literal di direktori kerja, sehingga `".envrc|.env"` memantau tepat kedua file tersebut. Pola regex tidak berguna di sini: nilai seperti `^\.env` akan memantau file yang secara literal bernama `^\.env`.
3091* **Memfilter hook mana yang berjalan**: ketika file yang dipantau berubah, nilai yang sama memfilter grup hook mana yang berjalan menggunakan [aturan matcher](#matcher-patterns) standar terhadap basename file yang berubah.3091* **Memfilter hook mana yang berjalan**: ketika file yang dipantau berubah, nilai yang sama memfilter grup hook mana yang berjalan menggunakan [aturan matcher](#matcher-patterns) standar terhadap basename file yang berubah.
3092 3092
3093Contoh ini menormalkan akhir baris di `data.csv` setelah perubahan apa pun, termasuk perintah `Bash` atau skrip eksternal yang menulis ulang file:3093Contoh ini menormalkan akhir baris di `data.csv` setelah setiap perubahan, termasuk perintah `Bash` atau skrip eksternal yang menulis ulang file:
3094 3094
3095```json theme={null}3095```json theme={null}
3096{3096{
3110}3110}
3111```3111```
3112 3112
3113Hook membaca path absolut file yang berubah dari field `file_path` pada [input JSON](#filechanged-input) di stdin. Penjaga `grep`-nya menguji hal yang sama yang dihapus oleh `perl`, yaitu CR di akhir baris, sehingga eksekusi setelah normalisasi keluar tanpa menyentuh file. Penjaga yang lebih longgar akan berulang tanpa henti, karena `perl -i` menulis ulang file bahkan ketika tidak mengganti apa pun dan Claude Code menjalankan hook lagi setelah setiap penulisan ulang. Simpan skrip ini di `/path/to/normalize-line-endings.sh` dan jadikan dapat dieksekusi:3113Hook membaca path absolut file yang berubah dari field `file_path` pada [input JSON](#filechanged-input) di stdin. Penjaga `grep`-nya menguji hal yang sama yang dihapus oleh `perl`, yaitu CR di akhir baris, sehingga proses setelah normalisasi keluar tanpa menyentuh file. Penjaga yang lebih longgar akan berulang tanpa henti, karena `perl -i` menulis ulang file bahkan ketika tidak ada yang disubstitusi dan Claude Code menjalankan hook lagi setelah setiap penulisan ulang. Simpan skrip ini di `/path/to/normalize-line-endings.sh` dan jadikan dapat dieksekusi:
3114 3114
3115```bash theme={null}3115```bash theme={null}
3116#!/bin/bash3116#!/bin/bash
3122 3122
3123Untuk memastikan hook berfungsi, minta Claude menambahkan baris CRLF ke `data.csv` dengan perintah `Bash`. Claude Code menjalankan hook dan file akhirnya memiliki akhir baris LF.3123Untuk memastikan hook berfungsi, minta Claude menambahkan baris CRLF ke `data.csv` dengan perintah `Bash`. Claude Code menjalankan hook dan file akhirnya memiliki akhir baris LF.
3124 3124
3125Untuk memantau file yang tidak dapat Anda sebutkan di awal, kembalikan [`watchPaths`](#filechanged-output) dari hook untuk memperbarui daftar pantauan secara dinamis. Claude Code memulai pemantau hanya ketika sesuatu menyebutkan file untuk dipantau, jadi isi awal daftar dengan grup FileChanged yang matcher-nya menyebutkan setidaknya satu file, atau dengan hook [SessionStart](#sessionstart-decision-control) atau [CwdChanged](#cwdchanged) yang mengembalikan `watchPaths`. Matcher tetap memfilter grup hook mana yang berjalan ketika file yang dipantau berubah, jadi berikan grup yang menangani path dinamis matcher yang dihilangkan, yang cocok dengan setiap file yang dipantau dan tidak menambahkan apa pun ke daftar pantauan. Matcher `"*"` juga cocok dengan setiap file, tetapi Claude Code mendaftarkannya dalam daftar pantauan seperti nilai lainnya, sebagai file literal bernama `*`.3125Untuk memantau file yang tidak dapat Anda sebutkan di awal, kembalikan [`watchPaths`](#filechanged-output) dari hook untuk memperbarui daftar pantau secara dinamis. Claude Code memulai pemantau hanya ketika sesuatu menyebutkan file untuk dipantau, jadi isi awal daftar dengan grup FileChanged yang matcher-nya menyebutkan setidaknya satu file, atau dengan hook [SessionStart](#sessionstart-decision-control) atau [CwdChanged](#cwdchanged) yang mengembalikan `watchPaths`. Matcher tetap memfilter grup hook mana yang berjalan ketika file yang dipantau berubah, jadi berikan grup yang menangani path dinamis matcher yang dihilangkan, yang cocok dengan setiap file yang dipantau dan tidak menambahkan apa pun ke daftar pantau. Matcher `"*"` juga cocok dengan setiap file, tetapi Claude Code mendaftarkannya dalam daftar pantau seperti nilai lainnya, sebagai file literal bernama `*`.
3126 3126
3127Hook FileChanged memiliki akses ke [`CLAUDE_ENV_FILE`](#persist-environment-variables). Variabel yang ditulis ke file tersebut bertahan ke perintah Bash berikutnya hingga event [CwdChanged](#cwdchanged) berikutnya, ketika Claude Code menghapusnya.3127Hook FileChanged memiliki akses ke [`CLAUDE_ENV_FILE`](#persist-environment-variables). Variabel yang ditulis ke file tersebut bertahan ke perintah Bash berikutnya hingga event [CwdChanged](#cwdchanged) selanjutnya, ketika Claude Code menghapusnya.
3128 3128
3129<h4 id="filechanged-input">3129<h4 id="filechanged-input">
3130 Input FileChanged3130 Input FileChanged
3152 Output FileChanged3152 Output FileChanged
3153</h4>3153</h4>
3154 3154
3155Selain [field output JSON](#json-output) yang tersedia untuk semua hook, hook FileChanged dapat mengembalikan `watchPaths` untuk secara dinamis memperbarui path file mana yang dipantau:3155Selain [field output JSON](#json-output) yang tersedia untuk semua hook, hook FileChanged dapat mengembalikan `watchPaths` untuk memperbarui secara dinamis path file mana yang dipantau:
3156 3156
3157| Field | Deskripsi |3157| Field | Deskripsi |
3158| :- | :- |3158| :- | :- |
3159| `watchPaths` | Array path absolut. Menggantikan daftar pantauan 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 |3159| `watchPaths` | Array path absolut. Menggantikan daftar pantau 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 |
3160 3160
3161Hook FileChanged tidak memiliki kontrol keputusan. Hook ini tidak dapat memblokir terjadinya perubahan file.3161Hook FileChanged tidak memiliki kontrol keputusan. Hook ini tidak dapat memblokir terjadinya perubahan file.
3162 3162
3166 WorktreeCreate3166 WorktreeCreate
3167</h3>3167</h3>
3168 3168
3169Berjalan ketika worktree sedang dibuat, baik dari `claude --worktree`, dari [subagent yang menggunakan `isolation: "worktree"`](/docs/id/sub-agents#choose-the-subagent-scope), atau untuk [sesi latar belakang](/docs/id/agent-view#how-file-edits-are-isolated) yang diisolasi Claude Code dalam worktree-nya sendiri. Secara default, Claude Code membuat salinan kerja terisolasi dengan `git worktree`. Mengonfigurasi hook WorktreeCreate akan menggantikan perilaku git default tersebut, memungkinkan Anda menggunakan sistem kontrol versi yang berbeda seperti SVN, Perforce, atau Mercurial.3169Berjalan ketika worktree sedang dibuat, baik dari `claude --worktree`, dari [subagent yang menggunakan `isolation: "worktree"`](/docs/id/sub-agents#choose-the-subagent-scope), atau untuk [sesi latar belakang](/docs/id/agent-view#how-file-edits-are-isolated) yang diisolasi Claude Code dalam worktree-nya sendiri. Secara default Claude Code membuat salinan kerja terisolasi dengan `git worktree`. Mengonfigurasi hook WorktreeCreate menggantikan perilaku git default tersebut, sehingga Anda dapat menggunakan sistem kontrol versi lain seperti SVN, Perforce, atau Mercurial.
3170 3170
3171Karena hook sepenuhnya menggantikan perilaku default, [`.worktreeinclude`](/docs/id/worktrees#copy-gitignored-files-into-worktrees) tidak diproses. Jika Anda perlu menyalin file konfigurasi lokal seperti `.env` ke worktree baru, lakukan di dalam skrip hook Anda.3171Karena hook sepenuhnya menggantikan perilaku default, [`.worktreeinclude`](/docs/id/worktrees#copy-gitignored-files-into-worktrees) tidak diproses. Jika Anda perlu menyalin file konfigurasi lokal seperti `.env` ke worktree baru, lakukan di dalam skrip hook Anda.
3172 3172
3173Hook harus mengembalikan path ke direktori worktree yang dibuat. Claude Code menggunakan path ini sebagai direktori kerja untuk sesi terisolasi. Lihat [Output WorktreeCreate](#worktreecreate-output) untuk cara setiap jenis hook mengembalikan path.3173Hook harus mengembalikan path ke direktori worktree yang dibuat. Claude Code menggunakan path ini sebagai direktori kerja untuk sesi yang terisolasi. Lihat [Output WorktreeCreate](#worktreecreate-output) untuk cara setiap jenis hook mengembalikan path.
3174 3174
3175Claude Code menindaklanjuti keberhasilan hook dan path yang dikembalikan, serta membuang `systemMessage` dan `continue`.3175Claude Code menindaklanjuti keberhasilan hook dan path yang dikembalikan, serta membuang `systemMessage` dan `continue`.
3176 3176
3177Contoh ini membuat salinan kerja SVN dan mencetak path untuk digunakan Claude Code. Ganti URL repositori dengan milik Anda sendiri:3177Contoh ini membuat salinan kerja SVN dan mencetak path untuk digunakan oleh Claude Code. Ganti URL repositori dengan milik Anda sendiri:
3178 3178
3179```json theme={null}3179```json theme={null}
3180{3180{
3193}3193}
3194```3194```
3195 3195
3196Hook membaca `name` worktree dari input JSON di stdin, melakukan checkout salinan baru ke direktori baru, dan mencetak path direktori. `echo` pada baris terakhir adalah apa yang dibaca Claude Code sebagai path worktree. Alihkan output lainnya ke stderr agar tidak mengganggu path.3196Hook membaca `name` worktree dari input JSON di stdin, melakukan checkout salinan baru ke direktori baru, dan mencetak path direktori. `echo` pada baris terakhir adalah yang dibaca Claude Code sebagai path worktree. Alihkan output lainnya ke stderr agar tidak mengganggu path.
3197 3197
3198<h4 id="worktreecreate-input">3198<h4 id="worktreecreate-input">
3199 Input WorktreeCreate3199 Input WorktreeCreate
3215 Output WorktreeCreate3215 Output WorktreeCreate
3216</h4>3216</h4>
3217 3217
3218Hook WorktreeCreate tidak menggunakan model keputusan allow/block standar. Sebaliknya, keberhasilan atau kegagalan hook menentukan hasilnya. Hook harus mengembalikan path ke direktori worktree yang dibuat:3218Hook WorktreeCreate tidak menggunakan model keputusan izinkan/blokir standar. Sebagai gantinya, keberhasilan atau kegagalan hook menentukan hasilnya. Hook harus mengembalikan path ke direktori worktree yang dibuat:
3219 3219
3220* **Hook command** (`type: "command"`): cetak path sebagai baris tidak kosong terakhir dari stdout. Claude Code menghapus kode escape ANSI sebelum membaca baris tersebut, sehingga banner startup shell yang dicetak sebelum `echo` Anda diabaikan. Alihkan output hook lainnya ke stderr.3220* **Hook perintah** (`type: "command"`): cetak path sebagai baris tidak kosong terakhir dari stdout. Claude Code menghapus kode escape ANSI sebelum membaca baris tersebut, sehingga banner startup shell yang dicetak sebelum `echo` Anda diabaikan. Alihkan output hook lainnya ke stderr.
3221* **Hook HTTP** (`type: "http"`): kembalikan `{ "hookSpecificOutput": { "hookEventName": "WorktreeCreate", "worktreePath": "/absolute/path" } }` di body respons.3221* **Hook HTTP** (`type: "http"`): kembalikan `{ "hookSpecificOutput": { "hookEventName": "WorktreeCreate", "worktreePath": "/absolute/path" } }` dalam body respons.
3222 3222
3223Jika hook gagal atau tidak menghasilkan path, pembuatan worktree gagal dengan error.3223Jika hook gagal atau tidak menghasilkan path, pembuatan worktree gagal dengan error.
3224 3224
3225Claude Code menyelesaikan path relatif terhadap direktori tempat hook dijalankan, sambil menyederhanakan segmen `.` atau `..` di dalamnya. Jika path yang dihasilkan bukan direktori yang dapat dimasuki Claude Code, sesi mencetak error yang menyebutkan path tersebut dan keluar dengan kode 1.3225Claude Code me-resolve path relatif terhadap direktori tempat hook dijalankan, dengan meringkas segmen `.` atau `..` di dalamnya. Jika path yang dihasilkan bukan direktori yang dapat dimasuki Claude Code, sesi mencetak error yang menyebutkan path tersebut dan keluar dengan kode 1.
3226 3226
3227Claude Code menolak path absolut yang berisi segmen `.` atau `..`, serta path apa pun yang melewati symlink di bawah root repositori, karena symlink yang di-commit ke repositori dapat mengalihkan worktree ke luar repositori. Error tersebut menyebutkan komponen yang ditolak. Kembalikan path yang dinormalisasi yang tidak melewati symlink di dalam repositori. Sebelum v2.1.216, pembuatan worktree mengikuti path dari hook tanpa penyaringan ini.3227Claude Code menolak path absolut yang berisi segmen `.` atau `..`, serta path apa pun yang melewati symlink di bawah root repositori, karena symlink yang di-commit ke repositori dapat mengalihkan worktree ke luar repositori. Error tersebut menyebutkan komponen yang ditolak. Kembalikan path yang sudah dinormalisasi dan tidak melewati symlink di dalam repositori. Sebelum v2.1.216, pembuatan worktree mengikuti path dari hook tanpa pemeriksaan ini.
3228 3228
3229<h3 id="worktreeremove">3229<h3 id="worktreeremove">
3230 WorktreeRemove3230 WorktreeRemove
3231</h3>3231</h3>
3232 3232
3233Berjalan saat worktree sedang dihapus. Ini adalah pasangan pembersihan dari [WorktreeCreate](#worktreecreate). Event ini dipicu saat:3233Berjalan saat worktree sedang dihapus. Ini adalah pasangan pembersihan untuk [WorktreeCreate](#worktreecreate). Event ini dipicu ketika:
3234 3234
3235* Anda keluar dari sesi `--worktree` dan memilih untuk menghapusnya3235* Anda keluar dari sesi `--worktree` dan memilih untuk menghapusnya
3236* subagent dengan `isolation: "worktree"` selesai3236* subagent dengan `isolation: "worktree"` selesai
3238 3238
3239Untuk worktree berbasis git, Claude Code menangani pembersihan secara otomatis dengan `git worktree remove`. Jika Anda mengonfigurasi hook WorktreeCreate, pasangkan dengan hook WorktreeRemove untuk mengontrol pembersihan worktree yang dibuatnya:3239Untuk worktree berbasis git, Claude Code menangani pembersihan secara otomatis dengan `git worktree remove`. Jika Anda mengonfigurasi hook WorktreeCreate, pasangkan dengan hook WorktreeRemove untuk mengontrol pembersihan worktree yang dibuatnya:
3240 3240
3241* **Tanpa hook WorktreeRemove**: saat Anda keluar dari sesi `--worktree` dan memilih penghapusan, Claude Code melakukan fallback ke `git worktree remove --force` pada path yang dikembalikan hook WorktreeCreate Anda, sehingga worktree yang dikenali git akan dihapus. Worktree yang tidak dikenali git, misalnya yang dibuat hook Anda dengan sistem kontrol versi non-git, tetap ada di disk. Untuk apa yang dilakukan penghapusan [sesi latar belakang](/docs/id/agent-view#what-deleting-a-session-removes) terhadap worktree yang dibuat hook, lihat aturan penghapusan di agent view.3241* **Tanpa hook WorktreeRemove**: saat Anda keluar dari sesi `--worktree` dan memilih penghapusan, Claude Code beralih ke fallback `git worktree remove --force` pada path yang dikembalikan hook WorktreeCreate Anda, sehingga worktree yang dikenali git akan dihapus. Worktree yang tidak dikenali git, misalnya yang dibuat hook Anda dengan sistem kontrol versi non-git, tetap ada di disk. Untuk apa yang terjadi pada worktree yang dibuat hook saat menghapus [sesi latar belakang](/docs/id/agent-view#what-deleting-a-session-removes), lihat aturan penghapusan di agent view.
3242* **Hook keluar dengan 0**: worktree dianggap telah dihapus. Claude Code tidak membaca apa pun lagi dari hook, jadi pastikan hook Anda telah menghapus direktori tersebut.3242* **Hook keluar dengan 0**: worktree dianggap telah dihapus. Claude Code tidak membaca apa pun lagi dari hook, jadi pastikan hook Anda telah menghapus direktori tersebut.
3243* **Hook keluar dengan non-zero**: penghapusan gagal jika direktori di `worktree_path` masih ada setelahnya, dan worktree tetap ada di disk tanpa fallback git. Hook yang menghapus direktori sebelum keluar dengan non-zero dianggap telah dihapus. Untuk cara kegagalan dilaporkan, lihat [Input WorktreeRemove](#worktreeremove-input).3243* **Hook keluar dengan non-zero**: penghapusan gagal jika direktori di `worktree_path` masih ada setelahnya, dan worktree tetap ada di disk tanpa fallback git. Hook yang telah menghapus direktori sebelum keluar dengan non-zero dianggap berhasil menghapus. Untuk cara kegagalan dilaporkan, lihat [Input WorktreeRemove](#worktreeremove-input).
3244 3244
3245Claude Code tidak pernah menghapus branch milik worktree yang dibuat hook, karena Claude Code hanya mengetahui path yang dikembalikan hook WorktreeCreate Anda. Jika hook WorktreeCreate Anda membuat branch, hapus branch tersebut di hook WorktreeRemove Anda.3245Claude Code tidak pernah menghapus branch milik worktree yang dibuat hook, karena Claude Code hanya mengetahui path yang dikembalikan hook WorktreeCreate Anda. Jika hook WorktreeCreate Anda membuat branch, hapus branch tersebut di hook WorktreeRemove Anda.
3246 3246
3248 3248
3249Untuk penghapusan sesi latar belakang, Claude Code memverifikasi path worktree yang tersimpan sebelum menjalankan hook dan menolak path yang merupakan symlink atau melewati symlink di bawah root repositori. Hook berjalan untuk worktree yang masih berisi file hanya ketika Anda mengonfirmasi penghapusan di [agent view](/docs/id/agent-view#what-deleting-a-session-removes); untuk worktree seperti itu, [`claude rm`](/docs/id/agent-view#manage-sessions-from-the-shell) justru mempertahankan sesi dan worktree. Sebelum v2.1.216, hook berjalan pada path yang tersimpan tanpa pemeriksaan ini.3249Untuk penghapusan sesi latar belakang, Claude Code memverifikasi path worktree yang tersimpan sebelum menjalankan hook dan menolak path yang merupakan symlink atau melewati symlink di bawah root repositori. Hook berjalan untuk worktree yang masih berisi file hanya ketika Anda mengonfirmasi penghapusan di [agent view](/docs/id/agent-view#what-deleting-a-session-removes); untuk worktree seperti itu, [`claude rm`](/docs/id/agent-view#manage-sessions-from-the-shell) justru mempertahankan sesi dan worktree. Sebelum v2.1.216, hook berjalan pada path yang tersimpan tanpa pemeriksaan ini.
3250 3250
3251Claude Code meneruskan path yang dikembalikan oleh WorktreeCreate sebagai `worktree_path` di input hook. Contoh ini membaca path tersebut dan menghapus direktorinya:3251Claude Code meneruskan path yang dikembalikan oleh WorktreeCreate sebagai `worktree_path` dalam input hook. Contoh ini membaca path tersebut dan menghapus direktorinya:
3252 3252
3253```json theme={null}3253```json theme={null}
3254{3254{
3285 3285
3286Exit code hook WorktreeRemove menentukan hasilnya. Ketika hook keluar dengan non-zero dan direktori di `worktree_path` masih ada setelahnya, penghapusan gagal:3286Exit code hook WorktreeRemove menentukan hasilnya. Ketika hook keluar dengan non-zero dan direktori di `worktree_path` masih ada setelahnya, penghapusan gagal:
3287 3287
3288* Worktree tetap ada di disk, dan perintah serta stderr hook masuk ke [log debug](#debug-hooks).3288* Worktree tetap ada di disk, dan perintah serta stderr hook dikirim ke [log debug](#debug-hooks).
3289* Jika Anda sedang menghapus sesi latar belakang, sesi tersebut juga tetap ada. Pesan penolakan di [agent view](/docs/id/agent-view#what-deleting-a-session-removes) melaporkan bagaimana hook berakhir, seperti `exited 1`, mengutip bagian awal stderr-nya, dan menyebutkan apakah menghapus sesi lagi akan tetap menghapus direktori tersebut.3289* Jika Anda sedang menghapus sesi latar belakang, sesi tersebut juga tetap ada. Pesan penolakan di [agent view](/docs/id/agent-view#what-deleting-a-session-removes) melaporkan bagaimana hook berakhir, seperti `exited 1`, mengutip bagian awal stderr-nya, dan menyebutkan apakah menghapus sesi lagi akan tetap menghapus direktori tersebut.
3290 3290
3291<h3 id="precompact">3291<h3 id="precompact">
3299| Matcher | Kapan dipicu |3299| Matcher | Kapan dipicu |
3300| :- | :- |3300| :- | :- |
3301| `manual` | `/compact` |3301| `manual` | `/compact` |
3302| `auto` | Auto-compact saat percakapan mencapai [jendela auto-compact](/docs/id/model-config#set-the-auto-compact-window) |3302| `auto` | Auto-compact ketika percakapan mencapai [jendela auto-compact](/docs/id/model-config#set-the-auto-compact-window) |
3303 3303
3304Keluar dengan kode 2 untuk memblokir compaction. Untuk `/compact` manual, pesan stderr ditampilkan kepada pengguna. Anda juga dapat memblokir dengan mengembalikan JSON dengan `"decision": "block"`.3304Keluar dengan kode 2 untuk memblokir compaction. Untuk `/compact` manual, pesan stderr ditampilkan kepada pengguna. Anda juga dapat memblokir dengan mengembalikan JSON dengan `"decision": "block"`.
3305 3305
3306Memblokir compaction otomatis memiliki efek berbeda tergantung kapan dipicu. Jika compaction dipicu secara proaktif sebelum batas konteks, Claude Code melewatinya dan percakapan berlanjut tanpa dipadatkan. Jika compaction dipicu untuk memulihkan dari error batas konteks yang sudah dikembalikan oleh API, error yang mendasarinya muncul dan permintaan saat ini gagal.3306Memblokir compaction otomatis memiliki efek yang berbeda tergantung kapan dipicu. Jika compaction dipicu secara proaktif sebelum batas konteks, Claude Code melewatinya dan percakapan berlanjut tanpa di-compact. Jika compaction dipicu untuk memulihkan dari error batas konteks yang sudah dikembalikan oleh API, error yang mendasarinya akan muncul dan permintaan saat ini gagal.
3307 3307
3308Claude Code membuang field `systemMessage` dan `continue` dari hook PreCompact.3308Claude Code membuang field `systemMessage` dan `continue` dari hook PreCompact.
3309 3309
3311 Input PreCompact3311 Input PreCompact
3312</h4>3312</h4>
3313 3313
3314Selain [field input umum](#common-input-fields), hook PreCompact menerima `trigger` dan `custom_instructions`. Untuk `manual`, `custom_instructions` berisi apa yang diteruskan pengguna ke `/compact` dan bernilai `null` jika pengguna tidak meneruskan apa pun. Untuk `auto`, `custom_instructions` bernilai `null`.3314Selain [field input umum](#common-input-fields), hook PreCompact menerima `trigger` dan `custom_instructions`. Untuk `manual`, `custom_instructions` berisi apa yang diteruskan pengguna ke `/compact` dan bernilai `null` ketika pengguna tidak meneruskan apa pun. Untuk `auto`, `custom_instructions` bernilai `null`.
3315 3315
3316```json theme={null}3316```json theme={null}
3317{3317{
3328 PostCompact3328 PostCompact
3329</h3>3329</h3>
3330 3330
3331Berjalan setelah Claude Code menyelesaikan operasi compact. Gunakan event ini untuk bereaksi terhadap status baru yang telah dipadatkan, misalnya untuk mencatat ringkasan yang dihasilkan atau memperbarui status eksternal. Claude Code membuang field `systemMessage` dan `continue` dari hook PostCompact.3331Berjalan setelah Claude Code menyelesaikan operasi compact. Gunakan event ini untuk bereaksi terhadap state baru yang telah di-compact, misalnya untuk mencatat ringkasan yang dihasilkan atau memperbarui state eksternal. Claude Code membuang field `systemMessage` dan `continue` dari hook PostCompact.
3332 3332
3333Nilai matcher yang sama berlaku seperti untuk `PreCompact`:3333Nilai matcher yang sama berlaku seperti untuk `PreCompact`:
3334 3334
3335| Matcher | Kapan dipicu |3335| Matcher | Kapan dipicu |
3336| :- | :- |3336| :- | :- |
3337| `manual` | Setelah `/compact` |3337| `manual` | Setelah `/compact` |
3338| `auto` | Setelah auto-compact saat percakapan mencapai [jendela auto-compact](/docs/id/model-config#set-the-auto-compact-window) |3338| `auto` | Setelah auto-compact ketika percakapan mencapai [jendela auto-compact](/docs/id/model-config#set-the-auto-compact-window) |
3339 3339
3340<h4 id="postcompact-input">3340<h4 id="postcompact-input">
3341 Input PostCompact3341 Input PostCompact
3362 3362
3363Berjalan sebelum Claude Code menerapkan peralihan model yang diminta oleh Anda atau klien. Gunakan untuk memblokir peralihan, meminta konfirmasi, atau menampilkan biaya peralihan sebelum terjadi.3363Berjalan sebelum Claude Code menerapkan peralihan model yang diminta oleh Anda atau klien. Gunakan untuk memblokir peralihan, meminta konfirmasi, atau menampilkan biaya peralihan sebelum terjadi.
3364 3364
3365PreModelSwitch memerlukan Claude Code v2.1.251 atau lebih baru. Claude Code menjalankannya untuk permintaan berikut:3365PreModelSwitch memerlukan Claude Code v2.1.251 atau yang lebih baru. Claude Code menjalankannya untuk permintaan berikut:
3366 3366
3367* `/model <name>` dan pemilih `/model`3367* `/model <name>` dan pemilih `/model`
3368* Pemilih model `Option+P` atau `Alt+P`3368* Pemilih model `Option+P` atau `Alt+P`
3372 3372
3373Claude Code tidak menjalankan hook PreModelSwitch untuk peralihan yang dilakukannya sendiri, seperti [fallback model otomatis](/docs/id/model-config#automatic-model-fallback) atau memulihkan model saat Anda melanjutkan sesi. Perubahan tersebut hanya mencapai [PostModelSwitch](#postmodelswitch).3373Claude Code tidak menjalankan hook PreModelSwitch untuk peralihan yang dilakukannya sendiri, seperti [fallback model otomatis](/docs/id/model-config#automatic-model-fallback) atau memulihkan model saat Anda melanjutkan sesi. Perubahan tersebut hanya mencapai [PostModelSwitch](#postmodelswitch).
3374 3374
3375Claude Code membandingkan matcher dengan nama kanonis model tujuan peralihan sesi, dengan mengabaikan sufiks `[1m]`. Alias seperti `opus`, ID model bertanggal, dan ID khusus penyedia seperti ID model Amazon Bedrock semuanya cocok dengan satu nama kanonis yang menjadi hasil resolusinya, sehingga `claude-opus-5` mencakup setiap penulisan Opus 5.3375Claude Code membandingkan matcher dengan nama kanonis model yang menjadi tujuan peralihan sesi, dengan mengabaikan sufiks `[1m]`. Alias seperti `opus`, ID model bertanggal, dan ID khusus penyedia seperti ID model Amazon Bedrock semuanya cocok dengan satu nama kanonis yang menjadi hasil resolve-nya, sehingga `claude-opus-5` mencakup setiap penulisan Opus 5.
3376 3376
3377Ketika Claude Code tidak dapat menentukan nama kanonis untuk target, misalnya ID model kustom yang hanya dikenal oleh [LLM gateway](/docs/id/llm-gateway) Anda, Claude Code menjalankan setiap hook PreModelSwitch terlepas dari matcher. Oleh karena itu, hook yang memblokir sebaiknya memeriksa `to_model` dari inputnya alih-alih hanya mengandalkan matcher.3377Ketika Claude Code tidak dapat menentukan nama kanonis untuk target, misalnya ID model kustom yang hanya diketahui oleh [LLM gateway](/docs/id/llm-gateway) Anda, Claude Code menjalankan setiap hook PreModelSwitch terlepas dari matcher. Oleh karena itu, hook yang memblokir sebaiknya memeriksa `to_model` dari inputnya alih-alih hanya mengandalkan matcher.
3378 3378
3379Tulis matcher sebagai nama persis, daftar yang dipisahkan `|` seperti `claude-opus-4-6|claude-opus-5`, atau regular expression seperti `.*opus.*`. Contoh ini menggunakan matcher nama persis dan juga memeriksa `to_model` dari input hook, sehingga menolak peralihan ke Opus 4.6 dengan keluar menggunakan kode 2 dan membiarkan target lain lolos:3379Tulis matcher sebagai nama persis, daftar yang dipisahkan `|` seperti `claude-opus-4-6|claude-opus-5`, atau ekspresi reguler seperti `.*opus.*`. Contoh ini menggunakan matcher nama persis dan juga memeriksa `to_model` dari input hook, sehingga menolak peralihan ke Opus 4.6 dengan keluar menggunakan kode 2 dan membiarkan target lainnya lolos:
3380 3380
3381<Tabs>3381<Tabs>
3382 <Tab title="macOS/Linux">3382 <Tab title="macOS/Linux">
3402 </Tab>3402 </Tab>
3403 3403
3404 <Tab title="Windows (PowerShell)">3404 <Tab title="Windows (PowerShell)">
3405 Daftarkan hook command yang menjalankan skrip melalui PowerShell:3405 Daftarkan hook perintah yang menjalankan skrip melalui PowerShell:
3406 3406
3407 ```json theme={null}3407 ```json theme={null}
3408 {3408 {
3454| :- | :- | :- |3454| :- | :- | :- |
3455| `from_model` | string | ID model asal peralihan |3455| `from_model` | string | ID model asal peralihan |
3456| `to_model` | string | ID model tujuan peralihan. Matcher dibandingkan dengan nama kanonis model ini |3456| `to_model` | string | ID model tujuan peralihan. Matcher dibandingkan dengan nama kanonis model ini |
3457| `requested_model` | string atau `null` | Model yang disebutkan dalam permintaan: alias seperti `opus`, ID model lengkap, atau `null` jika permintaan ditujukan untuk model default |3457| `requested_model` | string atau `null` | Model yang disebutkan dalam permintaan: alias seperti `opus`, ID model lengkap, atau `null` ketika permintaan ditujukan untuk model default |
3458| `source` | string | Asal permintaan: `"command"` untuk `/model <name>`, pengaturan Model di `/config`, atau mengaktifkan fast mode; `"picker"` untuk pemilih model; `"sdk"` untuk permintaan `set_model`, atau perubahan model dalam permintaan `apply_flag_settings`, dari host Agent SDK atau Remote Control |3458| `source` | string | Asal permintaan: `"command"` untuk `/model <name>`, pengaturan Model di `/config`, atau mengaktifkan fast mode; `"picker"` untuk pemilih model; `"sdk"` untuk permintaan `set_model`, atau perubahan model dalam permintaan `apply_flag_settings`, dari host Agent SDK atau Remote Control |
3459| `context_tokens` | number | Token yang dikirim ulang oleh permintaan berikutnya sebagai prompt-nya: token input, cache read, cache creation, dan output dari respons terakhir dalam percakapan utama, digabungkan. `0` sebelum respons pertama |3459| `context_tokens` | number | Token yang dikirim ulang oleh permintaan berikutnya sebagai prompt-nya: gabungan token input, cache read, cache creation, dan output dari respons terakhir di percakapan utama. `0` sebelum respons pertama |
3460| `prompt_cache_warm` | boolean | Apakah prompt cache model saat ini kemungkinan masih hangat, yang berarti peralihan akan mengorbankannya |3460| `prompt_cache_warm` | boolean | Apakah prompt cache model saat ini kemungkinan masih hangat, yang berarti peralihan akan mengorbankannya |
3461| `cache_ttl` | string | [Masa berlaku prompt cache](/docs/id/prompt-caching#cache-lifetime) yang diminta Claude Code untuk sesi ini: `"5m"` atau `"1h"` |3461| `cache_ttl` | string | [Masa berlaku prompt cache](/docs/id/prompt-caching#cache-lifetime) yang diminta Claude Code untuk sesi ini: `"5m"` atau `"1h"` |
3462| `estimated_cache_write_usd` | number | Estimasi biaya dalam dolar AS untuk menulis `context_tokens` ke prompt cache pada `to_model` dengan tarif `cache_ttl`, tidak termasuk respons berikutnya. Server mungkin tidak perlu melakukan cache ulang seluruh konteks, jadi perlakukan ini sebagai estimasi |3462| `estimated_cache_write_usd` | number | Perkiraan biaya dalam dolar AS untuk menulis `context_tokens` ke prompt cache pada `to_model` dengan tarif `cache_ttl`, tidak termasuk respons berikutnya. Server mungkin tidak perlu melakukan cache ulang seluruh konteks, jadi anggap ini sebagai perkiraan |
3463| `pricing` | string | Cara Claude Code menghitung harga `estimated_cache_write_usd`: `"configured"` dengan tarif organisasi Anda sendiri jika organisasi telah mengonfigurasinya, `"catalog"` dengan harga daftar, atau `"default"` jika `to_model` tidak memiliki harga yang diketahui dan Claude Code mengasumsikan tarif default |3463| `pricing` | string | Cara Claude Code menghitung harga `estimated_cache_write_usd`: `"configured"` dengan tarif organisasi Anda sendiri ketika organisasi telah mengonfigurasinya, `"catalog"` dengan harga daftar, atau `"default"` ketika `to_model` tidak memiliki harga yang diketahui dan Claude Code mengasumsikan tarif default |
3464 3464
3465Contoh ini menunjukkan input untuk `/model opus` dalam sesi yang menjalankan Sonnet 5:3465Contoh ini menunjukkan input untuk `/model opus` dalam sesi yang menjalankan Sonnet 5:
3466 3466
3493| Field | Deskripsi |3493| Field | Deskripsi |
3494| :- | :- |3494| :- | :- |
3495| `permissionDecision` | `"allow"` melanjutkan dan melewati [konfirmasi yang ditampilkan Claude Code saat prompt cache masih hangat](/docs/id/prompt-caching#switching-models). `"deny"` membatalkan peralihan. `"ask"` meminta pengguna untuk mengonfirmasinya |3495| `permissionDecision` | `"allow"` melanjutkan dan melewati [konfirmasi yang ditampilkan Claude Code saat prompt cache masih hangat](/docs/id/prompt-caching#switching-models). `"deny"` membatalkan peralihan. `"ask"` meminta pengguna untuk mengonfirmasinya |
3496| `permissionDecisionReason` | Untuk `"deny"`, ditampilkan kepada pengguna sebagai alasan peralihan diblokir, atau dikembalikan sebagai error untuk permintaan `set_model`. Untuk `"ask"`, ditampilkan dalam dialog konfirmasi. Diabaikan untuk `"allow"` |3496| `permissionDecisionReason` | Untuk `"deny"`, ditampilkan kepada pengguna sebagai alasan peralihan diblokir, atau dikembalikan sebagai error untuk permintaan `set_model`. Untuk `"ask"`, ditampilkan dalam prompt konfirmasi. Diabaikan untuk `"allow"` |
3497 3497
3498Hanya `/model` dalam sesi interaktif yang dapat menampilkan dialog `"ask"`. Di setiap surface lainnya, termasuk mode non-interaktif dengan flag `-p`, `/config`, dan permintaan `set_model`, Claude Code memperlakukan `"ask"` sebagai penolakan.3498Hanya `/model` dalam sesi interaktif yang dapat menampilkan prompt `"ask"`. Di setiap surface lainnya, termasuk mode non-interaktif dengan flag `-p`, `/config`, dan permintaan `set_model`, Claude Code memperlakukan `"ask"` sebagai penolakan.
3499 3499
3500Contoh ini meminta pengguna untuk mengonfirmasi dan mengutip jumlah token dari `context_tokens`:3500Contoh ini meminta pengguna untuk mengonfirmasi dan mengutip jumlah token dari `context_tokens`:
3501 3501
3511 3511
3512Ketika beberapa hook PreModelSwitch mengembalikan keputusan yang berbeda, urutan prioritasnya adalah `deny` > `ask` > `allow`.3512Ketika beberapa hook PreModelSwitch mengembalikan keputusan yang berbeda, urutan prioritasnya adalah `deny` > `ask` > `allow`.
3513 3513
3514Claude Code menampilkan kepada pengguna setiap `systemMessage` yang dikembalikan hook Anda terlepas dari keputusannya, sehingga hook pelaporan biaya dapat mengembalikan `{"systemMessage": "..."}` dan keluar dengan 0.3514Claude Code menampilkan kepada pengguna setiap `systemMessage` yang dikembalikan hook Anda terlepas dari keputusannya, sehingga hook pelapor biaya dapat mengembalikan `{"systemMessage": "..."}` dan keluar dengan 0.
3515 3515
3516Hook PreModelSwitch yang tidak merespons sebelum timeout-nya akan memblokir peralihan. Sebaliknya, pada [PreToolUse](#timeouts), hook command yang mengalami timeout membiarkan panggilan tool berlanjut. Timeout default untuk event ini adalah 30 detik. `PreModelSwitch` hanya menjalankan hook `command`, `http`, dan `mcp_tool`, sehingga default `prompt` dan `agent` tidak berlaku.3516Hook PreModelSwitch yang tidak merespons sebelum timeout-nya akan memblokir peralihan. Sebaliknya, pada [PreToolUse](#timeouts), hook perintah yang mengalami timeout membiarkan panggilan tool berlanjut. Timeout default untuk event ini adalah 30 detik. `PreModelSwitch` hanya menjalankan hook `command`, `http`, dan `mcp_tool`, sehingga default `prompt` dan `agent` tidak berlaku.
3517 3517
3518Hook yang keluar dengan kode selain 0 atau 2 dan tidak mencetak keputusan JSON tidak memblokir: Claude Code menampilkan stderr-nya dan menerapkan peralihan, seperti dijelaskan di [Exit code lainnya](#other-exit-codes).3518Hook yang keluar dengan kode selain 0 atau 2 dan tidak mencetak keputusan JSON tidak memblokir: Claude Code menampilkan stderr-nya dan menerapkan peralihan, seperti yang dijelaskan di [Exit code lainnya](#other-exit-codes).
3519 3519
3520<h3 id="postmodelswitch">3520<h3 id="postmodelswitch">
3521 PostModelSwitch3521 PostModelSwitch
3522</h3>3522</h3>
3523 3523
3524Berjalan setelah model sesi berubah. Gunakan untuk memberi Claude panduan khusus model tanpa mengedit setiap CLAUDE.md, misalnya instruksi tingkat organisasi yang berlaku pada model tertentu.3524Berjalan setelah model sesi berubah. Gunakan untuk memberikan panduan khusus model kepada Claude tanpa mengedit setiap CLAUDE.md, misalnya instruksi tingkat organisasi yang berlaku pada model tertentu.
3525 3525
3526PostModelSwitch memerlukan Claude Code v2.1.251 atau lebih baru. Hook ini tidak dapat memblokir, karena model sudah berubah. Claude Code menjalankan hook PostModelSwitch setelah salah satu perubahan berikut:3526PostModelSwitch memerlukan Claude Code v2.1.251 atau yang lebih baru. Hook ini tidak dapat memblokir, karena model sudah berubah. Claude Code menjalankan hook PostModelSwitch setelah salah satu perubahan berikut:
3527 3527
3528* Peralihan yang diminta oleh Anda atau klien3528* Peralihan yang diminta oleh Anda atau klien
3529* [Fallback model otomatis](/docs/id/model-config#automatic-model-fallback), yang mengubah model sesi3529* [Fallback model otomatis](/docs/id/model-config#automatic-model-fallback), yang mengubah model sesi
3530* Pengaturan seperti [`opusplan`](/docs/id/model-config#opusplan-model-setting) yang masuk atau keluar dari plan mode3530* Pengaturan seperti [`opusplan`](/docs/id/model-config#opusplan-model-setting) yang masuk atau keluar dari plan mode
3531* Claude Code memulihkan model saat Anda melanjutkan sesi3531* Claude Code memulihkan model saat Anda melanjutkan sesi
3532 3532
3533Claude Code tidak menjalankan hook PostModelSwitch ketika model dari [rantai model fallback](/docs/id/model-config#fallback-model-chains) melayani sebuah giliran, karena substitusi tersebut hanya berlangsung satu giliran dan tidak mengubah model sesi.3533Claude Code tidak menjalankan hook PostModelSwitch ketika model dari [rantai model fallback](/docs/id/model-config#fallback-model-chains) melayani suatu giliran, karena substitusi tersebut hanya berlangsung satu giliran dan tidak mengubah model sesi.
3534 3534
3535Matcher mengikuti aturan yang sama seperti [PreModelSwitch](#premodelswitch): Claude Code membandingkannya dengan nama kanonis model tujuan peralihan sesi.3535Matcher mengikuti aturan yang sama seperti [PreModelSwitch](#premodelswitch): Claude Code membandingkannya dengan nama kanonis model yang menjadi tujuan peralihan sesi.
3536 3536
3537Contoh ini menambahkan panduan setiap kali model sesi berubah ke model Opus mana pun:3537Contoh ini menambahkan panduan setiap kali model sesi berubah ke model Opus mana pun:
3538 3538
3574| :- | :- |3574| :- | :- |
3575| `additionalContext` | String yang ditambahkan ke konteks Claude bersama permintaan berikutnya. Lihat [Menambahkan konteks untuk Claude](#add-context-for-claude) |3575| `additionalContext` | String yang ditambahkan ke konteks Claude bersama permintaan berikutnya. Lihat [Menambahkan konteks untuk Claude](#add-context-for-claude) |
3576 3576
3577Jika hook belum selesai dalam lima detik setelah Anda mengirim prompt berikutnya, Claude Code mengirim permintaan tersebut tanpa output dan melampirkannya ke permintaan setelahnya. Jika model berubah beberapa kali sebelum permintaan berikutnya, Claude Code hanya mengirimkan output untuk model target dari peralihan terakhir.3577Jika hook belum selesai dalam lima detik setelah Anda mengirim prompt berikutnya, Claude Code mengirim permintaan tersebut tanpa output dan melampirkannya ke permintaan selanjutnya. Jika model berubah beberapa kali sebelum permintaan berikutnya, Claude Code hanya mengirimkan output untuk model target peralihan terakhir.
3578 3578
3579<h3 id="sessionend">3579<h3 id="sessionend">
3580 SessionEnd3580 SessionEnd
3581</h3>3581</h3>
3582 3582
3583Berjalan saat sesi Claude Code berakhir. Berguna untuk tugas pembersihan, mencatat statistik3583Berjalan ketika sesi Claude Code berakhir. Berguna untuk tugas pembersihan, mencatat statistik
3584sesi, atau menyimpan status sesi. Mendukung matcher untuk memfilter berdasarkan alasan keluar.3584sesi, atau menyimpan state sesi. Mendukung matcher untuk memfilter berdasarkan alasan keluar.
3585 3585
3586Field `reason` dalam input hook menunjukkan mengapa sesi berakhir:3586Field `reason` dalam input hook menunjukkan mengapa sesi berakhir:
3587 3587
3590| `clear` | Sesi dibersihkan dengan perintah `/clear` |3590| `clear` | Sesi dibersihkan dengan perintah `/clear` |
3591| `resume` | Sesi dialihkan melalui `/resume` interaktif |3591| `resume` | Sesi dialihkan melalui `/resume` interaktif |
3592| `logout` | Pengguna keluar (log out) |3592| `logout` | Pengguna keluar (log out) |
3593| `prompt_input_exit` | Pengguna keluar saat input prompt terlihat |3593| `prompt_input_exit` | Pengguna keluar saat input prompt sedang terlihat |
3594| `other` | Alasan keluar lainnya |3594| `other` | Alasan keluar lainnya |
3595| `bypass_permissions_disabled` | Dihapus di v2.1.234; Claude Code tidak mengirimkannya. Hapus dari matcher `SessionEnd` Anda |3595| `bypass_permissions_disabled` | Dihapus di v2.1.234; Claude Code tidak mengirimkannya. Hapus dari matcher `SessionEnd` Anda |
3596 3596
3614 3614
3615Hook SessionEnd memiliki timeout default 1,5 detik. Timeout ini berlaku saat Anda keluar, menjalankan `/clear`, atau beralih sesi dengan `/resume` interaktif. Anda dapat memberi hook lebih banyak waktu dengan dua cara:3615Hook SessionEnd memiliki timeout default 1,5 detik. Timeout ini berlaku saat Anda keluar, menjalankan `/clear`, atau beralih sesi dengan `/resume` interaktif. Anda dapat memberi hook lebih banyak waktu dengan dua cara:
3616 3616
3617* **`timeout` per hook**: atur `timeout` di konfigurasi hook tersebut. Anggaran keseluruhan naik secara otomatis untuk menyesuaikan dengan `timeout` per hook tertinggi di file pengaturan Anda, hingga 60 detik. Jika Anda menaikkan anggaran dengan cara ini, hook tanpa `timeout` sendiri tetap menggunakan default. Timeout yang diatur pada hook yang disediakan plugin tidak menaikkan anggaran.3617* **`timeout` per hook**: atur `timeout` dalam konfigurasi hook tersebut. Anggaran keseluruhan naik secara otomatis untuk menyamai `timeout` per hook tertinggi di file pengaturan Anda, hingga 60 detik. Jika Anda menaikkan anggaran dengan cara ini, hook tanpa `timeout` sendiri tetap menggunakan default. Timeout yang diatur pada hook yang disediakan plugin tidak menaikkan anggaran.
3618* **`CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS`**: atur environment variable ini dalam milidetik untuk menimpa anggaran secara eksplisit. Nilai yang Anda atur juga menjadi timeout untuk setiap hook tanpa `timeout` sendiri.3618* **`CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS`**: atur environment variable ini dalam milidetik untuk menimpa anggaran secara eksplisit. Nilai yang Anda atur juga menjadi timeout untuk setiap hook tanpa `timeout` sendiri.
3619 3619
3620Contoh ini mengatur anggaran menjadi 5 detik:3620Contoh ini mengatur anggaran menjadi 5 detik:
3629 Elicitation3629 Elicitation
3630</h3>3630</h3>
3631 3631
3632Berjalan saat server MCP meminta input pengguna di tengah tugas. Secara default, Claude Code menampilkan dialog interaktif agar pengguna merespons. Hook dapat mencegat permintaan ini dan merespons secara terprogram, melewati dialog sepenuhnya.3632Berjalan ketika server MCP meminta input pengguna di tengah tugas. Secara default, Claude Code menampilkan dialog interaktif agar pengguna merespons. Hook dapat mencegat permintaan ini dan merespons secara terprogram, sehingga melewati dialog sepenuhnya.
3633 3633
3634Field matcher dicocokkan dengan nama server MCP.3634Field matcher dicocokkan dengan nama server MCP.
3635 3635
3699 3699
3700Exit code 2 menolak elicitation. Claude Code tidak menampilkan pesan stderr Anda di mana pun.3700Exit code 2 menolak elicitation. Claude Code tidak menampilkan pesan stderr Anda di mana pun.
3701 3701
3702Claude Code menindaklanjuti `hookSpecificOutput` dari output JSON hook Elicitation dan membuang `systemMessage` serta `continue`.3702Claude Code bertindak berdasarkan `hookSpecificOutput` dari output JSON hook Elicitation dan membuang `systemMessage` serta `continue`.
3703 3703
3704<h3 id="elicitationresult">3704<h3 id="elicitationresult">
3705 ElicitationResult3705 ElicitationResult
3752 3752
3753Exit code 2 memblokir respons, mengubah tindakan efektif menjadi `decline`. Claude Code tidak menampilkan pesan stderr Anda di mana pun.3753Exit code 2 memblokir respons, mengubah tindakan efektif menjadi `decline`. Claude Code tidak menampilkan pesan stderr Anda di mana pun.
3754 3754
3755Claude Code menindaklanjuti `hookSpecificOutput` dari output JSON hook ElicitationResult dan membuang `systemMessage` serta `continue`.3755Claude Code bertindak berdasarkan `hookSpecificOutput` dari output JSON hook ElicitationResult dan membuang `systemMessage` serta `continue`.
3756 3756
3757<h2 id="prompt-based-hooks">3757<h2 id="prompt-based-hooks">
3758 Prompt-based hooks3758 Prompt-based hooks