@assistant-ui/react-devtools
Version:
React development tools for assistant-ui components
104 lines • 3.13 kB
JavaScript
// src/DevToolsHost.ts
import { DevToolsHooks } from "@assistant-ui/react";
import {
sanitizeForMessage,
serializeModelContext
} from "./utils/serialization.js";
var DevToolsHost = class {
subscription = {
apiList: false,
apis: /* @__PURE__ */ new Set()
};
unsubscribe;
onSendMessage;
constructor(onSendMessage) {
this.onSendMessage = onSendMessage;
this.subscribeToDevTools();
}
onReceiveMessage(message) {
switch (message.type) {
case "subscription":
this.handleSubscription(message.data);
break;
case "clearEvents":
if (typeof message.data.apiId === "number") {
DevToolsHooks.clearEventLogs(message.data.apiId);
}
break;
}
}
handleSubscription(data) {
const prevApiList = this.subscription.apiList;
const prevApis = new Set(this.subscription.apis);
this.subscription.apiList = data.apiList || false;
this.subscription.apis = new Set(data.apis);
const apisChanged = prevApis.size !== this.subscription.apis.size || [...this.subscription.apis].some((id) => !prevApis.has(id));
if (prevApiList !== this.subscription.apiList || apisChanged) {
this.sendUpdate();
}
}
subscribeToDevTools() {
this.unsubscribe = DevToolsHooks.subscribe(() => {
this.sendUpdate();
});
}
sendUpdate() {
const update = {
type: "update",
data: {}
};
const allApis = DevToolsHooks.getApis();
for (const subscriptionApiId of this.subscription.apis) {
if (!allApis.has(subscriptionApiId)) {
this.subscription.apis.delete(subscriptionApiId);
}
}
if (this.subscription.apiList) {
update.data.apiList = [...allApis.keys()].map((apiId) => ({ apiId }));
if (this.subscription.apis.size === 0 && allApis.size > 0) {
this.subscription.apis = /* @__PURE__ */ new Set([allApis.keys().next().value]);
}
}
if (this.subscription.apis.size > 0) {
update.data.apis = [];
for (const apiId of this.subscription.apis) {
const apiEntry = allApis.get(apiId);
if (apiEntry) {
const state = {};
if (apiEntry.api) {
for (const [name, scope] of Object.entries(apiEntry.api)) {
if (typeof scope === "function" && "source" in scope) {
if (scope.source === "root") {
const scopeValue = scope();
state[name] = scopeValue?.getState?.() ?? scopeValue;
}
}
}
}
const modelContext = serializeModelContext(
apiEntry.api?.thread?.().getModelContext()
);
update.data.apis.push({
apiId,
state: sanitizeForMessage(state),
events: sanitizeForMessage(apiEntry.logs),
modelContext
});
}
}
}
if (Object.keys(update.data).length === 0) {
return;
}
this.onSendMessage(update);
}
destroy() {
if (this.unsubscribe) {
this.unsubscribe();
}
}
};
export {
DevToolsHost
};
//# sourceMappingURL=DevToolsHost.js.map