ue-mcp 0.7.5 → 0.7.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/flow/anthropic-provider.d.ts +15 -0
- package/dist/flow/anthropic-provider.js +71 -0
- package/dist/flow/anthropic-provider.js.map +1 -0
- package/dist/flow/bridge-task.d.ts +4 -0
- package/dist/flow/bridge-task.js +23 -7
- package/dist/flow/bridge-task.js.map +1 -1
- package/dist/flow/context.d.ts +3 -1
- package/dist/flow/flow-tool.js +46 -6
- package/dist/flow/flow-tool.js.map +1 -1
- package/dist/flow/schema.d.ts +314 -0
- package/package.json +3 -2
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/HandlerUtils.h +69 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers.cpp +32 -25
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers.cpp +218 -8
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AudioHandlers.cpp +69 -13
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers.cpp +157 -41
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/FoliageHandlers.cpp +8 -2
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers.cpp +106 -31
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GasHandlers.cpp +41 -41
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers.cpp +250 -36
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MaterialHandlers.cpp +40 -4
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/NiagaraHandlers.cpp +36 -13
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PCGHandlers.cpp +32 -6
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SequencerHandlers.cpp +8 -5
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SplineHandlers.cpp +29 -5
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/WidgetHandlers.cpp +23 -13
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { LLMProvider, LLMCompletionRequest, LLMCompletionResponse } from "@db-lyon/flowkit";
|
|
2
|
+
/**
|
|
3
|
+
* Anthropic-backed LLMProvider for use by the `agent_prompt` task.
|
|
4
|
+
*
|
|
5
|
+
* Attach to the flow context as `ctx.llm`. Requires ANTHROPIC_API_KEY
|
|
6
|
+
* (or explicit apiKey in constructor). Enables prompt caching on the
|
|
7
|
+
* system prompt so recurrent on_failure triage is cheap.
|
|
8
|
+
*/
|
|
9
|
+
export declare class AnthropicProvider implements LLMProvider {
|
|
10
|
+
private client;
|
|
11
|
+
constructor(opts?: {
|
|
12
|
+
apiKey?: string;
|
|
13
|
+
});
|
|
14
|
+
complete(req: LLMCompletionRequest): Promise<LLMCompletionResponse>;
|
|
15
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import Anthropic from "@anthropic-ai/sdk";
|
|
2
|
+
const DEFAULT_MODEL = "claude-opus-4-5";
|
|
3
|
+
const DEFAULT_MAX_TOKENS = 1024;
|
|
4
|
+
/**
|
|
5
|
+
* Anthropic-backed LLMProvider for use by the `agent_prompt` task.
|
|
6
|
+
*
|
|
7
|
+
* Attach to the flow context as `ctx.llm`. Requires ANTHROPIC_API_KEY
|
|
8
|
+
* (or explicit apiKey in constructor). Enables prompt caching on the
|
|
9
|
+
* system prompt so recurrent on_failure triage is cheap.
|
|
10
|
+
*/
|
|
11
|
+
export class AnthropicProvider {
|
|
12
|
+
client;
|
|
13
|
+
constructor(opts = {}) {
|
|
14
|
+
const apiKey = opts.apiKey ?? process.env.ANTHROPIC_API_KEY;
|
|
15
|
+
if (!apiKey) {
|
|
16
|
+
throw new Error("AnthropicProvider: no API key. Set ANTHROPIC_API_KEY or pass { apiKey } explicitly.");
|
|
17
|
+
}
|
|
18
|
+
this.client = new Anthropic({ apiKey });
|
|
19
|
+
}
|
|
20
|
+
async complete(req) {
|
|
21
|
+
const model = req.model ?? DEFAULT_MODEL;
|
|
22
|
+
const max_tokens = req.maxTokens ?? DEFAULT_MAX_TOKENS;
|
|
23
|
+
let userPrompt = req.prompt;
|
|
24
|
+
if (req.schema) {
|
|
25
|
+
userPrompt +=
|
|
26
|
+
"\n\nRespond ONLY with a JSON object matching this schema:\n" +
|
|
27
|
+
JSON.stringify(req.schema) +
|
|
28
|
+
"\n\nOutput just the JSON, no prose, no markdown fences.";
|
|
29
|
+
}
|
|
30
|
+
const systemBlocks = req.system
|
|
31
|
+
? [{ type: "text", text: req.system, cache_control: { type: "ephemeral" } }]
|
|
32
|
+
: undefined;
|
|
33
|
+
const response = await this.client.messages.create({
|
|
34
|
+
model,
|
|
35
|
+
max_tokens,
|
|
36
|
+
system: systemBlocks,
|
|
37
|
+
messages: [{ role: "user", content: userPrompt }],
|
|
38
|
+
});
|
|
39
|
+
const text = response.content
|
|
40
|
+
.map((block) => (block.type === "text" ? block.text : ""))
|
|
41
|
+
.join("")
|
|
42
|
+
.trim();
|
|
43
|
+
const out = {
|
|
44
|
+
text,
|
|
45
|
+
usage: {
|
|
46
|
+
inputTokens: response.usage?.input_tokens,
|
|
47
|
+
outputTokens: response.usage?.output_tokens,
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
if (req.schema) {
|
|
51
|
+
const parsed = tryParseJson(text);
|
|
52
|
+
if (parsed !== undefined)
|
|
53
|
+
out.parsed = parsed;
|
|
54
|
+
}
|
|
55
|
+
return out;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function tryParseJson(text) {
|
|
59
|
+
// Strip common markdown fences the model might add despite instructions.
|
|
60
|
+
const cleaned = text
|
|
61
|
+
.replace(/^```(?:json)?\s*/i, "")
|
|
62
|
+
.replace(/```$/, "")
|
|
63
|
+
.trim();
|
|
64
|
+
try {
|
|
65
|
+
return JSON.parse(cleaned);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=anthropic-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic-provider.js","sourceRoot":"","sources":["../../src/flow/anthropic-provider.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAO1C,MAAM,aAAa,GAAG,iBAAiB,CAAC;AACxC,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAEhC;;;;;;GAMG;AACH,MAAM,OAAO,iBAAiB;IACpB,MAAM,CAAY;IAE1B,YAAY,OAA4B,EAAE;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QAC5D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACb,qFAAqF,CACtF,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAyB;QACtC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI,aAAa,CAAC;QACzC,MAAM,UAAU,GAAG,GAAG,CAAC,SAAS,IAAI,kBAAkB,CAAC;QAEvD,IAAI,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC;QAC5B,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,UAAU;gBACR,6DAA6D;oBAC7D,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC;oBAC1B,yDAAyD,CAAC;QAC9D,CAAC;QAED,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM;YAC7B,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,WAAoB,EAAE,EAAE,CAAC;YAC9F,CAAC,CAAC,SAAS,CAAC;QAEd,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YACjD,KAAK;YACL,UAAU;YACV,MAAM,EAAE,YAAY;YACpB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;SAClD,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO;aAC1B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;aACzD,IAAI,CAAC,EAAE,CAAC;aACR,IAAI,EAAE,CAAC;QAEV,MAAM,GAAG,GAA0B;YACjC,IAAI;YACJ,KAAK,EAAE;gBACL,WAAW,EAAE,QAAQ,CAAC,KAAK,EAAE,YAAY;gBACzC,YAAY,EAAE,QAAQ,CAAC,KAAK,EAAE,aAAa;aAC5C;SACF,CAAC;QAEF,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;YAClC,IAAI,MAAM,KAAK,SAAS;gBAAE,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC;QAChD,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;CACF;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,yEAAyE;IACzE,MAAM,OAAO,GAAG,IAAI;SACjB,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC;SAChC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;SACnB,IAAI,EAAE,CAAC;IACV,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -11,6 +11,10 @@ import { BaseTask, type TaskResult } from "@db-lyon/flowkit";
|
|
|
11
11
|
* 2. **Built-in tasks** via `bridgeTaskClass()` factory:
|
|
12
12
|
* The bridge method is baked into the class closure.
|
|
13
13
|
* Options are passed through as bridge params.
|
|
14
|
+
*
|
|
15
|
+
* Handlers may attach a `rollback: { method, payload }` to their response.
|
|
16
|
+
* When present, it is lifted onto `TaskResult.rollback` so the flow runner
|
|
17
|
+
* can invoke the inverse on failure when `rollback_on_failure` is enabled.
|
|
14
18
|
*/
|
|
15
19
|
export declare class BridgeTask extends BaseTask {
|
|
16
20
|
get taskName(): string;
|
package/dist/flow/bridge-task.js
CHANGED
|
@@ -11,6 +11,10 @@ import { BaseTask } from "@db-lyon/flowkit";
|
|
|
11
11
|
* 2. **Built-in tasks** via `bridgeTaskClass()` factory:
|
|
12
12
|
* The bridge method is baked into the class closure.
|
|
13
13
|
* Options are passed through as bridge params.
|
|
14
|
+
*
|
|
15
|
+
* Handlers may attach a `rollback: { method, payload }` to their response.
|
|
16
|
+
* When present, it is lifted onto `TaskResult.rollback` so the flow runner
|
|
17
|
+
* can invoke the inverse on failure when `rollback_on_failure` is enabled.
|
|
14
18
|
*/
|
|
15
19
|
export class BridgeTask extends BaseTask {
|
|
16
20
|
get taskName() {
|
|
@@ -22,13 +26,25 @@ export class BridgeTask extends BaseTask {
|
|
|
22
26
|
throw new Error('BridgeTask requires a "method" option');
|
|
23
27
|
}
|
|
24
28
|
const ctx = this.ctx;
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
success: true,
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
const raw = await ctx.bridge.call(method, params);
|
|
30
|
+
if (typeof raw !== "object" || raw === null) {
|
|
31
|
+
return { success: true, data: { result: raw } };
|
|
32
|
+
}
|
|
33
|
+
const { rollback, ...rest } = raw;
|
|
34
|
+
const result = { success: true, data: rest };
|
|
35
|
+
if (rollback && typeof rollback === "object") {
|
|
36
|
+
const rb = rollback;
|
|
37
|
+
if (typeof rb.method === "string") {
|
|
38
|
+
const record = {
|
|
39
|
+
taskName: rb.method,
|
|
40
|
+
payload: rb.payload && typeof rb.payload === "object"
|
|
41
|
+
? rb.payload
|
|
42
|
+
: {},
|
|
43
|
+
};
|
|
44
|
+
result.rollback = record;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return result;
|
|
32
48
|
}
|
|
33
49
|
}
|
|
34
50
|
//# sourceMappingURL=bridge-task.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridge-task.js","sourceRoot":"","sources":["../../src/flow/bridge-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"bridge-task.js","sourceRoot":"","sources":["../../src/flow/bridge-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAwC,MAAM,kBAAkB,CAAC;AAGlF;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAO,UAAW,SAAQ,QAAQ;IACtC,IAAI,QAAQ;QACV,OAAO,UAAW,IAAI,CAAC,OAAmC,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;IACnF,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC,OAAkC,CAAC;QACtE,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAkB,CAAC;QACpC,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAgB,EAAE,MAAM,CAAC,CAAC;QAE5D,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;QAClD,CAAC;QAED,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,GAA8B,CAAC;QAC7D,MAAM,MAAM,GAAe,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAEzD,IAAI,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC7C,MAAM,EAAE,GAAG,QAAmD,CAAC;YAC/D,IAAI,OAAO,EAAE,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAClC,MAAM,MAAM,GAAmB;oBAC7B,QAAQ,EAAE,EAAE,CAAC,MAAM;oBACnB,OAAO,EACL,EAAE,CAAC,OAAO,IAAI,OAAO,EAAE,CAAC,OAAO,KAAK,QAAQ;wBAC1C,CAAC,CAAE,EAAE,CAAC,OAAmC;wBACzC,CAAC,CAAC,EAAE;iBACT,CAAC;gBACF,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
|
package/dist/flow/context.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import type { TaskContext } from "@db-lyon/flowkit";
|
|
1
|
+
import type { TaskContext, LLMProvider } from "@db-lyon/flowkit";
|
|
2
2
|
import type { IBridge } from "../bridge.js";
|
|
3
3
|
import type { ProjectContext } from "../project.js";
|
|
4
4
|
export interface FlowContext extends TaskContext {
|
|
5
5
|
bridge: IBridge;
|
|
6
6
|
project: ProjectContext;
|
|
7
|
+
/** Optional LLM provider used by the built-in `agent_prompt` task. */
|
|
8
|
+
llm?: LLMProvider;
|
|
7
9
|
}
|
package/dist/flow/flow-tool.js
CHANGED
|
@@ -1,20 +1,41 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { FlowRunner } from "@db-lyon/flowkit";
|
|
2
|
+
import { FlowRunner, AgentPromptTask } from "@db-lyon/flowkit";
|
|
3
|
+
import { AnthropicProvider } from "./anthropic-provider.js";
|
|
4
|
+
// Lazy-init the LLM provider so the server still starts without an API key.
|
|
5
|
+
let llmProvider;
|
|
6
|
+
let llmProviderInitAttempted = false;
|
|
7
|
+
function getLLMProvider() {
|
|
8
|
+
if (llmProviderInitAttempted)
|
|
9
|
+
return llmProvider;
|
|
10
|
+
llmProviderInitAttempted = true;
|
|
11
|
+
try {
|
|
12
|
+
llmProvider = new AnthropicProvider();
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
// No API key — agent_prompt steps will fail clearly when invoked.
|
|
16
|
+
}
|
|
17
|
+
return llmProvider;
|
|
18
|
+
}
|
|
3
19
|
export function createFlowTool(registry, reloadConfig) {
|
|
20
|
+
// Ensure agent_prompt is registered on the shared registry.
|
|
21
|
+
registry.registerClassPath("flow.agent_prompt", AgentPromptTask);
|
|
4
22
|
return {
|
|
5
23
|
name: "flow",
|
|
6
24
|
description: `Run or inspect named flows defined in ue-mcp.yml. Config is reloaded on every call — no restart needed.\n\n` +
|
|
7
25
|
`Actions:\n` +
|
|
8
|
-
`- run: Execute a flow. Params: flowName, skip?, params?\n` +
|
|
26
|
+
`- run: Execute a flow. Params: flowName, skip?, params?, rollback_on_failure?\n` +
|
|
9
27
|
`- plan: Show execution plan without running. Params: flowName\n` +
|
|
10
28
|
`- list: List available flows\n\n` +
|
|
11
29
|
`params: Runtime options merged into every step's options (highest priority). ` +
|
|
12
|
-
`Use to override YAML-hardcoded values like levelPath, directory, configuration, etc
|
|
30
|
+
`Use to override YAML-hardcoded values like levelPath, directory, configuration, etc.\n\n` +
|
|
31
|
+
`rollback_on_failure: When true, rollback records from completed steps are invoked ` +
|
|
32
|
+
`in reverse order if a subsequent step fails.`,
|
|
13
33
|
schema: {
|
|
14
34
|
action: z.enum(["run", "plan", "list"]).describe("Action to perform"),
|
|
15
35
|
flowName: z.string().optional().describe("Flow name from ue-mcp.yml"),
|
|
16
36
|
skip: z.array(z.string()).optional().describe("Step names or numbers to skip"),
|
|
17
37
|
params: z.record(z.unknown()).optional().describe("Runtime options merged into every step's options (highest priority)"),
|
|
38
|
+
rollback_on_failure: z.boolean().optional().describe("Invoke inverse tasks in reverse order on failure"),
|
|
18
39
|
},
|
|
19
40
|
actions: {
|
|
20
41
|
run: { handler: async (ctx, params) => runFlow(registry, reloadConfig(), ctx, params) },
|
|
@@ -54,14 +75,16 @@ async function runFlow(registry, config, ctx, params) {
|
|
|
54
75
|
throw new Error("flowName is required");
|
|
55
76
|
const skip = params.skip ?? [];
|
|
56
77
|
const flowParams = params.params;
|
|
78
|
+
const rollback_on_failure = params.rollback_on_failure;
|
|
57
79
|
const runner = makeRunner(registry, config, ctx);
|
|
58
|
-
const result = await runner.run({ flowName, skip, params: flowParams });
|
|
80
|
+
const result = await runner.run({ flowName, skip, params: flowParams, rollback_on_failure });
|
|
59
81
|
return formatFlowResult(result);
|
|
60
82
|
}
|
|
61
83
|
function makeRunner(registry, config, ctx) {
|
|
62
84
|
const flowCtx = {
|
|
63
85
|
bridge: ctx.bridge,
|
|
64
86
|
project: ctx.project,
|
|
87
|
+
llm: getLLMProvider(),
|
|
65
88
|
};
|
|
66
89
|
return new FlowRunner({
|
|
67
90
|
tasks: config.tasks,
|
|
@@ -78,11 +101,11 @@ function formatFlowResult(result) {
|
|
|
78
101
|
for (const s of result.steps) {
|
|
79
102
|
const stepIcon = s.skipped ? "○" : s.result?.success ? "✓" : "✗";
|
|
80
103
|
const status = s.skipped ? "skipped" : s.result?.success ? formatDuration(s.duration) : "FAILED";
|
|
81
|
-
|
|
104
|
+
const attempts = s.attempts && s.attempts > 1 ? ` [${s.attempts} attempts]` : "";
|
|
105
|
+
lines.push(` ${stepIcon} ${s.stepNumber}. ${s.name} (${s.type}) — ${status}${attempts}`);
|
|
82
106
|
if (s.result?.error) {
|
|
83
107
|
lines.push(` ${s.result.error.message}`);
|
|
84
108
|
}
|
|
85
|
-
// Show shell output if present
|
|
86
109
|
if (s.result?.data?.output && typeof s.result.data.output === "string") {
|
|
87
110
|
const output = s.result.data.output;
|
|
88
111
|
if (output.length > 0) {
|
|
@@ -97,12 +120,29 @@ function formatFlowResult(result) {
|
|
|
97
120
|
lines.push("");
|
|
98
121
|
lines.push(` Error: ${result.error.message}`);
|
|
99
122
|
}
|
|
123
|
+
if (result.rollback) {
|
|
124
|
+
lines.push("");
|
|
125
|
+
lines.push(` Rollback: ${result.rollback.succeeded}/${result.rollback.attempted} inverses succeeded` +
|
|
126
|
+
(result.rollback.errors.length ? ` — ${result.rollback.errors.length} failed` : ""));
|
|
127
|
+
for (const e of result.rollback.errors) {
|
|
128
|
+
lines.push(` ✗ ${e.taskName}: ${e.error.message}`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (result.hookErrors && result.hookErrors.length > 0) {
|
|
132
|
+
lines.push("");
|
|
133
|
+
lines.push(` Hook errors (${result.hookErrors.length}):`);
|
|
134
|
+
for (const h of result.hookErrors) {
|
|
135
|
+
lines.push(` ✗ ${h.phase}:${h.name} — ${h.error.message}`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
100
138
|
return {
|
|
101
139
|
summary: lines.join("\n"),
|
|
102
140
|
success: result.success,
|
|
103
141
|
duration: result.duration,
|
|
104
142
|
stepCount: result.steps.length,
|
|
105
143
|
failedStep: result.steps.find((s) => s.result?.success === false)?.name,
|
|
144
|
+
rollback: result.rollback,
|
|
145
|
+
hookErrors: result.hookErrors,
|
|
106
146
|
};
|
|
107
147
|
}
|
|
108
148
|
function formatDuration(ms) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flow-tool.js","sourceRoot":"","sources":["../../src/flow/flow-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"flow-tool.js","sourceRoot":"","sources":["../../src/flow/flow-tool.ts"],"names":[],"mappings":"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"}
|