Dev (#166)
* chore(release): stop publishing legacy Windows update packages * feat(agents): support OpenCode Desktop across platforms Detect CLI and desktop installations on Windows, macOS, and Linux, and add separate launch and restart controls. Closes #156 * fix(codex): align model display names and show total session count - preserve runtime model identity in generated catalogs - count distinct sessions across database and rollout sources - update session count labels in all supported languages * fix(codex): keep config and auth files in sync - generate auth.json for API key configuration - preserve and validate OAuth credentials - include auth.json in transactional updates and rollback - retain compatibility with legacy Codex configuration states * fix(cpa-gui): update version to 0.2.59 in Cargo files * fix(codex): preserve OAuth mode after closing configuration * feat(config): add TLS management and protocol-aware local URLs - add TLS controls to advanced settings - persist certificate and private key paths - restart the core after TLS changes - switch WebUI, API and management URLs between HTTP and HTTPS - synchronize agent configurations and detection with the active protocol * refactor(config): reorganize network, routing, and TLS settings - split network settings and session routing into separate tabs - move TLS configuration into network settings - preserve TLS restart and HTTPS URL synchronization behavior * feat(config): add independent network settings and custom listen IP * fix(navigation): allow access to usage records while core is stopped * refactor(home): show a single API URL based on the configured listen IP * feat(config): add file pickers for TLS certificate and private key * fix(usage): distinguish client cancellations from request failures - persist usage failure status and response details - classify HTTP 499 and canceled contexts separately - exclude canceled requests from failure statistics - add canceled filtering and failure details to the usage UI - migrate and backfill existing usage records * feat(ui): revamp usage records and improve app interactions - redesign usage records dashboard, filters, charts, and pricing views - add resizable centered columns with persisted widths - expose OpenCode desktop launch and restart actions - suppress the API access enabled success notice * feat(agents): persist applied configurations across app restarts - preserve applied agent configs and managed Claude aliases on exit - keep explicit close actions restoring original configurations - add Codex restart persistence regression coverage - bump desktop version to 0.2.61
This commit is contained in:
1 parent
2b9ceb11fb
commit
3d44eba492
15 files changed
+2342
-526
No files matched your search
+9
-1
@@ -113,6 +113,8 @@ export const jaOverrides = {
|
||||
'usage.tab.analysis': '分析',
|
||||
'usage.tab.events': 'リクエスト詳細',
|
||||
'usage.tab.pricing': '料金統計',
|
||||
'usage.refresh': '更新',
|
||||
'usage.filter.reset': 'フィルター解除',
|
||||
'usage.filter.timeRange': '期間',
|
||||
'usage.range.4h': '過去 4 時間',
|
||||
'usage.range.24h': '過去 24 時間',
|
||||
@@ -131,12 +133,13 @@ export const jaOverrides = {
|
||||
'usage.filter.allResults': 'すべての結果',
|
||||
'usage.result.success': '成功',
|
||||
'usage.result.failed': '失敗',
|
||||
'usage.result.canceled': 'キャンセル済み',
|
||||
'usage.filter.startTime': '開始日時',
|
||||
'usage.filter.endTime': '終了日時',
|
||||
'usage.filter.to': '~',
|
||||
'usage.loading': 'ローカル SQLite の使用履歴を読み込んでいます',
|
||||
'usage.stat.requests': '総リクエスト数',
|
||||
'usage.stat.requestMeta': '成功 {success} · 失敗 {failed}',
|
||||
'usage.stat.requestMeta': '成功 {success} · 失敗 {failed} · キャンセル {canceled}',
|
||||
'usage.stat.tokens': '合計 Token',
|
||||
'usage.stat.tokenMeta': '入 {input} · 出 {output}',
|
||||
'usage.stat.successRate': '成功率',
|
||||
@@ -188,9 +191,14 @@ export const jaOverrides = {
|
||||
'usage.analysis.itemMeta': '{requests} 回 · {percent}% · {tokens} Token',
|
||||
'usage.events.total': '合計 {count} 件',
|
||||
'usage.events.page': '{page} / {total} ページ',
|
||||
'usage.events.resetColumns': '列幅をリセット',
|
||||
'usage.events.resizeHint': 'ドラッグで列幅を調整、ダブルクリックでリセット',
|
||||
'usage.events.dragHint': 'ヘッダーの境界をドラッグして列幅を調整',
|
||||
'usage.column.time': '日時',
|
||||
'usage.column.model': 'モデル',
|
||||
'usage.column.provider': 'Provider',
|
||||
'usage.column.source': 'ソース',
|
||||
'usage.column.key': 'API キー',
|
||||
'usage.column.result': '結果',
|
||||
'usage.column.latency': '合計所要時間',
|
||||
'usage.column.ttft': '初回トークン遅延',
|
||||
|
||||
@@ -113,6 +113,8 @@ export const en: Record<MessageKey, string> = {
|
||||
'usage.tab.analysis': 'Analysis',
|
||||
'usage.tab.events': 'Request Details',
|
||||
'usage.tab.pricing': 'Price Statistics',
|
||||
'usage.refresh': 'Refresh',
|
||||
'usage.filter.reset': 'Reset Filters',
|
||||
'usage.filter.timeRange': 'Time range',
|
||||
'usage.range.4h': 'Last 4 Hours',
|
||||
'usage.range.24h': 'Last 24 Hours',
|
||||
@@ -131,12 +133,13 @@ export const en: Record<MessageKey, string> = {
|
||||
'usage.filter.allResults': 'All Results',
|
||||
'usage.result.success': 'Success',
|
||||
'usage.result.failed': 'Failed',
|
||||
'usage.result.canceled': 'Canceled',
|
||||
'usage.filter.startTime': 'Start time',
|
||||
'usage.filter.endTime': 'End time',
|
||||
'usage.filter.to': 'to',
|
||||
'usage.loading': 'Loading local SQLite usage history',
|
||||
'usage.stat.requests': 'Total Requests',
|
||||
'usage.stat.requestMeta': 'OK {success} · Fail {failed}',
|
||||
'usage.stat.requestMeta': 'OK {success} · Fail {failed} · Canceled {canceled}',
|
||||
'usage.stat.tokens': 'Total Tokens',
|
||||
'usage.stat.tokenMeta': 'In {input} · Out {output}',
|
||||
'usage.stat.successRate': 'Success Rate',
|
||||
@@ -188,9 +191,14 @@ export const en: Record<MessageKey, string> = {
|
||||
'usage.analysis.itemMeta': '{requests} requests · {percent}% · {tokens} tokens',
|
||||
'usage.events.total': '{count} records',
|
||||
'usage.events.page': 'Page {page} of {total}',
|
||||
'usage.events.resetColumns': 'Reset Widths',
|
||||
'usage.events.resizeHint': 'Drag to resize, double-click to reset',
|
||||
'usage.events.dragHint': 'Drag column header borders to resize',
|
||||
'usage.column.time': 'Time',
|
||||
'usage.column.model': 'Model',
|
||||
'usage.column.provider': 'Provider',
|
||||
'usage.column.source': 'Source',
|
||||
'usage.column.key': 'API Key',
|
||||
'usage.column.result': 'Result',
|
||||
'usage.column.latency': 'Total Duration',
|
||||
'usage.column.ttft': 'First Token Latency',
|
||||
|
||||
@@ -111,6 +111,8 @@ export const zhCN = {
|
||||
'usage.tab.analysis': '分析',
|
||||
'usage.tab.events': '请求明细',
|
||||
'usage.tab.pricing': '价格统计',
|
||||
'usage.refresh': '刷新数据',
|
||||
'usage.filter.reset': '重置筛选',
|
||||
'usage.filter.timeRange': '时间范围',
|
||||
'usage.range.4h': '最近 4 小时',
|
||||
'usage.range.24h': '最近 24 小时',
|
||||
@@ -129,12 +131,13 @@ export const zhCN = {
|
||||
'usage.filter.allResults': '全部结果',
|
||||
'usage.result.success': '成功',
|
||||
'usage.result.failed': '失败',
|
||||
'usage.result.canceled': '已取消',
|
||||
'usage.filter.startTime': '开始时间',
|
||||
'usage.filter.endTime': '结束时间',
|
||||
'usage.filter.to': '至',
|
||||
'usage.loading': '正在读取本地 SQLite 使用记录',
|
||||
'usage.stat.requests': '请求总数',
|
||||
'usage.stat.requestMeta': '成功 {success} · 失败 {failed}',
|
||||
'usage.stat.requestMeta': '成功 {success} · 失败 {failed} · 取消 {canceled}',
|
||||
'usage.stat.tokens': 'Token 总量',
|
||||
'usage.stat.tokenMeta': '入 {input} · 出 {output}',
|
||||
'usage.stat.successRate': '成功率',
|
||||
@@ -186,9 +189,14 @@ export const zhCN = {
|
||||
'usage.analysis.itemMeta': '{requests} 次 · {percent}% · {tokens} Token',
|
||||
'usage.events.total': '共 {count} 条记录',
|
||||
'usage.events.page': '第 {page} / {total} 页',
|
||||
'usage.events.resetColumns': '重置列宽',
|
||||
'usage.events.resizeHint': '拖动调整列宽,双击重置本列',
|
||||
'usage.events.dragHint': '可拖动表头边线调整每列宽度',
|
||||
'usage.column.time': '时间',
|
||||
'usage.column.model': '模型',
|
||||
'usage.column.provider': 'Provider',
|
||||
'usage.column.source': '来源',
|
||||
'usage.column.key': '鉴权密钥',
|
||||
'usage.column.result': '结果',
|
||||
'usage.column.latency': '总耗时',
|
||||
'usage.column.ttft': '首字延迟',
|
||||
|
||||
@@ -1878,7 +1878,7 @@ export function AgentsPage() {
|
||||
<div className="agent-config-footer">
|
||||
<div className="agent-launch-control">
|
||||
<div className="agent-launch-actions">
|
||||
{selected === 'codex' ? (
|
||||
{hasIndependentCliAndApp ? (
|
||||
<>
|
||||
<button
|
||||
type="button"
|
||||
|
||||
@@ -1076,6 +1076,7 @@ export function ApiAccessPage() {
|
||||
const toggleProvider = async (row: ProviderRow) => {
|
||||
setBusy(true);
|
||||
setError('');
|
||||
setNotice('');
|
||||
try {
|
||||
const latestConfig = await managementApi.get('/config');
|
||||
const latestRows = sectionRecordsFromConfig(latestConfig, row.section);
|
||||
@@ -1105,7 +1106,7 @@ export function ApiAccessPage() {
|
||||
);
|
||||
await managementApi.put(`/${row.section}`, nextRows);
|
||||
}
|
||||
setNotice(currentlyDisabled ? t('apiAccess.notice.enabled') : t('apiAccess.notice.disabled'));
|
||||
if (!currentlyDisabled) setNotice(t('apiAccess.notice.disabled'));
|
||||
await loadProviders();
|
||||
} catch (requestError) {
|
||||
setError(String(requestError));
|
||||
|
||||
+1184
-167
File diff suppressed because it is too large.
Load diff
+705
-261
File diff suppressed because it is too large.
Load diff
Reference in new issue
Block a user