@xopcai/xopc 0.0.109 → 0.0.110
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/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/feishu/src/pairing-config-resolver.d.ts +1 -0
- package/dist/extensions/feishu/src/pairing-config-resolver.js +30 -0
- package/dist/extensions/feishu/src/pairing-config-resolver.js.map +1 -0
- package/dist/extensions/feishu/src/plugin.d.ts +1 -0
- package/dist/extensions/feishu/src/plugin.js +1 -0
- package/dist/extensions/feishu/src/plugin.js.map +1 -1
- package/dist/extensions/telegram/src/access-control.d.ts +2 -1
- package/dist/extensions/telegram/src/access-control.js.map +1 -1
- package/dist/extensions/telegram/src/account-manager.d.ts +2 -1
- package/dist/extensions/telegram/src/account-manager.js.map +1 -1
- package/dist/extensions/telegram/src/adapters/gateway-setup.js +26 -26
- package/dist/extensions/telegram/src/adapters/gateway-setup.js.map +1 -1
- package/dist/extensions/telegram/src/adapters/onboard-cli.js +8 -4
- package/dist/extensions/telegram/src/adapters/onboard-cli.js.map +1 -1
- package/dist/extensions/telegram/src/config-schema.d.ts +88 -50
- package/dist/extensions/telegram/src/config-schema.js +40 -32
- package/dist/extensions/telegram/src/config-schema.js.map +1 -1
- package/dist/extensions/telegram/src/config-types.d.ts +54 -0
- package/dist/extensions/telegram/src/config-types.js +1 -0
- package/dist/extensions/telegram/src/doctor.js +17 -16
- package/dist/extensions/telegram/src/doctor.js.map +1 -1
- package/dist/extensions/telegram/src/exec-approvals.js +2 -3
- package/dist/extensions/telegram/src/exec-approvals.js.map +1 -1
- package/dist/extensions/telegram/src/group-config-resolver.d.ts +1 -1
- package/dist/extensions/telegram/src/group-config-resolver.js.map +1 -1
- package/dist/extensions/telegram/src/pairing-config-resolver.d.ts +1 -0
- package/dist/extensions/telegram/src/pairing-config-resolver.js +56 -0
- package/dist/extensions/telegram/src/pairing-config-resolver.js.map +1 -0
- package/dist/extensions/telegram/src/plugin.d.ts +1 -0
- package/dist/extensions/telegram/src/plugin.js +8 -9
- package/dist/extensions/telegram/src/plugin.js.map +1 -1
- package/dist/extensions/telegram/xopc.extension.json +156 -122
- package/dist/extensions/weixin/src/pairing-config-resolver.d.ts +1 -0
- package/dist/extensions/weixin/src/pairing-config-resolver.js +54 -0
- package/dist/extensions/weixin/src/pairing-config-resolver.js.map +1 -0
- package/dist/extensions/weixin/src/plugin.d.ts +1 -0
- package/dist/extensions/weixin/src/plugin.js +1 -0
- package/dist/extensions/weixin/src/plugin.js.map +1 -1
- package/dist/gateway/static/root/assets/{agents-D2VtykeA.js → agents-CFFioJCI.js} +1 -1
- package/dist/gateway/static/root/assets/{apps-page-BPQ6ueG-.js → apps-page-BYDmkbzG.js} +1 -1
- package/dist/gateway/static/root/assets/{channels-settings-DgZc25cS.js → channels-settings-CsbDaMvd.js} +1 -1
- package/dist/gateway/static/root/assets/{cron-page-BQFw5O-8.js → cron-page-Apk-7p4p.js} +1 -1
- package/dist/gateway/static/root/assets/{dist-BLMShn4_.js → dist-DmGDgpy2.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-BbQ8uZY_.js → extension-debug-page-pxFC-tUa.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-DNcTendk.js → extension-page-W1wiG38F.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-ClWJvwHK.js → extension-settings-page-COXSv6xP.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-config-api-4O1U_Oki.js → heartbeat-config-api-DcmAMYmN.js} +1 -1
- package/dist/gateway/static/root/assets/{index-S23p3aa0.js → index-C_2yKRJX.js} +3 -3
- package/dist/gateway/static/root/assets/{logs-page-BAIdbvSC.js → logs-page-DvTWUOzd.js} +1 -1
- package/dist/gateway/static/root/assets/{note-detail-page-BVDoLwec.js → note-detail-page-CZbdugWZ.js} +1 -1
- package/dist/gateway/static/root/assets/{note-time-COWUfBZO.js → note-time-RdyBZxj3.js} +1 -1
- package/dist/gateway/static/root/assets/{notes-page-CI3aD7Tm.js → notes-page-mEAwy3e1.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-CDpBshDP.js → schema-form-DEvdni_r.js} +1 -1
- package/dist/gateway/static/root/assets/{sessions-page-DM1S4eso.js → sessions-page-BsgffzV4.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-advanced-gate-Bz_nYzvB.js → settings-advanced-gate-t6v8Dwb8.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-BxhPoWWH.js → settings-form-section-BoYYZmJG.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-Ch_Sd28M.js → settings-page-ClIthYF8.js} +1 -1
- package/dist/gateway/static/root/assets/{share-preview-page-D6u4llqD.js → share-preview-page-Dd9et7KD.js} +1 -1
- package/dist/gateway/static/root/assets/{skills-page-XMi76Nps.js → skills-page-DEXtxyfQ.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-api-key-field-CMt5Xc7_.js → voice-api-key-field-CNrKzQrf.js} +1 -1
- package/dist/gateway/static/root/assets/{workflow-page.utils-BcZQmKBX.js → workflow-page.utils-EYg_xBQS.js} +1 -1
- package/dist/gateway/static/root/assets/{workflows-page-CxFbPBed.js → workflows-page-EMZkzJNN.js} +1 -1
- package/dist/gateway/static/root/index.html +1 -1
- package/dist/package.js +1 -1
- package/dist/src/channels/channel-domain.d.ts +1 -81
- package/dist/src/channels/pairing/index.d.ts +2 -2
- package/dist/src/channels/pairing/index.js +2 -2
- package/dist/src/channels/pairing/pairing-service.d.ts +13 -0
- package/dist/src/channels/pairing/pairing-service.js +78 -63
- package/dist/src/channels/pairing/pairing-service.js.map +1 -1
- package/dist/src/chat-commands/builtins/config.js +4 -11
- package/dist/src/chat-commands/builtins/config.js.map +1 -1
- package/dist/src/config/schema.js +9 -14
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/gateway/service.js +1 -1
- package/package.json +1 -1
|
@@ -64,6 +64,44 @@ export declare const TelegramThreadBindingsConfigSchema: z.ZodObject<{
|
|
|
64
64
|
idleTimeoutMs: z.ZodOptional<z.ZodNumber>;
|
|
65
65
|
maxAgeMs: z.ZodOptional<z.ZodNumber>;
|
|
66
66
|
}, z.core.$strict>;
|
|
67
|
+
export declare const TelegramAccountDefaultsConfigSchema: z.ZodObject<{
|
|
68
|
+
dmPolicy: z.ZodDefault<z.ZodEnum<{
|
|
69
|
+
pairing: "pairing";
|
|
70
|
+
allowlist: "allowlist";
|
|
71
|
+
open: "open";
|
|
72
|
+
disabled: "disabled";
|
|
73
|
+
}>>;
|
|
74
|
+
groupPolicy: z.ZodDefault<z.ZodEnum<{
|
|
75
|
+
allowlist: "allowlist";
|
|
76
|
+
open: "open";
|
|
77
|
+
disabled: "disabled";
|
|
78
|
+
}>>;
|
|
79
|
+
replyToMode: z.ZodDefault<z.ZodEnum<{
|
|
80
|
+
off: "off";
|
|
81
|
+
first: "first";
|
|
82
|
+
all: "all";
|
|
83
|
+
}>>;
|
|
84
|
+
historyLimit: z.ZodDefault<z.ZodNumber>;
|
|
85
|
+
textChunkLimit: z.ZodDefault<z.ZodNumber>;
|
|
86
|
+
streaming: z.ZodDefault<z.ZodObject<{
|
|
87
|
+
mode: z.ZodDefault<z.ZodEnum<{
|
|
88
|
+
off: "off";
|
|
89
|
+
partial: "partial";
|
|
90
|
+
block: "block";
|
|
91
|
+
}>>;
|
|
92
|
+
preview: z.ZodOptional<z.ZodObject<{
|
|
93
|
+
toolProgress: z.ZodDefault<z.ZodBoolean>;
|
|
94
|
+
}, z.core.$strict>>;
|
|
95
|
+
block: z.ZodOptional<z.ZodObject<{
|
|
96
|
+
coalesce: z.ZodOptional<z.ZodObject<{
|
|
97
|
+
minChars: z.ZodDefault<z.ZodNumber>;
|
|
98
|
+
idleMs: z.ZodDefault<z.ZodNumber>;
|
|
99
|
+
}, z.core.$strict>>;
|
|
100
|
+
}, z.core.$strict>>;
|
|
101
|
+
}, z.core.$strict>>;
|
|
102
|
+
proxy: z.ZodOptional<z.ZodString>;
|
|
103
|
+
apiRoot: z.ZodOptional<z.ZodString>;
|
|
104
|
+
}, z.core.$strict>;
|
|
67
105
|
export declare const TelegramAccountConfigSchema: z.ZodObject<{
|
|
68
106
|
accountId: z.ZodOptional<z.ZodString>;
|
|
69
107
|
name: z.ZodOptional<z.ZodString>;
|
|
@@ -71,19 +109,19 @@ export declare const TelegramAccountConfigSchema: z.ZodObject<{
|
|
|
71
109
|
botToken: z.ZodDefault<z.ZodString>;
|
|
72
110
|
tokenFile: z.ZodOptional<z.ZodString>;
|
|
73
111
|
allowFrom: z.ZodDefault<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
|
|
74
|
-
groupAllowFrom: z.
|
|
75
|
-
dmPolicy: z.
|
|
112
|
+
groupAllowFrom: z.ZodDefault<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
|
|
113
|
+
dmPolicy: z.ZodOptional<z.ZodEnum<{
|
|
76
114
|
pairing: "pairing";
|
|
77
115
|
allowlist: "allowlist";
|
|
78
116
|
open: "open";
|
|
79
117
|
disabled: "disabled";
|
|
80
118
|
}>>;
|
|
81
|
-
groupPolicy: z.
|
|
119
|
+
groupPolicy: z.ZodOptional<z.ZodEnum<{
|
|
82
120
|
allowlist: "allowlist";
|
|
83
121
|
open: "open";
|
|
84
122
|
disabled: "disabled";
|
|
85
123
|
}>>;
|
|
86
|
-
replyToMode: z.
|
|
124
|
+
replyToMode: z.ZodOptional<z.ZodEnum<{
|
|
87
125
|
off: "off";
|
|
88
126
|
first: "first";
|
|
89
127
|
all: "all";
|
|
@@ -104,8 +142,8 @@ export declare const TelegramAccountConfigSchema: z.ZodObject<{
|
|
|
104
142
|
agentId: z.ZodOptional<z.ZodString>;
|
|
105
143
|
}, z.core.$strict>>>;
|
|
106
144
|
}, z.core.$strict>>>;
|
|
107
|
-
historyLimit: z.
|
|
108
|
-
textChunkLimit: z.
|
|
145
|
+
historyLimit: z.ZodOptional<z.ZodNumber>;
|
|
146
|
+
textChunkLimit: z.ZodOptional<z.ZodNumber>;
|
|
109
147
|
streaming: z.ZodOptional<z.ZodObject<{
|
|
110
148
|
mode: z.ZodDefault<z.ZodEnum<{
|
|
111
149
|
off: "off";
|
|
@@ -158,10 +196,45 @@ export declare const TelegramAccountConfigSchema: z.ZodObject<{
|
|
|
158
196
|
}, z.core.$strict>;
|
|
159
197
|
export declare const TelegramConfigSchema: z.ZodObject<{
|
|
160
198
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
161
|
-
allowFrom: z.ZodDefault<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
|
|
162
|
-
groupAllowFrom: z.ZodDefault<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
|
|
163
|
-
apiRoot: z.ZodOptional<z.ZodString>;
|
|
164
199
|
debug: z.ZodDefault<z.ZodBoolean>;
|
|
200
|
+
defaults: z.ZodDefault<z.ZodObject<{
|
|
201
|
+
dmPolicy: z.ZodDefault<z.ZodEnum<{
|
|
202
|
+
pairing: "pairing";
|
|
203
|
+
allowlist: "allowlist";
|
|
204
|
+
open: "open";
|
|
205
|
+
disabled: "disabled";
|
|
206
|
+
}>>;
|
|
207
|
+
groupPolicy: z.ZodDefault<z.ZodEnum<{
|
|
208
|
+
allowlist: "allowlist";
|
|
209
|
+
open: "open";
|
|
210
|
+
disabled: "disabled";
|
|
211
|
+
}>>;
|
|
212
|
+
replyToMode: z.ZodDefault<z.ZodEnum<{
|
|
213
|
+
off: "off";
|
|
214
|
+
first: "first";
|
|
215
|
+
all: "all";
|
|
216
|
+
}>>;
|
|
217
|
+
historyLimit: z.ZodDefault<z.ZodNumber>;
|
|
218
|
+
textChunkLimit: z.ZodDefault<z.ZodNumber>;
|
|
219
|
+
streaming: z.ZodDefault<z.ZodObject<{
|
|
220
|
+
mode: z.ZodDefault<z.ZodEnum<{
|
|
221
|
+
off: "off";
|
|
222
|
+
partial: "partial";
|
|
223
|
+
block: "block";
|
|
224
|
+
}>>;
|
|
225
|
+
preview: z.ZodOptional<z.ZodObject<{
|
|
226
|
+
toolProgress: z.ZodDefault<z.ZodBoolean>;
|
|
227
|
+
}, z.core.$strict>>;
|
|
228
|
+
block: z.ZodOptional<z.ZodObject<{
|
|
229
|
+
coalesce: z.ZodOptional<z.ZodObject<{
|
|
230
|
+
minChars: z.ZodDefault<z.ZodNumber>;
|
|
231
|
+
idleMs: z.ZodDefault<z.ZodNumber>;
|
|
232
|
+
}, z.core.$strict>>;
|
|
233
|
+
}, z.core.$strict>>;
|
|
234
|
+
}, z.core.$strict>>;
|
|
235
|
+
proxy: z.ZodOptional<z.ZodString>;
|
|
236
|
+
apiRoot: z.ZodOptional<z.ZodString>;
|
|
237
|
+
}, z.core.$strict>>;
|
|
165
238
|
accounts: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
166
239
|
accountId: z.ZodOptional<z.ZodString>;
|
|
167
240
|
name: z.ZodOptional<z.ZodString>;
|
|
@@ -169,19 +242,19 @@ export declare const TelegramConfigSchema: z.ZodObject<{
|
|
|
169
242
|
botToken: z.ZodDefault<z.ZodString>;
|
|
170
243
|
tokenFile: z.ZodOptional<z.ZodString>;
|
|
171
244
|
allowFrom: z.ZodDefault<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
|
|
172
|
-
groupAllowFrom: z.
|
|
173
|
-
dmPolicy: z.
|
|
245
|
+
groupAllowFrom: z.ZodDefault<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
|
|
246
|
+
dmPolicy: z.ZodOptional<z.ZodEnum<{
|
|
174
247
|
pairing: "pairing";
|
|
175
248
|
allowlist: "allowlist";
|
|
176
249
|
open: "open";
|
|
177
250
|
disabled: "disabled";
|
|
178
251
|
}>>;
|
|
179
|
-
groupPolicy: z.
|
|
252
|
+
groupPolicy: z.ZodOptional<z.ZodEnum<{
|
|
180
253
|
allowlist: "allowlist";
|
|
181
254
|
open: "open";
|
|
182
255
|
disabled: "disabled";
|
|
183
256
|
}>>;
|
|
184
|
-
replyToMode: z.
|
|
257
|
+
replyToMode: z.ZodOptional<z.ZodEnum<{
|
|
185
258
|
off: "off";
|
|
186
259
|
first: "first";
|
|
187
260
|
all: "all";
|
|
@@ -202,8 +275,8 @@ export declare const TelegramConfigSchema: z.ZodObject<{
|
|
|
202
275
|
agentId: z.ZodOptional<z.ZodString>;
|
|
203
276
|
}, z.core.$strict>>>;
|
|
204
277
|
}, z.core.$strict>>>;
|
|
205
|
-
historyLimit: z.
|
|
206
|
-
textChunkLimit: z.
|
|
278
|
+
historyLimit: z.ZodOptional<z.ZodNumber>;
|
|
279
|
+
textChunkLimit: z.ZodOptional<z.ZodNumber>;
|
|
207
280
|
streaming: z.ZodOptional<z.ZodObject<{
|
|
208
281
|
mode: z.ZodDefault<z.ZodEnum<{
|
|
209
282
|
off: "off";
|
|
@@ -254,41 +327,6 @@ export declare const TelegramConfigSchema: z.ZodObject<{
|
|
|
254
327
|
maxAgeMs: z.ZodOptional<z.ZodNumber>;
|
|
255
328
|
}, z.core.$strict>>;
|
|
256
329
|
}, z.core.$strict>>>;
|
|
257
|
-
dmPolicy: z.ZodDefault<z.ZodEnum<{
|
|
258
|
-
pairing: "pairing";
|
|
259
|
-
allowlist: "allowlist";
|
|
260
|
-
open: "open";
|
|
261
|
-
disabled: "disabled";
|
|
262
|
-
}>>;
|
|
263
|
-
groupPolicy: z.ZodDefault<z.ZodEnum<{
|
|
264
|
-
allowlist: "allowlist";
|
|
265
|
-
open: "open";
|
|
266
|
-
disabled: "disabled";
|
|
267
|
-
}>>;
|
|
268
|
-
replyToMode: z.ZodDefault<z.ZodEnum<{
|
|
269
|
-
off: "off";
|
|
270
|
-
first: "first";
|
|
271
|
-
all: "all";
|
|
272
|
-
}>>;
|
|
273
|
-
streaming: z.ZodOptional<z.ZodObject<{
|
|
274
|
-
mode: z.ZodDefault<z.ZodEnum<{
|
|
275
|
-
off: "off";
|
|
276
|
-
partial: "partial";
|
|
277
|
-
block: "block";
|
|
278
|
-
}>>;
|
|
279
|
-
preview: z.ZodOptional<z.ZodObject<{
|
|
280
|
-
toolProgress: z.ZodDefault<z.ZodBoolean>;
|
|
281
|
-
}, z.core.$strict>>;
|
|
282
|
-
block: z.ZodOptional<z.ZodObject<{
|
|
283
|
-
coalesce: z.ZodOptional<z.ZodObject<{
|
|
284
|
-
minChars: z.ZodDefault<z.ZodNumber>;
|
|
285
|
-
idleMs: z.ZodDefault<z.ZodNumber>;
|
|
286
|
-
}, z.core.$strict>>;
|
|
287
|
-
}, z.core.$strict>>;
|
|
288
|
-
}, z.core.$strict>>;
|
|
289
|
-
historyLimit: z.ZodDefault<z.ZodNumber>;
|
|
290
|
-
textChunkLimit: z.ZodDefault<z.ZodNumber>;
|
|
291
|
-
proxy: z.ZodOptional<z.ZodString>;
|
|
292
330
|
}, z.core.$strict>;
|
|
293
331
|
export type TelegramConfig = z.infer<typeof TelegramConfigSchema>;
|
|
294
332
|
export type TelegramStreamingConfig = z.infer<typeof TelegramStreamingConfigSchema>;
|
|
@@ -5,7 +5,7 @@ import { z } from "zod";
|
|
|
5
5
|
function resolveTelegramStreamingMode(account) {
|
|
6
6
|
return account.streaming?.mode ?? "partial";
|
|
7
7
|
}
|
|
8
|
-
var TelegramStreamingBlockCoalesceSchema, TelegramStreamingPreviewSchema, TelegramStreamingConfigSchema, TelegramTopicConfigSchema, TelegramGroupConfigSchema, TelegramActionsConfigSchema, TelegramExecApprovalsConfigSchema, TelegramThreadBindingsConfigSchema, TelegramAccountConfigSchema, TelegramConfigSchema;
|
|
8
|
+
var TelegramStreamingBlockCoalesceSchema, TelegramStreamingPreviewSchema, TelegramStreamingConfigSchema, TelegramTopicConfigSchema, TelegramGroupConfigSchema, TelegramActionsConfigSchema, TelegramExecApprovalsConfigSchema, TelegramThreadBindingsConfigSchema, TelegramAccountDefaultsConfigSchema, TelegramAccountConfigSchema, TelegramConfigSchema;
|
|
9
9
|
var init_config_schema = __esmMin((() => {
|
|
10
10
|
TelegramStreamingBlockCoalesceSchema = z.object({
|
|
11
11
|
minChars: z.number().default(800),
|
|
@@ -56,6 +56,29 @@ var init_config_schema = __esmMin((() => {
|
|
|
56
56
|
idleTimeoutMs: z.number().optional(),
|
|
57
57
|
maxAgeMs: z.number().optional()
|
|
58
58
|
}).strict();
|
|
59
|
+
TelegramAccountDefaultsConfigSchema = z.object({
|
|
60
|
+
dmPolicy: z.enum([
|
|
61
|
+
"pairing",
|
|
62
|
+
"allowlist",
|
|
63
|
+
"open",
|
|
64
|
+
"disabled"
|
|
65
|
+
]).default("pairing"),
|
|
66
|
+
groupPolicy: z.enum([
|
|
67
|
+
"open",
|
|
68
|
+
"disabled",
|
|
69
|
+
"allowlist"
|
|
70
|
+
]).default("open"),
|
|
71
|
+
replyToMode: z.enum([
|
|
72
|
+
"off",
|
|
73
|
+
"first",
|
|
74
|
+
"all"
|
|
75
|
+
]).default("off"),
|
|
76
|
+
historyLimit: z.number().default(50),
|
|
77
|
+
textChunkLimit: z.number().default(4e3),
|
|
78
|
+
streaming: TelegramStreamingConfigSchema.default({ mode: "partial" }),
|
|
79
|
+
proxy: z.string().optional(),
|
|
80
|
+
apiRoot: z.string().optional()
|
|
81
|
+
}).strict();
|
|
59
82
|
TelegramAccountConfigSchema = z.object({
|
|
60
83
|
accountId: z.string().optional(),
|
|
61
84
|
name: z.string().optional(),
|
|
@@ -63,26 +86,26 @@ var init_config_schema = __esmMin((() => {
|
|
|
63
86
|
botToken: z.string().default(""),
|
|
64
87
|
tokenFile: z.string().optional(),
|
|
65
88
|
allowFrom: z.array(z.union([z.string(), z.number()])).default([]),
|
|
66
|
-
groupAllowFrom: z.array(z.union([z.string(), z.number()])).
|
|
89
|
+
groupAllowFrom: z.array(z.union([z.string(), z.number()])).default([]),
|
|
67
90
|
dmPolicy: z.enum([
|
|
68
91
|
"pairing",
|
|
69
92
|
"allowlist",
|
|
70
93
|
"open",
|
|
71
94
|
"disabled"
|
|
72
|
-
]).
|
|
95
|
+
]).optional(),
|
|
73
96
|
groupPolicy: z.enum([
|
|
74
97
|
"open",
|
|
75
98
|
"disabled",
|
|
76
99
|
"allowlist"
|
|
77
|
-
]).
|
|
100
|
+
]).optional(),
|
|
78
101
|
replyToMode: z.enum([
|
|
79
102
|
"off",
|
|
80
103
|
"first",
|
|
81
104
|
"all"
|
|
82
|
-
]).
|
|
105
|
+
]).optional(),
|
|
83
106
|
groups: z.record(z.string(), TelegramGroupConfigSchema).optional(),
|
|
84
|
-
historyLimit: z.number().
|
|
85
|
-
textChunkLimit: z.number().
|
|
107
|
+
historyLimit: z.number().optional(),
|
|
108
|
+
textChunkLimit: z.number().optional(),
|
|
86
109
|
streaming: TelegramStreamingConfigSchema.optional(),
|
|
87
110
|
proxy: z.string().optional(),
|
|
88
111
|
apiRoot: z.string().optional(),
|
|
@@ -105,35 +128,20 @@ var init_config_schema = __esmMin((() => {
|
|
|
105
128
|
}).strict();
|
|
106
129
|
TelegramConfigSchema = z.object({
|
|
107
130
|
enabled: z.boolean().default(false),
|
|
108
|
-
allowFrom: z.array(z.union([z.string(), z.number()])).default([]),
|
|
109
|
-
groupAllowFrom: z.array(z.union([z.string(), z.number()])).default([]),
|
|
110
|
-
apiRoot: z.string().optional(),
|
|
111
131
|
debug: z.boolean().default(false),
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
"
|
|
115
|
-
"
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
"disabled",
|
|
122
|
-
"allowlist"
|
|
123
|
-
]).default("open"),
|
|
124
|
-
replyToMode: z.enum([
|
|
125
|
-
"off",
|
|
126
|
-
"first",
|
|
127
|
-
"all"
|
|
128
|
-
]).default("off"),
|
|
129
|
-
streaming: TelegramStreamingConfigSchema.optional(),
|
|
130
|
-
historyLimit: z.number().default(50),
|
|
131
|
-
textChunkLimit: z.number().default(4e3),
|
|
132
|
-
proxy: z.string().optional()
|
|
132
|
+
defaults: TelegramAccountDefaultsConfigSchema.default({
|
|
133
|
+
dmPolicy: "pairing",
|
|
134
|
+
groupPolicy: "open",
|
|
135
|
+
replyToMode: "off",
|
|
136
|
+
historyLimit: 50,
|
|
137
|
+
textChunkLimit: 4e3,
|
|
138
|
+
streaming: { mode: "partial" }
|
|
139
|
+
}),
|
|
140
|
+
accounts: z.record(z.string(), TelegramAccountConfigSchema).optional()
|
|
133
141
|
}).strict();
|
|
134
142
|
}));
|
|
135
143
|
//#endregion
|
|
136
144
|
init_config_schema();
|
|
137
|
-
export { TelegramAccountConfigSchema, TelegramActionsConfigSchema, TelegramConfigSchema, TelegramExecApprovalsConfigSchema, TelegramGroupConfigSchema, TelegramStreamingBlockCoalesceSchema, TelegramStreamingConfigSchema, TelegramStreamingPreviewSchema, TelegramThreadBindingsConfigSchema, TelegramTopicConfigSchema, init_config_schema, resolveTelegramStreamingMode };
|
|
145
|
+
export { TelegramAccountConfigSchema, TelegramAccountDefaultsConfigSchema, TelegramActionsConfigSchema, TelegramConfigSchema, TelegramExecApprovalsConfigSchema, TelegramGroupConfigSchema, TelegramStreamingBlockCoalesceSchema, TelegramStreamingConfigSchema, TelegramStreamingPreviewSchema, TelegramThreadBindingsConfigSchema, TelegramTopicConfigSchema, init_config_schema, resolveTelegramStreamingMode };
|
|
138
146
|
|
|
139
147
|
//# sourceMappingURL=config-schema.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-schema.js","names":[],"sources":["../../../../extensions/telegram/src/config-schema.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const TelegramStreamingBlockCoalesceSchema = z.object({\n minChars: z.number().default(800),\n idleMs: z.number().default(1000),\n}).strict();\n\nexport const TelegramStreamingPreviewSchema = z.object({\n toolProgress: z.boolean().default(true),\n}).strict();\n\nexport const TelegramStreamingConfigSchema = z.object({\n mode: z.enum(['off', 'partial', 'block']).default('partial'),\n preview: TelegramStreamingPreviewSchema.optional(),\n block: z\n .object({\n coalesce: TelegramStreamingBlockCoalesceSchema.optional(),\n })\n .strict()\n .optional(),\n}).strict();\n\nexport const TelegramTopicConfigSchema = z.object({\n topicId: z.string().optional(),\n requireMention: z.boolean().optional(),\n enabled: z.boolean().optional(),\n allowFrom: z.array(z.union([z.string(), z.number()])).optional(),\n systemPrompt: z.string().optional(),\n agentId: z.string().optional(),\n}).strict();\n\nexport const TelegramGroupConfigSchema = z.object({\n groupId: z.string().optional(),\n requireMention: z.boolean().optional(),\n enabled: z.boolean().optional(),\n allowFrom: z.array(z.union([z.string(), z.number()])).optional(),\n systemPrompt: z.string().optional(),\n agentId: z.string().optional(),\n topics: z.record(z.string(), TelegramTopicConfigSchema).optional(),\n}).strict();\n\nexport const TelegramActionsConfigSchema = z.object({\n reactions: z.boolean().default(true),\n sendMessage: z.boolean().default(true),\n editMessage: z.boolean().default(true),\n deleteMessage: z.boolean().default(false),\n poll: z.boolean().default(false),\n sticker: z.boolean().default(false),\n createForumTopic: z.boolean().default(false),\n}).strict();\n\nexport const TelegramExecApprovalsConfigSchema = z.object({\n enabled: z.boolean().default(false),\n approvers: z.array(z.union([z.string(), z.number()])).optional(),\n}).strict();\n\nexport const TelegramThreadBindingsConfigSchema = z.object({\n enabled: z.boolean().default(false),\n idleTimeoutMs: z.number().optional(),\n maxAgeMs: z.number().optional(),\n}).strict();\n\nexport const TelegramAccountConfigSchema = z.object({\n accountId: z.string().optional(),\n name: z.string().optional(),\n enabled: z.boolean().default(true),\n botToken: z.string().default(''),\n tokenFile: z.string().optional(),\n allowFrom: z.array(z.union([z.string(), z.number()])).default([]),\n groupAllowFrom: z.array(z.union([z.string(), z.number()])).
|
|
1
|
+
{"version":3,"file":"config-schema.js","names":[],"sources":["../../../../extensions/telegram/src/config-schema.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const TelegramStreamingBlockCoalesceSchema = z.object({\n minChars: z.number().default(800),\n idleMs: z.number().default(1000),\n}).strict();\n\nexport const TelegramStreamingPreviewSchema = z.object({\n toolProgress: z.boolean().default(true),\n}).strict();\n\nexport const TelegramStreamingConfigSchema = z.object({\n mode: z.enum(['off', 'partial', 'block']).default('partial'),\n preview: TelegramStreamingPreviewSchema.optional(),\n block: z\n .object({\n coalesce: TelegramStreamingBlockCoalesceSchema.optional(),\n })\n .strict()\n .optional(),\n}).strict();\n\nexport const TelegramTopicConfigSchema = z.object({\n topicId: z.string().optional(),\n requireMention: z.boolean().optional(),\n enabled: z.boolean().optional(),\n allowFrom: z.array(z.union([z.string(), z.number()])).optional(),\n systemPrompt: z.string().optional(),\n agentId: z.string().optional(),\n}).strict();\n\nexport const TelegramGroupConfigSchema = z.object({\n groupId: z.string().optional(),\n requireMention: z.boolean().optional(),\n enabled: z.boolean().optional(),\n allowFrom: z.array(z.union([z.string(), z.number()])).optional(),\n systemPrompt: z.string().optional(),\n agentId: z.string().optional(),\n topics: z.record(z.string(), TelegramTopicConfigSchema).optional(),\n}).strict();\n\nexport const TelegramActionsConfigSchema = z.object({\n reactions: z.boolean().default(true),\n sendMessage: z.boolean().default(true),\n editMessage: z.boolean().default(true),\n deleteMessage: z.boolean().default(false),\n poll: z.boolean().default(false),\n sticker: z.boolean().default(false),\n createForumTopic: z.boolean().default(false),\n}).strict();\n\nexport const TelegramExecApprovalsConfigSchema = z.object({\n enabled: z.boolean().default(false),\n approvers: z.array(z.union([z.string(), z.number()])).optional(),\n}).strict();\n\nexport const TelegramThreadBindingsConfigSchema = z.object({\n enabled: z.boolean().default(false),\n idleTimeoutMs: z.number().optional(),\n maxAgeMs: z.number().optional(),\n}).strict();\n\nexport const TelegramAccountDefaultsConfigSchema = z.object({\n dmPolicy: z.enum(['pairing', 'allowlist', 'open', 'disabled']).default('pairing'),\n groupPolicy: z.enum(['open', 'disabled', 'allowlist']).default('open'),\n replyToMode: z.enum(['off', 'first', 'all']).default('off'),\n historyLimit: z.number().default(50),\n textChunkLimit: z.number().default(4000),\n streaming: TelegramStreamingConfigSchema.default({ mode: 'partial' }),\n proxy: z.string().optional(),\n apiRoot: z.string().optional(),\n}).strict();\n\nexport const TelegramAccountConfigSchema = z.object({\n accountId: z.string().optional(),\n name: z.string().optional(),\n enabled: z.boolean().default(true),\n botToken: z.string().default(''),\n tokenFile: z.string().optional(),\n allowFrom: z.array(z.union([z.string(), z.number()])).default([]),\n groupAllowFrom: z.array(z.union([z.string(), z.number()])).default([]),\n dmPolicy: z.enum(['pairing', 'allowlist', 'open', 'disabled']).optional(),\n groupPolicy: z.enum(['open', 'disabled', 'allowlist']).optional(),\n replyToMode: z.enum(['off', 'first', 'all']).optional(),\n groups: z.record(z.string(), TelegramGroupConfigSchema).optional(),\n historyLimit: z.number().optional(),\n textChunkLimit: z.number().optional(),\n streaming: TelegramStreamingConfigSchema.optional(),\n proxy: z.string().optional(),\n apiRoot: z.string().optional(),\n pollingStallThresholdMs: z.number().min(30_000).max(600_000).optional(),\n reactionLevel: z.enum(['off', 'ack', 'minimal', 'extensive']).default('ack'),\n reactionNotifications: z.enum(['off', 'own', 'all']).default('own'),\n ackReaction: z.string().optional(),\n actions: TelegramActionsConfigSchema.optional(),\n execApprovals: TelegramExecApprovalsConfigSchema.optional(),\n threadBindings: TelegramThreadBindingsConfigSchema.optional(),\n}).strict();\n\nexport const TelegramConfigSchema = z.object({\n enabled: z.boolean().default(false),\n debug: z.boolean().default(false),\n defaults: TelegramAccountDefaultsConfigSchema.default({\n dmPolicy: 'pairing',\n groupPolicy: 'open',\n replyToMode: 'off',\n historyLimit: 50,\n textChunkLimit: 4000,\n streaming: { mode: 'partial' },\n }),\n accounts: z.record(z.string(), TelegramAccountConfigSchema).optional(),\n}).strict();\n\nexport type TelegramConfig = z.infer<typeof TelegramConfigSchema>;\nexport type TelegramStreamingConfig = z.infer<typeof TelegramStreamingConfigSchema>;\n\n/** Resolve effective streaming mode for an account. */\nexport function resolveTelegramStreamingMode(account: {\n streaming?: { mode?: 'off' | 'partial' | 'block' };\n}): 'off' | 'partial' | 'block' {\n return account.streaming?.mode ?? 'partial';\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { DmPolicy, GroupPolicy, ReplyToMode } from '@xopcai/xopc/channels/channel-domain.js';
|
|
2
|
+
export interface TelegramTopicConfig {
|
|
3
|
+
topicId?: string;
|
|
4
|
+
requireMention?: boolean;
|
|
5
|
+
enabled?: boolean;
|
|
6
|
+
allowFrom?: Array<string | number>;
|
|
7
|
+
systemPrompt?: string;
|
|
8
|
+
agentId?: string;
|
|
9
|
+
groupPolicy?: GroupPolicy;
|
|
10
|
+
}
|
|
11
|
+
export interface TelegramGroupConfig {
|
|
12
|
+
groupId?: string;
|
|
13
|
+
requireMention?: boolean;
|
|
14
|
+
groupPolicy?: GroupPolicy;
|
|
15
|
+
enabled?: boolean;
|
|
16
|
+
allowFrom?: Array<string | number>;
|
|
17
|
+
systemPrompt?: string;
|
|
18
|
+
agentId?: string;
|
|
19
|
+
topics?: Record<string, TelegramTopicConfig>;
|
|
20
|
+
}
|
|
21
|
+
export interface TelegramAccountConfig {
|
|
22
|
+
accountId: string;
|
|
23
|
+
name?: string;
|
|
24
|
+
enabled?: boolean;
|
|
25
|
+
botToken?: string;
|
|
26
|
+
tokenFile?: string;
|
|
27
|
+
dmPolicy?: DmPolicy;
|
|
28
|
+
groupPolicy?: GroupPolicy;
|
|
29
|
+
replyToMode?: ReplyToMode;
|
|
30
|
+
allowFrom?: Array<string | number>;
|
|
31
|
+
groupAllowFrom?: Array<string | number>;
|
|
32
|
+
groups?: Record<string, TelegramGroupConfig>;
|
|
33
|
+
historyLimit?: number;
|
|
34
|
+
textChunkLimit?: number;
|
|
35
|
+
streaming?: {
|
|
36
|
+
mode?: 'off' | 'partial' | 'block';
|
|
37
|
+
preview?: {
|
|
38
|
+
toolProgress?: boolean;
|
|
39
|
+
};
|
|
40
|
+
block?: {
|
|
41
|
+
coalesce?: {
|
|
42
|
+
minChars?: number;
|
|
43
|
+
idleMs?: number;
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
proxy?: string;
|
|
48
|
+
apiRoot?: string;
|
|
49
|
+
pollingStallThresholdMs?: number;
|
|
50
|
+
reactionLevel?: 'off' | 'ack' | 'minimal' | 'extensive';
|
|
51
|
+
reactionNotifications?: 'off' | 'own' | 'all';
|
|
52
|
+
ackReaction?: string;
|
|
53
|
+
tokenSource?: string;
|
|
54
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -58,7 +58,7 @@ async function checkGetMe(params) {
|
|
|
58
58
|
label: `Telegram getMe (${params.accountId})`,
|
|
59
59
|
status: isTelegramUnauthorizedTokenError(description) ? "fail" : "warn",
|
|
60
60
|
message: `getMe failed: ${description}`,
|
|
61
|
-
hints: isTelegramUnauthorizedTokenError(description) ? ["Verify the bot token from @BotFather."] : ["Check channels.telegram.apiRoot / account apiRoot and network access."]
|
|
61
|
+
hints: isTelegramUnauthorizedTokenError(description) ? ["Verify the bot token from @BotFather."] : ["Check channels.telegram.defaults.apiRoot / account apiRoot and network access."]
|
|
62
62
|
};
|
|
63
63
|
} catch (err) {
|
|
64
64
|
const message = formatGetMeError(err);
|
|
@@ -69,7 +69,7 @@ async function checkGetMe(params) {
|
|
|
69
69
|
message: `getMe network check failed: ${message}`,
|
|
70
70
|
hints: [
|
|
71
71
|
"Verify this host can reach the Telegram Bot API.",
|
|
72
|
-
"If your shell uses HTTP(S)_PROXY, also set channels.telegram.proxy because Node fetch does not use env proxy automatically.",
|
|
72
|
+
"If your shell uses HTTP(S)_PROXY, also set channels.telegram.defaults.proxy because Node fetch does not use env proxy automatically.",
|
|
73
73
|
`Effective apiRoot: ${apiRoot}`
|
|
74
74
|
]
|
|
75
75
|
};
|
|
@@ -81,22 +81,12 @@ async function runTelegramDoctorChecks(params) {
|
|
|
81
81
|
const results = [];
|
|
82
82
|
const tg = params.cfg.channels?.telegram;
|
|
83
83
|
if (!tg) return results;
|
|
84
|
-
if (tg.
|
|
85
|
-
const hasWildcard = (tg.allowFrom ?? []).some((e) => String(e).trim() === "*");
|
|
86
|
-
results.push({
|
|
87
|
-
id: "telegram-dm-open-wildcard",
|
|
88
|
-
label: "Telegram DM open policy",
|
|
89
|
-
status: hasWildcard ? "pass" : "warn",
|
|
90
|
-
message: hasWildcard ? "DM policy is open with allowFrom wildcard." : "dmPolicy \"open\" should include allowFrom: [\"*\"] for explicit opt-in.",
|
|
91
|
-
hints: hasWildcard ? [] : ["Add `\"allowFrom\": [\"*\"]` or switch to pairing/allowlist."]
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
if (hasTelegramBotEndpointApiRoot(tg.apiRoot)) results.push({
|
|
84
|
+
if (hasTelegramBotEndpointApiRoot(tg.defaults?.apiRoot)) results.push({
|
|
95
85
|
id: "telegram-api-root-bot-endpoint",
|
|
96
86
|
label: "Telegram apiRoot",
|
|
97
87
|
status: "warn",
|
|
98
88
|
message: "apiRoot includes a bot token path segment; it will be normalized to the API root.",
|
|
99
|
-
hints: [`Use "${normalizeTelegramApiRoot(tg.apiRoot)}" instead.`]
|
|
89
|
+
hints: [`Use "${normalizeTelegramApiRoot(tg.defaults?.apiRoot)}" instead.`]
|
|
100
90
|
});
|
|
101
91
|
const tokenMap = collectTokens(tg);
|
|
102
92
|
for (const [token, accountIds] of tokenMap) if (accountIds.length > 1) results.push({
|
|
@@ -107,6 +97,17 @@ async function runTelegramDoctorChecks(params) {
|
|
|
107
97
|
hints: ["Use one token per account or disable duplicate accounts."]
|
|
108
98
|
});
|
|
109
99
|
for (const [id, acc] of Object.entries(tg.accounts ?? {})) {
|
|
100
|
+
const effectiveDmPolicy = acc.dmPolicy ?? tg.defaults?.dmPolicy ?? "pairing";
|
|
101
|
+
if (tg.enabled && effectiveDmPolicy === "open") {
|
|
102
|
+
const hasWildcard = (acc.allowFrom ?? []).some((e) => String(e).trim() === "*");
|
|
103
|
+
results.push({
|
|
104
|
+
id: `telegram-dm-open-wildcard-${id}`,
|
|
105
|
+
label: `Telegram DM open policy (${id})`,
|
|
106
|
+
status: hasWildcard ? "pass" : "warn",
|
|
107
|
+
message: hasWildcard ? `Account "${id}" DM policy is open with allowFrom wildcard.` : `Account "${id}" dmPolicy "open" should include allowFrom: ["*"] for explicit opt-in.`,
|
|
108
|
+
hints: hasWildcard ? [] : [`Add "allowFrom": ["*"] to channels.telegram.accounts.${id} or switch to pairing/allowlist.`]
|
|
109
|
+
});
|
|
110
|
+
}
|
|
110
111
|
if (hasTelegramBotEndpointApiRoot(acc.apiRoot)) results.push({
|
|
111
112
|
id: `telegram-account-api-root-${id}`,
|
|
112
113
|
label: `Telegram apiRoot (${id})`,
|
|
@@ -135,8 +136,8 @@ async function runTelegramDoctorChecks(params) {
|
|
|
135
136
|
if (tg.enabled && token && acc.enabled !== false) results.push(await checkGetMe({
|
|
136
137
|
accountId: id,
|
|
137
138
|
token,
|
|
138
|
-
apiRoot: acc.apiRoot || tg.apiRoot,
|
|
139
|
-
proxy: acc.proxy || tg.proxy,
|
|
139
|
+
apiRoot: acc.apiRoot || tg.defaults?.apiRoot,
|
|
140
|
+
proxy: acc.proxy || tg.defaults?.proxy,
|
|
140
141
|
fetchImpl: params.fetchImpl
|
|
141
142
|
}));
|
|
142
143
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","names":[],"sources":["../../../../extensions/telegram/src/doctor.ts"],"sourcesContent":["import type { Config } from '@xopcai/xopc/config/index.js';\nimport type { ChannelDoctorCheckResult } from '@xopcai/xopc/channels/plugin-types.js';\nimport { hasTelegramBotEndpointApiRoot, normalizeTelegramApiRoot } from './api-root.js';\nimport { createProxyFetch } from './proxy-fetch.js';\nimport { isTelegramUnauthorizedTokenError } from './startup-errors.js';\nimport { resolveTelegramBotToken } from './token-resolver.js';\n\nconst TELEGRAM_DOCTOR_GETME_TIMEOUT_MS = 10_000;\n\ntype TelegramCfg = {\n enabled?: boolean;\n dmPolicy?: string;\n allowFrom?: Array<string | number>;\n apiRoot?: string;\n proxy?: string;\n accounts?: Record<\n string,\n {\n enabled?: boolean;\n botToken?: string;\n tokenFile?: string;\n apiRoot?: string;\n proxy?: string;\n dmPolicy?: string;\n allowFrom?: Array<string | number>;\n }\n >;\n};\n\nfunction collectTokens(cfg: TelegramCfg): Map<string, string[]> {\n const map = new Map<string, string[]>();\n const accounts = cfg.accounts ?? {};\n for (const [id, acc] of Object.entries(accounts)) {\n const { token } = resolveTelegramBotToken({\n botToken: acc.botToken,\n tokenFile: acc.tokenFile,\n });\n if (!token) continue;\n const list = map.get(token) ?? [];\n list.push(id);\n map.set(token, list);\n }\n return map;\n}\n\nfunction formatGetMeError(err: unknown): string {\n if (err instanceof Error) return err.message;\n return String(err);\n}\n\nfunction createTimeoutSignal(timeoutMs: number): { signal: AbortSignal; dispose: () => void } {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(new Error(`Timed out after ${timeoutMs}ms`)), timeoutMs);\n timer.unref?.();\n return {\n signal: controller.signal,\n dispose: () => clearTimeout(timer),\n };\n}\n\nasync function checkGetMe(params: {\n accountId: string;\n token: string;\n apiRoot?: string;\n proxy?: string;\n fetchImpl?: typeof fetch;\n}): Promise<ChannelDoctorCheckResult> {\n const apiRoot = normalizeTelegramApiRoot(params.apiRoot);\n const url = `${apiRoot}/bot${params.token}/getMe`;\n const timeout = createTimeoutSignal(TELEGRAM_DOCTOR_GETME_TIMEOUT_MS);\n const fetchImpl = params.proxy ? createProxyFetch(params.proxy) : (params.fetchImpl ?? fetch);\n\n try {\n const startedAt = Date.now();\n const response = await fetchImpl(url, { signal: timeout.signal });\n const elapsedMs = Date.now() - startedAt;\n const body = (await response.json().catch(() => undefined)) as\n | { ok?: boolean; result?: { username?: string }; description?: string }\n | undefined;\n\n if (response.ok && body?.ok === true) {\n const username = body.result?.username ? ` @${body.result.username}` : '';\n return {\n id: `telegram-account-getme-${params.accountId}`,\n label: `Telegram getMe (${params.accountId})`,\n status: 'pass',\n message: `getMe succeeded${username} in ${elapsedMs}ms.`,\n hints: params.proxy ? [`Using proxy: ${params.proxy}`] : [],\n };\n }\n\n const description = body?.description || `HTTP ${response.status}`;\n return {\n id: `telegram-account-getme-${params.accountId}`,\n label: `Telegram getMe (${params.accountId})`,\n status: isTelegramUnauthorizedTokenError(description) ? 'fail' : 'warn',\n message: `getMe failed: ${description}`,\n hints: isTelegramUnauthorizedTokenError(description)\n ? ['Verify the bot token from @BotFather.']\n : ['Check channels.telegram.apiRoot / account apiRoot and network access.'],\n };\n } catch (err) {\n const message = formatGetMeError(err);\n return {\n id: `telegram-account-getme-${params.accountId}`,\n label: `Telegram getMe (${params.accountId})`,\n status: 'fail',\n message: `getMe network check failed: ${message}`,\n hints: [\n 'Verify this host can reach the Telegram Bot API.',\n 'If your shell uses HTTP(S)_PROXY, also set channels.telegram.proxy because Node fetch does not use env proxy automatically.',\n `Effective apiRoot: ${apiRoot}`,\n ],\n };\n } finally {\n timeout.dispose();\n }\n}\n\nexport async function runTelegramDoctorChecks(params: {\n cfg: Config;\n fetchImpl?: typeof fetch;\n}): Promise<ChannelDoctorCheckResult[]> {\n const results: ChannelDoctorCheckResult[] = [];\n const tg = params.cfg.channels?.telegram as TelegramCfg | undefined;\n if (!tg) {\n return results;\n }\n\n if (tg.enabled && tg.dmPolicy === 'open') {\n const allow = tg.allowFrom ?? [];\n const hasWildcard = allow.some((e) => String(e).trim() === '*');\n results.push({\n id: 'telegram-dm-open-wildcard',\n label: 'Telegram DM open policy',\n status: hasWildcard ? 'pass' : 'warn',\n message: hasWildcard\n ? 'DM policy is open with allowFrom wildcard.'\n : 'dmPolicy \"open\" should include allowFrom: [\"*\"] for explicit opt-in.',\n hints: hasWildcard ? [] : ['Add `\"allowFrom\": [\"*\"]` or switch to pairing/allowlist.'],\n });\n }\n\n if (hasTelegramBotEndpointApiRoot(tg.apiRoot)) {\n results.push({\n id: 'telegram-api-root-bot-endpoint',\n label: 'Telegram apiRoot',\n status: 'warn',\n message: 'apiRoot includes a bot token path segment; it will be normalized to the API root.',\n hints: [`Use \"${normalizeTelegramApiRoot(tg.apiRoot)}\" instead.`],\n });\n }\n\n const tokenMap = collectTokens(tg);\n for (const [token, accountIds] of tokenMap) {\n if (accountIds.length > 1) {\n results.push({\n id: `telegram-duplicate-token-${accountIds.join('-')}`,\n label: 'Telegram duplicate bot token',\n status: 'fail',\n message: `Bot token is shared by accounts: ${accountIds.join(', ')}.`,\n hints: ['Use one token per account or disable duplicate accounts.'],\n });\n }\n void token;\n }\n\n for (const [id, acc] of Object.entries(tg.accounts ?? {})) {\n if (hasTelegramBotEndpointApiRoot(acc.apiRoot)) {\n results.push({\n id: `telegram-account-api-root-${id}`,\n label: `Telegram apiRoot (${id})`,\n status: 'warn',\n message: `Account \"${id}\" apiRoot includes bot endpoint; will be normalized.`,\n hints: [`Use \"${normalizeTelegramApiRoot(acc.apiRoot)}\"`],\n });\n }\n const { token, source } = resolveTelegramBotToken({\n botToken: acc.botToken,\n tokenFile: acc.tokenFile,\n });\n if (tg.enabled && acc && source === 'none' && (acc as { enabled?: boolean }).enabled !== false) {\n results.push({\n id: `telegram-account-token-${id}`,\n label: `Telegram token (${id})`,\n status: 'fail',\n message: `Account \"${id}\" has no bot token or readable tokenFile.`,\n hints: ['Set botToken or tokenFile in channels.telegram.accounts.' + id],\n });\n }\n if (token && token.length < 20) {\n results.push({\n id: `telegram-account-token-short-${id}`,\n label: `Telegram token (${id})`,\n status: 'warn',\n message: `Account \"${id}\" bot token looks too short.`,\n hints: ['Verify the token from @BotFather.'],\n });\n }\n\n if (tg.enabled && token && acc.enabled !== false) {\n results.push(\n await checkGetMe({\n accountId: id,\n token,\n apiRoot: acc.apiRoot || tg.apiRoot,\n proxy: acc.proxy || tg.proxy,\n fetchImpl: params.fetchImpl,\n }),\n );\n }\n }\n\n return results;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"doctor.js","names":[],"sources":["../../../../extensions/telegram/src/doctor.ts"],"sourcesContent":["import type { Config } from '@xopcai/xopc/config/index.js';\nimport type { ChannelDoctorCheckResult } from '@xopcai/xopc/channels/plugin-types.js';\nimport { hasTelegramBotEndpointApiRoot, normalizeTelegramApiRoot } from './api-root.js';\nimport { createProxyFetch } from './proxy-fetch.js';\nimport { isTelegramUnauthorizedTokenError } from './startup-errors.js';\nimport { resolveTelegramBotToken } from './token-resolver.js';\n\nconst TELEGRAM_DOCTOR_GETME_TIMEOUT_MS = 10_000;\n\ntype TelegramCfg = {\n enabled?: boolean;\n defaults?: {\n dmPolicy?: string;\n apiRoot?: string;\n proxy?: string;\n };\n accounts?: Record<\n string,\n {\n enabled?: boolean;\n botToken?: string;\n tokenFile?: string;\n apiRoot?: string;\n proxy?: string;\n dmPolicy?: string;\n allowFrom?: Array<string | number>;\n }\n >;\n};\n\nfunction collectTokens(cfg: TelegramCfg): Map<string, string[]> {\n const map = new Map<string, string[]>();\n const accounts = cfg.accounts ?? {};\n for (const [id, acc] of Object.entries(accounts)) {\n const { token } = resolveTelegramBotToken({\n botToken: acc.botToken,\n tokenFile: acc.tokenFile,\n });\n if (!token) continue;\n const list = map.get(token) ?? [];\n list.push(id);\n map.set(token, list);\n }\n return map;\n}\n\nfunction formatGetMeError(err: unknown): string {\n if (err instanceof Error) return err.message;\n return String(err);\n}\n\nfunction createTimeoutSignal(timeoutMs: number): { signal: AbortSignal; dispose: () => void } {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(new Error(`Timed out after ${timeoutMs}ms`)), timeoutMs);\n timer.unref?.();\n return {\n signal: controller.signal,\n dispose: () => clearTimeout(timer),\n };\n}\n\nasync function checkGetMe(params: {\n accountId: string;\n token: string;\n apiRoot?: string;\n proxy?: string;\n fetchImpl?: typeof fetch;\n}): Promise<ChannelDoctorCheckResult> {\n const apiRoot = normalizeTelegramApiRoot(params.apiRoot);\n const url = `${apiRoot}/bot${params.token}/getMe`;\n const timeout = createTimeoutSignal(TELEGRAM_DOCTOR_GETME_TIMEOUT_MS);\n const fetchImpl = params.proxy ? createProxyFetch(params.proxy) : (params.fetchImpl ?? fetch);\n\n try {\n const startedAt = Date.now();\n const response = await fetchImpl(url, { signal: timeout.signal });\n const elapsedMs = Date.now() - startedAt;\n const body = (await response.json().catch(() => undefined)) as\n | { ok?: boolean; result?: { username?: string }; description?: string }\n | undefined;\n\n if (response.ok && body?.ok === true) {\n const username = body.result?.username ? ` @${body.result.username}` : '';\n return {\n id: `telegram-account-getme-${params.accountId}`,\n label: `Telegram getMe (${params.accountId})`,\n status: 'pass',\n message: `getMe succeeded${username} in ${elapsedMs}ms.`,\n hints: params.proxy ? [`Using proxy: ${params.proxy}`] : [],\n };\n }\n\n const description = body?.description || `HTTP ${response.status}`;\n return {\n id: `telegram-account-getme-${params.accountId}`,\n label: `Telegram getMe (${params.accountId})`,\n status: isTelegramUnauthorizedTokenError(description) ? 'fail' : 'warn',\n message: `getMe failed: ${description}`,\n hints: isTelegramUnauthorizedTokenError(description)\n ? ['Verify the bot token from @BotFather.']\n : ['Check channels.telegram.defaults.apiRoot / account apiRoot and network access.'],\n };\n } catch (err) {\n const message = formatGetMeError(err);\n return {\n id: `telegram-account-getme-${params.accountId}`,\n label: `Telegram getMe (${params.accountId})`,\n status: 'fail',\n message: `getMe network check failed: ${message}`,\n hints: [\n 'Verify this host can reach the Telegram Bot API.',\n 'If your shell uses HTTP(S)_PROXY, also set channels.telegram.defaults.proxy because Node fetch does not use env proxy automatically.',\n `Effective apiRoot: ${apiRoot}`,\n ],\n };\n } finally {\n timeout.dispose();\n }\n}\n\nexport async function runTelegramDoctorChecks(params: {\n cfg: Config;\n fetchImpl?: typeof fetch;\n}): Promise<ChannelDoctorCheckResult[]> {\n const results: ChannelDoctorCheckResult[] = [];\n const tg = params.cfg.channels?.telegram as TelegramCfg | undefined;\n if (!tg) {\n return results;\n }\n\n if (hasTelegramBotEndpointApiRoot(tg.defaults?.apiRoot)) {\n results.push({\n id: 'telegram-api-root-bot-endpoint',\n label: 'Telegram apiRoot',\n status: 'warn',\n message: 'apiRoot includes a bot token path segment; it will be normalized to the API root.',\n hints: [`Use \"${normalizeTelegramApiRoot(tg.defaults?.apiRoot)}\" instead.`],\n });\n }\n\n const tokenMap = collectTokens(tg);\n for (const [token, accountIds] of tokenMap) {\n if (accountIds.length > 1) {\n results.push({\n id: `telegram-duplicate-token-${accountIds.join('-')}`,\n label: 'Telegram duplicate bot token',\n status: 'fail',\n message: `Bot token is shared by accounts: ${accountIds.join(', ')}.`,\n hints: ['Use one token per account or disable duplicate accounts.'],\n });\n }\n void token;\n }\n\n for (const [id, acc] of Object.entries(tg.accounts ?? {})) {\n const effectiveDmPolicy = acc.dmPolicy ?? tg.defaults?.dmPolicy ?? 'pairing';\n if (tg.enabled && effectiveDmPolicy === 'open') {\n const allow = acc.allowFrom ?? [];\n const hasWildcard = allow.some((e) => String(e).trim() === '*');\n results.push({\n id: `telegram-dm-open-wildcard-${id}`,\n label: `Telegram DM open policy (${id})`,\n status: hasWildcard ? 'pass' : 'warn',\n message: hasWildcard\n ? `Account \"${id}\" DM policy is open with allowFrom wildcard.`\n : `Account \"${id}\" dmPolicy \"open\" should include allowFrom: [\"*\"] for explicit opt-in.`,\n hints: hasWildcard ? [] : [`Add \"allowFrom\": [\"*\"] to channels.telegram.accounts.${id} or switch to pairing/allowlist.`],\n });\n }\n if (hasTelegramBotEndpointApiRoot(acc.apiRoot)) {\n results.push({\n id: `telegram-account-api-root-${id}`,\n label: `Telegram apiRoot (${id})`,\n status: 'warn',\n message: `Account \"${id}\" apiRoot includes bot endpoint; will be normalized.`,\n hints: [`Use \"${normalizeTelegramApiRoot(acc.apiRoot)}\"`],\n });\n }\n const { token, source } = resolveTelegramBotToken({\n botToken: acc.botToken,\n tokenFile: acc.tokenFile,\n });\n if (tg.enabled && acc && source === 'none' && (acc as { enabled?: boolean }).enabled !== false) {\n results.push({\n id: `telegram-account-token-${id}`,\n label: `Telegram token (${id})`,\n status: 'fail',\n message: `Account \"${id}\" has no bot token or readable tokenFile.`,\n hints: ['Set botToken or tokenFile in channels.telegram.accounts.' + id],\n });\n }\n if (token && token.length < 20) {\n results.push({\n id: `telegram-account-token-short-${id}`,\n label: `Telegram token (${id})`,\n status: 'warn',\n message: `Account \"${id}\" bot token looks too short.`,\n hints: ['Verify the token from @BotFather.'],\n });\n }\n\n if (tg.enabled && token && acc.enabled !== false) {\n results.push(\n await checkGetMe({\n accountId: id,\n token,\n apiRoot: acc.apiRoot || tg.defaults?.apiRoot,\n proxy: acc.proxy || tg.defaults?.proxy,\n fetchImpl: params.fetchImpl,\n }),\n );\n }\n }\n\n return results;\n}\n"],"mappings":"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"}
|
|
@@ -3,10 +3,9 @@ function isTelegramExecApprovalEnabled(cfg, accountId = "default") {
|
|
|
3
3
|
return ((cfg.channels?.telegram)?.accounts?.[accountId])?.execApprovals?.enabled === true;
|
|
4
4
|
}
|
|
5
5
|
function resolveTelegramExecApprovers(cfg, accountId = "default") {
|
|
6
|
-
const
|
|
7
|
-
const acc = tg?.accounts?.[accountId];
|
|
6
|
+
const acc = (cfg.channels?.telegram)?.accounts?.[accountId];
|
|
8
7
|
const explicit = acc?.execApprovals?.approvers ?? [];
|
|
9
|
-
const fallback = acc?.allowFrom ??
|
|
8
|
+
const fallback = acc?.allowFrom ?? [];
|
|
10
9
|
return (explicit.length > 0 ? explicit : fallback).map((v) => String(v).trim()).filter((v) => v && v !== "*" && /^\d+$/.test(v.replace(/^(telegram|tg):/i, ""))).map((v) => v.replace(/^(telegram|tg):/i, ""));
|
|
11
10
|
}
|
|
12
11
|
function isTelegramExecApprovalApprover(params) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exec-approvals.js","names":[],"sources":["../../../../extensions/telegram/src/exec-approvals.ts"],"sourcesContent":["import type { Config } from '@xopcai/xopc/config/index.js';\n\nexport function isTelegramExecApprovalEnabled(cfg: Config, accountId = 'default'): boolean {\n const tg = cfg.channels?.telegram as\n | { accounts?: Record<string, { execApprovals?: { enabled?: boolean } }> }\n | undefined;\n const acc = tg?.accounts?.[accountId];\n return acc?.execApprovals?.enabled === true;\n}\n\nexport function resolveTelegramExecApprovers(\n cfg: Config,\n accountId = 'default',\n): string[] {\n const tg = cfg.channels?.telegram as\n | {\n
|
|
1
|
+
{"version":3,"file":"exec-approvals.js","names":[],"sources":["../../../../extensions/telegram/src/exec-approvals.ts"],"sourcesContent":["import type { Config } from '@xopcai/xopc/config/index.js';\n\nexport function isTelegramExecApprovalEnabled(cfg: Config, accountId = 'default'): boolean {\n const tg = cfg.channels?.telegram as\n | { accounts?: Record<string, { execApprovals?: { enabled?: boolean } }> }\n | undefined;\n const acc = tg?.accounts?.[accountId];\n return acc?.execApprovals?.enabled === true;\n}\n\nexport function resolveTelegramExecApprovers(\n cfg: Config,\n accountId = 'default',\n): string[] {\n const tg = cfg.channels?.telegram as\n | {\n accounts?: Record<\n string,\n {\n execApprovals?: { approvers?: Array<string | number> };\n allowFrom?: Array<string | number>;\n }\n >;\n }\n | undefined;\n const acc = tg?.accounts?.[accountId];\n const explicit = acc?.execApprovals?.approvers ?? [];\n const fallback = acc?.allowFrom ?? [];\n const merged = explicit.length > 0 ? explicit : fallback;\n return merged\n .map((v) => String(v).trim())\n .filter((v) => v && v !== '*' && /^\\d+$/.test(v.replace(/^(telegram|tg):/i, '')))\n .map((v) => v.replace(/^(telegram|tg):/i, ''));\n}\n\nexport function isTelegramExecApprovalApprover(params: {\n cfg: Config;\n accountId: string;\n senderId: string;\n}): boolean {\n const approvers = resolveTelegramExecApprovers(params.cfg, params.accountId);\n const sid = params.senderId.replace(/^(telegram|tg):/i, '');\n return approvers.includes(sid);\n}\n"],"mappings":";AAEA,SAAgB,8BAA8B,KAAa,YAAY,WAAoB;AAKzF,UAJW,IAAI,UAAU,WAGT,WAAW,aACf,eAAe,YAAY;;AAGzC,SAAgB,6BACd,KACA,YAAY,WACF;CAYV,MAAM,OAXK,IAAI,UAAU,WAWT,WAAW;CAC3B,MAAM,WAAW,KAAK,eAAe,aAAa,EAAE;CACpD,MAAM,WAAW,KAAK,aAAa,EAAE;AAErC,SADe,SAAS,SAAS,IAAI,WAAW,UAE7C,KAAK,MAAM,OAAO,EAAE,CAAC,MAAM,CAAC,CAC5B,QAAQ,MAAM,KAAK,MAAM,OAAO,QAAQ,KAAK,EAAE,QAAQ,oBAAoB,GAAG,CAAC,CAAC,CAChF,KAAK,MAAM,EAAE,QAAQ,oBAAoB,GAAG,CAAC;;AAGlD,SAAgB,+BAA+B,QAInC;CACV,MAAM,YAAY,6BAA6B,OAAO,KAAK,OAAO,UAAU;CAC5E,MAAM,MAAM,OAAO,SAAS,QAAQ,oBAAoB,GAAG;AAC3D,QAAO,UAAU,SAAS,IAAI"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { TelegramAccountConfig, TelegramGroupConfig, TelegramTopicConfig } from '
|
|
1
|
+
import type { TelegramAccountConfig, TelegramGroupConfig, TelegramTopicConfig } from './config-types.js';
|
|
2
2
|
export interface ResolvedTelegramGroupContext {
|
|
3
3
|
groupConfig?: TelegramGroupConfig;
|
|
4
4
|
topicConfig?: TelegramTopicConfig;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"group-config-resolver.js","names":[],"sources":["../../../../extensions/telegram/src/group-config-resolver.ts"],"sourcesContent":["import type { TelegramAccountConfig, TelegramGroupConfig, TelegramTopicConfig } from '
|
|
1
|
+
{"version":3,"file":"group-config-resolver.js","names":[],"sources":["../../../../extensions/telegram/src/group-config-resolver.ts"],"sourcesContent":["import type { TelegramAccountConfig, TelegramGroupConfig, TelegramTopicConfig } from './config-types.js';\n\nexport interface ResolvedTelegramGroupContext {\n groupConfig?: TelegramGroupConfig;\n topicConfig?: TelegramTopicConfig;\n systemPrompt?: string;\n agentId?: string;\n}\n\nexport function resolveTelegramGroupContext(params: {\n account: TelegramAccountConfig;\n chatId: string;\n threadId?: string | number;\n}): ResolvedTelegramGroupContext {\n const chatKey = params.chatId;\n const threadKey = params.threadId != null ? String(params.threadId) : undefined;\n const groupConfig = params.account.groups?.[chatKey];\n const topicConfig = threadKey ? groupConfig?.topics?.[threadKey] : undefined;\n\n const systemPrompt = topicConfig?.systemPrompt?.trim() || groupConfig?.systemPrompt?.trim() || undefined;\n const agentId = topicConfig?.agentId?.trim() || groupConfig?.agentId?.trim() || undefined;\n\n return { groupConfig, topicConfig, systemPrompt, agentId };\n}\n"],"mappings":";AASA,SAAgB,4BAA4B,QAIX;CAC/B,MAAM,UAAU,OAAO;CACvB,MAAM,YAAY,OAAO,YAAY,OAAO,OAAO,OAAO,SAAS,GAAG,KAAA;CACtE,MAAM,cAAc,OAAO,QAAQ,SAAS;CAC5C,MAAM,cAAc,YAAY,aAAa,SAAS,aAAa,KAAA;AAKnE,QAAO;EAAE;EAAa;EAAa,cAHd,aAAa,cAAc,MAAM,IAAI,aAAa,cAAc,MAAM,IAAI,KAAA;EAG9C,SAFjC,aAAa,SAAS,MAAM,IAAI,aAAa,SAAS,MAAM,IAAI,KAAA;EAEtB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function registerTelegramPairingResolver(): void;
|