Skip to content

Commit f5a4ef0

Browse files
os-zhuangclaude
andauthored
refactor!: ADR-0112 batch 2 — sweep the lowercase error-code emitters (#4003) (#4021)
* refactor(spec)!: connector-side error enums get Connector* names (ADR-0112 D9a) packages/spec exported two mutually incompatible ErrorCategory types and two RetryStrategy types — api/errors.zod.ts (HTTP error responses) and integration/connector.zod.ts (connector normalisation). Separate subpath exports kept TypeScript quiet, but the doc/schema generators key on the stripped name, so a cross-reference to 'ErrorCategory' resolved to whichever was scanned last. Rename the connector-side pair to ConnectorErrorCategory / ConnectorRetryStrategy and say in each docblock why the name is prefixed. Both are spec-internal (only connector.zod.ts and its test referenced them), so no downstream break. The json-schema ratchet caught the rename as an unpublish; the two manifest keys are renamed alongside, per its instructions. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MaSQn77TT5fUgHK9CesaDK * refactor(cloud-connection,plugin-auth,hono)!: sweep the two largest lowercase code clusters (ADR-0112 batch 2) Converts 105 lowercase snake_case error codes to the declared vocabulary and registers the service-specific ones in ERROR_CODE_LEDGER. Generic conditions collapse onto the standard catalog rather than keeping a synonym: 'unauthorized'/'unauthenticated' -> UNAUTHENTICATED, 'forbidden' -> PERMISSION_DENIED, 'not_found' -> RESOURCE_NOT_FOUND, 'internal' -> INTERNAL_ERROR, 'unavailable' -> SERVICE_UNAVAILABLE, 'not_supported' -> NOT_IMPLEMENTED, and 'bad_request' -> INVALID_REQUEST (a status name is not a semantic code). Domain conditions get registered codes, prefixed where the bare name wouldn't carry meaning (MARKETPLACE_STORAGE_FAILED, PLUGIN_MANIFEST_INVALID, ENVIRONMENT_BIND_FAILED, RESEED_SKIPPED, ...). New ledger entries: @objectstack/cloud-connection and @objectstack/hono. Also closes an unbounded code source found while sweeping: the OAuth client registration route put better-auth's arbitrary `body.error` string straight into `error.code`, so any upstream string became a code and the closed set could not hold. The code is now ours (OAUTH_REGISTER_FAILED) and the upstream discriminator moves to `details.upstreamError`. Per-package consumer check (ADR-0112 batch-2 precondition): no reader outside either package branches on the swept spellings; the in-package test assertions move with the emitters. Refs #4003, #3841. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MaSQn77TT5fUgHK9CesaDK * refactor(metadata-protocol,service-automation,spec)!: sweep the thrown-error codes; keep the audit column out (ADR-0112 batch 2) Three clusters, all of which reach `error.code` on the wire — a thrown error's `.code` is copied straight into the response body (rest-server.ts:268), so these were never merely internal. - metadata-protocol: 24 thrown codes (ITEM_LOCKED, NOT_OVERRIDABLE, METADATA_CONFLICT, DESTRUCTIVE_CHANGE, ...) registered under the package, plus the two `evaluateLockFor*` helpers in spec that feed them. - service-automation resume refusals: 'forbidden' -> PERMISSION_DENIED, 'invalid_signal' -> INVALID_SIGNAL, together with the runtime branch that reads them and the contract docstring that documents them. Two decisions worth keeping: `sys_metadata_audit.code` is deliberately NOT swept. It spells its denial reasons identically to the codes the protocol throws, so a naive sweep renames it too — but the column is persisted audit history (rows predating ADR-0112 keep their spelling forever) and it also holds non-error outcomes ('ok', 'lock_override'). Following the catalog would buy a data migration or one column with two vocabularies mixed by write date. It stays lowercase and self-contained; the divergence is recorded at both sites and as ADR-0112 D6b, so it reads as a decision rather than a missed rename. The ADR's "no consumer branches on the lowercase dialect" claim was wrong: the per-service re-verification it mandated found three, each renamed atomically here. The ADR now records the correction plus a sweep checklist of the six literal forms a `code: '...'` grep misses (comparisons, property assignment, computed ternaries, regex assertions, toBe assertions, docstrings) — every one of them cost a red suite in this batch. Refs #4003, #3841. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MaSQn77TT5fUgHK9CesaDK * refactor(rest,service-messaging,plugin-webhooks)!: sweep the last top-level codes and un-nest three flat envelopes (ADR-0112 batch 2) - rest: OBJECT_NOT_FOUND, UNAUTHENTICATED (it sat in the same if/else as an already-SCREAMING PERMISSION_DENIED), INVALID_REQUEST. - service-messaging redeliver: RESOURCE_NOT_FOUND / DELIVERY_NOT_ELIGIBLE, with the plugin-webhooks route that branches on them. Three routes also had a bare code string in the `error:` slot with a real `message:` beside it, so `error` was a code and the declared object envelope was nowhere. They now emit `error: { code, message }` — a rename alone would have left them unvalidated, which is how the lowercase dialect survived the first place. `mapDataError`'s downcasing is inverted, not just renamed. It deliberately translated the internal SCREAMING OBJECT_NOT_FOUND down to `object_not_found` on the way out, and a test pinned exactly that ("does not let the generic 4xx passthrough ship the internal SCREAMING_CASE code") — correct when the data routes were believed to speak their own dialect, backwards once there is one vocabulary. The translation is gone and the test is rewritten to pin what still matters: no per-route dialect translation, what the gate threw is what ships. Two comments that still taught the lowercase wire code are updated with it. Field-level codes in `import-coerce.ts` are deliberately untouched (ADR-0112 D6, #3977). Refs #4003, #3841. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MaSQn77TT5fUgHK9CesaDK * docs: add batch-2 changeset; webhook redeliver doc follows the new envelope Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MaSQn77TT5fUgHK9CesaDK * refactor(trigger-api,spec)!: trigger-api answers in the declared envelope; draw the catalog's boundary (ADR-0112 batch 2) The API-trigger webhook endpoint returned `{ error: '<code>' }` — a bare code in the message slot, six times, three of them with no message at all. It now answers `{ success: false, error: { code, message } }` with catalog codes (RESOURCE_NOT_FOUND, INVALID_REQUEST, SERVICE_UNAVAILABLE) plus two registered ones (INVALID_SIGNATURE, ENQUEUE_FAILED). Every branch gains the message it was missing. Also records what batch 2 decided NOT to sweep, as ADR-0112 D6c, because three lowercase clusters look like stragglers and are not: - Diagnostics records (`build-probes.ts` RuntimeBuildIssue, `metadata-diagnostics.ts`) ship as the payload of a 200, describe an artifact rather than the request, and carry a severity that can be 'warning'. - Param/field-addressed issues (`ActionParamIssue`, plugin-sharing's `fields[]`) are D6 territory; plugin-sharing's own top-level code is already VALIDATION_FAILED. - CLI `emitJson({ error: '...' })` output is a terminal contract read by shell scripts, not a request response — renaming it would break users' pipelines with neither a schema nor this ADR asking for it. The line, now written down once: the catalog governs the code a failing REQUEST answers with. Field-addressed (D6), persisted (D6b), or shipped inside a successful response (D6c) means a different vocabulary with different consumers. Refs #4003, #3841. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MaSQn77TT5fUgHK9CesaDK * fix(spec)!: the automation resume contract's code type follows the rename The resume result's `code` is a literal-union TYPE in the service contract, not just a value, and batch 2 renamed only the values plus the docstring beside it. Nothing in spec failed: `tsc --noEmit` on the declaring package is happy with a narrower union than its callers emit. The break surfaced two packages away — the dts build of every consumer of @objectstack/spec/integration, which is what took Build Core, Test Core and the dogfood shards red at once. Added to the ADR's sweep checklist as its own row, since it is the one form whose error appears in a package the sweep never touched. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MaSQn77TT5fUgHK9CesaDK * fix(runtime,plugin-approvals,metadata-protocol): the last four readers of the automation and publish codes Four more consumers of codes batch 2 renamed, found by running the full suite rather than grepping harder: - plugin-approvals asserts the resume refusal code (its approval node IS the service-gated case), a package the sweep never touched. - http-dispatcher.test mocks the automation service's result, so its two literals are the emitter's contract restated in a mock. - batch_aborted -> BATCH_ABORTED: it rides in the same failed[] array as the causal item's catalog code, so leaving it lowercase made one array carry two vocabularies. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MaSQn77TT5fUgHK9CesaDK * fix(qa): the dogfood package-first authoring assertion follows the rename Sixth consumer found, and the one my local verification could not have caught: the full-suite run I used as the safety net excludes @objectstack/dogfood by design, so the dogfood shards were the one gate I had not actually run. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MaSQn77TT5fUgHK9CesaDK * feat(ci): guard against new lowercase error codes (ADR-0112, #4003) The ledger's admission test enforces casing on every code someone REGISTERS. Nothing enforced the ones nobody registers — and an unregistered lowercase literal in a code position is invisible twice: to the ledger, which has nothing to check, and to the schema, on any route that never parses its own response. That is how 208 lowercase literals accumulated across 10 packages. Without a guard, number 209 lands the same way. `scripts/check-error-code-casing.mjs` scans packages/ for four code positions — emission, property assignment, comparison, and literal-union type — which are the forms batch 2 actually got bitten by, comparison and union-type being the two that fail silently or two packages away. The design problem is that `code` is also an ordinary domain field name: a license plan code, a seed industry code, a locale. A guard that flags those gets switched off within a week, so a hit only counts when an error-shaped neighbour (error/message/throw/status/issues/...) appears within a few lines, and the D6 families are recognised structurally — a `field`/`param`/`path`/`target` key in the same record, checked over a window because `{ code, field, message }` is routinely spread across three lines. Three escape hatches, in descending preference: - structural: the D6 shapes above, no annotation needed; - `// adr0112-ok: <reason>` at the site, for a file that legitimately holds both vocabularies (protocol.ts throws a catalog code and writes an audit row beside it) — the reason is required, a bare marker does not count; - EXEMPT_FILES, for a file that OWNS a non-catalog vocabulary (a diagnostics producer, OData's foreign error vocabulary), each line carrying its reason. `--self-test` runs 17 cases (each violating form, each exemption route, each known false-positive shape) before the scan, so a green run means the matcher was checked, not just quiet. End-to-end verified by reintroducing `code: 'object_not_found'` in rest-server.ts: the guard fails, and passes again when reverted. Two real fixes fell out of turning it on: the `'locked'` fixtures in two publish tests now spell what the protocol actually throws (ITEM_LOCKED), and the audit-row sites carry their D6b marker so the divergence reads as a decision. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MaSQn77TT5fUgHK9CesaDK * docs: the batch-2 changeset covers trigger-api, plugin-approvals and the new guard Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MaSQn77TT5fUgHK9CesaDK --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent fb7de07 commit f5a4ef0

79 files changed

Lines changed: 923 additions & 445 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
---
2+
"@objectstack/spec": minor
3+
"@objectstack/rest": minor
4+
"@objectstack/runtime": minor
5+
"@objectstack/cloud-connection": minor
6+
"@objectstack/plugin-auth": minor
7+
"@objectstack/plugin-approvals": minor
8+
"@objectstack/plugin-webhooks": minor
9+
"@objectstack/service-messaging": minor
10+
"@objectstack/service-automation": minor
11+
"@objectstack/metadata-protocol": minor
12+
"@objectstack/metadata-core": minor
13+
"@objectstack/trigger-api": minor
14+
"@objectstack/hono": minor
15+
---
16+
17+
refactor!: ADR-0112 batch 2 — sweep the lowercase error-code emitters (#4003)
18+
19+
Continues #3841 per ADR-0112. Batch 1 (#3988) settled the vocabulary and closed
20+
the set; this batch moves the emitters that still spoke lowercase `snake_case`
21+
onto it.
22+
23+
**Wire-visible change.** Error codes on these surfaces change spelling. Generic
24+
conditions collapse onto the standard catalog rather than keeping a synonym:
25+
`unauthorized`/`unauthenticated``UNAUTHENTICATED`, `forbidden`
26+
`PERMISSION_DENIED`, `not_found``RESOURCE_NOT_FOUND`, `internal`
27+
`INTERNAL_ERROR`, `unavailable``SERVICE_UNAVAILABLE`, `not_supported`
28+
`NOT_IMPLEMENTED`, `bad_request``INVALID_REQUEST`. Domain conditions get codes
29+
registered in `ERROR_CODE_LEDGER` (`MARKETPLACE_STORAGE_FAILED`,
30+
`PLUGIN_MANIFEST_INVALID`, `ITEM_LOCKED`, `DELIVERY_NOT_ELIGIBLE`, …). Swept:
31+
`cloud-connection`, `plugin-auth`, `hono`, `metadata-protocol`, `rest`,
32+
`service-messaging`, `service-automation`, `trigger-api`.
33+
34+
Branch on `error.code` values rather than pattern-matching their case: the
35+
console's fix for the same rename (objectui#2977) reads codes case-insensitively
36+
for exactly this reason, and that is the pattern to copy in your own consumers if
37+
you support servers on both sides of the change.
38+
39+
**Four routes stop putting a code in the message slot.** The webhook redeliver
40+
route, the API-trigger webhook, and two `rest` routes answered
41+
`{ success: false, error: '<code>', message }` — the code occupying `error`, the
42+
declared object envelope nowhere. They now emit `error: { code, message }`, and
43+
three API-trigger branches gained a message they never had. Clients reading
44+
`body.error` as a string on those routes must read `body.error.code`.
45+
46+
**`ConnectorErrorCategory` / `ConnectorRetryStrategy`** (ADR-0112 D9a):
47+
`@objectstack/spec` exported two mutually incompatible `ErrorCategory` types and
48+
two `RetryStrategy` types. The connector-side pair is renamed; importers of the
49+
`integration` subpath update the name. Side effect: the api-side `ErrorCategory`
50+
and `RetryStrategy` now appear in the generated API reference at all — the name
51+
collision had been silently dropping them.
52+
53+
**`OAUTH_REGISTER_FAILED` replaces an unbounded code source.** The OAuth client
54+
registration route put better-auth's arbitrary `body.error` string straight into
55+
`error.code`. The code is now ours and the upstream discriminator moved to
56+
`details.upstreamError`.
57+
58+
**Not swept, deliberately.** `sys_metadata_audit.code` keeps its lowercase values
59+
(ADR-0112 D6b): it is persisted audit history, and the same column holds
60+
non-error outcomes (`ok`, `lock_override`). Diagnostics records that ship inside a
61+
200 keep theirs (D6c), as do field-level codes (D6, #3977) and the CLI's
62+
`--json` output contract.
63+
64+
A `check:error-code-casing` CI guard now fails on a new lowercase literal in a
65+
code position, since the ledger's casing rule can only police codes that someone
66+
registers.

.github/workflows/lint.yml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,15 @@ jobs:
114114
- name: Response-envelope guard
115115
run: pnpm check:route-envelope
116116

117+
# Error-code casing guard (ADR-0112, #4003). The ledger's admission test
118+
# enforces casing on every code someone REGISTERS; this catches the ones
119+
# nobody registers — an unregistered lowercase literal in a code position
120+
# is invisible to both the ledger and to the schema on any route that does
121+
# not parse its own response. That is how 208 of them accumulated across
122+
# 10 packages before batch 2. Runs its own --self-test first.
123+
- name: Error-code casing guard
124+
run: pnpm check:error-code-casing
125+
117126
# Release-notes drift guard: the platform is one version-locked train, so
118127
# every released @objectstack/spec major must have a curated, navigable
119128
# release page at content/docs/releases/v<major>.mdx. Catches the gap that

content/docs/automation/webhooks.mdx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -399,10 +399,11 @@ The plugin mounts exactly **one** custom endpoint:
399399
| POST | `/api/v1/webhooks/redeliver` | `{ deliveryId }` | Re-queue a previously failed/dead delivery. |
400400

401401
It delegates to `messaging.redeliverHttp(deliveryId)` and is guarded by the
402-
better-auth session (any authenticated user). Responses: `200` on success,
403-
`401` unauthenticated, `400` missing/invalid body, `404` `not_found`, `409`
404-
`not_eligible`. There are no `/webhooks/:id/test`, `/rotate`,
405-
`/deliveries`, or per-delivery redeliver routes.
402+
better-auth session (any authenticated user). Failures answer in the declared
403+
envelope — `{ success: false, error: { code, message } }` — with `401`
404+
`UNAUTHENTICATED`, `400` `INVALID_REQUEST` or `MISSING_REQUIRED_FIELD`, `404`
405+
`RESOURCE_NOT_FOUND`, `409` `DELIVERY_NOT_ELIGIBLE` (ADR-0112). There are no
406+
`/webhooks/:id/test`, `/rotate`, `/deliveries`, or per-delivery redeliver routes.
406407

407408
## 9. Concurrency & rate-limiting
408409

content/docs/references/api/analytics.mdx

Lines changed: 3 additions & 3 deletions
Large diffs are not rendered by default.

content/docs/references/api/auth.mdx

Lines changed: 2 additions & 2 deletions
Large diffs are not rendered by default.

content/docs/references/api/automation-api.mdx

Lines changed: 9 additions & 9 deletions
Large diffs are not rendered by default.

content/docs/references/api/batch.mdx

Lines changed: 3 additions & 3 deletions
Large diffs are not rendered by default.

content/docs/references/api/connector.mdx

Lines changed: 3 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -12,42 +12,13 @@ description: Connector protocol schemas
1212
## TypeScript Usage
1313

1414
```typescript
15-
import { ErrorCategory, RetryStrategy, WebhookConfig, WebhookEvent } from '@objectstack/spec/api';
16-
import type { ErrorCategory, RetryStrategy, WebhookConfig, WebhookEvent } from '@objectstack/spec/api';
15+
import { WebhookConfig, WebhookEvent } from '@objectstack/spec/api';
16+
import type { WebhookConfig, WebhookEvent } from '@objectstack/spec/api';
1717

1818
// Validate data
19-
const result = ErrorCategory.parse(data);
19+
const result = WebhookConfig.parse(data);
2020
```
2121

22-
---
23-
24-
## ErrorCategory
25-
26-
### Allowed Values
27-
28-
* `validation`
29-
* `authentication`
30-
* `authorization`
31-
* `not_found`
32-
* `conflict`
33-
* `rate_limit`
34-
* `server`
35-
* `external`
36-
* `maintenance`
37-
38-
39-
---
40-
41-
## RetryStrategy
42-
43-
### Allowed Values
44-
45-
* `no_retry`
46-
* `retry_immediate`
47-
* `retry_backoff`
48-
* `retry_after`
49-
50-
5122
---
5223

5324
## WebhookConfig

content/docs/references/api/contract.mdx

Lines changed: 8 additions & 8 deletions
Large diffs are not rendered by default.

content/docs/references/api/error-code-ledger.mdx

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,13 +137,18 @@ const result = ErrorCode.parse(data);
137137
* `ATTACHMENT_DOWNLOAD_DENIED`
138138
* `ATTACHMENT_PARENT_ACCESS`
139139
* `AUDIENCE_NOT_ALLOWED`
140+
* `AUTH_CONFIG_ERROR`
140141
* `AUTH_REQUIRED`
141142
* `AUTOMATION_UNSCOPED_RUN_DATA_ACCESS`
143+
* `BATCH_ABORTED`
142144
* `BATCH_NOT_ATOMIC`
143145
* `BATCH_TOO_LARGE`
144146
* `BATCH_UNRESOLVED_REF`
145147
* `BLANK_MATCH_KEY`
146148
* `CLONE_DISABLED`
149+
* `CLOUD_FETCH_FAILED`
150+
* `CLOUD_UNCONFIGURED`
151+
* `COMMIT_NOT_FOUND`
147152
* `CONCURRENT_UPDATE`
148153
* `CONFLICTING_MAPPING`
149154
* `CONNECTOR_UPSTREAM_UNAVAILABLE`
@@ -152,10 +157,18 @@ const result = ErrorCode.parse(data);
152157
* `DATASET_INVALID`
153158
* `DATASOURCE_ADMIN_ERROR`
154159
* `DELEGABLE_SCOPE_FAILED`
160+
* `DELIVERY_NOT_ELIGIBLE`
161+
* `DESTRUCTIVE_CHANGE`
162+
* `DEVICE_CODE_FAILED`
163+
* `DOMAIN_VERIFICATION_DISABLED`
155164
* `DOMAIN_VERIFICATION_FAILED`
165+
* `DRIVER_UNAVAILABLE`
156166
* `DUPLICATE_REQUEST`
157167
* `EMAIL_SEND_FAILED`
158168
* `EMAIL_SERVICE_REQUIRED`
169+
* `ENQUEUE_FAILED`
170+
* `ENVIRONMENT_BIND_FAILED`
171+
* `ENVIRONMENT_NOT_FOUND`
159172
* `ENV_ACCESS_DENIED`
160173
* `ERR_BULK_RESULT_MISMATCH`
161174
* `ERR_DATASOURCE_UNAVAILABLE`
@@ -187,22 +200,30 @@ const result = ErrorCode.parse(data);
187200
* `INTERNAL`
188201
* `INVALID_EMAIL`
189202
* `INVALID_EXPIRY`
203+
* `INVALID_METADATA`
190204
* `INVALID_OR_EXPIRED`
191205
* `INVALID_PHONE`
192206
* `INVALID_REQUEST`
193207
* `INVALID_RESUME_TOKEN`
208+
* `INVALID_SIGNAL`
209+
* `INVALID_SIGNATURE`
194210
* `INVALID_STATE`
195211
* `INVITE_EMAIL_FAILED`
196212
* `INVITE_REQUIRES_EMAIL`
197213
* `INVITE_SMS_FAILED`
198214
* `IP_NOT_ALLOWED`
215+
* `ITEM_LOCKED`
199216
* `LAST_LOCAL_CREDENTIAL`
200217
* `LOOKUP_NOT_PUBLIC`
201218
* `LOOKUP_TARGET_MISSING`
219+
* `MANIFEST_CONFLICT`
202220
* `MAPPING_FORMAT_MISMATCH`
203221
* `MAPPING_FORMAT_UNSUPPORTED`
204222
* `MAPPING_NOT_FOUND`
205223
* `MAPPING_TARGET_MISMATCH`
224+
* `MARKETPLACE_PROXY_FAILED`
225+
* `MARKETPLACE_STORAGE_FAILED`
226+
* `MARKETPLACE_UNAVAILABLE`
206227
* `METADATA_BRANCH`
207228
* `METADATA_CONFLICT`
208229
* `METADATA_NOT_FOUND`
@@ -211,15 +232,22 @@ const result = ErrorCode.parse(data);
211232
* `NAMESPACE_PREFIX`
212233
* `NEEDS_PASSWORD`
213234
* `NODE_FAILURE`
235+
* `NOTHING_TO_PURGE`
236+
* `NOT_CREATABLE`
214237
* `NOT_FOUND`
238+
* `NOT_OVERRIDABLE`
215239
* `NOT_UNDOABLE`
240+
* `NO_DRAFT`
216241
* `NO_EXECUTOR`
217242
* `NO_IDENTITY`
218243
* `NO_MATCH`
219244
* `NO_PENDING_VERIFICATION`
245+
* `OAUTH_REGISTER_FAILED`
220246
* `OBJECT_API_DISABLED`
221247
* `OBJECT_API_METHOD_NOT_ALLOWED`
248+
* `OPENAPI_UNAVAILABLE`
222249
* `OS_PROTOCOL_INCOMPATIBLE`
250+
* `OVERLAY_PERSISTENCE_FAILED`
223251
* `PACKAGE_DELETE_FAILED`
224252
* `PACKAGE_DELETE_PARTIAL`
225253
* `PACKAGE_MANIFEST_INVALID`
@@ -231,6 +259,9 @@ const result = ErrorCode.parse(data);
231259
* `PAYLOAD_TOO_LARGE`
232260
* `PERMISSION_NOT_ALLOWED`
233261
* `PHONE_NOT_ENABLED`
262+
* `PLUGIN_INSTALL_FAILED`
263+
* `PLUGIN_MANIFEST_INVALID`
264+
* `PLUGIN_REGISTER_FAILED`
234265
* `PROJECT_MEMBERSHIP_REQUIRED`
235266
* `PROJECT_NOT_FOUND`
236267
* `PROJECT_PROVISIONING`
@@ -246,13 +277,16 @@ const result = ErrorCode.parse(data);
246277
* `REPORT_SAVE_FAILED`
247278
* `REPORT_SCHEDULE_FAILED`
248279
* `REQUEST_NOT_FOUND`
280+
* `RESEED_NO_ROWS`
281+
* `RESEED_SKIPPED`
249282
* `ROUTE_NOT_FOUND`
250283
* `RULE_DEFINE_FAILED`
251284
* `RULE_DELETE_FAILED`
252285
* `RULE_EVALUATE_FAILED`
253286
* `RULE_GET_FAILED`
254287
* `RULE_LIST_FAILED`
255288
* `RULE_NOT_FOUND`
289+
* `SAML_REGISTER_FAILED`
256290
* `SCHEDULES_LIST_FAILED`
257291
* `SCHEDULE_DELETE_FAILED`
258292
* `SETTINGS_ACTION_FAILED`
@@ -266,6 +300,7 @@ const result = ErrorCode.parse(data);
266300
* `SHARE_REVOKE_FAILED`
267301
* `SHARING_NOT_ENABLED`
268302
* `SIGN_IN_REQUIRED`
303+
* `SSO_REGISTER_FAILED`
269304
* `SSO_REGISTER_FORBIDDEN`
270305
* `SUGGESTION_CONFIRM_FAILED`
271306
* `SUGGESTION_DISMISS_FAILED`
@@ -283,6 +318,9 @@ const result = ErrorCode.parse(data);
283318
* `UPLOAD_SESSION_NOT_FOUND`
284319
* `USER_ALREADY_EXISTS`
285320
* `VALIDATION_FAILED`
321+
* `VERSION_NOT_FOUND`
322+
* `VERSION_NOT_RESTORABLE`
323+
* `WRITABLE_PACKAGE_REQUIRED`
286324
* `WRONG_PASSWORD`
287325

288326

0 commit comments

Comments
 (0)