codex-taskflow 0.1.5 → 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.
@@ -1,403 +1,23 @@
1
1
  /**
2
- * pi-taskflow as an MCP server for Codex (and any MCP client).
2
+ * The Codex binding of the host-neutral MCP server (taskflow-mcp-core/server).
3
3
  *
4
- * Exposes the taskflow engine as MCP tools so a Codex user can declare and run
5
- * verifiable task DAGs from inside codex — the mirror of codex-runner.ts (which
6
- * lets taskflow *call* codex). Here taskflow is *called by* codex: each subagent
7
- * a flow spawns is itself a `codex exec` process (via codexSubagentRunner), so
8
- * the whole thing closes the loop with no pi process required.
9
- *
10
- * Protocol: MCP over stdio, JSON-RPC 2.0 (newline-delimited). Implemented on the
11
- * dependency-free transport in ./jsonrpc.ts — pi-taskflow keeps its zero-runtime
12
- * -deps guarantee; we do NOT use @modelcontextprotocol/sdk.
13
- *
14
- * Tools exposed:
15
- * - taskflow_run : run an inline or saved flow, return the final output
16
- * - taskflow_list : list saved flows discoverable in this cwd
17
- * - taskflow_show : show a saved flow's definition
18
- * - taskflow_verify : statically verify a flow (no execution)
19
- * - taskflow_compile : render a flow as a DAG diagram (SVG image) + status line
20
- */
21
- import { RpcError, RPC, serveStdio } from "./jsonrpc.js";
22
- import { codexSubagentRunner } from "../codex-runner.js";
23
- import { renderFlowSvg, renderFlowOutline, svgToBase64 } from "./svg.js";
24
- import { discoverAgents, executeTaskflow, getFlow, listFlows, newRunId, peekRun, saveRun, DEFAULT_KEPT_RUNS, DEFAULT_RUN_AGE_DAYS, compileTaskflow, verifyTaskflow, desugar, isShorthand, validateTaskflow, readSubagentSettings, } from "taskflow-core";
25
- const PROTOCOL_VERSION = "2025-06-18";
26
- const SERVER_INFO = { name: "taskflow", title: "Taskflow", version: "0.1.3" };
27
- /**
28
- * MCP tools/call result with a single text block.
29
- *
30
- * IMPORTANT (Codex rendering): the Codex desktop app renders a `text` content
31
- * block as a fixed grey "plaintext" <pre> box — it does NOT parse markdown or
32
- * highlight code, wraps on whitespace, and caps the box at ~192px tall with an
33
- * inner scroll. So text here is written as *plain text*: no ```fences```, no
34
- * markdown tables, conclusion-first, and near-duplicate lines collapsed. Rich
35
- * rendering (structuredContent/_meta) is gated to Codex's first-party "Apps"
36
- * server, so third-party MCP output can't opt into it. See docs/codex-mcp.md.
37
- */
38
- function textContent(text, isError = false) {
39
- return { content: [{ type: "text", text }], isError };
40
- }
41
- /** An MCP `image` content block, optionally followed by text blocks. Codex's
42
- * desktop app renders the image as `<img src="data:…">` (an inline SVG shows as
43
- * a real diagram) and shows the trailing text as a caption. The CLI/TUI can't
44
- * render images — it prints a bare `<image content>` placeholder — so the
45
- * trailing text MUST be self-sufficient there (and for vision-less models). */
46
- function imageContent(base64, mimeType, texts, isError = false) {
47
- const content = [{ type: "image", data: base64, mimeType }];
48
- for (const t of texts)
49
- if (t)
50
- content.push({ type: "text", text: t });
51
- return { content, isError };
52
- }
53
- /**
54
- * Collapse near-identical validation messages so N phases hitting the same rule
55
- * render as one line with a count instead of N wall-of-text repeats (the exact
56
- * ugliness this file is fighting). Strips a leading `Phase '<id>': ` / `Phase
57
- * '<id>' ` prefix, groups by the remaining message, and lists the affected ids.
58
- */
59
- function dedupeMessages(msgs) {
60
- const groups = new Map();
61
- const order = [];
62
- for (const raw of msgs) {
63
- const m = raw.match(/^Phase '([^']+)':?\s+(.*)$/s);
64
- const key = m ? m[2] : raw;
65
- const id = m ? m[1] : "";
66
- if (!groups.has(key)) {
67
- groups.set(key, []);
68
- order.push(key);
69
- }
70
- if (id)
71
- groups.get(key).push(id);
72
- }
73
- return order.map((key) => {
74
- const ids = groups.get(key);
75
- if (ids.length === 0)
76
- return key;
77
- if (ids.length === 1)
78
- return `${key} (phase ${ids[0]})`;
79
- const shown = ids.slice(0, 4).join(", ");
80
- const more = ids.length > 4 ? ` +${ids.length - 4} more` : "";
81
- return `${key} (${ids.length} phases: ${shown}${more})`;
82
- });
83
- }
84
- /**
85
- * Render verification issues as deduped, conclusion-friendly "Errors:" /
86
- * "Warnings:" plaintext blocks. `extraErrors`/`extraWarnings` fold in the raw
87
- * string messages from `validateTaskflow` so structural + quality issues share
88
- * one deduped view. Shared by taskflow_verify and taskflow_compile's fallback.
89
- */
90
- function issueBlocks(issues, extraErrors = [], extraWarnings = []) {
91
- const toStr = (i) =>
92
- // verifyTaskflow messages already embed the phase id in prose ("Phase 'x'
93
- // is a terminal phase…"); only prepend the id for messages that don't, so
94
- // dedupeMessages can strip one consistent prefix and collapse same-rule hits.
95
- i.phaseId && !/^Phase '/.test(i.message) ? `Phase '${i.phaseId}': ${i.message}` : i.message;
96
- const rawErrors = [...extraErrors, ...issues.filter((i) => i.severity === "error").map(toStr)];
97
- const rawWarnings = [...extraWarnings, ...issues.filter((i) => i.severity === "warning").map(toStr)];
98
- // Count reflects the true number of issues; the lines below are the *deduped*
99
- // compact view (N same-rule hits collapse to one line + a phase list).
100
- const errors = dedupeMessages(rawErrors);
101
- const warnings = dedupeMessages(rawWarnings);
102
- const errBlock = errors.length ? `\n\nErrors:\n${errors.map((e) => `- ${e}`).join("\n")}` : "";
103
- const warnBlock = warnings.length ? `\n\nWarnings:\n${warnings.map((w) => `- ${w}`).join("\n")}` : "";
104
- return { errorCount: rawErrors.length, warningCount: rawWarnings.length, text: `${errBlock}${warnBlock}` };
105
- }
106
- /** Pluralize a count for a compact status line. */
107
- function count(n, noun) {
108
- return `${n} ${noun}${n === 1 ? "" : "s"}`;
109
- }
110
- const TOOLS = [
111
- {
112
- name: "taskflow_run",
113
- title: "Run a taskflow",
114
- description: "Run a taskflow DAG and return its final output. Provide EITHER `name` (a saved flow) OR `define` (an inline flow definition: {name, phases:[…]} or a shorthand {task} / {tasks} / {chain}). Subagents execute as codex sessions. Intermediate phase outputs stay in the runtime; only the final phase output is returned — the reported runId can be passed to taskflow_peek to inspect intermediate phase outputs afterwards.",
115
- inputSchema: {
116
- type: "object",
117
- additionalProperties: false,
118
- properties: {
119
- name: { type: "string", description: "Name of a saved flow to run." },
120
- define: { type: "object", description: "Inline flow definition (full DAG or shorthand)." },
121
- args: { type: "object", description: "Invocation arguments interpolated as {args.X}." },
122
- incremental: { type: "boolean", description: "Default every phase to cross-run cache reuse." },
123
- },
124
- },
125
- },
126
- {
127
- name: "taskflow_list",
128
- title: "List saved taskflows",
129
- description: "List the saved taskflows discoverable from the current working directory (user + project scope).",
130
- inputSchema: { type: "object", additionalProperties: false, properties: {} },
131
- },
132
- {
133
- name: "taskflow_show",
134
- title: "Show a saved taskflow",
135
- description: "Show a saved flow's full definition as JSON.",
136
- inputSchema: {
137
- type: "object",
138
- additionalProperties: false,
139
- properties: { name: { type: "string", description: "Name of the saved flow." } },
140
- required: ["name"],
141
- },
142
- },
143
- {
144
- name: "taskflow_verify",
145
- title: "Verify a taskflow",
146
- description: "Statically verify a flow (cycles, missing deps, undefined refs, …) WITHOUT executing it. Provide `name` or `define`.",
147
- inputSchema: {
148
- type: "object",
149
- additionalProperties: false,
150
- properties: {
151
- name: { type: "string" },
152
- define: { type: "object" },
153
- },
154
- },
155
- },
156
- {
157
- name: "taskflow_compile",
158
- title: "Compile a taskflow to a diagram",
159
- description: "Render a flow's DAG as a diagram (an inline SVG image) with issues overlaid (red=error, amber=warning, green=final), plus a compact status line. No execution. Provide `name` or `define`.",
160
- inputSchema: {
161
- type: "object",
162
- additionalProperties: false,
163
- properties: {
164
- name: { type: "string" },
165
- define: { type: "object" },
166
- },
167
- },
168
- },
169
- {
170
- name: "taskflow_peek",
171
- title: "Peek at a run's phase output",
172
- description: "Inspect one phase's intermediate output from a stored run (post-hoc debugging). Use the runId reported by taskflow_run. Omit `phaseId` to list the run's phases. Output is hard-truncated (default 4000 chars) so a peek never floods the context window. Read-only.",
173
- inputSchema: {
174
- type: "object",
175
- additionalProperties: false,
176
- properties: {
177
- runId: { type: "string", description: "The run to inspect (from a prior taskflow_run or the runs index)." },
178
- phaseId: { type: "string", description: "Phase to peek at. Omit to list all phases with status + output size." },
179
- json: { type: "boolean", description: "Return the phase's parsed JSON instead of its text output." },
180
- item: { type: "number", description: "For map/parallel phases: the 1-based item section to extract." },
181
- limit: { type: "number", description: "Truncation cap in chars (default 4000, max 32000)." },
182
- },
183
- required: ["runId"],
184
- },
185
- },
186
- ];
187
- /** Resolve a flow from params: inline `define` (desugared) or saved `name`. */
188
- function resolveFlow(cwd, params) {
189
- if (params.define !== undefined && params.define !== null) {
190
- return isShorthand(params.define) ? desugar(params.define) : params.define;
191
- }
192
- if (params.name) {
193
- const saved = getFlow(cwd, params.name);
194
- if (!saved)
195
- throw new RpcError(RPC.INVALID_PARAMS, `No saved flow named "${params.name}" found from ${cwd}.`);
196
- return saved.def;
197
- }
198
- throw new RpcError(RPC.INVALID_PARAMS, "Provide either `name` (a saved flow) or `define` (an inline flow).");
199
- }
200
- function mkRunState(def, args, cwd) {
201
- return {
202
- runId: newRunId(def.name ?? "flow"),
203
- flowName: def.name ?? "flow",
204
- def,
205
- args,
206
- status: "running",
207
- phases: {},
208
- createdAt: Date.now(),
209
- updatedAt: Date.now(),
210
- cwd,
211
- };
212
- }
213
- /**
214
- * Build the per-call tool handlers. `cwd` is the directory the server was
215
- * launched in (where saved flows + agents are discovered, and where codex
216
- * subagents run).
4
+ * The protocol layer, tool schemas, and handlers all live in core; this shim
5
+ * only closes the loop for Codex: every subagent a flow spawns is itself a
6
+ * `codex exec` process (via codexSubagentRunner). Kept as a module (not just
7
+ * bin.ts) so tests and embedders get the same pre-bound surface the bin runs.
217
8
  */
