@foxden-app/foxclaw 0.5.25 → 0.5.26

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.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,16 @@
2
2
 
3
3
  All notable FoxClaw changes are listed here. Each release note is bilingual so GitHub Releases and the npm package are useful to both Chinese and English readers.
4
4
 
5
+ ## 0.5.26 - 2026-06-09
6
+
7
+ ### 中文
8
+ - 修正重启续接判定:如果 Codex app-server 把被重启打断的旧 turn 标成 completed,但没有任何可转发的 assistant/plan 输出或错误内容,FoxClaw 会把它当作中断任务自动续跑,而不是把 Telegram 状态卡误改成“已完成”。
9
+ - 已经有明确输出或错误结果的 completed turn 仍按完成处理,避免对真实完成的任务重复续跑。
10
+
11
+ ### English
12
+ - Fixed restart recovery detection: if the Codex app-server marks a restart-interrupted turn as completed but it has no relayable assistant/plan output or error, FoxClaw now treats it as interrupted and auto-resumes it instead of retiring the Telegram status card as completed.
13
+ - Completed turns that do have output or an error are still treated as finished, avoiding duplicate resume runs for truly completed work.
14
+
5
15
  ## 0.5.25 - 2026-06-09
6
16
 
7
17
  ### 中文
@@ -7239,6 +7239,9 @@ export class BridgeSessionCore {
7239
7239
  }
7240
7240
  const previousTurn = snapshot.turns.find(turn => turn.turnId === preview.turnId) ?? null;
7241
7241
  if (previousTurn && previousTurn.status !== 'inProgress') {
7242
+ if (!turnHasRelayableOutcome(previousTurn)) {
7243
+ return this.resumeInterruptedTurnAfterRestart(preview, target);
7244
+ }
7242
7245
  await this.retirePreviewMessage(preview.scopeId, preview.messageId, t(this.localeForChat(preview.scopeId), 'completed_see_reply_below'), preview.turnId);
7243
7246
  return true;
7244
7247
  }
@@ -8463,6 +8466,16 @@ function summarizeTurnItems(items) {
8463
8466
  .map(([type, count]) => `${type}=${count}`)
8464
8467
  .join(', ');
8465
8468
  }
8469
+ function turnHasRelayableOutcome(turn) {
8470
+ if (turn.error?.trim()) {
8471
+ return true;
8472
+ }
8473
+ return turn.items.some((item) => {
8474
+ const type = item.type.toLowerCase();
8475
+ return ((type === 'agentmessage' || type === 'assistantmessage' || type === 'plan')
8476
+ && Boolean(item.text?.trim()));
8477
+ });
8478
+ }
8466
8479
  function mapGoalNotification(raw) {
8467
8480
  if (!raw || typeof raw !== 'object') {
8468
8481
  return null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@foxden-app/foxclaw",
3
- "version": "0.5.25",
3
+ "version": "0.5.26",
4
4
  "description": "Foxden local execution claw for controlling Codex from trusted chat interfaces.",
5
5
  "type": "module",
6
6
  "main": "dist/main.js",