reigncode-app 1.3.2 → 1.4.0
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.
- package/AGENTS.md +1 -1
- package/e2e/AGENTS.md +1 -1
- package/e2e/actions.ts +4 -4
- package/e2e/app/server-default.spec.ts +1 -1
- package/e2e/fixtures.ts +2 -2
- package/e2e/projects/projects-switch.spec.ts +1 -1
- package/e2e/projects/workspaces.spec.ts +3 -3
- package/e2e/prompt/prompt-drop-file-uri.spec.ts +1 -1
- package/e2e/prompt/prompt-history.spec.ts +1 -1
- package/e2e/prompt/prompt-shell.spec.ts +1 -1
- package/e2e/selectors.ts +1 -1
- package/e2e/session/session-composer-dock.spec.ts +4 -4
- package/e2e/settings/settings.spec.ts +8 -8
- package/e2e/sidebar/sidebar.spec.ts +1 -1
- package/e2e/utils.ts +3 -3
- package/package.json +7 -9
- package/script/e2e-local.ts +9 -9
- package/src/app.tsx +8 -8
- package/src/components/debug-bar.tsx +1 -1
- package/src/components/dialog-connect-provider.tsx +12 -12
- package/src/components/dialog-custom-provider.tsx +7 -7
- package/src/components/dialog-edit-project.tsx +7 -7
- package/src/components/dialog-fork.tsx +6 -6
- package/src/components/dialog-manage-models.tsx +6 -6
- package/src/components/dialog-release-notes.tsx +3 -3
- package/src/components/dialog-select-directory.tsx +6 -6
- package/src/components/dialog-select-file.tsx +8 -8
- package/src/components/dialog-select-mcp.tsx +3 -3
- package/src/components/dialog-select-model-unpaid.tsx +12 -12
- package/src/components/dialog-select-model.tsx +8 -8
- package/src/components/dialog-select-provider.tsx +10 -10
- package/src/components/dialog-select-server.tsx +10 -10
- package/src/components/dialog-settings.tsx +3 -3
- package/src/components/file-tree.test.ts +4 -4
- package/src/components/file-tree.tsx +4 -4
- package/src/components/prompt-input/attachments.ts +1 -1
- package/src/components/prompt-input/build-request-parts.test.ts +2 -2
- package/src/components/prompt-input/build-request-parts.ts +2 -2
- package/src/components/prompt-input/context-items.tsx +4 -4
- package/src/components/prompt-input/drag-overlay.tsx +1 -1
- package/src/components/prompt-input/image-attachments.tsx +1 -1
- package/src/components/prompt-input/slash-popover.tsx +3 -3
- package/src/components/prompt-input/submit.test.ts +3 -3
- package/src/components/prompt-input/submit.ts +4 -4
- package/src/components/prompt-input.tsx +11 -11
- package/src/components/server/server-row.tsx +1 -1
- package/src/components/session/session-context-breakdown.test.ts +1 -1
- package/src/components/session/session-context-breakdown.ts +1 -1
- package/src/components/session/session-context-metrics.test.ts +1 -1
- package/src/components/session/session-context-metrics.ts +1 -1
- package/src/components/session/session-context-tab.tsx +9 -9
- package/src/components/session/session-header.tsx +12 -12
- package/src/components/session/session-new-view.tsx +3 -3
- package/src/components/session/session-sortable-tab.tsx +5 -5
- package/src/components/session/session-sortable-terminal-tab.tsx +4 -4
- package/src/components/session-context-usage.tsx +3 -3
- package/src/components/settings-general.tsx +7 -7
- package/src/components/settings-keybinds.tsx +5 -5
- package/src/components/settings-models.tsx +6 -6
- package/src/components/settings-providers.tsx +10 -10
- package/src/components/status-popover.tsx +7 -7
- package/src/components/terminal.tsx +3 -3
- package/src/components/titlebar.tsx +8 -8
- package/src/context/command.tsx +2 -2
- package/src/context/comments.test.ts +1 -1
- package/src/context/comments.tsx +1 -1
- package/src/context/file/content-cache.ts +1 -1
- package/src/context/file/path.test.ts +6 -6
- package/src/context/file/tree-store.ts +1 -1
- package/src/context/file/types.ts +1 -1
- package/src/context/file/watcher.ts +1 -1
- package/src/context/file.tsx +3 -3
- package/src/context/global-sdk.tsx +2 -2
- package/src/context/global-sync/bootstrap.ts +5 -5
- package/src/context/global-sync/child-store.ts +1 -1
- package/src/context/global-sync/event-reducer.test.ts +1 -1
- package/src/context/global-sync/event-reducer.ts +2 -2
- package/src/context/global-sync/session-cache.test.ts +1 -1
- package/src/context/global-sync/session-cache.ts +1 -1
- package/src/context/global-sync/session-trim.test.ts +1 -1
- package/src/context/global-sync/session-trim.ts +1 -1
- package/src/context/global-sync/types.ts +1 -1
- package/src/context/global-sync/utils.ts +1 -1
- package/src/context/global-sync.tsx +3 -3
- package/src/context/highlights.tsx +2 -2
- package/src/context/language.tsx +18 -18
- package/src/context/layout.tsx +2 -2
- package/src/context/local.tsx +2 -2
- package/src/context/models.tsx +1 -1
- package/src/context/notification.tsx +4 -4
- package/src/context/permission-auto-respond.test.ts +2 -2
- package/src/context/permission-auto-respond.ts +1 -1
- package/src/context/permission.tsx +2 -2
- package/src/context/platform.tsx +1 -1
- package/src/context/prompt.tsx +2 -2
- package/src/context/sdk.tsx +2 -2
- package/src/context/server.tsx +1 -1
- package/src/context/settings.tsx +1 -1
- package/src/context/sync-optimistic.test.ts +1 -1
- package/src/context/sync.tsx +4 -4
- package/src/context/terminal.test.ts +1 -1
- package/src/context/terminal.tsx +1 -1
- package/src/entry.tsx +1 -1
- package/src/hooks/use-providers.ts +3 -3
- package/src/i18n/ar.ts +26 -26
- package/src/i18n/br.ts +26 -26
- package/src/i18n/bs.ts +26 -26
- package/src/i18n/da.ts +26 -26
- package/src/i18n/de.ts +26 -26
- package/src/i18n/en.ts +26 -26
- package/src/i18n/es.ts +26 -26
- package/src/i18n/fr.ts +26 -26
- package/src/i18n/ja.ts +26 -26
- package/src/i18n/ko.ts +26 -26
- package/src/i18n/no.ts +26 -26
- package/src/i18n/pl.ts +26 -26
- package/src/i18n/ru.ts +26 -26
- package/src/i18n/th.ts +26 -26
- package/src/i18n/tr.ts +26 -26
- package/src/i18n/zh.ts +25 -25
- package/src/i18n/zht.ts +25 -25
- package/src/index.css +1 -1
- package/src/pages/directory-layout.tsx +3 -3
- package/src/pages/error.tsx +4 -4
- package/src/pages/home.tsx +5 -5
- package/src/pages/layout/deep-links.ts +2 -2
- package/src/pages/layout/helpers.test.ts +20 -20
- package/src/pages/layout/helpers.ts +2 -2
- package/src/pages/layout/inline-editor.tsx +1 -1
- package/src/pages/layout/sidebar-items.tsx +10 -10
- package/src/pages/layout/sidebar-project.tsx +5 -5
- package/src/pages/layout/sidebar-shell.tsx +2 -2
- package/src/pages/layout/sidebar-workspace.tsx +10 -10
- package/src/pages/layout.tsx +14 -14
- package/src/pages/session/composer/session-composer-region.tsx +1 -1
- package/src/pages/session/composer/session-composer-state.test.ts +1 -1
- package/src/pages/session/composer/session-composer-state.ts +2 -2
- package/src/pages/session/composer/session-followup-dock.tsx +3 -3
- package/src/pages/session/composer/session-permission-dock.tsx +4 -4
- package/src/pages/session/composer/session-question-dock.tsx +5 -5
- package/src/pages/session/composer/session-request-tree.ts +1 -1
- package/src/pages/session/composer/session-revert-dock.tsx +3 -3
- package/src/pages/session/composer/session-todo-dock.tsx +8 -8
- package/src/pages/session/file-tabs.tsx +10 -10
- package/src/pages/session/message-timeline.tsx +16 -16
- package/src/pages/session/review-tab.tsx +3 -3
- package/src/pages/session/session-model-helpers.test.ts +1 -1
- package/src/pages/session/session-model-helpers.ts +1 -1
- package/src/pages/session/session-side-panel.tsx +6 -6
- package/src/pages/session/terminal-panel.tsx +4 -4
- package/src/pages/session/use-session-commands.tsx +5 -5
- package/src/pages/session/use-session-hash-scroll.ts +1 -1
- package/src/pages/session.tsx +10 -10
- package/src/testing/session-composer.ts +2 -2
- package/src/theme-preload.test.ts +8 -8
- package/src/utils/base64.ts +1 -1
- package/src/utils/persist.test.ts +11 -11
- package/src/utils/persist.ts +4 -4
- package/src/utils/prompt.test.ts +1 -1
- package/src/utils/prompt.ts +1 -1
- package/src/utils/server-errors.test.ts +2 -2
- package/src/utils/server.ts +2 -2
- package/src/utils/sound.ts +45 -45
- package/src/utils/worktree.test.ts +1 -1
package/src/i18n/zh.ts
CHANGED
|
@@ -125,9 +125,9 @@ export const dict = {
|
|
|
125
125
|
"dialog.provider.group.popular": "热门",
|
|
126
126
|
"dialog.provider.group.other": "其他",
|
|
127
127
|
"dialog.provider.tag.recommended": "推荐",
|
|
128
|
-
"dialog.provider.
|
|
129
|
-
"dialog.provider.
|
|
130
|
-
"dialog.provider.
|
|
128
|
+
"dialog.provider.reigncode.note": "使用 ReignCode Zen 或 API 密钥连接",
|
|
129
|
+
"dialog.provider.reigncode.tagline": "可靠的优化模型",
|
|
130
|
+
"dialog.provider.reigncodeGo.tagline": "适合所有人的低成本订阅",
|
|
131
131
|
"dialog.provider.anthropic.note": "使用 Claude Pro/Max 或 API 密钥连接",
|
|
132
132
|
"dialog.provider.copilot.note": "使用 Copilot 或 API 密钥连接",
|
|
133
133
|
"dialog.provider.openai.note": "使用 ChatGPT Pro/Plus 或 API 密钥连接",
|
|
@@ -141,7 +141,7 @@ export const dict = {
|
|
|
141
141
|
"dialog.model.manage": "管理模型",
|
|
142
142
|
"dialog.model.manage.description": "自定义模型选择器中显示的模型。",
|
|
143
143
|
"dialog.model.manage.provider.toggle": "切换所有 {{provider}} 模型",
|
|
144
|
-
"dialog.model.unpaid.freeModels.title": "
|
|
144
|
+
"dialog.model.unpaid.freeModels.title": "ReignCode 提供的免费模型",
|
|
145
145
|
"dialog.model.unpaid.addMore.title": "从热门提供商添加更多模型",
|
|
146
146
|
|
|
147
147
|
"dialog.provider.viewAll": "查看更多提供商",
|
|
@@ -154,25 +154,25 @@ export const dict = {
|
|
|
154
154
|
"provider.connect.status.waiting": "等待授权...",
|
|
155
155
|
"provider.connect.status.failed": "授权失败:{{error}}",
|
|
156
156
|
"provider.connect.apiKey.description":
|
|
157
|
-
"输入你的 {{provider}} API 密钥以连接帐户,并在
|
|
157
|
+
"输入你的 {{provider}} API 密钥以连接帐户,并在 ReignCode 中使用 {{provider}} 模型。",
|
|
158
158
|
"provider.connect.apiKey.label": "{{provider}} API 密钥",
|
|
159
159
|
"provider.connect.apiKey.placeholder": "API 密钥",
|
|
160
160
|
"provider.connect.apiKey.required": "API 密钥为必填项",
|
|
161
|
-
"provider.connect.
|
|
162
|
-
"provider.connect.
|
|
163
|
-
"provider.connect.
|
|
164
|
-
"provider.connect.
|
|
165
|
-
"provider.connect.
|
|
161
|
+
"provider.connect.reigncodeZen.line1": "ReignCode Zen 为你提供一组精选的可靠优化模型,用于代码智能体。",
|
|
162
|
+
"provider.connect.reigncodeZen.line2": "只需一个 API 密钥,你就能使用 Claude、GPT、Gemini、GLM 等模型。",
|
|
163
|
+
"provider.connect.reigncodeZen.visit.prefix": "访问 ",
|
|
164
|
+
"provider.connect.reigncodeZen.visit.link": "code.reign-labs.com/zen",
|
|
165
|
+
"provider.connect.reigncodeZen.visit.suffix": " 获取你的 API 密钥。",
|
|
166
166
|
"provider.connect.oauth.code.visit.prefix": "访问 ",
|
|
167
167
|
"provider.connect.oauth.code.visit.link": "此链接",
|
|
168
|
-
"provider.connect.oauth.code.visit.suffix": " 获取授权码,以连接你的帐户并在
|
|
168
|
+
"provider.connect.oauth.code.visit.suffix": " 获取授权码,以连接你的帐户并在 ReignCode 中使用 {{provider}} 模型。",
|
|
169
169
|
"provider.connect.oauth.code.label": "{{method}} 授权码",
|
|
170
170
|
"provider.connect.oauth.code.placeholder": "授权码",
|
|
171
171
|
"provider.connect.oauth.code.required": "授权码为必填项",
|
|
172
172
|
"provider.connect.oauth.code.invalid": "授权码无效",
|
|
173
173
|
"provider.connect.oauth.auto.visit.prefix": "访问 ",
|
|
174
174
|
"provider.connect.oauth.auto.visit.link": "此链接",
|
|
175
|
-
"provider.connect.oauth.auto.visit.suffix": " 并输入以下代码,以连接你的帐户并在
|
|
175
|
+
"provider.connect.oauth.auto.visit.suffix": " 并输入以下代码,以连接你的帐户并在 ReignCode 中使用 {{provider}} 模型。",
|
|
176
176
|
"provider.connect.oauth.auto.confirmationCode": "确认码",
|
|
177
177
|
"provider.connect.toast.connected.title": "{{provider}} 已连接",
|
|
178
178
|
"provider.connect.toast.connected.description": "现在可以使用 {{provider}} 模型了。",
|
|
@@ -327,7 +327,7 @@ export const dict = {
|
|
|
327
327
|
"dialog.directory.empty": "未找到文件夹",
|
|
328
328
|
|
|
329
329
|
"dialog.server.title": "服务器",
|
|
330
|
-
"dialog.server.description": "切换此应用连接的
|
|
330
|
+
"dialog.server.description": "切换此应用连接的 ReignCode 服务器。",
|
|
331
331
|
"dialog.server.search.placeholder": "搜索服务器",
|
|
332
332
|
"dialog.server.empty": "暂无服务器",
|
|
333
333
|
"dialog.server.add.title": "添加服务器",
|
|
@@ -444,7 +444,7 @@ export const dict = {
|
|
|
444
444
|
"toast.session.unshare.failed.description": "取消分享会话时发生错误",
|
|
445
445
|
"toast.session.listFailed.title": "无法加载 {{project}} 的会话",
|
|
446
446
|
"toast.update.title": "有可用更新",
|
|
447
|
-
"toast.update.description": "
|
|
447
|
+
"toast.update.description": "ReignCode 有新版本 ({{version}}) 可安装。",
|
|
448
448
|
"toast.update.action.installRestart": "安装并重启",
|
|
449
449
|
"toast.update.action.notYet": "稍后",
|
|
450
450
|
|
|
@@ -455,7 +455,7 @@ export const dict = {
|
|
|
455
455
|
"error.page.action.checking": "检查中...",
|
|
456
456
|
"error.page.action.checkUpdates": "检查更新",
|
|
457
457
|
"error.page.action.updateTo": "更新到 {{version}}",
|
|
458
|
-
"error.page.report.prefix": "请将此错误报告给
|
|
458
|
+
"error.page.report.prefix": "请将此错误报告给 ReignCode 团队",
|
|
459
459
|
"error.page.report.discord": "在 Discord 上",
|
|
460
460
|
"error.page.version": "版本:{{version}}",
|
|
461
461
|
"error.dev.rootNotFound": "未找到根元素。你是不是忘了把它添加到 index.html?或者 id 属性拼写错了?",
|
|
@@ -472,7 +472,7 @@ export const dict = {
|
|
|
472
472
|
"error.chain.didYouMean": "你是不是想输入:{{suggestions}}",
|
|
473
473
|
"error.chain.modelNotFound": "未找到模型:{{provider}}/{{model}}",
|
|
474
474
|
"error.chain.checkConfig": "请检查你的配置 (reigncode.json) 中的 provider/model 名称",
|
|
475
|
-
"error.chain.mcpFailed": 'MCP 服务器 "{{name}}" 启动失败。注意:
|
|
475
|
+
"error.chain.mcpFailed": 'MCP 服务器 "{{name}}" 启动失败。注意: ReignCode 暂不支持 MCP 认证。',
|
|
476
476
|
"error.chain.providerAuthFailed": "提供商认证失败({{provider}}):{{message}}",
|
|
477
477
|
"error.chain.providerInitFailed": '无法初始化提供商 "{{provider}}"。请检查凭据和配置。',
|
|
478
478
|
"error.chain.configJsonInvalid": "配置文件 {{path}} 不是有效的 JSON(C)",
|
|
@@ -598,13 +598,13 @@ export const dict = {
|
|
|
598
598
|
"sidebar.workspaces.enable": "启用工作区",
|
|
599
599
|
"sidebar.workspaces.disable": "禁用工作区",
|
|
600
600
|
"sidebar.gettingStarted.title": "入门",
|
|
601
|
-
"sidebar.gettingStarted.line1": "
|
|
601
|
+
"sidebar.gettingStarted.line1": "ReignCode 提供免费模型,你可以立即开始使用。",
|
|
602
602
|
"sidebar.gettingStarted.line2": "连接任意提供商即可使用更多模型,如 Claude、GPT、Gemini 等。",
|
|
603
603
|
"sidebar.project.recentSessions": "最近会话",
|
|
604
604
|
"sidebar.project.viewAllSessions": "查看全部会话",
|
|
605
605
|
"sidebar.project.clearNotifications": "清除通知",
|
|
606
606
|
|
|
607
|
-
"app.name.desktop": "
|
|
607
|
+
"app.name.desktop": "ReignCode Desktop",
|
|
608
608
|
|
|
609
609
|
"settings.section.desktop": "桌面",
|
|
610
610
|
"settings.section.server": "服务器",
|
|
@@ -614,7 +614,7 @@ export const dict = {
|
|
|
614
614
|
|
|
615
615
|
"settings.desktop.section.wsl": "WSL",
|
|
616
616
|
"settings.desktop.wsl.title": "WSL 集成",
|
|
617
|
-
"settings.desktop.wsl.description": "在 Windows 的 WSL 环境中运行
|
|
617
|
+
"settings.desktop.wsl.description": "在 Windows 的 WSL 环境中运行 ReignCode 服务器。",
|
|
618
618
|
|
|
619
619
|
"settings.general.section.appearance": "外观",
|
|
620
620
|
"settings.general.section.notifications": "系统通知",
|
|
@@ -623,13 +623,13 @@ export const dict = {
|
|
|
623
623
|
"settings.general.section.feed": "动态",
|
|
624
624
|
"settings.general.section.display": "显示",
|
|
625
625
|
"settings.general.row.language.title": "语言",
|
|
626
|
-
"settings.general.row.language.description": "更改
|
|
626
|
+
"settings.general.row.language.description": "更改 ReignCode 的显示语言",
|
|
627
627
|
"settings.general.row.appearance.title": "外观",
|
|
628
|
-
"settings.general.row.appearance.description": "自定义
|
|
628
|
+
"settings.general.row.appearance.description": "自定义 ReignCode 在你的设备上的外观",
|
|
629
629
|
"settings.general.row.colorScheme.title": "配色方案",
|
|
630
|
-
"settings.general.row.colorScheme.description": "选择
|
|
630
|
+
"settings.general.row.colorScheme.description": "选择 ReignCode 跟随系统、浅色或深色主题",
|
|
631
631
|
"settings.general.row.theme.title": "主题",
|
|
632
|
-
"settings.general.row.theme.description": "自定义
|
|
632
|
+
"settings.general.row.theme.description": "自定义 ReignCode 的主题。",
|
|
633
633
|
"settings.general.row.font.title": "字体",
|
|
634
634
|
"settings.general.row.font.description": "自定义代码块使用的等宽字体",
|
|
635
635
|
"settings.general.row.followup.title": "跟进消息行为",
|
|
@@ -649,13 +649,13 @@ export const dict = {
|
|
|
649
649
|
"settings.general.row.releaseNotes.description": "更新后显示“新功能”弹窗",
|
|
650
650
|
|
|
651
651
|
"settings.updates.row.startup.title": "启动时检查更新",
|
|
652
|
-
"settings.updates.row.startup.description": "在
|
|
652
|
+
"settings.updates.row.startup.description": "在 ReignCode 启动时自动检查更新",
|
|
653
653
|
"settings.updates.row.check.title": "检查更新",
|
|
654
654
|
"settings.updates.row.check.description": "手动检查更新并在有更新时安装",
|
|
655
655
|
"settings.updates.action.checkNow": "立即检查",
|
|
656
656
|
"settings.updates.action.checking": "正在检查...",
|
|
657
657
|
"settings.updates.toast.latest.title": "已是最新版本",
|
|
658
|
-
"settings.updates.toast.latest.description": "你正在使用最新版本的
|
|
658
|
+
"settings.updates.toast.latest.description": "你正在使用最新版本的 ReignCode。",
|
|
659
659
|
|
|
660
660
|
"font.option.ibmPlexMono": "IBM Plex Mono",
|
|
661
661
|
"font.option.cascadiaCode": "Cascadia Code",
|
package/src/i18n/zht.ts
CHANGED
|
@@ -102,9 +102,9 @@ export const dict = {
|
|
|
102
102
|
"dialog.provider.group.popular": "熱門",
|
|
103
103
|
"dialog.provider.group.other": "其他",
|
|
104
104
|
"dialog.provider.tag.recommended": "推薦",
|
|
105
|
-
"dialog.provider.
|
|
106
|
-
"dialog.provider.
|
|
107
|
-
"dialog.provider.
|
|
105
|
+
"dialog.provider.reigncode.note": "精選模型,包含 Claude、GPT、Gemini 等等",
|
|
106
|
+
"dialog.provider.reigncode.tagline": "可靠的優化模型",
|
|
107
|
+
"dialog.provider.reigncodeGo.tagline": "適合所有人的低成本訂閱",
|
|
108
108
|
"dialog.provider.anthropic.note": "使用 Claude Pro/Max 或 API 金鑰連線",
|
|
109
109
|
"dialog.provider.openai.note": "使用 ChatGPT Pro/Plus 或 API 金鑰連線",
|
|
110
110
|
"dialog.provider.copilot.note": "使用 Copilot 或 API 金鑰連線",
|
|
@@ -119,7 +119,7 @@ export const dict = {
|
|
|
119
119
|
"dialog.model.manage.description": "自訂模型選擇器中顯示的模型。",
|
|
120
120
|
"dialog.model.manage.provider.toggle": "切換所有 {{provider}} 模型",
|
|
121
121
|
|
|
122
|
-
"dialog.model.unpaid.freeModels.title": "
|
|
122
|
+
"dialog.model.unpaid.freeModels.title": "ReignCode 提供的免費模型",
|
|
123
123
|
"dialog.model.unpaid.addMore.title": "從熱門提供者新增更多模型",
|
|
124
124
|
|
|
125
125
|
"dialog.provider.viewAll": "查看更多提供者",
|
|
@@ -132,18 +132,18 @@ export const dict = {
|
|
|
132
132
|
"provider.connect.status.waiting": "等待授權...",
|
|
133
133
|
"provider.connect.status.failed": "授權失敗: {{error}}",
|
|
134
134
|
"provider.connect.apiKey.description":
|
|
135
|
-
"輸入你的 {{provider}} API 金鑰以連線帳戶,並在
|
|
135
|
+
"輸入你的 {{provider}} API 金鑰以連線帳戶,並在 ReignCode 中使用 {{provider}} 模型。",
|
|
136
136
|
"provider.connect.apiKey.label": "{{provider}} API 金鑰",
|
|
137
137
|
"provider.connect.apiKey.placeholder": "API 金鑰",
|
|
138
138
|
"provider.connect.apiKey.required": "API 金鑰為必填",
|
|
139
|
-
"provider.connect.
|
|
140
|
-
"provider.connect.
|
|
141
|
-
"provider.connect.
|
|
142
|
-
"provider.connect.
|
|
143
|
-
"provider.connect.
|
|
139
|
+
"provider.connect.reigncodeZen.line1": "ReignCode Zen 為你提供一組精選的可靠最佳化模型,用於程式碼代理程式。",
|
|
140
|
+
"provider.connect.reigncodeZen.line2": "只需一個 API 金鑰,你就能使用 Claude、GPT、Gemini、GLM 等模型。",
|
|
141
|
+
"provider.connect.reigncodeZen.visit.prefix": "造訪 ",
|
|
142
|
+
"provider.connect.reigncodeZen.visit.link": "code.reign-labs.com/zen",
|
|
143
|
+
"provider.connect.reigncodeZen.visit.suffix": " 取得你的 API 金鑰。",
|
|
144
144
|
"provider.connect.oauth.code.visit.prefix": "造訪 ",
|
|
145
145
|
"provider.connect.oauth.code.visit.link": "此連結",
|
|
146
|
-
"provider.connect.oauth.code.visit.suffix": " 取得授權碼,以連線你的帳戶並在
|
|
146
|
+
"provider.connect.oauth.code.visit.suffix": " 取得授權碼,以連線你的帳戶並在 ReignCode 中使用 {{provider}} 模型。",
|
|
147
147
|
"provider.connect.oauth.code.label": "{{method}} 授權碼",
|
|
148
148
|
"provider.connect.oauth.code.placeholder": "授權碼",
|
|
149
149
|
"provider.connect.oauth.code.required": "授權碼為必填",
|
|
@@ -151,7 +151,7 @@ export const dict = {
|
|
|
151
151
|
"provider.connect.oauth.auto.visit.prefix": "造訪 ",
|
|
152
152
|
"provider.connect.oauth.auto.visit.link": "此連結",
|
|
153
153
|
"provider.connect.oauth.auto.visit.suffix":
|
|
154
|
-
" 並輸入以下程式碼,以連線你的帳戶並在
|
|
154
|
+
" 並輸入以下程式碼,以連線你的帳戶並在 ReignCode 中使用 {{provider}} 模型。",
|
|
155
155
|
"provider.connect.oauth.auto.confirmationCode": "確認碼",
|
|
156
156
|
"provider.connect.toast.connected.title": "{{provider}} 已連線",
|
|
157
157
|
"provider.connect.toast.connected.description": "現在可以使用 {{provider}} 模型了。",
|
|
@@ -307,7 +307,7 @@ export const dict = {
|
|
|
307
307
|
"dialog.directory.empty": "找不到資料夾",
|
|
308
308
|
|
|
309
309
|
"dialog.server.title": "伺服器",
|
|
310
|
-
"dialog.server.description": "切換此應用程式連線的
|
|
310
|
+
"dialog.server.description": "切換此應用程式連線的 ReignCode 伺服器。",
|
|
311
311
|
"dialog.server.search.placeholder": "搜尋伺服器",
|
|
312
312
|
"dialog.server.empty": "暫無伺服器",
|
|
313
313
|
"dialog.server.add.title": "新增伺服器",
|
|
@@ -437,7 +437,7 @@ export const dict = {
|
|
|
437
437
|
"toast.session.listFailed.title": "無法載入 {{project}} 的工作階段",
|
|
438
438
|
|
|
439
439
|
"toast.update.title": "有可用更新",
|
|
440
|
-
"toast.update.description": "
|
|
440
|
+
"toast.update.description": "ReignCode 有新版本 ({{version}}) 可安裝。",
|
|
441
441
|
"toast.update.action.installRestart": "安裝並重新啟動",
|
|
442
442
|
"toast.update.action.notYet": "稍後",
|
|
443
443
|
|
|
@@ -448,7 +448,7 @@ export const dict = {
|
|
|
448
448
|
"error.page.action.checking": "檢查中...",
|
|
449
449
|
"error.page.action.checkUpdates": "檢查更新",
|
|
450
450
|
"error.page.action.updateTo": "更新到 {{version}}",
|
|
451
|
-
"error.page.report.prefix": "請將此錯誤回報給
|
|
451
|
+
"error.page.report.prefix": "請將此錯誤回報給 ReignCode 團隊",
|
|
452
452
|
"error.page.report.discord": "在 Discord 上",
|
|
453
453
|
"error.page.version": "版本: {{version}}",
|
|
454
454
|
|
|
@@ -466,7 +466,7 @@ export const dict = {
|
|
|
466
466
|
"error.chain.didYouMean": "你是不是想輸入: {{suggestions}}",
|
|
467
467
|
"error.chain.modelNotFound": "找不到模型: {{provider}}/{{model}}",
|
|
468
468
|
"error.chain.checkConfig": "請檢查你的設定 (reigncode.json) 中的 provider/model 名稱",
|
|
469
|
-
"error.chain.mcpFailed": 'MCP 伺服器 "{{name}}" 啟動失敗。注意:
|
|
469
|
+
"error.chain.mcpFailed": 'MCP 伺服器 "{{name}}" 啟動失敗。注意: ReignCode 暫不支援 MCP 認證。',
|
|
470
470
|
"error.chain.providerAuthFailed": "提供者認證失敗 ({{provider}}): {{message}}",
|
|
471
471
|
"error.chain.providerInitFailed": '無法初始化提供者 "{{provider}}"。請檢查憑證和設定。',
|
|
472
472
|
"error.chain.configJsonInvalid": "設定檔 {{path}} 不是有效的 JSON(C)",
|
|
@@ -595,20 +595,20 @@ export const dict = {
|
|
|
595
595
|
"sidebar.workspaces.enable": "啟用工作區",
|
|
596
596
|
"sidebar.workspaces.disable": "停用工作區",
|
|
597
597
|
"sidebar.gettingStarted.title": "開始使用",
|
|
598
|
-
"sidebar.gettingStarted.line1": "
|
|
598
|
+
"sidebar.gettingStarted.line1": "ReignCode 提供免費模型,你可以立即開始使用。",
|
|
599
599
|
"sidebar.gettingStarted.line2": "連線任意提供者即可使用更多模型,如 Claude、GPT、Gemini 等。",
|
|
600
600
|
"sidebar.project.recentSessions": "最近工作階段",
|
|
601
601
|
"sidebar.project.viewAllSessions": "查看全部工作階段",
|
|
602
602
|
"sidebar.project.clearNotifications": "清除通知",
|
|
603
603
|
|
|
604
|
-
"app.name.desktop": "
|
|
604
|
+
"app.name.desktop": "ReignCode Desktop",
|
|
605
605
|
"settings.section.desktop": "桌面",
|
|
606
606
|
"settings.section.server": "伺服器",
|
|
607
607
|
"settings.tab.general": "一般",
|
|
608
608
|
"settings.tab.shortcuts": "快速鍵",
|
|
609
609
|
"settings.desktop.section.wsl": "WSL",
|
|
610
610
|
"settings.desktop.wsl.title": "WSL 整合",
|
|
611
|
-
"settings.desktop.wsl.description": "在 Windows 上的 WSL 中執行
|
|
611
|
+
"settings.desktop.wsl.description": "在 Windows 上的 WSL 中執行 ReignCode 伺服器。",
|
|
612
612
|
|
|
613
613
|
"settings.general.section.appearance": "外觀",
|
|
614
614
|
"settings.general.section.notifications": "系統通知",
|
|
@@ -618,13 +618,13 @@ export const dict = {
|
|
|
618
618
|
"settings.general.section.display": "顯示",
|
|
619
619
|
|
|
620
620
|
"settings.general.row.language.title": "語言",
|
|
621
|
-
"settings.general.row.language.description": "變更
|
|
621
|
+
"settings.general.row.language.description": "變更 ReignCode 的顯示語言",
|
|
622
622
|
"settings.general.row.appearance.title": "外觀",
|
|
623
|
-
"settings.general.row.appearance.description": "自訂
|
|
623
|
+
"settings.general.row.appearance.description": "自訂 ReignCode 在你的裝置上的外觀",
|
|
624
624
|
"settings.general.row.colorScheme.title": "配色方案",
|
|
625
|
-
"settings.general.row.colorScheme.description": "選擇
|
|
625
|
+
"settings.general.row.colorScheme.description": "選擇 ReignCode 要跟隨系統、淺色或深色主題",
|
|
626
626
|
"settings.general.row.theme.title": "主題",
|
|
627
|
-
"settings.general.row.theme.description": "自訂
|
|
627
|
+
"settings.general.row.theme.description": "自訂 ReignCode 的主題。",
|
|
628
628
|
"settings.general.row.font.title": "字型",
|
|
629
629
|
"settings.general.row.font.description": "自訂程式碼區塊使用的等寬字型",
|
|
630
630
|
"settings.general.row.followup.title": "後續追問行為",
|
|
@@ -646,13 +646,13 @@ export const dict = {
|
|
|
646
646
|
"settings.general.row.releaseNotes.description": "更新後顯示「新功能」彈出視窗",
|
|
647
647
|
|
|
648
648
|
"settings.updates.row.startup.title": "啟動時檢查更新",
|
|
649
|
-
"settings.updates.row.startup.description": "在
|
|
649
|
+
"settings.updates.row.startup.description": "在 ReignCode 啟動時自動檢查更新",
|
|
650
650
|
"settings.updates.row.check.title": "檢查更新",
|
|
651
651
|
"settings.updates.row.check.description": "手動檢查更新並在有更新時安裝",
|
|
652
652
|
"settings.updates.action.checkNow": "立即檢查",
|
|
653
653
|
"settings.updates.action.checking": "檢查中...",
|
|
654
654
|
"settings.updates.toast.latest.title": "已是最新版本",
|
|
655
|
-
"settings.updates.toast.latest.description": "你正在使用最新版本的
|
|
655
|
+
"settings.updates.toast.latest.description": "你正在使用最新版本的 ReignCode。",
|
|
656
656
|
|
|
657
657
|
"font.option.ibmPlexMono": "IBM Plex Mono",
|
|
658
658
|
"font.option.cascadiaCode": "Cascadia Code",
|
package/src/index.css
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { DataProvider } from "
|
|
2
|
-
import { showToast } from "
|
|
3
|
-
import { base64Encode } from "
|
|
1
|
+
import { DataProvider } from "reigncode-ui/context"
|
|
2
|
+
import { showToast } from "reigncode-ui/toast"
|
|
3
|
+
import { base64Encode } from "reigncode-util/encode"
|
|
4
4
|
import { useLocation, useNavigate, useParams } from "@solidjs/router"
|
|
5
5
|
import { createMemo, createResource, type ParentProps, Show } from "solid-js"
|
|
6
6
|
import { useGlobalSDK } from "@/context/global-sdk"
|
package/src/pages/error.tsx
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { TextField } from "
|
|
2
|
-
import { Logo } from "
|
|
3
|
-
import { Button } from "
|
|
1
|
+
import { TextField } from "reigncode-ui/text-field"
|
|
2
|
+
import { Logo } from "reigncode-ui/logo"
|
|
3
|
+
import { Button } from "reigncode-ui/button"
|
|
4
4
|
import { Component, Show, onMount } from "solid-js"
|
|
5
5
|
import { createStore } from "solid-js/store"
|
|
6
6
|
import { usePlatform } from "@/context/platform"
|
|
7
7
|
import { useLanguage } from "@/context/language"
|
|
8
|
-
import { Icon } from "
|
|
8
|
+
import { Icon } from "reigncode-ui/icon"
|
|
9
9
|
import type { E2EWindow } from "@/testing/terminal"
|
|
10
10
|
|
|
11
11
|
export type InitError = {
|
package/src/pages/home.tsx
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { createMemo, For, Match, Switch } from "solid-js"
|
|
2
|
-
import { Button } from "
|
|
3
|
-
import { Logo } from "
|
|
2
|
+
import { Button } from "reigncode-ui/button"
|
|
3
|
+
import { Logo } from "reigncode-ui/logo"
|
|
4
4
|
import { useLayout } from "@/context/layout"
|
|
5
5
|
import { useNavigate } from "@solidjs/router"
|
|
6
|
-
import { base64Encode } from "
|
|
7
|
-
import { Icon } from "
|
|
6
|
+
import { base64Encode } from "reigncode-util/encode"
|
|
7
|
+
import { Icon } from "reigncode-ui/icon"
|
|
8
8
|
import { usePlatform } from "@/context/platform"
|
|
9
9
|
import { DateTime } from "luxon"
|
|
10
|
-
import { useDialog } from "
|
|
10
|
+
import { useDialog } from "reigncode-ui/context/dialog"
|
|
11
11
|
import { DialogSelectDirectory } from "@/components/dialog-select-directory"
|
|
12
12
|
import { DialogSelectServer } from "@/components/dialog-select-server"
|
|
13
13
|
import { useServer } from "@/context/server"
|
|
@@ -36,13 +36,13 @@ export const collectOpenProjectDeepLinks = (urls: string[]) =>
|
|
|
36
36
|
export const collectNewSessionDeepLinks = (urls: string[]) =>
|
|
37
37
|
urls.map(parseNewSessionDeepLink).filter((link): link is { directory: string; prompt?: string } => !!link)
|
|
38
38
|
|
|
39
|
-
type
|
|
39
|
+
type ReignCodeWindow = Window & {
|
|
40
40
|
__REIGNCODE__?: {
|
|
41
41
|
deepLinks?: string[]
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
export const drainPendingDeepLinks = (target:
|
|
45
|
+
export const drainPendingDeepLinks = (target: ReignCodeWindow) => {
|
|
46
46
|
const pending = target.__REIGNCODE__?.deepLinks ?? []
|
|
47
47
|
if (pending.length === 0) return []
|
|
48
48
|
if (target.__REIGNCODE__) target.__REIGNCODE__.deepLinks = []
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
parseDeepLink,
|
|
7
7
|
parseNewSessionDeepLink,
|
|
8
8
|
} from "./deep-links"
|
|
9
|
-
import { type Session } from "
|
|
9
|
+
import { type Session } from "reigncode-sdk/v2/client"
|
|
10
10
|
import {
|
|
11
11
|
displayName,
|
|
12
12
|
effectiveWorkspaceOrder,
|
|
@@ -29,24 +29,24 @@ const session = (input: Partial<Session> & Pick<Session, "id" | "directory">) =>
|
|
|
29
29
|
|
|
30
30
|
describe("layout deep links", () => {
|
|
31
31
|
test("parses open-project deep links", () => {
|
|
32
|
-
expect(parseDeepLink("
|
|
32
|
+
expect(parseDeepLink("reigncode://open-project?directory=/tmp/demo")).toBe("/tmp/demo")
|
|
33
33
|
})
|
|
34
34
|
|
|
35
35
|
test("ignores non-project deep links", () => {
|
|
36
|
-
expect(parseDeepLink("
|
|
36
|
+
expect(parseDeepLink("reigncode://other?directory=/tmp/demo")).toBeUndefined()
|
|
37
37
|
expect(parseDeepLink("https://example.com")).toBeUndefined()
|
|
38
38
|
})
|
|
39
39
|
|
|
40
40
|
test("ignores malformed deep links safely", () => {
|
|
41
|
-
expect(() => parseDeepLink("
|
|
42
|
-
expect(parseDeepLink("
|
|
41
|
+
expect(() => parseDeepLink("reigncode://open-project/%E0%A4%A%")).not.toThrow()
|
|
42
|
+
expect(parseDeepLink("reigncode://open-project/%E0%A4%A%")).toBeUndefined()
|
|
43
43
|
})
|
|
44
44
|
|
|
45
45
|
test("parses links when URL.canParse is unavailable", () => {
|
|
46
46
|
const original = Object.getOwnPropertyDescriptor(URL, "canParse")
|
|
47
47
|
Object.defineProperty(URL, "canParse", { configurable: true, value: undefined })
|
|
48
48
|
try {
|
|
49
|
-
expect(parseDeepLink("
|
|
49
|
+
expect(parseDeepLink("reigncode://open-project?directory=/tmp/demo")).toBe("/tmp/demo")
|
|
50
50
|
} finally {
|
|
51
51
|
if (original) Object.defineProperty(URL, "canParse", original)
|
|
52
52
|
if (!original) Reflect.deleteProperty(URL, "canParse")
|
|
@@ -54,37 +54,37 @@ describe("layout deep links", () => {
|
|
|
54
54
|
})
|
|
55
55
|
|
|
56
56
|
test("ignores open-project deep links without directory", () => {
|
|
57
|
-
expect(parseDeepLink("
|
|
58
|
-
expect(parseDeepLink("
|
|
57
|
+
expect(parseDeepLink("reigncode://open-project")).toBeUndefined()
|
|
58
|
+
expect(parseDeepLink("reigncode://open-project?directory=")).toBeUndefined()
|
|
59
59
|
})
|
|
60
60
|
|
|
61
61
|
test("collects only valid open-project directories", () => {
|
|
62
62
|
const result = collectOpenProjectDeepLinks([
|
|
63
|
-
"
|
|
64
|
-
"
|
|
65
|
-
"
|
|
63
|
+
"reigncode://open-project?directory=/a",
|
|
64
|
+
"reigncode://other?directory=/b",
|
|
65
|
+
"reigncode://open-project?directory=/c",
|
|
66
66
|
])
|
|
67
67
|
expect(result).toEqual(["/a", "/c"])
|
|
68
68
|
})
|
|
69
69
|
|
|
70
70
|
test("parses new-session deep links with optional prompt", () => {
|
|
71
|
-
expect(parseNewSessionDeepLink("
|
|
72
|
-
expect(parseNewSessionDeepLink("
|
|
71
|
+
expect(parseNewSessionDeepLink("reigncode://new-session?directory=/tmp/demo")).toEqual({ directory: "/tmp/demo" })
|
|
72
|
+
expect(parseNewSessionDeepLink("reigncode://new-session?directory=/tmp/demo&prompt=hello%20world")).toEqual({
|
|
73
73
|
directory: "/tmp/demo",
|
|
74
74
|
prompt: "hello world",
|
|
75
75
|
})
|
|
76
76
|
})
|
|
77
77
|
|
|
78
78
|
test("ignores new-session deep links without directory", () => {
|
|
79
|
-
expect(parseNewSessionDeepLink("
|
|
80
|
-
expect(parseNewSessionDeepLink("
|
|
79
|
+
expect(parseNewSessionDeepLink("reigncode://new-session")).toBeUndefined()
|
|
80
|
+
expect(parseNewSessionDeepLink("reigncode://new-session?directory=")).toBeUndefined()
|
|
81
81
|
})
|
|
82
82
|
|
|
83
83
|
test("collects only valid new-session deep links", () => {
|
|
84
84
|
const result = collectNewSessionDeepLinks([
|
|
85
|
-
"
|
|
86
|
-
"
|
|
87
|
-
"
|
|
85
|
+
"reigncode://new-session?directory=/a",
|
|
86
|
+
"reigncode://open-project?directory=/b",
|
|
87
|
+
"reigncode://new-session?directory=/c&prompt=ship%20it",
|
|
88
88
|
])
|
|
89
89
|
expect(result).toEqual([{ directory: "/a" }, { directory: "/c", prompt: "ship it" }])
|
|
90
90
|
})
|
|
@@ -92,11 +92,11 @@ describe("layout deep links", () => {
|
|
|
92
92
|
test("drains global deep links once", () => {
|
|
93
93
|
const target = {
|
|
94
94
|
__REIGNCODE__: {
|
|
95
|
-
deepLinks: ["
|
|
95
|
+
deepLinks: ["reigncode://open-project?directory=/a"],
|
|
96
96
|
},
|
|
97
97
|
} as unknown as Window & { __REIGNCODE__?: { deepLinks?: string[] } }
|
|
98
98
|
|
|
99
|
-
expect(drainPendingDeepLinks(target)).toEqual(["
|
|
99
|
+
expect(drainPendingDeepLinks(target)).toEqual(["reigncode://open-project?directory=/a"])
|
|
100
100
|
expect(drainPendingDeepLinks(target)).toEqual([])
|
|
101
101
|
})
|
|
102
102
|
})
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createStore } from "solid-js/store"
|
|
2
2
|
import { onCleanup, Show, type Accessor } from "solid-js"
|
|
3
|
-
import { InlineInput } from "
|
|
3
|
+
import { InlineInput } from "reigncode-ui/inline-input"
|
|
4
4
|
|
|
5
5
|
export function createInlineEditorController() {
|
|
6
6
|
// This controller intentionally supports one active inline editor at a time.
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import type { Message, Session, TextPart, UserMessage } from "
|
|
2
|
-
import { Avatar } from "
|
|
3
|
-
import { HoverCard } from "
|
|
4
|
-
import { Icon } from "
|
|
5
|
-
import { IconButton } from "
|
|
6
|
-
import { MessageNav } from "
|
|
7
|
-
import { Spinner } from "
|
|
8
|
-
import { Tooltip } from "
|
|
9
|
-
import { base64Encode } from "
|
|
10
|
-
import { getFilename } from "
|
|
1
|
+
import type { Message, Session, TextPart, UserMessage } from "reigncode-sdk/v2/client"
|
|
2
|
+
import { Avatar } from "reigncode-ui/avatar"
|
|
3
|
+
import { HoverCard } from "reigncode-ui/hover-card"
|
|
4
|
+
import { Icon } from "reigncode-ui/icon"
|
|
5
|
+
import { IconButton } from "reigncode-ui/icon-button"
|
|
6
|
+
import { MessageNav } from "reigncode-ui/message-nav"
|
|
7
|
+
import { Spinner } from "reigncode-ui/spinner"
|
|
8
|
+
import { Tooltip } from "reigncode-ui/tooltip"
|
|
9
|
+
import { base64Encode } from "reigncode-util/encode"
|
|
10
|
+
import { getFilename } from "reigncode-util/path"
|
|
11
11
|
import { A, useNavigate, useParams } from "@solidjs/router"
|
|
12
12
|
import { type Accessor, createMemo, For, type JSX, Match, onCleanup, Show, Switch } from "solid-js"
|
|
13
13
|
import { useGlobalSync } from "@/context/global-sync"
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { createEffect, createMemo, For, Show, type Accessor, type JSX } from "solid-js"
|
|
2
2
|
import { createStore } from "solid-js/store"
|
|
3
|
-
import { base64Encode } from "
|
|
4
|
-
import { Button } from "
|
|
5
|
-
import { ContextMenu } from "
|
|
6
|
-
import { HoverCard } from "
|
|
7
|
-
import { Icon } from "
|
|
3
|
+
import { base64Encode } from "reigncode-util/encode"
|
|
4
|
+
import { Button } from "reigncode-ui/button"
|
|
5
|
+
import { ContextMenu } from "reigncode-ui/context-menu"
|
|
6
|
+
import { HoverCard } from "reigncode-ui/hover-card"
|
|
7
|
+
import { Icon } from "reigncode-ui/icon"
|
|
8
8
|
import { createSortable } from "@thisbeyond/solid-dnd"
|
|
9
9
|
import { useLayout, type LocalProject } from "@/context/layout"
|
|
10
10
|
import { useGlobalSync } from "@/context/global-sync"
|
|
@@ -8,8 +8,8 @@ import {
|
|
|
8
8
|
type DragEvent,
|
|
9
9
|
} from "@thisbeyond/solid-dnd"
|
|
10
10
|
import { ConstrainDragXAxis } from "@/utils/solid-dnd"
|
|
11
|
-
import { IconButton } from "
|
|
12
|
-
import { Tooltip, TooltipKeybind } from "
|
|
11
|
+
import { IconButton } from "reigncode-ui/icon-button"
|
|
12
|
+
import { Tooltip, TooltipKeybind } from "reigncode-ui/tooltip"
|
|
13
13
|
import { type LocalProject } from "@/context/layout"
|
|
14
14
|
|
|
15
15
|
export const SidebarContent = (props: {
|
|
@@ -3,16 +3,16 @@ import { createEffect, createMemo, For, Show, type Accessor, type JSX } from "so
|
|
|
3
3
|
import { createStore } from "solid-js/store"
|
|
4
4
|
import { createSortable } from "@thisbeyond/solid-dnd"
|
|
5
5
|
import { createMediaQuery } from "@solid-primitives/media"
|
|
6
|
-
import { base64Encode } from "
|
|
7
|
-
import { getFilename } from "
|
|
8
|
-
import { Button } from "
|
|
9
|
-
import { Collapsible } from "
|
|
10
|
-
import { DropdownMenu } from "
|
|
11
|
-
import { Icon } from "
|
|
12
|
-
import { IconButton } from "
|
|
13
|
-
import { Spinner } from "
|
|
14
|
-
import { Tooltip } from "
|
|
15
|
-
import { type Session } from "
|
|
6
|
+
import { base64Encode } from "reigncode-util/encode"
|
|
7
|
+
import { getFilename } from "reigncode-util/path"
|
|
8
|
+
import { Button } from "reigncode-ui/button"
|
|
9
|
+
import { Collapsible } from "reigncode-ui/collapsible"
|
|
10
|
+
import { DropdownMenu } from "reigncode-ui/dropdown-menu"
|
|
11
|
+
import { Icon } from "reigncode-ui/icon"
|
|
12
|
+
import { IconButton } from "reigncode-ui/icon-button"
|
|
13
|
+
import { Spinner } from "reigncode-ui/spinner"
|
|
14
|
+
import { Tooltip } from "reigncode-ui/tooltip"
|
|
15
|
+
import { type Session } from "reigncode-sdk/v2/client"
|
|
16
16
|
import { type LocalProject } from "@/context/layout"
|
|
17
17
|
import { useGlobalSync } from "@/context/global-sync"
|
|
18
18
|
import { useLanguage } from "@/context/language"
|