@copilotkit/core 1.56.0 → 1.56.2-canary.pin-to-send
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.cjs +196 -38
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +84 -20
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +84 -20
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +196 -38
- package/dist/index.mjs.map +1 -1
- package/dist/index.umd.js +201 -43
- package/dist/index.umd.js.map +1 -1
- package/package.json +3 -2
package/dist/index.umd.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
(function(global, factory) {
|
|
2
|
-
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@ag-ui/client'), require('@copilotkit/shared'), require('rxjs'), require('rxjs/operators'), require('phoenix'), require('zod-to-json-schema'), require('rxjs/fetch')) :
|
|
3
|
-
typeof define === 'function' && define.amd ? define(['exports', '@ag-ui/client', '@copilotkit/shared', 'rxjs', 'rxjs/operators', 'phoenix', 'zod-to-json-schema', 'rxjs/fetch'], factory) :
|
|
4
|
-
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global.CopilotKitCore = {}), global.AgUIClient,global.CopilotKitShared,global.rxjs,global.rxjs.operators,global.phoenix,global.zodToJsonSchema,global.rxjs_fetch));
|
|
5
|
-
})(this, function(exports, _ag_ui_client, _copilotkit_shared, rxjs, rxjs_operators, phoenix, zod_to_json_schema, rxjs_fetch) {
|
|
2
|
+
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@tanstack/pacer'), require('@ag-ui/client'), require('@copilotkit/shared'), require('rxjs'), require('rxjs/operators'), require('phoenix'), require('zod-to-json-schema'), require('rxjs/fetch')) :
|
|
3
|
+
typeof define === 'function' && define.amd ? define(['exports', '@tanstack/pacer', '@ag-ui/client', '@copilotkit/shared', 'rxjs', 'rxjs/operators', 'phoenix', 'zod-to-json-schema', 'rxjs/fetch'], factory) :
|
|
4
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global.CopilotKitCore = {}), global._tanstack_pacer,global.AgUIClient,global.CopilotKitShared,global.rxjs,global.rxjs.operators,global.phoenix,global.zodToJsonSchema,global.rxjs_fetch));
|
|
5
|
+
})(this, function(exports, _tanstack_pacer, _ag_ui_client, _copilotkit_shared, rxjs, rxjs_operators, phoenix, zod_to_json_schema, rxjs_fetch) {
|
|
6
6
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
7
7
|
|
|
8
8
|
//#region src/utils/phoenix-observable.ts
|
|
@@ -180,7 +180,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
180
180
|
_defineProperty(this, "config", void 0);
|
|
181
181
|
_defineProperty(this, "socket", null);
|
|
182
182
|
_defineProperty(this, "activeChannel", null);
|
|
183
|
-
_defineProperty(this, "
|
|
183
|
+
_defineProperty(this, "canonicalRunId", null);
|
|
184
184
|
_defineProperty(this, "sharedState", void 0);
|
|
185
185
|
this.config = config;
|
|
186
186
|
this.sharedState = sharedState;
|
|
@@ -217,7 +217,11 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
217
217
|
var _this$agentId;
|
|
218
218
|
this.isRunning = true;
|
|
219
219
|
this.agentId = (_this$agentId = this.agentId) !== null && _this$agentId !== void 0 ? _this$agentId : (0, _ag_ui_client.randomUUID)();
|
|
220
|
-
const
|
|
220
|
+
const effectiveParameters = (parameters === null || parameters === void 0 ? void 0 : parameters.runId) || !this.canonicalRunId ? parameters : {
|
|
221
|
+
...parameters,
|
|
222
|
+
runId: this.canonicalRunId
|
|
223
|
+
};
|
|
224
|
+
const input = this.prepareRunAgentInput(effectiveParameters);
|
|
221
225
|
let result;
|
|
222
226
|
const previousMessageIds = new Set(this.messages.map((m) => m.id));
|
|
223
227
|
const subscribers = [
|
|
@@ -256,14 +260,14 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
256
260
|
}
|
|
257
261
|
}
|
|
258
262
|
abortRun() {
|
|
259
|
-
if (this.activeChannel && this.
|
|
263
|
+
if (this.activeChannel && this.canonicalRunId) {
|
|
260
264
|
const fallback = setTimeout(() => clear(), 5e3);
|
|
261
265
|
const clear = () => {
|
|
262
266
|
clearTimeout(fallback);
|
|
263
267
|
this.detachActiveRun();
|
|
264
268
|
this.cleanup();
|
|
265
269
|
};
|
|
266
|
-
this.activeChannel.push(STOP_RUN_EVENT, { run_id: this.
|
|
270
|
+
this.activeChannel.push(STOP_RUN_EVENT, { run_id: this.canonicalRunId }).receive("ok", clear).receive("error", clear).receive("timeout", clear);
|
|
267
271
|
} else {
|
|
268
272
|
this.detachActiveRun();
|
|
269
273
|
this.cleanup();
|
|
@@ -275,7 +279,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
275
279
|
*/
|
|
276
280
|
run(input) {
|
|
277
281
|
this.threadId = input.threadId;
|
|
278
|
-
this.
|
|
282
|
+
this.canonicalRunId = input.runId;
|
|
279
283
|
return (0, rxjs.defer)(() => this.requestJoinCredentials$("run", input)).pipe((0, rxjs.switchMap)((credentials) => this.observeThread$(input, credentials, {
|
|
280
284
|
completeOnRunError: false,
|
|
281
285
|
streamMode: "run"
|
|
@@ -287,16 +291,14 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
287
291
|
*/
|
|
288
292
|
connect(input) {
|
|
289
293
|
this.threadId = input.threadId;
|
|
290
|
-
this.
|
|
294
|
+
this.canonicalRunId = input.runId;
|
|
291
295
|
return (0, rxjs.defer)(() => this.requestConnectPlan$(input)).pipe((0, rxjs.switchMap)((plan) => {
|
|
292
296
|
if (plan === null) return rxjs.EMPTY;
|
|
293
297
|
if (plan.mode === "bootstrap") {
|
|
294
298
|
this.setLastSeenEventId(input.threadId, plan.latestEventId);
|
|
295
|
-
for (const event of plan.events) this.updateRunIdFromEvent(event);
|
|
296
299
|
return (0, rxjs.from)(plan.events);
|
|
297
300
|
}
|
|
298
301
|
this.setLastSeenEventId(input.threadId, plan.joinFromEventId);
|
|
299
|
-
for (const event of plan.events) this.updateRunIdFromEvent(event);
|
|
300
302
|
return (0, rxjs.concat)((0, rxjs.from)(plan.events), this.observeThread$(input, { joinToken: plan.joinToken }, {
|
|
301
303
|
completeOnRunError: true,
|
|
302
304
|
streamMode: "connect",
|
|
@@ -319,7 +321,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
319
321
|
if (this.socket === ownSocket) this.socket = null;
|
|
320
322
|
}
|
|
321
323
|
if (this.threadId) this.sharedState.lastSeenEventIds.delete(this.threadId);
|
|
322
|
-
this.
|
|
324
|
+
this.canonicalRunId = null;
|
|
323
325
|
}
|
|
324
326
|
cleanup() {
|
|
325
327
|
this.cleanupOwned(this.activeChannel, this.socket);
|
|
@@ -455,7 +457,6 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
455
457
|
observeThreadEvents$(threadId, channel$, options) {
|
|
456
458
|
return channel$.pipe((0, rxjs_operators.switchMap)(({ channel }) => this.observeChannelEvent$(channel, CLIENT_AG_UI_EVENT)), (0, rxjs_operators.tap)((payload) => {
|
|
457
459
|
this.updateLastSeenEventId(threadId, payload);
|
|
458
|
-
this.updateRunIdFromEvent(payload);
|
|
459
460
|
}), (0, rxjs_operators.mergeMap)((payload) => (0, rxjs.from)(this.createThreadNotifications(payload, options.completeOnRunError))), (0, rxjs.dematerialize)());
|
|
460
461
|
}
|
|
461
462
|
observeChannelEvent$(channel, eventName) {
|
|
@@ -507,24 +508,6 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
507
508
|
if (!eventId) return;
|
|
508
509
|
this.sharedState.lastSeenEventIds.set(threadId, eventId);
|
|
509
510
|
}
|
|
510
|
-
/**
|
|
511
|
-
* Keep `this.runId` in sync with the backend's actual run ID.
|
|
512
|
-
*
|
|
513
|
-
* During a `connect` (resume) flow the client generates a fresh `runId`
|
|
514
|
-
* via `prepareRunAgentInput`, but the backend is running under its own
|
|
515
|
-
* run ID. If the client later sends `STOP_RUN_EVENT` with the wrong
|
|
516
|
-
* `runId`, the gateway's runner channel will not match it and the agent
|
|
517
|
-
* keeps running. Extracting the run ID from live events fixes this.
|
|
518
|
-
*
|
|
519
|
-
* The runner normalises events to `run_id` (snake_case) before pushing
|
|
520
|
-
* to the gateway, so we check both `runId` and `run_id`.
|
|
521
|
-
*/
|
|
522
|
-
updateRunIdFromEvent(payload) {
|
|
523
|
-
var _record$runId;
|
|
524
|
-
const record = payload;
|
|
525
|
-
const eventRunId = (_record$runId = record.runId) !== null && _record$runId !== void 0 ? _record$runId : record.run_id;
|
|
526
|
-
if (typeof eventRunId === "string" && eventRunId.length > 0) this.runId = eventRunId;
|
|
527
|
-
}
|
|
528
511
|
readEventId(payload) {
|
|
529
512
|
const metadata = payload.metadata;
|
|
530
513
|
if (!metadata || typeof metadata !== "object") return null;
|
|
@@ -967,6 +950,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
967
950
|
initialize(agents) {
|
|
968
951
|
this.localAgents = this.assignAgentIds(agents);
|
|
969
952
|
this.applyHeadersToAgents(this.localAgents);
|
|
953
|
+
this.applyCredentialsToAgents(this.localAgents);
|
|
970
954
|
this._agents = this.localAgents;
|
|
971
955
|
}
|
|
972
956
|
/**
|
|
@@ -996,6 +980,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
996
980
|
...this.remoteAgents
|
|
997
981
|
};
|
|
998
982
|
this.applyHeadersToAgents(this._agents);
|
|
983
|
+
this.applyCredentialsToAgents(this._agents);
|
|
999
984
|
this.notifyAgentsChanged();
|
|
1000
985
|
}
|
|
1001
986
|
/**
|
|
@@ -1005,6 +990,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
1005
990
|
this.validateAndAssignAgentId(id, agent);
|
|
1006
991
|
this.localAgents[id] = agent;
|
|
1007
992
|
this.applyHeadersToAgent(agent);
|
|
993
|
+
this.applyCredentialsToAgent(agent);
|
|
1008
994
|
this._agents = {
|
|
1009
995
|
...this.localAgents,
|
|
1010
996
|
...this.remoteAgents
|
|
@@ -2107,7 +2093,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
2107
2093
|
* Build frontend tools for an agent
|
|
2108
2094
|
*/
|
|
2109
2095
|
buildFrontendTools(agentId) {
|
|
2110
|
-
return this._tools.filter((tool) => tool.available !== false && (!tool.agentId || tool.agentId === agentId)).map((tool) => {
|
|
2096
|
+
return this._tools.filter((tool) => tool.available !== false && tool.available !== "disabled" && (!tool.agentId || tool.agentId === agentId)).map((tool) => {
|
|
2111
2097
|
var _tool$description;
|
|
2112
2098
|
return {
|
|
2113
2099
|
name: tool.name,
|
|
@@ -2470,8 +2456,21 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
2470
2456
|
CopilotKitCoreErrorCode["TRANSCRIPTION_RATE_LIMITED"] = "transcription_rate_limited";
|
|
2471
2457
|
CopilotKitCoreErrorCode["TRANSCRIPTION_AUTH_FAILED"] = "transcription_auth_failed";
|
|
2472
2458
|
CopilotKitCoreErrorCode["TRANSCRIPTION_NETWORK_ERROR"] = "transcription_network_error";
|
|
2459
|
+
CopilotKitCoreErrorCode["SUBSCRIBER_CALLBACK_FAILED"] = "subscriber_callback_failed";
|
|
2473
2460
|
return CopilotKitCoreErrorCode;
|
|
2474
2461
|
}({});
|
|
2462
|
+
/**
|
|
2463
|
+
* Runtime allowlist derived from {@link SUBSCRIBE_TO_AGENT_KEYS}. Hoisted
|
|
2464
|
+
* to module scope so the Set is allocated once, not per-subscription.
|
|
2465
|
+
*/
|
|
2466
|
+
const ALLOWED_KEYS = new Set([
|
|
2467
|
+
"onMessagesChanged",
|
|
2468
|
+
"onStateChanged",
|
|
2469
|
+
"onRunInitialized",
|
|
2470
|
+
"onRunFinalized",
|
|
2471
|
+
"onRunFailed",
|
|
2472
|
+
"onRunErrorEvent"
|
|
2473
|
+
]);
|
|
2475
2474
|
let CopilotKitCoreRuntimeConnectionStatus = /* @__PURE__ */ function(CopilotKitCoreRuntimeConnectionStatus) {
|
|
2476
2475
|
CopilotKitCoreRuntimeConnectionStatus["Disconnected"] = "disconnected";
|
|
2477
2476
|
CopilotKitCoreRuntimeConnectionStatus["Connected"] = "connected";
|
|
@@ -2540,6 +2539,16 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
2540
2539
|
}, "Subscriber onError error:");
|
|
2541
2540
|
}
|
|
2542
2541
|
/**
|
|
2542
|
+
* Log a message to the console and emit an error to subscribers.
|
|
2543
|
+
* Catches failures from `emitError` itself to prevent unhandled rejections.
|
|
2544
|
+
*/
|
|
2545
|
+
logAndEmitError(message, params, logLevel = "error") {
|
|
2546
|
+
console[logLevel](message, params.error);
|
|
2547
|
+
this.emitError(params).catch((emitErr) => {
|
|
2548
|
+
console.error(message + " — emitError itself failed:", emitErr);
|
|
2549
|
+
});
|
|
2550
|
+
}
|
|
2551
|
+
/**
|
|
2543
2552
|
* Snapshot accessors
|
|
2544
2553
|
*/
|
|
2545
2554
|
get context() {
|
|
@@ -2576,17 +2585,30 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
2576
2585
|
return this._properties;
|
|
2577
2586
|
}
|
|
2578
2587
|
/**
|
|
2579
|
-
* Default throttle interval (ms)
|
|
2580
|
-
*
|
|
2581
|
-
* `
|
|
2582
|
-
* or `<CopilotChat>` overrides this default and disables throttling.
|
|
2588
|
+
* Default throttle interval (ms) used by `subscribeToAgentWithOptions()`
|
|
2589
|
+
* when the caller does not specify an explicit `throttleMs`.
|
|
2590
|
+
* `undefined` means no default is configured; `0` means no throttling.
|
|
2583
2591
|
*/
|
|
2584
2592
|
get defaultThrottleMs() {
|
|
2585
2593
|
return this._defaultThrottleMs;
|
|
2586
2594
|
}
|
|
2595
|
+
/**
|
|
2596
|
+
* Set the default throttle interval (ms) for `subscribeToAgentWithOptions()`.
|
|
2597
|
+
*
|
|
2598
|
+
* Accepts a non-negative finite number or `undefined` (to clear the
|
|
2599
|
+
* default). Invalid values (NaN, Infinity, negative) are logged as
|
|
2600
|
+
* errors and ignored — the previous valid value is preserved.
|
|
2601
|
+
*/
|
|
2587
2602
|
setDefaultThrottleMs(value) {
|
|
2588
2603
|
if (value !== void 0 && (!Number.isFinite(value) || value < 0)) {
|
|
2589
|
-
this.
|
|
2604
|
+
this.logAndEmitError(`CopilotKitCore.setDefaultThrottleMs: value must be a non-negative finite number or undefined, got ${value}. Keeping current value (${this._defaultThrottleMs}).`, {
|
|
2605
|
+
error: /* @__PURE__ */ new Error(`setDefaultThrottleMs: invalid value (${value}), keeping current value (${this._defaultThrottleMs})`),
|
|
2606
|
+
code: CopilotKitCoreErrorCode.SUBSCRIBER_CALLBACK_FAILED,
|
|
2607
|
+
context: {
|
|
2608
|
+
value,
|
|
2609
|
+
currentValue: this._defaultThrottleMs
|
|
2610
|
+
}
|
|
2611
|
+
});
|
|
2590
2612
|
return;
|
|
2591
2613
|
}
|
|
2592
2614
|
this._defaultThrottleMs = value;
|
|
@@ -2713,6 +2735,138 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
2713
2735
|
} };
|
|
2714
2736
|
}
|
|
2715
2737
|
/**
|
|
2738
|
+
* Subscribe to an agent's notification and lifecycle events with
|
|
2739
|
+
* optional configuration (e.g. throttling).
|
|
2740
|
+
*
|
|
2741
|
+
* Wraps every callback with error protection (`safeCall`) and applies
|
|
2742
|
+
* the options before delegating to `agent.subscribe()`.
|
|
2743
|
+
*
|
|
2744
|
+
* See {@link SubscribeToAgentSubscriber} for the accepted callback subset
|
|
2745
|
+
* and the rationale for excluding AG-UI event handlers.
|
|
2746
|
+
*/
|
|
2747
|
+
subscribeToAgentWithOptions(agent, subscriber, options) {
|
|
2748
|
+
var _ref, _options$throttleMs;
|
|
2749
|
+
const resolved = (_ref = (_options$throttleMs = options === null || options === void 0 ? void 0 : options.throttleMs) !== null && _options$throttleMs !== void 0 ? _options$throttleMs : this._defaultThrottleMs) !== null && _ref !== void 0 ? _ref : 0;
|
|
2750
|
+
let effectiveMs = 0;
|
|
2751
|
+
if (!Number.isFinite(resolved) || resolved < 0) {
|
|
2752
|
+
const source = (options === null || options === void 0 ? void 0 : options.throttleMs) !== void 0 ? "throttleMs" : "defaultThrottleMs";
|
|
2753
|
+
this.logAndEmitError(`CopilotKitCore.subscribeToAgentWithOptions: ${source} must be a non-negative finite number, got ${resolved}. Falling back to unthrottled.`, {
|
|
2754
|
+
error: /* @__PURE__ */ new Error(`subscribeToAgentWithOptions: invalid ${source} (${resolved}), falling back to unthrottled`),
|
|
2755
|
+
code: CopilotKitCoreErrorCode.SUBSCRIBER_CALLBACK_FAILED,
|
|
2756
|
+
context: {
|
|
2757
|
+
agentId: agent.agentId,
|
|
2758
|
+
source,
|
|
2759
|
+
value: resolved
|
|
2760
|
+
}
|
|
2761
|
+
});
|
|
2762
|
+
} else effectiveMs = resolved;
|
|
2763
|
+
const agentLabel = agent.agentId || "(unknown agent)";
|
|
2764
|
+
const safeCall = (label, fn, ...args) => {
|
|
2765
|
+
const reportError = (err, verb) => {
|
|
2766
|
+
this.logAndEmitError(`CopilotKitCore.subscribeToAgentWithOptions[${agentLabel}]: ${label} callback ${verb}:`, {
|
|
2767
|
+
error: err instanceof Error ? err : new Error(String(err)),
|
|
2768
|
+
code: CopilotKitCoreErrorCode.SUBSCRIBER_CALLBACK_FAILED,
|
|
2769
|
+
context: {
|
|
2770
|
+
agentId: agent.agentId,
|
|
2771
|
+
callback: label
|
|
2772
|
+
}
|
|
2773
|
+
});
|
|
2774
|
+
};
|
|
2775
|
+
try {
|
|
2776
|
+
const result = fn(...args);
|
|
2777
|
+
if (result instanceof Promise) return result.catch((err) => {
|
|
2778
|
+
reportError(err, "rejected");
|
|
2779
|
+
});
|
|
2780
|
+
return result;
|
|
2781
|
+
} catch (err) {
|
|
2782
|
+
reportError(err, "threw");
|
|
2783
|
+
}
|
|
2784
|
+
};
|
|
2785
|
+
const guardAll = (sub) => {
|
|
2786
|
+
const guarded = {};
|
|
2787
|
+
if (sub.onMessagesChanged) {
|
|
2788
|
+
const fn = sub.onMessagesChanged;
|
|
2789
|
+
guarded.onMessagesChanged = (params) => safeCall("onMessagesChanged", fn, params);
|
|
2790
|
+
}
|
|
2791
|
+
if (sub.onStateChanged) {
|
|
2792
|
+
const fn = sub.onStateChanged;
|
|
2793
|
+
guarded.onStateChanged = (params) => safeCall("onStateChanged", fn, params);
|
|
2794
|
+
}
|
|
2795
|
+
if (sub.onRunInitialized) {
|
|
2796
|
+
const fn = sub.onRunInitialized;
|
|
2797
|
+
guarded.onRunInitialized = (params) => safeCall("onRunInitialized", fn, params);
|
|
2798
|
+
}
|
|
2799
|
+
if (sub.onRunFinalized) {
|
|
2800
|
+
const fn = sub.onRunFinalized;
|
|
2801
|
+
guarded.onRunFinalized = (params) => safeCall("onRunFinalized", fn, params);
|
|
2802
|
+
}
|
|
2803
|
+
if (sub.onRunFailed) {
|
|
2804
|
+
const fn = sub.onRunFailed;
|
|
2805
|
+
guarded.onRunFailed = (params) => safeCall("onRunFailed", fn, params);
|
|
2806
|
+
}
|
|
2807
|
+
if (sub.onRunErrorEvent) {
|
|
2808
|
+
const fn = sub.onRunErrorEvent;
|
|
2809
|
+
guarded.onRunErrorEvent = (params) => safeCall("onRunErrorEvent", fn, params);
|
|
2810
|
+
}
|
|
2811
|
+
return guarded;
|
|
2812
|
+
};
|
|
2813
|
+
for (const key of Object.keys(subscriber)) if (typeof subscriber[key] === "function" && !ALLOWED_KEYS.has(key)) {
|
|
2814
|
+
const message = `CopilotKitCore.subscribeToAgentWithOptions[${agentLabel}]: callback "${key}" is not supported and was dropped. Supported callbacks: ${Array.from(ALLOWED_KEYS).join(", ")}. Use agent.subscribe() directly for event handlers and per-item notifications.`;
|
|
2815
|
+
this.logAndEmitError(message, {
|
|
2816
|
+
error: new Error(message),
|
|
2817
|
+
code: CopilotKitCoreErrorCode.SUBSCRIBER_CALLBACK_FAILED,
|
|
2818
|
+
context: {
|
|
2819
|
+
agentId: agent.agentId,
|
|
2820
|
+
droppedCallback: key
|
|
2821
|
+
}
|
|
2822
|
+
}, "warn");
|
|
2823
|
+
}
|
|
2824
|
+
if (effectiveMs <= 0) {
|
|
2825
|
+
const subscription = agent.subscribe(guardAll(subscriber));
|
|
2826
|
+
return { unsubscribe: () => subscription.unsubscribe() };
|
|
2827
|
+
}
|
|
2828
|
+
let active = true;
|
|
2829
|
+
let latestMessagesParams = null;
|
|
2830
|
+
let latestStateParams = null;
|
|
2831
|
+
const flushPending = () => {
|
|
2832
|
+
if (active && subscriber.onMessagesChanged && latestMessagesParams) {
|
|
2833
|
+
const params = latestMessagesParams;
|
|
2834
|
+
latestMessagesParams = null;
|
|
2835
|
+
safeCall("onMessagesChanged", subscriber.onMessagesChanged, params);
|
|
2836
|
+
}
|
|
2837
|
+
if (active && subscriber.onStateChanged && latestStateParams) {
|
|
2838
|
+
const params = latestStateParams;
|
|
2839
|
+
latestStateParams = null;
|
|
2840
|
+
safeCall("onStateChanged", subscriber.onStateChanged, params);
|
|
2841
|
+
}
|
|
2842
|
+
};
|
|
2843
|
+
const throttler = new _tanstack_pacer.Throttler(flushPending, {
|
|
2844
|
+
wait: effectiveMs,
|
|
2845
|
+
leading: true,
|
|
2846
|
+
trailing: true
|
|
2847
|
+
});
|
|
2848
|
+
const lifecycleOnly = {};
|
|
2849
|
+
if (subscriber.onRunInitialized) lifecycleOnly.onRunInitialized = subscriber.onRunInitialized;
|
|
2850
|
+
if (subscriber.onRunFinalized) lifecycleOnly.onRunFinalized = subscriber.onRunFinalized;
|
|
2851
|
+
if (subscriber.onRunFailed) lifecycleOnly.onRunFailed = subscriber.onRunFailed;
|
|
2852
|
+
if (subscriber.onRunErrorEvent) lifecycleOnly.onRunErrorEvent = subscriber.onRunErrorEvent;
|
|
2853
|
+
const wrappedSubscriber = guardAll(lifecycleOnly);
|
|
2854
|
+
if (subscriber.onMessagesChanged) wrappedSubscriber.onMessagesChanged = (params) => {
|
|
2855
|
+
latestMessagesParams = params;
|
|
2856
|
+
throttler.maybeExecute();
|
|
2857
|
+
};
|
|
2858
|
+
if (subscriber.onStateChanged) wrappedSubscriber.onStateChanged = (params) => {
|
|
2859
|
+
latestStateParams = params;
|
|
2860
|
+
throttler.maybeExecute();
|
|
2861
|
+
};
|
|
2862
|
+
const subscription = agent.subscribe(wrappedSubscriber);
|
|
2863
|
+
return { unsubscribe: () => {
|
|
2864
|
+
active = false;
|
|
2865
|
+
throttler.cancel();
|
|
2866
|
+
subscription.unsubscribe();
|
|
2867
|
+
} };
|
|
2868
|
+
}
|
|
2869
|
+
/**
|
|
2716
2870
|
* Agent connectivity (delegated to RunHandler)
|
|
2717
2871
|
*/
|
|
2718
2872
|
async connectAgent(params) {
|
|
@@ -3261,15 +3415,19 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
3261
3415
|
threadUpserted: props(),
|
|
3262
3416
|
threadDeleted: props()
|
|
3263
3417
|
});
|
|
3264
|
-
function
|
|
3265
|
-
return [...threads].sort((left, right) =>
|
|
3418
|
+
function sortThreadsByRecency(threads) {
|
|
3419
|
+
return [...threads].sort((left, right) => {
|
|
3420
|
+
var _ref, _left$lastRunAt, _ref2, _right$lastRunAt;
|
|
3421
|
+
const leftKey = (_ref = (_left$lastRunAt = left.lastRunAt) !== null && _left$lastRunAt !== void 0 ? _left$lastRunAt : left.updatedAt) !== null && _ref !== void 0 ? _ref : left.createdAt;
|
|
3422
|
+
return ((_ref2 = (_right$lastRunAt = right.lastRunAt) !== null && _right$lastRunAt !== void 0 ? _right$lastRunAt : right.updatedAt) !== null && _ref2 !== void 0 ? _ref2 : right.createdAt).localeCompare(leftKey);
|
|
3423
|
+
});
|
|
3266
3424
|
}
|
|
3267
3425
|
function upsertThread(threads, thread) {
|
|
3268
3426
|
const existingIndex = threads.findIndex((item) => item.id === thread.id);
|
|
3269
|
-
if (existingIndex === -1) return
|
|
3427
|
+
if (existingIndex === -1) return sortThreadsByRecency([...threads, thread]);
|
|
3270
3428
|
const next = [...threads];
|
|
3271
3429
|
next[existingIndex] = thread;
|
|
3272
|
-
return
|
|
3430
|
+
return sortThreadsByRecency(next);
|
|
3273
3431
|
}
|
|
3274
3432
|
const threadReducer = createReducer(initialThreadState, on(threadAdapterEvents.contextChanged, (state, { context }) => ({
|
|
3275
3433
|
...state,
|
|
@@ -3302,7 +3460,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
3302
3460
|
if (sessionId !== state.sessionId) return state;
|
|
3303
3461
|
return {
|
|
3304
3462
|
...state,
|
|
3305
|
-
threads:
|
|
3463
|
+
threads: sortThreadsByRecency(threads),
|
|
3306
3464
|
isLoading: false,
|
|
3307
3465
|
error: null,
|
|
3308
3466
|
metadataJoinCode: joinCode,
|