@jsbot-tellus/core 2.4.0 → 2.5.1

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 (183) hide show
  1. package/README.md +8 -5
  2. package/dist/app/cli.d.ts +10 -0
  3. package/dist/app/cli.d.ts.map +1 -0
  4. package/dist/app/cli.js +37 -0
  5. package/dist/app/cli.js.map +1 -0
  6. package/dist/app/runtime.d.ts +121 -0
  7. package/dist/app/runtime.d.ts.map +1 -0
  8. package/dist/app/runtime.js +296 -0
  9. package/dist/app/runtime.js.map +1 -0
  10. package/dist/app.js +63 -273
  11. package/dist/app.js.map +1 -1
  12. package/dist/core/dispatch/command.d.ts.map +1 -1
  13. package/dist/core/dispatch/command.js +5 -1
  14. package/dist/core/dispatch/command.js.map +1 -1
  15. package/dist/core/dispatch/router.d.ts.map +1 -1
  16. package/dist/core/dispatch/router.js +1 -1
  17. package/dist/core/dispatch/router.js.map +1 -1
  18. package/dist/core/plugin/command-params.d.ts +3 -36
  19. package/dist/core/plugin/command-params.d.ts.map +1 -1
  20. package/dist/core/plugin/command-params.js +2 -461
  21. package/dist/core/plugin/command-params.js.map +1 -1
  22. package/dist/core/plugin/install/paths.d.ts +7 -0
  23. package/dist/core/plugin/install/paths.d.ts.map +1 -0
  24. package/dist/core/plugin/install/paths.js +49 -0
  25. package/dist/core/plugin/install/paths.js.map +1 -0
  26. package/dist/core/plugin/install/state.d.ts +23 -0
  27. package/dist/core/plugin/install/state.d.ts.map +1 -0
  28. package/dist/core/plugin/install/state.js +129 -0
  29. package/dist/core/plugin/install/state.js.map +1 -0
  30. package/dist/core/plugin/install/validate-script.d.ts +3 -0
  31. package/dist/core/plugin/install/validate-script.d.ts.map +1 -0
  32. package/dist/core/plugin/install/validate-script.js +154 -0
  33. package/dist/core/plugin/install/validate-script.js.map +1 -0
  34. package/dist/core/plugin/install-dir.d.ts +3 -28
  35. package/dist/core/plugin/install-dir.d.ts.map +1 -1
  36. package/dist/core/plugin/install-dir.js +3 -326
  37. package/dist/core/plugin/install-dir.js.map +1 -1
  38. package/dist/core/plugin/installer/checks.d.ts +6 -0
  39. package/dist/core/plugin/installer/checks.d.ts.map +1 -0
  40. package/dist/core/plugin/installer/checks.js +99 -0
  41. package/dist/core/plugin/installer/checks.js.map +1 -0
  42. package/dist/core/plugin/installer/support.d.ts +37 -0
  43. package/dist/core/plugin/installer/support.d.ts.map +1 -0
  44. package/dist/core/plugin/installer/support.js +67 -0
  45. package/dist/core/plugin/installer/support.js.map +1 -0
  46. package/dist/core/plugin/installer/warnings.d.ts +5 -0
  47. package/dist/core/plugin/installer/warnings.d.ts.map +1 -0
  48. package/dist/core/plugin/installer/warnings.js +28 -0
  49. package/dist/core/plugin/installer/warnings.js.map +1 -0
  50. package/dist/core/plugin/installer.d.ts +4 -30
  51. package/dist/core/plugin/installer.d.ts.map +1 -1
  52. package/dist/core/plugin/installer.js +21 -202
  53. package/dist/core/plugin/installer.js.map +1 -1
  54. package/dist/core/plugin/params/compile.d.ts +3 -0
  55. package/dist/core/plugin/params/compile.d.ts.map +1 -0
  56. package/dist/core/plugin/params/compile.js +23 -0
  57. package/dist/core/plugin/params/compile.js.map +1 -0
  58. package/dist/core/plugin/params/declaration.d.ts +9 -0
  59. package/dist/core/plugin/params/declaration.d.ts.map +1 -0
  60. package/dist/core/plugin/params/declaration.js +223 -0
  61. package/dist/core/plugin/params/declaration.js.map +1 -0
  62. package/dist/core/plugin/params/input.d.ts +5 -0
  63. package/dist/core/plugin/params/input.d.ts.map +1 -0
  64. package/dist/core/plugin/params/input.js +181 -0
  65. package/dist/core/plugin/params/input.js.map +1 -0
  66. package/dist/core/plugin/params/reply.d.ts +3 -0
  67. package/dist/core/plugin/params/reply.d.ts.map +1 -0
  68. package/dist/core/plugin/params/reply.js +49 -0
  69. package/dist/core/plugin/params/reply.js.map +1 -0
  70. package/dist/core/plugin/params/type-level.d.ts +23 -0
  71. package/dist/core/plugin/params/type-level.d.ts.map +1 -0
  72. package/dist/core/plugin/params/type-level.js +2 -0
  73. package/dist/core/plugin/params/type-level.js.map +1 -0
  74. package/dist/core/plugin/params/types.d.ts +28 -0
  75. package/dist/core/plugin/params/types.d.ts.map +1 -0
  76. package/dist/core/plugin/params/types.js +12 -0
  77. package/dist/core/plugin/params/types.js.map +1 -0
  78. package/dist/core/plugin/params/values.d.ts +6 -0
  79. package/dist/core/plugin/params/values.d.ts.map +1 -0
  80. package/dist/core/plugin/params/values.js +108 -0
  81. package/dist/core/plugin/params/values.js.map +1 -0
  82. package/dist/core/web/api.d.ts +2 -14
  83. package/dist/core/web/api.d.ts.map +1 -1
  84. package/dist/core/web/api.js +8 -500
  85. package/dist/core/web/api.js.map +1 -1
  86. package/dist/core/web/routes/actions.d.ts +4 -0
  87. package/dist/core/web/routes/actions.d.ts.map +1 -0
  88. package/dist/core/web/routes/actions.js +33 -0
  89. package/dist/core/web/routes/actions.js.map +1 -0
  90. package/dist/core/web/routes/config.d.ts +5 -0
  91. package/dist/core/web/routes/config.d.ts.map +1 -0
  92. package/dist/core/web/routes/config.js +30 -0
  93. package/dist/core/web/routes/config.js.map +1 -0
  94. package/dist/core/web/routes/kv.d.ts +6 -0
  95. package/dist/core/web/routes/kv.d.ts.map +1 -0
  96. package/dist/core/web/routes/kv.js +80 -0
  97. package/dist/core/web/routes/kv.js.map +1 -0
  98. package/dist/core/web/routes/plugins.d.ts +5 -0
  99. package/dist/core/web/routes/plugins.d.ts.map +1 -0
  100. package/dist/core/web/routes/plugins.js +98 -0
  101. package/dist/core/web/routes/plugins.js.map +1 -0
  102. package/dist/core/web/routes/sessions.d.ts +8 -0
  103. package/dist/core/web/routes/sessions.d.ts.map +1 -0
  104. package/dist/core/web/routes/sessions.js +130 -0
  105. package/dist/core/web/routes/sessions.js.map +1 -0
  106. package/dist/core/web/routes/shared.d.ts +18 -0
  107. package/dist/core/web/routes/shared.d.ts.map +1 -0
  108. package/dist/core/web/routes/shared.js +19 -0
  109. package/dist/core/web/routes/shared.js.map +1 -0
  110. package/dist/core/web/routes/status.d.ts +6 -0
  111. package/dist/core/web/routes/status.d.ts.map +1 -0
  112. package/dist/core/web/routes/status.js +132 -0
  113. package/dist/core/web/routes/status.js.map +1 -0
  114. package/dist/core/web/server/auth.d.ts +17 -0
  115. package/dist/core/web/server/auth.d.ts.map +1 -0
  116. package/dist/core/web/server/auth.js +68 -0
  117. package/dist/core/web/server/auth.js.map +1 -0
  118. package/dist/core/web/server/csp.d.ts +11 -0
  119. package/dist/core/web/server/csp.d.ts.map +1 -0
  120. package/dist/core/web/server/csp.js +31 -0
  121. package/dist/core/web/server/csp.js.map +1 -0
  122. package/dist/core/web/server/request.d.ts +6 -0
  123. package/dist/core/web/server/request.d.ts.map +1 -0
  124. package/dist/core/web/server/request.js +33 -0
  125. package/dist/core/web/server/request.js.map +1 -0
  126. package/dist/core/web/server/security.d.ts +4 -0
  127. package/dist/core/web/server/security.d.ts.map +1 -0
  128. package/dist/core/web/server/security.js +12 -0
  129. package/dist/core/web/server/security.js.map +1 -0
  130. package/dist/core/web/server/sse.d.ts +18 -0
  131. package/dist/core/web/server/sse.d.ts.map +1 -0
  132. package/dist/core/web/server/sse.js +49 -0
  133. package/dist/core/web/server/sse.js.map +1 -0
  134. package/dist/core/web/server/static.d.ts +16 -0
  135. package/dist/core/web/server/static.d.ts.map +1 -0
  136. package/dist/core/web/server/static.js +80 -0
  137. package/dist/core/web/server/static.js.map +1 -0
  138. package/dist/core/web/server.d.ts +0 -7
  139. package/dist/core/web/server.d.ts.map +1 -1
  140. package/dist/core/web/server.js +41 -263
  141. package/dist/core/web/server.js.map +1 -1
  142. package/docs/architecture.md +28 -11
  143. package/docs/configuration.md +1 -1
  144. package/docs/migration.md +2 -2
  145. package/docs/plugin-api.md +3 -1
  146. package/docs/plugin-development.md +1 -1
  147. package/package.json +19 -17
  148. package/src/app/cli.ts +47 -0
  149. package/src/app/runtime.ts +522 -0
  150. package/src/app.ts +87 -395
  151. package/src/core/dispatch/command.ts +7 -1
  152. package/src/core/dispatch/router.ts +2 -1
  153. package/src/core/plugin/command-params.ts +8 -713
  154. package/src/core/plugin/install/paths.ts +72 -0
  155. package/src/core/plugin/install/state.ts +196 -0
  156. package/src/core/plugin/install/validate-script.ts +154 -0
  157. package/src/core/plugin/install-dir.ts +19 -427
  158. package/src/core/plugin/installer/checks.ts +137 -0
  159. package/src/core/plugin/installer/support.ts +120 -0
  160. package/src/core/plugin/installer/warnings.ts +52 -0
  161. package/src/core/plugin/installer.ts +52 -301
  162. package/src/core/plugin/params/compile.ts +41 -0
  163. package/src/core/plugin/params/declaration.ts +286 -0
  164. package/src/core/plugin/params/input.ts +254 -0
  165. package/src/core/plugin/params/reply.ts +59 -0
  166. package/src/core/plugin/params/type-level.ts +71 -0
  167. package/src/core/plugin/params/types.ts +49 -0
  168. package/src/core/plugin/params/values.ts +146 -0
  169. package/src/core/web/api.ts +33 -759
  170. package/src/core/web/routes/actions.ts +43 -0
  171. package/src/core/web/routes/config.ts +42 -0
  172. package/src/core/web/routes/kv.ts +122 -0
  173. package/src/core/web/routes/plugins.ts +151 -0
  174. package/src/core/web/routes/sessions.ts +188 -0
  175. package/src/core/web/routes/shared.ts +42 -0
  176. package/src/core/web/routes/status.ts +191 -0
  177. package/src/core/web/server/auth.ts +126 -0
  178. package/src/core/web/server/csp.ts +33 -0
  179. package/src/core/web/server/request.ts +38 -0
  180. package/src/core/web/server/security.ts +14 -0
  181. package/src/core/web/server/sse.ts +74 -0
  182. package/src/core/web/server/static.ts +112 -0
  183. package/src/core/web/server.ts +41 -383
