@cann4n/actions-subscription 0.1.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.
@@ -0,0 +1,2 @@
1
+ export { SubscriptionProvider, subscriptionActions } from "./subscriptionActionProvider";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { SubscriptionProvider, subscriptionActions } from "./subscriptionActionProvider";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC"}
@@ -0,0 +1,10 @@
1
+ export declare class MockSubscriptionVault {
2
+ private subscriptions;
3
+ private nextId;
4
+ createSubscription(user: string, merchant: string, token: string, amount: bigint, intervalSeconds: number): string;
5
+ depositFunds(subscriptionId: number, amount: bigint): string;
6
+ chargeSubscription(subscriptionId: number): string;
7
+ cancelSubscription(subscriptionId: number): string;
8
+ getSubscriptionInfo(subscriptionId: number): string;
9
+ }
10
+ //# sourceMappingURL=mockSubscriptionVault.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mockSubscriptionVault.d.ts","sourceRoot":"","sources":["../src/mockSubscriptionVault.ts"],"names":[],"mappings":"AAYA,qBAAa,qBAAqB;IAChC,OAAO,CAAC,aAAa,CAAwC;IAC7D,OAAO,CAAC,MAAM,CAAa;IAE3B,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM;IAgBlH,YAAY,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAO5D,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM;IASlD,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM;IASlD,mBAAmB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM;CAYpD"}
@@ -0,0 +1,60 @@
1
+ export class MockSubscriptionVault {
2
+ subscriptions = new Map();
3
+ nextId = 1;
4
+ createSubscription(user, merchant, token, amount, intervalSeconds) {
5
+ const id = this.nextId++;
6
+ this.subscriptions.set(id, {
7
+ id,
8
+ user,
9
+ merchant,
10
+ token,
11
+ amount,
12
+ intervalSeconds,
13
+ balance: 0n,
14
+ active: true,
15
+ createdAt: Math.floor(Date.now() / 1000),
16
+ });
17
+ return `Created subscription #${id}: ${amount} of ${token} every ${intervalSeconds}s to ${merchant}`;
18
+ }
19
+ depositFunds(subscriptionId, amount) {
20
+ const sub = this.subscriptions.get(subscriptionId);
21
+ if (!sub)
22
+ return `Error: Subscription #${subscriptionId} not found`;
23
+ sub.balance += amount;
24
+ return `Deposited ${amount} into subscription #${subscriptionId}. Balance: ${sub.balance}`;
25
+ }
26
+ chargeSubscription(subscriptionId) {
27
+ const sub = this.subscriptions.get(subscriptionId);
28
+ if (!sub)
29
+ return `Error: Subscription #${subscriptionId} not found`;
30
+ if (!sub.active)
31
+ return `Error: Subscription #${subscriptionId} is cancelled`;
32
+ if (sub.balance < sub.amount)
33
+ return `Error: Insufficient balance. Need ${sub.amount}, have ${sub.balance}`;
34
+ sub.balance -= sub.amount;
35
+ return `Charged ${sub.amount} from subscription #${subscriptionId}. Remaining balance: ${sub.balance}`;
36
+ }
37
+ cancelSubscription(subscriptionId) {
38
+ const sub = this.subscriptions.get(subscriptionId);
39
+ if (!sub)
40
+ return `Error: Subscription #${subscriptionId} not found`;
41
+ sub.active = false;
42
+ const refund = sub.balance;
43
+ sub.balance = 0n;
44
+ return `Cancelled subscription #${subscriptionId}. Refunded ${refund}`;
45
+ }
46
+ getSubscriptionInfo(subscriptionId) {
47
+ const sub = this.subscriptions.get(subscriptionId);
48
+ if (!sub)
49
+ return `Error: Subscription #${subscriptionId} not found`;
50
+ return `Subscription #${sub.id}\n` +
51
+ ` User: ${sub.user}\n` +
52
+ ` Merchant: ${sub.merchant}\n` +
53
+ ` Token: ${sub.token}\n` +
54
+ ` Amount: ${sub.amount} per interval\n` +
55
+ ` Interval: ${sub.intervalSeconds}s\n` +
56
+ ` Balance: ${sub.balance}\n` +
57
+ ` Active: ${sub.active}`;
58
+ }
59
+ }
60
+ //# sourceMappingURL=mockSubscriptionVault.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mockSubscriptionVault.js","sourceRoot":"","sources":["../src/mockSubscriptionVault.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,qBAAqB;IACxB,aAAa,GAA8B,IAAI,GAAG,EAAE,CAAC;IACrD,MAAM,GAAW,CAAC,CAAC;IAE3B,kBAAkB,CAAC,IAAY,EAAE,QAAgB,EAAE,KAAa,EAAE,MAAc,EAAE,eAAuB;QACvG,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACzB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE;YACzB,EAAE;YACF,IAAI;YACJ,QAAQ;YACR,KAAK;YACL,MAAM;YACN,eAAe;YACf,OAAO,EAAE,EAAE;YACX,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;SACzC,CAAC,CAAC;QACH,OAAO,yBAAyB,EAAE,KAAK,MAAM,OAAO,KAAK,UAAU,eAAe,QAAQ,QAAQ,EAAE,CAAC;IACvG,CAAC;IAED,YAAY,CAAC,cAAsB,EAAE,MAAc;QACjD,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACnD,IAAI,CAAC,GAAG;YAAE,OAAO,wBAAwB,cAAc,YAAY,CAAC;QACpE,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC;QACtB,OAAO,aAAa,MAAM,uBAAuB,cAAc,cAAc,GAAG,CAAC,OAAO,EAAE,CAAC;IAC7F,CAAC;IAED,kBAAkB,CAAC,cAAsB;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACnD,IAAI,CAAC,GAAG;YAAE,OAAO,wBAAwB,cAAc,YAAY,CAAC;QACpE,IAAI,CAAC,GAAG,CAAC,MAAM;YAAE,OAAO,wBAAwB,cAAc,eAAe,CAAC;QAC9E,IAAI,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,MAAM;YAAE,OAAO,qCAAqC,GAAG,CAAC,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC;QAC5G,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC;QAC1B,OAAO,WAAW,GAAG,CAAC,MAAM,uBAAuB,cAAc,wBAAwB,GAAG,CAAC,OAAO,EAAE,CAAC;IACzG,CAAC;IAED,kBAAkB,CAAC,cAAsB;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACnD,IAAI,CAAC,GAAG;YAAE,OAAO,wBAAwB,cAAc,YAAY,CAAC;QACpE,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC;QACnB,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC;QAC3B,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC;QACjB,OAAO,2BAA2B,cAAc,cAAc,MAAM,EAAE,CAAC;IACzE,CAAC;IAED,mBAAmB,CAAC,cAAsB;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACnD,IAAI,CAAC,GAAG;YAAE,OAAO,wBAAwB,cAAc,YAAY,CAAC;QACpE,OAAO,iBAAiB,GAAG,CAAC,EAAE,IAAI;YAChC,WAAW,GAAG,CAAC,IAAI,IAAI;YACvB,eAAe,GAAG,CAAC,QAAQ,IAAI;YAC/B,YAAY,GAAG,CAAC,KAAK,IAAI;YACzB,aAAa,GAAG,CAAC,MAAM,iBAAiB;YACxC,eAAe,GAAG,CAAC,eAAe,KAAK;YACvC,cAAc,GAAG,CAAC,OAAO,IAAI;YAC7B,aAAa,GAAG,CAAC,MAAM,EAAE,CAAC;IAC9B,CAAC;CACF"}
@@ -0,0 +1,80 @@
1
+ import { z } from "zod";
2
+ import type { WalletProvider, StellarNetwork } from "@cann4n/core";
3
+ import { ActionProvider } from "@cann4n/core";
4
+ declare const CreateSchema: z.ZodObject<{
5
+ vaultId: z.ZodString;
6
+ merchant: z.ZodString;
7
+ token: z.ZodString;
8
+ amount: z.ZodString;
9
+ intervalSeconds: z.ZodNumber;
10
+ }, "strip", z.ZodTypeAny, {
11
+ vaultId: string;
12
+ merchant: string;
13
+ token: string;
14
+ amount: string;
15
+ intervalSeconds: number;
16
+ }, {
17
+ vaultId: string;
18
+ merchant: string;
19
+ token: string;
20
+ amount: string;
21
+ intervalSeconds: number;
22
+ }>;
23
+ declare const DepositSchema: z.ZodObject<{
24
+ vaultId: z.ZodString;
25
+ subscriptionId: z.ZodNumber;
26
+ amount: z.ZodString;
27
+ }, "strip", z.ZodTypeAny, {
28
+ vaultId: string;
29
+ amount: string;
30
+ subscriptionId: number;
31
+ }, {
32
+ vaultId: string;
33
+ amount: string;
34
+ subscriptionId: number;
35
+ }>;
36
+ declare const ChargeSchema: z.ZodObject<{
37
+ vaultId: z.ZodString;
38
+ subscriptionId: z.ZodNumber;
39
+ }, "strip", z.ZodTypeAny, {
40
+ vaultId: string;
41
+ subscriptionId: number;
42
+ }, {
43
+ vaultId: string;
44
+ subscriptionId: number;
45
+ }>;
46
+ declare const CancelSchema: z.ZodObject<{
47
+ vaultId: z.ZodString;
48
+ subscriptionId: z.ZodNumber;
49
+ }, "strip", z.ZodTypeAny, {
50
+ vaultId: string;
51
+ subscriptionId: number;
52
+ }, {
53
+ vaultId: string;
54
+ subscriptionId: number;
55
+ }>;
56
+ declare const GetInfoSchema: z.ZodObject<{
57
+ vaultId: z.ZodString;
58
+ subscriptionId: z.ZodNumber;
59
+ }, "strip", z.ZodTypeAny, {
60
+ vaultId: string;
61
+ subscriptionId: number;
62
+ }, {
63
+ vaultId: string;
64
+ subscriptionId: number;
65
+ }>;
66
+ export declare class SubscriptionProvider extends ActionProvider {
67
+ private vaults;
68
+ constructor();
69
+ private getVault;
70
+ create(_wallet: WalletProvider, args: z.infer<typeof CreateSchema>): Promise<string>;
71
+ deposit(_wallet: WalletProvider, args: z.infer<typeof DepositSchema>): Promise<string>;
72
+ charge(_wallet: WalletProvider, args: z.infer<typeof ChargeSchema>): Promise<string>;
73
+ cancel(_wallet: WalletProvider, args: z.infer<typeof CancelSchema>): Promise<string>;
74
+ getInfo(_wallet: WalletProvider, args: z.infer<typeof GetInfoSchema>): Promise<string>;
75
+ supportsNetwork(network: StellarNetwork): boolean;
76
+ }
77
+ /** Create a subscription action provider for recurring payments. */
78
+ export declare const subscriptionActions: () => SubscriptionProvider;
79
+ export {};
80
+ //# sourceMappingURL=subscriptionActionProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscriptionActionProvider.d.ts","sourceRoot":"","sources":["../src/subscriptionActionProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAAU,cAAc,EAAE,MAAM,cAAc,CAAC;AAGtD,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;EAMhB,CAAC;AAEH,QAAA,MAAM,aAAa;;;;;;;;;;;;EAIjB,CAAC;AAEH,QAAA,MAAM,YAAY;;;;;;;;;EAGhB,CAAC;AAEH,QAAA,MAAM,YAAY;;;;;;;;;EAGhB,CAAC;AAEH,QAAA,MAAM,aAAa;;;;;;;;;EAGjB,CAAC;AAEH,qBAAa,oBAAqB,SAAQ,cAAc;IACtD,OAAO,CAAC,MAAM,CAAiD;;IAM/D,OAAO,CAAC,QAAQ;IAeV,MAAM,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAkBpF,OAAO,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAYtF,MAAM,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAYpF,MAAM,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAWpF,OAAO,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAI5F,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO;CAGlD;AAED,oEAAoE;AACpE,eAAO,MAAM,mBAAmB,4BAAmC,CAAC"}
@@ -0,0 +1,133 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { z } from "zod";
11
+ import { Action, ActionProvider } from "@cann4n/core";
12
+ import { MockSubscriptionVault } from "./mockSubscriptionVault";
13
+ const CreateSchema = z.object({
14
+ vaultId: z.string().describe("Subscription vault contract address"),
15
+ merchant: z.string().describe("Merchant/recipient address"),
16
+ token: z.string().describe("Payment token contract address"),
17
+ amount: z.string().describe("Payment amount per interval"),
18
+ intervalSeconds: z.number().describe("Payment interval in seconds (e.g., 86400 for daily)"),
19
+ });
20
+ const DepositSchema = z.object({
21
+ vaultId: z.string().describe("Subscription vault contract address"),
22
+ subscriptionId: z.number().describe("Subscription ID"),
23
+ amount: z.string().describe("Amount of tokens to deposit"),
24
+ });
25
+ const ChargeSchema = z.object({
26
+ vaultId: z.string().describe("Subscription vault contract address"),
27
+ subscriptionId: z.number().describe("Subscription ID"),
28
+ });
29
+ const CancelSchema = z.object({
30
+ vaultId: z.string().describe("Subscription vault contract address"),
31
+ subscriptionId: z.number().describe("Subscription ID"),
32
+ });
33
+ const GetInfoSchema = z.object({
34
+ vaultId: z.string().describe("Subscription vault contract address"),
35
+ subscriptionId: z.number().describe("Subscription ID"),
36
+ });
37
+ export class SubscriptionProvider extends ActionProvider {
38
+ vaults = new Map();
39
+ constructor() {
40
+ super("subscription", []);
41
+ }
42
+ getVault(_vaultId) {
43
+ if (!this.vaults.has(_vaultId)) {
44
+ this.vaults.set(_vaultId, new MockSubscriptionVault());
45
+ }
46
+ return this.vaults.get(_vaultId);
47
+ }
48
+ async create(_wallet, args) {
49
+ return this.getVault(args.vaultId).createSubscription(_wallet.getAddress(), args.merchant, args.token, BigInt(args.amount), args.intervalSeconds);
50
+ }
51
+ async deposit(_wallet, args) {
52
+ return this.getVault(args.vaultId).depositFunds(args.subscriptionId, BigInt(args.amount));
53
+ }
54
+ async charge(_wallet, args) {
55
+ return this.getVault(args.vaultId).chargeSubscription(args.subscriptionId);
56
+ }
57
+ async cancel(_wallet, args) {
58
+ return this.getVault(args.vaultId).cancelSubscription(args.subscriptionId);
59
+ }
60
+ async getInfo(_wallet, args) {
61
+ return this.getVault(args.vaultId).getSubscriptionInfo(args.subscriptionId);
62
+ }
63
+ supportsNetwork(network) {
64
+ return ["testnet", "pubnet"].includes(network.networkId);
65
+ }
66
+ }
67
+ __decorate([
68
+ Action({
69
+ name: "create",
70
+ description: "Create a recurring payment subscription",
71
+ similes: ["subscribe", "create subscription", "recurring payment"],
72
+ schema: CreateSchema,
73
+ returnDirect: true,
74
+ needsWallet: true,
75
+ }),
76
+ __metadata("design:type", Function),
77
+ __metadata("design:paramtypes", [Function, void 0]),
78
+ __metadata("design:returntype", Promise)
79
+ ], SubscriptionProvider.prototype, "create", null);
80
+ __decorate([
81
+ Action({
82
+ name: "deposit",
83
+ description: "Pre-fund a subscription with tokens",
84
+ similes: ["fund subscription", "deposit to subscription"],
85
+ schema: DepositSchema,
86
+ returnDirect: true,
87
+ needsWallet: true,
88
+ }),
89
+ __metadata("design:type", Function),
90
+ __metadata("design:paramtypes", [Function, void 0]),
91
+ __metadata("design:returntype", Promise)
92
+ ], SubscriptionProvider.prototype, "deposit", null);
93
+ __decorate([
94
+ Action({
95
+ name: "charge",
96
+ description: "Process an interval charge for a subscription",
97
+ similes: ["charge subscription", "process payment"],
98
+ schema: ChargeSchema,
99
+ returnDirect: true,
100
+ needsWallet: true,
101
+ }),
102
+ __metadata("design:type", Function),
103
+ __metadata("design:paramtypes", [Function, void 0]),
104
+ __metadata("design:returntype", Promise)
105
+ ], SubscriptionProvider.prototype, "charge", null);
106
+ __decorate([
107
+ Action({
108
+ name: "cancel",
109
+ description: "Cancel a subscription and refund remaining balance",
110
+ similes: ["cancel subscription", "unsubscribe"],
111
+ schema: CancelSchema,
112
+ returnDirect: true,
113
+ needsWallet: true,
114
+ }),
115
+ __metadata("design:type", Function),
116
+ __metadata("design:paramtypes", [Function, void 0]),
117
+ __metadata("design:returntype", Promise)
118
+ ], SubscriptionProvider.prototype, "cancel", null);
119
+ __decorate([
120
+ Action({
121
+ name: "get_info",
122
+ description: "Get subscription details",
123
+ similes: ["subscription status", "subscription info"],
124
+ schema: GetInfoSchema,
125
+ needsWallet: true,
126
+ }),
127
+ __metadata("design:type", Function),
128
+ __metadata("design:paramtypes", [Function, void 0]),
129
+ __metadata("design:returntype", Promise)
130
+ ], SubscriptionProvider.prototype, "getInfo", null);
131
+ /** Create a subscription action provider for recurring payments. */
132
+ export const subscriptionActions = () => new SubscriptionProvider();
133
+ //# sourceMappingURL=subscriptionActionProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscriptionActionProvider.js","sourceRoot":"","sources":["../src/subscriptionActionProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=subscriptionActionProvider.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscriptionActionProvider.test.d.ts","sourceRoot":"","sources":["../src/subscriptionActionProvider.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,81 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { MockWalletProvider } from "@cann4n/core";
3
+ import { SubscriptionProvider } from "./subscriptionActionProvider";
4
+ describe("SubscriptionProvider", () => {
5
+ const wallet = new MockWalletProvider();
6
+ const provider = new SubscriptionProvider();
7
+ it("should provide subscription actions", () => {
8
+ const actions = provider.getActions(wallet);
9
+ const names = actions.map((a) => a.name);
10
+ expect(names).toContain("subscription_create");
11
+ expect(names).toContain("subscription_deposit");
12
+ expect(names).toContain("subscription_charge");
13
+ expect(names).toContain("subscription_cancel");
14
+ expect(names).toContain("subscription_get_info");
15
+ });
16
+ it("should describe actions for LLM", () => {
17
+ const actions = provider.getActions(wallet);
18
+ const create = actions.find((a) => a.name === "subscription_create");
19
+ expect(create.description).toContain("recurring payment");
20
+ expect(create.similes.length).toBeGreaterThan(0);
21
+ });
22
+ it("should create a subscription", async () => {
23
+ const actions = provider.getActions(wallet);
24
+ const create = actions.find((a) => a.name === "subscription_create");
25
+ const result = await create.invoke({
26
+ vaultId: "test_vault",
27
+ merchant: "GC4B7Y6XJ5Y6XJ5Y6XJ5Y6XJ5Y6XJ5Y6XJ5Y6XJ5Y6XJ5Y6XJ5Y6XJ5",
28
+ token: "USDC",
29
+ amount: "1000000",
30
+ intervalSeconds: 86400,
31
+ });
32
+ expect(result).toContain("Created subscription");
33
+ });
34
+ it("should deposit into a subscription", async () => {
35
+ const createActions = provider.getActions(wallet);
36
+ const create = createActions.find((a) => a.name === "subscription_create");
37
+ await create.invoke({
38
+ vaultId: "test_vault",
39
+ merchant: "GC4B7Y6XJ5Y6XJ5Y6XJ5Y6XJ5Y6XJ5Y6XJ5Y6XJ5Y6XJ5Y6XJ5Y6XJ5",
40
+ token: "USDC",
41
+ amount: "1000000",
42
+ intervalSeconds: 86400,
43
+ });
44
+ const actions = provider.getActions(wallet);
45
+ const deposit = actions.find((a) => a.name === "subscription_deposit");
46
+ const result = await deposit.invoke({
47
+ vaultId: "test_vault",
48
+ subscriptionId: 1,
49
+ amount: "5000000",
50
+ });
51
+ expect(result).toContain("Deposited");
52
+ });
53
+ it("should charge a subscription", async () => {
54
+ const actions = provider.getActions(wallet);
55
+ const charge = actions.find((a) => a.name === "subscription_charge");
56
+ const result = await charge.invoke({
57
+ vaultId: "test_vault",
58
+ subscriptionId: 1,
59
+ });
60
+ expect(result).toContain("Charged");
61
+ });
62
+ it("should cancel a subscription", async () => {
63
+ const actions = provider.getActions(wallet);
64
+ const cancel = actions.find((a) => a.name === "subscription_cancel");
65
+ const result = await cancel.invoke({
66
+ vaultId: "test_vault",
67
+ subscriptionId: 1,
68
+ });
69
+ expect(result).toContain("Cancelled");
70
+ });
71
+ it("should get subscription info", async () => {
72
+ const actions = provider.getActions(wallet);
73
+ const info = actions.find((a) => a.name === "subscription_get_info");
74
+ const result = await info.invoke({
75
+ vaultId: "test_vault",
76
+ subscriptionId: 1,
77
+ });
78
+ expect(result).toContain("Subscription #1");
79
+ });
80
+ });
81
+ //# sourceMappingURL=subscriptionActionProvider.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscriptionActionProvider.test.js","sourceRoot":"","sources":["../src/subscriptionActionProvider.test.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@cann4n/actions-subscription",
3
+ "version": "0.1.0",
4
+ "description": "Recurring payment vault (Stellabill) actions for AgentKit Stellar",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "default": "./dist/index.js"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "dependencies": {
20
+ "@cann4n/core": "^0.1.0",
21
+ "zod": "^3.24.0"
22
+ },
23
+ "devDependencies": {
24
+ "typescript": "^5.7.0",
25
+ "vitest": "^3.0.0"
26
+ },
27
+ "publishConfig": {
28
+ "access": "public"
29
+ },
30
+ "license": "MIT",
31
+ "repository": {
32
+ "type": "git",
33
+ "url": "https://github.com/anomalyco/agentkit-stellar.git",
34
+ "directory": "packages/actions-subscription"
35
+ },
36
+ "scripts": {
37
+ "build": "tsc",
38
+ "test": "vitest run",
39
+ "lint": "eslint src/",
40
+ "typecheck": "tsc --noEmit",
41
+ "clean": "rm -rf dist"
42
+ }
43
+ }