visionclaw 0.1.177 → 0.1.178-beta.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.
@@ -14,6 +14,7 @@ export declare class HeartbeatManager {
14
14
  readonly commandDispatcher: CommandDispatcher;
15
15
  private busyInterval;
16
16
  private readonly config;
17
+ private channelManager;
17
18
  constructor(config: VisionClawConfig);
18
19
  /**
19
20
  * Initialize the heartbeat client and validate the API key.
@@ -1 +1 @@
1
- {"version":3,"file":"heartbeat-manager.d.ts","sourceRoot":"","sources":["../../src/agent/heartbeat-manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAK7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,OAAO,EAAwB,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAuCnF,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAwC;IACtD,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;IAC9C,OAAO,CAAC,YAAY,CAA+C;IACnE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;gBAE9B,MAAM,EAAE,gBAAgB;IAQpC;;;;OAIG;IACG,IAAI,CACR,cAAc,EAAE,cAAc,EAC9B,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,YAAY,EAAE,kBAAkB,GAAG,IAAI,GACtC,OAAO,CAAC,IAAI,CAAC;IA2DhB,4CAA4C;IAC5C,IAAI,OAAO,IAAI,OAAO,CAErB;IAED;;;OAGG;IACG,MAAM,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IA0B1C;;;OAGG;IACH,iBAAiB,IAAI,IAAI;IAkBzB;;;OAGG;IACH,gBAAgB,IAAI,IAAI;CAmBzB"}
1
+ {"version":3,"file":"heartbeat-manager.d.ts","sourceRoot":"","sources":["../../src/agent/heartbeat-manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAK7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,OAAO,EAAwB,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAyCnF,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAwC;IACtD,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;IAC9C,OAAO,CAAC,YAAY,CAA+C;IACnE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,cAAc,CAA+B;gBAEzC,MAAM,EAAE,gBAAgB;IAQpC;;;;OAIG;IACG,IAAI,CACR,cAAc,EAAE,cAAc,EAC9B,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,YAAY,EAAE,kBAAkB,GAAG,IAAI,GACtC,OAAO,CAAC,IAAI,CAAC;IAqEhB,4CAA4C;IAC5C,IAAI,OAAO,IAAI,OAAO,CAErB;IAED;;;OAGG;IACG,MAAM,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IA0B1C;;;OAGG;IACH,iBAAiB,IAAI,IAAI;IAkBzB;;;OAGG;IACH,gBAAgB,IAAI,IAAI;CAmBzB"}
@@ -12,12 +12,13 @@ import { isOnboardingComplete } from "../config/index.js";
12
12
  import { createCollectDataHandler } from "./data-collector.js";
13
13
  import { createUpgradeHandler } from "./upgrade-handler.js";
14
14
  import { createUsageHandler } from "./usage-handler.js";
15
+ import { createPaymentHandler } from "../billing/payment-handler.js";
15
16
  import { setSharedGeminiApiKey } from "../gemini-credentials.js";
16
17
  import { setSharedTosCredentials } from "../tos-credentials.js";
17
18
  import { resetArchiveConfigCache } from "./image-archive.js";
18
19
  import { logger } from "../logger.js";
19
20
  const BUSY_HEARTBEAT_INTERVAL_MS = 30_000;
20
- function applySharedKeysFromHeartbeat(config, sharedKeys) {
21
+ function applySharedKeysFromHeartbeat(config, _channelManager, sharedKeys) {
21
22
  if (!sharedKeys)
22
23
  return false;
23
24
  let updated = false;
@@ -39,6 +40,7 @@ export class HeartbeatManager {
39
40
  commandDispatcher;
40
41
  busyInterval = null;
41
42
  config;
43
+ channelManager = null;
42
44
  constructor(config) {
43
45
  this.config = config;
44
46
  this.commandDispatcher = new CommandDispatcher();
@@ -52,6 +54,7 @@ export class HeartbeatManager {
52
54
  * are silently disabled.
53
55
  */
54
56
  async init(channelManager, telegramChatId, justUpgraded) {
57
+ this.channelManager = channelManager;
55
58
  // Queue synthetic ack for a just-completed upgrade
56
59
  if (justUpgraded?.commandId !== undefined) {
57
60
  this.commandDispatcher.queueAck({
@@ -75,10 +78,14 @@ export class HeartbeatManager {
75
78
  busy: false,
76
79
  onboardingComplete: isOnboardingComplete(),
77
80
  };
81
+ // Register payment handler now that we have channelManager and service client
82
+ if (telegramChatId) {
83
+ this.commandDispatcher.registerHandler("payment_required", createPaymentHandler(channelManager, telegramChatId, this.client));
84
+ }
78
85
  try {
79
86
  const startupResp = await this.client.heartbeatStrict(startupPayload);
80
87
  logger.system("Runtime heartbeat: initial key validation succeeded");
81
- if (applySharedKeysFromHeartbeat(this.config, startupResp?.sharedKeys)) {
88
+ if (applySharedKeysFromHeartbeat(this.config, this.channelManager, startupResp?.sharedKeys)) {
82
89
  logger.debug("Shared keys applied from startup heartbeat");
83
90
  }
84
91
  }
@@ -120,7 +127,7 @@ export class HeartbeatManager {
120
127
  if (resp?.pendingCommands && resp.pendingCommands.length > 0) {
121
128
  this.commandDispatcher.dispatch(resp.pendingCommands);
122
129
  }
123
- if (applySharedKeysFromHeartbeat(this.config, resp?.sharedKeys)) {
130
+ if (applySharedKeysFromHeartbeat(this.config, this.channelManager, resp?.sharedKeys)) {
124
131
  logger.debug("Shared keys updated from heartbeat");
125
132
  }
126
133
  }
@@ -1 +1 @@
1
- {"version":3,"file":"heartbeat-manager.js","sourceRoot":"","sources":["../../src/agent/heartbeat-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"heartbeat-manager.js","sourceRoot":"","sources":["../../src/agent/heartbeat-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Payment command handler for the `payment_required` heartbeat command.
3
+ *
4
+ * This is deterministic bot code u2014 the LLM agent is never involved in
5
+ * payment flows. The handler:
6
+ *
7
+ * 1. Receives `payment_required` from the backend via heartbeat (includes plans)
8
+ * 2. Sends a plan selection prompt (inline keyboard) to the owner via Telegram
9
+ * 3. Listens for `billing_plan_selected` events from the Telegram adapter
10
+ * 4. Calls the backend to create a Stripe Checkout Session
11
+ * 5. Sends the checkout URL back to the owner as a URL button
12
+ */
13
+ import type { CommandHandler } from "../agent/command-dispatcher.js";
14
+ import type { ChannelManager } from "../channels/manager.js";
15
+ import type { OnboardingServiceClient } from "../onboarding/onboarding-service-client.js";
16
+ /**
17
+ * Create a CommandHandler for the "payment_required" heartbeat command.
18
+ *
19
+ * @param channelManager - To send payment prompts and listen for billing events
20
+ * @param ownerChatId - The owner's Telegram chat ID
21
+ * @param serviceClient - Optional onboarding service client for creating checkout sessions
22
+ */
23
+ export declare function createPaymentHandler(channelManager: ChannelManager, ownerChatId: number, serviceClient: OnboardingServiceClient | null): CommandHandler;
24
+ //# sourceMappingURL=payment-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment-handler.d.ts","sourceRoot":"","sources":["../../src/billing/payment-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4CAA4C,CAAC;AAW1F;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,uBAAuB,GAAG,IAAI,GAC5C,cAAc,CAiHhB"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Payment command handler for the `payment_required` heartbeat command.
3
+ *
4
+ * This is deterministic bot code u2014 the LLM agent is never involved in
5
+ * payment flows. The handler:
6
+ *
7
+ * 1. Receives `payment_required` from the backend via heartbeat (includes plans)
8
+ * 2. Sends a plan selection prompt (inline keyboard) to the owner via Telegram
9
+ * 3. Listens for `billing_plan_selected` events from the Telegram adapter
10
+ * 4. Calls the backend to create a Stripe Checkout Session
11
+ * 5. Sends the checkout URL back to the owner as a URL button
12
+ */
13
+ import { logger } from "../logger.js";
14
+ const MAX_CHECKOUT_RETRIES = 2;
15
+ const RETRY_DELAY_MS = 2_000;
16
+ function sleep(ms) {
17
+ return new Promise((resolve) => setTimeout(resolve, ms));
18
+ }
19
+ /**
20
+ * Create a CommandHandler for the "payment_required" heartbeat command.
21
+ *
22
+ * @param channelManager - To send payment prompts and listen for billing events
23
+ * @param ownerChatId - The owner's Telegram chat ID
24
+ * @param serviceClient - Optional onboarding service client for creating checkout sessions
25
+ */
26
+ export function createPaymentHandler(channelManager, ownerChatId, serviceClient) {
27
+ // Wire up plan selection listener (once)
28
+ let listenerAttached = false;
29
+ function ensurePlanSelectedListener() {
30
+ if (listenerAttached)
31
+ return;
32
+ listenerAttached = true;
33
+ channelManager.on("billing_plan_selected", (event) => {
34
+ void handlePlanSelected(event);
35
+ });
36
+ }
37
+ async function handlePlanSelected(event) {
38
+ if (!serviceClient) {
39
+ logger.warn("[billing] No service client u2014 cannot create checkout session");
40
+ await channelManager.sendMessage("telegram", String(event.chatId), "Payment is not configured. Please contact support.");
41
+ return;
42
+ }
43
+ logger.system(`[billing] Plan selected: ${event.planId} by chat ${event.chatId}`);
44
+ // Retry loop for creating checkout session
45
+ for (let attempt = 0; attempt <= MAX_CHECKOUT_RETRIES; attempt++) {
46
+ try {
47
+ const result = await serviceClient.createCheckoutSession(event.planId, event.chatId);
48
+ if (result?.checkoutUrl) {
49
+ await channelManager.sendTelegramCheckoutLink(event.chatId, event.planName, result.checkoutUrl);
50
+ logger.system(`[billing] Checkout URL sent to chat ${event.chatId} for plan ${event.planId}`);
51
+ return;
52
+ }
53
+ // null result u2014 backend call failed
54
+ if (attempt < MAX_CHECKOUT_RETRIES) {
55
+ logger.warn(`[billing] Checkout session attempt ${attempt + 1} failed, retrying...`);
56
+ await channelManager.sendMessage("telegram", String(event.chatId), "Payment setup failed, retrying...");
57
+ await sleep(RETRY_DELAY_MS);
58
+ }
59
+ }
60
+ catch (err) {
61
+ const errMsg = err instanceof Error ? err.message : String(err);
62
+ logger.err(`[billing] Checkout session attempt ${attempt + 1} error: ${errMsg}`);
63
+ if (attempt < MAX_CHECKOUT_RETRIES) {
64
+ await sleep(RETRY_DELAY_MS);
65
+ }
66
+ }
67
+ }
68
+ // All retries exhausted
69
+ logger.err("[billing] All checkout session attempts failed");
70
+ await channelManager.sendMessage("telegram", String(event.chatId), "Payment setup failed. Please try again later.");
71
+ }
72
+ return async (_commandId, payload) => {
73
+ ensurePlanSelectedListener();
74
+ // Backend just signals "payment needed" with plans
75
+ const raw = (payload ?? {});
76
+ const plans = Array.isArray(raw.plans) ? raw.plans : [];
77
+ if (plans.length === 0) {
78
+ logger.warn("[billing] payment_required received with no plans");
79
+ return {
80
+ status: "failed",
81
+ result: JSON.stringify({ error: "No plans in payload" }),
82
+ };
83
+ }
84
+ const typedPayload = {
85
+ message: typeof raw.message === "string" ? raw.message : undefined,
86
+ plans,
87
+ };
88
+ logger.system(`[billing] Payment required received with ${typedPayload.plans.length} plan(s)`);
89
+ try {
90
+ await channelManager.sendTelegramPaymentPrompt(ownerChatId, typedPayload);
91
+ return {
92
+ status: "completed",
93
+ result: JSON.stringify({ message: "Payment prompt sent to owner" }),
94
+ };
95
+ }
96
+ catch (err) {
97
+ const errMsg = err instanceof Error ? err.message : String(err);
98
+ logger.err(`[billing] Failed to send payment prompt: ${errMsg}`);
99
+ return {
100
+ status: "failed",
101
+ result: JSON.stringify({ error: errMsg }),
102
+ };
103
+ }
104
+ };
105
+ }
106
+ //# sourceMappingURL=payment-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment-handler.js","sourceRoot":"","sources":["../../src/billing/payment-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Types for the billing / payment system.
3
+ *
4
+ * Stripe Checkout Sessions for recurring subscriptions.
5
+ * Plans are served from the backend via the payment_required heartbeat command.
6
+ */
7
+ /**
8
+ * A plan delivered by the backend in the payment_required payload.
9
+ */
10
+ export interface BillingPlan {
11
+ id: string;
12
+ name: string;
13
+ amount: number;
14
+ currency: string;
15
+ description: string;
16
+ }
17
+ /**
18
+ * Payload carried by the `payment_required` heartbeat command.
19
+ * The backend determines when payment is needed and sends this,
20
+ * including the available plans from the billing_plans table.
21
+ */
22
+ export interface PaymentRequiredPayload {
23
+ /** Optional message from backend to display to the user */
24
+ message?: string;
25
+ /** Available subscription plans (populated by the backend) */
26
+ plans: BillingPlan[];
27
+ }
28
+ /**
29
+ * Callback data prefixes used in Telegram inline keyboard buttons.
30
+ */
31
+ export declare const BILLING_CALLBACK_PREFIX = "billing:";
32
+ export declare const BILLING_PLAN_CALLBACK_PREFIX = "billing:plan:";
33
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/billing/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACrC,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AAED;;GAEG;AACH,eAAO,MAAM,uBAAuB,aAAa,CAAC;AAClD,eAAO,MAAM,4BAA4B,kBAAkB,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Types for the billing / payment system.
3
+ *
4
+ * Stripe Checkout Sessions for recurring subscriptions.
5
+ * Plans are served from the backend via the payment_required heartbeat command.
6
+ */
7
+ /**
8
+ * Callback data prefixes used in Telegram inline keyboard buttons.
9
+ */
10
+ export const BILLING_CALLBACK_PREFIX = "billing:";
11
+ export const BILLING_PLAN_CALLBACK_PREFIX = "billing:plan:";
12
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/billing/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAyBH;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,UAAU,CAAC;AAClD,MAAM,CAAC,MAAM,4BAA4B,GAAG,eAAe,CAAC"}
@@ -146,6 +146,15 @@ export interface TasksRequest {
146
146
  channel: string;
147
147
  sender: string;
148
148
  }
149
+ /**
150
+ * Payload emitted when the owner selects a billing plan via inline keyboard.
151
+ * The payment handler uses this to create a Stripe Checkout Session.
152
+ */
153
+ export interface BillingPlanSelectedEvent {
154
+ chatId: number;
155
+ planId: string;
156
+ planName: string;
157
+ }
149
158
  /**
150
159
  * Events emitted by channel adapters.
151
160
  */
@@ -165,6 +174,7 @@ export interface ChannelEvents {
165
174
  screenshot_request: (req: ScreenshotRequest) => void;
166
175
  upgrade_beta_request: (req: UpgradeBetaRequest) => void;
167
176
  tasks_request: (req: TasksRequest) => void;
177
+ billing_plan_selected: (event: BillingPlanSelectedEvent) => void;
168
178
  error: (err: Error) => void;
169
179
  }
170
180
  //# sourceMappingURL=interface.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/channels/interface.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/channels/interface.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { EventEmitter } from "node:events";
2
2
  import type { VisionClawConfig } from "../config/types.js";
3
3
  import type { ChannelAdapter, MessageAttachment, ReplyContext } from "./interface.js";
4
+ import type { PaymentRequiredPayload } from "../billing/types.js";
4
5
  import type { MessageQueue } from "./queue.js";
5
6
  /**
6
7
  * Manages all enabled channel adapters.
@@ -37,6 +38,15 @@ export declare class ChannelManager extends EventEmitter {
37
38
  * are only accepted from the owner.
38
39
  */
39
40
  setTelegramOwnerUserId(id: number): void;
41
+ /**
42
+ * Send a payment prompt via the Telegram adapter.
43
+ * Shows inline keyboard with plan choices from the backend.
44
+ */
45
+ sendTelegramPaymentPrompt(chatId: number, payload: PaymentRequiredPayload): Promise<void>;
46
+ /**
47
+ * Send a Stripe Checkout link via the Telegram adapter.
48
+ */
49
+ sendTelegramCheckoutLink(chatId: number, planName: string, checkoutUrl: string): Promise<void>;
40
50
  /**
41
51
  * Update the Discord adapter's allowed channel IDs.
42
52
  * Called after owner onboarding completes with IDs from owner.json.
@@ -1 +1 @@
1
- {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/channels/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,KAAK,EAAE,cAAc,EAAkB,iBAAiB,EAAE,YAAY,EAAiO,MAAM,gBAAgB,CAAC;AACrU,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C;;;;GAIG;AACH,qBAAa,cAAe,SAAQ,YAAY;IAC9C,OAAO,CAAC,QAAQ,CAAqC;IACrD,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,KAAK,CAAe;gBAEhB,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,YAAY;IAMzD;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAqE9C;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAwD/B;;OAEG;IACG,WAAW,CACf,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,iBAAiB,EAAE,EACjC,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,IAAI,CAAC;IAQhB;;OAEG;IACG,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOrE;;OAEG;IACH,kBAAkB,IAAI,MAAM,EAAE;IAI9B;;;OAGG;IACH,sBAAsB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAOxC;;;OAGG;IACH,2BAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI;IAOhD;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAU/B"}
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/channels/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,KAAK,EAAE,cAAc,EAAkB,iBAAiB,EAAE,YAAY,EAA2P,MAAM,gBAAgB,CAAC;AAC/V,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C;;;;GAIG;AACH,qBAAa,cAAe,SAAQ,YAAY;IAC9C,OAAO,CAAC,QAAQ,CAAqC;IACrD,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,KAAK,CAAe;gBAEhB,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,YAAY;IAMzD;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAyE9C;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAwD/B;;OAEG;IACG,WAAW,CACf,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,iBAAiB,EAAE,EACjC,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,IAAI,CAAC;IAQhB;;OAEG;IACG,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOrE;;OAEG;IACH,kBAAkB,IAAI,MAAM,EAAE;IAI9B;;;OAGG;IACH,sBAAsB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAOxC;;;OAGG;IACG,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/F;;OAEG;IACG,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQpG;;;OAGG;IACH,2BAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI;IAOhD;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAU/B"}
@@ -65,6 +65,9 @@ export class ChannelManager extends EventEmitter {
65
65
  adapter.on("tasks_request", (req) => {
66
66
  this.emit("tasks_request", req);
67
67
  });
68
+ adapter.on("billing_plan_selected", (event) => {
69
+ this.emit("billing_plan_selected", event);
70
+ });
68
71
  adapter.on("error", (err) => {
69
72
  logger.err(`[Channel:${adapter.name}] Error: ${err.message}`);
70
73
  });
@@ -162,6 +165,27 @@ export class ChannelManager extends EventEmitter {
162
165
  adapter.setOwnerUserId(id);
163
166
  }
164
167
  }
168
+ /**
169
+ * Send a payment prompt via the Telegram adapter.
170
+ * Shows inline keyboard with plan choices from the backend.
171
+ */
172
+ async sendTelegramPaymentPrompt(chatId, payload) {
173
+ const adapter = this.adapters.get("telegram");
174
+ if (adapter && "sendPaymentPrompt" in adapter) {
175
+ await adapter
176
+ .sendPaymentPrompt(chatId, payload);
177
+ }
178
+ }
179
+ /**
180
+ * Send a Stripe Checkout link via the Telegram adapter.
181
+ */
182
+ async sendTelegramCheckoutLink(chatId, planName, checkoutUrl) {
183
+ const adapter = this.adapters.get("telegram");
184
+ if (adapter && "sendCheckoutLink" in adapter) {
185
+ await adapter
186
+ .sendCheckoutLink(chatId, planName, checkoutUrl);
187
+ }
188
+ }
165
189
  /**
166
190
  * Update the Discord adapter's allowed channel IDs.
167
191
  * Called after owner onboarding completes with IDs from owner.json.
@@ -1 +1 @@
1
- {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/channels/manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/channels/manager.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { EventEmitter } from "node:events";
2
2
  import type { VisionClawConfig } from "../config/types.js";
3
3
  import type { ChannelAdapter, MessageAttachment } from "./interface.js";
4
+ import { type PaymentRequiredPayload } from "../billing/types.js";
4
5
  /**
5
6
  * Telegram channel adapter.
6
7
  * Supports multimodal inbound (photos, documents, voice) and
@@ -14,6 +15,8 @@ export declare class TelegramAdapter extends EventEmitter implements ChannelAdap
14
15
  /** The owner's Telegram user ID (equals telegramChatId for a DM). Used to
15
16
  * authorize admin commands and always trust the owner's direct chat. */
16
17
  private _ownerUserId;
18
+ /** Cached plans from the most recent payment_required payload, used by the callback handler */
19
+ private _cachedPlans;
17
20
  constructor(config: VisionClawConfig);
18
21
  /**
19
22
  * Set the owner's Telegram user ID so that admin commands are only accepted
@@ -74,5 +77,22 @@ export declare class TelegramAdapter extends EventEmitter implements ChannelAdap
74
77
  */
75
78
  private resolveFileLink;
76
79
  private sendText;
80
+ /**
81
+ * Send a plan selection prompt with inline keyboard buttons.
82
+ * Called by the payment command handler when the backend sends payment_required.
83
+ * Plans come from the backend payload, not hardcoded.
84
+ * User taps a plan → billing_plan_selected event is emitted.
85
+ */
86
+ sendPaymentPrompt(chatId: number, payload: PaymentRequiredPayload): Promise<void>;
87
+ /**
88
+ * Send a Stripe Checkout link as a URL button.
89
+ * Called after the payment handler obtains a checkout URL from the backend.
90
+ */
91
+ sendCheckoutLink(chatId: number, planName: string, checkoutUrl: string): Promise<void>;
92
+ /**
93
+ * Handle billing-related callback queries (user tapped a plan button).
94
+ * Emits a `billing_plan_selected` event for the payment handler to pick up.
95
+ */
96
+ private handleBillingCallback;
77
97
  }
78
98
  //# sourceMappingURL=telegram.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"telegram.d.ts","sourceRoot":"","sources":["../../src/channels/telegram.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAK3C,OAAO,KAAK,EACV,gBAAgB,EAIjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,cAAc,EAAkB,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAkBxF;;;;GAIG;AACH,qBAAa,eAAgB,SAAQ,YAAa,YAAW,cAAc;IACzE,QAAQ,CAAC,IAAI,cAAc;IAC3B,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,GAAG,CAA4B;IACvC,OAAO,CAAC,cAAc,CAAoD;IAC1E;6EACyE;IACzE,OAAO,CAAC,YAAY,CAAuB;gBAE/B,MAAM,EAAE,gBAAgB;IAKpC;;;OAGG;IACH,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAIhC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YA8BR,qBAAqB;YA8CrB,sBAAsB;YAwCtB,uBAAuB;YA8BvB,mBAAmB;IA2CjC,6DAA6D;IAC7D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAC2H;IAExK;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;;OAGG;YACW,qBAAqB;IAQnC,OAAO,CAAC,oBAAoB;IAkG5B,OAAO,CAAC,gBAAgB;IAOxB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,0BAA0B;IAIlC,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,qBAAqB;IAI7B,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,uBAAuB;YAIjB,qBAAqB;YAmCrB,4BAA4B;YA0C5B,yBAAyB;IAoBvC,OAAO,CAAC,yBAAyB;IAejC,OAAO,CAAC,eAAe;YA4BT,YAAY;YA4BZ,UAAU;YA4BV,mBAAmB;YAgBnB,cAAc;YAUd,mBAAmB;YAYnB,oBAAoB;IAkB5B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAOrB,WAAW,CACf,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,iBAAiB,EAAE,GAChC,OAAO,CAAC,IAAI,CAAC;IA8EV,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAapD;;;OAGG;YACW,qBAAqB;IAwGnC;;OAEG;YACW,eAAe;YAYf,QAAQ;CAiBvB"}
1
+ {"version":3,"file":"telegram.d.ts","sourceRoot":"","sources":["../../src/channels/telegram.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAK3C,OAAO,KAAK,EACV,gBAAgB,EAIjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,cAAc,EAAkB,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAYxF,OAAO,EAGL,KAAK,sBAAsB,EAC5B,MAAM,qBAAqB,CAAC;AAO7B;;;;GAIG;AACH,qBAAa,eAAgB,SAAQ,YAAa,YAAW,cAAc;IACzE,QAAQ,CAAC,IAAI,cAAc;IAC3B,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,GAAG,CAA4B;IACvC,OAAO,CAAC,cAAc,CAAoD;IAC1E;6EACyE;IACzE,OAAO,CAAC,YAAY,CAAuB;IAC3C,+FAA+F;IAC/F,OAAO,CAAC,YAAY,CAAsG;gBAE9G,MAAM,EAAE,gBAAgB;IAKpC;;;OAGG;IACH,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAIhC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YA8BR,qBAAqB;YA8CrB,sBAAsB;YAwCtB,uBAAuB;YA8BvB,mBAAmB;IAmDjC,6DAA6D;IAC7D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAC2H;IAExK;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;;OAGG;YACW,qBAAqB;IAQnC,OAAO,CAAC,oBAAoB;IAkG5B,OAAO,CAAC,gBAAgB;IAOxB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,0BAA0B;IAIlC,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,qBAAqB;IAI7B,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,uBAAuB;YAIjB,qBAAqB;YAmCrB,4BAA4B;YA0C5B,yBAAyB;IAoBvC,OAAO,CAAC,yBAAyB;IAejC,OAAO,CAAC,eAAe;YA4BT,YAAY;YA4BZ,UAAU;YA4BV,mBAAmB;YAgBnB,cAAc;YAUd,mBAAmB;YAYnB,oBAAoB;IAkB5B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAOrB,WAAW,CACf,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,iBAAiB,EAAE,GAChC,OAAO,CAAC,IAAI,CAAC;IA8EV,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAapD;;;OAGG;YACW,qBAAqB;IAwGnC;;OAEG;YACW,eAAe;YAYf,QAAQ;IAoBtB;;;;;OAKG;IACG,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAwCvF;;;OAGG;IACG,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyB5F;;;OAGG;YACW,qBAAqB;CAqCpC"}
@@ -6,6 +6,7 @@ import { loadTelegramAccessConfig, saveTelegramAccessConfig } from "../config/in
6
6
  import { buildTelegramPreview, buildTelegramTitle, createTelegramAccessEntry, formatTelegramAccessSummary, getTelegramChatKind, serializeTelegramMessage, } from "./telegram-access.js";
7
7
  import { syncBotCommands } from "../onboarding/bot-profile.js";
8
8
  import { transcribeAudioFile } from "../tools/transcribe-audio.js";
9
+ import { BILLING_CALLBACK_PREFIX, BILLING_PLAN_CALLBACK_PREFIX, } from "../billing/types.js";
9
10
  // Enable proper fileOptions (filename, contentType) handling in node-telegram-bot-api.
10
11
  // Without this, the library ignores the fileOptions argument and emits a deprecation warning.
11
12
  // See: https://github.com/yagop/node-telegram-bot-api/blob/master/doc/usage.md#file-options-metadata
@@ -23,6 +24,8 @@ export class TelegramAdapter extends EventEmitter {
23
24
  /** The owner's Telegram user ID (equals telegramChatId for a DM). Used to
24
25
  * authorize admin commands and always trust the owner's direct chat. */
25
26
  _ownerUserId = null;
27
+ /** Cached plans from the most recent payment_required payload, used by the callback handler */
28
+ _cachedPlans = null;
26
29
  constructor(config) {
27
30
  super();
28
31
  this.config = config;
@@ -158,7 +161,14 @@ export class TelegramAdapter extends EventEmitter {
158
161
  return;
159
162
  const callbackId = query.id;
160
163
  const data = query.data;
161
- if (!callbackId || !data?.startsWith("telegram_access:")) {
164
+ if (!callbackId || !data)
165
+ return;
166
+ // Route billing callbacks separately from access-control callbacks
167
+ if (data.startsWith(BILLING_CALLBACK_PREFIX)) {
168
+ await this.handleBillingCallback(query);
169
+ return;
170
+ }
171
+ if (!data.startsWith("telegram_access:")) {
162
172
  return;
163
173
  }
164
174
  if (!this._ownerUserId || query.from.id !== this._ownerUserId) {
@@ -739,5 +749,106 @@ export class TelegramAdapter extends EventEmitter {
739
749
  await this.bot.sendMessage(chatId, message.substring(i, i + maxLength), options);
740
750
  }
741
751
  }
752
+ // ─── Billing / Telegram Payments ─────────────────────────────────────
753
+ /**
754
+ * Send a plan selection prompt with inline keyboard buttons.
755
+ * Called by the payment command handler when the backend sends payment_required.
756
+ * Plans come from the backend payload, not hardcoded.
757
+ * User taps a plan → billing_plan_selected event is emitted.
758
+ */
759
+ async sendPaymentPrompt(chatId, payload) {
760
+ if (!this.bot)
761
+ return;
762
+ const plans = payload.plans;
763
+ if (plans.length === 0) {
764
+ await this.sendText(chatId, "No subscription plans available.");
765
+ return;
766
+ }
767
+ const buttons = plans.map((plan) => [
768
+ {
769
+ text: `${plan.name} — $${plan.amount}/mo`,
770
+ callback_data: `${BILLING_PLAN_CALLBACK_PREFIX}${plan.id}`,
771
+ },
772
+ ]);
773
+ const planList = plans.map((p) => `${p.name}: ${p.description}`).join("\n");
774
+ const message = [
775
+ payload.message ?? "\ud83d\udcb3 Subscription Required",
776
+ ``,
777
+ `Choose a plan:`,
778
+ ``,
779
+ planList,
780
+ ].join("\n");
781
+ // Cache plans so the callback handler can look up plan names
782
+ this._cachedPlans = plans;
783
+ try {
784
+ await this.bot.sendMessage(chatId, message, {
785
+ reply_markup: { inline_keyboard: buttons },
786
+ });
787
+ logger.log("info", "telegram", `Sent plan selection prompt to chat ${chatId}`);
788
+ }
789
+ catch (err) {
790
+ logger.warn(`Telegram: Failed to send payment prompt: ${err instanceof Error ? err.message : String(err)}`);
791
+ }
792
+ }
793
+ /**
794
+ * Send a Stripe Checkout link as a URL button.
795
+ * Called after the payment handler obtains a checkout URL from the backend.
796
+ */
797
+ async sendCheckoutLink(chatId, planName, checkoutUrl) {
798
+ if (!this.bot)
799
+ return;
800
+ const message = [
801
+ `\ud83d\udcb3 Subscribe to ${planName}`,
802
+ ``,
803
+ `Tap the button below to complete your subscription:`,
804
+ ].join("\n");
805
+ const buttons = [
806
+ [{ text: `\ud83d\udcb3 Subscribe Now`, url: checkoutUrl }],
807
+ ];
808
+ try {
809
+ await this.bot.sendMessage(chatId, message, {
810
+ reply_markup: { inline_keyboard: buttons },
811
+ });
812
+ logger.log("info", "telegram", `Sent checkout link to chat ${chatId}`);
813
+ }
814
+ catch (err) {
815
+ logger.warn(`Telegram: Failed to send checkout link: ${err instanceof Error ? err.message : String(err)}`);
816
+ }
817
+ }
818
+ /**
819
+ * Handle billing-related callback queries (user tapped a plan button).
820
+ * Emits a `billing_plan_selected` event for the payment handler to pick up.
821
+ */
822
+ async handleBillingCallback(query) {
823
+ if (!this.bot)
824
+ return;
825
+ const callbackId = query.id;
826
+ const data = query.data;
827
+ const chatId = query.message?.chat.id;
828
+ if (!callbackId || !data || typeof chatId !== "number") {
829
+ return;
830
+ }
831
+ // Only the owner can interact with billing buttons
832
+ if (!this._ownerUserId || query.from.id !== this._ownerUserId) {
833
+ await this.answerCallbackQuery(callbackId, "Only the owner can use payment buttons.");
834
+ return;
835
+ }
836
+ // Plan selection: billing:plan:<id> → emit event for payment handler
837
+ if (data.startsWith(BILLING_PLAN_CALLBACK_PREFIX)) {
838
+ const planId = data.slice(BILLING_PLAN_CALLBACK_PREFIX.length);
839
+ const plan = this._cachedPlans?.find((p) => p.id === planId);
840
+ const planName = plan?.name ?? planId;
841
+ await this.answerCallbackQuery(callbackId, `Setting up payment for ${planName}...`);
842
+ // Keep the plan buttons so the user can change their mind and pick
843
+ // a different plan before completing payment.
844
+ this.emit("billing_plan_selected", {
845
+ chatId,
846
+ planId,
847
+ planName,
848
+ });
849
+ return;
850
+ }
851
+ await this.answerCallbackQuery(callbackId, "Unknown billing action.");
852
+ }
742
853
  }
743
854
  //# sourceMappingURL=telegram.js.map