SuperAI_Forecast / .codegraph /workflow_tree.html
Thang6822
feat: cancel in-flight forecast tasks immediately when switching symbol/interval and fix DXY sources config
4d10530
Raw
History Blame Contribute Delete
139 kB
<!DOCTYPE html>
<html lang="en" data-theme="dark">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Workflow Tree β€” AI Forecast</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<script src="https://cdn.jsdelivr.net/npm/mermaid@10.2.4/dist/mermaid.min.js"></script>
<script>mermaid.initialize({startOnLoad:true,theme:'dark',securityLevel:'loose',flowchart:{useMaxWidth:true,htmlLabels:true,curve:'cardinal'}});</script>
<style>
:root{--bg:#0b0f19;--bg2:#0f1322;--card:rgba(22,30,49,0.7);--card2:rgba(30,40,60,0.5);--border:rgba(255,255,255,0.08);--border2:rgba(255,255,255,0.12);--pri:#6366f1;--pri2:#818cf8;--green:#10b981;--green2:#34d399;--amber:#f59e0b;--amber2:#fbbf24;--red:#ef4444;--pink:#d946ef;--cyan:#06b6d4;--text:#f3f4f6;--text2:#d1d5db;--muted:#9ca3af;--shadow:0 10px 30px rgba(0,0,0,0.3);--radius:20px;--search-bg:rgba(0,0,0,0.4);--input-bg:rgba(255,255,255,0.05)}
[data-theme="light"]{--bg:#f8fafc;--bg2:#e2e8f0;--card:rgba(255,255,255,0.85);--card2:rgba(241,245,249,0.9);--border:rgba(0,0,0,0.08);--border2:rgba(0,0,0,0.12);--text:#1e293b;--text2:#334155;--muted:#64748b;--shadow:0 4px 20px rgba(0,0,0,0.08);--search-bg:rgba(255,255,255,0.6);--input-bg:rgba(0,0,0,0.03)}
*{box-sizing:border-box;margin:0;padding:0}
body{background:var(--bg);background-image:radial-gradient(at 0% 0%,rgba(99,102,241,0.15) 0px,transparent 50%),radial-gradient(at 100% 100%,rgba(16,185,129,0.1) 0px,transparent 50%);color:var(--text);min-height:100vh;font-family:'Outfit',sans-serif;transition:background 0.3s,color 0.3s}
.topbar{position:sticky;top:0;z-index:100;background:var(--card);backdrop-filter:blur(20px);border-bottom:1px solid var(--border);padding:0.6rem 1.5rem;display:flex;align-items:center;gap:0.8rem;flex-wrap:wrap}
.topbar .logo{font-size:1.1rem;font-weight:800;background:linear-gradient(135deg,#a5b4fc,#6366f1,#34d399);-webkit-background-clip:text;-webkit-text-fill-color:transparent;white-space:nowrap}
.topbar .search-wrap{flex:1;min-width:200px;position:relative}
.topbar .search-wrap input{width:100%;padding:0.5rem 0.8rem 0.5rem 2.2rem;border-radius:10px;border:1px solid var(--border);background:var(--search-bg);color:var(--text);font-family:'Outfit',sans-serif;font-size:0.85rem;transition:all 0.2s}
.topbar .search-wrap input:focus{outline:none;border-color:var(--pri);box-shadow:0 0 0 3px rgba(99,102,241,0.15)}
.topbar .search-wrap i{position:absolute;left:0.7rem;top:50%;transform:translateY(-50%);color:var(--muted);font-size:0.8rem}
.topbar .search-clear{position:absolute;right:0.5rem;top:50%;transform:translateY(-50%);background:none;border:none;color:var(--muted);cursor:pointer;font-size:0.8rem;display:none;padding:0.2rem 0.4rem;border-radius:4px}
.topbar .search-clear:hover{color:var(--text);background:rgba(255,255,255,0.1)}
.topbar .search-clear.visible{display:block}
.topbar .tb-btn{display:inline-flex;align-items:center;gap:0.35rem;padding:0.4rem 0.7rem;border-radius:8px;border:1px solid var(--border);background:rgba(255,255,255,0.03);color:var(--muted);cursor:pointer;font-family:'Outfit',sans-serif;font-size:0.78rem;white-space:nowrap;transition:all 0.15s}
.topbar .tb-btn:hover{background:rgba(99,102,241,0.12);border-color:var(--pri);color:#fff}
.topbar .tb-btn.active{background:rgba(99,102,241,0.2);border-color:var(--pri);color:var(--pri2)}
.topbar .tb-sep{width:1px;height:20px;background:var(--border);margin:0 0.2rem}
header{text-align:center;padding:1.5rem 1.5rem 0.8rem;max-width:1000px;margin:0 auto}
h1{font-size:2rem;font-weight:800;background:linear-gradient(135deg,#a5b4fc 0%,#6366f1 50%,#34d399 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;margin-bottom:0.3rem}
.subtitle{color:var(--muted);font-size:0.9rem}
.legend-row{display:flex;gap:1.5rem;flex-wrap:wrap;justify-content:center;margin-top:0.6rem;font-size:0.78rem;color:var(--muted)}
.legend-row span{display:flex;align-items:center;gap:0.35rem}
.leg-dot{width:10px;height:10px;border-radius:3px}
.leg-tab{background:var(--pri)}.leg-dec{background:var(--pink)}.leg-err{background:var(--red)}.leg-ok{background:var(--green)}.leg-fold{background:var(--amber)}.leg-ai{background:var(--cyan)}
.main-layout{display:grid;grid-template-columns:1fr;gap:1.2rem;padding:0.8rem 1.5rem 2rem;max-width:1600px;margin:0 auto}
@media(min-width:1200px){.main-layout{grid-template-columns:1.4fr 1fr}}
.panel{background:var(--card);backdrop-filter:blur(16px);border:1px solid var(--border);border-radius:var(--radius);padding:1.2rem;box-shadow:var(--shadow);display:flex;flex-direction:column;transition:border-color 0.2s}
.panel:hover{border-color:var(--border2)}
.panel.full{grid-column:1/-1}
.panel-title{font-size:1.15rem;font-weight:700;margin-bottom:0.8rem;display:flex;align-items:center;gap:0.5rem;color:#fff;border-bottom:1px solid var(--border);padding-bottom:0.5rem}
.panel-title i{color:var(--pri)}
.panel-title .spacer{flex:1}
.diagram-tabs{display:flex;gap:0.3rem;margin-bottom:0.5rem;flex-wrap:wrap}
.diagram-tab{padding:0.25rem 0.6rem;border-radius:6px;border:1px solid var(--border);background:rgba(255,255,255,0.02);color:var(--muted);cursor:pointer;font-size:0.72rem;font-family:'Outfit',sans-serif;transition:all 0.15s}
.diagram-tab:hover{background:rgba(99,102,241,0.1);border-color:var(--pri)}
.diagram-tab.active{background:rgba(99,102,241,0.18);border-color:var(--pri);color:var(--pri2);font-weight:600}
.diagram-wrap{background:rgba(10,15,26,0.5);border-radius:12px;padding:0.5rem;overflow:hidden;border:1px solid rgba(255,255,255,0.03);max-height:80vh;cursor:grab;position:relative;user-select:none;min-height:100px}
[data-theme="light"] .diagram-wrap{background:rgba(255,255,255,0.5)}
.diagram-wrap:active,.diagram-wrap.panning{cursor:grabbing}
.diagram-inner{transform-origin:0 0;width:fit-content;min-width:100%;will-change:transform}
.diagram-wrap svg{max-width:none;height:auto;display:block}
.diagram-hint{position:absolute;bottom:4px;right:8px;color:rgba(255,255,255,0.1);font-size:0.6rem;pointer-events:none;z-index:0}
.diagram-panel{display:none}.diagram-panel.active{display:block}
.zoom-group{display:inline-flex;align-items:center;gap:1px;margin-left:auto}
.zoom-group button{width:22px;height:20px;border-radius:3px;border:1px solid var(--border);background:rgba(255,255,255,0.03);color:var(--muted);cursor:pointer;font-size:0.65rem;display:inline-flex;align-items:center;justify-content:center;transition:all 0.15s;padding:0;line-height:1}
.zoom-group button:hover{background:rgba(99,102,241,0.2);border-color:var(--pri);color:#fff}
.zoom-group .zoom-pct{min-width:32px;text-align:center;font-weight:600;color:var(--muted);font-size:0.65rem}
.kbd-hint{font-size:0.6rem;color:rgba(255,255,255,0.15);pointer-events:none}
.info-card{background:rgba(255,255,255,0.02);border-left:3px solid var(--pri);padding:0.5rem 0.8rem;margin:0.35rem 0;border-radius:0 8px 8px 0;font-size:0.82rem;transition:border-color 0.2s}
.info-card.filtered{display:none!important}
.info-card.success{border-left-color:var(--green)}.info-card.warning{border-left-color:var(--amber)}.info-card.danger{border-left-color:var(--red)}
.info-card.queue{border-left-color:var(--cyan);background:rgba(6,182,212,0.05)}
.info-card.ai{border-left-color:#a855f7;background:rgba(168,85,247,0.05)}
.info-card strong{color:#fff;display:block;margin-bottom:0.15rem}
.info-card code{background:rgba(255,255,255,0.06);padding:0.1rem 0.4rem;border-radius:4px;font-size:0.78rem;color:#fbbf24}
.info-card pre,.info-card .path-block{background:rgba(0,0,0,0.3);border-radius:6px;padding:0.35rem 0.6rem;margin:0.25rem 0;font-family:'JetBrains Mono','Consolas',monospace;font-size:0.72rem;color:#34d399;line-height:1.5;overflow-x:auto;white-space:pre}
.info-card ul{padding-left:1.2rem;margin-top:0.15rem}
.info-card ul li{margin-bottom:0.1rem}
.info-card table{width:100%;font-size:0.77rem;border-collapse:collapse;margin-top:0.3rem}
.info-card table td{padding:2px 6px;border-bottom:1px solid rgba(255,255,255,0.04)}
.info-card p{margin:0.2rem 0}
.tree-root{overflow-y:auto;max-height:78vh;padding-right:0.5rem}
.tree-node{list-style:none;position:relative;padding-left:1.6rem;margin:0.35rem 0}
.tree-node::before{content:"";position:absolute;left:0;top:14px;width:14px;height:1px;background:var(--border)}
.tree-node::after{content:"";position:absolute;left:0;top:0;width:1px;height:100%;background:var(--border)}
.tree-node:last-child::after{height:14px}
.tree-node.filtered{display:none!important}
.tree-toggle{cursor:pointer;display:flex;align-items:center;gap:0.5rem;padding:0.4rem 0.6rem;background:rgba(255,255,255,0.02);border:1px solid var(--border);border-radius:8px;font-weight:500;color:var(--text);transition:all 0.2s;user-select:none;font-size:0.85rem}
.tree-toggle:hover{background:rgba(99,102,241,0.1);border-color:var(--pri);transform:translateX(2px)}
.tree-toggle.active i.fa-chevron-right{transform:rotate(90deg)}
.tree-toggle i.fa-chevron-right{font-size:0.7rem;transition:all 0.2s;color:var(--muted)}
.tree-content{display:none;padding:0.35rem 0.3rem 0.3rem 1.5rem;color:var(--muted);font-size:0.82rem;line-height:1.55}
.tree-content.show{display:block;animation:slideDown 0.3s ease-out}
.tree-content ul{padding-left:1.2rem;margin-top:0.3rem;list-style:none}
.tree-content ul li{margin-bottom:0.2rem;position:relative;padding-left:1.1rem}
.tree-content ul li::before{content:"β–Έ";position:absolute;left:0;color:var(--pri2);font-size:0.65rem;top:0.25rem}
.badge{font-size:0.65rem;padding:0.1rem 0.4rem;border-radius:20px;font-weight:700;text-transform:uppercase;white-space:nowrap}
.badge-tab{background:rgba(99,102,241,0.2);color:#818cf8;border:1px solid rgba(99,102,241,0.3)}
.badge-seq{background:rgba(217,70,239,0.2);color:#e879f9;border:1px solid rgba(217,70,239,0.3)}
.badge-folder{background:rgba(245,158,11,0.2);color:#fbbf24;border:1px solid rgba(245,158,11,0.3)}
.badge-queue{background:rgba(6,182,212,0.2);color:#22d3ee;border:1px solid rgba(6,182,212,0.3)}
.badge-ai{background:rgba(168,85,247,0.2);color:#c084fc;border:1px solid rgba(168,85,247,0.3)}
.badge-entry{background:rgba(34,197,94,0.2);color:#4ade80;border:1px solid rgba(34,197,94,0.3)}
.arch-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:0.7rem;margin-top:0.4rem}
.arch-card{background:rgba(255,255,255,0.02);border:1px solid var(--border);border-radius:12px;overflow:hidden;border-left:3px solid var(--pri);transition:all 0.2s}
.arch-card:hover{border-color:rgba(99,102,241,0.3);transform:translateY(-1px)}
.arch-card.filtered{display:none!important}
.arch-entry{border-left-color:#34d399!important}.arch-tab{border-left-color:#818cf8!important}.arch-queue{border-left-color:#06b6d4!important}.arch-folder{border-left-color:#f59e0b!important}.arch-media{border-left-color:#60a5fa!important}.arch-orphan{border-left-color:#ef4444!important;background:rgba(239,68,68,0.05)}
.arch-card-header{display:flex;justify-content:space-between;align-items:center;padding:0.45rem 0.75rem;border-bottom:1px solid var(--border);font-weight:600;font-size:0.85rem}
.arch-count{font-size:0.68rem;color:var(--muted);white-space:nowrap}
.arch-card-body{padding:0.35rem 0.75rem;font-size:0.75rem;line-height:1.7}
.arch-card-body code{font-size:0.7rem;color:#34d399}
.arch-toggle{cursor:pointer;color:var(--pri2);font-size:0.7rem;padding:0.25rem 0.35rem;margin:0.25rem 0 0 0;user-select:none;display:flex;align-items:center;gap:0.3rem;transition:all 0.15s;border-radius:4px;background:rgba(255,255,255,0.02)}
.arch-toggle:hover{color:#fff;background:rgba(99,102,241,0.1)}
.arch-toggle i{font-size:0.45rem;transition:transform 0.2s;color:var(--muted)}
.arch-toggle.open i{transform:rotate(180deg)}
.arch-full-list{max-height:200px;overflow-y:auto;padding:0.25rem 0.5rem;background:rgba(0,0,0,0.2);border-radius:6px;border:1px solid var(--border);margin-top:0.15rem;display:block}
.arch-full-list code{display:block;padding:0.06rem 0.15rem;font-size:0.68rem;cursor:pointer;transition:background 0.1s;border-radius:3px}
.arch-full-list code:hover{background:rgba(99,102,241,0.15)}
.arch-copy-btn{font-size:0.58rem;padding:0.1rem 0.4rem;margin-bottom:0.2rem;border-radius:4px;border:1px solid var(--border);background:rgba(255,255,255,0.04);color:var(--muted);cursor:pointer;transition:all 0.15s}
.arch-copy-btn:hover{background:rgba(99,102,241,0.2);color:#fff;border-color:var(--pri)}
.arch-copy-btn.copied{background:rgba(16,185,129,0.15);color:#34d399;border-color:var(--green)}
.file-tree-container{max-height:60vh;overflow-y:auto;font-family:'JetBrains Mono','Consolas',monospace;font-size:0.76rem;background:rgba(0,0,0,0.3);border-radius:10px;padding:0.5rem 0.7rem}
.file-tree-container ul{list-style:none;padding-left:1.2rem;margin:0}
.file-tree-container>ul{padding-left:0.2rem}
.tree-branch{margin:0.1rem 0}.tree-leaf{margin:0.05rem 0;padding-left:0.2rem;line-height:1.5}
.tree-leaf.filtered,.tree-branch.filtered{display:none!important}
.dir-toggle{cursor:pointer;display:inline-flex;align-items:center;gap:0.35rem;padding:0.15rem 0.4rem;border-radius:4px;transition:background 0.2s;user-select:none}
.dir-toggle:hover{background:rgba(99,102,241,0.1)}
.dir-toggle i.fa-chevron-right{font-size:0.55rem;transition:transform 0.2s;color:var(--muted);width:0.55rem;text-align:center}
.dir-toggle.expanded i.fa-chevron-right{transform:rotate(90deg)}
.dir-name{color:#60a5fa;font-weight:600}.tree-meta{color:rgba(255,255,255,0.25);font-size:0.68rem;font-style:italic}
.tree-file{color:#818cf8}.tree-file.py{color:#818cf8}.tree-file.js{color:#facc15}.tree-file.ts{color:#60a5fa}.tree-file.json{color:#f59e0b}.tree-file.md{color:#34d399}.tree-file.css{color:#fb923c}.tree-file.yaml{color:#f59e0b}.tree-file.yml{color:#f59e0b}.tree-file.go{color:#06b6d4}.tree-file.rs{color:#fbbf24}
.metrics-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:0.6rem;margin-top:0.4rem}
.metric-card{background:rgba(255,255,255,0.02);border:1px solid var(--border);border-radius:10px;padding:0.6rem 0.8rem;text-align:center}
.metric-card .metric-value{font-size:1.5rem;font-weight:800;color:var(--pri2)}.metric-card .metric-label{font-size:0.7rem;color:var(--muted);margin-top:0.2rem}
.api-table{width:100%;border-collapse:collapse;font-size:0.78rem;margin-top:0.4rem}
.api-table th{text-align:left;padding:0.4rem 0.6rem;border-bottom:1px solid var(--border);color:var(--muted);font-weight:600;font-size:0.72rem;text-transform:uppercase;cursor:pointer}
.api-table td{padding:0.3rem 0.6rem;border-bottom:1px solid var(--border);color:var(--text2)}
.api-method{font-weight:700;font-size:0.7rem;padding:0.1rem 0.4rem;border-radius:4px}
.api-method.GET{background:rgba(16,185,129,0.15);color:#34d399}.api-method.POST{background:rgba(99,102,241,0.15);color:#818cf8}
.api-method.PUT,.api-method.PATCH{background:rgba(245,158,11,0.15);color:#fbbf24}.api-method.DELETE{background:rgba(239,68,68,0.15);color:#f87171}
.tech-tags{display:flex;flex-wrap:wrap;gap:0.35rem}.tech-tag{padding:0.15rem 0.5rem;border-radius:15px;font-size:0.7rem;font-weight:500;border:1px solid}
.tech-tag.lang{background:rgba(99,102,241,0.1);border-color:rgba(99,102,241,0.3);color:#818cf8}
.tech-tag.fw{background:rgba(16,185,129,0.1);border-color:rgba(16,185,129,0.3);color:#34d399}
.tech-tag.db{background:rgba(6,182,212,0.1);border-color:rgba(6,182,212,0.3);color:#22d3ee}
.tech-tag.ai{background:rgba(168,85,247,0.1);border-color:rgba(168,85,247,0.3);color:#c084fc}
.dropdown{position:relative;display:inline-block}
.dropdown-menu{display:none;position:absolute;right:0;top:100%;margin-top:4px;background:var(--card);backdrop-filter:blur(20px);border:1px solid var(--border);border-radius:10px;min-width:150px;z-index:200;overflow:hidden;box-shadow:0 10px 30px rgba(0,0,0,0.4)}
.dropdown-menu.show{display:block}
.dropdown-menu button{display:block;width:100%;padding:0.5rem 0.8rem;border:none;background:none;color:var(--text);font-family:'Outfit',sans-serif;font-size:0.8rem;text-align:left;cursor:pointer;transition:background 0.15s}
.dropdown-menu button:hover{background:rgba(99,102,241,0.15)}
.dropdown-menu button i{margin-right:0.5rem;color:var(--muted);width:16px;text-align:center}
.toast{position:fixed;bottom:1.5rem;right:1.5rem;background:var(--card);border:1px solid var(--border);border-radius:10px;padding:0.6rem 1rem;color:var(--text);font-size:0.82rem;z-index:400;opacity:0;transform:translateY(10px);transition:all 0.3s;box-shadow:0 10px 30px rgba(0,0,0,0.3)}
.toast.show{opacity:1;transform:translateY(0)}
@keyframes slideDown{from{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:translateY(0)}}
::-webkit-scrollbar{width:5px;height:5px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:rgba(255,255,255,0.08);border-radius:3px}
</style>
</head>
<body>
<div class="topbar">
<span class="logo">🌐 CodeGraph</span>
<div class="search-wrap">
<i class="fa-solid fa-search"></i>
<input type="text" id="globalSearch" placeholder="Search everything... (/) " oninput="onSearch(this.value)" onkeydown="onSearchKey(event)">
<button class="search-clear" id="searchClear" onclick="clearSearch()">βœ•</button>
</div>
<button class="tb-btn" onclick="toggleTheme()" title="Toggle theme (t)"><i class="fa-solid fa-moon"></i><span class="hide-mobile">Theme</span></button>
<span class="tb-sep"></span>
<button class="tb-btn" onclick="expandAll()" title="Expand all (f)"><i class="fa-solid fa-arrows-to-dot"></i><span class="hide-mobile">Expand</span></button>
<button class="tb-btn" onclick="collapseAll()" title="Collapse all (Shift+F)"><i class="fa-solid fa-arrows-to-line"></i></button>
<span class="tb-sep"></span>
<button class="tb-btn" onclick="zoomReset()" title="Reset zoom (r)"><i class="fa-solid fa-rotate"></i><span class="hide-mobile">Reset</span></button>
<div class="dropdown">
<button class="tb-btn" onclick="toggleDropdown('exportMenu')"><i class="fa-solid fa-download"></i><span class="hide-mobile">Export</span> <i class="fa-solid fa-caret-down" style="font-size:0.5rem"></i></button>
<div class="dropdown-menu" id="exportMenu">
<button onclick="exportJSON()"><i class="fa-solid fa-code"></i> Export JSON</button>
<button onclick="exportMarkdown()"><i class="fa-solid fa-file-lines"></i> Export Markdown</button>
<button onclick="exportPNG()"><i class="fa-solid fa-image"></i> Export Diagram PNG</button>
</div>
</div>
</div>
<header>
<h1>🌐 SΖ‘ Đồ Workflow β€” AI Forecast</h1>
<p class="subtitle">Generated 2026-06-22 08:58:12 Β· 287 files Β· 5435 symbols Β· 1562 imports</p>
<div class="legend-row">
<span><span class="leg-dot leg-tab"></span> Module / Tab</span>
<span><span class="leg-dot leg-dec"></span> Điều kiện</span>
<span><span class="leg-dot leg-err"></span> Dα»«ng / Lα»—i</span>
<span><span class="leg-dot leg-ok"></span> ThΓ nh cΓ΄ng</span>
<span><span class="leg-dot leg-fold"></span> Files</span>
<span><span class="leg-dot leg-ai"></span> AI / Queue</span>
</div>
</header>
<div class="main-layout">
<!-- LEFT: PRIMARY WORKFLOW DIAGRAM -->
<div class="panel">
<div class="panel-title">
<i class="fa-solid fa-diagram-project"></i> SΖ‘ Đồ Luα»“ng Workflow Tα»•ng Thể
<div class="spacer"></div>
<div class="zoom-group">
<button onclick="zoomOut()" title="Zoom Out">βˆ’</button>
<span class="zoom-pct" id="zoomLevel">100%</span>
<button onclick="zoomIn()" title="Zoom In">+</button>
<button onclick="zoomReset()" title="Reset">β†Ί</button>
</div>
</div>
<div class="diagram-wrap" id="diagramWrap0">
<div class="diagram-inner" id="diagramInner0">
<div class="mermaid">graph TD
classDef tab fill:#1e1b4b,stroke:#818cf8,stroke-width:2px,color:#e0e7ff
classDef step fill:#111827,stroke:#374151,stroke-width:1px,color:#f3f4f6
classDef folder fill:#1e1b0a,stroke:#f59e0b,stroke-width:2px,color:#fefce8
classDef queue fill:#0a1e2e,stroke:#06b6d4,stroke-width:2px,color:#e0f7ff
classDef ai fill:#1a0a2e,stroke:#a855f7,stroke-width:2px,color:#f3e8ff
classDef ok fill:#064e3b,stroke:#34d399,stroke-width:2px,color:#ecfdf5
classDef err fill:#450a0a,stroke:#f87171,stroke-width:2px,color:#fef2f2
L0["πŸš€ Entry Points\n1 files"]:::tab
L1["UI / Frontend β€” frontend/\n5 files"]:::tab
L0 -->L1
L2["[chronos-forecasting] Core / Business Logic β€” libs/\n39 files"]:::folder
L1 -->L2
L3["[timesfm] Core / Business Logic β€” libs/\n58 files"]:::folder
L2 -->L3
L4["Infrastructure β€” scripts/\n6 files"]:::queue
L3 -->L4
L5["UI / Frontend β€” scratch/ 1r\n107 files"]:::tab
L4 -->L5
L6["backend/\n70 files"]:::folder
L5 -->L6
L7[".codegraph/\n1 files"]:::folder
L6 -->L7
L8["πŸ“„ Zero-Symbol Files\n17 files"]:::tab
L7 -->L8
L5 -.->|route_handler| L6
L1 -.->|calls| L6
L1 -.->|calls| L5
L5 -.->|route_handler| L1
L6 -.->|route_handler| L5
AI["πŸ€– AI: anthropic, deepseek, google_ai"]:::ai
L8 -.->AI
API["πŸ”— 31 API endpoints"]:::ok</div>
</div>
<div class="diagram-hint">πŸ–± scroll zoom Β· drag pan</div>
</div>
</div>
<!-- RIGHT: DETAILED WORKFLOW TREE -->
<div class="panel">
<div class="panel-title"><i class="fa-solid fa-folder-tree"></i> CαΊ₯u TrΓΊc Chi TiαΊΏt & ThΓ nh PhαΊ§n</div>
<div class="tree-root">
<div class="tree-node"><div class="tree-toggle" onclick="toggleNode(this)"><i class="fa-solid fa-chevron-right"></i><span class="badge badge-tab">TAB</span><span>UI / Frontend β€” frontend/</span></div><div class="tree-content"><div class="info-card "><strong>πŸ“₯ Files</strong><div class="path-block">frontend/ai-session-runtime.js</div>
<div class="path-block">frontend/analysis-runtime.js</div>
<div class="path-block">frontend/app.js</div>
<div class="path-block">frontend/forecast-models.js</div>
<div class="path-block">frontend/workspace.js</div></div><div class="info-card folder"><strong>πŸ”„ Key Components</strong><ul><li><b>PaneState</b> β€” class in <code>frontend/workspace.js</code></li>
<li><code>apiJsonRequest</code> β€” function in <code>frontend/app.js</code></li>
<li><code>apiRequest</code> β€” function in <code>frontend/app.js</code></li>
<li><code>applyHeaderVisibility</code> β€” function in <code>frontend/app.js</code></li>
<li><code>applySymbolToActivePane</code> β€” function in <code>frontend/app.js</code></li>
<li><code>applyTheme</code> β€” function in <code>frontend/app.js</code></li>
<li><code>buildGaugeSvg</code> β€” function in <code>frontend/app.js</code></li></ul></div><div class="info-card warning"><strong>πŸ“€ Cross-Layer Dependencies</strong><code>DELETE /api/cache</code>, <code>GET /</code></div><div class="info-card folder"><strong>πŸ“ Structure</strong><div class="path-block">└── frontend/
β”œβ”€β”€ ai-session-runtime.js
β”œβ”€β”€ analysis-runtime.js
β”œβ”€β”€ app.js
β”œβ”€β”€ forecast-models.js
└── workspace.js</div></div></div></div>
<div class="tree-node"><div class="tree-toggle" onclick="toggleNode(this)"><i class="fa-solid fa-chevron-right"></i><span class="badge badge-tab">MODULE</span><span>[chronos-forecasting] Core / Business Logic β€” libs/ β€” Overview</span></div><div class="tree-content"><div class="info-card "><strong>πŸ“₯ Files</strong><div class="path-block">libs/chronos-forecasting/.github/ISSUE_TEMPLATE/config.yml</div>
<div class="path-block">libs/chronos-forecasting/.github/workflows/ci.yml</div>
<div class="path-block">libs/chronos-forecasting/.github/workflows/eval-model.yml</div>
<div class="path-block">libs/chronos-forecasting/.github/workflows/publish-to-pypi.yml</div>
<div class="path-block">libs/chronos-forecasting/ci/evaluate/backtest_config.yaml</div>
<div class="path-block">libs/chronos-forecasting/scripts/evaluation/agg-relative-score.py</div>
<div class="path-block">libs/chronos-forecasting/scripts/evaluation/configs/in-domain.yaml</div>
<div class="path-block">libs/chronos-forecasting/scripts/evaluation/configs/zero-shot.yaml</div></div><div class="info-card folder"><strong>πŸ”„ Key Components</strong><ul><li><b>MLP</b> β€” class in <code>libs/chronos-forecasting/src/chronos/chronos2/layers.py</code></li>
<li><b>AttentionOutput</b> β€” class in <code>libs/chronos-forecasting/src/chronos/chronos2/layers.py</code></li>
<li><b>Chronos2LayerNorm</b> β€” class in <code>libs/chronos-forecasting/src/chronos/chronos2/layers.py</code></li>
<li><b>FeedForward</b> β€” class in <code>libs/chronos-forecasting/src/chronos/chronos2/layers.py</code></li>
<li><code>download_model_files_from_cloudfront</code> β€” function in <code>libs/chronos-forecasting/src/chronos/boto_utils.py</code></li>
<li><code>__init__</code> β€” method in <code>libs/chronos-forecasting/src/chronos/chronos2/layers.py</code></li>
<li><code>_eager_attention</code> β€” method in <code>libs/chronos-forecasting/src/chronos/chronos2/layers.py</code></li>
<li><code>_sdpa_attention</code> β€” method in <code>libs/chronos-forecasting/src/chronos/chronos2/layers.py</code></li>
<li><code>apply_rotary_pos_emb</code> β€” method in <code>libs/chronos-forecasting/src/chronos/chronos2/layers.py</code></li>
<li><code>forward</code> β€” method in <code>libs/chronos-forecasting/src/chronos/chronos2/layers.py</code></li>
<li><code>rotate_half</code> β€” method in <code>libs/chronos-forecasting/src/chronos/chronos2/layers.py</code></li>
<li><code>batchify</code> β€” function in <code>libs/chronos-forecasting/src/chronos/base.py</code></li></ul></div><div class="info-card folder"><strong>πŸ“ Structure</strong><div class="path-block">└── libs/
└── chronos-forecasting/
β”œβ”€β”€ .github/
β”‚ β”œβ”€β”€ ISSUE_TEMPLATE/
β”‚ β”‚ └── config.yml
β”‚ └── workflows/
β”‚ β”œβ”€β”€ ci.yml
β”‚ β”œβ”€β”€ eval-model.yml
β”‚ └── publish-to-pypi.yml
β”œβ”€β”€ ci/
β”‚ └── evaluate/
β”‚ └── backtest_config.yaml
└── scripts/
β”œβ”€β”€ evaluation/
β”‚ β”œβ”€β”€ configs/
β”‚ β”‚ β”œβ”€β”€ in-domain.yaml
β”‚ β”‚ └── zero-shot.yaml
β”‚ β”œβ”€β”€ agg-relative-score.py
β”‚ └── evaluate.py
β”œβ”€β”€ training/
β”‚ └── configs/
β”‚ β”œβ”€β”€ chronos-gpt2.yaml
β”‚ └── chronos-t5-base.yaml
└── kernel-synth.py</div></div></div></div>
<div class="tree-node"><div class="tree-toggle" onclick="toggleNode(this)"><i class="fa-solid fa-chevron-right"></i><span class="badge badge-tab">MODULE</span><span> ↳ .github/</span></div><div class="tree-content"><div class="info-card "><strong>πŸ“₯ Files</strong><div class="path-block">libs/chronos-forecasting/.github/ISSUE_TEMPLATE/config.yml</div>
<div class="path-block">libs/chronos-forecasting/.github/workflows/ci.yml</div>
<div class="path-block">libs/chronos-forecasting/.github/workflows/eval-model.yml</div>
<div class="path-block">libs/chronos-forecasting/.github/workflows/publish-to-pypi.yml</div></div><div class="info-card folder"><strong>πŸ“ Structure</strong><div class="path-block">└── libs/
└── chronos-forecasting/
└── .github/
β”œβ”€β”€ ISSUE_TEMPLATE/
β”‚ └── config.yml
└── workflows/
β”œβ”€β”€ ci.yml
β”œβ”€β”€ eval-model.yml
└── publish-to-pypi.yml</div></div></div></div>
<div class="tree-node"><div class="tree-toggle" onclick="toggleNode(this)"><i class="fa-solid fa-chevron-right"></i><span class="badge badge-tab">MODULE</span><span> ↳ scripts/</span></div><div class="tree-content"><div class="info-card "><strong>πŸ“₯ Files</strong><div class="path-block">libs/chronos-forecasting/scripts/evaluation/agg-relative-score.py</div>
<div class="path-block">libs/chronos-forecasting/scripts/evaluation/configs/in-domain.yaml</div>
<div class="path-block">libs/chronos-forecasting/scripts/evaluation/configs/zero-shot.yaml</div>
<div class="path-block">libs/chronos-forecasting/scripts/evaluation/evaluate.py</div>
<div class="path-block">libs/chronos-forecasting/scripts/kernel-synth.py</div>
<div class="path-block">libs/chronos-forecasting/scripts/training/configs/chronos-gpt2.yaml</div>
<div class="path-block">libs/chronos-forecasting/scripts/training/configs/chronos-t5-base.yaml</div>
<div class="path-block">libs/chronos-forecasting/scripts/training/configs/chronos-t5-large.yaml</div></div><div class="info-card folder"><strong>πŸ“ Structure</strong><div class="path-block">└── libs/
└── chronos-forecasting/
└── scripts/
β”œβ”€β”€ evaluation/
β”‚ β”œβ”€β”€ configs/
β”‚ β”‚ β”œβ”€β”€ in-domain.yaml
β”‚ β”‚ └── zero-shot.yaml
β”‚ β”œβ”€β”€ agg-relative-score.py
β”‚ └── evaluate.py
β”œβ”€β”€ training/
β”‚ β”œβ”€β”€ configs/
β”‚ β”‚ β”œβ”€β”€ chronos-gpt2.yaml
β”‚ β”‚ β”œβ”€β”€ chronos-t5-base.yaml
β”‚ β”‚ β”œβ”€β”€ chronos-t5-large.yaml
β”‚ β”‚ β”œβ”€β”€ chronos-t5-mini.yaml
β”‚ β”‚ β”œβ”€β”€ chronos-t5-small.yaml
β”‚ β”‚ └── chronos-t5-tiny.yaml
β”‚ └── train.py
└── kernel-synth.py</div></div></div></div>
<div class="tree-node"><div class="tree-toggle" onclick="toggleNode(this)"><i class="fa-solid fa-chevron-right"></i><span class="badge badge-tab">MODULE</span><span> ↳ src/</span></div><div class="tree-content"><div class="info-card "><strong>πŸ“₯ Files</strong><div class="path-block">libs/chronos-forecasting/src/chronos/__about__.py</div>
<div class="path-block">libs/chronos-forecasting/src/chronos/__init__.py</div>
<div class="path-block">libs/chronos-forecasting/src/chronos/base.py</div>
<div class="path-block">libs/chronos-forecasting/src/chronos/boto_utils.py</div>
<div class="path-block">libs/chronos-forecasting/src/chronos/chronos.py</div>
<div class="path-block">libs/chronos-forecasting/src/chronos/chronos2/__init__.py</div>
<div class="path-block">libs/chronos-forecasting/src/chronos/chronos2/config.py</div>
<div class="path-block">libs/chronos-forecasting/src/chronos/chronos2/dataset.py</div></div><div class="info-card folder"><strong>πŸ“ Structure</strong><div class="path-block">└── libs/
└── chronos-forecasting/
└── src/
└── chronos/
β”œβ”€β”€ chronos2/
β”‚ β”œβ”€β”€ __init__.py
β”‚ β”œβ”€β”€ config.py
β”‚ β”œβ”€β”€ dataset.py
β”‚ β”œβ”€β”€ layers.py
β”‚ β”œβ”€β”€ model.py
β”‚ β”œβ”€β”€ pipeline.py
β”‚ └── trainer.py
β”œβ”€β”€ __about__.py
β”œβ”€β”€ __init__.py
β”œβ”€β”€ base.py
β”œβ”€β”€ boto_utils.py
└── chronos.py</div></div></div></div>
<div class="tree-node"><div class="tree-toggle" onclick="toggleNode(this)"><i class="fa-solid fa-chevron-right"></i><span class="badge badge-tab">MODULE</span><span> ↳ test/</span></div><div class="tree-content"><div class="info-card "><strong>πŸ“₯ Files</strong><div class="path-block">libs/chronos-forecasting/test/__init__.py</div>
<div class="path-block">libs/chronos-forecasting/test/test_chronos.py</div>
<div class="path-block">libs/chronos-forecasting/test/test_chronos2.py</div>
<div class="path-block">libs/chronos-forecasting/test/test_chronos_bolt.py</div>
<div class="path-block">libs/chronos-forecasting/test/test_df_utils.py</div>
<div class="path-block">libs/chronos-forecasting/test/test_utils.py</div>
<div class="path-block">libs/chronos-forecasting/test/util.py</div></div><div class="info-card folder"><strong>πŸ“ Structure</strong><div class="path-block">└── libs/
└── chronos-forecasting/
└── test/
β”œβ”€β”€ __init__.py
β”œβ”€β”€ test_chronos.py
β”œβ”€β”€ test_chronos2.py
β”œβ”€β”€ test_chronos_bolt.py
β”œβ”€β”€ test_df_utils.py
β”œβ”€β”€ test_utils.py
└── util.py</div></div></div></div>
<div class="tree-node"><div class="tree-toggle" onclick="toggleNode(this)"><i class="fa-solid fa-chevron-right"></i><span class="badge badge-tab">MODULE</span><span>[timesfm] Core / Business Logic β€” libs/ β€” Overview</span></div><div class="tree-content"><div class="info-card "><strong>πŸ“₯ Files</strong><div class="path-block">libs/timesfm/.github/workflows/main.yml</div>
<div class="path-block">libs/timesfm/.github/workflows/manual_publish.yml</div>
<div class="path-block">libs/timesfm/src/timesfm/__init__.py</div>
<div class="path-block">libs/timesfm/src/timesfm/configs.py</div>
<div class="path-block">libs/timesfm/src/timesfm/flax/__init__.py</div>
<div class="path-block">libs/timesfm/src/timesfm/flax/dense.py</div>
<div class="path-block">libs/timesfm/src/timesfm/flax/normalization.py</div>
<div class="path-block">libs/timesfm/src/timesfm/flax/transformer.py</div></div><div class="info-card folder"><strong>πŸ”„ Key Components</strong><ul><li><b>CheckResult</b> β€” class in <code>libs/timesfm/timesfm-forecasting/scripts/check_system.py</code></li>
<li><b>MEMORYSTATUSEX</b> β€” class in <code>libs/timesfm/timesfm-forecasting/scripts/check_system.py</code></li>
<li><b>TestDecodeCache</b> β€” class in <code>libs/timesfm/tests/test_torch_utils.py</code></li>
<li><b>TestRevIN</b> β€” class in <code>libs/timesfm/tests/test_torch_utils.py</code></li>
<li><code>normalize</code> β€” function in <code>libs/timesfm/src/timesfm/utils/xreg_lib.py</code></li>
<li><code>_get_total_ram_gb</code> β€” function in <code>libs/timesfm/timesfm-forecasting/scripts/check_system.py</code></li>
<li><code>passed</code> β€” method in <code>libs/timesfm/timesfm-forecasting/scripts/check_system.py</code></li>
<li><code>evaluate</code> β€” function in <code>libs/timesfm/timesfm-forecasting/examples/finetuning/finetune_lora.py</code></li>
<li><code>load_retail_sales</code> β€” function in <code>libs/timesfm/timesfm-forecasting/examples/finetuning/finetune_lora.py</code></li>
<li><code>_ar_decode</code> β€” function in <code>libs/timesfm/src/timesfm/timesfm_2p5/timesfm_2p5_flax.py</code></li>
<li><code>_normalize</code> β€” function in <code>libs/timesfm/v1/src/timesfm/timesfm_base.py</code></li>
<li><code>_renormalize</code> β€” function in <code>libs/timesfm/v1/src/timesfm/timesfm_base.py</code></li></ul></div><div class="info-card folder"><strong>πŸ“ Structure</strong><div class="path-block">└── libs/
└── timesfm/
β”œβ”€β”€ .github/
β”‚ └── workflows/
β”‚ β”œβ”€β”€ main.yml
β”‚ └── manual_publish.yml
└── src/
└── timesfm/
β”œβ”€β”€ flax/
β”‚ β”œβ”€β”€ __init__.py
β”‚ β”œβ”€β”€ dense.py
β”‚ β”œβ”€β”€ normalization.py
β”‚ β”œβ”€β”€ transformer.py
β”‚ └── util.py
β”œβ”€β”€ timesfm_2p5/
β”‚ β”œβ”€β”€ timesfm_2p5_base.py
β”‚ β”œβ”€β”€ timesfm_2p5_flax.py
β”‚ └── timesfm_2p5_torch.py
β”œβ”€β”€ __init__.py
└── configs.py</div></div></div></div>
<div class="tree-node"><div class="tree-toggle" onclick="toggleNode(this)"><i class="fa-solid fa-chevron-right"></i><span class="badge badge-tab">MODULE</span><span> ↳ .github/</span></div><div class="tree-content"><div class="info-card "><strong>πŸ“₯ Files</strong><div class="path-block">libs/timesfm/.github/workflows/main.yml</div>
<div class="path-block">libs/timesfm/.github/workflows/manual_publish.yml</div></div></div></div>
<div class="tree-node"><div class="tree-toggle" onclick="toggleNode(this)"><i class="fa-solid fa-chevron-right"></i><span class="badge badge-tab">MODULE</span><span> ↳ src/</span></div><div class="tree-content"><div class="info-card "><strong>πŸ“₯ Files</strong><div class="path-block">libs/timesfm/src/timesfm/__init__.py</div>
<div class="path-block">libs/timesfm/src/timesfm/configs.py</div>
<div class="path-block">libs/timesfm/src/timesfm/flax/__init__.py</div>
<div class="path-block">libs/timesfm/src/timesfm/flax/dense.py</div>
<div class="path-block">libs/timesfm/src/timesfm/flax/normalization.py</div>
<div class="path-block">libs/timesfm/src/timesfm/flax/transformer.py</div>
<div class="path-block">libs/timesfm/src/timesfm/flax/util.py</div>
<div class="path-block">libs/timesfm/src/timesfm/timesfm_2p5/timesfm_2p5_base.py</div></div><div class="info-card folder"><strong>πŸ“ Structure</strong><div class="path-block">└── libs/
└── timesfm/
└── src/
└── timesfm/
β”œβ”€β”€ flax/
β”‚ β”œβ”€β”€ __init__.py
β”‚ β”œβ”€β”€ dense.py
β”‚ β”œβ”€β”€ normalization.py
β”‚ β”œβ”€β”€ transformer.py
β”‚ └── util.py
β”œβ”€β”€ timesfm_2p5/
β”‚ β”œβ”€β”€ timesfm_2p5_base.py
β”‚ β”œβ”€β”€ timesfm_2p5_flax.py
β”‚ └── timesfm_2p5_torch.py
β”œβ”€β”€ torch/
β”‚ β”œβ”€β”€ __init__.py
β”‚ └── dense.py
β”œβ”€β”€ __init__.py
└── configs.py</div></div></div></div>
<div class="tree-node"><div class="tree-toggle" onclick="toggleNode(this)"><i class="fa-solid fa-chevron-right"></i><span class="badge badge-tab">MODULE</span><span> ↳ tests/</span></div><div class="tree-content"><div class="info-card "><strong>πŸ“₯ Files</strong><div class="path-block">libs/timesfm/tests/__init__.py</div>
<div class="path-block">libs/timesfm/tests/test_base_utils.py</div>
<div class="path-block">libs/timesfm/tests/test_configs.py</div>
<div class="path-block">libs/timesfm/tests/test_torch_layers.py</div>
<div class="path-block">libs/timesfm/tests/test_torch_utils.py</div></div><div class="info-card folder"><strong>πŸ“ Structure</strong><div class="path-block">└── libs/
└── timesfm/
└── tests/
β”œβ”€β”€ __init__.py
β”œβ”€β”€ test_base_utils.py
β”œβ”€β”€ test_configs.py
β”œβ”€β”€ test_torch_layers.py
└── test_torch_utils.py</div></div></div></div>
<div class="tree-node"><div class="tree-toggle" onclick="toggleNode(this)"><i class="fa-solid fa-chevron-right"></i><span class="badge badge-tab">MODULE</span><span> ↳ timesfm-forecasting/</span></div><div class="tree-content"><div class="info-card "><strong>πŸ“₯ Files</strong><div class="path-block">libs/timesfm/timesfm-forecasting/examples/anomaly-detection/detect_anomalies.py</div>
<div class="path-block">libs/timesfm/timesfm-forecasting/examples/covariates-forecasting/demo_covariates.py</div>
<div class="path-block">libs/timesfm/timesfm-forecasting/examples/finetuning/finetune_lora.py</div>
<div class="path-block">libs/timesfm/timesfm-forecasting/examples/global-temperature/generate_animation_data.py</div>
<div class="path-block">libs/timesfm/timesfm-forecasting/examples/global-temperature/generate_gif.py</div>
<div class="path-block">libs/timesfm/timesfm-forecasting/examples/global-temperature/generate_html.py</div>
<div class="path-block">libs/timesfm/timesfm-forecasting/examples/global-temperature/run_forecast.py</div>
<div class="path-block">libs/timesfm/timesfm-forecasting/examples/global-temperature/visualize_forecast.py</div></div><div class="info-card folder"><strong>πŸ“ Structure</strong><div class="path-block">└── libs/
└── timesfm/
└── timesfm-forecasting/
β”œβ”€β”€ examples/
β”‚ β”œβ”€β”€ anomaly-detection/
β”‚ β”‚ └── detect_anomalies.py
β”‚ β”œβ”€β”€ covariates-forecasting/
β”‚ β”‚ └── demo_covariates.py
β”‚ β”œβ”€β”€ finetuning/
β”‚ β”‚ └── finetune_lora.py
β”‚ └── global-temperature/
β”‚ β”œβ”€β”€ generate_animation_data.py
β”‚ β”œβ”€β”€ generate_gif.py
β”‚ β”œβ”€β”€ generate_html.py
β”‚ β”œβ”€β”€ run_forecast.py
β”‚ └── visualize_forecast.py
└── scripts/
β”œβ”€β”€ check_system.py
└── forecast_csv.py</div></div></div></div>
<div class="tree-node"><div class="tree-toggle" onclick="toggleNode(this)"><i class="fa-solid fa-chevron-right"></i><span class="badge badge-tab">MODULE</span><span> ↳ v1/</span></div><div class="tree-content"><div class="info-card "><strong>πŸ“₯ Files</strong><div class="path-block">libs/timesfm/v1/experiments/baselines/__init__.py</div>
<div class="path-block">libs/timesfm/v1/experiments/baselines/timegpt_pipeline.py</div>
<div class="path-block">libs/timesfm/v1/experiments/extended_benchmarks/run_timegpt.py</div>
<div class="path-block">libs/timesfm/v1/experiments/extended_benchmarks/run_timesfm.py</div>
<div class="path-block">libs/timesfm/v1/experiments/extended_benchmarks/utils.py</div>
<div class="path-block">libs/timesfm/v1/experiments/long_horizon_benchmarks/run_eval.py</div>
<div class="path-block">libs/timesfm/v1/peft/finetune.py</div>
<div class="path-block">libs/timesfm/v1/src/adapter/__init__.py</div></div><div class="info-card folder"><strong>πŸ“ Structure</strong><div class="path-block">└── libs/
└── timesfm/
└── v1/
β”œβ”€β”€ experiments/
β”‚ β”œβ”€β”€ baselines/
β”‚ β”‚ β”œβ”€β”€ __init__.py
β”‚ β”‚ └── timegpt_pipeline.py
β”‚ β”œβ”€β”€ extended_benchmarks/
β”‚ β”‚ β”œβ”€β”€ run_timegpt.py
β”‚ β”‚ β”œβ”€β”€ run_timesfm.py
β”‚ β”‚ └── utils.py
β”‚ └── long_horizon_benchmarks/
β”‚ └── run_eval.py
β”œβ”€β”€ peft/
β”‚ └── finetune.py
└── src/
β”œβ”€β”€ adapter/
β”‚ β”œβ”€β”€ __init__.py
β”‚ β”œβ”€β”€ dora_layers.py
β”‚ β”œβ”€β”€ lora_layers.py
β”‚ └── utils.py
└── finetuning/
└── __init__.py</div></div></div></div>
<div class="tree-node"><div class="tree-toggle" onclick="toggleNode(this)"><i class="fa-solid fa-chevron-right"></i><span class="badge badge-tab">MODULE</span><span>Infrastructure β€” scripts/</span></div><div class="tree-content"><div class="info-card "><strong>πŸ“₯ Files</strong><div class="path-block">scripts/check_timesfm_env.py</div>
<div class="path-block">scripts/patch_timesfm.py</div>
<div class="path-block">scripts/playwright_smoke.js</div>
<div class="path-block">scripts/scratch_cleanup.py</div>
<div class="path-block">scripts/test_scratch_cleanup.py</div>
<div class="path-block">scripts/verify_local.py</div></div><div class="info-card folder"><strong>πŸ”„ Key Components</strong><ul><li><b>Check</b> β€” class in <code>scripts/verify_local.py</code></li>
<li><b>CleanupError</b> β€” class in <code>scripts/scratch_cleanup.py</code></li>
<li><b>CleanupResult</b> β€” class in <code>scripts/scratch_cleanup.py</code></li>
<li><code>_resolve_command</code> β€” function in <code>scripts/verify_local.py</code></li>
<li><code>_run_check</code> β€” function in <code>scripts/verify_local.py</code></li>
<li><code>build_checks</code> β€” function in <code>scripts/verify_local.py</code></li>
<li><code>main</code> β€” function in <code>scripts/verify_local.py</code></li>
<li><code>_build_argument_parser</code> β€” function in <code>scripts/scratch_cleanup.py</code></li>
<li><code>_build_cleanup_target</code> β€” function in <code>scripts/scratch_cleanup.py</code></li></ul></div><div class="info-card folder"><strong>πŸ“ Structure</strong><div class="path-block">└── scripts/
β”œβ”€β”€ check_timesfm_env.py
β”œβ”€β”€ patch_timesfm.py
β”œβ”€β”€ playwright_smoke.js
β”œβ”€β”€ scratch_cleanup.py
β”œβ”€β”€ test_scratch_cleanup.py
└── verify_local.py</div></div></div></div>
<div class="tree-node"><div class="tree-toggle" onclick="toggleNode(this)"><i class="fa-solid fa-chevron-right"></i><span class="badge badge-tab">MODULE</span><span>UI / Frontend β€” scratch/ 1r β€” Overview</span></div><div class="tree-content"><div class="info-card "><strong>πŸ“₯ Files</strong><div class="path-block">scratch/Kronos-upstream/examples/get_akshare_date_2024-2025_x.py</div>
<div class="path-block">scratch/Kronos-upstream/examples/get_date_new.py</div>
<div class="path-block">scratch/Kronos-upstream/examples/prediction_akshare_2024-2025.py</div>
<div class="path-block">scratch/Kronos-upstream/examples/prediction_batch_example.py</div>
<div class="path-block">scratch/Kronos-upstream/examples/prediction_cn_markets_day.py</div>
<div class="path-block">scratch/Kronos-upstream/examples/prediction_example.py</div>
<div class="path-block">scratch/Kronos-upstream/examples/prediction_new.py</div>
<div class="path-block">scratch/Kronos-upstream/examples/prediction_new_GUI.py</div></div><div class="info-card folder"><strong>πŸ”„ Key Components</strong><ul><li><b>InvestDebateState</b> β€” class in <code>scratch/tradingagents-audit/tradingagents/agents/utils/agent_states.py</code></li>
<li><b>RiskDebateState</b> β€” class in <code>scratch/tradingagents-audit/tradingagents/agents/utils/agent_states.py</code></li>
<li><b>EnhancedMarketFactorAnalyzer</b> β€” class in <code>scratch/Kronos-upstream/examples/prediction_new.py</code></li>
<li><b>StockPredictorGUI</b> β€” class in <code>scratch/Kronos-upstream/examples/prediction_new_GUI.py</code></li>
<li><code>enhance_prediction_with_market_factors</code> β€” function in <code>scratch/Kronos-upstream/examples/prediction_new.py</code></li>
<li><code>ensure_output_directory</code> β€” function in <code>scratch/Kronos-upstream/examples/prediction_new.py</code></li>
<li><code>create_question_box</code> β€” function in <code>scratch/tradingagents-audit/cli/main.py</code></li>
<li><code>load_models</code> β€” function in <code>scratch/Kronos-upstream/finetune/qlib_test.py</code></li>
<li><code>make_log</code> β€” function in <code>scratch/tradingagents-audit/tests/test_memory_log.py</code></li>
<li><code>test_decision_with_markdown_separator</code> β€” method in <code>scratch/tradingagents-audit/tests/test_memory_log.py</code></li>
<li><code>test_fetch_returns_valid_ticker</code> β€” method in <code>scratch/tradingagents-audit/tests/test_memory_log.py</code></li>
<li><code>test_full_cycle_store_resolve_inject</code> β€” method in <code>scratch/tradingagents-audit/tests/test_memory_log.py</code></li></ul></div><div class="info-card warning"><strong>πŸ“€ Cross-Layer Dependencies</strong><code>DELETE /api/cache</code>, <code>getModelSignatureFromPane</code></div><div class="info-card folder"><strong>πŸ“ Structure</strong><div class="path-block">└── scratch/
└── Kronos-upstream/
β”œβ”€β”€ examples/
β”‚ β”œβ”€β”€ yuce/
β”‚ β”‚ └── historical_backtest.py
β”‚ β”œβ”€β”€ get_akshare_date_2024-2025_x.py
β”‚ β”œβ”€β”€ get_date_new.py
β”‚ β”œβ”€β”€ prediction_akshare_2024-2025.py
β”‚ β”œβ”€β”€ prediction_batch_example.py
β”‚ β”œβ”€β”€ prediction_cn_markets_day.py
β”‚ β”œβ”€β”€ prediction_example.py
β”‚ β”œβ”€β”€ prediction_new.py
β”‚ β”œβ”€β”€ prediction_new_GUI.py
β”‚ β”œβ”€β”€ prediction_wo_vol_example.py
β”‚ └── run_backtest_kronos.py
└── finetune/
└── config.py</div></div></div></div>
<div class="tree-node"><div class="tree-toggle" onclick="toggleNode(this)"><i class="fa-solid fa-chevron-right"></i><span class="badge badge-tab">MODULE</span><span> ↳ Kronos-upstream/ πŸ”— 1r</span></div><div class="tree-content"><div class="info-card "><strong>πŸ“₯ Files</strong><div class="path-block">scratch/Kronos-upstream/examples/get_akshare_date_2024-2025_x.py</div>
<div class="path-block">scratch/Kronos-upstream/examples/get_date_new.py</div>
<div class="path-block">scratch/Kronos-upstream/examples/prediction_akshare_2024-2025.py</div>
<div class="path-block">scratch/Kronos-upstream/examples/prediction_batch_example.py</div>
<div class="path-block">scratch/Kronos-upstream/examples/prediction_cn_markets_day.py</div>
<div class="path-block">scratch/Kronos-upstream/examples/prediction_example.py</div>
<div class="path-block">scratch/Kronos-upstream/examples/prediction_new.py</div>
<div class="path-block">scratch/Kronos-upstream/examples/prediction_new_GUI.py</div></div><div class="info-card folder"><strong>πŸ“ Structure</strong><div class="path-block">└── scratch/
└── Kronos-upstream/
β”œβ”€β”€ examples/
β”‚ β”œβ”€β”€ yuce/
β”‚ β”‚ └── historical_backtest.py
β”‚ β”œβ”€β”€ get_akshare_date_2024-2025_x.py
β”‚ β”œβ”€β”€ get_date_new.py
β”‚ β”œβ”€β”€ prediction_akshare_2024-2025.py
β”‚ β”œβ”€β”€ prediction_batch_example.py
β”‚ β”œβ”€β”€ prediction_cn_markets_day.py
β”‚ β”œβ”€β”€ prediction_example.py
β”‚ β”œβ”€β”€ prediction_new.py
β”‚ β”œβ”€β”€ prediction_new_GUI.py
β”‚ β”œβ”€β”€ prediction_wo_vol_example.py
β”‚ └── run_backtest_kronos.py
└── finetune/
└── config.py</div></div></div></div>
<div class="tree-node"><div class="tree-toggle" onclick="toggleNode(this)"><i class="fa-solid fa-chevron-right"></i><span class="badge badge-tab">MODULE</span><span> ↳ tradingagents-audit/</span></div><div class="tree-content"><div class="info-card "><strong>πŸ“₯ Files</strong><div class="path-block">scratch/tradingagents-audit/cli/__init__.py</div>
<div class="path-block">scratch/tradingagents-audit/cli/announcements.py</div>
<div class="path-block">scratch/tradingagents-audit/cli/config.py</div>
<div class="path-block">scratch/tradingagents-audit/cli/main.py</div>
<div class="path-block">scratch/tradingagents-audit/cli/models.py</div>
<div class="path-block">scratch/tradingagents-audit/cli/stats_handler.py</div>
<div class="path-block">scratch/tradingagents-audit/cli/utils.py</div>
<div class="path-block">scratch/tradingagents-audit/docker-compose.yml</div></div><div class="info-card folder"><strong>πŸ“ Structure</strong><div class="path-block">└── scratch/
└── tradingagents-audit/
β”œβ”€β”€ cli/
β”‚ β”œβ”€β”€ __init__.py
β”‚ β”œβ”€β”€ announcements.py
β”‚ β”œβ”€β”€ config.py
β”‚ β”œβ”€β”€ main.py
β”‚ β”œβ”€β”€ models.py
β”‚ β”œβ”€β”€ stats_handler.py
β”‚ └── utils.py
β”œβ”€β”€ scripts/
β”‚ └── smoke_structured_output.py
β”œβ”€β”€ tests/
β”‚ └── conftest.py
β”œβ”€β”€ docker-compose.yml
β”œβ”€β”€ main.py
└── test.py</div></div></div></div>
<div class="tree-node"><div class="tree-toggle" onclick="toggleNode(this)"><i class="fa-solid fa-chevron-right"></i><span class="badge badge-tab">MODULE</span><span>backend/ β€” Overview</span></div><div class="tree-content"><div class="info-card "><strong>πŸ“₯ Files</strong><div class="path-block">backend/__init__.py</div>
<div class="path-block">backend/analysis_engine.py</div>
<div class="path-block">backend/analysis_report.py</div>
<div class="path-block">backend/api_facade.py</div>
<div class="path-block">backend/api_models.py</div>
<div class="path-block">backend/cache_utils.py</div>
<div class="path-block">backend/catalog_utils.py</div>
<div class="path-block">backend/forecast_service.py</div></div><div class="info-card folder"><strong>πŸ”„ Key Components</strong><ul><li><b>APIKeyPool</b> β€” class in <code>backend/main.py</code></li>
<li><b>CircuitBreaker</b> β€” class in <code>backend/main.py</code></li>
<li><b>ConnectionManager</b> β€” class in <code>backend/main.py</code></li>
<li><b>GlobalHTTPClient</b> β€” class in <code>backend/main.py</code></li>
<li><code>_ip_cleanup_loop</code> β€” function in <code>backend/main.py</code></li>
<li><code>_parse_timestamp</code> β€” function in <code>backend/main.py</code></li>
<li><code>_round</code> β€” function in <code>backend/main.py</code></li>
<li><code>_s</code> β€” function in <code>backend/main.py</code></li>
<li><code>_warmup_chronos</code> β€” function in <code>backend/main.py</code></li>
<li><code>clear_symbol_cache</code> β€” function in <code>backend/main.py</code></li>
<li><code>download_analysis_report</code> β€” function in <code>backend/main.py</code></li>
<li><code>fetch_binance</code> β€” function in <code>backend/main.py</code></li></ul></div><div class="info-card warning"><strong>πŸ“€ Cross-Layer Dependencies</strong><code>route_to_vendor</code></div><div class="info-card folder"><strong>πŸ“ Structure</strong><div class="path-block">└── backend/
β”œβ”€β”€ forecasting/
β”‚ └── __init__.py
β”œβ”€β”€ __init__.py
β”œβ”€β”€ analysis_engine.py
β”œβ”€β”€ analysis_report.py
β”œβ”€β”€ api_facade.py
β”œβ”€β”€ api_models.py
β”œβ”€β”€ cache_utils.py
β”œβ”€β”€ catalog_utils.py
β”œβ”€β”€ forecast_service.py
β”œβ”€β”€ forecast_worker_entry.py
β”œβ”€β”€ forecast_worker_protocol.py
└── forecast_worker_supervisor.py</div></div></div></div>
<div class="tree-node"><div class="tree-toggle" onclick="toggleNode(this)"><i class="fa-solid fa-chevron-right"></i><span class="badge badge-tab">MODULE</span><span> ↳ forecasting/</span></div><div class="tree-content"><div class="info-card "><strong>πŸ“₯ Files</strong><div class="path-block">backend/forecasting/__init__.py</div>
<div class="path-block">backend/forecasting/ai_score_utils.py</div>
<div class="path-block">backend/forecasting/config.py</div>
<div class="path-block">backend/forecasting/ohlc4_utils.py</div>
<div class="path-block">backend/forecasting/providers/__init__.py</div>
<div class="path-block">backend/forecasting/providers/chronos_provider.py</div>
<div class="path-block">backend/forecasting/providers/timesfm_provider.py</div>
<div class="path-block">backend/forecasting/rules.py</div></div><div class="info-card folder"><strong>πŸ“ Structure</strong><div class="path-block">└── backend/
└── forecasting/
β”œβ”€β”€ providers/
β”‚ β”œβ”€β”€ __init__.py
β”‚ β”œβ”€β”€ chronos_provider.py
β”‚ └── timesfm_provider.py
β”œβ”€β”€ __init__.py
β”œβ”€β”€ ai_score_utils.py
β”œβ”€β”€ config.py
β”œβ”€β”€ ohlc4_utils.py
β”œβ”€β”€ rules.py
└── runtime_availability.py</div></div></div></div>
<div class="tree-node"><div class="tree-toggle" onclick="toggleNode(this)"><i class="fa-solid fa-chevron-right"></i><span class="badge badge-tab">MODULE</span><span> ↳ kronos_core/</span></div><div class="tree-content"><div class="info-card "><strong>πŸ“₯ Files</strong><div class="path-block">backend/kronos_core/__init__.py</div>
<div class="path-block">backend/kronos_core/model/__init__.py</div>
<div class="path-block">backend/kronos_core/model/kronos.py</div>
<div class="path-block">backend/kronos_core/model/module.py</div></div><div class="info-card folder"><strong>πŸ“ Structure</strong><div class="path-block">└── backend/
└── kronos_core/
β”œβ”€β”€ model/
β”‚ β”œβ”€β”€ __init__.py
β”‚ β”œβ”€β”€ kronos.py
β”‚ └── module.py
└── __init__.py</div></div></div></div>
<div class="tree-node"><div class="tree-toggle" onclick="toggleNode(this)"><i class="fa-solid fa-chevron-right"></i><span class="badge badge-tab">MODULE</span><span>πŸ“„ Zero-Symbol Files</span></div><div class="tree-content"><div class="info-card "><strong>πŸ“₯ Files</strong><div class="path-block">libs/chronos-forecasting/.github/ISSUE_TEMPLATE/config.yml</div>
<div class="path-block">libs/chronos-forecasting/.github/workflows/ci.yml</div>
<div class="path-block">libs/chronos-forecasting/.github/workflows/eval-model.yml</div>
<div class="path-block">libs/chronos-forecasting/.github/workflows/publish-to-pypi.yml</div>
<div class="path-block">libs/chronos-forecasting/ci/evaluate/backtest_config.yaml</div>
<div class="path-block">libs/chronos-forecasting/scripts/evaluation/configs/in-domain.yaml</div>
<div class="path-block">libs/chronos-forecasting/scripts/evaluation/configs/zero-shot.yaml</div>
<div class="path-block">libs/chronos-forecasting/scripts/training/configs/chronos-gpt2.yaml</div></div><div class="info-card folder"><strong>πŸ“ Structure</strong><div class="path-block">└── libs/
└── chronos-forecasting/
β”œβ”€β”€ .github/
β”‚ β”œβ”€β”€ ISSUE_TEMPLATE/
β”‚ β”‚ └── config.yml
β”‚ └── workflows/
β”‚ β”œβ”€β”€ ci.yml
β”‚ β”œβ”€β”€ eval-model.yml
β”‚ └── publish-to-pypi.yml
β”œβ”€β”€ ci/
β”‚ └── evaluate/
β”‚ └── backtest_config.yaml
└── scripts/
β”œβ”€β”€ evaluation/
β”‚ └── configs/
β”‚ β”œβ”€β”€ in-domain.yaml
β”‚ └── zero-shot.yaml
└── training/
└── configs/
β”œβ”€β”€ chronos-gpt2.yaml
β”œβ”€β”€ chronos-t5-base.yaml
β”œβ”€β”€ chronos-t5-large.yaml
β”œβ”€β”€ chronos-t5-mini.yaml
└── chronos-t5-small.yaml</div></div></div></div>
<div class="tree-node"><div class="tree-toggle" onclick="toggleNode(this)"><i class="fa-solid fa-chevron-right"></i><span class="badge badge-seq">PIPELINE</span><span>Pipeline: scratch β†’ frontend β†’ backend</span></div><div class="tree-content"><div class="info-card queue"><strong>πŸ”„ Data Flow</strong><code>scratch</code> β†’ <code>frontend</code> β†’ <code>backend</code></div><div class="info-card "><strong>πŸ“Š Layers</strong>Cross-layer call chain detected from CodeGraph edges</div></div></div>
<div class="tree-node"><div class="tree-toggle" onclick="toggleNode(this)"><i class="fa-solid fa-chevron-right"></i><span class="badge badge-seq">PIPELINE</span><span>Pipeline: frontend β†’ backend β†’ scratch</span></div><div class="tree-content"><div class="info-card queue"><strong>πŸ”„ Data Flow</strong><code>frontend</code> β†’ <code>backend</code> β†’ <code>scratch</code></div><div class="info-card "><strong>πŸ“Š Layers</strong>Cross-layer call chain detected from CodeGraph edges</div></div></div>
<div class="tree-node"><div class="tree-toggle" onclick="toggleNode(this)"><i class="fa-solid fa-chevron-right"></i><span class="badge badge-seq">PIPELINE</span><span>Pipeline: frontend β†’ scratch β†’ backend</span></div><div class="tree-content"><div class="info-card queue"><strong>πŸ”„ Data Flow</strong><code>frontend</code> β†’ <code>scratch</code> β†’ <code>backend</code></div><div class="info-card "><strong>πŸ“Š Layers</strong>Cross-layer call chain detected from CodeGraph edges</div></div></div>
<div class="tree-node"><div class="tree-toggle" onclick="toggleNode(this)"><i class="fa-solid fa-chevron-right"></i><span class="badge badge-seq">PIPELINE</span><span>Pipeline: backend β†’ scratch β†’ frontend</span></div><div class="tree-content"><div class="info-card queue"><strong>πŸ”„ Data Flow</strong><code>backend</code> β†’ <code>scratch</code> β†’ <code>frontend</code></div><div class="info-card "><strong>πŸ“Š Layers</strong>Cross-layer call chain detected from CodeGraph edges</div></div></div>
<div class="tree-node"><div class="tree-toggle" onclick="toggleNode(this)"><i class="fa-solid fa-chevron-right"></i><span class="badge badge-ai">AI</span><span>πŸ€– AI / LLM Integration</span></div><div class="tree-content"><div class="info-card ai"><strong>🧠 Detected AI Components</strong><code>ADMIN_TOKEN</code>, <code>ADMIN_TOKEN_ENV_KEY</code>, <code>AIRuleDocument</code>, <code>AIRuleRegistry</code>, <code>AI_SCORE_FIELD_DEFAULTS</code>, <code>AI_SCORING_VERSION</code>, <code>AVAILABLE_MODELS</code>, <code>AnthropicClient</code>, <code>ApiModelsTests</code>, <code>AverageAiScoreFieldsTests</code>, <code>AzureOpenAIClient</code>, <code>BaseLLMClient</code>, <code>CHRONOS2_MODEL_MARKER</code>, <code>CHRONOS_AVAILABLE</code>, <code>Chronos2Model</code></div><div class="info-card ai"><strong>πŸ“ Integration Pattern</strong>AI/LLM calls detected via import analysis and symbol naming patterns</div></div></div>
<div class="tree-node"><div class="tree-toggle" onclick="toggleNode(this)"><i class="fa-solid fa-chevron-right"></i><span class="badge badge-queue">INTERVENTION</span><span>Manual Intervention Points</span></div><div class="tree-content"><div class="info-card warning"><strong>⚠ _retry</strong><code>backend/main.py</code> (line 1231) β€” function</div><div class="info-card warning"><strong>⚠ FX_PRIMARY_FALLBACK_SOURCES</strong><code>backend/main.py</code> (line 873) β€” variable</div><div class="info-card danger"><strong>⚠ TORCH_IMPORT_ERROR</strong><code>backend/main.py</code> (line 213) β€” variable</div><div class="info-card danger"><strong>⚠ TORCH_IMPORT_ERROR</strong><code>backend/main.py</code> (line 216) β€” variable</div><div class="info-card danger"><strong>⚠ AlphaVantageRateLimitError</strong><code>scratch/tradingagents-audit/tradingagents/dataflows/alpha_vantage_common.py</code> (line 38) β€” class</div><div class="info-card warning"><strong>⚠ test_crypto_dynamic_source_mappings_are_derived_for_hf_safe_fallbacks</strong><code>backend/test_api_regressions.py</code> (line 842) β€” method</div><div class="info-card warning"><strong>⚠ test_crypto_historical_fetch_on_hf_uses_hf_safe_fallback_first</strong><code>backend/test_api_regressions.py</code> (line 859) β€” method</div><div class="info-card danger"><strong>⚠ test_finalize_forecast_error_payload_omits_legacy_forecast_candles_field</strong><code>backend/test_api_regressions.py</code> (line 1684) β€” method</div></div></div>
<div class="tree-node"><div class="tree-toggle" onclick="toggleNode(this)"><i class="fa-solid fa-chevron-right"></i><span class="badge badge-entry">ENTRY</span><span>πŸš€ Application Entry Points</span></div><div class="tree-content"><div class="info-card entry"><strong>πŸ“‚ Entry Files</strong><div class="path-block">app.py</div></div><div class="info-card entry"><strong>πŸ“Š Count</strong>1 entry-point files detected</div></div></div>
<div class="tree-node"><div class="tree-toggle" onclick="toggleNode(this)"><i class="fa-solid fa-chevron-right"></i><span class="badge badge-entry">ENTRY</span><span>πŸš€ Application Entry Points</span></div><div class="tree-content"><div class="info-card entry"><strong>πŸ“‚ Entry Files</strong><div class="path-block">libs/chronos-forecasting/.github/ISSUE_TEMPLATE/config.yml</div>
<div class="path-block">libs/chronos-forecasting/.github/workflows/ci.yml</div>
<div class="path-block">libs/chronos-forecasting/.github/workflows/eval-model.yml</div>
<div class="path-block">libs/chronos-forecasting/.github/workflows/publish-to-pypi.yml</div>
<div class="path-block">libs/chronos-forecasting/ci/evaluate/backtest_config.yaml</div>
<div class="path-block">libs/chronos-forecasting/scripts/evaluation/configs/in-domain.yaml</div>
<div class="path-block">libs/chronos-forecasting/scripts/evaluation/configs/zero-shot.yaml</div>
<div class="path-block">libs/chronos-forecasting/scripts/training/configs/chronos-gpt2.yaml</div>
<div class="path-block">libs/chronos-forecasting/scripts/training/configs/chronos-t5-base.yaml</div>
<div class="path-block">libs/chronos-forecasting/scripts/training/configs/chronos-t5-large.yaml</div>
<div class="path-block">libs/chronos-forecasting/scripts/training/configs/chronos-t5-mini.yaml</div>
<div class="path-block">libs/chronos-forecasting/scripts/training/configs/chronos-t5-small.yaml</div></div><div class="info-card entry"><strong>πŸ“Š Count</strong>17 entry-point files detected</div></div></div>
<div class="tree-node"><div class="tree-toggle" onclick="toggleNode(this)"><i class="fa-solid fa-chevron-right"></i><span class="badge badge-folder">EXTERNAL</span><span>πŸ—„ Databases</span></div><div class="tree-content"><div class="info-card folder"><strong>Database Systems</strong><code>typeorm</code></div></div></div>
<div class="tree-node"><div class="tree-toggle" onclick="toggleNode(this)"><i class="fa-solid fa-chevron-right"></i><span class="badge badge-folder">EXTERNAL</span><span>πŸ€– AI/LLM Services</span></div><div class="tree-content"><div class="info-card folder"><strong>External AI APIs</strong><code>anthropic</code>, <code>deepseek</code>, <code>google_ai</code>, <code>huggingface</code>, <code>langchain</code>, <code>openai</code></div></div></div>
<div class="info-card success" style="margin:0.2rem 0">βœ… VALIDATION: <code>_validate_cache_target</code> β€” data validation in <code>backend/main.py</code></div>
<div class="info-card success" style="margin:0.2rem 0">βœ… VALIDATION: <code>_validate_symbol_and_interval</code> β€” data validation in <code>backend/main.py</code></div>
<div class="info-card success" style="margin:0.2rem 0">πŸ”— ROUTE: <code>DELETE /api/cache</code> β€” API endpoint in <code>backend/main.py</code></div>
<div class="info-card success" style="margin:0.2rem 0">πŸ”— ROUTE: <code>DELETE /api/cache/{symbol}/{interval}</code> β€” API endpoint in <code>backend/main.py</code></div>
<div class="info-card success" style="margin:0.2rem 0">πŸ”— ROUTE: <code>GET /api/ai/rules</code> β€” API endpoint in <code>backend/main.py</code></div>
<div class="info-card success" style="margin:0.2rem 0">πŸ”— ROUTE: <code>GET /api/analysis-report/{symbol}</code> β€” API endpoint in <code>backend/main.py</code></div>
<div class="info-card success" style="margin:0.2rem 0">πŸ”— ROUTE: <code>GET /api/analysis/{symbol}</code> β€” API endpoint in <code>backend/main.py</code></div>
<div class="info-card success" style="margin:0.2rem 0">πŸ”— ROUTE: <code>GET /api/backtest/{symbol}</code> β€” API endpoint in <code>backend/main.py</code></div>
<div class="info-card success" style="margin:0.2rem 0">πŸ”— ROUTE: <code>GET /api/cache/stats</code> β€” API endpoint in <code>backend/main.py</code></div>
<div class="info-card success" style="margin:0.2rem 0">πŸ”— ROUTE: <code>GET /api/forecast/{symbol}</code> β€” API endpoint in <code>backend/main.py</code></div>
<div class="info-card success" style="margin:0.2rem 0">πŸ”— ROUTE: <code>GET /api/forecasting/rules</code> β€” API endpoint in <code>backend/main.py</code></div>
<div class="info-card success" style="margin:0.2rem 0">πŸ”— ROUTE: <code>GET /api/health</code> β€” API endpoint in <code>backend/main.py</code></div>
<div class="info-card success" style="margin:0.2rem 0">πŸ”— ROUTE: <code>GET /api/historical/{symbol}</code> β€” API endpoint in <code>backend/main.py</code></div>
<div class="info-card success" style="margin:0.2rem 0">πŸ”— ROUTE: <code>GET /api/indicators/{symbol}</code> β€” API endpoint in <code>backend/main.py</code></div>
<div class="info-card success" style="margin:0.2rem 0">πŸ”— ROUTE: <code>GET /api/market-peers</code> β€” API endpoint in <code>backend/main.py</code></div>
</div>
</div>
</div>
<div class="main-layout">
<div class="panel full">
<div class="panel-title"><i class="fa-solid fa-cubes"></i> KiαΊΏn TrΓΊc Auto-Detect (9 layers)</div>
<div class="arch-grid">
<div class="arch-card arch-entry">
<div class="arch-card-header"><span>πŸš€ Entry Points</span><span class="arch-count">1 files</span></div>
<div class="arch-card-body">
<div class="arch-toggle open" onclick="toggleArchFiles(this)"><i class="fa-solid fa-chevron-down"></i> πŸ“‹ 1 files</div>
<div class="arch-full-list">
<button class="arch-copy-btn" onclick="copyArchFiles(this,'πŸš€ Entry Points')">πŸ“‹ Copy All</button>
<div><code>app.py</code></div>
</div>
</div>
</div>
<div class="arch-card arch-tab">
<div class="arch-card-header"><span>UI / Frontend β€” frontend/</span><span class="arch-count">5 files</span></div>
<div class="arch-card-body">
<div class="arch-toggle open" onclick="toggleArchFiles(this)"><i class="fa-solid fa-chevron-down"></i> πŸ“‹ 5 files</div>
<div class="arch-full-list">
<button class="arch-copy-btn" onclick="copyArchFiles(this,'UI / Frontend β€” frontend/')">πŸ“‹ Copy All</button>
<div><code>frontend/ai-session-runtime.js</code></div><div><code>frontend/analysis-runtime.js</code></div><div><code>frontend/app.js</code></div><div><code>frontend/forecast-models.js</code></div><div><code>frontend/workspace.js</code></div>
</div>
</div>
</div>
<div class="arch-card arch-folder">
<div class="arch-card-header"><span>[chronos-forecasting] Core / Business Logic β€” libs/</span><span class="arch-count">39 files</span></div>
<div class="arch-card-body">
<div class="arch-toggle open" onclick="toggleArchFiles(this)"><i class="fa-solid fa-chevron-down"></i> πŸ“‹ 39 files</div>
<div class="arch-full-list">
<button class="arch-copy-btn" onclick="copyArchFiles(this,'[chronos-forecasting] Core / Business Logic β€” libs/')">πŸ“‹ Copy All</button>
<div><code>libs/chronos-forecasting/.github/ISSUE_TEMPLATE/config.yml</code></div><div><code>libs/chronos-forecasting/.github/workflows/ci.yml</code></div><div><code>libs/chronos-forecasting/.github/workflows/eval-model.yml</code></div><div><code>libs/chronos-forecasting/.github/workflows/publish-to-pypi.yml</code></div><div><code>libs/chronos-forecasting/ci/evaluate/backtest_config.yaml</code></div><div><code>libs/chronos-forecasting/scripts/evaluation/agg-relative-score.py</code></div><div><code>libs/chronos-forecasting/scripts/evaluation/configs/in-domain.yaml</code></div><div><code>libs/chronos-forecasting/scripts/evaluation/configs/zero-shot.yaml</code></div><div><code>libs/chronos-forecasting/scripts/evaluation/evaluate.py</code></div><div><code>libs/chronos-forecasting/scripts/kernel-synth.py</code></div><div><code>libs/chronos-forecasting/scripts/training/configs/chronos-gpt2.yaml</code></div><div><code>libs/chronos-forecasting/scripts/training/configs/chronos-t5-base.yaml</code></div><div><code>libs/chronos-forecasting/scripts/training/configs/chronos-t5-large.yaml</code></div><div><code>libs/chronos-forecasting/scripts/training/configs/chronos-t5-mini.yaml</code></div><div><code>libs/chronos-forecasting/scripts/training/configs/chronos-t5-small.yaml</code></div><div><code>libs/chronos-forecasting/scripts/training/configs/chronos-t5-tiny.yaml</code></div><div><code>libs/chronos-forecasting/scripts/training/train.py</code></div><div><code>libs/chronos-forecasting/src/chronos/__about__.py</code></div><div><code>libs/chronos-forecasting/src/chronos/__init__.py</code></div><div><code>libs/chronos-forecasting/src/chronos/base.py</code></div>
<div style="color:var(--muted)">+ 19 more</div>
</div>
</div>
</div>
<div class="arch-card arch-folder">
<div class="arch-card-header"><span>[timesfm] Core / Business Logic β€” libs/</span><span class="arch-count">58 files</span></div>
<div class="arch-card-body">
<div class="arch-toggle open" onclick="toggleArchFiles(this)"><i class="fa-solid fa-chevron-down"></i> πŸ“‹ 58 files</div>
<div class="arch-full-list">
<button class="arch-copy-btn" onclick="copyArchFiles(this,'[timesfm] Core / Business Logic β€” libs/')">πŸ“‹ Copy All</button>
<div><code>libs/timesfm/.github/workflows/main.yml</code></div><div><code>libs/timesfm/.github/workflows/manual_publish.yml</code></div><div><code>libs/timesfm/src/timesfm/__init__.py</code></div><div><code>libs/timesfm/src/timesfm/configs.py</code></div><div><code>libs/timesfm/src/timesfm/flax/__init__.py</code></div><div><code>libs/timesfm/src/timesfm/flax/dense.py</code></div><div><code>libs/timesfm/src/timesfm/flax/normalization.py</code></div><div><code>libs/timesfm/src/timesfm/flax/transformer.py</code></div><div><code>libs/timesfm/src/timesfm/flax/util.py</code></div><div><code>libs/timesfm/src/timesfm/timesfm_2p5/timesfm_2p5_base.py</code></div><div><code>libs/timesfm/src/timesfm/timesfm_2p5/timesfm_2p5_flax.py</code></div><div><code>libs/timesfm/src/timesfm/timesfm_2p5/timesfm_2p5_torch.py</code></div><div><code>libs/timesfm/src/timesfm/torch/__init__.py</code></div><div><code>libs/timesfm/src/timesfm/torch/dense.py</code></div><div><code>libs/timesfm/src/timesfm/torch/normalization.py</code></div><div><code>libs/timesfm/src/timesfm/torch/transformer.py</code></div><div><code>libs/timesfm/src/timesfm/torch/util.py</code></div><div><code>libs/timesfm/src/timesfm/utils/xreg_lib.py</code></div><div><code>libs/timesfm/tests/__init__.py</code></div><div><code>libs/timesfm/tests/test_base_utils.py</code></div>
<div style="color:var(--muted)">+ 38 more</div>
</div>
</div>
</div>
<div class="arch-card arch-queue">
<div class="arch-card-header"><span>Infrastructure β€” scripts/</span><span class="arch-count">6 files</span></div>
<div class="arch-card-body">
<div class="arch-toggle open" onclick="toggleArchFiles(this)"><i class="fa-solid fa-chevron-down"></i> πŸ“‹ 6 files</div>
<div class="arch-full-list">
<button class="arch-copy-btn" onclick="copyArchFiles(this,'Infrastructure β€” scripts/')">πŸ“‹ Copy All</button>
<div><code>scripts/check_timesfm_env.py</code></div><div><code>scripts/patch_timesfm.py</code></div><div><code>scripts/playwright_smoke.js</code></div><div><code>scripts/scratch_cleanup.py</code></div><div><code>scripts/test_scratch_cleanup.py</code></div><div><code>scripts/verify_local.py</code></div>
</div>
</div>
</div>
<div class="arch-card arch-tab">
<div class="arch-card-header"><span>UI / Frontend β€” scratch/ 1r</span><span class="arch-count">107 files</span></div>
<div class="arch-card-body">
<div class="arch-toggle open" onclick="toggleArchFiles(this)"><i class="fa-solid fa-chevron-down"></i> πŸ“‹ 107 files</div>
<div class="arch-full-list">
<button class="arch-copy-btn" onclick="copyArchFiles(this,'UI / Frontend β€” scratch/ 1r')">πŸ“‹ Copy All</button>
<div><code>scratch/Kronos-upstream/examples/get_akshare_date_2024-2025_x.py</code></div><div><code>scratch/Kronos-upstream/examples/get_date_new.py</code></div><div><code>scratch/Kronos-upstream/examples/prediction_akshare_2024-2025.py</code></div><div><code>scratch/Kronos-upstream/examples/prediction_batch_example.py</code></div><div><code>scratch/Kronos-upstream/examples/prediction_cn_markets_day.py</code></div><div><code>scratch/Kronos-upstream/examples/prediction_example.py</code></div><div><code>scratch/Kronos-upstream/examples/prediction_new.py</code></div><div><code>scratch/Kronos-upstream/examples/prediction_new_GUI.py</code></div><div><code>scratch/Kronos-upstream/examples/prediction_wo_vol_example.py</code></div><div><code>scratch/Kronos-upstream/examples/run_backtest_kronos.py</code></div><div><code>scratch/Kronos-upstream/examples/yuce/historical_backtest.py</code></div><div><code>scratch/Kronos-upstream/finetune/config.py</code></div><div><code>scratch/Kronos-upstream/finetune/dataset.py</code></div><div><code>scratch/Kronos-upstream/finetune/qlib_data_preprocess.py</code></div><div><code>scratch/Kronos-upstream/finetune/qlib_test.py</code></div><div><code>scratch/Kronos-upstream/finetune/train_predictor.py</code></div><div><code>scratch/Kronos-upstream/finetune/train_tokenizer.py</code></div><div><code>scratch/Kronos-upstream/finetune/utils/__init__.py</code></div><div><code>scratch/Kronos-upstream/finetune/utils/training_utils.py</code></div><div><code>scratch/Kronos-upstream/finetune_csv/config_loader.py</code></div>
<div style="color:var(--muted)">+ 87 more</div>
</div>
</div>
</div>
<div class="arch-card arch-folder">
<div class="arch-card-header"><span>backend/</span><span class="arch-count">70 files</span></div>
<div class="arch-card-body">
<div class="arch-toggle open" onclick="toggleArchFiles(this)"><i class="fa-solid fa-chevron-down"></i> πŸ“‹ 70 files</div>
<div class="arch-full-list">
<button class="arch-copy-btn" onclick="copyArchFiles(this,'backend/')">πŸ“‹ Copy All</button>
<div><code>backend/__init__.py</code></div><div><code>backend/analysis_engine.py</code></div><div><code>backend/analysis_report.py</code></div><div><code>backend/api_facade.py</code></div><div><code>backend/api_models.py</code></div><div><code>backend/cache_utils.py</code></div><div><code>backend/catalog_utils.py</code></div><div><code>backend/forecast_service.py</code></div><div><code>backend/forecast_worker_entry.py</code></div><div><code>backend/forecast_worker_protocol.py</code></div><div><code>backend/forecast_worker_supervisor.py</code></div><div><code>backend/forecasting/__init__.py</code></div><div><code>backend/forecasting/ai_score_utils.py</code></div><div><code>backend/forecasting/config.py</code></div><div><code>backend/forecasting/ohlc4_utils.py</code></div><div><code>backend/forecasting/providers/__init__.py</code></div><div><code>backend/forecasting/providers/chronos_provider.py</code></div><div><code>backend/forecasting/providers/timesfm_provider.py</code></div><div><code>backend/forecasting/rules.py</code></div><div><code>backend/forecasting/runtime_availability.py</code></div>
<div style="color:var(--muted)">+ 50 more</div>
</div>
</div>
</div>
<div class="arch-card arch-folder">
<div class="arch-card-header"><span>.codegraph/</span><span class="arch-count">1 files</span></div>
<div class="arch-card-body">
<div class="arch-toggle open" onclick="toggleArchFiles(this)"><i class="fa-solid fa-chevron-down"></i> πŸ“‹ 1 files</div>
<div class="arch-full-list">
<button class="arch-copy-btn" onclick="copyArchFiles(this,'.codegraph/')">πŸ“‹ Copy All</button>
<div><code>.codegraph/cg_shim.py</code></div>
</div>
</div>
</div>
<div class="arch-card arch-entry">
<div class="arch-card-header"><span>πŸ“„ Zero-Symbol Files</span><span class="arch-count">17 files</span></div>
<div class="arch-card-body">
<div class="arch-toggle open" onclick="toggleArchFiles(this)"><i class="fa-solid fa-chevron-down"></i> πŸ“‹ 17 files</div>
<div class="arch-full-list">
<button class="arch-copy-btn" onclick="copyArchFiles(this,'πŸ“„ Zero-Symbol Files')">πŸ“‹ Copy All</button>
<div><code>libs/chronos-forecasting/.github/ISSUE_TEMPLATE/config.yml</code></div><div><code>libs/chronos-forecasting/.github/workflows/ci.yml</code></div><div><code>libs/chronos-forecasting/.github/workflows/eval-model.yml</code></div><div><code>libs/chronos-forecasting/.github/workflows/publish-to-pypi.yml</code></div><div><code>libs/chronos-forecasting/ci/evaluate/backtest_config.yaml</code></div><div><code>libs/chronos-forecasting/scripts/evaluation/configs/in-domain.yaml</code></div><div><code>libs/chronos-forecasting/scripts/evaluation/configs/zero-shot.yaml</code></div><div><code>libs/chronos-forecasting/scripts/training/configs/chronos-gpt2.yaml</code></div><div><code>libs/chronos-forecasting/scripts/training/configs/chronos-t5-base.yaml</code></div><div><code>libs/chronos-forecasting/scripts/training/configs/chronos-t5-large.yaml</code></div><div><code>libs/chronos-forecasting/scripts/training/configs/chronos-t5-mini.yaml</code></div><div><code>libs/chronos-forecasting/scripts/training/configs/chronos-t5-small.yaml</code></div><div><code>libs/chronos-forecasting/scripts/training/configs/chronos-t5-tiny.yaml</code></div><div><code>libs/timesfm/.github/workflows/main.yml</code></div><div><code>libs/timesfm/.github/workflows/manual_publish.yml</code></div><div><code>scratch/Kronos-upstream/finetune_csv/configs/config_ali09988_candle-5min.yaml</code></div><div><code>scratch/tradingagents-audit/docker-compose.yml</code></div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="main-layout">
<div class="panel full">
<div class="panel-title"><i class="fa-solid fa-folder-open"></i> File Tree</div>
<div class="file-tree-container"><ul><li class="tree-leaf"><span class="tree-file py">app.py</span> <span class="tree-meta">8 syms</span></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">.codegraph/ <span class="tree-meta">(1)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-file py">cg_shim.py</span> <span class="tree-meta">16 syms</span></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">backend/ <span class="tree-meta">(70)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-file py">__init__.py</span> <span class="tree-meta">1 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">analysis_engine.py</span> <span class="tree-meta">119 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">analysis_report.py</span> <span class="tree-meta">34 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">api_facade.py</span> <span class="tree-meta">4 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">api_models.py</span> <span class="tree-meta">5 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">cache_utils.py</span> <span class="tree-meta">28 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">catalog_utils.py</span> <span class="tree-meta">8 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">forecast_service.py</span> <span class="tree-meta">30 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">forecast_worker_entry.py</span> <span class="tree-meta">13 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">forecast_worker_protocol.py</span> <span class="tree-meta">7 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">forecast_worker_supervisor.py</span> <span class="tree-meta">40 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">frontend_assets.py</span> <span class="tree-meta">20 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">kronos_adapter.py</span> <span class="tree-meta">39 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">launcher.py</span> <span class="tree-meta">35 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">main.py</span> <span class="tree-meta">378 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">market_data_contracts.py</span> <span class="tree-meta">13 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">market_utils.py</span> <span class="tree-meta">5 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">observability_utils.py</span> <span class="tree-meta">13 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">price_sanity.py</span> <span class="tree-meta">14 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">runtime_utils.py</span> <span class="tree-meta">34 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">security_utils.py</span> <span class="tree-meta">12 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">server_runtime.py</span> <span class="tree-meta">18 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">startup_utils.py</span> <span class="tree-meta">15 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">symbol_utils.py</span> <span class="tree-meta">5 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">system_integration.py</span> <span class="tree-meta">35 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_ai_score_utils.py</span> <span class="tree-meta">6 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_api_models.py</span> <span class="tree-meta">8 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_api_regressions.py</span> <span class="tree-meta">121 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_cache_utils.py</span> <span class="tree-meta">16 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_catalog_utils.py</span> <span class="tree-meta">8 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_chronos_provider.py</span> <span class="tree-meta">22 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_env_example_contract.py</span> <span class="tree-meta">7 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_forecast_service.py</span> <span class="tree-meta">32 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_frontend_assets.py</span> <span class="tree-meta">15 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_frontend_resource_contract.py</span> <span class="tree-meta">7 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_frontend_static_contract.py</span> <span class="tree-meta">28 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_kronos_meta_compat.py</span> <span class="tree-meta">8 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_launcher.py</span> <span class="tree-meta">17 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_market_utils.py</span> <span class="tree-meta">6 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_observability_utils.py</span> <span class="tree-meta">7 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_ohlc4_utils.py</span> <span class="tree-meta">11 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_playwright_smoke_contract.py</span> <span class="tree-meta">11 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_price_sanity.py</span> <span class="tree-meta">5 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_runtime_health_contract.py</span> <span class="tree-meta">8 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_runtime_resource_contract.py</span> <span class="tree-meta">13 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_runtime_unavailable_messages.py</span> <span class="tree-meta">12 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_runtime_utils.py</span> <span class="tree-meta">16 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_security_utils.py</span> <span class="tree-meta">14 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_server_runtime.py</span> <span class="tree-meta">23 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_startup_utils.py</span> <span class="tree-meta">22 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_static_quality_contract.py</span> <span class="tree-meta">9 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_symbol_utils.py</span> <span class="tree-meta">9 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_system_integration.py</span> <span class="tree-meta">12 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_timesfm_env.py</span> <span class="tree-meta">11 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_timesfm_provider.py</span> <span class="tree-meta">19 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_timesfm_setup_contract.py</span> <span class="tree-meta">8 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">timesfm_env.py</span> <span class="tree-meta">18 syms</span></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">forecasting/ <span class="tree-meta">(9)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-file py">__init__.py</span> <span class="tree-meta">4 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">ai_score_utils.py</span> <span class="tree-meta">5 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">config.py</span> <span class="tree-meta">9 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">ohlc4_utils.py</span> <span class="tree-meta">12 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">rules.py</span> <span class="tree-meta">10 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">runtime_availability.py</span> <span class="tree-meta">3 syms</span></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">providers/ <span class="tree-meta">(3)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-file py">__init__.py</span> <span class="tree-meta">4 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">chronos_provider.py</span> <span class="tree-meta">51 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">timesfm_provider.py</span> <span class="tree-meta">42 syms</span></li></ul></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">kronos_core/ <span class="tree-meta">(4)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-file py">__init__.py</span> <span class="tree-meta">1 syms</span></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">model/ <span class="tree-meta">(3)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-file py">__init__.py</span> <span class="tree-meta">4 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">kronos.py</span> <span class="tree-meta">34 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">module.py</span> <span class="tree-meta">67 syms</span></li></ul></li></ul></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">frontend/ <span class="tree-meta">(5)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-file js">ai-session-runtime.js</span> <span class="tree-meta">26 syms</span></li>
<li class="tree-leaf"><span class="tree-file js">analysis-runtime.js</span> <span class="tree-meta">13 syms</span></li>
<li class="tree-leaf"><span class="tree-file js">app.js</span> <span class="tree-meta">288 syms</span></li>
<li class="tree-leaf"><span class="tree-file js">forecast-models.js</span> <span class="tree-meta">4 syms</span></li>
<li class="tree-leaf"><span class="tree-file js">workspace.js</span> <span class="tree-meta">55 syms</span></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">libs/ <span class="tree-meta">(97)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">chronos-forecasting/ <span class="tree-meta">(39)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">.github/ <span class="tree-meta">(4)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">ISSUE_TEMPLATE/ <span class="tree-meta">(1)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-file yaml">config.yml</span></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">workflows/ <span class="tree-meta">(3)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-file yaml">ci.yml</span></li>
<li class="tree-leaf"><span class="tree-file yaml">eval-model.yml</span></li>
<li class="tree-leaf"><span class="tree-file yaml">publish-to-pypi.yml</span></li></ul></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">ci/ <span class="tree-meta">(1)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">evaluate/ <span class="tree-meta">(1)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-file yaml">backtest_config.yaml</span></li></ul></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">scripts/ <span class="tree-meta">(12)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-file py">kernel-synth.py</span> <span class="tree-meta">21 syms</span></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">evaluation/ <span class="tree-meta">(4)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-file py">agg-relative-score.py</span> <span class="tree-meta">9 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">evaluate.py</span> <span class="tree-meta">27 syms</span></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">configs/ <span class="tree-meta">(2)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-meta">(2 files -- depth limit)</span></li></ul></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">training/ <span class="tree-meta">(7)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-file py">train.py</span> <span class="tree-meta">51 syms</span></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">configs/ <span class="tree-meta">(6)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-meta">(6 files -- depth limit)</span></li></ul></li></ul></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">src/ <span class="tree-meta">(15)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">chronos/ <span class="tree-meta">(15)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-file py">__about__.py</span> <span class="tree-meta">2 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">__init__.py</span> <span class="tree-meta">7 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">base.py</span> <span class="tree-meta">26 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">boto_utils.py</span> <span class="tree-meta">16 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">chronos.py</span> <span class="tree-meta">39 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">chronos_bolt.py</span> <span class="tree-meta">41 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">df_utils.py</span> <span class="tree-meta">9 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">utils.py</span> <span class="tree-meta">7 syms</span></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">chronos2/ <span class="tree-meta">(7)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-meta">(7 files -- depth limit)</span></li></ul></li></ul></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">test/ <span class="tree-meta">(7)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-file py">__init__.py</span> <span class="tree-meta">1 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_chronos.py</span> <span class="tree-meta">22 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_chronos2.py</span> <span class="tree-meta">47 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_chronos_bolt.py</span> <span class="tree-meta">27 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_df_utils.py</span> <span class="tree-meta">22 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_utils.py</span> <span class="tree-meta">6 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">util.py</span> <span class="tree-meta">12 syms</span></li></ul></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">timesfm/ <span class="tree-meta">(58)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">.github/ <span class="tree-meta">(2)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">workflows/ <span class="tree-meta">(2)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-file yaml">main.yml</span></li>
<li class="tree-leaf"><span class="tree-file yaml">manual_publish.yml</span></li></ul></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">src/ <span class="tree-meta">(16)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">timesfm/ <span class="tree-meta">(16)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-file py">__init__.py</span> <span class="tree-meta">6 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">configs.py</span> <span class="tree-meta">8 syms</span></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">flax/ <span class="tree-meta">(5)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-meta">(5 files -- depth limit)</span></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">timesfm_2p5/ <span class="tree-meta">(3)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-meta">(3 files -- depth limit)</span></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">torch/ <span class="tree-meta">(5)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-meta">(5 files -- depth limit)</span></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">utils/ <span class="tree-meta">(1)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-meta">(1 files -- depth limit)</span></li></ul></li></ul></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">tests/ <span class="tree-meta">(5)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-file py">__init__.py</span> <span class="tree-meta">1 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_base_utils.py</span> <span class="tree-meta">21 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_configs.py</span> <span class="tree-meta">18 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_torch_layers.py</span> <span class="tree-meta">24 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_torch_utils.py</span> <span class="tree-meta">25 syms</span></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">timesfm-forecasting/ <span class="tree-meta">(10)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">examples/ <span class="tree-meta">(8)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">anomaly-detection/ <span class="tree-meta">(1)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-meta">(1 files -- depth limit)</span></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">covariates-forecasting/ <span class="tree-meta">(1)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-meta">(1 files -- depth limit)</span></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">finetuning/ <span class="tree-meta">(1)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-meta">(1 files -- depth limit)</span></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">global-temperature/ <span class="tree-meta">(5)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-meta">(5 files -- depth limit)</span></li></ul></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">scripts/ <span class="tree-meta">(2)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-file py">check_system.py</span> <span class="tree-meta">35 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">forecast_csv.py</span> <span class="tree-meta">14 syms</span></li></ul></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">v1/ <span class="tree-meta">(25)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">experiments/ <span class="tree-meta">(6)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">baselines/ <span class="tree-meta">(2)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-meta">(2 files -- depth limit)</span></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">extended_benchmarks/ <span class="tree-meta">(3)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-meta">(3 files -- depth limit)</span></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">long_horizon_benchmarks/ <span class="tree-meta">(1)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-meta">(1 files -- depth limit)</span></li></ul></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">peft/ <span class="tree-meta">(1)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-file py">finetune.py</span> <span class="tree-meta">38 syms</span></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">src/ <span class="tree-meta">(16)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">adapter/ <span class="tree-meta">(4)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-meta">(4 files -- depth limit)</span></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">finetuning/ <span class="tree-meta">(3)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-meta">(3 files -- depth limit)</span></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">timesfm/ <span class="tree-meta">(9)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-meta">(9 files -- depth limit)</span></li></ul></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">tests/ <span class="tree-meta">(2)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-file py">test_data_loader.py</span> <span class="tree-meta">6 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_timesfm.py</span> <span class="tree-meta">8 syms</span></li></ul></li></ul></li></ul></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">scratch/ <span class="tree-meta">(107)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">Kronos-upstream/ <span class="tree-meta">(31)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">examples/ <span class="tree-meta">(11)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-file py">get_akshare_date_2024-2025_x.py</span> <span class="tree-meta">21 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">get_date_new.py</span> <span class="tree-meta">19 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">prediction_akshare_2024-2025.py</span> <span class="tree-meta">17 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">prediction_batch_example.py</span> <span class="tree-meta">19 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">prediction_cn_markets_day.py</span> <span class="tree-meta">26 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">prediction_example.py</span> <span class="tree-meta">17 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">prediction_new.py</span> <span class="tree-meta">44 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">prediction_new_GUI.py</span> <span class="tree-meta">66 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">prediction_wo_vol_example.py</span> <span class="tree-meta">17 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">run_backtest_kronos.py</span> <span class="tree-meta">18 syms</span></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">yuce/ <span class="tree-meta">(1)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-file py">historical_backtest.py</span> <span class="tree-meta">18 syms</span></li></ul></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">finetune/ <span class="tree-meta">(8)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-file py">config.py</span> <span class="tree-meta">5 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">dataset.py</span> <span class="tree-meta">13 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">qlib_data_preprocess.py</span> <span class="tree-meta">17 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">qlib_test.py</span> <span class="tree-meta">34 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">train_predictor.py</span> <span class="tree-meta">20 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">train_tokenizer.py</span> <span class="tree-meta">23 syms</span></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">utils/ <span class="tree-meta">(2)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-file py">__init__.py</span> <span class="tree-meta">1 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">training_utils.py</span> <span class="tree-meta">13 syms</span></li></ul></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">finetune_csv/ <span class="tree-meta">(5)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-file py">config_loader.py</span> <span class="tree-meta">26 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">finetune_base_model.py</span> <span class="tree-meta">32 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">finetune_tokenizer.py</span> <span class="tree-meta">27 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">train_sequential.py</span> <span class="tree-meta">23 syms</span></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">configs/ <span class="tree-meta">(1)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-file yaml">config_ali09988_candle-5min.yaml</span></li></ul></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">model/ <span class="tree-meta">(3)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-file py">__init__.py</span> <span class="tree-meta">4 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">kronos.py</span> <span class="tree-meta">29 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">module.py</span> <span class="tree-meta">67 syms</span></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">tests/ <span class="tree-meta">(2)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-file py">test_kronos_regression.py</span> <span class="tree-meta">30 syms</span></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">data/ <span class="tree-meta">(1)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-file py">generate_regression_output.py</span> <span class="tree-meta">21 syms</span></li></ul></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">webui/ <span class="tree-meta">(2)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-file py">app.py</span> <span class="tree-meta">39 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">run.py</span> <span class="tree-meta">9 syms</span></li></ul></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">tradingagents-audit/ <span class="tree-meta">(76)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-file yaml">docker-compose.yml</span></li>
<li class="tree-leaf"><span class="tree-file py">main.py</span> <span class="tree-meta">6 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test.py</span> <span class="tree-meta">6 syms</span></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">cli/ <span class="tree-meta">(7)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-file py">__init__.py</span> <span class="tree-meta">1 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">announcements.py</span> <span class="tree-meta">8 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">config.py</span> <span class="tree-meta">2 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">main.py</span> <span class="tree-meta">67 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">models.py</span> <span class="tree-meta">5 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">stats_handler.py</span> <span class="tree-meta">13 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">utils.py</span> <span class="tree-meta">26 syms</span></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">scripts/ <span class="tree-meta">(1)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-file py">smoke_structured_output.py</span> <span class="tree-meta">16 syms</span></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">tests/ <span class="tree-meta">(10)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-file py">conftest.py</span> <span class="tree-meta">8 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_checkpoint_resume.py</span> <span class="tree-meta">19 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_deepseek_reasoning.py</span> <span class="tree-meta">22 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_google_api_key.py</span> <span class="tree-meta">7 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_memory_log.py</span> <span class="tree-meta">87 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_model_validation.py</span> <span class="tree-meta">15 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_safe_ticker_component.py</span> <span class="tree-meta">13 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_signal_processing.py</span> <span class="tree-meta">18 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_structured_agents.py</span> <span class="tree-meta">25 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_ticker_symbol_handling.py</span> <span class="tree-meta">8 syms</span></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">tradingagents/ <span class="tree-meta">(55)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-file py">__init__.py</span> <span class="tree-meta">1 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">default_config.py</span> <span class="tree-meta">4 syms</span></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">agents/ <span class="tree-meta">(23)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-file py">__init__.py</span> <span class="tree-meta">16 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">schemas.py</span> <span class="tree-meta">12 syms</span></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">analysts/ <span class="tree-meta">(4)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-meta">(4 files -- depth limit)</span></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">managers/ <span class="tree-meta">(2)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-meta">(2 files -- depth limit)</span></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">researchers/ <span class="tree-meta">(2)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-meta">(2 files -- depth limit)</span></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">risk_mgmt/ <span class="tree-meta">(3)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-meta">(3 files -- depth limit)</span></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">trader/ <span class="tree-meta">(1)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-meta">(1 files -- depth limit)</span></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">utils/ <span class="tree-meta">(9)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-meta">(9 files -- depth limit)</span></li></ul></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">dataflows/ <span class="tree-meta">(13)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-file py">__init__.py</span> <span class="tree-meta">1 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">alpha_vantage.py</span> <span class="tree-meta">5 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">alpha_vantage_common.py</span> <span class="tree-meta">13 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">alpha_vantage_fundamentals.py</span> <span class="tree-meta">7 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">alpha_vantage_indicator.py</span> <span class="tree-meta">3 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">alpha_vantage_news.py</span> <span class="tree-meta">5 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">alpha_vantage_stock.py</span> <span class="tree-meta">4 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">config.py</span> <span class="tree-meta">7 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">interface.py</span> <span class="tree-meta">13 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">stockstats_utils.py</span> <span class="tree-meta">18 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">utils.py</span> <span class="tree-meta">15 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">y_finance.py</span> <span class="tree-meta">17 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">yfinance_news.py</span> <span class="tree-meta">8 syms</span></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">graph/ <span class="tree-meta">(8)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-file py">__init__.py</span> <span class="tree-meta">8 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">checkpointer.py</span> <span class="tree-meta">15 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">conditional_logic.py</span> <span class="tree-meta">10 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">propagation.py</span> <span class="tree-meta">7 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">reflection.py</span> <span class="tree-meta">6 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">setup.py</span> <span class="tree-meta">10 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">signal_processing.py</span> <span class="tree-meta">6 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">trading_graph.py</span> <span class="tree-meta">34 syms</span></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">llm_clients/ <span class="tree-meta">(9)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-file py">__init__.py</span> <span class="tree-meta">4 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">anthropic_client.py</span> <span class="tree-meta">12 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">azure_client.py</span> <span class="tree-meta">13 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">base_client.py</span> <span class="tree-meta">11 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">factory.py</span> <span class="tree-meta">5 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">google_client.py</span> <span class="tree-meta">11 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">model_catalog.py</span> <span class="tree-meta">7 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">openai_client.py</span> <span class="tree-meta">21 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">validators.py</span> <span class="tree-meta">4 syms</span></li></ul></li></ul></li></ul></li></ul></li>
<li class="tree-branch"><span class="dir-toggle" onclick="toggleDir(this)"><i class="fa-solid fa-chevron-right"></i><span class="dir-name">scripts/ <span class="tree-meta">(6)</span></span></span><ul class="dir-children" style="display:none"><li class="tree-leaf"><span class="tree-file py">check_timesfm_env.py</span> <span class="tree-meta">6 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">patch_timesfm.py</span> <span class="tree-meta">13 syms</span></li>
<li class="tree-leaf"><span class="tree-file js">playwright_smoke.js</span> <span class="tree-meta">15 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">scratch_cleanup.py</span> <span class="tree-meta">31 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">test_scratch_cleanup.py</span> <span class="tree-meta">21 syms</span></li>
<li class="tree-leaf"><span class="tree-file py">verify_local.py</span> <span class="tree-meta">13 syms</span></li></ul></li></ul></div>
</div>
</div>
<div class="toast" id="toast"></div>
<script>
var zoom=1.0,panX=0,panY=0,MAX_ZOOM=5.0,MIN_ZOOM=0.3,ZOOM_STEP=0.25,isPanning=false,startX=0,startY=0,activeDiagram=0;
var totalDiagrams=1;
var allWraps=[],allInners=[],allSvgs=[];
function init(){
for(var i=0;i<totalDiagrams;i++){
var w=document.getElementById('diagramWrap'+i),inn=document.getElementById('diagramInner'+i);
if(w&&inn){allWraps.push(w);allInners.push(inn);setupPanZoom(w,i);}
}
setTimeout(function(){
var nodes=document.querySelectorAll('.tree-root .tree-toggle');
for(var j=0;j<Math.min(5,nodes.length);j++)toggleNode(nodes[j]);
var top=document.querySelectorAll('.file-tree-container>ul>.tree-branch');
for(var k=0;k<Math.min(5,top.length);k++){var t=top[k].querySelector('.dir-toggle');if(t)toggleDir(t);}
},500);
document.addEventListener('keydown',onGlobalKey);
}
function setupPanZoom(wrap,idx){
wrap.addEventListener('wheel',function(e){onWheel(e);},{passive:false});
wrap.addEventListener('mousedown',function(e){onPanStart(e);});
window.addEventListener('mousemove',function(e){onPanMove(e);});
window.addEventListener('mouseup',onPanEnd);
}
function waitForSvg(inner,cb){var s=inner.querySelector('svg');if(s){cb(s);return}var obs=new MutationObserver(function(ms,o){var s=inner.querySelector('svg');if(s){o.disconnect();cb(s)}});obs.observe(inner,{childList:true,subtree:true});setTimeout(function(){obs.disconnect();var s=inner.querySelector('svg');if(s)cb(s)},3000)}
function collectSvgs(){allSvgs=[];for(var i=0;i<allInners.length;i++){var s=allInners[i].querySelectorAll('svg');for(var j=0;j<s.length;j++)allSvgs.push(s[j])}}
function applyTransform(){for(var i=0;i<allInners.length;i++)allInners[i].style.transform='translate('+panX+'px,'+panY+'px)';for(var j=0;j<allSvgs.length;j++){allSvgs[j].style.transform='scale('+zoom+')';allSvgs[j].style.transformOrigin='0 0'}var d=document.getElementById('zoomLevel');if(d)d.textContent=Math.round(zoom*100)+'%'}
function onWheel(e){e.preventDefault();var wrap=allWraps[activeDiagram]||allWraps[0];if(!wrap)return;var rect=wrap.getBoundingClientRect(),mx=e.clientX-rect.left,my=e.clientY-rect.top,old=zoom;if(e.deltaY<0)zoom=Math.min(MAX_ZOOM,zoom+ZOOM_STEP);else zoom=Math.max(MIN_ZOOM,zoom-ZOOM_STEP);var ratio=zoom/old;panX=mx-ratio*(mx-panX);panY=my-ratio*(my-panY);applyTransform()}
function onPanStart(e){if(e.target.closest('button,.zoom-group'))return;isPanning=true;startX=e.clientX-panX;startY=e.clientY-panY;var wrap=allWraps[activeDiagram]||allWraps[0];if(wrap)wrap.classList.add('panning');e.preventDefault()}
function onPanMove(e){if(!isPanning)return;panX=e.clientX-startX;panY=e.clientY-startY;applyTransform()}
function onPanEnd(){isPanning=false;for(var i=0;i<allWraps.length;i++)allWraps[i].classList.remove('panning')}
function zoomIn(){if(zoom<MAX_ZOOM){zoom=Math.min(MAX_ZOOM,zoom+ZOOM_STEP);applyTransform()}}
function zoomOut(){if(zoom>MIN_ZOOM){zoom=Math.max(MIN_ZOOM,zoom-ZOOM_STEP);applyTransform()}}
function zoomReset(){zoom=1.0;panX=0;panY=0;applyTransform()}
function switchDiagram(idx){activeDiagram=idx;for(var i=0;i<totalDiagrams;i++){var p=document.getElementById('diagramPanel'+i);if(p)p.classList.toggle('active',i===idx)}var tabs=document.querySelectorAll('.diagram-tab');for(var j=0;j<tabs.length;j++)tabs[j].classList.toggle('active',j===idx);zoom=1.0;panX=0;panY=0;setTimeout(function(){collectSvgs();applyTransform()},200)}
function toggleNode(el){el.classList.toggle('active');var c=el.nextElementSibling;if(c)c.classList.toggle('show')}
function toggleDir(el){el.classList.toggle('expanded');var c=el.nextElementSibling;if(c)c.style.display=c.style.display==='none'?'block':'none'}
function toggleArchFiles(el){el.classList.toggle('open');var list=el.nextElementSibling;if(list)list.style.display=el.classList.contains('open')?'block':'none'}
function expandAll(){document.querySelectorAll('.tree-toggle').forEach(function(t){if(!t.classList.contains('active'))toggleNode(t)});document.querySelectorAll('.dir-toggle').forEach(function(d){if(!d.classList.contains('expanded'))toggleDir(d)});document.querySelectorAll('.arch-toggle').forEach(function(a){if(!a.classList.contains('open'))toggleArchFiles(a)});toastMsg('All nodes expanded')}
function collapseAll(){document.querySelectorAll('.tree-toggle.active').forEach(function(t){toggleNode(t)});document.querySelectorAll('.dir-toggle.expanded').forEach(function(d){toggleDir(d)});document.querySelectorAll('.arch-toggle.open').forEach(function(a){toggleArchFiles(a)});toastMsg('All nodes collapsed')}
function copyArchFiles(btn,label){var list=btn.parentElement,codes=list.querySelectorAll('code'),paths=[];for(var i=0;i<codes.length;i++)paths.push(codes[i].textContent);navigator.clipboard.writeText(paths.join('\n')).then(function(){btn.textContent='βœ… Copied!';btn.classList.add('copied');setTimeout(function(){btn.textContent='πŸ“‹ Copy All';btn.classList.remove('copied')},2000)}).catch(function(){var ta=document.createElement('textarea');ta.value=paths.join('\n');ta.style.position='fixed';ta.style.opacity='0';document.body.appendChild(ta);ta.select();document.execCommand('copy');document.body.removeChild(ta);btn.textContent='βœ… Copied!';btn.classList.add('copied');setTimeout(function(){btn.textContent='πŸ“‹ Copy All';btn.classList.remove('copied')},2000)})}
function onSearch(val){var clear=document.getElementById('searchClear');if(clear)clear.classList.toggle('visible',val.length>0);var q=val.toLowerCase().trim();if(!q){clearFilter();return}
document.querySelectorAll('.tree-leaf,.tree-branch,.arch-card,.info-card,.tree-node').forEach(function(el){el.classList.toggle('filtered',!el.textContent.toLowerCase().includes(q))});
document.querySelectorAll('.api-table tbody tr').forEach(function(el){el.classList.toggle('filtered',!el.textContent.toLowerCase().includes(q))})}
function clearFilter(){document.getElementById('globalSearch').value='';document.getElementById('searchClear').classList.remove('visible');document.querySelectorAll('.filtered').forEach(function(el){el.classList.remove('filtered')})}
function clearSearch(){clearFilter();document.getElementById('globalSearch').focus()}
function onSearchKey(e){if(e.key==='Escape')clearSearch()}
function toggleTheme(){var html=document.documentElement,current=html.getAttribute('data-theme'),next=current==='dark'?'light':'dark';html.setAttribute('data-theme',next);localStorage.setItem('codegraph-theme',next);try{mermaid.initialize({theme:next==='dark'?'dark':'default',securityLevel:'loose',flowchart:{useMaxWidth:true,htmlLabels:true,curve:'cardinal'}})}catch(e){};setTimeout(function(){collectSvgs();applyTransform()},100);toastMsg('Theme: '+next)}
function exportJSON(){var data={project_name:'AI Forecast',generation_time:'2026-06-22 08:58:12'};downloadFile('workflow_tree.json','application/json',JSON.stringify(data,null,2));toastMsg('JSON exported')}
function exportMarkdown(){var md='# Workflow Tree β€” AI Forecast\n\nGenerated: 2026-06-22 08:58:12\n\n## Statistics\n- Files: 287\n- Symbols: 5435\n- Imports: 1562\n- Edges: 13503\n';downloadFile('workflow_tree.md','text/markdown',md);toastMsg('Markdown exported')}
function exportPNG(){var svg=allSvgs[0];if(!svg){toastMsg('No diagram to export');return}var svgData=new XMLSerializer().serializeToString(svg),canvas=document.createElement('canvas'),ctx=canvas.getContext('2d'),img=new Image();img.onload=function(){canvas.width=img.width*2;canvas.height=img.height*2;ctx.scale(2,2);ctx.drawImage(img,0,0);canvas.toBlob(function(blob){var url=URL.createObjectURL(blob),a=document.createElement('a');a.href=url;a.download='workflow_diagram.png';a.click();URL.revokeObjectURL(url);toastMsg('PNG exported')},'image/png')};img.src='data:image/svg+xml;base64,'+btoa(unescape(encodeURIComponent(svgData)))}
function downloadFile(name,mime,content){var blob=new Blob([content],{type:mime}),url=URL.createObjectURL(blob),a=document.createElement('a');a.href=url;a.download=name;a.click();URL.revokeObjectURL(url)}
function toggleDropdown(id){var menu=document.getElementById(id),wasOpen=menu.classList.contains('show');document.querySelectorAll('.dropdown-menu.show').forEach(function(m){m.classList.remove('show')});if(!wasOpen)menu.classList.add('show')}
function toastMsg(msg){var el=document.getElementById('toast');el.textContent=msg;el.classList.add('show');clearTimeout(el._timeout);el._timeout=setTimeout(function(){el.classList.remove('show')},2000)}
function onGlobalKey(e){if(e.target.tagName==='INPUT'||e.target.tagName==='TEXTAREA'){if(e.key==='Escape'){e.target.blur();clearFilter()}return}switch(e.key){case '/':e.preventDefault();document.getElementById('globalSearch').focus();break;case 't':case 'T':toggleTheme();break;case 'f':case 'F':if(e.shiftKey)collapseAll();else expandAll();break;case 'r':case 'R':zoomReset();break;case 'Escape':clearFilter();break}}
document.addEventListener('click',function(e){if(!e.target.closest('.dropdown'))document.querySelectorAll('.dropdown-menu.show').forEach(function(m){m.classList.remove('show')})});
(function(){var saved=localStorage.getItem('codegraph-theme');if(saved)document.documentElement.setAttribute('data-theme',saved)})();
document.addEventListener('DOMContentLoaded',function(){init();waitForSvg(allInners[0]||document.getElementById('diagramInner0'),function(){collectSvgs();applyTransform()})});
</script>
</body>
</html>