devframe 0.1.16 → 0.1.17

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 (54) hide show
  1. package/dist/adapters/build.d.mts +1 -1
  2. package/dist/adapters/build.mjs +13 -6
  3. package/dist/adapters/cli.d.mts +1 -1
  4. package/dist/adapters/cli.mjs +6 -6
  5. package/dist/adapters/embedded.d.mts +1 -1
  6. package/dist/adapters/kit.d.mts +1 -1
  7. package/dist/adapters/mcp.d.mts +1 -1
  8. package/dist/adapters/mcp.mjs +2 -2
  9. package/dist/adapters/vite.d.mts +1 -1
  10. package/dist/adapters/vite.mjs +1 -1
  11. package/dist/client/index.d.mts +5 -4
  12. package/dist/client/index.mjs +1 -1
  13. package/dist/{client-4WrEozlH.mjs → client-CsR1_h3o.mjs} +14 -6
  14. package/dist/constants.d.mts +1 -1
  15. package/dist/{context-BrePWeyd.mjs → context-xQo1FcxX.mjs} +107 -56
  16. package/dist/{devtool-OJ3QW0ns.d.mts → devtool-CHT-4_OU.d.mts} +156 -48
  17. package/dist/helpers/nuxt/runtime/plugin.client.mjs +1 -1
  18. package/dist/index-Cei8vVcd.d.mts +140 -0
  19. package/dist/index.d.mts +4 -4
  20. package/dist/index.mjs +1 -1
  21. package/dist/node/index.d.mts +38 -10
  22. package/dist/node/index.mjs +4 -4
  23. package/dist/recipes/open-helpers.d.mts +5 -1
  24. package/dist/recipes/open-helpers.mjs +2 -2
  25. package/dist/rpc/index.d.mts +3 -2
  26. package/dist/rpc/index.mjs +4 -3
  27. package/dist/rpc/transports/ws-client.d.mts +1 -1
  28. package/dist/rpc/transports/ws-client.mjs +19 -4
  29. package/dist/rpc/transports/ws-server.d.mts +1 -1
  30. package/dist/rpc/transports/ws-server.mjs +19 -4
  31. package/dist/{rpc-9FNa3Inb.mjs → rpc-hbRk8qtt.mjs} +15 -33
  32. package/dist/serialization-CWcWE7x7.mjs +112 -0
  33. package/dist/{src-BoIqXRc9.mjs → src-DIKqQIjp.mjs} +1 -1
  34. package/dist/{static-dump-CQUC1aIW.mjs → static-dump-DwFfj4U_.mjs} +21 -6
  35. package/dist/types/index.d.mts +4 -4
  36. package/dist/{index-DvKDO5H8.d.mts → types-BkyzI9r4.d.mts} +35 -95
  37. package/dist/utils/events.d.mts +1 -1
  38. package/dist/utils/shared-state.d.mts +1 -1
  39. package/dist/utils/shared-state.mjs +1 -1
  40. package/dist/utils/state.d.mts +1 -1
  41. package/dist/utils/state.mjs +1 -1
  42. package/dist/utils/when.d.mts +1 -1
  43. package/dist/ws-client-CDGmViwt.d.mts +26 -0
  44. package/dist/{ws-server--IuUAaGi.d.mts → ws-server-Cu8tmZcF.d.mts} +12 -0
  45. package/package.json +1 -1
  46. package/dist/ws-client-CklfxUHE.d.mts +0 -17
  47. /package/dist/{_shared-CU6dE-VX.mjs → _shared-Bxa2_kq7.mjs} +0 -0
  48. /package/dist/{define-Bb4zh-Dc.mjs → define-CW9gLnyG.mjs} +0 -0
  49. /package/dist/{immer-HjMAm3b6.mjs → immer-DEqg5kOd.mjs} +0 -0
  50. /package/dist/{main-DpINGndA.mjs → main-BJD9t8dk.mjs} +0 -0
  51. /package/dist/{open-BtOOEldu.mjs → open-BMO2_-wC.mjs} +0 -0
  52. /package/dist/{server-DrBxa6ZV.mjs → server-DkJ2-s0Y.mjs} +0 -0
  53. /package/dist/{transports-BPUzHhI2.mjs → transports-4bqw6Fqg.mjs} +0 -0
  54. /package/dist/{when-CGLewRtm.d.mts → when-aBBXAEh5.d.mts} +0 -0
@@ -1,4 +1,4 @@
1
- import { r as DevtoolDefinition } from "../devtool-OJ3QW0ns.mjs";
1
+ import { r as DevtoolDefinition } from "../devtool-CHT-4_OU.mjs";
2
2
 
