@hsuite/smart-engines-cli 1.1.1 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/_lib/cluster.d.ts +11 -8
  2. package/dist/_lib/cluster.d.ts.map +1 -1
  3. package/dist/_lib/cluster.js +8 -35
  4. package/dist/_lib/cluster.js.map +1 -1
  5. package/dist/_lib/subscription-client.d.ts +152 -0
  6. package/dist/_lib/subscription-client.d.ts.map +1 -0
  7. package/dist/_lib/subscription-client.js +84 -0
  8. package/dist/_lib/subscription-client.js.map +1 -0
  9. package/dist/_lib/subscription-env.d.ts +20 -0
  10. package/dist/_lib/subscription-env.d.ts.map +1 -0
  11. package/dist/_lib/subscription-env.js +28 -0
  12. package/dist/_lib/subscription-env.js.map +1 -0
  13. package/dist/commands/billing.d.ts +17 -0
  14. package/dist/commands/billing.d.ts.map +1 -0
  15. package/dist/commands/billing.js +59 -0
  16. package/dist/commands/billing.js.map +1 -0
  17. package/dist/commands/deploy.d.ts.map +1 -1
  18. package/dist/commands/deploy.js +26 -16
  19. package/dist/commands/deploy.js.map +1 -1
  20. package/dist/commands/downgrade.d.ts +22 -0
  21. package/dist/commands/downgrade.d.ts.map +1 -0
  22. package/dist/commands/downgrade.js +55 -0
  23. package/dist/commands/downgrade.js.map +1 -0
  24. package/dist/commands/init.js +3 -6
  25. package/dist/commands/init.js.map +1 -1
  26. package/dist/commands/renew.d.ts +19 -0
  27. package/dist/commands/renew.d.ts.map +1 -0
  28. package/dist/commands/renew.js +58 -0
  29. package/dist/commands/renew.js.map +1 -0
  30. package/dist/commands/subscribe.d.ts +40 -4
  31. package/dist/commands/subscribe.d.ts.map +1 -1
  32. package/dist/commands/subscribe.js +156 -94
  33. package/dist/commands/subscribe.js.map +1 -1
  34. package/dist/commands/upgrade.d.ts +41 -0
  35. package/dist/commands/upgrade.d.ts.map +1 -0
  36. package/dist/commands/upgrade.js +128 -0
  37. package/dist/commands/upgrade.js.map +1 -0
  38. package/dist/commands/usage.d.ts +22 -0
  39. package/dist/commands/usage.d.ts.map +1 -0
  40. package/dist/commands/usage.js +81 -0
  41. package/dist/commands/usage.js.map +1 -0
  42. package/dist/commands/verify.d.ts +19 -6
  43. package/dist/commands/verify.d.ts.map +1 -1
  44. package/dist/commands/verify.js +75 -15
  45. package/dist/commands/verify.js.map +1 -1
  46. package/dist/index.d.ts +8 -2
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +19 -2
  49. package/dist/index.js.map +1 -1
  50. package/package.json +2 -2
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.downgradeCommand = void 0;
7
+ exports.runDowngrade = runDowngrade;
8
+ /**
9
+ * `hsuite downgrade --to-tier <T>` — POST /api/v3/subscription/downgrade.
10
+ *
11
+ * Downgrades apply at the next renewal (no top-up, no immediate mint).
12
+ */
13
+ const commander_1 = require("commander");
14
+ const chalk_1 = __importDefault(require("chalk"));
15
+ const ora_1 = __importDefault(require("ora"));
16
+ const env_1 = require("../_lib/env");
17
+ const subscription_client_1 = require("../_lib/subscription-client");
18
+ const subscription_env_1 = require("../_lib/subscription-env");
19
+ async function runDowngrade(opts) {
20
+ if (!opts.toTier)
21
+ throw new Error('--to-tier is required');
22
+ const env = (0, env_1.readEnv)(opts.env);
23
+ const baseUrl = (0, subscription_env_1.requireValidatorUrl)(env, { gateway: opts.gateway });
24
+ const appId = (0, subscription_env_1.requireAppId)(env, { appId: opts.appId });
25
+ const client = (opts.clientFactory ?? ((b) => new subscription_client_1.SubscriptionClient({ baseUrl: b })))(baseUrl);
26
+ const res = await client.downgrade(appId, opts.toTier);
27
+ if (!res.success) {
28
+ throw new Error(`downgrade failed: ${res.message ?? 'unknown error'}`);
29
+ }
30
+ return { appId, toTier: opts.toTier, effectiveAt: res.effectiveAt };
31
+ }
32
+ exports.downgradeCommand = new commander_1.Command('downgrade')
33
+ .description('Schedule a downgrade — applies at next renewal')
34
+ .option('--env <file>', 'Env file with subscription appId', '.env.local')
35
+ .option('--gateway <url>', 'Validator/gateway URL (defaults to VALIDATOR_URL in env)')
36
+ .option('--app-id <id>', 'Override SUBSCRIPTION_APP_ID from env')
37
+ .requiredOption('--to-tier <tier>', 'Target tier (free_testnet|starter|professional)')
38
+ .action(async (opts) => {
39
+ console.log(chalk_1.default.bold.cyan('\n hsuite downgrade\n'));
40
+ const spinner = (0, ora_1.default)(`scheduling downgrade to ${opts.toTier}...`).start();
41
+ try {
42
+ const result = await runDowngrade(opts);
43
+ spinner.succeed(`downgrade scheduled to ${result.toTier}`);
44
+ console.log(chalk_1.default.gray(' applies at next renewal'));
45
+ if (result.effectiveAt !== undefined) {
46
+ console.log(chalk_1.default.gray(` effective: ${result.effectiveAt}`));
47
+ }
48
+ console.log(chalk_1.default.bold.green('\n ✓ scheduled\n'));
49
+ }
50
+ catch (err) {
51
+ spinner.fail(err.message);
52
+ process.exit(1);
53
+ }
54
+ });
55
+ //# sourceMappingURL=downgrade.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"downgrade.js","sourceRoot":"","sources":["../../src/commands/downgrade.ts"],"names":[],"mappings":";;;;;;AAoBA,oCAeC;AAnCD;;;;GAIG;AACH,yCAAoC;AACpC,kDAA0B;AAC1B,8CAAsB;AACtB,qCAAsC;AACtC,qEAAiE;AACjE,+DAA6E;AAUtE,KAAK,UAAU,YAAY,CAAC,IAAmB;IAKpD,IAAI,CAAC,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3D,MAAM,GAAG,GAAG,IAAA,aAAO,EAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9B,MAAM,OAAO,GAAG,IAAA,sCAAmB,EAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACpE,MAAM,KAAK,GAAG,IAAA,+BAAY,EAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,wCAAkB,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAChG,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACvD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,CAAC,OAAO,IAAI,eAAe,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC;AACtE,CAAC;AAEY,QAAA,gBAAgB,GAAG,IAAI,mBAAO,CAAC,WAAW,CAAC;KACrD,WAAW,CAAC,gDAAgD,CAAC;KAC7D,MAAM,CAAC,cAAc,EAAE,kCAAkC,EAAE,YAAY,CAAC;KACxE,MAAM,CAAC,iBAAiB,EAAE,0DAA0D,CAAC;KACrF,MAAM,CAAC,eAAe,EAAE,uCAAuC,CAAC;KAChE,cAAc,CAAC,kBAAkB,EAAE,iDAAiD,CAAC;KACrF,MAAM,CAAC,KAAK,EAAE,IAAmB,EAAE,EAAE;IACpC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,2BAA2B,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;IACzE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;QACxC,OAAO,CAAC,OAAO,CAAC,0BAA0B,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC;QACrD,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;IACrD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -119,12 +119,9 @@ REQUEST_TIMEOUT=30000
119
119
  ALLOW_INSECURE=false
