@almadar/std 16.212.0 → 16.214.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 (60) hide show
  1. package/behaviors/lolo/agent/organisms/std-agent-rabit.lolo +1 -0
  2. package/behaviors/lolo/infra/atoms/std-notification-center.lolo +19 -1
  3. package/behaviors/lolo/ui/core/atoms/std-rating-review.lolo +214 -3
  4. package/behaviors/lolo/ui/core/molecules/ui-data-grid.lolo +13 -0
  5. package/behaviors/lolo/ui/core/molecules/ui-data-list.lolo +13 -0
  6. package/behaviors/lolo/ui/core/molecules/ui-table-view.lolo +13 -0
  7. package/behaviors/lolo/ui/core/organisms/ui-entity-table.lolo +13 -0
  8. package/behaviors/lolo/ui/game/atoms/ui-canvas-2d.lolo +2 -2
  9. package/behaviors/lolo/ui/game/atoms/ui-canvas.lolo +2 -2
  10. package/behaviors/lolo/ui/game/atoms/ui-control-grid.lolo +2 -2
  11. package/behaviors/lolo/ui/learning/atoms/ui-math-canvas.lolo +2 -2
  12. package/behaviors/registry/agent/organisms/std-agent-rabit.orb +8 -0
  13. package/behaviors/registry/infra/atoms/std-notification-center.orb +176 -1
  14. package/behaviors/registry/ui/core/atoms/std-rating-review.orb +443 -2
  15. package/behaviors/registry/ui/core/molecules/ui-data-grid.orb +58 -0
  16. package/behaviors/registry/ui/core/molecules/ui-data-list.orb +58 -0
  17. package/behaviors/registry/ui/core/molecules/ui-table-view.orb +58 -0
  18. package/behaviors/registry/ui/core/organisms/ui-entity-table.orb +58 -0
  19. package/behaviors/registry/ui/game/atoms/ui-canvas-2d.orb +2 -2
  20. package/behaviors/registry/ui/game/atoms/ui-canvas.orb +2 -2
  21. package/behaviors/registry/ui/game/atoms/ui-control-grid.orb +2 -2
  22. package/behaviors/registry/ui/learning/atoms/ui-math-canvas.orb +2 -2
  23. package/canonical-operators.json +322 -234
  24. package/dist/behaviors/exports-reader.js +626 -6
  25. package/dist/behaviors/functions/index.d.ts +27 -13
  26. package/dist/behaviors/functions/index.js +624 -7
  27. package/dist/behaviors/index.d.ts +1 -1
  28. package/dist/behaviors/index.js +627 -7
  29. package/dist/behaviors/query.js +626 -6
  30. package/dist/behaviors-embeddings.hash.json +3 -3
  31. package/dist/behaviors-embeddings.json +1 -1
  32. package/dist/behaviors-registry.json +293 -309
  33. package/dist/index.d.ts +1 -1
  34. package/dist/index.js +824 -208
  35. package/dist/knob-embeddings.hash.json +3 -3
  36. package/dist/knob-embeddings.json +1 -1
  37. package/dist/modules/array.js +22 -22
  38. package/dist/modules/behavior.js +2 -2
  39. package/dist/modules/browser.js +1 -1
  40. package/dist/modules/contract.js +6 -6
  41. package/dist/modules/core.js +18 -18
  42. package/dist/modules/data.js +7 -7
  43. package/dist/modules/graph.js +14 -14
  44. package/dist/modules/index.js +197 -201
  45. package/dist/modules/integration.js +1 -1
  46. package/dist/modules/llm.js +2 -2
  47. package/dist/modules/nn.js +6 -6
  48. package/dist/modules/object.js +11 -11
  49. package/dist/modules/prob.js +4 -4
  50. package/dist/modules/session.js +4 -4
  51. package/dist/modules/str.js +1 -1
  52. package/dist/modules/tensor.js +29 -29
  53. package/dist/modules/time.js +17 -17
  54. package/dist/modules/trace.js +1 -1
  55. package/dist/modules/train.js +23 -23
  56. package/dist/modules/validate.js +23 -27
  57. package/dist/modules/workspace.js +5 -5
  58. package/dist/registry/factory-signatures.json +1 -1
  59. package/dist/registry.js +197 -201
  60. 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
  }
