taskflow-mcp-core 0.1.6

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,312 @@
1
+ /**
2
+ * Render a taskflow DAG for the Codex hosts, in two forms:
3
+ *
4
+ * - `renderFlowSvg` — a self-contained SVG "card" for the Codex **desktop
5
+ * app**, which renders an MCP `image` content block
6
+ * as `<img src="data:…">` in Chromium (an inline SVG
7
+ * data URI shows as an actual diagram).
8
+ * - `renderFlowOutline` — a compact monospace ASCII outline for the Codex
9
+ * **CLI/TUI**, which cannot render images: the Rust
10
+ * binary substitutes a bare `<image content>`
11
+ * placeholder for image blocks, so a picture is
12
+ * useless there (and a vision-less model would see
13
+ * only that placeholder). The outline is plain text
14
+ * that reads in the terminal AND feeds the model.
15
+ *
16
+ * We can't tell the two hosts apart from inside the server (every Codex
17
+ * frontend connects with the same MCP client id, `codex-mcp-client`), so
18
+ * `taskflow_compile` returns BOTH blocks: the desktop app shows the image and
19
+ * ignores the trailing text, while the CLI/TUI shows the text and renders the
20
+ * image as a harmless placeholder. One payload, correct on every host. Claude
21
+ * Code behaves like the CLI case: the text outline is what the model reads.
22
+ *
23
+ * This is MCP presentation shared by every MCP host adapter (codex, claude),
24
+ * so it lives in core next to the MCP server — core keeps its portable
25
+ * Mermaid/markdown artifact (`compileTaskflow`) and its zero-runtime-deps
26
+ * guarantee. Both renderers reuse core's exported `topoLayers` (layout)
27
+ * and `dependenciesOf` (edges) so they share the engine's exact DAG semantics.
28
+ * Pure functions, no I/O.
29
+ */
30
+ import { dependenciesOf, topoLayers, LOOP_DEFAULT_MAX_ITERATIONS, TOURNAMENT_DEFAULT_VARIANTS, } from "taskflow-core";
31
+ // ---------------------------------------------------------------------------
32
+ // Layout constants (px). Tuned so a small flow (3–8 phases) is legible even
33
+ // after Codex scales the card down to its ~192px image height cap.
34
+ // ---------------------------------------------------------------------------
35
+ const FONT = 12;
36
+ const SUB_FONT = 10.5;
37
+ const CHAR_W = 6.6; // ~0.55em at 12px in the monospace stack below
38
+ const LINE_H = 15;
39
+ const PAD_X = 12;
40
+ const PAD_Y = 9;
41
+ const H_GAP = 26; // horizontal gap between sibling nodes in a layer
42
+ const V_GAP = 38; // vertical gap between layers
43
+ const MARGIN = 18;
44
+ const MIN_NODE_W = 96;
45
+ const MAX_LABEL = 26; // truncate long ids/agents so nodes stay compact
46
+ /** Above this phase count the card stops being legible once scaled — the caller
47
+ * should fall back to the text report instead of embedding a postage stamp. */
48
+ export const SVG_PHASE_LIMIT = 60;
49
+ // ---------------------------------------------------------------------------
50
+ // Palette — baked in (an <img> data URI is fully isolated from host CSS, so we
51
+ // can't read Codex theme tokens). A dark card reads well against Codex's dark
52
+ // chat surface; colors mirror the Mermaid overlay in core's compile.ts.
53
+ // ---------------------------------------------------------------------------
54
+ const C = {
55
+ panel: "#16181d",
56
+ panelStroke: "#2a2d34",
57
+ node: "#21242c",
58
+ nodeStroke: "#3a3f4b",
59
+ text: "#e6e8ec",
60
+ sub: "#9aa0ab",
61
+ edge: "#4b5563",
62
+ errFill: "#3b0d0d",
63
+ errStroke: "#ef4444",
64
+ errText: "#fecaca",
65
+ warnFill: "#3a2e05",
66
+ warnStroke: "#f59e0b",
67
+ warnText: "#fde68a",
68
+ finalStroke: "#43d9ad",
69
+ };
70
+ // ---------------------------------------------------------------------------
71
+ // Helpers
72
+ // ---------------------------------------------------------------------------
73
+ function xml(text) {
74
+ return text
75
+ .replace(/&/g, "&amp;")
76
+ .replace(/</g, "&lt;")
77
+ .replace(/>/g, "&gt;")
78
+ .replace(/"/g, "&quot;")
79
+ .replace(/'/g, "&#39;");
80
+ }
81
+ function truncate(text, max = MAX_LABEL) {
82
+ // Defensive: callers may pass a non-string field (e.g. a malformed `over` /
83
+ // `use` that is an array or object). Coerce so the renderer can never throw
84
+ // — the MCP tools validate first, but this keeps the pure renderer total.
85
+ const s = typeof text === "string" ? text : text == null ? "" : String(text);
86
+ const t = s.replace(/\s+/g, " ").trim();
87
+ return t.length > max ? `${t.slice(0, max - 1)}…` : t;
88
+ }
89
+ /** Compact one-glyph-plus-count type tag (a small-render echo of compile.ts). */
90
+ function typeTag(p) {
91
+ switch (p.type) {
92
+ case "parallel":
93
+ return `▦ parallel ×${p.branches?.length ?? 0}`;
94
+ case "map":
95
+ return `⇉ map · ${truncate(p.over ?? "?", 14)}`;
96
+ case "gate":
97
+ return p.eval?.length ? `◇ gate +${p.eval.length}` : "◇ gate";
98
+ case "reduce":
99
+ return `▽ reduce ←${p.from?.length ?? 0}`;
100
+ case "approval":
101
+ return "⏸ approval";
102
+ case "flow":
103
+ return p.use ? `⊞ ${truncate(p.use, 16)}` : "⊞ flow";
104
+ case "loop":
105
+ return `↻ loop ≤${p.maxIterations ?? LOOP_DEFAULT_MAX_ITERATIONS}`;
106
+ case "tournament":
107
+ return `🏆 ×${p.variants ?? (p.branches?.length || TOURNAMENT_DEFAULT_VARIANTS)}`;
108
+ default:
109
+ return "▸ agent";
110
+ }
111
+ }
112
+ function nodeLines(p) {
113
+ return {
114
+ title: `${truncate(p.id)}${p.final ? " ★" : ""}`,
115
+ tag: typeTag(p),
116
+ agent: p.agent ? `@${truncate(p.agent, 20)}` : undefined,
117
+ };
118
+ }
119
+ function nodeWidth(l) {
120
+ const longest = Math.max(l.title.length, l.tag.length, l.agent?.length ?? 0);
121
+ return Math.max(MIN_NODE_W, Math.round(longest * CHAR_W) + PAD_X * 2);
122
+ }
123
+ function nodeHeight(l) {
124
+ const rows = 2 + (l.agent ? 1 : 0);
125
+ return rows * LINE_H + PAD_Y * 2;
126
+ }
127
+ /** Worst severity per phase, so a node paints red (error) over amber (warning). */
128
+ function severityByPhase(issues) {
129
+ const m = new Map();
130
+ for (const i of issues) {
131
+ if (!i.phaseId)
132
+ continue;
133
+ if (i.severity === "error" || !m.has(i.phaseId))
134
+ m.set(i.phaseId, i.severity);
135
+ }
136
+ return m;
137
+ }
138
+ // ---------------------------------------------------------------------------
139
+ // Renderer
140
+ // ---------------------------------------------------------------------------
141
+ /**
142
+ * Render `flow` (annotated with `verification`) as an SVG string. Layered
143
+ * top-down using core's `topoLayers`; edges follow `dependenciesOf`. Returns a
144
+ * complete `<svg …>…</svg>` document (no XML prolog — it's inlined as a data
145
+ * URI). Returns `null` when the flow is too large to render legibly.
146
+ */
147
+ export function renderFlowSvg(flow, verification) {
148
+ // Total renderer: tolerate a malformed non-array `phases` (raw JSON can bypass
149
+ // schema validation) by coercing to an empty list rather than throwing.
150
+ const phases = (Array.isArray(flow.phases) ? flow.phases : []).filter((p) => !!p && typeof p === "object");
151
+ if (phases.length === 0 || phases.length > SVG_PHASE_LIMIT)
152
+ return null;
153
+ const layers = topoLayers(phases);
154
+ // Any phase not placed by topoLayers (e.g. trapped in a cycle) gets its own
155
+ // trailing layer so the picture never silently drops a node.
156
+ const placed = new Set(layers.flat().map((p) => p.id));
157
+ const orphans = phases.filter((p) => !placed.has(p.id));
158
+ if (orphans.length)
159
+ layers.push(orphans);
160
+ const sev = severityByPhase(verification.issues);
161
+ const rects = new Map();
162
+ // First pass: size every node and measure each layer's total width.
163
+ const linesById = new Map();
164
+ const sizeById = new Map();
165
+ const layerWidths = [];
166
+ const layerHeights = [];
167
+ for (const layer of layers) {
168
+ let w = 0;
169
+ let h = 0;
170
+ layer.forEach((p, i) => {
171
+ const l = nodeLines(p);
172
+ linesById.set(p.id, l);
173
+ const nw = nodeWidth(l);
174
+ const nh = nodeHeight(l);
175
+ sizeById.set(p.id, { w: nw, h: nh });
176
+ w += nw + (i > 0 ? H_GAP : 0);
177
+ h = Math.max(h, nh);
178
+ });
179
+ layerWidths.push(w);
180
+ layerHeights.push(h);
181
+ }
182
+ const contentW = Math.max(...layerWidths, MIN_NODE_W);
183
+ const canvasW = contentW + MARGIN * 2;
184
+ // Second pass: assign positions (each layer centered within contentW).
185
+ let y = MARGIN;
186
+ layers.forEach((layer, li) => {
187
+ let x = MARGIN + (contentW - layerWidths[li]) / 2;
188
+ for (const p of layer) {
189
+ const s = sizeById.get(p.id);
190
+ rects.set(p.id, { x, y, w: s.w, h: s.h, cx: x + s.w / 2 });
191
+ x += s.w + H_GAP;
192
+ }
193
+ y += layerHeights[li] + V_GAP;
194
+ });
195
+ const canvasH = y - V_GAP + MARGIN;
196
+ // Edges — draw first so nodes paint on top.
197
+ const edgeSvg = [];
198
+ const known = new Set(phases.map((p) => p.id));
199
+ for (const p of phases) {
200
+ const to = rects.get(p.id);
201
+ if (!to)
202
+ continue;
203
+ for (const d of dependenciesOf(p)) {
204
+ if (!known.has(d))
205
+ continue;
206
+ const from = rects.get(d);
207
+ if (!from)
208
+ continue;
209
+ const x1 = from.cx;
210
+ const y1 = from.y + from.h;
211
+ const x2 = to.cx;
212
+ const y2 = to.y;
213
+ const my = (y1 + y2) / 2;
214
+ const dotted = p.join === "any" ? ' stroke-dasharray="4 3"' : "";
215
+ edgeSvg.push(`<path d="M${x1.toFixed(1)} ${y1.toFixed(1)} C ${x1.toFixed(1)} ${my.toFixed(1)}, ${x2.toFixed(1)} ${my.toFixed(1)}, ${x2.toFixed(1)} ${(y2 - 6).toFixed(1)}" fill="none" stroke="${C.edge}" stroke-width="1.4"${dotted} marker-end="url(#tf-arrow)"/>`);
216
+ }
217
+ }
218
+ // Nodes.
219
+ const nodeSvg = [];
220
+ for (const p of phases) {
221
+ const r = rects.get(p.id);
222
+ if (!r)
223
+ continue;
224
+ const l = linesById.get(p.id);
225
+ const s = sev.get(p.id);
226
+ let fill = C.node;
227
+ let stroke = C.nodeStroke;
228
+ let strokeW = 1.2;
229
+ let titleColor = C.text;
230
+ if (s === "error") {
231
+ fill = C.errFill;
232
+ stroke = C.errStroke;
233
+ strokeW = 2;
234
+ titleColor = C.errText;
235
+ }
236
+ else if (s === "warning") {
237
+ fill = C.warnFill;
238
+ stroke = C.warnStroke;
239
+ strokeW = 2;
240
+ titleColor = C.warnText;
241
+ }
242
+ else if (p.final) {
243
+ stroke = C.finalStroke;
244
+ strokeW = 2;
245
+ }
246
+ const tx = r.x + PAD_X;
247
+ let ty = r.y + PAD_Y + FONT;
248
+ const parts = [`<rect x="${r.x}" y="${r.y}" width="${r.w}" height="${r.h}" rx="8" fill="${fill}" stroke="${stroke}" stroke-width="${strokeW}"/>`];
249
+ parts.push(`<text x="${tx}" y="${ty.toFixed(1)}" font-size="${FONT}" font-weight="600" fill="${titleColor}">${xml(l.title)}</text>`);
250
+ ty += LINE_H;
251
+ parts.push(`<text x="${tx}" y="${ty.toFixed(1)}" font-size="${SUB_FONT}" fill="${C.sub}">${xml(l.tag)}</text>`);
252
+ if (l.agent) {
253
+ ty += LINE_H;
254
+ parts.push(`<text x="${tx}" y="${ty.toFixed(1)}" font-size="${SUB_FONT}" fill="${C.sub}">${xml(l.agent)}</text>`);
255
+ }
256
+ nodeSvg.push(parts.join(""));
257
+ }
258
+ return [
259
+ `<svg xmlns="http://www.w3.org/2000/svg" width="${canvasW}" height="${canvasH}" viewBox="0 0 ${canvasW} ${canvasH}" font-family="ui-monospace, SFMono-Regular, Menlo, monospace">`,
260
+ `<defs><marker id="tf-arrow" viewBox="0 0 8 8" refX="6" refY="4" markerWidth="6" markerHeight="6" orient="auto-start-reverse"><path d="M0 0 L8 4 L0 8 z" fill="${C.edge}"/></marker></defs>`,
261
+ `<rect x="0.5" y="0.5" width="${canvasW - 1}" height="${canvasH - 1}" rx="12" fill="${C.panel}" stroke="${C.panelStroke}"/>`,
262
+ ...edgeSvg,
263
+ ...nodeSvg,
264
+ `</svg>`,
265
+ ].join("");
266
+ }
267
+ /** Base64 of an SVG string, for an MCP `image` content block (`image/svg+xml`). */
268
+ export function svgToBase64(svg) {
269
+ return Buffer.from(svg, "utf8").toString("base64");
270
+ }
271
+ // ---------------------------------------------------------------------------
272
+ // Text outline (Codex CLI/TUI + vision-less models)
273
+ // ---------------------------------------------------------------------------
274
+ /** Worst severity marker for a phase, as a leading glyph in the outline. */
275
+ function sevMark(sev, id) {
276
+ const s = sev.get(id);
277
+ return s === "error" ? "✗ " : s === "warning" ? "! " : "";
278
+ }
279
+ /**
280
+ * Render the DAG as a compact monospace outline: one line per phase, grouped by
281
+ * topological layer (phases in the same layer run concurrently), each showing
282
+ * its id, type tag, agent, and upstream deps. This is the CLI/TUI counterpart
283
+ * to `renderFlowSvg` — it degrades to readable text where images can't render,
284
+ * and (unlike an image placeholder) still tells a vision-less model the shape
285
+ * of the graph. Deterministic; issue markers mirror the SVG overlay.
286
+ */
287
+ export function renderFlowOutline(flow, verification) {
288
+ const phases = (Array.isArray(flow.phases) ? flow.phases : []).filter((p) => !!p && typeof p === "object");
289
+ if (phases.length === 0)
290
+ return "(empty flow — no phases)";
291
+ const sev = severityByPhase(verification.issues);
292
+ const layers = topoLayers(phases);
293
+ const placed = new Set(layers.flat().map((p) => p.id));
294
+ const orphans = phases.filter((p) => !placed.has(p.id));
295
+ if (orphans.length)
296
+ layers.push(orphans); // cycle-trapped nodes still listed
297
+ const lines = [];
298
+ layers.forEach((layer, i) => {
299
+ const tag = layer.length > 1 ? ` (${layer.length} in parallel)` : "";
300
+ lines.push(`Layer ${i + 1}${tag}:`);
301
+ for (const p of layer) {
302
+ const deps = dependenciesOf(p).filter((d) => d !== p.id);
303
+ const arrow = p.join === "any" ? " ↯ any of " : " ← ";
304
+ const depStr = deps.length ? `${arrow}${deps.join(", ")}` : "";
305
+ const agent = p.agent ? ` @${p.agent}` : "";
306
+ const star = p.final ? " ★" : "";
307
+ lines.push(` ${sevMark(sev, p.id)}${p.id}${star} [${typeTag(p)}]${agent}${depStr}`);
308
+ }
309
+ });
310
+ return lines.join("\n");
311
+ }
312
+ //# sourceMappingURL=svg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svg.js","sourceRoot":"","sources":["../../src/mcp/svg.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "taskflow-mcp-core",
3
+ "version": "0.1.6",
4
+ "description": "Host-neutral MCP server for taskflow: a dependency-free stdio JSON-RPC server exposing the taskflow_* tools, plus the DAG SVG/outline renderer. Shared by the codex/claude/opencode adapters — depends only on taskflow-core.",
5
+ "keywords": [
6
+ "taskflow",
7
+ "mcp",
8
+ "json-rpc",
9
+ "orchestration",
10
+ "subagents",
11
+ "workflow"
12
+ ],
13
+ "license": "MIT",
14
+ "author": "heggria <bshengtao@gmail.com>",
15
+ "homepage": "https://github.com/heggria/taskflow#readme",
16
+ "bugs": {
17
+ "url": "https://github.com/heggria/taskflow/issues"
18
+ },
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "git+https://github.com/heggria/taskflow.git",
22
+ "directory": "packages/taskflow-mcp-core"
23
+ },
24
+ "type": "module",
25
+ "engines": {
26
+ "node": ">=22.19.0"
27
+ },
28
+ "main": "./dist/mcp/server.js",
29
+ "types": "./dist/mcp/server.d.ts",
30
+ "exports": {
31
+ ".": {
32
+ "development": "./src/mcp/server.ts",
33
+ "types": "./dist/mcp/server.d.ts",
34
+ "default": "./dist/mcp/server.js"
35
+ },
36
+ "./server": {
37
+ "development": "./src/mcp/server.ts",
38
+ "types": "./dist/mcp/server.d.ts",
39
+ "default": "./dist/mcp/server.js"
40
+ },
41
+ "./jsonrpc": {
42
+ "development": "./src/mcp/jsonrpc.ts",
43
+ "types": "./dist/mcp/jsonrpc.d.ts",
44
+ "default": "./dist/mcp/jsonrpc.js"
45
+ },
46
+ "./svg": {
47
+ "development": "./src/mcp/svg.ts",
48
+ "types": "./dist/mcp/svg.d.ts",
49
+ "default": "./dist/mcp/svg.js"
50
+ }
51
+ },
52
+ "files": [
53
+ "dist"
54
+ ],
55
+ "publishConfig": {
56
+ "access": "public"
57
+ },
58
+ "dependencies": {
59
+ "taskflow-core": "0.1.6"
60
+ },
61
+ "scripts": {
62
+ "build": "rm -rf dist && tsc -p tsconfig.build.json && node ../../scripts/copy-readme.mjs taskflow-mcp-core"
63
+ }
64
+ }