@culvii/cli 0.0.7 → 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/COMMANDS.md +5 -5
  2. package/README.md +15 -6
  3. package/USAGE.md +11 -10
  4. package/dist/DeployView-D4UEXMDJ.js +2 -0
  5. package/dist/DevView-GPKSSOLA.js +2 -0
  6. package/dist/EnvView-3ZURMIZS.js +2 -0
  7. package/dist/{HelpView-YLCEPIFY.js → HelpView-PELQJJQQ.js} +1 -1
  8. package/dist/WhoamiView-TKSYSHQ2.js +2 -0
  9. package/dist/{WorkspaceView-RNFALIPM.js → WorkspaceView-ID7ZMBHV.js} +1 -1
  10. package/dist/{chunk-IRZMWFC3.js → chunk-KM7ZWOEG.js} +1 -1
  11. package/dist/index.js +31 -681
  12. package/dist/lib/evaluator.js +2 -2
  13. package/dist/login-3OMS75QL.js +39 -0
  14. package/dist/{logout-TDZA462P.js → logout-ZYTERDYA.js} +1 -1
  15. package/dist/skill-bundle-Z4FQO3CQ.js +2553 -0
  16. package/package.json +9 -5
  17. package/skills/culvii/.culvii-skill.json +90 -0
  18. package/skills/culvii/SKILL.md +104 -0
  19. package/skills/culvii/agents/openai.yaml +4 -0
  20. package/skills/culvii/examples/agent-workflow.culvii.ts +47 -0
  21. package/skills/culvii/examples/binary-document-workflow.culvii.ts +80 -0
  22. package/skills/culvii/examples/complete-workflow.culvii.ts +81 -0
  23. package/skills/culvii/examples/custom-output-surface.culvii.ts +69 -0
  24. package/skills/culvii/examples/custom-wait-surface.culvii.ts +90 -0
  25. package/skills/culvii/examples/human-in-the-loop-workflow.culvii.ts +125 -0
  26. package/skills/culvii/examples/integration-agent-workflow.culvii.ts +101 -0
  27. package/skills/culvii/examples/multi-agent-workflow-tools.culvii.ts +157 -0
  28. package/skills/culvii/examples/nested-agent-workflow.culvii.ts +108 -0
  29. package/skills/culvii/examples/output-surface.culvii.ts +45 -0
  30. package/skills/culvii/examples/wait-surface.culvii.ts +24 -0
  31. package/skills/culvii/references/agents.md +77 -0
  32. package/skills/culvii/references/authoring-files.md +21 -0
  33. package/skills/culvii/references/cli-guide.md +22 -0
  34. package/skills/culvii/references/cli-reference.md +217 -0
  35. package/skills/culvii/references/feedback-cycle.md +43 -0
  36. package/skills/culvii/references/integrations.md +13 -0
  37. package/skills/culvii/references/kit-api.md +35 -0
  38. package/skills/culvii/references/node-argocd.md +44 -0
  39. package/skills/culvii/references/node-clickup-doc.md +38 -0
  40. package/skills/culvii/references/node-clickup-ticket.md +47 -0
  41. package/skills/culvii/references/node-core-agent.md +27 -0
  42. package/skills/culvii/references/node-core-browser-automation.md +53 -0
  43. package/skills/culvii/references/node-core-code.md +28 -0
  44. package/skills/culvii/references/node-core-http.md +42 -0
  45. package/skills/culvii/references/node-core-if.md +26 -0
  46. package/skills/culvii/references/node-core-jwt.md +31 -0
  47. package/skills/culvii/references/node-core-loop-break.md +26 -0
  48. package/skills/culvii/references/node-core-loop-continue.md +26 -0
  49. package/skills/culvii/references/node-core-loop-output.md +24 -0
  50. package/skills/culvii/references/node-core-loop.md +25 -0
  51. package/skills/culvii/references/node-core-merge.md +23 -0
  52. package/skills/culvii/references/node-core-set.md +24 -0
  53. package/skills/culvii/references/node-core-switch.md +24 -0
  54. package/skills/culvii/references/node-cost-explorer.md +45 -0
  55. package/skills/culvii/references/node-cron-trigger.md +25 -0
  56. package/skills/culvii/references/node-elasticsearch.md +39 -0
  57. package/skills/culvii/references/node-github-poll-trigger.md +31 -0
  58. package/skills/culvii/references/node-github-webhook-trigger.md +27 -0
  59. package/skills/culvii/references/node-github.md +251 -0
  60. package/skills/culvii/references/node-gmail-trigger.md +44 -0
  61. package/skills/culvii/references/node-gmail.md +57 -0
  62. package/skills/culvii/references/node-google-calendar.md +51 -0
  63. package/skills/culvii/references/node-google-docs.md +46 -0
  64. package/skills/culvii/references/node-grafana-dashboard.md +38 -0
  65. package/skills/culvii/references/node-grafana-data-source.md +42 -0
  66. package/skills/culvii/references/node-grafana-query.md +34 -0
  67. package/skills/culvii/references/node-hibp-list-domains.md +27 -0
  68. package/skills/culvii/references/node-hibp-stealer-logs.md +30 -0
  69. package/skills/culvii/references/node-kubernetes.md +51 -0
  70. package/skills/culvii/references/node-manual-trigger.md +24 -0
  71. package/skills/culvii/references/node-microsoft-outlook-trigger.md +41 -0
  72. package/skills/culvii/references/node-microsoft-outlook.md +56 -0
  73. package/skills/culvii/references/node-microsoft-sharepoint.md +40 -0
  74. package/skills/culvii/references/node-onionsearch.md +27 -0
  75. package/skills/culvii/references/node-prometheus.md +40 -0
  76. package/skills/culvii/references/node-s3.md +40 -0
  77. package/skills/culvii/references/node-slack-events-trigger.md +37 -0
  78. package/skills/culvii/references/node-slack-interactions-trigger.md +28 -0
  79. package/skills/culvii/references/node-slack-trigger.md +40 -0
  80. package/skills/culvii/references/node-slack.md +162 -0
  81. package/skills/culvii/references/node-supabase.md +61 -0
  82. package/skills/culvii/references/node-twilio.md +39 -0
  83. package/skills/culvii/references/node-wait-timer.md +24 -0
  84. package/skills/culvii/references/node-webhook-trigger.md +24 -0
  85. package/skills/culvii/references/nodes-index.md +51 -0
  86. package/skills/culvii/references/runtime-values.md +36 -0
  87. package/skills/culvii/references/surface-authoring.md +38 -0
  88. package/skills/culvii/references/surface-display.md +390 -0
  89. package/skills/culvii/references/surface-feedback.md +38 -0
  90. package/skills/culvii/references/surface-input-actions.md +143 -0
  91. package/skills/culvii/references/surface-layout.md +97 -0
  92. package/skills/culvii/references/validation.md +18 -0
  93. package/skills/culvii/references/workflows.md +30 -0
  94. package/dist/DeployView-GEJNL26A.js +0 -2
  95. package/dist/DevView-SOPAMSZ4.js +0 -2
  96. package/dist/EnvView-MCZC2NBO.js +0 -2
  97. package/dist/WhoamiView-67HV2L5J.js +0 -2
  98. package/dist/chunk-MPKGJC7N.js +0 -2
  99. package/dist/login-G5QUR55L.js +0 -36
  100. /package/dist/{chunk-5NBKYMD7.js → chunk-56C3DFV2.js} +0 -0
  101. /package/dist/{chunk-JFIFRAAR.js → chunk-RS5GDTRN.js} +0 -0
