11// @ts -nocheck
2+ /**
3+ * Bring-up: setup phase streaming + structured DB inserts (phase/agent rows).
4+ * Opt-in setup runtime under NODE_ENV=test; boundary agents mocked offline.
5+ */
26import assetPack from '../index' ;
37import { Execution } from '@bitcode/execution-generics' ;
48import { enablePipelineStreaming } from '@bitcode/pipelines-generics' ;
59
6- // Mock setup agents to ensure deterministic, fast dry-run
7- jest . mock ( '../agents/setup/asset-pack-clone-vcs-repository-agent' , ( ) => ( { __esModule : true , default : jest . fn ( ) . mockResolvedValue ( { success : true , repository : { owner : 'acme' , name : 'repo' , ref : 'main' } } ) } ) ) ;
8- jest . mock ( '../agents/setup/read-fits-finding-synthesis-read-comprehension-agent' , ( ) => ( { __esModule : true , default : jest . fn ( ) . mockResolvedValue ( { success : true } ) } ) ) ;
9- jest . mock ( '../agents/setup/asset-pack-danger-wall-agent' , ( ) => ( {
10+ // Mock setup agents to ensure deterministic, fast dry-run (read Setup roster).
11+ jest . mock ( '../agents/setup/asset-pack-clone-vcs-repository-agent' , ( ) => ( {
12+ __esModule : true ,
13+ default : jest . fn ( ) . mockResolvedValue ( {
14+ success : true ,
15+ repository : { owner : 'acme' , name : 'repo' , ref : 'main' } ,
16+ } ) ,
17+ } ) ) ;
18+ jest . mock ( '../agents/setup/asset-pack-initialize-lsp-agent' , ( ) => ( {
19+ __esModule : true ,
20+ default : jest . fn ( ) . mockResolvedValue ( { success : true , lsp : { available : false } } ) ,
21+ } ) ) ;
22+ jest . mock ( '../agents/setup/asset-pack-initialize-mcps-tools-agent' , ( ) => ( {
23+ __esModule : true ,
24+ default : jest . fn ( ) . mockResolvedValue ( { success : true , active : { } , initialized : [ ] } ) ,
25+ } ) ) ;
26+ jest . mock ( '../agents/setup/read-need-comprehension-agent' , ( ) => ( {
27+ __esModule : true ,
28+ default : jest . fn ( ) . mockResolvedValue ( { success : true , summary : 'test need' } ) ,
29+ } ) ) ;
30+ jest . mock ( '../agents/setup/read-danger-wall-agent' , ( ) => ( {
31+ __esModule : true ,
32+ default : jest . fn ( ) . mockResolvedValue ( {
33+ finalAssessment : {
34+ safe : true ,
35+ maxSeverity : 'low' ,
36+ confidence : 1 ,
37+ verdict : { reason : 'test-safe' , flags : [ ] } ,
38+ } ,
39+ } ) ,
40+ } ) ) ;
41+ jest . mock ( '../agents/setup/deposit-danger-wall-agent' , ( ) => ( {
1042 __esModule : true ,
1143 default : jest . fn ( ) . mockResolvedValue ( {
1244 finalAssessment : {
@@ -17,97 +49,134 @@ jest.mock('../agents/setup/asset-pack-danger-wall-agent', () => ({
1749 } ,
1850 } ) ,
1951} ) ) ;
52+ jest . mock ( '../agents/setup/read-fits-finding-synthesis-read-comprehension-agent' , ( ) => ( {
53+ __esModule : true ,
54+ default : jest . fn ( ) . mockResolvedValue ( { success : true } ) ,
55+ } ) ) ;
2056
2157describe ( 'AssetPack pipeline bring-up (setup + PTRR plan: prepare→reason)' , ( ) => {
22- it ( 'streams phase/agent events and persists structured rows' , async ( ) => {
23- process . env . BITCODE_DEBUG_ONLY_FAILSAFES = 'prepare' ;
24- process . env . BITCODE_DEBUG_ONLY_GENERATIONS = 'reason' ;
25- process . env . BITCODE_ENABLE_ASSET_PACK_SETUP_PHASE_RUNTIME_IN_TEST = '1' ;
58+ it (
59+ 'streams phase/agent events and persists structured rows' ,
60+ async ( ) => {
61+ process . env . BITCODE_DEBUG_ONLY_FAILSAFES = 'prepare' ;
62+ process . env . BITCODE_DEBUG_ONLY_GENERATIONS = 'reason' ;
63+ process . env . BITCODE_ENABLE_ASSET_PACK_SETUP_PHASE_RUNTIME_IN_TEST = '1' ;
2664
27- try {
28- const exec = new Execution ( 'asset-pack:test' ) ;
29- const inserts : any [ ] = [ ] ;
30- const selectedRows = ( table : string , filters : Array < [ string , any ] > ) => {
31- return inserts
32- . filter ( ( insert ) => insert . table === table )
33- . map ( ( insert ) => insert . row )
34- . filter ( ( row ) => filters . every ( ( [ column , value ] ) => row ?. [ column ] === value ) ) ;
35- } ;
36- const selectBuilder = ( table : string ) => {
37- const filters : Array < [ string , any ] > = [ ] ;
38- const builder : any = {
39- eq : ( column : string , value : any ) => {
40- filters . push ( [ column , value ] ) ;
41- return builder ;
42- } ,
43- order : ( ) => builder ,
44- limit : ( ) => builder ,
45- maybeSingle : async ( ) => ( { data : selectedRows ( table , filters ) . at ( - 1 ) || null } ) ,
46- then : ( resolve : any ) => Promise . resolve ( { data : selectedRows ( table , filters ) , error : null } ) . then ( resolve ) ,
65+ try {
66+ const exec = new Execution ( 'asset-pack:test' ) ;
67+ const inserts : any [ ] = [ ] ;
68+ const selectedRows = ( table : string , filters : Array < [ string , any ] > ) => {
69+ return inserts
70+ . filter ( ( insert ) => insert . table === table )
71+ . map ( ( insert ) => insert . row )
72+ . filter ( ( row ) => filters . every ( ( [ column , value ] ) => row ?. [ column ] === value ) ) ;
73+ } ;
74+ const selectBuilder = ( table : string ) => {
75+ const filters : Array < [ string , any ] > = [ ] ;
76+ const builder : any = {
77+ eq : ( column : string , value : any ) => {
78+ filters . push ( [ column , value ] ) ;
79+ return builder ;
80+ } ,
81+ order : ( ) => builder ,
82+ limit : ( ) => builder ,
83+ maybeSingle : async ( ) => ( { data : selectedRows ( table , filters ) . at ( - 1 ) || null } ) ,
84+ then : ( resolve : any ) =>
85+ Promise . resolve ( { data : selectedRows ( table , filters ) , error : null } ) . then ( resolve ) ,
86+ } ;
87+ return builder ;
4788 } ;
48- return builder ;
49- } ;
50- const updateBuilder = ( table : string , patch : any ) => {
51- const filters : Array < ( row : any ) => boolean > = [ ] ;
52- const apply = async ( ) => {
53- const rows = inserts . filter ( ( insert ) => insert . table === table ) . map ( ( insert ) => insert . row ) ;
54- for ( const row of rows ) {
55- if ( filters . every ( ( filter ) => filter ( row ) ) ) Object . assign ( row , patch ) ;
56- }
57- return { data : rows . filter ( ( row ) => filters . every ( ( filter ) => filter ( row ) ) ) , error : null } ;
89+ const updateBuilder = ( table : string , patch : any ) => {
90+ const filters : Array < ( row : any ) => boolean > = [ ] ;
91+ const apply = async ( ) => {
92+ const rows = inserts
93+ . filter ( ( insert ) => insert . table === table )
94+ . map ( ( insert ) => insert . row ) ;
95+ for ( const row of rows ) {
96+ if ( filters . every ( ( filter ) => filter ( row ) ) ) Object . assign ( row , patch ) ;
97+ }
98+ return {
99+ data : rows . filter ( ( row ) => filters . every ( ( filter ) => filter ( row ) ) ) ,
100+ error : null ,
101+ } ;
102+ } ;
103+ const builder : any = {
104+ eq : ( column : string , value : any ) => {
105+ filters . push ( ( row ) => row ?. [ column ] === value ) ;
106+ return builder ;
107+ } ,
108+ in : ( column : string , values : any [ ] ) => {
109+ filters . push ( ( row ) => values . includes ( row ?. [ column ] ) ) ;
110+ return builder ;
111+ } ,
112+ then : ( resolve : any ) => apply ( ) . then ( resolve ) ,
113+ } ;
114+ return builder ;
58115 } ;
59- const builder : any = {
60- eq : ( column : string , value : any ) => {
61- filters . push ( ( row ) => row ?. [ column ] === value ) ;
62- return builder ;
63- } ,
64- in : ( column : string , values : any [ ] ) => {
65- filters . push ( ( row ) => values . includes ( row ?. [ column ] ) ) ;
66- return builder ;
116+ const supabaseStub : any = {
117+ from ( table : string ) {
118+ return {
119+ insert : ( row : any ) => {
120+ inserts . push ( { table, row } ) ;
121+ return {
122+ select : ( _ ?: any ) => ( {
123+ single : ( ) =>
124+ Promise . resolve ( { data : { id : 'id-' + inserts . length } } ) ,
125+ } ) ,
126+ } as any ;
127+ } ,
128+ update : ( patch : any ) => updateBuilder ( table , patch ) ,
129+ select : ( ) => selectBuilder ( table ) ,
130+ } as any ;
67131 } ,
68- then : ( resolve : any ) => apply ( ) . then ( resolve ) ,
69132 } ;
70- return builder ;
71- } ;
72- const supabaseStub : any = {
73- from ( table : string ) {
74- return {
75- insert : ( row : any ) => {
76- inserts . push ( { table, row } ) ;
77- return { select : ( _ ?: any ) => ( { single : ( ) => Promise . resolve ( { data : { id : 'id-' + inserts . length } } ) } ) } as any ;
78- } ,
79- update : ( patch : any ) => updateBuilder ( table , patch ) ,
80- select : ( ) => selectBuilder ( table ) ,
81- } as any ;
82- }
83- } ;
84- enablePipelineStreaming ( exec as any , {
85- runId : '33333333-3333-4333-8333-333333333333' ,
86- userId : '44444444-4444-4444-8444-444444444444' ,
87- supabase : supabaseStub ,
88- streamToDatabase : true ,
89- structuredToDatabase : true ,
90- } ) ;
133+ const streamer = enablePipelineStreaming ( exec as any , {
134+ runId : '33333333-3333-4333-8333-333333333333' ,
135+ userId : '44444444-4444-4444-8444-444444444444' ,
136+ supabase : supabaseStub ,
137+ streamToDatabase : true ,
138+ structuredToDatabase : true ,
139+ } ) ;
140+
141+ const res = await assetPack (
142+ {
143+ definitionOfRead : 'Test' ,
144+ repository : { url : 'x' } ,
145+ deliveryTarget : 'pr' as const ,
146+ } ,
147+ exec ,
148+ ) ;
91149
92- const res = await assetPack ( {
93- definitionOfRead : 'Test' ,
94- repository : { url : 'x' } ,
95- deliveryTarget : 'pr' as const ,
96- } , exec ) ;
150+ // Drain async structured write queue before asserting inserts.
151+ await ( streamer as any ) . flushStructuredWrites ?.( ) ;
152+ await new Promise ( ( r ) => setImmediate ( r ) ) ;
97153
98- expect ( res ) . toBeDefined ( ) ;
154+ expect ( res ) . toBeDefined ( ) ;
99155
100- // Structured inserts occurred
101- const phaseRows = inserts . filter ( i => i . table === 'deliverable_pipeline_phase_delegations' ) ;
102- expect ( phaseRows . length ) . toBeGreaterThanOrEqual ( 1 ) ;
103- expect (
104- phaseRows . some ( ( row ) => row . row . phase_name === 'setup' || row . row . phase === 'setup' )
105- ) . toBe ( true ) ;
106- const agentRows = inserts . filter ( i => i . table === 'deliverable_pipeline_agent_steps' ) ;
107- expect ( agentRows . length ) . toBeGreaterThanOrEqual ( 1 ) ;
108- expect ( agentRows . some ( r => String ( r . row . agent_name || '' ) . startsWith ( 'setup:' ) ) ) . toBe ( true ) ;
109- } finally {
110- delete process . env . BITCODE_ENABLE_ASSET_PACK_SETUP_PHASE_RUNTIME_IN_TEST ;
111- }
112- } ) ;
156+ // Structured inserts occurred (runs + phases + agents).
157+ expect (
158+ inserts . some ( ( i ) => i . table === 'deliverable_pipeline_runs' ) ,
159+ ) . toBe ( true ) ;
160+ const phaseRows = inserts . filter (
161+ ( i ) => i . table === 'deliverable_pipeline_phase_delegations' ,
162+ ) ;
163+ expect ( phaseRows . length ) . toBeGreaterThanOrEqual ( 1 ) ;
164+ expect (
165+ phaseRows . some (
166+ ( row ) => row . row . phase_name === 'setup' || row . row . phase === 'setup' ,
167+ ) ,
168+ ) . toBe ( true ) ;
169+ const agentRows = inserts . filter (
170+ ( i ) => i . table === 'deliverable_pipeline_agent_steps' ,
171+ ) ;
172+ expect ( agentRows . length ) . toBeGreaterThanOrEqual ( 1 ) ;
173+ expect (
174+ agentRows . some ( ( r ) => String ( r . row . agent_name || '' ) . startsWith ( 'setup:' ) ) ,
175+ ) . toBe ( true ) ;
176+ } finally {
177+ delete process . env . BITCODE_ENABLE_ASSET_PACK_SETUP_PHASE_RUNTIME_IN_TEST ;
178+ }
179+ } ,
180+ 30000 ,
181+ ) ;
113182} ) ;
0 commit comments