@almadar/std 16.211.0 → 16.213.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 (145) hide show
  1. package/behaviors/lolo/agent/organisms/std-agent-rabit.lolo +1 -0
  2. package/behaviors/lolo/infra/atoms/std-approval-gate.lolo +3 -0
  3. package/behaviors/lolo/infra/atoms/std-cache-aside.lolo +6 -0
  4. package/behaviors/lolo/infra/atoms/std-calendar-sync.lolo +3 -0
  5. package/behaviors/lolo/infra/atoms/std-cascade-on-delete.lolo +1 -0
  6. package/behaviors/lolo/infra/atoms/std-circuit-breaker.lolo +2 -0
  7. package/behaviors/lolo/infra/atoms/std-cross-reference.lolo +2 -0
  8. package/behaviors/lolo/infra/atoms/std-data-erasure.lolo +3 -0
  9. package/behaviors/lolo/infra/atoms/std-lifecycle.lolo +2 -0
  10. package/behaviors/lolo/infra/atoms/std-migration-job.lolo +12 -0
  11. package/behaviors/lolo/infra/atoms/std-mod-queue.lolo +1 -0
  12. package/behaviors/lolo/infra/atoms/std-notification-center.lolo +21 -1
  13. package/behaviors/lolo/infra/atoms/std-notify-on-event.lolo +5 -0
  14. package/behaviors/lolo/infra/atoms/std-reminder-scheduler.lolo +2 -0
  15. package/behaviors/lolo/infra/atoms/std-status-lifecycle.lolo +1 -0
  16. package/behaviors/lolo/ml/atoms/std-ml-classify.lolo +1 -0
  17. package/behaviors/lolo/ml/atoms/std-ml-infer.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 +6 -1
  20. package/behaviors/lolo/ui/core/atoms/std-calendar.lolo +6 -1
  21. package/behaviors/lolo/ui/core/atoms/std-event-log.lolo +2 -0
  22. package/behaviors/lolo/ui/core/atoms/std-gallery.lolo +8 -1
  23. package/behaviors/lolo/ui/core/atoms/std-list.lolo +8 -1
  24. package/behaviors/lolo/ui/core/atoms/std-rating-review.lolo +214 -3
  25. package/behaviors/lolo/ui/core/atoms/std-selection.lolo +8 -1
  26. package/behaviors/lolo/ui/core/atoms/std-tag-strip.lolo +1 -0
  27. package/behaviors/lolo/ui/core/atoms/std-tag-taxonomy.lolo +16 -0
  28. package/behaviors/lolo/ui/core/atoms/std-wizard.lolo +36 -0
  29. package/behaviors/lolo/ui/core/atoms/ui-badge.lolo +1 -1
  30. package/behaviors/lolo/ui/core/atoms/ui-button.lolo +1 -1
  31. package/behaviors/lolo/ui/core/atoms/ui-checkbox.lolo +22 -2
  32. package/behaviors/lolo/ui/core/atoms/ui-game-icon.lolo +1 -1
  33. package/behaviors/lolo/ui/core/atoms/ui-select.lolo +6 -2
  34. package/behaviors/lolo/ui/core/atoms/ui-textarea.lolo +3 -1
  35. package/behaviors/lolo/ui/core/molecules/ui-command-palette.lolo +1 -1
  36. package/behaviors/lolo/ui/core/molecules/ui-data-grid.lolo +13 -0
  37. package/behaviors/lolo/ui/core/molecules/ui-data-list.lolo +13 -0
  38. package/behaviors/lolo/ui/core/molecules/ui-floating-toolbar.lolo +1 -1
  39. package/behaviors/lolo/ui/core/molecules/ui-import-preview-tree.lolo +1 -1
  40. package/behaviors/lolo/ui/core/molecules/ui-menu.lolo +1 -1
  41. package/behaviors/lolo/ui/core/molecules/ui-table-view.lolo +13 -0
  42. package/behaviors/lolo/ui/core/molecules/ui-tabs.lolo +2 -2
  43. package/behaviors/lolo/ui/core/organisms/ui-entity-table.lolo +13 -0
  44. package/behaviors/lolo/ui/game/atoms/std-tutorial-overlay.lolo +6 -0
  45. package/behaviors/lolo/ui/game/atoms/ui-action-palette.lolo +1 -1
  46. package/behaviors/lolo/ui/game/atoms/ui-action-tile.lolo +1 -1
  47. package/behaviors/lolo/ui/game/atoms/ui-canvas-2d.lolo +2 -2
  48. package/behaviors/lolo/ui/game/atoms/ui-canvas.lolo +2 -2
  49. package/behaviors/lolo/ui/game/atoms/ui-choice-button.lolo +1 -1
  50. package/behaviors/lolo/ui/game/atoms/ui-control-button.lolo +1 -1
  51. package/behaviors/lolo/ui/game/atoms/ui-control-grid.lolo +4 -4
  52. package/behaviors/lolo/ui/game/atoms/ui-dialogue-bubble.lolo +1 -1
  53. package/behaviors/lolo/ui/game/atoms/ui-draw-fx-layer.lolo +1 -1
  54. package/behaviors/lolo/ui/game/atoms/ui-draw-skinned-mesh.lolo +7 -2
  55. package/behaviors/lolo/ui/game/atoms/ui-draw-sprite-layer.lolo +1 -1
  56. package/behaviors/lolo/ui/game/atoms/ui-draw-sprite.lolo +1 -1
  57. package/behaviors/lolo/ui/game/atoms/ui-game-audio-toggle.lolo +2 -2
  58. package/behaviors/lolo/ui/game/atoms/ui-game-hud.lolo +5 -5
  59. package/behaviors/lolo/ui/game/atoms/ui-game-menu.lolo +1 -1
  60. package/behaviors/lolo/ui/game/atoms/ui-health-bar.lolo +2 -2
  61. package/behaviors/lolo/ui/game/atoms/ui-score-display.lolo +1 -1
  62. package/behaviors/lolo/ui/game/atoms/ui-sequence-bar.lolo +2 -2
  63. package/behaviors/lolo/ui/game/atoms/ui-stat-badge.lolo +2 -2
  64. package/behaviors/lolo/ui/game/atoms/ui-trait-slot.lolo +4 -4
  65. package/behaviors/lolo/ui/learning/atoms/ui-math-canvas.lolo +2 -2
  66. package/behaviors/registry/agent/organisms/std-agent-rabit.orb +8 -0
  67. package/behaviors/registry/infra/atoms/std-approval-gate.orb +56 -18
  68. package/behaviors/registry/infra/atoms/std-cache-aside.orb +76 -32
  69. package/behaviors/registry/infra/atoms/std-calendar-sync.orb +46 -0
  70. package/behaviors/registry/infra/atoms/std-cascade-on-delete.orb +20 -0
  71. package/behaviors/registry/infra/atoms/std-circuit-breaker.orb +40 -14
  72. package/behaviors/registry/infra/atoms/std-cross-reference.orb +41 -15
  73. package/behaviors/registry/infra/atoms/std-data-erasure.orb +52 -0
  74. package/behaviors/registry/infra/atoms/std-lifecycle.orb +36 -0
  75. package/behaviors/registry/infra/atoms/std-migration-job.orb +108 -0
  76. package/behaviors/registry/infra/atoms/std-mod-queue.orb +20 -0
  77. package/behaviors/registry/infra/atoms/std-notification-center.orb +208 -1
  78. package/behaviors/registry/infra/atoms/std-notify-on-event.orb +70 -0
  79. package/behaviors/registry/infra/atoms/std-reminder-scheduler.orb +36 -0
  80. package/behaviors/registry/infra/atoms/std-status-lifecycle.orb +20 -0
  81. package/behaviors/registry/ml/atoms/std-ml-classify.orb +18 -0
  82. package/behaviors/registry/ml/atoms/std-ml-infer.orb +18 -0
  83. package/behaviors/registry/ui/core/atoms/std-board.orb +58 -0
  84. package/behaviors/registry/ui/core/atoms/std-browse.orb +9 -1
  85. package/behaviors/registry/ui/core/atoms/std-calendar.orb +9 -1
  86. package/behaviors/registry/ui/core/atoms/std-event-log.orb +26 -0
  87. package/behaviors/registry/ui/core/atoms/std-gallery.orb +35 -1
  88. package/behaviors/registry/ui/core/atoms/std-list.orb +35 -1
  89. package/behaviors/registry/ui/core/atoms/std-rating-review.orb +443 -2
  90. package/behaviors/registry/ui/core/atoms/std-selection.orb +35 -1
  91. package/behaviors/registry/ui/core/atoms/std-tag-strip.orb +20 -0
  92. package/behaviors/registry/ui/core/atoms/std-tag-taxonomy.orb +56 -0
  93. package/behaviors/registry/ui/core/atoms/std-wizard.orb +77 -0
  94. package/behaviors/registry/ui/core/atoms/ui-badge.orb +4 -1
  95. package/behaviors/registry/ui/core/atoms/ui-button.orb +4 -1
  96. package/behaviors/registry/ui/core/atoms/ui-checkbox.orb +78 -2
  97. package/behaviors/registry/ui/core/atoms/ui-game-icon.orb +4 -1
  98. package/behaviors/registry/ui/core/atoms/ui-select.orb +28 -0
  99. package/behaviors/registry/ui/core/atoms/ui-textarea.orb +14 -0
  100. package/behaviors/registry/ui/core/molecules/ui-command-palette.orb +1 -28
  101. package/behaviors/registry/ui/core/molecules/ui-data-grid.orb +58 -0
  102. package/behaviors/registry/ui/core/molecules/ui-data-list.orb +58 -0
  103. package/behaviors/registry/ui/core/molecules/ui-floating-toolbar.orb +1 -20
  104. package/behaviors/registry/ui/core/molecules/ui-import-preview-tree.orb +1 -14
  105. package/behaviors/registry/ui/core/molecules/ui-menu.orb +1 -24
  106. package/behaviors/registry/ui/core/molecules/ui-table-view.orb +58 -0
  107. package/behaviors/registry/ui/core/molecules/ui-tabs.orb +8 -2
  108. package/behaviors/registry/ui/core/organisms/ui-entity-table.orb +58 -0
  109. package/behaviors/registry/ui/game/atoms/std-tutorial-overlay.orb +44 -0
  110. package/behaviors/registry/ui/game/atoms/ui-action-palette.orb +4 -1
  111. package/behaviors/registry/ui/game/atoms/ui-action-tile.orb +4 -1
  112. package/behaviors/registry/ui/game/atoms/ui-canvas-2d.orb +2 -2
  113. package/behaviors/registry/ui/game/atoms/ui-canvas.orb +2 -2
  114. package/behaviors/registry/ui/game/atoms/ui-choice-button.orb +4 -1
  115. package/behaviors/registry/ui/game/atoms/ui-control-button.orb +4 -1
  116. package/behaviors/registry/ui/game/atoms/ui-control-grid.orb +10 -4
  117. package/behaviors/registry/ui/game/atoms/ui-dialogue-bubble.orb +4 -1
  118. package/behaviors/registry/ui/game/atoms/ui-draw-fx-layer.orb +4 -1
  119. package/behaviors/registry/ui/game/atoms/ui-draw-skinned-mesh.orb +12 -2
  120. package/behaviors/registry/ui/game/atoms/ui-draw-sprite-layer.orb +4 -1
  121. package/behaviors/registry/ui/game/atoms/ui-draw-sprite.orb +4 -1
  122. package/behaviors/registry/ui/game/atoms/ui-game-audio-toggle.orb +8 -2
  123. package/behaviors/registry/ui/game/atoms/ui-game-hud.orb +20 -5
  124. package/behaviors/registry/ui/game/atoms/ui-game-menu.orb +4 -1
  125. package/behaviors/registry/ui/game/atoms/ui-health-bar.orb +8 -2
  126. package/behaviors/registry/ui/game/atoms/ui-score-display.orb +4 -1
  127. package/behaviors/registry/ui/game/atoms/ui-sequence-bar.orb +4 -1
  128. package/behaviors/registry/ui/game/atoms/ui-stat-badge.orb +8 -2
  129. package/behaviors/registry/ui/game/atoms/ui-trait-slot.orb +8 -2
  130. package/behaviors/registry/ui/learning/atoms/ui-math-canvas.orb +2 -2
  131. package/dist/behaviors/exports-reader.js +1813 -283
  132. package/dist/behaviors/functions/index.d.ts +64 -19
  133. package/dist/behaviors/functions/index.js +1811 -284
  134. package/dist/behaviors/index.d.ts +1 -1
  135. package/dist/behaviors/index.js +1814 -284
  136. package/dist/behaviors/query.js +1813 -283
  137. package/dist/behaviors-embeddings.hash.json +3 -3
  138. package/dist/behaviors-embeddings.json +15 -15
  139. package/dist/behaviors-registry.json +827 -490
  140. package/dist/index.d.ts +1 -1
  141. package/dist/index.js +1814 -284
  142. package/dist/knob-embeddings.hash.json +3 -3
  143. package/dist/knob-embeddings.json +1 -1
  144. package/dist/registry/factory-signatures.json +1 -1
  145. package/package.json +2 -2
