import * as api from './api'; import * as chat from './chat'; export function escapeHtml( html: string ) { const entityMap = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''', '/': '/', '`': '`', '=': '=' }; return String( html ).replace( /[&<>"'`=\/]/g, ( s ) => { return entityMap[s]; } ); } export function parseJWT( token: string ) : any { const parts = token.split( '.' ); let encoded = parts[1]; encoded = encoded.replace(/-/g, '+').replace(/_/g, '/'); const pad = encoded.length % 4; if( pad === 1 ) throw new Error( 'what the fuck' ); if( pad > 1 ) encoded += new Array( 5 - pad ).join( '=' ); const payload = JSON.parse( atob( encoded ) ); return payload; } export function isToolStr( buf: string, model: api.Model ) { const trimmed = buf.replace( /\s+/g, '' ).toLowerCase(); const capabilities = model.capabilities; for( let tool in capabilities ) { let name = tool.toLowerCase(); let str = `{"name":"${name}"`; let not_matched = false; for( let i = 0; i < Math.min( trimmed.length, str.length ); i++ ) { if( trimmed[i] !== str[i] ) { not_matched = true; break; } } if( !not_matched ) return true; } return false; } export function getToolCall( msg: chat.Msg ) { let first_bracket = msg.content.indexOf( '{' ); let last_bracket = msg.content.lastIndexOf( '}' ); if( first_bracket == -1 || last_bracket == -1 ) return null; let call = msg.content.substring( first_bracket, last_bracket + 1 ); let json = null; try { json = JSON.parse( call ); } catch( e ) { return null; } return json; } export function sizeHumanReadable( size: number ) { if( size < 1024 ) return size + ' B'; else if( size < 1024 * 1024 ) return ( size / 1024 ).toFixed( 2 ) + ' KB'; else if( size < 1024 * 1024 * 1024 ) return ( size / 1024 / 1024 ).toFixed( 2 ) + ' MB'; else return ( size / 1024 / 1024 / 1024 ).toFixed( 2 ) + ' GB'; }