@hsuite/smart-engines-cli 1.2.1 → 1.4.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.
Files changed (109) hide show
  1. package/README.md +272 -58
  2. package/dist/_lib/attestation.d.ts +45 -0
  3. package/dist/_lib/attestation.d.ts.map +1 -0
  4. package/dist/_lib/attestation.js +76 -0
  5. package/dist/_lib/attestation.js.map +1 -0
  6. package/dist/_lib/baas.d.ts +147 -0
  7. package/dist/_lib/baas.d.ts.map +1 -0
  8. package/dist/_lib/baas.js +260 -0
  9. package/dist/_lib/baas.js.map +1 -0
  10. package/dist/_lib/cluster.d.ts +6 -6
  11. package/dist/_lib/cluster.js +6 -6
  12. package/dist/_lib/deploy-manifest.d.ts +69 -0
  13. package/dist/_lib/deploy-manifest.d.ts.map +1 -0
  14. package/dist/_lib/deploy-manifest.js +87 -0
  15. package/dist/_lib/deploy-manifest.js.map +1 -0
  16. package/dist/_lib/docker.d.ts +82 -0
  17. package/dist/_lib/docker.d.ts.map +1 -0
  18. package/dist/_lib/docker.js +164 -0
  19. package/dist/_lib/docker.js.map +1 -0
  20. package/dist/_lib/faucet-client.d.ts +64 -0
  21. package/dist/_lib/faucet-client.d.ts.map +1 -0
  22. package/dist/_lib/faucet-client.js +92 -0
  23. package/dist/_lib/faucet-client.js.map +1 -0
  24. package/dist/_lib/framework.d.ts +59 -0
  25. package/dist/_lib/framework.d.ts.map +1 -0
  26. package/dist/_lib/framework.js +149 -0
  27. package/dist/_lib/framework.js.map +1 -0
  28. package/dist/_lib/frontend-guard.d.ts +13 -0
  29. package/dist/_lib/frontend-guard.d.ts.map +1 -0
  30. package/dist/_lib/frontend-guard.js +41 -0
  31. package/dist/_lib/frontend-guard.js.map +1 -0
  32. package/dist/_lib/registry-fanout.d.ts +178 -0
  33. package/dist/_lib/registry-fanout.d.ts.map +1 -0
  34. package/dist/_lib/registry-fanout.js +545 -0
  35. package/dist/_lib/registry-fanout.js.map +1 -0
  36. package/dist/_lib/runtime-env.d.ts +126 -0
  37. package/dist/_lib/runtime-env.d.ts.map +1 -0
  38. package/dist/_lib/runtime-env.js +172 -0
  39. package/dist/_lib/runtime-env.js.map +1 -0
  40. package/dist/_lib/subscription-client.d.ts +129 -18
  41. package/dist/_lib/subscription-client.d.ts.map +1 -1
  42. package/dist/_lib/subscription-client.js +268 -40
  43. package/dist/_lib/subscription-client.js.map +1 -1
  44. package/dist/_lib/subscription-env.d.ts +35 -0
  45. package/dist/_lib/subscription-env.d.ts.map +1 -1
  46. package/dist/_lib/subscription-env.js +46 -2
  47. package/dist/_lib/subscription-env.js.map +1 -1
  48. package/dist/commands/app-lifecycle.d.ts +36 -0
  49. package/dist/commands/app-lifecycle.d.ts.map +1 -0
  50. package/dist/commands/app-lifecycle.js +145 -0
  51. package/dist/commands/app-lifecycle.js.map +1 -0
  52. package/dist/commands/ci.d.ts +45 -0
  53. package/dist/commands/ci.d.ts.map +1 -0
  54. package/dist/commands/ci.js +174 -0
  55. package/dist/commands/ci.js.map +1 -0
  56. package/dist/commands/deploy-manifest.d.ts +11 -0
  57. package/dist/commands/deploy-manifest.d.ts.map +1 -0
  58. package/dist/commands/deploy-manifest.js +17 -0
  59. package/dist/commands/deploy-manifest.js.map +1 -0
  60. package/dist/commands/deploy.d.ts +70 -11
  61. package/dist/commands/deploy.d.ts.map +1 -1
  62. package/dist/commands/deploy.js +273 -150
  63. package/dist/commands/deploy.js.map +1 -1
  64. package/dist/commands/downgrade.js +1 -1
  65. package/dist/commands/downgrade.js.map +1 -1
  66. package/dist/commands/faucet.d.ts +78 -0
  67. package/dist/commands/faucet.d.ts.map +1 -0
  68. package/dist/commands/faucet.js +184 -0
  69. package/dist/commands/faucet.js.map +1 -0
  70. package/dist/commands/governance.js +1 -1
  71. package/dist/commands/governance.js.map +1 -1
  72. package/dist/commands/hist-balance.d.ts +1 -1
  73. package/dist/commands/hist-balance.js +1 -1
  74. package/dist/commands/init.js +1 -1
  75. package/dist/commands/list.d.ts +22 -0
  76. package/dist/commands/list.d.ts.map +1 -0
  77. package/dist/commands/list.js +81 -0
  78. package/dist/commands/list.js.map +1 -0
  79. package/dist/commands/personhood.js +2 -2
  80. package/dist/commands/personhood.js.map +1 -1
  81. package/dist/commands/redeploy.d.ts +62 -0
  82. package/dist/commands/redeploy.d.ts.map +1 -0
  83. package/dist/commands/redeploy.js +322 -0
  84. package/dist/commands/redeploy.js.map +1 -0
  85. package/dist/commands/status.d.ts +51 -0
  86. package/dist/commands/status.d.ts.map +1 -0
  87. package/dist/commands/status.js +138 -0
  88. package/dist/commands/status.js.map +1 -0
  89. package/dist/commands/subscribe.d.ts +94 -17
  90. package/dist/commands/subscribe.d.ts.map +1 -1
  91. package/dist/commands/subscribe.js +487 -81
  92. package/dist/commands/subscribe.js.map +1 -1
  93. package/dist/commands/transactions.d.ts +60 -0
  94. package/dist/commands/transactions.d.ts.map +1 -0
  95. package/dist/commands/transactions.js +101 -0
  96. package/dist/commands/transactions.js.map +1 -0
  97. package/dist/commands/update.d.ts +40 -0
  98. package/dist/commands/update.d.ts.map +1 -0
  99. package/dist/commands/update.js +114 -0
  100. package/dist/commands/update.js.map +1 -0
  101. package/dist/commands/verify.d.ts +10 -19
  102. package/dist/commands/verify.d.ts.map +1 -1
  103. package/dist/commands/verify.js +14 -23
  104. package/dist/commands/verify.js.map +1 -1
  105. package/dist/index.d.ts +12 -3
  106. package/dist/index.d.ts.map +1 -1
  107. package/dist/index.js +32 -3
  108. package/dist/index.js.map +1 -1
  109. package/package.json +11 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontend-guard.d.ts","sourceRoot":"","sources":["../../src/_lib/frontend-guard.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;GAUG;AACH,wBAAsB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBxE"}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.assertNoDeploySentinels = assertNoDeploySentinels;
