taskflow-mcp-core 0.3.0-beta.1.1 → 1.0.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.
Files changed (185) hide show
  1. package/CONTROL_GUIDE.md +113 -0
  2. package/README.md +34 -25
  3. package/dist/control/admission-service.d.ts +15 -0
  4. package/dist/control/admission-service.d.ts.map +1 -0
  5. package/dist/control/admission-service.js +64 -0
  6. package/dist/control/admission-service.js.map +1 -0
  7. package/dist/control/approval-edits.d.ts +12 -0
  8. package/dist/control/approval-edits.d.ts.map +1 -0
  9. package/dist/control/approval-edits.js +66 -0
  10. package/dist/control/approval-edits.js.map +1 -0
  11. package/dist/control/approval-service.d.ts +173 -0
  12. package/dist/control/approval-service.d.ts.map +1 -0
  13. package/dist/control/approval-service.js +342 -0
  14. package/dist/control/approval-service.js.map +1 -0
  15. package/dist/control/authorization.d.ts +94 -0
  16. package/dist/control/authorization.d.ts.map +1 -0
  17. package/dist/control/authorization.js +302 -0
  18. package/dist/control/authorization.js.map +1 -0
  19. package/dist/control/control-cli.d.ts +3 -0
  20. package/dist/control/control-cli.d.ts.map +1 -0
  21. package/dist/control/control-cli.js +279 -0
  22. package/dist/control/control-cli.js.map +1 -0
  23. package/dist/control/control-console.d.ts +17 -0
  24. package/dist/control/control-console.d.ts.map +1 -0
  25. package/dist/control/control-console.js +67 -0
  26. package/dist/control/control-console.js.map +1 -0
  27. package/dist/control/control-host.d.ts +98 -0
  28. package/dist/control/control-host.d.ts.map +1 -0
  29. package/dist/control/control-host.js +459 -0
  30. package/dist/control/control-host.js.map +1 -0
  31. package/dist/control/control-mcp.d.ts +11 -0
  32. package/dist/control/control-mcp.d.ts.map +1 -0
  33. package/dist/control/control-mcp.js +78 -0
  34. package/dist/control/control-mcp.js.map +1 -0
  35. package/dist/control/errors.d.ts +44 -0
  36. package/dist/control/errors.d.ts.map +1 -0
  37. package/dist/control/errors.js +93 -0
  38. package/dist/control/errors.js.map +1 -0
  39. package/dist/control/hello.d.ts +39 -0
  40. package/dist/control/hello.d.ts.map +1 -0
  41. package/dist/control/hello.js +80 -0
  42. package/dist/control/hello.js.map +1 -0
  43. package/dist/control/host-runtime.d.ts +32 -0
  44. package/dist/control/host-runtime.d.ts.map +1 -0
  45. package/dist/control/host-runtime.js +542 -0
  46. package/dist/control/host-runtime.js.map +1 -0
  47. package/dist/control/index.d.ts +32 -0
  48. package/dist/control/index.d.ts.map +1 -0
  49. package/dist/control/index.js +32 -0
  50. package/dist/control/index.js.map +1 -0
  51. package/dist/control/legacy-conflict.d.ts +19 -0
  52. package/dist/control/legacy-conflict.d.ts.map +1 -0
  53. package/dist/control/legacy-conflict.js +176 -0
  54. package/dist/control/legacy-conflict.js.map +1 -0
  55. package/dist/control/local-bootstrap.d.ts +21 -0
  56. package/dist/control/local-bootstrap.d.ts.map +1 -0
  57. package/dist/control/local-bootstrap.js +224 -0
  58. package/dist/control/local-bootstrap.js.map +1 -0
  59. package/dist/control/modes.d.ts +60 -0
  60. package/dist/control/modes.d.ts.map +1 -0
  61. package/dist/control/modes.js +86 -0
  62. package/dist/control/modes.js.map +1 -0
  63. package/dist/control/project-admin-cli.d.ts +3 -0
  64. package/dist/control/project-admin-cli.d.ts.map +1 -0
  65. package/dist/control/project-admin-cli.js +155 -0
  66. package/dist/control/project-admin-cli.js.map +1 -0
  67. package/dist/control/project-registry.d.ts +20 -0
  68. package/dist/control/project-registry.d.ts.map +1 -0
  69. package/dist/control/project-registry.js +181 -0
  70. package/dist/control/project-registry.js.map +1 -0
  71. package/dist/control/runtime-checkpoint.d.ts +11 -0
  72. package/dist/control/runtime-checkpoint.d.ts.map +1 -0
  73. package/dist/control/runtime-checkpoint.js +39 -0
  74. package/dist/control/runtime-checkpoint.js.map +1 -0
  75. package/dist/control/runtime-provider.d.ts +100 -0
  76. package/dist/control/runtime-provider.d.ts.map +1 -0
  77. package/dist/control/runtime-provider.js +258 -0
  78. package/dist/control/runtime-provider.js.map +1 -0
  79. package/dist/control/schema/approval.d.ts +108 -0
  80. package/dist/control/schema/approval.d.ts.map +1 -0
  81. package/dist/control/schema/approval.js +65 -0
  82. package/dist/control/schema/approval.js.map +1 -0
  83. package/dist/control/schema/commands.d.ts +663 -0
  84. package/dist/control/schema/commands.d.ts.map +1 -0
  85. package/dist/control/schema/commands.js +147 -0
  86. package/dist/control/schema/commands.js.map +1 -0
  87. package/dist/control/schema/common.d.ts +24 -0
  88. package/dist/control/schema/common.d.ts.map +1 -0
  89. package/dist/control/schema/common.js +38 -0
  90. package/dist/control/schema/common.js.map +1 -0
  91. package/dist/control/schema/coordinator.d.ts +98 -0
  92. package/dist/control/schema/coordinator.d.ts.map +1 -0
  93. package/dist/control/schema/coordinator.js +87 -0
  94. package/dist/control/schema/coordinator.js.map +1 -0
  95. package/dist/control/schema/evidence.d.ts +140 -0
  96. package/dist/control/schema/evidence.d.ts.map +1 -0
  97. package/dist/control/schema/evidence.js +64 -0
  98. package/dist/control/schema/evidence.js.map +1 -0
  99. package/dist/control/schema/header.d.ts +79 -0
  100. package/dist/control/schema/header.d.ts.map +1 -0
  101. package/dist/control/schema/header.js +66 -0
  102. package/dist/control/schema/header.js.map +1 -0
  103. package/dist/control/schema/index.d.ts +31 -0
  104. package/dist/control/schema/index.d.ts.map +1 -0
  105. package/dist/control/schema/index.js +31 -0
  106. package/dist/control/schema/index.js.map +1 -0
  107. package/dist/control/schema/plan.d.ts +291 -0
  108. package/dist/control/schema/plan.d.ts.map +1 -0
  109. package/dist/control/schema/plan.js +80 -0
  110. package/dist/control/schema/plan.js.map +1 -0
  111. package/dist/control/schema/policy.d.ts +96 -0
  112. package/dist/control/schema/policy.d.ts.map +1 -0
  113. package/dist/control/schema/policy.js +73 -0
  114. package/dist/control/schema/policy.js.map +1 -0
  115. package/dist/control/schema/run.d.ts +61 -0
  116. package/dist/control/schema/run.d.ts.map +1 -0
  117. package/dist/control/schema/run.js +56 -0
  118. package/dist/control/schema/run.js.map +1 -0
  119. package/dist/control/schema/te-mirrors.d.ts +145 -0
  120. package/dist/control/schema/te-mirrors.d.ts.map +1 -0
  121. package/dist/control/schema/te-mirrors.js +145 -0
  122. package/dist/control/schema/te-mirrors.js.map +1 -0
  123. package/dist/control/schema/transport.d.ts +479 -0
  124. package/dist/control/schema/transport.d.ts.map +1 -0
  125. package/dist/control/schema/transport.js +181 -0
  126. package/dist/control/schema/transport.js.map +1 -0
  127. package/dist/control/singleton.d.ts +135 -0
  128. package/dist/control/singleton.d.ts.map +1 -0
  129. package/dist/control/singleton.js +607 -0
  130. package/dist/control/singleton.js.map +1 -0
  131. package/dist/control/store/coordinator-store.d.ts +143 -0
  132. package/dist/control/store/coordinator-store.d.ts.map +1 -0
  133. package/dist/control/store/coordinator-store.js +620 -0
  134. package/dist/control/store/coordinator-store.js.map +1 -0
  135. package/dist/control/store/evidence-adapter.d.ts +10 -0
  136. package/dist/control/store/evidence-adapter.d.ts.map +1 -0
  137. package/dist/control/store/evidence-adapter.js +114 -0
  138. package/dist/control/store/evidence-adapter.js.map +1 -0
  139. package/dist/control/store/evidence-explanation.d.ts +55 -0
  140. package/dist/control/store/evidence-explanation.d.ts.map +1 -0
  141. package/dist/control/store/evidence-explanation.js +50 -0
  142. package/dist/control/store/evidence-explanation.js.map +1 -0
  143. package/dist/control/store/evidence-store.d.ts +143 -0
  144. package/dist/control/store/evidence-store.d.ts.map +1 -0
  145. package/dist/control/store/evidence-store.js +437 -0
  146. package/dist/control/store/evidence-store.js.map +1 -0
  147. package/dist/control/store/index.d.ts +3 -0
  148. package/dist/control/store/index.d.ts.map +1 -0
  149. package/dist/control/store/index.js +2 -0
  150. package/dist/control/store/index.js.map +1 -0
  151. package/dist/control/store/journal.d.ts +270 -0
  152. package/dist/control/store/journal.d.ts.map +1 -0
  153. package/dist/control/store/journal.js +50 -0
  154. package/dist/control/store/journal.js.map +1 -0
  155. package/dist/control/store/project-lifecycle.d.ts +49 -0
  156. package/dist/control/store/project-lifecycle.d.ts.map +1 -0
  157. package/dist/control/store/project-lifecycle.js +288 -0
  158. package/dist/control/store/project-lifecycle.js.map +1 -0
  159. package/dist/control/store/store.d.ts +93 -0
  160. package/dist/control/store/store.d.ts.map +1 -0
  161. package/dist/control/store/store.js +873 -0
  162. package/dist/control/store/store.js.map +1 -0
  163. package/dist/control/te-provider.d.ts +86 -0
  164. package/dist/control/te-provider.d.ts.map +1 -0
  165. package/dist/control/te-provider.js +131 -0
  166. package/dist/control/te-provider.js.map +1 -0
  167. package/dist/control/uds.d.ts +114 -0
  168. package/dist/control/uds.d.ts.map +1 -0
  169. package/dist/control/uds.js +456 -0
  170. package/dist/control/uds.js.map +1 -0
  171. package/dist/control/web-console/view.d.ts +5 -0
  172. package/dist/control/web-console/view.d.ts.map +1 -0
  173. package/dist/control/web-console/view.js +122 -0
  174. package/dist/control/web-console/view.js.map +1 -0
  175. package/dist/control/web-console.d.ts +50 -0
  176. package/dist/control/web-console.d.ts.map +1 -0
  177. package/dist/control/web-console.js +317 -0
  178. package/dist/control/web-console.js.map +1 -0
  179. package/dist/mcp/jsonrpc.d.ts.map +1 -1
  180. package/dist/mcp/jsonrpc.js +12 -3
  181. package/dist/mcp/jsonrpc.js.map +1 -1
  182. package/dist/mcp/server.d.ts.map +1 -1
  183. package/dist/mcp/server.js +26 -17
  184. package/dist/mcp/server.js.map +1 -1
  185. package/package.json +13 -5
