devframe 0.6.0-beta.2 → 0.6.0-beta.3

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 (58) hide show
  1. package/dist/adapters/build.d.mts +1 -1
  2. package/dist/adapters/build.mjs +2 -2
  3. package/dist/adapters/cli.d.mts +1 -1
  4. package/dist/adapters/cli.mjs +1 -1
  5. package/dist/adapters/dev.d.mts +2 -2
  6. package/dist/adapters/dev.mjs +1 -1
  7. package/dist/adapters/embedded.d.mts +1 -1
  8. package/dist/adapters/mcp.d.mts +1 -1
  9. package/dist/adapters/mcp.mjs +3 -3
  10. package/dist/client/index.d.mts +2 -2
  11. package/dist/client/index.mjs +56 -22
  12. package/dist/constants.d.mts +24 -1
  13. package/dist/constants.mjs +26 -1
  14. package/dist/{context-BEVByy_Z.d.mts → context-B_I9fMBc.d.mts} +1 -1
  15. package/dist/{context-3x_bgBgZ.mjs → context-CKJheEtf.mjs} +2 -2
  16. package/dist/{dev-BaX8fLH2.mjs → dev-DSxKFn-v.mjs} +4 -4
  17. package/dist/{devframe-D-gr9sBx.d.mts → devframe-DgvncQy2.d.mts} +19 -3
  18. package/dist/{dump-DoXkj4ku.mjs → dump-D09PZb7T.mjs} +14 -4
  19. package/dist/{hash-DFc5WwhO.mjs → hash-PAfnyu2k.mjs} +1 -1
  20. package/dist/helpers/vite.d.mts +1 -1
  21. package/dist/helpers/vite.mjs +2 -2
  22. package/dist/{host-h3-C5SZlk03.mjs → host-h3-Dsf-Tgwx.mjs} +37 -11
  23. package/dist/index-B4lNDq5v.d.mts +107 -0
  24. package/dist/{index-CxaPKDXX.d.mts → index-Dy6GFDRf.d.mts} +1 -0
  25. package/dist/index.d.mts +2 -2
  26. package/dist/{launch-editor-DPfltGA4.mjs → launch-editor-DIzaS5EG.mjs} +58 -43
  27. package/dist/node/auth.d.mts +2 -64
  28. package/dist/node/auth.mjs +2 -100
  29. package/dist/node/hub-internals.d.mts +2 -2
  30. package/dist/node/hub-internals.mjs +1 -1
  31. package/dist/node/index.d.mts +3 -3
  32. package/dist/node/index.mjs +3 -3
  33. package/dist/recipes/interactive-auth.d.mts +53 -0
  34. package/dist/recipes/interactive-auth.mjs +132 -0
  35. package/dist/recipes/open-helpers.mjs +2 -2
  36. package/dist/{revoke-ENfxWkFK.mjs → revoke-BtQDKTp7.mjs} +1 -1
  37. package/dist/rpc/dump.mjs +1 -1
  38. package/dist/rpc/index.d.mts +2 -2
  39. package/dist/rpc/index.mjs +4 -1
  40. package/dist/rpc/transports/ws-client.mjs +21 -8
  41. package/dist/{server-Dl6TU5LE.mjs → server-BdN41ckC.mjs} +36 -4
  42. package/dist/{server-rX781kz-.d.mts → server-DXPq8q0K.d.mts} +40 -9
  43. package/dist/{shared-state-D4PPieA0.mjs → shared-state-QtMas0NG.mjs} +34 -4
  44. package/dist/state-WX3HT5a3.mjs +101 -0
  45. package/dist/{storage-l2ezeend.mjs → storage-yrUZaiib.mjs} +55 -6
  46. package/dist/types/index.d.mts +2 -2
  47. package/dist/utils/crypto-token.mjs +1 -1
  48. package/dist/utils/events.d.mts +1 -1
  49. package/dist/utils/hash.mjs +1 -1
  50. package/dist/utils/launch-editor.mjs +1 -1
  51. package/dist/utils/open.mjs +1 -1
  52. package/dist/utils/serve-static.mjs +2 -1
  53. package/dist/utils/shared-state.d.mts +1 -1
  54. package/dist/utils/shared-state.mjs +1 -1
  55. package/dist/utils/streaming-channel.d.mts +1 -1
  56. package/dist/utils/when.d.mts +1 -1
  57. package/package.json +10 -9
  58. package/dist/{open-Dusa2Zzd.mjs → open-Deb5xmIT.mjs} +1 -1