@@ -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
@@ -288,7 +306,7 @@ orbital NotificationCenterOrbital {
288
306
  }
289
307
  }
290
308
 
291
- page "/notifications/preferences" as NotificationPreferencesPage -> PreferenceEditor
309
+ page "/notifications/preferences" as NotificationPreferencesPage -> PreferenceEditor, PreferenceEditorButtonSubscribe, PreferenceEditorButtonDigest
292
310
  page "/notifications/subscribe" as PushSubscribePage -> PushSubscriber
293
311
  page "/notifications/digest" as NotificationDigestPage -> DigestDrain
294
312
  }
@@ -881,9 +881,189 @@ orbital RatingReviewOrbital {
881
881
  type: stack
882
882
  })
883
883
  MARK_HELPFUL -> viewing
884
+ (set @entity.reviews (array/map @entity.reviews (fn row (if ["=", (object/get @row id ""), ?id] (object/merge @row { helpful: ["+", (object/get @row helpful 0), 1] }) @row))))
885
+ (set @entity.reviewsSource (array/map @entity.reviewsSource (fn row (if ["=", (object/get @row id ""), ?id] (object/merge @row { helpful: ["+", (object/get @row helpful 0), 1] }) @row))))
884
886
  (render-ui main {
885
- title: "Recording…"
886
- type: loading-state
887
+ children: [{
888
+ align: center
889
+ children: [{
890
+ children: [{
891
+ align: center
892
+ children: [{ name: star, type: icon }, {
893
+ content: Reviews
894
+ type: typography
895
+ variant: h3
896
+ }, {
897
+ color: muted
898
+ content: "·"
899
+ type: typography
900
+ }, {
901
+ content: @entity.averageRating
902
+ type: typography
903
+ variant: h3
904
+ }, {
905
+ color: warning
906
+ name: star
907
+ type: icon
908
+ }, {
909
+ color: muted
910
+ content: "·"
911
+ type: typography
912
+ }, {
913
+ color: muted
914
+ content: @entity.totalReviews
915
+ type: typography
916
+ variant: h4
917
+ }, {
918
+ color: muted
919
+ content: reviews
920
+ type: typography
921
+ variant: h4
922
+ }]
923
+ direction: horizontal
924
+ gap: sm
925
+ type: stack
926
+ }, {
927
+ color: muted
928
+ content: @config.subjectTitle
929
+ type: typography
930
+ variant: caption
931
+ }]
932
+ direction: vertical
933
+ gap: xs
934
+ type: stack
935
+ }, {
936
+ action: WRITE_REVIEW
937
+ icon: edit
938
+ label: @config.writeLabel
939
+ type: button
940
+ variant: primary
941
+ }]
942
+ direction: horizontal
943
+ gap: md
944
+ justify: between
945
+ type: stack
946
+ }, {
947
+ children: [{
948
+ children: [{
949
+ content: "Rating distribution"
950
+ type: typography
951
+ variant: h4
952
+ }, {
953
+ entity: @entity.starDistribution
954
+ fields: []
955
+ gap: sm
956
+ renderItem: (fn bar {
957
+ align: center
958
+ children: [{
959
+ content: @bar.label
960
+ type: typography
961
+ variant: caption
962
+ }, {
963
+ max: 100
964
+ type: progress-bar
965
+ value: @bar.percentage
966
+ variant: primary
967
+ }, {
968
+ color: muted
969
+ content: @bar.percentage
970
+ type: typography
971
+ variant: caption
972
+ }, {
973
+ color: muted
974
+ content: "%"
975
+ type: typography
976
+ variant: caption
977
+ }]
978
+ direction: horizontal
979
+ gap: md
980
+ type: stack
981
+ })
982
+ type: data-list
983
+ }]
984
+ direction: vertical
985
+ gap: sm
986
+ type: stack
987
+ }]
988
+ look: @config.cardLook
989
+ type: card
990
+ }, {
991
+ activeTab: @entity.currentSort
992
+ tabChangeEvent: CHANGE_SORT
993
+ tabs: @config.sortOptions
994
+ type: tabs
995
+ }, {
996
+ entity: @entity.reviews
997
+ fields: []
998
+ gap: md
999
+ renderItem: (fn review {
1000
+ children: [{
1001
+ children: [{
1002
+ align: center
1003
+ children: [{ name: @review.avatarIcon, type: icon }, {
1004
+ content: @review.authorName
1005
+ type: typography
1006
+ weight: bold
1007
+ }, {
1008
+ color: muted
1009
+ content: "·"
1010
+ type: typography
1011
+ }, {
1012
+ color: warning
1013
+ name: star
1014
+ type: icon
1015
+ }, {
1016
+ content: @review.rating
1017
+ type: typography
1018
+ weight: bold
1019
+ }, {
1020
+ color: muted
1021
+ content: "·"
1022
+ type: typography
1023
+ }, {
1024
+ color: muted
1025
+ content: @review.createdAt
1026
+ type: typography
1027
+ variant: caption
1028
+ }]
1029
+ direction: horizontal
1030
+ gap: sm
1031
+ type: stack
1032
+ }, {
1033
+ content: @review.comment
1034
+ type: typography
1035
+ variant: body
1036
+ }, {
1037
+ align: center
1038
+ children: [{
1039
+ action: MARK_HELPFUL
1040
+ actionPayload: { id: @review.id }
1041
+ icon: thumbs-up
1042
+ label: Helpful
1043
+ type: button
1044
+ variant: ghost
1045
+ }, {
1046
+ color: muted
1047
+ content: @review.helpful
1048
+ type: typography
1049
+ variant: caption
1050
+ }]
1051
+ direction: horizontal
1052
+ gap: sm
1053
+ type: stack
1054
+ }]
1055
+ direction: vertical
1056
+ gap: sm
1057
+ type: stack
1058
+ }]
1059
+ look: @config.cardLook
1060
+ type: card
1061
+ })
1062
+ type: data-list
1063
+ }]
1064
+ direction: vertical
1065
+ gap: lg
1066
+ type: stack
887
1067
  })
