feat: chat stream messages

This commit is contained in:
Shivering Ocelot committed 2026-05-31 22:24:07 -05:00
1 parent bc71fa4d59
commit 5d2f7609f4
5 files changed
+131 -10

No files matched your search

+26 -2
View File
@@ -1,5 +1,6 @@
import * as ui from './ui';
import Stream from './stream';
export class ChatInfo {
constructor({ id, name }) {
@@ -42,6 +43,16 @@ function createDeferred() {
return {promise, resolve, reject};
}
function createDeferredStream(callback) {
let resolve, reject;
const promise = new Promise((res, rej) => {
resolve = res;
reject = rej;
});
let deferred = {promise, resolve, reject};
return {promise, resolve (value) { callback(value, deferred) }, reject}
}
function initState () {
backendUrl = window.location.origin;
const tk = localStorage.getItem('loginToken');
@@ -126,12 +137,12 @@ export async function newToken () {
// --- Communication ---
export function sendAction(action, body = {}) {
export function sendAction(action, body = {}, callback = null) {
if (socket?.readyState !== WebSocket.OPEN) {
return Promise.reject(new Error("WebSocket is not open. Cannot send action."));
}
const nonce = nextNonce++;
const deferred = createDeferred();
const deferred = callback ? createDeferredStream(callback) : createDeferred();
pendingActions[nonce] = deferred;
deferred.promise.finally(() => {
@@ -320,6 +331,19 @@ export async function getAgent(agentId) {
return allAgents.find(it => it.id == agentId);
}
export function readStream(streamId) {
let stream = new Stream(streamId);
sendAction("read-stream", {streamId}, (packet, deferred) => {
if (packet.eof) {
stream.close();
deferred.resolve();
} else if (packet.data != null) {
stream.feed(packet.data);
}
});
return stream;
}
export function invalidateCache({ chats=false, agents=false } = {}) {
if (chats) cache.chats = null;
if (agents) cache.agents = null;