@almadar/std 16.145.0 → 16.147.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.
- package/behaviors/lolo/infra/atoms/std-migration-job.lolo +269 -0
- package/behaviors/lolo/infra/atoms/std-mod-queue.lolo +1 -1
- package/behaviors/lolo/ml/atoms/std-data-collector.lolo +56 -0
- package/behaviors/lolo/ml/atoms/std-graph-builder.lolo +90 -0
- package/behaviors/lolo/ml/atoms/std-ml-similarity.lolo +25 -13
- package/behaviors/lolo/ml/atoms/std-tokenizer.lolo +108 -0
- package/behaviors/lolo/ml/atoms/std-weight-validator.lolo +106 -0
- package/behaviors/lolo/ui/core/atoms/std-app-layout.lolo +14 -0
- package/behaviors/lolo/ui/core/atoms/std-billable-hour.lolo +1 -1
- package/behaviors/lolo/ui/core/atoms/std-esign-flow.lolo +3 -3
- package/behaviors/lolo/ui/core/atoms/std-esign-request.lolo +4 -4
- package/behaviors/lolo/ui/core/atoms/std-event-log.lolo +2 -2
- package/behaviors/lolo/ui/core/atoms/std-file-store.lolo +1 -1
- package/behaviors/lolo/ui/core/atoms/std-gallery.lolo +1 -1
- package/behaviors/lolo/ui/core/atoms/std-image-upload-multi.lolo +2 -2
- package/behaviors/lolo/ui/core/atoms/std-import.lolo +132 -0
- package/behaviors/lolo/ui/core/atoms/std-recurrence.lolo +5 -5
- package/behaviors/lolo/ui/core/atoms/std-saved-search.lolo +1 -1
- package/behaviors/lolo/ui/core/atoms/std-signature-capture.lolo +1 -1
- package/behaviors/lolo/ui/core/atoms/std-stats.lolo +1 -1
- package/behaviors/lolo/ui/core/atoms/std-tag-taxonomy.lolo +3 -3
- package/behaviors/lolo/ui/core/molecules/ui-data-grid.lolo +0 -2
- package/behaviors/lolo/ui/core/molecules/ui-data-list.lolo +0 -2
- package/behaviors/lolo/ui/core/molecules/ui-import-preview-tree.lolo +96 -0
- package/behaviors/lolo/ui/core/molecules/ui-import-progress.lolo +49 -0
- package/behaviors/lolo/ui/core/molecules/ui-import-source-picker.lolo +67 -0
- package/behaviors/lolo/ui/core/molecules/ui-table-view.lolo +0 -2
- package/behaviors/lolo/ui/core/organisms/ui-entity-cards.lolo +0 -2
- package/behaviors/lolo/ui/core/organisms/ui-entity-list.lolo +0 -2
- package/behaviors/lolo/ui/core/organisms/ui-entity-table.lolo +0 -2
- package/behaviors/lolo/ui/core/organisms/ui-timeline.lolo +0 -2
- package/behaviors/lolo/ui/game/atoms/std-dungeon-combat.lolo +2 -2
- package/behaviors/lolo/ui/game/molecules/std-worldmap-board-2d.lolo +1 -1
- package/behaviors/lolo/ui/game/organisms/ui-boardgame-board.lolo +2 -2
- package/behaviors/lolo/ui/game/organisms/ui-builder-board.lolo +2 -2
- package/behaviors/lolo/ui/game/organisms/ui-debugger-board.lolo +3 -3
- package/behaviors/lolo/ui/game/organisms/ui-physics-sandbox-board.lolo +3 -3
- package/behaviors/lolo/ui/game/organisms/ui-roguelike-board.lolo +1 -1
- package/behaviors/lolo/ui/game/organisms/ui-sequencer-board.lolo +1 -1
- package/behaviors/lolo/ui/learning/atoms/std-algo-heapsort.lolo +2 -2
- package/behaviors/lolo/ui/learning/atoms/std-algo-mst.lolo +3 -3
- package/behaviors/registry/factory-signatures.json +11531 -2142
- package/behaviors/registry/infra/atoms/std-migration-job.orb +1310 -0
- package/behaviors/registry/infra/atoms/std-mod-queue.orb +5 -5
- package/behaviors/registry/ml/atoms/std-data-collector.orb +324 -0
- package/behaviors/registry/ml/atoms/std-graph-builder.orb +480 -0
- package/behaviors/registry/ml/atoms/std-ml-similarity.orb +127 -72
- package/behaviors/registry/ml/atoms/std-tokenizer.orb +570 -0
- package/behaviors/registry/ml/atoms/std-weight-validator.orb +624 -0
- package/behaviors/registry/ui/core/atoms/std-app-layout.orb +33 -1
- package/behaviors/registry/ui/core/atoms/std-billable-hour.orb +2 -2
- package/behaviors/registry/ui/core/atoms/std-esign-flow.orb +17 -21
- package/behaviors/registry/ui/core/atoms/std-esign-request.orb +7 -13
- package/behaviors/registry/ui/core/atoms/std-event-log.orb +2 -4
- package/behaviors/registry/ui/core/atoms/std-file-store.orb +3 -4
- package/behaviors/registry/ui/core/atoms/std-gallery.orb +11 -20
- package/behaviors/registry/ui/core/atoms/std-image-upload-multi.orb +4 -4
- package/behaviors/registry/ui/core/atoms/std-import.orb +701 -0
- package/behaviors/registry/ui/core/atoms/std-recurrence.orb +5 -10
- package/behaviors/registry/ui/core/atoms/std-saved-search.orb +2 -2
- package/behaviors/registry/ui/core/atoms/std-signature-capture.orb +2 -2
- package/behaviors/registry/ui/core/molecules/ui-data-grid.orb +12 -25
- package/behaviors/registry/ui/core/molecules/ui-data-list.orb +13 -26
- package/behaviors/registry/ui/core/molecules/ui-import-preview-tree.orb +354 -0
- package/behaviors/registry/ui/core/molecules/ui-import-progress.orb +195 -0
- package/behaviors/registry/ui/core/molecules/ui-import-source-picker.orb +279 -0
- package/behaviors/registry/ui/core/molecules/ui-table-view.orb +12 -25
- package/behaviors/registry/ui/core/organisms/ui-entity-cards.orb +0 -13
- package/behaviors/registry/ui/core/organisms/ui-entity-list.orb +8 -21
- package/behaviors/registry/ui/core/organisms/ui-entity-table.orb +0 -13
- package/behaviors/registry/ui/core/organisms/ui-timeline.orb +0 -13
- package/behaviors/registry/ui/game/atoms/std-dungeon-combat.orb +4 -4
- package/behaviors/registry/ui/game/molecules/std-worldmap-board-2d.orb +6 -9
- package/behaviors/registry/ui/game/organisms/ui-boardgame-board.orb +4 -4
- package/behaviors/registry/ui/game/organisms/ui-builder-board.orb +4 -4
- package/behaviors/registry/ui/game/organisms/ui-debugger-board.orb +12 -12
- package/behaviors/registry/ui/game/organisms/ui-physics-sandbox-board.orb +19 -19
- package/behaviors/registry/ui/game/organisms/ui-roguelike-board.orb +1 -1
- package/behaviors/registry/ui/game/organisms/ui-sequencer-board.orb +2 -2
- package/behaviors/registry/ui/learning/atoms/std-algo-heapsort.orb +8 -8
- package/dist/behaviors/behaviors-embeddings.json +568 -496
- package/dist/behaviors/behaviors-registry.json +7518 -3936
- package/dist/behaviors/exports-reader.js +3093 -2581
- package/dist/behaviors/functions/index.d.ts +922 -14
- package/dist/behaviors/functions/index.js +3056 -2582
- package/dist/behaviors/index.d.ts +1 -1
- package/dist/behaviors/index.js +3094 -2582
- package/dist/behaviors/knob-embeddings.json +1 -1
- package/dist/behaviors/query.js +3093 -2581
- package/dist/behaviors/registry/factory-signatures.json +11531 -2142
- package/dist/behaviors/registry/infra/atoms/std-migration-job.orb +1310 -0
- package/dist/behaviors/registry/infra/atoms/std-mod-queue.orb +5 -5
- package/dist/behaviors/registry/ml/atoms/std-data-collector.orb +324 -0
- package/dist/behaviors/registry/ml/atoms/std-graph-builder.orb +480 -0
- package/dist/behaviors/registry/ml/atoms/std-ml-similarity.orb +127 -72
- package/dist/behaviors/registry/ml/atoms/std-tokenizer.orb +570 -0
- package/dist/behaviors/registry/ml/atoms/std-weight-validator.orb +624 -0
- package/dist/behaviors/registry/ui/core/atoms/std-app-layout.orb +33 -1
- package/dist/behaviors/registry/ui/core/atoms/std-billable-hour.orb +2 -2
- package/dist/behaviors/registry/ui/core/atoms/std-esign-flow.orb +17 -21
- package/dist/behaviors/registry/ui/core/atoms/std-esign-request.orb +7 -13
- package/dist/behaviors/registry/ui/core/atoms/std-event-log.orb +2 -4
- package/dist/behaviors/registry/ui/core/atoms/std-file-store.orb +3 -4
- package/dist/behaviors/registry/ui/core/atoms/std-gallery.orb +11 -20
- package/dist/behaviors/registry/ui/core/atoms/std-image-upload-multi.orb +4 -4
- package/dist/behaviors/registry/ui/core/atoms/std-import.orb +701 -0
- package/dist/behaviors/registry/ui/core/atoms/std-recurrence.orb +5 -10
- package/dist/behaviors/registry/ui/core/atoms/std-saved-search.orb +2 -2
- package/dist/behaviors/registry/ui/core/atoms/std-signature-capture.orb +2 -2
- package/dist/behaviors/registry/ui/core/molecules/ui-data-grid.orb +12 -25
- package/dist/behaviors/registry/ui/core/molecules/ui-data-list.orb +13 -26
- package/dist/behaviors/registry/ui/core/molecules/ui-import-preview-tree.orb +354 -0
- package/dist/behaviors/registry/ui/core/molecules/ui-import-progress.orb +195 -0
- package/dist/behaviors/registry/ui/core/molecules/ui-import-source-picker.orb +279 -0
- package/dist/behaviors/registry/ui/core/molecules/ui-table-view.orb +12 -25
- package/dist/behaviors/registry/ui/core/organisms/ui-entity-cards.orb +0 -13
- package/dist/behaviors/registry/ui/core/organisms/ui-entity-list.orb +8 -21
- package/dist/behaviors/registry/ui/core/organisms/ui-entity-table.orb +0 -13
- package/dist/behaviors/registry/ui/core/organisms/ui-timeline.orb +0 -13
- package/dist/behaviors/registry/ui/game/atoms/std-dungeon-combat.orb +4 -4
- package/dist/behaviors/registry/ui/game/molecules/std-worldmap-board-2d.orb +6 -9
- package/dist/behaviors/registry/ui/game/organisms/ui-boardgame-board.orb +4 -4
- package/dist/behaviors/registry/ui/game/organisms/ui-builder-board.orb +4 -4
- package/dist/behaviors/registry/ui/game/organisms/ui-debugger-board.orb +12 -12
- package/dist/behaviors/registry/ui/game/organisms/ui-physics-sandbox-board.orb +19 -19
- package/dist/behaviors/registry/ui/game/organisms/ui-roguelike-board.orb +1 -1
- package/dist/behaviors/registry/ui/game/organisms/ui-sequencer-board.orb +2 -2
- package/dist/behaviors/registry/ui/learning/atoms/std-algo-heapsort.orb +8 -8
- package/dist/behaviors-embeddings.json +568 -496
- package/dist/behaviors-registry.json +7518 -3936
- package/dist/index.d.ts +1 -1
- package/dist/index.js +3094 -2582
- package/dist/knob-embeddings.json +1 -1
- package/dist/registry/factory-signatures.json +11531 -2142
- package/package.json +2 -2
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
app std-weight-validator "1.0.0"
|
|
2
|
+
"std-weight-validator — a constraint-checking atom for model weights, applying the same discipline as the zero-warning validator to weights: constrained and checked, not trusted (Almadar_Intelligence_Ladder.md §7.5). Checks a candidate weight tensor against three pure predicate constraints — magnitude bounds (every element's absolute value must clear maxMagnitude), forbidden regions (excluded [min,max] bands no weight may land in even within the magnitude bound), and a regression threshold against a baseline tensor (per-element drift must not exceed regressionThreshold; 0 disables the check) — and reports every violated check with its detail. Emits WEIGHTS_ACCEPTED when all three checks clear, or WEIGHTS_REJECTED carrying the full violations list otherwise. Pure circuit logic: predicates and comparisons only, no ML compute, no model call."
|
|
3
|
+
|
|
4
|
+
type Range = { min: float!, max: float! }
|
|
5
|
+
|
|
6
|
+
orbital MlWeightValidatorOrbital {
|
|
7
|
+
|
|
8
|
+
entity WeightValidation [runtime] {
|
|
9
|
+
weights : [float] = []
|
|
10
|
+
baseline : [float] = []
|
|
11
|
+
violations : [object] = []
|
|
12
|
+
valid : boolean = false
|
|
13
|
+
status : "idle" | "checked" = idle
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
trait WeightValidatorRun -> WeightValidation [lifecycle, instance] {
|
|
17
|
+
initial: idle
|
|
18
|
+
|
|
19
|
+
config {
|
|
20
|
+
maxMagnitude : float = 10
|
|
21
|
+
@label "Max weight magnitude"
|
|
22
|
+
@description "Every weight's absolute value must not exceed this bound"
|
|
23
|
+
@tier "policy"
|
|
24
|
+
forbiddenRegions : [Range] = []
|
|
25
|
+
@label "Forbidden regions"
|
|
26
|
+
@description "Value ranges no weight may fall inside, even within the magnitude bound"
|
|
27
|
+
@tier "domain"
|
|
28
|
+
regressionThreshold : float = 0
|
|
29
|
+
@label "Regression threshold"
|
|
30
|
+
@description "Max allowed per-element absolute drift between candidate and baseline weights; 0 disables the regression check"
|
|
31
|
+
@tier "policy"
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
state idle {
|
|
35
|
+
INIT -> idle
|
|
36
|
+
(set @entity.weights [])
|
|
37
|
+
(set @entity.baseline [])
|
|
38
|
+
(set @entity.violations [])
|
|
39
|
+
(set @entity.valid false)
|
|
40
|
+
(set @entity.status idle)
|
|
41
|
+
|
|
42
|
+
VALIDATE_WEIGHTS -> checked
|
|
43
|
+
(let ((cand ?weights)
|
|
44
|
+
(base ?baseline)
|
|
45
|
+
(magnitudeHits (array/filter @cand (fn w (> (math/abs @w) @config.maxMagnitude))))
|
|
46
|
+
(regionHits (array/filter @cand (fn w (array/some @config.forbiddenRegions (fn r (and (>= @w @r.min) (<= @w @r.max)))))))
|
|
47
|
+
(regressionHits (if (> @config.regressionThreshold 0)
|
|
48
|
+
(array/filter (array/range 0 (array/len @cand))
|
|
49
|
+
(fn i (> (math/abs (- (array/nth @cand @i) (array/nth @base @i))) @config.regressionThreshold)))
|
|
50
|
+
[]))
|
|
51
|
+
(violations (array/concat
|
|
52
|
+
(array/map @magnitudeHits (fn w { check: "magnitude", value: @w }))
|
|
53
|
+
(array/map @regionHits (fn w { check: "forbidden-region", value: @w }))
|
|
54
|
+
(array/map @regressionHits (fn i { check: "regression", index: @i })))))
|
|
55
|
+
(do
|
|
56
|
+
(set @entity.weights @cand)
|
|
57
|
+
(set @entity.baseline @base)
|
|
58
|
+
(set @entity.violations @violations)
|
|
59
|
+
(if (== (array/len @violations) 0)
|
|
60
|
+
(do
|
|
61
|
+
(set @entity.valid true)
|
|
62
|
+
(set @entity.status checked)
|
|
63
|
+
(emit WEIGHTS_ACCEPTED { weights: @cand }))
|
|
64
|
+
(do
|
|
65
|
+
(set @entity.valid false)
|
|
66
|
+
(set @entity.status checked)
|
|
67
|
+
(emit WEIGHTS_REJECTED { violations: @violations, request: ?request })))))
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
state checked {
|
|
71
|
+
INIT -> checked
|
|
72
|
+
(set @entity.status checked)
|
|
73
|
+
RESET -> idle
|
|
74
|
+
(set @entity.weights [])
|
|
75
|
+
(set @entity.baseline [])
|
|
76
|
+
(set @entity.violations [])
|
|
77
|
+
(set @entity.valid false)
|
|
78
|
+
(set @entity.status idle)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
emits {
|
|
82
|
+
WEIGHTS_ACCEPTED -> external {
|
|
83
|
+
weights : [float]!
|
|
84
|
+
}
|
|
85
|
+
@description "All constraint checks passed — magnitude bounds, forbidden regions, and regression are all clear"
|
|
86
|
+
@tier "primary"
|
|
87
|
+
|
|
88
|
+
WEIGHTS_REJECTED -> external {
|
|
89
|
+
violations : [object]!
|
|
90
|
+
request : object
|
|
91
|
+
}
|
|
92
|
+
@description "At least one constraint check failed; violations lists every failing check with its detail (magnitude, forbidden-region, or regression). request echoes the originating request untouched so the next rung can project its own inputs out of it"
|
|
93
|
+
@tier "primary"
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
listens {
|
|
97
|
+
VALIDATE_WEIGHTS {
|
|
98
|
+
weights : [float]!
|
|
99
|
+
baseline : [float]
|
|
100
|
+
request : object
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
page "/ml-weight-validator" as MlWeightValidatorPage -> WeightValidatorRun
|
|
106
|
+
}
|
|
@@ -43,6 +43,7 @@ orbital AppLayoutOrbital {
|
|
|
43
43
|
searchEvent: @config.searchEvent
|
|
44
44
|
topBarActions: @config.topBarActions
|
|
45
45
|
type: @config.layoutPattern
|
|
46
|
+
user: (if @config.viewerName { avatar: @config.viewerAvatar, email: @config.viewerEmail, name: @config.viewerName } null)
|
|
46
47
|
}]
|
|
47
48
|
})
|
|
48
49
|
AppLayoutStateLoaded -> composing
|
|
@@ -94,6 +95,19 @@ orbital AppLayoutOrbital {
|
|
|
94
95
|
@description "Name shown in the top-left of the chrome header."
|
|
95
96
|
@synonyms "app title, product name, brand name, application name, site name"
|
|
96
97
|
@tier "presentation"
|
|
98
|
+
viewerName : string = ""
|
|
99
|
+
@label "Who is signed in"
|
|
100
|
+
@description "Display name of the signed-in viewer, shown in the app bar's account menu — typically @user.name. Blank renders no account menu, so people can see which account (and which persona) they are viewing the app as only when it is actually known."
|
|
101
|
+
@synonyms "signed in user, current user, account, profile, persona, who am i"
|
|
102
|
+
@tier "presentation"
|
|
103
|
+
viewerEmail : string = ""
|
|
104
|
+
@label "Signed-in email"
|
|
105
|
+
@description "Email shown under the name in the account menu — typically @user.email."
|
|
106
|
+
@tier "presentation"
|
|
107
|
+
viewerAvatar : string = ""
|
|
108
|
+
@label "Signed-in avatar"
|
|
109
|
+
@description "Avatar image URL for the account menu."
|
|
110
|
+
@tier "presentation"
|
|
97
111
|
navItems : [NavItem] = []
|
|
98
112
|
@label "Which sections appear in the sidebar?"
|
|
99
113
|
@description "Top-level navigation links shown on the left rail."
|
|
@@ -11,7 +11,7 @@ orbital BillableHourOrbital {
|
|
|
11
11
|
workerName : string @description "The name of the worker associated with the time entry." @synonyms "employee, staff, personnel" = ""
|
|
12
12
|
matterId : string @description "Unique identifier for the associated case or project." @synonyms "caseId, projectID, reference" = ""
|
|
13
13
|
projectId : string @description "Identifier for the project associated with the time entry." @synonyms "project, task, reference" = ""
|
|
14
|
-
workDate :
|
|
14
|
+
workDate : date! @description "The date on which the work was performed." @synonyms "date, transaction date, service date"
|
|
15
15
|
hours : number @description "The quantity of time recorded." @synonyms "duration, time, amount" = 0
|
|
16
16
|
rate : number @description "The hourly charge for the work performed." @synonyms "price, cost, amount" = 0
|
|
17
17
|
description : string @description "A textual explanation of the hour entry." @synonyms "explanation, notes, details, comment" = ""
|
|
@@ -18,11 +18,11 @@ orbital SignatureSessionOrbital {
|
|
|
18
18
|
documentId : string! @description "Unique identifier for the associated document." @synonyms "fileID, docID, documentReference"
|
|
19
19
|
documentName : string @description "The name of the document associated with the signature request." @synonyms "filename, document, file" = ""
|
|
20
20
|
recipientName : string! @description "The name of the recipient for the signature request." @synonyms "recipient, name, user"
|
|
21
|
-
recipientEmail :
|
|
21
|
+
recipientEmail : email! @description "The email address of the recipient." @synonyms "email, address, contact"
|
|
22
22
|
requesterName : string @description "The name of the user initiating the signature request." @synonyms "initiator, sender, originator" = ""
|
|
23
23
|
status : "draft" | "sent" | "viewed" | "signed" | "declined" @description "Current state of the signature request." @synonyms "state, condition, stage" = draft
|
|
24
|
-
sentAt :
|
|
25
|
-
signedAt :
|
|
24
|
+
sentAt : datetime @description "Timestamp indicating when the request was sent." @synonyms "sent date, submission time, dispatched"
|
|
25
|
+
signedAt : datetime @description "The date and time the signature was applied." @synonyms "signed date, completion date, signature time"
|
|
26
26
|
pendingId : string @description "Unique identifier for a pending action or task." @synonyms "taskId, pendingKey, referenceId" = ""
|
|
27
27
|
}
|
|
28
28
|
|
|
@@ -10,11 +10,11 @@ orbital ESignRequestOrbital {
|
|
|
10
10
|
documentId : string! @description "Unique identifier for the associated document." @synonyms "document reference, file ID"
|
|
11
11
|
documentName : string @description "The name of the document being requested for signature." @synonyms "filename, document title, file name" = ""
|
|
12
12
|
recipientName : string! @description "The name of the recipient for the e-signature request." @synonyms "recipient, name, user"
|
|
13
|
-
recipientEmail :
|
|
13
|
+
recipientEmail : email! @description "The email address of the recipient." @synonyms "email, address, contact"
|
|
14
14
|
status : "draft" | "sent" | "viewed" | "signed" | "declined" | "expired" @description "The current stage of the request lifecycle." @synonyms "state, condition, phase" = draft
|
|
15
|
-
sentAt :
|
|
16
|
-
signedAt :
|
|
17
|
-
expiresAt :
|
|
15
|
+
sentAt : datetime @description "Timestamp indicating when the request was sent." @synonyms "sent date, send time, dispatched at"
|
|
16
|
+
signedAt : datetime @description "Timestamp indicating when the request was signed." @synonyms "signed date, signature date, completion date"
|
|
17
|
+
expiresAt : datetime @description "The date and time when the request is no longer valid." @synonyms "expiration, expiry, due date"
|
|
18
18
|
notes : string @description "Free-text comments or additional information." @synonyms "comment, remark, description, details" = ""
|
|
19
19
|
}
|
|
20
20
|
|
|
@@ -22,14 +22,14 @@ orbital EventLogOrbital {
|
|
|
22
22
|
title : string @description "The descriptive name or heading for the event log." @synonyms "heading, label, name" = ""
|
|
23
23
|
description : string @description "A human-readable explanation of the event." @synonyms "text, details, explanation, summary" = ""
|
|
24
24
|
kind : "created" | "updated" | "approved" | "rejected" @description "The type of event being logged." @synonyms "event type, event category, kind, status" = created
|
|
25
|
-
date :
|
|
25
|
+
date : date @description "The timestamp associated with the event." @synonyms "timestamp, time, occurred"
|
|
26
26
|
allEntries : [LogEntry] @description "An array of log entry objects." @synonyms "entries, records, items, data" = []
|
|
27
27
|
entries : [LogEntry] @description "A list of log entries, each with associated data." @synonyms "records, items, data, events" = []
|
|
28
28
|
filterChips : [FilterChip] @description "Represents selectable filter options for event categories." @synonyms "filters, categories, types, selections" = []
|
|
29
29
|
filterKind : string @description "The type of filter currently applied to the event log." @synonyms "filter, category, type" = ""
|
|
30
30
|
backfillTitle : string @description "A descriptive title for a manually added event." @synonyms "manual title, user-provided title, custom title" = ""
|
|
31
31
|
backfillDescription : string @description "A textual explanation for the event backfill process." @synonyms "explanation, details, notes, information" = ""
|
|
32
|
-
backfillDate :
|
|
32
|
+
backfillDate : date @description "The date and time when the event was manually added." @synonyms "timestamp, entered date, manual date"
|
|
33
33
|
backfillKind : string @description "Specifies the category or type of the manually added event." @synonyms "event type, category, kind" = ""
|
|
34
34
|
errorMessage : string @description "A human-readable message indicating an error condition." @synonyms "error, error message, problem, issue" = ""
|
|
35
35
|
}
|
|
@@ -17,7 +17,7 @@ orbital StoredFileOrbital {
|
|
|
17
17
|
uploaderId : string @description "Identifier of the user who uploaded the file." @synonyms "user, owner, creator" = ""
|
|
18
18
|
uploaderName : string @description "The name of the user who uploaded the file." @synonyms "owner, user, author" = ""
|
|
19
19
|
folder : string @description "The path to the containing directory." @synonyms "parent, directory, location" = ""
|
|
20
|
-
uploadedAt :
|
|
20
|
+
uploadedAt : datetime @description "Timestamp indicating when the file was uploaded." @synonyms "upload date, date uploaded, upload time"
|
|
21
21
|
isArchived : boolean @description "Indicates whether the file is archived." @synonyms "archived, status, state" = false
|
|
22
22
|
}
|
|
23
23
|
|
|
@@ -18,7 +18,7 @@ orbital GalleryItemOrbital {
|
|
|
18
18
|
description : string @description "A brief textual summary of the item's content." @synonyms "caption, summary, details, notes"
|
|
19
19
|
status : "active" | "inactive" | "pending" @description "Indicates the current state of the item." @synonyms "state, condition, flag" = active
|
|
20
20
|
createdAt : string
|
|
21
|
-
imageUrl :
|
|
21
|
+
imageUrl : image @description "The URL pointing to the image resource." @synonyms "image, src, path" = "https://picsum.photos/seed/gallery/800/600"
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
trait LoadingSpinner = Spinner.traits.SpinnerRender -> GalleryItem {
|
|
@@ -11,7 +11,7 @@ orbital UploadedImageOrbital {
|
|
|
11
11
|
|
|
12
12
|
entity UploadedImage [persistent: uploadedimages] {
|
|
13
13
|
id : string!
|
|
14
|
-
url :
|
|
14
|
+
url : url! @description "The accessible address for retrieving the image data." @synonyms "link, path, address"
|
|
15
15
|
name : string @description "The filename or identifier for the uploaded image." @synonyms "filename, originalName, identifier"
|
|
16
16
|
sizeBytes : number @description "The file size in bytes." @synonyms "length, filesize, bytes"
|
|
17
17
|
mimeType : string @description "The file's internet media type." @synonyms "type, format, media type"
|
|
@@ -19,7 +19,7 @@ orbital UploadedImageOrbital {
|
|
|
19
19
|
height : number @description "The vertical dimension of the image, in pixels." @synonyms "vertical, y, dimension"
|
|
20
20
|
parentId : string @description "Identifier of the parent resource this image belongs to." @synonyms "parent, reference, source"
|
|
21
21
|
parentType : string @description "Identifies the type of the parent entity." @synonyms "parent, type, category"
|
|
22
|
-
uploadedAt :
|
|
22
|
+
uploadedAt : datetime @description "Timestamp indicating when the image was uploaded." @synonyms "date, timestamp, upload time"
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
trait UploadedImageUpload -> UploadedImage [interaction, collection] {
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
app std-import "1.0.0"
|
|
2
|
+
"std-import — a dropdown source menu (Paste text / Markdown files defaults; caller can override via config.sources) plus the OS file picker for file-kind sources. Emits IMPORT_REQUESTED { source, files } on the bus — source is the picked SourceOption descriptor; files carries file metadata when the picker ran (empty otherwise). The actual import work is delegated to a sibling std-migration-job, which listens for IMPORT_REQUESTED and drives the migration service. Mirrors std-export: the menu emits each entry's own literal event field, so overriding the event alone does not retarget the click — also set sources[].event to match."
|
|
3
|
+
orbital ImportOrbital {
|
|
4
|
+
uses Button from "std/behaviors/ui-button"
|
|
5
|
+
uses Menu from "std/behaviors/ui-menu"
|
|
6
|
+
|
|
7
|
+
type SourceOption = { id : string!, kind : string!, label : string!, event : string }
|
|
8
|
+
|
|
9
|
+
entity ImportPanel [runtime] {
|
|
10
|
+
id : string!
|
|
11
|
+
pendingSource : object = {}
|
|
12
|
+
pendingFiles : [object] = []
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
trait Button1 = Button.traits.ButtonRender -> ImportPanel {
|
|
16
|
+
config {
|
|
17
|
+
action: OPEN_IMPORT
|
|
18
|
+
icon: upload
|
|
19
|
+
label: @config.buttonLabel
|
|
20
|
+
size: sm
|
|
21
|
+
variant: ghost
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
trait Menu1 = Menu.traits.MenuRender -> ImportPanel {
|
|
26
|
+
config {
|
|
27
|
+
items: @config.sources
|
|
28
|
+
position: bottom-start
|
|
29
|
+
trigger: [@trait.Button1]
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
trait ImportMenu -> ImportPanel [interaction, instance] {
|
|
34
|
+
initial: idle
|
|
35
|
+
|
|
36
|
+
state idle {
|
|
37
|
+
INIT -> idle
|
|
38
|
+
(render-ui main { children: [@trait.Menu1], type: box })
|
|
39
|
+
OPEN_IMPORT -> idle
|
|
40
|
+
IMPORT_SOURCE_PICKED -> picking when (== (object/get (array/find @config.sources (fn s (== (object/get @s id) ?itemId))) kind "") "file")
|
|
41
|
+
(set @entity.pendingSource (array/find @config.sources (fn s (== (object/get @s id) ?itemId))))
|
|
42
|
+
(browser/open-file-picker { accept: @config.accept, multiple: true }
|
|
43
|
+
{ emit: { success: FILES_PICKED, failure: PICK_FAILED } })
|
|
44
|
+
IMPORT_SOURCE_PICKED -> idle when (!= (object/get (array/find @config.sources (fn s (== (object/get @s id) ?itemId))) kind "") "file")
|
|
45
|
+
(set @entity.pendingSource (array/find @config.sources (fn s (== (object/get @s id) ?itemId))))
|
|
46
|
+
(emit IMPORT_REQUESTED { files: @entity.pendingFiles, source: @entity.pendingSource })
|
|
47
|
+
;; Self-loops on the external emits so the validator sees in-atom
|
|
48
|
+
;; listeners for events consumed by the sibling std-migration-job.
|
|
49
|
+
IMPORT_REQUESTED -> idle
|
|
50
|
+
IMPORT_FAILED -> idle
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
state picking {
|
|
54
|
+
FILES_PICKED -> idle
|
|
55
|
+
(set @entity.pendingFiles (object/get ?result files []))
|
|
56
|
+
(emit IMPORT_REQUESTED { files: @entity.pendingFiles, source: @entity.pendingSource })
|
|
57
|
+
PICK_FAILED -> idle
|
|
58
|
+
(emit IMPORT_FAILED { error: ?error })
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
emits {
|
|
62
|
+
IMPORT_REQUESTED -> external {
|
|
63
|
+
source : object!
|
|
64
|
+
files : [object]
|
|
65
|
+
}
|
|
66
|
+
@description "Requests an import from the picked source. source is the SourceOption descriptor (id/kind/label); files carries picker metadata (name/size/type/lastModified) for file-kind sources, empty otherwise. A sibling std-migration-job listens and drives the run."
|
|
67
|
+
@synonyms "import, upload, migrate, bring in data"
|
|
68
|
+
@tier "domain"
|
|
69
|
+
IMPORT_FAILED -> external {
|
|
70
|
+
error : string!
|
|
71
|
+
}
|
|
72
|
+
@description "The file picker failed or was cancelled at the OS level"
|
|
73
|
+
@synonyms "import error, picker failed"
|
|
74
|
+
@tier "internal"
|
|
75
|
+
FILES_PICKED {
|
|
76
|
+
result : object!
|
|
77
|
+
}
|
|
78
|
+
@description "browser/open-file-picker success envelope — result.files holds the picked file metadata"
|
|
79
|
+
@tier "secondary"
|
|
80
|
+
PICK_FAILED {
|
|
81
|
+
error : string!
|
|
82
|
+
}
|
|
83
|
+
@description "browser/open-file-picker failure signal"
|
|
84
|
+
@tier "secondary"
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
listens {
|
|
88
|
+
IMPORT_SOURCE_PICKED {
|
|
89
|
+
itemId : string!
|
|
90
|
+
label : string!
|
|
91
|
+
}
|
|
92
|
+
@description "A source entry was picked from the menu. itemId matches the SourceOption.id of the picked entry; kind is resolved from config.sources by id."
|
|
93
|
+
@synonyms "source selected, import source chosen"
|
|
94
|
+
@tier "domain"
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
config {
|
|
98
|
+
accept : string = ".md,.markdown,.txt"
|
|
99
|
+
@label "Accepted file types"
|
|
100
|
+
@description "File-extension filter for the OS file picker when a file-kind source is picked"
|
|
101
|
+
@synonyms "file filter, allowed extensions, accepted formats"
|
|
102
|
+
@tier "presentation"
|
|
103
|
+
buttonLabel : string = Import
|
|
104
|
+
@label "Button label"
|
|
105
|
+
@description "Text shown on the toolbar button that opens the import source popover"
|
|
106
|
+
@synonyms "the text on the import trigger button. user phrases: 'rename import button to X' / 'set the button label to X' -> X (e.g. 'Import Data', 'Add Sources')"
|
|
107
|
+
@tier "presentation"
|
|
108
|
+
event : string = IMPORT_SOURCE_PICKED
|
|
109
|
+
@label "Source-picked event"
|
|
110
|
+
@description "Event emitted when the user picks a source. Each entry in sources[] carries its own literal event field (no per-item templating in .lolo) — overriding this alone does not retarget the click; also set sources[].event to match."
|
|
111
|
+
@synonyms "bus event name. internal wiring; users rarely target directly"
|
|
112
|
+
@tier "internal"
|
|
113
|
+
sources : [SourceOption] = [{
|
|
114
|
+
event: IMPORT_SOURCE_PICKED
|
|
115
|
+
id: paste
|
|
116
|
+
kind: paste
|
|
117
|
+
label: "Paste text"
|
|
118
|
+
}, {
|
|
119
|
+
event: IMPORT_SOURCE_PICKED
|
|
120
|
+
id: markdown
|
|
121
|
+
kind: file
|
|
122
|
+
label: "Markdown files"
|
|
123
|
+
}]
|
|
124
|
+
@label "Import sources"
|
|
125
|
+
@description "Sources shown in the import popover. kind 'file' opens the OS file picker before IMPORT_REQUESTED; any other kind emits immediately (the host renders the matching input UI, e.g. a paste textarea)."
|
|
126
|
+
@synonyms "list of import source entries (paste / file / api / database). user phrases: 'only paste' -> keep only the paste entry; 'add database' -> append a database entry"
|
|
127
|
+
@tier "presentation"
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
page "/imports/menu" as ImportMenuPage -> ImportMenu, Button1, Menu1
|
|
132
|
+
}
|
|
@@ -16,18 +16,18 @@ orbital RecurrenceOrbital {
|
|
|
16
16
|
id : string!
|
|
17
17
|
title : string @description "A short, user-friendly name for the recurrence." @synonyms "label, heading, name" = ""
|
|
18
18
|
notes : string @description "Free-form text providing additional information or context." @synonyms "comment, remark, description, details" = ""
|
|
19
|
-
date :
|
|
19
|
+
date : date @description "The date associated with this occurrence." @synonyms "due date, scheduled date, run date"
|
|
20
20
|
occurrences : [OccurrenceItem] @description "A list of scheduled event instances." @synonyms "events, instances, schedules, runs" = []
|
|
21
21
|
frequency : "daily" | "weekly" | "monthly" | "yearly" @description "How often the recurrence happens." @synonyms "period, repeat, schedule" = weekly
|
|
22
22
|
interval : number @description "The number of time units between occurrences." @synonyms "period, repetition, spacing" = 1
|
|
23
|
-
startDate :
|
|
24
|
-
endDate :
|
|
23
|
+
startDate : date @description "The date when the recurrence begins." @synonyms "start date, begin date, initial date"
|
|
24
|
+
endDate : date @description "The date when the recurrence ends." @synonyms "end date, termination date, final date"
|
|
25
25
|
endAfterCount : number @description "The number of occurrences after which the recurrence ends." @synonyms "count, limit, total" = 0
|
|
26
26
|
summaryText : string @description "A human-readable summary of the recurrence rule." @synonyms "description, rule summary, explanation" = ""
|
|
27
27
|
currentOccurrenceId : string @description "Unique identifier for the currently active occurrence." @synonyms "occurrence ID, run ID, current run" = ""
|
|
28
|
-
currentOccurrenceDate :
|
|
28
|
+
currentOccurrenceDate : date @description "The date of the currently active occurrence." @synonyms "occurrence date, current date, run date"
|
|
29
29
|
currentOccurrenceLabel : string @description "A human-readable label for the current occurrence." @synonyms "current run, present instance, now" = ""
|
|
30
|
-
rescheduleDate :
|
|
30
|
+
rescheduleDate : date @description "The date to which the recurrence is rescheduled." @synonyms "new date, replacement date, revised date"
|
|
31
31
|
skipReason : string @description "Reason provided when skipping a scheduled occurrence." @synonyms "rationale, explanation, justification" = ""
|
|
32
32
|
errorMessage : string @description "Error message displayed to the user." @synonyms "error, message, problem" = ""
|
|
33
33
|
}
|
|
@@ -17,7 +17,7 @@ orbital SavedSearchOrbital {
|
|
|
17
17
|
alertEnabled : boolean @description "Indicates whether alerts are enabled for this saved search." @synonyms "enabled, active, notification status" = false
|
|
18
18
|
alertFrequency : "instant" | "daily" | "weekly" @description "How often alerts are triggered." @synonyms "frequency, interval, recurrence" = daily
|
|
19
19
|
userId : string @description "Identifier of the user who created the saved search." @synonyms "creator, owner, user_id"
|
|
20
|
-
lastNotifiedAt :
|
|
20
|
+
lastNotifiedAt : datetime @description "Timestamp of the last notification sent." @synonyms "last_notification, notified_at, last_alert"
|
|
21
21
|
createdAt : string
|
|
22
22
|
}
|
|
23
23
|
|
|
@@ -15,7 +15,7 @@ orbital SignatureCaptureOrbital {
|
|
|
15
15
|
targetType : string! @description "Specifies the type of target associated with the signature." @synonyms "type, kind, category"
|
|
16
16
|
signerName : string! @description "The name of the person providing the signature." @synonyms "name, user, person"
|
|
17
17
|
signatureDataUrl : string! @description "Encoded signature image data, typically a data URL." @synonyms "signature image, image data, signature representation"
|
|
18
|
-
signedAt :
|
|
18
|
+
signedAt : datetime @description "Timestamp indicating when the signature was captured." @synonyms "date, time, timestamp"
|
|
19
19
|
ipAddress : string @description "The client's IP address during signature capture." @synonyms "client IP, source IP, originating IP"
|
|
20
20
|
}
|
|
21
21
|
|
|
@@ -56,7 +56,7 @@ orbital TagTaxonomyOrbital {
|
|
|
56
56
|
children: [{
|
|
57
57
|
align: center
|
|
58
58
|
children: [{
|
|
59
|
-
name: tag
|
|
59
|
+
name: "tag"
|
|
60
60
|
size: sm
|
|
61
61
|
type: icon
|
|
62
62
|
}, {
|
|
@@ -168,7 +168,7 @@ orbital TagTaxonomyOrbital {
|
|
|
168
168
|
children: [{
|
|
169
169
|
align: center
|
|
170
170
|
children: [{
|
|
171
|
-
name: tag
|
|
171
|
+
name: "tag"
|
|
172
172
|
size: sm
|
|
173
173
|
type: icon
|
|
174
174
|
}, {
|
|
@@ -266,7 +266,7 @@ orbital TagTaxonomyOrbital {
|
|
|
266
266
|
children: [{
|
|
267
267
|
align: center
|
|
268
268
|
children: [{
|
|
269
|
-
name: tag
|
|
269
|
+
name: "tag"
|
|
270
270
|
size: sm
|
|
271
271
|
type: icon
|
|
272
272
|
}, {
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
app ui-import-preview-tree "1.0.0"
|
|
2
|
+
"ImportPreviewTree — UI factory (1:1 with the @almadar/ui import-preview-tree pattern)."
|
|
3
|
+
orbital ImportPreviewTreeOrbital {
|
|
4
|
+
type ImportPreviewTreeUnitsItem = {
|
|
5
|
+
ref : string!
|
|
6
|
+
targetEntity : string!
|
|
7
|
+
fields : Map string json!
|
|
8
|
+
parentRef : string
|
|
9
|
+
}
|
|
10
|
+
type ImportPreviewTreeSkippedItem = {
|
|
11
|
+
ref : string!
|
|
12
|
+
reason : string!
|
|
13
|
+
}
|
|
14
|
+
type ImportPreviewTreeEntityDisplayValue = {
|
|
15
|
+
singular : string!
|
|
16
|
+
plural : string!
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
entity ImportPreviewTreeItem [runtime] {
|
|
20
|
+
id : string!
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
trait ImportPreviewTreeRender -> @rebindable ImportPreviewTreeItem [interaction, instance] {
|
|
24
|
+
initial: idle
|
|
25
|
+
|
|
26
|
+
state idle {
|
|
27
|
+
INIT -> idle
|
|
28
|
+
(render-ui main {
|
|
29
|
+
units: @config.units
|
|
30
|
+
skipped: @config.skipped
|
|
31
|
+
entityDisplay: @config.entityDisplay
|
|
32
|
+
onConfirm: @config.onConfirm
|
|
33
|
+
onCancel: @config.onCancel
|
|
34
|
+
confirmLabel: @config.confirmLabel
|
|
35
|
+
cancelLabel: @config.cancelLabel
|
|
36
|
+
indent: @config.indent
|
|
37
|
+
className: @config.className
|
|
38
|
+
type: import-preview-tree
|
|
39
|
+
})
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
emits {
|
|
43
|
+
@config.onConfirm -> external {
|
|
44
|
+
id : string
|
|
45
|
+
}
|
|
46
|
+
@description "Called when the user confirms the staged import"
|
|
47
|
+
@tier "essential"
|
|
48
|
+
@config.onCancel -> external {
|
|
49
|
+
id : string
|
|
50
|
+
}
|
|
51
|
+
@description "Called when the user cancels the staged import"
|
|
52
|
+
@tier "essential"
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
config {
|
|
56
|
+
units : [ImportPreviewTreeUnitsItem] = [{ ref: "Ref", targetEntity: "Target Entity", fields: {}, parentRef: "Parent Ref" }, { ref: "Ref 2", targetEntity: "Target Entity 2", fields: {}, parentRef: "Parent Ref 2" }]
|
|
57
|
+
@label "Units"
|
|
58
|
+
@description "Staged units to preview"
|
|
59
|
+
@tier "presentation"
|
|
60
|
+
skipped : [ImportPreviewTreeSkippedItem] = []
|
|
61
|
+
@label "Skipped"
|
|
62
|
+
@description "Elements skipped during extraction, with reasons"
|
|
63
|
+
@tier "presentation"
|
|
64
|
+
entityDisplay : Map string ImportPreviewTreeEntityDisplayValue = { item: { singular: "Singular", plural: "Plural" } }
|
|
65
|
+
@label "Entity Display"
|
|
66
|
+
@description "Entity name → display labels; falls back to the entity name"
|
|
67
|
+
@tier "presentation"
|
|
68
|
+
onConfirm : string = "CONFIRM"
|
|
69
|
+
@label "On Confirm"
|
|
70
|
+
@description "Called when the user confirms the staged import"
|
|
71
|
+
@tier "presentation"
|
|
72
|
+
onCancel : string = "CANCEL"
|
|
73
|
+
@label "On Cancel"
|
|
74
|
+
@description "Called when the user cancels the staged import"
|
|
75
|
+
@tier "presentation"
|
|
76
|
+
confirmLabel : string = "Confirm import"
|
|
77
|
+
@label "Confirm Label"
|
|
78
|
+
@description "Confirm button label"
|
|
79
|
+
@tier "presentation"
|
|
80
|
+
cancelLabel : string = Cancel
|
|
81
|
+
@label "Cancel Label"
|
|
82
|
+
@description "Cancel button label"
|
|
83
|
+
@tier "presentation"
|
|
84
|
+
indent : number = 16
|
|
85
|
+
@label "Indent"
|
|
86
|
+
@description "Indent per tree depth in px (default: 16)"
|
|
87
|
+
@tier "presentation"
|
|
88
|
+
className : string
|
|
89
|
+
@label "Class Name"
|
|
90
|
+
@description "Additional CSS classes"
|
|
91
|
+
@tier "presentation"
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
page "/import-preview-tree" as ImportPreviewTreePage -> ImportPreviewTreeRender
|
|
96
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
app ui-import-progress "1.0.0"
|
|
2
|
+
"ImportProgress — UI factory (1:1 with the @almadar/ui import-progress pattern)."
|
|
3
|
+
orbital ImportProgressOrbital {
|
|
4
|
+
type ImportProgressCounts = {
|
|
5
|
+
staged : number
|
|
6
|
+
committed : number
|
|
7
|
+
failed : number
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
entity ImportProgressItem [runtime] {
|
|
11
|
+
id : string!
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
trait ImportProgressRender -> @rebindable ImportProgressItem [interaction, instance] {
|
|
15
|
+
initial: idle
|
|
16
|
+
|
|
17
|
+
state idle {
|
|
18
|
+
INIT -> idle
|
|
19
|
+
(render-ui main {
|
|
20
|
+
step: @config.step
|
|
21
|
+
counts: @config.counts
|
|
22
|
+
labels: @config.labels
|
|
23
|
+
className: @config.className
|
|
24
|
+
type: import-progress
|
|
25
|
+
})
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
config {
|
|
29
|
+
step : "fetching" | "mapping" | "reviewing" | "committing" | "done" | "failed" = fetching
|
|
30
|
+
@label "Step"
|
|
31
|
+
@description "Current lifecycle step"
|
|
32
|
+
@tier "presentation"
|
|
33
|
+
counts : ImportProgressCounts
|
|
34
|
+
@label "Counts"
|
|
35
|
+
@description "Unit counts"
|
|
36
|
+
@tier "presentation"
|
|
37
|
+
labels : Map string string = { item: "Item" }
|
|
38
|
+
@label "Labels"
|
|
39
|
+
@description "Step label overrides"
|
|
40
|
+
@tier "presentation"
|
|
41
|
+
className : string
|
|
42
|
+
@label "Class Name"
|
|
43
|
+
@description "Additional CSS classes"
|
|
44
|
+
@tier "presentation"
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
page "/import-progress" as ImportProgressPage -> ImportProgressRender
|
|
49
|
+
}
|