@almadar/std 16.244.0 → 16.245.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.
@@ -11335,7 +11335,7 @@ pattern meter {
11335
11335
  ;; an `Alias.orbitals.X` reference overrides config + identifiers, never
11336
11336
  ;; the imported orbital's own topology.
11337
11337
 
11338
- ;; === atoms (280 behaviors, 280 apps, 281 orbitals, 281 entities, 302 traits, 284 pages) ===
11338
+ ;; === atoms (288 behaviors, 288 apps, 290 orbitals, 290 entities, 314 traits, 293 pages) ===
11339
11339
 
11340
11340
  ;; From @almadar/std (behaviors/registry/agent/atoms/std-agent-completion.orb)
11341
11341
  app std-agent-completion {
@@ -11387,6 +11387,16 @@ app std-agent-planner {
11387
11387
  source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-planner.orb)"
11388
11388
  }
11389
11389
 
11390
+ ;; From @almadar/std (behaviors/registry/agent/atoms/std-agent-proposal.orb)
11391
+ app std-agent-proposal {
11392
+ alias : AgentProposal
11393
+ version : "1.0.0"
11394
+ orbitals : (AgentProposalOrbital)
11395
+ override-surface : (config)
11396
+ ;; via uses Alias from "std/behaviors/std-agent-proposal" { config { ... } }
11397
+ source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-proposal.orb)"
11398
+ }
11399
+
11390
11400
  ;; From @almadar/std (behaviors/registry/agent/atoms/std-agent-session.orb)
11391
11401
  app std-agent-session {
11392
11402
  alias : AgentSession
@@ -11397,6 +11407,16 @@ app std-agent-session {
11397
11407
  source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-session.orb)"
11398
11408
  }
11399
11409
 
11410
+ ;; From @almadar/std (behaviors/registry/agent/atoms/std-agent-suggestions.orb)
11411
+ app std-agent-suggestions {
11412
+ alias : AgentSuggestions
11413
+ version : "1.0.0"
11414
+ orbitals : (AgentSuggestionsOrbital AgentSuggestionRecordsOrbital)
11415
+ override-surface : (config)
11416
+ ;; via uses Alias from "std/behaviors/std-agent-suggestions" { config { ... } }
11417
+ source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-suggestions.orb)"
11418
+ }
11419
+
11400
11420
  ;; From @almadar/std (behaviors/registry/agent/atoms/std-agent-tool-call.orb)
11401
11421
  app std-agent-tool-call {
11402
11422
  alias : AgentToolCall
@@ -11757,6 +11777,16 @@ app std-detail-layout {
11757
11777
  source : "@almadar/std (behaviors/registry/ui/core/atoms/std-detail-layout.orb)"
11758
11778
  }
11759
11779
 
11780
+ ;; From @almadar/std (behaviors/registry/ui/core/atoms/std-doc-page.orb)
11781
+ app std-doc-page {
11782
+ alias : DocPage
11783
+ version : "1.0.0"
11784
+ orbitals : (DocPageOrbital)
11785
+ override-surface : (config)
11786
+ ;; via uses Alias from "std/behaviors/std-doc-page" { config { ... } }
11787
+ source : "@almadar/std (behaviors/registry/ui/core/atoms/std-doc-page.orb)"
11788
+ }
11789
+
11760
11790
  ;; From @almadar/std (behaviors/registry/ui/game/atoms/std-dungeon-combat.orb)
11761
11791
  app std-dungeon-combat {
11762
11792
  alias : DungeonCombat
@@ -12587,6 +12617,46 @@ app std-pad-lock {
12587
12617
  source : "@almadar/std (behaviors/registry/ui/game/atoms/std-pad-lock.orb)"
12588
12618
  }
12589
12619
 
12620
+ ;; From @almadar/std (behaviors/registry/infra/atoms/std-page-open.orb)
12621
+ app std-page-open {
12622
+ alias : PageOpen
12623
+ version : "1.0.0"
12624
+ orbitals : (PageOpenOrbital)
12625
+ override-surface : (config)
12626
+ ;; via uses Alias from "std/behaviors/std-page-open" { config { ... } }
12627
+ source : "@almadar/std (behaviors/registry/infra/atoms/std-page-open.orb)"
12628
+ }
12629
+
12630
+ ;; From @almadar/std (behaviors/registry/infra/atoms/std-page-search.orb)
12631
+ app std-page-search {
12632
+ alias : PageSearch
12633
+ version : "1.0.0"
12634
+ orbitals : (PageSearchOrbital)
12635
+ override-surface : (config)
12636
+ ;; via uses Alias from "std/behaviors/std-page-search" { config { ... } }
12637
+ source : "@almadar/std (behaviors/registry/infra/atoms/std-page-search.orb)"
12638
+ }
12639
+
12640
+ ;; From @almadar/std (behaviors/registry/infra/atoms/std-page-treat.orb)
12641
+ app std-page-treat {
12642
+ alias : PageTreat
12643
+ version : "1.0.0"
12644
+ orbitals : (PageTreatOrbital)
12645
+ override-surface : (config)
12646
+ ;; via uses Alias from "std/behaviors/std-page-treat" { config { ... } }
12647
+ source : "@almadar/std (behaviors/registry/infra/atoms/std-page-treat.orb)"
12648
+ }
12649
+
12650
+ ;; From @almadar/std (behaviors/registry/infra/atoms/std-page-watch.orb)
12651
+ app std-page-watch {
12652
+ alias : PageWatch
12653
+ version : "1.0.0"
12654
+ orbitals : (PageWatchOrbital)
12655
+ override-surface : (config)
12656
+ ;; via uses Alias from "std/behaviors/std-page-watch" { config { ... } }
12657
+ source : "@almadar/std (behaviors/registry/infra/atoms/std-page-watch.orb)"
12658
+ }
12659
+
12590
12660
  ;; From @almadar/std (behaviors/registry/ui/core/atoms/std-pagination.orb)
12591
12661
  app std-pagination {
12592
12662
  alias : Pagination
@@ -13227,6 +13297,16 @@ app ui-avl-state-machine {
13227
13297
  source : "@almadar/std (behaviors/registry/ui/avl/atoms/ui-avl-state-machine.orb)"
13228
13298
  }
13229
13299
 
13300
+ ;; From @almadar/std (behaviors/registry/ui/avl/atoms/ui-avl-transition-explainer.orb)
13301
+ app ui-avl-transition-explainer {
13302
+ alias : UiAvlTransitionExplainer
13303
+ version : "1.0.0"
13304
+ orbitals : (AvlTransitionExplainerOrbital)
13305
+ override-surface : (config)
13306
+ ;; via uses Alias from "std/behaviors/ui-avl-transition-explainer" { config { ... } }
13307
+ source : "@almadar/std (behaviors/registry/ui/avl/atoms/ui-avl-transition-explainer.orb)"
13308
+ }
13309
+
13230
13310
  ;; From @almadar/std (behaviors/registry/ui/core/atoms/ui-badge.orb)
13231
13311
  app ui-badge {
13232
13312
  alias : UiBadge
@@ -14187,6 +14267,39 @@ orbital std-agent-planner.orbitals.AgentPlannerOrbital {
14187
14267
  source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-planner.orb orbitals[0])"
14188
14268
  }
14189
14269
 
14270
+ ;; From @almadar/std (behaviors/registry/agent/atoms/std-agent-proposal.orb orbitals[0])
14271
+ orbital std-agent-proposal.orbitals.AgentProposalOrbital {
14272
+ alias : AgentProposal
14273
+ entity : AgentProposalRun
14274
+ traits : (AgentProposalWorkflow AgentProposalLoop = Loop.traits.AgentToolLoop)
14275
+ pages : ("/agent-proposal")
14276
+ config {
14277
+ approveLabel : string = "Approve" @label "Approve button" @tier "presentation"
14278
+ cancelLabel : string = "Cancel" @label "Cancel button" @tier "presentation"
14279
+ discardLabel : string = "Discard" @label "Discard button" @tier "presentation"
14280
+ feedbackLabel : string = "What should change?" @label "Revision feedback label" @tier "presentation"
14281
+ icon : string = "sparkles" @label "Panel icon" @tier "presentation"
14282
+ inputLabel : string = "What should the agent work from?" @label "Start form label" @tier "presentation"
14283
+ instructions : string = "You turn what the person hands over into one structured proposal. Look things up with the tools if you need to, then call the proposal tool exactly once with a short summary and the list of items. Do not call it again unless asked to revise." @label "How should the agent behave?" @description "Standing instructions sent with every run." @synonyms "system prompt, persona, guidance" @tier "domain"
14284
+ itemFields : [ProposalField] = [] @label "Which item values are shown?" @description "The item keys to show, each `{ name, label, variant }`." @synonyms "columns, fields, attributes" @tier "domain"
14285
+ itemPattern : pattern = "data-list" @label "How are the proposed items drawn?" @description "The pattern the review renders the items with; it receives `entity` (the items) and `fields`." @synonyms "item layout, list pattern, table" @tier "presentation"
14286
+ itemsHeading : string = "Items" @label "Items heading" @tier "presentation"
14287
+ maxSteps : number = 8 @label "Model round-trips per run" @tier "policy"
14288
+ panelSlot : slot = "main" @label "Where the panel renders" @description "`main` for the content of a page or launcher; `modal` or `drawer` for an overlay." @tier "presentation"
14289
+ prompt : string = "Work out a proposal from the following." @label "What is the agent asked to do?" @description "The request that precedes the person's input in every run." @synonyms "task, goal, brief, question" @tier "domain"
14290
+ retryLabel : string = "Retry" @label "Retry button" @tier "presentation"
14291
+ reviseLabel : string = "Revise" @label "Revise button" @tier "presentation"
14292
+ showInputForm : boolean = true @label "Show a start form?" @description "On, the idle panel lets the person type what the agent works from. Off, the panel renders nothing until the app starts it with PROPOSAL_REQUESTED." @synonyms "start form, input box, manual start" @tier "presentation"
14293
+ startLabel : string = "Propose" @label "Start button" @tier "presentation"
14294
+ summaryHeading : string = "Summary" @label "Summary heading" @tier "presentation"
14295
+ title : string = "Proposal" @label "Panel heading" @tier "presentation"
14296
+ tools : [AgentTool] = [{"event":"AgentProposalWorkflow.PROPOSE"}] @label "What may the agent do?" @description "The declared inputs it may fire and the entities it may read, as the signed-in person. An importing app restates the list with PROPOSE addressed by its local orbital name, which the agent can never propose without." @synonyms "allowlist, abilities, permissions" @tier "domain"
14297
+ workingLabel : string = "Working out a proposal…" @label "While the agent works" @tier "presentation"
14298
+ }
14299
+ override-surface : (entity fields extend pages omit only config events roles entities mounts)
14300
+ source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-proposal.orb orbitals[0])"
14301
+ }
14302
+
14190
14303
  ;; From @almadar/std (behaviors/registry/agent/atoms/std-agent-session.orb orbitals[1])
14191
14304
  orbital std-agent-session.orbitals.AgentChatsOrbital {
14192
14305
  alias : AgentSession
@@ -14207,6 +14320,48 @@ orbital std-agent-session.orbitals.AgentSessionOrbital {
14207
14320
  source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-session.orb orbitals[0])"
14208
14321
  }
14209
14322
 
14323
+ ;; From @almadar/std (behaviors/registry/agent/atoms/std-agent-suggestions.orb orbitals[1])
14324
+ orbital std-agent-suggestions.orbitals.AgentSuggestionRecordsOrbital {
14325
+ alias : AgentSuggestions
14326
+ entity : AgentSuggestion
14327
+ traits : (AgentSuggestionHistory)
14328
+ pages : ("/agent-suggestions/history")
14329
+ override-surface : (entity fields extend pages omit only config events roles entities mounts)
14330
+ source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-suggestions.orb orbitals[1])"
14331
+ }
14332
+
14333
+ ;; From @almadar/std (behaviors/registry/agent/atoms/std-agent-suggestions.orb orbitals[0])
14334
+ orbital std-agent-suggestions.orbitals.AgentSuggestionsOrbital {
14335
+ alias : AgentSuggestions
14336
+ entity : AgentSuggestionsHost
14337
+ traits : (AgentSuggestionProposer AgentSuggestionInbox AgentSuggestionTrigger AgentSuggestionRunner AgentSuggestionLoop = Loop.traits.AgentToolLoop)
14338
+ pages : ("/agent-suggestions")
14339
+ config {
14340
+ acceptLabel : string = "Accept" @label "Accept button" @tier "presentation"
14341
+ actions : [string] = [] @label "Which actions may a suggestion carry?" @description "When listed, a proposal carrying any other action, or none, is refused (SUGGESTION_REJECTED). Empty accepts any action." @tier "domain"
14342
+ analyzeLabel : string = "Look for suggestions" @label "Look-again button" @description "Shown in the empty inbox; asks the agent to look again." @tier "presentation"
14343
+ closeLabel : string = "Close" @label "Close button" @tier "presentation"
14344
+ cooldownMinutes : number = 60 @label "Minutes between proactive runs" @description "A trigger starts a run only when this long has passed since the person's last run. 0 runs on every trigger." @tier "policy"
14345
+ dismissLabel : string = "Dismiss" @label "Dismiss button" @tier "presentation"
14346
+ emptyDescription : string = "" @label "Empty inbox hint" @tier "presentation"
14347
+ emptyTitle : string = "No suggestions right now" @label "Empty inbox title" @tier "presentation"
14348
+ historyHref : string = "/agent-suggestions/history" @label "Where past suggestions are listed" @description "The page the inbox links to for accepted and dismissed suggestions; empty hides the link. The history page of an app that imports this orbital is its own page over its retargeted entity." @tier "presentation"
14349
+ historyLabel : string = "Past suggestions" @label "Past-suggestions link" @tier "presentation"
14350
+ icon : string = "lightbulb" @label "Inbox icon" @tier "presentation"
14351
+ instructions : string = "You propose next steps to the signed-in person. Look things up with the tools, then call the proposal tool once for each suggestion worth making, with the reason in its body. When a proposal is refused as a duplicate or the pending limit is reached, do not propose again. Propose nothing when nothing is worth suggesting." @label "How should the agent behave?" @description "Standing instructions sent with every proactive run." @tier "domain"
14352
+ kinds : [string] = [] @label "Which kinds may be proposed?" @description "When listed, a proposal of any other kind is refused (SUGGESTION_REJECTED). Empty accepts any kind." @tier "domain"
14353
+ maxPending : number = 5 @label "How many suggestions may wait at once?" @description "A proposal is refused (SUGGESTION_LIMIT_REACHED) while this many are pending. 0 refuses every proposal." @tier "policy"
14354
+ maxSteps : number = 8 @label "Model round-trips per run" @tier "policy"
14355
+ panelSlot : slot = "main" @label "Where the inbox renders" @description "`main` for the content of a launcher or page; `modal` or `drawer` for an overlay opened with OPEN (a notification bell)." @tier "presentation"
14356
+ prompt : string = "Look at what I have been doing and propose what I could do next, one suggestion at a time." @label "What does the agent look into?" @description "The request each proactive run answers." @tier "domain"
14357
+ startOpen : boolean = true @label "Show the inbox as soon as it mounts?" @description "Off for an overlay that waits for OPEN." @tier "presentation"
14358
+ title : string = "Suggestions" @label "Inbox heading" @tier "presentation"
14359
+ tools : [AgentTool] = [{"event":"AgentSuggestionProposer.PROPOSE_SUGGESTION"}] @label "What may the agent do?" @description "The declared inputs it may fire and the entities it may read, as the signed-in person. An importing app restates the list with the proposal input addressed by its local orbital name (`{ event: Suggestions.AgentSuggestionProposer.PROPOSE_SUGGESTION }`), which the agent can never propose without." @tier "domain"
14360
+ }
14361
+ override-surface : (entity fields extend pages omit only config events roles entities mounts)
14362
+ source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-suggestions.orb orbitals[0])"
14363
+ }
14364
+
14210
14365
  ;; From @almadar/std (behaviors/registry/agent/atoms/std-agent-tool-call.orb orbitals[0])
14211
14366
  orbital std-agent-tool-call.orbitals.AgentToolCallOrbital {
14212
14367
  alias : AgentToolCall
@@ -14567,6 +14722,16 @@ orbital std-detail-layout.orbitals.DetailLayoutOrbital {
14567
14722
  source : "@almadar/std (behaviors/registry/ui/core/atoms/std-detail-layout.orb orbitals[0])"
14568
14723
  }
14569
14724
 
14725
+ ;; From @almadar/std (behaviors/registry/ui/core/atoms/std-doc-page.orb orbitals[0])
14726
+ orbital std-doc-page.orbitals.DocPageOrbital {
14727
+ alias : DocPage
14728
+ entity : DocPageView
14729
+ traits : (DocPageRender)
14730
+ pages : ("/doc")
14731
+ override-surface : (entity fields extend pages omit only config events roles entities mounts)
14732
+ source : "@almadar/std (behaviors/registry/ui/core/atoms/std-doc-page.orb orbitals[0])"
14733
+ }
14734
+
14570
14735
  ;; From @almadar/std (behaviors/registry/ui/game/atoms/std-dungeon-combat.orb orbitals[0])
14571
14736
  orbital std-dungeon-combat.orbitals.DungeonCombatOrbital {
14572
14737
  alias : DungeonCombat
@@ -15397,6 +15562,46 @@ orbital std-pad-lock.orbitals.PadLockOrbital {
15397
15562
  source : "@almadar/std (behaviors/registry/ui/game/atoms/std-pad-lock.orb orbitals[0])"
15398
15563
  }
15399
15564
 
15565
+ ;; From @almadar/std (behaviors/registry/infra/atoms/std-page-open.orb orbitals[0])
15566
+ orbital std-page-open.orbitals.PageOpenOrbital {
15567
+ alias : PageOpen
15568
+ entity : PageOpenRecord
15569
+ traits : (PageOpen)
15570
+ pages : ("/page-open")
15571
+ override-surface : (entity fields extend pages omit only config events roles entities mounts)
15572
+ source : "@almadar/std (behaviors/registry/infra/atoms/std-page-open.orb orbitals[0])"
15573
+ }
15574
+
15575
+ ;; From @almadar/std (behaviors/registry/infra/atoms/std-page-search.orb orbitals[0])
15576
+ orbital std-page-search.orbitals.PageSearchOrbital {
15577
+ alias : PageSearch
15578
+ entity : PageSearchRecord
15579
+ traits : (PageSearch)
15580
+ pages : ("/page-search")
15581
+ override-surface : (entity fields extend pages omit only config events roles entities mounts)
15582
+ source : "@almadar/std (behaviors/registry/infra/atoms/std-page-search.orb orbitals[0])"
15583
+ }
15584
+
15585
+ ;; From @almadar/std (behaviors/registry/infra/atoms/std-page-treat.orb orbitals[0])
15586
+ orbital std-page-treat.orbitals.PageTreatOrbital {
15587
+ alias : PageTreat
15588
+ entity : PageTreatRecord
15589
+ traits : (PageTreat)
15590
+ pages : ("/page-treat")
15591
+ override-surface : (entity fields extend pages omit only config events roles entities mounts)
15592
+ source : "@almadar/std (behaviors/registry/infra/atoms/std-page-treat.orb orbitals[0])"
15593
+ }
15594
+
15595
+ ;; From @almadar/std (behaviors/registry/infra/atoms/std-page-watch.orb orbitals[0])
15596
+ orbital std-page-watch.orbitals.PageWatchOrbital {
15597
+ alias : PageWatch
15598
+ entity : PageWatchRecord
15599
+ traits : (PageWatch)
15600
+ pages : ("/page-watch")
15601
+ override-surface : (entity fields extend pages omit only config events roles entities mounts)
15602
+ source : "@almadar/std (behaviors/registry/infra/atoms/std-page-watch.orb orbitals[0])"
15603
+ }
15604
+
15400
15605
  ;; From @almadar/std (behaviors/registry/ui/core/atoms/std-pagination.orb orbitals[0])
15401
15606
  orbital std-pagination.orbitals.PagedItemOrbital {
15402
15607
  alias : Pagination
@@ -16037,6 +16242,16 @@ orbital ui-avl-state-machine.orbitals.AvlStateMachineOrbital {
16037
16242
  source : "@almadar/std (behaviors/registry/ui/avl/atoms/ui-avl-state-machine.orb orbitals[0])"
16038
16243
  }
16039
16244
 
16245
+ ;; From @almadar/std (behaviors/registry/ui/avl/atoms/ui-avl-transition-explainer.orb orbitals[0])
16246
+ orbital ui-avl-transition-explainer.orbitals.AvlTransitionExplainerOrbital {
16247
+ alias : UiAvlTransitionExplainer
16248
+ entity : AvlTransitionExplainerItem
16249
+ traits : (AvlTransitionExplainerRender)
16250
+ pages : ("/avl-transition-explainer")
16251
+ override-surface : (entity fields extend pages omit only config events roles entities mounts)
16252
+ source : "@almadar/std (behaviors/registry/ui/avl/atoms/ui-avl-transition-explainer.orb orbitals[0])"
16253
+ }
16254
+
16040
16255
  ;; From @almadar/std (behaviors/registry/ui/core/atoms/ui-badge.orb orbitals[0])
16041
16256
  orbital ui-badge.orbitals.BadgeOrbital {
16042
16257
  alias : UiBadge
@@ -16962,7 +17177,7 @@ entity std-agent-context.entity {
16962
17177
  alias : AgentContext
16963
17178
  name : AgentContextWindow
16964
17179
  persistence : runtime
16965
- fields : (id! pendingMessages lastSize)
17180
+ fields : (id! pendingMessages lastSize pendingInstructions pendingTools pendingEphemeral)
16966
17181
  override-surface : (extends name fields persistence collection)
16967
17182
  source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-context.orb orbitals[0].entity)"
16968
17183
  }
@@ -16998,6 +17213,16 @@ entity std-agent-planner.entity {
16998
17213
  source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-planner.orb orbitals[0].entity)"
16999
17214
  }
17000
17215
 
17216
+ ;; From @almadar/std (behaviors/registry/agent/atoms/std-agent-proposal.orb orbitals[0].entity)
17217
+ entity std-agent-proposal.entity {
17218
+ alias : AgentProposal
17219
+ name : AgentProposalRun
17220
+ persistence : runtime
17221
+ fields : (id! input context request feedback summary items error)
17222
+ override-surface : (extends name fields persistence collection)
17223
+ source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-proposal.orb orbitals[0].entity)"
17224
+ }
17225
+
17001
17226
  ;; From @almadar/std (behaviors/registry/agent/atoms/std-agent-session.orb orbitals[1].entity)
17002
17227
  entity std-agent-session.entity {
17003
17228
  alias : AgentSession
@@ -17020,6 +17245,27 @@ entity std-agent-session.entity {
17020
17245
  source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-session.orb orbitals[0].entity)"
17021
17246
  }
17022
17247
 
17248
+ ;; From @almadar/std (behaviors/registry/agent/atoms/std-agent-suggestions.orb orbitals[1].entity)
17249
+ entity std-agent-suggestions.entity {
17250
+ alias : AgentSuggestions
17251
+ name : AgentSuggestion
17252
+ persistence : persistent
17253
+ collection : agentSuggestions
17254
+ fields : (id! ownerId! kind title body action href payload subject signature status createdAt resolvedAt pendingProposal)
17255
+ override-surface : (extends name fields persistence collection)
17256
+ source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-suggestions.orb orbitals[1].entity)"
17257
+ }
17258
+
17259
+ ;; From @almadar/std (behaviors/registry/agent/atoms/std-agent-suggestions.orb orbitals[0].entity)
17260
+ entity std-agent-suggestions.entity {
17261
+ alias : AgentSuggestions
17262
+ name : AgentSuggestionsHost
17263
+ persistence : runtime
17264
+ fields : (id!)
17265
+ override-surface : (extends name fields persistence collection)
17266
+ source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-suggestions.orb orbitals[0].entity)"
17267
+ }
17268
+
17023
17269
  ;; From @almadar/std (behaviors/registry/agent/atoms/std-agent-tool-call.orb orbitals[0].entity)
17024
17270
  entity std-agent-tool-call.entity {
17025
17271
  alias : AgentToolCall
@@ -17035,7 +17281,7 @@ entity std-agent-tool-loop.entity {
17035
17281
  alias : AgentToolLoop
17036
17282
  name : AgentTurn
17037
17283
  persistence : runtime
17038
- fields : (id! status reply error)
17284
+ fields : (id! status reply error ephemeral)
17039
17285
  override-surface : (extends name fields persistence collection)
17040
17286
  source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-tool-loop.orb orbitals[0].entity)"
17041
17287
  }
@@ -17390,6 +17636,16 @@ entity std-detail-layout.entity {
17390
17636
  source : "@almadar/std (behaviors/registry/ui/core/atoms/std-detail-layout.orb orbitals[0].entity)"
17391
17637
  }
17392
17638
 
17639
+ ;; From @almadar/std (behaviors/registry/ui/core/atoms/std-doc-page.orb orbitals[0].entity)
17640
+ entity std-doc-page.entity {
17641
+ alias : DocPage
17642
+ name : DocPageView
17643
+ persistence : runtime
17644
+ fields : (id!)
17645
+ override-surface : (extends name fields persistence collection)
17646
+ source : "@almadar/std (behaviors/registry/ui/core/atoms/std-doc-page.orb orbitals[0].entity)"
17647
+ }
17648
+
17393
17649
  ;; From @almadar/std (behaviors/registry/ui/game/atoms/std-dungeon-combat.orb orbitals[0].entity)
