@objectstack/plugin-approvals 16.0.0-rc.1 → 16.1.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.
@@ -1,22 +1,22 @@
1
1
 
2
- > @objectstack/plugin-approvals@16.0.0-rc.1 build /home/runner/work/framework/framework/packages/plugins/plugin-approvals
2
+ > @objectstack/plugin-approvals@16.1.0 build /home/runner/work/objectstack/objectstack/packages/plugins/plugin-approvals
3
3
  > tsup --config ../../../tsup.config.ts
4
4
 
5
5
  CLI Building entry: src/index.ts
6
6
  CLI Using tsconfig: tsconfig.json
7
7
  CLI tsup v8.5.1
8
- CLI Using tsup config: /home/runner/work/framework/framework/tsup.config.ts
8
+ CLI Using tsup config: /home/runner/work/objectstack/objectstack/tsup.config.ts
9
9
  CLI Target: es2020
10
10
  CLI Cleaning output folder
11
11
  ESM Build start
12
12
  CJS Build start
13
13
  ESM dist/index.mjs 156.89 KB
14
14
  ESM dist/index.mjs.map 275.84 KB
15
- ESM ⚡️ Build success in 231ms
15
+ ESM ⚡️ Build success in 357ms
16
16
  CJS dist/index.js 158.72 KB
17
17
  CJS dist/index.js.map 277.08 KB
18
- CJS ⚡️ Build success in 235ms
18
+ CJS ⚡️ Build success in 372ms
19
19
  DTS Build start
20
- DTS ⚡️ Build success in 21940ms
21
- DTS dist/index.d.mts 418.30 KB
22
- DTS dist/index.d.ts 418.30 KB
20
+ DTS ⚡️ Build success in 22467ms
21
+ DTS dist/index.d.mts 420.38 KB
22
+ DTS dist/index.d.ts 420.38 KB
package/CHANGELOG.md CHANGED
@@ -1,5 +1,176 @@
1
1
  # @objectstack/plugin-approvals
2
2
 
