@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.
Files changed (457) hide show
  1. package/behaviors/lolo/agent/atoms/std-agent-pool.lolo +355 -0
  2. package/behaviors/lolo/agent/evals/eval-agent-builder.lolo +152 -0
  3. package/behaviors/lolo/agent/organisms/std-agent-builder.lolo +320 -26
  4. package/behaviors/lolo-behavior-contracts.json +1 -1
  5. package/behaviors/registry/agent/atoms/std-agent-context.orb +1 -1
  6. package/behaviors/registry/agent/atoms/std-agent-fix-loop.orb +1 -1
  7. package/behaviors/registry/agent/atoms/std-agent-memory.orb +1 -1
  8. package/behaviors/registry/agent/atoms/std-agent-planner.orb +1 -1
  9. package/behaviors/registry/agent/atoms/std-agent-pool.orb +1 -0
  10. package/behaviors/registry/agent/atoms/std-agent-proposal.orb +1 -1
  11. package/behaviors/registry/agent/atoms/std-agent-session.orb +1 -1
  12. package/behaviors/registry/agent/atoms/std-agent-suggestions.orb +1 -1
  13. package/behaviors/registry/agent/atoms/std-agent-tool-call.orb +1 -1
  14. package/behaviors/registry/agent/atoms/std-agent-tool-loop.orb +1 -1
  15. package/behaviors/registry/agent/atoms/std-agent-trace.orb +1 -1
  16. package/behaviors/registry/agent/evals/eval-agent-builder.orb +1 -0
  17. package/behaviors/registry/agent/organisms/std-agent-assistant.orb +1 -1
  18. package/behaviors/registry/agent/organisms/std-agent-builder.orb +1 -1
  19. package/behaviors/registry/infra/atoms/std-analytics.orb +1 -1
  20. package/behaviors/registry/infra/atoms/std-approval-gate.orb +1 -1
  21. package/behaviors/registry/infra/atoms/std-audit-capture.orb +1 -1
  22. package/behaviors/registry/infra/atoms/std-cache-aside.orb +1 -1
  23. package/behaviors/registry/infra/atoms/std-calendar-sync.orb +1 -1
  24. package/behaviors/registry/infra/atoms/std-cascade-on-delete.orb +1 -1
  25. package/behaviors/registry/infra/atoms/std-circuit-breaker.orb +1 -1
  26. package/behaviors/registry/infra/atoms/std-cross-reference.orb +1 -1
  27. package/behaviors/registry/infra/atoms/std-data-erasure.orb +1 -1
  28. package/behaviors/registry/infra/atoms/std-data-import.orb +1 -1
  29. package/behaviors/registry/infra/atoms/std-global-search.orb +1 -1
  30. package/behaviors/registry/infra/atoms/std-knowledge-loop.orb +1 -1
  31. package/behaviors/registry/infra/atoms/std-lifecycle.orb +1 -1
  32. package/behaviors/registry/infra/atoms/std-migration-job.orb +1 -1
  33. package/behaviors/registry/infra/atoms/std-mod-queue.orb +1 -1
  34. package/behaviors/registry/infra/atoms/std-notification-center.orb +1 -1
  35. package/behaviors/registry/infra/atoms/std-notification-preferences.orb +1 -1
  36. package/behaviors/registry/infra/atoms/std-notify-on-event.orb +1 -1
  37. package/behaviors/registry/infra/atoms/std-page-search.orb +1 -1
  38. package/behaviors/registry/infra/atoms/std-page-watch.orb +1 -1
  39. package/behaviors/registry/infra/atoms/std-permission-matrix.orb +1 -1
  40. package/behaviors/registry/infra/atoms/std-rate-limiter.orb +1 -1
  41. package/behaviors/registry/infra/atoms/std-reminder-scheduler.orb +1 -1
  42. package/behaviors/registry/infra/atoms/std-review-cycle.orb +1 -1
  43. package/behaviors/registry/infra/atoms/std-row-access-control.orb +1 -1
  44. package/behaviors/registry/infra/atoms/std-status-lifecycle.orb +1 -1
  45. package/behaviors/registry/infra/organisms/std-status-lifecycle-control.orb +1 -1
  46. package/behaviors/registry/ml/atoms/std-data-collector.orb +1 -1
  47. package/behaviors/registry/ml/atoms/std-graph-builder.orb +1 -1
  48. package/behaviors/registry/ml/atoms/std-ml-classify.orb +1 -1
  49. package/behaviors/registry/ml/atoms/std-ml-infer.orb +1 -1
  50. package/behaviors/registry/ml/atoms/std-ml-label-capture.orb +1 -1
  51. package/behaviors/registry/ml/atoms/std-ml-lookup.orb +1 -1
  52. package/behaviors/registry/ml/atoms/std-ml-posterior.orb +1 -1
  53. package/behaviors/registry/ml/atoms/std-ml-similarity.orb +1 -1
  54. package/behaviors/registry/ml/atoms/std-tokenizer.orb +1 -1
  55. package/behaviors/registry/ml/atoms/std-weight-validator.orb +1 -1
  56. package/behaviors/registry/ml/organisms/std-escalating-decision.orb +1 -1
  57. package/behaviors/registry/ml/organisms/std-knowledge-tracing.orb +1 -1
  58. package/behaviors/registry/ui/avl/atoms/std-avl-cosmic-zoom.orb +1 -1
  59. package/behaviors/registry/ui/avl/atoms/ui-avl-glyph.orb +1 -1
  60. package/behaviors/registry/ui/avl/atoms/ui-avl-state-machine.orb +1 -1
  61. package/behaviors/registry/ui/avl/atoms/ui-avl-transition-detail.orb +1 -1
  62. package/behaviors/registry/ui/avl/atoms/ui-avl-transition-explainer.orb +1 -1
  63. package/behaviors/registry/ui/avl/atoms/ui-behavior-view.orb +1 -1
  64. package/behaviors/registry/ui/avl/atoms/ui-module-card.orb +1 -1
  65. package/behaviors/registry/ui/avl/organisms/ui-flow-canvas.orb +1 -1
  66. package/behaviors/registry/ui/avl/organisms/ui-layers-panel.orb +1 -1
  67. package/behaviors/registry/ui/avl/organisms/ui-orb-inspector.orb +1 -1
  68. package/behaviors/registry/ui/core/atoms/std-app-layout.orb +1 -1
  69. package/behaviors/registry/ui/core/atoms/std-app-search.orb +1 -1
  70. package/behaviors/registry/ui/core/atoms/std-behavior-catalog.orb +1 -1
  71. package/behaviors/registry/ui/core/atoms/std-behavior-tour.orb +1 -1
  72. package/behaviors/registry/ui/core/atoms/std-billable-hour.orb +1 -1
  73. package/behaviors/registry/ui/core/atoms/std-board.orb +1 -1
  74. package/behaviors/registry/ui/core/atoms/std-book-reader.orb +1 -1
  75. package/behaviors/registry/ui/core/atoms/std-browse.orb +1 -1
  76. package/behaviors/registry/ui/core/atoms/std-calendar.orb +1 -1
  77. package/behaviors/registry/ui/core/atoms/std-card-grid.orb +1 -1
  78. package/behaviors/registry/ui/core/atoms/std-confirmation.orb +1 -1
  79. package/behaviors/registry/ui/core/atoms/std-dashboard-grid-embedded.orb +1 -1
  80. package/behaviors/registry/ui/core/atoms/std-date-range.orb +1 -1
  81. package/behaviors/registry/ui/core/atoms/std-detail-layout.orb +1 -1
  82. package/behaviors/registry/ui/core/atoms/std-doc-page.orb +1 -1
  83. package/behaviors/registry/ui/core/atoms/std-esign-flow.orb +1 -1
  84. package/behaviors/registry/ui/core/atoms/std-esign-request.orb +1 -1
  85. package/behaviors/registry/ui/core/atoms/std-event-log.orb +1 -1
  86. package/behaviors/registry/ui/core/atoms/std-export.orb +1 -1
  87. package/behaviors/registry/ui/core/atoms/std-file-store.orb +1 -1
  88. package/behaviors/registry/ui/core/atoms/std-filter.orb +1 -1
  89. package/behaviors/registry/ui/core/atoms/std-form-advanced.orb +1 -1
  90. package/behaviors/registry/ui/core/atoms/std-gallery.orb +1 -1
  91. package/behaviors/registry/ui/core/atoms/std-gantt-schedule.orb +1 -1
  92. package/behaviors/registry/ui/core/atoms/std-geosearch.orb +1 -1
  93. package/behaviors/registry/ui/core/atoms/std-graphs.orb +1 -1
  94. package/behaviors/registry/ui/core/atoms/std-hero.orb +1 -1
  95. package/behaviors/registry/ui/core/atoms/std-home.orb +1 -1
  96. package/behaviors/registry/ui/core/atoms/std-image-upload-multi.orb +1 -1
  97. package/behaviors/registry/ui/core/atoms/std-import.orb +1 -1
  98. package/behaviors/registry/ui/core/atoms/std-language-picker.orb +1 -1
  99. package/behaviors/registry/ui/core/atoms/std-media-section.orb +1 -1
  100. package/behaviors/registry/ui/core/atoms/std-modal-editor.orb +1 -1
  101. package/behaviors/registry/ui/core/atoms/std-modal.orb +1 -1
  102. package/behaviors/registry/ui/core/atoms/std-multi-party-flow.orb +1 -1
  103. package/behaviors/registry/ui/core/atoms/std-notification-panel.orb +1 -1
  104. package/behaviors/registry/ui/core/atoms/std-panel-launcher.orb +1 -1
  105. package/behaviors/registry/ui/core/atoms/std-pricing.orb +1 -1
  106. package/behaviors/registry/ui/core/atoms/std-proof.orb +1 -1
  107. package/behaviors/registry/ui/core/atoms/std-prose.orb +1 -1
  108. package/behaviors/registry/ui/core/atoms/std-rating-review.orb +1 -1
  109. package/behaviors/registry/ui/core/atoms/std-record-detail.orb +1 -1
  110. package/behaviors/registry/ui/core/atoms/std-recurrence.orb +1 -1
  111. package/behaviors/registry/ui/core/atoms/std-related.orb +1 -1
  112. package/behaviors/registry/ui/core/atoms/std-role-gate.orb +1 -1
  113. package/behaviors/registry/ui/core/atoms/std-saved-search.orb +1 -1
  114. package/behaviors/registry/ui/core/atoms/std-scatter.orb +1 -1
  115. package/behaviors/registry/ui/core/atoms/std-scoped-list.orb +1 -1
  116. package/behaviors/registry/ui/core/atoms/std-selection.orb +1 -1
  117. package/behaviors/registry/ui/core/atoms/std-site-footer.orb +1 -1
  118. package/behaviors/registry/ui/core/atoms/std-site-header.orb +1 -1
  119. package/behaviors/registry/ui/core/atoms/std-slide-deck.orb +1 -1
  120. package/behaviors/registry/ui/core/atoms/std-stat-band.orb +1 -1
  121. package/behaviors/registry/ui/core/atoms/std-stats.orb +1 -1
  122. package/behaviors/registry/ui/core/atoms/std-step-flow.orb +1 -1
  123. package/behaviors/registry/ui/core/atoms/std-steps.orb +1 -1
  124. package/behaviors/registry/ui/core/atoms/std-tabs.orb +1 -1
  125. package/behaviors/registry/ui/core/atoms/std-tag-strip.orb +1 -1
  126. package/behaviors/registry/ui/core/atoms/std-tag-taxonomy.orb +1 -1
  127. package/behaviors/registry/ui/core/atoms/std-thread.orb +1 -1
  128. package/behaviors/registry/ui/core/atoms/std-tree.orb +1 -1
  129. package/behaviors/registry/ui/core/atoms/std-version-history.orb +1 -1
  130. package/behaviors/registry/ui/core/atoms/std-wizard.orb +1 -1
  131. package/behaviors/registry/ui/core/atoms/std-workspace-layout.orb +1 -1
  132. package/behaviors/registry/ui/core/atoms/ui-animated-graphic.orb +1 -1
  133. package/behaviors/registry/ui/core/atoms/ui-animated-reveal.orb +1 -1
  134. package/behaviors/registry/ui/core/atoms/ui-aside.orb +1 -1
  135. package/behaviors/registry/ui/core/atoms/ui-atlas-image.orb +1 -1
  136. package/behaviors/registry/ui/core/atoms/ui-atlas-panel.orb +1 -1
  137. package/behaviors/registry/ui/core/atoms/ui-avatar.orb +1 -1
  138. package/behaviors/registry/ui/core/atoms/ui-badge.orb +1 -1
  139. package/behaviors/registry/ui/core/atoms/ui-box.orb +1 -1
  140. package/behaviors/registry/ui/core/atoms/ui-button.orb +1 -1
  141. package/behaviors/registry/ui/core/atoms/ui-card.orb +1 -1
  142. package/behaviors/registry/ui/core/atoms/ui-center.orb +1 -1
  143. package/behaviors/registry/ui/core/atoms/ui-checkbox.orb +1 -1
  144. package/behaviors/registry/ui/core/atoms/ui-conditional-wrapper.orb +1 -1
  145. package/behaviors/registry/ui/core/atoms/ui-confetti-effect.orb +1 -1
  146. package/behaviors/registry/ui/core/atoms/ui-day-cell.orb +1 -1
  147. package/behaviors/registry/ui/core/atoms/ui-dialog.orb +1 -1
  148. package/behaviors/registry/ui/core/atoms/ui-divider.orb +1 -1
  149. package/behaviors/registry/ui/core/atoms/ui-filter-pill.orb +1 -1
  150. package/behaviors/registry/ui/core/atoms/ui-flip-container.orb +1 -1
  151. package/behaviors/registry/ui/core/atoms/ui-game-icon.orb +1 -1
  152. package/behaviors/registry/ui/core/atoms/ui-hstack.orb +1 -1
  153. package/behaviors/registry/ui/core/atoms/ui-icon.orb +1 -1
  154. package/behaviors/registry/ui/core/atoms/ui-image.orb +1 -1
  155. package/behaviors/registry/ui/core/atoms/ui-infinite-scroll-sentinel.orb +1 -1
  156. package/behaviors/registry/ui/core/atoms/ui-input.orb +1 -1
  157. package/behaviors/registry/ui/core/atoms/ui-label.orb +1 -1
  158. package/behaviors/registry/ui/core/atoms/ui-law-reference-tooltip.orb +1 -1
  159. package/behaviors/registry/ui/core/atoms/ui-overlay.orb +1 -1
  160. package/behaviors/registry/ui/core/atoms/ui-pattern-tile.orb +1 -1
  161. package/behaviors/registry/ui/core/atoms/ui-presence.orb +1 -1
  162. package/behaviors/registry/ui/core/atoms/ui-progress-bar.orb +1 -1
  163. package/behaviors/registry/ui/core/atoms/ui-radio.orb +1 -1
  164. package/behaviors/registry/ui/core/atoms/ui-range-slider.orb +1 -1
  165. package/behaviors/registry/ui/core/atoms/ui-section-header.orb +1 -1
  166. package/behaviors/registry/ui/core/atoms/ui-select.orb +1 -1
  167. package/behaviors/registry/ui/core/atoms/ui-spacer.orb +1 -1
  168. package/behaviors/registry/ui/core/atoms/ui-sparkline.orb +1 -1
  169. package/behaviors/registry/ui/core/atoms/ui-spinner.orb +1 -1
  170. package/behaviors/registry/ui/core/atoms/ui-stack.orb +1 -1
  171. package/behaviors/registry/ui/core/atoms/ui-status-dot.orb +1 -1
  172. package/behaviors/registry/ui/core/atoms/ui-svg-branch.orb +1 -1
  173. package/behaviors/registry/ui/core/atoms/ui-svg-connection.orb +1 -1
  174. package/behaviors/registry/ui/core/atoms/ui-svg-flow.orb +1 -1
  175. package/behaviors/registry/ui/core/atoms/ui-svg-grid.orb +1 -1
  176. package/behaviors/registry/ui/core/atoms/ui-svg-lobe.orb +1 -1
  177. package/behaviors/registry/ui/core/atoms/ui-svg-mesh.orb +1 -1
  178. package/behaviors/registry/ui/core/atoms/ui-svg-morph.orb +1 -1
  179. package/behaviors/registry/ui/core/atoms/ui-svg-node.orb +1 -1
  180. package/behaviors/registry/ui/core/atoms/ui-svg-pulse.orb +1 -1
  181. package/behaviors/registry/ui/core/atoms/ui-svg-ring.orb +1 -1
  182. package/behaviors/registry/ui/core/atoms/ui-svg-shield.orb +1 -1
  183. package/behaviors/registry/ui/core/atoms/ui-svg-stack.orb +1 -1
  184. package/behaviors/registry/ui/core/atoms/ui-switch.orb +1 -1
  185. package/behaviors/registry/ui/core/atoms/ui-text-highlight.orb +1 -1
  186. package/behaviors/registry/ui/core/atoms/ui-textarea.orb +1 -1
  187. package/behaviors/registry/ui/core/atoms/ui-theme-toggle.orb +1 -1
  188. package/behaviors/registry/ui/core/atoms/ui-time-slot-cell.orb +1 -1
  189. package/behaviors/registry/ui/core/atoms/ui-trend-indicator.orb +1 -1
  190. package/behaviors/registry/ui/core/atoms/ui-typewriter-text.orb +1 -1
  191. package/behaviors/registry/ui/core/atoms/ui-typography.orb +1 -1
  192. package/behaviors/registry/ui/core/atoms/ui-video-embed.orb +1 -1
  193. package/behaviors/registry/ui/core/atoms/ui-vstack.orb +1 -1
  194. package/behaviors/registry/ui/core/molecules/std-stat-rows.orb +1 -1
  195. package/behaviors/registry/ui/core/molecules/ui-accordion.orb +1 -1
  196. package/behaviors/registry/ui/core/molecules/ui-activation-block.orb +1 -1
  197. package/behaviors/registry/ui/core/molecules/ui-activity-rail.orb +1 -1
  198. package/behaviors/registry/ui/core/molecules/ui-agent-activity-feed.orb +1 -1
  199. package/behaviors/registry/ui/core/molecules/ui-agent-activity-row.orb +1 -1
  200. package/behaviors/registry/ui/core/molecules/ui-agent-chat-feed.orb +1 -1
  201. package/behaviors/registry/ui/core/molecules/ui-alert.orb +1 -1
  202. package/behaviors/registry/ui/core/molecules/ui-animated-counter.orb +1 -1
  203. package/behaviors/registry/ui/core/molecules/ui-bloom-quiz-block.orb +1 -1
  204. package/behaviors/registry/ui/core/molecules/ui-branching-logic-builder.orb +1 -1
  205. package/behaviors/registry/ui/core/molecules/ui-breadcrumb.orb +1 -1
  206. package/behaviors/registry/ui/core/molecules/ui-calendar-grid.orb +1 -1
  207. package/behaviors/registry/ui/core/molecules/ui-carousel.orb +1 -1
  208. package/behaviors/registry/ui/core/molecules/ui-change-list.orb +1 -1
  209. package/behaviors/registry/ui/core/molecules/ui-chart-legend.orb +1 -1
  210. package/behaviors/registry/ui/core/molecules/ui-chart.orb +1 -1
  211. package/behaviors/registry/ui/core/molecules/ui-code-block.orb +1 -1
  212. package/behaviors/registry/ui/core/molecules/ui-command-palette.orb +1 -1
  213. package/behaviors/registry/ui/core/molecules/ui-commit-row.orb +1 -1
  214. package/behaviors/registry/ui/core/molecules/ui-confirm-dialog.orb +1 -1
  215. package/behaviors/registry/ui/core/molecules/ui-connection-block.orb +1 -1
  216. package/behaviors/registry/ui/core/molecules/ui-container.orb +1 -1
  217. package/behaviors/registry/ui/core/molecules/ui-content-renderer.orb +1 -1
  218. package/behaviors/registry/ui/core/molecules/ui-data-grid.orb +1 -1
  219. package/behaviors/registry/ui/core/molecules/ui-data-list.orb +1 -1
  220. package/behaviors/registry/ui/core/molecules/ui-date-range-picker.orb +1 -1
  221. package/behaviors/registry/ui/core/molecules/ui-date-range-selector.orb +1 -1
  222. package/behaviors/registry/ui/core/molecules/ui-doc-breadcrumb.orb +1 -1
  223. package/behaviors/registry/ui/core/molecules/ui-doc-pagination.orb +1 -1
  224. package/behaviors/registry/ui/core/molecules/ui-doc-search.orb +1 -1
  225. package/behaviors/registry/ui/core/molecules/ui-doc-sidebar.orb +1 -1
  226. package/behaviors/registry/ui/core/molecules/ui-doc-toc.orb +1 -1
  227. package/behaviors/registry/ui/core/molecules/ui-document-details.orb +1 -1
  228. package/behaviors/registry/ui/core/molecules/ui-document-panel.orb +1 -1
  229. package/behaviors/registry/ui/core/molecules/ui-document-viewer.orb +1 -1
  230. package/behaviors/registry/ui/core/molecules/ui-drawer.orb +1 -1
  231. package/behaviors/registry/ui/core/molecules/ui-edge-decoration.orb +1 -1
  232. package/behaviors/registry/ui/core/molecules/ui-emoji-picker.orb +1 -1
  233. package/behaviors/registry/ui/core/molecules/ui-empty-state.orb +1 -1
  234. package/behaviors/registry/ui/core/molecules/ui-error-boundary.orb +1 -1
  235. package/behaviors/registry/ui/core/molecules/ui-error-state.orb +1 -1
  236. package/behaviors/registry/ui/core/molecules/ui-feature-card.orb +1 -1
  237. package/behaviors/registry/ui/core/molecules/ui-feature-grid.orb +1 -1
  238. package/behaviors/registry/ui/core/molecules/ui-file-tree.orb +1 -1
  239. package/behaviors/registry/ui/core/molecules/ui-filter-group.orb +1 -1
  240. package/behaviors/registry/ui/core/molecules/ui-flex.orb +1 -1
  241. package/behaviors/registry/ui/core/molecules/ui-flip-card.orb +1 -1
  242. package/behaviors/registry/ui/core/molecules/ui-floating-action-button.orb +1 -1
  243. package/behaviors/registry/ui/core/molecules/ui-floating-toolbar.orb +1 -1
  244. package/behaviors/registry/ui/core/molecules/ui-form-actions.orb +1 -1
  245. package/behaviors/registry/ui/core/molecules/ui-form-field.orb +1 -1
  246. package/behaviors/registry/ui/core/molecules/ui-form-layout.orb +1 -1
  247. package/behaviors/registry/ui/core/molecules/ui-form-section-header.orb +1 -1
  248. package/behaviors/registry/ui/core/molecules/ui-fx-overlay.orb +1 -1
  249. package/behaviors/registry/ui/core/molecules/ui-gantt.orb +1 -1
  250. package/behaviors/registry/ui/core/molecules/ui-geometric-pattern.orb +1 -1
  251. package/behaviors/registry/ui/core/molecules/ui-gradient-divider.orb +1 -1
  252. package/behaviors/registry/ui/core/molecules/ui-graph-canvas.orb +1 -1
  253. package/behaviors/registry/ui/core/molecules/ui-graph-view.orb +1 -1
  254. package/behaviors/registry/ui/core/molecules/ui-grid.orb +1 -1
  255. package/behaviors/registry/ui/core/molecules/ui-header.orb +1 -1
  256. package/behaviors/registry/ui/core/molecules/ui-icon-button.orb +1 -1
  257. package/behaviors/registry/ui/core/molecules/ui-import-preview-tree.orb +1 -1
  258. package/behaviors/registry/ui/core/molecules/ui-import-progress.orb +1 -1
  259. package/behaviors/registry/ui/core/molecules/ui-import-source-picker.orb +1 -1
  260. package/behaviors/registry/ui/core/molecules/ui-input-group.orb +1 -1
  261. package/behaviors/registry/ui/core/molecules/ui-jazari-state-machine.orb +1 -1
  262. package/behaviors/registry/ui/core/molecules/ui-lightbox.orb +1 -1
  263. package/behaviors/registry/ui/core/molecules/ui-likert-scale.orb +1 -1
  264. package/behaviors/registry/ui/core/molecules/ui-line-chart.orb +1 -1
  265. package/behaviors/registry/ui/core/molecules/ui-loading-state.orb +1 -1
  266. package/behaviors/registry/ui/core/molecules/ui-map-view.orb +1 -1
  267. package/behaviors/registry/ui/core/molecules/ui-markdown-content.orb +1 -1
  268. package/behaviors/registry/ui/core/molecules/ui-matrix-question.orb +1 -1
  269. package/behaviors/registry/ui/core/molecules/ui-menu.orb +1 -1
  270. package/behaviors/registry/ui/core/molecules/ui-meter.orb +1 -1
  271. package/behaviors/registry/ui/core/molecules/ui-modal.orb +1 -1
  272. package/behaviors/registry/ui/core/molecules/ui-navigation.orb +1 -1
  273. package/behaviors/registry/ui/core/molecules/ui-notification.orb +1 -1
  274. package/behaviors/registry/ui/core/molecules/ui-number-stepper.orb +1 -1
  275. package/behaviors/registry/ui/core/molecules/ui-option-constraint-group.orb +1 -1
  276. package/behaviors/registry/ui/core/molecules/ui-orbital-visualization.orb +1 -1
  277. package/behaviors/registry/ui/core/molecules/ui-page-header.orb +1 -1
  278. package/behaviors/registry/ui/core/molecules/ui-page-transition.orb +1 -1
  279. package/behaviors/registry/ui/core/molecules/ui-pagination.orb +1 -1
  280. package/behaviors/registry/ui/core/molecules/ui-popover.orb +1 -1
  281. package/behaviors/registry/ui/core/molecules/ui-positioned-canvas.orb +1 -1
  282. package/behaviors/registry/ui/core/molecules/ui-progress-dots.orb +1 -1
  283. package/behaviors/registry/ui/core/molecules/ui-pull-to-refresh.orb +1 -1
  284. package/behaviors/registry/ui/core/molecules/ui-qr-scanner.orb +1 -1
  285. package/behaviors/registry/ui/core/molecules/ui-quiz-block.orb +1 -1
  286. package/behaviors/registry/ui/core/molecules/ui-reflection-block.orb +1 -1
  287. package/behaviors/registry/ui/core/molecules/ui-relation-select.orb +1 -1
  288. package/behaviors/registry/ui/core/molecules/ui-repeatable-form-section.orb +1 -1
  289. package/behaviors/registry/ui/core/molecules/ui-reply-tree.orb +1 -1
  290. package/behaviors/registry/ui/core/molecules/ui-rich-text-editor.orb +1 -1
  291. package/behaviors/registry/ui/core/molecules/ui-scaled-diagram.orb +1 -1
  292. package/behaviors/registry/ui/core/molecules/ui-search-input.orb +1 -1
  293. package/behaviors/registry/ui/core/molecules/ui-section.orb +1 -1
  294. package/behaviors/registry/ui/core/molecules/ui-side-panel.orb +1 -1
  295. package/behaviors/registry/ui/core/molecules/ui-sidebar.orb +1 -1
  296. package/behaviors/registry/ui/core/molecules/ui-signature-pad.orb +1 -1
  297. package/behaviors/registry/ui/core/molecules/ui-simple-grid.orb +1 -1
  298. package/behaviors/registry/ui/core/molecules/ui-skeleton.orb +1 -1
  299. package/behaviors/registry/ui/core/molecules/ui-social-proof.orb +1 -1
  300. package/behaviors/registry/ui/core/molecules/ui-sortable-list.orb +1 -1
  301. package/behaviors/registry/ui/core/molecules/ui-split.orb +1 -1
  302. package/behaviors/registry/ui/core/molecules/ui-star-rating.orb +1 -1
  303. package/behaviors/registry/ui/core/molecules/ui-stat-display.orb +1 -1
  304. package/behaviors/registry/ui/core/molecules/ui-swipeable-row.orb +1 -1
  305. package/behaviors/registry/ui/core/molecules/ui-table-view.orb +1 -1
  306. package/behaviors/registry/ui/core/molecules/ui-tabs.orb +1 -1
  307. package/behaviors/registry/ui/core/molecules/ui-tag-input.orb +1 -1
  308. package/behaviors/registry/ui/core/molecules/ui-tooltip.orb +1 -1
  309. package/behaviors/registry/ui/core/molecules/ui-top-nav-item.orb +1 -1
  310. package/behaviors/registry/ui/core/molecules/ui-upload-drop-zone.orb +1 -1
  311. package/behaviors/registry/ui/core/molecules/ui-version-diff.orb +1 -1
  312. package/behaviors/registry/ui/core/molecules/ui-violation-alert.orb +1 -1
  313. package/behaviors/registry/ui/core/molecules/ui-vote-stack.orb +1 -1
  314. package/behaviors/registry/ui/core/molecules/ui-wizard-container.orb +1 -1
  315. package/behaviors/registry/ui/core/molecules/ui-wizard-navigation.orb +1 -1
  316. package/behaviors/registry/ui/core/molecules/ui-wizard-progress.orb +1 -1
  317. package/behaviors/registry/ui/core/organisms/ui-chat-bar.orb +1 -1
  318. package/behaviors/registry/ui/core/organisms/ui-code-runner-panel.orb +1 -1
  319. package/behaviors/registry/ui/core/organisms/ui-dashboard-grid.orb +1 -1
  320. package/behaviors/registry/ui/core/organisms/ui-detail-panel.orb +1 -1
  321. package/behaviors/registry/ui/core/organisms/ui-dock-layout.orb +1 -1
  322. package/behaviors/registry/ui/core/organisms/ui-drawer-slot.orb +1 -1
  323. package/behaviors/registry/ui/core/organisms/ui-form-section.orb +1 -1
  324. package/behaviors/registry/ui/core/organisms/ui-form.orb +1 -1
  325. package/behaviors/registry/ui/core/organisms/ui-master-detail-layout.orb +1 -1
  326. package/behaviors/registry/ui/core/organisms/ui-media-gallery.orb +1 -1
  327. package/behaviors/registry/ui/core/organisms/ui-modal-slot.orb +1 -1
  328. package/behaviors/registry/ui/core/organisms/ui-runtime-debugger.orb +1 -1
  329. package/behaviors/registry/ui/core/organisms/ui-segment-renderer.orb +1 -1
  330. package/behaviors/registry/ui/core/organisms/ui-split-pane.orb +1 -1
  331. package/behaviors/registry/ui/core/organisms/ui-stat-card.orb +1 -1
  332. package/behaviors/registry/ui/core/organisms/ui-state-machine-view.orb +1 -1
  333. package/behaviors/registry/ui/core/organisms/ui-subagent-trace-panel.orb +1 -1
  334. package/behaviors/registry/ui/core/organisms/ui-tabbed-container.orb +1 -1
  335. package/behaviors/registry/ui/core/organisms/ui-timeline.orb +1 -1
  336. package/behaviors/registry/ui/core/organisms/ui-toast-slot.orb +1 -1
  337. package/behaviors/registry/ui/core/templates/ui-auth-layout.orb +1 -1
  338. package/behaviors/registry/ui/core/templates/ui-counter-template.orb +1 -1
  339. package/behaviors/registry/ui/core/templates/ui-dashboard-layout.orb +1 -1
  340. package/behaviors/registry/ui/core/templates/ui-generic-app-template.orb +1 -1
  341. package/behaviors/registry/ui/game/atoms/std-arcade-play.orb +1 -1
  342. package/behaviors/registry/ui/game/atoms/std-area-fill.orb +1 -1
  343. package/behaviors/registry/ui/game/atoms/std-audio-cue.orb +1 -1
  344. package/behaviors/registry/ui/game/atoms/std-camera-rig.orb +1 -1
  345. package/behaviors/registry/ui/game/atoms/std-chase-ai.orb +1 -1
  346. package/behaviors/registry/ui/game/atoms/std-choice-gate.orb +1 -1
  347. package/behaviors/registry/ui/game/atoms/std-coef-pad.orb +1 -1
  348. package/behaviors/registry/ui/game/atoms/std-curve-fog.orb +1 -1
  349. package/behaviors/registry/ui/game/atoms/std-dungeon-combat.orb +1 -1
  350. package/behaviors/registry/ui/game/atoms/std-fx-narrative.orb +1 -1
  351. package/behaviors/registry/ui/game/atoms/std-fx-particles.orb +1 -1
  352. package/behaviors/registry/ui/game/atoms/std-fx-trail.orb +1 -1
  353. package/behaviors/registry/ui/game/atoms/std-gate-lock.orb +1 -1
  354. package/behaviors/registry/ui/game/atoms/std-gather.orb +1 -1
  355. package/behaviors/registry/ui/game/atoms/std-gold.orb +1 -1
  356. package/behaviors/registry/ui/game/atoms/std-grid-tactics.orb +1 -1
  357. package/behaviors/registry/ui/game/atoms/std-hero-nav.orb +1 -1
  358. package/behaviors/registry/ui/game/atoms/std-lives.orb +1 -1
  359. package/behaviors/registry/ui/game/atoms/std-loop-lock.orb +1 -1
  360. package/behaviors/registry/ui/game/atoms/std-market-flow.orb +1 -1
  361. package/behaviors/registry/ui/game/atoms/std-motion-body.orb +1 -1
  362. package/behaviors/registry/ui/game/atoms/std-objective-reach.orb +1 -1
  363. package/behaviors/registry/ui/game/atoms/std-pad-lock.orb +1 -1
  364. package/behaviors/registry/ui/game/atoms/std-patience.orb +1 -1
  365. package/behaviors/registry/ui/game/atoms/std-patrol-hazard.orb +1 -1
  366. package/behaviors/registry/ui/game/atoms/std-pickup.orb +1 -1
  367. package/behaviors/registry/ui/game/atoms/std-platformer-body.orb +1 -1
  368. package/behaviors/registry/ui/game/atoms/std-production.orb +1 -1
  369. package/behaviors/registry/ui/game/atoms/std-score.orb +1 -1
  370. package/behaviors/registry/ui/game/atoms/std-tutorial-autodemo.orb +1 -1
  371. package/behaviors/registry/ui/game/atoms/std-tutorial-overlay.orb +1 -1
  372. package/behaviors/registry/ui/game/atoms/std-velocity-gate.orb +1 -1
  373. package/behaviors/registry/ui/game/atoms/std-xp.orb +1 -1
  374. package/behaviors/registry/ui/game/atoms/std-zone-card.orb +1 -1
  375. package/behaviors/registry/ui/game/atoms/ui-action-palette.orb +1 -1
  376. package/behaviors/registry/ui/game/atoms/ui-action-tile.orb +1 -1
  377. package/behaviors/registry/ui/game/atoms/ui-canvas-2d.orb +1 -1
  378. package/behaviors/registry/ui/game/atoms/ui-canvas.orb +1 -1
  379. package/behaviors/registry/ui/game/atoms/ui-choice-button.orb +1 -1
  380. package/behaviors/registry/ui/game/atoms/ui-control-button.orb +1 -1
  381. package/behaviors/registry/ui/game/atoms/ui-control-grid.orb +1 -1
  382. package/behaviors/registry/ui/game/atoms/ui-dialogue-bubble.orb +1 -1
  383. package/behaviors/registry/ui/game/atoms/ui-draw-fx-layer.orb +1 -1
  384. package/behaviors/registry/ui/game/atoms/ui-draw-group.orb +1 -1
  385. package/behaviors/registry/ui/game/atoms/ui-draw-mesh.orb +1 -1
  386. package/behaviors/registry/ui/game/atoms/ui-draw-shape-layer.orb +1 -1
  387. package/behaviors/registry/ui/game/atoms/ui-draw-shape.orb +1 -1
  388. package/behaviors/registry/ui/game/atoms/ui-draw-skinned-mesh.orb +1 -1
  389. package/behaviors/registry/ui/game/atoms/ui-draw-sprite-layer.orb +1 -1
  390. package/behaviors/registry/ui/game/atoms/ui-draw-sprite.orb +1 -1
  391. package/behaviors/registry/ui/game/atoms/ui-draw-text-layer.orb +1 -1
  392. package/behaviors/registry/ui/game/atoms/ui-draw-text.orb +1 -1
  393. package/behaviors/registry/ui/game/atoms/ui-game-audio-cue.orb +1 -1
  394. package/behaviors/registry/ui/game/atoms/ui-game-audio-toggle.orb +1 -1
  395. package/behaviors/registry/ui/game/atoms/ui-game-hud.orb +1 -1
  396. package/behaviors/registry/ui/game/atoms/ui-game-menu.orb +1 -1
  397. package/behaviors/registry/ui/game/atoms/ui-health-bar.orb +1 -1
  398. package/behaviors/registry/ui/game/atoms/ui-score-display.orb +1 -1
  399. package/behaviors/registry/ui/game/atoms/ui-sequence-bar.orb +1 -1
  400. package/behaviors/registry/ui/game/atoms/ui-stat-badge.orb +1 -1
  401. package/behaviors/registry/ui/game/atoms/ui-state-graph.orb +1 -1
  402. package/behaviors/registry/ui/game/atoms/ui-state-json-view.orb +1 -1
  403. package/behaviors/registry/ui/game/atoms/ui-timer-display.orb +1 -1
  404. package/behaviors/registry/ui/game/atoms/ui-trait-slot.orb +1 -1
  405. package/behaviors/registry/ui/game/organisms/std-arcade-board-3d.orb +1 -1
  406. package/behaviors/registry/ui/game/organisms/std-crew-board-2d.orb +1 -1
  407. package/behaviors/registry/ui/game/organisms/std-dungeon-board-2d.orb +1 -1
  408. package/behaviors/registry/ui/game/organisms/std-market-board-3d.orb +1 -1
  409. package/behaviors/registry/ui/game/organisms/std-objective-board-3d.orb +1 -1
  410. package/behaviors/registry/ui/game/organisms/std-platformer-board-2d.orb +1 -1
  411. package/behaviors/registry/ui/game/organisms/std-platformer-puzzle.orb +1 -1
  412. package/behaviors/registry/ui/game/organisms/std-survival-board-3d.orb +1 -1
  413. package/behaviors/registry/ui/game/organisms/std-tactics-board-2d.orb +1 -1
  414. package/behaviors/registry/ui/game/organisms/std-tactics-board-3d.orb +1 -1
  415. package/behaviors/registry/ui/game/organisms/std-worldmap-board-2d.orb +1 -1
  416. package/behaviors/registry/ui/game/templates/ui-game-shell.orb +1 -1
  417. package/behaviors/registry/ui/learning/atoms/std-learn-arrangement.orb +1 -1
  418. package/behaviors/registry/ui/learning/atoms/std-learn-classify.orb +1 -1
  419. package/behaviors/registry/ui/learning/atoms/std-learn-compare.orb +1 -1
  420. package/behaviors/registry/ui/learning/atoms/std-learn-coupled-sim.orb +1 -1
  421. package/behaviors/registry/ui/learning/atoms/std-learn-derivation.orb +1 -1
  422. package/behaviors/registry/ui/learning/atoms/std-learn-diagram.orb +1 -1
  423. package/behaviors/registry/ui/learning/atoms/std-learn-doser.orb +1 -1
  424. package/behaviors/registry/ui/learning/atoms/std-learn-estimate.orb +1 -1
  425. package/behaviors/registry/ui/learning/atoms/std-learn-fx-cues.orb +1 -1
  426. package/behaviors/registry/ui/learning/atoms/std-learn-generate.orb +1 -1
  427. package/behaviors/registry/ui/learning/atoms/std-learn-goal-seek.orb +1 -1
  428. package/behaviors/registry/ui/learning/atoms/std-learn-grid-sim.orb +1 -1
  429. package/behaviors/registry/ui/learning/atoms/std-learn-hotspot.orb +1 -1
  430. package/behaviors/registry/ui/learning/atoms/std-learn-live-sim.orb +1 -1
  431. package/behaviors/registry/ui/learning/atoms/std-learn-measure.orb +1 -1
  432. package/behaviors/registry/ui/learning/atoms/std-learn-param-explorer.orb +1 -1
  433. package/behaviors/registry/ui/learning/atoms/std-learn-perturb.orb +1 -1
  434. package/behaviors/registry/ui/learning/atoms/std-learn-predict.orb +1 -1
  435. package/behaviors/registry/ui/learning/atoms/std-learn-sample-accumulator.orb +1 -1
  436. package/behaviors/registry/ui/learning/atoms/std-learn-sandbox.orb +1 -1
  437. package/behaviors/registry/ui/learning/atoms/std-learn-scatter-fit.orb +1 -1
  438. package/behaviors/registry/ui/learning/atoms/std-learn-scenario.orb +1 -1
  439. package/behaviors/registry/ui/learning/atoms/std-learn-sim-3d.orb +1 -1
  440. package/behaviors/registry/ui/learning/atoms/std-learn-slope-probe.orb +1 -1
  441. package/behaviors/registry/ui/learning/atoms/std-learn-speed-drill.orb +1 -1
  442. package/behaviors/registry/ui/learning/atoms/std-learn-stepper.orb +1 -1
  443. package/behaviors/registry/ui/learning/atoms/std-learn-tour-3d.orb +1 -1
  444. package/behaviors/registry/ui/learning/atoms/std-learn-trace-player.orb +1 -1
  445. package/behaviors/registry/ui/learning/atoms/std-learn-transport.orb +1 -1
  446. package/behaviors/registry/ui/learning/atoms/std-learn-tree.orb +1 -1
  447. package/behaviors/registry/ui/learning/atoms/ui-algo-graph-canvas.orb +1 -1
  448. package/behaviors/registry/ui/learning/atoms/ui-algorithm-canvas.orb +1 -1
  449. package/behaviors/registry/ui/learning/atoms/ui-biology-canvas.orb +1 -1
  450. package/behaviors/registry/ui/learning/atoms/ui-chemistry-canvas.orb +1 -1
  451. package/behaviors/registry/ui/learning/atoms/ui-learning-canvas.orb +1 -1
  452. package/behaviors/registry/ui/learning/atoms/ui-math-canvas.orb +1 -1
  453. package/behaviors/registry/ui/learning/atoms/ui-physics-canvas.orb +1 -1
  454. package/dist/behaviors-embeddings.hash.json +2 -2
  455. package/dist/behaviors-embeddings.json +1 -1
  456. package/dist/knob-embeddings.hash.json +2 -2
  457. package/package.json +2 -2
