Hook API: replace send() with sendMessage(), add appendEntry() and registerCommand()

Breaking changes to Hook API:
- pi.send(text, attachments?) replaced with pi.sendMessage(message, triggerTurn?)
  - Creates CustomMessageEntry instead of user messages
  - Properly handles queuing during streaming via agent loop
  - Supports optional turn triggering when idle
- New pi.appendEntry(customType, data?) for hook state persistence
- New pi.registerCommand(name, options) for custom slash commands
- Handler types renamed: SendHandler -> SendMessageHandler, new AppendEntryHandler

Implementation:
- AgentSession.sendHookMessage() handles all three cases:
  - Streaming: queues message with _hookData marker, agent loop processes it
  - Not streaming + triggerTurn: appends to state/session, calls agent.continue()
  - Not streaming + no trigger: appends to state/session only
- message_end handler routes based on _hookData presence to correct persistence
- HookRunner gains getRegisteredCommands() and getCommand() methods

New types: HookMessage<T>, RegisteredCommand, CommandContext
This commit is contained in:
Mario Zechner 2025-12-27 00:52:10 +01:00
parent d43a5e47a1
commit ba185b0571
13 changed files with 412 additions and 77 deletions

View file

@ -64,7 +64,9 @@ describe.skipIf(!API_KEY)("Compaction hooks", () => {
resolvedPath: "/test/test-hook.ts",
handlers,
customMessageRenderers: new Map(),
setSendHandler: () => {},
commands: new Map(),
setSendMessageHandler: () => {},
setAppendEntryHandler: () => {},
};
}
@ -240,7 +242,9 @@ describe.skipIf(!API_KEY)("Compaction hooks", () => {
],
]),
customMessageRenderers: new Map(),
setSendHandler: () => {},
commands: new Map(),
setSendMessageHandler: () => {},
setAppendEntryHandler: () => {},
};
createSession([throwingHook]);
@ -284,7 +288,9 @@ describe.skipIf(!API_KEY)("Compaction hooks", () => {
],
]),
customMessageRenderers: new Map(),
setSendHandler: () => {},
commands: new Map(),
setSendMessageHandler: () => {},
setAppendEntryHandler: () => {},
};
const hook2: LoadedHook = {
@ -307,7 +313,9 @@ describe.skipIf(!API_KEY)("Compaction hooks", () => {
],
]),
customMessageRenderers: new Map(),
setSendHandler: () => {},
commands: new Map(),
setSendMessageHandler: () => {},
setAppendEntryHandler: () => {},
};
createSession([hook1, hook2]);