diff --git a/.github/ISSUE_TEMPLATE/0_bug_report.yml b/.github/ISSUE_TEMPLATE/0_bug_report.yml index 268f5a98..3b0515d5 100644 --- a/.github/ISSUE_TEMPLATE/0_bug_report.yml +++ b/.github/ISSUE_TEMPLATE/0_bug_report.yml @@ -6,7 +6,8 @@ body: - type: markdown attributes: value: | - Thanks for taking the time to fill out this bug report! + Thank you for taking the time to fill out this bug report! + Before submitting this issue, please make sure that you have understood the [FAQ](https://docs.cherry-ai.com/question-contact/questions) and [Knowledge Science](https://docs.cherry-ai.com/question-contact/knowledge) - type: checkboxes id: checklist @@ -15,9 +16,11 @@ body: description: | Before submitting an issue, please make sure you have completed the following steps options: - - label: I have viewed the pinned issues and searched existing issues but couldn't find anything similar. + - label: I understand that issues are for feedback and problem solving, not for complaining in the comment section, and will provide as much information as possible to help solve the problem. required: true - - label: I have filled out the issue title correctly. + - label: I've looked at pinned issues and searched for existing [Open Issues](https://github.com/CherryHQ/cherry-studio/issues) and [Closed Issues]( https://github.com/CherryHQ/cherry-studio/issues?q=is%3Aissue%20state%3Aclosed%20), no similar issue was found. + required: true + - label: I've filled in short, clear headings so that developers can quickly identify a rough idea of what to expect when flipping through the list of issues. And not "a suggestion", "stuck", etc. required: true - type: dropdown @@ -45,7 +48,7 @@ body: id: description attributes: label: Bug Description - description: A clear and concise description of what the bug is + description: Please be as detailed as possible when describing the problem placeholder: Tell us what happened... validations: required: true @@ -54,7 +57,7 @@ body: id: reproduction attributes: label: Steps To Reproduce - description: Steps to reproduce the behavior + description: Provide detailed steps to reproduce the issue so that our developers can reproduce the issue accurately placeholder: | 1. Go to '...' 2. Click on '....' @@ -82,4 +85,4 @@ body: id: additional attributes: label: Additional Context - description: Add any other context about the problem here + description: Anything that gives us a better understanding of the problem you're experiencing diff --git a/.github/ISSUE_TEMPLATE/1_feature_request.yml b/.github/ISSUE_TEMPLATE/1_feature_request.yml index be3beff4..831b5f10 100644 --- a/.github/ISSUE_TEMPLATE/1_feature_request.yml +++ b/.github/ISSUE_TEMPLATE/1_feature_request.yml @@ -6,7 +6,8 @@ body: - type: markdown attributes: value: | - Thanks for taking the time to suggest a new feature! + Thank you for taking the time to submit a feature request! + Before submitting this issue, please make sure you have reviewed the [Project Roadmap](https://docs.cherry-ai.com/cherrystudio/planning) and the [Feature Overview](https://docs.cherry-ai.com/cherrystudio/preview). - type: checkboxes id: checklist @@ -15,9 +16,13 @@ body: description: | Before submitting an issue, please make sure you have completed the following steps options: - - label: I have viewed the pinned issues and searched existing issues but couldn't find anything similar. + - label: I understand that issues are for reporting problems and requesting features, not for off-topic comments, and I will provide as much detail as possible to help resolve the issue. required: true - - label: I have filled out the issue title correctly. + - label: I have checked the pinned issues and searched through the existing [open issues](https://github.com/CherryHQ/cherry-studio/issues) and [closed issues](https://github.com/CherryHQ/cherry-studio/issues?q=is%3Aissue%20state%3Aclosed) and did not find a similar suggestion. + required: true + - label: I have provided a short and descriptive title so that developers can quickly understand the issue when browsing the issue list, rather than vague titles like "A suggestion" or "Stuck." + required: true + - label: The latest version of Cherry Studio does not include the feature I am suggesting. required: true - type: dropdown @@ -44,28 +49,28 @@ body: - type: textarea id: problem attributes: - label: Is your feature request related to a problem? - description: A clear and concise description of what the problem is - placeholder: I'm always frustrated when... + label: Is your feature request related to an existing issue? + description: Please briefly describe the problem you are experiencing. + placeholder: I often feel frustrated because... validations: required: true - type: textarea id: solution attributes: - label: Describe the solution you'd like - description: A clear and concise description of what you want to happen + label: Desired Solution + description: Please briefly describe what you would like to happen. validations: required: true - type: textarea id: alternatives attributes: - label: Describe alternatives you've considered - description: A clear and concise description of any alternative solutions or features you've considered + label: Alternative Solutions + description: Please briefly describe any alternative solutions or features you have considered. - type: textarea id: additional attributes: - label: Additional Context - description: Add any other context or screenshots about the feature request here + label: Additional Information + description: Add any other context or screenshots related to your feature request. diff --git a/.github/ISSUE_TEMPLATE/2_question.yml b/.github/ISSUE_TEMPLATE/2_question.yml index 20a751ac..d191daf7 100644 --- a/.github/ISSUE_TEMPLATE/2_question.yml +++ b/.github/ISSUE_TEMPLATE/2_question.yml @@ -1,12 +1,12 @@ -name: ❓ Question -description: Ask a question or seek help -title: '[Question]: ' +name: ❓ Discussion & Questions +description: Seeking help, discussing issues, asking questions, etc... +title: '[Discussion]: ' labels: ['question'] body: - type: markdown attributes: value: | - Thanks for asking a question! Please provide as much detail as possible so we can better assist you. + Thank you for your question! Please describe your issue in as much detail as possible so that we can better assist you. - type: checkboxes id: checklist @@ -15,9 +15,9 @@ body: description: | Before submitting an issue, please make sure you have completed the following steps options: - - label: I have viewed the pinned issues and searched existing issues but couldn't find anything similar. + - label: I understand that issues are meant for feedback and problem-solving, not for venting, and I will provide as much detail as possible to help resolve the issue. required: true - - label: I have filled out the issue title correctly. + - label: I confirm that I am here to ask questions and discuss issues, not to report bugs or request features. required: true - type: dropdown @@ -45,8 +45,8 @@ body: id: question attributes: label: Your Question - description: Please describe your question in detail - placeholder: Please explain your question as clearly as possible... + description: Please describe your issue in detail. + placeholder: Please explain your issue as clearly as possible... validations: required: true @@ -68,9 +68,9 @@ body: id: priority attributes: label: Priority - description: How urgent is this question for you? + description: How urgent is this issue for you? options: - - Low (Can wait) + - Low (Review when available) - Medium (Would like a response soon) - High (Blocking progress) validations: diff --git a/.github/ISSUE_TEMPLATE/#0_bug_report.yml b/.github/issues/#0_bug_report.yml similarity index 62% rename from .github/ISSUE_TEMPLATE/#0_bug_report.yml rename to .github/issues/#0_bug_report.yml index e94faa9b..9e33cc57 100644 --- a/.github/ISSUE_TEMPLATE/#0_bug_report.yml +++ b/.github/issues/#0_bug_report.yml @@ -1,4 +1,4 @@ -name: 🐛 错误报告 +name: 🐛 错误报告 (中文) description: 创建一个报告以帮助我们改进 title: '[错误]: ' labels: ['bug'] @@ -7,17 +7,20 @@ body: attributes: value: | 感谢您花时间填写此错误报告! + 在提交此问题之前,请确保您已经了解了[常见问题](https://docs.cherry-ai.com/question-contact/questions)和[知识科普](https://docs.cherry-ai.com/question-contact/knowledge) - type: checkboxes id: checklist attributes: - label: Issue 检查清单 + label: 提交前检查 description: | 在提交 Issue 前请确保您已经完成了以下所有步骤 options: - - label: 我已经查看了置顶 Issue 并搜索了现有的 Issue,但没有找到类似的问题。 + - label: 我理解 Issue 是用于反馈和解决问题的,而非吐槽评论区,将尽可能提供更多信息帮助问题解决。 required: true - - label: 正确填写了 Issue 标题。 + - label: 我已经查看了置顶 Issue 并搜索了现有的 [开放Issue](https://github.com/CherryHQ/cherry-studio/issues)和[已关闭Issue](https://github.com/CherryHQ/cherry-studio/issues?q=is%3Aissue%20state%3Aclosed%20),没有找到类似的问题。 + required: true + - label: 我填写了简短且清晰明确的标题,以便开发者在翻阅 Issue 列表时能快速确定大致问题。而不是“一个建议”、“卡住了”等。 required: true - type: dropdown @@ -45,7 +48,7 @@ body: id: description attributes: label: 错误描述 - description: 清晰简洁地描述错误是什么 + description: 描述问题时请尽可能详细 placeholder: 告诉我们发生了什么... validations: required: true @@ -54,7 +57,7 @@ body: id: reproduction attributes: label: 重现步骤 - description: 重现行为的步骤 + description: 提供详细的重现步骤,以便于我们可以准确地重现问题 placeholder: | 1. 转到 '...' 2. 点击 '....' @@ -82,4 +85,4 @@ body: id: additional attributes: label: 附加信息 - description: 在此添加有关问题的任何其他上下文 + description: 任何能让我们对你所遇到的问题有更多了解的东西 diff --git a/.github/ISSUE_TEMPLATE/#1_feature_request.yml b/.github/issues/#1_feature_request.yml similarity index 63% rename from .github/ISSUE_TEMPLATE/#1_feature_request.yml rename to .github/issues/#1_feature_request.yml index 5c26d7d8..00aae56f 100644 --- a/.github/ISSUE_TEMPLATE/#1_feature_request.yml +++ b/.github/issues/#1_feature_request.yml @@ -1,4 +1,4 @@ -name: 💡 功能建议 +name: 💡 功能建议 (中文) description: 为项目提出新的想法 title: '[功能]: ' labels: ['enhancement'] @@ -7,17 +7,22 @@ body: attributes: value: | 感谢您花时间提出新的功能建议! + 在提交此问题之前,请确保您已经了解了[项目规划](https://docs.cherry-ai.com/cherrystudio/planning)和[功能介绍](https://docs.cherry-ai.com/cherrystudio/preview) - type: checkboxes id: checklist attributes: - label: Issue 检查清单 + label: 提交前检查 description: | 在提交 Issue 前请确保您已经完成了以下所有步骤 options: - - label: 我已经查看了置顶 Issue 并搜索了现有的 Issue,但没有找到类似的问题。 + - label: 我理解 Issue 是用于反馈和解决问题的,而非吐槽评论区,将尽可能提供更多信息帮助问题解决。 required: true - - label: 正确填写了 Issue 标题。 + - label: 我已经查看了置顶 Issue 并搜索了现有的 [开放Issue](https://github.com/CherryHQ/cherry-studio/issues)和[已关闭Issue](https://github.com/CherryHQ/cherry-studio/issues?q=is%3Aissue%20state%3Aclosed%20),没有找到类似的建议。 + required: true + - label: 我填写了简短且清晰明确的标题,以便开发者在翻阅 Issue 列表时能快速确定大致问题。而不是“一个建议”、“卡住了”等。 + required: true + - label: 最新的 Cherry Studio 版本没有实现我所提出的功能。 required: true - type: dropdown @@ -44,7 +49,7 @@ body: - type: textarea id: problem attributes: - label: 您的功能建议是否与某个问题相关? + label: 您的功能建议是否与某个问题/issue相关? description: 请简明扼要地描述您遇到的问题 placeholder: 我总是感到沮丧,因为... validations: diff --git a/.github/ISSUE_TEMPLATE/#2_question.yml b/.github/issues/#2_question.yml similarity index 82% rename from .github/ISSUE_TEMPLATE/#2_question.yml rename to .github/issues/#2_question.yml index faff6806..f3566ce6 100644 --- a/.github/ISSUE_TEMPLATE/#2_question.yml +++ b/.github/issues/#2_question.yml @@ -1,6 +1,6 @@ -name: ❓ 提问 -description: 提出一个问题或寻求帮助 -title: '[问题]: ' +name: ❓ 讨论 & 提问 (中文) +description: 寻求帮助、讨论问题、提出疑问等... +title: '[讨论]: ' labels: ['question'] body: - type: markdown @@ -15,9 +15,9 @@ body: description: | 在提交 Issue 前请确保您已经完成了以下所有步骤 options: - - label: 我已经查看了置顶 Issue 并搜索了现有的 Issue,但没有找到类似的问题。 + - label: 我理解 Issue 是用于反馈和解决问题的,而非吐槽评论区,将尽可能提供更多信息帮助问题解决。 required: true - - label: 正确填写了 Issue 标题。 + - label: 我确认自己需要的是提出问题并且讨论问题,而不是 Bug 反馈或需求建议。 required: true - type: dropdown diff --git a/electron-builder.yml b/electron-builder.yml index afec407a..1f3e8eed 100644 --- a/electron-builder.yml +++ b/electron-builder.yml @@ -80,11 +80,9 @@ afterPack: scripts/after-pack.js afterSign: scripts/notarize.js releaseInfo: releaseNotes: | - 增加服务商 LM Studio、魔搭、Perplexity、无问芯穹、DMXAPI - 提及功能支持上下按键循环选择模型 - 小程序增加小艺 - 增加Notion连接检测功能 - 编辑模型弹窗搜索模型时,同时搜索模型的名字和ID - 编辑模型弹窗增加推理模型筛选按钮 - 修复思考模型思考时间显示错误 - 修复部分模型翻译出错 + 消息分组支持网格模式 + 知识库支持多选 + 支持库增加 DRAFTS, EPUB + 知识库支持调节匹配度阈值 + 添加 NotebookLM, Coze 小程序 + 增加话题提示词 diff --git a/package.json b/package.json index 23da2cdf..f7868716 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "CherryStudio", - "version": "0.9.24", + "version": "0.9.25", "private": true, "description": "A powerful AI assistant for producer.", "main": "./out/main/index.js", @@ -137,7 +137,7 @@ "redux": "^5.0.1", "redux-persist": "^6.0.0", "rehype-katex": "^7.0.1", - "rehype-mathjax": "^6.0.0", + "rehype-mathjax": "^7.0.0", "rehype-raw": "^7.0.0", "remark-gfm": "^4.0.0", "remark-math": "^6.0.0", diff --git a/packages/shared/config/constant.ts b/packages/shared/config/constant.ts index c39b1370..1c7b5758 100644 --- a/packages/shared/config/constant.ts +++ b/packages/shared/config/constant.ts @@ -2,6 +2,7 @@ export const imageExts = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp'] export const videoExts = ['.mp4', '.avi', '.mov', '.wmv', '.flv', '.mkv'] export const audioExts = ['.mp3', '.wav', '.ogg', '.flac', '.aac'] export const documentExts = ['.pdf', '.docx', '.pptx', '.xlsx', '.odt', '.odp', '.ods'] +export const thirdPartyApplicationExts = ['.draftsExport'] export const bookExts = ['.epub'] export const textExts = [ '.txt', // 普通文本文件 diff --git a/src/main/loader/draftsExportLoader.ts b/src/main/loader/draftsExportLoader.ts new file mode 100644 index 00000000..4ad1806b --- /dev/null +++ b/src/main/loader/draftsExportLoader.ts @@ -0,0 +1,22 @@ +import * as fs from 'node:fs' + +import { JsonLoader } from '@llm-tools/embedjs' + +/** + * Drafts 应用导出的笔记文件加载器 + * 原始文件是一个 JSON 数组。每条笔记只保留 content、tags、modified_at 三个字段 + */ +export class DraftsExportLoader extends JsonLoader { + constructor(filePath: string) { + const fileContent = fs.readFileSync(filePath, 'utf-8') + const rawJson = JSON.parse(fileContent) as any[] + const json = rawJson.map((item) => { + return { + content: item.content?.replace(/\n/g, '
'), + tags: item.tags, + modified_at: item.created_at + } + }) + super({ object: json }) + } +} diff --git a/src/main/loader/index.ts b/src/main/loader/index.ts index 3cc1d1af..f23c58b1 100644 --- a/src/main/loader/index.ts +++ b/src/main/loader/index.ts @@ -1,17 +1,18 @@ import * as fs from 'node:fs' -import { LocalPathLoader, RAGApplication, TextLoader } from '@llm-tools/embedjs' +import { JsonLoader, LocalPathLoader, RAGApplication, TextLoader } from '@llm-tools/embedjs' import type { AddLoaderReturn } from '@llm-tools/embedjs-interfaces' import { WebLoader } from '@llm-tools/embedjs-loader-web' import { LoaderReturn } from '@shared/config/types' import { FileType, KnowledgeBaseParams } from '@types' import Logger from 'electron-log' +import { DraftsExportLoader } from './draftsExportLoader' import { EpubLoader } from './epubLoader' import { OdLoader, OdType } from './odLoader' // embedjs内置loader类型 -const commonExts = ['.pdf', '.csv', '.json', '.docx', '.pptx', '.xlsx', '.md'] +const commonExts = ['.pdf', '.csv', '.docx', '.pptx', '.xlsx', '.md'] export async function addOdLoader( ragApplication: RAGApplication, @@ -89,7 +90,19 @@ export async function addFileLoader( } as LoaderReturn } + // DraftsExport类型 (file.ext会自动转换成小写) + if (['.draftsexport'].includes(file.ext)) { + const loaderReturn = await ragApplication.addLoader(new DraftsExportLoader(file.path) as any, forceReload) + return { + entriesAdded: loaderReturn.entriesAdded, + uniqueId: loaderReturn.uniqueId, + uniqueIds: [loaderReturn.uniqueId], + loaderType: loaderReturn.loaderType + } + } + const fileContent = fs.readFileSync(file.path, 'utf-8') + // HTML类型 if (['.html', '.htm'].includes(file.ext)) { const loaderReturn = await ragApplication.addLoader( @@ -108,6 +121,18 @@ export async function addFileLoader( } } + // JSON类型 + if (['.json'].includes(file.ext)) { + const jsonObject = JSON.parse(fileContent) + const loaderReturn = await ragApplication.addLoader(new JsonLoader({ object: jsonObject })) + return { + entriesAdded: loaderReturn.entriesAdded, + uniqueId: loaderReturn.uniqueId, + uniqueIds: [loaderReturn.uniqueId], + loaderType: loaderReturn.loaderType + } + } + // 文本类型 const loaderReturn = await ragApplication.addLoader( new TextLoader({ text: fileContent, chunkSize: base.chunkSize, chunkOverlap: base.chunkOverlap }) as any, diff --git a/src/main/services/ShortcutService.ts b/src/main/services/ShortcutService.ts index 5f03ac51..d9920981 100644 --- a/src/main/services/ShortcutService.ts +++ b/src/main/services/ShortcutService.ts @@ -47,8 +47,8 @@ function formatShortcutKey(shortcut: string[]): string { function handleZoom(delta: number) { return (window: BrowserWindow) => { - const currentZoom = window.webContents.getZoomFactor() - const newZoom = currentZoom + delta + const currentZoom = configManager.getZoomFactor() + const newZoom = Number((currentZoom + delta).toFixed(1)) if (newZoom >= 0.1 && newZoom <= 5.0) { window.webContents.setZoomFactor(newZoom) configManager.setZoomFactor(newZoom) @@ -110,7 +110,9 @@ const convertShortcutRecordedByKeyboardEventKeyValueToElectronGlobalShortcutForm } export function registerShortcuts(window: BrowserWindow) { - window.webContents.setZoomFactor(configManager.getZoomFactor()) + window.once('ready-to-show', () => { + window.webContents.setZoomFactor(configManager.getZoomFactor()) + }) const register = () => { if (window.isDestroyed()) return diff --git a/src/renderer/index.html b/src/renderer/index.html index 53db584f..19a44594 100644 --- a/src/renderer/index.html +++ b/src/renderer/index.html @@ -6,6 +6,7 @@ + Cherry Studio