Extensions: add pi.sendUserMessage() for sending user messages

Adds sendUserMessage() to the extension API, allowing extensions to send
actual user messages (role: user) rather than custom messages. Unlike
sendMessage(), this always triggers a turn and behaves as if the user
typed the message.

- Add SendUserMessageHandler type and sendUserMessage() to ExtensionAPI
- Wire handler through loader, runner, and all modes
- Implement via prompt() with expandPromptTemplates: false
- Add send-user-message.ts example with /ask, /steer, /followup commands
- Document in extensions.md

fixes #483
This commit is contained in:
Mario Zechner 2026-01-06 13:40:24 +01:00
parent f023af0dab
commit 7210086677
13 changed files with 222 additions and 1 deletions

View file

@ -83,6 +83,7 @@ describe.skipIf(!API_KEY)("Compaction extensions", () => {
flagValues: new Map(),
shortcuts: new Map(),
setSendMessageHandler: () => {},
setSendUserMessageHandler: () => {},
setAppendEntryHandler: () => {},
setGetActiveToolsHandler: () => {},
setGetAllToolsHandler: () => {},
@ -111,6 +112,7 @@ describe.skipIf(!API_KEY)("Compaction extensions", () => {
extensionRunner.initialize({
getModel: () => session.model,
sendMessageHandler: async () => {},
sendUserMessageHandler: async () => {},
appendEntryHandler: async () => {},
getActiveToolsHandler: () => [],
getAllToolsHandler: () => [],
@ -284,6 +286,7 @@ describe.skipIf(!API_KEY)("Compaction extensions", () => {
flagValues: new Map(),
shortcuts: new Map(),
setSendMessageHandler: () => {},
setSendUserMessageHandler: () => {},
setAppendEntryHandler: () => {},
setGetActiveToolsHandler: () => {},
setGetAllToolsHandler: () => {},
@ -339,6 +342,7 @@ describe.skipIf(!API_KEY)("Compaction extensions", () => {
flagValues: new Map(),
shortcuts: new Map(),
setSendMessageHandler: () => {},
setSendUserMessageHandler: () => {},
setAppendEntryHandler: () => {},
setGetActiveToolsHandler: () => {},
setGetAllToolsHandler: () => {},
@ -376,6 +380,7 @@ describe.skipIf(!API_KEY)("Compaction extensions", () => {
flagValues: new Map(),
shortcuts: new Map(),
setSendMessageHandler: () => {},
setSendUserMessageHandler: () => {},
setAppendEntryHandler: () => {},
setGetActiveToolsHandler: () => {},
setGetAllToolsHandler: () => {},