opencandle 0.4.0 → 0.5.0
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.
- package/LICENSE +1 -1
- package/README.md +106 -14
- package/dist/cli.js +2 -1
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +19 -3
- package/dist/config.js +61 -2
- package/dist/config.js.map +1 -1
- package/dist/infra/browser.d.ts +1 -3
- package/dist/infra/browser.js +1 -1
- package/dist/infra/browser.js.map +1 -1
- package/dist/infra/rate-limiter.d.ts +4 -0
- package/dist/infra/rate-limiter.js +5 -1
- package/dist/infra/rate-limiter.js.map +1 -1
- package/dist/memory/manager.d.ts +9 -0
- package/dist/memory/manager.js +28 -11
- package/dist/memory/manager.js.map +1 -1
- package/dist/memory/storage.d.ts +3 -2
- package/dist/memory/storage.js.map +1 -1
- package/dist/memory/types.js +4 -0
- package/dist/memory/types.js.map +1 -1
- package/dist/pi/opencandle-extension.js +230 -36
- package/dist/pi/opencandle-extension.js.map +1 -1
- package/dist/pi/setup.js +10 -0
- package/dist/pi/setup.js.map +1 -1
- package/dist/prompts/context-builder.d.ts +18 -3
- package/dist/prompts/context-builder.js +102 -16
- package/dist/prompts/context-builder.js.map +1 -1
- package/dist/prompts/disclaimer.js +1 -1
- package/dist/prompts/disclaimer.js.map +1 -1
- package/dist/prompts/policy-cards.d.ts +13 -0
- package/dist/prompts/policy-cards.js +197 -0
- package/dist/prompts/policy-cards.js.map +1 -0
- package/dist/prompts/sections.js +3 -3
- package/dist/prompts/sections.js.map +1 -1
- package/dist/prompts/workflow-prompts.js +170 -18
- package/dist/prompts/workflow-prompts.js.map +1 -1
- package/dist/providers/alpha-vantage.js +23 -1
- package/dist/providers/alpha-vantage.js.map +1 -1
- package/dist/providers/sec-edgar.d.ts +8 -1
- package/dist/providers/sec-edgar.js +172 -5
- package/dist/providers/sec-edgar.js.map +1 -1
- package/dist/providers/yahoo-finance.d.ts +2 -0
- package/dist/providers/yahoo-finance.js +134 -3
- package/dist/providers/yahoo-finance.js.map +1 -1
- package/dist/routing/classify-intent.d.ts +3 -0
- package/dist/routing/classify-intent.js +82 -3
- package/dist/routing/classify-intent.js.map +1 -1
- package/dist/routing/defaults.js +3 -3
- package/dist/routing/defaults.js.map +1 -1
- package/dist/routing/entity-extractor.d.ts +1 -0
- package/dist/routing/entity-extractor.js +158 -12
- package/dist/routing/entity-extractor.js.map +1 -1
- package/dist/routing/index.d.ts +7 -1
- package/dist/routing/index.js +4 -0
- package/dist/routing/index.js.map +1 -1
- package/dist/routing/legacy-rule-router.d.ts +9 -0
- package/dist/routing/legacy-rule-router.js +12 -0
- package/dist/routing/legacy-rule-router.js.map +1 -0
- package/dist/routing/planning.d.ts +54 -0
- package/dist/routing/planning.js +531 -0
- package/dist/routing/planning.js.map +1 -0
- package/dist/routing/route-manifest.d.ts +35 -0
- package/dist/routing/route-manifest.js +221 -0
- package/dist/routing/route-manifest.js.map +1 -0
- package/dist/routing/router-prompt.js +45 -42
- package/dist/routing/router-prompt.js.map +1 -1
- package/dist/routing/router-types.d.ts +9 -0
- package/dist/routing/router.d.ts +1 -0
- package/dist/routing/router.js +456 -12
- package/dist/routing/router.js.map +1 -1
- package/dist/routing/slot-resolver.js +46 -6
- package/dist/routing/slot-resolver.js.map +1 -1
- package/dist/routing/turn-context.d.ts +44 -0
- package/dist/routing/turn-context.js +45 -0
- package/dist/routing/turn-context.js.map +1 -0
- package/dist/routing/types.d.ts +13 -1
- package/dist/runtime/answer-contracts.d.ts +82 -0
- package/dist/runtime/answer-contracts.js +414 -0
- package/dist/runtime/answer-contracts.js.map +1 -0
- package/dist/runtime/artifact-contracts.d.ts +14 -0
- package/dist/runtime/artifact-contracts.js +57 -0
- package/dist/runtime/artifact-contracts.js.map +1 -0
- package/dist/runtime/planning-evidence.d.ts +99 -0
- package/dist/runtime/planning-evidence.js +445 -0
- package/dist/runtime/planning-evidence.js.map +1 -0
- package/dist/runtime/session-coordinator.d.ts +20 -2
- package/dist/runtime/session-coordinator.js +47 -14
- package/dist/runtime/session-coordinator.js.map +1 -1
- package/dist/system-prompt.js +4 -1
- package/dist/system-prompt.js.map +1 -1
- package/dist/tools/fundamentals/company-overview.js +1 -1
- package/dist/tools/fundamentals/company-overview.js.map +1 -1
- package/dist/tools/fundamentals/comps.js +1 -1
- package/dist/tools/fundamentals/comps.js.map +1 -1
- package/dist/tools/fundamentals/dcf.js +1 -1
- package/dist/tools/fundamentals/dcf.js.map +1 -1
- package/dist/tools/fundamentals/earnings.js +1 -1
- package/dist/tools/fundamentals/earnings.js.map +1 -1
- package/dist/tools/fundamentals/financials.js +1 -1
- package/dist/tools/fundamentals/financials.js.map +1 -1
- package/dist/tools/fundamentals/sec-filings.d.ts +1 -0
- package/dist/tools/fundamentals/sec-filings.js +19 -2
- package/dist/tools/fundamentals/sec-filings.js.map +1 -1
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/index.js +3 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/macro/fear-greed.js +1 -1
- package/dist/tools/macro/fear-greed.js.map +1 -1
- package/dist/tools/macro/fred-data.js +29 -5
- package/dist/tools/macro/fred-data.js.map +1 -1
- package/dist/tools/market/crypto-history.js +18 -2
- package/dist/tools/market/crypto-history.js.map +1 -1
- package/dist/tools/market/crypto-price.js +1 -1
- package/dist/tools/market/crypto-price.js.map +1 -1
- package/dist/tools/market/search-ticker.js +1 -1
- package/dist/tools/market/search-ticker.js.map +1 -1
- package/dist/tools/market/stock-history.js +1 -1
- package/dist/tools/market/stock-history.js.map +1 -1
- package/dist/tools/market/stock-quote.js +1 -1
- package/dist/tools/market/stock-quote.js.map +1 -1
- package/dist/tools/options/greeks.js +0 -1
- package/dist/tools/options/greeks.js.map +1 -1
- package/dist/tools/options/option-chain.js +9 -4
- package/dist/tools/options/option-chain.js.map +1 -1
- package/dist/tools/portfolio/correlation.js +1 -1
- package/dist/tools/portfolio/correlation.js.map +1 -1
- package/dist/tools/portfolio/holdings-overlap.d.ts +8 -0
- package/dist/tools/portfolio/holdings-overlap.js +105 -0
- package/dist/tools/portfolio/holdings-overlap.js.map +1 -0
- package/dist/tools/portfolio/predictions.js +1 -1
- package/dist/tools/portfolio/predictions.js.map +1 -1
- package/dist/tools/portfolio/risk-analysis.js +1 -1
- package/dist/tools/portfolio/risk-analysis.js.map +1 -1
- package/dist/tools/portfolio/tracker.js +1 -1
- package/dist/tools/portfolio/tracker.js.map +1 -1
- package/dist/tools/portfolio/watchlist.js +12 -4
- package/dist/tools/portfolio/watchlist.js.map +1 -1
- package/dist/tools/sentiment/reddit-sentiment.js +1 -1
- package/dist/tools/sentiment/reddit-sentiment.js.map +1 -1
- package/dist/tools/sentiment/sentiment-summary.js +57 -2
- package/dist/tools/sentiment/sentiment-summary.js.map +1 -1
- package/dist/tools/sentiment/twitter-sentiment.js +1 -1
- package/dist/tools/sentiment/twitter-sentiment.js.map +1 -1
- package/dist/tools/sentiment/web-search.js +32 -3
- package/dist/tools/sentiment/web-search.js.map +1 -1
- package/dist/tools/sentiment/web-sentiment.js +1 -1
- package/dist/tools/sentiment/web-sentiment.js.map +1 -1
- package/dist/tools/technical/backtest.d.ts +2 -2
- package/dist/tools/technical/backtest.js +41 -27
- package/dist/tools/technical/backtest.js.map +1 -1
- package/dist/tools/technical/indicators.js +1 -3
- package/dist/tools/technical/indicators.js.map +1 -1
- package/dist/types/options.d.ts +10 -0
- package/dist/types/portfolio.d.ts +27 -0
- package/dist/workflows/compare-assets.js +38 -2
- package/dist/workflows/compare-assets.js.map +1 -1
- package/dist/workflows/options-screener.js +88 -7
- package/dist/workflows/options-screener.js.map +1 -1
- package/dist/workflows/portfolio-builder.js +7 -3
- package/dist/workflows/portfolio-builder.js.map +1 -1
- package/gui/server/ask-user-bridge.ts +82 -0
- package/gui/server/gui-session-manager.ts +5 -0
- package/gui/server/projector.ts +47 -5
- package/gui/server/prompt-observation.ts +61 -0
- package/gui/server/server.ts +119 -8
- package/gui/server/session-entry-wait.ts +81 -0
- package/gui/web/dist/assets/{CatalogOverlay-D1ImSJTe.js → CatalogOverlay-Bmp6Knu7.js} +1 -1
- package/gui/web/dist/assets/index-Bxt9QpLX.css +1 -0
- package/gui/web/dist/assets/index-CZ9DHZYy.js +67 -0
- package/gui/web/dist/index.html +2 -2
- package/package.json +18 -12
- package/src/cli.ts +2 -1
- package/src/config.ts +89 -5
- package/src/infra/browser.ts +1 -1
- package/src/infra/rate-limiter.ts +10 -1
- package/src/memory/manager.ts +43 -10
- package/src/memory/storage.ts +3 -2
- package/src/memory/types.ts +4 -0
- package/src/pi/opencandle-extension.ts +273 -42
- package/src/pi/setup.ts +10 -0
- package/src/prompts/context-builder.ts +128 -17
- package/src/prompts/disclaimer.ts +1 -1
- package/src/prompts/policy-cards.ts +220 -0
- package/src/prompts/sections.ts +3 -3
- package/src/prompts/workflow-prompts.ts +172 -18
- package/src/providers/alpha-vantage.ts +24 -1
- package/src/providers/sec-edgar.ts +220 -4
- package/src/providers/web-search.ts +1 -1
- package/src/providers/yahoo-finance.ts +171 -4
- package/src/routing/classify-intent.ts +94 -3
- package/src/routing/defaults.ts +3 -3
- package/src/routing/entity-extractor.ts +164 -13
- package/src/routing/index.ts +44 -0
- package/src/routing/legacy-rule-router.ts +13 -0
- package/src/routing/planning.ts +732 -0
- package/src/routing/route-manifest.ts +287 -0
- package/src/routing/router-prompt.ts +50 -46
- package/src/routing/router-types.ts +21 -0
- package/src/routing/router.ts +511 -12
- package/src/routing/slot-resolver.ts +44 -6
- package/src/routing/turn-context.ts +111 -0
- package/src/routing/types.ts +13 -1
- package/src/runtime/answer-contracts.ts +633 -0
- package/src/runtime/artifact-contracts.ts +76 -0
- package/src/runtime/planning-evidence.ts +591 -0
- package/src/runtime/session-coordinator.ts +78 -12
- package/src/system-prompt.ts +4 -1
- package/src/tools/fundamentals/company-overview.ts +1 -1
- package/src/tools/fundamentals/comps.ts +1 -1
- package/src/tools/fundamentals/dcf.ts +1 -1
- package/src/tools/fundamentals/earnings.ts +1 -1
- package/src/tools/fundamentals/financials.ts +1 -1
- package/src/tools/fundamentals/sec-filings.ts +25 -2
- package/src/tools/index.ts +3 -0
- package/src/tools/macro/fear-greed.ts +1 -1
- package/src/tools/macro/fred-data.ts +31 -5
- package/src/tools/market/crypto-history.ts +18 -2
- package/src/tools/market/crypto-price.ts +1 -1
- package/src/tools/market/search-ticker.ts +1 -1
- package/src/tools/market/stock-history.ts +1 -1
- package/src/tools/market/stock-quote.ts +1 -1
- package/src/tools/options/greeks.ts +0 -1
- package/src/tools/options/option-chain.ts +9 -4
- package/src/tools/portfolio/correlation.ts +1 -1
- package/src/tools/portfolio/holdings-overlap.ts +123 -0
- package/src/tools/portfolio/predictions.ts +1 -1
- package/src/tools/portfolio/risk-analysis.ts +1 -1
- package/src/tools/portfolio/tracker.ts +1 -1
- package/src/tools/portfolio/watchlist.ts +10 -4
- package/src/tools/sentiment/reddit-sentiment.ts +1 -1
- package/src/tools/sentiment/sentiment-summary.ts +62 -2
- package/src/tools/sentiment/twitter-sentiment.ts +1 -1
- package/src/tools/sentiment/web-search.ts +36 -3
- package/src/tools/sentiment/web-sentiment.ts +1 -1
- package/src/tools/technical/backtest.ts +50 -29
- package/src/tools/technical/indicators.ts +1 -3
- package/src/types/options.ts +17 -0
- package/src/types/portfolio.ts +32 -0
- package/src/workflows/compare-assets.ts +38 -2
- package/src/workflows/options-screener.ts +85 -7
- package/src/workflows/portfolio-builder.ts +7 -3
- package/dist/runtime/index.d.ts +0 -16
- package/dist/runtime/index.js +0 -10
- package/dist/runtime/index.js.map +0 -1
- package/dist/runtime/provider-ids.d.ts +0 -14
- package/dist/runtime/provider-ids.js +0 -14
- package/dist/runtime/provider-ids.js.map +0 -1
- package/gui/web/dist/assets/index-DBrWq43L.css +0 -1
- package/gui/web/dist/assets/index-RflHaj0y.js +0 -67
- package/src/runtime/index.ts +0 -55
- package/src/runtime/provider-ids.ts +0 -15
|
@@ -8,6 +8,42 @@ export function buildCompareAssetsWorkflowDefinition(
|
|
|
8
8
|
resolution: SlotResolution<CompareAssetsSlots>,
|
|
9
9
|
): WorkflowDefinition {
|
|
10
10
|
const symbols = resolution.resolved.symbols.join(", ");
|
|
11
|
+
const timeHorizon = resolution.resolved.timeHorizon;
|
|
12
|
+
const isMacroHedge = resolution.resolved.metrics?.includes("macro_hedge") ?? false;
|
|
13
|
+
const isInterestRateSensitive = resolution.resolved.metrics?.includes("interest_rates") ?? false;
|
|
14
|
+
const isOverlapComparison = resolution.resolved.metrics?.includes("overlap") ?? false;
|
|
15
|
+
const evidenceList = resolution.resolved.metrics?.includes("sentiment")
|
|
16
|
+
? "price, technical, risk, and sentiment data"
|
|
17
|
+
: isOverlapComparison
|
|
18
|
+
? "quote, holdings-overlap, and correlation data"
|
|
19
|
+
: "price, technical, and risk data";
|
|
20
|
+
const horizonGuidance = timeHorizon
|
|
21
|
+
? `
|
|
22
|
+
- Start by directly answering whether these assets are reasonable to compare for a ${timeHorizon} horizon.
|
|
23
|
+
- Rank the evidence for that horizon: near-term catalysts, earnings/guidance, estimate revisions, forward-looking valuation evidence, sentiment, macro sensitivity, and company-specific risks before long-term historical metrics.
|
|
24
|
+
- Treat unavailable forward-looking evidence as a caveat instead of replacing it with unrelated historical certainty.`
|
|
25
|
+
: "";
|
|
26
|
+
const macroHedgeGuidance = isMacroHedge
|
|
27
|
+
? `
|
|
28
|
+
- Treat this as a macro hedge decision: explain each asset's hedge role, correlation regime, volatility/drawdown profile, and sensitivity to real yields, USD/liquidity, geopolitical shocks, and risk-off drawdowns.
|
|
29
|
+
- Do not let missing asset-specific metrics turn into a shallow default winner. Explain what each missing metric would have shown and how that lowers confidence.
|
|
30
|
+
- Give actionable conditional guidance: conditions under which each asset is the better capital-preservation hedge, diversifier, inflation hedge, duration hedge, liquidity sleeve, or higher-volatility asymmetric-upside sleeve.`
|
|
31
|
+
: "";
|
|
32
|
+
const interestRateGuidance = isInterestRateSensitive
|
|
33
|
+
? `
|
|
34
|
+
- For the rate-sensitive premise, separate benign falling rates from recessionary cuts and sticky-inflation/rate-reversal scenarios before giving the final tilt.
|
|
35
|
+
- Discuss concentration or sector-exposure risk when one asset is narrower or more growth-heavy than the other.
|
|
36
|
+
- Say whether the rate evidence you used is historical/current data or forward-looking market-pricing evidence; do not treat historical Fed funds data as a forecast.`
|
|
37
|
+
: "";
|
|
38
|
+
const overlapGuidance = isOverlapComparison
|
|
39
|
+
? `
|
|
40
|
+
- For ETF overlap prompts, synthesize the holdings-overlap and shared-exposure evidence first, with correlation only as supporting diversification context.
|
|
41
|
+
- State the diversification implication directly: deliberate factor tilt, accidental duplication, or genuinely differentiated exposure.
|
|
42
|
+
- If provider holdings coverage was partial or unavailable, say that before giving the practical next step.`
|
|
43
|
+
: "";
|
|
44
|
+
const verdictInstruction = isOverlapComparison
|
|
45
|
+
? "End with a concise verdict on whether the added fund improves diversification or mostly duplicates existing exposure."
|
|
46
|
+
: "End with a concise verdict on which asset looks strongest right now and why.";
|
|
11
47
|
|
|
12
48
|
return {
|
|
13
49
|
workflowType: "compare_assets",
|
|
@@ -18,8 +54,8 @@ export function buildCompareAssetsWorkflowDefinition(
|
|
|
18
54
|
}),
|
|
19
55
|
promptStep("compare_and_present", "Present side-by-side comparison", `Now present the side-by-side comparison for ${symbols}:
|
|
20
56
|
- Keep any unavailable fundamentals marked as unavailable instead of retrying the same failed provider calls.
|
|
21
|
-
- Use the
|
|
22
|
-
-
|
|
57
|
+
- Use the ${evidenceList} you already fetched to finish the comparison even if some fundamentals are missing.
|
|
58
|
+
- ${verdictInstruction}${horizonGuidance}${macroHedgeGuidance}${interestRateGuidance}${overlapGuidance}`, {
|
|
23
59
|
requiredInputs: ["asset_data"],
|
|
24
60
|
expectedOutputs: ["comparison_summary"],
|
|
25
61
|
}),
|
|
@@ -6,7 +6,69 @@ import { promptStep } from "../runtime/prompt-step.js";
|
|
|
6
6
|
|
|
7
7
|
export function buildOptionsScreenerWorkflowDefinition(resolution: SlotResolution<OptionsScreenerSlots>): WorkflowDefinition {
|
|
8
8
|
const s = resolution.resolved;
|
|
9
|
-
const
|
|
9
|
+
const isProtectivePutContext = s.optionStrategy === "protective_put";
|
|
10
|
+
const contractType = s.direction === "bullish" && !isProtectivePutContext ? "calls" : "puts";
|
|
11
|
+
const horizonPhrase = describeDteTarget(s.dteTarget);
|
|
12
|
+
const isCoveredCallContext = !isProtectivePutContext && (
|
|
13
|
+
s.optionStrategy === "covered_call" ||
|
|
14
|
+
s.costBasis !== undefined ||
|
|
15
|
+
(s.catalystSymbols?.length ?? 0) > 0
|
|
16
|
+
);
|
|
17
|
+
const rankingInstruction = isProtectivePutContext
|
|
18
|
+
? "Rank by protection per dollar of premium, expiration fit, moneyness, hedge floor, live liquidity, and premium as a percent of the stock position."
|
|
19
|
+
: isCoveredCallContext
|
|
20
|
+
? "Rank by premium collected, strike above cost basis, assignment risk, event risk, live liquidity, and probability of expiring out of the money."
|
|
21
|
+
: `Rank by ${s.objective}: balance premium cost, delta exposure, and probability of profit. Only include contracts with |delta| >= 0.20.`;
|
|
22
|
+
const maxPremiumInstruction = s.maxPremium !== undefined
|
|
23
|
+
? ` Do not rank contracts above the user's max premium of $${s.maxPremium.toLocaleString("en-US")} unless no contracts under that cap are liquid; if so, say the cap could not be met.`
|
|
24
|
+
: "";
|
|
25
|
+
const riskInstruction = isProtectivePutContext
|
|
26
|
+
? "Include protective-put hedge risks: premium decay/cost, imperfect hedge before the strike, liquidity, and opportunity cost. Long protective puts do not have short-option assignment risk."
|
|
27
|
+
: isCoveredCallContext
|
|
28
|
+
? "Include covered-call sale risks: assignment risk, upside is capped at the strike plus premium, share-price downside in the owned stock less premium received, IV/event risk, and exit liquidity. Do not say max loss = premium or describe max loss as the option premium paid."
|
|
29
|
+
: "Include risk caveats: max loss = premium, IV crush risk, time decay (theta).";
|
|
30
|
+
const coveredCallFallback = isCoveredCallContext
|
|
31
|
+
? `
|
|
32
|
+
Covered-call fallback:
|
|
33
|
+
- Treat this as selling covered calls against an existing ${s.symbol} share position, not buying calls.
|
|
34
|
+
- Briefly state that you are treating ${s.symbol} as the held ticker because the user phrased it as an existing holding. If they meant memory exposure or a different ticker, tell them to clarify and do not silently switch to another underlying.
|
|
35
|
+
- If retrieved contracts have zero bid/ask, zero open interest, or otherwise unusable live quotes, do not stop at "cannot rank."
|
|
36
|
+
- This fallback overrides the normal ranking/table requirements and the delta >= 0.20 filter.
|
|
37
|
+
- Do NOT conclude with "I cannot provide a recommendation" in this fallback case.
|
|
38
|
+
- The final answer MUST include:
|
|
39
|
+
- "Best action:" no trade unless the user's broker shows a real bid.
|
|
40
|
+
- "Conditional candidate:" a conditional limit-order candidate using the user's cost basis and catalyst context.
|
|
41
|
+
- If you cannot compute an exact premium, say "premium: use live broker bid/ask" rather than omitting the candidate.
|
|
42
|
+
- Choose a conditional candidate strike above cost basis that the user would accept for assignment, prefer near-term expirations around the catalyst, and label it as conditional on live bid/ask and premium collected.
|
|
43
|
+
- For the top pick, include the effective assignment sale price (strike + premium collected) and compare it with the ${s.costBasis !== undefined ? `$${s.costBasis}` : "user's"} cost basis.
|
|
44
|
+
- Include return-if-assigned when cost basis is available: (strike - cost basis + premium received) / cost basis.
|
|
45
|
+
- Verify bid/ask and open interest in the user's broker before trading, even when OC shows live values.
|
|
46
|
+
- Mention the catalyst only as event/sympathy risk; do not switch the underlying away from ${s.symbol}.
|
|
47
|
+
- Do not describe max loss as the option premium paid; covered-call sale risk is assignment risk, upside is capped at strike plus premium, share-price downside in the owned stock less premium received, IV/event risk, and poor exit liquidity.
|
|
48
|
+
- If the tool reports closed_market_or_stale_quotes, do not treat zero bid/ask as confirmed live illiquidity; say the chain was checked outside regular options trading and recheck after regular options trading opens.
|
|
49
|
+
- Required fallback format:
|
|
50
|
+
Interpretation: Treating ${s.symbol} as the held ticker because you phrased it as an existing position. If you meant ${s.symbol} as memory exposure or another ticker, clarify before trading.
|
|
51
|
+
Best action: ...
|
|
52
|
+
Conditional candidate: ...
|
|
53
|
+
Why: ...
|
|
54
|
+
Risk: ...
|
|
55
|
+
`
|
|
56
|
+
: "";
|
|
57
|
+
const coveredCallNoDataGuidance = isCoveredCallContext
|
|
58
|
+
? "- For covered-call requests in that no-data fallback, explain how to evaluate covered calls: compare 1-week vs 2-week theta/gamma tradeoffs, use delta as an assignment-risk proxy, avoid strikes where assignment would violate the user's cost basis unless premium offsets it, calculate static premium yield and return-if-assigned, and flag catalyst/IV-crush risk."
|
|
59
|
+
: "";
|
|
60
|
+
const protectivePutFallback = isProtectivePutContext
|
|
61
|
+
? `
|
|
62
|
+
Protective-put requirements:
|
|
63
|
+
- Treat this as buying puts to hedge an existing long ${s.symbol} share position, not buying calls.
|
|
64
|
+
- The final answer MUST discuss hedge floor, premium as a percent of position value, expiration fit, moneyness, and liquidity.
|
|
65
|
+
- If share quantity is available, translate shares into approximate contract count using 1 put contract per 100 shares.
|
|
66
|
+
- If share quantity is available, state total premium for the required number of contracts.
|
|
67
|
+
- For cost-sensitive requests, explain the tradeoff between cheaper lower-strike puts and weaker protection.
|
|
68
|
+
- Mention lower-cost alternatives such as collars or put spreads when outright put premium is high.
|
|
69
|
+
- Do not frame assignment risk like a short option sale.
|
|
70
|
+
`
|
|
71
|
+
: "";
|
|
10
72
|
|
|
11
73
|
return {
|
|
12
74
|
workflowType: "options_screener",
|
|
@@ -18,19 +80,23 @@ export function buildOptionsScreenerWorkflowDefinition(resolution: SlotResolutio
|
|
|
18
80
|
promptStep("rank_and_present", "Rank and present top contracts", `Now rank and present the top ${contractType} for ${s.symbol}. You MUST produce a final text response — never end this turn with only tool calls.
|
|
19
81
|
|
|
20
82
|
1. From the option chain data already fetched, select the top 3-5 contracts matching: ${s.moneynessPreference} strikes, DTE near ${s.dteTarget}, with ${s.liquidityMinimum}.
|
|
21
|
-
2.
|
|
22
|
-
3. Present a table: strike, expiry, premium, delta, IV, open interest, bid-ask spread.
|
|
83
|
+
2. ${rankingInstruction}${maxPremiumInstruction}
|
|
84
|
+
3. Present a table: strike, expiry, premium, delta, gamma, theta, vega, rho, IV, open interest, bid-ask spread.
|
|
23
85
|
4. Explain why the #1 pick is ranked highest.
|
|
24
|
-
5.
|
|
25
|
-
6.
|
|
86
|
+
5. Reproduce the exact Assumptions block from the initial prompt; keep the provenance label text intact and do not shorten it to "Assumptions:".
|
|
87
|
+
6. State the requested option horizon in plain language (${horizonPhrase}) in the bottom line or table intro; use the user's horizon wording or approximate DTE window without forcing a fixed sentence.
|
|
88
|
+
7. ${riskInstruction}
|
|
26
89
|
|
|
27
90
|
If some or all of the option chain fetches returned "⚠ Options chain unavailable" or similar gaps, do NOT abort. Instead:
|
|
28
91
|
- Rank and present whatever contracts you did retrieve from the successful fetches, even if fewer than 3.
|
|
29
|
-
- If no chain data is usable at all, still produce a text response: reproduce the Assumptions block, state which expirations failed, and
|
|
92
|
+
- If no chain data is usable at all, still produce a text response: reproduce the Assumptions block, state which expirations failed, and give actionable fallback guidance for the requested DTE instead of ranking nonexistent contracts. Do not promise to retry later. Never end the turn with only tool calls.
|
|
93
|
+
${coveredCallNoDataGuidance}
|
|
94
|
+
${coveredCallFallback}
|
|
95
|
+
${protectivePutFallback}
|
|
30
96
|
|
|
31
97
|
Length constraints:
|
|
32
98
|
- Max 1 sentence explaining the #1 pick.
|
|
33
|
-
- Risk
|
|
99
|
+
- Risk section: max 3 bullets.
|
|
34
100
|
- Keep total response under 30 lines.`, {
|
|
35
101
|
requiredInputs: ["option_chain"],
|
|
36
102
|
expectedOutputs: ["ranked_contracts"],
|
|
@@ -39,6 +105,18 @@ Length constraints:
|
|
|
39
105
|
};
|
|
40
106
|
}
|
|
41
107
|
|
|
108
|
+
function describeDteTarget(dteTarget: string): string {
|
|
109
|
+
if (dteTarget === "25_to_45_days") return "25-45 day target, roughly one month";
|
|
110
|
+
if (dteTarget === "7_to_14_days") return "1-2 week horizon";
|
|
111
|
+
if (dteTarget === "0_to_7_days") return "event-week or 0-7 day horizon";
|
|
112
|
+
if (dteTarget === "180_plus_days") return "LEAPS or long-dated horizon";
|
|
113
|
+
const range = dteTarget.match(/^(\d+)_to_(\d+)_days$/);
|
|
114
|
+
if (range) return `${range[1]}-${range[2]} day horizon`;
|
|
115
|
+
const plus = dteTarget.match(/^(\d+)_plus_days$/);
|
|
116
|
+
if (plus) return `${plus[1]}+ day horizon`;
|
|
117
|
+
return `${dteTarget} horizon`;
|
|
118
|
+
}
|
|
119
|
+
|
|
42
120
|
/** @deprecated Use buildOptionsScreenerWorkflowDefinition instead */
|
|
43
121
|
export function buildOptionsScreenerWorkflow(resolution: SlotResolution<OptionsScreenerSlots>): WorkflowPlan {
|
|
44
122
|
const def = buildOptionsScreenerWorkflowDefinition(resolution);
|
|
@@ -18,7 +18,8 @@ export function buildPortfolioWorkflowDefinition(resolution: SlotResolution<Port
|
|
|
18
18
|
1. Use analyze_correlation across all ${s.positionCount} candidates to check for concentration risk.
|
|
19
19
|
2. Use analyze_risk on each position for volatility and max drawdown.
|
|
20
20
|
3. If correlation is too high (>0.7 between any pair), suggest a replacement to improve diversification.
|
|
21
|
-
4.
|
|
21
|
+
4. If any position's risk metrics undermine its intended role, lower its allocation, replace it with a role-equivalent candidate, or explicitly justify why it remains.
|
|
22
|
+
5. Confirm the portfolio fits a ${s.riskProfile} risk profile with ${s.timeHorizon} horizon.`, {
|
|
22
23
|
skippable: true,
|
|
23
24
|
requiredInputs: ["candidate_positions"],
|
|
24
25
|
expectedOutputs: ["risk_assessment"],
|
|
@@ -26,13 +27,16 @@ export function buildPortfolioWorkflowDefinition(resolution: SlotResolution<Port
|
|
|
26
27
|
promptStep("synthesize", "Present final portfolio draft", `Present the final portfolio draft as a structured summary:
|
|
27
28
|
- State all assumptions at the top (which parameters were defaults vs user-specified vs saved preferences).
|
|
28
29
|
- Commit to the allocation: concrete percentages per position, not ranges.
|
|
29
|
-
- Present an allocation table: symbol, allocation %, dollar amount ($${s.budget.toLocaleString("en-US")} total), and one-line analyst rationale per position.
|
|
30
|
+
- Present an allocation table: symbol, allocation %, dollar amount ($${s.budget.toLocaleString("en-US")} total), current price used, estimated shares, role, and one-line analyst rationale per position.
|
|
31
|
+
- Add a brief "Why this fits the horizon" summary explaining the growth/stability tradeoff for the ${s.timeHorizon} horizon.
|
|
30
32
|
- Include overall portfolio risk summary: estimated volatility, diversification quality, largest single risk. State an invalidation condition for the draft.
|
|
33
|
+
- Include implementation notes: rebalance cadence, low-cost/liquid implementation, and tax/account caveats where relevant.
|
|
31
34
|
- Suggest what to change for more growth or more safety.
|
|
32
35
|
|
|
33
36
|
Length constraints:
|
|
34
|
-
- Max 1 sentence of rationale per position in the allocation table.
|
|
37
|
+
- Max 1 sentence of rationale per position in the allocation table; do not paste company descriptions or issuer background.
|
|
35
38
|
- Risk summary: max 3 bullet points.
|
|
39
|
+
- Implementation notes: max 3 bullets.
|
|
36
40
|
- Growth/safety suggestions: max 2 bullet points each.
|
|
37
41
|
- Keep total response under 40 lines.`, {
|
|
38
42
|
requiredInputs: ["risk_assessment"],
|
package/dist/runtime/index.d.ts
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
export type { Provenance, ProvenanceSource, EvidenceRecord, ProviderResult, ProviderResultOk, ProviderResultUnavailable, } from "./evidence.js";
|
|
2
|
-
export { isProviderOk, toEvidenceRecord } from "./evidence.js";
|
|
3
|
-
export type { StepStatus, RunStatus, WorkflowStep, StepOutput, AnalystSignal, AnalystOutput, WorkflowRun, } from "./workflow-types.js";
|
|
4
|
-
export { isValidStepTransition, transitionStepStatus, createWorkflowRun, } from "./workflow-types.js";
|
|
5
|
-
export type { ValidationEntry, ValidationResult, ValidatorConfig, } from "./validation.js";
|
|
6
|
-
export { emptyValidationResult, checkTimestamps, checkOptionsExpiries, checkRequiredFields, checkNumberMatch, RuntimeValidator, DEFAULT_MARKET_SENSITIVE_LABELS, } from "./validation.js";
|
|
7
|
-
export type { WorkflowEventType, WorkflowEvent } from "./workflow-events.js";
|
|
8
|
-
export { WorkflowEventLogger } from "./workflow-events.js";
|
|
9
|
-
export { ProviderTracker } from "./provider-tracker.js";
|
|
10
|
-
export type { ProviderId } from "./provider-ids.js";
|
|
11
|
-
export { PROVIDER_ID } from "./provider-ids.js";
|
|
12
|
-
export { setRunContext, clearRunContext, getProviderTracker } from "./run-context.js";
|
|
13
|
-
export type { StepExecutor, StepExecutionContext, WorkflowRunnerOptions } from "./workflow-runner.js";
|
|
14
|
-
export { WorkflowRunner } from "./workflow-runner.js";
|
|
15
|
-
export type { PromptStep, WorkflowDefinition } from "./prompt-step.js";
|
|
16
|
-
export { promptStep, promptStepOutput, toStepDefinitions, toWorkflowPlan } from "./prompt-step.js";
|
package/dist/runtime/index.js
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export { isProviderOk, toEvidenceRecord } from "./evidence.js";
|
|
2
|
-
export { isValidStepTransition, transitionStepStatus, createWorkflowRun, } from "./workflow-types.js";
|
|
3
|
-
export { emptyValidationResult, checkTimestamps, checkOptionsExpiries, checkRequiredFields, checkNumberMatch, RuntimeValidator, DEFAULT_MARKET_SENSITIVE_LABELS, } from "./validation.js";
|
|
4
|
-
export { WorkflowEventLogger } from "./workflow-events.js";
|
|
5
|
-
export { ProviderTracker } from "./provider-tracker.js";
|
|
6
|
-
export { PROVIDER_ID } from "./provider-ids.js";
|
|
7
|
-
export { setRunContext, clearRunContext, getProviderTracker } from "./run-context.js";
|
|
8
|
-
export { WorkflowRunner } from "./workflow-runner.js";
|
|
9
|
-
export { promptStep, promptStepOutput, toStepDefinitions, toWorkflowPlan } from "./prompt-step.js";
|
|
10
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAW/D,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAO7B,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,oBAAoB,EACpB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,+BAA+B,GAChC,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGxD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAGtF,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Canonical provider IDs. These match the keys used in
|
|
3
|
-
* src/infra/rate-limiter.ts for providers that have rate limits.
|
|
4
|
-
*/
|
|
5
|
-
export declare const PROVIDER_ID: {
|
|
6
|
-
readonly YAHOO: "yahoo";
|
|
7
|
-
readonly ALPHA_VANTAGE: "alphavantage";
|
|
8
|
-
readonly COINGECKO: "coingecko";
|
|
9
|
-
readonly FRED: "fred";
|
|
10
|
-
readonly SEC_EDGAR: "sec-edgar";
|
|
11
|
-
readonly REDDIT: "reddit";
|
|
12
|
-
readonly FEAR_GREED: "feargreed";
|
|
13
|
-
};
|
|
14
|
-
export type ProviderId = (typeof PROVIDER_ID)[keyof typeof PROVIDER_ID];
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Canonical provider IDs. These match the keys used in
|
|
3
|
-
* src/infra/rate-limiter.ts for providers that have rate limits.
|
|
4
|
-
*/
|
|
5
|
-
export const PROVIDER_ID = {
|
|
6
|
-
YAHOO: "yahoo",
|
|
7
|
-
ALPHA_VANTAGE: "alphavantage",
|
|
8
|
-
COINGECKO: "coingecko",
|
|
9
|
-
FRED: "fred",
|
|
10
|
-
SEC_EDGAR: "sec-edgar",
|
|
11
|
-
REDDIT: "reddit",
|
|
12
|
-
FEAR_GREED: "feargreed",
|
|
13
|
-
};
|
|
14
|
-
//# sourceMappingURL=provider-ids.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"provider-ids.js","sourceRoot":"","sources":["../../src/runtime/provider-ids.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,KAAK,EAAE,OAAO;IACd,aAAa,EAAE,cAAc;IAC7B,SAAS,EAAE,WAAW;IACtB,IAAI,EAAE,MAAM;IACZ,SAAS,EAAE,WAAW;IACtB,MAAM,EAAE,QAAQ;IAChB,UAAU,EAAE,WAAW;CACf,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
*,:before,:after,::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border:0 solid #e5e7eb}:before,:after{--tw-content:""}html,:host{-webkit-text-size-adjust:100%;tab-size:4;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent;font-family:Inter,system-ui,-apple-system,ui-sans-serif,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}body{line-height:inherit;margin:0}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-feature-settings:normal;font-variation-settings:normal;font-family:JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-feature-settings:inherit;font-variation-settings:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:#0000;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{margin:0;padding:0;list-style:none}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder{opacity:1;color:#9ca3af}textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}*{box-sizing:border-box}html,body{height:100dvh;overflow:hidden}body{background:hsl(var(--tw-background));min-width:320px;color:hsl(var(--tw-foreground));-webkit-tap-highlight-color:hsl(var(--tw-foreground) / .08);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin:0}#root{height:100dvh}button,input,select,textarea{font:inherit}button{cursor:pointer;touch-action:manipulation}button:disabled{cursor:not-allowed}:focus-visible{outline:2px solid hsl(var(--tw-foreground));outline-offset:2px}code{border:1px solid hsl(var(--tw-border));background:hsl(var(--tw-secondary));color:hsl(var(--tw-foreground));border-radius:4px;padding:1px 5px;font-family:JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:12px}.sr-only{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.container{width:100%;margin-left:auto;margin-right:auto;padding-left:2rem;padding-right:2rem}@media (width>=1400px){.container{max-width:1400px}}.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);margin-top:1.2em;margin-bottom:1.2em;font-size:1.25em;line-height:1.6}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);font-weight:500;text-decoration:underline}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em;list-style-type:decimal}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em;list-style-type:disc}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-counters);font-weight:400}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.25em;font-weight:600}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-quotes);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:"“""”""‘""’";margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1em;font-style:italic;font-weight:500}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:0;margin-bottom:.888889em;font-size:2.25em;font-weight:800;line-height:1.11111}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:900}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:2em;margin-bottom:1em;font-size:1.5em;font-weight:700;line-height:1.33333}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:800}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.6em;margin-bottom:.6em;font-size:1.25em;font-weight:600;line-height:1.6}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.5em;margin-bottom:.5em;font-weight:600;line-height:1.5}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em;display:block}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-kbd);box-shadow:0 0 0 1px var(--tw-prose-kbd-shadows), 0 3px 0 var(--tw-prose-kbd-shadows);padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;border-radius:.3125rem;padding-inline-start:.375em;font-family:inherit;font-size:.875em;font-weight:500}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-size:.875em;font-weight:600}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before,.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);padding-top:.857143em;padding-inline-end:1.14286em;padding-bottom:.857143em;border-radius:.375rem;margin-top:1.71429em;margin-bottom:1.71429em;padding-inline-start:1.14286em;font-size:.875em;font-weight:400;line-height:1.71429;overflow-x:auto}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit;background-color:#0000;border-width:0;border-radius:0;padding:0}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before,.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){table-layout:auto;width:100%;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.71429}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);vertical-align:bottom;padding-inline-end:.571429em;padding-bottom:.571429em;padding-inline-start:.571429em;font-weight:600}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);margin-top:.857143em;font-size:.875em;line-height:1.42857}.prose{--tw-prose-body:#374151;--tw-prose-headings:#111827;--tw-prose-lead:#4b5563;--tw-prose-links:#111827;--tw-prose-bold:#111827;--tw-prose-counters:#6b7280;--tw-prose-bullets:#d1d5db;--tw-prose-hr:#e5e7eb;--tw-prose-quotes:#111827;--tw-prose-quote-borders:#e5e7eb;--tw-prose-captions:#6b7280;--tw-prose-kbd:#111827;--tw-prose-kbd-shadows:#1118271a;--tw-prose-code:#111827;--tw-prose-pre-code:#e5e7eb;--tw-prose-pre-bg:#1f2937;--tw-prose-th-borders:#d1d5db;--tw-prose-td-borders:#e5e7eb;--tw-prose-invert-body:#d1d5db;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#9ca3af;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#9ca3af;--tw-prose-invert-bullets:#4b5563;--tw-prose-invert-hr:#374151;--tw-prose-invert-quotes:#f3f4f6;--tw-prose-invert-quote-borders:#374151;--tw-prose-invert-captions:#9ca3af;--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:#ffffff1a;--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d1d5db;--tw-prose-invert-pre-bg:#00000080;--tw-prose-invert-th-borders:#4b5563;--tw-prose-invert-td-borders:#374151;font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.571429em;padding-inline-end:.571429em;padding-bottom:.571429em;padding-inline-start:.571429em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.rich-text>*+*{margin-top:.5rem}.rich-text p,.rich-text ul{margin:0}.rich-text ul{padding-left:1.125rem}.rich-text li+li{margin-top:.25rem}.rich-text h3,.rich-text h4,.rich-text h5{color:hsl(var(--tw-foreground));margin:.25rem 0 0;font-size:.95rem;font-weight:600}.rich-text .rich-table{width:100%;max-width:100%;display:block;overflow-x:auto}.rich-text table{border-collapse:collapse;font-variant-numeric:tabular-nums;width:100%;font-size:13px}.rich-text th,.rich-text td{border:1px solid hsl(var(--tw-border));text-align:left;vertical-align:top;padding:6px 8px}.rich-text th{background:hsl(var(--tw-secondary));color:hsl(var(--tw-foreground));font-weight:600}.chat-markdown{color:hsl(var(--tw-foreground) / .86);font-size:.8125rem;line-height:1.375rem}.chat-markdown>*+*{margin-top:1.25rem}.chat-markdown p,.chat-markdown ul{margin:0}.chat-markdown ul{color:hsl(var(--tw-foreground) / .82);padding-left:1.75rem;list-style:outside}.chat-markdown p+ul{margin-top:1.5rem}.chat-markdown ul+p{margin-top:2rem}.chat-markdown .rich-table+p{margin-top:2.25rem}.chat-markdown li{padding-left:.375rem;line-height:1.375rem}.chat-markdown li+li{margin-top:.75rem}.chat-markdown li::marker{color:hsl(var(--tw-muted-foreground))}.chat-markdown strong{color:hsl(var(--tw-foreground));font-weight:500}.chat-markdown h3,.chat-markdown h4,.chat-markdown h5{color:hsl(var(--tw-foreground));margin:1.5rem 0 .5rem;font-weight:500;line-height:1.35}.chat-markdown h3{font-size:1rem}.chat-markdown h4,.chat-markdown h5{font-size:.875rem}.chat-markdown code{border-color:hsl(var(--tw-border));background:hsl(var(--tw-secondary));color:hsl(var(--tw-foreground));border-radius:.5rem;padding:.125rem .375rem;font-size:.875rem;font-weight:400}.chat-markdown .rich-table{border:1px solid hsl(var(--tw-border));background:hsl(var(--tw-background));width:100%;max-width:100%;display:block;overflow-x:auto}.chat-markdown table{border-collapse:collapse;width:100%;font-size:.8125rem;line-height:1.375rem}.chat-markdown th,.chat-markdown td{border:1px solid hsl(var(--tw-border));text-align:left;vertical-align:top;padding:.625rem .75rem}.chat-markdown th{background:hsl(var(--tw-tertiary));color:hsl(var(--tw-muted-foreground));font-size:.75rem;font-weight:500}.tool-shimmer-base{color:hsl(var(--tw-muted-foreground))}.tool-shimmer{background:linear-gradient(90deg, hsl(var(--tw-muted-foreground)) 0%, hsl(var(--tw-muted-foreground)) 40%, hsl(var(--tw-foreground)) 50%, hsl(var(--tw-muted-foreground)) 60%, hsl(var(--tw-muted-foreground)) 100%);color:#0000;-webkit-text-fill-color:transparent;background-size:220% 100%;-webkit-background-clip:text;background-clip:text;animation:1.6s linear infinite tool-shimmer-sweep}@keyframes tool-shimmer-sweep{0%{background-position:120% 0}to{background-position:-120% 0}}.sr-only{clip:rect(0, 0, 0, 0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{left:0;right:0}.inset-x-2{left:.5rem;right:.5rem}.-top-1{top:-.25rem}.bottom-0{bottom:0}.bottom-full{bottom:100%}.left-0{left:0}.left-1\/2{left:50%}.left-3{left:.75rem}.right-0{right:0}.right-1{right:.25rem}.right-2{right:.5rem}.right-2\.5{right:.625rem}.right-3{right:.75rem}.top-1{top:.25rem}.top-1\/2{top:50%}.top-3{top:.75rem}.top-\[46\%\]{top:46%}.top-auto{top:auto}.top-full{top:100%}.z-10{z-index:10}.z-20{z-index:20}.z-40{z-index:40}.z-50{z-index:50}.z-\[60\]{z-index:60}.m-0{margin:0}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.-mx-4{margin-left:-1rem;margin-right:-1rem}.mx-auto{margin-left:auto;margin-right:auto}.my-0\.5{margin-top:.125rem;margin-bottom:.125rem}.my-1{margin-top:.25rem;margin-bottom:.25rem}.-mr-1{margin-right:-.25rem}.-mr-1\.5{margin-right:-.375rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-\[var\(--popover-offset\)\]{margin-bottom:var(--popover-offset)}.ml-1{margin-left:.25rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-24{margin-top:6rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-\[var\(--popover-offset\)\]{margin-top:var(--popover-offset)}.line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.size-1\.5{width:.375rem;height:.375rem}.size-3{width:.75rem;height:.75rem}.size-3\.5{width:.875rem;height:.875rem}.size-4{width:1rem;height:1rem}.size-5{width:1.25rem;height:1.25rem}.size-6{width:1.5rem;height:1.5rem}.size-7{width:1.75rem;height:1.75rem}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-2{height:.5rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-40{height:10rem}.h-44{height:11rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[70px\]{height:70px}.h-\[90vh\]{height:90vh}.h-\[min\(88dvh\,calc\(100dvh-64px\)\)\]{height:min(88dvh,100dvh - 64px)}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.max-h-32{max-height:8rem}.max-h-60{max-height:15rem}.max-h-72{max-height:18rem}.max-h-\[280px\]{max-height:280px}.max-h-\[min\(84dvh\,720px\)\]{max-height:min(84dvh,720px)}.max-h-\[min\(88dvh\,calc\(100dvh-64px\)\)\]{max-height:min(88dvh,100dvh - 64px)}.min-h-0{min-height:0}.min-h-11{min-height:2.75rem}.min-h-14{min-height:3.5rem}.min-h-9{min-height:2.25rem}.min-h-\[60px\]{min-height:60px}.min-h-\[68px\]{min-height:68px}.min-h-\[80px\]{min-height:80px}.w-0\.5{width:.125rem}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-32{width:8rem}.w-4{width:1rem}.w-44{width:11rem}.w-5{width:1.25rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[260px\]{width:260px}.w-\[280px\]{width:280px}.w-\[calc\(100vw-16px\)\]{width:calc(100vw - 16px)}.w-\[calc\(100vw-32px\)\]{width:calc(100vw - 32px)}.w-\[min\(520px\,42vw\)\]{width:min(520px,42vw)}.w-fit{width:fit-content}.w-full{width:100%}.min-w-0{min-width:0}.min-w-9{min-width:2.25rem}.min-w-\[12rem\]{min-width:12rem}.min-w-\[80px\]{min-width:80px}.max-w-3xl{max-width:48rem}.max-w-\[1040px\]{max-width:1040px}.max-w-\[120px\]{max-width:120px}.max-w-\[140px\]{max-width:140px}.max-w-\[160px\]{max-width:160px}.max-w-\[320px\]{max-width:320px}.max-w-\[420px\]{max-width:420px}.max-w-\[520px\]{max-width:520px}.max-w-\[560px\]{max-width:560px}.max-w-\[760px\]{max-width:760px}.max-w-\[780px\]{max-width:780px}.max-w-\[920px\]{max-width:920px}.max-w-\[min\(640px\,86\%\)\]{max-width:min(640px,86%)}.max-w-\[min\(920px\,100\%\)\]{max-width:min(920px,100%)}.max-w-full{max-width:100%}.max-w-xs{max-width:20rem}.flex-1{flex:1}.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.-translate-x-1\/2{--tw-translate-x:-50%;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y:-50%;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-0{--tw-translate-y:0px;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate:90deg;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes fade-in-once{0%{opacity:0;transform:translateY(5px)}to{opacity:1;transform:translateY(0)}}.animate-fade-in-once{animation:.28s ease-out forwards fade-in-once}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}.animate-ping{animation:1s cubic-bezier(0,0,.2,1) infinite ping}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:2s cubic-bezier(.4,0,.6,1) infinite pulse}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:1s linear infinite spin}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;user-select:none}.resize-none{resize:none}.resize-y{resize:vertical}.list-none{list-style-type:none}.appearance-none{appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-\[1fr_auto_auto_auto\]{grid-template-columns:1fr auto auto auto}.grid-cols-\[20px_auto_minmax\(0\,1fr\)_auto\]{grid-template-columns:20px auto minmax(0,1fr) auto}.grid-cols-\[20px_minmax\(0\,1fr\)\]{grid-template-columns:20px minmax(0,1fr)}.grid-cols-\[20px_minmax\(0\,1fr\)_auto\]{grid-template-columns:20px minmax(0,1fr) auto}.grid-cols-\[28px_minmax\(0\,1fr\)\]{grid-template-columns:28px minmax(0,1fr)}.grid-cols-\[auto_minmax\(0\,1fr\)_auto\]{grid-template-columns:auto minmax(0,1fr) auto}.grid-cols-\[minmax\(0\,1fr\)_auto\]{grid-template-columns:minmax(0,1fr) auto}.grid-rows-\[auto_minmax\(0\,1fr\)\]{grid-template-rows:auto minmax(0,1fr)}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.content-start{align-content:flex-start}.items-start{align-items:flex-start}.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-items-center{justify-items:center}.gap-0{gap:0}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-3\.5{gap:.875rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-border>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:hsl(var(--tw-border) / var(--tw-divide-opacity,1))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.overscroll-contain{overscroll-behavior:contain}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:calc(var(--radius) + 8px)}.rounded-\[4px\]{border-radius:4px}.rounded-\[5px\]{border-radius:5px}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:calc(var(--radius) + 4px)}.rounded-b-none{border-bottom-right-radius:0;border-bottom-left-radius:0}.rounded-t-2xl{border-top-left-radius:calc(var(--radius) + 8px);border-top-right-radius:calc(var(--radius) + 8px)}.rounded-t-xl{border-top-left-radius:calc(var(--radius) + 4px);border-top-right-radius:calc(var(--radius) + 4px)}.border{border-width:1px}.border-0{border-width:0}.border-y{border-top-width:1px;border-bottom-width:1px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-amber-700\/40{border-color:#b4530966}.border-border{--tw-border-opacity:1;border-color:hsl(var(--tw-border) / var(--tw-border-opacity,1))}.border-destructive{--tw-border-opacity:1;border-color:hsl(var(--tw-destructive) / var(--tw-border-opacity,1))}.border-destructive\/30{border-color:hsl(var(--tw-destructive) / .3)}.border-destructive\/40{border-color:hsl(var(--tw-destructive) / .4)}.border-foreground{--tw-border-opacity:1;border-color:hsl(var(--tw-foreground) / var(--tw-border-opacity,1))}.border-success\/30{border-color:hsl(var(--tw-success) / .3)}.border-transparent{border-color:#0000}.border-warning\/30{border-color:hsl(var(--tw-warning) / .3)}.bg-amber-100\/70{background-color:#fef3c7b3}.bg-background{--tw-bg-opacity:1;background-color:hsl(var(--tw-background) / var(--tw-bg-opacity,1))}.bg-border{--tw-bg-opacity:1;background-color:hsl(var(--tw-border) / var(--tw-bg-opacity,1))}.bg-brand{--tw-bg-opacity:1;background-color:hsl(var(--tw-brand) / var(--tw-bg-opacity,1))}.bg-card{--tw-bg-opacity:1;background-color:hsl(var(--tw-card) / var(--tw-bg-opacity,1))}.bg-destructive{--tw-bg-opacity:1;background-color:hsl(var(--tw-destructive) / var(--tw-bg-opacity,1))}.bg-destructive\/10{background-color:hsl(var(--tw-destructive) / .1)}.bg-destructive\/5{background-color:hsl(var(--tw-destructive) / .05)}.bg-foreground{--tw-bg-opacity:1;background-color:hsl(var(--tw-foreground) / var(--tw-bg-opacity,1))}.bg-foreground\/30{background-color:hsl(var(--tw-foreground) / .3)}.bg-foreground\/40{background-color:hsl(var(--tw-foreground) / .4)}.bg-hard{--tw-bg-opacity:1;background-color:hsl(var(--tw-hard) / var(--tw-bg-opacity,1))}.bg-info{--tw-bg-opacity:1;background-color:hsl(var(--tw-info) / var(--tw-bg-opacity,1))}.bg-muted-foreground\/40{background-color:hsl(var(--tw-muted-foreground) / .4)}.bg-muted\/15{background-color:hsl(var(--tw-muted) / .15)}.bg-secondary{--tw-bg-opacity:1;background-color:hsl(var(--tw-secondary) / var(--tw-bg-opacity,1))}.bg-secondary\/50{background-color:hsl(var(--tw-secondary) / .5)}.bg-success{--tw-bg-opacity:1;background-color:hsl(var(--tw-success) / var(--tw-bg-opacity,1))}.bg-success\/10{background-color:hsl(var(--tw-success) / .1)}.bg-tertiary{--tw-bg-opacity:1;background-color:hsl(var(--tw-tertiary) / var(--tw-bg-opacity,1))}.bg-transparent{background-color:#0000}.bg-warning{--tw-bg-opacity:1;background-color:hsl(var(--tw-warning) / var(--tw-bg-opacity,1))}.bg-warning\/10{background-color:hsl(var(--tw-warning) / .1)}.bg-warning\/15{background-color:hsl(var(--tw-warning) / .15)}.fill-muted-foreground{fill:hsl(var(--tw-muted-foreground) / 1)}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-12{padding:3rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-0{padding-left:0;padding-right:0}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.pb-1{padding-bottom:.25rem}.pb-2{padding-bottom:.5rem}.pb-20{padding-bottom:5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pb-5{padding-bottom:1.25rem}.pb-\[env\(safe-area-inset-bottom\)\]{padding-bottom:env(safe-area-inset-bottom)}.pl-0\.5{padding-left:.125rem}.pl-1{padding-left:.25rem}.pl-4{padding-left:1rem}.pl-7{padding-left:1.75rem}.pr-1{padding-right:.25rem}.pr-10{padding-right:2.5rem}.pr-14{padding-right:3.5rem}.pr-2{padding-right:.5rem}.pr-7{padding-right:1.75rem}.pr-8{padding-right:2rem}.pr-9{padding-right:2.25rem}.pt-1{padding-top:.25rem}.pt-16{padding-top:4rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{letter-spacing:-.015em;font-size:1.375rem;line-height:1.75rem}.text-3xl{letter-spacing:-.02em;font-size:1.875rem;line-height:2.25rem}.text-\[0\.7rem\]{font-size:.7rem}.text-\[10\.5px\]{font-size:10.5px}.text-\[10px\]{font-size:10px}.text-\[11\.5px\]{font-size:11.5px}.text-\[11px\]{font-size:11px}.text-\[12\.5px\]{font-size:12.5px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[2rem\]{font-size:2rem}.text-\[3rem\]{font-size:3rem}.text-base{letter-spacing:0;font-size:.875rem;line-height:1.5rem}.text-lg{letter-spacing:-.005em;font-size:1rem;line-height:1.5rem}.text-sm{letter-spacing:0;font-size:.8125rem;line-height:1.25rem}.text-xl{letter-spacing:-.01em;font-size:1.125rem;line-height:1.5rem}.text-xs{letter-spacing:0;font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.normal-case{text-transform:none}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-4{line-height:1rem}.leading-5{line-height:1.25rem}.leading-\[1\.65rem\]{line-height:1.65rem}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-tight{line-height:1.25}.tracking-\[0\.08em\]{letter-spacing:.08em}.tracking-normal{letter-spacing:0}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.text-amber-800{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity,1))}.text-background{--tw-text-opacity:1;color:hsl(var(--tw-background) / var(--tw-text-opacity,1))}.text-brand-foreground{--tw-text-opacity:1;color:hsl(var(--tw-brand-foreground) / var(--tw-text-opacity,1))}.text-card-foreground{--tw-text-opacity:1;color:hsl(var(--tw-card-foreground) / var(--tw-text-opacity,1))}.text-destructive{--tw-text-opacity:1;color:hsl(var(--tw-destructive) / var(--tw-text-opacity,1))}.text-foreground{--tw-text-opacity:1;color:hsl(var(--tw-foreground) / var(--tw-text-opacity,1))}.text-foreground\/40{color:hsl(var(--tw-foreground) / .4)}.text-foreground\/70{color:hsl(var(--tw-foreground) / .7)}.text-foreground\/80{color:hsl(var(--tw-foreground) / .8)}.text-info{--tw-text-opacity:1;color:hsl(var(--tw-info) / var(--tw-text-opacity,1))}.text-muted-foreground{--tw-text-opacity:1;color:hsl(var(--tw-muted-foreground) / var(--tw-text-opacity,1))}.text-muted-foreground\/70{color:hsl(var(--tw-muted-foreground) / .7)}.text-muted-foreground\/80{color:hsl(var(--tw-muted-foreground) / .8)}.text-success{--tw-text-opacity:1;color:hsl(var(--tw-success) / var(--tw-text-opacity,1))}.text-warning{--tw-text-opacity:1;color:hsl(var(--tw-warning) / var(--tw-text-opacity,1))}.underline-offset-4{text-underline-offset:4px}.accent-brand{accent-color:hsl(var(--tw-brand) / 1)}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-60{opacity:.6}.shadow-none{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.shadow-subtle-md{--tw-shadow:var(--shadow-subtle-md);--tw-shadow-colored:var(--shadow-subtle-md);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.shadow-subtle-sm{--tw-shadow:var(--shadow-subtle-sm);--tw-shadow-colored:var(--shadow-subtle-sm);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.shadow-subtle-xs{--tw-shadow:var(--shadow-subtle-xs);--tw-shadow-colored:var(--shadow-subtle-xs);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.outline-none{outline-offset:2px;outline:2px solid #0000}.outline{outline-style:solid}.ring{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000)}.ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000)}.ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000)}.ring-inset{--tw-ring-inset:inset}.ring-card{--tw-ring-opacity:1;--tw-ring-color:hsl(var(--tw-card) / var(--tw-ring-opacity,1))}.ring-foreground\/10{--tw-ring-color:hsl(var(--tw-foreground) / .1)}.ring-secondary{--tw-ring-opacity:1;--tw-ring-color:hsl(var(--tw-secondary) / var(--tw-ring-opacity,1))}.blur{--tw-blur:blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-\[2px\]{--tw-backdrop-blur:blur(2px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-opacity{transition-property:opacity;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-transform{transition-property:transform;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-200{transition-duration:.2s}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0), var(--tw-enter-translate-y,0), 0) scale3d(var(--tw-enter-scale,1), var(--tw-enter-scale,1), var(--tw-enter-scale,1)) rotate(var(--tw-enter-rotate,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0), var(--tw-exit-translate-y,0), 0) scale3d(var(--tw-exit-scale,1), var(--tw-exit-scale,1), var(--tw-exit-scale,1)) rotate(var(--tw-exit-rotate,0))}}.animate-in{--tw-enter-opacity:initial;--tw-enter-scale:initial;--tw-enter-rotate:initial;--tw-enter-translate-x:initial;--tw-enter-translate-y:initial;animation-name:enter;animation-duration:.15s}.fade-in-0{--tw-enter-opacity:0}.zoom-in-95{--tw-enter-scale:.95}.slide-in-from-right{--tw-enter-translate-x:100%}.duration-200{animation-duration:.2s}.running{animation-play-state:running}.\[--button-icon-size\:14px\]{--button-icon-size:14px}.\[--button-icon-size\:15px\]{--button-icon-size:15px}.\[--button-icon-size\:16px\]{--button-icon-size:16px}.\[--button-icon-size\:17px\]{--button-icon-size:17px}:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--tw-background:0 0% 100%;--tw-foreground:240 6% 10%;--tw-secondary:240 5% 96%;--tw-secondary-foreground:240 6% 10%;--tw-tertiary:240 5% 92%;--tw-tertiary-foreground:240 6% 10%;--tw-card:0 0% 100%;--tw-card-foreground:240 6% 10%;--tw-popover:0 0% 100%;--tw-popover-foreground:240 6% 10%;--tw-muted:240 5% 96%;--tw-muted-foreground:240 4% 46%;--tw-accent:142 71% 35%;--tw-accent-foreground:0 0% 100%;--tw-brand:240 6% 10%;--tw-brand-foreground:0 0% 100%;--tw-destructive:0 84% 60%;--tw-destructive-foreground:0 0% 100%;--tw-success:142 71% 35%;--tw-warning:35 92% 45%;--tw-info:217 91% 60%;--tw-border:240 6% 90%;--tw-soft:240 5% 96%;--tw-hard:240 5% 84%;--tw-input:240 6% 90%;--tw-ring:240 6% 10%;--shadow-subtle-xs:0 1px 2px #0f0f0f0a;--shadow-subtle-sm:0 4px 12px #0f0f0f0f;--shadow-subtle-md:0 16px 32px #0f0f0f14;--radius:8px;font-family:Inter,system-ui,-apple-system,Segoe UI,Helvetica Neue,sans-serif}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.001ms!important;animation-duration:.001ms!important;animation-iteration-count:1!important}}.placeholder\:text-muted-foreground::placeholder{--tw-text-opacity:1;color:hsl(var(--tw-muted-foreground) / var(--tw-text-opacity,1))}.first\:pt-1:first-child{padding-top:.25rem}.last\:mr-0:last-child{margin-right:0}.last\:border-b-0:last-child{border-bottom-width:0}.last\:pb-0:last-child{padding-bottom:0}.focus-within\:border-foreground\/40:focus-within{border-color:hsl(var(--tw-foreground) / .4)}.focus-within\:bg-tertiary:focus-within{--tw-bg-opacity:1;background-color:hsl(var(--tw-tertiary) / var(--tw-bg-opacity,1))}.focus-within\:ring-2:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000)}.focus-within\:ring-ring:focus-within{--tw-ring-opacity:1;--tw-ring-color:hsl(var(--tw-ring) / var(--tw-ring-opacity,1))}.focus-within\:ring-offset-2:focus-within{--tw-ring-offset-width:2px}.focus-within\:ring-offset-background:focus-within{--tw-ring-offset-color:hsl(var(--tw-background) / 1)}.hover\:border-border:hover{--tw-border-opacity:1;border-color:hsl(var(--tw-border) / var(--tw-border-opacity,1))}.hover\:bg-card:hover{--tw-bg-opacity:1;background-color:hsl(var(--tw-card) / var(--tw-bg-opacity,1))}.hover\:bg-destructive\/10:hover{background-color:hsl(var(--tw-destructive) / .1)}.hover\:bg-secondary:hover{--tw-bg-opacity:1;background-color:hsl(var(--tw-secondary) / var(--tw-bg-opacity,1))}.hover\:bg-tertiary:hover{--tw-bg-opacity:1;background-color:hsl(var(--tw-tertiary) / var(--tw-bg-opacity,1))}.hover\:text-foreground:hover{--tw-text-opacity:1;color:hsl(var(--tw-foreground) / var(--tw-text-opacity,1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-90:hover{opacity:.9}.focus-visible\:outline-none:focus-visible{outline-offset:2px;outline:2px solid #0000}.focus-visible\:ring-0:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000)}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000)}.focus-visible\:ring-ring:focus-visible{--tw-ring-opacity:1;--tw-ring-color:hsl(var(--tw-ring) / var(--tw-ring-opacity,1))}.focus-visible\:ring-offset-0:focus-visible{--tw-ring-offset-width:0px}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px}.focus-visible\:ring-offset-background:focus-visible{--tw-ring-offset-color:hsl(var(--tw-background) / 1)}.focus-visible\:ring-offset-card:focus-visible{--tw-ring-offset-color:hsl(var(--tw-card) / 1)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.group[open] .group-open\:rotate-90{--tw-rotate:90deg;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:focus-within .group-focus-within\:opacity-100{opacity:1}.group:hover .group-hover\:translate-x-0\.5{--tw-translate-x:.125rem;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:opacity-100{opacity:1}.aria-disabled\:pointer-events-none[aria-disabled=true]{pointer-events:none}.aria-disabled\:opacity-50[aria-disabled=true]{opacity:.5}.aria-selected\:bg-secondary[aria-selected=true]{--tw-bg-opacity:1;background-color:hsl(var(--tw-secondary) / var(--tw-bg-opacity,1))}.aria-selected\:text-foreground[aria-selected=true]{--tw-text-opacity:1;color:hsl(var(--tw-foreground) / var(--tw-text-opacity,1))}.data-\[state\=delayed-open\]\:animate-in[data-state=delayed-open],.data-\[state\=open\]\:animate-in[data-state=open]{--tw-enter-opacity:initial;--tw-enter-scale:initial;--tw-enter-rotate:initial;--tw-enter-translate-x:initial;--tw-enter-translate-y:initial;animation-name:enter;animation-duration:.15s}.data-\[state\=closed\]\:animate-out[data-state=closed]{--tw-exit-opacity:initial;--tw-exit-scale:initial;--tw-exit-rotate:initial;--tw-exit-translate-x:initial;--tw-exit-translate-y:initial;animation-name:exit;animation-duration:.15s}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity:0}.data-\[state\=delayed-open\]\:fade-in-0[data-state=delayed-open],.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity:0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale:.95}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale:.95}.dark\:border-amber-300\/30:is(.dark *){border-color:#fcd34d4d}.dark\:bg-amber-950\/40:is(.dark *){background-color:#451a0366}.dark\:text-amber-300:is(.dark *){--tw-text-opacity:1;color:rgb(252 211 77/var(--tw-text-opacity,1))}@media (width>=520px){.sm\:-mx-5{margin-left:-1.25rem;margin-right:-1.25rem}.sm\:inline{display:inline}.sm\:flex{display:flex}.sm\:inline-flex{display:inline-flex}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:px-2{padding-left:.5rem;padding-right:.5rem}.sm\:px-4{padding-left:1rem;padding-right:1rem}.sm\:px-5{padding-left:1.25rem;padding-right:1.25rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:pt-24{padding-top:6rem}}@media (width>=640px){.min-\[640px\]\:bottom-auto{bottom:auto}.min-\[640px\]\:left-1\/2{left:50%}.min-\[640px\]\:right-auto{right:auto}.min-\[640px\]\:top-1\/2{top:50%}.min-\[640px\]\:hidden{display:none}.min-\[640px\]\:h-auto{height:auto}.min-\[640px\]\:max-h-\[calc\(100dvh-64px\)\]{max-height:calc(100dvh - 64px)}.min-\[640px\]\:min-h-\[420px\]{min-height:420px}.min-\[640px\]\:w-\[calc\(100vw-32px\)\]{width:calc(100vw - 32px)}.min-\[640px\]\:-translate-y-1\/2{--tw-translate-y:-50%;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.min-\[640px\]\:rounded-xl{border-radius:calc(var(--radius) + 4px)}.min-\[640px\]\:pb-0{padding-bottom:0}}@media (width>=820px){.md\:inset-x-auto{left:auto;right:auto}.md\:bottom-4{bottom:1rem}.md\:left-1\/2{left:50%}.md\:right-auto{right:auto}.md\:block{display:block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:h-7{height:1.75rem}.md\:h-8{height:2rem}.md\:h-9{height:2.25rem}.md\:h-auto{height:auto}.md\:max-h-\[84vh\]{max-height:84vh}.md\:w-7{width:1.75rem}.md\:w-8{width:2rem}.md\:w-9{width:2.25rem}.md\:w-\[420px\]{width:420px}.md\:w-\[560px\]{width:560px}.md\:w-\[780px\]{width:780px}.md\:w-\[920px\]{width:920px}.md\:-translate-x-1\/2{--tw-translate-x:-50%;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.md\:rounded-xl{border-radius:calc(var(--radius) + 4px)}.md\:px-12{padding-left:3rem;padding-right:3rem}}.\[\&\:\:-webkit-details-marker\]\:hidden::-webkit-details-marker{display:none}.\[\&\>svg\]\:h-\[var\(--button-icon-size\)\]>svg{height:var(--button-icon-size)}.\[\&\>svg\]\:w-\[var\(--button-icon-size\)\]>svg{width:var(--button-icon-size)}.\[\&\>svg\]\:shrink-0>svg{flex-shrink:0}.\[\&_\.button-icon\]\:h-\[var\(--button-icon-size\)\] .button-icon{height:var(--button-icon-size)}.\[\&_\.button-icon\]\:w-\[var\(--button-icon-size\)\] .button-icon{width:var(--button-icon-size)}.\[\&_\.button-icon\]\:shrink-0 .button-icon{flex-shrink:0}.\[\&_\[cmdk-group-heading\]\]\:px-3 [cmdk-group-heading]{padding-left:.75rem;padding-right:.75rem}.\[\&_\[cmdk-group-heading\]\]\:py-2 [cmdk-group-heading]{padding-top:.5rem;padding-bottom:.5rem}.\[\&_\[cmdk-group-heading\]\]\:text-xs [cmdk-group-heading]{letter-spacing:0;font-size:.75rem;line-height:1rem}.\[\&_\[cmdk-group-heading\]\]\:font-medium [cmdk-group-heading]{font-weight:500}.\[\&_\[cmdk-group-heading\]\]\:text-muted-foreground [cmdk-group-heading]{--tw-text-opacity:1;color:hsl(var(--tw-muted-foreground) / var(--tw-text-opacity,1))}.\[\&_svg\]\:size-3 svg{width:.75rem;height:.75rem}.\[\&_svg\]\:size-3\.5 svg{width:.875rem;height:.875rem}.\[\&_svg\]\:size-4 svg{width:1rem;height:1rem}
|