9
+ import { makeMcpHandlers as coreMakeMcpHandlers, makeToolHandlers as coreMakeToolHandlers, startMcpServer as coreStartMcpServer, } from "taskflow-mcp-core/server";
10
+ import { codexSubagentRunner } from "taskflow-hosts";
11
+ /** Per-call tool handlers with codex subagent execution bound in. */
218
12
  export function makeToolHandlers(cwd) {
219
- return {
220
- taskflow_run: async (args) => {
221
- const def = resolveFlow(cwd, args);
222
- const v = validateTaskflow(def);
223
- if (!v.ok)
224
- return textContent(`Flow is invalid:\n- ${v.errors.join("\n- ")}`, true);
225
- // Resolve model roles (e.g. {{fast}} -> a real model id) so the built-in
226
- // agents' placeholder models map to something codex can launch. This is
227
- // the same lookup the pi adapter does; without it every phase fails with
228
- // "Model metadata for {{fast}} not found".
229
- const settings = readSubagentSettings();
230
- const { agents } = discoverAgents(cwd, "both", settings.modelRoles, settings.taskflow);
231
- const deps = {
232
- cwd,
233
- agents,
234
- runTask: codexSubagentRunner.runTask,
235
- };
236
- const state = mkRunState(def, args.args ?? {}, cwd);
237
- if (args.incremental === true)
238
- deps.cacheScopeDefault = "cross-run";
239
- // Persist run state (throttled + final) so taskflow_peek / resume can read
240
- // intermediate phase outputs after the run — same contract as the pi adapter.
241
- const cleanupConfig = { maxKeep: DEFAULT_KEPT_RUNS, maxAgeDays: DEFAULT_RUN_AGE_DAYS };
242
- let lastPersist = 0;
243
- deps.persist = (s) => {
244
- const now = Date.now();
245
- if (now - lastPersist >= 1000) {
246
- lastPersist = now;
247
- saveRun(s, cleanupConfig);
248
- }
249
- };
250
- const res = await executeTaskflow(state, deps).finally(() => {
251
- // Terminal persist must survive a throwing runtime ("never lose work") —
252
- // and persistence itself must never sink a completed run.
253
- try {
254
- saveRun(state, cleanupConfig);
255
- }
256
- catch {
257
- /* fail-open */
258
- }
259
- });
260
- const header = res.ok ? "✓ taskflow complete" : "✗ taskflow did not fully succeed";
261
- const u = res.totalUsage;
262
- const usageLine = `\n\n— ${u.turns} turns · in ${u.input} · out ${u.output} tokens · run ${state.runId}`;
263
- return textContent(`${header}\n\n${res.finalOutput}${usageLine}`, !res.ok);
264
- },
265
- taskflow_peek: async (args) => {
266
- const runId = String(args.runId ?? "");
267
- if (!runId)
268
- return textContent("taskflow_peek requires `runId`.", true);
269
- const res = peekRun(cwd, runId, {
270
- phaseId: typeof args.phaseId === "string" ? args.phaseId : undefined,
271
- json: args.json === true,
272
- item: typeof args.item === "number" ? args.item : undefined,
273
- limit: typeof args.limit === "number" ? args.limit : undefined,
274
- });
275
- return textContent(res.text, !res.ok);
276
- },
277
- taskflow_list: async () => {
278
- const flows = listFlows(cwd);
279
- if (flows.length === 0)
280
- return textContent("No saved taskflows found from this directory.");
281
- const lines = flows.map((f) => `- ${f.name} (${f.scope}) — ${f.def.phases.length} phase(s)`);
282
- return textContent(`Saved taskflows:\n${lines.join("\n")}`);
283
- },
284
- taskflow_show: async (args) => {
285
- const name = String(args.name ?? "");
286
- const saved = getFlow(cwd, name);
287
- if (!saved)
288
- return textContent(`No saved flow named "${name}".`, true);
289
- // No ```json``` fence: Codex shows text blocks as raw plaintext, so a fence
290
- // would render as literal backticks. The JSON is already monospaced there.
291
- return textContent(JSON.stringify(saved.def, null, 2));
292
- },
293
- taskflow_verify: async (args) => {
294
- const def = resolveFlow(cwd, args);
295
- const val = validateTaskflow(def);
296
- // verifyTaskflow iterates flow.phases and throws if it isn't an array
297
- // (e.g. a missing `phases`). Only skip it in that unsafe case; otherwise
298
- // run it so its static-quality warnings (e.g. terminal-not-final) still
299
- // surface alongside validateTaskflow's structural errors.
300
- const phasesIterable = Array.isArray(def.phases);
301
- const result = phasesIterable
302
- ? verifyTaskflow(def)
303
- : { ok: false, issues: [] };
304
- const { errorCount, warningCount, text } = issueBlocks(result.issues, val.errors, val.warnings);
305
- const passed = val.ok && result.ok && errorCount === 0;
306
- // Conclusion-first (the plaintext box is short + scrolls): verdict + counts
307
- // on line 1, deduped detail below.
308
- const head = passed
309
- ? warningCount
310
- ? `✓ verification PASSED — ${count(warningCount, "warning")}`
311
- : "✓ verification PASSED"
312
- : `✗ verification FAILED — ${count(errorCount, "error")}, ${count(warningCount, "warning")}`;
313
- return textContent(`${head}${text}`, !passed);
314
- },
315
- taskflow_compile: async (args) => {
316
- const def = resolveFlow(cwd, args);
317
- const val = validateTaskflow(def);
318
- // compileTaskflow / verifyTaskflow / renderFlowSvg all assume phases is an
319
- // array of objects that each have a string id (they iterate it and index
320
- // id.replace(...)). A hard-malformed def (non-array phases, a phase missing
321
- // its id) would throw, so when the shape isn't renderable we return the
322
- // structured validation errors as text instead of rendering.
323
- const phases = def.phases;
324
- const renderable = Array.isArray(phases) && phases.every((p) => p != null && typeof p.id === "string");
325
- if (!renderable) {
326
- const { errorCount, warningCount, text } = issueBlocks([], val.errors, val.warnings);
327
- const caption = `${def.name ?? "taskflow"} — ${count(errorCount, "error")} · ${count(warningCount, "warning")} · ✗ FAIL`;
328
- return textContent(`${caption}${text}`, true);
329
- }
330
- // Merge structural validation into the compile report. compileTaskflow's
331
- // own verification.ok is true even for a structurally-invalid (but
332
- // renderable) flow, so a validate-clean check is what stops a false ✓ PASS.
333
- // We still render the diagram + outline so such a flow can be inspected
334
- // visually; truncate coerces non-string fields so the renderer won't throw.
335
- const result = compileTaskflow(def);
336
- const v = result.verification;
337
- const { errorCount, warningCount, text } = issueBlocks(v.issues, val.errors, val.warnings);
338
- const passed = val.ok && v.ok && errorCount === 0;
339
- const status = passed ? "✓ PASS" : "✗ FAIL";
340
- const caption = `${def.name ?? "taskflow"} — ${count(def.phases?.length ?? 0, "phase")} · ${count(errorCount, "error")} · ${count(warningCount, "warning")} · ${status}`;
341
- // A text outline that stands on its own — the CLI/TUI can't render images
342
- // (it shows a bare `<image content>` placeholder), and a vision-less model
343
- // would otherwise see nothing. Includes the layered DAG + deduped issues.
344
- const outline = renderFlowOutline(def, v);
345
- const textReport = `${caption}\n\n${outline}${text}`;
346
- // Fold validation errors into the issue set the SVG colors by, so node
347
- // coloring matches the text report (a phase with only a validation error
348
- // still shows red). Validation messages start with `Phase '<id>':`.
349
- const mergedVerification = {
350
- ...v,
351
- ok: passed,
352
- issues: [
353
- ...v.issues,
354
- ...val.errors.map((message) => {
355
- const m = /^Phase '([^']+)'/.exec(message);
356
- return { phaseId: m?.[1], message, severity: "error", category: "ref-integrity" };
357
- }),
358
- ],
359
- };
360
- // Desktop app: the SVG image renders as a real diagram; the outline rides
361
- // along as its caption/fallback. Oversized graphs skip the image and rely
362
- // on the text report alone.
363
- const svg = renderFlowSvg(def, mergedVerification);
364
- if (svg)
365
- return imageContent(svgToBase64(svg), "image/svg+xml", [textReport], !passed);
366
- return textContent(textReport, !passed);
367
- },
368
- };
13
+ return coreMakeToolHandlers(cwd, codexSubagentRunner);
369
14
  }