3
3
  //#region src/adapters/build.d.ts
4
4
  interface CreateBuildOptions {
@@ -1,7 +1,8 @@
1
- import { t as createHostContext } from "../context-BrePWeyd.mjs";
1
+ import { n as strictJsonStringify, o as structuredCloneStringify } from "../serialization-CWcWE7x7.mjs";
2
+ import { t as createHostContext } from "../context-xQo1FcxX.mjs";
2
3
  import { DEVTOOLS_CONNECTION_META_FILENAME, DEVTOOLS_RPC_DUMP_DIRNAME, DEVTOOLS_RPC_DUMP_MANIFEST_FILENAME } from "../constants.mjs";
3
- import { n as createH3DevToolsHost, t as collectStaticRpcDump } from "../static-dump-CQUC1aIW.mjs";
4
- import { t as resolveBasePath } from "../_shared-CU6dE-VX.mjs";
4
+ import { n as createH3DevToolsHost, t as collectStaticRpcDump } from "../static-dump-DwFfj4U_.mjs";
5
+ import { t as resolveBasePath } from "../_shared-Bxa2_kq7.mjs";
5
6
  import { existsSync } from "node:fs";
6
7
  import { dirname, resolve } from "pathe";
7
8
  import process from "node:process";
@@ -36,14 +37,20 @@ async function createBuild(d, options = {}) {
36
37
  });
37
38
  await d.setup(ctx);
38
39
  await fs$1.mkdir(resolve(outDir, DEVTOOLS_RPC_DUMP_DIRNAME), { recursive: true });
39
- await fs$1.writeFile(resolve(outDir, DEVTOOLS_CONNECTION_META_FILENAME), JSON.stringify({ backend: "static" }, null, 2), "utf-8");
40
+ const jsonSerializableMethods = [];
41
+ for (const def of ctx.rpc.definitions.values()) if (def.jsonSerializable === true) jsonSerializableMethods.push(def.name);
42
+ await fs$1.writeFile(resolve(outDir, DEVTOOLS_CONNECTION_META_FILENAME), JSON.stringify({
43
+ backend: "static",
44
+ jsonSerializableMethods
45
+ }, null, 2), "utf-8");
40
46
  console.log(c.cyan`[devframe] writing RPC dump to ${resolve(outDir, DEVTOOLS_RPC_DUMP_MANIFEST_FILENAME)}`);
41
47
  const dump = await collectStaticRpcDump(ctx.rpc.definitions.values(), ctx);
42
48
  const indent = options.pretty ? 2 : void 0;
