SYMBOL INDEX (919 symbols across 153 files) FILE: api/index.ts constant JWT_SECRET (line 12) | const JWT_SECRET = 'chattyplay-jwt-secret-2024' constant PASSWORD_SECRET (line 13) | const PASSWORD_SECRET = 'chattyplay-secret-key-2024' constant TOKEN_EXPIRY (line 14) | const TOKEN_EXPIRY = 7 * 24 * 60 * 60 * 1000 // 7天 constant REDIS_REST_URL (line 17) | const REDIS_REST_URL = process.env.UPSTASH_REDIS_REST_URL constant REDIS_REST_TOKEN (line 18) | const REDIS_REST_TOKEN = process.env.UPSTASH_REDIS_REST_TOKEN constant USER_COUNTER_KEY (line 21) | const USER_COUNTER_KEY = 'user:id_counter' constant USER_HASH_PREFIX (line 23) | const USER_HASH_PREFIX = 'user:' constant USERNAME_INDEX_KEY (line 25) | const USERNAME_INDEX_KEY = 'user:username_index' type RedisResult (line 29) | interface RedisResult { function redisCommand (line 34) | async function redisCommand(command: string[]): Promise { function getNextUserId (line 61) | async function getNextUserId(): Promise { function getUserById (line 67) | async function getUserById(id: number): Promise { function getUserByUsername (line 80) | async function getUserByUsername(username: string): Promise { function getUserByEmail (line 87) | async function getUserByEmail(email: string): Promise { function createUser (line 101) | async function createUser(user: User): Promise { function updateUserField (line 117) | async function updateUserField(id: number, field: string, value: string)... type User (line 123) | interface User { type UserWithoutPassword (line 133) | interface UserWithoutPassword { function hashPassword (line 144) | function hashPassword(password: string): string { function verifyPassword (line 148) | function verifyPassword(password: string, hashedPassword: string): boole... function generateToken (line 155) | function generateToken(payload: { userId: number; username: string }): s... function verifyToken (line 174) | function verifyToken(token: string): { userId: number; username: string ... function base64UrlEncode (line 202) | function base64UrlEncode(str: string): string { function base64UrlDecode (line 209) | function base64UrlDecode(str: string): string { method start (line 548) | async start(controller) { method start (line 608) | async start(controller) { FILE: email.config.d.ts type EmailConfig (line 1) | interface EmailConfig { FILE: public/layui/lay/modules/jquery.js function n (line 2) | function n(e){var t=!!e&&"length"in e&&e.length,n=pe.type(e);return"func... function r (line 2) | function r(e,t,n){if(pe.isFunction(t))return pe.grep(e,function(e,r){ret... function i (line 2) | function i(e,t){do e=e[t];while(e&&1!==e.nodeType);return e} function o (line 2) | function o(e){var t={};return pe.each(e.match(De)||[],function(e,n){t[n]... function a (line 2) | function a(){re.addEventListener?(re.removeEventListener("DOMContentLoad... function s (line 2) | function s(){(re.addEventListener||"load"===e.event.type||"complete"===r... function u (line 2) | function u(e,t,n){if(void 0===n&&1===e.nodeType){var r="data-"+t.replace... function l (line 2) | function l(e){var t;for(t in e)if(("data"!==t||!pe.isEmptyObject(e[t]))&... function c (line 2) | function c(e,t,n,r){if(He(e)){var i,o,a=pe.expando,s=e.nodeType,u=s?pe.c... function f (line 2) | function f(e,t,n){if(He(e)){var r,i,o=e.nodeType,a=o?pe.cache:e,s=o?e[pe... function d (line 2) | function d(e,t,n,r){var i,o=1,a=20,s=r?function(){return r.cur()}:functi... function p (line 2) | function p(e){var t=ze.split("|"),n=e.createDocumentFragment();if(n.crea... function h (line 2) | function h(e,t){var n,r,i=0,o="undefined"!=typeof e.getElementsByTagName... function g (line 2) | function g(e,t){for(var n,r=0;null!=(n=e[r]);r++)pe._data(n,"globalEval"... function m (line 2) | function m(e){Be.test(e.type)&&(e.defaultChecked=e.checked)} function y (line 2) | function y(e,t,n,r,i){for(var o,a,s,u,l,c,f,d=e.length,y=p(t),v=[],x=0;x... function v (line 2) | function v(){return!0} function x (line 2) | function x(){return!1} function b (line 2) | function b(){try{return re.activeElement}catch(e){}} function w (line 2) | function w(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof ... function T (line 2) | function T(e,t){return pe.nodeName(e,"table")&&pe.nodeName(11!==t.nodeTy... function C (line 2) | function C(e){return e.type=(null!==pe.find.attr(e,"type"))+"/"+e.type,e} function E (line 2) | function E(e){var t=it.exec(e.type);return t?e.type=t[1]:e.removeAttribu... function N (line 2) | function N(e,t){if(1===t.nodeType&&pe.hasData(e)){var n,r,i,o=pe._data(e... function k (line 2) | function k(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase... function S (line 2) | function S(e,t,n,r){t=oe.apply([],t);var i,o,a,s,u,l,c=0,f=e.length,d=f-... function A (line 2) | function A(e,t,n){for(var r,i=t?pe.filter(t,e):e,o=0;null!=(r=i[o]);o++)... function D (line 2) | function D(e,t){var n=pe(t.createElement(e)).appendTo(t.body),r=pe.css(n... function j (line 2) | function j(e){var t=re,n=lt[e];return n||(n=D(e,t),"none"!==n&&n||(ut=(u... function L (line 2) | function L(e,t){return{get:function(){return e()?void delete this.get:(t... function H (line 2) | function H(e){if(e in Et)return e;for(var t=e.charAt(0).toUpperCase()+e.... function q (line 2) | function q(e,t){for(var n,r,i,o=[],a=0,s=e.length;aT.cacheLength&&delete ... function r (line 2) | function r(e){return e[P]=!0,e} function i (line 2) | function i(e){var t=H.createElement("div");try{return!!e(t)}catch(n){ret... function o (line 2) | function o(e,t){for(var n=e.split("|"),r=n.length;r--;)T.attrHandle[n[r]... function a (line 2) | function a(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sour... function s (line 2) | function s(e){return function(t){var n=t.nodeName.toLowerCase();return"i... function u (line 2) | function u(e){return function(t){var n=t.nodeName.toLowerCase();return("... function l (line 2) | function l(e){return r(function(t){return t=+t,r(function(n,r){for(var i... function c (line 2) | function c(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e} function f (line 2) | function f(){} function d (line 2) | function d(e){for(var t=0,n=e.length,r="";t1?function(t,n,r){for(var i=e.length;i--;)... function g (line 2) | function g(e,n,r){for(var i=0,o=n.length;i0,o=e.length>0,a=function(r,a,s,u,l){var ... function t (line 4) | function t(){var t,c,f=re.documentElement;f.appendChild(u),l.style.cssTe... function r (line 4) | function r(t,n,r,i){var o,f,v,x,w,C=n;2!==b&&(b=2,u&&e.clearTimeout(u),c... FILE: public/layui/lay/modules/layer.js function e (line 2) | function e(){var e=a.cancel&&a.cancel(t.index,n);e===!1||r.close(t.index)} function o (line 2) | function o(e,t,i){var n=new Image;return n.src=e,n.complete?t(n):(n.onlo... FILE: public/layui/lay/modules/mobile.js function t (line 2) | function t(t){return null==t?String(t):J[W.call(t)]||"object"} function e (line 2) | function e(e){return"function"==t(e)} function n (line 2) | function n(t){return null!=t&&t==t.window} function r (line 2) | function r(t){return null!=t&&t.nodeType==t.DOCUMENT_NODE} function i (line 2) | function i(e){return"object"==t(e)} function o (line 2) | function o(t){return i(t)&&!n(t)&&Object.getPrototypeOf(t)==Object.proto... function a (line 2) | function a(t){var e=!!t&&"length"in t&&t.length,r=T.type(t);return"funct... function s (line 2) | function s(t){return A.call(t,function(t){return null!=t})} function u (line 2) | function u(t){return t.length>0?T.fn.concat.apply([],t):t} function c (line 2) | function c(t){return t.replace(/::/g,"/").replace(/([A-Z]+)([A-Z][a-z])/... function l (line 2) | function l(t){return t in F?F[t]:F[t]=new RegExp("(^|\\s)"+t+"(\\s|$)")} function f (line 2) | function f(t,e){return"number"!=typeof e||k[c(t)]?e:e+"px"} function h (line 2) | function h(t){var e,n;return $[t]||(e=L.createElement(t),L.body.appendCh... function p (line 2) | function p(t){return"children"in t?D.call(t.children):T.map(t.childNodes... function d (line 2) | function d(t,e){var n,r=t?t.length:0;for(n=0;n1?y.use(e.slice(1),o,l):"function... function n (line 2) | function n(e){var t=!!e&&"length"in e&&e.length,n=pe.type(e);return"func... function r (line 2) | function r(e,t,n){if(pe.isFunction(t))return pe.grep(e,function(e,r){ret... function i (line 2) | function i(e,t){do e=e[t];while(e&&1!==e.nodeType);return e} function o (line 2) | function o(e){var t={};return pe.each(e.match(De)||[],function(e,n){t[n]... function a (line 2) | function a(){re.addEventListener?(re.removeEventListener("DOMContentLoad... function s (line 2) | function s(){(re.addEventListener||"load"===e.event.type||"complete"===r... function u (line 2) | function u(e,t,n){if(void 0===n&&1===e.nodeType){var r="data-"+t.replace... function l (line 2) | function l(e){var t;for(t in e)if(("data"!==t||!pe.isEmptyObject(e[t]))&... function c (line 2) | function c(e,t,n,r){if(He(e)){var i,o,a=pe.expando,s=e.nodeType,u=s?pe.c... function f (line 2) | function f(e,t,n){if(He(e)){var r,i,o=e.nodeType,a=o?pe.cache:e,s=o?e[pe... function d (line 2) | function d(e,t,n,r){var i,o=1,a=20,s=r?function(){return r.cur()}:functi... function p (line 2) | function p(e){var t=ze.split("|"),n=e.createDocumentFragment();if(n.crea... function h (line 2) | function h(e,t){var n,r,i=0,o="undefined"!=typeof e.getElementsByTagName... function g (line 2) | function g(e,t){for(var n,r=0;null!=(n=e[r]);r++)pe._data(n,"globalEval"... function m (line 2) | function m(e){Be.test(e.type)&&(e.defaultChecked=e.checked)} function y (line 2) | function y(e,t,n,r,i){for(var o,a,s,u,l,c,f,d=e.length,y=p(t),v=[],x=0;x... function v (line 2) | function v(){return!0} function x (line 2) | function x(){return!1} function b (line 2) | function b(){try{return re.activeElement}catch(e){}} function w (line 2) | function w(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof ... function T (line 2) | function T(e,t){return pe.nodeName(e,"table")&&pe.nodeName(11!==t.nodeTy... function C (line 2) | function C(e){return e.type=(null!==pe.find.attr(e,"type"))+"/"+e.type,e} function E (line 2) | function E(e){var t=it.exec(e.type);return t?e.type=t[1]:e.removeAttribu... function N (line 2) | function N(e,t){if(1===t.nodeType&&pe.hasData(e)){var n,r,i,o=pe._data(e... function k (line 2) | function k(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase... function S (line 2) | function S(e,t,n,r){t=oe.apply([],t);var i,o,a,s,u,l,c=0,f=e.length,d=f-... function A (line 2) | function A(e,t,n){for(var r,i=t?pe.filter(t,e):e,o=0;null!=(r=i[o]);o++)... function D (line 2) | function D(e,t){var n=pe(t.createElement(e)).appendTo(t.body),r=pe.css(n... function j (line 2) | function j(e){var t=re,n=lt[e];return n||(n=D(e,t),"none"!==n&&n||(ut=(u... function L (line 2) | function L(e,t){return{get:function(){return e()?void delete this.get:(t... function H (line 2) | function H(e){if(e in Et)return e;for(var t=e.charAt(0).toUpperCase()+e.... function q (line 2) | function q(e,t){for(var n,r,i,o=[],a=0,s=e.length;aT.cacheLength&&delete ... function r (line 2) | function r(e){return e[P]=!0,e} function i (line 2) | function i(e){var t=H.createElement("div");try{return!!e(t)}catch(n){ret... function o (line 2) | function o(e,t){for(var n=e.split("|"),r=n.length;r--;)T.attrHandle[n[r]... function a (line 2) | function a(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sour... function s (line 2) | function s(e){return function(t){var n=t.nodeName.toLowerCase();return"i... function u (line 2) | function u(e){return function(t){var n=t.nodeName.toLowerCase();return("... function l (line 2) | function l(e){return r(function(t){return t=+t,r(function(n,r){for(var i... function c (line 2) | function c(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e} function f (line 2) | function f(){} function d (line 2) | function d(e){for(var t=0,n=e.length,r="";t1?function(t,n,r){for(var i=e.length;i--;)... function g (line 2) | function g(e,n,r){for(var i=0,o=n.length;i0,o=e.length>0,a=function(r,a,s,u,l){var ... function t (line 4) | function t(){var t,c,f=re.documentElement;f.appendChild(u),l.style.cssTe... function r (line 4) | function r(t,n,r,i){var o,f,v,x,w,C=n;2!==b&&(b=2,u&&e.clearTimeout(u),c... function e (line 5) | function e(){var e=a.cancel&&a.cancel(t.index,n);e===!1||r.close(t.index)} function o (line 5) | function o(e,t,i){var n=new Image;return n.src=e,n.complete?t(n):(n.onlo... FILE: public/layui/layui.js function s (line 2) | function s(e,t){var o="PLaySTATION 3"===navigator.platform?/^complete$/:... function c (line 2) | function c(){l.push(layui[d]),e.length>1?y.use(e.slice(1),o,l):"function... FILE: public/three/MeshSurfaceSampler.js class MeshSurfaceSampler (line 18) | class MeshSurfaceSampler { method constructor (line 20) | constructor( mesh ) { method setWeightAttribute (line 46) | setWeightAttribute( name ) { method build (line 53) | build() { method setRandomGenerator (line 96) | setRandomGenerator( randomFunction ) { method sample (line 103) | sample( targetPosition, targetNormal, targetColor ) { method binarySearch (line 111) | binarySearch( x ) { method sampleFace (line 143) | sampleFace( faceIndex, targetPosition, targetNormal, targetColor ) { FILE: public/three/OBJLoader.js function ParserState (line 21) | function ParserState() { class OBJLoader (line 371) | class OBJLoader extends THREE.Loader { method constructor (line 373) | constructor( manager ) { method load (line 380) | load( url, onLoad, onProgress, onError ) { method setMaterials (line 413) | setMaterials( materials ) { method parse (line 420) | parse( text ) { FILE: public/three/TrackballControls.js class TrackballControls (line 13) | class TrackballControls extends THREE.EventDispatcher { method constructor (line 15) | constructor( object, domElement ) { FILE: public/three/simplex-noise.js function SimplexNoise (line 39) | function SimplexNoise(randomOrSeed) { function buildPermutationTable (line 393) | function buildPermutationTable(random) { function alea (line 414) | function alea() { function masher (line 447) | function masher() { FILE: python_backend/app/api/v1/interpreter.py function interpreter_chat (line 13) | def interpreter_chat(message: InterpreterMessage) -> ResponseModel: function interpreter_chat_stream (line 19) | def interpreter_chat_stream(message: InterpreterMessage) -> StreamingRes... function interpreter_history (line 28) | def interpreter_history() -> ResponseModel: function interpreter_reset (line 33) | def interpreter_reset() -> ResponseModel: FILE: python_backend/app/api/v1/ollama.py function ollama_chat (line 15) | async def ollama_chat(messages: OllamaMessages) -> ResponseModel: function ollama_chat_stream (line 23) | async def ollama_chat_stream(messages: OllamaMessages): function ollama_list (line 37) | async def ollama_list() -> ResponseModel: function ollama_pull (line 43) | async def ollama_pull(model: Annotated[str, Query()]) -> ResponseModel: function ollama_delete (line 49) | async def ollama_delete(model: Annotated[str, Query()]) -> ResponseModel: FILE: python_backend/app/common/log.py class Logger (line 9) | class Logger: method log (line 11) | def log() -> loguru.Logger: FILE: python_backend/app/common/open_interpreter.py class OpenInterpreter (line 5) | class OpenInterpreter(_OpenInterpreter): method __init__ (line 6) | def __init__(self): FILE: python_backend/app/common/response.py class ResponseModel (line 5) | class ResponseModel(BaseModel): FILE: python_backend/app/core/conf.py class Settings (line 7) | class Settings(BaseSettings): function get_settings (line 38) | def get_settings(): FILE: python_backend/app/main.py function openai_auth_exception_handler (line 24) | async def openai_auth_exception_handler(request: Request, exc: Exception): FILE: python_backend/app/schemas/interpreter.py class InterpreterMessage (line 5) | class InterpreterMessage(BaseModel): FILE: python_backend/app/schemas/ollama.py class OllamaMessages (line 7) | class OllamaMessages(BaseModel): FILE: python_backend/main.py function str_to_jsonstr (line 9) | def str_to_jsonstr(data: str): function main (line 21) | def main(): FILE: python_backend/tools/config_tool.py function read_single_conf_lru_cache (line 9) | def read_single_conf_lru_cache(arg): function get_conf (line 21) | def get_conf(*args): function get_free_port (line 31) | def get_free_port(): FILE: python_backend/tools/generate_video.py function image_to_video_mp4 (line 14) | def image_to_video_mp4(file_path=path_img, output=video_name, height=512... function image_resize (line 44) | def image_resize(image_path, height, width): function image_crop (line 50) | def image_crop(image_path, height, width, step): function pillow_to_cv (line 61) | def pillow_to_cv(image_pil): function cv_to_pillow (line 65) | def cv_to_pillow(image_cv): function image_to_video_avi (line 69) | def image_to_video_avi(file_path=path_img, output=path_video_avi, height... function illumination_image (line 85) | def illumination_image(img): function flow_image (line 126) | def flow_image(img): function filter_image (line 149) | def filter_image(img): function nostalgia_image (line 177) | def nostalgia_image(img): function sketch_image (line 203) | def sketch_image(img): FILE: python_backend/tools/image_effect.py function add_fade_effect (line 5) | def add_fade_effect(image_path, duration=1): FILE: python_backend/tools/read_file.py function read (line 2) | def read(file_path): FILE: python_backend/tools/stable_api.py function txt2img (line 14) | def txt2img(prompt='puppy dog',image_name='test.png'): function txt2img_imgname (line 35) | def txt2img_imgname(prompt='puppy dog', negative_prompt='', sampler='DPM... function check_and_create_path (line 57) | def check_and_create_path(path): FILE: src/components/ClickEffect.tsx constant WORDS (line 5) | const WORDS = [ type WordInstance (line 38) | interface WordInstance { FILE: src/components/HeartBeat.tsx type HeartBeatProps (line 20) | interface HeartBeatProps { class SparkPoint (line 79) | class SparkPoint { method constructor (line 86) | constructor() { method update (line 97) | update(beatValue: number) { function init (line 185) | function init() { function render (line 197) | function render(a: number) { FILE: src/components/Live2DDashboard.tsx type Live2DDashboardProps (line 46) | interface Live2DDashboardProps { FILE: src/components/VerifyCode.tsx type VerifyCodeProps (line 4) | interface VerifyCodeProps { FILE: src/components/VersionUpdateModal.tsx type VersionUpdateModalProps (line 13) | interface VersionUpdateModalProps { FILE: src/components/latex/FileTree.tsx type FileNode (line 21) | interface FileNode { type FileTreeProps (line 126) | interface FileTreeProps { type TreeTitleProps (line 132) | interface TreeTitleProps { FILE: src/components/latex/LatexEditor.tsx type LatexEditorProps (line 6) | interface LatexEditorProps { FILE: src/components/latex/PdfPreview.tsx type PdfPreviewProps (line 19) | interface PdfPreviewProps { FILE: src/components/markmap/EditNodeModal.tsx type EditNodeModalProps (line 7) | interface EditNodeModalProps { FILE: src/components/markmap/EditorPanel.tsx type EditorPanelProps (line 8) | interface EditorPanelProps { FILE: src/components/markmap/InfoModal.tsx type InfoModalProps (line 5) | interface InfoModalProps { FILE: src/components/markmap/LandscapeMode.tsx type LandscapeModeProps (line 6) | interface LandscapeModeProps { FILE: src/components/markmap/MindmapPanel.tsx type MindmapPanelProps (line 14) | interface MindmapPanelProps { FILE: src/components/markmap/MobileMenu.tsx type MobileMenuProps (line 7) | interface MobileMenuProps { FILE: src/components/markmap/MobileTabBar.tsx type MobileTabBarProps (line 5) | interface MobileTabBarProps { FILE: src/components/markmap/PromptModal.tsx type PromptModalProps (line 7) | interface PromptModalProps { FILE: src/components/video/VideoDownload.tsx type VideoFormat (line 10) | interface VideoFormat { type VideoInfo (line 21) | interface VideoInfo { type DownloadProgress (line 33) | interface DownloadProgress { FILE: src/components/video/VideoParse.tsx type ScreenOrientation (line 12) | interface ScreenOrientation { FILE: src/goofish/ai-tools/chat-history.tool.ts type ChatHistoryContext (line 8) | interface ChatHistoryContext { type ChatHistoryMessage (line 13) | interface ChatHistoryMessage { function getChatHistory (line 23) | function getChatHistory(ctx: ChatHistoryContext, limit = 10): ChatHistor... FILE: src/goofish/ai-tools/index.ts constant AI_TOOLS (line 22) | const AI_TOOLS = [orderQueryToolDefinition] FILE: src/goofish/ai-tools/order-query.tool.ts type OrderQueryContext (line 9) | interface OrderQueryContext { type OrderQueryResult (line 14) | interface OrderQueryResult { function queryBuyerOrders (line 32) | function queryBuyerOrders(ctx: OrderQueryContext): OrderQueryResult { FILE: src/goofish/api/middlewares/security.middleware.ts constant WHITELIST_PATHS (line 14) | const WHITELIST_PATHS: string[] = []; function createSecurityMiddleware (line 20) | function createSecurityMiddleware() { FILE: src/goofish/api/routes/accounts.ts function createAccountRoutes (line 20) | function createAccountRoutes( FILE: src/goofish/api/routes/autoreply.ts function getDefaultPrompt (line 21) | function getDefaultPrompt(): string { function createAutoReplyRoutes (line 30) | function createAutoReplyRoutes() { FILE: src/goofish/api/routes/autosell.ts function createAutoSellRoutes (line 21) | function createAutoSellRoutes() { FILE: src/goofish/api/routes/conversations.ts function createConversationRoutes (line 7) | function createConversationRoutes() { FILE: src/goofish/api/routes/dev-messages.route.ts constant RAW_LOG_DIR (line 18) | const RAW_LOG_DIR = join(process.cwd(), "logs", "raw"); constant RAW_RETENTION_DAYS (line 19) | const RAW_RETENTION_DAYS = 3; type RawMessage (line 22) | interface RawMessage { constant MAX_BUFFER_SIZE (line 31) | const MAX_BUFFER_SIZE = 500; function decodeMessageData (line 34) | function decodeMessageData(msgData: any): any[] | null { function saveRawToFile (line 78) | function saveRawToFile(accountId: string, data: any, decoded: any[] | nu... function addRawMessage (line 107) | function addRawMessage(accountId: string, data: any) { function clearMessageBuffer (line 128) | function clearMessageBuffer() { function cleanOldRawMessages (line 133) | function cleanOldRawMessages() { function createDevMessageRoutes (line 169) | function createDevMessageRoutes() { FILE: src/goofish/api/routes/goods.ts function createGoodsRoutes (line 7) | function createGoodsRoutes( FILE: src/goofish/api/routes/logs.ts function createLogsRoutes (line 7) | function createLogsRoutes() { FILE: src/goofish/api/routes/messages.ts function createMessageRoutes (line 5) | function createMessageRoutes( FILE: src/goofish/api/routes/order.route.ts function createOrderRoutes (line 16) | function createOrderRoutes( FILE: src/goofish/api/routes/status.ts function createStatusRoutes (line 6) | function createStatusRoutes( FILE: src/goofish/api/routes/workflow.route.ts function createWorkflowRoutes (line 15) | function createWorkflowRoutes() { FILE: src/goofish/api/routes/ws-push.route.ts function broadcast (line 26) | function broadcast( function initWSEvents (line 46) | function initWSEvents(getClientManager: () => ClientManager | null) { function createWSPushHandler (line 89) | function createWSPushHandler( function sendInitialData (line 174) | function sendInitialData( function getWSClientCount (line 222) | function getWSClientCount() { FILE: src/goofish/api/server.ts function setClientManager (line 31) | function setClientManager(cm: ClientManager) { function getClientManager (line 35) | function getClientManager() { function createApp (line 47) | function createApp() { function startServer (line 129) | function startServer(port = SERVER_CONFIG.PORT) { FILE: src/goofish/api/stores/conversation.store.ts class ConversationStore (line 16) | class ConversationStore { method addIncoming (line 17) | addIncoming(accountId: string, msg: ChatMessage) { method addOutgoing (line 21) | addOutgoing( method updateUserAvatar (line 30) | updateUserAvatar(accountId: string, chatId: string, avatar: string) { method getAll (line 34) | getAll( method get (line 41) | get( method markRead (line 50) | markRead(accountId: string, chatId: string) { FILE: src/goofish/api/stores/message.store.ts class MessageStore (line 15) | class MessageStore { method add (line 16) | add(msg: ChatMessage) { method getRecent (line 20) | getRecent(limit = 20): StoredMessage[] { method getAll (line 24) | getAll(): StoredMessage[] { method count (line 28) | count(): number { method clear (line 32) | clear() { FILE: src/goofish/core/constants.ts constant WS_CONFIG (line 2) | const WS_CONFIG = { constant API_CONFIG (line 15) | const API_CONFIG = { constant API_METHODS (line 21) | const API_METHODS = { constant PASSPORT_CONFIG (line 34) | const PASSPORT_CONFIG = { function buildApiUrl (line 39) | function buildApiUrl( constant API_ENDPOINTS (line 47) | const API_ENDPOINTS = { constant WS_HEADERS (line 59) | const WS_HEADERS = { constant LOG_CONFIG (line 71) | const LOG_CONFIG = { constant ENV (line 77) | const ENV = { constant SERVER_CONFIG (line 82) | const SERVER_CONFIG = { constant DB_CONFIG (line 88) | const DB_CONFIG = { FILE: src/goofish/core/cookies.manager.ts class CookiesManager (line 20) | class CookiesManager { method getCookies (line 24) | static getCookies(accountId: string): string | null { method getCookiesObject (line 32) | static getCookiesObject(accountId: string): Record { method getCookie (line 40) | static getCookie(accountId: string, name: string): string | undefined { method updateCookies (line 51) | static updateCookies( method handleResponseCookies (line 96) | static handleResponseCookies(accountId: string, response: Response): b... method getH5Token (line 114) | static getH5Token(accountId: string): string { method getUserId (line 122) | static getUserId(accountId: string): string | undefined { FILE: src/goofish/core/event-emitter.ts constant DEBOUNCE_DELAY (line 29) | const DEBOUNCE_DELAY = 100; function emitOrdersUpdated (line 32) | function emitOrdersUpdated() { function emitAccountsUpdated (line 43) | function emitAccountsUpdated() { function emitConversationsUpdated (line 54) | function emitConversationsUpdated() { FILE: src/goofish/core/logger.ts type LogLevel (line 6) | type LogLevel = "DEBUG" | "INFO" | "WARN" | "ERROR"; function setLogLevel (line 18) | function setLogLevel(level: LogLevel) { function formatTime (line 22) | function formatTime(): string { function getDateStr (line 33) | function getDateStr(): string { function getTimestampStr (line 41) | function getTimestampStr(): string { function initLogFile (line 53) | function initLogFile(): string { function flushLogs (line 71) | function flushLogs() { function log (line 83) | function log(level: LogLevel, module: string, message: string) { function cleanOldLogs (line 101) | function cleanOldLogs(retentionDays = 7) { type Logger (line 131) | interface Logger { function createLogger (line 138) | function createLogger(module: string): Logger { FILE: src/goofish/db/account.repository.ts function getEnabledAccounts (line 19) | function getEnabledAccounts(): Account[] { function getAllAccounts (line 29) | function getAllAccounts(): Account[] { function getAccount (line 39) | function getAccount(id: string): Account | null { function upsertAccount (line 49) | function upsertAccount(account: UpsertAccountParams): boolean { function updateAccountUserInfo (line 84) | function updateAccountUserInfo( function updateAccountCookies (line 105) | function updateAccountCookies(id: string, cookies: string): boolean { function updateAccountEnabled (line 122) | function updateAccountEnabled(id: string, enabled: boolean): boolean { function deleteAccount (line 138) | function deleteAccount(id: string): boolean { function updateAccountStatus (line 152) | function updateAccountStatus( function getAccountStatus (line 198) | function getAccountStatus(accountId: string): AccountStatus | null { FILE: src/goofish/db/autoreply.repository.ts function getAutoReplyRules (line 13) | function getAutoReplyRules(): DbAutoReplyRule[] { function getEnabledAutoReplyRules (line 21) | function getEnabledAutoReplyRules( function getAutoReplyRule (line 41) | function getAutoReplyRule(id: number): DbAutoReplyRule | undefined { function createAutoReplyRule (line 47) | function createAutoReplyRule(rule: CreateAutoReplyRuleParams): number { function updateAutoReplyRule (line 66) | function updateAutoReplyRule( function deleteAutoReplyRule (line 99) | function deleteAutoReplyRule(id: number): boolean { function toggleAutoReplyRule (line 106) | function toggleAutoReplyRule(id: number): boolean { FILE: src/goofish/db/autosell.repository.ts function toRule (line 20) | function toRule(row: any): AutoSellRule { function getAutoSellRules (line 38) | function getAutoSellRules(): AutoSellRule[] { function getEnabledAutoSellRules (line 45) | function getEnabledAutoSellRules( function getAutoSellRule (line 68) | function getAutoSellRule(id: number): AutoSellRule | undefined { function createAutoSellRule (line 75) | function createAutoSellRule(rule: CreateAutoSellRuleParams): number { function updateAutoSellRule (line 95) | function updateAutoSellRule( function deleteAutoSellRule (line 139) | function deleteAutoSellRule(id: number): boolean { function toggleAutoSellRule (line 146) | function toggleAutoSellRule(id: number): boolean { function toStockItem (line 157) | function toStockItem(row: DbStockItem): StockItem { function getStockItems (line 170) | function getStockItems( function getStockStats (line 183) | function getStockStats(ruleId: number): { function addStockItems (line 203) | function addStockItems(ruleId: number, contents: string[]): number { function consumeStock (line 217) | function consumeStock( function clearStock (line 236) | function clearStock(ruleId: number, onlyUsed = false): number { function toDeliveryLog (line 248) | function toDeliveryLog(row: DbDeliveryLog): DeliveryLog { function addDeliveryLog (line 263) | function addDeliveryLog(log: { function getDeliveryLogs (line 289) | function getDeliveryLogs(params: { function hasDelivered (line 331) | function hasDelivered(orderId: string): boolean { FILE: src/goofish/db/connection.ts function closeDatabase (line 26) | function closeDatabase() { function getDbPath (line 31) | function getDbPath(): string { FILE: src/goofish/db/conversation.repository.ts function getConversations (line 15) | function getConversations(limit = 20, offset = 0): DbConversation[] { function getConversationCount (line 24) | function getConversationCount(): number { function getConversation (line 30) | function getConversation( function upsertConversation (line 41) | function upsertConversation( function updateConversationAvatar (line 85) | function updateConversationAvatar( function markConversationRead (line 97) | function markConversationRead(accountId: string, chatId: string) { function getConversationMessages (line 106) | function getConversationMessages( function getConversationMessageCount (line 133) | function getConversationMessageCount( function getAllMessagesCount (line 144) | function getAllMessagesCount(): number { function addConversationMessage (line 152) | function addConversationMessage( FILE: src/goofish/db/index.ts function initDatabase (line 12) | function initDatabase() { FILE: src/goofish/db/migrations.ts function safeAddColumn (line 11) | function safeAddColumn(table: string, column: string, type: string) { function createAccountTables (line 20) | function createAccountTables() { function createMessageTables (line 51) | function createMessageTables() { function createConversationTables (line 68) | function createConversationTables() { function createAutoReplyTables (line 117) | function createAutoReplyTables() { function createUserAvatarTables (line 152) | function createUserAvatarTables() { function createOrderTables (line 167) | function createOrderTables() { function createSettingsTables (line 205) | function createSettingsTables() { function createChattyplayUserTables (line 216) | function createChattyplayUserTables() { function createAutoSellTables (line 238) | function createAutoSellTables() { function createWorkflowTables (line 293) | function createWorkflowTables() { function runMigrations (line 356) | function runMigrations() { FILE: src/goofish/db/order.repository.ts function getOrders (line 11) | function getOrders(params: OrderListParams = {}): OrderRecord[] { function getOrderCount (line 35) | function getOrderCount(params: OrderListParams = {}): number { function getOrderById (line 56) | function getOrderById(orderId: string): OrderRecord | null { function upsertOrder (line 65) | function upsertOrder( function updateOrderStatus (line 117) | function updateOrderStatus( function deleteOrder (line 141) | function deleteOrder(orderId: string): boolean { function mapRowToOrder (line 152) | function mapRowToOrder(row: any): OrderRecord { FILE: src/goofish/db/settings.repository.ts type DbSetting (line 7) | interface DbSetting { function getSetting (line 14) | function getSetting(key: string): string | null { function setSetting (line 21) | function setSetting(key: string, value: string): void { function deleteSetting (line 30) | function deleteSetting(key: string): boolean { function getSettings (line 37) | function getSettings(keys: string[]): Record { constant AI_SETTINGS_KEYS (line 46) | const AI_SETTINGS_KEYS = { function getAISettings (line 54) | function getAISettings() { function saveAISettings (line 64) | function saveAISettings(settings: { FILE: src/goofish/db/user-avatar.repository.ts function getUserAvatar (line 9) | function getUserAvatar(userId: string): DbUserAvatar | undefined { function saveUserAvatar (line 15) | function saveUserAvatar(data: SaveUserAvatarParams): boolean { function hasUserAvatar (line 41) | function hasUserAvatar(userId: string): boolean { FILE: src/goofish/db/user.repository.ts type ChattyplayUser (line 10) | interface ChattyplayUser { type UserWithoutPassword (line 21) | interface UserWithoutPassword { class UserRepository (line 31) | class UserRepository { method findByUsername (line 35) | findByUsername(username: string): ChattyplayUser | undefined { method findByEmail (line 49) | findByEmail(email: string): ChattyplayUser | undefined { method findById (line 63) | findById(id: number): UserWithoutPassword | undefined { method create (line 77) | create(user: Omit)... method updateLastLogin (line 96) | updateLastLogin(userId: number): void { method updateAvatar (line 114) | updateAvatar(userId: number, avatar: string): void { method updateEmail (line 132) | updateEmail(userId: number, email: string): void { FILE: src/goofish/db/workflow.repository.ts function getWorkflows (line 14) | function getWorkflows(): Workflow[] { function getWorkflowById (line 33) | function getWorkflowById(id: number): Workflow | null { function getDefaultWorkflow (line 53) | function getDefaultWorkflow(): Workflow | null { function createWorkflow (line 73) | function createWorkflow(data: { function updateWorkflow (line 98) | function updateWorkflow( function deleteWorkflow (line 138) | function deleteWorkflow(id: number): boolean { function createWorkflowExecution (line 150) | function createWorkflowExecution(data: { function getWorkflowExecution (line 175) | function getWorkflowExecution(id: number): WorkflowExecution | null { function getWorkflowExecutionByOrderId (line 188) | function getWorkflowExecutionByOrderId( function getWaitingExecutions (line 205) | function getWaitingExecutions(accountId: string): WorkflowExecution[] { function updateWorkflowExecution (line 218) | function updateWorkflowExecution( function mapExecutionRow (line 253) | function mapExecutionRow(row: any): WorkflowExecution { FILE: src/goofish/index.ts function startGoofishServer (line 27) | async function startGoofishServer(port: number = 3001) { function fetchUserAvatarAsync (line 85) | async function fetchUserAvatarAsync( function fetchOrderDetailAsync (line 102) | async function fetchOrderDetailAsync(accountId: string, orderId: string) { FILE: src/goofish/services/ai.service.ts function getClient (line 22) | function getClient(): OpenAI | null { type AIContext (line 44) | interface AIContext { function executeToolCall (line 55) | function executeToolCall(toolName: string, _args: any, ctx: AIContext): ... function generateAIReply (line 81) | async function generateAIReply( function testAIConnection (line 230) | async function testAIConnection(): Promise<{ FILE: src/goofish/services/auth.service.ts type RegisterData (line 12) | interface RegisterData { type LoginData (line 18) | interface LoginData { type AuthResponse (line 23) | interface AuthResponse { function register (line 33) | async function register(data: RegisterData): Promise { function login (line 128) | async function login(data: LoginData): Promise { function authenticateToken (line 187) | function authenticateToken(token: string): TokenPayload | null { function getUserByToken (line 194) | function getUserByToken(token: string): UserWithoutPassword | null { FILE: src/goofish/services/autoreply.service.ts function checkAutoReply (line 19) | async function checkAutoReply( function matchAITrigger (line 113) | function matchAITrigger(rule: DbAutoReplyRule, content: string): boolean { function matchRule (line 137) | function matchRule(rule: DbAutoReplyRule, content: string): boolean { function getMatchTypeName (line 162) | function getMatchTypeName(type: string): string { FILE: src/goofish/services/autosell.service.ts function fetchFromApi (line 20) | async function fetchFromApi( function executeDelivery (line 72) | async function executeDelivery( function processAutoSell (line 112) | async function processAutoSell( function getRuleStockStatus (line 169) | function getRuleStockStatus(ruleId: number) { FILE: src/goofish/services/conversation.service.ts function addIncomingMessage (line 27) | function addIncomingMessage(accountId: string, msg: ChatMessage) { function addOutgoingMessage (line 60) | function addOutgoingMessage( function updateUserAvatar (line 102) | function updateUserAvatar( function getAllConversations (line 113) | function getAllConversations( function getConversationDetail (line 142) | function getConversationDetail( function markAsRead (line 188) | function markAsRead(accountId: string, chatId: string) { FILE: src/goofish/services/goods.service.ts function fetchGoodsList (line 16) | async function fetchGoodsList( FILE: src/goofish/services/message.service.ts constant MAX_MESSAGES (line 8) | const MAX_MESSAGES = 100; function addMessage (line 16) | function addMessage(msg: ChatMessage) { function getRecentMessages (line 28) | function getRecentMessages(limit = 20): StoredMessage[] { function getAllMessages (line 35) | function getAllMessages(): StoredMessage[] { function getMessageCount (line 42) | function getMessageCount(): number { function clearMessages (line 49) | function clearMessages() { FILE: src/goofish/services/order.service.ts function getOrderList (line 27) | function getOrderList(params: OrderListParams) { function getOrder (line 39) | function getOrder(orderId: string): OrderRecord | null { function handleOrderMessage (line 44) | function handleOrderMessage( function fetchAndUpdateOrderDetail (line 73) | async function fetchAndUpdateOrderDetail( function triggerAutoSell (line 176) | async function triggerAutoSell( FILE: src/goofish/services/user.service.ts function getCachedUserHead (line 17) | function getCachedUserHead(userId: string): UserHeadInfo | null { function isUserHeadCached (line 34) | function isUserHeadCached(userId: string): boolean { function fetchUserHead (line 41) | async function fetchUserHead( function fetchLoginUserId (line 137) | async function fetchLoginUserId( function fetchUserProfile (line 205) | async function fetchUserProfile( function fetchUserInfo (line 278) | async function fetchUserInfo( FILE: src/goofish/services/workflow.service.ts type ExecutionContext (line 29) | interface ExecutionContext { function startWorkflowExecution (line 42) | async function startWorkflowExecution( function executeFromNode (line 103) | async function executeFromNode( function executeNode (line 154) | async function executeNode( function executeDeliveryNode (line 204) | async function executeDeliveryNode( function executeShipNode (line 246) | async function executeShipNode( function executeAutoReplyNode (line 288) | async function executeAutoReplyNode( function executeDelayNode (line 332) | async function executeDelayNode( function executeConditionNode (line 361) | async function executeConditionNode( function executeNotifyNode (line 373) | async function executeNotifyNode( function findNextNode (line 405) | function findNextNode( function executeDefaultFlow (line 420) | async function executeDefaultFlow( function handleUserReply (line 462) | async function handleUserReply( FILE: src/goofish/types/account.types.ts type Account (line 8) | interface Account extends Timestamped { type AccountStatus (line 19) | interface AccountStatus { type AccountUserInfo (line 28) | interface AccountUserInfo { type UpsertAccountParams (line 38) | interface UpsertAccountParams { type UpdateAccountStatusParams (line 49) | interface UpdateAccountStatusParams { FILE: src/goofish/types/autoreply.types.ts type MatchType (line 6) | type MatchType = "exact" | "contains" | "regex" | "ai"; type AutoReplyRule (line 9) | interface AutoReplyRule { type DbAutoReplyRule (line 24) | interface DbAutoReplyRule { type CreateAutoReplyRuleParams (line 39) | interface CreateAutoReplyRuleParams { type UpdateAutoReplyRuleParams (line 51) | interface UpdateAutoReplyRuleParams { type AutoReplyResult (line 63) | interface AutoReplyResult { FILE: src/goofish/types/autosell.types.ts type DeliveryType (line 6) | type DeliveryType = "fixed" | "stock" | "api"; type TriggerOn (line 9) | type TriggerOn = "paid" | "confirmed"; type ApiConfig (line 12) | interface ApiConfig { type AutoSellRule (line 21) | interface AutoSellRule { type DbAutoSellRule (line 39) | interface DbAutoSellRule { type StockItem (line 54) | interface StockItem { type DbStockItem (line 65) | interface DbStockItem { type DeliveryLog (line 76) | interface DeliveryLog { type DbDeliveryLog (line 89) | interface DbDeliveryLog { type CreateAutoSellRuleParams (line 102) | interface CreateAutoSellRuleParams { type UpdateAutoSellRuleParams (line 115) | interface UpdateAutoSellRuleParams { type DeliveryResult (line 128) | interface DeliveryResult { FILE: src/goofish/types/common.types.ts type PaginationParams (line 6) | interface PaginationParams { type PaginatedResult (line 12) | interface PaginatedResult { type ApiResponse (line 20) | interface ApiResponse { type Timestamped (line 28) | interface Timestamped { FILE: src/goofish/types/conversation.types.ts type Conversation (line 8) | interface Conversation { type DbConversation (line 23) | interface DbConversation { type DbConversationMessage (line 35) | interface DbConversationMessage { type UpsertConversationParams (line 49) | interface UpsertConversationParams { type AddConversationMessageParams (line 61) | interface AddConversationMessageParams { FILE: src/goofish/types/goods.types.ts type GoodsItem (line 6) | interface GoodsItem { type GoodsListResult (line 23) | interface GoodsListResult { FILE: src/goofish/types/message.types.ts type ChatMessage (line 6) | interface ChatMessage { type StoredMessage (line 21) | interface StoredMessage extends ChatMessage { type MessageDirection (line 26) | type MessageDirection = "in" | "out"; type ConversationMessage (line 29) | interface ConversationMessage { type MessageCallback (line 41) | type MessageCallback = ( FILE: src/goofish/types/order.types.ts type OrderStatus (line 6) | enum OrderStatus { constant ORDER_STATUS_TEXT (line 15) | const ORDER_STATUS_TEXT: Record = { type OrderRecord (line 25) | interface OrderRecord { type OrderDetailData (line 47) | interface OrderDetailData { type OrderComponent (line 66) | interface OrderComponent { type OrderButton (line 71) | interface OrderButton { type OrderListParams (line 79) | interface OrderListParams { type OrderListResponse (line 87) | interface OrderListResponse { FILE: src/goofish/types/user.types.ts type UserHeadInfo (line 6) | interface UserHeadInfo { type DbUserAvatar (line 15) | interface DbUserAvatar { type SaveUserAvatarParams (line 26) | interface SaveUserAvatarParams { FILE: src/goofish/types/workflow.types.ts type WorkflowNodeType (line 6) | type WorkflowNodeType = type WorkflowNode (line 16) | interface WorkflowNode { type WorkflowConnection (line 54) | interface WorkflowConnection { type WorkflowDefinition (line 62) | interface WorkflowDefinition { type Workflow (line 68) | interface Workflow { type WorkflowExecutionStatus (line 80) | type WorkflowExecutionStatus = type WorkflowExecution (line 88) | interface WorkflowExecution { constant DEFAULT_WORKFLOW (line 106) | const DEFAULT_WORKFLOW: WorkflowDefinition = { FILE: src/goofish/utils/cookies.ts function parseCookies (line 2) | function parseCookies(cookiesStr: string): Record { function stringifyCookies (line 16) | function stringifyCookies(cookies: Record): string { function mergeCookies (line 23) | function mergeCookies( function parseSetCookieHeaders (line 37) | function parseSetCookieHeaders( FILE: src/goofish/utils/crypto.ts function generateMid (line 3) | function generateMid(): string { function generateUuid (line 9) | function generateUuid(): string { function generateDeviceId (line 22) | function generateDeviceId(userId: string): string { function generateSign (line 41) | function generateSign(t: string, token: string, data: string): string { FILE: src/goofish/utils/date.ts function nowLocalString (line 6) | function nowLocalString(): string { FILE: src/goofish/utils/jwt.util.ts constant JWT_SECRET (line 8) | const JWT_SECRET = 'chattyplay-jwt-secret-2024' constant TOKEN_EXPIRY (line 9) | const TOKEN_EXPIRY = 7 * 24 * 60 * 60 * 1000 // 7天 type TokenPayload (line 11) | interface TokenPayload { function generateToken (line 20) | function generateToken(payload: Omit): string { function verifyToken (line 42) | function verifyToken(token: string): TokenPayload | null { function base64UrlEncode (line 76) | function base64UrlEncode(str: string): string { function base64UrlDecode (line 86) | function base64UrlDecode(str: string): string { FILE: src/goofish/utils/msgpack.ts class MessagePackDecoder (line 2) | class MessagePackDecoder { method constructor (line 6) | constructor(data: Buffer) { method readByte (line 10) | private readByte(): number { method readBytes (line 14) | private readBytes(count: number): Buffer { method readUint32 (line 20) | private readUint32(): number { method readString (line 26) | private readString(length: number): string { method decodeValue (line 30) | decodeValue(): any { method decodeArray (line 83) | private decodeArray(size: number): any[] { method decodeMap (line 87) | private decodeMap(size: number): Record { method decode (line 96) | decode(): any { function decryptMessagePack (line 101) | function decryptMessagePack(data: string): any { FILE: src/goofish/utils/password.util.ts constant SECRET_KEY (line 8) | const SECRET_KEY = 'chattyplay-secret-key-2024' function hashPassword (line 15) | function hashPassword(password: string): string { function verifyPassword (line 25) | function verifyPassword(password: string, hashedPassword: string): boole... FILE: src/goofish/websocket/client.manager.ts class ClientManager (line 8) | class ClientManager { method constructor (line 12) | constructor(onMessage?: MessageCallback) { method startAll (line 17) | async startAll(): Promise { method startClient (line 27) | async startClient(accountId: string): Promise { method stopClient (line 62) | stopClient(accountId: string): boolean { method restartClient (line 76) | async restartClient(accountId: string): Promise { method stopAll (line 83) | stopAll(): void { method getClient (line 93) | getClient(accountId: string): GoofishClient | undefined { method getStatus (line 98) | getStatus(): Array<{ method getActiveCount (line 120) | getActiveCount(): number { FILE: src/goofish/websocket/client.ts class GoofishClient (line 15) | class GoofishClient { method constructor (line 27) | constructor(accountId: string, onMessage?: MessageCallback) { method accountId (line 42) | get accountId(): string { method getAccountId (line 46) | getAccountId(): string { method isConnected (line 50) | isConnected(): boolean { method getUserId (line 54) | getUserId(): string { method sendMessage (line 58) | async sendMessage( method fetchOrderDetail (line 75) | async fetchOrderDetail(orderId: string): Promise { method confirmShipment (line 150) | async confirmShipment( method freeShipping (line 221) | async freeShipping( method startHeartbeat (line 294) | private startHeartbeat() { method startTokenRefresh (line 308) | private startTokenRefresh() { method initConnection (line 329) | private async initConnection() { method sendAck (line 382) | private sendAck(headers: any) { method connect (line 391) | async connect(): Promise { method cleanup (line 471) | private cleanup() { method disconnect (line 482) | disconnect() { method run (line 493) | async run() { FILE: src/goofish/websocket/message.parser.ts constant SYSTEM_MESSAGES (line 8) | const SYSTEM_MESSAGES = [ constant ORDER_STATUS_MESSAGES (line 19) | const ORDER_STATUS_MESSAGES = [ function isSystemMessage (line 34) | function isSystemMessage(content: string): boolean { function isOrderStatusMessage (line 38) | function isOrderStatusMessage(content: string): boolean { function decryptSyncData (line 42) | function decryptSyncData(data: string): any | null { function extractChatMessage (line 75) | function extractChatMessage( FILE: src/goofish/websocket/message.receiver.ts type MessageReceiverContext (line 14) | interface MessageReceiverContext { function handleSyncMessage (line 29) | async function handleSyncMessage( function processWebSocketMessage (line 134) | async function processWebSocketMessage( FILE: src/goofish/websocket/message.sender.ts type SendMessageOptions (line 8) | interface SendMessageOptions { function sendMessage (line 20) | async function sendMessage( FILE: src/goofish/websocket/token.ts constant SESSION_EXPIRED_ERRORS (line 9) | const SESSION_EXPIRED_ERRORS = ["FAIL_SYS_SESSION_EXPIRED", "SESSION_EXP... class TokenManager (line 11) | class TokenManager { method constructor (line 17) | constructor(accountId: string, deviceId: string) { method getToken (line 22) | getToken(): string | null { method isExpired (line 26) | isExpired(): boolean { method hasLogin (line 35) | private async hasLogin(retryCount = 0): Promise { method isSessionExpiredError (line 115) | private isSessionExpiredError(error: string): boolean { method doTokenRequest (line 120) | private async doTokenRequest(): Promise<{ method refresh (line 190) | async refresh(): Promise { FILE: src/hooks/goofish/useWebSocket.ts type UseWebSocketOptions (line 4) | interface UseWebSocketOptions { function useGoofishWebSocket (line 10) | function useGoofishWebSocket(options: UseWebSocketOptions = {}) { FILE: src/main.tsx type Window (line 33) | interface Window { type ErrorBoundaryState (line 41) | interface ErrorBoundaryState { type ErrorBoundaryProps (line 45) | interface ErrorBoundaryProps { class ErrorBoundary (line 49) | class ErrorBoundary extends Component = { FILE: src/pages/goofish/Orders/index.tsx type OrderStatus (line 34) | enum OrderStatus { constant STATUS_CONFIG (line 43) | const STATUS_CONFIG: Record = { FILE: src/pages/goofish/Workflow/index.tsx constant NODE_TYPES (line 30) | const NODE_TYPES = [ FILE: src/sdk/analytics/examples.tsx function BasicExample (line 11) | function BasicExample() { function PageTrackingExample (line 84) | function PageTrackingExample() { function ClickTrackingExample (line 102) | function ClickTrackingExample() { function VisibilityTrackingExample (line 138) | function VisibilityTrackingExample() { function ScrollTrackingExample (line 177) | function ScrollTrackingExample() { function ComprehensiveExample (line 200) | function ComprehensiveExample() { function AnalyticsIntegrationExample (line 370) | function AnalyticsIntegrationExample() { FILE: src/sdk/analytics/hooks.ts function useAnalytics (line 11) | function useAnalytics() { function usePageTracking (line 58) | function usePageTracking(enabled: boolean = true) { function useEventTracking (line 70) | function useEventTracking(eventName: string, properties?: Record, even... function useVisibilityTracking (line 102) | function useVisibilityTracking(elementRef: React.RefObject,... function useFormTracking (line 136) | function useFormTracking(formName: string, onSuccess?: (data: any) => vo... function useScrollTracking (line 163) | function useScrollTracking(threshold: number = 50, eventName: string = '... function useDurationTracking (line 192) | function useDurationTracking(pageName: string, reportInterval: number = ... FILE: src/sdk/analytics/index.ts type AnalyticsConfig (line 7) | interface AnalyticsConfig { type EventData (line 29) | interface EventData { type DeviceInfo (line 49) | interface DeviceInfo { type ReportData (line 59) | interface ReportData extends EventData { class AnalyticsSDK (line 65) | class AnalyticsSDK { method constructor (line 72) | constructor(config: AnalyticsConfig) { method init (line 90) | init(): void { method track (line 117) | track(event: string, properties: Record = {}): void { method trackPageView (line 144) | trackPageView(): void { method trackAction (line 155) | trackAction(action: string, target: string, properties: Record = {}): ... method trackSubmit (line 176) | trackSubmit(formName: string, properties: Record = {}): v... method trackError (line 186) | trackError(error: Error | string, context: Record = {}): ... method setUserId (line 200) | setUserId(userId: string): void { method setUserProperties (line 208) | setUserProperties(properties: Record): void { method generateSessionId (line 215) | private generateSessionId(): string { method getDeviceInfo (line 222) | private getDeviceInfo(): DeviceInfo { method generateFingerprint (line 239) | private generateFingerprint(): string { method addToBatch (line 263) | private addToBatch(eventData: EventData): void { method startBatchTimer (line 276) | private startBatchTimer(): void { method flushBatch (line 289) | private flushBatch(): void { method sendEvent (line 306) | private sendEvent(eventData: EventData): void { method sendBatch (line 320) | private sendBatch(events: EventData[]): void { method sendViaGIF (line 334) | private sendViaGIF(data: any, isBatch = false): void { method btoa (line 362) | private btoa(str: string): string { method trackPageChanges (line 374) | private trackPageChanges(): void { method setupErrorTracking (line 403) | private setupErrorTracking(): void { method setupUnloadTracking (line 435) | private setupUnloadTracking(): void { method log (line 455) | private log(...args: any[]): void { method warn (line 464) | private warn(...args: any[]): void { method destroy (line 473) | destroy(): void { function initAnalytics (line 495) | function initAnalytics(config: AnalyticsConfig): AnalyticsSDK { function getAnalytics (line 503) | function getAnalytics(): AnalyticsSDK | null { FILE: src/sdk/analytics/types.d.ts type Window (line 8) | interface Window { FILE: src/sdk/fingerprint/collector.ts class FingerprintCollector (line 8) | class FingerprintCollector { method collectBrowserInfo (line 12) | static collectBrowserInfo(): BrowserInfo { method collectScreenInfo (line 29) | static collectScreenInfo(): ScreenInfo { method collectCanvasInfo (line 46) | static collectCanvasInfo(): CanvasInfo { method getWebGLFingerprint (line 104) | private static getWebGLFingerprint(gl: WebGLRenderingContext): string { method collectAudioInfo (line 134) | static collectAudioInfo(): AudioInfo { method collectTimeZoneInfo (line 181) | static collectTimeZoneInfo(): TimeZoneInfo { method collectFeatureInfo (line 192) | static collectFeatureInfo(): FeatureInfo { method testLocalStorage (line 216) | private static testLocalStorage(): boolean { method testSessionStorage (line 230) | private static testSessionStorage(): boolean { method testIndexedDB (line 244) | private static testIndexedDB(): boolean { method collectAll (line 255) | static collectAll(options: { FILE: src/sdk/fingerprint/examples.tsx function BasicFingerprintExample (line 19) | function BasicFingerprintExample() { function VisitStatsExample (line 45) | function VisitStatsExample() { function FullFingerprintExample (line 65) | function FullFingerprintExample() { function FingerprintCompareExample (line 205) | function FingerprintCompareExample() { function AdvancedFingerprintExample (line 249) | function AdvancedFingerprintExample() { function SimpleVisitorIdExample (line 313) | function SimpleVisitorIdExample() { function FingerprintDashboard (line 328) | function FingerprintDashboard() { FILE: src/sdk/fingerprint/hash.ts class FingerprintHasher (line 8) | class FingerprintHasher { method generateHash (line 12) | static async generateHash( method normalizeData (line 40) | private static normalizeData(data: any): string { method sha256 (line 61) | private static async sha256(data: string): Promise { method sha384 (line 71) | private static async sha384(data: string): Promise { method sha512 (line 81) | private static async sha512(data: string): Promise { method md5 (line 91) | private static md5(data: string): string { method simpleHash (line 257) | private static simpleHash(data: string): string { method generateVisitorId (line 273) | static generateVisitorId(): string { method calculateConfidence (line 284) | static calculateConfidence(data: FingerprintData): number { FILE: src/sdk/fingerprint/hooks.ts type UseFingerprintOptions (line 10) | interface UseFingerprintOptions extends FingerprintOptions { type UseFingerprintReturn (line 28) | interface UseFingerprintReturn { function useFingerprint (line 114) | function useFingerprint(options: UseFingerprintOptions = {}): UseFingerp... function useVisitorId (line 253) | function useVisitorId(): string | null { function useFingerprintCompare (line 293) | function useFingerprintCompare() { function useVisitStats (line 332) | function useVisitStats() { FILE: src/sdk/fingerprint/index.ts class FingerprintSDK (line 24) | class FingerprintSDK { method constructor (line 29) | constructor(options: FingerprintOptions = {}) { method getFingerprint (line 48) | async getFingerprint(): Promise { method generateFingerprint (line 81) | async generateFingerprint(): Promise { method validateFingerprint (line 117) | async validateFingerprint(expectedHash: string): Promise { method getVisitorId (line 136) | getVisitorId(): string | null { method getHash (line 143) | getHash(): string | null { method getVisitStats (line 150) | getVisitStats(): { firstSeen: number; lastSeen: number; visitCount: nu... method clearFingerprint (line 157) | clearFingerprint(): boolean { method exportFingerprint (line 165) | exportFingerprint(): string { method importFingerprint (line 172) | importFingerprint(exportedData: string): boolean { method getCurrentFingerprint (line 179) | getCurrentFingerprint(): FingerprintResult | null { method regenerateFingerprint (line 186) | async regenerateFingerprint(): Promise { method isFirstVisit (line 194) | isFirstVisit(): boolean { method getFingerprintDetails (line 202) | getFingerprintDetails(): Partial | null { method compareFingerprints (line 220) | compareFingerprints(otherHash: string): number { function getFingerprint (line 259) | async function getFingerprint(): Promise { function getVisitorId (line 263) | function getVisitorId(): string | null { function getHash (line 267) | function getHash(): string | null { function clearFingerprint (line 271) | function clearFingerprint(): boolean { FILE: src/sdk/fingerprint/storage.ts class FingerprintStorage (line 8) | class FingerprintStorage { method constructor (line 11) | constructor(storageKey: string = 'fingerprint_data') { method save (line 18) | save(data: StorageData): boolean { method load (line 32) | load(): StorageData | null { method updateVisit (line 48) | updateVisit(): StorageData | null { method clear (line 62) | clear(): boolean { method exists (line 75) | exists(): boolean { method getVisitorId (line 82) | getVisitorId(): string | null { method getHash (line 90) | getHash(): string | null { method getVisitStats (line 98) | getVisitStats(): { firstSeen: number; lastSeen: number; visitCount: nu... method setSessionData (line 112) | setSessionData(key: string, value: string): boolean { method getSessionData (line 125) | getSessionData(key: string): string | null { method clearSessionData (line 137) | clearSessionData(key?: string): boolean { method export (line 157) | export(): string { method import (line 167) | import(exportedData: string): boolean { FILE: src/sdk/fingerprint/types.ts type BrowserInfo (line 5) | interface BrowserInfo { type ScreenInfo (line 17) | interface ScreenInfo { type CanvasInfo (line 28) | interface CanvasInfo { type AudioInfo (line 35) | interface AudioInfo { type TimeZoneInfo (line 39) | interface TimeZoneInfo { type FeatureInfo (line 45) | interface FeatureInfo { type FingerprintData (line 55) | interface FingerprintData { type FingerprintOptions (line 65) | interface FingerprintOptions { type FingerprintResult (line 76) | interface FingerprintResult { type StorageData (line 83) | interface StorageData { FILE: src/services/goofish/index.ts constant API_BASE (line 8) | const API_BASE = '/api' FILE: src/services/latexApi.ts type CompileOptions (line 6) | interface CompileOptions { type CompileResult (line 16) | interface CompileResult { function compileLatex (line 29) | async function compileLatex({ code, compiler = 'xelatex', timeout = 6000... function checkApiHealth (line 99) | async function checkApiHealth(): Promise { FILE: src/services/server.ts function initGoofish (line 37) | async function initGoofish() { function fetchUserAvatarAsync (line 76) | async function fetchUserAvatarAsync(accountId: string, chatId: string, u... function fetchOrderDetailAsync (line 88) | async function fetchOrderDetailAsync(accountId: string, orderId: string) { function getLocalIP (line 102) | function getLocalIP(): string { method start (line 616) | async start(controller) { method start (line 693) | async start(controller) { constant PROXY_CONFIG (line 732) | const PROXY_CONFIG: Record