@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.
Files changed (77) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/feishu/src/pairing-config-resolver.d.ts +1 -0
  3. package/dist/extensions/feishu/src/pairing-config-resolver.js +30 -0
  4. package/dist/extensions/feishu/src/pairing-config-resolver.js.map +1 -0
  5. package/dist/extensions/feishu/src/plugin.d.ts +1 -0
  6. package/dist/extensions/feishu/src/plugin.js +1 -0
  7. package/dist/extensions/feishu/src/plugin.js.map +1 -1
  8. package/dist/extensions/telegram/src/access-control.d.ts +2 -1
  9. package/dist/extensions/telegram/src/access-control.js.map +1 -1
  10. package/dist/extensions/telegram/src/account-manager.d.ts +2 -1
  11. package/dist/extensions/telegram/src/account-manager.js.map +1 -1
  12. package/dist/extensions/telegram/src/adapters/gateway-setup.js +26 -26
  13. package/dist/extensions/telegram/src/adapters/gateway-setup.js.map +1 -1
  14. package/dist/extensions/telegram/src/adapters/onboard-cli.js +8 -4
  15. package/dist/extensions/telegram/src/adapters/onboard-cli.js.map +1 -1
  16. package/dist/extensions/telegram/src/config-schema.d.ts +88 -50
  17. package/dist/extensions/telegram/src/config-schema.js +40 -32
  18. package/dist/extensions/telegram/src/config-schema.js.map +1 -1
  19. package/dist/extensions/telegram/src/config-types.d.ts +54 -0
  20. package/dist/extensions/telegram/src/config-types.js +1 -0
  21. package/dist/extensions/telegram/src/doctor.js +17 -16
  22. package/dist/extensions/telegram/src/doctor.js.map +1 -1
  23. package/dist/extensions/telegram/src/exec-approvals.js +2 -3
  24. package/dist/extensions/telegram/src/exec-approvals.js.map +1 -1
  25. package/dist/extensions/telegram/src/group-config-resolver.d.ts +1 -1
  26. package/dist/extensions/telegram/src/group-config-resolver.js.map +1 -1
  27. package/dist/extensions/telegram/src/pairing-config-resolver.d.ts +1 -0
  28. package/dist/extensions/telegram/src/pairing-config-resolver.js +56 -0
  29. package/dist/extensions/telegram/src/pairing-config-resolver.js.map +1 -0
  30. package/dist/extensions/telegram/src/plugin.d.ts +1 -0
  31. package/dist/extensions/telegram/src/plugin.js +8 -9
  32. package/dist/extensions/telegram/src/plugin.js.map +1 -1
  33. package/dist/extensions/telegram/xopc.extension.json +156 -122
  34. package/dist/extensions/weixin/src/pairing-config-resolver.d.ts +1 -0
  35. package/dist/extensions/weixin/src/pairing-config-resolver.js +54 -0
  36. package/dist/extensions/weixin/src/pairing-config-resolver.js.map +1 -0
  37. package/dist/extensions/weixin/src/plugin.d.ts +1 -0
  38. package/dist/extensions/weixin/src/plugin.js +1 -0
  39. package/dist/extensions/weixin/src/plugin.js.map +1 -1
  40. package/dist/gateway/static/root/assets/{agents-D2VtykeA.js → agents-CFFioJCI.js} +1 -1
  41. package/dist/gateway/static/root/assets/{apps-page-BPQ6ueG-.js → apps-page-BYDmkbzG.js} +1 -1
  42. package/dist/gateway/static/root/assets/{channels-settings-DgZc25cS.js → channels-settings-CsbDaMvd.js} +1 -1
  43. package/dist/gateway/static/root/assets/{cron-page-BQFw5O-8.js → cron-page-Apk-7p4p.js} +1 -1
  44. package/dist/gateway/static/root/assets/{dist-BLMShn4_.js → dist-DmGDgpy2.js} +1 -1
  45. package/dist/gateway/static/root/assets/{extension-debug-page-BbQ8uZY_.js → extension-debug-page-pxFC-tUa.js} +1 -1
  46. package/dist/gateway/static/root/assets/{extension-page-DNcTendk.js → extension-page-W1wiG38F.js} +1 -1
  47. package/dist/gateway/static/root/assets/{extension-settings-page-ClWJvwHK.js → extension-settings-page-COXSv6xP.js} +1 -1
  48. package/dist/gateway/static/root/assets/{heartbeat-config-api-4O1U_Oki.js → heartbeat-config-api-DcmAMYmN.js} +1 -1
  49. package/dist/gateway/static/root/assets/{index-S23p3aa0.js → index-C_2yKRJX.js} +3 -3
  50. package/dist/gateway/static/root/assets/{logs-page-BAIdbvSC.js → logs-page-DvTWUOzd.js} +1 -1
  51. package/dist/gateway/static/root/assets/{note-detail-page-BVDoLwec.js → note-detail-page-CZbdugWZ.js} +1 -1
  52. package/dist/gateway/static/root/assets/{note-time-COWUfBZO.js → note-time-RdyBZxj3.js} +1 -1
  53. package/dist/gateway/static/root/assets/{notes-page-CI3aD7Tm.js → notes-page-mEAwy3e1.js} +1 -1
  54. package/dist/gateway/static/root/assets/{schema-form-CDpBshDP.js → schema-form-DEvdni_r.js} +1 -1
  55. package/dist/gateway/static/root/assets/{sessions-page-DM1S4eso.js → sessions-page-BsgffzV4.js} +1 -1
  56. package/dist/gateway/static/root/assets/{settings-advanced-gate-Bz_nYzvB.js → settings-advanced-gate-t6v8Dwb8.js} +1 -1
  57. package/dist/gateway/static/root/assets/{settings-form-section-BxhPoWWH.js → settings-form-section-BoYYZmJG.js} +1 -1
  58. package/dist/gateway/static/root/assets/{settings-page-Ch_Sd28M.js → settings-page-ClIthYF8.js} +1 -1
  59. package/dist/gateway/static/root/assets/{share-preview-page-D6u4llqD.js → share-preview-page-Dd9et7KD.js} +1 -1
  60. package/dist/gateway/static/root/assets/{skills-page-XMi76Nps.js → skills-page-DEXtxyfQ.js} +1 -1
  61. package/dist/gateway/static/root/assets/{voice-api-key-field-CMt5Xc7_.js → voice-api-key-field-CNrKzQrf.js} +1 -1
  62. package/dist/gateway/static/root/assets/{workflow-page.utils-BcZQmKBX.js → workflow-page.utils-EYg_xBQS.js} +1 -1
  63. package/dist/gateway/static/root/assets/{workflows-page-CxFbPBed.js → workflows-page-EMZkzJNN.js} +1 -1
  64. package/dist/gateway/static/root/index.html +1 -1
  65. package/dist/package.js +1 -1
  66. package/dist/src/channels/channel-domain.d.ts +1 -81
  67. package/dist/src/channels/pairing/index.d.ts +2 -2
  68. package/dist/src/channels/pairing/index.js +2 -2
  69. package/dist/src/channels/pairing/pairing-service.d.ts +13 -0
  70. package/dist/src/channels/pairing/pairing-service.js +78 -63
  71. package/dist/src/channels/pairing/pairing-service.js.map +1 -1
  72. package/dist/src/chat-commands/builtins/config.js +4 -11
  73. package/dist/src/chat-commands/builtins/config.js.map +1 -1
  74. package/dist/src/config/schema.js +9 -14
  75. package/dist/src/config/schema.js.map +1 -1
  76. package/dist/src/gateway/service.js +1 -1
  77. 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.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