888
1068
  }
889
1069
 
@@ -1539,7 +1719,38 @@ orbital RatingReviewOrbital {
1539
1719
  }
1540
1720
  }
1541
1721
 
1542
- page "/reviews" as RatingReviewPage -> RatingReviewBoard
1722
+ trait RatingReviewPageNav -> ReviewView [interaction, instance] {
1723
+ initial: ready
1724
+
1725
+ state ready {
1726
+ INIT -> ready
1727
+ (render-ui main {
1728
+ action: OPEN_REVIEW_FORM
1729
+ icon: external-link
1730
+ label: "Open review form"
1731
+ type: button
1732
+ variant: ghost
1733
+ })
1734
+ OPEN_REVIEW_FORM -> ready
1735
+ (navigate "/reviews/new")
1736
+ }
1737
+
1738
+ emits {
1739
+ OPEN_REVIEW_FORM
1740
+ @description "Opens the standalone review-submission page."
1741
+ @synonyms "open form, new page, direct link"
1742
+ @tier "presentation"
1743
+ }
1744
+
1745
+ listens {
1746
+ OPEN_REVIEW_FORM
1747
+ @description "Opens the standalone review-submission page in place of the inline composer."
1748
+ @synonyms "open form, new page, direct link"
1749
+ @tier "presentation"
1750
+ }
1751
+ }
1752
+
1753
+ page "/reviews" as RatingReviewPage -> RatingReviewBoard, RatingReviewPageNav
1543
1754
 
1544
1755
  page "/reviews/new" as RatingReviewSubmitPage -> RatingReviewSubmit
1545
1756
  }
@@ -32,6 +32,12 @@ orbital DataGridOrbital {
32
32
  code : string
33
33
  stack : string
34
34
  }
35
+ type DataGridRelationsDataValueItem = {
36
+ value : string!
37
+ label : string!
38
+ description : string
39
+ disabled : boolean
40
+ }
35
41
 
36
42
  entity DataGridItem [runtime] {
37
43
  id : string!
@@ -72,6 +78,7 @@ orbital DataGridOrbital {
72
78
  hasMore: @config.hasMore
73
79
  pageSize: @config.pageSize
74
80
  look: @config.look
81
+ relationsData: @config.relationsData
75
82
  type: data-grid
76
83
  })
77
84
  INIT -> idle when (not @config.selfFetch)
