ethos-cli 0.8.1 → 0.9.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/bin/ethos.js
CHANGED
|
@@ -13,6 +13,7 @@ import { registerHooks } from "../commands/hooks.js";
|
|
|
13
13
|
import { registerLists } from "../commands/lists.js";
|
|
14
14
|
import { registerSkills } from "../commands/skills.js";
|
|
15
15
|
import { registerTables } from "../commands/tables.js";
|
|
16
|
+
import { registerWorkflows } from "../commands/workflows.js";
|
|
16
17
|
import { registerWorkspaceContext } from "../commands/workspace-context.js";
|
|
17
18
|
import { addGlobalOptions } from "../lib/config.js";
|
|
18
19
|
import { printError } from "../lib/output.js";
|
|
@@ -33,6 +34,7 @@ export function createEthosProgram() {
|
|
|
33
34
|
registerLists(program);
|
|
34
35
|
registerSkills(program);
|
|
35
36
|
registerTables(program);
|
|
37
|
+
registerWorkflows(program);
|
|
36
38
|
registerWorkspaceContext(program);
|
|
37
39
|
return program;
|
|
38
40
|
}
|
package/dist/bin/ethos.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ethos.js","sourceRoot":"","sources":["../../src/bin/ethos.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ethos.js","sourceRoot":"","sources":["../../src/bin/ethos.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { collect, compactObject, jsonRequest, parsePositiveInteger, pathId, withClient } from "../lib/command-helpers.js";
|
|
2
|
+
import { printResult } from "../lib/output.js";
|
|
3
|
+
const STEP_CONFIG_KEYS = {
|
|
4
|
+
add_to_campaign: "campaign_id",
|
|
5
|
+
add_to_table: "table_id",
|
|
6
|
+
};
|
|
7
|
+
function parseStepOption(value, position) {
|
|
8
|
+
const separator = value.indexOf(":");
|
|
9
|
+
if (separator === -1) {
|
|
10
|
+
throw new Error(`--step must look like <action>:<id> or <action>:<json>, got '${value}'`);
|
|
11
|
+
}
|
|
12
|
+
const actionType = value.slice(0, separator);
|
|
13
|
+
const rest = value.slice(separator + 1);
|
|
14
|
+
let config;
|
|
15
|
+
if (rest.trim().startsWith("{")) {
|
|
16
|
+
config = JSON.parse(rest);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
const configKey = STEP_CONFIG_KEYS[actionType];
|
|
20
|
+
if (!configKey) {
|
|
21
|
+
throw new Error(`Unknown step action '${actionType}'; pass explicit JSON config as <action>:{"..."}`);
|
|
22
|
+
}
|
|
23
|
+
config = { [configKey]: rest };
|
|
24
|
+
}
|
|
25
|
+
return { position, action_type: actionType, config };
|
|
26
|
+
}
|
|
27
|
+
function parseFilterOption(value) {
|
|
28
|
+
const separator = value.indexOf("=");
|
|
29
|
+
if (separator === -1) {
|
|
30
|
+
throw new Error(`--filter must look like <field>=<value>, got '${value}'`);
|
|
31
|
+
}
|
|
32
|
+
return { field: value.slice(0, separator), op: "equals", value: value.slice(separator + 1) };
|
|
33
|
+
}
|
|
34
|
+
function parseJsonOption(value, name) {
|
|
35
|
+
if (!value)
|
|
36
|
+
return {};
|
|
37
|
+
try {
|
|
38
|
+
const parsed = JSON.parse(value);
|
|
39
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
40
|
+
throw new Error("not an object");
|
|
41
|
+
}
|
|
42
|
+
return parsed;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
throw new Error(`${name} must be a JSON object.`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export function registerWorkflows(program) {
|
|
49
|
+
const signals = program.command("signals").description("Browse signal types available as workflow triggers");
|
|
50
|
+
const signalsListCommand = signals.command("list").description("List signal types and their config schemas");
|
|
51
|
+
signalsListCommand.action(async () => {
|
|
52
|
+
await withClient(signalsListCommand, async (client, config) => {
|
|
53
|
+
const definitions = await client.request("/v1/signal-defs");
|
|
54
|
+
printResult(config, {
|
|
55
|
+
label: `${definitions.length} signal types`,
|
|
56
|
+
data: definitions,
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
const workflows = program.command("workflows").alias("workflow").description("Manage signal-triggered workflows");
|
|
61
|
+
const createCommand = workflows
|
|
62
|
+
.command("create <name>")
|
|
63
|
+
.description("Create a draft workflow from a signal trigger and steps")
|
|
64
|
+
.requiredOption("--signal <key>", "signal key from `ethos signals list`")
|
|
65
|
+
.option("--config <json>", "trigger config JSON for the signal")
|
|
66
|
+
.option("--description <text>", "workflow description")
|
|
67
|
+
.option("--step <action:id-or-json>", "workflow step, e.g. add_to_campaign:<campaign-id> or add_to_table:<table-id>; repeatable", collect, [])
|
|
68
|
+
.option("--filter <field=value>", "only fire when the match payload field equals value; repeatable", collect, [])
|
|
69
|
+
.option("--cooldown <minutes>", "per-person cooldown window in minutes");
|
|
70
|
+
createCommand.action(async (name) => {
|
|
71
|
+
await withClient(createCommand, async (client, config) => {
|
|
72
|
+
const options = createCommand.opts();
|
|
73
|
+
if (options.step.length === 0) {
|
|
74
|
+
throw new Error("At least one --step is required.");
|
|
75
|
+
}
|
|
76
|
+
const payload = compactObject({
|
|
77
|
+
name,
|
|
78
|
+
description: options.description,
|
|
79
|
+
signal_key: options.signal,
|
|
80
|
+
trigger_config: parseJsonOption(options.config, "--config"),
|
|
81
|
+
payload_filters: options.filter.map(parseFilterOption),
|
|
82
|
+
cooldown_minutes: options.cooldown ? parsePositiveInteger(options.cooldown, "--cooldown") : undefined,
|
|
83
|
+
steps: options.step.map((step, index) => parseStepOption(step, index)),
|
|
84
|
+
});
|
|
85
|
+
const detail = await client.request("/v1/workflows", jsonRequest("POST", payload));
|
|
86
|
+
printResult(config, {
|
|
87
|
+
label: `Created draft workflow ${detail.workflow.name} (${detail.workflow.id})`,
|
|
88
|
+
data: detail,
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
const listCommand = workflows.command("list").description("List workflows");
|
|
93
|
+
listCommand.action(async () => {
|
|
94
|
+
await withClient(listCommand, async (client, config) => {
|
|
95
|
+
printResult(config, await client.request("/v1/workflows"));
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
const getCommand = workflows.command("get <workflow-id>").description("Show a workflow's trigger and steps");
|
|
99
|
+
getCommand.action(async (workflowId) => {
|
|
100
|
+
await withClient(getCommand, async (client, config) => {
|
|
101
|
+
printResult(config, await client.request(`/v1/workflows/${pathId(workflowId)}`));
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
const activateCommand = workflows
|
|
105
|
+
.command("activate <workflow-id>")
|
|
106
|
+
.description("Start watching: the workflow fires on new signal matches")
|
|
107
|
+
.option("--backfill", "also process existing activity, then keep watching");
|
|
108
|
+
activateCommand.action(async (workflowId) => {
|
|
109
|
+
await withClient(activateCommand, async (client, config) => {
|
|
110
|
+
const options = activateCommand.opts();
|
|
111
|
+
const detail = await client.request(`/v1/workflows/${pathId(workflowId)}/activate`, jsonRequest("POST", { backfill: Boolean(options.backfill) }));
|
|
112
|
+
printResult(config, {
|
|
113
|
+
label: `Workflow ${detail.workflow.name} is now watching`,
|
|
114
|
+
data: detail,
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
const pauseCommand = workflows.command("pause <workflow-id>").description("Pause an active workflow");
|
|
119
|
+
pauseCommand.action(async (workflowId) => {
|
|
120
|
+
await withClient(pauseCommand, async (client, config) => {
|
|
121
|
+
printResult(config, await client.request(`/v1/workflows/${pathId(workflowId)}/pause`, { method: "POST" }));
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
const archiveCommand = workflows
|
|
125
|
+
.command("archive <workflow-id>")
|
|
126
|
+
.description("Archive a workflow and release its watcher");
|
|
127
|
+
archiveCommand.action(async (workflowId) => {
|
|
128
|
+
await withClient(archiveCommand, async (client, config) => {
|
|
129
|
+
printResult(config, await client.request(`/v1/workflows/${pathId(workflowId)}/archive`, { method: "POST" }));
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
const runsCommand = workflows
|
|
133
|
+
.command("runs <workflow-id>")
|
|
134
|
+
.description("Show the match feed: who matched, when, and step outcomes")
|
|
135
|
+
.option("--limit <count>", "max matches to return (default 50)");
|
|
136
|
+
runsCommand.action(async (workflowId) => {
|
|
137
|
+
await withClient(runsCommand, async (client, config) => {
|
|
138
|
+
const options = runsCommand.opts();
|
|
139
|
+
const limit = options.limit ? parsePositiveInteger(options.limit, "--limit", 200) : 50;
|
|
140
|
+
const feed = await client.request(`/v1/workflows/${pathId(workflowId)}/runs?limit=${limit}`);
|
|
141
|
+
printResult(config, {
|
|
142
|
+
label: `${feed.length} matches`,
|
|
143
|
+
data: feed,
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=workflows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflows.js","sourceRoot":"","sources":["../../src/commands/workflows.ts"],"names":[],"mappings":"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"}
|