@almadar/std 16.210.0 → 16.212.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 (203) hide show
  1. package/behaviors/lolo/infra/atoms/std-approval-gate.lolo +5 -2
  2. package/behaviors/lolo/infra/atoms/std-cache-aside.lolo +6 -0
  3. package/behaviors/lolo/infra/atoms/std-calendar-sync.lolo +8 -5
  4. package/behaviors/lolo/infra/atoms/std-cascade-on-delete.lolo +8 -1
  5. package/behaviors/lolo/infra/atoms/std-circuit-breaker.lolo +5 -3
  6. package/behaviors/lolo/infra/atoms/std-cross-reference.lolo +2 -0
  7. package/behaviors/lolo/infra/atoms/std-data-erasure.lolo +3 -0
  8. package/behaviors/lolo/infra/atoms/std-lifecycle.lolo +2 -0
  9. package/behaviors/lolo/infra/atoms/std-migration-job.lolo +12 -0
  10. package/behaviors/lolo/infra/atoms/std-mod-queue.lolo +1 -0
  11. package/behaviors/lolo/infra/atoms/std-notification-center.lolo +2 -0
  12. package/behaviors/lolo/infra/atoms/std-notify-on-event.lolo +5 -0
  13. package/behaviors/lolo/infra/atoms/std-reminder-scheduler.lolo +2 -0
  14. package/behaviors/lolo/infra/atoms/std-status-lifecycle.lolo +1 -0
  15. package/behaviors/lolo/ml/atoms/std-ml-classify.lolo +1 -0
  16. package/behaviors/lolo/ml/atoms/std-ml-infer.lolo +1 -0
  17. package/behaviors/lolo/ui/core/atoms/std-app-layout.lolo +1 -0
  18. package/behaviors/lolo/ui/core/atoms/std-board.lolo +6 -0
  19. package/behaviors/lolo/ui/core/atoms/std-browse.lolo +10 -1
  20. package/behaviors/lolo/ui/core/atoms/std-calendar.lolo +6 -1
  21. package/behaviors/lolo/ui/core/atoms/std-confirmation.lolo +2 -0
  22. package/behaviors/lolo/ui/core/atoms/std-esign-request.lolo +2 -2
  23. package/behaviors/lolo/ui/core/atoms/std-event-log.lolo +2 -0
  24. package/behaviors/lolo/ui/core/atoms/std-gallery.lolo +8 -1
  25. package/behaviors/lolo/ui/core/atoms/std-graphs.lolo +1 -1
  26. package/behaviors/lolo/ui/core/atoms/std-list.lolo +8 -1
  27. package/behaviors/lolo/ui/core/atoms/std-modal.lolo +3 -1
  28. package/behaviors/lolo/ui/core/atoms/std-selection.lolo +8 -1
  29. package/behaviors/lolo/ui/core/atoms/std-stats.lolo +1 -1
  30. package/behaviors/lolo/ui/core/atoms/std-step-flow.lolo +4 -3
  31. package/behaviors/lolo/ui/core/atoms/std-tag-strip.lolo +1 -0
  32. package/behaviors/lolo/ui/core/atoms/std-tag-taxonomy.lolo +17 -4
  33. package/behaviors/lolo/ui/core/atoms/std-thread.lolo +33 -30
  34. package/behaviors/lolo/ui/core/atoms/std-version-history.lolo +1 -1
  35. package/behaviors/lolo/ui/core/atoms/std-wizard.lolo +36 -0
  36. package/behaviors/lolo/ui/core/atoms/ui-badge.lolo +1 -1
  37. package/behaviors/lolo/ui/core/atoms/ui-button.lolo +1 -1
  38. package/behaviors/lolo/ui/core/atoms/ui-checkbox.lolo +22 -2
  39. package/behaviors/lolo/ui/core/atoms/ui-game-icon.lolo +1 -1
  40. package/behaviors/lolo/ui/core/atoms/ui-radio.lolo +1 -1
  41. package/behaviors/lolo/ui/core/atoms/ui-range-slider.lolo +1 -1
  42. package/behaviors/lolo/ui/core/atoms/ui-select.lolo +6 -2
  43. package/behaviors/lolo/ui/core/atoms/ui-switch.lolo +1 -1
  44. package/behaviors/lolo/ui/core/atoms/ui-text-highlight.lolo +1 -1
  45. package/behaviors/lolo/ui/core/atoms/ui-textarea.lolo +3 -1
  46. package/behaviors/lolo/ui/core/atoms/ui-time-slot-cell.lolo +1 -1
  47. package/behaviors/lolo/ui/core/molecules/ui-code-block.lolo +2 -2
  48. package/behaviors/lolo/ui/core/molecules/ui-command-palette.lolo +2 -2
  49. package/behaviors/lolo/ui/core/molecules/ui-date-range-picker.lolo +2 -2
  50. package/behaviors/lolo/ui/core/molecules/ui-document-panel.lolo +2 -2
  51. package/behaviors/lolo/ui/core/molecules/ui-filter-group.lolo +1 -1
  52. package/behaviors/lolo/ui/core/molecules/ui-floating-toolbar.lolo +1 -1
  53. package/behaviors/lolo/ui/core/molecules/ui-import-preview-tree.lolo +1 -1
  54. package/behaviors/lolo/ui/core/molecules/ui-menu.lolo +1 -1
  55. package/behaviors/lolo/ui/core/molecules/ui-number-stepper.lolo +1 -1
  56. package/behaviors/lolo/ui/core/molecules/ui-pagination.lolo +1 -1
  57. package/behaviors/lolo/ui/core/molecules/ui-popover.lolo +1 -1
  58. package/behaviors/lolo/ui/core/molecules/ui-relation-select.lolo +1 -1
  59. package/behaviors/lolo/ui/core/molecules/ui-rich-text-editor.lolo +1 -1
  60. package/behaviors/lolo/ui/core/molecules/ui-search-input.lolo +1 -1
  61. package/behaviors/lolo/ui/core/molecules/ui-sidebar.lolo +1 -1
  62. package/behaviors/lolo/ui/core/molecules/ui-star-rating.lolo +1 -1
  63. package/behaviors/lolo/ui/core/molecules/ui-tabs.lolo +2 -2
  64. package/behaviors/lolo/ui/core/molecules/ui-wizard-navigation.lolo +2 -2
  65. package/behaviors/lolo/ui/core/organisms/ui-split-pane.lolo +1 -1
  66. package/behaviors/lolo/ui/game/atoms/std-tutorial-overlay.lolo +6 -0
  67. package/behaviors/lolo/ui/game/atoms/ui-action-palette.lolo +1 -1
  68. package/behaviors/lolo/ui/game/atoms/ui-action-tile.lolo +1 -1
  69. package/behaviors/lolo/ui/game/atoms/ui-choice-button.lolo +1 -1
  70. package/behaviors/lolo/ui/game/atoms/ui-control-button.lolo +1 -1
  71. package/behaviors/lolo/ui/game/atoms/ui-control-grid.lolo +2 -2
  72. package/behaviors/lolo/ui/game/atoms/ui-dialogue-bubble.lolo +1 -1
  73. package/behaviors/lolo/ui/game/atoms/ui-draw-fx-layer.lolo +1 -1
  74. package/behaviors/lolo/ui/game/atoms/ui-draw-skinned-mesh.lolo +131 -0
  75. package/behaviors/lolo/ui/game/atoms/ui-draw-sprite-layer.lolo +1 -1
  76. package/behaviors/lolo/ui/game/atoms/ui-draw-sprite.lolo +1 -1
  77. package/behaviors/lolo/ui/game/atoms/ui-game-audio-toggle.lolo +2 -2
  78. package/behaviors/lolo/ui/game/atoms/ui-game-hud.lolo +5 -5
  79. package/behaviors/lolo/ui/game/atoms/ui-game-menu.lolo +1 -1
  80. package/behaviors/lolo/ui/game/atoms/ui-health-bar.lolo +2 -2
  81. package/behaviors/lolo/ui/game/atoms/ui-score-display.lolo +1 -1
  82. package/behaviors/lolo/ui/game/atoms/ui-sequence-bar.lolo +2 -2
  83. package/behaviors/lolo/ui/game/atoms/ui-stat-badge.lolo +2 -2
  84. package/behaviors/lolo/ui/game/atoms/ui-trait-slot.lolo +5 -5
  85. package/behaviors/lolo/ui/game/organisms/std-arcade-board-3d.lolo +10 -10
  86. package/behaviors/lolo/ui/game/organisms/std-crew-board-2d.lolo +10 -10
  87. package/behaviors/lolo/ui/game/organisms/std-dungeon-board-2d.lolo +36 -36
  88. package/behaviors/lolo/ui/game/organisms/std-market-board-3d.lolo +36 -36
  89. package/behaviors/lolo/ui/game/organisms/std-objective-board-3d.lolo +34 -34
  90. package/behaviors/lolo/ui/game/organisms/std-survival-board-3d.lolo +10 -10
  91. package/behaviors/lolo/ui/game/organisms/std-tactics-board-2d.lolo +12 -12
  92. package/behaviors/lolo/ui/game/organisms/std-tactics-board-3d.lolo +12 -12
  93. package/behaviors/lolo/ui/game/organisms/std-worldmap-board-2d.lolo +20 -20
  94. package/behaviors/registry/infra/atoms/std-approval-gate.orb +76 -27
  95. package/behaviors/registry/infra/atoms/std-cache-aside.orb +76 -32
  96. package/behaviors/registry/infra/atoms/std-calendar-sync.orb +51 -0
  97. package/behaviors/registry/infra/atoms/std-cascade-on-delete.orb +48 -0
  98. package/behaviors/registry/infra/atoms/std-circuit-breaker.orb +43 -14
  99. package/behaviors/registry/infra/atoms/std-cross-reference.orb +41 -15
  100. package/behaviors/registry/infra/atoms/std-data-erasure.orb +52 -0
  101. package/behaviors/registry/infra/atoms/std-lifecycle.orb +36 -0
  102. package/behaviors/registry/infra/atoms/std-migration-job.orb +108 -0
  103. package/behaviors/registry/infra/atoms/std-mod-queue.orb +20 -0
  104. package/behaviors/registry/infra/atoms/std-notification-center.orb +88 -24
  105. package/behaviors/registry/infra/atoms/std-notify-on-event.orb +82 -6
  106. package/behaviors/registry/infra/atoms/std-reminder-scheduler.orb +36 -0
  107. package/behaviors/registry/infra/atoms/std-status-lifecycle.orb +20 -0
  108. package/behaviors/registry/ml/atoms/std-ml-classify.orb +18 -0
  109. package/behaviors/registry/ml/atoms/std-ml-infer.orb +18 -0
  110. package/behaviors/registry/ui/core/atoms/std-app-layout.orb +20 -0
  111. package/behaviors/registry/ui/core/atoms/std-board.orb +58 -0
  112. package/behaviors/registry/ui/core/atoms/std-browse.orb +35 -1
  113. package/behaviors/registry/ui/core/atoms/std-calendar.orb +9 -1
  114. package/behaviors/registry/ui/core/atoms/std-confirmation.orb +44 -18
  115. package/behaviors/registry/ui/core/atoms/std-esign-flow.orb +44 -18
  116. package/behaviors/registry/ui/core/atoms/std-esign-request.orb +19 -8
  117. package/behaviors/registry/ui/core/atoms/std-event-log.orb +26 -0
  118. package/behaviors/registry/ui/core/atoms/std-form-advanced.orb +20 -9
  119. package/behaviors/registry/ui/core/atoms/std-gallery.orb +35 -1
  120. package/behaviors/registry/ui/core/atoms/std-graphs.orb +1 -0
  121. package/behaviors/registry/ui/core/atoms/std-list.orb +35 -1
  122. package/behaviors/registry/ui/core/atoms/std-modal.orb +52 -24
  123. package/behaviors/registry/ui/core/atoms/std-selection.orb +35 -1
  124. package/behaviors/registry/ui/core/atoms/std-stats.orb +1 -0
  125. package/behaviors/registry/ui/core/atoms/std-step-flow.orb +0 -3
  126. package/behaviors/registry/ui/core/atoms/std-tag-strip.orb +20 -0
  127. package/behaviors/registry/ui/core/atoms/std-tag-taxonomy.orb +58 -9
  128. package/behaviors/registry/ui/core/atoms/std-thread.orb +134 -40
  129. package/behaviors/registry/ui/core/atoms/std-version-history.orb +1 -0
  130. package/behaviors/registry/ui/core/atoms/std-wizard.orb +77 -0
  131. package/behaviors/registry/ui/core/atoms/ui-badge.orb +4 -1
  132. package/behaviors/registry/ui/core/atoms/ui-button.orb +4 -1
  133. package/behaviors/registry/ui/core/atoms/ui-checkbox.orb +78 -2
  134. package/behaviors/registry/ui/core/atoms/ui-game-icon.orb +4 -1
  135. package/behaviors/registry/ui/core/atoms/ui-radio.orb +1 -0
  136. package/behaviors/registry/ui/core/atoms/ui-range-slider.orb +1 -0
  137. package/behaviors/registry/ui/core/atoms/ui-select.orb +28 -0
  138. package/behaviors/registry/ui/core/atoms/ui-switch.orb +1 -0
  139. package/behaviors/registry/ui/core/atoms/ui-text-highlight.orb +1 -0
  140. package/behaviors/registry/ui/core/atoms/ui-textarea.orb +14 -0
  141. package/behaviors/registry/ui/core/atoms/ui-time-slot-cell.orb +1 -0
  142. package/behaviors/registry/ui/core/molecules/ui-code-block.orb +2 -0
  143. package/behaviors/registry/ui/core/molecules/ui-command-palette.orb +2 -28
  144. package/behaviors/registry/ui/core/molecules/ui-date-range-picker.orb +2 -0
  145. package/behaviors/registry/ui/core/molecules/ui-document-panel.orb +2 -0
  146. package/behaviors/registry/ui/core/molecules/ui-filter-group.orb +1 -0
  147. package/behaviors/registry/ui/core/molecules/ui-floating-toolbar.orb +1 -20
  148. package/behaviors/registry/ui/core/molecules/ui-import-preview-tree.orb +1 -14
  149. package/behaviors/registry/ui/core/molecules/ui-menu.orb +1 -24
  150. package/behaviors/registry/ui/core/molecules/ui-number-stepper.orb +1 -0
  151. package/behaviors/registry/ui/core/molecules/ui-pagination.orb +1 -0
  152. package/behaviors/registry/ui/core/molecules/ui-popover.orb +1 -0
  153. package/behaviors/registry/ui/core/molecules/ui-relation-select.orb +1 -0
  154. package/behaviors/registry/ui/core/molecules/ui-rich-text-editor.orb +1 -0
  155. package/behaviors/registry/ui/core/molecules/ui-search-input.orb +1 -0
  156. package/behaviors/registry/ui/core/molecules/ui-sidebar.orb +1 -0
  157. package/behaviors/registry/ui/core/molecules/ui-star-rating.orb +1 -0
  158. package/behaviors/registry/ui/core/molecules/ui-tabs.orb +8 -2
  159. package/behaviors/registry/ui/core/molecules/ui-wizard-navigation.orb +2 -0
  160. package/behaviors/registry/ui/core/organisms/ui-split-pane.orb +1 -0
  161. package/behaviors/registry/ui/game/atoms/std-tutorial-overlay.orb +44 -0
  162. package/behaviors/registry/ui/game/atoms/ui-action-palette.orb +4 -1
  163. package/behaviors/registry/ui/game/atoms/ui-action-tile.orb +4 -1
  164. package/behaviors/registry/ui/game/atoms/ui-choice-button.orb +4 -1
  165. package/behaviors/registry/ui/game/atoms/ui-control-button.orb +4 -1
  166. package/behaviors/registry/ui/game/atoms/ui-control-grid.orb +8 -2
  167. package/behaviors/registry/ui/game/atoms/ui-dialogue-bubble.orb +4 -1
  168. package/behaviors/registry/ui/game/atoms/ui-draw-fx-layer.orb +4 -1
  169. package/behaviors/registry/ui/game/atoms/ui-draw-skinned-mesh.orb +697 -0
  170. package/behaviors/registry/ui/game/atoms/ui-draw-sprite-layer.orb +4 -1
  171. package/behaviors/registry/ui/game/atoms/ui-draw-sprite.orb +4 -1
  172. package/behaviors/registry/ui/game/atoms/ui-game-audio-toggle.orb +8 -2
  173. package/behaviors/registry/ui/game/atoms/ui-game-hud.orb +20 -5
  174. package/behaviors/registry/ui/game/atoms/ui-game-menu.orb +4 -1
  175. package/behaviors/registry/ui/game/atoms/ui-health-bar.orb +8 -2
  176. package/behaviors/registry/ui/game/atoms/ui-score-display.orb +4 -1
  177. package/behaviors/registry/ui/game/atoms/ui-sequence-bar.orb +4 -1
  178. package/behaviors/registry/ui/game/atoms/ui-stat-badge.orb +8 -2
  179. package/behaviors/registry/ui/game/atoms/ui-trait-slot.orb +9 -2
  180. package/behaviors/registry/ui/game/organisms/std-arcade-board-3d.orb +10 -30
  181. package/behaviors/registry/ui/game/organisms/std-crew-board-2d.orb +10 -30
  182. package/behaviors/registry/ui/game/organisms/std-dungeon-board-2d.orb +36 -108
  183. package/behaviors/registry/ui/game/organisms/std-market-board-3d.orb +36 -108
  184. package/behaviors/registry/ui/game/organisms/std-objective-board-3d.orb +34 -102
  185. package/behaviors/registry/ui/game/organisms/std-survival-board-3d.orb +10 -30
  186. package/behaviors/registry/ui/game/organisms/std-tactics-board-2d.orb +12 -36
  187. package/behaviors/registry/ui/game/organisms/std-tactics-board-3d.orb +12 -36
  188. package/behaviors/registry/ui/game/organisms/std-worldmap-board-2d.orb +20 -60
  189. package/dist/behaviors/exports-reader.js +3136 -2291
  190. package/dist/behaviors/functions/index.d.ts +148 -40
  191. package/dist/behaviors/functions/index.js +3134 -2290
  192. package/dist/behaviors/index.d.ts +1 -1
  193. package/dist/behaviors/index.js +3137 -2292
  194. package/dist/behaviors/query.js +3136 -2291
  195. package/dist/behaviors-embeddings.hash.json +3 -3
  196. package/dist/behaviors-embeddings.json +25 -21
  197. package/dist/behaviors-registry.json +2296 -1209
  198. package/dist/index.d.ts +1 -1
  199. package/dist/index.js +3137 -2292
  200. package/dist/knob-embeddings.hash.json +3 -3
  201. package/dist/knob-embeddings.json +1 -1
  202. package/dist/registry/factory-signatures.json +1 -1
  203. package/package.json +2 -2
