@foldkit/devtools-mcp 0.16.0 → 0.16.1-canary.6a5cbafae641

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 (3) hide show
  1. package/README.md +16 -16
  2. package/dist/server.js +288 -37
  3. package/package.json +3 -3
package/README.md CHANGED
@@ -6,13 +6,13 @@ With it attached, agents can:
6
6
 
7
7
  - Read the current Model, or any historical Model by history index
8
8
  - Narrow reads with dot-string paths and summarized payloads to fit token budgets
9
- - List and inspect the Message history, with Command and Mount lifecycle, diffs, and submodel chains
9
+ - List and inspect the Message history, with Command and Mount lifecycle, diffs, and Submodel chains
10
10
  - Query history server-side: filter entries by changed Model paths, count Messages by tag, tail the latest entries, and diff the Models at two indices
11
11
  - Read the recorded init Model, the Commands returned from `init`, and the Mounts that fired during the first render
12
- - Inspect runtime state: current index, retained history bounds, pause status
12
+ - Inspect Runtime state: current index, retained history bounds, pause status
13
13
  - Replay to any past state and resume
14
- - Discover the runtime's `Message` Schema as JSON Schema so agents can construct valid payloads without reading the application source
15
- - Dispatch Messages into the runtime, singly or as an ordered batch, decoded against your `Message` Schema
14
+ - Discover the Runtime's `Message` Schema as JSON Schema so agents can construct valid payloads without reading the application source
15
+ - Dispatch Messages into the Runtime, singly or as an ordered batch, decoded against your `Message` Schema
16
16
 
17
17
  ## Quick Start
18
18
 
@@ -50,7 +50,7 @@ export default defineConfig({
50
50
  })
51
51
  ```
52
52
 
53
- In your `Runtime.makeApplication` call, pass your `Message` Schema. The runtime decodes every dispatched payload against it, returning a clean error if the shape does not match before it reaches your update function:
53
+ In your `Runtime.makeApplication` call, pass your `Message` Schema. The Runtime decodes every dispatched payload against it, returning a clean error if the shape does not match before it reaches your update function:
54
54
 
55
55
  ```typescript
