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.
- package/CONTROL_GUIDE.md +113 -0
- package/README.md +34 -25
- package/dist/control/admission-service.d.ts +15 -0
- package/dist/control/admission-service.d.ts.map +1 -0
- package/dist/control/admission-service.js +64 -0
- package/dist/control/admission-service.js.map +1 -0
- package/dist/control/approval-edits.d.ts +12 -0
- package/dist/control/approval-edits.d.ts.map +1 -0
- package/dist/control/approval-edits.js +66 -0
- package/dist/control/approval-edits.js.map +1 -0
- package/dist/control/approval-service.d.ts +173 -0
- package/dist/control/approval-service.d.ts.map +1 -0
- package/dist/control/approval-service.js +342 -0
- package/dist/control/approval-service.js.map +1 -0
- package/dist/control/authorization.d.ts +94 -0
- package/dist/control/authorization.d.ts.map +1 -0
- package/dist/control/authorization.js +302 -0
- package/dist/control/authorization.js.map +1 -0
- package/dist/control/control-cli.d.ts +3 -0
- package/dist/control/control-cli.d.ts.map +1 -0
- package/dist/control/control-cli.js +279 -0
- package/dist/control/control-cli.js.map +1 -0
- package/dist/control/control-console.d.ts +17 -0
- package/dist/control/control-console.d.ts.map +1 -0
- package/dist/control/control-console.js +67 -0
- package/dist/control/control-console.js.map +1 -0
- package/dist/control/control-host.d.ts +98 -0
- package/dist/control/control-host.d.ts.map +1 -0
- package/dist/control/control-host.js +459 -0
- package/dist/control/control-host.js.map +1 -0
- package/dist/control/control-mcp.d.ts +11 -0
- package/dist/control/control-mcp.d.ts.map +1 -0
- package/dist/control/control-mcp.js +78 -0
- package/dist/control/control-mcp.js.map +1 -0
- package/dist/control/errors.d.ts +44 -0
- package/dist/control/errors.d.ts.map +1 -0
- package/dist/control/errors.js +93 -0
- package/dist/control/errors.js.map +1 -0
- package/dist/control/hello.d.ts +39 -0
- package/dist/control/hello.d.ts.map +1 -0
- package/dist/control/hello.js +80 -0
- package/dist/control/hello.js.map +1 -0
- package/dist/control/host-runtime.d.ts +32 -0
- package/dist/control/host-runtime.d.ts.map +1 -0
- package/dist/control/host-runtime.js +542 -0
- package/dist/control/host-runtime.js.map +1 -0
- package/dist/control/index.d.ts +32 -0
- package/dist/control/index.d.ts.map +1 -0
- package/dist/control/index.js +32 -0
- package/dist/control/index.js.map +1 -0
- package/dist/control/legacy-conflict.d.ts +19 -0
- package/dist/control/legacy-conflict.d.ts.map +1 -0
- package/dist/control/legacy-conflict.js +176 -0
- package/dist/control/legacy-conflict.js.map +1 -0
- package/dist/control/local-bootstrap.d.ts +21 -0
- package/dist/control/local-bootstrap.d.ts.map +1 -0
- package/dist/control/local-bootstrap.js +224 -0
- package/dist/control/local-bootstrap.js.map +1 -0
- package/dist/control/modes.d.ts +60 -0
- package/dist/control/modes.d.ts.map +1 -0
- package/dist/control/modes.js +86 -0
- package/dist/control/modes.js.map +1 -0
- package/dist/control/project-admin-cli.d.ts +3 -0
- package/dist/control/project-admin-cli.d.ts.map +1 -0
- package/dist/control/project-admin-cli.js +155 -0
- package/dist/control/project-admin-cli.js.map +1 -0
- package/dist/control/project-registry.d.ts +20 -0
- package/dist/control/project-registry.d.ts.map +1 -0
- package/dist/control/project-registry.js +181 -0
- package/dist/control/project-registry.js.map +1 -0
- package/dist/control/runtime-checkpoint.d.ts +11 -0
- package/dist/control/runtime-checkpoint.d.ts.map +1 -0
- package/dist/control/runtime-checkpoint.js +39 -0
- package/dist/control/runtime-checkpoint.js.map +1 -0
- package/dist/control/runtime-provider.d.ts +100 -0
- package/dist/control/runtime-provider.d.ts.map +1 -0
- package/dist/control/runtime-provider.js +258 -0
- package/dist/control/runtime-provider.js.map +1 -0
- package/dist/control/schema/approval.d.ts +108 -0
- package/dist/control/schema/approval.d.ts.map +1 -0
- package/dist/control/schema/approval.js +65 -0
- package/dist/control/schema/approval.js.map +1 -0
- package/dist/control/schema/commands.d.ts +663 -0
- package/dist/control/schema/commands.d.ts.map +1 -0
- package/dist/control/schema/commands.js +147 -0
- package/dist/control/schema/commands.js.map +1 -0
- package/dist/control/schema/common.d.ts +24 -0
- package/dist/control/schema/common.d.ts.map +1 -0
- package/dist/control/schema/common.js +38 -0
- package/dist/control/schema/common.js.map +1 -0
- package/dist/control/schema/coordinator.d.ts +98 -0
- package/dist/control/schema/coordinator.d.ts.map +1 -0
- package/dist/control/schema/coordinator.js +87 -0
- package/dist/control/schema/coordinator.js.map +1 -0
- package/dist/control/schema/evidence.d.ts +140 -0
- package/dist/control/schema/evidence.d.ts.map +1 -0
- package/dist/control/schema/evidence.js +64 -0
- package/dist/control/schema/evidence.js.map +1 -0
- package/dist/control/schema/header.d.ts +79 -0
- package/dist/control/schema/header.d.ts.map +1 -0
- package/dist/control/schema/header.js +66 -0
- package/dist/control/schema/header.js.map +1 -0
- package/dist/control/schema/index.d.ts +31 -0
- package/dist/control/schema/index.d.ts.map +1 -0
- package/dist/control/schema/index.js +31 -0
- package/dist/control/schema/index.js.map +1 -0
- package/dist/control/schema/plan.d.ts +291 -0
- package/dist/control/schema/plan.d.ts.map +1 -0
- package/dist/control/schema/plan.js +80 -0
- package/dist/control/schema/plan.js.map +1 -0
- package/dist/control/schema/policy.d.ts +96 -0
- package/dist/control/schema/policy.d.ts.map +1 -0
- package/dist/control/schema/policy.js +73 -0
- package/dist/control/schema/policy.js.map +1 -0
- package/dist/control/schema/run.d.ts +61 -0
- package/dist/control/schema/run.d.ts.map +1 -0
- package/dist/control/schema/run.js +56 -0
- package/dist/control/schema/run.js.map +1 -0
- package/dist/control/schema/te-mirrors.d.ts +145 -0
- package/dist/control/schema/te-mirrors.d.ts.map +1 -0
- package/dist/control/schema/te-mirrors.js +145 -0
- package/dist/control/schema/te-mirrors.js.map +1 -0
- package/dist/control/schema/transport.d.ts +479 -0
- package/dist/control/schema/transport.d.ts.map +1 -0
- package/dist/control/schema/transport.js +181 -0
- package/dist/control/schema/transport.js.map +1 -0
- package/dist/control/singleton.d.ts +135 -0
- package/dist/control/singleton.d.ts.map +1 -0
- package/dist/control/singleton.js +607 -0
- package/dist/control/singleton.js.map +1 -0
- package/dist/control/store/coordinator-store.d.ts +143 -0
- package/dist/control/store/coordinator-store.d.ts.map +1 -0
- package/dist/control/store/coordinator-store.js +620 -0
- package/dist/control/store/coordinator-store.js.map +1 -0
- package/dist/control/store/evidence-adapter.d.ts +10 -0
- package/dist/control/store/evidence-adapter.d.ts.map +1 -0
- package/dist/control/store/evidence-adapter.js +114 -0
- package/dist/control/store/evidence-adapter.js.map +1 -0
- package/dist/control/store/evidence-explanation.d.ts +55 -0
- package/dist/control/store/evidence-explanation.d.ts.map +1 -0
- package/dist/control/store/evidence-explanation.js +50 -0
- package/dist/control/store/evidence-explanation.js.map +1 -0
- package/dist/control/store/evidence-store.d.ts +143 -0
- package/dist/control/store/evidence-store.d.ts.map +1 -0
- package/dist/control/store/evidence-store.js +437 -0
- package/dist/control/store/evidence-store.js.map +1 -0
- package/dist/control/store/index.d.ts +3 -0
- package/dist/control/store/index.d.ts.map +1 -0
- package/dist/control/store/index.js +2 -0
- package/dist/control/store/index.js.map +1 -0
- package/dist/control/store/journal.d.ts +270 -0
- package/dist/control/store/journal.d.ts.map +1 -0
- package/dist/control/store/journal.js +50 -0
- package/dist/control/store/journal.js.map +1 -0
- package/dist/control/store/project-lifecycle.d.ts +49 -0
- package/dist/control/store/project-lifecycle.d.ts.map +1 -0
- package/dist/control/store/project-lifecycle.js +288 -0
- package/dist/control/store/project-lifecycle.js.map +1 -0
- package/dist/control/store/store.d.ts +93 -0
- package/dist/control/store/store.d.ts.map +1 -0
- package/dist/control/store/store.js +873 -0
- package/dist/control/store/store.js.map +1 -0
- package/dist/control/te-provider.d.ts +86 -0
- package/dist/control/te-provider.d.ts.map +1 -0
- package/dist/control/te-provider.js +131 -0
- package/dist/control/te-provider.js.map +1 -0
- package/dist/control/uds.d.ts +114 -0
- package/dist/control/uds.d.ts.map +1 -0
- package/dist/control/uds.js +456 -0
- package/dist/control/uds.js.map +1 -0
- package/dist/control/web-console/view.d.ts +5 -0
- package/dist/control/web-console/view.d.ts.map +1 -0
- package/dist/control/web-console/view.js +122 -0
- package/dist/control/web-console/view.js.map +1 -0
- package/dist/control/web-console.d.ts +50 -0
- package/dist/control/web-console.d.ts.map +1 -0
- package/dist/control/web-console.js +317 -0
- package/dist/control/web-console.js.map +1 -0
- package/dist/mcp/jsonrpc.d.ts.map +1 -1
- package/dist/mcp/jsonrpc.js +12 -3
- package/dist/mcp/jsonrpc.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +26 -17
- package/dist/mcp/server.js.map +1 -1
- 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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"}
|