@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.
Files changed (116) hide show
  1. package/client/app.ts +228 -0
  2. package/client/bootstrap/loadConsoleEntries.test.ts +32 -0
  3. package/client/bootstrap/loadConsoleEntries.ts +149 -0
  4. package/client/console-utils/cn.ts +6 -0
  5. package/client/console-utils/remoteApi.ts +48 -0
  6. package/client/index.ts +61 -14
  7. package/client/persistence/idb-store.ts +76 -0
  8. package/client/runtime/index.ts +12 -0
  9. package/client/store/createRegistryStore.ts +46 -0
  10. package/client/websocket/hooks.ts +218 -510
  11. package/client/websocket/index.ts +6 -43
  12. package/client/websocket/instance.ts +10 -32
  13. package/client/websocket/manager.ts +301 -385
  14. package/client/websocket/remote-settings.ts +25 -0
  15. package/client/websocket/types.ts +58 -222
  16. package/dist/app.d.ts +95 -0
  17. package/dist/app.d.ts.map +1 -0
  18. package/dist/app.js +147 -0
  19. package/dist/app.js.map +1 -0
  20. package/dist/bootstrap/loadConsoleEntries.d.ts +26 -0
  21. package/dist/bootstrap/loadConsoleEntries.d.ts.map +1 -0
  22. package/dist/bootstrap/loadConsoleEntries.js +111 -0
  23. package/dist/bootstrap/loadConsoleEntries.js.map +1 -0
  24. package/dist/bootstrap/loadConsoleEntries.test.d.ts +2 -0
  25. package/dist/bootstrap/loadConsoleEntries.test.d.ts.map +1 -0
  26. package/dist/bootstrap/loadConsoleEntries.test.js +27 -0
  27. package/dist/bootstrap/loadConsoleEntries.test.js.map +1 -0
  28. package/dist/console-utils/cn.d.ts +3 -0
  29. package/dist/console-utils/cn.d.ts.map +1 -0
  30. package/dist/console-utils/cn.js +6 -0
  31. package/dist/console-utils/cn.js.map +1 -0
  32. package/dist/console-utils/remoteApi.d.ts +7 -0
  33. package/dist/console-utils/remoteApi.d.ts.map +1 -0
  34. package/dist/console-utils/remoteApi.js +41 -0
  35. package/dist/console-utils/remoteApi.js.map +1 -0
  36. package/dist/index.d.ts +11 -7
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +13 -14
  39. package/dist/index.js.map +1 -1
  40. package/dist/persistence/idb-store.d.ts +15 -0
  41. package/dist/persistence/idb-store.d.ts.map +1 -0
  42. package/dist/persistence/idb-store.js +61 -0
  43. package/dist/persistence/idb-store.js.map +1 -0
  44. package/dist/runtime/index.d.ts +6 -0
  45. package/dist/runtime/index.d.ts.map +1 -0
  46. package/dist/runtime/index.js +10 -0
  47. package/dist/runtime/index.js.map +1 -0
  48. package/dist/store/createRegistryStore.d.ts +9 -0
  49. package/dist/store/createRegistryStore.d.ts.map +1 -0
  50. package/dist/store/createRegistryStore.js +38 -0
  51. package/dist/store/createRegistryStore.js.map +1 -0
  52. package/dist/websocket/hooks.d.ts +35 -58
  53. package/dist/websocket/hooks.d.ts.map +1 -1
  54. package/dist/websocket/hooks.js +134 -410
  55. package/dist/websocket/hooks.js.map +1 -1
  56. package/dist/websocket/index.d.ts +5 -10
  57. package/dist/websocket/index.d.ts.map +1 -1
  58. package/dist/websocket/index.js +5 -25
  59. package/dist/websocket/index.js.map +1 -1
  60. package/dist/websocket/instance.d.ts +1 -14
  61. package/dist/websocket/instance.d.ts.map +1 -1
  62. package/dist/websocket/instance.js +2 -20
  63. package/dist/websocket/instance.js.map +1 -1
  64. package/dist/websocket/manager.d.ts +28 -93
  65. package/dist/websocket/manager.d.ts.map +1 -1
  66. package/dist/websocket/manager.js +213 -221
  67. package/dist/websocket/manager.js.map +1 -1
  68. package/dist/websocket/remote-settings.d.ts +5 -0
  69. package/dist/websocket/remote-settings.d.ts.map +1 -0
  70. package/dist/websocket/remote-settings.js +23 -0
  71. package/dist/websocket/remote-settings.js.map +1 -0
  72. package/dist/websocket/types.d.ts +35 -122
  73. package/dist/websocket/types.d.ts.map +1 -1
  74. package/dist/websocket/types.js +4 -13
  75. package/dist/websocket/types.js.map +1 -1
  76. package/package.json +13 -11
  77. package/client/router/index.tsx +0 -54
  78. package/client/store/index.ts +0 -132
  79. package/client/store/reducers/config.ts +0 -135
  80. package/client/store/reducers/index.ts +0 -19
  81. package/client/store/reducers/route.ts +0 -126
  82. package/client/store/reducers/script.ts +0 -109
  83. package/client/store/reducers/ui.ts +0 -31
  84. package/client/websocket/messageHandler.ts +0 -208
  85. package/dist/router/index.d.ts +0 -25
  86. package/dist/router/index.d.ts.map +0 -1
  87. package/dist/router/index.js +0 -48
  88. package/dist/router/index.js.map +0 -1
  89. package/dist/store/index.d.ts +0 -19
  90. package/dist/store/index.d.ts.map +0 -1
  91. package/dist/store/index.js +0 -67
  92. package/dist/store/index.js.map +0 -1
  93. package/dist/store/reducers/config.d.ts +0 -54
  94. package/dist/store/reducers/config.d.ts.map +0 -1
  95. package/dist/store/reducers/config.js +0 -78
  96. package/dist/store/reducers/config.js.map +0 -1
  97. package/dist/store/reducers/index.d.ts +0 -13
  98. package/dist/store/reducers/index.d.ts.map +0 -1
  99. package/dist/store/reducers/index.js +0 -11
  100. package/dist/store/reducers/index.js.map +0 -1
  101. package/dist/store/reducers/route.d.ts +0 -30
  102. package/dist/store/reducers/route.d.ts.map +0 -1
  103. package/dist/store/reducers/route.js +0 -85
  104. package/dist/store/reducers/route.js.map +0 -1
  105. package/dist/store/reducers/script.d.ts +0 -13
  106. package/dist/store/reducers/script.d.ts.map +0 -1
  107. package/dist/store/reducers/script.js +0 -78
  108. package/dist/store/reducers/script.js.map +0 -1
  109. package/dist/store/reducers/ui.d.ts +0 -8
  110. package/dist/store/reducers/ui.d.ts.map +0 -1
  111. package/dist/store/reducers/ui.js +0 -23
  112. package/dist/store/reducers/ui.js.map +0 -1
  113. package/dist/websocket/messageHandler.d.ts +0 -58
  114. package/dist/websocket/messageHandler.d.ts.map +0 -1
  115. package/dist/websocket/messageHandler.js +0 -174
  116. 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":"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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
