@pixelml/agenticflow-cli 1.7.1 → 1.10.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.
@@ -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,CAmDlB"}
@@ -0,0 +1,167 @@
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
+ };
102
+ const pluginNames = plugins.map((p) => p.plugin_id).join(", ");
103
+ const suggested_next_steps = [
104
+ `af agent get --agent-id <id> --json # inspect the created agent`,
105
+ `af agent run --agent-id <id> --message "<question>" --json # smoke-test the agent`,
106
+ `The agent has ${plugins.length} built-in plugins attached: ${pluginNames}.`,
107
+ `To expose it externally: attach to a workforce, or use 'af agent stream --agent-id <id>' for direct calls.`,
108
+ ];
109
+ return { body, suggested_next_steps };
110
+ }
111
+ /**
112
+ * Tier 1 system prompt: single-agent, the blueprint goal is the whole job,
113
+ * plugins are the only tools — no "delegate to another role" framing like the
114
+ * workforce version uses.
115
+ *
116
+ * IMPORTANT — the rules below exist because of PDCA round 1+2 (2026-04-14)
117
+ * where the deployed research-assistant refused to call web_search on
118
+ * "latest OpenAI model" questions, citing its training cutoff, and on a
119
+ * vaguer "general tech news" prompt it returned off-topic stadium-tech
120
+ * links because the search query was poorly constructed. The rules below
121
+ * attack both failure modes directly:
122
+ * - "your cutoff is stale" makes refusal-from-cutoff explicitly wrong
123
+ * - query-construction guidance fights the off-topic result
124
+ */
125
+ function buildTier1SystemPrompt(blueprint, slot) {
126
+ const plugins = slot.plugins ?? [];
127
+ const pluginIds = plugins.map((p) => p.nodeTypeName);
128
+ const pluginList = plugins.map((p) => `- ${p.nodeTypeName}`).join("\n");
129
+ const hasWebSearch = pluginIds.includes("web_search");
130
+ const hasWebRetrieval = pluginIds.includes("web_retrieval");
131
+ const hasApiCall = pluginIds.includes("api_call");
132
+ const hasImageGen = pluginIds.includes("agenticflow_generate_image");
133
+ const toolGuidance = [];
134
+ if (hasWebSearch) {
135
+ 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.`);
136
+ }
137
+ if (hasWebRetrieval) {
138
+ 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.`);
139
+ }
140
+ if (hasApiCall) {
141
+ 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.`);
142
+ }
143
+ if (hasImageGen) {
144
+ 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.`);
145
+ }
146
+ return [
147
+ `You are the ${slot.title} — ${blueprint.name}.`,
148
+ ``,
149
+ `YOUR JOB: ${blueprint.goal}`,
150
+ ``,
151
+ `ROLE DETAIL: ${slot.description}`,
152
+ ``,
153
+ `AVAILABLE TOOLS (built-in AgenticFlow plugins):`,
154
+ pluginList,
155
+ ``,
156
+ `TOOL USAGE RULES:`,
157
+ ...toolGuidance,
158
+ ``,
159
+ `CORE RULES:`,
160
+ `- CALL A TOOL FIRST, then answer. Default to using your tools; only answer from prior knowledge when the question is genuinely about timeless facts.`,
161
+ `- 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.`,
162
+ `- Cite specific sources when you use web_search or web_retrieval results. Include the URLs you actually retrieved.`,
163
+ `- Keep responses concrete and actionable. No "I can help with..." filler.`,
164
+ `- If a user request is outside what your tools can do, say so plainly and suggest the right next step.`,
165
+ ].join("\n");
166
+ }
167
+ //# 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,CAiBb;AAuBD;;;;;;;;;;;;;;;;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,CAmG1F"}
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,CA+Cb;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"}