@copilotkit/core 1.68.3 → 1.69.0

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.umd.js CHANGED
@@ -2938,6 +2938,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2938
2938
  this.core = core;
2939
2939
  _defineProperty(this, "stateByRun", /* @__PURE__ */ new Map());
2940
2940
  _defineProperty(this, "messageToRun", /* @__PURE__ */ new Map());
2941
+ _defineProperty(this, "rawEventByMessage", /* @__PURE__ */ new Map());
2941
2942
  _defineProperty(this, "activeRun", /* @__PURE__ */ new Map());
2942
2943
  _defineProperty(this, "agentSubscriptions", /* @__PURE__ */ new Map());
2943
2944
  _defineProperty(this, "pendingContinuations", /* @__PURE__ */ new WeakMap());
@@ -2990,16 +2991,16 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2990
2991
  };
2991
2992
  };
2992
2993
  const { unsubscribe } = agent.subscribe({
2993
- onRunStartedEvent: ({ input, state }) => {
2994
+ onRunStartedEvent: ({ event, input, state }) => {
2994
2995
  if (revoked) return;
2995
2996
  const pendingForAgent = this.pendingContinuations.get(agent);
2996
2997
  const internalContinuation = [...pendingForAgent !== null && pendingForAgent !== void 0 ? pendingForAgent : []].find((pending) => pending.expectedInput === input);
2997
2998
  internalContinuation === null || internalContinuation === void 0 || internalContinuation.cancel();
2998
- if (runFinished && input.runId === subRunId && !internalContinuation && !isContinuation(input)) subRunId = (0, _ag_ui_client.randomUUID)();
2999
- else {
3000
- var _internalContinuation;
3001
- subRunId = (_internalContinuation = internalContinuation === null || internalContinuation === void 0 ? void 0 : internalContinuation.expectedRunId) !== null && _internalContinuation !== void 0 ? _internalContinuation : input.runId;
3002
- }
2999
+ if (internalContinuation) {
3000
+ var _ref, _internalContinuation;
3001
+ subRunId = (_ref = (_internalContinuation = internalContinuation.expectedRunId) !== null && _internalContinuation !== void 0 ? _internalContinuation : event.runId) !== null && _ref !== void 0 ? _ref : input.runId;
3002
+ } else if (runFinished && input.runId === subRunId && !isContinuation(input) && (event.runId == null || event.runId === subRunId)) subRunId = (0, _ag_ui_client.randomUUID)();
3003
+ else subRunId = event.runId || input.runId;
3003
3004
  runFinished = false;
3004
3005
  this.handleRunStarted(agent, effectiveInput(input), state);
3005
3006
  },
@@ -3021,13 +3022,22 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
3021
3022
  if (revoked) return;
3022
3023
  this.handleStateDelta(agent, event, effectiveInput(input), state);
3023
3024
  },
3025
+ onTextMessageStartEvent: ({ event, input }) => {
3026
+ if (revoked) return;
3027
+ this.handleTextMessageStart(agent, event, effectiveInput(input));
3028
+ },
3024
3029
  onMessagesSnapshotEvent: ({ event, input, messages }) => {
3025
3030
  if (revoked) return;
3026
3031
  this.handleMessagesSnapshot(agent, event, effectiveInput(input), messages);
3032
+ this.pruneRawEvents(agent.agentId, input.threadId, event.messages, effectiveInput(input));
3027
3033
  },
3028
3034
  onNewMessage: ({ message, input }) => {
3029
3035
  if (revoked) return;
3030
3036
  this.handleNewMessage(agent, message, input ? effectiveInput(input) : void 0);
3037
+ },
3038
+ onMessagesChanged: ({ messages, input }) => {
3039
+ if (revoked) return;
3040
+ if (!input) this.pruneRawEvents(agent.agentId, agent.threadId, messages);
3031
3041
  }
3032
3042
  });
3033
3043
  this.agentSubscriptions.set(agentId, () => {
@@ -3045,6 +3055,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
3045
3055
  unsubscribe();
3046
3056
  this.agentSubscriptions.delete(agentId);
3047
3057
  }
3058
+ this.rawEventByMessage.delete(agentId);
3048
3059
  }
3049
3060
  /**
3050
3061
  * Get state for a specific run
@@ -3064,6 +3075,14 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
3064
3075
  return (_this$messageToRun$ge = this.messageToRun.get(agentId)) === null || _this$messageToRun$ge === void 0 || (_this$messageToRun$ge = _this$messageToRun$ge.get(threadId)) === null || _this$messageToRun$ge === void 0 ? void 0 : _this$messageToRun$ge.get(messageId);
3065
3076
  }
3066
3077
  /**
3078
+ * Get direct text-start metadata associated with a message.
3079
+ */
3080
+ getRawEventForMessage(agentId, threadId, messageId) {
3081
+ var _this$rawEventByMessa;
3082
+ const rawEvent = (_this$rawEventByMessa = this.rawEventByMessage.get(agentId)) === null || _this$rawEventByMessa === void 0 || (_this$rawEventByMessa = _this$rawEventByMessa.get(threadId)) === null || _this$rawEventByMessa === void 0 ? void 0 : _this$rawEventByMessa.get(messageId);
3083
+ return rawEvent === void 0 ? void 0 : (0, _ag_ui_client.structuredClone_)(rawEvent);
3084
+ }
3085
+ /**
3067
3086
  * Get all states for an agent's thread
3068
3087
  */