370
- /** Build the full MCP method dispatch table (protocol + tools). */
15
+ /** Full MCP method dispatch table (protocol + tools), codex-bound. */
371
16
  export function makeMcpHandlers(cwd) {
372
- const tools = makeToolHandlers(cwd);
373
- let initialized = false;
374
- return {
375
- initialize: () => {
376
- initialized = true;
377
- return {
378
- protocolVersion: PROTOCOL_VERSION,
379
- capabilities: { tools: { listChanged: false } },
380
- serverInfo: SERVER_INFO,
381
- };
382
- },
383
- // Client tells us it's ready — notification, no response.
384
- "notifications/initialized": () => {
385
- initialized = true;
386
- },
387
- ping: () => ({}),
388
- "tools/list": () => ({ tools: TOOLS }),
389
- "tools/call": async (params) => {
390
- const p = (params ?? {});
391
- const tool = tools[p.name ?? ""];
392
- if (!tool)
393
- throw new RpcError(RPC.INVALID_PARAMS, `Unknown tool: ${p.name}`);
394
- void initialized; // tolerant: we don't hard-gate on initialize ordering
395
- return await tool(p.arguments ?? {});
396
- },
397
- };
17
+ return coreMakeMcpHandlers(cwd, codexSubagentRunner);
398
18
  }
