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.
- package/dist/agent/heartbeat-manager.d.ts +1 -0
- package/dist/agent/heartbeat-manager.d.ts.map +1 -1
- package/dist/agent/heartbeat-manager.js +10 -3
- package/dist/agent/heartbeat-manager.js.map +1 -1
- package/dist/billing/payment-handler.d.ts +24 -0
- package/dist/billing/payment-handler.d.ts.map +1 -0
- package/dist/billing/payment-handler.js +106 -0
- package/dist/billing/payment-handler.js.map +1 -0
- package/dist/billing/types.d.ts +33 -0
- package/dist/billing/types.d.ts.map +1 -0
- package/dist/billing/types.js +12 -0
- package/dist/billing/types.js.map +1 -0
- package/dist/channels/interface.d.ts +10 -0
- package/dist/channels/interface.d.ts.map +1 -1
- package/dist/channels/manager.d.ts +10 -0
- package/dist/channels/manager.d.ts.map +1 -1
- package/dist/channels/manager.js +24 -0
- package/dist/channels/manager.js.map +1 -1
- package/dist/channels/telegram.d.ts +20 -0
- package/dist/channels/telegram.d.ts.map +1 -1
- package/dist/channels/telegram.js +112 -1
- package/dist/channels/telegram.js.map +1 -1
- package/dist/onboarding/onboarding-service-client.d.ts +7 -0
- package/dist/onboarding/onboarding-service-client.d.ts.map +1 -1
- package/dist/onboarding/onboarding-service-client.js +29 -0
- package/dist/onboarding/onboarding-service-client.js.map +1 -1
- package/dist-agent/bundle.cjs +294 -54
- package/package.json +1 -1
- package/scripts/setup-openclaw-shim.mjs +16 -4
|
@@ -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;
|
|
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":"AAAA;;;;;;GAMG;AAIH,OAAO,EACL,uBAAuB,GAExB,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAA2B,MAAM,oBAAoB,CAAC;AACnF,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,0BAA0B,GAAG,MAAM,CAAC;AAE1C,SAAS,4BAA4B,CACnC,MAAwB,EACxB,UAIC;IAED,IAAI,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC;IAE9B,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,oEAAoE;IACpE,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QACzB,OAAO,GAAG,qBAAqB,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC;IACtE,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;QACzD,MAAM,UAAU,GAAG,uBAAuB,CAAC,UAAU,CAAC,cAAc,EAAE,UAAU,CAAC,kBAAkB,CAAC,CAAC;QACrG,IAAI,UAAU,EAAE,CAAC;YACf,uBAAuB,EAAE,CAAC;YAC1B,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,OAAO,gBAAgB;IACnB,MAAM,GAAmC,IAAI,CAAC;IAC7C,iBAAiB,CAAoB;IACtC,YAAY,GAA0C,IAAI,CAAC;IAClD,MAAM,CAAmB;
|
|
1
|
+
{"version":3,"file":"heartbeat-manager.js","sourceRoot":"","sources":["../../src/agent/heartbeat-manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EACL,uBAAuB,GAExB,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAA2B,MAAM,oBAAoB,CAAC;AACnF,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,0BAA0B,GAAG,MAAM,CAAC;AAE1C,SAAS,4BAA4B,CACnC,MAAwB,EACxB,eAAsC,EACtC,UAIC;IAED,IAAI,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC;IAE9B,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,oEAAoE;IACpE,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QACzB,OAAO,GAAG,qBAAqB,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC;IACtE,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;QACzD,MAAM,UAAU,GAAG,uBAAuB,CAAC,UAAU,CAAC,cAAc,EAAE,UAAU,CAAC,kBAAkB,CAAC,CAAC;QACrG,IAAI,UAAU,EAAE,CAAC;YACf,uBAAuB,EAAE,CAAC;YAC1B,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,OAAO,gBAAgB;IACnB,MAAM,GAAmC,IAAI,CAAC;IAC7C,iBAAiB,CAAoB;IACtC,YAAY,GAA0C,IAAI,CAAC;IAClD,MAAM,CAAmB;IAClC,cAAc,GAA0B,IAAI,CAAC;IAErD,YAAY,MAAwB;QAClC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,iBAAiB,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACjD,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,cAAc,EAAE,wBAAwB,CAAC,MAAM,CAAC,CAAC,CAAC;QACzF,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,SAAS,EAAE,oBAAoB,EAAE,CAAC,CAAC;QAC1E,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,OAAO,EAAE,kBAAkB,EAAE,CAAC,CAAC;IACxE,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,IAAI,CACR,cAA8B,EAC9B,cAAkC,EAClC,YAAuC;QAEvC,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QAErC,mDAAmD;QACnD,IAAI,YAAY,EAAE,SAAS,KAAK,SAAS,EAAE,CAAC;YAC1C,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC;gBAC9B,SAAS,EAAE,YAAY,CAAC,SAAS;gBACjC,MAAM,EAAE,WAAW;gBACnB,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC;oBACrB,OAAO,EAAE,sBAAsB,YAAY,CAAC,WAAW,MAAM,YAAY,CAAC,SAAS,EAAE;iBACtF,CAAC;aACH,CAAC,CAAC;YACH,MAAM,CAAC,MAAM,CACX,uCAAuC,YAAY,CAAC,SAAS,KAAK,YAAY,CAAC,WAAW,MAAM,YAAY,CAAC,SAAS,GAAG,CAC1H,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,oBAAoB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,uBAAuB,EAAE,CAAC;YAC9E,OAAO;QACT,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,IAAI,uBAAuB,CACvC,IAAI,CAAC,MAAM,CAAC,oBAAoB,EAChC,IAAI,CAAC,MAAM,CAAC,SAAS,EACrB,IAAI,CAAC,MAAM,CAAC,uBAAuB,CACpC,CAAC;QAEF,MAAM,cAAc,GAAqB;YACvC,OAAO,EAAE,iBAAiB,EAAE;YAC5B,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;YACxB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;YAC9B,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACpC,IAAI,EAAE,KAAK;YACX,kBAAkB,EAAE,oBAAoB,EAAE;SAC3C,CAAC;QAEF,8EAA8E;QAC9E,IAAI,cAAc,EAAE,CAAC;YACnB,IAAI,CAAC,iBAAiB,CAAC,eAAe,CACpC,kBAAkB,EAClB,oBAAoB,CAAC,cAAc,EAAE,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,CAClE,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;YACtE,MAAM,CAAC,MAAM,CAAC,qDAAqD,CAAC,CAAC;YACrE,IAAI,4BAA4B,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,CAAC;gBAC5F,MAAM,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,GAAG,CACR,iDAAiD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACpG,CAAC;YACF,IAAI,CAAC;gBACH,IAAI,cAAc,EAAE,CAAC;oBACnB,MAAM,cAAc,CAAC,WAAW,CAC9B,UAAU,EACV,MAAM,CAAC,cAAc,CAAC,EACtB,wEAAwE,CACzE,CAAC;gBACJ,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,2BAA2B;YAC7B,CAAC;YACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;IAED,4CAA4C;IAC5C,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,MAAM,CAAC,IAAa;QACxB,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QAEzB,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;gBACvC,OAAO,EAAE,iBAAiB,EAAE;gBAC5B,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;gBACxB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAC9B,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACpC,IAAI;gBACJ,kBAAkB,EAAE,oBAAoB,EAAE;gBAC1C,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAClD,CAAC,CAAC;YACH,IAAI,IAAI,EAAE,eAAe,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7D,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACxD,CAAC;YACD,IAAI,4BAA4B,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC;gBACrF,MAAM,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,kEAAkE;YAClE,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;gBAAE,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,iBAAiB;QACf,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QAEzB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;YACnC,QAAQ,CAAC,SAAS,CAAC;gBACjB,OAAO,EAAE,iBAAiB,EAAE;gBAC5B,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;gBACxB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAC9B,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACpC,IAAI,EAAE,IAAI;gBACV,kBAAkB,EAAE,oBAAoB,EAAE;aAC3C,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;gBACZ,iBAAiB;YACnB,CAAC,CAAC,CAAC;QACL,CAAC,EAAE,0BAA0B,CAAC,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,gBAAgB;QACd,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI,EAAE,CAAC;YAC/B,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACjC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;gBACpB,OAAO,EAAE,iBAAiB,EAAE;gBAC5B,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;gBACxB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAC9B,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACpC,IAAI,EAAE,KAAK;gBACX,kBAAkB,EAAE,oBAAoB,EAAE;aAC3C,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;gBACZ,iBAAiB;YACnB,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF"}
|
|
@@ -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,
|
|
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"}
|
package/dist/channels/manager.js
CHANGED
|
@@ -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":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;
|
|
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;
|
|
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
|
|
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
|