@@ -0,0 +1,390 @@
1
+ # Surface display components
2
+
3
+ ## Avatar
4
+
5
+ Initials derived from a name or email.
6
+
7
+ - Children: `none`
8
+
9
+ Props:
10
+
11
+ - `email` (string; bindable) — Fallback source for initials.
12
+
13
+ - `label` (string; bindable) — Text beside the avatar.
14
+
15
+ - `name` (string; bindable) — Name used for initials.
16
+
17
+ - `size` (string; literal; values: "sm" | "md" | "lg") — Avatar size.
18
+
19
+ ## Badge
20
+
21
+ Small label with an explicit tone.
22
+
23
+ - Children: `none`
24
+
25
+ Props:
26
+
27
+ - `format` (string; literal; values: "text" | "number" | "compact" | "percent" | "currency" | "bytes" | "duration" | "date" | "datetime" | "time" | "list" | "json" | "boolean") — Display format.
28
+
29
+ - `maxChars` (number; literal; integer; min 1) — Maximum displayed characters.
30
+
31
+ - `text` (any; bindable) — Badge label.
32
+
33
+ - `tone` (string; literal; values: "neutral" | "info" | "success" | "warning" | "error") — Badge tone.
34
+
35
+ - `transform` (string; literal; values: "capitalize" | "title" | "upper" | "lower" | "humanize") — Text transform.
36
+
37
+ ## Code
38
+
39
+ Monospace text block.
40
+
41
+ - Children: `none`
42
+ - Limits: `{"characters":20000}`
43
+
44
+ Props:
45
+
46
+ - `label` (string; bindable) — Block label.
47
+
48
+ - `text` (any; bindable) — Code or payload.
49
+
50
+ - `wrap` (boolean; literal) — Wrap long lines.
51
+
52
+ ## DiffView
53
+
54
+ Structural JSON or line-by-line text comparison.
55
+
56
+ - Children: `none`
57
+ - Limits: `{"depth":6,"children":100,"lines":2000,"characters":200000}`
58
+
59
+ Props:
60
+
61
+ - `after` (any; bindable) — Proposed value.
62
+
63
+ - `before` (any; bindable) — Prior value.
64
+
65
+ - `mode` (string; literal; values: "json" | "text") — Comparison mode.
66
+
67
+ ## Duration
68
+
69
+ A duration in milliseconds or between two instants.
70
+
71
+ - Children: `none`
72
+
73
+ Props:
74
+
75
+ - `end` (union; bindable) — End instant.
76
+ - Variant 1: string; literal
77
+ - Variant 2: number; literal
78
+
79
+ - `size` (string; literal; values: "xs" | "sm" | "md" | "lg") — Displayed value size.
80
+
81
+ - `start` (union; bindable) — Start instant.
82
+ - Variant 1: string; literal
83
+ - Variant 2: number; literal
84
+
85
+ - `tone` (string; literal; values: "default" | "muted" | "success" | "warning" | "error" | "info") — Displayed value tone.
86
+
87
+ - `unit` (string; literal; values: "seconds" | "ms") — Numeric instant unit.
88
+
89
+ - `value` (number; bindable; min 0) — Duration in milliseconds.
90
+
91
+ ## EmailMessageCard
92
+
93
+ Inbox list or opened email message.
94
+
95
+ - Children: `none`
96
+ - Limits: `{"renderedMessages":50}`
97
+
98
+ Props:
99
+
100
+ - `body` (string; bindable) — Message body.
101
+
102
+ - `cc` (string; bindable) — Carbon-copy recipients.
103
+
104
+ - `date` (union; bindable) — Sent or received instant.
105
+ - Variant 1: string; literal
106
+ - Variant 2: number; literal
107
+
108
+ - `emptyText` (string; bindable) — Empty-state text.
109
+
110
+ - `fields` (object; literal) — Field-name mapping.
111
+
112
+ - `from` (string; bindable) — Sender.
113
+
114
+ - `labels` (array; bindable) — Message labels.
115
+ - Items: string; literal
116
+
117
+ - `message` (object; bindable) — Single message.
118
+
119
+ - `messages` (array; bindable) — Message list.
120
+ - Items: object; literal
121
+
122
+ - `snippet` (string; bindable) — Preview text.
123
+
124
+ - `subject` (string; bindable) — Subject.
125
+
126
+ - `to` (string; bindable) — Recipients.
127
+
128
+ - `unread` (boolean; bindable) — Unread state.
129
+
130
+ ## FileChip
131
+
132
+ Metadata and download affordance for a produced file. Binding `file` alone does not make the chip clickable — declare `actions.default` as a `navigate` action with `href` bound to the same descriptor's `downloadUrl` path (e.g. `{ path: "/$binary/<step>/main/0/0/<key>/downloadUrl" }`), or the chip renders as a read-only file summary with no download button.
133
+
134
+ - Children: `none`
135
+ - Interaction: `single-action`
136
+
137
+ Props:
138
+
139
+ - `file` (object; bindable) — Binary descriptor.
140
+ - `downloadUrl` (string; literal) — Protected download URL.
141
+ - `fileName` (string; literal) — Original file name.
142
+ - `key` (string; literal; required) — Binary property key.
143
+ - `mimeType` (string; literal) — MIME type.
144
+ - `size` (number; literal; min 0) — File size in bytes.
145
+
146
+ - `label` (string; bindable) — Displayed file name.
147
+
148
+ ## Heading
149
+
150
+ A section title.
151
+
152
+ - Children: `none`
153
+
154
+ Props:
155
+
156
+ - `level` (number; literal; values: 1 | 2 | 3; integer) — Heading level.
157
+
158
+ - `maxChars` (number; literal; integer; min 1) — Maximum displayed characters.
159
+
160
+ - `text` (any; bindable) — Heading text.
161
+
162
+ - `transform` (string; literal; values: "capitalize" | "title" | "upper" | "lower" | "humanize") — Text transform.
163
+
164
+ ## HtmlRenderer
165
+
166
+ Sandboxed HTML fragment renderer.
167
+
168
+ - Children: `none`
169
+ - Limits: `{"characters":20000}`
170
+
171
+ Props:
172
+
173
+ - `allowRemoteImages` (boolean; literal) — Allow remote HTTPS images.
174
+
175
+ - `emptyText` (string; bindable) — Empty-state text.
176
+
177
+ - `height` (number; literal; min 80; max 1200) — Frame height in pixels.
178
+
179
+ - `html` (string; bindable) — HTML markup.
180
+
181
+ - `label` (string; bindable) — Frame label.
182
+
183
+ ## JsonInspector
184
+
185
+ Collapsible JSON tree and default fallback renderer.
186
+
187
+ - Children: `none`
188
+
189
+ Props:
190
+
191
+ - `collapsed` (boolean; literal) — Start collapsed.
192
+
193
+ - `value` (any; bindable) — Any JSON value.
194
+
195
+ ## KeyValue
196
+
197
+ Declared label/value entries or a bound object.
198
+
199
+ - Children: `none`
200
+
201
+ Props:
202
+
203
+ - `columns` (number; literal; values: 1 | 2; integer) — Pairs per row.
204
+
205
+ - `dense` (boolean; literal) — Use tighter row spacing.
206
+
207
+ - `emptyText` (string; bindable) — Empty-state text.
208
+
209
+ - `entries` (array; bindable) — Declared label/value entries.
210
+ - Items: object; literal
211
+ - `currency` (string; literal) — ISO 4217 currency code.
212
+ - `decimals` (number; literal; integer; min 0; max 20) — Fixed decimal places.
213
+ - `format` (string; literal; values: "text" | "number" | "compact" | "percent" | "currency" | "bytes" | "duration" | "date" | "datetime" | "time" | "list" | "json" | "boolean") — Display format.
214
+ - `label` (string; bindable) — Row label.
215
+ - `map` (object; literal) — Map known displayed values to labels.
216
+ - `maxChars` (number; literal; integer; min 1) — Maximum displayed characters.
217
+ - `mono` (boolean; literal) — Render the value in monospace.
218
+ - `tone` (string; literal; values: "default" | "muted" | "success" | "warning" | "error" | "info") — Displayed value tone.
219
+ - `transform` (string; literal; values: "capitalize" | "title" | "upper" | "lower" | "humanize") — Text transform.
220
+ - `type` (string; literal; values: "status") — Set to status to render a status pill.
221
+ - `unit` (string; literal; values: "seconds" | "ms") — Numeric timestamp unit.
222
+ - `value` (any; bindable) — Row value.
223
+
224
+ - `hideEmpty` (boolean; literal) — Hide missing values.
225
+
226
+ - `humanizeKeys` (boolean; literal) — Humanize object keys.
227
+
228
+ - `mono` (boolean; literal) — Render shorthand values in monospace.
229
+
230
+ - `value` (object; bindable) — Object whose keys become labels.
231
+
232
+ ## Money
233
+
234
+ A formatted currency amount.
235
+
236
+ - Children: `none`
237
+
238
+ Props:
239
+
240
+ - `currency` (string; bindable) — ISO 4217 currency code.
241
+
242
+ - `decimals` (number; literal; integer; min 0; max 20) — Fixed decimal places.
243
+
244
+ - `signed` (boolean; literal) — Colour positive and negative values.
245
+
246
+ - `size` (string; literal; values: "xs" | "sm" | "md" | "lg") — Displayed value size.
247
+
248
+ - `tone` (string; literal; values: "default" | "muted" | "success" | "warning" | "error" | "info") — Displayed value tone.
249
+
250
+ - `value` (number; bindable) — Currency amount.
251
+
252
+ ## Stat
253
+
254
+ One prominent value with a label and caption.
255
+
256
+ - Children: `none`
257
+
258
+ Props:
259
+
260
+ - `caption` (any; bindable) — Caption below the value.
261
+
262
+ - `captionTransform` (string; literal; values: "capitalize" | "title" | "upper" | "lower" | "humanize") — Caption transform.
263
+
264
+ - `currency` (string; literal) — ISO 4217 currency code.
265
+
266
+ - `decimals` (number; literal; integer; min 0; max 20) — Fixed decimal places.
267
+
268
+ - `format` (string; literal; values: "text" | "number" | "compact" | "percent" | "currency" | "bytes" | "duration" | "date" | "datetime" | "time" | "list" | "json" | "boolean") — Display format.
269
+
270
+ - `label` (string; bindable) — Label above the value.
271
+
272
+ - `maxChars` (number; literal; integer; min 1) — Maximum displayed characters.
273
+
274
+ - `mono` (boolean; literal) — Render the value in monospace.
275
+
276
+ - `tone` (string; literal; values: "default" | "muted" | "success" | "warning" | "error" | "info") — Displayed value tone.
277
+
278
+ - `transform` (string; literal; values: "capitalize" | "title" | "upper" | "lower" | "humanize") — Text transform.
279
+
280
+ - `unit` (string; literal; values: "seconds" | "ms") — Numeric timestamp unit.
281
+
282
+ - `value` (any; bindable) — Displayed value.
283
+
284
+ ## StatusPill
285
+
286
+ Semantic status pill for statuses, booleans, and HTTP codes.
287
+
288
+ - Children: `none`
289
+
290
+ Props:
291
+
292
+ - `format` (string; literal; values: "text" | "number" | "compact" | "percent" | "currency" | "bytes" | "duration" | "date" | "datetime" | "time" | "list" | "json" | "boolean") — Display format.
293
+
294
+ - `label` (any; bindable) — Displayed label.
295
+
296
+ - `maxChars` (number; literal; integer; min 1) — Maximum displayed characters.
297
+
298
+ - `status` (any; bindable) — Status value.
299
+
300
+ - `tone` (string; literal; values: "neutral" | "info" | "success" | "warning" | "error") — Forced tone.
301
+
302
+ - `transform` (string; literal; values: "capitalize" | "title" | "upper" | "lower" | "humanize") — Text transform.
303
+
304
+ ## Table
305
+
306
+ Tabular view of an array.
307
+
308
+ - Children: `none`
309
+ - Limits: `{"renderedRows":100}`
310
+
311
+ Props:
312
+
313
+ - `columns` (array; literal) — Literal field names or column definitions.
314
+ - Items: union; literal
315
+ - Variant 1: string; literal
316
+ - Variant 2: object; literal
317
+ - `align` (string; literal; values: "left" | "center" | "right") — Cell alignment.
318
+ - `currency` (string; literal) — ISO 4217 currency code.
319
+ - `decimals` (number; literal; integer; min 0; max 20) — Fixed decimal places.
320
+ - `format` (string; literal; values: "text" | "number" | "compact" | "percent" | "currency" | "bytes" | "duration" | "date" | "datetime" | "time" | "list" | "json" | "boolean") — Display format.
321
+ - `header` (string; literal) — Column heading.
322
+ - `key` (string; literal; required) — Field name inside each row.
323
+ - `map` (object; literal) — Map known displayed values to labels.
324
+ - `maxChars` (number; literal; integer; min 1) — Maximum displayed characters.
325
+ - `mono` (boolean; literal) — Render cells in monospace.
326
+ - `tone` (string; literal; values: "default" | "muted" | "success" | "warning" | "error" | "info") — Displayed value tone.
327
+ - `transform` (string; literal; values: "capitalize" | "title" | "upper" | "lower" | "humanize") — Text transform.
328
+ - `type` (string; literal; values: "status") — Set to status to render status pills.
329
+ - `unit` (string; literal; values: "seconds" | "ms") — Numeric timestamp unit.
330
+
331
+ - `dense` (boolean; literal) — Use tighter rows.
332
+
333
+ - `emptyText` (string; bindable) — Empty-state text.
334
+
335
+ - `items` (array; bindable) — Rows to render.
336
+ - Items: any; literal
337
+
338
+ ## Text
339
+
340
+ Body text with shared formatting.
341
+
342
+ - Children: `none`
343
+
344
+ Props:
345
+
346
+ - `currency` (string; literal) — ISO 4217 currency code.
347
+
348
+ - `decimals` (number; literal; integer; min 0; max 20) — Fixed decimal places.
349
+
350
+ - `format` (string; literal; values: "text" | "number" | "compact" | "percent" | "currency" | "bytes" | "duration" | "date" | "datetime" | "time" | "list" | "json" | "boolean") — Display format.
351
+
352
+ - `maxChars` (number; literal; integer; min 1) — Maximum displayed characters.
353
+
354
+ - `mono` (boolean; literal) — Render in monospace.
355
+
356
+ - `muted` (boolean; literal) — Shorthand for the muted tone.
357
+
358
+ - `size` (string; literal; values: "xs" | "sm" | "md" | "lg") — Displayed value size.
359
+
360
+ - `text` (any; bindable) — Value to display.
361
+
362
+ - `tone` (string; literal; values: "default" | "muted" | "success" | "warning" | "error" | "info") — Displayed value tone.
363
+
364
+ - `transform` (string; literal; values: "capitalize" | "title" | "upper" | "lower" | "humanize") — Text transform.
365
+
366
+ - `unit` (string; literal; values: "seconds" | "ms") — Numeric timestamp unit.
367
+
368
+ - `weight` (string; literal; values: "normal" | "medium" | "semibold") — Font weight.
369
+
370
+ ## Timestamp
371
+
372
+ ISO or epoch timestamp.
373
+
374
+ - Children: `none`
375
+
376
+ Props:
377
+
378
+ - `format` (string; literal; values: "datetime" | "date" | "time" | "smart") — Timestamp format.
379
+
380
+ - `relative` (boolean; literal) — Display relative time.
381
+
382
+ - `size` (string; literal; values: "xs" | "sm" | "md" | "lg") — Displayed value size.
383
+
384
+ - `tone` (string; literal; values: "default" | "muted" | "success" | "warning" | "error" | "info") — Displayed value tone.
385
+
386
+ - `unit` (string; literal; values: "seconds" | "ms") — Numeric timestamp unit.
387
+
388
+ - `value` (union; bindable) — ISO string or epoch number.
389
+ - Variant 1: string; literal
390
+ - Variant 2: number; literal
@@ -0,0 +1,38 @@
1
+ # Surface configuration and visual approval
2
+
3
+ Use this flow for every newly authored workflow. The agent authors surfaces; the user reviews the exact Culvii renderer before accepting them.
4
+
5
+ ## Choose before validation
6
+
7
+ 1. After planning the workflow graph and expected node data, ask once through the agent's native in-run question tool whether the user wants runtime widgets or platform defaults. Do not end the chat run to ask.
8
+ 2. If the user chooses configuration, ask for each node in each workflow whether to create a custom surface, attach a real existing surface, or use the default. Combine independent choices into the fewest prompts the agent supports.
9
+ 3. Read [surface authoring](surface-authoring.md) and only the component catalog pages needed for custom choices. Use expected output shape and workflow purpose; do not ask the user to write component documents.
10
+ 4. Create every custom candidate as a real Culvii `Surface` and attach it to its workflow step before the first `culvii dev`. Attach selected existing surfaces now and leave default choices unchanged.
11
+
12
+ Do not add a wait surface or pause merely to display output. A wait surface is valid only when the workflow already needs human input.
13
+
14
+ ## Validate, execute, and review
15
+
16
+ 1. Start one tracked `culvii dev` process after the workflow and all candidate surfaces exist. Fix every validation and sync error before previewing.
17
+ 2. Run the [workflow feedback cycle](feedback-cycle.md). Its successful execution supplies the preview data. For a cron, webhook, or polling trigger, use its temporary manual-trigger conversion and representative payload; never invoke or mock the runtime trigger implementation.
18
+ 3. For every custom surface in that execution, create a review manifest. It includes only the configured nodes, never the full run:
19
+
20
+ ```json
21
+ {
22
+ "items": [
23
+ { "executionId": "exc_…", "nodeId": "research-agent" },
24
+ { "executionId": "exc_…", "nodeId": "report-output" }
25
+ ]
26
+ }
27
+ ```
28
+
29
+ 4. Run `culvii surface review create --file <manifest.json> --json`. It returns a Console URL. Ask permission before running `culvii surface review open <review-id>`; otherwise show the URL to the user and keep the same chat run open.
30
+ 5. The review page uses the production `SurfaceView` renderer, groups items by workflow, and labels each preview as **Mocked output**, **Simulated trigger**, or **Executed output**. It shows only the configured custom surfaces.
31
+ 6. Wait for the user to choose **Keep this surface**, **Request changes**, or **Use default** for every item and submit the review. Read `culvii surface review get <review-id> --json` to obtain the decisions; do not ask the user to paste them into chat.
32
+ 7. For changes, edit the real surface and let the active `culvii dev` watcher validate/sync it. Create a new review after the next successful feedback execution. For default, remove the custom attachment/resource as appropriate and let `culvii dev` validate it.
33
+
34
+ The review is an ephemeral, user-scoped record. It resolves the current draft surface and current execution data on each page load, so it never claims that an old preview matches a revised surface. It expires after two hours; recreate it if needed.
35
+
36
+ ## Finish
37
+
38
+ Every configured node must end as accepted custom, selected existing, platform default, or explicitly skipped. Restore any temporary trigger conversion, wait for `culvii dev` to sync it, then stop only the exact `culvii dev` process started for this task. Never report completion while a custom surface is awaiting review.
@@ -0,0 +1,143 @@
1
+ # Surface input and action components
2
+
3
+ ## ApproveRejectBar
4
+
5
+ Named approve/reject decision actions.
6
+
7
+ - Children: `none`
8
+ - Interaction: `multi-action`
9
+ - Actions: `{"allowed":["approve","reject"]}`
10
+
11
+ Props:
12
+
13
+ - `approveLabel` (string; bindable) — Approve button label.
14
+
15
+ - `canDecide` (boolean; bindable) — Whether the viewer may decide.
16
+
17
+ - `comment` (string; bindable) — Current comment value.
18
+
19
+ - `commentRequired` (boolean; bindable) — Require a comment before rejection.
20
+
21
+ - `decidedBy` (string; bindable) — Recorded decider.
22
+
23
+ - `decision` (string; bindable) — Recorded decision.
24
+
25
+ - `disabledReason` (string; bindable) — Reason actions are disabled.
26
+
27
+ - `rejectLabel` (string; bindable) — Reject button label.
28
+
29
+ ## Button
30
+
31
+ Single-action button.
32
+
33
+ - Children: `none`
34
+ - Interaction: `single-action`
35
+
36
+ Props:
37
+
38
+ - `disabled` (boolean; bindable) — Disabled state.
39
+
40
+ - `label` (string; bindable) — Button label.
41
+
42
+ - `variant` (string; literal; values: "primary" | "default" | "danger") — Button variant.
43
+
44
+ ## Checkbox
45
+
46
+ Boolean form input.
47
+
48
+ - Children: `none`
49
+ - Interaction: `input`
50
+
51
+ Props:
52
+
53
+ - `description` (string; bindable) — Helper text.
54
+
55
+ - `disabled` (boolean; bindable) — Disabled state.
56
+
57
+ - `label` (string; bindable) — Text beside the checkbox.
58
+
59
+ ## Select
60
+
61
+ Single-choice form input.
62
+
63
+ - Children: `none`
64
+ - Interaction: `input`
65
+
66
+ Props:
67
+
68
+ - `disabled` (boolean; bindable) — Disabled state.
69
+
70
+ - `label` (string; bindable) — Field label.
71
+
72
+ - `options` (array; bindable) — Literal or bound options.
73
+ - Items: union; literal
74
+ - Variant 1: string; literal
75
+ - Variant 2: number; literal
76
+ - Variant 3: object; literal
77
+ - `label` (string; literal) — Displayed option label.
78
+ - `value` (union; literal; required) — Submitted option value.
79
+ - Variant 1: string; literal
80
+ - Variant 2: number; literal
81
+
82
+ - `placeholder` (string; bindable) — Placeholder.
83
+
84
+ ## TextArea
85
+
86
+ Multi-line form input.
87
+
88
+ - Children: `none`
89
+ - Interaction: `input`
90
+
91
+ Props:
92
+
93
+ - `disabled` (boolean; bindable) — Disabled state.
94
+
95
+ - `label` (string; bindable) — Field label.
96
+
97
+ - `placeholder` (string; bindable) — Placeholder.
98
+
99
+ - `rows` (number; literal; integer; min 1) — Visible rows.
100
+
101
+ ## TextField
102
+
103
+ Single-line form input.
104
+
105
+ - Children: `none`
106
+ - Interaction: `input`
107
+
108
+ Props:
109
+
110
+ - `disabled` (boolean; bindable) — Disabled state.
111
+
112
+ - `label` (string; bindable) — Field label.
113
+
114
+ - `placeholder` (string; bindable) — Placeholder.
115
+
116
+ - `type` (string; literal; values: "text" | "number" | "email" | "url") — HTML input type.
117
+
118
+ ## Reserved and rejected component types
119
+
120
+ - `Accordion` — unsupported and rejected by validation.
121
+ - `AgentRunPanel` — unsupported and rejected by validation.
122
+ - `CalendarEventCard` — unsupported and rejected by validation.
123
+ - `DatePicker` — unsupported and rejected by validation.
124
+ - `ErrorPanel` — unsupported and rejected by validation.
125
+ - `Icon` — unsupported and rejected by validation.
126
+ - `Image` — unsupported and rejected by validation.
127
+ - `List` — unsupported and rejected by validation.
128
+ - `Markdown` — unsupported and rejected by validation.
129
+ - `ProgressBar` — unsupported and rejected by validation.
130
+ - `RadioGroup` — unsupported and rejected by validation.
131
+ - `SlackMessageCard` — unsupported and rejected by validation.
132
+ - `SlackThread` — unsupported and rejected by validation.
133
+ - `Spacer` — unsupported and rejected by validation.
134
+ - `Spinner` — unsupported and rejected by validation.
135
+ - `Tabs` — unsupported and rejected by validation.
136
+ - `Timeline` — unsupported and rejected by validation.
137
+ - `ToolCallCard` — unsupported and rejected by validation.
138
+ - `Tree` — unsupported and rejected by validation.
139
+
140
+ ## Slot policies
141
+
142
+ - Output: actions navigate; forms rejected.
143
+ - Wait: actions navigate, node.resume, node.stop; forms allowed.
@@ -0,0 +1,97 @@
1
+ # Surface layout components
2
+
3
+ ## Card
4
+
5
+ Bordered container with an optional header and status.
6
+
7
+ - Children: `single`
8
+
9
+ Props:
10
+
11
+ - `dense` (boolean; literal) — Use tighter body padding.
12
+
13
+ - `map` (object; literal) — Map known displayed values to labels.
14
+
15
+ - `status` (any; bindable) — Status value used to derive the header pill.
16
+
17
+ - `statusLabel` (any; bindable) — Header status label.
18
+
19
+ - `statusTone` (string; literal; values: "neutral" | "info" | "success" | "warning" | "error") — Forced status tone.
20
+
21
+ - `subtitle` (string; bindable) — Header subtitle.
22
+
23
+ - `title` (string; bindable) — Header title.
24
+
25
+ - `transform` (string; literal; values: "capitalize" | "title" | "upper" | "lower" | "humanize") — Status label transform.
26
+
27
+ ## Divider
28
+
29
+ Horizontal rule between content blocks.
30
+
31
+ - Children: `none`
32
+
33
+ Props:
34
+
35
+ _No props._
36
+
37
+ ## Form
38
+
39
+ Groups wait-surface inputs and actions.
40
+
41
+ - Children: `list`
42
+
43
+ Props:
44
+
45
+ - `title` (string; bindable) — Form heading.
46
+
47
+ ## Grid
48
+
49
+ Responsive equal-width columns.
50
+
51
+ - Children: `list`
52
+
53
+ Props:
54
+
55
+ - `columns` (number; literal; values: 1 | 2 | 3 | 4; integer) — Column count.
56
+
57
+ - `gap` (string; literal; values: "xs" | "sm" | "md" | "lg") — Spacing between children.
58
+
59
+ ## Row
60
+
61
+ Wrapping horizontal group.
62
+
63
+ - Children: `list`
64
+
65
+ Props:
66
+
67
+ - `align` (string; literal; values: "start" | "center" | "end" | "baseline") — Cross-axis alignment.
68
+
69
+ - `gap` (string; literal; values: "xs" | "sm" | "md" | "lg") — Spacing between children.
70
+
71
+ - `justify` (string; literal; values: "between") — Set to between to push children apart.
72
+
73
+ ## Section
74
+
75
+ Labelled group with one child.
76
+
77
+ - Children: `single`
78
+
79
+ Props:
80
+
81
+ - `collapsible` (boolean; literal) — Allow the section to be folded.
82
+
83
+ - `defaultOpen` (boolean; literal) — Initial collapsible state.
84
+
85
+ - `description` (string; bindable) — Section description.
86
+
87
+ - `title` (string; bindable) — Section label.
88
+
89
+ ## Stack
90
+
91
+ Vertical stack and the default surface container.
92
+
93
+ - Children: `list`
94
+
95
+ Props:
96
+
97
+ - `gap` (string; literal; values: "xs" | "sm" | "md" | "lg") — Spacing between children.
@@ -0,0 +1,18 @@
1
+ # Validation and common failures
2
+
3
+ - `agentReferenceKey` must resolve to a collected agent ID; `agentId` is invalid.
4
+ - Workflow-tool `workflowId` values and local custom surface keys must resolve.
5
+ - Workflow-tool targets follow the trigger, agent-node, and reference-depth rules in [workflows.md](workflows.md).
6
+ - Credentialed nodes require `{ name, id }`; model configs require `credentialId`. Never author raw secrets.
7
+ - A surface's slot must match `ui.output` or `ui.wait`.
8
+ - Surface component IDs must be unique, reachable, and connected by ID references. Maximum graph depth is 12 and maximum component count is 300.
9
+ - Use only active catalog types. Reserved types are rejected.
10
+ - Bindings accept `$output`, `$input`, `$exec`, `$binary`, and wait-only `$form`; JSON Pointer syntax and step names must be exact.
11
+ - Output surfaces allow navigation actions. Wait surfaces additionally allow node resume/stop actions and form input.
12
+ - A versioned custom surface reference may point to a published version. An unversioned local custom surface must be present in the same collected graph.
13
+
14
+ When validation fails, fix the resource definition rather than bypassing validation. Keep running `culvii dev` after each fix until evaluation, validation, and draft sync succeed. Do not present the resources as complete while errors remain.
15
+
16
+ After validation succeeds, use the [workflow feedback cycle](feedback-cycle.md) for requested workflows. Feedback runtime overrides never replace platform validation.
17
+
18
+ Further reading: [Testing](https://culvii.com/docs/sdk-reference/guides/testing/).