17394
17650
  entity std-dungeon-combat.entity {
17395
17651
  alias : DungeonCombat
@@ -17680,7 +17936,7 @@ entity std-learn-arrangement.entity {
17680
17936
  alias : LearnArrangement
17681
17937
  name : LearnArrangementScene
17682
17938
  persistence : runtime
17683
- fields : (id! active title totalItems placedIds checked correctCount verdict slotShapes)
17939
+ fields : (id! active items title totalItems placedIds checked correctCount verdict slotShapes)
17684
17940
  override-surface : (extends name fields persistence collection)
17685
17941
  source : "@almadar/std (behaviors/registry/ui/learning/atoms/std-learn-arrangement.orb orbitals[0].entity)"
17686
17942
  }
@@ -17690,7 +17946,7 @@ entity std-learn-classify.entity {
17690
17946
  alias : LearnClassify
17691
17947
  name : LearnClassifyScene
17692
17948
  persistence : runtime
17693
- fields : (id! active title itemIndex itemText itemHint itemExplanation correctCategory selectedCategory feedback verdict correctCount attemptedCount totalItems roundComplete running elapsedMs score categoryStats backdropShapes roundView)
17949
+ fields : (id! active items categories title itemIndex itemText itemHint itemExplanation correctCategory selectedCategory feedback verdict correctCount attemptedCount totalItems roundComplete running elapsedMs score categoryStats backdropShapes roundView)
17694
17950
  override-surface : (extends name fields persistence collection)
17695
17951
  source : "@almadar/std (behaviors/registry/ui/learning/atoms/std-learn-classify.orb orbitals[0].entity)"
17696
17952
  }
@@ -17710,7 +17966,7 @@ entity std-learn-coupled-sim.entity {
17710
17966
  alias : LearnCoupledSim
17711
17967
  name : CoupledSimScene
17712
17968
  persistence : runtime
17713
- fields : (id! active title t p q coefA coefB running speed pSamples qSamples curves)
17969
+ fields : (id! active title taskText kind pLabel qLabel pStart qStart coefALabel coefBLabel t p q coefA coefB running speed pSamples qSamples curves)
17714
17970
  override-surface : (extends name fields persistence collection)
17715
17971
  source : "@almadar/std (behaviors/registry/ui/learning/atoms/std-learn-coupled-sim.orb orbitals[0].entity)"
17716
17972
  }
@@ -17720,7 +17976,7 @@ entity std-learn-derivation.entity {
17720
17976
  alias : LearnDerivation
17721
17977
  name : LearnDerivationScene
17722
17978
  persistence : runtime
17723
- fields : (id! active title lines feedback goalReached running elapsedMs narration renderChildren)
17979
+ fields : (id! active premises candidates title lines feedback goalReached running elapsedMs narration renderChildren)
17724
17980
  override-surface : (extends name fields persistence collection)
17725
17981
  source : "@almadar/std (behaviors/registry/ui/learning/atoms/std-learn-derivation.orb orbitals[0].entity)"
17726
17982
  }
@@ -17740,7 +17996,7 @@ entity std-learn-doser.entity {
17740
17996
  alias : LearnDoser
17741
17997
  name : DoserScene
17742
17998
  persistence : runtime
17743
- fields : (id! active title done running elapsedMs dose bandLabel bandColor narration containers readouts doseSeries)
17999
+ fields : (id! active title done running elapsedMs dose bandLabel bandColor narration containers readouts doseSeries bands)
17744
18000
  override-surface : (extends name fields persistence collection)
17745
18001
  source : "@almadar/std (behaviors/registry/ui/learning/atoms/std-learn-doser.orb orbitals[0].entity)"
17746
18002
  }
@@ -17750,7 +18006,7 @@ entity std-learn-estimate.entity {
17750
18006
  alias : LearnEstimate
17751
18007
  name : EstimateScene
17752
18008
  persistence : runtime
17753
- fields : (id! active title promptIndex totalPrompts estimate locked band score done promptText promptHint answer unit feedback view)
18009
+ fields : (id! active title prompts promptIndex totalPrompts estimate locked band score done promptText promptHint answer unit feedback view)
17754
18010
  override-surface : (extends name fields persistence collection)
17755
18011
  source : "@almadar/std (behaviors/registry/ui/learning/atoms/std-learn-estimate.orb orbitals[0].entity)"
17756
18012
  }
@@ -17770,7 +18026,7 @@ entity std-learn-goal-seek.entity {
17770
18026
  alias : LearnGoalSeek
17771
18027
  name : GoalSeekScene
17772
18028
  persistence : runtime
17773
- fields : (id! active title curveKind paramA paramB paramALabel paramBLabel targetSamples curves distance attempts solved feedback resultRow yMin yMax)
18029
+ fields : (id! active title curveKind goalText targetA targetB paramA paramB paramALabel paramBLabel targetSamples curves distance attempts solved feedback resultRow yMin yMax)
17774
18030
  override-surface : (extends name fields persistence collection)
17775
18031
  source : "@almadar/std (behaviors/registry/ui/learning/atoms/std-learn-goal-seek.orb orbitals[0].entity)"
17776
18032
  }
@@ -17780,7 +18036,7 @@ entity std-learn-grid-sim.entity {
17780
18036
  alias : LearnGridSim
17781
18037
  name : GridSimScene
17782
18038
  persistence : runtime
17783
- fields : (id! active title cells generation aliveCount running speed elapsedMs cellShapes)
18039
+ fields : (id! active title taskText rule rows cols seeds cells generation aliveCount running speed elapsedMs cellShapes)
17784
18040
  override-surface : (extends name fields persistence collection)
17785
18041
  source : "@almadar/std (behaviors/registry/ui/learning/atoms/std-learn-grid-sim.orb orbitals[0].entity)"
17786
18042
  }
@@ -17790,7 +18046,7 @@ entity std-learn-hotspot.entity {
17790
18046
  alias : LearnHotspot
17791
18047
  name : HotspotScene
17792
18048
  persistence : runtime
17793
- fields : (id! active title promptIndex totalPrompts score tries found done promptText targetId explanation feedback canvasShapes view)
18049
+ fields : (id! active title shapes prompts promptIndex totalPrompts score tries found done promptText targetId explanation feedback canvasShapes view)
17794
18050
  override-surface : (extends name fields persistence collection)
17795
18051
  source : "@almadar/std (behaviors/registry/ui/learning/atoms/std-learn-hotspot.orb orbitals[0].entity)"
17796
18052
  }
@@ -17800,7 +18056,7 @@ entity std-learn-live-sim.entity {
17800
18056
  alias : LearnLiveSim
17801
18057
  name : LiveSimScene
17802
18058
  persistence : runtime
17803
- fields : (id! active title bodies running gravity damping tickCount sampleSpeed)
18059
+ fields : (id! active title bodies loadedBodies running gravity damping tickCount sampleSpeed)
17804
18060
  override-surface : (extends name fields persistence collection)
17805
18061
  source : "@almadar/std (behaviors/registry/ui/learning/atoms/std-learn-live-sim.orb orbitals[0].entity)"
17806
18062
  }
@@ -17840,7 +18096,7 @@ entity std-learn-predict.entity {
17840
18096
  alias : LearnPredict
17841
18097
  name : PredictScene
17842
18098
  persistence : runtime
17843
- fields : (id! active title scenarioIndex totalScenarios phase chosenIndex frames frameIndex frameCaption frameValue revealSamples revealCurves score done setupText question options correctIndex explanation feedback view)
18099
+ fields : (id! active title scenarios scenarioIndex totalScenarios phase chosenIndex frames frameIndex frameCaption frameValue revealSamples revealCurves score done setupText question options correctIndex explanation feedback view)
17844
18100
  override-surface : (extends name fields persistence collection)
17845
18101
  source : "@almadar/std (behaviors/registry/ui/learning/atoms/std-learn-predict.orb orbitals[0].entity)"
17846
18102
  }
@@ -17860,7 +18116,7 @@ entity std-learn-sandbox.entity {
17860
18116
  alias : LearnSandbox
17861
18117
  name : LearnSandboxScene
17862
18118
  persistence : runtime
17863
- fields : (id! active title enabledIds total holds readout nodes edges)
18119
+ fields : (id! active title elements links enabledIds total holds readout nodes edges)
17864
18120
  override-surface : (extends name fields persistence collection)
17865
18121
  source : "@almadar/std (behaviors/registry/ui/learning/atoms/std-learn-sandbox.orb orbitals[0].entity)"
17866
18122
  }
@@ -17870,7 +18126,7 @@ entity std-learn-scatter-fit.entity {
17870
18126
  alias : LearnScatterFit
17871
18127
  name : LearnScatterFitScene
17872
18128
  persistence : runtime
17873
- fields : (id! active title points slope intercept r rSquared guessSlope guessIntercept guessScore revealed running done curves narration)
18129
+ fields : (id! active title initialPoints points slope intercept r rSquared guessSlope guessIntercept guessScore revealed running done curves narration)
17874
18130
  override-surface : (extends name fields persistence collection)
17875
18131
  source : "@almadar/std (behaviors/registry/ui/learning/atoms/std-learn-scatter-fit.orb orbitals[0].entity)"
17876
18132
  }
@@ -17880,7 +18136,7 @@ entity std-learn-scenario.entity {
17880
18136
  alias : LearnScenario
17881
18137
  name : ScenarioScene
17882
18138
  persistence : runtime
17883
- fields : (id! active title currentId situation choices metricA metricB stepCount path done feedback view)
18139
+ fields : (id! active title nodes startId currentId situation choices metricA metricB stepCount path done feedback view)
17884
18140
  override-surface : (extends name fields persistence collection)
17885
18141
  source : "@almadar/std (behaviors/registry/ui/learning/atoms/std-learn-scenario.orb orbitals[0].entity)"
17886
18142
  }
@@ -17910,7 +18166,7 @@ entity std-learn-speed-drill.entity {
17910
18166
  alias : LearnSpeedDrill
17911
18167
  name : SpeedDrillScene
17912
18168
  persistence : runtime
17913
- fields : (id! active title itemIndex totalItems remaining running verdict score streak bestStreak done promptText options correctIndex feedback pickedIndex view)
18169
+ fields : (id! active title items itemIndex totalItems remaining running verdict score streak bestStreak done promptText options correctIndex feedback pickedIndex view)
17914
18170
  override-surface : (extends name fields persistence collection)
17915
18171
  source : "@almadar/std (behaviors/registry/ui/learning/atoms/std-learn-speed-drill.orb orbitals[0].entity)"
17916
18172
  }
@@ -17920,7 +18176,7 @@ entity std-learn-stepper.entity {
17920
18176
  alias : LearnStepper
17921
18177
  name : LearnStepperScene
17922
18178
  persistence : runtime
17923
- fields : (id! active title cursorIndex activeFilter narration currentStageLabel currentStageDescription categoryTally tallyItems visibleThreadNote shapes filterButtons)
18179
+ fields : (id! active title stages categories categorySummaries cursorIndex activeFilter narration currentStageLabel currentStageDescription categoryTally tallyItems visibleThreadNote shapes filterButtons)
17924
18180
  override-surface : (extends name fields persistence collection)
17925
18181
  source : "@almadar/std (behaviors/registry/ui/learning/atoms/std-learn-stepper.orb orbitals[0].entity)"
17926
18182
  }
@@ -17940,7 +18196,7 @@ entity std-learn-trace-player.entity {
17940
18196
  alias : LearnTracePlayer
17941
18197
  name : TracePlayerScene
17942
18198
  persistence : runtime
17943
- fields : (id! active title frameIndex running speed elapsedMs bars frameLabel frameCaption statusNote)
18199
+ fields : (id! active title frames frameIndex running speed elapsedMs bars frameLabel frameCaption statusNote)
17944
18200
  override-surface : (extends name fields persistence collection)
17945
18201
  source : "@almadar/std (behaviors/registry/ui/learning/atoms/std-learn-trace-player.orb orbitals[0].entity)"
17946
18202
  }
@@ -17960,7 +18216,7 @@ entity std-learn-tree.entity {
17960
18216
  alias : LearnTree
17961
18217
  name : LearnTreeScene
17962
18218
  persistence : runtime
17963
- fields : (id! active title nodes edges entries cursor pending descending trail curId curVal curRank curRankOffset depth maxDepth count traversing traversalOrder sweptIds done running narration)
18219
+ fields : (id! active title values nodes edges entries cursor pending descending trail curId curVal curRank curRankOffset depth maxDepth count traversing traversalOrder sweptIds done running narration)
17964
18220
  override-surface : (extends name fields persistence collection)
17965
18221
  source : "@almadar/std (behaviors/registry/ui/learning/atoms/std-learn-tree.orb orbitals[0].entity)"
17966
18222
  }
@@ -18232,6 +18488,46 @@ entity std-pad-lock.entity {
18232
18488
  source : "@almadar/std (behaviors/registry/ui/game/atoms/std-pad-lock.orb orbitals[0].entity)"
18233
18489
  }
18234
18490
 
18491
+ ;; From @almadar/std (behaviors/registry/infra/atoms/std-page-open.orb orbitals[0].entity)
18492
+ entity std-page-open.entity {
18493
+ alias : PageOpen
18494
+ name : PageOpenRecord
18495
+ persistence : runtime
18496
+ fields : (opened errorMessage)
18497
+ override-surface : (extends name fields persistence collection)
18498
+ source : "@almadar/std (behaviors/registry/infra/atoms/std-page-open.orb orbitals[0].entity)"
18499
+ }
18500
+
18501
+ ;; From @almadar/std (behaviors/registry/infra/atoms/std-page-search.orb orbitals[0].entity)
18502
+ entity std-page-search.entity {
18503
+ alias : PageSearch
18504
+ name : PageSearchRecord
18505
+ persistence : runtime
18506
+ fields : (query tab errorMessage status)
18507
+ override-surface : (extends name fields persistence collection)
18508
+ source : "@almadar/std (behaviors/registry/infra/atoms/std-page-search.orb orbitals[0].entity)"
18509
+ }
18510
+
18511
+ ;; From @almadar/std (behaviors/registry/infra/atoms/std-page-treat.orb orbitals[0].entity)
18512
+ entity std-page-treat.entity {
18513
+ alias : PageTreat
18514
+ name : PageTreatRecord
18515
+ persistence : runtime
18516
+ fields : (treated errorMessage)
18517
+ override-surface : (extends name fields persistence collection)
18518
+ source : "@almadar/std (behaviors/registry/infra/atoms/std-page-treat.orb orbitals[0].entity)"
18519
+ }
18520
+
18521
+ ;; From @almadar/std (behaviors/registry/infra/atoms/std-page-watch.orb orbitals[0].entity)
18522
+ entity std-page-watch.entity {
18523
+ alias : PageWatch
18524
+ name : PageWatchRecord
18525
+ persistence : runtime
18526
+ fields : (watchId found errorMessage status)
18527
+ override-surface : (extends name fields persistence collection)
18528
+ source : "@almadar/std (behaviors/registry/infra/atoms/std-page-watch.orb orbitals[0].entity)"
18529
+ }
18530
+
18235
18531
  ;; From @almadar/std (behaviors/registry/ui/core/atoms/std-pagination.orb orbitals[0].entity)
18236
18532
  entity std-pagination.entity {
18237
18533
  alias : Pagination
@@ -18885,6 +19181,16 @@ entity ui-avl-state-machine.entity {
18885
19181
  source : "@almadar/std (behaviors/registry/ui/avl/atoms/ui-avl-state-machine.orb orbitals[0].entity)"
18886
19182
  }
18887
19183
 
19184
+ ;; From @almadar/std (behaviors/registry/ui/avl/atoms/ui-avl-transition-explainer.orb orbitals[0].entity)
19185
+ entity ui-avl-transition-explainer.entity {
19186
+ alias : UiAvlTransitionExplainer
19187
+ name : AvlTransitionExplainerItem
19188
+ persistence : runtime
19189
+ fields : (id!)
19190
+ override-surface : (extends name fields persistence collection)
19191
+ source : "@almadar/std (behaviors/registry/ui/avl/atoms/ui-avl-transition-explainer.orb orbitals[0].entity)"
19192
+ }
19193
+
18888
19194
  ;; From @almadar/std (behaviors/registry/ui/core/atoms/ui-badge.orb orbitals[0].entity)
18889
19195
  entity ui-badge.entity {
18890
19196
  alias : UiBadge
@@ -19881,7 +20187,7 @@ trait std-agent-memory.traits.AgentMemoryRecall {
19881
20187
  category : lifecycle
19882
20188
  states : (ready* recalling remembering)
19883
20189
  events : (INIT MEMORY_STORED LIST MemoriesForList MemoryListFailed RECALL REMEMBER MemoryEmbedded MemoriesForRecall MemoryEmbedFailed AgentMemoriesLoadFailed RECALLED ASSISTANT_MEMORIES_LOADED)
19884
- transitions : ((ready -> ready on INIT) (ready -> ready on MEMORY_STORED) (ready -> ready on LIST) (ready -> ready on MemoriesForList) (ready -> ready on MemoryListFailed) (ready -> recalling on RECALL) (ready -> remembering on REMEMBER) (recalling -> recalling on MemoryEmbedded) (recalling -> ready on MemoriesForRecall) (recalling -> ready on MemoryEmbedFailed) (recalling -> ready on AgentMemoriesLoadFailed) (remembering -> ready on MemoryEmbedded) (remembering -> ready on MemoryEmbedFailed))
20190
+ transitions : ((ready -> ready on INIT) (ready -> ready on MEMORY_STORED) (ready -> ready on LIST) (ready -> ready on MemoriesForList) (ready -> ready on MemoryListFailed) (ready -> ready on RECALL) (ready -> recalling on RECALL) (ready -> ready on REMEMBER) (ready -> remembering on REMEMBER) (recalling -> recalling on MemoryEmbedded) (recalling -> ready on MemoriesForRecall) (recalling -> ready on MemoryEmbedFailed) (recalling -> ready on AgentMemoriesLoadFailed) (remembering -> ready on MemoryEmbedded) (remembering -> ready on MemoryEmbedFailed))
19885
20191
  emits : (RECALLED ASSISTANT_MEMORIES_LOADED MemoriesForList MemoryListFailed MEMORY_STORED AgentMemoriesLoadFailed MemoriesForRecall MemoryEmbedded MemoryEmbedFailed)
19886
20192
  config {
19887
20193
  recallLimit : number = 3 @label "Memories recalled per request" @description "How many of the closest memories go to the model with each request." @tier "policy"
@@ -19915,6 +20221,39 @@ trait std-agent-planner.traits.PlannerListener {
19915
20221
  source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-planner.orb orbitals[0].traits[1])"
19916
20222
  }
19917
20223
 
20224
+ ;; From @almadar/std (behaviors/registry/agent/atoms/std-agent-proposal.orb orbitals[0].traits[0])
20225
+ trait std-agent-proposal.traits.AgentProposalWorkflow {
20226
+ alias : AgentProposal
20227
+ linkedEntity : AgentProposalRun
20228
+ category : interaction
20229
+ states : (idle* working review failed)
20230
+ events : (PROPOSE INIT INPUT_CHANGED CLOSE START_TYPED PROPOSAL_REQUESTED PROPOSAL_LOOP_REPLIED PROPOSAL_LOOP_FAILED CANCEL FEEDBACK_CHANGED APPROVE REVISE DISCARD RETRY PROPOSAL_APPROVED PROPOSAL_DISCARDED PROPOSAL_CANCELLED PROPOSAL_RUN_REQUESTED)
20231
+ transitions : ((idle -> idle on PROPOSE) (idle -> idle on INIT) (idle -> idle on INIT) (idle -> idle on INPUT_CHANGED) (idle -> idle on CLOSE) (idle -> working on START_TYPED) (idle -> working on PROPOSAL_REQUESTED) (working -> review on PROPOSE) (working -> failed on PROPOSAL_LOOP_REPLIED) (working -> failed on PROPOSAL_LOOP_FAILED) (working -> idle on CANCEL) (working -> idle on CANCEL) (working -> idle on CLOSE) (review -> review on FEEDBACK_CHANGED) (review -> review on PROPOSE) (review -> idle on APPROVE) (review -> idle on APPROVE) (review -> working on REVISE) (review -> review on REVISE) (review -> idle on DISCARD) (review -> idle on DISCARD) (review -> idle on CLOSE) (failed -> working on RETRY) (failed -> idle on DISCARD) (failed -> idle on DISCARD) (failed -> idle on CLOSE))
20232
+ emits : (PROPOSAL_APPROVED PROPOSAL_DISCARDED PROPOSAL_CANCELLED PROPOSAL_RUN_REQUESTED)
20233
+ config {
20234
+ approveButton : string = "@config.approveLabel" @label "Approve button" @tier "presentation"
20235
+ cancelButton : string = "@config.cancelLabel" @label "Cancel button" @tier "presentation"
20236
+ discardButton : string = "@config.discardLabel" @label "Discard button" @tier "presentation"
20237
+ feedbackText : string = "@config.feedbackLabel" @label "Revision feedback label" @tier "presentation"
20238
+ fieldsForItems : [ProposalField] = "@config.itemFields" @label "Which item values are shown?" @tier "domain"
20239
+ framing : string = "@config.prompt" @label "What is the agent asked to do?" @description "The request that precedes the person's input." @synonyms "task, goal, brief" @tier "domain"
20240
+ heading : string = "@config.title" @label "Panel heading" @tier "presentation"
20241
+ headingIcon : string = "@config.icon" @label "Panel icon" @tier "presentation"
20242
+ inputText : string = "@config.inputLabel" @label "Start form label" @tier "presentation"
20243
+ itemsTitle : string = "@config.itemsHeading" @label "Items heading" @tier "presentation"
20244
+ patternForItems : pattern = "@config.itemPattern" @label "How are the proposed items drawn?" @tier "presentation"
20245
+ retryButton : string = "@config.retryLabel" @label "Retry button" @tier "presentation"
20246
+ reviseButton : string = "@config.reviseLabel" @label "Revise button" @tier "presentation"
20247
+ slot : slot = "@config.panelSlot" @label "Where the panel renders" @tier "internal"
20248
+ startButton : string = "@config.startLabel" @label "Start button" @tier "presentation"
20249
+ summaryTitle : string = "@config.summaryHeading" @label "Summary heading" @tier "presentation"
20250
+ withInputForm : boolean = "@config.showInputForm" @label "Show a start form?" @tier "presentation"
20251
+ workingText : string = "@config.workingLabel" @label "While the agent works" @tier "presentation"
20252
+ }
20253
+ override-surface : (linkedEntity name events effects listens emitsScope config)
20254
+ source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-proposal.orb orbitals[0].traits[0])"
20255
+ }
20256
+
19918
20257
  ;; From @almadar/std (behaviors/registry/agent/atoms/std-agent-session.orb orbitals[1].traits[0])
19919
20258
  trait std-agent-session.traits.AgentChatKeeper {
19920
20259
  alias : AgentSession
@@ -19951,14 +20290,15 @@ trait std-agent-session.traits.AgentConversation {
19951
20290
  linkedEntity : AgentConversationView
19952
20291
  category : interaction
19953
20292
  states : (idle*)
19954
- events : (INIT THREAD_LOADED ASK STEP REPLIED NEW_CHAT_CLICKED OPEN_CHATS_CLICKED CHATS_LISTED CHAT_PICKED OPEN_MEMORY_CLICKED MEMORIES_LISTED BACK_TO_CHAT REPLY_FAILED ASSISTANT_HISTORY_REQUESTED ASSISTANT_NEW_CHAT ASSISTANT_SEND ASSISTANT_CHATS_REQUESTED ASSISTANT_CHAT_SELECTED ASSISTANT_MEMORIES_REQUESTED)
19955
- transitions : ((idle -> idle on INIT) (idle -> idle on THREAD_LOADED) (idle -> idle on ASK) (idle -> idle on STEP) (idle -> idle on REPLIED) (idle -> idle on NEW_CHAT_CLICKED) (idle -> idle on OPEN_CHATS_CLICKED) (idle -> idle on CHATS_LISTED) (idle -> idle on CHAT_PICKED) (idle -> idle on OPEN_MEMORY_CLICKED) (idle -> idle on MEMORIES_LISTED) (idle -> idle on BACK_TO_CHAT) (idle -> idle on REPLY_FAILED))
19956
- emits : (ASSISTANT_HISTORY_REQUESTED ASSISTANT_NEW_CHAT NEW_CHAT_CLICKED ASSISTANT_SEND ASSISTANT_CHATS_REQUESTED ASSISTANT_CHAT_SELECTED ASSISTANT_MEMORIES_REQUESTED OPEN_CHATS_CLICKED OPEN_MEMORY_CLICKED CHAT_PICKED ASK)
20293
+ events : (INIT THREAD_LOADED ASK START_CHAT STEP REPLIED NEW_CHAT_CLICKED OPEN_CHATS_CLICKED CHATS_LISTED CHAT_PICKED OPEN_MEMORY_CLICKED MEMORIES_LISTED BACK_TO_CHAT REPLY_FAILED ASSISTANT_HISTORY_REQUESTED ASSISTANT_NEW_CHAT ASSISTANT_EPHEMERAL_SEND ASSISTANT_SEND ASSISTANT_CHATS_REQUESTED ASSISTANT_CHAT_SELECTED ASSISTANT_MEMORIES_REQUESTED)
20294
+ transitions : ((idle -> idle on INIT) (idle -> idle on INIT) (idle -> idle on THREAD_LOADED) (idle -> idle on ASK) (idle -> idle on ASK) (idle -> idle on START_CHAT) (idle -> idle on STEP) (idle -> idle on REPLIED) (idle -> idle on NEW_CHAT_CLICKED) (idle -> idle on OPEN_CHATS_CLICKED) (idle -> idle on CHATS_LISTED) (idle -> idle on CHAT_PICKED) (idle -> idle on OPEN_MEMORY_CLICKED) (idle -> idle on MEMORIES_LISTED) (idle -> idle on BACK_TO_CHAT) (idle -> idle on REPLY_FAILED))
20295
+ emits : (ASSISTANT_HISTORY_REQUESTED ASSISTANT_NEW_CHAT NEW_CHAT_CLICKED ASSISTANT_EPHEMERAL_SEND ASSISTANT_SEND ASSISTANT_CHATS_REQUESTED ASSISTANT_CHAT_SELECTED ASSISTANT_MEMORIES_REQUESTED OPEN_CHATS_CLICKED OPEN_MEMORY_CLICKED CHAT_PICKED ASK)
19957
20296
  config {
19958
20297
  backLabel : string = "Back" @label "Back to the conversation" @tier "presentation"
19959
20298
  chatsEmptyTitle : string = "No conversations yet" @label "Empty conversation list" @tier "presentation"
19960
20299
  chatsLabel : string = "Conversations" @label "Past conversations button" @description "Shows the person's past conversations in place of the chat; picking one reopens it." @tier "presentation"
19961
20300
  emptyTitle : string = "Ask me to do something in this app" @label "Empty conversation title" @tier "presentation"
20301
+ ephemeral : boolean = false @label "Ephemeral conversation?" @description "A self-contained conversation: it runs under the instructions, tools, greeting and header the app starts it with (ASSISTANT_CHAT_START), is never stored among the person's conversations or remembered, shows no conversation, past-chat or memory buttons, and ignores the assistant's own replies." @synonyms "private, one-off, scoped chat, own persona, not saved" @tier "domain"
19962
20302
  links : [AgentLink] = [{"href":"/agent-session/chats","label":"All conversations"}] @label "Links above the conversation" @description "Related pages (e.g. the run history)." @tier "presentation"
19963
20303
  memoryEmptyTitle : string = "Nothing remembered yet" @label "Empty memory list" @tier "presentation"
19964
20304
  memoryLabel : string = "What I remember" @label "Memory button" @description "Shows what the assistant remembers for this person in place of the chat." @tier "presentation"
@@ -19983,6 +20323,99 @@ trait std-agent-session.traits.AgentThread {
19983
20323
  source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-session.orb orbitals[0].traits[0])"
19984
20324
  }
19985
20325
 
20326
+ ;; From @almadar/std (behaviors/registry/agent/atoms/std-agent-suggestions.orb orbitals[1].traits[0])
20327
+ trait std-agent-suggestions.traits.AgentSuggestionHistory {
20328
+ alias : AgentSuggestions
20329
+ linkedEntity : AgentSuggestion
20330
+ category : interaction
20331
+ states : (browsing*)
20332
+ events : (INIT SuggestionsLoaded SuggestionsLoadFailed)
20333
+ transitions : ((browsing -> browsing on INIT) (browsing -> browsing on SuggestionsLoaded) (browsing -> browsing on SuggestionsLoadFailed))
20334
+ emits : (SuggestionsLoaded SuggestionsLoadFailed)
20335
+ config {
20336
+ emptyHeading : string = "Nothing suggested yet" @label "What shows when nothing was ever suggested?" @tier "presentation"
20337
+ }
20338
+ override-surface : (linkedEntity name events effects listens emitsScope config)
20339
+ source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-suggestions.orb orbitals[1].traits[0])"
20340
+ }
20341
+
20342
+ ;; From @almadar/std (behaviors/registry/agent/atoms/std-agent-suggestions.orb orbitals[0].traits[1])
20343
+ trait std-agent-suggestions.traits.AgentSuggestionInbox {
20344
+ alias : AgentSuggestions
20345
+ linkedEntity : AgentSuggestion
20346
+ category : interaction
20347
+ states : (closed* open)
20348
+ events : (INIT OPEN SuggestionsLoaded SuggestionsLoadFailed SuggestionResolveFailed REFRESH ANALYZE ACCEPT SuggestionForAccept SuggestionAccepted DISMISS SuggestionForDismiss SuggestionDismissed CLOSE SUGGESTION_ACCEPTED SUGGESTION_DISMISSED SUGGESTIONS_ANALYZE_REQUESTED)
20349
+ transitions : ((closed -> open on INIT) (closed -> closed on INIT) (closed -> open on OPEN) (open -> open on SuggestionsLoaded) (open -> open on SuggestionsLoadFailed) (open -> open on SuggestionResolveFailed) (open -> open on REFRESH) (open -> open on OPEN) (open -> open on ANALYZE) (open -> open on ACCEPT) (open -> open on SuggestionForAccept) (open -> open on SuggestionAccepted) (open -> open on SuggestionAccepted) (open -> open on DISMISS) (open -> open on SuggestionForDismiss) (open -> open on SuggestionDismissed) (open -> closed on CLOSE))
20350
+ emits : (SUGGESTION_ACCEPTED SUGGESTION_DISMISSED SUGGESTIONS_ANALYZE_REQUESTED SuggestionsLoaded SuggestionsLoadFailed SuggestionResolveFailed SuggestionForAccept SuggestionForDismiss SuggestionAccepted SuggestionDismissed)
20351
+ config {
20352
+ approveLabel : string = "@config.acceptLabel" @label "Accept button label" @synonyms "approve, yes, do it" @tier "presentation"
20353
+ closeButtonLabel : string = "@config.closeLabel" @label "Close button label" @synonyms "back, hide" @tier "presentation"
20354
+ declineLabel : string = "@config.dismissLabel" @label "Dismiss button label" @synonyms "reject, no thanks, hide" @tier "presentation"
20355
+ emptyHeading : string = "@config.emptyTitle" @label "What shows when nothing is pending?" @synonyms "empty state, no suggestions" @tier "presentation"
20356
+ emptyHint : string = "@config.emptyDescription" @label "Hint under the empty heading" @tier "presentation"
20357
+ heading : string = "@config.title" @label "Inbox heading" @description "Heading at the top of the inbox." @synonyms "panel title, suggestions title" @tier "presentation"
20358
+ headingIcon : string = "@config.icon" @label "Inbox icon" @description "Lucide icon name shown beside the heading." @synonyms "header icon" @tier "presentation"
20359
+ historyLink : string = "@config.historyHref" @label "Past-suggestions page" @description "Where accepted and dismissed suggestions are listed; empty hides the link." @tier "presentation"
20360
+ historyLinkLabel : string = "@config.historyLabel" @label "Past-suggestions link label" @synonyms "history, archive, earlier suggestions" @tier "presentation"
20361
+ inboxSlot : slot = "@config.panelSlot" @label "Where the inbox renders" @description "`main` inline; `modal` or `drawer` for an overlay opened with OPEN." @tier "internal"
20362
+ lookAgainLabel : string = "@config.analyzeLabel" @label "Look-again button label" @description "The empty inbox's button, which asks the agent to look again." @synonyms "refresh, find suggestions, analyze" @tier "presentation"
20363
+ showOnMount : boolean = "@config.startOpen" @label "Show the inbox as soon as it mounts?" @description "Off for an overlay that waits for OPEN." @tier "presentation"
20364
+ }
20365
+ override-surface : (linkedEntity name events effects listens emitsScope config)
20366
+ source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-suggestions.orb orbitals[0].traits[1])"
20367
+ }
20368
+
20369
+ ;; From @almadar/std (behaviors/registry/agent/atoms/std-agent-suggestions.orb orbitals[0].traits[0])
20370
+ trait std-agent-suggestions.traits.AgentSuggestionProposer {
20371
+ alias : AgentSuggestions
20372
+ linkedEntity : AgentSuggestion
20373
+ category : lifecycle
20374
+ states : (ready*)
20375
+ events : (INIT PROPOSE_SUGGESTION SuggestionsForPropose SuggestionCheckFailed SuggestionSaveFailed SUGGESTION_ADDED SUGGESTION_DUPLICATE SUGGESTION_LIMIT_REACHED SUGGESTION_REJECTED)
20376
+ transitions : ((ready -> ready on INIT) (ready -> ready on PROPOSE_SUGGESTION) (ready -> ready on PROPOSE_SUGGESTION) (ready -> ready on PROPOSE_SUGGESTION) (ready -> ready on SuggestionsForPropose) (ready -> ready on SuggestionsForPropose) (ready -> ready on SuggestionsForPropose) (ready -> ready on SuggestionCheckFailed) (ready -> ready on SuggestionSaveFailed))
20377
+ emits : (SUGGESTION_ADDED SUGGESTION_DUPLICATE SUGGESTION_LIMIT_REACHED SUGGESTION_REJECTED SuggestionsForPropose SuggestionCheckFailed SuggestionSaveFailed)
20378
+ config {
20379
+ allowedActions : [string] = "@config.actions" @label "Which actions may a suggestion carry?" @description "When listed, any other action is refused. Empty accepts any." @synonyms "allowed actions, commands, events" @tier "domain"
20380
+ allowedKinds : [string] = "@config.kinds" @label "Which kinds may be proposed?" @description "When listed, any other kind is refused. Empty accepts any." @synonyms "types, categories, allowed kinds" @tier "domain"
20381
+ pendingLimit : number = "@config.maxPending" @label "How many suggestions may wait at once?" @description "A proposal is refused (SUGGESTION_LIMIT_REACHED) while this many are pending." @synonyms "limit, cap, queue size" @tier "policy"
20382
+ }
20383
+ override-surface : (linkedEntity name events effects listens emitsScope config)
20384
+ source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-suggestions.orb orbitals[0].traits[0])"
20385
+ }
20386
+
20387
+ ;; From @almadar/std (behaviors/registry/agent/atoms/std-agent-suggestions.orb orbitals[0].traits[3])
20388
+ trait std-agent-suggestions.traits.AgentSuggestionRunner {
20389
+ alias : AgentSuggestions
20390
+ linkedEntity : AgentSuggestionRun
20391
+ category : lifecycle
20392
+ states : (ready* starting analyzing)
20393
+ events : (INIT START RunRecorded RunRecordFailed LOOP_REPLIED LOOP_FAILED SUGGESTION_RUN_STARTED SUGGESTION_RUN_DONE SUGGESTION_RUN_FAILED)
20394
+ transitions : ((ready -> ready on INIT) (ready -> starting on START) (starting -> analyzing on RunRecorded) (starting -> ready on RunRecordFailed) (analyzing -> ready on LOOP_REPLIED) (analyzing -> ready on LOOP_FAILED))
20395
+ emits : (SUGGESTION_RUN_STARTED SUGGESTION_RUN_DONE SUGGESTION_RUN_FAILED RunRecorded RunRecordFailed)
20396
+ config {
20397
+ request : string = "@config.prompt" @label "What does the agent look into?" @description "The request each proactive run answers." @synonyms "task, goal, question, brief" @tier "domain"
20398
+ }
20399
+ override-surface : (linkedEntity name events effects listens emitsScope config)
20400
+ source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-suggestions.orb orbitals[0].traits[3])"
20401
+ }
20402
+
20403
+ ;; From @almadar/std (behaviors/registry/agent/atoms/std-agent-suggestions.orb orbitals[0].traits[2])
20404
+ trait std-agent-suggestions.traits.AgentSuggestionTrigger {
20405
+ alias : AgentSuggestions
20406
+ linkedEntity : AgentSuggestionRun
20407
+ category : lifecycle
20408
+ states : (ready*)
20409
+ events : (INIT TRIGGERED RunsForTrigger RunsLoadFailed SUGGESTION_RUN_ALLOWED)
20410
+ transitions : ((ready -> ready on INIT) (ready -> ready on TRIGGERED) (ready -> ready on RunsForTrigger) (ready -> ready on RunsForTrigger) (ready -> ready on RunsLoadFailed))
20411
+ emits : (SUGGESTION_RUN_ALLOWED RunsForTrigger RunsLoadFailed)
20412
+ config {
20413
+ gapMinutes : number = "@config.cooldownMinutes" @label "Minutes between proactive runs" @description "A trigger starts a run only when this long has passed since the person's last run." @synonyms "throttle, rate limit, interval, frequency" @tier "policy"
20414
+ }
20415
+ override-surface : (linkedEntity name events effects listens emitsScope config)
20416
+ source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-suggestions.orb orbitals[0].traits[2])"
20417
+ }
20418
+
19986
20419
  ;; From @almadar/std (behaviors/registry/agent/atoms/std-agent-tool-call.orb orbitals[0].traits[0])