399
19
  /** Start the stdio MCP server. Resolves when the client disconnects. */
400
20
  export function startMcpServer(cwd = process.cwd()) {
401
- return serveStdio(makeMcpHandlers(cwd));
21
+ return coreStartMcpServer(codexSubagentRunner, cwd);
402
22
  }
403
23
  //# sourceMappingURL=server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACN,eAAe,IAAI,mBAAmB,EACtC,gBAAgB,IAAI,oBAAoB,EACxC,cAAc,IAAI,kBAAkB,GACpC,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAErD,qEAAqE;AACrE,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC3C,OAAO,oBAAoB,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;AACvD,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,eAAe,CAAC,GAAW;IAC1C,OAAO,mBAAmB,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;AACtD,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,cAAc,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACzD,OAAO,kBAAkB,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;AACrD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codex-taskflow",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "description": "Run taskflow on OpenAI Codex: a Codex subagent runner plus an MCP server (and a plug-and-play Codex plugin) that exposes the taskflow_* tools to Codex users.",
5
5
  "keywords": [
6
6
  "codex",
@@ -26,22 +26,35 @@
26
26
  "engines": {
27
27
  "node": ">=22.19.0"
28
28
  },
29
- "main": "./dist/codex-runner.js",
30
- "types": "./dist/codex-runner.d.ts",
29
+ "main": "./dist/index.js",
30
+ "types": "./dist/index.d.ts",
31
+ "exports": {
32
+ ".": {
33
+ "development": "./src/index.ts",
34
+ "types": "./dist/index.d.ts",
35
+ "default": "./dist/index.js"
36
+ },
37
+ "./mcp/server": {
38
+ "development": "./src/mcp/server.ts",
39
+ "types": "./dist/mcp/server.d.ts",
40
+ "default": "./dist/mcp/server.js"
41
+ }
42
+ },
31
43
  "bin": {
32
44
  "codex-taskflow-mcp": "./dist/mcp/bin.js"
33
45
  },
34
46
  "files": [
35
47
  "dist"
36
48
  ],
37
- "scripts": {
38
- "build": "tsc -p tsconfig.build.json && node ../../scripts/copy-readme.mjs codex-taskflow",
39
- "prepublishOnly": "npm run build"
40
- },
41
49
  "publishConfig": {
42
50
  "access": "public"
43
51
  },
44
52
  "dependencies": {
45
- "taskflow-core": "0.1.5"
53
+ "taskflow-core": "0.1.6",
54
+ "taskflow-hosts": "0.1.6",
55
+ "taskflow-mcp-core": "0.1.6"
56
+ },
57
+ "scripts": {
58
+ "build": "rm -rf dist && tsc -p tsconfig.build.json && node ../../scripts/copy-readme.mjs codex-taskflow"
46
59
  }
47
- }
60
+ }
@@ -1,59 +0,0 @@
1
- /**
2
- * Codex subagent runner — the Codex host's `SubagentRunner` implementation.
3
- *
4
- * Spawns an isolated `codex exec --json` process per task and folds its JSONL
5
- * event stream into the same host-neutral `RunResult` the pi runner produces,
6
- * so the engine (runtime.ts) treats a Codex subagent identically to a pi one.
7
- *
8
- * Real codex JSONL schema (codex-cli ≥ 0.142), observed empirically:
9
- * {"type":"thread.started","thread_id":"…"}
10
- * {"type":"turn.started"}
11
- * {"type":"item.started", "item":{"id","type":"command_execution","command","status":"in_progress",…}}
12
- * {"type":"item.completed","item":{"id","type":"command_execution","command","exit_code","status":"completed",…}}
13
- * {"type":"item.completed","item":{"id","type":"agent_message","text":"…"}} ← final answer
14
- * {"type":"item.completed","item":{"id","type":"error","message":"…"}} ← warning OR fatal
15
- * {"type":"turn.completed","usage":{"input_tokens","cached_input_tokens","output_tokens","reasoning_output_tokens"}}
16
- *
17
- * Mapping to the pi contract:
18
- * - output = text of the LAST `agent_message` item
19
- * - usage.input = input_tokens; usage.output = output_tokens + reasoning_output_tokens;
20
- * usage.cacheRead = cached_input_tokens; turns = number of `turn.completed`
21
- * - lastActivity for streaming = latest agent_message text or a one-line
22
- * command summary
23
- * - benign warnings (the "Under-development features" / "Skill descriptions"
24
- * notices) are NOT treated as failures — only a fatal error item or a
25
- * non-zero exit is.
26
- *
27
- * Process handling (idle watchdog, abort, signal-kill detection, stderr cap,
28
- * error sanitization) mirrors the pi runner so behavior is uniform across hosts.
29
- */
30
- import { type AgentConfig, type LiveUpdate, type RunOptions, type RunResult, type SubagentRunner, type UsageStats } from "taskflow-core";
31
- /** Accumulated state folded from a codex JSONL event stream. */
32
- export interface CodexAccumulator {
33
- usage: UsageStats;
34
- model?: string;
35
- /** Final answer = text of the last agent_message item seen. */
36
- finalText: string;
37
- lastActivity: string;
38
- /** Set when a fatal (non-benign) error item is seen. */
39
- fatalError?: string;
40
- }
41
- export declare function newCodexAccumulator(model?: string): CodexAccumulator;
42
- /**
43
- * Fold one codex JSONL line into the accumulator. Returns a LiveUpdate when the
44
- * stream produced new activity (for streaming), else null. Empty/malformed
45
- * lines are ignored — robust to partial buffers and noise, unit-testable
46
- * without spawning a process.
47
- */
48
- export declare function foldCodexEventLine(acc: CodexAccumulator, line: string): LiveUpdate | null;
49
- /**
50
- * Run a single subagent task via `codex exec --json`. Resolves the agent from
51
- * `agents` by name; returns the same structured `RunResult` the pi runner does.
52
- */
53
- export declare function runCodexAgentTask(defaultCwd: string, agents: AgentConfig[], agentName: string, task: string, opts: RunOptions, globalThinking?: string): Promise<RunResult>;
54
- /**
55
- * The Codex host's `SubagentRunner`. Drops into `RuntimeDeps.runTask` exactly
56
- * like `piSubagentRunner`, so the engine runs unchanged on Codex.
57
- */
58
- export declare const codexSubagentRunner: SubagentRunner<AgentConfig>;
59
- //# sourceMappingURL=codex-runner.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"codex-runner.d.ts","sourceRoot":"","sources":["../src/codex-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,EAKN,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,MAAM,eAAe,CAAC;AAwBvB,gEAAgE;AAChE,MAAM,WAAW,gBAAgB;IAChC,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+DAA+D;IAC/D,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,mBAAmB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAEpE;AAOD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CA+CzF;AAqBD;;;GAGG;AACH,wBAAsB,iBAAiB,CACtC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,WAAW,EAAE,EACrB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,UAAU,EAChB,cAAc,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,SAAS,CAAC,CAuLpB;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE,cAAc,CAAC,WAAW,CAE3D,CAAC"}