package/README.md CHANGED
@@ -101,7 +101,7 @@ src/plugins/
101
101
  ```bash
102
102
  npm install --prefix plugins/poke
103
103
  npm install --prefix plugins/llm
104
- npm run build:local
104
+ npm run build:plugin
105
105
 
106
106
  node dist/app.js
107
107
  ```
@@ -144,14 +144,17 @@ jsbot [options]
144
144
  ## 开发与校验
145
145
 
146
146
  ```bash
147
- npm run check # TypeScript 类型检查(NodeNext + strict)
147
+ npm run check # 内核 TypeScript 类型检查(NodeNext + strict)
148
+ npm run check:webui # WebUI 类型检查
149
+ npm run check:all # 内核 + WebUI + 本地插件
148
150
  npm test # Vitest
151
+ npm run test:watch # Vitest watch 模式
149
152
  npm run format:check # Prettier 检查
150
- npm run build # 构建内核、内置插件和 CLI
153
+ npm run build # 构建内核、内置插件、WebUI 和 CLI
151
154
  npm run smoke # node dist/app.js --help
152
155
 
153
- npm run check:local # 检查 plugins(需要先安装本地依赖)
154
- npm run build:local # 构建 plugins
156
+ npm run check:plugin # 自动检查 plugins 下的本地源码插件
157
+ npm run build:plugin # 自动构建 plugins 下的本地源码插件
155
158
  npm run plugin:gen -- my-plugin # 生成并安装 plugins/my-plugin 模板依赖
156
159
  ```
