1. 目录 mcn-work-shop -> mcn-workshop(空间分组名取会话 cwd 的目录名,只改字符串无效,必须真改名) 2. 全仓替换 mcn-work-shop -> mcn-workshop:37 文件 121 处;历史日志按沿革句规矩保留当时目录名 3. 任务进度可见:/api/run/status 产出 已运行时长/工具调用/最近动作/停滞判定(读会话日志尾部),前端新增右下角常驻面板,四处任务入口接入 4. 会话归属目录配置化:新增 config.sessionCwd(留空=工作台自身目录),现指向 D://AI技能//mcn-workshop,使任务显示为命名分组而非「未分组任务」 5. 修前端轮询静默缺陷:连续 3 次查询失败即提示服务断开(原逻辑静默空转到 15 分钟超时,用户零感知)
55 lines
2.2 KiB
JavaScript
55 lines
2.2 KiB
JavaScript
// 解析 app.asar 找 skills_json 消费逻辑
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
const asarPath = 'C:/Users/maidou/AppData/Local/Programs/WorkBuddy/resources/app.asar';
|
|
const buf = fs.readFileSync(asarPath);
|
|
|
|
// 新版 asar 多重 pickle 头:@0=4, @4=headerSize+4, @8=headerSize, @12=JSON长度, @16=JSON
|
|
const headerLen = buf.readUInt32LE(12);
|
|
let pos = 16;
|
|
const header = JSON.parse(buf.slice(pos, pos + headerLen).toString('utf8'));
|
|
|
|
// 遍历文件树找含 skills_json 的 js 文件(全量,不限目录)
|
|
const hits = [];
|
|
function walk(node, prefix) {
|
|
if (!node.files) return;
|
|
for (const name of Object.keys(node.files)) {
|
|
const f = node.files[name];
|
|
const full = prefix + '/' + name;
|
|
if (f.files) { walk(f, full); }
|
|
else if (/\.(js|cjs|mjs|ts)$/.test(name)) {
|
|
hits.push({ full, offset: f.offset, size: f.size });
|
|
}
|
|
}
|
|
}
|
|
walk(header, '');
|
|
|
|
// 逐个读取含 skills_json 的文件片段
|
|
const TARGET = Buffer.from('skills_json');
|
|
const results = [];
|
|
for (const h of hits) {
|
|
const start = pos + h.offset;
|
|
const chunk = buf.slice(start, start + h.size);
|
|
if (chunk.includes(TARGET)) {
|
|
// 找出 skills_json 前后各 400 字符上下文
|
|
let idx = 0;
|
|
while ((idx = chunk.indexOf(TARGET, idx)) !== -1) {
|
|
const from = Math.max(0, idx - 500);
|
|
const to = Math.min(chunk.length, idx + 700);
|
|
results.push({ file: h.full, ctx: chunk.slice(from, to).toString('utf8') });
|
|
idx += TARGET.length;
|
|
if (results.length > 40) break;
|
|
}
|
|
}
|
|
if (results.length > 40) break;
|
|
}
|
|
console.log('含 skills_json 的文件数:', new Set(results.map(r=>r.file)).size);
|
|
console.log('片段数:', results.length);
|
|
// 只输出含读写逻辑的片段(排除 DDL/列定义)
|
|
const interesting = results.filter(r => /INSERT|SELECT|UPDATE|JSON\.parse|=>|function|await|\.map\(|\.filter\(|include\(|find\(|query|execute/i.test(r.ctx) && !/CREATE TABLE|ALTER TABLE|addSql|statement-breakpoint|"name",\s*$/.test(r.ctx));
|
|
console.log('读写逻辑片段数:', interesting.length);
|
|
interesting.slice(0, 25).forEach((r, i) => {
|
|
console.log('\n########## ' + r.file + ' [' + i + '] ##########');
|
|
console.log(r.ctx.replace(/[ \t]+/g, ' ').slice(0, 1600));
|
|
});
|