43
- for (const [filepath, data] of Object.entries(dump.files)) {
49
+ for (const [filepath, file] of Object.entries(dump.files)) {
44
50
  const fullpath = resolve(outDir, filepath);
45
51
  await fs$1.mkdir(dirname(fullpath), { recursive: true });
46
- await fs$1.writeFile(fullpath, JSON.stringify(data, null, indent), "utf-8");
52
+ const text = file.serialization === "structured-clone" ? structuredCloneStringify(file.data) : strictJsonStringify(file.data, file.fnName);
53
+ await fs$1.writeFile(fullpath, file.serialization === "json" && indent != null ? JSON.stringify(JSON.parse(text), null, indent) : text, "utf-8");
47
54
  }
48
55
  await fs$1.writeFile(resolve(outDir, DEVTOOLS_RPC_DUMP_MANIFEST_FILENAME), JSON.stringify(dump.manifest, null, 2), "utf-8");
49
56
  if (d.spa) {
@@ -1,4 +1,4 @@
1
- import { r as DevtoolDefinition } from "../devtool-OJ3QW0ns.mjs";
1
+ import { r as DevtoolDefinition } from "../devtool-CHT-4_OU.mjs";
2
2
  import { App } from "h3";
3
3
  import { CAC } from "cac";
4
4
 
@@ -1,9 +1,9 @@
1
- import { a as flagKeyToOption, o as isBooleanFlag, s as parseCliFlags } from "../src-BoIqXRc9.mjs";
2
- import { t as createHostContext } from "../context-BrePWeyd.mjs";
1
+ import { a as flagKeyToOption, o as isBooleanFlag, s as parseCliFlags } from "../src-DIKqQIjp.mjs";
2
+ import { t as createHostContext } from "../context-xQo1FcxX.mjs";
3
3
  import { DEVTOOLS_CONNECTION_META_FILENAME } from "../constants.mjs";
4
- import { n as createH3DevToolsHost } from "../static-dump-CQUC1aIW.mjs";
5
- import { t as startHttpAndWs } from "../server-DrBxa6ZV.mjs";
6
- import { t as resolveBasePath } from "../_shared-CU6dE-VX.mjs";
4
+ import { n as createH3DevToolsHost } from "../static-dump-DwFfj4U_.mjs";
5
+ import { t as startHttpAndWs } from "../server-DkJ2-s0Y.mjs";
6
+ import { t as resolveBasePath } from "../_shared-Bxa2_kq7.mjs";
7
7
  import { createBuild } from "./build.mjs";
8
8
  import { resolve } from "pathe";
9
9
  import process$1 from "node:process";
@@ -344,7 +344,7 @@ async function maybeOpenBrowser(d, flags, origin) {
344
344
  if (!(flags.open ?? (cliOpen !== void 0 && cliOpen !== false))) return;
345
345
  const target = typeof flags.open === "string" ? resolveOpenTarget(origin, flags.open) : typeof cliOpen === "string" ? resolveOpenTarget(origin, cliOpen) : origin;
346
346
  try {
347
- const { default: open } = await import("../open-BtOOEldu.mjs");
347
+ const { default: open } = await import("../open-BMO2_-wC.mjs");
348
348
  await open(target);
349
349
  } catch {}
350
350
  }
@@ -1,4 +1,4 @@
1
- import { d as DevToolsNodeContext, r as DevtoolDefinition } from "../devtool-OJ3QW0ns.mjs";
1
+ import { d as DevToolsNodeContext, r as DevtoolDefinition } from "../devtool-CHT-4_OU.mjs";
2
2
 
3
3
  //#region src/adapters/embedded.d.ts
4
4
  interface CreateEmbeddedOptions {
@@ -1,4 +1,4 @@
1
- import { r as DevtoolDefinition } from "../devtool-OJ3QW0ns.mjs";
1
+ import { r as DevtoolDefinition } from "../devtool-CHT-4_OU.mjs";
2
2
 
3
3
  //#region src/adapters/kit.d.ts
4
4
  interface CreateKitPluginOptions {
@@ -1,4 +1,4 @@
1
- import { r as DevtoolDefinition } from "../devtool-OJ3QW0ns.mjs";
1
+ import { r as DevtoolDefinition } from "../devtool-CHT-4_OU.mjs";
2
2
  import { Server } from "@modelcontextprotocol/sdk/server/index.js";
3
3
 
4
4
  //#region src/node/mcp/build-server.d.ts
@@ -1,4 +1,4 @@
1
- import { p as logger, t as createHostContext } from "../context-BrePWeyd.mjs";
1
+ import { m as logger, t as createHostContext } from "../context-xQo1FcxX.mjs";
2
2
  import process from "node:process";
3
3
  import { Server } from "@modelcontextprotocol/sdk/server/index.js";
4
4
  import { CallToolRequestSchema, ListResourcesRequestSchema, ListToolsRequestSchema, ReadResourceRequestSchema } from "@modelcontextprotocol/sdk/types.js";
@@ -136,7 +136,7 @@ async function createMcpServer(definition, options = {}) {
136
136
  serverVersion: options.serverVersion ?? definition.version ?? "0.0.0",
137
137
  exposeSharedState: options.exposeSharedState ?? true
138
138
  });
139
- const { startStdioTransport } = await import("../transports-BPUzHhI2.mjs");
139
+ const { startStdioTransport } = await import("../transports-4bqw6Fqg.mjs");
140
140
  let stop;
141
141
  try {
142
142
  stop = await startStdioTransport(server);
@@ -1,4 +1,4 @@
1
- import { r as DevtoolDefinition } from "../devtool-OJ3QW0ns.mjs";
1
+ import { r as DevtoolDefinition } from "../devtool-CHT-4_OU.mjs";
2
2
 
3
3
  //#region src/adapters/vite.d.ts
4
4
  interface CreateVitePluginOptions {
@@ -1,4 +1,4 @@
1
- import { t as resolveBasePath } from "../_shared-CU6dE-VX.mjs";
1
+ import { t as resolveBasePath } from "../_shared-Bxa2_kq7.mjs";
2
2
  import { resolve } from "pathe";
3
3
  import sirv from "sirv";
4
4
  //#region src/adapters/vite.ts
@@ -1,7 +1,8 @@
1
- import { H as DevToolsRpcClientFunctions, St as DevToolsCommandEntry, U as DevToolsRpcServerFunctions, V as DevToolsDocksUserSettings, bt as DevToolsClientCommand, ct as DevToolsDockUserEntry, l as ConnectionMeta, nt as DevToolsDockEntriesGrouped, rt as DevToolsDockEntry, v as RpcSharedStateHost, w as SharedState, wt as DevToolsCommandKeybinding, zt as EventEmitter } from "../devtool-OJ3QW0ns.mjs";
2
- import { F as RpcCacheManager, I as RpcCacheOptions, M as RpcFunctionsCollector } from "../index-DvKDO5H8.mjs";
3
- import { t as WhenContext } from "../when-CGLewRtm.mjs";
4
- import { t as WsRpcChannelOptions } from "../ws-client-CklfxUHE.mjs";
1
+ import { H as DevToolsRpcClientFunctions, It as DevToolsCommandKeybinding, Mt as DevToolsClientCommand, Pt as DevToolsCommandEntry, U as DevToolsRpcServerFunctions, V as DevToolsDocksUserSettings, Zt as EventEmitter, _t as DevToolsDockUserEntry, dt as DevToolsDockEntriesGrouped, ft as DevToolsDockEntry, l as ConnectionMeta, v as RpcSharedStateHost, w as SharedState } from "../devtool-CHT-4_OU.mjs";
2
+ import { _ as RpcCacheManager, v as RpcCacheOptions } from "../index-Cei8vVcd.mjs";
3
+ import { S as RpcFunctionsCollector } from "../types-BkyzI9r4.mjs";
4
+ import { t as WhenContext } from "../when-aBBXAEh5.mjs";
5
+ import { t as WsRpcChannelOptions } from "../ws-client-CDGmViwt.mjs";
5
6
  import { BirpcOptions, BirpcReturn } from "birpc";
6
7
 
7
8
  //#region src/client/rpc.d.ts
@@ -1,2 +1,2 @@
1
- import { n as CLIENT_CONTEXT_KEY, r as getDevToolsClientContext, t as getDevToolsRpcClient } from "../client-4WrEozlH.mjs";
1
+ import { n as CLIENT_CONTEXT_KEY, r as getDevToolsClientContext, t as getDevToolsRpcClient } from "../client-CsR1_h3o.mjs";
2
2
  export { CLIENT_CONTEXT_KEY, getDevToolsRpcClient as connectDevtool, getDevToolsRpcClient, getDevToolsClientContext };
@@ -1,5 +1,6 @@
1
1
  import { t as import_dist } from "./human-id-CHS0s28X.mjs";
2
- import { l as RpcCacheManager, o as RpcFunctionsCollectorBase } from "./rpc-9FNa3Inb.mjs";
2
+ import { l as RpcCacheManager, o as RpcFunctionsCollectorBase } from "./rpc-hbRk8qtt.mjs";
3
+ import { r as structuredCloneDeserialize } from "./serialization-CWcWE7x7.mjs";
3
4
  import { createRpcClient } from "./rpc/client.mjs";
4
5
  import { createWsRpcChannel } from "./rpc/transports/ws-client.mjs";
5
6
  import { createEventEmitter } from "./utils/events.mjs";
@@ -128,14 +129,18 @@ function resolveRecordOutput(record) {
128
129
  function createStaticRpcCaller(manifest, fetchJson) {
129
130
  const staticCache = /* @__PURE__ */ new Map();
130
131
  const queryRecordCache = /* @__PURE__ */ new Map();
132
+ function reviveIfStructuredClone(value, serialization) {
133
+ if (serialization === "structured-clone") return structuredCloneDeserialize(value);
134
+ return value;
135
+ }
131
136
  async function loadStatic(entry) {
132
- if (!staticCache.has(entry.path)) staticCache.set(entry.path, fetchJson(entry.path));
137
+ if (!staticCache.has(entry.path)) staticCache.set(entry.path, fetchJson(entry.path).then((raw) => reviveIfStructuredClone(raw, entry.serialization)));
133
138
  const data = await staticCache.get(entry.path);
134
139
  if (isRecord(data)) return resolveRecordOutput(data);
135
140
  return data;
136
141
  }
137
- async function loadQueryRecord(path) {
138
- if (!queryRecordCache.has(path)) queryRecordCache.set(path, fetchJson(path));
142
+ async function loadQueryRecord(path, serialization) {
143
+ if (!queryRecordCache.has(path)) queryRecordCache.set(path, fetchJson(path).then((raw) => reviveIfStructuredClone(raw, serialization)));
139
144
  return await queryRecordCache.get(path);
140
145
  }
141
146
  async function call(functionName, args) {
@@ -148,8 +153,8 @@ function createStaticRpcCaller(manifest, fetchJson) {
148
153
  if (isQueryEntry(entry)) {
149
154
  const argsHash = hash(args);
150
155
  const recordPath = entry.records[argsHash];
151
- if (recordPath) return resolveRecordOutput(await loadQueryRecord(recordPath));
152
- if (entry.fallback) return resolveRecordOutput(await loadQueryRecord(entry.fallback));
156
+ if (recordPath) return resolveRecordOutput(await loadQueryRecord(recordPath, entry.serialization));
157
+ if (entry.fallback) return resolveRecordOutput(await loadQueryRecord(entry.fallback, entry.serialization));
153
158
  throw new Error(`[devtools-rpc] No dump match for "${functionName}" with args: ${JSON.stringify(args)}`);
154
159
  }
155
160
  if (args.length === 0) return entry;
@@ -1351,10 +1356,13 @@ function createWsRpcClientMode(options) {
1351
1356
  let isTrusted = false;
1352
1357
  const trustedPromise = promiseWithResolver();
1353
1358
  const url = isNumeric(connectionMeta.websocket) ? `${location.protocol.replace("http", "ws")}//${location.hostname}:${connectionMeta.websocket}` : connectionMeta.websocket;
1359
+ const definitions = /* @__PURE__ */ new Map();
1360
+ for (const name of connectionMeta.jsonSerializableMethods ?? []) definitions.set(name, { jsonSerializable: true });
1354
1361
  const serverRpc = createRpcClient(clientRpc.functions, {
1355
1362
  channel: createWsRpcChannel({
1356
1363
  url,
1357
1364
  authToken,
1365
+ definitions,
1358
1366
  ...wsOptions
1359
1367
  }),
1360
1368
  rpcOptions
@@ -1,4 +1,4 @@
1
- import { V as DevToolsDocksUserSettings } from "./devtool-OJ3QW0ns.mjs";
1
+ import { V as DevToolsDocksUserSettings } from "./devtool-CHT-4_OU.mjs";
2
2
 
3
3
  //#region src/constants.d.ts
4
4
  declare const DEVTOOLS_MOUNT_PATH = "/.devtools/";
@@ -1,6 +1,7 @@
1
1
  import { t as import_dist } from "./human-id-CHS0s28X.mjs";
2
- import { r as defineRpcFunction } from "./src-BoIqXRc9.mjs";
3
- import { o as RpcFunctionsCollectorBase } from "./rpc-9FNa3Inb.mjs";
2
+ import { r as defineRpcFunction } from "./src-DIKqQIjp.mjs";
3
+ import { o as RpcFunctionsCollectorBase } from "./rpc-hbRk8qtt.mjs";
4
+ import { s as diagnostics$1 } from "./serialization-CWcWE7x7.mjs";
4
5
  import { createEventEmitter } from "./utils/events.mjs";
5
6
  import { DEFAULT_STATE_USER_SETTINGS, REMOTE_CONNECTION_KEY } from "./constants.mjs";
6
7
  import { nanoid } from "./utils/nanoid.mjs";
@@ -5571,41 +5572,49 @@ const ContextUtils = { createSimpleClientScript(fn) {
5571
5572
  importName: "default"
5572
5573
  };
5573
5574
  } };
5574
- const logger = createLogger({
5575
- diagnostics: [defineDiagnostics({
5576
- docsBase: "https://devtools.vite.dev/devframe/errors",
5577
- codes: {
5578
- DF0001: {
5579
- message: (p) => `Dock with id "${p.id}" is already registered`,
5580
- hint: "Use the `force` parameter to overwrite an existing registration."
5581
- },
5582
- DF0002: { message: "Cannot change the id of a dock. Use register() to add new docks." },
5583
- DF0003: { message: (p) => `Dock with id "${p.id}" is not registered. Use register() to add new docks.` },
5584
- DF0004: { message: (p) => `Terminal session with id "${p.id}" already registered` },
5585
- DF0005: { message: (p) => `Terminal session with id "${p.id}" not registered` },
5586
- DF0006: { message: (p) => `RPC function "${p.name}" is not registered` },
5587
- DF0007: { message: "AsyncLocalStorage is not set, it likely to be an internal bug of the DevTools foundation" },
5588
- DF0008: { message: (p) => `distDir ${p.distDir} does not exist` },
5589
- DF0009: { message: (p) => `Command "${p.id}" is already registered` },
5590
- DF0010: { message: "Cannot change the id of a command. Use register() to add new commands." },
5591
- DF0011: { message: (p) => `Command "${p.id}" is not registered` },
5592
- DF0012: {
5593
- message: (p) => `Failed to parse storage file: ${p.filepath}, falling back to defaults.`,
5594
- level: "warn"
5595
- },
5596
- DF0013: { message: (p) => `Shared state of "${p.key}" is not found, please provide an initial value for the first time` },
5597
- DF0014: {
5598
- message: (p) => `RPC function "${p.name}" has an invalid \`agent\` field — \`description\` must be a non-empty string.`,
5599
- hint: "Provide a short description (~1–3 sentences) explaining what the tool does and when agents should invoke it."
5600
- },
5601
- DF0015: {
5602
- message: (p) => `Agent tool "${p.id}" is already registered.`,
5603
- hint: "Tool ids must be unique across RPC functions with an `agent` field and tools registered via `ctx.agent.registerTool()`."
5604
- },
5605
- DF0016: { message: (p) => `Agent resource "${p.id}" is already registered.` },
5606
- DF0017: { message: (p) => `Failed to start MCP server (${p.transport}): ${p.reason}` }
5575
+ //#endregion
5576
+ //#region src/node/diagnostics.ts
5577
+ const diagnostics = defineDiagnostics({
5578
+ docsBase: "https://devtools.vite.dev/devframe/errors",
5579
+ codes: {
5580
+ DF0001: {
5581
+ message: (p) => `Dock with id "${p.id}" is already registered`,
5582
+ hint: "Use the `force` parameter to overwrite an existing registration."
5583
+ },
5584
+ DF0002: { message: "Cannot change the id of a dock. Use register() to add new docks." },
5585
+ DF0003: { message: (p) => `Dock with id "${p.id}" is not registered. Use register() to add new docks.` },
5586
+ DF0004: { message: (p) => `Terminal session with id "${p.id}" already registered` },
5587
+ DF0005: { message: (p) => `Terminal session with id "${p.id}" not registered` },
5588
+ DF0006: { message: (p) => `RPC function "${p.name}" is not registered` },
5589
+ DF0007: { message: "AsyncLocalStorage is not set, it likely to be an internal bug of the DevTools foundation" },
5590
+ DF0008: { message: (p) => `distDir ${p.distDir} does not exist` },
5591
+ DF0009: { message: (p) => `Command "${p.id}" is already registered` },
5592
+ DF0010: { message: "Cannot change the id of a command. Use register() to add new commands." },
5593
+ DF0011: { message: (p) => `Command "${p.id}" is not registered` },
5594
+ DF0012: {
5595
+ message: (p) => `Failed to parse storage file: ${p.filepath}, falling back to defaults.`,
5596
+ level: "warn"
5597
+ },
5598
+ DF0013: { message: (p) => `Shared state of "${p.key}" is not found, please provide an initial value for the first time` },
5599
+ DF0014: {
5600
+ message: (p) => `RPC function "${p.name}" has an invalid \`agent\` field \`description\` must be a non-empty string.`,
5601
+ hint: "Provide a short description (~1–3 sentences) explaining what the tool does and when agents should invoke it."
5602
+ },
5603
+ DF0015: {
5604
+ message: (p) => `Agent tool "${p.id}" is already registered.`,
5605
+ hint: "Tool ids must be unique across RPC functions with an `agent` field and tools registered via `ctx.agent.registerTool()`."
5606
+ },
5607
+ DF0016: { message: (p) => `Agent resource "${p.id}" is already registered.` },
5608
+ DF0017: { message: (p) => `Failed to start MCP server (${p.transport}): ${p.reason}` },
5609
+ DF0018: {
5610
+ message: "`ctx.logs` is deprecated and will be removed in a future release. Use `ctx.messages` instead.",
5611
+ hint: "Replace any access to `ctx.logs` (or `context.logs`) with `ctx.messages`. The runtime behavior is identical.",
5612
+ level: "warn"
5607
5613
  }
5608
- })],
5614
+ }
5615
+ });
5616
+ const logger = createLogger({
5617
+ diagnostics: [diagnostics],
5609
5618
  formatter: ansiFormatter(c),
5610
5619
  reporters: consoleReporter
5611
5620
  });
@@ -5837,6 +5846,33 @@ var DevToolsCommandsHost = class {
5837
5846
  }
5838
5847
  };
5839
5848
  //#endregion
5849
+ //#region src/node/host-diagnostics.ts
5850
+ var DevToolsDiagnosticsHost = class {
5851
+ _definitions = [];
5852
+ _logger;
5853
+ defineDiagnostics = defineDiagnostics;
5854
+ createLogger = createLogger;
5855
+ constructor(context, initialDefinitions = []) {
5856
+ this.context = context;
5857
+ this._definitions = [...initialDefinitions];
5858
+ this._rebuild();
5859
+ }
5860
+ get logger() {
5861
+ return this._logger;
5862
+ }
5863
+ register(definitions) {
5864
+ this._definitions.push(definitions);
5865
+ this._rebuild();
5866
+ }
5867
+ _rebuild() {
5868
+ this._logger = createLogger({
5869
+ diagnostics: this._definitions,
5870
+ formatter: ansiFormatter(c),
5871
+ reporters: consoleReporter
5872
+ });
5873
+ }
5874
+ };
5875
+ //#endregion
5840
5876
  //#region src/node/storage.ts
5841
5877
  function createStorage(options) {
5842
5878
  const { mergeInitialValue = (initialValue, savedValue) => ({
@@ -5966,12 +6002,12 @@ var DevToolsDockHost = class {
5966
6002
  },
5967
6003
  {
5968
6004
  type: "~builtin",
5969
- id: "~logs",
5970
- title: "Logs & Notifications",
6005
+ id: "~messages",
6006
+ title: "Messages & Notifications",
5971
6007
  icon: "ph:notification-duotone",
5972
6008
  category: "~builtin",
5973
6009
  get badge() {
5974
- const size = context.logs.entries.size;
6010
+ const size = context.messages.entries.size;
5975
6011
  return size > 0 ? String(size) : void 0;
5976
6012
  }
5977
6013
  },
@@ -6400,9 +6436,9 @@ var RpcFunctionsHost = class extends RpcFunctionsCollectorBase {
6400
6436
  }
6401
6437
  };
6402
6438
  //#endregion
6403
- //#region src/node/host-logs.ts
6439
+ //#region src/node/host-messages.ts
6404
6440
  const MAX_ENTRIES = 1e3;
6405
- var DevToolsLogsHost = class {
6441
+ var DevToolsMessagesHost = class {
6406
6442
  entries = /* @__PURE__ */ new Map();
6407
6443
  events = createEventEmitter();
6408
6444
  /** Tracks when each entry was last added or updated (monotonic) */
@@ -6434,7 +6470,7 @@ var DevToolsLogsHost = class {
6434
6470
  }
6435
6471
  this.entries.set(entry.id, entry);
6436
6472
  this.lastModified.set(entry.id, this._tick());
6437
- this.events.emit("log:added", entry);
6473
+ this.events.emit("message:added", entry);
6438
6474
  if (entry.autoDelete) this._autoDeleteTimers.set(entry.id, setTimeout(() => {
6439
6475
  this.remove(entry.id);
6440
6476
  }, entry.autoDelete));
@@ -6452,7 +6488,7 @@ var DevToolsLogsHost = class {
6452
6488
  };
6453
6489
  this.entries.set(id, updated);
6454
6490
  this.lastModified.set(id, this._tick());
6455
- this.events.emit("log:updated", updated);
6491
+ this.events.emit("message:updated", updated);
6456
6492
  if (patch.autoDelete !== void 0) {
6457
6493
  const timer = this._autoDeleteTimers.get(id);
6458
6494
  if (timer) {
@@ -6477,7 +6513,7 @@ var DevToolsLogsHost = class {
6477
6513
  id,
6478
6514
  time: this._tick()
6479
6515
  });
6480
- this.events.emit("log:removed", id);
6516
+ this.events.emit("message:removed", id);
6481
6517
  }
6482
6518
  async clear() {
6483
6519
  for (const timer of this._autoDeleteTimers.values()) clearTimeout(timer);
@@ -6489,7 +6525,7 @@ var DevToolsLogsHost = class {
6489
6525
  });
6490
6526
  this.entries.clear();
6491
6527
  this.lastModified.clear();
6492
- this.events.emit("log:cleared");
6528
+ this.events.emit("message:cleared");
6493
6529
  }
6494
6530
  _createHandle(id) {
6495
6531
  const host = this;
@@ -6560,7 +6596,7 @@ var DevToolsTerminalHost = class {
6560
6596
  }
6561
6597
  async startChildProcess(executeOptions, terminal) {
6562
6598
  if (this.sessions.has(terminal.id)) throw logger.DF0004({ id: terminal.id }).throw();
6563
- const { exec } = await import("./main-DpINGndA.mjs");
6599
+ const { exec } = await import("./main-BJD9t8dk.mjs");
6564
6600
  let controller;
6565
6601
  const stream = new ReadableStream({ start(_controller) {
6566
6602
  controller = _controller;
@@ -6695,7 +6731,8 @@ async function createHostContext(options) {
6695
6731
  docks: void 0,
6696
6732
  views: void 0,
6697
6733
  terminals: void 0,
6698
- logs: void 0,
6734
+ messages: void 0,
6735
+ diagnostics: void 0,
6699
6736
  commands: void 0,
6700
6737
  agent: void 0,
6701
6738
  utils: ContextUtils,
@@ -6705,14 +6742,28 @@ async function createHostContext(options) {
6705
6742
  const docksHost = new DevToolsDockHost(context);
6706
6743
  const viewsHost = new DevToolsViewHost(context);
6707
6744
  const terminalsHost = new DevToolsTerminalHost(context);
6708
- const logsHost = new DevToolsLogsHost(context);
6745
+ const messagesHost = new DevToolsMessagesHost(context);
6746
+ const diagnosticsHost = new DevToolsDiagnosticsHost(context, [diagnostics, diagnostics$1]);
6709
6747
  const commandsHost = new DevToolsCommandsHost(context);
6710
6748
  context.rpc = rpcHost;
6711
6749
  context.docks = docksHost;
6712
6750
  context.views = viewsHost;
6713
6751
  context.terminals = terminalsHost;
6714
- context.logs = logsHost;
6752
+ context.messages = messagesHost;
6753
+ context.diagnostics = diagnosticsHost;
6715
6754
  context.commands = commandsHost;
6755
+ let _warnedLogs = false;
6756
+ Object.defineProperty(context, "logs", {
6757
+ get() {
6758
+ if (!_warnedLogs) {
6759
+ _warnedLogs = true;
6760
+ logger.DF0018().log();
6761
+ }
6762
+ return messagesHost;
6763
+ },
6764
+ enumerable: false,
6765
+ configurable: true
6766
+ });
6716
6767
  context.agent = new DevToolsAgentHost(context);
6717
6768
  let jrCounter = 0;
6718
6769
  context.createJsonRenderer = (initialSpec) => {
@@ -6753,17 +6804,17 @@ async function createHostContext(options) {
6753
6804
  args: [data]
6754
6805
  });
6755
6806
  });
6756
- const debouncedLogsUpdate = debounce(() => {
6807
+ const debouncedMessagesUpdate = debounce(() => {
6757
6808
  rpcHost.broadcast({
6758
- method: "devtoolskit:internal:logs:updated",
6809
+ method: "devtoolskit:internal:messages:updated",
6759
6810
  args: []
6760
6811
  });
6761
6812
  docksSharedState.mutate(() => context.docks.values());
6762
6813
  }, mode === "build" ? 0 : 10);
6763
- logsHost.events.on("log:added", () => debouncedLogsUpdate());
6764
- logsHost.events.on("log:updated", () => debouncedLogsUpdate());
6765
- logsHost.events.on("log:removed", () => debouncedLogsUpdate());
6766
- logsHost.events.on("log:cleared", () => debouncedLogsUpdate());
6814
+ messagesHost.events.on("message:added", () => debouncedMessagesUpdate());
6815
+ messagesHost.events.on("message:updated", () => debouncedMessagesUpdate());
6816
+ messagesHost.events.on("message:removed", () => debouncedMessagesUpdate());
6817
+ messagesHost.events.on("message:cleared", () => debouncedMessagesUpdate());
6767
6818
  const commandsSharedState = await rpcHost.sharedState.get("devtoolskit:internal:commands", { initialValue: [] });
6768
6819
  const debouncedCommandsSync = debounce(() => {
6769
6820
  commandsSharedState.mutate(() => commandsHost.list());
@@ -6773,4 +6824,4 @@ async function createHostContext(options) {
6773
6824
  return context;
6774
6825
  }
6775
6826
  //#endregion
6776
- export { RpcFunctionsHost as a, getInternalContext as c, DevToolsCommandsHost as d, DevToolsAgentHost as f, revokeAuthToken as g, revokeActiveConnectionsForToken as h, DevToolsLogsHost as i, internalContextMap as l, ContextUtils as m, DevToolsViewHost as n, createRpcSharedStateServerHost as o, logger as p, DevToolsTerminalHost as r, DevToolsDockHost as s, createHostContext as t, createStorage as u };
6827
+ export { revokeAuthToken as _, RpcFunctionsHost as a, getInternalContext as c, DevToolsDiagnosticsHost as d, DevToolsCommandsHost as f, revokeActiveConnectionsForToken as g, ContextUtils as h, DevToolsMessagesHost as i, internalContextMap as l, logger as m, DevToolsViewHost as n, createRpcSharedStateServerHost as o, DevToolsAgentHost as p, DevToolsTerminalHost as r, DevToolsDockHost as s, createHostContext as t, createStorage as u };