@controllerai/cli 0.2.21 → 0.2.23
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.
- package/README.md +6 -3
- package/dist/api/client.js +5 -6
- package/dist/api/client.js.map +1 -1
- package/dist/commands/agent.js +178 -45
- package/dist/commands/agent.js.map +1 -1
- package/dist/commands/integration.js +28 -2
- package/dist/commands/integration.js.map +1 -1
- package/dist/commands/skills.js +1 -0
- package/dist/commands/skills.js.map +1 -1
- package/dist/commands/templateSetup.js +42 -0
- package/dist/commands/templateSetup.js.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/permissionTool.js +1 -1
- package/dist/permissionTool.js.map +1 -1
- package/package.json +1 -1
- package/skills/controllerai-agents/SKILL.md +4 -2
- package/skills/controllerai-integration-actions/SKILL.md +21 -16
- package/skills/controllerai-start/SKILL.md +2 -0
- package/skills/controllerai-start/references/mcp-tool-map.md +3 -1
- package/skills/controllerai-template-setup/SKILL.md +132 -0
- package/skills/controllerai-template-setup/agents/openai.yaml +4 -0
- package/skills/controllerai-workflows/references/command-map.md +1 -0
- package/skills/manifest.json +61 -44
- package/skills-mcp/controllerai-agents/SKILL.md +5 -5
- package/skills-mcp/controllerai-ai-nodes/SKILL.md +0 -1
- package/skills-mcp/controllerai-data/SKILL.md +0 -3
- package/skills-mcp/controllerai-data/references/data-rails.md +0 -2
- package/skills-mcp/controllerai-expressions/SKILL.md +0 -1
- package/skills-mcp/controllerai-flow-control/SKILL.md +0 -2
- package/skills-mcp/controllerai-flow-control/references/patterns.md +0 -1
- package/skills-mcp/controllerai-integration-actions/SKILL.md +20 -19
- package/skills-mcp/controllerai-runs/SKILL.md +0 -1
- package/skills-mcp/controllerai-start/SKILL.md +2 -0
- package/skills-mcp/controllerai-start/references/mcp-tool-map.md +3 -1
- package/skills-mcp/controllerai-template-setup/SKILL.md +10 -0
- package/skills-mcp/controllerai-triggers/SKILL.md +0 -3
- package/skills-mcp/controllerai-workflows/SKILL.md +0 -1
- 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.
|
package/skills/manifest.json
CHANGED
|
@@ -1,29 +1,29 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
|
-
"skillSetVersion": "2026.09.
|
|
3
|
+
"skillSetVersion": "2026.09.15.3",
|
|
4
4
|
"minCliVersion": "0.2.0",
|
|
5
|
-
"latestCliVersion": "0.2.
|
|
5
|
+
"latestCliVersion": "0.2.23",
|
|
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.
|
|
13
|
-
"sha256": "
|
|
14
|
-
"size":
|
|
12
|
+
"url": "https://getcontroller.ai/skills/2026.09.15.3/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.
|
|
18
|
+
"url": "https://getcontroller.ai/skills/2026.09.15.3/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.
|
|
25
|
-
"sha256": "
|
|
26
|
-
"size":
|
|
24
|
+
"url": "https://getcontroller.ai/skills/2026.09.15.3/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.
|
|
35
|
+
"url": "https://getcontroller.ai/skills/2026.09.15.3/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.
|
|
41
|
+
"url": "https://getcontroller.ai/skills/2026.09.15.3/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.
|
|
48
|
-
"sha256": "
|
|
49
|
-
"size":
|
|
47
|
+
"url": "https://getcontroller.ai/skills/2026.09.15.3/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.
|
|
58
|
+
"url": "https://getcontroller.ai/skills/2026.09.15.3/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.
|
|
64
|
+
"url": "https://getcontroller.ai/skills/2026.09.15.3/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.
|
|
70
|
+
"url": "https://getcontroller.ai/skills/2026.09.15.3/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.
|
|
81
|
+
"url": "https://getcontroller.ai/skills/2026.09.15.3/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.
|
|
87
|
+
"url": "https://getcontroller.ai/skills/2026.09.15.3/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.
|
|
93
|
+
"url": "https://getcontroller.ai/skills/2026.09.15.3/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.
|
|
104
|
+
"url": "https://getcontroller.ai/skills/2026.09.15.3/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.
|
|
110
|
+
"url": "https://getcontroller.ai/skills/2026.09.15.3/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.
|
|
116
|
+
"url": "https://getcontroller.ai/skills/2026.09.15.3/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.
|
|
127
|
+
"url": "https://getcontroller.ai/skills/2026.09.15.3/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.
|
|
133
|
+
"url": "https://getcontroller.ai/skills/2026.09.15.3/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.
|
|
139
|
+
"url": "https://getcontroller.ai/skills/2026.09.15.3/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.
|
|
150
|
+
"url": "https://getcontroller.ai/skills/2026.09.15.3/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.
|
|
156
|
+
"url": "https://getcontroller.ai/skills/2026.09.15.3/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.
|
|
162
|
+
"url": "https://getcontroller.ai/skills/2026.09.15.3/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.
|
|
173
|
+
"url": "https://getcontroller.ai/skills/2026.09.15.3/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.
|
|
179
|
+
"url": "https://getcontroller.ai/skills/2026.09.15.3/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.
|
|
185
|
+
"url": "https://getcontroller.ai/skills/2026.09.15.3/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.
|
|
196
|
+
"url": "https://getcontroller.ai/skills/2026.09.15.3/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.
|
|
202
|
+
"url": "https://getcontroller.ai/skills/2026.09.15.3/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.
|
|
208
|
+
"url": "https://getcontroller.ai/skills/2026.09.15.3/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.
|
|
220
|
-
"sha256": "
|
|
221
|
-
"size":
|
|
219
|
+
"url": "https://getcontroller.ai/skills/2026.09.15.3/controllerai-integration-actions/SKILL.md",
|
|
220
|
+
"sha256": "df33bc2c8dadeec05b08f981caf76b2aa2b59fcdaf2b8c9c39fcc0128f175ab5",
|
|
221
|
+
"size": 10434
|
|
222
222
|
},
|
|
223
223
|
{
|
|
224
224
|
"path": "controllerai-integration-actions/agents/openai.yaml",
|
|
225
|
-
"url": "https://getcontroller.ai/skills/2026.09.
|
|
225
|
+
"url": "https://getcontroller.ai/skills/2026.09.15.3/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.
|
|
237
|
-
"sha256": "
|
|
238
|
-
"size":
|
|
236
|
+
"url": "https://getcontroller.ai/skills/2026.09.15.3/controllerai-agents/SKILL.md",
|
|
237
|
+
"sha256": "391c5f411c1ddde305417a5765c213acfad91fb65cb3ce5710cd247004720912",
|
|
238
|
+
"size": 12200
|
|
239
239
|
},
|
|
240
240
|
{
|
|
241
241
|
"path": "controllerai-agents/agents/openai.yaml",
|
|
242
|
-
"url": "https://getcontroller.ai/skills/2026.09.
|
|
242
|
+
"url": "https://getcontroller.ai/skills/2026.09.15.3/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.
|
|
248
|
+
"url": "https://getcontroller.ai/skills/2026.09.15.3/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.3/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.3/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
|
|
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.
|
|
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.** Send approval requests to Slack through `slackRoute`. Routes publish with the agent; Test conversations use the draft, live conversations the published version. The route lists who can answer in `slackRoute.approvers`, defaulting to whoever connected Slack. Chat-in-Slack approvers also count; 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.
|