devframe 0.9.9 → 0.9.11

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 (69) hide show
  1. package/dist/{_shared-CK3czkH4.d.mts → _shared-DEAMiPfH.d.mts} +26 -7
  2. package/dist/{_shared-C08SdQRl.mjs → _shared-U8D-xzrp.mjs} +41 -5
  3. package/dist/adapters/build.d.mts +1 -1
  4. package/dist/adapters/build.mjs +13 -26
  5. package/dist/adapters/cac.d.mts +6 -10
  6. package/dist/adapters/cac.mjs +3 -4
  7. package/dist/adapters/dev.d.mts +7 -7
  8. package/dist/adapters/dev.mjs +2 -2
  9. package/dist/adapters/embedded.d.mts +1 -1
  10. package/dist/adapters/initiate.d.mts +5 -4
  11. package/dist/adapters/initiate.mjs +1 -1
  12. package/dist/adapters/mcp.d.mts +1 -1
  13. package/dist/adapters/mcp.mjs +3 -3
  14. package/dist/cli/main.mjs +2 -2
  15. package/dist/client/index.d.mts +1 -1
  16. package/dist/client/index.mjs +7 -1
  17. package/dist/{context-4AIVRLYF.d.mts → context-BBWPLDHh.d.mts} +57 -18
  18. package/dist/{context-CwPUinjn.mjs → context-Bq27SDK-.mjs} +49 -13
  19. package/dist/{context-rgBSPFHS.d.mts → context-_temOGDB.d.mts} +1 -1
  20. package/dist/{context-DIUvJW4D.mjs → context-jXO5vzjH.mjs} +1 -1
  21. package/dist/{dev-Eqq5PX0k.mjs → dev-B32EVw5w.mjs} +49 -35
  22. package/dist/{diagnostics-BMfN8mb1.mjs → diagnostics-DZA6KQ_Z.mjs} +3 -3
  23. package/dist/{services-install-P_DV7VYL.mjs → host-agent-CKqSTEX9.mjs} +8 -155
  24. package/dist/in-page-channel/index.d.mts +1 -1
  25. package/dist/{index-pKl67H6w.d.mts → index-1ezCLThh.d.mts} +2 -2
  26. package/dist/index.d.mts +2 -2
  27. package/dist/{instance-registry-C7-41RSp.mjs → instance-registry-DCq762YJ.mjs} +2 -2
  28. package/dist/{instance-shell-7Z52PE4_.d.mts → instance-shell-BWh0JQuo.d.mts} +2 -2
  29. package/dist/{instance-shell-cdVETpfz.mjs → instance-shell-DvYCwrDy.mjs} +5 -18
  30. package/dist/internal/index.d.mts +11 -9
  31. package/dist/internal/index.mjs +9 -9
  32. package/dist/node/auth.d.mts +2 -2
  33. package/dist/node/auth.mjs +1 -1
  34. package/dist/node/hub-internals.d.mts +2 -2
  35. package/dist/node/hub-internals.mjs +2 -2
  36. package/dist/node/index.d.mts +1 -1
  37. package/dist/node/index.mjs +2 -2
  38. package/dist/recipes/common-rpc-functions.d.mts +1 -1
  39. package/dist/recipes/interactive-auth.d.mts +2 -2
  40. package/dist/recipes/interactive-auth.mjs +2 -2
  41. package/dist/{remote-assets-BIFWOlBW.mjs → remote-assets-DMFzLSoH.mjs} +3 -3
  42. package/dist/rpc/dump.d.mts +17 -1
  43. package/dist/rpc/dump.mjs +2 -2
  44. package/dist/rpc/index.mjs +2 -3
  45. package/dist/rpc/transports/sse-client.mjs +1 -1
  46. package/dist/rpc/transports/sse-server.mjs +1 -1
  47. package/dist/rpc/transports/ws-bun.d.mts +1 -1
  48. package/dist/rpc/transports/ws-client.mjs +1 -1
  49. package/dist/rpc/transports/ws-deno.d.mts +1 -1
  50. package/dist/rpc/transports/ws-server.mjs +1 -1
  51. package/dist/{rpc-core-DVQ7xi89.mjs → rpc-core-CvkU23bQ.mjs} +1 -1
  52. package/dist/{rpc-core-Ceu6AUz8.d.mts → rpc-core-DiCr5etS.d.mts} +2 -2
  53. package/dist/{serialization-DTZnPQ1-.mjs → serialization-DFg5sUt6.mjs} +39 -2
  54. package/dist/services-install-Ben4yh52.mjs +154 -0
  55. package/dist/{state-CeQQWzM-.mjs → state-Mwt6--el.mjs} +13 -5
  56. package/dist/{storage-Dccf_IyD.mjs → storage-B70AXK64.mjs} +2 -2
  57. package/dist/types/index.d.mts +2 -2
  58. package/dist/utils/events.d.mts +1 -1
  59. package/dist/utils/remote-assets.mjs +1 -1
  60. package/dist/utils/serve-static.mjs +1 -1
  61. package/dist/utils/shared-state.d.mts +1 -1
  62. package/dist/utils/streaming-channel.d.mts +1 -1
  63. package/dist/{validation-BOy8IoFZ.mjs → validation-CfV1s0SF.mjs} +1 -1
  64. package/dist/{wire-codec-dcCeXcSo.mjs → wire-codec-BHGt0sSs.mjs} +1 -1
  65. package/dist/{static-DZ8P2Kn7.mjs → write-BuLCrn9h.mjs} +25 -4
  66. package/package.json +2 -6
  67. package/skills/devframe/SKILL.md +5 -3
  68. package/dist/diagnostics-D0EVm5M6.mjs +0 -39
  69. package/dist/{host-h3-BJ4siyz7.mjs → host-h3-BROI6SQ4.mjs} +1 -1
@@ -1,4 +1,4 @@
1
- import { F as DevframeDefinition, G as McpAuthorization, I as DevframeDeploymentKind, K as McpRouteOptions, t as ConnectionMeta } from "./context-4AIVRLYF.mjs";
1
+ import { F as DevframeDefinition, G as McpAuthorization, I as DevframeDeploymentKind, q as McpSetting, t as ConnectionMeta, zt as DevframeAgentHost } from "./context-BBWPLDHh.mjs";
2
2
  //#region src/adapters/_shared.d.ts
