@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,2553 @@
1
+ #!/usr/bin/env node
2
+ import'./chunk-7UWDMECF.js';var e={schemaVersion:1,name:"culvii",bundleHash:"bb8ee103e0534e36fbf3df701f1c1539e2061f4f50e1a6affc1a0b173b29b672",generatorVersion:1,sources:{"@culvii/kit":"0.0.8",nodes:"1.0.0","surface-contract":"1.0.0","@culvii/cli":"0.0.9"},files:{"agents/openai.yaml":"80196c1dbde488639e31d4bbc0addcd253ba626ea0b3cb524d06ee1eabe3263b","examples/agent-workflow.culvii.ts":"c82471aa06e2fb2f939f50b70ae797b6fed22f2d51277975a93c16d0b94ecd76","examples/binary-document-workflow.culvii.ts":"3bc13dd2cf04b426449d5509749343a9c040b5e51bcb7e5982339b1173a459c6","examples/complete-workflow.culvii.ts":"2c59f6b9d525092e75b980aa174ccd8b0187621c8c196270453e03591000a08d","examples/custom-output-surface.culvii.ts":"8ccfb826d8b140dae94f8e57458eba7d98bf1cdf3dda372c23b757f9f47cb72b","examples/custom-wait-surface.culvii.ts":"4efef08381de6b51c4530fa312450682a09c3008c77f74c4b55c44b685bf4348","examples/human-in-the-loop-workflow.culvii.ts":"9daee28598cdae498786aea1b55640c1065097825d19262eb072c1b584328cfc","examples/integration-agent-workflow.culvii.ts":"3c9b3a3c174ebdfc4f128b2076d44685355d4ce952e54a5a4ec7061e1f231daf","examples/multi-agent-workflow-tools.culvii.ts":"ac96689205433dc647078acb323e970ac1c2ef06be118f087d428200b852a560","examples/nested-agent-workflow.culvii.ts":"e1255b0e22e83c26ea09876c9e90496c4c5ab4c24a52cf30d2cc2a7e9b1212a7","examples/output-surface.culvii.ts":"1959d8bc5c987c32d6c21fa6f36a1eb70bea5a18742885dff85f353170645702","examples/wait-surface.culvii.ts":"ae533ae4cf2ed533bc333528bd971d65b4140be033e65025663f78bc99d77cf2","references/agents.md":"bdd14922138c42c9b2ac6466d0eca5960365750451079e8ab28b65f2e0602ae5","references/authoring-files.md":"ea93dafc36e6643a1040e430aec0fd41f1a5f93c5d24794ae3db0624b26dff53","references/cli-guide.md":"f127193a2e669861ec9884fdf1f3618af6baf37324029943a05cc13a49d696bc","references/cli-reference.md":"1c97ed69b833a62b8e9000f20684c99315ff1eabaca265ba9fe54817c3b67020","references/feedback-cycle.md":"54ad5b36049e377344220e10a7ddaea1e010f532d9fe7ab39b6abd3d435a6a2a","references/integrations.md":"9fa3db838b4e48d3aae2949012bbbfa7ce84b32779048d17c21ac4548482ee68","references/kit-api.md":"c082d1b63bec52fdd7124e711f4e86bfae015f1cd7045b25e4910349c4fca1fd","references/node-argocd.md":"5abd8bfc02ced232d85d366108f2395bfe8d82e0dd0414527ccf932d85da6191","references/node-clickup-doc.md":"bf62328992963604fe0e015063b9af34d67ca49181c744b77b591a635c1b8c35","references/node-clickup-ticket.md":"b616e8c02a771eb5283fe33972e100aa6be410f88dd01adfbbfc58fe794b6d23","references/node-core-agent.md":"09b0b3a5607dbdd06f3f463d140f9633a27b580e59b22f135f1bb349b7fcc0bf","references/node-core-browser-automation.md":"797f7dbd3374c2ea38de830ab2e9b08a2762e45a3cf56dad1ff274cf8109e7e7","references/node-core-code.md":"2768aa7a0fec5f12d716ece9727b038ee2a205647e7c41bd85f0139165bbbd51","references/node-core-http.md":"4799365201368c31d270644161a6e415d5ecfa25d9c75cf5e550330aff7679b4","references/node-core-if.md":"3298f6dbe803eae9e3a69eb7084b08f43a6c76e139e56051539c7603a705b7e1","references/node-core-jwt.md":"8828d11751ee88474f962a296cf29b279fa055ea2b95d9ee0362d211596bdedb","references/node-core-loop-break.md":"d383011f16ae620860e2535be49cafc862a57c7ecae7d7fbd57ac767a5afbd3c","references/node-core-loop-continue.md":"308af6ffa74572a211f784ffc77b565702105cc73718ae5e8874f1f13254a0ff","references/node-core-loop-output.md":"dd70d65ad423387cf1190f9e103d4ba734763e32b82674299b733cdb299dbac6","references/node-core-loop.md":"35d9e5f15ef49d9e5eb1ed824f438a1c61382ca00ff2a838e371fd60919f3b26","references/node-core-merge.md":"f1c2753761791f872a3e786552ba776742c81b5b56985c23660d90bed6c9422a","references/node-core-set.md":"511944327b31f9af70fbdcc5769c512a78129f901f98bb03ae3e464205b76468","references/node-core-switch.md":"512edc581e410f44f7f15ac31ed27fbd1698c0c4cfb9a7fd93feb42bbb29d1ae","references/node-cost-explorer.md":"65bafd0f0e3c9910f3af2f210d492fc0d1648b570c61ff258642c4b441e688f2","references/node-cron-trigger.md":"ab958969a2a30b6643ad1d31a3241fed427d3db2e3871ea7ab68c0af4d4cc82b","references/node-elasticsearch.md":"276ca5fa4368a0c7a12a4383dd01404bdc3c345f6c837ec5fc1c9d609b3138b2","references/node-github-poll-trigger.md":"132d7a0d7b56cfa29be552418725eeddefb0a11716b7b7192f53de6d57667ee8","references/node-github-webhook-trigger.md":"09de1c2b493476d908611f71a88850fc76786d6aed48b74e573c6b647110c6a3","references/node-github.md":"b7ed8f59ecdbcf3ea0166268a27905f1ada3c3fcc5e3e121dc32dea5427a3d06","references/node-gmail-trigger.md":"59ca6745079299e3bdf77f87fa328bd7900227bbe131ed7a977f781d2ee606e1","references/node-gmail.md":"f9d8f18d005acc6423c49e8741d909fe8541c4d849ae8ae590c04b561576bd82","references/node-google-calendar.md":"3bf8ed7c280036fd0009c299fcacbf920bb3b18429f2734ac603e18e16796f73","references/node-google-docs.md":"b8d6d68914b4228f11adf575753bcaa86cbf71fd3c7dfa36fb07d84627250ad1","references/node-grafana-dashboard.md":"9bdfafcdfd461a0082b0645a4089826204021fb273589732071ee56ff97ab83e","references/node-grafana-data-source.md":"050f9dda595a35346b5396563de0e8c18acb05a9139655c61d2a706cc39b5544","references/node-grafana-query.md":"35c95c6528c01766cfe0c88a9f1adcf786a95061ce81e963025ec131da1d1873","references/node-hibp-list-domains.md":"b977ed4babb1c419bfe13d76166528fffeddbaeb81147ece07b3c19d34d0f797","references/node-hibp-stealer-logs.md":"13758678d5eebd520823bc0e56d12cbef8b72835b54b0fc00e9402b744d44550","references/node-kubernetes.md":"293fd70959588d4f10fd8869388cf37809f477e2f987752da5ab0cdfb2c7cdc2","references/node-manual-trigger.md":"4bebd22e2a76d6e90acb08ece0d88a6c7040f1a0ac11da298f712251194b7086","references/node-microsoft-outlook-trigger.md":"aa4385d1734de97e79ce59d2c6ca802683e6c07f625b521d606f8bf5f8540ac5","references/node-microsoft-outlook.md":"51d55b369461dc0b88dd9b1fcf905f6f9b37fd9270053fc9e2022c2d3c33bed2","references/node-microsoft-sharepoint.md":"10f27d6507989598ead041a5e1965dd3014dd610848d2b12e4ee81864e4373ed","references/node-onionsearch.md":"3711791d3c5516ae6ee88bf29b1d18a79da3446cb310446d1e4fb77e22934fe6","references/node-prometheus.md":"337c4583bbe7f18b54bd7bcf452b8b7f0eb8dbab5d4c65945e6bdec2bbddc35b","references/node-s3.md":"8ecc9a791cda334707431dfcfed34abe9eedbedbb9c06f1ad03907f8af59b2a8","references/node-slack-events-trigger.md":"9884a5f369f654b5bf78cd352aaee9df27ec6e5fa548edde8485ea7f47d31eb2","references/node-slack-interactions-trigger.md":"b8fe95a36582dc8bc0d96b842a621e50fbacf6141914d00c13abfc9912748916","references/node-slack-trigger.md":"43e6caa5ee349e1ba3c256da3d3279b7385e182829b78e134f2123a650c3d052","references/node-slack.md":"2d24da368e43494487fa740b111f33d7ab9b763ec88ab45be852a8a8b64c3ff7","references/node-supabase.md":"c67e87065053adbb5c44425ad62d1e531c0fd9d98de0a7dc91b45e582a24c270","references/node-twilio.md":"a191b4c071a738c1283d545512e6b73f52aabb1c7fae4d9acb08c5346f5a6ad3","references/node-wait-timer.md":"72749e63f27b512aa6c51190fbc7a79195cdc37acd6c0f2305285012ce5fd06d","references/node-webhook-trigger.md":"b98b9cfc92b2e6eb5b1d75e651abccd022b7914d609052d7f7de4e588af45b5a","references/nodes-index.md":"e8feb33feff53ddf84628f6db9a45db26f9dd5cd6c14082912606af4f1c299eb","references/runtime-values.md":"93dbe09b2f150ffec02a1d1e2bebdce3eda6e885f1daaae05354ecaceb41f038","references/surface-authoring.md":"21ae1e1b64e15c8d89ff1d95efec84829ffa2f2aa2f0d5ba400c78742463586d","references/surface-display.md":"9a24b5fc81f48ad517d36f202c99291258866b7e607f8481763a985bd26d1a26","references/surface-feedback.md":"425f70b7bbda1923624bd9639fb0d7f071828ad7b59feb54867ef6fe5b5054cb","references/surface-input-actions.md":"54cd475120fcb650e4c876b9787905d47b87638483d73fc7dc7fb3a06305a8da","references/surface-layout.md":"3381fea6ed2ed16f4d1e9a9186aa853ecf834fb8f31a1bd09408e9c218e6b559","references/validation.md":"224ab2041ab6d823b8468b381e16a9823eb2a97b2ea33a812e89b2592ac72f68","references/workflows.md":"5988f86d8053c44c12decf4d43e98c13d2b3e22f124060198ede182b1e0fc648","SKILL.md":"d885d3601c21bd69156cdce3116268464edbbf88bc7cec0b6e98989d3a33e41b"}},n={"agents/openai.yaml":`interface:
3
+ display_name: "Culvii"
4
+ short_description: "Build Culvii agents, workflows, and surfaces"
5
+ default_prompt: "Use $culvii to build and validate a Culvii agent or workflow."
6
+ `,"examples/agent-workflow.culvii.ts":`import { MultiAgentEngine, Step, Workflow, createAgentModelConfigFromRef } from '@culvii/kit';
7
+
8
+ const MODEL = createAgentModelConfigFromRef('openai/gpt-4.1', 'credential-id');
9
+
10
+ function createAgent() {
11
+ return new MultiAgentEngine({
12
+ id: 'review-agent',
13
+ name: 'Review Agent',
14
+ role: 'primary',
15
+ description: 'Reviews a request.',
16
+ systemPrompt: 'Return a concise review.',
17
+ model: MODEL,
18
+ metadata: {
19
+ runtimeDetails: {
20
+ sandboxProfile: 'default',
21
+ },
22
+ },
23
+ permissions: {
24
+ default: {
25
+ '*': 'ask',
26
+ read_file: 'approve',
27
+ git: 'ask',
28
+ delete_file: 'deny',
29
+ },
30
+ },
31
+ secondaryAgents: [],
32
+ });
33
+ }
34
+
35
+ function createWorkflow() {
36
+ const trigger = new Step({ id: 'trigger', name: 'Manual Trigger', type: 'manualTrigger' });
37
+ const run = new Step({
38
+ id: 'run-review',
39
+ name: 'Run Review',
40
+ type: 'core.agent',
41
+ params: {
42
+ agentReferenceKey: 'review-agent',
43
+ prompt: 'Review the request.',
44
+ autoCloseSession: true,
45
+ },
46
+ });
47
+ trigger.connectTo(run);
48
+ return new Workflow({ id: 'review-workflow', name: 'Review Workflow', steps: [trigger, run] });
49
+ }
50
+
51
+ createAgent();
52
+ createWorkflow();
53
+ `,"examples/binary-document-workflow.culvii.ts":`import { MultiAgentEngine, Step, Workflow, createAgentModelConfigFromRef } from '@culvii/kit';
54
+
55
+ const MODEL = createAgentModelConfigFromRef(
56
+ 'google-vertex/gemini-3.1-pro-preview',
57
+ 'credential-id'
58
+ );
59
+
60
+ const CREATE_DOCUMENT_CODE = \`
61
+ export default async function main() {
62
+ const { Buffer } = require('node:buffer');
63
+ const document = 'Quarterly review\\\\nRevenue grew 18 percent.\\\\nNext step: renew the account.';
64
+ return {
65
+ json: { generated: true },
66
+ binary: {
67
+ sourceFile: {
68
+ data: Buffer.from(document, 'utf8').toString('base64'),
69
+ mimeType: 'text/plain',
70
+ fileName: 'quarterly-review.txt',
71
+ fileExtension: 'txt',
72
+ },
73
+ },
74
+ };
75
+ }
76
+ \`;
77
+
78
+ function createDocumentAgent() {
79
+ return new MultiAgentEngine({
80
+ id: 'document-reviewer',
81
+ name: 'Document Reviewer',
82
+ role: 'primary',
83
+ description: 'Reads workflow files and returns a concise review plus a text artifact.',
84
+ systemPrompt:
85
+ 'Uploaded workflow files are only available through the binary tools. Always list files first, read the requested file, and never guess its contents.',
86
+ model: MODEL,
87
+ metadata: {
88
+ runtimeDetails: { sandboxProfile: 'default' },
89
+ },
90
+ permissions: { default: { '*': 'deny' } },
91
+ secondaryAgents: [],
92
+ });
93
+ }
94
+
95
+ function createWorkflow() {
96
+ const trigger = new Step({ id: 'trigger', name: 'Manual Trigger', type: 'manualTrigger' });
97
+ const createDocument = new Step({
98
+ id: 'create-document',
99
+ name: 'Create Document',
100
+ type: 'core.code',
101
+ params: { code: CREATE_DOCUMENT_CODE, codeType: 'js' },
102
+ });
103
+ const review = new Step({
104
+ id: 'review',
105
+ name: 'Review Document',
106
+ type: 'core.agent',
107
+ params: {
108
+ agentReferenceKey: 'document-reviewer',
109
+ prompt:
110
+ 'List the workflow binary files, read the file with key "sourceFile", summarize its exact contents, then create a text/plain binary output named "review.txt" containing your summary. Reply with the source filename and the output filename.',
111
+ autoCloseSession: true,
112
+ },
113
+ });
114
+ const persist = new Step({
115
+ id: 'persist',
116
+ name: 'Persist Review',
117
+ type: 'core.set',
118
+ params: { values: { response: "={{ $('Review Document').json.response }}" } },
119
+ });
120
+
121
+ trigger.connectTo(createDocument);
122
+ createDocument.connectTo(review);
123
+ review.connectTo(persist);
124
+ return new Workflow({
125
+ id: 'binary-document-workflow',
126
+ name: 'Binary Document Workflow',
127
+ steps: [trigger, createDocument, review, persist],
128
+ });
129
+ }
130
+
131
+ createDocumentAgent();
132
+ createWorkflow();
133
+ `,"examples/complete-workflow.culvii.ts":`import {
134
+ MultiAgentEngine,
135
+ Step,
136
+ Workflow,
137
+ createAgentModelConfigFromRef,
138
+ defineWorkflowTool,
139
+ } from '@culvii/kit';
140
+
141
+ const MODEL = createAgentModelConfigFromRef('anthropic/claude-sonnet-4-5', 'credential-id');
142
+
143
+ function createLookupWorkflow() {
144
+ const trigger = new Step({ id: 'lookup-trigger', name: 'Lookup Trigger', type: 'manualTrigger' });
145
+ const lookup = new Step({
146
+ id: 'lookup',
147
+ name: 'Lookup',
148
+ type: 'core.set',
149
+ params: { values: { plan: 'Enterprise' } },
150
+ });
151
+ trigger.connectTo(lookup);
152
+ return new Workflow({ id: 'lookup-workflow', name: 'Lookup Workflow', steps: [trigger, lookup] });
153
+ }
154
+
155
+ function createAgent() {
156
+ return new MultiAgentEngine({
157
+ id: 'concierge-agent',
158
+ name: 'Concierge Agent',
159
+ role: 'primary',
160
+ description: 'Looks up and reviews account context.',
161
+ systemPrompt: 'Use lookup_account before answering.',
162
+ model: MODEL,
163
+ // This agent uses only its workflow tool, so sandbox tools are unavailable.
164
+ metadata: {
165
+ runtimeDetails: { sandboxProfile: 'default' },
166
+ },
167
+ permissions: { default: { '*': 'deny' } },
168
+ tools: {
169
+ lookup_account: defineWorkflowTool({
170
+ name: 'lookup_account',
171
+ description: 'Looks up account data.',
172
+ workflowId: 'lookup-workflow',
173
+ }),
174
+ },
175
+ secondaryAgents: [],
176
+ });
177
+ }
178
+
179
+ function createParentWorkflow() {
180
+ const trigger = new Step({ id: 'trigger', name: 'Manual Trigger', type: 'manualTrigger' });
181
+ const prepare = new Step({
182
+ id: 'prepare',
183
+ name: 'Prepare',
184
+ type: 'core.set',
185
+ params: {
186
+ values: {
187
+ account: 'Acme',
188
+ nested: { ids: ['={{ $system.execId }}', '={{ $json.account }}'] },
189
+ },
190
+ },
191
+ });
192
+ const agent = new Step({
193
+ id: 'agent',
194
+ name: 'Concierge',
195
+ type: 'core.agent',
196
+ params: {
197
+ agentReferenceKey: 'concierge-agent',
198
+ prompt: "Review {{ $('Prepare').json.account }}",
199
+ autoCloseSession: true,
200
+ },
201
+ });
202
+ trigger.connectTo(prepare);
203
+ prepare.connectTo(agent);
204
+ return new Workflow({
205
+ id: 'parent-workflow',
206
+ name: 'Parent Workflow',
207
+ steps: [trigger, prepare, agent],
208
+ });
209
+ }
210
+
211
+ createLookupWorkflow();
212
+ createAgent();
213
+ createParentWorkflow();
214
+ `,"examples/custom-output-surface.culvii.ts":`import { Step, Surface, Workflow } from '@culvii/kit';
215
+
216
+ const responseSurface = new Surface({
217
+ id: 'http-response-summary',
218
+ name: 'HTTP Response Summary',
219
+ description: 'Displays an operation status and response body.',
220
+ slot: 'output',
221
+ definition: {
222
+ schema: 'kit.ui/v1',
223
+ root: 'card',
224
+ components: [
225
+ { id: 'card', type: 'Card', props: { title: 'Operation result' }, children: ['content'] },
226
+ { id: 'content', type: 'Stack', children: ['status', 'body'] },
227
+ {
228
+ id: 'status',
229
+ type: 'StatusPill',
230
+ props: {
231
+ label: { path: '$output/Fetch Resource/0/statusMessage' },
232
+ status: { path: '$output/Fetch Resource/0/statusCode' },
233
+ },
234
+ },
235
+ {
236
+ id: 'body',
237
+ type: 'JsonInspector',
238
+ props: { value: { path: '$output/Fetch Resource/0/body' } },
239
+ },
240
+ ],
241
+ },
242
+ });
243
+
244
+ function createWorkflow(id: string, output: 'define' | 'reuse') {
245
+ const trigger = new Step({ id: 'trigger', name: 'Manual Trigger', type: 'manualTrigger' });
246
+ const fetch = new Step({
247
+ id: 'fetch',
248
+ name: 'Fetch Resource',
249
+ type: 'core.code',
250
+ params: {
251
+ code: \`export default async function main() {
252
+ return { json: { statusCode: 200, statusMessage: 'OK', body: { ready: true } } };
253
+ }\`,
254
+ codeType: 'js',
255
+ },
256
+ // One workflow defines and attaches the custom output UI.
257
+ ui:
258
+ output === 'define'
259
+ ? { output: responseSurface }
260
+ : {
261
+ // Another workflow can reuse it by key with a safe fallback.
262
+ output: {
263
+ kind: 'custom',
264
+ surfaceKey: responseSurface.id,
265
+ fallbackSurfaceId: 'default.json',
266
+ },
267
+ },
268
+ });
269
+
270
+ trigger.connectTo(fetch);
271
+ return new Workflow({
272
+ id,
273
+ name:
274
+ id === 'custom-output-surface-workflow'
275
+ ? 'Custom Output Surface Workflow'
276
+ : 'Reused Output Surface Workflow',
277
+ steps: [trigger, fetch],
278
+ });
279
+ }
280
+
281
+ createWorkflow('custom-output-surface-workflow', 'define');
282
+ createWorkflow('reused-output-surface-workflow', 'reuse');
283
+ `,"examples/custom-wait-surface.culvii.ts":`import { Step, Surface, Workflow } from '@culvii/kit';
284
+
285
+ const approvalSurface = new Surface({
286
+ id: 'expense-approval',
287
+ name: 'Expense Approval',
288
+ description: 'Shows an amount and lets a reviewer approve or reject it.',
289
+ slot: 'wait',
290
+ definition: {
291
+ schema: 'kit.ui/v1',
292
+ root: 'form',
293
+ components: [
294
+ { id: 'form', type: 'Form', children: ['amount', 'comment', 'decision'] },
295
+ {
296
+ id: 'amount',
297
+ type: 'KeyValue',
298
+ props: {
299
+ entries: [
300
+ { label: 'Requested amount', value: { path: '$input/Collect Request/0/amount' } },
301
+ ],
302
+ },
303
+ },
304
+ {
305
+ id: 'comment',
306
+ type: 'TextArea',
307
+ props: { label: 'Reviewer comment', bind: '/$form/comment' },
308
+ },
309
+ {
310
+ id: 'decision',
311
+ type: 'ApproveRejectBar',
312
+ actions: {
313
+ approve: {
314
+ type: 'node.resume',
315
+ payload: {
316
+ approved: { path: '$form/approved', default: true },
317
+ comment: { path: '$form/comment', default: '' },
318
+ },
319
+ },
320
+ reject: {
321
+ type: 'node.stop',
322
+ payload: { reason: { path: '$form/comment', default: 'Rejected by reviewer' } },
323
+ },
324
+ },
325
+ },
326
+ ],
327
+ form: {
328
+ fields: [
329
+ { name: 'comment', label: 'Reviewer comment', type: 'textarea' },
330
+ { name: 'approved', label: 'Approved', type: 'checkbox' },
331
+ ],
332
+ },
333
+ },
334
+ });
335
+
336
+ function createApprovalWorkflow(id: string, selection: 'define' | 'reuse', amount: number) {
337
+ const trigger = new Step({ id: 'trigger', name: 'Manual Trigger', type: 'manualTrigger' });
338
+ const collect = new Step({
339
+ id: 'collect',
340
+ name: 'Collect Request',
341
+ type: 'core.set',
342
+ params: { values: { amount, stage: 'awaiting-approval' } },
343
+ });
344
+ const approval = new Step({
345
+ id: 'approval',
346
+ name: 'Approval',
347
+ type: 'core.set',
348
+ params: { values: { reviewer: 'manager' } },
349
+ ui: {
350
+ wait:
351
+ selection === 'define'
352
+ ? approvalSurface
353
+ : { kind: 'custom', surfaceKey: approvalSurface.id },
354
+ },
355
+ });
356
+ const result = new Step({
357
+ id: 'result',
358
+ name: 'Persist Decision',
359
+ type: 'core.set',
360
+ params: { values: { approved: "={{ $('Approval').json.approved }}" } },
361
+ });
362
+
363
+ trigger.connectTo(collect);
364
+ collect.connectTo(approval);
365
+ approval.connectTo(result);
366
+ return new Workflow({ id, name: id, steps: [trigger, collect, approval, result] });
367
+ }
368
+
369
+ // A wait surface automatically sets pauseAfterExecution: true. It can be
370
+ // reused by key in another workflow, and $form is valid only in the wait slot.
371
+ createApprovalWorkflow('manager-approval-workflow', 'define', 450);
372
+ createApprovalWorkflow('finance-approval-workflow', 'reuse', 12000);
373
+ `,"examples/human-in-the-loop-workflow.culvii.ts":`import {
374
+ MultiAgentEngine,
375
+ Step,
376
+ Workflow,
377
+ createAgentModelConfigFromRef,
378
+ defineWorkflowTool,
379
+ } from '@culvii/kit';
380
+
381
+ const MODEL = createAgentModelConfigFromRef('openai/gpt-4.1', 'credential-id');
382
+
383
+ function createApprovalToolWorkflow() {
384
+ const trigger = new Step({ id: 'trigger', name: 'Manual Trigger', type: 'manualTrigger' });
385
+ const approval = new Step({
386
+ id: 'approval',
387
+ name: 'Approval',
388
+ type: 'core.set',
389
+ params: {
390
+ values: { stage: 'awaiting-review', amount: 1500 },
391
+ // A resume request continues from this node.
392
+ pauseAfterExecution: true,
393
+ },
394
+ });
395
+ trigger.connectTo(approval);
396
+ return new Workflow({
397
+ id: 'discount-approval-workflow',
398
+ name: 'Discount Approval Workflow',
399
+ steps: [trigger, approval],
400
+ });
401
+ }
402
+
403
+ function createAccountLookupWorkflow() {
404
+ const trigger = new Step({ id: 'trigger', name: 'Manual Trigger', type: 'manualTrigger' });
405
+ const account = new Step({
406
+ id: 'account',
407
+ name: 'Account',
408
+ type: 'core.set',
409
+ params: { values: { plan: 'Enterprise', seats: 250 } },
410
+ });
411
+ trigger.connectTo(account);
412
+ return new Workflow({
413
+ id: 'account-lookup-workflow',
414
+ name: 'Account Lookup Workflow',
415
+ steps: [trigger, account],
416
+ });
417
+ }
418
+
419
+ function createConciergeAgent() {
420
+ return new MultiAgentEngine({
421
+ id: 'discount-concierge',
422
+ name: 'Discount Concierge',
423
+ role: 'primary',
424
+ description: 'Looks up an account and requests approval before offering a discount.',
425
+ systemPrompt:
426
+ 'Call lookup_account first. If a discount is requested, call request_approval and wait for its human decision before answering.',
427
+ model: MODEL,
428
+ metadata: {
429
+ runtimeDetails: {
430
+ sandboxProfile: 'default',
431
+ },
432
+ },
433
+ permissions: { default: { '*': 'ask', read_file: 'approve', delete_file: 'deny' } },
434
+ tools: {
435
+ lookup_account: defineWorkflowTool({
436
+ name: 'lookup_account',
437
+ description: 'Looks up account context.',
438
+ workflowId: 'account-lookup-workflow',
439
+ inputSchema: { type: 'object', properties: { account: { type: 'string' } } },
440
+ }),
441
+ request_approval: defineWorkflowTool({
442
+ name: 'request_approval',
443
+ description: 'Pauses for a human approval decision.',
444
+ workflowId: 'discount-approval-workflow',
445
+ inputSchema: { type: 'object', properties: { request: { type: 'string' } } },
446
+ }),
447
+ },
448
+ secondaryAgents: [],
449
+ });
450
+ }
451
+
452
+ function createWorkflow() {
453
+ const trigger = new Step({ id: 'trigger', name: 'Manual Trigger', type: 'manualTrigger' });
454
+ const request = new Step({
455
+ id: 'request',
456
+ name: 'Request',
457
+ type: 'core.set',
458
+ params: { values: { customer: 'Acme Corp', request: 'Approve a renewal discount.' } },
459
+ });
460
+ const concierge = new Step({
461
+ id: 'concierge',
462
+ name: 'Concierge Agent',
463
+ type: 'core.agent',
464
+ params: {
465
+ agentReferenceKey: 'discount-concierge',
466
+ prompt: "Handle the request for {{ $('Request').json.customer }}.",
467
+ autoCloseSession: true,
468
+ },
469
+ });
470
+ const managerReview = new Step({
471
+ id: 'manager-review',
472
+ name: 'Manager Review',
473
+ type: 'core.set',
474
+ params: { values: { status: 'pending' }, pauseAfterExecution: true },
475
+ });
476
+ const persist = new Step({
477
+ id: 'persist',
478
+ name: 'Persist Decision',
479
+ type: 'core.set',
480
+ params: { values: { response: "={{ $('Concierge Agent').json.response }}" } },
481
+ });
482
+
483
+ trigger.connectTo(request);
484
+ request.connectTo(concierge);
485
+ concierge.connectTo(managerReview);
486
+ managerReview.connectTo(persist);
487
+ return new Workflow({
488
+ id: 'discount-request-workflow',
489
+ name: 'Discount Request Workflow',
490
+ steps: [trigger, request, concierge, managerReview, persist],
491
+ });
492
+ }
493
+
494
+ createApprovalToolWorkflow();
495
+ createAccountLookupWorkflow();
496
+ createConciergeAgent();
497
+ createWorkflow();
498
+ `,"examples/integration-agent-workflow.culvii.ts":`import { MultiAgentEngine, Step, Workflow, createAgentModelConfigFromRef } from '@culvii/kit';
499
+
500
+ // Resolve both credentials through the integration picker before running dev.
501
+ const MODEL = createAgentModelConfigFromRef(
502
+ 'google-vertex/gemini-3.1-pro-preview',
503
+ 'credential-id'
504
+ );
505
+ const GMAIL = { name: 'gmail', id: 'credential-id' };
506
+
507
+ const CUTOFF_CODE = \`
508
+ export default async function main() {
509
+ return { cutoff: new Date(Date.now() - 5 * 60 * 1000).toISOString() };
510
+ }
511
+ \`;
512
+
513
+ function createResearchAgent() {
514
+ return new MultiAgentEngine({
515
+ id: 'email-researcher',
516
+ name: 'Email Researcher',
517
+ role: 'primary',
518
+ description: 'Researches a recent email and prepares a reply.',
519
+ systemPrompt:
520
+ 'Read the supplied email subject and content, research its question with your approved web tools, and return only a concise reply body.',
521
+ model: MODEL,
522
+ metadata: {
523
+ runtimeDetails: {
524
+ sandboxProfile: 'default',
525
+ },
526
+ },
527
+ permissions: { default: { '*': 'deny', web_fetch: 'approve' } },
528
+ secondaryAgents: [],
529
+ });
530
+ }
531
+
532
+ function createWorkflow() {
533
+ const trigger = new Step({ id: 'trigger', name: 'Manual Trigger', type: 'manualTrigger' });
534
+ const cutoff = new Step({
535
+ id: 'cutoff',
536
+ name: 'Compute Cutoff',
537
+ type: 'core.code',
538
+ params: { code: CUTOFF_CODE, codeType: 'js' },
539
+ });
540
+ const readEmail = new Step({
541
+ id: 'read-email',
542
+ name: 'Read Recent Email',
543
+ type: 'gmail',
544
+ credentials: GMAIL,
545
+ params: {
546
+ resource: 'message',
547
+ operation: 'readAll',
548
+ output: 'simple',
549
+ limit: 10,
550
+ userFilters: {
551
+ filterBy: 'filters',
552
+ filters: {
553
+ readStatus: 'both',
554
+ sender: 'sender@example.com',
555
+ receivedAfter: "={{ $('Compute Cutoff').json.cutoff }}",
556
+ },
557
+ },
558
+ },
559
+ });
560
+ const research = new Step({
561
+ id: 'research',
562
+ name: 'Research Email',
563
+ type: 'core.agent',
564
+ params: {
565
+ agentReferenceKey: 'email-researcher',
566
+ prompt:
567
+ "Subject: {{ $('Read Recent Email').json.subject }}\\nContent: {{ $('Read Recent Email').json.snippet }}\\nPrepare the reply.",
568
+ autoCloseSession: true,
569
+ },
570
+ });
571
+ const sendReply = new Step({
572
+ id: 'send-reply',
573
+ name: 'Send Reply',
574
+ type: 'gmail',
575
+ credentials: GMAIL,
576
+ params: {
577
+ resource: 'message',
578
+ operation: 'send',
579
+ toRecipients: 'sender@example.com',
580
+ subject: "Re: {{ $('Read Recent Email').json.subject }}",
581
+ bodyContent: "={{ $('Research Email').json.response }}",
582
+ additionalFields: { bodyContentType: 'text' },
583
+ },
584
+ });
585
+
586
+ trigger.connectTo(cutoff);
587
+ cutoff.connectTo(readEmail);
588
+ readEmail.connectTo(research);
589
+ research.connectTo(sendReply);
590
+ return new Workflow({
591
+ id: 'integration-agent-workflow',
592
+ name: 'Integration Agent Workflow',
593
+ steps: [trigger, cutoff, readEmail, research, sendReply],
594
+ });
595
+ }
596
+
597
+ createResearchAgent();
598
+ createWorkflow();
599
+ `,"examples/multi-agent-workflow-tools.culvii.ts":`import {
600
+ MultiAgentEngine,
601
+ Step,
602
+ Workflow,
603
+ createAgentModelConfigFromRef,
604
+ defineWorkflowTool,
605
+ } from '@culvii/kit';
606
+
607
+ const MODEL = createAgentModelConfigFromRef('openai/gpt-4.1', 'credential-id');
608
+
609
+ // Workflow tools target workflows, not agents. Keep these leaf workflows free
610
+ // of core.agent steps so the resource graph stays within the depth limit.
611
+ function createLeafWorkflow(id: string, name: string, values: Record<string, unknown>) {
612
+ const trigger = new Step({ id: 'trigger', name: 'Manual Trigger', type: 'manualTrigger' });
613
+ const result = new Step({
614
+ id: 'result',
615
+ name,
616
+ type: 'core.set',
617
+ params: { values },
618
+ });
619
+ trigger.connectTo(result);
620
+ return new Workflow({ id, name, steps: [trigger, result] });
621
+ }
622
+
623
+ const inventoryTool = defineWorkflowTool({
624
+ name: 'check_inventory',
625
+ description: 'Checks stock for a SKU.',
626
+ workflowId: 'inventory-workflow',
627
+ inputSchema: {
628
+ type: 'object',
629
+ properties: { sku: { type: 'string' } },
630
+ additionalProperties: false,
631
+ },
632
+ });
633
+
634
+ const shippingTool = defineWorkflowTool({
635
+ name: 'quote_shipping',
636
+ description: 'Returns shipping options for a destination.',
637
+ workflowId: 'shipping-workflow',
638
+ inputSchema: {
639
+ type: 'object',
640
+ properties: { destination: { type: 'string' } },
641
+ additionalProperties: false,
642
+ },
643
+ });
644
+
645
+ const complianceTool = defineWorkflowTool({
646
+ name: 'screen_compliance',
647
+ description: 'Screens an order destination for export restrictions.',
648
+ workflowId: 'compliance-workflow',
649
+ inputSchema: {
650
+ type: 'object',
651
+ properties: { destination: { type: 'string' } },
652
+ additionalProperties: false,
653
+ },
654
+ });
655
+
656
+ function createCoordinatorAgent() {
657
+ return new MultiAgentEngine({
658
+ id: 'fulfillment-coordinator',
659
+ name: 'Fulfillment Coordinator',
660
+ role: 'primary',
661
+ description: 'Coordinates inventory, shipping, compliance, and specialist review.',
662
+ systemPrompt:
663
+ 'For every line item, check inventory and quote shipping. Delegate compliance to the finance specialist and combine all returned facts into the final fulfillment plan.',
664
+ model: MODEL,
665
+ metadata: {
666
+ runtimeDetails: {
667
+ sandboxProfile: 'default',
668
+ },
669
+ },
670
+ permissions: {
671
+ default: {
672
+ '*': 'ask',
673
+ git: 'ask',
674
+ delete_file: 'deny',
675
+ },
676
+ },
677
+ tools: {
678
+ check_inventory: inventoryTool,
679
+ quote_shipping: shippingTool,
680
+ screen_compliance: complianceTool,
681
+ },
682
+ secondaryAgents: [
683
+ {
684
+ id: 'finance-specialist',
685
+ name: 'Finance Specialist',
686
+ role: 'secondary',
687
+ description: 'Screens the order and reports financial or regulatory risks.',
688
+ systemPrompt:
689
+ 'Review the supplied compliance result, then return its financial or regulatory risks.',
690
+ model: MODEL,
691
+ },
692
+ ],
693
+ });
694
+ }
695
+
696
+ function createWorkflow() {
697
+ const trigger = new Step({ id: 'trigger', name: 'Manual Trigger', type: 'manualTrigger' });
698
+ const order = new Step({
699
+ id: 'order',
700
+ name: 'Order',
701
+ type: 'core.set',
702
+ params: {
703
+ values: {
704
+ customer: 'Acme Corp',
705
+ destination: 'DE',
706
+ lineItems: [
707
+ { sku: 'WIDGET-001', quantity: 12 },
708
+ { sku: 'GADGET-114', quantity: 4 },
709
+ ],
710
+ },
711
+ },
712
+ });
713
+ const coordinator = new Step({
714
+ id: 'coordinator',
715
+ name: 'Coordinator Agent',
716
+ type: 'core.agent',
717
+ params: {
718
+ agentReferenceKey: 'fulfillment-coordinator',
719
+ prompt:
720
+ "Fulfill the order for {{ $('Order').json.customer }} shipping to {{ $('Order').json.destination }}. Process every line item and use your tools and finance specialist.",
721
+ autoCloseSession: true,
722
+ },
723
+ });
724
+ const persist = new Step({
725
+ id: 'persist',
726
+ name: 'Persist Plan',
727
+ type: 'core.set',
728
+ params: { values: { plan: "={{ $('Coordinator Agent').json.response }}" } },
729
+ });
730
+
731
+ trigger.connectTo(order);
732
+ order.connectTo(coordinator);
733
+ coordinator.connectTo(persist);
734
+ return new Workflow({
735
+ id: 'fulfillment-workflow',
736
+ name: 'Fulfillment Workflow',
737
+ steps: [trigger, order, coordinator, persist],
738
+ });
739
+ }
740
+
741
+ createLeafWorkflow('inventory-workflow', 'Inventory Result', {
742
+ available: 420,
743
+ warehouse: 'us-east-1',
744
+ });
745
+ createLeafWorkflow('shipping-workflow', 'Shipping Quote', {
746
+ carrier: 'GlobalEx',
747
+ service: 'ground',
748
+ etaDays: 4,
749
+ });
750
+ createLeafWorkflow('compliance-workflow', 'Compliance Result', {
751
+ restricted: false,
752
+ licenseRequired: false,
753
+ });
754
+ createCoordinatorAgent();
755
+ createWorkflow();
756
+ `,"examples/nested-agent-workflow.culvii.ts":`import {
757
+ MultiAgentEngine,
758
+ Step,
759
+ Workflow,
760
+ createAgentModelConfigFromRef,
761
+ defineWorkflowTool,
762
+ } from '@culvii/kit';
763
+
764
+ const MODEL = createAgentModelConfigFromRef('anthropic/claude-sonnet-4-5', 'credential-id');
765
+
766
+ // This is the agent -> workflow -> agent shape. The leaf agent has no workflow
767
+ // tools, which keeps the reference graph at the supported maximum depth.
768
+ function createLeafAgent() {
769
+ return new MultiAgentEngine({
770
+ id: 'evidence-reviewer',
771
+ name: 'Evidence Reviewer',
772
+ role: 'primary',
773
+ description: 'Reviews a brief and asks a second agent to check for gaps.',
774
+ systemPrompt: 'Review the brief, delegate a gap check, and return a recommendation.',
775
+ model: MODEL,
776
+ metadata: {
777
+ runtimeDetails: { sandboxProfile: 'default' },
778
+ },
779
+ permissions: { default: { '*': 'deny' } },
780
+ secondaryAgents: [
781
+ {
782
+ id: 'gap-checker',
783
+ name: 'Gap Checker',
784
+ role: 'secondary',
785
+ description: 'Checks a recommendation for missing evidence.',
786
+ systemPrompt: 'Check the recommendation for gaps and report them directly.',
787
+ model: MODEL,
788
+ },
789
+ ],
790
+ });
791
+ }
792
+
793
+ function createResearchWorkflow() {
794
+ const trigger = new Step({ id: 'trigger', name: 'Manual Trigger', type: 'manualTrigger' });
795
+ const brief = new Step({
796
+ id: 'brief',
797
+ name: 'Research Brief',
798
+ type: 'core.set',
799
+ params: { values: { topic: 'Expansion readiness', audience: 'Leadership' } },
800
+ });
801
+ const reviewer = new Step({
802
+ id: 'reviewer',
803
+ name: 'Evidence Reviewer',
804
+ type: 'core.agent',
805
+ params: {
806
+ agentReferenceKey: 'evidence-reviewer',
807
+ prompt:
808
+ "Review {{ $('Research Brief').json.topic }} for {{ $('Research Brief').json.audience }}.",
809
+ autoCloseSession: true,
810
+ },
811
+ });
812
+ trigger.connectTo(brief);
813
+ brief.connectTo(reviewer);
814
+ return new Workflow({
815
+ id: 'research-workflow',
816
+ name: 'Research Workflow',
817
+ steps: [trigger, brief, reviewer],
818
+ });
819
+ }
820
+
821
+ function createRootAgent() {
822
+ return new MultiAgentEngine({
823
+ id: 'strategy-agent',
824
+ name: 'Strategy Agent',
825
+ role: 'primary',
826
+ description: 'Delegates research to a workflow and a second opinion to a specialist.',
827
+ systemPrompt:
828
+ 'Call research_readiness first, ask the strategist for a second opinion, then combine both results.',
829
+ model: MODEL,
830
+ metadata: {
831
+ runtimeDetails: {
832
+ sandboxProfile: 'default',
833
+ },
834
+ },
835
+ permissions: { default: { '*': 'ask', read_file: 'approve', delete_file: 'deny' } },
836
+ tools: {
837
+ research_readiness: defineWorkflowTool({
838
+ name: 'research_readiness',
839
+ description: 'Runs the research workflow.',
840
+ workflowId: 'research-workflow',
841
+ inputSchema: {
842
+ type: 'object',
843
+ properties: { topic: { type: 'string' } },
844
+ additionalProperties: false,
845
+ },
846
+ }),
847
+ },
848
+ secondaryAgents: [
849
+ {
850
+ id: 'strategist',
851
+ name: 'Strategist',
852
+ role: 'secondary',
853
+ description: 'Provides a second opinion on the root agent\u2019s research result.',
854
+ systemPrompt: 'Review the supplied research result and return a concise second opinion.',
855
+ model: MODEL,
856
+ },
857
+ ],
858
+ });
859
+ }
860
+
861
+ createLeafAgent();
862
+ createResearchWorkflow();
863
+ createRootAgent();
864
+ `,"examples/output-surface.culvii.ts":`import { Step, Surface, Workflow } from '@culvii/kit';
865
+
866
+ function createOutputSurface() {
867
+ return new Surface({
868
+ id: 'result-surface',
869
+ name: 'Result Surface',
870
+ slot: 'output',
871
+ definition: {
872
+ schema: 'kit.ui/v1',
873
+ root: 'outer',
874
+ components: [
875
+ { id: 'outer', type: 'Stack', children: ['card'] },
876
+ { id: 'card', type: 'Card', props: { title: 'Execution result' }, children: ['inner'] },
877
+ { id: 'inner', type: 'Stack', children: ['status', 'execution'] },
878
+ {
879
+ id: 'status',
880
+ type: 'StatusPill',
881
+ props: { status: { path: '/$output/Prepare/main/0/0/status' } },
882
+ },
883
+ {
884
+ id: 'execution',
885
+ type: 'Text',
886
+ props: { text: { path: '/$exec/id', default: 'pending' } },
887
+ },
888
+ ],
889
+ },
890
+ });
891
+ }
892
+
893
+ function createWorkflow() {
894
+ const prepare = new Step({
895
+ id: 'prepare',
896
+ name: 'Prepare',
897
+ type: 'core.set',
898
+ params: { values: { status: 'ready' } },
899
+ ui: { output: createOutputSurface() },
900
+ });
901
+ return new Workflow({
902
+ id: 'output-surface-workflow',
903
+ name: 'Output Surface Workflow',
904
+ steps: [prepare],
905
+ });
906
+ }
907
+
908
+ createWorkflow();
909
+ `,"examples/wait-surface.culvii.ts":`import { Step, Surface, Workflow } from '@culvii/kit';
910
+
911
+ function createWaitSurface() {
912
+ return new Surface({
913
+ id: 'approval-surface', name: 'Approval Surface', slot: 'wait',
914
+ definition: { schema: 'kit.ui/v1', root: 'form', components: [
915
+ { id: 'form', type: 'Form', props: { title: 'Review result' }, children: ['comment', 'approve'] },
916
+ { id: 'comment', type: 'TextArea', props: { label: 'Comment', bind: '/$form/comment' } },
917
+ { id: 'approve', type: 'Button', props: { label: 'Continue', variant: 'primary' }, actions: {
918
+ click: { type: 'node.resume', payload: { comment: { path: '/$form/comment', default: '' } } },
919
+ } },
920
+ ], form: { fields: [{ name: 'comment', label: 'Comment', type: 'textarea' }] } },
921
+ });
922
+ }
923
+
924
+ function createWorkflow() {
925
+ const review = new Step({
926
+ id: 'review', name: 'Review', type: 'core.set', params: { values: { status: 'pending' } },
927
+ ui: { wait: createWaitSurface() },
928
+ });
929
+ return new Workflow({ id: 'approval-workflow', name: 'Approval Workflow', steps: [review] });
930
+ }
931
+
932
+ createWorkflow();
933
+ `,"references/agents.md":"# Agents\n\nCreate a root agent with `new MultiAgentEngine(primaryConfig)`. A primary agent requires `id`, `name`, `role: 'primary'`, `systemPrompt`, `model`, and `secondaryAgents`. Include a useful `description`. A secondary agent is defined inline with `role: 'secondary'`; secondary agents cannot contain further secondary agents.\n\nCreate models with `createAgentModelConfigFromRef('<provider>/<model>', '<credential-id>', options?)`. Supported built-in providers are `anthropic`, `openai`, `gemini`, `vertexai`, and `google-vertex`. A credential ID is required; never use an API key as the ID.\n\n```ts\nconst MODEL = createAgentModelConfigFromRef('anthropic/claude-sonnet-4-5', 'credential-uuid');\nconst agent = new MultiAgentEngine({\n id: 'support-agent',\n name: 'Support Agent',\n role: 'primary',\n description: 'Resolves support requests with a research specialist.',\n systemPrompt: 'Solve the request and delegate research when useful.',\n model: MODEL,\n secondaryAgents: [\n {\n id: 'researcher',\n name: 'Researcher',\n role: 'secondary',\n description: 'Finds supporting evidence.',\n systemPrompt: 'Return concise evidence.',\n model: MODEL,\n },\n ],\n});\n```\n\nContext-window capacity is platform controlled, not agent authored. It defaults\nto `512_000`; an operator may override an exact provider/model through\n`AGENT_MODEL_CONTEXT_WINDOWS`. The platform includes the current user prompt\nwhen deciding whether older session turns must be compacted.\n\nWorkflow-context helpers and delegation tools are available by default. Sandbox\ntools, including `web_fetch` and `git`, follow top-level `permissions.default`.\nOnly tools with an explicit rule or `'*'` rule are available. Root `tools`\ncontains only configured workflow tools.\n\nWorkflow tools belong in root `tools` and are created with `defineWorkflowTool({ name, description, workflowId, triggerNodeName?, inputSchema? })`. Omit `tools` when there are no tools. `workflowId` references a local workflow resource ID, not a display name.\n\nChoose the sandbox image when authoring the agent with\n`metadata.runtimeDetails.sandboxProfile`. This is a platform-configured profile\nname such as `node`, `go`, or `java`, not a Docker image reference. The platform\nresolves it to an immutable digest and snapshots that choice when the session is\ncreated:\n\n```ts\nmetadata: { runtimeDetails: { sandboxProfile: 'go' } },\n```\n\nAsk the platform operator to publish and configure the profile before using it.\nAgents without this setting use the `default` profile.\n\nSandbox tools use top-level platform-enforced permissions. Missing entries are\nunavailable; exact names override `'*'`:\n\n```ts\nmetadata: { runtimeDetails: { sandboxProfile: 'go' } },\npermissions: {\n default: {\n '*': 'ask',\n read_file: 'approve',\n delete_file: 'deny',\n },\n},\n```\n\n`approve` runs automatically, `deny` removes the tool, and `ask` suspends the\nagent until the user decides in the console. Governed sandbox and workflow tools\nbelong to the root agent so durable continuation has one exact model transcript;\nsecondary agents return analysis to that root. Workflow tools need no permission;\neach invocation suspends durably until its child workflow finishes, including\nany HITL wait. Workflow-context helpers remain always available.\n\nAgent references flow in the other direction through a `core.agent` step's `params.agentReferenceKey`, which must exactly equal the `MultiAgentEngine` ID. Never use `agentId`.\n\nFurther reading: [Multi-Agent API](https://culvii.com/docs/sdk-reference/api-reference/multi-agent-api/) and [Authentication](https://culvii.com/docs/sdk-reference/guides/authentication/).\n","references/authoring-files.md":`# Authoring files
934
+
935
+ Before writing code, inspect \`package.json\`, \`culvii.yaml\`, and every existing \`*.culvii.ts\` file. Preserve the project's module style and dependency versions.
936
+
937
+ Each evaluated \`*.culvii.ts\` file should import public APIs from \`@culvii/kit\`, construct resources inside named functions, and call those functions at the bottom. Do not export resources as a substitute for construction: dev discovery observes constructors through \`DevRegistry\`.
938
+
939
+ \`\`\`ts
940
+ import { MultiAgentEngine, Step, Surface, Workflow, createAgentModelConfigFromRef } from '@culvii/kit';
941
+
942
+ const MODEL = createAgentModelConfigFromRef('openai/gpt-4.1', 'CREDENTIAL_ID');
943
+
944
+ function createAgent() { return new MultiAgentEngine({ /* ... */ }); }
945
+ function createWorkflow() { return new Workflow({ /* ... */ }); }
946
+ function createSurface() { return new Surface({ /* ... */ }); }
947
+
948
+ createAgent();
949
+ createWorkflow();
950
+ createSurface();
951
+ \`\`\`
952
+
953
+ Use stable kebab-case resource IDs and unique step names. Credential IDs are references to credentials stored in Culvii; never place raw secrets in source.
954
+ `,"references/cli-guide.md":"# CLI development guide\n\nSafe lifecycle:\n\n1. Inspect `package.json`, `culvii.yaml`, and existing `*.culvii.ts` files.\n2. Author resources using installed `@culvii/kit` types. For every new workflow, complete the pre-validation choices in [surface configuration and visual approval](surface-feedback.md), including attaching any custom candidate surfaces, before starting `culvii dev`.\n3. Run `culvii whoami --json` to check the stored login and active context.\n4. If the user is not authenticated, run `culvii login` as a tracked process. If command execution or opening the browser requires approval, request that approval and continue as soon as the user allows it. Keep the login process running while its local callback server opens the user's browser and waits for authentication. When login lists multiple tenants, present those exact tenants through the agent's native in-run question tool, then write the selected tenant number followed by Enter to the same login process. Never choose a tenant or end the run while login is awaiting input. The CLI uses its interactive selector in a real terminal and automatically falls back to a plain numbered prompt when raw terminal mode is unavailable. Ask the user to run login manually only after execution is denied or the environment actually fails to launch the browser, callback server, or writable input process. Prefer the same `culvii` executable that will run `culvii dev`; if it is not on PATH, resolve the project-local CLI without hard-coding a machine-specific absolute path.\n5. After a fresh login, keep the tenant selected during login and do not ask again. For an existing authenticated session whose tenant has not been confirmed for the task, run `culvii switch` to list contexts. If more than one is available, show those exact tenants through the native question tool and run `culvii switch <tenant-slug>` with the user's selection. Never choose a tenant for the user.\n6. Run `culvii whoami --json` again and verify that the authenticated identity and active tenant match the user's selection.\n7. Start `culvii dev` as a tracked long-running process and retain its exact process/session handle. If another dev session is already active, do not start or terminate anything; ask the user to close their existing session.\n8. Inspect the initial evaluation and sync output. If it reports evaluation, schema, surface, node, or cross-resource validation errors, fix the authored files and let the running watcher validate them again. Repeat until validation and draft sync succeed.\n9. For a requested workflow, complete the [workflow feedback cycle](feedback-cycle.md), including the Console [surface review](surface-feedback.md), while this dev session remains active.\n10. In a cleanup step that runs after success, failure, cancellation, or a blocker, send Ctrl-C/SIGINT to the exact `culvii dev` process the agent started and wait for it to exit. Confirm the CLI disconnected and discarded the draft session. If graceful shutdown fails, terminate only that exact process and report that cleanup could not be confirmed. Never use a broad process kill.\n11. Do not present the resources as complete while validation or feedback errors remain or while the dev process is still running.\n12. Never run `culvii deploy`. Deployment is a separate user-operated action outside this skill.\n\n`culvii dev` watches `*.culvii.ts`, evaluates resources, validates their combined reference graph, and syncs drafts. Removed resources become orphans for the session. Ending the session cleans up draft resources. Do not assume a successful TypeScript build proves cross-resource references are valid.\n\nUse [cli-reference.md](cli-reference.md) for exact commands and flags generated from the registered Commander tree.\n\nFurther reading: [`culvii dev`](https://culvii.com/docs/cli/dev/) and [`culvii deploy`](https://culvii.com/docs/cli/deploy/).\n","references/cli-reference.md":`# CLI reference
955
+
956
+ Generated from the registered Commander command tree. Disabled and unregistered commands are excluded.
957
+
958
+ ## \`culvii\`
959
+
960
+ Culvii CLI
961
+
962
+ Options:
963
+
964
+ - \`--debug\` \u2014 Enable debug logging to ~/.culvii/logs/cli.log
965
+ - \`-V, --version\` \u2014 output the version number
966
+
967
+ ## \`culvii auth\`
968
+
969
+ Authentication commands
970
+
971
+ ## \`culvii auth login\`
972
+
973
+ Login to Culvii
974
+
975
+ ## \`culvii auth logout\`
976
+
977
+ Logout of Culvii
978
+
979
+ ## \`culvii deploy\`
980
+
981
+ Deploy an agent
982
+
983
+ Options:
984
+
985
+ - \`--env <env>\` (required) \u2014 Environment (sandbox or prod)
986
+ - \`--workspace-slug <slug>\` \u2014 Target workspace slug (overrides config)
987
+
988
+ ## \`culvii dev\`
989
+
990
+ Start the development server and file watcher
991
+
992
+ ## \`culvii env [environment]\`
993
+
994
+ Show or switch the active environment (dev, sandbox, prod)
995
+
996
+ ## \`culvii execution\`
997
+
998
+ Inspect workflow executions
999
+
1000
+ Options:
1001
+
1002
+ - \`--env <env>\` \u2014 Target environment (dev, sandbox, or prod)
1003
+
1004
+ ## \`culvii execution get <execution-id>\`
1005
+
1006
+ Get execution details, step outputs, and errors
1007
+
1008
+ Options:
1009
+
1010
+ - \`--json\` \u2014 Print machine-readable JSON
1011
+
1012
+ ## \`culvii execution list\`
1013
+
1014
+ List workspace executions
1015
+
1016
+ Options:
1017
+
1018
+ - \`--json\` \u2014 Print machine-readable JSON
1019
+ - \`--limit <limit>\` \u2014 Results per page
1020
+ - \`--page <page>\` \u2014 Page number
1021
+ - \`--status <status>\` \u2014 Filter by execution status
1022
+ - \`--trigger <trigger>\` \u2014 Filter by trigger type
1023
+ - \`--workflow <workflow>\` \u2014 Filter by workflow reference key or ID
1024
+
1025
+ ## \`culvii init [project-name]\`
1026
+
1027
+ Scaffold a new Culvii project with working agent and workflow files
1028
+
1029
+ Options:
1030
+
1031
+ - \`--here\` \u2014 Scaffold into the current directory instead of a named subdirectory
1032
+ - \`--provider <provider>\` \u2014 Model provider: openai | anthropic | gemini | google-vertex
1033
+ - \`--template <template>\` \u2014 Template: agent-only | agent-workflow | agent-workflow-tool | multi-agent
1034
+ - \`-y, --yes\` \u2014 Accept all defaults non-interactively
1035
+
1036
+ ## \`culvii integration\`
1037
+
1038
+ List and manage Culvii integrations
1039
+
1040
+ Options:
1041
+
1042
+ - \`--env <env>\` \u2014 Target environment (dev, sandbox, or prod)
1043
+
1044
+ ## \`culvii integration list\`
1045
+
1046
+ List available integration credentials and their scopes
1047
+
1048
+ Options:
1049
+
1050
+ - \`--json\` \u2014 Print machine-readable JSON
1051
+
1052
+ ## \`culvii login\`
1053
+
1054
+ Login to Culvii
1055
+
1056
+ ## \`culvii logout\`
1057
+
1058
+ Logout of Culvii
1059
+
1060
+ ## \`culvii rename <old-slug> <new-slug>\`
1061
+
1062
+ Rename a resource
1063
+
1064
+ Options:
1065
+
1066
+ - \`--env <env>\` \u2014 Target environment (sandbox or prod)
1067
+ - \`--resource-type <type>\` (required) \u2014 Type of resource (agent)
1068
+ - \`--workspace-slug <slug>\` \u2014 Target workspace slug (overrides config)
1069
+
1070
+ ## \`culvii skill\`
1071
+
1072
+ Manage AI agent skills
1073
+
1074
+ ## \`culvii skill install\`
1075
+
1076
+ Install the Culvii authoring skill bundle for AI agents
1077
+
1078
+ Options:
1079
+
1080
+ - \`--agent <agent>\` \u2014 Specify agent (claude|cursor|windsurf|github|opencode|gemini|kiro|codex|agents)
1081
+ - \`--force\` \u2014 Replace an existing unmanaged Culvii skill directory
1082
+ - \`--global\` \u2014 Install globally instead of in the current project
1083
+
1084
+ ## \`culvii surface\`
1085
+
1086
+ Surface authoring and review commands
1087
+
1088
+ Options:
1089
+
1090
+ - \`--env <env>\` \u2014 Target environment (dev, sandbox, or prod)
1091
+
1092
+ ## \`culvii surface review\`
1093
+
1094
+ Review custom runtime surfaces
1095
+
1096
+ ## \`culvii surface review create\`
1097
+
1098
+ Create a browser review for selected execution surfaces
1099
+
1100
+ Options:
1101
+
1102
+ - \`--file <path>\` (required) \u2014 JSON file with { items: [{ executionId, nodeId }] }
1103
+ - \`--json\` \u2014 Print machine-readable JSON
1104
+
1105
+ ## \`culvii surface review get <review-id>\`
1106
+
1107
+ Get selected surfaces and the user feedback collected so far
1108
+
1109
+ Options:
1110
+
1111
+ - \`--json\` \u2014 Print machine-readable JSON
1112
+
1113
+ ## \`culvii surface review open <review-id>\`
1114
+
1115
+ Open a surface review in the Culvii Console
1116
+
1117
+ ## \`culvii switch [tenant-slug]\`
1118
+
1119
+ Switch the active tenant context
1120
+
1121
+ ## \`culvii whoami\`
1122
+
1123
+ Show current authenticated user context
1124
+
1125
+ Options:
1126
+
1127
+ - \`--json\` \u2014 Output as JSON
1128
+
1129
+ ## \`culvii workflow\`
1130
+
1131
+ Workflow execution commands
1132
+
1133
+ Options:
1134
+
1135
+ - \`--env <env>\` \u2014 Target environment (dev, sandbox, or prod)
1136
+
1137
+ ## \`culvii workflow run <workflow>\`
1138
+
1139
+ Start a workflow execution
1140
+
1141
+ Options:
1142
+
1143
+ - \`--json\` \u2014 Print machine-readable JSON
1144
+ - \`--mocks-file <path>\` \u2014 JSON object mapping node IDs to mock outputs
1145
+ - \`--payload <json>\` \u2014 Trigger payload as JSON
1146
+ - \`--payload-file <path>\` \u2014 Read trigger payload from a JSON file
1147
+ - \`--trigger <node-name>\` (required) \u2014 Trigger node name
1148
+
1149
+ ## \`culvii workspace\`
1150
+
1151
+ Workspace commands
1152
+
1153
+ Options:
1154
+
1155
+ - \`--env <env>\` \u2014 Target environment (sandbox or prod)
1156
+
1157
+ ## \`culvii workspace create\`
1158
+
1159
+ Create a new workspace
1160
+
1161
+ Options:
1162
+
1163
+ - \`--name <name>\` (required) \u2014 Workspace name
1164
+ - \`--slug <slug>\` (required) \u2014 Workspace slug
1165
+
1166
+ ## \`culvii workspace list\`
1167
+
1168
+ List workspaces
1169
+
1170
+ Further reading: [\`culvii dev\`](https://culvii.com/docs/cli/dev/) and [\`culvii deploy\`](https://culvii.com/docs/cli/deploy/).
1171
+ `,"references/feedback-cycle.md":'# Workflow feedback cycle\n\nUse this only after `culvii dev` has validated and synced the requested draft resources.\n\n1. Keep the tracked `culvii dev` process running.\n2. Execute feedback only through a `manualTrigger`. If the selected authored trigger is cron, webhook, or polling, first snapshot its exact type, params, credentials, and other trigger-specific fields. Temporarily change that same step to `manualTrigger` while preserving its `id`, `name`, connections, and attached surfaces; remove incompatible trigger-only fields until restoration. Let the active `culvii dev` watcher validate and sync the temporary graph before continuing.\n3. Create a JSON payload matching the real runtime trigger\'s expected output shape. This representative payload becomes the mocked manual-trigger output automatically and supplies both downstream workflow data and surface preview data. Never mock or invoke the cron, webhook, or polling implementation itself.\n4. For every node reachable from the manual trigger whose generated node reference says `Feedback mock: required`, create a mock output keyed by the node\'s authored `id`. Do not include cron, webhook, or polling triggers in the mock file. Do not mock `core.agent`; agents must execute through their workflow node.\n5. Start the draft workflow with `culvii workflow run <workflow-reference-key> --trigger <manual-node-name> --payload-file <path> --mocks-file <path> --json`.\n6. Fetch `culvii execution get <execution-id> --json` until its status is `success` or `failed`. This status polling is not a workflow wait and must not resume paused nodes.\n7. On failure, inspect the execution error and the failing step\'s input/output ports. Fix the authored resource or mock fixture, allow `culvii dev` to resync, and rerun. Stop after three failed attempts and report the remaining error unless the user asks to continue.\n8. On success, inspect the final and intermediate step outputs for the requested behavior. If the workflow has custom candidate surfaces, use these outputs to complete [surface review](surface-feedback.md#validate-execute-and-review). Return to the development lifecycle only after all surface decisions are resolved; keep `culvii dev` running until then.\n9. In success, failure, cancellation, and blocker cleanup, restore the temporarily converted trigger exactly from the snapshot. Wait for `culvii dev` to validate and sync the restored authored graph before stopping the dev process. Do not modify an originally authored manual trigger.\n\nThe platform applies these execution-only overrides; the agent must not write them into the authored files:\n\n- Every node receives `pauseAfterExecution: false`.\n- `core.agent` receives `autoCloseSession: true`.\n- Agents outside the workflow are not executed.\n- Surfaces do not control execution progress. Their visual approval uses sanitized execution output but does not change workflow execution.\n\n## Mock file\n\nThe file is a JSON object keyed by workflow node ID. An object produces one output item; an array produces multiple items on the first output. Use `batches` only when a node needs multiple output indexes.\n\n```json\n{\n "gmail-send": { "id": "mock-message-1", "threadId": "mock-thread-1" },\n "outlook-read": [\n { "id": "mail-1", "subject": "Urgent request", "from": "person@example.com" }\n ],\n "multi-output-node": {\n "batches": [\n [{ "matched": true }],\n [{ "matched": false }]\n ]\n }\n}\n```\n\nIn mock mode, the trigger payload becomes the selected manual trigger\'s output. Feedback execution rejects non-manual triggers. A node marked as requiring a feedback mock fails safely when its mock is missing instead of executing. Nodes not marked this way, including core workflow logic and workflow-contained agents, execute normally.\n\nUse `culvii execution list --workflow <workflow> --page <n> --limit <n> --json` to find earlier runs. Use [cli-reference.md](cli-reference.md) for the current generated flags.\n',"references/integrations.md":"# Integration selection\n\nUse this flow whenever an agent model or workflow node requires a Culvii credential ID.\n\n1. After authentication and tenant selection, run `culvii integration list --json` in the user's project.\n2. Use only a connected integration whose provider, platform scope, and OAuth scopes cover the requested operation. The command returns each usable `credentialId` and the active tenant/environment's `addUrl`.\n3. If exactly one integration matches, use its `credentialId` directly in the authored resource without asking the user to copy it.\n4. If several match, ask one in-run selectable question. Label each option with its integration name, provider, and scope; retain the option-to-`credentialId` mapping internally.\n5. If none match, show the exact `addUrl` returned by the command on its own line as `\u{1F7E8} **Integration URL:** \\`<addUrl>\\`` and ask the user to add or connect the integration. The yellow marker is portable; do not emit raw ANSI color codes because structured question dialogs control their own text colors. Keep the current agent run open. After the user confirms completion, rerun `culvii integration list --json` and continue from its real output.\n\nNever ask the user to find, copy, or paste a credential ID. Never invent one. A tenant-scoped integration applies tenant-wide; an environment-scoped integration applies only to its environment; a workspace-scoped integration applies only to the listed workspace IDs. Treat `connected: false` or insufficient OAuth scopes as unusable and explain what must be connected or authorized at the displayed URL.\n\nUsers can run `culvii integration list` themselves for a readable table or add `--json` for machine-readable output. See [the generated CLI reference](cli-reference.md) for current flags.\n","references/kit-api.md":"# Kit API\n\nGenerated from the public `@culvii/kit` source exports. Import authoring APIs only from `@culvii/kit`.\n\n## Key signatures\n\n- `new MultiAgentEngine(primaryConfig: PrimaryAgentConfig)`\n- `createAgentModelConfigFromRef(modelRef, credentialId, options?)`\n- `defineWorkflowTool({ name, description, workflowId, triggerNodeName?, inputSchema? })`\n- `new Workflow({ id, name, active?, steps? })`\n- `new Step({ id?, name, type, params?, credentials?, disabled?, onError?, ui? })`\n- `step.connectTo(nextStep, { fromPort?, fromOutputIndex?, toInputIndex? })`\n- `new Surface({ id, name, description?, slot, definition })`\n\n## Agents\n\n`AgentBaseConfig`, `AgentIntegrationConfig`, `AgentMetadata`, `AgentModel`, `AgentModelConfig`, `AgentModelConfigOptions`, `AgentModelRef`, `AgentPermissions`, `AgentRole`, `AgentRuntimeDetails`, `BuiltInModelProvider`, `MultiAgentEngine`, `PrimaryAgentConfig`, `SANDBOX_TOOL_NAMES`, `SandboxToolName`, `SandboxToolPermission`, `SecondaryAgentConfig`, `SecondaryAgentMetadata`, `Tool`, `WorkflowToolConfig`, `createAgentModelConfigFromRef`, `defineWorkflowTool`, `parseAgentModelRef`\n\n## Development registry\n\n`DevRegistry`\n\n## Shared types\n\n`CulviiConfig`, `CulviiRuntime`, `DIDDocument`, `Guard`, `HealthReport`, `HookContext`, `IdentityConfig`, `IdentityRef`, `MaybePromise`, `MemoryConfig`, `MemoryType`, `Message`, `ObserveConfig`, `Permission`, `Plan`, `Policy`, `RetryConfig`, `SandboxConfig`, `Schema`, `Skill`, `StepTrace`, `Tool`, `ToolCallEvent`, `ToolResultEvent`, `Usage`\n\n## Surfaces\n\n`BinaryDescriptor`, `DefaultSurfaceSelection`, `ExecutionUiBinaryNodeValues`, `ExecutionUiDataModel`, `ExecutionUiNodeValues`, `ExecutionUiSurfaceEntry`, `ExecutionUiSurfaceMap`, `NodeSurfaceSlot`, `RuntimeSurface`, `RuntimeSurfaceAction`, `RuntimeSurfaceComponent`, `SerializedNodeUiConfig`, `SerializedSurface`, `SerializedSurfaceSelection`, `Surface`, `SurfaceAction`, `SurfaceBinding`, `SurfaceComponent`, `SurfaceConfig`, `SurfaceFormField`, `SurfaceReference`, `UISurfaceDefinition`, `UIValue`, `isSurface`\n\n## Workflows and steps\n\n`ConnectStepOptions`, `CredentialedNodeType`, `LoopBodyBuilder`, `NodeExpression`, `NodeParams`, `NodeParamsBase`, `NodeType`, `NodeTypeInput`, `NodeTypeParamsMap`, `NodeUiConfig`, `RegisteredNodeType`, `Resolvable`, `SerializedWorkflow`, `SerializedWorkflowStep`, `Step`, `StepCredentials`, `StepSurfaceSelection`, `Workflow`, `WorkflowConfig`, `WorkflowLoopConfig`, `WorkflowRuntimeConnection`, `WorkflowRuntimeConnections`, `WorkflowRuntimeNode`, `WorkflowRuntimeShape`, `WorkflowStepConfig`, `WorkflowStepConnection`\n\nFurther reading: [Workflow API](https://culvii.com/docs/sdk-reference/api-reference/workflow-api/), [Multi-Agent API](https://culvii.com/docs/sdk-reference/api-reference/multi-agent-api/), and [Authentication](https://culvii.com/docs/sdk-reference/guides/authentication/).\n","references/node-argocd.md":"# argocd\n\n- Type ID: `argocd`\n- Kind: `action`\n- Credentials: required as `credentials: { name, id }`; `name` must be one of: `argocd`\n- Feedback mock: required\n\nResolve the credential through [integration selection](integrations.md); never ask the user to copy a credential ID.\n\n## Props\n\n- `resource`: options; required\n - Values: `application`, `project`\n- `operation`: options; required; when resource=application\n - Values: `getApplication`, `syncApplication`, `listApplications`, `getResourceTree`\n- `operation`: options; required; when resource=project\n - Values: `listProjects`\n- `applicationName`: string; required; when resource=application, operation=getApplication\n- `refresh`: options; optional; when resource=application, operation=getApplication\n - Values: ``, `normal`, `hard`\n- `applicationName`: string; required; when resource=application, operation=syncApplication\n- `revision`: string; optional; when resource=application, operation=syncApplication\n- `prune`: boolean; optional; when resource=application, operation=syncApplication\n- `dryRun`: boolean; optional; when resource=application, operation=syncApplication\n- `strategy`: options; optional; when resource=application, operation=syncApplication\n - Values: `hook`, `apply`\n- `force`: boolean; optional; when resource=application, operation=syncApplication, strategy=apply\n- `project`: string; optional; when resource=application, operation=listApplications\n- `applicationName`: string; required; when resource=application, operation=getResourceTree\n- `pauseAfterExecution`: boolean; optional\n\n## Example\n\n```ts\nnew Step({\n id: 'argocd',\n name: 'argocd',\n type: 'argocd',\n credentials: { name: 'argocd', id: 'credential-id' },\n params: { /* use the required props and conditional values above */ },\n});\n```\n\nFurther reading: [Culvii argocd node](https://culvii.com/docs/nodes/argocd/).\n","references/node-clickup-doc.md":"# clickupDoc\n\n- Type ID: `clickupDoc`\n- Kind: `action`\n- Credentials: required as `credentials: { name, id }`; `name` must be one of: `clickup`\n- Feedback mock: required\n\nResolve the credential through [integration selection](integrations.md); never ask the user to copy a credential ID.\n\n## Props\n\n- `resource`: options; required\n - Values: `doc`\n- `operation`: options; required; when resource=doc\n - Values: `create`, `read`\n- `workspaceId`: string; required; when resource=doc, operation=create\n- `name`: string; required; when resource=doc, operation=create\n- `parentType`: options; required; when resource=doc, operation=create\n - Values: `12`, `4`, `5`, `6`\n- `parentId`: string; optional; when resource=doc, operation=create\n- `content`: string; optional; when resource=doc, operation=create\n- `workspaceId`: string; required; when resource=doc, operation=read\n- `docId`: string; required; when resource=doc, operation=read\n- `pauseAfterExecution`: boolean; optional\n\n## Example\n\n```ts\nnew Step({\n id: 'clickup-doc',\n name: 'clickupDoc',\n type: 'clickupDoc',\n credentials: { name: 'clickup', id: 'credential-id' },\n params: { /* use the required props and conditional values above */ },\n});\n```\n\nFurther reading: [Culvii clickupDoc node](https://culvii.com/docs/nodes/clickup-doc/).\n","references/node-clickup-ticket.md":"# clickupTicket\n\n- Type ID: `clickupTicket`\n- Kind: `action`\n- Credentials: required as `credentials: { name, id }`; `name` must be one of: `clickup`\n- Feedback mock: required\n\nResolve the credential through [integration selection](integrations.md); never ask the user to copy a credential ID.\n\n## Props\n\n- `resource`: options; required\n - Values: `ticket`\n- `operation`: options; required; when resource=ticket\n - Values: `create`, `update`, `updateStatus`, `updateDescription`\n- `listId`: string; required; when resource=ticket, operation=create\n- `name`: string; required; when resource=ticket, operation=create\n- `description`: string; optional; when resource=ticket, operation=create\n- `status`: string; optional; when resource=ticket, operation=create\n- `assignees`: string; optional; when resource=ticket, operation=create\n- `priority`: options; optional; when resource=ticket, operation=create\n - Values: ``, `1`, `2`, `3`, `4`\n- `taskId`: string; required; when resource=ticket, operation=update\n- `name`: string; optional; when resource=ticket, operation=update\n- `description`: string; optional; when resource=ticket, operation=update\n- `status`: string; optional; when resource=ticket, operation=update\n- `priority`: options; optional; when resource=ticket, operation=update\n - Values: ``, `1`, `2`, `3`, `4`\n- `taskId`: string; required; when resource=ticket, operation=updateStatus\n- `status`: string; required; when resource=ticket, operation=updateStatus\n- `taskId`: string; required; when resource=ticket, operation=updateDescription\n- `description`: string; required; when resource=ticket, operation=updateDescription\n- `pauseAfterExecution`: boolean; optional\n\n## Example\n\n```ts\nnew Step({\n id: 'clickup-ticket',\n name: 'clickupTicket',\n type: 'clickupTicket',\n credentials: { name: 'clickup', id: 'credential-id' },\n params: { /* use the required props and conditional values above */ },\n});\n```\n\nFurther reading: [Culvii clickupTicket node](https://culvii.com/docs/nodes/clickup-ticket/).\n","references/node-core-agent.md":`# core.agent
1172
+
1173
+ - Type ID: \`core.agent\`
1174
+ - Kind: \`action\`
1175
+ - Credentials: not required
1176
+ - Feedback mock: not required
1177
+
1178
+ ## Props
1179
+
1180
+ - \`agentReferenceKey\`: string; required
1181
+ - \`prompt\`: string; required
1182
+ - \`autoCloseSession\`: boolean; optional
1183
+ - \`outputFormat\`: json; optional
1184
+ - \`pauseAfterExecution\`: boolean; optional
1185
+
1186
+ ## Example
1187
+
1188
+ \`\`\`ts
1189
+ new Step({
1190
+ id: 'core-agent',
1191
+ name: 'core.agent',
1192
+ type: 'core.agent',
1193
+ params: { /* use the required props and conditional values above */ },
1194
+ });
1195
+ \`\`\`
1196
+
1197
+ Further reading: [Culvii core.agent node](https://culvii.com/docs/nodes/core/agent/).
1198
+ `,"references/node-core-browser-automation.md":"# core.browserAutomation\n\n- Type ID: `core.browserAutomation`\n- Kind: `action`\n- Credentials: not required\n- Feedback mock: required\n\n## Props\n\n- `url`: string; required\n- `timeoutMs`: number; optional\n- `includeHtml`: boolean; optional\n- `auth`: object; required\n - `type`: options; required\n - Values: `none`, `form`\n - `loginUrl`: string; optional; when type=form\n - `usernameSelector`: string; optional; when type=form\n - `passwordSelector`: string; optional; when type=form\n - `submitSelector`: string; optional; when type=form\n - `otpSelector`: string; optional; when type=form\n - `otpSubmitSelector`: string; optional; when type=form\n - `useTotp`: boolean; optional; when type=form\n- `steps`: array; optional\n - `step`: object; optional\n - `type`: options; optional\n - Values: `goto`, `fill`, `click`, `waitForSelector`, `waitForTimeout`, `extract`\n - `url`: string; optional; when type=goto\n - `waitUntil`: options; optional; when type=goto\n - Values: `load`, `domcontentloaded`, `networkidle`\n - `selector`: string; optional; when type=fill|click|waitForSelector\n - `value`: string; optional; when type=fill\n - `timeoutMs`: number; optional; when type=waitForSelector|waitForTimeout\n - `selectors`: array; optional; when type=extract\n - `selectorRule`: object; optional\n - `key`: string; optional\n - `selector`: string; optional\n - `type`: options; optional\n - Values: `text`, `texts`, `attr`, `attrs`\n - `attrName`: string; optional; when type=attr|attrs\n- `pauseAfterExecution`: boolean; optional\n\n## Example\n\n```ts\nnew Step({\n id: 'core-browser-automation',\n name: 'core.browserAutomation',\n type: 'core.browserAutomation',\n params: { /* use the required props and conditional values above */ },\n});\n```\n\nFurther reading: [Culvii core.browserAutomation node](https://culvii.com/docs/nodes/core/browser-automation/).\n","references/node-core-code.md":`# core.code
1199
+
1200
+ - Type ID: \`core.code\`
1201
+ - Kind: \`action\`
1202
+ - Credentials: not required
1203
+ - Feedback mock: not required
1204
+
1205
+ ## Props
1206
+
1207
+ - \`code\`: string; required
1208
+ - \`codeType\`: options; optional
1209
+ - Values: \`js\`, \`py\`
1210
+ - \`codeParams\`: object; optional
1211
+ - \`globalParams\`: object; optional
1212
+ - \`pauseAfterExecution\`: boolean; optional
1213
+
1214
+ ## Example
1215
+
1216
+ \`\`\`ts
1217
+ new Step({
1218
+ id: 'core-code',
1219
+ name: 'core.code',
1220
+ type: 'core.code',
1221
+ params: { /* use the required props and conditional values above */ },
1222
+ });
1223
+ \`\`\`
1224
+
1225
+ Further reading: [Culvii core.code node](https://culvii.com/docs/nodes/core/code/).
1226
+ `,"references/node-core-http.md":"# core.http\n\n- Type ID: `core.http`\n- Kind: `action`\n- Credentials: not required\n- Feedback mock: required\n\n## Props\n\n- `method`: options; required\n - Values: `GET`, `POST`, `PUT`, `PATCH`, `DELETE`, `HEAD`, `OPTIONS`\n- `url`: string; required\n- `authentication`: options; optional\n - Values: `none`, `bearerToken`, `basicAuth`\n- `bearerToken`: string; optional; when authentication=bearerToken\n- `username`: string; optional; when authentication=basicAuth\n- `password`: string; optional; when authentication=basicAuth\n- `queryParameters`: object; optional\n- `headers`: object; optional\n- `bodyContentType`: options; optional\n - Values: `json`, `form`, `form-urlencoded`, `raw`\n- `body`: string; optional\n- `responseFormat`: options; optional\n - Values: `json`, `text`, `autodetect`\n- `options`: object; optional\n - `timeout`: number; optional\n - `followRedirects`: boolean; optional\n - `ignoreSSL`: boolean; optional\n- `pauseAfterExecution`: boolean; optional\n\n## Example\n\n```ts\nnew Step({\n id: 'core-http',\n name: 'core.http',\n type: 'core.http',\n params: { /* use the required props and conditional values above */ },\n});\n```\n\nFurther reading: [Culvii core.http node](https://culvii.com/docs/nodes/core/http/).\n","references/node-core-if.md":`# core.if
1227
+
1228
+ - Type ID: \`core.if\`
1229
+ - Kind: \`action\`
1230
+ - Credentials: not required
1231
+ - Feedback mock: not required
1232
+
1233
+ ## Props
1234
+
1235
+ - \`conditions\`: array; required
1236
+ - \`combineOperation\`: options; required
1237
+ - Values: \`all\`, \`any\`
1238
+ - \`pauseAfterExecution\`: boolean; optional
1239
+
1240
+ ## Example
1241
+
1242
+ \`\`\`ts
1243
+ new Step({
1244
+ id: 'core-if',
1245
+ name: 'core.if',
1246
+ type: 'core.if',
1247
+ params: { /* use the required props and conditional values above */ },
1248
+ });
1249
+ \`\`\`
1250
+
1251
+ Further reading: [Culvii core.if node](https://culvii.com/docs/nodes/core/if/).
1252
+ `,"references/node-core-jwt.md":`# core.jwt
1253
+
1254
+ - Type ID: \`core.jwt\`
1255
+ - Kind: \`action\`
1256
+ - Credentials: not required
1257
+ - Feedback mock: not required
1258
+
1259
+ ## Props
1260
+
1261
+ - \`operation\`: options; required
1262
+ - Values: \`sign\`, \`verify\`
1263
+ - \`payload\`: object; optional; when operation=sign
1264
+ - \`token\`: string; optional; when operation=verify
1265
+ - \`secret\`: string; required
1266
+ - \`expiresIn\`: string; optional; when operation=sign
1267
+ - \`issuer\`: string; optional
1268
+ - \`audience\`: string; optional
1269
+ - \`pauseAfterExecution\`: boolean; optional
1270
+
1271
+ ## Example
1272
+
1273
+ \`\`\`ts
1274
+ new Step({
1275
+ id: 'core-jwt',
1276
+ name: 'core.jwt',
1277
+ type: 'core.jwt',
1278
+ params: { /* use the required props and conditional values above */ },
1279
+ });
1280
+ \`\`\`
1281
+
1282
+ Further reading: [Culvii core.jwt node](https://culvii.com/docs/nodes/core/jwt/).
1283
+ `,"references/node-core-loop-break.md":`# core.loopBreak
1284
+
1285
+ - Type ID: \`core.loopBreak\`
1286
+ - Kind: \`action\`
1287
+ - Credentials: not required
1288
+ - Feedback mock: not required
1289
+
1290
+ ## Props
1291
+
1292
+ - \`conditions\`: array; required
1293
+ - \`combineOperation\`: options; required
1294
+ - Values: \`all\`, \`any\`
1295
+ - \`pauseAfterExecution\`: boolean; optional
1296
+
1297
+ ## Example
1298
+
1299
+ \`\`\`ts
1300
+ new Step({
1301
+ id: 'core-loop-break',
1302
+ name: 'core.loopBreak',
1303
+ type: 'core.loopBreak',
1304
+ params: { /* use the required props and conditional values above */ },
1305
+ });
1306
+ \`\`\`
1307
+
1308
+ Further reading: [Culvii core.loopBreak node](https://culvii.com/docs/nodes/core/loop-break/).
1309
+ `,"references/node-core-loop-continue.md":`# core.loopContinue
1310
+
1311
+ - Type ID: \`core.loopContinue\`
1312
+ - Kind: \`action\`
1313
+ - Credentials: not required
1314
+ - Feedback mock: not required
1315
+
1316
+ ## Props
1317
+
1318
+ - \`conditions\`: array; required
1319
+ - \`combineOperation\`: options; required
1320
+ - Values: \`all\`, \`any\`
1321
+ - \`pauseAfterExecution\`: boolean; optional
1322
+
1323
+ ## Example
1324
+
1325
+ \`\`\`ts
1326
+ new Step({
1327
+ id: 'core-loop-continue',
1328
+ name: 'core.loopContinue',
1329
+ type: 'core.loopContinue',
1330
+ params: { /* use the required props and conditional values above */ },
1331
+ });
1332
+ \`\`\`
1333
+
1334
+ Further reading: [Culvii core.loopContinue node](https://culvii.com/docs/nodes/core/loop-continue/).
1335
+ `,"references/node-core-loop-output.md":`# core.loopOutput
1336
+
1337
+ - Type ID: \`core.loopOutput\`
1338
+ - Kind: \`action\`
1339
+ - Credentials: not required
1340
+ - Feedback mock: not required
1341
+
1342
+ ## Props
1343
+
1344
+ - \`values\`: object; required
1345
+ - \`pauseAfterExecution\`: boolean; optional
1346
+
1347
+ ## Example
1348
+
1349
+ \`\`\`ts
1350
+ new Step({
1351
+ id: 'core-loop-output',
1352
+ name: 'core.loopOutput',
1353
+ type: 'core.loopOutput',
1354
+ params: { /* use the required props and conditional values above */ },
1355
+ });
1356
+ \`\`\`
1357
+
1358
+ Further reading: [Culvii core.loopOutput node](https://culvii.com/docs/nodes/core/loop-output/).
1359
+ `,"references/node-core-loop.md":`# core.loop
1360
+
1361
+ - Type ID: \`core.loop\`
1362
+ - Kind: \`action\`
1363
+ - Credentials: not required
1364
+ - Feedback mock: not required
1365
+
1366
+ ## Props
1367
+
1368
+ - \`items\`: array; required
1369
+ - \`parallel\`: boolean; required
1370
+ - \`pauseAfterExecution\`: boolean; optional
1371
+
1372
+ ## Example
1373
+
1374
+ \`\`\`ts
1375
+ new Step({
1376
+ id: 'core-loop',
1377
+ name: 'core.loop',
1378
+ type: 'core.loop',
1379
+ params: { /* use the required props and conditional values above */ },
1380
+ });
1381
+ \`\`\`
1382
+
1383
+ Further reading: [Culvii core.loop node](https://culvii.com/docs/nodes/core/loop/).
1384
+ `,"references/node-core-merge.md":`# core.merge
1385
+
1386
+ - Type ID: \`core.merge\`
1387
+ - Kind: \`action\`
1388
+ - Credentials: not required
1389
+ - Feedback mock: not required
1390
+
1391
+ ## Props
1392
+
1393
+ - \`pauseAfterExecution\`: boolean; optional
1394
+
1395
+ ## Example
1396
+
1397
+ \`\`\`ts
1398
+ new Step({
1399
+ id: 'core-merge',
1400
+ name: 'core.merge',
1401
+ type: 'core.merge',
1402
+ params: { /* use the required props and conditional values above */ },
1403
+ });
1404
+ \`\`\`
1405
+
1406
+ Further reading: [Culvii core.merge node](https://culvii.com/docs/nodes/core/merge/).
1407
+ `,"references/node-core-set.md":`# core.set
1408
+
1409
+ - Type ID: \`core.set\`
1410
+ - Kind: \`action\`
1411
+ - Credentials: not required
1412
+ - Feedback mock: not required
1413
+
1414
+ ## Props
1415
+
1416
+ - \`values\`: object; required
1417
+ - \`pauseAfterExecution\`: boolean; optional
1418
+
1419
+ ## Example
1420
+
1421
+ \`\`\`ts
1422
+ new Step({
1423
+ id: 'core-set',
1424
+ name: 'core.set',
1425
+ type: 'core.set',
1426
+ params: { /* use the required props and conditional values above */ },
1427
+ });
1428
+ \`\`\`
1429
+
1430
+ Further reading: [Culvii core.set node](https://culvii.com/docs/nodes/core/set/).
1431
+ `,"references/node-core-switch.md":`# core.switch
1432
+
1433
+ - Type ID: \`core.switch\`
1434
+ - Kind: \`action\`
1435
+ - Credentials: not required
1436
+ - Feedback mock: not required
1437
+
1438
+ ## Props
1439
+
1440
+ - \`rules\`: array; required
1441
+ - \`pauseAfterExecution\`: boolean; optional
1442
+
1443
+ ## Example
1444
+
1445
+ \`\`\`ts
1446
+ new Step({
1447
+ id: 'core-switch',
1448
+ name: 'core.switch',
1449
+ type: 'core.switch',
1450
+ params: { /* use the required props and conditional values above */ },
1451
+ });
1452
+ \`\`\`
1453
+
1454
+ Further reading: [Culvii core.switch node](https://culvii.com/docs/nodes/core/switch/).
1455
+ `,"references/node-cost-explorer.md":"# costExplorer\n\n- Type ID: `costExplorer`\n- Kind: `action`\n- Credentials: required as `credentials: { name, id }`; `name` must be one of: `aws_cost_explorer`\n- Feedback mock: required\n\nResolve the credential through [integration selection](integrations.md); never ask the user to copy a credential ID.\n\n## Props\n\n- `resource`: options; required\n - Values: `costAndUsage`\n- `operation`: options; required; when resource=costAndUsage\n - Values: `get`\n- `dateRange`: options; required; when resource=costAndUsage, operation=get\n - Values: `yesterday`, `last7Days`, `last30Days`, `monthToDate`, `lastMonth`, `custom`\n- `startDate`: string; required; when resource=costAndUsage, operation=get, dateRange=custom\n- `endDate`: string; required; when resource=costAndUsage, operation=get, dateRange=custom\n- `granularity`: options; required; when resource=costAndUsage, operation=get\n - Values: `DAILY`, `MONTHLY`\n- `metric`: options; required; when resource=costAndUsage, operation=get\n - Values: `NetUnblendedCost`, `NetAmortizedCost`, `UnblendedCost`, `BlendedCost`, `AmortizedCost`\n- `groupBy`: json; optional; when resource=costAndUsage, operation=get\n- `services`: json; optional; when resource=costAndUsage, operation=get\n- `accountIds`: json; optional; when resource=costAndUsage, operation=get\n- `filterExpression`: json; optional; when resource=costAndUsage, operation=get\n- `outputFormat`: options; required; when resource=costAndUsage, operation=get\n - Values: `simple`, `raw`\n- `limit`: number; optional; when resource=costAndUsage, operation=get\n- `pauseAfterExecution`: boolean; optional\n\n## Example\n\n```ts\nnew Step({\n id: 'cost-explorer',\n name: 'costExplorer',\n type: 'costExplorer',\n credentials: { name: 'aws_cost_explorer', id: 'credential-id' },\n params: { /* use the required props and conditional values above */ },\n});\n```\n\nFurther reading: [Culvii costExplorer node](https://culvii.com/docs/nodes/cost-explorer/).\n","references/node-cron-trigger.md":`# cronTrigger
1456
+
1457
+ - Type ID: \`cronTrigger\`
1458
+ - Kind: \`trigger\`
1459
+ - Credentials: not required
1460
+ - Feedback mock: not required
1461
+
1462
+ ## Props
1463
+
1464
+ - \`cronExpression\`: string; optional
1465
+ - \`pollIntervalMs\`: number; optional
1466
+ - \`pauseAfterExecution\`: boolean; optional
1467
+
1468
+ ## Example
1469
+
1470
+ \`\`\`ts
1471
+ new Step({
1472
+ id: 'cron-trigger',
1473
+ name: 'cronTrigger',
1474
+ type: 'cronTrigger',
1475
+ params: { /* use the required props and conditional values above */ },
1476
+ });
1477
+ \`\`\`
1478
+
1479
+ Further reading: [Culvii cronTrigger node](https://culvii.com/docs/nodes/triggers/cron-trigger/).
1480
+ `,"references/node-elasticsearch.md":"# elasticsearch\n\n- Type ID: `elasticsearch`\n- Kind: `action`\n- Credentials: required as `credentials: { name, id }`; `name` must be one of: `elasticsearch`\n- Feedback mock: required\n\nResolve the credential through [integration selection](integrations.md); never ask the user to copy a credential ID.\n\n## Props\n\n- `resource`: options; required\n - Values: `document`\n- `operation`: options; required; when resource=document\n - Values: `search`, `updateDocument`\n- `index`: string; required; when resource=document, operation=search\n- `query`: json; required; when resource=document, operation=search\n- `size`: number; optional; when resource=document, operation=search\n- `sort`: json; optional; when resource=document, operation=search\n- `retryOnEmptyHits`: boolean; optional; when resource=document, operation=search\n- `retryDelaysSec`: array; optional; when resource=document, operation=search, retryOnEmptyHits=true\n- `index`: string; required; when resource=document, operation=updateDocument\n- `id`: string; required; when resource=document, operation=updateDocument\n- `fields`: json; required; when resource=document, operation=updateDocument\n- `pauseAfterExecution`: boolean; optional\n\n## Example\n\n```ts\nnew Step({\n id: 'elasticsearch',\n name: 'elasticsearch',\n type: 'elasticsearch',\n credentials: { name: 'elasticsearch', id: 'credential-id' },\n params: { /* use the required props and conditional values above */ },\n});\n```\n\nFurther reading: [Culvii elasticsearch node](https://culvii.com/docs/nodes/elasticsearch/).\n","references/node-github-poll-trigger.md":"# githubPollTrigger\n\n- Type ID: `githubPollTrigger`\n- Kind: `trigger`\n- Credentials: required as `credentials: { name, id }`; `name` must be one of: `github`, `github_oauth`, `github_app`\n- Feedback mock: required\n\nResolve the credential through [integration selection](integrations.md); never ask the user to copy a credential ID.\n\n## Props\n\n- `pollIntervalMs`: number; required\n- `owner`: string; required\n- `repo`: string; required\n- `watch`: options; required\n - Values: `pullRequest`, `issue`\n- `pauseAfterExecution`: boolean; optional\n\n## Example\n\n```ts\nnew Step({\n id: 'github-poll-trigger',\n name: 'githubPollTrigger',\n type: 'githubPollTrigger',\n credentials: { name: 'github', id: 'credential-id' },\n params: { /* use the required props and conditional values above */ },\n});\n```\n\nFurther reading: [Culvii githubPollTrigger node](https://culvii.com/docs/nodes/triggers/github-poll-trigger/).\n","references/node-github-webhook-trigger.md":`# githubWebhookTrigger
1481
+
1482
+ - Type ID: \`githubWebhookTrigger\`
1483
+ - Kind: \`trigger\`
1484
+ - Credentials: required as \`credentials: { name, id }\`; \`name\` must be one of: \`github_webhook\`
1485
+ - Feedback mock: required
1486
+
1487
+ Resolve the credential through [integration selection](integrations.md); never ask the user to copy a credential ID.
1488
+
1489
+ ## Props
1490
+
1491
+ - \`method\`: string; required
1492
+ - \`pauseAfterExecution\`: boolean; optional
1493
+
1494
+ ## Example
1495
+
1496
+ \`\`\`ts
1497
+ new Step({
1498
+ id: 'github-webhook-trigger',
1499
+ name: 'githubWebhookTrigger',
1500
+ type: 'githubWebhookTrigger',
1501
+ credentials: { name: 'github_webhook', id: 'credential-id' },
1502
+ params: { /* use the required props and conditional values above */ },
1503
+ });
1504
+ \`\`\`
1505
+
1506
+ Further reading: [Culvii githubWebhookTrigger node](https://culvii.com/docs/nodes/triggers/github-webhook-trigger/).
1507
+ `,"references/node-github.md":"# github\n\n- Type ID: `github`\n- Kind: `action`\n- Credentials: required as `credentials: { name, id }`; `name` must be one of: `github`, `github_oauth`, `github_app`\n- Feedback mock: required\n\nResolve the credential through [integration selection](integrations.md); never ask the user to copy a credential ID.\n\n## Props\n\n- `resource`: options; required\n - Values: `pullRequest`, `branch`, `issue`, `repo`, `org`, `gitBlob`, `gitTree`, `gitCommit`, `commitStatus`, `file`, `action`, `search`\n- `operation`: options; required; when resource=pullRequest\n - Values: `list`, `get`, `create`, `close`, `merge`, `listComments`, `createComment`, `createInlineComment`, `createReview`, `requestReviewers`\n- `operation`: options; required; when resource=branch\n - Values: `list`, `get`, `delete`\n- `operation`: options; required; when resource=issue\n - Values: `create`, `list`, `get`, `update`, `close`, `addLabels`, `createComment`\n- `operation`: options; required; when resource=repo\n - Values: `getContents`, `create`\n- `operation`: options; required; when resource=org\n - Values: `list`\n- `operation`: options; required; when resource=gitBlob\n - Values: `create`, `get`\n- `operation`: options; required; when resource=gitTree\n - Values: `create`, `get`\n- `operation`: options; required; when resource=gitCommit\n - Values: `create`\n- `operation`: options; required; when resource=commitStatus\n - Values: `create`, `list`, `getCombined`\n- `operation`: options; required; when resource=file\n - Values: `createOrUpdate`\n- `operation`: options; required; when resource=action\n - Values: `dispatch`\n- `operation`: options; required; when resource=search\n - Values: `issuesAndPRs`\n- `owner`: string; required; when resource=pullRequest, operation=list\n- `repo`: string; required; when resource=pullRequest, operation=list\n- `state`: options; optional; when resource=pullRequest, operation=list\n - Values: `open`, `closed`, `all`\n- `limit`: number; required; when resource=pullRequest, operation=list\n- `output`: options; optional; when resource=pullRequest, operation=list\n - Values: `simple`, `raw`, `fields`\n- `fields`: checkbox; required; when output=fields, resource=pullRequest, operation=list\n - Values: `id`, `number`, `title`, `state`, `body`, `user`, `base`, `head`, `draft`, `merged`, `mergeable`, `merged_at`, `requested_reviewers`, `labels`, `assignees`, `created_at`, `updated_at`, `closed_at`, `html_url`\n- `owner`: string; required; when resource=pullRequest, operation=close\n- `repo`: string; required; when resource=pullRequest, operation=close\n- `pullNumber`: number; required; when resource=pullRequest, operation=close\n- `owner`: string; required; when resource=pullRequest, operation=create\n- `repo`: string; required; when resource=pullRequest, operation=create\n- `title`: string; required; when resource=pullRequest, operation=create\n- `head`: string; required; when resource=pullRequest, operation=create\n- `base`: string; required; when resource=pullRequest, operation=create\n- `body`: string; optional; when resource=pullRequest, operation=create\n- `draft`: boolean; optional; when resource=pullRequest, operation=create\n- `owner`: string; required; when resource=pullRequest, operation=get\n- `repo`: string; required; when resource=pullRequest, operation=get\n- `pullNumber`: number; required; when resource=pullRequest, operation=get\n- `output`: options; optional; when resource=pullRequest, operation=get\n - Values: `simple`, `raw`, `fields`\n- `fields`: checkbox; required; when output=fields, resource=pullRequest, operation=get\n - Values: `id`, `number`, `title`, `state`, `body`, `user`, `base`, `head`, `draft`, `merged`, `mergeable`, `merged_at`, `requested_reviewers`, `labels`, `assignees`, `created_at`, `updated_at`, `closed_at`, `html_url`\n- `owner`: string; required; when resource=pullRequest, operation=merge\n- `repo`: string; required; when resource=pullRequest, operation=merge\n- `pullNumber`: number; required; when resource=pullRequest, operation=merge\n- `mergeMethod`: options; optional; when resource=pullRequest, operation=merge\n - Values: `merge`, `squash`, `rebase`\n- `commitTitle`: string; optional; when resource=pullRequest, operation=merge\n- `commitMessage`: string; optional; when resource=pullRequest, operation=merge\n- `waitForMergeability`: boolean; optional; when resource=pullRequest, operation=merge\n- `owner`: string; required; when resource=pullRequest, operation=listComments\n- `repo`: string; required; when resource=pullRequest, operation=listComments\n- `pullNumber`: number; required; when resource=pullRequest, operation=listComments\n- `limit`: number; required; when resource=pullRequest, operation=listComments\n- `output`: options; optional; when resource=pullRequest, operation=listComments\n - Values: `simple`, `raw`, `fields`\n- `fields`: checkbox; required; when output=fields, resource=pullRequest, operation=listComments\n - Values: `id`, `body`, `user`, `created_at`, `updated_at`, `html_url`\n- `owner`: string; required; when resource=pullRequest, operation=createComment\n- `repo`: string; required; when resource=pullRequest, operation=createComment\n- `pullNumber`: number; required; when resource=pullRequest, operation=createComment\n- `body`: string; required; when resource=pullRequest, operation=createComment\n- `owner`: string; required; when resource=pullRequest, operation=createInlineComment\n- `repo`: string; required; when resource=pullRequest, operation=createInlineComment\n- `pullNumber`: number; required; when resource=pullRequest, operation=createInlineComment\n- `commitId`: string; required; when resource=pullRequest, operation=createInlineComment\n- `path`: string; required; when resource=pullRequest, operation=createInlineComment\n- `line`: number; required; when resource=pullRequest, operation=createInlineComment\n- `start_line`: number; optional; when resource=pullRequest, operation=createInlineComment\n- `side`: options; optional; when resource=pullRequest, operation=createInlineComment\n - Values: `RIGHT`, `LEFT`\n- `start_side`: options; optional; when resource=pullRequest, operation=createInlineComment\n - Values: `RIGHT`, `LEFT`\n- `body`: string; required; when resource=pullRequest, operation=createInlineComment\n- `owner`: string; required; when resource=pullRequest, operation=createReview\n- `repo`: string; required; when resource=pullRequest, operation=createReview\n- `pullNumber`: number; required; when resource=pullRequest, operation=createReview\n- `event`: options; required; when resource=pullRequest, operation=createReview\n - Values: `APPROVE`, `REQUEST_CHANGES`, `COMMENT`\n- `body`: string; optional; when resource=pullRequest, operation=createReview\n- `commitId`: string; optional; when resource=pullRequest, operation=createReview\n- `comments`: json; optional; when resource=pullRequest, operation=createReview\n- `owner`: string; required; when resource=pullRequest, operation=requestReviewers\n- `repo`: string; required; when resource=pullRequest, operation=requestReviewers\n- `pullNumber`: number; required; when resource=pullRequest, operation=requestReviewers\n- `reviewers`: string; optional; when resource=pullRequest, operation=requestReviewers\n- `teamReviewers`: string; optional; when resource=pullRequest, operation=requestReviewers\n- `owner`: string; required; when resource=branch, operation=list\n- `repo`: string; required; when resource=branch, operation=list\n- `limit`: number; required; when resource=branch, operation=list\n- `output`: options; optional; when resource=branch, operation=list\n - Values: `simple`, `raw`, `fields`\n- `fields`: checkbox; required; when output=fields, resource=branch, operation=list\n - Values: `name`, `commit`, `protected`, `protection`\n- `owner`: string; required; when resource=branch, operation=delete\n- `repo`: string; required; when resource=branch, operation=delete\n- `branch`: string; required; when resource=branch, operation=delete\n- `owner`: string; required; when resource=branch, operation=get\n- `repo`: string; required; when resource=branch, operation=get\n- `branch`: string; required; when resource=branch, operation=get\n- `output`: options; optional; when resource=branch, operation=get\n - Values: `simple`, `raw`, `fields`\n- `fields`: checkbox; required; when output=fields, resource=branch, operation=get\n - Values: `name`, `commit`, `protected`, `protection`\n- `owner`: string; required; when resource=issue, operation=create\n- `repo`: string; required; when resource=issue, operation=create\n- `title`: string; required; when resource=issue, operation=create\n- `body`: string; optional; when resource=issue, operation=create\n- `labels`: string; optional; when resource=issue, operation=create\n- `assignees`: string; optional; when resource=issue, operation=create\n- `owner`: string; required; when resource=issue, operation=list\n- `repo`: string; required; when resource=issue, operation=list\n- `state`: options; optional; when resource=issue, operation=list\n - Values: `open`, `closed`, `all`\n- `limit`: number; required; when resource=issue, operation=list\n- `output`: options; optional; when resource=issue, operation=list\n - Values: `simple`, `raw`, `fields`\n- `fields`: checkbox; required; when output=fields, resource=issue, operation=list\n - Values: `id`, `number`, `title`, `state`, `body`, `user`, `labels`, `assignees`, `milestone`, `comments`, `locked`, `created_at`, `updated_at`, `closed_at`, `html_url`\n- `owner`: string; required; when resource=issue, operation=get\n- `repo`: string; required; when resource=issue, operation=get\n- `issueNumber`: number; required; when resource=issue, operation=get\n- `output`: options; optional; when resource=issue, operation=get\n - Values: `simple`, `raw`, `fields`\n- `fields`: checkbox; required; when output=fields, resource=issue, operation=get\n - Values: `id`, `number`, `title`, `state`, `body`, `user`, `labels`, `assignees`, `milestone`, `comments`, `locked`, `created_at`, `updated_at`, `closed_at`, `html_url`\n- `owner`: string; required; when resource=issue, operation=update\n- `repo`: string; required; when resource=issue, operation=update\n- `issueNumber`: number; required; when resource=issue, operation=update\n- `title`: string; optional; when resource=issue, operation=update\n- `body`: string; optional; when resource=issue, operation=update\n- `state`: options; optional; when resource=issue, operation=update\n - Values: `noChange`, `open`, `closed`\n- `labels`: string; optional; when resource=issue, operation=update\n- `clearLabels`: boolean; optional; when resource=issue, operation=update\n- `assignees`: string; optional; when resource=issue, operation=update\n- `clearAssignees`: boolean; optional; when resource=issue, operation=update\n- `owner`: string; required; when resource=issue, operation=close\n- `repo`: string; required; when resource=issue, operation=close\n- `issueNumber`: number; required; when resource=issue, operation=close\n- `owner`: string; required; when resource=issue, operation=addLabels\n- `repo`: string; required; when resource=issue, operation=addLabels\n- `issueNumber`: number; required; when resource=issue, operation=addLabels\n- `labels`: string; required; when resource=issue, operation=addLabels\n- `owner`: string; required; when resource=issue, operation=createComment\n- `repo`: string; required; when resource=issue, operation=createComment\n- `issueNumber`: number; required; when resource=issue, operation=createComment\n- `body`: string; required; when resource=issue, operation=createComment\n- `owner`: string; required; when resource=repo, operation=getContents\n- `repo`: string; required; when resource=repo, operation=getContents\n- `path`: string; required; when resource=repo, operation=getContents\n- `ref`: string; optional; when resource=repo, operation=getContents\n- `isOrganization`: boolean; optional; when resource=repo, operation=create\n- `orgName`: string; required; when isOrganization=true, resource=repo, operation=create\n- `name`: string; required; when resource=repo, operation=create\n- `description`: string; optional; when resource=repo, operation=create\n- `private`: boolean; optional; when resource=repo, operation=create\n- `is_template`: boolean; optional; when resource=repo, operation=create\n- `owner`: string; required; when resource=gitBlob, operation=create\n- `repo`: string; required; when resource=gitBlob, operation=create\n- `content`: string; required; when resource=gitBlob, operation=create\n- `encoding`: options; optional; when resource=gitBlob, operation=create\n - Values: `utf-8`, `base64`\n- `owner`: string; required; when resource=gitBlob, operation=get\n- `repo`: string; required; when resource=gitBlob, operation=get\n- `file_sha`: string; required; when resource=gitBlob, operation=get\n- `owner`: string; required; when resource=gitTree, operation=create\n- `repo`: string; required; when resource=gitTree, operation=create\n- `tree`: json; required; when resource=gitTree, operation=create\n- `base_tree`: string; optional; when resource=gitTree, operation=create\n- `owner`: string; required; when resource=gitTree, operation=get\n- `repo`: string; required; when resource=gitTree, operation=get\n- `tree_sha`: string; required; when resource=gitTree, operation=get\n- `recursive`: boolean; optional; when resource=gitTree, operation=get\n- `owner`: string; required; when resource=gitCommit, operation=create\n- `repo`: string; required; when resource=gitCommit, operation=create\n- `message`: string; required; when resource=gitCommit, operation=create\n- `tree`: string; required; when resource=gitCommit, operation=create\n- `parents`: string; required; when resource=gitCommit, operation=create\n- `owner`: string; required; when resource=commitStatus, operation=list\n- `repo`: string; required; when resource=commitStatus, operation=list\n- `ref`: string; required; when resource=commitStatus, operation=list\n- `limit`: number; required; when resource=commitStatus, operation=list\n- `output`: options; optional; when resource=commitStatus, operation=list\n - Values: `simple`, `raw`, `fields`\n- `fields`: checkbox; required; when output=fields, resource=commitStatus, operation=list\n - Values: `id`, `url`, `state`, `description`, `target_url`, `context`, `created_at`, `updated_at`, `creator`\n- `owner`: string; required; when resource=commitStatus, operation=create\n- `repo`: string; required; when resource=commitStatus, operation=create\n- `sha`: string; required; when resource=commitStatus, operation=create\n- `state`: options; required; when resource=commitStatus, operation=create\n - Values: `error`, `failure`, `pending`, `success`\n- `target_url`: string; optional; when resource=commitStatus, operation=create\n- `description`: string; optional; when resource=commitStatus, operation=create\n- `context`: string; optional; when resource=commitStatus, operation=create\n- `owner`: string; required; when resource=commitStatus, operation=getCombined\n- `repo`: string; required; when resource=commitStatus, operation=getCombined\n- `ref`: string; required; when resource=commitStatus, operation=getCombined\n- `owner`: string; required; when resource=file, operation=createOrUpdate\n- `repo`: string; required; when resource=file, operation=createOrUpdate\n- `path`: string; required; when resource=file, operation=createOrUpdate\n- `message`: string; required; when resource=file, operation=createOrUpdate\n- `content`: string; required; when resource=file, operation=createOrUpdate\n- `sha`: string; optional; when resource=file, operation=createOrUpdate\n- `branch`: string; optional; when resource=file, operation=createOrUpdate\n- `owner`: string; required; when resource=action, operation=dispatch\n- `repo`: string; required; when resource=action, operation=dispatch\n- `workflowId`: string; required; when resource=action, operation=dispatch\n- `ref`: string; required; when resource=action, operation=dispatch\n- `inputs`: json; optional; when resource=action, operation=dispatch\n- `q`: string; required; when resource=search, operation=issuesAndPRs\n- `sort`: options; optional; when resource=search, operation=issuesAndPRs\n - Values: `best-match`, `comments`, `reactions`, `created`, `updated`\n- `order`: options; optional; when resource=search, operation=issuesAndPRs\n - Values: `desc`, `asc`\n- `pauseAfterExecution`: boolean; optional\n\n## Example\n\n```ts\nnew Step({\n id: 'github',\n name: 'github',\n type: 'github',\n credentials: { name: 'github', id: 'credential-id' },\n params: { /* use the required props and conditional values above */ },\n});\n```\n\nFurther reading: [Culvii github node](https://culvii.com/docs/nodes/github/).\n","references/node-gmail-trigger.md":"# gmailTrigger\n\n- Type ID: `gmailTrigger`\n- Kind: `trigger`\n- Credentials: required as `credentials: { name, id }`; `name` must be one of: `gmail`\n- Feedback mock: required\n\nResolve the credential through [integration selection](integrations.md); never ask the user to copy a credential ID.\n\n## Props\n\n- `pollIntervalMs`: number; required\n- `event`: options; required\n - Values: `messageReceived`\n- `output`: options; optional\n - Values: `simple`, `raw`, `fields`\n- `fields`: checkbox; required; when output=fields\n - Values: `id`, `threadId`, `labelIds`, `snippet`, `historyId`, `internalDate`, `payload`, `sizeEstimate`, `raw`, `classificationLabelValues`\n- `includeAttachments`: boolean; optional\n- `filters`: object; optional\n - `readStatus`: options; optional\n - Values: `both`, `unread`, `read`\n - `sender`: string; optional\n - `subjectContains`: string; optional\n - `hasAttachment`: boolean; optional\n - `label`: string; optional\n- `options`: object; optional\n - `markAsRead`: boolean; optional\n - `maxEmails`: number; optional\n- `pauseAfterExecution`: boolean; optional\n\n## Example\n\n```ts\nnew Step({\n id: 'gmail-trigger',\n name: 'gmailTrigger',\n type: 'gmailTrigger',\n credentials: { name: 'gmail', id: 'credential-id' },\n params: { /* use the required props and conditional values above */ },\n});\n```\n\nFurther reading: [Culvii gmailTrigger node](https://culvii.com/docs/nodes/triggers/gmail-trigger/).\n","references/node-gmail.md":"# gmail\n\n- Type ID: `gmail`\n- Kind: `action`\n- Credentials: required as `credentials: { name, id }`; `name` must be one of: `gmail`\n- Feedback mock: required\n\nResolve the credential through [integration selection](integrations.md); never ask the user to copy a credential ID.\n\n## Props\n\n- `resource`: options; optional\n - Values: `message`\n- `operation`: options; optional; when resource=message\n - Values: `send`, `readAll`\n- `toRecipients`: string; required; when resource=message, operation=send\n- `subject`: string; optional; when resource=message, operation=send\n- `bodyContent`: string; optional; when resource=message, operation=send\n- `additionalFields`: object; optional; when resource=message, operation=send\n - `bccRecipients`: string; optional\n - `ccRecipients`: string; optional\n - `bodyContentType`: options; optional\n - Values: `html`, `text`\n - `replyTo`: string; optional\n- `output`: options; optional; when resource=message, operation=readAll\n - Values: `simple`, `raw`, `fields`\n- `limit`: number; required; when resource=message, operation=readAll\n- `includeAttachments`: boolean; optional; when resource=message, operation=readAll\n- `fields`: checkbox; required; when output=fields, resource=message, operation=readAll\n - Values: `id`, `threadId`, `labelIds`, `snippet`, `historyId`, `internalDate`, `payload`, `sizeEstimate`, `raw`, `classificationLabelValues`\n- `userFilters`: object; optional; when resource=message, operation=readAll\n - `filterBy`: options; optional\n - Values: `filters`, `search`\n - `search`: string; optional; when filterBy=search\n - `filters`: object; optional; when filterBy=filters\n - `readStatus`: options; optional\n - Values: `both`, `unread`, `read`\n - `receivedAfter`: dateTime; optional\n - `receivedBefore`: dateTime; optional\n - `sender`: string; optional\n - `hasAttachment`: boolean; optional\n - `label`: string; optional\n- `pauseAfterExecution`: boolean; optional\n\n## Example\n\n```ts\nnew Step({\n id: 'gmail',\n name: 'gmail',\n type: 'gmail',\n credentials: { name: 'gmail', id: 'credential-id' },\n params: { /* use the required props and conditional values above */ },\n});\n```\n\nFurther reading: [Culvii gmail node](https://culvii.com/docs/nodes/gmail/).\n","references/node-google-calendar.md":"# googleCalendar\n\n- Type ID: `googleCalendar`\n- Kind: `action`\n- Credentials: required as `credentials: { name, id }`; `name` must be one of: `google_calendar`\n- Feedback mock: required\n\nResolve the credential through [integration selection](integrations.md); never ask the user to copy a credential ID.\n\n## Props\n\n- `resource`: options; optional\n - Values: `event`\n- `operation`: options; optional; when resource=event\n - Values: `create`, `readAll`\n- `calendarId`: string; required; when resource=event, operation=create\n- `summary`: string; optional; when resource=event, operation=create\n- `start`: dateTime; required; when resource=event, operation=create\n- `end`: dateTime; required; when resource=event, operation=create\n- `additionalFields`: object; optional; when resource=event, operation=create\n - `description`: string; optional\n - `location`: string; optional\n - `timeZone`: string; optional\n- `calendarId`: string; required; when resource=event, operation=readAll\n- `output`: options; optional; when resource=event, operation=readAll\n - Values: `simple`, `raw`, `fields`\n- `limit`: number; required; when resource=event, operation=readAll\n- `fields`: checkbox; required; when output=fields, resource=event, operation=readAll\n - Values: `id`, `status`, `summary`, `description`, `location`, `htmlLink`, `updated`, `start`, `end`\n- `userFilters`: object; optional; when resource=event, operation=readAll\n - `query`: string; optional\n - `timeMin`: dateTime; optional\n - `timeMax`: dateTime; optional\n - `singleEvents`: boolean; optional\n - `showDeleted`: boolean; optional\n - `timeZone`: string; optional\n- `pauseAfterExecution`: boolean; optional\n\n## Example\n\n```ts\nnew Step({\n id: 'google-calendar',\n name: 'googleCalendar',\n type: 'googleCalendar',\n credentials: { name: 'google_calendar', id: 'credential-id' },\n params: { /* use the required props and conditional values above */ },\n});\n```\n\nFurther reading: [Culvii googleCalendar node](https://culvii.com/docs/nodes/google-calendar/).\n","references/node-google-docs.md":"# googleDocs\n\n- Type ID: `googleDocs`\n- Kind: `action`\n- Credentials: required as `credentials: { name, id }`; `name` must be one of: `google_docs`\n- Feedback mock: required\n\nResolve the credential through [integration selection](integrations.md); never ask the user to copy a credential ID.\n\n## Props\n\n- `resource`: options; optional\n - Values: `document`\n- `operation`: options; optional; when resource=document\n - Values: `create`, `get`, `replaceText`, `appendText`\n- `title`: string; required; when resource=document, operation=create\n- `documentId`: string; required; when resource=document, operation=get\n- `includeTabsContent`: boolean; optional; when resource=document, operation=get\n- `fields`: string; optional; when resource=document, operation=get\n- `documentId`: string; required; when resource=document, operation=replaceText\n- `searchText`: string; required; when resource=document, operation=replaceText\n- `replacementText`: string; optional; when resource=document, operation=replaceText\n- `additionalFields`: object; optional; when resource=document, operation=replaceText\n - `matchCase`: boolean; optional\n - `requiredRevisionId`: string; optional\n - `targetRevisionId`: string; optional\n- `documentId`: string; required; when resource=document, operation=appendText\n- `text`: string; required; when resource=document, operation=appendText\n- `additionalFields`: object; optional; when resource=document, operation=appendText\n - `requiredRevisionId`: string; optional\n - `targetRevisionId`: string; optional\n- `pauseAfterExecution`: boolean; optional\n\n## Example\n\n```ts\nnew Step({\n id: 'google-docs',\n name: 'googleDocs',\n type: 'googleDocs',\n credentials: { name: 'google_docs', id: 'credential-id' },\n params: { /* use the required props and conditional values above */ },\n});\n```\n\nFurther reading: [Culvii googleDocs node](https://culvii.com/docs/nodes/google-docs/).\n","references/node-grafana-dashboard.md":"# grafanaDashboard\n\n- Type ID: `grafanaDashboard`\n- Kind: `action`\n- Credentials: required as `credentials: { name, id }`; `name` must be one of: `grafana`\n- Feedback mock: required\n\nResolve the credential through [integration selection](integrations.md); never ask the user to copy a credential ID.\n\n## Props\n\n- `resource`: options; required\n - Values: `dashboard`\n- `operation`: options; required; when resource=dashboard\n - Values: `createUpdate`, `get`, `list`\n- `dashboard`: json; required; when resource=dashboard, operation=createUpdate\n- `folderUid`: string; optional; when resource=dashboard, operation=createUpdate\n- `overwrite`: boolean; optional; when resource=dashboard, operation=createUpdate\n- `message`: string; optional; when resource=dashboard, operation=createUpdate\n- `uid`: string; required; when resource=dashboard, operation=get\n- `query`: string; optional; when resource=dashboard, operation=list\n- `folderUids`: string; optional; when resource=dashboard, operation=list\n- `limit`: number; optional; when resource=dashboard, operation=list\n- `pauseAfterExecution`: boolean; optional\n\n## Example\n\n```ts\nnew Step({\n id: 'grafana-dashboard',\n name: 'grafanaDashboard',\n type: 'grafanaDashboard',\n credentials: { name: 'grafana', id: 'credential-id' },\n params: { /* use the required props and conditional values above */ },\n});\n```\n\nFurther reading: [Culvii grafanaDashboard node](https://culvii.com/docs/nodes/grafana-dashboard/).\n","references/node-grafana-data-source.md":"# grafanaDataSource\n\n- Type ID: `grafanaDataSource`\n- Kind: `action`\n- Credentials: required as `credentials: { name, id }`; `name` must be one of: `grafana`\n- Feedback mock: required\n\nResolve the credential through [integration selection](integrations.md); never ask the user to copy a credential ID.\n\n## Props\n\n- `resource`: options; required\n - Values: `datasource`\n- `operation`: options; required; when resource=datasource\n - Values: `configure`, `healthCheck`, `list`\n- `uid`: string; optional; when resource=datasource, operation=configure\n- `name`: string; required; when resource=datasource, operation=configure\n- `type`: string; required; when resource=datasource, operation=configure\n- `url`: string; required; when resource=datasource, operation=configure\n- `access`: options; optional; when resource=datasource, operation=configure\n - Values: `proxy`, `direct`\n- `basicAuth`: boolean; optional; when resource=datasource, operation=configure\n- `basicAuthUser`: string; optional; when resource=datasource, operation=configure, basicAuth=true\n- `basicAuthPassword`: string; optional; when resource=datasource, operation=configure, basicAuth=true\n- `jsonData`: json; optional; when resource=datasource, operation=configure\n- `secureJsonData`: json; optional; when resource=datasource, operation=configure\n- `uid`: string; required; when resource=datasource, operation=healthCheck\n- `pauseAfterExecution`: boolean; optional\n\n## Example\n\n```ts\nnew Step({\n id: 'grafana-data-source',\n name: 'grafanaDataSource',\n type: 'grafanaDataSource',\n credentials: { name: 'grafana', id: 'credential-id' },\n params: { /* use the required props and conditional values above */ },\n});\n```\n\nFurther reading: [Culvii grafanaDataSource node](https://culvii.com/docs/nodes/grafana-data-source/).\n","references/node-grafana-query.md":"# grafanaQuery\n\n- Type ID: `grafanaQuery`\n- Kind: `action`\n- Credentials: required as `credentials: { name, id }`; `name` must be one of: `grafana`\n- Feedback mock: required\n\nResolve the credential through [integration selection](integrations.md); never ask the user to copy a credential ID.\n\n## Props\n\n- `resource`: options; required\n - Values: `query`\n- `operation`: options; required; when resource=query\n - Values: `queryDataSource`\n- `datasourceUid`: string; required; when resource=query, operation=queryDataSource\n- `query`: json; required; when resource=query, operation=queryDataSource\n- `from`: string; optional; when resource=query, operation=queryDataSource\n- `to`: string; optional; when resource=query, operation=queryDataSource\n- `pauseAfterExecution`: boolean; optional\n\n## Example\n\n```ts\nnew Step({\n id: 'grafana-query',\n name: 'grafanaQuery',\n type: 'grafanaQuery',\n credentials: { name: 'grafana', id: 'credential-id' },\n params: { /* use the required props and conditional values above */ },\n});\n```\n\nFurther reading: [Culvii grafanaQuery node](https://culvii.com/docs/nodes/grafana-query/).\n","references/node-hibp-list-domains.md":`# hibp.listDomains
1508
+
1509
+ - Type ID: \`hibp.listDomains\`
1510
+ - Kind: \`action\`
1511
+ - Credentials: required as \`credentials: { name, id }\`; \`name\` must be one of: \`hibp\`
1512
+ - Feedback mock: required
1513
+
1514
+ Resolve the credential through [integration selection](integrations.md); never ask the user to copy a credential ID.
1515
+
1516
+ ## Props
1517
+
1518
+ - \`skipDomains\`: array; optional
1519
+ - \`pauseAfterExecution\`: boolean; optional
1520
+
1521
+ ## Example
1522
+
1523
+ \`\`\`ts
1524
+ new Step({
1525
+ id: 'hibp-list-domains',
1526
+ name: 'hibp.listDomains',
1527
+ type: 'hibp.listDomains',
1528
+ credentials: { name: 'hibp', id: 'credential-id' },
1529
+ params: { /* use the required props and conditional values above */ },
1530
+ });
1531
+ \`\`\`
1532
+
1533
+ Further reading: [Culvii hibp.listDomains node](https://culvii.com/docs/nodes/hibp-list-domains/).
1534
+ `,"references/node-hibp-stealer-logs.md":`# hibp.stealerLogs
1535
+
1536
+ - Type ID: \`hibp.stealerLogs\`
1537
+ - Kind: \`action\`
1538
+ - Credentials: required as \`credentials: { name, id }\`; \`name\` must be one of: \`hibp\`
1539
+ - Feedback mock: required
1540
+
1541
+ Resolve the credential through [integration selection](integrations.md); never ask the user to copy a credential ID.
1542
+
1543
+ ## Props
1544
+
1545
+ - \`domainList\`: array; required
1546
+ - \`startDate\`: string; optional
1547
+ - \`endDate\`: string; optional
1548
+ - \`breachName\`: string; optional
1549
+ - \`pauseAfterExecution\`: boolean; optional
1550
+
1551
+ ## Example
1552
+
1553
+ \`\`\`ts
1554
+ new Step({
1555
+ id: 'hibp-stealer-logs',
1556
+ name: 'hibp.stealerLogs',
1557
+ type: 'hibp.stealerLogs',
1558
+ credentials: { name: 'hibp', id: 'credential-id' },
1559
+ params: { /* use the required props and conditional values above */ },
1560
+ });
1561
+ \`\`\`
1562
+
1563
+ Further reading: [Culvii hibp.stealerLogs node](https://culvii.com/docs/nodes/hibp-stealer-logs/).
1564
+ `,"references/node-kubernetes.md":"# kubernetes\n\n- Type ID: `kubernetes`\n- Kind: `action`\n- Credentials: required as `credentials: { name, id }`; `name` must be one of: `kubernetes_token`\n- Feedback mock: required\n\nResolve the credential through [integration selection](integrations.md); never ask the user to copy a credential ID.\n\n## Props\n\n- `resource`: options; required\n - Values: `cluster`, `resource`\n- `operation`: options; required; when resource=cluster\n - Values: `listNamespaces`\n- `operation`: options; required; when resource=resource\n - Values: `list`\n- `labelSelector`: string; optional; when resource=cluster, operation=listNamespaces\n- `fieldSelector`: string; optional; when resource=cluster, operation=listNamespaces\n- `returnAll`: boolean; optional; when resource=cluster, operation=listNamespaces\n- `limit`: number; optional; when resource=cluster, operation=listNamespaces\n- `maxItems`: number; optional; when resource=cluster, operation=listNamespaces\n- `continueToken`: string; optional; when resource=cluster, operation=listNamespaces\n- `outputFormat`: options; optional; when resource=cluster, operation=listNamespaces\n - Values: `full`, `table`\n- `apiVersion`: string; required; when resource=resource, operation=list\n- `resourceType`: string; required; when resource=resource, operation=list\n- `namespace`: string; optional; when resource=resource, operation=list\n- `labelSelector`: string; optional; when resource=resource, operation=list\n- `fieldSelector`: string; optional; when resource=resource, operation=list\n- `returnAll`: boolean; optional; when resource=resource, operation=list\n- `limit`: number; optional; when resource=resource, operation=list\n- `maxItems`: number; optional; when resource=resource, operation=list\n- `continueToken`: string; optional; when resource=resource, operation=list\n- `outputFormat`: options; optional; when resource=resource, operation=list\n - Values: `full`, `table`\n- `pauseAfterExecution`: boolean; optional\n\n## Example\n\n```ts\nnew Step({\n id: 'kubernetes',\n name: 'kubernetes',\n type: 'kubernetes',\n credentials: { name: 'kubernetes_token', id: 'credential-id' },\n params: { /* use the required props and conditional values above */ },\n});\n```\n\nFurther reading: [Culvii kubernetes node](https://culvii.com/docs/nodes/kubernetes/).\n","references/node-manual-trigger.md":`# manualTrigger
1565
+
1566
+ - Type ID: \`manualTrigger\`
1567
+ - Kind: \`trigger\`
1568
+ - Credentials: not required
1569
+ - Feedback mock: not required
1570
+
1571
+ ## Props
1572
+
1573
+ - \`payloadSchema\`: array; optional
1574
+ - \`pauseAfterExecution\`: boolean; optional
1575
+
1576
+ ## Example
1577
+
1578
+ \`\`\`ts
1579
+ new Step({
1580
+ id: 'manual-trigger',
1581
+ name: 'manualTrigger',
1582
+ type: 'manualTrigger',
1583
+ params: { /* use the required props and conditional values above */ },
1584
+ });
1585
+ \`\`\`
1586
+
1587
+ Further reading: [Culvii manualTrigger node](https://culvii.com/docs/nodes/triggers/manual-trigger/).
1588
+ `,"references/node-microsoft-outlook-trigger.md":"# microsoftOutlookTrigger\n\n- Type ID: `microsoftOutlookTrigger`\n- Kind: `trigger`\n- Credentials: required as `credentials: { name, id }`; `name` must be one of: `microsoft_outlook`\n- Feedback mock: required\n\nResolve the credential through [integration selection](integrations.md); never ask the user to copy a credential ID.\n\n## Props\n\n- `pollIntervalMs`: number; required\n- `event`: options; required\n - Values: `messageReceived`\n- `output`: options; optional\n - Values: `simple`, `raw`, `fields`\n- `fields`: checkbox; required; when output=fields\n - Values: `bccRecipients`, `body`, `bodyPreview`, `categories`, `ccRecipients`, `changeKey`, `conversationId`, `createdDateTime`, `flag`, `from`, `hasAttachments`, `importance`, `inferenceClassification`, `internetMessageId`, `isDeliveryReceiptRequested`, `isDraft`, `isRead`, `isReadReceiptRequested`, `lastModifiedDateTime`, `parentFolderId`, `receivedDateTime`, `replyTo`, `sender`, `sentDateTime`, `subject`, `toRecipients`, `webLink`\n- `filters`: object; optional\n - `onlyUnread`: boolean; optional\n - `sender`: string; optional\n - `subjectContains`: string; optional\n - `folder`: string; optional\n- `options`: object; optional\n - `markAsRead`: boolean; optional\n - `maxEmails`: number; optional\n- `pauseAfterExecution`: boolean; optional\n\n## Example\n\n```ts\nnew Step({\n id: 'microsoft-outlook-trigger',\n name: 'microsoftOutlookTrigger',\n type: 'microsoftOutlookTrigger',\n credentials: { name: 'microsoft_outlook', id: 'credential-id' },\n params: { /* use the required props and conditional values above */ },\n});\n```\n\nFurther reading: [Culvii microsoftOutlookTrigger node](https://culvii.com/docs/nodes/triggers/microsoft-outlook-trigger/).\n","references/node-microsoft-outlook.md":"# microsoftOutlook\n\n- Type ID: `microsoftOutlook`\n- Kind: `action`\n- Credentials: required as `credentials: { name, id }`; `name` must be one of: `microsoft_outlook`\n- Feedback mock: required\n\nResolve the credential through [integration selection](integrations.md); never ask the user to copy a credential ID.\n\n## Props\n\n- `resource`: options; optional\n - Values: `message`\n- `operation`: options; optional; when resource=message\n - Values: `send`, `readAll`\n- `toRecipients`: string; required; when resource=message, operation=send\n- `subject`: string; optional; when resource=message, operation=send\n- `bodyContent`: string; optional; when resource=message, operation=send\n- `additionalFields`: object; optional; when resource=message, operation=send\n - `bccRecipients`: string; optional\n - `ccRecipients`: string; optional\n - `bodyContentType`: options; optional\n - Values: `html`, `Text`\n - `replyTo`: string; optional\n - `saveToSentItems`: boolean; optional\n- `output`: options; optional; when resource=message, operation=readAll\n - Values: `simple`, `raw`, `fields`\n- `limit`: number; required; when resource=message, operation=readAll\n- `fields`: checkbox; required; when output=fields, resource=message, operation=readAll\n - Values: `bccRecipients`, `body`, `bodyPreview`, `categories`, `ccRecipients`, `changeKey`, `conversationId`, `createdDateTime`, `flag`, `from`, `hasAttachments`, `importance`, `inferenceClassification`, `internetMessageId`, `isDeliveryReceiptRequested`, `isDraft`, `isRead`, `isReadReceiptRequested`, `lastModifiedDateTime`, `parentFolderId`, `receivedDateTime`, `replyTo`, `sender`, `sentDateTime`, `subject`, `toRecipients`, `webLink`\n- `folder`: string; optional; when resource=message, operation=readAll\n- `userFilters`: object; optional; when resource=message, operation=readAll\n - `filterBy`: options; optional\n - Values: `filters`, `search`\n - `search`: string; optional; when filterBy=search\n - `filters`: object; optional; when filterBy=filters\n - `readStatus`: options; optional\n - Values: `both`, `unread`, `read`\n - `receivedAfter`: dateTime; optional\n - `receivedBefore`: dateTime; optional\n - `sender`: string; optional\n- `pauseAfterExecution`: boolean; optional\n\n## Example\n\n```ts\nnew Step({\n id: 'microsoft-outlook',\n name: 'microsoftOutlook',\n type: 'microsoftOutlook',\n credentials: { name: 'microsoft_outlook', id: 'credential-id' },\n params: { /* use the required props and conditional values above */ },\n});\n```\n\nFurther reading: [Culvii microsoftOutlook node](https://culvii.com/docs/nodes/microsoft-outlook/).\n","references/node-microsoft-sharepoint.md":"# microsoftSharepoint\n\n- Type ID: `microsoftSharepoint`\n- Kind: `action`\n- Credentials: required as `credentials: { name, id }`; `name` must be one of: `sharepoint`\n- Feedback mock: required\n\nResolve the credential through [integration selection](integrations.md); never ask the user to copy a credential ID.\n\n## Props\n\n- `resource`: options; required\n - Values: `sharepointItem`, `sharepointList`\n- `operation`: options; required; when resource=sharepointItem\n - Values: `getMany`, `getOne`, `create`, `update`, `delete`\n- `siteId`: options; required; when resource=sharepointItem\n- `listId`: options; required; when resource=sharepointItem\n- `limit`: number; optional; when resource=sharepointItem, operation=getMany\n- `returnFields`: string; optional; when resource=sharepointItem, operation=getMany|getOne\n- `itemId`: string; required; when resource=sharepointItem, operation=getOne|update|delete\n- `contentTypeId`: options; required; when resource=sharepointItem, operation=create|update\n- `fields`: resourceMapper; required; when resource=sharepointItem, operation=create|update\n- `operation`: options; required; when resource=sharepointList\n - Values: `getMany`\n- `siteId`: options; required; when resource=sharepointList\n- `pauseAfterExecution`: boolean; optional\n\n## Example\n\n```ts\nnew Step({\n id: 'microsoft-sharepoint',\n name: 'microsoftSharepoint',\n type: 'microsoftSharepoint',\n credentials: { name: 'sharepoint', id: 'credential-id' },\n params: { /* use the required props and conditional values above */ },\n});\n```\n\nFurther reading: [Culvii microsoftSharepoint node](https://culvii.com/docs/nodes/microsoft-sharepoint/).\n","references/node-onionsearch.md":`# onionsearch
1589
+
1590
+ - Type ID: \`onionsearch\`
1591
+ - Kind: \`action\`
1592
+ - Credentials: required as \`credentials: { name, id }\`; \`name\` must be one of: \`onionsearch\`
1593
+ - Feedback mock: required
1594
+
1595
+ Resolve the credential through [integration selection](integrations.md); never ask the user to copy a credential ID.
1596
+
1597
+ ## Props
1598
+
1599
+ - \`queries\`: array; required
1600
+ - \`pauseAfterExecution\`: boolean; optional
1601
+
1602
+ ## Example
1603
+
1604
+ \`\`\`ts
1605
+ new Step({
1606
+ id: 'onionsearch',
1607
+ name: 'onionsearch',
1608
+ type: 'onionsearch',
1609
+ credentials: { name: 'onionsearch', id: 'credential-id' },
1610
+ params: { /* use the required props and conditional values above */ },
1611
+ });
1612
+ \`\`\`
1613
+
1614
+ Further reading: [Culvii onionsearch node](https://culvii.com/docs/nodes/onionsearch/).
1615
+ `,"references/node-prometheus.md":"# prometheus\n\n- Type ID: `prometheus`\n- Kind: `action`\n- Credentials: required as `credentials: { name, id }`; `name` must be one of: `prometheus`, `prometheus_noauth`, `prometheus_bearer`, `prometheus_headers`\n- Feedback mock: required\n\nResolve the credential through [integration selection](integrations.md); never ask the user to copy a credential ID.\n\n## Props\n\n- `resource`: options; required\n - Values: `query`, `metadata`\n- `operation`: options; required; when resource=query\n - Values: `instantQuery`, `rangeQuery`\n- `operation`: options; required; when resource=metadata\n - Values: `getTargets`, `getAlerts`\n- `query`: string; required; when resource=query, operation=instantQuery\n- `time`: string; optional; when resource=query, operation=instantQuery\n- `query`: string; required; when resource=query, operation=rangeQuery\n- `start`: string; required; when resource=query, operation=rangeQuery\n- `end`: string; required; when resource=query, operation=rangeQuery\n- `step`: string; required; when resource=query, operation=rangeQuery\n- `state`: options; required; when resource=metadata, operation=getTargets\n - Values: `any`, `active`, `dropped`\n- `pauseAfterExecution`: boolean; optional\n\n## Example\n\n```ts\nnew Step({\n id: 'prometheus',\n name: 'prometheus',\n type: 'prometheus',\n credentials: { name: 'prometheus', id: 'credential-id' },\n params: { /* use the required props and conditional values above */ },\n});\n```\n\nFurther reading: [Culvii prometheus node](https://culvii.com/docs/nodes/prometheus/).\n","references/node-s3.md":"# s3\n\n- Type ID: `s3`\n- Kind: `action`\n- Credentials: required as `credentials: { name, id }`; `name` must be one of: `aws_s3`\n- Feedback mock: required\n\nResolve the credential through [integration selection](integrations.md); never ask the user to copy a credential ID.\n\n## Props\n\n- `resource`: options; required\n - Values: `object`\n- `operation`: options; required; when resource=object\n - Values: `upload`, `get`\n- `bucketName`: string; required; when resource=object, operation=upload\n- `objectKey`: string; required; when resource=object, operation=upload\n- `binaryPropertyName`: string; required; when resource=object, operation=upload\n- `skipIfNoBinaryData`: boolean; optional; when resource=object, operation=upload\n- `bucketName`: string; required; when resource=object, operation=get\n- `objectKey`: string; required; when resource=object, operation=get\n- `binaryPropertyName`: string; required; when resource=object, operation=get\n- `returnBinaryData`: boolean; optional; when resource=object, operation=get\n- `generateDownloadUrl`: boolean; optional; when resource=object, operation=get\n- `downloadUrlExpiresIn`: number; optional; when resource=object, operation=get, generateDownloadUrl=true\n- `pauseAfterExecution`: boolean; optional\n\n## Example\n\n```ts\nnew Step({\n id: 's3',\n name: 's3',\n type: 's3',\n credentials: { name: 'aws_s3', id: 'credential-id' },\n params: { /* use the required props and conditional values above */ },\n});\n```\n\nFurther reading: [Culvii s3 node](https://culvii.com/docs/nodes/s3/).\n","references/node-slack-events-trigger.md":"# slackEventsTrigger\n\n- Type ID: `slackEventsTrigger`\n- Kind: `trigger`\n- Credentials: required as `credentials: { name, id }`; `name` must be one of: `slack_events`\n- Feedback mock: required\n\nResolve the credential through [integration selection](integrations.md); never ask the user to copy a credential ID.\n\n## Props\n\n- `method`: string; required\n- `event`: options; optional\n - Values: `message`, `app_mention`, `reaction_added`, `all`\n- `filters`: object; optional\n - `channelId`: string; optional\n - `userId`: string; optional\n - `textContains`: string; optional\n - `excludeBots`: boolean; optional\n - `threads`: options; optional\n - Values: `all`, `topLevel`, `replies`\n - `includeMessageChanges`: boolean; optional\n- `pauseAfterExecution`: boolean; optional\n\n## Example\n\n```ts\nnew Step({\n id: 'slack-events-trigger',\n name: 'slackEventsTrigger',\n type: 'slackEventsTrigger',\n credentials: { name: 'slack_events', id: 'credential-id' },\n params: { /* use the required props and conditional values above */ },\n});\n```\n\nFurther reading: [Culvii slackEventsTrigger node](https://culvii.com/docs/nodes/triggers/slack-events-trigger/).\n","references/node-slack-interactions-trigger.md":`# slackInteractionsTrigger
1616
+
1617
+ - Type ID: \`slackInteractionsTrigger\`
1618
+ - Kind: \`trigger\`
1619
+ - Credentials: required as \`credentials: { name, id }\`; \`name\` must be one of: \`slack_events\`
1620
+ - Feedback mock: required
1621
+
1622
+ Resolve the credential through [integration selection](integrations.md); never ask the user to copy a credential ID.
1623
+
1624
+ ## Props
1625
+
1626
+ - \`method\`: string; required
1627
+ - \`actionId\`: string; optional
1628
+ - \`pauseAfterExecution\`: boolean; optional
1629
+
1630
+ ## Example
1631
+
1632
+ \`\`\`ts
1633
+ new Step({
1634
+ id: 'slack-interactions-trigger',
1635
+ name: 'slackInteractionsTrigger',
1636
+ type: 'slackInteractionsTrigger',
1637
+ credentials: { name: 'slack_events', id: 'credential-id' },
1638
+ params: { /* use the required props and conditional values above */ },
1639
+ });
1640
+ \`\`\`
1641
+
1642
+ Further reading: [Culvii slackInteractionsTrigger node](https://culvii.com/docs/nodes/triggers/slack-interactions-trigger/).
1643
+ `,"references/node-slack-trigger.md":"# slackTrigger\n\n- Type ID: `slackTrigger`\n- Kind: `trigger`\n- Credentials: required as `credentials: { name, id }`; `name` must be one of: `slack_bot`, `slack_user`\n- Feedback mock: required\n\nResolve the credential through [integration selection](integrations.md); never ask the user to copy a credential ID.\n\n## Props\n\n- `pollIntervalMs`: number; required\n- `event`: options; required\n - Values: `messagePosted`\n- `channelId`: string; required\n- `output`: options; optional\n - Values: `simple`, `raw`\n- `filters`: object; optional\n - `userId`: string; optional\n - `textContains`: string; optional\n - `excludeBots`: boolean; optional\n - `subtype`: string; optional\n- `options`: object; optional\n - `maxMessages`: number; optional\n - `includeThreadReplies`: boolean; optional\n- `pauseAfterExecution`: boolean; optional\n\n## Example\n\n```ts\nnew Step({\n id: 'slack-trigger',\n name: 'slackTrigger',\n type: 'slackTrigger',\n credentials: { name: 'slack_bot', id: 'credential-id' },\n params: { /* use the required props and conditional values above */ },\n});\n```\n\nFurther reading: [Culvii slackTrigger node](https://culvii.com/docs/nodes/triggers/slack-trigger/).\n","references/node-slack.md":"# slack\n\n- Type ID: `slack`\n- Kind: `action`\n- Credentials: required as `credentials: { name, id }`; `name` must be one of: `slack_bot`, `slack_user`\n- Feedback mock: required\n\nResolve the credential through [integration selection](integrations.md); never ask the user to copy a credential ID.\n\n## Props\n\n- `resource`: options; required\n - Values: `message`, `reaction`, `user`, `channel`, `file`, `search`, `interaction`\n- `operation`: options; required; when resource=message\n - Values: `send`, `sendByEmail`, `update`, `delete`, `getReplies`, `getPermalink`, `schedule`, `listScheduled`, `cancelScheduled`, `sendEphemeral`\n- `channel`: string; required; when resource=message, operation=send\n- `text`: string; required; when resource=message, operation=send\n- `additionalFields`: object; optional; when resource=message, operation=send\n - `thread_ts`: string; optional\n - `reply_broadcast`: boolean; optional\n - `blocks`: json; optional\n - `mrkdwn`: boolean; optional\n - `link_names`: boolean; optional\n - `unfurl_links`: boolean; optional\n - `unfurl_media`: boolean; optional\n- `email`: string; required; when resource=message, operation=sendByEmail\n- `text`: string; required; when resource=message, operation=sendByEmail\n- `messageOptions`: object; optional; when resource=message, operation=sendByEmail\n - `blocks`: json; optional\n - `mrkdwn`: boolean; optional\n - `link_names`: boolean; optional\n - `unfurl_links`: boolean; optional\n - `unfurl_media`: boolean; optional\n- `channel`: string; required; when resource=message, operation=sendEphemeral\n- `userId`: string; required; when resource=message, operation=sendEphemeral\n- `text`: string; required; when resource=message, operation=sendEphemeral\n- `ephemeralOptions`: object; optional; when resource=message, operation=sendEphemeral\n - `thread_ts`: string; optional\n - `blocks`: json; optional\n - `link_names`: boolean; optional\n- `channel`: string; required; when resource=message, operation=schedule\n- `text`: string; required; when resource=message, operation=schedule\n- `postAt`: dateTime; required; when resource=message, operation=schedule\n- `scheduleOptions`: object; optional; when resource=message, operation=schedule\n - `thread_ts`: string; optional\n - `reply_broadcast`: boolean; optional\n - `blocks`: json; optional\n - `link_names`: boolean; optional\n - `unfurl_links`: boolean; optional\n - `unfurl_media`: boolean; optional\n- `channelId`: string; optional; when resource=message, operation=listScheduled\n- `oldest`: dateTime; optional; when resource=message, operation=listScheduled\n- `latest`: dateTime; optional; when resource=message, operation=listScheduled\n- `limit`: number; optional; when resource=message, operation=listScheduled\n- `cursor`: string; optional; when resource=message, operation=listScheduled\n- `channelId`: string; required; when resource=message, operation=cancelScheduled\n- `scheduledMessageId`: string; required; when resource=message, operation=cancelScheduled\n- `channelId`: string; required; when resource=message, operation=update\n- `messageTs`: string; required; when resource=message, operation=update\n- `text`: string; required; when resource=message, operation=update\n- `blocks`: json; optional; when resource=message, operation=update\n- `channelId`: string; required; when resource=message, operation=delete\n- `messageTs`: string; required; when resource=message, operation=delete\n- `channelId`: string; required; when resource=message, operation=getReplies\n- `threadTs`: string; required; when resource=message, operation=getReplies\n- `limit`: number; optional; when resource=message, operation=getReplies\n- `output`: options; optional; when resource=message, operation=getReplies\n - Values: `simple`, `raw`\n- `cursor`: string; optional; when resource=message, operation=getReplies\n- `channelId`: string; required; when resource=message, operation=getPermalink\n- `messageTs`: string; required; when resource=message, operation=getPermalink\n- `operation`: options; required; when resource=reaction\n - Values: `add`, `remove`\n- `channelId`: string; required; when resource=reaction, operation=add\n- `messageTs`: string; required; when resource=reaction, operation=add\n- `emoji`: string; required; when resource=reaction, operation=add\n- `channelId`: string; required; when resource=reaction, operation=remove\n- `messageTs`: string; required; when resource=reaction, operation=remove\n- `emoji`: string; required; when resource=reaction, operation=remove\n- `operation`: options; required; when resource=user\n - Values: `getByEmail`, `getMany`, `getProfile`, `updateProfile`\n- `email`: string; required; when resource=user, operation=getByEmail\n- `output`: options; optional; when resource=user, operation=getByEmail\n - Values: `simple`, `raw`\n- `limit`: number; optional; when resource=user, operation=getMany\n- `output`: options; optional; when resource=user, operation=getMany\n - Values: `simple`, `raw`\n- `cursor`: string; optional; when resource=user, operation=getMany\n- `user`: string; optional; when resource=user, operation=getProfile\n- `user`: string; optional; when resource=user, operation=updateProfile\n- `clearStatus`: boolean; optional; when resource=user, operation=updateProfile\n- `status_text`: string; optional; when resource=user, operation=updateProfile\n- `status_emoji`: string; optional; when resource=user, operation=updateProfile\n- `status_expiration`: string; optional; when resource=user, operation=updateProfile\n- `first_name`: string; optional; when resource=user, operation=updateProfile\n- `last_name`: string; optional; when resource=user, operation=updateProfile\n- `email`: string; optional; when resource=user, operation=updateProfile\n- `operation`: options; required; when resource=channel\n - Values: `getMany`, `create`, `archive`, `setTopic`, `invite`, `remove`\n- `channelTypes`: options; optional; when resource=channel, operation=getMany\n - Values: `public`, `private`, `publicAndPrivate`, `directMessages`, `groupDirectMessages`, `all`\n- `excludeArchived`: boolean; optional; when resource=channel, operation=getMany\n- `limit`: number; optional; when resource=channel, operation=getMany\n- `output`: options; optional; when resource=channel, operation=getMany\n - Values: `simple`, `raw`\n- `cursor`: string; optional; when resource=channel, operation=getMany\n- `channelName`: string; required; when resource=channel, operation=create\n- `isPrivate`: boolean; optional; when resource=channel, operation=create\n- `channelId`: string; required; when resource=channel, operation=archive\n- `channelId`: string; required; when resource=channel, operation=setTopic\n- `topic`: string; required; when resource=channel, operation=setTopic\n- `channelId`: string; required; when resource=channel, operation=invite\n- `userIds`: string; required; when resource=channel, operation=invite\n- `channelId`: string; required; when resource=channel, operation=remove\n- `userId`: string; required; when resource=channel, operation=remove\n- `operation`: options; required; when resource=file\n - Values: `upload`, `getInfo`, `download`\n- `binaryPropertyName`: string; required; when resource=file, operation=upload\n- `channelId`: string; optional; when resource=file, operation=upload\n- `uploadOptions`: object; optional; when resource=file, operation=upload\n - `filename`: string; optional\n - `title`: string; optional\n - `initial_comment`: string; optional\n - `thread_ts`: string; optional\n - `alt_txt`: string; optional\n- `fileId`: string; required; when resource=file, operation=getInfo\n- `output`: options; optional; when resource=file, operation=getInfo\n - Values: `simple`, `raw`\n- `fileId`: string; required; when resource=file, operation=download\n- `binaryPropertyName`: string; required; when resource=file, operation=download\n- `operation`: options; required; when resource=search\n - Values: `messages`, `files`\n- `query`: string; required; when resource=search\n- `count`: number; optional; when resource=search\n- `page`: number; optional; when resource=search\n- `sort`: options; optional; when resource=search\n - Values: `score`, `timestamp`\n- `sort_dir`: options; optional; when resource=search\n - Values: `asc`, `desc`\n- `operation`: options; required; when resource=interaction\n - Values: `respond`\n- `responseUrl`: string; required; when resource=interaction, operation=respond\n- `text`: string; optional; when resource=interaction, operation=respond\n- `blocks`: json; optional; when resource=interaction, operation=respond\n- `replaceOriginal`: boolean; optional; when resource=interaction, operation=respond\n- `responseType`: options; optional; when resource=interaction, operation=respond\n - Values: `in_channel`, `ephemeral`\n- `pauseAfterExecution`: boolean; optional\n\n## Example\n\n```ts\nnew Step({\n id: 'slack',\n name: 'slack',\n type: 'slack',\n credentials: { name: 'slack_bot', id: 'credential-id' },\n params: { /* use the required props and conditional values above */ },\n});\n```\n\nFurther reading: [Culvii slack node](https://culvii.com/docs/nodes/slack/).\n","references/node-supabase.md":"# supabase\n\n- Type ID: `supabase`\n- Kind: `action`\n- Credentials: required as `credentials: { name, id }`; `name` must be one of: `supabase`\n- Feedback mock: required\n\nResolve the credential through [integration selection](integrations.md); never ask the user to copy a credential ID.\n\n## Props\n\n- `resource`: options; required\n - Values: `database`, `storage`\n- `operation`: options; required; when resource=database\n - Values: `getRows`, `insertRow`, `updateRows`, `upsertRow`, `deleteRows`, `callFunction`\n- `operation`: options; required; when resource=storage\n - Values: `uploadFile`, `downloadFile`, `listFiles`, `deleteFile`\n- `table`: string; required; when resource=database, operation=getRows\n- `columns`: string; optional; when resource=database, operation=getRows\n- `filters`: json; optional; when resource=database, operation=getRows\n- `order`: string; optional; when resource=database, operation=getRows\n- `limit`: number; optional; when resource=database, operation=getRows\n- `table`: string; required; when resource=database, operation=insertRow\n- `rowData`: json; required; when resource=database, operation=insertRow\n- `table`: string; required; when resource=database, operation=updateRows\n- `filters`: json; required; when resource=database, operation=updateRows\n- `rowData`: json; required; when resource=database, operation=updateRows\n- `table`: string; required; when resource=database, operation=upsertRow\n- `rowData`: json; required; when resource=database, operation=upsertRow\n- `onConflict`: string; optional; when resource=database, operation=upsertRow\n- `table`: string; required; when resource=database, operation=deleteRows\n- `filters`: json; required; when resource=database, operation=deleteRows\n- `functionName`: string; required; when resource=database, operation=callFunction\n- `args`: json; optional; when resource=database, operation=callFunction\n- `bucket`: string; required; when resource=storage, operation=uploadFile\n- `filePath`: string; required; when resource=storage, operation=uploadFile\n- `binaryPropertyName`: string; required; when resource=storage, operation=uploadFile\n- `upsert`: boolean; optional; when resource=storage, operation=uploadFile\n- `bucket`: string; required; when resource=storage, operation=downloadFile\n- `filePath`: string; required; when resource=storage, operation=downloadFile\n- `binaryPropertyName`: string; required; when resource=storage, operation=downloadFile\n- `bucket`: string; required; when resource=storage, operation=listFiles\n- `folderPath`: string; optional; when resource=storage, operation=listFiles\n- `limit`: number; optional; when resource=storage, operation=listFiles\n- `bucket`: string; required; when resource=storage, operation=deleteFile\n- `filePath`: string; required; when resource=storage, operation=deleteFile\n- `pauseAfterExecution`: boolean; optional\n\n## Example\n\n```ts\nnew Step({\n id: 'supabase',\n name: 'supabase',\n type: 'supabase',\n credentials: { name: 'supabase', id: 'credential-id' },\n params: { /* use the required props and conditional values above */ },\n});\n```\n\nFurther reading: [Culvii supabase node](https://culvii.com/docs/nodes/supabase/).\n","references/node-twilio.md":"# twilio\n\n- Type ID: `twilio`\n- Kind: `action`\n- Credentials: required as `credentials: { name, id }`; `name` must be one of: `twilio`\n- Feedback mock: required\n\nResolve the credential through [integration selection](integrations.md); never ask the user to copy a credential ID.\n\n## Props\n\n- `resource`: options; optional\n - Values: `call`\n- `operation`: options; optional; when resource=call\n - Values: `makeCall`\n- `fromNumber`: string; required; when resource=call, operation=makeCall\n- `toNumber`: string; required; when resource=call, operation=makeCall\n- `sayList`: array; required; when resource=call, operation=makeCall\n- `noResponseSayList`: array; optional; when resource=call, operation=makeCall\n- `positiveResponseSayList`: array; optional; when resource=call, operation=makeCall\n- `negativeResponseSayList`: array; optional; when resource=call, operation=makeCall\n- `positiveResponse`: number; required; when resource=call, operation=makeCall\n- `speechRate`: string; optional; when resource=call, operation=makeCall\n- `record`: boolean; optional; when resource=call, operation=makeCall\n- `pauseAfterExecution`: boolean; optional\n\n## Example\n\n```ts\nnew Step({\n id: 'twilio',\n name: 'twilio',\n type: 'twilio',\n credentials: { name: 'twilio', id: 'credential-id' },\n params: { /* use the required props and conditional values above */ },\n});\n```\n\nFurther reading: [Culvii twilio node](https://culvii.com/docs/nodes/twilio/).\n","references/node-wait-timer.md":`# waitTimer
1644
+
1645
+ - Type ID: \`waitTimer\`
1646
+ - Kind: \`action\`
1647
+ - Credentials: not required
1648
+ - Feedback mock: not required
1649
+
1650
+ ## Props
1651
+
1652
+ - \`resumeIn\`: number; required
1653
+ - \`pauseAfterExecution\`: boolean; optional
1654
+
1655
+ ## Example
1656
+
1657
+ \`\`\`ts
1658
+ new Step({
1659
+ id: 'wait-timer',
1660
+ name: 'waitTimer',
1661
+ type: 'waitTimer',
1662
+ params: { /* use the required props and conditional values above */ },
1663
+ });
1664
+ \`\`\`
1665
+
1666
+ Further reading: [Culvii waitTimer node](https://culvii.com/docs/nodes/wait-timer/).
1667
+ `,"references/node-webhook-trigger.md":`# webhookTrigger
1668
+
1669
+ - Type ID: \`webhookTrigger\`
1670
+ - Kind: \`trigger\`
1671
+ - Credentials: not required
1672
+ - Feedback mock: not required
1673
+
1674
+ ## Props
1675
+
1676
+ - \`method\`: string; required
1677
+ - \`pauseAfterExecution\`: boolean; optional
1678
+
1679
+ ## Example
1680
+
1681
+ \`\`\`ts
1682
+ new Step({
1683
+ id: 'webhook-trigger',
1684
+ name: 'webhookTrigger',
1685
+ type: 'webhookTrigger',
1686
+ params: { /* use the required props and conditional values above */ },
1687
+ });
1688
+ \`\`\`
1689
+
1690
+ Further reading: [Culvii webhookTrigger node](https://culvii.com/docs/nodes/triggers/webhook-trigger/).
1691
+ `,"references/nodes-index.md":"# Node index\n\nGenerated from `GENERATED_NODE_DEFINITIONS`. Open the exact node page before authoring its params.\n\n- [`argocd`](node-argocd.md) \u2014 action; credentials required; feedback mock required\n- [`clickupDoc`](node-clickup-doc.md) \u2014 action; credentials required; feedback mock required\n- [`clickupTicket`](node-clickup-ticket.md) \u2014 action; credentials required; feedback mock required\n- [`core.agent`](node-core-agent.md) \u2014 action\n- [`core.browserAutomation`](node-core-browser-automation.md) \u2014 action; feedback mock required\n- [`core.code`](node-core-code.md) \u2014 action\n- [`core.http`](node-core-http.md) \u2014 action; feedback mock required\n- [`core.if`](node-core-if.md) \u2014 action\n- [`core.jwt`](node-core-jwt.md) \u2014 action\n- [`core.loop`](node-core-loop.md) \u2014 action\n- [`core.loopBreak`](node-core-loop-break.md) \u2014 action\n- [`core.loopContinue`](node-core-loop-continue.md) \u2014 action\n- [`core.loopOutput`](node-core-loop-output.md) \u2014 action\n- [`core.merge`](node-core-merge.md) \u2014 action\n- [`core.set`](node-core-set.md) \u2014 action\n- [`core.switch`](node-core-switch.md) \u2014 action\n- [`costExplorer`](node-cost-explorer.md) \u2014 action; credentials required; feedback mock required\n- [`cronTrigger`](node-cron-trigger.md) \u2014 trigger\n- [`elasticsearch`](node-elasticsearch.md) \u2014 action; credentials required; feedback mock required\n- [`github`](node-github.md) \u2014 action; credentials required; feedback mock required\n- [`githubPollTrigger`](node-github-poll-trigger.md) \u2014 trigger; credentials required; feedback mock required\n- [`githubWebhookTrigger`](node-github-webhook-trigger.md) \u2014 trigger; credentials required; feedback mock required\n- [`gmail`](node-gmail.md) \u2014 action; credentials required; feedback mock required\n- [`gmailTrigger`](node-gmail-trigger.md) \u2014 trigger; credentials required; feedback mock required\n- [`googleCalendar`](node-google-calendar.md) \u2014 action; credentials required; feedback mock required\n- [`googleDocs`](node-google-docs.md) \u2014 action; credentials required; feedback mock required\n- [`grafanaDashboard`](node-grafana-dashboard.md) \u2014 action; credentials required; feedback mock required\n- [`grafanaDataSource`](node-grafana-data-source.md) \u2014 action; credentials required; feedback mock required\n- [`grafanaQuery`](node-grafana-query.md) \u2014 action; credentials required; feedback mock required\n- [`hibp.listDomains`](node-hibp-list-domains.md) \u2014 action; credentials required; feedback mock required\n- [`hibp.stealerLogs`](node-hibp-stealer-logs.md) \u2014 action; credentials required; feedback mock required\n- [`kubernetes`](node-kubernetes.md) \u2014 action; credentials required; feedback mock required\n- [`manualTrigger`](node-manual-trigger.md) \u2014 trigger\n- [`microsoftOutlook`](node-microsoft-outlook.md) \u2014 action; credentials required; feedback mock required\n- [`microsoftOutlookTrigger`](node-microsoft-outlook-trigger.md) \u2014 trigger; credentials required; feedback mock required\n- [`microsoftSharepoint`](node-microsoft-sharepoint.md) \u2014 action; credentials required; feedback mock required\n- [`onionsearch`](node-onionsearch.md) \u2014 action; credentials required; feedback mock required\n- [`prometheus`](node-prometheus.md) \u2014 action; credentials required; feedback mock required\n- [`s3`](node-s3.md) \u2014 action; credentials required; feedback mock required\n- [`slack`](node-slack.md) \u2014 action; credentials required; feedback mock required\n- [`slackEventsTrigger`](node-slack-events-trigger.md) \u2014 trigger; credentials required; feedback mock required\n- [`slackInteractionsTrigger`](node-slack-interactions-trigger.md) \u2014 trigger; credentials required; feedback mock required\n- [`slackTrigger`](node-slack-trigger.md) \u2014 trigger; credentials required; feedback mock required\n- [`supabase`](node-supabase.md) \u2014 action; credentials required; feedback mock required\n- [`twilio`](node-twilio.md) \u2014 action; credentials required; feedback mock required\n- [`waitTimer`](node-wait-timer.md) \u2014 action\n- [`webhookTrigger`](node-webhook-trigger.md) \u2014 trigger\n","references/runtime-values.md":"# Runtime values\n\nWorkflow expressions and surface bindings are different languages. Do not mix them.\n\n## Workflow expressions\n\nStep params are resolved recursively through nested objects and arrays. A value consisting entirely of an expression preserves its runtime type; interpolation inside other text always returns a string.\n\n```ts\nparams: { values: {\n object: \"={{ $('Prepare').json.payload }}\",\n nested: { ids: [\"={{ $('Prepare').json.id }}\", '={{ $system.execId }}'] },\n message: \"Account {{ $('Prepare').json.account }} is ready\",\n} }\n```\n\nSelectors:\n\n- `$json.field` or `json.field`: current input.\n- `$('Step Name').json.field`: named step, default port and item index.\n- `$('Step Name:port')[2].json.field`: named port and index.\n- `$system.execId`, `$system.workflowId`, `$system.node.id`: execution metadata.\n\nThe `.json` segment after a named step is optional. Use step names, not IDs. Expressions are selectors, not JavaScript.\n\n## Surface bindings\n\nA binding is an object such as `{ path: '/$output/Prepare/main/0/0/account', default: 'Unknown', format: 'text' }`. Its `path` is a JSON Pointer rooted at:\n\n- `$output`: current surfaced step output.\n- `$input`: ancestor step output.\n- `$exec`: execution metadata.\n- `$binary`: safe binary descriptors, not raw bytes.\n- `$form`: wait-surface form state only.\n\nOutput/input/binary paths use `/<root>/<step name>/<port>/<output index>/<item index>/...`. Escape `~` as `~0` and `/` as `~1` in every JSON Pointer segment. A real `null` is not replaced by `default`.\n","references/surface-authoring.md":"# Surface authoring\n\nChoose components from the use case and expected node data, then verify every prop in the generated catalog pages.\n\nFor workflow-attached surfaces, make selection, validation, preview, and approval decisions through [surface configuration and visual approval](surface-feedback.md).\n\n- Objects: `KeyValue`; wrap important groups in `Card` or `Section`.\n- Arrays: `Table` for comparable records, or repeated domain cards composed with layout components.\n- Metrics: `Stat`, `Money`, `Duration`, or `Timestamp`.\n- Files: `FileChip` bound through `$binary`. Binding `file` alone renders a read-only file\n summary \u2014 it is NOT clickable until you also declare `actions.default` as a `navigate` action\n whose `href` points at the same descriptor's `downloadUrl`:\n ```ts\n {\n id: 'file', type: 'FileChip',\n props: { file: { path: '/$binary/Render Report/main/0/0/report' } },\n actions: {\n default: { type: 'navigate', href: { path: '/$binary/Render Report/main/0/0/report/downloadUrl' } },\n },\n }\n ```\n- Human decisions: a wait `Form` with input components and `Button`, or `ApproveRejectBar`.\n- Raw/debug values: `JsonInspector` or `Code`.\n\nA definition uses `schema: 'kit.ui/v1'`, a root component ID, a flat component document list, and an optional wait form. `root` and `children` contain IDs. Never embed a component object directly inside `children`.\n\n```ts\ndefinition: {\n schema: 'kit.ui/v1', root: 'outer', components: [\n { id: 'outer', type: 'Stack', children: ['card'] },\n { id: 'card', type: 'Card', props: { title: 'Result' }, children: ['inner'] },\n { id: 'inner', type: 'Stack', children: ['status'] },\n { id: 'status', type: 'StatusPill', props: { status: { path: '/$output/Run/main/0/0/status' } } },\n ],\n}\n```\n\nRecursive Stack/Card/Section graphs are valid up to platform depth 12. Recursive prop schemas are also supported. Component IDs must be unique, reachable from the root, and referenced once according to each component's child mode. The complete catalog is split into [layout](surface-layout.md), [display](surface-display.md), and [input/actions](surface-input-actions.md).\n","references/surface-display.md":`# Surface display components
1692
+
1693
+ ## Avatar
1694
+
1695
+ Initials derived from a name or email.
1696
+
1697
+ - Children: \`none\`
1698
+
1699
+ Props:
1700
+
1701
+ - \`email\` (string; bindable) \u2014 Fallback source for initials.
1702
+
1703
+ - \`label\` (string; bindable) \u2014 Text beside the avatar.
1704
+
1705
+ - \`name\` (string; bindable) \u2014 Name used for initials.
1706
+
1707
+ - \`size\` (string; literal; values: "sm" | "md" | "lg") \u2014 Avatar size.
1708
+
1709
+ ## Badge
1710
+
1711
+ Small label with an explicit tone.
1712
+
1713
+ - Children: \`none\`
1714
+
1715
+ Props:
1716
+
1717
+ - \`format\` (string; literal; values: "text" | "number" | "compact" | "percent" | "currency" | "bytes" | "duration" | "date" | "datetime" | "time" | "list" | "json" | "boolean") \u2014 Display format.
1718
+
1719
+ - \`maxChars\` (number; literal; integer; min 1) \u2014 Maximum displayed characters.
1720
+
1721
+ - \`text\` (any; bindable) \u2014 Badge label.
1722
+
1723
+ - \`tone\` (string; literal; values: "neutral" | "info" | "success" | "warning" | "error") \u2014 Badge tone.
1724
+
1725
+ - \`transform\` (string; literal; values: "capitalize" | "title" | "upper" | "lower" | "humanize") \u2014 Text transform.
1726
+
1727
+ ## Code
1728
+
1729
+ Monospace text block.
1730
+
1731
+ - Children: \`none\`
1732
+ - Limits: \`{"characters":20000}\`
1733
+
1734
+ Props:
1735
+
1736
+ - \`label\` (string; bindable) \u2014 Block label.
1737
+
1738
+ - \`text\` (any; bindable) \u2014 Code or payload.
1739
+
1740
+ - \`wrap\` (boolean; literal) \u2014 Wrap long lines.
1741
+
1742
+ ## DiffView
1743
+
1744
+ Structural JSON or line-by-line text comparison.
1745
+
1746
+ - Children: \`none\`
1747
+ - Limits: \`{"depth":6,"children":100,"lines":2000,"characters":200000}\`
1748
+
1749
+ Props:
1750
+
1751
+ - \`after\` (any; bindable) \u2014 Proposed value.
1752
+
1753
+ - \`before\` (any; bindable) \u2014 Prior value.
1754
+
1755
+ - \`mode\` (string; literal; values: "json" | "text") \u2014 Comparison mode.
1756
+
1757
+ ## Duration
1758
+
1759
+ A duration in milliseconds or between two instants.
1760
+
1761
+ - Children: \`none\`
1762
+
1763
+ Props:
1764
+
1765
+ - \`end\` (union; bindable) \u2014 End instant.
1766
+ - Variant 1: string; literal
1767
+ - Variant 2: number; literal
1768
+
1769
+ - \`size\` (string; literal; values: "xs" | "sm" | "md" | "lg") \u2014 Displayed value size.
1770
+
1771
+ - \`start\` (union; bindable) \u2014 Start instant.
1772
+ - Variant 1: string; literal
1773
+ - Variant 2: number; literal
1774
+
1775
+ - \`tone\` (string; literal; values: "default" | "muted" | "success" | "warning" | "error" | "info") \u2014 Displayed value tone.
1776
+
1777
+ - \`unit\` (string; literal; values: "seconds" | "ms") \u2014 Numeric instant unit.
1778
+
1779
+ - \`value\` (number; bindable; min 0) \u2014 Duration in milliseconds.
1780
+
1781
+ ## EmailMessageCard
1782
+
1783
+ Inbox list or opened email message.
1784
+
1785
+ - Children: \`none\`
1786
+ - Limits: \`{"renderedMessages":50}\`
1787
+
1788
+ Props:
1789
+
1790
+ - \`body\` (string; bindable) \u2014 Message body.
1791
+
1792
+ - \`cc\` (string; bindable) \u2014 Carbon-copy recipients.
1793
+
1794
+ - \`date\` (union; bindable) \u2014 Sent or received instant.
1795
+ - Variant 1: string; literal
1796
+ - Variant 2: number; literal
1797
+
1798
+ - \`emptyText\` (string; bindable) \u2014 Empty-state text.
1799
+
1800
+ - \`fields\` (object; literal) \u2014 Field-name mapping.
1801
+
1802
+ - \`from\` (string; bindable) \u2014 Sender.
1803
+
1804
+ - \`labels\` (array; bindable) \u2014 Message labels.
1805
+ - Items: string; literal
1806
+
1807
+ - \`message\` (object; bindable) \u2014 Single message.
1808
+
1809
+ - \`messages\` (array; bindable) \u2014 Message list.
1810
+ - Items: object; literal
1811
+
1812
+ - \`snippet\` (string; bindable) \u2014 Preview text.
1813
+
1814
+ - \`subject\` (string; bindable) \u2014 Subject.
1815
+
1816
+ - \`to\` (string; bindable) \u2014 Recipients.
1817
+
1818
+ - \`unread\` (boolean; bindable) \u2014 Unread state.
1819
+
1820
+ ## FileChip
1821
+
1822
+ Metadata and download affordance for a produced file. Binding \`file\` alone does not make the chip clickable \u2014 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.
1823
+
1824
+ - Children: \`none\`
1825
+ - Interaction: \`single-action\`
1826
+
1827
+ Props:
1828
+
1829
+ - \`file\` (object; bindable) \u2014 Binary descriptor.
1830
+ - \`downloadUrl\` (string; literal) \u2014 Protected download URL.
1831
+ - \`fileName\` (string; literal) \u2014 Original file name.
1832
+ - \`key\` (string; literal; required) \u2014 Binary property key.
1833
+ - \`mimeType\` (string; literal) \u2014 MIME type.
1834
+ - \`size\` (number; literal; min 0) \u2014 File size in bytes.
1835
+
1836
+ - \`label\` (string; bindable) \u2014 Displayed file name.
1837
+
1838
+ ## Heading
1839
+
1840
+ A section title.
1841
+
1842
+ - Children: \`none\`
1843
+
1844
+ Props:
1845
+
1846
+ - \`level\` (number; literal; values: 1 | 2 | 3; integer) \u2014 Heading level.
1847
+
1848
+ - \`maxChars\` (number; literal; integer; min 1) \u2014 Maximum displayed characters.
1849
+
1850
+ - \`text\` (any; bindable) \u2014 Heading text.
1851
+
1852
+ - \`transform\` (string; literal; values: "capitalize" | "title" | "upper" | "lower" | "humanize") \u2014 Text transform.
1853
+
1854
+ ## HtmlRenderer
1855
+
1856
+ Sandboxed HTML fragment renderer.
1857
+
1858
+ - Children: \`none\`
1859
+ - Limits: \`{"characters":20000}\`
1860
+
1861
+ Props:
1862
+
1863
+ - \`allowRemoteImages\` (boolean; literal) \u2014 Allow remote HTTPS images.
1864
+
1865
+ - \`emptyText\` (string; bindable) \u2014 Empty-state text.
1866
+
1867
+ - \`height\` (number; literal; min 80; max 1200) \u2014 Frame height in pixels.
1868
+
1869
+ - \`html\` (string; bindable) \u2014 HTML markup.
1870
+
1871
+ - \`label\` (string; bindable) \u2014 Frame label.
1872
+
1873
+ ## JsonInspector
1874
+
1875
+ Collapsible JSON tree and default fallback renderer.
1876
+
1877
+ - Children: \`none\`
1878
+
1879
+ Props:
1880
+
1881
+ - \`collapsed\` (boolean; literal) \u2014 Start collapsed.
1882
+
1883
+ - \`value\` (any; bindable) \u2014 Any JSON value.
1884
+
1885
+ ## KeyValue
1886
+
1887
+ Declared label/value entries or a bound object.
1888
+
1889
+ - Children: \`none\`
1890
+
1891
+ Props:
1892
+
1893
+ - \`columns\` (number; literal; values: 1 | 2; integer) \u2014 Pairs per row.
1894
+
1895
+ - \`dense\` (boolean; literal) \u2014 Use tighter row spacing.
1896
+
1897
+ - \`emptyText\` (string; bindable) \u2014 Empty-state text.
1898
+
1899
+ - \`entries\` (array; bindable) \u2014 Declared label/value entries.
1900
+ - Items: object; literal
1901
+ - \`currency\` (string; literal) \u2014 ISO 4217 currency code.
1902
+ - \`decimals\` (number; literal; integer; min 0; max 20) \u2014 Fixed decimal places.
1903
+ - \`format\` (string; literal; values: "text" | "number" | "compact" | "percent" | "currency" | "bytes" | "duration" | "date" | "datetime" | "time" | "list" | "json" | "boolean") \u2014 Display format.
1904
+ - \`label\` (string; bindable) \u2014 Row label.
1905
+ - \`map\` (object; literal) \u2014 Map known displayed values to labels.
1906
+ - \`maxChars\` (number; literal; integer; min 1) \u2014 Maximum displayed characters.
1907
+ - \`mono\` (boolean; literal) \u2014 Render the value in monospace.
1908
+ - \`tone\` (string; literal; values: "default" | "muted" | "success" | "warning" | "error" | "info") \u2014 Displayed value tone.
1909
+ - \`transform\` (string; literal; values: "capitalize" | "title" | "upper" | "lower" | "humanize") \u2014 Text transform.
1910
+ - \`type\` (string; literal; values: "status") \u2014 Set to status to render a status pill.
1911
+ - \`unit\` (string; literal; values: "seconds" | "ms") \u2014 Numeric timestamp unit.
1912
+ - \`value\` (any; bindable) \u2014 Row value.
1913
+
1914
+ - \`hideEmpty\` (boolean; literal) \u2014 Hide missing values.
1915
+
1916
+ - \`humanizeKeys\` (boolean; literal) \u2014 Humanize object keys.
1917
+
1918
+ - \`mono\` (boolean; literal) \u2014 Render shorthand values in monospace.
1919
+
1920
+ - \`value\` (object; bindable) \u2014 Object whose keys become labels.
1921
+
1922
+ ## Money
1923
+
1924
+ A formatted currency amount.
1925
+
1926
+ - Children: \`none\`
1927
+
1928
+ Props:
1929
+
1930
+ - \`currency\` (string; bindable) \u2014 ISO 4217 currency code.
1931
+
1932
+ - \`decimals\` (number; literal; integer; min 0; max 20) \u2014 Fixed decimal places.
1933
+
1934
+ - \`signed\` (boolean; literal) \u2014 Colour positive and negative values.
1935
+
1936
+ - \`size\` (string; literal; values: "xs" | "sm" | "md" | "lg") \u2014 Displayed value size.
1937
+
1938
+ - \`tone\` (string; literal; values: "default" | "muted" | "success" | "warning" | "error" | "info") \u2014 Displayed value tone.
1939
+
1940
+ - \`value\` (number; bindable) \u2014 Currency amount.
1941
+
1942
+ ## Stat
1943
+
1944
+ One prominent value with a label and caption.
1945
+
1946
+ - Children: \`none\`
1947
+
1948
+ Props:
1949
+
1950
+ - \`caption\` (any; bindable) \u2014 Caption below the value.
1951
+
1952
+ - \`captionTransform\` (string; literal; values: "capitalize" | "title" | "upper" | "lower" | "humanize") \u2014 Caption transform.
1953
+
1954
+ - \`currency\` (string; literal) \u2014 ISO 4217 currency code.
1955
+
1956
+ - \`decimals\` (number; literal; integer; min 0; max 20) \u2014 Fixed decimal places.
1957
+
1958
+ - \`format\` (string; literal; values: "text" | "number" | "compact" | "percent" | "currency" | "bytes" | "duration" | "date" | "datetime" | "time" | "list" | "json" | "boolean") \u2014 Display format.
1959
+
1960
+ - \`label\` (string; bindable) \u2014 Label above the value.
1961
+
1962
+ - \`maxChars\` (number; literal; integer; min 1) \u2014 Maximum displayed characters.
1963
+
1964
+ - \`mono\` (boolean; literal) \u2014 Render the value in monospace.
1965
+
1966
+ - \`tone\` (string; literal; values: "default" | "muted" | "success" | "warning" | "error" | "info") \u2014 Displayed value tone.
1967
+
1968
+ - \`transform\` (string; literal; values: "capitalize" | "title" | "upper" | "lower" | "humanize") \u2014 Text transform.
1969
+
1970
+ - \`unit\` (string; literal; values: "seconds" | "ms") \u2014 Numeric timestamp unit.
1971
+
1972
+ - \`value\` (any; bindable) \u2014 Displayed value.
1973
+
1974
+ ## StatusPill
1975
+
1976
+ Semantic status pill for statuses, booleans, and HTTP codes.
1977
+
1978
+ - Children: \`none\`
1979
+
1980
+ Props:
1981
+
1982
+ - \`format\` (string; literal; values: "text" | "number" | "compact" | "percent" | "currency" | "bytes" | "duration" | "date" | "datetime" | "time" | "list" | "json" | "boolean") \u2014 Display format.
1983
+
1984
+ - \`label\` (any; bindable) \u2014 Displayed label.
1985
+
1986
+ - \`maxChars\` (number; literal; integer; min 1) \u2014 Maximum displayed characters.
1987
+
1988
+ - \`status\` (any; bindable) \u2014 Status value.
1989
+
1990
+ - \`tone\` (string; literal; values: "neutral" | "info" | "success" | "warning" | "error") \u2014 Forced tone.
1991
+
1992
+ - \`transform\` (string; literal; values: "capitalize" | "title" | "upper" | "lower" | "humanize") \u2014 Text transform.
1993
+
1994
+ ## Table
1995
+
1996
+ Tabular view of an array.
1997
+
1998
+ - Children: \`none\`
1999
+ - Limits: \`{"renderedRows":100}\`
2000
+
2001
+ Props:
2002
+
2003
+ - \`columns\` (array; literal) \u2014 Literal field names or column definitions.
2004
+ - Items: union; literal
2005
+ - Variant 1: string; literal
2006
+ - Variant 2: object; literal
2007
+ - \`align\` (string; literal; values: "left" | "center" | "right") \u2014 Cell alignment.
2008
+ - \`currency\` (string; literal) \u2014 ISO 4217 currency code.
2009
+ - \`decimals\` (number; literal; integer; min 0; max 20) \u2014 Fixed decimal places.
2010
+ - \`format\` (string; literal; values: "text" | "number" | "compact" | "percent" | "currency" | "bytes" | "duration" | "date" | "datetime" | "time" | "list" | "json" | "boolean") \u2014 Display format.
2011
+ - \`header\` (string; literal) \u2014 Column heading.
2012
+ - \`key\` (string; literal; required) \u2014 Field name inside each row.
2013
+ - \`map\` (object; literal) \u2014 Map known displayed values to labels.
2014
+ - \`maxChars\` (number; literal; integer; min 1) \u2014 Maximum displayed characters.
2015
+ - \`mono\` (boolean; literal) \u2014 Render cells in monospace.
2016
+ - \`tone\` (string; literal; values: "default" | "muted" | "success" | "warning" | "error" | "info") \u2014 Displayed value tone.
2017
+ - \`transform\` (string; literal; values: "capitalize" | "title" | "upper" | "lower" | "humanize") \u2014 Text transform.
2018
+ - \`type\` (string; literal; values: "status") \u2014 Set to status to render status pills.
2019
+ - \`unit\` (string; literal; values: "seconds" | "ms") \u2014 Numeric timestamp unit.
2020
+
2021
+ - \`dense\` (boolean; literal) \u2014 Use tighter rows.
2022
+
2023
+ - \`emptyText\` (string; bindable) \u2014 Empty-state text.
2024
+
2025
+ - \`items\` (array; bindable) \u2014 Rows to render.
2026
+ - Items: any; literal
2027
+
2028
+ ## Text
2029
+
2030
+ Body text with shared formatting.
2031
+
2032
+ - Children: \`none\`
2033
+
2034
+ Props:
2035
+
2036
+ - \`currency\` (string; literal) \u2014 ISO 4217 currency code.
2037
+
2038
+ - \`decimals\` (number; literal; integer; min 0; max 20) \u2014 Fixed decimal places.
2039
+
2040
+ - \`format\` (string; literal; values: "text" | "number" | "compact" | "percent" | "currency" | "bytes" | "duration" | "date" | "datetime" | "time" | "list" | "json" | "boolean") \u2014 Display format.
2041
+
2042
+ - \`maxChars\` (number; literal; integer; min 1) \u2014 Maximum displayed characters.
2043
+
2044
+ - \`mono\` (boolean; literal) \u2014 Render in monospace.
2045
+
2046
+ - \`muted\` (boolean; literal) \u2014 Shorthand for the muted tone.
2047
+
2048
+ - \`size\` (string; literal; values: "xs" | "sm" | "md" | "lg") \u2014 Displayed value size.
2049
+
2050
+ - \`text\` (any; bindable) \u2014 Value to display.
2051
+
2052
+ - \`tone\` (string; literal; values: "default" | "muted" | "success" | "warning" | "error" | "info") \u2014 Displayed value tone.
2053
+
2054
+ - \`transform\` (string; literal; values: "capitalize" | "title" | "upper" | "lower" | "humanize") \u2014 Text transform.
2055
+
2056
+ - \`unit\` (string; literal; values: "seconds" | "ms") \u2014 Numeric timestamp unit.
2057
+
2058
+ - \`weight\` (string; literal; values: "normal" | "medium" | "semibold") \u2014 Font weight.
2059
+
2060
+ ## Timestamp
2061
+
2062
+ ISO or epoch timestamp.
2063
+
2064
+ - Children: \`none\`
2065
+
2066
+ Props:
2067
+
2068
+ - \`format\` (string; literal; values: "datetime" | "date" | "time" | "smart") \u2014 Timestamp format.
2069
+
2070
+ - \`relative\` (boolean; literal) \u2014 Display relative time.
2071
+
2072
+ - \`size\` (string; literal; values: "xs" | "sm" | "md" | "lg") \u2014 Displayed value size.
2073
+
2074
+ - \`tone\` (string; literal; values: "default" | "muted" | "success" | "warning" | "error" | "info") \u2014 Displayed value tone.
2075
+
2076
+ - \`unit\` (string; literal; values: "seconds" | "ms") \u2014 Numeric timestamp unit.
2077
+
2078
+ - \`value\` (union; bindable) \u2014 ISO string or epoch number.
2079
+ - Variant 1: string; literal
2080
+ - Variant 2: number; literal
2081
+ `,"references/surface-feedback.md":`# Surface configuration and visual approval
2082
+
2083
+ Use this flow for every newly authored workflow. The agent authors surfaces; the user reviews the exact Culvii renderer before accepting them.
2084
+
2085
+ ## Choose before validation
2086
+
2087
+ 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.
2088
+ 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.
2089
+ 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.
2090
+ 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.
2091
+
2092
+ 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.
2093
+
2094
+ ## Validate, execute, and review
2095
+
2096
+ 1. Start one tracked \`culvii dev\` process after the workflow and all candidate surfaces exist. Fix every validation and sync error before previewing.
2097
+ 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.
2098
+ 3. For every custom surface in that execution, create a review manifest. It includes only the configured nodes, never the full run:
2099
+
2100
+ \`\`\`json
2101
+ {
2102
+ "items": [
2103
+ { "executionId": "exc_\u2026", "nodeId": "research-agent" },
2104
+ { "executionId": "exc_\u2026", "nodeId": "report-output" }
2105
+ ]
2106
+ }
2107
+ \`\`\`
2108
+
2109
+ 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.
2110
+ 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.
2111
+ 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.
2112
+ 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.
2113
+
2114
+ 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.
2115
+
2116
+ ## Finish
2117
+
2118
+ 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.
2119
+ `,"references/surface-input-actions.md":`# Surface input and action components
2120
+
2121
+ ## ApproveRejectBar
2122
+
2123
+ Named approve/reject decision actions.
2124
+
2125
+ - Children: \`none\`
2126
+ - Interaction: \`multi-action\`
2127
+ - Actions: \`{"allowed":["approve","reject"]}\`
2128
+
2129
+ Props:
2130
+
2131
+ - \`approveLabel\` (string; bindable) \u2014 Approve button label.
2132
+
2133
+ - \`canDecide\` (boolean; bindable) \u2014 Whether the viewer may decide.
2134
+
2135
+ - \`comment\` (string; bindable) \u2014 Current comment value.
2136
+
2137
+ - \`commentRequired\` (boolean; bindable) \u2014 Require a comment before rejection.
2138
+
2139
+ - \`decidedBy\` (string; bindable) \u2014 Recorded decider.
2140
+
2141
+ - \`decision\` (string; bindable) \u2014 Recorded decision.
2142
+
2143
+ - \`disabledReason\` (string; bindable) \u2014 Reason actions are disabled.
2144
+
2145
+ - \`rejectLabel\` (string; bindable) \u2014 Reject button label.
2146
+
2147
+ ## Button
2148
+
2149
+ Single-action button.
2150
+
2151
+ - Children: \`none\`
2152
+ - Interaction: \`single-action\`
2153
+
2154
+ Props:
2155
+
2156
+ - \`disabled\` (boolean; bindable) \u2014 Disabled state.
2157
+
2158
+ - \`label\` (string; bindable) \u2014 Button label.
2159
+
2160
+ - \`variant\` (string; literal; values: "primary" | "default" | "danger") \u2014 Button variant.
2161
+
2162
+ ## Checkbox
2163
+
2164
+ Boolean form input.
2165
+
2166
+ - Children: \`none\`
2167
+ - Interaction: \`input\`
2168
+
2169
+ Props:
2170
+
2171
+ - \`description\` (string; bindable) \u2014 Helper text.
2172
+
2173
+ - \`disabled\` (boolean; bindable) \u2014 Disabled state.
2174
+
2175
+ - \`label\` (string; bindable) \u2014 Text beside the checkbox.
2176
+
2177
+ ## Select
2178
+
2179
+ Single-choice form input.
2180
+
2181
+ - Children: \`none\`
2182
+ - Interaction: \`input\`
2183
+
2184
+ Props:
2185
+
2186
+ - \`disabled\` (boolean; bindable) \u2014 Disabled state.
2187
+
2188
+ - \`label\` (string; bindable) \u2014 Field label.
2189
+
2190
+ - \`options\` (array; bindable) \u2014 Literal or bound options.
2191
+ - Items: union; literal
2192
+ - Variant 1: string; literal
2193
+ - Variant 2: number; literal
2194
+ - Variant 3: object; literal
2195
+ - \`label\` (string; literal) \u2014 Displayed option label.
2196
+ - \`value\` (union; literal; required) \u2014 Submitted option value.
2197
+ - Variant 1: string; literal
2198
+ - Variant 2: number; literal
2199
+
2200
+ - \`placeholder\` (string; bindable) \u2014 Placeholder.
2201
+
2202
+ ## TextArea
2203
+
2204
+ Multi-line form input.
2205
+
2206
+ - Children: \`none\`
2207
+ - Interaction: \`input\`
2208
+
2209
+ Props:
2210
+
2211
+ - \`disabled\` (boolean; bindable) \u2014 Disabled state.
2212
+
2213
+ - \`label\` (string; bindable) \u2014 Field label.
2214
+
2215
+ - \`placeholder\` (string; bindable) \u2014 Placeholder.
2216
+
2217
+ - \`rows\` (number; literal; integer; min 1) \u2014 Visible rows.
2218
+
2219
+ ## TextField
2220
+
2221
+ Single-line form input.
2222
+
2223
+ - Children: \`none\`
2224
+ - Interaction: \`input\`
2225
+
2226
+ Props:
2227
+
2228
+ - \`disabled\` (boolean; bindable) \u2014 Disabled state.
2229
+
2230
+ - \`label\` (string; bindable) \u2014 Field label.
2231
+
2232
+ - \`placeholder\` (string; bindable) \u2014 Placeholder.
2233
+
2234
+ - \`type\` (string; literal; values: "text" | "number" | "email" | "url") \u2014 HTML input type.
2235
+
2236
+ ## Reserved and rejected component types
2237
+
2238
+ - \`Accordion\` \u2014 unsupported and rejected by validation.
2239
+ - \`AgentRunPanel\` \u2014 unsupported and rejected by validation.
2240
+ - \`CalendarEventCard\` \u2014 unsupported and rejected by validation.
2241
+ - \`DatePicker\` \u2014 unsupported and rejected by validation.
2242
+ - \`ErrorPanel\` \u2014 unsupported and rejected by validation.
2243
+ - \`Icon\` \u2014 unsupported and rejected by validation.
2244
+ - \`Image\` \u2014 unsupported and rejected by validation.
2245
+ - \`List\` \u2014 unsupported and rejected by validation.
2246
+ - \`Markdown\` \u2014 unsupported and rejected by validation.
2247
+ - \`ProgressBar\` \u2014 unsupported and rejected by validation.
2248
+ - \`RadioGroup\` \u2014 unsupported and rejected by validation.
2249
+ - \`SlackMessageCard\` \u2014 unsupported and rejected by validation.
2250
+ - \`SlackThread\` \u2014 unsupported and rejected by validation.
2251
+ - \`Spacer\` \u2014 unsupported and rejected by validation.
2252
+ - \`Spinner\` \u2014 unsupported and rejected by validation.
2253
+ - \`Tabs\` \u2014 unsupported and rejected by validation.
2254
+ - \`Timeline\` \u2014 unsupported and rejected by validation.
2255
+ - \`ToolCallCard\` \u2014 unsupported and rejected by validation.
2256
+ - \`Tree\` \u2014 unsupported and rejected by validation.
2257
+
2258
+ ## Slot policies
2259
+
2260
+ - Output: actions navigate; forms rejected.
2261
+ - Wait: actions navigate, node.resume, node.stop; forms allowed.
2262
+ `,"references/surface-layout.md":`# Surface layout components
2263
+
2264
+ ## Card
2265
+
2266
+ Bordered container with an optional header and status.
2267
+
2268
+ - Children: \`single\`
2269
+
2270
+ Props:
2271
+
2272
+ - \`dense\` (boolean; literal) \u2014 Use tighter body padding.
2273
+
2274
+ - \`map\` (object; literal) \u2014 Map known displayed values to labels.
2275
+
2276
+ - \`status\` (any; bindable) \u2014 Status value used to derive the header pill.
2277
+
2278
+ - \`statusLabel\` (any; bindable) \u2014 Header status label.
2279
+
2280
+ - \`statusTone\` (string; literal; values: "neutral" | "info" | "success" | "warning" | "error") \u2014 Forced status tone.
2281
+
2282
+ - \`subtitle\` (string; bindable) \u2014 Header subtitle.
2283
+
2284
+ - \`title\` (string; bindable) \u2014 Header title.
2285
+
2286
+ - \`transform\` (string; literal; values: "capitalize" | "title" | "upper" | "lower" | "humanize") \u2014 Status label transform.
2287
+
2288
+ ## Divider
2289
+
2290
+ Horizontal rule between content blocks.
2291
+
2292
+ - Children: \`none\`
2293
+
2294
+ Props:
2295
+
2296
+ _No props._
2297
+
2298
+ ## Form
2299
+
2300
+ Groups wait-surface inputs and actions.
2301
+
2302
+ - Children: \`list\`
2303
+
2304
+ Props:
2305
+
2306
+ - \`title\` (string; bindable) \u2014 Form heading.
2307
+
2308
+ ## Grid
2309
+
2310
+ Responsive equal-width columns.
2311
+
2312
+ - Children: \`list\`
2313
+
2314
+ Props:
2315
+
2316
+ - \`columns\` (number; literal; values: 1 | 2 | 3 | 4; integer) \u2014 Column count.
2317
+
2318
+ - \`gap\` (string; literal; values: "xs" | "sm" | "md" | "lg") \u2014 Spacing between children.
2319
+
2320
+ ## Row
2321
+
2322
+ Wrapping horizontal group.
2323
+
2324
+ - Children: \`list\`
2325
+
2326
+ Props:
2327
+
2328
+ - \`align\` (string; literal; values: "start" | "center" | "end" | "baseline") \u2014 Cross-axis alignment.
2329
+
2330
+ - \`gap\` (string; literal; values: "xs" | "sm" | "md" | "lg") \u2014 Spacing between children.
2331
+
2332
+ - \`justify\` (string; literal; values: "between") \u2014 Set to between to push children apart.
2333
+
2334
+ ## Section
2335
+
2336
+ Labelled group with one child.
2337
+
2338
+ - Children: \`single\`
2339
+
2340
+ Props:
2341
+
2342
+ - \`collapsible\` (boolean; literal) \u2014 Allow the section to be folded.
2343
+
2344
+ - \`defaultOpen\` (boolean; literal) \u2014 Initial collapsible state.
2345
+
2346
+ - \`description\` (string; bindable) \u2014 Section description.
2347
+
2348
+ - \`title\` (string; bindable) \u2014 Section label.
2349
+
2350
+ ## Stack
2351
+
2352
+ Vertical stack and the default surface container.
2353
+
2354
+ - Children: \`list\`
2355
+
2356
+ Props:
2357
+
2358
+ - \`gap\` (string; literal; values: "xs" | "sm" | "md" | "lg") \u2014 Spacing between children.
2359
+ `,"references/validation.md":"# Validation and common failures\n\n- `agentReferenceKey` must resolve to a collected agent ID; `agentId` is invalid.\n- Workflow-tool `workflowId` values and local custom surface keys must resolve.\n- Workflow-tool targets follow the trigger, agent-node, and reference-depth rules in [workflows.md](workflows.md).\n- Credentialed nodes require `{ name, id }`; model configs require `credentialId`. Never author raw secrets.\n- A surface's slot must match `ui.output` or `ui.wait`.\n- Surface component IDs must be unique, reachable, and connected by ID references. Maximum graph depth is 12 and maximum component count is 300.\n- Use only active catalog types. Reserved types are rejected.\n- Bindings accept `$output`, `$input`, `$exec`, `$binary`, and wait-only `$form`; JSON Pointer syntax and step names must be exact.\n- Output surfaces allow navigation actions. Wait surfaces additionally allow node resume/stop actions and form input.\n- A versioned custom surface reference may point to a published version. An unversioned local custom surface must be present in the same collected graph.\n\nWhen 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.\n\nAfter validation succeeds, use the [workflow feedback cycle](feedback-cycle.md) for requested workflows. Feedback runtime overrides never replace platform validation.\n\nFurther reading: [Testing](https://culvii.com/docs/sdk-reference/guides/testing/).\n","references/workflows.md":"# Workflows\n\nCreate steps with `new Step(config)`, connect them with `connectTo`, then pass every step to `new Workflow({ id, name, active?, steps })`. Step IDs and names must be unique within a workflow. Steps support `disabled`, `credentials`, `onError`, and `ui`; workflows and steps do not have a `description` field.\n\n```ts\nconst trigger = new Step({ id: 'trigger', name: 'Manual Trigger', type: 'manualTrigger' });\nconst set = new Step({\n id: 'prepare', name: 'Prepare', type: 'core.set',\n params: { values: { request: 'Review this account' } },\n onError: 'stopWorkflow',\n});\ntrigger.connectTo(set);\nnew Workflow({ id: 'review-workflow', name: 'Review Workflow', steps: [trigger, set] });\n```\n\n`connectTo(next, { fromPort?, fromOutputIndex?, toInputIndex? })` defaults to port `main` and indexes `0`. For an `core.if`, output index `0` is true and `1` is false. List all connected steps in the workflow even when the graph branches.\n\nCredentialed integration nodes require `credentials: { name, id }` on the Step. `pauseAfterExecution: true` pauses after any node; assigning a wait surface also enables it.\n\nWorkflow-tool target rules:\n\n- Exactly one `manualTrigger`, unless `triggerNodeName` selects among multiple manual triggers.\n- No `core.agent` step in a workflow invoked as a tool.\n- Trigger workflows such as cron, webhook, and polling triggers are not workflow-tool targets.\n- Every `workflowId` and `agentReferenceKey` must resolve in the collected resource graph.\n- Maximum resource reference depth is 3. Valid examples are workflow \u2192 agent \u2192 workflow and agent \u2192 workflow \u2192 agent.\n\nSee [nodes-index.md](nodes-index.md) before choosing a node and open that node's page for exact props.\n\nFurther reading: [Workflow API](https://culvii.com/docs/sdk-reference/api-reference/workflow-api/) and [Executing workflows](https://culvii.com/docs/sdk-reference/workflows/execution/).\n","SKILL.md":`---
2360
+ name: culvii
2361
+ description: Use this skill when writing and validating Culvii agents, workflows, nodes, or dynamic UI surfaces with @culvii/kit and culvii dev, including recursive runtime expressions, surface bindings, and cross-resource references.
2362
+ ---
2363
+
2364
+ # Culvii authoring
2365
+
2366
+ Build Culvii resources in TypeScript using public @culvii/kit APIs. This file routes you to the minimum detailed references needed for the task.
2367
+
2368
+ ## Start here
2369
+
2370
+ 1. Inspect the project's package.json, culvii.yaml, and existing *.culvii.ts files before generating code.
2371
+ 2. Read [authoring files](references/authoring-files.md), then read only the task-specific references below.
2372
+ 3. Never invent node types, component types, props, flags, or APIs. Open the generated reference first.
2373
+ 4. Never write raw credentials. Resolve Culvii credential IDs through [integration selection](references/integrations.md); never ask the user to copy or paste an ID.
2374
+ 5. Author the requested resources as drafts, then follow the authenticated validation loop in [the CLI development guide](references/cli-guide.md). Never guess the tenant, never run culvii deploy, and never leave culvii dev running.
2375
+
2376
+ For every newly authored workflow, offer runtime widget configuration before starting \`culvii dev\`. If the user opts in, follow [surface configuration and visual approval](references/surface-feedback.md): choose custom, existing, or default per node, and attach every custom candidate before the first validation. Do not finish while a custom surface is unvalidated or awaiting visual approval.
2377
+
2378
+ ## Missing required inputs
2379
+
2380
+ - Gather every known blocking input before authoring placeholders. Ask them together in one interactive prompt, or the fewest batches allowed by the agent.
2381
+ - Use the agent's native in-run question tool, such as Codex request_user_input or Claude AskUserQuestion, so the task pauses and resumes in the same run. Never return a final answer merely to request missing values.
2382
+ - Use selectable options only when every option is a complete usable value or a decision that needs no dependent value. Options must come from the user's request, existing project files, or real command output; never invent IDs.
2383
+ - An answer such as "DM by user ID" is incomplete when the actual user ID is still missing. If a semantic decision and an ID are both required, collect both in the same in-run prompt or immediately ask for the ID before continuing.
2384
+ - For credentials, follow [integration selection](references/integrations.md). For an unknown channel, user, tenant, or resource ID, use a free-text input when the agent supports one. If the question UI only offers radio options plus custom/Other, explicitly ask the user to select custom/Other and paste the literal ID; do not offer a semantic radio answer that can be mistaken for the ID.
2385
+ - After the user responds, verify that every required opaque value contains the literal usable ID. Continue authoring and validation automatically only when all required values are present. If no interactive question tool exists, leave the task explicitly waiting for input rather than marking it complete.
2386
+
2387
+ ## Task routing
2388
+
2389
+ - Agents, models, secondary agents, permissions, and tools: [agents](references/agents.md) and [Kit API](references/kit-api.md).
2390
+ - Workflows, steps, branching, errors, and references: [workflows](references/workflows.md), [runtime values](references/runtime-values.md), and [validation](references/validation.md).
2391
+ - Surfaces: [surface configuration and visual approval](references/surface-feedback.md), [surface authoring](references/surface-authoring.md), then [layout](references/surface-layout.md), [display](references/surface-display.md), or [input/actions](references/surface-input-actions.md).
2392
+ - CLI use: [development lifecycle](references/cli-guide.md), [workflow feedback cycle](references/feedback-cycle.md), and [exact CLI reference](references/cli-reference.md).
2393
+ - Credentials and provider integrations: [integration selection](references/integrations.md).
2394
+ - Node selection: [node index](references/nodes-index.md), then the exact page linked below.
2395
+
2396
+ ## Node references
2397
+
2398
+ - [\`argocd\`](references/node-argocd.md)
2399
+ - [\`clickupDoc\`](references/node-clickup-doc.md)
2400
+ - [\`clickupTicket\`](references/node-clickup-ticket.md)
2401
+ - [\`core.agent\`](references/node-core-agent.md)
2402
+ - [\`core.browserAutomation\`](references/node-core-browser-automation.md)
2403
+ - [\`core.code\`](references/node-core-code.md)
2404
+ - [\`core.http\`](references/node-core-http.md)
2405
+ - [\`core.if\`](references/node-core-if.md)
2406
+ - [\`core.jwt\`](references/node-core-jwt.md)
2407
+ - [\`core.loop\`](references/node-core-loop.md)
2408
+ - [\`core.loopBreak\`](references/node-core-loop-break.md)
2409
+ - [\`core.loopContinue\`](references/node-core-loop-continue.md)
2410
+ - [\`core.loopOutput\`](references/node-core-loop-output.md)
2411
+ - [\`core.merge\`](references/node-core-merge.md)
2412
+ - [\`core.set\`](references/node-core-set.md)
2413
+ - [\`core.switch\`](references/node-core-switch.md)
2414
+ - [\`costExplorer\`](references/node-cost-explorer.md)
2415
+ - [\`cronTrigger\`](references/node-cron-trigger.md)
2416
+ - [\`elasticsearch\`](references/node-elasticsearch.md)
2417
+ - [\`github\`](references/node-github.md)
2418
+ - [\`githubPollTrigger\`](references/node-github-poll-trigger.md)
2419
+ - [\`githubWebhookTrigger\`](references/node-github-webhook-trigger.md)
2420
+ - [\`gmail\`](references/node-gmail.md)
2421
+ - [\`gmailTrigger\`](references/node-gmail-trigger.md)
2422
+ - [\`googleCalendar\`](references/node-google-calendar.md)
2423
+ - [\`googleDocs\`](references/node-google-docs.md)
2424
+ - [\`grafanaDashboard\`](references/node-grafana-dashboard.md)
2425
+ - [\`grafanaDataSource\`](references/node-grafana-data-source.md)
2426
+ - [\`grafanaQuery\`](references/node-grafana-query.md)
2427
+ - [\`hibp.listDomains\`](references/node-hibp-list-domains.md)
2428
+ - [\`hibp.stealerLogs\`](references/node-hibp-stealer-logs.md)
2429
+ - [\`kubernetes\`](references/node-kubernetes.md)
2430
+ - [\`manualTrigger\`](references/node-manual-trigger.md)
2431
+ - [\`microsoftOutlook\`](references/node-microsoft-outlook.md)
2432
+ - [\`microsoftOutlookTrigger\`](references/node-microsoft-outlook-trigger.md)
2433
+ - [\`microsoftSharepoint\`](references/node-microsoft-sharepoint.md)
2434
+ - [\`onionsearch\`](references/node-onionsearch.md)
2435
+ - [\`prometheus\`](references/node-prometheus.md)
2436
+ - [\`s3\`](references/node-s3.md)
2437
+ - [\`slack\`](references/node-slack.md)
2438
+ - [\`slackEventsTrigger\`](references/node-slack-events-trigger.md)
2439
+ - [\`slackInteractionsTrigger\`](references/node-slack-interactions-trigger.md)
2440
+ - [\`slackTrigger\`](references/node-slack-trigger.md)
2441
+ - [\`supabase\`](references/node-supabase.md)
2442
+ - [\`twilio\`](references/node-twilio.md)
2443
+ - [\`waitTimer\`](references/node-wait-timer.md)
2444
+ - [\`webhookTrigger\`](references/node-webhook-trigger.md)
2445
+
2446
+ ## Examples
2447
+
2448
+ - [Agent and workflow](examples/agent-workflow.culvii.ts)
2449
+ - [Binary document workflow](examples/binary-document-workflow.culvii.ts)
2450
+ - [Custom output surface](examples/custom-output-surface.culvii.ts)
2451
+ - [Custom wait surface](examples/custom-wait-surface.culvii.ts)
2452
+ - [Human-in-the-loop workflow](examples/human-in-the-loop-workflow.culvii.ts)
2453
+ - [Integration agent workflow](examples/integration-agent-workflow.culvii.ts)
2454
+ - [Nested agent workflow](examples/nested-agent-workflow.culvii.ts)
2455
+ - [Multi-agent workflow tools](examples/multi-agent-workflow-tools.culvii.ts)
2456
+ - [Output surface](examples/output-surface.culvii.ts)
2457
+ - [Wait surface](examples/wait-surface.culvii.ts)
2458
+ - [Complete workflow](examples/complete-workflow.culvii.ts)
2459
+
2460
+ ## Safety
2461
+
2462
+ Do not bypass platform validation, add unsupported surface markup/CSS/JavaScript, or expose raw binary data. Never run culvii deploy. Test workflows through the feedback cycle; do not execute standalone agents. Always close the exact culvii dev process you started and wait for it to exit before finishing. Workflow expressions use {{ ... }} selectors; surface bindings use JSON Pointer objects. Keep them separate.
2463
+ `,".culvii-skill.json":`{
2464
+ "schemaVersion": 1,
2465
+ "name": "culvii",
2466
+ "bundleHash": "bb8ee103e0534e36fbf3df701f1c1539e2061f4f50e1a6affc1a0b173b29b672",
2467
+ "generatorVersion": 1,
2468
+ "sources": {
2469
+ "@culvii/kit": "0.0.8",
2470
+ "nodes": "1.0.0",
2471
+ "surface-contract": "1.0.0",
2472
+ "@culvii/cli": "0.0.9"
2473
+ },
2474
+ "files": {
2475
+ "agents/openai.yaml": "80196c1dbde488639e31d4bbc0addcd253ba626ea0b3cb524d06ee1eabe3263b",
2476
+ "examples/agent-workflow.culvii.ts": "c82471aa06e2fb2f939f50b70ae797b6fed22f2d51277975a93c16d0b94ecd76",
2477
+ "examples/binary-document-workflow.culvii.ts": "3bc13dd2cf04b426449d5509749343a9c040b5e51bcb7e5982339b1173a459c6",
2478
+ "examples/complete-workflow.culvii.ts": "2c59f6b9d525092e75b980aa174ccd8b0187621c8c196270453e03591000a08d",
2479
+ "examples/custom-output-surface.culvii.ts": "8ccfb826d8b140dae94f8e57458eba7d98bf1cdf3dda372c23b757f9f47cb72b",
2480
+ "examples/custom-wait-surface.culvii.ts": "4efef08381de6b51c4530fa312450682a09c3008c77f74c4b55c44b685bf4348",
2481
+ "examples/human-in-the-loop-workflow.culvii.ts": "9daee28598cdae498786aea1b55640c1065097825d19262eb072c1b584328cfc",
2482
+ "examples/integration-agent-workflow.culvii.ts": "3c9b3a3c174ebdfc4f128b2076d44685355d4ce952e54a5a4ec7061e1f231daf",
2483
+ "examples/multi-agent-workflow-tools.culvii.ts": "ac96689205433dc647078acb323e970ac1c2ef06be118f087d428200b852a560",
2484
+ "examples/nested-agent-workflow.culvii.ts": "e1255b0e22e83c26ea09876c9e90496c4c5ab4c24a52cf30d2cc2a7e9b1212a7",
2485
+ "examples/output-surface.culvii.ts": "1959d8bc5c987c32d6c21fa6f36a1eb70bea5a18742885dff85f353170645702",
2486
+ "examples/wait-surface.culvii.ts": "ae533ae4cf2ed533bc333528bd971d65b4140be033e65025663f78bc99d77cf2",
2487
+ "references/agents.md": "bdd14922138c42c9b2ac6466d0eca5960365750451079e8ab28b65f2e0602ae5",
2488
+ "references/authoring-files.md": "ea93dafc36e6643a1040e430aec0fd41f1a5f93c5d24794ae3db0624b26dff53",
2489
+ "references/cli-guide.md": "f127193a2e669861ec9884fdf1f3618af6baf37324029943a05cc13a49d696bc",
2490
+ "references/cli-reference.md": "1c97ed69b833a62b8e9000f20684c99315ff1eabaca265ba9fe54817c3b67020",
2491
+ "references/feedback-cycle.md": "54ad5b36049e377344220e10a7ddaea1e010f532d9fe7ab39b6abd3d435a6a2a",
2492
+ "references/integrations.md": "9fa3db838b4e48d3aae2949012bbbfa7ce84b32779048d17c21ac4548482ee68",
2493
+ "references/kit-api.md": "c082d1b63bec52fdd7124e711f4e86bfae015f1cd7045b25e4910349c4fca1fd",
2494
+ "references/node-argocd.md": "5abd8bfc02ced232d85d366108f2395bfe8d82e0dd0414527ccf932d85da6191",
2495
+ "references/node-clickup-doc.md": "bf62328992963604fe0e015063b9af34d67ca49181c744b77b591a635c1b8c35",
2496
+ "references/node-clickup-ticket.md": "b616e8c02a771eb5283fe33972e100aa6be410f88dd01adfbbfc58fe794b6d23",
2497
+ "references/node-core-agent.md": "09b0b3a5607dbdd06f3f463d140f9633a27b580e59b22f135f1bb349b7fcc0bf",
2498
+ "references/node-core-browser-automation.md": "797f7dbd3374c2ea38de830ab2e9b08a2762e45a3cf56dad1ff274cf8109e7e7",
2499
+ "references/node-core-code.md": "2768aa7a0fec5f12d716ece9727b038ee2a205647e7c41bd85f0139165bbbd51",
2500
+ "references/node-core-http.md": "4799365201368c31d270644161a6e415d5ecfa25d9c75cf5e550330aff7679b4",
2501
+ "references/node-core-if.md": "3298f6dbe803eae9e3a69eb7084b08f43a6c76e139e56051539c7603a705b7e1",
2502
+ "references/node-core-jwt.md": "8828d11751ee88474f962a296cf29b279fa055ea2b95d9ee0362d211596bdedb",
2503
+ "references/node-core-loop-break.md": "d383011f16ae620860e2535be49cafc862a57c7ecae7d7fbd57ac767a5afbd3c",
2504
+ "references/node-core-loop-continue.md": "308af6ffa74572a211f784ffc77b565702105cc73718ae5e8874f1f13254a0ff",
2505
+ "references/node-core-loop-output.md": "dd70d65ad423387cf1190f9e103d4ba734763e32b82674299b733cdb299dbac6",
2506
+ "references/node-core-loop.md": "35d9e5f15ef49d9e5eb1ed824f438a1c61382ca00ff2a838e371fd60919f3b26",
2507
+ "references/node-core-merge.md": "f1c2753761791f872a3e786552ba776742c81b5b56985c23660d90bed6c9422a",
2508
+ "references/node-core-set.md": "511944327b31f9af70fbdcc5769c512a78129f901f98bb03ae3e464205b76468",
2509
+ "references/node-core-switch.md": "512edc581e410f44f7f15ac31ed27fbd1698c0c4cfb9a7fd93feb42bbb29d1ae",
2510
+ "references/node-cost-explorer.md": "65bafd0f0e3c9910f3af2f210d492fc0d1648b570c61ff258642c4b441e688f2",
2511
+ "references/node-cron-trigger.md": "ab958969a2a30b6643ad1d31a3241fed427d3db2e3871ea7ab68c0af4d4cc82b",
2512
+ "references/node-elasticsearch.md": "276ca5fa4368a0c7a12a4383dd01404bdc3c345f6c837ec5fc1c9d609b3138b2",
2513
+ "references/node-github-poll-trigger.md": "132d7a0d7b56cfa29be552418725eeddefb0a11716b7b7192f53de6d57667ee8",
2514
+ "references/node-github-webhook-trigger.md": "09de1c2b493476d908611f71a88850fc76786d6aed48b74e573c6b647110c6a3",
2515
+ "references/node-github.md": "b7ed8f59ecdbcf3ea0166268a27905f1ada3c3fcc5e3e121dc32dea5427a3d06",
2516
+ "references/node-gmail-trigger.md": "59ca6745079299e3bdf77f87fa328bd7900227bbe131ed7a977f781d2ee606e1",
2517
+ "references/node-gmail.md": "f9d8f18d005acc6423c49e8741d909fe8541c4d849ae8ae590c04b561576bd82",
2518
+ "references/node-google-calendar.md": "3bf8ed7c280036fd0009c299fcacbf920bb3b18429f2734ac603e18e16796f73",
2519
+ "references/node-google-docs.md": "b8d6d68914b4228f11adf575753bcaa86cbf71fd3c7dfa36fb07d84627250ad1",
2520
+ "references/node-grafana-dashboard.md": "9bdfafcdfd461a0082b0645a4089826204021fb273589732071ee56ff97ab83e",
2521
+ "references/node-grafana-data-source.md": "050f9dda595a35346b5396563de0e8c18acb05a9139655c61d2a706cc39b5544",
2522
+ "references/node-grafana-query.md": "35c95c6528c01766cfe0c88a9f1adcf786a95061ce81e963025ec131da1d1873",
2523
+ "references/node-hibp-list-domains.md": "b977ed4babb1c419bfe13d76166528fffeddbaeb81147ece07b3c19d34d0f797",
2524
+ "references/node-hibp-stealer-logs.md": "13758678d5eebd520823bc0e56d12cbef8b72835b54b0fc00e9402b744d44550",
2525
+ "references/node-kubernetes.md": "293fd70959588d4f10fd8869388cf37809f477e2f987752da5ab0cdfb2c7cdc2",
2526
+ "references/node-manual-trigger.md": "4bebd22e2a76d6e90acb08ece0d88a6c7040f1a0ac11da298f712251194b7086",
2527
+ "references/node-microsoft-outlook-trigger.md": "aa4385d1734de97e79ce59d2c6ca802683e6c07f625b521d606f8bf5f8540ac5",
2528
+ "references/node-microsoft-outlook.md": "51d55b369461dc0b88dd9b1fcf905f6f9b37fd9270053fc9e2022c2d3c33bed2",
2529
+ "references/node-microsoft-sharepoint.md": "10f27d6507989598ead041a5e1965dd3014dd610848d2b12e4ee81864e4373ed",
2530
+ "references/node-onionsearch.md": "3711791d3c5516ae6ee88bf29b1d18a79da3446cb310446d1e4fb77e22934fe6",
2531
+ "references/node-prometheus.md": "337c4583bbe7f18b54bd7bcf452b8b7f0eb8dbab5d4c65945e6bdec2bbddc35b",
2532
+ "references/node-s3.md": "8ecc9a791cda334707431dfcfed34abe9eedbedbb9c06f1ad03907f8af59b2a8",
2533
+ "references/node-slack-events-trigger.md": "9884a5f369f654b5bf78cd352aaee9df27ec6e5fa548edde8485ea7f47d31eb2",
2534
+ "references/node-slack-interactions-trigger.md": "b8fe95a36582dc8bc0d96b842a621e50fbacf6141914d00c13abfc9912748916",
2535
+ "references/node-slack-trigger.md": "43e6caa5ee349e1ba3c256da3d3279b7385e182829b78e134f2123a650c3d052",
2536
+ "references/node-slack.md": "2d24da368e43494487fa740b111f33d7ab9b763ec88ab45be852a8a8b64c3ff7",
2537
+ "references/node-supabase.md": "c67e87065053adbb5c44425ad62d1e531c0fd9d98de0a7dc91b45e582a24c270",
2538
+ "references/node-twilio.md": "a191b4c071a738c1283d545512e6b73f52aabb1c7fae4d9acb08c5346f5a6ad3",
2539
+ "references/node-wait-timer.md": "72749e63f27b512aa6c51190fbc7a79195cdc37acd6c0f2305285012ce5fd06d",
2540
+ "references/node-webhook-trigger.md": "b98b9cfc92b2e6eb5b1d75e651abccd022b7914d609052d7f7de4e588af45b5a",
2541
+ "references/nodes-index.md": "e8feb33feff53ddf84628f6db9a45db26f9dd5cd6c14082912606af4f1c299eb",
2542
+ "references/runtime-values.md": "93dbe09b2f150ffec02a1d1e2bebdce3eda6e885f1daaae05354ecaceb41f038",
2543
+ "references/surface-authoring.md": "21ae1e1b64e15c8d89ff1d95efec84829ffa2f2aa2f0d5ba400c78742463586d",
2544
+ "references/surface-display.md": "9a24b5fc81f48ad517d36f202c99291258866b7e607f8481763a985bd26d1a26",
2545
+ "references/surface-feedback.md": "425f70b7bbda1923624bd9639fb0d7f071828ad7b59feb54867ef6fe5b5054cb",
2546
+ "references/surface-input-actions.md": "54cd475120fcb650e4c876b9787905d47b87638483d73fc7dc7fb3a06305a8da",
2547
+ "references/surface-layout.md": "3381fea6ed2ed16f4d1e9a9186aa853ecf834fb8f31a1bd09408e9c218e6b559",
2548
+ "references/validation.md": "224ab2041ab6d823b8468b381e16a9823eb2a97b2ea33a812e89b2592ac72f68",
2549
+ "references/workflows.md": "5988f86d8053c44c12decf4d43e98c13d2b3e22f124060198ede182b1e0fc648",
2550
+ "SKILL.md": "d885d3601c21bd69156cdce3116268464edbbf88bc7cec0b6e98989d3a33e41b"
2551
+ }
2552
+ }
2553
+ `};export{n as CULVII_SKILL_BUNDLE,e as CULVII_SKILL_MANIFEST};