3069
3088
  getStatesForThread(agentId, threadId) {
@@ -3117,12 +3136,34 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
3117
3136
  this.saveState(agent.agentId, threadId, runId, state);
3118
3137
  }
3119
3138
  /**
3139
+ * Capture only defined metadata from a normalized direct text-start event.
3140
+ */
3141
+ handleTextMessageStart(agent, event, input) {
3142
+ if (!agent.agentId) return;
3143
+ const { threadId } = input;
3144
+ if (event.rawEvent === void 0) {
3145
+ var _this$rawEventByMessa2, _this$rawEventByMessa4;
3146
+ const threadEvents = (_this$rawEventByMessa2 = this.rawEventByMessage.get(agent.agentId)) === null || _this$rawEventByMessa2 === void 0 ? void 0 : _this$rawEventByMessa2.get(threadId);
3147
+ threadEvents === null || threadEvents === void 0 || threadEvents.delete(event.messageId);
3148
+ if ((threadEvents === null || threadEvents === void 0 ? void 0 : threadEvents.size) === 0) {
3149
+ var _this$rawEventByMessa3;
3150
+ (_this$rawEventByMessa3 = this.rawEventByMessage.get(agent.agentId)) === null || _this$rawEventByMessa3 === void 0 || _this$rawEventByMessa3.delete(threadId);
3151
+ }
3152
+ if (((_this$rawEventByMessa4 = this.rawEventByMessage.get(agent.agentId)) === null || _this$rawEventByMessa4 === void 0 ? void 0 : _this$rawEventByMessa4.size) === 0) this.rawEventByMessage.delete(agent.agentId);
3153
+ return;
3154
+ }
3155
+ if (!this.rawEventByMessage.has(agent.agentId)) this.rawEventByMessage.set(agent.agentId, /* @__PURE__ */ new Map());
3156
+ const agentEvents = this.rawEventByMessage.get(agent.agentId);
3157
+ if (!agentEvents.has(threadId)) agentEvents.set(threadId, /* @__PURE__ */ new Map());
3158
+ agentEvents.get(threadId).set(event.messageId, event.rawEvent);
3159
+ }
3160
+ /**
3120
3161
  * Handle messages snapshot event
3121
3162
  */
3122
3163
  handleMessagesSnapshot(agent, event, input, messages) {
3123
3164
  if (!agent.agentId) return;
3124
3165
  const { threadId, runId } = input;
3125
- for (const message of event.messages) this.associateMessageWithRun(agent.agentId, threadId, message.id, runId);
3166
+ for (const message of event.messages) if (this.getRunIdForMessage(agent.agentId, threadId, message.id) === void 0) this.associateMessageWithRun(agent.agentId, threadId, message.id, runId);
3126
3167
  }
3127
3168
  /**
3128
3169
  * Handle new message event
@@ -3157,20 +3198,36 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
3157
3198
  if (!agentMessages.has(threadId)) agentMessages.set(threadId, /* @__PURE__ */ new Map());
3158
3199
  agentMessages.get(threadId).set(messageId, runId);
3159
3200
  }
3201
+ pruneRawEvents(agentId, fallbackThreadId, messages, input) {
3202
+ var _input$threadId, _this$rawEventByMessa5, _this$rawEventByMessa7;
3203
+ const threadId = (_input$threadId = input === null || input === void 0 ? void 0 : input.threadId) !== null && _input$threadId !== void 0 ? _input$threadId : fallbackThreadId;
3204
+ if (!threadId) return;
3205
+ const threadEvents = (_this$rawEventByMessa5 = this.rawEventByMessage.get(agentId)) === null || _this$rawEventByMessa5 === void 0 ? void 0 : _this$rawEventByMessa5.get(threadId);
3206
+ if (!threadEvents) return;
3207
+ const messageIds = new Set(messages.map((message) => message.id));
3208
+ for (const messageId of threadEvents.keys()) if (!messageIds.has(messageId)) threadEvents.delete(messageId);
3209
+ if (threadEvents.size === 0) {
3210
+ var _this$rawEventByMessa6;
3211
+ (_this$rawEventByMessa6 = this.rawEventByMessage.get(agentId)) === null || _this$rawEventByMessa6 === void 0 || _this$rawEventByMessa6.delete(threadId);
3212
+ }
3213
+ if (((_this$rawEventByMessa7 = this.rawEventByMessage.get(agentId)) === null || _this$rawEventByMessa7 === void 0 ? void 0 : _this$rawEventByMessa7.size) === 0) this.rawEventByMessage.delete(agentId);
3214
+ }
3160
3215
  /**
3161
3216
  * Clear all state for an agent
3162
3217
  */