157
160
 
@@ -0,0 +1,10 @@
1
+ export declare const USAGE = "Usage: jsbot [options]\n\nOptions:\n --config <path> Config file path (env: BOT_CONFIG)\n --data-dir <path> Data directory (env: BOT_DATA_DIR)\n --log-level <level> debug, info, warn or error (env: BOT_LOG_LEVEL)\n --help Show this help\n\nConfig precedence: CLI > environment > ./bot.config.json.\nData precedence: CLI > environment > ./data.\nLocal plugins: ./plugins/<id>/dist (auto-built when missing).\n";
2
+ export declare function pick(value: unknown): string | undefined;
3
+ export interface CliOptions {
4
+ help: boolean;
5
+ config: string | undefined;
6
+ dataDir: string | undefined;
7
+ logLevel: string | undefined;
8
+ }
9
+ export declare function parseCli(): CliOptions;
10
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/app/cli.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,KAAK,wbAWjB,CAAA;AAED,wBAAgB,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAIvD;AAED,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,OAAO,CAAA;IACb,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;IAC1B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;IAC3B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;CAC/B;AAED,wBAAgB,QAAQ,IAAI,UAAU,CAiBrC"}
@@ -0,0 +1,37 @@
1
+ import { parseArgs } from 'node:util';
2
+ import { LOCAL_PLUGIN_DIR } from './runtime.js';
3
+ export const USAGE = `Usage: jsbot [options]
4
+
5
+ Options:
6
+ --config <path> Config file path (env: BOT_CONFIG)
7
+ --data-dir <path> Data directory (env: BOT_DATA_DIR)
8
+ --log-level <level> debug, info, warn or error (env: BOT_LOG_LEVEL)
9
+ --help Show this help
10
+
11
+ Config precedence: CLI > environment > ./bot.config.json.
12
+ Data precedence: CLI > environment > ./data.
13
+ Local plugins: ./${LOCAL_PLUGIN_DIR}/<id>/dist (auto-built when missing).
14
+ `;
15
+ export function pick(value) {
16
+ return typeof value === 'string' && value.trim().length > 0
17
+ ? value
18
+ : undefined;
19
+ }
20
+ export function parseCli() {
21
+ const { values } = parseArgs({
22
+ options: {
23
+ config: { type: 'string' },
24
+ 'data-dir': { type: 'string' },
25
+ 'log-level': { type: 'string' },
26
+ help: { type: 'boolean', short: 'h' },
27
+ },
28
+ allowPositionals: false,
29
+ });
30
+ return {
31
+ help: values.help === true,
32
+ config: values.config,
33
+ dataDir: values['data-dir'],
34
+ logLevel: values['log-level'],
35
+ };
36
+ }
37
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/app/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAE/C,MAAM,CAAC,MAAM,KAAK,GAAG;;;;;;;;;;mBAUF,gBAAgB;CAClC,CAAA;AAED,MAAM,UAAU,IAAI,CAAC,KAAc;IAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QACvD,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,SAAS,CAAA;AACnB,CAAC;AASD,MAAM,UAAU,QAAQ;IACpB,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;QACzB,OAAO,EAAE;YACL,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC1B,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC9B,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC/B,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;SACxC;QACD,gBAAgB,EAAE,KAAK;KAC1B,CAAC,CAAA;IAEF,OAAO;QACH,IAAI,EAAE,MAAM,CAAC,IAAI,KAAK,IAAI;QAC1B,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC;QAC3B,QAAQ,EAAE,MAAM,CAAC,WAAW,CAAC;KAChC,CAAA;AACL,CAAC"}
@@ -0,0 +1,121 @@
1
+ import type { SnowLumaEvent } from '@snowluma/sdk';
2
+ import type { AppConfig } from '../core/config/schema.js';
3
+ import { Kernel } from '../core/kernel.js';
4
+ import { LogBuffer } from '../core/logging/log-buffer.js';
5
+ import { type Logger } from '../core/logging/logger.js';
6
+ import type { AnyPluginDefinition, PluginInstaller } from '../core/plugin/types.js';
7
+ import { type Database } from '../core/storage/database.js';
8
+ import { ConfigStore } from '../core/web/config-store.js';
9
+ import { EventFeed } from '../core/web/event-feed.js';
10
+ import type { WebUiAddress, WebUiDeps } from '../core/web/types.js';
11
+ export declare const LOCAL_PLUGIN_DIR = "plugins";
12
+ export interface PluginSource {
13
+ label: string;
14
+ plugins: AnyPluginDefinition[];
15
+ }
16
+ export interface RuntimeSettings {
17
+ logger: Logger;
18
+ configPath: string;
19
+ dataDir: string;
20
+ }
21
+ export interface RuntimeSpec {
22
+ config: AppConfig;
23
+ dataDir: string;
24
+ pluginDir: string;
25
+ plugins: AnyPluginDefinition[];
26
+ }
27
+ export interface Runtime {
28
+ spec: RuntimeSpec;
29
+ kernel: Kernel;
30
+ database: Database;
31
+ installer: PluginInstaller;
32
+ }
33
+ export interface StaticBinding {
34
+ host: string;
35
+ port: number;
36
+ }
37
+ export interface AppLogging {
38
+ logs: LogBuffer;
39
+ events: EventFeed;
40
+ logger: Logger;
41
+ tapEvents: (event: SnowLumaEvent) => void;
42
+ }
43
+ export declare function createAppLogging(logLevel: string | undefined): AppLogging;
44
+ export interface ResolveRuntimeSettingsOptions {
45
+ config: string | undefined;
46
+ dataDir: string | undefined;
47
+ env: NodeJS.ProcessEnv;
48
+ }
49
+ export declare function resolveRuntimeSettings(logger: Logger, options: ResolveRuntimeSettingsOptions): RuntimeSettings;
50
+ export declare function mergePlugins(sources: PluginSource[], logger: Logger): AnyPluginDefinition[];
51
+ export declare function loadRuntimeSpec(settings: RuntimeSettings): Promise<RuntimeSpec>;
52
+ export declare function createRuntime(spec: RuntimeSpec, settings: RuntimeSettings, onRestart: () => void, onEvent: (event: SnowLumaEvent) => void): Runtime;
53
+ export declare function describeError(error: unknown): string;
54
+ export declare function credentialSignature(config: AppConfig): string;
55
+ export declare function resolveStaticDir(scriptDir: string): string | null;
56
+ export declare function readVersion(scriptDir: string): string;
57
+ export declare function createExclusiveRunner(): <T>(task: () => Promise<T>) => Promise<T>;
58
+ export declare function restartDrainTimeout(previous: Runtime | null): number;
59
+ export interface StartInitialRuntimeOptions {
60
+ spec: RuntimeSpec;
61
+ settings: RuntimeSettings;
62
+ requestRestart: () => void;
63
+ onEvent: (event: SnowLumaEvent) => void;
64
+ getCurrentConfig: () => AppConfig;
65
+ hasWebUi: boolean;
66
+ onFailure: () => Promise<void>;
67
+ setRuntime: (runtime: Runtime | null) => void;
68
+ generation: number;
69
+ credentials: string;
70
+ }
71
+ export interface InitialRuntimeResult {
72
+ generation: number;
73
+ startupError: string | null;
74
+ credentials: string;
75
+ }
76
+ export declare function startInitialRuntime(options: StartInitialRuntimeOptions): Promise<InitialRuntimeResult>;
77
+ export interface ShutdownOptions {
78
+ logger: Logger;
79
+ isShuttingDown: () => boolean;
80
+ onBegin: () => void;
81
+ getRuntime: () => Runtime | null;
82
+ stopServer: () => Promise<void>;
83
+ }
84
+ export declare function createShutdown(options: ShutdownOptions): (signal: string, exitCode?: number) => Promise<void>;
85
+ export declare function registerShutdownSignals(shutdown: (signal: string, exitCode?: number) => Promise<void>): void;
86
+ export declare function createSerialRunner<T>(run: () => Promise<T>): () => Promise<T>;
87
+ export interface RestartRequesterOptions {
88
+ isShuttingDown: () => boolean;
89
+ isRestarting: () => boolean;
90
+ markPending: () => void;
91
+ restart: () => Promise<boolean>;
92
+ }
93
+ export interface RestartRequester {
94
+ request(): void;
95
+ clear(): void;
96
+ }
97
+ export declare function createRestartRequester(options: RestartRequesterOptions): RestartRequester;
98
+ export interface WebUiDepsOptions {
99
+ logger: Logger;
100
+ configPath: string;
101
+ dataDir: string;
102
+ pluginDir: string;
103
+ staticDir: string | null;
104
+ version: string;
105
+ logs: LogBuffer;
106
+ events: EventFeed;
107
+ store: ConfigStore;
108
+ getCurrentConfig: () => AppConfig;
109
+ getRuntime: () => Runtime | null;
110
+ getGeneration: () => number;
111
+ restart: () => Promise<boolean>;
112
+ requestRestart: () => void;
113
+ getListening: () => WebUiAddress | null;
114
+ invalidateSessions: () => void;
115
+ runExclusive: <T>(task: () => Promise<T>) => Promise<T>;
116
+ isRestarting: () => boolean;
117
+ getStartupError: () => string | null;
118
+ getBoundWebUi: () => StaticBinding | null;
119
+ }
120
+ export declare function createWebUiDeps(options: WebUiDepsOptions): WebUiDeps;
121
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/app/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,296 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { join, resolve } from 'node:path';
3
+ import { loadConfig, resolveConfigPath, resolveDataDir, } from '../core/config/loader.js';
4
+ import { createBotClient } from '../core/client.js';
5
+ import { Kernel } from '../core/kernel.js';
6
+ import { LogBuffer } from '../core/logging/log-buffer.js';
7
+ import { createLogger, defaultLogSink, parseLogLevel, } from '../core/logging/logger.js';
8
+ import { NpmPluginInstaller } from '../core/plugin/installer.js';
9
+ import { loadLocalPlugins } from '../core/plugin/loader.js';
10
+ import { openDatabase } from '../core/storage/database.js';
11
+ import { ConfigStore } from '../core/web/config-store.js';
12
+ import { EventFeed } from '../core/web/event-feed.js';
13
+ import { builtinPlugins } from '../plugins/index.js';
14
+ export const LOCAL_PLUGIN_DIR = 'plugins';
15
+ export function createAppLogging(logLevel) {
16
+ const logs = new LogBuffer();
17
+ const events = new EventFeed();
18
+ const tapEvents = (event) => {
19
+ events.add(event);
20
+ };
21
+ const sink = (record) => {
22
+ defaultLogSink(record);
23
+ logs.push(record);
24
+ };
25
+ const logger = createLogger({
26
+ level: parseLogLevel(logLevel),
27
+ scope: 'app',
28
+ sink,
29
+ });
30
+ return { logs, events, logger, tapEvents };
31
+ }
32
+ export function resolveRuntimeSettings(logger, options) {
33
+ const configPath = resolveConfigPath({
34
+ config: options.config,
35
+ env: options.env,
36
+ });
37
+ const dataDir = resolveDataDir({
38
+ dataDir: options.dataDir,
39
+ env: options.env,
40
+ });
41
+ return {
42
+ logger,
43
+ configPath,
44
+ dataDir,
45
+ };
46
+ }
47
+ export function mergePlugins(sources, logger) {
48
+ const seen = new Set();
49
+ const plugins = [];
50
+ for (const source of sources) {
51
+ for (const plugin of source.plugins) {
52
+ const id = plugin.manifest.id;
53
+ if (seen.has(id)) {
54
+ logger.warn(`skipping ${source.label} plugin ${id}: plugin id already loaded`);
55
+ continue;
56
+ }
57
+ seen.add(id);
58
+ plugins.push(plugin);
59
+ }
60
+ }
61
+ return plugins;
62
+ }
63
+ export async function loadRuntimeSpec(settings) {
64
+ const { logger } = settings;
65
+ logger.info('loading config', settings.configPath);
66
+ const config = await loadConfig(settings.configPath);
67
+ const pluginDir = resolve(LOCAL_PLUGIN_DIR);
68
+ logger.info('loading plugins from', pluginDir);
69
+ const localPlugins = await loadLocalPlugins(pluginDir, logger, {
70
+ buildTimeoutMs: config.installer.timeoutMs,
71
+ });
72
+ if (localPlugins.length > 0) {
73
+ logger.info(`loaded ${localPlugins.length} plugin(s) from ${pluginDir}`);
74
+ }
75
+ const plugins = mergePlugins([
76
+ { label: 'built-in', plugins: builtinPlugins },
77
+ { label: 'plugins', plugins: localPlugins },
78
+ ], logger);
79
+ return {
80
+ config,
81
+ dataDir: settings.dataDir,
82
+ pluginDir,
83
+ plugins,
84
+ };
85
+ }
86
+ export function createRuntime(spec, settings, onRestart, onEvent) {
87
+ const { logger } = settings;
88
+ const installer = new NpmPluginInstaller({
89
+ dir: spec.pluginDir,
90
+ config: spec.config.installer,
91
+ logger: logger.child('installer'),
92
+ reservedIds: () => new Set(spec.plugins.map((plugin) => plugin.manifest.id)),
93
+ configuredPluginIds: () => new Set(Object.keys(spec.config.plugins)),
94
+ });
95
+ const database = openDatabase({ dataDir: spec.dataDir });
96
+ const client = createBotClient({
97
+ url: spec.config.url,
98
+ ...(spec.config.accessToken
99
+ ? { accessToken: spec.config.accessToken }
100
+ : {}),
101
+ });
102
+ const kernel = new Kernel({
103
+ config: spec.config,
104
+ client,
105
+ logger,
106
+ database,
107
+ plugins: spec.plugins,
108
+ installer,
109
+ onRestart,
110
+ onEvent,
111
+ });
112
+ return { spec, kernel, database, installer };
113
+ }
114
+ export function describeError(error) {
115
+ if (error instanceof Error) {
116
+ return error.stack ?? `${error.name}: ${error.message}`;
117
+ }
118
+ return String(error);
119
+ }
120
+ export function credentialSignature(config) {
121
+ const webui = config.webui;
122
+ return [webui.username ?? '', webui.password ?? ''].join(':');
123
+ }
124
+ export function resolveStaticDir(scriptDir) {
125
+ const candidates = [
126
+ join(scriptDir, 'webui'),
127
+ resolve(process.cwd(), 'dist/webui'),
128
+ ];
129
+ for (const candidate of candidates) {
130
+ if (existsSync(join(candidate, 'index.html')))
131
+ return candidate;
132
+ }
133
+ return null;
134
+ }
135
+ export function readVersion(scriptDir) {
136
+ try {
137
+ const pkgPath = join(scriptDir, '..', 'package.json');
138
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
139
+ return pkg.version ?? 'unknown';
140
+ }
141
+ catch {
142
+ return 'unknown';
143
+ }
144
+ }
145
+ export function createExclusiveRunner() {
146
+ let tail = Promise.resolve();
147
+ return (task) => {
148
+ const run = tail.then(task, task);
149
+ tail = run.then(() => undefined, () => undefined);
150
+ return run;
151
+ };
152
+ }
153
+ export function restartDrainTimeout(previous) {
154
+ const installTimeout = previous?.spec.config.installer.timeoutMs ?? 5_000;
155
+ return Math.max(installTimeout, 5_000) * 2 + 5_000;
156
+ }
157
+ export async function startInitialRuntime(options) {
158
+ const { spec, settings, requestRestart, onEvent, getCurrentConfig } = options;
159
+ const { logger } = settings;
160
+ try {
161
+ const runtime = createRuntime(spec, settings, requestRestart, onEvent);
162
+ options.setRuntime(runtime);
163
+ await runtime.kernel.start();
164
+ const credentials = credentialSignature(getCurrentConfig());
165
+ logger.info('runtime started');
166
+ return {
167
+ generation: 1,
168
+ startupError: null,
169
+ credentials,
170
+ };
171
+ }
172
+ catch (error) {
173
+ options.setRuntime(null);
174
+ logger.error('runtime startup failed', error);
175
+ if (!options.hasWebUi) {
176
+ await options.onFailure();
177
+ }
178
+ else {
179
+ logger.info('webui stays online; fix the configuration on the config page and restart the runtime');
180
+ }
181
+ return {
182
+ generation: options.generation,
183
+ startupError: describeError(error),
184
+ credentials: options.credentials,
185
+ };
186
+ }
187
+ }
188
+ export function createShutdown(options) {
189
+ return async (signal, exitCode = 0) => {
190
+ if (options.isShuttingDown())
191
+ return;
192
+ options.onBegin();
193
+ options.logger.info(`received ${signal}, shutting down`);
194
+ try {
195
+ await options.getRuntime()?.kernel.stop();
196
+ await options.stopServer();
197
+ process.exit(exitCode);
198
+ }
199
+ catch (error) {
200
+ options.logger.error('shutdown failed', error);
201
+ process.exit(1);
202
+ }
203
+ };
204
+ }
205
+ export function registerShutdownSignals(shutdown) {
206
+ process.once('SIGINT', () => {
207
+ void shutdown('SIGINT');
208
+ });
209
+ process.once('SIGTERM', () => {
210
+ void shutdown('SIGTERM');
211
+ });
212
+ }
213
+ export function createSerialRunner(run) {
214
+ let tail = Promise.resolve();
215
+ return () => {
216
+ const result = tail.then(run, run);
217
+ tail = result.then(() => undefined, () => undefined);
218
+ return result;
219
+ };
220
+ }
221
+ export function createRestartRequester(options) {
222
+ let timer = null;
223
+ return {
224
+ request: () => {
225
+ if (options.isShuttingDown())
226
+ return;
227
+ if (options.isRestarting()) {
228
+ options.markPending();
229
+ return;
230
+ }
231
+ if (timer !== null)
232
+ return;
233
+ timer = setTimeout(() => {
234
+ timer = null;
235
+ void options.restart();
236
+ }, 250);
237
+ },
238
+ clear: () => {
239
+ if (timer === null)
240
+ return;
241
+ clearTimeout(timer);
242
+ timer = null;
243
+ },
244
+ };
245
+ }
246
+ export function createWebUiDeps(options) {
247
+ return {
248
+ logger: options.logger.child('webui'),
249
+ paths: {
250
+ configPath: options.configPath,
251
+ dataDir: options.dataDir,
252
+ pluginDir: options.pluginDir,
253
+ staticDir: options.staticDir,
254
+ },
255
+ version: options.version,
256
+ logs: options.logs,
257
+ events: options.events,
258
+ getWebUiConfig: () => options.getCurrentConfig().webui,
259
+ readConfig: () => options.store.read(),
260
+ validateConfig: (value) => options.store.validate(value),
261
+ applyConfig: (value, baseHash) => options.store.apply(value, baseHash),
262
+ restart: () => options.restart(),
263
+ requestRestart: options.requestRestart,
264
+ pause: () => options.getRuntime()?.kernel.pause(),
265
+ resume: () => options.getRuntime()?.kernel.resume(),
266
+ getListening: () => options.getListening(),
267
+ invalidateSessions: () => options.invalidateSessions(),
268
+ runExclusive: (task) => options.runExclusive(task),
269
+ getRuntime: () => {
270
+ const runtime = options.getRuntime();
271
+ return runtime === null
272
+ ? null
273
+ : {
274
+ generation: options.getGeneration(),
275
+ config: runtime.spec.config,
276
+ kernel: runtime.kernel,
277
+ api: runtime.kernel.api,
278
+ database: runtime.database,
279
+ installer: runtime.installer,
280
+ plugins: runtime.spec.plugins,
281
+ };
282
+ },
283
+ isRestarting: () => options.isRestarting(),
284
+ getStartupError: () => options.getStartupError(),
285
+ getRequiresProcessRestart: () => {
286
+ const webui = options.getCurrentConfig().webui;
287
+ const boundWebUi = options.getBoundWebUi();
288
+ if (boundWebUi === null)
289
+ return webui.enabled;
290
+ if (!webui.enabled)
291
+ return true;
292
+ return (webui.host !== boundWebUi.host || webui.port !== boundWebUi.port);
293
+ },
294
+ };
295
+ }
296
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/app/runtime.ts"],"names":[],"mappings":"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"}