@jsbot-tellus/core 2.0.2 → 2.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/README.md +18 -17
- package/dist/app.js +12 -40
- package/dist/app.js.map +1 -1
- package/dist/core/config/schema.d.ts +0 -2
- package/dist/core/config/schema.d.ts.map +1 -1
- package/dist/core/config/schema.js +0 -1
- package/dist/core/config/schema.js.map +1 -1
- package/dist/core/dispatch/command.d.ts +24 -2
- package/dist/core/dispatch/command.d.ts.map +1 -1
- package/dist/core/dispatch/command.js +297 -60
- package/dist/core/dispatch/command.js.map +1 -1
- package/dist/core/dispatch/router.d.ts +17 -3
- package/dist/core/dispatch/router.d.ts.map +1 -1
- package/dist/core/dispatch/router.js +38 -2
- package/dist/core/dispatch/router.js.map +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/plugin/command-params.d.ts +15 -0
- package/dist/core/plugin/command-params.d.ts.map +1 -0
- package/dist/core/plugin/command-params.js +427 -0
- package/dist/core/plugin/command-params.js.map +1 -0
- package/dist/core/plugin/context.d.ts.map +1 -1
- package/dist/core/plugin/context.js +27 -0
- package/dist/core/plugin/context.js.map +1 -1
- package/dist/core/plugin/install-dir.d.ts +6 -9
- package/dist/core/plugin/install-dir.d.ts.map +1 -1
- package/dist/core/plugin/install-dir.js +99 -79
- package/dist/core/plugin/install-dir.js.map +1 -1
- package/dist/core/plugin/install-validate.d.ts +2 -1
- package/dist/core/plugin/install-validate.d.ts.map +1 -1
- package/dist/core/plugin/install-validate.js +25 -17
- package/dist/core/plugin/install-validate.js.map +1 -1
- package/dist/core/plugin/installer.d.ts +3 -3
- package/dist/core/plugin/installer.d.ts.map +1 -1
- package/dist/core/plugin/installer.js +143 -140
- package/dist/core/plugin/installer.js.map +1 -1
- package/dist/core/plugin/loader.d.ts +1 -0
- package/dist/core/plugin/loader.d.ts.map +1 -1
- package/dist/core/plugin/loader.js +24 -2
- package/dist/core/plugin/loader.js.map +1 -1
- package/dist/core/plugin/types.d.ts +11 -3
- package/dist/core/plugin/types.d.ts.map +1 -1
- package/dist/core/plugin/types.js.map +1 -1
- package/dist/plugins/admin/index.d.ts.map +1 -1
- package/dist/plugins/admin/index.js +119 -86
- package/dist/plugins/admin/index.js.map +1 -1
- package/dist/plugins/core/index.d.ts.map +1 -1
- package/dist/plugins/core/index.js +4 -1
- package/dist/plugins/core/index.js.map +1 -1
- package/docs/architecture.md +22 -24
- package/docs/configuration.md +19 -23
- package/docs/feature-parity.md +4 -4
- package/docs/migration.md +13 -13
- package/docs/plugin-api.md +156 -26
- package/docs/plugin-development.md +390 -0
- package/docs/release.md +81 -0
- package/examples/plugins/hello/README.md +10 -5
- package/examples/plugins/hello/index.js +3 -6
- package/package.json +2 -1
- package/src/app.ts +16 -55
- package/src/core/config/schema.ts +0 -1
- package/src/core/dispatch/command.ts +474 -70
- package/src/core/dispatch/router.ts +77 -3
- package/src/core/index.ts +2 -0
- package/src/core/plugin/command-params.ts +595 -0
- package/src/core/plugin/context.ts +47 -2
- package/src/core/plugin/install-dir.ts +117 -111
- package/src/core/plugin/install-validate.ts +36 -34
- package/src/core/plugin/installer.ts +228 -184
- package/src/core/plugin/loader.ts +36 -2
- package/src/core/plugin/types.ts +23 -3
- package/src/plugins/admin/index.ts +302 -233
- package/src/plugins/core/index.ts +5 -1
- package/dist/core/plugin/installed.d.ts +0 -9
- package/dist/core/plugin/installed.d.ts.map +0 -1
- package/dist/core/plugin/installed.js +0 -113
- package/dist/core/plugin/installed.js.map +0 -1
- package/src/core/plugin/installed.ts +0 -165
package/src/app.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import { resolve } from 'node:path'
|
|
2
3
|
import { parseArgs } from 'node:util'
|
|
3
4
|
import { createBotClient } from './core/client.js'
|
|
4
5
|
import type { AppConfig } from './core/config/schema.js'
|
|
@@ -14,25 +15,25 @@ import {
|
|
|
14
15
|
parseLogLevel,
|
|
15
16
|
type Logger,
|
|
16
17
|
} from './core/logging/logger.js'
|
|
17
|
-
import { resolveInstallDir } from './core/plugin/install-dir.js'
|
|
18
18
|
import { NpmPluginInstaller } from './core/plugin/installer.js'
|
|
19
|
-
import {
|
|
20
|
-
import { loadPluginsFromDirectory } from './core/plugin/loader.js'
|
|
19
|
+
import { loadLocalPlugins } from './core/plugin/loader.js'
|
|
21
20
|
import type { AnyPluginDefinition } from './core/plugin/types.js'
|
|
22
21
|
import { openDatabase } from './core/storage/database.js'
|
|
23
22
|
import { builtinPlugins } from './plugins/index.js'
|
|
24
23
|
|
|
24
|
+
const LOCAL_PLUGIN_DIR = 'plugins'
|
|
25
|
+
|
|
25
26
|
const USAGE = `Usage: jsbot [options]
|
|
26
27
|
|
|
27
28
|
Options:
|
|
28
29
|
--config <path> Config file path (env: BOT_CONFIG)
|
|
29
30
|
--data-dir <path> Data directory (env: BOT_DATA_DIR)
|
|
30
31
|
--log-level <level> debug, info, warn or error (env: BOT_LOG_LEVEL)
|
|
31
|
-
--plugin-dir <path> External plugin directory, repeatable (env: BOT_PLUGIN_DIR)
|
|
32
32
|
--help Show this help
|
|
33
33
|
|
|
34
34
|
Config precedence: CLI > environment > ./bot.config.json.
|
|
35
35
|
Data precedence: CLI > environment > ./data.
|
|
36
|
+
Local plugins: ./${LOCAL_PLUGIN_DIR}/<id>/dist.
|
|
36
37
|
`
|
|
37
38
|
|
|
38
39
|
function pick(value: unknown): string | undefined {
|
|
@@ -41,22 +42,6 @@ function pick(value: unknown): string | undefined {
|
|
|
41
42
|
: undefined
|
|
42
43
|
}
|
|
43
44
|
|
|
44
|
-
function pickDirs(value: unknown): string[] {
|
|
45
|
-
if (Array.isArray(value)) {
|
|
46
|
-
return value
|
|
47
|
-
.filter((item): item is string => typeof item === 'string')
|
|
48
|
-
.map((item) => item.trim())
|
|
49
|
-
.filter((item) => item.length > 0)
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
if (typeof value !== 'string') return []
|
|
53
|
-
|
|
54
|
-
return value
|
|
55
|
-
.split(',')
|
|
56
|
-
.map((item) => item.trim())
|
|
57
|
-
.filter((item) => item.length > 0)
|
|
58
|
-
}
|
|
59
|
-
|
|
60
45
|
interface PluginSource {
|
|
61
46
|
label: string
|
|
62
47
|
plugins: AnyPluginDefinition[]
|
|
@@ -88,31 +73,16 @@ function mergePlugins(
|
|
|
88
73
|
return plugins
|
|
89
74
|
}
|
|
90
75
|
|
|
91
|
-
async function loadExternalPlugins(
|
|
92
|
-
directories: string[],
|
|
93
|
-
logger: Logger
|
|
94
|
-
): Promise<AnyPluginDefinition[]> {
|
|
95
|
-
const plugins: AnyPluginDefinition[] = []
|
|
96
|
-
|
|
97
|
-
for (const directory of directories) {
|
|
98
|
-
logger.info('loading external plugins', directory)
|
|
99
|
-
plugins.push(...(await loadPluginsFromDirectory(directory, logger)))
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
return plugins
|
|
103
|
-
}
|
|
104
|
-
|
|
105
76
|
interface RuntimeSettings {
|
|
106
77
|
logger: Logger
|
|
107
78
|
configPath: string
|
|
108
79
|
dataDir: string
|
|
109
|
-
pluginDirs: string[]
|
|
110
80
|
}
|
|
111
81
|
|
|
112
82
|
interface RuntimeSpec {
|
|
113
83
|
config: AppConfig
|
|
114
84
|
dataDir: string
|
|
115
|
-
|
|
85
|
+
pluginDir: string
|
|
116
86
|
plugins: AnyPluginDefinition[]
|
|
117
87
|
}
|
|
118
88
|
|
|
@@ -129,24 +99,20 @@ async function loadRuntimeSpec(
|
|
|
129
99
|
logger.info('loading config', settings.configPath)
|
|
130
100
|
|
|
131
101
|
const config = await loadConfig(settings.configPath)
|
|
132
|
-
const
|
|
133
|
-
settings.pluginDirs,
|
|
134
|
-
logger
|
|
135
|
-
)
|
|
136
|
-
const installDir = resolveInstallDir(config.installer, settings.dataDir)
|
|
137
|
-
const installed = await loadInstalledPlugins(installDir, logger)
|
|
102
|
+
const pluginDir = resolve(LOCAL_PLUGIN_DIR)
|
|
138
103
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
104
|
+
logger.info('loading plugins from', pluginDir)
|
|
105
|
+
|
|
106
|
+
const localPlugins = await loadLocalPlugins(pluginDir, logger)
|
|
107
|
+
|
|
108
|
+
if (localPlugins.length > 0) {
|
|
109
|
+
logger.info(`loaded ${localPlugins.length} plugin(s) from ${pluginDir}`)
|
|
143
110
|
}
|
|
144
111
|
|
|
145
112
|
const plugins = mergePlugins(
|
|
146
113
|
[
|
|
147
114
|
{ label: 'built-in', plugins: builtinPlugins },
|
|
148
|
-
{ label: '
|
|
149
|
-
{ label: 'installed', plugins: installed.plugins },
|
|
115
|
+
{ label: 'plugins', plugins: localPlugins },
|
|
150
116
|
],
|
|
151
117
|
logger
|
|
152
118
|
)
|
|
@@ -154,7 +120,7 @@ async function loadRuntimeSpec(
|
|
|
154
120
|
return {
|
|
155
121
|
config,
|
|
156
122
|
dataDir: settings.dataDir,
|
|
157
|
-
|
|
123
|
+
pluginDir,
|
|
158
124
|
plugins,
|
|
159
125
|
}
|
|
160
126
|
}
|
|
@@ -166,7 +132,7 @@ function createRuntime(
|
|
|
166
132
|
): Runtime {
|
|
167
133
|
const { logger } = settings
|
|
168
134
|
const installer = new NpmPluginInstaller({
|
|
169
|
-
dir: spec.
|
|
135
|
+
dir: spec.pluginDir,
|
|
170
136
|
config: spec.config.installer,
|
|
171
137
|
logger: logger.child('installer'),
|
|
172
138
|
reservedIds: () =>
|
|
@@ -201,7 +167,6 @@ async function main(): Promise<void> {
|
|
|
201
167
|
config: { type: 'string' },
|
|
202
168
|
'data-dir': { type: 'string' },
|
|
203
169
|
'log-level': { type: 'string' },
|
|
204
|
-
'plugin-dir': { type: 'string', multiple: true },
|
|
205
170
|
help: { type: 'boolean', short: 'h' },
|
|
206
171
|
},
|
|
207
172
|
allowPositionals: false,
|
|
@@ -229,14 +194,10 @@ async function main(): Promise<void> {
|
|
|
229
194
|
env: process.env,
|
|
230
195
|
})
|
|
231
196
|
|
|
232
|
-
const cliPluginDirs = pickDirs(values['plugin-dir'])
|
|
233
|
-
const envPluginDirs = pickDirs(process.env.BOT_PLUGIN_DIR)
|
|
234
|
-
const pluginDirs = cliPluginDirs.length > 0 ? cliPluginDirs : envPluginDirs
|
|
235
197
|
const settings: RuntimeSettings = {
|
|
236
198
|
logger,
|
|
237
199
|
configPath,
|
|
238
200
|
dataDir,
|
|
239
|
-
pluginDirs,
|
|
240
201
|
}
|
|
241
202
|
|
|
242
203
|
let runtime: Runtime | null = null
|
|
@@ -48,7 +48,6 @@ export const rolesConfigSchema = z
|
|
|
48
48
|
export const installerConfigSchema = z
|
|
49
49
|
.object({
|
|
50
50
|
enabled: z.boolean().default(false),
|
|
51
|
-
dir: z.string().min(1).optional(),
|
|
52
51
|
registry: z.url().default('https://registry.npmjs.org/'),
|
|
53
52
|
allowedPackages: z.array(z.string().min(1)).default([]),
|
|
54
53
|
allowScripts: z.boolean().default(false),
|