@synap-core/cli 1.7.0 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/agent-run.d.ts +47 -0
- package/dist/commands/agent-run.js +302 -0
- package/dist/commands/agent-run.js.map +1 -0
- package/dist/commands/artifact.d.ts +26 -0
- package/dist/commands/artifact.js +76 -0
- package/dist/commands/artifact.js.map +1 -0
- package/dist/commands/automation.d.ts +47 -0
- package/dist/commands/automation.js +600 -0
- package/dist/commands/automation.js.map +1 -0
- package/dist/commands/cell.d.ts +55 -0
- package/dist/commands/cell.js +277 -0
- package/dist/commands/cell.js.map +1 -0
- package/dist/commands/connect.js +41 -7
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/connections.js +0 -16
- package/dist/commands/connections.js.map +1 -1
- package/dist/commands/connectors.d.ts +31 -0
- package/dist/commands/connectors.js +276 -0
- package/dist/commands/connectors.js.map +1 -0
- package/dist/commands/context.d.ts +22 -0
- package/dist/commands/context.js +151 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/data-extra.d.ts +13 -0
- package/dist/commands/data-extra.js +161 -0
- package/dist/commands/data-extra.js.map +1 -0
- package/dist/commands/data.d.ts +13 -9
- package/dist/commands/data.js +213 -109
- package/dist/commands/data.js.map +1 -1
- package/dist/commands/doc.d.ts +39 -0
- package/dist/commands/doc.js +130 -0
- package/dist/commands/doc.js.map +1 -0
- package/dist/commands/events.d.ts +26 -0
- package/dist/commands/events.js +68 -0
- package/dist/commands/events.js.map +1 -0
- package/dist/commands/explain.d.ts +21 -0
- package/dist/commands/explain.js +248 -0
- package/dist/commands/explain.js.map +1 -0
- package/dist/commands/graph.d.ts +18 -0
- package/dist/commands/graph.js +73 -0
- package/dist/commands/graph.js.map +1 -0
- package/dist/commands/home.d.ts +12 -0
- package/dist/commands/home.js +54 -0
- package/dist/commands/home.js.map +1 -0
- package/dist/commands/init.d.ts +0 -2
- package/dist/commands/init.js +62 -102
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/keys.d.ts +9 -0
- package/dist/commands/keys.js +79 -0
- package/dist/commands/keys.js.map +1 -0
- package/dist/commands/knowledge.d.ts +32 -18
- package/dist/commands/knowledge.js +301 -55
- package/dist/commands/knowledge.js.map +1 -1
- package/dist/commands/observe.d.ts +9 -0
- package/dist/commands/observe.js +90 -0
- package/dist/commands/observe.js.map +1 -0
- package/dist/commands/open.d.ts +15 -0
- package/dist/commands/open.js +44 -0
- package/dist/commands/open.js.map +1 -0
- package/dist/commands/pods.d.ts +5 -0
- package/dist/commands/pods.js +85 -37
- package/dist/commands/pods.js.map +1 -1
- package/dist/commands/proposals-actions.d.ts +7 -0
- package/dist/commands/proposals-actions.js +40 -0
- package/dist/commands/proposals-actions.js.map +1 -0
- package/dist/commands/providers.d.ts +38 -0
- package/dist/commands/providers.js +170 -0
- package/dist/commands/providers.js.map +1 -0
- package/dist/commands/sessions.d.ts +31 -0
- package/dist/commands/sessions.js +224 -0
- package/dist/commands/sessions.js.map +1 -0
- package/dist/commands/skills-commands.d.ts +26 -0
- package/dist/commands/skills-commands.js +186 -0
- package/dist/commands/skills-commands.js.map +1 -0
- package/dist/commands/skills.d.ts +26 -0
- package/dist/commands/skills.js +195 -0
- package/dist/commands/skills.js.map +1 -0
- package/dist/commands/status.js +68 -30
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/subscribe.d.ts +19 -0
- package/dist/commands/subscribe.js +91 -0
- package/dist/commands/subscribe.js.map +1 -0
- package/dist/commands/view.d.ts +57 -0
- package/dist/commands/view.js +194 -0
- package/dist/commands/view.js.map +1 -0
- package/dist/index.d.ts +3 -4
- package/dist/index.js +812 -206
- package/dist/index.js.map +1 -1
- package/dist/lib/agent-templates.d.ts +25 -0
- package/dist/lib/agent-templates.js +148 -0
- package/dist/lib/agent-templates.js.map +1 -0
- package/dist/lib/agents-config.d.ts +4 -1
- package/dist/lib/agents-config.js +19 -2
- package/dist/lib/agents-config.js.map +1 -1
- package/dist/lib/capture-lane.d.ts +49 -0
- package/dist/lib/capture-lane.js +79 -0
- package/dist/lib/capture-lane.js.map +1 -0
- package/dist/lib/hub-client.d.ts +6 -0
- package/dist/lib/hub-client.js +31 -3
- package/dist/lib/hub-client.js.map +1 -1
- package/dist/lib/pod.d.ts +14 -1
- package/dist/lib/pod.js +24 -2
- package/dist/lib/pod.js.map +1 -1
- package/dist/lib/skills-installer.d.ts +1 -1
- package/dist/lib/skills-installer.js +1 -1
- package/dist/lib/skills-installer.js.map +1 -1
- package/dist/lib/targets.d.ts +17 -1
- package/dist/lib/targets.js +713 -63
- package/dist/lib/targets.js.map +1 -1
- package/package.json +2 -1
- package/skills/synap/SKILL.md +357 -82
- package/skills/synap-ui/SKILL.md +12 -9
- package/dist/lib/templates.d.ts +0 -11
- package/dist/lib/templates.js +0 -13
- package/dist/lib/templates.js.map +0 -1
- package/dist/templates/agent-os.json +0 -3090
|
@@ -0,0 +1,600 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* synap automation — Create, manage, and inspect pod automations
|
|
3
|
+
*
|
|
4
|
+
* Subcommands: list, describe, create, enable, disable, delete, schema
|
|
5
|
+
*/
|
|
6
|
+
import chalk from "chalk";
|
|
7
|
+
import ora from "ora";
|
|
8
|
+
import prompts from "prompts";
|
|
9
|
+
import { readFileSync, mkdirSync, writeFileSync, existsSync } from "fs";
|
|
10
|
+
import { resolveHubConfig, resolveUserId, hubGet, hubPost } from "../lib/hub-client.js";
|
|
11
|
+
import { log } from "../utils/logger.js";
|
|
12
|
+
// ── Helpers ───────────────────────────────────────────────────────────────────
|
|
13
|
+
function statusBadge(status) {
|
|
14
|
+
switch (status) {
|
|
15
|
+
case "active":
|
|
16
|
+
return chalk.green("●");
|
|
17
|
+
case "draft":
|
|
18
|
+
return chalk.yellow("○");
|
|
19
|
+
case "paused":
|
|
20
|
+
return chalk.red("⊘");
|
|
21
|
+
case "error":
|
|
22
|
+
return chalk.red("✗");
|
|
23
|
+
default:
|
|
24
|
+
return chalk.dim("?");
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function extractResult(res) {
|
|
28
|
+
// tRPC wraps responses in { result: { data: { json: ... } } }
|
|
29
|
+
const r = res;
|
|
30
|
+
if (r.result !== undefined) {
|
|
31
|
+
const result = r.result;
|
|
32
|
+
if (result.data !== undefined) {
|
|
33
|
+
const data = result.data;
|
|
34
|
+
if (data.json !== undefined)
|
|
35
|
+
return data.json;
|
|
36
|
+
return data;
|
|
37
|
+
}
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
40
|
+
return res;
|
|
41
|
+
}
|
|
42
|
+
async function trpcQuery(procedure, input, cfg) {
|
|
43
|
+
// Hub-protocol procedures require the acting userId in their input.
|
|
44
|
+
if (input.userId === undefined)
|
|
45
|
+
input.userId = await resolveUserId(cfg);
|
|
46
|
+
// Backend tRPC uses the superjson transformer: GET input must be wrapped
|
|
47
|
+
// in the { json: ... } envelope (mirrors the POST body shape below).
|
|
48
|
+
const res = await hubGet(`/trpc/${procedure}`, { input: JSON.stringify({ json: input }) }, cfg);
|
|
49
|
+
return extractResult(res);
|
|
50
|
+
}
|
|
51
|
+
async function trpcMutation(procedure, input, cfg) {
|
|
52
|
+
if (input.userId === undefined)
|
|
53
|
+
input.userId = await resolveUserId(cfg);
|
|
54
|
+
const res = await hubPost(`/trpc/${procedure}`, { json: input }, cfg);
|
|
55
|
+
return extractResult(res);
|
|
56
|
+
}
|
|
57
|
+
function parseYamlOrJson(filePath) {
|
|
58
|
+
const content = readFileSync(filePath, "utf-8").trim();
|
|
59
|
+
// JSON path
|
|
60
|
+
if (filePath.endsWith(".json") || content.startsWith("{")) {
|
|
61
|
+
return JSON.parse(content);
|
|
62
|
+
}
|
|
63
|
+
// YAML path — require js-yaml if available, otherwise throw a helpful error
|
|
64
|
+
try {
|
|
65
|
+
// Dynamic require-style import for optional dependency
|
|
66
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
67
|
+
const yaml = require("js-yaml");
|
|
68
|
+
return yaml.load(content);
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
throw new Error("YAML parsing requires js-yaml. Install it: pnpm add js-yaml\n" +
|
|
72
|
+
"Alternatively, convert your file to JSON and pass a .json file.");
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function interpolateEnv(obj) {
|
|
76
|
+
if (typeof obj === "string") {
|
|
77
|
+
return obj.replace(/\{\{env\.([^}]+)\}\}/g, (_, varName) => {
|
|
78
|
+
const val = process.env[varName];
|
|
79
|
+
if (val === undefined) {
|
|
80
|
+
log.warn(`Environment variable not set: ${varName}`);
|
|
81
|
+
return `{{env.${varName}}}`;
|
|
82
|
+
}
|
|
83
|
+
return val;
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
if (Array.isArray(obj)) {
|
|
87
|
+
return obj.map(interpolateEnv);
|
|
88
|
+
}
|
|
89
|
+
if (obj !== null && typeof obj === "object") {
|
|
90
|
+
const result = {};
|
|
91
|
+
for (const [k, v] of Object.entries(obj)) {
|
|
92
|
+
result[k] = interpolateEnv(v);
|
|
93
|
+
}
|
|
94
|
+
return result;
|
|
95
|
+
}
|
|
96
|
+
return obj;
|
|
97
|
+
}
|
|
98
|
+
function parseTriggerSpec(spec) {
|
|
99
|
+
if (spec.startsWith("event:")) {
|
|
100
|
+
return {
|
|
101
|
+
triggerType: "event",
|
|
102
|
+
triggerConfig: { eventPattern: spec.slice("event:".length) },
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
if (spec.startsWith("cron:")) {
|
|
106
|
+
return {
|
|
107
|
+
triggerType: "cron",
|
|
108
|
+
triggerConfig: { expression: spec.slice("cron:".length) },
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
if (spec === "webhook") {
|
|
112
|
+
return { triggerType: "webhook", triggerConfig: {} };
|
|
113
|
+
}
|
|
114
|
+
if (spec === "manual") {
|
|
115
|
+
return { triggerType: "manual", triggerConfig: {} };
|
|
116
|
+
}
|
|
117
|
+
throw new Error(`Invalid --trigger spec: "${spec}"\n` +
|
|
118
|
+
`Valid formats: event:<pattern> | cron:<expression> | webhook | manual`);
|
|
119
|
+
}
|
|
120
|
+
function parseFilters(filterArgs) {
|
|
121
|
+
const result = {};
|
|
122
|
+
for (const kv of filterArgs) {
|
|
123
|
+
const eqIdx = kv.indexOf("=");
|
|
124
|
+
if (eqIdx === -1) {
|
|
125
|
+
throw new Error(`Invalid --filter value: "${kv}" — expected key=value format`);
|
|
126
|
+
}
|
|
127
|
+
result[kv.slice(0, eqIdx)] = kv.slice(eqIdx + 1);
|
|
128
|
+
}
|
|
129
|
+
return result;
|
|
130
|
+
}
|
|
131
|
+
function buildFlowDefinition(triggerType, triggerConfig, action, message, channel) {
|
|
132
|
+
const triggerNode = {
|
|
133
|
+
id: "trigger-1",
|
|
134
|
+
type: "trigger",
|
|
135
|
+
position: { x: 0, y: 0 },
|
|
136
|
+
data: {
|
|
137
|
+
triggerType,
|
|
138
|
+
label: "Trigger",
|
|
139
|
+
config: triggerConfig,
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
if (action === "none") {
|
|
143
|
+
return { nodes: [triggerNode], edges: [] };
|
|
144
|
+
}
|
|
145
|
+
let outputType;
|
|
146
|
+
let actionConfig;
|
|
147
|
+
let actionLabel;
|
|
148
|
+
if (action === "notify") {
|
|
149
|
+
outputType = "notification";
|
|
150
|
+
actionLabel = "Notify";
|
|
151
|
+
actionConfig = { title: "Automation alert", body: message ?? "" };
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
// channel-message
|
|
155
|
+
outputType = "channel_message";
|
|
156
|
+
actionLabel = "Channel Message";
|
|
157
|
+
actionConfig = { channelId: channel ?? "", content: message ?? "" };
|
|
158
|
+
}
|
|
159
|
+
const outputNode = {
|
|
160
|
+
id: "output-1",
|
|
161
|
+
type: "output",
|
|
162
|
+
position: { x: 0, y: 200 },
|
|
163
|
+
data: {
|
|
164
|
+
label: actionLabel,
|
|
165
|
+
outputType,
|
|
166
|
+
config: actionConfig,
|
|
167
|
+
},
|
|
168
|
+
};
|
|
169
|
+
return {
|
|
170
|
+
nodes: [triggerNode, outputNode],
|
|
171
|
+
edges: [{ id: "e1", source: "trigger-1", target: "output-1" }],
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
export async function automationList(opts) {
|
|
175
|
+
let cfg;
|
|
176
|
+
try {
|
|
177
|
+
cfg = await resolveHubConfig();
|
|
178
|
+
}
|
|
179
|
+
catch (err) {
|
|
180
|
+
log.error(err.message);
|
|
181
|
+
process.exit(1);
|
|
182
|
+
}
|
|
183
|
+
const workspaceId = opts.workspace ?? cfg.workspaceId;
|
|
184
|
+
if (opts.json) {
|
|
185
|
+
const input = {};
|
|
186
|
+
if (workspaceId)
|
|
187
|
+
input.workspaceId = workspaceId;
|
|
188
|
+
if (opts.status)
|
|
189
|
+
input.status = opts.status;
|
|
190
|
+
const data = await trpcQuery("automations.listAutomations", input, cfg);
|
|
191
|
+
console.log(JSON.stringify(data, null, 2));
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
const spinner = ora({ text: "Fetching automations…", color: "cyan" }).start();
|
|
195
|
+
let automations;
|
|
196
|
+
try {
|
|
197
|
+
const input = {};
|
|
198
|
+
if (workspaceId)
|
|
199
|
+
input.workspaceId = workspaceId;
|
|
200
|
+
if (opts.status)
|
|
201
|
+
input.status = opts.status;
|
|
202
|
+
const data = await trpcQuery("automations.listAutomations", input, cfg);
|
|
203
|
+
automations = (Array.isArray(data) ? data : data.automations ?? []);
|
|
204
|
+
spinner.stop();
|
|
205
|
+
}
|
|
206
|
+
catch (err) {
|
|
207
|
+
spinner.fail(chalk.red("Failed to fetch automations"));
|
|
208
|
+
log.error(err.message);
|
|
209
|
+
process.exit(1);
|
|
210
|
+
}
|
|
211
|
+
if (automations.length === 0) {
|
|
212
|
+
log.warn("No automations found.");
|
|
213
|
+
log.dim('Create one: synap automation create --name "My automation" --trigger event:entity.create.completed');
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
log.heading(`Automations (${automations.length})`);
|
|
217
|
+
console.log();
|
|
218
|
+
for (const a of automations) {
|
|
219
|
+
const badge = statusBadge(a.status);
|
|
220
|
+
const triggerLabel = chalk.cyan(a.triggerType.padEnd(8));
|
|
221
|
+
console.log(` ${badge} ${chalk.bold(a.name.padEnd(32))} ${triggerLabel} ${chalk.dim(a.id)}`);
|
|
222
|
+
}
|
|
223
|
+
console.log();
|
|
224
|
+
}
|
|
225
|
+
export async function automationDescribe(id, opts) {
|
|
226
|
+
let cfg;
|
|
227
|
+
try {
|
|
228
|
+
cfg = await resolveHubConfig();
|
|
229
|
+
}
|
|
230
|
+
catch (err) {
|
|
231
|
+
log.error(err.message);
|
|
232
|
+
process.exit(1);
|
|
233
|
+
}
|
|
234
|
+
const workspaceId = opts.workspace ?? cfg.workspaceId;
|
|
235
|
+
const input = { id };
|
|
236
|
+
if (workspaceId)
|
|
237
|
+
input.workspaceId = workspaceId;
|
|
238
|
+
if (opts.json) {
|
|
239
|
+
const data = await trpcQuery("automations.getAutomation", input, cfg);
|
|
240
|
+
console.log(JSON.stringify(data, null, 2));
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
const spinner = ora({ text: "Fetching automation…", color: "cyan" }).start();
|
|
244
|
+
let automation;
|
|
245
|
+
try {
|
|
246
|
+
const data = await trpcQuery("automations.getAutomation", input, cfg);
|
|
247
|
+
automation = data;
|
|
248
|
+
spinner.stop();
|
|
249
|
+
}
|
|
250
|
+
catch (err) {
|
|
251
|
+
spinner.fail(chalk.red("Failed to fetch automation"));
|
|
252
|
+
log.error(err.message);
|
|
253
|
+
process.exit(1);
|
|
254
|
+
}
|
|
255
|
+
log.heading(`Automation: ${chalk.bold(automation.name)}`);
|
|
256
|
+
console.log();
|
|
257
|
+
console.log(` ${chalk.dim("id")} ${chalk.dim(automation.id)}`);
|
|
258
|
+
console.log(` ${chalk.dim("status")} ${statusBadge(automation.status)} ${automation.status}`);
|
|
259
|
+
console.log(` ${chalk.dim("trigger type")} ${chalk.cyan(automation.triggerType)}`);
|
|
260
|
+
if (automation.triggerConfig && Object.keys(automation.triggerConfig).length > 0) {
|
|
261
|
+
console.log(` ${chalk.dim("trigger config")}`);
|
|
262
|
+
for (const [k, v] of Object.entries(automation.triggerConfig)) {
|
|
263
|
+
if (v !== undefined) {
|
|
264
|
+
const val = typeof v === "object" ? JSON.stringify(v) : String(v);
|
|
265
|
+
console.log(` ${chalk.dim(k.padEnd(16))} ${val}`);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
const nodeCount = automation.flowDefinition?.nodes?.length ?? 0;
|
|
270
|
+
console.log(` ${chalk.dim("nodes")} ${nodeCount}`);
|
|
271
|
+
if (automation.description) {
|
|
272
|
+
console.log(` ${chalk.dim("description")} ${automation.description}`);
|
|
273
|
+
}
|
|
274
|
+
if (automation.createdAt) {
|
|
275
|
+
console.log(` ${chalk.dim("created")} ${new Date(automation.createdAt).toLocaleString()}`);
|
|
276
|
+
}
|
|
277
|
+
if (automation.updatedAt) {
|
|
278
|
+
console.log(` ${chalk.dim("updated")} ${new Date(automation.updatedAt).toLocaleString()}`);
|
|
279
|
+
}
|
|
280
|
+
console.log();
|
|
281
|
+
}
|
|
282
|
+
export async function automationCreate(opts) {
|
|
283
|
+
let cfg;
|
|
284
|
+
try {
|
|
285
|
+
cfg = await resolveHubConfig();
|
|
286
|
+
}
|
|
287
|
+
catch (err) {
|
|
288
|
+
log.error(err.message);
|
|
289
|
+
process.exit(1);
|
|
290
|
+
}
|
|
291
|
+
const workspaceId = opts.workspace ?? cfg.workspaceId;
|
|
292
|
+
const spinner = ora({ text: "Creating automation…", color: "cyan" }).start();
|
|
293
|
+
let payload;
|
|
294
|
+
if (opts.from) {
|
|
295
|
+
// File mode
|
|
296
|
+
let fileData;
|
|
297
|
+
try {
|
|
298
|
+
fileData = parseYamlOrJson(opts.from);
|
|
299
|
+
}
|
|
300
|
+
catch (err) {
|
|
301
|
+
spinner.fail(chalk.red("Failed to read file"));
|
|
302
|
+
log.error(err.message);
|
|
303
|
+
process.exit(1);
|
|
304
|
+
}
|
|
305
|
+
// Apply {{env.VAR}} substitution
|
|
306
|
+
fileData = interpolateEnv(fileData);
|
|
307
|
+
// Map YAML structure to API payload
|
|
308
|
+
const flowDef = (fileData.flow ?? fileData.flowDefinition);
|
|
309
|
+
const triggerCfg = fileData.triggerConfig;
|
|
310
|
+
payload = {
|
|
311
|
+
name: fileData.name,
|
|
312
|
+
description: fileData.description,
|
|
313
|
+
triggerType: fileData.trigger,
|
|
314
|
+
triggerConfig: triggerCfg ?? {},
|
|
315
|
+
flowDefinition: flowDef ?? { nodes: [], edges: [] },
|
|
316
|
+
status: (opts.status ?? fileData.status ?? "draft"),
|
|
317
|
+
};
|
|
318
|
+
if (workspaceId)
|
|
319
|
+
payload.workspaceId = workspaceId;
|
|
320
|
+
if (!payload.name || !payload.triggerType) {
|
|
321
|
+
spinner.fail(chalk.red("File must contain 'name' and 'trigger' fields"));
|
|
322
|
+
process.exit(1);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
// Quick mode
|
|
327
|
+
if (!opts.name) {
|
|
328
|
+
spinner.fail(chalk.red("--name is required in quick mode"));
|
|
329
|
+
log.dim("Use --from <file.yaml> for file-based creation, or --name + --trigger for quick mode.");
|
|
330
|
+
process.exit(1);
|
|
331
|
+
}
|
|
332
|
+
if (!opts.trigger) {
|
|
333
|
+
spinner.fail(chalk.red("--trigger is required in quick mode"));
|
|
334
|
+
log.dim("Example: --trigger event:entity.create.completed or --trigger cron:0 9 * * MON");
|
|
335
|
+
process.exit(1);
|
|
336
|
+
}
|
|
337
|
+
let triggerType;
|
|
338
|
+
let triggerConfig;
|
|
339
|
+
try {
|
|
340
|
+
({ triggerType, triggerConfig } = parseTriggerSpec(opts.trigger));
|
|
341
|
+
}
|
|
342
|
+
catch (err) {
|
|
343
|
+
spinner.fail(chalk.red("Invalid --trigger spec"));
|
|
344
|
+
log.error(err.message);
|
|
345
|
+
process.exit(1);
|
|
346
|
+
}
|
|
347
|
+
// Apply --filter for event triggers
|
|
348
|
+
if (opts.filter && opts.filter.length > 0) {
|
|
349
|
+
if (triggerType !== "event") {
|
|
350
|
+
spinner.fail(chalk.red("--filter is only valid for event triggers"));
|
|
351
|
+
process.exit(1);
|
|
352
|
+
}
|
|
353
|
+
try {
|
|
354
|
+
triggerConfig.filters = parseFilters(opts.filter);
|
|
355
|
+
}
|
|
356
|
+
catch (err) {
|
|
357
|
+
spinner.fail(chalk.red("Invalid --filter value"));
|
|
358
|
+
log.error(err.message);
|
|
359
|
+
process.exit(1);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
const action = (opts.action ?? "none");
|
|
363
|
+
if (action === "channel-message" && !opts.channel) {
|
|
364
|
+
spinner.fail(chalk.red("--channel is required for channel-message action"));
|
|
365
|
+
process.exit(1);
|
|
366
|
+
}
|
|
367
|
+
const flowDefinition = buildFlowDefinition(triggerType, triggerConfig, action, opts.message, opts.channel);
|
|
368
|
+
payload = {
|
|
369
|
+
name: opts.name,
|
|
370
|
+
triggerType,
|
|
371
|
+
triggerConfig,
|
|
372
|
+
flowDefinition,
|
|
373
|
+
status: (opts.status ?? "draft"),
|
|
374
|
+
};
|
|
375
|
+
if (opts.description)
|
|
376
|
+
payload.description = opts.description;
|
|
377
|
+
if (workspaceId)
|
|
378
|
+
payload.workspaceId = workspaceId;
|
|
379
|
+
}
|
|
380
|
+
let result;
|
|
381
|
+
try {
|
|
382
|
+
const data = await trpcMutation("automations.createAutomation", payload, cfg);
|
|
383
|
+
// Response shape may be: { automation: {...} } | { id, name, ... } | raw Automation
|
|
384
|
+
const raw = data;
|
|
385
|
+
const inner = (raw.automation ?? raw);
|
|
386
|
+
result = inner;
|
|
387
|
+
}
|
|
388
|
+
catch (err) {
|
|
389
|
+
spinner.fail(chalk.red("Failed to create automation"));
|
|
390
|
+
log.error(err.message);
|
|
391
|
+
process.exit(1);
|
|
392
|
+
}
|
|
393
|
+
spinner.succeed(chalk.green(`Automation created`));
|
|
394
|
+
console.log();
|
|
395
|
+
console.log(` ${chalk.dim("id")} ${chalk.dim(result.id ?? "—")}`);
|
|
396
|
+
console.log(` ${chalk.dim("name")} ${chalk.bold(result.name ?? "—")}`);
|
|
397
|
+
console.log(` ${chalk.dim("status")} ${statusBadge((result.status ?? "draft"))} ${result.status ?? "draft"}`);
|
|
398
|
+
console.log();
|
|
399
|
+
log.dim(`Enable it: synap automation enable ${result.id ?? "<id>"}`);
|
|
400
|
+
}
|
|
401
|
+
export async function automationEnable(id, opts) {
|
|
402
|
+
let cfg;
|
|
403
|
+
try {
|
|
404
|
+
cfg = await resolveHubConfig();
|
|
405
|
+
}
|
|
406
|
+
catch (err) {
|
|
407
|
+
log.error(err.message);
|
|
408
|
+
process.exit(1);
|
|
409
|
+
}
|
|
410
|
+
const workspaceId = opts.workspace ?? cfg.workspaceId;
|
|
411
|
+
const spinner = ora({ text: "Activating automation…", color: "cyan" }).start();
|
|
412
|
+
const input = { id };
|
|
413
|
+
if (workspaceId)
|
|
414
|
+
input.workspaceId = workspaceId;
|
|
415
|
+
let result;
|
|
416
|
+
try {
|
|
417
|
+
const data = await trpcMutation("automations.activateAutomation", input, cfg);
|
|
418
|
+
result = data;
|
|
419
|
+
}
|
|
420
|
+
catch (err) {
|
|
421
|
+
spinner.fail(chalk.red("Failed to activate automation"));
|
|
422
|
+
log.error(err.message);
|
|
423
|
+
process.exit(1);
|
|
424
|
+
}
|
|
425
|
+
spinner.stop();
|
|
426
|
+
log.success(`Automation ${chalk.bold(result.name ?? id)} is now active`);
|
|
427
|
+
}
|
|
428
|
+
export async function automationDisable(id, opts) {
|
|
429
|
+
let cfg;
|
|
430
|
+
try {
|
|
431
|
+
cfg = await resolveHubConfig();
|
|
432
|
+
}
|
|
433
|
+
catch (err) {
|
|
434
|
+
log.error(err.message);
|
|
435
|
+
process.exit(1);
|
|
436
|
+
}
|
|
437
|
+
const workspaceId = opts.workspace ?? cfg.workspaceId;
|
|
438
|
+
const spinner = ora({ text: "Pausing automation…", color: "cyan" }).start();
|
|
439
|
+
const input = { id };
|
|
440
|
+
if (workspaceId)
|
|
441
|
+
input.workspaceId = workspaceId;
|
|
442
|
+
let result;
|
|
443
|
+
try {
|
|
444
|
+
const data = await trpcMutation("automations.pauseAutomation", input, cfg);
|
|
445
|
+
result = data;
|
|
446
|
+
}
|
|
447
|
+
catch (err) {
|
|
448
|
+
spinner.fail(chalk.red("Failed to pause automation"));
|
|
449
|
+
log.error(err.message);
|
|
450
|
+
process.exit(1);
|
|
451
|
+
}
|
|
452
|
+
spinner.stop();
|
|
453
|
+
console.log(` ${chalk.red("⊘")} Automation ${chalk.bold(result.name ?? id)} paused`);
|
|
454
|
+
}
|
|
455
|
+
export async function automationDelete(id, opts) {
|
|
456
|
+
let cfg;
|
|
457
|
+
try {
|
|
458
|
+
cfg = await resolveHubConfig();
|
|
459
|
+
}
|
|
460
|
+
catch (err) {
|
|
461
|
+
log.error(err.message);
|
|
462
|
+
process.exit(1);
|
|
463
|
+
}
|
|
464
|
+
const workspaceId = opts.workspace ?? cfg.workspaceId;
|
|
465
|
+
// Fetch name for confirmation prompt
|
|
466
|
+
let automationName = id;
|
|
467
|
+
if (!opts.force) {
|
|
468
|
+
try {
|
|
469
|
+
const input = { id };
|
|
470
|
+
if (workspaceId)
|
|
471
|
+
input.workspaceId = workspaceId;
|
|
472
|
+
const data = await trpcQuery("automations.getAutomation", input, cfg);
|
|
473
|
+
automationName = data.name ?? id;
|
|
474
|
+
}
|
|
475
|
+
catch {
|
|
476
|
+
// Fall back to ID in prompt
|
|
477
|
+
}
|
|
478
|
+
const response = await prompts({
|
|
479
|
+
type: "confirm",
|
|
480
|
+
name: "confirmed",
|
|
481
|
+
message: `Delete automation '${automationName}'?`,
|
|
482
|
+
initial: false,
|
|
483
|
+
});
|
|
484
|
+
if (!response.confirmed) {
|
|
485
|
+
log.dim("Cancelled.");
|
|
486
|
+
return;
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
const spinner = ora({ text: "Deleting automation…", color: "cyan" }).start();
|
|
490
|
+
const input = { id };
|
|
491
|
+
if (workspaceId)
|
|
492
|
+
input.workspaceId = workspaceId;
|
|
493
|
+
try {
|
|
494
|
+
await trpcMutation("automations.deleteAutomation", input, cfg);
|
|
495
|
+
}
|
|
496
|
+
catch (err) {
|
|
497
|
+
spinner.fail(chalk.red("Failed to delete automation"));
|
|
498
|
+
log.error(err.message);
|
|
499
|
+
process.exit(1);
|
|
500
|
+
}
|
|
501
|
+
spinner.succeed(chalk.green(`Automation '${automationName}' deleted`));
|
|
502
|
+
}
|
|
503
|
+
export async function automationSchema(opts) {
|
|
504
|
+
let cfg;
|
|
505
|
+
try {
|
|
506
|
+
cfg = await resolveHubConfig();
|
|
507
|
+
}
|
|
508
|
+
catch (err) {
|
|
509
|
+
log.error(err.message);
|
|
510
|
+
process.exit(1);
|
|
511
|
+
}
|
|
512
|
+
const spinner = opts.json ? null : ora({ text: "Fetching schema…", color: "cyan" }).start();
|
|
513
|
+
let schema;
|
|
514
|
+
try {
|
|
515
|
+
// hubGet already prefixes ${podUrl}/api/hub — pass only the sub-path.
|
|
516
|
+
schema = await hubGet("/automations/schema", {}, cfg);
|
|
517
|
+
spinner?.stop();
|
|
518
|
+
}
|
|
519
|
+
catch (err) {
|
|
520
|
+
spinner?.fail(chalk.red("Failed to fetch schema"));
|
|
521
|
+
log.error(err.message);
|
|
522
|
+
process.exit(1);
|
|
523
|
+
}
|
|
524
|
+
if (opts.json) {
|
|
525
|
+
console.log(JSON.stringify(schema, null, 2));
|
|
526
|
+
return;
|
|
527
|
+
}
|
|
528
|
+
const s = schema;
|
|
529
|
+
const podUrl = cfg.podUrl;
|
|
530
|
+
const md = buildSchemaMarkdown(s, podUrl);
|
|
531
|
+
if (opts.writeContext !== undefined && opts.writeContext !== false) {
|
|
532
|
+
const outputPath = typeof opts.writeContext === "string" && opts.writeContext.length > 0
|
|
533
|
+
? opts.writeContext
|
|
534
|
+
: ".claude/AUTOMATION_CONTEXT.md";
|
|
535
|
+
const dir = outputPath.includes("/") ? outputPath.split("/").slice(0, -1).join("/") : ".";
|
|
536
|
+
if (dir && dir !== "." && !existsSync(dir)) {
|
|
537
|
+
mkdirSync(dir, { recursive: true });
|
|
538
|
+
}
|
|
539
|
+
writeFileSync(outputPath, md, "utf-8");
|
|
540
|
+
log.success(`Context written to ${chalk.underline(outputPath)} — Claude Code will auto-load this in all sessions from this directory`);
|
|
541
|
+
}
|
|
542
|
+
else {
|
|
543
|
+
console.log(md);
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
function buildSchemaMarkdown(schema, podUrl) {
|
|
547
|
+
const lines = [
|
|
548
|
+
`# Synap Automation DSL Reference`,
|
|
549
|
+
``,
|
|
550
|
+
`> Fetched from pod: ${podUrl} — use this context to create, understand, and debug automations.`,
|
|
551
|
+
``,
|
|
552
|
+
`## Trigger Types`,
|
|
553
|
+
];
|
|
554
|
+
const triggerTypes = (schema.triggerTypes ?? schema.triggers ?? {});
|
|
555
|
+
if (Object.keys(triggerTypes).length > 0) {
|
|
556
|
+
for (const [name, def] of Object.entries(triggerTypes)) {
|
|
557
|
+
const d = def;
|
|
558
|
+
lines.push(``, `### ${name}`);
|
|
559
|
+
if (d.description)
|
|
560
|
+
lines.push(``, String(d.description));
|
|
561
|
+
if (d.fields) {
|
|
562
|
+
lines.push(``, `**Fields:**`);
|
|
563
|
+
for (const [field, fdesc] of Object.entries(d.fields)) {
|
|
564
|
+
lines.push(`- \`${field}\` — ${fdesc}`);
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
if (d.examples) {
|
|
568
|
+
lines.push(``, `**Examples:**`);
|
|
569
|
+
for (const ex of d.examples) {
|
|
570
|
+
lines.push(`- \`${ex}\``);
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
else {
|
|
576
|
+
lines.push(``, `### event`, ``, `Fires when a pod event matches the pattern.`, ``, `**Fields:**`, `- \`eventPattern\` — event path with optional trailing wildcard`, `- \`filters\` — dot-notation key-value equality checks on event.data`, ``, `**Common patterns:**`, `- \`entity.create.completed\` — new entity created (use this; .validated only fires on proposal-approval path)`, `- \`entity.update.completed\` — entity updated`, `- \`entity.update.*\` — any entity update event`, `- \`import.complete\` — import finished`, ``, `### cron`, ``, `Fires on a cron schedule.`, ``, `**Fields:**`, `- \`expression\` — standard 5-part cron expression (minute hour day month weekday)`, ``, `### webhook`, ``, `Fires when the automation's webhook URL receives a POST request.`, ``, `### manual`, ``, `Only fires when explicitly triggered via the API or CLI.`);
|
|
577
|
+
}
|
|
578
|
+
lines.push(``, `## Node Types`);
|
|
579
|
+
const nodeTypes = (schema.nodeTypes ?? schema.nodes ?? {});
|
|
580
|
+
if (Object.keys(nodeTypes).length > 0) {
|
|
581
|
+
for (const [name, def] of Object.entries(nodeTypes)) {
|
|
582
|
+
const d = def;
|
|
583
|
+
lines.push(``, `### ${name}`);
|
|
584
|
+
if (d.description)
|
|
585
|
+
lines.push(``, String(d.description));
|
|
586
|
+
if (d.fields) {
|
|
587
|
+
lines.push(``, `**Fields:**`);
|
|
588
|
+
for (const [field, fdesc] of Object.entries(d.fields)) {
|
|
589
|
+
lines.push(`- \`${field}\` — ${fdesc}`);
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
else {
|
|
595
|
+
lines.push(``, `### trigger`, ``, `Entry point for the flow. Exactly one per automation.`, ``, `**data fields:**`, `- \`triggerType\` — event | cron | webhook | manual`, `- \`label\` — display name`, `- \`config\` — trigger-specific config object (eventPattern, filters, expression)`, ``, `### output`, ``, `Sends a notification or message when reached.`, ``, `**data fields:**`, `- \`outputType\` — notification | channel_message`, `- \`label\` — display name`, `- \`config\` — output-specific config (title, body for notification; channelId, content for channel_message)`);
|
|
596
|
+
}
|
|
597
|
+
lines.push(``, `## Template Syntax`, ``, `String values support \`{{...}}\` template expressions:`, ``, `- \`{{trigger.payload.entity.title}}\` — field from the triggering event`, `- \`{{trigger.payload.entity.id}}\` — entity ID from trigger`, `- \`{{env.MY_VAR}}\` — environment variable (resolved at CLI create-time when using \`--from\`)`, ``, `## Quick-Create Examples`, ``, `\`\`\`bash`, `# Notify when a note is created`, `synap automation create --name "Note alert" --trigger "event:entity.create.completed" --filter "profileSlug=note" --action notify --message "New note: {{trigger.payload.entity.title}}"`, ``, `# Weekly digest every Monday at 9am`, `synap automation create --name "Weekly digest" --trigger "cron:0 9 * * MON" --action channel-message --channel "#general" --message "Weekly digest ready."`, ``, `# Manual-only automation (draft, no action)`, `synap automation create --name "Manual trigger" --trigger manual`, `\`\`\``, ``, `## YAML File Format`, ``, `\`\`\`yaml`, `name: string`, `description: string # optional`, `trigger: event | cron | webhook | manual`, `triggerConfig:`, ` eventPattern: string # for event triggers`, ` filters: # for event triggers`, ` key: value`, ` expression: string # for cron triggers`, `status: draft | active`, `flow:`, ` nodes:`, ` - id: trigger-1`, ` type: trigger`, ` position: { x: 0, y: 0 }`, ` data:`, ` triggerType: event`, ` label: Trigger`, ` config:`, ` eventPattern: entity.create.completed`, ` edges: []`, `\`\`\``, ``, `> **Env substitution**: \`{{env.MY_VAR}}\` in any string value is replaced with \`process.env.MY_VAR\` at create-time.`);
|
|
598
|
+
return lines.join("\n");
|
|
599
|
+
}
|
|
600
|
+
//# sourceMappingURL=automation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"automation.js","sourceRoot":"","sources":["../../src/commands/automation.ts"],"names":[],"mappings":"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"}
|