fde2e-bu 1.3.1 → 1.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/src/nm/asset.mjs +9 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fde2e-bu",
3
- "version": "1.3.1",
3
+ "version": "1.3.2",
4
4
  "description": "FDE2E Browser Use CLI —— skills 管理+MCP server+扩展配对(零运行时依赖)",
5
5
  "type": "module",
6
6
  "bin": {
package/src/nm/asset.mjs CHANGED
@@ -261,7 +261,15 @@ export async function assetFetchHost(msg, deps = {}) {
261
261
  if (err?.name === 'AssetFetchError' && ASSET_ERROR_CODES.has(err.code)) throw err; // too-large 等本模块错误原样透传
262
262
  throw assetError('io', `资产落盘中断:${err?.message ?? err}`);
263
263
  } finally {
264
- try { sink.destroy(); } catch { /* 已关闭 */ }
264
+ // 先等 sink 真正 close 再走外层清理——CI 实证(ubuntu/overlayfs):destroy 是异步
265
+ // 语义,rmSync 抢跑会残留 .tmp(main run 39895242723 flake;mac 30 连跑不可复现)
266
+ await new Promise((resolve) => {
267
+ let settled = false;
268
+ const fin = () => { if (!settled) { settled = true; resolve(); } };
269
+ sink.once('close', fin);
270
+ try { sink.destroy(); } catch { fin(); /* 已关闭 */ }
271
+ setTimeout(fin, 1000); // close 事件缺席的兜底(不无限等)
272
+ });
265
273
  }
266
274
  try {
267
275
  fsMod.renameSync(tempPath, finalPath);