@@ -1700,6 +1700,76 @@ describe("runCliAgent reliability", () => {
17001700 }
17011701 } ) ;
17021702
1703+ it ( "forwards channel identity context to CLI before_agent_run hooks" , async ( ) => {
1704+ supervisorSpawnMock . mockClear ( ) ;
1705+ const hookRunner = {
1706+ hasHooks : vi . fn ( ( hookName : string ) => hookName === "before_agent_run" ) ,
1707+ runBeforeAgentRun : vi . fn ( async ( ) => ( {
1708+ pluginId : "policy-plugin" ,
1709+ decision : {
1710+ outcome : "block" as const ,
1711+ reason : "sender scoped policy" ,
1712+ message : "The agent cannot read this message." ,
1713+ } ,
1714+ } ) ) ,
1715+ } ;
1716+ setHookRunnerForTest ( hookRunner ) ;
1717+ const { dir, sessionFile } = createSessionFile ( ) ;
1718+
1719+ try {
1720+ const context = buildPreparedContext ( {
1721+ sessionKey : "agent:main:telegram:chat-1" ,
1722+ runId : "run-cli-channel-before-agent-run" ,
1723+ } ) ;
1724+ const result = await runPreparedCliAgent ( {
1725+ ...context ,
1726+ params : {
1727+ ...context . params ,
1728+ agentId : "main" ,
1729+ sessionFile,
1730+ workspaceDir : dir ,
1731+ prompt : "sender scoped prompt" ,
1732+ messageChannel : "telegram" ,
1733+ messageProvider : "telegram" ,
1734+ currentChannelId : "telegram:chat-1" ,
1735+ senderId : "user-42" ,
1736+ senderIsOwner : true ,
1737+ userTurnTranscriptRecorder : createCliUserTurnRecorder ( {
1738+ text : "sender scoped prompt" ,
1739+ sessionFile,
1740+ sessionKey : "agent:main:telegram:chat-1" ,
1741+ workspaceDir : dir ,
1742+ } ) ,
1743+ } ,
1744+ } ) ;
1745+
1746+ expect ( result . payloads ) . toEqual ( [
1747+ {
1748+ text : "Your message could not be sent: The agent cannot read this message. (blocked by policy-plugin)" ,
1749+ isError : true ,
1750+ } ,
1751+ ] ) ;
1752+ expect ( supervisorSpawnMock ) . not . toHaveBeenCalled ( ) ;
1753+ const beforeRunEvent = requireRecord (
1754+ callArg ( hookRunner . runBeforeAgentRun , 0 , 0 , "before_agent_run event" ) ,
1755+ "before_agent_run event" ,
1756+ ) ;
1757+ expect ( beforeRunEvent . channelId ) . toBe ( "chat-1" ) ;
1758+ expect ( beforeRunEvent . senderId ) . toBe ( "user-42" ) ;
1759+ expect ( beforeRunEvent . senderIsOwner ) . toBe ( true ) ;
1760+ const beforeRunContext = requireRecord (
1761+ callArg ( hookRunner . runBeforeAgentRun , 0 , 1 , "before_agent_run context" ) ,
1762+ "before_agent_run context" ,
1763+ ) ;
1764+ expect ( beforeRunContext . channel ) . toBe ( "telegram" ) ;
1765+ expect ( beforeRunContext . chatId ) . toBe ( "chat-1" ) ;
1766+ expect ( beforeRunContext . channelId ) . toBe ( "chat-1" ) ;
1767+ expect ( beforeRunContext . senderId ) . toBe ( "user-42" ) ;
1768+ } finally {
1769+ fs . rmSync ( dir , { recursive : true , force : true } ) ;
1770+ }
1771+ } ) ;
1772+
17031773 it ( "does not emit llm_output when the CLI run returns no assistant text" , async ( ) => {
17041774 const hookRunner = {
17051775 hasHooks : vi . fn ( ( hookName : string ) => hookName === "llm_output" ) ,
0 commit comments