@almadar/std 16.253.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/evals/eval-agent-builder.lolo +152 -0
- package/behaviors/lolo/agent/organisms/std-agent-builder.lolo +320 -26
- 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-memory.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-audit-capture.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-cross-reference.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-label-capture.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-detail-layout.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-geosearch.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":{"content":{"type":"unknown","default":"Loading approval queue…"},"variant":{"type":"unknown","default":"caption"},"color":{"type":"unknown","default":"muted"}}},{"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":{"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":{"icon":{"type":"unknown","default":"x"},"action":{"type":"unknown","default":"CLOSE"},"variant":{"type":"unknown","default":"ghost"},"label":{"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":{"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":{"LoadingSpinner":"trt_H9BXNCBJZPSFV9EWZX6GQ65Y3V","LoadingText":"trt_BEBDJHPFW07Y06D1VMN21FN0JJ","ErrorAlert":"trt_DR8Z4MA8YB4F5M7YNVTA5ZVN0A","ApprovalQueueTitle":"trt_RWMH37FBGHNR8Z65VXXBXQR9XH","ApprovalDivider":"trt_MMHEPF3R0TW0DB4C0A82C1P6A4","ShieldCheckIcon":"trt_96ATJ2K01YG0ZA385FMHPBNGC5","ErrorSpinner":"trt_7ZRX4FHWYYYFF92MNANE0PZF9G","CloseButton":"trt_BAA9G5YBEM5QA1NDKA9Q1XC940","DenyReasonTitle":"trt_YA6J959W4TY2DEBPBGX4FGM2JK","DenyReasonHint":"trt_TEWAFEG1NB0TNJ55E6MYRD7PM9"},"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":{"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"},"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"]},"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},"roles":{"name":"roles","type":"array","required":false,"items":{"type":"string"}},"event":{"name":"event","type":"event","required":false},"label":{"name":"label","type":"string","required":true},"variant":{"name":"variant","type":"string","required":false},"when":{"name":"when","type":"SExpr","required":false}}}},"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"},"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"}}}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"std-audit-capture","version":"1.3.0","description":"std-audit-capture — event-interceptor audit log / audit trail. Use when a user voices that a record's changes must be tracked, logged, or auditable (audit trail, track changes, change history, who edited what, mutation log, record changes, log every edit, edit history, modification log, who did what when, accountability log). Listens for the generic `EntityMutated` sentinel (rename via traitOverrides.events to the real mutation event, e.g. ContactSaved) and persists an AuditEntry row capturing actor, action, entity type/id, before/after snapshots, and timestamp. `captureEventTypes` filters on @payload.data.kind, or on the delivered event's own name when the payload carries no kind (empty = capture all). Every entry also records where the change came from — the delivering event, the behavior and module that emitted it, and the scheduled job when a tick caused it — with no change to the upstream emitter. Compose with `std-lifecycle` to apply retention. Composable via `extraTraits` to interpose audit logging behind any mutating trait.","orbitals":[{"name":"AuditCaptureOrbital","id":"orb_D7ET0XFFENQQARN7NQG8VE4RF9","entity":{"name":"AuditEntry","id":"ent_52WH1WQ71DKGPJCXHJZBAEQ6BX","collection":"audit_entries","persistence":"persistent","fields":[{"name":"id","type":"string","required":true},{"name":"actor","type":"string","default":"","description":"The user or system performing the action.","synonyms":"user, source, originator"},{"name":"action","type":"string","default":"","description":"The specific operation performed on the entity.","synonyms":"operation, event, activity, change"},{"name":"entityType","type":"string","default":"","description":"The type of entity that was modified.","synonyms":"type, kind, class"},{"name":"entityId","type":"string","default":"","description":"Unique identifier for the entity being audited.","synonyms":"entity identifier, record id, item id"},{"name":"before","type":"string","default":"","description":"The state of the entity prior to the modification, as JSON text.","synonyms":"previous, original, old value"},{"name":"after","type":"string","default":"","description":"The state of the entity after a modification, as JSON text.","synonyms":"new, updated, post, subsequent"},{"name":"recordedAt","type":"number","default":0,"description":"Timestamp indicating when the audit event was recorded.","synonyms":"timestamp, date, time"},{"name":"sourceEvent","type":"string","default":"","description":"The event that delivered the change to the audit trail, e.g. ContactSaved.","synonyms":"triggering event, cause, origin event"},{"name":"sourceTrait","type":"string","default":"","description":"The behavior that emitted the change.","synonyms":"emitter, origin, raised by"},{"name":"sourceOrbital","type":"string","default":"","description":"The module the change came from.","synonyms":"origin module, source module"},{"name":"sourceTick","type":"string","default":"","description":"The scheduled job that caused the change; blank when a person or an event did.","synonyms":"scheduled job, background job, timer"}]},"traits":[{"name":"AuditCaptureListener","id":"trt_F72EZKBG06R03AXMGTDB7KEQ32","entityRebindable":true,"entityContract":{"requires":[],"provides":["action","actor","after","before","entityId","entityType","recordedAt"]},"effectRow":[{"kind":"emit","resource":"AuditRecorded"},{"kind":"persist","resource":"AuditEntry"},{"kind":"set","resource":"@entity.action"},{"kind":"set","resource":"@entity.actor"},{"kind":"set","resource":"@entity.after"},{"kind":"set","resource":"@entity.before"},{"kind":"set","resource":"@entity.entityId"},{"kind":"set","resource":"@entity.entityType"},{"kind":"set","resource":"@entity.recordedAt"}],"category":"lifecycle","capabilities":["audit","compliance"],"linkedEntity":"AuditEntry","linkedEntityId":"ent_52WH1WQ71DKGPJCXHJZBAEQ6BX","entityRefIds":{"AuditEntry":"ent_52WH1WQ71DKGPJCXHJZBAEQ6BX"},"emits":[{"event":"AuditRecorded","eventId":"evt_4WTB9JQT8KX49VZXGWXR9Z8BCY","scope":"external","payloadSchema":[{"name":"actor","type":"string"},{"name":"action","type":"string"},{"name":"entityType","type":"string"},{"name":"entityId","type":"string"},{"name":"recordedAt","type":"number"},{"name":"sourceEvent","type":"string"},{"name":"sourceTrait","type":"string"},{"name":"sourceOrbital","type":"string"},{"name":"sourceTick","type":"string"}]}],"stateMachine":{"states":[{"name":"idle","isInitial":true}],"events":[{"key":"EntityMutated","id":"evt_3TKNDQS2X4HEJ8SBNGCQGRSS50","name":"Entity mutated","payloadSchema":[{"name":"data","type":"@entity(captureEntity)"}],"listened":true},{"key":"AuditRecorded","id":"evt_4WTB9JQT8KX49VZXGWXR9Z8BCY","name":"Audit recorded","payloadSchema":[{"name":"actor","type":"string"},{"name":"action","type":"string"},{"name":"entityType","type":"string"},{"name":"entityId","type":"string"},{"name":"recordedAt","type":"number"},{"name":"sourceEvent","type":"string"},{"name":"sourceTrait","type":"string"},{"name":"sourceOrbital","type":"string"},{"name":"sourceTick","type":"string"}]}],"transitions":[{"from":"idle","to":"idle","event":"EntityMutated","eventId":"evt_3TKNDQS2X4HEJ8SBNGCQGRSS50","guard":"@config.enabled","effects":[["when",["or",["=",["array/len","@config.captureEventTypes"],0],["array/includes","@config.captureEventTypes",["object/get","@payload.data","kind","@event.event"]]],["do",["set","@entity.actor","@user.id"],["set","@entity.action",["object/get","@payload.data","kind","@event.event"]],["set","@entity.entityType","@config.captureEntity"],["set","@entity.entityId",["object/get","@payload.data","id",""]],["set","@entity.before",["if","@config.captureBeforeAfter",["json/stringify",["object/omit",["object/get","@payload.data","before",{}],"@config.excludeFields"]],""]],["set","@entity.after",["if","@config.captureBeforeAfter",["json/stringify",["object/omit",["object/get","@payload.data","after",{}],"@config.excludeFields"]],""]],["set","@entity.recordedAt",0],["persist","create","AuditEntry",{"action":"@entity.action","actor":"@user.id","after":"@entity.after","before":"@entity.before","entityId":"@entity.entityId","entityType":"@config.captureEntity","recordedAt":0,"sourceEvent":"@event.event","sourceTrait":["str/default","@event.source.trait",""],"sourceOrbital":["str/default","@event.source.orbital",""],"sourceTick":["str/default","@event.source.tick",""]}],["emit","AuditRecorded",{"action":"@entity.action","actor":"@user.id","entityId":"@entity.entityId","entityType":"@config.captureEntity","recordedAt":0,"sourceEvent":"@event.event","sourceTrait":["str/default","@event.source.trait",""],"sourceOrbital":["str/default","@event.source.orbital",""],"sourceTick":["str/default","@event.source.tick",""]}]]]]}]},"config":{"enabled":{"type":"boolean","default":false,"label":"Track every change","description":"Keep an audit trail of every change to records — who changed what, and when. Off by default.","synonyms":"enable, turn on, enforce, require, activate, apply, switch on, audit, audit trail, log changes, track changes, who edited what, mutation log, change history, edit history, modification log, accountability log, record changes, log every edit, compliance log","tier":"policy"},"
|
|
1
|
+
{"name":"std-audit-capture","version":"1.3.0","description":"std-audit-capture — event-interceptor audit log / audit trail. Use when a user voices that a record's changes must be tracked, logged, or auditable (audit trail, track changes, change history, who edited what, mutation log, record changes, log every edit, edit history, modification log, who did what when, accountability log). Listens for the generic `EntityMutated` sentinel (rename via traitOverrides.events to the real mutation event, e.g. ContactSaved) and persists an AuditEntry row capturing actor, action, entity type/id, before/after snapshots, and timestamp. `captureEventTypes` filters on @payload.data.kind, or on the delivered event's own name when the payload carries no kind (empty = capture all). Every entry also records where the change came from — the delivering event, the behavior and module that emitted it, and the scheduled job when a tick caused it — with no change to the upstream emitter. Compose with `std-lifecycle` to apply retention. Composable via `extraTraits` to interpose audit logging behind any mutating trait.","orbitals":[{"name":"AuditCaptureOrbital","id":"orb_D7ET0XFFENQQARN7NQG8VE4RF9","entity":{"name":"AuditEntry","id":"ent_52WH1WQ71DKGPJCXHJZBAEQ6BX","collection":"audit_entries","persistence":"persistent","fields":[{"name":"id","type":"string","required":true},{"name":"actor","type":"string","default":"","description":"The user or system performing the action.","synonyms":"user, source, originator"},{"name":"action","type":"string","default":"","description":"The specific operation performed on the entity.","synonyms":"operation, event, activity, change"},{"name":"entityType","type":"string","default":"","description":"The type of entity that was modified.","synonyms":"type, kind, class"},{"name":"entityId","type":"string","default":"","description":"Unique identifier for the entity being audited.","synonyms":"entity identifier, record id, item id"},{"name":"before","type":"string","default":"","description":"The state of the entity prior to the modification, as JSON text.","synonyms":"previous, original, old value"},{"name":"after","type":"string","default":"","description":"The state of the entity after a modification, as JSON text.","synonyms":"new, updated, post, subsequent"},{"name":"recordedAt","type":"number","default":0,"description":"Timestamp indicating when the audit event was recorded.","synonyms":"timestamp, date, time"},{"name":"sourceEvent","type":"string","default":"","description":"The event that delivered the change to the audit trail, e.g. ContactSaved.","synonyms":"triggering event, cause, origin event"},{"name":"sourceTrait","type":"string","default":"","description":"The behavior that emitted the change.","synonyms":"emitter, origin, raised by"},{"name":"sourceOrbital","type":"string","default":"","description":"The module the change came from.","synonyms":"origin module, source module"},{"name":"sourceTick","type":"string","default":"","description":"The scheduled job that caused the change; blank when a person or an event did.","synonyms":"scheduled job, background job, timer"}]},"traits":[{"name":"AuditCaptureListener","id":"trt_F72EZKBG06R03AXMGTDB7KEQ32","entityRebindable":true,"entityContract":{"requires":[],"provides":["action","actor","after","before","entityId","entityType","recordedAt"]},"effectRow":[{"kind":"emit","resource":"AuditRecorded"},{"kind":"persist","resource":"AuditEntry"},{"kind":"set","resource":"@entity.action"},{"kind":"set","resource":"@entity.actor"},{"kind":"set","resource":"@entity.after"},{"kind":"set","resource":"@entity.before"},{"kind":"set","resource":"@entity.entityId"},{"kind":"set","resource":"@entity.entityType"},{"kind":"set","resource":"@entity.recordedAt"}],"category":"lifecycle","capabilities":["audit","compliance"],"linkedEntity":"AuditEntry","linkedEntityId":"ent_52WH1WQ71DKGPJCXHJZBAEQ6BX","entityRefIds":{"AuditEntry":"ent_52WH1WQ71DKGPJCXHJZBAEQ6BX"},"emits":[{"event":"AuditRecorded","eventId":"evt_4WTB9JQT8KX49VZXGWXR9Z8BCY","scope":"external","payloadSchema":[{"name":"actor","type":"string"},{"name":"action","type":"string"},{"name":"entityType","type":"string"},{"name":"entityId","type":"string"},{"name":"recordedAt","type":"number"},{"name":"sourceEvent","type":"string"},{"name":"sourceTrait","type":"string"},{"name":"sourceOrbital","type":"string"},{"name":"sourceTick","type":"string"}]}],"stateMachine":{"states":[{"name":"idle","isInitial":true}],"events":[{"key":"EntityMutated","id":"evt_3TKNDQS2X4HEJ8SBNGCQGRSS50","name":"Entity mutated","payloadSchema":[{"name":"data","type":"@entity(captureEntity)"}],"listened":true},{"key":"AuditRecorded","id":"evt_4WTB9JQT8KX49VZXGWXR9Z8BCY","name":"Audit recorded","payloadSchema":[{"name":"actor","type":"string"},{"name":"action","type":"string"},{"name":"entityType","type":"string"},{"name":"entityId","type":"string"},{"name":"recordedAt","type":"number"},{"name":"sourceEvent","type":"string"},{"name":"sourceTrait","type":"string"},{"name":"sourceOrbital","type":"string"},{"name":"sourceTick","type":"string"}]}],"transitions":[{"from":"idle","to":"idle","event":"EntityMutated","eventId":"evt_3TKNDQS2X4HEJ8SBNGCQGRSS50","guard":"@config.enabled","effects":[["when",["or",["=",["array/len","@config.captureEventTypes"],0],["array/includes","@config.captureEventTypes",["object/get","@payload.data","kind","@event.event"]]],["do",["set","@entity.actor","@user.id"],["set","@entity.action",["object/get","@payload.data","kind","@event.event"]],["set","@entity.entityType","@config.captureEntity"],["set","@entity.entityId",["object/get","@payload.data","id",""]],["set","@entity.before",["if","@config.captureBeforeAfter",["json/stringify",["object/omit",["object/get","@payload.data","before",{}],"@config.excludeFields"]],""]],["set","@entity.after",["if","@config.captureBeforeAfter",["json/stringify",["object/omit",["object/get","@payload.data","after",{}],"@config.excludeFields"]],""]],["set","@entity.recordedAt",0],["persist","create","AuditEntry",{"action":"@entity.action","actor":"@user.id","after":"@entity.after","before":"@entity.before","entityId":"@entity.entityId","entityType":"@config.captureEntity","recordedAt":0,"sourceEvent":"@event.event","sourceTrait":["str/default","@event.source.trait",""],"sourceOrbital":["str/default","@event.source.orbital",""],"sourceTick":["str/default","@event.source.tick",""]}],["emit","AuditRecorded",{"action":"@entity.action","actor":"@user.id","entityId":"@entity.entityId","entityType":"@config.captureEntity","recordedAt":0,"sourceEvent":"@event.event","sourceTrait":["str/default","@event.source.trait",""],"sourceOrbital":["str/default","@event.source.orbital",""],"sourceTick":["str/default","@event.source.tick",""]}]]]]}]},"config":{"captureEventTypes":{"type":"[string]","default":[],"label":"Event-kind filter","description":"When set, only these kinds are audited: the payload's `kind` field, or the delivering event's name when there is no kind. Empty list = capture every event.","tier":"internal","items":{"type":"string"}},"enabled":{"type":"boolean","default":false,"label":"Track every change","description":"Keep an audit trail of every change to records — who changed what, and when. Off by default.","synonyms":"enable, turn on, enforce, require, activate, apply, switch on, audit, audit trail, log changes, track changes, who edited what, mutation log, change history, edit history, modification log, accountability log, record changes, log every edit, compliance log","tier":"policy"},"captureEntity":{"type":"entity","default":"","label":"Entity to audit","description":"Type name of the entity whose mutations get logged","tier":"internal"},"excludeFields":{"type":"[string]","default":[],"label":"Skip fields","description":"Entity fields to omit from the before/after snapshots — e.g. passwords or other sensitive fields you do not want copied into the audit trail.","tier":"internal","items":{"type":"string"}},"captureBeforeAfter":{"type":"boolean","default":false,"label":"Store before-and-after snapshots?","description":"Store a full before-and-after snapshot of each change. More detail, but a larger audit log.","synonyms":"before after, snapshot, diff, change snapshot, field diff","tier":"policy"}},"scope":"instance"}],"pages":[{"name":"AuditCapturePage","id":"pag_6ZYWS2CR18C0M9HBYA27T1X78N","path":"/audit-capture","traits":[{"ref":"AuditCaptureListener","refId":"trt_F72EZKBG06R03AXMGTDB7KEQ32"}]}]}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_52WH1WQ71DKGPJCXHJZBAEQ6BX":{"id":"ent_52WH1WQ71DKGPJCXHJZBAEQ6BX","kind":"entity","bakedName":"AuditEntry","curName":"AuditEntry","renames":[],"owner":"workspace"},"evt_3TKNDQS2X4HEJ8SBNGCQGRSS50":{"id":"evt_3TKNDQS2X4HEJ8SBNGCQGRSS50","kind":"event","bakedName":"EntityMutated","curName":"EntityMutated","renames":[],"owner":"workspace","parent":"trt_F72EZKBG06R03AXMGTDB7KEQ32"},"evt_4WTB9JQT8KX49VZXGWXR9Z8BCY":{"id":"evt_4WTB9JQT8KX49VZXGWXR9Z8BCY","kind":"event","bakedName":"AuditRecorded","curName":"AuditRecorded","renames":[],"owner":"workspace","parent":"trt_F72EZKBG06R03AXMGTDB7KEQ32"},"orb_D7ET0XFFENQQARN7NQG8VE4RF9":{"id":"orb_D7ET0XFFENQQARN7NQG8VE4RF9","kind":"orbital","bakedName":"AuditCaptureOrbital","curName":"AuditCaptureOrbital","renames":[],"owner":"workspace"},"pag_6ZYWS2CR18C0M9HBYA27T1X78N":{"id":"pag_6ZYWS2CR18C0M9HBYA27T1X78N","kind":"page","bakedName":"AuditCapturePage","curName":"AuditCapturePage","renames":[],"owner":"workspace"},"trt_F72EZKBG06R03AXMGTDB7KEQ32":{"id":"trt_F72EZKBG06R03AXMGTDB7KEQ32","kind":"trait","bakedName":"AuditCaptureListener","curName":"AuditCaptureListener","renames":[],"owner":"workspace"}}}}
|