@jsbot-tellus/core 2.5.0 → 2.6.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 (175) 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/plugin/command-params.d.ts +3 -37
  13. package/dist/core/plugin/command-params.d.ts.map +1 -1
  14. package/dist/core/plugin/command-params.js +2 -580
  15. package/dist/core/plugin/command-params.js.map +1 -1
  16. package/dist/core/plugin/install/paths.d.ts +7 -0
  17. package/dist/core/plugin/install/paths.d.ts.map +1 -0
  18. package/dist/core/plugin/install/paths.js +49 -0
  19. package/dist/core/plugin/install/paths.js.map +1 -0
  20. package/dist/core/plugin/install/state.d.ts +23 -0
  21. package/dist/core/plugin/install/state.d.ts.map +1 -0
  22. package/dist/core/plugin/install/state.js +129 -0
  23. package/dist/core/plugin/install/state.js.map +1 -0
  24. package/dist/core/plugin/install/validate-script.d.ts +3 -0
  25. package/dist/core/plugin/install/validate-script.d.ts.map +1 -0
  26. package/dist/core/plugin/install/validate-script.js +154 -0
  27. package/dist/core/plugin/install/validate-script.js.map +1 -0
  28. package/dist/core/plugin/install-dir.d.ts +3 -28
  29. package/dist/core/plugin/install-dir.d.ts.map +1 -1
  30. package/dist/core/plugin/install-dir.js +3 -326
  31. package/dist/core/plugin/install-dir.js.map +1 -1
  32. package/dist/core/plugin/installer/checks.d.ts +6 -0
  33. package/dist/core/plugin/installer/checks.d.ts.map +1 -0
  34. package/dist/core/plugin/installer/checks.js +99 -0
  35. package/dist/core/plugin/installer/checks.js.map +1 -0
  36. package/dist/core/plugin/installer/support.d.ts +37 -0
  37. package/dist/core/plugin/installer/support.d.ts.map +1 -0
  38. package/dist/core/plugin/installer/support.js +67 -0
  39. package/dist/core/plugin/installer/support.js.map +1 -0
  40. package/dist/core/plugin/installer/warnings.d.ts +5 -0
  41. package/dist/core/plugin/installer/warnings.d.ts.map +1 -0
  42. package/dist/core/plugin/installer/warnings.js +28 -0
  43. package/dist/core/plugin/installer/warnings.js.map +1 -0
  44. package/dist/core/plugin/installer.d.ts +4 -30
  45. package/dist/core/plugin/installer.d.ts.map +1 -1
  46. package/dist/core/plugin/installer.js +21 -202
  47. package/dist/core/plugin/installer.js.map +1 -1
  48. package/dist/core/plugin/params/compile.d.ts +3 -0
  49. package/dist/core/plugin/params/compile.d.ts.map +1 -0
  50. package/dist/core/plugin/params/compile.js +23 -0
  51. package/dist/core/plugin/params/compile.js.map +1 -0
  52. package/dist/core/plugin/params/declaration.d.ts +9 -0
  53. package/dist/core/plugin/params/declaration.d.ts.map +1 -0
  54. package/dist/core/plugin/params/declaration.js +286 -0
  55. package/dist/core/plugin/params/declaration.js.map +1 -0
  56. package/dist/core/plugin/params/input.d.ts +5 -0
  57. package/dist/core/plugin/params/input.d.ts.map +1 -0
  58. package/dist/core/plugin/params/input.js +196 -0
  59. package/dist/core/plugin/params/input.js.map +1 -0
  60. package/dist/core/plugin/params/reply.d.ts +3 -0
  61. package/dist/core/plugin/params/reply.d.ts.map +1 -0
  62. package/dist/core/plugin/params/reply.js +49 -0
  63. package/dist/core/plugin/params/reply.js.map +1 -0
  64. package/dist/core/plugin/params/type-level.d.ts +24 -0
  65. package/dist/core/plugin/params/type-level.d.ts.map +1 -0
  66. package/dist/core/plugin/params/type-level.js +2 -0
  67. package/dist/core/plugin/params/type-level.js.map +1 -0
  68. package/dist/core/plugin/params/types.d.ts +33 -0
  69. package/dist/core/plugin/params/types.d.ts.map +1 -0
  70. package/dist/core/plugin/params/types.js +12 -0
  71. package/dist/core/plugin/params/types.js.map +1 -0
  72. package/dist/core/plugin/params/values.d.ts +7 -0
  73. package/dist/core/plugin/params/values.d.ts.map +1 -0
  74. package/dist/core/plugin/params/values.js +111 -0
  75. package/dist/core/plugin/params/values.js.map +1 -0
  76. package/dist/core/web/api.d.ts +2 -14
  77. package/dist/core/web/api.d.ts.map +1 -1
  78. package/dist/core/web/api.js +8 -500
  79. package/dist/core/web/api.js.map +1 -1
  80. package/dist/core/web/routes/actions.d.ts +4 -0
  81. package/dist/core/web/routes/actions.d.ts.map +1 -0
  82. package/dist/core/web/routes/actions.js +33 -0
  83. package/dist/core/web/routes/actions.js.map +1 -0
  84. package/dist/core/web/routes/config.d.ts +5 -0
  85. package/dist/core/web/routes/config.d.ts.map +1 -0
  86. package/dist/core/web/routes/config.js +30 -0
  87. package/dist/core/web/routes/config.js.map +1 -0
  88. package/dist/core/web/routes/kv.d.ts +6 -0
  89. package/dist/core/web/routes/kv.d.ts.map +1 -0
  90. package/dist/core/web/routes/kv.js +80 -0
  91. package/dist/core/web/routes/kv.js.map +1 -0
  92. package/dist/core/web/routes/plugins.d.ts +5 -0
  93. package/dist/core/web/routes/plugins.d.ts.map +1 -0
  94. package/dist/core/web/routes/plugins.js +98 -0
  95. package/dist/core/web/routes/plugins.js.map +1 -0
  96. package/dist/core/web/routes/sessions.d.ts +8 -0
  97. package/dist/core/web/routes/sessions.d.ts.map +1 -0
  98. package/dist/core/web/routes/sessions.js +130 -0
  99. package/dist/core/web/routes/sessions.js.map +1 -0
  100. package/dist/core/web/routes/shared.d.ts +18 -0
  101. package/dist/core/web/routes/shared.d.ts.map +1 -0
  102. package/dist/core/web/routes/shared.js +19 -0
  103. package/dist/core/web/routes/shared.js.map +1 -0
  104. package/dist/core/web/routes/status.d.ts +6 -0
  105. package/dist/core/web/routes/status.d.ts.map +1 -0
  106. package/dist/core/web/routes/status.js +132 -0
  107. package/dist/core/web/routes/status.js.map +1 -0
  108. package/dist/core/web/server/auth.d.ts +17 -0
  109. package/dist/core/web/server/auth.d.ts.map +1 -0
  110. package/dist/core/web/server/auth.js +68 -0
  111. package/dist/core/web/server/auth.js.map +1 -0
  112. package/dist/core/web/server/csp.d.ts +11 -0
  113. package/dist/core/web/server/csp.d.ts.map +1 -0
  114. package/dist/core/web/server/csp.js +31 -0
  115. package/dist/core/web/server/csp.js.map +1 -0
  116. package/dist/core/web/server/request.d.ts +6 -0
  117. package/dist/core/web/server/request.d.ts.map +1 -0
  118. package/dist/core/web/server/request.js +33 -0
  119. package/dist/core/web/server/request.js.map +1 -0
  120. package/dist/core/web/server/security.d.ts +4 -0
  121. package/dist/core/web/server/security.d.ts.map +1 -0
  122. package/dist/core/web/server/security.js +12 -0
  123. package/dist/core/web/server/security.js.map +1 -0
  124. package/dist/core/web/server/sse.d.ts +18 -0
  125. package/dist/core/web/server/sse.d.ts.map +1 -0
  126. package/dist/core/web/server/sse.js +49 -0
  127. package/dist/core/web/server/sse.js.map +1 -0
  128. package/dist/core/web/server/static.d.ts +16 -0
  129. package/dist/core/web/server/static.d.ts.map +1 -0
  130. package/dist/core/web/server/static.js +80 -0
  131. package/dist/core/web/server/static.js.map +1 -0
  132. package/dist/core/web/server.d.ts +0 -7
  133. package/dist/core/web/server.d.ts.map +1 -1
  134. package/dist/core/web/server.js +41 -263
  135. package/dist/core/web/server.js.map +1 -1
  136. package/docs/architecture.md +28 -11
  137. package/docs/configuration.md +1 -1
  138. package/docs/migration.md +2 -2
  139. package/docs/plugin-api.md +24 -11
  140. package/docs/plugin-development.md +1 -1
  141. package/package.json +19 -17
  142. package/src/app/cli.ts +47 -0
  143. package/src/app/runtime.ts +522 -0
  144. package/src/app.ts +87 -395
  145. package/src/core/plugin/command-params.ts +8 -871
  146. package/src/core/plugin/install/paths.ts +72 -0
  147. package/src/core/plugin/install/state.ts +196 -0
  148. package/src/core/plugin/install/validate-script.ts +154 -0
  149. package/src/core/plugin/install-dir.ts +19 -427
  150. package/src/core/plugin/installer/checks.ts +137 -0
  151. package/src/core/plugin/installer/support.ts +120 -0
  152. package/src/core/plugin/installer/warnings.ts +52 -0
  153. package/src/core/plugin/installer.ts +52 -301
  154. package/src/core/plugin/params/compile.ts +41 -0
  155. package/src/core/plugin/params/declaration.ts +394 -0
  156. package/src/core/plugin/params/input.ts +281 -0
  157. package/src/core/plugin/params/reply.ts +59 -0
  158. package/src/core/plugin/params/type-level.ts +75 -0
  159. package/src/core/plugin/params/types.ts +55 -0
  160. package/src/core/plugin/params/values.ts +150 -0
  161. package/src/core/web/api.ts +33 -759
  162. package/src/core/web/routes/actions.ts +43 -0
  163. package/src/core/web/routes/config.ts +42 -0
  164. package/src/core/web/routes/kv.ts +122 -0
  165. package/src/core/web/routes/plugins.ts +151 -0
  166. package/src/core/web/routes/sessions.ts +188 -0
  167. package/src/core/web/routes/shared.ts +42 -0
  168. package/src/core/web/routes/status.ts +191 -0
  169. package/src/core/web/server/auth.ts +126 -0
  170. package/src/core/web/server/csp.ts +33 -0
  171. package/src/core/web/server/request.ts +38 -0
  172. package/src/core/web/server/security.ts +14 -0
  173. package/src/core/web/server/sse.ts +74 -0
  174. package/src/core/web/server/static.ts +112 -0
  175. package/src/core/web/server.ts +41 -383