3
3
  /**
4
4
  * Resolve the mount base path for a devframe's SPA. Hosted adapters
@@ -38,20 +38,39 @@ interface ResolvedMcpConfig {
38
38
  authorization: McpAuthorization;
39
39
  }
40
40
  /**
41
- * Normalize the `mcp` option (`boolean | McpRouteOptions`) into a
42
- * fully-resolved config, or `undefined` when the MCP route is disabled.
41
+ * Normalize an *explicit* `mcp` setting into a fully-resolved config, or
42
+ * `undefined` when the MCP route is disabled. `'auto'` also resolves to
43
+ * `undefined` here: whether it mounts depends on the live agent surface,
44
+ * which only the mounting adapter can consult (through
45
+ * {@link loadAutoMcpAdapter}) - static resolvers like
46
+ * `resolveMcpConnectionMeta` treat it as unadvertisable.
43
47
  *
44
48
  * An enabled route trusts same-machine callers by default: the authorization
45
49
  * resolves to origin-only (`false`) unless the object config opts into a
46
50
  * bearer/callback identity check. An empty-string bearer is treated as no
47
51
  * bearer (origin-only) rather than a usable credential.
48
52
  */
49
- declare function resolveMcpConfig(mcp: boolean | McpRouteOptions | undefined): ResolvedMcpConfig | undefined;
53
+ declare function resolveMcpConfig(mcp: McpSetting | undefined): ResolvedMcpConfig | undefined;
54
+ /**
55
+ * Resolve the `mcp: 'auto'` default at mount time: import the MCP adapter
56
+ * when the devframe's agent surface is non-empty, or return `undefined`
57
+ * (mount nothing) when the surface is empty - the zero-cost path, loading
58
+ * no MCP code at all. The adapter (and the MCP SDK behind it) loads through
59
+ * `importRuntimeModule`, so it never enters a consumer's bundle graph.
60
+ *
61
+ * Generic like `importRuntimeModule`: the caller names the module type
62
+ * (`typeof import('devframe/adapters/mcp')`) so this shared helper carries
63
+ * no type-level dependency on the MCP adapter.
64
+ */
65
+ declare function loadAutoMcpAdapter<T>(agent: Pick<DevframeAgentHost, 'hasSurface'>): Promise<T | undefined>;
50
66
  /**
51
67
  * Resolve the `mcp` entry a `__connection.json` should advertise for a dev
52
68
  * server started with the given `mcp` option (falling back to `def.cli?.mcp`,
53
69
  * exactly like `createDevServer`), or `undefined` when the route is
54
- * disabled.
70
+ * disabled. `'auto'` (the omitted default) resolves at mount time against
71
+ * the live agent surface, so hand-rolled meta advertises it only for an
72
+ * explicit setting; the adapters advertise the actually-mounted route
73
+ * themselves.
55
74
  *
56
75
  * Hosted bridges that hand-roll their connection meta pass the side-car
57
76
  * `port`: the advertised path becomes absolute (the side-car mounts at `/`)
@@ -59,6 +78,6 @@ declare function resolveMcpConfig(mcp: boolean | McpRouteOptions | undefined): R
59
78
  * stays relative, resolved against `__connection.json`'s own location (the
60
79
  * same-server default).
61
80
  */
62
- declare function resolveMcpConnectionMeta(def: DevframeDefinition, mcp: boolean | McpRouteOptions | undefined, port?: number): ConnectionMeta['mcp'];
81
+ declare function resolveMcpConnectionMeta(def: DevframeDefinition, mcp: McpSetting | undefined, port?: number): ConnectionMeta['mcp'];
63
82
  //#endregion
64
- export { resolveDevServerPort as a, resolveBasePath as i, ResolvedMcpConfig as n, resolveMcpConfig as o, normalizeBasePath as r, resolveMcpConnectionMeta as s, ResolveDevServerPortOptions as t };
83
+ export { resolveBasePath as a, resolveMcpConnectionMeta as c, normalizeBasePath as i, ResolvedMcpConfig as n, resolveDevServerPort as o, loadAutoMcpAdapter as r, resolveMcpConfig as s, ResolveDevServerPortOptions as t };
@@ -1,6 +1,20 @@
1
1
  import "./constants.mjs";
2
+ import { r as importServicePackage } from "./services-install-Ben4yh52.mjs";
2
3
  import { n as getPort } from "./dist-CZXfGEkd.mjs";
3
4
  import { cleanDoubleSlashes, withLeadingSlash, withTrailingSlash, withoutLeadingSlash } from "ufo";
5
+ //#region src/node/import-runtime-module.ts
6
+ /**
7
+ * Resolve and import a package at runtime without adding it to a consumer's
8
+ * bundle graph. First-party adapters use this for modules whose code is
9
+ * needed only when the matching feature is enabled (optional peers, and the
10
+ * MCP adapter with the SDK behind it).
11
+ *
12
+ * @internal
13
+ */
14
+ async function importRuntimeModule(specifier) {
15
+ return await importServicePackage(specifier, [import.meta.url]);
16
+ }
17
+ //#endregion
4
18
  //#region src/adapters/_shared.ts
5
19
  const DEFAULT_PORT = 9999;
6
20
  /**
@@ -36,8 +50,12 @@ async function resolveDevServerPort(def, options = {}) {
36
50
  return getPort(portOptions);
37
51
  }
38
52
  /**
39
- * Normalize the `mcp` option (`boolean | McpRouteOptions`) into a
40
- * fully-resolved config, or `undefined` when the MCP route is disabled.
53
+ * Normalize an *explicit* `mcp` setting into a fully-resolved config, or
54
+ * `undefined` when the MCP route is disabled. `'auto'` also resolves to
55
+ * `undefined` here: whether it mounts depends on the live agent surface,
56
+ * which only the mounting adapter can consult (through
57
+ * {@link loadAutoMcpAdapter}) - static resolvers like
58
+ * `resolveMcpConnectionMeta` treat it as unadvertisable.
41
59
  *
42
60
  * An enabled route trusts same-machine callers by default: the authorization
43
61
  * resolves to origin-only (`false`) unless the object config opts into a
@@ -45,7 +63,7 @@ async function resolveDevServerPort(def, options = {}) {
45
63
  * bearer (origin-only) rather than a usable credential.
46
64
  */
