@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.
Files changed (78) hide show
  1. package/README.md +18 -17
  2. package/dist/app.js +12 -40
  3. package/dist/app.js.map +1 -1
  4. package/dist/core/config/schema.d.ts +0 -2
  5. package/dist/core/config/schema.d.ts.map +1 -1
  6. package/dist/core/config/schema.js +0 -1
  7. package/dist/core/config/schema.js.map +1 -1
  8. package/dist/core/dispatch/command.d.ts +24 -2
  9. package/dist/core/dispatch/command.d.ts.map +1 -1
  10. package/dist/core/dispatch/command.js +297 -60
  11. package/dist/core/dispatch/command.js.map +1 -1
  12. package/dist/core/dispatch/router.d.ts +17 -3
  13. package/dist/core/dispatch/router.d.ts.map +1 -1
  14. package/dist/core/dispatch/router.js +38 -2
  15. package/dist/core/dispatch/router.js.map +1 -1
  16. package/dist/core/index.d.ts +1 -1
  17. package/dist/core/index.d.ts.map +1 -1
  18. package/dist/core/plugin/command-params.d.ts +15 -0
  19. package/dist/core/plugin/command-params.d.ts.map +1 -0
  20. package/dist/core/plugin/command-params.js +427 -0
  21. package/dist/core/plugin/command-params.js.map +1 -0
  22. package/dist/core/plugin/context.d.ts.map +1 -1
  23. package/dist/core/plugin/context.js +27 -0
  24. package/dist/core/plugin/context.js.map +1 -1
  25. package/dist/core/plugin/install-dir.d.ts +6 -9
  26. package/dist/core/plugin/install-dir.d.ts.map +1 -1
  27. package/dist/core/plugin/install-dir.js +99 -79
  28. package/dist/core/plugin/install-dir.js.map +1 -1
  29. package/dist/core/plugin/install-validate.d.ts +2 -1
  30. package/dist/core/plugin/install-validate.d.ts.map +1 -1
  31. package/dist/core/plugin/install-validate.js +25 -17
  32. package/dist/core/plugin/install-validate.js.map +1 -1
  33. package/dist/core/plugin/installer.d.ts +3 -3
  34. package/dist/core/plugin/installer.d.ts.map +1 -1
  35. package/dist/core/plugin/installer.js +143 -140
  36. package/dist/core/plugin/installer.js.map +1 -1
  37. package/dist/core/plugin/loader.d.ts +1 -0
  38. package/dist/core/plugin/loader.d.ts.map +1 -1
  39. package/dist/core/plugin/loader.js +24 -2
  40. package/dist/core/plugin/loader.js.map +1 -1
  41. package/dist/core/plugin/types.d.ts +11 -3
  42. package/dist/core/plugin/types.d.ts.map +1 -1
  43. package/dist/core/plugin/types.js.map +1 -1
  44. package/dist/plugins/admin/index.d.ts.map +1 -1
  45. package/dist/plugins/admin/index.js +119 -86
  46. package/dist/plugins/admin/index.js.map +1 -1
  47. package/dist/plugins/core/index.d.ts.map +1 -1
  48. package/dist/plugins/core/index.js +4 -1
  49. package/dist/plugins/core/index.js.map +1 -1
  50. package/docs/architecture.md +22 -24
  51. package/docs/configuration.md +19 -23
  52. package/docs/feature-parity.md +4 -4
  53. package/docs/migration.md +13 -13
  54. package/docs/plugin-api.md +156 -26
  55. package/docs/plugin-development.md +390 -0
  56. package/docs/release.md +81 -0
  57. package/examples/plugins/hello/README.md +10 -5
  58. package/examples/plugins/hello/index.js +3 -6
  59. package/package.json +2 -1
  60. package/src/app.ts +16 -55
  61. package/src/core/config/schema.ts +0 -1
  62. package/src/core/dispatch/command.ts +474 -70
  63. package/src/core/dispatch/router.ts +77 -3
  64. package/src/core/index.ts +2 -0
  65. package/src/core/plugin/command-params.ts +595 -0
  66. package/src/core/plugin/context.ts +47 -2
  67. package/src/core/plugin/install-dir.ts +117 -111
  68. package/src/core/plugin/install-validate.ts +36 -34
  69. package/src/core/plugin/installer.ts +228 -184
  70. package/src/core/plugin/loader.ts +36 -2
  71. package/src/core/plugin/types.ts +23 -3
  72. package/src/plugins/admin/index.ts +302 -233
  73. package/src/plugins/core/index.ts +5 -1
  74. package/dist/core/plugin/installed.d.ts +0 -9
  75. package/dist/core/plugin/installed.d.ts.map +0 -1
  76. package/dist/core/plugin/installed.js +0 -113
  77. package/dist/core/plugin/installed.js.map +0 -1
  78. 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 { loadInstalledPlugins } from './core/plugin/installed.js'
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
- installDir: string
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 externalPlugins = await loadExternalPlugins(
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
- if (installed.plugins.length > 0) {
140
- logger.info(
141
- `loaded ${installed.plugins.length} plugin(s) from ${installDir}`
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: 'external', plugins: externalPlugins },
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
- installDir,
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.installDir,
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),