@@ -1,581 +1,3 @@
1
- import { parseSegments } from '@snowluma/sdk';
2
- export class CommandParamsError extends Error {
3
- usage;
4
- constructor(message, usage) {
5
- super(message);
6
- this.name = 'CommandParamsError';
7
- this.usage = usage;
8
- }
9
- }
10
- const NAME_PATTERN = /^[\p{L}_][\p{L}\p{N}_-]*$/u;
11
- function declarationError(message) {
12
- return new Error(`参数声明错误:${message}`);
13
- }
14
- function parseType(value) {
15
- switch (value) {
16
- case 'string':
17
- case 'text':
18
- case 'number':
19
- case 'integer':
20
- case 'boolean':
21
- case 'at':
22
- case 'reply':
23
- case 'time':
24
- return value;
25
- default:
26
- throw declarationError(`未知的参数类型 "${value}"`);
27
- }
28
- }
29
- function validateName(value) {
30
- const name = value.trim();
31
- if (!name) {
32
- throw declarationError('参数名不能为空');
33
- }
34
- if (!NAME_PATTERN.test(name)) {
35
- throw declarationError(`非法的参数名 "${name}"`);
36
- }
37
- return name;
38
- }
39
- function splitDeclaration(input) {
40
- const parts = [];
41
- let index = 0;
42
- while (index < input.length) {
43
- const char = input[index];
44
- if (char === undefined)
45
- break;
46
- if (/\s/.test(char)) {
47
- index += 1;
48
- continue;
49
- }
50
- if (char !== '<' && char !== '[') {
51
- throw declarationError(`无法识别的字符 "${char}"`);
52
- }
53
- const close = char === '<' ? '>' : ']';
54
- let end = index + 1;
55
- let quote = null;
56
- for (; end < input.length; end += 1) {
57
- const current = input[end];
58
- if (current === undefined)
59
- break;
60
- if (quote !== null) {
61
- if (current === '\\') {
62
- end += 1;
63
- continue;
64
- }
65
- if (current === quote) {
66
- quote = null;
67
- }
68
- continue;
69
- }
70
- if (current === '"' || current === "'") {
71
- quote = current;
72
- continue;
73
- }
74
- if (current === close)
75
- break;
76
- }
77
- if (end >= input.length || input[end] !== close) {
78
- throw declarationError(`参数 "${input.slice(index)}" 缺少 ${close}`);
79
- }
80
- parts.push(input.slice(index, end + 1));
81
- index = end + 1;
82
- }
83
- return parts;
84
- }
85
- function unquote(value) {
86
- const trimmed = value.trim();
87
- const quote = trimmed[0];
88
- if (quote !== '"' && quote !== "'") {
89
- return trimmed;
90
- }
91
- if (trimmed.length < 2 || trimmed[trimmed.length - 1] !== quote) {
92
- throw declarationError('默认值引号未闭合');
93
- }
94
- let result = '';
95
- for (let index = 1; index < trimmed.length - 1; index += 1) {
96
- const char = trimmed[index];
97
- if (char === undefined)
98
- break;
99
- if (char === '\\') {
100
- const next = trimmed[index + 1];
101
- if (next !== undefined) {
102
- result += next;
103
- index += 1;
104
- }
105
- continue;
106
- }
107
- result += char;
108
- }
109
- return result;
110
- }
111
- function parseBoolean(value) {
112
- const normalized = value.trim().toLowerCase();
113
- if (['true', '1', 'yes', 'y', 'on'].includes(normalized)) {
114
- return true;
115
- }
116
- if (['false', '0', 'no', 'n', 'off'].includes(normalized)) {
117
- return false;
118
- }
119
- return null;
120
- }
121
- function parseAt(value, name, usage) {
122
- const raw = value.trim();
123
- const segments = parseSegments(raw);
124
- const segment = segments[0];
125
- if (segments.length === 1 && segment?.type === 'at') {
126
- const qq = segment.data.qq;
127
- if (qq !== 'all') {
128
- const parsed = Number(qq);
129
- if (Number.isSafeInteger(parsed) && parsed > 0) {
130
- return parsed;
131
- }
132
- }
133
- }
134
- else if (/^\d+$/.test(raw)) {
135
- const parsed = Number(raw);
136
- if (Number.isSafeInteger(parsed) && parsed > 0) {
137
- return parsed;
138
- }
139
- }
140
- throw new CommandParamsError(`参数 ${name} 需要 @ 一个用户或填写 QQ 号`, usage);
141
- }
142
- const TIME_UNITS = {
143
- s: 1,
144
- 秒: 1,
145
- m: 60,
146
- 分: 60,
147
- 分钟: 60,
148
- h: 3600,
149
- 时: 3600,
150
- 小时: 3600,
151
- d: 86400,
152
- 天: 86400,
153
- w: 604800,
154
- 周: 604800,
155
- };
156
- const TIME_PART = /^(\d+(?:\.\d+)?)(分钟|小时|秒|分|时|天|周|[smhdw])/i;
157
- function parseTimeValue(value) {
158
- const raw = value.trim();
159
- if (/^\d+$/.test(raw)) {
160
- const seconds = Number(raw);
161
- return Number.isSafeInteger(seconds) ? seconds : null;
162
- }
163
- let index = 0;
164
- let total = 0;
165
- let parsed = false;
166
- while (index < raw.length) {
167
- const match = TIME_PART.exec(raw.slice(index));
168
- if (!match)
169
- return null;
170
- const unit = TIME_UNITS[match[2]?.toLowerCase() ?? ''];
171
- const amount = Number(match[1]);
172
- if (unit === undefined)
173
- return null;
174
- total += amount * unit;
175
- index += match[0].length;
176
- parsed = true;
177
- }
178
- if (!parsed || !Number.isSafeInteger(total) || total < 0) {
179
- return null;
180
- }
181
- return total;
182
- }
183
- function parseTime(value, name, usage) {
184
- const seconds = parseTimeValue(value);
185
- if (seconds === null) {
186
- throw new CommandParamsError(`参数 ${name} 需要是时间,例如 10s、5m、1h30m`, usage);
187
- }
188
- return seconds;
189
- }
190
- function isRecord(value) {
191
- return typeof value === 'object' && value !== null && !Array.isArray(value);
192
- }
193
- function toMessageId(value) {
194
- const raw = typeof value === 'string' ? value.trim() : value;
195
- if (typeof raw !== 'number' && typeof raw !== 'string') {
196
- return undefined;
197
- }
198
- const parsed = typeof raw === 'string'
199
- ? /^-?\d+$/.test(raw)
200
- ? Number(raw)
201
- : Number.NaN
202
- : raw;
203
- return Number.isSafeInteger(parsed) && parsed !== 0 ? parsed : undefined;
204
- }
205
- function replyIdIn(segments) {
206
- for (const segment of segments) {
207
- if (!isRecord(segment) || segment.type !== 'reply')
208
- continue;
209
- const data = isRecord(segment.data) ? segment.data : undefined;
210
- const id = toMessageId(data?.id);
211
- if (id !== undefined)
212
- return id;
213
- }
214
- return undefined;
215
- }
216
- function quoteIdOf(event) {
217
- if (!event)
218
- return undefined;
219
- const message = event.message;
220
- if (typeof message === 'string') {
221
- const id = replyIdIn(parseSegments(message));
222
- if (id !== undefined)
223
- return id;
224
- }
225
- else if (Array.isArray(message)) {
226
- const id = replyIdIn(message);
227
- if (id !== undefined)
228
- return id;
229
- }
230
- else if (isRecord(message)) {
231
- const id = replyIdIn([message]);
232
- if (id !== undefined)
233
- return id;
234
- }
235
- return replyIdIn(parseSegments(event.raw_message));
236
- }
237
- function parseDefaultValue(type, raw, name) {
238
- const value = unquote(raw);
239
- switch (type) {
240
- case 'string':
241
- case 'text':
242
- return value;
243
- case 'number': {
244
- const number = value.trim() === '' ? Number.NaN : Number(value);
245
- if (!Number.isFinite(number)) {
246
- throw declarationError(`参数 ${name} 的默认值不是数字`);
247
- }
248
- return number;
249
- }
250
- case 'integer': {
251
- const number = value.trim() === '' ? Number.NaN : Number(value);
252
- if (!Number.isInteger(number)) {
253
- throw declarationError(`参数 ${name} 的默认值不是整数`);
254
- }
255
- return number;
256
- }
257
- case 'boolean': {
258
- const boolean = parseBoolean(value);
259
- if (boolean === null) {
260
- throw declarationError(`参数 ${name} 的默认值不是布尔值`);
261
- }
262
- return boolean;
263
- }
264
- case 'at':
265
- case 'reply':
266
- throw declarationError(`参数 ${name} 不支持默认值`);
267
- case 'time': {
268
- const seconds = parseTimeValue(value);
269
- if (seconds === null) {
270
- throw declarationError(`参数 ${name} 的默认值不是时间`);
271
- }
272
- return seconds;
273
- }
274
- }
275
- }
276
- function parseToken(token) {
277
- const open = token[0];
278
- const close = token[token.length - 1];
279
- if ((open !== '<' && open !== '[') ||
280
- (close !== '>' && close !== ']') ||
281
- (open === '<') !== (close === '>')) {
282
- throw declarationError(`非法的参数声明 "${token}"`);
283
- }
284
- const required = open === '<';
285
- const inner = token.slice(1, -1).trim();
286
- if (!inner) {
287
- throw declarationError('参数名不能为空');
288
- }
289
- if (inner.startsWith('...')) {
290
- if (required) {
291
- throw declarationError('变长参数必须使用 [ ]');
292
- }
293
- const name = validateName(inner.slice(3));
294
- return {
295
- name,
296
- type: 'string',
297
- required: false,
298
- rest: true,
299
- hasDefault: false,
300
- };
301
- }
302
- if (inner.includes('...')) {
303
- throw declarationError(`非法的参数声明 "${token}"`);
304
- }
305
- const equals = inner.indexOf('=');
306
- const head = equals >= 0 ? inner.slice(0, equals).trim() : inner.trim();
307
- const defaultRaw = equals >= 0 ? inner.slice(equals + 1).trim() : undefined;
308
- const colon = head.indexOf(':');
309
- const name = validateName(colon >= 0 ? head.slice(0, colon) : head);
310
- const type = parseType(colon >= 0 ? head.slice(colon + 1).trim() : 'string');
311
- if (required && defaultRaw !== undefined) {
312
- throw declarationError(`必填参数不能有默认值:${token}`);
313
- }
314
- if (defaultRaw !== undefined) {
315
- return {
316
- name,
317
- type,
318
- required,
319
- rest: false,
320
- hasDefault: true,
321
- defaultValue: parseDefaultValue(type, defaultRaw, name),
322
- };
323
- }
324
- return {
325
- name,
326
- type,
327
- required,
328
- rest: false,
329
- hasDefault: false,
330
- };
331
- }
332
- function validateSpecs(specs) {
333
- const names = new Set();
334
- let seenOptional = false;
335
- let seenRest = false;
336
- let seenText = false;
337
- for (let index = 0; index < specs.length; index += 1) {
338
- const spec = specs[index];
339
- if (!spec)
340
- continue;
341
- if (names.has(spec.name)) {
342
- throw declarationError(`参数名重复 "${spec.name}"`);
343
- }
344
- names.add(spec.name);
345
- if (seenRest) {
346
- throw declarationError('变长参数后面不能再有参数');
347
- }
348
- if (seenText) {
349
- throw declarationError('文本参数后面不能再有参数');
350
- }
351
- if (spec.rest) {
352
- if (index !== specs.length - 1) {
353
- throw declarationError('变长参数必须放在最后');
354
- }
355
- seenRest = true;
356
- continue;
357
- }
358
- if (spec.type === 'text') {
359
- if (index !== specs.length - 1) {
360
- throw declarationError('文本参数必须放在最后');
361
- }
362
- seenText = true;
363
- }
364
- if (spec.required) {
365
- if (seenOptional) {
366
- throw declarationError('必填参数不能出现在可选参数后面');
367
- }
368
- }
369
- else {
370
- seenOptional = true;
371
- }
372
- }
373
- }
374
- function usageOf(specs) {
375
- return specs
376
- .map((spec) => {
377
- if (spec.rest) {
378
- return `[...${spec.name}]`;
379
- }
380
- const name = spec.type === 'text' ? `${spec.name}...` : spec.name;
381
- return spec.required ? `<${name}>` : `[${name}]`;
382
- })
383
- .join(' ');
384
- }
385
- function tokenizeInput(input, usage) {
386
- const tokens = [];
387
- let index = 0;
388
- while (index < input.length) {
389
- const char = input[index];
390
- if (char === undefined)
391
- break;
392
- if (/\s/.test(char)) {
393
- index += 1;
394
- continue;
395
- }
396
- const start = index;
397
- let value = '';
398
- let quote = null;
399
- while (index < input.length) {
400
- const current = input[index];
401
- if (current === undefined)
402
- break;
403
- if (quote !== null) {
404
- if (current === '\\') {
405
- const next = input[index + 1];
406
- if (next !== undefined) {
407
- value += next;
408
- index += 2;
409
- continue;
410
- }
411
- value += current;
412
- index += 1;
413
- continue;
414
- }
415
- if (current === quote) {
416
- quote = null;
417
- index += 1;
418
- continue;
419
- }
420
- value += current;
421
- index += 1;
422
- continue;
423
- }
424
- if (/\s/.test(current))
425
- break;
426
- if (current === '[' && input.startsWith('[CQ:', index)) {
427
- const close = input.indexOf(']', index + 4);
428
- if (close >= 0) {
429
- value += input.slice(index, close + 1);
430
- index = close + 1;
431
- continue;
432
- }
433
- }
434
- if (current === '"' || current === "'") {
435
- quote = current;
436
- index += 1;
437
- continue;
438
- }
439
- if (current === '\\') {
440
- const next = input[index + 1];
441
- if (next !== undefined) {
442
- value += next;
443
- index += 2;
444
- continue;
445
- }
446
- value += current;
447
- index += 1;
448
- continue;
449
- }
450
- value += current;
451
- index += 1;
452
- }
453
- if (quote !== null) {
454
- throw new CommandParamsError('参数引号未闭合', usage);
455
- }
456
- tokens.push({ value, start });
457
- }
458
- return tokens;
459
- }
460
- function parseValue(spec, raw, usage) {
461
- switch (spec.type) {
462
- case 'string':
463
- case 'text':
464
- return raw;
465
- case 'number': {
466
- const value = raw.trim() === '' ? Number.NaN : Number(raw);
467
- if (!Number.isFinite(value)) {
468
- throw new CommandParamsError(`参数 ${spec.name} 需要是数字`, usage);
469
- }
470
- return value;
471
- }
472
- case 'integer': {
473
- const value = raw.trim() === '' ? Number.NaN : Number(raw);
474
- if (!Number.isInteger(value)) {
475
- throw new CommandParamsError(`参数 ${spec.name} 需要是整数`, usage);
476
- }
477
- return value;
478
- }
479
- case 'boolean': {
480
- const value = parseBoolean(raw);
481
- if (value === null) {
482
- throw new CommandParamsError(`参数 ${spec.name} 需要是布尔值`, usage);
483
- }
484
- return value;
485
- }
486
- case 'at':
487
- return parseAt(raw, spec.name, usage);
488
- case 'time':
489
- return parseTime(raw, spec.name, usage);
490
- }
491
- }
492
- function parseInput(specs, input, usage, quoteId) {
493
- const tokens = tokenizeInput(input, usage);
494
- const args = [];
495
- let index = 0;
496
- for (const spec of specs) {
497
- if (spec.type === 'reply') {
498
- if (quoteId !== undefined) {
499
- args.push(quoteId);
500
- }
501
- else if (spec.required) {
502
- throw new CommandParamsError(`参数 ${spec.name} 需要引用一条消息`, usage);
503
- }
504
- else {
505
- args.push(undefined);
506
- }
507
- continue;
508
- }
509
- if (spec.rest) {
510
- for (let tokenIndex = index; tokenIndex < tokens.length; tokenIndex += 1) {
511
- const token = tokens[tokenIndex];
512
- if (token) {
513
- args.push(token.value);
514
- }
515
- }
516
- index = tokens.length;
517
- continue;
518
- }
519
- if (spec.type === 'text') {
520
- const token = tokens[index];
521
- if (!token) {
522
- if (spec.hasDefault) {
523
- args.push(spec.defaultValue);
524
- }
525
- else if (spec.required) {
526
- throw new CommandParamsError(`缺少参数:${spec.name}`, usage);
527
- }
528
- else {
529
- args.push(undefined);
530
- }
531
- continue;
532
- }
533
- const remaining = tokens.length - index;
534
- const value = remaining === 1 ? token.value : input.slice(token.start).trim();
535
- args.push(value);
536
- index = tokens.length;
537
- continue;
538
- }
539
- const token = tokens[index];
540
- if (!token) {
541
- if (spec.hasDefault) {
542
- args.push(spec.defaultValue);
543
- }
544
- else if (spec.required) {
545
- throw new CommandParamsError(`缺少参数:${spec.name}`, usage);
546
- }
547
- else {
548
- args.push(undefined);
549
- }
550
- continue;
551
- }
552
- index += 1;
553
- args.push(parseValue(spec, token.value, usage));
554
- }
555
- while (args.length > 0 && args[args.length - 1] === undefined) {
556
- args.pop();
557
- }
558
- const ignored = index < tokens.length
559
- ? tokens.slice(index).map((token) => token.value)
560
- : [];
561
- return { args, ignored };
562
- }
563
- export function compileCommandParams(declaration) {
564
- const trimmed = declaration.trim();
565
- if (!trimmed) {
566
- throw declarationError('参数声明不能为空');
567
- }
568
- const specs = splitDeclaration(trimmed).map(parseToken);
569
- if (specs.length === 0) {
570
- throw declarationError('参数声明不能为空');
571
- }
572
- validateSpecs(specs);
573
- const usage = usageOf(specs);
574
- return {
575
- usage,
576
- parse(input, event) {
577
- return parseInput(specs, input, usage, quoteIdOf(event));
578
- },
579
- };
580
- }
1
+ export { CommandParamsError, } from './params/types.js';
2
+ export { compileCommandParams } from './params/compile.js';
581
3
  //# sourceMappingURL=command-params.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"command-params.js","sourceRoot":"","sources":["../../../src/core/plugin/command-params.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"command-params.js","sourceRoot":"","sources":["../../../src/core/plugin/command-params.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,kBAAkB,GAIrB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA"}