@@ -104,6 +111,7 @@ orbital DataGridOrbital {
104
111
  hasMore: @config.hasMore
105
112
  pageSize: @config.pageSize
106
113
  look: @config.look
114
+ relationsData: @config.relationsData
107
115
  type: data-grid
108
116
  })
109
117
  DataGridLoaded -> idle
@@ -136,6 +144,7 @@ orbital DataGridOrbital {
136
144
  hasMore: @config.hasMore
137
145
  pageSize: @config.pageSize
138
146
  look: @config.look
147
+ relationsData: @config.relationsData
139
148
  type: data-grid
140
149
  })
141
150
  }
@@ -270,6 +279,10 @@ orbital DataGridOrbital {
270
279
  @label "Look"
271
280
  @description "Layer 2 visual treatment — mirrors the `entity-table` look enum so data-grid / data-list / entity-table share one knob name from authors."
272
281
  @tier "presentation"
282
+ relationsData : Map string [DataGridRelationsDataValueItem] = {}
283
+ @label "Relations Data"
284
+ @description "Relation display data: { fieldName: [{value, label}] } — injected server-side by the runtime (relation-option injection) or bound by compiled codegen; resolves stored foreign ids to display names for a field whose type is relation. Same contract DetailPanel takes."
285
+ @tier "presentation"
273
286
  selfFetch : boolean = true
274
287
  @label "Fetch its own rows on mount?"
275
288
  @description "true (default) = standalone mount self-populates on INIT. false = a composing atom owns the fetch and routes its loaded event here — suppresses the wrapper's own un-hydrated fetch so it cannot race the composer's."
@@ -38,6 +38,12 @@ orbital DataListOrbital {
38
38
  icon : icon
39
39
  variant : "primary" | "secondary" | "danger" | "ghost"
40
40
  }
41
+ type DataListRelationsDataValueItem = {
42
+ value : string!
43
+ label : string!
44
+ description : string
45
+ disabled : boolean
46
+ }
41
47
 
42
48
  entity DataListItem [runtime] {
43
49
  id : string!
@@ -87,6 +93,7 @@ orbital DataListOrbital {
87
93
  sortBy: @config.sortBy
88
94
  sortDirection: @config.sortDirection
89
95
  look: @config.look
96
+ relationsData: @config.relationsData
90
97
  type: data-list
91
98
  })
92
99
  INIT -> idle when (not @config.selfFetch)
@@ -128,6 +135,7 @@ orbital DataListOrbital {
128
135
  sortBy: @config.sortBy
129
136
  sortDirection: @config.sortDirection
130
137
  look: @config.look
138
+ relationsData: @config.relationsData
131
139
  type: data-list
132
140
  })
133
141
  DataListLoaded -> idle
@@ -169,6 +177,7 @@ orbital DataListOrbital {
169
177
  sortBy: @config.sortBy
170
178
  sortDirection: @config.sortDirection
171
179
  look: @config.look
180
+ relationsData: @config.relationsData
172
181
  type: data-list
173
182
  })
174
183
  }
@@ -352,6 +361,10 @@ orbital DataListOrbital {
352
361
  @label "Look"
353
362
  @description "Layer 2 visual treatment — mirrors the `entity-table` look enum so data-grid / data-list / entity-table share one knob name from authors."
354
363
  @tier "presentation"
364
+ relationsData : Map string [DataListRelationsDataValueItem] = {}
365
+ @label "Relations Data"
366
+ @description "Relation display data: { fieldName: [{value, label}] } — injected server-side by the runtime (relation-option injection) or bound by compiled codegen; resolves stored foreign ids to display names for a field whose type is relation. Same contract DetailPanel takes."
367
+ @tier "presentation"
355
368
  selfFetch : boolean = true
356
369
  @label "Fetch its own rows on mount?"
357
370
  @description "true (default) = standalone mount self-populates on INIT. false = a composing atom owns the fetch and routes its loaded event here — suppresses the wrapper's own un-hydrated fetch so it cannot race the composer's."
@@ -41,6 +41,12 @@ orbital TableViewOrbital {
41
41
  code : string
42
42
  stack : string
43
43
  }
44
+ type TableViewRelationsDataValueItem = {
45
+ value : string!
46
+ label : string!
47
+ description : string
48
+ disabled : boolean
49
+ }
44
50
 
45
51
  entity TableViewItem [runtime] {
46
52
  id : string!
@@ -80,6 +86,7 @@ orbital TableViewOrbital {
80
86
  groupBy: @config.groupBy
81
87
  pageSize: @config.pageSize
82
88
  look: @config.look
89
+ relationsData: @config.relationsData
83
90
  type: table-view
84
91
  })
85
92
  INIT -> idle when (not @config.selfFetch)
@@ -111,6 +118,7 @@ orbital TableViewOrbital {
111
118
  groupBy: @config.groupBy
112
119
  pageSize: @config.pageSize
113
120
  look: @config.look
121
+ relationsData: @config.relationsData
114
122
  type: table-view
115
123
  })
