@controllerai/cli 0.2.21 → 0.2.22

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 (39) hide show
  1. package/README.md +6 -3
  2. package/dist/api/client.js +5 -6
  3. package/dist/api/client.js.map +1 -1
  4. package/dist/commands/agent.js +161 -45
  5. package/dist/commands/agent.js.map +1 -1
  6. package/dist/commands/integration.js +28 -2
  7. package/dist/commands/integration.js.map +1 -1
  8. package/dist/commands/skills.js +1 -0
  9. package/dist/commands/skills.js.map +1 -1
  10. package/dist/commands/templateSetup.js +42 -0
  11. package/dist/commands/templateSetup.js.map +1 -0
  12. package/dist/index.js +2 -0
  13. package/dist/index.js.map +1 -1
  14. package/dist/permissionTool.js +1 -1
  15. package/dist/permissionTool.js.map +1 -1
  16. package/package.json +1 -1
  17. package/skills/controllerai-agents/SKILL.md +4 -2
  18. package/skills/controllerai-integration-actions/SKILL.md +21 -16
  19. package/skills/controllerai-start/SKILL.md +2 -0
  20. package/skills/controllerai-start/references/mcp-tool-map.md +3 -1
  21. package/skills/controllerai-template-setup/SKILL.md +132 -0
  22. package/skills/controllerai-template-setup/agents/openai.yaml +4 -0
  23. package/skills/controllerai-workflows/references/command-map.md +1 -0
  24. package/skills/manifest.json +61 -44
  25. package/skills-mcp/controllerai-agents/SKILL.md +5 -5
  26. package/skills-mcp/controllerai-ai-nodes/SKILL.md +0 -1
  27. package/skills-mcp/controllerai-data/SKILL.md +0 -3
  28. package/skills-mcp/controllerai-data/references/data-rails.md +0 -2
  29. package/skills-mcp/controllerai-expressions/SKILL.md +0 -1
  30. package/skills-mcp/controllerai-flow-control/SKILL.md +0 -2
  31. package/skills-mcp/controllerai-flow-control/references/patterns.md +0 -1
  32. package/skills-mcp/controllerai-integration-actions/SKILL.md +20 -19
  33. package/skills-mcp/controllerai-runs/SKILL.md +0 -1
  34. package/skills-mcp/controllerai-start/SKILL.md +2 -0
  35. package/skills-mcp/controllerai-start/references/mcp-tool-map.md +3 -1
  36. package/skills-mcp/controllerai-template-setup/SKILL.md +10 -0
  37. package/skills-mcp/controllerai-triggers/SKILL.md +0 -3
  38. package/skills-mcp/controllerai-workflows/SKILL.md +0 -1
  39. package/skills-mcp/manifest.json +60 -49
