@openzeppelin/guardian-operator-client 0.14.6 → 0.14.7
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 +146 -0
- package/dist/http.d.ts +58 -2
- package/dist/http.d.ts.map +1 -1
- package/dist/http.js +505 -4
- package/dist/http.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/permissions.d.ts +15 -0
- package/dist/permissions.d.ts.map +1 -0
- package/dist/permissions.js +13 -0
- package/dist/permissions.js.map +1 -0
- package/dist/server-types.d.ts +35 -0
- package/dist/server-types.d.ts.map +1 -1
- package/dist/server-types.js +5 -1
- package/dist/server-types.js.map +1 -1
- package/dist/types.d.ts +218 -7
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -57,6 +57,10 @@ if (page.nextCursor !== null) {
|
|
|
57
57
|
});
|
|
58
58
|
console.log(next.items.length);
|
|
59
59
|
}
|
|
60
|
+
|
|
61
|
+
// Filter by pause state. Omit `paused` for all accounts.
|
|
62
|
+
const pausedOnly = await client.listAccounts({ paused: true });
|
|
63
|
+
const activeOnly = await client.listAccounts({ paused: false });
|
|
60
64
|
```
|
|
61
65
|
|
|
62
66
|
### Fetch One Account
|
|
@@ -101,13 +105,59 @@ if (info.serviceStatus === 'degraded') {
|
|
|
101
105
|
|
|
102
106
|
### Per-Account Delta Feed
|
|
103
107
|
|
|
108
|
+
Each entry carries the dashboard-ready activity fields spread directly
|
|
109
|
+
at L1 (feature 007). `category` is the server-curated coarse
|
|
110
|
+
classification; `assets` (array) / `counterparty` / `noteCounts` are
|
|
111
|
+
derived from the on-chain `TransactionSummary`; `proposalType` echoes
|
|
112
|
+
the operator's intent label for multisig commits. All five fields are
|
|
113
|
+
optional — absent fields mean "not derivable from this row" (EVM
|
|
114
|
+
deltas, pre-feature-007 historical rows whose proposal was already
|
|
115
|
+
deleted, or undecodable payloads).
|
|
116
|
+
|
|
104
117
|
```typescript
|
|
105
118
|
const page = await client.listAccountDeltas('0x...', { limit: 50 });
|
|
106
119
|
for (const entry of page.items) {
|
|
107
120
|
console.log(entry.nonce, entry.status, entry.statusTimestamp);
|
|
121
|
+
if (entry.category) {
|
|
122
|
+
console.log('category:', entry.category);
|
|
123
|
+
console.log('notes:', entry.noteCounts);
|
|
124
|
+
if (entry.proposalType) {
|
|
125
|
+
console.log('proposal type:', entry.proposalType);
|
|
126
|
+
}
|
|
127
|
+
if (entry.assets && entry.assets.length > 0) {
|
|
128
|
+
for (const a of entry.assets) {
|
|
129
|
+
console.log('asset:', a.assetId, a.amount);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
} else {
|
|
133
|
+
// No dashboard fields → render as "metadata unavailable", not as
|
|
134
|
+
// zero-valued defaults. Reasons listed above.
|
|
135
|
+
console.log('metadata unavailable');
|
|
136
|
+
}
|
|
108
137
|
}
|
|
109
138
|
```
|
|
110
139
|
|
|
140
|
+
For the full structured projection of a single delta (decoded input /
|
|
141
|
+
output notes, vault changes, storage changes, plus the full
|
|
142
|
+
`proposal` intent block), call `getAccountDeltaDetail`:
|
|
143
|
+
|
|
144
|
+
```typescript
|
|
145
|
+
const detail = await client.getAccountDeltaDetail('0x...', entry.nonce);
|
|
146
|
+
console.log('input notes:', detail.inputNotes.length);
|
|
147
|
+
console.log('vault changes:', detail.vaultChanges);
|
|
148
|
+
if (detail.proposal) {
|
|
149
|
+
console.log('proposal intent:', detail.proposal);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Debug: include the raw base64 TransactionSummary blob in the
|
|
153
|
+
// response so you can sanity-check the server's projection against
|
|
154
|
+
// the on-disk bytes.
|
|
155
|
+
const debug = await client.getAccountDeltaDetail('0x...', entry.nonce, {
|
|
156
|
+
includeRaw: true,
|
|
157
|
+
});
|
|
158
|
+
console.log('raw bytes (base64):', debug.rawTransactionSummary);
|
|
159
|
+
```
|
|
160
|
+
|
|
111
161
|
### Per-Account In-Flight Proposals
|
|
112
162
|
|
|
113
163
|
Single-key Miden accounts and EVM accounts always return an empty
|
|
@@ -125,6 +175,30 @@ for (const entry of page.items) {
|
|
|
125
175
|
}
|
|
126
176
|
```
|
|
127
177
|
|
|
178
|
+
### Pause / Unpause Account
|
|
179
|
+
|
|
180
|
+
Both endpoints require the `accounts:pause` permission and are
|
|
181
|
+
idempotent. Re-pausing an already-paused account returns success with
|
|
182
|
+
the original `pausedAt` and `pausedReason` preserved (first-writer
|
|
183
|
+
wins). `reason` is required on pause (non-empty, ≤ 512 chars) and
|
|
184
|
+
optional on unpause.
|
|
185
|
+
|
|
186
|
+
```typescript
|
|
187
|
+
const paused = await client.pauseAccount('0x...', 'compliance review');
|
|
188
|
+
console.log(paused.pausedAt, paused.pausedReason);
|
|
189
|
+
|
|
190
|
+
await client.unpauseAccount('0x...', 'cleared by legal');
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
While an account is paused, mutating endpoints (delta submission,
|
|
194
|
+
proposal creation, proposal signing) reject with HTTP 409 and code
|
|
195
|
+
`account_paused` (normalized by the client from the server wire code
|
|
196
|
+
`GUARDIAN_ACCOUNT_PAUSED`). Account setup paths (`configureAccount`,
|
|
197
|
+
EVM register) are admin operations and remain available while paused.
|
|
198
|
+
Read endpoints — including `listAccounts({ paused: true })` and
|
|
199
|
+
`getAccount()` — continue to work and surface `pausedAt` /
|
|
200
|
+
`pausedReason` on the response.
|
|
201
|
+
|
|
128
202
|
### Cross-Account Delta Feed
|
|
129
203
|
|
|
130
204
|
Paginated newest-first by `status_timestamp DESC`. The optional
|
|
@@ -249,8 +323,80 @@ FR-028) is:
|
|
|
249
323
|
| HTTP | Body `code` | When |
|
|
250
324
|
|------|-------------|------|
|
|
251
325
|
| 401 | `authentication_failed` | missing / tampered / expired operator session |
|
|
326
|
+
| 403 | `GUARDIAN_INSUFFICIENT_OPERATOR_PERMISSION` | operator session is valid but lacks one or more route-required permissions (feature `006-operator-authz`) |
|
|
252
327
|
| 404 | `account_not_found` | path-addressed account does not exist |
|
|
253
328
|
| 400 | `invalid_cursor` | tampered, malformed, or stale cursor |
|
|
254
329
|
| 400 | `invalid_limit` | `limit` outside `[1, 500]` |
|
|
255
330
|
| 400 | `invalid_status_filter` | global delta feed `status` filter is unknown or malformed |
|
|
331
|
+
| 409 | `account_paused` | mutating call against a paused account; error details carry `pausedAt` and `pausedReason`. Wire code `GUARDIAN_ACCOUNT_PAUSED` is normalized by the client. |
|
|
256
332
|
| 503 | `data_unavailable` | metadata exists but underlying records cannot be read |
|
|
333
|
+
|
|
334
|
+
### Operator Authorization (feature `006-operator-authz`)
|
|
335
|
+
|
|
336
|
+
The dashboard now enforces per-operator permissions on every route. The
|
|
337
|
+
allowlist JSON consumed by `GUARDIAN_OPERATOR_PUBLIC_KEYS_JSON` /
|
|
338
|
+
`_FILE` / `_SECRET_ID` accepts a **heterogeneous** array of two element
|
|
339
|
+
shapes:
|
|
340
|
+
|
|
341
|
+
```jsonc
|
|
342
|
+
[
|
|
343
|
+
// Legacy element: bare hex string → `{dashboard:read}` only.
|
|
344
|
+
"0x094f145ec43583db3ca443f43a67545c...",
|
|
345
|
+
|
|
346
|
+
// Structured element: explicit permission set.
|
|
347
|
+
{
|
|
348
|
+
"public_key": "0x0944089753530e9104cc9fc4...",
|
|
349
|
+
"permissions": ["dashboard:read", "accounts:pause"]
|
|
350
|
+
},
|
|
351
|
+
|
|
352
|
+
// Explicit-deny element: loads, but denies every authorization
|
|
353
|
+
// check (different from omitting the operator entirely).
|
|
354
|
+
{
|
|
355
|
+
"public_key": "0x0a11...",
|
|
356
|
+
"permissions": []
|
|
357
|
+
}
|
|
358
|
+
]
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
Recognized permissions in v1: `dashboard:read`, `accounts:pause`,
|
|
362
|
+
`policies:write`.
|
|
363
|
+
|
|
364
|
+
When the server denies a request for insufficient permissions, the
|
|
365
|
+
response body extends the existing flat envelope additively:
|
|
366
|
+
|
|
367
|
+
```json
|
|
368
|
+
{
|
|
369
|
+
"success": false,
|
|
370
|
+
"code": "GUARDIAN_INSUFFICIENT_OPERATOR_PERMISSION",
|
|
371
|
+
"error": "Operator lacks required permissions: accounts:pause",
|
|
372
|
+
"missing_permissions": ["accounts:pause"],
|
|
373
|
+
"retryable": false
|
|
374
|
+
}
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
`parseErrorBody` and the `GuardianOperatorHttpErrorData` shape both
|
|
378
|
+
expose `missingPermissions` and `retryable` for this code; the fields
|
|
379
|
+
are `undefined` for every other code.
|
|
380
|
+
|
|
381
|
+
For UI gating, call `getSession()` to read the authenticated
|
|
382
|
+
operator's live permission set and compare entries against the
|
|
383
|
+
exported wire-string constants:
|
|
384
|
+
|
|
385
|
+
```typescript
|
|
386
|
+
import {
|
|
387
|
+
ACCOUNTS_PAUSE,
|
|
388
|
+
DASHBOARD_READ,
|
|
389
|
+
GuardianOperatorHttpClient,
|
|
390
|
+
} from '@openzeppelin/guardian-operator-client';
|
|
391
|
+
|
|
392
|
+
const client = new GuardianOperatorHttpClient('https://guardian.example');
|
|
393
|
+
const { permissions } = await client.getSession();
|
|
394
|
+
|
|
395
|
+
const canPause = permissions.includes(ACCOUNTS_PAUSE);
|
|
396
|
+
const canRead = permissions.includes(DASHBOARD_READ);
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
The session endpoint re-reads permissions from the allowlist on every
|
|
400
|
+
call, so allowlist edits take effect without re-login. The server is
|
|
401
|
+
still the source of truth on every mutating endpoint — the client
|
|
402
|
+
MUST NOT short-circuit a request based on its own capability check.
|
package/dist/http.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { DashboardAccountResponse, DashboardAccountSnapshot, DashboardAccountSummary, DashboardDeltaEntry, DashboardErrorCode, DashboardGlobalDeltaEntry, DashboardGlobalProposalEntry, DashboardInfoResponse, DashboardProposalEntry, GlobalDeltasOptions, GuardianOperatorHttpClientOptions, GuardianOperatorHttpErrorData, LogoutOperatorResponse, OperatorChallengeResponse, PagedResult, VerifyOperatorRequest, VerifyOperatorResponse } from './types.js';
|
|
1
|
+
import type { DashboardAccountResponse, DashboardAccountSnapshot, DashboardAccountSummary, DashboardDeltaDetail, DashboardDeltaEntry, DashboardErrorCode, DashboardGlobalDeltaEntry, DashboardGlobalProposalEntry, DashboardInfoResponse, DashboardProposalEntry, GlobalDeltasOptions, DeltaDetailOptions, GuardianOperatorHttpClientOptions, GuardianOperatorHttpErrorData, LogoutOperatorResponse, OperatorChallengeResponse, PagedResult, PauseAccountResponse, SessionInfoResponse, UnpauseAccountResponse, VerifyOperatorRequest, VerifyOperatorResponse } from './types.js';
|
|
2
2
|
/**
|
|
3
3
|
* Common pagination query options for the new dashboard feeds
|
|
4
4
|
* endpoints. Spec reference: `005-operator-dashboard-metrics` FR-001.
|
|
@@ -9,6 +9,14 @@ export interface PaginationOptions {
|
|
|
9
9
|
/** Opaque cursor token from a prior page's `nextCursor`. */
|
|
10
10
|
cursor?: string;
|
|
11
11
|
}
|
|
12
|
+
/**
|
|
13
|
+
* Options for {@link GuardianOperatorHttpClient.listAccounts}. Extends
|
|
14
|
+
* {@link PaginationOptions} with a tri-state pause filter: `true` for
|
|
15
|
+
* paused accounts only, `false` for active only, omitted for all.
|
|
16
|
+
*/
|
|
17
|
+
export interface ListAccountsOptions extends PaginationOptions {
|
|
18
|
+
paused?: boolean;
|
|
19
|
+
}
|
|
12
20
|
/**
|
|
13
21
|
* Result of parsing an error response body. The {@link code} field is
|
|
14
22
|
* narrowed to {@link DashboardErrorCode} when the server emitted one of
|
|
@@ -19,6 +27,29 @@ export interface ParsedErrorBody {
|
|
|
19
27
|
code: DashboardErrorCode | string | null;
|
|
20
28
|
message: string | null;
|
|
21
29
|
retryAfterSecs?: number;
|
|
30
|
+
/**
|
|
31
|
+
* Populated only when `code === 'insufficient_operator_permission'`.
|
|
32
|
+
* Lists the permission strings the route required that the
|
|
33
|
+
* authenticated operator does not hold, lexicographically sorted by
|
|
34
|
+
* the server (feature 006-operator-authz FR-017).
|
|
35
|
+
*/
|
|
36
|
+
missingPermissions?: readonly string[];
|
|
37
|
+
/**
|
|
38
|
+
* `false` for permission denials and account-paused rejections;
|
|
39
|
+
* absent for every other code.
|
|
40
|
+
*/
|
|
41
|
+
retryable?: boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Populated only when `code === 'account_paused'`. RFC 3339 UTC
|
|
44
|
+
* timestamp of the original pause.
|
|
45
|
+
*/
|
|
46
|
+
pausedAt?: string;
|
|
47
|
+
/**
|
|
48
|
+
* Populated only when `code === 'account_paused'`. May be `null`
|
|
49
|
+
* for forward compatibility (the v1 server always emits a
|
|
50
|
+
* non-null reason).
|
|
51
|
+
*/
|
|
52
|
+
pausedReason?: string | null;
|
|
22
53
|
}
|
|
23
54
|
/**
|
|
24
55
|
* Parse an error response body into a typed `{ code, message }` shape.
|
|
@@ -67,12 +98,30 @@ export declare class GuardianOperatorHttpClient {
|
|
|
67
98
|
* {@link GuardianOperatorHttpClient.getDashboardInfo}. Callers that
|
|
68
99
|
* relied on `listAccounts()` must migrate to this method.
|
|
69
100
|
*/
|
|
70
|
-
listAccounts(options?:
|
|
101
|
+
listAccounts(options?: ListAccountsOptions): Promise<PagedResult<DashboardAccountSummary>>;
|
|
102
|
+
/**
|
|
103
|
+
* Return the authenticated operator's identity and effective
|
|
104
|
+
* permission set. Succeeds for any valid session, including
|
|
105
|
+
* operators with `permissions: []` (returns an empty array).
|
|
106
|
+
*/
|
|
107
|
+
getSession(): Promise<SessionInfoResponse>;
|
|
71
108
|
/**
|
|
72
109
|
* Inventory and lifecycle health snapshot per feature
|
|
73
110
|
* `005-operator-dashboard-metrics` US2 / FR-008..FR-012.
|
|
74
111
|
*/
|
|
75
112
|
getDashboardInfo(): Promise<DashboardInfoResponse>;
|
|
113
|
+
/**
|
|
114
|
+
* Pause mutating actions for the given account. Requires
|
|
115
|
+
* `accounts:pause`. Idempotent: re-pausing an already-paused account
|
|
116
|
+
* returns success with the original `pausedAt` preserved.
|
|
117
|
+
*/
|
|
118
|
+
pauseAccount(accountId: string, reason: string): Promise<PauseAccountResponse>;
|
|
119
|
+
/**
|
|
120
|
+
* Clear pause state for the given account. Requires `accounts:pause`.
|
|
121
|
+
* Idempotent: unpausing an already-active account returns success
|
|
122
|
+
* with no state change.
|
|
123
|
+
*/
|
|
124
|
+
unpauseAccount(accountId: string, reason?: string): Promise<UnpauseAccountResponse>;
|
|
76
125
|
getAccount(accountId: string): Promise<DashboardAccountResponse>;
|
|
77
126
|
/**
|
|
78
127
|
* Return a decoded snapshot of `accountId`'s stored state at the
|
|
@@ -99,6 +148,13 @@ export declare class GuardianOperatorHttpClient {
|
|
|
99
148
|
* `005-operator-dashboard-metrics` US3.
|
|
100
149
|
*/
|
|
101
150
|
listAccountDeltas(accountId: string, options?: PaginationOptions): Promise<PagedResult<DashboardDeltaEntry>>;
|
|
151
|
+
/**
|
|
152
|
+
* Fetch the full detail projection of one canonical delta. The
|
|
153
|
+
* nonce is serialized as a canonical base-10 `u64` URL segment;
|
|
154
|
+
* unknown account and unknown nonce both surface as
|
|
155
|
+
* `404 delta_not_found`.
|
|
156
|
+
*/
|
|
157
|
+
getAccountDeltaDetail(accountId: string, nonce: number, options?: DeltaDetailOptions): Promise<DashboardDeltaDetail>;
|
|
102
158
|
/**
|
|
103
159
|
* List the per-account in-flight multisig proposal queue for
|
|
104
160
|
* `accountId`, paginated newest-first by `(nonce DESC, commitment
|
package/dist/http.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
|