@@ -1 +1 @@
1
- {"name":"std-thread","version":"1.3.0","description":"std-thread — forum-style nested replies with collapse. Owns ThreadPost (persistent). INIT fetches, scoped by @config.threadRootId when set (blank = every root, the default). The list holds top-level posts, each with its replies nested (one level). REPLY persists a child post under @payload.parentId in the same thread root, stamped with the real @user identity, and adds it to the parent's replies and replyCount. A consumer that mounts this as page comments forwards its own document-opened signal to SET_THREAD_ROOT { rootId }, which stamps @entity.replyRootId (scratch — the persisted threadRootId column is written only by the reply persist create) and refetches filtered by the payload; a plain INIT re-entry now also falls back through @entity.replyRootId before @config.threadRootId, so it stays scoped to the last SET_THREAD_ROOT instead of re-widening — only the after-create/after-select refetches still scope directly off their own event payload. Layer 3 variants override `bodyContent` to deliver chat-bubble, email-threaded, or linear-comments UX while inheriting the same trait, state machine, emits, and listens. A non-empty sectionTitle switches the default bodyContent into titled-comments mode: header + post list + a standalone composer button (without it an empty thread has no REPLY emitter at all — the affordance only existed per-row).","orbitals":[{"name":"ThreadPostOrbital","id":"orb_AY2XZHXA7TN3X2H7G51JFM4SR9","uses":[{"from":"std/behaviors/std-role-gate","as":"RoleGate"},{"from":"std/behaviors/ui-button","as":"Button"}],"entity":{"name":"ThreadPost","id":"ent_KH58D7S8RAMC58PM1PW2CKPM4E","collection":"threadposts","persistence":"persistent","fields":[{"name":"id","type":"string","required":true},{"name":"parentId","type":"string","description":"Identifier of the parent ThreadPost in a nested thread.","synonyms":"parent, ancestor, source"},{"name":"threadRootId","type":"string","required":true,"description":"Identifier of the top-level thread this post belongs to.","synonyms":"rootId, topLevelId, parentThreadId"},{"name":"authorId","type":"string","required":true,"description":"Unique identifier for the post's author.","synonyms":"user id, creator id, author"},{"name":"authorName","type":"string","required":true,"description":"The name of the post's author.","synonyms":"author, username, poster"},{"name":"content","type":"string","required":true,"description":"The main text content of the post.","synonyms":"text, message, body"},{"name":"createdAt","type":"string"},{"name":"voteCount","type":"number","default":0,"description":"The number of votes associated with this item.","synonyms":"votes, rating, score"},{"name":"replyCount","type":"number","default":0,"description":"The number of replies to this post.","synonyms":"count, number of replies, child posts"},{"name":"replies","type":"relation","relation":{"entity":"ThreadPost","entityId":"ent_KH58D7S8RAMC58PM1PW2CKPM4E","cardinality":"many"},"description":"A list of child ThreadPost entities.","synonyms":"children, descendants, sub-posts"},{"name":"focusedRow","type":"relation","relation":{"entity":"ThreadPost","entityId":"ent_KH58D7S8RAMC58PM1PW2CKPM4E","cardinality":"one"},"intrinsic":true,"description":"The currently selected or active row within the thread.","synonyms":"selection, active, current"},{"name":"replyDraft","type":"string","default":"","intrinsic":true,"description":"Reply text being composed."},{"name":"replyParentId","type":"string","default":"","intrinsic":true,"description":"Post the reply being composed answers."},{"name":"replyRootId","type":"string","default":"","intrinsic":true,"description":"Thread root the reply being composed belongs to."},{"name":"lastReplyId","type":"string","default":"","intrinsic":true,"description":"Reply just created, added to its parent post's replies."}]},"traits":[{"name":"ThreadPostBrowse","id":"trt_KWA8RDS7HHKRRJ66861JS5HCC4","entityRebindable":true,"entityContract":{"requires":[],"provides":["focusedRow","lastReplyId","replyDraft","replyParentId","replyRootId"]},"effectRow":[{"kind":"fetch","resource":"ThreadPost"},{"kind":"persist","resource":"ThreadPost"},{"kind":"render-ui","resource":"main"},{"kind":"render-ui","resource":"toast"},{"kind":"set","resource":"@entity.focusedRow"},{"kind":"set","resource":"@entity.lastReplyId"},{"kind":"set","resource":"@entity.replyDraft"},{"kind":"set","resource":"@entity.replyParentId"},{"kind":"set","resource":"@entity.replyRootId"}],"category":"interaction","linkedEntity":"ThreadPost","linkedEntityId":"ent_KH58D7S8RAMC58PM1PW2CKPM4E","entityRefIds":{"ThreadPost":"ent_KH58D7S8RAMC58PM1PW2CKPM4E"},"traitEmbedIds":{"ThreadReplyGate":"trt_RQVPBATRFMC7T2E27402KDZBKC"},"emits":[{"event":"SELECT","eventId":"evt_5WYFTNA50C2G6F757MN5R5V6J8","description":"Indicates a post or reply has been chosen for interaction.","synonyms":"choose, highlight, focus, activate","tier":"domain","scope":"external","payloadSchema":[{"name":"id","type":"string"},{"name":"row","type":"@entity","required":true}]},{"event":"REPLY","eventId":"evt_28PKJP8A3E51Q8PCA2G06WV80W","description":"Indicates a new reply has been created and added to the thread.","synonyms":"add, post, respond, submit","tier":"domain","payloadSchema":[{"name":"parentId","type":"string"},{"name":"parentNodeId","type":"string"},{"name":"content","type":"string"}]},{"event":"EDIT_REPLY","eventId":"evt_B0RQBMNYQRZBWAPYNFSR907AW2","description":"Indicates a reply has been modified.","synonyms":"update, change, modify","tier":"presentation","payloadSchema":[{"name":"value","type":"string","required":true}]},{"event":"SUBMIT_REPLY","eventId":"evt_QQTD3ACAWC5E6ATES7X61NYFB7","description":"Signals the composed draft should be persisted as a new post — the draft is read from the entity frame (@entity.content), so bare buttons can emit it.","synonyms":"post, send, add, publish","tier":"domain"},{"event":"CANCEL_REPLY","eventId":"evt_WZ08QDTTSGDCR18TW3HS5P6Z35","description":"Indicates a reply creation was aborted by the user.","synonyms":"abort, dismiss, undo, cancel","tier":"presentation"},{"event":"ThreadPostLoaded","eventId":"evt_P2DNHN4Z20FH0718XEXNPY3FFQ","description":"Signals a thread post has been successfully retrieved.","synonyms":"loaded, fetched, retrieved","tier":"internal","payloadSchema":[{"name":"data","type":"[object]","properties":[{"name":"id","type":"string","required":true},{"name":"parentId","type":"string"},{"name":"threadRootId","type":"string","required":true},{"name":"authorId","type":"string","required":true},{"name":"authorName","type":"string","required":true},{"name":"content","type":"string","required":true},{"name":"createdAt","type":"string"},{"name":"voteCount","type":"number"},{"name":"replyCount","type":"number"},{"name":"replies","type":"[ThreadPost]"},{"name":"focusedRow","type":"ThreadPost"},{"name":"replyDraft","type":"string"},{"name":"replyParentId","type":"string"},{"name":"replyRootId","type":"string"},{"name":"lastReplyId","type":"string"}],"entity":"ThreadPost"}]},{"event":"ThreadPostLoadFailed","eventId":"evt_KWQ0HBFR38W1M0ABYJZY7BYWSA","description":"Indicates a failure to load a thread post.","synonyms":"load error, fetch failed, retrieval failed","tier":"internal","payloadSchema":[{"name":"error","type":"string"},{"name":"code","type":"string"}]},{"event":"ThreadPostCreated","eventId":"evt_PTAQ86SRJ5W92TKZ9W228X2YQX","description":"A new post has been added to the thread — payload is the created ThreadPost row itself (flat: ?id, ?threadRootId, ?authorId, ?content, …), not wrapped under a row field.","synonyms":"new post, added, created","tier":"domain","scope":"internal","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"threadRootId","type":"string","required":true},{"name":"parentId","type":"string"}]},{"event":"ReplyParentLoaded","eventId":"evt_4X0FZXQWEKY79N4HZ9FSJCMXT3","tier":"internal","scope":"internal","payloadSchema":[{"name":"data","type":"object","required":true,"properties":[{"name":"id","type":"string","required":true},{"name":"parentId","type":"string"},{"name":"threadRootId","type":"string","required":true},{"name":"authorId","type":"string","required":true},{"name":"authorName","type":"string","required":true},{"name":"content","type":"string","required":true},{"name":"createdAt","type":"string"},{"name":"voteCount","type":"number"},{"name":"replyCount","type":"number"},{"name":"replies","type":"[ThreadPost]"},{"name":"focusedRow","type":"ThreadPost"},{"name":"replyDraft","type":"string"},{"name":"replyParentId","type":"string"},{"name":"replyRootId","type":"string"},{"name":"lastReplyId","type":"string"}],"entity":"ThreadPost"}]},{"event":"ReplyParentUpdated","eventId":"evt_59613ADGGTR8D25AP25HVT3EWH","description":"Fired after a new reply is added to its parent post's replies","tier":"internal","scope":"internal","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"parentId","type":"string"},{"name":"threadRootId","type":"string","required":true},{"name":"authorId","type":"string","required":true},{"name":"authorName","type":"string","required":true},{"name":"content","type":"string","required":true},{"name":"createdAt","type":"string"},{"name":"voteCount","type":"number"},{"name":"replyCount","type":"number"},{"name":"replies","type":"[ThreadPost]"},{"name":"focusedRow","type":"ThreadPost"},{"name":"replyDraft","type":"string"},{"name":"replyParentId","type":"string"},{"name":"replyRootId","type":"string"},{"name":"lastReplyId","type":"string"}],"payloadEntity":"ThreadPost"},{"event":"ReplyParentLoadFailed","eventId":"evt_Y1HEZQG1F20QH6W1MVSSX9QFWC","tier":"internal","scope":"internal","payloadSchema":[{"name":"error","type":"string"}]},{"event":"ThreadPostCreateFailed","eventId":"evt_00RQPN9ZJNZSAKNJHGMF27DFP1","description":"Indicates a failure to create a new thread post.","synonyms":"error, failed, creation failed","tier":"internal","payloadSchema":[{"name":"error","type":"string"},{"name":"code","type":"string"}]}],"stateMachine":{"states":[{"name":"loading","isInitial":true},{"name":"browsing"},{"name":"replying"},{"name":"error"}],"events":[{"key":"INIT","id":"evt_NWCNRJHBEDNQ6ZSQ512FPNN22Y","name":"Initialize"},{"key":"ThreadPostLoaded","id":"evt_P2DNHN4Z20FH0718XEXNPY3FFQ","name":"ThreadPost loaded","description":"Signals a thread post has been successfully retrieved.","synonyms":"loaded, fetched, retrieved","tier":"internal","payloadSchema":[{"name":"data","type":"[object]","properties":[{"name":"id","type":"string","required":true},{"name":"parentId","type":"string"},{"name":"threadRootId","type":"string","required":true},{"name":"authorId","type":"string","required":true},{"name":"authorName","type":"string","required":true},{"name":"content","type":"string","required":true},{"name":"createdAt","type":"string"},{"name":"voteCount","type":"number"},{"name":"replyCount","type":"number"},{"name":"replies","type":"[ThreadPost]"},{"name":"focusedRow","type":"ThreadPost"},{"name":"replyDraft","type":"string"},{"name":"replyParentId","type":"string"},{"name":"replyRootId","type":"string"},{"name":"lastReplyId","type":"string"}],"entity":"ThreadPost"}],"listened":true},{"key":"ThreadPostLoadFailed","id":"evt_KWQ0HBFR38W1M0ABYJZY7BYWSA","name":"ThreadPost load failed","description":"Indicates a failure to load a thread post.","synonyms":"load error, fetch failed, retrieval failed","tier":"internal","payloadSchema":[{"name":"error","type":"string"},{"name":"code","type":"string"}],"listened":true},{"key":"SET_THREAD_ROOT","id":"evt_CBGYWZ8KFV9QXG1356F9QRAJQ8","name":"Set Thread Root","description":"Scopes every fetch, and new-reply threadRootId stamping, to the descendants of one document root.","synonyms":"scope, focus, set root, document scope, thread scope","tier":"domain","payloadSchema":[{"name":"rootId","type":"string","required":true}],"listened":true},{"key":"REPLY","id":"evt_28PKJP8A3E51Q8PCA2G06WV80W","name":"Reply","description":"Indicates a new reply has been created and added to the thread.","synonyms":"add, post, respond, submit","tier":"domain","payloadSchema":[{"name":"parentId","type":"string"},{"name":"parentNodeId","type":"string"},{"name":"content","type":"string"}],"listened":true},{"key":"ThreadPostCreated","id":"evt_PTAQ86SRJ5W92TKZ9W228X2YQX","name":"ThreadPost created","description":"A new post has been added to the thread — payload is the created ThreadPost row itself (flat: ?id, ?threadRootId, ?authorId, ?content, …), not wrapped under a row field.","synonyms":"new post, added, created","tier":"domain","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"threadRootId","type":"string","required":true},{"name":"parentId","type":"string"}],"listened":true},{"key":"ReplyParentLoaded","id":"evt_4X0FZXQWEKY79N4HZ9FSJCMXT3","name":"Reply parent loaded","tier":"internal","payloadSchema":[{"name":"data","type":"object","required":true,"properties":[{"name":"id","type":"string","required":true},{"name":"parentId","type":"string"},{"name":"threadRootId","type":"string","required":true},{"name":"authorId","type":"string","required":true},{"name":"authorName","type":"string","required":true},{"name":"content","type":"string","required":true},{"name":"createdAt","type":"string"},{"name":"voteCount","type":"number"},{"name":"replyCount","type":"number"},{"name":"replies","type":"[ThreadPost]"},{"name":"focusedRow","type":"ThreadPost"},{"name":"replyDraft","type":"string"},{"name":"replyParentId","type":"string"},{"name":"replyRootId","type":"string"},{"name":"lastReplyId","type":"string"}],"entity":"ThreadPost"}],"listened":true},{"key":"ReplyParentLoadFailed","id":"evt_Y1HEZQG1F20QH6W1MVSSX9QFWC","name":"Reply parent load failed","tier":"internal","payloadSchema":[{"name":"error","type":"string"}],"listened":true},{"key":"ReplyParentUpdated","id":"evt_59613ADGGTR8D25AP25HVT3EWH","name":"Reply parent updated","tier":"internal","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"parentId","type":"string"},{"name":"threadRootId","type":"string","required":true},{"name":"authorId","type":"string","required":true},{"name":"authorName","type":"string","required":true},{"name":"content","type":"string","required":true},{"name":"createdAt","type":"string"},{"name":"voteCount","type":"number"},{"name":"replyCount","type":"number"},{"name":"replies","type":"[ThreadPost]"},{"name":"focusedRow","type":"ThreadPost"},{"name":"replyDraft","type":"string"},{"name":"replyParentId","type":"string"},{"name":"replyRootId","type":"string"},{"name":"lastReplyId","type":"string"}],"payloadEntity":"ThreadPost","listened":true},{"key":"SELECT","id":"evt_5WYFTNA50C2G6F757MN5R5V6J8","name":"Select","description":"Indicates a post or reply has been chosen for interaction.","synonyms":"choose, highlight, focus, activate","tier":"domain","payloadSchema":[{"name":"id","type":"string"},{"name":"row","type":"@entity","required":true}],"listened":true},{"key":"EDIT_REPLY","id":"evt_B0RQBMNYQRZBWAPYNFSR907AW2","name":"Edit Reply","description":"Indicates a reply has been modified.","synonyms":"update, change, modify","tier":"presentation","payloadSchema":[{"name":"value","type":"string","required":true}],"listened":true},{"key":"SUBMIT_REPLY","id":"evt_QQTD3ACAWC5E6ATES7X61NYFB7","name":"Submit Reply","description":"Signals the composed draft should be persisted as a new post — the draft is read from the entity frame (@entity.content), so bare buttons can emit it.","synonyms":"post, send, add, publish","tier":"domain","listened":true},{"key":"CANCEL_REPLY","id":"evt_WZ08QDTTSGDCR18TW3HS5P6Z35","name":"Cancel Reply","description":"Indicates a reply creation was aborted by the user.","synonyms":"abort, dismiss, undo, cancel","tier":"presentation","listened":true},{"key":"ThreadPostCreateFailed","id":"evt_00RQPN9ZJNZSAKNJHGMF27DFP1","name":"ThreadPost create failed","description":"Indicates a failure to create a new thread post.","synonyms":"error, failed, creation failed","tier":"internal","payloadSchema":[{"name":"error","type":"string"},{"name":"code","type":"string"}],"listened":true}],"transitions":[{"from":"loading","to":"loading","event":"INIT","eventId":"evt_NWCNRJHBEDNQ6ZSQ512FPNN22Y","effects":[["fetch","ThreadPost",{"emit":{"failure":"ThreadPostLoadFailed","success":"ThreadPostLoaded"},"filter":["and",["or",["=",["str/default","@entity.replyRootId","@config.threadRootId"],""],["=",["object/get","@entity","threadRootId"],["str/default","@entity.replyRootId","@config.threadRootId"]]],["=",["str/default",["object/get","@entity","parentId"],""],""]],"include":["replies"]}],["render-ui","main",{"type":"skeleton","variant":"list","rows":6}]]},{"from":"loading","to":"browsing","event":"ThreadPostLoaded","eventId":"evt_P2DNHN4Z20FH0718XEXNPY3FFQ","effects":[["render-ui","main","@config.bodyContent"]]},{"from":"loading","to":"error","event":"ThreadPostLoadFailed","eventId":"evt_KWQ0HBFR38W1M0ABYJZY7BYWSA","effects":[["render-ui","main",{"message":"@payload.error","type":"alert","variant":"error"}]]},{"from":"loading","to":"loading","event":"SET_THREAD_ROOT","eventId":"evt_CBGYWZ8KFV9QXG1356F9QRAJQ8","effects":[["set","@entity.replyRootId","@payload.rootId"],["fetch","ThreadPost",{"emit":{"failure":"ThreadPostLoadFailed","success":"ThreadPostLoaded"},"filter":["and",["or",["=","@payload.rootId",""],["=",["object/get","@entity","threadRootId"],"@payload.rootId"]],["=",["str/default",["object/get","@entity","parentId"],""],""]],"include":["replies"]}],["render-ui","main",{"type":"skeleton","variant":"list","rows":6}]]},{"from":"browsing","to":"loading","event":"INIT","eventId":"evt_NWCNRJHBEDNQ6ZSQ512FPNN22Y","effects":[["fetch","ThreadPost",{"emit":{"failure":"ThreadPostLoadFailed","success":"ThreadPostLoaded"},"filter":["and",["or",["=",["str/default","@entity.replyRootId","@config.threadRootId"],""],["=",["object/get","@entity","threadRootId"],["str/default","@entity.replyRootId","@config.threadRootId"]]],["=",["str/default",["object/get","@entity","parentId"],""],""]],"include":["replies"]}],["render-ui","main",{"type":"skeleton","variant":"list","rows":6}]]},{"from":"browsing","to":"browsing","event":"ThreadPostLoaded","eventId":"evt_P2DNHN4Z20FH0718XEXNPY3FFQ","effects":[["render-ui","main","@config.bodyContent"]]},{"from":"browsing","to":"browsing","event":"REPLY","eventId":"evt_28PKJP8A3E51Q8PCA2G06WV80W","guard":["not",["=",["str/default","@payload.content",""],""]],"effects":[["persist","create","ThreadPost",{"authorId":"@user.id","authorName":"@user.name","createdAt":"@now","content":"@payload.content","parentId":["str/default","@payload.parentNodeId","@payload.parentId"],"threadRootId":["str/default","@entity.replyRootId",["str/default","@config.threadRootId","root"]]},{"emit":{"failure":"ThreadPostCreateFailed","success":"ThreadPostCreated"}}]]},{"from":"browsing","to":"replying","event":"REPLY","eventId":"evt_28PKJP8A3E51Q8PCA2G06WV80W","guard":["=",["str/default","@payload.content",""],""],"effects":[["set","@entity.replyParentId",["str/default","@payload.parentNodeId","@payload.parentId"]],["render-ui","main",{"children":[{"content":"Write a reply","type":"typography","variant":"h4"},{"aria-label":"Your reply","onChange":"EDIT_REPLY","placeholder":"Your reply…","type":"textarea"},{"children":[{"action":"SUBMIT_REPLY","icon":"send","label":"Submit","type":"button","variant":"primary"},{"action":"CANCEL_REPLY","label":"Cancel","type":"button","variant":"secondary"}],"direction":"horizontal","gap":"sm","type":"stack"}],"direction":"vertical","gap":"md","type":"stack"}]]},{"from":"browsing","to":"browsing","event":"ThreadPostCreated","eventId":"evt_PTAQ86SRJ5W92TKZ9W228X2YQX","guard":["not",["=",["str/default","@payload.parentId",""],""]],"effects":[["set","@entity.replyDraft",""],["set","@entity.replyParentId",""],["set","@entity.lastReplyId","@payload.id"],["fetch","ThreadPost",{"id":"@payload.parentId","emit":{"failure":"ReplyParentLoadFailed","success":"ReplyParentLoaded"}}]]},{"from":"browsing","to":"browsing","event":"ThreadPostCreated","eventId":"evt_PTAQ86SRJ5W92TKZ9W228X2YQX","guard":["=",["str/default","@payload.parentId",""],""],"effects":[["set","@entity.replyDraft",""],["set","@entity.replyParentId",""],["fetch","ThreadPost",{"emit":{"failure":"ThreadPostLoadFailed","success":"ThreadPostLoaded"},"filter":["and",["or",["=","@payload.threadRootId",""],["=",["object/get","@entity","threadRootId"],"@payload.threadRootId"]],["=",["str/default",["object/get","@entity","parentId"],""],""]],"include":["replies"]}]]},{"from":"browsing","to":"browsing","event":"ReplyParentLoaded","eventId":"evt_4X0FZXQWEKY79N4HZ9FSJCMXT3","effects":[["persist","update","ThreadPost",{"id":"@payload.data.id","replies":["array/append",["object/get","@payload.data","replies",[]],"@entity.lastReplyId"],"replyCount":["+",["object/get","@payload.data","replyCount",0],1]},{"emit":{"failure":"ThreadPostCreateFailed","success":"ReplyParentUpdated"}}]]},{"from":"browsing","to":"browsing","event":"ReplyParentLoadFailed","eventId":"evt_Y1HEZQG1F20QH6W1MVSSX9QFWC","effects":[["render-ui","toast",{"type":"alert","variant":"error","message":["str/concat","Couldn't attach the reply to its post — ","@payload.error"],"dismissible":true}],["fetch","ThreadPost",{"emit":{"failure":"ThreadPostLoadFailed","success":"ThreadPostLoaded"},"filter":["and",["or",["=",["str/default","@entity.replyRootId","@config.threadRootId"],""],["=",["object/get","@entity","threadRootId"],["str/default","@entity.replyRootId","@config.threadRootId"]]],["=",["str/default",["object/get","@entity","parentId"],""],""]],"include":["replies"]}]]},{"from":"browsing","to":"browsing","event":"ReplyParentUpdated","eventId":"evt_59613ADGGTR8D25AP25HVT3EWH","effects":[["fetch","ThreadPost",{"emit":{"failure":"ThreadPostLoadFailed","success":"ThreadPostLoaded"},"filter":["and",["or",["=","@payload.threadRootId",""],["=",["object/get","@entity","threadRootId"],"@payload.threadRootId"]],["=",["str/default",["object/get","@entity","parentId"],""],""]],"include":["replies"]}]]},{"from":"browsing","to":"loading","event":"SELECT","eventId":"evt_5WYFTNA50C2G6F757MN5R5V6J8","effects":[["set","@entity.focusedRow","@payload.row"],["fetch","ThreadPost",{"emit":{"failure":"ThreadPostLoadFailed","success":"ThreadPostLoaded"},"filter":["and",["or",["=","@payload.row.threadRootId",""],["=",["object/get","@entity","threadRootId"],"@payload.row.threadRootId"]],["=",["str/default",["object/get","@entity","parentId"],""],""]],"include":["replies"]}]]},{"from":"browsing","to":"browsing","event":"EDIT_REPLY","eventId":"evt_B0RQBMNYQRZBWAPYNFSR907AW2","effects":[["set","@entity.replyDraft","@payload.value"]]},{"from":"browsing","to":"browsing","event":"SUBMIT_REPLY","eventId":"evt_QQTD3ACAWC5E6ATES7X61NYFB7","guard":["not",["=",["str/default","@entity.replyDraft",""],""]],"effects":[["persist","create","ThreadPost",{"authorId":"@user.id","authorName":"@user.name","createdAt":"@now","content":"@entity.replyDraft","parentId":["str/default","@entity.replyParentId",""],"threadRootId":["str/default","@entity.replyRootId",["str/default","@config.threadRootId","root"]]},{"emit":{"failure":"ThreadPostCreateFailed","success":"ThreadPostCreated"}}]]},{"from":"browsing","to":"browsing","event":"CANCEL_REPLY","eventId":"evt_WZ08QDTTSGDCR18TW3HS5P6Z35","effects":[["set","@entity.replyDraft",""],["set","@entity.replyParentId",""]]},{"from":"browsing","to":"browsing","event":"ThreadPostCreateFailed","eventId":"evt_00RQPN9ZJNZSAKNJHGMF27DFP1","effects":[["render-ui","main",{"message":"@payload.error","type":"alert","variant":"error"}]]},{"from":"browsing","to":"error","event":"ThreadPostLoadFailed","eventId":"evt_KWQ0HBFR38W1M0ABYJZY7BYWSA","effects":[["render-ui","main",{"message":"@payload.error","type":"alert","variant":"error"}]]},{"from":"browsing","to":"loading","event":"SET_THREAD_ROOT","eventId":"evt_CBGYWZ8KFV9QXG1356F9QRAJQ8","effects":[["set","@entity.replyRootId","@payload.rootId"],["fetch","ThreadPost",{"emit":{"failure":"ThreadPostLoadFailed","success":"ThreadPostLoaded"},"filter":["and",["or",["=","@payload.rootId",""],["=",["object/get","@entity","threadRootId"],"@payload.rootId"]],["=",["str/default",["object/get","@entity","parentId"],""],""]],"include":["replies"]}],["render-ui","main",{"type":"skeleton","variant":"list","rows":6}]]},{"from":"replying","to":"loading","event":"INIT","eventId":"evt_NWCNRJHBEDNQ6ZSQ512FPNN22Y","effects":[["fetch","ThreadPost",{"emit":{"failure":"ThreadPostLoadFailed","success":"ThreadPostLoaded"},"filter":["and",["or",["=",["str/default","@entity.replyRootId","@config.threadRootId"],""],["=",["object/get","@entity","threadRootId"],["str/default","@entity.replyRootId","@config.threadRootId"]]],["=",["str/default",["object/get","@entity","parentId"],""],""]],"include":["replies"]}],["render-ui","main",{"type":"skeleton","variant":"list","rows":6}]]},{"from":"replying","to":"replying","event":"EDIT_REPLY","eventId":"evt_B0RQBMNYQRZBWAPYNFSR907AW2","effects":[["set","@entity.replyDraft","@payload.value"]]},{"from":"replying","to":"browsing","event":"SUBMIT_REPLY","eventId":"evt_QQTD3ACAWC5E6ATES7X61NYFB7","guard":["not",["=",["str/default","@entity.replyDraft",""],""]],"effects":[["persist","create","ThreadPost",{"authorId":"@user.id","authorName":"@user.name","createdAt":"@now","content":"@entity.replyDraft","parentId":["str/default","@entity.replyParentId",""],"threadRootId":["str/default","@entity.replyRootId",["str/default","@config.threadRootId","root"]]},{"emit":{"failure":"ThreadPostCreateFailed","success":"ThreadPostCreated"}}]]},{"from":"replying","to":"browsing","event":"CANCEL_REPLY","eventId":"evt_WZ08QDTTSGDCR18TW3HS5P6Z35","effects":[["set","@entity.replyDraft",""],["set","@entity.replyParentId",""]]},{"from":"replying","to":"browsing","event":"ThreadPostCreated","eventId":"evt_PTAQ86SRJ5W92TKZ9W228X2YQX","guard":["not",["=",["str/default","@payload.parentId",""],""]],"effects":[["set","@entity.replyDraft",""],["set","@entity.replyParentId",""],["set","@entity.lastReplyId","@payload.id"],["fetch","ThreadPost",{"id":"@payload.parentId","emit":{"failure":"ReplyParentLoadFailed","success":"ReplyParentLoaded"}}]]},{"from":"replying","to":"browsing","event":"ThreadPostCreated","eventId":"evt_PTAQ86SRJ5W92TKZ9W228X2YQX","guard":["=",["str/default","@payload.parentId",""],""],"effects":[["set","@entity.replyDraft",""],["set","@entity.replyParentId",""],["fetch","ThreadPost",{"emit":{"failure":"ThreadPostLoadFailed","success":"ThreadPostLoaded"},"filter":["and",["or",["=","@payload.threadRootId",""],["=",["object/get","@entity","threadRootId"],"@payload.threadRootId"]],["=",["str/default",["object/get","@entity","parentId"],""],""]],"include":["replies"]}]]},{"from":"replying","to":"replying","event":"ThreadPostCreateFailed","eventId":"evt_00RQPN9ZJNZSAKNJHGMF27DFP1","effects":[["render-ui","main",{"message":"@payload.error","type":"alert","variant":"error"}]]},{"from":"replying","to":"loading","event":"SET_THREAD_ROOT","eventId":"evt_CBGYWZ8KFV9QXG1356F9QRAJQ8","effects":[["set","@entity.replyRootId","@payload.rootId"],["fetch","ThreadPost",{"emit":{"failure":"ThreadPostLoadFailed","success":"ThreadPostLoaded"},"filter":["and",["or",["=","@payload.rootId",""],["=",["object/get","@entity","threadRootId"],"@payload.rootId"]],["=",["str/default",["object/get","@entity","parentId"],""],""]],"include":["replies"]}],["render-ui","main",{"type":"skeleton","variant":"list","rows":6}]]},{"from":"error","to":"loading","event":"INIT","eventId":"evt_NWCNRJHBEDNQ6ZSQ512FPNN22Y","effects":[["fetch","ThreadPost",{"emit":{"failure":"ThreadPostLoadFailed","success":"ThreadPostLoaded"},"filter":["and",["or",["=",["str/default","@entity.replyRootId","@config.threadRootId"],""],["=",["object/get","@entity","threadRootId"],["str/default","@entity.replyRootId","@config.threadRootId"]]],["=",["str/default",["object/get","@entity","parentId"],""],""]],"include":["replies"]}],["render-ui","main",{"type":"skeleton","variant":"list","rows":6}]]},{"from":"error","to":"loading","event":"SET_THREAD_ROOT","eventId":"evt_CBGYWZ8KFV9QXG1356F9QRAJQ8","effects":[["set","@entity.replyRootId","@payload.rootId"],["fetch","ThreadPost",{"emit":{"failure":"ThreadPostLoadFailed","success":"ThreadPostLoaded"},"filter":["and",["or",["=","@payload.rootId",""],["=",["object/get","@entity","threadRootId"],"@payload.rootId"]],["=",["str/default",["object/get","@entity","parentId"],""],""]],"include":["replies"]}],["render-ui","main",{"type":"skeleton","variant":"list","rows":6}]]}]},"config":{"sectionTitle":{"type":"string","default":"","label":"sectionTitle","description":"Section header rendered by the default bodyContent when non-empty, along with a standalone composer button — the only REPLY affordance an empty thread has. Blank (the default) keeps the bare post list for embedded threads that bring their own chrome (chat rails, custom comment sections).","synonyms":"header, comments title, discussion title","tier":"presentation"},"itemActions":{"type":"[ItemAction]","default":[{"event":"REPLY","icon":"message-square","label":"Reply"}],"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":{"when":{"name":"when","type":"SExpr","required":false},"label":{"name":"label","type":"string","required":true},"icon":{"name":"icon","type":"string","required":false},"event":{"name":"event","type":"event","required":false},"roles":{"name":"roles","type":"array","required":false,"items":{"type":"string"}}}}},"composerLabel":{"type":"string","default":"Add comment","label":"composerLabel","description":"Label of the standalone composer button rendered under the post list when sectionTitle is non-empty.","synonyms":"reply label, comment button, add comment","tier":"presentation"},"replyRoles":{"type":"[string]","default":[],"label":"Roles that can reply","description":"Roles (matched against viewerRole) that see the thread's Reply button. Empty = everyone.","tier":"policy","items":{"type":"string"}},"threadRootId":{"type":"string","default":"","label":"Root post id","description":"Top-level post whose descendants are loaded, filters every fetch and defaults new top-level replies' threadRootId (blank = all roots, unfiltered)","synonyms":"rootId, topLevelId, scope, threadScope","tier":"domain"},"tableLook":{"type":"string","default":"dense","label":"Table look","description":"Layer 2 visual treatment for the data table rendered by this atom.","tier":"presentation","values":["dense","spacious","striped","borderless","card-rows"]},"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"},"bodyContent":{"type":"render-ui","default":{"children":[["if",["!=","@config.sectionTitle",""],{"content":"@config.sectionTitle","type":"typography","variant":"h4"},{"children":[],"gap":"none","type":"stack"}],{"entity":"@payload.data","fields":[{"label":"Author","name":"authorName","variant":"h4"},{"label":"","name":"content","variant":"body"},{"label":"Votes","name":"voteCount","variant":"caption"}],"gap":"sm","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-list","variant":"card"},["if",["!=","@config.sectionTitle",""],"@trait.ThreadReplyGate",{"children":[],"gap":"none","type":"stack"}]],"direction":"vertical","gap":"md","type":"stack"},"label":"Body content tree","description":"Render-ui SExpr rendered after thread posts load. Default is the canonical forum-style data-list. Layer 3 variants override this with their own tree (chat bubbles, email-threaded cards, linear comment stacks, etc.) to deliver entirely different thread UX while inheriting the same trait, state machine, emits, and listens.","tier":"internal"}},"scope":"collection"},{"ref":"Button.traits.ButtonRender","id":"trt_0RXAC5HPJRV9C9343XJ8DJQ931","name":"ThreadReplyButton","config":{"action":{"type":"unknown","default":"REPLY"},"variant":{"type":"unknown","default":"secondary"},"icon":{"type":"unknown","default":"message-square"},"label":{"type":"unknown","default":"@config.composerLabel"}}},{"ref":"RoleGate.traits.RoleGate","id":"trt_RQVPBATRFMC7T2E27402KDZBKC","name":"ThreadReplyGate","config":{"content":{"type":"unknown","default":"@trait.ThreadReplyButton"},"roles":{"type":"unknown","default":"@config.replyRoles"},"viewerRole":{"type":"unknown","default":"@config.viewerRole"}}}],"pages":[{"name":"ThreadPostBrowsePage","id":"pag_SQAC7YWKXX9YYNKVM5090GFW5X","path":"/threadposts","traits":[{"ref":"ThreadPostBrowse","refId":"trt_KWA8RDS7HHKRRJ66861JS5HCC4"}]}],"types":{"ItemAction":[{"name":"label","type":"string","required":true},{"name":"event","type":"event"},{"name":"icon","type":"string"},{"name":"roles","type":"[string]"},{"name":"when","type":"SExpr"}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_KH58D7S8RAMC58PM1PW2CKPM4E":{"id":"ent_KH58D7S8RAMC58PM1PW2CKPM4E","kind":"entity","bakedName":"ThreadPost","curName":"ThreadPost","renames":[],"owner":"workspace"},"evt_00RQPN9ZJNZSAKNJHGMF27DFP1":{"id":"evt_00RQPN9ZJNZSAKNJHGMF27DFP1","kind":"event","bakedName":"ThreadPostCreateFailed","curName":"ThreadPostCreateFailed","renames":[],"owner":"workspace","parent":"trt_KWA8RDS7HHKRRJ66861JS5HCC4"},"evt_28PKJP8A3E51Q8PCA2G06WV80W":{"id":"evt_28PKJP8A3E51Q8PCA2G06WV80W","kind":"event","bakedName":"REPLY","curName":"REPLY","renames":[],"owner":"workspace","parent":"trt_KWA8RDS7HHKRRJ66861JS5HCC4"},"evt_4X0FZXQWEKY79N4HZ9FSJCMXT3":{"id":"evt_4X0FZXQWEKY79N4HZ9FSJCMXT3","kind":"event","bakedName":"ReplyParentLoaded","curName":"ReplyParentLoaded","renames":[],"owner":"workspace","parent":"trt_KWA8RDS7HHKRRJ66861JS5HCC4"},"evt_59613ADGGTR8D25AP25HVT3EWH":{"id":"evt_59613ADGGTR8D25AP25HVT3EWH","kind":"event","bakedName":"ReplyParentUpdated","curName":"ReplyParentUpdated","renames":[],"owner":"workspace","parent":"trt_KWA8RDS7HHKRRJ66861JS5HCC4"},"evt_5WYFTNA50C2G6F757MN5R5V6J8":{"id":"evt_5WYFTNA50C2G6F757MN5R5V6J8","kind":"event","bakedName":"SELECT","curName":"SELECT","renames":[],"owner":"workspace","parent":"trt_KWA8RDS7HHKRRJ66861JS5HCC4"},"evt_B0RQBMNYQRZBWAPYNFSR907AW2":{"id":"evt_B0RQBMNYQRZBWAPYNFSR907AW2","kind":"event","bakedName":"EDIT_REPLY","curName":"EDIT_REPLY","renames":[],"owner":"workspace","parent":"trt_KWA8RDS7HHKRRJ66861JS5HCC4"},"evt_CBGYWZ8KFV9QXG1356F9QRAJQ8":{"id":"evt_CBGYWZ8KFV9QXG1356F9QRAJQ8","kind":"event","bakedName":"SET_THREAD_ROOT","curName":"SET_THREAD_ROOT","renames":[],"owner":"workspace","parent":"trt_KWA8RDS7HHKRRJ66861JS5HCC4"},"evt_KWQ0HBFR38W1M0ABYJZY7BYWSA":{"id":"evt_KWQ0HBFR38W1M0ABYJZY7BYWSA","kind":"event","bakedName":"ThreadPostLoadFailed","curName":"ThreadPostLoadFailed","renames":[],"owner":"workspace","parent":"trt_KWA8RDS7HHKRRJ66861JS5HCC4"},"evt_NWCNRJHBEDNQ6ZSQ512FPNN22Y":{"id":"evt_NWCNRJHBEDNQ6ZSQ512FPNN22Y","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_KWA8RDS7HHKRRJ66861JS5HCC4"},"evt_P2DNHN4Z20FH0718XEXNPY3FFQ":{"id":"evt_P2DNHN4Z20FH0718XEXNPY3FFQ","kind":"event","bakedName":"ThreadPostLoaded","curName":"ThreadPostLoaded","renames":[],"owner":"workspace","parent":"trt_KWA8RDS7HHKRRJ66861JS5HCC4"},"evt_PTAQ86SRJ5W92TKZ9W228X2YQX":{"id":"evt_PTAQ86SRJ5W92TKZ9W228X2YQX","kind":"event","bakedName":"ThreadPostCreated","curName":"ThreadPostCreated","renames":[],"owner":"workspace","parent":"trt_KWA8RDS7HHKRRJ66861JS5HCC4"},"evt_QQTD3ACAWC5E6ATES7X61NYFB7":{"id":"evt_QQTD3ACAWC5E6ATES7X61NYFB7","kind":"event","bakedName":"SUBMIT_REPLY","curName":"SUBMIT_REPLY","renames":[],"owner":"workspace","parent":"trt_KWA8RDS7HHKRRJ66861JS5HCC4"},"evt_WZ08QDTTSGDCR18TW3HS5P6Z35":{"id":"evt_WZ08QDTTSGDCR18TW3HS5P6Z35","kind":"event","bakedName":"CANCEL_REPLY","curName":"CANCEL_REPLY","renames":[],"owner":"workspace","parent":"trt_KWA8RDS7HHKRRJ66861JS5HCC4"},"evt_Y1HEZQG1F20QH6W1MVSSX9QFWC":{"id":"evt_Y1HEZQG1F20QH6W1MVSSX9QFWC","kind":"event","bakedName":"ReplyParentLoadFailed","curName":"ReplyParentLoadFailed","renames":[],"owner":"workspace","parent":"trt_KWA8RDS7HHKRRJ66861JS5HCC4"},"orb_AY2XZHXA7TN3X2H7G51JFM4SR9":{"id":"orb_AY2XZHXA7TN3X2H7G51JFM4SR9","kind":"orbital","bakedName":"ThreadPostOrbital","curName":"ThreadPostOrbital","renames":[],"owner":"workspace"},"pag_SQAC7YWKXX9YYNKVM5090GFW5X":{"id":"pag_SQAC7YWKXX9YYNKVM5090GFW5X","kind":"page","bakedName":"ThreadPostBrowsePage","curName":"ThreadPostBrowsePage","renames":[],"owner":"workspace"},"trt_0RXAC5HPJRV9C9343XJ8DJQ931":{"id":"trt_0RXAC5HPJRV9C9343XJ8DJQ931","kind":"trait","bakedName":"ThreadReplyButton","curName":"ThreadReplyButton","renames":[],"owner":"workspace"},"trt_KWA8RDS7HHKRRJ66861JS5HCC4":{"id":"trt_KWA8RDS7HHKRRJ66861JS5HCC4","kind":"trait","bakedName":"ThreadPostBrowse","curName":"ThreadPostBrowse","renames":[],"owner":"workspace"},"trt_RQVPBATRFMC7T2E27402KDZBKC":{"id":"trt_RQVPBATRFMC7T2E27402KDZBKC","kind":"trait","bakedName":"ThreadReplyGate","curName":"ThreadReplyGate","renames":[],"owner":"workspace"}}}}
1
+ {"name":"std-thread","version":"1.3.0","description":"std-thread — forum-style nested replies with collapse. Owns ThreadPost (persistent). INIT fetches, scoped by @config.threadRootId when set (blank = every root, the default). The list holds top-level posts, each with its replies nested (one level). REPLY persists a child post under @payload.parentId in the same thread root, stamped with the real @user identity, and adds it to the parent's replies and replyCount. A consumer that mounts this as page comments forwards its own document-opened signal to SET_THREAD_ROOT { rootId }, which stamps @entity.replyRootId (scratch — the persisted threadRootId column is written only by the reply persist create) and refetches filtered by the payload; a plain INIT re-entry now also falls back through @entity.replyRootId before @config.threadRootId, so it stays scoped to the last SET_THREAD_ROOT instead of re-widening — only the after-create/after-select refetches still scope directly off their own event payload. Layer 3 variants override `bodyContent` to deliver chat-bubble, email-threaded, or linear-comments UX while inheriting the same trait, state machine, emits, and listens. A non-empty sectionTitle switches the default bodyContent into titled-comments mode: header + post list + a standalone composer button (without it an empty thread has no REPLY emitter at all — the affordance only existed per-row).","orbitals":[{"name":"ThreadPostOrbital","id":"orb_AY2XZHXA7TN3X2H7G51JFM4SR9","uses":[{"from":"std/behaviors/std-role-gate","as":"RoleGate"},{"from":"std/behaviors/ui-button","as":"Button"}],"entity":{"name":"ThreadPost","id":"ent_KH58D7S8RAMC58PM1PW2CKPM4E","collection":"threadposts","persistence":"persistent","fields":[{"name":"id","type":"string","required":true},{"name":"parentId","type":"string","description":"Identifier of the parent ThreadPost in a nested thread.","synonyms":"parent, ancestor, source"},{"name":"threadRootId","type":"string","required":true,"description":"Identifier of the top-level thread this post belongs to.","synonyms":"rootId, topLevelId, parentThreadId"},{"name":"authorId","type":"string","required":true,"description":"Unique identifier for the post's author.","synonyms":"user id, creator id, author"},{"name":"authorName","type":"string","required":true,"description":"The name of the post's author.","synonyms":"author, username, poster"},{"name":"content","type":"string","required":true,"description":"The main text content of the post.","synonyms":"text, message, body"},{"name":"createdAt","type":"string"},{"name":"voteCount","type":"number","default":0,"description":"The number of votes associated with this item.","synonyms":"votes, rating, score"},{"name":"replyCount","type":"number","default":0,"description":"The number of replies to this post.","synonyms":"count, number of replies, child posts"},{"name":"replies","type":"relation","relation":{"entity":"ThreadPost","entityId":"ent_KH58D7S8RAMC58PM1PW2CKPM4E","cardinality":"many"},"description":"A list of child ThreadPost entities.","synonyms":"children, descendants, sub-posts"},{"name":"focusedRow","type":"relation","relation":{"entity":"ThreadPost","entityId":"ent_KH58D7S8RAMC58PM1PW2CKPM4E","cardinality":"one"},"intrinsic":true,"description":"The currently selected or active row within the thread.","synonyms":"selection, active, current"},{"name":"replyDraft","type":"string","default":"","intrinsic":true,"description":"Reply text being composed."},{"name":"replyParentId","type":"string","default":"","intrinsic":true,"description":"Post the reply being composed answers."},{"name":"replyRootId","type":"string","default":"","intrinsic":true,"description":"Thread root the reply being composed belongs to."},{"name":"lastReplyId","type":"string","default":"","intrinsic":true,"description":"Reply just created, added to its parent post's replies."}]},"traits":[{"name":"ThreadPostBrowse","id":"trt_KWA8RDS7HHKRRJ66861JS5HCC4","entityRebindable":true,"entityContract":{"requires":[],"provides":["focusedRow","lastReplyId","replyDraft","replyParentId","replyRootId"]},"effectRow":[{"kind":"fetch","resource":"ThreadPost"},{"kind":"persist","resource":"ThreadPost"},{"kind":"render-ui","resource":"main"},{"kind":"render-ui","resource":"toast"},{"kind":"set","resource":"@entity.focusedRow"},{"kind":"set","resource":"@entity.lastReplyId"},{"kind":"set","resource":"@entity.replyDraft"},{"kind":"set","resource":"@entity.replyParentId"},{"kind":"set","resource":"@entity.replyRootId"}],"category":"interaction","linkedEntity":"ThreadPost","linkedEntityId":"ent_KH58D7S8RAMC58PM1PW2CKPM4E","entityRefIds":{"ThreadPost":"ent_KH58D7S8RAMC58PM1PW2CKPM4E"},"traitEmbedIds":{"ThreadReplyGate":"trt_RQVPBATRFMC7T2E27402KDZBKC"},"emits":[{"event":"SELECT","eventId":"evt_5WYFTNA50C2G6F757MN5R5V6J8","description":"Indicates a post or reply has been chosen for interaction.","synonyms":"choose, highlight, focus, activate","tier":"domain","scope":"external","payloadSchema":[{"name":"id","type":"string"},{"name":"row","type":"@entity","required":true}]},{"event":"REPLY","eventId":"evt_28PKJP8A3E51Q8PCA2G06WV80W","description":"Indicates a new reply has been created and added to the thread.","synonyms":"add, post, respond, submit","tier":"domain","payloadSchema":[{"name":"parentId","type":"string"},{"name":"parentNodeId","type":"string"},{"name":"content","type":"string"}]},{"event":"EDIT_REPLY","eventId":"evt_B0RQBMNYQRZBWAPYNFSR907AW2","description":"Indicates a reply has been modified.","synonyms":"update, change, modify","tier":"presentation","payloadSchema":[{"name":"value","type":"string","required":true}]},{"event":"SUBMIT_REPLY","eventId":"evt_QQTD3ACAWC5E6ATES7X61NYFB7","description":"Signals the composed draft should be persisted as a new post — the draft is read from the entity frame (@entity.content), so bare buttons can emit it.","synonyms":"post, send, add, publish","tier":"domain"},{"event":"CANCEL_REPLY","eventId":"evt_WZ08QDTTSGDCR18TW3HS5P6Z35","description":"Indicates a reply creation was aborted by the user.","synonyms":"abort, dismiss, undo, cancel","tier":"presentation"},{"event":"ThreadPostLoaded","eventId":"evt_P2DNHN4Z20FH0718XEXNPY3FFQ","description":"Signals a thread post has been successfully retrieved.","synonyms":"loaded, fetched, retrieved","tier":"internal","payloadSchema":[{"name":"data","type":"[object]","properties":[{"name":"id","type":"string","required":true},{"name":"parentId","type":"string"},{"name":"threadRootId","type":"string","required":true},{"name":"authorId","type":"string","required":true},{"name":"authorName","type":"string","required":true},{"name":"content","type":"string","required":true},{"name":"createdAt","type":"string"},{"name":"voteCount","type":"number"},{"name":"replyCount","type":"number"},{"name":"replies","type":"[ThreadPost]"},{"name":"focusedRow","type":"ThreadPost"},{"name":"replyDraft","type":"string"},{"name":"replyParentId","type":"string"},{"name":"replyRootId","type":"string"},{"name":"lastReplyId","type":"string"}],"entity":"ThreadPost"}]},{"event":"ThreadPostLoadFailed","eventId":"evt_KWQ0HBFR38W1M0ABYJZY7BYWSA","description":"Indicates a failure to load a thread post.","synonyms":"load error, fetch failed, retrieval failed","tier":"internal","payloadSchema":[{"name":"error","type":"string"},{"name":"code","type":"string"}]},{"event":"ThreadPostCreated","eventId":"evt_PTAQ86SRJ5W92TKZ9W228X2YQX","description":"A new post has been added to the thread — payload is the created ThreadPost row itself (flat: ?id, ?threadRootId, ?authorId, ?content, …), not wrapped under a row field.","synonyms":"new post, added, created","tier":"domain","scope":"internal","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"threadRootId","type":"string","required":true},{"name":"parentId","type":"string"}]},{"event":"ReplyParentLoaded","eventId":"evt_4X0FZXQWEKY79N4HZ9FSJCMXT3","tier":"internal","scope":"internal","payloadSchema":[{"name":"data","type":"object","required":true,"properties":[{"name":"id","type":"string","required":true},{"name":"parentId","type":"string"},{"name":"threadRootId","type":"string","required":true},{"name":"authorId","type":"string","required":true},{"name":"authorName","type":"string","required":true},{"name":"content","type":"string","required":true},{"name":"createdAt","type":"string"},{"name":"voteCount","type":"number"},{"name":"replyCount","type":"number"},{"name":"replies","type":"[ThreadPost]"},{"name":"focusedRow","type":"ThreadPost"},{"name":"replyDraft","type":"string"},{"name":"replyParentId","type":"string"},{"name":"replyRootId","type":"string"},{"name":"lastReplyId","type":"string"}],"entity":"ThreadPost"}]},{"event":"ReplyParentUpdated","eventId":"evt_59613ADGGTR8D25AP25HVT3EWH","description":"Fired after a new reply is added to its parent post's replies","tier":"internal","scope":"internal","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"parentId","type":"string"},{"name":"threadRootId","type":"string","required":true},{"name":"authorId","type":"string","required":true},{"name":"authorName","type":"string","required":true},{"name":"content","type":"string","required":true},{"name":"createdAt","type":"string"},{"name":"voteCount","type":"number"},{"name":"replyCount","type":"number"},{"name":"replies","type":"[ThreadPost]"},{"name":"focusedRow","type":"ThreadPost"},{"name":"replyDraft","type":"string"},{"name":"replyParentId","type":"string"},{"name":"replyRootId","type":"string"},{"name":"lastReplyId","type":"string"}],"payloadEntity":"ThreadPost"},{"event":"ReplyParentLoadFailed","eventId":"evt_Y1HEZQG1F20QH6W1MVSSX9QFWC","tier":"internal","scope":"internal","payloadSchema":[{"name":"error","type":"string"}]},{"event":"ThreadPostCreateFailed","eventId":"evt_00RQPN9ZJNZSAKNJHGMF27DFP1","description":"Indicates a failure to create a new thread post.","synonyms":"error, failed, creation failed","tier":"internal","payloadSchema":[{"name":"error","type":"string"},{"name":"code","type":"string"}]}],"stateMachine":{"states":[{"name":"loading","isInitial":true},{"name":"browsing"},{"name":"replying"},{"name":"error"}],"events":[{"key":"INIT","id":"evt_NWCNRJHBEDNQ6ZSQ512FPNN22Y","name":"Initialize"},{"key":"ThreadPostLoaded","id":"evt_P2DNHN4Z20FH0718XEXNPY3FFQ","name":"ThreadPost loaded","description":"Signals a thread post has been successfully retrieved.","synonyms":"loaded, fetched, retrieved","tier":"internal","payloadSchema":[{"name":"data","type":"[object]","properties":[{"name":"id","type":"string","required":true},{"name":"parentId","type":"string"},{"name":"threadRootId","type":"string","required":true},{"name":"authorId","type":"string","required":true},{"name":"authorName","type":"string","required":true},{"name":"content","type":"string","required":true},{"name":"createdAt","type":"string"},{"name":"voteCount","type":"number"},{"name":"replyCount","type":"number"},{"name":"replies","type":"[ThreadPost]"},{"name":"focusedRow","type":"ThreadPost"},{"name":"replyDraft","type":"string"},{"name":"replyParentId","type":"string"},{"name":"replyRootId","type":"string"},{"name":"lastReplyId","type":"string"}],"entity":"ThreadPost"}],"listened":true},{"key":"ThreadPostLoadFailed","id":"evt_KWQ0HBFR38W1M0ABYJZY7BYWSA","name":"ThreadPost load failed","description":"Indicates a failure to load a thread post.","synonyms":"load error, fetch failed, retrieval failed","tier":"internal","payloadSchema":[{"name":"error","type":"string"},{"name":"code","type":"string"}],"listened":true},{"key":"SET_THREAD_ROOT","id":"evt_CBGYWZ8KFV9QXG1356F9QRAJQ8","name":"Set Thread Root","description":"Scopes every fetch, and new-reply threadRootId stamping, to the descendants of one document root.","synonyms":"scope, focus, set root, document scope, thread scope","tier":"domain","payloadSchema":[{"name":"rootId","type":"string","required":true}],"listened":true},{"key":"REPLY","id":"evt_28PKJP8A3E51Q8PCA2G06WV80W","name":"Reply","description":"Indicates a new reply has been created and added to the thread.","synonyms":"add, post, respond, submit","tier":"domain","payloadSchema":[{"name":"parentId","type":"string"},{"name":"parentNodeId","type":"string"},{"name":"content","type":"string"}],"listened":true},{"key":"ThreadPostCreated","id":"evt_PTAQ86SRJ5W92TKZ9W228X2YQX","name":"ThreadPost created","description":"A new post has been added to the thread — payload is the created ThreadPost row itself (flat: ?id, ?threadRootId, ?authorId, ?content, …), not wrapped under a row field.","synonyms":"new post, added, created","tier":"domain","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"threadRootId","type":"string","required":true},{"name":"parentId","type":"string"}],"listened":true},{"key":"ReplyParentLoaded","id":"evt_4X0FZXQWEKY79N4HZ9FSJCMXT3","name":"Reply parent loaded","tier":"internal","payloadSchema":[{"name":"data","type":"object","required":true,"properties":[{"name":"id","type":"string","required":true},{"name":"parentId","type":"string"},{"name":"threadRootId","type":"string","required":true},{"name":"authorId","type":"string","required":true},{"name":"authorName","type":"string","required":true},{"name":"content","type":"string","required":true},{"name":"createdAt","type":"string"},{"name":"voteCount","type":"number"},{"name":"replyCount","type":"number"},{"name":"replies","type":"[ThreadPost]"},{"name":"focusedRow","type":"ThreadPost"},{"name":"replyDraft","type":"string"},{"name":"replyParentId","type":"string"},{"name":"replyRootId","type":"string"},{"name":"lastReplyId","type":"string"}],"entity":"ThreadPost"}],"listened":true},{"key":"ReplyParentLoadFailed","id":"evt_Y1HEZQG1F20QH6W1MVSSX9QFWC","name":"Reply parent load failed","tier":"internal","payloadSchema":[{"name":"error","type":"string"}],"listened":true},{"key":"ReplyParentUpdated","id":"evt_59613ADGGTR8D25AP25HVT3EWH","name":"Reply parent updated","tier":"internal","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"parentId","type":"string"},{"name":"threadRootId","type":"string","required":true},{"name":"authorId","type":"string","required":true},{"name":"authorName","type":"string","required":true},{"name":"content","type":"string","required":true},{"name":"createdAt","type":"string"},{"name":"voteCount","type":"number"},{"name":"replyCount","type":"number"},{"name":"replies","type":"[ThreadPost]"},{"name":"focusedRow","type":"ThreadPost"},{"name":"replyDraft","type":"string"},{"name":"replyParentId","type":"string"},{"name":"replyRootId","type":"string"},{"name":"lastReplyId","type":"string"}],"payloadEntity":"ThreadPost","listened":true},{"key":"SELECT","id":"evt_5WYFTNA50C2G6F757MN5R5V6J8","name":"Select","description":"Indicates a post or reply has been chosen for interaction.","synonyms":"choose, highlight, focus, activate","tier":"domain","payloadSchema":[{"name":"id","type":"string"},{"name":"row","type":"@entity","required":true}],"listened":true},{"key":"EDIT_REPLY","id":"evt_B0RQBMNYQRZBWAPYNFSR907AW2","name":"Edit Reply","description":"Indicates a reply has been modified.","synonyms":"update, change, modify","tier":"presentation","payloadSchema":[{"name":"value","type":"string","required":true}],"listened":true},{"key":"SUBMIT_REPLY","id":"evt_QQTD3ACAWC5E6ATES7X61NYFB7","name":"Submit Reply","description":"Signals the composed draft should be persisted as a new post — the draft is read from the entity frame (@entity.content), so bare buttons can emit it.","synonyms":"post, send, add, publish","tier":"domain","listened":true},{"key":"CANCEL_REPLY","id":"evt_WZ08QDTTSGDCR18TW3HS5P6Z35","name":"Cancel Reply","description":"Indicates a reply creation was aborted by the user.","synonyms":"abort, dismiss, undo, cancel","tier":"presentation","listened":true},{"key":"ThreadPostCreateFailed","id":"evt_00RQPN9ZJNZSAKNJHGMF27DFP1","name":"ThreadPost create failed","description":"Indicates a failure to create a new thread post.","synonyms":"error, failed, creation failed","tier":"internal","payloadSchema":[{"name":"error","type":"string"},{"name":"code","type":"string"}],"listened":true}],"transitions":[{"from":"loading","to":"loading","event":"INIT","eventId":"evt_NWCNRJHBEDNQ6ZSQ512FPNN22Y","effects":[["fetch","ThreadPost",{"emit":{"failure":"ThreadPostLoadFailed","success":"ThreadPostLoaded"},"filter":["and",["or",["=",["str/default","@entity.replyRootId","@config.threadRootId"],""],["=",["object/get","@entity","threadRootId"],["str/default","@entity.replyRootId","@config.threadRootId"]]],["=",["str/default",["object/get","@entity","parentId"],""],""]],"include":["replies"]}],["render-ui","main",{"type":"skeleton","variant":"list","rows":6}]]},{"from":"loading","to":"browsing","event":"ThreadPostLoaded","eventId":"evt_P2DNHN4Z20FH0718XEXNPY3FFQ","effects":[["render-ui","main","@config.bodyContent"]]},{"from":"loading","to":"error","event":"ThreadPostLoadFailed","eventId":"evt_KWQ0HBFR38W1M0ABYJZY7BYWSA","effects":[["render-ui","main",{"message":"@payload.error","type":"alert","variant":"error"}]]},{"from":"loading","to":"loading","event":"SET_THREAD_ROOT","eventId":"evt_CBGYWZ8KFV9QXG1356F9QRAJQ8","effects":[["set","@entity.replyRootId","@payload.rootId"],["fetch","ThreadPost",{"emit":{"failure":"ThreadPostLoadFailed","success":"ThreadPostLoaded"},"filter":["and",["or",["=","@payload.rootId",""],["=",["object/get","@entity","threadRootId"],"@payload.rootId"]],["=",["str/default",["object/get","@entity","parentId"],""],""]],"include":["replies"]}],["render-ui","main",{"type":"skeleton","variant":"list","rows":6}]]},{"from":"browsing","to":"loading","event":"INIT","eventId":"evt_NWCNRJHBEDNQ6ZSQ512FPNN22Y","effects":[["fetch","ThreadPost",{"emit":{"failure":"ThreadPostLoadFailed","success":"ThreadPostLoaded"},"filter":["and",["or",["=",["str/default","@entity.replyRootId","@config.threadRootId"],""],["=",["object/get","@entity","threadRootId"],["str/default","@entity.replyRootId","@config.threadRootId"]]],["=",["str/default",["object/get","@entity","parentId"],""],""]],"include":["replies"]}],["render-ui","main",{"type":"skeleton","variant":"list","rows":6}]]},{"from":"browsing","to":"browsing","event":"ThreadPostLoaded","eventId":"evt_P2DNHN4Z20FH0718XEXNPY3FFQ","effects":[["render-ui","main","@config.bodyContent"]]},{"from":"browsing","to":"browsing","event":"REPLY","eventId":"evt_28PKJP8A3E51Q8PCA2G06WV80W","guard":["not",["=",["str/default","@payload.content",""],""]],"effects":[["persist","create","ThreadPost",{"authorId":"@user.id","authorName":"@user.name","createdAt":"@now","content":"@payload.content","parentId":["str/default","@payload.parentNodeId","@payload.parentId"],"threadRootId":["str/default","@entity.replyRootId",["str/default","@config.threadRootId","root"]]},{"emit":{"failure":"ThreadPostCreateFailed","success":"ThreadPostCreated"}}]]},{"from":"browsing","to":"replying","event":"REPLY","eventId":"evt_28PKJP8A3E51Q8PCA2G06WV80W","guard":["=",["str/default","@payload.content",""],""],"effects":[["set","@entity.replyParentId",["str/default","@payload.parentNodeId","@payload.parentId"]],["render-ui","main",{"children":[{"content":"Write a reply","type":"typography","variant":"h4"},{"aria-label":"Your reply","onChange":"EDIT_REPLY","placeholder":"Your reply…","type":"textarea"},{"children":[{"action":"SUBMIT_REPLY","icon":"send","label":"Submit","type":"button","variant":"primary"},{"action":"CANCEL_REPLY","label":"Cancel","type":"button","variant":"secondary"}],"direction":"horizontal","gap":"sm","type":"stack"}],"direction":"vertical","gap":"md","type":"stack"}]]},{"from":"browsing","to":"browsing","event":"ThreadPostCreated","eventId":"evt_PTAQ86SRJ5W92TKZ9W228X2YQX","guard":["not",["=",["str/default","@payload.parentId",""],""]],"effects":[["set","@entity.replyDraft",""],["set","@entity.replyParentId",""],["set","@entity.lastReplyId","@payload.id"],["fetch","ThreadPost",{"id":"@payload.parentId","emit":{"failure":"ReplyParentLoadFailed","success":"ReplyParentLoaded"}}]]},{"from":"browsing","to":"browsing","event":"ThreadPostCreated","eventId":"evt_PTAQ86SRJ5W92TKZ9W228X2YQX","guard":["=",["str/default","@payload.parentId",""],""],"effects":[["set","@entity.replyDraft",""],["set","@entity.replyParentId",""],["fetch","ThreadPost",{"emit":{"failure":"ThreadPostLoadFailed","success":"ThreadPostLoaded"},"filter":["and",["or",["=","@payload.threadRootId",""],["=",["object/get","@entity","threadRootId"],"@payload.threadRootId"]],["=",["str/default",["object/get","@entity","parentId"],""],""]],"include":["replies"]}]]},{"from":"browsing","to":"browsing","event":"ReplyParentLoaded","eventId":"evt_4X0FZXQWEKY79N4HZ9FSJCMXT3","effects":[["persist","update","ThreadPost",{"id":"@payload.data.id","replies":["array/append",["object/get","@payload.data","replies",[]],"@entity.lastReplyId"],"replyCount":["+",["object/get","@payload.data","replyCount",0],1]},{"emit":{"failure":"ThreadPostCreateFailed","success":"ReplyParentUpdated"}}]]},{"from":"browsing","to":"browsing","event":"ReplyParentLoadFailed","eventId":"evt_Y1HEZQG1F20QH6W1MVSSX9QFWC","effects":[["render-ui","toast",{"type":"alert","variant":"error","message":["str/concat","Couldn't attach the reply to its post — ","@payload.error"],"dismissible":true}],["fetch","ThreadPost",{"emit":{"failure":"ThreadPostLoadFailed","success":"ThreadPostLoaded"},"filter":["and",["or",["=",["str/default","@entity.replyRootId","@config.threadRootId"],""],["=",["object/get","@entity","threadRootId"],["str/default","@entity.replyRootId","@config.threadRootId"]]],["=",["str/default",["object/get","@entity","parentId"],""],""]],"include":["replies"]}]]},{"from":"browsing","to":"browsing","event":"ReplyParentUpdated","eventId":"evt_59613ADGGTR8D25AP25HVT3EWH","effects":[["fetch","ThreadPost",{"emit":{"failure":"ThreadPostLoadFailed","success":"ThreadPostLoaded"},"filter":["and",["or",["=","@payload.threadRootId",""],["=",["object/get","@entity","threadRootId"],"@payload.threadRootId"]],["=",["str/default",["object/get","@entity","parentId"],""],""]],"include":["replies"]}]]},{"from":"browsing","to":"loading","event":"SELECT","eventId":"evt_5WYFTNA50C2G6F757MN5R5V6J8","effects":[["set","@entity.focusedRow","@payload.row"],["fetch","ThreadPost",{"emit":{"failure":"ThreadPostLoadFailed","success":"ThreadPostLoaded"},"filter":["and",["or",["=","@payload.row.threadRootId",""],["=",["object/get","@entity","threadRootId"],"@payload.row.threadRootId"]],["=",["str/default",["object/get","@entity","parentId"],""],""]],"include":["replies"]}]]},{"from":"browsing","to":"browsing","event":"EDIT_REPLY","eventId":"evt_B0RQBMNYQRZBWAPYNFSR907AW2","effects":[["set","@entity.replyDraft","@payload.value"]]},{"from":"browsing","to":"browsing","event":"SUBMIT_REPLY","eventId":"evt_QQTD3ACAWC5E6ATES7X61NYFB7","guard":["not",["=",["str/default","@entity.replyDraft",""],""]],"effects":[["persist","create","ThreadPost",{"authorId":"@user.id","authorName":"@user.name","createdAt":"@now","content":"@entity.replyDraft","parentId":["str/default","@entity.replyParentId",""],"threadRootId":["str/default","@entity.replyRootId",["str/default","@config.threadRootId","root"]]},{"emit":{"failure":"ThreadPostCreateFailed","success":"ThreadPostCreated"}}]]},{"from":"browsing","to":"browsing","event":"CANCEL_REPLY","eventId":"evt_WZ08QDTTSGDCR18TW3HS5P6Z35","effects":[["set","@entity.replyDraft",""],["set","@entity.replyParentId",""]]},{"from":"browsing","to":"browsing","event":"ThreadPostCreateFailed","eventId":"evt_00RQPN9ZJNZSAKNJHGMF27DFP1","effects":[["render-ui","main",{"message":"@payload.error","type":"alert","variant":"error"}]]},{"from":"browsing","to":"error","event":"ThreadPostLoadFailed","eventId":"evt_KWQ0HBFR38W1M0ABYJZY7BYWSA","effects":[["render-ui","main",{"message":"@payload.error","type":"alert","variant":"error"}]]},{"from":"browsing","to":"loading","event":"SET_THREAD_ROOT","eventId":"evt_CBGYWZ8KFV9QXG1356F9QRAJQ8","effects":[["set","@entity.replyRootId","@payload.rootId"],["fetch","ThreadPost",{"emit":{"failure":"ThreadPostLoadFailed","success":"ThreadPostLoaded"},"filter":["and",["or",["=","@payload.rootId",""],["=",["object/get","@entity","threadRootId"],"@payload.rootId"]],["=",["str/default",["object/get","@entity","parentId"],""],""]],"include":["replies"]}],["render-ui","main",{"type":"skeleton","variant":"list","rows":6}]]},{"from":"replying","to":"loading","event":"INIT","eventId":"evt_NWCNRJHBEDNQ6ZSQ512FPNN22Y","effects":[["fetch","ThreadPost",{"emit":{"failure":"ThreadPostLoadFailed","success":"ThreadPostLoaded"},"filter":["and",["or",["=",["str/default","@entity.replyRootId","@config.threadRootId"],""],["=",["object/get","@entity","threadRootId"],["str/default","@entity.replyRootId","@config.threadRootId"]]],["=",["str/default",["object/get","@entity","parentId"],""],""]],"include":["replies"]}],["render-ui","main",{"type":"skeleton","variant":"list","rows":6}]]},{"from":"replying","to":"replying","event":"EDIT_REPLY","eventId":"evt_B0RQBMNYQRZBWAPYNFSR907AW2","effects":[["set","@entity.replyDraft","@payload.value"]]},{"from":"replying","to":"browsing","event":"SUBMIT_REPLY","eventId":"evt_QQTD3ACAWC5E6ATES7X61NYFB7","guard":["not",["=",["str/default","@entity.replyDraft",""],""]],"effects":[["persist","create","ThreadPost",{"authorId":"@user.id","authorName":"@user.name","createdAt":"@now","content":"@entity.replyDraft","parentId":["str/default","@entity.replyParentId",""],"threadRootId":["str/default","@entity.replyRootId",["str/default","@config.threadRootId","root"]]},{"emit":{"failure":"ThreadPostCreateFailed","success":"ThreadPostCreated"}}]]},{"from":"replying","to":"browsing","event":"CANCEL_REPLY","eventId":"evt_WZ08QDTTSGDCR18TW3HS5P6Z35","effects":[["set","@entity.replyDraft",""],["set","@entity.replyParentId",""]]},{"from":"replying","to":"browsing","event":"ThreadPostCreated","eventId":"evt_PTAQ86SRJ5W92TKZ9W228X2YQX","guard":["not",["=",["str/default","@payload.parentId",""],""]],"effects":[["set","@entity.replyDraft",""],["set","@entity.replyParentId",""],["set","@entity.lastReplyId","@payload.id"],["fetch","ThreadPost",{"id":"@payload.parentId","emit":{"failure":"ReplyParentLoadFailed","success":"ReplyParentLoaded"}}]]},{"from":"replying","to":"browsing","event":"ThreadPostCreated","eventId":"evt_PTAQ86SRJ5W92TKZ9W228X2YQX","guard":["=",["str/default","@payload.parentId",""],""],"effects":[["set","@entity.replyDraft",""],["set","@entity.replyParentId",""],["fetch","ThreadPost",{"emit":{"failure":"ThreadPostLoadFailed","success":"ThreadPostLoaded"},"filter":["and",["or",["=","@payload.threadRootId",""],["=",["object/get","@entity","threadRootId"],"@payload.threadRootId"]],["=",["str/default",["object/get","@entity","parentId"],""],""]],"include":["replies"]}]]},{"from":"replying","to":"replying","event":"ThreadPostCreateFailed","eventId":"evt_00RQPN9ZJNZSAKNJHGMF27DFP1","effects":[["render-ui","main",{"message":"@payload.error","type":"alert","variant":"error"}]]},{"from":"replying","to":"loading","event":"SET_THREAD_ROOT","eventId":"evt_CBGYWZ8KFV9QXG1356F9QRAJQ8","effects":[["set","@entity.replyRootId","@payload.rootId"],["fetch","ThreadPost",{"emit":{"failure":"ThreadPostLoadFailed","success":"ThreadPostLoaded"},"filter":["and",["or",["=","@payload.rootId",""],["=",["object/get","@entity","threadRootId"],"@payload.rootId"]],["=",["str/default",["object/get","@entity","parentId"],""],""]],"include":["replies"]}],["render-ui","main",{"type":"skeleton","variant":"list","rows":6}]]},{"from":"error","to":"loading","event":"INIT","eventId":"evt_NWCNRJHBEDNQ6ZSQ512FPNN22Y","effects":[["fetch","ThreadPost",{"emit":{"failure":"ThreadPostLoadFailed","success":"ThreadPostLoaded"},"filter":["and",["or",["=",["str/default","@entity.replyRootId","@config.threadRootId"],""],["=",["object/get","@entity","threadRootId"],["str/default","@entity.replyRootId","@config.threadRootId"]]],["=",["str/default",["object/get","@entity","parentId"],""],""]],"include":["replies"]}],["render-ui","main",{"type":"skeleton","variant":"list","rows":6}]]},{"from":"error","to":"loading","event":"SET_THREAD_ROOT","eventId":"evt_CBGYWZ8KFV9QXG1356F9QRAJQ8","effects":[["set","@entity.replyRootId","@payload.rootId"],["fetch","ThreadPost",{"emit":{"failure":"ThreadPostLoadFailed","success":"ThreadPostLoaded"},"filter":["and",["or",["=","@payload.rootId",""],["=",["object/get","@entity","threadRootId"],"@payload.rootId"]],["=",["str/default",["object/get","@entity","parentId"],""],""]],"include":["replies"]}],["render-ui","main",{"type":"skeleton","variant":"list","rows":6}]]}]},"config":{"replyRoles":{"type":"[string]","default":[],"label":"Roles that can reply","description":"Roles (matched against viewerRole) that see the thread's Reply button. Empty = everyone.","tier":"policy","items":{"type":"string"}},"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"},"composerLabel":{"type":"string","default":"Add comment","label":"composerLabel","description":"Label of the standalone composer button rendered under the post list when sectionTitle is non-empty.","synonyms":"reply label, comment button, add comment","tier":"presentation"},"tableLook":{"type":"string","default":"dense","label":"Table look","description":"Layer 2 visual treatment for the data table rendered by this atom.","tier":"presentation","values":["dense","spacious","striped","borderless","card-rows"]},"bodyContent":{"type":"render-ui","default":{"children":[["if",["!=","@config.sectionTitle",""],{"content":"@config.sectionTitle","type":"typography","variant":"h4"},{"children":[],"gap":"none","type":"stack"}],{"entity":"@payload.data","fields":[{"label":"Author","name":"authorName","variant":"h4"},{"label":"","name":"content","variant":"body"},{"label":"Votes","name":"voteCount","variant":"caption"}],"gap":"sm","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-list","variant":"card"},["if",["!=","@config.sectionTitle",""],"@trait.ThreadReplyGate",{"children":[],"gap":"none","type":"stack"}]],"direction":"vertical","gap":"md","type":"stack"},"label":"Body content tree","description":"Render-ui SExpr rendered after thread posts load. Default is the canonical forum-style data-list. Layer 3 variants override this with their own tree (chat bubbles, email-threaded cards, linear comment stacks, etc.) to deliver entirely different thread UX while inheriting the same trait, state machine, emits, and listens.","tier":"internal"},"threadRootId":{"type":"string","default":"","label":"Root post id","description":"Top-level post whose descendants are loaded, filters every fetch and defaults new top-level replies' threadRootId (blank = all roots, unfiltered)","synonyms":"rootId, topLevelId, scope, threadScope","tier":"domain"},"itemActions":{"type":"[ItemAction]","default":[{"event":"REPLY","icon":"message-square","label":"Reply"}],"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":{"event":{"name":"event","type":"event","required":false},"label":{"name":"label","type":"string","required":true},"icon":{"name":"icon","type":"string","required":false},"when":{"name":"when","type":"SExpr","required":false},"roles":{"name":"roles","type":"array","required":false,"items":{"type":"string"}}}}},"sectionTitle":{"type":"string","default":"","label":"sectionTitle","description":"Section header rendered by the default bodyContent when non-empty, along with a standalone composer button — the only REPLY affordance an empty thread has. Blank (the default) keeps the bare post list for embedded threads that bring their own chrome (chat rails, custom comment sections).","synonyms":"header, comments title, discussion title","tier":"presentation"}},"scope":"collection"},{"ref":"Button.traits.ButtonRender","id":"trt_0RXAC5HPJRV9C9343XJ8DJQ931","name":"ThreadReplyButton","config":{"variant":{"type":"unknown","default":"secondary"},"label":{"type":"unknown","default":"@config.composerLabel"},"icon":{"type":"unknown","default":"message-square"},"action":{"type":"unknown","default":"REPLY"}}},{"ref":"RoleGate.traits.RoleGate","id":"trt_RQVPBATRFMC7T2E27402KDZBKC","name":"ThreadReplyGate","config":{"viewerRole":{"type":"unknown","default":"@config.viewerRole"},"content":{"type":"unknown","default":"@trait.ThreadReplyButton"},"roles":{"type":"unknown","default":"@config.replyRoles"}}}],"pages":[{"name":"ThreadPostBrowsePage","id":"pag_SQAC7YWKXX9YYNKVM5090GFW5X","path":"/threadposts","traits":[{"ref":"ThreadPostBrowse","refId":"trt_KWA8RDS7HHKRRJ66861JS5HCC4"}]}],"types":{"ItemAction":[{"name":"label","type":"string","required":true},{"name":"event","type":"event"},{"name":"icon","type":"string"},{"name":"roles","type":"[string]"},{"name":"when","type":"SExpr"}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_KH58D7S8RAMC58PM1PW2CKPM4E":{"id":"ent_KH58D7S8RAMC58PM1PW2CKPM4E","kind":"entity","bakedName":"ThreadPost","curName":"ThreadPost","renames":[],"owner":"workspace"},"evt_00RQPN9ZJNZSAKNJHGMF27DFP1":{"id":"evt_00RQPN9ZJNZSAKNJHGMF27DFP1","kind":"event","bakedName":"ThreadPostCreateFailed","curName":"ThreadPostCreateFailed","renames":[],"owner":"workspace","parent":"trt_KWA8RDS7HHKRRJ66861JS5HCC4"},"evt_28PKJP8A3E51Q8PCA2G06WV80W":{"id":"evt_28PKJP8A3E51Q8PCA2G06WV80W","kind":"event","bakedName":"REPLY","curName":"REPLY","renames":[],"owner":"workspace","parent":"trt_KWA8RDS7HHKRRJ66861JS5HCC4"},"evt_4X0FZXQWEKY79N4HZ9FSJCMXT3":{"id":"evt_4X0FZXQWEKY79N4HZ9FSJCMXT3","kind":"event","bakedName":"ReplyParentLoaded","curName":"ReplyParentLoaded","renames":[],"owner":"workspace","parent":"trt_KWA8RDS7HHKRRJ66861JS5HCC4"},"evt_59613ADGGTR8D25AP25HVT3EWH":{"id":"evt_59613ADGGTR8D25AP25HVT3EWH","kind":"event","bakedName":"ReplyParentUpdated","curName":"ReplyParentUpdated","renames":[],"owner":"workspace","parent":"trt_KWA8RDS7HHKRRJ66861JS5HCC4"},"evt_5WYFTNA50C2G6F757MN5R5V6J8":{"id":"evt_5WYFTNA50C2G6F757MN5R5V6J8","kind":"event","bakedName":"SELECT","curName":"SELECT","renames":[],"owner":"workspace","parent":"trt_KWA8RDS7HHKRRJ66861JS5HCC4"},"evt_B0RQBMNYQRZBWAPYNFSR907AW2":{"id":"evt_B0RQBMNYQRZBWAPYNFSR907AW2","kind":"event","bakedName":"EDIT_REPLY","curName":"EDIT_REPLY","renames":[],"owner":"workspace","parent":"trt_KWA8RDS7HHKRRJ66861JS5HCC4"},"evt_CBGYWZ8KFV9QXG1356F9QRAJQ8":{"id":"evt_CBGYWZ8KFV9QXG1356F9QRAJQ8","kind":"event","bakedName":"SET_THREAD_ROOT","curName":"SET_THREAD_ROOT","renames":[],"owner":"workspace","parent":"trt_KWA8RDS7HHKRRJ66861JS5HCC4"},"evt_KWQ0HBFR38W1M0ABYJZY7BYWSA":{"id":"evt_KWQ0HBFR38W1M0ABYJZY7BYWSA","kind":"event","bakedName":"ThreadPostLoadFailed","curName":"ThreadPostLoadFailed","renames":[],"owner":"workspace","parent":"trt_KWA8RDS7HHKRRJ66861JS5HCC4"},"evt_NWCNRJHBEDNQ6ZSQ512FPNN22Y":{"id":"evt_NWCNRJHBEDNQ6ZSQ512FPNN22Y","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_KWA8RDS7HHKRRJ66861JS5HCC4"},"evt_P2DNHN4Z20FH0718XEXNPY3FFQ":{"id":"evt_P2DNHN4Z20FH0718XEXNPY3FFQ","kind":"event","bakedName":"ThreadPostLoaded","curName":"ThreadPostLoaded","renames":[],"owner":"workspace","parent":"trt_KWA8RDS7HHKRRJ66861JS5HCC4"},"evt_PTAQ86SRJ5W92TKZ9W228X2YQX":{"id":"evt_PTAQ86SRJ5W92TKZ9W228X2YQX","kind":"event","bakedName":"ThreadPostCreated","curName":"ThreadPostCreated","renames":[],"owner":"workspace","parent":"trt_KWA8RDS7HHKRRJ66861JS5HCC4"},"evt_QQTD3ACAWC5E6ATES7X61NYFB7":{"id":"evt_QQTD3ACAWC5E6ATES7X61NYFB7","kind":"event","bakedName":"SUBMIT_REPLY","curName":"SUBMIT_REPLY","renames":[],"owner":"workspace","parent":"trt_KWA8RDS7HHKRRJ66861JS5HCC4"},"evt_WZ08QDTTSGDCR18TW3HS5P6Z35":{"id":"evt_WZ08QDTTSGDCR18TW3HS5P6Z35","kind":"event","bakedName":"CANCEL_REPLY","curName":"CANCEL_REPLY","renames":[],"owner":"workspace","parent":"trt_KWA8RDS7HHKRRJ66861JS5HCC4"},"evt_Y1HEZQG1F20QH6W1MVSSX9QFWC":{"id":"evt_Y1HEZQG1F20QH6W1MVSSX9QFWC","kind":"event","bakedName":"ReplyParentLoadFailed","curName":"ReplyParentLoadFailed","renames":[],"owner":"workspace","parent":"trt_KWA8RDS7HHKRRJ66861JS5HCC4"},"orb_AY2XZHXA7TN3X2H7G51JFM4SR9":{"id":"orb_AY2XZHXA7TN3X2H7G51JFM4SR9","kind":"orbital","bakedName":"ThreadPostOrbital","curName":"ThreadPostOrbital","renames":[],"owner":"workspace"},"pag_SQAC7YWKXX9YYNKVM5090GFW5X":{"id":"pag_SQAC7YWKXX9YYNKVM5090GFW5X","kind":"page","bakedName":"ThreadPostBrowsePage","curName":"ThreadPostBrowsePage","renames":[],"owner":"workspace"},"trt_0RXAC5HPJRV9C9343XJ8DJQ931":{"id":"trt_0RXAC5HPJRV9C9343XJ8DJQ931","kind":"trait","bakedName":"ThreadReplyButton","curName":"ThreadReplyButton","renames":[],"owner":"workspace"},"trt_KWA8RDS7HHKRRJ66861JS5HCC4":{"id":"trt_KWA8RDS7HHKRRJ66861JS5HCC4","kind":"trait","bakedName":"ThreadPostBrowse","curName":"ThreadPostBrowse","renames":[],"owner":"workspace"},"trt_RQVPBATRFMC7T2E27402KDZBKC":{"id":"trt_RQVPBATRFMC7T2E27402KDZBKC","kind":"trait","bakedName":"ThreadReplyGate","curName":"ThreadReplyGate","renames":[],"owner":"workspace"}}}}
@@ -1 +1 @@
1
- {"name":"std-tree","version":"1.0.0","description":"std-tree — generic hierarchical node browser. Fetches a flat TreeNode collection and renders it through file-tree's flat `items` mode (parentId-nested at render time by the component, not the .lolo); OPEN_NODE is the external handoff for a selected node's id. Rebindable: pass `fields` at the call site to retarget it at any parent-pointer entity (categories, org units, comment threads). Search/filter are wired (REFETCH_QUERY/REFETCH_FILTER re-fetch the flat node set server-side). `look: rail` renders the compact sidebar-navigation form (slim caption, nav-styled rows) for mounting in an app layout's sidebarTrait; SET_CURRENT marks the open record so the row highlights and its ancestors auto-expand; `childAction: true` renders a hover plus-affordance per row emitting CHILD_REQUESTED { parentId } for the host's create-draft writer; pagination is deliberately NOT offered — a hierarchy is not a paged list, and paging a flat node set would sever children from parents that fell on another page.","orbitals":[{"name":"TreeNodeOrbital","id":"orb_K5HC1GKD1YPGZ7SQE53Q0TJJZD","entity":{"name":"TreeNode","id":"ent_5APRB5JXDBEPNPP1MM3N15E99Z","collection":"treenodes","persistence":"persistent","fields":[{"name":"id","type":"string","required":true},{"name":"name","type":"string","required":true,"description":"The descriptive label for this node.","synonyms":"label, title, text"},{"name":"parentId","type":"string","default":"","description":"Reference to the parent node in the hierarchy; empty marks a root.","synonyms":"parent, superior, ancestor"},{"name":"icon","type":"string","default":"","description":"Icon name shown beside the node.","synonyms":"glyph, symbol, pictogram"},{"name":"createdAt","type":"string"}]},"traits":[{"name":"TreeBrowse","id":"trt_R29RXTEPB0B5G9HGD5FWPSZREA","entityRebindable":true,"entityContract":{"requires":[],"provides":[]},"effectRow":[{"kind":"emit","resource":"CHILD_REQUESTED"},{"kind":"fetch","resource":"TreeNode"},{"kind":"render-ui","resource":"main"},{"kind":"set","resource":"@entity.id"}],"category":"interaction","linkedEntity":"TreeNode","linkedEntityId":"ent_5APRB5JXDBEPNPP1MM3N15E99Z","entityRefIds":{"TreeNode":"ent_5APRB5JXDBEPNPP1MM3N15E99Z"},"emits":[{"event":"OPEN_NODE","eventId":"evt_FP54V2CDJP6SB1R12KR5B83BKX","description":"Signals a tree node has been selected for external handoff.","synonyms":"select, choose, open, activate","tier":"domain","payloadSchema":[{"name":"id","type":"string","required":true}]},{"event":"CHILD_REQUESTED","eventId":"evt_6RDSGHTV93DMHV770ECQ7R8F7Z","description":"Create a new record under this node — the host routes it into its create-draft writer with parentId stamped.","synonyms":"new subpage, add child page, create under","tier":"domain","scope":"external","payloadSchema":[{"name":"parentId","type":"string","required":true}]},{"event":"TreeNodeLoaded","eventId":"evt_HQ0T392G3N81TZ03GHXBBSJGBQ","description":"Indicates the tree node collection has been successfully retrieved.","synonyms":"loaded, fetched, retrieved, ready","tier":"internal","payloadSchema":[{"name":"data","type":"[object]","properties":[{"name":"id","type":"string","required":true},{"name":"name","type":"string","required":true},{"name":"parentId","type":"string"},{"name":"icon","type":"string"},{"name":"createdAt","type":"string"}],"entity":"TreeNode"}]},{"event":"TreeNodeLoadFailed","eventId":"evt_SWNWVQMM5PA2V39GDPP95XPBJJ","description":"Indicates a failure to load the tree node collection.","synonyms":"error, failed, problem, unsuccessful","tier":"internal","payloadSchema":[{"name":"error","type":"string"},{"name":"code","type":"string"}]}],"stateMachine":{"states":[{"name":"loading","isInitial":true},{"name":"browsing"},{"name":"error"}],"events":[{"key":"SET_CURRENT","id":"evt_JGFF0YKSX4WYJ3CF1ZE8PA4H8E","name":"Set Current","description":"Mark this record as the open one (routed from the host document's load events); its row highlights and its ancestors auto-expand.","synonyms":"highlight current, select node, you are here","tier":"domain","payloadSchema":[{"name":"id","type":"string","required":true}],"listened":true},{"key":"INIT","id":"evt_6ZR8BBAD296H4Q2R5YAHHX72PV","name":"Initialize"},{"key":"TreeNodeLoaded","id":"evt_HQ0T392G3N81TZ03GHXBBSJGBQ","name":"TreeNode loaded","description":"Indicates the tree node collection has been successfully retrieved.","synonyms":"loaded, fetched, retrieved, ready","tier":"internal","payloadSchema":[{"name":"data","type":"[object]","properties":[{"name":"id","type":"string","required":true},{"name":"name","type":"string","required":true},{"name":"parentId","type":"string"},{"name":"icon","type":"string"},{"name":"createdAt","type":"string"}],"entity":"TreeNode"}],"listened":true},{"key":"TreeNodeLoadFailed","id":"evt_SWNWVQMM5PA2V39GDPP95XPBJJ","name":"TreeNode load failed","description":"Indicates a failure to load the tree node collection.","synonyms":"error, failed, problem, unsuccessful","tier":"internal","payloadSchema":[{"name":"error","type":"string"},{"name":"code","type":"string"}],"listened":true},{"key":"REFETCH_QUERY","id":"evt_VDRPEJGB985MM4PNK356C2K99W","name":"Refetch Query","description":"Triggers a tree refresh based on the current search query.","synonyms":"refresh, reload, update, re-query","tier":"domain","payloadSchema":[{"name":"searchTerm","type":"string","required":true}],"listened":true},{"key":"REFETCH_FILTER","id":"evt_J4YMNYP7R83W4D9HZTJ4R2NY4K","name":"Refetch Filter","description":"Triggers a tree refresh based on current filter criteria.","synonyms":"refresh, filter, update, reload","tier":"domain","payloadSchema":[{"name":"entity","type":"string","required":true},{"name":"field","type":"string","required":true},{"name":"value","type":"string","required":true},{"name":"query","type":"string"}],"listened":true},{"key":"OPEN_NODE","id":"evt_FP54V2CDJP6SB1R12KR5B83BKX","name":"Open Node","description":"Signals a tree node has been selected for external handoff.","synonyms":"select, choose, open, activate","tier":"domain","payloadSchema":[{"name":"id","type":"string","required":true}],"listened":true},{"key":"ADD_CHILD","id":"evt_K7SJVNPTQWDBY6Y3N6RMKMV57Z","name":"Add Child","description":"The row's hover + affordance was clicked.","synonyms":"add inside, new child","tier":"presentation","payloadSchema":[{"name":"id","type":"string","required":true}],"listened":true},{"key":"RETRY","id":"evt_W13QH82C5Y62ZDC3EGS0THRTXJ","name":"Retry"},{"key":"CHILD_REQUESTED","id":"evt_6RDSGHTV93DMHV770ECQ7R8F7Z","name":"Child Requested","description":"Create a new record under this node — the host routes it into its create-draft writer with parentId stamped.","synonyms":"new subpage, add child page, create under","tier":"domain","payloadSchema":[{"name":"parentId","type":"string","required":true}]}],"transitions":[{"from":"loading","to":"loading","event":"SET_CURRENT","eventId":"evt_JGFF0YKSX4WYJ3CF1ZE8PA4H8E","effects":[["set","@entity.id","@payload.id"],["fetch","TreeNode",{"emit":{"failure":"TreeNodeLoadFailed","success":"TreeNodeLoaded"}}]]},{"from":"loading","to":"loading","event":"INIT","eventId":"evt_6ZR8BBAD296H4Q2R5YAHHX72PV","effects":[["fetch","TreeNode",{"filter":["or",["=","@config.initialFilterField",""],["=",["object/get","@entity","@config.initialFilterField"],"@config.initialFilterValue"]],"emit":{"failure":"TreeNodeLoadFailed","success":"TreeNodeLoaded"}}],["render-ui","main",{"type":"stack","direction":"vertical","gap":"lg","children":[{"type":"skeleton","variant":"header"},{"type":"skeleton","variant":"list","rows":6}]}]]},{"from":"loading","to":"browsing","event":"TreeNodeLoaded","eventId":"evt_HQ0T392G3N81TZ03GHXBBSJGBQ","effects":[["render-ui","main",{"children":[["if",["=","@config.look","rail"],{"className":"px-2 pb-1 uppercase tracking-wide","color":"muted","content":"@config.title","type":"typography","variant":"caption"},{"align":"center","children":[{"name":"list-tree","size":"lg","type":"icon"},{"content":"@config.title","type":"typography","variant":"h3"},{"label":["array/len","@payload.data"],"size":"sm","type":"badge","variant":"neutral"}],"direction":"horizontal","gap":"sm","type":"stack"}],["if",["=","@config.look","rail"],{"children":[],"gap":"none","type":"stack"},{"type":"divider"}],["if","@config.bodySearch",{"children":[{"className":"w-full max-w-md","clearable":true,"event":"REFETCH_QUERY","placeholder":"@config.searchPlaceholder","type":"search-input"}],"direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],["if",[">",["array/len","@config.filters"],0],{"children":[{"entity":"TreeNode","event":"REFETCH_FILTER","filters":"@config.filters","look":"@config.filterBarLook","type":"filter-group"}],"direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],{"items":["array/map","@payload.data",["fn","row",{"icon":["str/default",["object/get","@row","@config.iconField"],""],"id":"@row.id","label":["str/default",["object/get","@row","@config.labelField"],""],"parentId":["str/default",["object/get","@row","@config.parentField"],""]}]],"look":["if",["=","@config.look","rail"],"nav","files"],"nodeActionIcon":"plus","nodeActionLabel":"@config.childActionLabel","onNodeAction":["if","@config.childAction","ADD_CHILD",null],"onNodeSelect":"OPEN_NODE","selectedId":["str/default",["object/get","@entity","id"],""],"type":"file-tree"}],"direction":"vertical","gap":["if",["=","@config.look","rail"],"none","md"],"type":"stack"}]]},{"from":"loading","to":"error","event":"TreeNodeLoadFailed","eventId":"evt_SWNWVQMM5PA2V39GDPP95XPBJJ","effects":[["render-ui","main",{"align":"center","children":[{"color":"error","name":"alert-triangle","type":"icon"},{"content":"Failed to load tree","type":"typography","variant":"body"},{"color":"muted","content":"@payload.error","type":"typography","variant":"caption"},{"action":"RETRY","icon":"rotate-ccw","label":"Retry","type":"button","variant":"ghost"}],"className":"py-8","direction":"vertical","gap":"sm","type":"stack"}]]},{"from":"browsing","to":"loading","event":"INIT","eventId":"evt_6ZR8BBAD296H4Q2R5YAHHX72PV","effects":[["fetch","TreeNode",{"filter":["or",["=","@config.initialFilterField",""],["=",["object/get","@entity","@config.initialFilterField"],"@config.initialFilterValue"]],"emit":{"failure":"TreeNodeLoadFailed","success":"TreeNodeLoaded"}}],["render-ui","main",{"type":"stack","direction":"vertical","gap":"lg","children":[{"type":"skeleton","variant":"header"},{"type":"skeleton","variant":"list","rows":6}]}]]},{"from":"browsing","to":"browsing","event":"REFETCH_QUERY","eventId":"evt_VDRPEJGB985MM4PNK356C2K99W","effects":[["fetch","TreeNode",{"emit":{"failure":"TreeNodeLoadFailed","success":"TreeNodeLoaded"},"filter":["or",["=","@payload.searchTerm",""],["str/includes",["str/default",["object/get","@entity","@config.labelField"],""],"@payload.searchTerm"]]}]]},{"from":"browsing","to":"browsing","event":"REFETCH_FILTER","eventId":"evt_J4YMNYP7R83W4D9HZTJ4R2NY4K","effects":[["fetch","TreeNode",{"emit":{"failure":"TreeNodeLoadFailed","success":"TreeNodeLoaded"},"filter":["or",["=","@payload.value",""],["=",["object/get","@entity","@payload.field"],"@payload.value"]]}]]},{"from":"browsing","to":"browsing","event":"OPEN_NODE","eventId":"evt_FP54V2CDJP6SB1R12KR5B83BKX","effects":[["set","@entity.id","@payload.id"]]},{"from":"browsing","to":"browsing","event":"SET_CURRENT","eventId":"evt_JGFF0YKSX4WYJ3CF1ZE8PA4H8E","effects":[["set","@entity.id","@payload.id"],["fetch","TreeNode",{"emit":{"failure":"TreeNodeLoadFailed","success":"TreeNodeLoaded"}}]]},{"from":"browsing","to":"browsing","event":"ADD_CHILD","eventId":"evt_K7SJVNPTQWDBY6Y3N6RMKMV57Z","effects":[["emit","CHILD_REQUESTED",{"parentId":"@payload.id"}]]},{"from":"browsing","to":"browsing","event":"TreeNodeLoaded","eventId":"evt_HQ0T392G3N81TZ03GHXBBSJGBQ","effects":[["render-ui","main",{"children":[["if",["=","@config.look","rail"],{"className":"px-2 pb-1 uppercase tracking-wide","color":"muted","content":"@config.title","type":"typography","variant":"caption"},{"align":"center","children":[{"name":"list-tree","size":"lg","type":"icon"},{"content":"@config.title","type":"typography","variant":"h3"},{"label":["array/len","@payload.data"],"size":"sm","type":"badge","variant":"neutral"}],"direction":"horizontal","gap":"sm","type":"stack"}],["if",["=","@config.look","rail"],{"children":[],"gap":"none","type":"stack"},{"type":"divider"}],["if","@config.bodySearch",{"children":[{"className":"w-full max-w-md","clearable":true,"event":"REFETCH_QUERY","placeholder":"@config.searchPlaceholder","type":"search-input"}],"direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],["if",[">",["array/len","@config.filters"],0],{"children":[{"entity":"TreeNode","event":"REFETCH_FILTER","filters":"@config.filters","look":"@config.filterBarLook","type":"filter-group"}],"direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],{"items":["array/map","@payload.data",["fn","row",{"icon":["str/default",["object/get","@row","@config.iconField"],""],"id":"@row.id","label":["str/default",["object/get","@row","@config.labelField"],""],"parentId":["str/default",["object/get","@row","@config.parentField"],""]}]],"look":["if",["=","@config.look","rail"],"nav","files"],"nodeActionIcon":"plus","nodeActionLabel":"@config.childActionLabel","onNodeAction":["if","@config.childAction","ADD_CHILD",null],"onNodeSelect":"OPEN_NODE","selectedId":["str/default",["object/get","@entity","id"],""],"type":"file-tree"}],"direction":"vertical","gap":["if",["=","@config.look","rail"],"none","md"],"type":"stack"}]]},{"from":"browsing","to":"error","event":"TreeNodeLoadFailed","eventId":"evt_SWNWVQMM5PA2V39GDPP95XPBJJ","effects":[["render-ui","main",{"align":"center","children":[{"color":"error","name":"alert-triangle","type":"icon"},{"content":"Failed to load tree","type":"typography","variant":"body"},{"color":"muted","content":"@payload.error","type":"typography","variant":"caption"},{"action":"RETRY","icon":"rotate-ccw","label":"Retry","type":"button","variant":"ghost"}],"className":"py-8","direction":"vertical","gap":"sm","type":"stack"}]]},{"from":"error","to":"loading","event":"INIT","eventId":"evt_6ZR8BBAD296H4Q2R5YAHHX72PV","effects":[["fetch","TreeNode",{"filter":["or",["=","@config.initialFilterField",""],["=",["object/get","@entity","@config.initialFilterField"],"@config.initialFilterValue"]],"emit":{"failure":"TreeNodeLoadFailed","success":"TreeNodeLoaded"}}],["render-ui","main",{"type":"stack","direction":"vertical","gap":"lg","children":[{"type":"skeleton","variant":"header"},{"type":"skeleton","variant":"list","rows":6}]}]]},{"from":"error","to":"loading","event":"RETRY","eventId":"evt_W13QH82C5Y62ZDC3EGS0THRTXJ","effects":[["fetch","TreeNode",{"filter":["or",["=","@config.initialFilterField",""],["=",["object/get","@entity","@config.initialFilterField"],"@config.initialFilterValue"]],"emit":{"failure":"TreeNodeLoadFailed","success":"TreeNodeLoaded"}}],["render-ui","main",{"type":"stack","direction":"vertical","gap":"lg","children":[{"type":"skeleton","variant":"header"},{"type":"skeleton","variant":"list","rows":6}]}]]}]},"config":{"childAction":{"type":"boolean","default":false,"label":"Row + affordance?","description":"Render a hover + on every row that emits CHILD_REQUESTED { parentId } — wire it to the host's create-draft writer so new records are born inside the node.","synonyms":"add inside, new subpage button, plus on rows","tier":"domain"},"searchPlaceholder":{"type":"string","default":"Search…","label":"Search box placeholder text","description":"Hint text inside the tree search box (e.g. 'Search nodes…').","synonyms":"search hint, placeholder, search box text, search label","tier":"presentation"},"initialFilterValue":{"type":"string","default":"","label":"What value does the first load filter for?","description":"The value initialFilterField must equal on the first load","tier":"domain"},"labelField":{"type":"string","default":"name","label":"Label column","description":"Entity field rendered as each node's label. Config-driven on purpose: the trait-level `fields {}` remap is compiled-path-only (the JS runtime never applies it), so a rebind names its columns here and both execution paths agree.","synonyms":"title field, name column, display field","tier":"domain"},"initialFilterField":{"type":"string","default":"","label":"Which field does the first load filter on?","description":"Name the field the initial load filters on, paired with initialFilterValue; blank loads every node. REFETCH_FILTER then supplies later selections.","synonyms":"initial filter, first load filter, start filtered","tier":"domain"},"title":{"type":"string","default":"Tree","label":"Section title","description":"Heading shown above the tree","tier":"presentation"},"parentField":{"type":"string","default":"parentId","label":"Parent column","description":"Entity field holding the parent reference the hierarchy nests by.","synonyms":"parent id field, hierarchy column","tier":"domain"},"filters":{"type":"[FilterSpec]","default":[],"label":"Which filters should appear above the tree?","description":"Dropdown filter facets by field, rendered as an embedded filter bar above the tree; each selection fires REFETCH_FILTER on this trait, re-fetching the flat node set. Empty (the default) = no filter bar, which is the right setting whenever the page already composes std-filter beside this tree and routes `XFilter.FILTER -> REFETCH_FILTER` — that is the wired owner and remains the primary path.","synonyms":"filter bar, faceted filters, field filters, dropdowns","tier":"presentation","items":{"type":"object","properties":{"field":{"name":"field","type":"string","required":true},"options":{"name":"options","type":"array","required":false,"items":{"type":"string"}},"label":{"name":"label","type":"string","required":false}}}},"filterBarLook":{"type":"string","default":"toolbar","label":"Filter bar look","description":"Visual treatment for the embedded filter bar, mirroring std-filter's own enum. Only applies when `filters` is non-empty.","synonyms":"filter bar style, facet style, chips, pills","tier":"presentation","values":["toolbar","chips","pills","popover-trigger","inline-column-header"]},"childActionLabel":{"type":"string","default":"Add inside","label":"Row + tooltip","description":"Accessible label on the row's + affordance (e.g. New subpage).","tier":"presentation"},"bodySearch":{"type":"boolean","default":false,"label":"Show the tree's own search box?","description":"Embeds a search box above the tree that re-fetches the flat node set server-side. Set false (the default) when the page already provides a search affordance (a toolbar Search molecule), so the surface shows one search box instead of two.","synonyms":"inline search, list search, built-in search, show search, duplicate search","tier":"presentation"},"iconField":{"type":"string","default":"icon","label":"Icon column","description":"Entity field holding each node's icon name; point it at a nonexistent field (or empty) to suppress per-node icons.","synonyms":"glyph field, icon column","tier":"presentation"},"look":{"type":"string","default":"full","label":"Tree look","description":"full = standalone section (heading, count, divider); rail = compact sidebar navigation (slim caption, nav-styled rows) for an app layout's sidebarTrait slot.","synonyms":"sidebar tree, rail look, nav tree, compact","tier":"presentation","values":["full","rail"]}},"scope":"collection"}],"pages":[{"name":"TreePage","id":"pag_K5GT95BW9WY4YEPET121H6XKQ7","path":"/tree","traits":[{"ref":"TreeBrowse","refId":"trt_R29RXTEPB0B5G9HGD5FWPSZREA"}]}],"types":{"FilterSpec":[{"name":"field","type":"string","required":true},{"name":"label","type":"string"},{"name":"options","type":"[string]"}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_5APRB5JXDBEPNPP1MM3N15E99Z":{"id":"ent_5APRB5JXDBEPNPP1MM3N15E99Z","kind":"entity","bakedName":"TreeNode","curName":"TreeNode","renames":[],"owner":"workspace"},"evt_6RDSGHTV93DMHV770ECQ7R8F7Z":{"id":"evt_6RDSGHTV93DMHV770ECQ7R8F7Z","kind":"event","bakedName":"CHILD_REQUESTED","curName":"CHILD_REQUESTED","renames":[],"owner":"workspace","parent":"trt_R29RXTEPB0B5G9HGD5FWPSZREA"},"evt_6ZR8BBAD296H4Q2R5YAHHX72PV":{"id":"evt_6ZR8BBAD296H4Q2R5YAHHX72PV","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_R29RXTEPB0B5G9HGD5FWPSZREA"},"evt_FP54V2CDJP6SB1R12KR5B83BKX":{"id":"evt_FP54V2CDJP6SB1R12KR5B83BKX","kind":"event","bakedName":"OPEN_NODE","curName":"OPEN_NODE","renames":[],"owner":"workspace","parent":"trt_R29RXTEPB0B5G9HGD5FWPSZREA"},"evt_HQ0T392G3N81TZ03GHXBBSJGBQ":{"id":"evt_HQ0T392G3N81TZ03GHXBBSJGBQ","kind":"event","bakedName":"TreeNodeLoaded","curName":"TreeNodeLoaded","renames":[],"owner":"workspace","parent":"trt_R29RXTEPB0B5G9HGD5FWPSZREA"},"evt_J4YMNYP7R83W4D9HZTJ4R2NY4K":{"id":"evt_J4YMNYP7R83W4D9HZTJ4R2NY4K","kind":"event","bakedName":"REFETCH_FILTER","curName":"REFETCH_FILTER","renames":[],"owner":"workspace","parent":"trt_R29RXTEPB0B5G9HGD5FWPSZREA"},"evt_JGFF0YKSX4WYJ3CF1ZE8PA4H8E":{"id":"evt_JGFF0YKSX4WYJ3CF1ZE8PA4H8E","kind":"event","bakedName":"SET_CURRENT","curName":"SET_CURRENT","renames":[],"owner":"workspace","parent":"trt_R29RXTEPB0B5G9HGD5FWPSZREA"},"evt_K7SJVNPTQWDBY6Y3N6RMKMV57Z":{"id":"evt_K7SJVNPTQWDBY6Y3N6RMKMV57Z","kind":"event","bakedName":"ADD_CHILD","curName":"ADD_CHILD","renames":[],"owner":"workspace","parent":"trt_R29RXTEPB0B5G9HGD5FWPSZREA"},"evt_SWNWVQMM5PA2V39GDPP95XPBJJ":{"id":"evt_SWNWVQMM5PA2V39GDPP95XPBJJ","kind":"event","bakedName":"TreeNodeLoadFailed","curName":"TreeNodeLoadFailed","renames":[],"owner":"workspace","parent":"trt_R29RXTEPB0B5G9HGD5FWPSZREA"},"evt_VDRPEJGB985MM4PNK356C2K99W":{"id":"evt_VDRPEJGB985MM4PNK356C2K99W","kind":"event","bakedName":"REFETCH_QUERY","curName":"REFETCH_QUERY","renames":[],"owner":"workspace","parent":"trt_R29RXTEPB0B5G9HGD5FWPSZREA"},"evt_W13QH82C5Y62ZDC3EGS0THRTXJ":{"id":"evt_W13QH82C5Y62ZDC3EGS0THRTXJ","kind":"event","bakedName":"RETRY","curName":"RETRY","renames":[],"owner":"workspace","parent":"trt_R29RXTEPB0B5G9HGD5FWPSZREA"},"orb_K5HC1GKD1YPGZ7SQE53Q0TJJZD":{"id":"orb_K5HC1GKD1YPGZ7SQE53Q0TJJZD","kind":"orbital","bakedName":"TreeNodeOrbital","curName":"TreeNodeOrbital","renames":[],"owner":"workspace"},"pag_K5GT95BW9WY4YEPET121H6XKQ7":{"id":"pag_K5GT95BW9WY4YEPET121H6XKQ7","kind":"page","bakedName":"TreePage","curName":"TreePage","renames":[],"owner":"workspace"},"trt_R29RXTEPB0B5G9HGD5FWPSZREA":{"id":"trt_R29RXTEPB0B5G9HGD5FWPSZREA","kind":"trait","bakedName":"TreeBrowse","curName":"TreeBrowse","renames":[],"owner":"workspace"}}}}
1
+ {"name":"std-tree","version":"1.0.0","description":"std-tree — generic hierarchical node browser. Fetches a flat TreeNode collection and renders it through file-tree's flat `items` mode (parentId-nested at render time by the component, not the .lolo); OPEN_NODE is the external handoff for a selected node's id. Rebindable: pass `fields` at the call site to retarget it at any parent-pointer entity (categories, org units, comment threads). Search/filter are wired (REFETCH_QUERY/REFETCH_FILTER re-fetch the flat node set server-side). `look: rail` renders the compact sidebar-navigation form (slim caption, nav-styled rows) for mounting in an app layout's sidebarTrait; SET_CURRENT marks the open record so the row highlights and its ancestors auto-expand; `childAction: true` renders a hover plus-affordance per row emitting CHILD_REQUESTED { parentId } for the host's create-draft writer; pagination is deliberately NOT offered — a hierarchy is not a paged list, and paging a flat node set would sever children from parents that fell on another page.","orbitals":[{"name":"TreeNodeOrbital","id":"orb_K5HC1GKD1YPGZ7SQE53Q0TJJZD","entity":{"name":"TreeNode","id":"ent_5APRB5JXDBEPNPP1MM3N15E99Z","collection":"treenodes","persistence":"persistent","fields":[{"name":"id","type":"string","required":true},{"name":"name","type":"string","required":true,"description":"The descriptive label for this node.","synonyms":"label, title, text"},{"name":"parentId","type":"string","default":"","description":"Reference to the parent node in the hierarchy; empty marks a root.","synonyms":"parent, superior, ancestor"},{"name":"icon","type":"string","default":"","description":"Icon name shown beside the node.","synonyms":"glyph, symbol, pictogram"},{"name":"createdAt","type":"string"}]},"traits":[{"name":"TreeBrowse","id":"trt_R29RXTEPB0B5G9HGD5FWPSZREA","entityRebindable":true,"entityContract":{"requires":[],"provides":[]},"effectRow":[{"kind":"emit","resource":"CHILD_REQUESTED"},{"kind":"fetch","resource":"TreeNode"},{"kind":"render-ui","resource":"main"},{"kind":"set","resource":"@entity.id"}],"category":"interaction","linkedEntity":"TreeNode","linkedEntityId":"ent_5APRB5JXDBEPNPP1MM3N15E99Z","entityRefIds":{"TreeNode":"ent_5APRB5JXDBEPNPP1MM3N15E99Z"},"emits":[{"event":"OPEN_NODE","eventId":"evt_FP54V2CDJP6SB1R12KR5B83BKX","description":"Signals a tree node has been selected for external handoff.","synonyms":"select, choose, open, activate","tier":"domain","payloadSchema":[{"name":"id","type":"string","required":true}]},{"event":"CHILD_REQUESTED","eventId":"evt_6RDSGHTV93DMHV770ECQ7R8F7Z","description":"Create a new record under this node — the host routes it into its create-draft writer with parentId stamped.","synonyms":"new subpage, add child page, create under","tier":"domain","scope":"external","payloadSchema":[{"name":"parentId","type":"string","required":true}]},{"event":"TreeNodeLoaded","eventId":"evt_HQ0T392G3N81TZ03GHXBBSJGBQ","description":"Indicates the tree node collection has been successfully retrieved.","synonyms":"loaded, fetched, retrieved, ready","tier":"internal","payloadSchema":[{"name":"data","type":"[object]","properties":[{"name":"id","type":"string","required":true},{"name":"name","type":"string","required":true},{"name":"parentId","type":"string"},{"name":"icon","type":"string"},{"name":"createdAt","type":"string"}],"entity":"TreeNode"}]},{"event":"TreeNodeLoadFailed","eventId":"evt_SWNWVQMM5PA2V39GDPP95XPBJJ","description":"Indicates a failure to load the tree node collection.","synonyms":"error, failed, problem, unsuccessful","tier":"internal","payloadSchema":[{"name":"error","type":"string"},{"name":"code","type":"string"}]}],"stateMachine":{"states":[{"name":"loading","isInitial":true},{"name":"browsing"},{"name":"error"}],"events":[{"key":"SET_CURRENT","id":"evt_JGFF0YKSX4WYJ3CF1ZE8PA4H8E","name":"Set Current","description":"Mark this record as the open one (routed from the host document's load events); its row highlights and its ancestors auto-expand.","synonyms":"highlight current, select node, you are here","tier":"domain","payloadSchema":[{"name":"id","type":"string","required":true}],"listened":true},{"key":"INIT","id":"evt_6ZR8BBAD296H4Q2R5YAHHX72PV","name":"Initialize"},{"key":"TreeNodeLoaded","id":"evt_HQ0T392G3N81TZ03GHXBBSJGBQ","name":"TreeNode loaded","description":"Indicates the tree node collection has been successfully retrieved.","synonyms":"loaded, fetched, retrieved, ready","tier":"internal","payloadSchema":[{"name":"data","type":"[object]","properties":[{"name":"id","type":"string","required":true},{"name":"name","type":"string","required":true},{"name":"parentId","type":"string"},{"name":"icon","type":"string"},{"name":"createdAt","type":"string"}],"entity":"TreeNode"}],"listened":true},{"key":"TreeNodeLoadFailed","id":"evt_SWNWVQMM5PA2V39GDPP95XPBJJ","name":"TreeNode load failed","description":"Indicates a failure to load the tree node collection.","synonyms":"error, failed, problem, unsuccessful","tier":"internal","payloadSchema":[{"name":"error","type":"string"},{"name":"code","type":"string"}],"listened":true},{"key":"REFETCH_QUERY","id":"evt_VDRPEJGB985MM4PNK356C2K99W","name":"Refetch Query","description":"Triggers a tree refresh based on the current search query.","synonyms":"refresh, reload, update, re-query","tier":"domain","payloadSchema":[{"name":"searchTerm","type":"string","required":true}],"listened":true},{"key":"REFETCH_FILTER","id":"evt_J4YMNYP7R83W4D9HZTJ4R2NY4K","name":"Refetch Filter","description":"Triggers a tree refresh based on current filter criteria.","synonyms":"refresh, filter, update, reload","tier":"domain","payloadSchema":[{"name":"entity","type":"string","required":true},{"name":"field","type":"string","required":true},{"name":"value","type":"string","required":true},{"name":"query","type":"string"}],"listened":true},{"key":"OPEN_NODE","id":"evt_FP54V2CDJP6SB1R12KR5B83BKX","name":"Open Node","description":"Signals a tree node has been selected for external handoff.","synonyms":"select, choose, open, activate","tier":"domain","payloadSchema":[{"name":"id","type":"string","required":true}],"listened":true},{"key":"ADD_CHILD","id":"evt_K7SJVNPTQWDBY6Y3N6RMKMV57Z","name":"Add Child","description":"The row's hover + affordance was clicked.","synonyms":"add inside, new child","tier":"presentation","payloadSchema":[{"name":"id","type":"string","required":true}],"listened":true},{"key":"RETRY","id":"evt_W13QH82C5Y62ZDC3EGS0THRTXJ","name":"Retry"},{"key":"CHILD_REQUESTED","id":"evt_6RDSGHTV93DMHV770ECQ7R8F7Z","name":"Child Requested","description":"Create a new record under this node — the host routes it into its create-draft writer with parentId stamped.","synonyms":"new subpage, add child page, create under","tier":"domain","payloadSchema":[{"name":"parentId","type":"string","required":true}]}],"transitions":[{"from":"loading","to":"loading","event":"SET_CURRENT","eventId":"evt_JGFF0YKSX4WYJ3CF1ZE8PA4H8E","effects":[["set","@entity.id","@payload.id"],["fetch","TreeNode",{"emit":{"failure":"TreeNodeLoadFailed","success":"TreeNodeLoaded"}}]]},{"from":"loading","to":"loading","event":"INIT","eventId":"evt_6ZR8BBAD296H4Q2R5YAHHX72PV","effects":[["fetch","TreeNode",{"filter":["or",["=","@config.initialFilterField",""],["=",["object/get","@entity","@config.initialFilterField"],"@config.initialFilterValue"]],"emit":{"failure":"TreeNodeLoadFailed","success":"TreeNodeLoaded"}}],["render-ui","main",{"type":"stack","direction":"vertical","gap":"lg","children":[{"type":"skeleton","variant":"header"},{"type":"skeleton","variant":"list","rows":6}]}]]},{"from":"loading","to":"browsing","event":"TreeNodeLoaded","eventId":"evt_HQ0T392G3N81TZ03GHXBBSJGBQ","effects":[["render-ui","main",{"children":[["if",["=","@config.look","rail"],{"className":"px-2 pb-1 uppercase tracking-wide","color":"muted","content":"@config.title","type":"typography","variant":"caption"},{"align":"center","children":[{"name":"list-tree","size":"lg","type":"icon"},{"content":"@config.title","type":"typography","variant":"h3"},{"label":["array/len","@payload.data"],"size":"sm","type":"badge","variant":"neutral"}],"direction":"horizontal","gap":"sm","type":"stack"}],["if",["=","@config.look","rail"],{"children":[],"gap":"none","type":"stack"},{"type":"divider"}],["if","@config.bodySearch",{"children":[{"className":"w-full max-w-md","clearable":true,"event":"REFETCH_QUERY","placeholder":"@config.searchPlaceholder","type":"search-input"}],"direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],["if",[">",["array/len","@config.filters"],0],{"children":[{"entity":"TreeNode","event":"REFETCH_FILTER","filters":"@config.filters","look":"@config.filterBarLook","type":"filter-group"}],"direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],{"items":["array/map","@payload.data",["fn","row",{"icon":["str/default",["object/get","@row","@config.iconField"],""],"id":"@row.id","label":["str/default",["object/get","@row","@config.labelField"],""],"parentId":["str/default",["object/get","@row","@config.parentField"],""]}]],"look":["if",["=","@config.look","rail"],"nav","files"],"nodeActionIcon":"plus","nodeActionLabel":"@config.childActionLabel","onNodeAction":["if","@config.childAction","ADD_CHILD",null],"onNodeSelect":"OPEN_NODE","selectedId":["str/default",["object/get","@entity","id"],""],"type":"file-tree"}],"direction":"vertical","gap":["if",["=","@config.look","rail"],"none","md"],"type":"stack"}]]},{"from":"loading","to":"error","event":"TreeNodeLoadFailed","eventId":"evt_SWNWVQMM5PA2V39GDPP95XPBJJ","effects":[["render-ui","main",{"align":"center","children":[{"color":"error","name":"alert-triangle","type":"icon"},{"content":"Failed to load tree","type":"typography","variant":"body"},{"color":"muted","content":"@payload.error","type":"typography","variant":"caption"},{"action":"RETRY","icon":"rotate-ccw","label":"Retry","type":"button","variant":"ghost"}],"className":"py-8","direction":"vertical","gap":"sm","type":"stack"}]]},{"from":"browsing","to":"loading","event":"INIT","eventId":"evt_6ZR8BBAD296H4Q2R5YAHHX72PV","effects":[["fetch","TreeNode",{"filter":["or",["=","@config.initialFilterField",""],["=",["object/get","@entity","@config.initialFilterField"],"@config.initialFilterValue"]],"emit":{"failure":"TreeNodeLoadFailed","success":"TreeNodeLoaded"}}],["render-ui","main",{"type":"stack","direction":"vertical","gap":"lg","children":[{"type":"skeleton","variant":"header"},{"type":"skeleton","variant":"list","rows":6}]}]]},{"from":"browsing","to":"browsing","event":"REFETCH_QUERY","eventId":"evt_VDRPEJGB985MM4PNK356C2K99W","effects":[["fetch","TreeNode",{"emit":{"failure":"TreeNodeLoadFailed","success":"TreeNodeLoaded"},"filter":["or",["=","@payload.searchTerm",""],["str/includes",["str/default",["object/get","@entity","@config.labelField"],""],"@payload.searchTerm"]]}]]},{"from":"browsing","to":"browsing","event":"REFETCH_FILTER","eventId":"evt_J4YMNYP7R83W4D9HZTJ4R2NY4K","effects":[["fetch","TreeNode",{"emit":{"failure":"TreeNodeLoadFailed","success":"TreeNodeLoaded"},"filter":["or",["=","@payload.value",""],["=",["object/get","@entity","@payload.field"],"@payload.value"]]}]]},{"from":"browsing","to":"browsing","event":"OPEN_NODE","eventId":"evt_FP54V2CDJP6SB1R12KR5B83BKX","effects":[["set","@entity.id","@payload.id"]]},{"from":"browsing","to":"browsing","event":"SET_CURRENT","eventId":"evt_JGFF0YKSX4WYJ3CF1ZE8PA4H8E","effects":[["set","@entity.id","@payload.id"],["fetch","TreeNode",{"emit":{"failure":"TreeNodeLoadFailed","success":"TreeNodeLoaded"}}]]},{"from":"browsing","to":"browsing","event":"ADD_CHILD","eventId":"evt_K7SJVNPTQWDBY6Y3N6RMKMV57Z","effects":[["emit","CHILD_REQUESTED",{"parentId":"@payload.id"}]]},{"from":"browsing","to":"browsing","event":"TreeNodeLoaded","eventId":"evt_HQ0T392G3N81TZ03GHXBBSJGBQ","effects":[["render-ui","main",{"children":[["if",["=","@config.look","rail"],{"className":"px-2 pb-1 uppercase tracking-wide","color":"muted","content":"@config.title","type":"typography","variant":"caption"},{"align":"center","children":[{"name":"list-tree","size":"lg","type":"icon"},{"content":"@config.title","type":"typography","variant":"h3"},{"label":["array/len","@payload.data"],"size":"sm","type":"badge","variant":"neutral"}],"direction":"horizontal","gap":"sm","type":"stack"}],["if",["=","@config.look","rail"],{"children":[],"gap":"none","type":"stack"},{"type":"divider"}],["if","@config.bodySearch",{"children":[{"className":"w-full max-w-md","clearable":true,"event":"REFETCH_QUERY","placeholder":"@config.searchPlaceholder","type":"search-input"}],"direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],["if",[">",["array/len","@config.filters"],0],{"children":[{"entity":"TreeNode","event":"REFETCH_FILTER","filters":"@config.filters","look":"@config.filterBarLook","type":"filter-group"}],"direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],{"items":["array/map","@payload.data",["fn","row",{"icon":["str/default",["object/get","@row","@config.iconField"],""],"id":"@row.id","label":["str/default",["object/get","@row","@config.labelField"],""],"parentId":["str/default",["object/get","@row","@config.parentField"],""]}]],"look":["if",["=","@config.look","rail"],"nav","files"],"nodeActionIcon":"plus","nodeActionLabel":"@config.childActionLabel","onNodeAction":["if","@config.childAction","ADD_CHILD",null],"onNodeSelect":"OPEN_NODE","selectedId":["str/default",["object/get","@entity","id"],""],"type":"file-tree"}],"direction":"vertical","gap":["if",["=","@config.look","rail"],"none","md"],"type":"stack"}]]},{"from":"browsing","to":"error","event":"TreeNodeLoadFailed","eventId":"evt_SWNWVQMM5PA2V39GDPP95XPBJJ","effects":[["render-ui","main",{"align":"center","children":[{"color":"error","name":"alert-triangle","type":"icon"},{"content":"Failed to load tree","type":"typography","variant":"body"},{"color":"muted","content":"@payload.error","type":"typography","variant":"caption"},{"action":"RETRY","icon":"rotate-ccw","label":"Retry","type":"button","variant":"ghost"}],"className":"py-8","direction":"vertical","gap":"sm","type":"stack"}]]},{"from":"error","to":"loading","event":"INIT","eventId":"evt_6ZR8BBAD296H4Q2R5YAHHX72PV","effects":[["fetch","TreeNode",{"filter":["or",["=","@config.initialFilterField",""],["=",["object/get","@entity","@config.initialFilterField"],"@config.initialFilterValue"]],"emit":{"failure":"TreeNodeLoadFailed","success":"TreeNodeLoaded"}}],["render-ui","main",{"type":"stack","direction":"vertical","gap":"lg","children":[{"type":"skeleton","variant":"header"},{"type":"skeleton","variant":"list","rows":6}]}]]},{"from":"error","to":"loading","event":"RETRY","eventId":"evt_W13QH82C5Y62ZDC3EGS0THRTXJ","effects":[["fetch","TreeNode",{"filter":["or",["=","@config.initialFilterField",""],["=",["object/get","@entity","@config.initialFilterField"],"@config.initialFilterValue"]],"emit":{"failure":"TreeNodeLoadFailed","success":"TreeNodeLoaded"}}],["render-ui","main",{"type":"stack","direction":"vertical","gap":"lg","children":[{"type":"skeleton","variant":"header"},{"type":"skeleton","variant":"list","rows":6}]}]]}]},"config":{"parentField":{"type":"string","default":"parentId","label":"Parent column","description":"Entity field holding the parent reference the hierarchy nests by.","synonyms":"parent id field, hierarchy column","tier":"domain"},"initialFilterField":{"type":"string","default":"","label":"Which field does the first load filter on?","description":"Name the field the initial load filters on, paired with initialFilterValue; blank loads every node. REFETCH_FILTER then supplies later selections.","synonyms":"initial filter, first load filter, start filtered","tier":"domain"},"labelField":{"type":"string","default":"name","label":"Label column","description":"Entity field rendered as each node's label. Config-driven on purpose: the trait-level `fields {}` remap is compiled-path-only (the JS runtime never applies it), so a rebind names its columns here and both execution paths agree.","synonyms":"title field, name column, display field","tier":"domain"},"initialFilterValue":{"type":"string","default":"","label":"What value does the first load filter for?","description":"The value initialFilterField must equal on the first load","tier":"domain"},"childAction":{"type":"boolean","default":false,"label":"Row + affordance?","description":"Render a hover + on every row that emits CHILD_REQUESTED { parentId } — wire it to the host's create-draft writer so new records are born inside the node.","synonyms":"add inside, new subpage button, plus on rows","tier":"domain"},"bodySearch":{"type":"boolean","default":false,"label":"Show the tree's own search box?","description":"Embeds a search box above the tree that re-fetches the flat node set server-side. Set false (the default) when the page already provides a search affordance (a toolbar Search molecule), so the surface shows one search box instead of two.","synonyms":"inline search, list search, built-in search, show search, duplicate search","tier":"presentation"},"look":{"type":"string","default":"full","label":"Tree look","description":"full = standalone section (heading, count, divider); rail = compact sidebar navigation (slim caption, nav-styled rows) for an app layout's sidebarTrait slot.","synonyms":"sidebar tree, rail look, nav tree, compact","tier":"presentation","values":["full","rail"]},"filterBarLook":{"type":"string","default":"toolbar","label":"Filter bar look","description":"Visual treatment for the embedded filter bar, mirroring std-filter's own enum. Only applies when `filters` is non-empty.","synonyms":"filter bar style, facet style, chips, pills","tier":"presentation","values":["toolbar","chips","pills","popover-trigger","inline-column-header"]},"iconField":{"type":"string","default":"icon","label":"Icon column","description":"Entity field holding each node's icon name; point it at a nonexistent field (or empty) to suppress per-node icons.","synonyms":"glyph field, icon column","tier":"presentation"},"title":{"type":"string","default":"Tree","label":"Section title","description":"Heading shown above the tree","tier":"presentation"},"childActionLabel":{"type":"string","default":"Add inside","label":"Row + tooltip","description":"Accessible label on the row's + affordance (e.g. New subpage).","tier":"presentation"},"filters":{"type":"[FilterSpec]","default":[],"label":"Which filters should appear above the tree?","description":"Dropdown filter facets by field, rendered as an embedded filter bar above the tree; each selection fires REFETCH_FILTER on this trait, re-fetching the flat node set. Empty (the default) = no filter bar, which is the right setting whenever the page already composes std-filter beside this tree and routes `XFilter.FILTER -> REFETCH_FILTER` — that is the wired owner and remains the primary path.","synonyms":"filter bar, faceted filters, field filters, dropdowns","tier":"presentation","items":{"type":"object","properties":{"field":{"name":"field","type":"string","required":true},"label":{"name":"label","type":"string","required":false},"options":{"name":"options","type":"array","required":false,"items":{"type":"string"}}}}},"searchPlaceholder":{"type":"string","default":"Search…","label":"Search box placeholder text","description":"Hint text inside the tree search box (e.g. 'Search nodes…').","synonyms":"search hint, placeholder, search box text, search label","tier":"presentation"}},"scope":"collection"}],"pages":[{"name":"TreePage","id":"pag_K5GT95BW9WY4YEPET121H6XKQ7","path":"/tree","traits":[{"ref":"TreeBrowse","refId":"trt_R29RXTEPB0B5G9HGD5FWPSZREA"}]}],"types":{"FilterSpec":[{"name":"field","type":"string","required":true},{"name":"label","type":"string"},{"name":"options","type":"[string]"}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_5APRB5JXDBEPNPP1MM3N15E99Z":{"id":"ent_5APRB5JXDBEPNPP1MM3N15E99Z","kind":"entity","bakedName":"TreeNode","curName":"TreeNode","renames":[],"owner":"workspace"},"evt_6RDSGHTV93DMHV770ECQ7R8F7Z":{"id":"evt_6RDSGHTV93DMHV770ECQ7R8F7Z","kind":"event","bakedName":"CHILD_REQUESTED","curName":"CHILD_REQUESTED","renames":[],"owner":"workspace","parent":"trt_R29RXTEPB0B5G9HGD5FWPSZREA"},"evt_6ZR8BBAD296H4Q2R5YAHHX72PV":{"id":"evt_6ZR8BBAD296H4Q2R5YAHHX72PV","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_R29RXTEPB0B5G9HGD5FWPSZREA"},"evt_FP54V2CDJP6SB1R12KR5B83BKX":{"id":"evt_FP54V2CDJP6SB1R12KR5B83BKX","kind":"event","bakedName":"OPEN_NODE","curName":"OPEN_NODE","renames":[],"owner":"workspace","parent":"trt_R29RXTEPB0B5G9HGD5FWPSZREA"},"evt_HQ0T392G3N81TZ03GHXBBSJGBQ":{"id":"evt_HQ0T392G3N81TZ03GHXBBSJGBQ","kind":"event","bakedName":"TreeNodeLoaded","curName":"TreeNodeLoaded","renames":[],"owner":"workspace","parent":"trt_R29RXTEPB0B5G9HGD5FWPSZREA"},"evt_J4YMNYP7R83W4D9HZTJ4R2NY4K":{"id":"evt_J4YMNYP7R83W4D9HZTJ4R2NY4K","kind":"event","bakedName":"REFETCH_FILTER","curName":"REFETCH_FILTER","renames":[],"owner":"workspace","parent":"trt_R29RXTEPB0B5G9HGD5FWPSZREA"},"evt_JGFF0YKSX4WYJ3CF1ZE8PA4H8E":{"id":"evt_JGFF0YKSX4WYJ3CF1ZE8PA4H8E","kind":"event","bakedName":"SET_CURRENT","curName":"SET_CURRENT","renames":[],"owner":"workspace","parent":"trt_R29RXTEPB0B5G9HGD5FWPSZREA"},"evt_K7SJVNPTQWDBY6Y3N6RMKMV57Z":{"id":"evt_K7SJVNPTQWDBY6Y3N6RMKMV57Z","kind":"event","bakedName":"ADD_CHILD","curName":"ADD_CHILD","renames":[],"owner":"workspace","parent":"trt_R29RXTEPB0B5G9HGD5FWPSZREA"},"evt_SWNWVQMM5PA2V39GDPP95XPBJJ":{"id":"evt_SWNWVQMM5PA2V39GDPP95XPBJJ","kind":"event","bakedName":"TreeNodeLoadFailed","curName":"TreeNodeLoadFailed","renames":[],"owner":"workspace","parent":"trt_R29RXTEPB0B5G9HGD5FWPSZREA"},"evt_VDRPEJGB985MM4PNK356C2K99W":{"id":"evt_VDRPEJGB985MM4PNK356C2K99W","kind":"event","bakedName":"REFETCH_QUERY","curName":"REFETCH_QUERY","renames":[],"owner":"workspace","parent":"trt_R29RXTEPB0B5G9HGD5FWPSZREA"},"evt_W13QH82C5Y62ZDC3EGS0THRTXJ":{"id":"evt_W13QH82C5Y62ZDC3EGS0THRTXJ","kind":"event","bakedName":"RETRY","curName":"RETRY","renames":[],"owner":"workspace","parent":"trt_R29RXTEPB0B5G9HGD5FWPSZREA"},"orb_K5HC1GKD1YPGZ7SQE53Q0TJJZD":{"id":"orb_K5HC1GKD1YPGZ7SQE53Q0TJJZD","kind":"orbital","bakedName":"TreeNodeOrbital","curName":"TreeNodeOrbital","renames":[],"owner":"workspace"},"pag_K5GT95BW9WY4YEPET121H6XKQ7":{"id":"pag_K5GT95BW9WY4YEPET121H6XKQ7","kind":"page","bakedName":"TreePage","curName":"TreePage","renames":[],"owner":"workspace"},"trt_R29RXTEPB0B5G9HGD5FWPSZREA":{"id":"trt_R29RXTEPB0B5G9HGD5FWPSZREA","kind":"trait","bakedName":"TreeBrowse","curName":"TreeBrowse","renames":[],"owner":"workspace"}}}}