@almadar/std 16.190.0 → 16.192.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.
Files changed (107) hide show
  1. package/behaviors/lolo/infra/atoms/std-approval-gate.lolo +184 -18
  2. package/behaviors/lolo/infra/atoms/std-status-lifecycle.lolo +16 -3
  3. package/behaviors/lolo/ui/core/atoms/std-billable-hour.lolo +1 -0
  4. package/behaviors/lolo/ui/core/atoms/std-browse.lolo +3 -0
  5. package/behaviors/lolo/ui/core/atoms/std-image-upload-multi.lolo +37 -4
  6. package/behaviors/lolo/ui/core/atoms/std-modal.lolo +20 -6
  7. package/behaviors/lolo/ui/core/atoms/std-record-detail.lolo +40 -3
  8. package/behaviors/lolo/ui/core/atoms/std-tag-taxonomy.lolo +176 -4
  9. package/behaviors/lolo/ui/core/atoms/std-version-history.lolo +3 -1
  10. package/behaviors/lolo/ui/core/molecules/ui-calendar-grid.lolo +25 -1
  11. package/behaviors/lolo/ui/core/molecules/ui-data-grid.lolo +37 -1
  12. package/behaviors/lolo/ui/core/molecules/ui-data-list.lolo +46 -1
  13. package/behaviors/lolo/ui/core/molecules/ui-document-details.lolo +30 -2
  14. package/behaviors/lolo/ui/core/molecules/ui-document-panel.lolo +14 -29
  15. package/behaviors/lolo/ui/core/molecules/ui-positioned-canvas.lolo +19 -1
  16. package/behaviors/lolo/ui/core/molecules/ui-reply-tree.lolo +21 -1
  17. package/behaviors/lolo/ui/core/molecules/ui-sortable-list.lolo +15 -1
  18. package/behaviors/lolo/ui/core/molecules/ui-table-view.lolo +36 -1
  19. package/behaviors/lolo/ui/core/organisms/ui-detail-panel.lolo +41 -1
  20. package/behaviors/lolo/ui/core/organisms/ui-entity-cards.lolo +34 -1
  21. package/behaviors/lolo/ui/core/organisms/ui-entity-list.lolo +30 -1
  22. package/behaviors/lolo/ui/core/organisms/ui-entity-table.lolo +36 -1
  23. package/behaviors/lolo/ui/core/organisms/ui-form-section.lolo +39 -1
  24. package/behaviors/lolo/ui/core/organisms/ui-form.lolo +39 -1
  25. package/behaviors/lolo/ui/core/organisms/ui-master-detail.lolo +24 -1
  26. package/behaviors/lolo/ui/core/organisms/ui-media-gallery.lolo +30 -1
  27. package/behaviors/lolo/ui/core/organisms/ui-stat-card.lolo +37 -1
  28. package/behaviors/lolo/ui/core/organisms/ui-timeline.lolo +18 -1
  29. package/behaviors/lolo/ui/core/templates/ui-counter-template.lolo +21 -1
  30. package/behaviors/lolo/ui/core/templates/ui-generic-app-template.lolo +16 -1
  31. package/behaviors/lolo/ui/game/atoms/std-platformer-body.lolo +7 -2
  32. package/behaviors/lolo/ui/marketing/organisms/ui-book-chapter-view.lolo +12 -1
  33. package/behaviors/lolo/ui/marketing/organisms/ui-book-table-of-contents.lolo +13 -1
  34. package/behaviors/lolo/ui/marketing/organisms/ui-book-viewer.lolo +23 -1
  35. package/behaviors/lolo/ui/marketing/organisms/ui-case-study-organism.lolo +23 -1
  36. package/behaviors/lolo/ui/marketing/organisms/ui-feature-grid-organism.lolo +24 -1
  37. package/behaviors/lolo/ui/marketing/organisms/ui-hero-organism.lolo +22 -1
  38. package/behaviors/lolo/ui/marketing/organisms/ui-pricing-organism.lolo +23 -1
  39. package/behaviors/lolo/ui/marketing/organisms/ui-showcase-organism.lolo +24 -1
  40. package/behaviors/lolo/ui/marketing/organisms/ui-stats-organism.lolo +22 -1
  41. package/behaviors/lolo/ui/marketing/organisms/ui-step-flow-organism.lolo +25 -1
  42. package/behaviors/lolo/ui/marketing/organisms/ui-team-organism.lolo +23 -1
  43. package/behaviors/lolo/ui/marketing/templates/ui-about-page-template.lolo +11 -1
  44. package/behaviors/lolo/ui/marketing/templates/ui-feature-detail-page-template.lolo +11 -1
  45. package/behaviors/lolo/ui/marketing/templates/ui-landing-page-template.lolo +13 -1
  46. package/behaviors/lolo/ui/marketing/templates/ui-pricing-page-template.lolo +11 -1
  47. package/behaviors/registry/infra/atoms/std-approval-gate.orb +717 -45
  48. package/behaviors/registry/infra/atoms/std-status-lifecycle.orb +85 -10
  49. package/behaviors/registry/ui/core/atoms/std-billable-hour.orb +5 -2
  50. package/behaviors/registry/ui/core/atoms/std-browse.orb +12 -0
  51. package/behaviors/registry/ui/core/atoms/std-image-upload-multi.orb +129 -7
  52. package/behaviors/registry/ui/core/atoms/std-modal.orb +95 -3
  53. package/behaviors/registry/ui/core/atoms/std-record-detail.orb +319 -3
  54. package/behaviors/registry/ui/core/atoms/std-tag-taxonomy.orb +539 -1
  55. package/behaviors/registry/ui/core/atoms/std-version-history.orb +5 -1
  56. package/behaviors/registry/ui/core/molecules/ui-calendar-grid.orb +43 -0
  57. package/behaviors/registry/ui/core/molecules/ui-data-grid.orb +55 -0
  58. package/behaviors/registry/ui/core/molecules/ui-data-list.orb +64 -0
  59. package/behaviors/registry/ui/core/molecules/ui-document-details.orb +106 -1
  60. package/behaviors/registry/ui/core/molecules/ui-document-panel.orb +18 -80
  61. package/behaviors/registry/ui/core/molecules/ui-positioned-canvas.orb +37 -0
  62. package/behaviors/registry/ui/core/molecules/ui-reply-tree.orb +39 -0
  63. package/behaviors/registry/ui/core/molecules/ui-sortable-list.orb +45 -0
  64. package/behaviors/registry/ui/core/molecules/ui-table-view.orb +54 -0
  65. package/behaviors/registry/ui/core/organisms/ui-detail-panel.orb +59 -0
  66. package/behaviors/registry/ui/core/organisms/ui-entity-cards.orb +52 -0
  67. package/behaviors/registry/ui/core/organisms/ui-entity-list.orb +48 -0
  68. package/behaviors/registry/ui/core/organisms/ui-entity-table.orb +54 -0
  69. package/behaviors/registry/ui/core/organisms/ui-form-section.orb +57 -0
  70. package/behaviors/registry/ui/core/organisms/ui-form.orb +57 -0
  71. package/behaviors/registry/ui/core/organisms/ui-master-detail.orb +42 -0
  72. package/behaviors/registry/ui/core/organisms/ui-media-gallery.orb +48 -0
  73. package/behaviors/registry/ui/core/organisms/ui-stat-card.orb +55 -0
  74. package/behaviors/registry/ui/core/organisms/ui-timeline.orb +36 -0
  75. package/behaviors/registry/ui/core/templates/ui-counter-template.orb +39 -0
  76. package/behaviors/registry/ui/core/templates/ui-generic-app-template.orb +34 -0
  77. package/behaviors/registry/ui/game/atoms/std-platformer-body.orb +543 -496
  78. package/behaviors/registry/ui/marketing/organisms/ui-book-chapter-view.orb +30 -0
  79. package/behaviors/registry/ui/marketing/organisms/ui-book-table-of-contents.orb +31 -0
  80. package/behaviors/registry/ui/marketing/organisms/ui-book-viewer.orb +41 -0
  81. package/behaviors/registry/ui/marketing/organisms/ui-case-study-organism.orb +41 -0
  82. package/behaviors/registry/ui/marketing/organisms/ui-feature-grid-organism.orb +42 -0
  83. package/behaviors/registry/ui/marketing/organisms/ui-hero-organism.orb +40 -0
  84. package/behaviors/registry/ui/marketing/organisms/ui-pricing-organism.orb +41 -0
  85. package/behaviors/registry/ui/marketing/organisms/ui-showcase-organism.orb +42 -0
  86. package/behaviors/registry/ui/marketing/organisms/ui-stats-organism.orb +40 -0
  87. package/behaviors/registry/ui/marketing/organisms/ui-step-flow-organism.orb +43 -0
  88. package/behaviors/registry/ui/marketing/organisms/ui-team-organism.orb +41 -0
  89. package/behaviors/registry/ui/marketing/templates/ui-about-page-template.orb +29 -0
  90. package/behaviors/registry/ui/marketing/templates/ui-feature-detail-page-template.orb +29 -0
  91. package/behaviors/registry/ui/marketing/templates/ui-landing-page-template.orb +31 -0
  92. package/behaviors/registry/ui/marketing/templates/ui-pricing-page-template.orb +29 -0
  93. package/dist/behaviors/exports-reader.js +2651 -50
  94. package/dist/behaviors/functions/index.d.ts +138 -19
  95. package/dist/behaviors/functions/index.js +2650 -51
  96. package/dist/behaviors/index.d.ts +1 -1
  97. package/dist/behaviors/index.js +2652 -51
  98. package/dist/behaviors/query.js +2651 -50
  99. package/dist/behaviors-embeddings.hash.json +3 -3
  100. package/dist/behaviors-embeddings.json +961 -929
  101. package/dist/behaviors-registry.json +106 -58
  102. package/dist/index.d.ts +1 -1
  103. package/dist/index.js +2652 -51
  104. package/dist/knob-embeddings.hash.json +3 -3
  105. package/dist/knob-embeddings.json +1 -1
  106. package/dist/registry/factory-signatures.json +1 -1
  107. package/package.json +3 -3