120
120
 
121
121
  # --- Subscription ---
122
- # Run \`hsuite subscribe\` to register a free_testnet smart-app on the cluster.
123
- SKIP_SUBSCRIPTION_CHECK=true
124
- AUTO_SUBSCRIBE=false
125
- SUBSCRIPTION_TIER=free_testnet
126
- DEV_MODE=true
127
- # SUBSCRIPTION_APP_ID=
122
+ # Run \`hsuite subscribe --tier <tier>\` to mint a subscription NFT via the
123
+ # cluster's /api/v3/subscription/* surface. Default tier is free_testnet.
124
+ # SUBSCRIPTION_APP_ID and SUBSCRIPTION_NFT_SERIAL are written by hsuite subscribe.
128
125
  `;
129
126
  }
130
127
  //# sourceMappingURL=init.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":";;;;;;AAAA;;GAEG;AACH,yCAAoC;AACpC,kDAA0B;AAC1B,8CAAsB;AACtB,2BAA6D;AAC7D,+BAA+B;AAC/B,+BAA8B;AAC9B,6CAAkD;AAElD,MAAM,OAAO,GAA2B;IACtC,OAAO,EAAE,+CAA+C;IACxD,MAAM,EAAE,+CAA+C;CACxD,CAAC;AAEW,QAAA,WAAW,GAAG,IAAI,mBAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,0DAA0D,CAAC;KACvE,MAAM,CAAC,cAAc,EAAE,sBAAsB,EAAE,YAAY,CAAC;KAC5D,MAAM,CAAC,qBAAqB,EAAE,iCAAiC,EAAE,SAAS,CAAC;KAC3E,MAAM,CACL,iBAAiB,EACjB,wDAAwD,EACxD,yBAAe,CAChB;KACA,MAAM,CAAC,WAAW,EAAE,8BAA8B,CAAC;KACnD,MAAM,CAAC,SAAS,EAAE,6BAA6B,CAAC;KAChD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,OAAO,GAAG,IAAA,cAAO,EAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,IAAA,eAAU,EAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,IAAA,iBAAY,EAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC/C,IAAI,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzE,OAAO,CAAC,KAAK,CACX,eAAK,CAAC,GAAG,CAAC,OAAO,OAAO,gEAAgE,CAAC,CAC1F,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,eAAe,OAAO,IAAI,CAAC,CAAC,CAAC;IAEpD,IAAI,OAAO,GAAG,IAAA,aAAG,EAAC,4BAA4B,CAAC,CAAC,KAAK,EAAE,CAAC;IACxD,MAAM,MAAM,GAAG,aAAM,CAAC,QAAQ,EAAE,CAAC;IACjC,OAAO,CAAC,OAAO,CAAC,YAAY,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAE9C,IAAI,OAA2B,CAAC;IAChC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,GAAG,IAAA,aAAG,EAAC,yBAAyB,IAAI,CAAC,OAAO,YAAY,CAAC,CAAC,KAAK,EAAE,CAAC;QACzE,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,oBAAoB,IAAI,CAAC,OAAO,2BAA2B,CAAC,CAAC;YAC1E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE;gBACjC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;aACtD,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC9C,MAAM,IAAI,KAAK,CAAC,UAAU,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YACjE,CAAC;YACD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAyB,CAAC;YACxD,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;YACvB,OAAO,CAAC,OAAO,CAAC,UAAU,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACnF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,kBAAmB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,GAAG,GAAG,SAAS,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,IAAI,EAAE,MAAM,CAAC,IAAK;QAClB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,CAAC,CAAC;IACH,IAAA,kBAAa,EAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,aAAa,OAAO,EAAE,CAAC,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,kCAAkC,OAAO,IAAI,CAAC,CAAC,CAAC;AACzE,CAAC,CAAC,CAAC;AAEL,SAAS,SAAS,CAAC,IAMlB;IACC,OAAO,iCAAiC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;;;;;;;;;gBASlD,IAAI,CAAC,OAAO;iBACX,IAAI,CAAC,OAAO;;;;;;;eAOd,IAAI,CAAC,OAAO;eACZ,IAAI,CAAC,OAAO;kBACT,IAAI,CAAC,SAAS;YACpB,IAAI,CAAC,IAAI;;;;;;;;;;;;;;;;;;;;;CAqBpB,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * `hsuite renew` — POST /api/v3/subscription/renew with the appId from env.
3
+ */
4
+ import { Command } from 'commander';
5
+ import { SubscriptionClient } from '../_lib/subscription-client';
6
+ type RenewOpts = {
7
+ env: string;
8
+ gateway?: string;
9
+ appId?: string;
10
+ additionalDays?: string;
11
+ clientFactory?: (baseUrl: string) => SubscriptionClient;
12
+ };
13
+ export declare function runRenew(opts: RenewOpts): Promise<{
14
+ appId: string;
15
+ newExpiresAt?: string | number;
16
+ }>;
17
+ export declare const renewCommand: Command;
18
+ export {};
19
+ //# sourceMappingURL=renew.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renew.d.ts","sourceRoot":"","sources":["../../src/commands/renew.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAGjE,KAAK,SAAS,GAAG;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,kBAAkB,CAAC;CACzD,CAAC;AAEF,wBAAsB,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,CAAC,CAe1G;AAED,eAAO,MAAM,YAAY,SAoBrB,CAAC"}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.renewCommand = void 0;
7
+ exports.runRenew = runRenew;
8
+ /**
9
+ * `hsuite renew` — POST /api/v3/subscription/renew with the appId from env.
10
+ */
11
+ const commander_1 = require("commander");
12
+ const chalk_1 = __importDefault(require("chalk"));
13
+ const ora_1 = __importDefault(require("ora"));
14
+ const env_1 = require("../_lib/env");
15
+ const subscription_client_1 = require("../_lib/subscription-client");
16
+ const subscription_env_1 = require("../_lib/subscription-env");
17
+ async function runRenew(opts) {
18
+ const env = (0, env_1.readEnv)(opts.env);
19
+ const baseUrl = (0, subscription_env_1.requireValidatorUrl)(env, { gateway: opts.gateway });
20
+ const appId = (0, subscription_env_1.requireAppId)(env, { appId: opts.appId });
21
+ const days = opts.additionalDays !== undefined ? Number(opts.additionalDays) : undefined;
22
+ if (days !== undefined && (!Number.isFinite(days) || days <= 0)) {
23
+ throw new Error(`--additional-days must be a positive number (got "${opts.additionalDays}")`);
24
+ }
25
+ const client = (opts.clientFactory ?? ((b) => new subscription_client_1.SubscriptionClient({ baseUrl: b })))(baseUrl);
26
+ const res = await client.renew(appId, days);
27
+ if (!res.success) {
28
+ throw new Error(`renew failed: ${res.message ?? 'unknown error'}`);
29
+ }
30
+ return { appId, newExpiresAt: res.newExpiresAt };
31
+ }
32
+ exports.renewCommand = new commander_1.Command('renew')
33
+ .description('Extend the subscription lock period for the current app')
34
+ .option('--env <file>', 'Env file with subscription appId', '.env.local')
35
+ .option('--gateway <url>', 'Validator/gateway URL (defaults to VALIDATOR_URL in env)')
36
+ .option('--app-id <id>', 'Override SUBSCRIPTION_APP_ID from env')
37
+ .option('--additional-days <n>', 'Additional lock days (default: server config)')
38
+ .action(async (opts) => {
39
+ console.log(chalk_1.default.bold.cyan('\n hsuite renew\n'));
40
+ const spinner = (0, ora_1.default)('renewing subscription...').start();
41
+ try {
42
+ const result = await runRenew(opts);
43
+ spinner.succeed(`renewed (appId=${result.appId})`);
44
+ if (result.newExpiresAt !== undefined) {
45
+ console.log(chalk_1.default.gray(` new expiresAt: ${formatDate(result.newExpiresAt)}`));
46
+ }
47
+ console.log(chalk_1.default.bold.green('\n ✓ renewed\n'));
48
+ }
49
+ catch (err) {
50
+ spinner.fail(err.message);
51
+ process.exit(1);
52
+ }
53
+ });
54
+ function formatDate(v) {
55
+ const d = typeof v === 'number' ? new Date(v) : new Date(v);
56
+ return Number.isNaN(d.getTime()) ? String(v) : d.toISOString();
57
+ }
58
+ //# sourceMappingURL=renew.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renew.js","sourceRoot":"","sources":["../../src/commands/renew.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,46 @@
1
1
  /**
2
- * `hsuite subscribe` — Register a free_testnet smart-app on the cluster.
2
+ * `hsuite subscribe` — Mint a subscription NFT against the validator's
3
+ * `/api/v3/subscription/*` surface.
3
4
  *
4
- * Per the cluster's smart-app service: tier='free_testnet' on testnet skips
5
- * the deposit gate, runs DKG, returns ACTIVE immediately.
6
- * (apps/smart-validator/src/smart-app/__tests__/smart-app.service.spec.ts:83)
5
+ * Flow (per docs/superpowers/specs/2026-05-27-developer-subscription-gating.md §3.5):
6
+ * 1. Read XRPL_ADDRESS + XRPL_SEED from env (written by `hsuite init`).
7
+ * 2. POST /api/v3/subscription/request → server creates subscription doc.
8
+ * - `free_testnet`: server auto-activates + mints. CLI polls /status
9
+ * until NFT serial is set.
10
+ * - paid tier: server returns depositInstructions. CLI displays them,
11
+ * polls /status every 5s until status: 'PENDING_MINT' (deposit
12
+ * confirmed), then POSTs /mint to flip ACTIVE.
13
+ * 3. Verify NFT serial lands on the wallet via GET /status.
14
+ * 4. Write SUBSCRIPTION_APP_ID + SUBSCRIPTION_NFT_SERIAL to .env.
7
15
  */