47
65
  function resolveMcpConfig(mcp) {
48
- if (!mcp) return void 0;
66
+ if (!mcp || mcp === "auto") return void 0;
49
67
  if (mcp === true) return { authorization: false };
50
68
  const authorization = typeof mcp.authorization === "string" && mcp.authorization.length === 0 ? false : mcp.authorization ?? false;
51
69
  return {
@@ -55,10 +73,28 @@ function resolveMcpConfig(mcp) {
55
73
  };
56
74
  }
57
75
  /**
76
+ * Resolve the `mcp: 'auto'` default at mount time: import the MCP adapter
77
+ * when the devframe's agent surface is non-empty, or return `undefined`
78
+ * (mount nothing) when the surface is empty - the zero-cost path, loading
79
+ * no MCP code at all. The adapter (and the MCP SDK behind it) loads through
80
+ * `importRuntimeModule`, so it never enters a consumer's bundle graph.
81
+ *
82
+ * Generic like `importRuntimeModule`: the caller names the module type
83
+ * (`typeof import('devframe/adapters/mcp')`) so this shared helper carries
84
+ * no type-level dependency on the MCP adapter.
85
+ */
86
+ async function loadAutoMcpAdapter(agent) {
87
+ if (!agent.hasSurface()) return void 0;
88
+ return await importRuntimeModule("devframe/adapters/mcp");
89
+ }
90
+ /**
58
91
  * Resolve the `mcp` entry a `__connection.json` should advertise for a dev
59
92
  * server started with the given `mcp` option (falling back to `def.cli?.mcp`,
60
93
  * exactly like `createDevServer`), or `undefined` when the route is
61
- * disabled.
94
+ * disabled. `'auto'` (the omitted default) resolves at mount time against
95
+ * the live agent surface, so hand-rolled meta advertises it only for an
96
+ * explicit setting; the adapters advertise the actually-mounted route
97
+ * themselves.
62
98
  *
63
99
  * Hosted bridges that hand-roll their connection meta pass the side-car
64
100
  * `port`: the advertised path becomes absolute (the side-car mounts at `/`)
@@ -76,4 +112,4 @@ function resolveMcpConnectionMeta(def, mcp, port) {
76
112
  } : { path: route };
77
113
  }
78
114
  //#endregion
79
- export { resolveMcpConnectionMeta as a, resolveMcpConfig as i, resolveBasePath as n, resolveDevServerPort as r, normalizeBasePath as t };
115
+ export { resolveMcpConfig as a, resolveDevServerPort as i, normalizeBasePath as n, resolveMcpConnectionMeta as o, resolveBasePath as r, importRuntimeModule as s, loadAutoMcpAdapter as t };
@@ -1,4 +1,4 @@
1
- import { F as DevframeDefinition, V as DevframeSnapshotRpcEntry, o as DevframeNodeContext } from "../context-4AIVRLYF.mjs";
1
+ import { F as DevframeDefinition, V as DevframeSnapshotRpcEntry, o as DevframeNodeContext } from "../context-BBWPLDHh.mjs";
2
2
  import { o as StaticAssetsSource } from "../remote-assets-eBvSKZMS.mjs";
3
3
  //#region src/adapters/build.d.ts
4
4
  interface CreateBuildOptions {
@@ -1,17 +1,15 @@
1
1
  import { s as colors } from "../nostics-D0PvLZsn.mjs";
2
- import { n as strictJsonStringify } from "../serialization-DTZnPQ1-.mjs";
3
2
  import { t as resolveClientAssets } from "../client-assets-DNdhagGm.mjs";
4
- import { DEVFRAME_CONNECTION_META_FILENAME, DEVFRAME_RPC_DUMP_DIRNAME, DEVFRAME_RPC_DUMP_MANIFEST_FILENAME } from "../constants.mjs";
5
- import { t as collectStaticRpcDump } from "../static-DZ8P2Kn7.mjs";
6
- import { n as structuredCloneStringify } from "../structured-clone-CbAV5rFI.mjs";
7
- import { t as diagnostics } from "../diagnostics-BMfN8mb1.mjs";
8
- import { t as createHostContext } from "../context-CwPUinjn.mjs";
9
- import { t as resolveStaticAssetsSource } from "../remote-assets-BIFWOlBW.mjs";
10
- import { t as createH3DevframeHost } from "../host-h3-BJ4siyz7.mjs";
3
+ import { DEVFRAME_CONNECTION_META_FILENAME, DEVFRAME_RPC_DUMP_MANIFEST_FILENAME } from "../constants.mjs";
4
+ import { n as collectStaticRpcDump, t as writeStaticRpcDump } from "../write-BuLCrn9h.mjs";
5
+ import { t as diagnostics } from "../diagnostics-DZA6KQ_Z.mjs";
6
+ import { t as createHostContext } from "../context-Bq27SDK-.mjs";
7
+ import { t as resolveStaticAssetsSource } from "../remote-assets-DMFzLSoH.mjs";
8
+ import { t as createH3DevframeHost } from "../host-h3-BROI6SQ4.mjs";
9
+ import fs from "node:fs/promises";
10
+ import { resolve } from "pathe";
11
11
  import process from "node:process";
12
- import { dirname, resolve } from "pathe";
13
12
  import { existsSync } from "node:fs";
14
- import fs$1 from "node:fs/promises";
15
13
  //#region src/adapters/build.ts
16
14
  /**
17
15
  * Produce a self-contained static deploy of a devframe:
@@ -29,8 +27,8 @@ async function createBuild(d, options = {}) {
29
27
  const outDir = resolve(options.outDir ?? "dist-static");
30
28
  const distSource = options.distDir ?? resolveClientAssets(d);
31
29
  if (!distSource) throw new Error(`[devframe] createBuild: no client assets for "${d.id}". Set \`clientAssets\` on the definition or pass it as an option.`);
32
- if (existsSync(outDir)) await fs$1.rm(outDir, { recursive: true });
33
- await fs$1.mkdir(outDir, { recursive: true });
30
+ if (existsSync(outDir)) await fs.rm(outDir, { recursive: true });
31
+ await fs.mkdir(outDir, { recursive: true });
34
32
  const host = createH3DevframeHost({
35
33
  origin: "http://localhost",
36
34
  appName: d.id
@@ -46,19 +44,17 @@ async function createBuild(d, options = {}) {
46
44
  await ctx.services.ready();
47
45
  await d.setup(ctx);
48
46
  applySnapshotRpc(ctx, d.rpc?.snapshot);
49
- await fs$1.mkdir(resolve(outDir, DEVFRAME_RPC_DUMP_DIRNAME), { recursive: true });
50
47
  await writeConnectionMeta(ctx, outDir);
51
48
  console.log(colors.cyan`[devframe] writing RPC dump to ${resolve(outDir, DEVFRAME_RPC_DUMP_MANIFEST_FILENAME)}`);
52
49
  const dump = await collectStaticRpcDump(ctx.rpc.definitions.values(), ctx);
53
- await writeDumpFiles(dump, outDir, options.pretty ? 2 : void 0);
54
- await fs$1.writeFile(resolve(outDir, DEVFRAME_RPC_DUMP_MANIFEST_FILENAME), JSON.stringify(dump.manifest, null, 2), "utf-8");
50
+ await writeStaticRpcDump(dump, outDir, { pretty: options.pretty });
55
51
  console.log(colors.green`[devframe] built "${d.id}" -> ${outDir}`);
56
52
  }
57
53
  /** Copy a local SPA dist, or materialize a remote assets source, into `outDir`. */
58
54
  async function materializeSpa(resolved, outDir) {
59
55
  if (typeof resolved === "string") {
60
56
  console.log(colors.cyan`[devframe] copying SPA from ${resolved} -> ${outDir}`);
61
- await fs$1.cp(resolved, outDir, { recursive: true });
57
+ await fs.cp(resolved, outDir, { recursive: true });
62
58
  return;
63
59
  }
64
60
  console.log(colors.cyan`[devframe] materializing SPA from ${resolved.assets.package}@${resolved.assets.version} -> ${outDir}`);
@@ -68,20 +64,11 @@ async function materializeSpa(resolved, outDir) {
68
64
  async function writeConnectionMeta(ctx, outDir) {
69
65
  const jsonSerializableMethods = [];
70
66
  for (const def of ctx.rpc.definitions.values()) if (def.jsonSerializable === true) jsonSerializableMethods.push(def.name);
71
- await fs$1.writeFile(resolve(outDir, DEVFRAME_CONNECTION_META_FILENAME), JSON.stringify({
67
+ await fs.writeFile(resolve(outDir, DEVFRAME_CONNECTION_META_FILENAME), JSON.stringify({
72
68
  backend: "static",
73
69
  jsonSerializableMethods
74
70
  }, null, 2), "utf-8");
75
71
  }
76
- /** Encode and write each sharded RPC dump file under `outDir`. */
77
- async function writeDumpFiles(dump, outDir, indent) {
78
- for (const [filepath, file] of Object.entries(dump.files)) {
79
- const fullpath = resolve(outDir, filepath);
80
- await fs$1.mkdir(dirname(fullpath), { recursive: true });
81
- const text = file.serialization === "structured-clone" ? structuredCloneStringify(file.data) : strictJsonStringify(file.data, file.fnName);
82
- await fs$1.writeFile(fullpath, file.serialization === "json" && indent != null ? JSON.stringify(JSON.parse(text), null, indent) : text, "utf-8");
83
- }
84
- }
85
72
  /**
86
73
  * Attach a `dump` to each {@link DevframeRpcOptions.snapshot} target so the
87
74
  * static collector bakes it, even though the (service-owned) definition
@@ -1,4 +1,4 @@
1
- import { Dt as defineCliFlags, Et as InferCliFlags, F as DevframeDefinition, K as McpRouteOptions, Ot as parseCliFlags, Tt as CliFlagsSchema } from "../context-4AIVRLYF.mjs";
1
+ import { Dt as InferCliFlags, Et as CliFlagsSchema, F as DevframeDefinition, Ot as defineCliFlags, kt as parseCliFlags, q as McpSetting } from "../context-BBWPLDHh.mjs";
2
2
  import { CAC } from "cac";
3
3
  import { H3 } from "h3";
4
4
  //#region src/adapters/cac.d.ts
@@ -9,17 +9,13 @@ interface CreateCacOptions {
9
9
  * Expose a route-based MCP server alongside the dev server, speaking the
10
10
  * MCP Streamable-HTTP transport at `<base>__mcp`. Whether to expose MCP is
11
11
  * a hosting decision made at the CLI assembly stage, so it lives here rather
12
- * than on the definition.
12
+ * than on the definition. When unset, falls back to the definition's
13
+ * deprecated `cli.mcp`, then to the `'auto'` default (mount once the agent
14
+ * surface is non-empty). See {@link McpSetting}.
13
15
  *
14
- * - `false` / omitted (default): no MCP route is mounted.
15
- * - `true`: mount at the default `__mcp` route with the loopback origin gate.
16
- * - {@link McpRouteOptions}: customise the route path, origin allow-list, and
17
- * opt into an identity check.
18
- *
19
- * The `--mcp` / `--no-mcp` flags override this per run. Falls back to the
20
- * definition's deprecated `cli.mcp` when unset.
16
+ * The `--mcp` / `--no-mcp` flags override this per run.
21
17
  */
22
- mcp?: boolean | McpRouteOptions;
18
+ mcp?: McpSetting;
23
19
  /**
24
20
  * Final CAC hook invoked after devframe's built-in subcommands and
25
21
  * after the definition's `cli.configure`. Use this to add app-level
@@ -1,8 +1,7 @@
1
1
  import { s as colors } from "../nostics-D0PvLZsn.mjs";
2
- import { r as resolveDevServerPort } from "../_shared-C08SdQRl.mjs";
3
- import { a as importRuntimeModule } from "../instance-shell-cdVETpfz.mjs";
2
+ import { i as resolveDevServerPort, s as importRuntimeModule } from "../_shared-U8D-xzrp.mjs";
4
3
  import { createBuild } from "./build.mjs";
5
- import { t as createDevServer } from "../dev-Eqq5PX0k.mjs";
4
+ import { t as createDevServer } from "../dev-B32EVw5w.mjs";
6
5
  import process from "node:process";
7
6
  import cac$1 from "cac";
8
7
  //#region src/adapters/flags.ts
@@ -96,7 +95,7 @@ function createCac(d, options = {}) {
96
95
  const defaultHost = d.cli?.host ?? "localhost";
97
96
  const command = d.cli?.command ?? d.id;
98
97
  const cli = cac$1(command);
99
- const devCommand = cli.command("[...args]", "Start a local dev server").option("--port <port>", "Port to listen on").option("--host <host>", "Host to bind to", { default: defaultHost }).option("--open", "Open the browser on start").option("--no-open", "Do not open the browser").option("--no-auth", "Disable the interactive authentication gate").option("--mcp", "Expose an MCP server over HTTP at /__mcp (use --no-mcp to disable)");
98
+ const devCommand = cli.command("[...args]", "Start a local dev server").option("--port <port>", "Port to listen on").option("--host <host>", "Host to bind to", { default: defaultHost }).option("--open", "Open the browser on start").option("--no-open", "Do not open the browser").option("--no-auth", "Disable the interactive authentication gate").option("--mcp", "Force the MCP route on (use --no-mcp to disable; default mounts it once agent tools exist)");
100
99
  if (d.cli?.flags) for (const [key, schema] of Object.entries(d.cli.flags)) {
101
100
  const optionName = flagKeyToOption(key);
102
101
  const description = schema.description ?? "";
@@ -1,8 +1,8 @@
1
1
  import { c as DevframeNodeRpcSessionMeta, l as DevframeRpcConnection, n as WsOriginRegistry } from "../ws-server-D2nv68Hg.mjs";
2
- import { F as DevframeDefinition, K as McpRouteOptions, U as DevframeSseOptions, W as DevframeWsOptions, s as DevframeNodeRpcSession, wt as DevframeAuthHandler } from "../context-4AIVRLYF.mjs";
2
+ import { F as DevframeDefinition, Tt as DevframeAuthHandler, U as DevframeSseOptions, W as DevframeWsOptions, q as McpSetting, s as DevframeNodeRpcSession } from "../context-BBWPLDHh.mjs";
3
3
  import { o as StaticAssetsSource } from "../remote-assets-eBvSKZMS.mjs";
4
- import { c as StartedServer } from "../instance-shell-7Z52PE4_.mjs";
5
- import { a as resolveDevServerPort, s as resolveMcpConnectionMeta, t as ResolveDevServerPortOptions } from "../_shared-CK3czkH4.mjs";
4
+ import { c as StartedServer } from "../instance-shell-BWh0JQuo.mjs";
5
+ import { c as resolveMcpConnectionMeta, o as resolveDevServerPort, t as ResolveDevServerPortOptions } from "../_shared-DEAMiPfH.mjs";
6
6
  import { H3 } from "h3";
7
7
  //#region src/adapters/dev.d.ts
8
8
  interface CreateDevServerOptions {
@@ -81,11 +81,11 @@ interface CreateDevServerOptions {
81
81
  auth?: boolean | DevframeAuthHandler;
82
82
  /**
83
83
  * Expose a route-based MCP server on the dev server (Streamable-HTTP).
84
- * Overrides `def.cli?.mcp`; `undefined` falls through to it. `false`
85
- * disables the route regardless of the definition default. See
86
- * {@link McpRouteOptions}.
84
+ * Overrides `def.cli?.mcp`; `undefined` falls through to it, then to the
85
+ * `'auto'` default (mount once the agent surface is non-empty). `false`
86
+ * disables the route regardless. See {@link McpSetting}.
87
87
  */
88
- mcp?: boolean | McpRouteOptions;
88
+ mcp?: McpSetting;
89
89
  /**
90
90
  * Called once per new RPC connection, right after its session is created.
91
91
  * Forwarded verbatim to the underlying transport binding.
@@ -1,3 +1,3 @@
1
- import { a as resolveMcpConnectionMeta, r as resolveDevServerPort } from "../_shared-C08SdQRl.mjs";
2
- import { t as createDevServer } from "../dev-Eqq5PX0k.mjs";
1
+ import { i as resolveDevServerPort, o as resolveMcpConnectionMeta } from "../_shared-U8D-xzrp.mjs";
2
+ import { t as createDevServer } from "../dev-B32EVw5w.mjs";
3
3
  export { createDevServer, resolveDevServerPort, resolveMcpConnectionMeta };
@@ -1,4 +1,4 @@
1
- import { F as DevframeDefinition, o as DevframeNodeContext } from "../context-4AIVRLYF.mjs";
1
+ import { F as DevframeDefinition, o as DevframeNodeContext } from "../context-BBWPLDHh.mjs";
2
2
  //#region src/adapters/embedded.d.ts
3
3
  interface CreateEmbeddedOptions {
4
4
  /** Target context the devframe is registered into. Required. */
@@ -1,7 +1,7 @@
1
1
  import { c as DevframeNodeRpcSessionMeta, l as DevframeRpcConnection, n as WsOriginRegistry } from "../ws-server-D2nv68Hg.mjs";
2
- import { F as DevframeDefinition, K as McpRouteOptions, U as DevframeSseOptions, W as DevframeWsOptions, o as DevframeNodeContext, s as DevframeNodeRpcSession, t as ConnectionMeta, wt as DevframeAuthHandler, xt as DevframeStorageScope } from "../context-4AIVRLYF.mjs";
2
+ import { F as DevframeDefinition, St as DevframeStorageScope, Tt as DevframeAuthHandler, U as DevframeSseOptions, W as DevframeWsOptions, o as DevframeNodeContext, q as McpSetting, s as DevframeNodeRpcSession, t as ConnectionMeta } from "../context-BBWPLDHh.mjs";
3
3
  import { o as StaticAssetsSource } from "../remote-assets-eBvSKZMS.mjs";
4
- import { c as StartedServer, f as DevframeInstanceRecord } from "../instance-shell-7Z52PE4_.mjs";
4
+ import { c as StartedServer, f as DevframeInstanceRecord } from "../instance-shell-BWh0JQuo.mjs";
5
5
  import { Buffer } from "node:buffer";
6
6
  import { IncomingMessage, Server, ServerResponse } from "node:http";
7
7
  import { Duplex } from "node:stream";
@@ -73,9 +73,10 @@ interface InitDevframeOptions {
73
73
  /**
74
74
  * Expose a route-based MCP server (Streamable-HTTP) at `<base>__mcp` and
75
75
  * advertise it in `__connection.json`. Overrides `def.cli?.mcp`;
76
- * `undefined` falls through to it. See {@link McpRouteOptions}.
76
+ * `undefined` falls through to it, then to the `'auto'` default (mount
77
+ * once the agent surface is non-empty). See {@link McpSetting}.
77
78
  */
78
- mcp?: boolean | McpRouteOptions;
79
+ mcp?: McpSetting;
79
80
  /**
80
81
  * Public origin the host app is reachable at (e.g. `http://localhost:3000`),
81
82
  * or a getter for hosts that resolve it late. Backs the auth banner's magic
@@ -1,2 +1,2 @@
1
- import { n as getInstanceInternals, r as initDevframe } from "../dev-Eqq5PX0k.mjs";
1
+ import { n as getInstanceInternals, r as initDevframe } from "../dev-B32EVw5w.mjs";
2
2
  export { getInstanceInternals, initDevframe };
@@ -1,4 +1,4 @@
1
- import { F as DevframeDefinition, G as McpAuthorization, o as DevframeNodeContext } from "../context-4AIVRLYF.mjs";
1
+ import { F as DevframeDefinition, G as McpAuthorization, o as DevframeNodeContext } from "../context-BBWPLDHh.mjs";
2
2
  import { H3 } from "h3";
3
3
  import "@modelcontextprotocol/server";
4
4
  //#region src/adapters/mcp/build-server.d.ts
@@ -2,11 +2,11 @@ import { t as Diagnostic } from "../nostics-D0PvLZsn.mjs";
2
2
  import { t as DEVFRAME_EVENTS } from "../events-BV4Dj59a.mjs";
3
3
  import { t as isAllowedOrigin } from "../origin-DZit9g29.mjs";
4
4
  import { r as timingSafeEqual } from "../crypto-token-TVbGGFuj.mjs";
5
- import { t as diagnostics } from "../diagnostics-BMfN8mb1.mjs";
6
- import { t as createHostContext } from "../context-CwPUinjn.mjs";
5
+ import { t as diagnostics } from "../diagnostics-DZA6KQ_Z.mjs";
6
+ import { t as createHostContext } from "../context-Bq27SDK-.mjs";
7
7
  import { t as toAgentToolName } from "../agent-tool-name-DGzeuWcO.mjs";
8
- import process from "node:process";
9
8
  import { join } from "pathe";
9
+ import process from "node:process";
10
10
  import { homedir } from "node:os";
11
11
  import { defineHandler } from "h3";
12
12
  import { Server, createMcpHandler } from "@modelcontextprotocol/server";
package/dist/cli/main.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import { t as Diagnostic } from "../nostics-D0PvLZsn.mjs";
2
- import { t as diagnostics } from "../diagnostics-BMfN8mb1.mjs";
3
- import { n as listLiveDevframeInstances, r as probeDevframeOrigin } from "../instance-registry-C7-41RSp.mjs";
2
+ import { t as diagnostics } from "../diagnostics-DZA6KQ_Z.mjs";
3
+ import { n as listLiveDevframeInstances, r as probeDevframeOrigin } from "../instance-registry-DCq762YJ.mjs";
4
4
  import { t as toAgentToolName } from "../agent-tool-name-DGzeuWcO.mjs";
5
5
  import process from "node:process";
6
6
  import { joinURL } from "ufo";
@@ -1,6 +1,6 @@
1
1
  import { f as RpcCacheManager, p as RpcCacheOptions } from "../index-pIVt92jP.mjs";
2
2
  import { _ as RpcFunctionDefinition, w as RpcFunctionsCollector } from "../types-Dq4i156u.mjs";
3
- import { $ as DevframeServiceScopeOf, Bt as EventEmitter, Z as DevframeServiceMeta, _t as DevframeRpcClientFunctions, b as StreamSink, d as RpcSharedStateHost, ft as ScopedRpcFn, ht as SettingsForNamespace, k as SharedState, mt as ScopedSharedStates, pt as ScopedServerFunctions, rt as DevframeServicesState, st as DevframeSettings, t as ConnectionMeta, u as RpcSharedStateGetOptions, vt as DevframeRpcServerFunctions, y as StreamReader } from "../context-4AIVRLYF.mjs";
3
+ import { Q as DevframeServiceMeta, Vt as EventEmitter, b as StreamSink, ct as DevframeSettings, d as RpcSharedStateHost, et as DevframeServiceScopeOf, gt as SettingsForNamespace, ht as ScopedSharedStates, it as DevframeServicesState, k as SharedState, mt as ScopedServerFunctions, pt as ScopedRpcFn, t as ConnectionMeta, u as RpcSharedStateGetOptions, vt as DevframeRpcClientFunctions, y as StreamReader, yt as DevframeRpcServerFunctions } from "../context-BBWPLDHh.mjs";
4
4
  import { t as SseRpcChannelOptions } from "../sse-client-BQ4jS3eO.mjs";
5
5
  import { t as WsRpcChannelOptions } from "../ws-client-Xpxt0oPA.mjs";
6
6
  import { BirpcOptions, BirpcReturn } from "birpc";
@@ -533,9 +533,15 @@ async function setupDevframeConnection(options = {}) {
533
533
  const response = await fetch(metaPath);
534
534
  if (!response.ok) throw new Error(`Failed to fetch connection meta from ${metaUrl}: ${response.status}`);
535
535
  const connectionMeta = await response.json();
536
+ const loadedFrom = response.url || metaUrl;
536
537
  const connection = {
537
538
  connectionMeta,
538
- metaBaseUrl: response.url || metaUrl,
539
+ /**
540
+ * A served `baseUrl` re-points relative resolution (RPC dump shards,
541
+ * transport paths) at the meta that owns them: a static hub build's
542
+ * per-frame meta directs each frame SPA at the hub's own dump.
543
+ */
544
+ metaBaseUrl: connectionMeta.baseUrl ? new URL(connectionMeta.baseUrl, loadedFrom).href : loadedFrom,
539
545
  authToken: readStoredAuthToken(options.authToken ?? connectionMeta.authToken)
540
546
  };
541
547
  storeConnection(connection);
@@ -261,6 +261,13 @@ interface DevframeAgentHost {
261
261
  * tools/resources registered on the host.
262
262
  */
263
263
  list: () => AgentManifest;
264
+ /**
265
+ * Whether the devframe exposes anything to agents: an `agent`-flagged RPC
266
+ * function, a registered tool or resource, or a provider currently
267
+ * yielding at least one tool. The `mcp: 'auto'` default consults this to
268
+ * decide whether a route is worth mounting.
269
+ */
270
+ hasSurface: () => boolean;
264
271
  /**
265
272
  * Invoke any tool by id. Routes to the underlying RPC handler for
266
273
  * `kind === 'rpc'`, or to the registered handler for `kind === 'tool'`.
@@ -677,11 +684,17 @@ interface DevframeRpcSharedStates {
677
684
  //#region src/types/views.d.ts
678
685
  interface DevframeViewHost {
679
686
  /**
687
+ * Static mounts registered through {@link DevframeViewHost.hostStatic}, each
688
+ * carrying the `resolveFrom` base it was mounted with so a build step that
689
+ * copies these itself (rather than serving them live) re-resolves a remote
690
+ * source to the same locally-installed copy it would serve live.
691
+ *
680
692
  * @internal
681
693
  */
682
694
  buildStaticDirs: {
683
695
  baseUrl: string;
684
696
  source: StaticAssetsSource;
697
+ resolveFrom?: string | null;
685
698
  }[];
686
699
  /**
687
700
  * Helper to host static files
@@ -1169,9 +1182,27 @@ interface DevframeSseOptions {
1169
1182
  * - `false`, the default: **origin-only**, trusting same-machine callers.
1170
1183
  */
1171
1184
  type McpAuthorization = string | ((request: Request) => boolean | Promise<boolean>) | false;
1185
+ /**
1186
+ * The route-based MCP setting accepted everywhere a host mounts a devframe
1187
+ * (`cli.mcp`, `initDevframe` / `initHub` / `createDevServer` options, the
1188
+ * framework kits):
1189
+ *
1190
+ * - `'auto'`, the default: mount the route when the devframe exposes an
1191
+ * agent surface (an `agent`-flagged RPC function, or a tool / resource /
1192
+ * provider registered on `ctx.agent`). An empty agent surface mounts
1193
+ * nothing and loads no MCP code.
1194
+ * - `true`: always mount at the default `__mcp` route.
1195
+ * - `false`: never mount.
1196
+ * - {@link McpRouteOptions}: always mount, with a custom route path, origin
1197
+ * allow-list, or {@link McpAuthorization} identity check.
1198
+ *
1199
+ * A mounted route trusts same-machine callers by default (the loopback
1200
+ * origin gate), exactly like `mcp: true`.
1201
+ */
1202
+ type McpSetting = boolean | 'auto' | McpRouteOptions;
1172
1203
  /**
1173
1204
  * Configuration for the route-based MCP server mounted alongside the dev
1174
- * server (opt-in via {@link DevframeCliOptions.mcp}). The endpoint speaks
1205
+ * server (via {@link DevframeCliOptions.mcp}). The endpoint speaks
1175
1206
  * the MCP Streamable-HTTP transport over the same origin as the SPA,
1176
1207
  * exposing the definition's `ctx.agent` tools + shared-state resources to
1177
1208
  * external MCP clients connected to the *running* server.
@@ -1253,11 +1284,11 @@ interface DevframeCliOptions {
1253
1284
  * base path). It surfaces the same `ctx.agent` tools + shared-state
1254
1285
  * resources as the stdio `mcp` command, but against the live server.
1255
1286
  *
1256
- * - `false` / omitted (default): no MCP route is mounted.
1257
- * - `true`: mount at the default `__mcp` route with the loopback origin
1258
- * gate (trusting same-machine callers).
1259
- * - {@link McpRouteOptions}: customise the route path, origin allow-list,
1260
- * and opt into an {@link McpAuthorization} identity check.
1287
+ * Defaults to `'auto'`: the route mounts once the devframe exposes an
1288
+ * agent surface (an `agent`-flagged RPC, a registered tool / resource).
1289
+ * See {@link McpSetting} for the full contract, and
1290
+ * {@link McpRouteOptions} for the route path, origin allow-list, and
1291
+ * {@link McpAuthorization} identity check.
1261
1292
  *
1262
1293
  * The `--mcp` / `--no-mcp` CLI flags override this per run. Whether to expose
1263
1294
  * MCP is a hosting decision, so programmatic hosts pass it to
@@ -1268,7 +1299,7 @@ interface DevframeCliOptions {
1268
1299
  * This field is still read as a fallback, and will be removed in a future
1269
1300
  * release.
1270
1301
  */
1271
- mcp?: boolean | McpRouteOptions;
1302
+ mcp?: McpSetting;
1272
1303
  /**
1273
1304
  * Author's SPA dist, served as the devframe's UI.
1274
1305
  *
@@ -1461,10 +1492,11 @@ interface DevframeDefinition {
1461
1492
  * act on a `false` before doing any work:
1462
1493
  *
1463
1494
  * - `build: false`: `createCac` skips registering the `build` subcommand,
1464
- * and `createBuild` refuses (throws `DF0042`) unless `{ force: true }`.
1465
- * Useful for a devframe whose value is inherently live (e.g. it manages
1466
- * real files on disk), so a static export would only ever produce a
1467
- * broken, write-less shell of the tool.
1495
+ * `createBuild` refuses (throws `DF0042`) unless `{ force: true }`, and
1496
+ * a hub static build (`buildHub`) silently skips the devframe - no dock,
1497
+ * no SPA copy, no RPCs in the dump. Useful for a devframe whose value is
1498
+ * inherently live (e.g. it manages real files on disk), so a static
1499
+ * export would only ever produce a broken, write-less shell of the tool.
1468
1500
  * - `dev: false`: `createDevServer` refuses (throws `DF0058`) unless
1469
1501
  * `{ force: true }`. Useful for a devframe that only makes sense as a
1470
1502
  * static export (e.g. a report generator with nothing to serve live).
@@ -2060,12 +2092,19 @@ interface ConnectionMeta {
2060
2092
  */
2061
2093
  jsonSerializableMethods?: string[];
2062
2094
  /**
2063
- * Absolute URL of the `__connection.json` this meta was loaded from.
2064
- * Annotated by the client (not served) when it publishes the meta on a
2065
- * shared window for same-origin inheritance: a relative `websocket.path`
2066
- * resolves against this, so a child SPA mounted at another base (e.g. a hub
2067
- * mounting several devframes at `/__foo/`, `/__bar/`, …) inherits a dialable
2068
- * endpoint rather than resolving the path against its own mount.
2095
+ * URL of the `__connection.json` that owns this meta's relative paths.
2096
+ * Two producers write it:
2097
+ *
2098
+ * - The client annotates it (absolute) when it publishes the meta on a
2099
+ * shared window for same-origin inheritance: a relative
2100
+ * `websocket.path` resolves against this, so a child SPA mounted at
2101
+ * another base (e.g. a hub mounting several devframes at `/__foo/`,
2102
+ * `/__bar/`, …) inherits a dialable endpoint rather than resolving the
2103
+ * path against its own mount.
2104
+ * - A static hub build serves it (base-absolute, e.g.
2105
+ * `/__devframes/__connection.json`) in each **per-frame** meta, so a
2106
+ * frame SPA that fetched its own copy still resolves the shared RPC
2107
+ * dump from the hub base. Resolved against the fetched URL.
2069
2108
  */
2070
2109
  baseUrl?: string;
2071
2110
  /**
@@ -2125,4 +2164,4 @@ interface ConnectionMeta {
2125
2164
  */
2126
2165
  interface DevframeConnectionConfigsRegistry {}
2127
2166
  //#endregion
2128
- export { DevframeServiceScopeOf as $, SharedStateEvents as A, AgentManifest as At, DevframeSetupInfo as B, EventEmitter as Bt, createStreamSink as C, DevframeDiagnosticsLogger as Ct, ImmutableObject as D, defineCliFlags as Dt, ImmutableMap as E, InferCliFlags as Et, DevframeDefinition as F, AgentToolInput as Ft, McpAuthorization as G, DevframeSnapshotRpcInputs as H, EventsMap as Ht, DevframeDeploymentKind as I, AgentToolProvider as It, DevframeServiceDescriptor as J, McpRouteOptions as K, DevframeDockDefaults as L, AgentToolProviderHandle as Lt, SharedStatePatch as M, AgentResourceContent as Mt, createSharedState as N, AgentResourceInput as Nt, ImmutableSet as O, parseCliFlags as Ot, DevframeCliOptions as P, AgentTool as Pt, DevframeServiceOf as Q, DevframeDuplicationStrategy as R, DevframeAgentHost as Rt, createStreamReader as S, DevframeDiagnosticsHost as St, ImmutableArray as T, CliFlagsSchema as Tt, DevframeSseOptions as U, DevframeSnapshotRpcEntry as V, EventUnsubscribe as Vt, DevframeWsOptions as W, DevframeServiceInput as X, DevframeServiceId as Y, DevframeServiceMeta as Z, CreateStreamSinkOptions as _, DevframeRpcClientFunctions as _t, DevframeConnectionConfigsRegistry as a, DevframeScopedNodeRpc as at, StreamSink as b, DevframeHost as bt, RpcBroadcastOptions as c, DevframeSettingsRegistry as ct, RpcSharedStateHost as d, ScopedClientFunctions as dt, DevframeServicesHost as et, RpcStreamingChannel as f, ScopedRpcFn as ft, CreateStreamReaderOptions as g, DevframeViewHost as gt, BufferedChunk as h, SettingsForNamespace as ht, DevframeCapabilities as i, DevframeScopedNodeContext as it, SharedStateOptions as j, AgentResource as jt, SharedState as k, AgentHandle as kt, RpcFunctionsHost as l, DevframeSettingsStore as lt, RpcStreamingHost as m, ScopedSharedStates as mt, ConnectionMetaSse as n, DevframeServicesScopeRegistry as nt, DevframeNodeContext as o, DevframeScopedStreamingHost as ot, RpcStreamingChannelOptions as p, ScopedServerFunctions as pt, DevframeServiceDefinition as q, ConnectionMetaWebsocket as r, DevframeServicesState as rt, DevframeNodeRpcSession as s, DevframeSettings as st, ConnectionMeta as t, DevframeServicesRegistry as tt, RpcSharedStateGetOptions as u, ScopedBroadcastOptions as ut, StreamErrorPayload as v, DevframeRpcServerFunctions as vt, Immutable as w, DevframeAuthHandler as wt, StreamSinkEvents as x, DevframeStorageScope as xt, StreamReader as y, DevframeRpcSharedStates as yt, DevframeRpcOptions as z, DevframeAgentHostEvents as zt };
2167
+ export { DevframeServiceOf as $, SharedStateEvents as A, AgentHandle as At, DevframeSetupInfo as B, DevframeAgentHostEvents as Bt, createStreamSink as C, DevframeDiagnosticsHost as Ct, ImmutableObject as D, InferCliFlags as Dt, ImmutableMap as E, CliFlagsSchema as Et, DevframeDefinition as F, AgentTool as Ft, McpAuthorization as G, DevframeSnapshotRpcInputs as H, EventUnsubscribe as Ht, DevframeDeploymentKind as I, AgentToolInput as It, DevframeServiceDefinition as J, McpRouteOptions as K, DevframeDockDefaults as L, AgentToolProvider as Lt, SharedStatePatch as M, AgentResource as Mt, createSharedState as N, AgentResourceContent as Nt, ImmutableSet as O, defineCliFlags as Ot, DevframeCliOptions as P, AgentResourceInput as Pt, DevframeServiceMeta as Q, DevframeDuplicationStrategy as R, AgentToolProviderHandle as Rt, createStreamReader as S, DevframeStorageScope as St, ImmutableArray as T, DevframeAuthHandler as Tt, DevframeSseOptions as U, EventsMap as Ut, DevframeSnapshotRpcEntry as V, EventEmitter as Vt, DevframeWsOptions as W, DevframeServiceId as X, DevframeServiceDescriptor as Y, DevframeServiceInput as Z, CreateStreamSinkOptions as _, DevframeViewHost as _t, DevframeConnectionConfigsRegistry as a, DevframeScopedNodeContext as at, StreamSink as b, DevframeRpcSharedStates as bt, RpcBroadcastOptions as c, DevframeSettings as ct, RpcSharedStateHost as d, ScopedBroadcastOptions as dt, DevframeServiceScopeOf as et, RpcStreamingChannel as f, ScopedClientFunctions as ft, CreateStreamReaderOptions as g, SettingsForNamespace as gt, BufferedChunk as h, ScopedSharedStates as ht, DevframeCapabilities as i, DevframeServicesState as it, SharedStateOptions as j, AgentManifest as jt, SharedState as k, parseCliFlags as kt, RpcFunctionsHost as l, DevframeSettingsRegistry as lt, RpcStreamingHost as m, ScopedServerFunctions as mt, ConnectionMetaSse as n, DevframeServicesRegistry as nt, DevframeNodeContext as o, DevframeScopedNodeRpc as ot, RpcStreamingChannelOptions as p, ScopedRpcFn as pt, McpSetting as q, ConnectionMetaWebsocket as r, DevframeServicesScopeRegistry as rt, DevframeNodeRpcSession as s, DevframeScopedStreamingHost as st, ConnectionMeta as t, DevframeServicesHost as tt, RpcSharedStateGetOptions as u, DevframeSettingsStore as ut, StreamErrorPayload as v, DevframeRpcClientFunctions as vt, Immutable as w, DevframeDiagnosticsLogger as wt, StreamSinkEvents as x, DevframeHost as xt, StreamReader as y, DevframeRpcServerFunctions as yt, DevframeRpcOptions as z, DevframeAgentHost as zt };