Skip to content

Feat/dr1001 token whitelist wildcard#5768

Open
taowis wants to merge 440 commits into
QuantumNous:mainfrom
deeprouter-ai:feat/dr1001-token-whitelist-wildcard
Open

Feat/dr1001 token whitelist wildcard#5768
taowis wants to merge 440 commits into
QuantumNous:mainfrom
deeprouter-ai:feat/dr1001-token-whitelist-wildcard

Conversation

@taowis

@taowis taowis commented Jun 27, 2026

Copy link
Copy Markdown

⚠️ 提交说明 / PR Notice

Important

  • 请提供人工撰写的简洁摘要,避免直接粘贴未经整理的 AI 输出。

📝 变更描述 / Description

(简述:做了什么?为什么这样改能生效?请基于你对代码逻辑的理解来写,避免粘贴未经整理的内容)

🚀 变更类型 / Type of change

  • 🐛 Bug 修复 (Bug fix) - 请关联对应 Issue,避免将设计取舍、理解偏差或预期不一致直接归类为 bug
  • ✨ 新功能 (New feature) - 重大特性建议先通过 Issue 沟通
  • ⚡ 性能优化 / 重构 (Refactor)
  • 📝 文档更新 (Documentation)

🔗 关联任务 / Related Issue

  • Closes # (如有)

✅ 提交前检查项 / Checklist

  • 人工确认: 我已亲自整理并撰写此描述,没有直接粘贴未经处理的 AI 输出。
  • 非重复提交: 我已搜索现有的 IssuesPRs,确认不是重复提交。
  • Bug fix 说明: 若此 PR 标记为 Bug fix,我已提交或关联对应 Issue,且不会将设计取舍、预期不一致或理解偏差直接归类为 bug。
  • 变更理解: 我已理解这些更改的工作原理及可能影响。
  • 范围聚焦: 本 PR 未包含任何与当前任务无关的代码改动。
  • 本地验证: 已在本地运行并通过测试或手动验证,维护者可以据此复核结果。
  • 安全合规: 代码中无敏感凭据,且符合项目代码规范。

📸 运行证明 / Proof of Work

(请在此粘贴截图、关键日志或测试报告,以证明变更生效)

hades217 and others added 30 commits June 19, 2026 14:43
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Multi-agent research synthesis: mirrors the Stripe auto-topup path for
Airwallex (Customer + PaymentConsent + PaymentMethod), with data-model
changes, webhook hardening, provider-split charge seam, AUD/USD currency
unification, risks, test plan, and a 9-PR phased rollout where only the
final PR enables real off-session charging. Design only — no code shipped.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Adds airwallex_customer / airwallex_consent_id / airwallex_payment_method /
airwallex_original_txn_id to model.User (GORM auto-migrate, 3-DB compatible).
Foundation for Airwallex off-session auto-charge per the design doc — no
behaviour change yet; nothing reads these columns.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…t fields

- Add a 5-min freshness window on the webhook x-timestamp (fail-OPEN on an
  unparseable format so live manual-topup webhooks are never broken; the HMAC
  already covers the timestamp so genuine replays are still caught).
- Extend AirwallexPaymentIntent to parse customer_id / payment_consent_id /
  latest_payment_attempt.payment_method.id / payment_method_transaction_id
  (paths to confirm against real payloads before PR-3 reads them).
- Unit test for the freshness check.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- auto_topup_setting: AirwallexEnabled master flag (default off) + MinChargeAUDCents.
- RechargeAirwallex: accept + persist airwallex_customer/consent_id/payment_method/
  original_txn_id onto the user (only when non-empty → zero change until PR-4).
- handleAirwallexSucceeded passes the webhook-parsed consent fields through.
- createAirwallexPaymentIntent gains an optional customer_id; ensureAirwallexCustomer
  helper added (used by the PR-4 save-for-future flow).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…arges

Adds quotaUnitsToMajorAmount (major units, not cents) alongside the Stripe
cents helper, at the same SellMultiplier markup — for the Airwallex AUD
off-session charge path. Unit-tested.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…red)

service/auto_topup_airwallex.go: airwallexOffSessionCharge — create intent +
confirm against a saved PaymentConsent (triggered_by:merchant, unscheduled MIT,
original_transaction_id). Pure request-body builders are unit-tested; the
charge fn is behind airwallexChargeFn seam, NOT yet called from MaybeAutoTopup.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ag-gated)

MaybeAutoTopup now routes to the Airwallex off-session path when the operator
master flag (AutoTopupAirwallexEnabled, default OFF) is on AND the user has a
saved consent — otherwise the existing Stripe path runs unchanged. Adds
decideAirwallexAutoTopup (pure, unit-tested) + maybeAirwallexAutoTopup
(lock → charge → credit → log, mirrors the Stripe flow).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Webhook handles payment_consent.* (disabled/revoked/expired) early →
  model.ClearAirwallexConsent wipes the saved consent so off-session charging
  stops (payload path noted as to-confirm).
- maybeAirwallexAutoTopup disables a user's auto-topup after 3 consecutive
  charge failures (Redis counter, resets on success).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… plumbing)

- Backend: AirwallexPayRequest.save_for_future → RequestAirwallexPay ensures an
  Airwallex Customer (ensureAirwallexCustomer) and attaches the intent to it,
  so the card/consent can be reused off-session. Falls back to one-time on error.
- Frontend: thread save_for_future through the airwallex pay request/hook/handler
  (defaults false). The visible "save card" checkbox is deferred until the
  operator enables AirwallexEnabled + real-card verification (PR-9) — the
  current "Airwallex is one-time only" hint stays accurate until then.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…r flag)

Exposes airwallex_autotopup_enabled in topup info; the Airwallex form shows a
"save this card for auto-recharge" checkbox only when the operator has enabled
it (otherwise the "one-time only, use Stripe" hint stays). The checkbox threads
save_for_future through the existing pay path.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…etting

The /about page rendered the /api/about system setting — seeded as a short
placeholder HTML by deploy/preset-content.sql — which overrode and blanked out
the built-in DeepRouter brand About page. Render DefaultAboutContent
unconditionally so a stray admin/seed value can never override it. Drop the now
unused api.ts/types.ts and the data-fetch path.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JKUmGXKsn5ihKU6KP8BRHs
…etting

The /about page rendered the /api/about system setting — seeded as a short
placeholder HTML by deploy/preset-content.sql — which overrode and blanked out
the built-in DeepRouter brand About page. Render DefaultAboutContent
unconditionally so a stray admin/seed value can never override it. Drop the now
unused api.ts/types.ts and the data-fetch path.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JKUmGXKsn5ihKU6KP8BRHs
- Hero: region/model/use-case wizard ("Your AI, unlocked"); headline
  switched to "One account. Every AI model." (pitch-deck positioning);
  Australia is the default region; demand-first overseas-model framing.
- Smart Routing demo (auto-cycling prompt -> deeprouter-auto -> model) with
  animated savings cost bar (I1/I2).
- Value calculator: USD slider -> live usage estimates via usage-estimate (I4).
- Hero <-> wizard reactive background (I3), brand-strip hover/tooltip (I5),
  pointer parallax (I7), spring microinteractions (I6). Framer Motion,
  design tokens, prefers-reduced-motion safe, no chat (red line).