8
16
  import { Command } from 'commander';
17
+ import { SubscriptionClient } from '../_lib/subscription-client';
18
+ type SubscribeOpts = {
19
+ env: string;
20
+ gateway?: string;
21
+ tier: string;
22
+ networks: string;
23
+ appName?: string;
24
+ appId?: string;
25
+ pollIntervalMs?: number;
26
+ pollTimeoutMs?: number;
27
+ clientFactory?: (baseUrl: string) => SubscriptionClient;
28
+ sleep?: (ms: number) => Promise<void>;
29
+ };
30
+ /**
31
+ * Pure orchestration body — exported for unit tests.
32
+ *
33
+ * Returns the appId + NFT serial (when minted) so callers can persist them.
34
+ * Throws on every error path; the command-level action wraps this and
35
+ * exits the process.
36
+ */
37
+ export declare function runSubscribe(opts: SubscribeOpts): Promise<{
38
+ appId: string;
39
+ subscriptionId?: string;
40
+ nftSerial?: number | string;
41
+ tier: string;
42
+ status?: string;
43
+ }>;
9
44
  export declare const subscribeCommand: Command;
45
+ export {};
10
46
  //# sourceMappingURL=subscribe.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"subscribe.d.ts","sourceRoot":"","sources":["../../src/commands/subscribe.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,eAAO,MAAM,gBAAgB,SAwHzB,CAAC"}