@@ -0,0 +1,132 @@
1
+ ---
2
+ name: controllerai-template-setup
3
+ description: Complete an assisted Controller AI agent-template setup from the injected setup brief. Use when the system prompt contains a `## Template Setup` section with copied workflows, required connections, expected workflow tools, and a brief.
4
+ ---
5
+ <!-- generated from .claude/skills by cli/scripts/render-skills.mjs; edit the source -->
6
+
7
+ # Assisted template setup
8
+
9
+ ## Use this when
10
+
11
+ Use this skill first whenever the system prompt contains `## Template Setup`. That block is the authoritative inventory for one copied agent and its workflows; the brief decides which customer-specific values to collect, while the completion check decides whether every workflow is live and every expected workflow tool is attached.
12
+
13
+ Load `controllerai-node-config` for props, options, connections and node readiness, `controllerai-runs` for development checks, `controllerai-workflows` for validation and publication, and `controllerai-agents` for workflow-tool attachment. The setup procedure below owns their order.
14
+
15
+ ## How it works
16
+
17
+ Read the entire injected block before acting. Its exact sections are `## Template Setup`, `### Copied Workflows`, `### Required Connections`, `### Expected Workflow Tools`, `### Brief`, and `### Completion Rule`; the opening fields are `Template`, `Template description`, and `Agent`. Keep every agent ID, copied workflow ID, source workflow-template ID, node ID, `nodeSlug`, `flow ID`, tool description, and `requiresConfirmation` value paired with its displayed name. Never rediscover one of these targets by a similar name.
18
+
19
+ The copied workflows are development drafts. Setup is complete only after every workflow under `### Copied Workflows` has been configured, checked, and published, and every binding under `### Expected Workflow Tools` is attached to the copied agent. Publishing the workflows does not publish the agent.
20
+
21
+ ## Rules
22
+
23
+ 1. **Explain before asking.** Before any connection handoff or brief question, explain what the template will do in exactly two plain-language sentences, using the template description and brief without exposing IDs, slugs, props, or commands. The kickoff already approves the template's shape, so do not insert the generic new-build planning round.
24
+ 2. **Connections come first and are never optional.** Do not ask a brief decision while a connection required by the current graph is missing. A brief may offer an optional branch, but not an optional connection: if the user declines that branch, remove or disable the branch as the brief directs so the declined integration is no longer required.
25
+ 3. **Ask one brief decision at a time.** Read the target's current props and any option list before framing that decision, ask in user-facing labels, end the turn, and wait. Do not bundle the next decision into the same message.
26
+ 4. **Configure only what the brief asks for.** Do not infer channels, sheets, calendars, schedules, recipients, filters, defaults, or optional behavior from names or sample data. Preserve copied configuration that the brief does not direct you to change.
27
+ 5. **Never publish a placeholder.** Values such as `TODO`, example IDs, angle-bracket placeholders, setup notes, unset required props, and a declined branch that still needs its connection are blockers. Fix or remove the affected path before publication.
28
+ 6. **Use development evidence.** Check the smallest relevant node or flow after configuration, then the containing flow when an isolated node cannot prove wiring or expressions. A successful status without the intended output is not evidence.
29
+ 7. **Treat completion failure as the repair list.** A failed completion returns `Agent template setup is incomplete:` followed by one bullet per problem. Fix exactly those bullets and nothing else. Do not redesign the template, add speculative tools, or mark success around a failed completion command.
30
+
31
+ ## Procedure
32
+
33
+ ### Establish the setup
34
+
35
+ Run `cai template-setup status --json` when starting or resuming. Continue only for the active setup bound to this thread; a missing, failed, or abandoned state is a stop condition, and a completed state should be reported without repeating setup. Read the block inventory, then give the required two-sentence explanation before asking the user to do or choose anything.
36
+
37
+ ### Resolve every connection
38
+
39
+ For each unique `nodeSlug` in `### Required Connections`, inspect active accounts:
40
+
41
+ ```bash
42
+ cai connection list --integration <nodeSlug> --json
43
+ ```
44
+
45
+ If none exists, request the connection:
46
+
47
+ ```bash
48
+ cai connection request <nodeSlug> --json
49
+ ```
50
+
51
+ Tell the user in one plain sentence which service to connect and why, then stop and wait. If several accounts exist and the brief does not identify one, ask which displayed account to use and wait. After the user responds, verify with a fresh list; a connect card or a promise to connect is not authorization evidence.
52
+
53
+ ```bash
54
+ cai connection list --integration <nodeSlug> --json
55
+ ```
56
+
57
+ Bind the selected active connection to every matching node, using its copied workflow ID explicitly, and read readiness back:
58
+
59
+ ```bash
60
+ cai node set-connection <nodeId> --connection <connectionId> --workflow <workflowId> --json
61
+ cai node status <nodeId> --workflow <workflowId> --json
62
+ ```
63
+
64
+ Do not move to brief decisions until all connections still required by the graph are bound. When the user declines an optional branch, make the brief-directed removal or disablement first, then confirm the remaining nodes no longer require that integration.
65
+
66
+ ### Resolve brief decisions
67
+
68
+ Take the decisions in brief order. Before each question, inspect the exact target:
69
+
70
+ ```bash
71
+ cai node props <nodeId> --workflow <workflowId> --json
72
+ cai node options <nodeId> --prop <exactName> --workflow <workflowId> --json
73
+ ```
74
+
75
+ Fetch option lists only after the connection and upstream selectors they depend on exist. If a selector reveals later props, set it, read props again, and only then prepare the next question. Present the returned labels, retain their exact values, and after the user's answer make one write and read it back:
76
+
77
+ ```bash
78
+ cai node set <nodeId> --prop <exactName> --value '<returned-value>' --label '<returned-label>' --workflow <workflowId> --json
79
+ cai node props <nodeId> --workflow <workflowId> --json
80
+ cai node status <nodeId> --workflow <workflowId> --json
81
+ ```
82
+
83
+ For a free-form value, respect the prop's type and ask for it in normal assistant text. If the brief does not call for a decision, do not create one.
84
+
85
+ ### Check and publish every workflow
86
+
87
+ Use safe representative inputs on development and inspect the actual output:
88
+
89
+ ```bash
90
+ cai run node <nodeId> --inputs '<json>' --workflow <workflowId> --json
91
+ cai run flow <flowId> --inputs '<json>' --workflow <workflowId> --json
92
+ ```
93
+
94
+ Choose the node or flow that proves the configured decision; run the containing flow where wiring matters. Resolve every placeholder and readiness blocker, then publish each copied workflow listed in the block, including one with no expected tool:
95
+
96
+ ```bash
97
+ cai workflow publish --workflow <workflowId> --json
98
+ cai workflow status --workflow <workflowId> --json
99
+ ```
100
+
101
+ ### Attach the expected tools and complete
102
+
103
+ For every line under `### Expected Workflow Tools`, attach that exact `(workflow ID, flow ID)` pair to the block's agent ID. Preserve the supplied description; omit `--description` only when it is `(none)`. Include `--require-confirmation` exactly when `requiresConfirmation` is `true`, and omit it when false.
104
+
105
+ ```bash
106
+ cai agent add-workflow <agentId> --workflow-id <workflowId> --flow <flowId> --description '<description>' --require-confirmation --json
107
+ cai agent tools <agentId> --json
108
+ ```
109
+
110
+ Do not attach an extra flow and do not publish the agent. Once every expected pair reads back, run:
111
+
112
+ ```bash
113
+ cai template-setup complete --json
114
+ ```
115
+
116
+ Success requires the returned setup status to be `completed`. If it fails, the error lists every remaining problem as a bullet. Each bullet maps to one repair:
117
+
118
+ - `<workflow> has unpublished changes`: the development state differs from the live release; publish that workflow again.
119
+ - `<node> in <workflow> has no connected account`: bind an active connection to that node, then publish again.
120
+ - `<workflow / flowId> is not present in the published workflow`: the expected flow is missing from the live release; restore it and publish.
121
+ - `<workflow / flowId> is missing its workflow tool binding`: attach that exact pair to the agent.
122
+ - `<workflow / flowId> must require confirmation`: update the tool so confirmation is required.
123
+
124
+ Verify each repair with the same read-back commands, then run completion again.
125
+
126
+ ## Verify
127
+
128
+ Every connection still required by the final graph is active and bound; every brief decision reads back with the user's value; development evidence proves the configured path; each copied workflow has a live release; the agent tool list contains every expected workflow/flow pair with the supplied description and confirmation policy; and `cai template-setup complete` returns `completed`.
129
+
130
+ ## Report
131
+
132
+ Tell the user what the configured template now does, the choices applied, what the development checks proved, and that its workflows are live and its tools attached. Name any untested external effect or remaining blocker plainly; never call a setup complete unless the completion command did.
@@ -0,0 +1,4 @@
1
+ interface:
2
+ display_name: "Controller AI Template Setup"
3
+ short_description: "Finish guided agent-template setup"
4
+ default_prompt: "Use $controllerai-template-setup to finish the assisted template setup in this builder thread, following its brief one decision at a time."
@@ -50,6 +50,7 @@ cai trigger list|get|create|search|replay|test-events
50
50
  cai schema list|create|update|delete