- Fix: minimum top-up stat shows $5 (was incorrectly ¥5).
- Brand favicon: favicon-32/64 + apple-touch-icon from logo.png.
- Docs: OPTIMIZATION-PRD.md; tasks/home-motion-interactive-prd.md (v0.2).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…44)

New homepage acquisition pieces on top of the existing SmartRouting section:

- Hero: "Your AI, unlocked" wizard (region -> overseas-model access copy;
  model/use-case -> illustrative routing preview). Default region Australia.
  Headline switched to "One account. Every AI model." (pitch-deck positioning,
  CNY demoted from the headline to a payment detail).
- Value calculator: USD slider -> live usage estimates (chats / images / videos
  / per-model chars) reusing lib/usage-estimate (same figures as the wallet).
- Hero polish: background reacts to wizard use, brand-strip hover tooltips,
  pointer parallax, spring microinteractions. Framer Motion, design tokens,
  prefers-reduced-motion safe, no chat (red line).
- Fix: minimum top-up stat shows $5 (was incorrectly rendered as ¥5).
- Brand favicon (favicon-32/64 + apple-touch from logo.png).
- Docs: OPTIMIZATION-PRD.md; tasks/home-motion-interactive-prd.md (v0.3).

Note: the animated Smart Routing demo (I1/I2 in the PRD) was intentionally
dropped — origin/main already ships an equivalent SmartRouting section, which
this PR keeps.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
docs: update skill marketplace PRD for R2 downloadable package model
Resolves "价格未配置 / price not configured" for models that are offered in
Quick Import presets (metadata-only, no embedded price) but were missing from
defaultModelRatio, and for Claude -thinking variants.

GetModelRatio now falls back to the base model's ratio for any plain
"-thinking" name (extended-thinking output bills at the normal output-token
rate, so the input ratio is identical) — so future thinking variants can't
regress to 价格未配置.

Added explicit entries: claude-sonnet-4-6(+thinking), qwen-max,
doubao-seed-1-6-thinking-250715, gpt-image-1.5 (ratio + completion),
gemini-3.1-pro-preview, gemini-3-flash-preview, flux-1.1-pro, flux-schnell,
doubao-seedream-4-0-250828, doubao-seedance-2-0-260128, kling-v2-master.
Uncertain image/video/qwen prices are bootstrap defaults (≈sibling),
commented "refine via models.dev sync".

New regression test TestEveryCacheModelHasModelRatio guards the recurring
class: a model with a cache/completion ratio but no model ratio.