@@ -0,0 +1,7 @@
1
+ export declare const CORE_PACKAGE_NAME = "@jsbot-tellus/core";
2
+ export declare function packageDirectoryName(name: string): string;
3
+ export declare function corePackageRoot(): string;
4
+ export declare function ensureCoreLink(dir: string): Promise<void>;
5
+ export declare function pathExists(path: string): Promise<boolean>;
6
+ export declare function ensureInstallRoot(root: string): Promise<void>;
7
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../../../src/core/plugin/install/paths.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,iBAAiB,uBAAuB,CAAA;AAErD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,eAAe,IAAI,MAAM,CAsBxC;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqB/D;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE/D;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQnE"}
@@ -0,0 +1,49 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { mkdir, realpath, rm, stat, symlink, writeFile } from 'node:fs/promises';
3
+ import { dirname, join } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { VALIDATE_SCRIPT, VALIDATE_SCRIPT_FILE } from './validate-script.js';
6
+ export const CORE_PACKAGE_NAME = '@jsbot-tellus/core';
7
+ export function packageDirectoryName(name) {
8
+ return name.startsWith('@') ? name.replace('/', '__') : name;
9
+ }
10
+ export function corePackageRoot() {
11
+ let current = dirname(fileURLToPath(import.meta.url));
12
+ for (;;) {
13
+ try {
14
+ const manifest = JSON.parse(readFileSync(join(current, 'package.json'), 'utf8'));
15
+ if (manifest['name'] === CORE_PACKAGE_NAME)
16
+ return current;
17
+ }
18
+ catch {
19
+ // keep walking up
20
+ }
21
+ const parent = dirname(current);
22
+ if (parent === current) {
23
+ throw new Error(`cannot locate ${CORE_PACKAGE_NAME} package root`);
24
+ }
25
+ current = parent;
26
+ }
27
+ }
28
+ export async function ensureCoreLink(dir) {
29
+ const target = corePackageRoot();
30
+ const link = join(dir, 'node_modules', '@jsbot-tellus', 'core');
31
+ await mkdir(dirname(link), { recursive: true });
32
+ const existing = await realpath(link).catch(() => null);
33
+ if (existing !== null) {
34
+ const resolvedTarget = await realpath(target).catch(() => target);
35
+ if (existing === resolvedTarget)
36
+ return;
37
+ await rm(link, { recursive: true, force: true });
38
+ }
39
+ await symlink(target, link, process.platform === 'win32' ? 'junction' : 'dir');
40
+ }
41
+ export async function pathExists(path) {
42
+ return (await stat(path).catch(() => null)) !== null;
43
+ }
44
+ export async function ensureInstallRoot(root) {
45
+ await mkdir(root, { recursive: true });
46
+ await mkdir(join(root, '.jsbot'), { recursive: true });
47
+ await writeFile(join(root, '.jsbot', VALIDATE_SCRIPT_FILE), VALIDATE_SCRIPT, 'utf8');
48
+ }
49
+ //# sourceMappingURL=paths.js.map