51
51
  cai data collections|query|create|update|delete|import
52
52
  cai agent create|get|list|update|add-workflow|add-action|add-file|remove-tool|publish|conversation
53
+ cai template-setup status|complete
53
54
  ```
54
55
 
55
56
  Each family has its own skill; the map above covers CLI-to-MCP names for all of them.
@@ -1,29 +1,29 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "skillSetVersion": "2026.09.07.1",
3
+ "skillSetVersion": "2026.09.15.2",
4
4
  "minCliVersion": "0.2.0",
5
- "latestCliVersion": "0.2.21",
5
+ "latestCliVersion": "0.2.22",
6
6
  "skills": [
7
7
  {
8
8
  "name": "controllerai-start",
9
9
  "files": [
10
10
  {
11
11
  "path": "controllerai-start/SKILL.md",
12
- "url": "https://getcontroller.ai/skills/2026.09.07.1/controllerai-start/SKILL.md",
13
- "sha256": "0d79439019310289d9f1a19ceb153756f6cec6d6cf80e46c9da1caf33cc6b183",
14
- "size": 11209
12
+ "url": "https://getcontroller.ai/skills/2026.09.15.2/controllerai-start/SKILL.md",
13
+ "sha256": "5034c98ea02fe27fdb492a768c025deee7724a77e053e9d7ab204ce72b34cb08",
14
+ "size": 11414
15
15
  },
16
16
  {
17
17
  "path": "controllerai-start/agents/openai.yaml",
18
- "url": "https://getcontroller.ai/skills/2026.09.07.1/controllerai-start/agents/openai.yaml",
18
+ "url": "https://getcontroller.ai/skills/2026.09.15.2/controllerai-start/agents/openai.yaml",
19
19
  "sha256": "3240c24df8ba5ebfb67bc3e9dbce97f4a78384c352123210197a2dbf27c51150",
20
20
  "size": 226
21
21
  },
22
22
  {
23
23
  "path": "controllerai-start/references/mcp-tool-map.md",
24
- "url": "https://getcontroller.ai/skills/2026.09.07.1/controllerai-start/references/mcp-tool-map.md",
25
- "sha256": "f08325ad01ada76a2fac75c0969367167441931638dd9d91c87cce94cbf9620b",
26
- "size": 26595
24
+ "url": "https://getcontroller.ai/skills/2026.09.15.2/controllerai-start/references/mcp-tool-map.md",
25
+ "sha256": "d293310ed5fd7c7495579f717df0fa9ea59f27d5e494ca6bfb805f9975186ce9",
26
+ "size": 26919
27
27
  }
28
28
  ]
29
29
  },
@@ -32,21 +32,21 @@
32
32
  "files": [
33
33
  {
34
34
  "path": "controllerai-workflows/SKILL.md",
35
- "url": "https://getcontroller.ai/skills/2026.09.07.1/controllerai-workflows/SKILL.md",
35
+ "url": "https://getcontroller.ai/skills/2026.09.15.2/controllerai-workflows/SKILL.md",
36
36
  "sha256": "a2419265809b6f822ed22be4cfbfc1c56107e7afffffc41a0f527fd93018dc8a",
37
37
  "size": 9472
38
38
  },
39
39
  {
40
40
  "path": "controllerai-workflows/agents/openai.yaml",
41
- "url": "https://getcontroller.ai/skills/2026.09.07.1/controllerai-workflows/agents/openai.yaml",
41
+ "url": "https://getcontroller.ai/skills/2026.09.15.2/controllerai-workflows/agents/openai.yaml",
42
42
  "sha256": "6fb00a93a5f83fc2664679eb633ab07b477105472f8790fcf6dbcca913921a84",
43
43
  "size": 251
44
44
  },
45
45
  {
46
46
  "path": "controllerai-workflows/references/command-map.md",
47
- "url": "https://getcontroller.ai/skills/2026.09.07.1/controllerai-workflows/references/command-map.md",
48
- "sha256": "81cc467172c5e431f4d9a9b833e24dfed42392d679f766d4fc6d1ac0722c71e7",
49
- "size": 2091
47
+ "url": "https://getcontroller.ai/skills/2026.09.15.2/controllerai-workflows/references/command-map.md",
48
+ "sha256": "b99adeb3ff1e9c441805f533191c6b4435007ce8522d7965b4856f90db118e1a",
49
+ "size": 2126
50
50
  }
51
51
  ]
52
52
  },
@@ -55,19 +55,19 @@
55
55
  "files": [
56
56
  {
57
57
  "path": "controllerai-node-config/SKILL.md",
58
- "url": "https://getcontroller.ai/skills/2026.09.07.1/controllerai-node-config/SKILL.md",
58
+ "url": "https://getcontroller.ai/skills/2026.09.15.2/controllerai-node-config/SKILL.md",
59
59
  "sha256": "fb7ad0999e772079d7ce94f25d9fddca9b483b81a11bbaba47d618825d5585fe",
60
60
  "size": 11614
61
61
  },
62
62
  {
63
63
  "path": "controllerai-node-config/agents/openai.yaml",
64
- "url": "https://getcontroller.ai/skills/2026.09.07.1/controllerai-node-config/agents/openai.yaml",
64
+ "url": "https://getcontroller.ai/skills/2026.09.15.2/controllerai-node-config/agents/openai.yaml",
65
65
  "sha256": "7fbd6f0c1f9ea40c41051d532736a4718895cfa397608a2c716300bcf4256df1",
66
66
  "size": 242
67
67
  },
68
68
  {
69
69
  "path": "controllerai-node-config/references/prop-and-readiness.md",
70
- "url": "https://getcontroller.ai/skills/2026.09.07.1/controllerai-node-config/references/prop-and-readiness.md",
70
+ "url": "https://getcontroller.ai/skills/2026.09.15.2/controllerai-node-config/references/prop-and-readiness.md",
71
71
  "sha256": "6a1aa046bac6c5f1a68cbe242bdeb584f9a01e2de7248742460064a4d2708f75",
72
72
  "size": 5583
73
73
  }
@@ -78,19 +78,19 @@
78
78
  "files": [
79
79
  {
80
80
  "path": "controllerai-expressions/SKILL.md",
81
- "url": "https://getcontroller.ai/skills/2026.09.07.1/controllerai-expressions/SKILL.md",
81
+ "url": "https://getcontroller.ai/skills/2026.09.15.2/controllerai-expressions/SKILL.md",
82
82
  "sha256": "01240f493ec5bbd1ed562f988d243e3797577eee5ccc9d207f8bc45485b99108",
83
83
  "size": 10310
84
84
  },
85
85
  {
86
86
  "path": "controllerai-expressions/agents/openai.yaml",
87
- "url": "https://getcontroller.ai/skills/2026.09.07.1/controllerai-expressions/agents/openai.yaml",
87
+ "url": "https://getcontroller.ai/skills/2026.09.15.2/controllerai-expressions/agents/openai.yaml",
88
88
  "sha256": "280d1f4d0a44cb5cfd3e5649e0a123b91b57b1484dcbc3a02ace988233234bc3",
89
89
  "size": 249
90
90
  },
91
91
  {
92
92
  "path": "controllerai-expressions/references/dsl-and-recipes.md",
93
- "url": "https://getcontroller.ai/skills/2026.09.07.1/controllerai-expressions/references/dsl-and-recipes.md",
93
+ "url": "https://getcontroller.ai/skills/2026.09.15.2/controllerai-expressions/references/dsl-and-recipes.md",
94
94
  "sha256": "efe4a5eba0ea7636387443af0a6cc082a41209404b92c3af5c8a029075db70f6",
95
95
  "size": 5197
96
96
  }
@@ -101,19 +101,19 @@
101
101
  "files": [
102
102
  {
103
103
  "path": "controllerai-flow-control/SKILL.md",
104
- "url": "https://getcontroller.ai/skills/2026.09.07.1/controllerai-flow-control/SKILL.md",
104
+ "url": "https://getcontroller.ai/skills/2026.09.15.2/controllerai-flow-control/SKILL.md",
105
105
  "sha256": "c535a1ff61cc65cca53af083081935dc8672f7ce5d048dbb29334808428feec3",
106
106
  "size": 11563
107
107
  },
108
108
  {
109
109
  "path": "controllerai-flow-control/agents/openai.yaml",
110
- "url": "https://getcontroller.ai/skills/2026.09.07.1/controllerai-flow-control/agents/openai.yaml",
110
+ "url": "https://getcontroller.ai/skills/2026.09.15.2/controllerai-flow-control/agents/openai.yaml",
111
111
  "sha256": "164adf3b887bf9f67bba9cd210b5b49935c29ea0f52f76325fe5df517d279592",
112
112
  "size": 229
113
113
  },
114
114
  {
115
115
  "path": "controllerai-flow-control/references/patterns.md",
116
- "url": "https://getcontroller.ai/skills/2026.09.07.1/controllerai-flow-control/references/patterns.md",
116
+ "url": "https://getcontroller.ai/skills/2026.09.15.2/controllerai-flow-control/references/patterns.md",
117
117
  "sha256": "f1a718de837dc541e58914f40b4a89e6e81ba80afac37731e381db73a4712d90",
118
118
  "size": 4901
119
119
  }
@@ -124,19 +124,19 @@
124
124
  "files": [
125
125
  {
126
126
  "path": "controllerai-runs/SKILL.md",
127
- "url": "https://getcontroller.ai/skills/2026.09.07.1/controllerai-runs/SKILL.md",
127
+ "url": "https://getcontroller.ai/skills/2026.09.15.2/controllerai-runs/SKILL.md",
128
128
  "sha256": "5eeda1f95f8c18c12b968d6c2ea9008c2dd99d8953268c4ffd06652f43a91516",
129
129
  "size": 9196
130
130
  },
131
131
  {
132
132
  "path": "controllerai-runs/agents/openai.yaml",
133
- "url": "https://getcontroller.ai/skills/2026.09.07.1/controllerai-runs/agents/openai.yaml",
133
+ "url": "https://getcontroller.ai/skills/2026.09.15.2/controllerai-runs/agents/openai.yaml",
134
134
  "sha256": "63180f12974e19ce7b714695944608760e4132bfb88947543e52616098a88f5c",
135
135
  "size": 234
136
136
  },
137
137
  {
138
138
  "path": "controllerai-runs/references/debugging.md",
139
- "url": "https://getcontroller.ai/skills/2026.09.07.1/controllerai-runs/references/debugging.md",
139
+ "url": "https://getcontroller.ai/skills/2026.09.15.2/controllerai-runs/references/debugging.md",
140
140
  "sha256": "341f9e056445bdffdcc67771fd62b28fb2125a661d5d8a5c4fb16bcac57417c0",
141
141
  "size": 3127
142
142
  }
@@ -147,19 +147,19 @@
147
147
  "files": [
148
148
  {
149
149
  "path": "controllerai-triggers/SKILL.md",
150
- "url": "https://getcontroller.ai/skills/2026.09.07.1/controllerai-triggers/SKILL.md",
150
+ "url": "https://getcontroller.ai/skills/2026.09.15.2/controllerai-triggers/SKILL.md",
151
151
  "sha256": "c8a88bb69a0e032f1fd2716e1a2cd0690e62ae0b9bb996bf30643d4bd3b8fab2",
152
152
  "size": 11800
153
153
  },
154
154
  {
155
155
  "path": "controllerai-triggers/agents/openai.yaml",
156
- "url": "https://getcontroller.ai/skills/2026.09.07.1/controllerai-triggers/agents/openai.yaml",
156
+ "url": "https://getcontroller.ai/skills/2026.09.15.2/controllerai-triggers/agents/openai.yaml",
157
157
  "sha256": "56aa1bd33e54045d88002ade0c420be7bca37ac39433e6eedccef2e22bbd9515",
158
158
  "size": 239
159
159
  },
160
160
  {
161
161
  "path": "controllerai-triggers/references/lifecycle.md",
162
- "url": "https://getcontroller.ai/skills/2026.09.07.1/controllerai-triggers/references/lifecycle.md",
162
+ "url": "https://getcontroller.ai/skills/2026.09.15.2/controllerai-triggers/references/lifecycle.md",
163
163
  "sha256": "4dce6484b6abaa0eaf4ddbe366e60480180fc5b5aeb7e3c975bbe316b88dc0e5",
164
164
  "size": 3340
165
165
  }
@@ -170,19 +170,19 @@
170
170
  "files": [
171
171
  {
172
172
  "path": "controllerai-data/SKILL.md",
173
- "url": "https://getcontroller.ai/skills/2026.09.07.1/controllerai-data/SKILL.md",
173
+ "url": "https://getcontroller.ai/skills/2026.09.15.2/controllerai-data/SKILL.md",
174
174
  "sha256": "1418b287af30968634c69dbdbd54d22354f5f79f52389e6d1c94a87421c20e78",
175
175
  "size": 12059
176
176
  },
177
177
  {
178
178
  "path": "controllerai-data/agents/openai.yaml",
179
- "url": "https://getcontroller.ai/skills/2026.09.07.1/controllerai-data/agents/openai.yaml",
179
+ "url": "https://getcontroller.ai/skills/2026.09.15.2/controllerai-data/agents/openai.yaml",
180
180
  "sha256": "5c54b0a714086088213c679fb904a69a599374847f9aa1d6c0756172c2a2f227",
181
181
  "size": 219
182
182
  },
183
183
  {
184
184
  "path": "controllerai-data/references/data-rails.md",
185
- "url": "https://getcontroller.ai/skills/2026.09.07.1/controllerai-data/references/data-rails.md",
185
+ "url": "https://getcontroller.ai/skills/2026.09.15.2/controllerai-data/references/data-rails.md",
186
186
  "sha256": "0c03f25a099d168b8ae1fe54087ce59d06fcfc8631046927a996a88f0c4f9835",
187
187
  "size": 2819
188
188
  }
@@ -193,19 +193,19 @@
193
193
  "files": [
194
194
  {
195
195
  "path": "controllerai-ai-nodes/SKILL.md",
196
- "url": "https://getcontroller.ai/skills/2026.09.07.1/controllerai-ai-nodes/SKILL.md",
196
+ "url": "https://getcontroller.ai/skills/2026.09.15.2/controllerai-ai-nodes/SKILL.md",
197
197
  "sha256": "4e4bdf53e300adedf5e03f282687d0d20e200baf056cd59bf8df98d7b8b21403",
198
198
  "size": 8940
199
199
  },
200
200
  {
201
201
  "path": "controllerai-ai-nodes/agents/openai.yaml",
202
- "url": "https://getcontroller.ai/skills/2026.09.07.1/controllerai-ai-nodes/agents/openai.yaml",
202
+ "url": "https://getcontroller.ai/skills/2026.09.15.2/controllerai-ai-nodes/agents/openai.yaml",
203
203
  "sha256": "3ba8b8bb6f0cd4b0d5675ebda0af10bb79dc7a42e394eb98479343c83da92599",
204
204
  "size": 256
205
205
  },
206
206
  {
207
207
  "path": "controllerai-ai-nodes/references/selection-and-testing.md",
208
- "url": "https://getcontroller.ai/skills/2026.09.07.1/controllerai-ai-nodes/references/selection-and-testing.md",
208
+ "url": "https://getcontroller.ai/skills/2026.09.15.2/controllerai-ai-nodes/references/selection-and-testing.md",
209
209
  "sha256": "66b235b9e81645ab877b31443505c7b07ea3f2e5a357053f266c121415f8cf5c",
210
210
  "size": 3111
211
211
  }
@@ -216,13 +216,13 @@
216
216
  "files": [
217
217
  {
218
218
  "path": "controllerai-integration-actions/SKILL.md",
219
- "url": "https://getcontroller.ai/skills/2026.09.07.1/controllerai-integration-actions/SKILL.md",
220
- "sha256": "855556937687acc9dbfc22f65f75e98fb9974838776b5c53414193e19b490b7b",
221
- "size": 8764
219
+ "url": "https://getcontroller.ai/skills/2026.09.15.2/controllerai-integration-actions/SKILL.md",
220
+ "sha256": "6c8714ec7a700961e0d0f10f842396c6da2a23fdaebb7d3c6fd110676b23a1d1",
221
+ "size": 10401
222
222
  },
223
223
  {
224
224
  "path": "controllerai-integration-actions/agents/openai.yaml",
225
- "url": "https://getcontroller.ai/skills/2026.09.07.1/controllerai-integration-actions/agents/openai.yaml",
225
+ "url": "https://getcontroller.ai/skills/2026.09.15.2/controllerai-integration-actions/agents/openai.yaml",
226
226
  "sha256": "82ee62aa48a644e658c9bb6a78c417dc15eb4f3ec9f4abc9081b6d24d16fe92d",
227
227
  "size": 262
228
228
  }
@@ -233,23 +233,40 @@
233
233
  "files": [
234
234
  {
235
235
  "path": "controllerai-agents/SKILL.md",
236
- "url": "https://getcontroller.ai/skills/2026.09.07.1/controllerai-agents/SKILL.md",
237
- "sha256": "5dadcac767c9f2e7a701081d38e1e1d5350fd2cf2f273dd3ee6d5be818371124",
238
- "size": 11539
236
+ "url": "https://getcontroller.ai/skills/2026.09.15.2/controllerai-agents/SKILL.md",
237
+ "sha256": "b2424b525d7ae8b80e6f23bd9b8b8c3536e6f34cc6d9abdf92fcc6df898dc1e9",
238
+ "size": 12167
239
239
  },
240
240
  {
241
241
  "path": "controllerai-agents/agents/openai.yaml",
242
- "url": "https://getcontroller.ai/skills/2026.09.07.1/controllerai-agents/agents/openai.yaml",
242
+ "url": "https://getcontroller.ai/skills/2026.09.15.2/controllerai-agents/agents/openai.yaml",
243
243
  "sha256": "f4684ec904f3ebb051bb48460375756899c3316fbb16304aad5fff3d89692b09",
244
244
  "size": 293
245
245
  },
246
246
  {
247
247
  "path": "controllerai-agents/references/instructions-and-versioning.md",
248
- "url": "https://getcontroller.ai/skills/2026.09.07.1/controllerai-agents/references/instructions-and-versioning.md",
248
+ "url": "https://getcontroller.ai/skills/2026.09.15.2/controllerai-agents/references/instructions-and-versioning.md",
249
249
  "sha256": "88b059e74aef03ccb12a53815d1090e5449090ff6dfd863b6cef5a12b434cb65",
250
250
  "size": 5644
251
251
  }
252
252
  ]
253
+ },
254
+ {
255
+ "name": "controllerai-template-setup",
256
+ "files": [
257
+ {
258
+ "path": "controllerai-template-setup/SKILL.md",
259
+ "url": "https://getcontroller.ai/skills/2026.09.15.2/controllerai-template-setup/SKILL.md",
260
+ "sha256": "6ed665a2b33f8197fb990a30c296a69ab1d0e334bd10998e851508fa99d2d603",
261
+ "size": 9316
262
+ },
263
+ {
264
+ "path": "controllerai-template-setup/agents/openai.yaml",
265
+ "url": "https://getcontroller.ai/skills/2026.09.15.2/controllerai-template-setup/agents/openai.yaml",
266
+ "sha256": "0abb1b4691e3163eb6c2f27404ce3512aabf86d048f0eedbac587415004146e3",
267
+ "size": 275
268
+ }
269
+ ]
253
270
  }
254
271
  ],
255
272
  "surfaces": {
@@ -16,7 +16,7 @@ Direct actions belong to `controllerai-integration-actions`; the workflows behin
16
16
 
17
17
  ## How it works
18
18
 
19
- **What an agent is.** A person chats with it; it reasons, reads conversation attachments and reference knowledge, calls tools, and creates files for the user. It is the right shape for judgment, conversation and file handling; deterministic business rules, custom workflow data and multi-step processing belong in workflow tools it calls, and one existing app operation is a direct action.
19
+ **What an agent is.** A person chats with it; it reasons, reads conversation attachments and reference knowledge, calls tools, and creates files for the user. It is the right shape for judgment, conversation and file handling; deterministic business rules, custom workflow data and multi-step processing belong in workflow tools it calls, and one catalog-marked operation from a provider integration or native registry service is a direct action. Both direct-action sources follow the same attachment and approval rules; a native action may not need a connection.
20
20
 
21
21
  **One draft, immutable versions.** Editing changes only the mutable draft, and saving the draft updates the owner-only Test environment at once. Publishing snapshots the display name, instructions, tool identities, descriptions, approval policies and knowledge files into a new immutable version, moves the live pointer, and restamps every existing live conversation to it; that cutover interrupts in-flight answers and expires pending approvals. The runtime model is not part of the snapshot. There is no rollback: a bad version is corrected forward.
22
22
 
@@ -32,7 +32,9 @@ Direct actions belong to `controllerai-integration-actions`; the workflows behin
32
32
 
33
33
  **Three kinds of files.** Conversation attachments belong to one chat. Knowledge is versioned reference material in the draft: text types only (`txt`, `md`, `json`, `csv`, `html`, `xml`), each added once under the name the agent should see. When the user asks for a PDF or another unsupported format, store a supported text type under the plain requested name and say why; a name that still carries the wrong extension is not the same document. Shared runtime files are live workspace state, visible without a publish, and no substitute for an upload. Paths come from returned metadata; runtime mounts can prefix them.
34
34
 
35
- **Live-bound state.** Enabling or disabling is runtime state, independent of publication: disabling pauses live use, while the owner's Test conversations still work. A workflow publish changes every live agent that follows that workflow without an agent publish, and live workflow resolution is cached per session, so an in-flight turn may finish on the prior release. A direct action's connection is a live grant: rebinding redirects it and revocation or detachment blocks it immediately; detachment still needs a later agent publish to remove the tool from the published list.
35
+ **Live-bound state.** Enabling or disabling is runtime state, independent of publication: disabling pauses live use, while the owner's Test conversations still work. A workflow publish changes every live agent that follows that workflow without an agent publish, and live workflow resolution is cached per session, so an in-flight turn may finish on the prior release. When a direct action needs a connection, that connection is a live grant: rebinding redirects it and revocation blocks it immediately. Detachment blocks every direct action immediately and still needs a later agent publish to remove the tool from the published list.
36
+
37
+ **Slack approvals.** Approval requests can also go to Slack through `slackRoute`. Routes are draft tool settings published with the agent like approval settings. Test conversations use the draft; live ones use the published version. Only the connection owner and configured approvers can answer in Slack; the app's approval card still works.
36
38
 
37
39
  **Runtime usage.** Test and live conversations consume the organization's runtime usage and cause the connected providers' side effects; the builder's own subscription pays only for building.
38
40
 
@@ -63,8 +65,7 @@ A draft is private and by default enabled on creation, so the user can open it a
63
65
  ### Attach tools and knowledge
64
66
 
65
67
  - `run_flow` — `flowId`, `confirmLive`, `inputs`, `target`, `waitSeconds`, `workflowId`
66
- - `agent_tool_workflow_add` — `agentId`, `description`, `flow`, `requireConfirmation`, `workflowId`
67
- - `agent_tool_workflow_add` — `agentId`, `description`, `flow`, `requireConfirmation`, `workflowId`
68
+ - `agent_tool_workflow_add` — `agentId`, `description`, `flow`, `requireConfirmation`, `workflowId`, `slackRoute`
68
69
  - `agent_knowledge_file_add` — `agentId`, `content`, `name`, `type` / `agent_workspace_file_add` — `agentId`, `content`, `name`, `space`, `type`
69
70
  - `agent_tool_list` — `agentId`
70
71
  - `agent_file_list` — `agentId`, `cursor`, `environment`, `folderPrefix`, `limit`, `live`, `search`, `space`
@@ -101,7 +102,6 @@ Publish an attached workflow only when its verified development state must go li
101
102
 
102
103
  ### Runtime state
103
104
 
104
- - `agent_update` — `agentId`, `instructions`, `name` / `agent_set_enabled` — `agentId`, `enabled`
105
105
  - `agent_update` — `agentId`, `instructions`, `name` / `agent_set_enabled` — `agentId`, `enabled`
106
106
  - `agent_delete` — `agentId`
107
107
 
@@ -56,7 +56,6 @@ A conversational assistant with tools and knowledge is an agent (`controllerai-a
56
56
  - `node_prop_set` — `nodeId`, `js`, `label`, `prop`, `rawExpressionJson`, `value`, `workflowId`, `valueJson`
