@almadar/std 16.244.1 → 16.246.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 (73) hide show
  1. package/behaviors/behaviors-registry.json +918 -187
  2. package/behaviors/lolo/agent/atoms/std-agent-context.lolo +9 -4
  3. package/behaviors/lolo/agent/atoms/std-agent-memory.lolo +9 -4
  4. package/behaviors/lolo/agent/atoms/std-agent-proposal.lolo +9 -4
  5. package/behaviors/lolo/agent/atoms/std-agent-session.lolo +9 -4
  6. package/behaviors/lolo/agent/atoms/std-agent-suggestions.lolo +9 -4
  7. package/behaviors/lolo/agent/atoms/std-agent-tool-loop.lolo +9 -4
  8. package/behaviors/lolo/agent/organisms/std-agent-assistant.lolo +9 -4
  9. package/behaviors/lolo/ui/core/atoms/std-calendar.lolo +13 -5
  10. package/behaviors/lolo/ui/core/atoms/ui-svg-flow.lolo +1 -1
  11. package/behaviors/lolo/ui/core/molecules/ui-data-list.lolo +7 -0
  12. package/behaviors/lolo/ui/core/molecules/ui-import-progress.lolo +1 -1
  13. package/behaviors/lolo/ui/game/atoms/ui-canvas.lolo +3 -3
  14. package/behaviors/lolo/ui/game/atoms/ui-control-grid.lolo +3 -3
  15. package/behaviors/lolo/ui/game/atoms/ui-draw-group.lolo +1 -1
  16. package/behaviors/lolo/ui/game/atoms/ui-draw-mesh.lolo +1 -1
  17. package/behaviors/lolo/ui/game/atoms/ui-draw-skinned-mesh.lolo +3 -3
  18. package/behaviors/lolo/ui/learning/atoms/ui-biology-canvas.lolo +3 -3
  19. package/behaviors/lolo/ui/learning/atoms/ui-chemistry-canvas.lolo +3 -3
  20. package/behaviors/lolo/ui/learning/atoms/ui-physics-canvas.lolo +3 -3
  21. package/behaviors/lolo-behavior-contracts.json +1 -1
  22. package/behaviors/registry/agent/atoms/std-agent-context.orb +53 -67
  23. package/behaviors/registry/agent/atoms/std-agent-memory.orb +14 -51
  24. package/behaviors/registry/agent/atoms/std-agent-proposal.orb +50 -20
  25. package/behaviors/registry/agent/atoms/std-agent-session.orb +84 -91
  26. package/behaviors/registry/agent/atoms/std-agent-suggestions.orb +61 -24
  27. package/behaviors/registry/agent/atoms/std-agent-tool-loop.orb +61 -45
  28. package/behaviors/registry/agent/organisms/std-agent-assistant.orb +63 -26
  29. package/behaviors/registry/factory-signatures.json +1 -1
  30. package/behaviors/registry/ui/avl/atoms/ui-avl-state-machine.orb +2 -2
  31. package/behaviors/registry/ui/avl/atoms/ui-avl-transition-explainer.orb +2 -2
  32. package/behaviors/registry/ui/avl/atoms/ui-behavior-view.orb +2 -2
  33. package/behaviors/registry/ui/avl/atoms/ui-module-card.orb +2 -2
  34. package/behaviors/registry/ui/core/atoms/std-calendar.orb +18 -9
  35. package/behaviors/registry/ui/core/atoms/ui-svg-flow.orb +11 -4
  36. package/behaviors/registry/ui/core/molecules/ui-agent-chat-feed.orb +1 -1
  37. package/behaviors/registry/ui/core/molecules/ui-data-grid.orb +2 -2
  38. package/behaviors/registry/ui/core/molecules/ui-data-list.orb +20 -2
  39. package/behaviors/registry/ui/core/molecules/ui-import-progress.orb +1 -1
  40. package/behaviors/registry/ui/core/molecules/ui-swipeable-row.orb +2 -2
  41. package/behaviors/registry/ui/core/molecules/ui-table-view.orb +2 -2
  42. package/behaviors/registry/ui/core/molecules/ui-wizard-container.orb +3 -3
  43. package/behaviors/registry/ui/core/organisms/ui-detail-panel.orb +4 -4
  44. package/behaviors/registry/ui/core/organisms/ui-form-section.orb +4 -4
  45. package/behaviors/registry/ui/core/organisms/ui-form.orb +4 -4
  46. package/behaviors/registry/ui/core/organisms/ui-state-machine-view.orb +136 -2
  47. package/behaviors/registry/ui/core/templates/ui-dashboard-layout.orb +3 -2
  48. package/behaviors/registry/ui/game/atoms/ui-canvas.orb +51 -18
  49. package/behaviors/registry/ui/game/atoms/ui-control-grid.orb +3 -3
  50. package/behaviors/registry/ui/game/atoms/ui-draw-group.orb +12 -5
  51. package/behaviors/registry/ui/game/atoms/ui-draw-mesh.orb +12 -5
  52. package/behaviors/registry/ui/game/atoms/ui-draw-skinned-mesh.orb +39 -14
  53. package/behaviors/registry/ui/learning/atoms/ui-biology-canvas.orb +51 -18
  54. package/behaviors/registry/ui/learning/atoms/ui-chemistry-canvas.orb +51 -18
  55. package/behaviors/registry/ui/learning/atoms/ui-physics-canvas.orb +51 -18
  56. package/behaviors/signatures.lolo +788 -88
  57. package/canonical-operators.json +5 -5
  58. package/dist/behaviors/exports-reader.js +246 -227
  59. package/dist/behaviors/functions/index.d.ts +12 -11
  60. package/dist/behaviors/functions/index.js +246 -227
  61. package/dist/behaviors/index.js +246 -227
  62. package/dist/behaviors/query.js +246 -227
  63. package/dist/behaviors-embeddings.hash.json +3 -3
  64. package/dist/behaviors-embeddings.json +1 -1
  65. package/dist/behaviors-registry.json +918 -187
  66. package/dist/index.js +250 -231
  67. package/dist/knob-embeddings.hash.json +3 -3
  68. package/dist/knob-embeddings.json +11 -3
  69. package/dist/modules/array.js +4 -4
  70. package/dist/modules/index.js +4 -4
  71. package/dist/registry/factory-signatures.json +1 -1
  72. package/dist/registry.js +4 -4
  73. package/package.json +2 -2