@@ -1,5 +1,5 @@
1
1
  {
2
- "description": "std-approval-gate — generic approval gate / approver workflow. Use when a user voices that an action must be reviewed, approved, signed off, or authorized by a privileged role before it proceeds (admin approval, supervisor sign-off, manager approval, gatekeeper review, editor approval, senior editor approval, reviewer approval, publishing approval, draft approval, content review, submit drafts then editors review and approve or reject, needs approval before going live, requires sign-off before publish). Persists ApprovalRequest rows + surfaces them in a review queue with Approve / Deny / Reject actions, optionally requiring a written rejection reason or feedback comment. On approval emits ApprovalGranted; on denial emits ApprovalDenied. Compose onto any orbital whose action you want to gate: the target orbital emits an external event, an ApprovalRequest row is created, and downstream effects wait on ApprovalGranted. Differs from std-mod-queue, which is content-moderation-specific.",
2
+ "description": "std-approval-gate — generic approval gate / approver workflow. Use when a user voices that an action must be reviewed, approved, signed off, or authorized by a privileged role before it proceeds (admin approval, supervisor sign-off, manager approval, gatekeeper review, editor approval, senior editor approval, reviewer approval, publishing approval, draft approval, content review, submit drafts then editors review and approve or reject, needs approval before going live, requires sign-off before publish). Persists ApprovalRequest rows + surfaces the PENDING ones in a review queue showing what is being approved and who asked, with Approve / Deny actions — Deny captures a written reason. approverRoles is ENFORCED by the review transitions themselves: an APPROVE/DENY from a viewer whose role is not listed does not fire. On approval emits ApprovalGranted; on denial emits ApprovalDenied (with the reason). Hosts that replay the gated action MUST route a failed replay back via APPROVAL_REPLAY_FAILED so the request reopens instead of being silently consumed. Compose onto any orbital whose action you want to gate: the target orbital emits an external event, an ApprovalRequest row is created (stamp subjectLabel/subjectId/requestedBy so reviewers see what they are judging), and downstream effects wait on ApprovalGranted. Differs from std-mod-queue, which is content-moderation-specific.",
3
3
  "ledger": {
4
4
  "entries": {
5
5
  "ent_01KXG04EYQFWN6TM97JNWHHSF4": {
@@ -109,6 +109,42 @@
109
109
  "parent": "trt_01KXG04EYQYT20ZWYKAD2EJAHM",
110
110
  "renames": []
111
111
  },
112
+ "evt_01M169J81G3QNKWFZEEWM8N90Z": {
113
+ "bakedName": "APPROVAL_REPLAY_FAILED",
114
+ "curName": "APPROVAL_REPLAY_FAILED",
115
+ "id": "evt_01M169J81G3QNKWFZEEWM8N90Z",
116
+ "kind": "event",
117
+ "owner": "workspace",
118
+ "parent": "trt_01KXG04EYQYT20ZWYKAD2EJAHM",
119
+ "renames": []
120
+ },
121
+ "evt_01M169J81G7ZGXNXN8MZSP7K88": {
122
+ "bakedName": "OPEN_SUBJECT",
123
+ "curName": "OPEN_SUBJECT",
124
+ "id": "evt_01M169J81G7ZGXNXN8MZSP7K88",
125
+ "kind": "event",
126
+ "owner": "workspace",
127
+ "parent": "trt_01KXG04EYQYT20ZWYKAD2EJAHM",
128
+ "renames": []
129
+ },
130
+ "evt_01M169J81GX0QRNWDXQE75V3E8": {
131
+ "bakedName": "CANCEL_DENY",
132
+ "curName": "CANCEL_DENY",
133
+ "id": "evt_01M169J81GX0QRNWDXQE75V3E8",
134
+ "kind": "event",
135
+ "owner": "workspace",
136
+ "parent": "trt_01KXG04EYQYT20ZWYKAD2EJAHM",
137
+ "renames": []
138
+ },
139
+ "evt_01M169J81GZWG6Q9MYCQT7F92E": {
140
+ "bakedName": "CONFIRM_DENY",
141
+ "curName": "CONFIRM_DENY",
142
+ "id": "evt_01M169J81GZWG6Q9MYCQT7F92E",
143
+ "kind": "event",
144
+ "owner": "workspace",
145
+ "parent": "trt_01KXG04EYQYT20ZWYKAD2EJAHM",
146
+ "renames": []
147
+ },
112
148
  "orb_01KXG04EYQYD1ZSZEZ5TG89KZ6": {
113
149
  "bakedName": "ApprovalGateOrbital",
114
150
  "curName": "ApprovalGateOrbital",
@@ -196,6 +232,22 @@
196
232
  "kind": "trait",
197
233
  "owner": "workspace",
198
234
  "renames": []
235
+ },
236
+ "trt_01M169J81G3JQKD0N73BVPJPS4": {
237
+ "bakedName": "DenyReasonTitle",
238
+ "curName": "DenyReasonTitle",
239
+ "id": "trt_01M169J81G3JQKD0N73BVPJPS4",
240
+ "kind": "trait",
241
+ "owner": "workspace",
242
+ "renames": []
243
+ },
244
+ "trt_01M169J81G73K4NB9HRPVZA8HX": {
245
+ "bakedName": "DenyReasonHint",
246
+ "curName": "DenyReasonHint",
247
+ "id": "trt_01M169J81G73K4NB9HRPVZA8HX",
248
+ "kind": "trait",
249
+ "owner": "workspace",
250
+ "renames": []
199
251
  }
200
252
  },
201
253
  "schemaVersion": 1
@@ -204,6 +256,9 @@
204
256
  "orbitals": [
205
257
  {
206
258
  "entity": {
259
+ "access_waivers": {
260
+ "read": "Shared review surface: submitters watch their requests, approvers work the queue; decision authority is enforced at the transitions, not by hiding rows."
261
+ },
207
262
  "collection": "approval_requests",
208
263
  "fields": [
209
264
  {
@@ -218,6 +273,34 @@
218
273
  "synonyms": "trigger, event, source",
219
274
  "type": "string"
220
275
  },
276
+ {
277
+ "default": "",
278
+ "description": "Human title of the thing being approved (the article's headline, the page's title) — what the reviewer sees in the queue.",
279
+ "name": "subjectLabel",
280
+ "synonyms": "title, subject, what is being approved",
281
+ "type": "string"
282
+ },
283
+ {
284
+ "default": "",
285
+ "description": "Id of the record being approved, for a queue row's View click-through to the subject's own surface.",
286
+ "name": "subjectId",
287
+ "synonyms": "record id, target id, article id, page id",
288
+ "type": "string"
289
+ },
290
+ {
291
+ "default": "",
292
+ "description": "User id of the submitter.",
293
+ "name": "requestedBy",
294
+ "synonyms": "submitter, author, requester id",
295
+ "type": "string"
296
+ },
297
+ {
298
+ "default": "",
299
+ "description": "Display name of the submitter shown in the queue.",
300
+ "name": "requestedByName",
301
+ "synonyms": "submitter name, requester, who asked",
302
+ "type": "string"
303
+ },
221
304
  {
222
305
  "default": "pending",
223
306
  "description": "Current state of the approval process.",
@@ -261,9 +344,9 @@
261
344
  },
262
345
  {
263
346
  "default": "",
264
- "description": "Free-form text providing additional context or details.",
347
+ "description": "The reviewer's written reason, captured by the deny step.",
265
348
  "name": "notes",
266
- "synonyms": "comments, remarks, explanation, details",
349
+ "synonyms": "comments, remarks, explanation, reason, details",
267
350
  "type": "string"
268
351
  },
269
352
  {
@@ -299,8 +382,7 @@
299
382
  "linkedEntity": "ApprovalRequest",
300
383
  "linkedEntityId": "ent_01KXG04EYQFWN6TM97JNWHHSF4",
301
384
  "name": "LoadingSpinner",
302
- "ref": "Spinner.traits.SpinnerRender",
303
- "refId": "trt_01KXG04KQTE55FSTDE4V4XKESN"
385
+ "ref": "Spinner.traits.SpinnerRender"
304
386
  },
305
387
  {
306
388
  "config": {
@@ -313,8 +395,7 @@
313
395
  "linkedEntity": "ApprovalRequest",
314
396
  "linkedEntityId": "ent_01KXG04EYQFWN6TM97JNWHHSF4",
315
397
  "name": "ErrorSpinner",
316
- "ref": "Spinner.traits.SpinnerRender",
317
- "refId": "trt_01KXG04KQTE55FSTDE4V4XKESN"
398
+ "ref": "Spinner.traits.SpinnerRender"
318
399
  },
319
400
  {
320
401
  "config": {
@@ -335,8 +416,7 @@
335
416
  "linkedEntity": "ApprovalRequest",
336
417
  "linkedEntityId": "ent_01KXG04EYQFWN6TM97JNWHHSF4",
337
418
  "name": "LoadingText",
338
- "ref": "Typography.traits.TypographyRender",
339
- "refId": "trt_01KXG04MN4YEZRM29MVNFTYM98"
419
+ "ref": "Typography.traits.TypographyRender"
340
420
  },
341
421
  {
342
422
  "config": {
@@ -349,8 +429,7 @@
349
429
  "linkedEntity": "ApprovalRequest",
350
430
  "linkedEntityId": "ent_01KXG04EYQFWN6TM97JNWHHSF4",
351
431
  "name": "ShieldCheckIcon",
352
- "ref": "Icon.traits.IconRender",
353
- "refId": "trt_01KXG04K2JE4GSQVWEWHAHDE2A"
432
+ "ref": "Icon.traits.IconRender"
354
433
  },
355
434
  {
356
435
  "config": {
@@ -367,8 +446,45 @@
367
446
  "linkedEntity": "ApprovalRequest",
368
447
  "linkedEntityId": "ent_01KXG04EYQFWN6TM97JNWHHSF4",
369
448
  "name": "ApprovalQueueTitle",
370
- "ref": "Typography.traits.TypographyRender",
371
- "refId": "trt_01KXG04MN4YEZRM29MVNFTYM98"
449
+ "ref": "Typography.traits.TypographyRender"
450
+ },
451
+ {
452
+ "config": {
453
+ "content": {
454
+ "default": "Deny request",
455
+ "type": "unknown"
456
+ },
457
+ "variant": {
458
+ "default": "h3",
459
+ "type": "unknown"
460
+ }
461
+ },
462
+ "id": "trt_01M169J81G3JQKD0N73BVPJPS4",
463
+ "linkedEntity": "ApprovalRequest",
464
+ "linkedEntityId": "ent_01KXG04EYQFWN6TM97JNWHHSF4",
465
+ "name": "DenyReasonTitle",
466
+ "ref": "Typography.traits.TypographyRender"
467
+ },
468
+ {
469
+ "config": {
470
+ "color": {
471
+ "default": "muted",
472
+ "type": "unknown"
473
+ },
474
+ "content": {
475
+ "default": "Tell the submitter why — the reason is recorded on the request.",
476
+ "type": "unknown"
477
+ },
478
+ "variant": {
479
+ "default": "caption",
480
+ "type": "unknown"
481
+ }
482
+ },
483
+ "id": "trt_01M169J81G73K4NB9HRPVZA8HX",
484
+ "linkedEntity": "ApprovalRequest",
485
+ "linkedEntityId": "ent_01KXG04EYQFWN6TM97JNWHHSF4",
486
+ "name": "DenyReasonHint",
487
+ "ref": "Typography.traits.TypographyRender"
372
488
  },
373
489
  {
374
490
  "config": {
@@ -393,16 +509,14 @@
393
509
  "linkedEntity": "ApprovalRequest",
394
510
  "linkedEntityId": "ent_01KXG04EYQFWN6TM97JNWHHSF4",
395
511
  "name": "CloseButton",
396
- "ref": "Button.traits.ButtonRender",
397
- "refId": "trt_01KXG04JBQPWD7RW8X33NXPXG9"
512
+ "ref": "Button.traits.ButtonRender"
398
513
  },
399
514
  {
400
515
  "id": "trt_01KY21K6QC0P4NS69R6ATZPC18",
401
516
  "linkedEntity": "ApprovalRequest",
402
517
  "linkedEntityId": "ent_01KXG04EYQFWN6TM97JNWHHSF4",
403
518
  "name": "ApprovalDivider",
404
- "ref": "Divider.traits.DividerRender",
405
- "refId": "trt_01KXG04JVTJZ479S2KPR7HD1KB"
519
+ "ref": "Divider.traits.DividerRender"
406
520
  },
407
521
  {
408
522
  "config": {
@@ -419,8 +533,7 @@
419
533
  "linkedEntity": "ApprovalRequest",
420
534
  "linkedEntityId": "ent_01KXG04EYQFWN6TM97JNWHHSF4",
421
535
  "name": "ErrorAlert",
422
- "ref": "Alert.traits.AlertRender",
423
- "refId": "trt_01KXG04MT125AX1BGFS3ZNGX67"
536
+ "ref": "Alert.traits.AlertRender"
424
537
  },
425
538
  {
426
539
  "capabilities": [
@@ -430,7 +543,7 @@
430
543
  "config": {
431
544
  "approverRoles": {
432
545
  "default": [],
433
- "description": "Roles eligible to approve. The host application enforces role-gating on the page.",
546
+ "description": "Roles eligible to decide. ENFORCED by the APPROVE/DENY transition guards: a viewer whose @user.role is not listed cannot fire a decision, from the button or from the bus. Empty = every signed-in viewer may decide (ungated).",
434
547
  "items": {
435
548
  "type": "string"
436
549
  },
@@ -535,6 +648,22 @@
535
648
  "name": "gatedEvent",
536
649
  "type": "string"
537
650
  },
651
+ {
652
+ "name": "subjectLabel",
653
+ "type": "string"
654
+ },
655
+ {
656
+ "name": "subjectId",
657
+ "type": "string"
658
+ },
659
+ {
660
+ "name": "requestedBy",
661
+ "type": "string"
662
+ },
663
+ {
664
+ "name": "requestedByName",
665
+ "type": "string"
666
+ },
538
667
  {
539
668
  "name": "status",
540
669
  "type": "string"
@@ -571,7 +700,7 @@
571
700
  "tier": "domain"
572
701
  },
573
702
  {
574
- "description": "Signals that an approval request has been denied.",
703
+ "description": "Opens the deny step for a request; the decision commits with the written reason.",
575
704
  "event": "DENY",
576
705
  "eventId": "evt_01KXG04EZ0ZFMGKFBB34B7PMEE",
577
706
  "payloadSchema": [
@@ -592,6 +721,22 @@
592
721
  "name": "gatedEvent",
593
722
  "type": "string"
594
723
  },
724
+ {
725
+ "name": "subjectLabel",
726
+ "type": "string"
727
+ },
728
+ {
729
+ "name": "subjectId",
730
+ "type": "string"
731
+ },
732
+ {
733
+ "name": "requestedBy",
734
+ "type": "string"
735
+ },
736
+ {
737
+ "name": "requestedByName",
738
+ "type": "string"
739
+ },
595
740
  {
596
741
  "name": "status",
597
742
  "type": "string"
@@ -627,6 +772,60 @@
627
772
  "synonyms": "reject, decline",
628
773
  "tier": "domain"
629
774
  },
775
+ {
776
+ "description": "A reviewer clicked View on a queue row. Hosts route subjectId to the subject record's own surface so the reviewer can read what they are approving. Scalars only — the row stays in the queue.",
777
+ "event": "OPEN_SUBJECT",
778
+ "eventId": "evt_01M169J81G7ZGXNXN8MZSP7K88",
779
+ "payloadSchema": [
780
+ {
781
+ "name": "id",
782
+ "required": true,
783
+ "type": "string"
784
+ },
785
+ {
786
+ "name": "subjectId",
787
+ "type": "string"
788
+ },
789
+ {
790
+ "name": "subjectLabel",
791
+ "type": "string"
792
+ }
793
+ ],
794
+ "scope": "external",
795
+ "synonyms": "view subject, open record, inspect request, see the article",
796
+ "tier": "domain"
797
+ },
798
+ {
799
+ "description": "The deny form committed; data carries the request id + the written reason.",
800
+ "event": "CONFIRM_DENY",
801
+ "eventId": "evt_01M169J81GZWG6Q9MYCQT7F92E",
802
+ "payloadSchema": [
803
+ {
804
+ "name": "data",
805
+ "properties": [
806
+ {
807
+ "name": "id",
808
+ "required": true,
809
+ "type": "string"
810
+ },
811
+ {
812
+ "name": "notes",
813
+ "type": "string"
814
+ }
815
+ ],
816
+ "type": "object"
817
+ }
818
+ ],
819
+ "synonyms": "submit denial, confirm rejection",
820
+ "tier": "internal"
821
+ },
822
+ {
823
+ "description": "The deny form was dismissed without committing; the queue repaints.",
824
+ "event": "CANCEL_DENY",
825
+ "eventId": "evt_01M169J81GX0QRNWDXQE75V3E8",
826
+ "synonyms": "cancel denial, back to queue",
827
+ "tier": "internal"
828
+ },
630
829
  {
631
830
  "description": "Dismisses the review queue overlay.",
632
831
  "event": "CLOSE",
@@ -635,7 +834,7 @@
635
834
  "tier": "domain"
636
835
  },
637
836
  {
638
- "description": "Signals that an approval process has been successfully completed; carries the held payload for the downstream listener to replay.",
837
+ "description": "Signals that an approval process has been successfully completed; carries the held payload for the downstream listener to replay. Contract: if the replay fails (access denial, write failure), the host MUST emit APPROVAL_REPLAY_FAILED back so the request reopens.",
639
838
  "event": "ApprovalGranted",
640
839
  "eventId": "evt_01KXG04EZ09QDH2K4ZAGX0JZDQ",
641
840
  "payloadSchema": [
@@ -653,13 +852,17 @@
653
852
  "tier": "domain"
654
853
  },
655
854
  {
656
- "description": "Indicates an approval request has been denied.",
855
+ "description": "Indicates an approval request has been denied, with the reviewer's written reason.",
657
856
  "event": "ApprovalDenied",
658
857
  "eventId": "evt_01KXG04EZ0JF1Y4KS5KF3R9X8X",
659
858
  "payloadSchema": [
660
859
  {
661
860
  "name": "requestId",
662
861
  "type": "string"
862
+ },
863
+ {
864
+ "name": "reason",
865
+ "type": "string"
663
866
  }
664
867
  ],
665
868
  "scope": "external",
@@ -713,6 +916,22 @@
713
916
  "name": "gatedEvent",
714
917
  "type": "string"
715
918
  },
919
+ {
920
+ "name": "subjectLabel",
921
+ "type": "string"
922
+ },
923
+ {
924
+ "name": "subjectId",
925
+ "type": "string"
926
+ },
927
+ {
928
+ "name": "requestedBy",
929
+ "type": "string"
930
+ },
931
+ {
932
+ "name": "requestedByName",
933
+ "type": "string"
934
+ },
716
935
  {
717
936
  "name": "status",
718
937
  "type": "string"
@@ -768,8 +987,11 @@
768
987
  ],
769
988
  "entityContract": {
770
989
  "provides": [
990
+ "decidedAt",
991
+ "notes",
771
992
  "reviewer",
772
- "status"
993
+ "status",
994
+ "subjectLabel"
773
995
  ],
774
996
  "requires": []
775
997
  },
@@ -834,6 +1056,25 @@
834
1056
  "synonyms": "load error, failed load, request failure",
835
1057
  "tier": "internal"
836
1058
  },
1059
+ {
1060
+ "description": "The host could not apply the granted action (access denial, failed write). The request reopens as pending so a decision is never silently lost.",
1061
+ "id": "evt_01M169J81G3QNKWFZEEWM8N90Z",
1062
+ "key": "APPROVAL_REPLAY_FAILED",
1063
+ "name": "Approval Replay Failed",
1064
+ "payloadSchema": [
1065
+ {
1066
+ "name": "requestId",
1067
+ "required": true,
1068
+ "type": "string"
1069
+ },
1070
+ {
1071
+ "name": "error",
1072
+ "type": "string"
1073
+ }
1074
+ ],
1075
+ "synonyms": "replay failed, apply failed, approval rollback",
1076
+ "tier": "domain"
1077
+ },
837
1078
  {
838
1079
  "description": "Summons the review queue (host nav/affordance requests it).",
839
1080
  "id": "evt_01KXG04EZ05HP9JSWYNV5XV2QW",
@@ -870,7 +1111,7 @@
870
1111
  "tier": "domain"
871
1112
  },
872
1113
  {
873
- "description": "Signals that an approval request has been denied.",
1114
+ "description": "Opens the deny step for a request; the decision commits with the written reason.",
874
1115
  "id": "evt_01KXG04EZ0ZFMGKFBB34B7PMEE",
875
1116
  "key": "DENY",
876
1117
  "name": "Deny",
@@ -888,6 +1129,29 @@
888
1129
  "synonyms": "reject, decline",
889
1130
  "tier": "domain"
890
1131
  },
1132
+ {
1133
+ "description": "A reviewer clicked View on a queue row. Hosts route subjectId to the subject record's own surface so the reviewer can read what they are approving. Scalars only — the row stays in the queue.",
1134
+ "id": "evt_01M169J81G7ZGXNXN8MZSP7K88",
1135
+ "key": "OPEN_SUBJECT",
1136
+ "name": "Open Subject",
1137
+ "payloadSchema": [
1138
+ {
1139
+ "name": "id",
1140
+ "required": true,
1141
+ "type": "string"
1142
+ },
1143
+ {
1144
+ "name": "subjectId",
1145
+ "type": "string"
1146
+ },
1147
+ {
1148
+ "name": "subjectLabel",
1149
+ "type": "string"
1150
+ }
1151
+ ],
1152
+ "synonyms": "view subject, open record, inspect request, see the article",
1153
+ "tier": "domain"
1154
+ },
891
1155
  {
892
1156
  "description": "Signals that an approval request has been reviewed.",
893
1157
  "id": "evt_01KXG04EZ0XXBA89NVB97J1NAM",
@@ -921,7 +1185,40 @@
921
1185
  "tier": "internal"
922
1186
  },
923
1187
  {
924
- "description": "Signals that an approval process has been successfully completed; carries the held payload for the downstream listener to replay.",
1188
+ "description": "The deny form committed; data carries the request id + the written reason.",
1189
+ "id": "evt_01M169J81GZWG6Q9MYCQT7F92E",
1190
+ "key": "CONFIRM_DENY",
1191
+ "name": "Confirm Deny",
1192
+ "payloadSchema": [
1193
+ {
1194
+ "name": "data",
1195
+ "properties": [
1196
+ {
1197
+ "name": "id",
1198
+ "required": true,
1199
+ "type": "string"
1200
+ },
1201
+ {
1202
+ "name": "notes",
1203
+ "type": "string"
1204
+ }
1205
+ ],
1206
+ "type": "object"
1207
+ }
1208
+ ],
1209
+ "synonyms": "submit denial, confirm rejection",
1210
+ "tier": "internal"
1211
+ },
1212
+ {
1213
+ "description": "The deny form was dismissed without committing; the queue repaints.",
1214
+ "id": "evt_01M169J81GX0QRNWDXQE75V3E8",
1215
+ "key": "CANCEL_DENY",
1216
+ "name": "Cancel Deny",
1217
+ "synonyms": "cancel denial, back to queue",
1218
+ "tier": "internal"
1219
+ },
1220
+ {
1221
+ "description": "Signals that an approval process has been successfully completed; carries the held payload for the downstream listener to replay. Contract: if the replay fails (access denial, write failure), the host MUST emit APPROVAL_REPLAY_FAILED back so the request reopens.",
925
1222
  "id": "evt_01KXG04EZ09QDH2K4ZAGX0JZDQ",
926
1223
  "key": "ApprovalGranted",
927
1224
  "name": "Approval granted",
@@ -939,7 +1236,7 @@
939
1236
  "tier": "domain"
940
1237
  },
941
1238
  {
942
- "description": "Indicates an approval request has been denied.",
1239
+ "description": "Indicates an approval request has been denied, with the reviewer's written reason.",
943
1240
  "id": "evt_01KXG04EZ0JF1Y4KS5KF3R9X8X",
944
1241
  "key": "ApprovalDenied",
945
1242
  "name": "Approval denied",
@@ -947,6 +1244,10 @@
947
1244
  {
948
1245
  "name": "requestId",
949
1246
  "type": "string"
1247
+ },
1248
+ {
1249
+ "name": "reason",
1250
+ "type": "string"
950
1251
  }
951
1252
  ],
952
1253
  "synonyms": "rejected, declined",
@@ -964,6 +1265,9 @@
964
1265
  {
965
1266
  "name": "reviewing"
966
1267
  },
1268
+ {
1269
+ "name": "denying"
1270
+ },
967
1271
  {
968
1272
  "name": "error"
969
1273
  }
@@ -978,7 +1282,16 @@
978
1282
  "emit": {
979
1283
  "failure": "ApprovalRequestLoadFailed",
980
1284
  "success": "ApprovalRequestLoaded"
981
- }
1285
+ },
1286
+ "filter": [
1287
+ "=",
1288
+ [
1289
+ "object/get",
1290
+ "@entity",
1291
+ "status"
1292
+ ],
1293
+ "pending"
1294
+ ]
982
1295
  }
983
1296
  ]
984
1297
  ],
@@ -999,6 +1312,51 @@
999
1312
  "from": "idle",
1000
1313
  "to": "idle"
1001
1314
  },
1315
+ {
1316
+ "effects": [
1317
+ [
1318
+ "set",
1319
+ "@entity.id",
1320
+ "@payload.requestId"
1321
+ ],
1322
+ [
1323
+ "set",
1324
+ "@entity.status",
1325
+ "pending"
1326
+ ],
1327
+ [
1328
+ "set",
1329
+ "@entity.reviewer",
1330
+ ""
1331
+ ],
1332
+ [
1333
+ "set",
1334
+ "@entity.decidedAt",
1335
+ 0.0
1336
+ ],
1337
+ [
1338
+ "persist",
1339
+ "update",
1340
+ "ApprovalRequest",
1341
+ "@entity",
1342
+ {
1343
+ "emit": {
1344
+ "failure": "ApprovalRequestReviewFailed",
1345
+ "success": "ApprovalRequestReviewed"
1346
+ }
1347
+ }
1348
+ ],
1349
+ [
1350
+ "notify",
1351
+ "Approval could not be applied — the request was reopened.",
1352
+ "error"
1353
+ ]
1354
+ ],
1355
+ "event": "APPROVAL_REPLAY_FAILED",
1356
+ "eventId": "evt_01M169J81G3QNKWFZEEWM8N90Z",
1357
+ "from": "idle",
1358
+ "to": "idle"
1359
+ },
1002
1360
  {
1003
1361
  "effects": [
1004
1362
  [
@@ -1008,7 +1366,16 @@
1008
1366
  "emit": {
1009
1367
  "failure": "ApprovalRequestLoadFailed",
1010
1368
  "success": "ApprovalRequestLoaded"
1011
- }
1369
+ },
1370
+ "filter": [
1371
+ "=",
1372
+ [
1373
+ "object/get",
1374
+ "@entity",
1375
+ "status"
1376
+ ],
1377
+ "pending"
1378
+ ]
1012
1379
  }
1013
1380
  ],
1014
1381
  [
@@ -1065,24 +1432,35 @@
1065
1432
  "cols": 1.0,
1066
1433
  "entity": "@payload.data",
1067
1434
  "fields": [
1435
+ {
1436
+ "label": "What",
1437
+ "name": "subjectLabel",
1438
+ "variant": "h4"
1439
+ },
1068
1440
  {
1069
1441
  "label": "Action",
1070
1442
  "name": "gatedEvent",
1071
1443
  "variant": "badge"
1072
1444
  },
1073
1445
  {
1074
- "label": "Requested",
1075
- "name": "requestedAt",
1446
+ "label": "Requested by",
1447
+ "name": "requestedByName",
1076
1448
  "variant": "caption"
1077
1449
  },
1078
1450
  {
1079
- "label": "Status",
1080
- "name": "status",
1081
- "variant": "badge"
1451
+ "label": "Requested",
1452
+ "name": "requestedAt",
1453
+ "variant": "caption"
1082
1454
  }
1083
1455
  ],
1084
1456
  "gap": "sm",
1085
1457
  "itemActions": [
1458
+ {
1459
+ "event": "OPEN_SUBJECT",
1460
+ "icon": "eye",
1461
+ "label": "View",
1462
+ "variant": "ghost"
1463
+ },
1086
1464
  {
1087
1465
  "event": "APPROVE",
1088
1466
  "icon": "check",
@@ -1159,6 +1537,13 @@
1159
1537
  "@entity.reviewer",
1160
1538
  "@user.id"
1161
1539
  ],
1540
+ [
1541
+ "set",
1542
+ "@entity.decidedAt",
1543
+ [
1544
+ "time/now"
1545
+ ]
1546
+ ],
1162
1547
  [
1163
1548
  "persist",
1164
1549
  "update",
@@ -1183,6 +1568,22 @@
1183
1568
  "event": "APPROVE",
1184
1569
  "eventId": "evt_01KXG04EZ0H0D5WC8FJKBRGBQE",
1185
1570
  "from": "reviewing",
1571
+ "guard": [
1572
+ "or",
1573
+ [
1574
+ "=",
1575
+ [
1576
+ "array/len",
1577
+ "@config.approverRoles"
1578
+ ],
1579
+ 0.0
1580
+ ],
1581
+ [
1582
+ "array/includes",
1583
+ "@config.approverRoles",
1584
+ "@user.role"
1585
+ ]
1586
+ ],
1186
1587
  "to": "reviewing"
1187
1588
  },
1188
1589
  {
@@ -1192,6 +1593,197 @@
1192
1593
  "@entity.id",
1193
1594
  "@payload.id"
1194
1595
  ],
1596
+ [
1597
+ "set",
1598
+ "@entity.subjectLabel",
1599
+ [
1600
+ "str/default",
1601
+ [
1602
+ "object/get",
1603
+ "@payload.row",
1604
+ "subjectLabel"
1605
+ ],
1606
+ ""
1607
+ ]
1608
+ ],
1609
+ [
1610
+ "render-ui",
1611
+ "@config.reviewSlot",
1612
+ {
1613
+ "children": [
1614
+ {
1615
+ "align": "center",
1616
+ "children": [
1617
+ "@trait.DenyReasonTitle",
1618
+ "@trait.CloseButton"
1619
+ ],
1620
+ "direction": "horizontal",
1621
+ "gap": "sm",
1622
+ "justify": "between",
1623
+ "type": "stack"
1624
+ },
1625
+ "@trait.DenyReasonHint",
1626
+ "@trait.ApprovalDivider",
1627
+ {
1628
+ "cancelEvent": "CANCEL_DENY",
1629
+ "entity": {
1630
+ "id": "@entity.id"
1631
+ },
1632
+ "fields": [
1633
+ "notes"
1634
+ ],
1635
+ "mode": "edit",
1636
+ "submitEvent": "CONFIRM_DENY",
1637
+ "type": "form-section"
1638
+ }
1639
+ ],
1640
+ "direction": "vertical",
1641
+ "gap": "md",
1642
+ "type": "stack"
1643
+ }
1644
+ ]
1645
+ ],
1646
+ "event": "DENY",
1647
+ "eventId": "evt_01KXG04EZ0ZFMGKFBB34B7PMEE",
1648
+ "from": "reviewing",
1649
+ "guard": [
1650
+ "or",
1651
+ [
1652
+ "=",
1653
+ [
1654
+ "array/len",
1655
+ "@config.approverRoles"
1656
+ ],
1657
+ 0.0
1658
+ ],
1659
+ [
1660
+ "array/includes",
1661
+ "@config.approverRoles",
1662
+ "@user.role"
1663
+ ]
1664
+ ],
1665
+ "to": "denying"
1666
+ },
1667
+ {
1668
+ "event": "OPEN_SUBJECT",
1669
+ "eventId": "evt_01M169J81G7ZGXNXN8MZSP7K88",
1670
+ "from": "reviewing",
1671
+ "to": "reviewing"
1672
+ },
1673
+ {
1674
+ "effects": [
1675
+ [
1676
+ "fetch",
1677
+ "ApprovalRequest",
1678
+ {
1679
+ "emit": {
1680
+ "failure": "ApprovalRequestLoadFailed",
1681
+ "success": "ApprovalRequestLoaded"
1682
+ },
1683
+ "filter": [
1684
+ "=",
1685
+ [
1686
+ "object/get",
1687
+ "@entity",
1688
+ "status"
1689
+ ],
1690
+ "pending"
1691
+ ]
1692
+ }
1693
+ ]
1694
+ ],
1695
+ "event": "ApprovalRequestReviewed",
1696
+ "eventId": "evt_01KXG04EZ0XXBA89NVB97J1NAM",
1697
+ "from": "reviewing",
1698
+ "to": "loading"
1699
+ },
1700
+ {
1701
+ "effects": [
1702
+ [
1703
+ "render-ui",
1704
+ "@config.reviewSlot",
1705
+ {
1706
+ "children": [
1707
+ "@trait.ErrorAlert"
1708
+ ],
1709
+ "type": "stack"
1710
+ }
1711
+ ]
1712
+ ],
1713
+ "event": "ApprovalRequestReviewFailed",
1714
+ "eventId": "evt_01KXG04EZ0HX0YV7MH4PXFQCM0",
1715
+ "from": "reviewing",
1716
+ "to": "reviewing"
1717
+ },
1718
+ {
1719
+ "effects": [
1720
+ [
1721
+ "set",
1722
+ "@entity.id",
1723
+ "@payload.requestId"
1724
+ ],
1725
+ [
1726
+ "set",
1727
+ "@entity.status",
1728
+ "pending"
1729
+ ],
1730
+ [
1731
+ "set",
1732
+ "@entity.reviewer",
1733
+ ""
1734
+ ],
1735
+ [
1736
+ "set",
1737
+ "@entity.decidedAt",
1738
+ 0.0
1739
+ ],
1740
+ [
1741
+ "persist",
1742
+ "update",
1743
+ "ApprovalRequest",
1744
+ "@entity",
1745
+ {
1746
+ "emit": {
1747
+ "failure": "ApprovalRequestReviewFailed",
1748
+ "success": "ApprovalRequestReviewed"
1749
+ }
1750
+ }
1751
+ ],
1752
+ [
1753
+ "notify",
1754
+ "Approval could not be applied — the request was reopened.",
1755
+ "error"
1756
+ ]
1757
+ ],
1758
+ "event": "APPROVAL_REPLAY_FAILED",
1759
+ "eventId": "evt_01M169J81G3QNKWFZEEWM8N90Z",
1760
+ "from": "reviewing",
1761
+ "to": "reviewing"
1762
+ },
1763
+ {
1764
+ "effects": [
1765
+ [
1766
+ "render-ui",
1767
+ "@config.reviewSlot",
1768
+ null
1769
+ ]
1770
+ ],
1771
+ "event": "CLOSE",
1772
+ "eventId": "evt_01KXG04EZ0MS01J775W2VPESMJ",
1773
+ "from": "reviewing",
1774
+ "to": "idle"
1775
+ },
1776
+ {
1777
+ "effects": [
1778
+ [
1779
+ "set",
1780
+ "@entity.id",
1781
+ [
1782
+ "object/get",
1783
+ "@payload.data",
1784
+ "id"
1785
+ ]
1786
+ ],
1195
1787
  [
1196
1788
  "set",
1197
1789
  "@entity.status",
@@ -1202,6 +1794,26 @@
1202
1794
  "@entity.reviewer",
1203
1795
  "@user.id"
1204
1796
  ],
1797
+ [
1798
+ "set",
1799
+ "@entity.decidedAt",
1800
+ [
1801
+ "time/now"
1802
+ ]
1803
+ ],
1804
+ [
1805
+ "set",
1806
+ "@entity.notes",
1807
+ [
1808
+ "str/default",
1809
+ [
1810
+ "object/get",
1811
+ "@payload.data",
1812
+ "notes"
1813
+ ],
1814
+ ""
1815
+ ]
1816
+ ],
1205
1817
  [
1206
1818
  "persist",
1207
1819
  "update",
@@ -1218,13 +1830,26 @@
1218
1830
  "emit",
1219
1831
  "ApprovalDenied",
1220
1832
  {
1221
- "requestId": "@payload.id"
1833
+ "reason": [
1834
+ "str/default",
1835
+ [
1836
+ "object/get",
1837
+ "@payload.data",
1838
+ "notes"
1839
+ ],
1840
+ ""
1841
+ ],
1842
+ "requestId": [
1843
+ "object/get",
1844
+ "@payload.data",
1845
+ "id"
1846
+ ]
1222
1847
  }
1223
1848
  ]
1224
1849
  ],
1225
- "event": "DENY",
1226
- "eventId": "evt_01KXG04EZ0ZFMGKFBB34B7PMEE",
1227
- "from": "reviewing",
1850
+ "event": "CONFIRM_DENY",
1851
+ "eventId": "evt_01M169J81GZWG6Q9MYCQT7F92E",
1852
+ "from": "denying",
1228
1853
  "to": "reviewing"
1229
1854
  },
1230
1855
  {
@@ -1236,13 +1861,49 @@
1236
1861
  "emit": {
1237
1862
  "failure": "ApprovalRequestLoadFailed",
1238
1863
  "success": "ApprovalRequestLoaded"
1239
- }
1864
+ },
1865
+ "filter": [
1866
+ "=",
1867
+ [
1868
+ "object/get",
1869
+ "@entity",
1870
+ "status"
1871
+ ],
1872
+ "pending"
1873
+ ]
1874
+ }
1875
+ ]
1876
+ ],
1877
+ "event": "CANCEL_DENY",
1878
+ "eventId": "evt_01M169J81GX0QRNWDXQE75V3E8",
1879
+ "from": "denying",
1880
+ "to": "loading"
1881
+ },
1882
+ {
1883
+ "effects": [
1884
+ [
1885
+ "fetch",
1886
+ "ApprovalRequest",
1887
+ {
1888
+ "emit": {
1889
+ "failure": "ApprovalRequestLoadFailed",
1890
+ "success": "ApprovalRequestLoaded"
1891
+ },
1892
+ "filter": [
1893
+ "=",
1894
+ [
1895
+ "object/get",
1896
+ "@entity",
1897
+ "status"
1898
+ ],
1899
+ "pending"
1900
+ ]
1240
1901
  }
1241
1902
  ]
1242
1903
  ],
1243
1904
  "event": "ApprovalRequestReviewed",
1244
1905
  "eventId": "evt_01KXG04EZ0XXBA89NVB97J1NAM",
1245
- "from": "reviewing",
1906
+ "from": "denying",
1246
1907
  "to": "loading"
1247
1908
  },
1248
1909
  {
@@ -1260,8 +1921,8 @@
1260
1921
  ],
1261
1922
  "event": "ApprovalRequestReviewFailed",
1262
1923
  "eventId": "evt_01KXG04EZ0HX0YV7MH4PXFQCM0",
1263
- "from": "reviewing",
1264
- "to": "reviewing"
1924
+ "from": "denying",
1925
+ "to": "denying"
1265
1926
  },
1266
1927
  {
1267
1928
  "effects": [
@@ -1273,7 +1934,7 @@
1273
1934
  ],
1274
1935
  "event": "CLOSE",
1275
1936
  "eventId": "evt_01KXG04EZ0MS01J775W2VPESMJ",
1276
- "from": "reviewing",
1937
+ "from": "denying",
1277
1938
  "to": "idle"
1278
1939
  },
1279
1940
  {
@@ -1285,7 +1946,16 @@
1285
1946
  "emit": {
1286
1947
  "failure": "ApprovalRequestLoadFailed",
1287
1948
  "success": "ApprovalRequestLoaded"
1288
- }
1949
+ },
1950
+ "filter": [
1951
+ "=",
1952
+ [
1953
+ "object/get",
1954
+ "@entity",
1955
+ "status"
1956
+ ],
1957
+ "pending"
1958
+ ]
1289
1959
  }
1290
1960
  ],
1291
1961
  [
@@ -1323,6 +1993,8 @@
1323
1993
  "ApprovalDivider": "trt_01KY21K6QC0P4NS69R6ATZPC18",
1324
1994
  "ApprovalQueueTitle": "trt_01KY21K6QCC5BFGZKJF8Q6HYMM",
1325
1995
  "CloseButton": "trt_01KY21K6QCRRFVK1BRAD774HXP",
1996
+ "DenyReasonHint": "trt_01M169J81G73K4NB9HRPVZA8HX",
1997
+ "DenyReasonTitle": "trt_01M169J81G3JQKD0N73BVPJPS4",
1326
1998
  "ErrorAlert": "trt_01KY21K6QC64ZQCX4WH65V7SKA",
1327
1999
  "ErrorSpinner": "trt_01KY21K6QCCHHN53WV6VF6NKE4",
1328
2000
  "LoadingSpinner": "trt_01KY21K6QC4NB1EVQJ94HWPN3B",
@@ -1360,5 +2032,5 @@
1360
2032
  }
1361
2033
  ],
1362
2034
  "schemaVersion": 1,
1363
- "version": "1.0.1"
2035
+ "version": "1.1.0"
1364
2036
  }