puro design
3a16b3ecde
docs: archive Claude Design v2 output [CI SKIP]
...
CI / test (push) Has been cancelled
CI / golangci-lint (push) Has been cancelled
Security Scan / backend-security (push) Has been cancelled
Security Scan / frontend-security (push) Has been cancelled
10 HTML pages + puro.css + HANDOFF.md + 2 images (~810KB total).
Reference artifacts for Stage 3 Vue 3 translation.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-19 18:05:27 +08:00
puro design
02173c8d7e
docs: spec v2 + design drafts archive [CI SKIP]
...
Stage 2 完成(Claude Design 产出 10 页)后的 spec 更新:
- 范围决策:路径 B 分层交付(本期做 Landing/Login/Register/Docs 4 页 + puro.css 落地;二期换皮 Dashboard/API Keys;不做 Binding/Pricing)
- Landing 文案精修:剔除 Pricing/FAQ/CTA banner;Hero CTA 改「登录」+「联系咨询」;微文案对齐真实能力
- Footer 删掉「套餐(暂隐)」
- 新增 §4.5 Docs 页(公开 /docs,精简版)
- §5 brief 标记为历史存档(Stage 2 已完成)
- §5.5 Stage 2 产出清单(10 个文件 + 本期用/二期/不做)
- 归档 docs/design-drafts/v2/ 全部产出(含 puro.css、HANDOFF.md、10 个 HTML)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-19 18:05:14 +08:00
puro design
332d46cde7
docs: PURO AI landing+auth redesign spec [CI SKIP]
...
CI / test (push) Has been cancelled
CI / golangci-lint (push) Has been cancelled
Security Scan / backend-security (push) Has been cancelled
Security Scan / frontend-security (push) Has been cancelled
Stage 1 brainstorm 产出:
- 风格方向:暗黑科技(cyan/purple on slate-950)
- Landing 6 sections + 完整中文文案
- Auth 左右分栏 + "5→1" 数字对比叙事
- 给 claude.ai/design 的 brief(可直接复制)
- Stage 3 实施约束(Vue 3 + Tailwind + i18n 对齐)
下一步:user 拿 brief 到 claude.ai/design 出视觉稿(Stage 2)。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-19 16:23:20 +08:00
puro ci
ac3417a964
docs: add VPS deployment + CI notes [CI SKIP]
...
CI / test (push) Has been cancelled
CI / golangci-lint (push) Has been cancelled
Security Scan / backend-security (push) Has been cancelled
Security Scan / frontend-security (push) Has been cancelled
综合归档 ai.puro.im 部署记录:
- VPS 架构 + CI 流程图
- 初次手工部署流程(对应 LOCAL_SETUP_NOTES 的线上版)
- Drone pipeline 细节 + skip-CI 约定
- 7 个踩过的坑 + 解法(Setup wizard port/权限、账号池 3 件套、run_mode、balance 缓存、/setup 路由)
- 当前 snapshot、常用运维命令、从头重来流程
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-19 13:05:30 +08:00
puro ci
9c34e9619c
ci: trigger first Drone build
continuous-integration/drone/push Build is passing
CI / test (push) Has been cancelled
CI / golangci-lint (push) Has been cancelled
Security Scan / backend-security (push) Has been cancelled
Security Scan / frontend-security (push) Has been cancelled
2026-04-19 12:29:14 +08:00
puro ci
f431b2e2ff
ci: add Drone pipeline for ai.puro.im deployment
...
CI / test (push) Has been cancelled
CI / golangci-lint (push) Has been cancelled
Security Scan / backend-security (push) Has been cancelled
Security Scan / frontend-security (push) Has been cancelled
- .drone.yml: pnpm build frontend → go build backend → docker compose up
- .ci/Dockerfile: distroless:nonroot runtime image
- host state (/opt/sub2api/{config.yaml,compose,volumes}) stays untouched
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-19 12:26:37 +08:00
Wesley Liddick
6c73b6212c
Merge pull request #1734 from touwaeriol/docs/payment-recommend-kyren-topup
...
CI / test (push) Has been cancelled
CI / golangci-lint (push) Has been cancelled
Security Scan / backend-security (push) Has been cancelled
Security Scan / frontend-security (push) Has been cancelled
docs(payment): add Kyren Topup as international EasyPay provider option
2026-04-18 18:33:14 +08:00
erio
0c538a584f
docs: note Kyren Topup $200 account fee waived via referral link
2026-04-18 14:48:47 +08:00
erio
6ae1cc8f3f
docs: use 易支付 in Chinese coexistence note
2026-04-18 14:45:25 +08:00
erio
37123cef8f
docs(payment): add Kyren Topup as international EasyPay provider option
...
Restructure the EasyPay recommendation block to present two options side
by side so users can pick by funding channel and settlement currency:
- Domestic / CNY — ZPay: official Alipay/WeChat API with 1.6% fee and
T+1 automatic settlement (existing recommendation, expanded with fee
and settlement details).
- International / USDT or USD — Kyren Topup (https://kyren.top ): global
payment stack supporting WeChat Pay and Alipay with local-currency
checkout, USD settlement, and USDT/USD withdrawal. Fees: WeChat 2%,
Alipay 2.5%, withdrawal 0.1% ($40 min / $150 max). Fills the gap for
users who cannot use domestic Chinese channels or tolerate Stripe's
6%+ fees.
Both recommendations share a single disclaimer at the end. The Chinese
heading uses "易支付" while the English one keeps "EasyPay".
2026-04-18 14:42:55 +08:00
github-actions[bot]
6cfdf4ec05
chore: sync VERSION to 0.1.114 [skip ci]
2026-04-17 02:51:18 +00:00
Wesley Liddick
358ff6a608
Merge pull request #1683 from FjlI5/dev-main
...
fix:修复上游账号为OpenAI API key时Claude Code调用缓存率低的问题
2026-04-17 10:28:12 +08:00
Wesley Liddick
41fbdba104
Merge pull request #1687 from touwaeriol/refactor/upstream-response-limit-dedup
...
refactor: extract ReadUpstreamResponseBody to deduplicate response read + too-large handling
2026-04-17 10:19:14 +08:00
Wesley Liddick
c22d11cedd
Merge pull request #1702 from StarryKira/fix/outbox-watermark-context-dedup-1691
...
fix: fix outbox watermark context expiry and add in-batch group rebuild dedup
2026-04-17 10:18:56 +08:00
shaw
5d586a9f3a
fix: 上游返回 KYC 身份验证要求时停止账号调度
2026-04-17 10:17:50 +08:00
shaw
a789c8c4c7
feat: 支持opus-4.7
2026-04-17 09:37:25 +08:00
Elysia
697c41a3f6
fix: create fresh context per watermark write retry attempt
...
Each retry in the SetOutboxWatermark loop now gets its own 5s context.
Previously a shared context could already be expired when the second or
third attempt ran, making the retries pointless.
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com >
2026-04-16 20:41:40 +08:00
Elysia
e44baa1094
fix: fix outbox watermark context expiry and add in-batch group rebuild dedup
...
Fixes #1691
- pollOutbox() reused a 10s context for SetOutboxWatermark after event
processing could take much longer, causing "outbox watermark write
failed: context deadline exceeded". The watermark never advanced so
the same 200 events were reprocessed every poll cycle, spiking CPU.
Now uses an independent 5s context with up to 3 retries (200ms apart).
- When multiple Codex accounts sharing the same 21-22 groups are all
rate-limited in quick succession, each account_changed event triggered
redundant bucket rebuild attempts for the same groups. Introduce
batchSeenKey{groupID, platform} and thread a seen map through the
handler chain; rebuildBucketsForPlatform skips (group, platform) pairs
already rebuilt within the same poll batch (~80% fewer rebuild calls in
the 5-accounts-same-groups scenario).
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com >
2026-04-16 19:09:40 +08:00
Wesley Liddick
e6e73b4f52
Merge pull request #1690 from KnowSky404/fix/ws-codex-scheduler-cache-1662
...
fix: preserve openai ws flags in scheduler cache
2026-04-16 17:21:32 +08:00
shaw
7ea8e7e667
chore: update sponsors
2026-04-16 17:19:32 +08:00
shaw
a55ead5ea8
chore: remove empty dir Antigravity-Manager
2026-04-16 16:42:40 +08:00
KnowSky404
836092a666
fix: restore ctx pool ws mode option in account ui
2026-04-16 02:13:04 +00:00
KnowSky404
3944b3d216
fix: preserve openai ws flags in scheduler cache
2026-04-16 02:01:50 +00:00
erio
10699eeb34
refactor: extract ReadUpstreamResponseBody to deduplicate upstream response read + too-large error handling
...
Consolidates 9 call sites of resolveUpstreamResponseReadLimit + readUpstreamResponseBodyLimited + ErrUpstreamResponseBodyTooLarge error handling into a single ReadUpstreamResponseBody function with TooLargeWriter callback for API-format-specific error responses (Anthropic, OpenAI, countTokens).
2026-04-16 01:53:22 +08:00
fjl5
6c89d8d35c
add prompt_cache_key injection for messages→responses
2026-04-15 23:56:56 +08:00
github-actions[bot]
be7551b9f4
chore: sync VERSION to 0.1.113 [skip ci]
2026-04-15 09:34:24 +00:00
Wesley Liddick
70d0569f08
Merge pull request #1668 from tyqy12/main
...
修复 OpenAI 账号限流回流误判:7d 窗口可用时不因 5h 窗口为 0 回写 429
2026-04-15 16:48:48 +08:00
Wesley Liddick
1db32d692b
Merge pull request #1666 from touwaeriol/feat/account-cost-display
...
feat(usage): add account cost display to admin dashboard and usage pages
2026-04-15 16:43:07 +08:00
Wesley Liddick
8fd29082c0
Merge pull request #1663 from touwaeriol/fix/test-dialog-close-during-stream
...
fix(ui): allow closing test dialog during active SSE stream
2026-04-15 16:40:40 +08:00
Wesley Liddick
9bf079b725
Merge pull request #1655 from touwaeriol/feat/payment-fee-multiplier
...
feat(payment): balance recharge multiplier and fee rate
2026-04-15 16:40:14 +08:00
erio
e180dd0710
fix(usage): remove label text from inline account cost, keep orange color
2026-04-15 16:09:58 +08:00
erio
a7dd535d47
fix(usage): show account cost inline under cost column, remove separate column
...
- Cost cell: change gray "A $xxx" to orange "成本 $xxx" with i18n
- Remove standalone account_cost column from column settings (redundant)
2026-04-15 15:59:51 +08:00
erio
db27e8f000
feat(usage): add account cost to breakdown sub-table and admin usage log
...
- UserBreakdownItem: add AccountCost field + SQL aggregation
- UserBreakdownSubTable: add orange account cost column
- Admin usage table: add account_cost column (after cost, default visible)
- Column settings: add account_cost toggle option
2026-04-15 15:40:40 +08:00
Wesley Liddick
7451b6f9ae
修复 OpenAI 账号限流回流误判:7d 窗口可用时不因 5h 窗口为 0 回写 429
2026-04-15 15:29:52 +08:00
erio
e0b12b7512
fix(usage): put cost label before value in usage stats card
2026-04-15 15:02:21 +08:00
erio
22680dc602
test(usage): add unit tests for account_cost and fix gofmt
...
- Fix mock for GetModelStatsWithFilters: add account_cost column
- Add assertion: GetStatsWithFilters always returns TotalAccountCost
- New test: GetModelStatsAccountCostColumn verifies scan of AccountCost
- New test: GetGroupStatsAccountCostColumn verifies scan of AccountCost
- New test: GetStatsWithFiltersAlwaysReturnsAccountCost (no AccountID filter)
- Integration test: add TotalAccountCost/TodayAccountCost assertions
- Fix gofmt alignment in usage_log_types.go
2026-04-15 15:02:21 +08:00
erio
6ade6d30a8
feat(usage): add account cost display to admin dashboard and usage pages
...
- Add account_cost column to dashboard aggregation tables (migration 107)
- DashboardStats: add TotalAccountCost/TodayAccountCost fields
- ModelStat/GroupStat: add AccountCost field with SQL aggregation
- GetStatsWithFilters: always return TotalAccountCost (remove accountID filter)
- Dashboard Token cards: show user(green)/cost(orange)/standard(gray)
- Usage stats card: show account cost and standard below main value
- Model/Group distribution tables: add orange cost column
2026-04-15 15:02:21 +08:00
erio
38c00872e1
fix(ui): allow closing test dialog during active SSE stream
...
Replace dead EventSource variable with AbortController to enable
cancelling fetch streams. Remove close-button disable during connecting
status so users can dismiss the dialog at any time.
2026-04-15 11:34:31 +08:00
erio
c2108421c2
fix: gofmt payment_service.go and payment_order.go
2026-04-15 01:50:19 +08:00
erio
342dbd2e19
fix(payment): use original recharge amount in product name, not pay_amount
...
Product name (e.g. "快代码科技工作室 100 元") should show the user's
original recharge amount (limitAmount), not the fee-inclusive pay amount.
The gateway receives payAmount separately for actual charging.
2026-04-15 01:43:56 +08:00
erio
21f22b5099
fix: remove accidentally staged Antigravity-Manager submodule
2026-04-15 01:39:27 +08:00
erio
60614e6f74
fix: gofmt formatting and update API contract test for new fields
...
- Fix gofmt alignment in setting_handler.go, settings.go, payment_config_service.go
- Add payment_balance_recharge_multiplier and payment_recharge_fee_rate
to API contract test expected JSON
2026-04-15 01:39:00 +08:00
erio
3053c56cac
fix(payment): show full amount breakdown on payment result page
...
- Show base amount (充值金额) as first line
- Show fee amount with percentage when fee_rate > 0
- Show pay_amount (实付金额) in bold primary color
- Show credited amount (到账金额) when different from pay_amount
- Compute baseAmount and feeAmount from backend order data
2026-04-15 01:27:25 +08:00
erio
d149dbc91f
fix(payment): enhance fee rate input validation and UI
...
Backend:
- Validate recharge_fee_rate: 0 ≤ rate ≤ 100, max 2 decimal places
Frontend settings:
- Add % suffix icon to fee rate input
- Enforce max=100, min=0, step=0.01 with 2 decimal precision
2026-04-15 01:27:24 +08:00
erio
e761d38fd1
fix(payment): integrate recharge fee rate in order flow and fix UI display
...
Backend:
- Use cfg.RechargeFeeRate in order creation instead of hardcoded 0
- Remove dead getFeeRate stub method
- All amounts computed server-side: order_amount, pay_amount, fee_rate
Frontend - PaymentView:
- Read recharge_fee_rate from checkout-info API (not per-method)
- Show fee breakdown only when fee_rate > 0
- Show credited amount only when multiplier ≠ 1
Frontend - Order display (user + admin):
- Fix fee_rate * 100 bug (fee_rate is already a percentage)
- OrderTable: show pay_amount as primary, fee/credited as sub-lines
- AdminOrderDetail: full breakdown (base/fee/paid/credited)
- AdminRefundDialog: label "到账金额" for clarity
- PaymentResultView: show pay_amount with fee info
Types + i18n:
- Add recharge_fee_rate to CheckoutInfoResponse
- Add fee_rate to CreateOrderResult
- Add translations: creditedAmount, fee, baseAmount, includedInPayAmount
2026-04-15 01:27:24 +08:00
erio
98140f6cac
feat(payment): add recharge fee rate setting and fix provider card UI
...
- Add recharge_fee_rate system setting (percentage fee on top of recharge amount)
- Full backend chain: config constant, PaymentConfig struct, update validation,
read/write persistence, DTO, handler GET/PUT responses
- Frontend: settings input with preview, i18n (zh/en), API types
- Fix provider card toggle layout: labels above switches to save width
- Fix Chinese translation: "EasyPay" → "易支付" in provider description
2026-04-15 01:27:24 +08:00
erio
60a4b9316b
feat(payment): balance recharge multiplier and refund amount separation
...
- Add balance_recharge_multiplier system setting (e.g. 1.2 = charge 100 get 120)
- Separate order_amount (credited balance) from pay_amount (actual payment)
- Refund calculates gateway amount proportionally from pay_amount
- Frontend shows both amounts in order details, payment status, refund dialog
- Admin settings UI for configuring recharge multiplier
2026-04-15 01:27:24 +08:00
Wesley Liddick
7c671b5373
Merge pull request #1635 from KnowSky404/fix-issue-1613-version-dropdown
...
fix(sidebar): prevent version dropdown clipping in expanded brand
2026-04-14 20:41:53 +08:00
Wesley Liddick
d402e722cf
Merge pull request #1637 from touwaeriol/feat/websearch-notify-pricing
...
feat: web search emulation, balance/quota notify, account stats pricing, per-provider refund control, Stripe fix / Web 搜索模拟、余额配额通知、渠道统计计费、按服务商退款控制、Stripe 修复
2026-04-14 20:41:09 +08:00
erio
8548a130c7
fix: Messages() routing refactor and subscription group test coverage
...
- Refactor OpenAI Messages() routing: pre-compute dispatch model using
resolveOpenAIMessagesDispatchMappedModel + NormalizeOpenAICompatRequestedModel
instead of try-fail-retry pattern with gin context passing
- Remove openai_messages_fallback_model context anti-pattern
- Use effectiveMappedModel directly for forward default mapped model
- Add 3 subscription group tests covering all branch paths:
_Blocked (no active subscription → SUBSCRIPTION_REQUIRED),
_RequiresRepo (nil repo → SUBSCRIPTION_REPOSITORY_UNAVAILABLE),
_AllowsActiveSubscription (valid subscription → success)
2026-04-14 20:34:53 +08:00