1
+ {"version":3,"file":"subscribe.d.ts","sourceRoot":"","sources":["../../src/commands/subscribe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,OAAO,EACL,kBAAkB,EAInB,MAAM,6BAA6B,CAAC;AAGrC,KAAK,aAAa,GAAG;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,kBAAkB,CAAC;IACxD,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC,CAAC;AAQF;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC;IAC/D,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC,CAkFD;AA0DD,eAAO,MAAM,gBAAgB,SA4CzB,CAAC"}
@@ -4,125 +4,187 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.subscribeCommand = void 0;
7
+ exports.runSubscribe = runSubscribe;
7
8
  /**
8
- * `hsuite subscribe` — Register a free_testnet smart-app on the cluster.
9
+ * `hsuite subscribe` — Mint a subscription NFT against the validator's
10
+ * `/api/v3/subscription/*` surface.
9
11
  *
10
- * Per the cluster's smart-app service: tier='free_testnet' on testnet skips
11
- * the deposit gate, runs DKG, returns ACTIVE immediately.
12
- * (apps/smart-validator/src/smart-app/__tests__/smart-app.service.spec.ts:83)
12
+ * Flow (per docs/superpowers/specs/2026-05-27-developer-subscription-gating.md §3.5):
13
+ * 1. Read XRPL_ADDRESS + XRPL_SEED from env (written by `hsuite init`).
14
+ * 2. POST /api/v3/subscription/request → server creates subscription doc.
15
+ * - `free_testnet`: server auto-activates + mints. CLI polls /status
16
+ * until NFT serial is set.
17
+ * - paid tier: server returns depositInstructions. CLI displays them,
18
+ * polls /status every 5s until status: 'PENDING_MINT' (deposit
19
+ * confirmed), then POSTs /mint to flip ACTIVE.
20
+ * 3. Verify NFT serial lands on the wallet via GET /status.
21
+ * 4. Write SUBSCRIPTION_APP_ID + SUBSCRIPTION_NFT_SERIAL to .env.
13
22
  */
14
23
  const commander_1 = require("commander");
15
24
  const chalk_1 = __importDefault(require("chalk"));
16
25
  const ora_1 = __importDefault(require("ora"));
17
- const smart_engines_sdk_1 = require("@hsuite/smart-engines-sdk");
26
+ const crypto_1 = require("crypto");
18
27
  const env_1 = require("../_lib/env");
19
- const cluster_1 = require("../_lib/cluster");
20
- exports.subscribeCommand = new commander_1.Command('subscribe')
21
- .description('Register a free_testnet smart-app on the cluster')
22
- .option('--env <file>', 'Env file with XRPL/Hedera creds', '.env.local')
23
- .option('--gateway <url>', 'Bootstrap host — seed for decentralized cluster discovery', cluster_1.DEFAULT_GATEWAY)
24
- .option('--name <name>', 'Smart-app display name')
25
- .option('--services <list>', 'Comma-separated services to enable', 'database,storage,messaging,functions')
26
- .action(async (opts) => {
27
- console.log(chalk_1.default.bold.cyan('\n hsuite subscribe\n'));
28
- console.log(chalk_1.default.gray(` env: ${opts.env}`));
29
- console.log(chalk_1.default.gray(` bootstrap: ${opts.gateway}\n`));
30
- let env;
31
- try {
32
- env = (0, env_1.readEnv)(opts.env);
33
- }
34
- catch (err) {
35
- console.error(chalk_1.default.red(` ${err.message}\n`));
36
- console.error(chalk_1.default.gray(' hint: run `hsuite init` first\n'));
37
- process.exit(1);
28
+ const subscription_client_1 = require("../_lib/subscription-client");
29
+ const subscription_env_1 = require("../_lib/subscription-env");
30
+ const VALID_TIERS = ['free_testnet', 'starter', 'professional', 'enterprise'];
31
+ const defaultSleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
32
+ /**
33
+ * Pure orchestration body — exported for unit tests.
34
+ *
35
+ * Returns the appId + NFT serial (when minted) so callers can persist them.
36
+ * Throws on every error path; the command-level action wraps this and
37
+ * exits the process.
38
+ */
39
+ async function runSubscribe(opts) {
40
+ const env = (0, env_1.readEnv)(opts.env);
41
+ const { address } = (0, subscription_env_1.requireXrplCreds)(env);
42
+ const tier = opts.tier;
43
+ if (!VALID_TIERS.includes(tier)) {
44
+ throw new Error(`unknown tier "${opts.tier}". Valid: ${VALID_TIERS.join(', ')}`);
38
45
  }
39
- // The init endpoint requires a DNS-safe name (lowercase alphanumeric +
40
- // hyphens, max 63 chars). Normalise the display-name accordingly so a
41
- // CLI invocation with a free-text APP_NAME doesn't 400 at the boundary.
42
- const rawAppName = opts.name ?? env.get('APP_NAME') ?? 'smart-app-showcase';
43
- const appName = rawAppName
44
- .toLowerCase()
45
- .replace(/[^a-z0-9-]+/g, '-')
46
- .replace(/^-+|-+$/g, '')
47
- .slice(0, 63) || 'smart-app-showcase';
48
- const services = opts.services
46
+ const selectedNetworks = opts.networks
49
47
  .split(',')
50
48
  .map((s) => s.trim())
51
49
  .filter(Boolean);
52
- let spinner = (0, ora_1.default)('building signer...').start();
53
- let signer;
54
- try {
55
- signer = (0, env_1.buildSignerFromEnv)(env);
56
- }
57
- catch (err) {
58
- spinner.fail(err.message);
59
- process.exit(1);
50
+ if (selectedNetworks.length === 0) {
51
+ throw new Error('At least one network required (e.g. --networks xrpl)');
60
52
  }
61
- spinner.succeed(`signer ready (${signer.chain}, ${signer.walletAddress})`);
62
- // Decentralized cluster discovery: bootstrap registry random node.
63
- // Falls back to the bootstrap host (a working round-robin gateway) when
64
- // the registry is empty or unreachable.
65
- spinner = (0, ora_1.default)('discovering cluster...').start();
66
- const gatewayUrl = await (0, cluster_1.resolveGatewayUrl)(opts.gateway);
67
- spinner.succeed(`cluster: ${gatewayUrl}`);
68
- const client = new smart_engines_sdk_1.BaasClient({
69
- hostUrl: gatewayUrl,
70
- appId: 'pending',
71
- allowInsecure: gatewayUrl.startsWith('http://'),
72
- // Paths are the apps' real /api/* routes; the ingress routes each
73
- // prefix straight to its service — no host-proxy prefix.
74
- pathPrefix: '',
75
- // `deployment.init` → smart-host → validator runtime-init. As of
76
- // HANDOFF-arc-v13-do-deploy.md §18.3 4b / §19.4f item 2, the
77
- // validator runs DKG asynchronously and smart-host's
78
- // `SmartAppCreatorAdapter` polls until terminal (default 10 min
79
- // poll-timeout, env-tunable via `RUNTIME_INIT_POLL_TIMEOUT_MS`
80
- // on the smart-host pod). The HTTP request itself stays open
81
- // for the full adapter-side poll window — bump the CLI timeout
82
- // to match the adapter ceiling so a slow DKG doesn't truncate
83
- // the request before the adapter resolves.
84
- timeout: 10 * 60 * 1_000,
85
- });
86
- spinner = (0, ora_1.default)('web3-auth challenge → verify...').start();
53
+ const baseUrl = (0, subscription_env_1.requireValidatorUrl)(env, { gateway: opts.gateway });
54
+ const client = (opts.clientFactory ?? ((b) => new subscription_client_1.SubscriptionClient({ baseUrl: b })))(baseUrl);
55
+ const sleep = opts.sleep ?? defaultSleep;
56
+ const appId = opts.appId ??
57
+ env.get('SUBSCRIPTION_APP_ID') ??
58
+ `app-${(0, crypto_1.randomUUID)().slice(0, 8)}`;
59
+ const appName = opts.appName ?? env.get('APP_NAME') ?? 'Smart App Showcase';
60
+ // Step 1: POST /request
61
+ let requestResp;
87
62
  try {
88
- await client.authenticate({
89
- chain: signer.chain,
90
- walletAddress: signer.walletAddress,
91
- publicKey: signer.publicKey,
92
- signFn: signer.signFn,
63
+ requestResp = await client.request({
64
+ appId,
65
+ developerAccountId: address,
66
+ chain: 'xrpl',
67
+ appName,
68
+ selectedTier: tier,
69
+ selectedNetworks,
93
70
  });
94
71
  }
95
72
  catch (err) {
96
- spinner.fail(`auth failed: ${err.message}`);
97
- process.exit(1);
73
+ throw new Error(`subscription request failed: ${err.message}`);
74
+ }
75
+ if (!requestResp.success) {
76
+ throw new Error(`subscription request rejected: ${requestResp.message ?? 'unknown error'}`);
98
77
  }
99
- spinner.succeed('authenticated');
100
- spinner = (0, ora_1.default)('register free_testnet smart-app...').start();
78
+ const status = await (async () => {
79
+ // Step 2a: free_testnet path — server auto-activates. Poll until NFT serial set.
80
+ if (tier === 'free_testnet') {
81
+ return pollStatus(client, appId, sleep, opts, (s) => Boolean(s.subscriptionNftSerial));
82
+ }
83
+ // Step 2b: paid tier — display deposit instructions + poll until PENDING_MINT.
84
+ if (!requestResp.depositInstructions) {
85
+ throw new Error('paid tier returned no depositInstructions — server contract violation');
86
+ }
87
+ renderDepositInstructions(requestResp.depositInstructions, tier);
88
+ await pollStatus(client, appId, sleep, opts, (s) => isPendingMint(s.status));
89
+ // Step 3: POST /mint
90
+ const mintResp = await client.mint(appId);
91
+ if (!mintResp.success) {
92
+ throw new Error('mint failed (server returned success=false)');
93
+ }
94
+ // Step 4: poll until NFT serial is set.
95
+ return pollStatus(client, appId, sleep, opts, (s) => Boolean(s.subscriptionNftSerial));
96
+ })();
97
+ return {
98
+ appId,
99
+ subscriptionId: status.subscriptionId,
100
+ nftSerial: status.subscriptionNftSerial,
101
+ tier,
102
+ status: status.status,
103
+ };
104
+ }
105
+ function isPendingMint(status) {
106
+ if (!status)
107
+ return false;
108
+ // SubscriptionStatus enum values from libs/multi-chain-core. Accept both
109
+ // canonical `pending_mint` and an already-active state (server may skip
110
+ // straight to ACTIVE if it's already minted by the time we poll).
111
+ const s = status.toLowerCase();
112
+ return s === 'pending_mint' || s === 'active' || s === 'minting';
113
+ }
114
+ async function pollStatus(client, appId, sleep, opts, done) {
115
+ const interval = opts.pollIntervalMs ?? 5000;
116
+ const timeout = opts.pollTimeoutMs ?? 5 * 60 * 1000;
117
+ const deadline = Date.now() + timeout;
118
+ // First tick immediately so tests that prime a single response don't have
119
+ // to wait the full 5s.
120
+ while (true) {
121
+ const status = await client.status(appId);
122
+ if (done(status))
123
+ return status;
124
+ if (Date.now() > deadline) {
125
+ throw new Error(`timed out waiting for subscription status for ${appId} after ${timeout}ms`);
126
+ }
127
+ await sleep(interval);
128
+ }
129
+ }
130
+ function renderDepositInstructions(d, tier) {
131
+ const xummDeeplink = buildXummDeeplink(d);
132
+ console.log(chalk_1.default.bold.yellow('\n Deposit required to mint your subscription NFT:'));
133
+ console.log(chalk_1.default.gray(` tier: ${tier}`));
134
+ console.log(chalk_1.default.gray(` chain: ${d.chain}`));
135
+ console.log(chalk_1.default.gray(` amount: ${d.amount} (token ${d.tokenId})`));
136
+ console.log(chalk_1.default.gray(` to: ${d.walletAddress}\n`));
137
+ console.log(chalk_1.default.cyan(` XUMM deeplink:`));
138
+ console.log(chalk_1.default.cyan(` ${xummDeeplink}\n`));
139
+ console.log(chalk_1.default.gray(' Waiting for deposit confirmation...\n'));
140
+ }
141
+ function buildXummDeeplink(d) {
142
+ if (d.chain !== 'xrpl') {
143
+ return `(no deeplink: chain=${d.chain})`;
144
+ }
145
+ // Minimal Xumm deeplink shape; full IssuedCurrency requires JSON payload
146
+ // pushed through https://xumm.app/sign — for the CLI we surface the raw
147
+ // tx params so the user can paste them into their wallet.
148
+ return `xumm://xrpl/send?to=${encodeURIComponent(d.walletAddress)}&amount=${encodeURIComponent(d.amount)}&token=${encodeURIComponent(d.tokenId)}`;
149
+ }
150
+ exports.subscribeCommand = new commander_1.Command('subscribe')
151
+ .description('Mint a subscription NFT against the cluster')
152
+ .option('--env <file>', 'Env file with XRPL creds', '.env.local')
153
+ .option('--gateway <url>', 'Validator/gateway URL (defaults to VALIDATOR_URL in env)')
154
+ .option('--tier <tier>', 'Subscription tier (free_testnet|starter|professional|enterprise)', 'free_testnet')
155
+ .option('--networks <list>', 'Comma-separated networks (hedera,xrpl,etc.)', 'xrpl')
156
+ .option('--app-name <name>', 'Smart-app display name')
157
+ .option('--app-id <id>', 'Reuse an existing app id (default: generate uuid)')
158
+ .action(async (opts) => {
159
+ console.log(chalk_1.default.bold.cyan('\n hsuite subscribe\n'));
160
+ console.log(chalk_1.default.gray(` env: ${opts.env}`));
161
+ console.log(chalk_1.default.gray(` tier: ${opts.tier}`));
162
+ console.log(chalk_1.default.gray(` nets: ${opts.networks}\n`));
163
+ const spinner = (0, ora_1.default)(`requesting ${opts.tier} subscription...`).start();
101
164
  let result;
102
165
  try {
103
- // PR-A runtime-orchestration: `deployment.init` is the first step of
104
- // the four-step deploy flow and the new entry-point for allocating an
105
- // appId on the cluster. The legacy `BaasClient.register()` +
106
- // `POST /api/deployment/apps` surface was removed (no backward compat
107
- // per spec §4 hard rules). `subscribe` does not deploy an image, so
108
- // we synthesise a reasonable default port — the runtime sub-doc is
109
- // populated at `deploy` time (PR-D), not at init.
110
- result = await client.deployment.init({ name: appName, port: 3000, services });
166
+ result = await runSubscribe(opts);
111
167
  }
112
168
  catch (err) {
113
- spinner.fail(`register failed: ${err.message}`);
169
+ spinner.fail(err.message);
114
170
  process.exit(1);
115
171
  }
116
- spinner.succeed(`appId: ${result.appId}`);
117
- console.log(chalk_1.default.gray(` registry: ${result.registry.server}/${result.registry.repository}`));
118
- console.log(chalk_1.default.gray(` services: ${services.join(', ')}`));
119
- (0, env_1.upsertEnv)(opts.env, {
172
+ spinner.succeed(`subscription active (appId=${result.appId})`);
173
+ if (result.nftSerial !== undefined) {
174
+ console.log(chalk_1.default.gray(` NFT serial: ${result.nftSerial}`));
175
+ }
176
+ if (result.subscriptionId) {
177
+ console.log(chalk_1.default.gray(` subscriptionId: ${result.subscriptionId}`));
178
+ }
179
+ const updates = {
120
180
  SUBSCRIPTION_APP_ID: result.appId,
121
181
  APP_ID: result.appId,
122
- SKIP_SUBSCRIPTION_CHECK: 'false',
123
- });
124
- console.log(chalk_1.default.gray(`\n wrote SUBSCRIPTION_APP_ID + APP_ID to ${opts.env}`));
182
+ };
183
+ if (result.nftSerial !== undefined) {
184
+ updates.SUBSCRIPTION_NFT_SERIAL = String(result.nftSerial);
185
+ }
186
+ (0, env_1.upsertEnv)(opts.env, updates);
187
+ console.log(chalk_1.default.gray(`\n wrote SUBSCRIPTION_APP_ID${result.nftSerial !== undefined ? ' + SUBSCRIPTION_NFT_SERIAL' : ''} to ${opts.env}`));
125
188
  console.log(chalk_1.default.bold.green('\n ✓ subscribed\n'));
126
- console.log(chalk_1.default.gray(' Next: restart your backend; BaaS endpoints can now bind to this appId.\n'));
127
189
  });
128
190
  //# sourceMappingURL=subscribe.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"subscribe.js","sourceRoot":"","sources":["../../src/commands/subscribe.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"subscribe.js","sourceRoot":"","sources":["../../src/commands/subscribe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * `hsuite upgrade --to-tier <T>` — POST /api/v3/subscription/upgrade.
3
+ *
4
+ * If the server returns depositInstructions (top-up), display them and
5
+ * poll /status until PENDING_MINT, then POST /mint — same paid-tier
6
+ * loop as `hsuite subscribe`.
7
+ *
8
+ * Also exposes `hsuite tier-change cancel` as a sibling subcommand so
9
+ * pending upgrades/downgrades can be aborted.
10
+ */
11
+ import { Command } from 'commander';
12
+ import { SubscriptionClient } from '../_lib/subscription-client';
13
+ type UpgradeOpts = {
14
+ env: string;
15
+ gateway?: string;
16
+ appId?: string;
17
+ toTier: string;
18
+ pollIntervalMs?: number;
19
+ pollTimeoutMs?: number;
20
+ clientFactory?: (baseUrl: string) => SubscriptionClient;
21
+ sleep?: (ms: number) => Promise<void>;
22
+ };
23
+ export declare function runUpgrade(opts: UpgradeOpts): Promise<{
24
+ appId: string;
25
+ toTier: string;
26
+ topUpRequired: boolean;
27
+ effectiveAt?: string | number;
28
+ }>;
29
+ export declare const upgradeCommand: Command;
30
+ type CancelOpts = {
31
+ env: string;
32
+ gateway?: string;
33
+ appId?: string;
34
+ clientFactory?: (baseUrl: string) => SubscriptionClient;
35
+ };
36
+ export declare function runCancelTierChange(opts: CancelOpts): Promise<{
37
+ appId: string;
38
+ }>;
39
+ export declare const tierChangeCommand: Command;
40
+ export {};
41
+ //# sourceMappingURL=upgrade.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,EAAE,kBAAkB,EAAuB,MAAM,6BAA6B,CAAC;AAGtF,KAAK,WAAW,GAAG;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,kBAAkB,CAAC;IACxD,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC,CAAC;AAKF,wBAAsB,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC;IAC3D,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC/B,CAAC,CAuCD;AAiBD,eAAO,MAAM,cAAc,SAsBvB,CAAC;AAML,KAAK,UAAU,GAAG;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,kBAAkB,CAAC;CACzD,CAAC;AAEF,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAQtF;AAoBD,eAAO,MAAM,iBAAiB,SAEC,CAAC"}