116
124
  TableViewLoaded -> idle
@@ -142,6 +150,7 @@ orbital TableViewOrbital {
142
150
  groupBy: @config.groupBy
143
151
  pageSize: @config.pageSize
144
152
  look: @config.look
153
+ relationsData: @config.relationsData
145
154
  type: table-view
146
155
  })
147
156
  }
@@ -275,6 +284,10 @@ orbital TableViewOrbital {
275
284
  @label "Look"
276
285
  @description "Layer 2 visual treatment — mirrors the data-list / entity-table look enum so authors share one knob name across row renderers."
277
286
  @tier "presentation"
287
+ relationsData : Map string [TableViewRelationsDataValueItem] = {}
288
+ @label "Relations Data"
289
+ @description "Relation display data: { fieldName: [{value, label}] } — injected server-side by the runtime (relation-option injection) or bound by compiled codegen; resolves stored foreign ids to display names for a column whose field is relation-typed. Same contract DetailPanel takes."
290
+ @tier "presentation"
278
291
  selfFetch : boolean = true
279
292
  @label "Fetch its own rows on mount?"
280
293
  @description "true (default) = standalone mount self-populates on INIT. false = a composing atom owns the fetch and routes its loaded event here — suppresses the wrapper's own un-hydrated fetch so it cannot race the composer's."
@@ -48,6 +48,12 @@ orbital EntityTableOrbital {
48
48
  variant : "default" | "danger"
49
49
  event : event
50
50
  }
51
+ type EntityTableRelationsDataValueItem = {
52
+ value : string!
53
+ label : string!
54
+ description : string
55
+ disabled : boolean
56
+ }
51
57
 
52
58
  entity EntityTableItem [runtime] {
53
59
  id : string!
@@ -87,6 +93,7 @@ orbital EntityTableOrbital {
87
93
  headerActions: @config.headerActions
88
94
  showTotal: @config.showTotal
89
95
  look: @config.look
96
+ relationsData: @config.relationsData
90
97
  type: entity-table
91
98
  })
92
99
  INIT -> idle when (not @config.selfFetch)
@@ -118,6 +125,7 @@ orbital EntityTableOrbital {
118
125
  headerActions: @config.headerActions
119
126
  showTotal: @config.showTotal
120
127
  look: @config.look
128
+ relationsData: @config.relationsData
121
129
  type: entity-table
122
130
  })
123
131
  EntityTableLoaded -> idle
@@ -149,6 +157,7 @@ orbital EntityTableOrbital {
149
157
  headerActions: @config.headerActions
150
158
  showTotal: @config.showTotal
151
159
  look: @config.look
160
+ relationsData: @config.relationsData
152
161
  type: entity-table
153
162
  })
154
163
  }
