@culvii/cli 0.0.8 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/dist/{HelpView-E7HS4SVF.js → HelpView-NKJCCU5A.js} +1 -1
  2. package/dist/{chunk-IPETC2TK.js → chunk-D3YFBXU5.js} +1 -1
  3. package/dist/index.js +25 -27
  4. package/dist/lib/evaluator.js +2 -2
  5. package/dist/{login-OGOHEHFE.js → login-7VBXFHFC.js} +1 -1
  6. package/dist/{logout-BRUJBFUK.js → logout-OJRK2KGE.js} +1 -1
  7. package/dist/skill-bundle-5WQTV2OV.js +2553 -0
  8. package/package.json +2 -2
  9. package/skills/culvii/.culvii-skill.json +58 -27
  10. package/skills/culvii/SKILL.md +31 -0
  11. package/skills/culvii/examples/agent-workflow.culvii.ts +28 -5
  12. package/skills/culvii/examples/binary-document-workflow.culvii.ts +80 -0
  13. package/skills/culvii/examples/complete-workflow.culvii.ts +55 -11
  14. package/skills/culvii/examples/custom-output-surface.culvii.ts +69 -0
  15. package/skills/culvii/examples/custom-wait-surface.culvii.ts +90 -0
  16. package/skills/culvii/examples/human-in-the-loop-workflow.culvii.ts +125 -0
  17. package/skills/culvii/examples/integration-agent-workflow.culvii.ts +101 -0
  18. package/skills/culvii/examples/multi-agent-workflow-tools.culvii.ts +157 -0
  19. package/skills/culvii/examples/nested-agent-workflow.culvii.ts +108 -0
  20. package/skills/culvii/references/agents.md +53 -5
  21. package/skills/culvii/references/cli-guide.md +1 -1
  22. package/skills/culvii/references/cli-reference.md +33 -0
  23. package/skills/culvii/references/feedback-cycle.md +1 -1
  24. package/skills/culvii/references/kit-api.md +2 -2
  25. package/skills/culvii/references/node-argocd.md +44 -0
  26. package/skills/culvii/references/node-clickup-doc.md +38 -0
  27. package/skills/culvii/references/node-clickup-ticket.md +47 -0
  28. package/skills/culvii/references/node-core-loop-break.md +26 -0
  29. package/skills/culvii/references/node-core-loop-continue.md +26 -0
  30. package/skills/culvii/references/node-core-loop-output.md +24 -0
  31. package/skills/culvii/references/node-core-loop.md +25 -0
  32. package/skills/culvii/references/node-core-merge.md +23 -0
  33. package/skills/culvii/references/node-core-switch.md +24 -0
  34. package/skills/culvii/references/node-cost-explorer.md +45 -0
  35. package/skills/culvii/references/node-elasticsearch.md +2 -2
  36. package/skills/culvii/references/node-github-poll-trigger.md +31 -0
  37. package/skills/culvii/references/node-github-webhook-trigger.md +27 -0
  38. package/skills/culvii/references/node-github.md +251 -0
  39. package/skills/culvii/references/node-gmail-trigger.md +2 -2
  40. package/skills/culvii/references/node-gmail.md +2 -2
  41. package/skills/culvii/references/node-google-calendar.md +2 -2
  42. package/skills/culvii/references/node-google-docs.md +2 -2
  43. package/skills/culvii/references/node-grafana-dashboard.md +38 -0
  44. package/skills/culvii/references/node-grafana-data-source.md +42 -0
  45. package/skills/culvii/references/node-grafana-query.md +34 -0
  46. package/skills/culvii/references/node-hibp-list-domains.md +27 -0
  47. package/skills/culvii/references/node-hibp-stealer-logs.md +30 -0
  48. package/skills/culvii/references/node-kubernetes.md +51 -0
  49. package/skills/culvii/references/node-microsoft-outlook-trigger.md +2 -2
  50. package/skills/culvii/references/node-microsoft-outlook.md +3 -2
  51. package/skills/culvii/references/node-microsoft-sharepoint.md +2 -2
  52. package/skills/culvii/references/node-onionsearch.md +27 -0
  53. package/skills/culvii/references/node-prometheus.md +40 -0
  54. package/skills/culvii/references/node-s3.md +2 -2
  55. package/skills/culvii/references/node-slack-events-trigger.md +37 -0
  56. package/skills/culvii/references/node-slack-interactions-trigger.md +28 -0
  57. package/skills/culvii/references/node-slack-trigger.md +2 -2
  58. package/skills/culvii/references/node-slack.md +128 -4
  59. package/skills/culvii/references/node-supabase.md +61 -0
  60. package/skills/culvii/references/node-twilio.md +2 -2
  61. package/skills/culvii/references/nodes-index.md +24 -0
  62. package/skills/culvii/references/surface-authoring.md +12 -1
  63. package/skills/culvii/references/surface-display.md +1 -1
  64. package/skills/culvii/references/surface-feedback.md +24 -27
  65. package/dist/skill-bundle-7KYK5GBL.js +0 -1377
