py-backlight 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- backlight/__init__.py +14 -0
- backlight/_gui/assets/AccountView-CbigG0KS.js +1 -0
- backlight/_gui/assets/AccountView-DnAwP8fS.css +1 -0
- backlight/_gui/assets/BacktestLabView-DRPXydD8.css +1 -0
- backlight/_gui/assets/BacktestLabView-vvjxJ5m8.js +2 -0
- backlight/_gui/assets/CampaignView-CIlc_wqc.css +1 -0
- backlight/_gui/assets/CampaignView-Cdfvmpsd.js +1 -0
- backlight/_gui/assets/CompareView-6H2jxNiO.css +1 -0
- backlight/_gui/assets/CompareView-CrJ8oxXP.js +1 -0
- backlight/_gui/assets/DashboardView-C0Fxmzc8.css +1 -0
- backlight/_gui/assets/DashboardView-DgqPCo7B.js +1 -0
- backlight/_gui/assets/EquityChart-BpYxPxyQ.js +1 -0
- backlight/_gui/assets/EquityChart-JLe9hJb5.css +1 -0
- backlight/_gui/assets/JobProgress-C8SnTQlc.css +1 -0
- backlight/_gui/assets/JobProgress-CB1VLleo.js +1 -0
- backlight/_gui/assets/LiveView-BVCPEc4g.js +1 -0
- backlight/_gui/assets/LiveView-DvTIB5_8.css +1 -0
- backlight/_gui/assets/ModeledQuotesNotice-D0qjkt2g.js +1 -0
- backlight/_gui/assets/ModeledQuotesNotice-DCxPJFwb.css +1 -0
- backlight/_gui/assets/ParamFields-Bv3NSsrU.css +1 -0
- backlight/_gui/assets/ParamFields-DuoR6hfm.js +1 -0
- backlight/_gui/assets/PendingWork-CeFaVq-R.js +1 -0
- backlight/_gui/assets/PendingWork-DvsBtxZp.css +1 -0
- backlight/_gui/assets/PipelinesView-DfsIL-LQ.js +16 -0
- backlight/_gui/assets/PipelinesView-uM0b2NEl.css +1 -0
- backlight/_gui/assets/RunDetailView-Bo1vVl8s.css +1 -0
- backlight/_gui/assets/RunDetailView-CHmNsBqj.js +3 -0
- backlight/_gui/assets/RunsView-CyjlERtU.css +1 -0
- backlight/_gui/assets/RunsView-DF-h2_0z.js +1 -0
- backlight/_gui/assets/SettingsView-86qI0Qk1.css +1 -0
- backlight/_gui/assets/SettingsView-DpvjM-g5.js +4 -0
- backlight/_gui/assets/SymbolsInput-B0Xwgzk1.css +1 -0
- backlight/_gui/assets/SymbolsInput-BZQQUVay.js +2 -0
- backlight/_gui/assets/TagsEditor-BbnU4zcL.css +1 -0
- backlight/_gui/assets/TagsEditor-aMliL_fI.js +26 -0
- backlight/_gui/assets/TradeAccountsView-BDXBsKhm.css +1 -0
- backlight/_gui/assets/TradeAccountsView-C6Dq9TAx.js +1 -0
- backlight/_gui/assets/TreesView-B1yCydQC.css +1 -0
- backlight/_gui/assets/TreesView-JCR9VFL1.js +6 -0
- backlight/_gui/assets/WebKeysPanel-BYAPo1o9.css +1 -0
- backlight/_gui/assets/WebKeysPanel-C63Vkpqw.js +1 -0
- backlight/_gui/assets/WorldPicker-CL4AVVEG.js +1 -0
- backlight/_gui/assets/WorldPicker-CmwvzOtp.css +1 -0
- backlight/_gui/assets/formMemory-Dnvfj_p0.js +1 -0
- backlight/_gui/assets/graph-BOsYCB6S.js +1 -0
- backlight/_gui/assets/highlight-HvVvo4wj.js +4 -0
- backlight/_gui/assets/index-BfAt6891.js +44 -0
- backlight/_gui/assets/index-Cs4gchcM.css +5 -0
- backlight/_gui/assets/materialdesignicons-webfont-B7mPwVP_.ttf +0 -0
- backlight/_gui/assets/materialdesignicons-webfont-CSr8KVlo.eot +0 -0
- backlight/_gui/assets/materialdesignicons-webfont-Dp5v-WZN.woff2 +0 -0
- backlight/_gui/assets/materialdesignicons-webfont-PXm3-2wK.woff +0 -0
- backlight/_gui/favicon.svg +1 -0
- backlight/_gui/guide.html +1433 -0
- backlight/_gui/index.html +14 -0
- backlight/agent/__init__.py +21 -0
- backlight/agent/draft.py +319 -0
- backlight/agent/llm.py +403 -0
- backlight/agent/loop.py +159 -0
- backlight/agent/nodegen.py +571 -0
- backlight/agent/prompts.py +99 -0
- backlight/agent/sessions.py +141 -0
- backlight/agent/settings.py +114 -0
- backlight/agent/tools.py +305 -0
- backlight/cli.py +622 -0
- backlight/connectors/__init__.py +8 -0
- backlight/connectors/_http.py +305 -0
- backlight/connectors/alpaca/__init__.py +640 -0
- backlight/connectors/alpaca/orders.py +197 -0
- backlight/connectors/alpaca/stream.py +64 -0
- backlight/connectors/base.py +385 -0
- backlight/connectors/csv/__init__.py +122 -0
- backlight/connectors/databento/__init__.py +676 -0
- backlight/connectors/databento/batch.py +181 -0
- backlight/connectors/kalshi/__init__.py +95 -0
- backlight/connectors/massive/__init__.py +576 -0
- backlight/connectors/massive_files/__init__.py +674 -0
- backlight/connectors/schwab/__init__.py +658 -0
- backlight/connectors/schwab/auth.py +193 -0
- backlight/connectors/schwab/orders.py +261 -0
- backlight/connectors/sim/__init__.py +9 -0
- backlight/connectors/sim/engine.py +513 -0
- backlight/connectors/synthetic/__init__.py +203 -0
- backlight/connectors/synthetic/market.py +75 -0
- backlight/connectors/world.py +285 -0
- backlight/data/__init__.py +1 -0
- backlight/data/cache.py +210 -0
- backlight/data/cache_transfer.py +400 -0
- backlight/data/coverage.py +109 -0
- backlight/data/option_cache.py +239 -0
- backlight/data/option_history.py +874 -0
- backlight/data/options.py +437 -0
- backlight/data/session.py +187 -0
- backlight/data/symbol_sets.py +218 -0
- backlight/data/symbols.py +226 -0
- backlight/db/__init__.py +42 -0
- backlight/db/migrations.py +77 -0
- backlight/db/names.py +83 -0
- backlight/db/records.py +159 -0
- backlight/db/reports/__init__.py +1 -0
- backlight/db/reports/blotter.py +245 -0
- backlight/db/reports/markdown.py +66 -0
- backlight/db/reports/metrics.py +213 -0
- backlight/db/reports/run_report.py +275 -0
- backlight/db/runs.py +274 -0
- backlight/db/schema.sql +270 -0
- backlight/db/scratch.py +65 -0
- backlight/hub/__init__.py +1 -0
- backlight/hub/access.py +116 -0
- backlight/hub/api/__init__.py +129 -0
- backlight/hub/api/_deps.py +10 -0
- backlight/hub/api/agent.py +176 -0
- backlight/hub/api/backtests.py +459 -0
- backlight/hub/api/campaigns.py +807 -0
- backlight/hub/api/catalog.py +42 -0
- backlight/hub/api/connectors.py +149 -0
- backlight/hub/api/data.py +565 -0
- backlight/hub/api/desk.py +337 -0
- backlight/hub/api/live.py +229 -0
- backlight/hub/api/pipelines.py +155 -0
- backlight/hub/api/reports.py +33 -0
- backlight/hub/api/runs.py +272 -0
- backlight/hub/api/settings.py +88 -0
- backlight/hub/api/symbol_sets.py +99 -0
- backlight/hub/api/trees.py +141 -0
- backlight/hub/api/users.py +301 -0
- backlight/hub/api/worlds.py +542 -0
- backlight/hub/app.py +106 -0
- backlight/hub/auth.py +686 -0
- backlight/hub/config.py +111 -0
- backlight/hub/events.py +60 -0
- backlight/hub/jobs.py +308 -0
- backlight/hub/login.html +93 -0
- backlight/hub/reconcile.py +190 -0
- backlight/hub/secrets.py +84 -0
- backlight/hub/services.py +125 -0
- backlight/hub/users.py +281 -0
- backlight/hub/webkeys.py +88 -0
- backlight/indicators.py +212 -0
- backlight/logsetup.py +31 -0
- backlight/paths.py +127 -0
- backlight/pipeline/__init__.py +1 -0
- backlight/pipeline/allocation.py +160 -0
- backlight/pipeline/context.py +307 -0
- backlight/pipeline/engine.py +169 -0
- backlight/pipeline/graph/__init__.py +1 -0
- backlight/pipeline/graph/catalog.py +71 -0
- backlight/pipeline/graph/plugins.py +64 -0
- backlight/pipeline/graph/presets.py +599 -0
- backlight/pipeline/graph/schema.py +277 -0
- backlight/pipeline/graph/store.py +118 -0
- backlight/pipeline/graph/trees.py +116 -0
- backlight/pipeline/memory.py +231 -0
- backlight/pipeline/nodes/__init__.py +7 -0
- backlight/pipeline/nodes/base.py +344 -0
- backlight/pipeline/nodes/execution.py +112 -0
- backlight/pipeline/nodes/flow.py +128 -0
- backlight/pipeline/nodes/option_strategies.py +1112 -0
- backlight/pipeline/nodes/output.py +119 -0
- backlight/pipeline/nodes/pickers.py +177 -0
- backlight/pipeline/nodes/refiners.py +210 -0
- backlight/pipeline/nodes/selectors.py +150 -0
- backlight/pipeline/nodes/sizers.py +504 -0
- backlight/pipeline/nodes/strategies.py +334 -0
- backlight/pipeline/nodes/triggers.py +84 -0
- backlight/pipeline/nodes/universe.py +70 -0
- backlight/pipeline/options.py +495 -0
- backlight/pipeline/params.py +259 -0
- backlight/pipeline/picking.py +321 -0
- backlight/pipeline/ports.py +216 -0
- backlight/pipeline/tree/__init__.py +7 -0
- backlight/pipeline/tree/expr.py +323 -0
- backlight/pipeline/tree/model.py +259 -0
- backlight/pipeline/tree/templates.py +479 -0
- backlight/pipeline/warmup.py +145 -0
- backlight/pipeline/web.py +311 -0
- backlight/runner/__init__.py +1 -0
- backlight/runner/account.py +226 -0
- backlight/runner/advise.py +388 -0
- backlight/runner/backtest.py +600 -0
- backlight/runner/campaign.py +1818 -0
- backlight/runner/desk.py +867 -0
- backlight/runner/feed.py +516 -0
- backlight/runner/live.py +884 -0
- backlight/runner/portfolio.py +314 -0
- backlight/runner/prefetch.py +105 -0
- backlight/runner/recorder.py +64 -0
- backlight/runner/restore.py +183 -0
- backlight/runner/step.py +102 -0
- backlight/runner/walk.py +154 -0
- backlight/types.py +522 -0
- backlight/version.py +1 -0
- backlight/worlds/__init__.py +17 -0
- backlight/worlds/analytics.py +459 -0
- backlight/worlds/debrief.py +178 -0
- backlight/worlds/gen_v1.py +424 -0
- backlight/worlds/personalities.py +270 -0
- backlight/worlds/rng.py +69 -0
- backlight/worlds/scenarios.py +106 -0
- backlight/worlds/sets.py +198 -0
- backlight/worlds/store.py +683 -0
- backlight/worlds/surface.py +167 -0
- backlight/worlds/tags.py +339 -0
- py_backlight-0.1.0.dist-info/METADATA +243 -0
- py_backlight-0.1.0.dist-info/RECORD +207 -0
- py_backlight-0.1.0.dist-info/WHEEL +4 -0
- py_backlight-0.1.0.dist-info/entry_points.txt +2 -0
backlight/__init__.py
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"""Backlight: automated stock and options trading platform.
|
|
2
|
+
|
|
3
|
+
Pipelines of parameterized nodes pick securities, decide how to trade them
|
|
4
|
+
through tagged decision trees, refine those decisions, and hand orders to a
|
|
5
|
+
connector. One runner drives the same pipeline in backtest, paper, or live
|
|
6
|
+
mode. See ``docs/`` for the proposal this implements.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from backlight.paths import adopt_legacy_env
|
|
10
|
+
from backlight.version import __version__
|
|
11
|
+
|
|
12
|
+
adopt_legacy_env()
|
|
13
|
+
|
|
14
|
+
__all__ = ["__version__"]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as N,aR as T,c as m,d as s,s as k,u as v,F as U,e as t,w as o,h as x,f as n,l as V,k as u,j as q,a3 as L,m as R,n as r,a4 as g,t as h,i as C,H as W}from"./index-BfAt6891.js";import{C as D,S as F,W as j}from"./WebKeysPanel-C63Vkpqw.js";import"./SymbolsInput-BZQQUVay.js";const E={class:"page"},H={class:"page-head"},I={class:"muted"},K={key:0,class:"card muted"},M={key:0,class:"apanel"},Y={key:3,class:"agrid"},G={class:"card"},J={class:"card-title"},O={class:"card"},Q={class:"card-title"},X={__name:"AccountView",setup(Z){const w=T(),c=L(),P=R(),d=V({get:()=>["brokers","symbols","webkeys"].includes(c.query.tab)?c.query.tab:"profile",set:l=>P.replace({query:{...c.query,tab:l==="profile"?void 0:l}})});async function S(l){w.global.name.value=l,await h(()=>C.putSettings({ui:{theme:l}}))}const a=q({current:"",next:"",again:"",busy:!1}),b=V(()=>a.value.next?a.value.next.length<8?"at least 8 characters":a.value.again&&a.value.again!==a.value.next?"the two new passwords differ":"":"");async function z(){a.value.busy=!0;const l=await h(()=>C.changePassword(a.value.current,a.value.next),null);a.value.busy=!1,l&&(W("password changed: sign in again with the new one","success"),setTimeout(()=>location.assign("/login"),1200))}return(l,e)=>{const p=u("v-tab"),A=u("v-tabs"),_=u("v-icon"),y=u("v-btn"),B=u("v-btn-toggle"),f=u("v-text-field");return r(),m("div",E,[s("div",H,[e[4]||(e[4]=s("h1",null,"Account",-1)),s("span",I,k(v(g).name)+" · "+k(v(g).role),1)]),v(g).auth?(r(),m(U,{key:1},[t(A,{modelValue:d.value,"onUpdate:modelValue":e[0]||(e[0]=i=>d.value=i),density:"compact",color:"primary",class:"mb-4 atabs"},{default:o(()=>[t(p,{value:"profile","prepend-icon":"mdi-account-outline"},{default:o(()=>[...e[5]||(e[5]=[n("Profile",-1)])]),_:1}),t(p,{value:"brokers","prepend-icon":"mdi-bank-outline"},{default:o(()=>[...e[6]||(e[6]=[n("My brokers",-1)])]),_:1}),t(p,{value:"symbols","prepend-icon":"mdi-format-list-group"},{default:o(()=>[...e[7]||(e[7]=[n("Symbol sets",-1)])]),_:1}),t(p,{value:"webkeys","prepend-icon":"mdi-key-chain-variant"},{default:o(()=>[...e[8]||(e[8]=[n("Web keys",-1)])]),_:1})]),_:1},8,["modelValue"]),d.value==="brokers"?(r(),m("div",M,[t(D,{mine:""})])):d.value==="symbols"?(r(),x(F,{key:1})):d.value==="webkeys"?(r(),x(j,{key:2})):(r(),m("div",Y,[s("div",G,[s("div",J,[t(_,{icon:"mdi-theme-light-dark",size:"14"}),e[9]||(e[9]=n("Theme",-1))]),t(B,{"model-value":v(w).global.name.value,mandatory:"",density:"compact",variant:"outlined",divided:"","onUpdate:modelValue":S},{default:o(()=>[t(y,{value:"dark",size:"small","prepend-icon":"mdi-weather-night"},{default:o(()=>[...e[10]||(e[10]=[n("Dark",-1)])]),_:1}),t(y,{value:"light",size:"small","prepend-icon":"mdi-white-balance-sunny"},{default:o(()=>[...e[11]||(e[11]=[n("Light",-1)])]),_:1})]),_:1},8,["model-value"]),e[12]||(e[12]=s("div",{class:"muted mt-3",style:{"font-size":"11.5px"}}," Your own: the theme, Backtest Lab and Live form values, and campaign defaults are kept for you alone. ",-1))]),s("div",O,[s("div",Q,[t(_,{icon:"mdi-form-textbox-password",size:"14"}),e[13]||(e[13]=n("Password",-1))]),t(f,{modelValue:a.value.current,"onUpdate:modelValue":e[1]||(e[1]=i=>a.value.current=i),type:"password",label:"Current password",autocomplete:"current-password",class:"mb-2"},null,8,["modelValue"]),t(f,{modelValue:a.value.next,"onUpdate:modelValue":e[2]||(e[2]=i=>a.value.next=i),type:"password",label:"New password",autocomplete:"new-password",class:"mb-2"},null,8,["modelValue"]),t(f,{modelValue:a.value.again,"onUpdate:modelValue":e[3]||(e[3]=i=>a.value.again=i),type:"password",label:"New password again",autocomplete:"new-password","error-messages":b.value?[b.value]:[]},null,8,["modelValue","error-messages"]),t(y,{color:"primary",variant:"flat",class:"mt-2",loading:a.value.busy,disabled:!a.value.current||!a.value.next||a.value.next!==a.value.again||!!b.value,onClick:z},{default:o(()=>[...e[14]||(e[14]=[n("Change password",-1)])]),_:1},8,["loading","disabled"]),e[15]||(e[15]=s("div",{class:"muted mt-2",style:{"font-size":"11.5px"}},"Changing it signs you out everywhere.",-1))])]))],64)):(r(),m("div",K,"Sign-in is off on this hub: there is one local admin, and everything is in Admin."))])}}},te=N(X,[["__scopeId","data-v-e180d83b"]]);export{te as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.agrid[data-v-e180d83b]{display:grid;grid-template-columns:1fr 1fr;gap:12px;align-items:start;max-width:900px}.apanel[data-v-e180d83b]{max-width:1100px}.atabs[data-v-e180d83b]{border-bottom:1px solid var(--line)}@media(max-width:800px){.agrid[data-v-e180d83b]{grid-template-columns:1fr}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.g2[data-v-de158446]{display:grid;grid-template-columns:1fr 1fr;gap:16px 12px;padding-top:6px}.g4[data-v-de158446]{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:16px 10px;padding-top:6px}.g6[data-v-de158446]{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:18px 10px;padding-top:6px;margin-bottom:12px}.g4+.muted[data-v-de158446]{margin-top:16px}.sets[data-v-de158446]{display:flex;flex-direction:column;gap:6px}.set[data-v-de158446]{border:1px solid var(--line);border-radius:8px;padding:8px 10px;cursor:pointer;font-size:12.5px}.set[data-v-de158446]:hover{background:var(--panel-2)}.set.on[data-v-de158446]{border-color:var(--accent);background:#4f8cff14}.chips[data-v-de158446]{display:flex;flex-wrap:wrap;gap:4px;align-items:center;margin-top:4px}.small[data-v-de158446]{font-size:11.5px}.newset[data-v-de158446]{border:1px dashed var(--line);border-radius:8px;padding:10px}.small[data-v-f109decf]{font-size:11.5px}.plist[data-v-f109decf]{display:flex;flex-direction:column;gap:3px}.pitem[data-v-f109decf]{display:flex;align-items:center;gap:8px;padding:5px 8px;border-radius:6px;cursor:pointer;border:1px solid transparent;font-size:12.5px}.pitem[data-v-f109decf]:hover{background:var(--panel-2)}.pitem.on[data-v-f109decf]{border-color:#4f8cff80;background:#4f8cff14}.bandchart[data-v-ccd75fcf]{position:relative}svg[data-v-ccd75fcf]{width:100%;display:block}.grid line[data-v-ccd75fcf]{stroke:var(--line);stroke-width:1;vector-effect:non-scaling-stroke}.one[data-v-ccd75fcf]{stroke:var(--muted);stroke-dasharray:3 3;vector-effect:non-scaling-stroke;opacity:.6}.cross[data-v-ccd75fcf]{stroke:var(--muted);vector-effect:non-scaling-stroke}.axis text[data-v-ccd75fcf]{fill:var(--muted);font-size:11px}.readout[data-v-ccd75fcf]{position:absolute;top:8px;right:24px;background:var(--panel);border:1px solid var(--line);border-radius:6px;padding:6px 8px;font-size:11.5px;pointer-events:none;width:430px;opacity:.96}.readout[data-v-ccd75fcf]:not(.right){right:auto;left:64px}.rr[data-v-ccd75fcf]{display:flex;gap:6px;align-items:center}.rr .nm[data-v-ccd75fcf]{flex:1}.sw[data-v-ccd75fcf]{width:10px;height:10px;border-radius:2px;display:inline-block;flex:0 0 auto}.legend[data-v-ccd75fcf]{display:flex;flex-wrap:wrap;gap:4px 14px;font-size:11.5px;margin-top:6px}.lg[data-v-ccd75fcf]{display:inline-flex;align-items:center;gap:6px;cursor:default;padding:1px 4px;border-radius:4px}.lg.on[data-v-ccd75fcf]{background:var(--panel-2)}.lg.dim[data-v-ccd75fcf]{opacity:.45}.hm-tools[data-v-5cc040ef]{display:flex;align-items:center;flex-wrap:wrap;gap:4px;margin-bottom:8px;font-size:12px}.hm-wrap[data-v-5cc040ef]{overflow-x:auto}.hm[data-v-5cc040ef]{border-collapse:separate;border-spacing:2px;font-size:11.5px}.hm th.fam[data-v-5cc040ef]{font-size:10.5px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);font-weight:500;border-bottom:1px solid var(--line);padding:2px 4px}.hm th.colh[data-v-5cc040ef]{font-weight:500;color:var(--muted);padding:2px 4px;max-width:90px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.hm th.rowh[data-v-5cc040ef]{text-align:left;font-weight:400;min-width:180px;max-width:220px;padding-right:8px}.hm td[data-v-5cc040ef]{min-width:64px;height:34px;text-align:center;border-radius:4px;cursor:pointer;font-variant-numeric:tabular-nums}.hm td.empty[data-v-5cc040ef]{cursor:default;background:var(--panel-2)!important}.hm td.sel[data-v-5cc040ef]{outline:2px solid var(--accent)}.hm-note[data-v-5cc040ef]{font-size:11px;margin-top:6px}.ev-grid[data-v-c525c5bd]{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:12px}.ev[data-v-c525c5bd]{border:1px solid var(--line);border-radius:8px;padding:8px}.ev-h[data-v-c525c5bd]{font-size:12px;margin-bottom:4px}svg[data-v-c525c5bd]{width:100%;display:block}.zero[data-v-c525c5bd]{stroke:var(--line)}.day0[data-v-c525c5bd]{stroke:var(--muted);stroke-dasharray:2 3}.bench[data-v-c525c5bd]{stroke:var(--muted);stroke-dasharray:5 4;fill:none;stroke-width:1.2}.ax[data-v-c525c5bd]{fill:var(--muted);font-size:10px}.ev-row[data-v-c525c5bd]{display:flex;gap:6px;align-items:center;font-size:11.5px}.ev-row .clip[data-v-c525c5bd]{flex:1}.sw[data-v-c525c5bd]{width:10px;height:10px;border-radius:2px;flex:0 0 auto}.ev-note[data-v-c525c5bd]{font-size:11px;margin-top:6px}.br[data-v-861b6cb9]{fill:#f59e0b2e}.one[data-v-861b6cb9]{stroke:var(--muted);stroke-dasharray:3 3;vector-effect:non-scaling-stroke;opacity:.6}.ax[data-v-861b6cb9]{fill:var(--muted);font-size:11px}.runs-n[data-v-e1cd547d]{font-size:11px;opacity:.8}.vis-pick[data-v-e1cd547d]{flex:0 0 160px}.lab-grid[data-v-e1cd547d]{display:grid;grid-template-columns:300px minmax(0,1fr);gap:12px;align-items:start}.rail[data-v-e1cd547d]{display:flex;flex-direction:column;gap:10px}.rail .card[data-v-e1cd547d]{margin:0}.results[data-v-e1cd547d]{min-height:520px}.rhead[data-v-e1cd547d]{display:flex;align-items:center;border-bottom:1px solid var(--line);margin:-4px 0 8px}.tabbody[data-v-e1cd547d]{padding:4px 2px}.manage[data-v-e1cd547d]{font-size:11px;color:var(--accent);text-decoration:none;cursor:pointer}.manage[data-v-e1cd547d]:hover{text-decoration:underline}.src[data-v-e1cd547d]{display:flex;align-items:center;gap:6px;font-size:12.5px;flex-wrap:wrap}.dot[data-v-e1cd547d]{display:inline-block;width:8px;height:8px;border-radius:50%;background:#ef4444}.dot.ok[data-v-e1cd547d]{background:#22c55e}.g2[data-v-e1cd547d]{display:grid;grid-template-columns:1fr 1fr;gap:8px}.small[data-v-e1cd547d]{font-size:11.5px}.note[data-v-e1cd547d]{font-size:11.5px;color:var(--muted);display:flex;gap:4px;align-items:flex-start;flex-wrap:wrap}.chips[data-v-e1cd547d]{display:flex;flex-wrap:wrap;gap:4px;align-items:center}.tray[data-v-e1cd547d]{display:flex;flex-direction:column;gap:4px}.tchip[data-v-e1cd547d]{display:flex;align-items:center;gap:6px;padding:4px 8px;border:1px solid var(--line);border-radius:999px;font-size:12.5px}.tchip .clip[data-v-e1cd547d]{flex:1}.tchip.missing[data-v-e1cd547d]{border-style:dashed;opacity:.7}.tchip .mx[data-v-e1cd547d]{cursor:pointer;opacity:.5}.tchip .mx[data-v-e1cd547d]:hover{opacity:1}.sympv[data-v-e1cd547d]{font-size:12px;display:flex;flex-direction:column;gap:3px}.symchips[data-v-e1cd547d]{display:flex;flex-wrap:wrap;gap:3px}.symchip[data-v-e1cd547d]{font-size:11px;padding:1px 6px;border-radius:4px;background:var(--panel-2);border:1px solid var(--line)}.prog[data-v-e1cd547d]{padding:6px 2px 10px;border-bottom:1px solid var(--line);margin-bottom:10px}.prow[data-v-e1cd547d]{display:grid;grid-template-columns:minmax(0,1.6fr) 74px minmax(0,1fr) 100px 100px;gap:10px;align-items:center;font-size:12px;padding:3px 0}.prow-data[data-v-e1cd547d]{grid-column:1 / -1;display:flex;align-items:center;gap:6px;font-size:11px;color:var(--muted)}.empty[data-v-e1cd547d]{text-align:center;padding:70px 40px;display:flex;flex-direction:column;gap:8px;align-items:center;max-width:620px;margin:0 auto}.sum[data-v-e1cd547d]{width:100%;border-collapse:collapse;font-size:12.5px}.sum th[data-v-e1cd547d]{text-align:left;font-weight:500;color:var(--muted);font-size:11.5px;padding:6px 8px;border-bottom:1px solid var(--line)}.sum td[data-v-e1cd547d]{padding:6px 8px;border-bottom:1px solid var(--line);vertical-align:top}.sum .r[data-v-e1cd547d]{text-align:right;font-variant-numeric:tabular-nums}.sum tr.clickable[data-v-e1cd547d]{cursor:pointer}.sum tr.clickable:hover td[data-v-e1cd547d]{background:var(--panel-2)}.range[data-v-e1cd547d]{font-size:10.5px}.live i[data-v-e1cd547d]{font-size:10.5px;opacity:.7}.sw[data-v-e1cd547d]{width:10px;height:10px;border-radius:2px;display:inline-block;margin-right:6px}.cell-detail[data-v-e1cd547d]{border:1px solid var(--line);border-radius:8px;padding:8px 10px;font-size:12.5px}.sec-h[data-v-e1cd547d]{font-size:11px;text-transform:uppercase;letter-spacing:.04em;margin:12px 0 6px}.fgrid[data-v-e1cd547d]{display:grid;gap:16px 12px}.fgrid+.fgrid[data-v-e1cd547d]{margin-top:16px}.adv-dlg .sec-h[data-v-e1cd547d]{margin:20px 0 10px}.adv-dlg .sec-h[data-v-e1cd547d]:first-child{margin-top:6px}.adv-dlg .checks[data-v-e1cd547d]{margin-top:8px}.adv-dlg[data-v-e1cd547d] .v-card-text{padding-top:8px!important}.adv-row[data-v-e1cd547d]{display:flex;align-items:center;gap:8px}.adv-row .clip[data-v-e1cd547d]{flex:1;min-width:0}.fgrid.g3[data-v-e1cd547d]{grid-template-columns:repeat(3,minmax(0,1fr))}.fgrid.g4[data-v-e1cd547d]{grid-template-columns:repeat(4,minmax(0,1fr))}.checks[data-v-e1cd547d]{display:flex;flex-wrap:wrap;gap:0 14px}.rcol[data-v-e1cd547d]{min-width:0}.setworlds[data-v-e1cd547d]{display:flex;flex-wrap:wrap;gap:2px 8px;font-size:11.5px}.setworlds .ctl[data-v-e1cd547d]{color:var(--muted)}.batches td.pl[data-v-e1cd547d]{max-width:420px}.batches tr.active td[data-v-e1cd547d]{background:#4f8cff1a}.batches .del[data-v-e1cd547d]{opacity:.45}.batches tr:hover .del[data-v-e1cd547d]{opacity:1}@media(max-width:1100px){.lab-grid[data-v-e1cd547d]{grid-template-columns:1fr}}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{_ as Re,o as ul,t as te,i as ee,a as Je,b as Cl,U as ge,n as s,h as N,w as b,e as u,f as p,s as o,c as i,d as a,F as I,r as H,y as fe,a0 as Ml,u as O,au as da,g as k,j as T,k as B,H as ze,Z as Sl,l as $,a6 as ra,a1 as Ee,ac as ma,N as Be,X as ca,a5 as va,B as le,a2 as pa,G as Pe,a3 as _a,m as fa,a4 as xl,p as qe,x as zt,av as ya,E as Bt,aw as ha,ax as ba,z as $l,ay as Rt,v as ka}from"./index-BfAt6891.js";import{u as ga,m as wa,o as Ze}from"./formMemory-Dnvfj_p0.js";import{M as xa}from"./ModeledQuotesNotice-D0qjkt2g.js";import{S as Ot}from"./SymbolsInput-BZQQUVay.js";import{W as $a}from"./WorldPicker-CL4AVVEG.js";const Va={key:0},Ca={class:"muted mb-3"},Ma={class:"g2"},Sa={key:1},Ua={class:"sets"},za=["onClick"],Ba={class:"d-flex align-center ga-2"},Ra={class:"mono"},Oa={class:"clip"},Ta={class:"muted small"},Aa={class:"muted small"},Ia={class:"chips"},Pa={class:"muted small"},qa={key:1,class:"mt-2"},Ea={key:2,class:"newset mt-2"},La={class:"g4"},Na={class:"g6"},ja={class:"d-flex"},Da={key:2},Wa={key:0,class:"muted small px-2"},Fa={__name:"MarketDialog",props:{modelValue:{type:Boolean,default:!1},market:{type:Object,default:null},providerLabel:{type:String,default:""},defaultStart:{type:String,default:""},defaultEnd:{type:String,default:""}},emits:["update:modelValue","save"],setup(Q,{emit:X}){const V=Q,P=X,A=T("history"),g=T({start:"",end:""}),K=T([]),Y=T(null),C=T(""),j=T(!1),_=T(""),w=T(null),U=T(null);async function D(){K.value=await te(()=>ee.worldSets(),[])||[]}ul(async()=>{Y.value=await te(()=>ee.worldOptions(),null),D()});let R=null;ul(()=>{R=Je("world.progress",v=>{v.state!=="running"?D():n(v)})});function n(v){const d=K.value.find(x=>`set:${x.name}`===v.key);d&&(d.progress=v)}Cl(()=>R&&R()),ge(()=>V.modelValue,v=>{if(!v)return;const d=V.market;A.value=(d==null?void 0:d.kind)||"history",g.value={start:(d==null?void 0:d.start)||V.defaultStart,end:(d==null?void 0:d.end)||V.defaultEnd},C.value=(d==null?void 0:d.kind)==="set"?d.name:C.value,j.value=!!(d!=null&&d.final_check),_.value=(d==null?void 0:d.kind)==="world"?d.world_id:_.value,D()});const f=$(()=>K.value.find(v=>v.name===C.value)||null);async function W(v){try{const d=await ee.generateWorldSet(v.name);v.progress=d,ze(`generating @${v.name}: ${d.total} worlds`,"info")}catch(d){Sl(d)}}function q(){var v;U.value={name:"",label:"",seed:Math.floor(Math.random()*1e6),template:"index-10",years:10,controls:2,role:"tuning",mix:Object.fromEntries((((v=Y.value)==null?void 0:v.scenarios)||[]).map(d=>[d.name,d.name==="natural"?10:0]))}}async function m(){try{const v=await ee.saveWorldSet({...U.value,mix:Object.fromEntries(Object.entries(U.value.mix).map(([d,x])=>[d,Number(x)||0]))});U.value=null,await D(),C.value=v.name}catch(v){Sl(v)}}const E=$(()=>A.value==="history"?!!(g.value.start&&g.value.end):A.value==="set"?!!f.value&&(f.value.role!=="holdout"||j.value):!!_.value);function c(){var d;let v;if(A.value==="history")v={kind:"history",start:g.value.start,end:g.value.end,label:`Real · ${V.providerLabel||"history"} ${g.value.start.slice(0,4)}–${g.value.end.slice(0,4)}`};else if(A.value==="set"){const x=f.value;v={kind:"set",name:x.name,final_check:x.role==="holdout"?j.value:!1,label:`@${x.name} · ${x.count} worlds`,holdout:x.role==="holdout",template:x.template}}else v={kind:"world",world_id:_.value,label:((d=w.value)==null?void 0:d.name)||_.value};P("save",v),P("update:modelValue",!1)}const G=v=>{var d,x;return((x=(d=Y.value)==null?void 0:d.scenarios.find(F=>F.name===v))==null?void 0:x.label)||v};return(v,d)=>{const x=B("v-spacer"),F=B("v-btn"),ve=B("v-card-title"),ue=B("v-tab"),pe=B("v-tabs"),ye=B("v-text-field"),Me=B("v-icon"),we=B("v-chip"),Oe=B("v-progress-linear"),dl=B("v-checkbox"),Le=B("v-select"),Ne=B("v-card-text"),rl=B("v-card-actions"),je=B("v-card"),S=B("v-dialog");return s(),N(S,{"model-value":Q.modelValue,"max-width":"860",scrollable:"","onUpdate:modelValue":d[14]||(d[14]=oe=>P("update:modelValue",oe))},{default:b(()=>[u(je,null,{default:b(()=>[u(ve,{class:"d-flex align-center"},{default:b(()=>[p(o(Q.market?"Edit market":"Add a market"),1),u(x),u(F,{icon:"mdi-close",variant:"text",size:"small",onClick:d[0]||(d[0]=oe=>P("update:modelValue",!1))})]),_:1}),u(pe,{modelValue:A.value,"onUpdate:modelValue":d[1]||(d[1]=oe=>A.value=oe),density:"compact",class:"px-4"},{default:b(()=>[u(ue,{value:"history","prepend-icon":"mdi-history"},{default:b(()=>[...d[15]||(d[15]=[p("Real history",-1)])]),_:1}),u(ue,{value:"set","prepend-icon":"mdi-earth-box"},{default:b(()=>[...d[16]||(d[16]=[p("World set",-1)])]),_:1}),u(ue,{value:"world","prepend-icon":"mdi-earth"},{default:b(()=>[...d[17]||(d[17]=[p("One world",-1)])]),_:1})]),_:1},8,["modelValue"]),u(Ne,{style:{"min-height":"380px"}},{default:b(()=>{var oe,Te;return[A.value==="history"?(s(),i("div",Va,[a("div",Ca,[d[18]||(d[18]=p("Bars from ",-1)),a("b",null,o(Q.providerLabel||"the hub's data source"),1),d[19]||(d[19]=p(" (Admin → Connectors), over this window.",-1))]),a("div",Ma,[u(ye,{modelValue:g.value.start,"onUpdate:modelValue":d[2]||(d[2]=M=>g.value.start=M),type:"date",label:"Start"},null,8,["modelValue"]),u(ye,{modelValue:g.value.end,"onUpdate:modelValue":d[3]||(d[3]=M=>g.value.end=M),type:"date",label:"End"},null,8,["modelValue"])])])):A.value==="set"?(s(),i("div",Sa,[d[26]||(d[26]=a("div",{class:"muted mb-2"},"Every strategy runs on every world in the set; results come back as a distribution. Sets are generated once and reused.",-1)),a("div",Ua,[(s(!0),i(I,null,H(K.value,M=>{var xe,ie;return s(),i("div",{key:M.name,class:fe(["set",{on:M.name===C.value}]),onClick:ae=>C.value=M.name},[a("div",Ba,[u(Me,{icon:M.name===C.value?"mdi-radiobox-marked":"mdi-radiobox-blank",size:"16"},null,8,["icon"]),a("b",Ra,"@"+o(M.name),1),a("span",Oa,o(M.label),1),M.generated?(s(),N(F,{key:0,size:"x-small",variant:"text","prepend-icon":"mdi-eye-outline",title:"Browse this set's worlds",onClick:Ml(ae=>O(da)(M.name),["stop"])},{default:b(()=>[...d[20]||(d[20]=[p("View",-1)])]),_:1},8,["onClick"])):k("",!0),M.role==="holdout"?(s(),N(we,{key:1,size:"x-small",color:"warning",variant:"tonal","prepend-icon":"mdi-lock-outline",title:`Held out: for a final check only. Used ${M.uses}×`},{default:b(()=>[p("held out · used "+o(M.uses)+"×",1)]),_:2},1032,["title"])):k("",!0),u(x),a("span",Ta,o(M.generated)+" / "+o(M.count)+" generated",1),M.generated<M.count?(s(),N(F,{key:2,size:"x-small",variant:"tonal",loading:((xe=M.progress)==null?void 0:xe.state)==="running",onClick:Ml(ae=>W(M),["stop"])},{default:b(()=>[...d[21]||(d[21]=[p("Generate",-1)])]),_:1},8,["loading","onClick"])):k("",!0)]),a("div",Aa,o(M.description),1),a("div",Ia,[u(we,{size:"x-small",variant:"tonal"},{default:b(()=>[p(o(M.template_label),1)]),_:2},1024),(s(!0),i(I,null,H(M.scenarios,ae=>(s(),N(we,{key:ae.name,size:"x-small",variant:"outlined"},{default:b(()=>[p(o(ae.count)+" "+o(ae.label),1)]),_:2},1024))),128)),M.controls?(s(),N(we,{key:0,size:"x-small",variant:"outlined",color:"secondary"},{default:b(()=>[p(o(M.controls)+" control",1)]),_:2},1024)):k("",!0),a("span",Pa,o(M.years)+"y · from "+o(M.start.slice(0,4)),1)]),((ie=M.progress)==null?void 0:ie.state)==="running"?(s(),N(Oe,{key:0,"model-value":100*M.progress.done/M.progress.total,height:"4",class:"mt-1"},null,8,["model-value"])):k("",!0)],10,za)}),128))]),((oe=f.value)==null?void 0:oe.role)==="holdout"?(s(),N(dl,{key:0,modelValue:j.value,"onUpdate:modelValue":d[4]||(d[4]=M=>j.value=M),density:"compact","hide-details":"",color:"warning",class:"mt-2",label:"This is a final check, not tuning (it is counted, and per-world results are shown)"},null,8,["modelValue"])):k("",!0),U.value?(s(),i("div",Ea,[a("div",La,[u(ye,{modelValue:U.value.name,"onUpdate:modelValue":d[5]||(d[5]=M=>U.value.name=M),label:"Name",prefix:"@"},null,8,["modelValue"]),u(Le,{modelValue:U.value.template,"onUpdate:modelValue":d[6]||(d[6]=M=>U.value.template=M),items:((Te=Y.value)==null?void 0:Te.templates)||[],"item-title":"label","item-value":"name",label:"Universe"},null,8,["modelValue","items"]),u(ye,{modelValue:U.value.years,"onUpdate:modelValue":d[7]||(d[7]=M=>U.value.years=M),modelModifiers:{number:!0},type:"number",label:"Years"},null,8,["modelValue"]),u(Le,{modelValue:U.value.role,"onUpdate:modelValue":d[8]||(d[8]=M=>U.value.role=M),items:[{title:"Tuning",value:"tuning"},{title:"Held out",value:"holdout"}],label:"Role"},null,8,["modelValue"])]),d[25]||(d[25]=a("div",{class:"muted small mb-1"},"Worlds per scenario",-1)),a("div",Na,[(s(!0),i(I,null,H(U.value.mix,(M,xe)=>(s(),N(ye,{key:xe,modelValue:U.value.mix[xe],"onUpdate:modelValue":ie=>U.value.mix[xe]=ie,modelModifiers:{number:!0},type:"number",min:"0",label:G(xe)},null,8,["modelValue","onUpdate:modelValue","label"]))),128)),u(ye,{modelValue:U.value.controls,"onUpdate:modelValue":d[9]||(d[9]=M=>U.value.controls=M),modelModifiers:{number:!0},type:"number",min:"0",label:"Control (edges off)"},null,8,["modelValue"])]),a("div",ja,[u(x),u(F,{variant:"text",onClick:d[10]||(d[10]=M=>U.value=null)},{default:b(()=>[...d[23]||(d[23]=[p("Cancel",-1)])]),_:1}),u(F,{color:"primary",variant:"tonal",disabled:!U.value.name,onClick:m},{default:b(()=>[...d[24]||(d[24]=[p("Save set",-1)])]),_:1},8,["disabled"])])])):(s(),i("div",qa,[u(F,{size:"small",variant:"text","prepend-icon":"mdi-plus",onClick:q},{default:b(()=>[...d[22]||(d[22]=[p("New world set",-1)])]),_:1})]))])):(s(),i("div",Da,[u($a,{modelValue:_.value,"onUpdate:modelValue":d[11]||(d[11]=M=>_.value=M),onWorld:d[12]||(d[12]=M=>w.value=M)},null,8,["modelValue"])]))]}),_:1}),u(rl,null,{default:b(()=>[A.value!=="history"?(s(),i("span",Wa,[...d[27]||(d[27]=[p("Worlds use their own dates (after a year of warm-up). Real tickers a strategy names get stand-ins; ",-1),a("span",{class:"mono"},"@world.*",-1),p(" sets name the world's own.",-1)])])):k("",!0),u(x),u(F,{variant:"text",onClick:d[13]||(d[13]=oe=>P("update:modelValue",!1))},{default:b(()=>[...d[28]||(d[28]=[p("Cancel",-1)])]),_:1}),u(F,{color:"primary",variant:"flat",disabled:!E.value,onClick:c},{default:b(()=>[p(o(Q.market?"Save":"Add market"),1)]),_:1},8,["disabled"])]),_:1})]),_:1})]),_:1},8,["model-value"])}}},Ha=Re(Fa,[["__scopeId","data-v-de158446"]]),Ya={class:"muted small mr-2"},Xa={key:0,class:"mb-2"},Ga={class:"plist"},Qa=["checked","onChange"],Za={class:"clip grow"},Ja={class:"muted nowrap"},Ka={key:0,class:"muted pa-2"},en={__name:"PipelinePicker",props:{modelValue:{type:Boolean,default:!1},selected:{type:Array,default:()=>[]},recent:{type:Array,default:()=>[]}},emits:["update:modelValue","update:selected"],setup(Q,{emit:X}){const V=Q,P=X,A=T(""),g=T([]);ge(()=>V.modelValue,_=>{_&&(g.value=[...V.selected],A.value="")});const K=$(()=>{const _=A.value.trim().toLowerCase();return Ee.value.filter(w=>{var U,D;return ma("pipelines",w)&&(!_||w.name.toLowerCase().includes(_)||w.id.toLowerCase().includes(_)||(((U=w.settings)==null?void 0:U.timeframe)||"1d")===_||_==="preset"&&((D=w.meta)==null?void 0:D.preset)||(w.owner||"").toLowerCase()===_)})}),Y=$(()=>V.recent.map(_=>Ee.value.find(w=>w.id===_)).filter(Boolean).slice(0,8));function C(_){const w=g.value.indexOf(_);w>=0?g.value.splice(w,1):g.value.push(_)}function j(){P("update:selected",[...g.value]),P("update:modelValue",!1)}return(_,w)=>{const U=B("v-spacer"),D=B("OnlyMine"),R=B("v-card-title"),n=B("v-text-field"),f=B("v-chip"),W=B("OwnerChip"),q=B("v-card-text"),m=B("v-btn"),E=B("v-card-actions"),c=B("v-card"),G=B("v-dialog");return s(),N(G,{"model-value":Q.modelValue,"max-width":"720",scrollable:"","onUpdate:modelValue":w[3]||(w[3]=v=>P("update:modelValue",v))},{default:b(()=>[u(c,null,{default:b(()=>[u(R,{class:"d-flex align-center"},{default:b(()=>[w[4]||(w[4]=p("Pipelines",-1)),u(U),a("span",Ya,o(g.value.length)+" chosen",1),u(D,{name:"pipelines"})]),_:1}),u(q,{style:{height:"520px"}},{default:b(()=>[u(n,{modelValue:A.value,"onUpdate:modelValue":w[0]||(w[0]=v=>A.value=v),"prepend-inner-icon":"mdi-magnify",placeholder:"Filter by name, timeframe, owner or 'preset'",autofocus:"","hide-details":"",clearable:"",class:"mb-2",onKeydown:ra(j,["enter"])},null,8,["modelValue"]),Y.value.length&&!A.value?(s(),i("div",Xa,[w[5]||(w[5]=a("div",{class:"muted small mb-1"},"Recently run",-1)),(s(!0),i(I,null,H(Y.value,v=>(s(),N(f,{key:v.id,size:"small",class:"mr-1 mb-1",variant:g.value.includes(v.id)?"flat":"outlined",color:g.value.includes(v.id)?"primary":void 0,onClick:d=>C(v.id)},{default:b(()=>[p(o(v.name),1)]),_:2},1032,["variant","color","onClick"]))),128))])):k("",!0),a("div",Ga,[(s(!0),i(I,null,H(K.value,v=>{var d,x,F;return s(),i("label",{key:v.id,class:fe(["pitem",{on:g.value.includes(v.id)}])},[a("input",{type:"checkbox",checked:g.value.includes(v.id),onChange:ve=>C(v.id)},null,40,Qa),a("span",Za,o(v.name),1),a("span",Ja,"r"+o(v.revision)+" · "+o(((d=v.settings)==null?void 0:d.timeframe)||"1d")+" · "+o(v.nodeCount)+"n",1),(x=v.meta)!=null&&x.preset?k("",!0):(s(),N(W,{key:0,owner:v.owner,visibility:v.visibility},null,8,["owner","visibility"])),(F=v.meta)!=null&&F.preset?(s(),N(f,{key:1,size:"x-small",variant:"tonal",color:"secondary"},{default:b(()=>[...w[6]||(w[6]=[p("preset",-1)])]),_:1})):k("",!0)],2)}),128)),K.value.length?k("",!0):(s(),i("div",Ka,"No pipelines match."))])]),_:1}),u(E,null,{default:b(()=>[u(m,{variant:"text",onClick:w[1]||(w[1]=v=>g.value=[])},{default:b(()=>[...w[7]||(w[7]=[p("Clear",-1)])]),_:1}),u(U),u(m,{variant:"text",onClick:w[2]||(w[2]=v=>P("update:modelValue",!1))},{default:b(()=>[...w[8]||(w[8]=[p("Cancel",-1)])]),_:1}),u(m,{color:"primary",variant:"flat",onClick:j},{default:b(()=>[p("Use "+o(g.value.length),1)]),_:1})]),_:1})]),_:1})]),_:1},8,["model-value"])}}},ln=Re(en,[["__scopeId","data-v-f109decf"]]),tn={class:"bandchart"},an=["viewBox"],nn={class:"grid"},sn=["x1","x2","y1","y2"],on=["d","fill"],un=["d","fill"],dn=["d","stroke"],rn=["x1","x2","y1","y2"],mn={class:"axis"},cn=["x","y"],vn=["x","y"],pn=["x1","x2","y1","y2"],_n={key:1,class:"muted pa-4"},fn={class:"muted"},yn={class:"clip nm"},hn={key:0,class:"muted nowrap"},bn={class:"legend"},kn=["onMouseenter"],gn={key:0,class:"muted"},wn={key:1,class:"muted"},Ce=1e3,xn=365.25*864e5,$n={__name:"BandChart",props:{series:{type:Array,default:()=>[]},height:{type:Number,default:320},log:{type:Boolean,default:!0},align:{type:String,default:"auto"}},setup(Q){const X=Q,V={l:56,r:16,t:12,b:26},P=$(()=>X.height),A=m=>new Date(m+"T00:00:00Z").getTime(),g=m=>X.log?Math.log(Math.max(m,.001)):m,K=$(()=>X.align!=="auto"?X.align:new Set(X.series.map(E=>(E.days[0]||"").slice(0,7))).size>1?"start":"date"),Y=(m,E)=>K.value==="start"?(A(m.days[E])-A(m.days[0]))/xn:A(m.days[E]),C=$(()=>{let m=1/0,E=-1/0,c=1/0,G=-1/0;for(const d of X.series)for(const x of["line","p5","p95","p50"])(d[x]||[]).forEach((F,ve)=>{if(F==null)return;const ue=Y(d,ve);m=Math.min(m,ue),E=Math.max(E,ue),c=Math.min(c,g(F)),G=Math.max(G,g(F))});if(!Number.isFinite(m))return null;c=Math.min(c,g(1)),G=Math.max(G,g(1));const v=(G-c)*.06||.1;return{x0:m,x1:E===m?m+1:E,y0:c-v,y1:G+v}}),j=m=>V.l+(m-C.value.x0)/(C.value.x1-C.value.x0)*(Ce-V.l-V.r),_=m=>V.t+(1-(g(m)-C.value.y0)/(C.value.y1-C.value.y0))*(P.value-V.t-V.b);function w(m,E){let c="";return E.forEach((G,v)=>{G!=null&&(c+=(c?" L":"M")+j(Y(m,v)).toFixed(1)+" "+_(G).toFixed(1))}),c}function U(m,E,c){const G=[],v=[];return m.days.forEach((d,x)=>{if(E[x]==null||c[x]==null)return;const F=j(Y(m,x)).toFixed(1);G.push(`${F} ${_(c[x]).toFixed(1)}`),v.unshift(`${F} ${_(E[x]).toFixed(1)}`)}),G.length?`M${G.join(" L")} L${v.join(" L")} Z`:""}const D=$(()=>C.value?X.series.map(m=>({...m,outer:m.p5?U(m,m.p5,m.p95):"",inner:m.p25?U(m,m.p25,m.p75):"",mid:w(m,m.line||m.p50||[])})):[]),R=$(()=>{if(!C.value)return{x:[],y:[]};const{x0:m,x1:E}=C.value,c=[];if(K.value==="start"){const v=Math.max(1,Math.ceil((E-m)/10));for(let d=Math.ceil(m);d<=E;d+=v)c.push({x:j(d),label:d===0?"start":`year ${d}`})}else{const v=new Date(m).getUTCFullYear(),d=new Date(E).getUTCFullYear(),x=Math.max(1,Math.ceil((d-v+1)/10));for(let F=v;F<=d+1;F+=x){const ve=Date.UTC(F,0,1);ve>=m&&ve<=E&&c.push({x:j(ve),label:String(F)})}}const G=[.25,.5,.75,1,1.25,1.5,2,3,4,6,8,11].filter(v=>g(v)>=C.value.y0&&g(v)<=C.value.y1).map(v=>({y:_(v),label:v===1?"0%":`${v>1?"+":""}${Math.round((v-1)*100)}%`}));return{x:c,y:G}}),n=T(null),f=m=>!n.value||n.value===m,W=T(null);function q(m){var d;if(!C.value)return;const E=m.currentTarget.getBoundingClientRect(),c=(m.clientX-E.left)/E.width*Ce,G=C.value.x0+(c-V.l)/(Ce-V.l-V.r)*(C.value.x1-C.value.x0),v=X.series.map(x=>{var pe,ye;let F=0,ve=1/0;x.days.forEach((Me,we)=>{const Oe=Math.abs(Y(x,we)-G);Oe<ve&&(ve=Oe,F=we)});const ue=(x.line||x.p50||[])[F];return{name:x.name,color:x.color,day:x.days[F],v:ue,lo:(pe=x.p5)==null?void 0:pe[F],hi:(ye=x.p95)==null?void 0:ye[F]}});W.value={px:Math.min(Math.max(c,V.l),Ce-V.r),rows:v,head:K.value==="start"?`${Math.max(0,G).toFixed(1)} years in`:(d=v[0])==null?void 0:d.day}}return(m,E)=>(s(),i("div",tn,[C.value?(s(),i("svg",{key:0,viewBox:`0 0 ${Ce} ${P.value}`,preserveAspectRatio:"none",style:Be({height:P.value+"px"}),onMousemove:q,onMouseleave:E[0]||(E[0]=c=>W.value=null)},[a("g",nn,[(s(!0),i(I,null,H(R.value.y,c=>(s(),i("line",{key:"y"+c.label,x1:V.l,x2:Ce-V.r,y1:c.y,y2:c.y},null,8,sn))),128))]),(s(!0),i(I,null,H(D.value,c=>ca((s(),i("g",{key:c.name},[c.outer?(s(),i("path",{key:0,d:c.outer,fill:c.color,"fill-opacity":"0.1",stroke:"none"},null,8,on)):k("",!0),c.inner?(s(),i("path",{key:1,d:c.inner,fill:c.color,"fill-opacity":"0.2",stroke:"none"},null,8,un)):k("",!0),a("path",{d:c.mid,stroke:c.color,"stroke-width":"2",fill:"none","vector-effect":"non-scaling-stroke"},null,8,dn)])),[[va,f(c.name)]])),128)),a("line",{x1:V.l,x2:Ce-V.r,y1:_(1),y2:_(1),class:"one"},null,8,rn),a("g",mn,[(s(!0),i(I,null,H(R.value.y,c=>(s(),i("text",{key:"yl"+c.label,x:V.l-6,y:c.y+4,"text-anchor":"end"},o(c.label),9,cn))),128)),(s(!0),i(I,null,H(R.value.x,c=>(s(),i("text",{key:"xl"+c.label,x:c.x,y:P.value-6,"text-anchor":"middle"},o(c.label),9,vn))),128))]),W.value?(s(),i("line",{key:0,x1:W.value.px,x2:W.value.px,y1:V.t,y2:P.value-V.b,class:"cross"},null,8,pn)):k("",!0)],44,an)):(s(),i("div",_n,"No equity yet.")),W.value?(s(),i("div",{key:2,class:fe(["readout",{right:W.value.px<Ce/2}])},[a("div",fn,o(W.value.head),1),(s(!0),i(I,null,H(W.value.rows.filter(c=>f(c.name)),c=>(s(),i("div",{key:c.name,class:"rr"},[a("span",{class:"sw",style:Be({background:c.color})},null,4),a("span",yn,o(c.name),1),a("b",null,o(c.v!=null?O(le)(c.v-1,{sign:!0,digits:1}):"–"),1),c.lo!=null?(s(),i("span",hn,o(O(le)(c.lo-1,{sign:!0,digits:0}))+" … "+o(O(le)(c.hi-1,{sign:!0,digits:0})),1)):k("",!0)]))),128))],2)):k("",!0),a("div",bn,[(s(!0),i(I,null,H(Q.series,c=>(s(),i("span",{key:c.name,class:fe(["lg",{dim:n.value&&n.value!==c.name,on:n.value===c.name}]),onMouseenter:G=>n.value=c.name,onMouseleave:E[1]||(E[1]=G=>n.value=null)},[a("span",{class:"sw",style:Be({background:c.color})},null,4),p(o(c.name),1)],42,kn))),128)),Q.series.some(c=>c.p5)?(s(),i("span",gn,"bands: 25–75% and 5–95% of worlds; line: median")):k("",!0),K.value==="start"?(s(),i("span",wn,"x: years from each market's start (worlds keep their own calendar)")):k("",!0)])]))}},Vn=Re($n,[["__scopeId","data-v-ccd75fcf"]]),Cn={key:0},Mn={class:"hm-tools"},Sn={class:"hm-wrap"},Un={class:"hm"},zn=["colspan"],Bn=["title"],Rn={class:"rowh"},On={class:"clip"},Tn={class:"muted clip"},An={key:0},In=["title","onClick"],Pn={__name:"ConditionsHeatmap",props:{data:{type:Object,default:null},selected:{type:Object,default:null}},emits:["select"],setup(Q,{emit:X}){const V=Q,P=X,A=[{title:"Excess / yr",value:"ann_excess",tip:"Annualized excess return inside the condition: mean daily (strategy − index) × 252"},{title:"Excess",value:"excess",tip:"Compounded return inside minus the index's over the same days"},{title:"Return",value:"ret",tip:"Compounded strategy return inside the condition"},{title:"Max DD",value:"max_dd",tip:"Worst drawdown counting only days inside the condition"}],g=T("ann_excess"),K=T(new Set(["event"])),Y=$(()=>{var n,f,W;const R=new Map;for(const q of((n=V.data)==null?void 0:n.columns)||[])R.has(q.family)||R.set(q.family,((W=(f=V.data.families)==null?void 0:f[q.family])==null?void 0:W.label)||q.family);return[...R.entries()].map(([q,m])=>({k:q,label:m}))});function C(R){const n=new Set(K.value);n.has(R)?n.delete(R):n.add(R),K.value=n}const j=$(()=>{var R;return(((R=V.data)==null?void 0:R.columns)||[]).filter(n=>!K.value.has(n.family))}),_=$(()=>{var n,f;const R=[];for(const W of j.value){const q=R[R.length-1];q&&q.family===W.family?q.n++:R.push({family:W.family,label:((f=(n=V.data.families)==null?void 0:n[W.family])==null?void 0:f.label)||W.family,n:1})}return R}),w=$(()=>{var n,f;let R=0;for(const W of((n=V.data)==null?void 0:n.rows)||[])for(const q of j.value){const m=(f=W.cells[q.key])==null?void 0:f[g.value];m!=null&&(R=Math.max(R,Math.abs(m)))}return R||1});function U(R){if(R==null)return"transparent";const n=Math.min(1,Math.abs(R)/w.value)*.75+.08;return(g.value==="max_dd"?R>-.1:R>=0)?`rgba(34, 197, 94, ${n})`:`rgba(239, 68, 68, ${n})`}const D=(R,n)=>V.selected&&V.selected.row===R&&V.selected.key===n.key;return(R,n)=>{const f=B("v-btn"),W=B("v-btn-toggle"),q=B("v-chip");return Q.data?(s(),i("div",Cn,[a("div",Mn,[u(W,{modelValue:g.value,"onUpdate:modelValue":n[0]||(n[0]=m=>g.value=m),mandatory:"",density:"compact",variant:"outlined",divided:""},{default:b(()=>[(s(),i(I,null,H(A,m=>u(f,{key:m.value,value:m.value,size:"small",title:m.tip},{default:b(()=>[p(o(m.title),1)]),_:2},1032,["value","title"])),64))]),_:1},8,["modelValue"]),n[1]||(n[1]=a("span",{class:"muted ml-3"},"Families",-1)),(s(!0),i(I,null,H(Y.value,m=>(s(),N(q,{key:m.k,size:"small",variant:K.value.has(m.k)?"outlined":"tonal",color:K.value.has(m.k)?void 0:"primary",class:"ml-1",onClick:E=>C(m.k)},{default:b(()=>[p(o(m.label),1)]),_:2},1032,["variant","color","onClick"]))),128))]),a("div",Sn,[a("table",Un,[a("thead",null,[a("tr",null,[n[2]||(n[2]=a("th",null,null,-1)),(s(!0),i(I,null,H(_.value,m=>(s(),i("th",{key:m.family,colspan:m.n,class:"fam"},o(m.label),9,zn))),128))]),a("tr",null,[n[3]||(n[3]=a("th",{class:"rowh"},null,-1)),(s(!0),i(I,null,H(j.value,m=>(s(),i("th",{key:m.key,class:"colh",title:`${m.label} (${m.source})`},o(m.label),9,Bn))),128))])]),a("tbody",null,[(s(!0),i(I,null,H(Q.data.rows,(m,E)=>(s(),i("tr",{key:E},[a("th",Rn,[a("div",On,[a("b",null,o(m.pipeline_name),1)]),a("div",Tn,[p(o(m.market.label),1),m.runs>1?(s(),i("span",An," · "+o(m.runs)+" worlds",1)):k("",!0)])]),(s(!0),i(I,null,H(j.value,c=>{var G;return s(),i("td",{key:c.key,style:Be({background:U((G=m.cells[c.key])==null?void 0:G[g.value])}),class:fe({sel:D(E,c),empty:!m.cells[c.key]}),title:m.cells[c.key]?`${c.label}: ${m.cells[c.key].days} days · strategy ${O(le)(m.cells[c.key].ret,{sign:!0})} vs index ${O(le)(m.cells[c.key].bench,{sign:!0})} · ${m.cells[c.key].trades} trades opened inside`:"not in this market",onClick:v=>m.cells[c.key]&&P("select",{row:E,key:c.key,rowData:m,col:c})},o(m.cells[c.key]?O(le)(m.cells[c.key][g.value],{sign:g.value!=="max_dd"}):""),15,In)}),128))]))),128))])])]),n[4]||(n[4]=a("div",{class:"muted hm-note"}," Rule tags (regime, volatility, trend, shocks, options) are drawn from prices the same way on real history and on worlds, so rows compare like for like. True regimes and injected scenarios exist on worlds only. ",-1))])):k("",!0)}}},qn=Re(Pn,[["__scopeId","data-v-5cc040ef"]]),En={key:0,class:"muted pa-2"},Ln={class:"ev-grid"},Nn={class:"ev-h"},jn={class:"muted"},Dn=["viewBox"],Wn=["x1","x2","y1","y2"],Fn=["x1","x2","y1","y2"],Hn=["d"],Yn=["d","stroke"],Xn=["x","y"],Gn=["x","y"],Qn=["x","y"],Zn={class:"clip"},Jn={class:"muted"},Kn={__name:"EventStudy",props:{events:{type:Array,default:()=>[]},colors:{type:Object,default:()=>({})}},setup(Q){const X=Q,V=300,P=150,A={l:40,r:8,t:10,b:20},g=$(()=>{const Y=new Map;for(const C of X.events)Y.has(C.key)||Y.set(C.key,{key:C.key,kind:C.kind,family:C.family,items:[]}),Y.get(C.key).items.push(C);return[...Y.values()]});function K(Y){let C=0,j=0;for(const f of Y.items)for(const W of[...f.path,...f.bench])C=Math.min(C,W),j=Math.max(j,W);const _=(j-C)*.1||.01;C-=_,j+=_;const w=Y.items[0].offsets,U=f=>A.l+f/(w.length-1)*(V-A.l-A.r),D=f=>A.t+(1-(f-C)/(j-C))*(P-A.t-A.b),R=f=>f.map((W,q)=>`${q?"L":"M"}${U(q).toFixed(1)} ${D(W).toFixed(1)}`).join(" ");return{zeroX:U(w.indexOf(0)),y0:D(0),lo:C,hi:j,sy:D,lines:Y.items.map(f=>({d:R(f.path),color:X.colors[`${f.pipeline_id}|${f.market.key}`]||"#4f8cff",name:`${f.pipeline_name} · ${f.market.label}`,n:f.n,after:f.path[f.path.length-1]-f.path[w.indexOf(0)-1]})),bench:R(Y.items[0].bench)}}return(Y,C)=>(s(),i("div",null,[g.value.length?k("",!0):(s(),i("div",En,"No events in these runs.")),a("div",Ln,[(s(!0),i(I,null,H(g.value,j=>(s(),i("div",{key:j.key,class:"ev"},[a("div",Nn,[a("b",null,o(j.kind),1),a("span",jn," · "+o(j.items.reduce((_,w)=>_+w.n,0))+" events",1)]),(s(),i("svg",{viewBox:`0 0 ${V} ${P}`},[(s(!0),i(I,null,H([K(j)],_=>(s(),i(I,{key:j.key},[a("line",{x1:A.l,x2:V-A.r,y1:_.y0,y2:_.y0,class:"zero"},null,8,Wn),a("line",{x1:_.zeroX,x2:_.zeroX,y1:A.t,y2:P-A.b,class:"day0"},null,8,Fn),a("path",{d:_.bench,class:"bench"},null,8,Hn),(s(!0),i(I,null,H(_.lines,w=>(s(),i("path",{key:w.name,d:w.d,stroke:w.color,fill:"none","stroke-width":"1.8"},null,8,Yn))),128)),a("text",{x:A.l-4,y:_.sy(_.hi)+10,"text-anchor":"end",class:"ax"},o(O(le)(_.hi)),9,Xn),a("text",{x:A.l-4,y:_.sy(_.lo),"text-anchor":"end",class:"ax"},o(O(le)(_.lo)),9,Gn),a("text",{x:_.zeroX,y:P-4,"text-anchor":"middle",class:"ax"},"day 0",8,Qn)],64))),128))],8,Dn)),(s(!0),i(I,null,H(K(j).lines,_=>(s(),i("div",{key:_.name,class:"ev-row"},[a("span",{class:"sw",style:Be({background:_.color})},null,4),a("span",Zn,o(_.name),1),a("span",Jn,"n "+o(_.n),1),a("b",null,o(O(le)(_.after,{sign:!0})),1)]))),128))]))),128))]),C[0]||(C[0]=a("div",{class:"muted ev-note"},"Lines: average cumulative return around the event (dashed grey: the index). The figure on each row is day −1 to day +20.",-1))]))}},es=Re(Kn,[["__scopeId","data-v-c525c5bd"]]),ls=["viewBox"],ts=["x","y","width","height"],as=["x1","x2","y1","y2"],ns=["d","stroke"],ss=["x","y"],os=["x","y"],is=["x","y"],us=["x","y"],ds={__name:"TaggedEquity",props:{days:{type:Array,default:()=>[]},values:{type:Array,default:()=>[]},brackets:{type:Array,default:()=>[]},color:{type:String,default:"#4f8cff"},height:{type:Number,default:180}},setup(Q){const X=Q,V=1e3,P={l:50,r:10,t:8,b:20},A=_=>new Date(_+"T00:00:00Z").getTime(),g=$(()=>{const _=X.days.map(A),w=X.values.filter(n=>n!=null);if(!_.length||!w.length)return null;const U=Math.min(...w,1),D=Math.max(...w,1),R=(D-U)*.08||.05;return{x0:_[0],x1:_[_.length-1]||_[0]+1,y0:U-R,y1:D+R}}),K=_=>P.l+(_-g.value.x0)/(g.value.x1-g.value.x0||1)*(V-P.l-P.r),Y=_=>P.t+(1-(_-g.value.y0)/(g.value.y1-g.value.y0))*(X.height-P.t-P.b),C=$(()=>g.value?X.values.map((_,w)=>_==null?"":`${w?"L":"M"}${K(A(X.days[w])).toFixed(1)} ${Y(_).toFixed(1)}`).join(" ").replace(/^L/,"M"):""),j=$(()=>g.value?X.brackets.map(_=>{const w=Math.max(A(_.start),g.value.x0),U=Math.min(A(_.end)+864e5,g.value.x1);return U>w?{x:K(w),w:Math.max(1.5,K(U)-K(w)),label:_.label}:null}).filter(Boolean):[]);return(_,w)=>g.value?(s(),i("svg",{key:0,viewBox:`0 0 ${V} ${Q.height}`,preserveAspectRatio:"none",style:Be({height:Q.height+"px",width:"100%",display:"block"})},[(s(!0),i(I,null,H(j.value,(U,D)=>(s(),i("rect",{key:D,x:U.x,y:P.t,width:U.w,height:Q.height-P.t-P.b,class:"br"},[a("title",null,o(U.label),1)],8,ts))),128)),a("line",{x1:P.l,x2:V-P.r,y1:Y(1),y2:Y(1),class:"one"},null,8,as),a("path",{d:C.value,stroke:Q.color,"stroke-width":"2",fill:"none","vector-effect":"non-scaling-stroke"},null,8,ns),a("text",{x:P.l-6,y:Y(g.value.y1)+10,"text-anchor":"end",class:"ax"},o((g.value.y1-1>=0?"+":"")+Math.round((g.value.y1-1)*100))+"%",9,ss),a("text",{x:P.l-6,y:Y(g.value.y0),"text-anchor":"end",class:"ax"},o(Math.round((g.value.y0-1)*100))+"%",9,os),a("text",{x:P.l,y:Q.height-4,class:"ax"},o(Q.days[0]),9,is),a("text",{x:V-P.r,y:Q.height-4,"text-anchor":"end",class:"ax"},o(Q.days[Q.days.length-1]),9,us)],12,ls)):k("",!0)}},rs=Re(ds,[["__scopeId","data-v-861b6cb9"]]),ms={class:"page lab"},cs={class:"page-head"},vs={key:0,class:"ml-1 runs-n"},ps={class:"lab-grid"},_s={class:"rail"},fs={key:0,class:"card"},ys={class:"card-title"},hs={key:1,class:"card"},bs={class:"card-title"},ks={class:"clip"},gs={class:"src"},ws={class:"src muted"},xs={class:"g2 mt-2"},$s={key:0,class:"note mt-2"},Vs=["title"],Cs={key:1,class:"pos"},Ms={class:"muted small"},Ss={class:"chips mt-1"},Us={class:"muted small mt-1"},zs={key:0,class:"setworlds mt-1"},Bs={key:1,class:"note mt-1"},Rs={class:"small"},Os={class:"muted small"},Ts={class:"muted small"},As={class:"mono"},Is={class:"g2 mt-3"},Ps={key:0,class:"muted small mt-1"},qs={class:"card"},Es={class:"card-title"},Ls={key:2,class:"sympv mt-1"},Ns={class:"mono"},js={key:0,class:"muted"},Ds={style:{color:"var(--text)"}},Ws={key:1,class:"symchips"},Fs={key:0,class:"muted"},Hs={class:"card"},Ys={class:"card-title"},Xs={class:"adv-row mt-2"},Gs=["title"],Qs={class:"card"},Zs={class:"card-title"},Js={class:"tray"},Ks={class:"clip"},eo={class:"muted nowrap"},lo={key:0,class:"muted small"},to={class:"rcol"},ao={class:"card results"},no={class:"rhead"},so={key:0,class:"muted small mr-2"},oo={key:0,class:"prog"},io={class:"d-flex align-center ga-2 mb-1"},uo={class:"muted"},ro={key:0,class:"neg clip"},mo={class:"clip"},co={class:"muted"},vo={class:"mono small"},po={class:"mono small"},_o={key:0,class:"prow-data"},fo={key:1,class:"empty"},yo={key:2,class:"tabbody"},ho={class:"sum"},bo=["onClick"],ko={key:3,class:"muted"},go={key:4,class:"neg"},wo={class:"r"},xo={key:1,class:"muted"},$o={key:3,class:"muted range"},Vo={class:"r"},Co={class:"r neg"},Mo={key:0,class:"muted range"},So={class:"r"},Uo={class:"r"},zo={class:"r"},Bo={class:"r"},Ro={key:0,class:"muted small mt-2"},Oo={key:3,class:"tabbody"},To={key:4,class:"tabbody"},Ao={key:0,class:"muted pa-4"},Io={key:2,class:"cell-detail mt-3"},Po={class:"d-flex align-center ga-2"},qo={class:"muted"},Eo={class:"muted"},Lo={class:"muted small"},No={key:5,class:"tabbody"},jo={key:0,class:"muted pa-4"},Do={key:6,class:"tabbody"},Wo={class:"neg"},Fo={key:0,class:"muted small mt-2"},Ho={class:"card mt-3"},Yo={class:"card-title"},Xo={key:0,class:"sum batches"},Go=["onClick"],Qo={class:"muted nowrap"},Zo={class:"r"},Jo={class:"muted clip pl"},Ko={class:"r nowrap"},ei={key:1,class:"muted small"},li={class:"fgrid g3"},ti={class:"fgrid g3"},ai={class:"chips mb-2"},ni={class:"muted small"},si={class:"fgrid g3"},oi={class:"fgrid g3"},ii={class:"fgrid g3"},ui={class:"checks"},di={class:"fgrid g3"},Vl=18,ri=3e3,mi=Object.assign({name:"BacktestLabView"},{__name:"BacktestLabView",setup(Q){const X=_a(),V=fa(),P=[{title:"pipeline",value:""},"1m","5m","15m","30m","1h","1d","1w"],A=[{title:"next open",value:"next_open"},{title:"close",value:"close"}],g=[{title:"real when available",value:"auto"},{title:"synthetic always",value:"synthetic"}],K=[{title:"cross the spread",value:"cross"},{title:"mid",value:"mid"}],Y=[{title:"fitted",value:"fitted"},{title:"flat %",value:"flat"}],C=[{title:"days",value:"days"},{title:"weeks",value:"weeks"},{title:"months",value:"months"}],j=[{title:"lost (paper)",value:"lost"},{title:"kept (live)",value:"kept"}],_=[{title:"Public runs",value:"public",props:{prependIcon:"mdi-earth"}},{title:"Private runs",value:"private",props:{prependIcon:"mdi-lock-outline"}}],w=["#4f8cff","#f59e0b","#22c55e","#e879f9","#06b6d4","#ef4444","#a3e635","#f472b6","#94a3b8","#fb923c"],U={retail:{label:"Retail",tip:"5 bps slippage, $0.65 a contract, options cross a fitted spread",fill_model:{slippage_bps:5,commission_per_share:0,commission_per_contract:.65,fill_at:"next_open",option_fill:"cross",option_spread_model:"fitted",option_spread_scale:.15,option_spread_pct:3,option_min_spread:.01}},zero:{label:"Zero cost",tip:"No slippage or commissions, options at the mid: what the strategy earns before costs",fill_model:{slippage_bps:0,commission_per_share:0,commission_per_contract:0,fill_at:"next_open",option_fill:"mid",option_spread_model:"fitted",option_spread_scale:.15,option_spread_pct:3,option_min_spread:.01}},harsh:{label:"Harsh",tip:"15 bps slippage, $1 a contract, 1.5× the fitted option spread",fill_model:{slippage_bps:15,commission_per_share:.005,commission_per_contract:1,fill_at:"next_open",option_fill:"cross",option_spread_model:"fitted",option_spread_scale:.22,option_spread_pct:5,option_min_spread:.02}}},D=T(null),R=T({}),n=T({symbols:"SPY,QQQ",world_symbols:"",start:"",end:"",timeframe:"",starting_cash:1e5,margin_multiplier:1,cash_interest_pct:4,seed:42,label:"",contribution_amount:0,contribution_every:1,contribution_unit:"months",fill_model:{...U.retail.fill_model},record_full:!0,liquidate_at_end:!0,use_cache:!0,warmup:"",option_data:"auto",random_outages:0,outage_max_days:3,outage_orders:"lost",visibility:"public"}),f=T([]),W=T([]),q=T([]),m=T(0),E=T(!1),c=T(!1),G=T(!1),v=T({open:!1,edit:null}),d=T(10),x=T("summary"),F=ga("backtest",()=>({...n.value,pipeline_ids:f.value,recent_pipelines:W.value,markets:q.value,market_ix:m.value,results_tab:x.value})),ve=$(()=>{var l;return((l=D.value)==null?void 0:l.providers)||[]}),ue=$(()=>ve.value.find(l=>{var e;return l.name===((e=D.value)==null?void 0:e.provider)})||ve.value[0]||null),pe=$(()=>{var l;return((l=ue.value)==null?void 0:l.name)||""}),ye=$(()=>{var l;return((l=ue.value)==null?void 0:l.caps)||null}),Me=$(()=>{var e,r;const l=((e=D.value)==null?void 0:e.option_provider)||"";return!l||l===pe.value?null:(((r=D.value)==null?void 0:r.option_providers)||[]).find(y=>y.name===l)||null}),we=$(()=>Me.value||ue.value),Oe=$(()=>{var l;return(((l=D.value)==null?void 0:l.option_providers)||[]).some(e=>{var r;return e.name===((r=we.value)==null?void 0:r.name)})}),dl=$(()=>{var l;return!!D.value&&(n.value.option_data==="synthetic"||!(D.value.option_quote_providers||[]).includes((l=we.value)==null?void 0:l.name))}),Le=$(()=>{var e;const l=(e=ye.value)==null?void 0:e.timeframes;return P.filter(r=>typeof r!="string"||!(l!=null&&l.length)||l.includes(r))});async function Ne(){const l=await te(()=>ee.backtestDefaults(),null);return l&&(R.value=Object.fromEntries((l.providers||[]).map(e=>[e.name,e.status||{}]))),l&&(D.value=l),l}async function rl(l={}){const e=await Ne();e&&(n.value={...n.value,symbols:Array.isArray(e.symbols)?e.symbols.join(","):e.symbols||n.value.symbols,start:e.start||n.value.start,end:e.end||n.value.end,timeframe:e.timeframe||"",starting_cash:e.starting_cash??n.value.starting_cash,fill_model:{...n.value.fill_model,...e.fill_model||{}},option_data:e.option_data||n.value.option_data}),n.value=wa(n.value,l);const r=n.value;r.timeframe=Ze(r.timeframe,Le.value,""),r.option_data=Ze(r.option_data,g,"auto"),r.fill_model.fill_at=Ze(r.fill_model.fill_at,A,"next_open"),r.fill_model.option_fill=Ze(r.fill_model.option_fill,K,"cross"),r.outage_orders=Ze(r.outage_orders,j,"lost");const y=Array.isArray(l.markets)?l.markets:[],h=y[Math.min(Number(l.market_ix)||0,y.length-1)];q.value=[h||je(r.start,r.end)],m.value=0,Array.isArray(l.recent_pipelines)&&(W.value=l.recent_pipelines.slice(0,12)),typeof l.results_tab=="string"&&(x.value=l.results_tab)}function je(l,e){var r;return{kind:"history",start:l,end:e,label:`Real · ${((r=ue.value)==null?void 0:r.label)||"history"} ${String(l).slice(0,4)}–${String(e).slice(0,4)}`}}const S=$(()=>q.value[m.value]||null),oe=$(()=>q.value.some(l=>l.kind==="history")),Te=$(()=>q.value.find(l=>l.kind==="history")||null),M=l=>l.kind==="set"?"mdi-earth-box":l.kind==="world"?"mdi-earth":"mdi-history";function xe(l){q.value=[l],m.value=0,l.kind==="history"&&(n.value.start=l.start,n.value.end=l.end)}ge(()=>[n.value.start,n.value.end],([l,e])=>{const r=Te.value;r&&(r.start!==l||r.end!==e)&&Object.assign(r,je(l,e))});const ie=T({}),ae=T({}),De=T({}),me=$(()=>{const l=S.value,e=(l==null?void 0:l.kind)==="world"?ae.value[l.world_id]:(l==null?void 0:l.kind)==="set"?ie.value[l.name]:null;return e!=null&&e.first_tradable&&(e!=null&&e.end)?{lo:e.first_tradable,hi:e.end}:null});ge(me,l=>{const e=S.value;!l||!e||e.kind==="history"||((!e.start||e.start<l.lo||e.start>l.hi)&&(e.start=l.lo),(!e.end||e.end>l.hi||e.end<l.lo)&&(e.end=l.hi))},{immediate:!0});function Ke(){const l=S.value,e=me.value;!l||!e||((!l.start||l.start<e.lo)&&(l.start=e.lo),l.start>e.hi&&(l.start=e.hi),(!l.end||l.end>e.hi)&&(l.end=e.hi),l.end<l.start&&(l.end=e.hi))}async function Ul(){const l=await te(()=>ee.worldSets(),[]);ie.value=Object.fromEntries((l||[]).map(e=>[e.name,e]));for(const e of q.value){if(e.kind==="set"&&!De.value[e.name]){const r=await te(()=>ee.worldSet(e.name),null);r&&(De.value={...De.value,[e.name]:r.worlds||[]})}if(e.kind==="world"&&!ae.value[e.world_id]){const r=await te(()=>ee.world(e.world_id),null);r&&(ae.value={...ae.value,[e.world_id]:r})}}}ge(()=>q.value.map(l=>l.kind+(l.world_id||l.name||"")).join(),Ul);const zl=l=>{var e;return l.kind==="set"&&((e=ie.value[l.name])==null?void 0:e.count)||1},We=$(()=>f.value.length*q.value.reduce((l,e)=>l+zl(e),0)),Fe=T([]),He=$(()=>Math.max(0,Math.round(Number(n.value.warmup)||0))),el=$(()=>{const l=Fe.value.map(y=>y.needed);if(!l.length)return"";const e=Math.min(...l),r=Math.max(...l);return e===r?`${e}`:`${e}–${r}`}),Tt=$(()=>He.value?`${He.value} warm-up bars`:`auto warm-up${el.value?" ("+el.value+" bars)":""}`),At=$(()=>Fe.value.filter(l=>!l.auto&&l.bars<l.needed)),he=T(null),It=$(()=>{var l;return oe.value&&!!((l=he.value)!=null&&l.applies)&&(he.value.gaps||[]).length>0}),Pt=$(()=>{var l;return oe.value&&n.value.use_cache&&!((l=he.value)!=null&&l.applies)?Fe.value.filter(e=>{var r;return(r=e.cache_gaps)==null?void 0:r.length}):[]});let Bl=null,Rl=0;function qt(){var l;if(clearTimeout(Bl),!((l=D.value)!=null&&l.cache_only)||!f.value.length||!oe.value){he.value=null;return}Bl=setTimeout(async()=>{const e=++Rl,r=await te(()=>{var y;return ee.backtestCoverage({pipeline_ids:f.value,provider:pe.value||"",option_provider:((y=Me.value)==null?void 0:y.name)||"",option_data:n.value.option_data||"auto",symbols:n.value.symbols,start:n.value.start,end:n.value.end,timeframe:n.value.timeframe||null,warmup_bars:He.value})},null);e===Rl&&(he.value=r)},450)}let Ol=null,Tl=0;function Et(){if(clearTimeout(Ol),!f.value.length){Fe.value=[];return}Ol=setTimeout(async()=>{const l=++Tl,e=await te(()=>ee.backtestWarmup({pipeline_ids:f.value,timeframe:n.value.timeframe||null,start:n.value.start,provider:oe.value?pe.value||"":"world",symbols:n.value.symbols,warmup_bars:He.value}),null);l===Tl&&e&&(Fe.value=e)},400)}ge(()=>[f.value.join(","),n.value.timeframe,n.value.start,n.value.warmup,n.value.symbols,pe.value,oe.value],Et),ge(()=>{var l;return[f.value.join(","),n.value.timeframe,n.value.start,n.value.end,n.value.warmup,n.value.symbols,n.value.option_data,pe.value,(l=D.value)==null?void 0:l.cache_only,oe.value]},qt);function Lt(l){return`${l.symbol} ${l.timeframe}: ${l.have_from?`cached ${l.have_from} → ${l.have_to}`:"not cached"} (needs ${l.need_from} → ${l.need_to})`}const be=T(null),ll=T(!1);let Al=null,Il=0;const Nt=$(()=>({label:"Backtest",start:n.value.start,end:n.value.end,provider:pe.value,timeframe:n.value.timeframe||"1d"}));function jt(){clearTimeout(Al);const l=n.value.symbols,e=pe.value;if(!e||!oe.value||/@world\./.test(l||"")||!/[*?[@]|(^|[\s,;])-/.test(l||"")){be.value=null;return}Al=setTimeout(async()=>{const r=++Il;ll.value=!0;const y=await te(()=>ee.symbols(e,l),null);r===Il&&(ll.value=!1,be.value=y)},350)}ge(()=>[n.value.symbols,pe.value,oe.value],jt);const Dt=$(()=>{const l=n.value.timeframe;return l?Ee.value.filter(e=>{var r;return f.value.includes(e.id)&&((r=e.settings)==null?void 0:r.designed_for)&&e.settings.designed_for!==l}):[]}),ml=$(()=>f.value.map(l=>Ee.value.find(e=>e.id===l)||{id:l,name:l,missing:!0}));function Pl(){const l=X.query.pipeline;l&&!f.value.includes(l)&&f.value.push(l)}const tl=$(()=>{const l=n.value.fill_model;for(const[e,r]of Object.entries(U))if(Object.entries(r.fill_model).every(([y,h])=>String(l[y])===String(h)))return r.label;return"custom"});function Wt(l){n.value.fill_model={...U[l].fill_model}}const ql=$(()=>{const l=n.value,e=[l.margin_multiplier>1?`${l.margin_multiplier}× margin`:"cash account",`${tl.value} fills`,Tt.value];return l.contribution_amount>0&&e.push(`+${Bt(l.contribution_amount)} / ${l.contribution_every} ${l.contribution_unit}`),l.random_outages>0&&e.push(`${l.random_outages} outages`),e.join(" · ")}),$e=T(null),Se=T({}),de=$(()=>Pe.value.find(l=>l.id===$e.value)||null),Ye=$(()=>de.value&&["pending","running"].includes(de.value.status)),cl=T([]);function Ft(){var r,y;const l=[];let e=0;for(const h of q.value){const z=zl(h);if(h.kind==="set"){for(const ne of f.value)l.push({name:((r=ml.value.find(Z=>Z.id===ne))==null?void 0:r.name)||ne,market:h.label,from:e,n:z,stride:f.value.length,offset:f.value.indexOf(ne)});e+=z*f.value.length}else for(const ne of f.value)l.push({name:((y=ml.value.find(Z=>Z.id===ne))==null?void 0:y.name)||ne,market:h.label,from:e,n:1,stride:1,offset:0}),e++}return l}const Ht=$(()=>cl.value.map(l=>{const r=Array.from({length:l.n},(re,ol)=>l.from+l.offset+ol*l.stride).map(re=>Se.value[re]).filter(Boolean),y=r.filter(re=>re.status==="done").length,h=r.filter(re=>re.status==="failed").length,z=r.find(re=>re.status==="running"),ne=(y+(z!=null&&z.total?z.tick/z.total:0))/l.n,Z=de.value;let J=z?"running":y+h===l.n?h?"failed":"done":r.length?"running":"pending";return Z&&!["pending","running"].includes(Z.status)&&J!=="done"&&J!=="failed"&&(J=Z.status==="done"?"done":Z.status),{...l,done:y,failed:h,cur:z,frac:ne,status:J}})),al=$(()=>{var r,y;const l=Object.values(Se.value).filter(h=>h.status==="done"||h.status==="failed").length,e=((y=(r=de.value)==null?void 0:r.progress)==null?void 0:y.count)||cl.value.reduce((h,z)=>h+z.n,0)||1;return{n:l,count:e}});let nl=[];ul(()=>{nl.push(Je("backtest.progress",l=>{l.job_id===$e.value&&(Se.value={...Se.value,[l.index??0]:l})})),nl.push(Je("settings.changed",Ne),Je("connectors.changed",Ne)),nl.push(Je("job.update",l=>{var e;((e=l.job)==null?void 0:e.id)===$e.value&&!["pending","running"].includes(l.job.status)&&Ae(l.job.batchId)}))}),Cl(()=>nl.forEach(l=>l())),ul(async()=>{var r,y;const l=await F.restore();if(await Promise.all([rl(l),Ee.value.length?null:pa()]),Array.isArray(l.pipeline_ids)){const h=new Set(Ee.value.map(z=>z.id));f.value=l.pipeline_ids.filter(z=>typeof z=="string"&&(!h.size||h.has(z)))}if(Pl(),F.track(),hl(),Ul(),!$e.value){const h=Pe.value.find(z=>z.kind==="backtest"&&["pending","running"].includes(z.status));h&&($e.value=h.id,((r=h.progress)==null?void 0:r.index)!=null&&(Se.value={[h.progress.index]:h.progress}))}if(Ye.value&&((y=de.value)!=null&&y.batchId)){L.value={id:de.value.batchId,summary:{rows:[],markets:[]},conditions:null,bands:null,worlds:null},Ll(),Nl();return}const e=X.query.batch;e?Ae(String(e)):ke.value[0]&&Ae(ke.value[0].id)}),ge(()=>X.query.pipeline,Pl);async function Yt(){var l,e,r,y;if(!f.value.length){ze("pick at least one pipeline","warning");return}if(!q.value.length){ze("add a market","warning");return}E.value=!0,F.save();try{const h=n.value,z={pipeline_ids:f.value,symbols:((l=S.value)==null?void 0:l.kind)==="history"?h.symbols:h.world_symbols||"",provider:pe.value,start:((e=Te.value)==null?void 0:e.start)||h.start,end:((r=Te.value)==null?void 0:r.end)||h.end,timeframe:h.timeframe||null,starting_cash:Number(h.starting_cash)||1e5,margin_multiplier:Number(h.margin_multiplier)||1,cash_interest_pct:Number(h.cash_interest_pct??4)||0,contribution_amount:Math.max(0,Number(h.contribution_amount)||0),contribution_every:Math.max(1,Math.round(Number(h.contribution_every)||1)),contribution_unit:h.contribution_unit||"months",fill_model:Object.fromEntries(Object.entries(h.fill_model).map(([Z,J])=>[Z,typeof J=="string"&&!isNaN(Number(J))&&Z!=="fill_at"?Number(J):J])),seed:Number(h.seed)||0,label:h.label,warmup_bars:He.value,record_full:!!h.record_full,liquidate_at_end:!!h.liquidate_at_end,use_cache:!!h.use_cache,option_data:h.option_data||"auto",option_provider:((y=Me.value)==null?void 0:y.name)||"",random_outages:Math.max(0,Math.round(Number(h.random_outages)||0)),outage_max_days:Number(h.outage_max_days)||3,outage_orders:h.outage_orders||"lost",visibility:xl.auth&&h.visibility||"public",markets:q.value.map(Z=>Z.kind==="history"?{kind:"history",start:Z.start,end:Z.end,label:Z.label}:Z.kind==="set"?{kind:"set",name:Z.name,final_check:!!Z.final_check,label:Z.label,start:Z.start,end:Z.end}:{kind:"world",world_id:Z.world_id,label:Z.label,start:Z.start,end:Z.end})};cl.value=Ft();const ne=await ee.startBacktest(z);$e.value=ne.id,Se.value={},L.value={id:ne.batchId,summary:{rows:[],markets:[]},conditions:null,bands:null,worlds:null},V.replace({query:{...X.query,batch:ne.batchId}}),Nl(),W.value=[...new Set([...f.value,...W.value])].slice(0,12),Pe.value.findIndex(Z=>Z.id===ne.id)<0&&Pe.value.unshift(ne),x.value="summary",ze(`started ${We.value} backtest${We.value===1?"":"s"}`,"info")}catch(h){Sl(h)}finally{E.value=!1}}async function Xt(){$e.value&&(await te(()=>ee.stopBacktest($e.value)),ze("stop requested","info"))}const L=T(null),El=T(!1);async function Ae(l){if(l){El.value=!0;try{const e=await te(()=>ee.batchSummary(l),null);if(!e)return;L.value={id:l,summary:e,conditions:null,bands:null,worlds:null},X.query.batch!==l&&V.replace({query:{...X.query,batch:l}}),jl()}finally{El.value=!1}}}let sl=null,vl=!1;async function Ll(){var e,r,y;const l=L.value;if(!(!l||vl)){vl=!0;try{const h=await te(()=>ee.batchSummary(l.id),null);if(h&&((e=L.value)==null?void 0:e.id)===l.id&&(l.summary=h),x.value==="equity"){const z=await te(()=>ee.batchBands(l.id),null);z&&((r=L.value)==null?void 0:r.id)===l.id&&(l.bands=z)}if(x.value==="worlds"){const z=await te(()=>ee.batchWorlds(l.id),null);z&&((y=L.value)==null?void 0:y.id)===l.id&&(l.worlds=z)}}finally{vl=!1}}}function Nl(){pl(),sl=setInterval(()=>{if(!Ye.value){pl(),L.value&&Ae(L.value.id);return}Ll()},ri)}function pl(){sl&&clearInterval(sl),sl=null}Cl(pl);const Gt=$(()=>{const l={};for(const e of Object.values(Se.value))e!=null&&e.run_id&&e.equity!=null&&(l[e.run_id]=e);return l});function _l(l){const e=l.run_id&&Gt.value[l.run_id],r=Number(n.value.starting_cash)||0;return e&&r?e.equity/r-1:null}async function jl(){const l=L.value;l&&(x.value==="equity"&&!l.bands&&(l.bands=await te(()=>ee.batchBands(l.id),{series:[]})),(x.value==="conditions"||x.value==="events")&&!l.conditions&&(l.conditions=await te(()=>ee.batchConditions(l.id),{columns:[],rows:[],events:[]}),l.bands==null&&(l.bands=await te(()=>ee.batchBands(l.id),{series:[]}))),x.value==="worlds"&&!l.worlds&&(l.worlds=await te(()=>ee.batchWorlds(l.id),[])))}ge(x,jl);const fl=$(()=>{var e,r;const l={};return(((r=(e=L.value)==null?void 0:e.summary)==null?void 0:r.rows)||[]).forEach((y,h)=>{l[`${y.pipeline_id}|${y.market.key}`]=w[h%w.length]}),l}),Ue=$(()=>{var l,e;return((e=(l=L.value)==null?void 0:l.summary)==null?void 0:e.rows)||[]}),Dl=$(()=>Ue.value.some(l=>l.market.kind==="set"));function Qt(l){if(l.market.kind==="set"){Ge.value=`${l.pipeline_id}|${l.market.key}`,x.value="worlds";return}l.run_id&&V.push({name:"run",params:{id:l.run_id}})}function Zt(){var r;const l=(r=L.value)==null?void 0:r.summary;if(!l)return;f.value=[...new Set(l.rows.map(y=>y.pipeline_id))],q.value=(l.markets||[]).slice(0,1).map(y=>{if(y.kind==="set")return{kind:"set",name:y.set,final_check:!1,label:y.label,holdout:!!y.holdout};if(y.kind==="world")return{kind:"world",world_id:y.world_id,label:y.label};const[,,h,z]=String(y.key||"").split(":");return je(h||n.value.start,z||n.value.end)});const e=q.value.find(y=>y.kind==="history");e&&(n.value.start=e.start,n.value.end=e.end),m.value=0,ze("loaded the batch's pipelines and market","info")}function Jt(){const l=Ue.value.filter(e=>e.run_id).map(e=>e.run_id);l.length&&V.push({name:"compare",query:{ids:l.join(",")}})}const Wl=$(()=>{var l,e;return(((e=(l=L.value)==null?void 0:l.bands)==null?void 0:e.series)||[]).map(r=>({...r,name:`${r.pipeline_name} · ${r.market.label}`,color:fl.value[`${r.pipeline_id}|${r.market.key}`]}))}),ce=T(null),yl=T(null);async function Kt(l){var y;ce.value=l,yl.value=null;const e=Ue.value.find(h=>h.pipeline_id===l.rowData.pipeline_id&&h.market.key===l.rowData.market.key),r=(e==null?void 0:e.run_id)||((y=e==null?void 0:e.run_ids)==null?void 0:y[0]);r&&(yl.value=await te(()=>ee.runConditions(r),null))}const Xe=$(()=>{if(!ce.value)return null;const l=ce.value.rowData;return Wl.value.find(e=>e.pipeline_id===l.pipeline_id&&e.market.key===l.market.key)||null}),ea=$(()=>{var l;return(((l=yl.value)==null?void 0:l.tags)||[]).filter(e=>{var r;return e.key===((r=ce.value)==null?void 0:r.key)}).map(e=>({start:e.start,end:e.end,label:`${e.label} ${e.start} → ${e.end}`}))}),Ve=$(()=>ce.value?ce.value.rowData.cells[ce.value.key]:null),Ge=T(""),la=$(()=>{var l;return(((l=L.value)==null?void 0:l.worlds)||[]).filter(e=>!Ge.value||`${e.pipeline_id}|${e.market.key}`===Ge.value)}),ta=[{title:"World",key:"world"},{title:"Pipeline",key:"pipeline_name"},{title:"Scenario",key:"scenario"},{title:"Return",key:"total_return",align:"end"},{title:"CAGR",key:"cagr",align:"end"},{title:"Max DD",key:"max_drawdown",align:"end"},{title:"Sharpe",key:"sharpe",align:"end"},{title:"Trades",key:"trades",align:"end"}],aa=$(()=>[{title:"All",value:""},...Ue.value.filter(l=>l.market.kind==="set").map(l=>({title:`${l.pipeline_name} · ${l.market.label}`,value:`${l.pipeline_id}|${l.market.key}`}))]),ke=T([]);async function hl(){const l=await te(()=>ee.runs({mode:"backtest",limit:400}),null),e=new Map;for(const r of(l==null?void 0:l.runs)||[]){if(!r.batch_id)continue;e.has(r.batch_id)||e.set(r.batch_id,{id:r.batch_id,label:r.label,at:r.started_at,n:0,mine:0,pipelines:new Set});const y=e.get(r.batch_id);y.n++,y.pipelines.add(r.pipeline_name),r.editable&&y.mine++}ke.value=[...e.values()].slice(0,30)}const bl=l=>Pe.value.some(e=>e.batchId===l&&["pending","running"].includes(e.status)),_e=T(null),kl=T(!1);function Fl(l){_e.value=ke.value.find(e=>e.id===l)||{id:l,label:"",n:0,mine:0}}async function na(){var r,y;const l=_e.value;if(!l)return;kl.value=!0;const e=await te(()=>ee.purgeRuns({mode:"backtest",batch_id:l.id}),null);if(kl.value=!1,_e.value=null,!!e&&(ze(`deleted ${e.deleted} run(s) of ${l.label||l.id}`,"info"),((r=de.value)==null?void 0:r.batchId)===l.id&&($e.value=null),await hl(),((y=L.value)==null?void 0:y.id)===l.id)){L.value=null;const{batch:h,...z}=X.query;V.replace({query:z}),ke.value[0]&&Ae(ke.value[0].id)}}return ge(()=>Pe.value.map(l=>l.status).join(),()=>hl()),(l,e)=>{var Ql,Zl,Jl,Kl,et,lt,tt,at,nt,st,ot,it,ut,dt,rt,mt,ct,vt,pt,_t,ft,yt,ht,bt,kt,gt,wt,xt,$t,Vt,Ct,Mt,St,Ut;const r=B("v-spacer"),y=B("v-btn"),h=B("v-select"),z=B("v-icon"),ne=B("WorldSetLink"),Z=B("router-link"),J=B("v-text-field"),re=B("v-chip"),ol=B("WorldLink"),sa=B("SymbolLink"),Qe=B("v-tab"),oa=B("v-tabs"),gl=B("v-progress-linear"),ia=B("v-data-table"),Hl=B("v-card-text"),Yl=B("v-card-actions"),Xl=B("v-card"),Gl=B("v-dialog"),ua=B("v-card-title"),wl=B("v-checkbox");return s(),i("div",ms,[a("div",cs,[e[54]||(e[54]=a("h1",null,"Backtest Lab",-1)),u(r),Ye.value?(s(),N(y,{key:0,color:"warning",variant:"tonal","prepend-icon":"mdi-stop",onClick:Xt},{default:b(()=>[...e[53]||(e[53]=[p("Stop",-1)])]),_:1})):k("",!0),O(xl).auth?(s(),N(h,{key:1,modelValue:n.value.visibility,"onUpdate:modelValue":e[0]||(e[0]=t=>n.value.visibility=t),items:_,class:"vis-pick","hide-details":"","prepend-inner-icon":n.value.visibility==="private"?"mdi-lock-outline":"mdi-earth",title:"Public: everyone on this hub sees these runs. Private: only you (and admins)."},null,8,["modelValue","prepend-inner-icon"])):k("",!0),u(y,{color:"primary",variant:"flat","prepend-icon":"mdi-play",loading:E.value,disabled:Ye.value||!f.value.length||!q.value.length||It.value,title:((Ql=S.value)==null?void 0:Ql.kind)==="set"?`${f.value.length} pipeline(s) on each of the set's worlds = ${We.value} runs`:"",onClick:Yt},{default:b(()=>[p("Run "+o(f.value.length)+" pipeline"+o(f.value.length===1?"":"s"),1),We.value>f.value.length?(s(),i("span",vs,"("+o(O(qe)(We.value))+" runs)",1)):k("",!0)]),_:1},8,["loading","disabled","title"])]),a("div",ps,[a("div",_s,[S.value?k("",!0):(s(),i("div",fs,[a("div",ys,[u(z,{icon:"mdi-earth",size:"14"}),e[55]||(e[55]=p("Market",-1))]),u(y,{size:"small",variant:"tonal",color:"primary","prepend-icon":"mdi-plus",onClick:e[1]||(e[1]=t=>v.value={open:!0,edit:null})},{default:b(()=>[...e[56]||(e[56]=[p("Choose a market",-1)])]),_:1})])),S.value?(s(),i("div",hs,[a("div",bs,[u(z,{icon:M(S.value),size:"14"},null,8,["icon"]),a("span",ks,[S.value.kind==="set"?(s(),i(I,{key:0},[e[57]||(e[57]=p("World set ",-1)),u(ne,{name:S.value.name},null,8,["name"])],64)):(s(),i(I,{key:1},[p(o(S.value.kind==="world"?"World":"Real history"),1)],64))]),u(r),a("a",{class:"manage",title:"Real history, one generated world, or a world set",onClick:e[2]||(e[2]=t=>v.value={open:!0,edit:0})},"Change")]),S.value.kind==="history"?(s(),i(I,{key:0},[a("div",gs,[a("span",{class:fe(["dot",{ok:(Jl=R.value[(Zl=ue.value)==null?void 0:Zl.name])==null?void 0:Jl.ok}])},null,2),a("b",null,o(((Kl=ue.value)==null?void 0:Kl.label)||"no historical connector"),1),O(xl).admin?(s(),N(Z,{key:0,to:{name:"settings",query:{tab:"connectors"}},class:"manage ml-auto"},{default:b(()=>[...e[58]||(e[58]=[p("sources",-1)])]),_:1})):k("",!0)]),a("div",ws,[p("Options: "+o(((et=Me.value)==null?void 0:et.label)||"same as bars")+o(D.value&&!Oe.value?" · synthetic only":"")+" ",1),dl.value?(s(),N(xa,{key:0,class:"ml-1","fill-model":n.value.fill_model,"option-data":n.value.option_data},null,8,["fill-model","option-data"])):k("",!0)]),a("div",xs,[u(J,{modelValue:n.value.start,"onUpdate:modelValue":e[3]||(e[3]=t=>n.value.start=t),type:"date",label:"Start",density:"compact","hide-details":""},null,8,["modelValue"]),u(J,{modelValue:n.value.end,"onUpdate:modelValue":e[4]||(e[4]=t=>n.value.end=t),type:"date",label:"End",density:"compact","hide-details":""},null,8,["modelValue"])]),(lt=D.value)!=null&<.cache_only?(s(),i("div",$s,[u(z,{icon:"mdi-database-lock-outline",size:"14"}),p(" Cache-only hub"+o(D.value.cache_only_applies?": cached bars only":" (admin: may download)")+". ",1),(at=(tt=he.value)==null?void 0:tt.gaps)!=null&&at.length?(s(),i("span",{key:0,class:fe(he.value.applies?"neg":"muted")},[p(o(he.value.gaps.length)+" not cached: ",1),a("span",{class:"mono",title:he.value.gaps.map(Lt).join(`
|
|
2
|
+
`)},o(he.value.gaps.slice(0,4).map(t=>t.symbol).join(", ")),9,Vs)],2)):he.value?(s(),i("span",Cs,"All cached.")):k("",!0)])):k("",!0)],64)):S.value.kind==="set"?(s(),i(I,{key:1},[a("div",Ms,o((nt=ie.value[S.value.name])==null?void 0:nt.description),1),a("div",Ss,[u(re,{size:"x-small",variant:"tonal"},{default:b(()=>{var t;return[p(o((t=ie.value[S.value.name])==null?void 0:t.count)+" worlds",1)]}),_:1}),(s(!0),i(I,null,H(((st=ie.value[S.value.name])==null?void 0:st.scenarios)||[],t=>(s(),N(re,{key:t.name,size:"x-small",variant:"outlined"},{default:b(()=>[p(o(t.count)+" "+o(t.label),1)]),_:2},1024))),128)),(ot=ie.value[S.value.name])!=null&&ot.controls?(s(),N(re,{key:0,size:"x-small",variant:"outlined",color:"secondary"},{default:b(()=>[p(o(ie.value[S.value.name].controls)+" control",1)]),_:1})):k("",!0)]),a("div",Us,o((it=ie.value[S.value.name])==null?void 0:it.generated)+" / "+o((ut=ie.value[S.value.name])==null?void 0:ut.count)+" generated · "+o((dt=ie.value[S.value.name])==null?void 0:dt.template_label),1),(rt=De.value[S.value.name])!=null&&rt.length?(s(),i("div",zs,[e[59]||(e[59]=a("span",{class:"muted"},"Worlds",-1)),(s(!0),i(I,null,H(De.value[S.value.name].filter(t=>!t.pending),(t,se)=>(s(),N(ne,{key:t.id,name:S.value.name,"world-id":t.id},{default:b(()=>[a("span",{class:fe({ctl:t.control})},"#"+o(se+1),3)]),_:2},1032,["name","world-id"]))),128))])):k("",!0),S.value.holdout?(s(),i("div",Bs,[u(z,{icon:"mdi-lock-outline",size:"13"}),p(" Held out: this run counts as a final check (used "+o(((mt=ie.value[S.value.name])==null?void 0:mt.uses)||0)+"× so far).",1)])):k("",!0)],64)):(s(),i(I,{key:2},[a("div",Rs,[a("b",null,[u(ol,{id:S.value.world_id,name:((ct=ae.value[S.value.world_id])==null?void 0:ct.name)||S.value.label},null,8,["id","name"])])]),a("div",Os,"seed "+o((vt=ae.value[S.value.world_id])==null?void 0:vt.seed)+" · "+o(((pt=ae.value[S.value.world_id])==null?void 0:pt.scenario_label)||((_t=ae.value[S.value.world_id])==null?void 0:_t.scenario))+" · "+o((yt=(ft=ae.value[S.value.world_id])==null?void 0:ft.start)==null?void 0:yt.slice(0,4))+"–"+o((bt=(ht=ae.value[S.value.world_id])==null?void 0:ht.end)==null?void 0:bt.slice(0,4)),1),a("div",Ts,[e[60]||(e[60]=p("Index ",-1)),a("span",As,o((kt=ae.value[S.value.world_id])==null?void 0:kt.index),1),p(" · "+o((wt=(gt=ae.value[S.value.world_id])==null?void 0:gt.tickers)==null?void 0:wt.length)+" symbols",1)])],64)),S.value.kind!=="history"?(s(),i(I,{key:3},[a("div",Is,[u(J,{modelValue:S.value.start,"onUpdate:modelValue":e[5]||(e[5]=t=>S.value.start=t),type:"date",label:"Start",density:"compact","hide-details":"",min:(xt=me.value)==null?void 0:xt.lo,max:($t=me.value)==null?void 0:$t.hi,disabled:!me.value,onBlur:Ke,onChange:Ke},null,8,["modelValue","min","max","disabled"]),u(J,{modelValue:S.value.end,"onUpdate:modelValue":e[6]||(e[6]=t=>S.value.end=t),type:"date",label:"End",density:"compact","hide-details":"",min:S.value.start||((Vt=me.value)==null?void 0:Vt.lo),max:(Ct=me.value)==null?void 0:Ct.hi,disabled:!me.value,onBlur:Ke,onChange:Ke},null,8,["modelValue","min","max","disabled"])]),me.value?(s(),i("div",Ps,[p(" Data from "+o(me.value.lo)+" to "+o(me.value.hi)+" (the year before is warm-up). ",1),S.value.start!==me.value.lo||S.value.end!==me.value.hi?(s(),i("a",{key:0,class:"manage",onClick:e[7]||(e[7]=t=>{S.value.start=me.value.lo,S.value.end=me.value.hi})},"All of it")):k("",!0)])):k("",!0)],64)):k("",!0)])):k("",!0),a("div",qs,[a("div",Es,[u(z,{icon:"mdi-format-list-bulleted",size:"14"}),e[61]||(e[61]=p("Symbols",-1))]),S.value&&S.value.kind!=="history"?(s(),N(Ot,{key:0,modelValue:n.value.world_symbols,"onUpdate:modelValue":e[8]||(e[8]=t=>n.value.world_symbols=t),loading:ll.value,"show-sets":!1,placeholder:"blank = all of the world's tickers","persistent-placeholder":"",title:"Blank runs every pipeline on the world's own tickers (@world.all). @world.index, @world.stocks, @world.tech… pick some; a real ticker you type (SPY, AAPL) gets a stand-in path.",hint:"@world.all · @world.stocks · @world.index · @world.tech"},null,8,["modelValue","loading"])):(s(),N(Ot,{key:1,modelValue:n.value.symbols,"onUpdate:modelValue":e[9]||(e[9]=t=>n.value.symbols=t),placeholder:"SPY, @mag7, AA*",loading:ll.value,"show-sets":!be.value,title:"Tickers every pipeline runs on. Blank = each pipeline's own.",hint:"@sets · wildcards · -SYM"},null,8,["modelValue","loading","show-sets"])),be.value?(s(),i("div",Ls,[(s(!0),i(I,null,H(be.value.errors,(t,se)=>(s(),i("div",{key:se,class:"neg"},[a("b",Ns,o(se),1),p(" — "+o(t),1)]))),128)),be.value.count?(s(),i("div",js,[a("b",Ds,o(be.value.count),1),e[62]||(e[62]=p(" symbols",-1))])):k("",!0),be.value.count?(s(),i("div",Ws,[(s(!0),i(I,null,H(be.value.symbols.slice(0,Vl),t=>(s(),N(sa,{key:t,sec:t,ctx:Nt.value,class:"symchip"},null,8,["sec","ctx"]))),128)),be.value.count>Vl?(s(),i("span",Fs,"+"+o(be.value.count-Vl),1)):k("",!0)])):k("",!0)])):k("",!0),u(h,{modelValue:n.value.timeframe,"onUpdate:modelValue":e[10]||(e[10]=t=>n.value.timeframe=t),items:Le.value,label:"Timeframe",density:"compact",class:"mt-5","hide-details":"",title:"Bar size for every run. pipeline = each strategy on the timeframe it was built for. Worlds serve daily bars (and 5-minute ones when made with them)."},null,8,["modelValue","items"]),(s(!0),i(I,null,H(Dt.value,t=>(s(),i("div",{key:t.id,class:"note mt-1"},[u(z,{icon:"mdi-alert-outline",size:"13",color:"warning"}),p(" "+o(t.name)+" was built for "+o(t.settings.designed_for)+".",1)]))),128)),(s(!0),i(I,null,H(Pt.value,t=>(s(),i("div",{key:t.pipeline_id,class:"note mt-1"},[u(z,{icon:"mdi-database-alert-outline",size:"13",color:"warning"}),p(" "+o(t.name)+" warms up from "+o(t.from)+"; the cache starts later for "+o(t.cache_gaps.length)+" symbol(s).",1)]))),128)),(s(!0),i(I,null,H(At.value,t=>(s(),i("div",{key:"s"+t.pipeline_id,class:"note mt-1"},[u(z,{icon:"mdi-alert-outline",size:"13",color:"warning"}),p(" "+o(t.name)+" reads "+o(t.needed)+" bars; "+o(t.bars)+" leave early ticks short.",1)]))),128))]),a("div",Hs,[a("div",Ys,[u(z,{icon:"mdi-cash-multiple",size:"14"}),e[63]||(e[63]=p("Account",-1))]),u(J,{modelValue:n.value.starting_cash,"onUpdate:modelValue":e[11]||(e[11]=t=>n.value.starting_cash=t),modelModifiers:{number:!0},type:"number",min:"0",step:"1000",label:"Starting cash",prefix:"$",title:"Cash each run starts with"},null,8,["modelValue"]),a("div",Xs,[a("span",{class:"muted small clip",title:ql.value},o(ql.value),9,Gs),a("a",{class:"manage nowrap",onClick:e[12]||(e[12]=t=>c.value=!0)},"Advanced…")])]),a("div",Qs,[a("div",Zs,[u(z,{icon:"mdi-graph-outline",size:"14"}),p("Pipelines ("+o(f.value.length)+") ",1),u(r),a("a",{class:"manage",onClick:e[13]||(e[13]=t=>G.value=!0)},"+ Add / change")]),a("div",Js,[(s(!0),i(I,null,H(ml.value,t=>{var se;return s(),i("div",{key:t.id,class:fe(["tchip",{missing:t.missing}])},[a("span",Ks,o(t.name),1),a("span",eo,o(((se=t.settings)==null?void 0:se.timeframe)||"1d"),1),u(z,{icon:"mdi-close",size:"13",class:"mx",onClick:Ie=>f.value=f.value.filter(il=>il!==t.id)},null,8,["onClick"])],2)}),128)),f.value.length?k("",!0):(s(),i("div",lo,[e[64]||(e[64]=p("None yet. ",-1)),a("a",{class:"manage",onClick:e[14]||(e[14]=t=>G.value=!0)},"Choose pipelines")]))])])]),a("div",to,[a("div",ao,[a("div",no,[u(oa,{modelValue:x.value,"onUpdate:modelValue":e[15]||(e[15]=t=>x.value=t),density:"compact"},{default:b(()=>[u(Qe,{value:"summary"},{default:b(()=>[...e[65]||(e[65]=[p("Summary",-1)])]),_:1}),u(Qe,{value:"equity"},{default:b(()=>[...e[66]||(e[66]=[p("Equity",-1)])]),_:1}),u(Qe,{value:"conditions"},{default:b(()=>[...e[67]||(e[67]=[p("Conditions",-1)])]),_:1}),u(Qe,{value:"events"},{default:b(()=>[...e[68]||(e[68]=[p("Events",-1)])]),_:1}),u(Qe,{value:"worlds",disabled:!Dl.value},{default:b(()=>[...e[69]||(e[69]=[p("Worlds",-1)])]),_:1},8,["disabled"])]),_:1},8,["modelValue"]),u(r),L.value?(s(),i("span",so,o(((Mt=ke.value.find(t=>t.id===L.value.id))==null?void 0:Mt.label)||L.value.id),1)):k("",!0),L.value?(s(),N(y,{key:1,size:"x-small",variant:"text","prepend-icon":"mdi-replay",class:"mr-1",title:"Put this batch's pipelines and market in the setup, to run it again or change it",onClick:Zt},{default:b(()=>[...e[70]||(e[70]=[p("Use this setup",-1)])]),_:1})):k("",!0),L.value&&Ue.value.some(t=>t.run_id)?(s(),N(y,{key:2,size:"x-small",variant:"tonal","prepend-icon":"mdi-compare-horizontal",onClick:Jt},{default:b(()=>[...e[71]||(e[71]=[p("Compare",-1)])]),_:1})):k("",!0),L.value&&!bl(L.value.id)&&((St=ke.value.find(t=>t.id===L.value.id))!=null&&St.mine)?(s(),N(y,{key:3,size:"x-small",variant:"text",color:"error",icon:"mdi-delete-outline",class:"ml-1",title:"Delete this batch and its runs",onClick:e[16]||(e[16]=t=>Fl(L.value.id))})):k("",!0)]),de.value&&(Ye.value||!L.value)?(s(),i("div",oo,[a("div",io,[u(re,{size:"x-small",color:O(zt)(de.value.status),variant:"flat"},{default:b(()=>[p(o(de.value.status),1)]),_:1},8,["color"]),a("b",null,o(de.value.label),1),a("span",uo,o(O(qe)(al.value.n))+" / "+o(O(qe)(al.value.count))+" runs · "+o(O(ya)(de.value.started,de.value.ended)),1),de.value.error?(s(),i("span",ro,o(de.value.error),1)):k("",!0)]),u(gl,{"model-value":100*al.value.n/al.value.count,height:"6",rounded:"",color:"info",class:"mb-2"},null,8,["model-value"]),(s(!0),i(I,null,H(Ht.value,t=>{var se,Ie,il;return s(),i("div",{key:t.name+t.market,class:"prow"},[a("span",mo,[a("b",null,o(t.name),1),e[72]||(e[72]=p()),a("span",co,"· "+o(t.market),1)]),u(re,{size:"x-small",color:O(zt)(t.status),variant:"flat"},{default:b(()=>[p(o(t.status),1)]),_:2},1032,["color"]),u(gl,{"model-value":100*t.frac,height:"6",rounded:"",color:t.failed?"error":t.status==="done"?"success":"info"},null,8,["model-value","color"]),a("span",vo,o(t.n>1?`${t.done}/${t.n} worlds`:(se=t.cur)!=null&&se.total?`${O(qe)(t.cur.tick)}/${O(qe)(t.cur.total)}`:""),1),a("span",po,o(((Ie=t.cur)==null?void 0:Ie.equity)!=null?O(Bt)(t.cur.equity):""),1),(il=t.cur)!=null&&il.data?(s(),i("div",_o,[u(z,{icon:"mdi-cloud-download-outline",size:"13"}),p(o(O(ha)(t.cur.data))+" ",1),u(gl,{"model-value":O(ba)(t.cur.data)??0,height:"3",style:{"max-width":"120px"}},null,8,["model-value"])])):k("",!0)])}),128))])):k("",!0),!L.value&&!de.value?(s(),i("div",fo,[u(z,{icon:"mdi-flask-outline",size:"40",class:"muted"}),e[73]||(e[73]=a("div",null,[a("b",null,"Pipelines on a market")],-1)),e[74]||(e[74]=a("div",{class:"muted"},"Choose a market (real history, one world, or a world set), pick pipelines and Run. Results land here as they come in: a distribution across a set's worlds, equity bands, and how each pipeline does in bull markets, bear markets, vol spikes and around earnings.",-1))])):k("",!0),L.value&&x.value==="summary"?(s(),i("div",yo,[a("table",ho,[e[76]||(e[76]=a("thead",null,[a("tr",null,[a("th",null,"Pipeline"),a("th",null,"Market"),a("th",{class:"r"},"Return"),a("th",{class:"r"},"CAGR"),a("th",{class:"r"},"Max DD"),a("th",{class:"r"},"Sharpe"),a("th",{class:"r"},"Trades"),a("th",{class:"r",title:"Share of a set's worlds where the strategy beat the world's index"},"Beat index"),a("th",{class:"r",title:"Median return on the set's control worlds (every planted edge off)"},"Control")])],-1)),a("tbody",null,[(s(!0),i(I,null,H(Ue.value,t=>(s(),i("tr",{key:t.pipeline_id+t.market.key,class:"clickable",onClick:se=>Qt(t)},[a("td",null,[a("span",{class:"sw",style:Be({background:fl.value[`${t.pipeline_id}|${t.market.key}`]})},null,4),p(o(t.pipeline_name),1)]),a("td",null,[u(z,{icon:M(t.market),size:"13",class:"mr-1"},null,8,["icon"]),t.market.kind==="world"?(s(),N(ol,{key:0,id:t.market.world_id,name:t.market.label},null,8,["id","name"])):t.market.kind==="set"?(s(),N(ne,{key:1,name:t.market.set},null,8,["name"])):(s(),i(I,{key:2},[p(o(t.market.label),1)],64)),t.running?(s(),i("span",ko," · "+o(t.running)+" running",1)):k("",!0),t.failed?(s(),i("span",go," · "+o(t.failed)+" failed",1)):k("",!0)]),a("td",wo,[t.total_return==null&&_l(t)!=null?(s(),i("span",{key:0,class:fe(["live",O($l)(_l(t))]),title:"So far: the run is still going"},[p(o(O(le)(_l(t),{sign:!0}))+" ",1),e[75]||(e[75]=a("i",null,"so far",-1))],2)):t.total_return==null&&t.running?(s(),i("span",xo,"running…")):(s(),i("span",{key:2,class:fe(O($l)(t.total_return))},o(O(le)(t.total_return,{sign:!0})),3)),t.total_return_p5!=null?(s(),i("div",$o,o(O(le)(t.total_return_p5,{sign:!0}))+" … "+o(O(le)(t.total_return_p95,{sign:!0})),1)):k("",!0)]),a("td",Vo,o(O(le)(t.cagr)),1),a("td",Co,[p(o(O(le)(t.max_drawdown)),1),t.max_drawdown_p5!=null?(s(),i("div",Mo,"worst "+o(O(le)(t.max_drawdown_p5)),1)):k("",!0)]),a("td",So,o(O(Rt)(t.sharpe)),1),a("td",Uo,o(O(qe)(t.trades)),1),a("td",zo,o(t.beat_index!=null?O(le)(t.beat_index):""),1),a("td",Bo,o(t.control_total_return!=null?O(le)(t.control_total_return,{sign:!0}):""),1)],8,bo))),128))])]),Dl.value?(s(),i("div",Ro,"World-set rows show the median across the set's worlds, with the 5th–95th percentile under it. Click a set row for its worlds, a single run for its report. A strategy that only wins where the control worlds win too is riding drift, not an edge.")):k("",!0)])):k("",!0),L.value&&x.value==="equity"?(s(),i("div",Oo,[u(Vn,{series:Wl.value,height:360},null,8,["series"])])):k("",!0),L.value&&x.value==="conditions"?(s(),i("div",To,[L.value.conditions?(s(),N(qn,{key:1,data:L.value.conditions,selected:ce.value,onSelect:Kt},null,8,["data","selected"])):(s(),i("div",Ao,"Tagging conditions…")),ce.value&&Ve.value?(s(),i("div",Io,[a("div",Po,[a("b",null,o(ce.value.rowData.pipeline_name),1),a("span",qo,"· "+o(ce.value.rowData.market.label)+" ·",1),a("b",null,o(ce.value.col.label),1),a("span",Eo,"("+o(ce.value.col.family)+", "+o(ce.value.col.source)+")",1),u(r),u(y,{icon:"mdi-close",size:"x-small",variant:"text",onClick:e[17]||(e[17]=t=>ce.value=null)})]),a("div",Lo,[p(o(Ve.value.days)+" days inside · strategy "+o(O(le)(Ve.value.ret,{sign:!0}))+" vs index "+o(O(le)(Ve.value.bench,{sign:!0}))+" · drawdown inside "+o(O(le)(Ve.value.max_dd))+" · "+o(Ve.value.trades)+" trades opened inside ",1),Ve.value.worlds>1?(s(),i(I,{key:0},[p(" · median of "+o(Ve.value.worlds)+" worlds (shading: the first world)",1)],64)):k("",!0)]),Xe.value?(s(),N(rs,{key:0,days:Xe.value.days,values:Xe.value.line||Xe.value.p50,brackets:ea.value,color:Xe.value.color},null,8,["days","values","brackets","color"])):k("",!0)])):k("",!0)])):k("",!0),L.value&&x.value==="events"?(s(),i("div",No,[L.value.conditions?(s(),N(es,{key:1,events:L.value.conditions.events,colors:fl.value},null,8,["events","colors"])):(s(),i("div",jo,"Finding events…"))])):k("",!0),L.value&&x.value==="worlds"?(s(),i("div",Do,[u(h,{modelValue:Ge.value,"onUpdate:modelValue":e[18]||(e[18]=t=>Ge.value=t),items:aa.value,density:"compact","hide-details":"",style:{"max-width":"420px"},class:"mb-2"},null,8,["modelValue","items"]),u(ia,{headers:ta,items:la.value,density:"compact","items-per-page":50,class:"clickable","onClick:row":e[19]||(e[19]=(t,{item:se})=>O(V).push({name:"run",params:{id:se.run_id}}))},{"item.world":b(({item:t})=>[u(ne,{name:t.market.set,"world-id":t.world_id,text:t.world},null,8,["name","world-id","text"]),t.control?(s(),N(re,{key:0,size:"x-small",variant:"tonal",color:"secondary",class:"ml-1"},{default:b(()=>[...e[77]||(e[77]=[p("control",-1)])]),_:1})):k("",!0)]),"item.total_return":b(({item:t})=>[a("span",{class:fe(O($l)(t.total_return))},o(O(le)(t.total_return,{sign:!0})),3)]),"item.cagr":b(({item:t})=>[p(o(O(le)(t.cagr)),1)]),"item.max_drawdown":b(({item:t})=>[a("span",Wo,o(O(le)(t.max_drawdown)),1)]),"item.sharpe":b(({item:t})=>[p(o(O(Rt)(t.sharpe)),1)]),_:1},8,["items"]),Ue.value.some(t=>t.hidden)?(s(),i("div",Fo,[u(z,{icon:"mdi-lock-outline",size:"13"}),e[78]||(e[78]=p(" Held-out sets show per-world results only for a final check.",-1))])):k("",!0)])):k("",!0)]),a("div",Ho,[a("div",Yo,[u(z,{icon:"mdi-history",size:"14"}),e[79]||(e[79]=p("Recent batches",-1))]),ke.value.length?(s(),i("table",Xo,[e[80]||(e[80]=a("thead",null,[a("tr",null,[a("th",null,"Batch"),a("th",null,"Started"),a("th",{class:"r"},"Runs"),a("th",null,"Pipelines"),a("th")])],-1)),a("tbody",null,[(s(!0),i(I,null,H(ke.value.slice(0,d.value),t=>{var se;return s(),i("tr",{key:t.id,class:fe(["clickable",{active:t.id===((se=L.value)==null?void 0:se.id)}]),onClick:Ie=>Ae(t.id)},[a("td",null,[a("b",null,o(t.label||t.id),1)]),a("td",Qo,o(O(ka)(t.at)),1),a("td",Zo,o(t.n),1),a("td",Jo,o([...t.pipelines].join(", ")),1),a("td",Ko,[t.mine?(s(),N(y,{key:0,size:"x-small",variant:"text",density:"comfortable",icon:"mdi-delete-outline",class:"del",disabled:bl(t.id),title:bl(t.id)?"Still running: stop it first":"Delete this batch and its runs",onClick:Ml(Ie=>Fl(t.id),["stop"])},null,8,["disabled","title","onClick"])):k("",!0)])],10,Go)}),128))])])):(s(),i("div",ei,"No backtests yet.")),ke.value.length>d.value?(s(),N(y,{key:2,size:"x-small",variant:"text",class:"mt-1",onClick:e[20]||(e[20]=t=>d.value+=10)},{default:b(()=>[...e[81]||(e[81]=[p("Show more",-1)])]),_:1})):k("",!0)])])]),u(Ha,{modelValue:v.value.open,"onUpdate:modelValue":e[21]||(e[21]=t=>v.value.open=t),market:v.value.edit!=null?q.value[v.value.edit]:null,"provider-label":(Ut=ue.value)==null?void 0:Ut.label,"default-start":n.value.start,"default-end":n.value.end,onSave:xe},null,8,["modelValue","market","provider-label","default-start","default-end"]),u(ln,{modelValue:G.value,"onUpdate:modelValue":e[22]||(e[22]=t=>G.value=t),selected:f.value,"onUpdate:selected":e[23]||(e[23]=t=>f.value=t),recent:W.value},null,8,["modelValue","selected","recent"]),u(Gl,{"model-value":!!_e.value,"max-width":"420","onUpdate:modelValue":e[25]||(e[25]=t=>{t||(_e.value=null)})},{default:b(()=>[_e.value?(s(),N(Xl,{key:0,title:"Delete batch?"},{default:b(()=>[u(Hl,null,{default:b(()=>[e[82]||(e[82]=p(" Delete ",-1)),a("b",null,o(_e.value.label||_e.value.id),1),p(": "+o(_e.value.mine<_e.value.n?`your ${_e.value.mine} of its ${_e.value.n}`:_e.value.n)+" run(s) and all their recorded data. This cannot be undone. ",1)]),_:1}),u(Yl,null,{default:b(()=>[u(r),u(y,{onClick:e[24]||(e[24]=t=>_e.value=null)},{default:b(()=>[...e[83]||(e[83]=[p("Cancel",-1)])]),_:1}),u(y,{color:"error",variant:"flat",loading:kl.value,onClick:na},{default:b(()=>[...e[84]||(e[84]=[p("Delete",-1)])]),_:1},8,["loading"])]),_:1})]),_:1})):k("",!0)]),_:1},8,["model-value"]),u(Gl,{modelValue:c.value,"onUpdate:modelValue":e[52]||(e[52]=t=>c.value=t),"max-width":"820",scrollable:""},{default:b(()=>[u(Xl,{class:"adv-dlg"},{default:b(()=>[u(ua,{class:"d-flex align-center"},{default:b(()=>[e[85]||(e[85]=p("Advanced settings",-1)),u(r),u(y,{icon:"mdi-close",variant:"text",size:"small",onClick:e[26]||(e[26]=t=>c.value=!1)})]),_:1}),u(Hl,null,{default:b(()=>[e[86]||(e[86]=a("div",{class:"sec-h muted"},"Account",-1)),a("div",li,[u(J,{modelValue:n.value.margin_multiplier,"onUpdate:modelValue":e[27]||(e[27]=t=>n.value.margin_multiplier=t),modelModifiers:{number:!0},type:"number",step:"0.1",label:"Margin ×",title:"Buying power as a multiple of equity: 1 = cash account, 2 = Reg T margin"},null,8,["modelValue"]),u(J,{modelValue:n.value.cash_interest_pct,"onUpdate:modelValue":e[28]||(e[28]=t=>n.value.cash_interest_pct=t),modelModifiers:{number:!0},type:"number",step:"0.25",min:"0",label:"Cash interest %/yr"},null,8,["modelValue"]),u(J,{modelValue:n.value.label,"onUpdate:modelValue":e[29]||(e[29]=t=>n.value.label=t),label:"Batch label",placeholder:"random, e.g. jolly-otter"},null,8,["modelValue"])]),a("div",ti,[u(J,{modelValue:n.value.contribution_amount,"onUpdate:modelValue":e[30]||(e[30]=t=>n.value.contribution_amount=t),modelModifiers:{number:!0},type:"number",min:"0",step:"100",label:"Add capital",prefix:"$",title:"Deposited on a schedule; not profit (returns are time-weighted)"},null,8,["modelValue"]),u(J,{modelValue:n.value.contribution_every,"onUpdate:modelValue":e[31]||(e[31]=t=>n.value.contribution_every=t),modelModifiers:{number:!0},type:"number",min:"1",label:"Every",disabled:!(n.value.contribution_amount>0)},null,8,["modelValue","disabled"]),u(h,{modelValue:n.value.contribution_unit,"onUpdate:modelValue":e[32]||(e[32]=t=>n.value.contribution_unit=t),items:C,label:"Unit",disabled:!(n.value.contribution_amount>0)},null,8,["modelValue","disabled"])]),e[87]||(e[87]=a("div",{class:"sec-h muted"},"Fill profile",-1)),a("div",ai,[(s(),i(I,null,H(U,(t,se)=>u(re,{key:se,variant:tl.value===t.label?"flat":"outlined",color:tl.value===t.label?"primary":void 0,title:t.tip,onClick:Ie=>Wt(se)},{default:b(()=>[p(o(t.label),1)]),_:2},1032,["variant","color","title","onClick"])),64)),a("span",ni,o(tl.value==="custom"?"custom settings":""),1)]),e[88]||(e[88]=a("div",{class:"sec-h muted"},"Stock fills",-1)),a("div",si,[u(J,{modelValue:n.value.fill_model.slippage_bps,"onUpdate:modelValue":e[33]||(e[33]=t=>n.value.fill_model.slippage_bps=t),modelModifiers:{number:!0},type:"number",step:"0.5",label:"Slippage (bps)"},null,8,["modelValue"]),u(J,{modelValue:n.value.fill_model.commission_per_share,"onUpdate:modelValue":e[34]||(e[34]=t=>n.value.fill_model.commission_per_share=t),modelModifiers:{number:!0},type:"number",step:"0.001",label:"Comm. / share"},null,8,["modelValue"]),u(h,{modelValue:n.value.fill_model.fill_at,"onUpdate:modelValue":e[35]||(e[35]=t=>n.value.fill_model.fill_at=t),items:A,label:"Market fills at"},null,8,["modelValue"])]),e[89]||(e[89]=a("div",{class:"sec-h muted"},"Options",-1)),a("div",oi,[u(h,{modelValue:n.value.option_data,"onUpdate:modelValue":e[36]||(e[36]=t=>n.value.option_data=t),items:g,label:"Option prices",title:"Real history only: real option bars where the option connector has them. Worlds price options off their own surface."},null,8,["modelValue"]),u(h,{modelValue:n.value.fill_model.option_fill,"onUpdate:modelValue":e[37]||(e[37]=t=>n.value.fill_model.option_fill=t),items:K,label:"Option fills"},null,8,["modelValue"]),u(J,{modelValue:n.value.fill_model.commission_per_contract,"onUpdate:modelValue":e[38]||(e[38]=t=>n.value.fill_model.commission_per_contract=t),modelModifiers:{number:!0},type:"number",step:"0.01",label:"Comm. / contract"},null,8,["modelValue"]),u(h,{modelValue:n.value.fill_model.option_spread_model,"onUpdate:modelValue":e[39]||(e[39]=t=>n.value.fill_model.option_spread_model=t),items:Y,label:"Modeled option spread"},null,8,["modelValue"]),n.value.fill_model.option_spread_model!=="flat"?(s(),N(J,{key:0,modelValue:n.value.fill_model.option_spread_scale,"onUpdate:modelValue":e[40]||(e[40]=t=>n.value.fill_model.option_spread_scale=t),modelModifiers:{number:!0},type:"number",step:"0.01",label:"Spread scale"},null,8,["modelValue"])):(s(),N(J,{key:1,modelValue:n.value.fill_model.option_spread_pct,"onUpdate:modelValue":e[41]||(e[41]=t=>n.value.fill_model.option_spread_pct=t),modelModifiers:{number:!0},type:"number",step:"0.5",label:"Option spread %"},null,8,["modelValue"])),u(J,{modelValue:n.value.fill_model.option_min_spread,"onUpdate:modelValue":e[42]||(e[42]=t=>n.value.fill_model.option_min_spread=t),modelModifiers:{number:!0},type:"number",step:"0.01",label:"Min option spread $"},null,8,["modelValue"])]),e[90]||(e[90]=a("div",{class:"sec-h muted"},"Run",-1)),a("div",ii,[u(J,{modelValue:n.value.warmup,"onUpdate:modelValue":e[43]||(e[43]=t=>n.value.warmup=t),type:"number",label:"Warm-up bars",clearable:"",placeholder:el.value?"auto · "+el.value:"auto","persistent-placeholder":""},null,8,["modelValue","placeholder"]),u(J,{modelValue:n.value.seed,"onUpdate:modelValue":e[44]||(e[44]=t=>n.value.seed=t),modelModifiers:{number:!0},type:"number",label:"Seed"},null,8,["modelValue"])]),a("div",ui,[u(wl,{modelValue:n.value.record_full,"onUpdate:modelValue":e[45]||(e[45]=t=>n.value.record_full=t),label:"Record full detail",density:"compact","hide-details":"",title:"Signals and tree evaluations (world-set runs always skip them to keep the database lean)"},null,8,["modelValue"]),u(wl,{modelValue:n.value.liquidate_at_end,"onUpdate:modelValue":e[46]||(e[46]=t=>n.value.liquidate_at_end=t),label:"Liquidate at end",density:"compact","hide-details":""},null,8,["modelValue"]),u(wl,{modelValue:n.value.use_cache,"onUpdate:modelValue":e[47]||(e[47]=t=>n.value.use_cache=t),label:"Use bar cache",density:"compact","hide-details":""},null,8,["modelValue"])]),e[91]||(e[91]=a("div",{class:"sec-h muted"},"Robustness · simulated hub outages",-1)),a("div",di,[u(J,{modelValue:n.value.random_outages,"onUpdate:modelValue":e[48]||(e[48]=t=>n.value.random_outages=t),modelModifiers:{number:!0},type:"number",min:"0",label:"Outages"},null,8,["modelValue"]),u(J,{modelValue:n.value.outage_max_days,"onUpdate:modelValue":e[49]||(e[49]=t=>n.value.outage_max_days=t),modelModifiers:{number:!0},type:"number",min:"0",step:"0.5",label:"Longest (days)",disabled:!(n.value.random_outages>0)},null,8,["modelValue","disabled"]),u(h,{modelValue:n.value.outage_orders,"onUpdate:modelValue":e[50]||(e[50]=t=>n.value.outage_orders=t),items:j,label:"Working orders while down",disabled:!(n.value.random_outages>0)},null,8,["modelValue","disabled"])])]),_:1}),u(Yl,null,{default:b(()=>[u(r),u(y,{color:"primary",variant:"flat",onClick:e[51]||(e[51]=t=>c.value=!1)},{default:b(()=>[...e[92]||(e[92]=[p("Done",-1)])]),_:1})]),_:1})]),_:1})]),_:1},8,["modelValue"])])}}}),yi=Re(mi,[["__scopeId","data-v-e1cd547d"]]);export{yi as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.chain[data-v-a882f6db]{font-size:12px}.pad[data-v-a882f6db]{padding:10px}.exp[data-v-a882f6db]{border-top:1px solid var(--line)}.exp-head[data-v-a882f6db]{display:flex;align-items:center;gap:6px;padding:5px 6px;cursor:pointer;-webkit-user-select:none;user-select:none}.exp-head[data-v-a882f6db]:hover{background:var(--panel-2)}.tag[data-v-a882f6db]{font-size:10px;border:1px solid var(--line);border-radius:3px;padding:0 3px;color:var(--muted)}.ml-auto[data-v-a882f6db]{margin-left:auto}.grid[data-v-a882f6db]{width:100%;border-collapse:collapse;table-layout:fixed;-webkit-user-select:none;user-select:none}.grid th[data-v-a882f6db]{font-weight:500;color:var(--muted);font-size:11px;padding:2px 4px;text-align:right;border-bottom:1px solid var(--line)}.grid td[data-v-a882f6db]{padding:2px 4px;text-align:right;border-bottom:1px solid rgba(127,127,127,.07);white-space:nowrap}.side-head th[data-v-a882f6db]{text-align:center;letter-spacing:.08em;font-size:10px}.calls-h[data-v-a882f6db]{color:#22c55e!important}.puts-h[data-v-a882f6db]{color:#ef4444!important}.strike[data-v-a882f6db],.strike-h[data-v-a882f6db]{text-align:center!important;font-weight:600;background:var(--panel-2)}.itm[data-v-a882f6db]{background:#4f8cff17}.q[data-v-a882f6db]{cursor:pointer}.q.bid[data-v-a882f6db]:hover{background:#ef444440}.q.ask[data-v-a882f6db]:hover{background:#22c55e40}.q.sel[data-v-a882f6db]{outline:1px solid var(--accent);outline-offset:-1px}.atm td[data-v-a882f6db]{border-bottom:1px solid var(--accent)}.anchored td[data-v-a882f6db]{background:#4f8cff38!important}.anchored td[data-v-a882f6db]:first-child{box-shadow:inset 3px 0 0 var(--accent)}.focused .strike[data-v-a882f6db]{box-shadow:inset 0 0 0 1px var(--accent)}.q.held[data-v-a882f6db]{background:#facc1538;box-shadow:inset 0 0 0 1px #facc15cc}.ticket-row td[data-v-a882f6db]{padding:0;text-align:left;white-space:normal;background:var(--panel-2)}.inline-ticket[data-v-a882f6db]{padding:8px 12px 10px;border-left:3px solid var(--accent);border-bottom:1px solid var(--accent);font-family:Inter,Segoe UI,system-ui,sans-serif;-webkit-user-select:text;user-select:text}.rg[data-v-719ebb10]{width:100%;display:block}.rg text[data-v-719ebb10]{fill:var(--muted);font-size:10px;font-family:ui-monospace,Menlo,monospace}.gain[data-v-719ebb10]{fill:#22c55e2e}.loss[data-v-719ebb10]{fill:#ef44442e}.zero[data-v-719ebb10]{stroke:var(--line)}.pl[data-v-719ebb10]{fill:none;stroke:var(--accent);stroke-width:1.6}.spot[data-v-719ebb10]{stroke:var(--muted);stroke-dasharray:3 3}.be[data-v-719ebb10]{fill:var(--text)}.band[data-v-719ebb10]{fill:var(--accent);opacity:.07}.today[data-v-719ebb10]{fill:none;stroke:var(--accent);stroke-width:1.2;stroke-dasharray:4 3}.was[data-v-719ebb10]{fill:none;stroke:var(--muted);stroke-width:1.2;stroke-dasharray:2 3}.legs[data-v-65de8f06]{width:100%;border-collapse:collapse;font-size:12px}.legs td[data-v-65de8f06]{padding:2px 4px}.kv[data-v-65de8f06]{display:grid;grid-template-columns:1fr auto;gap:3px 16px}.kv b[data-v-65de8f06]{text-align:right;font-variant-numeric:tabular-nums}.views[data-v-65de8f06]{height:26px}.err[data-v-65de8f06]{color:var(--neg)}.warn[data-v-65de8f06]{color:#f59e0b;margin-bottom:6px}.small[data-v-65de8f06]{font-size:11px}.grid[data-v-65de8f06]{width:100%;border-collapse:collapse;font-size:12px}.grid th[data-v-65de8f06]{text-align:right;font-weight:500;color:var(--muted);padding:2px 6px;border-bottom:1px solid var(--line)}.grid td[data-v-65de8f06]{text-align:right;padding:2px 6px;font-variant-numeric:tabular-nums}.grid th[data-v-65de8f06]:first-child,.grid td[data-v-65de8f06]:first-child{text-align:left}.grid tr.cur td[data-v-65de8f06]{background:var(--panel-2)}.legend[data-v-65de8f06]{display:flex;flex-wrap:wrap;gap:4px 14px;font-size:11px}.sw[data-v-65de8f06]{display:inline-block;width:14px;height:0;vertical-align:middle;margin-right:2px;border-top:2px solid var(--accent)}.sw.now[data-v-65de8f06]{border-top-style:dashed}.sw.was[data-v-65de8f06]{border-top:2px dotted var(--muted)}.sw.band[data-v-65de8f06]{height:8px;border:0;background:var(--accent);opacity:.2}.sw.fillc[data-v-65de8f06]{width:8px;height:8px;border:0;border-radius:50%;background:var(--accent)}.sw.limc[data-v-65de8f06]{width:8px;height:8px;border:2px solid #f59e0b;border-radius:50%}.bars[data-v-65de8f06]{display:grid;gap:3px}.bar-row[data-v-65de8f06]{display:grid;grid-template-columns:44px 1fr;align-items:center;gap:6px;font-size:11px}.bar[data-v-65de8f06]{height:6px;background:var(--panel-2);border-radius:3px;overflow:hidden}.bar i[data-v-65de8f06]{display:block;height:100%;background:var(--muted)}.bar i.acc[data-v-65de8f06]{background:var(--accent)}.q[data-v-65de8f06]{margin-bottom:12px}.q-head[data-v-65de8f06]{font-size:12px;display:flex;gap:6px;flex-wrap:wrap}.strip[data-v-65de8f06]{position:relative;height:30px;margin:2px 4px 0}.track[data-v-65de8f06]{position:absolute;top:8px;height:4px;background:var(--line);border-radius:2px}.tick[data-v-65de8f06]{position:absolute;top:4px;width:0;height:12px;border-left:1px solid var(--muted)}.tick em[data-v-65de8f06]{position:absolute;top:13px;font-style:normal;font-size:10px;color:var(--muted);white-space:nowrap;transform:translate(-50%)}.tick.bid em[data-v-65de8f06]{transform:none;left:-2px}.tick.ask em[data-v-65de8f06]{transform:translate(-100%)}.tick.mid[data-v-65de8f06]{border-left-style:dashed}.dot[data-v-65de8f06]{position:absolute;top:5px;width:10px;height:10px;margin-left:-5px;border-radius:50%}.dot.fill[data-v-65de8f06]{background:var(--accent)}.dot.lim[data-v-65de8f06]{border:2px solid #f59e0b;background:transparent}.pc[data-v-65de8f06]{width:100%;display:block}.pc text[data-v-65de8f06]{fill:var(--muted);font-size:10px;font-family:ui-monospace,Menlo,monospace}.rng[data-v-65de8f06]{stroke:var(--line);stroke-width:2}.cl[data-v-65de8f06]{fill:none;stroke:var(--text);stroke-width:1.4}.lvl[data-v-65de8f06]{stroke-width:1;stroke-dasharray:4 3;stroke:var(--muted)}.lvl.lim[data-v-65de8f06],.pc text.lim[data-v-65de8f06]{stroke:#f59e0b;fill:#f59e0b}.lvl.stp[data-v-65de8f06],.pc text.stp[data-v-65de8f06]{stroke:var(--neg);fill:var(--neg)}.lvl.avg[data-v-65de8f06],.pc text.avg[data-v-65de8f06]{stroke:var(--accent);fill:var(--accent)}.pc text.lim[data-v-65de8f06],.pc text.stp[data-v-65de8f06],.pc text.avg[data-v-65de8f06]{stroke:none}.ticket[data-v-e80ba722]{font-size:12.5px}.t-head[data-v-e80ba722]{display:flex;align-items:center;gap:8px;margin-bottom:6px}.hint[data-v-e80ba722]{padding:6px 0 2px}.legs[data-v-e80ba722]{width:100%;border-collapse:collapse;font-size:12px}.legs td[data-v-e80ba722]{padding:2px 4px}.legs .grow[data-v-e80ba722]{width:100%}.ratio input[data-v-e80ba722]{width:44px}.nf[data-v-e80ba722]{background:var(--panel-2);border:1px solid var(--line);border-radius:4px;color:var(--text);padding:2px 4px}.t-row[data-v-e80ba722]{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:8px}.w-qty[data-v-e80ba722]{max-width:80px}.w-type[data-v-e80ba722]{max-width:120px}.w-px[data-v-e80ba722]{max-width:150px}.w-every[data-v-e80ba722],.w-step[data-v-e80ba722]{max-width:90px}.walk[data-v-e80ba722]{margin-top:2px}.px-btns[data-v-e80ba722]{display:flex;flex-direction:column;gap:2px}.small[data-v-e80ba722]{font-size:11.5px}.sg[data-v-968cfe78]{font-size:12.5px}.sg-head[data-v-968cfe78]{display:flex;align-items:center;gap:6px;margin-bottom:8px}.sg-args[data-v-968cfe78]{display:grid;grid-template-columns:1fr 1fr;gap:6px}.sg-params[data-v-968cfe78]{margin-top:6px}.sg-res[data-v-968cfe78]{border-top:1px solid var(--line);padding-top:8px}.sg-legs[data-v-968cfe78]{width:100%;border-collapse:collapse;font-size:12px}.sg-legs th[data-v-968cfe78]{color:var(--muted);font-weight:500;text-align:left;padding:2px 4px}.sg-legs td[data-v-968cfe78]{padding:2px 4px;border-top:1px solid var(--line)}.sg-legs .num[data-v-968cfe78]{text-align:right}.sg-sum[data-v-968cfe78]{display:flex;flex-wrap:wrap;gap:4px 14px;margin:6px 0}.sg-why[data-v-968cfe78]{margin:0 0 8px 16px;padding:0;color:var(--muted)}.small[data-v-968cfe78]{font-size:11.5px}.adv[data-v-e4cec33f]{font-size:12.5px}.adv-head[data-v-e4cec33f]{display:flex;align-items:center;gap:6px;margin-bottom:8px}.prop[data-v-e4cec33f]{border:1px solid var(--line);border-radius:8px;padding:8px 10px}.why[data-v-e4cec33f]{margin:4px 0 0 16px;padding:0;color:var(--muted)}.notes[data-v-e4cec33f]{color:var(--muted);font-size:11.5px;margin-top:2px}.small[data-v-e4cec33f]{font-size:11.5px}.dropped[data-v-e4cec33f]{border-top:1px solid var(--line);padding-top:6px}.facts[data-v-a97b848e]{display:flex;flex-wrap:wrap;gap:8px 24px;align-items:center;font-size:13px}.edges[data-v-a97b848e]{display:flex;gap:4px;align-items:center;flex-wrap:wrap}.sect[data-v-a97b848e]{font-size:11px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);margin:14px 0 6px}.strip[data-v-a97b848e]{position:relative;height:22px;border-radius:4px;overflow:hidden;background:var(--panel-2)}.seg[data-v-a97b848e]{position:absolute;top:0;bottom:0}.mark[data-v-a97b848e]{position:absolute;top:-2px;bottom:-2px;width:2px;background:var(--text)}.mark.shock[data-v-a97b848e]{background:#e879f9;width:3px}.legend[data-v-a97b848e]{display:flex;gap:14px;flex-wrap:wrap;font-size:11.5px;margin-top:4px;align-items:center}.sw[data-v-a97b848e]{display:inline-block;width:10px;height:10px;border-radius:2px;margin-right:5px;vertical-align:-1px}.sw.mk[data-v-a97b848e]{background:var(--text);width:3px}.sw.mk.shock[data-v-a97b848e]{background:#e879f9}.g2[data-v-a97b848e]{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:14px}.card-ish[data-v-a97b848e]{border:1px solid var(--line);border-radius:8px;padding:8px}.small[data-v-a97b848e]{font-size:11.5px}.chips[data-v-a97b848e]{display:flex;flex-wrap:wrap;gap:4px}.tb[data-v-a97b848e]{width:100%;border-collapse:collapse;font-size:12px}.tb th[data-v-a97b848e]{text-align:left;color:var(--muted);font-weight:500;padding:4px 6px;border-bottom:1px solid var(--line)}.tb td[data-v-a97b848e]{padding:4px 6px;border-bottom:1px solid var(--line)}.tb .r[data-v-a97b848e]{text-align:right;font-variant-numeric:tabular-nums}@media(max-width:1000px){.g2[data-v-a97b848e]{grid-template-columns:1fr}}.cpage[data-v-45b8fa72]{padding-top:10px}.side-panel[data-v-45b8fa72]{position:fixed;right:14px;top:56px;width:430px;max-height:calc(100vh - 72px);overflow:auto;z-index:30;box-shadow:0 8px 28px #00000059}.clockbar[data-v-45b8fa72]{display:flex;align-items:center;gap:6px;padding:6px 10px;margin-bottom:8px;flex-wrap:wrap}.cb-title[data-v-45b8fa72]{min-width:0}.desk-name[data-v-45b8fa72]{font-size:20px;font-weight:700;line-height:1.25}.desk-sub[data-v-45b8fa72]{font-size:12px;color:var(--muted);margin-top:1px}.min-w-0[data-v-45b8fa72]{min-width:0}.clock[data-v-45b8fa72]{font-size:15px;font-weight:600}.tgrid[data-v-45b8fa72]{display:grid;grid-template-columns:190px minmax(0,1fr) 280px;gap:10px;align-items:start}.center[data-v-45b8fa72],.right[data-v-45b8fa72]{display:flex;flex-direction:column;gap:10px;min-width:0}.sect[data-v-45b8fa72]{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--muted);margin-bottom:6px}.wl[data-v-45b8fa72]{padding:8px}.wl-row[data-v-45b8fa72]{display:grid;grid-template-columns:1fr auto auto 20px;gap:6px;align-items:center;padding:3px 4px;border-radius:5px;cursor:pointer;font-size:12px}.wl-row[data-v-45b8fa72]:hover{background:var(--panel-2)}.wl-row.on[data-v-45b8fa72]{background:#4f8cff26}.wl-x[data-v-45b8fa72]{opacity:0}.wl-row:hover .wl-x[data-v-45b8fa72]{opacity:1}.why[data-v-45b8fa72]{font-family:inherit;white-space:normal}.wl-add[data-v-45b8fa72] .symin-drop{min-width:240px}.nf[data-v-45b8fa72]{width:100%;box-sizing:border-box;background:var(--panel-2);border:1px solid var(--line);border-radius:5px;color:var(--text);padding:4px 6px}.hdr[data-v-45b8fa72]{display:flex;align-items:center;gap:12px;padding:8px 12px;flex-wrap:wrap}.sym[data-v-45b8fa72]{font-size:17px}.hdr-ticket[data-v-45b8fa72]{flex-basis:100%;border-top:1px solid var(--line);padding-top:8px;margin-top:2px}.big[data-v-45b8fa72]{font-size:17px;font-weight:600}.chart[data-v-45b8fa72]{padding:6px}.chart-tools[data-v-45b8fa72]{display:flex;justify-content:flex-end;gap:8px;margin-bottom:2px}.ct-group[data-v-45b8fa72]{height:24px!important}.ct-group[data-v-45b8fa72] .v-btn{min-width:30px;padding:0 6px;font-size:11px;height:24px!important}.chainbox[data-v-45b8fa72]{padding:6px 8px}.chain-tools[data-v-45b8fa72]{display:flex;align-items:center;gap:8px;margin-bottom:4px;flex-wrap:wrap}.w-strat[data-v-45b8fa72]{max-width:150px}.w-width[data-v-45b8fa72]{max-width:110px}.w-strikes[data-v-45b8fa72]{max-width:90px}.pf[data-v-45b8fa72]{display:flex;align-items:center;flex-wrap:wrap;gap:2px;padding:6px 12px;font-size:12.5px}.pf-bar[data-v-45b8fa72]{flex:1 1 160px;max-width:260px;margin:0 10px}.row-sect[data-v-45b8fa72]{display:flex;align-items:center;justify-content:space-between}.kv[data-v-45b8fa72]{display:grid;grid-template-columns:1fr auto;gap:2px 10px;font-size:12px}.kv b[data-v-45b8fa72]{text-align:right;font-weight:500}.act[data-v-45b8fa72]{max-height:420px;overflow:auto}.act-row[data-v-45b8fa72]{display:grid;grid-template-columns:92px 1fr;gap:6px;font-size:12px;padding:3px 0;border-bottom:1px solid var(--line)}.act-row.warning[data-v-45b8fa72]{color:#f59e0b}.when[data-v-45b8fa72]{font-size:11px}.monitor[data-v-45b8fa72]{display:flex;flex-direction:column;gap:10px}.mon-ticket-row>td[data-v-45b8fa72]{padding:4px 0 8px}.mon-ticket[data-v-45b8fa72]{border:1px solid var(--line);border-radius:6px;padding:8px 10px;background:var(--panel-2);text-align:left}.walking[data-v-45b8fa72]{margin-left:8px}.roll-split[data-v-45b8fa72]{height:auto!important;margin-left:3px;vertical-align:middle}.acts .roll-split .v-btn[data-v-45b8fa72]{margin-left:0}.roll-caret[data-v-45b8fa72]{min-width:18px!important;width:18px!important;padding:0!important}.roll-menu[data-v-45b8fa72]{min-width:260px}.roll-f[data-v-45b8fa72]{max-width:100px}.roll-by[data-v-45b8fa72]{height:40px!important;flex:0 0 150px;width:150px}.roll-by .v-btn[data-v-45b8fa72]{flex:1 1 50%;min-width:0}.roll-menu .roll-f[data-v-45b8fa72]{flex:0 0 100px}.ptable[data-v-45b8fa72]{width:100%;border-collapse:collapse;font-size:12px}.ptable th[data-v-45b8fa72]{color:var(--muted);font-weight:500;text-align:right;padding:3px 6px;border-bottom:1px solid var(--line)}.ptable td[data-v-45b8fa72]{text-align:right;padding:3px 6px;border-bottom:1px solid rgba(127,127,127,.07)}.ptable .l[data-v-45b8fa72]{text-align:left}.grp td[data-v-45b8fa72]{background:var(--panel-2)}.acts[data-v-45b8fa72]{white-space:nowrap}.acts .v-btn[data-v-45b8fa72]{margin-left:3px}.ord-row[data-v-45b8fa72]{display:flex;align-items:center;gap:8px;padding:4px 0;border-bottom:1px solid var(--line);font-size:12px}.small[data-v-45b8fa72]{font-size:12px}@media(max-width:1100px){.tgrid[data-v-45b8fa72]{grid-template-columns:1fr}}
|