57
57
  - `expr_context` — `nodeId`, `methods`, `prop`, `workflowId`
58
58
  - `node_prop_set` — `nodeId`, `js`, `label`, `prop`, `rawExpressionJson`, `value`, `workflowId`, `valueJson`
59
- - `node_prop_set` — `nodeId`, `js`, `label`, `prop`, `rawExpressionJson`, `value`, `workflowId`, `valueJson`
60
59
 
61
60
  The query is a label substring, not a preference: search a family name, then judge the returned options by cost, quality, latency and constraints. The schema step applies only when downstream nodes need fields.
62
61
 
@@ -69,7 +69,6 @@ The update is a patch: omitted fields keep their values. A `get` of a missing re
69
69
 
70
70
  ### Delete many
71
71
 
72
- - `data_record_delete_many` — `all`, `env`, `recordIds`, `type`, `workflowId`
73
72
  - `data_record_delete_many` — `all`, `env`, `recordIds`, `type`, `workflowId`
74
73
 
75
74
  Pass exactly one of `recordIds` or `all: true`; there is no confirmation parameter, which changes nothing about needing the user's intent.
@@ -77,7 +76,6 @@ Soft deletes have no undo. On the live store the published workflow sees the cha
77
76
 
78
77
  ### Import a CSV
79
78
 
