@zhin.js/client 1.0.18 → 1.1.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.
Files changed (51) hide show
  1. package/client/bootstrap/loadConsoleEntries.test.ts +32 -0
  2. package/client/bootstrap/loadConsoleEntries.ts +149 -0
  3. package/client/console-utils/cn.ts +6 -0
  4. package/client/console-utils/remoteApi.ts +48 -0
  5. package/client/index.ts +24 -5
  6. package/client/persistence/idb-store.ts +76 -0
  7. package/client/runtime/index.ts +12 -0
  8. package/client/store/createRegistryStore.ts +46 -0
  9. package/client/websocket/manager.ts +136 -3
  10. package/client/websocket/remote-settings.ts +25 -0
  11. package/dist/bootstrap/loadConsoleEntries.d.ts +26 -0
  12. package/dist/bootstrap/loadConsoleEntries.d.ts.map +1 -0
  13. package/dist/bootstrap/loadConsoleEntries.js +111 -0
  14. package/dist/bootstrap/loadConsoleEntries.js.map +1 -0
  15. package/dist/bootstrap/loadConsoleEntries.test.d.ts +2 -0
  16. package/dist/bootstrap/loadConsoleEntries.test.d.ts.map +1 -0
  17. package/dist/bootstrap/loadConsoleEntries.test.js +27 -0
  18. package/dist/bootstrap/loadConsoleEntries.test.js.map +1 -0
  19. package/dist/console-utils/cn.d.ts +3 -0
  20. package/dist/console-utils/cn.d.ts.map +1 -0
  21. package/dist/console-utils/cn.js +6 -0
  22. package/dist/console-utils/cn.js.map +1 -0
  23. package/dist/console-utils/remoteApi.d.ts +7 -0
  24. package/dist/console-utils/remoteApi.d.ts.map +1 -0
  25. package/dist/console-utils/remoteApi.js +41 -0
  26. package/dist/console-utils/remoteApi.js.map +1 -0
  27. package/dist/index.d.ts +5 -1
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +5 -2
  30. package/dist/index.js.map +1 -1
  31. package/dist/persistence/idb-store.d.ts +15 -0
  32. package/dist/persistence/idb-store.d.ts.map +1 -0
  33. package/dist/persistence/idb-store.js +61 -0
  34. package/dist/persistence/idb-store.js.map +1 -0
  35. package/dist/runtime/index.d.ts +6 -0
  36. package/dist/runtime/index.d.ts.map +1 -0
  37. package/dist/runtime/index.js +10 -0
  38. package/dist/runtime/index.js.map +1 -0
  39. package/dist/store/createRegistryStore.d.ts +9 -0
  40. package/dist/store/createRegistryStore.d.ts.map +1 -0
  41. package/dist/store/createRegistryStore.js +38 -0
  42. package/dist/store/createRegistryStore.js.map +1 -0
  43. package/dist/websocket/manager.d.ts +5 -0
  44. package/dist/websocket/manager.d.ts.map +1 -1
  45. package/dist/websocket/manager.js +134 -2
  46. package/dist/websocket/manager.js.map +1 -1
  47. package/dist/websocket/remote-settings.d.ts +5 -0
  48. package/dist/websocket/remote-settings.d.ts.map +1 -0
  49. package/dist/websocket/remote-settings.js +23 -0
  50. package/dist/websocket/remote-settings.js.map +1 -0
  51. package/package.json +6 -5
