codex-computer-use-mcp 0.3.4 → 0.5.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 (51) hide show
  1. package/README.md +39 -117
  2. package/SECURITY.md +5 -63
  3. package/dist/audit.d.ts +1 -7
  4. package/dist/audit.js +4 -12
  5. package/dist/audit.js.map +1 -1
  6. package/dist/code-executor.d.ts +23 -0
  7. package/dist/code-executor.js +216 -0
  8. package/dist/code-executor.js.map +1 -0
  9. package/dist/code-worker.d.ts +1 -0
  10. package/dist/code-worker.js +120 -0
  11. package/dist/code-worker.js.map +1 -0
  12. package/dist/direct-broker.d.ts +18 -30
  13. package/dist/direct-broker.js +87 -161
  14. package/dist/direct-broker.js.map +1 -1
  15. package/dist/direct-service.d.ts +13 -21
  16. package/dist/direct-service.js +82 -299
  17. package/dist/direct-service.js.map +1 -1
  18. package/dist/mcp-elicitation.d.ts +1 -2
  19. package/dist/mcp-elicitation.js +18 -23
  20. package/dist/mcp-elicitation.js.map +1 -1
  21. package/dist/mcp-server.js +34 -38
  22. package/dist/mcp-server.js.map +1 -1
  23. package/dist/session-executor.d.ts +22 -0
  24. package/dist/session-executor.js +89 -0
  25. package/dist/session-executor.js.map +1 -0
  26. package/dist/tools.d.ts +743 -81
  27. package/dist/tools.js +55 -178
  28. package/dist/tools.js.map +1 -1
  29. package/dist/version.d.ts +1 -0
  30. package/dist/version.js +3 -0
  31. package/dist/version.js.map +1 -0
  32. package/integrations/pi/index.ts +146 -261
  33. package/package.json +13 -26
  34. package/ARCHITECTURE.md +0 -162
  35. package/CHANGELOG.md +0 -19
  36. package/CONTRIBUTING.md +0 -33
  37. package/MIGRATION.md +0 -134
  38. package/PROOF.md +0 -166
  39. package/dist/config.d.ts +0 -12
  40. package/dist/config.js +0 -10
  41. package/dist/config.js.map +0 -1
  42. package/dist/lock.d.ts +0 -17
  43. package/dist/lock.js +0 -137
  44. package/dist/lock.js.map +0 -1
  45. package/dist/system.d.ts +0 -25
  46. package/dist/system.js +0 -213
  47. package/dist/system.js.map +0 -1
  48. package/docs/adr/0001-standalone-code-mode-mcp.md +0 -45
  49. package/integrations/pi/README.md +0 -73
  50. package/integrations/pi/mcp.json.example +0 -15
  51. package/npm-shrinkwrap.json +0 -4827
@@ -1,95 +1,49 @@
1
1
  import crypto from "node:crypto";
2
2
  import { homedir } from "node:os";
3
3
  import path from "node:path";
4
+ import { z } from "zod";
4
5
  import { appendAudit } from "./audit.js";
5
- import { loadConfig } from "./config.js";
6
6
  import { callOfficialDirectTool, DirectBrokerCallError, verifyOfficialDirectBroker, } from "./direct-broker.js";