80
- - `data_record_import_commit` — `env`, `content`, `type`, `workflowId` / `data_record_import_validate` — `env`, `content`, `type`, `workflowId`
81
79
  - `data_record_import_commit` — `env`, `content`, `type`, `workflowId` / `data_record_import_validate` — `env`, `content`, `type`, `workflowId`
82
80
 
83
81
  The CSV travels inline as `content`; `data_record_import_validate` (`type`, `content`, `env`) is the dry run, and `data_record_import_commit` with the same arguments writes.
@@ -98,7 +96,6 @@ For a CRM, tracker or lookup table that flows and agents will call: define each
98
96
 
99
97
  ### Diagnose development versus live
100
98
 
101
- - `data_collection_list` — `env`, `workflowId`
102
99
  - `data_collection_list` — `env`, `workflowId`
103
100
  - `data_record_query` — `env`, `limit`, `offset`, `query`, `type`, `workflowId`
104
101
 
@@ -38,8 +38,6 @@ Resolve the exact workflow, store, type and records before any of these. A schem
38
38
  If a manual run passes but a trigger or agent tool does not, compare the two stores:
39
39
 
40
40
  - `data_collection_list` — `env`, `workflowId`
41
- - `data_collection_list` — `env`, `workflowId`
42
- - `data_record_query` — `env`, `limit`, `offset`, `query`, `type`, `workflowId`
43
41
  - `data_record_query` — `env`, `limit`, `offset`, `query`, `type`, `workflowId`
