@openzeppelin/guardian-operator-client 0.14.6 → 0.15.0-rc.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 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?: PaginationOptions): Promise<PagedResult<DashboardAccountSummary>>;
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
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,wBAAwB,EACxB,wBAAwB,EAExB,uBAAuB,EAQvB,oBAAoB,EACpB,mBAAmB,EASnB,kBAAkB,EAClB,yBAAyB,EACzB,4BAA4B,EAC5B,qBAAqB,EACrB,sBAAsB,EAItB,mBAAmB,EACnB,kBAAkB,EAClB,iCAAiC,EACjC,6BAA6B,EAC7B,sBAAsB,EAEtB,yBAAyB,EACzB,WAAW,EACX,oBAAoB,EACpB,mBAAmB,EACnB,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACvB,MAAM,YAAY,CAAC;AAGpB;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAoB,SAAQ,iBAAiB;IAC5D,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAiDD;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,kBAAkB,GAAG,MAAM,GAAG,IAAI,CAAC;IACzC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,QAAQ,GAAG,OAAO,GAC3B,OAAO,CAAC,eAAe,CAAC,CA4F1B;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,GACZ,KAAK,IAAI,kBAAkB,CAE7B;AAED,qBAAa,yBAA0B,SAAQ,KAAK;aAIhC,MAAM,EAAE,MAAM;aACd,UAAU,EAAE,MAAM;aAClB,IAAI,EAAE,MAAM;aACZ,IAAI,EAAE,6BAA6B,GAAG,IAAI;IAN5D,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;gBAGf,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,6BAA6B,GAAG,IAAI;CAU7D;AAED,qBAAa,6BAA8B,SAAQ,KAAK;aAEpC,OAAO,EAAE,MAAM;gBAAf,OAAO,EAAE,MAAM,EAC/B,OAAO,EAAE,MAAM;CAKlB;AAED,qBAAa,0BAA0B;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAM;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAqB;IAClD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAU;gBAE7B,OAAO,EAAE,MAAM;gBACf,OAAO,EAAE,iCAAiC;IAahD,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC;IAMjE,MAAM,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAcvE,MAAM,IAAI,OAAO,CAAC,sBAAsB,CAAC;IAQ/C;;;;;;;;;;OAUG;IACG,YAAY,CAChB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,WAAW,CAAC,uBAAuB,CAAC,CAAC;IAShD;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAQhD;;;OAGG;IACG,gBAAgB,IAAI,OAAO,CAAC,qBAAqB,CAAC;IAQxD;;;;OAIG;IACG,YAAY,CAChB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,oBAAoB,CAAC;IAShC;;;;OAIG;IACG,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,sBAAsB,CAAC;IAa5B,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAStE;;;;;;;;;;;;;;;;;OAiBG;IACG,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAS9E;;;;OAIG;IACG,iBAAiB,CACrB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAC;IAU5C;;;;;OAKG;IACG,qBAAqB,CACzB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,oBAAoB,CAAC;IAkBhC;;;;;;OAMG;IACG,oBAAoB,CACxB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC;IAU/C;;;;;;OAMG;IACG,gBAAgB,CACpB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,WAAW,CAAC,yBAAyB,CAAC,CAAC;IAmBlD;;;;;;OAMG;IACG,mBAAmB,CACvB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,WAAW,CAAC,4BAA4B,CAAC,CAAC;YAMvC,OAAO;YA4BP,WAAW;CAU1B"}