@@ -0,0 +1,459 @@
1
+ /**
2
+ * ControlHost — one control semantic in every mode (D18).
3
+ *
4
+ * Modes (P13 / RFC §5):
5
+ * - auto (default): ensure registry + project store; start or attach the user
6
+ * singleton multi-mount control (taskflowd OR embedded supervisor competing
7
+ * for the SAME lock + endpoint — D32). Control cannot run ⇒ fail closed.
8
+ * - coordinated: external control required; attach-only, down ⇒ fail closed.
9
+ * - standalone: explicit; in-process ControlHost, single-owner lease, no
10
+ * global concurrency claims.
11
+ *
12
+ * The host also enforces hello-before-RPC (P4) and fencing epoch checks
13
+ * (P16) on every dispatch, and accepts only a TE-backed ExecutionProvider as
14
+ * its execution authority (RFC §16 / P8).
15
+ */
16
+ import * as fs from "node:fs";
17
+ import * as path from "node:path";
18
+ import { ProjectRegistry } from "./project-registry.js";
19
+ import { HostRuntime } from "./host-runtime.js";
20
+ import { RuntimeTeExecutionProvider } from "./runtime-provider.js";
21
+ import { getBuildInfo } from "taskflow-core";
22
+ import { ControlError, bootstrapFailed } from "./errors.js";
23
+ import { createHelloGate, helloRequiredError } from "./hello.js";
24
+ import { resolveControlMode } from "./modes.js";
25
+ import { acquireUserSingleton, recoverStaleEndpoint, renewCoordinatorLease, singletonPaths, } from "./singleton.js";
26
+ import { connectUdsClient, startUdsServer } from "./uds.js";
27
+ import { openControlStore } from "./store/index.js";
28
+ import { CONTROL_WIRE_SCHEMA_VERSION, PROTOCOL_MAJOR } from "./schema/index.js";
29
+ function defaultServerHello() {
30
+ const info = getBuildInfo();
31
+ return {
32
+ protocolMajor: PROTOCOL_MAJOR,
33
+ supportedReadSchemas: ["taskflow.wire.v1"],
34
+ supportedWriteSchemas: ["taskflow.wire.v1"],
35
+ requiredFeatures: [],
36
+ offeredFeatures: ["durable-approval"],
37
+ buildInfo: {
38
+ packageVersion: info.packageVersion,
39
+ gitCommit: info.gitCommit,
40
+ schemaVersion: CONTROL_WIRE_SCHEMA_VERSION,
41
+ ...(info.buildTime !== undefined ? { buildTime: info.buildTime } : {}),
42
+ },
43
+ };
44
+ }
45
+ export class ControlHost {
46
+ mode;
47
+ provider;
48
+ paths;
49
+ now;
50
+ #helloGate;
51
+ #options;
52
+ #state = "stopped";
53
+ #singleton = "none";
54
+ #fencingEpoch = 0;
55
+ #holderId;
56
+ #releaseSingleton;
57
+ #udsServer;
58
+ #udsClient;
59
+ #leaseTimer;
60
+ #store;
61
+ #standalonePaths;
62
+ #runtime;
63
+ #registry;
64
+ #ownsRegistry = false;
65
+ #ready;
66
+ #signalReady;
67
+ #starting;
68
+ #contextFeatures = new WeakMap();
69
+ #connections = new WeakMap();
70
+ constructor(options) {
71
+ this.#ready = new Promise(resolve => { this.#signalReady = resolve; });
72
+ if (!options.provider || options.provider.kind !== "te-resources") {
73
+ throw new ControlError("TF_AUTHORITY_REVOKED", "ControlHost requires a TE-backed execution authority (kind te-resources); no other provider is legal in 0.3-C", { recoveryAction: "none", sideEffects: "none" });
74
+ }
75
+ this.mode = resolveControlMode(options.mode);
76
+ this.provider = options.provider;
77
+ this.paths = options.singletonPaths ?? singletonPaths(options.controlHome);
78
+ this.now = options.now ?? Date.now;
79
+ this.#options = options;
80
+ this.#helloGate = createHelloGate(options.serverHello ?? defaultServerHello(), {
81
+ requiredFeatures: options.requiredFeatures,
82
+ });
83
+ }
84
+ get state() {
85
+ return this.#state;
86
+ }
87
+ get status() {
88
+ return {
89
+ mode: this.mode,
90
+ state: this.#state,
91
+ singleton: this.#singleton,
92
+ fencingEpoch: this.#fencingEpoch,
93
+ holderId: this.#holderId,
94
+ endpoint: this.#singleton === "won" || this.#singleton === "attached" ? this.paths.endpointPath : undefined,
95
+ globalAuthority: this.mode !== "standalone",
96
+ };
97
+ }
98
+ get greeted() {
99
+ return this.#helloGate.greeted;
100
+ }
101
+ hello(clientHello) {
102
+ return this.#helloGate.hello(clientHello);
103
+ }
104
+ async start() {
105
+ if (this.#state === "started")
106
+ return this.status;
107
+ if (this.#starting)
108
+ return this.#starting;
109
+ const starting = this.#startOnce();
110
+ this.#starting = starting;
111
+ try {
112
+ return await starting;
113
+ }
114
+ finally {
115
+ this.#starting = undefined;
116
+ }
117
+ }
118
+ async #startOnce() {
119
+ this.#ready = new Promise(resolve => { this.#signalReady = resolve; });
120
+ try {
121
+ switch (this.mode) {
122
+ case "standalone": {
123
+ // Explicit standalone: single-owner lease, no singleton
124
+ // competition, no global concurrency claims (P13).
125
+ this.#acquireStandaloneLease();
126
+ this.#state = "started";
127
+ this.#singleton = "standalone";
128
+ this.#startLeaseTimer();
129
+ break;
130
+ }
131
+ case "auto":
132
+ case "coordinated": {
133
+ recoverStaleEndpoint(this.paths, { inspectProcess: this.#options.inspectProcess });
134
+ const result = this.#options.singletonOverride
135
+ ? this.#options.singletonOverride()
136
+ : acquireUserSingleton({
137
+ paths: this.paths,
138
+ holderId: this.#options.holderId,
139
+ processIdentity: this.#options.processIdentity,
140
+ inspectProcess: this.#options.inspectProcess,
141
+ now: this.#options.now,
142
+ leaseTtlMs: this.#options.leaseTtlMs,
143
+ attachOnly: this.mode === "coordinated",
144
+ });
145
+ if (result.status === "won") {
146
+ this.#singleton = "won";
147
+ this.#holderId = result.holderId;
148
+ this.#fencingEpoch = result.fencingEpoch;
149
+ this.#releaseSingleton = result.release;
150
+ // S2: the winner listens on the user singleton endpoint so
151
+ // losers attach over a real Unix socket (D32 — lock-layer
152
+ // labels are NOT attach).
153
+ try {
154
+ this.#udsServer = await startUdsServer({
155
+ endpointPath: this.paths.endpointPath,
156
+ serverHello: this.#helloGate.serverHello,
157
+ requiredFeatures: this.#options.requiredFeatures,
158
+ getFencingEpoch: () => this.#fencingEpoch,
159
+ handleRpc: async (method, params, fencingEpoch, connection) => { await this.#ready; return this.#dispatchWire(method, params, fencingEpoch, connection); },
160
+ onDisconnect: connection => { const ctx = this.#connections.get(connection.token)?.context; if (ctx)
161
+ this.#options.authorization?.revokeContext(ctx); this.#connections.delete(connection.token); },
162
+ });
163
+ }
164
+ catch (error) {
165
+ try {
166
+ result.release();
167
+ }
168
+ catch { /* best effort */ }
169
+ this.#releaseSingleton = undefined;
170
+ throw bootstrapFailed(`won the user singleton but could not listen on control endpoint ${this.paths.endpointPath}: ${error instanceof Error ? error.message : String(error)}`);
171
+ }
172
+ this.#startLeaseTimer();
173
+ }
174
+ else {
175
+ // Loser attaches as a client to the winner (D32) — the
176
+ // fencing epoch is received on the wire in the hello-ack,
177
+ // never trusted from the lock file alone (A2b).
178
+ let client;
179
+ try {
180
+ client = await this.#connectWinner(result.endpoint);
181
+ }
182
+ catch (error) {
183
+ throw bootstrapFailed(`attached to the winner but could not reach its control endpoint ${result.endpoint}: ${error instanceof Error ? error.message : String(error)}`);
184
+ }
185
+ this.#singleton = "attached";
186
+ this.#holderId = result.holderId;
187
+ this.#fencingEpoch = client.fencingEpoch;
188
+ this.#udsClient = client;
189
+ await this.#verifyAttachedProjectStore(client);
190
+ }
191
+ this.#state = "started";
192
+ break;
193
+ }
194
+ }
195
+ this.#openProjectStore();
196
+ if (this.#registry && this.#options.authorization && this.provider instanceof RuntimeTeExecutionProvider && this.#singleton !== "attached") {
197
+ this.#runtime = new HostRuntime({ registry: this.#registry, authorization: this.#options.authorization, provider: this.provider, controlHome: this.paths.controlHome, maxActiveRuns: this.#options.maxActiveRuns, epoch: () => this.#fencingEpoch, holderId: () => this.#holderId, liveLease: () => this.#liveLease(), evidenceFactory: this.#options.evidenceFactory, durableApprovalAvailable: context => (this.#contextFeatures.get(context) ?? this.#options.trustedInProcessFeatures ?? []).includes("durable-approval") });
198
+ await this.#runtime.initialize();
199
+ }
200
+ }
201
+ catch (error) {
202
+ this.stop();
203
+ this.#state = "failed-closed";
204
+ this.#signalReady();
205
+ if (error instanceof ControlError)
206
+ throw error;
207
+ throw bootstrapFailed(`ControlHost could not start in ${this.mode} mode: ${error instanceof Error ? error.message : String(error)}`);
208
+ }
209
+ this.#signalReady();
210
+ return this.status;
211
+ }
212
+ /**
213
+ * Hello-before-RPC dispatch. Every method call must follow a successful
214
+ * hello (P4) and carry a fencingEpoch >= the current lease epoch (P16).
215
+ *
216
+ * An ATTACHED host routes its RPCs over the Unix socket to the winner's
217
+ * control plane (its own hello happened on the wire at connect time).
218
+ */
219
+ async dispatch(method, params, context) {
220
+ if (this.#state !== "started") {
221
+ throw bootstrapFailed("ControlHost must be started before dispatch");
222
+ }
223
+ if (this.#singleton === "attached" && this.#udsClient !== undefined) {
224
+ if ((method.startsWith("control.store.") || method === "commands.submit") && !this.#options.projectStorePath) {
225
+ throw bootstrapFailed("projectStorePath is required for attached project store RPCs");
226
+ }
227
+ return this.#udsClient.rpc(method, params, context.fencingEpoch);
228
+ }
229
+ if (!this.#helloGate.greeted) {
230
+ throw helloRequiredError();
231
+ }
232
+ return this.#dispatchCore(method, params, context.fencingEpoch);
233
+ }
234
+ /** RPC core without the in-process hello gate (the UDS layer enforces its own). */
235
+ async #dispatchCore(method, params, fencingEpoch) {
236
+ if (fencingEpoch !== this.#fencingEpoch) {
237
+ throw new ControlError("TF_AUTHORITY_REVOKED", `fencing epoch ${fencingEpoch} is stale; host epoch is ${this.#fencingEpoch}`, { recoveryAction: "refresh", sideEffects: "none" });
238
+ }
239
+ switch (method) {
240
+ case "control.status":
241
+ return this.status;
242
+ case "control.probe": {
243
+ return await this.provider.probe();
244
+ }
245
+ case "control.store.header":
246
+ case "control.store.status":
247
+ case "commands.submit":
248
+ case "runs.status":
249
+ throw new ControlError("TF_AUTHORITY_REVOKED", "project operations require a verified transport context");
250
+ default:
251
+ throw new ControlError("TF_COMMAND_FAILED", `unknown control RPC ${JSON.stringify(method)}`, { recoveryAction: "retry-new-command", sideEffects: "none" });
252
+ }
253
+ }
254
+ /** Renew the coordinator lease while held (best-effort; S3 wires the timer). */
255
+ renewLease() {
256
+ if ((this.#singleton === "won" || this.#singleton === "standalone") && this.#holderId !== undefined) {
257
+ renewCoordinatorLease(this.#standalonePaths ?? this.paths, this.#holderId, this.#fencingEpoch, this.#options.leaseTtlMs ?? 30_000, this.now);
258
+ }
259
+ }
260
+ stop() {
261
+ this.#signalReady();
262
+ if (this.#leaseTimer) {
263
+ clearInterval(this.#leaseTimer);
264
+ this.#leaseTimer = undefined;
265
+ }
266
+ this.#runtime?.close();
267
+ this.#runtime = undefined;
268
+ if (this.#ownsRegistry)
269
+ this.#registry?.close();
270
+ this.#registry = undefined;
271
+ if (this.#store) {
272
+ try {
273
+ this.#store.close();
274
+ }
275
+ catch { /* best effort */ }
276
+ this.#store = undefined;
277
+ }
278
+ this.#standalonePaths = undefined;
279
+ const server = this.#udsServer;
280
+ this.#udsServer = undefined;
281
+ const client = this.#udsClient;
282
+ this.#udsClient = undefined;
283
+ if (server) {
284
+ // Winner: stop accepting, drop live connections, then unlink OUR
285
+ // socket while we still hold the lock (a live owner's endpoint is
286
+ // never touched by recovery; unlinking after release could race a
287
+ // fresh winner's listen).
288
+ void server.close().catch(() => { });
289
+ try {
290
+ fs.unlinkSync(this.paths.endpointPath);
291
+ }
292
+ catch { /* best effort */ }
293
+ }
294
+ if (client) {
295
+ try {
296
+ client.close();
297
+ }
298
+ catch { /* best effort */ }
299
+ }
300
+ if (this.#releaseSingleton) {
301
+ try {
302
+ this.#releaseSingleton();
303
+ }
304
+ catch { /* best effort */ }
305
+ this.#releaseSingleton = undefined;
306
+ }
307
+ this.#singleton = "none";
308
+ this.#holderId = undefined;
309
+ this.#fencingEpoch = 0;
310
+ this.#state = "stopped";
311
+ }
312
+ /**
313
+ * The host's client-side handshake when attaching to a winner: same build
314
+ * identity, but a connecting host demands nothing (requiredFeatures) and
315
+ * offers the features it would require from clients (P4 symmetric check).
316
+ */
317
+ #clientHello() {
318
+ const base = this.#options.serverHello ?? defaultServerHello();
319
+ return {
320
+ ...base,
321
+ requiredFeatures: [],
322
+ offeredFeatures: [...(this.#options.requiredFeatures ?? [])],
323
+ };
324
+ }
325
+ async #connectWinner(endpointPath) {
326
+ const deadline = Date.now() + 2000;
327
+ for (;;) {
328
+ try {
329
+ return await connectUdsClient({ endpointPath, clientHello: this.#clientHello() });
330
+ }
331
+ catch (error) {
332
+ if (Date.now() >= deadline)
333
+ throw error;
334
+ await new Promise(resolve => setTimeout(resolve, 25));
335
+ }
336
+ }
337
+ }
338
+ /** Keep the coordinator lease valid while the winner holds the singleton. */
339
+ #startLeaseTimer() {
340
+ const ttl = this.#options.leaseTtlMs ?? 30_000;
341
+ const intervalMs = Math.max(1_000, Math.floor(ttl / 3));
342
+ const timer = setInterval(() => {
343
+ try {
344
+ this.renewLease();
345
+ }
346
+ catch {
347
+ /* best effort — the lease only gates fencing */
348
+ }
349
+ }, intervalMs);
350
+ // Never keep a process alive just to renew a lease.
351
+ timer.unref();
352
+ this.#leaseTimer = timer;
353
+ }
354
+ #acquireStandaloneLease() {
355
+ const standalonePaths = { ...this.paths, lockPath: path.join(this.paths.controlHome, "standalone-lease.json"), leasePath: path.join(this.paths.controlHome, "standalone-coordinator-lease.json"), endpointPath: path.join(this.paths.controlHome, "standalone.sock") };
356
+ const result = acquireUserSingleton({ paths: standalonePaths, holderId: this.#options.holderId, processIdentity: this.#options.processIdentity, inspectProcess: this.#options.inspectProcess, now: this.#options.now, leaseTtlMs: this.#options.leaseTtlMs });
357
+ if (result.status !== "won")
358
+ throw bootstrapFailed("standalone lease belongs to a live or unverified owner");
359
+ this.#standalonePaths = standalonePaths;
360
+ this.#holderId = result.holderId;
361
+ this.#fencingEpoch = result.fencingEpoch;
362
+ this.#releaseSingleton = result.release;
363
+ }
364
+ /** Until multi-mount routing exists, never silently use another project's ledger. */
365
+ async #verifyAttachedProjectStore(_client) {
366
+ // Mount identity is checked after authenticated challenge. An unauthenticated
367
+ // peer cannot read another project's header or select its writer path.
368
+ }
369
+ #openProjectStore() {
370
+ if (this.#singleton === "attached")
371
+ return;
372
+ if (this.#options.registry) {
373
+ this.#registry = this.#options.registry;
374
+ if (this.#options.projectStorePath)
375
+ this.#registry.mount(this.#options.projectStorePath, this.#options.projectRoot);
376
+ for (const mount of this.#options.projectMounts ?? [])
377
+ this.#registry.mount(mount.storePath, mount.projectRoot);
378
+ return;
379
+ }
380
+ const storePath = this.#options.projectStorePath;
381
+ if (!storePath && !this.#options.projectMounts?.length)
382
+ return;
383
+ if (this.#options.authorization) {
384
+ this.#registry = new ProjectRegistry(path.join(this.paths.controlHome, "registry.json"));
385
+ this.#ownsRegistry = true;
386
+ if (storePath)
387
+ this.#registry.mount(storePath, this.#options.projectRoot);
388
+ for (const mount of this.#options.projectMounts ?? [])
389
+ this.#registry.mount(mount.storePath, mount.projectRoot);
390
+ return;
391
+ }
392
+ if (storePath)
393
+ this.#store = openControlStore(storePath);
394
+ }
395
+ #liveLease() {
396
+ if (this.#state !== "started")
397
+ return null;
398
+ try {
399
+ const lease = JSON.parse(fs.readFileSync((this.#standalonePaths ?? this.paths).leasePath, "utf8"));
400
+ return lease.holderId === this.#holderId && lease.fencingEpoch === this.#fencingEpoch ? lease : null;
401
+ }
402
+ catch {
403
+ return null;
404
+ }
405
+ }
406
+ async dispatchAuthenticated(context, method, params) {
407
+ if (this.#state !== "started" || !this.#runtime || !this.#options.authorization)
408
+ throw new ControlError("TF_AUTHORITY_REVOKED", "authenticated runtime is unavailable");
409
+ this.#options.authorization.identity(context);
410
+ if (method === "control.status")
411
+ return this.status;
412
+ if (method === "control.probe")
413
+ return await this.provider.probe();
414
+ return await this.#runtime.dispatch(context, method, params);
415
+ }
416
+ async #dispatchWire(method, params, epoch, connection) {
417
+ if (epoch !== this.#fencingEpoch || this.#state !== "started" || connection.closed)
418
+ throw new ControlError("TF_AUTHORITY_REVOKED", "connection or epoch is no longer live");
419
+ if (method === "control.status" || method === "control.probe")
420
+ return this.#dispatchCore(method, params, epoch);
421
+ const auth = this.#options.authorization;
422
+ if (!auth || !this.#registry)
423
+ throw new ControlError("TF_AUTHORITY_REVOKED", "transport authentication is not configured");
424
+ let session = this.#connections.get(connection.token);
425
+ if (!session) {
426
+ session = {};
427
+ this.#connections.set(connection.token, session);
428
+ }
429
+ const body = params && typeof params === "object" ? params : {};
430
+ if (method === "auth.challenge") {
431
+ const mount = this.#registry.resolve(typeof body.projectId === "string" ? body.projectId : undefined);
432
+ if (body.credential !== undefined && body.credential !== "operator")
433
+ throw new ControlError("TF_POLICY_DENIED", "unknown credential issuer");
434
+ const binding = { projectId: mount.store.header.projectId, controlDomainId: mount.store.header.controlDomainId, projectRoot: mount.projectRoot };
435
+ if (body.credential === "operator" && !auth.createOperatorChallenge)
436
+ throw new ControlError("TF_POLICY_DENIED", "operator credential is not provisioned");
437
+ const challenge = body.credential === "operator" ? auth.createOperatorChallenge(binding) : auth.createChallenge(binding);
438
+ session.challengeId = challenge.id;
439
+ return challenge;
440
+ }
441
+ if (method === "auth.authenticate") {
442
+ if (typeof body.challengeId !== "string" || body.challengeId !== session.challengeId || typeof body.proof !== "string")
443
+ throw new ControlError("TF_POLICY_DENIED", "challenge belongs to another connection");
444
+ delete session.challengeId;
445
+ if (session.context)
446
+ auth.revokeContext(session.context);
447
+ session.context = auth.authenticate(body.challengeId, body.proof);
448
+ this.#contextFeatures.set(session.context, (connection.hello?.offeredFeatures ?? []).filter(feature => this.#helloGate.serverHello.offeredFeatures.includes(feature)));
449
+ return { authenticated: true };
450
+ }
451
+ if (!session.context)
452
+ throw new ControlError("TF_AUTHORITY_REVOKED", "authenticate before project RPCs");
453
+ return this.dispatchAuthenticated(session.context, method, params);
454
+ }
455
+ }
456
+ // Re-export the mode/env surface used by hosts.
457
+ export { CONTROL_MODE_ENV, resolveControlMode } from "./modes.js";
458
+ export { defaultServerHello };
459
+ //# sourceMappingURL=control-host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control-host.js","sourceRoot":"","sources":["../../../taskflow-control/src/control-host.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export interface ControlMcpOptions {
2
+ /** Bound by CLI bootstrap/HMAC attach; no caller identity can be supplied over MCP. */
3
+ call(method: string, params: unknown): Promise<unknown>;
4
+ projectId: string;
5
+ /** Trusted launcher choice; this never grants Host authority by itself. */
6
+ operator?: boolean;
7
+ input?: NodeJS.ReadableStream;
8
+ output?: NodeJS.WritableStream;
9
+ }
10
+ export declare function serveControlMcp(options: ControlMcpOptions): Promise<void>;
11
+ //# sourceMappingURL=control-mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control-mcp.d.ts","sourceRoot":"","sources":["../../../taskflow-control/src/control-mcp.ts"],"names":[],"mappings":"AAmCA,MAAM,WAAW,iBAAiB;IACjC,uFAAuF;IACvF,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;CAC/B;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmCzE"}
@@ -0,0 +1,78 @@
1
+ /** MCP is a protocol adapter over the launcher's already authenticated Host. */
2
+ import { Type } from "typebox";
3
+ import { Value } from "typebox/value";
4
+ import { TaskflowSchema, getBuildInfo } from "taskflow-core";
5
+ import { RPC, RpcError, serveStdio } from "taskflow-mcp-core/jsonrpc";
6
+ import { UuidSchema, StringEnum } from "./schema/common.js";
7
+ import { ApprovalModeSchema } from "./schema/approval.js";
8
+ import { ArtifactRefSchema } from "./schema/evidence.js";
9
+ import { ControlError } from "./errors.js";
10
+ const scope = { projectId: Type.Optional(UuidSchema), controlDomainId: Type.Optional(UuidSchema) };
11
+ const run = { ...scope, runId: UuidSchema };
12
+ const closed = { additionalProperties: false };
13
+ const definitions = [
14
+ { name: "taskflow_control_coordinator", description: "Read user-global capacity and only this project's reservation identifiers and authorized command audit.", method: "coordinator.status", inputSchema: Type.Object(scope, closed) },
15
+ { name: "taskflow_control_projects", description: "List projects authorized for this local session.", method: "projects.list", inputSchema: Type.Object(scope, closed) },
16
+ { name: "taskflow_control_runs", description: "List durable run status in the authorized project.", method: "runs.list", inputSchema: Type.Object(scope, closed) },
17
+ { name: "taskflow_control_submit", description: "Submit a flow to the authenticated Host. Reuse commandId when retrying the same request.", method: "commands.submit", inputSchema: Type.Object({ ...scope, commandId: UuidSchema, flow: TaskflowSchema, args: Type.Optional(Type.Record(Type.String(), Type.Unknown())), approvalMode: Type.Optional(ApprovalModeSchema) }, closed) },
18
+ { name: "taskflow_control_status", description: "Read durable status without phase transcripts.", method: "runs.status", inputSchema: Type.Object(run, closed) },
19
+ { name: "taskflow_control_result", description: "Read the authorized run result, including final output only.", method: "runs.result", inputSchema: Type.Object(run, closed) },
20
+ { name: "taskflow_control_cancel", description: "Cancel a run through the Host's durable control path with its expected run version.", method: "runs.cancel", inputSchema: Type.Object({ ...run, commandId: UuidSchema, expectedRunVersion: Type.Integer({ minimum: 0 }) }, closed) },
21
+ { name: "taskflow_control_approvals", description: "List durable approval requests in the authorized project.", method: "approvals.list", inputSchema: Type.Object(scope, closed) },
22
+ { name: "taskflow_control_approval_stage_edit", description: "Stage bounded output or plan text as a ledger-reachable approval edit artifact. Refresh status before deciding.", method: "approvals.stageEdit", inputSchema: Type.Object({ ...run, editKind: StringEnum(["output", "plan"]), content: Type.String({ maxLength: 1024 * 1024 }) }, closed) },
23
+ { name: "taskflow_control_approval_decide", description: "Approve, reject, or edit a pending approval with its expected run version. Edit requires a staged artifact and editKind.", method: "approvals.decide", inputSchema: Type.Object({ ...run, commandId: UuidSchema, approvalRequestId: UuidSchema, expectedRunVersion: Type.Integer({ minimum: 0 }), decision: StringEnum(["approve", "reject", "edit"]), editKind: Type.Optional(StringEnum(["output", "plan"])), editArtifactRef: Type.Optional(ArtifactRefSchema) }, closed) },
24
+ { name: "taskflow_control_resume", description: "Resume a recoverable run through Host admission and authority checks.", method: "runs.resume", inputSchema: Type.Object(run, closed) },
25
+ { name: "taskflow_control_receipt", description: "Read the authorized evidence receipt for a terminal run.", method: "receipts.get", inputSchema: Type.Object(run, closed) },
26
+ { name: "taskflow_control_why", description: "Explain authorized durable run evidence and effect causes.", method: "evidence.why", inputSchema: Type.Object({ ...run, effectId: Type.Optional(Type.String({ minLength: 1 })), phaseId: Type.Optional(Type.String({ minLength: 1 })), seeds: Type.Optional(Type.Array(Type.String({ minLength: 1 }))) }, closed) },
27
+ ];
28
+ const operatorDefinitions = [
29
+ { name: "taskflow_control_set_max_active_runs", description: "Explicit operator only: set the user-global admitted-run limit. Reuse commandId for exact retries.", method: "coordinator.setMaxActiveRuns", inputSchema: Type.Object({ ...scope, commandId: UuidSchema, maxActiveRuns: Type.Integer({ minimum: 1, maximum: Number.MAX_SAFE_INTEGER }) }, closed) },
30
+ { name: "taskflow_control_force_release", description: "Explicit operator only: release capacity without proving execution stopped; permanently marks operator-overridden. Requires acknowledgement and an audit reason.", method: "coordinator.forceRelease", inputSchema: Type.Object({ ...scope, commandId: UuidSchema, reservationId: UuidSchema, riskAcknowledgement: Type.Literal(true), reason: Type.String({ minLength: 1, maxLength: 4096 }) }, closed) },
31
+ ];
32
+ const callSchema = Type.Object({ name: Type.String(), arguments: Type.Optional(Type.Record(Type.String(), Type.Unknown())) }, closed);
33
+ const initializeSchema = Type.Object({ protocolVersion: Type.String(), capabilities: Type.Record(Type.String(), Type.Unknown()), clientInfo: Type.Object({ name: Type.String(), version: Type.String(), title: Type.Optional(Type.String()) }, { additionalProperties: true }) }, { additionalProperties: true });
34
+ export function serveControlMcp(options) {
35
+ const tools = [...definitions, ...(options.operator ? operatorDefinitions : [])];
36
+ let initialized = false;
37
+ const requireInitialized = () => { if (!initialized)
38
+ throw new RpcError(RPC.INVALID_REQUEST, "initialize is required before using control tools"); };
39
+ const handlers = Object.create(null);
40
+ handlers.initialize = params => {
41
+ if (!Value.Check(initializeSchema, params))
42
+ throw new RpcError(RPC.INVALID_PARAMS, "invalid initialize parameters");
43
+ initialized = true;
44
+ return { protocolVersion: "2025-06-18", capabilities: { tools: {} }, serverInfo: { name: "taskflow-control", version: getBuildInfo().packageVersion } };
45
+ };
46
+ handlers["notifications/initialized"] = () => undefined;
47
+ handlers.ping = () => ({});
48
+ handlers["tools/list"] = params => {
49
+ requireInitialized();
50
+ if (params !== undefined && !Value.Check(Type.Object({}, closed), params))
51
+ throw new RpcError(RPC.INVALID_PARAMS, "tools/list accepts no parameters");
52
+ return { tools: tools.map(({ name, description, inputSchema }) => ({ name, description, inputSchema })) };
53
+ };
54
+ handlers["tools/call"] = async (params) => {
55
+ requireInitialized();
56
+ if (!Value.Check(callSchema, params))
57
+ throw new RpcError(RPC.INVALID_PARAMS, "invalid tool call");
58
+ const tool = tools.find(definition => definition.name === params.name);
59
+ if (!tool)
60
+ throw new RpcError(RPC.INVALID_PARAMS, "unknown control tool");
61
+ const args = params.arguments ?? {};
62
+ if (tool.method === "approvals.decide" && (args.decision === "edit" ? args.editKind === undefined || args.editArtifactRef === undefined : args.editKind !== undefined || args.editArtifactRef !== undefined))
63
+ throw new RpcError(RPC.INVALID_PARAMS, "edit decision requires exactly editKind and editArtifactRef");
64
+ if (!Value.Check(tool.inputSchema, args))
65
+ throw new RpcError(RPC.INVALID_PARAMS, "invalid tool arguments");
66
+ try {
67
+ const result = await options.call(tool.method, { projectId: options.projectId, ...args, ...(tool.method === "commands.submit" ? { kind: "run.submit" } : {}) });
68
+ return { content: [{ type: "text", text: JSON.stringify(result) }] };
69
+ }
70
+ catch (error) {
71
+ // Never dump request bodies, transcripts, credentials, or unexpected exception text.
72
+ const code = error instanceof ControlError ? error.code : "TF_COMMAND_FAILED";
73
+ return { isError: true, content: [{ type: "text", text: JSON.stringify({ error: code }) }] };
74
+ }
75
+ };
76
+ return serveStdio(handlers, { input: options.input, output: options.output });
77
+ }
78
+ //# sourceMappingURL=control-mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control-mcp.js","sourceRoot":"","sources":["../../../taskflow-control/src/control-mcp.ts"],"names":[],"mappings":"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"}