56
56
  Runtime.makeApplication({
@@ -63,29 +63,29 @@ Runtime.makeApplication({
63
63
 
64
64
  Restart your dev server, then restart your AI agent. The MCP server will appear with the `foldkit_*` tools attached.
65
65
 
66
- The browser bridge runs inside your app, so the MCP server only sees a runtime while the app is open in a browser tab. Close the tab and the runtime disappears from `foldkit_list_runtimes`.
66
+ The browser bridge runs inside your app, so the MCP server only sees a Runtime while the app is open in a browser tab. Close the tab and the Runtime disappears from `foldkit_list_runtimes`.
67
67
 
68
68
  ## Tools
69
69
 
70
- Each tool accepts an optional `runtime_id`. When omitted, the most recently connected runtime is used.
70
+ Each tool accepts an optional `runtime_id`. When omitted, the most recently connected Runtime is used.
71
71
 
72
72
  | Tool | Description |
73
73
  | ------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
74
- | `foldkit_list_runtimes` | Returns metadata for every connected browser tab. Agents call this first to discover which runtime to target. |
74
+ | `foldkit_list_runtimes` | Returns metadata for every connected browser tab. Agents call this first to discover which Runtime to target. |
75
75
  | `foldkit_get_model` | Snapshots the current Model. Accepts an optional `path` to narrow to a subtree and `expand` to control summarization. |
76
- | `foldkit_get_model_at` | Snapshots a historical Model after a given history entry. Pass `index: N - 1` to read the Model just before message `N`. Same `path`/`expand` semantics as `foldkit_get_model`. Indices outside the readable range (older entries are evicted past the rolling buffer) are rejected with the valid bounds. For the initial Model (and the init Commands and Mounts), use `foldkit_get_init`. |
76
+ | `foldkit_get_model_at` | Snapshots a historical Model after a given history entry. Pass `index: N - 1` to read the Model just before Message `N`. Same `path`/`expand` semantics as `foldkit_get_model`. Indices outside the readable range (older entries are evicted past the rolling buffer) are rejected with the valid bounds. For the initial Model (and the init Commands and Mounts), use `foldkit_get_init`. |
77
77
  | `foldkit_get_init` | Reads the recorded initial Model, the Commands returned from the application's `init` function, and the Mounts that fired during the first render. Each Command and Mount carries its declared args. Equivalent to selecting the synthetic "init" row in the DevTools panel. |
78
- | `foldkit_get_runtime_state` | Snapshots the runtime's DevTools state: history bounds, current paused/live status, and whether init is recorded. Useful for understanding what `foldkit_list_messages` and `foldkit_get_message` will see and detecting whether the runtime is paused. |
78
+ | `foldkit_get_runtime_state` | Snapshots the Runtime's DevTools state: history bounds, current paused/live status, and whether init is recorded. Useful for understanding what `foldkit_list_messages` and `foldkit_get_message` will see and detecting whether the Runtime is paused. |
79
79
  | `foldkit_list_messages` | Lists Message history entries. Each entry carries the Message body, Commands triggered (with args), Mounts that started or ended during the resulting render (with args), timestamp, an `isModelChanged` flag, the diff path lists (`changedPaths` / `affectedPaths`), and any extracted Submodel chain. Filter server-side with `changed_paths_match`, read the latest entries with `from_end`, and paginate forward with `since_index`. |
80
80
  | `foldkit_count_messages_by_tag` | Counts retained history entries by Message tag, without payloads, sorted by count descending. A cheap reconnaissance call before paging through history: it surfaces the high-frequency Messages worth filtering out, and with `changed_paths_match` it answers which Message tags touch a Model subtree. |
81
81
  | `foldkit_diff_models` | Diffs the Models at two history indices server-side, returning path-level changes `{ path, before, after }` with summarized values. Each side is `{ _tag: 'Present', value }`, or `{ _tag: 'Absent' }` when the path does not exist on that side. Pass `changed_paths_match` to narrow the diff to a subtree. |
82
82
  | `foldkit_get_message` | Reads one entry at a given index. The response carries the SerializedEntry only; to inspect the Model around the entry, call `foldkit_get_model_at` with `index - 1` (before) and `index` (after). Use `foldkit_get_init` for the synthetic init entry. |
83
83
  | `foldkit_list_keyframes` | Returns the indices Foldkit can replay back to. Index `-1` is the initial Model. |
84
- | `foldkit_replay_to_keyframe` | Time-travels the runtime to a previous state. The runtime is paused at that snapshot until `foldkit_resume` is called. |
84
+ | `foldkit_replay_to_keyframe` | Time-travels the Runtime to a previous state. The Runtime is paused at that snapshot until `foldkit_resume` is called. |
85
85
  | `foldkit_resume` | Resumes normal execution after a replay. |
86
- | `foldkit_get_message_schema` | Describes the runtime's Message Schema so agents can construct valid Messages without reading the application source. With no arguments, returns a small variant index (top-level tag names plus payload fields). With `variant_tag` set to a dot-separated path of variant tags (e.g. `"GotChildMessage.Opened"`), narrows the JSON Schema along the chain and collapses deeper unions to summary placeholders. Returns `maybeResult: None` when the runtime hasn't configured `DevToolsConfig.Message`. |
87
- | `foldkit_dispatch_message` | Dispatches a Message into the runtime as if your application produced it. The runtime decodes the payload against your Schema and returns a clean error if it does not match. |
88
- | `foldkit_dispatch_messages` | Dispatches an ordered batch of 1 to 100 Messages in one call, first to last. The runtime validates every payload before dispatching any of them, so one invalid entry rejects the whole batch with its zero-based position and nothing is dispatched. The response reports the predicted history index for each Message. |
86
+ | `foldkit_get_message_schema` | Describes the Runtime's Message Schema so agents can construct valid Messages without reading the application source. With no arguments, returns a small variant index (top-level tag names plus payload fields). With `variant_tag` set to a dot-separated path of variant tags (e.g. `"GotChildMessage.Opened"`), narrows the JSON Schema along the chain and collapses deeper unions to summary placeholders. Returns `maybeResult: None` when the Runtime hasn't configured `DevToolsConfig.Message`. |
87
+ | `foldkit_dispatch_message` | Dispatches a Message into the Runtime as if your application produced it. The Runtime decodes the payload against your Schema and returns a clean error if it does not match. |
88
+ | `foldkit_dispatch_messages` | Dispatches an ordered batch of 1 to 100 Messages in one call, first to last. The Runtime validates every payload before dispatching any of them, so one invalid entry rejects the whole batch with its zero-based position and nothing is dispatched. The response reports the predicted history index for each Message. |
89
89
 
90
90
  ### Reading the Model efficiently
91
91
 
@@ -111,7 +111,7 @@ Three components cooperate:
111
111
  - **Vite plugin relay** (in `@foldkit/vite-plugin`): opens a separate WebSocket server on `devToolsMcpPort` and forwards traffic between browsers and MCP clients.
112
112
  - **MCP server** (this package): runs as a Node child process under your AI agent, connects to the plugin's relay over WebSocket, and exposes the typed tools over MCP's stdio transport.
113
113
 
114
- Multiple browser tabs can be connected at once and each is addressable by its connection id. Tabs that close (gracefully or not) are pruned from the live runtime list automatically.
114
+ Multiple browser tabs can be connected at once and each is addressable by its connection id. Tabs that close (gracefully or not) are pruned from the live Runtime list automatically.
115
115
 
116
116
  ## Configuration
117
117
 
@@ -122,7 +122,7 @@ Multiple browser tabs can be connected at once and each is addressable by its co
122
122
 
123
123
  ## Notes
124
124
 
125
- - The MCP bridge shares its lifecycle with Foldkit DevTools. If you set `devTools: false` in your program config, the bridge does not start and the runtime is invisible to MCP. The default enables the bridge in dev.
125
+ - The MCP bridge shares its lifecycle with Foldkit DevTools. If you set `devTools: false` in your program config, the bridge does not start and the Runtime is invisible to MCP. The default enables the bridge in dev.
126
126
  - Without `Message` in your `DevToolsConfig`, dispatch is rejected. The other (read-only) tools still work.
127
127
  - The relay only runs at dev time. Production builds never include the relay or the bridge, regardless of any `show` setting.
128
128
 
package/dist/server.js CHANGED
@@ -1208,8 +1208,8 @@ var require_util = __commonJS({
1208
1208
  })(Type || (exports.Type = Type = {}));
1209
1209
  function getErrorPath(dataProp, dataPropType, jsPropertySyntax) {
1210
1210
  if (dataProp instanceof codegen_1.Name) {
1211
- const isNumber2 = dataPropType === Type.Num;
1212
- return jsPropertySyntax ? isNumber2 ? (0, codegen_1._)`"[" + ${dataProp} + "]"` : (0, codegen_1._)`"['" + ${dataProp} + "']"` : isNumber2 ? (0, codegen_1._)`"/" + ${dataProp}` : (0, codegen_1._)`"/" + ${dataProp}.replace(/~/g, "~0").replace(/\\//g, "~1")`;
1211
+ const isNumber3 = dataPropType === Type.Num;
1212
+ return jsPropertySyntax ? isNumber3 ? (0, codegen_1._)`"[" + ${dataProp} + "]"` : (0, codegen_1._)`"['" + ${dataProp} + "']"` : isNumber3 ? (0, codegen_1._)`"/" + ${dataProp}` : (0, codegen_1._)`"/" + ${dataProp}.replace(/~/g, "~0").replace(/\\//g, "~1")`;
1213
1213
  }
1214
1214
  return jsPropertySyntax ? (0, codegen_1.getProperty)(dataProp).toString() : "/" + escapeJsonPointer(dataProp);
1215
1215
  }
@@ -2991,7 +2991,7 @@ var require_compile = __commonJS({
2991
2991
  const schOrFunc = root.refs[ref];
2992
2992
  if (schOrFunc)
2993
2993
  return schOrFunc;
2994
- let _sch = resolve2.call(this, root, ref);
2994
+ let _sch = resolve3.call(this, root, ref);
2995
2995
  if (_sch === void 0) {
2996
2996
  const schema = (_a2 = root.localRefs) === null || _a2 === void 0 ? void 0 : _a2[ref];
2997
2997
  const { schemaId } = this.opts;
@@ -3018,7 +3018,7 @@ var require_compile = __commonJS({
3018
3018
  function sameSchemaEnv(s1, s2) {
3019
3019
  return s1.schema === s2.schema && s1.root === s2.root && s1.baseId === s2.baseId;
3020
3020
  }
3021
- function resolve2(root, ref) {
3021
+ function resolve3(root, ref) {
3022
3022
  let sch;
3023
3023
  while (typeof (sch = this.refs[ref]) == "string")
3024
3024
  ref = sch;
@@ -3649,7 +3649,7 @@ var require_fast_uri = __commonJS({
3649
3649
  }
3650
3650
  return uri;
3651
3651
  }
3652
- function resolve2(baseURI, relativeURI, options) {
3652
+ function resolve3(baseURI, relativeURI, options) {
3653
3653
  const schemelessOptions = options ? Object.assign({ scheme: "null" }, options) : { scheme: "null" };
3654
3654
  const resolved = resolveComponent(parse4(baseURI, schemelessOptions), parse4(relativeURI, schemelessOptions), schemelessOptions, true);
3655
3655
  schemelessOptions.skipEscape = true;
@@ -3907,7 +3907,7 @@ var require_fast_uri = __commonJS({
3907
3907
  var fastUri = {
3908
3908
  SCHEMES,
3909
3909
  normalize: normalize2,
3910
- resolve: resolve2,
3910
+ resolve: resolve3,
3911
3911
  resolveComponent,
3912
3912
  equal,
3913
3913
  serialize,
@@ -13411,6 +13411,142 @@ var floor = /* @__PURE__ */ dual(isBigDecimalArgs, (self, scale2 = 0) => {
13411
13411
  var Boolean2 = globalThis.Boolean;
13412
13412
  var ReducerOr = /* @__PURE__ */ make((a, b) => a || b, false);
13413
13413
 
13414
+ // ../../node_modules/.pnpm/effect@4.0.0-rc.109/node_modules/effect/dist/SchemaAST.js
13415
+ var SchemaAST_exports = {};
13416
+ __export(SchemaAST_exports, {
13417
+ Any: () => Any,
13418
+ Arrays: () => Arrays,
13419
+ Base: () => Base2,
13420
+ BigInt: () => BigInt4,
13421
+ Boolean: () => Boolean3,
13422
+ Context: () => Context,
13423
+ Declaration: () => Declaration,
13424
+ Enum: () => Enum,
13425
+ FINITE_PATTERN: () => FINITE_PATTERN,
13426
+ Filter: () => Filter2,
13427
+ FilterGroup: () => FilterGroup,
13428
+ IndexSignature: () => IndexSignature,
13429
+ Json: () => Json,
13430
+ Link: () => Link,
13431
+ Literal: () => Literal,
13432
+ MutableJson: () => MutableJson,
13433
+ Never: () => Never,
13434
+ Null: () => Null,
13435
+ Number: () => Number5,
13436
+ ObjectKeyword: () => ObjectKeyword,
13437
+ Objects: () => Objects,
13438
+ PropertySignature: () => PropertySignature,
13439
+ STRING_PATTERN: () => STRING_PATTERN,
13440
+ String: () => String4,
13441
+ Suspend: () => Suspend,
13442
+ Symbol: () => Symbol2,
13443
+ TemplateLiteral: () => TemplateLiteral,
13444
+ Undefined: () => Undefined,
13445
+ Union: () => Union,
13446
+ UniqueSymbol: () => UniqueSymbol,
13447
+ Unknown: () => Unknown,
13448
+ Void: () => Void,
13449
+ annotate: () => annotate,
13450
+ annotateKey: () => annotateKey,
13451
+ any: () => any,
13452
+ appendChecks: () => appendChecks,
13453
+ applyToLastLink: () => applyToLastLink,
13454
+ applyToSelfOrLastLinkEncoding: () => applyToSelfOrLastLinkEncoding,
13455
+ applyToSelfOrLastLinkEncodingIdempotent: () => applyToSelfOrLastLinkEncodingIdempotent,
13456
+ bigInt: () => bigInt,
13457
+ bigIntString: () => bigIntString,
13458
+ boolean: () => boolean,
13459
+ brand: () => brand,
13460
+ collectIssues: () => collectIssues,
13461
+ collectSentinels: () => collectSentinels,
13462
+ containsUndefined: () => containsUndefined,
13463
+ decodeTo: () => decodeTo,
13464
+ defaultParseOptions: () => defaultParseOptions,
13465
+ enumsToLiterals: () => enumsToLiterals,
13466
+ finite: () => finite,
13467
+ flip: () => flip3,
13468
+ getAST: () => getAST,
13469
+ getCandidates: () => getCandidates,
13470
+ getConstructorDescriptor: () => getConstructorDescriptor,
13471
+ getContextOwner: () => getContextOwner,
13472
+ getIndexSignatureKeys: () => getIndexSignatureKeys,
13473
+ getLastEncoding: () => getLastEncoding,
13474
+ isAST: () => isAST,
13475
+ isAny: () => isAny,
13476
+ isArrays: () => isArrays,
13477
+ isBigInt: () => isBigInt2,
13478
+ isBoolean: () => isBoolean2,
13479
+ isDeclaration: () => isDeclaration,
13480
+ isEnum: () => isEnum,
13481
+ isFinite: () => isFinite2,
13482
+ isJson: () => isJson,
13483
+ isLiteral: () => isLiteral,
13484
+ isMutable: () => isMutable,
13485
+ isNever: () => isNever2,
13486
+ isNull: () => isNull2,
13487
+ isNumber: () => isNumber2,
13488
+ isObjectKeyword: () => isObjectKeyword2,
13489
+ isObjects: () => isObjects,
13490
+ isOptional: () => isOptional,
13491
+ isPattern: () => isPattern,
13492
+ isString: () => isString2,
13493
+ isStringBigInt: () => isStringBigInt,
13494
+ isStringFinite: () => isStringFinite,
13495
+ isStringSymbol: () => isStringSymbol,
13496
+ isStringTree: () => isStringTree,
13497
+ isSuspend: () => isSuspend,
13498
+ isSymbol: () => isSymbol2,
13499
+ isTemplateLiteral: () => isTemplateLiteral,
13500
+ isUndefined: () => isUndefined2,
13501
+ isUnion: () => isUnion,
13502
+ isUniqueSymbol: () => isUniqueSymbol,
13503
+ isUnknown: () => isUnknown2,
13504
+ isVoid: () => isVoid,
13505
+ makeFilter: () => makeFilter,
13506
+ makeFilterByGuard: () => makeFilterByGuard,
13507
+ mapLink: () => mapLink,
13508
+ mapOrSame: () => mapOrSame,
13509
+ memoizeThunk: () => memoizeThunk,
13510
+ middlewareDecoding: () => middlewareDecoding,
13511
+ middlewareEncoding: () => middlewareEncoding,
13512
+ mutableKey: () => mutableKey,
13513
+ never: () => never3,
13514
+ null: () => null_,
13515
+ number: () => number2,
13516
+ objectKeyword: () => objectKeyword,
13517
+ objectKeywordToJson: () => objectKeywordToJson,
13518
+ optional: () => optional,
13519
+ optionalKey: () => optionalKey,
13520
+ parameterFromString: () => parameterFromString,
13521
+ record: () => record,
13522
+ replaceChecks: () => replaceChecks,
13523
+ replaceContext: () => replaceContext,
13524
+ replaceContextLastLink: () => replaceContextLastLink,
13525
+ replaceEncoding: () => replaceEncoding,
13526
+ resolve: () => resolve2,
13527
+ resolveAt: () => resolveAt2,
13528
+ resolveDescription: () => resolveDescription2,
13529
+ resolveIdentifier: () => resolveIdentifier2,
13530
+ resolveTitle: () => resolveTitle2,
13531
+ runChecks: () => runChecks,
13532
+ string: () => string2,
13533
+ struct: () => struct,
13534
+ structWithRest: () => structWithRest,
13535
+ symbol: () => symbol3,
13536
+ symbolString: () => symbolString,
13537
+ toEncoded: () => toEncoded,
13538
+ toType: () => toType,
13539
+ tuple: () => tuple,
13540
+ tupleWithRest: () => tupleWithRest,
13541
+ undefined: () => undefined_3,
13542
+ union: () => union2,
13543
+ unknown: () => unknown,
13544
+ unknownToJson: () => unknownToJson,
13545
+ unknownToStringTree: () => unknownToStringTree,
13546
+ void: () => void_5,
13547
+ withConstructorDefault: () => withConstructorDefault
13548
+ });
13549
+
13414
13550
  // ../../node_modules/.pnpm/effect@4.0.0-rc.109/node_modules/effect/dist/Effectable.js
13415
13551
  var Prototype2 = (options) => makePrimitiveProto({
13416
13552
  op: options.label,
@@ -16456,8 +16592,8 @@ var runPromiseExitWith = (context3) => {
16456
16592
  const runFork3 = runForkWith(context3);
16457
16593
  return (effect, options) => {
16458
16594
  const fiber3 = runFork3(effect, options);
16459
- return new Promise((resolve2) => {
16460
- fiber3.addObserver((exit3) => resolve2(exit3));
16595
+ return new Promise((resolve3) => {
16596
+ fiber3.addObserver((exit3) => resolve3(exit3));
16461
16597
  });
16462
16598
  };
16463
16599
  };
@@ -19718,6 +19854,7 @@ var jsonSchemaAnnotationKeys = ["title", "description", "default", "examples", "
19718
19854
  var resolveIdentifier = /* @__PURE__ */ resolveAt("identifier");
19719
19855
  var resolveIdentifierFallback = /* @__PURE__ */ resolveAt(IDENTIFIER_FALLBACK_KEY);
19720
19856
  var resolveTitle = /* @__PURE__ */ resolveAt("title");
19857
+ var resolveDescription = /* @__PURE__ */ resolveAt("description");
19721
19858
  var resolveBrands = /* @__PURE__ */ resolveAt("brands");
19722
19859
  var getExpected = /* @__PURE__ */ memoize((ast) => {
19723
19860
  const identifier2 = resolve(ast)?.identifier;
@@ -20824,10 +20961,26 @@ var dateTimeZonedFromString = /* @__PURE__ */ transformOrFail2({
20824
20961
  function makeGuard(tag4) {
20825
20962
  return (ast) => ast._tag === tag4;
20826
20963
  }
20964
+ function isAST(u) {
20965
+ return hasProperty(u, TypeId17) && u[TypeId17] === TypeId17;
20966
+ }
20827
20967
  var isDeclaration = /* @__PURE__ */ makeGuard("Declaration");
20968
+ var isNull2 = /* @__PURE__ */ makeGuard("Null");
20969
+ var isUndefined2 = /* @__PURE__ */ makeGuard("Undefined");
20970
+ var isVoid = /* @__PURE__ */ makeGuard("Void");
20828
20971
  var isNever2 = /* @__PURE__ */ makeGuard("Never");
20972
+ var isUnknown2 = /* @__PURE__ */ makeGuard("Unknown");
20973
+ var isAny = /* @__PURE__ */ makeGuard("Any");
20974
+ var isString2 = /* @__PURE__ */ makeGuard("String");
20975
+ var isNumber2 = /* @__PURE__ */ makeGuard("Number");
20976
+ var isBoolean2 = /* @__PURE__ */ makeGuard("Boolean");
20977
+ var isBigInt2 = /* @__PURE__ */ makeGuard("BigInt");
20978
+ var isSymbol2 = /* @__PURE__ */ makeGuard("Symbol");
20829
20979
  var isLiteral = /* @__PURE__ */ makeGuard("Literal");
20830
20980
  var isUniqueSymbol = /* @__PURE__ */ makeGuard("UniqueSymbol");
20981
+ var isObjectKeyword2 = /* @__PURE__ */ makeGuard("ObjectKeyword");
20982
+ var isEnum = /* @__PURE__ */ makeGuard("Enum");
20983
+ var isTemplateLiteral = /* @__PURE__ */ makeGuard("TemplateLiteral");
20831
20984
  var isArrays = /* @__PURE__ */ makeGuard("Arrays");
20832
20985
  var isObjects = /* @__PURE__ */ makeGuard("Objects");
20833
20986
  var isUnion = /* @__PURE__ */ makeGuard("Union");
@@ -22354,6 +22507,12 @@ function applyToLastLink(f) {
22354
22507
  function replaceContextLastLink(ast, context3) {
22355
22508
  return applyToLastLink((ast2) => replaceContext(ast2, context3))(ast);
22356
22509
  }
22510
+ function applyToSelfOrLastLinkEncoding(f) {
22511
+ function out(ast) {
22512
+ return ast.encoding ? replaceEncoding(ast, updateLastLink(ast.encoding, out)) : f(ast);
22513
+ }
22514
+ return memoize(out);
22515
+ }
22357
22516
  function applyToSelfOrLastLinkEncodingIdempotent(f, options) {
22358
22517
  function out(ast) {
22359
22518
  if (ast.encoding) {
@@ -22726,6 +22885,11 @@ function getConstructorDescriptor(ast) {
22726
22885
  const getDescriptor = ast.annotations?.[CONSTRUCTOR_ANNOTATION_KEY];
22727
22886
  return isFunction(getDescriptor) ? getDescriptor(ast.typeParameters) : void 0;
22728
22887
  }
22888
+ var resolve2 = resolve;
22889
+ var resolveAt2 = resolveAt;
22890
+ var resolveIdentifier2 = resolveIdentifier;
22891
+ var resolveTitle2 = resolveTitle;
22892
+ var resolveDescription2 = resolveDescription;
22729
22893
  function isJsonLeaf(u) {
22730
22894
  return u === null || typeof u === "string" || typeof u === "boolean" || typeof u === "number" && globalThis.Number.isFinite(u);
22731
22895
  }
@@ -27188,9 +27352,9 @@ function toStandardSchemaV1(self, options) {
27188
27352
  if (exit3) {
27189
27353
  return makeStandardResult(exit3);
27190
27354
  }
27191
- return new Promise((resolve2) => {
27355
+ return new Promise((resolve3) => {
27192
27356
  fiber3.addObserver((exit4) => {
27193
- resolve2(makeStandardResult(exit4));
27357
+ resolve3(makeStandardResult(exit4));
27194
27358
  });
27195
27359
  });
27196
27360
  };
@@ -41114,7 +41278,7 @@ var lazyProcessor = (schema, ctx, _json, params) => {
41114
41278
  seen.ref = innerType;
41115
41279
  };
41116
41280
 
41117
- // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_zod@4.3.6/node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-compat.js
41281
+ // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_supports-color@7.2.0_zod@4.3.6/node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-compat.js
41118
41282
  function isZ4Schema(s) {
41119
41283
  const schema = s;
41120
41284
  return !!schema._zod;
@@ -42569,7 +42733,7 @@ var z = {
42569
42733
  // ../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/classic/external.js
42570
42734
  config(en_default2());
42571
42735
 
42572
- // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_zod@4.3.6/node_modules/@modelcontextprotocol/sdk/dist/esm/types.js
42736
+ // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_supports-color@7.2.0_zod@4.3.6/node_modules/@modelcontextprotocol/sdk/dist/esm/types.js
42573
42737
  var LATEST_PROTOCOL_VERSION = "2025-11-25";
42574
42738
  var SUPPORTED_PROTOCOL_VERSIONS = [LATEST_PROTOCOL_VERSION, "2025-06-18", "2025-03-26", "2024-11-05", "2024-10-07"];
42575
42739
  var RELATED_TASK_META_KEY = "io.modelcontextprotocol/related-task";
@@ -44088,7 +44252,7 @@ var UrlElicitationRequiredError = class extends McpError {
44088
44252
  }
44089
44253
  };
44090
44254
 
44091
- // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_zod@4.3.6/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/interfaces.js
44255
+ // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_supports-color@7.2.0_zod@4.3.6/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/interfaces.js
44092
44256
  function isTerminal(status) {
44093
44257
  return status === "completed" || status === "failed" || status === "cancelled";
44094
44258
  }
@@ -44096,7 +44260,7 @@ function isTerminal(status) {
44096
44260
  // ../../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.3.6/node_modules/zod-to-json-schema/dist/esm/parsers/string.js
44097
44261
  var ALPHA_NUMERIC = new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789");
44098
44262
 
44099
- // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_zod@4.3.6/node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-json-schema-compat.js
44263
+ // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_supports-color@7.2.0_zod@4.3.6/node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-json-schema-compat.js
44100
44264
  function getMethodLiteral(schema) {
44101
44265
  const shape = getObjectShape(schema);
44102
44266
  const methodSchema = shape?.method;
@@ -44117,7 +44281,7 @@ function parseWithCompat(schema, data) {
44117
44281
  return result5.data;
44118
44282
  }
44119
44283
 
44120
- // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_zod@4.3.6/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/protocol.js
44284
+ // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_supports-color@7.2.0_zod@4.3.6/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/protocol.js
44121
44285
  var DEFAULT_REQUEST_TIMEOUT_MSEC = 6e4;
44122
44286
  var Protocol = class {
44123
44287
  constructor(_options) {
@@ -44617,7 +44781,7 @@ var Protocol = class {
44617
44781
  return;
44618
44782
  }
44619
44783
  const pollInterval = task2.pollInterval ?? this._options?.defaultTaskPollInterval ?? 1e3;
44620
- await new Promise((resolve2) => setTimeout(resolve2, pollInterval));
44784
+ await new Promise((resolve3) => setTimeout(resolve3, pollInterval));
44621
44785
  options?.signal?.throwIfAborted();
44622
44786
  }
44623
44787
  } catch (error3) {
@@ -44634,7 +44798,7 @@ var Protocol = class {
44634
44798
  */
44635
44799
  request(request3, resultSchema, options) {
44636
44800
  const { relatedRequestId, resumptionToken, onresumptiontoken, task, relatedTask } = options ?? {};
44637
- return new Promise((resolve2, reject) => {
44801
+ return new Promise((resolve3, reject) => {
44638
44802
  const earlyReject = (error3) => {
44639
44803
  reject(error3);
44640
44804
  };
@@ -44712,7 +44876,7 @@ var Protocol = class {
44712
44876
  if (!parseResult.success) {
44713
44877
  reject(parseResult.error);
44714
44878
  } else {
44715
- resolve2(parseResult.data);
44879
+ resolve3(parseResult.data);
44716
44880
  }
44717
44881
  } catch (error3) {
44718
44882
  reject(error3);
@@ -44973,12 +45137,12 @@ var Protocol = class {
44973
45137
  }
44974
45138
  } catch {
44975
45139
  }
44976
- return new Promise((resolve2, reject) => {
45140
+ return new Promise((resolve3, reject) => {
44977
45141
  if (signal.aborted) {
44978
45142
  reject(new McpError(ErrorCode.InvalidRequest, "Request cancelled"));
44979
45143
  return;
44980
45144
  }
44981
- const timeoutId = setTimeout(resolve2, interval);
45145
+ const timeoutId = setTimeout(resolve3, interval);
44982
45146
  signal.addEventListener("abort", () => {
44983
45147
  clearTimeout(timeoutId);
44984
45148
  reject(new McpError(ErrorCode.InvalidRequest, "Request cancelled"));
@@ -45071,7 +45235,7 @@ function mergeCapabilities(base2, additional) {
45071
45235
  return result5;
45072
45236
  }
45073
45237
 
45074
- // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_zod@4.3.6/node_modules/@modelcontextprotocol/sdk/dist/esm/validation/ajv-provider.js
45238
+ // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_supports-color@7.2.0_zod@4.3.6/node_modules/@modelcontextprotocol/sdk/dist/esm/validation/ajv-provider.js
45075
45239
  var import_ajv = __toESM(require_ajv(), 1);
45076
45240
  var import_ajv_formats = __toESM(require_dist(), 1);
45077
45241
  function createDefaultAjvInstance() {
@@ -45139,7 +45303,7 @@ var AjvJsonSchemaValidator = class {
45139
45303
  }
45140
45304
  };
45141
45305
 
45142
- // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_zod@4.3.6/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/server.js
45306
+ // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_supports-color@7.2.0_zod@4.3.6/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/server.js
45143
45307
  var ExperimentalServerTasks = class {
45144
45308
  constructor(_server) {
45145
45309
  this._server = _server;
@@ -45352,7 +45516,7 @@ var ExperimentalServerTasks = class {
45352
45516
  }
45353
45517
  };
45354
45518
 
45355
- // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_zod@4.3.6/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/helpers.js
45519
+ // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_supports-color@7.2.0_zod@4.3.6/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/helpers.js
45356
45520
  function assertToolsCallTaskCapability(requests, method, entityName) {
45357
45521
  if (!requests) {
45358
45522
  throw new Error(`${entityName} does not support task creation (required for ${method})`);
@@ -45387,7 +45551,7 @@ function assertClientRequestTaskCapability(requests, method, entityName) {
45387
45551
  }
45388
45552
  }
45389
45553
 
45390
- // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_zod@4.3.6/node_modules/@modelcontextprotocol/sdk/dist/esm/server/index.js
45554
+ // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_supports-color@7.2.0_zod@4.3.6/node_modules/@modelcontextprotocol/sdk/dist/esm/server/index.js
45391
45555
  var Server = class extends Protocol {
45392
45556
  /**
45393
45557
  * Initializes this server with the given name and version information.
@@ -45767,10 +45931,10 @@ var Server = class extends Protocol {
45767
45931
  }
45768
45932
  };
45769
45933
 
45770
- // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_zod@4.3.6/node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.js
45934
+ // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_supports-color@7.2.0_zod@4.3.6/node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.js
45771
45935
  import process3 from "node:process";
45772
45936
 
45773
- // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_zod@4.3.6/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/stdio.js
45937
+ // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_supports-color@7.2.0_zod@4.3.6/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/stdio.js
45774
45938
  var ReadBuffer = class {
45775
45939
  append(chunk) {
45776
45940
  this._buffer = this._buffer ? Buffer.concat([this._buffer, chunk]) : chunk;
@@ -45798,7 +45962,7 @@ function serializeMessage(message) {
45798
45962
  return JSON.stringify(message) + "\n";
45799
45963
  }
45800
45964
 
45801
- // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_zod@4.3.6/node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.js
45965
+ // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_supports-color@7.2.0_zod@4.3.6/node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.js
45802
45966
  var StdioServerTransport = class {
45803
45967
  constructor(_stdin = process3.stdin, _stdout = process3.stdout) {
45804
45968
  this._stdin = _stdin;
@@ -45848,12 +46012,12 @@ var StdioServerTransport = class {
45848
46012
  this.onclose?.();
45849
46013
  }
45850
46014
  send(message) {
45851
- return new Promise((resolve2) => {
46015
+ return new Promise((resolve3) => {
45852
46016
  const json2 = serializeMessage(message);
45853
46017
  if (this._stdout.write(json2)) {
45854
- resolve2();
46018
+ resolve3();
45855
46019
  } else {
45856
- this._stdout.once("drain", resolve2);
46020
+ this._stdout.once("drain", resolve3);
45857
46021
  }
45858
46022
  });
45859
46023
  }
@@ -45939,12 +46103,99 @@ var runInit = () => {
45939
46103
  };
45940
46104
 
45941
46105
  // ../foldkit/src/schema/index.ts
45942
- var makeCallable = (schema) => (
45943
- /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions */
45944
- new Proxy(function() {
46106
+ var assignPlainProperty = (output, name, value5) => {
46107
+ if (name === "__proto__") {
46108
+ Object.defineProperty(output, name, {
46109
+ value: value5,
46110
+ writable: true,
46111
+ enumerable: true,
46112
+ configurable: true
46113
+ });
46114
+ } else {
46115
+ output[name] = value5;
46116
+ }
46117
+ };
46118
+ var isDirectlyCopyable = (ast) => {
46119
+ if (ast.checks !== void 0 || ast.encoding !== void 0 || ast.context !== void 0 || ast.annotations?.["parseOptions"] !== void 0) {
46120
+ return false;
46121
+ }
46122
+ return Match_exports.value(ast).pipe(
46123
+ Match_exports.withReturnType(),
46124
+ Match_exports.tagsExhaustive({
46125
+ Declaration: () => false,
46126
+ Null: () => true,
46127
+ Undefined: () => true,
46128
+ Void: () => true,
46129
+ Never: () => true,
46130
+ Unknown: () => true,
46131
+ Any: () => true,
46132
+ String: () => true,
46133
+ Number: () => true,
46134
+ Boolean: () => true,
46135
+ BigInt: () => true,
46136
+ Symbol: () => true,
46137
+ Literal: () => true,
46138
+ UniqueSymbol: () => true,
46139
+ ObjectKeyword: () => true,
46140
+ Enum: () => true,
46141
+ TemplateLiteral: ({ parts: parts2 }) => parts2.every(isDirectlyCopyable),
46142
+ Arrays: () => false,
46143
+ Objects: () => false,
46144
+ Union: ({ mode, types }) => mode !== "oneOf" && types.every(isDirectlyCopyable),
46145
+ Suspend: () => false
46146
+ })
46147
+ );
46148
+ };
46149
+ var getDirectPropertyNames = (propertySignatures) => {
46150
+ const names = [];
46151
+ for (const { name, type: type3 } of propertySignatures) {
46152
+ if (name !== "_tag" && !isDirectlyCopyable(SchemaAST_exports.toType(type3))) {
46153
+ return void 0;
46154
+ }
46155
+ names.push(name);
46156
+ }
46157
+ return names;
46158
+ };
46159
+ var makeCallable = (tag4, fields) => {
46160
+ const schema = Schema_exports.TaggedStruct(tag4, fields);
46161
+ const propertyNames = Object.hasOwn(fields, "_tag") ? void 0 : getDirectPropertyNames(schema.ast.propertySignatures);
46162
+ const make26 = (value5) => schema.make(
46163
+ /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions */
46164
+ value5 ?? {}
46165
+ );
46166
+ const construct = propertyNames !== void 0 ? (value5) => {
46167
+ const input = value5 ?? {};
46168
+ if (Object(input) !== input) {
46169
+ return make26(value5);
46170
+ }
46171
+ const output = {};
46172
+ for (const name of propertyNames) {
46173
+ const descriptor = Object.getOwnPropertyDescriptor(input, name);
46174
+ if (name !== "_tag" && descriptor === void 0 && Reflect.has(input, name)) {
46175
+ return make26(value5);
46176
+ }
46177
+ if (descriptor !== void 0 && !("value" in descriptor)) {
46178
+ return make26(value5);
46179
+ }
46180
+ const inputValue = descriptor === void 0 ? void 0 : input[name];
46181
+ if (name === "_tag") {
46182
+ if (inputValue !== void 0 && inputValue !== tag4) {
46183
+ return make26(value5);
46184
+ }
46185
+ if (descriptor !== void 0 && inputValue === void 0) {
46186
+ assignPlainProperty(output, name, inputValue);
46187
+ }
46188
+ assignPlainProperty(output, name, tag4);
46189
+ } else {
46190
+ assignPlainProperty(output, name, inputValue);
46191
+ }
46192
+ }
46193
+ return output;
46194
+ } : make26;
46195
+ return new Proxy(function() {
45945
46196
  }, {
45946
46197
  apply(_target, _thisArg, argumentsList) {
45947
- return schema.make(argumentsList[0] ?? {});
46198
+ return construct(argumentsList[0]);
45948
46199
  },
45949
46200
  get(_target, property, receiver) {
45950
46201
  return Reflect.get(schema, property, receiver);
@@ -45955,10 +46206,10 @@ var makeCallable = (schema) => (
45955
46206
  getPrototypeOf() {
45956
46207
  return Reflect.getPrototypeOf(schema);
45957
46208
  }
45958
- })
45959
- );
46209
+ });
46210
+ };
45960
46211
  function ts(tag4, fields = {}) {
45961
- return makeCallable(Schema_exports.TaggedStruct(tag4, fields));
46212
+ return makeCallable(tag4, fields);
45962
46213
  }
45963
46214
 
45964
46215
  // ../foldkit/src/devTools/protocol.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@foldkit/devtools-mcp",
3
- "version": "0.16.0",
3
+ "version": "0.16.1-canary.6a5cbafae641",
4
4
  "description": "MCP server exposing Foldkit DevTools to AI agents (Claude Code, Cursor, etc.)",
5
5
  "type": "module",
6
6
  "main": "./dist/server.js",
@@ -17,7 +17,7 @@
17
17
  },
18
18
  "peerDependencies": {
19
19
  "effect": "4.0.0-rc.109",
20
- "foldkit": "^0"
20
+ "foldkit": "0.148.2-canary.6a5cbafae641"
21
21
  },
22
22
  "dependencies": {
23
23
  "@modelcontextprotocol/sdk": "^1.29.0",
@@ -30,7 +30,7 @@
30
30
  "esbuild": "^0.28.1",
31
31
  "rimraf": "^6.1.3",
32
32
  "typescript": "^6.0.3",
33
- "foldkit": "0.146.0"
33
+ "foldkit": "0.148.2-canary.6a5cbafae641"
34
34
  },
35
35
  "files": [
36
36
  "dist"