@@ -2,6 +2,7 @@ import { t as devframeReporter } from "./diagnostics-reporter-CsIG85Q5.mjs";
2
2
  import { defineDiagnostics } from "nostics";
3
3
  import fs from "node:fs";
4
4
  import { dirname } from "pathe";
5
+ import process$1 from "node:process";
5
6
  import { destr } from "destr";
6
7
  //#region src/node/diagnostics.ts
7
8
  const diagnostics = defineDiagnostics({
@@ -46,6 +47,14 @@ const diagnostics = defineDiagnostics({
46
47
  DF0034: {
47
48
  why: (p) => `Scoped RPC registration for namespace "${p.namespace}" received an already-namespaced function name "${p.name}".`,
48
49
  fix: "A scoped context auto-namespaces ids. Pass a bare name without a \":\" separator (e.g. `register({ name: \"get-cwd\" })`), or use the unscoped `ctx.base.rpc.register` for a fully-qualified name."
50
+ },
51
+ DF0035: {
52
+ why: (p) => `Failed to persist storage file: ${p.filepath}`,
53
+ fix: "Check that the storage directory is writable and has free space."
54
+ },
55
+ DF0036: {
56
+ why: (p) => `RPC call to "${p.name}" was rejected: the caller is not authorized.`,
57
+ fix: "Complete the auth handshake (or connect with a static/pre-shared token) before calling a trusted method. Untrusted callers may only call `anonymous:`-prefixed methods — see `isAnonymousRpcMethod`."
49
58
  }
50
59
  }
51
60
  });
@@ -89,7 +98,7 @@ function createEventEmitter() {
89
98
  };
90
99
  }
91
100
  //#endregion
92
- //#region ../../node_modules/.pnpm/immer@11.1.8/node_modules/immer/dist/immer.mjs
101
+ //#region ../../node_modules/.pnpm/immer@11.1.11/node_modules/immer/dist/immer.mjs
93
102
  var NOTHING = Symbol.for("immer-nothing");
94
103
  var DRAFTABLE = Symbol.for("immer-draftable");
95
104
  var DRAFT_STATE = Symbol.for("immer-state");