@@ -1,1377 +0,0 @@
1
- #!/usr/bin/env node
2
- import'./chunk-7UWDMECF.js';var e={schemaVersion:1,name:"culvii",bundleHash:"687dba881f07be592c3ce200cefbccacd5e7aac67d122256075255f690563d10",generatorVersion:1,sources:{"@culvii/kit":"0.0.7",nodes:"1.0.0","surface-contract":"1.0.0","@culvii/cli":"0.0.8"},files:{"agents/openai.yaml":"80196c1dbde488639e31d4bbc0addcd253ba626ea0b3cb524d06ee1eabe3263b","examples/agent-workflow.culvii.ts":"934fcd2368ed8d8a02b7557dd2003b462def5f668021173a88cf7ab2393d9c5a","examples/complete-workflow.culvii.ts":"6b939592800bb5b94358fd7e8352a20499a16a31b2d310fcf2cd9609d9e12b66","examples/output-surface.culvii.ts":"1959d8bc5c987c32d6c21fa6f36a1eb70bea5a18742885dff85f353170645702","examples/wait-surface.culvii.ts":"ae533ae4cf2ed533bc333528bd971d65b4140be033e65025663f78bc99d77cf2","references/agents.md":"20cbcc3c184d91794f986217f293043c526d157c261a696e46ebf8e7744947c4","references/authoring-files.md":"ea93dafc36e6643a1040e430aec0fd41f1a5f93c5d24794ae3db0624b26dff53","references/cli-guide.md":"e7f6d69ec3cbc94fc584a64684883732e4e5ba6933fe1526dfe4b33e0eb19753","references/cli-reference.md":"e976edf090b5a8c1b8c4f9edc8df434a3c3c69348123ab0c4290547a971612f2","references/feedback-cycle.md":"0e5cf8142769d2ae6d8331cd0a04a6c1d54b8e9afb24b51eed8dfed4115d2c36","references/integrations.md":"9fa3db838b4e48d3aae2949012bbbfa7ce84b32779048d17c21ac4548482ee68","references/kit-api.md":"27ad6b8578dd2cf8606636f580a024551057171a74a4c8b5a3a12764f57cf263","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-set.md":"511944327b31f9af70fbdcc5769c512a78129f901f98bb03ae3e464205b76468","references/node-cron-trigger.md":"ab958969a2a30b6643ad1d31a3241fed427d3db2e3871ea7ab68c0af4d4cc82b","references/node-elasticsearch.md":"b79e86b337e3391296036ac65a267b619ecdde5c34f7765c15abb8b5a292c5e5","references/node-gmail-trigger.md":"f359ea35b30edbc1d723aa3f9f013fa4aaec6082d114211c2dfc369b765e6e87","references/node-gmail.md":"ce3dc186d6483d12680ccd66b208fd32319aa8fc610ef8d11936f323c4526918","references/node-google-calendar.md":"5258b43f2434446723ccabfc1f7e023d251661a5d451ba5c639f96452737ebab","references/node-google-docs.md":"9c98ddd0f287fbc0322128c2c29707bf66b964557c796074dbfa7ace7e613ee1","references/node-manual-trigger.md":"4bebd22e2a76d6e90acb08ece0d88a6c7040f1a0ac11da298f712251194b7086","references/node-microsoft-outlook-trigger.md":"e74d4984e85e87f7a8be1f762e72fd77b2ddce984034126612484966e9429ab0","references/node-microsoft-outlook.md":"4767160228debe361881e6e5fc9cfda55add3b026728221e4a5bd2eb4be9fc87","references/node-microsoft-sharepoint.md":"7b89f9073da94a39f477ca8aeb2964dee0bb7dee99784841a403884a75c5a822","references/node-s3.md":"e25649b8103460ebf7c35c96626aa3c9e181dcb1ca2d8af3203afb801a6062ea","references/node-slack-trigger.md":"a0bdeb27a0d035fb85d25bcd59d54ba2da622be143333431c35a53b5728b7b65","references/node-slack.md":"e02d5c72948f311fb2847ce59ee11c9ba2a0fd02c59ba661236aa9540091aa3d","references/node-twilio.md":"337e1163ae54ebad046d7ba9030a8c54503ef39007396a0b5ee10598ed34ff6e","references/node-wait-timer.md":"72749e63f27b512aa6c51190fbc7a79195cdc37acd6c0f2305285012ce5fd06d","references/node-webhook-trigger.md":"b98b9cfc92b2e6eb5b1d75e651abccd022b7914d609052d7f7de4e588af45b5a","references/nodes-index.md":"de160eca230166f6b795f515a9e5884d3ba814b6600a5d412cc0c54a77d68cbb","references/runtime-values.md":"93dbe09b2f150ffec02a1d1e2bebdce3eda6e885f1daaae05354ecaceb41f038","references/surface-authoring.md":"b8b666d57f3101461604d94f2910e6c1fc9948411cc773b3b3916f5d89c8b32d","references/surface-display.md":"0afaf3c04fb2a7718e3bf2db0d55e968f7acab80c20f1d3a9a96282e6688a709","references/surface-feedback.md":"45009b5b4d050f0af2a186d478ae9a9964990d2e37f7e4e655d6a2e03ea6cb49","references/surface-input-actions.md":"54cd475120fcb650e4c876b9787905d47b87638483d73fc7dc7fb3a06305a8da","references/surface-layout.md":"3381fea6ed2ed16f4d1e9a9186aa853ecf834fb8f31a1bd09408e9c218e6b559","references/validation.md":"224ab2041ab6d823b8468b381e16a9823eb2a97b2ea33a812e89b2592ac72f68","references/workflows.md":"5988f86d8053c44c12decf4d43e98c13d2b3e22f124060198ede182b1e0fc648","SKILL.md":"8fc95b5ac2a0347d77d8155d67622033960392e85fb519dacdc67e864874c388"}},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', name: 'Review Agent', role: 'primary',
13
- description: 'Reviews a request.', systemPrompt: 'Return a concise review.',
14
- model: MODEL, secondaryAgents: [],
15
- });
16
- }
17
-
18
- function createWorkflow() {
19
- const trigger = new Step({ id: 'trigger', name: 'Manual Trigger', type: 'manualTrigger' });
20
- const run = new Step({
21
- id: 'run-review', name: 'Run Review', type: 'core.agent',
22
- params: { agentReferenceKey: 'review-agent', prompt: 'Review the request.', autoCloseSession: true },
23
- });
24
- trigger.connectTo(run);
25
- return new Workflow({ id: 'review-workflow', name: 'Review Workflow', steps: [trigger, run] });
26
- }
27
-
28
- createAgent();
29
- createWorkflow();
30
- `,"examples/complete-workflow.culvii.ts":`import { MultiAgentEngine, Step, Workflow, createAgentModelConfigFromRef, defineWorkflowTool } from '@culvii/kit';
31
-
32
- const MODEL = createAgentModelConfigFromRef('anthropic/claude-sonnet-4-5', 'credential-id');
33
-
34
- function createLookupWorkflow() {
35
- const trigger = new Step({ id: 'lookup-trigger', name: 'Lookup Trigger', type: 'manualTrigger' });
36
- const lookup = new Step({ id: 'lookup', name: 'Lookup', type: 'core.set', params: { values: { plan: 'Enterprise' } } });
37
- trigger.connectTo(lookup);
38
- return new Workflow({ id: 'lookup-workflow', name: 'Lookup Workflow', steps: [trigger, lookup] });
39
- }
40
-
41
- function createAgent() {
42
- return new MultiAgentEngine({
43
- id: 'concierge-agent', name: 'Concierge Agent', role: 'primary',
44
- description: 'Looks up and reviews account context.', systemPrompt: 'Use lookup_account before answering.', model: MODEL,
45
- tools: { lookup_account: defineWorkflowTool({ name: 'lookup_account', description: 'Looks up account data.', workflowId: 'lookup-workflow' }) },
46
- secondaryAgents: [],
47
- });
48
- }
49
-
50
- function createParentWorkflow() {
51
- const trigger = new Step({ id: 'trigger', name: 'Manual Trigger', type: 'manualTrigger' });
52
- const prepare = new Step({
53
- id: 'prepare', name: 'Prepare', type: 'core.set',
54
- params: { values: { account: 'Acme', nested: { ids: ['={{ $system.execId }}', '={{ $json.account }}'] } } },
55
- });
56
- const agent = new Step({
57
- id: 'agent', name: 'Concierge', type: 'core.agent',
58
- params: { agentReferenceKey: 'concierge-agent', prompt: "Review {{ $('Prepare').json.account }}", autoCloseSession: true },
59
- });
60
- trigger.connectTo(prepare); prepare.connectTo(agent);
61
- return new Workflow({ id: 'parent-workflow', name: 'Parent Workflow', steps: [trigger, prepare, agent] });
62
- }
63
-
64
- createLookupWorkflow();
65
- createAgent();
66
- createParentWorkflow();
67
- `,"examples/output-surface.culvii.ts":`import { Step, Surface, Workflow } from '@culvii/kit';
68
-
69
- function createOutputSurface() {
70
- return new Surface({
71
- id: 'result-surface',
72
- name: 'Result Surface',
73
- slot: 'output',
74
- definition: {
75
- schema: 'kit.ui/v1',
76
- root: 'outer',
77
- components: [
78
- { id: 'outer', type: 'Stack', children: ['card'] },
79
- { id: 'card', type: 'Card', props: { title: 'Execution result' }, children: ['inner'] },
80
- { id: 'inner', type: 'Stack', children: ['status', 'execution'] },
81
- {
82
- id: 'status',
83
- type: 'StatusPill',
84
- props: { status: { path: '/$output/Prepare/main/0/0/status' } },
85
- },
86
- {
87
- id: 'execution',
88
- type: 'Text',
89
- props: { text: { path: '/$exec/id', default: 'pending' } },
90
- },
91
- ],
92
- },
93
- });
94
- }
95
-
96
- function createWorkflow() {
97
- const prepare = new Step({
98
- id: 'prepare',
99
- name: 'Prepare',
100
- type: 'core.set',
101
- params: { values: { status: 'ready' } },
102
- ui: { output: createOutputSurface() },
103
- });
104
- return new Workflow({
105
- id: 'output-surface-workflow',
106
- name: 'Output Surface Workflow',
107
- steps: [prepare],
108
- });
109
- }
110
-
111
- createWorkflow();
112
- `,"examples/wait-surface.culvii.ts":`import { Step, Surface, Workflow } from '@culvii/kit';
113
-
114
- function createWaitSurface() {
115
- return new Surface({
116
- id: 'approval-surface', name: 'Approval Surface', slot: 'wait',
117
- definition: { schema: 'kit.ui/v1', root: 'form', components: [
118
- { id: 'form', type: 'Form', props: { title: 'Review result' }, children: ['comment', 'approve'] },
119
- { id: 'comment', type: 'TextArea', props: { label: 'Comment', bind: '/$form/comment' } },
120
- { id: 'approve', type: 'Button', props: { label: 'Continue', variant: 'primary' }, actions: {
121
- click: { type: 'node.resume', payload: { comment: { path: '/$form/comment', default: '' } } },
122
- } },
123
- ], form: { fields: [{ name: 'comment', label: 'Comment', type: 'textarea' }] } },
124
- });
125
- }
126
-
127
- function createWorkflow() {
128
- const review = new Step({
129
- id: 'review', name: 'Review', type: 'core.set', params: { values: { status: 'pending' } },
130
- ui: { wait: createWaitSurface() },
131
- });
132
- return new Workflow({ id: 'approval-workflow', name: 'Approval Workflow', steps: [review] });
133
- }
134
-
135
- createWorkflow();
136
- `,"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 id: 'researcher', name: 'Researcher', role: 'secondary',\n description: 'Finds supporting evidence.', systemPrompt: 'Return concise evidence.', model: MODEL,\n }],\n});\n```\n\nBuilt-in permissions live at `metadata.runtimeDetails.permissions`. Only keys in `BUILTIN_AGENT_PERMISSIONS` are valid: `*`, `web:fetch`, `web:crawl`, `workflow:binary:read`, `workflow:binary:write`, `workflow:pdf:read`, `workflow:docx:read`, `workflow:docx:write`, and `workflow:docx:append`. Workflow-prefixed capabilities are available only during a workflow execution.\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\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
137
-
138
- Before writing code, inspect \`package.json\`, \`culvii.yaml\`, and every existing \`*.culvii.ts\` file. Preserve the project's module style and dependency versions.
139
-
140
- 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\`.
141
-
142
- \`\`\`ts
143
- import { MultiAgentEngine, Step, Surface, Workflow, createAgentModelConfigFromRef } from '@culvii/kit';
144
-
145
- const MODEL = createAgentModelConfigFromRef('openai/gpt-4.1', 'CREDENTIAL_ID');
146
-
147
- function createAgent() { return new MultiAgentEngine({ /* ... */ }); }
148
- function createWorkflow() { return new Workflow({ /* ... */ }); }
149
- function createSurface() { return new Surface({ /* ... */ }); }
150
-
151
- createAgent();
152
- createWorkflow();
153
- createSurface();
154
- \`\`\`
155
-
156
- 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.
157
- `,"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 visual approval of custom surfaces, 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
158
-
159
- Generated from the registered Commander command tree. Disabled and unregistered commands are excluded.
160
-
161
- ## \`culvii\`
162
-
163
- Culvii CLI
164
-
165
- Options:
166
-
167
- - \`--debug\` \u2014 Enable debug logging to ~/.culvii/logs/cli.log
168
- - \`-V, --version\` \u2014 output the version number
169
-
170
- ## \`culvii auth\`
171
-
172
- Authentication commands
173
-
174
- ## \`culvii auth login\`
175
-
176
- Login to Culvii
177
-
178
- ## \`culvii auth logout\`
179
-
180
- Logout of Culvii
181
-
182
- ## \`culvii deploy\`
183
-
184
- Deploy an agent
185
-
186
- Options:
187
-
188
- - \`--env <env>\` (required) \u2014 Environment (sandbox or prod)
189
- - \`--workspace-slug <slug>\` \u2014 Target workspace slug (overrides config)
190
-
191
- ## \`culvii dev\`
192
-
193
- Start the development server and file watcher
194
-
195
- ## \`culvii env [environment]\`
196
-
197
- Show or switch the active environment (dev, sandbox, prod)
198
-
199
- ## \`culvii execution\`
200
-
201
- Inspect workflow executions
202
-
203
- Options:
204
-
205
- - \`--env <env>\` \u2014 Target environment (dev, sandbox, or prod)
206
-
207
- ## \`culvii execution get <execution-id>\`
208
-
209
- Get execution details, step outputs, and errors
210
-
211
- Options:
212
-
213
- - \`--json\` \u2014 Print machine-readable JSON
214
-
215
- ## \`culvii execution list\`
216
-
217
- List workspace executions
218
-
219
- Options:
220
-
221
- - \`--json\` \u2014 Print machine-readable JSON
222
- - \`--limit <limit>\` \u2014 Results per page
223
- - \`--page <page>\` \u2014 Page number
224
- - \`--status <status>\` \u2014 Filter by execution status
225
- - \`--trigger <trigger>\` \u2014 Filter by trigger type
226
- - \`--workflow <workflow>\` \u2014 Filter by workflow reference key or ID
227
-
228
- ## \`culvii init [project-name]\`
229
-
230
- Scaffold a new Culvii project with working agent and workflow files
231
-
232
- Options:
233
-
234
- - \`--here\` \u2014 Scaffold into the current directory instead of a named subdirectory
235
- - \`--provider <provider>\` \u2014 Model provider: openai | anthropic | gemini | google-vertex
236
- - \`--template <template>\` \u2014 Template: agent-only | agent-workflow | agent-workflow-tool | multi-agent
237
- - \`-y, --yes\` \u2014 Accept all defaults non-interactively
238
-
239
- ## \`culvii integration\`
240
-
241
- List and manage Culvii integrations
242
-
243
- Options:
244
-
245
- - \`--env <env>\` \u2014 Target environment (dev, sandbox, or prod)
246
-
247
- ## \`culvii integration list\`
248
-
249
- List available integration credentials and their scopes
250
-
251
- Options:
252
-
253
- - \`--json\` \u2014 Print machine-readable JSON
254
-
255
- ## \`culvii login\`
256
-
257
- Login to Culvii
258
-
259
- ## \`culvii logout\`
260
-
261
- Logout of Culvii
262
-
263
- ## \`culvii rename <old-slug> <new-slug>\`
264
-
265
- Rename a resource
266
-
267
- Options:
268
-
269
- - \`--env <env>\` \u2014 Target environment (sandbox or prod)
270
- - \`--resource-type <type>\` (required) \u2014 Type of resource (agent)
271
- - \`--workspace-slug <slug>\` \u2014 Target workspace slug (overrides config)
272
-
273
- ## \`culvii skill\`
274
-
275
- Manage AI agent skills
276
-
277
- ## \`culvii skill install\`
278
-
279
- Install the Culvii authoring skill bundle for AI agents
280
-
281
- Options:
282
-
283
- - \`--agent <agent>\` \u2014 Specify agent (claude|cursor|windsurf|github|opencode|gemini|kiro|codex|agents)
284
- - \`--force\` \u2014 Replace an existing unmanaged Culvii skill directory
285
- - \`--global\` \u2014 Install globally instead of in the current project
286
-
287
- ## \`culvii switch [tenant-slug]\`
288
-
289
- Switch the active tenant context
290
-
291
- ## \`culvii whoami\`
292
-
293
- Show current authenticated user context
294
-
295
- Options:
296
-
297
- - \`--json\` \u2014 Output as JSON
298
-
299
- ## \`culvii workflow\`
300
-
301
- Workflow execution commands
302
-
303
- Options:
304
-
305
- - \`--env <env>\` \u2014 Target environment (dev, sandbox, or prod)
306
-
307
- ## \`culvii workflow run <workflow>\`
308
-
309
- Start a workflow execution
310
-
311
- Options:
312
-
313
- - \`--json\` \u2014 Print machine-readable JSON
314
- - \`--mocks-file <path>\` \u2014 JSON object mapping node IDs to mock outputs
315
- - \`--payload <json>\` \u2014 Trigger payload as JSON
316
- - \`--payload-file <path>\` \u2014 Read trigger payload from a JSON file
317
- - \`--trigger <node-name>\` (required) \u2014 Trigger node name
318
-
319
- ## \`culvii workspace\`
320
-
321
- Workspace commands
322
-
323
- Options:
324
-
325
- - \`--env <env>\` \u2014 Target environment (sandbox or prod)
326
-
327
- ## \`culvii workspace create\`
328
-
329
- Create a new workspace
330
-
331
- Options:
332
-
333
- - \`--name <name>\` (required) \u2014 Workspace name
334
- - \`--slug <slug>\` (required) \u2014 Workspace slug
335
-
336
- ## \`culvii workspace list\`
337
-
338
- List workspaces
339
-
340
- Further reading: [\`culvii dev\`](https://culvii.com/docs/cli/dev/) and [\`culvii deploy\`](https://culvii.com/docs/cli/deploy/).
341
- `,"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 their [visual approval loop](surface-feedback.md#visual-approval-loop). 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`, `AgentMetadata`, `AgentModel`, `AgentModelConfig`, `AgentModelConfigOptions`, `AgentModelRef`, `AgentPermissions`, `AgentRole`, `AgentRuntimeDetails`, `BUILTIN_AGENT_PERMISSIONS`, `BuiltInModelProvider`, `BuiltinAgentPermission`, `BuiltinAgentToolName`, `MultiAgentEngine`, `Permission`, `PrimaryAgentConfig`, `SecondaryAgentConfig`, `Tool`, `WorkflowToolConfig`, `assertValidAgentPermissions`, `createAgentModelConfigFromRef`, `defineWorkflowTool`, `parseAgentModelRef`, `validateAgentPermissions`\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`, `NodeExpression`, `NodeParams`, `NodeParamsBase`, `NodeType`, `NodeTypeInput`, `NodeTypeParamsMap`, `NodeUiConfig`, `RegisteredNodeType`, `Resolvable`, `SerializedWorkflow`, `SerializedWorkflowStep`, `Step`, `StepCredentials`, `StepSurfaceSelection`, `Workflow`, `WorkflowConfig`, `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-core-agent.md":`# core.agent
342
-
343
- - Type ID: \`core.agent\`
344
- - Kind: \`action\`
345
- - Credentials: not required
346
- - Feedback mock: not required
347
-
348
- ## Props
349
-
350
- - \`agentReferenceKey\`: string; required
351
- - \`prompt\`: string; required
352
- - \`autoCloseSession\`: boolean; optional
353
- - \`outputFormat\`: json; optional
354
- - \`pauseAfterExecution\`: boolean; optional
355
-
356
- ## Example
357
-
358
- \`\`\`ts
359
- new Step({
360
- id: 'core-agent',
361
- name: 'core.agent',
362
- type: 'core.agent',
363
- params: { /* use the required props and conditional values above */ },
364
- });
365
- \`\`\`
366
-
367
- Further reading: [Culvii core.agent node](https://culvii.com/docs/nodes/core/agent/).
368
- `,"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
369
-
370
- - Type ID: \`core.code\`
371
- - Kind: \`action\`
372
- - Credentials: not required
373
- - Feedback mock: not required
374
-
375
- ## Props
376
-
377
- - \`code\`: string; required
378
- - \`codeType\`: options; optional
379
- - Values: \`js\`, \`py\`
380
- - \`codeParams\`: object; optional
381
- - \`globalParams\`: object; optional
382
- - \`pauseAfterExecution\`: boolean; optional
383
-
384
- ## Example
385
-
386
- \`\`\`ts
387
- new Step({
388
- id: 'core-code',
389
- name: 'core.code',
390
- type: 'core.code',
391
- params: { /* use the required props and conditional values above */ },
392
- });
393
- \`\`\`
394
-
395
- Further reading: [Culvii core.code node](https://culvii.com/docs/nodes/core/code/).
396
- `,"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
397
-
398
- - Type ID: \`core.if\`
399
- - Kind: \`action\`
400
- - Credentials: not required
401
- - Feedback mock: not required
402
-
403
- ## Props
404
-
405
- - \`conditions\`: array; required
406
- - \`combineOperation\`: options; required
407
- - Values: \`all\`, \`any\`
408
- - \`pauseAfterExecution\`: boolean; optional
409
-
410
- ## Example
411
-
412
- \`\`\`ts
413
- new Step({
414
- id: 'core-if',
415
- name: 'core.if',
416
- type: 'core.if',
417
- params: { /* use the required props and conditional values above */ },
418
- });
419
- \`\`\`
420
-
421
- Further reading: [Culvii core.if node](https://culvii.com/docs/nodes/core/if/).
422
- `,"references/node-core-jwt.md":`# core.jwt
423
-
424
- - Type ID: \`core.jwt\`
425
- - Kind: \`action\`
426
- - Credentials: not required
427
- - Feedback mock: not required
428
-
429
- ## Props
430
-
431
- - \`operation\`: options; required
432
- - Values: \`sign\`, \`verify\`
433
- - \`payload\`: object; optional; when operation=sign
434
- - \`token\`: string; optional; when operation=verify
435
- - \`secret\`: string; required
436
- - \`expiresIn\`: string; optional; when operation=sign
437
- - \`issuer\`: string; optional
438
- - \`audience\`: string; optional
439
- - \`pauseAfterExecution\`: boolean; optional
440
-
441
- ## Example
442
-
443
- \`\`\`ts
444
- new Step({
445
- id: 'core-jwt',
446
- name: 'core.jwt',
447
- type: 'core.jwt',
448
- params: { /* use the required props and conditional values above */ },
449
- });
450
- \`\`\`
451
-
452
- Further reading: [Culvii core.jwt node](https://culvii.com/docs/nodes/core/jwt/).
453
- `,"references/node-core-set.md":`# core.set
454
-
455
- - Type ID: \`core.set\`
456
- - Kind: \`action\`
457
- - Credentials: not required
458
- - Feedback mock: not required
459
-
460
- ## Props
461
-
462
- - \`values\`: object; required
463
- - \`pauseAfterExecution\`: boolean; optional
464
-
465
- ## Example
466
-
467
- \`\`\`ts
468
- new Step({
469
- id: 'core-set',
470
- name: 'core.set',
471
- type: 'core.set',
472
- params: { /* use the required props and conditional values above */ },
473
- });
474
- \`\`\`
475
-
476
- Further reading: [Culvii core.set node](https://culvii.com/docs/nodes/core/set/).
477
- `,"references/node-cron-trigger.md":`# cronTrigger
478
-
479
- - Type ID: \`cronTrigger\`
480
- - Kind: \`trigger\`
481
- - Credentials: not required
482
- - Feedback mock: not required
483
-
484
- ## Props
485
-
486
- - \`cronExpression\`: string; optional
487
- - \`pollIntervalMs\`: number; optional
488
- - \`pauseAfterExecution\`: boolean; optional
489
-
490
- ## Example
491
-
492
- \`\`\`ts
493
- new Step({
494
- id: 'cron-trigger',
495
- name: 'cronTrigger',
496
- type: 'cronTrigger',
497
- params: { /* use the required props and conditional values above */ },
498
- });
499
- \`\`\`
500
-
501
- Further reading: [Culvii cronTrigger node](https://culvii.com/docs/nodes/triggers/cron-trigger/).
502
- `,"references/node-elasticsearch.md":"# elasticsearch\n\n- Type ID: `elasticsearch`\n- Kind: `action`\n- Credentials: required as `credentials: { name, id }`\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: 'Stored credential', 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-gmail-trigger.md":"# gmailTrigger\n\n- Type ID: `gmailTrigger`\n- Kind: `trigger`\n- Credentials: required as `credentials: { name, id }`\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: 'Stored credential', 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 }`\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: 'Stored credential', 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 }`\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: 'Stored credential', 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 }`\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: 'Stored credential', 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-manual-trigger.md":`# manualTrigger
503
-
504
- - Type ID: \`manualTrigger\`
505
- - Kind: \`trigger\`
506
- - Credentials: not required
507
- - Feedback mock: not required
508
-
509
- ## Props
510
-
511
- - \`payloadSchema\`: array; optional
512
- - \`pauseAfterExecution\`: boolean; optional
513
-
514
- ## Example
515
-
516
- \`\`\`ts
517
- new Step({
518
- id: 'manual-trigger',
519
- name: 'manualTrigger',
520
- type: 'manualTrigger',
521
- params: { /* use the required props and conditional values above */ },
522
- });
523
- \`\`\`
524
-
525
- Further reading: [Culvii manualTrigger node](https://culvii.com/docs/nodes/triggers/manual-trigger/).
526
- `,"references/node-microsoft-outlook-trigger.md":"# microsoftOutlookTrigger\n\n- Type ID: `microsoftOutlookTrigger`\n- Kind: `trigger`\n- Credentials: required as `credentials: { name, id }`\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: 'Stored credential', 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 }`\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- `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: 'Stored credential', 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 }`\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: 'Stored credential', 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-s3.md":"# s3\n\n- Type ID: `s3`\n- Kind: `action`\n- Credentials: required as `credentials: { name, id }`\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: 'Stored credential', 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-trigger.md":"# slackTrigger\n\n- Type ID: `slackTrigger`\n- Kind: `trigger`\n- Credentials: required as `credentials: { name, id }`\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: 'Stored credential', 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 }`\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`\n- `operation`: options; required; when resource=message\n - Values: `send`\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 - `mrkdwn`: boolean; optional\n - `link_names`: boolean; optional\n - `unfurl_links`: boolean; optional\n - `unfurl_media`: boolean; optional\n- `pauseAfterExecution`: boolean; optional\n\n## Example\n\n```ts\nnew Step({\n id: 'slack',\n name: 'slack',\n type: 'slack',\n credentials: { name: 'Stored credential', 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-twilio.md":"# twilio\n\n- Type ID: `twilio`\n- Kind: `action`\n- Credentials: required as `credentials: { name, id }`\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: 'Stored credential', 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
527
-
528
- - Type ID: \`waitTimer\`
529
- - Kind: \`action\`
530
- - Credentials: not required
531
- - Feedback mock: not required
532
-
533
- ## Props
534
-
535
- - \`resumeIn\`: number; required
536
- - \`pauseAfterExecution\`: boolean; optional
537
-
538
- ## Example
539
-
540
- \`\`\`ts
541
- new Step({
542
- id: 'wait-timer',
543
- name: 'waitTimer',
544
- type: 'waitTimer',
545
- params: { /* use the required props and conditional values above */ },
546
- });
547
- \`\`\`
548
-
549
- Further reading: [Culvii waitTimer node](https://culvii.com/docs/nodes/wait-timer/).
550
- `,"references/node-webhook-trigger.md":`# webhookTrigger
551
-
552
- - Type ID: \`webhookTrigger\`
553
- - Kind: \`trigger\`
554
- - Credentials: not required
555
- - Feedback mock: not required
556
-
557
- ## Props
558
-
559
- - \`method\`: string; required
560
- - \`pauseAfterExecution\`: boolean; optional
561
-
562
- ## Example
563
-
564
- \`\`\`ts
565
- new Step({
566
- id: 'webhook-trigger',
567
- name: 'webhookTrigger',
568
- type: 'webhookTrigger',
569
- params: { /* use the required props and conditional values above */ },
570
- });
571
- \`\`\`
572
-
573
- Further reading: [Culvii webhookTrigger node](https://culvii.com/docs/nodes/triggers/webhook-trigger/).
574
- `,"references/nodes-index.md":"# Node index\n\nGenerated from `GENERATED_NODE_DEFINITIONS`. Open the exact node page before authoring its params.\n\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.set`](node-core-set.md) \u2014 action\n- [`cronTrigger`](node-cron-trigger.md) \u2014 trigger\n- [`elasticsearch`](node-elasticsearch.md) \u2014 action; 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- [`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- [`s3`](node-s3.md) \u2014 action; credentials required; feedback mock required\n- [`slack`](node-slack.md) \u2014 action; credentials required; feedback mock required\n- [`slackTrigger`](node-slack-trigger.md) \u2014 trigger; 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`.\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
575
-
576
- ## Avatar
577
-
578
- Initials derived from a name or email.
579
-
580
- - Children: \`none\`
581
-
582
- Props:
583
-
584
- - \`email\` (string; bindable) \u2014 Fallback source for initials.
585
-
586
- - \`label\` (string; bindable) \u2014 Text beside the avatar.
587
-
588
- - \`name\` (string; bindable) \u2014 Name used for initials.
589
-
590
- - \`size\` (string; literal; values: "sm" | "md" | "lg") \u2014 Avatar size.
591
-
592
- ## Badge
593
-
594
- Small label with an explicit tone.
595
-
596
- - Children: \`none\`
597
-
598
- Props:
599
-
600
- - \`format\` (string; literal; values: "text" | "number" | "compact" | "percent" | "currency" | "bytes" | "duration" | "date" | "datetime" | "time" | "list" | "json" | "boolean") \u2014 Display format.
601
-
602
- - \`maxChars\` (number; literal; integer; min 1) \u2014 Maximum displayed characters.
603
-
604
- - \`text\` (any; bindable) \u2014 Badge label.
605
-
606
- - \`tone\` (string; literal; values: "neutral" | "info" | "success" | "warning" | "error") \u2014 Badge tone.
607
-
608
- - \`transform\` (string; literal; values: "capitalize" | "title" | "upper" | "lower" | "humanize") \u2014 Text transform.
609
-
610
- ## Code
611
-
612
- Monospace text block.
613
-
614
- - Children: \`none\`
615
- - Limits: \`{"characters":20000}\`
616
-
617
- Props:
618
-
619
- - \`label\` (string; bindable) \u2014 Block label.
620
-
621
- - \`text\` (any; bindable) \u2014 Code or payload.
622
-
623
- - \`wrap\` (boolean; literal) \u2014 Wrap long lines.
624
-
625
- ## DiffView
626
-
627
- Structural JSON or line-by-line text comparison.
628
-
629
- - Children: \`none\`
630
- - Limits: \`{"depth":6,"children":100,"lines":2000,"characters":200000}\`
631
-
632
- Props:
633
-
634
- - \`after\` (any; bindable) \u2014 Proposed value.
635
-
636
- - \`before\` (any; bindable) \u2014 Prior value.
637
-
638
- - \`mode\` (string; literal; values: "json" | "text") \u2014 Comparison mode.
639
-
640
- ## Duration
641
-
642
- A duration in milliseconds or between two instants.
643
-
644
- - Children: \`none\`
645
-
646
- Props:
647
-
648
- - \`end\` (union; bindable) \u2014 End instant.
649
- - Variant 1: string; literal
650
- - Variant 2: number; literal
651
-
652
- - \`size\` (string; literal; values: "xs" | "sm" | "md" | "lg") \u2014 Displayed value size.
653
-
654
- - \`start\` (union; bindable) \u2014 Start instant.
655
- - Variant 1: string; literal
656
- - Variant 2: number; literal
657
-
658
- - \`tone\` (string; literal; values: "default" | "muted" | "success" | "warning" | "error" | "info") \u2014 Displayed value tone.
659
-
660
- - \`unit\` (string; literal; values: "seconds" | "ms") \u2014 Numeric instant unit.
661
-
662
- - \`value\` (number; bindable; min 0) \u2014 Duration in milliseconds.
663
-
664
- ## EmailMessageCard
665
-
666
- Inbox list or opened email message.
667
-
668
- - Children: \`none\`
669
- - Limits: \`{"renderedMessages":50}\`
670
-
671
- Props:
672
-
673
- - \`body\` (string; bindable) \u2014 Message body.
674
-
675
- - \`cc\` (string; bindable) \u2014 Carbon-copy recipients.
676
-
677
- - \`date\` (union; bindable) \u2014 Sent or received instant.
678
- - Variant 1: string; literal
679
- - Variant 2: number; literal
680
-
681
- - \`emptyText\` (string; bindable) \u2014 Empty-state text.
682
-
683
- - \`fields\` (object; literal) \u2014 Field-name mapping.
684
-
685
- - \`from\` (string; bindable) \u2014 Sender.
686
-
687
- - \`labels\` (array; bindable) \u2014 Message labels.
688
- - Items: string; literal
689
-
690
- - \`message\` (object; bindable) \u2014 Single message.
691
-
692
- - \`messages\` (array; bindable) \u2014 Message list.
693
- - Items: object; literal
694
-
695
- - \`snippet\` (string; bindable) \u2014 Preview text.
696
-
697
- - \`subject\` (string; bindable) \u2014 Subject.
698
-
699
- - \`to\` (string; bindable) \u2014 Recipients.
700
-
701
- - \`unread\` (boolean; bindable) \u2014 Unread state.
702
-
703
- ## FileChip
704
-
705
- Metadata and download affordance for a produced file.
706
-
707
- - Children: \`none\`
708
- - Interaction: \`single-action\`
709
-
710
- Props:
711
-
712
- - \`file\` (object; bindable) \u2014 Binary descriptor.
713
- - \`downloadUrl\` (string; literal) \u2014 Protected download URL.
714
- - \`fileName\` (string; literal) \u2014 Original file name.
715
- - \`key\` (string; literal; required) \u2014 Binary property key.
716
- - \`mimeType\` (string; literal) \u2014 MIME type.
717
- - \`size\` (number; literal; min 0) \u2014 File size in bytes.
718
-
719
- - \`label\` (string; bindable) \u2014 Displayed file name.
720
-
721
- ## Heading
722
-
723
- A section title.
724
-
725
- - Children: \`none\`
726
-
727
- Props:
728
-
729
- - \`level\` (number; literal; values: 1 | 2 | 3; integer) \u2014 Heading level.
730
-
731
- - \`maxChars\` (number; literal; integer; min 1) \u2014 Maximum displayed characters.
732
-
733
- - \`text\` (any; bindable) \u2014 Heading text.
734
-
735
- - \`transform\` (string; literal; values: "capitalize" | "title" | "upper" | "lower" | "humanize") \u2014 Text transform.
736
-
737
- ## HtmlRenderer
738
-
739
- Sandboxed HTML fragment renderer.
740
-
741
- - Children: \`none\`
742
- - Limits: \`{"characters":20000}\`
743
-
744
- Props:
745
-
746
- - \`allowRemoteImages\` (boolean; literal) \u2014 Allow remote HTTPS images.
747
-
748
- - \`emptyText\` (string; bindable) \u2014 Empty-state text.
749
-
750
- - \`height\` (number; literal; min 80; max 1200) \u2014 Frame height in pixels.
751
-
752
- - \`html\` (string; bindable) \u2014 HTML markup.
753
-
754
- - \`label\` (string; bindable) \u2014 Frame label.
755
-
756
- ## JsonInspector
757
-
758
- Collapsible JSON tree and default fallback renderer.
759
-
760
- - Children: \`none\`
761
-
762
- Props:
763
-
764
- - \`collapsed\` (boolean; literal) \u2014 Start collapsed.
765
-
766
- - \`value\` (any; bindable) \u2014 Any JSON value.
767
-
768
- ## KeyValue
769
-
770
- Declared label/value entries or a bound object.
771
-
772
- - Children: \`none\`
773
-
774
- Props:
775
-
776
- - \`columns\` (number; literal; values: 1 | 2; integer) \u2014 Pairs per row.
777
-
778
- - \`dense\` (boolean; literal) \u2014 Use tighter row spacing.
779
-
780
- - \`emptyText\` (string; bindable) \u2014 Empty-state text.
781
-
782
- - \`entries\` (array; bindable) \u2014 Declared label/value entries.
783
- - Items: object; literal
784
- - \`currency\` (string; literal) \u2014 ISO 4217 currency code.
785
- - \`decimals\` (number; literal; integer; min 0; max 20) \u2014 Fixed decimal places.
786
- - \`format\` (string; literal; values: "text" | "number" | "compact" | "percent" | "currency" | "bytes" | "duration" | "date" | "datetime" | "time" | "list" | "json" | "boolean") \u2014 Display format.
787
- - \`label\` (string; bindable) \u2014 Row label.
788
- - \`map\` (object; literal) \u2014 Map known displayed values to labels.
789
- - \`maxChars\` (number; literal; integer; min 1) \u2014 Maximum displayed characters.
790
- - \`mono\` (boolean; literal) \u2014 Render the value in monospace.
791
- - \`tone\` (string; literal; values: "default" | "muted" | "success" | "warning" | "error" | "info") \u2014 Displayed value tone.
792
- - \`transform\` (string; literal; values: "capitalize" | "title" | "upper" | "lower" | "humanize") \u2014 Text transform.
793
- - \`type\` (string; literal; values: "status") \u2014 Set to status to render a status pill.
794
- - \`unit\` (string; literal; values: "seconds" | "ms") \u2014 Numeric timestamp unit.
795
- - \`value\` (any; bindable) \u2014 Row value.
796
-
797
- - \`hideEmpty\` (boolean; literal) \u2014 Hide missing values.
798
-
799
- - \`humanizeKeys\` (boolean; literal) \u2014 Humanize object keys.
800
-
801
- - \`mono\` (boolean; literal) \u2014 Render shorthand values in monospace.
802
-
803
- - \`value\` (object; bindable) \u2014 Object whose keys become labels.
804
-
805
- ## Money
806
-
807
- A formatted currency amount.
808
-
809
- - Children: \`none\`
810
-
811
- Props:
812
-
813
- - \`currency\` (string; bindable) \u2014 ISO 4217 currency code.
814
-
815
- - \`decimals\` (number; literal; integer; min 0; max 20) \u2014 Fixed decimal places.
816
-
817
- - \`signed\` (boolean; literal) \u2014 Colour positive and negative values.
818
-
819
- - \`size\` (string; literal; values: "xs" | "sm" | "md" | "lg") \u2014 Displayed value size.
820
-
821
- - \`tone\` (string; literal; values: "default" | "muted" | "success" | "warning" | "error" | "info") \u2014 Displayed value tone.
822
-
823
- - \`value\` (number; bindable) \u2014 Currency amount.
824
-
825
- ## Stat
826
-
827
- One prominent value with a label and caption.
828
-
829
- - Children: \`none\`
830
-
831
- Props:
832
-
833
- - \`caption\` (any; bindable) \u2014 Caption below the value.
834
-
835
- - \`captionTransform\` (string; literal; values: "capitalize" | "title" | "upper" | "lower" | "humanize") \u2014 Caption transform.
836
-
837
- - \`currency\` (string; literal) \u2014 ISO 4217 currency code.
838
-
839
- - \`decimals\` (number; literal; integer; min 0; max 20) \u2014 Fixed decimal places.
840
-
841
- - \`format\` (string; literal; values: "text" | "number" | "compact" | "percent" | "currency" | "bytes" | "duration" | "date" | "datetime" | "time" | "list" | "json" | "boolean") \u2014 Display format.
842
-
843
- - \`label\` (string; bindable) \u2014 Label above the value.
844
-
845
- - \`maxChars\` (number; literal; integer; min 1) \u2014 Maximum displayed characters.
846
-
847
- - \`mono\` (boolean; literal) \u2014 Render the value in monospace.
848
-
849
- - \`tone\` (string; literal; values: "default" | "muted" | "success" | "warning" | "error" | "info") \u2014 Displayed value tone.
850
-
851
- - \`transform\` (string; literal; values: "capitalize" | "title" | "upper" | "lower" | "humanize") \u2014 Text transform.
852
-
853
- - \`unit\` (string; literal; values: "seconds" | "ms") \u2014 Numeric timestamp unit.
854
-
855
- - \`value\` (any; bindable) \u2014 Displayed value.
856
-
857
- ## StatusPill
858
-
859
- Semantic status pill for statuses, booleans, and HTTP codes.
860
-
861
- - Children: \`none\`
862
-
863
- Props:
864
-
865
- - \`format\` (string; literal; values: "text" | "number" | "compact" | "percent" | "currency" | "bytes" | "duration" | "date" | "datetime" | "time" | "list" | "json" | "boolean") \u2014 Display format.
866
-
867
- - \`label\` (any; bindable) \u2014 Displayed label.
868
-
869
- - \`maxChars\` (number; literal; integer; min 1) \u2014 Maximum displayed characters.
870
-
871
- - \`status\` (any; bindable) \u2014 Status value.
872
-
873
- - \`tone\` (string; literal; values: "neutral" | "info" | "success" | "warning" | "error") \u2014 Forced tone.
874
-
875
- - \`transform\` (string; literal; values: "capitalize" | "title" | "upper" | "lower" | "humanize") \u2014 Text transform.
876
-
877
- ## Table
878
-
879
- Tabular view of an array.
880
-
881
- - Children: \`none\`
882
- - Limits: \`{"renderedRows":100}\`
883
-
884
- Props:
885
-
886
- - \`columns\` (array; literal) \u2014 Literal field names or column definitions.
887
- - Items: union; literal
888
- - Variant 1: string; literal
889
- - Variant 2: object; literal
890
- - \`align\` (string; literal; values: "left" | "center" | "right") \u2014 Cell alignment.
891
- - \`currency\` (string; literal) \u2014 ISO 4217 currency code.
892
- - \`decimals\` (number; literal; integer; min 0; max 20) \u2014 Fixed decimal places.
893
- - \`format\` (string; literal; values: "text" | "number" | "compact" | "percent" | "currency" | "bytes" | "duration" | "date" | "datetime" | "time" | "list" | "json" | "boolean") \u2014 Display format.
894
- - \`header\` (string; literal) \u2014 Column heading.
895
- - \`key\` (string; literal; required) \u2014 Field name inside each row.
896
- - \`map\` (object; literal) \u2014 Map known displayed values to labels.
897
- - \`maxChars\` (number; literal; integer; min 1) \u2014 Maximum displayed characters.
898
- - \`mono\` (boolean; literal) \u2014 Render cells in monospace.
899
- - \`tone\` (string; literal; values: "default" | "muted" | "success" | "warning" | "error" | "info") \u2014 Displayed value tone.
900
- - \`transform\` (string; literal; values: "capitalize" | "title" | "upper" | "lower" | "humanize") \u2014 Text transform.
901
- - \`type\` (string; literal; values: "status") \u2014 Set to status to render status pills.
902
- - \`unit\` (string; literal; values: "seconds" | "ms") \u2014 Numeric timestamp unit.
903
-
904
- - \`dense\` (boolean; literal) \u2014 Use tighter rows.
905
-
906
- - \`emptyText\` (string; bindable) \u2014 Empty-state text.
907
-
908
- - \`items\` (array; bindable) \u2014 Rows to render.
909
- - Items: any; literal
910
-
911
- ## Text
912
-
913
- Body text with shared formatting.
914
-
915
- - Children: \`none\`
916
-
917
- Props:
918
-
919
- - \`currency\` (string; literal) \u2014 ISO 4217 currency code.
920
-
921
- - \`decimals\` (number; literal; integer; min 0; max 20) \u2014 Fixed decimal places.
922
-
923
- - \`format\` (string; literal; values: "text" | "number" | "compact" | "percent" | "currency" | "bytes" | "duration" | "date" | "datetime" | "time" | "list" | "json" | "boolean") \u2014 Display format.
924
-
925
- - \`maxChars\` (number; literal; integer; min 1) \u2014 Maximum displayed characters.
926
-
927
- - \`mono\` (boolean; literal) \u2014 Render in monospace.
928
-
929
- - \`muted\` (boolean; literal) \u2014 Shorthand for the muted tone.
930
-
931
- - \`size\` (string; literal; values: "xs" | "sm" | "md" | "lg") \u2014 Displayed value size.
932
-
933
- - \`text\` (any; bindable) \u2014 Value to display.
934
-
935
- - \`tone\` (string; literal; values: "default" | "muted" | "success" | "warning" | "error" | "info") \u2014 Displayed value tone.
936
-
937
- - \`transform\` (string; literal; values: "capitalize" | "title" | "upper" | "lower" | "humanize") \u2014 Text transform.
938
-
939
- - \`unit\` (string; literal; values: "seconds" | "ms") \u2014 Numeric timestamp unit.
940
-
941
- - \`weight\` (string; literal; values: "normal" | "medium" | "semibold") \u2014 Font weight.
942
-
943
- ## Timestamp
944
-
945
- ISO or epoch timestamp.
946
-
947
- - Children: \`none\`
948
-
949
- Props:
950
-
951
- - \`format\` (string; literal; values: "datetime" | "date" | "time" | "smart") \u2014 Timestamp format.
952
-
953
- - \`relative\` (boolean; literal) \u2014 Display relative time.
954
-
955
- - \`size\` (string; literal; values: "xs" | "sm" | "md" | "lg") \u2014 Displayed value size.
956
-
957
- - \`tone\` (string; literal; values: "default" | "muted" | "success" | "warning" | "error" | "info") \u2014 Displayed value tone.
958
-
959
- - \`unit\` (string; literal; values: "seconds" | "ms") \u2014 Numeric timestamp unit.
960
-
961
- - \`value\` (union; bindable) \u2014 ISO string or epoch number.
962
- - Variant 1: string; literal
963
- - Variant 2: number; literal
964
- `,"references/surface-feedback.md":`# Surface configuration and visual approval
965
-
966
- Use this flow for every newly authored workflow. The agent authors surfaces; the user chooses the experience and approves what they see.
967
-
968
- ## Choose before validation
969
-
970
- 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 to configure runtime widgets or keep the defaults. Do not end the chat run to ask.
971
- 2. If the user chooses configuration, ask for each node in each workflow whether to:
972
- - create a custom surface now;
973
- - attach a compatible existing surface; or
974
- - use the platform default.
975
- 3. Present only real existing surfaces found in project files or command output. Never invent a surface reference. Combine independent node choices into the fewest question-tool prompts the agent supports.
976
- 4. Read [surface authoring](surface-authoring.md) and only the component catalog pages needed for custom choices. Use expected output shape and the workflow's purpose to design the surface; do not ask the user to write component documents.
977
- 5. Create every custom candidate as a real Culvii \`Surface\` and attach it to its workflow step before the first \`culvii dev\`. "Candidate" describes its approval state, not a separate resource type. Attach selected existing surfaces now and leave default choices unchanged.
978
-
979
- Do not introduce a wait surface or pause merely to display output. A wait surface is valid only when the requested workflow already requires human input. Surface documents use only supported Culvii components and bindings; the temporary preview HTML described below is never placed in a \`.culvii.ts\` file.
980
-
981
- ## Validate and collect data
982
-
983
- Start one tracked \`culvii dev\` process after the workflow and all candidate surfaces exist. Fix every schema, prop, binding, slot, and cross-resource error reported by the watcher. Never preview an invalid candidate.
984
-
985
- Once the draft graph syncs successfully, run the [workflow feedback cycle](feedback-cycle.md). Use its successful node outputs as preview data. For an authored cron, webhook, or polling trigger, create a representative payload matching its real output shape and deliver it through the temporary manual-trigger conversion. This supplies the trigger's surface and downstream nodes without mocking or invoking the runtime trigger implementation. Sanitize private values and replace credentials, tokens, raw binary, and other secrets with harmless representative values.
986
-
987
- ## Visual approval loop
988
-
989
- For each custom candidate:
990
-
991
- 1. Create a tracked temporary directory outside the project and generate a self-contained HTML file that approximates the validated Culvii surface with its sanitized execution data. Use inline CSS and only minimal local JavaScript needed for visual interaction. Make no network requests. Escape untrusted text, do not embed credentials or raw binary, and label the page **Visual preview \u2014 Culvii runtime rendering may differ**.
992
- 2. Ask for permission before launching the local \`file://\` page in the user's browser. If the environment cannot open it, provide the local file path and keep the same chat run waiting for review; do not treat the surface as approved.
993
- 3. Ask through the native in-run question tool:
994
- - **Keep this widget** \u2014 accept the attached custom surface;
995
- - **Change it** \u2014 collect plain-language feedback in the same run; or
996
- - **Use the default** \u2014 detach/remove the candidate and keep the platform default.
997
- 4. For **Change it**, edit the real surface, wait for the active \`culvii dev\` watcher to validate and sync it, regenerate the HTML with the same data, and ask again. Never show a revision that failed validation.
998
- 5. For **Use the default**, remove the custom attachment/resource as appropriate and wait for \`culvii dev\` to validate the updated graph.
999
-
1000
- The HTML is a review aid, not a second validator and not a claim of pixel parity with the Culvii runtime. Component contracts and bindings remain authoritative through \`culvii dev\`.
1001
-
1002
- ## Finish
1003
-
1004
- Every node must end as accepted custom, selected existing, platform default, or explicitly skipped by the user. After the final workflow execution succeeds, delete only the tracked temporary preview directory and follow the development guide to stop the exact \`culvii dev\` process. Never report completion while a custom surface is awaiting review.
1005
- `,"references/surface-input-actions.md":`# Surface input and action components
1006
-
1007
- ## ApproveRejectBar
1008
-
1009
- Named approve/reject decision actions.
1010
-
1011
- - Children: \`none\`
1012
- - Interaction: \`multi-action\`
1013
- - Actions: \`{"allowed":["approve","reject"]}\`
1014
-
1015
- Props:
1016
-
1017
- - \`approveLabel\` (string; bindable) \u2014 Approve button label.
1018
-
1019
- - \`canDecide\` (boolean; bindable) \u2014 Whether the viewer may decide.
1020
-
1021
- - \`comment\` (string; bindable) \u2014 Current comment value.
1022
-
1023
- - \`commentRequired\` (boolean; bindable) \u2014 Require a comment before rejection.
1024
-
1025
- - \`decidedBy\` (string; bindable) \u2014 Recorded decider.
1026
-
1027
- - \`decision\` (string; bindable) \u2014 Recorded decision.
1028
-
1029
- - \`disabledReason\` (string; bindable) \u2014 Reason actions are disabled.
1030
-
1031
- - \`rejectLabel\` (string; bindable) \u2014 Reject button label.
1032
-
1033
- ## Button
1034
-
1035
- Single-action button.
1036
-
1037
- - Children: \`none\`
1038
- - Interaction: \`single-action\`
1039
-
1040
- Props:
1041
-
1042
- - \`disabled\` (boolean; bindable) \u2014 Disabled state.
1043
-
1044
- - \`label\` (string; bindable) \u2014 Button label.
1045
-
1046
- - \`variant\` (string; literal; values: "primary" | "default" | "danger") \u2014 Button variant.
1047
-
1048
- ## Checkbox
1049
-
1050
- Boolean form input.
1051
-
1052
- - Children: \`none\`
1053
- - Interaction: \`input\`
1054
-
1055
- Props:
1056
-
1057
- - \`description\` (string; bindable) \u2014 Helper text.
1058
-
1059
- - \`disabled\` (boolean; bindable) \u2014 Disabled state.
1060
-
1061
- - \`label\` (string; bindable) \u2014 Text beside the checkbox.
1062
-
1063
- ## Select
1064
-
1065
- Single-choice form input.
1066
-
1067
- - Children: \`none\`
1068
- - Interaction: \`input\`
1069
-
1070
- Props:
1071
-
1072
- - \`disabled\` (boolean; bindable) \u2014 Disabled state.
1073
-
1074
- - \`label\` (string; bindable) \u2014 Field label.
1075
-
1076
- - \`options\` (array; bindable) \u2014 Literal or bound options.
1077
- - Items: union; literal
1078
- - Variant 1: string; literal
1079
- - Variant 2: number; literal
1080
- - Variant 3: object; literal
1081
- - \`label\` (string; literal) \u2014 Displayed option label.
1082
- - \`value\` (union; literal; required) \u2014 Submitted option value.
1083
- - Variant 1: string; literal
1084
- - Variant 2: number; literal
1085
-
1086
- - \`placeholder\` (string; bindable) \u2014 Placeholder.
1087
-
1088
- ## TextArea
1089
-
1090
- Multi-line form input.
1091
-
1092
- - Children: \`none\`
1093
- - Interaction: \`input\`
1094
-
1095
- Props:
1096
-
1097
- - \`disabled\` (boolean; bindable) \u2014 Disabled state.
1098
-
1099
- - \`label\` (string; bindable) \u2014 Field label.
1100
-
1101
- - \`placeholder\` (string; bindable) \u2014 Placeholder.
1102
-
1103
- - \`rows\` (number; literal; integer; min 1) \u2014 Visible rows.
1104
-
1105
- ## TextField
1106
-
1107
- Single-line form input.
1108
-
1109
- - Children: \`none\`
1110
- - Interaction: \`input\`
1111
-
1112
- Props:
1113
-
1114
- - \`disabled\` (boolean; bindable) \u2014 Disabled state.
1115
-
1116
- - \`label\` (string; bindable) \u2014 Field label.
1117
-
1118
- - \`placeholder\` (string; bindable) \u2014 Placeholder.
1119
-
1120
- - \`type\` (string; literal; values: "text" | "number" | "email" | "url") \u2014 HTML input type.
1121
-
1122
- ## Reserved and rejected component types
1123
-
1124
- - \`Accordion\` \u2014 unsupported and rejected by validation.
1125
- - \`AgentRunPanel\` \u2014 unsupported and rejected by validation.
1126
- - \`CalendarEventCard\` \u2014 unsupported and rejected by validation.
1127
- - \`DatePicker\` \u2014 unsupported and rejected by validation.
1128
- - \`ErrorPanel\` \u2014 unsupported and rejected by validation.
1129
- - \`Icon\` \u2014 unsupported and rejected by validation.
1130
- - \`Image\` \u2014 unsupported and rejected by validation.
1131
- - \`List\` \u2014 unsupported and rejected by validation.
1132
- - \`Markdown\` \u2014 unsupported and rejected by validation.
1133
- - \`ProgressBar\` \u2014 unsupported and rejected by validation.
1134
- - \`RadioGroup\` \u2014 unsupported and rejected by validation.
1135
- - \`SlackMessageCard\` \u2014 unsupported and rejected by validation.
1136
- - \`SlackThread\` \u2014 unsupported and rejected by validation.
1137
- - \`Spacer\` \u2014 unsupported and rejected by validation.
1138
- - \`Spinner\` \u2014 unsupported and rejected by validation.
1139
- - \`Tabs\` \u2014 unsupported and rejected by validation.
1140
- - \`Timeline\` \u2014 unsupported and rejected by validation.
1141
- - \`ToolCallCard\` \u2014 unsupported and rejected by validation.
1142
- - \`Tree\` \u2014 unsupported and rejected by validation.
1143
-
1144
- ## Slot policies
1145
-
1146
- - Output: actions navigate; forms rejected.
1147
- - Wait: actions navigate, node.resume, node.stop; forms allowed.
1148
- `,"references/surface-layout.md":`# Surface layout components
1149
-
1150
- ## Card
1151
-
1152
- Bordered container with an optional header and status.
1153
-
1154
- - Children: \`single\`
1155
-
1156
- Props:
1157
-
1158
- - \`dense\` (boolean; literal) \u2014 Use tighter body padding.
1159
-
1160
- - \`map\` (object; literal) \u2014 Map known displayed values to labels.
1161
-
1162
- - \`status\` (any; bindable) \u2014 Status value used to derive the header pill.
1163
-
1164
- - \`statusLabel\` (any; bindable) \u2014 Header status label.
1165
-
1166
- - \`statusTone\` (string; literal; values: "neutral" | "info" | "success" | "warning" | "error") \u2014 Forced status tone.
1167
-
1168
- - \`subtitle\` (string; bindable) \u2014 Header subtitle.
1169
-
1170
- - \`title\` (string; bindable) \u2014 Header title.
1171
-
1172
- - \`transform\` (string; literal; values: "capitalize" | "title" | "upper" | "lower" | "humanize") \u2014 Status label transform.
1173
-
1174
- ## Divider
1175
-
1176
- Horizontal rule between content blocks.
1177
-
1178
- - Children: \`none\`
1179
-
1180
- Props:
1181
-
1182
- _No props._
1183
-
1184
- ## Form
1185
-
1186
- Groups wait-surface inputs and actions.
1187
-
1188
- - Children: \`list\`
1189
-
1190
- Props:
1191
-
1192
- - \`title\` (string; bindable) \u2014 Form heading.
1193
-
1194
- ## Grid
1195
-
1196
- Responsive equal-width columns.
1197
-
1198
- - Children: \`list\`
1199
-
1200
- Props:
1201
-
1202
- - \`columns\` (number; literal; values: 1 | 2 | 3 | 4; integer) \u2014 Column count.
1203
-
1204
- - \`gap\` (string; literal; values: "xs" | "sm" | "md" | "lg") \u2014 Spacing between children.
1205
-
1206
- ## Row
1207
-
1208
- Wrapping horizontal group.
1209
-
1210
- - Children: \`list\`
1211
-
1212
- Props:
1213
-
1214
- - \`align\` (string; literal; values: "start" | "center" | "end" | "baseline") \u2014 Cross-axis alignment.
1215
-
1216
- - \`gap\` (string; literal; values: "xs" | "sm" | "md" | "lg") \u2014 Spacing between children.
1217
-
1218
- - \`justify\` (string; literal; values: "between") \u2014 Set to between to push children apart.
1219
-
1220
- ## Section
1221
-
1222
- Labelled group with one child.
1223
-
1224
- - Children: \`single\`
1225
-
1226
- Props:
1227
-
1228
- - \`collapsible\` (boolean; literal) \u2014 Allow the section to be folded.
1229
-
1230
- - \`defaultOpen\` (boolean; literal) \u2014 Initial collapsible state.
1231
-
1232
- - \`description\` (string; bindable) \u2014 Section description.
1233
-
1234
- - \`title\` (string; bindable) \u2014 Section label.
1235
-
1236
- ## Stack
1237
-
1238
- Vertical stack and the default surface container.
1239
-
1240
- - Children: \`list\`
1241
-
1242
- Props:
1243
-
1244
- - \`gap\` (string; literal; values: "xs" | "sm" | "md" | "lg") \u2014 Spacing between children.
1245
- `,"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":`---
1246
- name: culvii
1247
- 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.
1248
- ---
1249
-
1250
- # Culvii authoring
1251
-
1252
- Build Culvii resources in TypeScript using public @culvii/kit APIs. This file routes you to the minimum detailed references needed for the task.
1253
-
1254
- ## Start here
1255
-
1256
- 1. Inspect the project's package.json, culvii.yaml, and existing *.culvii.ts files before generating code.
1257
- 2. Read [authoring files](references/authoring-files.md), then read only the task-specific references below.
1258
- 3. Never invent node types, component types, props, flags, or APIs. Open the generated reference first.
1259
- 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.
1260
- 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.
1261
-
1262
- 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.
1263
-
1264
- ## Missing required inputs
1265
-
1266
- - Gather every known blocking input before authoring placeholders. Ask them together in one interactive prompt, or the fewest batches allowed by the agent.
1267
- - 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.
1268
- - 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.
1269
- - 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.
1270
- - 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.
1271
- - 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.
1272
-
1273
- ## Task routing
1274
-
1275
- - Agents, models, secondary agents, permissions, and tools: [agents](references/agents.md) and [Kit API](references/kit-api.md).
1276
- - Workflows, steps, branching, errors, and references: [workflows](references/workflows.md), [runtime values](references/runtime-values.md), and [validation](references/validation.md).
1277
- - 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).
1278
- - CLI use: [development lifecycle](references/cli-guide.md), [workflow feedback cycle](references/feedback-cycle.md), and [exact CLI reference](references/cli-reference.md).
1279
- - Credentials and provider integrations: [integration selection](references/integrations.md).
1280
- - Node selection: [node index](references/nodes-index.md), then the exact page linked below.
1281
-
1282
- ## Node references
1283
-
1284
- - [\`core.agent\`](references/node-core-agent.md)
1285
- - [\`core.browserAutomation\`](references/node-core-browser-automation.md)
1286
- - [\`core.code\`](references/node-core-code.md)
1287
- - [\`core.http\`](references/node-core-http.md)
1288
- - [\`core.if\`](references/node-core-if.md)
1289
- - [\`core.jwt\`](references/node-core-jwt.md)
1290
- - [\`core.set\`](references/node-core-set.md)
1291
- - [\`cronTrigger\`](references/node-cron-trigger.md)
1292
- - [\`elasticsearch\`](references/node-elasticsearch.md)
1293
- - [\`gmail\`](references/node-gmail.md)
1294
- - [\`gmailTrigger\`](references/node-gmail-trigger.md)
1295
- - [\`googleCalendar\`](references/node-google-calendar.md)
1296
- - [\`googleDocs\`](references/node-google-docs.md)
1297
- - [\`manualTrigger\`](references/node-manual-trigger.md)
1298
- - [\`microsoftOutlook\`](references/node-microsoft-outlook.md)
1299
- - [\`microsoftOutlookTrigger\`](references/node-microsoft-outlook-trigger.md)
1300
- - [\`microsoftSharepoint\`](references/node-microsoft-sharepoint.md)
1301
- - [\`s3\`](references/node-s3.md)
1302
- - [\`slack\`](references/node-slack.md)
1303
- - [\`slackTrigger\`](references/node-slack-trigger.md)
1304
- - [\`twilio\`](references/node-twilio.md)
1305
- - [\`waitTimer\`](references/node-wait-timer.md)
1306
- - [\`webhookTrigger\`](references/node-webhook-trigger.md)
1307
-
1308
- ## Examples
1309
-
1310
- - [Agent and workflow](examples/agent-workflow.culvii.ts)
1311
- - [Output surface](examples/output-surface.culvii.ts)
1312
- - [Wait surface](examples/wait-surface.culvii.ts)
1313
- - [Complete workflow](examples/complete-workflow.culvii.ts)
1314
-
1315
- ## Safety
1316
-
1317
- 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.
1318
- `,".culvii-skill.json":`{
1319
- "schemaVersion": 1,
1320
- "name": "culvii",
1321
- "bundleHash": "687dba881f07be592c3ce200cefbccacd5e7aac67d122256075255f690563d10",
1322
- "generatorVersion": 1,
1323
- "sources": {
1324
- "@culvii/kit": "0.0.7",
1325
- "nodes": "1.0.0",
1326
- "surface-contract": "1.0.0",
1327
- "@culvii/cli": "0.0.8"
1328
- },
1329
- "files": {
1330
- "agents/openai.yaml": "80196c1dbde488639e31d4bbc0addcd253ba626ea0b3cb524d06ee1eabe3263b",
1331
- "examples/agent-workflow.culvii.ts": "934fcd2368ed8d8a02b7557dd2003b462def5f668021173a88cf7ab2393d9c5a",
1332
- "examples/complete-workflow.culvii.ts": "6b939592800bb5b94358fd7e8352a20499a16a31b2d310fcf2cd9609d9e12b66",
1333
- "examples/output-surface.culvii.ts": "1959d8bc5c987c32d6c21fa6f36a1eb70bea5a18742885dff85f353170645702",
1334
- "examples/wait-surface.culvii.ts": "ae533ae4cf2ed533bc333528bd971d65b4140be033e65025663f78bc99d77cf2",
1335
- "references/agents.md": "20cbcc3c184d91794f986217f293043c526d157c261a696e46ebf8e7744947c4",
1336
- "references/authoring-files.md": "ea93dafc36e6643a1040e430aec0fd41f1a5f93c5d24794ae3db0624b26dff53",
1337
- "references/cli-guide.md": "e7f6d69ec3cbc94fc584a64684883732e4e5ba6933fe1526dfe4b33e0eb19753",
1338
- "references/cli-reference.md": "e976edf090b5a8c1b8c4f9edc8df434a3c3c69348123ab0c4290547a971612f2",
1339
- "references/feedback-cycle.md": "0e5cf8142769d2ae6d8331cd0a04a6c1d54b8e9afb24b51eed8dfed4115d2c36",
1340
- "references/integrations.md": "9fa3db838b4e48d3aae2949012bbbfa7ce84b32779048d17c21ac4548482ee68",
1341
- "references/kit-api.md": "27ad6b8578dd2cf8606636f580a024551057171a74a4c8b5a3a12764f57cf263",
1342
- "references/node-core-agent.md": "09b0b3a5607dbdd06f3f463d140f9633a27b580e59b22f135f1bb349b7fcc0bf",
1343
- "references/node-core-browser-automation.md": "797f7dbd3374c2ea38de830ab2e9b08a2762e45a3cf56dad1ff274cf8109e7e7",
1344
- "references/node-core-code.md": "2768aa7a0fec5f12d716ece9727b038ee2a205647e7c41bd85f0139165bbbd51",
1345
- "references/node-core-http.md": "4799365201368c31d270644161a6e415d5ecfa25d9c75cf5e550330aff7679b4",
1346
- "references/node-core-if.md": "3298f6dbe803eae9e3a69eb7084b08f43a6c76e139e56051539c7603a705b7e1",
1347
- "references/node-core-jwt.md": "8828d11751ee88474f962a296cf29b279fa055ea2b95d9ee0362d211596bdedb",
1348
- "references/node-core-set.md": "511944327b31f9af70fbdcc5769c512a78129f901f98bb03ae3e464205b76468",
1349
- "references/node-cron-trigger.md": "ab958969a2a30b6643ad1d31a3241fed427d3db2e3871ea7ab68c0af4d4cc82b",
1350
- "references/node-elasticsearch.md": "b79e86b337e3391296036ac65a267b619ecdde5c34f7765c15abb8b5a292c5e5",
1351
- "references/node-gmail-trigger.md": "f359ea35b30edbc1d723aa3f9f013fa4aaec6082d114211c2dfc369b765e6e87",
1352
- "references/node-gmail.md": "ce3dc186d6483d12680ccd66b208fd32319aa8fc610ef8d11936f323c4526918",
1353
- "references/node-google-calendar.md": "5258b43f2434446723ccabfc1f7e023d251661a5d451ba5c639f96452737ebab",
1354
- "references/node-google-docs.md": "9c98ddd0f287fbc0322128c2c29707bf66b964557c796074dbfa7ace7e613ee1",
1355
- "references/node-manual-trigger.md": "4bebd22e2a76d6e90acb08ece0d88a6c7040f1a0ac11da298f712251194b7086",
1356
- "references/node-microsoft-outlook-trigger.md": "e74d4984e85e87f7a8be1f762e72fd77b2ddce984034126612484966e9429ab0",
1357
- "references/node-microsoft-outlook.md": "4767160228debe361881e6e5fc9cfda55add3b026728221e4a5bd2eb4be9fc87",
1358
- "references/node-microsoft-sharepoint.md": "7b89f9073da94a39f477ca8aeb2964dee0bb7dee99784841a403884a75c5a822",
1359
- "references/node-s3.md": "e25649b8103460ebf7c35c96626aa3c9e181dcb1ca2d8af3203afb801a6062ea",
1360
- "references/node-slack-trigger.md": "a0bdeb27a0d035fb85d25bcd59d54ba2da622be143333431c35a53b5728b7b65",
1361
- "references/node-slack.md": "e02d5c72948f311fb2847ce59ee11c9ba2a0fd02c59ba661236aa9540091aa3d",
1362
- "references/node-twilio.md": "337e1163ae54ebad046d7ba9030a8c54503ef39007396a0b5ee10598ed34ff6e",
1363
- "references/node-wait-timer.md": "72749e63f27b512aa6c51190fbc7a79195cdc37acd6c0f2305285012ce5fd06d",
1364
- "references/node-webhook-trigger.md": "b98b9cfc92b2e6eb5b1d75e651abccd022b7914d609052d7f7de4e588af45b5a",
1365
- "references/nodes-index.md": "de160eca230166f6b795f515a9e5884d3ba814b6600a5d412cc0c54a77d68cbb",
1366
- "references/runtime-values.md": "93dbe09b2f150ffec02a1d1e2bebdce3eda6e885f1daaae05354ecaceb41f038",
1367
- "references/surface-authoring.md": "b8b666d57f3101461604d94f2910e6c1fc9948411cc773b3b3916f5d89c8b32d",
1368
- "references/surface-display.md": "0afaf3c04fb2a7718e3bf2db0d55e968f7acab80c20f1d3a9a96282e6688a709",
1369
- "references/surface-feedback.md": "45009b5b4d050f0af2a186d478ae9a9964990d2e37f7e4e655d6a2e03ea6cb49",
1370
- "references/surface-input-actions.md": "54cd475120fcb650e4c876b9787905d47b87638483d73fc7dc7fb3a06305a8da",
1371
- "references/surface-layout.md": "3381fea6ed2ed16f4d1e9a9186aa853ecf834fb8f31a1bd09408e9c218e6b559",
1372
- "references/validation.md": "224ab2041ab6d823b8468b381e16a9823eb2a97b2ea33a812e89b2592ac72f68",
1373
- "references/workflows.md": "5988f86d8053c44c12decf4d43e98c13d2b3e22f124060198ede182b1e0fc648",
1374
- "SKILL.md": "8fc95b5ac2a0347d77d8155d67622033960392e85fb519dacdc67e864874c388"
1375
- }
1376
- }
1377
- `};export{n as CULVII_SKILL_BUNDLE,e as CULVII_SKILL_MANIFEST};