Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
440 commits
Select commit Hold shift + click to select a range
f7613d7
docs: PRD v0.2 — first-topup prompt + configurable pricing shipped
hades217 Jun 19, 2026
5c05a5c
docs: design for Airwallex off-session auto-charge (#3)
hades217 Jun 19, 2026
6bf08d7
feat(airwallex-autocharge): PR-1 user columns for saved consent
hades217 Jun 19, 2026
44c742c
feat(airwallex-autocharge): PR-2 webhook replay window + parse consen…
hades217 Jun 19, 2026
9ee0c8c
feat(airwallex-autocharge): PR-3 save consent on opt-in top-up + flag
hades217 Jun 19, 2026
8e75bcf
feat(airwallex-autocharge): PR-5 quota→major-amount helper for AUD ch…
hades217 Jun 19, 2026
4be7ac1
feat(airwallex-autocharge): PR-6 off-session charge primitive (not wi…
hades217 Jun 19, 2026
173a5d4
feat(airwallex-autocharge): PR-7 provider split in MaybeAutoTopup (fl…
hades217 Jun 19, 2026
5dbef9a
feat(airwallex-autocharge): PR-8 consent lifecycle + failure backoff
hades217 Jun 19, 2026
bbc88bc
feat(airwallex-autocharge): PR-4 save-for-future wiring (backend + FE…
hades217 Jun 19, 2026
5b7c660
feat(airwallex-autocharge): PR-4 save-card checkbox (gated on operato…
hades217 Jun 19, 2026
12cb1b0
fix(about): always render built-in brand About page, ignore backend s…
hades217 Jun 19, 2026
312e73b
fix(about): always render built-in brand About page, ignore backend s…
hades217 Jun 19, 2026
35e3e7a
feat(home): interactive hero wizard + motion + brand favicon
hades217 Jun 19, 2026
d47776c
docs: update skill marketplace PRD for R2
taowis Jun 19, 2026
d268e7f
feat(home): interactive hero wizard, value calculator, brand favicon …
hades217 Jun 19, 2026
fba6d9f
Merge pull request #43 from deeprouter-ai/docs/merge-prd
pjwan2 Jun 19, 2026
2b8d600
fix(pricing): price all preset/thinking models + suffix fallback (#45)
hades217 Jun 19, 2026
3505828
feat(skill-detail): add requires_deeprouter_key + download_cta to det…
pjwan2 Jun 19, 2026
4311c9e
feat(skill-download): add GET /marketplace/skills/:id/download endpoi…
pjwan2 Jun 20, 2026
a98bfe2
Implement DR-61 marketplace UI components
taowis Jun 20, 2026
2501b2d
fix(skill-download): header injection + YAML injection + test hardeni…
pjwan2 Jun 20, 2026
a00073b
fix(skill-download): close NEW-3 gaps — group bug, version_id, enum, …
pjwan2 Jun 20, 2026
c138041
feat(skill-download): implement analytics emit + SUE table (DR-81)
pjwan2 Jun 20, 2026
e10b8bc
fix(sign-in): move legal consent above the Sign in button
hades217 Jun 20, 2026
ec234af
fix(channels): route ElevenLabs (TTS-only) channel test to /v1/audio/…
hades217 Jun 20, 2026
668057f
feat(skill-migration): wire MigrateSkillUsageEvents into main DB migr…
pjwan2 Jun 20, 2026
21c158c
fix(pricing): price thinking/preset models + suffix fallback
hades217 Jun 20, 2026
56750ab
fix(sign-in): move legal consent above the Sign in button (#49)
hades217 Jun 20, 2026
b478b6f
feat(home): interactive hero/stats polish + keys integration & setup-…
hades217 Jun 20, 2026
d236f42
Merge pull request #47 from deeprouter-ai/feature/DR-61-skill-marketp…
pjwan2 Jun 20, 2026
4422ab0
Merge remote-tracking branch 'origin/main' into feat/home-motion-inte…
hades217 Jun 20, 2026
9a74bcc
chore: resolve merge with main (i18n) + home video/voice examples WIP
hades217 Jun 20, 2026
73d37c7
feat: implement DR-54 my skills API
taowis Jun 20, 2026
0b96858
feat(skill-marketplace): seed 4 demo Skills 并补齐 publish→package→downl…
taowis Jun 20, 2026
df967e4
feat(DR-81): GET /marketplace/skills/:id/download — skill package dow…
pjwan2 Jun 20, 2026
35dbde9
Enhance homepage hero UI
hades217 Jun 20, 2026
61aad10
Merge feat/home-motion-interactive into main
hades217 Jun 20, 2026
702a29e
chore: gofmt-align brand email template const block (#54)
hades217 Jun 20, 2026
b537157
docs: AGENTS.md Rule 10 (changelog-every-change) + Rule 11 (PRD-first…
hades217 Jun 20, 2026
fa13013
fix(playground): fall back to user's own group instead of 403
hades217 Jun 20, 2026
8f86e58
fix(home): USD-first homepage copy + positioning, playground 403 fall…
hades217 Jun 20, 2026
79276a9
fix(skill): DR-64 self-review fixes — error types, perf, pass-through…
pjwan2 Jun 20, 2026
edbadca
chore: resolve merge conflicts with main (CHANGELOG + enums)
pjwan2 Jun 20, 2026
9c4a861
feat(skill): add skill versions table migration
taowis Jun 17, 2026
5b049d5
fix(skill): address skill versions migration review
taowis Jun 20, 2026
ab8a3e9
fix(skill): restrict sqlite skill version deletes
taowis Jun 20, 2026
08d173f
fix(skill): create mysql skill versions table explicitly
taowis Jun 20, 2026
ea25db5
fix(skill): validate entry_point against EntryPoint enum before stori…
pjwan2 Jun 20, 2026
7f87d41
fix(skill): restrict skill version FK updates
taowis Jun 20, 2026
45c42be
fix(skill): align skill_versions JSON schema with PRD §4.2
pjwan2 Jun 20, 2026
7574a8d
style: gofmt migrate.go and skill_version.go
pjwan2 Jun 20, 2026
f5cd275
style: gofmt compatible_handler_skill_test.go
pjwan2 Jun 20, 2026
313b2d1
feat(DR-55): Download Skill package API replaces Enable (download-as-…
frankbai2024 Jun 20, 2026
3404675
Merge pull request #36 from deeprouter-ai/feature/dr-41-skill-version…
pjwan2 Jun 20, 2026
3267514
Merge pull request #62 from deeprouter-ai/feat/dr-55-download-skill-p…
pjwan2 Jun 20, 2026
9b64695
fix(pricing): 2026-H1 catalog refresh — correct mispriced + add lates…
hades217 Jun 20, 2026
0d8918f
v1
ChiXiaoY Jun 20, 2026
e534ffe
v2_CI_test
ChiXiaoY Jun 20, 2026
a94da2f
Merge branch 'main' into feat/dr-64-relay-skill-entry
taowis Jun 20, 2026
55f1b95
Merge branch 'main' into fix/playground-group-403
taowis Jun 20, 2026
9fe8650
fix: preserve changelog entries for playground group fallback
taowis Jun 20, 2026
4da3208
Merge pull request #59 from deeprouter-ai/fix/playground-group-403
taowis Jun 20, 2026
7a531e6
docs: add pricing catalog refresh PRD
taowis Jun 20, 2026
bf2c285
Merge pull request #63 from deeprouter-ai/fix/pricing-catalog-2026h1
taowis Jun 20, 2026
2a4b0f5
Implement DR-80 runtime dependency guard
taowis Jun 20, 2026
67d34b0
fix_v1
ChiXiaoY Jun 21, 2026
6b52a68
fix(DR-64): validate skill.Status and active_version_id before relay …
pjwan2 Jun 21, 2026
8a1582f
conflicttion_resolve
ChiXiaoY Jun 21, 2026
a2e0612
conflliction_v2
ChiXiaoY Jun 21, 2026
35d5115
confliction
ChiXiaoY Jun 21, 2026
51f6b2e
Merge remote-tracking branch 'origin/main' into feat/dr-64-relay-skil…
pjwan2 Jun 21, 2026
d35a9b4
feat(R2/D-09): public routing API /v1/routing/chat/completions
pjwan2 Jun 21, 2026
052aa2a
fix(DR-64): extend pass-through guard to block partial deeprouter ext…
pjwan2 Jun 21, 2026
3ab0268
Merge pull request #40 from deeprouter-ai/feat/dr-64-relay-skill-entry
taowis Jun 21, 2026
ca47e5f
DR-62 implement skill package runtime client mock path
frankbai2024 Jun 21, 2026
fc9ff84
Merge origin/main into feat/dr-62-skill-package-runtime-client
frankbai2024 Jun 21, 2026
4ee555b
fix(pricing): pull claude-fable-5 from quick-import presets (temporar…
hades217 Jun 21, 2026
c3fed09
ci: add Unit Tests gate that runs on every PR (#70)
hades217 Jun 21, 2026
162cb38
feat(welcome): goal-first single-screen onboarding (#69)
hades217 Jun 21, 2026
a32ef50
chore(playground): remove end-user access to the playground (#60)
hades217 Jun 21, 2026
4ae5a96
feat(resources): in-app integration docs site at /resources (#73)
hades217 Jun 21, 2026
04df27e
fix(keys): remove Cherry Studio/Chatbox client config cards (#74)
hades217 Jun 21, 2026
4b2e85f
style: gofmt doc comments in internal/billing + smart_router_client (…
hades217 Jun 21, 2026
8b8b81f
chore(gofmt): format Airbotix-owned packages to satisfy CI gofmt gate
frankbai2024 Jun 21, 2026
9b09658
Merge pull request #76 from deeprouter-ai/chore/gofmt-airbotix-packages
frankbai2024 Jun 21, 2026
5e0c57a
fix(deploy): roll only new-api to :latest so an unrelated image can't…
hades217 Jun 21, 2026
3aaf730
fix(deploy): supply SMART_ROUTER_IMAGE inline so compose can interpol…
hades217 Jun 21, 2026
ce81471
fix(docs): install @tailwindcss/typography so prose styles render (#79)
hades217 Jun 21, 2026
18eced7
DR-73 add skill package analytics entry point
taowis Jun 20, 2026
3e72293
Fix DR-80 guard to validate existing work step
taowis Jun 21, 2026
f360e6f
Add DR-80 guard regression coverage
taowis Jun 21, 2026
4802351
Merge pull request #65 from deeprouter-ai/feature/dr-73-skill-package…
pjwan2 Jun 21, 2026
f333432
Merge origin/main into DR-80 guard branch
taowis Jun 21, 2026
7b5734f
Merge pull request #66 from deeprouter-ai/feat/dr80-runtime-dependenc…
pjwan2 Jun 21, 2026
e733374
feat(DR-68): server-side routing/model-selection + provider call rewrite
pjwan2 Jun 21, 2026
4e7d371
fix(DR-68): three post-review correctness fixes
pjwan2 Jun 21, 2026
5252b5e
test(DR-68): deep test suite + fix D4 gap in Responses path
pjwan2 Jun 21, 2026
b0345e3
fix(DR-68): make skill routing server-authoritative before distribution
pjwan2 Jun 21, 2026
adedc50
docs(DR-68): fix stale comment and gofmt in relay handler
pjwan2 Jun 21, 2026
a5349f8
fix(scripts): make check-kids-coverage-matrix more robust
pjwan2 Jun 21, 2026
42caadd
test(DR-68): add unit+regression test results snapshot
pjwan2 Jun 21, 2026
af5fb8c
fix(DR-68): close TOCTOU race and use common.Unmarshal per Rule 1
pjwan2 Jun 21, 2026
12838c6
fix(DR-68): close TOCTOU root cause, fix error ordering, Rule 1/2 com…
pjwan2 Jun 21, 2026
bc4e6b3
fix(DR-68): fourth-pass — Rule 8 extraction, TOCTOU test, StreamOptio…
pjwan2 Jun 21, 2026
075fd0b
style: gofmt middleware/distributor_skill_test.go
pjwan2 Jun 21, 2026
663fb54
Merge pull request #80 from deeprouter-ai/feat/dr-68-routing-model-se…
taowis Jun 21, 2026
be86711
Merge origin/main into feat/dr-62-skill-package-runtime-client
frankbai2024 Jun 21, 2026
bca2887
Merge origin/main into feat/dr-62-skill-package-runtime-client
frankbai2024 Jun 21, 2026
664fc5c
feat(DR-76): Ops Overview dashboard UI (skill analytics)
pjwan2 Jun 21, 2026
57550bf
feat(skill): bind immutable skill version snapshot at relay entry
frankbai2024 Jun 21, 2026
1228c55
test(DR-76): add frontend unit + integration tests (47 pass, 95.2% co…
pjwan2 Jun 21, 2026
d1c9f5c
docs: update DR-76 test results with exact per-file coverage numbers
pjwan2 Jun 21, 2026
a998c8f
Merge origin/main into feat/dr-65-load-immutable-execution-snapshot
frankbai2024 Jun 21, 2026
e768fa8
Merge origin/main into feat/dr_43
ChiXiaoY Jun 21, 2026
c00df15
conflict_resolve_v2
ChiXiaoY Jun 21, 2026
a47ca4c
Merge branch 'main' into feature/dr-54-my-skills-api
taowis Jun 21, 2026
6478603
DR-47 add skill version API
taowis Jun 21, 2026
afcb126
DR-82 add public routing abuse controls
taowis Jun 21, 2026
bba96a2
fix(DR-76): address PR review blockers and P1/P2 findings
pjwan2 Jun 21, 2026
676f7ff
fix(DR-47): address version review feedback
taowis Jun 21, 2026
22e1410
DR-82 document Redis and fanout risk handling
taowis Jun 21, 2026
344fea3
fix(skill): fail closed without bound skill snapshot
frankbai2024 Jun 22, 2026
fa71606
fix(DR-76): address analytics dashboard re-review
pjwan2 Jun 22, 2026
a5c9b60
fix(skill): consume bound skill version snapshot downstream
frankbai2024 Jun 22, 2026
8dbed27
Merge pull request #81 from deeprouter-ai/feat/dr-76-ops-overview-das…
taowis Jun 22, 2026
30c1aac
DR-82 scope Redis integration cleanup
taowis Jun 22, 2026
b75053b
Merge pull request #84 from deeprouter-ai/feat/dr82-public-api-abuse-…
pjwan2 Jun 22, 2026
2748ded
Merge branch 'main' into feat/dr47-skill-version-api
taowis Jun 22, 2026
ea1da5d
Merge branch 'main' into feat/dr_43
taowis Jun 22, 2026
80eb131
fix(skill): harden package runtime manifest handling
frankbai2024 Jun 22, 2026
4608d85
Merge origin/main into feat/dr-62-skill-package-runtime-client
frankbai2024 Jun 22, 2026
7a0e5ad
Merge pull request #83 from deeprouter-ai/feat/dr47-skill-version-api
pjwan2 Jun 22, 2026
ef62d4a
Merge origin/main into feature/DR-51-seed-demo-skills
taowis Jun 22, 2026
757840a
fix_v2
ChiXiaoY Jun 22, 2026
bc43d87
Merge branch 'feat/dr_43' of https://github.com/deeprouter-ai/deeprou…
ChiXiaoY Jun 22, 2026
e4a0dbd
Merge origin/main into feat/dr_43, resolve CHANGELOG and skill-router…
ChiXiaoY Jun 22, 2026
f5fa697
docs: clarify DR-65 snapshot reuse comment
taowis Jun 22, 2026
2318cac
Merge pull request #82 from deeprouter-ai/feat/dr-65-load-immutable-e…
taowis Jun 22, 2026
8ebcae1
Merge pull request #64 from deeprouter-ai/feat/dr_43
taowis Jun 22, 2026
ad03e10
fix(changelog): restore utf-8 changelog text
frankbai2024 Jun 22, 2026
602b619
fix(skill-seed): point demo Skill work step at public routing endpoin…
taowis Jun 22, 2026
cb91baa
Merge pull request #53 from deeprouter-ai/feature/DR-51-seed-demo-skills
pjwan2 Jun 22, 2026
e7be033
feat: implement DR-49 admin skill list UI
taowis Jun 22, 2026
284c364
Merge origin/main into feat/dr-62-skill-package-runtime-client
frankbai2024 Jun 22, 2026
78463bf
feat(DR-52): implement marketplace skill list API
taowis Jun 22, 2026
1e8e923
Merge pull request #67 from deeprouter-ai/feat/dr-62-skill-package-ru…
taowis Jun 22, 2026
63471a8
feat: implement DR-57 marketplace list UI
taowis Jun 22, 2026
43f1c24
DR-48 publish skill API
taowis Jun 22, 2026
ab8e3fa
DR-75 add skill analytics aggregation API
taowis Jun 22, 2026
0421c66
fix: wire DR-54 my skills route
taowis Jun 22, 2026
23ad1df
feat: refresh pricing page design
hades217 Jun 22, 2026
b1c6cb8
Merge pull request #52 from deeprouter-ai/feature/dr-54-my-skills-api
pjwan2 Jun 22, 2026
2893401
Merge branch 'main' into feat/dr52-marketplace-list-api
taowis Jun 22, 2026
7875e95
Merge branch 'main' into feat/dr75-analytics-aggregation-api
taowis Jun 22, 2026
bea144d
Merge branch 'main' into feat/dr49-admin-skill-list-ui
taowis Jun 22, 2026
9ac8e90
Merge branch 'main' into feat/dr48-publish-skill-api
taowis Jun 22, 2026
02a46e4
Merge branch 'main' into feature/dr-57-marketplace-list-ui
taowis Jun 22, 2026
98d7270
fix(DR-52): address marketplace list review feedback
taowis Jun 23, 2026
b64ad61
Merge pull request #88 from deeprouter-ai/feat/dr52-marketplace-list-api
pjwan2 Jun 23, 2026
e3cfae8
Merge branch 'main' into feat/dr49-admin-skill-list-ui
taowis Jun 23, 2026
55adf91
fix: address DR-49 review feedback
taowis Jun 23, 2026
884a139
Merge remote-tracking branch 'origin/main' into feat/dr49-admin-skill…
taowis Jun 23, 2026
696bfaf
Merge remote-tracking branch 'origin/feat/dr49-admin-skill-list-ui' i…
taowis Jun 23, 2026
df2d3f6
Merge pull request #86 from deeprouter-ai/feat/dr49-admin-skill-list-ui
pjwan2 Jun 23, 2026
aa0a0f3
DR-63 public routing API contract
taowis Jun 23, 2026
bba2c4e
Merge pull request #93 from deeprouter-ai/feat/dr63-public-routing-ap…
taowis Jun 23, 2026
c8e37d0
docs: mark DR-63 shipped
taowis Jun 23, 2026
618015c
Merge branch 'main' into feat/dr48-publish-skill-api
taowis Jun 23, 2026
a8a5d2c
Merge branch 'main' into feat/dr75-analytics-aggregation-api
taowis Jun 23, 2026
9a38150
Merge pull request #94 from deeprouter-ai/docs/dr63-ship-status
taowis Jun 23, 2026
7373a14
test: add DR-71 non-skill compatibility guard
taowis Jun 23, 2026
19016d8
DR-75 address analytics review feedback
taowis Jun 23, 2026
aac1252
feat(DR-66): lifecycle + enabled-state gate at relay entry
frankbai2024 Jun 23, 2026
13a06fb
feat(DR-78): add skill growth surfaces (#95)
taowis Jun 23, 2026
f971720
docs(DR-78): mark growth surfaces shipped (#97)
taowis Jun 23, 2026
b8c4c1f
Merge remote-tracking branch 'origin/main' into feat/dr71-compatibili…
taowis Jun 23, 2026
79cf528
Merge pull request #98 from deeprouter-ai/feat/dr71-compatibility-reg…
taowis Jun 23, 2026
2c7af7d
Merge remote-tracking branch 'origin/main' into feat/dr-66-lifecycle-…
frankbai2024 Jun 23, 2026
c35be45
fix(DR-48): restrict publish analytics metadata
taowis Jun 23, 2026
c33ef67
docs(DR-66): mark lifecycle gate PRD in eval
taowis Jun 23, 2026
573a019
Merge remote-tracking branch 'origin/main' into chore/dr66-prd-status…
taowis Jun 23, 2026
365e521
Merge pull request #96 from deeprouter-ai/feat/dr-66-lifecycle-enable…
taowis Jun 23, 2026
6402fd7
Merge branch 'main' into feature/dr-57-marketplace-list-ui
taowis Jun 23, 2026
204eb1c
Merge branch 'main' into feat/dr75-analytics-aggregation-api
taowis Jun 23, 2026
31d50d2
Merge branch 'main' into feat/dr48-publish-skill-api
taowis Jun 23, 2026
f65ac73
fix: address DR-57 marketplace review blockers
taowis Jun 23, 2026
c4220aa
fix(DR-48): guard publish state transition
taowis Jun 23, 2026
96deb5e
feat/DR-46_create-skill_draft_api (#92)
ChiXiaoY Jun 23, 2026
72748b5
feat(skill-analytics): persist event schema_version + occurred_at UTC…
frankbai2024 Jun 23, 2026
373c234
fix: address DR-57 marketplace filter review
taowis Jun 23, 2026
2c44b1d
Merge branch 'main' into feature/dr-57-marketplace-list-ui
taowis Jun 23, 2026
0570407
Merge branch 'main' into feat/dr48-publish-skill-api
taowis Jun 23, 2026
706658c
feat(skill-marketplace): add skill detail download UI
frankbai2024 Jun 23, 2026
d1614e6
Merge branch 'main' into feat/dr75-analytics-aggregation-api
taowis Jun 23, 2026
c19b65f
docs(DR-74): mark event schema PRD in eval
taowis Jun 23, 2026
1915b26
Merge pull request #100 from deeprouter-ai/feat/dr-74-event-schema-ve…
taowis Jun 23, 2026
3fbd0a7
Merge branch 'main' into feature/dr-57-marketplace-list-ui
taowis Jun 23, 2026
be07b79
Merge branch 'main' into feat/dr48-publish-skill-api
taowis Jun 23, 2026
6a184ed
Merge branch 'main' into feat/dr75-analytics-aggregation-api
taowis Jun 23, 2026
003816e
DR-75 add analytics freshness guards
taowis Jun 24, 2026
a7b4e63
DR-56 add remove from my skills (#102)
taowis Jun 24, 2026
ff31c4e
fix: resolve DR-57 marketplace review blockers
taowis Jun 24, 2026
5ee6bed
DR-75 enforce ordered analytics funnel
taowis Jun 24, 2026
f64e626
merge main into DR-57 marketplace branch
taowis Jun 24, 2026
ddabecb
fix: restore marketplace CTA matrix
taowis Jun 24, 2026
4b253f1
Merge pull request #89 from deeprouter-ai/feature/dr-57-marketplace-l…
pjwan2 Jun 24, 2026
52d77be
Merge branch 'main' into feat/dr75-analytics-aggregation-api
taowis Jun 24, 2026
05a7533
Merge branch 'main' into feat/dr48-publish-skill-api
taowis Jun 24, 2026
e667aec
Merge pull request #91 from deeprouter-ai/feat/dr75-analytics-aggrega…
pjwan2 Jun 24, 2026
4412ccf
feat(skill): emit skill_blocked for relay block paths
frankbai2024 Jun 24, 2026
730f693
docs(changelog): preserve main history in dr70 entries
frankbai2024 Jun 24, 2026
aab7c8d
Merge branch 'main' into feat/dr48-publish-skill-api
taowis Jun 24, 2026
f2863bb
docs(skill): align dr70 prd and mapping tests
frankbai2024 Jun 24, 2026
cc77f7e
fix(DR-48): validate publish version snapshots
taowis Jun 24, 2026
a3b5e37
docs(changelog): fix dr70 follow-up entry encoding
frankbai2024 Jun 24, 2026
9b091f7
docs: mark DR-71 compatibility guard shipped (#104)
taowis Jun 24, 2026
c5cebae
Merge origin/main into feat/dr-70-relay-block-skill-blocked
frankbai2024 Jun 24, 2026
1e0a695
Merge branch 'main' into feat/dr48-publish-skill-api
taowis Jun 24, 2026
8baf650
Merge pull request #90 from deeprouter-ai/feat/dr48-publish-skill-api
pjwan2 Jun 24, 2026
c198f62
DR-67 add use-time skill entitlement gate
taowis Jun 24, 2026
f7ff63a
Merge origin/main into DR-67 branch
taowis Jun 24, 2026
21a93ab
DR-79 add publish-time skill packages
taowis Jun 24, 2026
c8decea
DR-67 update post-merge test results
taowis Jun 24, 2026
e45acc3
Merge pull request #103 from deeprouter-ai/feat/dr-70-relay-block-ski…
taowis Jun 24, 2026
28cc558
Merge remote-tracking branch 'origin/main' into feat/dr79-publish-tim…
taowis Jun 24, 2026
d8e7fbf
Merge pull request #106 from deeprouter-ai/feat/dr79-publish-time-ski…
taowis Jun 24, 2026
56600e8
Merge origin/main into DR-67 branch
taowis Jun 24, 2026
50d83a0
DR-67 update latest main test results
taowis Jun 24, 2026
054a9df
Merge pull request #105 from deeprouter-ai/feat/dr67-use-time-entitle…
taowis Jun 24, 2026
b7f8264
DR-77 add per-skill analytics table (#107)
taowis Jun 24, 2026
4d0add4
Revert "DR-77 add per-skill analytics table (#107)" (#108)
taowis Jun 24, 2026
b39faaa
DR-69 emit skill usage success events
taowis Jun 22, 2026
e1b1019
fix(DR-69): cover responses usage events
taowis Jun 24, 2026
01f7665
Merge pull request #87 from deeprouter-ai/feat/dr69-usage-events
pjwan2 Jun 24, 2026
8f601f5
Revert "Merge pull request #106 from deeprouter-ai/feat/dr79-publish-…
taowis Jun 24, 2026
13d9388
Merge remote-tracking branch 'origin/main' into fix/revert-dr79-publi…
taowis Jun 24, 2026
c85f91b
Merge pull request #109 from deeprouter-ai/fix/revert-dr79-publish-ti…
taowis Jun 24, 2026
08040d1
Revert "Merge pull request #109 from deeprouter-ai/fix/revert-dr79-pu…
taowis Jun 24, 2026
8bd0fa5
DR-79 build packages on version activation
taowis Jun 24, 2026
41a14e1
Merge pull request #111 from deeprouter-ai/fix/dr79-activation-packag…
taowis Jun 24, 2026
5ca7c10
feat(DR-50): add admin skill editor UI
taowis Jun 24, 2026
3aa005b
merge main into DR-50 admin skill editor UI
taowis Jun 24, 2026
eac9ad8
feat(DR-59): My Skills management UI (table + filters + row states + …
frankbai2024 Jun 24, 2026
6dab52f
Merge pull request #112 from deeprouter-ai/feat/dr50-admin-skill-edit…
taowis Jun 24, 2026
29ca5f9
Merge remote-tracking branch 'origin/main' into feat/dr-59-my-skills-ui
frankbai2024 Jun 24, 2026
91db2c2
docs(DR-59): add task PRD (AGENTS.md Rule 11) + changelog
frankbai2024 Jun 24, 2026
cb46d2f
docs(DR-59): tighten task PRD (FR-U6 merge-condition, empty-state cop…
frankbai2024 Jun 24, 2026
bd39d4c
Merge pull request #113 from deeprouter-ai/feat/dr-59-my-skills-ui
taowis Jun 24, 2026
ae0ac4c
fix(DR-1001): support wildcard in token "Allowed models" whitelist
taowis Jun 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
107 changes: 107 additions & 0 deletions .agents/skills/design-system/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
---
name: design-system
description: >-
DeepRouter visual design system — MANDATORY for any UI / frontend / visual
change in web/default. Use whenever you create or edit React components, pages,
CSS, Tailwind classes, colors, typography, spacing, buttons, inputs, badges,
cards, modals, layout, hero/marketing sections, or any user-visible surface.
Loads the canonical color tokens, type scale, component specs, and the hard
"do not" rules from docs/DESIGN.md so the change matches the brand instead of
drifting into a generic enterprise look.
---

# DeepRouter Design System (enforced)

**Canonical source:** [`docs/DESIGN.md`](../../../docs/DESIGN.md). Visual board:
`docs/brand/index.html`. CSS reference: `docs/brand/deeprouter-brand.css`.
Brand PRD: `docs/DeepRouter-PRD-brand.md`.

> ⚠️ DESIGN.md is layered. **§0–5 is canonical** (Plus Jakarta Sans, 7px radius,
> the `:root` token map). **§6–9 is "Historical Inspiration"** — it references an
> older "Camera Plain" font, 6px radius, and negative letter-spacing that
> **contradict** the canonical part. On any conflict, **§0–5 wins.** Don't copy
> the Camera Plain / negative-tracking specifics from §7/§9 into production.

This skill is the gate for **any change a user can see** in `web/default/`. Read
it before writing the component; match these tokens exactly; prefer existing
Tailwind/theme tokens and the `.dr-*` classes over one-off hex.

## Non-negotiables (the rules people break)

1. **Cream is the canvas, never pure white.** Page background `#F7F4ED`. Raised
surfaces (cards, inputs, popovers, modals) use Soft White `#FCFBF8`. A
`#FFFFFF` full-page background is wrong.
2. **Charcoal, not black.** Text & dark buttons use `#1C1C1C`, secondary text `#5F5F5D`.
3. **Borders, not shadows, contain cards.** Use a `#ECEAE4` border. Avoid heavy box-shadows.
4. **AI Blue `#2563FF` is an accent, not décor.** Use it for primary AI action,
focus ring, selected state, routing lines, charts — never as a large
background, gradient, glassy orb, or blue-purple wash.
5. **Two weights only: 400 (body/UI) and 600 (headings).** No 700/bold. Hierarchy
comes from size + spacing, not weight.
6. **Normal letter-spacing in product UI.** (The negative-tracking advice is from
the historical §7/§9 — ignore it for canonical surfaces.)
7. **Tabular numbers** for metrics, quotas, prices, latency.
8. **Use theme tokens / `.dr-*` classes, not raw hex** in components where possible.
9. **Logo is PNG, never redrawn as SVG.** Don't recolor/gradient/shadow the mark.
Avatars: DiceBear `notionists` only (line-art), saved locally — never
`avataaars`/`bottts`/monogram circles.

## Color tokens (canonical)

| Token | Hex | Use |
|---|---|---|
| Cream | `#F7F4ED` | page background |
| Soft White | `#FCFBF8` | cards, inputs, modals |
| Charcoal | `#1C1C1C` | primary text, dark buttons, logo black |
| Muted | `#5F5F5D` | secondary text, captions |
| Border | `#ECEAE4` | dividers, card borders |
| AI Blue | `#2563FF` | primary AI action, focus, selected, routing |
| Stable Green | `#148F5F` | healthy / success |
| Warning Orange | `#C76812` | warning / quota pressure |
| Error Red | `#C9362B` | failure / destructive |

Frontend `:root` mapping (DESIGN.md §5):

```css
--background:#f7f4ed; --foreground:#1c1c1c; --card:#fcfbf8; --card-foreground:#1c1c1c;
--primary:#1c1c1c; --primary-foreground:#fcfbf8; --accent:#2563ff;
--muted-foreground:#5f5f5d; --border:#eceae4; --input:#eceae4; --ring:#2563ff;
```

## Typography

Font: **Plus Jakarta Sans** (stack falls back to `Public Sans`, which is already
bundled). Type scale: H1 56/64 · H2 40/48 · H3 28/36 · H4 20/24 · Body 16/24 ·
Small 14/20 · Caption 12/16. Headings weight 600; everything else 400. Dashboard
labels 12–13px. No oversized hero type inside cards/modals/tables.

## Component specs

- **Buttons** — Primary `#1C1C1C` bg / `#FCFBF8` text · AI Action `#2563FF` bg /
white · Secondary `#FCFBF8` / `#1C1C1C` with `rgba(28,28,28,.18)` border · Ghost
transparent. Height 40–42px, **radius 7px**, padding 14–18px, font 14/20 weight
500–600, focus ring `0 0 0 3px rgba(37,99,255,.14)`.
- **Inputs** — height 42px, radius 7px, bg `#FCFBF8`, border `rgba(28,28,28,.14)`,
focus border `#2563FF` + ring `rgba(37,99,255,.14)`.
- **Badges** — radius 999px (pill), height 28–30px, font 14 weight 600; tinted
bg+text per state (active=blue, beta=charcoal, stable=green, warning=orange, error=red).
- Pills (999px radius) are for badges / icon-action toggles only — **not** for
rectangular buttons (those are 7px).

## `.dr-*` CSS reference classes (in `docs/brand/deeprouter-brand.css`)

`.dr-surface .dr-card .dr-panel` · `.dr-heading-{1,2,3} .dr-body .dr-small
.dr-caption` · `.dr-button{,-primary,-ai,-secondary,-ghost}` · `.dr-input
.dr-select` · `.dr-badge{,-active,-beta,-stable,-warning,-error}` · `.dr-metric-card
.dr-table .dr-sidebar .dr-nav-item .dr-modal`. Use these for prototypes/docs and as
the spec when building the React equivalents.

## Before you finish a UI change — checklist

- [ ] Background cream `#F7F4ed`, not white; raised surfaces soft-white.
- [ ] Cards use `#ECEAE4` borders, not box-shadows.
- [ ] AI Blue only as accent (action/focus/selected/routing), no large gradients/orbs.
- [ ] Only weights 400 / 600; no bold-700.
- [ ] Rectangular buttons/inputs at 7px radius; pills only for badges/icon toggles.
- [ ] Colors come from theme tokens / `.dr-*`, not stray hex.
- [ ] If it's a customer-facing surface, you ALSO followed CLAUDE.md §0 + the business PRDs (design ≠ exemption from the casual-user rules).
32 changes: 32 additions & 0 deletions .claude/commands/dr-pr.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
Help create a clean PR for the current branch. Follow this checklist before opening the PR.

## Pre-PR checklist

1. **Run tests** — confirm all Go tests pass:
```
docker run --rm -v "$(pwd):/app" -w /app golang:1.25-alpine sh -c 'go test ./relay/ ./internal/... 2>&1 | grep -E "^(ok|FAIL)"'
```
All lines must say `ok`. If any say `FAIL`, stop and fix before proceeding.

2. **Check diff** — run `git diff main...HEAD` and summarise what changed. Flag any:
- Accidental debug prints or TODOs left in
- Files that shouldn't be in this PR (seed scripts, .env, temp files)
- Missing test for the change

3. **Check ordering bug** — if the PR touches `relay/*_handler.go`, verify that for each handler that calls `applyAirbotixPolicy*`, the call comes **BEFORE** `helper.ModelMappedHelper`. This ordering is critical for kids_mode whitelist correctness.

4. **Push branch** if not already pushed:
```
git push -u origin <branch-name>
```

5. **Create the PR via GitHub MCP** — use the create_pull_request tool with:
- title: `type(scope): short description` (e.g. `fix(relay): apply policy before model mapping`)
- base: `main`
- body sections: Problem, Fix, Verification table (test cases + results)
- draft: false

## Reminders
- One concern per PR. Don't bundle unrelated fixes.
- Co-author line in description: `Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>`
- After PR is created, share the URL with the user.
39 changes: 39 additions & 0 deletions .claude/commands/dr-status.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
Report the current DeepRouter project status. Do the following steps in order:

1. Run `git log --oneline -8` to show recent commits.
2. Run `git branch` to list local branches and note any active feature/fix branches.
3. Run `git status --short` to show any unstaged or uncommitted changes.
4. Read `AIRBOTIX.md` (the "What we customise" table) to get the Airbotix-specific package status.
5. Read `PLAN.md` if it exists, and note the current phase.

Then produce a concise report in this format:

---
## DeepRouter Status — [today's date]

### Recent commits (last 8)
[list]

### Active branches
[list any non-main branches]

### Uncommitted changes
[list or "none"]

### Sprint 1 ticket status (from memory + code)
| Ticket | Title | Status |
|--------|-------|--------|
| DR-6 | internal/billing webhook dispatcher | ✅ Done |
| DR-7 | internal/kids hard constraints | ✅ Done |
| DR-8 | internal/policy decision engine | ✅ Done |
| DR-9 | e2e: same endpoint, different key → different policy | 🟡 PR open, fix incomplete (claude/gemini/responses handlers still have ordering bug) |
| DR-13 | Quota check RPM/TPM + staging deploy | ⏳ Not started |

### Open PRs / branches
[describe any open branches/PRs]

### What needs doing next
[top 1-2 items]
---

Be specific and honest. Do not mark anything Done if it has known gaps.
54 changes: 54 additions & 0 deletions .claude/commands/dr-test.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
Run the standard DeepRouter policy e2e verification (DR-9 test suite).

The local dev stack runs at http://localhost:3000.

## What you need first

Ask the user for two API tokens if not already provided:
- ROOT_KEY: a token belonging to a user with `kids_mode=false`, `policy_profile=passthrough`
- KIDS_KEY: a token belonging to a user with `kids_mode=true`, `policy_profile=kid-safe`

The Groq channel must have `model_mapping`: `gpt-4o-mini` → `llama-3.1-8b-instant`.

## Run 3 test cases

For each test, run the curl command and record the HTTP status + first few words of the response content.

**TEST 1 — root key, non-whitelisted model (should PASS)**
```
curl -s -w "\nHTTP %{http_code}" http://localhost:3000/v1/chat/completions \
-H "Authorization: Bearer $ROOT_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"llama-3.1-8b-instant","messages":[{"role":"user","content":"Say hello in 5 words"}],"max_tokens":20}'
```
Expected: HTTP 200, content with words.

**TEST 2 — kids key, non-whitelisted model (should BLOCK)**
```
curl -s -w "\nHTTP %{http_code}" http://localhost:3000/v1/chat/completions \
-H "Authorization: Bearer $KIDS_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"llama-3.1-8b-instant","messages":[{"role":"user","content":"Say hello in 5 words"}],"max_tokens":20}'
```
Expected: HTTP 400, error mentioning `model_not_eligible_for_kids_mode`.

**TEST 3 — kids key, whitelisted model that maps to non-whitelisted upstream (should PASS)**
```
curl -s -w "\nHTTP %{http_code}" http://localhost:3000/v1/chat/completions \
-H "Authorization: Bearer $KIDS_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"gpt-4o-mini","messages":[{"role":"user","content":"Say hello in 5 words"}],"max_tokens":20}'
```
Expected: HTTP 200, content with words (channel remaps gpt-4o-mini → llama-3.1-8b-instant internally, but whitelist check sees the original name).

## Report

After running all 3 tests, report a table:

| Test | Key | Model sent | Expected | Result | Pass? |
|------|-----|------------|----------|--------|-------|
| 1 | root | llama-3.1-8b-instant | 200 | ... | ✅/❌ |
| 2 | kids | llama-3.1-8b-instant | 400 | ... | ✅/❌ |
| 3 | kids | gpt-4o-mini | 200 | ... | ✅/❌ |

If any test fails, diagnose why (check container logs: `docker logs new-api-dev --tail 30`).
2 changes: 2 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,6 @@ docs
.eslintcache
.gocache
/web/node_modules
web/default/node_modules
web/classic/node_modules
!THIRD-PARTY-LICENSES.md
3 changes: 2 additions & 1 deletion .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
*.yml text eol=lf
*.toml text eol=lf
*.md text eol=lf
*.py text eol=lf

# JavaScript/TypeScript files
*.js text eol=lf
Expand Down Expand Up @@ -39,4 +40,4 @@ web/** linguist-vendored

# Un-vendor core frontend source to keep JavaScript visible in language stats
web/src/components/** linguist-vendored=false
web/src/pages/** linguist-vendored=false
web/src/pages/** linguist-vendored=false
53 changes: 53 additions & 0 deletions .githooks/pre-commit
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
#!/usr/bin/env bash
# Pre-commit secret scanner — blocks commits containing credential patterns.
#
# Patterns caught:
# sk-[A-Za-z0-9]{30,} DeepRouter / OpenAI-style bearer tokens
# sk-ant-... Anthropic API keys
# AIzaSy... Google / Gemini API keys
# AKIA... AWS access key IDs
#
# To bypass in a genuine emergency (e.g. committing a test fixture with a
# clearly-fake token):
# git commit --no-verify ← requires explicit flag, not a default

set -euo pipefail

RED='\033[0;31m'
YELLOW='\033[1;33m'
RESET='\033[0m'

# Patterns: each entry is "LABEL|REGEX"
PATTERNS=(
"DeepRouter/OpenAI bearer token|sk-[A-Za-z0-9]{30,}"
"Anthropic API key|sk-ant-[A-Za-z0-9\-]{20,}"
"Google/Gemini API key|AIzaSy[A-Za-z0-9\-_]{30,}"
"AWS access key ID|AKIA[A-Z0-9]{16}"
)

STAGED=$(git diff --cached --name-only --diff-filter=ACM 2>/dev/null)
[[ -z "$STAGED" ]] && exit 0

FOUND=0
for entry in "${PATTERNS[@]}"; do
label="${entry%%|*}"
regex="${entry##*|}"
matches=$(git diff --cached -U0 -- $STAGED 2>/dev/null \
| grep '^+' \
| grep -v '^+++' \
| grep -E "$regex" || true)
if [[ -n "$matches" ]]; then
echo -e "${RED}[SECRET SCAN] Potential credential blocked: ${label}${RESET}"
echo -e "${YELLOW}${matches}${RESET}"
FOUND=1
fi
done

if [[ $FOUND -ne 0 ]]; then
echo ""
echo -e "${RED}Commit blocked. Remove the credential and use an environment variable instead.${RESET}"
echo "To bypass (only for clearly fake test fixtures): git commit --no-verify"
exit 1
fi

exit 0
Loading
Loading