修复无法进行离线 OCR 的问题
This commit is contained in:
parent
56145bfdf9
commit
e206b502b5
3
.gitignore
vendored
3
.gitignore
vendored
@ -8,4 +8,5 @@ resources
|
||||
.DS_Store
|
||||
.exe
|
||||
|
||||
.idea
|
||||
.idea
|
||||
*.traineddata
|
@ -23,3 +23,4 @@ software/**
|
||||
|
||||
.editorconfig
|
||||
.gitattributes
|
||||
*.vsix
|
@ -12,7 +12,7 @@
|
||||
|
||||
## OpenMCP
|
||||
|
||||
一款用于 MCP 服务端调试的一体化 vscode/trae 插件。
|
||||
一款用于 MCP 服务端调试的一体化 vscode/trae/cursor 插件。
|
||||
|
||||
集成 Inspector + MCP 客户端基础功能,开发测试一体化。
|
||||
|
||||
|
4
package-lock.json
generated
4
package-lock.json
generated
@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "openmcp",
|
||||
"version": "0.0.5",
|
||||
"version": "0.0.6",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "openmcp",
|
||||
"version": "0.0.5",
|
||||
"version": "0.0.6",
|
||||
"dependencies": {
|
||||
"@modelcontextprotocol/sdk": "^1.10.2",
|
||||
"@seald-io/nedb": "^4.1.1",
|
||||
|
@ -97,6 +97,12 @@
|
||||
"title": "打开配置",
|
||||
"category": "openmcp",
|
||||
"icon": "$(gear)"
|
||||
},
|
||||
{
|
||||
"command": "openmcp.hook.test-ocr",
|
||||
"title": "测试 OCR",
|
||||
"category": "openmcp",
|
||||
"icon": "$(test)"
|
||||
}
|
||||
],
|
||||
"menus": {
|
||||
|
@ -6,7 +6,7 @@
|
||||
<div class="message-role">
|
||||
Agent
|
||||
<span class="message-reminder">
|
||||
正在生成答案
|
||||
{{ t('generate-answer') }}
|
||||
<span class="tool-loading iconfont icon-double-loading">
|
||||
</span>
|
||||
</span>
|
||||
@ -19,8 +19,11 @@
|
||||
|
||||
<script setup lang="ts">
|
||||
import { defineProps } from 'vue';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import { markdownToHtml } from '../markdown/markdown';
|
||||
|
||||
const { t } = useI18n();
|
||||
|
||||
const props = defineProps({
|
||||
streamingContent: {
|
||||
type: String,
|
||||
|
@ -9,7 +9,8 @@
|
||||
<el-dialog v-model="showSystemPromptDialog" :title="t('system-prompt')" width="600px">
|
||||
|
||||
<div v-if="!showAdd">
|
||||
<el-select v-model="tabStorage.settings.systemPrompt" placeholder="选择预设"
|
||||
<el-select v-model="tabStorage.settings.systemPrompt"
|
||||
:placeholder="t('choose-presetting')"
|
||||
style="width: 100%; margin-bottom: 20px;">
|
||||
|
||||
<el-option v-for="prompt in systemPrompts"
|
||||
@ -59,10 +60,10 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, computed, inject, watch, onMounted } from 'vue';
|
||||
import { ref, computed, inject, onMounted } from 'vue';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import { ChatStorage } from '../chat';
|
||||
import { systemPrompts, saveSystemPrompts, setSystemPrompt, loadSystemPrompts, deleteSystemPrompt } from './system-prompt';
|
||||
import { systemPrompts, setSystemPrompt, loadSystemPrompts, deleteSystemPrompt } from './system-prompt';
|
||||
import { ElMessage } from 'element-plus';
|
||||
import { debounce } from 'lodash';
|
||||
|
||||
|
@ -147,5 +147,7 @@
|
||||
"connect-sigature": "توقيع الاتصال",
|
||||
"finish-refresh": "تم التحديث",
|
||||
"add-system-prompt.name-placeholder": "عنوان prompt المخصص",
|
||||
"enter-message-dot": "أدخل الرسالة..."
|
||||
"enter-message-dot": "أدخل الرسالة...",
|
||||
"generate-answer": "جارٍ إنشاء الإجابة",
|
||||
"choose-presetting": "اختر الإعداد المسبق"
|
||||
}
|
@ -147,5 +147,7 @@
|
||||
"connect-sigature": "Verbindungssignatur",
|
||||
"finish-refresh": "Aktualisierung abgeschlossen",
|
||||
"add-system-prompt.name-placeholder": "Titel für benutzerdefinierte Eingabeaufforderung",
|
||||
"enter-message-dot": "Nachricht eingeben..."
|
||||
"enter-message-dot": "Nachricht eingeben...",
|
||||
"generate-answer": "Antwort wird generiert",
|
||||
"choose-presetting": "Voreinstellung auswählen"
|
||||
}
|
@ -147,5 +147,7 @@
|
||||
"connect-sigature": "Connection signature",
|
||||
"finish-refresh": "Refresh completed",
|
||||
"add-system-prompt.name-placeholder": "Title for custom prompt",
|
||||
"enter-message-dot": "Enter message..."
|
||||
"enter-message-dot": "Enter message...",
|
||||
"generate-answer": "Generating answer",
|
||||
"choose-presetting": "Select preset"
|
||||
}
|
@ -147,5 +147,7 @@
|
||||
"connect-sigature": "Signature de connexion",
|
||||
"finish-refresh": "Actualisation terminée",
|
||||
"add-system-prompt.name-placeholder": "Titre de l'invite personnalisée",
|
||||
"enter-message-dot": "Entrez un message..."
|
||||
"enter-message-dot": "Entrez un message...",
|
||||
"generate-answer": "Génération de la réponse",
|
||||
"choose-presetting": "Sélectionner un préréglage"
|
||||
}
|
@ -147,5 +147,7 @@
|
||||
"connect-sigature": "接続署名",
|
||||
"finish-refresh": "更新が完了しました",
|
||||
"add-system-prompt.name-placeholder": "カスタムプロンプトのタイトル",
|
||||
"enter-message-dot": "メッセージを入力..."
|
||||
"enter-message-dot": "メッセージを入力...",
|
||||
"generate-answer": "回答を生成中",
|
||||
"choose-presetting": "プリセットを選択"
|
||||
}
|
@ -147,5 +147,7 @@
|
||||
"connect-sigature": "연결 서명",
|
||||
"finish-refresh": "새로 고침 완료",
|
||||
"add-system-prompt.name-placeholder": "사용자 지정 프롬프트 제목",
|
||||
"enter-message-dot": "메시지를 입력하세요..."
|
||||
"enter-message-dot": "메시지를 입력하세요...",
|
||||
"generate-answer": "답변 생성 중",
|
||||
"choose-presetting": "프리셋 선택"
|
||||
}
|
@ -147,5 +147,7 @@
|
||||
"connect-sigature": "Подпись соединения",
|
||||
"finish-refresh": "Обновление завершено",
|
||||
"add-system-prompt.name-placeholder": "Заголовок пользовательского prompt",
|
||||
"enter-message-dot": "Введите сообщение..."
|
||||
"enter-message-dot": "Введите сообщение...",
|
||||
"generate-answer": "Генерация ответа",
|
||||
"choose-presetting": "Выбрать预设"
|
||||
}
|
@ -147,5 +147,7 @@
|
||||
"connect-sigature": "连接签名",
|
||||
"finish-refresh": "完成刷新",
|
||||
"add-system-prompt.name-placeholder": "输入自定义 prompt 的标题",
|
||||
"enter-message-dot": "输入消息..."
|
||||
"enter-message-dot": "输入消息...",
|
||||
"generate-answer": "正在生成答案",
|
||||
"choose-presetting": "选择预设"
|
||||
}
|
@ -147,5 +147,7 @@
|
||||
"connect-sigature": "連接簽名",
|
||||
"finish-refresh": "刷新完成",
|
||||
"add-system-prompt.name-placeholder": "自定義提示的標題",
|
||||
"enter-message-dot": "輸入訊息..."
|
||||
"enter-message-dot": "輸入訊息...",
|
||||
"generate-answer": "正在生成答案",
|
||||
"choose-presetting": "選擇預設"
|
||||
}
|
@ -1,5 +1,10 @@
|
||||
export let VSCODE_WORKSPACE = '';
|
||||
export let RUNNING_CWD = '';
|
||||
|
||||
export function setVscodeWorkspace(workspace: string) {
|
||||
VSCODE_WORKSPACE = workspace;
|
||||
}
|
||||
|
||||
export function setRunningCWD(path: string) {
|
||||
RUNNING_CWD = path;
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
export { routeMessage } from './common/router';
|
||||
export { VSCodeWebViewLike } from './hook/adapter';
|
||||
export { setVscodeWorkspace } from './hook/setting';
|
||||
export { setVscodeWorkspace, setRunningCWD } from './hook/setting';
|
||||
// TODO: 更加规范
|
||||
export { client } from './mcp/connect.service';
|
@ -6,6 +6,7 @@ import { diskStorage, ocrDB } from '../hook/db';
|
||||
import * as fs from 'fs';
|
||||
import * as os from 'os';
|
||||
import * as path from 'path';
|
||||
import { RUNNING_CWD } from '../hook/setting';
|
||||
|
||||
export const ocrWorkerStorage = new Map<string, OcrWorker>();
|
||||
|
||||
@ -46,12 +47,17 @@ export async function tesseractOCR(
|
||||
logger: (message: Tesseract.LoggerMessage) => void,
|
||||
lang: string = 'eng+chi_sim'
|
||||
) {
|
||||
|
||||
try {
|
||||
const { data: { text } } = await Tesseract.recognize(
|
||||
imagePath,
|
||||
lang,
|
||||
{
|
||||
logger
|
||||
logger,
|
||||
langPath: './',
|
||||
gzip: false,
|
||||
cacheMethod: 'cache',
|
||||
cachePath: RUNNING_CWD
|
||||
}
|
||||
);
|
||||
|
||||
@ -67,6 +73,10 @@ export function createOcrWorker(filename: string, webview: PostMessageble): OcrW
|
||||
const workerId = uuidv4();
|
||||
|
||||
const logger = (message: Tesseract.LoggerMessage) => {
|
||||
console.log('report ocr status');
|
||||
console.log(message);
|
||||
|
||||
|
||||
webview.postMessage({
|
||||
command: 'ocr/worker/log',
|
||||
data: {
|
||||
|
@ -4,12 +4,14 @@ import { HelpProvider } from '../sidebar/help.controller';
|
||||
import { McpWorkspaceConnectProvider } from '../sidebar/workspace.controller';
|
||||
import { McpInstalledConnectProvider } from '../sidebar/installed.controller';
|
||||
import { WebviewController } from '../webview/webview.controller';
|
||||
import { HookController } from '../hook/hook.controller';
|
||||
|
||||
export const InstallModules = [
|
||||
McpWorkspaceConnectProvider,
|
||||
McpInstalledConnectProvider,
|
||||
HelpProvider,
|
||||
WebviewController
|
||||
WebviewController,
|
||||
HookController
|
||||
];
|
||||
|
||||
const registerSingles = new Map<string, any>();
|
||||
|
@ -9,7 +9,9 @@ export function activate(context: vscode.ExtensionContext) {
|
||||
// 获取当前打开的项目的路径
|
||||
const workspaceFolder = vscode.workspace.workspaceFolders?.[0];
|
||||
const workspace = workspaceFolder?.uri.fsPath || '';
|
||||
|
||||
OpenMCPService.setVscodeWorkspace(workspace);
|
||||
OpenMCPService.setRunningCWD(context.extensionPath);
|
||||
|
||||
launch(context);
|
||||
}
|
||||
|
28
src/hook/hook.controller.ts
Normal file
28
src/hook/hook.controller.ts
Normal file
@ -0,0 +1,28 @@
|
||||
import { RegisterCommand } from "../common";
|
||||
import * as vscode from 'vscode';
|
||||
import * as path from 'path';
|
||||
import Tesseract from 'tesseract.js';
|
||||
|
||||
|
||||
export class HookController {
|
||||
|
||||
@RegisterCommand('openmcp.hook.test-ocr')
|
||||
async testOcr(context: vscode.ExtensionContext) {
|
||||
const testImage = path.join(context.extensionPath, 'icons/openmcp.resource.png');
|
||||
|
||||
const { data: { text } } = await Tesseract.recognize(
|
||||
testImage,
|
||||
'eng+chi_sim',
|
||||
{
|
||||
logger: (m) => console.log(m),
|
||||
langPath: './',
|
||||
gzip: false,
|
||||
cacheMethod: 'cache',
|
||||
cachePath: context.extensionPath
|
||||
}
|
||||
);
|
||||
|
||||
vscode.window.showInformationMessage('ocr result: ' + text);
|
||||
}
|
||||
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user