Files
mcn-short-video/project/短视频脚本创作/V1.0/mcn-workshop/probe-asar-skills.cjs
T
maogeigei f77735b206 工作台:目录改名 mcn-workshop + 任务进度可见 + 会话归属配置化
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 分钟超时,用户零感知)
2026-10-08 13:09:06 +08:00

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));
});