4
+ const fs_1 = require("fs");
5
+ const path_1 = require("path");
6
+ /**
7
+ * Fail-closed guard shared by `deploy` and `redeploy`: refuse to ship a
8
+ * frontend build that still carries unfilled `REPLACE_BEFORE_DEPLOY:<key>`
9
+ * placeholders (per-deployment config that was never set).
10
+ *
11
+ * Such a build refuses to bootstrap in the browser (the SPA's `main.ts` asserts
12
+ * on the sentinel prefix), and the CLI would otherwise tar+upload it silently —
13
+ * which is exactly how a non-bootstrapping bundle reached production. Matches
14
+ * the sentinel VALUE form (`:` followed by a letter) so it does NOT
15
+ * false-positive on the guard's own comparison literal (`REPLACE_BEFORE_DEPLOY:"`).
16
+ */
17
+ async function assertNoDeploySentinels(dir) {
18
+ const SENTINEL = /REPLACE_BEFORE_DEPLOY:[A-Za-z]/;
19
+ const TEXT_EXT = /\.(js|mjs|cjs|html|css|json|txt|map|webmanifest)$/i;
20
+ const hits = [];
21
+ const walk = async (d) => {
22
+ for (const ent of await fs_1.promises.readdir(d, { withFileTypes: true })) {
23
+ const p = (0, path_1.join)(d, ent.name);
24
+ if (ent.isDirectory())
25
+ await walk(p);
26
+ else if (TEXT_EXT.test(ent.name)) {
27
+ const m = (await fs_1.promises.readFile(p, 'utf8')).match(SENTINEL);
28
+ if (m)
29
+ hits.push(`${(0, path_1.relative)(dir, p)} (${m[0]}…)`);
30
+ }
31
+ }
32
+ };
33
+ await walk(dir);
34
+ if (hits.length) {
35
+ throw new Error(`frontend still contains REPLACE_BEFORE_DEPLOY placeholders — fill your ` +
36
+ `per-deployment config (e.g. environment.prod.ts) and rebuild before deploying. ` +
37
+ `Offending: ${hits.slice(0, 5).join(', ')}` +
38
+ (hits.length > 5 ? `, +${hits.length - 5} more` : ''));
39
+ }
40
+ }
41
+ //# sourceMappingURL=frontend-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontend-guard.js","sourceRoot":"","sources":["../../src/_lib/frontend-guard.ts"],"names":[],"mappings":";;AAcA,0DAuBC;AArCD,2BAAoC;AACpC,+BAAsC;AAEtC;;;;;;;;;;GAUG;AACI,KAAK,UAAU,uBAAuB,CAAC,GAAW;IACvD,MAAM,QAAQ,GAAG,gCAAgC,CAAC;IAClD,MAAM,QAAQ,GAAG,oDAAoD,CAAC;IACtE,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,IAAI,GAAG,KAAK,EAAE,CAAS,EAAiB,EAAE;QAC9C,KAAK,MAAM,GAAG,IAAI,MAAM,aAAE,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YAC/D,MAAM,CAAC,GAAG,IAAA,WAAI,EAAC,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,GAAG,CAAC,WAAW,EAAE;gBAAE,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;iBAChC,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjC,MAAM,CAAC,GAAG,CAAC,MAAM,aAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACzD,IAAI,CAAC;oBAAE,IAAI,CAAC,IAAI,CAAC,GAAG,IAAA,eAAQ,EAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IACF,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACb,yEAAyE;YACvE,iFAAiF;YACjF,cAAc,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAC3C,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CACxD,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,178 @@
1
+ import { Buffer } from 'buffer';
2
+ /** A request against one cluster's Harbor Registry-v2 API. `path` is always `/v2/...` (or `/token...`). */
3
+ export type RegistryRequest = {
4
+ ip: string;
5
+ method: 'GET' | 'HEAD' | 'POST' | 'PUT' | 'PATCH';
6
+ path: string;
7
+ headers?: Record<string, string>;
8
+ body?: Buffer;
9
+ };
10
+ /** A Registry-v2 response. Header keys are lower-cased by the default transport. */
11
+ export type RegistryResponse = {
12
+ status: number;
13
+ headers: Record<string, string>;
14
+ body: Buffer;
15
+ };
16
+ /**
17
+ * The injectable network seam. The default implementation
18
+ * ({@link defaultTransport}) dials `req.ip:443` with TLS `servername` =
19
+ * the federated host and an added `Host` header = the federated host, with
20
+ * verification ON. Tests inject a fake — no real network.
21
+ */
22
+ export type RegistryTransport = (req: RegistryRequest) => Promise<RegistryResponse>;
23
+ /** A fan-out target — just the cluster-ingress IP. (Kept as a type for call-site clarity.) */
24
+ export type FanOutTarget = {
25
+ ip: string;
26
+ };
27
+ /** Per-endpoint outcome of {@link ensureImageOnClusters}. */
28
+ export type FanOutReport = {
29
+ targets: Array<{
30
+ ip: string;
31
+ outcome: 'present' | 'copied' | 'failed';
32
+ error?: string;
33
+ }>;
34
+ };
35
+ export type EnsureImageOpts = {
36
+ host: string;
37
+ repository: string;
38
+ tag: string;
39
+ /** The `sha256:<64hex>` manifest digest the push produced — the SSoT for present/verify. */
40
+ digest: string;
41
+ username: string;
42
+ password: string;
43
+ /** Cluster-ingress IPs (e.g. from {@link resolveClusterEndpoints}). */
44
+ endpoints: string[];
45
+ /** Test seam — defaults to {@link defaultTransport} bound to `host`. */
46
+ transport?: RegistryTransport;
47
+ };
48
+ /** A parsed `WWW-Authenticate: Bearer ...` token challenge. `realm` is mandatory. */
49
+ export type AuthChallenge = {
50
+ realm: string;
51
+ service?: string;
52
+ scope?: string;
53
+ };
54
+ /**
55
+ * Parse a `Bearer realm="...",service="...",scope="..."` challenge. Pure.
56
+ *
57
+ * Returns `null` for a non-Bearer scheme or a Bearer challenge missing the
58
+ * mandatory `realm` (without a realm there is nowhere to fetch a token from).
59
+ */
60
+ export declare function parseAuthChallenge(wwwAuthenticate: string): AuthChallenge | null;
61
+ /**
62
+ * DNS-resolve the federated host's A-records into the de-duplicated, sorted list
63
+ * of cluster-ingress IPs to fan out across. Injectable `resolve4` for tests;
64
+ * defaults to `dns.promises.resolve4`.
65
+ */
66
+ export declare function resolveClusterEndpoints(host: string, resolve4?: (h: string) => Promise<string[]>): Promise<string[]>;
67
+ /**
68
+ * Real {@link RegistryTransport}: HTTPS to `req.ip:443` with TLS SNI + HTTP
69
+ * `Host` pinned to `host`, verification ON. All registry paths are `/v2/...`;
70
+ * absolute token-realm URLs are handled by {@link fetchAbsolute}.
71
+ */
72
+ export declare function defaultTransport(host: string): RegistryTransport;
73
+ /**
74
+ * Fan out an already-pushed image to every cluster Harbor and prove it landed
75
+ * on all of them. See the module header for the full algorithm. Throws if no
76
+ * endpoint serves the digest to copy from, or if re-verification finds any
77
+ * endpoint not serving the pushed digest (the error names the failed IPs).
78
+ */
79
+ export declare function ensureImageOnClusters(opts: EnsureImageOpts): Promise<FanOutReport>;
80
+ /** Options for {@link resolveRegistryDigest}. */
81
+ export type ResolveRegistryDigestOpts = {
82
+ /** Federated Harbor host, e.g. `harbor.testnet.hsuite.network` (no scheme/port). */
83
+ host: string;
84
+ /** Repository path, e.g. `hsuite-customers-<appId>/app`. */
85
+ repository: string;
86
+ /** The pushed tag to resolve to its canonical served digest. */
87
+ tag: string;
88
+ username: string;
89
+ password: string;
90
+ /** Test seam — the registry transport (defaults to {@link defaultTransport}). */
91
+ transport?: RegistryTransport;
92
+ /** Test seam — DNS A-record resolver (defaults to `dns.promises.resolve4`). */
93
+ resolve4?: (h: string) => Promise<string[]>;
94
+ };
95
+ /**
96
+ * Resolve the CANONICAL manifest digest the registry serves for `<repo>:<tag>`
97
+ * — the value returned in the `Docker-Content-Digest` response header on a
98
+ * `HEAD /v2/<repo>/manifests/<tag>`.
99
+ *
100
+ * ## Why this is the digest to ATTEST (issue #1589)
101
+ *
102
+ * The `docker push` summary reports the digest of the manifest the *local*
103
+ * client holds. With a containerd image store (Colima / buildkit snapshotter),
104
+ * that is an OCI image manifest, but Harbor stores + re-serves the tag under a
105
+ * DIFFERENT canonical digest (a re-serialized Docker schema2 manifest) — the
106
+ * push-summary digest and the tag's served digest disagree. The deployer pins +
107
+ * the fan-out re-verify BOTH key off the tag's served `Docker-Content-Digest`
108
+ * ({@link CustomerImageDigestResolverService} does the identical HEAD). So the
109
+ * CLI must attest THIS registry-truth digest, not the push-summary one, and feed
110
+ * the SAME value to the fan-out — then attested == fanned-out == deployer-resolved
111
+ * by construction.
112
+ *
113
+ * This is the exact resolution the deployer performs, so it is authoritative for
114
+ * the strict-equality attestation gate. Returns the `sha256:<64hex>` served
115
+ * digest, or `null` when the registry can't be probed (caller decides whether to
116
+ * fall back to the push-summary digest — a fail-soft, not a fail-open: the
117
+ * deployer still re-verifies).
118
+ */
119
+ export declare function resolveRegistryDigest(opts: ResolveRegistryDigestOpts): Promise<string | null>;
120
+ /** Registry coordinates a push produced (shape of `BaasInitResponse.registry`). */
121
+ export type FanOutRegistry = {
122
+ server: string;
123
+ username: string;
124
+ password: string;
125
+ repository: string;
126
+ };
127
+ export type ResolveAttestationDigestOpts = {
128
+ registry: FanOutRegistry;
129
+ tag: string;
130
+ /** The `sha256:<64hex>` digest the local `docker push` reported. */
131
+ pushDigest: string;
132
+ /** Optional progress log sink (defaults to no-op). */
133
+ log?: (msg: string) => void;
134
+ /** Test seam — the registry transport. */
135
+ transport?: RegistryTransport;
136
+ /** Test seam — DNS A-record resolver (defaults to `dns.promises.resolve4`). */
137
+ resolve4?: (h: string) => Promise<string[]>;
138
+ };
139
+ /**
140
+ * Decide the digest to ATTEST (and to feed the fan-out): the digest Harbor
141
+ * SERVES for `<repo>:<tag>`, resolved the same way the deployer does. Falls back
142
+ * to the local `docker push` summary digest ONLY if the registry can't be probed
143
+ * (offline / dev registry / transient) — a fail-SOFT, never a fail-open, because
144
+ * the deployer independently re-verifies the served digest against the attested
145
+ * one before it pins the pod.
146
+ *
147
+ * See {@link resolveRegistryDigest} for why the served digest — not the push
148
+ * summary — is authoritative for the #1445 strict-equality gate (issue #1589).
149
+ */
150
+ export declare function resolveAttestationDigest(opts: ResolveAttestationDigestOpts): Promise<string>;
151
+ export type FanOutPushedImageOpts = {
152
+ registry: FanOutRegistry;
153
+ tag: string;
154
+ /** The `sha256:<64hex>` digest the push produced. */
155
+ digest: string;
156
+ /** Test seam — DNS A-record resolver (defaults to `dns.promises.resolve4`). */
157
+ resolve4?: (h: string) => Promise<string[]>;
158
+ /** Test seam — the registry transport. */
159
+ transport?: RegistryTransport;
160
+ /** Optional progress log sink (defaults to no-op). */
161
+ log?: (msg: string) => void;
162
+ };
163
+ /**
164
+ * The deploy-time entrypoint: take an image just pushed to the federated host
165
+ * (landed on ONE cluster) and guarantee it is present on EVERY cluster Harbor.
166
+ *
167
+ * Resolves the registry host's A-records into the cluster-ingress set, then:
168
+ * - 0/1 endpoint (a non-federated or local/dev registry, or DNS that doesn't
169
+ * fan out) → nothing to distribute; returns `null`.
170
+ * - ≥2 endpoints → {@link ensureImageOnClusters}, which copies + re-verifies
171
+ * and THROWS if any cluster ends up not serving the pushed digest.
172
+ *
173
+ * A DNS resolution failure is treated as "single-target" (logged, returns
174
+ * `null`) rather than fatal: a real federated push has already proven the host
175
+ * resolves, so a failure here means a dev/local registry where fan-out is moot.
176
+ */
177
+ export declare function fanOutPushedImage(opts: FanOutPushedImageOpts): Promise<FanOutReport | null>;
178
+ //# sourceMappingURL=registry-fanout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-fanout.d.ts","sourceRoot":"","sources":["../../src/_lib/registry-fanout.ts"],"names":[],"mappings":"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"}