7
- import { acquireAppLock, globalAppLockRoot } from "./lock.js";
8
- import { frontmostBundleId, frontmostBundleIdAsync, resolveAppIdentity, watchTargetFrontmost, } from "./system.js";
9
- import { MUTATING_METHODS, OFFICIAL_METHODS, isDirectMethod, targetAppFor, validateDirectArguments, } from "./tools.js";
10
- export class DirectPolicyError extends Error {
11
- constructor(message) {
12
- super(message);
13
- this.name = "DirectPolicyError";
14
- }
15
- }
16
- export function defaultStateRoot() {
7
+ import { COMPUTER_USE_METHODS, validateDirectArguments, } from "./tools.js";
8
+ const requestSchema = z.object({
9
+ method: z.enum(COMPUTER_USE_METHODS),
10
+ arguments: z.record(z.string(), z.json()).default({}),
11
+ });
12
+ function defaultStateRoot() {
17
13
  return process.env.CODEX_COMPUTER_USE_HOME || path.join(homedir(), ".direct-computer-use");
18
14
  }
19
- function auditAppIdentifier(rawApp, identity) {
20
- if (!rawApp)
15
+ function auditAppIdentifier(app) {
16
+ if (!app)
21
17
  return null;
22
- if (identity?.bundleId)
23
- return identity.bundleId;
24
- return `target-sha256:${crypto.createHash("sha256").update(rawApp).digest("hex").slice(0, 16)}`;
18
+ return `target-sha256:${crypto.createHash("sha256").update(app).digest("hex").slice(0, 16)}`;
25
19
  }
26
- function inputByteCount(args) {
27
- try {
28
- return Buffer.byteLength(JSON.stringify(args), "utf8");
29
- }
30
- catch {
31
- return 0;
32
- }
20
+ function inputByteCount(value) {
21
+ return Buffer.byteLength(JSON.stringify(value), "utf8");
33
22
  }
34
23
  function contentMetadata(content) {
35
24
  const types = [...new Set(content.map((item) => String(item.type ?? "unknown")))].sort();
36
- let bytes = 0;
37
- try {
38
- bytes = Buffer.byteLength(JSON.stringify(content), "utf8");
39
- }
40
- catch { /* already validated by broker */ }
41
- return { types, bytes };
42
- }
43
- function safeErrorMessage(error) {
44
- const message = error instanceof Error ? error.message : "Direct Computer Use failed";
45
- return message
46
- .replace(/\/Users\/[^/\s]+/g, "~")
47
- .replace(/https?:\/\/\S+/g, "[url]")
48
- .replace(/[A-Za-z0-9_-]{32,}/g, "[redacted]")
49
- .replace(/[\u0000-\u001f\u007f]+/g, " ")
50
- .slice(0, 500);
51
- }
52
- function rejectedMetadata(raw) {
53
- if (!raw || typeof raw !== "object" || Array.isArray(raw))
54
- return { method: "invalid_request", inputBytes: 0, mutating: false };
55
- const record = raw;
56
- const method = typeof record.method === "string" && isDirectMethod(record.method) ? record.method : "invalid_request";
57
- return {
58
- method,
59
- inputBytes: inputByteCount((record.arguments && typeof record.arguments === "object" ? record.arguments : {})),
60
- mutating: method !== "invalid_request" && MUTATING_METHODS.has(method),
61
- };
62
- }
63
- function authorizationFor(_mode, _method) {
64
- return "no_permissions_unrestricted";
25
+ return { types, bytes: Buffer.byteLength(JSON.stringify(content), "utf8") };
65
26
  }
66
27
  export async function executeDirectTool(raw, deps = {}) {
67
28
  const stateRoot = deps.stateRoot ?? defaultStateRoot();
68
29
  const runId = crypto.randomUUID();
69
30
  const startedAt = Date.now();
70
- const config = await loadConfig();
71
31
  let request;
72
32
  try {
73
- if (!raw || typeof raw !== "object" || Array.isArray(raw))
74
- throw new DirectPolicyError("Direct Computer Use request must be an object");
75
- const record = raw;
76
- if (typeof record.method !== "string" || !isDirectMethod(record.method))
77
- throw new DirectPolicyError("Unknown direct Computer Use method");
78
- const args = validateDirectArguments(record.method, record.arguments ?? {});
79
- request = { method: record.method, arguments: args };
33
+ const envelope = requestSchema.parse(raw);
34
+ request = {
35
+ method: envelope.method,
36
+ arguments: validateDirectArguments(envelope.method, envelope.arguments),
37
+ };
80
38
  }
81
- catch (error) {
82
- const rejected = rejectedMetadata(raw);
83
- const record = {
39
+ catch {
40
+ await appendAudit(stateRoot, {
84
41
  timestamp: new Date().toISOString(),
85
42
  runId,
86
- method: rejected.method,
87
- permissionMode: config.permissionMode,
43
+ method: "invalid_request",
88
44
  app: null,
89
- mutating: rejected.mutating,
90
- authorization: "none",
91
- inputBytes: rejected.inputBytes,
92
- outcome: "policy_rejected",
45
+ inputBytes: inputByteCount(raw),
46
+ outcome: "input_rejected",
93
47
  durationMs: Date.now() - startedAt,
94
48
  brokerVersion: null,
95
49
  clientBuild: null,
@@ -97,252 +51,81 @@ export async function executeDirectTool(raw, deps = {}) {
97
51
  modelTurnsStarted: 0,
98
52
  ephemeralThread: null,
99
53
  elicitationRequests: 0,
100
- backgroundPreserved: null,
101
54
  brokerCleanupVerified: true,
102
- appLeaseReleased: true,
103
55
  resultContentTypes: [],
104
56
  resultBytes: 0,
105
- };
106
- try {
107
- await appendAudit(stateRoot, record);
108
- }
109
- catch {
110
- throw new Error("Direct Computer Use request was rejected, but secure audit logging failed");
111
- }
112
- if (error instanceof DirectPolicyError)
113
- throw error;
114
- throw new DirectPolicyError("Direct Computer Use arguments did not match the typed schema");
57
+ });
58
+ throw new Error("Direct Computer Use request did not match a tool schema");
115
59
  }
116
- const rawApp = targetAppFor(request.method, request.arguments);
117
- const identity = rawApp ? (deps.resolveIdentity ?? resolveAppIdentity)(rawApp) : undefined;
118
- if (rawApp && !identity?.bundleId) {
119
- const audit = {
120
- timestamp: new Date().toISOString(), runId, method: request.method, permissionMode: config.permissionMode,
121
- app: auditAppIdentifier(rawApp, identity), mutating: MUTATING_METHODS.has(request.method),
122
- authorization: authorizationFor(config.permissionMode, request.method), inputBytes: inputByteCount(request.arguments),
123
- outcome: "identity_rejected", durationMs: Date.now() - startedAt, brokerVersion: null, clientBuild: null,
124
- directCalls: 0, modelTurnsStarted: 0, ephemeralThread: null, elicitationRequests: 0,
125
- backgroundPreserved: null, brokerCleanupVerified: true, appLeaseReleased: true, resultContentTypes: [], resultBytes: 0,
126
- };
127
- try {
128
- await appendAudit(stateRoot, audit);
129
- }
130
- catch {
131
- throw new Error("Direct Computer Use identity validation failed, and secure audit logging also failed");
132
- }
133
- throw new DirectPolicyError("Target app could not be resolved to a canonical installed bundle identifier");
134
- }
135
- const canonicalArgs = identity?.bundleId
136
- ? { ...request.arguments, app: identity.bundleId }
137
- : { ...request.arguments };
138
- let lock;
139
- let watcher;
140
- let focusTimer;
141
- let focusSample;
142
- let focusSamplingFailed = false;
143
- let frontBefore;
144
- let targetBecameFrontmost = false;
145
- let unrelatedFocusChanges = false;
146
- let backgroundPreserved = null;
60
+ const app = request.method === "list_apps" ? undefined : String(request.arguments.app);
147
61
  let broker;
148
62
  let brokerFailure;
149
- let brokerDispatchAttempted = false;
150
- let outcome = "failed";
63
+ let outcome = "broker_failed";
151
64
  let brokerCleanupVerified = false;
152
- let response;
153
- let thrown;
65
+ let failure;
154
66
  try {
155
- if (identity)
156
- lock = await (deps.acquireLock ?? acquireAppLock)(globalAppLockRoot(), identity.leaseId, runId);
157
- if (identity?.bundleId) {
158
- frontBefore = (deps.frontmost ?? frontmostBundleId)();
159
- if (frontBefore?.toLowerCase() === identity.bundleId.toLowerCase())
160
- targetBecameFrontmost = true;
161
- try {
162
- watcher = await (deps.watchFocus ?? watchTargetFrontmost)();
163
- }
164
- catch {
165
- focusSamplingFailed = true;
166
- }
167
- const sample = async () => {
168
- if (focusSample)
169
- return focusSample;
170
- focusSample = (async () => {
171
- const current = await (deps.frontmostAsync ?? frontmostBundleIdAsync)();
172
- if (!current)
173
- return;
174
- if (current.toLowerCase() === identity.bundleId.toLowerCase())
175
- targetBecameFrontmost = true;
176
- else if (frontBefore && current !== frontBefore)
177
- unrelatedFocusChanges = true;
178
- })().finally(() => { focusSample = undefined; });
179
- return focusSample;
180
- };
181
- await sample().catch(() => { focusSamplingFailed = true; });
182
- focusTimer = setInterval(() => {
183
- void sample().catch(() => { focusSamplingFailed = true; });
184
- }, 100);
185
- focusTimer.unref();
186
- }
187
- await deps.onProgress?.(`Direct ${request.method}: verified target lease; calling the signed official tool without a model turn…`);
188
- try {
189
- brokerDispatchAttempted = true;
190
- broker = await (deps.callTool ?? callOfficialDirectTool)(request.method, canonicalArgs, {
191
- signal: deps.signal,
192
- timeoutMs: 120_000,
193
- onElicitation: deps.onElicitation,
194
- supportsOpenAiFormElicitation: deps.supportsOpenAiFormElicitation,
195
- });
196
- brokerCleanupVerified = broker.brokerCleanupVerified;
197
- }
198
- catch (error) {
199
- if (error instanceof DirectBrokerCallError) {
200
- brokerFailure = error;
201
- brokerCleanupVerified = error.cleanupVerified;
202
- }
203
- throw error;
204
- }
205
- if (broker.modelTurnsStarted !== 0 || broker.ephemeralThread !== true) {
206
- throw new DirectPolicyError("Direct broker violated the zero-model-turn architecture");
207
- }
67
+ broker = await (deps.callTool ?? callOfficialDirectTool)(request.method, request.arguments, {
68
+ signal: deps.signal,
69
+ timeoutMs: 120_000,
70
+ onElicitation: deps.onElicitation,
71
+ supportsOpenAiFormElicitation: deps.supportsOpenAiFormElicitation,
72
+ });
73
+ brokerCleanupVerified = broker.brokerCleanupVerified;
208
74
  outcome = broker.isError ? "official_error" : "ok";
209
- response = {
210
- ok: !broker.isError,
211
- isError: broker.isError,
212
- content: broker.content,
213
- details: {
214
- runId,
215
- method: request.method,
216
- permissionMode: config.permissionMode,
217
- app: identity?.bundleId ?? null,
218
- outcome,
219
- directCalls: 1,
220
- modelTurnsStarted: 0,
221
- ephemeralRuntimeContext: true,
222
- elicitationRequests: broker.elicitationRequests,
223
- brokerVersion: broker.brokerVersion,
224
- clientBuild: broker.clientBuild,
225
- durationMs: broker.durationMs,
226
- },
227
- };
228
75
  }
229
76
  catch (error) {
230
- outcome = error instanceof DirectPolicyError ? "policy_violation" : deps.signal?.aborted ? "cancelled" : "broker_failed";
231
- if (!brokerDispatchAttempted)
232
- brokerCleanupVerified = true;
233
- thrown = new Error(safeErrorMessage(error));
234
- }
235
- finally {
236
- if (focusTimer)
237
- clearInterval(focusTimer);
238
- if (focusSample)
239
- await focusSample.catch(() => { focusSamplingFailed = true; });
240
- let watcherFailed = focusSamplingFailed;
241
- if (watcher) {
242
- watcherFailed ||= !watcher.healthy();
243
- try {
244
- await watcher.stop();
245
- }
246
- catch {
247
- watcherFailed = true;
248
- }
249
- if (identity?.bundleId)
250
- targetBecameFrontmost ||= watcher.becameFrontmost(identity.bundleId);
251
- }
252
- if (identity?.bundleId) {
253
- const frontAfter = (deps.frontmost ?? frontmostBundleId)();
254
- if (!frontAfter)
255
- watcherFailed = true;
256
- else if (frontAfter.toLowerCase() === identity.bundleId.toLowerCase())
257
- targetBecameFrontmost = true;
258
- else if (frontBefore && frontAfter !== frontBefore)
259
- unrelatedFocusChanges = true;
260
- }
261
- backgroundPreserved = identity ? !targetBecameFrontmost && !watcherFailed : null;
262
- let releaseFailed = false;
263
- try {
264
- await lock?.release();
265
- }
266
- catch {
267
- releaseFailed = true;
268
- }
269
- if (releaseFailed) {
270
- outcome = "lease_cleanup_failed";
271
- thrown = new Error("Direct Computer Use app lease did not release cleanly");
272
- response = undefined;
273
- }
274
- const metadata = broker ? contentMetadata(broker.content) : { types: [], bytes: 0 };
275
- const audit = {
276
- timestamp: new Date().toISOString(),
277
- runId,
278
- method: request.method,
279
- permissionMode: config.permissionMode,
280
- app: auditAppIdentifier(rawApp, identity),
281
- mutating: MUTATING_METHODS.has(request.method),
282
- authorization: authorizationFor(config.permissionMode, request.method),
283
- inputBytes: inputByteCount(canonicalArgs),
284
- outcome,
285
- durationMs: Date.now() - startedAt,
286
- brokerVersion: broker?.brokerVersion ?? brokerFailure?.brokerVersion ?? null,
287
- clientBuild: broker?.clientBuild ?? brokerFailure?.clientBuild ?? null,
288
- directCalls: broker ? 1 : brokerFailure?.directCalls ?? 0,
289
- modelTurnsStarted: broker?.modelTurnsStarted ?? brokerFailure?.modelTurnsStarted ?? 0,
290
- ephemeralThread: broker?.ephemeralThread ?? brokerFailure?.ephemeralThread ?? null,
291
- elicitationRequests: broker?.elicitationRequests ?? brokerFailure?.elicitationRequests ?? 0,
292
- backgroundPreserved,
293
- brokerCleanupVerified,
294
- appLeaseReleased: !releaseFailed,
295
- resultContentTypes: metadata.types,
296
- resultBytes: metadata.bytes,
297
- };
298
- try {
299
- await appendAudit(stateRoot, audit);
300
- }
301
- catch {
302
- throw new Error(`Direct Computer Use ended with outcome ${outcome}, but secure audit logging failed`);
77
+ if (error instanceof DirectBrokerCallError) {
78
+ brokerFailure = error;
79
+ brokerCleanupVerified = error.cleanupVerified;
303
80
  }
81
+ if (deps.signal?.aborted)
82
+ outcome = "cancelled";
83
+ failure = error instanceof Error ? error : new Error("Direct Computer Use failed");
304
84
  }
305
- if (thrown)
306
- throw thrown;
307
- if (!response)
85
+ const metadata = broker ? contentMetadata(broker.content) : { types: [], bytes: 0 };
86
+ const audit = {
87
+ timestamp: new Date().toISOString(),
88
+ runId,
89
+ method: request.method,
90
+ app: auditAppIdentifier(app),
91
+ inputBytes: inputByteCount(request.arguments),
92
+ outcome,
93
+ durationMs: Date.now() - startedAt,
94
+ brokerVersion: broker?.brokerVersion ?? brokerFailure?.brokerVersion ?? null,
95
+ clientBuild: broker?.clientBuild ?? brokerFailure?.clientBuild ?? null,
96
+ directCalls: broker ? 1 : brokerFailure?.directCalls ?? 0,
97
+ modelTurnsStarted: broker?.modelTurnsStarted ?? brokerFailure?.modelTurnsStarted ?? 0,
98
+ ephemeralThread: broker?.ephemeralThread ?? brokerFailure?.ephemeralThread ?? null,
99
+ elicitationRequests: broker?.elicitationRequests ?? brokerFailure?.elicitationRequests ?? 0,
100
+ brokerCleanupVerified,
101
+ resultContentTypes: metadata.types,
102
+ resultBytes: metadata.bytes,
103
+ };
104
+ await appendAudit(stateRoot, audit);
105
+ if (failure)
106
+ throw failure;
107
+ if (!broker)
308
108
  throw new Error("Direct Computer Use ended without a result");
309
- response.details.backgroundPreserved = backgroundPreserved;
310
- response.details.unrelatedFocusChanges = unrelatedFocusChanges;
311
- response.details.brokerCleanupVerified = brokerCleanupVerified;
312
- return response;
313
- }
314
- export async function getDirectStatus(stateRoot = defaultStateRoot()) {
315
- const config = await loadConfig();
316
- let brokerVerified = false;
317
- let brokerVersion;
318
- let clientBuild;
319
- try {
320
- ({ brokerVersion, clientBuild } = verifyOfficialDirectBroker());
321
- brokerVerified = true;
322
- }
323
- catch {
324
- // Status remains readable without exposing local verification details.
325
- }
326
109
  return {
110
+ isError: broker.isError,
111
+ content: broker.content,
112
+ structuredContent: broker.structuredContent,
113
+ };
114
+ }
115
+ export function getDirectStatus(stateRoot = defaultStateRoot()) {
116
+ const status = {
327
117
  stateRoot,
328
- permissionMode: config.permissionMode,
329
- brokerVerified,
330
- ...(brokerVersion ? { brokerVersion } : {}),
331
- ...(clientBuild ? { clientBuild } : {}),
332
- officialElicitationsAuthoritative: true,
333
- architecture: "official-codex-app-server-direct-mcp-tool-call",
334
- nestedModel: false,
335
- modelUsage: false,
336
- ephemeralZeroTurnRuntimeContextRequired: true,
337
- wrapperPermissionPrompts: false,
338
- officialApprovalPolicy: "full-access",
339
- officialAppApprovalHandling: "auto-approved-by-codex-full-access",
340
- officialElicitationHandling: "forwarded-if-emitted",
341
- wrapperAuthorization: "unrestricted",
342
- availableMethods: [...OFFICIAL_METHODS],
343
- supportedMethods: [...OFFICIAL_METHODS],
344
- appLockRoot: globalAppLockRoot(),
345
- auditPath: path.join(stateRoot, "audit", "direct-computer-use.jsonl"),
118
+ permissionMode: "no-permissions",
119
+ brokerVerified: false,
120
+ methods: [...COMPUTER_USE_METHODS],
346
121
  };
122
+ try {
123
+ const verification = verifyOfficialDirectBroker();
124
+ status.brokerVerified = true;
125
+ status.brokerVersion = verification.brokerVersion;
126
+ status.clientBuild = verification.clientBuild;
127
+ }
128
+ catch { }
129
+ return status;
347
130
  }
348
131
  //# sourceMappingURL=direct-service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"direct-service.js","sourceRoot":"","sources":["../src/direct-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"direct-service.js","sourceRoot":"","sources":["../src/direct-service.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,7 @@
1
1
  import type { RequestOptions } from "@modelcontextprotocol/sdk/shared/protocol.js";
2
- import type { ElicitRequestParams, ElicitResult } from "@modelcontextprotocol/sdk/types.js";
2
+ import { type ElicitRequestParams, type ElicitResult } from "@modelcontextprotocol/sdk/types.js";
3
3
  import type { DirectBrokerElicitationRequest, DirectBrokerElicitationResponse } from "./direct-broker.ts";
4
4
  export interface McpElicitationClient {
5
5
  elicitInput(params: ElicitRequestParams, options?: RequestOptions): Promise<ElicitResult>;
6
6
  }
7
- /** Forward a signed app-server elicitation over standard MCP without changing its meaning. */
8
7
  export declare function forwardOfficialElicitationToMcpClient(client: McpElicitationClient, request: DirectBrokerElicitationRequest, signal?: AbortSignal): Promise<DirectBrokerElicitationResponse>;
@@ -1,46 +1,41 @@
1
- function isRecord(value) {
2
- return Boolean(value) && typeof value === "object" && !Array.isArray(value);
3
- }
4
- /** Forward a signed app-server elicitation over standard MCP without changing its meaning. */
1
+ import { ElicitRequestParamsSchema, } from "@modelcontextprotocol/sdk/types.js";
2
+ import { z } from "zod";
5
3
  export async function forwardOfficialElicitationToMcpClient(client, request, signal) {
6
- let params;
4
+ let candidate;
7
5
  if (request.mode === "url") {
8
- if (typeof request.message !== "string"
9
- || typeof request.url !== "string"
10
- || typeof request.elicitationId !== "string")
11
- return { action: "cancel" };
12
- params = {
6
+ candidate = {
13
7
  mode: "url",
14
8
  message: request.message,
15
9
  url: request.url,
16
10
  elicitationId: request.elicitationId,
17
- ...(isRecord(request._meta) ? { _meta: request._meta } : {}),
18
11
  };
19
12
  }
20
13
  else if (request.mode === undefined || request.mode === "form") {
21
- if (typeof request.message !== "string" || !isRecord(request.requestedSchema))
22
- return { action: "cancel" };
23
- params = {
14
+ candidate = {
24
15
  mode: "form",
25
16
  message: request.message,
26
17
  requestedSchema: request.requestedSchema,
27
- ...(isRecord(request._meta) ? { _meta: request._meta } : {}),
28
18
  };
29
19
  }
30
20
  else {
31
- // OpenAI's richer openai/form mode is advertised only by clients that can render it.
32
21
  return { action: "cancel" };
33
22
  }
23
+ if (request._meta !== undefined)
24
+ candidate._meta = request._meta;
25
+ const parsedParams = ElicitRequestParamsSchema.safeParse(candidate);
26
+ if (!parsedParams.success)
27
+ return { action: "cancel" };
34
28
  try {
35
- const response = await client.elicitInput(params, signal ? { signal } : undefined);
36
- return {
37
- action: response.action,
38
- ...(response.content !== undefined ? { content: response.content } : {}),
39
- ...(isRecord(response._meta) ? { _meta: response._meta } : {}),
40
- };
29
+ const response = await client.elicitInput(parsedParams.data, signal ? { signal } : undefined);
30
+ const result = { action: response.action };
31
+ if (response.content !== undefined)
32
+ result.content = response.content;
33
+ const metadata = z.json().safeParse(response._meta);
34
+ if (metadata.success)
35
+ result._meta = metadata.data;
36
+ return result;
41
37
  }
42
38
  catch {
43
- // This is the MCP headless/unsupported-client outcome, not a fabricated decline.
44
39
  return { action: "cancel" };
45
40
  }
46
41
  }
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-elicitation.js","sourceRoot":"","sources":["../src/mcp-elicitation.ts"],"names":[],"mappings":"AAWA,SAAS,QAAQ,CAAC,KAAc;IAC/B,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC;AAED,8FAA8F;AAC9F,MAAM,CAAC,KAAK,UAAU,qCAAqC,CAC1D,MAA4B,EAC5B,OAAuC,EACvC,MAAoB;IAEpB,IAAI,MAA2B,CAAC;IAChC,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QAC5B,IACC,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ;eAChC,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ;eAC/B,OAAO,OAAO,CAAC,aAAa,KAAK,QAAQ;YAC3C,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QAC9B,MAAM,GAAG;YACR,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5D,CAAC;IACH,CAAC;SAAM,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAClE,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QAC3G,MAAM,GAAG;YACR,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,eAAe,EAAE,OAAO,CAAC,eAAe;YACxC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrC,CAAC;IAC1B,CAAC;SAAM,CAAC;QACP,qFAAqF;QACrF,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC7B,CAAC;IAED,IAAI,CAAC;QACJ,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACnF,OAAO;YACN,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,GAAG,CAAC,QAAQ,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxE,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9D,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACR,iFAAiF;QACjF,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC7B,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"mcp-elicitation.js","sourceRoot":"","sources":["../src/mcp-elicitation.ts"],"names":[],"mappings":"AACA,OAAO,EACN,yBAAyB,GAGzB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAWxB,MAAM,CAAC,KAAK,UAAU,qCAAqC,CAC1D,MAA4B,EAC5B,OAAuC,EACvC,MAAoB;IAEpB,IAAI,SAAqB,CAAC;IAC1B,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QAC5B,SAAS,GAAG;YACX,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,aAAa,EAAE,OAAO,CAAC,aAAa;SACpC,CAAC;IACH,CAAC;SAAM,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAClE,SAAS,GAAG;YACX,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,eAAe,EAAE,OAAO,CAAC,eAAe;SACxC,CAAC;IACH,CAAC;SAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC7B,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS;QAAE,SAAS,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IACjE,MAAM,YAAY,GAAG,yBAAyB,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACpE,IAAI,CAAC,YAAY,CAAC,OAAO;QAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAEvD,IAAI,CAAC;QACJ,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC9F,MAAM,MAAM,GAAoC,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC5E,IAAI,QAAQ,CAAC,OAAO,KAAK,SAAS;YAAE,MAAM,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;QACtE,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACpD,IAAI,QAAQ,CAAC,OAAO;YAAE,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC;QACnD,OAAO,MAAM,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC7B,CAAC;AACF,CAAC"}