fraim-hub 2.0.324 → 2.0.325

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.
@@ -7189,9 +7189,10 @@ class AiHubServer {
7189
7189
  // job that just received coaching has not reached retrospective
7190
7190
  // again yet. Clear it at send-time so a coached Done job stops
7191
7191
  // offering next-job recommendations immediately, not only once the
7192
- // resumed session's next seekMentoring signal arrives.
7192
+ // resumed session's next seekMentoring signal arrives. The active
7193
+ // reviewHandoff deliberately survives conversational coaching; its
7194
+ // lifecycle is owned by applySeekMentoringSignal (issue #1763).
7193
7195
  current.nextJobRecommendations = null;
7194
- current.reviewHandoff = null;
7195
7196
  });
7196
7197
  const startedFresh = this.runRegistry.get(run.id);
7197
7198
  if (startedFresh)
@@ -7260,9 +7261,10 @@ class AiHubServer {
7260
7261
  current.pendingDeliveryActionId = selectedReviewAction.deliveryActionId || null;
7261
7262
  }
7262
7263
  // Issue #1373 (Defect 2): see the no-session branch above for why
7263
- // this can only be stale at coaching-send time.
7264
+ // next-job recommendations can only be stale at coaching-send time.
7265
+ // applySeekMentoringSignal remains the sole reviewHandoff lifecycle
7266
+ // owner so a conversational coaching turn does not decide the review.
7264
7267
  current.nextJobRecommendations = null;
7265
- current.reviewHandoff = null;
7266
7268
  });
7267
7269
  const started = this.runRegistry.get(run.id);
7268
7270
  if (started)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fraim-hub",
3
- "version": "2.0.324",
3
+ "version": "2.0.325",
4
4
  "description": "FRAIM Hub local companion package.",
5
5
  "author": "Sid Mathur <sid.mathur@gmail.com>",
6
6
  "homepage": "https://github.com/mathursrus/FRAIM#readme",
@@ -213,7 +213,7 @@
213
213
  "electron-updater": "^6.8.9",
214
214
  "express": "^5.2.1",
215
215
  "extract-zip": "^2.0.1",
216
- "fraim": "2.0.324",
216
+ "fraim": "2.0.325",
217
217
  "mongodb": "^7.0.0",
218
218
  "node-cron": "4.2.1",
219
219
  "node-edge-tts": "^1.2.10",
@@ -140,6 +140,10 @@
140
140
  color: var(--muted, #888);
141
141
  filter: none;
142
142
  }
143
+ :root[data-theme="dark"] .review-actions .rb-approve:not(:disabled):not(.managed-disabled),
144
+ :root[data-theme="dark"] .review-actions .rb-secondary:not(:disabled):not(.managed-disabled) {
145
+ color: var(--bg, #1e1e1e);
146
+ }
143
147
  .review-actions .rb-handoff {
144
148
  font-size: 12px;
145
149
  color: var(--muted);
@@ -7713,15 +7713,17 @@ async function approveReview(options) {
7713
7713
  const opts = options || {};
7714
7714
  const conv = activeConversation();
7715
7715
  if (!conv) return;
7716
+ const shouldResume = !!opts.resumeAfterApproval
7717
+ && !!conv.runId
7718
+ && convAwaitingReview(conv);
7719
+ if (opts.resumeAfterApproval && !shouldResume) {
7720
+ showStatus('Approve could not resume this run. The review gate is no longer active. Use Mark complete if you intend to close it manually.', true);
7721
+ return;
7722
+ }
7716
7723
  if (state.pollHandle) {
7717
7724
  window.clearInterval(state.pollHandle);
7718
7725
  state.pollHandle = null;
7719
7726
  }
7720
- const shouldResume = !!opts.resumeAfterApproval
7721
- && !!conv.runId
7722
- && !!conv.sessionId
7723
- && !!reviewHandoffForConversation(conv)
7724
- && convAwaitingReview(conv);
7725
7727
  if (shouldResume) {
7726
7728
  const selectedReviewAction = opts.reviewAction && typeof opts.reviewAction === 'object'
7727
7729
  ? opts.reviewAction