@@ -0,0 +1,111 @@
1
+ import { DEFAULT_CONSOLE_BASE_PATH } from "@zhin.js/console-types";
2
+ export function createPluginRegisterHostApi(options) {
3
+ const addRoute = options.addRoute;
4
+ return {
5
+ React: options.React,
6
+ addRoute,
7
+ addPage: addRoute,
8
+ addTool: options.addTool,
9
+ };
10
+ }
11
+ const CONSOLE_API_BASE_STORAGE_KEY = "zhin_api_base";
12
+ function resolveStoredApiBase() {
13
+ if (typeof window === "undefined")
14
+ return "";
15
+ const stored = localStorage.getItem(CONSOLE_API_BASE_STORAGE_KEY)?.trim();
16
+ return stored ? stored.replace(/\/$/, "") : "";
17
+ }
18
+ function defaultEntriesUrl() {
19
+ const apiBase = resolveStoredApiBase();
20
+ if (apiBase)
21
+ return `${apiBase}/entries`;
22
+ const root = DEFAULT_CONSOLE_BASE_PATH.replace(/\/$/, "");
23
+ return `${root ? `${root}/entries` : "/entries"}`;
24
+ }
25
+ function resolveRequestUrl(pathOrUrl) {
26
+ if (pathOrUrl.startsWith("http://") || pathOrUrl.startsWith("https://"))
27
+ return pathOrUrl;
28
+ if (typeof window === "undefined")
29
+ return pathOrUrl;
30
+ const apiBase = resolveStoredApiBase();
31
+ const origin = apiBase || window.location.origin;
32
+ return new URL(pathOrUrl, `${origin}/`).href;
33
+ }
34
+ function resolvePluginImportUrl(resolvedModule, assetOrigin) {
35
+ if (resolvedModule.startsWith("http://") || resolvedModule.startsWith("https://"))
36
+ return resolvedModule;
37
+ if (typeof window === "undefined")
38
+ return resolvedModule;
39
+ const origin = assetOrigin?.replace(/\/$/, "") || window.location.origin;
40
+ return new URL(resolvedModule, `${origin}/`).href;
41
+ }
42
+ function resolveFetchInit(init) {
43
+ return typeof init === "function" ? init() : (init ?? {});
44
+ }
45
+ export async function fetchConsoleEntries(options) {
46
+ const pathOrUrl = options?.entriesUrl ?? defaultEntriesUrl();
47
+ const url = resolveRequestUrl(pathOrUrl);
48
+ const init = resolveFetchInit(options?.fetchInit);
49
+ const res = await fetch(url, {
50
+ ...init,
51
+ signal: options?.signal ?? init.signal,
52
+ });
53
+ if (!res.ok)
54
+ throw Object.assign(new Error(`load entries failed: ${res.status}`), { status: res.status });
55
+ return (await res.json());
56
+ }
57
+ export function getRegisterFn(mod) {
58
+ if (!mod)
59
+ return null;
60
+ const r = mod["register"];
61
+ if (typeof r === "function")
62
+ return r;
63
+ const d = mod["default"];
64
+ if (d && typeof d["register"] === "function")
65
+ return d["register"];
66
+ return null;
67
+ }
68
+ export async function registerConsolePluginsFromEntries(entries, hostApi, onEntryError, assetOrigin) {
69
+ if (!entries.length)
70
+ return;
71
+ await Promise.all(entries.map(async (entry) => {
72
+ try {
73
+ const specifier = resolvePluginImportUrl(entry.resolvedModule, assetOrigin);
74
+ const mod = (await import(/* @vite-ignore */ specifier));
75
+ const register = getRegisterFn(mod);
76
+ if (register)
77
+ await register(hostApi);
78
+ else
79
+ throw new Error(`entry "${entry.id}" has no register export`);
80
+ }
81
+ catch (error) {
82
+ if (onEntryError)
83
+ onEntryError(entry, error);
84
+ else
85
+ throw error;
86
+ }
87
+ }));
88
+ }
89
+ export async function loadConsoleEntries(options) {
90
+ options.beforeLoad?.();
91
+ let data;
92
+ try {
93
+ data = await fetchConsoleEntries(options);
94
+ }
95
+ catch (error) {
96
+ const status = typeof error.status === "number"
97
+ ? error.status
98
+ : 0;
99
+ if (options.onFetchError) {
100
+ options.onFetchError(status);
101
+ return;
102
+ }
103
+ throw error;
104
+ }
105
+ if (!data.entries?.length) {
106
+ options.onEmpty?.();
107
+ return;
108
+ }
109
+ await registerConsolePluginsFromEntries(data.entries, options.hostApi, options.onEntryError, options.assetOrigin);
110
+ }
111
+ //# sourceMappingURL=loadConsoleEntries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadConsoleEntries.js","sourceRoot":"","sources":["../../client/bootstrap/loadConsoleEntries.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=loadConsoleEntries.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadConsoleEntries.test.d.ts","sourceRoot":"","sources":["../../client/bootstrap/loadConsoleEntries.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,27 @@
1
+ import { describe, expect, it, vi } from "vitest";
2
+ import { createPluginRegisterHostApi, getRegisterFn } from "./loadConsoleEntries.js";
3
+ describe("console entries bootstrap", () => {
4
+ it("resolves named register export", () => {
5
+ const register = () => { };
6
+ expect(getRegisterFn({ register })).toBe(register);
7
+ });
8
+ it("resolves default register export", () => {
9
+ const register = () => { };
10
+ expect(getRegisterFn({ default: { register } })).toBe(register);
11
+ });
12
+ it("returns null when no register export exists", () => {
13
+ expect(getRegisterFn({ default: {} })).toBeNull();
14
+ });
15
+ it("creates a host API with addPage aliased to addRoute", () => {
16
+ const React = {};
17
+ const addRoute = vi.fn();
18
+ const addTool = vi.fn(() => "tool-id");
19
+ const api = createPluginRegisterHostApi({ React, addRoute, addTool });
20
+ api.addPage({ path: "/x", name: "x", element: "page" });
21
+ api.addRoute({ path: "/y", name: "y", element: "route" });
22
+ expect(api.React).toBe(React);
23
+ expect(addRoute).toHaveBeenCalledTimes(2);
24
+ expect(api.addTool({ id: "t", name: "T" })).toBe("tool-id");
25
+ });
26
+ });
27
+ //# sourceMappingURL=loadConsoleEntries.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadConsoleEntries.test.js","sourceRoot":"","sources":["../../client/bootstrap/loadConsoleEntries.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,2BAA2B,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAErF,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,QAAQ,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;QAC1B,MAAM,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,QAAQ,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;QAC1B,MAAM,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,KAAK,GAAG,EAAS,CAAC;QACxB,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,2BAA2B,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QAEtE,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,MAAa,EAAE,CAAC,CAAC;QAC/D,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,OAAc,EAAE,CAAC,CAAC;QACjE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type ClassValue } from "clsx";
2
+ export declare function cn(...inputs: ClassValue[]): string;
3
+ //# sourceMappingURL=cn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cn.d.ts","sourceRoot":"","sources":["../../client/console-utils/cn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAQ,MAAM,MAAM,CAAC;AAG7C,wBAAgB,EAAE,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,UAEzC"}
@@ -0,0 +1,6 @@
1
+ import { clsx } from "clsx";
2
+ import { twMerge } from "tailwind-merge";
3
+ export function cn(...inputs) {
4
+ return twMerge(clsx(inputs));
5
+ }
6
+ //# sourceMappingURL=cn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cn.js","sourceRoot":"","sources":["../../client/console-utils/cn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,IAAI,EAAE,MAAM,MAAM,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,MAAM,UAAU,EAAE,CAAC,GAAG,MAAoB;IACxC,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare function getApiBase(): string;
2
+ export declare function getToken(): string | null;
3
+ export declare function resolveApiUrl(path: string): string;
4
+ export declare function resolveWebSocketUrl(path: string): string;
5
+ /** fetch with Bearer token; relative paths resolve against {@link getApiBase}. */
6
+ export declare function apiFetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response>;
7
+ //# sourceMappingURL=remoteApi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remoteApi.d.ts","sourceRoot":"","sources":["../../client/console-utils/remoteApi.ts"],"names":[],"mappings":"AAGA,wBAAgB,UAAU,IAAI,MAAM,CAKnC;AAED,wBAAgB,QAAQ,IAAI,MAAM,GAAG,IAAI,CAExC;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIlD;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKxD;AAED,kFAAkF;AAClF,wBAAsB,QAAQ,CAC5B,KAAK,EAAE,WAAW,GAAG,GAAG,EACxB,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,QAAQ,CAAC,CAgBnB"}
@@ -0,0 +1,41 @@
1
+ const TOKEN_KEY = "zhin_api_token";
2
+ const API_BASE_KEY = "zhin_api_base";
3
+ export function getApiBase() {
4
+ const stored = localStorage.getItem(API_BASE_KEY)?.trim();
5
+ if (stored)
6
+ return stored.replace(/\/$/, "");
7
+ if (typeof window !== "undefined")
8
+ return window.location.origin;
9
+ return "";
10
+ }
11
+ export function getToken() {
12
+ return localStorage.getItem(TOKEN_KEY);
13
+ }
14
+ export function resolveApiUrl(path) {
15
+ const base = getApiBase();
16
+ const p = path.startsWith("/") ? path : `/${path}`;
17
+ return `${base}${p}`;
18
+ }
19
+ export function resolveWebSocketUrl(path) {
20
+ const httpUrl = resolveApiUrl(path);
21
+ const url = new URL(httpUrl);
22
+ url.protocol = url.protocol === "https:" ? "wss:" : "ws:";
23
+ return url.href;
24
+ }
25
+ /** fetch with Bearer token; relative paths resolve against {@link getApiBase}. */
26
+ export async function apiFetch(input, init) {
27
+ const token = getToken();
28
+ const headers = new Headers(init?.headers);
29
+ if (token)
30
+ headers.set("Authorization", `Bearer ${token}`);
31
+ const url = typeof input === "string" && input.startsWith("/")
32
+ ? resolveApiUrl(input)
33
+ : input;
34
+ const res = await fetch(url, { ...init, headers });
35
+ if (res.status === 401) {
36
+ localStorage.removeItem(TOKEN_KEY);
37
+ window.dispatchEvent(new CustomEvent("zhin:auth-required"));
38
+ }
39
+ return res;
40
+ }
41
+ //# sourceMappingURL=remoteApi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remoteApi.js","sourceRoot":"","sources":["../../client/console-utils/remoteApi.ts"],"names":[],"mappings":"AAAA,MAAM,SAAS,GAAG,gBAAgB,CAAC;AACnC,MAAM,YAAY,GAAG,eAAe,CAAC;AAErC,MAAM,UAAU,UAAU;IACxB,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,CAAC;IAC1D,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC7C,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;IACjE,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,OAAO,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;IAC1B,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;IACnD,OAAO,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IAC7B,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;IAC1D,OAAO,GAAG,CAAC,IAAI,CAAC;AAClB,CAAC;AAED,kFAAkF;AAClF,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,KAAwB,EACxB,IAAkB;IAElB,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3C,IAAI,KAAK;QAAE,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,KAAK,EAAE,CAAC,CAAC;IAE3D,MAAM,GAAG,GACP,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;QAChD,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC;QACtB,CAAC,CAAC,KAAK,CAAC;IAEZ,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACnD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACvB,YAAY,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACnC,MAAM,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
package/dist/index.d.ts CHANGED
@@ -4,5 +4,9 @@ export { app, type ConsoleApp, type AddRouteInput, type AddToolInput, type Conso
4
4
  export * from "./websocket";
5
5
  export type { PluginRegisterHostApi, PluginAddRouteInput, PluginAddToolInput, ConsolePluginRegister, ConsoleClientEntry, ConsoleEntriesResponse, ConsoleEntry, ConsoleFileAddEntryInput, RuntimeEnv, } from "@zhin.js/console-types";
6
6
  export { DEFAULT_CONSOLE_BASE_PATH, CONSOLE_HOST_REACT_NAMESPACE_KEY, } from "@zhin.js/console-types";
7
- export { createRegistryStore, useRegistry, type RegistryStore, configureConsole, getRuntimeEnv, cn, } from "@zhin.js/console-core/browser";
7
+ export { configureConsole, getRuntimeEnv } from "./runtime/index.js";
8
+ export { createRegistryStore, useRegistry, type RegistryStore, } from "./store/createRegistryStore.js";
9
+ export { cn } from "./console-utils/cn.js";
10
+ export { apiFetch, getApiBase, getToken, resolveApiUrl, resolveWebSocketUrl, } from "./console-utils/remoteApi.js";
11
+ export { fetchConsoleEntries, createPluginRegisterHostApi, getRegisterFn, loadConsoleEntries, registerConsolePluginsFromEntries, type CreatePluginRegisterHostApiOptions, type FetchConsoleEntriesOptions, type LoadConsoleEntriesOptions, } from "./bootstrap/loadConsoleEntries.js";
8
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../client/index.ts"],"names":[],"mappings":"AACA,cAAc,SAAS,CAAC;AAGxB,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAG9E,OAAO,EACL,GAAG,EACH,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,oBAAoB,GAC1B,MAAM,OAAO,CAAC;AAGf,cAAc,aAAa,CAAC;AAG5B,YAAY,EACV,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EAClB,sBAAsB,EACtB,YAAY,EACZ,wBAAwB,EACxB,UAAU,GACX,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,yBAAyB,EACzB,gCAAgC,GACjC,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,mBAAmB,EACnB,WAAW,EACX,KAAK,aAAa,EAClB,gBAAgB,EAChB,aAAa,EACb,EAAE,GACH,MAAM,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../client/index.ts"],"names":[],"mappings":"AACA,cAAc,SAAS,CAAC;AAGxB,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAG9E,OAAO,EACL,GAAG,EACH,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,oBAAoB,GAC1B,MAAM,OAAO,CAAC;AAGf,cAAc,aAAa,CAAC;AAG5B,YAAY,EACV,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EAClB,sBAAsB,EACtB,YAAY,EACZ,wBAAwB,EACxB,UAAU,GACX,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,yBAAyB,EACzB,gCAAgC,GACjC,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAErE,OAAO,EACL,mBAAmB,EACnB,WAAW,EACX,KAAK,aAAa,GACnB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EAAE,EAAE,EAAE,MAAM,uBAAuB,CAAC;AAE3C,OAAO,EACL,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,aAAa,EACb,mBAAmB,GACpB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,mBAAmB,EACnB,2BAA2B,EAC3B,aAAa,EACb,kBAAkB,EAClB,iCAAiC,EACjC,KAAK,kCAAkC,EACvC,KAAK,0BAA0B,EAC/B,KAAK,yBAAyB,GAC/B,MAAM,mCAAmC,CAAC"}
package/dist/index.js CHANGED
@@ -7,6 +7,9 @@ export { app, } from "./app";
7
7
  // WebSocket (business data only)
8
8
  export * from "./websocket";
9
9
  export { DEFAULT_CONSOLE_BASE_PATH, CONSOLE_HOST_REACT_NAMESPACE_KEY, } from "@zhin.js/console-types";
10
- // Re-export console-core browser utilities
11
- export { createRegistryStore, useRegistry, configureConsole, getRuntimeEnv, cn, } from "@zhin.js/console-core/browser";
10
+ export { configureConsole, getRuntimeEnv } from "./runtime/index.js";
11
+ export { createRegistryStore, useRegistry, } from "./store/createRegistryStore.js";
12
+ export { cn } from "./console-utils/cn.js";
13
+ export { apiFetch, getApiBase, getToken, resolveApiUrl, resolveWebSocketUrl, } from "./console-utils/remoteApi.js";
14
+ export { fetchConsoleEntries, createPluginRegisterHostApi, getRegisterFn, loadConsoleEntries, registerConsolePluginsFromEntries, } from "./bootstrap/loadConsoleEntries.js";
12
15
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../client/index.ts"],"names":[],"mappings":"AAAA,QAAQ;AACR,cAAc,SAAS,CAAC;AAExB,uBAAuB;AACvB,OAAO,EAAE,eAAe,EAAE,eAAe,EAAkB,MAAM,YAAY,CAAC;AAE9E,6CAA6C;AAC7C,OAAO,EACL,GAAG,GAQJ,MAAM,OAAO,CAAC;AAEf,iCAAiC;AACjC,cAAc,aAAa,CAAC;AAe5B,OAAO,EACL,yBAAyB,EACzB,gCAAgC,GACjC,MAAM,wBAAwB,CAAC;AAEhC,2CAA2C;AAC3C,OAAO,EACL,mBAAmB,EACnB,WAAW,EAEX,gBAAgB,EAChB,aAAa,EACb,EAAE,GACH,MAAM,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../client/index.ts"],"names":[],"mappings":"AAAA,QAAQ;AACR,cAAc,SAAS,CAAC;AAExB,uBAAuB;AACvB,OAAO,EAAE,eAAe,EAAE,eAAe,EAAkB,MAAM,YAAY,CAAC;AAE9E,6CAA6C;AAC7C,OAAO,EACL,GAAG,GAQJ,MAAM,OAAO,CAAC;AAEf,iCAAiC;AACjC,cAAc,aAAa,CAAC;AAe5B,OAAO,EACL,yBAAyB,EACzB,gCAAgC,GACjC,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAErE,OAAO,EACL,mBAAmB,EACnB,WAAW,GAEZ,MAAM,gCAAgC,CAAC;AAExC,OAAO,EAAE,EAAE,EAAE,MAAM,uBAAuB,CAAC;AAE3C,OAAO,EACL,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,aAAa,EACb,mBAAmB,GACpB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,mBAAmB,EACnB,2BAA2B,EAC3B,aAAa,EACb,kBAAkB,EAClB,iCAAiC,GAIlC,MAAM,mCAAmC,CAAC"}
@@ -0,0 +1,15 @@
1
+ export type InboxRecord = {
2
+ id: string;
3
+ adapter: string;
4
+ botId: string;
5
+ kind: "message" | "request" | "notice";
6
+ payload: unknown;
7
+ updatedAt: number;
8
+ };
9
+ export declare function idbPutInbox(record: InboxRecord): Promise<void>;
10
+ export declare function idbListInbox(adapter: string, botId: string, kind: InboxRecord["kind"]): Promise<InboxRecord[]>;
11
+ export declare function applyConsoleEvent(event: {
12
+ type: string;
13
+ data?: unknown;
14
+ }): Promise<void>;
15
+ //# sourceMappingURL=idb-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idb-store.d.ts","sourceRoot":"","sources":["../../client/persistence/idb-store.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAmBF,wBAAsB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CASpE;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,GACxB,OAAO,CAAC,WAAW,EAAE,CAAC,CAUxB;AAED,wBAAsB,iBAAiB,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB9F"}
@@ -0,0 +1,61 @@
1
+ const DB_NAME = "zhin-console";
2
+ const DB_VERSION = 1;
3
+ const STORE_INBOX = "inbox";
4
+ const STORE_PENDING = "pending";
5
+ function openDb() {
6
+ return new Promise((resolve, reject) => {
7
+ const req = indexedDB.open(DB_NAME, DB_VERSION);
8
+ req.onerror = () => reject(req.error);
9
+ req.onsuccess = () => resolve(req.result);
10
+ req.onupgradeneeded = () => {
11
+ const db = req.result;
12
+ if (!db.objectStoreNames.contains(STORE_INBOX)) {
13
+ db.createObjectStore(STORE_INBOX, { keyPath: "id" });
14
+ }
15
+ if (!db.objectStoreNames.contains(STORE_PENDING)) {
16
+ db.createObjectStore(STORE_PENDING, { keyPath: "id" });
17
+ }
18
+ };
19
+ });
20
+ }
21
+ export async function idbPutInbox(record) {
22
+ const db = await openDb();
23
+ await new Promise((resolve, reject) => {
24
+ const tx = db.transaction(STORE_INBOX, "readwrite");
25
+ tx.objectStore(STORE_INBOX).put(record);
26
+ tx.oncomplete = () => resolve();
27
+ tx.onerror = () => reject(tx.error);
28
+ });
29
+ db.close();
30
+ }
31
+ export async function idbListInbox(adapter, botId, kind) {
32
+ const db = await openDb();
33
+ const all = await new Promise((resolve, reject) => {
34
+ const tx = db.transaction(STORE_INBOX, "readonly");
35
+ const req = tx.objectStore(STORE_INBOX).getAll();
36
+ req.onsuccess = () => resolve(req.result ?? []);
37
+ req.onerror = () => reject(req.error);
38
+ });
39
+ db.close();
40
+ return all.filter((r) => r.adapter === adapter && r.botId === botId && r.kind === kind);
41
+ }
42
+ export async function applyConsoleEvent(event) {
43
+ const t = event.type;
44
+ if (t === "bot:message" || t === "bot:request" || t === "bot:notice") {
45
+ const data = event.data;
46
+ if (!data)
47
+ return;
48
+ const adapter = String(data.adapter ?? "");
49
+ const botId = String(data.botId ?? data.bot ?? "");
50
+ const id = `${adapter}:${botId}:${t}:${Date.now()}`;
51
+ await idbPutInbox({
52
+ id,
53
+ adapter,
54
+ botId,
55
+ kind: t === "bot:message" ? "message" : t === "bot:request" ? "request" : "notice",
56
+ payload: data,
57
+ updatedAt: Date.now(),
58
+ });
59
+ }
60
+ }
61
+ //# sourceMappingURL=idb-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idb-store.js","sourceRoot":"","sources":["../../client/persistence/idb-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { RuntimeEnv } from "@zhin.js/console-types";
2
+ export declare function configureConsole(options: {
3
+ getRuntimeEnv: () => RuntimeEnv;
4
+ }): void;
5
+ export declare function getRuntimeEnv(): RuntimeEnv;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../client/runtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAIzD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE;IAAE,aAAa,EAAE,MAAM,UAAU,CAAA;CAAE,QAE5E;AAED,wBAAgB,aAAa,IAAI,UAAU,CAG1C"}
@@ -0,0 +1,10 @@
1
+ let runtimeEnvFn = null;
2
+ export function configureConsole(options) {
3
+ runtimeEnvFn = options.getRuntimeEnv;
4
+ }
5
+ export function getRuntimeEnv() {
6
+ if (runtimeEnvFn)
7
+ return runtimeEnvFn();
8
+ return "production";
9
+ }
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../client/runtime/index.ts"],"names":[],"mappings":"AAEA,IAAI,YAAY,GAA8B,IAAI,CAAC;AAEnD,MAAM,UAAU,gBAAgB,CAAC,OAA4C;IAC3E,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,IAAI,YAAY;QAAE,OAAO,YAAY,EAAE,CAAC;IACxC,OAAO,YAAY,CAAC;AACtB,CAAC"}
@@ -0,0 +1,9 @@
1
+ export type RegistryStore<T> = {
2
+ add(item: T): void;
3
+ remove(predicate: (item: T) => boolean): void;
4
+ getSnapshot(): readonly T[];
5
+ subscribe(listener: () => void): () => void;
6
+ };
7
+ export declare function createRegistryStore<T>(dedupeKey?: (item: T) => string): RegistryStore<T>;
8
+ export declare function useRegistry<T>(store: RegistryStore<T>): readonly T[];
9
+ //# sourceMappingURL=createRegistryStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createRegistryStore.d.ts","sourceRoot":"","sources":["../../client/store/createRegistryStore.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI;IAC7B,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACnB,MAAM,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,GAAG,IAAI,CAAC;IAC9C,WAAW,IAAI,SAAS,CAAC,EAAE,CAAC;IAC5B,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;CAC7C,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,CAgCxF;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,EAAE,CAEpE"}
@@ -0,0 +1,38 @@
1
+ import * as React from "react";
2
+ export function createRegistryStore(dedupeKey) {
3
+ let items = [];
4
+ const listeners = new Set();
5
+ const emit = () => {
6
+ for (const l of listeners)
7
+ l();
8
+ };
9
+ return {
10
+ add(item) {
11
+ if (dedupeKey) {
12
+ const key = dedupeKey(item);
13
+ if (items.some((i) => dedupeKey(i) === key))
14
+ return;
15
+ }
16
+ items = [...items, item];
17
+ emit();
18
+ },
19
+ remove(predicate) {
20
+ const next = items.filter((i) => !predicate(i));
21
+ if (next.length !== items.length) {
22
+ items = next;
23
+ emit();
24
+ }
25
+ },
26
+ getSnapshot() {
27
+ return items;
28
+ },
29
+ subscribe(listener) {
30
+ listeners.add(listener);
31
+ return () => listeners.delete(listener);
32
+ },
33
+ };
34
+ }
35
+ export function useRegistry(store) {
36
+ return React.useSyncExternalStore(store.subscribe, store.getSnapshot, store.getSnapshot);
37
+ }
38
+ //# sourceMappingURL=createRegistryStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createRegistryStore.js","sourceRoot":"","sources":["../../client/store/createRegistryStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAS/B,MAAM,UAAU,mBAAmB,CAAI,SAA+B;IACpE,IAAI,KAAK,GAAQ,EAAE,CAAC;IACpB,MAAM,SAAS,GAAG,IAAI,GAAG,EAAc,CAAC;IAExC,MAAM,IAAI,GAAG,GAAG,EAAE;QAChB,KAAK,MAAM,CAAC,IAAI,SAAS;YAAE,CAAC,EAAE,CAAC;IACjC,CAAC,CAAC;IAEF,OAAO;QACL,GAAG,CAAC,IAAI;YACN,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;gBAC5B,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC;oBAAE,OAAO;YACtD,CAAC;YACD,KAAK,GAAG,CAAC,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC;YACzB,IAAI,EAAE,CAAC;QACT,CAAC;QACD,MAAM,CAAC,SAAS;YACd,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YAChD,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjC,KAAK,GAAG,IAAI,CAAC;gBACb,IAAI,EAAE,CAAC;YACT,CAAC;QACH,CAAC;QACD,WAAW;YACT,OAAO,KAAK,CAAC;QACf,CAAC;QACD,SAAS,CAAC,QAAQ;YAChB,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACxB,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAI,KAAuB;IACpD,OAAO,KAAK,CAAC,oBAAoB,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;AAC3F,CAAC"}
@@ -10,13 +10,18 @@ export declare class WebSocketManager {
10
10
  private requestId;
11
11
  private pendingRequests;
12
12
  private connectedListeners;
13
+ private sseAbort;
14
+ private useRestTransport;
13
15
  constructor(config?: WebSocketConfig, callbacks?: WebSocketCallbacks);
14
16
  onConnectionChange(listener: (connected: boolean) => void): () => void;
15
17
  private notifyConnection;
16
18
  connect(): void;
19
+ private connectRestSse;
20
+ private pumpSse;
17
21
  disconnect(): void;
18
22
  send(message: unknown): void;
19
23
  sendRequest<T = unknown>(message: unknown): Promise<T>;
24
+ private sendRestRequest;
20
25
  isConnected(): boolean;
21
26
  getState(): ConnectionState;
22
27
  getConfig(pluginName: string): Promise<unknown>;
@@ -1 +1 @@
1
- {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../client/websocket/manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../client/websocket/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,eAAe,EACf,kBAAkB,EACnB,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,eAAe,EAKhB,MAAM,SAAS,CAAC;AAIjB,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,KAAK,CAAiD;IAC9D,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,eAAe,CAGnB;IACJ,OAAO,CAAC,kBAAkB,CAA2C;IACrE,OAAO,CAAC,QAAQ,CAAgC;IAChD,OAAO,CAAC,gBAAgB,CAAQ;gBAEpB,MAAM,GAAE,eAAoB,EAAE,SAAS,GAAE,kBAAuB;IAU5E,kBAAkB,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI;IAKtE,OAAO,CAAC,gBAAgB;IAIxB,OAAO,IAAI,IAAI;YAeD,cAAc;YAmCd,OAAO;IAoCrB,UAAU,IAAI,IAAI;IAalB,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAatB,WAAW,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;YAuB9C,eAAe;IAoC7B,WAAW,IAAI,OAAO;IAOtB,QAAQ,IAAI,eAAe;IAIrB,SAAS,CAAC,UAAU,EAAE,MAAM;IAG5B,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO;kBACb,OAAO;mBAAa,OAAO;kBAAY,MAAM;;IAM7E,SAAS,CAAC,UAAU,EAAE,MAAM;IAG5B,aAAa;IAGb,aAAa;IAGb,aAAa;cACe,MAAM;oBAAc,MAAM,EAAE;;IAExD,cAAc,CAAC,IAAI,EAAE,MAAM;iBACI,OAAO;kBAAY,MAAM;;IAExD,UAAU;eACmB,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,OAAO,CAAA;SAAE,CAAC;;IAErE,UAAU,CAAC,QAAQ,EAAE,MAAM;iBACI,MAAM;;IAErC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;iBACd,OAAO;kBAAY,MAAM;;IAExD,WAAW;cACiB,OAAO,SAAS,EAAE,YAAY,EAAE;;IAE5D,QAAQ,CAAC,QAAQ,EAAE,MAAM;iBACM,MAAM;cAAQ,MAAM;;IAEnD,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;iBACX,OAAO;kBAAY,MAAM;;IAExD,SAAS;IAGT,WAAW;gBACmB,OAAO,SAAS,EAAE,SAAS,EAAE;;IAE3D,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;IAGzE,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO;iBACL,OAAO;;IAEtC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO;iBACrB,OAAO;kBAAY,MAAM;;IAExD,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO;iBACP,OAAO;iBAAW,MAAM;;IAEvD,WAAW,CAAC,KAAK,EAAE,MAAM;iBACM,OAAO;;IAEtC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;aACL,MAAM;eAAS,OAAO;;IAEjD,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM;iBAC/B,OAAO;;IAEtC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;iBACJ,OAAO;;IAEtC,YAAY,CAAC,KAAK,EAAE,MAAM;iBACK,OAAO,SAAS,EAAE,OAAO,EAAE;;IAGhE,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,eAAe;IAoBvB,OAAO,CAAC,qBAAqB;IAa7B,OAAO,CAAC,qBAAqB;IAS7B,OAAO,CAAC,qBAAqB;IAO7B,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,oBAAoB;CAO7B"}