@@ -439,6 +448,21 @@ function createProxyProxy(base, parent) {
439
448
  var objectTraps = {
440
449
  get(state, prop) {
441
450
  if (prop === DRAFT_STATE) return state;
451
+ if (prop === "constructor" || prop === "__proto__") {
452
+ const value2 = latest(state)[prop];
453
+ return new Proxy(value2 || {}, {
454
+ get: (target, key) => {
455
+ if (key === "__proto__" || key === "prototype") return Object.freeze(/* @__PURE__ */ Object.create(null));
456
+ return Reflect.get(target, key);
457
+ },
458
+ set: () => {
459
+ return true;
460
+ },
461
+ apply: (target, thisArg, args) => {
462
+ return Reflect.apply(target, thisArg, args);
463
+ }
464
+ });
465
+ }
442
466
  let arrayPlugin = state.scope_.arrayMethodsPlugin_;
443
467
  const isArrayWithStringProp = state.type_ === 1 && typeof prop === "string";
444
468
  if (isArrayWithStringProp) {
@@ -458,12 +482,14 @@ var objectTraps = {
458
482
  return value;
459
483
  },
460
484
  has(state, prop) {
485
+ if (prop === "constructor" || prop === "__proto__" || prop === "prototype") return false;
461
486
  return prop in latest(state);
462
487
  },
463
488
  ownKeys(state) {
464
489
  return Reflect.ownKeys(latest(state));
465
490
  },
466
491
  set(state, prop, value) {
492
+ if (prop === "constructor" || prop === "__proto__" || prop === "prototype") return true;
467
493
  const desc = getDescriptorFromProto(latest(state), prop);
468
494
  if (desc?.set) {
469
495
  desc.set.call(state.draft_, value);
@@ -481,7 +507,7 @@ var objectTraps = {
481
507
  prepareCopy(state);
482
508
  markChanged(state);
483
509
  }
484
- if (state.copy_[prop] === value && (value !== void 0 || prop in state.copy_) || Number.isNaN(value) && Number.isNaN(state.copy_[prop])) return true;
510
+ if (state.copy_[prop] === value && (value !== void 0 || has(state.copy_, prop, state.type_)) || Number.isNaN(value) && Number.isNaN(state.copy_[prop])) return true;
485
511
  state.copy_[prop] = value;
486
512
  state.assigned_.set(prop, true);
487
513
  handleCrossReference(state, prop, value);
@@ -992,6 +1018,19 @@ function nanoid(size = 21) {
992
1018
  }
993
1019
  //#endregion
994
1020
  //#region src/utils/shared-state.ts
1021
+ /**
1022
+ * Upper bound on retained syncIds. Loop echoes arrive near-immediately, so a
1023
+ * generous window preserves de-dup while capping memory on long-lived,
1024
+ * frequently-mutated states (e.g. a 1s terminal poll).
1025
+ */
1026
+ const MAX_SYNC_IDS = 1e3;
1027
+ function rememberSyncId(syncIds, syncId) {
1028
+ syncIds.add(syncId);
1029
+ if (syncIds.size > MAX_SYNC_IDS) {
1030
+ const oldest = syncIds.values().next().value;
1031
+ if (oldest !== void 0) syncIds.delete(oldest);
1032
+ }
1033
+ }
995
1034
  function createSharedState(options) {
996
1035
  const { enablePatches: enablePatches$1 = false } = options;
997
1036
  const events = createEventEmitter();
@@ -1004,12 +1043,12 @@ function createSharedState(options) {
1004
1043
  if (syncIds.has(syncId)) return;
1005
1044
  enablePatches();
1006
1045
  state = applyPatches(state, patches);
1007
- syncIds.add(syncId);
1046
+ rememberSyncId(syncIds, syncId);
1008
1047
  events.emit("updated", state, void 0, syncId);
1009
1048
  },
1010
1049
  mutate: (fn, syncId = nanoid()) => {
1011
1050
  if (syncIds.has(syncId)) return;
1012
- syncIds.add(syncId);
1051
+ rememberSyncId(syncIds, syncId);
1013
1052
  if (enablePatches$1) {
1014
1053
  const [newState, patches] = produceWithPatches(state, fn);
1015
1054
  state = newState;
@@ -1132,8 +1171,18 @@ function createStorage(options) {
1132
1171
  enablePatches: false
1133
1172
  });
1134
1173
  state.on("updated", debounce((newState) => {
1135
- fs.mkdirSync(dirname(options.filepath), { recursive: true });
1136
- fs.writeFileSync(options.filepath, `${JSON.stringify(newState, null, 2)}\n`);
1174
+ try {
1175
+ const dir = dirname(options.filepath);
1176
+ fs.mkdirSync(dir, { recursive: true });
1177
+ const tmp = `${options.filepath}.${process$1.pid}.tmp`;
1178
+ fs.writeFileSync(tmp, `${JSON.stringify(newState, null, 2)}\n`);
1179
+ fs.renameSync(tmp, options.filepath);
1180
+ } catch (error) {
1181
+ diagnostics.DF0035({
1182
+ filepath: options.filepath,
1183
+ cause: error
1184
+ }, { method: "error" });
1185
+ }
1137
1186
  }, debounceTime));
1138
1187
  return state;
1139
1188
  }
@@ -1,4 +1,4 @@
1
- import { $ as ScopedServerFunctions, G as DevframeScopedNodeContext, H as EntriesToObject, J as DevframeSettings, K as DevframeScopedNodeRpc, Q as ScopedClientFunctions, S as RpcStreamingHost, St as EventsMap, U as PartialWithoutId, W as Thenable, X as DevframeSettingsStore, Y as DevframeSettingsRegistry, Z as ScopedBroadcastOptions, _ as RpcFunctionsHost, _t as AgentToolInput, a as DevframeDuplicationStrategy, at as DevframeRpcSharedStates, b as RpcStreamingChannel, bt as EventEmitter, c as DevframeSpaOptions, ct as DevframeDiagnosticsDefinition, d as ConnectionMeta, dt as AgentHandle, et as ScopedSharedStates, f as ConnectionMetaWebsocket, ft as AgentManifest, g as RpcBroadcastOptions, gt as AgentTool, h as DevframeNodeRpcSession, ht as AgentResourceInput, i as DevframeDeploymentKind, it as DevframeRpcServerFunctions, l as DevframeWsOptions, lt as DevframeDiagnosticsHost, m as DevframeNodeContext, mt as AgentResourceContent, n as DevframeCliOptions, nt as DevframeViewHost, o as DevframeRuntime, ot as DevframeHost, p as DevframeCapabilities, pt as AgentResource, q as DevframeScopedStreamingHost, r as DevframeDefinition, rt as DevframeRpcClientFunctions, s as DevframeSetupInfo, st as DevframeDefineDiagnosticsOptions, t as DevframeBrowserContext, tt as SettingsForNamespace, u as defineDevframe, ut as DevframeDiagnosticsLogger, v as RpcSharedStateGetOptions, vt as DevframeAgentHost, x as RpcStreamingChannelOptions, xt as EventUnsubscribe, y as RpcSharedStateHost, yt as DevframeAgentHostEvents } from "../devframe-D-gr9sBx.mjs";
1
+ import { $ as ScopedServerFunctions, G as DevframeScopedNodeContext, H as EntriesToObject, J as DevframeSettings, K as DevframeScopedNodeRpc, Q as ScopedClientFunctions, S as RpcStreamingHost, St as EventsMap, U as PartialWithoutId, W as Thenable, X as DevframeSettingsStore, Y as DevframeSettingsRegistry, Z as ScopedBroadcastOptions, _ as RpcFunctionsHost, _t as AgentToolInput, a as DevframeDuplicationStrategy, at as DevframeRpcSharedStates, b as RpcStreamingChannel, bt as EventEmitter, c as DevframeSpaOptions, ct as DevframeDiagnosticsDefinition, d as ConnectionMeta, dt as AgentHandle, et as ScopedSharedStates, f as ConnectionMetaWebsocket, ft as AgentManifest, g as RpcBroadcastOptions, gt as AgentTool, h as DevframeNodeRpcSession, ht as AgentResourceInput, i as DevframeDeploymentKind, it as DevframeRpcServerFunctions, l as DevframeWsOptions, lt as DevframeDiagnosticsHost, m as DevframeNodeContext, mt as AgentResourceContent, n as DevframeCliOptions, nt as DevframeViewHost, o as DevframeRuntime, ot as DevframeHost, p as DevframeCapabilities, pt as AgentResource, q as DevframeScopedStreamingHost, r as DevframeDefinition, rt as DevframeRpcClientFunctions, s as DevframeSetupInfo, st as DevframeDefineDiagnosticsOptions, t as DevframeBrowserContext, tt as SettingsForNamespace, u as defineDevframe, ut as DevframeDiagnosticsLogger, v as RpcSharedStateGetOptions, vt as DevframeAgentHost, x as RpcStreamingChannelOptions, xt as EventUnsubscribe, y as RpcSharedStateHost, yt as DevframeAgentHostEvents } from "../devframe-DgvncQy2.mjs";
2
2
  import { g as RpcFunctionAgentOptions } from "../types-DZEx4ffs.mjs";
3
3
  import { t as DevframeNodeRpcSessionMeta } from "../ws-server-Bc2wBHl-.mjs";
4
- export { AgentHandle, AgentManifest, AgentResource, AgentResourceContent, AgentResourceInput, AgentTool, AgentToolInput, ConnectionMeta, ConnectionMetaWebsocket, DevframeAgentHost, DevframeAgentHostEvents, DevframeBrowserContext, DevframeCapabilities, DevframeCliOptions, DevframeDefineDiagnosticsOptions, DevframeDefinition, DevframeDeploymentKind, DevframeDiagnosticsDefinition, DevframeDiagnosticsHost, DevframeDiagnosticsLogger, DevframeDuplicationStrategy, DevframeHost, DevframeNodeContext, DevframeNodeRpcSession, DevframeNodeRpcSessionMeta, DevframeRpcClientFunctions, DevframeRpcServerFunctions, DevframeRpcSharedStates, DevframeRuntime, DevframeScopedNodeContext, DevframeScopedNodeRpc, DevframeScopedStreamingHost, DevframeSettings, DevframeSettingsRegistry, DevframeSettingsStore, DevframeSetupInfo, DevframeSpaOptions, DevframeViewHost, DevframeWsOptions, EntriesToObject, EventEmitter, EventUnsubscribe, EventsMap, PartialWithoutId, RpcBroadcastOptions, RpcFunctionAgentOptions, RpcFunctionsHost, RpcSharedStateGetOptions, RpcSharedStateHost, RpcStreamingChannel, RpcStreamingChannelOptions, RpcStreamingHost, ScopedBroadcastOptions, ScopedClientFunctions, ScopedServerFunctions, ScopedSharedStates, SettingsForNamespace, Thenable, defineDevframe };
4
+ export { AgentHandle, AgentManifest, AgentResource, AgentResourceContent, AgentResourceInput, AgentTool, AgentToolInput, ConnectionMeta, ConnectionMetaWebsocket, DevframeAgentHost, DevframeAgentHostEvents, DevframeBrowserContext, DevframeCapabilities, DevframeCliOptions, DevframeDefineDiagnosticsOptions, DevframeDefinition, DevframeDeploymentKind, DevframeDiagnosticsDefinition, DevframeDiagnosticsHost, DevframeDiagnosticsLogger, DevframeDuplicationStrategy, DevframeHost, DevframeNodeContext, DevframeNodeRpcSession, type DevframeNodeRpcSessionMeta, DevframeRpcClientFunctions, DevframeRpcServerFunctions, DevframeRpcSharedStates, DevframeRuntime, DevframeScopedNodeContext, DevframeScopedNodeRpc, DevframeScopedStreamingHost, DevframeSettings, DevframeSettingsRegistry, DevframeSettingsStore, DevframeSetupInfo, DevframeSpaOptions, DevframeViewHost, DevframeWsOptions, EntriesToObject, EventEmitter, EventUnsubscribe, EventsMap, PartialWithoutId, RpcBroadcastOptions, type RpcFunctionAgentOptions, RpcFunctionsHost, RpcSharedStateGetOptions, RpcSharedStateHost, RpcStreamingChannel, RpcStreamingChannelOptions, RpcStreamingHost, ScopedBroadcastOptions, ScopedClientFunctions, ScopedServerFunctions, ScopedSharedStates, SettingsForNamespace, Thenable, defineDevframe };
@@ -19,7 +19,7 @@ function randomToken(byteLength = 16) {
19
19
  */
20
20
  function randomDigits(length) {
21
21
  const limit = 250;
22
- const buf = new Uint8Array(1);
22
+ const buf = /* @__PURE__ */ new Uint8Array(1);
23
23
  let out = "";
24
24
  while (out.length < length) {
25
25
  globalThis.crypto.getRandomValues(buf);
@@ -1,4 +1,4 @@
1
- import { St as EventsMap, bt as EventEmitter } from "../devframe-D-gr9sBx.mjs";
1
+ import { St as EventsMap, bt as EventEmitter } from "../devframe-DgvncQy2.mjs";
2
2
 
3
3
  //#region src/utils/events.d.ts
4
4
  /**
@@ -1,2 +1,2 @@
1
- import { t as hash } from "../hash-DFc5WwhO.mjs";
1
+ import { t as hash } from "../hash-PAfnyu2k.mjs";
2
2
  export { hash };
@@ -1,2 +1,2 @@
1
- import { t as launchEditor } from "../launch-editor-DPfltGA4.mjs";
1
+ import { t as launchEditor } from "../launch-editor-DIzaS5EG.mjs";
2
2
  export { launchEditor };
@@ -1,2 +1,2 @@
1
- import { t as open } from "../open-Dusa2Zzd.mjs";
1
+ import { t as open } from "../open-Deb5xmIT.mjs";
2
2
  export { open };
@@ -143,7 +143,8 @@ function serveStaticNodeMiddleware(dir, options) {
143
143
  res.end();
144
144
  return;
145
145
  }
146
- const file = await resolveTarget(absDir, req.url ?? "/", opts.indexNames, opts.single);
146
+ const url = req.url ?? "/";
147
+ const file = await resolveTarget(absDir, url, opts.indexNames, opts.single);
147
148
  if (!file) {
148
149
  if (next) {
149
150
  next();
@@ -1,2 +1,2 @@
1
- import { B as SharedStatePatch, F as ImmutableObject, I as ImmutableSet, L as SharedState, M as Immutable, N as ImmutableArray, P as ImmutableMap, R as SharedStateEvents, V as createSharedState, z as SharedStateOptions } from "../devframe-D-gr9sBx.mjs";
1
+ import { B as SharedStatePatch, F as ImmutableObject, I as ImmutableSet, L as SharedState, M as Immutable, N as ImmutableArray, P as ImmutableMap, R as SharedStateEvents, V as createSharedState, z as SharedStateOptions } from "../devframe-DgvncQy2.mjs";
2
2
  export { Immutable, ImmutableArray, ImmutableMap, ImmutableObject, ImmutableSet, SharedState, SharedStateEvents, SharedStateOptions, SharedStatePatch, createSharedState };
@@ -1,2 +1,2 @@
1
- import { t as createSharedState } from "../shared-state-D4PPieA0.mjs";
1
+ import { t as createSharedState } from "../shared-state-QtMas0NG.mjs";
2
2
  export { createSharedState };
@@ -1,2 +1,2 @@
1
- import { A as createStreamReader, C as BufferedChunk, D as StreamReader, E as StreamErrorPayload, O as StreamSink, T as CreateStreamSinkOptions, j as createStreamSink, k as StreamSinkEvents, w as CreateStreamReaderOptions } from "../devframe-D-gr9sBx.mjs";
1
+ import { A as createStreamReader, C as BufferedChunk, D as StreamReader, E as StreamErrorPayload, O as StreamSink, T as CreateStreamSinkOptions, j as createStreamSink, k as StreamSinkEvents, w as CreateStreamReaderOptions } from "../devframe-DgvncQy2.mjs";
2
2
  export { BufferedChunk, CreateStreamReaderOptions, CreateStreamSinkOptions, StreamErrorPayload, StreamReader, StreamSink, StreamSinkEvents, createStreamReader, createStreamSink };
@@ -381,4 +381,4 @@ declare function evaluateWhen<T extends object, const E extends string>(expressi
381
381
  */
382
382
  declare function resolveContextValue<T extends Record<string, unknown>>(key: string, context: T): unknown;
383
383
  //#endregion
384
- export { EvaluateWhenOptions, WhenContext, type WhenExpression, evaluateWhen, resolveContextValue };
384
+ export { EvaluateWhenOptions, WhenContext, WhenExpression, evaluateWhen, resolveContextValue };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "devframe",
3
3
  "type": "module",
4
- "version": "0.6.0-beta.2",
4
+ "version": "0.6.0-beta.3",
5
5
  "description": "Framework for building generic devframes",
6
6
  "author": "Anthony Fu <anthonyfu117@hotmail.com>",
7
7
  "license": "MIT",
@@ -31,6 +31,7 @@
31
31
  "./node": "./dist/node/index.mjs",
32
32
  "./node/auth": "./dist/node/auth.mjs",
33
33
  "./node/hub-internals": "./dist/node/hub-internals.mjs",
34
+ "./recipes/interactive-auth": "./dist/recipes/interactive-auth.mjs",
34
35
  "./recipes/open-helpers": "./dist/recipes/open-helpers.mjs",
35
36
  "./rpc": "./dist/rpc/index.mjs",
36
37
  "./rpc/client": "./dist/rpc/client.mjs",
@@ -69,32 +70,32 @@
69
70
  }
70
71
  },
71
72
  "dependencies": {
72
- "@valibot/to-json-schema": "^1.7.0",
73
+ "@valibot/to-json-schema": "^1.7.1",
73
74
  "birpc": "^4.0.0",
74
75
  "cac": "^7.0.0",
75
- "crossws": "^0.4.8",
76
+ "crossws": "^0.4.9",
76
77
  "destr": "^2.0.5",
77
78
  "h3": "2.0.1-rc.22",
78
79
  "mrmime": "^2.0.1",
79
80
  "nostics": "^1.1.4",
80
81
  "pathe": "^2.0.3",
81
82
  "ufo": "^1.6.4",
82
- "valibot": "^1.4.1"
83
+ "valibot": "^1.4.2"
83
84
  },
84
85
  "devDependencies": {
85
86
  "@modelcontextprotocol/sdk": "^1.29.0",
86
87
  "get-port-please": "^3.2.0",
87
- "immer": "^11.1.8",
88
- "launch-editor": "^2.13.2",
88
+ "immer": "^11.1.11",
89
+ "launch-editor": "^2.14.1",
89
90
  "mlly": "^1.8.2",
90
- "obug": "^2.1.1",
91
+ "obug": "^2.1.3",
91
92
  "ohash": "^2.0.11",
92
93
  "open": "^11.0.0",
93
94
  "p-limit": "^7.3.0",
94
95
  "perfect-debounce": "^2.1.0",
95
96
  "structured-clone-es": "^2.0.0",
96
- "tinyglobby": "^0.2.16",
97
- "tsdown": "^0.22.0",
97
+ "tinyglobby": "^0.2.17",
98
+ "tsdown": "^0.22.3",
98
99
  "ua-parser-modern": "^0.1.1",
99
100
  "whenexpr": "^0.1.2",
100
101
  "ws": "^8.21.0"
@@ -1,7 +1,7 @@
1
1
  import { promisify } from "node:util";
2
2
  import fs from "node:fs";
3
- import os from "node:os";
4
3
  import process from "node:process";
4
+ import os from "node:os";
5
5
  import path from "node:path";
6
6
  import { fileURLToPath } from "node:url";
7
7
  import childProcess, { execFile } from "node:child_process";