claude-codex-wechat 0.1.11 → 0.1.13

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/dist/server/cli.js +59 -7
  2. package/package.json +1 -1
@@ -2686,6 +2686,18 @@ var CodexAppServerClient = class {
2686
2686
  };
2687
2687
 
2688
2688
  // src/providers/codex/codexInteractiveRunner.ts
2689
+ function readAgentMessageItemId(value) {
2690
+ if (!value || typeof value !== "object") return void 0;
2691
+ const record = value;
2692
+ if (typeof record.itemId === "string" && record.itemId) return record.itemId;
2693
+ if (typeof record.id === "string" && record.id) return record.id;
2694
+ if (record.item && typeof record.item === "object") {
2695
+ const item = record.item;
2696
+ if (typeof item.id === "string" && item.id) return item.id;
2697
+ if (typeof item.itemId === "string" && item.itemId) return item.itemId;
2698
+ }
2699
+ return void 0;
2700
+ }
2689
2701
  function readThreadId(value) {
2690
2702
  if (!value || typeof value !== "object") return void 0;
2691
2703
  const record = value;
@@ -2726,7 +2738,8 @@ var CodexInteractiveRunner = class {
2726
2738
  sessionName: input.options?.sessionName,
2727
2739
  cwd: input.cwd,
2728
2740
  status: "idle",
2729
- pendingText: []
2741
+ pendingEvents: [],
2742
+ turnClosed: false
2730
2743
  };
2731
2744
  this.sessions.set(input.bridgeSessionId, session);
2732
2745
  return session;
@@ -2735,8 +2748,10 @@ var CodexInteractiveRunner = class {
2735
2748
  const session = this.sessions.get(input.bridgeSessionId);
2736
2749
  if (!session) throw new Error(`codex_session_not_found:${input.bridgeSessionId}`);
2737
2750
  const client = await this.ensureClient(session);
2738
- session.pendingText = [];
2751
+ session.pendingEvents = [];
2752
+ session.activeMessage = void 0;
2739
2753
  session.activeTurnId = void 0;
2754
+ session.turnClosed = false;
2740
2755
  session.turnCompletedPromise = new Promise((resolve2) => {
2741
2756
  session.turnCompletedResolver = resolve2;
2742
2757
  });
@@ -2776,6 +2791,11 @@ var CodexInteractiveRunner = class {
2776
2791
  });
2777
2792
  const maybeTurnId = readTurnId(response);
2778
2793
  if (maybeTurnId) session.activeTurnId = maybeTurnId;
2794
+ for (; ; ) {
2795
+ const event = await this.takeNextEvent(session);
2796
+ if (!event) break;
2797
+ yield event;
2798
+ }
2779
2799
  await session.turnCompletedPromise;
2780
2800
  if (session.threadId) {
2781
2801
  await this.syncThreadForResume({
@@ -2784,9 +2804,6 @@ var CodexInteractiveRunner = class {
2784
2804
  cwd: session.cwd
2785
2805
  });
2786
2806
  }
2787
- for (const text of session.pendingText) {
2788
- yield { type: "text_delta", text };
2789
- }
2790
2807
  yield {
2791
2808
  type: "session_state",
2792
2809
  state: {
@@ -2797,7 +2814,6 @@ var CodexInteractiveRunner = class {
2797
2814
  status: "idle"
2798
2815
  }
2799
2816
  };
2800
- yield { type: "message_done" };
2801
2817
  }
2802
2818
  async stopSession(bridgeSessionId) {
2803
2819
  const session = this.sessions.get(bridgeSessionId);
@@ -2813,6 +2829,10 @@ var CodexInteractiveRunner = class {
2813
2829
  turnId: session.activeTurnId
2814
2830
  }).catch(() => void 0);
2815
2831
  }
2832
+ this.flushActiveMessage(session);
2833
+ session.turnClosed = true;
2834
+ session.eventResolver?.();
2835
+ session.eventResolver = void 0;
2816
2836
  session.turnCompletedResolver?.();
2817
2837
  session.turnCompletedResolver = void 0;
2818
2838
  }
@@ -2834,13 +2854,24 @@ var CodexInteractiveRunner = class {
2834
2854
  await client.initialize();
2835
2855
  client.onNotification("item/agentMessage/delta", (params) => {
2836
2856
  const record = params;
2837
- if (typeof record.delta === "string" && record.delta) session.pendingText.push(record.delta);
2857
+ if (typeof record.delta !== "string" || !record.delta) return;
2858
+ const itemId = readAgentMessageItemId(record) ?? `fallback-${session.pendingEvents.length}`;
2859
+ if (session.activeMessage?.itemId === itemId) {
2860
+ session.activeMessage.text += record.delta;
2861
+ return;
2862
+ }
2863
+ this.flushActiveMessage(session);
2864
+ session.activeMessage = { itemId, text: record.delta };
2838
2865
  });
2839
2866
  client.onNotification("turn/started", (params) => {
2840
2867
  const turnId = readTurnId(params);
2841
2868
  if (turnId) session.activeTurnId = turnId;
2842
2869
  });
2843
2870
  client.onNotification("turn/completed", () => {
2871
+ this.flushActiveMessage(session);
2872
+ session.turnClosed = true;
2873
+ session.eventResolver?.();
2874
+ session.eventResolver = void 0;
2844
2875
  session.turnCompletedResolver?.();
2845
2876
  session.turnCompletedResolver = void 0;
2846
2877
  });
@@ -2853,6 +2884,27 @@ var CodexInteractiveRunner = class {
2853
2884
  session.client = client;
2854
2885
  return client;
2855
2886
  }
2887
+ flushActiveMessage(session) {
2888
+ if (!session.activeMessage?.text) return;
2889
+ this.enqueueEvent(session, { type: "text_delta", text: session.activeMessage.text });
2890
+ this.enqueueEvent(session, { type: "message_done" });
2891
+ session.activeMessage = void 0;
2892
+ }
2893
+ enqueueEvent(session, event) {
2894
+ session.pendingEvents.push(event);
2895
+ session.eventResolver?.();
2896
+ session.eventResolver = void 0;
2897
+ }
2898
+ async takeNextEvent(session) {
2899
+ for (; ; ) {
2900
+ const next = session.pendingEvents.shift();
2901
+ if (next) return next;
2902
+ if (session.turnClosed) return null;
2903
+ await new Promise((resolve2) => {
2904
+ session.eventResolver = resolve2;
2905
+ });
2906
+ }
2907
+ }
2856
2908
  };
2857
2909
 
2858
2910
  // src/providers/codex/codexProvider.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-codex-wechat",
3
- "version": "0.1.11",
3
+ "version": "0.1.13",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "bin": {