75
- dmPolicy: z.ZodDefault<z.ZodEnum<{
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.ZodDefault<z.ZodEnum<{
119
+ groupPolicy: z.ZodOptional<z.ZodEnum<{
82
120
  allowlist: "allowlist";
83
121
  open: "open";
84
122
  disabled: "disabled";
85
123
  }>>;
86
- replyToMode: z.ZodDefault<z.ZodEnum<{
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.ZodDefault<z.ZodNumber>;
108
- textChunkLimit: z.ZodDefault<z.ZodNumber>;
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.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
173
- dmPolicy: z.ZodDefault<z.ZodEnum<{
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.ZodDefault<z.ZodEnum<{
252
+ groupPolicy: z.ZodOptional<z.ZodEnum<{
180
253
  allowlist: "allowlist";
181
254
  open: "open";
182
255
  disabled: "disabled";
183
256
  }>>;
184
- replyToMode: z.ZodDefault<z.ZodEnum<{
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.ZodDefault<z.ZodNumber>;
206
- textChunkLimit: z.ZodDefault<z.ZodNumber>;
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()])).optional(),
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
- ]).default("open"),
95
+ ]).optional(),
73
96
  groupPolicy: z.enum([
74
97
  "open",
75
98
  "disabled",
76
99
  "allowlist"
77
- ]).default("open"),
100
+ ]).optional(),
78
101
  replyToMode: z.enum([
79
102
  "off",
80
103
  "first",
81
104
  "all"
82
- ]).default("off"),
105
+ ]).optional(),
83
106
  groups: z.record(z.string(), TelegramGroupConfigSchema).optional(),
