@zhin.js/client 1.0.17 → 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.
- package/client/app.ts +228 -0
- package/client/bootstrap/loadConsoleEntries.test.ts +32 -0
- package/client/bootstrap/loadConsoleEntries.ts +149 -0
- package/client/console-utils/cn.ts +6 -0
- package/client/console-utils/remoteApi.ts +48 -0
- package/client/index.ts +61 -14
- package/client/persistence/idb-store.ts +76 -0
- package/client/runtime/index.ts +12 -0
- package/client/store/createRegistryStore.ts +46 -0
- package/client/websocket/hooks.ts +218 -510
- package/client/websocket/index.ts +6 -43
- package/client/websocket/instance.ts +10 -32
- package/client/websocket/manager.ts +301 -385
- package/client/websocket/remote-settings.ts +25 -0
- package/client/websocket/types.ts +58 -222
- package/dist/app.d.ts +95 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +147 -0
- package/dist/app.js.map +1 -0
- package/dist/bootstrap/loadConsoleEntries.d.ts +26 -0
- package/dist/bootstrap/loadConsoleEntries.d.ts.map +1 -0
- package/dist/bootstrap/loadConsoleEntries.js +111 -0
- package/dist/bootstrap/loadConsoleEntries.js.map +1 -0
- package/dist/bootstrap/loadConsoleEntries.test.d.ts +2 -0
- package/dist/bootstrap/loadConsoleEntries.test.d.ts.map +1 -0
- package/dist/bootstrap/loadConsoleEntries.test.js +27 -0
- package/dist/bootstrap/loadConsoleEntries.test.js.map +1 -0
- package/dist/console-utils/cn.d.ts +3 -0
- package/dist/console-utils/cn.d.ts.map +1 -0
- package/dist/console-utils/cn.js +6 -0
- package/dist/console-utils/cn.js.map +1 -0
- package/dist/console-utils/remoteApi.d.ts +7 -0
- package/dist/console-utils/remoteApi.d.ts.map +1 -0
- package/dist/console-utils/remoteApi.js +41 -0
- package/dist/console-utils/remoteApi.js.map +1 -0
- package/dist/index.d.ts +11 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -14
- package/dist/index.js.map +1 -1
- package/dist/persistence/idb-store.d.ts +15 -0
- package/dist/persistence/idb-store.d.ts.map +1 -0
- package/dist/persistence/idb-store.js +61 -0
- package/dist/persistence/idb-store.js.map +1 -0
- package/dist/runtime/index.d.ts +6 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +10 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/store/createRegistryStore.d.ts +9 -0
- package/dist/store/createRegistryStore.d.ts.map +1 -0
- package/dist/store/createRegistryStore.js +38 -0
- package/dist/store/createRegistryStore.js.map +1 -0
- package/dist/websocket/hooks.d.ts +35 -58
- package/dist/websocket/hooks.d.ts.map +1 -1
- package/dist/websocket/hooks.js +134 -410
- package/dist/websocket/hooks.js.map +1 -1
- package/dist/websocket/index.d.ts +5 -10
- package/dist/websocket/index.d.ts.map +1 -1
- package/dist/websocket/index.js +5 -25
- package/dist/websocket/index.js.map +1 -1
- package/dist/websocket/instance.d.ts +1 -14
- package/dist/websocket/instance.d.ts.map +1 -1
- package/dist/websocket/instance.js +2 -20
- package/dist/websocket/instance.js.map +1 -1
- package/dist/websocket/manager.d.ts +28 -93
- package/dist/websocket/manager.d.ts.map +1 -1
- package/dist/websocket/manager.js +213 -221
- package/dist/websocket/manager.js.map +1 -1
- package/dist/websocket/remote-settings.d.ts +5 -0
- package/dist/websocket/remote-settings.d.ts.map +1 -0
- package/dist/websocket/remote-settings.js +23 -0
- package/dist/websocket/remote-settings.js.map +1 -0
- package/dist/websocket/types.d.ts +35 -122
- package/dist/websocket/types.d.ts.map +1 -1
- package/dist/websocket/types.js +4 -13
- package/dist/websocket/types.js.map +1 -1
- package/package.json +13 -11
- package/client/router/index.tsx +0 -54
- package/client/store/index.ts +0 -132
- package/client/store/reducers/config.ts +0 -135
- package/client/store/reducers/index.ts +0 -19
- package/client/store/reducers/route.ts +0 -126
- package/client/store/reducers/script.ts +0 -109
- package/client/store/reducers/ui.ts +0 -31
- package/client/websocket/messageHandler.ts +0 -208
- package/dist/router/index.d.ts +0 -25
- package/dist/router/index.d.ts.map +0 -1
- package/dist/router/index.js +0 -48
- package/dist/router/index.js.map +0 -1
- package/dist/store/index.d.ts +0 -19
- package/dist/store/index.d.ts.map +0 -1
- package/dist/store/index.js +0 -67
- package/dist/store/index.js.map +0 -1
- package/dist/store/reducers/config.d.ts +0 -54
- package/dist/store/reducers/config.d.ts.map +0 -1
- package/dist/store/reducers/config.js +0 -78
- package/dist/store/reducers/config.js.map +0 -1
- package/dist/store/reducers/index.d.ts +0 -13
- package/dist/store/reducers/index.d.ts.map +0 -1
- package/dist/store/reducers/index.js +0 -11
- package/dist/store/reducers/index.js.map +0 -1
- package/dist/store/reducers/route.d.ts +0 -30
- package/dist/store/reducers/route.d.ts.map +0 -1
- package/dist/store/reducers/route.js +0 -85
- package/dist/store/reducers/route.js.map +0 -1
- package/dist/store/reducers/script.d.ts +0 -13
- package/dist/store/reducers/script.d.ts.map +0 -1
- package/dist/store/reducers/script.js +0 -78
- package/dist/store/reducers/script.js.map +0 -1
- package/dist/store/reducers/ui.d.ts +0 -8
- package/dist/store/reducers/ui.d.ts.map +0 -1
- package/dist/store/reducers/ui.js +0 -23
- package/dist/store/reducers/ui.js.map +0 -1
- package/dist/websocket/messageHandler.d.ts +0 -58
- package/dist/websocket/messageHandler.d.ts.map +0 -1
- package/dist/websocket/messageHandler.js +0 -174
- package/dist/websocket/messageHandler.js.map +0 -1
|
@@ -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":"AAMA,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAwBnE,MAAM,UAAU,2BAA2B,CACzC,OAA2C;IAE3C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,OAAO;QACL,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,QAAQ;QACR,OAAO,EAAE,QAAQ;QACjB,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC;AACJ,CAAC;AAED,MAAM,4BAA4B,GAAG,eAAe,CAAC;AAErD,SAAS,oBAAoB;IAC3B,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,EAAE,CAAC;IAC7C,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,4BAA4B,CAAC,EAAE,IAAI,EAAE,CAAC;IAC1E,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACjD,CAAC;AAED,SAAS,iBAAiB;IACxB,MAAM,OAAO,GAAG,oBAAoB,EAAE,CAAC;IACvC,IAAI,OAAO;QAAE,OAAO,GAAG,OAAO,UAAU,CAAC;IACzC,MAAM,IAAI,GAAG,yBAAyB,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC1D,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;AACpD,CAAC;AAED,SAAS,iBAAiB,CAAC,SAAiB;IAC1C,IAAI,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1F,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,SAAS,CAAC;IACpD,MAAM,OAAO,GAAG,oBAAoB,EAAE,CAAC;IACvC,MAAM,MAAM,GAAG,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;IACjD,OAAO,IAAI,GAAG,CAAC,SAAS,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC;AAC/C,CAAC;AAED,SAAS,sBAAsB,CAAC,cAAsB,EAAE,WAAoB;IAC1E,IAAI,cAAc,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,cAAc,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,cAAc,CAAC;IACzG,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,cAAc,CAAC;IACzD,MAAM,MAAM,GAAG,WAAW,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;IACzE,OAAO,IAAI,GAAG,CAAC,cAAc,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC;AACpD,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAwC;IAChE,OAAO,OAAO,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAoC;IAEpC,MAAM,SAAS,GAAG,OAAO,EAAE,UAAU,IAAI,iBAAiB,EAAE,CAAC;IAC7D,MAAM,GAAG,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,GAAG,IAAI;QACP,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,IAAI,CAAC,MAAM;KACxB,CAAC,CAAC;IAClB,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,wBAAwB,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1G,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA2B,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAA+C;IAC3E,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC;IAC1B,IAAI,OAAO,CAAC,KAAK,UAAU;QAAE,OAAO,CAA0B,CAAC;IAC/D,MAAM,CAAC,GAAG,GAAG,CAAC,SAAS,CAAwC,CAAC;IAChE,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,UAAU,CAAC,KAAK,UAAU;QAAE,OAAO,CAAC,CAAC,UAAU,CAA0B,CAAC;IAC5F,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iCAAiC,CACrD,OAA6B,EAC7B,OAA8B,EAC9B,YAAkE,EAClE,WAAoB;IAEpB,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,OAAO;IAC5B,MAAM,OAAO,CAAC,GAAG,CACf,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAC1B,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,sBAAsB,CAAC,KAAK,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;YAC5E,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAA4B,CAAC;YACpF,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;YACpC,IAAI,QAAQ;gBAAE,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC;;gBACjC,MAAM,IAAI,KAAK,CAAC,UAAU,KAAK,CAAC,EAAE,0BAA0B,CAAC,CAAC;QACrE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,YAAY;gBAAE,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;;gBACxC,MAAM,KAAK,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAkC;IACzE,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;IACvB,IAAI,IAA4B,CAAC;IACjC,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,OAAQ,KAA8B,CAAC,MAAM,KAAK,QAAQ;YACvE,CAAC,CAAE,KAA4B,CAAC,MAAM;YACtC,CAAC,CAAC,CAAC,CAAC;QACN,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACzB,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAC7B,OAAO;QACT,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAC1B,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QACpB,OAAO;IACT,CAAC;IACD,MAAM,iCAAiC,CACrC,IAAI,CAAC,OAAO,EACZ,OAAO,CAAC,OAAO,EACf,OAAO,CAAC,YAAY,EACpB,OAAO,CAAC,WAAW,CACpB,CAAC;AACJ,CAAC"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
export
|
|
3
|
-
export {
|
|
4
|
-
export * from
|
|
5
|
-
export
|
|
6
|
-
export
|
|
7
|
-
export
|
|
1
|
+
export * from "./types";
|
|
2
|
+
export { resolveMediaSrc, pickMediaRawUrl, type MediaKind } from "./mediaSrc";
|
|
3
|
+
export { app, type ConsoleApp, type AddRouteInput, type AddToolInput, type ConsoleRouteRecord, type RouteTreeNode, type ToolTreeNode, type ConsoleRouteRenderer, } from "./app";
|
|
4
|
+
export * from "./websocket";
|
|
5
|
+
export type { PluginRegisterHostApi, PluginAddRouteInput, PluginAddToolInput, ConsolePluginRegister, ConsoleClientEntry, ConsoleEntriesResponse, ConsoleEntry, ConsoleFileAddEntryInput, RuntimeEnv, } from "@zhin.js/console-types";
|
|
6
|
+
export { DEFAULT_CONSOLE_BASE_PATH, CONSOLE_HOST_REACT_NAMESPACE_KEY, } from "@zhin.js/console-types";
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../client/index.ts"],"names":[],"mappings":"
|
|
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
|
@@ -1,16 +1,15 @@
|
|
|
1
|
-
import { clsx } from 'clsx';
|
|
2
|
-
import { twMerge } from 'tailwind-merge';
|
|
3
1
|
// Types
|
|
4
|
-
export * from
|
|
5
|
-
//
|
|
6
|
-
export { resolveMediaSrc, pickMediaRawUrl } from
|
|
7
|
-
//
|
|
8
|
-
export
|
|
9
|
-
//
|
|
10
|
-
export * from
|
|
11
|
-
|
|
12
|
-
export
|
|
13
|
-
export
|
|
14
|
-
|
|
15
|
-
}
|
|
2
|
+
export * from "./types";
|
|
3
|
+
// Media URL resolution
|
|
4
|
+
export { resolveMediaSrc, pickMediaRawUrl } from "./mediaSrc";
|
|
5
|
+
// Console app singleton (page-manager style)
|
|
6
|
+
export { app, } from "./app";
|
|
7
|
+
// WebSocket (business data only)
|
|
8
|
+
export * from "./websocket";
|
|
9
|
+
export { DEFAULT_CONSOLE_BASE_PATH, CONSOLE_HOST_REACT_NAMESPACE_KEY, } from "@zhin.js/console-types";
|
|
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";
|
|
16
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,OAAO,
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|
|
@@ -1,51 +1,28 @@
|
|
|
1
|
-
|
|
2
|
-
* WebSocket React Hooks
|
|
3
|
-
* 提供在 React 组件中使用 WebSocket 功能的便捷接口
|
|
4
|
-
*/
|
|
5
|
-
import type { UseConfigOptions, UseWebSocketOptions, FileTreeNode, DatabaseInfo, TableInfo, SelectResult, KvEntry } from './types';
|
|
6
|
-
/**
|
|
7
|
-
* WebSocket 连接状态和基础功能 Hook
|
|
8
|
-
*/
|
|
1
|
+
import type { UseWebSocketOptions } from "./types";
|
|
9
2
|
export declare function useWebSocket(options?: UseWebSocketOptions): {
|
|
10
3
|
connected: boolean;
|
|
11
|
-
entries: any;
|
|
12
|
-
loadedScripts: any;
|
|
13
4
|
connect: () => void;
|
|
14
5
|
disconnect: () => void;
|
|
15
|
-
send: (message:
|
|
16
|
-
sendRequest: <T =
|
|
17
|
-
isConnected: () => boolean;
|
|
18
|
-
getState: () => "disconnected" | "connected";
|
|
6
|
+
send: (message: unknown) => void;
|
|
7
|
+
sendRequest: <T = unknown>(message: unknown) => Promise<T>;
|
|
19
8
|
manager: import("./manager").WebSocketManager;
|
|
20
9
|
};
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
config:
|
|
26
|
-
schema:
|
|
10
|
+
export declare function useConfig(pluginName: string, options?: {
|
|
11
|
+
autoLoad?: boolean;
|
|
12
|
+
autoLoadSchema?: boolean;
|
|
13
|
+
}): {
|
|
14
|
+
config: unknown;
|
|
15
|
+
schema: unknown;
|
|
27
16
|
loading: boolean;
|
|
28
17
|
error: string | null;
|
|
29
18
|
connected: boolean;
|
|
30
|
-
getConfig: () => Promise<
|
|
31
|
-
setConfig: (newConfig:
|
|
19
|
+
getConfig: () => Promise<unknown>;
|
|
20
|
+
setConfig: (newConfig: unknown) => Promise<{
|
|
21
|
+
success?: boolean;
|
|
32
22
|
reloaded?: boolean;
|
|
33
23
|
message?: string;
|
|
34
24
|
}>;
|
|
35
|
-
getSchema: () => Promise<
|
|
36
|
-
reload: () => Promise<void>;
|
|
37
|
-
};
|
|
38
|
-
/**
|
|
39
|
-
* 所有配置管理 Hook
|
|
40
|
-
*/
|
|
41
|
-
export declare function useAllConfigs(): {
|
|
42
|
-
configs: Record<string, any>;
|
|
43
|
-
schemas: Record<string, any>;
|
|
44
|
-
connected: boolean;
|
|
45
|
-
refreshAll: () => Promise<{
|
|
46
|
-
configs: any;
|
|
47
|
-
schemas: any;
|
|
48
|
-
}>;
|
|
25
|
+
getSchema: () => Promise<unknown>;
|
|
49
26
|
};
|
|
50
27
|
export declare function useConfigYaml(): {
|
|
51
28
|
yaml: string;
|
|
@@ -61,6 +38,17 @@ export declare function useConfigYaml(): {
|
|
|
61
38
|
message?: string;
|
|
62
39
|
}>;
|
|
63
40
|
};
|
|
41
|
+
export declare function useFiles(): {
|
|
42
|
+
tree: import("./types").FileTreeNode[];
|
|
43
|
+
loading: boolean;
|
|
44
|
+
error: string | null;
|
|
45
|
+
loadTree: () => Promise<import("./types").FileTreeNode[]>;
|
|
46
|
+
readFile: (filePath: string) => Promise<string>;
|
|
47
|
+
saveFile: (filePath: string, content: string) => Promise<{
|
|
48
|
+
success: boolean;
|
|
49
|
+
message?: string;
|
|
50
|
+
}>;
|
|
51
|
+
};
|
|
64
52
|
export declare function useEnvFiles(): {
|
|
65
53
|
files: {
|
|
66
54
|
name: string;
|
|
@@ -78,51 +66,40 @@ export declare function useEnvFiles(): {
|
|
|
78
66
|
message?: string;
|
|
79
67
|
}>;
|
|
80
68
|
};
|
|
81
|
-
export declare function useFiles(): {
|
|
82
|
-
tree: FileTreeNode[];
|
|
83
|
-
loading: boolean;
|
|
84
|
-
error: string | null;
|
|
85
|
-
loadTree: () => Promise<FileTreeNode[]>;
|
|
86
|
-
readFile: (filePath: string) => Promise<string>;
|
|
87
|
-
saveFile: (filePath: string, content: string) => Promise<{
|
|
88
|
-
success: boolean;
|
|
89
|
-
message?: string;
|
|
90
|
-
}>;
|
|
91
|
-
};
|
|
92
69
|
export declare function useDatabase(): {
|
|
93
|
-
info: DatabaseInfo | null;
|
|
94
|
-
tables: TableInfo[];
|
|
70
|
+
info: import("./types").DatabaseInfo | null;
|
|
71
|
+
tables: import("./types").TableInfo[];
|
|
95
72
|
loading: boolean;
|
|
96
73
|
error: string | null;
|
|
97
|
-
loadInfo: () => Promise<DatabaseInfo>;
|
|
98
|
-
loadTables: () => Promise<TableInfo[]>;
|
|
74
|
+
loadInfo: () => Promise<import("./types").DatabaseInfo>;
|
|
75
|
+
loadTables: () => Promise<import("./types").TableInfo[]>;
|
|
99
76
|
dropTable: (table: string) => Promise<{
|
|
100
77
|
success: boolean;
|
|
101
78
|
}>;
|
|
102
|
-
select: (table: string, page?: number, pageSize?: number, where?:
|
|
103
|
-
insert: (table: string, row:
|
|
79
|
+
select: (table: string, page?: number, pageSize?: number, where?: unknown) => Promise<import("./types").SelectResult>;
|
|
80
|
+
insert: (table: string, row: unknown) => Promise<{
|
|
104
81
|
success: boolean;
|
|
105
82
|
}>;
|
|
106
|
-
update: (table: string, row:
|
|
83
|
+
update: (table: string, row: unknown, where: unknown) => Promise<{
|
|
107
84
|
success: boolean;
|
|
108
85
|
affected: number;
|
|
109
86
|
}>;
|
|
110
|
-
remove: (table: string, where:
|
|
87
|
+
remove: (table: string, where: unknown) => Promise<{
|
|
111
88
|
success: boolean;
|
|
112
89
|
deleted: number;
|
|
113
90
|
}>;
|
|
114
91
|
kvGet: (table: string, key: string) => Promise<{
|
|
115
92
|
key: string;
|
|
116
|
-
value:
|
|
93
|
+
value: unknown;
|
|
117
94
|
}>;
|
|
118
|
-
kvSet: (table: string, key: string, value:
|
|
95
|
+
kvSet: (table: string, key: string, value: unknown, ttl?: number) => Promise<{
|
|
119
96
|
success: boolean;
|
|
120
97
|
}>;
|
|
121
98
|
kvDelete: (table: string, key: string) => Promise<{
|
|
122
99
|
success: boolean;
|
|
123
100
|
}>;
|
|
124
101
|
kvEntries: (table: string) => Promise<{
|
|
125
|
-
entries: KvEntry[];
|
|
102
|
+
entries: import("./types").KvEntry[];
|
|
126
103
|
}>;
|
|
127
104
|
};
|
|
128
105
|
//# sourceMappingURL=hooks.d.ts.map
|