19987
20420
  trait std-agent-tool-call.traits.ToolCallExecution {
19988
20421
  alias : AgentToolCall
@@ -20014,12 +20447,14 @@ trait std-agent-tool-loop.traits.AgentToolLoop {
20014
20447
  linkedEntity : AgentTurn
20015
20448
  category : interaction
20016
20449
  states : (idle* thinking)
20017
- events : (INIT CONVERSE ANSWERED ASK_FAILED ASSISTANT_STEP ASSISTANT_REPLIED ASSISTANT_REPLY_FAILED)
20018
- transitions : ((idle -> idle on INIT) (idle -> thinking on CONVERSE) (thinking -> idle on ANSWERED) (thinking -> idle on ASK_FAILED))
20450
+ events : (INIT CONVERSE CANCEL ANSWERED ASK_FAILED ASSISTANT_STEP ASSISTANT_REPLIED ASSISTANT_REPLY_FAILED)
20451
+ transitions : ((idle -> idle on INIT) (idle -> thinking on CONVERSE) (idle -> thinking on CONVERSE) (idle -> thinking on CONVERSE) (thinking -> idle on CANCEL) (thinking -> idle on ANSWERED) (thinking -> idle on ASK_FAILED) (thinking -> idle on ASK_FAILED))
20019
20452
  emits : (ASSISTANT_STEP ASSISTANT_REPLIED ASSISTANT_REPLY_FAILED ANSWERED ASK_FAILED)
20020
20453
  config {
20454
+ cancelKey : string = "agent-tool-loop" @label "Cancel key" @description "The key this instance's model call runs under, so CANCEL aborts it. Give each instance of the loop in one app its own." @synonyms "call key, abort key" @tier "internal"
20021
20455
  instructions : string = "You operate this app for the signed-in user. Use the tools to act and to look things up; when a tool reports that something was refused or denied, say so plainly." @label "How should the assistant behave?" @description "Standing instructions sent with every conversation." @synonyms "system prompt, persona, guidance" @tier "domain"
20022
20456
  maxSteps : number = 8 @label "Model round-trips per request" @description "How many model calls one request may take before it fails." @tier "policy"
20457
+ quiet : boolean = false @label "Run in the background?" @description "No live ASSISTANT_STEP stream and no failure toast: the request is reported only through ASSISTANT_REPLIED and ASSISTANT_REPLY_FAILED. For a run nobody is watching, such as one the app starts on its own." @synonyms "silent, background, no toast, suppress errors, headless run" @tier "policy"
20023
20458
  tools : [AgentTool] = [] @label "What may the assistant do?" @description "The declared inputs it may fire (`{ event: Trait.EVENT }`) and the entities it may read (`{ read: Entity }`), as the signed-in user." @synonyms "allowlist, abilities, actions, permissions" @tier "domain"
20024
20459
  }
20025
20460
  override-surface : (linkedEntity name events effects listens emitsScope config)
@@ -20084,12 +20519,15 @@ trait std-app-layout.traits.AppLayout {
20084
20519
  contentClassName : string = "max-w-5xl mx-auto w-full" @label "Content wrapper class" @description "CSS class applied to the content area wrapper." @tier "internal"
20085
20520
  contentTrait : trait @label "Content trait" @description "Trait rendered inside the app layout content area" @tier "presentation"
20086
20521
  currentPath : string = "" @label "Current path" @description "Nav-highlight ONLY: which nav item to mark active. This is NOT the page route — it does not change what page loads or where the orbital lives. To set the landing route or a page path, use the orbital's pagePath / page path, not this knob. When omitted, the layout reads the current route." @synonyms "active nav item, highlighted nav link, which menu item is selected, nav highlight" @tier "internal"
20087
- layoutMode : string = "sidebar" @label "Where should navigation be placed?" @description "sidebar = left rail; topnav = top bar; bottomnav = mobile tab bar; minimal = no nav." @synonyms "nav position, navigation style, menu placement, layout style" @tier "presentation" @values (sidebar topnav bottomnav minimal)
20522
+ layoutMode : string = "sidebar" @label "Where should navigation be placed?" @description "sidebar = left rail; topnav = top bar; bottomnav = mobile tab bar; minimal = no nav; drawer = navigation behind a menu button at every width, content full width." @synonyms "nav position, navigation style, menu placement, layout style" @tier "presentation" @values (sidebar topnav bottomnav minimal drawer)
20088
20523
  layoutPattern : pattern = "dashboard-layout" @label "Layout pattern" @description "UI pattern used to render the application chrome" @tier "internal"
20524
+ logoSrc : string = "" @label "Logo image" @description "Address of the logo shown beside the app name in the chrome header (an image URL or an inline data: SVG); empty shows the name's first letter." @synonyms "logo, brand mark, app icon, logo url" @tier "presentation"
20089
20525
  navItems : [NavItem] = "@pages" @label "Which sections appear in the sidebar?" @description "Top-level navigation links shown on the left rail." @synonyms "nav links, menu items, sidebar sections, navigation entries, pages" @tier "presentation"
20090
20526
  notificationClickEvent : event = "NOTIFY_CLICK" @label "Notification click event" @description "Event emitted when the user picks a notification" @tier "internal"
20091
20527
  notifications : [NotificationSpec] = [] @label "What notifications should appear?" @description "Items shown in the notifications dropdown." @synonyms "alerts, messages, notices, notification items, bell items" @tier "presentation"
20092
20528
  searchEvent : event = "SEARCH" @label "Search event" @description "Event emitted when the user runs a global search" @tier "internal"
20529
+ showSearch : boolean = true @label "Show the search box?" @description "The top-bar search box; turn off for apps whose pages carry their own search." @synonyms "search bar, top search, hide search" @tier "presentation"
20530
+ showThemeToggle : boolean = true @label "Show the light/dark toggle?" @description "The theme toggle in the top bar; turn off when the app offers it elsewhere, such as a settings page." @synonyms "dark mode button, theme switch, hide theme toggle" @tier "presentation"
20093
20531
  sidebarTrait : trait @label "Sidebar trait" @description "Optional trait rendered in the sidebar between the nav links and the footer — the Notion/Confluence-style always-visible page tree; scrolls independently. Unset renders plain nav only." @synonyms "sidebar tree, nav tree, page tree in sidebar, hierarchy rail" @tier "presentation"
20094
20532
  theme : string = "@currentTheme" @label "Theme" @description "Data-theme attribute applied to the layout root (e.g. almadar-website-dark)." @tier "presentation"
20095
20533
  topBarActions : [ItemAction] = [] @label "What shortcuts go in the top bar?" @description "Icon buttons shown on the right side of the top bar (e.g. cart, help, profile)." @synonyms "toolbar buttons, header actions, shortcut icons, quick actions" @tier "presentation"
@@ -20324,7 +20762,7 @@ trait std-book-reader.traits.BookReaderRead {
20324
20762
  category : interaction
20325
20763
  states : (cover* reading)
20326
20764
  events : (INIT START_READING OPEN_CHAPTER NEXT_CHAPTER PREV_CHAPTER BACK_TO_COVER CHAPTER_OPENED)
20327
- transitions : ((cover -> cover on INIT) (cover -> reading on START_READING) (cover -> reading on OPEN_CHAPTER) (reading -> reading on INIT) (reading -> reading on OPEN_CHAPTER) (reading -> reading on NEXT_CHAPTER) (reading -> reading on PREV_CHAPTER) (reading -> cover on BACK_TO_COVER))
20765
+ transitions : ((cover -> cover on INIT) (cover -> reading on INIT) (cover -> reading on START_READING) (cover -> reading on OPEN_CHAPTER) (reading -> reading on INIT) (reading -> reading on OPEN_CHAPTER) (reading -> reading on NEXT_CHAPTER) (reading -> reading on PREV_CHAPTER) (reading -> cover on BACK_TO_COVER))
20328
20766
  emits : (CHAPTER_OPENED)
20329
20767
  config {
20330
20768
  author : string = "" @label "Author" @tier "presentation"
@@ -20335,8 +20773,9 @@ trait std-book-reader.traits.BookReaderRead {
20335
20773
  coverLabel : string = "Cover" @label "Back-to-cover label" @tier "presentation"
20336
20774
  direction : string = "ltr" @label "Text direction" @description "rtl for Arabic, Hebrew and other right-to-left books" @synonyms "right to left, arabic book" @tier "presentation" @values (ltr rtl)
20337
20775
  nextLabel : string = "Next" @label "Next button label" @tier "presentation"
20776
+ opensAt : string = "cover" @label "Opens at" @description "Where the reader opens: the cover, or straight into the first chapter (an article read in place)" @tier "presentation" @values (cover reading)
20338
20777
  previousLabel : string = "Previous" @label "Previous button label" @tier "presentation"
20339
- readingContent : render-ui = {"children":[{"children":[{"children":[{"align":"start","children":[{"action":"BACK_TO_COVER","label":"@config.coverLabel","leftIcon":"book-open","type":"button","variant":"link"},{"className":"pt-2","content":"@config.contentsLabel","type":"typography","variant":"label","weight":"semibold"},{"align":"start","children":["array/map","@config.chapters",["fn","chapter",{"action":"OPEN_CHAPTER","actionPayload":{"index":"@index"},"aria-current":["if",["==","@index","@entity.chapterIndex"],"page","false"],"className":["if",["==","@index","@entity.chapterIndex"],"h-auto justify-start text-start text-foreground font-semibold","h-auto justify-start text-start"],"label":["object/get","@chapter","title",""],"type":"button","variant":"link"}]],"direction":"vertical","gap":"none","type":"stack"}],"className":"lg:sticky lg:top-6 self-start","direction":"vertical","gap":"xs","type":"stack"},{"children":[{"children":[{"color":"muted","content":"@entity.progressLabel","type":"typography","variant":"caption"},{"className":"tracking-tight","content":"@entity.chapterTitle","size":"3xl","type":"typography","variant":"h1","weight":"bold"}],"direction":"vertical","gap":"lg","role":"status","type":"stack"},{"content":"@entity.chapterContent","direction":"@config.direction","type":"markdown-content"},{"type":"divider"},{"children":[{"action":"PREV_CHAPTER","disabled":"@entity.isFirst","label":"@config.previousLabel","leftIcon":["if",["==","@config.direction","rtl"],"chevron-right","chevron-left"],"type":"button","variant":"secondary"},{"action":"NEXT_CHAPTER","disabled":"@entity.isLast","label":"@config.nextLabel","rightIcon":["if",["==","@config.direction","rtl"],"chevron-left","chevron-right"],"type":"button","variant":"primary"}],"direction":"horizontal","gap":"md","justify":"between","type":"stack"}],"direction":"vertical","gap":"lg","type":"stack"}],"gap":"xl","ratio":"1:3","type":"split"}],"maxWidth":"xl","padding":"lg","size":"xl","type":"container"}],"dir":"@config.direction","fullWidth":true,"paddingY":"xl","type":"box"} @label "Reading body" @tier "internal"
20778
+ readingContent : render-ui = {"children":[{"children":[{"children":[{"align":"start","children":[{"className":"text-balance","content":"@config.title","type":"typography","variant":"h5","weight":"semibold"},{"className":["if",["==","@config.author",""],"hidden","pb-2"],"color":"muted","content":"@config.author","type":"typography","variant":"caption"},{"action":"BACK_TO_COVER","label":"@config.coverLabel","leftIcon":"book-open","type":"button","variant":"link"},{"className":"pt-2","content":"@config.contentsLabel","type":"typography","variant":"label","weight":"semibold"},{"align":"start","children":["array/map","@config.chapters",["fn","chapter",{"action":"OPEN_CHAPTER","actionPayload":{"index":"@index"},"aria-current":["if",["==","@index","@entity.chapterIndex"],"page","false"],"className":["if",["==","@index","@entity.chapterIndex"],"h-auto justify-start text-start text-foreground font-semibold","h-auto justify-start text-start"],"label":["object/get","@chapter","title",""],"type":"button","variant":"link"}]],"direction":"vertical","gap":"none","type":"stack"}],"className":"lg:sticky lg:top-6 self-start","direction":"vertical","gap":"xs","type":"stack"},{"children":[{"children":[{"color":"muted","content":"@entity.progressLabel","type":"typography","variant":"caption"},{"className":"tracking-tight","content":"@entity.chapterTitle","size":"3xl","type":"typography","variant":"h1","weight":"bold"}],"direction":"vertical","gap":"lg","role":"status","type":"stack"},{"content":"@entity.chapterContent","direction":"@config.direction","type":"markdown-content"},{"type":"divider"},{"children":[{"action":"PREV_CHAPTER","disabled":"@entity.isFirst","label":"@config.previousLabel","leftIcon":["if",["==","@config.direction","rtl"],"chevron-right","chevron-left"],"type":"button","variant":"secondary"},{"action":"NEXT_CHAPTER","disabled":"@entity.isLast","label":"@config.nextLabel","rightIcon":["if",["==","@config.direction","rtl"],"chevron-left","chevron-right"],"type":"button","variant":"primary"}],"direction":"horizontal","gap":"md","justify":"between","type":"stack"}],"direction":"vertical","gap":"lg","type":"stack"}],"gap":"xl","ratio":"1:3","type":"split"}],"maxWidth":"xl","padding":"lg","size":"xl","type":"container"}],"dir":"@config.direction","fullWidth":true,"paddingY":"xl","type":"box"} @label "Reading body" @tier "internal"
20340
20779
  startLabel : string = "Start reading" @label "Start button label" @tier "presentation"
20341
20780
  subtitle : string = "" @label "Subtitle" @tier "presentation"
20342
20781
  title : string = "Untitled book" @label "Title" @tier "presentation"
@@ -20426,9 +20865,9 @@ trait std-calendar.traits.CalendarEventCalendar {
20426
20865
  config {
20427
20866
  agendaGroupBy : string = "date" @label "Agenda group-by field" @description "Row field the agenda list groups its day sections by. Rebound hosts point this at their own timestamp column (e.g. startTime, scheduledAt)." @synonyms "group field, section field, day field" @tier "presentation"
20428
20867
  agendaItemActions : [ItemAction] = [] @label "Agenda item actions" @description "Per-item action buttons on agenda-list rows — data-list itemActions descriptors (label/event/icon/variant). Consumers override to wire their own row actions (View/Edit/Delete) so agenda hosts never need a second table for actions." @synonyms "agenda actions, row actions, event actions, list actions" @tier "presentation"
20429
- agendaListBodyContent : render-ui = {"children":[{"align":"center","children":[{"align":"center","children":[{"name":"list","size":"xl","type":"icon"},{"content":"Agenda","type":"typography","variant":"h2"}],"direction":"horizontal","gap":"sm","type":"stack"},{"onSelect":"SELECT_DAY","selected":"@entity.selectedRange","type":"date-range-selector"}],"direction":"horizontal","gap":"md","justify":"between","type":"stack"},["if","@config.bodySearch",{"children":[{"className":"w-full max-w-md","clearable":true,"event":"REFETCH_QUERY","placeholder":"@config.searchPlaceholder","type":"search-input"}],"direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],["if",[">",["array/len","@config.filters"],0],{"children":[{"entity":"CalendarEvent","event":"REFETCH_FILTER","filters":"@config.filters","look":"@config.filterBarLook","type":"filter-group"}],"direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],{"type":"divider"},{"entity":"@payload.data","fields":[],"gap":"md","groupBy":"@config.agendaGroupBy","itemActions":["array/filter","@config.agendaItemActions",["fn","action",["or",["=",["array/len",["object/get","@action","roles",[]]],0],["array/includes",["object/get","@action","roles",[]],"@config.viewerRole"]]]],"renderItem":["fn","item",{"children":[{"align":"start","children":[{"align":"center","children":[{"color":"muted","content":"@config.timeBinding","format":"time","type":"typography","variant":"overline"},{"color":"muted","name":"clock","size":"sm","type":"icon"}],"className":"w-16 shrink-0","direction":"vertical","gap":"xs","type":"stack"},{"orientation":"vertical","type":"divider"},{"children":[{"align":"center","children":[{"className":"truncate","content":"@config.titleBinding","type":"typography","variant":"h4","weight":"medium"},{"label":"@config.badgeBinding","size":"sm","type":"badge","variant":"default"}],"direction":"horizontal","gap":"sm","justify":"between","type":"stack"},{"className":"truncate","color":"muted","content":"@config.descriptionBinding","type":"typography","variant":"body2"}],"className":"flex-1 min-w-0","direction":"vertical","gap":"xs","type":"stack"}],"direction":"horizontal","gap":"md","type":"stack"}],"look":"flat-bordered","padding":"md","type":"card"}],"type":"data-list","variant":"default"}],"className":"w-full p-card-md","direction":"vertical","gap":"lg","type":"stack"} @label "Agenda list body content tree" @description "Render-ui SExpr for calendarLook='agenda-list' — events grouped by day with overline day headers (Today, Tomorrow, …) and a time marker per event." @tier "internal"
20868
+ agendaListBodyContent : render-ui = {"children":[{"align":"center","children":[{"align":"center","children":[{"name":"list","size":"xl","type":"icon"},{"content":"@config.title","type":"typography","variant":"h2"}],"direction":"horizontal","gap":"sm","type":"stack"},{"onSelect":"SELECT_DAY","selected":"@entity.selectedRange","type":"date-range-selector"}],"direction":"horizontal","gap":"md","justify":"between","type":"stack","wrap":true},["if","@config.bodySearch",{"children":[{"className":"w-full max-w-md","clearable":true,"event":"REFETCH_QUERY","placeholder":"@config.searchPlaceholder","type":"search-input"}],"direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],["if",[">",["array/len","@config.filters"],0],{"children":[{"entity":"CalendarEvent","event":"REFETCH_FILTER","filters":"@config.filters","look":"@config.filterBarLook","type":"filter-group"}],"direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],{"type":"divider"},{"entity":"@payload.data","fields":[],"gap":"md","groupBy":"@config.agendaGroupBy","groupFormat":"date","itemActions":["array/filter","@config.agendaItemActions",["fn","action",["or",["=",["array/len",["object/get","@action","roles",[]]],0],["array/includes",["object/get","@action","roles",[]],"@config.viewerRole"]]]],"renderItem":["fn","item",{"children":[{"align":"start","children":[{"align":"center","children":[{"color":"muted","content":"@config.timeBinding","format":"time","type":"typography","variant":"overline"},{"className":"hidden sm:block","color":"muted","name":"clock","size":"sm","type":"icon"}],"className":"w-14 sm:w-16 shrink-0","direction":"vertical","gap":"xs","type":"stack"},{"className":"hidden sm:block","orientation":"vertical","type":"divider"},{"children":[{"align":"center","children":[{"className":"min-w-[8rem] flex-1 line-clamp-2 break-words","content":"@config.titleBinding","type":"typography","variant":"h4","weight":"medium"},{"className":"shrink-0 whitespace-nowrap","label":"@config.badgeBinding","size":"sm","type":"badge","variant":"default"}],"direction":"horizontal","gap":"sm","justify":"between","type":"stack","wrap":true},{"className":"truncate","color":"muted","content":"@config.descriptionBinding","type":"typography","variant":"body2"}],"className":"flex-1 min-w-0","direction":"vertical","gap":"xs","type":"stack"}],"direction":"horizontal","gap":"md","type":"stack"}],"look":"flat-bordered","padding":"md","type":"card"}],"surface":"none","type":"data-list","variant":"default"}],"className":"w-full p-card-md","direction":"vertical","gap":"lg","type":"stack"} @label "Agenda list body content tree" @description "Render-ui SExpr for calendarLook='agenda-list' — events grouped by day with overline day headers (Today, Tomorrow, …) and a time marker per event." @tier "internal"
20430
20869
  badgeBinding : string = "@item.status" @label "Badge binding" @description "Per-row binding for the event status/badge slot." @tier "presentation"
20431
- bodyContent : render-ui = {"children":[{"align":"center","children":[{"align":"center","children":[{"name":"calendar","size":"xl","type":"icon"},{"content":"@config.title","type":"typography","variant":"h2"}],"direction":"horizontal","gap":"sm","type":"stack"},{"onSelect":"SELECT_DAY","selected":"@entity.selectedRange","type":"date-range-selector"}],"direction":"horizontal","gap":"md","justify":"between","type":"stack"},["if","@config.bodySearch",{"children":[{"className":"w-full max-w-md","clearable":true,"event":"REFETCH_QUERY","placeholder":"@config.searchPlaceholder","type":"search-input"}],"direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],["if",[">",["array/len","@config.filters"],0],{"children":[{"entity":"CalendarEvent","event":"REFETCH_FILTER","filters":"@config.filters","look":"@config.filterBarLook","type":"filter-group"}],"direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],{"type":"divider"},{"events":"@payload.data","onEventClick":"@config.onEventClick","renderItem":["fn","item",{"content":"@config.titleBinding","type":"typography","variant":"small"}],"startField":"@config.startField","type":"calendar-grid"},{"type":"divider"},{"content":"Upcoming Events","type":"typography","variant":"h4"},{"entity":"@payload.data","fields":"@config.fields","itemActions":["array/filter","@config.agendaItemActions",["fn","action",["or",["=",["array/len",["object/get","@action","roles",[]]],0],["array/includes",["object/get","@action","roles",[]],"@config.viewerRole"]]]],"look":"@config.tableLook","type":"data-list"}],"direction":"vertical","gap":"lg","type":"stack"} @label "Body content tree" @description "Render-ui SExpr rendered after events load for calendarLook='month' — the month-grid + upcoming-events list. calendarLook='agenda-list' / 'week-timeline' render agendaListBodyContent / weekTimelineBodyContent instead; all three share this trait's state machine, emits, and listens." @tier "internal"
20870
+ bodyContent : render-ui = {"children":[{"align":"center","children":[{"align":"center","children":[{"name":"calendar","size":"xl","type":"icon"},{"content":"@config.title","type":"typography","variant":"h2"}],"direction":"horizontal","gap":"sm","type":"stack"},{"onSelect":"SELECT_DAY","selected":"@entity.selectedRange","type":"date-range-selector"}],"direction":"horizontal","gap":"md","justify":"between","type":"stack","wrap":true},["if","@config.bodySearch",{"children":[{"className":"w-full max-w-md","clearable":true,"event":"REFETCH_QUERY","placeholder":"@config.searchPlaceholder","type":"search-input"}],"direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],["if",[">",["array/len","@config.filters"],0],{"children":[{"entity":"CalendarEvent","event":"REFETCH_FILTER","filters":"@config.filters","look":"@config.filterBarLook","type":"filter-group"}],"direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],{"type":"divider"},{"events":"@payload.data","onEventClick":"@config.onEventClick","renderItem":["fn","item",{"content":"@config.titleBinding","type":"typography","variant":"small"}],"startField":"@config.startField","type":"calendar-grid"},{"type":"divider"},{"content":"Upcoming Events","type":"typography","variant":"h4"},{"entity":"@payload.data","fields":"@config.fields","itemActions":["array/filter","@config.agendaItemActions",["fn","action",["or",["=",["array/len",["object/get","@action","roles",[]]],0],["array/includes",["object/get","@action","roles",[]],"@config.viewerRole"]]]],"look":"@config.tableLook","type":"data-list"}],"direction":"vertical","gap":"lg","type":"stack"} @label "Body content tree" @description "Render-ui SExpr rendered after events load for calendarLook='month' — the month-grid + upcoming-events list. calendarLook='agenda-list' / 'week-timeline' render agendaListBodyContent / weekTimelineBodyContent instead; all three share this trait's state machine, emits, and listens." @tier "internal"
20432
20871
  bodySearch : boolean = false @label "Show the calendar's own search box?" @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." @synonyms "inline search, calendar search, built-in search, show search, duplicate search" @tier "presentation"
20433
20872
  calendarLook : string = "month" @label "Calendar look" @description "Layer 3 body layout: default month-grid + upcoming-events list ('month'), day-grouped agenda list ('agenda-list'), or 7-column week timeline ('week-timeline')." @tier "presentation" @values (month agenda-list week-timeline)
20434
20873
  descriptionBinding : string = "@item.description" @label "Description binding" @description "Per-row binding for the event description slot." @tier "presentation"
@@ -20445,7 +20884,7 @@ trait std-calendar.traits.CalendarEventCalendar {
20445
20884
  title : string = "Calendar" @label "Title" @description "Header text shown above the calendar body." @tier "presentation"
20446
20885
  titleBinding : string = "@item.name" @label "Title binding" @description "Per-row binding for the event title slot." @tier "presentation"
20447
20886
  viewerRole : string = "" @label "Viewer's role" @description "The signed-in viewer's role that each action's `roles` is checked against. Bind it explicitly at the call site (e.g. `viewerRole: @user.role`) in an app whose identity carries a role; left empty, only actions with no `roles` show." @tier "policy"
20448
- weekTimelineBodyContent : render-ui = {"children":[{"align":"center","children":[{"align":"center","children":[{"name":"calendar","size":"xl","type":"icon"},{"content":"Week","type":"typography","variant":"h2"}],"direction":"horizontal","gap":"sm","type":"stack"},{"align":"center","children":[{"action":"CALENDAR_PREV_WEEK","icon":"chevron-left","label":"Previous week","type":"button","variant":"ghost"},{"color":"muted","content":["time/format","@entity.weekAnchor","MMM D, YYYY"],"type":"typography","variant":"caption"},{"action":"CALENDAR_NEXT_WEEK","icon":"chevron-right","label":"Next week","type":"button","variant":"ghost"}],"direction":"horizontal","gap":"xs","type":"stack"},{"onSelect":"SELECT_DAY","selected":"@entity.selectedRange","type":"date-range-selector"}],"direction":"horizontal","gap":"md","justify":"between","type":"stack"},["if","@config.bodySearch",{"children":[{"className":"w-full max-w-md","clearable":true,"event":"REFETCH_QUERY","placeholder":"@config.searchPlaceholder","type":"search-input"}],"direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],["if",[">",["array/len","@config.filters"],0],{"children":[{"entity":"CalendarEvent","event":"REFETCH_FILTER","filters":"@config.filters","look":"@config.filterBarLook","type":"filter-group"}],"direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],{"type":"divider"},{"className":"w-full","dayWindow":7,"events":"@payload.data","onEventClick":"@config.onEventClick","renderItem":["fn","item",{"content":"@config.titleBinding","type":"typography","variant":"small"}],"startField":"@config.startField","swipeLeftEvent":"CALENDAR_NEXT_WEEK","swipeRightEvent":"CALENDAR_PREV_WEEK","type":"calendar-grid","weekStart":"@entity.weekAnchor"}],"direction":"vertical","gap":"md","type":"stack"} @label "Week timeline body content tree" @description "Render-ui SExpr for calendarLook='week-timeline' — events grouped by weekday in a 7-column timeline window." @tier "internal"
20887
+ weekTimelineBodyContent : render-ui = {"children":[{"align":"center","children":[{"align":"center","children":[{"name":"calendar","size":"xl","type":"icon"},{"content":"@config.title","type":"typography","variant":"h2"}],"direction":"horizontal","gap":"sm","type":"stack"},{"align":"center","children":[{"action":"CALENDAR_PREV_WEEK","icon":"chevron-left","label":"Previous week","type":"button","variant":"ghost"},{"color":"muted","content":["time/format","@entity.weekAnchor","MMM D, YYYY"],"type":"typography","variant":"caption"},{"action":"CALENDAR_NEXT_WEEK","icon":"chevron-right","label":"Next week","type":"button","variant":"ghost"}],"direction":"horizontal","gap":"xs","type":"stack"},{"onSelect":"SELECT_DAY","selected":"@entity.selectedRange","type":"date-range-selector"}],"direction":"horizontal","gap":"md","justify":"between","type":"stack","wrap":true},["if","@config.bodySearch",{"children":[{"className":"w-full max-w-md","clearable":true,"event":"REFETCH_QUERY","placeholder":"@config.searchPlaceholder","type":"search-input"}],"direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],["if",[">",["array/len","@config.filters"],0],{"children":[{"entity":"CalendarEvent","event":"REFETCH_FILTER","filters":"@config.filters","look":"@config.filterBarLook","type":"filter-group"}],"direction":"horizontal","gap":"sm","type":"stack"},{"children":[],"gap":"none","type":"stack"}],{"type":"divider"},{"className":"w-full","dayWindow":7,"events":"@payload.data","onEventClick":"@config.onEventClick","renderItem":["fn","item",{"content":"@config.titleBinding","type":"typography","variant":"small"}],"startField":"@config.startField","swipeLeftEvent":"CALENDAR_NEXT_WEEK","swipeRightEvent":"CALENDAR_PREV_WEEK","type":"calendar-grid","weekStart":"@entity.weekAnchor"}],"direction":"vertical","gap":"md","type":"stack"} @label "Week timeline body content tree" @description "Render-ui SExpr for calendarLook='week-timeline' — events grouped by weekday in a 7-column timeline window." @tier "internal"
20449
20888
  }
20450
20889
  override-surface : (linkedEntity name events effects listens emitsScope config)
20451
20890
  source : "@almadar/std (behaviors/registry/ui/core/atoms/std-calendar.orb orbitals[0].traits[0])"
@@ -20820,6 +21259,31 @@ trait std-detail-layout.traits.DetailLayout {
20820
21259
  source : "@almadar/std (behaviors/registry/ui/core/atoms/std-detail-layout.orb orbitals[0].traits[0])"
20821
21260
  }
20822
21261
 
21262
+ ;; From @almadar/std (behaviors/registry/ui/core/atoms/std-doc-page.orb orbitals[0].traits[0])
21263
+ trait std-doc-page.traits.DocPageRender {
21264
+ alias : DocPage
21265
+ linkedEntity : DocPageView
21266
+ category : interaction
21267
+ states : (idle*)
21268
+ events : (INIT)
21269
+ transitions : ((idle -> idle on INIT))
21270
+ config {
21271
+ content : render-ui = {"children":[],"direction":"vertical","gap":"lg","type":"stack"} @label "Content" @description "The page body: markdown, code and live behaviors (trait references) in reading order" @tier "presentation"
21272
+ crumbs : [DocCrumb] = [] @label "Breadcrumb" @description "Ancestors first, the current page last without a link; empty hides it" @tier "presentation"
21273
+ direction : string = "ltr" @label "Direction" @tier "presentation" @values (ltr rtl)
21274
+ lede : string = "" @label "Lede" @description "One or two sentences under the title; empty hides it" @tier "presentation"
21275
+ navItems : [DocNavItem] = [] @label "Sidebar" @description "The documentation tree; mark the current page active" @tier "presentation"
21276
+ next : DocLink = {"href":"","label":""} @label "Next page" @description "Empty href hides it" @tier "presentation"
21277
+ prev : DocLink = {"href":"","label":""} @label "Previous page" @description "Empty href hides it" @tier "presentation"
21278
+ sidebarLabel : string = "Documentation" @label "Sidebar label" @tier "presentation"
21279
+ title : string = "Untitled page" @label "Title" @tier "presentation"
21280
+ toc : [DocTocEntry] = [] @label "On this page" @description "Anchors of the page's sections (each section declares the same id); empty hides it" @tier "presentation"
21281
+ tocLabel : string = "On this page" @label "Contents label" @tier "presentation"
21282
+ }
21283
+ override-surface : (linkedEntity name events effects listens emitsScope config)
21284
+ source : "@almadar/std (behaviors/registry/ui/core/atoms/std-doc-page.orb orbitals[0].traits[0])"
21285
+ }
21286
+
20823
21287
  ;; From @almadar/std (behaviors/registry/ui/game/atoms/std-dungeon-combat.orb orbitals[0].traits[0])
20824
21288
  trait std-dungeon-combat.traits.DungeonCombat {
20825
21289
  alias : DungeonCombat
@@ -21319,10 +21783,12 @@ trait std-hero.traits.HeroRender {
21319
21783
  emits : (CTA_PRIMARY CTA_SECONDARY)
21320
21784
  config {
21321
21785
  alignment : string = "center" @label "Alignment" @description "Center the copy, or align it to the start edge" @tier "presentation" @values (center start)
21786
+ backdropContent : render-ui = {"className":"hidden","type":"box"} @label "Backdrop" @description "A scene behind the whole block, such as an animated canvas; it fills the block, never takes clicks, and the copy stays on top. Empty by default." @tier "presentation"
21322
21787
  command : string = "" @label "Command" @description "A shell command shown in a copyable code box under the actions, e.g. an install one-liner; empty hides it" @synonyms "install command, cli, terminal snippet" @tier "presentation"
21323
21788
  copyContent : render-ui = {"align":["if",["==","@config.alignment","center"],"center","start"],"children":[{"label":"@config.eyebrow","size":"md","type":"badge","variant":"primary"},{"align":["if",["==","@config.alignment","center"],"center","left"],"className":"tracking-tight text-balance","content":"@config.headline","type":"typography","variant":["if",["==","@config.look","banner"],"h2","h1"],"weight":"bold"},{"align":["if",["==","@config.alignment","center"],"center","left"],"className":["if",["==","@config.lede",""],"hidden","max-w-2xl text-pretty"],"color":"muted","content":"@config.lede","type":"typography","variant":"large"},{"children":[{"action":"HERO_PRIMARY","actionPayload":{"href":"@config.primaryHref"},"className":["if",["==","@config.primaryLabel",""],"hidden",""],"href":"@config.primaryHref","label":"@config.primaryLabel","size":"lg","type":"button","variant":"primary"},{"action":"HERO_SECONDARY","actionPayload":{"href":"@config.secondaryHref"},"className":["if",["==","@config.secondaryLabel",""],"hidden",""],"href":"@config.secondaryHref","label":"@config.secondaryLabel","size":"lg","type":"button","variant":"secondary"}],"className":["if",["==","@config.primaryLabel",""],["if",["==","@config.secondaryLabel",""],"hidden","pt-2"],"pt-2"],"direction":"horizontal","gap":"md","justify":["if",["==","@config.alignment","center"],"center","start"],"type":"stack","wrap":true},{"children":[{"code":"@config.command","language":"bash","showCopyButton":true,"showLanguageBadge":false,"type":"code-block"}],"className":["if",["==","@config.command",""],"hidden","max-w-xl"],"fullWidth":true,"type":"box"}],"direction":"vertical","gap":"lg","type":"stack"} @label "Copy block" @tier "internal"
21324
21789
  eyebrow : string = "" @label "Eyebrow" @description "Small badge above the headline; empty hides it" @synonyms "tag, kicker, label above title" @tier "presentation"
21325
21790
  headline : string = "Build what you mean" @label "Headline" @description "Main headline" @synonyms "title, heading" @tier "presentation"
21791
+ height : string = "auto" @label "Height" @description "auto fits the copy; tall fills most of the screen with the copy centred, for a hero over a backdrop scene" @tier "presentation" @values (auto tall)
21326
21792
  lede : string = "" @label "Supporting text" @description "One or two sentences under the headline; empty hides it" @synonyms "subtitle, subheading, description, tagline" @tier "presentation"
21327
21793
  look : string = "hero" @label "Look" @description "hero = full-width page opener with an h1; banner = contained call-to-action card with an h2" @synonyms "cta banner, call to action, callout, page header, masthead" @tier "presentation" @values (hero banner)
21328
21794
  mediaAlt : string = "" @label "Media alt text" @tier "presentation"
@@ -21333,8 +21799,8 @@ trait std-hero.traits.HeroRender {
21333
21799
  primaryLabel : string = "Get started" @label "Primary action label" @description "Empty hides the primary action" @tier "presentation"
21334
21800
  secondaryHref : string = "" @label "Secondary action link" @description "In-app path, #anchor, or absolute URL" @tier "presentation"
21335
21801
  secondaryLabel : string = "" @label "Secondary action label" @description "Empty hides the secondary action" @tier "presentation"
21336
- sideContent : render-ui = {"bg":["if",["==","@config.surface","muted"],"muted","transparent"],"children":[{"children":[{"bg":["if",["==","@config.look","banner"],"muted","transparent"],"border":["==","@config.look","banner"],"children":[{"align":"center","children":["@config.copyContent","@config.mediaContent"],"gap":"xl","ratio":"1:1","type":"split"}],"padding":["if",["==","@config.look","banner"],"xl","none"],"rounded":["if",["==","@config.look","banner"],"2xl","none"],"type":"box"}],"maxWidth":"xl","padding":"lg","size":"xl","type":"container"}],"fullWidth":true,"paddingY":["if",["==","@config.look","banner"],"xl","2xl"],"type":"box"} @label "Side-by-side body" @tier "internal"
21337
- stackedContent : render-ui = {"bg":["if",["==","@config.surface","muted"],"muted","transparent"],"children":[{"children":[{"bg":["if",["==","@config.look","banner"],"muted","transparent"],"border":["==","@config.look","banner"],"children":[{"align":["if",["==","@config.alignment","center"],"center","stretch"],"children":["@config.copyContent","@config.mediaContent"],"direction":"vertical","gap":"2xl","type":"stack"}],"padding":["if",["==","@config.look","banner"],"xl","none"],"rounded":["if",["==","@config.look","banner"],"2xl","none"],"type":"box"}],"maxWidth":"xl","padding":"lg","size":"xl","type":"container"}],"fullWidth":true,"paddingY":["if",["==","@config.look","banner"],"xl","2xl"],"type":"box"} @label "Stacked body" @tier "internal"
21802
+ sideContent : render-ui = {"bg":["if",["==","@config.surface","muted"],"muted","transparent"],"children":[{"aria-hidden":true,"children":["@config.backdropContent"],"className":"inset-0 pointer-events-none","position":"absolute","type":"box"},{"children":[{"children":[{"bg":["if",["==","@config.look","banner"],"muted","transparent"],"border":["==","@config.look","banner"],"children":[{"align":"center","children":["@config.copyContent","@config.mediaContent"],"gap":"xl","ratio":"1:1","type":"split"}],"padding":["if",["==","@config.look","banner"],"xl","none"],"rounded":["if",["==","@config.look","banner"],"2xl","none"],"type":"box"}],"maxWidth":"xl","padding":"lg","size":"xl","type":"container"}],"fullWidth":true,"position":"relative","type":"box"}],"className":["if",["==","@config.height","tall"],"flex min-h-[80vh] items-center",""],"fullWidth":true,"overflow":"hidden","paddingY":["if",["==","@config.look","banner"],"xl","2xl"],"position":"relative","type":"box"} @label "Side-by-side body" @tier "internal"
21803
+ stackedContent : render-ui = {"bg":["if",["==","@config.surface","muted"],"muted","transparent"],"children":[{"aria-hidden":true,"children":["@config.backdropContent"],"className":"inset-0 pointer-events-none","position":"absolute","type":"box"},{"children":[{"children":[{"bg":["if",["==","@config.look","banner"],"muted","transparent"],"border":["==","@config.look","banner"],"children":[{"align":["if",["==","@config.alignment","center"],"center","stretch"],"children":["@config.copyContent","@config.mediaContent"],"direction":"vertical","gap":"2xl","type":"stack"}],"padding":["if",["==","@config.look","banner"],"xl","none"],"rounded":["if",["==","@config.look","banner"],"2xl","none"],"type":"box"}],"maxWidth":"xl","padding":"lg","size":"xl","type":"container"}],"fullWidth":true,"position":"relative","type":"box"}],"className":["if",["==","@config.height","tall"],"flex min-h-[80vh] items-center",""],"fullWidth":true,"overflow":"hidden","paddingY":["if",["==","@config.look","banner"],"xl","2xl"],"position":"relative","type":"box"} @label "Stacked body" @tier "internal"
21338
21804
  surface : string = "plain" @label "Surface" @description "Background behind the block" @tier "presentation" @values (plain muted)
21339
21805
  }
21340
21806
  override-surface : (linkedEntity name events effects listens emitsScope config)
@@ -21442,8 +21908,8 @@ trait std-learn-arrangement.traits.LearnArrangementSim {
21442
21908
  linkedEntity : LearnArrangementScene
21443
21909
  category : interaction
21444
21910
  states : (idle*)
21445
- events : (INIT MODE_SELECTED PLACE UNDO CHECK RETRY ARRANGEMENT_CHECKED ARRANGEMENT_RESET LEARN_ROUND_COMPLETE)
21446
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on PLACE) (idle -> idle on UNDO) (idle -> idle on CHECK) (idle -> idle on RETRY))
21911
+ events : (INIT MODE_SELECTED ROSTER_LOADED PLACE UNDO CHECK RETRY ARRANGEMENT_CHECKED ARRANGEMENT_RESET LEARN_ROUND_COMPLETE)
21912
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on ROSTER_LOADED) (idle -> idle on ROSTER_LOADED) (idle -> idle on PLACE) (idle -> idle on UNDO) (idle -> idle on CHECK) (idle -> idle on RETRY))
21447
21913
  emits : (ARRANGEMENT_CHECKED ARRANGEMENT_RESET LEARN_ROUND_COMPLETE)
21448
21914
  config {
21449
21915
  animate : boolean = false @label "Animate" @description "Enable continuous redraw loop." @tier "presentation"
@@ -21457,6 +21923,7 @@ trait std-learn-arrangement.traits.LearnArrangementSim {
21457
21923
  matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT." @tier "presentation"
21458
21924
  pendingColor : string = "series-2" @label "Pending Slot Color" @description "Fill color for a filled slot before grading." @tier "presentation"
21459
21925
  retryLabel : string = "Retry" @label "Retry Button Label" @tier "presentation"
21926
+ rosterSource : string = "config" @label "Roster Source" @description "Where the roster comes from: config reads the items knob(s) at INIT; event waits for ROSTER_LOADED and takes the roster from its payload." @tier "domain" @values (config event)
21460
21927
  slotBorderColor : string = "ink" @label "Slot Border Color" @tier "presentation"
21461
21928
  slotFontSize : string = "sm" @label "Slot Text Size" @description "Slot label size role: xs, sm, base or lg." @tier "presentation"
21462
21929
  slotHeight : number = 60 @label "Slot Height (px)" @tier "presentation"
@@ -21480,8 +21947,8 @@ trait std-learn-classify.traits.LearnClassifySim {
21480
21947
  linkedEntity : LearnClassifyScene
21481
21948
  category : interaction
21482
21949
  states : (idle*)
21483
- events : (INIT MODE_SELECTED PICK ADVANCE RETRY TOGGLE_RUN CLASSIFY_UPDATED LEARN_ROUND_COMPLETE)
21484
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on PICK) (idle -> idle on ADVANCE) (idle -> idle on RETRY) (idle -> idle on TOGGLE_RUN))
21950
+ events : (INIT MODE_SELECTED ROSTER_LOADED PICK ADVANCE RETRY TOGGLE_RUN CLASSIFY_UPDATED LEARN_ROUND_COMPLETE)
21951
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on ROSTER_LOADED) (idle -> idle on ROSTER_LOADED) (idle -> idle on PICK) (idle -> idle on ADVANCE) (idle -> idle on RETRY) (idle -> idle on TOGGLE_RUN))
21485
21952
  emits : (CLASSIFY_UPDATED LEARN_ROUND_COMPLETE)
21486
21953
  config {
21487
21954
  advanceLabel : string = "Next" @label "Advance Button Label" @description "Label text for the button that advances to the next item." @tier "presentation"
@@ -21502,6 +21969,7 @@ trait std-learn-classify.traits.LearnClassifySim {
21502
21969
  penaltyPerMiss : number = 0 @label "Penalty Per Miss" @description "Rubric points subtracted for each incorrect pick (score never drops below 0)." @tier "domain"
21503
21970
  pointsPerCorrect : number = 1 @label "Points Per Correct" @description "Rubric points added to the score for each correct pick; at the default 1 with no penalty, the plain correct/attempted counts render instead of the rubric score." @tier "domain"
21504
21971
  retryLabel : string = "Retry Round" @label "Retry Button Label" @description "Label text for the button that restarts the round from the end-of-round summary." @tier "presentation"
21972
+ rosterSource : string = "config" @label "Roster Source" @description "Where the roster comes from: config reads the items/categories knob(s) at INIT; event waits for ROSTER_LOADED and takes the roster from its payload." @tier "domain" @values (config event)
21505
21973
  scoreCap : number = 0 @label "Score Cap" @description "Upper bound on the rubric score; 0 means uncapped." @tier "domain"
21506
21974
  showHint : boolean = true @label "Show Hint" @description "Show each item's hint line beneath the prompt before the learner picks; hide for a harder drill." @tier "domain"
21507
21975
  summary : string = "" @label "Concept" @description "One line under the title saying what is being classified (keep it under ~65 characters). Empty shows no line." @tier "presentation"
@@ -21562,8 +22030,8 @@ trait std-learn-coupled-sim.traits.CoupledSimSim {
21562
22030
  linkedEntity : CoupledSimScene
21563
22031
  category : interaction
21564
22032
  states : (idle*)
21565
- events : (INIT MODE_SELECTED TOGGLE_RUN SPEED_SET RUN PAUSE RESET SET_A SET_B SHOCK RUN_TOGGLED SIM_RESET COEFS_CHANGED SHOCK_APPLIED)
21566
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on TOGGLE_RUN) (idle -> idle on SPEED_SET) (idle -> idle on RUN) (idle -> idle on PAUSE) (idle -> idle on RESET) (idle -> idle on SET_A) (idle -> idle on SET_B) (idle -> idle on SHOCK))
22033
+ events : (INIT MODE_SELECTED ROSTER_LOADED TOGGLE_RUN SPEED_SET RUN PAUSE RESET SET_A SET_B SHOCK RUN_TOGGLED SIM_RESET COEFS_CHANGED SHOCK_APPLIED)
22034
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on ROSTER_LOADED) (idle -> idle on ROSTER_LOADED) (idle -> idle on TOGGLE_RUN) (idle -> idle on SPEED_SET) (idle -> idle on RUN) (idle -> idle on PAUSE) (idle -> idle on RESET) (idle -> idle on SET_A) (idle -> idle on SET_B) (idle -> idle on SHOCK))
21567
22035
  emits : (RUN_TOGGLED SIM_RESET COEFS_CHANGED SHOCK_APPLIED)
21568
22036
  config {
21569
22037
  autoRun : boolean = true @label "Auto Run" @description "Whether the simulation starts running immediately on load." @tier "domain"
@@ -21583,13 +22051,14 @@ trait std-learn-coupled-sim.traits.CoupledSimSim {
21583
22051
  gridStep : number = 50 @label "Grid Step" @tier "presentation"
21584
22052
  height : number = 360 @label "Height" @tier "presentation"
21585
22053
  kind : string = "predator-prey" @label "Interaction Family" @description "Which coupled dynamics govern the two quantities: predator-prey (oscillating cycles), epidemic (S and I with transmission and recovery), or kinetics (A decaying into B)." @synonyms "predator prey, Lotka-Volterra, SIR, epidemic, reaction kinetics, coupled ODE" @tier "domain"
21586
- matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT." @tier "presentation"
22054
+ matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT (or on ROSTER_LOADED when rosterSource is event)." @tier "presentation"
21587
22055
  pColor : string = "series-1" @label "P Color" @tier "presentation"
21588
22056
  pLabel : string = "Prey" @label "P Label" @description "Display name of the first quantity." @tier "domain"
21589
22057
  pStart : number = 120 @label "P Start" @tier "domain"
21590
22058
  qColor : string = "series-2" @label "Q Color" @tier "presentation"
21591
22059
  qLabel : string = "Predators" @label "Q Label" @description "Display name of the second quantity." @tier "domain"
21592
22060
  qStart : number = 40 @label "Q Start" @tier "domain"
22061
+ rosterSource : string = "config" @label "Roster Source" @description "Where the system definition (taskText, kind, pLabel, qLabel, pStart, qStart, coefALabel, coefBLabel) comes from: config reads those knobs at INIT; event waits for ROSTER_LOADED and takes them from its payload." @tier "domain" @values (config event)
21593
22062
  shockDownLabel : string = "− Prey cull" @label "Shock Down Label" @tier "presentation"
21594
22063
  shockSize : number = 40 @label "Shock Size" @description "How much of the first quantity a shock button injects or removes." @tier "domain"
21595
22064
  shockUpLabel : string = "+ Prey burst" @label "Shock Up Label" @tier "presentation"
@@ -21610,8 +22079,8 @@ trait std-learn-derivation.traits.LearnDerivationSim {
21610
22079
  linkedEntity : LearnDerivationScene
21611
22080
  category : interaction
21612
22081
  states : (idle*)
21613
- events : (INIT MODE_SELECTED APPLY_STEP TOGGLE_RUN RESET DERIVATION_UPDATED LEARN_ROUND_COMPLETE)
21614
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on APPLY_STEP) (idle -> idle on TOGGLE_RUN) (idle -> idle on RESET))
22082
+ events : (INIT MODE_SELECTED ROSTER_LOADED APPLY_STEP TOGGLE_RUN RESET DERIVATION_UPDATED LEARN_ROUND_COMPLETE)
22083
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on ROSTER_LOADED) (idle -> idle on ROSTER_LOADED) (idle -> idle on APPLY_STEP) (idle -> idle on TOGGLE_RUN) (idle -> idle on RESET))
21615
22084
  emits : (DERIVATION_UPDATED LEARN_ROUND_COMPLETE)
21616
22085
  config {
21617
22086
  autoApplyIntervalMs : number = 800 @label "Auto-Apply Interval (ms)" @description "Milliseconds of running clock per automatic candidate application — the 32ms base tick accumulates elapsed time and applies the first applicable candidate each time this interval elapses." @tier "domain"
@@ -21628,6 +22097,7 @@ trait std-learn-derivation.traits.LearnDerivationSim {
21628
22097
  noStepAvailableMessage : string = "No further steps are available yet." @label "No Step Available Message" @description "Feedback shown when the auto-apply tick finds no applicable candidate." @tier "presentation"
21629
22098
  premises : [LearnDerivationLine] = [{"badgeLabel":"GIVEN","badgeVariant":"neutral","id":"given-a","kind":"fact","label":"A","negated":false,"subject":"A"},{"badgeLabel":"RULE","badgeVariant":"info","id":"given-a-implies-b","kind":"link","label":"A → B","leftNegated":false,"leftSubject":"A","rightNegated":false,"rightSubject":"B"}] @label "Premises" @description "The starting lines of the derivation: plain facts (subject/negated) and two-sided links (leftSubject/leftNegated/rightSubject/rightNegated) the learner combines with candidate steps. Each line carries its own badgeLabel/badgeVariant." @synonyms "premise, given, starting line, hypothesis, starting statement" @tier "domain"
21630
22099
  resetLabel : string = "Reset" @label "Reset Button Label" @description "Label text for the button that restores the starting premises." @tier "presentation"
22100
+ rosterSource : string = "config" @label "Roster Source" @description "Where the roster comes from: config reads the premises/candidates knob(s) at INIT; event waits for ROSTER_LOADED and takes the roster from its payload." @tier "domain" @values (config event)
21631
22101
  summary : string = "" @label "Concept" @description "One line under the title saying what is being derived (keep it under ~65 characters). Empty shows no line." @tier "presentation"
21632
22102
  title : string = "Derivation Lab" @label "Title" @description "Title shown above the derivation panel." @tier "presentation"
21633
22103
  width : number = 600 @label "Width" @description "Maximum width of the panel, in pixels." @tier "presentation"
@@ -21642,8 +22112,8 @@ trait std-learn-diagram.traits.LearnDiagramSim {
21642
22112
  linkedEntity : LearnDiagramScene
21643
22113
  category : interaction
21644
22114
  states : (idle*)
21645
- events : (INIT MODE_SELECTED SELECT_PART CLEAR_PART PART_SELECTED SELECTION_CLEARED)
21646
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on SELECT_PART) (idle -> idle on CLEAR_PART))
22115
+ events : (INIT MODE_SELECTED ROSTER_LOADED SELECT_PART CLEAR_PART PART_SELECTED SELECTION_CLEARED)
22116
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on ROSTER_LOADED) (idle -> idle on ROSTER_LOADED) (idle -> idle on SELECT_PART) (idle -> idle on CLEAR_PART))
21647
22117
  emits : (PART_SELECTED SELECTION_CLEARED)
21648
22118
  config {
21649
22119
  backgroundColor : string = "" @label "Background Color" @description "Canvas ground. Empty uses the theme drawing ground." @tier "presentation"
@@ -21654,6 +22124,7 @@ trait std-learn-diagram.traits.LearnDiagramSim {
21654
22124
  matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT." @tier "presentation"
21655
22125
  overviewText : string = "Select a part below to learn what it does." @label "Overview Text" @description "Caption card text shown when no part is selected." @tier "presentation"
21656
22126
  parts : [LearnDiagramPart] = [{"color":"series-1","description":"Receives raw data or requests from the outside world and hands them to the processor.","id":"input","label":"Input","radius":34,"x":120,"y":200},{"color":"series-2","description":"The central component that transforms incoming data according to the system's rules.","id":"processor","label":"Processor","radius":46,"x":300,"y":200},{"color":"series-3","description":"Persists data so it can be retrieved later, even after the system restarts.","id":"storage","label":"Storage","radius":34,"x":300,"y":320},{"color":"series-4","description":"Delivers the processor's results back out to users or other systems.","id":"output","label":"Output","radius":34,"x":480,"y":200},{"color":"series-5","description":"Coordinates timing and configuration for the processor without touching the data itself.","id":"controller","label":"Controller","radius":26,"x":300,"y":80}] @label "Parts" @description "Roster of labeled parts (id, label, description, x, y, radius, color) the diagram renders as circles; the learner selects one to see its description." @synonyms "part, node, component, label, annotation" @tier "domain"
22127
+ rosterSource : string = "config" @label "Roster Source" @description "Where the parts and links roster comes from: config reads the parts and links knobs at INIT; event waits for ROSTER_LOADED and takes the roster from its payload." @tier "domain" @values (config event)
21657
22128
  summary : string = "" @label "Concept" @description "One line under the title saying what the learner is looking at (keep it under ~65 characters). Empty shows no line." @tier "presentation"
21658
22129
  title : string = "System Diagram" @label "Title" @description "Title shown above the diagram." @tier "presentation"
21659
22130
  width : number = 600 @label "Width" @description "Canvas width in pixels." @tier "presentation"
@@ -21668,8 +22139,8 @@ trait std-learn-doser.traits.LearnDoserSim {
21668
22139
  linkedEntity : DoserScene
21669
22140
  category : interaction
21670
22141
  states : (idle*)
21671
- events : (INIT MODE_SELECTED ADD_SMALL ADD_LARGE TOGGLE_DRIP RESET DOSE_ADDED DOSE_RESET DOSER_UPDATED LEARN_ROUND_COMPLETE)
21672
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on ADD_SMALL) (idle -> idle on ADD_LARGE) (idle -> idle on TOGGLE_DRIP) (idle -> idle on RESET))
22142
+ events : (INIT MODE_SELECTED ROSTER_LOADED ADD_SMALL ADD_LARGE TOGGLE_DRIP RESET DOSE_ADDED DOSE_RESET DOSER_UPDATED LEARN_ROUND_COMPLETE)
22143
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on ROSTER_LOADED) (idle -> idle on ROSTER_LOADED) (idle -> idle on ADD_SMALL) (idle -> idle on ADD_LARGE) (idle -> idle on TOGGLE_DRIP) (idle -> idle on RESET))
21673
22144
  emits : (DOSE_ADDED DOSE_RESET DOSER_UPDATED LEARN_ROUND_COMPLETE)
21674
22145
  config {
21675
22146
  autoDrip : boolean = false @label "Auto Drip" @description "When true, INIT/MODE_SELECTED/Reset start the drip clock adding a small increment each interval; toggle live with the Auto-dose/Pause button." @tier "domain"
@@ -21682,6 +22153,7 @@ trait std-learn-doser.traits.LearnDoserSim {
21682
22153
  matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT." @tier "presentation"
21683
22154
  quantityLabel : string = "Dose" @label "Quantity Label" @description "Label used for the accumulated-quantity readout and in the narration line." @synonyms "quantity, amount, dose, volume, level" @tier "domain"
21684
22155
  reservoirLabel : string = "Reservoir" @label "Reservoir Label" @description "Label for the vessel that fills as dose accumulates." @synonyms "reservoir, beaker, tank, container, receiving vessel" @tier "presentation"
22156
+ rosterSource : string = "config" @label "Roster Source" @description "Where the band roster comes from: config reads the bands knob at INIT; event waits for ROSTER_LOADED and takes the roster from its payload." @tier "domain" @values (config event)
21685
22157
  series : [string] = [] @label "Palette" @description "Overrides the theme's categorical palette on the canvas (series-1…N) — a subject's real-world color convention, such as indicator colors. Empty uses the theme's palette." @tier "presentation"
21686
22158
  showCanvas : boolean = true @label "Show Canvas" @description "When true (the default, standalone use) the instrument renders its own reservoir/source canvas and narration below the control strip. Set false when a domain sibling trait composes this atom via @rebindable and owns the accurate scene render itself — then only the control strip (add/drip/reset buttons) embeds via @trait.<name>, avoiding a duplicate canvas." @tier "presentation"
21687
22159
  sourceColor : string = "series-1" @label "Source Color" @description "Tone name for the source vessel fill (for example series-1)." @tier "presentation"
@@ -21704,8 +22176,8 @@ trait std-learn-estimate.traits.EstimateSim {
21704
22176
  linkedEntity : EstimateScene
21705
22177
  category : interaction
21706
22178
  states : (idle*)
21707
- events : (INIT MODE_SELECTED SET_ESTIMATE LOCK_IN NEXT RETRY ESTIMATE_JUDGED PROMPT_ADVANCED ROUND_RESTARTED LEARN_ROUND_COMPLETE)
21708
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on SET_ESTIMATE) (idle -> idle on LOCK_IN) (idle -> idle on NEXT) (idle -> idle on RETRY))
22179
+ events : (INIT MODE_SELECTED ROSTER_LOADED SET_ESTIMATE LOCK_IN NEXT RETRY ESTIMATE_JUDGED PROMPT_ADVANCED ROUND_RESTARTED LEARN_ROUND_COMPLETE)
22180
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on ROSTER_LOADED) (idle -> idle on ROSTER_LOADED) (idle -> idle on SET_ESTIMATE) (idle -> idle on LOCK_IN) (idle -> idle on NEXT) (idle -> idle on RETRY))
21709
22181
  emits : (ESTIMATE_JUDGED PROMPT_ADVANCED ROUND_RESTARTED LEARN_ROUND_COMPLETE)
21710
22182
  config {
21711
22183
  closePct : number = 0.25 @label "Close Band" @description "Relative error at or below this fraction (but above the exact band) counts as close (partial points)." @tier "domain"
@@ -21717,6 +22189,7 @@ trait std-learn-estimate.traits.EstimateSim {
21717
22189
  nextLabel : string = "Next" @label "Next Label" @tier "presentation"
21718
22190
  prompts : [EstimatePrompt] = [{"answer":300,"hint":"Light covers 300,000 km every second.","prompt":"How many meters does light travel in one microsecond?","unit":"m"},{"answer":212,"hint":"It is 100 °C.","prompt":"What is the boiling point of water at sea level, in Fahrenheit?","unit":"°F"},{"answer":11.6,"hint":"A day is 86,400 seconds.","prompt":"Roughly how many days is one million seconds?","unit":"days"}] @label "Prompts" @description "The question roster; each prompt carries the true numeric answer, an optional unit, and an optional hint. Realizations declare their own subject's quantities here." @tier "domain"
21719
22191
  retryLabel : string = "Try Again" @label "Retry Label" @tier "presentation"
22192
+ rosterSource : string = "config" @label "Roster Source" @description "Where the prompt roster comes from: config reads the prompts knob at INIT; event waits for ROSTER_LOADED and takes the roster from its payload." @tier "domain" @values (config event)
21720
22193
  sliderDefault : number = 100 @label "Slider Default" @description "Starting position of the estimate slider for each prompt." @tier "domain"
21721
22194
  sliderMax : number = 500 @label "Slider Max" @description "Upper bound of the estimate slider." @tier "domain"
21722
22195
  sliderMin : number = 0 @label "Slider Min" @description "Lower bound of the estimate slider." @tier "domain"
@@ -21758,8 +22231,8 @@ trait std-learn-goal-seek.traits.GoalSeekSim {
21758
22231
  linkedEntity : GoalSeekScene
21759
22232
  category : interaction
21760
22233
  states : (idle*)
21761
- events : (INIT MODE_SELECTED SET_PARAM_A SET_PARAM_B CHECK RESET PARAMS_CHANGED GOAL_CHECKED GOAL_RESET LEARN_ROUND_COMPLETE)
21762
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on SET_PARAM_A) (idle -> idle on SET_PARAM_B) (idle -> idle on CHECK) (idle -> idle on RESET))
22234
+ events : (INIT MODE_SELECTED ROSTER_LOADED SET_PARAM_A SET_PARAM_B CHECK RESET PARAMS_CHANGED GOAL_CHECKED GOAL_RESET LEARN_ROUND_COMPLETE)
22235
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on ROSTER_LOADED) (idle -> idle on ROSTER_LOADED) (idle -> idle on SET_PARAM_A) (idle -> idle on SET_PARAM_B) (idle -> idle on CHECK) (idle -> idle on RESET))
21763
22236
  emits : (PARAMS_CHANGED GOAL_CHECKED GOAL_RESET LEARN_ROUND_COMPLETE)
21764
22237
  config {
21765
22238
  checkLabel : string = "Check" @label "Check Label" @tier "presentation"
@@ -21769,7 +22242,7 @@ trait std-learn-goal-seek.traits.GoalSeekSim {
21769
22242
  height : number = 400 @label "Height" @tier "presentation"
21770
22243
  learnerColor : string = "series-2" @label "Learner Color" @tier "presentation"
21771
22244
  learnerLabel : string = "Yours" @label "Learner Label" @tier "presentation"
21772
- matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT." @tier "presentation"
22245
+ matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT (or on ROSTER_LOADED when rosterSource is event)." @tier "presentation"
21773
22246
  paramADefault : number = 1 @label "Parameter A Default" @description "Starting value of the learner's first parameter." @tier "domain"
21774
22247
  paramALabel : string = "A" @label "Parameter A Label" @description "Display label for the first parameter." @tier "presentation"
21775
22248
  paramAMax : number = 5 @label "Parameter A Max" @tier "domain"
@@ -21780,6 +22253,7 @@ trait std-learn-goal-seek.traits.GoalSeekSim {
21780
22253
  paramBMax : number = 5 @label "Parameter B Max" @tier "domain"
21781
22254
  paramBMin : number = -5 @label "Parameter B Min" @tier "domain"
21782
22255
  paramBStep : number = 0.1 @label "Parameter B Step" @tier "presentation"
22256
+ rosterSource : string = "config" @label "Roster Source" @description "Where the problem definition (goalText, curveKind, targetA, targetB) comes from: config reads those knobs at INIT; event waits for ROSTER_LOADED and takes them from its payload." @tier "domain" @values (config event)
21783
22257
  showAxes : boolean = true @label "Show Axes" @tier "presentation"
21784
22258
  showGrid : boolean = true @label "Show Grid" @tier "presentation"
21785
22259
  showLiveDistance : boolean = true @label "Show Live Distance" @description "When true the RMS distance updates live as the learner tunes (warmer/colder); when false only attempts are shown, for a harder variant." @tier "domain"
@@ -21804,8 +22278,8 @@ trait std-learn-grid-sim.traits.GridSimSim {
21804
22278
  linkedEntity : GridSimScene
21805
22279
  category : interaction
21806
22280
  states : (idle*)
21807
- events : (INIT MODE_SELECTED TOGGLE_RUN SPEED_SET RUN PAUSE STEP TAP_CELL RESET RUN_TOGGLED GRID_STEPPED CELL_TOGGLED GRID_RESET)
21808
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on TOGGLE_RUN) (idle -> idle on SPEED_SET) (idle -> idle on RUN) (idle -> idle on PAUSE) (idle -> idle on STEP) (idle -> idle on TAP_CELL) (idle -> idle on RESET))
22281
+ events : (INIT MODE_SELECTED ROSTER_LOADED TOGGLE_RUN SPEED_SET RUN PAUSE STEP TAP_CELL RESET RUN_TOGGLED GRID_STEPPED CELL_TOGGLED GRID_RESET)
22282
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on ROSTER_LOADED) (idle -> idle on ROSTER_LOADED) (idle -> idle on TOGGLE_RUN) (idle -> idle on SPEED_SET) (idle -> idle on RUN) (idle -> idle on PAUSE) (idle -> idle on STEP) (idle -> idle on TAP_CELL) (idle -> idle on RESET))
21809
22283
  emits : (RUN_TOGGLED GRID_STEPPED CELL_TOGGLED GRID_RESET)
21810
22284
  config {
21811
22285
  autoRun : boolean = false @label "Auto Run" @description "Whether the evolution starts running immediately on load." @tier "domain"
@@ -21816,10 +22290,11 @@ trait std-learn-grid-sim.traits.GridSimSim {
21816
22290
  diffuseRate : number = 0.5 @label "Diffuse Rate" @description "Diffusion rule only: how strongly a cell moves toward its neighbourhood average each generation." @tier "domain"
21817
22291
  height : number = 332 @label "Height" @tier "presentation"
21818
22292
  lowColor : string = "muted" @label "Low Color" @tier "presentation"
21819
- matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT." @tier "presentation"
22293
+ matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT (or on ROSTER_LOADED when rosterSource is event)." @tier "presentation"
21820
22294
  midColor : string = "series-3" @label "Mid Color" @tier "presentation"
21821
22295
  offColor : string = "fill" @label "Off Color" @tier "presentation"
21822
22296
  onColor : string = "series-2" @label "On Color" @tier "presentation"
22297
+ rosterSource : string = "config" @label "Roster Source" @description "Where the world definition (taskText, rule, rows, cols, seeds) comes from: config reads those knobs at INIT; event waits for ROSTER_LOADED and takes them from its payload." @tier "domain" @values (config event)
21823
22298
  rows : number = 12 @label "Rows" @tier "domain"
21824
22299
  rule : string = "life" @label "Rule" @description "The local update rule: life (Conway birth-3 survive-2-3), spread (an active 4-neighbour activates a cell), or diffusion (cells relax toward the neighbourhood average with decay)." @synonyms "game of life, contagion, wavefront, heat diffusion, cellular automaton rule" @tier "domain"
21825
22300
  seeds : [number] = [1,18,32,33,34,88,89,90] @label "Seeds" @description "Flat cell indexes (row·cols + col) active at the start — the default plants a glider and a blinker. Realizations declare their own starting pattern here." @tier "domain"
@@ -21839,8 +22314,8 @@ trait std-learn-hotspot.traits.HotspotSim {
21839
22314
  linkedEntity : HotspotScene
21840
22315
  category : interaction
21841
22316
  states : (idle*)
21842
- events : (INIT MODE_SELECTED TAP_SHAPE NEXT RETRY TAP_JUDGED PROMPT_ADVANCED ROUND_RESTARTED LEARN_ROUND_COMPLETE)
21843
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on TAP_SHAPE) (idle -> idle on NEXT) (idle -> idle on RETRY))
22317
+ events : (INIT MODE_SELECTED ROSTER_LOADED TAP_SHAPE NEXT RETRY TAP_JUDGED PROMPT_ADVANCED ROUND_RESTARTED LEARN_ROUND_COMPLETE)
22318
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on ROSTER_LOADED) (idle -> idle on ROSTER_LOADED) (idle -> idle on TAP_SHAPE) (idle -> idle on NEXT) (idle -> idle on RETRY))
21844
22319
  emits : (TAP_JUDGED PROMPT_ADVANCED ROUND_RESTARTED LEARN_ROUND_COMPLETE)
21845
22320
  config {
21846
22321
  backgroundColor : string = "" @label "Background Color" @tier "presentation"
@@ -21850,6 +22325,7 @@ trait std-learn-hotspot.traits.HotspotSim {
21850
22325
  nextLabel : string = "Next" @label "Next Label" @tier "presentation"
21851
22326
  prompts : [HotspotPrompt] = [{"explanation":"The nucleus holds the DNA.","prompt":"Tap the part that stores the cell's genetic material.","targetId":"nucleus"},{"explanation":"Mitochondria run cellular respiration.","prompt":"Tap the part that produces the cell's energy.","targetId":"mitochondrion"},{"explanation":"Ribosomes translate mRNA into protein.","prompt":"Tap the part that builds proteins.","targetId":"ribosome"}] @label "Prompts" @description "The question roster; each prompt names a target hotspot id and an explanation revealed on a hit." @tier "domain"
21852
22327
  retryLabel : string = "Try Again" @label "Retry Label" @tier "presentation"
22328
+ rosterSource : string = "config" @label "Roster Source" @description "Where the shapes and prompts roster comes from: config reads the shapes and prompts knobs at INIT; event waits for ROSTER_LOADED and takes the roster from its payload." @tier "domain" @values (config event)
21853
22329
  shapes : [HotspotShape] = [{"color":"series-1","id":"nucleus","label":"Nucleus","radius":34,"x":300,"y":170},{"color":"series-2","id":"membrane","label":"Membrane","radius":26,"x":130,"y":120},{"color":"series-3","id":"mitochondrion","label":"Mitochondrion","radius":24,"x":460,"y":120},{"color":"series-4","id":"ribosome","label":"Ribosome","radius":18,"x":200,"y":280},{"color":"series-5","id":"vacuole","label":"Vacuole","radius":28,"x":420,"y":280}] @label "Hotspots" @description "The labeled parts of the scene; each carries an id, display label, canvas position, radius, and color. Realizations declare their own subject's parts here." @tier "domain"
21854
22330
  summary : string = "" @label "Concept" @description "One line under the title saying what is being identified (keep it under ~65 characters). Empty shows no line." @tier "presentation"
21855
22331
  title : string = "Tap the Part" @label "Title" @description "Title shown above the canvas." @tier "presentation"
@@ -21865,17 +22341,18 @@ trait std-learn-live-sim.traits.LiveSimSim {
21865
22341
  linkedEntity : LiveSimScene
21866
22342
  category : interaction
21867
22343
  states : (idle*)
21868
- events : (INIT MODE_SELECTED TOGGLE_RUN RUN PAUSE RESET SET_GRAVITY SET_DAMPING RUN_TOGGLED SIM_RESET)
21869
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on TOGGLE_RUN) (idle -> idle on RUN) (idle -> idle on PAUSE) (idle -> idle on RESET) (idle -> idle on SET_GRAVITY) (idle -> idle on SET_DAMPING))
22344
+ events : (INIT MODE_SELECTED ROSTER_LOADED TOGGLE_RUN RUN PAUSE RESET SET_GRAVITY SET_DAMPING RUN_TOGGLED SIM_RESET)
22345
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on ROSTER_LOADED) (idle -> idle on ROSTER_LOADED) (idle -> idle on TOGGLE_RUN) (idle -> idle on RUN) (idle -> idle on PAUSE) (idle -> idle on RESET) (idle -> idle on SET_GRAVITY) (idle -> idle on SET_DAMPING))
21870
22346
  emits : (RUN_TOGGLED SIM_RESET)
21871
22347
  config {
21872
22348
  backgroundColor : string = "" @label "Background Color" @description "Canvas ground override; empty uses the theme's drawing ground." @tier "presentation"
21873
- bodies : [LiveSimBody] = [{"color":"series-1","id":"ball-a","radius":14,"vx":4,"vy":0,"x":100,"y":60},{"color":"series-2","id":"ball-b","radius":18,"vx":-3,"vy":2,"x":260,"y":90},{"color":"series-3","id":"ball-c","radius":11,"vx":2,"vy":-1,"x":420,"y":40}] @label "Bodies" @description "Initial bodies; each carries position (x,y), radius, color, and velocity (vx,vy). Restored on Reset." @tier "presentation"
22349
+ bodies : [LiveSimBody] = [{"color":"series-1","id":"ball-a","radius":14,"vx":4,"vy":0,"x":100,"y":60},{"color":"series-2","id":"ball-b","radius":18,"vx":-3,"vy":2,"x":260,"y":90},{"color":"series-3","id":"ball-c","radius":11,"vx":2,"vy":-1,"x":420,"y":40}] @label "Bodies" @description "Initial bodies; each carries position (x,y), radius, color, and velocity (vx,vy). Restored on Reset. Used when rosterSource is config." @tier "presentation"
21874
22350
  damping : number = 0.995 @label "Damping" @description "Initial fraction of velocity retained each tick (air resistance); adjustable live via the Damping slider." @tier "domain"
21875
22351
  gravity : number = 0.4 @label "Gravity" @description "Initial downward acceleration added to each body's vy every tick; adjustable live via the Gravity slider." @tier "domain"
21876
22352
  height : number = 400 @label "Height" @description "Simulation height in pixels; bounds the bounce." @tier "presentation"
21877
- matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT." @tier "presentation"
22353
+ matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT (or on ROSTER_LOADED when rosterSource is event)." @tier "presentation"
21878
22354
  restitution : number = 0.78 @label "Restitution" @description "Fraction of speed kept when a body bounces off a wall." @tier "domain"
22355
+ rosterSource : string = "config" @label "Roster Source" @description "Where the body roster comes from: config reads the bodies knob at INIT; event waits for ROSTER_LOADED and takes the bodies from its payload." @tier "domain" @values (config event)
21879
22356
  running : boolean = false @label "Running" @description "Whether the simulation starts already running on INIT." @tier "domain"
21880
22357
  showVelocity : boolean = true @label "Show Velocity" @description "Draw each body's velocity vector as an arrow." @tier "presentation"
21881
22358
  summary : string = "" @label "Concept" @description "One line under the title saying what the learner is looking at (keep it under ~65 characters). Empty shows no line." @tier "presentation"
@@ -22007,8 +22484,8 @@ trait std-learn-predict.traits.PredictSim {
22007
22484
  linkedEntity : PredictScene
22008
22485
  category : interaction
22009
22486
  states : (idle*)
22010
- events : (INIT MODE_SELECTED PREDICT NEXT RETRY PREDICTION_COMMITTED SCENARIO_ADVANCED ROUND_RESTARTED LEARN_ROUND_COMPLETE)
22011
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on PREDICT) (idle -> idle on NEXT) (idle -> idle on RETRY))
22487
+ events : (INIT MODE_SELECTED ROSTER_LOADED PREDICT NEXT RETRY PREDICTION_COMMITTED SCENARIO_ADVANCED ROUND_RESTARTED LEARN_ROUND_COMPLETE)
22488
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on ROSTER_LOADED) (idle -> idle on ROSTER_LOADED) (idle -> idle on PREDICT) (idle -> idle on NEXT) (idle -> idle on RETRY))
22012
22489
  emits : (PREDICTION_COMMITTED SCENARIO_ADVANCED ROUND_RESTARTED LEARN_ROUND_COMPLETE)
22013
22490
  config {
22014
22491
  gridStep : number = 25 @label "Grid Step" @tier "presentation"
@@ -22018,6 +22495,7 @@ trait std-learn-predict.traits.PredictSim {
22018
22495
  retryLabel : string = "Try Again" @label "Retry Label" @tier "presentation"
22019
22496
  revealColor : string = "series-1" @label "Reveal Color" @tier "presentation"
22020
22497
  revealLabel : string = "Outcome" @label "Reveal Label" @tier "presentation"
22498
+ rosterSource : string = "config" @label "Roster Source" @description "Where the scenario roster comes from: config reads the scenarios knob at INIT; event waits for ROSTER_LOADED and takes the roster from its payload." @tier "domain" @values (config event)
22021
22499
  scenarios : [PredictScenario] = [{"correctIndex":1,"explanation":"With no limiting factor yet, growth compounds each season.","frames":[{"caption":"Season 1: 40 rabbits","value":40},{"caption":"Season 2: 52 rabbits","value":52},{"caption":"Season 3: 68 rabbits","value":68},{"caption":"Season 4: 88 rabbits","value":88},{"caption":"Season 5: 114 rabbits","value":114},{"caption":"Season 6: 148 rabbits — still accelerating","value":148}],"options":["It levels off","It keeps accelerating","It collapses"],"question":"What happens to the population over the next six seasons?","setup":"A small island hosts 40 rabbits with unlimited grass and no predators."},{"correctIndex":1,"explanation":"Predation and food limits impose a carrying capacity.","frames":[{"caption":"Season 1: 148 rabbits","value":148},{"caption":"Season 2: 160 rabbits","value":160},{"caption":"Season 3: 166 rabbits","value":166},{"caption":"Season 4: 169 rabbits","value":169},{"caption":"Season 5: 170 rabbits — the curve flattens","value":170}],"options":["It keeps accelerating","It levels off near a ceiling","It grows linearly"],"question":"What happens to the rabbit population now?","setup":"The same island now has foxes, and grass is running short."}] @label "Scenarios" @description "The scenario roster; each carries a setup, the question, the offered predictions with the correct index, an explanation, and the reveal frames (caption + value) that play out after the learner commits. Realizations declare their own subject's scenarios here." @tier "domain"
22022
22500
  summary : string = "" @label "Concept" @description "One line under the title saying what is being predicted (keep it under ~65 characters). Empty shows no line." @tier "presentation"
22023
22501
  title : string = "Predict, Then Watch" @label "Title" @description "Title shown above the instrument." @tier "presentation"
@@ -22060,8 +22538,8 @@ trait std-learn-sandbox.traits.LearnSandboxSim {
22060
22538
  linkedEntity : LearnSandboxScene
22061
22539
  category : interaction
22062
22540
  states : (idle*)
22063
- events : (INIT MODE_SELECTED TOGGLE RESET SYSTEM_CHANGED SANDBOX_RESET)
22064
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on TOGGLE) (idle -> idle on RESET))
22541
+ events : (INIT MODE_SELECTED ROSTER_LOADED TOGGLE RESET SYSTEM_CHANGED SANDBOX_RESET)
22542
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on ROSTER_LOADED) (idle -> idle on ROSTER_LOADED) (idle -> idle on TOGGLE) (idle -> idle on RESET))
22065
22543
  emits : (SYSTEM_CHANGED SANDBOX_RESET)
22066
22544
  config {
22067
22545
  animate : boolean = false @label "Animate" @description "Enable continuous redraw loop." @tier "presentation"
@@ -22074,10 +22552,11 @@ trait std-learn-sandbox.traits.LearnSandboxSim {
22074
22552
  height : number = 320 @label "Height" @description "Canvas height in pixels." @tier "presentation"
22075
22553
  interactive : boolean = false @label "Interactive" @description "Enable pointer interaction on the canvas." @tier "presentation"
22076
22554
  links : [LearnSandboxLink] = [{"from":"a","to":"b"},{"from":"b","to":"c"},{"from":"a","to":"d"},{"from":"d","to":"e"}] @label "Links" @description "Declared relationships drawn between elements; a link dims when either endpoint is disabled." @synonyms "link, edge, connection, dependency, relationship" @tier "domain"
22077
- matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT." @tier "presentation"
22555
+ matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT, or on ROSTER_LOADED when rosterSource is event." @tier "presentation"
22078
22556
  nodeRadius : number = 34 @label "Node Radius" @tier "presentation"
22079
22557
  outcomeLabel : string = "System Status" @label "Outcome Label" @description "Label prefix used in the readout describing the derived total and hold status." @tier "presentation"
22080
22558
  resetLabel : string = "Reset" @label "Reset Button Label" @tier "presentation"
22559
+ rosterSource : string = "config" @label "Roster Source" @description "Where the roster comes from: config reads elements and links knobs at INIT; event waits for ROSTER_LOADED and takes the roster from its payload." @tier "domain" @values (config event)
22081
22560
  summary : string = "" @label "Concept" @description "One line under the title saying what the system models (keep it under ~65 characters). Empty shows no line." @tier "presentation"
22082
22561
  threshold : number = 60 @label "Threshold" @description "The summed weight of enabled elements must reach this value for the system to hold." @synonyms "threshold, tipping point, sufficient total" @tier "domain"
22083
22562
  title : string = "System Sandbox" @label "Title" @description "Title shown above the instrument." @tier "presentation"
@@ -22093,8 +22572,8 @@ trait std-learn-scatter-fit.traits.LearnScatterFitSim {
22093
22572
  linkedEntity : LearnScatterFitScene
22094
22573
  category : interaction
22095
22574
  states : (idle*)
22096
- events : (INIT MODE_SELECTED ADD_POINT DRAG_POINT GUESS_LINE REVEAL_FIT TOGGLE_RUN RESET LEARN_SCATTER_FIT_UPDATED LEARN_ROUND_COMPLETE)
22097
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on ADD_POINT) (idle -> idle on DRAG_POINT) (idle -> idle on GUESS_LINE) (idle -> idle on REVEAL_FIT) (idle -> idle on TOGGLE_RUN) (idle -> idle on RESET))
22575
+ events : (INIT MODE_SELECTED ROSTER_LOADED ADD_POINT DRAG_POINT GUESS_LINE REVEAL_FIT TOGGLE_RUN RESET LEARN_SCATTER_FIT_UPDATED LEARN_ROUND_COMPLETE)
22576
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on ROSTER_LOADED) (idle -> idle on ROSTER_LOADED) (idle -> idle on ADD_POINT) (idle -> idle on DRAG_POINT) (idle -> idle on GUESS_LINE) (idle -> idle on REVEAL_FIT) (idle -> idle on TOGGLE_RUN) (idle -> idle on RESET))
22098
22577
  emits : (LEARN_SCATTER_FIT_UPDATED LEARN_ROUND_COMPLETE)
22099
22578
  config {
22100
22579
  addPointLabel : string = "Add Point" @label "Add Point Button Label" @tier "presentation"
@@ -22121,7 +22600,7 @@ trait std-learn-scatter-fit.traits.LearnScatterFitSim {
22121
22600
  height : number = 400 @label "Height" @description "Canvas height in pixels." @tier "presentation"
22122
22601
  initialPoints : [LearnScatterFitPoint] = [{"color":"ink","id":"p0","label":"","radius":5,"x":15,"y":25},{"color":"ink","id":"p1","label":"","radius":5,"x":32,"y":40},{"color":"ink","id":"p2","label":"","radius":5,"x":48,"y":44},{"color":"ink","id":"p3","label":"","radius":5,"x":63,"y":62},{"color":"ink","id":"p4","label":"","radius":5,"x":80,"y":70}] @label "Initial Points" @description "Scatter points the canvas starts with, in axis data coordinates; Reset reseeds from this roster." @synonyms "seed points, dataset, scatter data, sample" @tier "domain"
22123
22602
  interactive : boolean = true @label "Interactive" @description "Enable pointer interaction on the canvas — required for dragging points." @tier "presentation"
22124
- matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT." @tier "presentation"
22603
+ matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT, or on ROSTER_LOADED when rosterSource is event." @tier "presentation"
22125
22604
  maxPoints : number = 20 @label "Max Points" @description "Cap on accumulated scatter points; Add Point and the auto-run tick stop once reached, until Reset." @tier "domain"
22126
22605
  narrationAddedTemplate : string = "point added" @label "Added Narration Template" @description "Narration phrase after a point is added (button or tick), assembled as \"<template> <n> — r = .., R² = ..\"." @tier "domain"
22127
22606
  narrationAutoAddingTemplate : string = "Auto-adding — tick adds a new point." @label "Auto-Adding Narration" @description "Narration shown after Run is pressed." @tier "domain"
@@ -22139,6 +22618,7 @@ trait std-learn-scatter-fit.traits.LearnScatterFitSim {
22139
22618
  residualColor : string = "guide" @label "Residual Color" @tier "presentation"
22140
22619
  residualDash : string = "dashed" @label "Residual Dash Style" @tier "presentation" @values (dashed dotted)
22141
22620
  revealLabel : string = "Reveal Fit" @label "Reveal Fit Button Label" @tier "presentation"
22621
+ rosterSource : string = "config" @label "Roster Source" @description "Where the roster comes from: config reads initialPoints knob at INIT; event waits for ROSTER_LOADED and takes the roster from its payload." @tier "domain" @values (config event)
22142
22622
  runLabel : string = "Run" @label "Run Button Label" @tier "presentation"
22143
22623
  showAxes : boolean = true @label "Show Axes" @tier "presentation"
22144
22624
  showGrid : boolean = true @label "Show Grid" @tier "presentation"
@@ -22159,17 +22639,18 @@ trait std-learn-scenario.traits.ScenarioSim {
22159
22639
  linkedEntity : ScenarioScene
22160
22640
  category : interaction
22161
22641
  states : (idle*)
22162
- events : (INIT MODE_SELECTED CHOOSE RESTART CHOICE_MADE SCENARIO_RESTARTED)
22163
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on CHOOSE) (idle -> idle on RESTART))
22642
+ events : (INIT MODE_SELECTED ROSTER_LOADED CHOOSE RESTART CHOICE_MADE SCENARIO_RESTARTED)
22643
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on ROSTER_LOADED) (idle -> idle on ROSTER_LOADED) (idle -> idle on CHOOSE) (idle -> idle on RESTART))
22164
22644
  emits : (CHOICE_MADE SCENARIO_RESTARTED)
22165
22645
  config {
22166
- matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT." @tier "presentation"
22646
+ matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT, or on ROSTER_LOADED when rosterSource is event." @tier "presentation"
22167
22647
  metricALabel : string = "Budget" @label "Metric A Label" @description "Display name of the first tracked consequence metric." @tier "domain"
22168
22648
  metricAStart : number = 100 @label "Metric A Start" @tier "domain"
22169
22649
  metricBLabel : string = "Support" @label "Metric B Label" @description "Display name of the second tracked consequence metric." @tier "domain"
22170
22650
  metricBStart : number = 50 @label "Metric B Start" @tier "domain"
22171
22651
  nodes : [ScenarioNode] = [{"choices":[{"deltaA":-60,"deltaB":10,"label":"Build a levee now","next":"levee","note":"Fast protection, most of the budget gone."},{"deltaA":-25,"deltaB":-5,"label":"Restore the upstream wetlands","next":"wetlands","note":"Cheaper and greener, but slower to work."}],"id":"start","situation":"Your town's river floods every spring. The council asks you to lead the response."},{"choices":[{"deltaA":-30,"deltaB":-10,"label":"Raise the levee again","next":"end-lock-in","note":"Costs keep compounding."},{"deltaA":-20,"deltaB":15,"label":"Add wetlands as a second line","next":"end-hybrid","note":"Late, but it eases the pressure."}],"id":"levee","situation":"The levee holds the first spring, but silt builds up and the river rises higher each year."},{"choices":[{"deltaA":-15,"deltaB":25,"label":"Expand the wetland corridor","next":"end-green","note":"The town rallies behind the project."},{"deltaA":10,"deltaB":5,"label":"Bank the savings","next":"end-thrifty","note":"Prudent, though the corridor stays small."}],"id":"wetlands","situation":"Two springs pass; the wetlands now absorb most floods, and wildlife is returning."},{"choices":[],"id":"end-lock-in","situation":"You are locked into an arms race with the river: protected, but at ever-growing cost."},{"choices":[],"id":"end-hybrid","situation":"The hybrid defense works: the levee buys time and the wetlands cut the peak floods."},{"choices":[],"id":"end-green","situation":"The restored river corridor protects the town and becomes its most loved public space."},{"choices":[],"id":"end-thrifty","situation":"The town stays safe in normal years, with savings in reserve for a bigger flood."}] @label "Nodes" @description "The decision graph; each node carries a situation and its choices, each choice naming the next node, metric deltas, and a consequence note. A node with no choices ends the run. Realizations declare their own subject's decision tree here." @tier "domain"
22172
22652
  restartLabel : string = "Play Again" @label "Restart Label" @tier "presentation"
22653
+ rosterSource : string = "config" @label "Roster Source" @description "Where the roster comes from: config reads nodes and startId knobs at INIT; event waits for ROSTER_LOADED and takes the roster from its payload." @tier "domain" @values (config event)
22173
22654
  startId : string = "start" @label "Start Node" @description "Id of the node the scenario opens on." @tier "domain"
22174
22655
  summary : string = "" @label "Concept" @description "One line under the title saying what the scenario explores (keep it under ~65 characters). Empty shows no line." @tier "presentation"
22175
22656
  title : string = "Decision Scenario" @label "Title" @description "Title shown above the scenario." @tier "presentation"
@@ -22223,15 +22704,16 @@ trait std-learn-speed-drill.traits.SpeedDrillSim {
22223
22704
  linkedEntity : SpeedDrillScene
22224
22705
  category : interaction
22225
22706
  states : (idle*)
22226
- events : (INIT MODE_SELECTED ANSWER NEXT RETRY ANSWER_JUDGED PROMPT_ADVANCED ROUND_RESTARTED LEARN_ROUND_COMPLETE)
22227
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on ANSWER) (idle -> idle on NEXT) (idle -> idle on RETRY))
22707
+ events : (INIT MODE_SELECTED ROSTER_LOADED ANSWER NEXT RETRY ANSWER_JUDGED PROMPT_ADVANCED ROUND_RESTARTED LEARN_ROUND_COMPLETE)
22708
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on ROSTER_LOADED) (idle -> idle on ROSTER_LOADED) (idle -> idle on ANSWER) (idle -> idle on NEXT) (idle -> idle on RETRY))
22228
22709
  emits : (ANSWER_JUDGED PROMPT_ADVANCED ROUND_RESTARTED LEARN_ROUND_COMPLETE)
22229
22710
  config {
22230
22711
  basePoints : number = 10 @label "Base Points" @description "Points for a correct answer regardless of speed." @tier "domain"
22231
22712
  items : [SpeedDrillItem] = [{"correctIndex":1,"options":["54","56","63","48"],"prompt":"7 × 8"},{"correctIndex":0,"options":["54","56","45","63"],"prompt":"9 × 6"},{"correctIndex":2,"options":["124","132","144","148"],"prompt":"12 × 12"}] @label "Items" @description "The drill roster; each item carries a prompt, its options, and the index of the correct option. Realizations declare their own subject's items here." @tier "domain"
22232
- matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT." @tier "presentation"
22713
+ matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT, or on ROSTER_LOADED when rosterSource is event." @tier "presentation"
22233
22714
  nextLabel : string = "Next" @label "Next Label" @tier "presentation"
22234
22715
  retryLabel : string = "Try Again" @label "Retry Label" @tier "presentation"
22716
+ rosterSource : string = "config" @label "Roster Source" @description "Where the roster comes from: config reads items knob at INIT; event waits for ROSTER_LOADED and takes the roster from its payload." @tier "domain" @values (config event)
22235
22717
  speedBonus : number = 10 @label "Speed Bonus" @description "Maximum extra points awarded in proportion to the time left on the clock." @tier "domain"
22236
22718
  summary : string = "" @label "Concept" @description "One line under the title saying what is being drilled (keep it under ~65 characters). Empty shows no line." @tier "presentation"
22237
22719
  timeLimit : number = 6 @label "Time Limit" @description "Seconds the learner has to answer each item before it counts as a miss." @tier "domain"
@@ -22247,8 +22729,8 @@ trait std-learn-stepper.traits.LearnStepperSim {
22247
22729
  linkedEntity : LearnStepperScene
22248
22730
  category : interaction
22249
22731
  states : (idle*)
22250
- events : (INIT MODE_SELECTED NEXT PREV FILTER_CATEGORY RESET_STEPPER STEPPER_ADVANCED)
22251
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on NEXT) (idle -> idle on PREV) (idle -> idle on FILTER_CATEGORY) (idle -> idle on RESET_STEPPER))
22732
+ events : (INIT MODE_SELECTED ROSTER_LOADED NEXT PREV FILTER_CATEGORY RESET_STEPPER STEPPER_ADVANCED)
22733
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on ROSTER_LOADED) (idle -> idle on ROSTER_LOADED) (idle -> idle on NEXT) (idle -> idle on PREV) (idle -> idle on FILTER_CATEGORY) (idle -> idle on RESET_STEPPER))
22252
22734
  emits : (STEPPER_ADVANCED)