84
- historyLimit: z.number().default(50),
85
- textChunkLimit: z.number().default(4e3),
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
- accounts: z.record(z.string(), TelegramAccountConfigSchema).optional(),
113
- dmPolicy: z.enum([
114
- "pairing",
115
- "allowlist",
116
- "open",
117
- "disabled"
118
- ]).default("open"),
119
- groupPolicy: z.enum([
120
- "open",
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()])).optional(),\n dmPolicy: z.enum(['pairing', 'allowlist', 'open', 'disabled']).default('open'),\n groupPolicy: z.enum(['open', 'disabled', 'allowlist']).default('open'),\n replyToMode: z.enum(['off', 'first', 'all']).default('off'),\n groups: z.record(z.string(), TelegramGroupConfigSchema).optional(),\n historyLimit: z.number().default(50),\n textChunkLimit: z.number().default(4000),\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 allowFrom: z.array(z.union([z.string(), z.number()])).default([]),\n groupAllowFrom: z.array(z.union([z.string(), z.number()])).default([]),\n apiRoot: z.string().optional(),\n debug: z.boolean().default(false),\n accounts: z.record(z.string(), TelegramAccountConfigSchema).optional(),\n dmPolicy: z.enum(['pairing', 'allowlist', 'open', 'disabled']).default('open'),\n groupPolicy: z.enum(['open', 'disabled', 'allowlist']).default('open'),\n replyToMode: z.enum(['off', 'first', 'all']).default('off'),\n streaming: TelegramStreamingConfigSchema.optional(),\n historyLimit: z.number().default(50),\n textChunkLimit: z.number().default(4000),\n proxy: z.string().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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"}
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.enabled && tg.dmPolicy === "open") {
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 tg = cfg.channels?.telegram;
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 ?? tg?.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 allowFrom?: Array<string | number>;\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 ?? tg?.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;CACV,MAAM,KAAK,IAAI,UAAU;CAYzB,MAAM,MAAM,IAAI,WAAW;CAC3B,MAAM,WAAW,KAAK,eAAe,aAAa,EAAE;CACpD,MAAM,WAAW,KAAK,aAAa,IAAI,aAAa,EAAE;AAEtD,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
+ {"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 '@xopcai/xopc/channels/channel-domain.js';
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 '@xopcai/xopc/channels/channel-domain.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"}
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;