3
+ ## 16.1.0
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [212b66a]
8
+ - Updated dependencies [d10c4dc]
9
+ - Updated dependencies [9e45b63]
10
+ - Updated dependencies [b20201f]
11
+ - @objectstack/platform-objects@16.1.0
12
+ - @objectstack/spec@16.1.0
13
+ - @objectstack/core@16.1.0
14
+ - @objectstack/formula@16.1.0
15
+ - @objectstack/metadata-core@16.1.0
16
+
17
+ ## 16.0.0
18
+
19
+ ### Minor Changes
20
+
21
+ - e412fb6: feat(approvals): declare file attachments on approve/reject decisions
22
+
23
+ The declared `approval_approve` / `approval_reject` actions on
24
+ `sys_approval_request` gain an optional multi-file `attachments` param
25
+ (`type: 'file'`, `multiple`). The console renders `type:'file'` action params
26
+ through the shared upload widget (objectui ADR-0059) and POSTs the resolved
27
+ `attachments: string[]`, so a reviewer can attach supporting files to a
28
+ decision through the generic declared-action dialog — letting the approvals
29
+ inbox retire its hand-wired attachment composer (objectui#2698).
30
+
31
+ Purely additive metadata: the decision route already forwards
32
+ `body.attachments` to `ApprovalService.decide`, and the
33
+ `sys_approval_action.attachments` column (file, multiple) already persists them
34
+ (#3266/#3274). No service or route change.
35
+
36
+ - 8efa395: feat(approvals): server-computed `viewer` capability for precise decision-action gating
37
+
38
+ `getRequest` / `listRequests` now attach a per-viewer block —
39
+ `viewer: { can_act, is_submitter }` — computed from the caller's context
40
+ (`ApprovalRequestRow.viewer`):
41
+
42
+ - `can_act` — the caller is a _current pending approver_ (their user id is in the
43
+ request's resolved `pending_approvers` while it is still `pending`). This is
44
+ the same check the decision methods authorize with, so it already reflects
45
+ position/team/manager resolution — strictly more accurate than a client-side
46
+ identity guess.
47
+ - `is_submitter` — the caller submitted the request.
48
+
49
+ The declared decision actions on `sys_approval_request` now gate on it: approver
50
+ actions (approve/reject/reassign/send-back/request-info) use
51
+ `record.viewer.can_act`; submitter levers (remind/recall/resubmit) use
52
+ `record.viewer.is_submitter`. Previously approver actions only trimmed the
53
+ non-pending case, so a submitter viewing their own pending request saw buttons
54
+ they couldn't use (the backend 403'd); a position-addressed approver could be
55
+ wrongly hidden by the old client heuristic. Where `viewer` is absent (a row
56
+ surfaced outside a service read with a user context), the predicate fails closed.
57
+
58
+ - 3a18b60: feat(approvals): rename the `role` approver type to `org_membership_level` (#3133)
59
+
60
+ `ApproverType.role` was the last platform surface projecting the reserved word
61
+ "role" (ADR-0090 D3). It is not covered by D3's better-auth exception: that
62
+ exception protects better-auth's own `sys_member.role` **column**, which we do
63
+ not own — `ApproverType` is our own enum, an authoring surface, and D3 mandates
64
+ that the projection of that concept is spelled `org_membership_level` and
65
+ labelled "organization membership", **never "role"**.
66
+
67
+ The sentence licensing the leak was also false: ADR-0090 D3 claims
68
+ `sys_member.role` is "already relabelled `org_membership_level` in the platform
69
+ projection", but `org_membership_level` existed nowhere in the codebase and
70
+ ADR-0057 D7 lists that relabel under "Deferred (evidence-gated, P4)". The
71
+ projection never landed, so the word reached authors.
72
+
73
+ The name manufactured a real, silent failure — "hotcrm class": every other
74
+ surface renamed to `position` (`sys_role`, `ShareRecipientType.role`,
75
+ `ctx.roles[]`), so `{ type: 'role', value: 'sales_manager' }` reads as the
76
+ legacy spelling of a position. It resolves against the membership tier, finds
77
+ no member row, falls back to an inert `role:sales_manager` literal, and the
78
+ request waits forever on an approver that cannot exist.
79
+
80
+ - **spec**: `ApproverType` gains `org_membership_level`; `role` stays as a
81
+ deprecated alias for one window (a published 15.x flow keeps loading) with
82
+ `DEPRECATED_APPROVER_TYPES` + `canonicalApproverType()` as the single source
83
+ for the mapping. Removed in the next major.
84
+ - **plugin-approvals**: resolves on the canonical type and warns on the
85
+ deprecated spelling. The `type:value` fallback literal keeps the **authored**
86
+ spelling — stored `sys_approval_approver` rows and `pending_approvers` slots
87
+ from 15.x carry `role:<v>`, and rewriting it would orphan them.
88
+ - **lint**: `approval-role-not-membership-tier` → `approval-approver-not-membership-tier`
89
+ (the rule id carried the reserved word too), plus a new
90
+ `approval-approver-type-deprecated`. The two are mutually exclusive: a bad
91
+ _value_ wins, because prescribing `org_membership_level` for a position name
92
+ would be wrong advice — the fix there is `position`.
93
+
94
+ Authoring `type: 'role'` keeps working and now says so out loud. Rewrite it as
95
+ `org_membership_level`; if the value is an org position, the fix is `position`.
96
+
97
+ ### Patch Changes
98
+
99
+ - 22013aa: **Split the overloaded `managedBy: 'system'` bucket into engine-owned vs. admin-writable, and enforce engine-owned writes (ADR-0103, #3220).** The `system` bucket conflated two incompatible write policies: rows a platform service owns end to end (never user-written), and platform-defined schema whose rows are legitimately admin/user-writable. It carried the same all-false affordance row as `better-auth`/`append-only` but, unlike `better-auth`, had no engine enforcement — a wildcard admin could raw-write these rows through the generic data API (ADR-0049 gap).
100
+
101
+ Rather than add a new `managedBy` enum value (which would fall through to fully-editable `platform` defaults on already-deployed Console clients), the write policy is now the **resolved affordance** (`resolveCrudAffordances` = bucket default + `userActions`), and _engine-owned_ is defined as a `system`/`append-only` object that grants no write:
102
+
103
+ - **Writable set declares `userActions`** — the RBAC link tables (`sys_user_position`, `sys_user_permission_set`, `sys_position_permission_set`), `sys_user_preference`, `sys_approval_delegation`, and the messaging config grids (`sys_notification_preference` / `…_subscription` / `…_template`) now declare `userActions: { create, edit, delete: true }`. The affordance is a declaration only — the `DelegatedAdminGate` / RLS / permission sets remain the authz.
104
+ - **Engine-owned objects locked to reads** — `apiMethods: ['get','list']` added where absent (jobs, notifications, approval request/approver/token/action, `sys_record_share`, `sys_automation_run`, mail/settings/secret audit, the messaging delivery pipeline). `sys_secret` is explicitly read-locked (an empty `apiMethods` array fails open).
105
+ - **`sys_import_job`** stays engine-owned: the REST import route now writes its job rows `isSystem`-elevated (attribution preserved via the explicit `created_by` stamp) and the object is locked to `['get','list']`.
106
+ - **New engine write guard** (`assertEngineOwnedWriteAllowed`, plugin-security) fail-closed rejects user-context generic writes to engine-owned `system`/`append-only` objects, keyed off the resolved affordance; `isSystem` and context-less engine/service writes bypass by construction. Wired into the security middleware alongside the other data-layer gates.
107
+ - **`reconcileManagedApiMethods`** (objectql registry) now runs for **every** managed bucket, not just `better-auth`: any advertised write verb an object's resolved affordances forbid is stripped at registration with a warning (the drift backstop, ADR-0049).
108
+ - **`/me/permissions` clamp** (plugin-hono-server) now clamps `system`/`append-only` as well as `better-auth`, so the client hint reflects `permission ∩ guard`.
109
+
110
+ **Potentially breaking:** a downstream/third-party `system` object that advertised generic write verbs relying on today's fail-open behaviour will have those verbs stripped (with a warning) and user-context generic writes to it rejected. Declare `userActions` opening the verbs the object legitimately takes from a user context. `better-auth` keeps plugin-auth's identity write guard unchanged; the row-level `managed_by` provenance vocabulary (ADR-0066) is a different axis and is untouched.
111
+
112
+ - 62a2117: **Split the overloaded `managedBy: 'system'` bucket with an explicit `engine-owned` value (ADR-0103 addendum, #3343).** ADR-0103 deferred the enum split ("revisitable later as a rename") because a new `managedBy` value would fall through to the fully-editable `platform` default on deployed Console clients. Both reasons against it are now retired — the server-side write guard / `apiMethods` reconciliation / `/me/permissions` clamp make that fallthrough cosmetic (the write is rejected regardless of what the client renders), and objectui#2712 closed the UI union — so v16 lands it, **additively**.
113
+
114
+ - **New enum value `engine-owned`** with the same all-locked default affordance row as `system` (`create/import/edit/delete: false`, `exportCsv: true`). It joins `ENGINE_OWNED_BUCKETS` (the engine write guard) and `GUARDED_WRITE_BUCKETS` (the `/me/permissions` clamp); the guard, `reconcileManagedApiMethods`, and the clamp mechanisms are unchanged — `engine-owned` is an explicit member of the set they already covered by resolved affordance.
115
+ - **20 objects relabelled `system → engine-owned`** — the ones the engine owns end to end and that declared no write-opening `userActions` (the metadata store, jobs, approval runtime rows, sharing rows, `sys_automation_run`, the messaging delivery/receipt pipeline, `sys_secret`, settings). One-line, behaviour-identical per object.
116
+ - **8 admin/user-writable objects keep `managedBy: 'system'`** (the RBAC link tables, `sys_user_preference`, `sys_approval_delegation`, the messaging config grids) — `system` now reads as "engine-managed schema, writable via `userActions`".
117
+
118
+ Behaviour-, enforcement- and wire-identical: resolved affordances, the guard verdict, the 405 `apiMethods` reconciliation, and the permissions clamp are the same before and after — this is a self-documenting relabel, not a policy change. No data migration (`managedBy` is schema metadata) and no code branches on the `'system'` literal. Retiring the overloaded `system` entirely (moving the 8 writable objects to a dedicated bucket) is a breaking rename deferred to v17.
119
+
120
+ - Updated dependencies [f972574]
121
+ - Updated dependencies [6289ec3]
122
+ - Updated dependencies [22013aa]
123
+ - Updated dependencies [3ad3dd5]
124
+ - Updated dependencies [8efa395]
125
+ - Updated dependencies [3a18b60]
126
+ - Updated dependencies [a8aa34c]
127
+ - Updated dependencies [e057f42]
128
+ - Updated dependencies [a3823b2]
129
+ - Updated dependencies [bc65105]
130
+ - Updated dependencies [43a3efb]
131
+ - Updated dependencies [524696a]
132
+ - Updated dependencies [6b51346]
133
+ - Updated dependencies [80273c8]
134
+ - Updated dependencies [bfa3c3f]
135
+ - Updated dependencies [5e3301d]
136
+ - Updated dependencies [dd9f223]
137
+ - Updated dependencies [46e876c]
138
+ - Updated dependencies [7125007]
139
+ - Updated dependencies [5f05de2]
140
+ - Updated dependencies [021ba4c]
141
+ - Updated dependencies [158aa14]
142
+ - Updated dependencies [62a2117]
143
+ - Updated dependencies [d2723e2]
144
+ - Updated dependencies [fefcd54]
145
+ - Updated dependencies [beaf2de]
146
+ - Updated dependencies [06cb319]
147
+ - Updated dependencies [369eb6e]
148
+ - Updated dependencies [06ff734]
149
+ - Updated dependencies [b659111]
150
+ - Updated dependencies [5754a23]
151
+ - Updated dependencies [6c270a6]
152
+ - Updated dependencies [290e2f0]
153
+ - Updated dependencies [668dd17]
154
+ - Updated dependencies [8abf133]
155
+ - Updated dependencies [e0859b1]
156
+ - Updated dependencies [04ecd4e]
157
+ - Updated dependencies [4d5a892]
158
+ - Updated dependencies [16cebeb]
159
+ - Updated dependencies [86d30af]
160
+ - Updated dependencies [8923843]
161
+ - Updated dependencies [ea32ec7]
162
+ - Updated dependencies [a2795f6]
163
+ - Updated dependencies [f16b492]
164
+ - Updated dependencies [4b6fde8]
165
+ - Updated dependencies [2018df9]
166
+ - Updated dependencies [fc5a3a2]
167
+ - Updated dependencies [8ff9210]
168
+ - @objectstack/spec@16.0.0
169
+ - @objectstack/platform-objects@16.0.0
170
+ - @objectstack/core@16.0.0
171
+ - @objectstack/formula@16.0.0
172
+ - @objectstack/metadata-core@16.0.0
173
+
3
174
  ## 16.0.0-rc.1
4
175
 
5
176
  ### Minor Changes
package/dist/index.d.mts CHANGED
@@ -418,7 +418,7 @@ declare const SysApprovalRequest: Omit<{
418
418
  }[] | undefined;
419
419
  filter?: {
420
420
  field: string;
421
- operator: string;
421
+ operator: "in" | "contains" | "after" | "starts_with" | "ends_with" | "not_in" | "not_contains" | "between" | "is_null" | "is_not_null" | "is_empty" | "is_not_empty" | "equals" | "not_equals" | "greater_than" | "less_than" | "greater_than_or_equal" | "less_than_or_equal" | "before";
422
422
  value?: string | number | boolean | (string | number)[] | null | undefined;
423
423
  }[] | undefined;
424
424
  description?: string | undefined;
@@ -577,7 +577,7 @@ declare const SysApprovalRequest: Omit<{
577
577
  view?: string | undefined;
578
578
  filter?: {
579
579
  field: string;
580
- operator: string;
580
+ operator: "in" | "contains" | "after" | "starts_with" | "ends_with" | "not_in" | "not_contains" | "between" | "is_null" | "is_not_null" | "is_empty" | "is_not_empty" | "equals" | "not_equals" | "greater_than" | "less_than" | "greater_than_or_equal" | "less_than_or_equal" | "before";
581
581
  value?: string | number | boolean | (string | number)[] | null | undefined;
582
582
  }[] | undefined;
583
583
  order?: number | undefined;
@@ -3904,7 +3904,7 @@ declare const SysApprovalAction: Omit<{
3904
3904
  }[] | undefined;
3905
3905
  filter?: {
3906
3906
  field: string;
3907
- operator: string;
3907
+ operator: "in" | "contains" | "after" | "starts_with" | "ends_with" | "not_in" | "not_contains" | "between" | "is_null" | "is_not_null" | "is_empty" | "is_not_empty" | "equals" | "not_equals" | "greater_than" | "less_than" | "greater_than_or_equal" | "less_than_or_equal" | "before";
3908
3908
  value?: string | number | boolean | (string | number)[] | null | undefined;
3909
3909
  }[] | undefined;
3910
3910
  description?: string | undefined;
@@ -4063,7 +4063,7 @@ declare const SysApprovalAction: Omit<{
4063
4063
  view?: string | undefined;
4064
4064
  filter?: {
4065
4065
  field: string;
4066
- operator: string;
4066
+ operator: "in" | "contains" | "after" | "starts_with" | "ends_with" | "not_in" | "not_contains" | "between" | "is_null" | "is_not_null" | "is_empty" | "is_not_empty" | "equals" | "not_equals" | "greater_than" | "less_than" | "greater_than_or_equal" | "less_than_or_equal" | "before";
4067
4067
  value?: string | number | boolean | (string | number)[] | null | undefined;
4068
4068
  }[] | undefined;
4069
4069
  order?: number | undefined;
@@ -6150,7 +6150,7 @@ declare const SysApprovalApprover: Omit<{
6150
6150
  }[] | undefined;
6151
6151
  filter?: {
6152
6152
  field: string;
6153
- operator: string;
6153
+ operator: "in" | "contains" | "after" | "starts_with" | "ends_with" | "not_in" | "not_contains" | "between" | "is_null" | "is_not_null" | "is_empty" | "is_not_empty" | "equals" | "not_equals" | "greater_than" | "less_than" | "greater_than_or_equal" | "less_than_or_equal" | "before";
6154
6154
  value?: string | number | boolean | (string | number)[] | null | undefined;
6155
6155
  }[] | undefined;
6156
6156
  description?: string | undefined;
@@ -6309,7 +6309,7 @@ declare const SysApprovalApprover: Omit<{
6309
6309
  view?: string | undefined;
6310
6310
  filter?: {
6311
6311
  field: string;
6312
- operator: string;
6312
+ operator: "in" | "contains" | "after" | "starts_with" | "ends_with" | "not_in" | "not_contains" | "between" | "is_null" | "is_not_null" | "is_empty" | "is_not_empty" | "equals" | "not_equals" | "greater_than" | "less_than" | "greater_than_or_equal" | "less_than_or_equal" | "before";
6313
6313
  value?: string | number | boolean | (string | number)[] | null | undefined;
6314
6314
  }[] | undefined;
6315
6315
  order?: number | undefined;
@@ -7667,7 +7667,7 @@ declare const SysApprovalDelegation: Omit<{
7667
7667
  }[] | undefined;
7668
7668
  filter?: {
7669
7669
  field: string;
7670
- operator: string;
7670
+ operator: "in" | "contains" | "after" | "starts_with" | "ends_with" | "not_in" | "not_contains" | "between" | "is_null" | "is_not_null" | "is_empty" | "is_not_empty" | "equals" | "not_equals" | "greater_than" | "less_than" | "greater_than_or_equal" | "less_than_or_equal" | "before";
7671
7671
  value?: string | number | boolean | (string | number)[] | null | undefined;
7672
7672
  }[] | undefined;
7673
7673
  description?: string | undefined;
@@ -7826,7 +7826,7 @@ declare const SysApprovalDelegation: Omit<{
7826
7826
  view?: string | undefined;
7827
7827
  filter?: {
7828
7828
  field: string;
7829
- operator: string;
7829
+ operator: "in" | "contains" | "after" | "starts_with" | "ends_with" | "not_in" | "not_contains" | "between" | "is_null" | "is_not_null" | "is_empty" | "is_not_empty" | "equals" | "not_equals" | "greater_than" | "less_than" | "greater_than_or_equal" | "less_than_or_equal" | "before";
7830
7830
  value?: string | number | boolean | (string | number)[] | null | undefined;
7831
7831
  }[] | undefined;
7832
7832
  order?: number | undefined;
package/dist/index.d.ts CHANGED
@@ -418,7 +418,7 @@ declare const SysApprovalRequest: Omit<{
418
418
  }[] | undefined;
419
419
  filter?: {
420
420
  field: string;
421
- operator: string;
421
+ operator: "in" | "contains" | "after" | "starts_with" | "ends_with" | "not_in" | "not_contains" | "between" | "is_null" | "is_not_null" | "is_empty" | "is_not_empty" | "equals" | "not_equals" | "greater_than" | "less_than" | "greater_than_or_equal" | "less_than_or_equal" | "before";
422
422
  value?: string | number | boolean | (string | number)[] | null | undefined;
423
423
  }[] | undefined;
424
424
  description?: string | undefined;
@@ -577,7 +577,7 @@ declare const SysApprovalRequest: Omit<{
577
577
  view?: string | undefined;
578
578
  filter?: {
579
579
  field: string;
580
- operator: string;
580
+ operator: "in" | "contains" | "after" | "starts_with" | "ends_with" | "not_in" | "not_contains" | "between" | "is_null" | "is_not_null" | "is_empty" | "is_not_empty" | "equals" | "not_equals" | "greater_than" | "less_than" | "greater_than_or_equal" | "less_than_or_equal" | "before";
581
581
  value?: string | number | boolean | (string | number)[] | null | undefined;
582
582
  }[] | undefined;
583
583
  order?: number | undefined;
@@ -3904,7 +3904,7 @@ declare const SysApprovalAction: Omit<{
3904
3904
  }[] | undefined;
3905
3905
  filter?: {
3906
3906
  field: string;
3907
- operator: string;
3907
+ operator: "in" | "contains" | "after" | "starts_with" | "ends_with" | "not_in" | "not_contains" | "between" | "is_null" | "is_not_null" | "is_empty" | "is_not_empty" | "equals" | "not_equals" | "greater_than" | "less_than" | "greater_than_or_equal" | "less_than_or_equal" | "before";
3908
3908
  value?: string | number | boolean | (string | number)[] | null | undefined;
3909
3909
  }[] | undefined;
3910
3910
  description?: string | undefined;
@@ -4063,7 +4063,7 @@ declare const SysApprovalAction: Omit<{
4063
4063
  view?: string | undefined;
4064
4064
  filter?: {
4065
4065
  field: string;
4066
- operator: string;
4066
+ operator: "in" | "contains" | "after" | "starts_with" | "ends_with" | "not_in" | "not_contains" | "between" | "is_null" | "is_not_null" | "is_empty" | "is_not_empty" | "equals" | "not_equals" | "greater_than" | "less_than" | "greater_than_or_equal" | "less_than_or_equal" | "before";
4067
4067
  value?: string | number | boolean | (string | number)[] | null | undefined;
4068
4068
  }[] | undefined;
4069
4069
  order?: number | undefined;
@@ -6150,7 +6150,7 @@ declare const SysApprovalApprover: Omit<{
6150
6150
  }[] | undefined;
6151
6151
  filter?: {
6152
6152
  field: string;
6153
- operator: string;
6153
+ operator: "in" | "contains" | "after" | "starts_with" | "ends_with" | "not_in" | "not_contains" | "between" | "is_null" | "is_not_null" | "is_empty" | "is_not_empty" | "equals" | "not_equals" | "greater_than" | "less_than" | "greater_than_or_equal" | "less_than_or_equal" | "before";
6154
6154
  value?: string | number | boolean | (string | number)[] | null | undefined;
6155
6155
  }[] | undefined;
6156
6156
  description?: string | undefined;
@@ -6309,7 +6309,7 @@ declare const SysApprovalApprover: Omit<{
6309
6309
  view?: string | undefined;
6310
6310
  filter?: {
6311
6311
  field: string;
6312
- operator: string;
6312
+ operator: "in" | "contains" | "after" | "starts_with" | "ends_with" | "not_in" | "not_contains" | "between" | "is_null" | "is_not_null" | "is_empty" | "is_not_empty" | "equals" | "not_equals" | "greater_than" | "less_than" | "greater_than_or_equal" | "less_than_or_equal" | "before";
6313
6313
  value?: string | number | boolean | (string | number)[] | null | undefined;
6314
6314
  }[] | undefined;
6315
6315
  order?: number | undefined;
@@ -7667,7 +7667,7 @@ declare const SysApprovalDelegation: Omit<{
7667
7667
  }[] | undefined;
7668
7668
  filter?: {
7669
7669
  field: string;
7670
- operator: string;
7670
+ operator: "in" | "contains" | "after" | "starts_with" | "ends_with" | "not_in" | "not_contains" | "between" | "is_null" | "is_not_null" | "is_empty" | "is_not_empty" | "equals" | "not_equals" | "greater_than" | "less_than" | "greater_than_or_equal" | "less_than_or_equal" | "before";
7671
7671
  value?: string | number | boolean | (string | number)[] | null | undefined;
7672
7672
  }[] | undefined;
7673
7673
  description?: string | undefined;
@@ -7826,7 +7826,7 @@ declare const SysApprovalDelegation: Omit<{
7826
7826
  view?: string | undefined;
7827
7827
  filter?: {
7828
7828
  field: string;
7829
- operator: string;
7829
+ operator: "in" | "contains" | "after" | "starts_with" | "ends_with" | "not_in" | "not_contains" | "between" | "is_null" | "is_not_null" | "is_empty" | "is_not_empty" | "equals" | "not_equals" | "greater_than" | "less_than" | "greater_than_or_equal" | "less_than_or_equal" | "before";
7830
7830
  value?: string | number | boolean | (string | number)[] | null | undefined;
7831
7831
  }[] | undefined;
7832
7832
  order?: number | undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@objectstack/plugin-approvals",
3
- "version": "16.0.0-rc.1",
3
+ "version": "16.1.0",
4
4
  "license": "Apache-2.0",
5
5
  "description": "Multi-step approval engine for ObjectStack — sys_approval_process + sys_approval_request + sys_approval_action + IApprovalService.",
6
6
  "main": "dist/index.js",
@@ -13,17 +13,17 @@
13
13
  }
14
14
  },
15
15
  "dependencies": {
16
- "@objectstack/core": "16.0.0-rc.1",
17
- "@objectstack/formula": "16.0.0-rc.1",
18
- "@objectstack/metadata-core": "16.0.0-rc.1",
19
- "@objectstack/platform-objects": "16.0.0-rc.1",
20
- "@objectstack/spec": "16.0.0-rc.1"
16
+ "@objectstack/core": "16.1.0",
17
+ "@objectstack/formula": "16.1.0",
18
+ "@objectstack/metadata-core": "16.1.0",
19
+ "@objectstack/platform-objects": "16.1.0",
20
+ "@objectstack/spec": "16.1.0"
21
21
  },
22
22
  "devDependencies": {
23
23
  "@types/node": "^26.1.1",
24
24
  "typescript": "^6.0.3",
25
25
  "vitest": "^4.1.10",
26
- "@objectstack/service-automation": "16.0.0-rc.1"
26
+ "@objectstack/service-automation": "16.1.0"
27
27
  },
28
28
  "keywords": [
29
29
  "objectstack",