22253
22735
  config {
22254
22736
  allLabel : string = "All" @label "All Filter Label" @tier "presentation"
@@ -22268,6 +22750,7 @@ trait std-learn-stepper.traits.LearnStepperSim {
22268
22750
  matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT." @tier "presentation"
22269
22751
  maxPosition : number = 4 @label "Max Position" @description "Latest position on the axis (after the last stage)." @tier "domain"
22270
22752
  minPosition : number = 0 @label "Min Position" @description "Earliest position on the axis (before the first stage)." @tier "domain"
22753
+ rosterSource : string = "config" @label "Roster Source" @description "Where the stages, categories and category summaries come from: config reads those knobs at INIT; event waits for ROSTER_LOADED and takes them from its payload. The axis range (minPosition/maxPosition) stays config." @tier "domain" @values (config event)
22271
22754
  stages : [LearnStepperStage] = [{"category":"a","description":"First stage in the sequence.","id":"stage-1","label":"Stage One","position":1},{"category":"b","description":"Second stage in the sequence.","id":"stage-2","label":"Stage Two","position":2},{"category":"a","description":"Third stage in the sequence.","id":"stage-3","label":"Stage Three","position":3}] @label "Stages" @description "Ordered roster of stages (position, label, category, description) stepped through by NEXT/PREV and filtered by FILTER_CATEGORY. Sorted ascending by position." @synonyms "stage roster, sequence, timeline, cycle, phase, event roster, ordered stages" @tier "domain"
22272
22755
  startPrompt : string = "Press Next to begin." @label "Start Prompt" @description "Narration shown before the learner has advanced past the first stage." @tier "presentation"
22273
22756
  summary : string = "" @label "Concept" @description "One line under the title saying what the learner is looking at (keep it under ~65 characters). Empty shows no line." @tier "presentation"
@@ -22285,8 +22768,8 @@ trait std-learn-tour-3d.traits.Learn3DTourSim {
22285
22768
  linkedEntity : Learn3DTourScene
22286
22769
  category : interaction
22287
22770
  states : (idle*)
22288
- events : (INIT MODE_SELECTED TOUR SELECT_STATION RESET SYNC_STATIONS TOUR_3D_UPDATED LEARN_ROUND_COMPLETE)
22289
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on TOUR) (idle -> idle on SELECT_STATION) (idle -> idle on RESET) (idle -> idle on SYNC_STATIONS))
22771
+ events : (INIT MODE_SELECTED ROSTER_LOADED TOUR SELECT_STATION RESET SYNC_STATIONS TOUR_3D_UPDATED LEARN_ROUND_COMPLETE)
22772
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on ROSTER_LOADED) (idle -> idle on ROSTER_LOADED) (idle -> idle on TOUR) (idle -> idle on SELECT_STATION) (idle -> idle on RESET) (idle -> idle on SYNC_STATIONS))
22290
22773
  emits : (TOUR_3D_UPDATED LEARN_ROUND_COMPLETE)