@@ -127,6 +127,7 @@ orbital ApprovalGateOrbital {
127
127
  })
128
128
  ApprovalRequestLoaded -> idle
129
129
  ApprovalRequestLoadFailed -> idle
130
+ (notify error (str/concat "Couldn't load the approval request — " ?error))
130
131
  ;; A replay failure can also arrive while the queue is closed.
131
132
  APPROVAL_REPLAY_FAILED -> idle
132
133
  (set @entity.id ?requestId)
@@ -136,7 +137,9 @@ orbital ApprovalGateOrbital {
136
137
  (persist update ApprovalRequest @entity {
137
138
  emit: { failure: ApprovalRequestReviewFailed, success: ApprovalRequestReviewed }
138
139
  })
139
- (notify "Approval could not be applied — the request was reopened." error)
140
+ (notify error "Approval could not be applied — the request was reopened.")
141
+ ApprovalRequestReviewFailed -> idle
142
+ (notify error (str/concat "Couldn't reopen the approval request — " ?error))
140
143
  OPEN -> loading when @config.enabled
141
144
  (fetch ApprovalRequest {
142
145
  filter: ["=", (object/get @entity status), "pending"]
@@ -282,7 +285,7 @@ orbital ApprovalGateOrbital {
282
285
  (persist update ApprovalRequest @entity {
283
286
  emit: { failure: ApprovalRequestReviewFailed, success: ApprovalRequestReviewed }
284
287
  })
285
- (notify "Approval could not be applied — the request was reopened." error)
288
+ (notify error "Approval could not be applied — the request was reopened.")
286
289
  CLOSE -> idle
287
290
  (render-ui @config.reviewSlot null)
288
291
  }
@@ -158,6 +158,12 @@ orbital CacheEntryOrbital {
158
158
  gap: md
159
159
  type: stack
160
160
  })
161
+ CacheEntryUpdateFailed -> loading
162
+ (notify error (str/concat "Couldn't update the cache entry — " ?error))
163
+ CacheEntryUpdated -> loading
164
+ (fetch CacheEntry {
165
+ emit: { failure: CacheEntryLoadFailed, success: CacheEntryLoaded }
166
+ })
161
167
  }
162
168
 
163
169
  state cached {
@@ -7,11 +7,11 @@ orbital CalendarSyncOrbital {
7
7
 
8
8
  entity CalendarSyncRun [persistent: calendarSyncState] {
9
9
  id : string!
10
- syncToken : string @description "Scratch: Google incremental-sync token from the last listEvents; in-memory per instance — a restart falls back to a full list." @synonyms "sync cursor, next token" = ""
11
- lastSyncedAt : number @description "When the last full push+pull cycle completed; 0 = never." @synonyms "last sync time" = 0
12
- headId : string @description "Scratch: id of the target row the push loop is currently exporting." @synonyms "cursor, current row" = ""
13
- pending : [RemoteEvent] @description "Scratch: remote events remaining in the current pull-upsert loop." @synonyms "pull queue, remaining events" = []
14
- lastError : string @description "Last sync failure detail; blank = none." @synonyms "sync error, failure" = ""
10
+ syncToken : string @intrinsic @description "Scratch: Google incremental-sync token from the last listEvents; in-memory per instance — a restart falls back to a full list." @synonyms "sync cursor, next token" = ""
11
+ lastSyncedAt : number @intrinsic @description "When the last full push+pull cycle completed; 0 = never." @synonyms "last sync time" = 0
12
+ headId : string @intrinsic @description "Scratch: id of the target row the push loop is currently exporting." @synonyms "cursor, current row" = ""
13
+ pending : [RemoteEvent] @intrinsic @description "Scratch: remote events remaining in the current pull-upsert loop." @synonyms "pull queue, remaining events" = []
14
+ lastError : string @intrinsic @description "Last sync failure detail; blank = none." @synonyms "sync error, failure" = ""
15
15
  }
16
16
 
17
17
  entity CalendarEvent [persistent: calendarEvents] {
@@ -69,6 +69,7 @@ orbital CalendarSyncOrbital {
69
69
  (emit CAL_SYNCED { syncedAt: @entity.lastSyncedAt })
70
70
  CAL_SYNC_FAILED -> idle
71
71
  (set @entity.lastError ?error)
72
+ (notify error (str/concat "Couldn't sync the calendar — " ?error))
72
73
  }
73
74
 
74
75
  state pushing {
@@ -99,6 +100,7 @@ orbital CalendarSyncOrbital {
99
100
  } { emit: { failure: CAL_SYNC_FAILED, success: CAL_REMOTE_LISTED } })
100
101
  CAL_SYNC_FAILED -> idle
101
102
  (set @entity.lastError ?error)
103
+ (notify error (str/concat "Couldn't sync the calendar — " ?error))
102
104
  }
103
105
 
104
106
  state pulling {
@@ -137,6 +139,7 @@ orbital CalendarSyncOrbital {
137
139
  (emit CAL_SYNCED { syncedAt: @entity.lastSyncedAt })
138
140
  CAL_SYNC_FAILED -> idle
139
141
  (set @entity.lastError ?error)
142
+ (notify error (str/concat "Couldn't sync the calendar — " ?error))
140
143
  }
141
144
 
142
145
  emits {
@@ -18,7 +18,7 @@ orbital CascadeOnDeleteOrbital {
18
18
  parentId : string @description "Identifier of the deleted parent the cascade is clearing dependents for." @synonyms "parent, source, origin" = ""
19
19
  parentEntity : string @description "Identifies the parent entity of the cascade." @synonyms "related entity, source entity, parent" = ""
20
20
  rowCount : number @description "The number of rows deleted by the cascade." @synonyms "count, size, quantity" = 0
21
- headId : string @description "Scratch: id of the dependent row the loop is currently deleting." @synonyms "current id, cursor" = ""
21
+ headId : string @intrinsic @description "Scratch: id of the dependent row the loop is currently deleting." @synonyms "current id, cursor" = ""
22
22
  }
23
23
 
24
24
  trait CascadeOnDeleteGate -> CascadeLog [lifecycle, instance, cascade-delete] {
@@ -43,11 +43,18 @@ orbital CascadeOnDeleteOrbital {
43
43
  })
44
44
  DepsLoaded -> idle when ["=", (array/len (array/filter ?data (fn row ["=", (object/get @row @config.foreignKeyField), @entity.parentId]))), 0]
45
45
  (emit CascadeCompleted { parentId: @entity.parentId })
46
+ (persist create CascadeLog {
47
+ parentId: @entity.parentId
48
+ parentEntity: @entity.parentEntity
49
+ rowCount: @entity.rowCount
50
+ })
46
51
  CascadeStepped -> scanning
52
+ (set @entity.rowCount (+ @entity.rowCount 1))
47
53
  (fetch @config.dependentEntity {
48
54
  emit: { failure: CascadeFailed, success: DepsLoaded }
49
55
  })
50
56
  CascadeFailed -> idle
57
+ (notify error (str/concat "Couldn't cascade the delete — " ?error))
51
58
  }
52
59
 
53
60
  emits {
@@ -21,9 +21,9 @@ orbital ServiceNodeOrbital {
21
21
  description : string @description "A textual explanation of the service node's function." @synonyms "explanation, details, notes, information"
22
22
  status : "active" | "inactive" | "pending" @description "Current operational state of the component." @synonyms "state, condition, operationalStatus" = active
23
23
  createdAt : string
24
- failureCount : number @description "The number of times the circuit breaker has failed." @synonyms "error count, failures, error occurrences" = 0
25
- successCount : number @description "Number of successful operations." @synonyms "successes, hits, completions" = 0
26
- threshold : number @description "Maximum value before triggering an action." @synonyms "limit, cap, boundary" = 5
24
+ failureCount : number @intrinsic @description "The number of times the circuit breaker has failed." @synonyms "error count, failures, error occurrences" = 0
25
+ successCount : number @intrinsic @description "Number of successful operations." @synonyms "successes, hits, completions" = 0
26
+ threshold : number @intrinsic @description "Maximum value before triggering an action." @synonyms "limit, cap, boundary" = 5
27
27
  }
28
28
 
29
29
  trait ShieldIcon = Icon.traits.IconRender -> ServiceNode {
@@ -170,6 +170,8 @@ orbital ServiceNodeOrbital {
170
170
  gap: lg
171
171
  type: stack
172
172
  })
173
+ ServiceNodeLoadFailed -> closed
174
+ (notify error (str/concat "Couldn't load the service node — " ?message))
173
175
  FAILURE -> open
174
176
  (render-ui main {
175
177
  children: [{
@@ -47,6 +47,8 @@ orbital CrossReferenceOrbital {
47
47
  LinksFetched -> idle
48
48
  (set @entity.filteredLinks (array/filter ?data (fn row ["=", (object/get @row leftId), @entity.leftId])))
49
49
  (emit LinksLoaded { data: @entity.filteredLinks, leftId: @entity.leftId })
50
+ LinkOpFailed -> idle
51
+ (notify error (str/concat "Couldn't update the link — " ?error))
50
52
  }
51
53
 
52
54
  emits {
@@ -97,6 +97,7 @@ orbital DataErasureOrbital {
97
97
  })
98
98
  ErasureLoaded -> idle
99
99
  ErasureLoadFailed -> idle
100
+ (notify error (str/concat "Couldn't load the erasure queue — " ?error))
100
101
  OPEN -> loading when @config.enabled
101
102
  (fetch ErasureRequest {
102
103
  emit: { failure: ErasureLoadFailed, success: ErasureLoaded }
@@ -127,6 +128,7 @@ orbital DataErasureOrbital {
127
128
  })
128
129
  ExecScanLoaded -> idle when ["=", (array/len ?data), 0]
129
130
  ExecScanFailed -> idle
131
+ (notify error (str/concat "Couldn't scan for erasures to execute — " ?error))
130
132
  }
131
133
 
132
134
  state execScanning {
@@ -153,6 +155,7 @@ orbital DataErasureOrbital {
153
155
  })
154
156
  ExecScanLoaded -> idle when ["=", (array/len ?data), 0]
155
157
  ExecScanFailed -> idle
158
+ (notify error (str/concat "Couldn't scan for erasures to execute — " ?error))
156
159
  }
157
160
 
158
161
  state loading {
@@ -34,6 +34,7 @@ orbital LifecycleOrbital {
34
34
  })
35
35
  ScanRecordsLoaded -> idle when ["=", (array/len ?data), 0]
36
36
  ScanFailed -> idle
37
+ (notify error (str/concat "Couldn't scan for lifecycle transitions — " ?error))
37
38
  }
38
39
 
39
40
  state scanning {
@@ -51,6 +52,7 @@ orbital LifecycleOrbital {
51
52
  })
52
53
  ScanRecordsLoaded -> idle when ["=", (array/len ?data), 0]
53
54
  ScanFailed -> idle
55
+ (notify error (str/concat "Couldn't scan for lifecycle transitions — " ?error))
54
56
  }
55
57
 
56
58
  emits {
@@ -68,6 +68,7 @@ orbital MigrationJobOrbital {
68
68
  target: @entity.target
69
69
  })
70
70
  (emit MIGRATION_FAILED { error: @entity.error })
71
+ (notify error (str/concat "Couldn't list the source documents — " ?error))
71
72
  }
72
73
 
73
74
  state mapping {
@@ -114,6 +115,7 @@ orbital MigrationJobOrbital {
114
115
  target: @entity.target
115
116
  })
116
117
  (emit MIGRATION_FAILED { error: @entity.error })
118
+ (notify error (str/concat "Couldn't fetch the document — " ?error))
117
119
  }
118
120
 
119
121
  state reviewing {
@@ -135,6 +137,15 @@ orbital MigrationJobOrbital {
135
137
  (set @entity.skipped [])
136
138
  (set @entity.validationErrors [])
137
139
  (render-ui @config.reviewSlot null)
140
+ CLOSE -> idle
141
+ (set @entity.status idle)
142
+ (set @entity.documents [])
143
+ (set @entity.document {})
144
+ (set @entity.stats {})
145
+ (set @entity.units [])
146
+ (set @entity.skipped [])
147
+ (set @entity.validationErrors [])
148
+ (render-ui @config.reviewSlot null)
138
149
  }
139
150
 
140
151
  state committing {
@@ -162,6 +173,7 @@ orbital MigrationJobOrbital {
162
173
  target: @entity.target
163
174
  })
164
175
  (emit MIGRATION_FAILED { error: @entity.error })
176
+ (notify error (str/concat "Couldn't commit the import — " ?error))
165
177
  }
166
178
 
167
179
  state done {
@@ -90,6 +90,7 @@ orbital ModQueueItemOrbital {
90
90
  })
91
91
  ModQueueItemLoaded -> idle
92
92
  ModQueueItemLoadFailed -> idle
93
+ (notify error (str/concat "Couldn't load the moderation queue — " ?error))
93
94
  OPEN -> loading when @config.enabled
94
95
  (fetch ModQueueItem {
95
96
  emit: { failure: ModQueueItemLoadFailed, success: ModQueueItemLoaded }
@@ -190,6 +190,7 @@ orbital NotificationCenterOrbital {
190
190
  DIGEST_ROWS_LOADED -> idle when ["=", (array/len ?data), 0]
191
191
  DIGEST_FAILED -> idle
192
192
  (set @entity.lastError ?error)
193
+ (notify error (str/concat "Couldn't send the notification digest — " ?error))
193
194
  }
194
195
 
195
196
  state draining {
@@ -216,6 +217,7 @@ orbital NotificationCenterOrbital {
216
217
  DIGEST_ROWS_LOADED -> idle when ["=", (array/len ?data), 0]
217
218
  DIGEST_FAILED -> idle
218
219
  (set @entity.lastError ?error)
220
+ (notify error (str/concat "Couldn't send the notification digest — " ?error))
219
221
  }
220
222
 
221
223
  emits {
@@ -176,6 +176,7 @@ orbital NotifyOnEventOrbital {
176
176
  recordedAt: @now
177
177
  severity: @entity.severity
178
178
  })
179
+ (notify error (str/concat "Couldn't send the email notification — " ?error))
179
180
  NOTIFY_SMS_SENT -> idle
180
181
  (set @entity.dispatched true)
181
182
  (persist create NotificationRecord {
@@ -198,6 +199,7 @@ orbital NotifyOnEventOrbital {
198
199
  recordedAt: @now
199
200
  severity: @entity.severity
200
201
  })
202
+ (notify error (str/concat "Couldn't send the text message — " ?error))
201
203
  NOTIFY_WEBHOOK_SENT -> idle
202
204
  (set @entity.dispatched true)
203
205
  (persist create NotificationRecord {
@@ -220,6 +222,7 @@ orbital NotifyOnEventOrbital {
220
222
  recordedAt: @now
221
223
  severity: @entity.severity
222
224
  })
225
+ (notify error (str/concat "Couldn't send the webhook notification — " ?error))
223
226
  NOTIFY_PUSH_SENT -> idle
224
227
  (set @entity.dispatched true)
225
228
  (persist create NotificationRecord {
@@ -242,6 +245,7 @@ orbital NotifyOnEventOrbital {
242
245
  recordedAt: @now
243
246
  severity: @entity.severity
244
247
  })
248
+ (notify error (str/concat "Couldn't send the push notification — " ?error))
245
249
  NOTIFY_LOOKUP_FAILED -> idle
246
250
  (set @entity.dispatched false)
247
251
  (set @entity.error ?error)
@@ -254,6 +258,7 @@ orbital NotifyOnEventOrbital {
254
258
  recordedAt: @now
255
259
  severity: @entity.severity
256
260
  })
261
+ (notify error (str/concat "Couldn't look up notification preferences — " ?error))
257
262
  }
258
263
 
259
264
  emits {
@@ -37,6 +37,7 @@ orbital ReminderSchedulerOrbital {
37
37
  })
38
38
  ScanRecordsLoaded -> idle when ["=", (array/len ?data), 0]
39
39
  ScanFailed -> idle
40
+ (notify error (str/concat "Couldn't scan for reminders — " ?error))
40
41
  }
41
42
 
42
43
  state scanning {
@@ -57,6 +58,7 @@ orbital ReminderSchedulerOrbital {
57
58
  })
58
59
  ScanRecordsLoaded -> idle when ["=", (array/len ?data), 0]
59
60
  ScanFailed -> idle
61
+ (notify error (str/concat "Couldn't scan for reminders — " ?error))
60
62
  }
61
63
 
62
64
  emits {
@@ -31,6 +31,7 @@ orbital StatusLifecycleOrbital {
31
31
  StatusPersisted -> idle when ["!=", (str/default ?id ""), ""]
32
32
  (emit StatusChanged { entityId: ?id, status: (str/default (object/get @payload @config.statusField) "") })
33
33
  StatusChangeFailed -> idle
34
+ (notify error (str/concat "Couldn't change the status — " ?error))
34
35
  }
35
36
 
36
37
  emits {
@@ -73,6 +73,7 @@ orbital MlClassifyOrbital {
73
73
  (set @entity.errorMessage ?error)
74
74
  (set @entity.status done)
75
75
  (emit CLASSIFY_FAILED { error: @entity.errorMessage })
76
+ (notify error (str/concat "Couldn't classify — " ?error))
76
77
  }
77
78
 
78
79
  state done {
@@ -87,6 +87,7 @@ orbital MlInferOrbital {
87
87
  (set @entity.reason "unavailable")
88
88
  (set @entity.status resolved)
89
89
  (emit INFER_ABSTAINED { reason: "unavailable", violations: @entity.violations, request: @entity.request })
90
+ (notify error (str/concat "Couldn't run inference — " ?error))
90
91
  }
91
92
 
92
93
  state resolved {
@@ -49,6 +49,7 @@ orbital AppLayoutOrbital {
49
49
  })
50
50
  AppLayoutStateLoaded -> composing
51
51
  AppLayoutStateLoadFailed -> composing
52
+ (notify error (str/concat "Couldn't load the layout — " ?error))
52
53
  SEARCH -> composing
53
54
  NOTIFY_CLICK -> composing
54
55
  }
@@ -268,6 +268,12 @@ orbital BoardOrbital {
268
268
  label: (object/get @col label)
269
269
  variant: (object/get @col variant default)
270
270
  })))
271
+ BoardItemsSaveFailed -> viewing_board
272
+ (set @entity.errorMessage ?error)
273
+ (notify error (str/concat "Couldn't save the board — " ?error))
274
+ BoardItemsLoadFailed -> viewing_board
275
+ (set @entity.errorMessage ?error)
276
+ (notify error (str/concat "Couldn't refresh the board — " ?error))
271
277
  }
272
278
 
273
279
  state viewing_card {
@@ -105,7 +105,7 @@ orbital BrowseItemOrbital {
105
105
  REFETCH_QUERY -> browsing
106
106
  (fetch BrowseItem {
107
107
  emit: { failure: BrowseItemLoadFailed, success: BrowseItemLoaded }
108
- filter: (and (or ["=", @config.scopeField, ""] ["=", (object/get @entity @config.scopeField), @user.id]) (or ["=", ?searchTerm, ""] (str/includes (object/get @entity name) ?searchTerm)))
108
+ filter: (and (or ["=", @config.scopeField, ""] ["=", (object/get @entity @config.scopeField), @user.id]) (or ["=", ?searchTerm, ""] (str/includes (object/get @entity @config.searchField) ?searchTerm)))
109
109
  include: @config.include
110
110
  limit: @config.pageSize
111
111
  offset: 0
@@ -146,6 +146,10 @@ orbital BrowseItemOrbital {
146
146
  (if ["=", @config.browseLook, triage]
147
147
  (render-ui main @config.triageBodyContent)
148
148
  (render-ui main @config.bodyContent))))))
149
+ ;; A refetch keeps the populated body on screen; only the failure
150
+ ;; itself has to reach the user.
151
+ BrowseItemLoadFailed -> browsing
152
+ (notify error (str/concat "Couldn't refresh the list — " ?error))
149
153
  }
150
154
 
151
155
  state error {
@@ -372,6 +376,11 @@ orbital BrowseItemOrbital {
372
376
  @description "Adds a checkbox column with select-all to the dense table. Enable only when the surface offers bulk actions — checkboxes with nothing to act on are a dead affordance."
373
377
  @synonyms "row checkboxes, multi-select, bulk select, selection column"
374
378
  @tier "presentation"
379
+ searchField : string = "name"
380
+ @label "Which column does the search box match against?"
381
+ @description "Name the field on this entity the search box's str/includes filter matches against. Declared, never inferred: an entity with no `name` column must set this to a real field (e.g. title, content) or the search box can never match a row."
382
+ @synonyms "search column, search on field, match field, search key"
383
+ @tier "policy"
375
384
  bodySearch : boolean = true
376
385
  @label "Show the list's own search box?"
377
386
  @description "The dense/feed/gallery looks embed their own search box above the rows. Set false when the page already provides a search affordance (a toolbar Search molecule), so the surface shows one search box instead of two."
@@ -116,7 +116,7 @@ orbital CalendarEventOrbital {
116
116
  (fetch CalendarEvent {
117
117
  emit: { failure: CalendarEventLoadFailed, success: CalendarEventLoaded }
118
118
  include: @config.include
119
- filter: (or ["=", ?searchTerm, ""] (str/includes (object/get @entity name) ?searchTerm))
119
+ filter: (or ["=", ?searchTerm, ""] (str/includes (object/get @entity @config.searchField) ?searchTerm))
120
120
  })
121
121
  REFETCH_FILTER -> loading
122
122
  (fetch CalendarEvent {
@@ -283,6 +283,11 @@ orbital CalendarEventOrbital {
283
283
  @description "Row field the agenda list groups its day sections by. Rebound hosts point this at their own timestamp column (e.g. startTime, scheduledAt)."
284
284
  @synonyms "group field, section field, day field"
285
285
  @tier "presentation"
286
+ searchField : string = "name"
287
+ @label "Which column does the search box match against?"
288
+ @description "Name the field on this entity the search box's str/includes filter matches against. Declared, never inferred: an entity with no `name` column must set this to a real field (e.g. title, description) or the search box can never match a row."
289
+ @synonyms "search column, search on field, match field, search key"
290
+ @tier "policy"
286
291
  bodySearch : boolean = false
287
292
  @label "Show the calendar's own search box?"
288
293
  @description "Embeds a title search box in the toolbar above the calendar body (all three calendarLook trees). Defaults false: std-calendar has never had a search box, so an untouched consumer's surface is unchanged; the primary path is composing std-search beside this atom and wiring XSearch.SEARCH -> REFETCH_QUERY. Set true only for a standalone calendar with no page-level search affordance."
@@ -28,6 +28,8 @@ orbital ConfirmActionOrbital {
28
28
  (fetch ConfirmAction {
29
29
  emit: { failure: ConfirmActionLoadFailed, success: ConfirmActionLoaded }
30
30
  })
31
+ ConfirmActionLoadFailed -> idle
32
+ (notify error (str/concat "Couldn't load the item to confirm — " ?error))
31
33
  ;; Guard: REQUEST is rejected if no `row` payload was provided.
32
34
  ;; "Confirm an action against X" is meaningless without X — a
33
35
  ;; confirmation dialog with no entity to display is a precondition
@@ -99,10 +99,10 @@ orbital ESignRequestOrbital {
99
99
  state browsing {
100
100
  SEND_REQUEST -> browsing
101
101
  (set @entity.id ?id)
102
- (notify "Signature request sent" success)
102
+ (notify success "Signature request sent")
103
103
  REVOKE_REQUEST -> browsing
104
104
  (set @entity.id ?id)
105
- (notify "Signature request revoked" info)
105
+ (notify info "Signature request revoked")
106
106
  }
107
107
 
108
108
  state error {
@@ -256,6 +256,8 @@ orbital EventLogOrbital {
256
256
  limit: @config.pageSize
257
257
  offset: ["*", ["-", ?page, 1], @config.pageSize]
258
258
  })
259
+ EventLogLoadFailed -> viewing
260
+ (notify error (str/concat "Couldn't refresh the event log — " ?error))
259
261
  EventLogLoaded -> viewing
260
262
  (set @entity.filterChips (array/prepend (array/map @config.kindOptions (fn k {
261
263
  icon: (object/get @k icon circle)
@@ -160,7 +160,7 @@ orbital GalleryItemOrbital {
160
160
  REFETCH_QUERY -> browsing
161
161
  (fetch GalleryItem {
162
162
  emit: { failure: GalleryItemLoadFailed, success: GalleryItemLoaded }
163
- filter: (or ["=", ?searchTerm, ""] (str/includes (object/get @entity name) ?searchTerm))
163
+ filter: (or ["=", ?searchTerm, ""] (str/includes (object/get @entity @config.searchField) ?searchTerm))
164
164
  limit: @config.pageSize
165
165
  offset: 0
166
166
  })
@@ -177,6 +177,8 @@ orbital GalleryItemOrbital {
177
177
  limit: @config.pageSize
178
178
  offset: ["*", ["-", ?page, 1], @config.pageSize]
179
179
  })
180
+ GalleryItemLoadFailed -> browsing
181
+ (notify error (str/concat "Couldn't refresh the gallery — " ?error))
180
182
  GalleryItemLoaded -> browsing
181
183
  (render-ui main {
182
184
  children: [{
@@ -360,6 +362,11 @@ orbital GalleryItemOrbital {
360
362
  @description "Entity field holding the image URL shown in the lightbox for the selected item"
361
363
  @synonyms "image url field, thumbnail field, src field"
362
364
  @tier "presentation"
365
+ searchField : string = "name"
366
+ @label "Which column does the search box match against?"
367
+ @description "Name the field on this entity the search box's str/includes filter matches against. Declared, never inferred: an entity with no `name` column must set this to a real field (e.g. title, caption) or the search box can never match a row."
368
+ @synonyms "search column, search on field, match field, search key"
369
+ @tier "policy"
363
370
  bodySearch : boolean = false
364
371
  @label "Show the gallery's own search box?"
365
372
  @description "Embeds a search box above the gallery grid. 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."
@@ -8,7 +8,7 @@ orbital GraphItemOrbital {
8
8
 
9
9
  entity GraphItem [runtime] {
10
10
  id : string!
11
- chartData : [ChartPoint] @description "The data points used to render the chart." @synonyms "data, values, points" = []
11
+ chartData : [ChartPoint] @intrinsic @description "The data points used to render the chart." @synonyms "data, values, points" = []
12
12
  }
13
13
 
14
14
  trait GraphItemGraph -> @rebindable GraphItem [interaction, instance] {
@@ -179,7 +179,7 @@ orbital ListItemOrbital {
179
179
  REFETCH_QUERY -> browsing
180
180
  (fetch ListItem {
181
181
  emit: { failure: ListItemLoadFailed, success: ListItemLoaded }
182
- filter: (or ["=", ?searchTerm, ""] (str/includes (object/get @entity name) ?searchTerm))
182
+ filter: (or ["=", ?searchTerm, ""] (str/includes (object/get @entity @config.searchField) ?searchTerm))
183
183
  })
184
184
  REFETCH_FILTER -> browsing
185
185
  (fetch ListItem {
@@ -193,6 +193,8 @@ orbital ListItemOrbital {
193
193
  limit: @config.pageSize
194
194
  offset: ["*", ["-", ?page, 1], @config.pageSize]
195
195
  })
196
+ ListItemLoadFailed -> browsing
197
+ (notify error (str/concat "Couldn't refresh the list — " ?error))
196
198
  ListItemLoaded -> browsing
197
199
  (render-ui main {
198
200
  children: [{
@@ -354,6 +356,11 @@ orbital ListItemOrbital {
354
356
  }
355
357
 
356
358
  config {
359
+ searchField : string = "name"
360
+ @label "Which column does the search box match against?"
361
+ @description "Name the field on this entity the search box's str/includes filter matches against. Declared, never inferred: an entity with no `name` column must set this to a real field (e.g. title, label) or the search box can never match a row."
362
+ @synonyms "search column, search on field, match field, search key"
363
+ @tier "policy"
357
364
  bodySearch : boolean = false
358
365
  @label "Show the list's own search box?"
359
366
  @description "Embeds a search box above the grid. Set true only when the page has no other search affordance (e.g. no page-level std-search), so the surface shows one search box instead of two. False is the default — this atom has never had a search box (0 consumers today)."
@@ -36,6 +36,8 @@ orbital ModalRecordOrbital {
36
36
  (fetch ModalRecord {
37
37
  emit: { failure: ModalRecordLoadFailed, success: ModalRecordLoaded }
38
38
  })
39
+ ModalRecordLoadFailed -> closed
40
+ (notify error (str/concat "Couldn't load the record — " ?error))
39
41
  ;; stash only — a SEED never opens anything; OPEN reads it on demand
40
42
  SEED -> closed
41
43
  (set @entity.seedRow (object/merge ?row {}))
@@ -78,7 +80,7 @@ orbital ModalRecordOrbital {
78
80
  (set @entity.seedRow (object/merge ?row {}))
79
81
  CLOSE -> closed
80
82
  (render-ui @config.detailSlot null)
81
- (notify Cancelled info)
83
+ (notify info Cancelled)
82
84
  SAVE -> closed
83
85
  (render-ui @config.detailSlot null)
84
86
  }
@@ -145,7 +145,7 @@ orbital SelectableItemOrbital {
145
145
  REFETCH_QUERY -> idle
146
146
  (fetch SelectableItem {
147
147
  emit: { failure: SelectableItemLoadFailed, success: SelectableItemLoaded }
148
- filter: (or ["=", ?searchTerm, ""] (str/includes (object/get @entity name) ?searchTerm))
148
+ filter: (or ["=", ?searchTerm, ""] (str/includes (object/get @entity @config.searchField) ?searchTerm))
149
149
  })
150
150
  REFETCH_FILTER -> idle
151
151
  (fetch SelectableItem {
@@ -166,6 +166,8 @@ orbital SelectableItemOrbital {
166
166
  limit: @config.pageSize
167
167
  offset: ["*", ["-", ?page, 1], @config.pageSize]
168
168
  })
169
+ SelectableItemLoadFailed -> idle
170
+ (notify error (str/concat "Couldn't refresh the list — " ?error))
169
171
  SelectableItemLoaded -> idle
170
172
  (render-ui main {
171
173
  children: [{
@@ -429,6 +431,11 @@ orbital SelectableItemOrbital {
429
431
  @label "Table look"
430
432
  @description "Layer 2 visual treatment for the data table rendered by this atom."
431
433
  @tier "presentation"
434
+ searchField : string = "name"
435
+ @label "Which column does the search box match against?"
436
+ @description "Name the field on this entity the search box's str/includes filter matches against. Declared, never inferred: an entity with no `name` column must set this to a real field (e.g. title, label) or the search box can never match a row."
437
+ @synonyms "search column, search on field, match field, search key"
438
+ @tier "policy"
432
439
  bodySearch : boolean = false
433
440
  @label "Show the pick-list's own search box?"
434
441
  @description "Embeds a search box above the pick-list. Set true only when the page has no other search affordance (e.g. no page-level std-search), so the surface shows one search box instead of two. False is the default — this atom has never had a search box (0 consumers today)."
@@ -15,7 +15,7 @@ orbital StatsItemOrbital {
15
15
 
16
16
  entity StatsItem [runtime] {
17
17
  id : string!
18
- cards : [StatCard] @description "A collection of statistical cards to display." @synonyms "statistics, items, displays" = []
18
+ cards : [StatCard] @intrinsic @description "A collection of statistical cards to display." @synonyms "statistics, items, displays" = []
19
19
  }
20
20
 
21
21
  trait StatsItemStats -> @rebindable StatsItem [interaction, instance] {
@@ -16,7 +16,8 @@ orbital StepFlowOrbital {
16
16
  entity StepFlowView [runtime] {
17
17
  id : string!
18
18
  wizardSteps : [WizardStep] @intrinsic = []
19
- currentStepIndex : number @intrinsic = 0
19
+ ;; Not @intrinsic: std-approval-chain's ApprovalRequest persists this as chain position.
20
+ currentStepIndex : number = 0
20
21
  totalSteps : number @intrinsic = 0
21
22
  currentStepLabel : string @intrinsic = ""
22
23
  currentStepDescription : string @intrinsic = ""
@@ -26,8 +27,8 @@ orbital StepFlowOrbital {
26
27
  primaryActionLabel : string @intrinsic = "Approve & Continue"
27
28
  primaryActionVariant : "primary" | "success" @intrinsic = primary
28
29
  primaryActionIcon : string @intrinsic = chevron-right
29
- finalStatus : "approved" | "rejected" | "escalated" | "" @intrinsic = ""
30
- rejectionReason : string @intrinsic = ""
30
+ finalStatus : "approved" | "rejected" | "escalated" | "" = ""
31
+ rejectionReason : string = ""
31
32
  errorMessage : string @intrinsic = ""
32
33
  }
33
34
 
@@ -35,6 +35,7 @@ orbital TagStripOrbital {
35
35
  ;; Pre-scope paint: the store is warm but no record is open yet.
36
36
  TagStripOptions -> idle
37
37
  TagStripLoadFailed -> idle
38
+ (notify error (str/concat "Couldn't load tags — " ?error))
38
39
  SHOW_TAG_STRIP -> loading
39
40
  (set @entity.docId ?id)
40
41
  (set @entity.docTagIds (array/map ?tagIds (fn t (str/default (object/get @t id) @t))))