sessix-server 0.3.8 → 0.3.9

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/dist/index.js CHANGED
@@ -2523,6 +2523,8 @@ var ApprovalProxy = class _ApprovalProxy {
2523
2523
  pendingApprovals = /* @__PURE__ */ new Map();
2524
2524
  /** 审批请求回调(通知外部推送到手机) */
2525
2525
  approvalRequestCallbacks = [];
2526
+ /** 审批 resolve 回调(任何来源的 resolve 都会触发,用于 WS 广播清理 */
2527
+ approvalResolvedCallbacks = [];
2526
2528
  /** YOLO 模式状态:sessionId -> enabled */
2527
2529
  yoloSessions = /* @__PURE__ */ new Map();
2528
2530
  /** 内存缓存:已被"始终允许"的工具名(避免每次读 settings.json) */
@@ -2560,6 +2562,30 @@ var ApprovalProxy = class _ApprovalProxy {
2560
2562
  onApprovalRequest(callback) {
2561
2563
  this.approvalRequestCallbacks.push(callback);
2562
2564
  }
2565
+ /**
2566
+ * 注册审批 resolve 回调
2567
+ *
2568
+ * 任何来源的 resolve 都会触发:
2569
+ * - resolveApproval(手机端 approve/reject)
2570
+ * - 5 分钟超时自动 allow
2571
+ * - clearPendingForSession(会话被 kill)
2572
+ * - approveAll(手机全断时自动 allow)
2573
+ *
2574
+ * 用于向所有客户端广播 approval_resolved,清理可能残留的审批 UI。
2575
+ */
2576
+ onApprovalResolved(callback) {
2577
+ this.approvalResolvedCallbacks.push(callback);
2578
+ }
2579
+ /** 通知所有 resolve 回调(内部调用) */
2580
+ notifyApprovalResolved(requestId, decision) {
2581
+ for (const callback of this.approvalResolvedCallbacks) {
2582
+ try {
2583
+ callback(requestId, decision);
2584
+ } catch (err) {
2585
+ console.error("[ApprovalProxy] Approval resolved callback error:", err);
2586
+ }
2587
+ }
2588
+ }
2563
2589
  /** 设置状态信息提供者(用于 /health 端点) */
2564
2590
  setStatusInfoProvider(provider) {
2565
2591
  this.statusInfoProvider = provider;
@@ -2593,6 +2619,7 @@ var ApprovalProxy = class _ApprovalProxy {
2593
2619
  pending.resolve(decision);
2594
2620
  this.pendingApprovals.delete(requestId);
2595
2621
  console.log(`[ApprovalProxy] ${t("approval.requestProcessed", { id: requestId })}: ${decision.decision}`);
2622
+ this.notifyApprovalResolved(requestId, decision);
2596
2623
  return true;
2597
2624
  }
2598
2625
  /** 获取当前待处理的审批数量 */
@@ -2608,9 +2635,11 @@ var ApprovalProxy = class _ApprovalProxy {
2608
2635
  for (const [requestId, pending] of this.pendingApprovals) {
2609
2636
  if (pending.request.sessionId === sessionId) {
2610
2637
  clearTimeout(pending.timer);
2611
- pending.resolve({ decision: "allow" });
2638
+ const decision = { decision: "allow" };
2639
+ pending.resolve(decision);
2612
2640
  this.pendingApprovals.delete(requestId);
2613
2641
  console.log(`[ApprovalProxy] Session ${sessionId} killed, auto-allowed pending approval ${requestId}`);
2642
+ this.notifyApprovalResolved(requestId, decision);
2614
2643
  }
2615
2644
  }
2616
2645
  }
@@ -2698,9 +2727,11 @@ var ApprovalProxy = class _ApprovalProxy {
2698
2727
  const entries = Array.from(this.pendingApprovals.entries());
2699
2728
  for (const [requestId, pending] of entries) {
2700
2729
  clearTimeout(pending.timer);
2701
- pending.resolve({ decision: "allow" });
2730
+ const decision = { decision: "allow" };
2731
+ pending.resolve(decision);
2702
2732
  this.pendingApprovals.delete(requestId);
2703
2733
  console.log(`[ApprovalProxy] ${t("approval.autoAllowed", { id: requestId, reason: reason ? `\uFF08${reason}\uFF09` : "" })}`);
2734
+ this.notifyApprovalResolved(requestId, decision);
2704
2735
  }
2705
2736
  }
2706
2737
  /** 优雅关闭 HTTP 服务 */
@@ -2792,7 +2823,9 @@ var ApprovalProxy = class _ApprovalProxy {
2792
2823
  const timer = setTimeout(() => {
2793
2824
  console.log(`[ApprovalProxy] ${t("approval.timeout", { id: requestId })}`);
2794
2825
  this.pendingApprovals.delete(requestId);
2795
- resolve({ decision: "allow" });
2826
+ const autoDecision = { decision: "allow" };
2827
+ resolve(autoDecision);
2828
+ this.notifyApprovalResolved(requestId, autoDecision);
2796
2829
  }, 325e3);
2797
2830
  this.pendingApprovals.set(requestId, { resolve, timer, request: approvalRequest });
2798
2831
  });
@@ -4955,6 +4988,13 @@ async function start(opts = {}) {
4955
4988
  approvalProxy.approveAll(t("server.phoneDisconnected"));
4956
4989
  }
4957
4990
  });
