@moxxy/plugin-telegram 0.41.3 → 0.42.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/channel/callback-handler.d.ts +5 -2
- package/dist/channel/callback-handler.d.ts.map +1 -1
- package/dist/channel/callback-handler.js +31 -58
- package/dist/channel/callback-handler.js.map +1 -1
- package/dist/channel/mirror.d.ts +23 -0
- package/dist/channel/mirror.d.ts.map +1 -0
- package/dist/channel/mirror.js +23 -0
- package/dist/channel/mirror.js.map +1 -0
- package/dist/channel/model-picker.d.ts +17 -0
- package/dist/channel/model-picker.d.ts.map +1 -0
- package/dist/channel/model-picker.js +58 -0
- package/dist/channel/model-picker.js.map +1 -0
- package/dist/channel/model.d.ts +22 -0
- package/dist/channel/model.d.ts.map +1 -0
- package/dist/channel/model.js +11 -0
- package/dist/channel/model.js.map +1 -0
- package/dist/channel/pairing-handler.d.ts +2 -0
- package/dist/channel/pairing-handler.d.ts.map +1 -1
- package/dist/channel/pairing-handler.js +4 -0
- package/dist/channel/pairing-handler.js.map +1 -1
- package/dist/channel/send-rich.d.ts +16 -0
- package/dist/channel/send-rich.d.ts.map +1 -0
- package/dist/channel/send-rich.js +25 -0
- package/dist/channel/send-rich.js.map +1 -0
- package/dist/channel/slash-handler.d.ts +8 -6
- package/dist/channel/slash-handler.d.ts.map +1 -1
- package/dist/channel/slash-handler.js +29 -51
- package/dist/channel/slash-handler.js.map +1 -1
- package/dist/channel/text-handler.d.ts +6 -4
- package/dist/channel/text-handler.d.ts.map +1 -1
- package/dist/channel/text-handler.js +23 -52
- package/dist/channel/text-handler.js.map +1 -1
- package/dist/channel/turn-runner.d.ts +10 -4
- package/dist/channel/turn-runner.d.ts.map +1 -1
- package/dist/channel/turn-runner.js +22 -5
- package/dist/channel/turn-runner.js.map +1 -1
- package/dist/channel/voice-handler.d.ts.map +1 -1
- package/dist/channel/voice-handler.js +2 -0
- package/dist/channel/voice-handler.js.map +1 -1
- package/dist/channel.d.ts +8 -10
- package/dist/channel.d.ts.map +1 -1
- package/dist/channel.js +55 -55
- package/dist/channel.js.map +1 -1
- package/dist/format.d.ts +1 -0
- package/dist/format.d.ts.map +1 -1
- package/dist/format.js +1 -1
- package/dist/format.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -72
- package/dist/index.js.map +1 -1
- package/dist/keys.d.ts +3 -0
- package/dist/keys.d.ts.map +1 -1
- package/dist/keys.js +3 -0
- package/dist/keys.js.map +1 -1
- package/dist/pair-flow.d.ts +2 -1
- package/dist/pair-flow.d.ts.map +1 -1
- package/dist/pair-flow.js +9 -23
- package/dist/pair-flow.js.map +1 -1
- package/dist/tools/send-message.d.ts +21 -0
- package/dist/tools/send-message.d.ts.map +1 -0
- package/dist/tools/send-message.js +84 -0
- package/dist/tools/send-message.js.map +1 -0
- package/package.json +11 -10
- package/src/channel/callback-handler.test.ts +4 -33
- package/src/channel/callback-handler.ts +34 -65
- package/src/channel/mirror.test.ts +59 -0
- package/src/channel/mirror.ts +36 -0
- package/src/channel/model-picker.ts +75 -0
- package/src/channel/model.test.ts +203 -0
- package/src/channel/model.ts +33 -0
- package/src/channel/pairing-handler.test.ts +38 -0
- package/src/channel/pairing-handler.ts +5 -0
- package/src/channel/send-rich.ts +36 -0
- package/src/channel/slash-handler.test.ts +68 -0
- package/src/channel/slash-handler.ts +35 -66
- package/src/channel/text-handler.test.ts +6 -5
- package/src/channel/text-handler.ts +28 -52
- package/src/channel/turn-runner.test.ts +84 -0
- package/src/channel/turn-runner.ts +31 -9
- package/src/channel/voice-handler.ts +2 -0
- package/src/channel/voice-reply.test.ts +16 -14
- package/src/channel.ts +68 -57
- package/src/format.ts +1 -1
- package/src/index.ts +8 -75
- package/src/keys.ts +4 -0
- package/src/pair-flow.ts +9 -23
- package/src/subcommands.test.ts +2 -1
- package/src/tools/send-message.test.ts +118 -0
- package/src/tools/send-message.ts +97 -0
|
@@ -2,6 +2,7 @@ import type { Bot, Context } from 'grammy';
|
|
|
2
2
|
import type { ClientSession as Session } from '@moxxy/sdk';
|
|
3
3
|
import type { TelegramPermissionResolver } from '../permission.js';
|
|
4
4
|
import type { TelegramApprovalResolver } from '../approval.js';
|
|
5
|
+
import type { TelegramModel } from './model.js';
|
|
5
6
|
export interface AwaitingApprovalText {
|
|
6
7
|
approvalId: string;
|
|
7
8
|
optionId: string;
|
|
@@ -20,12 +21,14 @@ export interface CallbackState {
|
|
|
20
21
|
export interface CallbackCallbacks {
|
|
21
22
|
/** Latch an in-flight approval awaiting a text follow-up. */
|
|
22
23
|
setAwaitingApprovalText(state: AwaitingApprovalText | null): void;
|
|
23
|
-
|
|
24
|
+
/** This bot's own model (the `/model` picker). */
|
|
25
|
+
readonly model: Pick<TelegramModel, 'run' | 'choices'>;
|
|
24
26
|
}
|
|
25
27
|
/** Inline-keyboard callback router. Dispatches by prefix:
|
|
26
28
|
* - `perm:` → permission resolver
|
|
27
29
|
* - `appr:` → approval resolver
|
|
28
|
-
* - `
|
|
30
|
+
* - `mprov:` → the model picker's screens (a provider's models, or back)
|
|
31
|
+
* - `model:` → this bot's model (`provider::model` or `default`)
|
|
29
32
|
* - `mode:` → mode switch
|
|
30
33
|
*/
|
|
31
34
|
export declare function handleCallback(ctx: Context, state: CallbackState, cb: CallbackCallbacks): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"callback-handler.d.ts","sourceRoot":"","sources":["../../src/channel/callback-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAG3C,OAAO,KAAK,EAAE,aAAa,IAAI,OAAO,EAAE,MAAM,YAAY,CAAC;AAE3D,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"callback-handler.d.ts","sourceRoot":"","sources":["../../src/channel/callback-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAG3C,OAAO,KAAK,EAAE,aAAa,IAAI,OAAO,EAAE,MAAM,YAAY,CAAC;AAE3D,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhD,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,kBAAkB,EAAE,0BAA0B,CAAC;IACxD,QAAQ,CAAC,gBAAgB,EAAE,wBAAwB,CAAC;IACpD,mFAAmF;IACnF,QAAQ,CAAC,OAAO,EAAE;QAAE,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;CAC7D;AAED,MAAM,WAAW,iBAAiB;IAChC,6DAA6D;IAC7D,uBAAuB,CAAC,KAAK,EAAE,oBAAoB,GAAG,IAAI,GAAG,IAAI,CAAC;IAClE,kDAAkD;IAClD,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,KAAK,GAAG,SAAS,CAAC,CAAC;CACxD;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,aAAa,EACpB,EAAE,EAAE,iBAAiB,GACpB,OAAO,CAAC,IAAI,CAAC,CAwCf"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import { setCategoryDefault
|
|
1
|
+
import { setCategoryDefault } from '@moxxy/config';
|
|
2
2
|
import { isSelectableMode } from '@moxxy/sdk';
|
|
3
|
+
import { PROVIDER_PREFIX, modelScreen, providerScreen } from './model-picker.js';
|
|
3
4
|
/** Inline-keyboard callback router. Dispatches by prefix:
|
|
4
5
|
* - `perm:` → permission resolver
|
|
5
6
|
* - `appr:` → approval resolver
|
|
6
|
-
* - `
|
|
7
|
+
* - `mprov:` → the model picker's screens (a provider's models, or back)
|
|
8
|
+
* - `model:` → this bot's model (`provider::model` or `default`)
|
|
7
9
|
* - `mode:` → mode switch
|
|
8
10
|
*/
|
|
9
11
|
export async function handleCallback(ctx, state, cb) {
|
|
@@ -34,8 +36,12 @@ export async function handleCallback(ctx, state, cb) {
|
|
|
34
36
|
await handleAppr(ctx, data, state, cb);
|
|
35
37
|
return;
|
|
36
38
|
}
|
|
39
|
+
if (data.startsWith(PROVIDER_PREFIX)) {
|
|
40
|
+
await showPickerScreen(ctx, data.slice(PROVIDER_PREFIX.length), cb);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
37
43
|
if (data.startsWith('model:')) {
|
|
38
|
-
await handleModel(ctx, data
|
|
44
|
+
await handleModel(ctx, data.slice('model:'.length), cb);
|
|
39
45
|
return;
|
|
40
46
|
}
|
|
41
47
|
if (data.startsWith('mode:')) {
|
|
@@ -108,67 +114,34 @@ async function handleAppr(ctx, data, state, cb) {
|
|
|
108
114
|
state.approvalResolver.resolvePending(approvalId, optionId);
|
|
109
115
|
await ctx.answerCallbackQuery({ text: option.label });
|
|
110
116
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
const
|
|
114
|
-
const
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
117
|
+
/** A provider button (its models) or `‹ Providers` (back), redrawn in place. */
|
|
118
|
+
async function showPickerScreen(ctx, provider, cb) {
|
|
119
|
+
const { current, options } = await cb.model.choices();
|
|
120
|
+
const screen = provider ? modelScreen(provider, current, options) : providerScreen(current, options);
|
|
121
|
+
await ctx.answerCallbackQuery();
|
|
122
|
+
try {
|
|
123
|
+
await ctx.editMessageText(screen.text, { parse_mode: 'HTML', reply_markup: screen.keyboard });
|
|
118
124
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
: `moxxy init # (will prompt for ${providerId.toUpperCase()}_API_KEY)`;
|
|
128
|
-
await ctx.answerCallbackQuery({ text: `${providerId} not connected` });
|
|
129
|
-
if (ctx.callbackQuery?.message) {
|
|
130
|
-
try {
|
|
131
|
-
await ctx.editMessageText(`${providerId} isn't connected.\n\nRun \`${cmd}\` then restart moxxy.`, { parse_mode: 'Markdown' });
|
|
132
|
-
}
|
|
133
|
-
catch {
|
|
134
|
-
/* ignore */
|
|
135
|
-
}
|
|
136
|
-
}
|
|
125
|
+
catch {
|
|
126
|
+
/* ignore — an unchanged screen can't be re-sent */
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/** A tapped `/model` button: the same switch as `/model <value>`, answered in place. */
|
|
130
|
+
async function handleModel(ctx, value, cb) {
|
|
131
|
+
if (!value) {
|
|
132
|
+
await ctx.answerCallbackQuery({ text: 'invalid model selection' });
|
|
137
133
|
return;
|
|
138
134
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
const resolver = session.credentialResolver;
|
|
145
|
-
const cfg = resolver ? await resolver(providerId) : {};
|
|
146
|
-
const def = session.providers.list().find((p) => p.name === providerId);
|
|
147
|
-
if (def)
|
|
148
|
-
session.providers.replace(def);
|
|
149
|
-
session.providers.setActive(providerId, cfg);
|
|
135
|
+
const reply = await cb.model.run(value);
|
|
136
|
+
await ctx.answerCallbackQuery({ text: reply.slice(0, 190) });
|
|
137
|
+
if (ctx.callbackQuery?.message) {
|
|
138
|
+
try {
|
|
139
|
+
await ctx.editMessageText(reply);
|
|
150
140
|
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
// writes. Await so a write failure (disk/permission/lock) is caught below and
|
|
154
|
-
// reported, instead of telling the user "✓ switched" while it never landed.
|
|
155
|
-
await setCategoryDefault('provider', providerId);
|
|
156
|
-
await setProviderModel(providerId, modelId);
|
|
157
|
-
await ctx.answerCallbackQuery({ text: `→ ${providerId}:${modelId}` });
|
|
158
|
-
if (ctx.callbackQuery?.message) {
|
|
159
|
-
try {
|
|
160
|
-
await ctx.editMessageText(`✓ switched to ${providerId}:${modelId}`);
|
|
161
|
-
}
|
|
162
|
-
catch {
|
|
163
|
-
/* ignore */
|
|
164
|
-
}
|
|
141
|
+
catch {
|
|
142
|
+
/* ignore */
|
|
165
143
|
}
|
|
166
144
|
}
|
|
167
|
-
catch (err) {
|
|
168
|
-
await ctx.answerCallbackQuery({
|
|
169
|
-
text: `failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
145
|
}
|
|
173
146
|
async function handleMode(ctx, data, session) {
|
|
174
147
|
const modeName = data.slice(5);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"callback-handler.js","sourceRoot":"","sources":["../../src/channel/callback-handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"callback-handler.js","sourceRoot":"","sources":["../../src/channel/callback-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ForeignTurnMirror, MirrorTarget, type TurnCoordinator } from '@moxxy/channel-kit';
|
|
2
|
+
import { type TelegramSender } from './send-rich.js';
|
|
3
|
+
export type { TelegramSender } from './send-rich.js';
|
|
4
|
+
export interface TelegramMirrorOptions {
|
|
5
|
+
readonly turns: Pick<TurnCoordinator, 'mirrorPrompt' | 'mirrorText'>;
|
|
6
|
+
/** The running bot's API, or null while it is stopped. */
|
|
7
|
+
readonly api: () => TelegramSender | null;
|
|
8
|
+
/** The paired chat, or null while unpaired. */
|
|
9
|
+
readonly pairedChat: () => number | null;
|
|
10
|
+
readonly logger?: {
|
|
11
|
+
warn(msg: string, meta?: Record<string, unknown>): void;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Turns another surface ran on the bot's session (the desktop's chat with this
|
|
16
|
+
* bot) shown in Telegram: the prompt written in the app, then its reply — into
|
|
17
|
+
* the chat the owner last wrote from, else the paired chat.
|
|
18
|
+
*/
|
|
19
|
+
export declare function createTelegramMirror(opts: TelegramMirrorOptions): {
|
|
20
|
+
readonly mirror: ForeignTurnMirror<number>;
|
|
21
|
+
readonly target: MirrorTarget<number>;
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=mirror.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mirror.d.ts","sourceRoot":"","sources":["../../src/channel/mirror.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC3F,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEnE,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,cAAc,GAAG,YAAY,CAAC,CAAC;IACrE,0DAA0D;IAC1D,QAAQ,CAAC,GAAG,EAAE,MAAM,cAAc,GAAG,IAAI,CAAC;IAC1C,+CAA+C;IAC/C,QAAQ,CAAC,UAAU,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;KAAE,CAAC;CAC/E;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,qBAAqB,GAAG;IACjE,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC3C,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;CACvC,CAaA"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ForeignTurnMirror, MirrorTarget } from '@moxxy/channel-kit';
|
|
2
|
+
import { sendMarkdown } from './send-rich.js';
|
|
3
|
+
/**
|
|
4
|
+
* Turns another surface ran on the bot's session (the desktop's chat with this
|
|
5
|
+
* bot) shown in Telegram: the prompt written in the app, then its reply — into
|
|
6
|
+
* the chat the owner last wrote from, else the paired chat.
|
|
7
|
+
*/
|
|
8
|
+
export function createTelegramMirror(opts) {
|
|
9
|
+
const target = new MirrorTarget(async () => opts.pairedChat());
|
|
10
|
+
const mirror = new ForeignTurnMirror({
|
|
11
|
+
turns: opts.turns,
|
|
12
|
+
target,
|
|
13
|
+
post: async (chatId, text) => {
|
|
14
|
+
const api = opts.api();
|
|
15
|
+
if (api)
|
|
16
|
+
await sendMarkdown(api, chatId, text);
|
|
17
|
+
},
|
|
18
|
+
formatPrompt: (prompt) => `_typed in moxxy:_ ${prompt}`,
|
|
19
|
+
onError: (err) => opts.logger?.warn('telegram mirror failed', { err: String(err) }),
|
|
20
|
+
});
|
|
21
|
+
return { mirror, target };
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=mirror.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mirror.js","sourceRoot":"","sources":["../../src/channel/mirror.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAwB,MAAM,oBAAoB,CAAC;AAC3F,OAAO,EAAE,YAAY,EAAuB,MAAM,gBAAgB,CAAC;AAanE;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAA2B;IAI9D,MAAM,MAAM,GAAG,IAAI,YAAY,CAAS,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAS;QAC3C,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM;QACN,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,IAAI,GAAG;gBAAE,MAAM,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACjD,CAAC;QACD,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,qBAAqB,MAAM,EAAE;QACvD,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,wBAAwB,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;KACpF,CAAC,CAAC;IACH,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { InlineKeyboard } from 'grammy';
|
|
2
|
+
import { type ModelChoice, type ModelOption } from '@moxxy/channel-kit';
|
|
3
|
+
/**
|
|
4
|
+
* The `/model` picker as two screens in one message: the providers, then the
|
|
5
|
+
* models of the one tapped (with a way back). The bot's current choice is the
|
|
6
|
+
* green button.
|
|
7
|
+
*/
|
|
8
|
+
export interface PickerScreen {
|
|
9
|
+
/** HTML (`parse_mode: 'HTML'`). */
|
|
10
|
+
readonly text: string;
|
|
11
|
+
readonly keyboard: InlineKeyboard;
|
|
12
|
+
}
|
|
13
|
+
/** Callback data prefix of a provider button; empty provider = back to the list. */
|
|
14
|
+
export declare const PROVIDER_PREFIX = "mprov:";
|
|
15
|
+
export declare function providerScreen(current: ModelChoice | null, options: ReadonlyArray<ModelOption>): PickerScreen;
|
|
16
|
+
export declare function modelScreen(provider: string, current: ModelChoice | null, options: ReadonlyArray<ModelOption>): PickerScreen;
|
|
17
|
+
//# sourceMappingURL=model-picker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-picker.d.ts","sourceRoot":"","sources":["../../src/channel/model-picker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAqB,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAG3F;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,mCAAmC;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;CACnC;AAED,oFAAoF;AACpF,eAAO,MAAM,eAAe,WAAW,CAAC;AAYxC,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC,WAAW,CAAC,GAAG,YAAY,CAqB7G;AAED,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,WAAW,GAAG,IAAI,EAC3B,OAAO,EAAE,aAAa,CAAC,WAAW,CAAC,GAClC,YAAY,CAmBd"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { InlineKeyboard } from 'grammy';
|
|
2
|
+
import { formatModelChoice } from '@moxxy/channel-kit';
|
|
3
|
+
import { escapeHtml } from '../format.js';
|
|
4
|
+
/** Callback data prefix of a provider button; empty provider = back to the list. */
|
|
5
|
+
export const PROVIDER_PREFIX = 'mprov:';
|
|
6
|
+
/** Telegram rejects a button whose callback data exceeds 64 bytes. */
|
|
7
|
+
const CALLBACK_DATA_MAX_BYTES = 64;
|
|
8
|
+
/** A provider's models shown at once; the rest are reachable with /model <text>. */
|
|
9
|
+
const MODELS_CAP = 30;
|
|
10
|
+
const fits = (data) => Buffer.byteLength(data) <= CALLBACK_DATA_MAX_BYTES;
|
|
11
|
+
function nowLine(current) {
|
|
12
|
+
return current ? `Now: <code>${escapeHtml(formatModelChoice(current))}</code>` : 'Now: the default model';
|
|
13
|
+
}
|
|
14
|
+
export function providerScreen(current, options) {
|
|
15
|
+
const keyboard = new InlineKeyboard().text(current ? 'Default model' : '✓ Default model', 'model:default');
|
|
16
|
+
if (!current)
|
|
17
|
+
keyboard.success();
|
|
18
|
+
keyboard.row();
|
|
19
|
+
const providers = [...new Set(options.map((o) => o.provider))];
|
|
20
|
+
providers.forEach((provider, index) => {
|
|
21
|
+
const models = options.filter((o) => o.provider === provider);
|
|
22
|
+
const connected = models.some((o) => o.connected);
|
|
23
|
+
const isCurrent = current?.provider === provider;
|
|
24
|
+
const label = `${isCurrent ? '✓ ' : ''}${provider} · ${connected ? `${models.length} ${models.length === 1 ? 'model' : 'models'}` : 'not connected'}`;
|
|
25
|
+
if (!fits(`${PROVIDER_PREFIX}${provider}`))
|
|
26
|
+
return;
|
|
27
|
+
keyboard.text(label, `${PROVIDER_PREFIX}${provider}`);
|
|
28
|
+
if (isCurrent)
|
|
29
|
+
keyboard.success();
|
|
30
|
+
if (index % 2 === 1)
|
|
31
|
+
keyboard.row();
|
|
32
|
+
});
|
|
33
|
+
return {
|
|
34
|
+
text: `<b>Model for this bot</b>\n${nowLine(current)}\n\nPick a provider:`,
|
|
35
|
+
keyboard,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export function modelScreen(provider, current, options) {
|
|
39
|
+
const models = options.filter((o) => o.provider === provider && fits(`model:${formatModelChoice(o)}`));
|
|
40
|
+
const shown = models.slice(0, MODELS_CAP);
|
|
41
|
+
const keyboard = new InlineKeyboard();
|
|
42
|
+
for (const o of shown) {
|
|
43
|
+
const isCurrent = current != null && formatModelChoice(current) === formatModelChoice(o);
|
|
44
|
+
keyboard.text(`${isCurrent ? '✓ ' : ''}${o.model}`, `model:${formatModelChoice(o)}`);
|
|
45
|
+
if (isCurrent)
|
|
46
|
+
keyboard.success();
|
|
47
|
+
keyboard.row();
|
|
48
|
+
}
|
|
49
|
+
keyboard.text('‹ Providers', PROVIDER_PREFIX);
|
|
50
|
+
const connected = models.some((o) => o.connected);
|
|
51
|
+
const more = models.length - shown.length;
|
|
52
|
+
return {
|
|
53
|
+
text: `<b>${escapeHtml(provider)}</b>${connected ? '' : ' · not connected'}\n${nowLine(current)}\n\nPick a model:` +
|
|
54
|
+
(more > 0 ? `\n<i>${more} more — use /model <text></i>` : ''),
|
|
55
|
+
keyboard,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=model-picker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-picker.js","sourceRoot":"","sources":["../../src/channel/model-picker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type ModelChoice, type ModelCommandDeps, type ModelOption } from '@moxxy/channel-kit';
|
|
2
|
+
/**
|
|
3
|
+
* The Telegram bot's own model (`telegram_model` in the vault, the key the
|
|
4
|
+
* desktop panel writes too): `/model` and its buttons switch it, and it is read
|
|
5
|
+
* before every turn — never the global default the desktop/TUI run with.
|
|
6
|
+
*/
|
|
7
|
+
export interface TelegramModel {
|
|
8
|
+
/** `/model [name|default]` — switch or reset; returns the reply. */
|
|
9
|
+
run(arg: string): Promise<string>;
|
|
10
|
+
/** What the picker shows: the saved choice and every model. */
|
|
11
|
+
choices(): Promise<{
|
|
12
|
+
readonly current: ModelChoice | null;
|
|
13
|
+
readonly options: ReadonlyArray<ModelOption>;
|
|
14
|
+
}>;
|
|
15
|
+
/** The model for the next turn, with a warning when the saved one can't be used. */
|
|
16
|
+
resolve(): Promise<{
|
|
17
|
+
readonly model?: string;
|
|
18
|
+
readonly warning?: string;
|
|
19
|
+
}>;
|
|
20
|
+
}
|
|
21
|
+
export declare function telegramModel(deps: Omit<ModelCommandDeps, 'vaultKey'>): TelegramModel;
|
|
22
|
+
//# sourceMappingURL=model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/channel/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EACjB,MAAM,oBAAoB,CAAC;AAG5B;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,oEAAoE;IACpE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC,+DAA+D;IAC/D,OAAO,IAAI,OAAO,CAAC;QAAE,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,WAAW,CAAC,CAAA;KAAE,CAAC,CAAC;IAC3G,oFAAoF;IACpF,OAAO,IAAI,OAAO,CAAC;QAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC5E;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC,GAAG,aAAa,CAOrF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { listModelOptions, resolveChannelModel, runModelCommand, savedChannelModel, } from '@moxxy/channel-kit';
|
|
2
|
+
import { TELEGRAM_MODEL_KEY } from '../keys.js';
|
|
3
|
+
export function telegramModel(deps) {
|
|
4
|
+
const scoped = { ...deps, vaultKey: TELEGRAM_MODEL_KEY };
|
|
5
|
+
return {
|
|
6
|
+
run: (arg) => runModelCommand(arg, scoped),
|
|
7
|
+
choices: async () => ({ current: await savedChannelModel(scoped), options: listModelOptions(deps.session) }),
|
|
8
|
+
resolve: () => resolveChannelModel(scoped),
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/channel/model.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,iBAAiB,GAIlB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAgBhD,MAAM,UAAU,aAAa,CAAC,IAAwC;IACpE,MAAM,MAAM,GAAqB,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC3E,OAAO;QACL,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC;QAC1C,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5G,OAAO,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,MAAM,CAAC;KAC3C,CAAC;AACJ,CAAC"}
|
|
@@ -33,6 +33,8 @@ export declare class PairingHandler {
|
|
|
33
33
|
loadAuthorized(): Promise<void>;
|
|
34
34
|
isAuthorized(chatId: number): boolean;
|
|
35
35
|
phase(): PairingState['phase'];
|
|
36
|
+
/** The paired chat — where the bot reaches its owner — or null while unpaired. */
|
|
37
|
+
authorizedChatId(): number | null;
|
|
36
38
|
/**
|
|
37
39
|
* Open a host-issued pairing window and return the code to embed in the
|
|
38
40
|
* `t.me/<bot>?start=<code>` deep link / QR the control surface renders. The
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pairing-handler.d.ts","sourceRoot":"","sources":["../../src/channel/pairing-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAQL,KAAK,YAAY,EAClB,MAAM,eAAe,CAAC;AAKvB,4CAA4C;AAC5C,MAAM,MAAM,oBAAoB,GAC5B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC5B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjG,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE;QAChB,IAAI,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;QACzD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;KACzD,CAAC;CACH;AAED;;;;;GAKG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAsC;IACnD,OAAO,CAAC,GAAG,CAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAwB;IAC7C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAuC;gBAE3D,IAAI,EAAE,qBAAqB;IAIvC,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI;IAI1B,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAWrC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIrC,KAAK,IAAI,YAAY,CAAC,OAAO,CAAC;IAI9B;;;;;;OAMG;IACH,eAAe,IAAI,MAAM;IAMzB,MAAM,IAAI,IAAI;IAId;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI;IAKxD;;;;OAIG;IACG,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAKrF;0CACsC;YACxB,oBAAoB;IA4BlC,OAAO,CAAC,UAAU;IAUlB,iCAAiC;IAC3B,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAgCtD"}
|
|
1
|
+
{"version":3,"file":"pairing-handler.d.ts","sourceRoot":"","sources":["../../src/channel/pairing-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAQL,KAAK,YAAY,EAClB,MAAM,eAAe,CAAC;AAKvB,4CAA4C;AAC5C,MAAM,MAAM,oBAAoB,GAC5B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC5B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjG,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE;QAChB,IAAI,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;QACzD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;KACzD,CAAC;CACH;AAED;;;;;GAKG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAsC;IACnD,OAAO,CAAC,GAAG,CAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAwB;IAC7C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAuC;gBAE3D,IAAI,EAAE,qBAAqB;IAIvC,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI;IAI1B,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAWrC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIrC,KAAK,IAAI,YAAY,CAAC,OAAO,CAAC;IAI9B,kFAAkF;IAClF,gBAAgB,IAAI,MAAM,GAAG,IAAI;IAIjC;;;;;;OAMG;IACH,eAAe,IAAI,MAAM;IAMzB,MAAM,IAAI,IAAI;IAId;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI;IAKxD;;;;OAIG;IACG,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAKrF;0CACsC;YACxB,oBAAoB;IA4BlC,OAAO,CAAC,UAAU;IAUlB,iCAAiC;IAC3B,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAgCtD"}
|
|
@@ -34,6 +34,10 @@ export class PairingHandler {
|
|
|
34
34
|
phase() {
|
|
35
35
|
return this.state.phase;
|
|
36
36
|
}
|
|
37
|
+
/** The paired chat — where the bot reaches its owner — or null while unpaired. */
|
|
38
|
+
authorizedChatId() {
|
|
39
|
+
return this.state.authorizedChatId;
|
|
40
|
+
}
|
|
37
41
|
/**
|
|
38
42
|
* Open a host-issued pairing window and return the code to embed in the
|
|
39
43
|
* `t.me/<bot>?start=<code>` deep link / QR the control surface renders. The
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pairing-handler.js","sourceRoot":"","sources":["../../src/channel/pairing-handler.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,sBAAsB,EACtB,YAAY,EACZ,kBAAkB,EAClB,WAAW,EACX,YAAY,EACZ,cAAc,GAGf,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,WAAW,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC;AAEvE,MAAM,mBAAmB,GAAG,4BAA4B,CAAC;AAezD;;;;;GAKG;AACH,MAAM,OAAO,cAAc;IACjB,KAAK,GAAiB,kBAAkB,EAAE,CAAC;IAC3C,GAAG,GAAe,IAAI,CAAC;IACd,IAAI,CAAwB;IAC5B,eAAe,GAAG,IAAI,GAAG,EAA4B,CAAC;IAEvE,YAAY,IAA2B;QACrC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,SAAS,CAAC,GAAe;QACvB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACrE,MAAM,gBAAgB,GAAG,WAAW,CAAC,aAAa,CAAC,CAAC;QACpD,IAAI,gBAAgB,IAAI,IAAI,IAAI,aAAa,EAAE,CAAC;YAC9C,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,yEAAyE,EAAE;gBAChG,GAAG,EAAE,aAAa;aACnB,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,kBAAkB,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,YAAY,CAAC,MAAc;QACzB,OAAO,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;IAC1B,CAAC;IAED;;;;;;OAMG;IACH,eAAe;QACb,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3D,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IAED;;;;;;OAMG;IACH,QAAQ,CAAC,QAAkC;QACzC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACnC,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACrD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,eAAe,CAAC,MAAc,EAAE,OAAe;QACnD,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAC7D,OAAO,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAC7C,CAAC;IAED;0CACsC;IAC9B,KAAK,CAAC,oBAAoB,CAAC,QAAyB;QAC1D,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;QAC5B,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;QAC/B,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YACtE,yEAAyE;YACzE,2EAA2E;YAC3E,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAC5B,MAAM,CAAC,MAAM,EACb,8CAA8C,CAC/C,CAAC;gBACJ,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,+BAA+B,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChF,CAAC;YACH,CAAC;YACD,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC/B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;QAC7C,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,KAAK,cAAc;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;QAC/E,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;QAClG,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;QAChG,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;QACxG,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;QACnG,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC;IAChF,CAAC;IAEO,UAAU,CAAC,MAAc;QAC/B,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAC5C,IAAI,CAAC;gBACH,QAAQ,CAAC,MAAM,CAAC,CAAC;YACnB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,+BAA+B,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChF,CAAC;QACH,CAAC;IACH,CAAC;IAED,iCAAiC;IACjC,KAAK,CAAC,kBAAkB,CAAC,GAAY;QACnC,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;QAC5B,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,4EAA4E;QAC5E,6EAA6E;QAC7E,8EAA8E;QAC9E,0EAA0E;QAC1E,4EAA4E;QAC5E,qCAAqC;QACrC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,oBAAoB,EAAE,CAAC;YAC9C,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtE,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAC3D,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;oBAClD,MAAM,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAClC,CAAC;gBACD,OAAO;YACT,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAoB,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAClE,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;QAC5B,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;QAC/B,IAAI,MAAM,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YACnC,MAAM,GAAG,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;YACnD,OAAO;QACT,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC1D,MAAM,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"pairing-handler.js","sourceRoot":"","sources":["../../src/channel/pairing-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** The slice of grammy's `Api` a text message needs (the real client satisfies it). */
|
|
2
|
+
export interface TelegramSender {
|
|
3
|
+
sendMessage(chatId: number, text: string, opts?: {
|
|
4
|
+
parse_mode?: 'HTML' | 'MarkdownV2' | 'Markdown';
|
|
5
|
+
link_preview_options?: {
|
|
6
|
+
is_disabled: boolean;
|
|
7
|
+
};
|
|
8
|
+
}): Promise<unknown>;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Send Markdown with the same rich look as interactive replies (bold, code,
|
|
12
|
+
* callouts, spoilers), split to Telegram's size cap. A part Telegram can't
|
|
13
|
+
* parse (rare) goes out as plain text instead. Returns how many messages went out.
|
|
14
|
+
*/
|
|
15
|
+
export declare function sendMarkdown(api: TelegramSender, chatId: number, markdown: string): Promise<number>;
|
|
16
|
+
//# sourceMappingURL=send-rich.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send-rich.d.ts","sourceRoot":"","sources":["../../src/channel/send-rich.ts"],"names":[],"mappings":"AAKA,uFAAuF;AACvF,MAAM,WAAW,cAAc;IAC7B,WAAW,CACT,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE;QACL,UAAU,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,UAAU,CAAC;QAChD,oBAAoB,CAAC,EAAE;YAAE,WAAW,EAAE,OAAO,CAAA;SAAE,CAAC;KACjD,GACA,OAAO,CAAC,OAAO,CAAC,CAAC;CACrB;AAID;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAWzG"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { GrammyError } from 'grammy';
|
|
2
|
+
import { markdownToTelegramHtml } from '../format.js';
|
|
3
|
+
import { splitForTelegram } from '../render.js';
|
|
4
|
+
import { stripHtml } from './html.js';
|
|
5
|
+
const PARSE_ERROR = /can't parse entities|Bad Request: can't parse/i;
|
|
6
|
+
/**
|
|
7
|
+
* Send Markdown with the same rich look as interactive replies (bold, code,
|
|
8
|
+
* callouts, spoilers), split to Telegram's size cap. A part Telegram can't
|
|
9
|
+
* parse (rare) goes out as plain text instead. Returns how many messages went out.
|
|
10
|
+
*/
|
|
11
|
+
export async function sendMarkdown(api, chatId, markdown) {
|
|
12
|
+
const parts = splitForTelegram(markdownToTelegramHtml(markdown));
|
|
13
|
+
for (const part of parts) {
|
|
14
|
+
try {
|
|
15
|
+
await api.sendMessage(chatId, part, { parse_mode: 'HTML', link_preview_options: { is_disabled: true } });
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
if (!(err instanceof GrammyError && PARSE_ERROR.test(err.description ?? '')))
|
|
19
|
+
throw err;
|
|
20
|
+
await api.sendMessage(chatId, stripHtml(part));
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return parts.length;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=send-rich.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send-rich.js","sourceRoot":"","sources":["../../src/channel/send-rich.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AActC,MAAM,WAAW,GAAG,gDAAgD,CAAC;AAErE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAmB,EAAE,MAAc,EAAE,QAAgB;IACtF,MAAM,KAAK,GAAG,gBAAgB,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC,CAAC;IACjE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,oBAAoB,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QAC3G,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,CAAC,GAAG,YAAY,WAAW,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;gBAAE,MAAM,GAAG,CAAC;YACxF,MAAM,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,CAAC;AACtB,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type Bot, type Context } from 'grammy';
|
|
2
2
|
import type { ClientSession as Session } from '@moxxy/sdk';
|
|
3
|
+
import type { TelegramModel } from './model.js';
|
|
3
4
|
/**
|
|
4
5
|
* Install guidance shown when enabling `/voice` with no active synthesizer —
|
|
5
6
|
* mirrors the voice-handler's transcriber guidance wording, pointing at the TTS
|
|
@@ -8,20 +9,21 @@ import type { ClientSession as Session } from '@moxxy/sdk';
|
|
|
8
9
|
export declare const VOICE_NO_SYNTH_HINT = "No text-to-speech backend is configured yet, so replies stay text-only. Install one with `moxxy plugins install tts-openai` and run `moxxy login openai` (or set OPENAI_API_KEY) to enable spoken replies.";
|
|
9
10
|
export interface SlashState {
|
|
10
11
|
readonly session: Session | null;
|
|
11
|
-
readonly model: string | undefined;
|
|
12
|
-
readonly activeModelOverride: string | null;
|
|
13
|
-
readonly yolo: boolean;
|
|
14
12
|
/** Whether voice replies are currently enabled (backs `/voice status`). */
|
|
15
13
|
readonly voiceReplies: boolean;
|
|
16
14
|
}
|
|
17
15
|
export interface SlashCallbacks {
|
|
18
|
-
/**
|
|
19
|
-
toggleYolo(): boolean
|
|
16
|
+
/** Switch the conversation's shared auto-approve; returns its new value. */
|
|
17
|
+
toggleYolo(): Promise<boolean>;
|
|
20
18
|
/** Persist + apply the voice-replies preference (backs `/voice on|off`). */
|
|
21
19
|
setVoiceReplies(on: boolean): Promise<void>;
|
|
20
|
+
/** This bot's own model (`/model`). */
|
|
21
|
+
readonly model: Pick<TelegramModel, 'run' | 'choices'>;
|
|
22
22
|
/** Apply a `session-action` result emitted from a registered command. */
|
|
23
23
|
performSessionAction(ctx: Context, action: 'new' | 'clear' | 'exit', notice: string | undefined): Promise<void>;
|
|
24
24
|
}
|
|
25
|
+
/** Telegram bots have no calls; a voice message is the way to talk. */
|
|
26
|
+
export declare const NO_CALLS_REPLY = "Telegram does not let bots take or place calls. Send me a voice message instead \u2014 I will answer with one.";
|
|
25
27
|
/**
|
|
26
28
|
* Slash-command dispatcher for the Telegram channel.
|
|
27
29
|
*
|
|
@@ -31,7 +33,7 @@ export interface SlashCallbacks {
|
|
|
31
33
|
* commands without needing a switch case here.
|
|
32
34
|
*
|
|
33
35
|
* Falls through to channel-local cases for Telegram-specific UI
|
|
34
|
-
* (model/
|
|
36
|
+
* (model/mode pickers as inline keyboards, /auto-approve, /tools and
|
|
35
37
|
* /skills as text dumps).
|
|
36
38
|
*/
|
|
37
39
|
export declare function runSlash(ctx: Context, text: string, state: SlashState, cb: SlashCallbacks): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slash-handler.d.ts","sourceRoot":"","sources":["../../src/channel/slash-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,GAAG,EAAE,KAAK,OAAO,EAAkB,MAAM,QAAQ,CAAC;AAEhE,OAAO,KAAK,EAAE,aAAa,IAAI,OAAO,EAAE,MAAM,YAAY,CAAC;AAG3D;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,+MAC8K,CAAC;AAE/M,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACjC,
|
|
1
|
+
{"version":3,"file":"slash-handler.d.ts","sourceRoot":"","sources":["../../src/channel/slash-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,GAAG,EAAE,KAAK,OAAO,EAAkB,MAAM,QAAQ,CAAC;AAEhE,OAAO,KAAK,EAAE,aAAa,IAAI,OAAO,EAAE,MAAM,YAAY,CAAC;AAG3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,+MAC8K,CAAC;AAE/M,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACjC,2EAA2E;IAC3E,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,cAAc;IAC7B,4EAA4E;IAC5E,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/B,4EAA4E;IAC5E,eAAe,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,uCAAuC;IACvC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,KAAK,GAAG,SAAS,CAAC,CAAC;IACvD,yEAAyE;IACzE,oBAAoB,CAClB,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,KAAK,GAAG,OAAO,GAAG,MAAM,EAChC,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB;AAED,uEAAuE;AACvE,eAAO,MAAM,cAAc,mHACkF,CAAC;AAE9G;;;;;;;;;;;GAWG;AACH,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,cAAc,GACjB,OAAO,CAAC,IAAI,CAAC,CA6Ff;AAmCD;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,GAAG,GAAG,IAAI,EACf,OAAO,EAAE,OAAO,GAAG,IAAI,EACvB,MAAM,CAAC,EAAE;IAAE,IAAI,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;CAAE,GACpE,OAAO,CAAC,IAAI,CAAC,CAiCf"}
|