codex-relay 1.4.12 → 1.4.14

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/src.js +45 -16
  2. package/package.json +1 -1
package/dist/src.js CHANGED
@@ -182,6 +182,9 @@ var CodexAppServerClient = class {
182
182
  get appServerMode() {
183
183
  return this.activeMode;
184
184
  }
185
+ isThreadSubscribed(threadId) {
186
+ return this.subscribedThreadIds.has(threadId);
187
+ }
185
188
  initialize() {
186
189
  return this.ensureInitialized();
187
190
  }
@@ -3437,6 +3440,10 @@ async function startAppServerTurn(appServer, threadId, input) {
3437
3440
  }
3438
3441
  }
3439
3442
  async function resumeAppServerThreadIfNeeded(appServer, threadId, input, runtime) {
3443
+ if (appServer.isThreadSubscribed?.(threadId) === false) {
3444
+ await resumeAppServerThread(appServer, threadId, input, runtime);
3445
+ return;
3446
+ }
3440
3447
  if (typeof appServer.readThread !== "function") return;
3441
3448
  let thread;
3442
3449
  try {
@@ -3629,8 +3636,9 @@ async function streamRunningAppServerThread(input) {
3629
3636
  observedTurnActivity = true;
3630
3637
  const item = params?.item;
3631
3638
  if (!item || typeof item !== "object") return;
3632
- const message = upsertAppServerItemMessage(input.messagesByThreadId, input.threadId, firstString(params, ["turnId"]) ?? activeTurnId, item);
3639
+ let message = upsertAppServerItemMessage(input.messagesByThreadId, input.threadId, firstString(params, ["turnId"]) ?? activeTurnId, item);
3633
3640
  if (!message) return;
3641
+ if (notification.method === "item/started") message = updateMessage(input.messagesByThreadId, input.threadId, message.id, { state: "streaming" });
3634
3642
  const isAsyncAgentMessage = isAsyncAppServerAgentMessage(item);
3635
3643
  if (isAsyncAgentMessage) asyncAgentMessageIds.add(message.id);
3636
3644
  if (message.role !== "user" && !isAsyncAgentMessage) producedTurnOutput = true;
@@ -3649,14 +3657,22 @@ async function streamRunningAppServerThread(input) {
3649
3657
  case "item/agentMessage/delta": {
3650
3658
  observedTurnActivity = true;
3651
3659
  const itemId = firstString(params, ["itemId"]);
3652
- const delta = firstString(params, ["delta"]);
3660
+ const delta = streamDelta(params);
3653
3661
  if (!itemId || !delta) return;
3654
- if (!input.messagesByThreadId.get(input.threadId)?.some((item) => item.id === itemId)) appendMessageWithId(input.messagesByThreadId, input.threadId, itemId, {
3655
- role: "assistant",
3656
- content: "",
3657
- state: "streaming",
3658
- turnId: firstString(params, ["turnId"]) ?? activeTurnId
3659
- });
3662
+ if (!input.messagesByThreadId.get(input.threadId)?.some((item) => item.id === itemId)) {
3663
+ const createdMessage = appendMessageWithId(input.messagesByThreadId, input.threadId, itemId, {
3664
+ role: "assistant",
3665
+ content: "",
3666
+ state: "streaming",
3667
+ turnId: firstString(params, ["turnId"]) ?? activeTurnId
3668
+ });
3669
+ threadSummary = updateThread(input.threads, input.messagesByThreadId, input.threadId, { state: "running" });
3670
+ sendSse(input.controller, input.encoder, input.secureSession, {
3671
+ type: "thread.message.created",
3672
+ thread: threadSummary,
3673
+ message: createdMessage
3674
+ });
3675
+ }
3660
3676
  const isAsyncAgentMessage = asyncAgentMessageIds.has(itemId);
3661
3677
  if (!isAsyncAgentMessage) {
3662
3678
  assistantMessageId = itemId;
@@ -4150,8 +4166,9 @@ async function runAppServerPromptStreamed(input) {
4150
4166
  return;
4151
4167
  }
4152
4168
  const turnId = firstString(params, ["turnId"]) ?? activeTurnId;
4153
- const message = upsertAppServerItemMessage(input.messagesByThreadId, activeThreadId, turnId, item);
4169
+ let message = upsertAppServerItemMessage(input.messagesByThreadId, activeThreadId, turnId, item);
4154
4170
  if (!message) return;
4171
+ if (notification.method === "item/started") message = updateMessage(input.messagesByThreadId, activeThreadId, message.id, { state: "streaming" });
4155
4172
  const isAsyncAgentMessage = isAsyncAppServerAgentMessage(item);
4156
4173
  if (isAsyncAgentMessage) asyncAgentMessageIds.add(message.id);
4157
4174
  if (message.role !== "user" && !isAsyncAgentMessage) producedTurnOutput = true;
@@ -4169,14 +4186,22 @@ async function runAppServerPromptStreamed(input) {
4169
4186
  }
4170
4187
  case "item/agentMessage/delta": {
4171
4188
  const itemId = firstString(params, ["itemId"]);
4172
- const delta = firstString(params, ["delta"]);
4189
+ const delta = streamDelta(params);
4173
4190
  if (!itemId || !delta) return;
4174
- if (!input.messagesByThreadId.get(activeThreadId)?.some((item) => item.id === itemId)) appendMessageWithId(input.messagesByThreadId, activeThreadId, itemId, {
4175
- role: "assistant",
4176
- content: "",
4177
- state: "streaming",
4178
- turnId: firstString(params, ["turnId"]) ?? activeTurnId
4179
- });
4191
+ if (!input.messagesByThreadId.get(activeThreadId)?.some((item) => item.id === itemId)) {
4192
+ const createdMessage = appendMessageWithId(input.messagesByThreadId, activeThreadId, itemId, {
4193
+ role: "assistant",
4194
+ content: "",
4195
+ state: "streaming",
4196
+ turnId: firstString(params, ["turnId"]) ?? activeTurnId
4197
+ });
4198
+ threadSummary = updateThread(input.threads, input.messagesByThreadId, activeThreadId, { state: "running" });
4199
+ sendSse(input.controller, input.encoder, input.secureSession, {
4200
+ type: "thread.message.created",
4201
+ thread: threadSummary,
4202
+ message: createdMessage
4203
+ });
4204
+ }
4180
4205
  const isAsyncAgentMessage = asyncAgentMessageIds.has(itemId);
4181
4206
  if (!isAsyncAgentMessage) assistantMessageId = itemId;
4182
4207
  const patch = appendMessageDelta(input.messagesByThreadId, activeThreadId, itemId, delta);
@@ -6799,6 +6824,10 @@ function firstString(record, keys) {
6799
6824
  if (typeof value === "string" && value.trim()) return value;
6800
6825
  }
6801
6826
  }
6827
+ function streamDelta(record) {
6828
+ const value = record?.delta;
6829
+ return typeof value === "string" && value.length > 0 ? value : void 0;
6830
+ }
6802
6831
  function firstNumber(record, keys) {
6803
6832
  for (const key of keys) {
6804
6833
  const value = record?.[key];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codex-relay",
3
- "version": "1.4.12",
3
+ "version": "1.4.14",
4
4
  "description": "Local Codex Relay CLI bridge for the Codex Relay mobile app.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {