UNPKG

@assistant-ui/react-devtools

Version:

React development tools for assistant-ui components

104 lines 3.13 kB
// 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