| feat(storage): migrate core crate and add legacy db compatibility | 7 个月前 |
| feat(storage): migrate core crate and add legacy db compatibility | 7 个月前 |
| feat(storage): migrate core crate and add legacy db compatibility | 7 个月前 |
| feat(storage): migrate core crate and add legacy db compatibility | 7 个月前 |
| feat(storage): migrate core crate and add legacy db compatibility | 7 个月前 |
| feat(storage): migrate core crate and add legacy db compatibility | 7 个月前 |
| feat(storage): migrate core crate and add legacy db compatibility | 7 个月前 |
| feat(storage): migrate core crate and add legacy db compatibility | 7 个月前 |
| feat(storage): migrate core crate and add legacy db compatibility | 7 个月前 |
| feat(storage): migrate core crate and add legacy db compatibility | 7 个月前 |
| feat(storage): migrate core crate and add legacy db compatibility | 7 个月前 |
| feat(storage): migrate core crate and add legacy db compatibility | 7 个月前 |
| feat(storage): migrate core crate and add legacy db compatibility | 7 个月前 |
| feat(storage): migrate core crate and add legacy db compatibility | 7 个月前 |
| feat(storage): migrate core crate and add legacy db compatibility | 7 个月前 |
| feat(storage): migrate core crate and add legacy db compatibility | 7 个月前 |
| feat(storage): migrate core crate and add legacy db compatibility | 7 个月前 |
| feat(storage): migrate core crate and add legacy db compatibility | 7 个月前 |
| 支持复制完整平台Key明文并移除最近使用列 | 7 个月前 |
| feat: 完成请求日志与Token统计相关改动 | 7 个月前 |
| feat: 完成请求日志与Token统计相关改动 | 7 个月前 |
| feat: 完成请求日志与Token统计相关改动 | 7 个月前 |
| 完善用量统计链路与前端仪表盘/日志体验 | 7 个月前 |
| 优化Token预刷新调度并隐藏后台刷新进度展示 | 7 个月前 |
| feat: 新增 Azure OpenAI 协议支持并优化平台Key与请求日志展示 | 7 个月前 |
| 完善请求日志追踪并修复协议适配回归 | 7 个月前 |
| 新增服务监听地址设置与持久化 | 7 个月前 |
| 优化大规模账号查询并修复网关运行时配置同步 | 7 个月前 |
| 完善新UI对接并补齐日志时长与Key统计 | 6 个月前 |
| 补齐 free 账号模型改写与请求链路日志 | 6 个月前 |
| 对齐 Codex 请求链路与失败诊断 | 6 个月前 |
| 实现Codex会话绑定与自动切号线程换代 | 6 个月前 |
| 增加平台密钥服务等级配置 | 6 个月前 |
| 重构账号资料模型并修复桌面端切页闪屏 | 6 个月前 |
| 优化聚合API展示与预热 | 6 个月前 |
| 聚合API支持多渠道重试切换 | 6 个月前 |
| feat: show aggregate api attempt chain in logs | 6 个月前 |
| chore: checkpoint dashboard and sqlite optimizations | 3 个月前 |
| Add responses websocket support and transport-aware logs | 6 个月前 |
| 拆分请求日志服务等级显式值与生效值 | 6 个月前 |
| feat: filter account rotation by plan type | 6 个月前 |
| 新增全局唯一优先账号路由 | 6 个月前 |
| 收敛 Codex 原生直通路径 | 6 个月前 |
| chore: checkpoint dashboard and sqlite optimizations | 3 个月前 |
| 实现模型目录管理页面并收敛模型存储结构 | 5 个月前 |
| 收敛模型目录字符串项迁移 | 4 个月前 |
| 移除 Azure OpenAI 平台协议 | 5 个月前 |
| feat: record first response latency in request logs | 5 个月前 |
| 添加订阅表 | 5 个月前 |
| fix: support aggregate API model override | 5 个月前 |
| add api key quota limits | 5 个月前 |
| Add aggregate API balance queries | 5 个月前 |
| Add quota management center MVP | 5 个月前 |
| Add unified quota model pools | 5 个月前 |
| chore: checkpoint dashboard and sqlite optimizations | 3 个月前 |
| feat: add model source routing management | 5 个月前 |
| feat: add model source routing management | 5 个月前 |
| Implement model group routing controls | 4 个月前 |
| Implement model group routing controls | 4 个月前 |
| 移除网关错误诊断功能 | 4 个月前 |
| fix: rename model source mapping preferences migration to 065 | 4 个月前 |
| 增强上游中转兼容观测 | 4 个月前 |
| 增强上游中转兼容观测 | 4 个月前 |
| 增强上游中转兼容观测 | 4 个月前 |
| chore: checkpoint dashboard and sqlite optimizations | 3 个月前 |
| chore: checkpoint dashboard and sqlite optimizations | 3 个月前 |
| chore: checkpoint dashboard and sqlite optimizations | 3 个月前 |
| chore: checkpoint dashboard and sqlite optimizations | 3 个月前 |
| chore: checkpoint dashboard and sqlite optimizations | 3 个月前 |
| chore: checkpoint dashboard and sqlite optimizations | 3 个月前 |
| chore: checkpoint dashboard and sqlite optimizations | 3 个月前 |
| chore: checkpoint dashboard and sqlite optimizations | 3 个月前 |
| chore: checkpoint dashboard and sqlite optimizations | 3 个月前 |
| chore: checkpoint dashboard and sqlite optimizations | 3 个月前 |
| chore: checkpoint dashboard and sqlite optimizations | 3 个月前 |
| chore: checkpoint dashboard and sqlite optimizations | 3 个月前 |
| chore: checkpoint dashboard and sqlite optimizations | 3 个月前 |
| chore: checkpoint dashboard and sqlite optimizations | 3 个月前 |
| chore: checkpoint dashboard and sqlite optimizations | 3 个月前 |
| chore: checkpoint dashboard and sqlite optimizations | 3 个月前 |
| chore: checkpoint dashboard and sqlite optimizations | 3 个月前 |
| chore: checkpoint dashboard and sqlite optimizations | 3 个月前 |
| chore: checkpoint dashboard and sqlite optimizations | 3 个月前 |
| chore: checkpoint dashboard and sqlite optimizations | 3 个月前 |
| chore: checkpoint dashboard and sqlite optimizations | 3 个月前 |
| chore: checkpoint dashboard and sqlite optimizations | 3 个月前 |
| chore: checkpoint dashboard and sqlite optimizations | 3 个月前 |
| chore: checkpoint dashboard and sqlite optimizations | 3 个月前 |
| chore: checkpoint dashboard and sqlite optimizations | 3 个月前 |
| chore: checkpoint dashboard and sqlite optimizations | 3 个月前 |
| chore: checkpoint dashboard and sqlite optimizations | 3 个月前 |
| chore: checkpoint dashboard and sqlite optimizations | 3 个月前 |
| chore: checkpoint dashboard and sqlite optimizations | 3 个月前 |
| chore: checkpoint dashboard and sqlite optimizations | 3 个月前 |
| perf: index model group list order | 3 个月前 |
| perf: index model group assignment deletes | 3 个月前 |
| perf: index event account cleanup | 3 个月前 |
| perf: index app user list order | 3 个月前 |
| perf: index app project user lookups | 3 个月前 |
| perf: index billing rule owner lookups | 3 个月前 |
| perf: index redeem record lookups | 3 个月前 |
| perf: index account manager created-by lookups | 3 个月前 |
| perf: index plugin task list order | 3 个月前 |
| perf: index account cleanup status lookups | 3 个月前 |
| 优化存储查询与上游客户端复用 | 3 个月前 |
| 优化首选账号查询索引 | 3 个月前 |
| 优化模型来源平台反查索引 | 3 个月前 |
| feat(core): add transactional model catalog v2 storage | 3 个月前 |
| feat(billing): charge from immutable integer price snapshots | 3 个月前 |
| feat(models): preserve Codex GPT-5.6 runtime metadata | 2 个月前 |
| feat(models): preserve Codex GPT-5.6 runtime metadata | 2 个月前 |
| fix: 修复日志清空与聚合 API 连通性测试 - 修复计费日志清空后重新显示的问题,同时保留用量与账单审计数据 - 修正 Responses 连通性探针请求格式,并记录上游错误详情 - 增加测试失败悬浮提示,调整今日/缓存/推理用量展示 | 2 个月前 |
| merge: resolve conflicts for account proxy support (#314) | 2 个月前 |
| merge: resolve conflicts for account proxy support (#314) | 2 个月前 |
| merge: resolve conflicts for account proxy support (#314) | 2 个月前 |
| merge: resolve conflicts for account proxy support (#314) | 2 个月前 |
| fix(models): align GPT-5.6 billing with official OpenAI API pricing | 2 个月前 |
|
| 2 个月前 |
| feat: add Codex project launcher and account group routing Closes #156 Closes #189 | 2 个月前 |
| feat(skills): add repository and skills.sh installation | 2 个月前 |
| fix(usage): exclude failed requests from token aggregates | 2 个月前 |
| fix(models): sync official GPT-5.6 pricing | 2 个月前 |
| release: prepare v0.5.2 | 2 个月前 |
| fix(auth): persist login session group metadata (#417) | 2 个月前 |
| Merge upstream main and resolve Fast policy conflicts | 2 个月前 |
| fix: preserve same-team accounts and limit failover retries | 2 个月前 |
| feat: 支持 GPT-6 Astra、账号模型同步与服务等级 | 1 个月前 |
| fix: 收口 Reserve 路由与多服务数据隔离 | 1 个月前 |
| feat: 支持自定义网关 User-Agent | 1 个月前 |
| feat(accounts): 五小时额度恢复后自动唤醒并支持批量开关 | 1 个月前 |
| fix: resolve account and aggregate API issues | 21 天前 |
| fix: resolve account and aggregate API issues | 21 天前 |
| feat(models): refresh catalog and scoped price sync | 19 天前 |
| chore(release): bump version to 0.6.3 | 14 天前 |
| feat(requestlog): add request payload detail view (#489) * feat(requestlog): add request payload detail view Store a sanitized, size-capped (16 KB) preview of the upstream request body per gateway trace and expose it through a new requestlog/detail RPC plus a per-row viewer in the request log page: - new request_log_payloads table (migration 139) keyed by trace_id - credential-like JSON keys are redacted on the write path - payload previews share the request log retention/clear lifecycle - members can only view payloads for their own API keys - Eye button per log row opens a detail dialog with pretty-printed payload, truncation marker and request metadata - remote SeaORM storage is not supported yet and reports a clear error * 新增请求日志详情弹窗并格式化导入语句 * 修复请求日志详情查询的空值处理和参数默认值 * feat(requestlog): add payload capture modes, delta storage and stage-aware detail - redaction and the 16 KB preview are app settings now (both default on); with the preview off the full body is stored as content-addressed fragments shared across requests, so a conversation only adds its new tail and the detail view rebuilds the complete body on demand - every authenticated request captures the body as received (HTTP and WebSocket clients), and the upstream capture only adds a row when the gateway rewrote the body before forwarding it - requestlog/detail accepts a stage, stitches previous_response_id continuations from earlier requests and the dialog renders the payload as a virtualized per-entry list with a copy action - clear and retention paths rebase orphaned manifests before deleting their parent and garbage-collect unreferenced blobs - register the 139 migration (previously referenced but never applied) and exclude the local-only payload tables from sqlite-to-remote transfers * fix(requestlog): secure payload capture and link real upstream attempts Redact all JSON roots, resolve previous_response_id only through authenticated completed response IDs, and guard queued payload jobs against clear/retention races. Capture each actual HTTP/WS outbound attempt (including fallback/retries) with sanitized target metadata and a wire digest. Add store, async writer, HTTP mock, WS mock and session isolation regressions. * docs(requestlog): clarify capture generation snapshot * fix(requestlog): preserve session scope and native websocket frames Inherit the authenticated client conversation key for outbound full-payload manifests and refuse ambiguous context links. Capture raw client WS frames plus every native upstream response.create send, including reconnect and terminal retries. Compare captures with mock upstream frames in focused regressions. * ci(requestlog): run payload and mock upstream regressions | 11 天前 |
| feat(requestlog): add request payload detail view (#489) * feat(requestlog): add request payload detail view Store a sanitized, size-capped (16 KB) preview of the upstream request body per gateway trace and expose it through a new requestlog/detail RPC plus a per-row viewer in the request log page: - new request_log_payloads table (migration 139) keyed by trace_id - credential-like JSON keys are redacted on the write path - payload previews share the request log retention/clear lifecycle - members can only view payloads for their own API keys - Eye button per log row opens a detail dialog with pretty-printed payload, truncation marker and request metadata - remote SeaORM storage is not supported yet and reports a clear error * 新增请求日志详情弹窗并格式化导入语句 * 修复请求日志详情查询的空值处理和参数默认值 * feat(requestlog): add payload capture modes, delta storage and stage-aware detail - redaction and the 16 KB preview are app settings now (both default on); with the preview off the full body is stored as content-addressed fragments shared across requests, so a conversation only adds its new tail and the detail view rebuilds the complete body on demand - every authenticated request captures the body as received (HTTP and WebSocket clients), and the upstream capture only adds a row when the gateway rewrote the body before forwarding it - requestlog/detail accepts a stage, stitches previous_response_id continuations from earlier requests and the dialog renders the payload as a virtualized per-entry list with a copy action - clear and retention paths rebase orphaned manifests before deleting their parent and garbage-collect unreferenced blobs - register the 139 migration (previously referenced but never applied) and exclude the local-only payload tables from sqlite-to-remote transfers * fix(requestlog): secure payload capture and link real upstream attempts Redact all JSON roots, resolve previous_response_id only through authenticated completed response IDs, and guard queued payload jobs against clear/retention races. Capture each actual HTTP/WS outbound attempt (including fallback/retries) with sanitized target metadata and a wire digest. Add store, async writer, HTTP mock, WS mock and session isolation regressions. * docs(requestlog): clarify capture generation snapshot * fix(requestlog): preserve session scope and native websocket frames Inherit the authenticated client conversation key for outbound full-payload manifests and refuse ambiguous context links. Capture raw client WS frames plus every native upstream response.create send, including reconnect and terminal retries. Compare captures with mock upstream frames in focused regressions. * ci(requestlog): run payload and mock upstream regressions | 11 天前 |
| feat(requestlog): add request payload detail view (#489) * feat(requestlog): add request payload detail view Store a sanitized, size-capped (16 KB) preview of the upstream request body per gateway trace and expose it through a new requestlog/detail RPC plus a per-row viewer in the request log page: - new request_log_payloads table (migration 139) keyed by trace_id - credential-like JSON keys are redacted on the write path - payload previews share the request log retention/clear lifecycle - members can only view payloads for their own API keys - Eye button per log row opens a detail dialog with pretty-printed payload, truncation marker and request metadata - remote SeaORM storage is not supported yet and reports a clear error * 新增请求日志详情弹窗并格式化导入语句 * 修复请求日志详情查询的空值处理和参数默认值 * feat(requestlog): add payload capture modes, delta storage and stage-aware detail - redaction and the 16 KB preview are app settings now (both default on); with the preview off the full body is stored as content-addressed fragments shared across requests, so a conversation only adds its new tail and the detail view rebuilds the complete body on demand - every authenticated request captures the body as received (HTTP and WebSocket clients), and the upstream capture only adds a row when the gateway rewrote the body before forwarding it - requestlog/detail accepts a stage, stitches previous_response_id continuations from earlier requests and the dialog renders the payload as a virtualized per-entry list with a copy action - clear and retention paths rebase orphaned manifests before deleting their parent and garbage-collect unreferenced blobs - register the 139 migration (previously referenced but never applied) and exclude the local-only payload tables from sqlite-to-remote transfers * fix(requestlog): secure payload capture and link real upstream attempts Redact all JSON roots, resolve previous_response_id only through authenticated completed response IDs, and guard queued payload jobs against clear/retention races. Capture each actual HTTP/WS outbound attempt (including fallback/retries) with sanitized target metadata and a wire digest. Add store, async writer, HTTP mock, WS mock and session isolation regressions. * docs(requestlog): clarify capture generation snapshot * fix(requestlog): preserve session scope and native websocket frames Inherit the authenticated client conversation key for outbound full-payload manifests and refuse ambiguous context links. Capture raw client WS frames plus every native upstream response.create send, including reconnect and terminal retries. Compare captures with mock upstream frames in focused regressions. * ci(requestlog): run payload and mock upstream regressions | 11 天前 |
| perf(storage): replace clear-time VACUUM with batched purge and incremental reclaim (#494) * perf(rusqlite): read last_insert_rowid lazily on the owning handle Transaction::execute no longer issues an extra SELECT last_insert_rowid() after every statement. Connection and Transaction now query the rowid on demand from the exact physical handle that ran the INSERT (the held transaction handle, or the single pooled handle), falling back to the last rowid observed from statement results if the lookup fails. Add shim tests for rowid semantics and run them in CI. * fix(rusqlite): pin each connection to one physical SQLite handle SQLx pools default to a 30 min max lifetime and 10 min idle timeout, which silently replaced the single pooled handle. That lost connection-scoped state (last_insert_rowid, busy_timeout, temp_store, journal_size_limit) and wiped in-memory databases. Disable both so a Connection keeps one handle for its whole life, like a real sqlite3 handle. * perf(storage): replace clear-time VACUUM with batched purge and incremental reclaim Clearing request logs ran wal_checkpoint(TRUNCATE); VACUUM after deleting every payload row inside one transaction. With full payload storage that rewrote a multi-GB file, needed as much free disk, held the write lock long enough for gateway writes to hit the 3 s busy timeout, and with temp_store=MEMORY could hold the transient copy in RAM. - clear/prune now only make old data unreachable in a short transaction (generation bump or retention watermark plus per-table rowid bounds in the new request_log_payload_purges table, migration 142) and delete payload rows in adaptive batches with secure_delete enabled; blobs are swept with a reference check inside each delete transaction - rows waiting for the purge are invisible to every reader and are never chosen as parents of new manifests; work left over after the 10 s budget (or after a restart) is continued by a background maintenance thread, and errors after the first commit no longer fail the clear - the maintenance thread also runs retention pruning off the request path, retries busy WAL checkpoints and returns free pages with small incremental_vacuum steps; new databases use auto_vacuum=INCREMENTAL - every connection sets journal_size_limit; space accounting uses live pages (page_count - freelist_count), never the file size - admin-only storage/spaceUsage and storage/reclaim RPCs and a settings card show used/reclaimable space and offer an explicit, disk-checked one-time rebuild for databases created by older versions * fix(storage): keep missing path components when matching a disk mount When a path did not exist, normalized_components canonicalized its parent and dropped the last component, so a missing mount point such as /definitely-not-a-mount compared equal to / and could win the longest-prefix match. Resolve the deepest existing ancestor instead and re-append the components below it. | 6 天前 |
| fix(storage): bound batched clear purges by generation instead of time (#498) A clear marker doomed rows with rowid <= max_rowid AND created_at <= cleared_at. created_at has one-second resolution and SQLite reuses the highest rowid once that row is deleted, so a payload row written in the same second as the clear could match both conditions, be hidden from the detail view and then be deleted by the background purge. Migration 143 adds a nullable generation column to the four purged payload tables and to request_log_payload_purges. Every write stores the clear generation current in its own statement, and a clear stores the generation it bumped to. A clear marker now dooms rows of a lower generation (plus rows written before the migration), which no row written after the clear can have. Markers left by an older version keep the time-based condition, restricted to rows written before the upgrade. Deleting and reading use the same condition. Add regressions for rowid reuse with created_at == cleared_at in every purged table, for legacy markers, and for re-running the migration when the columns already exist. | 5 天前 |