3.0.0-beta.15). Tính năng có thể thay đổi trước bản stable tiếp theo.Chuyển sang stable →Hooks và runtime
Hook của Engineer và hỗ trợ theo runtime
Tìm hiểu event graph của Hook Engineer, kết quả có thể quan sát và ranh giới hỗ trợ theo runtime.
Hook của Engineer bổ sung automation xoay quanh thao tác với tool, prompt, ranh giới session và handoff. Hook có thể trả về hướng dẫn, yêu cầu phê duyệt, dừng một thao tác không an toàn hoặc quá rộng, hay cập nhật trạng thái workflow có giới hạn. Bạn không gọi Hook như Skill hoặc command; runtime đã chọn sẽ gọi các handler được hỗ trợ khi event tương ứng xảy ra.
Package Engineer đã resolve có 55 entry Hook. Con số này là inventory của artifact, không phải 55 behavior độc lập. Nó bao gồm manifest của Hook, event handler, thư viện hỗ trợ dùng chung, cùng helper về trạng thái và statusline riêng của Engineer. Một handler có thể tham gia nhiều event, còn tệp hỗ trợ có thể không bao giờ tự chạy.
Hook bổ sung cho biện pháp bảo vệ hiện có
Check và reminder từ Hook có thể giúp giảm sai sót, nhưng không thay thế quyền của runtime, kiểm soát repository, quản lý secret, code review hay sự phê duyệt của bạn. Hãy review mọi hành động được yêu cầu và các thay đổi tạo ra.
Event graph đang hoạt động
Graph đang hoạt động được tổ chức theo kết quả thay vì số lượng tệp trong package:
| Event | Điều bạn có thể quan sát |
|---|---|
PreToolUse | Cung cấp hướng dẫn đặt tên cho tệp mới, kiểm tra truy cập tệp nhạy cảm, dừng hoạt động scout quá rộng hoặc đi vào path bị bỏ qua khi request vượt ngoài ranh giới được hỗ trợ, kiểm tra lượng nội dung mà một lệnh read, search hoặc shell có thể trả về, và thay thế tham chiếu ${secret:NAME} trong lệnh shell và URL fetch. Check có thể cho phép request, trả về hướng dẫn hoặc yêu cầu phê duyệt. |
PostToolUse | Giữ định dạng plan nhất quán sau khi edit và write, làm mới trạng thái task/session sau thao tác task được hỗ trợ, cập nhật trạng thái sử dụng sau hoạt động của tool và ghi lại số liệu tổng hợp có giới hạn về hoạt động tool cho agent behavior linter. |
PreCompact | Ghi lại đủ định hướng workflow để tiếp tục sau khi compact context và đánh dấu lần compact đó cho agent behavior linter. |
SessionStart | Khởi tạo context của project và session cho phiên mới, đồng thời làm mới marker liveness cho background auto-update của project này. |
SubagentStart | Khởi tạo trạng thái subagent và cung cấp team context liên quan. |
Stop | Làm mới trạng thái session và usage, đồng thời làm mới marker liveness auto-update. Khi có plan đang hoạt động, lời nhắc plan có thể trả JSON hợp lệ, không chặn với continue và systemMessage; nếu không, hook thoát im lặng. Agent behavior linter có thể thêm một báo cáo session mang tính tư vấn. |
SubagentStop | Làm mới trạng thái session dùng chung tại ranh giới subagent. |
UserPromptSubmit | Cung cấp hướng dẫn phát triển theo project, kiểm tra rủi ro output giống secret, áp dụng gate đơn giản hóa trước khi ship khi phù hợp, làm mới trạng thái usage và làm mới marker liveness auto-update. |
SessionEnd | Gỡ marker liveness auto-update của session này. |
Những kết quả này hỗ trợ workflow Engineer; chúng không tự phê duyệt plan, commit, merge, deploy hay phát hành công việc thay bạn.
Context firewall và agent behavior linter
Hook context-firewall chạy trước các lệnh Bash, PowerShell, Read, Grep
và Glob,
rồi ước tính lượng nội dung mà lệnh đó có thể trả về. Hook cho phép lệnh thông
thường, cảnh báo mà không chặn, hoặc chặn lệnh và nêu một cách thay thế có giới
hạn:
| Lệnh | Cảnh báo | Chặn |
|---|---|---|
Đọc toàn bộ tệp mà không có offset, limit hay khoảng trang | Tệp từ 256 KB trở lên | Tệp từ 2 MB trở lên |
Search ở output mode content mà không có head_limit từ 100 trở xuống | Mọi pattern khác | Pattern mà check scout đã xem là quá rộng |
Lệnh shell in toàn bộ một tệp, ví dụ cat hoặc Get-Content | Tệp từ 128 KB trở lên | Tệp từ 512 KB trở lên |
| Stream log không giới hạn, search hoặc duyệt cây thư mục đệ quy, hay toàn bộ lịch sử hoặc diff Git | Luôn luôn | — |
Khi cùng một thao tác đã bị cảnh báo chạm tới lần can thiệp thứ ba trong một session, cảnh báo trở thành chặn. Mỗi lần can thiệp được ghi vào một bản ghi theo session có giới hạn, với giá trị credential đã được che. Firewall luôn fail-open: nếu Hook gặp lỗi ngoài dự kiến, lệnh vẫn được thực hiện.
Hook agent-behavior-linter quan sát hoạt động tool trong session và, tại
Stop, có thể báo cáo các pattern mà nó chứng minh được từ hoạt động đó: đọc
lại một tệp không thay đổi, chạy lại một lệnh thất bại với cùng lỗi, search
rộng lặp lại, output tool lớn mà không tệp nào thay đổi, và chạy toàn bộ test
suite sau một thay đổi chỉ liên quan tài liệu. Mỗi phát hiện nêu điều đã quan
sát, việc nên làm thay thế và nguyên tắc tương ứng trong ak:context-engineering.
Linter chỉ giữ số liệu tổng hợp có giới hạn trong trạng thái riêng theo
session, không bao giờ chặn lệnh tool và không in báo cáo khi không có phát
hiện nào.
Cả hai Hook đều bật theo mặc định. Để tắt một Hook, đặt hooks.context-firewall
hoặc hooks.agent-behavior-linter thành false; xem Quản lý preference của
Hook.
Phê duyệt truy cập tệp nhạy cảm
Hook privacy-block chạy trước các lệnh gọi Read, Write, Edit, Bash và
PowerShell,
bảo vệ các tệp dotenv như .env và .env.local, tệp credentials,
secrets.yaml hoặc secret.yml, tệp .pem và .key, cùng SSH private key.
Lần truy cập đầu tiên vào một path như vậy bị từ chối trên mọi runtime và mọi
đường công cụ, kể cả path nằm trong lệnh shell và các chỉnh sửa Codex
apply_patch đi qua matcher Edit và Write. Việc kiểm tra lệnh shell cũng
bao gồm những gì một shell đọc stdin (sh, bash -s, iex) chạy từ một đoạn
pipeline phía trước, đoạn script truyền vào [scriptblock]::Create hoặc
InvokeScript, lệnh chạy qua Start-Process hoặc xargs, và các wrapper có
option nhận giá trị như sudo -u, wsl -d hoặc timeout -s. Tên tệp dotenv
được ghép bằng phép nối chuỗi PowerShell, khớp qua glob bắt đầu bằng dấu chấm,
hoặc viết dưới dạng NTFS alternate data stream hay tên ngắn 8.3 của Windows cũng
được nhận diện. Các tệp mẫu như .env.example,
.env.sample và .env.template vẫn được phép, và một biểu thức mã nguồn như
process.env.API_KEY không bị coi là path tệp.
Thông báo từ chối nêu rõ thao tác (read, write hoặc edit) và yêu cầu agent
hỏi bạn qua khả năng ask-user của runtime: AskUserQuestion trên Claude Code,
và request_user_input trên Codex khi có, nếu không thì một câu hỏi chat thông
thường rồi kết thúc lượt. Các runtime khác nhận câu hỏi chat thông thường.
- Agent hỏi bạn. Bạn phê duyệt hoặc từ chối một lần truy cập vào path đã nêu.
- Agent thử lại một lần. Sau khi được phê duyệt, agent lặp lại đúng lệnh
gọi đó với mỗi path được bảo vệ có tiền tố
APPROVED:. Hook bỏ tiền tố trước khi công cụ chạy, nên công cụ thấy path thật. - Phê duyệt được dùng hết. Phê duyệt gắn với session, path đã chuẩn hóa và thao tác, chỉ dùng cho một lệnh gọi và hết hạn sau 15 phút. Trên Claude Code, lần thử lại đã được phê duyệt vẫn hiện permission prompt gốc với đúng lệnh gọi.
Tiền tố APPROVED: không có lần từ chối trước đó, lần thử lại thứ hai, phê
duyệt đã hết hạn, hoặc lần chạy không có định danh session đều bị từ chối. Vì
vậy lần chạy non-interactive fail closed: không ai trả lời được, nên agent tiếp
tục mà không dùng tệp đó. Khi bạn từ chối, agent được yêu cầu tiếp tục mà không
dùng tệp và không truy cập nó qua công cụ hay lệnh khác.
Rào chắn chống nhầm lẫn, không phải ranh giới bảo mật
Luồng phê duyệt dựa trên sự hợp tác của model. Nó giảm việc vô tình đọc hoặc ghi secret, nhưng không chống lại một model độc hại hoặc đã bị xâm phạm. Hãy giữ credential trong secret store và dùng permission của runtime làm cơ chế thực thi.
Trên Codex, atom Read bị bỏ, nên Hook chỉ bảo vệ đường shell và chỉnh sửa;
các thao tác đọc qua MCP và local function tool không được bảo vệ. AgentKit báo
điều này trong output cài đặt, như một phần của ghi chú matcher bị thu hẹp. Hook
bật theo mặc định; đặt hooks.privacy-block thành false để tắt, như mô tả
trong Quản lý preference của
Hook.
Tham chiếu secret trong lệnh gọi công cụ
Hook secrets-inject chạy trước các lệnh gọi Bash, PowerShell và
WebFetch. Khi một lệnh shell hoặc URL fetch chứa tham chiếu ${secret:NAME},
Hook hỏi
ak secrets resolve để lấy giá trị đã lưu và thay thế trong bộ nhớ, nhờ đó
model có thể soạn lệnh gọi mà không nhìn thấy credential. Chỉ Bash.command,
PowerShell.command và WebFetch.url được quét; nội dung tệp và prompt được giữ nguyên. Grant
ak secrets cho binary agent đang gọi quyết định giá trị có được
giải phóng hay không, và grant bị giới hạn bằng --allow-host còn kiểm tra đích
fetch.
Mọi lỗi đều chặn lệnh gọi công cụ thay vì chuyển nguyên văn tham chiếu đi,
bao gồm thiếu grant, tên không hợp lệ hoặc giá trị có ký tự đặc biệt của shell
khi đi vào một lệnh Bash hoặc PowerShell. Riêng với lệnh PowerShell, giá
trị chứa ,, @ hoặc dấu nháy typographic cũng bị từ chối, vì PowerShell sẽ
đọc chúng thành dấu tách mảng, splat hoặc dấu nháy; hãy truyền giá trị như vậy
qua biến môi trường. Hook không ghi bản sao nào của giá trị, nhưng input
đã thay thế vẫn tới process của công cụ và mọi thứ runtime ghi lại cho một lệnh
gọi đã thực thi, chẳng hạn transcript. Hãy coi giá trị đã giải phóng là có mặt
trên host và rotate khi cần.
Claude Code và Grok đăng ký Hook cho Bash|PowerShell|WebFetch, còn Codex thu
hẹp thành Bash. Hỗ trợ Cursor cho Hook này chưa được xác lập trong bản phát hành này.
Liveness cho cập nhật nền tự động
Hook session-heartbeat.cjs đăng ký trên SessionStart, UserPromptSubmit,
Stop và SessionEnd. Nó ghi một marker theo session dưới AgentKit home để
cập nhật nền opt-in bỏ qua project đang có agent
session sống, và gỡ marker đó ở SessionEnd. Tại SessionStart, nó cũng in
một dòng thông báo cho kết quả cập nhật nền chưa được xem, xác nhận bằng
ak update --status --ack --json. Hook không bao giờ chặn session và tự
thoát 0 ngay cả khi lỗi.
Path đã cấu hình khi bắt đầu session
Handler SessionStart resolve tùy chọn path của project trước khi export môi
trường mà workflow Engineer sử dụng. Giá trị tương đối của paths.docs hoặc
paths.plans được resolve dưới project base của session. Giá trị tuyệt đối được
export nguyên vẹn dưới dạng CK_DOCS_PATH hoặc CK_PLANS_PATH, thay vì được
join vào path của project. Export này cung cấp các vị trí đã cấu hình cho Skill;
các bề mặt plan, journal và dashboard Go native yêu cầu riêng paths.plans
tương đối theo project và fallback về plans/ khi giá trị là path tuyệt đối.
Projection theo runtime
Các nhãn dưới đây mô tả nội dung trở thành active:
- Emitted nghĩa là AgentKit ghi một artifact native đang hoạt động.
- Translated nghĩa là AgentKit ánh xạ behavior được hỗ trợ sang event model native của runtime.
- Dropped nghĩa là runtime không biểu diễn được behavior nên behavior đó không hoạt động.
- Narrowed nghĩa là handler vẫn hoạt động nhưng chỉ với tập con có thể biểu diễn của matcher ban đầu.
- Sidecar-preserved nghĩa là nội dung package được giữ lại để hỗ trợ hoặc truy vết nguồn gốc, nhưng bản thân nó không phải feature runtime đang hoạt động.
| Bề mặt | Claude Code | Codex | Cursor |
|---|---|---|---|
| Event graph của Hook | Emitted: graph đã khai báo dùng bề mặt Hook native hoặc plugin của Claude Code. | Translated: event và matcher có thể biểu diễn trở thành đăng ký Hook của Codex. Dropped: group không được hỗ trợ bị bỏ. Narrowed: matcher atom được hỗ trợ vẫn hoạt động. Cả hai đều được báo; cài đặt vẫn có thể thành công. | Translated: group được hỗ trợ trở thành đăng ký Hook của Cursor. Hỗ trợ trong source không chứng minh behavior giống hệt trên mọi thiết lập provider. |
| Dependency của handler | Dependency cần cho handler đang hoạt động được emit; nội dung hỗ trợ còn lại được sidecar-preserved. | Dependency cần cho handler đã translate được emit; nội dung hỗ trợ còn lại được sidecar-preserved. | Dependency cần cho handler đã translate được emit; nội dung hỗ trợ còn lại được sidecar-preserved. |
| Statusline Engineer | Emitted: hoạt động khi AgentKit có thể cài mà không thay thế statusline không thuộc quyền sở hữu của mình. | Dropped: không được hỗ trợ. | Dropped: không được hỗ trợ. |
Statusline Engineer chỉ dành cho Claude Code. Codex và Cursor không có statusline chỉ vì package chứa tệp hỗ trợ statusline.
Hỗ trợ một phần trên Codex
Codex có event model và matcher model nhỏ hơn Claude Code. Engineer projection một group bị drop hoàn toàn và bốn matcher bị thu hẹp:
- Matcher
PostToolUseAgent|Task|TodoWrite|TodoReadvới handlersession-state.cjsbị drop hoàn toàn. Các đăng kýStopvàSubagentStopriêng vẫn còn. Read|Write|Edit|Bash|PowerShelltrở thànhWrite|Edit|Bash, bỏReadvàPowerShellnhưng giữprivacy-block.cjshoạt động cho các atom được hỗ trợ. Các thao tác đọc trên Codex qua MCP và local function tool không được bảo vệ; xem Phê duyệt truy cập tệp nhạy cảm.Bash|PowerShell|Readtrở thànhBash, bỏPowerShellvàReadnhưng giữscout-block.cjshoạt động cho Bash.Bash|PowerShell|Read|Grep|Globtrở thànhBash, bỏPowerShell,Read,GrepvàGlobnhưng giữcontext-firewall.cjshoạt động cho Bash.Bash|PowerShell|WebFetchtrở thànhBash, bỏPowerShellvàWebFetchnhưng giữsecrets-inject.cjshoạt động cho Bash.
Các đăng ký agent-behavior-linter.cjs trên PostToolUse, PreCompact và
Stop được projection mà không bị thu hẹp.
Drop hoặc narrow không làm cài đặt thất bại. Output cho người dùng liệt kê chúng
dưới Hook groups not projected và Hook matchers narrowed
(some tool matches unsupported on this target). JSON dùng các field tùy chọn
hooksDropped, droppedHookSummaries, hookMatchersNarrowed và
narrowedHookSummaries. Hãy xem chúng là disclosure về capability, không phải
bằng chứng toàn bộ automation Engineer bị thiếu.
Lời nhắc plan chỉ được export trên wildcard Stop, không phải SubagentStop.
Khi không có plan đang hoạt động, hook trả mã 0 với stdout rỗng. Khi phù hợp,
hook emit JSON chỉ với success field hợp lệ, có dạng
{"continue":true,"systemMessage":"..."}, và luôn fail-open.
Hỗ trợ chạy Hook trên Windows
Trên Windows, Hook .cjs hợp lệ nằm trong Codex home đã resolve có thể chạy từ
path thông thường chứa khoảng trắng. AgentKit emit một shim .cmd sibling được
quản lý và tham chiếu shim đó từ cấu hình Hook đã translate. Shim là output do
AgentKit sở hữu và tham gia lifecycle refresh cùng uninstall thông thường.
Hỗ trợ này có giới hạn rõ ràng. Path có khoảng trắng nhưng nằm ngoài Codex home,
path chứa metacharacter của cmd.exe, tên shim không phải ASCII hoặc argument
được bake không an toàn hay không phải ASCII vẫn không được hỗ trợ và sẽ tạo
cảnh báo. Argument rỗng có cảnh báo riêng; shim cùng path và cùng nội dung được
deduplicate, còn nội dung xung đột giữ shim đầu tiên rồi cảnh báo. Path không cần
shim tiếp tục dùng command trực tiếp. Không sửa thủ công shim hoặc cấu hình Hook
đã được tạo.
Codex home do wrapper quản lý chỉ được liên kết leaf hooks cuối cùng tới
~/.codex/hooks canonical của user đã resolve, bằng symlink POSIX hoặc
directory junction trên Windows. AgentKit dùng path canonical đó cho command đã
translate, thao tác ghi, rollback và ownership. Parent có link và target không
canonical vẫn bị từ chối.
Chẩn đoán bề mặt Claude Code đang hoạt động
ak doctor --adapter claude-code --json discover các bề mặt Hook Claude Code đã
bật theo scope và delivery mode, thay vì xem tệp package là bằng chứng một Hook
đang hoạt động. Với bản cài native ở scope project và người dùng, check
hook_registration so sánh expectation đã cài với đăng ký đang hoạt động trong
settings.json và xác minh các entrypoint được tham chiếu. Với bản cài plugin,
check này kiểm tra manifest Hook đang hoạt động và các entrypoint của manifest.
Hook bị tắt qua AgentKit được loại khỏi expectation native.
Check hook_log đọc log gắn với từng bề mặt native hoặc plugin đã discover. Một
bề mặt active mới chưa có log vẫn được xem là healthy; đăng ký, manifest hoặc
entrypoint bị thiếu được báo kèm scope và delivery mode. Hãy dùng kết quả này để
xác định bề mặt bị ảnh hưởng trước khi refresh hoặc cài lại Kit.
Ownership và lifecycle
Đăng ký Hook ở scope project và người dùng có thể cùng tồn tại. Với cấu hình Codex global dùng chung, AgentKit merge các đăng ký do nó sở hữu trong khi giữ lại Hook của người dùng, field bên ngoài và đăng ký thuộc Kit khác. Entry đã bị sửa hoặc xung đột sẽ được giữ lại hay báo cáo thay vì bị ghi đè âm thầm.
Metadata của Hook do AgentKit sở hữu tham gia rollback. Khi không còn Kit nào sở hữu một cấu trúc do AgentKit tạo, quá trình dọn dẹp sẽ loại bỏ cấu trúc rỗng đó nhưng giữ lại cấu trúc có sẵn hoặc từ nguồn bên ngoài. Đây là cải thiện độ tin cậy của lifecycle, không phải bảo đảm bảo mật hay quyền xóa nội dung tùy ý khỏi tệp cấu hình Hook dùng chung.
Refresh và uninstall chỉ tác động lên nội dung được ghi nhận là do AgentKit sở hữu, không phải mọi Hook trong runtime. Hãy review preview của thao tác và snapshot khôi phục trước khi áp dụng thay đổi lifecycle. Không xóa runtime home hoặc toàn bộ tệp cấu hình Hook dùng chung để sửa lỗi.
Khắc phục sự cố an toàn
- Đọc disclosure của cài đặt. Kiểm tra cả heading drop và narrow hoặc các field JSON tương ứng trước khi kết luận toàn bộ Hook graph thất bại.
- Xác nhận target và scope. Bản cài ở project và người dùng là riêng biệt, và runtime có thể nạp một bản khác với bản bạn dự kiến.
- Chạy health check cho target. Dùng
ak doctor --adapter claude-code --jsoncho Claude Code hoặcak doctor --adapter codex --jsoncho Codex, rồi kiểm tra các check được báo cáo thay vì giả định có tệp đồng nghĩa Hook đang hoạt động. - Kiểm tra phân loại path trên Windows. Path
.cjshợp lệ trong Codex home có thể dùng shim được quản lý; dạng path bên ngoài hoặc không an toàn sẽ cảnh báo. - Dùng đúng route lifecycle. Preview refresh hoặc uninstall, giữ nội dung đã được người dùng sửa và kiểm tra mọi snapshot khôi phục trước khi áp dụng thay đổi.
Để bật, tắt hoặc khôi phục soft-preference của một Hook mà không đổi việc cài đặt của nó, hãy xem Quản lý preference của Hook.
Để xem flag cài đặt chính xác, hãy đọc Cài đặt
Kit và tham chiếu ak kit init. Để xem khác biệt capability giữa
các adapter, hãy đọc Runtime adapter. Nếu
việc cài đặt hoặc discovery vẫn chưa rõ, hãy tiếp tục với Lỗi cài
Kit và Runtime không tìm thấy Skill
hoặc Agent.
Nhóm Hook chưa được project có thể là unsupported hoặc được harness bridge trì hoãn. Đọc hooksDeferred riêng với nhóm unsupported; deferred không đồng nghĩa không được hỗ trợ vĩnh viễn.