@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.
- package/dist/_lib/cluster.d.ts +11 -8
- package/dist/_lib/cluster.d.ts.map +1 -1
- package/dist/_lib/cluster.js +8 -35
- package/dist/_lib/cluster.js.map +1 -1
- package/dist/_lib/subscription-client.d.ts +152 -0
- package/dist/_lib/subscription-client.d.ts.map +1 -0
- package/dist/_lib/subscription-client.js +84 -0
- package/dist/_lib/subscription-client.js.map +1 -0
- package/dist/_lib/subscription-env.d.ts +20 -0
- package/dist/_lib/subscription-env.d.ts.map +1 -0
- package/dist/_lib/subscription-env.js +28 -0
- package/dist/_lib/subscription-env.js.map +1 -0
- package/dist/commands/billing.d.ts +17 -0
- package/dist/commands/billing.d.ts.map +1 -0
- package/dist/commands/billing.js +59 -0
- package/dist/commands/billing.js.map +1 -0
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +26 -16
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/downgrade.d.ts +22 -0
- package/dist/commands/downgrade.d.ts.map +1 -0
- package/dist/commands/downgrade.js +55 -0
- package/dist/commands/downgrade.js.map +1 -0
- package/dist/commands/init.js +3 -6
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/renew.d.ts +19 -0
- package/dist/commands/renew.d.ts.map +1 -0
- package/dist/commands/renew.js +58 -0
- package/dist/commands/renew.js.map +1 -0
- package/dist/commands/subscribe.d.ts +40 -4
- package/dist/commands/subscribe.d.ts.map +1 -1
- package/dist/commands/subscribe.js +156 -94
- package/dist/commands/subscribe.js.map +1 -1
- package/dist/commands/upgrade.d.ts +41 -0
- package/dist/commands/upgrade.d.ts.map +1 -0
- package/dist/commands/upgrade.js +128 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/commands/usage.d.ts +22 -0
- package/dist/commands/usage.d.ts.map +1 -0
- package/dist/commands/usage.js +81 -0
- package/dist/commands/usage.js.map +1 -0
- package/dist/commands/verify.d.ts +19 -6
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +75 -15
- package/dist/commands/verify.js.map +1 -1
- package/dist/index.d.ts +8 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -2
- package/dist/index.js.map +1 -1
- 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"}
|
package/dist/commands/init.js
CHANGED
|
@@ -119,12 +119,9 @@ REQUEST_TIMEOUT=30000
|
|
|
119
119
|
ALLOW_INSECURE=false
|
|
120
120
|
|
|
121
121
|
# --- Subscription ---
|
|
122
|
-
# Run \`hsuite subscribe
|
|
123
|
-
|
|
124
|
-
|
|
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":"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
|
|
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` —
|
|
2
|
+
* `hsuite subscribe` — Mint a subscription NFT against the validator's
|
|
3
|
+
* `/api/v3/subscription/*` surface.
|
|
3
4
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
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
|
|
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` —
|
|
9
|
+
* `hsuite subscribe` — Mint a subscription NFT against the validator's
|
|
10
|
+
* `/api/v3/subscription/*` surface.
|
|
9
11
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
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
|
|
26
|
+
const crypto_1 = require("crypto");
|
|
18
27
|
const env_1 = require("../_lib/env");
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
-
|
|
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
|
-
|
|
53
|
-
|
|
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
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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.
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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
|
-
|
|
97
|
-
|
|
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
|
-
|
|
100
|
-
|
|
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
|
-
|
|
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(
|
|
169
|
+
spinner.fail(err.message);
|
|
114
170
|
process.exit(1);
|
|
115
171
|
}
|
|
116
|
-
spinner.succeed(`appId
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
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
|
-
|
|
123
|
-
|
|
124
|
-
|
|
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":";;;;;;
|
|
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"}
|