22291
22774
  config {
22292
22775
  azimuth : number = 0.6 @label "Azimuth" @description "Camera orbit azimuth in radians; the learner can orbit freely on top of this." @tier "presentation"
@@ -22299,6 +22782,7 @@ trait std-learn-tour-3d.traits.Learn3DTourSim {
22299
22782
  matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT." @tier "presentation"
22300
22783
  post : Post3D = {} @label "Post Processing" @description "3D post-processing stack (bloom/vignette) as data; empty object disables it." @tier "presentation"
22301
22784
  resetLabel : string = "Reset" @label "Reset Button Label" @description "Label text for the button that returns the tour to the first station." @tier "presentation"
22785
+ rosterSource : string = "config" @label "Roster Source" @description "Where the stations, edges and backdrop come from: config reads those knobs at INIT; event waits for ROSTER_LOADED and takes them from its payload." @tier "domain" @values (config event)
22302
22786
  stations : [Learn3DStation] = [{"caption":"The first stop on the tour — the camera retargets here and the narration reads its caption.","color":"series-1","id":"alpha","name":"Station Alpha","opacity":1,"radius":1,"shape":"sphere","x":0,"y":0,"z":0},{"caption":"The second stop — press Tour again or click a shape to advance the selection.","color":"series-2","id":"beta","name":"Station Beta","opacity":1,"radius":0.8,"shape":"sphere","x":3,"y":1,"z":-1},{"caption":"The final stop — once every station has been visited the tour marks itself complete.","color":"series-3","id":"gamma","name":"Station Gamma","opacity":1,"radius":0.8,"shape":"sphere","x":-3,"y":-1,"z":1}] @label "Stations" @description "The station roster in didactic tour order — each with scene position, mesh shape, and a caption. Tour and clicks enlarge the selected station, retarget the camera onto its x/y/z, and narrate its caption." @synonyms "station, stop, waypoint, tour, landmark, 3d" @tier "domain"
22303
22787
  summary : string = "" @label "Concept" @description "One line under the title saying what the learner is looking at (keep it under ~65 characters). Empty shows no line." @tier "presentation"
22304
22788
  title : string = "3D Guided Tour" @label "Title" @description "Title shown above the canvas." @tier "presentation"
@@ -22316,8 +22800,8 @@ trait std-learn-trace-player.traits.TracePlayerSim {
22316
22800
  linkedEntity : TracePlayerScene
22317
22801
  category : interaction
22318
22802
  states : (idle*)
22319
- events : (INIT MODE_SELECTED TOGGLE_RUN SPEED_SET PLAY PAUSE RESTART FRAME_ADVANCED TRACE_DONE)
22320
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on TOGGLE_RUN) (idle -> idle on SPEED_SET) (idle -> idle on PLAY) (idle -> idle on PAUSE) (idle -> idle on RESTART))
22803
+ events : (INIT MODE_SELECTED ROSTER_LOADED TOGGLE_RUN SPEED_SET PLAY PAUSE RESTART FRAME_ADVANCED TRACE_DONE)
22804
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on ROSTER_LOADED) (idle -> idle on ROSTER_LOADED) (idle -> idle on TOGGLE_RUN) (idle -> idle on SPEED_SET) (idle -> idle on PLAY) (idle -> idle on PAUSE) (idle -> idle on RESTART))
22321
22805
  emits : (FRAME_ADVANCED TRACE_DONE)