4991
+ approvalProxy.onApprovalResolved((requestId, decision) => {
4992
+ wsBridge.broadcast({
4993
+ type: "approval_resolved",
4994
+ requestId,
4995
+ decision: decision.decision
4996
+ });
4997
+ });
4958
4998
  approvalProxy.onApprovalRequest((request) => {
4959
4999
  wsBridge.broadcast({ type: "approval_request", request });
4960
5000
  setTimeout(() => {
package/dist/server.js CHANGED
@@ -2528,6 +2528,8 @@ var ApprovalProxy = class _ApprovalProxy {
2528
2528
  pendingApprovals = /* @__PURE__ */ new Map();
2529
2529
  /** 审批请求回调(通知外部推送到手机) */
2530
2530
  approvalRequestCallbacks = [];
2531
+ /** 审批 resolve 回调(任何来源的 resolve 都会触发,用于 WS 广播清理 */
2532
+ approvalResolvedCallbacks = [];
2531
2533
  /** YOLO 模式状态:sessionId -> enabled */
2532
2534
  yoloSessions = /* @__PURE__ */ new Map();
2533
2535
  /** 内存缓存:已被"始终允许"的工具名(避免每次读 settings.json) */
@@ -2565,6 +2567,30 @@ var ApprovalProxy = class _ApprovalProxy {
2565
2567
  onApprovalRequest(callback) {
2566
2568
  this.approvalRequestCallbacks.push(callback);
2567
2569
  }
2570
+ /**
2571
+ * 注册审批 resolve 回调
2572
+ *
2573
+ * 任何来源的 resolve 都会触发:
2574
+ * - resolveApproval(手机端 approve/reject)
2575
+ * - 5 分钟超时自动 allow
2576
+ * - clearPendingForSession(会话被 kill)
2577
+ * - approveAll(手机全断时自动 allow)
2578
+ *
2579
+ * 用于向所有客户端广播 approval_resolved,清理可能残留的审批 UI。
2580
+ */
2581
+ onApprovalResolved(callback) {
2582
+ this.approvalResolvedCallbacks.push(callback);
2583
+ }
2584
+ /** 通知所有 resolve 回调(内部调用) */
2585
+ notifyApprovalResolved(requestId, decision) {
2586
+ for (const callback of this.approvalResolvedCallbacks) {
2587
+ try {
2588
+ callback(requestId, decision);
2589
+ } catch (err) {
2590
+ console.error("[ApprovalProxy] Approval resolved callback error:", err);
2591
+ }
2592
+ }
2593
+ }
2568
2594
  /** 设置状态信息提供者(用于 /health 端点) */
2569
2595
  setStatusInfoProvider(provider) {
2570
2596
  this.statusInfoProvider = provider;
@@ -2598,6 +2624,7 @@ var ApprovalProxy = class _ApprovalProxy {
2598
2624
  pending.resolve(decision);
2599
2625
  this.pendingApprovals.delete(requestId);
2600
2626
  console.log(`[ApprovalProxy] ${t("approval.requestProcessed", { id: requestId })}: ${decision.decision}`);
2627
+ this.notifyApprovalResolved(requestId, decision);
2601
2628
  return true;
2602
2629
  }
2603
2630
  /** 获取当前待处理的审批数量 */
@@ -2613,9 +2640,11 @@ var ApprovalProxy = class _ApprovalProxy {
2613
2640
  for (const [requestId, pending] of this.pendingApprovals) {
2614
2641
  if (pending.request.sessionId === sessionId) {
2615
2642
  clearTimeout(pending.timer);
2616
- pending.resolve({ decision: "allow" });
2643
+ const decision = { decision: "allow" };
2644
+ pending.resolve(decision);
2617
2645
  this.pendingApprovals.delete(requestId);
2618
2646
  console.log(`[ApprovalProxy] Session ${sessionId} killed, auto-allowed pending approval ${requestId}`);
2647
+ this.notifyApprovalResolved(requestId, decision);
2619
2648
  }
2620
2649
  }
2621
2650
  }
@@ -2703,9 +2732,11 @@ var ApprovalProxy = class _ApprovalProxy {
2703
2732
  const entries = Array.from(this.pendingApprovals.entries());
2704
2733
  for (const [requestId, pending] of entries) {
2705
2734
  clearTimeout(pending.timer);
2706
- pending.resolve({ decision: "allow" });
2735
+ const decision = { decision: "allow" };
2736
+ pending.resolve(decision);
2707
2737
  this.pendingApprovals.delete(requestId);
2708
2738
  console.log(`[ApprovalProxy] ${t("approval.autoAllowed", { id: requestId, reason: reason ? `\uFF08${reason}\uFF09` : "" })}`);
2739
+ this.notifyApprovalResolved(requestId, decision);
2709
2740
  }
2710
2741
  }
2711
2742
  /** 优雅关闭 HTTP 服务 */
@@ -2797,7 +2828,9 @@ var ApprovalProxy = class _ApprovalProxy {
2797
2828
  const timer = setTimeout(() => {
2798
2829
  console.log(`[ApprovalProxy] ${t("approval.timeout", { id: requestId })}`);
2799
2830
  this.pendingApprovals.delete(requestId);
2800
- resolve({ decision: "allow" });
2831
+ const autoDecision = { decision: "allow" };
2832
+ resolve(autoDecision);
2833
+ this.notifyApprovalResolved(requestId, autoDecision);
2801
2834
  }, 325e3);
2802
2835
  this.pendingApprovals.set(requestId, { resolve, timer, request: approvalRequest });
2803
2836
  });
@@ -4960,6 +4993,13 @@ async function start(opts = {}) {
4960
4993
  approvalProxy.approveAll(t("server.phoneDisconnected"));
4961
4994
  }
4962
4995
  });
4996
+ approvalProxy.onApprovalResolved((requestId, decision) => {
4997
+ wsBridge.broadcast({
4998
+ type: "approval_resolved",
4999
+ requestId,
5000
+ decision: decision.decision
5001
+ });
5002
+ });
4963
5003
  approvalProxy.onApprovalRequest((request) => {
4964
5004
  wsBridge.broadcast({ type: "approval_request", request });
4965
5005
  setTimeout(() => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sessix-server",
3
- "version": "0.3.8",
3
+ "version": "0.3.9",
4
4
  "bin": {
5
5
  "sessix-server": "dist/index.js"
6
6
  },