拆解:6 個(gè)宿主適配器如何共享同一個(gè) ControlEvent v2 決策核心)
Stop That Shit 架構(gòu)拆解6 個(gè)宿主適配器如何共享同一個(gè) ControlEvent v2 決策核心【免費(fèi)下載鏈接】stop-that-shitStop That Shit別再造史了面向 Codex/GPT 場(chǎng)景的多平臺(tái) Hook Skill Guard攔截 AI coding agent 無(wú)需求的哈希、校驗(yàn)和與任務(wù)范圍膨脹。 A multi-platform Hook Skill Guard for AI coding agents in Codex/GPT workflows: stop unrequested hashes, checksums, and task-scope creep.項(xiàng)目地址: https://gitcode.com/gh_mirrors/st/stop-that-shitStop That Shit別再造史了是一款面向 Codex/GPT 等 AI coding agent 的多平臺(tái) Hook Skill Guard攔截沒(méi)有需求的哈希校驗(yàn)和、多余防御和任務(wù)范圍膨脹。它的架構(gòu)很克制——6 個(gè)宿主適配器只干翻譯這一件事所有要不要攔的判斷都交給同一個(gè)宿主無(wú)關(guān)的決策核心。本文帶你快速看懂這套一個(gè)大腦、多張面孔的設(shè)計(jì)。 問(wèn)題6 種宿主事件6 套方言Stop That Shit 目前支持 6 個(gè)宿主Codex、Claude Code、OpenCode、Hermes Agent CLI、Pi、Oh My Pi。麻煩在于每個(gè)宿主的鉤子事件名、字段結(jié)構(gòu)、攔截時(shí)機(jī)都不一樣宿主原生事件舉例對(duì)應(yīng)通用事件CodexPreToolUse/UserPromptSubmitaction.before/prompt.submitClaude CodePreToolUse/SubagentStartaction.before/subagent.startHermespre_tool_call/pre_llm_callaction.before/prompt.submitPitool_call/inputaction.before/prompt.submit如果在每個(gè)宿主里各寫(xiě)一套判斷邏輯規(guī)則會(huì)慢慢漂移——A 宿主攔哈希B 宿主忘了。Stop That Shit 的解法是把判斷和翻譯徹底拆開(kāi)適配器只負(fù)責(zé)把宿主的方言翻譯成統(tǒng)一事件決策核心只認(rèn)統(tǒng)一事件完全不關(guān)心它來(lái)自哪個(gè)宿主。 ControlEvent v26 個(gè)適配器的共同語(yǔ)言翻譯的產(chǎn)物就是ControlEvent v2一個(gè)字段非常小的 JSON 事件。它只有 7 種事件類(lèi)型定義在 src/control-protocol.cjssession.start/session.end—— 會(huì)話起止prompt.submit—— 用戶(hù)提交提示詞任務(wù)指令從這里進(jìn)入契約action.before/action.after—— 工具調(diào)用前后攔截只發(fā)生在 beforesubagent.start/subagent.stop—— 子代理生命周期一個(gè)action.before事件長(zhǎng)這樣節(jié)選自 HOST-ADAPTER-CONTRACT.md{ protocolVersion: 2, lifecycleVersion: 2, kind: action.before, sessionId: opaque, action: { name: Edit, mutability: write, affectedPaths: [src/config.cjs], hashIntent: false } }其中最關(guān)鍵的字段是mutability可變更性只有 5 個(gè)取值read、write、delegate派生子代理、control控制類(lèi)操作、unknown。適配器要做的工作就是把宿主五花八門(mén)的工具調(diào)用歸類(lèi)到這 5 個(gè)桶里。protocolVersion和lifecycleVersion兩個(gè)版本號(hào)則是一道門(mén)禁src/controller.cjs 里只有同時(shí)聲明了兩個(gè)版本的適配器其生命周期事實(shí)才允許修改賬本老適配器借用新協(xié)議號(hào)卻保留舊行為時(shí)會(huì)自動(dòng)降級(jí)到兼容路徑而不是把錯(cuò)誤狀態(tài)寫(xiě)進(jìn)會(huì)話。 同一個(gè)大腦handleControlEvent 如何消化所有事件所有適配器最終都調(diào)用同一個(gè)入口——src/controller.cjs 的handleControlEvent。它按事件類(lèi)型分派事件核心動(dòng)作prompt.submit解析任務(wù)指令如review -- 只審查不修改更新當(dāng)前契約action.before調(diào)用decide()做攔截判斷必要時(shí)原子地預(yù)留子代理配額action.after根據(jù)完成事實(shí)釋放或保留配額其余生命周期事件更新子代理賬本回注契約上下文真正的判斷邏輯在 src/decision.cjs它與宿主完全無(wú)關(guān)只做基于可觀察事實(shí)的硬決策非修改模式下發(fā)生了寫(xiě)操作寫(xiě)入超出files明確劃定的文件范圍未授權(quán)就添加依賴(lài)派生子代理超過(guò)agentsN上限高置信度的哈希/校驗(yàn)和行為但沒(méi)給hashallow。決策還分三個(gè)檔位src/controller.cjsOFF不檢查、不記錄OBSERVING觀察檢查并記錄但永不拒絕ARMED武裝顯式任務(wù)契約生效可以返回 permission deny。對(duì)應(yīng)四種 SHIT 家族IIntent 意圖越界、HHash 無(wú)用防御、SScope 范圍膨脹、TThrash 任務(wù)打轉(zhuǎn)——這正是 src/controller.cjs 里FAMILY_NAMES的由來(lái)。 6 個(gè)適配器各自薄成什么樣每個(gè)適配器就是事件映射表 工具分類(lèi)器 響應(yīng)渲染源碼統(tǒng)一放在 src/adapters/ 目錄適配器事件翻譯工具分類(lèi)Codexcodex-hooks.cjscodex-tool-classifier.cjsClaude Codeclaude-hooks.cjsclaude-tool-classifier.cjsOpenCodeopencode-hooks.cjsopencode-tool-classifier.cjsHermeshermes-hooks.cjshermes-tool-classifier.cjsPipi-hooks.cjspi-tool-classifier.cjsOh My Piomp-hooks.cjsomp-tool-classifier.cjs以 Codex 為例codex-hooks.cjs 里就是一張 5 行的映射表SessionStart → session.start、PreToolUse → action.before……然后構(gòu)造帶protocolVersion: 2, lifecycleVersion: 2的事件對(duì)象丟給handleControlEvent。Claude 和 Hermes 的適配器結(jié)構(gòu)幾乎一模一樣——換宿主 加一個(gè)映射表而不是重寫(xiě)一套規(guī)則。各宿主的包級(jí)入口也保持薄殼風(fēng)格opencode/stop-that-shit.mjs、pi/stop-that-shit.ts、omp/stop-that-shit.ts各自只負(fù)責(zé)把宿主回調(diào)接到共享控制器上。?? 邊界適配器是護(hù)欄不是沙箱架構(gòu)上有一條值得記住的邊界HOST-ADAPTER-CONTRACT.md宿主負(fù)責(zé)執(zhí)行、文件系統(tǒng)隔離和權(quán)限提示STS只負(fù)責(zé)用戶(hù)的任務(wù)約束文件范圍、哈希/依賴(lài)授權(quán)、子代理預(yù)算適配器負(fù)責(zé)工具身份和事件翻譯不靠名字前綴猜測(cè)工具身份。同時(shí)觀察到的Guard 響應(yīng)與宿主實(shí)際效果被刻意分開(kāi)審計(jì)記錄里hostEffect永遠(yuǎn)是unobserved因?yàn)?deny 響應(yīng)并不證明宿主一定阻止了執(zhí)行。所有檢查即使放行都會(huì)寫(xiě)入 src/runtime-audit.cjs 的元數(shù)據(jù)審計(jì)讓統(tǒng)計(jì)數(shù)字有個(gè)真實(shí)的分母。? 這套架構(gòu)給普通用戶(hù)帶來(lái)的好處行為一致在 Claude Code 里被攔的哈希在 Codex 里同樣會(huì)被攔因?yàn)榕袛嘀挥幸环菪略鏊拗鞒杀镜驼罩?HOST-ADAPTER-CONTRACT.md 的 4 項(xiàng)條件穩(wěn)定會(huì)話 ID、提示詞入口、可拒絕的 before 事件、足夠分類(lèi)的工具信息實(shí)現(xiàn)一個(gè)薄適配器即可可審計(jì)$stop-that-shit status/runtime命令隨時(shí)能查本會(huì)話的檢查次數(shù)和拒絕次數(shù)失敗安全狀態(tài)文件損壞時(shí)進(jìn)入只讀恢復(fù)而不是崩潰審計(jì)寫(xiě)失敗也不改變控制決策。 延伸閱讀架構(gòu)總覽ARCHITECTURE.md適配器契約與事件映射細(xì)節(jié)HOST-ADAPTER-CONTRACT.md契約解析與指令語(yǔ)法src/contracts.cjs子代理配額賬本src/delegation-state.cjs會(huì)話狀態(tài)存儲(chǔ)src/state.cjs規(guī)則本體Stop Ladderskills/stop-that-shit/SKILL.md18 個(gè) Bad/Good 判定用例cases/README_CN.md一句話總結(jié)6 個(gè)適配器負(fù)責(zé)聽(tīng)懂同一個(gè) ControlEvent v2 決策核心負(fù)責(zé)做對(duì)——這就是 Stop That Shit 能在多宿主間保持判斷一致的架構(gòu)秘密?!久赓M(fèi)下載鏈接】stop-that-shitStop That Shit別再造史了面向 Codex/GPT 場(chǎng)景的多平臺(tái) Hook Skill Guard攔截 AI coding agent 無(wú)需求的哈希、校驗(yàn)和與任務(wù)范圍膨脹。 A multi-platform Hook Skill Guard for AI coding agents in Codex/GPT workflows: stop unrequested hashes, checksums, and task-scope creep.項(xiàng)目地址: https://gitcode.com/gh_mirrors/st/stop-that-shit創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考