22322
22806
  config {
22323
22807
  backgroundColor : string = "" @label "Background Color" @description "Canvas ground override; empty uses the theme's drawing ground." @tier "presentation"
@@ -22327,6 +22811,7 @@ trait std-learn-trace-player.traits.TracePlayerSim {
22327
22811
  highlightColor : string = "highlight" @label "Highlight Bar Color" @description "Color of bars whose index appears in the current frame's highlights." @tier "presentation"
22328
22812
  loop : boolean = false @label "Loop" @description "When true, autoplay wraps from the last frame back to the first instead of stopping and emitting TRACE_DONE." @tier "domain"
22329
22813
  matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT." @tier "presentation"
22814
+ rosterSource : string = "config" @label "Roster Source" @description "Where the frame roster comes from: config reads the frames knob at INIT; event waits for ROSTER_LOADED and takes the roster from its payload." @tier "domain" @values (config event)
22330
22815
  summary : string = "" @label "Concept" @description "One line under the title saying what the learner is looking at (keep it under ~65 characters). Empty shows no line." @tier "presentation"
22331
22816
  tickMs : number = 500 @label "Tick Milliseconds" @description "Milliseconds per frame shown in the readout; the autoplay cadence." @tier "presentation"
22332
22817
  title : string = "Trace Player" @label "Title" @description "The instrument's name, the header's one hero." @tier "presentation"
@@ -22350,7 +22835,7 @@ trait std-learn-transport.traits.LearnTransportSim {
22350
22835
  matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT." @tier "presentation"
22351
22836
  stepIntervalMs : number = 500 @label "Step Interval (ms)" @description "Milliseconds of running clock per domain step — the 32ms base tick accumulates elapsed time and fires LEARN_STEP each time this interval elapses. 300-900 suits narrated steppers; 32 fires every frame for continuous sims." @tier "domain"
22352
22837
  summary : string = "" @label "Concept" @description "One line under the title saying what the learner is looking at (keep it under ~65 characters). Empty shows no line." @tier "presentation"
22353
- title : string = "Learning Instrument" @label "Title" @description "The instrument's name, the header's one hero." @tier "presentation"
22838
+ title : string = "Learning Instrument" @label "Title" @description "The instrument's name, the header's one hero. Empty shows no title." @tier "presentation"
22354
22839
  totalSteps : int = 0 @label "Total Steps" @description "When the walk has a known length, the step counter reads 'Step N of M'. 0 means open-ended." @tier "presentation"
22355
22840
  }
22356
22841
  override-surface : (linkedEntity name events effects listens emitsScope config)
@@ -22363,8 +22848,8 @@ trait std-learn-tree.traits.LearnTreeSim {
22363
22848
  linkedEntity : LearnTreeScene
22364
22849
  category : interaction
22365
22850
  states : (idle*)
22366
- events : (INIT MODE_SELECTED INSERT_VALUE DELETE_VALUE RUN_TRAVERSAL TOGGLE_RUN RESET TREE_UPDATED)
22367
- transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on INSERT_VALUE) (idle -> idle on DELETE_VALUE) (idle -> idle on RUN_TRAVERSAL) (idle -> idle on TOGGLE_RUN) (idle -> idle on RESET))
22851
+ events : (INIT MODE_SELECTED ROSTER_LOADED INSERT_VALUE DELETE_VALUE RUN_TRAVERSAL TOGGLE_RUN RESET TREE_UPDATED)
22852
+ transitions : ((idle -> idle on INIT) (idle -> idle on MODE_SELECTED) (idle -> idle on MODE_SELECTED) (idle -> idle on ROSTER_LOADED) (idle -> idle on ROSTER_LOADED) (idle -> idle on INSERT_VALUE) (idle -> idle on DELETE_VALUE) (idle -> idle on RUN_TRAVERSAL) (idle -> idle on TOGGLE_RUN) (idle -> idle on RESET))
22368
22853
  emits : (TREE_UPDATED)
22369
22854
  config {
22370
22855
  autoRun : boolean = false @label "Auto Run" @description "When true, the tick auto-steps the traversal sweep started by Traverse; toggle live with the Run/Pause button. Has no effect on Insert/Delete, which stay manual." @synonyms "auto run, auto step, auto play" @tier "domain"
@@ -22372,6 +22857,7 @@ trait std-learn-tree.traits.LearnTreeSim {
22372
22857
  balanced : boolean = false @label "Balance Readout" @description "When true, each insert's narration reports the tree's current height against its node count so the learner can judge balance; no auto-rotation is performed." @synonyms "balance, height, balance readout" @tier "domain"
22373
22858
  height : number = 400 @label "Height" @description "Canvas height in pixels." @tier "presentation"
22374
22859
  matchMode : string = "" @label "Match Mode" @description "When composed behind a lab router, the MODE_SELECTED mode value this instrument responds to. Empty string means standalone — render immediately on INIT." @tier "presentation"
22860
+ rosterSource : string = "config" @label "Roster Source" @description "Where the insertion values come from: config reads the values knob at INIT; event waits for ROSTER_LOADED and takes them from its payload." @tier "domain" @values (config event)
22375
22861
  showComparisons : boolean = true @label "Show Comparisons" @description "Include each left/right comparison in the narration while a value descends; turn off for a terse attach-only narration." @synonyms "comparisons, narration detail" @tier "presentation"
22376
22862
  summary : string = "" @label "Concept" @description "One line under the title saying what the learner is looking at (keep it under ~65 characters). Empty shows no line." @tier "presentation"
22377
22863
  title : string = "Ordered Tree" @label "Title" @description "Title shown above the canvas." @tier "presentation"
@@ -22969,6 +23455,81 @@ trait std-pad-lock.traits.PadLock {
22969
23455
  source : "@almadar/std (behaviors/registry/ui/game/atoms/std-pad-lock.orb orbitals[0].traits[0])"
22970
23456
  }
22971
23457
 
23458
+ ;; From @almadar/std (behaviors/registry/infra/atoms/std-page-open.orb orbitals[0].traits[0])
23459
+ trait std-page-open.traits.PageOpen {
23460
+ alias : PageOpen
23461
+ linkedEntity : PageOpenRecord
23462
+ category : interaction
23463
+ states : (ready*)
23464
+ events : (INIT OPEN TAB_OPENED OPEN_CALL_FAILED OPENED OPEN_FAILED)
23465
+ transitions : ((ready -> ready on INIT) (ready -> ready on OPEN) (ready -> ready on TAB_OPENED) (ready -> ready on OPEN_CALL_FAILED))
23466
+ emits : (TAB_OPENED OPEN_CALL_FAILED OPENED OPEN_FAILED)
23467
+ config {
23468
+ statusSlot : slot = "main" @label "Status slot" @description "Where the atom shows its one-line status; an organism running it in the background sends it to `system`" @synonyms "status area, slot" @tier "presentation"
23469
+ }
23470
+ override-surface : (linkedEntity name events effects listens emitsScope config)
23471
+ source : "@almadar/std (behaviors/registry/infra/atoms/std-page-open.orb orbitals[0].traits[0])"
23472
+ }
23473
+
23474
+ ;; From @almadar/std (behaviors/registry/infra/atoms/std-page-search.orb orbitals[0].traits[0])
23475
+ trait std-page-search.traits.PageSearch {
23476
+ alias : PageSearch
23477
+ linkedEntity : PageSearchRecord
23478
+ category : interaction
23479
+ states : (idle* searching)
23480
+ events : (INIT SEARCH TAB_OPENED RESULTS_READ SEARCH_CALL_FAILED RESULTS SEARCH_FAILED)
23481
+ transitions : ((idle -> idle on INIT) (idle -> searching on SEARCH) (searching -> searching on INIT) (searching -> searching on TAB_OPENED) (searching -> idle on RESULTS_READ) (searching -> idle on SEARCH_CALL_FAILED) (searching -> idle on SEARCH_CALL_FAILED))
23482
+ emits : (TAB_OPENED RESULTS_READ SEARCH_CALL_FAILED RESULTS SEARCH_FAILED)
23483
+ config {
23484
+ fields : Map<string,PageField> = {} @label "Fields" @description "Field name to how to read it from each result: `selector` (a descendant; absent reads the result itself), `attr` (an attribute; absent reads the text) , `resolve` (the value is a URL: return it absolute), `template` (compose the value from other fields, `{name}` per field; empty when any is empty) and `required` (leave the result out until this field reads non-empty)" @synonyms "columns, properties, extract" @tier "domain"
23485
+ maxResults : number = 10 @label "Results per search" @description "Most results read from one search" @synonyms "limit, count, how many" @tier "policy"
23486
+ queryParam : string = "q" @label "Query parameter" @description "Name of the URL parameter that carries the search terms" @synonyms "query key, search parameter" @tier "domain"
23487
+ resultSelector : string = ".result" @label "Result selector" @description "CSS selector of one result on the results page" @synonyms "result, item, card, tile" @tier "domain"
23488
+ resultsMatch : string = "https://example.com/search*" @label "Results pages" @description "URL match pattern the results page lies in (Chrome match-pattern syntax); the search page must match it, and the extension asks for access to exactly these pages" @synonyms "site, url pattern, results url" @tier "domain"
23489
+ searchUrl : string = "https://example.com/search" @label "Search page" @description "URL of the site's search results page, without the query" @synonyms "search url, results page, endpoint" @tier "domain"
23490
+ statusSlot : slot = "main" @label "Status slot" @description "Where the atom shows its one-line status; an organism running it in the background sends it to `system`" @synonyms "status area, slot" @tier "presentation"
23491
+ waitMs : number = 8000 @label "Wait for results (ms)" @description "How long to wait for the results page to load and its first result to appear" @synonyms "timeout, wait, patience" @tier "infra"
23492
+ }
23493
+ override-surface : (linkedEntity name events effects listens emitsScope config)
23494
+ source : "@almadar/std (behaviors/registry/infra/atoms/std-page-search.orb orbitals[0].traits[0])"
23495
+ }
23496
+
23497
+ ;; From @almadar/std (behaviors/registry/infra/atoms/std-page-treat.orb orbitals[0].traits[0])
23498
+ trait std-page-treat.traits.PageTreat {
23499
+ alias : PageTreat
23500
+ linkedEntity : PageTreatRecord
23501
+ category : interaction
23502
+ states : (ready*)
23503
+ events : (INIT TREAT APPLIED TREAT_MANY APPLIED_MANY APPLY_FAILED TREATED TREATED_MANY TREAT_FAILED)
23504
+ transitions : ((ready -> ready on INIT) (ready -> ready on TREAT) (ready -> ready on APPLIED) (ready -> ready on TREAT_MANY) (ready -> ready on APPLIED_MANY) (ready -> ready on APPLY_FAILED))
23505
+ emits : (APPLIED APPLIED_MANY APPLY_FAILED TREATED TREATED_MANY TREAT_FAILED)
23506
+ config {
23507
+ statusSlot : slot = "main" @label "Status slot" @description "Where the atom shows its one-line status; an organism running it in the background sends it to `system`" @synonyms "status area, slot" @tier "presentation"
23508
+ }
23509
+ override-surface : (linkedEntity name events effects listens emitsScope config)
23510
+ source : "@almadar/std (behaviors/registry/infra/atoms/std-page-treat.orb orbitals[0].traits[0])"
23511
+ }
23512
+
23513
+ ;; From @almadar/std (behaviors/registry/infra/atoms/std-page-watch.orb orbitals[0].traits[0])
23514
+ trait std-page-watch.traits.PageWatch {
23515
+ alias : PageWatch
23516
+ linkedEntity : PageWatchRecord
23517
+ category : lifecycle
23518
+ states : (active*)
23519
+ events : (INIT WATCHING WATCH_FAILED ITEM_FOUND ITEM)
23520
+ transitions : ((active -> active on INIT) (active -> active on WATCHING) (active -> active on WATCH_FAILED) (active -> active on ITEM_FOUND))
23521
+ emits : (WATCHING WATCH_FAILED ITEM)
23522
+ config {
23523
+ fields : Map<string,PageField> = {} @label "Fields" @description "Field name to how to read it from each element: `selector` (a descendant; absent reads the element itself), `attr` (an attribute; absent reads the text) , `resolve` (the value is a URL: return it absolute), `template` (compose the value from other fields, `{name}` per field; empty when any is empty) and `required` (leave the element out until this field reads non-empty — a placeholder is reported once it fills in)" @synonyms "columns, properties, extract, read" @tier "domain"
23524
+ itemEvent : event = "PageWatch.ITEM_FOUND" @label "Item input" @description "The declared input each element arrives as; it follows the trait when a composer renames it" @tier "internal"
23525
+ itemSelector : string = ".item" @label "Item selector" @description "CSS selector of the elements to report" @synonyms "selector, element, card, tile, row" @tier "domain"
23526
+ match : string = "https://example.com/*" @label "Pages" @description "URL match pattern of the tabs to watch, in Chrome match-pattern syntax (`<scheme>://<host>/<path>` with `*` wildcards)" @synonyms "site, url pattern, pages, domain" @tier "domain"
23527
+ statusSlot : slot = "main" @label "Status slot" @description "Where the atom shows its one-line status; an organism running it in the background sends it to `system`" @synonyms "status area, slot" @tier "presentation"
23528
+ }
23529
+ override-surface : (linkedEntity name events effects listens emitsScope config)
23530
+ source : "@almadar/std (behaviors/registry/infra/atoms/std-page-watch.orb orbitals[0].traits[0])"
23531
+ }
23532
+
22972
23533
  ;; From @almadar/std (behaviors/registry/ui/core/atoms/std-pagination.orb orbitals[0].traits[0])
22973
23534
  trait std-pagination.traits.PagedItemPagination {
22974
23535
  alias : Pagination
@@ -24599,6 +25160,7 @@ trait ui-avl-state-machine.traits.AvlStateMachineRender {
24599
25160
  config {
24600
25161
  activeState : string @label "Active State" @description "State execution is currently in." @tier "presentation"
24601
25162
  activeTransition : number @label "Active Transition" @description "`index` of the transition that just fired." @tier "presentation"
25163
+ annotations : AvlStateMachineAnnotations = {"effects":{"persist":{"body":"Saves the order."}},"states":{"pending":{"body":"Every order starts here.","title":"Unpaid"}},"transitions":{"PAY":{"body":"Only fires when the amount is positive."}}} @label "Annotations" @description "Author explanations shown in a popover on hover: a note per state name, per transition event and per effect type." @tier "presentation"
24602
25164
  ariaBusy : boolean @label "Aria-busy" @description "This region is updating; assistive technology waits before announcing it." @synonyms "aria-busy" @tier "presentation"
24603
25165
  ariaCurrent : string @label "Aria-current" @description "Marks the current item in a set: the current page, step, location, date or time." @synonyms "aria-current" @tier "presentation" @values (page step location date time true false)
24604
25166
  ariaDescribedby : string @label "Aria-describedby" @description "Id of the element whose text describes this one (help text, error)." @synonyms "aria-describedby" @tier "presentation"
@@ -24633,6 +25195,42 @@ trait ui-avl-state-machine.traits.AvlStateMachineRender {
24633
25195
  source : "@almadar/std (behaviors/registry/ui/avl/atoms/ui-avl-state-machine.orb orbitals[0].traits[0])"
24634
25196
  }
24635
25197
 
25198
+ ;; From @almadar/std (behaviors/registry/ui/avl/atoms/ui-avl-transition-explainer.orb orbitals[0].traits[0])
25199
+ trait ui-avl-transition-explainer.traits.AvlTransitionExplainerRender {
25200
+ alias : UiAvlTransitionExplainer
25201
+ linkedEntity : AvlTransitionExplainerItem
25202
+ category : interaction
25203
+ states : (idle*)
25204
+ events : (INIT)
25205
+ transitions : ((idle -> idle on INIT))
25206
+ config {
25207
+ annotations : AvlTransitionExplainerAnnotations = {"effects":{"persist":{"body":"Saves the order."}},"transitions":{"PAY":{"body":"The customer pays the order total.","title":"Paying"}}} @label "Annotations" @description "Author explanations shown in a popover on hover: the event's note and per-effect-type notes." @tier "presentation"
25208
+ ariaBusy : boolean @label "Aria-busy" @description "This region is updating; assistive technology waits before announcing it." @synonyms "aria-busy" @tier "presentation"
25209
+ ariaCurrent : string @label "Aria-current" @description "Marks the current item in a set: the current page, step, location, date or time." @synonyms "aria-current" @tier "presentation" @values (page step location date time true false)
25210
+ ariaDescribedby : string @label "Aria-describedby" @description "Id of the element whose text describes this one (help text, error)." @synonyms "aria-describedby" @tier "presentation"
25211
+ ariaExpanded : boolean @label "Aria-expanded" @description "Whether the element it controls is expanded." @synonyms "aria-expanded" @tier "presentation"
25212
+ ariaHidden : boolean @label "Aria-hidden" @description "Hide from assistive technology (decorative content only)." @synonyms "aria-hidden" @tier "presentation"
25213
+ ariaLabel : string @label "Aria-label" @description "Accessible name read by screen readers when the visible text is missing or not descriptive (e.g. an icon-only control)." @synonyms "aria-label" @tier "presentation"
25214
+ ariaLabelledby : string @label "Aria-labelledby" @description "Id of the element whose text names this one." @synonyms "aria-labelledby" @tier "presentation"
25215
+ ariaLive : string @label "Aria-live" @description "Announce changes to this region: polite waits for a pause, assertive interrupts." @synonyms "aria-live" @tier "presentation" @values (off polite assertive)
25216
+ ariaPressed : string @label "Aria-pressed" @description "Toggle-button state." @synonyms "aria-pressed" @tier "presentation" @values (true false mixed)
25217
+ ariaSelected : boolean @label "Aria-selected" @description "Whether this item is selected (tabs, options, grid cells)." @synonyms "aria-selected" @tier "presentation"
25218
+ className : string @label "Class Name" @description "className prop" @tier "presentation"
25219
+ dir : string @label "Dir" @description "Text direction of this element's content." @tier "presentation" @values (ltr rtl auto)
25220
+ enter : string @label "Enter" @description "How this element animates in when it mounts (theme-styled); overrides the theme's default slot entry. `none` opts out." @tier "presentation" @values (none fade rise scale slide)
25221
+ enterDelay : number @label "Enter Delay" @description "Stagger step for the entry: waits this many `--motion-enter-stagger` steps before animating." @tier "presentation"
25222
+ lang : string @label "Lang" @description "Language of this element's content (BCP 47, e.g. ar, sl, en)." @tier "presentation"
25223
+ orbitalName : string = "" @label "Orbital Name" @description "Orbital the transition belongs to." @tier "presentation"
25224
+ role : string @label "Role" @description "WAI-ARIA role when the element's native semantics don't describe it." @tier "presentation" @values (alert alertdialog application article banner blockquote button caption cell checkbox code columnheader combobox complementary contentinfo definition deletion dialog document emphasis feed figure form generic grid gridcell group heading img insertion link list listbox listitem log main marquee math menu menubar menuitem menuitemcheckbox menuitemradio meter navigation none note option paragraph presentation progressbar radio radiogroup region row rowgroup rowheader scrollbar search searchbox separator slider spinbutton status strong subscript superscript switch tab table tablist tabpanel term textbox time timer toolbar tooltip tree treegrid treeitem)
25225
+ skeleton : string @label "Skeleton" @description "Skeleton shown while this element's server render is in flight: a shape (`table`, `list`, …), `{ variant, rows?, columns?, fields? }`, or `none`." @tier "presentation" @values (header table list grid detail stats form card text none)
25226
+ tabIndex : number @label "Tab Index" @description "0 puts the element in the Tab order; -1 makes it focusable only programmatically." @tier "presentation"
25227
+ traitName : string = "" @label "Trait Name" @description "Trait the transition belongs to." @tier "presentation"
25228
+ transition : AvlTransitionExplainerTransition = {"effects":[{"args":[],"type":"set"},{"args":[],"type":"persist"}],"event":"PAY","from":"pending","index":0,"to":"paid"} @label "Transition" @description "The transition to explain." @tier "presentation"
25229
+ }
25230
+ override-surface : (linkedEntity name events effects listens emitsScope config)
25231
+ source : "@almadar/std (behaviors/registry/ui/avl/atoms/ui-avl-transition-explainer.orb orbitals[0].traits[0])"
25232
+ }
25233
+
24636
25234
  ;; From @almadar/std (behaviors/registry/ui/core/atoms/ui-badge.orb orbitals[0].traits[0])
24637
25235
  trait ui-badge.traits.BadgeRender {
24638
25236
  alias : UiBadge
@@ -26440,6 +27038,7 @@ trait ui-module-card.traits.ModuleCardRender {
26440
27038
  events : (INIT)
26441
27039
  transitions : ((idle -> idle on INIT))
26442
27040
  config {
27041
+ annotations : Map<string,ModuleCardAnnotationsValue> = {"item":{}} @label "Annotations" @description "Author explanations per trait name (states, transition events, effect types), shown in a popover on hover." @tier "presentation"
26443
27042
  ariaBusy : boolean @label "Aria-busy" @description "This region is updating; assistive technology waits before announcing it." @synonyms "aria-busy" @tier "presentation"
26444
27043
  ariaCurrent : string @label "Aria-current" @description "Marks the current item in a set: the current page, step, location, date or time." @synonyms "aria-current" @tier "presentation" @values (page step location date time true false)
26445
27044
  ariaDescribedby : string @label "Aria-describedby" @description "Id of the element whose text describes this one (help text, error)." @synonyms "aria-describedby" @tier "presentation"
@@ -28240,6 +28839,15 @@ page std-agent-planner.pages.AgentPlannerPage {
28240
28839
  source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-planner.orb orbitals[0].pages[0])"
28241
28840
  }
28242
28841
 
28842
+ ;; From @almadar/std (behaviors/registry/agent/atoms/std-agent-proposal.orb orbitals[0].pages[0])
28843
+ page std-agent-proposal.pages.AgentProposalPage {
28844
+ alias : AgentProposal
28845
+ defaultPath : /agent-proposal
28846
+ traits : (AgentProposalWorkflow AgentProposalLoop)
28847
+ override-surface : (path linkedEntity traits)
28848
+ source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-proposal.orb orbitals[0].pages[0])"
28849
+ }
28850
+
28243
28851
  ;; From @almadar/std (behaviors/registry/agent/atoms/std-agent-session.orb orbitals[1].pages[0])
28244
28852
  page std-agent-session.pages.AgentChatsPage {
28245
28853
  alias : AgentSession
@@ -28258,6 +28866,24 @@ page std-agent-session.pages.AgentSessionPage {
28258
28866
  source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-session.orb orbitals[0].pages[0])"
28259
28867
  }
28260
28868
 
28869
+ ;; From @almadar/std (behaviors/registry/agent/atoms/std-agent-suggestions.orb orbitals[1].pages[0])
28870
+ page std-agent-suggestions.pages.AgentSuggestionHistoryPage {
28871
+ alias : AgentSuggestions
28872
+ defaultPath : /agent-suggestions/history
28873
+ traits : (AgentSuggestionHistory)
28874
+ override-surface : (path linkedEntity traits)
28875
+ source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-suggestions.orb orbitals[1].pages[0])"
28876
+ }
28877
+
28878
+ ;; From @almadar/std (behaviors/registry/agent/atoms/std-agent-suggestions.orb orbitals[0].pages[0])
28879
+ page std-agent-suggestions.pages.AgentSuggestionsPage {
28880
+ alias : AgentSuggestions
28881
+ defaultPath : /agent-suggestions
28882
+ traits : (AgentSuggestionInbox AgentSuggestionProposer AgentSuggestionTrigger AgentSuggestionRunner AgentSuggestionLoop)
28883
+ override-surface : (path linkedEntity traits)
28884
+ source : "@almadar/std (behaviors/registry/agent/atoms/std-agent-suggestions.orb orbitals[0].pages[0])"
28885
+ }
28886
+
28261
28887
  ;; From @almadar/std (behaviors/registry/agent/atoms/std-agent-tool-call.orb orbitals[0].pages[0])
28262
28888
  page std-agent-tool-call.pages.AgentToolCallPage {
28263
28889
  alias : AgentToolCall
@@ -28582,6 +29208,15 @@ page std-detail-layout.pages.DetailLayoutPage {
28582
29208
  source : "@almadar/std (behaviors/registry/ui/core/atoms/std-detail-layout.orb orbitals[0].pages[0])"
28583
29209
  }
28584
29210
 
29211
+ ;; From @almadar/std (behaviors/registry/ui/core/atoms/std-doc-page.orb orbitals[0].pages[0])
29212
+ page std-doc-page.pages.DocPage {
29213
+ alias : DocPage
29214
+ defaultPath : /doc
29215
+ traits : (DocPageRender)
29216
+ override-surface : (path linkedEntity traits)
29217
+ source : "@almadar/std (behaviors/registry/ui/core/atoms/std-doc-page.orb orbitals[0].pages[0])"
29218
+ }
29219
+
28585
29220
  ;; From @almadar/std (behaviors/registry/ui/game/atoms/std-dungeon-combat.orb orbitals[0].pages[0])
28586
29221
  page std-dungeon-combat.pages.DungeonCombatPage {
28587
29222
  alias : DungeonCombat
@@ -29348,6 +29983,42 @@ page std-pad-lock.pages.PadLockPage {
29348
29983
  source : "@almadar/std (behaviors/registry/ui/game/atoms/std-pad-lock.orb orbitals[0].pages[0])"
29349
29984
  }
29350
29985
 
29986
+ ;; From @almadar/std (behaviors/registry/infra/atoms/std-page-open.orb orbitals[0].pages[0])
29987
+ page std-page-open.pages.PageOpenPage {
29988
+ alias : PageOpen
29989
+ defaultPath : /page-open
29990
+ traits : (PageOpen)
29991
+ override-surface : (path linkedEntity traits)
29992
+ source : "@almadar/std (behaviors/registry/infra/atoms/std-page-open.orb orbitals[0].pages[0])"
29993
+ }
29994
+
29995
+ ;; From @almadar/std (behaviors/registry/infra/atoms/std-page-search.orb orbitals[0].pages[0])
29996
+ page std-page-search.pages.PageSearchPage {
29997
+ alias : PageSearch
29998
+ defaultPath : /page-search
29999
+ traits : (PageSearch)
30000
+ override-surface : (path linkedEntity traits)
30001
+ source : "@almadar/std (behaviors/registry/infra/atoms/std-page-search.orb orbitals[0].pages[0])"
30002
+ }
30003
+
30004
+ ;; From @almadar/std (behaviors/registry/infra/atoms/std-page-treat.orb orbitals[0].pages[0])
30005
+ page std-page-treat.pages.PageTreatPage {
30006
+ alias : PageTreat
30007
+ defaultPath : /page-treat
30008
+ traits : (PageTreat)
30009
+ override-surface : (path linkedEntity traits)
30010
+ source : "@almadar/std (behaviors/registry/infra/atoms/std-page-treat.orb orbitals[0].pages[0])"
30011
+ }
30012
+
30013
+ ;; From @almadar/std (behaviors/registry/infra/atoms/std-page-watch.orb orbitals[0].pages[0])
30014
+ page std-page-watch.pages.PageWatchPage {
30015
+ alias : PageWatch
30016
+ defaultPath : /page-watch
30017
+ traits : (PageWatch)
30018
+ override-surface : (path linkedEntity traits)
30019
+ source : "@almadar/std (behaviors/registry/infra/atoms/std-page-watch.orb orbitals[0].pages[0])"
30020
+ }
30021
+
29351
30022
  ;; From @almadar/std (behaviors/registry/ui/core/atoms/std-pagination.orb orbitals[0].pages[0])
29352
30023
  page std-pagination.pages.PagedItemPaginationPage {
29353
30024
  alias : Pagination
@@ -29933,6 +30604,15 @@ page ui-avl-state-machine.pages.AvlStateMachinePage {
29933
30604
  source : "@almadar/std (behaviors/registry/ui/avl/atoms/ui-avl-state-machine.orb orbitals[0].pages[0])"
29934
30605
  }
29935
30606
 
30607
+ ;; From @almadar/std (behaviors/registry/ui/avl/atoms/ui-avl-transition-explainer.orb orbitals[0].pages[0])
30608
+ page ui-avl-transition-explainer.pages.AvlTransitionExplainerPage {
30609
+ alias : UiAvlTransitionExplainer
30610
+ defaultPath : /avl-transition-explainer
30611
+ traits : (AvlTransitionExplainerRender)
30612
+ override-surface : (path linkedEntity traits)
30613
+ source : "@almadar/std (behaviors/registry/ui/avl/atoms/ui-avl-transition-explainer.orb orbitals[0].pages[0])"
30614
+ }
30615
+
29936
30616
  ;; From @almadar/std (behaviors/registry/ui/core/atoms/ui-badge.orb orbitals[0].pages[0])
29937
30617
  page ui-badge.pages.BadgePage {
29938
30618
  alias : UiBadge
@@ -35402,6 +36082,7 @@ trait ui-data-list.traits.DataListRender {
35402
36082
  fields : [DataListFieldsItem] = [] @label "Fields" @description "Field definitions for rendering each row. The pattern contract in `@almadar/core/patterns` documents `columns` as the wire-format alias the compiler emits — both names resolve to the same shape here. Pass either." @tier "presentation"
35403
36083
  gap : string = "none" @label "Gap" @description "Gap between rows" @tier "presentation" @values (none sm md lg)
35404
36084
  groupBy : string @label "Group By" @description "Group items by a field value (renders section headers between groups)" @tier "presentation"
36085
+ groupFormat : string @label "Group Format" @description "How a `groupBy` value is bucketed and labelled (`date` = one section per day)" @tier "presentation" @values (date time datetime currency number boolean percent)
35405
36086
  hasMore : boolean @label "Has More" @description "Whether more items are available for infinite scroll" @tier "presentation"
35406
36087
  infiniteScroll : boolean @label "Infinite Scroll" @description "Enable infinite scroll loading" @tier "presentation"
35407
36088
  isLoading : boolean = false @label "Is Loading" @description "Loading state" @tier "presentation"
@@ -37302,9 +37983,12 @@ trait ui-markdown-content.traits.MarkdownContentRender {
37302
37983
  linkedEntity : MarkdownContentItem
37303
37984
  category : interaction
37304
37985
  states : (idle*)
37305
- events : (INIT)
37986
+ events : (INIT @config.askEvent @config.noteEvent @config.annotationEvent)
37306
37987
  transitions : ((idle -> idle on INIT))
37988
+ emits : (@config.askEvent @config.noteEvent @config.annotationEvent)
37307
37989
  config {
37990
+ annotationEvent : event = "ANNOTATION" @label "Annotation Event" @description "Event emitted when a highlighted passage is clicked (as `UI:<annotationEvent>`)" @tier "presentation"
37991
+ annotations : [MarkdownContentAnnotationsItem] = [] @label "Annotations" @description "Passages to highlight. Each `text` is matched exactly, first occurrence in document order inside a single rendered text node (outside code); a passage that spans formatting boundaries is not highlighted." @tier "presentation"
37308
37992
  ariaBusy : boolean @label "Aria-busy" @description "This region is updating; assistive technology waits before announcing it." @synonyms "aria-busy" @tier "presentation"
37309
37993
  ariaCurrent : string @label "Aria-current" @description "Marks the current item in a set: the current page, step, location, date or time." @synonyms "aria-current" @tier "presentation" @values (page step location date time true false)
37310
37994
  ariaDescribedby : string @label "Aria-describedby" @description "Id of the element whose text describes this one (help text, error)." @synonyms "aria-describedby" @tier "presentation"
@@ -37315,6 +37999,8 @@ trait ui-markdown-content.traits.MarkdownContentRender {
37315
37999
  ariaLive : string @label "Aria-live" @description "Announce changes to this region: polite waits for a pause, assertive interrupts." @synonyms "aria-live" @tier "presentation" @values (off polite assertive)
37316
38000
  ariaPressed : string @label "Aria-pressed" @description "Toggle-button state." @synonyms "aria-pressed" @tier "presentation" @values (true false mixed)
37317
38001
  ariaSelected : boolean @label "Aria-selected" @description "Whether this item is selected (tabs, options, grid cells)." @synonyms "aria-selected" @tier "presentation"
38002
+ askEvent : event = "ASK" @label "Ask Event" @description "Event emitted when the reader picks Ask on selected text (as `UI:<askEvent>`)" @tier "presentation"
38003
+ askLabel : string @label "Ask Label" @description "Ask action label (default: translated)" @tier "presentation"
37318
38004
  className : string @label "Class Name" @description "Additional CSS classes" @tier "presentation"
37319
38005
  content : string = "" @label "Content" @description "The markdown content to render" @tier "presentation"
37320
38006
  dir : string @label "Dir" @description "Text direction of this element's content." @tier "presentation" @values (ltr rtl auto)
@@ -37322,6 +38008,8 @@ trait ui-markdown-content.traits.MarkdownContentRender {
37322
38008
  enter : string @label "Enter" @description "How this element animates in when it mounts (theme-styled); overrides the theme's default slot entry. `none` opts out." @tier "presentation" @values (none fade rise scale slide)
37323
38009
  enterDelay : number @label "Enter Delay" @description "Stagger step for the entry: waits this many `--motion-enter-stagger` steps before animating." @tier "presentation"
37324
38010
  lang : string @label "Lang" @description "Language of this element's content (BCP 47, e.g. ar, sl, en)." @tier "presentation"
38011
+ noteEvent : event = "NOTE" @label "Note Event" @description "Event emitted when the reader picks Note on selected text (as `UI:<noteEvent>`)" @tier "presentation"
38012
+ noteLabel : string @label "Note Label" @description "Note action label (default: translated)" @tier "presentation"
37325
38013
  role : string @label "Role" @description "WAI-ARIA role when the element's native semantics don't describe it." @tier "presentation" @values (alert alertdialog application article banner blockquote button caption cell checkbox code columnheader combobox complementary contentinfo definition deletion dialog document emphasis feed figure form generic grid gridcell group heading img insertion link list listbox listitem log main marquee math menu menubar menuitem menuitemcheckbox menuitemradio meter navigation none note option paragraph presentation progressbar radio radiogroup region row rowgroup rowheader scrollbar search searchbox separator slider spinbutton status strong subscript superscript switch tab table tablist tabpanel term textbox time timer toolbar tooltip tree treegrid treeitem)
37326
38014
  skeleton : string @label "Skeleton" @description "Skeleton shown while this element's server render is in flight: a shape (`table`, `list`, …), `{ variant, rows?, columns?, fields? }`, or `none`." @tier "presentation" @values (header table list grid detail stats form card text none)
37327
38015
  tabIndex : number @label "Tab Index" @description "0 puts the element in the Tab order; -1 makes it focusable only programmatically." @tier "presentation"
@@ -39111,6 +39799,7 @@ trait ui-upload-drop-zone.traits.UploadDropZoneRender {
39111
39799
  lang : string @label "Lang" @description "Language of this element's content (BCP 47, e.g. ar, sl, en)." @tier "presentation"
39112
39800
  maxFiles : number = 1 @label "Max Files" @description "Max number of files" @tier "presentation"
39113
39801
  maxSize : number @label "Max Size" @description "Max file size in bytes" @tier "presentation"
39802
+ readAs : string = "dataUrl" @label "Read As" @description "How the file is read into `content`: a base64 data URL (default) or its UTF-8 text" @tier "presentation" @values (dataUrl text)
39114
39803
  role : string @label "Role" @description "WAI-ARIA role when the element's native semantics don't describe it." @tier "presentation" @values (alert alertdialog application article banner blockquote button caption cell checkbox code columnheader combobox complementary contentinfo definition deletion dialog document emphasis feed figure form generic grid gridcell group heading img insertion link list listbox listitem log main marquee math menu menubar menuitem menuitemcheckbox menuitemradio meter navigation none note option paragraph presentation progressbar radio radiogroup region row rowgroup rowheader scrollbar search searchbox separator slider spinbutton status strong subscript superscript switch tab table tablist tabpanel term textbox time timer toolbar tooltip tree treegrid treeitem)
39115
39804
  skeleton : string @label "Skeleton" @description "Skeleton shown while this element's server render is in flight: a shape (`table`, `list`, …), `{ variant, rows?, columns?, fields? }`, or `none`." @tier "presentation" @values (header table list grid detail stats form card text none)
39116
39805
  tabIndex : number @label "Tab Index" @description "0 puts the element in the Tab order; -1 makes it focusable only programmatically." @tier "presentation"
@@ -42560,9 +43249,13 @@ trait ui-segment-renderer.traits.SegmentRendererRender {
42560
43249
  linkedEntity : SegmentRendererItem
42561
43250
  category : interaction
42562
43251
  states : (idle*)
42563
- events : (INIT)
43252
+ events : (INIT @config.activationSaveEvent @config.reflectionSaveEvent @config.bloomAnswerEvent @config.askEvent @config.noteEvent @config.annotationEvent)
42564
43253
  transitions : ((idle -> idle on INIT))
43254
+ emits : (@config.activationSaveEvent @config.reflectionSaveEvent @config.bloomAnswerEvent @config.askEvent @config.noteEvent @config.annotationEvent)
42565
43255
  config {
43256
+ activationSaveEvent : event = "ACTIVATION_SAVE" @label "Activation Save Event" @description "Event emitted when the activation prompt is saved or skipped (as `UI:<activationSaveEvent>`)" @tier "presentation"
43257
+ annotationEvent : event = "ANNOTATION" @label "Annotation Event" @description "Event emitted when a highlighted passage is clicked (as `UI:<annotationEvent>`)" @tier "presentation"
43258
+ annotations : [SegmentRendererAnnotationsItem] = [] @label "Annotations" @description "Passages to highlight. Each `text` is matched exactly against the markdown segments, first segment whose source contains it, first occurrence inside one rendered text node (outside code); one that spans formatting is not highlighted." @tier "presentation"
42566
43259
  ariaBusy : boolean @label "Aria-busy" @description "This region is updating; assistive technology waits before announcing it." @synonyms "aria-busy" @tier "presentation"
42567
43260
  ariaCurrent : string @label "Aria-current" @description "Marks the current item in a set: the current page, step, location, date or time." @synonyms "aria-current" @tier "presentation" @values (page step location date time true false)
42568
43261
  ariaDescribedby : string @label "Aria-describedby" @description "Id of the element whose text describes this one (help text, error)." @synonyms "aria-describedby" @tier "presentation"
@@ -42573,14 +43266,21 @@ trait ui-segment-renderer.traits.SegmentRendererRender {
42573
43266
  ariaLive : string @label "Aria-live" @description "Announce changes to this region: polite waits for a pause, assertive interrupts." @synonyms "aria-live" @tier "presentation" @values (off polite assertive)
42574
43267
  ariaPressed : string @label "Aria-pressed" @description "Toggle-button state." @synonyms "aria-pressed" @tier "presentation" @values (true false mixed)
42575
43268
  ariaSelected : boolean @label "Aria-selected" @description "Whether this item is selected (tabs, options, grid cells)." @synonyms "aria-selected" @tier "presentation"
43269
+ askEvent : event = "ASK" @label "Ask Event" @description "Event emitted when the reader picks Ask on selected text (as `UI:<askEvent>`)" @tier "presentation"
43270
+ askLabel : string @label "Ask Label" @description "Ask action label (default: translated)" @tier "presentation"
43271
+ bloomAnswerEvent : event = "BLOOM_ANSWER" @label "Bloom Answer Event" @description "Event emitted on the first reveal of a Bloom question (as `UI:<bloomAnswerEvent>`)" @tier "presentation"
42576
43272
  className : string @label "Class Name" @description "Additional CSS classes for the root container" @tier "presentation"
42577
43273
  containerClassName : string @label "Container Class Name" @description "CSS classes for the outer wrapping div" @tier "presentation"
42578
43274
  dir : string @label "Dir" @description "Text direction of this element's content." @tier "presentation" @values (ltr rtl auto)
42579
43275
  enter : string @label "Enter" @description "How this element animates in when it mounts (theme-styled); overrides the theme's default slot entry. `none` opts out." @tier "presentation" @values (none fade rise scale slide)
42580
43276
  enterDelay : number @label "Enter Delay" @description "Stagger step for the entry: waits this many `--motion-enter-stagger` steps before animating." @tier "presentation"
42581
43277
  lang : string @label "Lang" @description "Language of this element's content (BCP 47, e.g. ar, sl, en)." @tier "presentation"
43278
+ lesson : string @label "Lesson" @description "Raw lesson markdown with learning tags; parsed with `parseLessonSegments` and rendered" @tier "presentation"
43279
+ noteEvent : event = "NOTE" @label "Note Event" @description "Event emitted when the reader picks Note on selected text (as `UI:<noteEvent>`)" @tier "presentation"
43280
+ noteLabel : string @label "Note Label" @description "Note action label (default: translated)" @tier "presentation"
43281
+ reflectionSaveEvent : event = "REFLECTION_SAVE" @label "Reflection Save Event" @description "Event emitted when a reflection note is saved (as `UI:<reflectionSaveEvent>`)" @tier "presentation"
42582
43282
  role : string @label "Role" @description "WAI-ARIA role when the element's native semantics don't describe it." @tier "presentation" @values (alert alertdialog application article banner blockquote button caption cell checkbox code columnheader combobox complementary contentinfo definition deletion dialog document emphasis feed figure form generic grid gridcell group heading img insertion link list listbox listitem log main marquee math menu menubar menuitem menuitemcheckbox menuitemradio meter navigation none note option paragraph presentation progressbar radio radiogroup region row rowgroup rowheader scrollbar search searchbox separator slider spinbutton status strong subscript superscript switch tab table tablist tabpanel term textbox time timer toolbar tooltip tree treegrid treeitem)
42583
- segments : [SegmentRendererSegmentsItem] = [{"answer":"Answer","question":"Question","type":"quiz"},{"answer":"Answer 2","question":"Question 2","type":"quiz"}] @label "Segments" @description "Parsed lesson segments (see `parseLessonSegments`)" @tier "presentation"
43283
+ segments : [SegmentRendererSegmentsItem] = [] @label "Segments" @description "Parsed lesson segments (see `parseLessonSegments`). Ignored when `lesson` is given." @tier "presentation"
42584
43284
  skeleton : string @label "Skeleton" @description "Skeleton shown while this element's server render is in flight: a shape (`table`, `list`, …), `{ variant, rows?, columns?, fields? }`, or `none`." @tier "presentation" @values (header table list grid detail stats form card text none)
42585
43285
  tabIndex : number @label "Tab Index" @description "0 puts the element in the Tab order; -1 makes it focusable only programmatically." @tier "presentation"
42586
43286
  userProgress : SegmentRendererUserProgress @label "User Progress" @description "User progress for restoring activation/reflection state" @tier "presentation"