@@ -44,6 +44,7 @@ orbital CoordinatorOrbital {
44
44
  (session/write-spec "coordinator-plan" @entity.plan)
45
45
  (set @entity.phase dispatching)
46
46
  (emit DISPATCHED { plan: @entity.plan, totalOrbitals: @entity.totalOrbitals })
47
+ (navigate "/rabit/process")
47
48
  PLAN_FAILED -> monitoring
48
49
  (set @entity.plan "")
49
50
  }
@@ -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)
@@ -137,6 +138,8 @@ orbital ApprovalGateOrbital {
137
138
  emit: { failure: ApprovalRequestReviewFailed, success: ApprovalRequestReviewed }
138
139
  })
139
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"]
@@ -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 {
@@ -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 {
@@ -54,6 +54,7 @@ orbital CascadeOnDeleteOrbital {
54
54
  emit: { failure: CascadeFailed, success: DepsLoaded }
55
55
  })
56
56
  CascadeFailed -> idle
57
+ (notify error (str/concat "Couldn't cascade the delete — " ?error))
57
58
  }
58
59
 
59
60
  emits {
@@ -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 }
@@ -3,6 +3,8 @@ app std-notification-center "1.0.0"
3
3
  type NotifRow = { id : string, recipient : string, channel : string, message : string, severity : string, dispatched : boolean, error : string, recordedAt : number }