44
42
 
45
43
  No live collections usually means no publish since a store-eligible schema existed. An empty live collection with a populated development one usually means the data was never promoted or was cleared since. Confirm with publish status, the live schema and record history; different counts are normal until data is intentionally written on both stores.
@@ -70,7 +70,6 @@ The setter fetches the prop's metadata, enables a catalog-only optional prop whe
70
70
 
71
71
  - `expr_validate` — `nodeId`, `js`, `mode`, `prop`, `workflowId`
72
72
  - `node_only_when_set` — `nodeId`, `clear`, `groups`, `js`, `workflowId`
73
- - `node_only_when_set` — `nodeId`, `clear`, `groups`, `js`, `workflowId`
74
73
  - `branch_update` — `nodeId`, `conditionJson`, `js`, `name`, `branchId`, `workflowId`
75
74
 
76
75
  A node guard takes one boolean expression, or groups where each inner list is AND and the outer list is OR; a root `&&` or `||` inside one expression is not supported, so compound guards use groups. Branch conditions use the same grouped shape, each string compiled separately. Make a missing number fail a comparison with a same-type boundary: `(flow.unitsLeft ?? 5) < 5`.
@@ -50,7 +50,6 @@ A fresh If/Else ships with one blank `If` branch and an Else; the blank conditio
50
50
  - `expr_context` — `nodeId`, `methods`, `prop`, `workflowId`
