taskflow-mcp-core 0.1.8 → 0.2.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.
@@ -30,7 +30,12 @@ export declare const RPC: {
30
30
  readonly METHOD_NOT_FOUND: -32601;
31
31
  readonly INVALID_PARAMS: -32602;
32
32
  readonly INTERNAL_ERROR: -32603;
33
+ readonly REQUEST_CANCELLED: -32800;
33
34
  };
35
+ /** Maximum time stdio shutdown waits for request wrappers after aborting them.
36
+ * Non-cooperative user handlers are detached (their eventual rejection is
37
+ * observed) so a broken handler can never hold the MCP process open forever. */
38
+ export declare const TRANSPORT_SHUTDOWN_GRACE_MS = 100;
34
39
  /** Thrown by a handler to return a structured JSON-RPC error to the client. */
35
40
  export declare class RpcError extends Error {
36
41
  code: number;
@@ -42,7 +47,13 @@ export declare class RpcError extends Error {
42
47
  * a structured failure. Returning `undefined` for a request (has id) sends
43
48
  * `result: null`; for a notification it is ignored.
44
49
  */
45
- export type RpcHandler = (params: unknown) => Promise<unknown> | unknown;
50
+ export interface RpcContext {
51
+ /** JSON-RPC request id. Notifications use null. */
52
+ requestId: string | number | null;
53
+ /** Aborted by MCP `notifications/cancelled` or transport disconnect. */
54
+ signal: AbortSignal;
55
+ }
56
+ export type RpcHandler = (params: unknown, context: RpcContext) => Promise<unknown> | unknown;
46
57
  /**
47
58
  * Run a JSON-RPC stdio loop over the given streams (defaults to process
48
59
  * stdin/stdout). Resolves when the input stream ends (client disconnect).
@@ -1 +1 @@
1
- {"version":3,"file":"jsonrpc.d.ts","sourceRoot":"","sources":["../../src/mcp/jsonrpc.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,cAAc;IAC9B,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CACf;AAED,kDAAkD;AAClD,eAAO,MAAM,GAAG;aACf,WAAW,EAAE,CAAC,KAAK;aACnB,eAAe,EAAE,CAAC,KAAK;aACvB,gBAAgB,EAAE,CAAC,KAAK;aACxB,cAAc,EAAE,CAAC,KAAK;aACtB,cAAc,EAAE,CAAC,KAAK;CACb,CAAC;AAEX,+EAA+E;AAC/E,qBAAa,QAAS,SAAQ,KAAK;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAKxD;CACD;AAED;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;AAEzE;;;GAGG;AACH,wBAAgB,UAAU,CACzB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,EACpC,EAAE,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAA;CAAO,GACxE,OAAO,CAAC,IAAI,CAAC,CA+Ef"}
1
+ {"version":3,"file":"jsonrpc.d.ts","sourceRoot":"","sources":["../../src/mcp/jsonrpc.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,cAAc;IAC9B,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CACf;AAED,kDAAkD;AAClD,eAAO,MAAM,GAAG;aACf,WAAW,EAAE,CAAC,KAAK;aACnB,eAAe,EAAE,CAAC,KAAK;aACvB,gBAAgB,EAAE,CAAC,KAAK;aACxB,cAAc,EAAE,CAAC,KAAK;aACtB,cAAc,EAAE,CAAC,KAAK;aACtB,iBAAiB,EAAE,CAAC,KAAK;CAChB,CAAC;AAEX;;gFAEgF;AAChF,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAE/C,+EAA+E;AAC/E,qBAAa,QAAS,SAAQ,KAAK;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAKxD;CACD;AAED;;;;GAIG;AACH,MAAM,WAAW,UAAU;IAC1B,mDAAmD;IACnD,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAClC,wEAAwE;IACxE,MAAM,EAAE,WAAW,CAAC;CACpB;AAED,MAAM,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;AAE9F;;;GAGG;AACH,wBAAgB,UAAU,CACzB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,EACpC,EAAE,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAA;CAAO,GACxE,OAAO,CAAC,IAAI,CAAC,CAiMf"}
@@ -19,7 +19,12 @@ export const RPC = {
19
19
  METHOD_NOT_FOUND: -32601,
20
20
  INVALID_PARAMS: -32602,
21
21
  INTERNAL_ERROR: -32603,
22
+ REQUEST_CANCELLED: -32800,
22
23
  };
24
+ /** Maximum time stdio shutdown waits for request wrappers after aborting them.
25
+ * Non-cooperative user handlers are detached (their eventual rejection is
26
+ * observed) so a broken handler can never hold the MCP process open forever. */
27
+ export const TRANSPORT_SHUTDOWN_GRACE_MS = 100;
23
28
  /** Thrown by a handler to return a structured JSON-RPC error to the client. */
24
29
  export class RpcError extends Error {
25
30
  code;
@@ -38,8 +43,24 @@ export class RpcError extends Error {
38
43
  export function serveStdio(handlers, io = {}) {
39
44
  const input = io.input ?? process.stdin;
40
45
  const output = io.output ?? process.stdout;
46
+ const activeRequests = new Map();
47
+ const activeControllers = new Set();
48
+ const pending = new Set();
49
+ const requestKey = (id) => `${typeof id}:${String(id)}`;
50
+ let transportClosed = false;
51
+ let requestTransportTeardown;
41
52
  const write = (obj) => {
42
- output.write(JSON.stringify(obj) + "\n");
53
+ if (transportClosed)
54
+ return;
55
+ try {
56
+ output.write(JSON.stringify(obj) + "\n");
57
+ }
58
+ catch {
59
+ // Some Writable implementations throw synchronously instead of reporting
60
+ // failures through their callback. Route both forms through the same
61
+ // teardown so active work is aborted and shutdown remains bounded.
62
+ requestTransportTeardown?.();
63
+ }
43
64
  };
44
65
  const respondOk = (id, result) => {
45
66
  write({ jsonrpc: "2.0", id, result: result === undefined ? null : result });
@@ -67,6 +88,17 @@ export function serveStdio(handlers, io = {}) {
67
88
  respondErr(id, { code: RPC.INVALID_REQUEST, message: "Invalid Request" });
68
89
  return;
69
90
  }
91
+ // MCP cancellation is a notification aimed at an in-flight request. Handle
92
+ // it in the transport so every method automatically receives the same
93
+ // AbortSignal and hosts do not need bespoke cancellation handlers.
94
+ if (msg.method === "notifications/cancelled") {
95
+ const params = msg.params;
96
+ const cancelledId = params?.requestId;
97
+ if (typeof cancelledId === "string" || typeof cancelledId === "number") {
98
+ activeRequests.get(requestKey(cancelledId))?.abort();
99
+ }
100
+ return;
101
+ }
70
102
  const handler = handlers[msg.method];
71
103
  if (!handler) {
72
104
  // Unknown notifications are silently ignored (e.g. notifications/*).
@@ -74,15 +106,57 @@ export function serveStdio(handlers, io = {}) {
74
106
  respondErr(id, { code: RPC.METHOD_NOT_FOUND, message: `Method not found: ${msg.method}` });
75
107
  return;
76
108
  }
109
+ const key = !isNotification && id !== null ? requestKey(id) : undefined;
110
+ if (key) {
111
+ const duplicate = activeRequests.get(key);
112
+ if (duplicate) {
113
+ // JSON-RPC ids identify one in-flight request. Never overwrite the
114
+ // original controller: abort the ambiguous first request and ignore the
115
+ // duplicate, yielding one deterministic cancellation response.
116
+ duplicate.abort();
117
+ return;
118
+ }
119
+ }
120
+ const controller = new AbortController();
121
+ activeControllers.add(controller);
122
+ if (key)
123
+ activeRequests.set(key, controller);
124
+ const ABORTED = Symbol("aborted");
125
+ let abortListener;
126
+ const aborted = new Promise((resolve) => {
127
+ abortListener = () => resolve(ABORTED);
128
+ if (controller.signal.aborted)
129
+ resolve(ABORTED);
130
+ else
131
+ controller.signal.addEventListener("abort", abortListener, { once: true });
132
+ });
133
+ // Invoke immediately so synchronous protocol handlers can complete before a
134
+ // following stdin EOF, but normalize throws and async results into one promise.
135
+ let handlerPromise;
77
136
  try {
78
- const result = await handler(msg.params);
79
- if (!isNotification)
80
- respondOk(id, result);
137
+ handlerPromise = Promise.resolve(handler(msg.params, { requestId: id, signal: controller.signal }));
138
+ }
139
+ catch (error) {
140
+ handlerPromise = Promise.reject(error);
141
+ }
142
+ // Promise.race installs a rejection observer on handlerPromise. If abort wins,
143
+ // a later handler rejection is consumed and can never become unhandled.
144
+ try {
145
+ const result = await Promise.race([handlerPromise, aborted]);
146
+ if (!isNotification) {
147
+ if (result === ABORTED || controller.signal.aborted)
148
+ respondErr(id, { code: RPC.REQUEST_CANCELLED, message: "Request cancelled" });
149
+ else
150
+ respondOk(id, result);
151
+ }
81
152
  }
82
153
  catch (e) {
83
154
  if (isNotification)
84
155
  return; // can't report errors for notifications
85
- if (e instanceof RpcError) {
156
+ if (controller.signal.aborted) {
157
+ respondErr(id, { code: RPC.REQUEST_CANCELLED, message: "Request cancelled" });
158
+ }
159
+ else if (e instanceof RpcError) {
86
160
  respondErr(id, { code: e.code, message: e.message, data: e.data });
87
161
  }
88
162
  else {
@@ -90,29 +164,84 @@ export function serveStdio(handlers, io = {}) {
90
164
  respondErr(id, { code: RPC.INTERNAL_ERROR, message });
91
165
  }
92
166
  }
167
+ finally {
168
+ if (abortListener)
169
+ controller.signal.removeEventListener("abort", abortListener);
170
+ activeControllers.delete(controller);
171
+ if (key && activeRequests.get(key) === controller)
172
+ activeRequests.delete(key);
173
+ }
93
174
  };
94
175
  return new Promise((resolve) => {
95
176
  let buffer = "";
96
- // Serialize line handling so responses are emitted in request order even
97
- // when handlers are async (MCP clients tolerate interleaving, but ordered
98
- // output is simpler to reason about and test).
99
- let chain = Promise.resolve();
100
- input.on("data", (data) => {
177
+ let finishPromise;
178
+ let resolved = false;
179
+ const track = (promise) => {
180
+ pending.add(promise);
181
+ void promise.then(() => pending.delete(promise), () => pending.delete(promise));
182
+ };
183
+ const removeTransportListeners = () => {
184
+ input.removeListener("data", onData);
185
+ input.removeListener("end", onEnd);
186
+ input.removeListener("close", onClose);
187
+ input.removeListener("error", onInputError);
188
+ output.removeListener("error", onOutputError);
189
+ requestTransportTeardown = undefined;
190
+ };
191
+ const finish = () => {
192
+ transportClosed = true;
193
+ for (const controller of activeControllers)
194
+ controller.abort();
195
+ if (!finishPromise) {
196
+ finishPromise = new Promise((done) => {
197
+ let completed = false;
198
+ const settle = () => {
199
+ if (completed)
200
+ return;
201
+ completed = true;
202
+ clearTimeout(timer);
203
+ done();
204
+ };
205
+ const timer = setTimeout(settle, TRANSPORT_SHUTDOWN_GRACE_MS);
206
+ void Promise.allSettled([...pending]).then(settle);
207
+ }).then(() => {
208
+ removeTransportListeners();
209
+ if (!resolved) {
210
+ resolved = true;
211
+ resolve();
212
+ }
213
+ });
214
+ }
215
+ return finishPromise;
216
+ };
217
+ const teardown = () => void finish();
218
+ const onData = (data) => {
219
+ if (transportClosed)
220
+ return;
101
221
  buffer += data.toString();
102
222
  let i;
103
223
  while ((i = buffer.indexOf("\n")) >= 0) {
104
224
  const line = buffer.slice(0, i);
105
225
  buffer = buffer.slice(i + 1);
106
- chain = chain.then(() => handleLine(line));
226
+ track(handleLine(line));
107
227
  }
108
- });
109
- input.on("end", () => {
110
- chain = chain.then(() => {
111
- if (buffer.trim())
112
- return handleLine(buffer);
113
- }).then(() => resolve());
114
- });
115
- input.on("close", () => resolve());
228
+ };
229
+ const onEnd = () => {
230
+ if (transportClosed)
231
+ return;
232
+ if (buffer.trim())
233
+ track(handleLine(buffer));
234
+ teardown();
235
+ };
236
+ const onClose = teardown;
237
+ const onInputError = teardown;
238
+ const onOutputError = teardown;
239
+ requestTransportTeardown = teardown;
240
+ input.on("data", onData);
241
+ input.on("end", onEnd);
242
+ input.on("close", onClose);
243
+ input.on("error", onInputError);
244
+ output.on("error", onOutputError);
116
245
  });
117
246
  }
118
247
  //# sourceMappingURL=jsonrpc.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"jsonrpc.js","sourceRoot":"","sources":["../../src/mcp/jsonrpc.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"jsonrpc.js","sourceRoot":"","sources":["../../src/mcp/jsonrpc.ts"],"names":[],"mappings":"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"}
@@ -21,16 +21,23 @@
21
21
  * - taskflow_verify : statically verify a flow (no execution)
22
22
  * - taskflow_compile : render a flow as a DAG diagram (SVG image) + status line
23
23
  * - taskflow_peek : inspect a stored run's intermediate phase output
24
+ * - taskflow_trace : read a run's append-only event trace
25
+ * - taskflow_replay : re-evaluate a recorded trace under alternate knobs (zero tokens)
26
+ * - taskflow_why_stale / taskflow_recompute / taskflow_reconcile_workspace
27
+ * - taskflow_save / taskflow_search
24
28
  */
25
- import { type RpcHandler } from "./jsonrpc.ts";
29
+ import { type RpcContext, type RpcHandler } from "./jsonrpc.ts";
30
+ import { saveRun, type RunState, type TraceEvent } from "taskflow-core";
26
31
  import type { SubagentRunner, AgentConfig } from "taskflow-core";
32
+ export declare function formatTraceJsonMcp(events: TraceEvent[], requested?: unknown): string;
33
+ export declare function persistTerminalRun(state: RunState, cleanupConfig: Parameters<typeof saveRun>[1], write?: typeof saveRun): string | undefined;
27
34
  /**
28
35
  * Build the per-call tool handlers. `cwd` is the directory the server was
29
36
  * launched in (where saved flows + agents are discovered, and where subagents
30
37
  * run). `runner` is the host's SubagentRunner (codex/claude) — each phase's
31
38
  * subagent executes through it.
32
39
  */
33
- export declare function makeToolHandlers(cwd: string, runner: SubagentRunner<AgentConfig>): Record<string, (args: Record<string, unknown>) => Promise<unknown>>;
40
+ export declare function makeToolHandlers(cwd: string, runner: SubagentRunner<AgentConfig>): Record<string, (args: Record<string, unknown>, context?: RpcContext) => Promise<unknown>>;
34
41
  /** Build the full MCP method dispatch table (protocol + tools). */
35
42
  export declare function makeMcpHandlers(cwd: string, runner: SubagentRunner<AgentConfig>): Record<string, RpcHandler>;
36
43
  /** Start the stdio MCP server. Resolves when the client disconnects. */
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAA6B,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAiC1E,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AA8WjE;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC/B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,cAAc,CAAC,WAAW,CAAC,GACjC,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CAsRrE;AAED,mEAAmE;AACnE,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CA2B5G;AAED,wEAAwE;AACxE,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,CAAC,WAAW,CAAC,EAAE,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9G"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EAA6B,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAM3F,OAAO,EAON,OAAO,EAsBP,KAAK,QAAQ,EAGb,KAAK,UAAU,EAQf,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAkNjE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,CAQpF;AAoXD,wBAAgB,kBAAkB,CACjC,KAAK,EAAE,QAAQ,EACf,aAAa,EAAE,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,EAC5C,KAAK,GAAE,OAAO,OAAiB,GAC7B,MAAM,GAAG,SAAS,CAOpB;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC/B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,cAAc,CAAC,WAAW,CAAC,GACjC,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,UAAU,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CA2V3F;AAED,mEAAmE;AACnE,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CA8B5G;AAED,wEAAwE;AACxE,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,CAAC,WAAW,CAAC,EAAE,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9G"}