40| :- | :- |40| :- | :- |
41| `SessionStart` | Ketika sesi dimulai atau dilanjutkan |41| `SessionStart` | Ketika sesi dimulai atau dilanjutkan |
42| `Setup` | Ketika Anda memulai Claude Code dengan `--init-only`, atau dengan `--init` atau `--maintenance` dalam mode `-p`. Untuk persiapan satu kali dalam CI atau skrip |42| `Setup` | Ketika Anda memulai Claude Code dengan `--init-only`, atau dengan `--init` atau `--maintenance` dalam mode `-p`. Untuk persiapan satu kali dalam CI atau skrip |
43| `UserPromptSubmit` | Ketika Anda mengirimkan prompt, sebelum Claude memprosesnya |43| `UserPromptSubmit` | Ketika prompt dikirimkan, sebelum Claude memprosesnya. Juga dipicu pada [giliran yang dimulai Claude Code dengan sendirinya](/docs/id/hooks#userpromptsubmit) |
44| `UserPromptExpansion` | Ketika perintah yang diketik pengguna berkembang menjadi prompt, sebelum mencapai Claude. Dapat memblokir ekspansi |44| `UserPromptExpansion` | Ketika perintah yang diketik pengguna berkembang menjadi prompt, sebelum mencapai Claude. Dapat memblokir ekspansi |
45| `PreToolUse` | Sebelum panggilan alat dieksekusi. Dapat memblokir |45| `PreToolUse` | Sebelum panggilan alat dieksekusi. Dapat memblokir |
46| `PermissionRequest` | Ketika panggilan alat memerlukan keputusan izin |46| `PermissionRequest` | Ketika panggilan alat memerlukan keputusan izin |
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 prompt dikirimkan, 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` tidak hanya dipicu pada prompt yang Anda ketik. Claude Code juga menjalankannya pada:
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.1413* [Tugas terjadwal](/docs/id/scheduled-tasks) yang dipicu, termasuk iterasi `/loop`
1414* [Subagent latar belakang](/docs/id/sub-agents#run-subagents-in-foreground-or-background) yang melapor kembali ke sesi yang memulainya
1415* [Pesan yang dikirim sesi lain](/docs/id/cross-session-messaging) ke percakapan utama Anda
1414 1416
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.1417Hook `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.
1418
1419Selain 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.
1420
1421[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 1422
1417<h4 id="userpromptsubmit-input">1423<h4 id="userpromptsubmit-input">
1418 Input UserPromptSubmit1424 Input UserPromptSubmit
1419</h4>1425</h4>
1420 1426
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.1427Selain [field input umum](#common-input-fields), hook UserPromptSubmit menerima field `prompt` yang berisi teks yang dikirimkan. Konten tempelan yang diringkas menjadi placeholder `[Pasted text #N]` tiba dalam keadaan sudah diperluas di tempatnya. Dalam sesi di mana 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.
1422 1428
1423Hook UserPromptSubmit juga menerima `session_title` saat sesi memiliki judul kustom, dengan arti yang sama seperti [kolom `session_title` SessionStart](#sessionstart-input).1429Hook UserPromptSubmit juga menerima `session_title` ketika sesi memiliki judul kustom, dengan arti yang sama seperti [field `session_title` SessionStart](#sessionstart-input).
1424 1430
1425```json theme={null}1431```json theme={null}
1426{1432{
1437 Kontrol keputusan UserPromptSubmit1443 Kontrol keputusan UserPromptSubmit
1438</h4>1444</h4>
1439 1445
1440Hook `UserPromptSubmit` dapat mengontrol apakah prompt pengguna diproses dan menambahkan konteks. Semua [kolom output JSON](#json-output) tersedia.1446Hook `UserPromptSubmit` dapat mengontrol apakah prompt yang dikirimkan diproses dan dapat menambahkan konteks. Semua [field output JSON](#json-output) tersedia.
1441 1447
1442Ada dua cara untuk menambahkan konteks ke percakapan pada exit code 0:1448Ada dua cara untuk menambahkan konteks ke percakapan pada exit code 0:
1443 1449
1444* **Stdout teks biasa**: Claude Code menambahkan stdout yang [diperlakukannya sebagai teks biasa](#exit-code-0) ke konteks Claude1450* **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 konteks1451* **JSON dengan `additionalContext`**: gunakan format JSON di bawah untuk kontrol lebih. Field `additionalContext` ditambahkan sebagai konteks
1446 1452
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).1453Tidak 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 1454
1449Untuk memblokir prompt, kembalikan objek JSON dengan `decision` diatur ke `"block"`:1455Untuk memblokir prompt, kembalikan objek JSON dengan `decision` bernilai `"block"`:
1450 1456
1451| Kolom | Deskripsi |1457| Field | Deskripsi |
1452| :- | :- |1458| :- | :- |
1453| `decision` | `"block"` menghentikan prompt sebelum sampai ke Claude. Hilangkan agar prompt dapat berlanjut |1459| `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 |1460| `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) |1461| `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 |1462| `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) |1463| `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 1464
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.1465Hook 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 1466
1461```json theme={null}1467```json theme={null}
1462{1468{
1475 Apa yang ditinggalkan oleh prompt yang diblokir1481 Apa yang ditinggalkan oleh prompt yang diblokir
1476</h4>1482</h4>
1477 1483
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.1484Prompt 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 1485
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).1486`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 1487
1482<h3 id="userpromptexpansion">1488<h3 id="userpromptexpansion">
1483 UserPromptExpansion1489 UserPromptExpansion
1484</h3>1490</h3>
1485 1491
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`.1492Berjalan 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 1493
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.1494Event 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 1495
1490Dicocokkan dengan `command_name`. Biarkan matcher kosong agar dipicu pada setiap perintah bertipe prompt.1496Mencocokkan pada `command_name`. Biarkan matcher kosong untuk memicu pada setiap perintah jenis prompt.
1491 1497
1492<h4 id="userpromptexpansion-input">1498<h4 id="userpromptexpansion-input">
1493 Input UserPromptExpansion1499 Input UserPromptExpansion
1494</h4>1500</h4>
1495 1501
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.1502Selain [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 1503
1498```json theme={null}1504```json theme={null}
1499{1505{
1514 Kontrol keputusan UserPromptExpansion1520 Kontrol keputusan UserPromptExpansion
1515</h4>1521</h4>
1516 1522
1517Hook `UserPromptExpansion` dapat memblokir perluasan atau menambahkan konteks. Semua [kolom output JSON](#json-output) tersedia.1523Hook `UserPromptExpansion` dapat memblokir perluasan atau menambahkan konteks. Semua [field output JSON](#json-output) tersedia.
1518 1524
1519| Kolom | Deskripsi |1525| Field | Deskripsi |
1520| :- | :- |1526| :- | :- |
1521| `decision` | `"block"` mencegah perintah diperluas. Hilangkan agar dapat berlanjut |1527| `decision` | `"block"` mencegah perintah diperluas. Hilangkan untuk mengizinkannya berlanjut |
1522| `reason` | Ditampilkan kepada pengguna saat `decision` bernilai `"block"` |1528| `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) |1529| `additionalContext` | String yang ditambahkan ke konteks Claude bersama prompt yang diperluas. Lihat [Menambahkan konteks untuk Claude](#add-context-for-claude) |
1524 1530
1525Hook yang memblokir dengan keluar dengan kode 2 diarahkan dengan cara yang sama seperti `reason`: pesan blokir menampilkan teks stderr kepada pengguna.1531Hook yang memblokir dengan keluar menggunakan kode 2 diarahkan dengan cara yang sama seperti `reason`: pesan blokir menampilkan teks stderr kepada pengguna.
1526 1532
1527```json theme={null}1533```json theme={null}
1528{1534{
1539 MessageDisplay1545 MessageDisplay
1540</h3>1546</h3>
1541 1547
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.1548Berjalan 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 1549
1544Gunakan MessageDisplay untuk:1550Gunakan MessageDisplay untuk:
1545 1551
1547* mengubah teks yang ditampilkan aplikasi Agent SDK kepada penggunanya1553* mengubah teks yang ditampilkan aplikasi Agent SDK kepada penggunanya
1548* menyamarkan kunci API atau hostname internal dari respons Claude1554* menyamarkan kunci API atau hostname internal dari respons Claude
1549 1555
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.1556Claude 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 1557
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.1558MessageDisplay 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 1559
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.1560MessageDisplay 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 1561
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.1562Dalam 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 1563
1558<h4 id="messagedisplay-input">1564<h4 id="messagedisplay-input">
1559 Input MessageDisplay1565 Input MessageDisplay
1560</h4>1566</h4>
1561 1567
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.1568Selain [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 1569
1564| Kolom | Deskripsi |1570| Field | Deskripsi |
1565| :- | :- |1571| :- | :- |
1566| `turn_id` | UUID giliran saat ini |1572| `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 |1573| `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 |1574| `index` | Indeks berbasis nol dari kumpulan ini di dalam pesan |
1569| `final` | `true` pada kelompok terakhir pesan. Setiap pesan memiliki tepat satu kelompok terakhir |1575| `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 |1576| `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 1577
1572```json theme={null}1578```json theme={null}
1573{1579{
1587 Output MessageDisplay1593 Output MessageDisplay
1588</h4>1594</h4>
1589 1595
1590Selain [kolom output JSON](#json-output) yang tersedia untuk semua hook, hook MessageDisplay dapat mengembalikan `displayContent` untuk menggantikan delta di layar:1596Selain [field output JSON](#json-output) yang tersedia untuk semua hook, hook MessageDisplay dapat mengembalikan `displayContent` untuk menggantikan delta di layar:
1591 1597
1592| Kolom | Deskripsi |1598| Field | Deskripsi |
1593| :- | :- |1599| :- | :- |
1594| `displayContent` | Teks yang ditampilkan sebagai pengganti delta. Hilangkan untuk menampilkan teks asli |1600| `displayContent` | Teks yang ditampilkan sebagai pengganti delta. Hilangkan untuk menampilkan teks asli |
1595 1601
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`.1602Hook 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 1603
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`.1604Contoh 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 1605
1600<Tabs>1606<Tabs>
1601 <Tab title="macOS/Linux">1607 <Tab title="macOS/Linux">
1602 Daftarkan hook perintah untuk event ini di file pengaturan Anda:1608 Daftarkan hook perintah untuk event tersebut di file pengaturan Anda:
1603 1609
1604 ```json theme={null}1610 ```json theme={null}
1605 {1611 {
1654 }1660 }
1655 ```1661 ```
1656 1662
1657 Flag `-NoProfile` melewatkan pemuatan profil PowerShell Anda sehingga hook dimulai dengan cepat, dan `-ExecutionPolicy Bypass` memungkinkan PowerShell menjalankan file skrip lokal.1663 Flag `-NoProfile` melewati pemuatan profil PowerShell Anda agar hook dimulai dengan cepat, dan `-ExecutionPolicy Bypass` memungkinkan PowerShell menjalankan file skrip lokal.
1658 1664
1659 Simpan skrip ini ke `.claude/hooks/plain-display.ps1` di proyek Anda:1665 Simpan skrip ini ke `.claude/hooks/plain-display.ps1` di proyek Anda:
1660 1666
1671 </Tab>1677 </Tab>
1672</Tabs>1678</Tabs>
1673 1679
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.1680Kumpulan 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 1681
1676<h3 id="pretooluse">1682<h3 id="pretooluse">
1677 PreToolUse1683 PreToolUse
1678</h3>1684</h3>
1679 1685
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.1686Berjalan 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 1687
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.1688Untuk 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 1689
1684<Warning>1690<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.1691 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 1692
1687 PreToolUse juga tidak dipicu untuk [`EndConversation`](/docs/id/tools-reference#endconversation-tool-behavior).1693 PreToolUse juga tidak dipicu untuk [`EndConversation`](/docs/id/tools-reference#endconversation-tool-behavior).
1688</Warning>1694</Warning>
1689 1695
1690Gunakan [kontrol keputusan PreToolUse](#pretooluse-decision-control) untuk mengizinkan, menolak, meminta konfirmasi, atau menunda panggilan tool.1696Gunakan [kontrol keputusan PreToolUse](#pretooluse-decision-control) untuk mengizinkan, menolak, meminta konfirmasi, atau menangguhkan panggilan tool.
1691 1697
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.1698[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 1699
1694<h4 id="pretooluse-input">1700<h4 id="pretooluse-input">
1695 Input PreToolUse1701 Input PreToolUse
1696</h4>1702</h4>
1697 1703
1698Selain [kolom input umum](#common-input-fields), hook PreToolUse menerima `tool_name`, `tool_input`, dan `tool_use_id`.1704Selain [field input umum](#common-input-fields), hook PreToolUse menerima `tool_name`, `tool_input`, dan `tool_use_id`.
1699 1705
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.1706Untuk [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 1707
1702Untuk tool file `Write`, `Edit`, dan `Read`, `tool_input.file_path` selalu absolut:1708Untuk tool file `Write`, `Edit`, dan `Read`, `tool_input.file_path` selalu absolut:
1703 1709
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 sama1710* 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`1711* 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 diblokir1712* 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 absolut1713* 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 1714
1709Panggilan `Write` di Windows mengirimkan:1715Panggilan `Write` di Windows mengirimkan:
1710 1716
1720}1726}
1721```1727```
1722 1728
1723Kolom `tool_input` bergantung pada tool-nya:1729Field `tool_input` bergantung pada tool:
1724 1730
1725<a id="bash" />1731<a id="bash" />
1726 1732
1728 Bash1734 Bash
1729</h5>1735</h5>
1730 1736
1731Mengeksekusi perintah shell.1737Menjalankan perintah shell.
1732 1738
1733| Kolom | Tipe | Contoh | Deskripsi |1739| Field | Tipe | Contoh | Deskripsi |
1734| :- | :- | :- | :- |1740| :- | :- | :- | :- |
1735| `command` | string | `"npm test"` | Perintah shell yang akan dieksekusi |1741| `command` | string | `"npm test"` | Perintah shell yang akan dijalankan |
1736| `description` | string | `"Run test suite"` | Deskripsi opsional tentang apa yang dilakukan perintah |1742| `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 |1743| `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 |1744| `run_in_background` | boolean | `false` | Apakah perintah dijalankan di latar belakang |
1739 1745
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.1746Ketika 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 1747
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.1748[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 1749
1744<Note>1750<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.1751 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>1752</Note>
1747 1753
1748`changedFiles` dan `files` mencantumkan apa yang diubah oleh perintah; kolom-kolom lainnya menyatakan seberapa lengkap dan seberapa andal daftar tersebut.1754`changedFiles` dan `files` mencantumkan apa yang diubah perintah; field lainnya menyatakan seberapa lengkap dan seberapa andal daftar tersebut.
1749 1755
1750| Kolom | Tipe | Contoh | Deskripsi |1756| Field | Tipe | Contoh | Deskripsi |
1751| :- | :- | :- | :- |1757| :- | :- | :- | :- |
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 |1758| `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 |1759| `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` |1760| `moreFiles` | number | `2` | Jumlah file yang berubah tanpa diff di `files` |
1755| `unavailable` | boolean | `true` | Diatur saat diff tidak lengkap atau tidak dapat diambil |1761| `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 |1762| `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 |1763| `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 1764
1759<a id="powershell" />1765<a id="powershell" />
1760 1766
1762 PowerShell1768 PowerShell
1763</h5>1769</h5>
1764 1770
1765Mengeksekusi perintah PowerShell. Lihat [tool PowerShell](/docs/id/tools-reference#powershell-tool) untuk ketersediaan berdasarkan platform.1771Menjalankan perintah PowerShell. Lihat [tool PowerShell](/docs/id/tools-reference#powershell-tool) untuk ketersediaan berdasarkan platform.
1766 1772
1767Kolom-kolomnya sama dengan tool Bash, dengan string perintah di `command`:1773Field-nya sama dengan tool Bash, dengan string perintah di `command`:
1768 1774
1769| Kolom | Tipe | Contoh | Deskripsi |1775| Field | Tipe | Contoh | Deskripsi |
1770| :- | :- | :- | :- |1776| :- | :- | :- | :- |
1771| `command` | string | `"Get-ChildItem -Recurse"` | Perintah PowerShell yang akan dieksekusi |1777| `command` | string | `"Get-ChildItem -Recurse"` | Perintah PowerShell yang akan dijalankan |
1772| `description` | string | `"List files recursively"` | Deskripsi opsional tentang apa yang dilakukan perintah |1778| `description` | string | `"List files recursively"` | Deskripsi opsional tentang apa yang dilakukan perintah |
1773| `timeout` | number | `120000` | Timeout opsional dalam milidetik |1779| `timeout` | number | `120000` | Timeout opsional dalam milidetik |
1774| `run_in_background` | boolean | `false` | Apakah perintah dijalankan di latar belakang |1780| `run_in_background` | boolean | `false` | Apakah perintah dijalankan di latar belakang |
1775 1781
1776Cocokkan `Bash|PowerShell` dalam hook yang memeriksa perintah shell, sehingga hook tersebut mencakup kedua tool:1782Cocokkan `Bash|PowerShell` dalam hook yang memeriksa perintah shell, agar mencakup kedua tool:
1777 1783
1778* Di Windows, di mana pun tool PowerShell diaktifkan, Claude memperlakukan PowerShell sebagai shell utama dan mengarahkan perintah shell melaluinya.1784* 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.1785* Di Windows tanpa Git Bash, tool ini diaktifkan secara otomatis dan Claude Code sama sekali tidak mendaftarkan tool Bash.
1785 1791
1786Membuat atau menimpa file.1792Membuat atau menimpa file.
1787 1793
1788| Kolom | Tipe | Contoh | Deskripsi |1794| Field | Tipe | Contoh | Deskripsi |
1789| :- | :- | :- | :- |1795| :- | :- | :- | :- |
1790| `file_path` | string | `"/path/to/file.txt"` | Path absolut ke file yang akan ditulis |1796| `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 |1797| `content` | string | `"file content"` | Konten yang akan ditulis ke file |
1796 1802
1797Mengganti string dalam file yang sudah ada.1803Mengganti string dalam file yang sudah ada.
1798 1804
1799| Kolom | Tipe | Contoh | Deskripsi |1805| Field | Tipe | Contoh | Deskripsi |
1800| :- | :- | :- | :- |1806| :- | :- | :- | :- |
1801| `file_path` | string | `"/path/to/file.txt"` | Path absolut ke file yang akan diedit |1807| `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 |1808| `old_string` | string | `"original text"` | Teks yang akan dicari dan diganti |
1807 Read1813 Read
1808</h5>1814</h5>
1809 1815
1810Membaca isi file.1816Membaca konten file.
1811 1817
1812| Kolom | Tipe | Contoh | Deskripsi |1818| Field | Tipe | Contoh | Deskripsi |
1813| :- | :- | :- | :- |1819| :- | :- | :- | :- |
1814| `file_path` | string | `"/path/to/file.txt"` | Path absolut ke file yang akan dibaca |1820| `file_path` | string | `"/path/to/file.txt"` | Path absolut ke file yang akan dibaca |
1815| `offset` | number | `10` | Nomor baris opsional untuk mulai membaca |1821| `offset` | number | `10` | Nomor baris opsional untuk mulai membaca |
1821 1827
1822Menemukan file yang cocok dengan pola glob.1828Menemukan file yang cocok dengan pola glob.
1823 1829
1824| Kolom | Tipe | Contoh | Deskripsi |1830| Field | Tipe | Contoh | Deskripsi |
1825| :- | :- | :- | :- |1831| :- | :- | :- | :- |
1826| `pattern` | string | `"**/*.ts"` | Pola glob untuk mencocokkan file |1832| `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 |1833| `path` | string | `"/path/to/dir"` | Direktori opsional untuk pencarian. Default-nya adalah direktori kerja saat ini |
1830 Grep1836 Grep
1831</h5>1837</h5>
1832 1838
1833Mencari isi file dengan ekspresi reguler.1839Mencari konten file dengan regular expression.
1834 1840
1835| Kolom | Tipe | Contoh | Deskripsi |1841| Field | Tipe | Contoh | Deskripsi |
1836| :- | :- | :- | :- |1842| :- | :- | :- | :- |
1837| `pattern` | string | `"TODO.*fix"` | Pola ekspresi reguler yang akan dicari |1843| `pattern` | string | `"TODO.*fix"` | Pola regular expression yang akan dicari |
1838| `path` | string | `"/path/to/dir"` | File atau direktori opsional untuk pencarian |1844| `path` | string | `"/path/to/dir"` | File atau direktori opsional untuk pencarian |
1839| `glob` | string | `"*.ts"` | Pola glob opsional untuk memfilter file |1845| `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"` |1846| `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 |1847| `-i` | boolean | `true` | Pencarian tidak peka huruf besar-kecil |
1842| `multiline` | boolean | `false` | Mengaktifkan pencocokan multibaris |1848| `multiline` | boolean | `false` | Mengaktifkan pencocokan multibaris |
1843 1849
1844<h5 id="webfetch">1850<h5 id="webfetch">
1847 1853
1848Mengambil dan memproses konten web.1854Mengambil dan memproses konten web.
1849 1855
1850| Kolom | Tipe | Contoh | Deskripsi |1856| Field | Tipe | Contoh | Deskripsi |
1851| :- | :- | :- | :- |1857| :- | :- | :- | :- |
1852| `url` | string | `"https://example.com/api"` | URL untuk mengambil konten |1858| `url` | string | `"https://example.com/api"` | URL untuk mengambil konten |
1853| `prompt` | string | `"Extract the API endpoints"` | Prompt yang dijalankan pada konten yang diambil |1859| `prompt` | string | `"Extract the API endpoints"` | Prompt yang dijalankan pada konten yang diambil |
1858 1864
1859Mencari di web.1865Mencari di web.
1860 1866
1861| Kolom | Tipe | Contoh | Deskripsi |1867| Field | Tipe | Contoh | Deskripsi |
1862| :- | :- | :- | :- |1868| :- | :- | :- | :- |
1863| `query` | string | `"react hooks best practices"` | Kueri pencarian |1869| `query` | string | `"react hooks best practices"` | Kueri pencarian |
1864| `allowed_domains` | array | `["docs.example.com"]` | Opsional: hanya sertakan hasil dari domain-domain ini |1870| `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 |1871| `blocked_domains` | array | `["spam.example.com"]` | Opsional: kecualikan hasil dari domain ini |
1866 1872
1867<h5 id="agent">1873<h5 id="agent">
1868 Agent1874 Agent
1869</h5>1875</h5>
1870 1876
1871Membuat [subagent](/docs/id/sub-agents).1877Memunculkan [subagent](/docs/id/sub-agents).
1872 1878
1873| Kolom | Tipe | Contoh | Deskripsi |1879| Field | Tipe | Contoh | Deskripsi |
1874| :- | :- | :- | :- |1880| :- | :- | :- | :- |
1875| `prompt` | string | `"Find all API endpoints"` | Tugas yang akan dilakukan agent |1881| `prompt` | string | `"Find all API endpoints"` | Tugas yang akan dilakukan agent |
1876| `description` | string | `"Find API endpoints"` | Deskripsi singkat tugas |1882| `description` | string | `"Find API endpoints"` | Deskripsi singkat tugas |
1877| `subagent_type` | string | `"Explore"` | Jenis agent khusus yang akan digunakan |1883| `subagent_type` | string | `"Explore"` | Jenis agent khusus yang akan digunakan |
1878| `model` | string | `"sonnet"` | Alias model opsional untuk menimpa default |1884| `model` | string | `"sonnet"` | Alias model opsional untuk menimpa default |
1879 1885
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:1886Ketika 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 1887
1882| Kolom | Tipe | Contoh | Deskripsi |1888| Field | Tipe | Contoh | Deskripsi |
1883| :- | :- | :- | :- |1889| :- | :- | :- | :- |
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"` |1890| `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 |1891| `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 |1892| `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 |1893| `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 |1894| `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 |1895| `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 |1896| `totalDurationMs` | number | `48211` | Durasi waktu nyata dari run subagent |
1891| `totalToolUseCount` | number | `7` | Jumlah panggilan tool yang dilakukan subagent |1897| `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` |1898| `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 1899
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`.1900Pada 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 1901
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`.1902Untuk 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 1903
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.1904Pada 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 1905
1900<a id="askuserquestion" />1906<a id="askuserquestion" />
1901 1907
1905 1911
1906Mengajukan satu hingga empat pertanyaan pilihan ganda kepada pengguna.1912Mengajukan satu hingga empat pertanyaan pilihan ganda kepada pengguna.
1907 1913
1908| Kolom | Tipe | Contoh | Deskripsi |1914| Field | Tipe | Contoh | Deskripsi |
1909| :- | :- | :- | :- |1915| :- | :- | :- | :- |
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 |1916| `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 |1917| `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 1918
1913<h5 id="exitplanmode">1919<h5 id="exitplanmode">
1914 ExitPlanMode1920 ExitPlanMode
1915</h5>1921</h5>
1916 1922
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.1923Menyajikan 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 1924
1919| Kolom | Tipe | Contoh | Deskripsi |1925| Field | Tipe | Contoh | Deskripsi |
1920| :- | :- | :- | :- |1926| :- | :- | :- | :- |
1921| `plan` | string | `"## Refactor auth\n1. Extract..."` | Konten rencana dalam Markdown. Disisipkan dari file rencana di disk |1927| `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 |1928| `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 |1929| `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 1930
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.1931Dalam `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 1932
1927<h4 id="pretooluse-decision-control">1933<h4 id="pretooluse-decision-control">
1928 Kontrol keputusan PreToolUse1934 Kontrol keputusan PreToolUse
1929</h4>1935</h4>
1930 1936
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.1937Hook `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 1938
1933| Kolom | Deskripsi |1939| Field | Deskripsi |
1934| :- | :- |1940| :- | :- |
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 |1941| `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) |1942| `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 |1943| `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) |1944| `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 1945
1940Saat beberapa hook PreToolUse mengembalikan keputusan yang berbeda, urutan prioritasnya adalah `deny` > `defer` > `ask` > `allow`.1946Ketika beberapa hook PreToolUse mengembalikan keputusan yang berbeda, urutan prioritasnya adalah `deny` > `defer` > `ask` > `allow`.
1941 1947
1942Hook yang memblokir dengan keluar dengan kode 2 diarahkan dengan cara yang sama seperti `"deny"`: Claude melihat pesan stderr sebagai alasan penolakan.1948Hook yang memblokir dengan keluar menggunakan kode 2 diarahkan dengan cara yang sama seperti `"deny"`: Claude melihat pesan stderr sebagai alasan penolakan.
1943 1949
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.1950Ketika 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 1951
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.1952`"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 1953
1948```json theme={null}1954```json theme={null}
1949{1955{
1961 1967
1962<span id="allow-with-updatedinput" />1968<span id="allow-with-updatedinput" />
1963 1969
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.1970Dalam [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 1971
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.1972Tool 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 1973
1968<Note>1974<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.1975 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>1976</Note>
1971 1977
1972<h4 id="defer-a-tool-call-for-later">1978<h4 id="defer-a-tool-call-for-later">
1973 Menunda panggilan tool untuk nanti1979 Menangguhkan panggilan tool untuk nanti
1974</h4>1980</h4>
1975 1981
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.1982`"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 1983
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:1984Tool `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 1985
19801. Claude memanggil `AskUserQuestion`. Hook `PreToolUse` dipicu.19861. 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.19872. 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.19883. 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.19894. 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.19905. Hook mengembalikan `permissionDecision: "allow"` dengan jawaban di `updatedInput`. Tool dieksekusi dan Claude melanjutkan.
1985 1991
1986Kolom `deferred_tool_use` membawa `id`, `name`, dan `input` tool. `input` adalah parameter yang dihasilkan Claude untuk panggilan tool, ditangkap sebelum eksekusi:1992Field `deferred_tool_use` membawa `id`, `name`, dan `input` dari tool. `input` adalah parameter yang dihasilkan Claude untuk panggilan tool, yang ditangkap sebelum eksekusi:
1987 1993
1988```json theme={null}1994```json theme={null}
1989{1995{
1999}2005}
2000```2006```
2001 2007
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.2008Tidak 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 2009
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.2010`"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 2011
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.2012Jika 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 2013
2008<Note>2014<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.2015 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 2016
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).2017 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>2018</Note>
2013 2019
2014<h3 id="permissionrequest">2020<h3 id="permissionrequest">
2015 PermissionRequest2021 PermissionRequest
2016</h3>2022</h3>
2017 2023
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.2024Berjalan 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.2025Gunakan [kontrol keputusan PermissionRequest](#permissionrequest-decision-control) untuk mengizinkan atau menolak atas nama pengguna.
2020 2026
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.2027Gunakan 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 2028
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`.2029Claude 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 2030
2025Dicocokkan dengan nama tool, nilai yang sama seperti PreToolUse.2031Mencocokkan pada nama tool, dengan nilai yang sama seperti PreToolUse.
2026 2032
2027<h4 id="permissionrequest-input">2033<h4 id="permissionrequest-input">
2028 Input PermissionRequest2034 Input PermissionRequest
2029</h4>2035</h4>
2030 2036
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.2037Hook 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 2038
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.2039Array `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 2040
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).2041Hook 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 2042
2037```json theme={null}2043```json theme={null}
2038{2044{
2061 Kontrol keputusan PermissionRequest2067 Kontrol keputusan PermissionRequest
2062</h4>2068</h4>
2063 2069
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:2070Hook `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 2071
2066| Kolom | Deskripsi |2072| Field | Deskripsi |
2067| :- | :- |2073| :- | :- |
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 |2074| `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 |2075| `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 |2076| `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 |2077| `message` | Hanya untuk `"deny"`: memberi tahu Claude mengapa izin ditolak |
2072| `interrupt` | Hanya untuk `"deny"`: jika `true`, menghentikan Claude |2078| `interrupt` | Hanya untuk `"deny"`: jika `true`, menghentikan Claude |
2091 Entri pembaruan izin2097 Entri pembaruan izin
2092</h4>2098</h4>
2093 2099
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.2100Field 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 2101
2096| `type` | Kolom | Efek |2102| `type` | Field | Efek |
2097| :- | :- | :- |2103| :- | :- | :- |
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"` |2104| `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 |2105| `replaceRules` | `rules`, `behavior`, `destination` | Mengganti semua aturan dengan `behavior` yang diberikan di `destination` dengan `rules` yang disediakan |
2103| `removeDirectories` | `directories`, `destination` | Menghapus direktori kerja |2109| `removeDirectories` | `directories`, `destination` | Menghapus direktori kerja |
2104 2110
2105<Note>2111<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).2112 `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 2113
2108 `bypassPermissions` tidak pernah disimpan sebagai `defaultMode` terlepas dari nilai `destination`.2114 `bypassPermissions` tidak pernah disimpan sebagai `defaultMode` terlepas dari `destination`.
2109</Note>2115</Note>
2110 2116
2111Field `destination` pada setiap entri menentukan apakah perubahan tetap berada di memori atau disimpan ke file pengaturan.2117Field `destination` pada setiap entri menentukan apakah perubahan tetap berada di memori atau disimpan ke file pengaturan.
2123 PostToolUse2129 PostToolUse
2124</h3>2130</h3>
2125 2131
2126Berjalan segera setelah sebuah tool berhasil diselesaikan.2132Berjalan segera setelah sebuah tool selesai dengan sukses.
2127 2133
2128Mencocokkan berdasarkan nama tool, dengan nilai yang sama seperti PreToolUse.2134Mencocokkan berdasarkan nama tool, dengan nilai yang sama seperti PreToolUse.
2129 2135
2130Lakukan pencocokan yang lebih luas ketika nama tool bukan filter yang tepat:2136Cocokkan secara lebih luas ketika nama tool bukan filter yang tepat:
2131 2137
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).2138* 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.2139* 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 2140
2135<h4 id="posttooluse-input">2141<h4 id="posttooluse-input">
2136 Input PostToolUse2142 Input PostToolUse
2137</h4>2143</h4>
2138 2144
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).2145Hook `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 2146
2141```json theme={null}2147```json theme={null}
2142{2148{
2172| Field | Deskripsi |2178| Field | Deskripsi |
2173| :- | :- |2179| :- | :- |
2174| `decision` | `"block"` menambahkan `reason` di samping hasil tool. Claude tetap melihat output asli; untuk menggantinya, gunakan `updatedToolOutput` |2180| `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"` |2181| `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) |2182| `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 |2183| `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 |2184| `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 |2185| `updatedMCPToolOutput` | Mengganti output hanya untuk [tool MCP](#match-mcp-tools). Utamakan `updatedToolOutput`, yang berfungsi untuk semua tool |
2180 2186
2181Contoh di bawah ini mengganti output dari panggilan `Bash`. Nilai pengganti sesuai dengan bentuk output tool `Bash`:2187Contoh di bawah ini mengganti output dari panggilan `Bash`. Nilai pengganti sesuai dengan bentuk output tool `Bash`:
2182 2188
2196```2202```
2197 2203
2198<Warning>2204<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.2205 `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 2206
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.2207 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>2208</Warning>
2203 2209
2204<h4 id="annotate-a-result-for-the-auto-mode-classifier">2210<h4 id="annotate-a-result-for-the-auto-mode-classifier">
2205 Memberi anotasi pada hasil untuk pengklasifikasi auto mode2211 Menganotasi hasil untuk pengklasifikasi auto mode
2206</h4>2212</h4>
2207 2213
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.2214Kembalikan `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 2215
2210Contoh di bawah ini memberi tahu pengklasifikasi dari mana output sebuah query berasal:2216Contoh di bawah ini memberi tahu pengklasifikasi dari mana output sebuah kueri berasal:
2211 2217
2212```json theme={null}2218```json theme={null}
2213{2219{
2220 2226
2221Seberapa besar bobot yang diberikan pengklasifikasi pada catatan tersebut bergantung pada tempat Anda mengonfigurasi hook:2227Seberapa besar bobot yang diberikan pengklasifikasi pada catatan tersebut bergantung pada tempat Anda mengonfigurasi hook:
2222 2228
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 percakapan2229* **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 diverifikasi2230* **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 2231
2226Claude Code menerapkan batasan berikut saat mengirimkan catatan:2232Claude Code menerapkan batasan berikut saat mengirimkan catatan:
2227 2233
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 tersebut2234* **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 tool2235* **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 tersebut2236* **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 output2237* **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 2238
2233<Warning>2239<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.2240 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>2241</Warning>
2236 2242
2237<h3 id="posttoolusefailure">2243<h3 id="posttoolusefailure">
2238 PostToolUseFailure2244 PostToolUseFailure
2239</h3>2245</h3>
2240 2246
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.2247Berjalan 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 2248
2243Mencocokkan berdasarkan nama tool, dengan nilai yang sama seperti PreToolUse.2249Mencocokkan berdasarkan nama tool, dengan nilai yang sama seperti PreToolUse.
2244 2250
2245<Note>2251<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).2252 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>2253</Note>
2248 2254
2249<h4 id="posttoolusefailure-input">2255<h4 id="posttoolusefailure-input">
2250 Input PostToolUseFailure2256 Input PostToolUseFailure
2251</h4>2257</h4>
2252 2258
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:2259Hook 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 2260
2255```json theme={null}2261```json theme={null}
2256{2262{
2274| Field | Deskripsi |2280| Field | Deskripsi |
2275| :- | :- |2281| :- | :- |
2276| `error` | String yang menjelaskan apa yang salah. Formatnya bergantung pada tool yang gagal |2282| `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 |2283| `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 |2284| `duration_ms` | Opsional. Waktu eksekusi tool dalam milidetik. Tidak termasuk waktu yang dihabiskan dalam permintaan izin dan hook PreToolUse |
2279 2285
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.2286String `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 2287
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-seling2288* 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 sendiri2289* 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`2290* 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 2291
2306 PostToolBatch2312 PostToolBatch
2307</h3>2313</h3>
2308 2314
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.2315Berjalan 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 2316
2311<h4 id="posttoolbatch-input">2317<h4 id="posttoolbatch-input">
2312 Input PostToolBatch2318 Input PostToolBatch
2338}2344}
2339```2345```
2340 2346
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.2347`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 2348
2343<Note>2349<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.2350 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>2351</Note>
2346 2352
2347<h4 id="posttoolbatch-decision-control">2353<h4 id="posttoolbatch-decision-control">
2348 Kontrol keputusan PostToolBatch2354 Kontrol keputusan PostToolBatch
2349</h4>2355</h4>
2350 2356
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:2357Hook `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 2358
2353| Field | Deskripsi |2359| Field | Deskripsi |
2354| :- | :- |2360| :- | :- |
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 |2361| `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 2362
2357```json theme={null}2363```json theme={null}
2358{2364{
2363}2369}
2364```2370```
2365 2371
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.2372Mengembalikan `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 2373
2368<h3 id="permissiondenied">2374<h3 id="permissiondenied">
2369 PermissionDenied2375 PermissionDenied
2370</h3>2376</h3>
2371 2377
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.2378Berjalan 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 2379
2374Mencocokkan berdasarkan nama tool, dengan nilai yang sama seperti PreToolUse.2380Mencocokkan berdasarkan nama tool, dengan nilai yang sama seperti PreToolUse.
2375 2381
2377 Input PermissionDenied2383 Input PermissionDenied
2378</h4>2384</h4>
2379 2385
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).2386Selain [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 2387
2382```json theme={null}2388```json theme={null}
2383{2389{
2398 2404
2399| Field | Deskripsi |2405| Field | Deskripsi |
2400| :- | :- |2406| :- | :- |
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` |2407| `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 2408
2403<h4 id="permissiondenied-decision-control">2409<h4 id="permissiondenied-decision-control">
2404 Kontrol keputusan PermissionDenied2410 Kontrol keputusan PermissionDenied
2425 2431
2426Berjalan ketika Claude Code mengirim notifikasi. Mencocokkan berdasarkan jenis notifikasi. Hilangkan matcher untuk menjalankan hook untuk semua jenis notifikasi.2432Berjalan ketika Claude Code mengirim notifikasi. Mencocokkan berdasarkan jenis notifikasi. Hilangkan matcher untuk menjalankan hook untuk semua jenis notifikasi.
2427 2433
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.2434Anda 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 2435
2430| Matcher | Kapan dipicu |2436| Matcher | Kapan dipicu |
2431| :- | :- |2437| :- | :- |
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 |2438| `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 |2439| `idle_prompt` | Claude selesai merespons sekitar 60 detik yang lalu dan Anda belum mengetik sejak itu |
2434| `auth_success` | Autentikasi selesai |2440| `auth_success` | Autentikasi selesai |
2435| `elicitation_dialog` | Server MCP membuka formulir elicitation dan Anda belum mengetik selama sekitar enam detik |2441| `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 |2444| `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 |2445| `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 |2446| `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) |2447| `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 |2448| `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** |2449| `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 2450
2445Jenis `quota_auto_resume_fired`, `quota_auto_resume_stale`, dan `quota_auto_resume_disabled` memerlukan Claude Code v2.1.234 atau lebih baru.2451Jenis `quota_auto_resume_fired`, `quota_auto_resume_stale`, dan `quota_auto_resume_disabled` memerlukan Claude Code v2.1.234 atau yang lebih baru.
2446 2452
2447Dalam sesi terminal, `permission_prompt` untuk permintaan jaringan dari perintah yang di-sandbox memerlukan Claude Code v2.1.246 atau lebih baru.2453Dalam sesi terminal, `permission_prompt` untuk permintaan jaringan dari perintah yang di-sandbox memerlukan Claude Code v2.1.246 atau yang lebih baru.
2448 2454
2449`agent_needs_input` untuk pertanyaan penyiapan terminal dari rekan tim memerlukan Claude Code v2.1.248 atau lebih baru.2455`agent_needs_input` untuk pertanyaan penyiapan terminal dari rekan tim memerlukan Claude Code v2.1.248 atau yang lebih baru.
2450 2456
2451<Note>2457<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:2458 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 2459
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.2460 * 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.2461 * 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.2462 * 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 2463
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.2464 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>2465</Note>
2460 2466
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:2467Claude 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 2468
2463* `permission_prompt` akan muncul sekitar enam detik setelah Claude meminta izin. Claude Code tidak menundanya saat Anda mengetik.2469* 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`.2470* 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.2471* Atur [`CLAUDE_CODE_DISABLE_PERMISSION_PROMPT_NOTIFY_HOOKS`](/docs/id/env-vars) ke `1` untuk mematikan `permission_prompt` dalam sesi-sesi ini.
2466 2472
2467Sebelum v2.1.233, `permission_prompt` tidak dipicu dalam sesi ini.2473Sebelum v2.1.233, `permission_prompt` tidak dipicu dalam sesi-sesi ini.
2468 2474
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:2475Gunakan 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 2476
2471```json theme={null}2477```json theme={null}
2472{2478{
2519 SubagentStart2525 SubagentStart
2520</h3>2526</h3>
2521 2527
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.2528Berjalan 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 2529
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$`.2530Untuk 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 2531
2526<h4 id="subagentstart-input">2532<h4 id="subagentstart-input">
2527 Input SubagentStart2533 Input SubagentStart
2540}2546}
2541```2547```
2542 2548
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:2549Hook 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 2550
2545| Field | Deskripsi |2551| Field | Deskripsi |
2546| :- | :- |2552| :- | :- |
2555}2561}
2556```2562```
2557 2563
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.2564Ketika 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 2565
2560<h3 id="subagentstop">2566<h3 id="subagentstop">
2561 SubagentStop2567 SubagentStop
2567 Input SubagentStop2573 Input SubagentStop
2568</h4>2574</h4>
2569 2575
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.2576Selain [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 2577
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.2578Tidak 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 2579
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.2580`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 2581
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`.2582Pada 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 2583
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.2584Hook 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 2585
2580```json theme={null}2586```json theme={null}
2581{2587{
2594}2600}
2595```2601```
2596 2602
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.2603Hook 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 2604
2599<h3 id="taskcreated">2605<h3 id="taskcreated">
2600 TaskCreated2606 TaskCreated
2601</h3>2607</h3>
2602 2608
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.2609Berjalan 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 2610
2605Hook TaskCreated tidak mendukung matcher dan dipicu pada setiap kejadian.2611Hook TaskCreated tidak mendukung matcher dan dipicu pada setiap kejadian.
2606 2612
2626 2632
2627| Field | Deskripsi |2633| Field | Deskripsi |
2628| :- | :- |2634| :- | :- |
2629| `task_id` | Pengidentifikasi tugas yang sedang dibuat |2635| `task_id` | Pengidentifikasi task yang sedang dibuat |
2630| `task_subject` | Judul tugas |2636| `task_subject` | Judul task |
2631| `task_description` | Deskripsi terperinci tugas. Mungkin tidak ada |2637| `task_description` | Deskripsi terperinci task. Mungkin tidak ada |
2632| `teammate_name` | Nama rekan tim yang membuat tugas. Mungkin tidak ada |2638| `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 |2639| `team_name` | Deprecated. Nama tim yang diturunkan dari sesi; akan dihapus dalam rilis mendatang |
2634 2640
2635<h4 id="taskcreated-decision-control">2641<h4 id="taskcreated-decision-control">
2636 Kontrol keputusan TaskCreated2642 Kontrol keputusan TaskCreated
2637</h4>2643</h4>
2638 2644
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.2645Hook 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 2646
2641* **Exit code 2**: Claude Code mengembalikan teks stderr sebagai pesan.2647* **Exit code 2**: Claude Code mengembalikan teks stderr sebagai pesan.
2642* **JSON `{"decision": "block", "reason": "..."}`**: Claude Code mengembalikan `reason` sebagai pesan.2648* **JSON `{"decision": "block", "reason": "..."}`**: Claude Code mengembalikan `reason` sebagai pesan.
2643 2649
2644Contoh ini memblokir tugas yang subjeknya tidak mengikuti format yang diwajibkan:2650Contoh ini memblokir task yang subjeknya tidak mengikuti format yang diwajibkan:
2645 2651
2646```bash theme={null}2652```bash theme={null}
2647#!/bin/bash2653#!/bin/bash
2660 TaskCompleted2666 TaskCompleted
2661</h3>2667</h3>
2662 2668
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.2669Berjalan 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 2670
2665Hook TaskCompleted tidak mendukung matcher dan dipicu pada setiap kejadian.2671Hook TaskCompleted tidak mendukung matcher dan dipicu pada setiap kejadian.
2666 2672
2687 2693
2688| Field | Deskripsi |2694| Field | Deskripsi |
2689| :- | :- |2695| :- | :- |
2690| `task_id` | Pengidentifikasi tugas yang sedang diselesaikan |2696| `task_id` | Pengidentifikasi task yang sedang diselesaikan |
2691| `task_subject` | Judul tugas |2697| `task_subject` | Judul task |
2692| `task_description` | Deskripsi terperinci tugas. Mungkin tidak ada |2698| `task_description` | Deskripsi terperinci task. Mungkin tidak ada |
2693| `teammate_name` | Nama rekan tim yang menyelesaikan tugas. Mungkin tidak ada |2699| `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 |2700| `team_name` | Deprecated. Nama tim yang diturunkan dari sesi; akan dihapus dalam rilis mendatang |
2695 2701
2696<h4 id="taskcompleted-decision-control">2702<h4 id="taskcompleted-decision-control">
2697 Kontrol keputusan TaskCompleted2703 Kontrol keputusan TaskCompleted
2698</h4>2704</h4>
2699 2705
2700Hook TaskCompleted mendukung dua cara untuk mengontrol penyelesaian tugas:2706Hook TaskCompleted mendukung dua cara untuk mengontrol penyelesaian task:
2701 2707
2702* **Exit code 2**: tugas tidak ditandai sebagai selesai dan pesan stderr diumpankan kembali ke model sebagai umpan balik.2708* **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.2709* **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 2710
2705Contoh ini menjalankan pengujian dan memblokir penyelesaian tugas jika pengujian gagal:2711Contoh ini menjalankan tes dan memblokir penyelesaian task jika tes gagal:
2706 2712
2707```bash theme={null}2713```bash theme={null}
2708#!/bin/bash2714#!/bin/bash
2734 Input Stop2740 Input Stop
2735</h4>2741</h4>
2736 2742
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).2743Selain [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 2744
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.2745Field `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 2746
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.2747Array `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 2748
2743Setiap entri dalam `background_tasks` menjelaskan satu tugas yang sedang berjalan dan menggunakan field berikut:2749Setiap entri dalam `background_tasks` menjelaskan satu task yang sedang berjalan dan menggunakan field berikut:
2744 2750
2745| Field | Deskripsi |2751| Field | Deskripsi |
2746| :- | :- |2752| :- | :- |
2747| `id` | Pengidentifikasi tugas |2753| `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 |2754| `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 |2755| `status` | Status task saat ini |
2750| `description` | Deskripsi teks bebas, dibatasi hingga 1000 karakter dengan penanda `… [+N chars]` di dalam string ketika dipotong |2756| `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` |2757| `command` | Baris perintah shell, dibatasi hingga 1000 karakter. Hanya ada untuk task `shell` |
2752| `agent_type` | Nama jenis subagent. Hanya ada untuk tugas `subagent` |2758| `agent_type` | Nama jenis subagent. Hanya ada untuk task `subagent` |
2753| `server` | Nama server MCP. Hanya ada untuk tugas `monitor` dan `MCP task` |2759| `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` |2760| `tool` | Nama tool MCP. Hanya ada untuk task `monitor` dan `MCP task` |
2755| `name` | Nama workflow. Hanya ada untuk tugas `workflow` |2761| `name` | Nama workflow. Hanya ada untuk task `workflow` |
2756 2762
2757Setiap entri dalam `session_crons` menjelaskan satu wakeup terjadwal dengan cakupan sesi, yang bersumber dari `CronCreate`, `ScheduleWakeup`, dan `/loop`:2763Setiap entri dalam `session_crons` menjelaskan satu wakeup terjadwal dengan cakupan sesi, yang bersumber dari `CronCreate`, `ScheduleWakeup`, dan `/loop`:
2758 2764
2759| Field | Deskripsi |2765| Field | Deskripsi |
2760| :- | :- |2766| :- | :- |
2761| `id` | Pengidentifikasi tugas cron |2767| `id` | Pengidentifikasi task cron |
2762| `schedule` | Ekspresi cron, misalnya `0 9 * * 1-5` |2768| `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 |2769| `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 |2770| `prompt` | Prompt yang dikirim ketika cron dipicu, dibatasi hingga 1000 karakter dengan penanda `… [+N chars]` yang sama |
2765 2771
2766Contoh ini menunjukkan input Stop dengan satu tugas shell yang sedang berjalan dan satu cron berulang:2772Contoh ini menunjukkan input Stop dengan satu task shell yang sedang berjalan dan satu cron berulang:
2767 2773
2768```json theme={null}2774```json theme={null}
2769{2775{
2803| Field | Deskripsi |2809| Field | Deskripsi |
2804| :- | :- |2810| :- | :- |
2805| `decision` | `"block"` mencegah Claude berhenti. Hilangkan untuk mengizinkan Claude berhenti |2811| `decision` | `"block"` mencegah Claude berhenti. Hilangkan untuk mengizinkan Claude berhenti |
2806| `reason` | Wajib ketika `decision` adalah `"block"`. Memberi tahu Claude mengapa ia harus melanjutkan |2812| `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 |2813| `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 2814
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.2815Hook 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 2816
2811```json theme={null}2817```json theme={null}
2812{2818{
2815}2821}
2816```2822```
2817 2823
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:2824Gunakan `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 2825
2820```json theme={null}2826```json theme={null}
2821{2827{
2842| :- | :- |2848| :- | :- |
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` |2849| `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 |2850| `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"` |2851| `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 2852
2847```json theme={null}2853```json theme={null}
2848{2854{
2862 TeammateIdle2868 TeammateIdle
2863</h3>2869</h3>
2864 2870
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.2871Berjalan 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 2872
2867Hook TeammateIdle tidak mendukung matcher dan dipicu pada setiap kejadian.2873Hook TeammateIdle tidak mendukung matcher dan dipicu pada setiap kejadian.
2868 2874
2915 ConfigChange2921 ConfigChange
2916</h3>2922</h3>
2917 2923
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.2924Berjalan 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 2925
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.2926Claude 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 2927
2984}2990}
2985```2991```
2986 2992
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.2993Perubahan `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 2994
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.2995Claude 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 2996
2991<h3 id="cwdchanged">2997<h3 id="cwdchanged">
2992 CwdChanged2998 CwdChanged
2993</h3>2999</h3>
2994 3000
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.3001Berjalan 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 3002
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.3003Hook 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 3004
2999CwdChanged tidak mendukung matcher dan dipicu pada setiap kejadian.3005CwdChanged tidak mendukung matcher dan dipicu pada setiap kejadian.
3000 3006
3019 Output CwdChanged3025 Output CwdChanged
3020</h4>3026</h4>
3021 3027
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):3028Selain [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 3029
3024| Field | Deskripsi |3030| Field | Deskripsi |
3025| :- | :- |3031| :- | :- |
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 |3032| `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 3033
3028Hook CwdChanged tidak memiliki kontrol keputusan. Hook ini tidak dapat memblokir perubahan direktori.3034Hook CwdChanged tidak memiliki kontrol keputusan. Hook ini tidak dapat memblokir perubahan direktori.
3029 3035
3038Claude Code tidak memicu event ini ketika:3044Claude Code tidak memicu event ini ketika:
3039 3045
3040* Anda meneruskan direktori dengan flag startup `--add-dir`; [SessionStart](#sessionstart) mencakup direktori tersebut3046* Anda meneruskan direktori dengan flag startup `--add-dir`; [SessionStart](#sessionstart) mencakup direktori tersebut
3041* Anda menambahkan direktori pada tab Workspace di `/permissions`3047* Anda menambahkan direktori di tab Workspace `/permissions`
3042* Anda menambahkan direktori yang sudah merupakan direktori kerja atau berada di dalamnya3048* Anda menambahkan direktori yang sudah menjadi direktori kerja atau berada di dalamnya
3043 3049
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.3050Claude 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 3051
3046Claude Code tidak menunggu hook: penambahan selesai segera, dan hook berjalan di latar belakang dengan timeout default 600 detik.3052Claude Code tidak menunggu hook: penambahan selesai segera, dan hook berjalan di latar belakang dengan timeout default 600 detik.
3047 3053
3074}3080}
3075```3081```
3076 3082
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:3083Hook 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 3084
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 debug3085* `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 debug3086* `register_repo_root`: Claude Code menulis output `systemMessage` dan output kegagalan hanya ke log debug
3081 3087
3082<h3 id="filechanged">3088<h3 id="filechanged">
3083 FileChanged3089 FileChanged
3084</h3>3090</h3>
3085 3091
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.3092Berjalan 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 3093
3088`matcher` untuk event ini memiliki dua peran:3094`matcher` untuk event ini memiliki dua peran:
3089 3095
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`.3096* **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.3097* **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 3098
3093Contoh ini menormalkan akhir baris di `data.csv` setelah perubahan apa pun, termasuk perintah `Bash` atau skrip eksternal yang menulis ulang file:3099Contoh ini menormalkan akhir baris di `data.csv` setelah setiap perubahan, termasuk perintah `Bash` atau skrip eksternal yang menulis ulang file:
3094 3100
3095```json theme={null}3101```json theme={null}
3096{3102{
3110}3116}
3111```3117```
3112 3118
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:3119Hook 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 3120
3115```bash theme={null}3121```bash theme={null}
3116#!/bin/bash3122#!/bin/bash
3122 3128
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.3129Untuk 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 3130
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 `*`.3131Untuk 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 3132
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.3133Hook 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 3134
3129<h4 id="filechanged-input">3135<h4 id="filechanged-input">
3130 Input FileChanged3136 Input FileChanged
3152 Output FileChanged3158 Output FileChanged
3153</h4>3159</h4>
3154 3160
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:3161Selain [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 3162
3157| Field | Deskripsi |3163| Field | Deskripsi |
3158| :- | :- |3164| :- | :- |
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 |3165| `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 3166
3161Hook FileChanged tidak memiliki kontrol keputusan. Hook ini tidak dapat memblokir terjadinya perubahan file.3167Hook FileChanged tidak memiliki kontrol keputusan. Hook ini tidak dapat memblokir terjadinya perubahan file.
3162 3168
3166 WorktreeCreate3172 WorktreeCreate
3167</h3>3173</h3>
3168 3174
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.3175Berjalan 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 3176
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.3177Karena 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 3178
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.3179Hook 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 3180
3175Claude Code menindaklanjuti keberhasilan hook dan path yang dikembalikan, serta membuang `systemMessage` dan `continue`.3181Claude Code menindaklanjuti keberhasilan hook dan path yang dikembalikan, serta membuang `systemMessage` dan `continue`.
3176 3182
3177Contoh ini membuat salinan kerja SVN dan mencetak path untuk digunakan Claude Code. Ganti URL repositori dengan milik Anda sendiri:3183Contoh ini membuat salinan kerja SVN dan mencetak path untuk digunakan oleh Claude Code. Ganti URL repositori dengan milik Anda sendiri:
3178 3184
3179```json theme={null}3185```json theme={null}
3180{3186{
3193}3199}
3194```3200```
3195 3201
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.3202Hook 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 3203
3198<h4 id="worktreecreate-input">3204<h4 id="worktreecreate-input">
3199 Input WorktreeCreate3205 Input WorktreeCreate
3215 Output WorktreeCreate3221 Output WorktreeCreate
3216</h4>3222</h4>
3217 3223
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:3224Hook 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 3225
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.3226* **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.3227* **Hook HTTP** (`type: "http"`): kembalikan `{ "hookSpecificOutput": { "hookEventName": "WorktreeCreate", "worktreePath": "/absolute/path" } }` dalam body respons.
3222 3228
3223Jika hook gagal atau tidak menghasilkan path, pembuatan worktree gagal dengan error.3229Jika hook gagal atau tidak menghasilkan path, pembuatan worktree gagal dengan error.
3224 3230
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.3231Claude 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 3232
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.3233Claude 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 3234
3229<h3 id="worktreeremove">3235<h3 id="worktreeremove">
3230 WorktreeRemove3236 WorktreeRemove
3231</h3>3237</h3>
3232 3238
3233Berjalan saat worktree sedang dihapus. Ini adalah pasangan pembersihan dari [WorktreeCreate](#worktreecreate). Event ini dipicu saat:3239Berjalan saat worktree sedang dihapus. Ini adalah pasangan pembersihan untuk [WorktreeCreate](#worktreecreate). Event ini dipicu ketika:
3234 3240
3235* Anda keluar dari sesi `--worktree` dan memilih untuk menghapusnya3241* Anda keluar dari sesi `--worktree` dan memilih untuk menghapusnya
3236* subagent dengan `isolation: "worktree"` selesai3242* subagent dengan `isolation: "worktree"` selesai
3238 3244
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:3245Untuk 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 3246
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.3247* **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.3248* **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).3249* **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 3250
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.3251Claude 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 3252
3248 3254
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.3255Untuk 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 3256
3251Claude Code meneruskan path yang dikembalikan oleh WorktreeCreate sebagai `worktree_path` di input hook. Contoh ini membaca path tersebut dan menghapus direktorinya:3257Claude Code meneruskan path yang dikembalikan oleh WorktreeCreate sebagai `worktree_path` dalam input hook. Contoh ini membaca path tersebut dan menghapus direktorinya:
3252 3258
3253```json theme={null}3259```json theme={null}
3254{3260{
3285 3291
3286Exit code hook WorktreeRemove menentukan hasilnya. Ketika hook keluar dengan non-zero dan direktori di `worktree_path` masih ada setelahnya, penghapusan gagal:3292Exit code hook WorktreeRemove menentukan hasilnya. Ketika hook keluar dengan non-zero dan direktori di `worktree_path` masih ada setelahnya, penghapusan gagal:
3287 3293
3288* Worktree tetap ada di disk, dan perintah serta stderr hook masuk ke [log debug](#debug-hooks).3294* 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.3295* 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 3296
3291<h3 id="precompact">3297<h3 id="precompact">
3299| Matcher | Kapan dipicu |3305| Matcher | Kapan dipicu |
3300| :- | :- |3306| :- | :- |
3301| `manual` | `/compact` |3307| `manual` | `/compact` |
3302| `auto` | Auto-compact saat percakapan mencapai [jendela auto-compact](/docs/id/model-config#set-the-auto-compact-window) |3308| `auto` | Auto-compact ketika percakapan mencapai [jendela auto-compact](/docs/id/model-config#set-the-auto-compact-window) |
3303 3309
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"`.3310Keluar 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 3311
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.3312Memblokir 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 3313
3308Claude Code membuang field `systemMessage` dan `continue` dari hook PreCompact.3314Claude Code membuang field `systemMessage` dan `continue` dari hook PreCompact.
3309 3315
3311 Input PreCompact3317 Input PreCompact
3312</h4>3318</h4>
3313 3319
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`.3320Selain [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 3321
3316```json theme={null}3322```json theme={null}
3317{3323{
3328 PostCompact3334 PostCompact
3329</h3>3335</h3>
3330 3336
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.3337Berjalan 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 3338
3333Nilai matcher yang sama berlaku seperti untuk `PreCompact`:3339Nilai matcher yang sama berlaku seperti untuk `PreCompact`:
3334 3340
3335| Matcher | Kapan dipicu |3341| Matcher | Kapan dipicu |
3336| :- | :- |3342| :- | :- |
3337| `manual` | Setelah `/compact` |3343| `manual` | Setelah `/compact` |
3338| `auto` | Setelah auto-compact saat percakapan mencapai [jendela auto-compact](/docs/id/model-config#set-the-auto-compact-window) |3344| `auto` | Setelah auto-compact ketika percakapan mencapai [jendela auto-compact](/docs/id/model-config#set-the-auto-compact-window) |
3339 3345
3340<h4 id="postcompact-input">3346<h4 id="postcompact-input">
3341 Input PostCompact3347 Input PostCompact
3362 3368
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.3369Berjalan 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 3370
3365PreModelSwitch memerlukan Claude Code v2.1.251 atau lebih baru. Claude Code menjalankannya untuk permintaan berikut:3371PreModelSwitch memerlukan Claude Code v2.1.251 atau yang lebih baru. Claude Code menjalankannya untuk permintaan berikut:
3366 3372
3367* `/model <name>` dan pemilih `/model`3373* `/model <name>` dan pemilih `/model`
3368* Pemilih model `Option+P` atau `Alt+P`3374* Pemilih model `Option+P` atau `Alt+P`
3372 3378
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).3379Claude 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 3380
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.3381Claude 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 3382
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.3383Ketika 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 3384
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:3385Tulis 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 3386
3381<Tabs>3387<Tabs>
3382 <Tab title="macOS/Linux">3388 <Tab title="macOS/Linux">
3402 </Tab>3408 </Tab>
3403 3409
3404 <Tab title="Windows (PowerShell)">3410 <Tab title="Windows (PowerShell)">
3405 Daftarkan hook command yang menjalankan skrip melalui PowerShell:3411 Daftarkan hook perintah yang menjalankan skrip melalui PowerShell:
3406 3412
3407 ```json theme={null}3413 ```json theme={null}
3408 {3414 {
3454| :- | :- | :- |3460| :- | :- | :- |
3455| `from_model` | string | ID model asal peralihan |3461| `from_model` | string | ID model asal peralihan |
3456| `to_model` | string | ID model tujuan peralihan. Matcher dibandingkan dengan nama kanonis model ini |3462| `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 |3463| `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 |3464| `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 |3465| `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 |3466| `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"` |3467| `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 |3468| `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 |3469| `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 3470
3465Contoh ini menunjukkan input untuk `/model opus` dalam sesi yang menjalankan Sonnet 5:3471Contoh ini menunjukkan input untuk `/model opus` dalam sesi yang menjalankan Sonnet 5:
3466 3472
3493| Field | Deskripsi |3499| Field | Deskripsi |
3494| :- | :- |3500| :- | :- |
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 |3501| `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"` |3502| `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 3503
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.3504Hanya `/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 3505
3500Contoh ini meminta pengguna untuk mengonfirmasi dan mengutip jumlah token dari `context_tokens`:3506Contoh ini meminta pengguna untuk mengonfirmasi dan mengutip jumlah token dari `context_tokens`:
3501 3507
3511 3517
3512Ketika beberapa hook PreModelSwitch mengembalikan keputusan yang berbeda, urutan prioritasnya adalah `deny` > `ask` > `allow`.3518Ketika beberapa hook PreModelSwitch mengembalikan keputusan yang berbeda, urutan prioritasnya adalah `deny` > `ask` > `allow`.
3513 3519
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.3520Claude 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 3521
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.3522Hook 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 3523
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).3524Hook 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 3525
3520<h3 id="postmodelswitch">3526<h3 id="postmodelswitch">
3521 PostModelSwitch3527 PostModelSwitch
3522</h3>3528</h3>
3523 3529
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.3530Berjalan 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 3531
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:3532PostModelSwitch 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 3533
3528* Peralihan yang diminta oleh Anda atau klien3534* Peralihan yang diminta oleh Anda atau klien
3529* [Fallback model otomatis](/docs/id/model-config#automatic-model-fallback), yang mengubah model sesi3535* [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 mode3536* 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 sesi3537* Claude Code memulihkan model saat Anda melanjutkan sesi
3532 3538
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.3539Claude 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 3540
3535Matcher mengikuti aturan yang sama seperti [PreModelSwitch](#premodelswitch): Claude Code membandingkannya dengan nama kanonis model tujuan peralihan sesi.3541Matcher mengikuti aturan yang sama seperti [PreModelSwitch](#premodelswitch): Claude Code membandingkannya dengan nama kanonis model yang menjadi tujuan peralihan sesi.
3536 3542
3537Contoh ini menambahkan panduan setiap kali model sesi berubah ke model Opus mana pun:3543Contoh ini menambahkan panduan setiap kali model sesi berubah ke model Opus mana pun:
3538 3544
3574| :- | :- |3580| :- | :- |
3575| `additionalContext` | String yang ditambahkan ke konteks Claude bersama permintaan berikutnya. Lihat [Menambahkan konteks untuk Claude](#add-context-for-claude) |3581| `additionalContext` | String yang ditambahkan ke konteks Claude bersama permintaan berikutnya. Lihat [Menambahkan konteks untuk Claude](#add-context-for-claude) |
3576 3582
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.3583Jika 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 3584
3579<h3 id="sessionend">3585<h3 id="sessionend">
3580 SessionEnd3586 SessionEnd
3581</h3>3587</h3>
3582 3588
3583Berjalan saat sesi Claude Code berakhir. Berguna untuk tugas pembersihan, mencatat statistik3589Berjalan ketika sesi Claude Code berakhir. Berguna untuk tugas pembersihan, mencatat statistik
3584sesi, atau menyimpan status sesi. Mendukung matcher untuk memfilter berdasarkan alasan keluar.3590sesi, atau menyimpan state sesi. Mendukung matcher untuk memfilter berdasarkan alasan keluar.
3585 3591
3586Field `reason` dalam input hook menunjukkan mengapa sesi berakhir:3592Field `reason` dalam input hook menunjukkan mengapa sesi berakhir:
3587 3593
3590| `clear` | Sesi dibersihkan dengan perintah `/clear` |3596| `clear` | Sesi dibersihkan dengan perintah `/clear` |
3591| `resume` | Sesi dialihkan melalui `/resume` interaktif |3597| `resume` | Sesi dialihkan melalui `/resume` interaktif |
3592| `logout` | Pengguna keluar (log out) |3598| `logout` | Pengguna keluar (log out) |
3593| `prompt_input_exit` | Pengguna keluar saat input prompt terlihat |3599| `prompt_input_exit` | Pengguna keluar saat input prompt sedang terlihat |
3594| `other` | Alasan keluar lainnya |3600| `other` | Alasan keluar lainnya |
3595| `bypass_permissions_disabled` | Dihapus di v2.1.234; Claude Code tidak mengirimkannya. Hapus dari matcher `SessionEnd` Anda |3601| `bypass_permissions_disabled` | Dihapus di v2.1.234; Claude Code tidak mengirimkannya. Hapus dari matcher `SessionEnd` Anda |
3596 3602
3614 3620
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:3621Hook 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 3622
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.3623* **`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.3624* **`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 3625
3620Contoh ini mengatur anggaran menjadi 5 detik:3626Contoh ini mengatur anggaran menjadi 5 detik:
3629 Elicitation3635 Elicitation
3630</h3>3636</h3>
3631 3637
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.3638Berjalan 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 3639
3634Field matcher dicocokkan dengan nama server MCP.3640Field matcher dicocokkan dengan nama server MCP.
3635 3641
3699 3705
3700Exit code 2 menolak elicitation. Claude Code tidak menampilkan pesan stderr Anda di mana pun.3706Exit code 2 menolak elicitation. Claude Code tidak menampilkan pesan stderr Anda di mana pun.
3701 3707
3702Claude Code menindaklanjuti `hookSpecificOutput` dari output JSON hook Elicitation dan membuang `systemMessage` serta `continue`.3708Claude Code bertindak berdasarkan `hookSpecificOutput` dari output JSON hook Elicitation dan membuang `systemMessage` serta `continue`.
3703 3709
3704<h3 id="elicitationresult">3710<h3 id="elicitationresult">
3705 ElicitationResult3711 ElicitationResult
3752 3758
3753Exit code 2 memblokir respons, mengubah tindakan efektif menjadi `decline`. Claude Code tidak menampilkan pesan stderr Anda di mana pun.3759Exit code 2 memblokir respons, mengubah tindakan efektif menjadi `decline`. Claude Code tidak menampilkan pesan stderr Anda di mana pun.
3754 3760
3755Claude Code menindaklanjuti `hookSpecificOutput` dari output JSON hook ElicitationResult dan membuang `systemMessage` serta `continue`.3761Claude Code bertindak berdasarkan `hookSpecificOutput` dari output JSON hook ElicitationResult dan membuang `systemMessage` serta `continue`.
3756 3762
3757<h2 id="prompt-based-hooks">3763<h2 id="prompt-based-hooks">
3758 Prompt-based hooks3764 Prompt-based hooks