@@ -5,11 +5,16 @@ type AgentChatMessage = {
5
5
  role : "user" | "assistant"
6
6
  content : string!
7
7
  }
8
- type AgentTool = {
9
- event : event
10
- read : string
11
- scope : "declared"
8
+ type AgentToolScope = {
9
+ scope : "declared"!
12
10
  }
11
+ type AgentToolInput = {
12
+ event : EventAddress!
13
+ }
14
+ type AgentToolRead = {
15
+ read : string!
16
+ }
17
+ type AgentTool = AgentToolScope | AgentToolInput | AgentToolRead
13
18
 
14
19
  orbital AgentContextOrbital {
15
20
  type ContextSummarized = Event { summary : string, keyPoints : [string] } "Fired when the older turns have been summarized"
@@ -5,11 +5,16 @@ type AgentChatMessage = {
5
5
  role : "user" | "assistant"
6
6
  content : string!
7
7
  }
8
- type AgentTool = {
9
- event : event
10
- read : string
11
- scope : "declared"
8
+ type AgentToolScope = {
9
+ scope : "declared"!
12
10
  }
11
+ type AgentToolInput = {
12
+ event : EventAddress!
13
+ }
14
+ type AgentToolRead = {
15
+ read : string!
16
+ }
17
+ type AgentTool = AgentToolScope | AgentToolInput | AgentToolRead
13
18
  type AgentMemoryRow = {
14
19
  id : string!
15
20
  content : string!
@@ -2,11 +2,16 @@ app std-agent-proposal "1.0.0"
2
2
  "std-agent-proposal — an agent that reads what the person hands over, works out a structured proposal, and commits nothing until they approve it. The app starts it with PROPOSAL_REQUESTED { input, context } (any trait emitting it, or the person typing into the start form when `showInputForm` is on). A second std-agent-tool-loop answers with `instructions`, `prompt` and `tools` as the signed-in person — `quiet`, its reply and failure renamed PROPOSAL_LOOP_REPLIED / PROPOSAL_LOOP_FAILED so they never reach the assistant's chat — and submits its proposal through one declared input, PROPOSE (its @description is the tool text): a summary and a list of items, each a flat map of scalar values the app names. The person reviews it (the summary, the items drawn with `itemPattern` and `itemFields`) and chooses: Approve emits PROPOSAL_APPROVED { proposal } for the app to commit (the app owns the commit; this atom writes nothing); Revise sends their written feedback back to the agent, which proposes again; Discard emits PROPOSAL_DISCARDED. Cancel while the agent works aborts its model call and emits PROPOSAL_CANCELLED. A run that fails, or ends without proposing, shows its error with Retry and Discard. The panel renders into `panelSlot`. Import the orbital once per app: `orbital Proposal = Proposal.orbitals.AgentProposalOrbital { config { instructions: \"…\", prompt: \"…\", itemFields: […] } }`, restating `tools` with PROPOSE addressed by its local orbital name (`{ event: Proposal.AgentProposalWorkflow.PROPOSE }`). Instructions, prompts, item fields and labels are the app's vocabulary, declared in config."
3
3
  ;; @capabilities "agent proposal, review before commit, human approval of agent output, approve or revise agent suggestions, structured proposal review, ai drafts for approval, extract then confirm"
4
4
 
5
- type AgentTool = {
6
- event : event
7
- read : string
8
- scope : "declared"
5
+ type AgentToolScope = {
6
+ scope : "declared"!
9
7
  }
8
+ type AgentToolInput = {
9
+ event : EventAddress!
10
+ }
11
+ type AgentToolRead = {
12
+ read : string!
13
+ }
14
+ type AgentTool = AgentToolScope | AgentToolInput | AgentToolRead
10
15
  type AgentChatMessage = {
11
16
  role : "user" | "assistant"
12
17
  content : string!
@@ -24,11 +24,16 @@ type AgentThreadRow = {
24
24
  content : string!
25
25
  createdAt : number
26
26
  }
27
- type AgentTool = {
28
- event : event
29
- read : string
30
- scope : "declared"
27
+ type AgentToolScope = {
28
+ scope : "declared"!
31
29
  }
30
+ type AgentToolInput = {
31
+ event : EventAddress!
32
+ }
33
+ type AgentToolRead = {
34
+ read : string!
35
+ }
36
+ type AgentTool = AgentToolScope | AgentToolInput | AgentToolRead
32
37
  type AgentToolKind = "input" | "read" | "invalid"
33
38
  type AgentMessageEntry = {
34
39
  type : "message"!
@@ -2,11 +2,16 @@ app std-agent-suggestions "1.0.0"
2
2
  "std-agent-suggestions — an agent that proactively proposes things to the signed-in person, who accepts or dismisses each one. The agent proposes through one declared input, PROPOSE_SUGGESTION (its @description is the tool text): a kind, a title, a body that gives its reasoning, an optional action (a name the app routes) with a payload, an optional href, and a subject (what it is about). A suggestion's signature is kind:action:subject; a signature that was ever proposed to this person, accepted or dismissed included, is never stored again (SUGGESTION_DUPLICATE), and no more than `maxPending` wait at once (SUGGESTION_LIMIT_REACHED). `kinds` and `actions`, when listed, are the only values accepted (SUGGESTION_REJECTED). The agent runs on its own: any trait emitting SUGGESTIONS_TRIGGERED (or an app event routed into AgentSuggestionTrigger's TRIGGERED by re-binding that trait in the import body with `omit { AgentSuggestionTrigger }` and its own `listens`) asks for a run, and once `cooldownMinutes` have passed since this person's last run a second std-agent-tool-loop answers `prompt` with `tools` as the signed-in person — `quiet`, so it streams no live steps and toasts no failure, and its reply and failure are renamed PROACTIVE_REPLIED / PROACTIVE_FAILED so they never reach the assistant's chat. AgentSuggestionInbox lists the pending suggestions with Accept and Dismiss and an empty state that offers to look again (SUGGESTIONS_ANALYZE_REQUESTED). Accept stores accepted, emits SUGGESTION_ACCEPTED { action, payload, href, … } for the app to route (and navigates to `href` when the suggestion has one); Dismiss stores dismissed and emits SUGGESTION_DISMISSED. The inbox renders into `panelSlot`: `main` inline (the content of a std-panel-launcher), or `modal`/`drawer` opened with OPEN and closed with CLOSE (set std-app-layout's notificationClickEvent, or a topBarActions event, to SUGGESTIONS_OPEN_REQUESTED). Import the orbital once per app: `orbital Suggestions = Suggest.orbitals.AgentSuggestionsOrbital { entity MySuggestion entities { AgentSuggestionRun: MySuggestionRun } config { … } }`, retargeting the records onto owner-scoped entities (`ownerId` a relation to your [identity] roster, with @read/@create/@update); a suggestion's proposer, inbox and trigger read only the rows whose ownerId is the signed-in person. PROPOSE_SUGGESTION's refusals (SUGGESTION_DUPLICATE, SUGGESTION_LIMIT_REACHED, SUGGESTION_REJECTED) are the agent's tool response; no trait listens to them. Suggestion kinds, actions and prompts are the app's vocabulary, declared in config."
3
3
  ;; @capabilities "proactive suggestions, agent recommendations, suggestion inbox, next best action, accept or dismiss suggestions, notification bell suggestions, agent proposals"
4
4
 
5
- type AgentTool = {
6
- event : event
7
- read : string
8
- scope : "declared"
5
+ type AgentToolScope = {
6
+ scope : "declared"!
9
7
  }
8
+ type AgentToolInput = {
9
+ event : EventAddress!
10
+ }
11
+ type AgentToolRead = {
12
+ read : string!
13
+ }
14
+ type AgentTool = AgentToolScope | AgentToolInput | AgentToolRead
10
15
  type AgentChatMessage = {
11
16
  role : "user" | "assistant"
12
17
  content : string!
@@ -1,11 +1,16 @@
1
1
  app std-agent-tool-loop "2.0.0"
2
2
  "std-agent-tool-loop — answers a conversation by operating the running app as the caller, through `call-service llm call-tools`. Its `tools` are `{ scope: declared }` (every declared external input plus a read over every persisted entity), or named declared inputs (addressed like a listens source: `Trait.EVENT`, `Orbital.Trait.EVENT`) and entities to read; each input fires as the signed-in user through the ordinary dispatch (guards and entity policies apply) and each read returns only the rows the caller may read. Headless: the conversation UI (std-agent-session) shows the reply; a failure shows as a toast, unless `quiet` is on (a background run nobody is watching: no live steps and no toast). CONVERSE carries the conversation (and optionally what std-agent-memory recalled); ASSISTANT_STEP carries each step live while it works (a model call, a tool it used, what the app answered) to the asking tab; ASSISTANT_REPLIED carries the reply, every step and the token usage; ASSISTANT_REPLY_FAILED carries the error. These names are the assistant contract std-agent-session's conversation hears from any orbital. Compose with std-agent-session (the conversation) and std-agent-trace (the step record)."
3
3
 
4
- type AgentTool = {
5
- event : event
6
- read : string
7
- scope : "declared"
4
+ type AgentToolScope = {
5
+ scope : "declared"!
8
6
  }
7
+ type AgentToolInput = {
8
+ event : EventAddress!
9
+ }
10
+ type AgentToolRead = {
11
+ read : string!
12
+ }
13
+ type AgentTool = AgentToolScope | AgentToolInput | AgentToolRead
9
14
  type AgentChatMessage = {
10
15
  role : "user" | "assistant"
11
16
  content : string!
@@ -1,11 +1,16 @@
1
1
  app std-agent-assistant "2.0.0"
2
2
  "std-agent-assistant — an in-app assistant that operates the running app for the signed-in user. Each section's floating button opens it in a side panel docked beside the page (std-panel-launcher; a side sheet on small screens), where the conversation shows every step the assistant takes live as it works; /assistant is the same conversation as a full page, in the app's own shell (pass `appName` and `navItems`); past conversations and what the assistant remembers open in place from its toolbar (Back returns to the chat), on either surface. One request flows down a chain of std agent atoms on the bus: the conversation (std-agent-session) SENDs → CONVERSE → std-agent-context bounds it → std-agent-memory adds what it recalls → std-agent-tool-loop answers it through `call-service llm call-tools`, firing only the inputs and reading only the entities its `tools` allow, as the signed-in user → ASSISTANT_REPLIED goes back to the conversation, to memory (remembered) and to std-agent-trace (the run record). By default the tools are the program's own declarations: every `-> external` input (its @description is the tool text) and a read over every persisted entity, so composing building blocks composes the assistant's abilities. Any section's page gets the assistant with two traits, `XAssistant = AgentSession.traits.AgentConversation` and a std-panel-launcher dock: the conversation speaks the ASSISTANT_* contract from any orbital, so the assistant needs no per-section wiring. Import the orbital once per app: `orbital Assistant = Agent.orbitals.AgentAssistantOrbital { config { instructions: \"…\" } }`. The conversation, memory and run records live in AgentRecordsOrbital; retarget them onto your own owner-scoped entities (`ownerId` a relation to your [identity] roster, with @read/@create) with `entities { AgentMessage: …, AgentMemory: …, AgentRun: …, AgentChat: … }`. The conversation is kept across pages and reloads (each person's most recently used conversation is the current one);"
3
3
 
4
- type AgentTool = {
5
- event : event
6
- read : string
7
- scope : "declared"
4
+ type AgentToolScope = {
5
+ scope : "declared"!
8
6
  }
7
+ type AgentToolInput = {
8
+ event : EventAddress!
9
+ }
10
+ type AgentToolRead = {
11
+ read : string!
12
+ }
13
+ type AgentTool = AgentToolScope | AgentToolInput | AgentToolRead
9
14
  type AgentLink = {
10
15
  label : string!
11
16
  href : string!
@@ -323,6 +323,7 @@ orbital CalendarEventOrbital {
323
323
  gap: md
324
324
  justify: between
325
325
  type: stack
326
+ wrap: true
326
327
  }, (if @config.bodySearch {
327
328
  children: [{
328
329
  className: "w-full max-w-md"
@@ -387,7 +388,7 @@ orbital CalendarEventOrbital {
387
388
  children: [{
388
389
  align: center
389
390
  children: [{ name: list, size: xl, type: icon }, {
390
- content: Agenda
391
+ content: @config.title
391
392
  type: typography
392
393
  variant: h2
393
394
  }]
@@ -403,6 +404,7 @@ orbital CalendarEventOrbital {
403
404
  gap: md
404
405
  justify: between
405
406
  type: stack
407
+ wrap: true
406
408
  }, (if @config.bodySearch {
407
409
  children: [{
408
410
  className: "w-full max-w-md"
@@ -438,6 +440,7 @@ orbital CalendarEventOrbital {
438
440
  fields: []
439
441
  gap: md
440
442
  groupBy: @config.agendaGroupBy
443
+ groupFormat: date
441
444
  itemActions: (array/filter @config.agendaItemActions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
442
445
  renderItem: (fn item {
443
446
  children: [{
@@ -451,25 +454,27 @@ orbital CalendarEventOrbital {
451
454
  type: typography
452
455
  variant: overline
453
456
  }, {
457
+ className: "hidden sm:block"
454
458
  color: muted
455
459
  name: clock
456
460
  size: sm
457
461
  type: icon
458
462
  }]
459
- className: "w-16 shrink-0"
463
+ className: "w-14 sm:w-16 shrink-0"
460
464
  direction: vertical
461
465
  gap: xs
462
466
  type: stack
463
- }, { orientation: vertical, type: divider }, {
467
+ }, { className: "hidden sm:block", orientation: vertical, type: divider }, {
464
468
  children: [{
465
469
  align: center
466
470
  children: [{
467
- className: truncate
471
+ className: "min-w-[8rem] flex-1 line-clamp-2 break-words"
468
472
  content: @config.titleBinding
469
473
  type: typography
470
474
  variant: h4
471
475
  weight: medium
472
476
  }, {
477
+ className: "shrink-0 whitespace-nowrap"
473
478
  label: @config.badgeBinding
474
479
  size: sm
475
480
  type: badge
@@ -479,6 +484,7 @@ orbital CalendarEventOrbital {
479
484
  gap: sm
480
485
  justify: between
481
486
  type: stack
487
+ wrap: true
482
488
  }, {
483
489
  className: truncate
484
490
  color: muted
@@ -499,6 +505,7 @@ orbital CalendarEventOrbital {
499
505
  padding: md
500
506
  type: card
501
507
  })
508
+ surface: none
502
509
  type: data-list
503
510
  variant: default
504
511
  }]
@@ -516,7 +523,7 @@ orbital CalendarEventOrbital {
516
523
  children: [{
517
524
  align: center
518
525
  children: [{ name: calendar, size: xl, type: icon }, {
519
- content: Week
526
+ content: @config.title
520
527
  type: typography
521
528
  variant: h2
522
529
  }]
@@ -555,6 +562,7 @@ orbital CalendarEventOrbital {
555
562
  gap: md
556
563
  justify: between
557
564
  type: stack
565
+ wrap: true
558
566
  }, (if @config.bodySearch {
559
567
  children: [{
560
568
  className: "w-full max-w-md"
@@ -43,7 +43,7 @@ orbital SvgFlowOrbital {
43
43
  }
44
44
 
45
45
  config {
46
- points : [[number]] = []
46
+ points : [[number, number]] = []
47
47
  @label "Points"
48
48
  @description "points prop"
49
49
  @tier "presentation"
@@ -91,6 +91,7 @@ orbital DataListOrbital {
91
91
  gap: @config.gap
92
92
  variant: @config.variant
93
93
  groupBy: @config.groupBy
94
+ groupFormat: @config.groupFormat
94
95
  senderField: @config.senderField
95
96
  senderLabelField: @config.senderLabelField
96
97
  currentUser: @config.currentUser
@@ -155,6 +156,7 @@ orbital DataListOrbital {
155
156
  gap: @config.gap
156
157
  variant: @config.variant
157
158
  groupBy: @config.groupBy
159
+ groupFormat: @config.groupFormat
158
160
  senderField: @config.senderField
159
161
  senderLabelField: @config.senderLabelField
160
162
  currentUser: @config.currentUser
@@ -219,6 +221,7 @@ orbital DataListOrbital {
219
221
  gap: @config.gap
220
222
  variant: @config.variant
221
223
  groupBy: @config.groupBy
224
+ groupFormat: @config.groupFormat
222
225
  senderField: @config.senderField
223
226
  senderLabelField: @config.senderLabelField
224
227
  currentUser: @config.currentUser
@@ -377,6 +380,10 @@ orbital DataListOrbital {
377
380
  @label "Group By"
378
381
  @description "Group items by a field value (renders section headers between groups)"
379
382
  @tier "presentation"
383
+ groupFormat : "date" | "time" | "datetime" | "currency" | "number" | "boolean" | "percent"
384
+ @label "Group Format"
385
+ @description "How a `groupBy` value is bucketed and labelled (`date` = one section per day)"
386
+ @tier "presentation"
380
387
  senderField : string
381
388
  @label "Sender Field"
382
389
  @description "Field name identifying the sender (used with variant: 'message')"
@@ -52,7 +52,7 @@ orbital ImportProgressOrbital {
52
52
  @label "Counts"
53
53
  @description "Unit counts"
54
54
  @tier "presentation"
55
- labels : Map string string = { item: "Item" }
55
+ labels : Map string string = { fetching: "Item" }
56
56
  @label "Labels"
57
57
  @description "Step label overrides"
58
58
  @tier "presentation"
@@ -32,12 +32,12 @@ orbital CanvasOrbital {
32
32
  type CanvasLightingAmbient = {
33
33
  intensity : number
34
34
  color : string
35
- position : [number]
35
+ position : [number, number, number]
36
36
  }
37
37
  type CanvasLightingDirectional = {
38
38
  intensity : number
39
39
  color : string
40
- position : [number]
40
+ position : [number, number, number]
41
41
  }
42
42
  type CanvasLightingHemisphere = {
43
43
  intensity : number
@@ -47,7 +47,7 @@ orbital CanvasOrbital {
47
47
  type CanvasLightingPointsItem = {
48
48
  intensity : number
49
49
  color : string
50
- position : [number]!
50
+ position : [number, number, number]!
51
51
  distance : number
52
52
  decay : number
53
53
  }
@@ -132,15 +132,15 @@ orbital ControlGridOrbital {
132
132
  @label "Direction Event"
133
133
  @description "Event-bus event emitted with `{ direction, pressed }` (kind='dpad')"
134
134
  @tier "presentation"
135
- directionEvents : Map string string = { item: "INIT" }
135
+ directionEvents : Map string string = { up: "INIT" }
136
136
  @label "Direction Events"
137
137
  @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."
138
138
  @tier "presentation"
139
- directionReleaseEvents : Map string string = { item: "INIT" }
139
+ directionReleaseEvents : Map string string = { up: "INIT" }
140
140
  @label "Direction Release Events"
141
141
  @description "Per-direction RELEASE → semantic event, e.g. `{ left: 'STOP', right: 'STOP' }`. Omit a direction to ignore its release."
142
142
  @tier "presentation"
143
- directionAssets : Map string ControlGridDirectionAssetsValue = { item: { url: "https://almadar-kflow-assets.web.app/shared/ui-roguelike-board/default/features/sword.png", role: "item", category: "item", animations: ["static"], style: "pixel", dimension: "2d", aspect: "1:1", name: "item", thumbnailUrl: "" } }
143
+ directionAssets : Map string ControlGridDirectionAssetsValue = { up: { url: "https://almadar-kflow-assets.web.app/shared/ui-roguelike-board/default/features/sword.png", role: "item", category: "item", animations: ["static"], style: "pixel", dimension: "2d", aspect: "1:1", name: "item", thumbnailUrl: "" } }
144
144
  @label "Direction Assets"
145
145
  @description "Per-direction sprite assets for kind='dpad' buttons (e.g. Kenny arrow PNGs). Falls back to arrow emoji."
146
146
  @tier "presentation"
@@ -64,7 +64,7 @@ orbital DrawGroupOrbital {
64
64
  @label "Rotate"
65
65
  @description "Rotation in radians (painter units)."
66
66
  @tier "presentation"
67
- rotation : [number] = []
67
+ rotation : [number, number, number]
68
68
  @label "Rotation"
69
69
  @description "Euler rotation `[x, y, z]` in radians (world axes) — per-axis joint rotation for the 3D backend; a group placed at a joint with children authored joint-local IS a bone. The 2D painter applies only the in-plane `z` component, after `rotate`."
70
70
  @tier "presentation"
@@ -144,7 +144,7 @@ orbital DrawMeshOrbital {
144
144
  @label "Skin"
145
145
  @description "`polyhedron` only: smooth-skinning weights binding the vertices to named bone groups. Vertices must then be authored in BIND POSE model space; the bones' animated transforms deform them."
146
146
  @tier "presentation"
147
- rotation : [number] = []
147
+ rotation : [number, number, number]
148
148
  @label "Rotation"
149
149
  @description "Euler rotation `[x, y, z]` in radians."
150
150
  @tier "presentation"
@@ -23,7 +23,7 @@ orbital DrawSkinnedMeshOrbital {
23
23
  }
24
24
  type DrawSkinnedMeshMesh = {
25
25
  vertices : [DrawSkinnedMeshMeshVerticesItem]!
26
- triangles : [[number]]!
26
+ triangles : [[number, number, number]]!
27
27
  }
28
28
  type DrawSkinnedMeshMeshVerticesItem = {
29
29
  x : number!
@@ -39,8 +39,8 @@ orbital DrawSkinnedMeshOrbital {
39
39
  type DrawSkinnedMeshBonesItem = {
40
40
  name : string!
41
41
  parent : string
42
- pivot : [number]!
43
- tip : [number]!
42
+ pivot : [number, number]!
43
+ tip : [number, number]!
44
44
  }
45
45
  type DrawSkinnedMeshClip = {
46
46
  frames : [Map string number]!
@@ -32,12 +32,12 @@ orbital BiologyCanvasOrbital {
32
32
  type BiologyCanvasLightingAmbient = {
33
33
  intensity : number
34
34
  color : string
35
- position : [number]
35
+ position : [number, number, number]
36
36
  }
37
37
  type BiologyCanvasLightingDirectional = {
38
38
  intensity : number
39
39
  color : string
40
- position : [number]
40
+ position : [number, number, number]
41
41
  }
42
42
  type BiologyCanvasLightingHemisphere = {
43
43
  intensity : number
@@ -47,7 +47,7 @@ orbital BiologyCanvasOrbital {
47
47
  type BiologyCanvasLightingPointsItem = {
48
48
  intensity : number
49
49
  color : string
50
- position : [number]!
50
+ position : [number, number, number]!
51
51
  distance : number
52
52
  decay : number
53
53
  }
@@ -32,12 +32,12 @@ orbital ChemistryCanvasOrbital {
32
32
  type ChemistryCanvasLightingAmbient = {
33
33
  intensity : number
34
34
  color : string
35
- position : [number]
35
+ position : [number, number, number]
36
36
  }
37
37
  type ChemistryCanvasLightingDirectional = {
38
38
  intensity : number
39
39
  color : string
40
- position : [number]
40
+ position : [number, number, number]
41
41
  }
42
42
  type ChemistryCanvasLightingHemisphere = {
43
43
  intensity : number
@@ -47,7 +47,7 @@ orbital ChemistryCanvasOrbital {
47
47
  type ChemistryCanvasLightingPointsItem = {
48
48
  intensity : number
49
49
  color : string
50
- position : [number]!
50
+ position : [number, number, number]!
51
51
  distance : number
52
52
  decay : number
53
53
  }
@@ -32,12 +32,12 @@ orbital PhysicsCanvasOrbital {
32
32
  type PhysicsCanvasLightingAmbient = {
33
33
  intensity : number
34
34
  color : string
35
- position : [number]
35
+ position : [number, number, number]
36
36
  }
37
37
  type PhysicsCanvasLightingDirectional = {
38
38
  intensity : number
39
39
  color : string
40
- position : [number]
40
+ position : [number, number, number]
41
41
  }
42
42
  type PhysicsCanvasLightingHemisphere = {
43
43
  intensity : number
@@ -47,7 +47,7 @@ orbital PhysicsCanvasOrbital {
47
47
  type PhysicsCanvasLightingPointsItem = {
48
48
  intensity : number
49
49
  color : string
50
- position : [number]!
50
+ position : [number, number, number]!
51
51
  distance : number
52
52
  decay : number
53
53
  }