Claude-Session: https://claude.ai/code/session_01WsrDW2XYNDRRVDe9iFP3AY

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ail API (DR-53) (#46)

* feat(skill-detail): add requires_deeprouter_key and download_cta to detail API (DR-53)

GetMarketplaceSkill now returns PublicSkillDetail which extends the existing
PublicSkill with two new fields:
- requires_deeprouter_key: true — advertises DeepRouter runtime dependency
- download_cta: { url, method } — points to the DR-81 download endpoint

The list endpoint (ListMarketplaceSkills) is unchanged and does not expose
these detail-only fields. No provider credentials or routing logic are exposed.

Slug is percent-encoded via url.PathEscape in the CTA URL to prevent broken
links from URL-unsafe characters in historical or future slug values.

Note: /api/v1/marketplace/skills/:slug/download route is not registered in
this PR. The CTA advertises the pointer only; the download endpoint is
provided by DR-81. Frontend must not wire the download button until DR-81 lands.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(ci): eliminate SIGPIPE false-negative in kids matrix check

On Linux with pipefail, `printf | grep -q` reports the pipeline as
failed when grep exits early (after finding a match) and printf gets
SIGPIPE. This caused the matrix check to mark a present test function
as missing.

Fix: write AVAILABLE to a tempfile and grep the file directly,
removing the pipeline from the comparison loop entirely.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…nt (DR-81)

- SkillUserAuth middleware (common user role, login required) added to skill-auth.go
- DownloadSkillPackage handler: published-only lookup, plan entitlement check,
  in-memory zip build, UES upsert (download == enable in V1), zip response
- Zip contains manifest.json (schema_version, skill_id, slug, name, required_plan,
  category, requires_deeprouter_key) + SKILL.md (frontmatter + description +
  input_hints); instruction_template deferred to DR-41 (skill_versions)
- downloadRoute group in skill-router.go uses SkillUserAuth + SKD rate-limit tag
- 9 new tests: happy path, zip contents, 404 on not-found/non-published,
  403 plan hierarchy (free/pro/enterprise), UUID lookup, no credentials in zip
- Total: 38/38 pass, go vet clean

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ng (DR-81)

Four issues found in CTO review:
- BLOCKING: Content-Disposition built by string concat — slug containing `"` or
  CRLF could inject arbitrary response headers. Fixed: mime.FormatMediaType().
- BLOCKING: ShortDescription embedded raw in YAML frontmatter — quotes or newlines
  broke the SKILL.md frontmatter block. Fixed: strings.NewReplacer escaping.
- SHOULD FIX: NoProviderCredentials test searched raw zip bytes (binary), which
  is unreliable. Fixed: open zip, check each entry's content individually;
  also added instruction_template to the forbidden list.
- SHOULD FIX: NonPublished test did not cover deprecated status. Fixed: added
  deprecated to the status loop (now draft/archived/deprecated, 3 subtests).

38/38 pass, go vet clean.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…source (DR-81)

Four gaps identified in NEW-3 acceptance review:

1. BUG: SkillUserAuth token-auth path set group from empty session, causing
   pro/enterprise users to be treated as free tier for plan entitlement.
   Fixed: when useAccessToken=true, load group via model.GetUserGroup().

2. manifest.json missing skill_version_id. Now populated from
   skills.active_version_id (nil until DR-41; omitted via omitempty).
   Added tests: nil case + non-nil case (versioned skill).

3. EntryPoint enum missing skill_package value. Added
   EntryPointSkillPackage = "skill_package" + registered in validEntryPoints.
   analytics emit deferred — no emit infrastructure exists yet.

4. UES written with source="marketplace"; corrected to source="skill_package"
   to distinguish download-triggered entries from manual enables.
   Test updated to assert source value.

Deferred (separate tickets):
- instruction_template in zip (requires DR-41 skill_versions table)
- skill_enabled analytics event (no emit infrastructure)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Implements skill_enabled analytics event required by tasks/03 §4.4 §8.2:

skill_usage_events table:
- New SkillUsageEvent model with int64 user_id/tenant_id (D1 deviation
  matching UES; no UUID mapping needed in V1).
- MigrateSkillUsageEvents: SQLite CREATE TABLE IF NOT EXISTS + PG/MySQL
  AutoMigrate; three indexes (event_type+time, user+skill+time, entry_point+time)
  created via HasIndex pattern for MySQL 5.7 compatibility.
- EmitSkillEnabled writes event_type=skill_enabled, entry_point=skill_package,
  plan from skill.required_plan, skill_version_id from active_version_id (nil
  until DR-41).

Download handler:
- Calls EmitSkillEnabled after UES write; logs on failure, does not block
  the download response.

Tests:
- testDownloadDB now migrates skill_usage_events.
- TestDownloadSkillPackage_EmitsSkillEnabledEvent asserts event row written
  with correct entry_point, user_id, plan.

Enum tests:
- EntryPointSkillPackage added to TestEntryPoint_Valid and
  TestEntryPoint_StringValues.

Deferred (hard dependency on DR-41 / NEW-1):
- instruction_template in zip (requires skill_versions table)
- Versioned zip pinned to active skill_version_id with version existence check

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The consent checkbox sat below the (disabled-until-checked) Sign in button,
so users saw a greyed-out button with no visible reason. Move Turnstile +
LegalConsent above the submit button to match the sign-up form, making the
gating checkbox visible before the button.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01M44JTP8yhj1RpeeR8X6bt2
…speech (#48)

The channel test button always probed with /v1/chat/completions, so every
ElevenLabs (channel type 58) test failed with the adaptor guard
"elevenlabs channel only supports text-to-speech (/v1/audio/speech)" —
a false negative even when the upstream key is valid.

Route TTS-only channels (currently only ElevenLabs) to the audio-speech
endpoint instead:
- isAudioSpeechOnlyChannel() detects ChannelTypeElevenLabs
- testChannel forces requestPath /v1/audio/speech + RelayFormatOpenAIAudio
- buildTestRequest returns *dto.AudioRequest for those channels
- convert switch handles RelayModeAudioSpeech (ConvertAudioRequest → io.Reader)
- body serialization reads io.Reader bodies (audio) vs marshalling structs

Adds TestBuildTestRequestForElevenLabsIsAudioSpeech.


Claude-Session: https://claude.ai/code/session_01KJvoRH7Xzw1gaUJgd6Rqya

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ation (DR-81)

Adds MigrateSkillUsageEvents(DB) to migrateDB() in model/main.go so that
the skill_usage_events table is created at startup in all environments.
Without this, EmitSkillEnabled would silently log errors in production
instead of recording analytics events.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Same fix as merged to main in PR #45, applied on this branch. Prices the
models that hit "价格未配置" (Quick Import presets are metadata-only, so
pricing relies on defaultModelRatio) and adds a "-thinking" suffix fallback
in GetModelRatio so thinking variants resolve to their base model's ratio.
Also adds TestEveryCacheModelHasModelRatio as a regression guard.

Note: this branch is behind main; model_ratio.go here is the older-base
variant of the same fix already live on main — reconcile on next sync.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WsrDW2XYNDRRVDe9iFP3AY
The consent checkbox sat below the (disabled-until-checked) Sign in button,
so users saw a greyed-out button with no visible reason. Move Turnstile +
LegalConsent above the submit button to match the sign-up form, making the
gating checkbox visible before the button.


Claude-Session: https://claude.ai/code/session_01M44JTP8yhj1RpeeR8X6bt2

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…guide WIP

Home: rework hero + stats sections (motion/interactive).
Keys: integration dialog, success dialog, cells/table tweaks, integration lib,
persona presets, wallet recharge copy.
i18n: en/zh strings for the above.
Docs: BUSINESS-LOGIC, CONNECT, DeepRouter BP/brand PRD, casual-journey &
key-setup-guide task PRDs.

Also carries the already-merged ElevenLabs channel-test fix (matches main).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KJvoRH7Xzw1gaUJgd6Rqya
taowis and others added 29 commits June 24, 2026 18:26
…ll-blocked

feat(skill): emit skill_blocked for relay block paths
…ll-packaging

DR-79: Add publish-time Skill packages
…ment-check

DR-67: Add use-time skill entitlement gate
DR-69 Provider response return and usage events
…time-skill-packaging"

This reverts commit d8e7fbf, reversing
changes made to e45acc3.
…sh-time-skill-packaging

# Conflicts:
#	CHANGELOG.md
…me-skill-packaging

Revert DR-79 publish-time Skill packages
…blish-time-skill-packaging"

This reverts commit c85f91b, reversing
changes made to 01f7665.
…e-artifacts

DR-79: Build package artifacts on version activation
…actions)

Replace the placeholder My Skills grid with the tasks/02 §4.3 management
surface: header count, All/Available/Locked/Deprecated filters, desktop table
+ mobile list, six row states (available/plan-locked/quota-exceeded/deprecated/
archived/kids-blocked), Remove from My Skills (DR-56 DELETE) with confirm, and
Use → Skill Detail (D-09; navigation only, no skill_used).

Use and the skill-name link are gated to published rows (canUse/canOpen),
since Skill Detail is published-only — deprecated/archived show warning/reason
+ Remove only, with plain-text names, to avoid a 404 dead path.

Frontend-only: no backend / availability resolver / ListMySkills changes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
# Conflicts:
#	CHANGELOG.md
#	web/default/src/i18n/locales/en.json
#	web/default/src/i18n/locales/zh.json
Add the required DR-59 task PRD (docs/tasks/dr59-my-skills-ui-prd.md) that was
missing — Rule 11 (PRD-first-per-task). It records the §4.3 management-surface
scope, the D-09 Use→Skill Detail interpretation, the published-only Use/name
gating, and the deliberate FR-U6 lock-state-CTA deferral (pending explicit
reviewer/product sign-off, else a CTA-routing follow-up ticket). Adds the
corresponding CHANGELOG entry.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…y, ref path)

- Add an explicit "Merge condition" to the FR-U6 staged deviation so it reads as
  a formally controlled exception, not a passing note.
- Unify the empty-state copy in Acceptance Criteria to "Explore Skills (/skills)"
  (matches Scope + the actual button), dropping the stray "Explore Marketplace".
- Use the full path for the FR-U5 PRD ref.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
feat(DR-59): My Skills management UI (table + filters + row states + actions)
Per-key model whitelist auth used exact map lookup, so chips like
`claude-*` never matched `claude-opus-4-8` (gateway returned
"This token has no access to model claude-opus-4-8").

Switch the relay gate to model.MatchModelLimit (exact-first +
trailing-"*" prefix, matching the convention in
setting/operation_setting/tools.go). The whitelist stays a pure subset
filter — channel selection still gates on group/ability, so a wildcard
cannot grant access beyond the account (DR-1001 PRD §5, verified).

/v1/models listing: concrete entries keep the existing contract (listed
directly); wildcard entries expand best-effort against the account/group
enabled models so the listing matches what actually routes.

Tests: MatchModelLimit (15 cases) + controller wildcard-listing case;
existing token-limit listing contract test still passes.

Refs: docs/tasks/dr1001-token-model-whitelist-wildcard-prd.md

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jun 27, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Too many files!

This PR contains 626 files, which is 476 over the limit of 150.

To get a review, narrow the scope:
• coderabbit review --type committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

Upgrade to a paid plan to raise the limit.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 79c6daa1-8c72-4f34-b919-db7c75f59e55

📥 Commits

Reviewing files that changed from the base of the PR and between d10fc76 and ae0ac4c.

