WIP: Add hook API for dynamic tool control with plan-mode hook example

- Add pi.getTools() and pi.setTools(toolNames) to HookAPI
- Hooks can now enable/disable tools dynamically
- Changes take effect on next agent turn

New example hook: plan-mode.ts
- Claude Code-style read-only exploration mode
- /plan command toggles plan mode on/off
- Plan mode tools: read, bash, grep, find, ls
- Edit/write tools disabled in plan mode
- Injects context telling agent about restrictions
- After each response, prompts to execute/stay/refine
- State persists across sessions
This commit is contained in:
Helmut Januschka 2026-01-03 09:31:39 +01:00 committed by Mario Zechner
parent 5b95ccf830
commit 059292ead1
14 changed files with 304 additions and 8 deletions

View file

@ -80,6 +80,8 @@ describe.skipIf(!API_KEY)("Compaction hooks", () => {
commands: new Map(),
setSendMessageHandler: () => {},
setAppendEntryHandler: () => {},
setGetToolsHandler: () => {},
setSetToolsHandler: () => {},
};
}
@ -104,6 +106,8 @@ describe.skipIf(!API_KEY)("Compaction hooks", () => {
getModel: () => session.model,
sendMessageHandler: async () => {},
appendEntryHandler: async () => {},
getToolsHandler: () => [],
setToolsHandler: () => {},
uiContext: {
select: async () => undefined,
confirm: async () => false,
@ -267,6 +271,8 @@ describe.skipIf(!API_KEY)("Compaction hooks", () => {
commands: new Map(),
setSendMessageHandler: () => {},
setAppendEntryHandler: () => {},
setGetToolsHandler: () => {},
setSetToolsHandler: () => {},
};
createSession([throwingHook]);
@ -314,6 +320,8 @@ describe.skipIf(!API_KEY)("Compaction hooks", () => {
commands: new Map(),
setSendMessageHandler: () => {},
setAppendEntryHandler: () => {},
setGetToolsHandler: () => {},
setSetToolsHandler: () => {},
};
const hook2: LoadedHook = {
@ -343,6 +351,8 @@ describe.skipIf(!API_KEY)("Compaction hooks", () => {
commands: new Map(),
setSendMessageHandler: () => {},
setAppendEntryHandler: () => {},
setGetToolsHandler: () => {},
setSetToolsHandler: () => {},
};
createSession([hook1, hook2]);