51
51
  - `expr_validate` — `nodeId`, `js`, `mode`, `prop`, `workflowId`
52
52
  - `node_only_when_set` — `nodeId`, `clear`, `groups`, `js`, `workflowId`
53
- - `node_only_when_set` — `nodeId`, `clear`, `groups`, `js`, `workflowId`
54
53
 
55
54
  `expr_validate` takes `mode: "onlyWhen"` and no `prop`. `node_only_when_set` takes `js` for one expression or `groups` as the parsed arrays, for example `groups: [["flow.email.isNotEmpty()", "flow.units < 5"], ["flow.override === true"]]`; pass `clear: true` only when removing the guard is the user's intent.
56
55
 
@@ -72,7 +71,6 @@ Find the control component with `controllerai-node-config`, then read the branch
72
71
  - `node_get` — `nodeId`, `workflowId`
73
72
  - `flow_for_each_scaffold` — `continueOnError`, `flow`, `from`, `itemField`, `itemName`, `itemType`, `listField`, `listJs`, `maxItems`, `name`, `sourceOutput`, `workflowId`
74
73
  - `node_prop_set` — `nodeId`, `js`, `label`, `prop`, `rawExpressionJson`, `value`, `workflowId`, `valueJson`
75
- - `node_prop_set` — `nodeId`, `js`, `label`, `prop`, `rawExpressionJson`, `value`, `workflowId`, `valueJson`
76
74
 
