const fs = require('fs'); const path = require('path'); const root = path.join(__dirname, '..', 'fs-service', 'src', 'main', 'java'); const files = { 'com/fs/company/service/workflow/profile/panel/ProfilePromptEnrichmentHelper.java': null, 'com/fs/company/service/workflow/profile/panel/CustomerProfileCallTrajectoryService.java': null, 'com/fs/company/service/workflow/profile/panel/CustomerProfileBehaviorTrajectoryService.java': null, 'com/fs/company/service/workflow/profile/panel/CustomerProfileMediaTrajectoryService.java': null, 'com/fs/company/service/workflow/profile/panel/ProfileListAggregateHelper.java': null, 'com/fs/company/service/workflow/profile/panel/ProfileStatsSnapshot.java': null, 'com/fs/company/service/workflow/profile/panel/ProfileStatsDelta.java': null, 'com/fs/company/service/workflow/profile/panel/ProfileSummaryProjectionSync.java': null, 'com/fs/company/service/workflow/profile/panel/ConversationSummaryViewHelper.java': null, 'com/fs/company/service/workflow/profile/panel/CustomerProfileFactLoader.java': null, 'com/fs/company/service/workflow/profile/LobsterProfileStatsRecorder.java': null, 'com/fs/company/service/workflow/profile/LobsterProfileStatsService.java': null, 'com/fs/company/service/workflow/trigger/TimeIntentDetector.java': null, 'com/fs/company/service/workflow/canvas/WorkflowCanvasSyncUtil.java': null, 'com/fs/company/service/workflow/ILobsterBindingExecStatsService.java': null, 'com/fs/company/service/workflow/execution/LobsterBindingProvisionServiceImpl.java': null, 'com/fs/company/service/workflow/impl/LobsterInstanceOpsService.java': null, 'com/fs/company/service/workflow/learning/impl/LobsterSkillManageServiceImpl.java': null, }; const replacements = [ [/\?\?\?/g, '__TRIPLE_Q__'], ]; function applyTextFixes(content, relPath) { let s = content; const patch = { 'com/fs/company/service/workflow/profile/panel/ProfileListAggregateHelper.java': [ [/ \* .*Hub.*\n/, ' * 锟叫憋拷 Hub 锟桔猴拷锟侥帮拷锟斤拷锟饺讹拷锟斤拷锟斤拷 + 锟斤拷锟斤拷摘要 + 锟斤拷锟斤拷锟街讹拷 锟斤拷 锟斤拷锟斤拷锟斤拷/锟叫憋拷展示锟斤拷\n'], ], 'com/fs/company/service/workflow/profile/panel/ProfileStatsSnapshot.java': [ [/ \* .*lobster_profile_stats.*\n/, ' * 锟斤拷锟斤拷统锟狡匡拷锟秸o拷锟斤拷应 lobster_profile_stats锟斤拷锟斤拷\n'], ], 'com/fs/company/service/workflow/profile/panel/ProfileStatsDelta.java': [ [/ \* .*\\n \*\/\npublic final class ProfileStatsDelta/, ' * 锟斤拷锟斤拷统锟斤拷锟斤拷锟斤拷锟斤拷前锟斤拷锟斤拷詹睿╋拷锟絓n */\npublic final class ProfileStatsDelta'], ], 'com/fs/company/service/workflow/profile/panel/ConversationSummaryViewHelper.java': [ [/ \* .*extendedSummary.*\n/, ' * 锟斤拷锟结话摘要实锟斤拷转为锟斤拷锟?锟斤拷锟斤拷时锟斤拷锟矫的结构锟斤拷锟斤拷图锟斤拷锟斤拷 11 维 extendedSummary锟斤拷锟斤拷\n'], ], 'com/fs/company/service/workflow/profile/panel/CustomerProfileFactLoader.java': [ [/ \* .*customer_fact.*\n/, ' * 锟斤拷 customer_fact / customer_habit 锟斤拷锟斤拷锟饺讹拷锟斤拷锟今,合诧拷锟斤拷锟斤拷 profile 锟斤拷图锟斤拷\n'], ], 'com/fs/company/service/workflow/profile/panel/ProfileSummaryProjectionSync.java': [ [/ \* .*\\n \*\/\npublic final class ProfileSummaryProjectionSync/, ' * 锟结话摘要写锟诫画锟斤拷锟绞憋拷锟酵队帮拷侄锟酵拷锟斤拷锟斤拷摺锟絓n */\npublic final class ProfileSummaryProjectionSync'], [/clipPreview\("[^"]*"/g, 'clipPreview("锟斤拷锟阶段★拷'], [/ \+ " [^"]* " \+ snippet/g, ' + "锟斤拷" + snippet'], [/PREVIEW_MAX\) \+ "[^"]*"/g, 'PREVIEW_MAX) + "锟斤拷"'], ], 'com/fs/company/service/workflow/profile/LobsterProfileStatsRecorder.java': [ [/ \* .*\\n \*\/\n@Component/, ' * 锟斤拷锟斤拷写锟斤拷蟠シ锟酵筹拷票锟斤拷锟斤拷锟斤拷锟斤拷隆锟絓n */\n@Component'], ], 'com/fs/company/service/workflow/profile/LobsterProfileStatsService.java': [ [/ \* .*\\n \*\/\n@Service/, ' * 锟酵伙拷锟斤拷锟斤拷统锟斤拷锟叫硷拷悖猴拷锟斤拷锟斤拷锟斤拷锟?+ 锟斤拷锟斤拷锟斤拷锟姐(锟角讹拷时全锟斤拷扫锟借)锟斤拷\n */\n@Service'], ], 'com/fs/company/service/workflow/trigger/TimeIntentDetector.java': [ [/ \* .*waitUntil.*\n/, ' * 锟接客伙拷锟斤拷息锟斤拷锟斤拷约锟斤拷时锟斤拷锟斤拷图锟斤拷锟斤拷锟斤拷 waitUntil 锟节点。\n'], [/\\[\\u70b9:\?\?\]/g, '[\\u70b9:\\uFF1A]'], [/\\[:\\?\\?\]/g, '[:\\uFF1A]'], ], 'com/fs/company/service/workflow/canvas/WorkflowCanvasSyncUtil.java': [ [/ \* .*nextNodeCode \*\//, ' * 锟斤拷 branches 锟斤拷 legacy nextNode 锟斤拷一为 nextNodeCode */'], ], 'com/fs/company/service/workflow/ILobsterBindingExecStatsService.java': [ [/ \* .*\\n \*\/\npublic interface ILobsterBindingExecStatsService/, ' * 锟斤拷执锟斤拷统锟狡o拷锟斤拷锟斤拷 + 刷锟铰o拷锟斤拷\n */\npublic interface ILobsterBindingExecStatsService'], ], 'com/fs/company/service/workflow/execution/LobsterBindingProvisionServiceImpl.java': [ [/ \* .*rel.*\\n \*\/\n@Service/, ' * 锟襟定匡拷通锟斤拷锟斤拷 rel 锟斤拷锟斤拷锟斤拷锟缴达拷锟斤拷锟斤拷锟斤拷锟届步锟斤拷锟斤拷锟斤拷锟斤拷\n */\n@Service'], [/setTaskName\("\?\?\?" \+ channelType \+ "\?\?\?\?\?"\)/, 'setTaskName("锟斤拷" + channelType + "锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷")'], ], 'com/fs/company/service/workflow/learning/impl/LobsterSkillManageServiceImpl.java': [ [/sb\.append\("\?\?\?\["\)/, 'sb.append("锟节碉拷["'], [/append\("\] \?\?\?\?\? \("/, 'append("] 锟斤拷锟斤拷锟斤拷锟截革拷 (")'], [/sb\.append\("\?\?\?: "\)/, 'sb.append("锟酵伙拷: ")'], [/sb\.append\("\?\?\?: "\)/, 'sb.append("锟截革拷: ")'], ], 'com/fs/company/service/workflow/impl/LobsterInstanceOpsService.java': [ [/result\.put\("message", "\?\?\?\?\?\?\?\?\?\?"\)/, 'result.put("message", "未选锟斤拷锟轿猴拷实锟斤拷")'], [/errors\.add\("\?\?\? " \+ instanceId \+ " \?\?\?\?\?\?\?\?\?"\)/, 'errors.add("实锟斤拷 " + instanceId + " 锟斤拷权锟睫或不达拷锟斤拷")'], [/ajax\.get\("msg"\) : "\?\?\?\?"\)/, 'ajax.get("msg") : "锟斤拷锟斤拷失锟斤拷")'], [/errors\.add\("\?\?\? " \+ instanceId \+ ": "/, 'errors.add("实锟斤拷 " + instanceId + ": "'], [/split\("\[,;[^\]]+\]"\)/, 'split("[,;锟斤拷锟斤拷]")'], [/\? \("\?\?\?\?\? " \+ success \+ " \?\?\?\?\?" \+ \(skipped > 0 \? "\?\?\?\?\?\? " \+ skipped \+ " \?\?" : ""\)\)/, '? ("锟斤拷锟斤拷止 " + success + " 锟斤拷实锟斤拷" + (skipped > 0 ? "锟斤拷锟斤拷锟斤拷 " + skipped + " 锟斤拷" : "") )'], [/:\("\?\?\?\?\?\? " \+ success \+ " \?\?\?\?\?" \+ \(skipped > 0 \? "\?\?\?\?\?\? " \+ skipped \+ " \?\?" : ""\)\)/, ': ("锟斤拷锟叫伙拷锟剿癸拷 " + success + " 锟斤拷实锟斤拷" + (skipped > 0 ? "锟斤拷锟斤拷锟斤拷 " + skipped + " 锟斤拷" : "") )'], ], }; const rules = patch[relPath]; if (rules) { for (const [pattern, repl] of rules) { s = s.replace(pattern, repl); } } return s; } function hasGarbled(content) { return /\?\?\?/.test(content) || /[\u0080-\u00ff]{3,}/.test(content) || /?/.test(content); } console.log('Scanning for garbled Java files under fs-service...'); const all = []; function walk(dir) { for (const ent of fs.readdirSync(dir, { withFileTypes: true })) { const p = path.join(dir, ent.name); if (ent.isDirectory()) walk(p); else if (ent.name.endsWith('.java')) all.push(p); } } walk(root); const garbled = all.filter(p => { const c = fs.readFileSync(p, 'utf8'); return hasGarbled(c); }); console.log('Garbled files:', garbled.length); garbled.forEach(p => console.log(' -', path.relative(root, p))); for (const rel of Object.keys(files)) { const full = path.join(root, rel.replace(/\//g, path.sep)); if (!fs.existsSync(full)) continue; const before = fs.readFileSync(full, 'utf8'); const after = applyTextFixes(before, rel); if (after !== before) { fs.writeFileSync(full, after, 'utf8'); console.log('Patched', rel); } }