@@ -1,8 +1,12 @@
1
- import { type ClassValue } from 'clsx';
2
- export * from './types';
3
- export { resolveMediaSrc, pickMediaRawUrl, type MediaKind } from './mediaSrc';
4
- export * from './store';
5
- export * from './router';
6
- export * from './websocket';
7
- export declare function cn(...inputs: ClassValue[]): string;
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
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAQ,MAAM,MAAM,CAAA;AAG5C,cAAc,SAAS,CAAA;AAGvB,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAA;AAG7E,cAAc,SAAS,CAAA;AAGvB,cAAc,UAAU,CAAA;AAGxB,cAAc,aAAa,CAAA;AAE3B,wBAAgB,EAAE,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,UAEzC"}
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 './types';
5
- // 媒体 URL(含 base64://)解析,供控制台 / 沙盒等
6
- export { resolveMediaSrc, pickMediaRawUrl } from './mediaSrc';
7
- // Redux Store
8
- export * from './store';
9
- // Router
10
- export * from './router';
11
- // WebSocket
12
- export * from './websocket';
13
- export function cn(...inputs) {
14
- return twMerge(clsx(inputs));
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,EAAmB,IAAI,EAAE,MAAM,MAAM,CAAA;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AACxC,QAAQ;AACR,cAAc,SAAS,CAAA;AAEvB,mCAAmC;AACnC,OAAO,EAAE,eAAe,EAAE,eAAe,EAAkB,MAAM,YAAY,CAAA;AAE7E,cAAc;AACd,cAAc,SAAS,CAAA;AAEvB,SAAS;AACT,cAAc,UAAU,CAAA;AAExB,YAAY;AACZ,cAAc,aAAa,CAAA;AAE3B,MAAM,UAAU,EAAE,CAAC,GAAG,MAAoB;IACxC,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;AAC9B,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"}
@@ -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: any) => void;
16
- sendRequest: <T = any>(message: any) => Promise<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
- * 插件配置管理 Hook
23
- */
24
- export declare function useConfig(pluginName: string, options?: UseConfigOptions): {
25
- config: any;
26
- schema: any;
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<any>;
31
- setConfig: (newConfig: any) => Promise<{
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<any>;
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?: any) => Promise<SelectResult>;
103
- insert: (table: string, row: any) => Promise<{
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: any, where: any) => Promise<{
83
+ update: (table: string, row: unknown, where: unknown) => Promise<{
107
84
  success: boolean;
108
85
  affected: number;
109
86
  }>;
110
- remove: (table: string, where: any) => Promise<{
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: any;
93
+ value: unknown;
117
94
  }>;
118
- kvSet: (table: string, key: string, value: any, ttl?: number) => Promise<{
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