@hsuite/smart-engines-cli 1.5.0 → 1.5.2
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/README.md +5 -3
- package/dist/_lib/baas.d.ts +27 -4
- package/dist/_lib/baas.d.ts.map +1 -1
- package/dist/_lib/baas.js +76 -42
- package/dist/_lib/baas.js.map +1 -1
- package/dist/_lib/cluster-convergence.d.ts +214 -0
- package/dist/_lib/cluster-convergence.d.ts.map +1 -0
- package/dist/_lib/cluster-convergence.js +381 -0
- package/dist/_lib/cluster-convergence.js.map +1 -0
- package/dist/_lib/docker.d.ts +35 -23
- package/dist/_lib/docker.d.ts.map +1 -1
- package/dist/_lib/docker.js +58 -54
- package/dist/_lib/docker.js.map +1 -1
- package/dist/_lib/frontend-guard.d.ts +59 -0
- package/dist/_lib/frontend-guard.d.ts.map +1 -1
- package/dist/_lib/frontend-guard.js +148 -0
- package/dist/_lib/frontend-guard.js.map +1 -1
- package/dist/_lib/registry-fanout.d.ts +299 -9
- package/dist/_lib/registry-fanout.d.ts.map +1 -1
- package/dist/_lib/registry-fanout.js +557 -27
- package/dist/_lib/registry-fanout.js.map +1 -1
- package/dist/_lib/subscription-client.d.ts +14 -0
- package/dist/_lib/subscription-client.d.ts.map +1 -1
- package/dist/_lib/subscription-client.js +13 -0
- package/dist/_lib/subscription-client.js.map +1 -1
- package/dist/commands/deploy.d.ts +28 -4
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +157 -20
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/redeploy.d.ts +10 -0
- package/dist/commands/redeploy.d.ts.map +1 -1
- package/dist/commands/redeploy.js +140 -15
- package/dist/commands/redeploy.js.map +1 -1
- package/dist/commands/topup.d.ts +55 -0
- package/dist/commands/topup.d.ts.map +1 -0
- package/dist/commands/topup.js +180 -0
- package/dist/commands/topup.js.map +1 -0
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +24 -1
- package/dist/commands/verify.js.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redeploy.d.ts","sourceRoot":"","sources":["../../src/commands/redeploy.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"redeploy.d.ts","sourceRoot":"","sources":["../../src/commands/redeploy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,OAAO,EAAE,cAAc,EAA0C,KAAK,KAAK,EAAE,MAAM,cAAc,CAAC;AAkBlG,MAAM,MAAM,YAAY,GAAG;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qFAAqF;IACrF,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4EAA4E;IAC5E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mFAAmF;IACnF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,aAAa,CAAC,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;IACtE,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,2DAA2D;IAC3D,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,yDAAyD;AACzD,wBAAsB,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CA0P7E;AAuGD,eAAO,MAAM,eAAe,SAoDxB,CAAC"}
|
|
@@ -56,6 +56,11 @@ exports.runRedeploy = runRedeploy;
|
|
|
56
56
|
* redeploy always rebuilds + pushes the backend image and re-uploads the SPA
|
|
57
57
|
* bundle when a `frontend` block is present, then `deploy()`s.
|
|
58
58
|
*
|
|
59
|
+
* #2788: the frontend (build hook + tar + upload) resolves BEFORE the backend
|
|
60
|
+
* `docker build` — the backend `Dockerfile` COPYs `public/` into the image,
|
|
61
|
+
* and `public/` is gitignored build output that only the frontend build hook
|
|
62
|
+
* produces. On a clean checkout it doesn't exist until that hook runs.
|
|
63
|
+
*
|
|
59
64
|
* Same trusted-deploy attestation as `deploy` (the host's deploy policy is
|
|
60
65
|
* hardened-by-default).
|
|
61
66
|
*/
|
|
@@ -70,6 +75,7 @@ const runtime_env_1 = require("../_lib/runtime-env");
|
|
|
70
75
|
const cluster_1 = require("../_lib/cluster");
|
|
71
76
|
const framework_1 = require("../_lib/framework");
|
|
72
77
|
const baas_1 = require("../_lib/baas");
|
|
78
|
+
const cluster_convergence_1 = require("../_lib/cluster-convergence");
|
|
73
79
|
const registry_fanout_1 = require("../_lib/registry-fanout");
|
|
74
80
|
const attestation_1 = require("../_lib/attestation");
|
|
75
81
|
const deploy_manifest_1 = require("../_lib/deploy-manifest");
|
|
@@ -116,9 +122,76 @@ async function runRedeploy(opts) {
|
|
|
116
122
|
console.log(chalk_1.default.gray(` push creds reissued: appId=${creds.appId} registry=${creds.registry.repository}`));
|
|
117
123
|
if (!tag)
|
|
118
124
|
throw new Error('a backend redeploy needs a tag (manifest.backend.tag or --tag)');
|
|
125
|
+
// ── #2788: frontend BEFORE the backend image build. ──────────────────────
|
|
126
|
+
// The backend `Dockerfile` COPYs `public/` into the image, but `public/` is
|
|
127
|
+
// gitignored build output the manifest's own `frontend.build` hook produces
|
|
128
|
+
// — e.g. the showcase's REAL hook (`apps/showcase/smart-app/smart-app.
|
|
129
|
+
// manifest.json` in hsuite-ecosystem): `cd ../../ionic-dapp && npm run
|
|
130
|
+
// build -- --output-path ../smart-app/public`. The `cd` is LOAD-BEARING:
|
|
131
|
+
// `f.build` runs with `cwd` already set to `dir` (the hook's OWN output
|
|
132
|
+
// dir, e.g. `public/`), so a copy of just the `--output-path` tail — run
|
|
133
|
+
// from inside `dir` — builds nothing there (#2793: caught below by
|
|
134
|
+
// `assertPlausibleSpaBundle`, not by this comment; do not paraphrase this
|
|
135
|
+
// example further — copy the manifest's real command or cross-reference it).
|
|
136
|
+
// On a clean checkout `public/` does not exist until that hook runs — build it
|
|
137
|
+
// (and upload the resulting bundle) BEFORE `buildAndPush` below invokes
|
|
138
|
+
// `docker build`, or a clean-checkout image build fails with `failed to
|
|
139
|
+
// compute cache key: "/public": not found`. Every successful deploy to date
|
|
140
|
+
// silently depended on a `public/` left over from an earlier local build.
|
|
141
|
+
// Relative `frontend.dir`/`bundlePath` resolve against the smart-app root —
|
|
142
|
+
// `backend.context` when present, else `--project` — NOT the CLI's
|
|
143
|
+
// process.cwd() (same cwd class as the backend build below).
|
|
144
|
+
const baseDir = (0, path_1.resolve)(b.context ?? opts.projectDir);
|
|
145
|
+
let bundleSha256 = '';
|
|
146
|
+
if (manifest.frontend) {
|
|
147
|
+
const bundlePath = await resolveFrontendBundle(manifest, baseDir, opts.runFn);
|
|
148
|
+
const bundle = await fs_1.promises.readFile(bundlePath);
|
|
149
|
+
const upload = await client.deployment.uploadFrontend(appId, bundle);
|
|
150
|
+
bundleSha256 = upload.bundleSha256;
|
|
151
|
+
console.log(chalk_1.default.gray(` frontend: sha256=${bundleSha256.slice(0, 12)}…`));
|
|
152
|
+
}
|
|
153
|
+
// ── #1679/#2887: pin the push to ONE Harbor origin, or refuse. ───────────
|
|
154
|
+
// `registry.server` is DNS round-robin over three INDEPENDENT Harbors, and a
|
|
155
|
+
// blob upload that hops clusters mid-session dies (`blob upload invalid` —
|
|
156
|
+
// the bytes are on the originating cluster's own RWO PVC). `requirePushOrigin`
|
|
157
|
+
// asks the mesh for the single-origin name it publishes for itself, validates
|
|
158
|
+
// that the name resolves back to the cluster that advertised it, and THROWS
|
|
159
|
+
// when a federated registry yields no pin — the unpinned push it used to fall
|
|
160
|
+
// back to cannot succeed there (#2887, measured on testnet 2026-08-27), so
|
|
161
|
+
// taking it silently just burns an image build and six retries before failing
|
|
162
|
+
// with an error that blames permissions. `null` (no throw) only for a
|
|
163
|
+
// genuinely single-origin registry.
|
|
164
|
+
//
|
|
165
|
+
// The pin feeds `buildAndPush` ONLY. `creds.registry` stays the
|
|
166
|
+
// round-robin name for the attestation probe and the fan-out below, which
|
|
167
|
+
// resolve it into the PER-CLUSTER ingress set — collapse it and the fan-out
|
|
168
|
+
// silently skips (`endpoints.length <= 1`), leaving one cluster with the image
|
|
169
|
+
// and the other two unable to pull it.
|
|
170
|
+
const pushHost = opts.skipPush
|
|
171
|
+
? null
|
|
172
|
+
: await (0, registry_fanout_1.requirePushOrigin)({
|
|
173
|
+
host: (0, registry_fanout_1.registryHostOf)(creds.registry.server),
|
|
174
|
+
repository: creds.registry.repository,
|
|
175
|
+
username: creds.registry.username,
|
|
176
|
+
password: creds.registry.password,
|
|
177
|
+
log: (m) => console.log(chalk_1.default.gray(m)),
|
|
178
|
+
});
|
|
119
179
|
// The `docker push` summary digest — the digest the LOCAL client holds. With a
|
|
120
180
|
// containerd image store (Colima / buildkit) this can differ from the digest
|
|
121
181
|
// Harbor serves for the tag; see resolveAttestationDigest below (#1589).
|
|
182
|
+
// #2766 — prove the candidate tag is FREE on every cluster Harbor BEFORE
|
|
183
|
+
// building/pushing. Tag immutability is per-cluster; a tag already occupied
|
|
184
|
+
// anywhere on the mesh 412s mid-fan-out and can leave the tag diverged across
|
|
185
|
+
// clusters permanently. Skipped when --skip-push: nothing is uploaded, the
|
|
186
|
+
// bytes are wherever a prior push left them and the fan-out below verifies
|
|
187
|
+
// them. A non-federated registry resolves to <=1 endpoint and is a no-op.
|
|
188
|
+
if (!opts.skipPush) {
|
|
189
|
+
await (0, registry_fanout_1.assertTagFreeOnMesh)({
|
|
190
|
+
registry: creds.registry,
|
|
191
|
+
tag,
|
|
192
|
+
log: (m) => console.log(chalk_1.default.gray(m)),
|
|
193
|
+
});
|
|
194
|
+
}
|
|
122
195
|
const pushDigest = (0, baas_1.buildAndPush)({
|
|
123
196
|
registry: creds.registry,
|
|
124
197
|
tag,
|
|
@@ -131,16 +204,24 @@ async function runRedeploy(opts) {
|
|
|
131
204
|
dockerHost: opts.dockerHost,
|
|
132
205
|
name: manifest.name,
|
|
133
206
|
runFn: opts.runFn,
|
|
207
|
+
...(pushHost ? { pushHost } : {}),
|
|
134
208
|
});
|
|
135
209
|
// #1589: attest the digest the registry SERVES for the tag (the same
|
|
136
210
|
// `Docker-Content-Digest` the deployer resolves + pins and the fan-out
|
|
137
211
|
// re-verifies), NOT the local `docker push` summary. Otherwise a containerd
|
|
138
212
|
// image-store push attests a manifest digest Harbor re-serialized under a
|
|
139
213
|
// different sha256 → the #1445 gate rejects a legitimate developer deploy.
|
|
214
|
+
//
|
|
215
|
+
// #2787: WHICH registry answers matters. The push landed on the single origin
|
|
216
|
+
// `pushHost`; on a RE-USED tag the peers keep serving the PREVIOUS artifact
|
|
217
|
+
// until the fan-out below runs, so an endpoint-agnostic probe can (and on
|
|
218
|
+
// testnet did) hand back the old digest and sign it. Pass the origin so its
|
|
219
|
+
// answer is authoritative and a peer's is only a divergence to converge.
|
|
140
220
|
const imageDigest = await (0, registry_fanout_1.resolveAttestationDigest)({
|
|
141
221
|
registry: creds.registry,
|
|
142
222
|
tag,
|
|
143
223
|
pushDigest,
|
|
224
|
+
...(pushHost ? { originHost: pushHost } : {}),
|
|
144
225
|
log: (m) => console.log(chalk_1.default.gray(m)),
|
|
145
226
|
});
|
|
146
227
|
console.log(chalk_1.default.gray(` pushed: ${creds.registry.repository}:${tag} (${imageDigest})`));
|
|
@@ -156,19 +237,6 @@ async function runRedeploy(opts) {
|
|
|
156
237
|
log: (m) => console.log(chalk_1.default.gray(m)),
|
|
157
238
|
});
|
|
158
239
|
}
|
|
159
|
-
// Relative `frontend.dir`/`bundlePath` (and the frontend build hook) resolve
|
|
160
|
-
// against the smart-app root — `backend.context` when present, else
|
|
161
|
-
// `--project` — NOT the CLI's process.cwd(). (Same cwd class as the backend
|
|
162
|
-
// build: a bare `public` must mean `<smart-app>/public`.)
|
|
163
|
-
const baseDir = (0, path_1.resolve)(b.context ?? opts.projectDir);
|
|
164
|
-
let bundleSha256 = '';
|
|
165
|
-
if (manifest.frontend) {
|
|
166
|
-
const bundlePath = await resolveFrontendBundle(manifest, baseDir, opts.runFn);
|
|
167
|
-
const bundle = await fs_1.promises.readFile(bundlePath);
|
|
168
|
-
const upload = await client.deployment.uploadFrontend(appId, bundle);
|
|
169
|
-
bundleSha256 = upload.bundleSha256;
|
|
170
|
-
console.log(chalk_1.default.gray(` frontend: sha256=${bundleSha256.slice(0, 12)}…`));
|
|
171
|
-
}
|
|
172
240
|
// Forward the developer's `.env.local` runtime creds into the deployed
|
|
173
241
|
// customer-env (issue #1564) — same as `deploy`. `manifest.backend.env` wins
|
|
174
242
|
// for explicit non-secret overrides; secrets ride from `.env.local`. Resolved
|
|
@@ -214,6 +282,25 @@ async function runRedeploy(opts) {
|
|
|
214
282
|
throw new Error(`redeploy reached FAILED runtime for ${appId}` +
|
|
215
283
|
(status.runtime?.lastError ? `: ${status.runtime.lastError}` : ''));
|
|
216
284
|
}
|
|
285
|
+
// #2787: `waitForRunning` polls the ROUND-ROBIN gateway, so a RUNNING here
|
|
286
|
+
// is one cluster's answer, not the fleet's. The deploy call itself only ever
|
|
287
|
+
// reached one cluster and the peer replication is asynchronous, so a cluster
|
|
288
|
+
// can keep an older runtime record — serving the OLD release, or nothing —
|
|
289
|
+
// while this command prints `✓ redeployed`. Ask every cluster directly and
|
|
290
|
+
// fail loudly (naming the cluster and both digests) if one has not
|
|
291
|
+
// converged. Skipped with --no-wait: nothing has been given time to settle.
|
|
292
|
+
if (!opts.skipClusterCheck) {
|
|
293
|
+
await (0, cluster_convergence_1.waitForClusterConvergence)({
|
|
294
|
+
gateway: opts.gateway,
|
|
295
|
+
appId,
|
|
296
|
+
authAppId: subscriptionAppId,
|
|
297
|
+
signer: (0, env_1.buildSignerFromEnv)(env),
|
|
298
|
+
expectedImage: (0, baas_1.imageTarget)(creds.registry, tag),
|
|
299
|
+
attestedDigest: imageDigest,
|
|
300
|
+
log: (m) => console.log(chalk_1.default.gray(m)),
|
|
301
|
+
...(opts.sleep ? { sleep: opts.sleep } : {}),
|
|
302
|
+
});
|
|
303
|
+
}
|
|
217
304
|
}
|
|
218
305
|
return { appId, url };
|
|
219
306
|
}
|
|
@@ -231,14 +318,23 @@ async function resolveFrontendBundle(manifest, baseDir, runFn) {
|
|
|
231
318
|
const p = (0, path_1.resolve)(baseDir, f.bundlePath);
|
|
232
319
|
if (!(0, fs_1.existsSync)(p))
|
|
233
320
|
throw new Error(`frontend bundle not found: ${p}`);
|
|
321
|
+
// #2798/#2791: bundlePath used to return BEFORE both SPA guards. Same
|
|
322
|
+
// tar-aware validation as deploy.ts — index.html at root, non-zero, no
|
|
323
|
+
// unfilled REPLACE_BEFORE_DEPLOY sentinels after unpacking.
|
|
324
|
+
await (0, frontend_guard_1.assertPlausibleSpaTarball)(p, runFn);
|
|
234
325
|
return p;
|
|
235
326
|
}
|
|
236
327
|
const dir = (0, path_1.resolve)(baseDir, f.dir);
|
|
237
|
-
if (!(0, fs_1.existsSync)(dir))
|
|
238
|
-
throw new Error(`frontend dir not found: ${dir}`);
|
|
239
328
|
// Optional pre-build (e.g. `ng build`) — run via the injected seam IN `dir`
|
|
240
329
|
// (a real chdir; `PWD` alone does not move the child's working directory).
|
|
241
330
|
if (f.build) {
|
|
331
|
+
// #2788: `dir` is the hook's OUTPUT (e.g. `public/`), which a clean
|
|
332
|
+
// checkout does not have yet — it's gitignored build output, not
|
|
333
|
+
// checked-in source. `execFileSync`/`spawnSync` throw ENOENT when `cwd`
|
|
334
|
+
// doesn't exist on disk (verified), so the hook could never even start on
|
|
335
|
+
// a fresh clone. Ensure `dir` exists (idempotent no-op if it already does
|
|
336
|
+
// from a prior local build) BEFORE spawning the hook that populates it.
|
|
337
|
+
await fs_1.promises.mkdir(dir, { recursive: true });
|
|
242
338
|
const run = runFn ?? (await Promise.resolve().then(() => __importStar(require('child_process')))).execFileSync;
|
|
243
339
|
run('sh', ['-c', f.build], {
|
|
244
340
|
stdio: 'inherit',
|
|
@@ -246,6 +342,33 @@ async function resolveFrontendBundle(manifest, baseDir, runFn) {
|
|
|
246
342
|
env: { ...process.env, PWD: dir },
|
|
247
343
|
});
|
|
248
344
|
}
|
|
345
|
+
// No build hook to have produced `dir` — it must already exist (a
|
|
346
|
+
// pre-built/checked-in SPA dir). With a hook, this is checked AFTER it runs
|
|
347
|
+
// (moved from before #2788) so the hook is what's allowed to create `dir`.
|
|
348
|
+
if (!(0, fs_1.existsSync)(dir))
|
|
349
|
+
throw new Error(`frontend dir not found: ${dir}`);
|
|
350
|
+
// #2793 + #2795: assert `dir` is plausibly a built SPA (non-empty,
|
|
351
|
+
// `index.html` at its root) on BOTH branches, because BOTH ship an empty
|
|
352
|
+
// bundle silently otherwise:
|
|
353
|
+
// - WITH a hook (#2793): #2790's `mkdir` above means the `existsSync`
|
|
354
|
+
// guard can no longer catch a hook that exits 0 without populating
|
|
355
|
+
// `dir` — `dir` always exists post-mkdir.
|
|
356
|
+
// - WITHOUT a hook (#2795): `existsSync` never checked
|
|
357
|
+
// empty-vs-populated, so an EXISTING but EMPTY `dir` (wiped,
|
|
358
|
+
// mis-`.gitignore`'d, stale checkout, a typo'd `dir` that resolves to
|
|
359
|
+
// an existing folder) passed straight through.
|
|
360
|
+
// Nothing downstream catches either: `assertNoDeploySentinels` no-ops on
|
|
361
|
+
// zero files, `tarFrontend` tars nothing into a syntactically valid tar,
|
|
362
|
+
// and the host only logs `size=<n>B`. Deliberately AFTER `existsSync`: on
|
|
363
|
+
// the no-hook branch `dir` is not guaranteed to exist and `fs.readdir`
|
|
364
|
+
// would throw a bare ENOENT instead of that descriptive message. On the
|
|
365
|
+
// hook branch `existsSync` is normally a no-op (`mkdir` guaranteed `dir`),
|
|
366
|
+
// so the reorder is normally unobservable — the one case where it IS
|
|
367
|
+
// observable is a hook that DELETES its own output dir, which now reports
|
|
368
|
+
// `frontend dir not found` instead of a raw `ENOENT ... scandir`. Strictly
|
|
369
|
+
// better, and the reason this order is not incidental. `f.build` is passed
|
|
370
|
+
// through as-is so the remedy blames the hook only when there was one.
|
|
371
|
+
await (0, frontend_guard_1.assertPlausibleSpaBundle)(dir, f.build);
|
|
249
372
|
// Fail-closed: never re-ship a bundle that still carries unfilled
|
|
250
373
|
// REPLACE_BEFORE_DEPLOY placeholders (shared with `deploy`). See frontend-guard.
|
|
251
374
|
await (0, frontend_guard_1.assertNoDeploySentinels)(dir);
|
|
@@ -284,6 +407,7 @@ exports.redeployCommand = new commander_1.Command('redeploy')
|
|
|
284
407
|
.option('--skip-build', 'Skip `docker build`', false)
|
|
285
408
|
.option('--skip-push', 'Skip `docker push`', false)
|
|
286
409
|
.option('--skip-distribute', 'Skip the multi-cluster image fan-out (single-cluster / dev registry)', false)
|
|
410
|
+
.option('--skip-cluster-check', 'Skip the post-deploy per-cluster convergence check (#2787). Only for a known-degraded mesh — a skipped check is how a third of the fleet stays silently stuck.', false)
|
|
287
411
|
.option('--allow-open-mode', 'Allow an intentional zero-cred / open-mode redeploy (no XRPL_SEED forwarded). Default: a credential-less redeploy FAILS LOUD (#1564).', false)
|
|
288
412
|
.option('--no-wait', 'Do not block until the runtime settles — exit as soon as deploy() is accepted (default: wait for RUNNING/FAILED)')
|
|
289
413
|
.action(async (opts) => {
|
|
@@ -303,6 +427,7 @@ exports.redeployCommand = new commander_1.Command('redeploy')
|
|
|
303
427
|
skipBuild: opts.skipBuild,
|
|
304
428
|
skipPush: opts.skipPush,
|
|
305
429
|
skipDistribute: opts.skipDistribute,
|
|
430
|
+
skipClusterCheck: opts.skipClusterCheck,
|
|
306
431
|
allowOpenMode: opts.allowOpenMode,
|
|
307
432
|
wait: opts.wait,
|
|
308
433
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redeploy.js","sourceRoot":"","sources":["../../src/commands/redeploy.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"redeploy.js","sourceRoot":"","sources":["../../src/commands/redeploy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `hsuite topup` — re-fund a drained prepaid float WITHOUT changing tier (#2857).
|
|
3
|
+
*
|
|
4
|
+
* ## Why this exists
|
|
5
|
+
*
|
|
6
|
+
* The subscription deposit is a PREPAID FLOAT: it is seeded once at activation
|
|
7
|
+
* and only ever decreases (`remainingBalance = fundedAmount − settledAmount`,
|
|
8
|
+
* and `settledAmount` is monotonic). Nothing re-funded it:
|
|
9
|
+
*
|
|
10
|
+
* - `hsuite renew` extends the deposit LOCK but takes no fresh deposit;
|
|
11
|
+
* - the validator's deposit monitor credits only `PENDING_DEPOSIT` rows, so
|
|
12
|
+
* paying the deposit wallet of an ACTIVE subscription was never credited;
|
|
13
|
+
* - the only top-up in the codebase rode the tier-UPGRADE confirm.
|
|
14
|
+
*
|
|
15
|
+
* So a pay-per-use app that simply consumed its credit had no way back except
|
|
16
|
+
* changing product tier. Observed live 2026-08-26: the showcase hit
|
|
17
|
+
* `remainingBalance = 0` and the deployer's subscription gate pinned it at 0
|
|
18
|
+
* replicas ("scaling Deployment → 0 (subscription not active)").
|
|
19
|
+
*
|
|
20
|
+
* ## Flow
|
|
21
|
+
*
|
|
22
|
+
* 1. Read XRPL_ADDRESS + XRPL_SEED + the appId from env (`hsuite init`).
|
|
23
|
+
* 2. Web3-auth against the validator (the route is ownership-guarded).
|
|
24
|
+
* 3. POST /api/v3/subscription/topup → records the pending credit and returns
|
|
25
|
+
* the EXISTING deposit wallet + the amount to send.
|
|
26
|
+
* 4. Auto-pay that credit in HST (SendMax covers the 0.25% transfer fee),
|
|
27
|
+
* unless `--no-autopay`.
|
|
28
|
+
* 5. Poll status until the float is back above zero — the validator's deposit
|
|
29
|
+
* monitor applies it via `checkPendingTopUp`, capped by the 3× rollover cap.
|
|
30
|
+
*
|
|
31
|
+
* On testnet the credit costs nothing real: `hsuite faucet` dispenses HSUITE-testnet.
|
|
32
|
+
*/
|
|
33
|
+
import { Command } from 'commander';
|
|
34
|
+
import { SubscriptionClient } from '../_lib/subscription-client';
|
|
35
|
+
export type TopUpOpts = {
|
|
36
|
+
env: string;
|
|
37
|
+
gateway?: string;
|
|
38
|
+
appId?: string;
|
|
39
|
+
amount?: string;
|
|
40
|
+
autopay?: boolean;
|
|
41
|
+
clientFactory?: (baseUrl: string) => SubscriptionClient;
|
|
42
|
+
xrplClientFactory?: (wss: string) => any;
|
|
43
|
+
walletSignFactory?: (seed: string) => (prepared: unknown) => string;
|
|
44
|
+
sleepFn?: (ms: number) => Promise<void>;
|
|
45
|
+
};
|
|
46
|
+
export declare function runTopUp(opts: TopUpOpts): Promise<{
|
|
47
|
+
appId: string;
|
|
48
|
+
amount?: string;
|
|
49
|
+
depositAddress?: string;
|
|
50
|
+
paid: boolean;
|
|
51
|
+
applied: boolean;
|
|
52
|
+
remainingBalance?: string;
|
|
53
|
+
}>;
|
|
54
|
+
export declare const topupCommand: Command;
|
|
55
|
+
//# sourceMappingURL=topup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"topup.d.ts","sourceRoot":"","sources":["../../src/commands/topup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AASjE,MAAM,MAAM,SAAS,GAAG;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,kBAAkB,CAAC;IACxD,iBAAiB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,GAAG,CAAC;IACzC,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,CAAC,QAAQ,EAAE,OAAO,KAAK,MAAM,CAAC;IACpE,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACzC,CAAC;AA8BF,wBAAsB,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC;IACvD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC,CA2ED;AAED,eAAO,MAAM,YAAY,SAgCrB,CAAC"}
|
|
@@ -0,0 +1,180 @@
|
|
|
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.topupCommand = void 0;
|
|
7
|
+
exports.runTopUp = runTopUp;
|
|
8
|
+
/**
|
|
9
|
+
* `hsuite topup` — re-fund a drained prepaid float WITHOUT changing tier (#2857).
|
|
10
|
+
*
|
|
11
|
+
* ## Why this exists
|
|
12
|
+
*
|
|
13
|
+
* The subscription deposit is a PREPAID FLOAT: it is seeded once at activation
|
|
14
|
+
* and only ever decreases (`remainingBalance = fundedAmount − settledAmount`,
|
|
15
|
+
* and `settledAmount` is monotonic). Nothing re-funded it:
|
|
16
|
+
*
|
|
17
|
+
* - `hsuite renew` extends the deposit LOCK but takes no fresh deposit;
|
|
18
|
+
* - the validator's deposit monitor credits only `PENDING_DEPOSIT` rows, so
|
|
19
|
+
* paying the deposit wallet of an ACTIVE subscription was never credited;
|
|
20
|
+
* - the only top-up in the codebase rode the tier-UPGRADE confirm.
|
|
21
|
+
*
|
|
22
|
+
* So a pay-per-use app that simply consumed its credit had no way back except
|
|
23
|
+
* changing product tier. Observed live 2026-08-26: the showcase hit
|
|
24
|
+
* `remainingBalance = 0` and the deployer's subscription gate pinned it at 0
|
|
25
|
+
* replicas ("scaling Deployment → 0 (subscription not active)").
|
|
26
|
+
*
|
|
27
|
+
* ## Flow
|
|
28
|
+
*
|
|
29
|
+
* 1. Read XRPL_ADDRESS + XRPL_SEED + the appId from env (`hsuite init`).
|
|
30
|
+
* 2. Web3-auth against the validator (the route is ownership-guarded).
|
|
31
|
+
* 3. POST /api/v3/subscription/topup → records the pending credit and returns
|
|
32
|
+
* the EXISTING deposit wallet + the amount to send.
|
|
33
|
+
* 4. Auto-pay that credit in HST (SendMax covers the 0.25% transfer fee),
|
|
34
|
+
* unless `--no-autopay`.
|
|
35
|
+
* 5. Poll status until the float is back above zero — the validator's deposit
|
|
36
|
+
* monitor applies it via `checkPendingTopUp`, capped by the 3× rollover cap.
|
|
37
|
+
*
|
|
38
|
+
* On testnet the credit costs nothing real: `hsuite faucet` dispenses HSUITE-testnet.
|
|
39
|
+
*/
|
|
40
|
+
const commander_1 = require("commander");
|
|
41
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
42
|
+
const ora_1 = __importDefault(require("ora"));
|
|
43
|
+
const env_1 = require("../_lib/env");
|
|
44
|
+
const subscription_client_1 = require("../_lib/subscription-client");
|
|
45
|
+
const subscription_env_1 = require("../_lib/subscription-env");
|
|
46
|
+
const XRPL_TESTNET_WSS = 'wss://s.altnet.rippletest.net:51233';
|
|
47
|
+
/** Covers the 0.25% HST transfer fee, matching `hsuite subscribe`. */
|
|
48
|
+
const HST_TRANSFER_FEE_MULTIPLIER = 1.004;
|
|
49
|
+
const POLL_ATTEMPTS = 30;
|
|
50
|
+
const POLL_INTERVAL_MS = 5_000;
|
|
51
|
+
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
52
|
+
function defaultXrplClientFactory(wss) {
|
|
53
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
54
|
+
const { Client } = require('xrpl');
|
|
55
|
+
return new Client(wss);
|
|
56
|
+
}
|
|
57
|
+
function defaultWalletSignFactory(seed) {
|
|
58
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
59
|
+
const { Wallet } = require('xrpl');
|
|
60
|
+
const wallet = Wallet.fromSeed(seed);
|
|
61
|
+
return (prepared) => wallet.sign(prepared).tx_blob;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Resolve the HST issuer from the destination's trust lines — the same
|
|
65
|
+
* derivation `hsuite subscribe` uses, so the credit rides the identical asset.
|
|
66
|
+
*/
|
|
67
|
+
async function resolveHstIssuer(client, destination) {
|
|
68
|
+
const res = await client.request({ command: 'account_lines', account: destination });
|
|
69
|
+
const line = (res?.result?.lines ?? []).find((l) => l.currency === 'HST');
|
|
70
|
+
if (!line?.account) {
|
|
71
|
+
throw new Error(`could not resolve the HST issuer from ${destination}'s trust lines`);
|
|
72
|
+
}
|
|
73
|
+
return line.account;
|
|
74
|
+
}
|
|
75
|
+
async function runTopUp(opts) {
|
|
76
|
+
const env = (0, env_1.readEnv)(opts.env);
|
|
77
|
+
const baseUrl = (0, subscription_env_1.requireValidatorUrl)(env, { gateway: opts.gateway });
|
|
78
|
+
const appId = (0, subscription_env_1.requireAppId)(env, { appId: opts.appId });
|
|
79
|
+
const address = env.get('XRPL_ADDRESS');
|
|
80
|
+
const seed = env.get('XRPL_SEED');
|
|
81
|
+
if (!address || !seed) {
|
|
82
|
+
throw new Error('XRPL_ADDRESS and XRPL_SEED are required in the env file (run `hsuite init`)');
|
|
83
|
+
}
|
|
84
|
+
if (opts.amount !== undefined && !/^\d+$/.test(opts.amount)) {
|
|
85
|
+
throw new Error(`--amount must be a non-negative integer (got "${opts.amount}")`);
|
|
86
|
+
}
|
|
87
|
+
const client = (opts.clientFactory ??
|
|
88
|
+
((b) => new subscription_client_1.SubscriptionClient({ baseUrl: b, auth: { chain: 'xrpl', address, seed } })))(baseUrl);
|
|
89
|
+
await client.authenticate();
|
|
90
|
+
const req = await client.topUp(appId, opts.amount);
|
|
91
|
+
if (!req.success || !req.amount || !req.depositAddress) {
|
|
92
|
+
throw new Error(`top-up request failed: ${req.message ?? 'unknown error'}`);
|
|
93
|
+
}
|
|
94
|
+
if (opts.autopay === false) {
|
|
95
|
+
return { appId, amount: req.amount, depositAddress: req.depositAddress, paid: false, applied: false };
|
|
96
|
+
}
|
|
97
|
+
// ── Pay the credit ───────────────────────────────────────────────────────
|
|
98
|
+
const walletSign = (opts.walletSignFactory ?? defaultWalletSignFactory)(seed);
|
|
99
|
+
const xrpl = (opts.xrplClientFactory ?? defaultXrplClientFactory)(XRPL_TESTNET_WSS);
|
|
100
|
+
await xrpl.connect();
|
|
101
|
+
try {
|
|
102
|
+
const issuer = await resolveHstIssuer(xrpl, req.depositAddress);
|
|
103
|
+
const sendMax = (Number(req.amount) * HST_TRANSFER_FEE_MULTIPLIER).toFixed(6);
|
|
104
|
+
const prepared = await xrpl.autofill({
|
|
105
|
+
TransactionType: 'Payment',
|
|
106
|
+
Account: address,
|
|
107
|
+
Destination: req.depositAddress,
|
|
108
|
+
Amount: { currency: 'HST', issuer, value: req.amount },
|
|
109
|
+
SendMax: { currency: 'HST', issuer, value: sendMax },
|
|
110
|
+
});
|
|
111
|
+
const result = await xrpl.submitAndWait(walletSign(prepared));
|
|
112
|
+
const code = result?.result?.meta?.TransactionResult;
|
|
113
|
+
if (code !== 'tesSUCCESS') {
|
|
114
|
+
throw new Error(`top-up Payment failed: ${code ?? 'unknown result'}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
finally {
|
|
118
|
+
await xrpl.disconnect();
|
|
119
|
+
}
|
|
120
|
+
// ── Wait for the validator's deposit monitor to apply it ─────────────────
|
|
121
|
+
const nap = opts.sleepFn ?? sleep;
|
|
122
|
+
for (let i = 0; i < POLL_ATTEMPTS; i++) {
|
|
123
|
+
await nap(POLL_INTERVAL_MS);
|
|
124
|
+
try {
|
|
125
|
+
const st = await client.status(appId);
|
|
126
|
+
const remaining = st?.remainingBalance ?? st?.subscription?.remainingBalance;
|
|
127
|
+
if (remaining !== undefined && BigInt(remaining) > 0n) {
|
|
128
|
+
return {
|
|
129
|
+
appId,
|
|
130
|
+
amount: req.amount,
|
|
131
|
+
depositAddress: req.depositAddress,
|
|
132
|
+
paid: true,
|
|
133
|
+
applied: true,
|
|
134
|
+
remainingBalance: String(remaining),
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
// transient read failure — keep polling
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Paid but not yet observed: the monitor tick is periodic, so this is not a
|
|
143
|
+
// failure of the payment. Report honestly rather than claiming success.
|
|
144
|
+
return { appId, amount: req.amount, depositAddress: req.depositAddress, paid: true, applied: false };
|
|
145
|
+
}
|
|
146
|
+
exports.topupCommand = new commander_1.Command('topup')
|
|
147
|
+
.description('Re-fund the prepaid float without changing tier (same-tier credit top-up)')
|
|
148
|
+
.option('--env <file>', 'Env file with XRPL creds + subscription appId', '.env.local')
|
|
149
|
+
.option('--gateway <url>', 'Validator/gateway URL (defaults to VALIDATOR_URL in env)')
|
|
150
|
+
.option('--app-id <id>', 'Override SUBSCRIPTION_APP_ID from env')
|
|
151
|
+
.option('--amount <hst>', 'Credit in HSUITE smallest-units (default: one month of the current tier)')
|
|
152
|
+
.option('--no-autopay', 'Only request the credit and print instructions; do not pay')
|
|
153
|
+
.action(async (opts) => {
|
|
154
|
+
console.log(chalk_1.default.bold.cyan('\n hsuite topup\n'));
|
|
155
|
+
const spinner = (0, ora_1.default)('requesting float top-up...').start();
|
|
156
|
+
try {
|
|
157
|
+
const r = await runTopUp(opts);
|
|
158
|
+
if (!r.paid) {
|
|
159
|
+
spinner.info(`top-up requested (appId=${r.appId}) — not paid (--no-autopay)`);
|
|
160
|
+
console.log(chalk_1.default.gray(` send ${r.amount} HST to ${r.depositAddress}`));
|
|
161
|
+
console.log(chalk_1.default.cyan('\n then re-run `hsuite topup` (or wait for the deposit monitor).\n'));
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
if (r.applied) {
|
|
165
|
+
spinner.succeed(`float topped up (appId=${r.appId})`);
|
|
166
|
+
console.log(chalk_1.default.gray(` credit: ${r.amount} HST`));
|
|
167
|
+
console.log(chalk_1.default.gray(` remainingBalance: ${r.remainingBalance}`));
|
|
168
|
+
console.log(chalk_1.default.bold.green('\n ✓ subscription funded\n'));
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
spinner.warn(`credit paid but not yet applied (appId=${r.appId})`);
|
|
172
|
+
console.log(chalk_1.default.gray(' the validator applies it on its next deposit-monitor tick.'));
|
|
173
|
+
console.log(chalk_1.default.gray(' re-check with `hsuite status`.'));
|
|
174
|
+
}
|
|
175
|
+
catch (err) {
|
|
176
|
+
spinner.fail(err.message);
|
|
177
|
+
process.exit(1);
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
//# sourceMappingURL=topup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"topup.js","sourceRoot":"","sources":["../../src/commands/topup.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoGpC;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAqO5C;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa,SAAuB,CAAC"}
|
package/dist/commands/verify.js
CHANGED
|
@@ -255,7 +255,19 @@ Exit codes:
|
|
|
255
255
|
}
|
|
256
256
|
}
|
|
257
257
|
// ── Verify ────────────────────────────────────────────────────────────
|
|
258
|
-
|
|
258
|
+
// #1578 / SDK 6.0.0: security-bearing consumers (currently `app-registry`)
|
|
259
|
+
// REFUSE to verify without a validator-registry snapshot — signature-only
|
|
260
|
+
// verification is meaningless when an attacker can mint ML-DSA keypairs at
|
|
261
|
+
// will. Fetch a snapshot from the same smart-host proxy the cert came from.
|
|
262
|
+
// `fetchRegistrySnapshot` never throws; `null` (offline / unavailable) is
|
|
263
|
+
// passed as `undefined`, and the verifier then reports
|
|
264
|
+
// `registry-snapshot-required` rather than silently reporting `valid`.
|
|
265
|
+
const registryServer = opts.server ??
|
|
266
|
+
process.env.SMART_HOST_URL ??
|
|
267
|
+
process.env.VALIDATOR_URL ??
|
|
268
|
+
cluster_1.DEFAULT_GATEWAY;
|
|
269
|
+
const registrySnapshot = (await (0, smart_engines_sdk_1.fetchRegistrySnapshot)(registryServer)) ?? undefined;
|
|
270
|
+
const result = await (0, smart_engines_sdk_1.verifyPqcAttestation)(cert, payload, registrySnapshot);
|
|
259
271
|
if (result.valid) {
|
|
260
272
|
const n = result.verifiedSignerCount ?? 0;
|
|
261
273
|
// `signers.length` is on the cert (already schema-validated by
|
|
@@ -267,6 +279,17 @@ Exit codes:
|
|
|
267
279
|
console.log(chalk_1.default.green(` Cert valid — ${n} of ${m} signers verified, threshold met`));
|
|
268
280
|
process.exit(0);
|
|
269
281
|
}
|
|
282
|
+
else if (result.reason?.startsWith('registry-snapshot-required')) {
|
|
283
|
+
// Not a bad cert — we could not reach a registry to bind signers to.
|
|
284
|
+
// Say so plainly instead of reporting the cert as invalid.
|
|
285
|
+
console.error(chalk_1.default.red(' Cannot verify — a validator-registry snapshot is required for this\n' +
|
|
286
|
+
' consumer, and none could be fetched from\n' +
|
|
287
|
+
` ${registryServer}/api/registry/snapshot\n` +
|
|
288
|
+
' Signature-only verification is not sufficient for a security-bearing\n' +
|
|
289
|
+
' cert (an attacker can mint keypairs). Point --server at a reachable\n' +
|
|
290
|
+
' smart-host, or set SMART_HOST_URL.\n'));
|
|
291
|
+
process.exit(2);
|
|
292
|
+
}
|
|
270
293
|
else {
|
|
271
294
|
console.error(chalk_1.default.red(` Cert invalid — ${humanizeReason(result.reason)}`));
|
|
272
295
|
process.exit(1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"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"}
|