@raingor/pi-web-switch 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,6 +4,34 @@ const zhCN: Record<string, string> = {
4
4
  "nav.dashboard": "仪表盘",
5
5
  "nav.models": "模型",
6
6
  "nav.providers": "提供商",
7
+ "nav.providers_models": "提供商与模型",
8
+ "providers_models.subtitle": "管理模型供应商与模型,配置后写入 ~/.pi/agent/。",
9
+ "providers_models.custom_providers": "自定义供应商",
10
+ "providers_models.model_list": "模型列表",
11
+ "providers_models.add_provider_title": "添加模型供应商",
12
+ "providers_models.add_provider_desc": "配置一个完全自定义的 API 端点和初始模型。",
13
+ "providers_models.name": "名称",
14
+ "providers_models.name_placeholder": "如:智谱 GLM",
15
+ "providers_models.select_hint": "请选择或添加供应商",
16
+ "providers_models.delete_provider_note": "此操作将从配置中移除该供应商及其所有模型。",
17
+ "providers_models.saved": "已保存",
18
+ "providers_models.save_failed": "保存失败,请重试",
19
+ "providers_models.test_connection": "测试连接",
20
+ "providers_models.testing": "测试中...",
21
+ "providers_models.test_ok": "连接正常 ({0} ms)",
22
+ "providers_models.test_fail": "连接失败:{0}",
23
+ "providers_models.invalid_url": "请输入合法的 http(s) 地址",
24
+ "providers_models.enable_all": "全部启用",
25
+ "providers_models.disable_all": "全部禁用",
26
+ "providers_models.id_exists": "ID “{0}” 已存在,请换一个名称",
27
+ "providers_models.id_preview": "将以 ID “{0}” 保存",
28
+ "providers_models.import": "导入",
29
+ "providers_models.import_title": "导入供应商配置",
30
+ "providers_models.import_desc": "粘贴包含名称、baseurl、key、modelid 的文本,自动识别供应商与模型,导入的模型将自动启用。",
31
+ "providers_models.import_placeholder": "tokenrouter baseurl:https://api.example.com/v1 key:sk-xxxx\nmodelid:vendor/model-name",
32
+ "providers_models.import_empty": "未能从文本中识别出有效内容",
33
+ "providers_models.import_merge": "供应商 “{0}” 已存在,将合并模型到该供应商",
34
+ "providers_models.import_builtin_conflict": "与内置供应商 “{0}” 冲突,请修改名称",
7
35
  "nav.sessions": "会话",
8
36
  "nav.memory": "记忆",
9
37
  "nav.settings": "设置",
@@ -38,23 +66,34 @@ const zhCN: Record<string, string> = {
38
66
  "dashboard.model": "计费模型",
39
67
  "dashboard.cost": "总成本",
40
68
  "dashboard.requests": "请求数",
41
- "dashboard.status": "状态",
42
69
  "dashboard.no_data": "该时间范围内无请求数据",
43
70
  "dashboard.provider_stats_desc": "按供应商聚合的统计数据",
44
71
  "dashboard.model_stats_desc": "按模型聚合的统计数据",
72
+ "dashboard.last_updated": "最后更新 {0}",
73
+ "dashboard.refresh_now": "立即刷新",
74
+ "dashboard.refresh_interval": "刷新间隔",
75
+ "dashboard.switch_currency": "切换货币",
76
+ "dashboard.off": "关闭",
77
+ "dashboard.vs_prev": "较上一周期",
78
+ "dashboard.invalid_range": "开始日期不能晚于结束日期",
79
+ "dashboard.export_csv": "导出 CSV",
80
+ "dashboard.total_items": "共 {0} 条",
81
+ "dashboard.prev_page": "上一页",
82
+ "dashboard.next_page": "下一页",
83
+ "dashboard.tokens": "Tokens",
84
+ "dashboard.models_count": "模型数",
85
+ "dashboard.cost_share": "成本占比",
45
86
 
46
- "models.title": "模型管理",
47
87
  "models.search_placeholder": "搜索模型...",
48
- "models.filter_all": "全部提供商",
49
88
  "models.add_model": "添加模型",
50
89
  "models.edit_model": "编辑模型",
51
90
  "models.delete_model": "删除模型",
52
91
  "models.no_models": "未找到模型",
53
92
  "models.enabled": "已启用",
54
93
  "models.disabled": "已禁用",
55
- "models.enable": "启用",
56
- "models.disable": "禁用",
57
- "models.capabilities": "能力",
94
+ "models.model_id": "模型 ID",
95
+ "models.display_name": "显示名称",
96
+ "models.free": "免费",
58
97
  "models.reasoning": "推理",
59
98
  "models.image_input": "图片输入",
60
99
  "models.context_window": "上下文窗口",
@@ -67,54 +106,106 @@ const zhCN: Record<string, string> = {
67
106
  "models.cancel": "取消",
68
107
  "models.delete_confirm": "确定要删除此模型吗?",
69
108
 
70
- "providers.title": "提供商管理",
71
109
  "providers.add_provider": "添加提供商",
72
- "providers.edit_provider": "编辑提供商",
73
110
  "providers.delete_provider": "删除提供商",
74
111
  "providers.custom": "自定义",
75
112
  "providers.builtin": "内置",
76
- "providers.no_auth": "未配置",
77
113
  "providers.configured": "已配置",
78
114
  "providers.api_key": "API Key",
79
115
  "providers.base_url": "基础地址",
80
116
  "providers.api_type": "API 类型",
81
- "providers.headers": "请求头",
82
- "providers.auth_method": "认证方式",
83
- "providers.save": "保存",
84
- "providers.cancel": "取消",
85
117
  "providers.delete_confirm": "确定要删除此提供商吗?",
86
- "providers.set_api_key": "设置 API Key",
87
- "providers.remove_api_key": "移除 API Key",
88
- "providers.models_count": "{0} 个模型",
89
118
 
90
119
  "sessions.title": "会话列表",
91
120
  "sessions.summary": "共 {0} 个会话,分布在 {1} 个项目",
92
- "sessions.filter_placeholder": "按项目名称搜索...",
121
+ "sessions.filter_placeholder": "搜索项目或会话...",
93
122
  "sessions.no_sessions": "未找到会话",
94
123
  "sessions.last_active": "最近活跃 {0}",
95
124
  "sessions.sessions_count": "{0} 个会话",
96
125
  "sessions.messages": "{0} 条消息",
97
- "sessions.delete_title": "删除会话",
98
- "sessions.delete_confirm": "确定要删除此会话吗?",
99
- "sessions.delete_permanent": "这将永久删除磁盘上的会话文件。",
126
+ "sessions.delete_title": "移入回收站",
127
+ "sessions.delete_confirm": "确定要将此会话移入回收站吗?",
128
+ "sessions.delete_to_trash_note": "会话将移入回收站(~/.pi/agent/.trash),可随时恢复。",
100
129
  "sessions.cancel": "取消",
101
130
  "sessions.delete": "删除",
102
131
  "sessions.deleting": "删除中...",
103
132
  "sessions.protected": "近 3 天有更新,无法删除",
104
133
  "sessions.delete_failed": "删除会话文件失败",
105
134
  "sessions.delete_error": "删除时发生错误",
135
+ "sessions.load_failed": "加载会话失败",
136
+ "sessions.refresh": "刷新",
137
+ "sessions.more_count": "还有 {0} 条",
138
+ "sessions.tab_sessions": "会话",
139
+ "sessions.tab_trash": "回收站",
140
+ "sessions.trash_desc": "已删除的会话保留在 ~/.pi/agent/.trash 中,可恢复或永久删除。",
141
+ "sessions.trash_empty": "回收站为空",
142
+ "sessions.restore": "恢复",
143
+ "sessions.delete_forever": "永久删除",
144
+ "sessions.delete_forever_confirm": "确定要永久删除吗?此操作无法撤销。",
145
+ "sessions.trashed_at": "删除于 {0}",
146
+ "sessions.select_all": "全选",
147
+ "sessions.selected_count": "已选 {0} 项",
148
+ "sessions.restore_selected": "恢复所选",
149
+ "sessions.delete_selected": "删除所选",
150
+ "sessions.preview_title": "会话预览",
151
+ "sessions.preview_total": "共 {0} 条消息,显示前 {1} 条",
152
+ "sessions.preview_empty": "此会话没有可预览的消息",
153
+ "sessions.preview_failed": "加载预览失败",
106
154
 
107
155
  "memory.title": "记忆查看",
108
- "memory.summary": "pi-hermes-memory · {0} 行,{1} 个文件",
156
+ "memory.summary": "pi-hermes-memory · {0} 条记忆 · {1} 个文件",
109
157
  "memory.no_memory": "未找到记忆文件",
110
158
  "memory.no_memory_desc": "未安装 pi-hermes-memory 扩展",
111
159
  "memory.project_memories": "项目记忆",
112
160
  "memory.user_profile": "用户画像",
113
161
  "memory.failure_records": "故障记录",
114
- "memory.lines": "{0} ",
115
- "memory.updated": "更新于 {0}",
162
+ "memory.entries_count": "{0} ",
163
+ "memory.other": "其他",
164
+ "memory.empty_file": "暂无记忆条目",
165
+ "memory.load_failed": "加载记忆失败",
166
+ "memory.refresh": "刷新",
167
+ "memory.search_placeholder": "搜索记忆内容...",
168
+ "memory.no_results": "没有匹配的记忆条目",
169
+ "memory.copy": "复制",
170
+ "memory.copied": "已复制",
171
+ "memory.delete": "删除",
172
+ "memory.delete_title": "删除记忆条目",
173
+ "memory.delete_confirm": "确定要删除这条记忆吗?",
174
+ "memory.delete_note": "此操作将直接修改记忆文件,无法撤销。",
175
+ "memory.delete_failed": "删除记忆条目失败",
176
+ "memory.deleting": "删除中...",
177
+ "memory.cancel": "取消",
178
+
179
+ "common.today": "今天",
180
+ "common.yesterday": "昨天",
181
+ "common.days_ago": "{0} 天前",
116
182
 
117
183
  "settings.title": "设置",
184
+ "settings.subtitle": "管理 pi 编码代理的外观、默认模型与扩展",
185
+ "settings.stat_providers": "供应商",
186
+ "settings.stat_enabled": "已启用模型",
187
+ "settings.stat_theme": "当前主题",
188
+ "settings.tab_models": "模型",
189
+ "settings.tab_advanced": "高级",
190
+ "settings.theme": "主题",
191
+ "settings.theme_desc": "选择界面配色方案",
192
+ "settings.font_size": "字体大小",
193
+ "settings.font_size_desc": "调整界面整体字体大小",
194
+ "settings.enabled_models_desc": "点击标签以启用或禁用模型",
195
+ "settings.updates_title": "更新检测",
196
+ "settings.updates_desc": "检查 pi 本体与扩展在 npm 上是否有新版本。",
197
+ "settings.check_updates": "检查更新",
198
+ "settings.updates_summary": "{0} 个可更新",
199
+ "settings.updates_all_latest": "全部已是最新版本",
200
+ "settings.update_available": "可更新",
201
+ "settings.updates_up_to_date": "已最新",
202
+ "settings.updates_lookup_failed": "查询失败",
203
+ "settings.updates_failed": "检查更新失败",
204
+ "settings.update_all": "一键更新",
205
+ "settings.updating": "更新中…",
206
+ "settings.update_success": "已成功更新 {0} 个扩展",
207
+ "settings.update_failed_names": "{0} 个扩展更新失败:{1}",
208
+ "settings.updates_hint": "扩展可通过 pi 重新安装(或在 ~/.pi/agent/npm 执行 npm update)更新;pi 本体请通过安装器更新。",
118
209
  "settings.defaults": "默认值",
119
210
  "settings.default_provider": "默认提供商",
120
211
  "settings.default_model": "默认模型",
@@ -4,6 +4,34 @@ const zhTW: Record<string, string> = {
4
4
  "nav.dashboard": "儀表板",
5
5
  "nav.models": "模型",
6
6
  "nav.providers": "提供商",
7
+ "nav.providers_models": "提供商與模型",
8
+ "providers_models.subtitle": "管理模型供應商與模型,配置後寫入 ~/.pi/agent/。",
9
+ "providers_models.custom_providers": "自定義供應商",
10
+ "providers_models.model_list": "模型列表",
11
+ "providers_models.add_provider_title": "新增模型供應商",
12
+ "providers_models.add_provider_desc": "配置一個完全自訂的 API 端點和初始模型。",
13
+ "providers_models.name": "名稱",
14
+ "providers_models.name_placeholder": "如:智譜 GLM",
15
+ "providers_models.select_hint": "請選擇或新增供應商",
16
+ "providers_models.delete_provider_note": "此操作將從設定中移除該供應商及其所有模型。",
17
+ "providers_models.saved": "已儲存",
18
+ "providers_models.save_failed": "儲存失敗,請重試",
19
+ "providers_models.test_connection": "測試連線",
20
+ "providers_models.testing": "測試中...",
21
+ "providers_models.test_ok": "連線正常 ({0} ms)",
22
+ "providers_models.test_fail": "連線失敗:{0}",
23
+ "providers_models.invalid_url": "請輸入合法的 http(s) 位址",
24
+ "providers_models.enable_all": "全部啟用",
25
+ "providers_models.disable_all": "全部停用",
26
+ "providers_models.id_exists": "ID “{0}” 已存在,請換一個名稱",
27
+ "providers_models.id_preview": "將以 ID “{0}” 儲存",
28
+ "providers_models.import": "匯入",
29
+ "providers_models.import_title": "匯入供應商設定",
30
+ "providers_models.import_desc": "貼上包含名稱、baseurl、key、modelid 的文字,自動識別供應商與模型,匯入的模型將自動啟用。",
31
+ "providers_models.import_placeholder": "tokenrouter baseurl:https://api.example.com/v1 key:sk-xxxx\nmodelid:vendor/model-name",
32
+ "providers_models.import_empty": "未能從文字中識別出有效內容",
33
+ "providers_models.import_merge": "供應商 “{0}” 已存在,將合併模型至該供應商",
34
+ "providers_models.import_builtin_conflict": "與內建供應商 “{0}” 衝突,請修改名稱",
7
35
  "nav.sessions": "會話",
8
36
  "nav.memory": "記憶",
9
37
  "nav.settings": "設定",
@@ -38,23 +66,34 @@ const zhTW: Record<string, string> = {
38
66
  "dashboard.model": "計費模型",
39
67
  "dashboard.cost": "總成本",
40
68
  "dashboard.requests": "請求數",
41
- "dashboard.status": "狀態",
42
69
  "dashboard.no_data": "該時間範圍內無請求資料",
43
70
  "dashboard.provider_stats_desc": "按供應商聚合的統計資料",
44
71
  "dashboard.model_stats_desc": "按模型聚合的統計資料",
72
+ "dashboard.last_updated": "最後更新 {0}",
73
+ "dashboard.refresh_now": "立即重新整理",
74
+ "dashboard.refresh_interval": "重新整理間隔",
75
+ "dashboard.switch_currency": "切換貨幣",
76
+ "dashboard.off": "關閉",
77
+ "dashboard.vs_prev": "較上一週期",
78
+ "dashboard.invalid_range": "開始日期不能晚於結束日期",
79
+ "dashboard.export_csv": "匯出 CSV",
80
+ "dashboard.total_items": "共 {0} 筆",
81
+ "dashboard.prev_page": "上一頁",
82
+ "dashboard.next_page": "下一頁",
83
+ "dashboard.tokens": "Tokens",
84
+ "dashboard.models_count": "模型數",
85
+ "dashboard.cost_share": "成本占比",
45
86
 
46
- "models.title": "模型管理",
47
87
  "models.search_placeholder": "搜尋模型...",
48
- "models.filter_all": "全部提供商",
49
88
  "models.add_model": "新增模型",
50
89
  "models.edit_model": "編輯模型",
51
90
  "models.delete_model": "刪除模型",
52
91
  "models.no_models": "未找到模型",
53
92
  "models.enabled": "已啟用",
54
93
  "models.disabled": "已停用",
55
- "models.enable": "啟用",
56
- "models.disable": "停用",
57
- "models.capabilities": "能力",
94
+ "models.model_id": "模型 ID",
95
+ "models.display_name": "顯示名稱",
96
+ "models.free": "免費",
58
97
  "models.reasoning": "推理",
59
98
  "models.image_input": "圖片輸入",
60
99
  "models.context_window": "上下文視窗",
@@ -67,54 +106,106 @@ const zhTW: Record<string, string> = {
67
106
  "models.cancel": "取消",
68
107
  "models.delete_confirm": "確定要刪除此模型嗎?",
69
108
 
70
- "providers.title": "提供商管理",
71
109
  "providers.add_provider": "新增提供商",
72
- "providers.edit_provider": "編輯提供商",
73
110
  "providers.delete_provider": "刪除提供商",
74
111
  "providers.custom": "自訂",
75
112
  "providers.builtin": "內建",
76
- "providers.no_auth": "未設定",
77
113
  "providers.configured": "已設定",
78
114
  "providers.api_key": "API Key",
79
115
  "providers.base_url": "基礎位址",
80
116
  "providers.api_type": "API 類型",
81
- "providers.headers": "請求頭",
82
- "providers.auth_method": "認證方式",
83
- "providers.save": "儲存",
84
- "providers.cancel": "取消",
85
117
  "providers.delete_confirm": "確定要刪除此提供商嗎?",
86
- "providers.set_api_key": "設定 API Key",
87
- "providers.remove_api_key": "移除 API Key",
88
- "providers.models_count": "{0} 個模型",
89
118
 
90
119
  "sessions.title": "會話列表",
91
120
  "sessions.summary": "共 {0} 個會話,分佈在 {1} 個專案",
92
- "sessions.filter_placeholder": "按專案名稱搜尋...",
121
+ "sessions.filter_placeholder": "搜尋專案或會話...",
93
122
  "sessions.no_sessions": "未找到會話",
94
123
  "sessions.last_active": "最近活躍 {0}",
95
124
  "sessions.sessions_count": "{0} 個會話",
96
125
  "sessions.messages": "{0} 條訊息",
97
- "sessions.delete_title": "刪除會話",
98
- "sessions.delete_confirm": "確定要刪除此會話嗎?",
99
- "sessions.delete_permanent": "這將永久刪除磁碟上的會話檔案。",
126
+ "sessions.delete_title": "移入回收筒",
127
+ "sessions.delete_confirm": "確定要將此會話移入回收筒嗎?",
128
+ "sessions.delete_to_trash_note": "會話將移入回收筒(~/.pi/agent/.trash),可隨時恢復。",
100
129
  "sessions.cancel": "取消",
101
130
  "sessions.delete": "刪除",
102
131
  "sessions.deleting": "刪除中...",
103
132
  "sessions.protected": "近 3 天有更新,無法刪除",
104
133
  "sessions.delete_failed": "刪除會話檔案失敗",
105
134
  "sessions.delete_error": "刪除時發生錯誤",
135
+ "sessions.load_failed": "載入會話失敗",
136
+ "sessions.refresh": "重新整理",
137
+ "sessions.more_count": "還有 {0} 條",
138
+ "sessions.tab_sessions": "會話",
139
+ "sessions.tab_trash": "回收筒",
140
+ "sessions.trash_desc": "已刪除的會話保留在 ~/.pi/agent/.trash 中,可恢復或永久刪除。",
141
+ "sessions.trash_empty": "回收筒為空",
142
+ "sessions.restore": "恢復",
143
+ "sessions.delete_forever": "永久刪除",
144
+ "sessions.delete_forever_confirm": "確定要永久刪除嗎?此操作無法復原。",
145
+ "sessions.trashed_at": "刪除於 {0}",
146
+ "sessions.select_all": "全選",
147
+ "sessions.selected_count": "已選 {0} 項",
148
+ "sessions.restore_selected": "恢復所選",
149
+ "sessions.delete_selected": "刪除所選",
150
+ "sessions.preview_title": "會話預覽",
151
+ "sessions.preview_total": "共 {0} 條訊息,顯示前 {1} 條",
152
+ "sessions.preview_empty": "此會話沒有可預覽的訊息",
153
+ "sessions.preview_failed": "載入預覽失敗",
106
154
 
107
155
  "memory.title": "記憶檢視",
108
- "memory.summary": "pi-hermes-memory · {0} 行,{1} 個檔案",
156
+ "memory.summary": "pi-hermes-memory · {0} 條記憶 · {1} 個檔案",
109
157
  "memory.no_memory": "未找到記憶檔案",
110
158
  "memory.no_memory_desc": "未安裝 pi-hermes-memory 擴充功能",
111
159
  "memory.project_memories": "專案記憶",
112
160
  "memory.user_profile": "使用者輪廓",
113
161
  "memory.failure_records": "故障記錄",
114
- "memory.lines": "{0} ",
115
- "memory.updated": "更新於 {0}",
162
+ "memory.entries_count": "{0} ",
163
+ "memory.other": "其他",
164
+ "memory.empty_file": "暫無記憶條目",
165
+ "memory.load_failed": "載入記憶失敗",
166
+ "memory.refresh": "重新整理",
167
+ "memory.search_placeholder": "搜尋記憶內容...",
168
+ "memory.no_results": "沒有符合的記憶條目",
169
+ "memory.copy": "複製",
170
+ "memory.copied": "已複製",
171
+ "memory.delete": "刪除",
172
+ "memory.delete_title": "刪除記憶條目",
173
+ "memory.delete_confirm": "確定要刪除這條記憶嗎?",
174
+ "memory.delete_note": "此操作將直接修改記憶檔案,無法復原。",
175
+ "memory.delete_failed": "刪除記憶條目失敗",
176
+ "memory.deleting": "刪除中...",
177
+ "memory.cancel": "取消",
178
+
179
+ "common.today": "今天",
180
+ "common.yesterday": "昨天",
181
+ "common.days_ago": "{0} 天前",
116
182
 
117
183
  "settings.title": "設定",
184
+ "settings.subtitle": "管理 pi 編碼代理的外觀、預設模型與擴充",
185
+ "settings.stat_providers": "供應商",
186
+ "settings.stat_enabled": "已啟用模型",
187
+ "settings.stat_theme": "目前主題",
188
+ "settings.tab_models": "模型",
189
+ "settings.tab_advanced": "進階",
190
+ "settings.theme": "主題",
191
+ "settings.theme_desc": "選擇介面配色方案",
192
+ "settings.font_size": "字體大小",
193
+ "settings.font_size_desc": "調整介面整體字體大小",
194
+ "settings.enabled_models_desc": "點擊標籤以啟用或停用模型",
195
+ "settings.updates_title": "更新檢測",
196
+ "settings.updates_desc": "檢查 pi 本體與擴充在 npm 上是否有新版本。",
197
+ "settings.check_updates": "檢查更新",
198
+ "settings.updates_summary": "{0} 個可更新",
199
+ "settings.updates_all_latest": "全部已是最新版本",
200
+ "settings.update_available": "可更新",
201
+ "settings.updates_up_to_date": "已最新",
202
+ "settings.updates_lookup_failed": "查詢失敗",
203
+ "settings.updates_failed": "檢查更新失敗",
204
+ "settings.update_all": "一鍵更新",
205
+ "settings.updating": "更新中…",
206
+ "settings.update_success": "已成功更新 {0} 個擴充",
207
+ "settings.update_failed_names": "{0} 個擴充更新失敗:{1}",
208
+ "settings.updates_hint": "擴充可透過 pi 重新安裝(或在 ~/.pi/agent/npm 執行 npm update)更新;pi 本體請透過安裝器更新。",
118
209
  "settings.defaults": "預設值",
119
210
  "settings.default_provider": "預設提供商",
120
211
  "settings.default_model": "預設模型",
package/src/main.tsx CHANGED
@@ -99,6 +99,15 @@ function Root() {
99
99
  );
100
100
  }
101
101
 
102
+ // ─── UI font size: apply saved value before first paint ─
103
+ applySavedFontSize();
104
+ function applySavedFontSize() {
105
+ const saved = Number(localStorage.getItem("pi-font-size"));
106
+ if (saved >= 12 && saved <= 24) {
107
+ document.documentElement.style.fontSize = `${saved}px`;
108
+ }
109
+ }
110
+
102
111
  createRoot(document.getElementById("root")!).render(
103
112
  <StrictMode>
104
113
  <Root />
@@ -116,7 +116,7 @@ interface ConfigState {
116
116
  refreshUsage: () => Promise<void>;
117
117
 
118
118
  // Settings
119
- updateSettings: (settings: Partial<PiSettings>) => Promise<void>;
119
+ updateSettings: (settings: Partial<PiSettings>) => Promise<boolean>;
120
120
  setDefaultProvider: (provider: string) => Promise<void>;
121
121
  setDefaultModel: (model: string) => Promise<void>;
122
122
  setTheme: (theme: PiSettings["theme"]) => Promise<void>;
@@ -126,8 +126,8 @@ interface ConfigState {
126
126
  removePackage: (pkg: string) => Promise<void>;
127
127
 
128
128
  // Auth
129
- setProviderAuth: (providerId: string, key: string) => Promise<void>;
130
- removeProviderAuth: (providerId: string) => Promise<void>;
129
+ setProviderAuth: (providerId: string, key: string) => Promise<boolean>;
130
+ removeProviderAuth: (providerId: string) => Promise<boolean>;
131
131
 
132
132
  // Model CRUD (for custom providers)
133
133
  toggleModel: (providerId: string, modelId: string) => void;
@@ -136,9 +136,9 @@ interface ConfigState {
136
136
  removeModel: (providerId: string, modelId: string) => void;
137
137
 
138
138
  // Custom provider CRUD
139
- addCustomProvider: (id: string, cfg: CustomProviderConfig) => Promise<void>;
140
- updateCustomProvider: (id: string, cfg: Partial<CustomProviderConfig>) => Promise<void>;
141
- removeCustomProvider: (id: string) => Promise<void>;
139
+ addCustomProvider: (id: string, cfg: CustomProviderConfig) => Promise<boolean>;
140
+ updateCustomProvider: (id: string, cfg: Partial<CustomProviderConfig>) => Promise<boolean>;
141
+ removeCustomProvider: (id: string) => Promise<boolean>;
142
142
 
143
143
  // Import/Export (to localStorage for backup, writes back to pi files)
144
144
  importConfig: (config: PiConfig) => Promise<void>;
@@ -211,10 +211,11 @@ export const useConfigStore = create<ConfigState>((set, get) => ({
211
211
 
212
212
  updateSettings: async (partial) => {
213
213
  const { settings } = get();
214
- if (!settings) return;
214
+ if (!settings) return false;
215
215
  const updated = { ...settings, ...partial };
216
216
  const ok = await apiPost("/settings", updated);
217
217
  if (ok) set({ settings: updated });
218
+ return ok;
218
219
  },
219
220
 
220
221
  setDefaultProvider: async (provider) => {
@@ -273,11 +274,12 @@ export const useConfigStore = create<ConfigState>((set, get) => ({
273
274
  const { modelsJson } = get();
274
275
  set({ allProviders: mergeProviders(updated, modelsJson) });
275
276
  }
277
+ return ok;
276
278
  },
277
279
 
278
280
  removeProviderAuth: async (providerId) => {
279
281
  const { auth } = get();
280
- if (!auth) return;
282
+ if (!auth) return false;
281
283
  const { [providerId]: _, ...rest } = auth;
282
284
  const ok = await apiPost("/auth", rest);
283
285
  if (ok) {
@@ -285,6 +287,7 @@ export const useConfigStore = create<ConfigState>((set, get) => ({
285
287
  const { modelsJson } = get();
286
288
  set({ allProviders: mergeProviders(rest, modelsJson) });
287
289
  }
290
+ return ok;
288
291
  },
289
292
 
290
293
  // ─── Model CRUD (client-side only, stored in modelsJson) ─
@@ -383,7 +386,7 @@ export const useConfigStore = create<ConfigState>((set, get) => ({
383
386
 
384
387
  addCustomProvider: async (id, cfg) => {
385
388
  const { modelsJson } = get();
386
- if (!modelsJson) return;
389
+ if (!modelsJson) return false;
387
390
  const newProviders = { ...modelsJson.providers, [id]: cfg };
388
391
  const updated = { providers: newProviders };
389
392
  const ok = await apiPost("/models", updated);
@@ -392,13 +395,14 @@ export const useConfigStore = create<ConfigState>((set, get) => ({
392
395
  const { auth } = get();
393
396
  set({ allProviders: mergeProviders(auth ?? {}, updated) });
394
397
  }
398
+ return ok;
395
399
  },
396
400
 
397
401
  updateCustomProvider: async (id, cfg) => {
398
402
  const { modelsJson } = get();
399
- if (!modelsJson) return;
403
+ if (!modelsJson) return false;
400
404
  const existing = modelsJson.providers[id];
401
- if (!existing) return;
405
+ if (!existing) return false;
402
406
  const newProviders = {
403
407
  ...modelsJson.providers,
404
408
  [id]: { ...existing, ...cfg },
@@ -410,11 +414,12 @@ export const useConfigStore = create<ConfigState>((set, get) => ({
410
414
  const { auth } = get();
411
415
  set({ allProviders: mergeProviders(auth ?? {}, updated) });
412
416
  }
417
+ return ok;
413
418
  },
414
419
 
415
420
  removeCustomProvider: async (id) => {
416
421
  const { modelsJson } = get();
417
- if (!modelsJson) return;
422
+ if (!modelsJson) return false;
418
423
  const { [id]: _, ...rest } = modelsJson.providers;
419
424
  const updated = { providers: rest };
420
425
  const ok = await apiPost("/models", updated);
@@ -427,6 +432,7 @@ export const useConfigStore = create<ConfigState>((set, get) => ({
427
432
  );
428
433
  set({ allProviders: newAllProviders, allModels: newAllModels });
429
434
  }
435
+ return ok;
430
436
  },
431
437
 
432
438
  // ─── Import/Export ─────────────────────────────────────
@@ -136,6 +136,20 @@ export interface PiConfig {
136
136
  modelsJson: PiModelsJson | null;
137
137
  }
138
138
 
139
+ // pi core / extension update check (server queries the npm registry)
140
+ export interface UpdateItem {
141
+ name: string;
142
+ installed: string;
143
+ latest: string | null; // null → registry lookup failed
144
+ hasUpdate: boolean;
145
+ }
146
+
147
+ export interface UpdateCheckResult {
148
+ pi: UpdateItem | null; // null → pi version unknown
149
+ extensions: UpdateItem[];
150
+ checkedAt: number;
151
+ }
152
+
139
153
  // ─── Usage / Dashboard Types ──────────────────────────────
140
154
 
141
155
  export interface UsageRecord {
@@ -0,0 +1 @@
1
+ {"root":["./src/app.tsx","./src/main.tsx","./src/vite-env.d.ts","./src/components/dashboard/dashboardpage.tsx","./src/components/layout/appshell.tsx","./src/components/layout/sidebar.tsx","./src/components/providers/providersmodelspage.tsx","./src/components/sessions/memorypage.tsx","./src/components/sessions/sessionspage.tsx","./src/components/settings/settingspage.tsx","./src/components/ui/badge.tsx","./src/components/ui/emptystate.tsx","./src/components/ui/modal.tsx","./src/components/ui/statcard.tsx","./src/data/builtin-providers.ts","./src/data/mock-config.ts","./src/data/mock-usage.ts","./src/lib/config.ts","./src/lib/currency.ts","./src/lib/i18n.tsx","./src/lib/utils.ts","./src/lib/translations/en.ts","./src/lib/translations/index.ts","./src/lib/translations/ja.ts","./src/lib/translations/zh-cn.ts","./src/lib/translations/zh-tw.ts","./src/store/config-store.ts","./src/types/index.ts"],"version":"5.8.3"}