-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathaction.json
More file actions
165 lines (165 loc) · 8.21 KB
/
Copy pathaction.json
File metadata and controls
165 lines (165 loc) · 8.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
{
"type": "action",
"_note": "ActionSchema. Seeded from docs/audits/2026-06-actionschema-property-liveness.md. Renderers live in objectui (evidence cited as prose, not framework paths); framework-side: service-ai action-tools, runtime body-runner/http-dispatcher. Containers (params/resultDialog/ai/aria) classified at top level — no divergent sub-statuses in the audit. ⚠ EVIDENCE LIVES IN CLOUD/EE: the `packages/services/service-ai/...` paths cited below are the closed `@objectstack/service-ai` runtime in the CLOUD repo, NOT git-tracked framework code (the framework's own service-ai tree is a stale build artifact with no src/). These props are `live` because that cloud runtime consumes them; the OPEN framework edition does not — see content/docs/ai for the open/cloud boundary.",
"props": {
"name": {
"status": "live",
"evidence": "objectui action renderers + runtime dispatcher"
},
"label": {
"status": "live",
"note": "display."
},
"objectName": {
"status": "live",
"evidence": "packages/services/service-ai/src/tools/action-tools.ts:535",
"note": "action dispatch + AI bridge."
},
"icon": {
"status": "live",
"note": "objectui renderers."
},
"locations": {
"status": "live",
"note": "objectui — where the action is surfaced."
},
"component": {
"status": "live",
"note": "objectui visual component override."
},
"type": {
"status": "live",
"evidence": "packages/runtime/src/http-dispatcher.ts",
"note": "api/script/flow wired; url thinner; modal PARTIAL (maps to serverActionHandler, not a real modal); form LIVE via objectui ActionRunner.executeForm (routes a type:'form' action to the FormView at /forms/:target, forwarding the current record id) — the 2026-06 audit mis-classified as dead (objectui renderer not re-verified; fixed the 'Log Time does nothing' report). Build-time lint-view-refs.ts validates the form target resolves to a form view."
},
"target": {
"status": "live",
"evidence": "packages/runtime/src/http-dispatcher.ts",
"note": "URL/script/flow/endpoint + ${param}/${ctx} interpolation."
},
"body": {
"status": "live",
"evidence": "packages/runtime/src/http-dispatcher.ts",
"note": "server script (L1/L2) via engine.executeAction→body-runner."
},
"execute": {
"status": "live",
"evidence": "objectui: packages/app-shell/src/views/metadata-admin/previews/ActionPreview.tsx:154",
"note": "LIVE via objectui metadata-admin authoring UI — the 2026-06 audit missed objectui; verified by reading the file."
},
"params": {
"status": "live",
"evidence": "packages/services/service-ai/src/tools/action-tools.ts",
"note": "field/objectOverride/defaultFromRow/options/placeholder/helpText/defaultValue/required all consumed."
},
"variant": {
"status": "live",
"note": "objectui button styling."
},
"order": {
"status": "live",
"evidence": "packages/spec/src/stack.zod.ts (mergeActionsIntoObjects stable-sorts each action group by order)",
"note": "Deterministic action ordering (#2670). Framework stable-sorts every action group by `order` at defineStack/composeStacks time; objectui record_header picks the first as the primary button. Lower = higher; unset = 0."
},
"confirmText": {
"status": "live",
"note": "objectui confirm dialog."
},
"successMessage": {
"status": "live",
"note": "objectui toast."
},
"errorMessage": {
"status": "live",
"note": "objectui toast (error counterpart of successMessage; added #1990)."
},
"undoable": {
"status": "experimental",
"note": "Declared + demoed in #1992 (example-crm reassign) but no runtime reader yet: neither service-automation nor objectui consume the action's `undoable` flag (objectui has an UndoManager but does not key off this field). Promote to live once a consumer is wired."
},
"refreshAfter": {
"status": "live",
"note": "objectui post-action refresh."
},
"resultDialog": {
"status": "live",
"note": "objectui one-shot result reveal {title,description,acknowledge,format,fields}."
},
"visible": {
"status": "live",
"note": "objectui — CEL, fail-closed."
},
"requiresFeature": {
"status": "live",
"evidence": "packages/spec/src/kernel/public-auth-features.ts (lowerRequiresFeature), wired as a .transform() in packages/spec/src/ui/action.zod.ts",
"note": "Author-facing sugar, consumed AT PARSE TIME: lowered into the (already-live) `visible` predicate per the PUBLIC_AUTH_FEATURES registry semantics and stripped from the output, so no downstream consumer ever sees it. Guarded by the #2874 drift + completeness tests (plugin-auth public-feature-registry.test.ts, platform-objects feature-gate-guard.test.ts)."
},
"requiredPermissions": {
"status": "live",
"evidence": "packages/runtime/src/http-dispatcher.ts",
"note": "ADR-0066 D4 dual-surface action gate. Server is source of truth: handleActions rejects (403) when the caller's systemPermissions don't cover action.requiredPermissions; objectui ActionRunner derives the same UI hide/disable. Unit-proven in packages/runtime/src/http-dispatcher.test.ts + packages/spec/src/ui/action.test.ts."
},
"disabled": {
"status": "live",
"evidence": "objectui: components action-button/-group/-icon/-menu + app-shell DeclaredActionsBar + plugin-detail record-quick-actions — all six rendering surfaces gate the Button on the predicate",
"note": "EVIDENCE CORRECTED 2026-07 (#1878 §3 recheck): previously cited the metadata-admin PREVIEW renderer, which only echoes the authored value. At that time the predicate was actually enforced on ONE of six surfaces (#1885 wired action:button alone) — the 'live' verdict was right for the wrong reason and hid a real silent no-op on the other five. objectui#2863 wired the rest; showcase specimen `showcase_archive_task` (#3643) dogfoods it."
},
"shortcut": {
"status": "live",
"evidence": "objectui: packages/app-shell/src/views/metadata-admin/previews/ActionPreview.tsx:158",
"note": "LIVE via objectui metadata-admin authoring UI — the 2026-06 audit missed objectui; verified by reading the file."
},
"bulkEnabled": {
"status": "live",
"evidence": "objectui: packages/app-shell/src/views/metadata-admin/previews/ActionPreview.tsx:159",
"note": "LIVE via objectui metadata-admin authoring UI — the 2026-06 audit missed objectui; verified by reading the file."
},
"ai": {
"status": "live",
"evidence": "packages/services/service-ai/src/tools/action-tools.ts",
"note": "full AI bridge (exposed/description/category/paramHints/outputSchema/requiresConfirmation)."
},
"recordIdParam": {
"status": "live",
"note": "objectui + dispatcher."
},
"recordIdField": {
"status": "live",
"note": "objectui + dispatcher."
},
"bodyShape": {
"status": "live",
"evidence": "packages/runtime/src/http-dispatcher.ts",
"note": "{wrap} request shaping."
},
"method": {
"status": "live",
"evidence": "packages/runtime/src/http-dispatcher.ts"
},
"bodyExtra": {
"status": "live",
"evidence": "packages/runtime/src/http-dispatcher.ts"
},
"mode": {
"status": "live",
"note": "PARTIAL — read only by the AI HITL heuristic (action-tools.ts), never by the UI."
},
"opensInNewTab": {
"status": "live",
"note": "objectui."
},
"newTabUrl": {
"status": "live",
"note": "objectui."
},
"openIn": {
"status": "live",
"evidence": "objectui ActionRunner.executeUrl (objectui issue #2043)",
"note": "Declarative new-tab control for STATIC type:'url' targets. ActionRunner.executeUrl reads action.openIn with priority over the legacy params.newTab/external-URL heuristic; action-button/icon/menu/group + basic/elements renderers forward it. Distinct from opensInNewTab/newTabUrl (async SSO pre-open)."
},
"aria": {
"status": "live",
"note": "PARTIAL — honored by a few objectui renderers, not the core action buttons/menus."
}
}
}