2026-03-29 04:02:13 +00:00
import { describe , test , expect , beforeEach , afterEach , mock } from "bun:test"
import type { PluginInput } from "@opencode-ai/plugin"
import { registerAgentName , _resetForTesting } from "../../features/claude-code-session-state"
import { injectBoulderContinuation } from "./boulder-continuation-injector"
describe ( "injectBoulderContinuation" , ( ) = > {
beforeEach ( ( ) = > {
// given
_resetForTesting ( )
} )
afterEach ( ( ) = > {
// then
_resetForTesting ( )
} )
test ( "normalizes config-key agent to display-name for promptAsync" , async ( ) = > {
// given
registerAgentName ( "atlas" )
const promptAsyncMock = mock ( async ( _request : unknown ) = > undefined )
const messagesMock = mock ( async ( ) = > ( { data : [ ] } ) )
const ctx = {
directory : "/tmp" ,
client : {
session : {
messages : messagesMock ,
promptAsync : promptAsyncMock ,
} ,
} ,
} as unknown as PluginInput
// when
2026-04-05 15:34:13 +09:00
const result = await injectBoulderContinuation ( {
2026-03-29 04:02:13 +00:00
ctx ,
sessionID : "ses_test_123" ,
planName : "test-plan" ,
remaining : 1 ,
total : 2 ,
agent : "atlas" ,
sessionState : { promptFailureCount : 0 } ,
} )
// then
2026-04-05 15:34:13 +09:00
expect ( result ) . toBe ( "injected" )
2026-03-29 04:02:13 +00:00
expect ( promptAsyncMock ) . toHaveBeenCalledTimes ( 1 )
expect ( promptAsyncMock ) . toHaveBeenCalledWith (
expect . objectContaining ( {
body : expect.objectContaining ( {
agent : "Atlas (Plan Executor)" ,
} ) ,
} ) ,
)
} )
2026-04-05 15:34:13 +09:00
test ( "#given background tasks are running #when injector checks again #then it reports skipped background tasks without mutating failure count" , async ( ) = > {
// given
registerAgentName ( "atlas" )
const promptAsyncMock = mock ( async ( _request : unknown ) = > undefined )
const messagesMock = mock ( async ( ) = > ( { data : [ ] } ) )
const sessionState = { promptFailureCount : 2 , lastContinuationInjectedAt : 123 }
const ctx = {
directory : "/tmp" ,
client : {
session : {
messages : messagesMock ,
promptAsync : promptAsyncMock ,
} ,
} ,
} as unknown as PluginInput
// when
const result = await injectBoulderContinuation ( {
ctx ,
sessionID : "ses_test_123" ,
planName : "test-plan" ,
remaining : 1 ,
total : 2 ,
agent : "atlas" ,
backgroundManager : {
getTasksByParentSession : ( ) = > [ { status : "running" } ] ,
} as unknown as Parameters < typeof injectBoulderContinuation > [ 0 ] [ "backgroundManager" ] ,
sessionState ,
} )
// then
expect ( result ) . toBe ( "skipped_background_tasks" )
expect ( promptAsyncMock ) . not . toHaveBeenCalled ( )
expect ( sessionState . promptFailureCount ) . toBe ( 2 )
expect ( sessionState . lastContinuationInjectedAt ) . toBe ( 123 )
} )
test ( "#given the continuation agent is unavailable #when injector runs #then it reports skipped agent unavailable without prompting" , async ( ) = > {
// given
const promptAsyncMock = mock ( async ( _request : unknown ) = > undefined )
const messagesMock = mock ( async ( ) = > ( { data : [ ] } ) )
const ctx = {
directory : "/tmp" ,
client : {
session : {
messages : messagesMock ,
promptAsync : promptAsyncMock ,
} ,
} ,
} as unknown as PluginInput
// when
const result = await injectBoulderContinuation ( {
ctx ,
sessionID : "ses_test_123" ,
planName : "test-plan" ,
remaining : 1 ,
total : 2 ,
agent : "missing-agent" ,
sessionState : { promptFailureCount : 0 } ,
} )
// then
expect ( result ) . toBe ( "skipped_agent_unavailable" )
expect ( promptAsyncMock ) . not . toHaveBeenCalled ( )
} )
2026-03-29 04:02:13 +00:00
} )