77
75
  `sourceOutput` is the exact `outputs[].id` of the selected node, never a display name, and there is no first-output default (branch and error outputs included). When the whole output is the list, omit the list selectors; for a nested list pass `listField` with the dot path below `.data`; reserve `listJs` for an exact advanced expression whose shape you took from the context; the two are mutually exclusive. `itemField` (an array of `id:type[:display]` strings) is only for creating a new `custom.*` item type; stored records use `dataRecord.custom.*`. Set `maxItems` on purpose when the requirement differs from 500, decide `continueOnError` explicitly, then read the returned warnings and follow `nextSteps` in order; a list/item type mismatch means created but unverified. In mappings, `item` exists only where the context exposes it; inside the body flow the item is `flow.<itemInput>`; aggregate results are iteration records with child outputs under `outputs`.
78
76
 
@@ -58,7 +58,6 @@ The scaffold creates the item flow, its typed item input, the loop node and the
58
58
  - `node_prop_list` — `nodeId`, `workflowId`
59
59
  - `node_prop_set` — `nodeId`, `js`, `label`, `prop`, `rawExpressionJson`, `value`, `workflowId`, `valueJson`
60
60
  - `node_connect` — `flow`, `from`, `output`, `to`, `workflowId`
61
- - `node_connect` — `flow`, `from`, `output`, `to`, `workflowId`
62
61
  - `node_add` — `after`, `connection`, `enableProp`, `flow`, `key`, `name`, `node`, `output`, `props`, `workflowId`
63
62
 
64
63
  Set `pathDataType` from the returned options once `chooseActivePath` reveals it. Repeat the tail connection for every type-compatible exclusive path; if the shared action already exists, connect it after Join Paths instead of adding a replacement. `chooseActivePath` allows at most one active input and stops the flow when none is active unless `continueIfNoActivePath` is enabled (then it passes null); after a Router whose routes can overlap use `passThrough`, which returns one field per connected input with the blocked ones null. Run one test per branch and stop after all pass.