4
4
  type PushCreds = { endpoint : string, p256dh : string, auth : string }
5
5
  orbital NotificationCenterOrbital {
6
+ uses Button from "std/behaviors/ui-button"
7
+
6
8
  type PUSH_SUBSCRIBED = Event { endpoint : string, p256dh : string, auth : string } "browser/push-subscribe resolved — the credentials arrive FLAT on the payload (?endpoint, ?p256dh, ?auth), not wrapped in a `result` field."
7
9
 
8
10
  entity NotificationPreference [persistent: notificationPreferences] {
@@ -101,10 +103,26 @@ orbital NotificationCenterOrbital {
101
103
  }
102
104
  }
103
105
 
106
+ trait PreferenceEditorButtonSubscribe = Button.traits.ButtonRender -> NotificationPreference { config { label: "Enable push notifications", action: OPEN_SUBSCRIBE } }
107
+
108
+ trait PreferenceEditorButtonDigest = Button.traits.ButtonRender -> NotificationPreference { config { label: "View notification digest", action: OPEN_DIGEST } }
109
+
104
110
  trait PreferenceEditor -> NotificationPreference [lifecycle, instance] {
105
111
  initial: idle
106
112
 
107
113
  state idle {
114
+ INIT -> idle
115
+ (fetch NotificationPreference)
116
+ (render-ui main {
117
+ type: stack
118
+ direction: vertical
119
+ gap: md
120
+ children: [@trait.PreferenceEditorButtonSubscribe, @trait.PreferenceEditorButtonDigest]
121
+ })
122
+ OPEN_SUBSCRIBE -> idle
123
+ (navigate "/notifications/subscribe")
124
+ OPEN_DIGEST -> idle
125
+ (navigate "/notifications/digest")
108
126
  SAVE_PREFERENCE -> idle
109
127
  (persist create NotificationPreference {
110
128
  channel: ?channel
@@ -190,6 +208,7 @@ orbital NotificationCenterOrbital {
190
208
  DIGEST_ROWS_LOADED -> idle when ["=", (array/len ?data), 0]
191
209
  DIGEST_FAILED -> idle
192
210
  (set @entity.lastError ?error)
211
+ (notify error (str/concat "Couldn't send the notification digest — " ?error))
193
212
  }
194
213
 
195
214
  state draining {
@@ -216,6 +235,7 @@ orbital NotificationCenterOrbital {
216
235
  DIGEST_ROWS_LOADED -> idle when ["=", (array/len ?data), 0]
217
236
  DIGEST_FAILED -> idle
218
237
  (set @entity.lastError ?error)
238
+ (notify error (str/concat "Couldn't send the notification digest — " ?error))
219
239
  }
220
240
 
221
241
  emits {
@@ -286,7 +306,7 @@ orbital NotificationCenterOrbital {
286
306
  }
287
307
  }
288
308
 
289
- page "/notifications/preferences" as NotificationPreferencesPage -> PreferenceEditor
309
+ page "/notifications/preferences" as NotificationPreferencesPage -> PreferenceEditor, PreferenceEditorButtonSubscribe, PreferenceEditorButtonDigest
290
310
  page "/notifications/subscribe" as PushSubscribePage -> PushSubscriber
291
311
  page "/notifications/digest" as NotificationDigestPage -> DigestDrain
292
312
  }
@@ -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 {
@@ -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
@@ -376,6 +376,11 @@ orbital BrowseItemOrbital {
376
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."
377
377
  @synonyms "row checkboxes, multi-select, bulk select, selection column"
378
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"
379
384
  bodySearch : boolean = true
380
385
  @label "Show the list's own search box?"
381
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."
@@ -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."
@@ -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)."