@@ -272,6 +281,10 @@ orbital EntityTableOrbital {
272
281
  @label "Look"
273
282
  @description "Layer 2 visual treatment — orthogonal to the semantic variant."
274
283
  @tier "presentation"
284
+ relationsData : Map string [EntityTableRelationsDataValueItem] = {}
285
+ @label "Relations Data"
286
+ @description "Relation display data: { fieldName: [{value, label}] } — injected server-side by the runtime (relation-option injection) or bound by compiled codegen; resolves stored foreign ids to display names for a column whose field is relation-typed. Same contract DetailPanel takes."
287
+ @tier "presentation"
275
288
  selfFetch : boolean = true
276
289
  @label "Fetch its own rows on mount?"
277
290
  @description "true (default) = standalone mount self-populates on INIT. false = a composing atom owns the fetch and routes its loaded event here — suppresses the wrapper's own un-hydrated fetch so it cannot race the composer's."
@@ -135,11 +135,11 @@ orbital Canvas2dOrbital {
135
135
  @label "Tile Leave Event"
136
136
  @description "Emits UI:{tileLeaveEvent} with {} on pointer leave."
137
137
  @tier "presentation"
138
- keyMap : Map string string = { item: "Item" }
138
+ keyMap : Map string string = { item: "INIT" }
139
139
  @label "Key Map"
140
140
  @description "Maps a keydown `e.code` → the board's SEMANTIC event (device-agnostic input)."
141
141
  @tier "presentation"
142
- keyUpMap : Map string string = { item: "Item" }
142
+ keyUpMap : Map string string = { item: "INIT" }
143
143
  @label "Key Up Map"
144
144
  @description "Maps a keyup `e.code` → the board's SEMANTIC event."
145
145
  @tier "presentation"
@@ -272,11 +272,11 @@ orbital CanvasOrbital {
272
272
  @label "Feature Click Event"
273
273
  @description "Feature-click event (3D only)."
274
274
  @tier "presentation"
275
- keyMap : Map string string = { item: "Item" }
275
+ keyMap : Map string string = { item: "INIT" }
276
276
  @label "Key Map"
277
277
  @description "keyMap prop"
278
278
  @tier "presentation"
279
- keyUpMap : Map string string = { item: "Item" }
279
+ keyUpMap : Map string string = { item: "INIT" }
280
280
  @label "Key Up Map"
281
281
  @description "keyUpMap prop"
282
282
  @tier "presentation"
@@ -114,11 +114,11 @@ orbital ControlGridOrbital {
114
114
  @label "Direction Event"
115
115
  @description "Event-bus event emitted with `{ direction, pressed }` (kind='dpad')"
116
116
  @tier "presentation"
117
- directionEvents : Map string string = { item: "Item" }
117
+ directionEvents : Map string string = { item: "INIT" }
118
118
  @label "Direction Events"
119
119
  @description "Per-direction PRESS → the board's SEMANTIC event (kind='dpad'), e.g. `{ left: 'LEFT', right: 'RIGHT', up: 'JUMP' }`. Lets the d-pad emit the SAME intent events as the keyboard so the FSM stays device-agnostic."
120
120
  @tier "presentation"
121
- directionReleaseEvents : Map string string = { item: "Item" }
121
+ directionReleaseEvents : Map string string = { item: "INIT" }
122
122
  @label "Direction Release Events"
123
123
  @description "Per-direction RELEASE → semantic event, e.g. `{ left: 'STOP', right: 'STOP' }`. Omit a direction to ignore its release."
124
124
  @tier "presentation"
@@ -407,11 +407,11 @@ orbital MathCanvasOrbital {
407
407
  @label "On Shape Click"
408
408
  @description "onShapeClick prop"
409
409
  @tier "presentation"
410
- keyMap : Map string string = { item: "Item" }
410
+ keyMap : Map string string = { item: "INIT" }
411
411
  @label "Key Map"
412
412
  @description "Maps a keydown `e.code` → the board's SEMANTIC event (device-agnostic input), emitted as `UI:{event}` — same contract as the game canvas keyMap."
413
413
  @tier "presentation"
414
- keyUpMap : Map string string = { item: "Item" }
414
+ keyUpMap : Map string string = { item: "INIT" }
415
415
  @label "Key Up Map"
416
416
  @description "Maps a keyup `e.code` → the board's SEMANTIC event."
417
417
  @tier "presentation"
@@ -467,6 +467,10 @@
467
467
  {
468
468
  "kind": "llm/generate"
469
469
  },
470
+ {
471
+ "kind": "navigate",
472
+ "resource": "/rabit/process"
473
+ },
470
474
  {
471
475
  "kind": "session/write-spec"
472
476
  },
@@ -787,6 +791,10 @@
787
791
  "plan": "@entity.plan",
788
792
  "totalOrbitals": "@entity.totalOrbitals"
789
793
  }
794
+ ],
795
+ [
796
+ "navigate",
797
+ "/rabit/process"
790
798
  ]
791
799
  ],
792
800
  "event": "PLANNED",