@almadar/std 16.252.0 → 16.254.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/behaviors/lolo/agent/atoms/std-agent-pool.lolo +355 -0
- package/behaviors/lolo/agent/atoms/std-agent-suggestions.lolo +16 -2
- package/behaviors/lolo/agent/evals/eval-agent-builder.lolo +152 -0
- package/behaviors/lolo/agent/organisms/std-agent-builder.lolo +320 -26
- package/behaviors/lolo/ui/learning/atoms/std-learn-generate.lolo +6 -4
- package/behaviors/lolo-behavior-contracts.json +1 -1
- package/behaviors/registry/agent/atoms/std-agent-context.orb +1 -1
- package/behaviors/registry/agent/atoms/std-agent-fix-loop.orb +1 -1
- package/behaviors/registry/agent/atoms/std-agent-planner.orb +1 -1
- package/behaviors/registry/agent/atoms/std-agent-pool.orb +1 -0
- package/behaviors/registry/agent/atoms/std-agent-proposal.orb +1 -1
- package/behaviors/registry/agent/atoms/std-agent-session.orb +1 -1
- package/behaviors/registry/agent/atoms/std-agent-suggestions.orb +1 -1
- package/behaviors/registry/agent/atoms/std-agent-tool-call.orb +1 -1
- package/behaviors/registry/agent/atoms/std-agent-tool-loop.orb +1 -1
- package/behaviors/registry/agent/atoms/std-agent-trace.orb +1 -1
- package/behaviors/registry/agent/evals/eval-agent-builder.orb +1 -0
- package/behaviors/registry/agent/organisms/std-agent-assistant.orb +1 -1
- package/behaviors/registry/agent/organisms/std-agent-builder.orb +1 -1
- package/behaviors/registry/infra/atoms/std-analytics.orb +1 -1
- package/behaviors/registry/infra/atoms/std-approval-gate.orb +1 -1
- package/behaviors/registry/infra/atoms/std-cache-aside.orb +1 -1
- package/behaviors/registry/infra/atoms/std-calendar-sync.orb +1 -1
- package/behaviors/registry/infra/atoms/std-cascade-on-delete.orb +1 -1
- package/behaviors/registry/infra/atoms/std-circuit-breaker.orb +1 -1
- package/behaviors/registry/infra/atoms/std-data-erasure.orb +1 -1
- package/behaviors/registry/infra/atoms/std-data-import.orb +1 -1
- package/behaviors/registry/infra/atoms/std-global-search.orb +1 -1
- package/behaviors/registry/infra/atoms/std-knowledge-loop.orb +1 -1
- package/behaviors/registry/infra/atoms/std-lifecycle.orb +1 -1
- package/behaviors/registry/infra/atoms/std-migration-job.orb +1 -1
- package/behaviors/registry/infra/atoms/std-mod-queue.orb +1 -1
- package/behaviors/registry/infra/atoms/std-notification-center.orb +1 -1
- package/behaviors/registry/infra/atoms/std-notification-preferences.orb +1 -1
- package/behaviors/registry/infra/atoms/std-notify-on-event.orb +1 -1
- package/behaviors/registry/infra/atoms/std-page-search.orb +1 -1
- package/behaviors/registry/infra/atoms/std-page-watch.orb +1 -1
- package/behaviors/registry/infra/atoms/std-permission-matrix.orb +1 -1
- package/behaviors/registry/infra/atoms/std-rate-limiter.orb +1 -1
- package/behaviors/registry/infra/atoms/std-reminder-scheduler.orb +1 -1
- package/behaviors/registry/infra/atoms/std-review-cycle.orb +1 -1
- package/behaviors/registry/infra/atoms/std-row-access-control.orb +1 -1
- package/behaviors/registry/infra/atoms/std-status-lifecycle.orb +1 -1
- package/behaviors/registry/infra/organisms/std-status-lifecycle-control.orb +1 -1
- package/behaviors/registry/ml/atoms/std-data-collector.orb +1 -1
- package/behaviors/registry/ml/atoms/std-graph-builder.orb +1 -1
- package/behaviors/registry/ml/atoms/std-ml-classify.orb +1 -1
- package/behaviors/registry/ml/atoms/std-ml-infer.orb +1 -1
- package/behaviors/registry/ml/atoms/std-ml-lookup.orb +1 -1
- package/behaviors/registry/ml/atoms/std-ml-posterior.orb +1 -1
- package/behaviors/registry/ml/atoms/std-ml-similarity.orb +1 -1
- package/behaviors/registry/ml/atoms/std-tokenizer.orb +1 -1
- package/behaviors/registry/ml/atoms/std-weight-validator.orb +1 -1
- package/behaviors/registry/ml/organisms/std-escalating-decision.orb +1 -1
- package/behaviors/registry/ml/organisms/std-knowledge-tracing.orb +1 -1
- package/behaviors/registry/ui/avl/atoms/std-avl-cosmic-zoom.orb +1 -1
- package/behaviors/registry/ui/avl/atoms/ui-avl-glyph.orb +1 -1
- package/behaviors/registry/ui/avl/atoms/ui-avl-state-machine.orb +1 -1
- package/behaviors/registry/ui/avl/atoms/ui-avl-transition-detail.orb +1 -1
- package/behaviors/registry/ui/avl/atoms/ui-avl-transition-explainer.orb +1 -1
- package/behaviors/registry/ui/avl/atoms/ui-behavior-view.orb +1 -1
- package/behaviors/registry/ui/avl/atoms/ui-module-card.orb +1 -1
- package/behaviors/registry/ui/avl/organisms/ui-flow-canvas.orb +1 -1
- package/behaviors/registry/ui/avl/organisms/ui-layers-panel.orb +1 -1
- package/behaviors/registry/ui/avl/organisms/ui-orb-inspector.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-app-layout.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-app-search.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-behavior-catalog.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-behavior-tour.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-billable-hour.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-board.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-book-reader.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-browse.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-calendar.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-card-grid.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-confirmation.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-dashboard-grid-embedded.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-date-range.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-doc-page.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-esign-flow.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-esign-request.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-event-log.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-export.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-file-store.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-filter.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-form-advanced.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-gallery.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-gantt-schedule.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-graphs.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-hero.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-home.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-image-upload-multi.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-import.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-language-picker.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-media-section.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-modal-editor.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-modal.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-multi-party-flow.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-notification-panel.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-panel-launcher.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-pricing.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-proof.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-prose.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-rating-review.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-record-detail.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-recurrence.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-related.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-role-gate.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-saved-search.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-scatter.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-scoped-list.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-selection.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-site-footer.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-site-header.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-slide-deck.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-stat-band.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-stats.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-step-flow.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-steps.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-tabs.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-tag-strip.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-tag-taxonomy.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-thread.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-tree.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-version-history.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-wizard.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-workspace-layout.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-animated-graphic.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-animated-reveal.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-aside.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-atlas-image.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-atlas-panel.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-avatar.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-badge.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-box.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-button.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-card.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-center.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-checkbox.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-conditional-wrapper.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-confetti-effect.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-day-cell.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-dialog.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-divider.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-filter-pill.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-flip-container.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-game-icon.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-hstack.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-icon.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-image.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-infinite-scroll-sentinel.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-input.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-label.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-law-reference-tooltip.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-overlay.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-pattern-tile.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-presence.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-progress-bar.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-radio.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-range-slider.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-section-header.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-select.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-spacer.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-sparkline.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-spinner.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-stack.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-status-dot.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-svg-branch.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-svg-connection.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-svg-flow.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-svg-grid.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-svg-lobe.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-svg-mesh.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-svg-morph.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-svg-node.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-svg-pulse.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-svg-ring.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-svg-shield.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-svg-stack.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-switch.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-text-highlight.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-textarea.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-theme-toggle.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-time-slot-cell.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-trend-indicator.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-typewriter-text.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-typography.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-video-embed.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-vstack.orb +1 -1
- package/behaviors/registry/ui/core/molecules/std-stat-rows.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-accordion.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-activation-block.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-activity-rail.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-agent-activity-feed.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-agent-activity-row.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-agent-chat-feed.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-alert.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-animated-counter.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-bloom-quiz-block.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-branching-logic-builder.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-breadcrumb.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-calendar-grid.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-carousel.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-change-list.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-chart-legend.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-chart.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-code-block.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-command-palette.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-commit-row.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-confirm-dialog.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-connection-block.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-container.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-content-renderer.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-data-grid.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-data-list.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-date-range-picker.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-date-range-selector.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-doc-breadcrumb.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-doc-pagination.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-doc-search.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-doc-sidebar.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-doc-toc.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-document-details.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-document-panel.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-document-viewer.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-drawer.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-edge-decoration.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-emoji-picker.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-empty-state.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-error-boundary.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-error-state.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-feature-card.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-feature-grid.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-file-tree.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-filter-group.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-flex.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-flip-card.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-floating-action-button.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-floating-toolbar.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-form-actions.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-form-field.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-form-layout.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-form-section-header.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-fx-overlay.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-gantt.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-geometric-pattern.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-gradient-divider.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-graph-canvas.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-graph-view.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-grid.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-header.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-icon-button.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-import-preview-tree.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-import-progress.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-import-source-picker.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-input-group.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-jazari-state-machine.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-lightbox.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-likert-scale.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-line-chart.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-loading-state.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-map-view.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-markdown-content.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-matrix-question.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-menu.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-meter.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-modal.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-navigation.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-notification.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-number-stepper.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-option-constraint-group.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-orbital-visualization.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-page-header.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-page-transition.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-pagination.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-popover.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-positioned-canvas.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-progress-dots.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-pull-to-refresh.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-qr-scanner.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-quiz-block.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-reflection-block.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-relation-select.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-repeatable-form-section.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-reply-tree.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-rich-text-editor.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-scaled-diagram.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-search-input.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-section.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-side-panel.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-sidebar.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-signature-pad.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-simple-grid.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-skeleton.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-social-proof.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-sortable-list.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-split.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-star-rating.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-stat-display.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-swipeable-row.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-table-view.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-tabs.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-tag-input.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-tooltip.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-top-nav-item.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-upload-drop-zone.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-version-diff.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-violation-alert.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-vote-stack.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-wizard-container.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-wizard-navigation.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-wizard-progress.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-chat-bar.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-code-runner-panel.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-dashboard-grid.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-detail-panel.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-dock-layout.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-drawer-slot.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-form-section.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-form.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-master-detail-layout.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-media-gallery.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-modal-slot.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-runtime-debugger.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-segment-renderer.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-split-pane.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-stat-card.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-state-machine-view.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-subagent-trace-panel.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-tabbed-container.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-timeline.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-toast-slot.orb +1 -1
- package/behaviors/registry/ui/core/templates/ui-auth-layout.orb +1 -1
- package/behaviors/registry/ui/core/templates/ui-counter-template.orb +1 -1
- package/behaviors/registry/ui/core/templates/ui-dashboard-layout.orb +1 -1
- package/behaviors/registry/ui/core/templates/ui-generic-app-template.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-arcade-play.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-area-fill.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-audio-cue.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-camera-rig.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-chase-ai.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-choice-gate.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-coef-pad.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-curve-fog.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-dungeon-combat.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-fx-narrative.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-fx-particles.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-fx-trail.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-gate-lock.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-gather.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-gold.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-grid-tactics.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-hero-nav.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-lives.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-loop-lock.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-market-flow.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-motion-body.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-objective-reach.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-pad-lock.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-patience.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-patrol-hazard.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-pickup.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-platformer-body.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-production.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-score.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-tutorial-autodemo.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-tutorial-overlay.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-velocity-gate.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-xp.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-zone-card.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-action-palette.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-action-tile.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-canvas-2d.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-canvas.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-choice-button.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-control-button.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-control-grid.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-dialogue-bubble.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-draw-fx-layer.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-draw-group.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-draw-mesh.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-draw-shape-layer.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-draw-shape.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-draw-skinned-mesh.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-draw-sprite-layer.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-draw-sprite.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-draw-text-layer.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-draw-text.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-game-audio-cue.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-game-audio-toggle.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-game-hud.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-game-menu.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-health-bar.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-score-display.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-sequence-bar.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-stat-badge.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-state-graph.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-state-json-view.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-timer-display.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-trait-slot.orb +1 -1
- package/behaviors/registry/ui/game/organisms/std-arcade-board-3d.orb +1 -1
- package/behaviors/registry/ui/game/organisms/std-crew-board-2d.orb +1 -1
- package/behaviors/registry/ui/game/organisms/std-dungeon-board-2d.orb +1 -1
- package/behaviors/registry/ui/game/organisms/std-market-board-3d.orb +1 -1
- package/behaviors/registry/ui/game/organisms/std-objective-board-3d.orb +1 -1
- package/behaviors/registry/ui/game/organisms/std-platformer-board-2d.orb +1 -1
- package/behaviors/registry/ui/game/organisms/std-platformer-puzzle.orb +1 -1
- package/behaviors/registry/ui/game/organisms/std-survival-board-3d.orb +1 -1
- package/behaviors/registry/ui/game/organisms/std-tactics-board-2d.orb +1 -1
- package/behaviors/registry/ui/game/organisms/std-tactics-board-3d.orb +1 -1
- package/behaviors/registry/ui/game/organisms/std-worldmap-board-2d.orb +1 -1
- package/behaviors/registry/ui/game/templates/ui-game-shell.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-arrangement.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-classify.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-compare.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-coupled-sim.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-derivation.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-diagram.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-doser.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-estimate.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-fx-cues.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-generate.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-goal-seek.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-grid-sim.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-hotspot.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-live-sim.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-measure.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-param-explorer.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-perturb.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-predict.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-sample-accumulator.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-sandbox.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-scatter-fit.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-scenario.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-sim-3d.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-slope-probe.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-speed-drill.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-stepper.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-tour-3d.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-trace-player.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-transport.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-tree.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/ui-algo-graph-canvas.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/ui-algorithm-canvas.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/ui-biology-canvas.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/ui-chemistry-canvas.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/ui-learning-canvas.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/ui-math-canvas.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/ui-physics-canvas.orb +1 -1
- package/dist/behaviors-embeddings.hash.json +2 -2
- package/dist/behaviors-embeddings.json +1 -1
- package/dist/knob-embeddings.hash.json +2 -2
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"std-approval-gate","version":"1.1.0","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. blockSelfApproval additionally stops a reviewer approving their own request (four-eyes) — DENY stays allowed as self-withdrawal. 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.","orbitals":[{"name":"ApprovalGateOrbital","id":"orb_C47DR6W7883M466T0XHH12YMAQ","uses":[{"from":"std/behaviors/ui-spinner","as":"Spinner"},{"from":"std/behaviors/ui-typography","as":"Typography"},{"from":"std/behaviors/ui-icon","as":"Icon"},{"from":"std/behaviors/ui-button","as":"Button"},{"from":"std/behaviors/ui-divider","as":"Divider"},{"from":"std/behaviors/ui-alert","as":"Alert"}],"entity":{"name":"ApprovalRequest","id":"ent_RHD868NFTHQX8X1NVP40WHT37D","collection":"approval_requests","persistence":"persistent","fields":[{"name":"id","type":"string","required":true},{"name":"gatedEvent","type":"string","default":"","description":"The event that triggered the approval request.","synonyms":"trigger, event, source"},{"name":"subjectLabel","type":"string","default":"","description":"Human title of the thing being approved (the article's headline, the page's title) — what the reviewer sees in the queue.","synonyms":"title, subject, what is being approved"},{"name":"subjectId","type":"string","default":"","description":"Id of the record being approved, for a queue row's View click-through to the subject's own surface.","synonyms":"record id, target id, article id, page id"},{"name":"requestedBy","type":"string","default":"","description":"User id of the submitter.","synonyms":"submitter, author, requester id"},{"name":"requestedByName","type":"string","default":"","description":"Display name of the submitter shown in the queue.","synonyms":"submitter name, requester, who asked"},{"name":"status","type":"string","default":"pending","values":["pending","approved","denied","escalated"],"description":"Current state of the approval process.","synonyms":"approval status, state, condition"},{"name":"reviewer","type":"string","default":"","description":"The user or system responsible for reviewing the request.","synonyms":"assignee, owner, approver, responsible party"},{"name":"requestedAt","type":"number","default":0,"description":"Timestamp indicating when the approval request was initiated.","synonyms":"creation time, request date, submission time"},{"name":"decidedAt","type":"number","default":0,"description":"Timestamp indicating when a decision was made on the request.","synonyms":"decision time, resolved at, completed at"},{"name":"escalatedAt","type":"number","default":0,"description":"Timestamp indicating when the request was escalated.","synonyms":"escalation time, escalation timestamp, escalated time"},{"name":"notes","type":"string","default":"","description":"The reviewer's written reason, captured by the deny step.","synonyms":"comments, remarks, explanation, reason, details"},{"name":"payload","type":"string","default":"","description":"The held data of the gated action as JSON text, replayed by the downstream listener when the request is granted.","synonyms":"request data, held payload, pending data, gated data"}],"access_waivers":{"read":"Shared review surface: submitters watch their requests, approvers work the queue; decision authority is enforced at the transitions, not by hiding rows."}},"traits":[{"ref":"Spinner.traits.SpinnerRender","id":"trt_H9BXNCBJZPSFV9EWZX6GQ65Y3V","name":"LoadingSpinner","linkedEntity":"ApprovalRequest","linkedEntityId":"ent_RHD868NFTHQX8X1NVP40WHT37D"},{"ref":"Spinner.traits.SpinnerRender","id":"trt_7ZRX4FHWYYYFF92MNANE0PZF9G","name":"ErrorSpinner","linkedEntity":"ApprovalRequest","linkedEntityId":"ent_RHD868NFTHQX8X1NVP40WHT37D","config":{"size":{"type":"unknown","default":"sm"}}},{"ref":"Typography.traits.TypographyRender","id":"trt_BEBDJHPFW07Y06D1VMN21FN0JJ","name":"LoadingText","linkedEntity":"ApprovalRequest","linkedEntityId":"ent_RHD868NFTHQX8X1NVP40WHT37D","config":{"color":{"type":"unknown","default":"muted"},"variant":{"type":"unknown","default":"caption"},"content":{"type":"unknown","default":"Loading approval queue…"}}},{"ref":"Icon.traits.IconRender","id":"trt_96ATJ2K01YG0ZA385FMHPBNGC5","name":"ShieldCheckIcon","linkedEntity":"ApprovalRequest","linkedEntityId":"ent_RHD868NFTHQX8X1NVP40WHT37D","config":{"name":{"type":"unknown","default":"shield-check"}}},{"ref":"Typography.traits.TypographyRender","id":"trt_RWMH37FBGHNR8Z65VXXBXQR9XH","name":"ApprovalQueueTitle","linkedEntity":"ApprovalRequest","linkedEntityId":"ent_RHD868NFTHQX8X1NVP40WHT37D","config":{"content":{"type":"unknown","default":"Approval queue"},"variant":{"type":"unknown","default":"h3"}}},{"ref":"Typography.traits.TypographyRender","id":"trt_YA6J959W4TY2DEBPBGX4FGM2JK","name":"DenyReasonTitle","linkedEntity":"ApprovalRequest","linkedEntityId":"ent_RHD868NFTHQX8X1NVP40WHT37D","config":{"content":{"type":"unknown","default":"Deny request"},"variant":{"type":"unknown","default":"h3"}}},{"ref":"Typography.traits.TypographyRender","id":"trt_TEWAFEG1NB0TNJ55E6MYRD7PM9","name":"DenyReasonHint","linkedEntity":"ApprovalRequest","linkedEntityId":"ent_RHD868NFTHQX8X1NVP40WHT37D","config":{"variant":{"type":"unknown","default":"caption"},"content":{"type":"unknown","default":"Tell the submitter why — the reason is recorded on the request."},"color":{"type":"unknown","default":"muted"}}},{"ref":"Button.traits.ButtonRender","id":"trt_BAA9G5YBEM5QA1NDKA9Q1XC940","name":"CloseButton","linkedEntity":"ApprovalRequest","linkedEntityId":"ent_RHD868NFTHQX8X1NVP40WHT37D","config":{"action":{"type":"unknown","default":"CLOSE"},"icon":{"type":"unknown","default":"x"},"label":{"type":"unknown","default":"Close"},"variant":{"type":"unknown","default":"ghost"}}},{"ref":"Divider.traits.DividerRender","id":"trt_MMHEPF3R0TW0DB4C0A82C1P6A4","name":"ApprovalDivider","linkedEntity":"ApprovalRequest","linkedEntityId":"ent_RHD868NFTHQX8X1NVP40WHT37D"},{"ref":"Alert.traits.AlertRender","id":"trt_DR8Z4MA8YB4F5M7YNVTA5ZVN0A","name":"ErrorAlert","linkedEntity":"ApprovalRequest","linkedEntityId":"ent_RHD868NFTHQX8X1NVP40WHT37D","config":{"message":{"type":"unknown","default":"@payload.error"},"variant":{"type":"unknown","default":"error"}}},{"name":"ApprovalGateReview","id":"trt_0380ZTKN4RTJC4JSD6H48CK9MY","entityRebindable":true,"entityContract":{"requires":[],"provides":["decidedAt","notes","reviewer","status","subjectLabel"]},"effectRow":[{"kind":"emit","resource":"ApprovalDenied"},{"kind":"emit","resource":"ApprovalGranted"},{"kind":"fetch","resource":"ApprovalRequest"},{"kind":"persist","resource":"ApprovalRequest"},{"kind":"render-ui","resource":"@config.reviewSlot","resolved":false},{"kind":"render-ui","resource":"toast"},{"kind":"set","resource":"@entity.decidedAt"},{"kind":"set","resource":"@entity.id"},{"kind":"set","resource":"@entity.notes"},{"kind":"set","resource":"@entity.reviewer"},{"kind":"set","resource":"@entity.status"},{"kind":"set","resource":"@entity.subjectLabel"}],"category":"interaction","capabilities":["approval"],"linkedEntity":"ApprovalRequest","linkedEntityId":"ent_RHD868NFTHQX8X1NVP40WHT37D","entityRefIds":{"ApprovalRequest":"ent_RHD868NFTHQX8X1NVP40WHT37D"},"traitEmbedIds":{"LoadingText":"trt_BEBDJHPFW07Y06D1VMN21FN0JJ","CloseButton":"trt_BAA9G5YBEM5QA1NDKA9Q1XC940","ShieldCheckIcon":"trt_96ATJ2K01YG0ZA385FMHPBNGC5","ApprovalQueueTitle":"trt_RWMH37FBGHNR8Z65VXXBXQR9XH","ApprovalDivider":"trt_MMHEPF3R0TW0DB4C0A82C1P6A4","ErrorAlert":"trt_DR8Z4MA8YB4F5M7YNVTA5ZVN0A","ErrorSpinner":"trt_7ZRX4FHWYYYFF92MNANE0PZF9G","DenyReasonTitle":"trt_YA6J959W4TY2DEBPBGX4FGM2JK","DenyReasonHint":"trt_TEWAFEG1NB0TNJ55E6MYRD7PM9","LoadingSpinner":"trt_H9BXNCBJZPSFV9EWZX6GQ65Y3V"},"emits":[{"event":"APPROVE","eventId":"evt_4T4NEH25ND2TPR2KGREPNJPB1B","description":"Signals that an approval request has been approved.","synonyms":"accept, authorize, confirm, pass","tier":"domain","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"row","type":"object","properties":[{"name":"id","type":"string","required":true},{"name":"gatedEvent","type":"string"},{"name":"subjectLabel","type":"string"},{"name":"subjectId","type":"string"},{"name":"requestedBy","type":"string"},{"name":"requestedByName","type":"string"},{"name":"status","type":"string","values":["pending","approved","denied","escalated"]},{"name":"reviewer","type":"string"},{"name":"requestedAt","type":"number"},{"name":"decidedAt","type":"number"},{"name":"escalatedAt","type":"number"},{"name":"notes","type":"string"},{"name":"payload","type":"string"}],"entity":"ApprovalRequest"}]},{"event":"DENY","eventId":"evt_JGR6YDM8BG45RB1CGAMBZB8JNP","description":"Opens the deny step for a request; the decision commits with the written reason.","synonyms":"reject, decline","tier":"domain","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"row","type":"object","properties":[{"name":"id","type":"string","required":true},{"name":"gatedEvent","type":"string"},{"name":"subjectLabel","type":"string"},{"name":"subjectId","type":"string"},{"name":"requestedBy","type":"string"},{"name":"requestedByName","type":"string"},{"name":"status","type":"string","values":["pending","approved","denied","escalated"]},{"name":"reviewer","type":"string"},{"name":"requestedAt","type":"number"},{"name":"decidedAt","type":"number"},{"name":"escalatedAt","type":"number"},{"name":"notes","type":"string"},{"name":"payload","type":"string"}],"entity":"ApprovalRequest"}]},{"event":"OPEN_SUBJECT","eventId":"evt_T1J65W89XH4YRTYM57QM1W5ZZP","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.","synonyms":"view subject, open record, inspect request, see the article","tier":"domain","scope":"external","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"row","type":"object","properties":[{"name":"id","type":"string","required":true},{"name":"gatedEvent","type":"string"},{"name":"subjectLabel","type":"string"},{"name":"subjectId","type":"string"},{"name":"requestedBy","type":"string"},{"name":"requestedByName","type":"string"},{"name":"status","type":"string","values":["pending","approved","denied","escalated"]},{"name":"reviewer","type":"string"},{"name":"requestedAt","type":"number"},{"name":"decidedAt","type":"number"},{"name":"escalatedAt","type":"number"},{"name":"notes","type":"string"},{"name":"payload","type":"string"}],"entity":"ApprovalRequest"},{"name":"subjectId","type":"string"},{"name":"subjectLabel","type":"string"}]},{"event":"CONFIRM_DENY","eventId":"evt_175085C5M52T2SS2WHZRF8P52T","description":"The deny form committed; data carries the request id + the written reason.","synonyms":"submit denial, confirm rejection","tier":"internal","payloadSchema":[{"name":"data","type":"object","properties":[{"name":"id","type":"string","required":true},{"name":"notes","type":"string"}]}]},{"event":"CANCEL_DENY","eventId":"evt_KK89PCP4D526JHH5AKFWPHCHZ6","description":"The deny form was dismissed without committing; the queue repaints.","synonyms":"cancel denial, back to queue","tier":"internal"},{"event":"CLOSE","eventId":"evt_HDQK9DN4WJJE90C3VEGJMWPSSK","description":"Dismisses the review queue overlay.","synonyms":"dismiss, hide, cancel, done","tier":"domain"},{"event":"ApprovalGranted","eventId":"evt_ZNTAM4EABM55T7A9SD59550RFN","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.","synonyms":"approved, authorized, confirmed, validated","tier":"domain","scope":"external","payloadSchema":[{"name":"requestId","type":"string"},{"name":"payload","type":"$p"}]},{"event":"ApprovalDenied","eventId":"evt_HXXJW22J7K93SZJV6F963QC4Q8","description":"Indicates an approval request has been denied, with the reviewer's written reason.","synonyms":"rejected, declined","tier":"domain","scope":"external","payloadSchema":[{"name":"requestId","type":"string"},{"name":"reason","type":"string"}]},{"event":"ApprovalRequestLoaded","eventId":"evt_RC47PFV368HK4535PVWQWKS3MZ","description":"Indicates an approval request has been successfully loaded.","synonyms":"loaded, fetched, retrieved","tier":"internal","payloadSchema":[{"name":"data","type":"[object]","properties":[{"name":"id","type":"string","required":true},{"name":"gatedEvent","type":"string"},{"name":"subjectLabel","type":"string"},{"name":"subjectId","type":"string"},{"name":"requestedBy","type":"string"},{"name":"requestedByName","type":"string"},{"name":"status","type":"string","values":["pending","approved","denied","escalated"]},{"name":"reviewer","type":"string"},{"name":"requestedAt","type":"number"},{"name":"decidedAt","type":"number"},{"name":"escalatedAt","type":"number"},{"name":"notes","type":"string"},{"name":"payload","type":"string"}],"entity":"ApprovalRequest"}]},{"event":"ApprovalRequestLoadFailed","eventId":"evt_CRE6YWV91FMGQW6XGDFSF4K17X","description":"Indicates failure to load an approval request.","synonyms":"load error, failed load, request failure","tier":"internal","payloadSchema":[{"name":"error","type":"string"},{"name":"code","type":"string"}]},{"event":"ApprovalRequestReviewed","eventId":"evt_W7SA338X5MEJT9XWWK0ZRKR0E7","description":"Signals that an approval request has been reviewed.","synonyms":"reviewed, processed, examined","tier":"internal","scope":"internal","payloadSchema":[{"name":"value","type":"@entity"}]},{"event":"ApprovalRequestReviewFailed","eventId":"evt_0EP4VEQCCFP67ZEN3TVAN67T85","description":"Indicates a failure to load or process an approval request for review.","synonyms":"load error, failed review, processing failure","tier":"internal","payloadSchema":[{"name":"error","type":"string"},{"name":"code","type":"string"}]}],"stateMachine":{"states":[{"name":"idle","isInitial":true},{"name":"loading"},{"name":"reviewing"},{"name":"denying"},{"name":"error"}],"events":[{"key":"INIT","id":"evt_5MNE8EC51V2GXH0F0QN1WRQMY0","name":"Initialize"},{"key":"ApprovalRequestLoaded","id":"evt_RC47PFV368HK4535PVWQWKS3MZ","name":"ApprovalRequest loaded","description":"Indicates an approval request has been successfully loaded.","synonyms":"loaded, fetched, retrieved","tier":"internal","payloadSchema":[{"name":"data","type":"[object]","properties":[{"name":"id","type":"string","required":true},{"name":"gatedEvent","type":"string"},{"name":"subjectLabel","type":"string"},{"name":"subjectId","type":"string"},{"name":"requestedBy","type":"string"},{"name":"requestedByName","type":"string"},{"name":"status","type":"string","values":["pending","approved","denied","escalated"]},{"name":"reviewer","type":"string"},{"name":"requestedAt","type":"number"},{"name":"decidedAt","type":"number"},{"name":"escalatedAt","type":"number"},{"name":"notes","type":"string"},{"name":"payload","type":"string"}],"entity":"ApprovalRequest"}],"listened":true},{"key":"ApprovalRequestLoadFailed","id":"evt_CRE6YWV91FMGQW6XGDFSF4K17X","name":"ApprovalRequest load failed","description":"Indicates failure to load an approval request.","synonyms":"load error, failed load, request failure","tier":"internal","payloadSchema":[{"name":"error","type":"string"},{"name":"code","type":"string"}],"listened":true},{"key":"APPROVAL_REPLAY_FAILED","id":"evt_Q1FM2ANZ4YZJF0F90G9RR8NECQ","name":"Approval Replay Failed","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.","synonyms":"replay failed, apply failed, approval rollback","tier":"domain","payloadSchema":[{"name":"requestId","type":"string","required":true},{"name":"error","type":"string"}],"listened":true},{"key":"ApprovalRequestReviewFailed","id":"evt_0EP4VEQCCFP67ZEN3TVAN67T85","name":"ApprovalRequest review failed","description":"Indicates a failure to load or process an approval request for review.","synonyms":"load error, failed review, processing failure","tier":"internal","payloadSchema":[{"name":"error","type":"string"},{"name":"code","type":"string"}],"listened":true},{"key":"OPEN","id":"evt_S9CE4D2DFF6QQGRQG5YPK2N76C","name":"Open","description":"Summons the review queue (host nav/affordance requests it).","synonyms":"open, show, review, view queue, open approvals","tier":"domain","listened":true},{"key":"CLOSE","id":"evt_HDQK9DN4WJJE90C3VEGJMWPSSK","name":"Close","description":"Dismisses the review queue overlay.","synonyms":"dismiss, hide, cancel, done","tier":"domain","listened":true},{"key":"APPROVE","id":"evt_4T4NEH25ND2TPR2KGREPNJPB1B","name":"Approve","description":"Signals that an approval request has been approved.","synonyms":"accept, authorize, confirm, pass","tier":"domain","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"row","type":"object","properties":[{"name":"id","type":"string","required":true},{"name":"gatedEvent","type":"string"},{"name":"subjectLabel","type":"string"},{"name":"subjectId","type":"string"},{"name":"requestedBy","type":"string"},{"name":"requestedByName","type":"string"},{"name":"status","type":"string","values":["pending","approved","denied","escalated"]},{"name":"reviewer","type":"string"},{"name":"requestedAt","type":"number"},{"name":"decidedAt","type":"number"},{"name":"escalatedAt","type":"number"},{"name":"notes","type":"string"},{"name":"payload","type":"string"}],"entity":"ApprovalRequest"}],"listened":true},{"key":"DENY","id":"evt_JGR6YDM8BG45RB1CGAMBZB8JNP","name":"Deny","description":"Opens the deny step for a request; the decision commits with the written reason.","synonyms":"reject, decline","tier":"domain","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"row","type":"object","properties":[{"name":"id","type":"string","required":true},{"name":"gatedEvent","type":"string"},{"name":"subjectLabel","type":"string"},{"name":"subjectId","type":"string"},{"name":"requestedBy","type":"string"},{"name":"requestedByName","type":"string"},{"name":"status","type":"string","values":["pending","approved","denied","escalated"]},{"name":"reviewer","type":"string"},{"name":"requestedAt","type":"number"},{"name":"decidedAt","type":"number"},{"name":"escalatedAt","type":"number"},{"name":"notes","type":"string"},{"name":"payload","type":"string"}],"entity":"ApprovalRequest"}],"listened":true},{"key":"OPEN_SUBJECT","id":"evt_T1J65W89XH4YRTYM57QM1W5ZZP","name":"Open Subject","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.","synonyms":"view subject, open record, inspect request, see the article","tier":"domain","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"subjectId","type":"string"},{"name":"subjectLabel","type":"string"}],"listened":true},{"key":"ApprovalRequestReviewed","id":"evt_W7SA338X5MEJT9XWWK0ZRKR0E7","name":"ApprovalRequest reviewed","description":"Signals that an approval request has been reviewed.","synonyms":"reviewed, processed, examined","tier":"internal","payloadSchema":[{"name":"value","type":"@entity"}],"listened":true},{"key":"CONFIRM_DENY","id":"evt_175085C5M52T2SS2WHZRF8P52T","name":"Confirm Deny","description":"The deny form committed; data carries the request id + the written reason.","synonyms":"submit denial, confirm rejection","tier":"internal","payloadSchema":[{"name":"data","type":"object","properties":[{"name":"id","type":"string","required":true},{"name":"notes","type":"string"}]}],"listened":true},{"key":"CANCEL_DENY","id":"evt_KK89PCP4D526JHH5AKFWPHCHZ6","name":"Cancel Deny","description":"The deny form was dismissed without committing; the queue repaints.","synonyms":"cancel denial, back to queue","tier":"internal","listened":true},{"key":"ApprovalGranted","id":"evt_ZNTAM4EABM55T7A9SD59550RFN","name":"Approval granted","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.","synonyms":"approved, authorized, confirmed, validated","tier":"domain","payloadSchema":[{"name":"requestId","type":"string"},{"name":"payload","type":"$p"}]},{"key":"ApprovalDenied","id":"evt_HXXJW22J7K93SZJV6F963QC4Q8","name":"Approval denied","description":"Indicates an approval request has been denied, with the reviewer's written reason.","synonyms":"rejected, declined","tier":"domain","payloadSchema":[{"name":"requestId","type":"string"},{"name":"reason","type":"string"}]}],"transitions":[{"from":"idle","to":"idle","event":"INIT","eventId":"evt_5MNE8EC51V2GXH0F0QN1WRQMY0","effects":[["fetch","ApprovalRequest",{"filter":["=",["object/get","@entity","status"],"pending"],"emit":{"failure":"ApprovalRequestLoadFailed","success":"ApprovalRequestLoaded"}}]]},{"from":"idle","to":"idle","event":"ApprovalRequestLoaded","eventId":"evt_RC47PFV368HK4535PVWQWKS3MZ"},{"from":"idle","to":"idle","event":"ApprovalRequestLoadFailed","eventId":"evt_CRE6YWV91FMGQW6XGDFSF4K17X","effects":[["render-ui","toast",{"type":"alert","variant":"error","message":["str/concat","Couldn't load the approval request — ","@payload.error"],"dismissible":true}]]},{"from":"idle","to":"idle","event":"APPROVAL_REPLAY_FAILED","eventId":"evt_Q1FM2ANZ4YZJF0F90G9RR8NECQ","effects":[["set","@entity.id","@payload.requestId"],["set","@entity.status","pending"],["set","@entity.reviewer",""],["set","@entity.decidedAt",0],["persist","update","ApprovalRequest","@entity",{"emit":{"failure":"ApprovalRequestReviewFailed","success":"ApprovalRequestReviewed"}}],["render-ui","toast",{"type":"alert","variant":"error","message":"Approval could not be applied — the request was reopened.","dismissible":true}]]},{"from":"idle","to":"idle","event":"ApprovalRequestReviewFailed","eventId":"evt_0EP4VEQCCFP67ZEN3TVAN67T85","effects":[["render-ui","toast",{"type":"alert","variant":"error","message":["str/concat","Couldn't reopen the approval request — ","@payload.error"],"dismissible":true}]]},{"from":"idle","to":"loading","event":"OPEN","eventId":"evt_S9CE4D2DFF6QQGRQG5YPK2N76C","guard":"@config.enabled","effects":[["fetch","ApprovalRequest",{"filter":["=",["object/get","@entity","status"],"pending"],"emit":{"failure":"ApprovalRequestLoadFailed","success":"ApprovalRequestLoaded"}}],["render-ui","@config.reviewSlot",{"align":"center","children":["@trait.LoadingSpinner","@trait.LoadingText"],"className":"py-12","direction":"vertical","gap":"md","type":"stack"}]]},{"from":"loading","to":"idle","event":"INIT","eventId":"evt_5MNE8EC51V2GXH0F0QN1WRQMY0","effects":[["render-ui","@config.reviewSlot",null],["fetch","ApprovalRequest",{"filter":["=",["object/get","@entity","status"],"pending"],"emit":{"failure":"ApprovalRequestLoadFailed","success":"ApprovalRequestLoaded"}}]]},{"from":"loading","to":"reviewing","event":"ApprovalRequestLoaded","eventId":"evt_RC47PFV368HK4535PVWQWKS3MZ","effects":[["render-ui","@config.reviewSlot",{"children":[{"align":"center","children":[{"align":"center","children":["@trait.ShieldCheckIcon","@trait.ApprovalQueueTitle"],"direction":"horizontal","gap":"sm","type":"stack"},"@trait.CloseButton"],"direction":"horizontal","gap":"sm","justify":"between","type":"stack"},"@trait.ApprovalDivider",{"cols":1,"entity":"@payload.data","fields":[{"label":"What","name":"subjectLabel","variant":"h4"},{"label":"Action","name":"gatedEvent","variant":"badge"},{"label":"Requested by","name":"requestedByName","variant":"caption"},{"label":"Requested","format":"date","name":"requestedAt","variant":"caption"}],"gap":"sm","itemClickEvent":"@config.itemClickEvent","itemActions":["array/filter","@config.itemActions",["fn","action",["or",["=",["array/len",["object/get","@action","roles",[]]],0],["array/includes",["object/get","@action","roles",[]],"@config.viewerRole"]]]],"look":"@config.tableLook","type":"data-grid"}],"direction":"vertical","gap":"md","type":"stack"}]]},{"from":"loading","to":"error","event":"ApprovalRequestLoadFailed","eventId":"evt_CRE6YWV91FMGQW6XGDFSF4K17X","effects":[["render-ui","@config.reviewSlot",{"children":["@trait.ErrorAlert"],"type":"stack"}]]},{"from":"loading","to":"idle","event":"CLOSE","eventId":"evt_HDQK9DN4WJJE90C3VEGJMWPSSK","effects":[["render-ui","@config.reviewSlot",null]]},{"from":"reviewing","to":"idle","event":"INIT","eventId":"evt_5MNE8EC51V2GXH0F0QN1WRQMY0","effects":[["render-ui","@config.reviewSlot",null],["fetch","ApprovalRequest",{"filter":["=",["object/get","@entity","status"],"pending"],"emit":{"failure":"ApprovalRequestLoadFailed","success":"ApprovalRequestLoaded"}}]]},{"from":"reviewing","to":"reviewing","event":"APPROVE","eventId":"evt_4T4NEH25ND2TPR2KGREPNJPB1B","guard":["and",["or",["=",["array/len","@config.approverRoles"],0],["array/includes","@config.approverRoles","@user.role"]],["or",["=","@config.blockSelfApproval",false],["!=",["object/get","@payload.row","requestedBy"],"@user.id"]]],"effects":[["set","@entity.id","@payload.id"],["set","@entity.status","approved"],["set","@entity.reviewer","@user.id"],["set","@entity.decidedAt",["time/now"]],["persist","update","ApprovalRequest","@entity",{"emit":{"failure":"ApprovalRequestReviewFailed","success":"ApprovalRequestReviewed"}}],["emit","ApprovalGranted",{"payload":["json/parse","@payload.row.payload","p"],"requestId":"@payload.id"}]]},{"from":"reviewing","to":"denying","event":"DENY","eventId":"evt_JGR6YDM8BG45RB1CGAMBZB8JNP","guard":["or",["=",["array/len","@config.approverRoles"],0],["array/includes","@config.approverRoles","@user.role"]],"effects":[["set","@entity.id","@payload.id"],["set","@entity.subjectLabel",["str/default",["object/get","@payload.row","subjectLabel"],""]],["render-ui","@config.reviewSlot",{"children":[{"align":"center","children":["@trait.DenyReasonTitle","@trait.CloseButton"],"direction":"horizontal","gap":"sm","justify":"between","type":"stack"},"@trait.DenyReasonHint","@trait.ApprovalDivider",{"cancelEvent":"CANCEL_DENY","entity":{"id":"@entity.id"},"fields":["notes"],"mode":"edit","submitEvent":"CONFIRM_DENY","type":"form-section"}],"direction":"vertical","gap":"md","type":"stack"}]]},{"from":"reviewing","to":"reviewing","event":"OPEN_SUBJECT","eventId":"evt_T1J65W89XH4YRTYM57QM1W5ZZP"},{"from":"reviewing","to":"loading","event":"ApprovalRequestReviewed","eventId":"evt_W7SA338X5MEJT9XWWK0ZRKR0E7","effects":[["fetch","ApprovalRequest",{"filter":["=",["object/get","@entity","status"],"pending"],"emit":{"failure":"ApprovalRequestLoadFailed","success":"ApprovalRequestLoaded"}}]]},{"from":"reviewing","to":"reviewing","event":"ApprovalRequestReviewFailed","eventId":"evt_0EP4VEQCCFP67ZEN3TVAN67T85","effects":[["render-ui","@config.reviewSlot",{"children":["@trait.ErrorAlert"],"type":"stack"}]]},{"from":"reviewing","to":"reviewing","event":"APPROVAL_REPLAY_FAILED","eventId":"evt_Q1FM2ANZ4YZJF0F90G9RR8NECQ","effects":[["set","@entity.id","@payload.requestId"],["set","@entity.status","pending"],["set","@entity.reviewer",""],["set","@entity.decidedAt",0],["persist","update","ApprovalRequest","@entity",{"emit":{"failure":"ApprovalRequestReviewFailed","success":"ApprovalRequestReviewed"}}],["render-ui","toast",{"type":"alert","variant":"error","message":"Approval could not be applied — the request was reopened.","dismissible":true}]]},{"from":"reviewing","to":"idle","event":"CLOSE","eventId":"evt_HDQK9DN4WJJE90C3VEGJMWPSSK","effects":[["render-ui","@config.reviewSlot",null]]},{"from":"denying","to":"idle","event":"INIT","eventId":"evt_5MNE8EC51V2GXH0F0QN1WRQMY0","effects":[["render-ui","@config.reviewSlot",null],["fetch","ApprovalRequest",{"filter":["=",["object/get","@entity","status"],"pending"],"emit":{"failure":"ApprovalRequestLoadFailed","success":"ApprovalRequestLoaded"}}]]},{"from":"denying","to":"reviewing","event":"CONFIRM_DENY","eventId":"evt_175085C5M52T2SS2WHZRF8P52T","effects":[["set","@entity.id",["object/get","@payload.data","id"]],["set","@entity.status","denied"],["set","@entity.reviewer","@user.id"],["set","@entity.decidedAt",["time/now"]],["set","@entity.notes",["str/default",["object/get","@payload.data","notes"],""]],["persist","update","ApprovalRequest","@entity",{"emit":{"failure":"ApprovalRequestReviewFailed","success":"ApprovalRequestReviewed"}}],["emit","ApprovalDenied",{"requestId":["object/get","@payload.data","id"],"reason":["str/default",["object/get","@payload.data","notes"],""]}]]},{"from":"denying","to":"loading","event":"CANCEL_DENY","eventId":"evt_KK89PCP4D526JHH5AKFWPHCHZ6","effects":[["fetch","ApprovalRequest",{"filter":["=",["object/get","@entity","status"],"pending"],"emit":{"failure":"ApprovalRequestLoadFailed","success":"ApprovalRequestLoaded"}}]]},{"from":"denying","to":"loading","event":"ApprovalRequestReviewed","eventId":"evt_W7SA338X5MEJT9XWWK0ZRKR0E7","effects":[["fetch","ApprovalRequest",{"filter":["=",["object/get","@entity","status"],"pending"],"emit":{"failure":"ApprovalRequestLoadFailed","success":"ApprovalRequestLoaded"}}]]},{"from":"denying","to":"denying","event":"ApprovalRequestReviewFailed","eventId":"evt_0EP4VEQCCFP67ZEN3TVAN67T85","effects":[["render-ui","@config.reviewSlot",{"children":["@trait.ErrorAlert"],"type":"stack"}]]},{"from":"denying","to":"idle","event":"CLOSE","eventId":"evt_HDQK9DN4WJJE90C3VEGJMWPSSK","effects":[["render-ui","@config.reviewSlot",null]]},{"from":"error","to":"idle","event":"INIT","eventId":"evt_5MNE8EC51V2GXH0F0QN1WRQMY0","effects":[["render-ui","@config.reviewSlot",null],["fetch","ApprovalRequest",{"filter":["=",["object/get","@entity","status"],"pending"],"emit":{"failure":"ApprovalRequestLoadFailed","success":"ApprovalRequestLoaded"}}]]},{"from":"error","to":"loading","event":"OPEN","eventId":"evt_S9CE4D2DFF6QQGRQG5YPK2N76C","effects":[["fetch","ApprovalRequest",{"filter":["=",["object/get","@entity","status"],"pending"],"emit":{"failure":"ApprovalRequestLoadFailed","success":"ApprovalRequestLoaded"}}],["render-ui","@config.reviewSlot",{"children":["@trait.ErrorSpinner"],"type":"stack"}]]},{"from":"error","to":"idle","event":"CLOSE","eventId":"evt_HDQK9DN4WJJE90C3VEGJMWPSSK","effects":[["render-ui","@config.reviewSlot",null]]}]},"config":{"reviewSlot":{"type":"slot","default":"modal","label":"Review slot","description":"UI slot the review queue renders into. Defaults to the modal overlay so the queue never seizes the host's main content; summoned via OPEN, cleared via CLOSE.","tier":"internal"},"enabled":{"type":"boolean","default":false,"label":"Require approval","description":"Require sign-off before a record is finalized. Off by default.","synonyms":"enable, turn on, enforce, require, activate, apply, switch on, approval, needs approval, sign-off, signed off, review before, gatekeeper, editor approval, publishing approval, draft approval, content review, requires approval, manager approval, supervisor approval, admin approval, before going live","tier":"policy"},"itemActions":{"type":"[ItemAction]","default":[{"event":"OPEN_SUBJECT","icon":"eye","label":"View","variant":"ghost"},{"event":"APPROVE","icon":"check","label":"Approve","variant":"primary"},{"event":"DENY","icon":"x","label":"Deny","variant":"danger"}],"label":"Row actions","description":"Actions offered on each row; give an item `roles` to show it only to those viewer roles.","tier":"presentation","items":{"type":"object","properties":{"icon":{"name":"icon","type":"string","required":false},"when":{"name":"when","type":"SExpr","required":false},"roles":{"name":"roles","type":"array","required":false,"items":{"type":"string"}},"event":{"name":"event","type":"event","required":false},"variant":{"name":"variant","type":"string","required":false},"label":{"name":"label","type":"string","required":true}}}},"viewerRole":{"type":"string","default":"","label":"Viewer's role","description":"The signed-in viewer's role that each action's `roles` is checked against. Bind it explicitly at the call site (e.g. `viewerRole: @user.role`) in an app whose identity carries a role; left empty, only actions with no `roles` show.","tier":"policy"},"approverRoles":{"type":"[string]","default":[],"label":"Who can approve requests?","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).","synonyms":"approver, reviewer, authorized roles, sign-off roles, who approves","tier":"policy","items":{"type":"string"}},"tableLook":{"type":"string","default":"dense","label":"Review queue table style","description":"Visual treatment for the approval-queue data table.","synonyms":"table style, grid look, compact, spacious, striped","tier":"presentation","values":["dense","spacious","striped","borderless","card-rows"]},"blockSelfApproval":{"type":"boolean","default":false,"label":"Block approving your own requests?","description":"When on, a reviewer cannot APPROVE a request they submitted themselves (requestedBy = the viewer's id) — enforced by the APPROVE transition guard, from the button or from the bus. Requires hosts to stamp requestedBy at request creation. DENY stays allowed on your own request (denying your own request withdraws it). Off by default.","synonyms":"self approval, self-approval, four eyes, four-eyes, separation of duties, cannot approve own, no self sign-off, dual control","tier":"policy"},"itemClickEvent":{"type":"event","default":"OPEN_SUBJECT","label":"Row click","description":"Event emitted when a row is clicked; opens the subject under review. Empty disables the row click.","tier":"presentation","refId":"evt_T1J65W89XH4YRTYM57QM1W5ZZP"}},"scope":"collection","typeParams":[{"name":"p","kind":"Entity"}]}],"pages":[{"name":"ApprovalGateReviewPage","id":"pag_24Y2VMS43ZJ1ZR1XKCWJHMSER6","path":"/approvals/queue","traits":[{"ref":"ApprovalGateReview","refId":"trt_0380ZTKN4RTJC4JSD6H48CK9MY"}]}],"types":{"DenyCommit":[{"name":"id","type":"string","required":true},{"name":"notes","type":"string"}],"ItemAction":[{"name":"label","type":"string","required":true},{"name":"event","type":"event"},{"name":"variant","type":"string"},{"name":"icon","type":"string"},{"name":"roles","type":"[string]"},{"name":"when","type":"SExpr"}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_RHD868NFTHQX8X1NVP40WHT37D":{"id":"ent_RHD868NFTHQX8X1NVP40WHT37D","kind":"entity","bakedName":"ApprovalRequest","curName":"ApprovalRequest","renames":[],"owner":"workspace"},"evt_0EP4VEQCCFP67ZEN3TVAN67T85":{"id":"evt_0EP4VEQCCFP67ZEN3TVAN67T85","kind":"event","bakedName":"ApprovalRequestReviewFailed","curName":"ApprovalRequestReviewFailed","renames":[],"owner":"workspace","parent":"trt_0380ZTKN4RTJC4JSD6H48CK9MY"},"evt_175085C5M52T2SS2WHZRF8P52T":{"id":"evt_175085C5M52T2SS2WHZRF8P52T","kind":"event","bakedName":"CONFIRM_DENY","curName":"CONFIRM_DENY","renames":[],"owner":"workspace","parent":"trt_0380ZTKN4RTJC4JSD6H48CK9MY"},"evt_4T4NEH25ND2TPR2KGREPNJPB1B":{"id":"evt_4T4NEH25ND2TPR2KGREPNJPB1B","kind":"event","bakedName":"APPROVE","curName":"APPROVE","renames":[],"owner":"workspace","parent":"trt_0380ZTKN4RTJC4JSD6H48CK9MY"},"evt_5MNE8EC51V2GXH0F0QN1WRQMY0":{"id":"evt_5MNE8EC51V2GXH0F0QN1WRQMY0","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_0380ZTKN4RTJC4JSD6H48CK9MY"},"evt_CRE6YWV91FMGQW6XGDFSF4K17X":{"id":"evt_CRE6YWV91FMGQW6XGDFSF4K17X","kind":"event","bakedName":"ApprovalRequestLoadFailed","curName":"ApprovalRequestLoadFailed","renames":[],"owner":"workspace","parent":"trt_0380ZTKN4RTJC4JSD6H48CK9MY"},"evt_HDQK9DN4WJJE90C3VEGJMWPSSK":{"id":"evt_HDQK9DN4WJJE90C3VEGJMWPSSK","kind":"event","bakedName":"CLOSE","curName":"CLOSE","renames":[],"owner":"workspace","parent":"trt_0380ZTKN4RTJC4JSD6H48CK9MY"},"evt_HXXJW22J7K93SZJV6F963QC4Q8":{"id":"evt_HXXJW22J7K93SZJV6F963QC4Q8","kind":"event","bakedName":"ApprovalDenied","curName":"ApprovalDenied","renames":[],"owner":"workspace","parent":"trt_0380ZTKN4RTJC4JSD6H48CK9MY"},"evt_JGR6YDM8BG45RB1CGAMBZB8JNP":{"id":"evt_JGR6YDM8BG45RB1CGAMBZB8JNP","kind":"event","bakedName":"DENY","curName":"DENY","renames":[],"owner":"workspace","parent":"trt_0380ZTKN4RTJC4JSD6H48CK9MY"},"evt_KK89PCP4D526JHH5AKFWPHCHZ6":{"id":"evt_KK89PCP4D526JHH5AKFWPHCHZ6","kind":"event","bakedName":"CANCEL_DENY","curName":"CANCEL_DENY","renames":[],"owner":"workspace","parent":"trt_0380ZTKN4RTJC4JSD6H48CK9MY"},"evt_Q1FM2ANZ4YZJF0F90G9RR8NECQ":{"id":"evt_Q1FM2ANZ4YZJF0F90G9RR8NECQ","kind":"event","bakedName":"APPROVAL_REPLAY_FAILED","curName":"APPROVAL_REPLAY_FAILED","renames":[],"owner":"workspace","parent":"trt_0380ZTKN4RTJC4JSD6H48CK9MY"},"evt_RC47PFV368HK4535PVWQWKS3MZ":{"id":"evt_RC47PFV368HK4535PVWQWKS3MZ","kind":"event","bakedName":"ApprovalRequestLoaded","curName":"ApprovalRequestLoaded","renames":[],"owner":"workspace","parent":"trt_0380ZTKN4RTJC4JSD6H48CK9MY"},"evt_S9CE4D2DFF6QQGRQG5YPK2N76C":{"id":"evt_S9CE4D2DFF6QQGRQG5YPK2N76C","kind":"event","bakedName":"OPEN","curName":"OPEN","renames":[],"owner":"workspace","parent":"trt_0380ZTKN4RTJC4JSD6H48CK9MY"},"evt_T1J65W89XH4YRTYM57QM1W5ZZP":{"id":"evt_T1J65W89XH4YRTYM57QM1W5ZZP","kind":"event","bakedName":"OPEN_SUBJECT","curName":"OPEN_SUBJECT","renames":[],"owner":"workspace","parent":"trt_0380ZTKN4RTJC4JSD6H48CK9MY"},"evt_W7SA338X5MEJT9XWWK0ZRKR0E7":{"id":"evt_W7SA338X5MEJT9XWWK0ZRKR0E7","kind":"event","bakedName":"ApprovalRequestReviewed","curName":"ApprovalRequestReviewed","renames":[],"owner":"workspace","parent":"trt_0380ZTKN4RTJC4JSD6H48CK9MY"},"evt_ZNTAM4EABM55T7A9SD59550RFN":{"id":"evt_ZNTAM4EABM55T7A9SD59550RFN","kind":"event","bakedName":"ApprovalGranted","curName":"ApprovalGranted","renames":[],"owner":"workspace","parent":"trt_0380ZTKN4RTJC4JSD6H48CK9MY"},"orb_C47DR6W7883M466T0XHH12YMAQ":{"id":"orb_C47DR6W7883M466T0XHH12YMAQ","kind":"orbital","bakedName":"ApprovalGateOrbital","curName":"ApprovalGateOrbital","renames":[],"owner":"workspace"},"pag_24Y2VMS43ZJ1ZR1XKCWJHMSER6":{"id":"pag_24Y2VMS43ZJ1ZR1XKCWJHMSER6","kind":"page","bakedName":"ApprovalGateReviewPage","curName":"ApprovalGateReviewPage","renames":[],"owner":"workspace"},"trt_0380ZTKN4RTJC4JSD6H48CK9MY":{"id":"trt_0380ZTKN4RTJC4JSD6H48CK9MY","kind":"trait","bakedName":"ApprovalGateReview","curName":"ApprovalGateReview","renames":[],"owner":"workspace"},"trt_7ZRX4FHWYYYFF92MNANE0PZF9G":{"id":"trt_7ZRX4FHWYYYFF92MNANE0PZF9G","kind":"trait","bakedName":"ErrorSpinner","curName":"ErrorSpinner","renames":[],"owner":"workspace"},"trt_96ATJ2K01YG0ZA385FMHPBNGC5":{"id":"trt_96ATJ2K01YG0ZA385FMHPBNGC5","kind":"trait","bakedName":"ShieldCheckIcon","curName":"ShieldCheckIcon","renames":[],"owner":"workspace"},"trt_BAA9G5YBEM5QA1NDKA9Q1XC940":{"id":"trt_BAA9G5YBEM5QA1NDKA9Q1XC940","kind":"trait","bakedName":"CloseButton","curName":"CloseButton","renames":[],"owner":"workspace"},"trt_BEBDJHPFW07Y06D1VMN21FN0JJ":{"id":"trt_BEBDJHPFW07Y06D1VMN21FN0JJ","kind":"trait","bakedName":"LoadingText","curName":"LoadingText","renames":[],"owner":"workspace"},"trt_DR8Z4MA8YB4F5M7YNVTA5ZVN0A":{"id":"trt_DR8Z4MA8YB4F5M7YNVTA5ZVN0A","kind":"trait","bakedName":"ErrorAlert","curName":"ErrorAlert","renames":[],"owner":"workspace"},"trt_H9BXNCBJZPSFV9EWZX6GQ65Y3V":{"id":"trt_H9BXNCBJZPSFV9EWZX6GQ65Y3V","kind":"trait","bakedName":"LoadingSpinner","curName":"LoadingSpinner","renames":[],"owner":"workspace"},"trt_MMHEPF3R0TW0DB4C0A82C1P6A4":{"id":"trt_MMHEPF3R0TW0DB4C0A82C1P6A4","kind":"trait","bakedName":"ApprovalDivider","curName":"ApprovalDivider","renames":[],"owner":"workspace"},"trt_RWMH37FBGHNR8Z65VXXBXQR9XH":{"id":"trt_RWMH37FBGHNR8Z65VXXBXQR9XH","kind":"trait","bakedName":"ApprovalQueueTitle","curName":"ApprovalQueueTitle","renames":[],"owner":"workspace"},"trt_TEWAFEG1NB0TNJ55E6MYRD7PM9":{"id":"trt_TEWAFEG1NB0TNJ55E6MYRD7PM9","kind":"trait","bakedName":"DenyReasonHint","curName":"DenyReasonHint","renames":[],"owner":"workspace"},"trt_YA6J959W4TY2DEBPBGX4FGM2JK":{"id":"trt_YA6J959W4TY2DEBPBGX4FGM2JK","kind":"trait","bakedName":"DenyReasonTitle","curName":"DenyReasonTitle","renames":[],"owner":"workspace"}}}}
|
|
1
|
+
{"name":"std-approval-gate","version":"1.1.0","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. blockSelfApproval additionally stops a reviewer approving their own request (four-eyes) — DENY stays allowed as self-withdrawal. 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.","orbitals":[{"name":"ApprovalGateOrbital","id":"orb_C47DR6W7883M466T0XHH12YMAQ","uses":[{"from":"std/behaviors/ui-spinner","as":"Spinner"},{"from":"std/behaviors/ui-typography","as":"Typography"},{"from":"std/behaviors/ui-icon","as":"Icon"},{"from":"std/behaviors/ui-button","as":"Button"},{"from":"std/behaviors/ui-divider","as":"Divider"},{"from":"std/behaviors/ui-alert","as":"Alert"}],"entity":{"name":"ApprovalRequest","id":"ent_RHD868NFTHQX8X1NVP40WHT37D","collection":"approval_requests","persistence":"persistent","fields":[{"name":"id","type":"string","required":true},{"name":"gatedEvent","type":"string","default":"","description":"The event that triggered the approval request.","synonyms":"trigger, event, source"},{"name":"subjectLabel","type":"string","default":"","description":"Human title of the thing being approved (the article's headline, the page's title) — what the reviewer sees in the queue.","synonyms":"title, subject, what is being approved"},{"name":"subjectId","type":"string","default":"","description":"Id of the record being approved, for a queue row's View click-through to the subject's own surface.","synonyms":"record id, target id, article id, page id"},{"name":"requestedBy","type":"string","default":"","description":"User id of the submitter.","synonyms":"submitter, author, requester id"},{"name":"requestedByName","type":"string","default":"","description":"Display name of the submitter shown in the queue.","synonyms":"submitter name, requester, who asked"},{"name":"status","type":"string","default":"pending","values":["pending","approved","denied","escalated"],"description":"Current state of the approval process.","synonyms":"approval status, state, condition"},{"name":"reviewer","type":"string","default":"","description":"The user or system responsible for reviewing the request.","synonyms":"assignee, owner, approver, responsible party"},{"name":"requestedAt","type":"number","default":0,"description":"Timestamp indicating when the approval request was initiated.","synonyms":"creation time, request date, submission time"},{"name":"decidedAt","type":"number","default":0,"description":"Timestamp indicating when a decision was made on the request.","synonyms":"decision time, resolved at, completed at"},{"name":"escalatedAt","type":"number","default":0,"description":"Timestamp indicating when the request was escalated.","synonyms":"escalation time, escalation timestamp, escalated time"},{"name":"notes","type":"string","default":"","description":"The reviewer's written reason, captured by the deny step.","synonyms":"comments, remarks, explanation, reason, details"},{"name":"payload","type":"string","default":"","description":"The held data of the gated action as JSON text, replayed by the downstream listener when the request is granted.","synonyms":"request data, held payload, pending data, gated data"}],"access_waivers":{"read":"Shared review surface: submitters watch their requests, approvers work the queue; decision authority is enforced at the transitions, not by hiding rows."}},"traits":[{"ref":"Spinner.traits.SpinnerRender","id":"trt_H9BXNCBJZPSFV9EWZX6GQ65Y3V","name":"LoadingSpinner","linkedEntity":"ApprovalRequest","linkedEntityId":"ent_RHD868NFTHQX8X1NVP40WHT37D"},{"ref":"Spinner.traits.SpinnerRender","id":"trt_7ZRX4FHWYYYFF92MNANE0PZF9G","name":"ErrorSpinner","linkedEntity":"ApprovalRequest","linkedEntityId":"ent_RHD868NFTHQX8X1NVP40WHT37D","config":{"size":{"type":"unknown","default":"sm"}}},{"ref":"Typography.traits.TypographyRender","id":"trt_BEBDJHPFW07Y06D1VMN21FN0JJ","name":"LoadingText","linkedEntity":"ApprovalRequest","linkedEntityId":"ent_RHD868NFTHQX8X1NVP40WHT37D","config":{"variant":{"type":"unknown","default":"caption"},"color":{"type":"unknown","default":"muted"},"content":{"type":"unknown","default":"Loading approval queue…"}}},{"ref":"Icon.traits.IconRender","id":"trt_96ATJ2K01YG0ZA385FMHPBNGC5","name":"ShieldCheckIcon","linkedEntity":"ApprovalRequest","linkedEntityId":"ent_RHD868NFTHQX8X1NVP40WHT37D","config":{"name":{"type":"unknown","default":"shield-check"}}},{"ref":"Typography.traits.TypographyRender","id":"trt_RWMH37FBGHNR8Z65VXXBXQR9XH","name":"ApprovalQueueTitle","linkedEntity":"ApprovalRequest","linkedEntityId":"ent_RHD868NFTHQX8X1NVP40WHT37D","config":{"variant":{"type":"unknown","default":"h3"},"content":{"type":"unknown","default":"Approval queue"}}},{"ref":"Typography.traits.TypographyRender","id":"trt_YA6J959W4TY2DEBPBGX4FGM2JK","name":"DenyReasonTitle","linkedEntity":"ApprovalRequest","linkedEntityId":"ent_RHD868NFTHQX8X1NVP40WHT37D","config":{"content":{"type":"unknown","default":"Deny request"},"variant":{"type":"unknown","default":"h3"}}},{"ref":"Typography.traits.TypographyRender","id":"trt_TEWAFEG1NB0TNJ55E6MYRD7PM9","name":"DenyReasonHint","linkedEntity":"ApprovalRequest","linkedEntityId":"ent_RHD868NFTHQX8X1NVP40WHT37D","config":{"color":{"type":"unknown","default":"muted"},"variant":{"type":"unknown","default":"caption"},"content":{"type":"unknown","default":"Tell the submitter why — the reason is recorded on the request."}}},{"ref":"Button.traits.ButtonRender","id":"trt_BAA9G5YBEM5QA1NDKA9Q1XC940","name":"CloseButton","linkedEntity":"ApprovalRequest","linkedEntityId":"ent_RHD868NFTHQX8X1NVP40WHT37D","config":{"variant":{"type":"unknown","default":"ghost"},"label":{"type":"unknown","default":"Close"},"icon":{"type":"unknown","default":"x"},"action":{"type":"unknown","default":"CLOSE"}}},{"ref":"Divider.traits.DividerRender","id":"trt_MMHEPF3R0TW0DB4C0A82C1P6A4","name":"ApprovalDivider","linkedEntity":"ApprovalRequest","linkedEntityId":"ent_RHD868NFTHQX8X1NVP40WHT37D"},{"ref":"Alert.traits.AlertRender","id":"trt_DR8Z4MA8YB4F5M7YNVTA5ZVN0A","name":"ErrorAlert","linkedEntity":"ApprovalRequest","linkedEntityId":"ent_RHD868NFTHQX8X1NVP40WHT37D","config":{"variant":{"type":"unknown","default":"error"},"message":{"type":"unknown","default":"@payload.error"}}},{"name":"ApprovalGateReview","id":"trt_0380ZTKN4RTJC4JSD6H48CK9MY","entityRebindable":true,"entityContract":{"requires":[],"provides":["decidedAt","notes","reviewer","status","subjectLabel"]},"effectRow":[{"kind":"emit","resource":"ApprovalDenied"},{"kind":"emit","resource":"ApprovalGranted"},{"kind":"fetch","resource":"ApprovalRequest"},{"kind":"persist","resource":"ApprovalRequest"},{"kind":"render-ui","resource":"@config.reviewSlot","resolved":false},{"kind":"render-ui","resource":"toast"},{"kind":"set","resource":"@entity.decidedAt"},{"kind":"set","resource":"@entity.id"},{"kind":"set","resource":"@entity.notes"},{"kind":"set","resource":"@entity.reviewer"},{"kind":"set","resource":"@entity.status"},{"kind":"set","resource":"@entity.subjectLabel"}],"category":"interaction","capabilities":["approval"],"linkedEntity":"ApprovalRequest","linkedEntityId":"ent_RHD868NFTHQX8X1NVP40WHT37D","entityRefIds":{"ApprovalRequest":"ent_RHD868NFTHQX8X1NVP40WHT37D"},"traitEmbedIds":{"ShieldCheckIcon":"trt_96ATJ2K01YG0ZA385FMHPBNGC5","DenyReasonTitle":"trt_YA6J959W4TY2DEBPBGX4FGM2JK","ApprovalDivider":"trt_MMHEPF3R0TW0DB4C0A82C1P6A4","CloseButton":"trt_BAA9G5YBEM5QA1NDKA9Q1XC940","DenyReasonHint":"trt_TEWAFEG1NB0TNJ55E6MYRD7PM9","ErrorAlert":"trt_DR8Z4MA8YB4F5M7YNVTA5ZVN0A","LoadingSpinner":"trt_H9BXNCBJZPSFV9EWZX6GQ65Y3V","LoadingText":"trt_BEBDJHPFW07Y06D1VMN21FN0JJ","ErrorSpinner":"trt_7ZRX4FHWYYYFF92MNANE0PZF9G","ApprovalQueueTitle":"trt_RWMH37FBGHNR8Z65VXXBXQR9XH"},"emits":[{"event":"APPROVE","eventId":"evt_4T4NEH25ND2TPR2KGREPNJPB1B","description":"Signals that an approval request has been approved.","synonyms":"accept, authorize, confirm, pass","tier":"domain","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"row","type":"object","properties":[{"name":"id","type":"string","required":true},{"name":"gatedEvent","type":"string"},{"name":"subjectLabel","type":"string"},{"name":"subjectId","type":"string"},{"name":"requestedBy","type":"string"},{"name":"requestedByName","type":"string"},{"name":"status","type":"string","values":["pending","approved","denied","escalated"]},{"name":"reviewer","type":"string"},{"name":"requestedAt","type":"number"},{"name":"decidedAt","type":"number"},{"name":"escalatedAt","type":"number"},{"name":"notes","type":"string"},{"name":"payload","type":"string"}],"entity":"ApprovalRequest"}]},{"event":"DENY","eventId":"evt_JGR6YDM8BG45RB1CGAMBZB8JNP","description":"Opens the deny step for a request; the decision commits with the written reason.","synonyms":"reject, decline","tier":"domain","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"row","type":"object","properties":[{"name":"id","type":"string","required":true},{"name":"gatedEvent","type":"string"},{"name":"subjectLabel","type":"string"},{"name":"subjectId","type":"string"},{"name":"requestedBy","type":"string"},{"name":"requestedByName","type":"string"},{"name":"status","type":"string","values":["pending","approved","denied","escalated"]},{"name":"reviewer","type":"string"},{"name":"requestedAt","type":"number"},{"name":"decidedAt","type":"number"},{"name":"escalatedAt","type":"number"},{"name":"notes","type":"string"},{"name":"payload","type":"string"}],"entity":"ApprovalRequest"}]},{"event":"OPEN_SUBJECT","eventId":"evt_T1J65W89XH4YRTYM57QM1W5ZZP","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.","synonyms":"view subject, open record, inspect request, see the article","tier":"domain","scope":"external","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"row","type":"object","properties":[{"name":"id","type":"string","required":true},{"name":"gatedEvent","type":"string"},{"name":"subjectLabel","type":"string"},{"name":"subjectId","type":"string"},{"name":"requestedBy","type":"string"},{"name":"requestedByName","type":"string"},{"name":"status","type":"string","values":["pending","approved","denied","escalated"]},{"name":"reviewer","type":"string"},{"name":"requestedAt","type":"number"},{"name":"decidedAt","type":"number"},{"name":"escalatedAt","type":"number"},{"name":"notes","type":"string"},{"name":"payload","type":"string"}],"entity":"ApprovalRequest"},{"name":"subjectId","type":"string"},{"name":"subjectLabel","type":"string"}]},{"event":"CONFIRM_DENY","eventId":"evt_175085C5M52T2SS2WHZRF8P52T","description":"The deny form committed; data carries the request id + the written reason.","synonyms":"submit denial, confirm rejection","tier":"internal","payloadSchema":[{"name":"data","type":"object","properties":[{"name":"id","type":"string","required":true},{"name":"notes","type":"string"}]}]},{"event":"CANCEL_DENY","eventId":"evt_KK89PCP4D526JHH5AKFWPHCHZ6","description":"The deny form was dismissed without committing; the queue repaints.","synonyms":"cancel denial, back to queue","tier":"internal"},{"event":"CLOSE","eventId":"evt_HDQK9DN4WJJE90C3VEGJMWPSSK","description":"Dismisses the review queue overlay.","synonyms":"dismiss, hide, cancel, done","tier":"domain"},{"event":"ApprovalGranted","eventId":"evt_ZNTAM4EABM55T7A9SD59550RFN","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.","synonyms":"approved, authorized, confirmed, validated","tier":"domain","scope":"external","payloadSchema":[{"name":"requestId","type":"string"},{"name":"payload","type":"$p"}]},{"event":"ApprovalDenied","eventId":"evt_HXXJW22J7K93SZJV6F963QC4Q8","description":"Indicates an approval request has been denied, with the reviewer's written reason.","synonyms":"rejected, declined","tier":"domain","scope":"external","payloadSchema":[{"name":"requestId","type":"string"},{"name":"reason","type":"string"}]},{"event":"ApprovalRequestLoaded","eventId":"evt_RC47PFV368HK4535PVWQWKS3MZ","description":"Indicates an approval request has been successfully loaded.","synonyms":"loaded, fetched, retrieved","tier":"internal","payloadSchema":[{"name":"data","type":"[object]","properties":[{"name":"id","type":"string","required":true},{"name":"gatedEvent","type":"string"},{"name":"subjectLabel","type":"string"},{"name":"subjectId","type":"string"},{"name":"requestedBy","type":"string"},{"name":"requestedByName","type":"string"},{"name":"status","type":"string","values":["pending","approved","denied","escalated"]},{"name":"reviewer","type":"string"},{"name":"requestedAt","type":"number"},{"name":"decidedAt","type":"number"},{"name":"escalatedAt","type":"number"},{"name":"notes","type":"string"},{"name":"payload","type":"string"}],"entity":"ApprovalRequest"}]},{"event":"ApprovalRequestLoadFailed","eventId":"evt_CRE6YWV91FMGQW6XGDFSF4K17X","description":"Indicates failure to load an approval request.","synonyms":"load error, failed load, request failure","tier":"internal","payloadSchema":[{"name":"error","type":"string"},{"name":"code","type":"string"}]},{"event":"ApprovalRequestReviewed","eventId":"evt_W7SA338X5MEJT9XWWK0ZRKR0E7","description":"Signals that an approval request has been reviewed.","synonyms":"reviewed, processed, examined","tier":"internal","scope":"internal","payloadSchema":[{"name":"value","type":"@entity"}]},{"event":"ApprovalRequestReviewFailed","eventId":"evt_0EP4VEQCCFP67ZEN3TVAN67T85","description":"Indicates a failure to load or process an approval request for review.","synonyms":"load error, failed review, processing failure","tier":"internal","payloadSchema":[{"name":"error","type":"string"},{"name":"code","type":"string"}]}],"stateMachine":{"states":[{"name":"idle","isInitial":true},{"name":"loading"},{"name":"reviewing"},{"name":"denying"},{"name":"error"}],"events":[{"key":"INIT","id":"evt_5MNE8EC51V2GXH0F0QN1WRQMY0","name":"Initialize"},{"key":"ApprovalRequestLoaded","id":"evt_RC47PFV368HK4535PVWQWKS3MZ","name":"ApprovalRequest loaded","description":"Indicates an approval request has been successfully loaded.","synonyms":"loaded, fetched, retrieved","tier":"internal","payloadSchema":[{"name":"data","type":"[object]","properties":[{"name":"id","type":"string","required":true},{"name":"gatedEvent","type":"string"},{"name":"subjectLabel","type":"string"},{"name":"subjectId","type":"string"},{"name":"requestedBy","type":"string"},{"name":"requestedByName","type":"string"},{"name":"status","type":"string","values":["pending","approved","denied","escalated"]},{"name":"reviewer","type":"string"},{"name":"requestedAt","type":"number"},{"name":"decidedAt","type":"number"},{"name":"escalatedAt","type":"number"},{"name":"notes","type":"string"},{"name":"payload","type":"string"}],"entity":"ApprovalRequest"}],"listened":true},{"key":"ApprovalRequestLoadFailed","id":"evt_CRE6YWV91FMGQW6XGDFSF4K17X","name":"ApprovalRequest load failed","description":"Indicates failure to load an approval request.","synonyms":"load error, failed load, request failure","tier":"internal","payloadSchema":[{"name":"error","type":"string"},{"name":"code","type":"string"}],"listened":true},{"key":"APPROVAL_REPLAY_FAILED","id":"evt_Q1FM2ANZ4YZJF0F90G9RR8NECQ","name":"Approval Replay Failed","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.","synonyms":"replay failed, apply failed, approval rollback","tier":"domain","payloadSchema":[{"name":"requestId","type":"string","required":true},{"name":"error","type":"string"}],"listened":true},{"key":"ApprovalRequestReviewFailed","id":"evt_0EP4VEQCCFP67ZEN3TVAN67T85","name":"ApprovalRequest review failed","description":"Indicates a failure to load or process an approval request for review.","synonyms":"load error, failed review, processing failure","tier":"internal","payloadSchema":[{"name":"error","type":"string"},{"name":"code","type":"string"}],"listened":true},{"key":"OPEN","id":"evt_S9CE4D2DFF6QQGRQG5YPK2N76C","name":"Open","description":"Summons the review queue (host nav/affordance requests it).","synonyms":"open, show, review, view queue, open approvals","tier":"domain","listened":true},{"key":"CLOSE","id":"evt_HDQK9DN4WJJE90C3VEGJMWPSSK","name":"Close","description":"Dismisses the review queue overlay.","synonyms":"dismiss, hide, cancel, done","tier":"domain","listened":true},{"key":"APPROVE","id":"evt_4T4NEH25ND2TPR2KGREPNJPB1B","name":"Approve","description":"Signals that an approval request has been approved.","synonyms":"accept, authorize, confirm, pass","tier":"domain","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"row","type":"object","properties":[{"name":"id","type":"string","required":true},{"name":"gatedEvent","type":"string"},{"name":"subjectLabel","type":"string"},{"name":"subjectId","type":"string"},{"name":"requestedBy","type":"string"},{"name":"requestedByName","type":"string"},{"name":"status","type":"string","values":["pending","approved","denied","escalated"]},{"name":"reviewer","type":"string"},{"name":"requestedAt","type":"number"},{"name":"decidedAt","type":"number"},{"name":"escalatedAt","type":"number"},{"name":"notes","type":"string"},{"name":"payload","type":"string"}],"entity":"ApprovalRequest"}],"listened":true},{"key":"DENY","id":"evt_JGR6YDM8BG45RB1CGAMBZB8JNP","name":"Deny","description":"Opens the deny step for a request; the decision commits with the written reason.","synonyms":"reject, decline","tier":"domain","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"row","type":"object","properties":[{"name":"id","type":"string","required":true},{"name":"gatedEvent","type":"string"},{"name":"subjectLabel","type":"string"},{"name":"subjectId","type":"string"},{"name":"requestedBy","type":"string"},{"name":"requestedByName","type":"string"},{"name":"status","type":"string","values":["pending","approved","denied","escalated"]},{"name":"reviewer","type":"string"},{"name":"requestedAt","type":"number"},{"name":"decidedAt","type":"number"},{"name":"escalatedAt","type":"number"},{"name":"notes","type":"string"},{"name":"payload","type":"string"}],"entity":"ApprovalRequest"}],"listened":true},{"key":"OPEN_SUBJECT","id":"evt_T1J65W89XH4YRTYM57QM1W5ZZP","name":"Open Subject","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.","synonyms":"view subject, open record, inspect request, see the article","tier":"domain","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"subjectId","type":"string"},{"name":"subjectLabel","type":"string"}],"listened":true},{"key":"ApprovalRequestReviewed","id":"evt_W7SA338X5MEJT9XWWK0ZRKR0E7","name":"ApprovalRequest reviewed","description":"Signals that an approval request has been reviewed.","synonyms":"reviewed, processed, examined","tier":"internal","payloadSchema":[{"name":"value","type":"@entity"}],"listened":true},{"key":"CONFIRM_DENY","id":"evt_175085C5M52T2SS2WHZRF8P52T","name":"Confirm Deny","description":"The deny form committed; data carries the request id + the written reason.","synonyms":"submit denial, confirm rejection","tier":"internal","payloadSchema":[{"name":"data","type":"object","properties":[{"name":"id","type":"string","required":true},{"name":"notes","type":"string"}]}],"listened":true},{"key":"CANCEL_DENY","id":"evt_KK89PCP4D526JHH5AKFWPHCHZ6","name":"Cancel Deny","description":"The deny form was dismissed without committing; the queue repaints.","synonyms":"cancel denial, back to queue","tier":"internal","listened":true},{"key":"ApprovalGranted","id":"evt_ZNTAM4EABM55T7A9SD59550RFN","name":"Approval granted","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.","synonyms":"approved, authorized, confirmed, validated","tier":"domain","payloadSchema":[{"name":"requestId","type":"string"},{"name":"payload","type":"$p"}]},{"key":"ApprovalDenied","id":"evt_HXXJW22J7K93SZJV6F963QC4Q8","name":"Approval denied","description":"Indicates an approval request has been denied, with the reviewer's written reason.","synonyms":"rejected, declined","tier":"domain","payloadSchema":[{"name":"requestId","type":"string"},{"name":"reason","type":"string"}]}],"transitions":[{"from":"idle","to":"idle","event":"INIT","eventId":"evt_5MNE8EC51V2GXH0F0QN1WRQMY0","effects":[["fetch","ApprovalRequest",{"filter":["=",["object/get","@entity","status"],"pending"],"emit":{"failure":"ApprovalRequestLoadFailed","success":"ApprovalRequestLoaded"}}]]},{"from":"idle","to":"idle","event":"ApprovalRequestLoaded","eventId":"evt_RC47PFV368HK4535PVWQWKS3MZ"},{"from":"idle","to":"idle","event":"ApprovalRequestLoadFailed","eventId":"evt_CRE6YWV91FMGQW6XGDFSF4K17X","effects":[["render-ui","toast",{"type":"alert","variant":"error","message":["str/concat","Couldn't load the approval request — ","@payload.error"],"dismissible":true}]]},{"from":"idle","to":"idle","event":"APPROVAL_REPLAY_FAILED","eventId":"evt_Q1FM2ANZ4YZJF0F90G9RR8NECQ","effects":[["set","@entity.id","@payload.requestId"],["set","@entity.status","pending"],["set","@entity.reviewer",""],["set","@entity.decidedAt",0],["persist","update","ApprovalRequest","@entity",{"emit":{"failure":"ApprovalRequestReviewFailed","success":"ApprovalRequestReviewed"}}],["render-ui","toast",{"type":"alert","variant":"error","message":"Approval could not be applied — the request was reopened.","dismissible":true}]]},{"from":"idle","to":"idle","event":"ApprovalRequestReviewFailed","eventId":"evt_0EP4VEQCCFP67ZEN3TVAN67T85","effects":[["render-ui","toast",{"type":"alert","variant":"error","message":["str/concat","Couldn't reopen the approval request — ","@payload.error"],"dismissible":true}]]},{"from":"idle","to":"loading","event":"OPEN","eventId":"evt_S9CE4D2DFF6QQGRQG5YPK2N76C","guard":"@config.enabled","effects":[["fetch","ApprovalRequest",{"filter":["=",["object/get","@entity","status"],"pending"],"emit":{"failure":"ApprovalRequestLoadFailed","success":"ApprovalRequestLoaded"}}],["render-ui","@config.reviewSlot",{"align":"center","children":["@trait.LoadingSpinner","@trait.LoadingText"],"className":"py-12","direction":"vertical","gap":"md","type":"stack"}]]},{"from":"loading","to":"idle","event":"INIT","eventId":"evt_5MNE8EC51V2GXH0F0QN1WRQMY0","effects":[["render-ui","@config.reviewSlot",null],["fetch","ApprovalRequest",{"filter":["=",["object/get","@entity","status"],"pending"],"emit":{"failure":"ApprovalRequestLoadFailed","success":"ApprovalRequestLoaded"}}]]},{"from":"loading","to":"reviewing","event":"ApprovalRequestLoaded","eventId":"evt_RC47PFV368HK4535PVWQWKS3MZ","effects":[["render-ui","@config.reviewSlot",{"children":[{"align":"center","children":[{"align":"center","children":["@trait.ShieldCheckIcon","@trait.ApprovalQueueTitle"],"direction":"horizontal","gap":"sm","type":"stack"},"@trait.CloseButton"],"direction":"horizontal","gap":"sm","justify":"between","type":"stack"},"@trait.ApprovalDivider",{"cols":1,"entity":"@payload.data","fields":[{"label":"What","name":"subjectLabel","variant":"h4"},{"label":"Action","name":"gatedEvent","variant":"badge"},{"label":"Requested by","name":"requestedByName","variant":"caption"},{"label":"Requested","format":"date","name":"requestedAt","variant":"caption"}],"gap":"sm","itemClickEvent":"@config.itemClickEvent","itemActions":["array/filter","@config.itemActions",["fn","action",["or",["=",["array/len",["object/get","@action","roles",[]]],0],["array/includes",["object/get","@action","roles",[]],"@config.viewerRole"]]]],"look":"@config.tableLook","type":"data-grid"}],"direction":"vertical","gap":"md","type":"stack"}]]},{"from":"loading","to":"error","event":"ApprovalRequestLoadFailed","eventId":"evt_CRE6YWV91FMGQW6XGDFSF4K17X","effects":[["render-ui","@config.reviewSlot",{"children":["@trait.ErrorAlert"],"type":"stack"}]]},{"from":"loading","to":"idle","event":"CLOSE","eventId":"evt_HDQK9DN4WJJE90C3VEGJMWPSSK","effects":[["render-ui","@config.reviewSlot",null]]},{"from":"reviewing","to":"idle","event":"INIT","eventId":"evt_5MNE8EC51V2GXH0F0QN1WRQMY0","effects":[["render-ui","@config.reviewSlot",null],["fetch","ApprovalRequest",{"filter":["=",["object/get","@entity","status"],"pending"],"emit":{"failure":"ApprovalRequestLoadFailed","success":"ApprovalRequestLoaded"}}]]},{"from":"reviewing","to":"reviewing","event":"APPROVE","eventId":"evt_4T4NEH25ND2TPR2KGREPNJPB1B","guard":["and",["or",["=",["array/len","@config.approverRoles"],0],["array/includes","@config.approverRoles","@user.role"]],["or",["=","@config.blockSelfApproval",false],["!=",["object/get","@payload.row","requestedBy"],"@user.id"]]],"effects":[["set","@entity.id","@payload.id"],["set","@entity.status","approved"],["set","@entity.reviewer","@user.id"],["set","@entity.decidedAt",["time/now"]],["persist","update","ApprovalRequest","@entity",{"emit":{"failure":"ApprovalRequestReviewFailed","success":"ApprovalRequestReviewed"}}],["emit","ApprovalGranted",{"payload":["json/parse","@payload.row.payload","p"],"requestId":"@payload.id"}]]},{"from":"reviewing","to":"denying","event":"DENY","eventId":"evt_JGR6YDM8BG45RB1CGAMBZB8JNP","guard":["or",["=",["array/len","@config.approverRoles"],0],["array/includes","@config.approverRoles","@user.role"]],"effects":[["set","@entity.id","@payload.id"],["set","@entity.subjectLabel",["str/default",["object/get","@payload.row","subjectLabel"],""]],["render-ui","@config.reviewSlot",{"children":[{"align":"center","children":["@trait.DenyReasonTitle","@trait.CloseButton"],"direction":"horizontal","gap":"sm","justify":"between","type":"stack"},"@trait.DenyReasonHint","@trait.ApprovalDivider",{"cancelEvent":"CANCEL_DENY","entity":{"id":"@entity.id"},"fields":["notes"],"mode":"edit","submitEvent":"CONFIRM_DENY","type":"form-section"}],"direction":"vertical","gap":"md","type":"stack"}]]},{"from":"reviewing","to":"reviewing","event":"OPEN_SUBJECT","eventId":"evt_T1J65W89XH4YRTYM57QM1W5ZZP"},{"from":"reviewing","to":"loading","event":"ApprovalRequestReviewed","eventId":"evt_W7SA338X5MEJT9XWWK0ZRKR0E7","effects":[["fetch","ApprovalRequest",{"filter":["=",["object/get","@entity","status"],"pending"],"emit":{"failure":"ApprovalRequestLoadFailed","success":"ApprovalRequestLoaded"}}]]},{"from":"reviewing","to":"reviewing","event":"ApprovalRequestReviewFailed","eventId":"evt_0EP4VEQCCFP67ZEN3TVAN67T85","effects":[["render-ui","@config.reviewSlot",{"children":["@trait.ErrorAlert"],"type":"stack"}]]},{"from":"reviewing","to":"reviewing","event":"APPROVAL_REPLAY_FAILED","eventId":"evt_Q1FM2ANZ4YZJF0F90G9RR8NECQ","effects":[["set","@entity.id","@payload.requestId"],["set","@entity.status","pending"],["set","@entity.reviewer",""],["set","@entity.decidedAt",0],["persist","update","ApprovalRequest","@entity",{"emit":{"failure":"ApprovalRequestReviewFailed","success":"ApprovalRequestReviewed"}}],["render-ui","toast",{"type":"alert","variant":"error","message":"Approval could not be applied — the request was reopened.","dismissible":true}]]},{"from":"reviewing","to":"idle","event":"CLOSE","eventId":"evt_HDQK9DN4WJJE90C3VEGJMWPSSK","effects":[["render-ui","@config.reviewSlot",null]]},{"from":"denying","to":"idle","event":"INIT","eventId":"evt_5MNE8EC51V2GXH0F0QN1WRQMY0","effects":[["render-ui","@config.reviewSlot",null],["fetch","ApprovalRequest",{"filter":["=",["object/get","@entity","status"],"pending"],"emit":{"failure":"ApprovalRequestLoadFailed","success":"ApprovalRequestLoaded"}}]]},{"from":"denying","to":"reviewing","event":"CONFIRM_DENY","eventId":"evt_175085C5M52T2SS2WHZRF8P52T","effects":[["set","@entity.id",["object/get","@payload.data","id"]],["set","@entity.status","denied"],["set","@entity.reviewer","@user.id"],["set","@entity.decidedAt",["time/now"]],["set","@entity.notes",["str/default",["object/get","@payload.data","notes"],""]],["persist","update","ApprovalRequest","@entity",{"emit":{"failure":"ApprovalRequestReviewFailed","success":"ApprovalRequestReviewed"}}],["emit","ApprovalDenied",{"requestId":["object/get","@payload.data","id"],"reason":["str/default",["object/get","@payload.data","notes"],""]}]]},{"from":"denying","to":"loading","event":"CANCEL_DENY","eventId":"evt_KK89PCP4D526JHH5AKFWPHCHZ6","effects":[["fetch","ApprovalRequest",{"filter":["=",["object/get","@entity","status"],"pending"],"emit":{"failure":"ApprovalRequestLoadFailed","success":"ApprovalRequestLoaded"}}]]},{"from":"denying","to":"loading","event":"ApprovalRequestReviewed","eventId":"evt_W7SA338X5MEJT9XWWK0ZRKR0E7","effects":[["fetch","ApprovalRequest",{"filter":["=",["object/get","@entity","status"],"pending"],"emit":{"failure":"ApprovalRequestLoadFailed","success":"ApprovalRequestLoaded"}}]]},{"from":"denying","to":"denying","event":"ApprovalRequestReviewFailed","eventId":"evt_0EP4VEQCCFP67ZEN3TVAN67T85","effects":[["render-ui","@config.reviewSlot",{"children":["@trait.ErrorAlert"],"type":"stack"}]]},{"from":"denying","to":"idle","event":"CLOSE","eventId":"evt_HDQK9DN4WJJE90C3VEGJMWPSSK","effects":[["render-ui","@config.reviewSlot",null]]},{"from":"error","to":"idle","event":"INIT","eventId":"evt_5MNE8EC51V2GXH0F0QN1WRQMY0","effects":[["render-ui","@config.reviewSlot",null],["fetch","ApprovalRequest",{"filter":["=",["object/get","@entity","status"],"pending"],"emit":{"failure":"ApprovalRequestLoadFailed","success":"ApprovalRequestLoaded"}}]]},{"from":"error","to":"loading","event":"OPEN","eventId":"evt_S9CE4D2DFF6QQGRQG5YPK2N76C","effects":[["fetch","ApprovalRequest",{"filter":["=",["object/get","@entity","status"],"pending"],"emit":{"failure":"ApprovalRequestLoadFailed","success":"ApprovalRequestLoaded"}}],["render-ui","@config.reviewSlot",{"children":["@trait.ErrorSpinner"],"type":"stack"}]]},{"from":"error","to":"idle","event":"CLOSE","eventId":"evt_HDQK9DN4WJJE90C3VEGJMWPSSK","effects":[["render-ui","@config.reviewSlot",null]]}]},"config":{"viewerRole":{"type":"string","default":"","label":"Viewer's role","description":"The signed-in viewer's role that each action's `roles` is checked against. Bind it explicitly at the call site (e.g. `viewerRole: @user.role`) in an app whose identity carries a role; left empty, only actions with no `roles` show.","tier":"policy"},"tableLook":{"type":"string","default":"dense","label":"Review queue table style","description":"Visual treatment for the approval-queue data table.","synonyms":"table style, grid look, compact, spacious, striped","tier":"presentation","values":["dense","spacious","striped","borderless","card-rows"]},"approverRoles":{"type":"[string]","default":[],"label":"Who can approve requests?","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).","synonyms":"approver, reviewer, authorized roles, sign-off roles, who approves","tier":"policy","items":{"type":"string"}},"enabled":{"type":"boolean","default":false,"label":"Require approval","description":"Require sign-off before a record is finalized. Off by default.","synonyms":"enable, turn on, enforce, require, activate, apply, switch on, approval, needs approval, sign-off, signed off, review before, gatekeeper, editor approval, publishing approval, draft approval, content review, requires approval, manager approval, supervisor approval, admin approval, before going live","tier":"policy"},"blockSelfApproval":{"type":"boolean","default":false,"label":"Block approving your own requests?","description":"When on, a reviewer cannot APPROVE a request they submitted themselves (requestedBy = the viewer's id) — enforced by the APPROVE transition guard, from the button or from the bus. Requires hosts to stamp requestedBy at request creation. DENY stays allowed on your own request (denying your own request withdraws it). Off by default.","synonyms":"self approval, self-approval, four eyes, four-eyes, separation of duties, cannot approve own, no self sign-off, dual control","tier":"policy"},"reviewSlot":{"type":"slot","default":"modal","label":"Review slot","description":"UI slot the review queue renders into. Defaults to the modal overlay so the queue never seizes the host's main content; summoned via OPEN, cleared via CLOSE.","tier":"internal"},"itemActions":{"type":"[ItemAction]","default":[{"event":"OPEN_SUBJECT","icon":"eye","label":"View","variant":"ghost"},{"event":"APPROVE","icon":"check","label":"Approve","variant":"primary"},{"event":"DENY","icon":"x","label":"Deny","variant":"danger"}],"label":"Row actions","description":"Actions offered on each row; give an item `roles` to show it only to those viewer roles.","tier":"presentation","items":{"type":"object","properties":{"variant":{"name":"variant","type":"string","required":false},"icon":{"name":"icon","type":"string","required":false},"roles":{"name":"roles","type":"array","required":false,"items":{"type":"string"}},"label":{"name":"label","type":"string","required":true},"when":{"name":"when","type":"SExpr","required":false},"event":{"name":"event","type":"event","required":false}}}},"itemClickEvent":{"type":"event","default":"OPEN_SUBJECT","label":"Row click","description":"Event emitted when a row is clicked; opens the subject under review. Empty disables the row click.","tier":"presentation","refId":"evt_T1J65W89XH4YRTYM57QM1W5ZZP"}},"scope":"collection","typeParams":[{"name":"p","kind":"Entity"}]}],"pages":[{"name":"ApprovalGateReviewPage","id":"pag_24Y2VMS43ZJ1ZR1XKCWJHMSER6","path":"/approvals/queue","traits":[{"ref":"ApprovalGateReview","refId":"trt_0380ZTKN4RTJC4JSD6H48CK9MY"}]}],"types":{"DenyCommit":[{"name":"id","type":"string","required":true},{"name":"notes","type":"string"}],"ItemAction":[{"name":"label","type":"string","required":true},{"name":"event","type":"event"},{"name":"variant","type":"string"},{"name":"icon","type":"string"},{"name":"roles","type":"[string]"},{"name":"when","type":"SExpr"}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_RHD868NFTHQX8X1NVP40WHT37D":{"id":"ent_RHD868NFTHQX8X1NVP40WHT37D","kind":"entity","bakedName":"ApprovalRequest","curName":"ApprovalRequest","renames":[],"owner":"workspace"},"evt_0EP4VEQCCFP67ZEN3TVAN67T85":{"id":"evt_0EP4VEQCCFP67ZEN3TVAN67T85","kind":"event","bakedName":"ApprovalRequestReviewFailed","curName":"ApprovalRequestReviewFailed","renames":[],"owner":"workspace","parent":"trt_0380ZTKN4RTJC4JSD6H48CK9MY"},"evt_175085C5M52T2SS2WHZRF8P52T":{"id":"evt_175085C5M52T2SS2WHZRF8P52T","kind":"event","bakedName":"CONFIRM_DENY","curName":"CONFIRM_DENY","renames":[],"owner":"workspace","parent":"trt_0380ZTKN4RTJC4JSD6H48CK9MY"},"evt_4T4NEH25ND2TPR2KGREPNJPB1B":{"id":"evt_4T4NEH25ND2TPR2KGREPNJPB1B","kind":"event","bakedName":"APPROVE","curName":"APPROVE","renames":[],"owner":"workspace","parent":"trt_0380ZTKN4RTJC4JSD6H48CK9MY"},"evt_5MNE8EC51V2GXH0F0QN1WRQMY0":{"id":"evt_5MNE8EC51V2GXH0F0QN1WRQMY0","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_0380ZTKN4RTJC4JSD6H48CK9MY"},"evt_CRE6YWV91FMGQW6XGDFSF4K17X":{"id":"evt_CRE6YWV91FMGQW6XGDFSF4K17X","kind":"event","bakedName":"ApprovalRequestLoadFailed","curName":"ApprovalRequestLoadFailed","renames":[],"owner":"workspace","parent":"trt_0380ZTKN4RTJC4JSD6H48CK9MY"},"evt_HDQK9DN4WJJE90C3VEGJMWPSSK":{"id":"evt_HDQK9DN4WJJE90C3VEGJMWPSSK","kind":"event","bakedName":"CLOSE","curName":"CLOSE","renames":[],"owner":"workspace","parent":"trt_0380ZTKN4RTJC4JSD6H48CK9MY"},"evt_HXXJW22J7K93SZJV6F963QC4Q8":{"id":"evt_HXXJW22J7K93SZJV6F963QC4Q8","kind":"event","bakedName":"ApprovalDenied","curName":"ApprovalDenied","renames":[],"owner":"workspace","parent":"trt_0380ZTKN4RTJC4JSD6H48CK9MY"},"evt_JGR6YDM8BG45RB1CGAMBZB8JNP":{"id":"evt_JGR6YDM8BG45RB1CGAMBZB8JNP","kind":"event","bakedName":"DENY","curName":"DENY","renames":[],"owner":"workspace","parent":"trt_0380ZTKN4RTJC4JSD6H48CK9MY"},"evt_KK89PCP4D526JHH5AKFWPHCHZ6":{"id":"evt_KK89PCP4D526JHH5AKFWPHCHZ6","kind":"event","bakedName":"CANCEL_DENY","curName":"CANCEL_DENY","renames":[],"owner":"workspace","parent":"trt_0380ZTKN4RTJC4JSD6H48CK9MY"},"evt_Q1FM2ANZ4YZJF0F90G9RR8NECQ":{"id":"evt_Q1FM2ANZ4YZJF0F90G9RR8NECQ","kind":"event","bakedName":"APPROVAL_REPLAY_FAILED","curName":"APPROVAL_REPLAY_FAILED","renames":[],"owner":"workspace","parent":"trt_0380ZTKN4RTJC4JSD6H48CK9MY"},"evt_RC47PFV368HK4535PVWQWKS3MZ":{"id":"evt_RC47PFV368HK4535PVWQWKS3MZ","kind":"event","bakedName":"ApprovalRequestLoaded","curName":"ApprovalRequestLoaded","renames":[],"owner":"workspace","parent":"trt_0380ZTKN4RTJC4JSD6H48CK9MY"},"evt_S9CE4D2DFF6QQGRQG5YPK2N76C":{"id":"evt_S9CE4D2DFF6QQGRQG5YPK2N76C","kind":"event","bakedName":"OPEN","curName":"OPEN","renames":[],"owner":"workspace","parent":"trt_0380ZTKN4RTJC4JSD6H48CK9MY"},"evt_T1J65W89XH4YRTYM57QM1W5ZZP":{"id":"evt_T1J65W89XH4YRTYM57QM1W5ZZP","kind":"event","bakedName":"OPEN_SUBJECT","curName":"OPEN_SUBJECT","renames":[],"owner":"workspace","parent":"trt_0380ZTKN4RTJC4JSD6H48CK9MY"},"evt_W7SA338X5MEJT9XWWK0ZRKR0E7":{"id":"evt_W7SA338X5MEJT9XWWK0ZRKR0E7","kind":"event","bakedName":"ApprovalRequestReviewed","curName":"ApprovalRequestReviewed","renames":[],"owner":"workspace","parent":"trt_0380ZTKN4RTJC4JSD6H48CK9MY"},"evt_ZNTAM4EABM55T7A9SD59550RFN":{"id":"evt_ZNTAM4EABM55T7A9SD59550RFN","kind":"event","bakedName":"ApprovalGranted","curName":"ApprovalGranted","renames":[],"owner":"workspace","parent":"trt_0380ZTKN4RTJC4JSD6H48CK9MY"},"orb_C47DR6W7883M466T0XHH12YMAQ":{"id":"orb_C47DR6W7883M466T0XHH12YMAQ","kind":"orbital","bakedName":"ApprovalGateOrbital","curName":"ApprovalGateOrbital","renames":[],"owner":"workspace"},"pag_24Y2VMS43ZJ1ZR1XKCWJHMSER6":{"id":"pag_24Y2VMS43ZJ1ZR1XKCWJHMSER6","kind":"page","bakedName":"ApprovalGateReviewPage","curName":"ApprovalGateReviewPage","renames":[],"owner":"workspace"},"trt_0380ZTKN4RTJC4JSD6H48CK9MY":{"id":"trt_0380ZTKN4RTJC4JSD6H48CK9MY","kind":"trait","bakedName":"ApprovalGateReview","curName":"ApprovalGateReview","renames":[],"owner":"workspace"},"trt_7ZRX4FHWYYYFF92MNANE0PZF9G":{"id":"trt_7ZRX4FHWYYYFF92MNANE0PZF9G","kind":"trait","bakedName":"ErrorSpinner","curName":"ErrorSpinner","renames":[],"owner":"workspace"},"trt_96ATJ2K01YG0ZA385FMHPBNGC5":{"id":"trt_96ATJ2K01YG0ZA385FMHPBNGC5","kind":"trait","bakedName":"ShieldCheckIcon","curName":"ShieldCheckIcon","renames":[],"owner":"workspace"},"trt_BAA9G5YBEM5QA1NDKA9Q1XC940":{"id":"trt_BAA9G5YBEM5QA1NDKA9Q1XC940","kind":"trait","bakedName":"CloseButton","curName":"CloseButton","renames":[],"owner":"workspace"},"trt_BEBDJHPFW07Y06D1VMN21FN0JJ":{"id":"trt_BEBDJHPFW07Y06D1VMN21FN0JJ","kind":"trait","bakedName":"LoadingText","curName":"LoadingText","renames":[],"owner":"workspace"},"trt_DR8Z4MA8YB4F5M7YNVTA5ZVN0A":{"id":"trt_DR8Z4MA8YB4F5M7YNVTA5ZVN0A","kind":"trait","bakedName":"ErrorAlert","curName":"ErrorAlert","renames":[],"owner":"workspace"},"trt_H9BXNCBJZPSFV9EWZX6GQ65Y3V":{"id":"trt_H9BXNCBJZPSFV9EWZX6GQ65Y3V","kind":"trait","bakedName":"LoadingSpinner","curName":"LoadingSpinner","renames":[],"owner":"workspace"},"trt_MMHEPF3R0TW0DB4C0A82C1P6A4":{"id":"trt_MMHEPF3R0TW0DB4C0A82C1P6A4","kind":"trait","bakedName":"ApprovalDivider","curName":"ApprovalDivider","renames":[],"owner":"workspace"},"trt_RWMH37FBGHNR8Z65VXXBXQR9XH":{"id":"trt_RWMH37FBGHNR8Z65VXXBXQR9XH","kind":"trait","bakedName":"ApprovalQueueTitle","curName":"ApprovalQueueTitle","renames":[],"owner":"workspace"},"trt_TEWAFEG1NB0TNJ55E6MYRD7PM9":{"id":"trt_TEWAFEG1NB0TNJ55E6MYRD7PM9","kind":"trait","bakedName":"DenyReasonHint","curName":"DenyReasonHint","renames":[],"owner":"workspace"},"trt_YA6J959W4TY2DEBPBGX4FGM2JK":{"id":"trt_YA6J959W4TY2DEBPBGX4FGM2JK","kind":"trait","bakedName":"DenyReasonTitle","curName":"DenyReasonTitle","renames":[],"owner":"workspace"}}}}
|