3163
3218
  clearAgentState(agentId) {
3164
3219
  this.stateByRun.delete(agentId);
3165
3220
  this.messageToRun.delete(agentId);
3221
+ this.rawEventByMessage.delete(agentId);
3166
3222
  }
3167
3223
  /**
3168
3224
  * Clear all state for a thread
3169
3225
  */
3170
3226
  clearThreadState(agentId, threadId) {
3171
- var _this$stateByRun$get4, _this$messageToRun$ge2;
3227
+ var _this$stateByRun$get4, _this$messageToRun$ge2, _this$rawEventByMessa8;
3172
3228
  (_this$stateByRun$get4 = this.stateByRun.get(agentId)) === null || _this$stateByRun$get4 === void 0 || _this$stateByRun$get4.delete(threadId);
3173
3229
  (_this$messageToRun$ge2 = this.messageToRun.get(agentId)) === null || _this$messageToRun$ge2 === void 0 || _this$messageToRun$ge2.delete(threadId);
3230
+ (_this$rawEventByMessa8 = this.rawEventByMessage.get(agentId)) === null || _this$rawEventByMessa8 === void 0 || _this$rawEventByMessa8.delete(threadId);
3174
3231
  }
3175
3232
  };
3176
3233
 
@@ -5016,6 +5073,9 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
5016
5073
  getRunIdForMessage(agentId, threadId, messageId) {
5017
5074
  return this.stateManager.getRunIdForMessage(agentId, threadId, messageId);
5018
5075
  }
5076
+ getRawEventForMessage(agentId, threadId, messageId) {
5077
+ return this.stateManager.getRawEventForMessage(agentId, threadId, messageId);
5078
+ }
5019
5079
  getRunIdsForThread(agentId, threadId) {
5020
5080
  return this.stateManager.getRunIdsForThread(agentId, threadId);
5021
5081
  }
@@ -5301,6 +5361,16 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
5301
5361
  return typeof value === "string" && value.length > 0 ? value : void 0;
5302
5362
  }
5303
5363
  /**
5364
+ * REST `/threads` is agent-scoped. The Phoenix `user_meta` channel is not.
5365
+ * Drop live upserts that belong to a different agent, or one Inspector
5366
+ * `all-agents` flatten shows the same thread twice until a hard refresh.
5367
+ */
5368
+ function threadMetadataTargetsAgent(payload, agentId) {
5369
+ if (!agentId || payload.operation === "deleted") return true;
5370
+ const threadAgentId = optionalString(payload.thread.agentId);
5371
+ return !threadAgentId || threadAgentId === agentId;
5372
+ }
5373
+ /**
5304
5374
  * Converts gateway run-activity payloads into the internal TypeScript shape.
5305
5375
  */
5306
5376
  function normalizeThreadRunActivityNotification(payload) {
@@ -5733,13 +5803,16 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
5733
5803
  }))), ɵobservePhoenixJoinOutcome$(channel$).pipe((0, rxjs_operators.filter)((outcome) => outcome.type !== "joined"), (0, rxjs_operators.map)((outcome) => outcome.type === "timeout" ? threadSocketEvents.joinTimedOut({ sessionId: action.sessionId }) : threadSocketEvents.joinFailed({ sessionId: action.sessionId })))).pipe((0, rxjs_operators.takeUntil)((0, rxjs.merge)(shutdown$, fatalSocketShutdown$)));
5734
5804
  });
5735
5805
  }))),
5736
- createEffect((actions$, state$) => actions$.pipe(ofType(threadSocketEvents.metadataReceived), (0, rxjs_operators.withLatestFrom)(state$), (0, rxjs_operators.filter)(([action, state]) => action.sessionId === state.sessionId), (0, rxjs_operators.map)(([action, state]) => {
5806
+ createEffect((actions$, state$) => actions$.pipe(ofType(threadSocketEvents.metadataReceived), (0, rxjs_operators.withLatestFrom)(state$), (0, rxjs_operators.filter)(([action, state]) => {
5737
5807
  var _state$context4;
5808
+ return action.sessionId === state.sessionId && threadMetadataTargetsAgent(action.payload, (_state$context4 = state.context) === null || _state$context4 === void 0 ? void 0 : _state$context4.agentId);
5809
+ }), (0, rxjs_operators.map)(([action, state]) => {
5810
+ var _state$context5;
5738
5811
  if (action.payload.operation === "deleted") return threadDomainEvents.threadDeleted({
5739
5812
  sessionId: action.sessionId,
5740
5813
  threadId: action.payload.deleted.id
5741
5814
  });
5742
- if (action.payload.operation === "archived" && !((_state$context4 = state.context) === null || _state$context4 === void 0 ? void 0 : _state$context4.includeArchived)) return threadDomainEvents.threadDeleted({
5815
+ if (action.payload.operation === "archived" && !((_state$context5 = state.context) === null || _state$context5 === void 0 ? void 0 : _state$context5.includeArchived)) return threadDomainEvents.threadDeleted({
5743
5816
  sessionId: action.sessionId,
5744
5817
  threadId: action.payload.threadId
5745
5818
  });