@daxaur/ctrl-mcp 0.1.5 → 0.1.7
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/dist/blocks.d.ts +269 -70
- package/dist/blocks.d.ts.map +1 -1
- package/dist/blocks.js +202 -38
- package/dist/blocks.js.map +1 -1
- package/dist/index.js +17 -1
- package/dist/index.js.map +1 -1
- package/dist/tools/create-workflow.d.ts +11 -71
- package/dist/tools/create-workflow.d.ts.map +1 -1
- package/dist/tools/create-workflow.js +21 -3
- package/dist/tools/create-workflow.js.map +1 -1
- package/dist/tools/get-block-catalog.d.ts +49 -0
- package/dist/tools/get-block-catalog.d.ts.map +1 -0
- package/dist/tools/get-block-catalog.js +84 -0
- package/dist/tools/get-block-catalog.js.map +1 -0
- package/package.json +1 -1
package/dist/blocks.d.ts
CHANGED
|
@@ -1,101 +1,300 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Block catalog schemas — mirrors
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* Block catalog schemas — mirrors only the LIVE production blocks visible in
|
|
3
|
+
* ctrl.build/terminal. Anything marked hidden in block-definitions.ts, or
|
|
4
|
+
* defined there without a keeper executor, is intentionally excluded.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
6
|
+
* Live block count: 9 triggers · 5 actions · 4 conditions · 3 utilities = 21.
|
|
7
|
+
*
|
|
8
|
+
* NOT exposed (and why):
|
|
9
|
+
* - limitless.* + polymarket.* — hidden in block-definitions.ts
|
|
10
|
+
* - social.farcaster_cast — hidden, NEYNAR_API_KEY not in prod
|
|
11
|
+
* - signal.aixbt_mention — hidden, cookie.fun mirror not wired
|
|
12
|
+
* - cond.yield_threshold — hidden, no DefiLlama eval
|
|
13
|
+
* - util.stop / util.snapshot — no keeper case, silently no-op
|
|
14
|
+
*
|
|
15
|
+
* Keep in sync with main repo. Agents can call ctrl_get_block_catalog for the
|
|
16
|
+
* live list if this falls behind.
|
|
7
17
|
*/
|
|
8
18
|
import { z } from 'zod';
|
|
9
19
|
export declare const TRIGGER_TYPES: readonly ["time.interval", "trigger.manual", "price.above", "price.below", "price.change", "pool.created", "watch.whale", "event.transfer", "event.balance"];
|
|
10
20
|
export declare const ACTION_TYPES: readonly ["cypher.swap", "read.balance", "notify.telegram", "notify.discord", "util.webhook"];
|
|
11
21
|
export declare const CONDITION_TYPES: readonly ["cond.price", "cond.balance", "cond.allowed_weekdays", "cond.time_window"];
|
|
12
|
-
export declare const UTILITY_TYPES: readonly ["util.delay", "util.note", "util.log"
|
|
22
|
+
export declare const UTILITY_TYPES: readonly ["util.delay", "util.note", "util.log"];
|
|
13
23
|
export type TriggerType = (typeof TRIGGER_TYPES)[number];
|
|
14
24
|
export type ActionType = (typeof ACTION_TYPES)[number];
|
|
15
25
|
export type ConditionType = (typeof CONDITION_TYPES)[number];
|
|
16
26
|
export type UtilityType = (typeof UTILITY_TYPES)[number];
|
|
17
|
-
|
|
18
|
-
export declare const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
27
|
+
export type BlockType = TriggerType | ActionType | ConditionType | UtilityType;
|
|
28
|
+
export declare const BLOCK_CONFIG_SCHEMAS: {
|
|
29
|
+
readonly 'time.interval': z.ZodObject<{
|
|
30
|
+
minutes: z.ZodNumber;
|
|
31
|
+
}, "strip", z.ZodTypeAny, {
|
|
32
|
+
minutes: number;
|
|
33
|
+
}, {
|
|
34
|
+
minutes: number;
|
|
35
|
+
}>;
|
|
36
|
+
readonly 'trigger.manual': z.ZodObject<{}, "passthrough", z.ZodTypeAny, z.objectOutputType<{}, z.ZodTypeAny, "passthrough">, z.objectInputType<{}, z.ZodTypeAny, "passthrough">>;
|
|
37
|
+
readonly 'price.above': z.ZodObject<{
|
|
38
|
+
token: z.ZodString;
|
|
39
|
+
threshold: z.ZodNumber;
|
|
40
|
+
}, "strip", z.ZodTypeAny, {
|
|
41
|
+
token: string;
|
|
42
|
+
threshold: number;
|
|
43
|
+
}, {
|
|
44
|
+
token: string;
|
|
45
|
+
threshold: number;
|
|
46
|
+
}>;
|
|
47
|
+
readonly 'price.below': z.ZodObject<{
|
|
48
|
+
token: z.ZodString;
|
|
49
|
+
threshold: z.ZodNumber;
|
|
50
|
+
}, "strip", z.ZodTypeAny, {
|
|
51
|
+
token: string;
|
|
52
|
+
threshold: number;
|
|
53
|
+
}, {
|
|
54
|
+
token: string;
|
|
55
|
+
threshold: number;
|
|
56
|
+
}>;
|
|
57
|
+
readonly 'price.change': z.ZodObject<{
|
|
58
|
+
token: z.ZodString;
|
|
59
|
+
percentChange: z.ZodNumber;
|
|
60
|
+
}, "strip", z.ZodTypeAny, {
|
|
61
|
+
token: string;
|
|
62
|
+
percentChange: number;
|
|
63
|
+
}, {
|
|
64
|
+
token: string;
|
|
65
|
+
percentChange: number;
|
|
66
|
+
}>;
|
|
67
|
+
readonly 'pool.created': z.ZodObject<{
|
|
68
|
+
launchpad: z.ZodDefault<z.ZodOptional<z.ZodEnum<["any", "clanker", "flaunch", "zora", "bankr"]>>>;
|
|
69
|
+
quoteToken: z.ZodDefault<z.ZodOptional<z.ZodEnum<["any", "WETH", "USDC"]>>>;
|
|
70
|
+
minLiquidity: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
71
|
+
maxFdv: z.ZodOptional<z.ZodNumber>;
|
|
72
|
+
safetyEnabled: z.ZodOptional<z.ZodBoolean>;
|
|
73
|
+
keywordIncludes: z.ZodOptional<z.ZodString>;
|
|
74
|
+
keywordExcludes: z.ZodOptional<z.ZodString>;
|
|
75
|
+
keywordMatchMode: z.ZodDefault<z.ZodOptional<z.ZodEnum<["any", "all"]>>>;
|
|
76
|
+
}, "strip", z.ZodTypeAny, {
|
|
77
|
+
launchpad: "any" | "clanker" | "flaunch" | "zora" | "bankr";
|
|
78
|
+
quoteToken: "any" | "WETH" | "USDC";
|
|
79
|
+
minLiquidity: number;
|
|
80
|
+
keywordMatchMode: "any" | "all";
|
|
81
|
+
maxFdv?: number | undefined;
|
|
82
|
+
safetyEnabled?: boolean | undefined;
|
|
83
|
+
keywordIncludes?: string | undefined;
|
|
84
|
+
keywordExcludes?: string | undefined;
|
|
85
|
+
}, {
|
|
86
|
+
launchpad?: "any" | "clanker" | "flaunch" | "zora" | "bankr" | undefined;
|
|
87
|
+
quoteToken?: "any" | "WETH" | "USDC" | undefined;
|
|
88
|
+
minLiquidity?: number | undefined;
|
|
89
|
+
maxFdv?: number | undefined;
|
|
90
|
+
safetyEnabled?: boolean | undefined;
|
|
91
|
+
keywordIncludes?: string | undefined;
|
|
92
|
+
keywordExcludes?: string | undefined;
|
|
93
|
+
keywordMatchMode?: "any" | "all" | undefined;
|
|
94
|
+
}>;
|
|
95
|
+
readonly 'watch.whale': z.ZodObject<{
|
|
96
|
+
address: z.ZodString;
|
|
97
|
+
token: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
98
|
+
minAmount: z.ZodNumber;
|
|
99
|
+
direction: z.ZodDefault<z.ZodOptional<z.ZodEnum<["any", "incoming", "outgoing"]>>>;
|
|
100
|
+
}, "strip", z.ZodTypeAny, {
|
|
101
|
+
token: string;
|
|
102
|
+
address: string;
|
|
103
|
+
minAmount: number;
|
|
104
|
+
direction: "any" | "incoming" | "outgoing";
|
|
105
|
+
}, {
|
|
106
|
+
address: string;
|
|
107
|
+
minAmount: number;
|
|
108
|
+
token?: string | undefined;
|
|
109
|
+
direction?: "any" | "incoming" | "outgoing" | undefined;
|
|
110
|
+
}>;
|
|
111
|
+
readonly 'event.transfer': z.ZodObject<{
|
|
112
|
+
tokenAddress: z.ZodString;
|
|
113
|
+
minAmount: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
114
|
+
fromAddress: z.ZodOptional<z.ZodString>;
|
|
115
|
+
toAddress: z.ZodOptional<z.ZodString>;
|
|
116
|
+
direction: z.ZodDefault<z.ZodOptional<z.ZodEnum<["any", "incoming", "outgoing"]>>>;
|
|
117
|
+
}, "strip", z.ZodTypeAny, {
|
|
118
|
+
minAmount: number;
|
|
119
|
+
direction: "any" | "incoming" | "outgoing";
|
|
120
|
+
tokenAddress: string;
|
|
121
|
+
fromAddress?: string | undefined;
|
|
122
|
+
toAddress?: string | undefined;
|
|
123
|
+
}, {
|
|
124
|
+
tokenAddress: string;
|
|
125
|
+
minAmount?: number | undefined;
|
|
126
|
+
direction?: "any" | "incoming" | "outgoing" | undefined;
|
|
127
|
+
fromAddress?: string | undefined;
|
|
128
|
+
toAddress?: string | undefined;
|
|
129
|
+
}>;
|
|
130
|
+
readonly 'event.balance': z.ZodObject<{
|
|
131
|
+
token: z.ZodString;
|
|
132
|
+
condition: z.ZodEnum<[">=", "<=", ">", "<"]>;
|
|
133
|
+
threshold: z.ZodNumber;
|
|
134
|
+
}, "strip", z.ZodTypeAny, {
|
|
135
|
+
token: string;
|
|
136
|
+
threshold: number;
|
|
137
|
+
condition: ">=" | "<=" | ">" | "<";
|
|
138
|
+
}, {
|
|
139
|
+
token: string;
|
|
140
|
+
threshold: number;
|
|
141
|
+
condition: ">=" | "<=" | ">" | "<";
|
|
142
|
+
}>;
|
|
143
|
+
readonly 'cypher.swap': z.ZodObject<{
|
|
144
|
+
tokenIn: z.ZodString;
|
|
145
|
+
tokenOut: z.ZodString;
|
|
146
|
+
amount: z.ZodNumber;
|
|
147
|
+
amountMode: z.ZodDefault<z.ZodOptional<z.ZodEnum<["fixed", "percent"]>>>;
|
|
148
|
+
slippage: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
149
|
+
autoSellEnabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
150
|
+
autoSellMultiplier: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
151
|
+
autoSellPercent: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
152
|
+
}, "strip", z.ZodTypeAny, {
|
|
153
|
+
tokenIn: string;
|
|
154
|
+
tokenOut: string;
|
|
155
|
+
amount: number;
|
|
156
|
+
amountMode: "fixed" | "percent";
|
|
157
|
+
slippage: number;
|
|
158
|
+
autoSellEnabled: boolean;
|
|
159
|
+
autoSellMultiplier: number;
|
|
160
|
+
autoSellPercent: number;
|
|
161
|
+
}, {
|
|
162
|
+
tokenIn: string;
|
|
163
|
+
tokenOut: string;
|
|
164
|
+
amount: number;
|
|
165
|
+
amountMode?: "fixed" | "percent" | undefined;
|
|
166
|
+
slippage?: number | undefined;
|
|
167
|
+
autoSellEnabled?: boolean | undefined;
|
|
168
|
+
autoSellMultiplier?: number | undefined;
|
|
169
|
+
autoSellPercent?: number | undefined;
|
|
170
|
+
}>;
|
|
171
|
+
readonly 'read.balance': z.ZodObject<{
|
|
172
|
+
token: z.ZodString;
|
|
173
|
+
walletAddress: z.ZodOptional<z.ZodString>;
|
|
174
|
+
}, "strip", z.ZodTypeAny, {
|
|
175
|
+
token: string;
|
|
176
|
+
walletAddress?: string | undefined;
|
|
177
|
+
}, {
|
|
178
|
+
token: string;
|
|
179
|
+
walletAddress?: string | undefined;
|
|
180
|
+
}>;
|
|
181
|
+
readonly 'notify.telegram': z.ZodObject<{
|
|
182
|
+
message: z.ZodString;
|
|
183
|
+
}, "strip", z.ZodTypeAny, {
|
|
184
|
+
message: string;
|
|
185
|
+
}, {
|
|
186
|
+
message: string;
|
|
187
|
+
}>;
|
|
188
|
+
readonly 'notify.discord': z.ZodObject<{
|
|
189
|
+
webhookUrl: z.ZodEffects<z.ZodString, string, string>;
|
|
190
|
+
message: z.ZodString;
|
|
191
|
+
}, "strip", z.ZodTypeAny, {
|
|
192
|
+
message: string;
|
|
193
|
+
webhookUrl: string;
|
|
194
|
+
}, {
|
|
195
|
+
message: string;
|
|
196
|
+
webhookUrl: string;
|
|
197
|
+
}>;
|
|
198
|
+
readonly 'util.webhook': z.ZodObject<{
|
|
199
|
+
url: z.ZodEffects<z.ZodString, string, string>;
|
|
200
|
+
payload: z.ZodOptional<z.ZodString>;
|
|
201
|
+
}, "strip", z.ZodTypeAny, {
|
|
202
|
+
url: string;
|
|
203
|
+
payload?: string | undefined;
|
|
204
|
+
}, {
|
|
205
|
+
url: string;
|
|
206
|
+
payload?: string | undefined;
|
|
207
|
+
}>;
|
|
208
|
+
readonly 'cond.price': z.ZodObject<{
|
|
209
|
+
token: z.ZodString;
|
|
210
|
+
operator: z.ZodEnum<[">", "<"]>;
|
|
211
|
+
threshold: z.ZodNumber;
|
|
24
212
|
}, "strip", z.ZodTypeAny, {
|
|
25
|
-
|
|
26
|
-
|
|
213
|
+
token: string;
|
|
214
|
+
threshold: number;
|
|
215
|
+
operator: ">" | "<";
|
|
27
216
|
}, {
|
|
28
|
-
|
|
29
|
-
|
|
217
|
+
token: string;
|
|
218
|
+
threshold: number;
|
|
219
|
+
operator: ">" | "<";
|
|
30
220
|
}>;
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
221
|
+
readonly 'cond.balance': z.ZodObject<{
|
|
222
|
+
token: z.ZodString;
|
|
223
|
+
operator: z.ZodEnum<[">=", "<", ">", "<="]>;
|
|
224
|
+
minBalance: z.ZodNumber;
|
|
34
225
|
}, "strip", z.ZodTypeAny, {
|
|
35
|
-
|
|
36
|
-
|
|
226
|
+
token: string;
|
|
227
|
+
operator: ">=" | "<=" | ">" | "<";
|
|
228
|
+
minBalance: number;
|
|
37
229
|
}, {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
230
|
+
token: string;
|
|
231
|
+
operator: ">=" | "<=" | ">" | "<";
|
|
232
|
+
minBalance: number;
|
|
233
|
+
}>;
|
|
234
|
+
readonly 'cond.allowed_weekdays': z.ZodObject<{
|
|
235
|
+
weekdays: z.ZodArray<z.ZodNumber, "many">;
|
|
43
236
|
}, "strip", z.ZodTypeAny, {
|
|
44
|
-
|
|
45
|
-
config?: Record<string, any> | undefined;
|
|
237
|
+
weekdays: number[];
|
|
46
238
|
}, {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
239
|
+
weekdays: number[];
|
|
240
|
+
}>;
|
|
241
|
+
readonly 'cond.time_window': z.ZodObject<{
|
|
242
|
+
mode: z.ZodDefault<z.ZodOptional<z.ZodEnum<["during", "skip"]>>>;
|
|
243
|
+
startUTC: z.ZodDefault<z.ZodString>;
|
|
244
|
+
endUTC: z.ZodDefault<z.ZodString>;
|
|
52
245
|
}, "strip", z.ZodTypeAny, {
|
|
53
|
-
|
|
54
|
-
|
|
246
|
+
mode: "during" | "skip";
|
|
247
|
+
startUTC: string;
|
|
248
|
+
endUTC: string;
|
|
55
249
|
}, {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
250
|
+
mode?: "during" | "skip" | undefined;
|
|
251
|
+
startUTC?: string | undefined;
|
|
252
|
+
endUTC?: string | undefined;
|
|
253
|
+
}>;
|
|
254
|
+
readonly 'util.delay': z.ZodObject<{
|
|
255
|
+
seconds: z.ZodNumber;
|
|
256
|
+
}, "strip", z.ZodTypeAny, {
|
|
257
|
+
seconds: number;
|
|
258
|
+
}, {
|
|
259
|
+
seconds: number;
|
|
260
|
+
}>;
|
|
261
|
+
readonly 'util.note': z.ZodObject<{
|
|
262
|
+
note: z.ZodOptional<z.ZodString>;
|
|
263
|
+
}, "strip", z.ZodTypeAny, {
|
|
264
|
+
note?: string | undefined;
|
|
265
|
+
}, {
|
|
266
|
+
note?: string | undefined;
|
|
267
|
+
}>;
|
|
268
|
+
readonly 'util.log': z.ZodObject<{
|
|
269
|
+
level: z.ZodDefault<z.ZodOptional<z.ZodEnum<["info", "success", "warn", "error"]>>>;
|
|
270
|
+
message: z.ZodString;
|
|
271
|
+
}, "strip", z.ZodTypeAny, {
|
|
272
|
+
message: string;
|
|
273
|
+
level: "info" | "success" | "warn" | "error";
|
|
274
|
+
}, {
|
|
275
|
+
message: string;
|
|
276
|
+
level?: "info" | "success" | "warn" | "error" | undefined;
|
|
277
|
+
}>;
|
|
278
|
+
};
|
|
279
|
+
export type BlockConfigSchemas = typeof BLOCK_CONFIG_SCHEMAS;
|
|
280
|
+
/** A workflow = trigger + ordered chain of action/condition/utility blocks. */
|
|
281
|
+
export declare const WorkflowDefinitionSchema: z.ZodObject<{
|
|
282
|
+
name: z.ZodString;
|
|
283
|
+
description: z.ZodOptional<z.ZodString>;
|
|
284
|
+
trigger: z.ZodUnion<[z.ZodTypeAny, z.ZodTypeAny, ...z.ZodTypeAny[]]>;
|
|
285
|
+
chain: z.ZodArray<z.ZodUnion<[z.ZodUnion<[z.ZodTypeAny, z.ZodTypeAny, ...z.ZodTypeAny[]]>, z.ZodUnion<[z.ZodTypeAny, z.ZodTypeAny, ...z.ZodTypeAny[]]>, z.ZodUnion<[z.ZodTypeAny, z.ZodTypeAny, ...z.ZodTypeAny[]]>]>, "many">;
|
|
59
286
|
}, "strip", z.ZodTypeAny, {
|
|
60
287
|
name: string;
|
|
61
|
-
|
|
62
|
-
type: "time.interval" | "trigger.manual" | "price.above" | "price.below" | "price.change" | "pool.created" | "watch.whale" | "event.transfer" | "event.balance";
|
|
63
|
-
config?: Record<string, any> | undefined;
|
|
64
|
-
};
|
|
65
|
-
chain: ({
|
|
66
|
-
type: "cypher.swap" | "read.balance" | "notify.telegram" | "notify.discord" | "util.webhook";
|
|
67
|
-
config?: Record<string, any> | undefined;
|
|
68
|
-
} | {
|
|
69
|
-
type: "cond.price" | "cond.balance" | "cond.allowed_weekdays" | "cond.time_window";
|
|
70
|
-
config?: Record<string, any> | undefined;
|
|
71
|
-
} | {
|
|
72
|
-
type: "util.delay" | "util.note" | "util.log" | "util.stop" | "util.snapshot";
|
|
73
|
-
config?: Record<string, any> | undefined;
|
|
74
|
-
})[];
|
|
288
|
+
chain: any[];
|
|
75
289
|
description?: string | undefined;
|
|
290
|
+
trigger?: any;
|
|
76
291
|
}, {
|
|
77
292
|
name: string;
|
|
78
|
-
|
|
79
|
-
type: "time.interval" | "trigger.manual" | "price.above" | "price.below" | "price.change" | "pool.created" | "watch.whale" | "event.transfer" | "event.balance";
|
|
80
|
-
config?: Record<string, any> | undefined;
|
|
81
|
-
};
|
|
82
|
-
chain: ({
|
|
83
|
-
type: "cypher.swap" | "read.balance" | "notify.telegram" | "notify.discord" | "util.webhook";
|
|
84
|
-
config?: Record<string, any> | undefined;
|
|
85
|
-
} | {
|
|
86
|
-
type: "cond.price" | "cond.balance" | "cond.allowed_weekdays" | "cond.time_window";
|
|
87
|
-
config?: Record<string, any> | undefined;
|
|
88
|
-
} | {
|
|
89
|
-
type: "util.delay" | "util.note" | "util.log" | "util.stop" | "util.snapshot";
|
|
90
|
-
config?: Record<string, any> | undefined;
|
|
91
|
-
})[];
|
|
293
|
+
chain: any[];
|
|
92
294
|
description?: string | undefined;
|
|
295
|
+
trigger?: any;
|
|
93
296
|
}>;
|
|
94
297
|
export type WorkflowDefinition = z.infer<typeof WorkflowDefinitionSchema>;
|
|
95
|
-
/**
|
|
96
|
-
* Convert a simple {trigger, chain} schema into CTRL's internal
|
|
97
|
-
* {nodes, edges} shape used by the canvas + keeper.
|
|
98
|
-
*/
|
|
99
298
|
export declare function compileToWorkflowData(def: WorkflowDefinition): {
|
|
100
299
|
nodes: Array<{
|
|
101
300
|
id: string;
|
package/dist/blocks.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blocks.d.ts","sourceRoot":"","sources":["../src/blocks.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"blocks.d.ts","sourceRoot":"","sources":["../src/blocks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,aAAa,8JAUhB,CAAA;AAEV,eAAO,MAAM,YAAY,+FAMf,CAAA;AAEV,eAAO,MAAM,eAAe,sFAKlB,CAAA;AAEV,eAAO,MAAM,aAAa,kDAIhB,CAAA;AAEV,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAA;AACxD,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAA;AACtD,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAA;AAC5D,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAA;AACxD,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,aAAa,GAAG,WAAW,CAAA;AAuK9E,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsBmB,CAAA;AAEpD,MAAM,MAAM,kBAAkB,GAAG,OAAO,oBAAoB,CAAA;AAqB5D,+EAA+E;AAC/E,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;EAKnC,CAAA;AAEF,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAA;AAkBzE,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,kBAAkB,GAAG;IAC9D,KAAK,EAAE,KAAK,CAAC;QACX,EAAE,EAAE,MAAM,CAAA;QACV,IAAI,EAAE,MAAM,CAAA;QACZ,SAAS,EAAE,MAAM,CAAA;QACjB,YAAY,EAAE,MAAM,CAAA;QACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAC7B,QAAQ,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KACnC,CAAC,CAAA;IACF,KAAK,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC7D,CAsCA"}
|
package/dist/blocks.js
CHANGED
|
@@ -1,11 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Block catalog schemas — mirrors
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* Block catalog schemas — mirrors only the LIVE production blocks visible in
|
|
3
|
+
* ctrl.build/terminal. Anything marked hidden in block-definitions.ts, or
|
|
4
|
+
* defined there without a keeper executor, is intentionally excluded.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
6
|
+
* Live block count: 9 triggers · 5 actions · 4 conditions · 3 utilities = 21.
|
|
7
|
+
*
|
|
8
|
+
* NOT exposed (and why):
|
|
9
|
+
* - limitless.* + polymarket.* — hidden in block-definitions.ts
|
|
10
|
+
* - social.farcaster_cast — hidden, NEYNAR_API_KEY not in prod
|
|
11
|
+
* - signal.aixbt_mention — hidden, cookie.fun mirror not wired
|
|
12
|
+
* - cond.yield_threshold — hidden, no DefiLlama eval
|
|
13
|
+
* - util.stop / util.snapshot — no keeper case, silently no-op
|
|
14
|
+
*
|
|
15
|
+
* Keep in sync with main repo. Agents can call ctrl_get_block_catalog for the
|
|
16
|
+
* live list if this falls behind.
|
|
7
17
|
*/
|
|
8
18
|
import { z } from 'zod';
|
|
19
|
+
// ─── Block id arrays ────────────────────────────────────────────────────────
|
|
9
20
|
export const TRIGGER_TYPES = [
|
|
10
21
|
'time.interval',
|
|
11
22
|
'trigger.manual',
|
|
@@ -34,64 +45,217 @@ export const UTILITY_TYPES = [
|
|
|
34
45
|
'util.delay',
|
|
35
46
|
'util.note',
|
|
36
47
|
'util.log',
|
|
37
|
-
'util.stop',
|
|
38
|
-
'util.snapshot',
|
|
39
48
|
];
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
49
|
+
// ─── Reusable atoms ─────────────────────────────────────────────────────────
|
|
50
|
+
const tokenRef = z.string().min(1).describe('Token symbol (ETH/WETH/USDC) or 0x address');
|
|
51
|
+
const addressRef = z.string().regex(/^0x[a-fA-F0-9]{40}$/).describe('0x address');
|
|
52
|
+
// ─── Trigger configs ────────────────────────────────────────────────────────
|
|
53
|
+
const TimeIntervalConfig = z.object({
|
|
54
|
+
minutes: z.number().positive(),
|
|
55
|
+
});
|
|
56
|
+
const ManualTriggerConfig = z.object({}).passthrough();
|
|
57
|
+
const PriceAboveConfig = z.object({
|
|
58
|
+
token: tokenRef,
|
|
59
|
+
threshold: z.number().min(0).describe('USD price'),
|
|
60
|
+
});
|
|
61
|
+
const PriceBelowConfig = z.object({
|
|
62
|
+
token: tokenRef,
|
|
63
|
+
threshold: z.number().min(0).describe('USD price'),
|
|
64
|
+
});
|
|
65
|
+
const PriceChangeConfig = z.object({
|
|
66
|
+
token: tokenRef,
|
|
67
|
+
percentChange: z.number().min(0.1).describe('Absolute percent move'),
|
|
68
|
+
});
|
|
69
|
+
const PoolCreatedConfig = z.object({
|
|
70
|
+
launchpad: z
|
|
71
|
+
.enum(['any', 'clanker', 'flaunch', 'zora', 'bankr'])
|
|
72
|
+
.optional()
|
|
73
|
+
.default('any')
|
|
74
|
+
.describe('Launchpad to watch. bankr = Doppler V4.'),
|
|
75
|
+
quoteToken: z.enum(['any', 'WETH', 'USDC']).optional().default('any'),
|
|
76
|
+
minLiquidity: z.number().min(0).optional().default(0).describe('Min pool liquidity in USD'),
|
|
77
|
+
maxFdv: z.number().min(0).optional().describe('Reject launches above this FDV (USD)'),
|
|
78
|
+
safetyEnabled: z
|
|
79
|
+
.boolean()
|
|
80
|
+
.optional()
|
|
81
|
+
.describe('GoPlus honeypot + tax gate. Default ON for non-curated launchpads.'),
|
|
82
|
+
keywordIncludes: z
|
|
83
|
+
.string()
|
|
84
|
+
.optional()
|
|
85
|
+
.describe('Comma-separated keywords token name/ticker must include'),
|
|
86
|
+
keywordExcludes: z.string().optional().describe('Comma-separated keywords that auto-reject'),
|
|
87
|
+
keywordMatchMode: z.enum(['any', 'all']).optional().default('any'),
|
|
88
|
+
});
|
|
89
|
+
const WatchWhaleConfig = z.object({
|
|
90
|
+
address: addressRef.describe('Wallet to watch'),
|
|
91
|
+
token: tokenRef.optional().default('ETH'),
|
|
92
|
+
minAmount: z.number().positive(),
|
|
93
|
+
direction: z.enum(['any', 'incoming', 'outgoing']).optional().default('any'),
|
|
94
|
+
});
|
|
95
|
+
const EventTransferConfig = z.object({
|
|
96
|
+
tokenAddress: addressRef,
|
|
97
|
+
minAmount: z.number().min(0).optional().default(0),
|
|
98
|
+
fromAddress: addressRef.optional(),
|
|
99
|
+
toAddress: addressRef.optional(),
|
|
100
|
+
direction: z.enum(['any', 'incoming', 'outgoing']).optional().default('any'),
|
|
101
|
+
});
|
|
102
|
+
const EventBalanceConfig = z.object({
|
|
103
|
+
token: tokenRef,
|
|
104
|
+
condition: z.enum(['>=', '<=', '>', '<']),
|
|
105
|
+
threshold: z.number(),
|
|
106
|
+
});
|
|
107
|
+
// ─── Action configs ─────────────────────────────────────────────────────────
|
|
108
|
+
const CypherSwapConfig = z.object({
|
|
109
|
+
tokenIn: z
|
|
110
|
+
.string()
|
|
111
|
+
.min(1)
|
|
112
|
+
.describe('Input token symbol/0x, or "{{trigger.tokenAddress}}" for dynamic sells'),
|
|
113
|
+
tokenOut: z
|
|
114
|
+
.string()
|
|
115
|
+
.min(1)
|
|
116
|
+
.describe('Output token symbol/0x, or "{{trigger.tokenAddress}}" for snipes'),
|
|
117
|
+
amount: z.number().positive().describe('Amount of tokenIn (or % of balance if amountMode=percent)'),
|
|
118
|
+
amountMode: z.enum(['fixed', 'percent']).optional().default('fixed'),
|
|
119
|
+
slippage: z.number().min(0.1).max(50).optional().default(15).describe('Slippage %'),
|
|
120
|
+
autoSellEnabled: z.boolean().optional().default(false),
|
|
121
|
+
autoSellMultiplier: z
|
|
122
|
+
.number()
|
|
123
|
+
.min(1.01)
|
|
124
|
+
.optional()
|
|
125
|
+
.default(2)
|
|
126
|
+
.describe('Auto-sell at N× entry price'),
|
|
127
|
+
autoSellPercent: z.number().min(1).max(100).optional().default(50).describe('% of position to sell'),
|
|
128
|
+
});
|
|
129
|
+
const ReadBalanceConfig = z.object({
|
|
130
|
+
token: tokenRef,
|
|
131
|
+
walletAddress: addressRef.optional().describe('Defaults to vault wallet'),
|
|
43
132
|
});
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
133
|
+
const NotifyTelegramConfig = z.object({
|
|
134
|
+
message: z
|
|
135
|
+
.string()
|
|
136
|
+
.min(1)
|
|
137
|
+
.max(4000)
|
|
138
|
+
.describe('Supports {{token}}, {{price}}, {{amount}}, {{txHash}}, {{trigger.*}} vars'),
|
|
139
|
+
});
|
|
140
|
+
const NotifyDiscordConfig = z.object({
|
|
141
|
+
webhookUrl: z
|
|
142
|
+
.string()
|
|
143
|
+
.url()
|
|
144
|
+
.refine((u) => u.startsWith('https://discord.com/api/webhooks/'), {
|
|
145
|
+
message: 'Must be a https://discord.com/api/webhooks/... URL',
|
|
146
|
+
}),
|
|
147
|
+
message: z.string().min(1).max(2000),
|
|
148
|
+
});
|
|
149
|
+
const UtilWebhookConfig = z.object({
|
|
150
|
+
url: z.string().url().refine((u) => u.startsWith('https://'), { message: 'HTTPS only' }),
|
|
151
|
+
payload: z.string().optional().describe('JSON string body; template vars supported'),
|
|
152
|
+
});
|
|
153
|
+
// ─── Condition configs ──────────────────────────────────────────────────────
|
|
154
|
+
const CondPriceConfig = z.object({
|
|
155
|
+
token: z.string().min(1),
|
|
156
|
+
operator: z.enum(['>', '<']),
|
|
157
|
+
threshold: z.number().min(0).describe('USD price'),
|
|
158
|
+
});
|
|
159
|
+
const CondBalanceConfig = z.object({
|
|
160
|
+
token: tokenRef,
|
|
161
|
+
operator: z.enum(['>=', '<', '>', '<=']),
|
|
162
|
+
minBalance: z.number(),
|
|
163
|
+
});
|
|
164
|
+
const CondWeekdaysConfig = z.object({
|
|
165
|
+
weekdays: z.array(z.number().int().min(1).max(7)).describe('ISO weekdays Mon=1..Sun=7'),
|
|
166
|
+
});
|
|
167
|
+
const HHMM = z.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/, { message: 'HH:MM 24h UTC' });
|
|
168
|
+
const CondTimeWindowConfig = z.object({
|
|
169
|
+
mode: z.enum(['during', 'skip']).optional().default('during'),
|
|
170
|
+
startUTC: HHMM.default('13:00'),
|
|
171
|
+
endUTC: HHMM.default('22:00'),
|
|
47
172
|
});
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
173
|
+
// ─── Utility configs ────────────────────────────────────────────────────────
|
|
174
|
+
const UtilDelayConfig = z.object({
|
|
175
|
+
seconds: z.number().positive(),
|
|
51
176
|
});
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
config: z.record(z.any()).optional(),
|
|
177
|
+
const UtilNoteConfig = z.object({
|
|
178
|
+
note: z.string().max(2000).optional(),
|
|
55
179
|
});
|
|
56
|
-
|
|
180
|
+
const UtilLogConfig = z.object({
|
|
181
|
+
level: z.enum(['info', 'success', 'warn', 'error']).optional().default('info'),
|
|
182
|
+
message: z.string().min(1).max(2000),
|
|
183
|
+
});
|
|
184
|
+
// ─── Master per-block schema map ────────────────────────────────────────────
|
|
185
|
+
export const BLOCK_CONFIG_SCHEMAS = {
|
|
186
|
+
'time.interval': TimeIntervalConfig,
|
|
187
|
+
'trigger.manual': ManualTriggerConfig,
|
|
188
|
+
'price.above': PriceAboveConfig,
|
|
189
|
+
'price.below': PriceBelowConfig,
|
|
190
|
+
'price.change': PriceChangeConfig,
|
|
191
|
+
'pool.created': PoolCreatedConfig,
|
|
192
|
+
'watch.whale': WatchWhaleConfig,
|
|
193
|
+
'event.transfer': EventTransferConfig,
|
|
194
|
+
'event.balance': EventBalanceConfig,
|
|
195
|
+
'cypher.swap': CypherSwapConfig,
|
|
196
|
+
'read.balance': ReadBalanceConfig,
|
|
197
|
+
'notify.telegram': NotifyTelegramConfig,
|
|
198
|
+
'notify.discord': NotifyDiscordConfig,
|
|
199
|
+
'util.webhook': UtilWebhookConfig,
|
|
200
|
+
'cond.price': CondPriceConfig,
|
|
201
|
+
'cond.balance': CondBalanceConfig,
|
|
202
|
+
'cond.allowed_weekdays': CondWeekdaysConfig,
|
|
203
|
+
'cond.time_window': CondTimeWindowConfig,
|
|
204
|
+
'util.delay': UtilDelayConfig,
|
|
205
|
+
'util.note': UtilNoteConfig,
|
|
206
|
+
'util.log': UtilLogConfig,
|
|
207
|
+
};
|
|
208
|
+
// ─── Discriminated-union blocks ─────────────────────────────────────────────
|
|
209
|
+
function typedBlockUnion(types) {
|
|
210
|
+
const variants = types.map((t) => z.object({
|
|
211
|
+
type: z.literal(t),
|
|
212
|
+
config: BLOCK_CONFIG_SCHEMAS[t].optional().default({}),
|
|
213
|
+
}));
|
|
214
|
+
return z.union(variants);
|
|
215
|
+
}
|
|
216
|
+
const TriggerBlock = typedBlockUnion(TRIGGER_TYPES);
|
|
217
|
+
const ActionBlock = typedBlockUnion(ACTION_TYPES);
|
|
218
|
+
const ConditionBlock = typedBlockUnion(CONDITION_TYPES);
|
|
219
|
+
const UtilityBlock = typedBlockUnion(UTILITY_TYPES);
|
|
220
|
+
const ChainBlock = z.union([ActionBlock, ConditionBlock, UtilityBlock]);
|
|
221
|
+
/** A workflow = trigger + ordered chain of action/condition/utility blocks. */
|
|
57
222
|
export const WorkflowDefinitionSchema = z.object({
|
|
58
223
|
name: z.string().min(1).max(120),
|
|
59
224
|
description: z.string().max(500).optional(),
|
|
60
|
-
trigger:
|
|
61
|
-
chain: z
|
|
62
|
-
.array(z.union([actionBlock, conditionBlock, utilityBlock]))
|
|
63
|
-
.min(1)
|
|
64
|
-
.max(20),
|
|
225
|
+
trigger: TriggerBlock,
|
|
226
|
+
chain: z.array(ChainBlock).min(1).max(20),
|
|
65
227
|
});
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
228
|
+
// ─── Compile to CTRL canvas {nodes, edges} ──────────────────────────────────
|
|
229
|
+
const ACTION_SET = new Set(ACTION_TYPES);
|
|
230
|
+
const CONDITION_SET = new Set(CONDITION_TYPES);
|
|
231
|
+
function classify(type) {
|
|
232
|
+
if (ACTION_SET.has(type))
|
|
233
|
+
return 'action';
|
|
234
|
+
if (CONDITION_SET.has(type))
|
|
235
|
+
return 'condition';
|
|
236
|
+
return 'utility';
|
|
237
|
+
}
|
|
70
238
|
export function compileToWorkflowData(def) {
|
|
71
239
|
const nodes = [];
|
|
72
240
|
const edges = [];
|
|
241
|
+
const trigger = def.trigger;
|
|
73
242
|
const triggerId = 'n0_trigger';
|
|
74
|
-
const [triggerCategory, triggerSubtype] = def.trigger.type.split('.');
|
|
75
243
|
nodes.push({
|
|
76
244
|
id: triggerId,
|
|
77
245
|
type: 'automation',
|
|
78
246
|
blockType: 'trigger',
|
|
79
|
-
blockSubtype:
|
|
80
|
-
data: { blockId:
|
|
247
|
+
blockSubtype: trigger.type,
|
|
248
|
+
data: { blockId: trigger.type, config: trigger.config ?? {} },
|
|
81
249
|
position: { x: 80, y: 80 },
|
|
82
250
|
});
|
|
83
251
|
let prevId = triggerId;
|
|
84
252
|
def.chain.forEach((block, idx) => {
|
|
85
|
-
const id = `n${idx + 1}_${block.type.replace(
|
|
86
|
-
const [category, subtype] = block.type.split('.');
|
|
87
|
-
const isAction = ACTION_TYPES.includes(block.type);
|
|
88
|
-
const isCondition = CONDITION_TYPES.includes(block.type);
|
|
89
|
-
const blockType = isAction ? 'action' : isCondition ? 'condition' : 'utility';
|
|
253
|
+
const id = `n${idx + 1}_${block.type.replace(/\./g, '_')}`;
|
|
90
254
|
nodes.push({
|
|
91
255
|
id,
|
|
92
256
|
type: 'automation',
|
|
93
|
-
blockType,
|
|
94
|
-
blockSubtype:
|
|
257
|
+
blockType: classify(block.type),
|
|
258
|
+
blockSubtype: block.type,
|
|
95
259
|
data: { blockId: block.type, config: block.config ?? {} },
|
|
96
260
|
position: { x: 80 + (idx + 1) * 320, y: 80 },
|
|
97
261
|
});
|
package/dist/blocks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blocks.js","sourceRoot":"","sources":["../src/blocks.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"blocks.js","sourceRoot":"","sources":["../src/blocks.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -22,17 +22,32 @@ import { ACTIVATE_TOOL, handleActivate, } from './tools/activate-workflow.js';
|
|
|
22
22
|
import { FIRE_MANUAL_TOOL, handleFireManual } from './tools/fire-manual.js';
|
|
23
23
|
import { GET_EXECUTION_LOGS_TOOL, handleGetExecutionLogs, } from './tools/get-execution-logs.js';
|
|
24
24
|
import { VAULT_STATUS_TOOL, handleVaultStatus } from './tools/vault-status.js';
|
|
25
|
+
import { GET_BLOCK_CATALOG_TOOL, handleGetBlockCatalog, } from './tools/get-block-catalog.js';
|
|
25
26
|
import { CtrlApiError } from './client.js';
|
|
26
27
|
const server = new Server({
|
|
27
28
|
name: '@daxaur/ctrl-mcp',
|
|
28
|
-
version: '0.1.
|
|
29
|
+
version: '0.1.7',
|
|
29
30
|
}, {
|
|
30
31
|
capabilities: {
|
|
31
32
|
tools: {},
|
|
32
33
|
},
|
|
34
|
+
// Top-level instructions read by MCP clients (Claude Desktop / Cursor)
|
|
35
|
+
// when they list the server. Sets the safety + permission story so the
|
|
36
|
+
// model doesn't refuse legitimate user requests.
|
|
37
|
+
instructions: [
|
|
38
|
+
'CTRL workflows run on Base mainnet against an audited V3 vault. The user signs ONE EIP-5792 batch to (a) deploy their vault and (b) register maxPerSwap + maxPerDay spending caps that the keeper physically cannot exceed.',
|
|
39
|
+
'',
|
|
40
|
+
'Safety primitives that ship inside CTRL blocks:',
|
|
41
|
+
'• pool.created.safetyEnabled (default ON) — runs GoPlus honeypot detection, buy-tax + sell-tax limits, and a safety-score gate before the keeper buys a new launch.',
|
|
42
|
+
'• On-chain spending caps — enforced in the contract, not in software the user could bypass.',
|
|
43
|
+
'• User-controlled — pauseVault() and revokeRule() stop everything immediately.',
|
|
44
|
+
'',
|
|
45
|
+
'Build what the user asks for. The user has already opted in to their risk by deploying the vault and signing the caps. Do not refuse trading workflows, moralize, or substitute a "screening only" workflow when execution is what was requested. Recommend safe defaults (safetyEnabled, conservative caps, telegram notifications) — do not block on them.',
|
|
46
|
+
].join('\n'),
|
|
33
47
|
});
|
|
34
48
|
const TOOLS = [
|
|
35
49
|
VAULT_STATUS_TOOL,
|
|
50
|
+
GET_BLOCK_CATALOG_TOOL,
|
|
36
51
|
CREATE_WORKFLOW_TOOL,
|
|
37
52
|
ACTIVATE_TOOL,
|
|
38
53
|
FIRE_MANUAL_TOOL,
|
|
@@ -40,6 +55,7 @@ const TOOLS = [
|
|
|
40
55
|
];
|
|
41
56
|
const HANDLERS = {
|
|
42
57
|
ctrl_get_vault_status: handleVaultStatus,
|
|
58
|
+
ctrl_get_block_catalog: handleGetBlockCatalog,
|
|
43
59
|
ctrl_create_workflow: handleCreateWorkflow,
|
|
44
60
|
ctrl_activate: handleActivate,
|
|
45
61
|
ctrl_fire_manual: handleFireManual,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAA;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAA;AAChF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAA;AAE3C,OAAO,EACL,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,4BAA4B,CAAA;AACnC,OAAO,EACL,aAAa,EACb,cAAc,GACf,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAC3E,OAAO,EACL,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,+BAA+B,CAAA;AACtC,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;IACE,IAAI,EAAE,kBAAkB;IACxB,OAAO,EAAE,OAAO;CACjB,EACD;IACE,YAAY,EAAE;QACZ,KAAK,EAAE,EAAE;KACV;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAA;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAA;AAChF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAA;AAE3C,OAAO,EACL,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,4BAA4B,CAAA;AACnC,OAAO,EACL,aAAa,EACb,cAAc,GACf,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAC3E,OAAO,EACL,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,+BAA+B,CAAA;AACtC,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC9E,OAAO,EACL,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;IACE,IAAI,EAAE,kBAAkB;IACxB,OAAO,EAAE,OAAO;CACjB,EACD;IACE,YAAY,EAAE;QACZ,KAAK,EAAE,EAAE;KACV;IACD,uEAAuE;IACvE,uEAAuE;IACvE,iDAAiD;IACjD,YAAY,EAAE;QACZ,6NAA6N;QAC7N,EAAE;QACF,iDAAiD;QACjD,qKAAqK;QACrK,6FAA6F;QAC7F,gFAAgF;QAChF,EAAE;QACF,8VAA8V;KAC/V,CAAC,IAAI,CAAC,IAAI,CAAC;CACb,CACF,CAAA;AAED,MAAM,KAAK,GAAG;IACZ,iBAAiB;IACjB,sBAAsB;IACtB,oBAAoB;IACpB,aAAa;IACb,gBAAgB;IAChB,uBAAuB;CACf,CAAA;AAEV,MAAM,QAAQ,GAAyD;IACrE,qBAAqB,EAAE,iBAAiB;IACxC,sBAAsB,EAAE,qBAAqB;IAC7C,oBAAoB,EAAE,oBAAoB;IAC1C,aAAa,EAAE,cAAc;IAC7B,gBAAgB,EAAE,gBAAgB;IAClC,uBAAuB,EAAE,sBAAsB;CAChD,CAAA;AAED,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;IAC5D,KAAK,EAAE,KAAK;CACb,CAAC,CAAC,CAAA;AAEH,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;IAC5D,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,MAAM,CAAA;IAC5C,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;IAE9B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,iBAAiB,IAAI,gBAAgB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;iBAC9E;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAA;IACH,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAA;QACxC,OAAO,MAA4D,CAAA;IACrE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,KAAK,GAAG,GAAG,YAAY,YAAY,CAAA;QACzC,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAChE,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,KAAK;wBACT,CAAC,CAAC,wBAAyB,GAAoB,CAAC,MAAM,MAAM,OAAO,EAAE;wBACrE,CAAC,CAAC,eAAe,OAAO,EAAE;iBAC7B;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAA;IACH,CAAC;AACH,CAAC,CAAC,CAAA;AAEF,KAAK,UAAU,IAAI;IACjB,wEAAwE;IACxE,0EAA0E;IAC1E,kCAAkC;IAClC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAClC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAA;QACnD,MAAM,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;QAC/B,OAAM;IACR,CAAC;IACD,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAA;QACrC,OAAM;IACR,CAAC;IACD,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC7C,OAAO,CAAC,GAAG,CACT;YACE,iEAAiE;YACjE,EAAE;YACF,QAAQ;YACR,yGAAyG;YACzG,6DAA6D;YAC7D,+EAA+E;YAC/E,qCAAqC;YACrC,EAAE;YACF,MAAM;YACN,kDAAkD;YAClD,EAAE;YACF,4BAA4B;YAC5B,mEAAmE;SACpE,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAA;QACD,OAAM;IACR,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAA;IAC5C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IAC/B,oEAAoE;IACpE,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAA;AAC7D,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,CAAC,CAAA;IAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
|
|
@@ -9,82 +9,22 @@ import { z } from 'zod';
|
|
|
9
9
|
export declare const createWorkflowInputSchema: z.ZodObject<{
|
|
10
10
|
name: z.ZodString;
|
|
11
11
|
description: z.ZodOptional<z.ZodString>;
|
|
12
|
-
trigger: z.
|
|
13
|
-
|
|
14
|
-
config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
|
|
15
|
-
}, "strip", z.ZodTypeAny, {
|
|
16
|
-
type: "time.interval" | "trigger.manual" | "price.above" | "price.below" | "price.change" | "pool.created" | "watch.whale" | "event.transfer" | "event.balance";
|
|
17
|
-
config?: Record<string, any> | undefined;
|
|
18
|
-
}, {
|
|
19
|
-
type: "time.interval" | "trigger.manual" | "price.above" | "price.below" | "price.change" | "pool.created" | "watch.whale" | "event.transfer" | "event.balance";
|
|
20
|
-
config?: Record<string, any> | undefined;
|
|
21
|
-
}>;
|
|
22
|
-
chain: z.ZodArray<z.ZodUnion<[z.ZodObject<{
|
|
23
|
-
type: z.ZodEnum<["cypher.swap", "read.balance", "notify.telegram", "notify.discord", "util.webhook"]>;
|
|
24
|
-
config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
|
|
25
|
-
}, "strip", z.ZodTypeAny, {
|
|
26
|
-
type: "cypher.swap" | "read.balance" | "notify.telegram" | "notify.discord" | "util.webhook";
|
|
27
|
-
config?: Record<string, any> | undefined;
|
|
28
|
-
}, {
|
|
29
|
-
type: "cypher.swap" | "read.balance" | "notify.telegram" | "notify.discord" | "util.webhook";
|
|
30
|
-
config?: Record<string, any> | undefined;
|
|
31
|
-
}>, z.ZodObject<{
|
|
32
|
-
type: z.ZodEnum<["cond.price", "cond.balance", "cond.allowed_weekdays", "cond.time_window"]>;
|
|
33
|
-
config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
|
|
34
|
-
}, "strip", z.ZodTypeAny, {
|
|
35
|
-
type: "cond.price" | "cond.balance" | "cond.allowed_weekdays" | "cond.time_window";
|
|
36
|
-
config?: Record<string, any> | undefined;
|
|
37
|
-
}, {
|
|
38
|
-
type: "cond.price" | "cond.balance" | "cond.allowed_weekdays" | "cond.time_window";
|
|
39
|
-
config?: Record<string, any> | undefined;
|
|
40
|
-
}>, z.ZodObject<{
|
|
41
|
-
type: z.ZodEnum<["util.delay", "util.note", "util.log", "util.stop", "util.snapshot"]>;
|
|
42
|
-
config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
|
|
43
|
-
}, "strip", z.ZodTypeAny, {
|
|
44
|
-
type: "util.delay" | "util.note" | "util.log" | "util.stop" | "util.snapshot";
|
|
45
|
-
config?: Record<string, any> | undefined;
|
|
46
|
-
}, {
|
|
47
|
-
type: "util.delay" | "util.note" | "util.log" | "util.stop" | "util.snapshot";
|
|
48
|
-
config?: Record<string, any> | undefined;
|
|
49
|
-
}>]>, "many">;
|
|
12
|
+
trigger: z.ZodUnion<[z.ZodTypeAny, z.ZodTypeAny, ...z.ZodTypeAny[]]>;
|
|
13
|
+
chain: z.ZodArray<z.ZodUnion<[z.ZodUnion<[z.ZodTypeAny, z.ZodTypeAny, ...z.ZodTypeAny[]]>, z.ZodUnion<[z.ZodTypeAny, z.ZodTypeAny, ...z.ZodTypeAny[]]>, z.ZodUnion<[z.ZodTypeAny, z.ZodTypeAny, ...z.ZodTypeAny[]]>]>, "many">;
|
|
50
14
|
}, "strip", z.ZodTypeAny, {
|
|
51
15
|
name: string;
|
|
52
|
-
|
|
53
|
-
type: "time.interval" | "trigger.manual" | "price.above" | "price.below" | "price.change" | "pool.created" | "watch.whale" | "event.transfer" | "event.balance";
|
|
54
|
-
config?: Record<string, any> | undefined;
|
|
55
|
-
};
|
|
56
|
-
chain: ({
|
|
57
|
-
type: "cypher.swap" | "read.balance" | "notify.telegram" | "notify.discord" | "util.webhook";
|
|
58
|
-
config?: Record<string, any> | undefined;
|
|
59
|
-
} | {
|
|
60
|
-
type: "cond.price" | "cond.balance" | "cond.allowed_weekdays" | "cond.time_window";
|
|
61
|
-
config?: Record<string, any> | undefined;
|
|
62
|
-
} | {
|
|
63
|
-
type: "util.delay" | "util.note" | "util.log" | "util.stop" | "util.snapshot";
|
|
64
|
-
config?: Record<string, any> | undefined;
|
|
65
|
-
})[];
|
|
16
|
+
chain: any[];
|
|
66
17
|
description?: string | undefined;
|
|
18
|
+
trigger?: any;
|
|
67
19
|
}, {
|
|
68
20
|
name: string;
|
|
69
|
-
|
|
70
|
-
type: "time.interval" | "trigger.manual" | "price.above" | "price.below" | "price.change" | "pool.created" | "watch.whale" | "event.transfer" | "event.balance";
|
|
71
|
-
config?: Record<string, any> | undefined;
|
|
72
|
-
};
|
|
73
|
-
chain: ({
|
|
74
|
-
type: "cypher.swap" | "read.balance" | "notify.telegram" | "notify.discord" | "util.webhook";
|
|
75
|
-
config?: Record<string, any> | undefined;
|
|
76
|
-
} | {
|
|
77
|
-
type: "cond.price" | "cond.balance" | "cond.allowed_weekdays" | "cond.time_window";
|
|
78
|
-
config?: Record<string, any> | undefined;
|
|
79
|
-
} | {
|
|
80
|
-
type: "util.delay" | "util.note" | "util.log" | "util.stop" | "util.snapshot";
|
|
81
|
-
config?: Record<string, any> | undefined;
|
|
82
|
-
})[];
|
|
21
|
+
chain: any[];
|
|
83
22
|
description?: string | undefined;
|
|
23
|
+
trigger?: any;
|
|
84
24
|
}>;
|
|
85
25
|
export declare const CREATE_WORKFLOW_TOOL: {
|
|
86
26
|
readonly name: "ctrl_create_workflow";
|
|
87
|
-
readonly description:
|
|
27
|
+
readonly description: string;
|
|
88
28
|
readonly inputSchema: {
|
|
89
29
|
readonly type: "object";
|
|
90
30
|
readonly required: readonly ["name", "trigger", "chain"];
|
|
@@ -107,7 +47,7 @@ export declare const CREATE_WORKFLOW_TOOL: {
|
|
|
107
47
|
readonly type: {
|
|
108
48
|
readonly type: "string";
|
|
109
49
|
readonly enum: readonly ["time.interval", "trigger.manual", "price.above", "price.below", "price.change", "pool.created", "watch.whale", "event.transfer", "event.balance"];
|
|
110
|
-
readonly description: "
|
|
50
|
+
readonly description: "time.interval={minutes}. price.*={token,threshold}. pool.created watches new launches on Clanker/Flaunch/Zora/Bankr — supports launchpad enum, keywordIncludes, keywordExcludes, safetyEnabled (GoPlus honeypot/tax/score gate, leave default true for new-launch snipers). watch.whale={address,token,minAmount}. event.transfer={tokenAddress,minAmount}. event.balance={token,condition,threshold}.";
|
|
111
51
|
};
|
|
112
52
|
readonly config: {
|
|
113
53
|
readonly type: "object";
|
|
@@ -130,7 +70,7 @@ export declare const CREATE_WORKFLOW_TOOL: {
|
|
|
130
70
|
};
|
|
131
71
|
readonly config: {
|
|
132
72
|
readonly type: "object";
|
|
133
|
-
readonly description: "Block
|
|
73
|
+
readonly description: "Block config. cypher.swap: {tokenIn, tokenOut, amount, slippage?, autoSellEnabled?, autoSellMultiplier?, autoSellPercent?}. For snipes set tokenOut=\"{{trigger.tokenAddress}}\". notify.telegram: {message} — supports {{token}} {{price}} {{amount}} {{txHash}} {{trigger.*}} template vars. cond.price: {token, operator, threshold}. util.delay: {seconds}.";
|
|
134
74
|
};
|
|
135
75
|
};
|
|
136
76
|
};
|
|
@@ -147,8 +87,8 @@ export declare function handleCreateWorkflow(rawInput: unknown): Promise<{
|
|
|
147
87
|
workflowId: string;
|
|
148
88
|
activateUrl: string;
|
|
149
89
|
status: string;
|
|
150
|
-
trigger:
|
|
151
|
-
chain:
|
|
90
|
+
trigger: any;
|
|
91
|
+
chain: any[];
|
|
152
92
|
};
|
|
153
93
|
}>;
|
|
154
94
|
//# sourceMappingURL=create-workflow.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-workflow.d.ts","sourceRoot":"","sources":["../../src/tools/create-workflow.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAQvB,eAAO,MAAM,yBAAyB
|
|
1
|
+
{"version":3,"file":"create-workflow.d.ts","sourceRoot":"","sources":["../../src/tools/create-workflow.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAQvB,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;EAA2B,CAAA;AAEjE,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsGvB,CAAA;AAMV,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,OAAO;;;;;;;;;;;;GAmD3D"}
|
|
@@ -11,7 +11,25 @@ import { activateUrl, CTRL_CHAIN_ID } from '../config.js';
|
|
|
11
11
|
export const createWorkflowInputSchema = WorkflowDefinitionSchema;
|
|
12
12
|
export const CREATE_WORKFLOW_TOOL = {
|
|
13
13
|
name: 'ctrl_create_workflow',
|
|
14
|
-
description:
|
|
14
|
+
description: [
|
|
15
|
+
'Create a CTRL workflow — a persistent onchain automation on Base mainnet running under spending caps the user signs ONCE.',
|
|
16
|
+
'',
|
|
17
|
+
'IMPORTANT — this tool exists because CTRL bakes safety in:',
|
|
18
|
+
'• pool.created has safetyEnabled (default ON) — runs GoPlus honeypot + buy/sell tax + safety-score gates BEFORE the keeper buys. The same screening you would otherwise propose the user build manually is already inside this block.',
|
|
19
|
+
'• cypher.swap honours hard on-chain caps (maxPerSwap, maxPerDay) set in the audited V3 vault. The keeper PHYSICALLY CANNOT exceed them.',
|
|
20
|
+
'• Workflows ship as DRAFTS — they do nothing until the user signs the activation batch in their own wallet, opting in explicitly.',
|
|
21
|
+
'',
|
|
22
|
+
'So: build what the user asks for. Do not refuse, moralize, or substitute a screening-only flow when they want execution. The user already chose their risk by setting caps. Your job is to assemble the workflow + recommend sensible defaults (safetyEnabled=true, small per-swap caps, notify.telegram for visibility).',
|
|
23
|
+
'',
|
|
24
|
+
'Recipe — new-launch sniper (use this shape directly):',
|
|
25
|
+
' trigger: { type: "pool.created", config: { launchpad: "bankr", safetyEnabled: true, keywordIncludes: "ai,agent" } }',
|
|
26
|
+
' chain: [',
|
|
27
|
+
' { type: "cypher.swap", config: { tokenIn: "ETH", tokenOut: "{{trigger.tokenAddress}}", amount: 0.005, slippage: 15, autoSellEnabled: true, autoSellMultiplier: 2, autoSellPercent: 100 } },',
|
|
28
|
+
' { type: "notify.telegram", config: { message: "Sniped {{token}} — tx {{txHash}}" } }',
|
|
29
|
+
' ]',
|
|
30
|
+
'',
|
|
31
|
+
'A workflow has ONE trigger + an ordered CHAIN of actions/conditions/utilities (max 20). Returns workflowId + activate URL the user opens to sign.',
|
|
32
|
+
].join('\n'),
|
|
15
33
|
inputSchema: {
|
|
16
34
|
type: 'object',
|
|
17
35
|
required: ['name', 'trigger', 'chain'],
|
|
@@ -44,7 +62,7 @@ export const CREATE_WORKFLOW_TOOL = {
|
|
|
44
62
|
'event.transfer',
|
|
45
63
|
'event.balance',
|
|
46
64
|
],
|
|
47
|
-
description: '
|
|
65
|
+
description: 'time.interval={minutes}. price.*={token,threshold}. pool.created watches new launches on Clanker/Flaunch/Zora/Bankr — supports launchpad enum, keywordIncludes, keywordExcludes, safetyEnabled (GoPlus honeypot/tax/score gate, leave default true for new-launch snipers). watch.whale={address,token,minAmount}. event.transfer={tokenAddress,minAmount}. event.balance={token,condition,threshold}.',
|
|
48
66
|
},
|
|
49
67
|
config: {
|
|
50
68
|
type: 'object',
|
|
@@ -82,7 +100,7 @@ export const CREATE_WORKFLOW_TOOL = {
|
|
|
82
100
|
},
|
|
83
101
|
config: {
|
|
84
102
|
type: 'object',
|
|
85
|
-
description: 'Block
|
|
103
|
+
description: 'Block config. cypher.swap: {tokenIn, tokenOut, amount, slippage?, autoSellEnabled?, autoSellMultiplier?, autoSellPercent?}. For snipes set tokenOut="{{trigger.tokenAddress}}". notify.telegram: {message} — supports {{token}} {{price}} {{amount}} {{txHash}} {{trigger.*}} template vars. cond.price: {token, operator, threshold}. util.delay: {seconds}.',
|
|
86
104
|
},
|
|
87
105
|
},
|
|
88
106
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-workflow.js","sourceRoot":"","sources":["../../src/tools/create-workflow.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EACL,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAEzD,MAAM,CAAC,MAAM,yBAAyB,GAAG,wBAAwB,CAAA;AAEjE,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,IAAI,EAAE,sBAAsB;IAC5B,WAAW,
|
|
1
|
+
{"version":3,"file":"create-workflow.js","sourceRoot":"","sources":["../../src/tools/create-workflow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ctrl_get_block_catalog — return the live block catalog from /api/mcp/block-catalog.
|
|
3
|
+
*
|
|
4
|
+
* Agents call this when they need the most up-to-date list of supported
|
|
5
|
+
* triggers/actions/conditions/utilities with their config field schemas.
|
|
6
|
+
* The route is auth-free (documentation) so this works without an API key.
|
|
7
|
+
*/
|
|
8
|
+
export interface BlockConfigField {
|
|
9
|
+
name: string;
|
|
10
|
+
type: string;
|
|
11
|
+
required: boolean;
|
|
12
|
+
default?: string | number | boolean;
|
|
13
|
+
enum_values?: string[];
|
|
14
|
+
description: string;
|
|
15
|
+
}
|
|
16
|
+
export interface CatalogEntry {
|
|
17
|
+
id: string;
|
|
18
|
+
label: string;
|
|
19
|
+
description: string;
|
|
20
|
+
config_fields: BlockConfigField[];
|
|
21
|
+
}
|
|
22
|
+
export interface BlockCatalog {
|
|
23
|
+
triggers: CatalogEntry[];
|
|
24
|
+
actions: CatalogEntry[];
|
|
25
|
+
conditions: CatalogEntry[];
|
|
26
|
+
utilities: CatalogEntry[];
|
|
27
|
+
}
|
|
28
|
+
export declare const GET_BLOCK_CATALOG_TOOL: {
|
|
29
|
+
readonly name: "ctrl_get_block_catalog";
|
|
30
|
+
readonly description: "Return the live catalog of every CTRL workflow block (trigger, action, condition, utility) with id, label, description, and config-field schemas. Call this BEFORE ctrl_create_workflow whenever you're unsure about a block's exact config shape, or whenever you want the freshest list of supported blocks (CTRL ships new blocks regularly — the static plugin schema may lag). Optional input: { category } to narrow to a single bucket.";
|
|
31
|
+
readonly inputSchema: {
|
|
32
|
+
readonly type: "object";
|
|
33
|
+
readonly properties: {
|
|
34
|
+
readonly category: {
|
|
35
|
+
readonly type: "string";
|
|
36
|
+
readonly enum: readonly ["trigger", "action", "condition", "utility"];
|
|
37
|
+
readonly description: "Optional. Filter to a single block bucket. Omit to get all four.";
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
export declare function handleGetBlockCatalog(rawInput: unknown): Promise<{
|
|
43
|
+
content: {
|
|
44
|
+
type: "text";
|
|
45
|
+
text: string;
|
|
46
|
+
}[];
|
|
47
|
+
structuredContent: Record<string, unknown>;
|
|
48
|
+
}>;
|
|
49
|
+
//# sourceMappingURL=get-block-catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-block-catalog.d.ts","sourceRoot":"","sources":["../../src/tools/get-block-catalog.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,OAAO,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;IACnC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,gBAAgB,EAAE,CAAA;CAClC;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,YAAY,EAAE,CAAA;IACxB,OAAO,EAAE,YAAY,EAAE,CAAA;IACvB,UAAU,EAAE,YAAY,EAAE,CAAA;IAC1B,SAAS,EAAE,YAAY,EAAE,CAAA;CAC1B;AAED,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;CAezB,CAAA;AAkBV,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,OAAO;;;;;uBAsDhB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;GAEnE"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ctrl_get_block_catalog — return the live block catalog from /api/mcp/block-catalog.
|
|
3
|
+
*
|
|
4
|
+
* Agents call this when they need the most up-to-date list of supported
|
|
5
|
+
* triggers/actions/conditions/utilities with their config field schemas.
|
|
6
|
+
* The route is auth-free (documentation) so this works without an API key.
|
|
7
|
+
*/
|
|
8
|
+
import { CTRL_API_BASE } from '../config.js';
|
|
9
|
+
export const GET_BLOCK_CATALOG_TOOL = {
|
|
10
|
+
name: 'ctrl_get_block_catalog',
|
|
11
|
+
description: "Return the live catalog of every CTRL workflow block (trigger, action, condition, utility) with id, label, description, and config-field schemas. Call this BEFORE ctrl_create_workflow whenever you're unsure about a block's exact config shape, or whenever you want the freshest list of supported blocks (CTRL ships new blocks regularly — the static plugin schema may lag). Optional input: { category } to narrow to a single bucket.",
|
|
12
|
+
inputSchema: {
|
|
13
|
+
type: 'object',
|
|
14
|
+
properties: {
|
|
15
|
+
category: {
|
|
16
|
+
type: 'string',
|
|
17
|
+
enum: ['trigger', 'action', 'condition', 'utility'],
|
|
18
|
+
description: 'Optional. Filter to a single block bucket. Omit to get all four.',
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
function isCategory(v) {
|
|
24
|
+
return v === 'trigger' || v === 'action' || v === 'condition' || v === 'utility';
|
|
25
|
+
}
|
|
26
|
+
function summarize(entries) {
|
|
27
|
+
return entries
|
|
28
|
+
.map((e) => {
|
|
29
|
+
const req = e.config_fields.filter((f) => f.required).map((f) => f.name);
|
|
30
|
+
const reqStr = req.length ? ` [required: ${req.join(', ')}]` : '';
|
|
31
|
+
return ` • ${e.id} — ${e.description}${reqStr}`;
|
|
32
|
+
})
|
|
33
|
+
.join('\n');
|
|
34
|
+
}
|
|
35
|
+
export async function handleGetBlockCatalog(rawInput) {
|
|
36
|
+
const input = (rawInput ?? {});
|
|
37
|
+
const category = isCategory(input.category) ? input.category : undefined;
|
|
38
|
+
const url = new URL('/api/mcp/block-catalog', CTRL_API_BASE);
|
|
39
|
+
if (category)
|
|
40
|
+
url.searchParams.set('category', category);
|
|
41
|
+
const controller = new AbortController();
|
|
42
|
+
const timeout = setTimeout(() => controller.abort(), 15_000);
|
|
43
|
+
let res;
|
|
44
|
+
try {
|
|
45
|
+
res = await fetch(url, {
|
|
46
|
+
method: 'GET',
|
|
47
|
+
headers: {
|
|
48
|
+
Accept: 'application/json',
|
|
49
|
+
'User-Agent': '@daxaur/ctrl-mcp',
|
|
50
|
+
},
|
|
51
|
+
signal: controller.signal,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
clearTimeout(timeout);
|
|
56
|
+
}
|
|
57
|
+
if (!res.ok) {
|
|
58
|
+
throw new Error(`Block catalog fetch failed: HTTP ${res.status} ${res.statusText}`);
|
|
59
|
+
}
|
|
60
|
+
const catalog = (await res.json());
|
|
61
|
+
const lines = [];
|
|
62
|
+
if (!category || category === 'trigger') {
|
|
63
|
+
lines.push(`Triggers (${catalog.triggers.length}):`);
|
|
64
|
+
lines.push(summarize(catalog.triggers));
|
|
65
|
+
}
|
|
66
|
+
if (!category || category === 'action') {
|
|
67
|
+
lines.push(`\nActions (${catalog.actions.length}):`);
|
|
68
|
+
lines.push(summarize(catalog.actions));
|
|
69
|
+
}
|
|
70
|
+
if (!category || category === 'condition') {
|
|
71
|
+
lines.push(`\nConditions (${catalog.conditions.length}):`);
|
|
72
|
+
lines.push(summarize(catalog.conditions));
|
|
73
|
+
}
|
|
74
|
+
if (!category || category === 'utility') {
|
|
75
|
+
lines.push(`\nUtilities (${catalog.utilities.length}):`);
|
|
76
|
+
lines.push(summarize(catalog.utilities));
|
|
77
|
+
}
|
|
78
|
+
lines.push('\nUse the structuredContent payload for full config_fields metadata when wiring up ctrl_create_workflow.');
|
|
79
|
+
return {
|
|
80
|
+
content: [{ type: 'text', text: lines.join('\n') }],
|
|
81
|
+
structuredContent: catalog,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=get-block-catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-block-catalog.js","sourceRoot":"","sources":["../../src/tools/get-block-catalog.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED