@calimero-network/mero-js 27.2.0 → 27.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/cloud-v2/approvals.d.ts +27 -0
- package/dist/cloud-v2/approvals.js +18 -0
- package/dist/cloud-v2/attestation.d.ts +20 -3
- package/dist/cloud-v2/attestation.js +33 -3
- package/dist/cloud-v2/client.d.ts +10 -5
- package/dist/cloud-v2/client.js +30 -10
- package/dist/cloud-v2/index.d.ts +3 -3
- package/dist/cloud-v2/index.js +2 -2
- package/dist/index.browser.mjs +3 -3
- package/dist/index.browser.mjs.map +3 -3
- package/dist/index.cjs +70 -9
- package/dist/index.cjs.map +3 -3
- package/dist/index.mjs +70 -9
- package/dist/index.mjs.map +3 -3
- package/dist/sealed/index.d.ts +1 -1
- package/dist/sealed/index.js +1 -1
- package/dist/sealed/release.d.ts +6 -0
- package/dist/sealed/release.js +6 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -59,7 +59,7 @@ Before it sends anything to a node, as core's Rust client does (`Measurements::R
|
|
|
59
59
|
1. The node names the mero-tee release it runs. A release below `minReleaseVersion` is refused before anything is fetched.
|
|
60
60
|
2. The release's `published-mrtds.json` is fetched and its Sigstore signature is checked against the mero-tee node release workflow.
|
|
61
61
|
By default it comes from the `cloud.calimero.network` mirror; `releaseSource: 'github'` reads the GitHub release instead (Node only: GitHub sends no CORS headers).
|
|
62
|
-
3. The quote is checked against Intel's collateral with `@phala/dcap-qvl`
|
|
62
|
+
3. The quote is checked against Intel's collateral with `@phala/dcap-qvl`: the signature chain and the TCB status. The collateral comes from the cloud's mirror (`DEFAULT_COLLATERAL_MIRROR`), which browsers can read; it only carries Intel-signed items. `collateralSource: 'intel'` asks Intel's PCS (no CORS: not in browsers), `fetchCollateral` replaces the fetch, and `maxCollateralAgeDays` refuses collateral Intel issued longer ago.
|
|
63
63
|
4. A debug TD is refused.
|
|
64
64
|
5. The registers must be the release's `locked-read-only` image; a debug profile is trusted only with `allowDebugProfile`.
|
|
65
65
|
6. The quote's report data binds the client's nonce and the transport key the sealed channel opens to.
|
|
@@ -75,7 +75,7 @@ Pinned measurements go through `policy.verifyQuote` (`createQuoteVerifier`).
|
|
|
75
75
|
- **Blobs and presence**: `uploadBlob`, `downloadBlob`, `listBlobs`, `blobInfo`, `deleteBlob`; `publishPresence`, `presence`, `presenceStream`.
|
|
76
76
|
- **Organizations**: `createOrg`, `getOrg`, `deleteOrg`, `setOrgMetadata`, `setMember`, `removeMember`, `setMemberMetadata`, `setCapabilities` (`ORG_CAPABILITIES`), teams, `invite`, `redeemInvite`.
|
|
77
77
|
- **Owner decisions** (passkey approval, never from an app's frontend): `upgradeOrg`, `upgradeRun`, `retryUpgradeRun`, `approveRelease`, `approveOutbound`, `bindPublisher`, `upgradePublished`.
|
|
78
|
-
- **Approvals from an app**: `appsReport`, `releaseRules`, `pendingApprovals`, then `requestConsent` / `openConsentPage` to send the user to the node's consent page, and `consentResult`. See [Ask your users to approve node images and app upgrades](https://calimero-network.github.io/mero-js/guides/user-approvals/).
|
|
78
|
+
- **Approvals from an app**: `appsReport`, `releaseRules`, `pendingApprovals`, then `requestConsent` / `openConsentPage` to send the user to the node's consent page, and `consentResult`. Show the answer's `code` to the user before sending them to `url` (`openConsentPage`'s `confirm` hook); they should see the same code on the page (`confirmationCode(requestId)` checks it). See [Ask your users to approve node images and app upgrades](https://calimero-network.github.io/mero-js/guides/user-approvals/).
|
|
79
79
|
- **Operator** (ops token): `opsApps`, `opsOrgs`, `setReleaseDeadline`, `liftReleaseDeadline`.
|
|
80
80
|
- **Any route**: `get`, `post`, `put`, `delete`; `postConfirmed` and `deleteConfirmed` answer a `412 CONFIRM_REQUIRED` with a passkey.
|
|
81
81
|
|
|
@@ -234,7 +234,34 @@ export interface ConsentStarted {
|
|
|
234
234
|
url: string;
|
|
235
235
|
/** Unix seconds; a request lives 10 minutes. */
|
|
236
236
|
expiresAt: number;
|
|
237
|
+
/**
|
|
238
|
+
* The confirmation code the consent page shows, `XXX-XXX`
|
|
239
|
+
* ({@link confirmationCode} of `requestId`). Show it to the person before
|
|
240
|
+
* sending them to `url`: the page they land on should show the same code,
|
|
241
|
+
* which tells them it is the page their request opened. Not a secret.
|
|
242
|
+
* Nodes older than the code leave it out.
|
|
243
|
+
*/
|
|
244
|
+
code?: string;
|
|
237
245
|
}
|
|
246
|
+
/** How {@link CalimeroClient.openConsentPage} sends the person to the page. */
|
|
247
|
+
export interface OpenConsentOptions {
|
|
248
|
+
/** Sends the browser to the page's `url`; by default `window.location.assign`. */
|
|
249
|
+
navigate?: (url: string) => void;
|
|
250
|
+
/**
|
|
251
|
+
* Runs after the node answers and before navigating, with the answer: show
|
|
252
|
+
* the person `started.code` here so they can check the page shows the same.
|
|
253
|
+
* Answer `false` and the page is not opened (the request stays on the node
|
|
254
|
+
* until it expires).
|
|
255
|
+
*/
|
|
256
|
+
confirm?: (started: ConsentStarted) => boolean | Promise<boolean>;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* The confirmation code the node's consent page shows for `requestId`: the
|
|
260
|
+
* first 30 bits of SHA-256 of its UTF-8 bytes, big-endian, as six Crockford
|
|
261
|
+
* base32 characters written `XXX-XXX` (core's consent page). Compare it with
|
|
262
|
+
* {@link ConsentStarted.code} to check the node's answer.
|
|
263
|
+
*/
|
|
264
|
+
export declare function confirmationCode(requestId: string): Promise<string>;
|
|
238
265
|
export type ConsentStatus = 'pending' | 'approved' | 'declined';
|
|
239
266
|
/** `GET /consent/{id}/result`. */
|
|
240
267
|
export interface ConsentResult {
|
|
@@ -74,6 +74,24 @@ export function publisherBindingMessage(cluster, org, signerId, generation) {
|
|
|
74
74
|
export function publisherBindingBytes(cluster, org, signerId, generation) {
|
|
75
75
|
return new TextEncoder().encode(publisherBindingMessage(cluster, org, signerId, generation));
|
|
76
76
|
}
|
|
77
|
+
const CROCKFORD = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';
|
|
78
|
+
/**
|
|
79
|
+
* The confirmation code the node's consent page shows for `requestId`: the
|
|
80
|
+
* first 30 bits of SHA-256 of its UTF-8 bytes, big-endian, as six Crockford
|
|
81
|
+
* base32 characters written `XXX-XXX` (core's consent page). Compare it with
|
|
82
|
+
* {@link ConsentStarted.code} to check the node's answer.
|
|
83
|
+
*/
|
|
84
|
+
export async function confirmationCode(requestId) {
|
|
85
|
+
const h = new Uint8Array(await crypto.subtle.digest('SHA-256', new TextEncoder().encode(requestId)));
|
|
86
|
+
const word = ((h[0] << 24) | (h[1] << 16) | (h[2] << 8) | h[3]) >>> 0;
|
|
87
|
+
let code = '';
|
|
88
|
+
for (let i = 0; i < 6; i++) {
|
|
89
|
+
if (i === 3)
|
|
90
|
+
code += '-';
|
|
91
|
+
code += CROCKFORD[(word >>> (27 - 5 * i)) & 31];
|
|
92
|
+
}
|
|
93
|
+
return code;
|
|
94
|
+
}
|
|
77
95
|
/**
|
|
78
96
|
* What the consent page put on `returnTo` when it sent the person back, or
|
|
79
97
|
* `null` when `href` carries none. A hint only (anyone can type a URL): confirm
|
|
@@ -45,11 +45,26 @@ export interface CloudReleasePolicy {
|
|
|
45
45
|
/** DCAP verification; defaults to `verify` from `@phala/dcap-qvl`, loaded on first use. */
|
|
46
46
|
dcapVerify?: DcapVerify;
|
|
47
47
|
/**
|
|
48
|
-
* Intel's collateral for a quote
|
|
49
|
-
* `
|
|
50
|
-
* if Intel's does not answer the page.
|
|
48
|
+
* Intel's collateral for a quote. Defaults to `@phala/dcap-qvl`'s
|
|
49
|
+
* `getCollateral` from `collateralSource`.
|
|
51
50
|
*/
|
|
52
51
|
fetchCollateral?: (quote: Uint8Array) => Promise<DcapCollateral>;
|
|
52
|
+
/**
|
|
53
|
+
* Where the default `fetchCollateral` gets Intel's collateral: a PCCS base
|
|
54
|
+
* URL (default {@link DEFAULT_COLLATERAL_MIRROR}, the cloud's mirror, which a
|
|
55
|
+
* browser on any origin can read), or `'intel'` for Intel's PCS itself (no
|
|
56
|
+
* CORS: not in browsers). Untrusted either way: every item is signed by
|
|
57
|
+
* Intel and verified up to Intel's root CA, which `@phala/dcap-qvl` carries.
|
|
58
|
+
*/
|
|
59
|
+
collateralSource?: 'intel' | string;
|
|
60
|
+
/**
|
|
61
|
+
* Refuse collateral whose TCB info Intel issued more than this many days
|
|
62
|
+
* ago. Unset: only Intel's own `nextUpdate` (about 30 days out) bounds how
|
|
63
|
+
* old it may be. A mirror cannot forge collateral, but it can replay an
|
|
64
|
+
* older, still valid copy; this shortens that window. Too small a value
|
|
65
|
+
* refuses every node if Intel is slow to re-sign.
|
|
66
|
+
*/
|
|
67
|
+
maxCollateralAgeDays?: number;
|
|
53
68
|
/** Override the release signer (defaults to the mero-tee node release workflow). */
|
|
54
69
|
identity?: string;
|
|
55
70
|
issuer?: string;
|
|
@@ -87,5 +102,7 @@ export interface AttestationDoc {
|
|
|
87
102
|
* fetched. Accepts `2.3.109` and the tag form `mero-tee-v2.3.109`.
|
|
88
103
|
*/
|
|
89
104
|
export declare function claimedRelease(doc: Pick<AttestationDoc, 'release'>, minReleaseVersion: string): string;
|
|
105
|
+
/** `fetch`, refusing collateral older than `policy.maxCollateralAgeDays` (by its TCB info's `issueDate`). */
|
|
106
|
+
export declare function freshCollateral(fetch: (quote: Uint8Array) => Promise<DcapCollateral>, policy: Pick<CloudReleasePolicy, 'maxCollateralAgeDays' | 'now'>): (quote: Uint8Array) => Promise<DcapCollateral>;
|
|
90
107
|
/** Fetch the node's attestation and return its transport key once it checks out. */
|
|
91
108
|
export declare function fetchAttestedKey(baseUrl: string, policy: CloudPolicy, fetchImpl?: typeof fetch): Promise<Uint8Array>;
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
* `allowMock`.
|
|
20
20
|
*/
|
|
21
21
|
import { fromHex, hex } from '../crypto/internal.js';
|
|
22
|
-
import { DEFAULT_RELEASE_MIRROR, cloudNodeReleaseUrl, compareReleaseVersions, fetchGithubNodeRelease, fetchNodeRelease, releaseVersion, trustSignedRelease, } from '../sealed/release.js';
|
|
22
|
+
import { DEFAULT_COLLATERAL_MIRROR, DEFAULT_RELEASE_MIRROR, cloudNodeReleaseUrl, compareReleaseVersions, fetchGithubNodeRelease, fetchNodeRelease, releaseVersion, trustSignedRelease, } from '../sealed/release.js';
|
|
23
23
|
import { transportKeyBinding } from '../sealed/sealed.js';
|
|
24
24
|
import { PRODUCTION_PROFILE, createQuoteVerifier } from '../sealed/verify.js';
|
|
25
25
|
/** The mock quote format development clusters use. */
|
|
@@ -70,6 +70,37 @@ async function releaseFor(version, policy, fetchImpl) {
|
|
|
70
70
|
return fetchGithubNodeRelease(version, { fetch: fetchImpl });
|
|
71
71
|
return fetchNodeRelease(cloudNodeReleaseUrl(source ?? DEFAULT_RELEASE_MIRROR, version), { fetch: fetchImpl });
|
|
72
72
|
}
|
|
73
|
+
/** The collateral fetch a policy gets unless it brings its own: `@phala/dcap-qvl` against `collateralSource`. */
|
|
74
|
+
function defaultCollateral(policy) {
|
|
75
|
+
const source = policy.collateralSource ?? DEFAULT_COLLATERAL_MIRROR;
|
|
76
|
+
if (source === 'intel') {
|
|
77
|
+
return async (quote) => (await dcap('getCollateralFromPcs'))(quote);
|
|
78
|
+
}
|
|
79
|
+
return async (quote) => (await dcap('getCollateral'))(source, quote);
|
|
80
|
+
}
|
|
81
|
+
/** `fetch`, refusing collateral older than `policy.maxCollateralAgeDays` (by its TCB info's `issueDate`). */
|
|
82
|
+
export function freshCollateral(fetch, policy) {
|
|
83
|
+
const maxDays = policy.maxCollateralAgeDays;
|
|
84
|
+
if (maxDays === undefined)
|
|
85
|
+
return fetch;
|
|
86
|
+
return async (quote) => {
|
|
87
|
+
const collateral = await fetch(quote);
|
|
88
|
+
let issued;
|
|
89
|
+
try {
|
|
90
|
+
issued = Date.parse(JSON.parse(collateral.tcb_info).issueDate ?? '');
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
issued = Number.NaN;
|
|
94
|
+
}
|
|
95
|
+
if (!Number.isFinite(issued))
|
|
96
|
+
throw new Error("The quote's collateral names no TCB info issue date");
|
|
97
|
+
const ageDays = ((policy.now ?? Date.now)() - issued) / 86400000;
|
|
98
|
+
if (ageDays > maxDays) {
|
|
99
|
+
throw new Error(`The quote's collateral was issued ${Math.floor(ageDays)} days ago, more than the ${maxDays} this client accepts`);
|
|
100
|
+
}
|
|
101
|
+
return collateral;
|
|
102
|
+
};
|
|
103
|
+
}
|
|
73
104
|
/** Judge a real quote as core's `Measurements::Release` does. */
|
|
74
105
|
async function verifyRelease(doc, args, policy, fetchImpl) {
|
|
75
106
|
// Refuse what no release could admit before reaching for the network.
|
|
@@ -82,8 +113,7 @@ async function verifyRelease(doc, args, policy, fetchImpl) {
|
|
|
82
113
|
identity: policy.identity,
|
|
83
114
|
issuer: policy.issuer,
|
|
84
115
|
});
|
|
85
|
-
const fetchCollateral = policy.fetchCollateral ??
|
|
86
|
-
(async (quote) => (await dcap('getCollateralFromPcs'))(quote));
|
|
116
|
+
const fetchCollateral = freshCollateral(policy.fetchCollateral ?? defaultCollateral(policy), policy);
|
|
87
117
|
const verifier = createQuoteVerifier({
|
|
88
118
|
dcapVerify: policy.dcapVerify ?? (await dcap('verify')),
|
|
89
119
|
fetchCollateral,
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import { type AttestationDoc, type CloudPolicy } from './attestation.js';
|
|
13
13
|
import { type PasskeyProvider } from './passkey.js';
|
|
14
|
-
import { type AppsReport, type ConsentRequest, type ConsentResult, type ConsentStarted, type OpsAppsReport, type OpsOrgsReport, type PageOptions, type PendingApprovals, type PublisherBindingInfo, type PublisherProof, type ReleaseRules } from './approvals.js';
|
|
14
|
+
import { type AppsReport, type ConsentRequest, type ConsentResult, type ConsentStarted, type OpenConsentOptions, type OpsAppsReport, type OpsOrgsReport, type PageOptions, type PendingApprovals, type PublisherBindingInfo, type PublisherProof, type ReleaseRules } from './approvals.js';
|
|
15
15
|
export { AppError, ArgsTooLarge, CalimeroError, ConfirmCancelled, ConfirmRequired, IdempotencyMismatch, LoginRequired, ConsentStale, NotFound, ReleaseDeadlineError, TrapError, UnavailableError, WrongNode, errorFrom, } from './errors.js';
|
|
16
16
|
export type { Committed } from './errors.js';
|
|
17
17
|
export interface CalimeroSession {
|
|
@@ -505,11 +505,16 @@ export declare class CalimeroClient {
|
|
|
505
505
|
requestConsent(request: ConsentRequest): Promise<ConsentStarted>;
|
|
506
506
|
/**
|
|
507
507
|
* {@link requestConsent}, then send the browser to the consent page
|
|
508
|
-
* (`navigate`, by default `window.location.assign`).
|
|
509
|
-
*
|
|
510
|
-
*
|
|
508
|
+
* (`navigate`, by default `window.location.assign`). Pass `navigate` itself
|
|
509
|
+
* or {@link OpenConsentOptions}, whose `confirm` runs first with the node's
|
|
510
|
+
* answer so the app can show the person its `code`; when it answers `false`
|
|
511
|
+
* the page is not opened. When the node sends a `code` that is not
|
|
512
|
+
* {@link confirmationCode} of `requestId`, it throws `CalimeroError`
|
|
513
|
+
* (`CONSENT_CODE_MISMATCH`) and does not navigate. Answers the request
|
|
514
|
+
* once `navigate` returns (or `confirm` declines): with a popup
|
|
515
|
+
* (`url => window.open(url)`), poll it with {@link waitForConsent}.
|
|
511
516
|
*/
|
|
512
|
-
openConsentPage(request: ConsentRequest,
|
|
517
|
+
openConsentPage(request: ConsentRequest, navigateOrOptions?: ((url: string) => void) | OpenConsentOptions): Promise<ConsentStarted>;
|
|
513
518
|
/** The decision on a consent request (any node answers, for the account that asked). */
|
|
514
519
|
consentResult(requestId: string): Promise<ConsentResult>;
|
|
515
520
|
/**
|
package/dist/cloud-v2/client.js
CHANGED
|
@@ -13,7 +13,7 @@ import { SealedTransportError, createSealedFetch } from '../sealed/sealed.js';
|
|
|
13
13
|
import { fetchAttestedKey } from './attestation.js';
|
|
14
14
|
import { CalimeroError, ConfirmCancelled, ConfirmRequired, LoginRequired, UnavailableError, WrongNode, errorFrom, } from './errors.js';
|
|
15
15
|
import { b64url, fromB64url } from './passkey.js';
|
|
16
|
-
import { pageQuery, pendingApprovalsFrom, } from './approvals.js';
|
|
16
|
+
import { confirmationCode, pageQuery, pendingApprovalsFrom, } from './approvals.js';
|
|
17
17
|
export { AppError, ArgsTooLarge, CalimeroError, ConfirmCancelled, ConfirmRequired, IdempotencyMismatch, LoginRequired, ConsentStale, NotFound, ReleaseDeadlineError, TrapError, UnavailableError, WrongNode, errorFrom, } from './errors.js';
|
|
18
18
|
/** One URL path segment, so an id cannot reach another route. */
|
|
19
19
|
function seg(value) {
|
|
@@ -781,17 +781,37 @@ export class CalimeroClient {
|
|
|
781
781
|
}
|
|
782
782
|
/**
|
|
783
783
|
* {@link requestConsent}, then send the browser to the consent page
|
|
784
|
-
* (`navigate`, by default `window.location.assign`).
|
|
785
|
-
*
|
|
786
|
-
*
|
|
784
|
+
* (`navigate`, by default `window.location.assign`). Pass `navigate` itself
|
|
785
|
+
* or {@link OpenConsentOptions}, whose `confirm` runs first with the node's
|
|
786
|
+
* answer so the app can show the person its `code`; when it answers `false`
|
|
787
|
+
* the page is not opened. When the node sends a `code` that is not
|
|
788
|
+
* {@link confirmationCode} of `requestId`, it throws `CalimeroError`
|
|
789
|
+
* (`CONSENT_CODE_MISMATCH`) and does not navigate. Answers the request
|
|
790
|
+
* once `navigate` returns (or `confirm` declines): with a popup
|
|
791
|
+
* (`url => window.open(url)`), poll it with {@link waitForConsent}.
|
|
787
792
|
*/
|
|
788
|
-
async openConsentPage(request,
|
|
789
|
-
const
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
793
|
+
async openConsentPage(request, navigateOrOptions = {}) {
|
|
794
|
+
const options = typeof navigateOrOptions === 'function' ? { navigate: navigateOrOptions } : navigateOrOptions;
|
|
795
|
+
const navigate = options.navigate ??
|
|
796
|
+
((url) => {
|
|
797
|
+
const w = globalThis.window;
|
|
798
|
+
if (!w)
|
|
799
|
+
throw new Error('no window to open the consent page in; pass `navigate`');
|
|
800
|
+
w.location.assign(url);
|
|
801
|
+
});
|
|
794
802
|
const started = await this.requestConsent(request);
|
|
803
|
+
if (started.code !== undefined) {
|
|
804
|
+
const expected = await confirmationCode(started.requestId);
|
|
805
|
+
if (started.code !== expected) {
|
|
806
|
+
throw new CalimeroError(200, 'CONSENT_CODE_MISMATCH', 'the consent page code does not match the request', {
|
|
807
|
+
requestId: started.requestId,
|
|
808
|
+
code: started.code,
|
|
809
|
+
expected,
|
|
810
|
+
});
|
|
811
|
+
}
|
|
812
|
+
}
|
|
813
|
+
if (options.confirm && !(await options.confirm(started)))
|
|
814
|
+
return started;
|
|
795
815
|
navigate(started.url);
|
|
796
816
|
return started;
|
|
797
817
|
}
|
package/dist/cloud-v2/index.d.ts
CHANGED
|
@@ -2,11 +2,11 @@ export { CalimeroClient } from './client.js';
|
|
|
2
2
|
export { AppError, ArgsTooLarge, CalimeroError, ConfirmCancelled, ConfirmRequired, IdempotencyMismatch, LoginRequired, ConsentStale, NotFound, ReleaseDeadlineError, TrapError, UnavailableError, WrongNode, errorFrom, } from './errors.js';
|
|
3
3
|
export type { Committed } from './errors.js';
|
|
4
4
|
export type { AppInfo, BlobInfo, CallResult, CalimeroClientOptions, CloudEvent, CalimeroSession, PackageInfo, PackageInstalled, CloudRetryOptions, OrgInfo, OrgUpgradeTarget, PresenceEntry, UpgradeRun, ViewResult, } from './client.js';
|
|
5
|
-
export { claimedRelease, fetchAttestedKey, MOCK_QUOTE_HEADER } from './attestation.js';
|
|
5
|
+
export { claimedRelease, fetchAttestedKey, freshCollateral, MOCK_QUOTE_HEADER } from './attestation.js';
|
|
6
6
|
export type { AttestationDoc, CloudPolicy, CloudReleasePolicy } from './attestation.js';
|
|
7
7
|
export { browserPasskey, b64url, fromB64url } from './passkey.js';
|
|
8
8
|
export type { AssertionJSON, PasskeyProvider, RegistrationJSON } from './passkey.js';
|
|
9
|
-
export { MAX_REPORT_PAGE, RELEASE_VERIFIER, compareVersions, consentReturn, pageQuery, pendingApprovalsFrom, publisherBindingBytes, publisherBindingMessage, releaseConsent, releaseNotesUrl, stalledBy, upgradeConsent, verifyReleaseUrl, withdrawConsent, } from './approvals.js';
|
|
10
|
-
export type { ActorKind, AppsReport, Authority, ClusterRelease, ConsentReleaseModel, ConsentRequest, ConsentResult, ConsentScope, ConsentStarted, ConsentStatus, Governance, LastUpgrade, OpsAppsReport, OpsOrgsReport, PageOptions, PendingApprovals, PendingRelease, PendingUpgrade, PublisherBindingInfo, PublisherProof, ReleaseDeadline, ReleaseRules, ReportScope, ReportedApp, ReportedBundle, ReportedRelease, ReportedReplica, UpgradeAuthority, } from './approvals.js';
|
|
9
|
+
export { MAX_REPORT_PAGE, RELEASE_VERIFIER, compareVersions, confirmationCode, consentReturn, pageQuery, pendingApprovalsFrom, publisherBindingBytes, publisherBindingMessage, releaseConsent, releaseNotesUrl, stalledBy, upgradeConsent, verifyReleaseUrl, withdrawConsent, } from './approvals.js';
|
|
10
|
+
export type { ActorKind, AppsReport, Authority, ClusterRelease, ConsentReleaseModel, ConsentRequest, ConsentResult, ConsentScope, ConsentStarted, ConsentStatus, OpenConsentOptions, Governance, LastUpgrade, OpsAppsReport, OpsOrgsReport, PageOptions, PendingApprovals, PendingRelease, PendingUpgrade, PublisherBindingInfo, PublisherProof, ReleaseDeadline, ReleaseRules, ReportScope, ReportedApp, ReportedBundle, ReportedRelease, ReportedReplica, UpgradeAuthority, } from './approvals.js';
|
|
11
11
|
export { DEFAULT_ORG_CAPABILITIES, ORG_CAPABILITIES, orgCapabilities } from './capabilities.js';
|
|
12
12
|
export type { OrgCapability } from './capabilities.js';
|
package/dist/cloud-v2/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { CalimeroClient } from './client.js';
|
|
2
2
|
export { AppError, ArgsTooLarge, CalimeroError, ConfirmCancelled, ConfirmRequired, IdempotencyMismatch, LoginRequired, ConsentStale, NotFound, ReleaseDeadlineError, TrapError, UnavailableError, WrongNode, errorFrom, } from './errors.js';
|
|
3
|
-
export { claimedRelease, fetchAttestedKey, MOCK_QUOTE_HEADER } from './attestation.js';
|
|
3
|
+
export { claimedRelease, fetchAttestedKey, freshCollateral, MOCK_QUOTE_HEADER } from './attestation.js';
|
|
4
4
|
export { browserPasskey, b64url, fromB64url } from './passkey.js';
|
|
5
|
-
export { MAX_REPORT_PAGE, RELEASE_VERIFIER, compareVersions, consentReturn, pageQuery, pendingApprovalsFrom, publisherBindingBytes, publisherBindingMessage, releaseConsent, releaseNotesUrl, stalledBy, upgradeConsent, verifyReleaseUrl, withdrawConsent, } from './approvals.js';
|
|
5
|
+
export { MAX_REPORT_PAGE, RELEASE_VERIFIER, compareVersions, confirmationCode, consentReturn, pageQuery, pendingApprovalsFrom, publisherBindingBytes, publisherBindingMessage, releaseConsent, releaseNotesUrl, stalledBy, upgradeConsent, verifyReleaseUrl, withdrawConsent, } from './approvals.js';
|
|
6
6
|
export { DEFAULT_ORG_CAPABILITIES, ORG_CAPABILITIES, orgCapabilities } from './capabilities.js';
|