⛔ Files ignored due to path filters (29)
  • docs/brand/assets/brand-logo-panel.png is excluded by !**/*.png
  • docs/brand/assets/colors-typography-panel.png is excluded by !**/*.png
  • docs/brand/assets/components-panel.png is excluded by !**/*.png
  • docs/brand/assets/controls-panel.png is excluded by !**/*.png
  • docs/brand/assets/icons-illustrations-panel.png is excluded by !**/*.png
  • docs/brand/assets/mobile-panel.png is excluded by !**/*.png
  • docs/brand/assets/routing-panel.png is excluded by !**/*.png
  • docs/brand/assets/sidebar-layout-panel.png is excluded by !**/*.png
  • docs/brand/logo-icon.png is excluded by !**/*.png
  • docs/brand/logo-transparent.png is excluded by !**/*.png
  • docs/brand/logo.png is excluded by !**/*.png
  • docs/brand/reference-board.png is excluded by !**/*.png
  • web/default/bun.lock is excluded by !**/*.lock
  • web/default/public/apple-touch-icon.png is excluded by !**/*.png
  • web/default/public/docs/integrations/images/01-concept-before-after.png is excluded by !**/*.png
  • web/default/public/docs/integrations/images/02-signin.png is excluded by !**/*.png
  • web/default/public/docs/integrations/images/03-api-keys.png is excluded by !**/*.png
  • web/default/public/docs/integrations/images/04-welcome-default-key.png is excluded by !**/*.png
  • web/default/public/docs/integrations/images/05-base-url-table.png is excluded by !**/*.png
  • web/default/public/docs/integrations/images/06-style-a-settings.png is excluded by !**/*.png
  • web/default/public/docs/integrations/images/07-style-b-terminal.png is excluded by !**/*.png
  • web/default/public/docs/integrations/images/08-style-c-ccswitch.png is excluded by !**/*.png
  • web/default/public/docs/integrations/images/09-verify.png is excluded by !**/*.png
  • web/default/public/favicon-32.png is excluded by !**/*.png
  • web/default/public/favicon-64.png is excluded by !**/*.png
  • web/default/public/home-media/ai-video-product-demo.mp4 is excluded by !**/*.mp4
  • web/default/public/home-media/ai-video-scene-demo.mp4 is excluded by !**/*.mp4
  • web/default/public/logo-full.png is excluded by !**/*.png
  • web/default/public/logo.png is excluded by !**/*.png
📒 Files selected for processing (626)
  • .agents/skills/design-system/SKILL.md
  • .claude/commands/dr-pr.md
  • .claude/commands/dr-status.md
  • .claude/commands/dr-test.md
  • .dockerignore
  • .gitattributes
  • .githooks/pre-commit
  • .github/workflows/airbotix-internal.yml
  • .github/workflows/deploy.yml
  • .github/workflows/dr40-skill-integration.yml
  • .github/workflows/frontend-test.yml
  • .github/workflows/unit-test.yml
  • .gitignore
  • AGENTS.md
  • AIRBOTIX.md
  • ARCHITECTURE.md
  • CHANGELOG.md
  • CLAUDE.md
  • DEV.md
  • Dockerfile
  • Dockerfile.dev
  • LICENSE
  • NOTICE
  • PLAN.md
  • README.en.md
  • README.fr.md
  • README.ja.md
  • README.md
  • README.zh_CN.md
  • README.zh_TW.md
  • THIRD-PARTY-LICENSES.md
  • bin/.env.dr13.example
  • bin/airbotix-set-tenant-fields.sh
  • bin/run-dr13-human-test.sh
  • bin/seed-airbotix-kids.sh
  • bin/setup-dr12-test-accounts.sh
  • bin/test-dr12-kids-mode.sh
  • bin/test-dr13-human.sh
  • bin/test-dr13.sh
  • cmd/seed-skills/main.go
  • common/api_type.go
  • common/constants.go
  • common/email_template.go
  • constant/api_type.go
  • constant/channel.go
  • constant/context_key.go
  • controller/channel-test.go
  • controller/channel_test_internal_test.go
  • controller/internal_catalog.go
  • controller/internal_catalog_test.go
  • controller/misc.go
  • controller/model.go
  • controller/model_list_test.go
  • controller/payment_webhook_availability.go
  • controller/payment_webhook_availability_test.go
  • controller/purpose.go
  • controller/relay.go
  • controller/relay_cross_model.go
  • controller/relay_cross_model_test.go
  • controller/token.go
  • controller/token_test.go
  • controller/topup.go
  • controller/topup_airwallex.go
  • controller/topup_airwallex_test.go
  • controller/topup_stripe.go
  • controller/user.go
  • docker-compose.smart-router.yml
  • docs/BUSINESS-LOGIC.md
  • docs/CONNECT.md
  • docs/DEPLOYMENT.md
  • docs/DESIGN.md
  • docs/DeepRouter-BP.md
  • docs/DeepRouter-PRD-brand.md
  • docs/OPTIMIZATION-PRD.md
  • docs/PRD.md
  • docs/adr/0001-license-process-boundary.md
  • docs/adr/0002-two-layer-routing.md
  • docs/adr/0003-sidecar-topology.md
  • docs/adr/0004-channel-key-plaintext.md
  • docs/adr/0005-triple-db-compatibility.md
  • docs/adr/0006-internal-isolation.md
  • docs/adr/README.md
  • docs/brand/deeprouter-brand.css
  • docs/brand/index.html
  • docs/compliance-prd.md
  • docs/data-model.md
  • docs/kids-coverage-matrix.md
  • docs/onboarding-v2-prd.md
  • docs/skill-marketplace/R2_Change_Handoff.md
  • docs/skill-marketplace/Skill_Marketplace_PRD_Main.md
  • docs/skill-marketplace/Skill_Marketplace_PRD_v1.1_Implementation_Ready.md
  • docs/skill-marketplace/compliance/01_Safety_And_Kids_Mode.md
  • docs/skill-marketplace/compliance/02_Audit_RBAC_Privacy.md
  • docs/skill-marketplace/compliance/03_Release_Readiness_Checklist.md
  • docs/skill-marketplace/compliance/README.md
  • docs/skill-marketplace/compliance/Skill_Marketplace_Compliance.md
  • docs/skill-marketplace/tasks/00_Overview.md
  • docs/skill-marketplace/tasks/01_Functional_Requirements.md
  • docs/skill-marketplace/tasks/02_UX_Design.md
  • docs/skill-marketplace/tasks/03_Data_Model_and_API_Spec.md
  • docs/skill-marketplace/tasks/04_Analytics_and_Operations.md
  • docs/skill-marketplace/tasks/05_Security_and_NFR.md
  • docs/skill-marketplace/tasks/06_Module_Breakdown_WBS.md
  • docs/skill-marketplace/tasks/07_CTO_PRD_Review_Action_Items.md
  • docs/skill-marketplace/tasks/08_R2_Jira_Impact_Map.md
  • docs/skill-marketplace/tasks/README.md
  • docs/skill-marketplace/tasks/Skill_Marketplace_Tasks.md
  • docs/system-settings-guide.md
  • docs/tasks/airwallex-autocharge-design.md
  • docs/tasks/api-key-simple-advanced-prd.md
  • docs/tasks/auto-topup-and-topup-guidance-prd.md
  • docs/tasks/casual-journey-readiness-prd.md
  • docs/tasks/casual-ux-prd.md
  • docs/tasks/dr-57-marketplace-list-ui-prd.md
  • docs/tasks/dr-66-lifecycle-enabled-gate-prd.md
  • docs/tasks/dr-73-skill-package-entry-point-prd.md
  • docs/tasks/dr1001-token-model-whitelist-wildcard-prd.md
  • docs/tasks/dr47-skill-version-api-prd.md
  • docs/tasks/dr48-publish-skill-api-prd.md
  • docs/tasks/dr49-admin-skill-list-ui-prd.md
  • docs/tasks/dr50-admin-skill-editor-ui-prd.md
  • docs/tasks/dr52-marketplace-list-api-prd.md
  • docs/tasks/dr56-remove-from-my-skills-prd.md
  • docs/tasks/dr59-my-skills-ui-prd.md
  • docs/tasks/dr63-public-routing-api-contract-prd.md
  • docs/tasks/dr67-use-time-entitlement-check-prd.md
  • docs/tasks/dr68-routing-model-selection-prd.md
  • docs/tasks/dr69-provider-response-usage-events-prd.md
  • docs/tasks/dr70-relay-block-skill-blocked-prd.md
  • docs/tasks/dr71-non-skill-api-compatibility-regression-guard-prd.md
  • docs/tasks/dr74-event-schema-version-occurred-at-prd.md
  • docs/tasks/dr75-analytics-aggregation-api-prd.md
  • docs/tasks/dr76-ops-overview-dashboard-prd.md
  • docs/tasks/dr78-growth-surfaces-prd.md
  • docs/tasks/dr79-publish-time-skill-packaging-prd.md
  • docs/tasks/dr80-runtime-dependency-guard-prd.md
  • docs/tasks/dr82-public-api-abuse-controls-prd.md
  • docs/tasks/home-motion-interactive-prd.md
  • docs/tasks/key-setup-guide-prd.md
  • docs/tasks/load-immutable-execution-snapshot-prd.md
  • docs/tasks/onboarding-prd.md
  • docs/tasks/phase-1-admin-ui.md
  • docs/tasks/pricing-catalog-2026h1-prd.md
  • docs/tasks/pricing-page-style-refresh-prd.md
  • docs/tasks/resources-docs-prd.md
  • docs/tasks/skill-versions-table-migration-prd.md
  • docs/tasks/welcome-goal-first-prd.md
  • docs/tenant-onboarding.md
  • docs/test-results/dr56-remove-from-my-skills.txt
  • docs/test-results/dr63-public-routing-api-contract.txt
  • docs/test-results/dr66-unit-regression.txt
  • docs/test-results/dr67-use-time-entitlement-check.txt
  • docs/test-results/dr68-unit-regression.txt
  • docs/test-results/dr69-unit-regression.txt
  • docs/test-results/dr74-unit-regression.txt
  • docs/test-results/dr76-frontend-unit-regression.txt
  • docs/wiki/Architecture-Decisions.md
  • docs/wiki/Bug-Log.md
  • docs/wiki/Dev-Setup.md
  • docs/wiki/Home.md
  • docs/wiki/Sprint-1-Progress.md
  • docs/workflows/README.md
  • docs/workflows/add-provider.md
  • docs/workflows/add-user-field.md
  • docs/workflows/debug-relay-issues.md
  • docs/workflows/dr-10-chat-completions-smoke.md
  • dto/deeprouter_extension.go
  • dto/openai_request.go
  • dto/user_settings.go
  • internal/abuse/public_routing.go
  • internal/abuse/public_routing_test.go
  • internal/billing/README.md
  • internal/billing/webhook.go
  • internal/billing/webhook_extra_test.go
  • internal/billing/webhook_test.go
  • internal/kids/README.md
  • internal/kids/kids.go
  • internal/kids/kids_test.go
  • internal/policy/README.md
  • internal/policy/enforcement.go
  • internal/policy/enforcement_test.go
  • internal/policy/profile.go
  • internal/policy/profile_test.go
  • internal/quota/tenant_quota.go
  • internal/quota/tenant_quota_test.go
  • internal/skill/analytics/kids.go
  • internal/skill/api/envelope.go
  • internal/skill/api/envelope_test.go
  • internal/skill/api/pagination.go
  • internal/skill/api/pagination_test.go
  • internal/skill/availability/availability.go
  • internal/skill/availability/availability_test.go
  • internal/skill/enums/README.md
  • internal/skill/enums/enums.go
  • internal/skill/enums/enums_test.go
  • internal/skill/errcodes/README.md
  • internal/skill/errcodes/errcodes.go
  • internal/skill/errcodes/errcodes_test.go
  • internal/skill/handler/analytics.go
  • internal/skill/handler/analytics_test.go
  • internal/skill/handler/download.go
  • internal/skill/handler/download_test.go
  • internal/skill/handler/lifecycle.go
  • internal/skill/handler/seed_download_test.go
  • internal/skill/handler/skills.go
  • internal/skill/handler/skills_test.go
  • internal/skill/handler/versions.go
  • internal/skill/model/migrate.go
  • internal/skill/model/skill.go
  • internal/skill/model/skill_audit_log.go
  • internal/skill/model/skill_audit_log_test.go
  • internal/skill/model/skill_integration_test.go
  • internal/skill/model/skill_pg_mysql_test.go
  • internal/skill/model/skill_test.go
  • internal/skill/model/skill_usage_event.go
  • internal/skill/model/skill_usage_event_dr74_test.go
  • internal/skill/model/skill_usage_event_integration_test.go
  • internal/skill/model/skill_version.go
  • internal/skill/model/skill_version_integration_test.go
  • internal/skill/model/sue_event_migrate.go
  • internal/skill/model/ues_migrate.go
  • internal/skill/model/ues_pg_mysql_test.go
  • internal/skill/model/user_enabled_skill.go
  • internal/skill/model/user_enabled_skill_test.go
  • internal/skill/packageassets/assets.go
  • internal/skill/packageassets/runtime/README.md
  • internal/skill/packageassets/runtime/deeprouter_skill_runner.py
  • internal/skill/relay/blocked.go
  • internal/skill/relay/blocked_test.go
  • internal/skill/relay/context.go
  • internal/skill/relay/entitlement.go
  • internal/skill/relay/entrypoint.go
  • internal/skill/relay/executor.go
  • internal/skill/relay/executor_test.go
  • internal/skill/relay/lifecycle.go
  • internal/skill/relay/lifecycle_test.go
  • internal/skill/relay/resolver.go
  • internal/skill/relay/resolver_lifecycle_test.go
  • internal/skill/relay/resolver_snapshot_test.go
  • internal/skill/relay/resolver_test.go
  • internal/skill/relay/tier_resolution_test.go
  • internal/skill/relay/usage_events.go
  • internal/skill/relay/usage_events_test.go
  • internal/skill/seed/definitions.go
  • internal/skill/seed/demo_skills.go
  • internal/skill/seed/demo_skills_test.go
  • internal/skill/tiers/tiers.go
  • internal/skill/tiers/tiers_test.go
  • internal/smart_router_client/README.md
  • internal/smart_router_client/client.go
  • internal/smart_router_client/client_test.go
  • main.go
  • middleware/auth.go
  • middleware/distributor.go
  • middleware/distributor_skill_test.go
  • middleware/internal_token.go
  • middleware/internal_token_test.go
  • middleware/policy.go
  • middleware/policy_test.go
  • middleware/public_routing_abuse.go
  • middleware/public_routing_abuse_test.go
  • middleware/rate-limit.go
  • middleware/skill-auth.go
  • middleware/skill_auth_test.go
  • middleware/skill_distributor.go
  • middleware/smart_router.go
  • middleware/smart_router_test.go
  • middleware/tenant_quota.go
  • model/main.go
  • model/option.go
  • model/token.go
  • model/token_model_limit_test.go
  • model/topup.go
  • model/user.go
  • model/user_airbotix_test.go
  • relay/README.md
  • relay/airbotix_billing_relay_test.go
  • relay/airbotix_policy.go
  • relay/airbotix_policy_test.go
  • relay/audio_handler.go
  • relay/channel/README.md
  • relay/channel/aws/constants.go
  • relay/channel/claude/chat_completions_smoke_test.go
  • relay/channel/claude/constants.go
  • relay/channel/claude/relay-claude.go
  • relay/channel/elevenlabs/adaptor.go
  • relay/channel/elevenlabs/adaptor_test.go
  • relay/channel/elevenlabs/constant.go
  • relay/channel/elevenlabs/dto.go
  • relay/channel/elevenlabs/tts.go
  • relay/channel/openai/chat_via_responses_smoke_test.go
  • relay/channel/openai/constant.go
  • relay/channel/vertex/adaptor.go
  • relay/chat_completions_via_responses.go
  • relay/claude_handler.go
  • relay/common/stream_status.go
  • relay/compatible_handler.go
  • relay/compatible_handler_skill_test.go
  • relay/constant/relay_mode.go
  • relay/constant/relay_mode_test.go
  • relay/embedding_handler.go
  • relay/gemini_handler.go
  • relay/helper/price_test.go
  • relay/helper/stream_scanner.go
  • relay/image_handler.go
  • relay/kids_coverage_matrix_test.go
  • relay/relay_adaptor.go
  • relay/rerank_handler.go
  • relay/responses_handler.go
  • relay/websocket.go
  • router/api-router.go
  • router/internal-router.go
  • router/main.go
  • router/relay-router.go
  • router/skill-router.go
  • router/skill-router_test.go
  • scripts/check-kids-coverage-matrix.sh
  • scripts/seed-models/.env.example
  • scripts/seed-models/.gitignore
  • scripts/seed-models/README.md
  • scripts/seed-models/channels.yaml
  • scripts/seed-models/seed.py
  • scripts/seed-models/seed_options.py
  • service/airbotix_billing.go
  • service/airbotix_billing_extra_test.go
  • service/airbotix_billing_test.go
  • service/auto_topup.go
  • service/auto_topup_airwallex.go
  • service/auto_topup_airwallex_test.go
  • service/auto_topup_test.go
  • service/log_info_generate.go
  • service/text_quota.go
  • service/text_quota_test.go
  • setting/alias_setting/alias_setting.go
  • setting/alias_setting/alias_setting_test.go
  • setting/alias_setting/seed/aliases.yaml
  • setting/operation_setting/auto_topup_setting.go
  • setting/payment_airwallex.go
  • setting/ratio_setting/cache_ratio.go
  • setting/ratio_setting/group_ratio.go
  • setting/ratio_setting/model_ratio.go
  • setting/ratio_setting/ratio_consistency_test.go
  • types/error.go
  • web/default/.gitignore
  • web/default/index.html
  • web/default/package.json
  • web/default/public/docs/integrations/GUIDE.md
  • web/default/public/docs/integrations/GUIDE.zh.md
  • web/default/public/docs/integrations/botgem.md
  • web/default/public/docs/integrations/botgem.zh.md
  • web/default/public/docs/integrations/cc-switch.md
  • web/default/public/docs/integrations/cc-switch.zh.md
  • web/default/public/docs/integrations/chatbox.md
  • web/default/public/docs/integrations/chatbox.zh.md
  • web/default/public/docs/integrations/cherry-studio.md
  • web/default/public/docs/integrations/cherry-studio.zh.md
  • web/default/public/docs/integrations/claude-code.md
  • web/default/public/docs/integrations/claude-code.zh.md
  • web/default/public/docs/integrations/claude-coworks.md
  • web/default/public/docs/integrations/claude-coworks.zh.md
  • web/default/public/docs/integrations/cline.md
  • web/default/public/docs/integrations/cline.zh.md
  • web/default/public/docs/integrations/codex.md
  • web/default/public/docs/integrations/codex.zh.md
  • web/default/public/docs/integrations/copilot.md
  • web/default/public/docs/integrations/copilot.zh.md
  • web/default/public/docs/integrations/cursor.md
  • web/default/public/docs/integrations/cursor.zh.md
  • web/default/public/docs/integrations/gemini-cli.md
  • web/default/public/docs/integrations/gemini-cli.zh.md
  • web/default/public/docs/integrations/images/README.md
  • web/default/public/docs/integrations/immersive-translate.md
  • web/default/public/docs/integrations/immersive-translate.zh.md
  • web/default/public/docs/integrations/langchain.md
  • web/default/public/docs/integrations/langchain.zh.md
  • web/default/public/docs/integrations/llamaindex.md
  • web/default/public/docs/integrations/llamaindex.zh.md
  • web/default/public/docs/integrations/lobehub.md
  • web/default/public/docs/integrations/lobehub.zh.md
  • web/default/public/docs/integrations/nextchat.md
  • web/default/public/docs/integrations/nextchat.zh.md
  • web/default/public/docs/integrations/openai-sdk.md
  • web/default/public/docs/integrations/openai-sdk.zh.md
  • web/default/public/docs/integrations/opencat.md
  • web/default/public/docs/integrations/opencat.zh.md
  • web/default/public/docs/integrations/openclaw.md
  • web/default/public/docs/integrations/openclaw.zh.md
  • web/default/public/docs/integrations/opencode.md
  • web/default/public/docs/integrations/opencode.zh.md
  • web/default/public/docs/integrations/others.md
  • web/default/public/docs/integrations/others.zh.md
  • web/default/public/docs/integrations/workbuddy.md
  • web/default/public/docs/integrations/workbuddy.zh.md
  • web/default/public/docs/integrations/zed.md
  • web/default/public/docs/integrations/zed.zh.md
  • web/default/rsbuild.config.ts
  • web/default/src/assets/logo.tsx
  • web/default/src/components/balance-widget.tsx
  • web/default/src/components/casual-gates.tsx
  • web/default/src/components/command-menu.tsx
  • web/default/src/components/config-drawer.tsx
  • web/default/src/components/help-fab.tsx
  • web/default/src/components/language-switcher.tsx
  • web/default/src/components/layout/components/app-header.tsx
  • web/default/src/components/layout/components/app-sidebar.tsx
  • web/default/src/components/layout/components/authenticated-layout.tsx
  • web/default/src/components/layout/components/footer.tsx
  • web/default/src/components/layout/components/public-header.tsx
  • web/default/src/components/layout/components/system-brand.tsx
  • web/default/src/components/persona-picker-dialog.tsx
  • web/default/src/components/persona-picker-host.tsx
  • web/default/src/components/role-badge.tsx
  • web/default/src/components/ui/button.tsx
  • web/default/src/components/ui/field-hint.tsx
  • web/default/src/features/about/index.tsx
  • web/default/src/features/admin-skills/__tests__/admin-skills.test.ts
  • web/default/src/features/admin-skills/api.ts
  • web/default/src/features/admin-skills/components/admin-skill-dialogs.tsx
  • web/default/src/features/admin-skills/components/admin-skill-editor-dialog.tsx
  • web/default/src/features/admin-skills/components/admin-skill-icon.tsx
  • web/default/src/features/admin-skills/components/admin-skill-row-actions.tsx
  • web/default/src/features/admin-skills/components/admin-skills-columns.tsx
  • web/default/src/features/admin-skills/components/admin-skills-mobile-list.tsx
  • web/default/src/features/admin-skills/components/admin-skills-table.tsx
  • web/default/src/features/admin-skills/constants.ts
  • web/default/src/features/admin-skills/index.tsx
  • web/default/src/features/admin-skills/types.ts
  • web/default/src/features/auth/auth-layout.tsx
  • web/default/src/features/auth/lib/storage.ts
  • web/default/src/features/auth/sign-in/components/user-auth-form.tsx
  • web/default/src/features/auth/sign-in/index.tsx
  • web/default/src/features/auth/sign-up/components/sign-up-form.tsx
  • web/default/src/features/auth/types.ts
  • web/default/src/features/channels/components/channels-dialogs.tsx
  • web/default/src/features/channels/components/channels-primary-buttons.tsx
  • web/default/src/features/channels/components/channels-provider.tsx
  • web/default/src/features/channels/components/dialogs/channel-test-dialog.tsx
  • web/default/src/features/channels/components/dialogs/quick-import-providers-dialog.tsx
  • web/default/src/features/channels/constants.ts
  • web/default/src/features/channels/lib/channel-type-config.ts
  • web/default/src/features/channels/lib/provider-presets.ts
  • web/default/src/features/dashboard/components/overview/onboarding-status-banner.tsx
  • web/default/src/features/dashboard/components/overview/overview-dashboard.tsx
  • web/default/src/features/dashboard/components/overview/summary-cards.tsx
  • web/default/src/features/dashboard/components/topup-nudge.tsx
  • web/default/src/features/dashboard/index.tsx
  • web/default/src/features/docs/catalog.ts
  • web/default/src/features/docs/components/doc-markdown.tsx
  • web/default/src/features/docs/index.tsx
  • web/default/src/features/docs/use-doc-content.ts
  • web/default/src/features/help/faq.tsx
  • web/default/src/features/help/pricing-cheatsheet.tsx
  • web/default/src/features/home/components/hero-access-wizard.tsx
  • web/default/src/features/home/components/hero-terminal-demo.tsx
  • web/default/src/features/home/components/index.ts
  • web/default/src/features/home/components/sections/cta.tsx
  • web/default/src/features/home/components/sections/features.tsx
  • web/default/src/features/home/components/sections/hero.tsx
  • web/default/src/features/home/components/sections/how-it-works.tsx
  • web/default/src/features/home/components/sections/smart-routing.tsx
  • web/default/src/features/home/components/sections/stats.tsx
  • web/default/src/features/home/components/sections/video-examples.tsx
  • web/default/src/features/home/components/sections/voice-examples.tsx
  • web/default/src/features/home/components/smart-routing-demo.tsx
  • web/default/src/features/home/components/value-calculator.tsx
  • web/default/src/features/home/constants.ts
  • web/default/src/features/home/index.tsx
  • web/default/src/features/home/lib/icon-mapper.tsx
  • web/default/src/features/keys/api.ts
  • web/default/src/features/keys/components/api-key-brand-filter.tsx
  • web/default/src/features/keys/components/api-key-group-combobox.tsx
  • web/default/src/features/keys/components/api-key-integration-dialog.tsx
  • web/default/src/features/keys/components/api-key-mode-picker-dialog.tsx
  • web/default/src/features/keys/components/api-key-price-tier.tsx
  • web/default/src/features/keys/components/api-key-purpose-picker.tsx
  • web/default/src/features/keys/components/api-key-success-dialog.tsx
  • web/default/src/features/keys/components/api-keys-cells.tsx
  • web/default/src/features/keys/components/api-keys-columns.tsx
  • web/default/src/features/keys/components/api-keys-dialogs.tsx
  • web/default/src/features/keys/components/api-keys-empty-state.tsx
  • web/default/src/features/keys/components/api-keys-mutate-drawer.tsx
  • web/default/src/features/keys/components/api-keys-primary-buttons.tsx
  • web/default/src/features/keys/components/api-keys-table.tsx
  • web/default/src/features/keys/components/api-keys-tutorial-card.tsx
  • web/default/src/features/keys/components/data-table-row-actions.tsx
  • web/default/src/features/keys/index.tsx
  • web/default/src/features/keys/lib/api-key-form.ts
  • web/default/src/features/keys/lib/api-key-purposes-fallback.ts
  • web/default/src/features/keys/lib/index.ts
  • web/default/src/features/keys/lib/integration.ts
  • web/default/src/features/keys/test/index.tsx
  • web/default/src/features/keys/types.ts
  • web/default/src/features/marketplace/__tests__/api.test.ts
  • web/default/src/features/marketplace/__tests__/growth-surfaces.test.tsx
  • web/default/src/features/marketplace/__tests__/lib.test.ts
  • web/default/src/features/marketplace/__tests__/marketplace-events.test.tsx
  • web/default/src/features/marketplace/__tests__/my-skills-row-state.test.ts
  • web/default/src/features/marketplace/__tests__/my-skills.test.tsx
  • web/default/src/features/marketplace/api.ts
  • web/default/src/features/marketplace/components/badges.tsx
  • web/default/src/features/marketplace/components/empty-state.tsx
  • web/default/src/features/marketplace/components/error-banner.tsx
  • web/default/src/features/marketplace/components/index.ts
  • web/default/src/features/marketplace/components/lock-state-utils.ts
  • web/default/src/features/marketplace/components/lock-state.tsx
  • web/default/src/features/marketplace/components/my-skills-cells.tsx
  • web/default/src/features/marketplace/components/my-skills-filter.tsx
  • web/default/src/features/marketplace/components/my-skills-mobile-list.tsx
  • web/default/src/features/marketplace/components/my-skills-table.tsx
  • web/default/src/features/marketplace/components/new-skill-banner.tsx
  • web/default/src/features/marketplace/components/skill-card.tsx
  • web/default/src/features/marketplace/components/skill-cta.tsx
  • web/default/src/features/marketplace/download-utils.test.ts
  • web/default/src/features/marketplace/download-utils.ts
  • web/default/src/features/marketplace/index.tsx
  • web/default/src/features/marketplace/lib.ts
  • web/default/src/features/marketplace/lib/growth-surfaces.ts
  • web/default/src/features/marketplace/lib/my-skills-row-state.ts
  • web/default/src/features/marketplace/marketplace.test.tsx
  • web/default/src/features/marketplace/my-skills.tsx
  • web/default/src/features/marketplace/skill-detail.tsx
  • web/default/src/features/marketplace/types.ts
  • web/default/src/features/models/components/dialogs/quick-import-models-dialog.tsx
  • web/default/src/features/models/components/models-dialogs.tsx
  • web/default/src/features/models/components/models-primary-buttons.tsx
  • web/default/src/features/models/components/models-provider.tsx
  • web/default/src/features/models/lib/model-presets.ts
  • web/default/src/features/onboarding/index.tsx
  • web/default/src/features/onboarding/tutorials/chatbox.ts
  • web/default/src/features/onboarding/tutorials/cherry-studio.ts
  • web/default/src/features/onboarding/tutorials/claude-code.ts
  • web/default/src/features/onboarding/tutorials/code.ts
  • web/default/src/features/onboarding/tutorials/cursor.ts
  • web/default/src/features/onboarding/tutorials/lobechat.ts
  • web/default/src/features/onboarding/tutorials/registry.ts
  • web/default/src/features/playground/__tests__/growth-surfaces.test.tsx
  • web/default/src/features/playground/components/message-error.tsx
  • web/default/src/features/playground/components/playground-empty-state.tsx
  • web/default/src/features/playground/index.tsx
  • web/default/src/features/pricing/components/model-details.tsx
  • web/default/src/features/pricing/components/pricing-sidebar.tsx
  • web/default/src/features/pricing/components/pricing-toolbar.tsx
  • web/default/src/features/pricing/index.tsx
  • web/default/src/features/profile/components/language-preferences-card.tsx
  • web/default/src/features/profile/components/onboarding-preferences-card.tsx
  • web/default/src/features/profile/components/profile-extension-card.tsx
  • web/default/src/features/profile/components/sidebar-modules-card.tsx
  • web/default/src/features/profile/index.tsx
  • web/default/src/features/profile/lib/persona-presets.ts
  • web/default/src/features/profile/types.ts
  • web/default/src/features/skill-analytics/__tests__/dashboard.integration.test.tsx
  • web/default/src/features/skill-analytics/__tests__/date-range-control.test.tsx
  • web/default/src/features/skill-analytics/__tests__/metric-card.test.tsx
  • web/default/src/features/skill-analytics/__tests__/types.test.ts
  • web/default/src/features/skill-analytics/api.ts
  • web/default/src/features/skill-analytics/components/date-range-control.tsx
  • web/default/src/features/skill-analytics/components/metric-card.tsx
  • web/default/src/features/skill-analytics/index.tsx
  • web/default/src/features/skill-analytics/types.ts
  • web/default/src/features/system-settings/billing/index.tsx
  • web/default/src/features/system-settings/billing/section-registry.tsx
  • web/default/src/features/system-settings/integrations/payment-settings-section.tsx
  • web/default/src/features/system-settings/maintenance/config.ts
  • web/default/src/features/system-settings/maintenance/header-navigation-section.tsx
  • web/default/src/features/system-settings/maintenance/sidebar-modules-section.tsx
  • web/default/src/features/system-settings/site/index.tsx
  • web/default/src/features/system-settings/types.ts
  • web/default/src/features/usage-logs/components/columns/common-logs-columns.tsx
  • web/default/src/features/usage-logs/components/dialogs/details-dialog.tsx
  • web/default/src/features/usage-logs/components/usage-logs-table.tsx
  • web/default/src/features/users/components/users-mutate-drawer.tsx
  • web/default/src/features/users/lib/user-form.ts
  • web/default/src/features/users/types.ts
  • web/default/src/features/wallet/api.ts
  • web/default/src/features/wallet/components/auto-topup-card.tsx
  • web/default/src/features/wallet/components/dialogs/auto-topup-prompt-dialog.tsx
  • web/default/src/features/wallet/components/dialogs/billing-history-dialog.tsx
  • web/default/src/features/wallet/components/recharge-form-card.tsx
  • web/default/src/features/wallet/components/wallet-stats-card.tsx
  • web/default/src/features/wallet/constants.ts
  • web/default/src/features/wallet/hooks/index.ts
  • web/default/src/features/wallet/hooks/use-airwallex-payment.ts
  • web/default/src/features/wallet/index.tsx
  • web/default/src/features/wallet/lib/ui.tsx
  • web/default/src/features/wallet/types.ts
  • web/default/src/features/welcome/index.tsx
  • web/default/src/hooks/use-casual.ts
  • web/default/src/hooks/use-persona.ts
  • web/default/src/hooks/use-sidebar-config.ts
  • web/default/src/hooks/use-sidebar-data.ts
  • web/default/src/hooks/use-top-nav-links.ts
  • web/default/src/i18n/config.ts
  • web/default/src/i18n/locales/_reports/_sync-report.json
  • web/default/src/i18n/locales/_reports/fr.untranslated.json
  • web/default/src/i18n/locales/_reports/ja.untranslated.json
  • web/default/src/i18n/locales/_reports/ru.untranslated.json
  • web/default/src/i18n/locales/_reports/vi.untranslated.json
  • web/default/src/i18n/locales/_reports/zh.untranslated.json
  • web/default/src/i18n/locales/en.json
  • web/default/src/i18n/locales/fr.json
  • web/default/src/i18n/locales/ja.json
  • web/default/src/i18n/locales/ru.json
  • web/default/src/i18n/locales/vi.json
  • web/default/src/i18n/locales/zh.json
  • web/default/src/i18n/static-keys.ts
  • web/default/src/lib/constants.ts
  • web/default/src/lib/usage-estimate.ts
  • web/default/src/routeTree.gen.ts
  • web/default/src/routes/_authenticated/errors/$error.tsx
  • web/default/src/routes/_authenticated/help/faq.tsx
  • web/default/src/routes/_authenticated/help/pricing.tsx
  • web/default/src/routes/_authenticated/keys/test.tsx
  • web/default/src/routes/_authenticated/playground/index.tsx
  • web/default/src/routes/_authenticated/skill-analytics/index.tsx
  • web/default/src/routes/_authenticated/skills/$slug.tsx
  • web/default/src/routes/_authenticated/skills/admin/index.tsx
  • web/default/src/routes/_authenticated/skills/index.tsx
  • web/default/src/routes/_authenticated/skills/my/index.tsx
  • web/default/src/routes/onboarding/$slug.tsx
  • web/default/src/routes/resources/$slug.tsx
  • web/default/src/routes/resources/index.tsx
  • web/default/src/routes/welcome.tsx
  • web/default/src/styles/index.css
  • web/default/src/styles/theme.css
  • web/default/src/test-utils/setup.ts
  • web/default/vitest.config.ts

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants