@pixelml/agenticflow-cli 1.7.1 → 1.10.1
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/cli/blueprint-to-agent.d.ts +67 -0
- package/dist/cli/blueprint-to-agent.d.ts.map +1 -0
- package/dist/cli/blueprint-to-agent.js +173 -0
- package/dist/cli/blueprint-to-agent.js.map +1 -0
- package/dist/cli/blueprint-to-workflow.d.ts +72 -0
- package/dist/cli/blueprint-to-workflow.d.ts.map +1 -0
- package/dist/cli/blueprint-to-workflow.js +120 -0
- package/dist/cli/blueprint-to-workflow.js.map +1 -0
- package/dist/cli/blueprint-to-workforce.d.ts.map +1 -1
- package/dist/cli/blueprint-to-workforce.js +152 -25
- package/dist/cli/blueprint-to-workforce.js.map +1 -1
- package/dist/cli/changelog.d.ts.map +1 -1
- package/dist/cli/changelog.js +94 -0
- package/dist/cli/changelog.js.map +1 -1
- package/dist/cli/company-blueprints.d.ts +129 -7
- package/dist/cli/company-blueprints.d.ts.map +1 -1
- package/dist/cli/company-blueprints.js +514 -4
- package/dist/cli/company-blueprints.js.map +1 -1
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +826 -30
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/playbooks.d.ts.map +1 -1
- package/dist/cli/playbooks.js +230 -0
- package/dist/cli/playbooks.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tier 1 blueprint → single-agent deploy.
|
|
3
|
+
*
|
|
4
|
+
* Translates a `CompanyBlueprint` with `tier: 1` into a SINGLE agent-create
|
|
5
|
+
* payload pre-wired with AgenticFlow-native plugins (web_search, web_retrieval,
|
|
6
|
+
* api_call, agenticflow_generate_image, string_to_json). No workforce, no MAS,
|
|
7
|
+
* no external connection — runs in any workspace on day 1.
|
|
8
|
+
*
|
|
9
|
+
* Output shape matches the server's `AgentCreateDTO` with a populated
|
|
10
|
+
* `plugins: AgentPluginToolConfig[]` array. For current built-in nodes
|
|
11
|
+
* (verified against `af node-types get --name <n>` + a live agent sample
|
|
12
|
+
* 2026-04-14) the plugin version is "v1.0.0" and connection-less nodes get
|
|
13
|
+
* `connection: null`.
|
|
14
|
+
*
|
|
15
|
+
* Why a separate file from blueprint-to-workforce.ts:
|
|
16
|
+
* - different target resource (agent vs workforce)
|
|
17
|
+
* - different side-effects (1 POST vs N+1 POSTs with rollback)
|
|
18
|
+
* - different input shape (AgentPluginSpec per slot vs AgentSlot w/o plugins)
|
|
19
|
+
* Keeping them separate lets each translator stay a pure function.
|
|
20
|
+
*/
|
|
21
|
+
import type { CompanyBlueprint, AgentPluginSpec } from "./company-blueprints.js";
|
|
22
|
+
/**
|
|
23
|
+
* AgentPluginToolConfig shape (matches openapi.json#/components/schemas/AgentPluginToolConfig).
|
|
24
|
+
* Required: plugin_id, plugin_version.
|
|
25
|
+
* Optional: run_behavior (default "auto_run"), connection, input_config.
|
|
26
|
+
*/
|
|
27
|
+
export interface AgentPluginToolConfig {
|
|
28
|
+
plugin_id: string;
|
|
29
|
+
plugin_version: string;
|
|
30
|
+
run_behavior: "auto_run" | "request_confirmation";
|
|
31
|
+
connection: string | null;
|
|
32
|
+
input_config: Record<string, {
|
|
33
|
+
value: unknown;
|
|
34
|
+
description?: string | null;
|
|
35
|
+
}> | null;
|
|
36
|
+
}
|
|
37
|
+
export interface AgentInitPayload {
|
|
38
|
+
/** POST body for /v1/agents/. Caller supplies project_id via options. */
|
|
39
|
+
body: Record<string, unknown>;
|
|
40
|
+
/** Human-facing next-step hints to print after success. */
|
|
41
|
+
suggested_next_steps: string[];
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Translate an `AgentPluginSpec` (from the blueprint) into an
|
|
45
|
+
* `AgentPluginToolConfig` (what the server expects).
|
|
46
|
+
*
|
|
47
|
+
* Connection resolution is deferred to the caller — if a spec has
|
|
48
|
+
* `connectionCategory: "pixelml"`, the CLI is responsible for looking up the
|
|
49
|
+
* workspace's pixelml connection id and passing it in `connectionsByCategory`.
|
|
50
|
+
* For connection-less specs we just emit `connection: null`.
|
|
51
|
+
*/
|
|
52
|
+
export declare function pluginSpecToConfig(spec: AgentPluginSpec, connectionsByCategory?: Partial<Record<"pixelml", string>>): AgentPluginToolConfig;
|
|
53
|
+
/**
|
|
54
|
+
* Build the body for `client.agents.create()` from a Tier 1 blueprint.
|
|
55
|
+
*
|
|
56
|
+
* Tier 1 blueprints are constrained to a single non-optional agent slot with
|
|
57
|
+
* a populated `plugins[]` array. If the blueprint doesn't match this shape
|
|
58
|
+
* we throw — callers should route Tier 3 blueprints to `blueprintToAgentSpecs`
|
|
59
|
+
* + `buildAgentWiredGraph` instead.
|
|
60
|
+
*/
|
|
61
|
+
export declare function tier1BlueprintToAgentPayload(blueprint: CompanyBlueprint, options: {
|
|
62
|
+
projectId: string;
|
|
63
|
+
agentName?: string;
|
|
64
|
+
model?: string;
|
|
65
|
+
connectionsByCategory?: Partial<Record<"pixelml", string>>;
|
|
66
|
+
}): AgentInitPayload;
|
|
67
|
+
//# sourceMappingURL=blueprint-to-agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blueprint-to-agent.d.ts","sourceRoot":"","sources":["../../src/cli/blueprint-to-agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAUjF;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,UAAU,GAAG,sBAAsB,CAAC;IAClD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;CACtF;AAED,MAAM,WAAW,gBAAgB;IAC/B,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,2DAA2D;IAC3D,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAChC;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,eAAe,EACrB,qBAAqB,GAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAM,GAC7D,qBAAqB,CA+BvB;AAED;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,gBAAgB,EAC3B,OAAO,EAAE;IACP,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qBAAqB,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;CAC5D,GACA,gBAAgB,CAyDlB"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tier 1 blueprint → single-agent deploy.
|
|
3
|
+
*
|
|
4
|
+
* Translates a `CompanyBlueprint` with `tier: 1` into a SINGLE agent-create
|
|
5
|
+
* payload pre-wired with AgenticFlow-native plugins (web_search, web_retrieval,
|
|
6
|
+
* api_call, agenticflow_generate_image, string_to_json). No workforce, no MAS,
|
|
7
|
+
* no external connection — runs in any workspace on day 1.
|
|
8
|
+
*
|
|
9
|
+
* Output shape matches the server's `AgentCreateDTO` with a populated
|
|
10
|
+
* `plugins: AgentPluginToolConfig[]` array. For current built-in nodes
|
|
11
|
+
* (verified against `af node-types get --name <n>` + a live agent sample
|
|
12
|
+
* 2026-04-14) the plugin version is "v1.0.0" and connection-less nodes get
|
|
13
|
+
* `connection: null`.
|
|
14
|
+
*
|
|
15
|
+
* Why a separate file from blueprint-to-workforce.ts:
|
|
16
|
+
* - different target resource (agent vs workforce)
|
|
17
|
+
* - different side-effects (1 POST vs N+1 POSTs with rollback)
|
|
18
|
+
* - different input shape (AgentPluginSpec per slot vs AgentSlot w/o plugins)
|
|
19
|
+
* Keeping them separate lets each translator stay a pure function.
|
|
20
|
+
*/
|
|
21
|
+
/**
|
|
22
|
+
* Default plugin version for built-in AgenticFlow nodes.
|
|
23
|
+
* Verified 2026-04-14 via `af agent get` on a Slide Agent — all built-ins
|
|
24
|
+
* currently ship at v1.0.0. If/when the backend introduces versioned plugins,
|
|
25
|
+
* this file is the single place to update.
|
|
26
|
+
*/
|
|
27
|
+
const DEFAULT_PLUGIN_VERSION = "v1.0.0";
|
|
28
|
+
/**
|
|
29
|
+
* Translate an `AgentPluginSpec` (from the blueprint) into an
|
|
30
|
+
* `AgentPluginToolConfig` (what the server expects).
|
|
31
|
+
*
|
|
32
|
+
* Connection resolution is deferred to the caller — if a spec has
|
|
33
|
+
* `connectionCategory: "pixelml"`, the CLI is responsible for looking up the
|
|
34
|
+
* workspace's pixelml connection id and passing it in `connectionsByCategory`.
|
|
35
|
+
* For connection-less specs we just emit `connection: null`.
|
|
36
|
+
*/
|
|
37
|
+
export function pluginSpecToConfig(spec, connectionsByCategory = {}) {
|
|
38
|
+
let connection = null;
|
|
39
|
+
if (spec.connectionCategory === "pixelml") {
|
|
40
|
+
const resolved = connectionsByCategory.pixelml;
|
|
41
|
+
if (!resolved) {
|
|
42
|
+
throw new Error(`Plugin "${spec.nodeTypeName}" requires a pixelml connection, but none was supplied. ` +
|
|
43
|
+
`Run 'af connections list' to find the workspace's pixelml connection id, then pass it to the deploy flow.`);
|
|
44
|
+
}
|
|
45
|
+
connection = resolved;
|
|
46
|
+
}
|
|
47
|
+
// Convert our { value, description? } entries to the server's wire format
|
|
48
|
+
// (description: null when absent — the server accepts explicit null).
|
|
49
|
+
const inputConfig = spec.input
|
|
50
|
+
? Object.fromEntries(Object.entries(spec.input).map(([k, v]) => [
|
|
51
|
+
k,
|
|
52
|
+
{ value: v.value, description: v.description ?? null },
|
|
53
|
+
]))
|
|
54
|
+
: null;
|
|
55
|
+
return {
|
|
56
|
+
plugin_id: spec.nodeTypeName,
|
|
57
|
+
plugin_version: DEFAULT_PLUGIN_VERSION,
|
|
58
|
+
run_behavior: "auto_run",
|
|
59
|
+
connection,
|
|
60
|
+
input_config: inputConfig,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Build the body for `client.agents.create()` from a Tier 1 blueprint.
|
|
65
|
+
*
|
|
66
|
+
* Tier 1 blueprints are constrained to a single non-optional agent slot with
|
|
67
|
+
* a populated `plugins[]` array. If the blueprint doesn't match this shape
|
|
68
|
+
* we throw — callers should route Tier 3 blueprints to `blueprintToAgentSpecs`
|
|
69
|
+
* + `buildAgentWiredGraph` instead.
|
|
70
|
+
*/
|
|
71
|
+
export function tier1BlueprintToAgentPayload(blueprint, options) {
|
|
72
|
+
if (blueprint.tier !== 1) {
|
|
73
|
+
throw new Error(`Blueprint "${blueprint.id}" is tier ${blueprint.tier ?? 3}, not tier 1. ` +
|
|
74
|
+
`Use 'af workforce init --blueprint ${blueprint.id}' instead.`);
|
|
75
|
+
}
|
|
76
|
+
const slots = blueprint.agents.filter((s) => !s.optional);
|
|
77
|
+
if (slots.length !== 1) {
|
|
78
|
+
throw new Error(`Tier 1 blueprint "${blueprint.id}" must have exactly one non-optional agent slot; got ${slots.length}.`);
|
|
79
|
+
}
|
|
80
|
+
const slot = slots[0];
|
|
81
|
+
const plugins = (slot.plugins ?? []).map((spec) => pluginSpecToConfig(spec, options.connectionsByCategory ?? {}));
|
|
82
|
+
if (plugins.length === 0) {
|
|
83
|
+
throw new Error(`Tier 1 blueprint "${blueprint.id}" agent slot "${slot.role}" has no plugins. ` +
|
|
84
|
+
`Tier 1 blueprints must declare at least one AgentPluginSpec; otherwise it's just a vanilla agent.`);
|
|
85
|
+
}
|
|
86
|
+
// Default model choice for Tier 1: PDCA round (2026-04-14) showed
|
|
87
|
+
// `agenticflow/gemini-2.0-flash` (our old default) REFUSES to call tools on
|
|
88
|
+
// "latest X?" prompts, even when the system prompt explicitly forbids
|
|
89
|
+
// cutoff-based refusals. `agenticflow/gpt-4o-mini` follows the system prompt
|
|
90
|
+
// and routes to web_search correctly. Callers can still override via --model.
|
|
91
|
+
const model = options.model ?? "agenticflow/gpt-4o-mini";
|
|
92
|
+
const agentName = options.agentName ?? blueprint.name;
|
|
93
|
+
const body = {
|
|
94
|
+
name: agentName,
|
|
95
|
+
project_id: options.projectId,
|
|
96
|
+
description: blueprint.description,
|
|
97
|
+
system_prompt: buildTier1SystemPrompt(blueprint, slot),
|
|
98
|
+
model,
|
|
99
|
+
tools: [],
|
|
100
|
+
plugins,
|
|
101
|
+
// recursion_limit 100 (backend max) — PDCA rounds caught the 25-default
|
|
102
|
+
// exhausting on multi-step research questions. Tier 1 agents are
|
|
103
|
+
// tool-heavy by design (web_search → web_retrieval → synthesize), so
|
|
104
|
+
// ship them with headroom. Every reasonable customer-demo prompt
|
|
105
|
+
// converges well under 100 tool calls; 100 is the server-side cap.
|
|
106
|
+
recursion_limit: 100,
|
|
107
|
+
};
|
|
108
|
+
const pluginNames = plugins.map((p) => p.plugin_id).join(", ");
|
|
109
|
+
const suggested_next_steps = [
|
|
110
|
+
`af agent get --agent-id <id> --json # inspect the created agent`,
|
|
111
|
+
`af agent run --agent-id <id> --message "<question>" --json # smoke-test the agent`,
|
|
112
|
+
`The agent has ${plugins.length} built-in plugins attached: ${pluginNames}.`,
|
|
113
|
+
`To expose it externally: attach to a workforce, or use 'af agent stream --agent-id <id>' for direct calls.`,
|
|
114
|
+
];
|
|
115
|
+
return { body, suggested_next_steps };
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Tier 1 system prompt: single-agent, the blueprint goal is the whole job,
|
|
119
|
+
* plugins are the only tools — no "delegate to another role" framing like the
|
|
120
|
+
* workforce version uses.
|
|
121
|
+
*
|
|
122
|
+
* IMPORTANT — the rules below exist because of PDCA round 1+2 (2026-04-14)
|
|
123
|
+
* where the deployed research-assistant refused to call web_search on
|
|
124
|
+
* "latest OpenAI model" questions, citing its training cutoff, and on a
|
|
125
|
+
* vaguer "general tech news" prompt it returned off-topic stadium-tech
|
|
126
|
+
* links because the search query was poorly constructed. The rules below
|
|
127
|
+
* attack both failure modes directly:
|
|
128
|
+
* - "your cutoff is stale" makes refusal-from-cutoff explicitly wrong
|
|
129
|
+
* - query-construction guidance fights the off-topic result
|
|
130
|
+
*/
|
|
131
|
+
function buildTier1SystemPrompt(blueprint, slot) {
|
|
132
|
+
const plugins = slot.plugins ?? [];
|
|
133
|
+
const pluginIds = plugins.map((p) => p.nodeTypeName);
|
|
134
|
+
const pluginList = plugins.map((p) => `- ${p.nodeTypeName}`).join("\n");
|
|
135
|
+
const hasWebSearch = pluginIds.includes("web_search");
|
|
136
|
+
const hasWebRetrieval = pluginIds.includes("web_retrieval");
|
|
137
|
+
const hasApiCall = pluginIds.includes("api_call");
|
|
138
|
+
const hasImageGen = pluginIds.includes("agenticflow_generate_image");
|
|
139
|
+
const toolGuidance = [];
|
|
140
|
+
if (hasWebSearch) {
|
|
141
|
+
toolGuidance.push(`- **web_search**: Call this FIRST for any question involving current events, recent releases, "latest", dates, prices, news, people's current roles, or anything that might have changed since your training. DO NOT refuse with "my knowledge cutoff is X" — your cutoff is stale by definition, that's why you have web_search.`, `- When constructing a search_query, use SPECIFIC terms from the user's question. If the user asks about a topic in a domain, include the domain word. If they ask about a company, include the company name. Avoid generic queries like "tech news" — that returns noise.`);
|
|
142
|
+
}
|
|
143
|
+
if (hasWebRetrieval) {
|
|
144
|
+
toolGuidance.push(`- **web_retrieval**: Use this after web_search when you need the FULL content of a specific URL (the snippets from search are short). Also use when the user provides a URL directly.`);
|
|
145
|
+
}
|
|
146
|
+
if (hasApiCall) {
|
|
147
|
+
toolGuidance.push(`- **api_call**: Use for HTTP requests to JSON APIs. Set method, url, headers, body_type appropriately. Prefer this over web_search when the user provides an explicit API endpoint.`);
|
|
148
|
+
}
|
|
149
|
+
if (hasImageGen) {
|
|
150
|
+
toolGuidance.push(`- **agenticflow_generate_image**: Use for generating visuals when the user asks for an image, graphic, thumbnail, or visual accompaniment. Write a SPECIFIC, descriptive prompt — don't pass the user's message verbatim if it's vague.`);
|
|
151
|
+
}
|
|
152
|
+
return [
|
|
153
|
+
`You are the ${slot.title} — ${blueprint.name}.`,
|
|
154
|
+
``,
|
|
155
|
+
`YOUR JOB: ${blueprint.goal}`,
|
|
156
|
+
``,
|
|
157
|
+
`ROLE DETAIL: ${slot.description}`,
|
|
158
|
+
``,
|
|
159
|
+
`AVAILABLE TOOLS (built-in AgenticFlow plugins):`,
|
|
160
|
+
pluginList,
|
|
161
|
+
``,
|
|
162
|
+
`TOOL USAGE RULES:`,
|
|
163
|
+
...toolGuidance,
|
|
164
|
+
``,
|
|
165
|
+
`CORE RULES:`,
|
|
166
|
+
`- CALL A TOOL FIRST, then answer. Default to using your tools; only answer from prior knowledge when the question is genuinely about timeless facts.`,
|
|
167
|
+
`- NEVER say "I cannot provide information that far in the future" or "my knowledge cutoff is...". If the user is asking about something recent, that is exactly what your tools are for — use them.`,
|
|
168
|
+
`- Cite specific sources when you use web_search or web_retrieval results. Include the URLs you actually retrieved.`,
|
|
169
|
+
`- Keep responses concrete and actionable. No "I can help with..." filler.`,
|
|
170
|
+
`- If a user request is outside what your tools can do, say so plainly and suggest the right next step.`,
|
|
171
|
+
].join("\n");
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=blueprint-to-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blueprint-to-agent.js","sourceRoot":"","sources":["../../src/cli/blueprint-to-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow-kind blueprints → workflow create payload.
|
|
3
|
+
*
|
|
4
|
+
* Workflows chain nodes deterministically. Rungs 0-2 on the composition ladder:
|
|
5
|
+
* 0: trigger → llm → output (hello world)
|
|
6
|
+
* 1: llm_plan → llm_execute (chained via output template refs)
|
|
7
|
+
* 2: web_retrieval → llm_summarize (enriched w/ real-world data)
|
|
8
|
+
*
|
|
9
|
+
* Node wiring in workflows is IMPLICIT via template references in
|
|
10
|
+
* input_config. Unlike workforce DAGs, there are no explicit edges —
|
|
11
|
+
* `{{trigger_field}}` pulls from trigger inputs, `{{node_name.output_field}}`
|
|
12
|
+
* pulls from a previously-executed node's output. The engine infers execution
|
|
13
|
+
* order from these references.
|
|
14
|
+
*
|
|
15
|
+
* The `llm` node type requires an LLM-provider `connection` (typically a
|
|
16
|
+
* Straico / OpenAI / Anthropic / etc. category connection in the workspace).
|
|
17
|
+
* `findWorkspaceLLMConnection()` auto-discovers one and returns a warning if
|
|
18
|
+
* none exists.
|
|
19
|
+
*/
|
|
20
|
+
import type { CompanyBlueprint } from "./company-blueprints.js";
|
|
21
|
+
export interface WorkflowCreatePayload {
|
|
22
|
+
name: string;
|
|
23
|
+
description?: string | null;
|
|
24
|
+
project_id: string;
|
|
25
|
+
nodes: WorkflowCreateNode[];
|
|
26
|
+
input_schema: {
|
|
27
|
+
type: "object";
|
|
28
|
+
title: string;
|
|
29
|
+
required: string[];
|
|
30
|
+
properties: Record<string, unknown>;
|
|
31
|
+
};
|
|
32
|
+
output_mapping: Record<string, unknown>;
|
|
33
|
+
variables?: Record<string, unknown> | null;
|
|
34
|
+
}
|
|
35
|
+
interface WorkflowCreateNode {
|
|
36
|
+
name: string;
|
|
37
|
+
title: string;
|
|
38
|
+
description: string;
|
|
39
|
+
node_type_name: string;
|
|
40
|
+
input_config: Record<string, unknown>;
|
|
41
|
+
output_mapping: Record<string, unknown> | null;
|
|
42
|
+
connection: string | null;
|
|
43
|
+
cost: number | null;
|
|
44
|
+
metadata: Record<string, unknown> | null;
|
|
45
|
+
}
|
|
46
|
+
export interface WorkflowBlueprintTranslation {
|
|
47
|
+
payload: WorkflowCreatePayload;
|
|
48
|
+
/** Warnings to surface — e.g. no LLM connection found. */
|
|
49
|
+
warnings: string[];
|
|
50
|
+
/** Required connection categories that weren't found in workspace (if any). */
|
|
51
|
+
missing_connections: string[];
|
|
52
|
+
suggested_next_steps: string[];
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Resolve an LLM-provider connection id from the workspace's existing
|
|
56
|
+
* connections. Returns null if none found.
|
|
57
|
+
*/
|
|
58
|
+
export declare function findWorkspaceLLMConnection(connections: Array<{
|
|
59
|
+
id: string;
|
|
60
|
+
category?: string;
|
|
61
|
+
}>): string | null;
|
|
62
|
+
/**
|
|
63
|
+
* Convert a blueprint's workflowNodes into the workflow-create payload shape
|
|
64
|
+
* the backend expects. Pure function — no side effects.
|
|
65
|
+
*/
|
|
66
|
+
export declare function workflowBlueprintToPayload(blueprint: CompanyBlueprint, options: {
|
|
67
|
+
projectId: string;
|
|
68
|
+
workflowName?: string;
|
|
69
|
+
llmConnectionId?: string | null;
|
|
70
|
+
}): WorkflowBlueprintTranslation;
|
|
71
|
+
export {};
|
|
72
|
+
//# sourceMappingURL=blueprint-to-workflow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blueprint-to-workflow.d.ts","sourceRoot":"","sources":["../../src/cli/blueprint-to-workflow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAoB,MAAM,yBAAyB,CAAC;AAQlF,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IAInB,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,YAAY,EAAE;QACZ,IAAI,EAAE,QAAQ,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACrC,CAAC;IACF,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC5C;AAED,UAAU,kBAAkB;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC/C,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC1C;AAED,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,qBAAqB,CAAC;IAC/B,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,+EAA+E;IAC/E,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAChC;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GACpD,MAAM,GAAG,IAAI,CAMf;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,gBAAgB,EAC3B,OAAO,EAAE;IACP,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC,GACA,4BAA4B,CAuF9B"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow-kind blueprints → workflow create payload.
|
|
3
|
+
*
|
|
4
|
+
* Workflows chain nodes deterministically. Rungs 0-2 on the composition ladder:
|
|
5
|
+
* 0: trigger → llm → output (hello world)
|
|
6
|
+
* 1: llm_plan → llm_execute (chained via output template refs)
|
|
7
|
+
* 2: web_retrieval → llm_summarize (enriched w/ real-world data)
|
|
8
|
+
*
|
|
9
|
+
* Node wiring in workflows is IMPLICIT via template references in
|
|
10
|
+
* input_config. Unlike workforce DAGs, there are no explicit edges —
|
|
11
|
+
* `{{trigger_field}}` pulls from trigger inputs, `{{node_name.output_field}}`
|
|
12
|
+
* pulls from a previously-executed node's output. The engine infers execution
|
|
13
|
+
* order from these references.
|
|
14
|
+
*
|
|
15
|
+
* The `llm` node type requires an LLM-provider `connection` (typically a
|
|
16
|
+
* Straico / OpenAI / Anthropic / etc. category connection in the workspace).
|
|
17
|
+
* `findWorkspaceLLMConnection()` auto-discovers one and returns a warning if
|
|
18
|
+
* none exists.
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* Connection categories the `llm` workflow node can use. Order = preference.
|
|
22
|
+
* Adjust if the backend adds categories.
|
|
23
|
+
*/
|
|
24
|
+
const LLM_PROVIDER_CATEGORIES = ["straico", "openai", "anthropic", "google", "deepseek", "groq"];
|
|
25
|
+
/**
|
|
26
|
+
* Resolve an LLM-provider connection id from the workspace's existing
|
|
27
|
+
* connections. Returns null if none found.
|
|
28
|
+
*/
|
|
29
|
+
export function findWorkspaceLLMConnection(connections) {
|
|
30
|
+
for (const cat of LLM_PROVIDER_CATEGORIES) {
|
|
31
|
+
const match = connections.find((c) => c.category === cat);
|
|
32
|
+
if (match)
|
|
33
|
+
return match.id;
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Convert a blueprint's workflowNodes into the workflow-create payload shape
|
|
39
|
+
* the backend expects. Pure function — no side effects.
|
|
40
|
+
*/
|
|
41
|
+
export function workflowBlueprintToPayload(blueprint, options) {
|
|
42
|
+
if (!blueprint.workflowNodes || blueprint.workflowNodes.length === 0) {
|
|
43
|
+
throw new Error(`Blueprint "${blueprint.id}" is not a workflow blueprint (workflowNodes is empty). ` +
|
|
44
|
+
`Use 'af agent init' or 'af workforce init' instead.`);
|
|
45
|
+
}
|
|
46
|
+
const warnings = [];
|
|
47
|
+
const missingConnections = [];
|
|
48
|
+
const nodes = blueprint.workflowNodes.map((spec) => {
|
|
49
|
+
const needsLLMConnection = spec.nodeType === "llm";
|
|
50
|
+
let connection = null;
|
|
51
|
+
if (needsLLMConnection) {
|
|
52
|
+
if (options.llmConnectionId) {
|
|
53
|
+
connection = `{{__app_connections__['${options.llmConnectionId}']}}`;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
missingConnections.push("llm-provider (straico/openai/anthropic/etc.)");
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
name: spec.name,
|
|
61
|
+
title: spec.title ?? spec.name,
|
|
62
|
+
description: spec.description ?? `${spec.nodeType} node`,
|
|
63
|
+
node_type_name: spec.nodeType,
|
|
64
|
+
input_config: spec.inputConfig ?? {},
|
|
65
|
+
output_mapping: spec.outputMapping ?? null,
|
|
66
|
+
connection,
|
|
67
|
+
cost: null,
|
|
68
|
+
metadata: null,
|
|
69
|
+
};
|
|
70
|
+
});
|
|
71
|
+
if (missingConnections.length > 0) {
|
|
72
|
+
warnings.push(`This workflow needs a connection: ${missingConnections.join(", ")}. ` +
|
|
73
|
+
`Create one in the UI (Connections → New) or via \`af connections create\`, then re-run init.`);
|
|
74
|
+
}
|
|
75
|
+
// Compose input schema from blueprint.workflowInputSchema
|
|
76
|
+
const schemaSpec = blueprint.workflowInputSchema;
|
|
77
|
+
const properties = {};
|
|
78
|
+
const required = [];
|
|
79
|
+
let schemaTitle = schemaSpec?.title ?? "Workflow inputs";
|
|
80
|
+
if (schemaSpec) {
|
|
81
|
+
schemaSpec.fields.forEach((f, idx) => {
|
|
82
|
+
properties[f.name] = {
|
|
83
|
+
type: "string",
|
|
84
|
+
title: f.title ?? f.name,
|
|
85
|
+
description: f.description ?? "",
|
|
86
|
+
ui_metadata: {
|
|
87
|
+
type: "long_text",
|
|
88
|
+
order: idx,
|
|
89
|
+
value: f.defaultValue ?? null,
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
if (f.required)
|
|
93
|
+
required.push(f.name);
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
const payload = {
|
|
97
|
+
name: options.workflowName ?? blueprint.name,
|
|
98
|
+
description: blueprint.description,
|
|
99
|
+
project_id: options.projectId,
|
|
100
|
+
nodes,
|
|
101
|
+
input_schema: {
|
|
102
|
+
type: "object",
|
|
103
|
+
title: schemaTitle,
|
|
104
|
+
required,
|
|
105
|
+
properties,
|
|
106
|
+
},
|
|
107
|
+
output_mapping: {},
|
|
108
|
+
};
|
|
109
|
+
const suggested_next_steps = [
|
|
110
|
+
`af workflow run --workflow-id <id> --body '{"input":{...}}' --json # run the workflow`,
|
|
111
|
+
`af workflow get --workflow-id <id> --json # inspect what was created`,
|
|
112
|
+
];
|
|
113
|
+
return {
|
|
114
|
+
payload,
|
|
115
|
+
warnings,
|
|
116
|
+
missing_connections: missingConnections,
|
|
117
|
+
suggested_next_steps,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=blueprint-to-workflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blueprint-to-workflow.js","sourceRoot":"","sources":["../../src/cli/blueprint-to-workflow.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blueprint-to-workforce.d.ts","sourceRoot":"","sources":["../../src/cli/blueprint-to-workforce.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAEhE,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qBAAqB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChD,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,sBAAsB,CAAC;IAClC,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IAC1C,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IAC1C,+EAA+E;IAC/E,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAChC;AAED,mDAAmD;AACnD,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAEtD;AAED,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,gBAAgB,EAC3B,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO,GACpD,oBAAoB,CAuEtB;AAMD;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,0EAA0E;IAC1E,IAAI,EAAE,SAAS,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,gBAAgB,EAC3B,OAAO,EAAE;IACP,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC,GACA,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"blueprint-to-workforce.d.ts","sourceRoot":"","sources":["../../src/cli/blueprint-to-workforce.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAEhE,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qBAAqB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChD,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,sBAAsB,CAAC;IAClC,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IAC1C,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IAC1C,+EAA+E;IAC/E,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAChC;AAED,mDAAmD;AACnD,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAEtD;AAED,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,gBAAgB,EAC3B,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO,GACpD,oBAAoB,CAuEtB;AAMD;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,0EAA0E;IAC1E,IAAI,EAAE,SAAS,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,gBAAgB,EAC3B,OAAO,EAAE;IACP,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC,GACA,SAAS,EAAE,CAmDb;AAwDD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,gBAAgB,EAC3B,KAAK,EAAE,SAAS,EAAE,EAClB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACpC;IAAE,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IAAC,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,EAAE,CAAA;CAAE,CAsK1F"}
|