diff --git a/apps/docs/src/content/agents/mcp-server.md b/apps/docs/src/content/agents/mcp-server.md index 3e31e653..38ca19af 100644 --- a/apps/docs/src/content/agents/mcp-server.md +++ b/apps/docs/src/content/agents/mcp-server.md @@ -257,7 +257,7 @@ The prompts follow the same config as the tools. A prompt is left out when a too The argument is your own text. The server puts it on one line, cuts it at 200 characters and masks JWTs, bearer tokens and secret values in it, the same way it masks tool answers. -The stdio server offers no prompts. The prompts need a devframe patch that devframe 1.3.0 does not ship, so an installed package offers none until devframe ships it. +The stdio server offers no prompts. The prompts are part of devframe since 1.3.1. ### Resource templates diff --git a/apps/docs/src/content/contributing/development.md b/apps/docs/src/content/contributing/development.md index 5ffdf737..f002c721 100644 --- a/apps/docs/src/content/contributing/development.md +++ b/apps/docs/src/content/contributing/development.md @@ -41,17 +41,18 @@ pnpm install | `pre-commit` | Formats the staged files with Prettier and stages the result. It skips a file that also has unstaged changes, so hunks you left out with `git add -p` stay out of the commit. | | `commit-msg` | Checks the message against the [commit message guidelines](https://github.com/pangular-inspector/devtools/blob/main/docs/contributing/commit-message-guidelines.md). It prints a warning and never blocks the commit. | -### Patched dependencies +### Devframe versions -`patches/` holds `pnpm patch` changes to the built files of `devframe`, `@devframes/agentic` and `@devframes/hub` 1.3.0, listed under `patchedDependencies` in `pnpm-workspace.yaml`. They add what devframe doesn't ship: +Some MCP route options that `pangularMcp()` in `packages/devtools/src/agent-mcp.ts` sets need a minimum devframe version. The package depends on devframe 1.3.1, which has them all. -| Patch | What it adds | Used by | -| --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | -| `prompts` | An MCP route option with prompt templates. `@devframes/agentic` declares the `prompts` capability and answers `prompts/list` and `prompts/get` (invalid params for an unknown prompt or a missing required argument). Patched in `devframe`, `@devframes/hub` and `@devframes/agentic`. | `pangularMcpPrompts()` in `packages/devtools/src/agent-prompts.ts`, through `pangularMcp()` | +| Route option | Used for | Devframe | +| -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | -------- | +| `exposeSharedState` | Hiding the shared-state keys of an inspector with `agent.tools.: false` | 1.2.4 | +| `instructions` | The server instructions | 1.2.6 | +| `resourceTemplates` and `onResourcesChanged` | The per-page resource templates and their `list_changed` notifications (`packages/devtools/src/agent-page-resources.ts`) | 1.3.0 | +| `prompts` | The workflow prompts (`packages/devtools/src/agent-prompts.ts`) | 1.3.1 | -Some route options need no patch. The `exposeSharedState` filter, which hides the shared-state keys of an inspector with `agent.tools.: false`, is part of devframe since 1.2.4. The server `instructions` and `withMcpContent`, which `screenshot-component` uses to send its image as its own MCP block, are part of devframe since 1.2.6. The `resourceTemplates` and `onResourcesChanged` route options, which `pangularMcpResourceTemplates()` and `pangularMcpPagesChanged()` in `packages/devtools/src/agent-page-resources.ts` use, are part of devframe since 1.3.0. - -The patches apply only inside this repository. An app that installs the published package gets no prompts until devframe ships them. `pnpm e2e:install` checks that the installed package lists resource templates over MCP. Each patch names an exact version and file names with build hashes, so a devframe upgrade needs the patches redone with `pnpm patch`, or removed once devframe has the feature. +`withMcpContent`, which `screenshot-component` uses to send its image as its own MCP block, is part of devframe since 1.2.6. `pnpm e2e:install` checks that the installed package lists resource templates and prompts over MCP. ## Project structure diff --git a/examples/angular-native/package.json b/examples/angular-native/package.json index f0934c6e..64395f6c 100644 --- a/examples/angular-native/package.json +++ b/examples/angular-native/package.json @@ -20,7 +20,7 @@ "@ng-native/platform": "0.2.0", "@ngrx/signals": "^22.0.1", "@pangular-inspector/devtools": "file:pangular-inspector-devtools.tgz", - "devframe": "^1.3.0", + "devframe": "^1.3.1", "expo": "~57.0.26", "react": "19.2.3", "react-native": "0.86.3", diff --git a/extension/ui/THIRD_PARTY_LICENSES.md b/extension/ui/THIRD_PARTY_LICENSES.md index ea62ca57..394c65ac 100644 --- a/extension/ui/THIRD_PARTY_LICENSES.md +++ b/extension/ui/THIRD_PARTY_LICENSES.md @@ -122,7 +122,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -## devframe - 1.3.0 (MIT) +## devframe - 1.3.1 (MIT) MIT License diff --git a/package.json b/package.json index b2edc3fe..bed264ff 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "@angular/ssr": "^22.1.8", "@ngrx/signals": "^22.0.1", "@pangular-inspector/devtools": "workspace:*", - "devframe": "^1.3.0", + "devframe": "^1.3.1", "express": "^5.1.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", @@ -74,8 +74,8 @@ "@angular/cli": "^22.1.8", "@angular/compiler-cli": "^22.1.0", "@axe-core/playwright": "^4.13.0", - "@devframes/agentic": "^1.3.0", - "@devframes/vite": "^1.3.0", + "@devframes/agentic": "^1.3.1", + "@devframes/vite": "^1.3.1", "@ngrx/store": "^22.0.1", "@ngrx/store-devtools": "^22.0.1", "@nx/angular": "23.2.1", diff --git a/packages/devtools/CHANGELOG.md b/packages/devtools/CHANGELOG.md index a6154410..537ea615 100644 --- a/packages/devtools/CHANGELOG.md +++ b/packages/devtools/CHANGELOG.md @@ -31,7 +31,6 @@ These changes can break a 0.0.7 setup without an error. - **Analog on pnpm needs one setting.** `@analogjs/vite-plugin-nitro` imports `h3` without declaring it, so under pnpm it can resolve to the h3 2 that this package brings in, and `vite build` fails with "does not provide an export named 'createEvent'". Declare `h3@^1` for the plugin with pnpm `packageExtensions`, as the Analog guide shows. - **Agent tools, arguments and resource templates are renamed, and old names are refused.** Update prompts, scripts and client allowlists. See **Agent tools renamed** below. - **Most entry points export less.** See **Removed exports** below. -- **MCP prompts need a devframe release after 1.3.0.** The package depends on devframe 1.3.0, which serves the per-page resource templates and their `list_changed` notifications. With devframe 1.3.0 from npm, the HTTP endpoint sends no prompts. The workspace runs a patched devframe, so this only affects installed packages. ### Agent tools renamed @@ -161,7 +160,7 @@ What remains: `/config` exports `DEFAULT_POPUP_HOTKEY`, `PANGULAR_ACTIONS`, `PAN - Tool titles, inspector tags and safety tiers (`action` and `destructive`). - Every answer names the page it read, and one rule picks the default page for every tool. - Per-page resource templates and `list_changed` notifications (#417). -- Five MCP prompts for common workflows: `inspect-page`, `debug-error`, `fix-form`, `performance-pass` and `verify-fix` (#416). Server instructions describe the tiers and the tools. Both need the patched devframe (see **Upgrading from 0.0.7**). +- Five MCP prompts for common workflows: `inspect-page`, `debug-error`, `fix-form`, `performance-pass` and `verify-fix` (#416). Server instructions describe the tiers and the tools. - Agent skills shipped in the package, installed with `pangular skills install`. - Read-only tools for browser agents through WebMCP, off by default (`agent.browserTools`). - `pangular mcp --print-config` prints the client config for Claude Code, Cursor and VS Code. diff --git a/packages/devtools/package.json b/packages/devtools/package.json index 9c30c52e..67bfe4a2 100644 --- a/packages/devtools/package.json +++ b/packages/devtools/package.json @@ -160,17 +160,17 @@ "nativescript" ], "dependencies": { - "@devframes/agentic": "^1.3.0", - "@devframes/hub": "^1.3.0", - "@devframes/hub-ui": "^1.3.0", - "@devframes/plugin-messages": "^1.3.0", - "@devframes/plugin-messages--assets": "^1.3.0", - "@devframes/plugin-terminals": "^1.3.0", - "@devframes/plugin-terminals--assets": "^1.3.0", + "@devframes/agentic": "^1.3.1", + "@devframes/hub": "^1.3.1", + "@devframes/hub-ui": "^1.3.1", + "@devframes/plugin-messages": "^1.3.1", + "@devframes/plugin-messages--assets": "^1.3.1", + "@devframes/plugin-terminals": "^1.3.1", + "@devframes/plugin-terminals--assets": "^1.3.1", "@valibot/to-json-schema": "^1.8.0", "axe-core": "^4.13.0", "cac": "^7.1.0", - "devframe": "^1.3.0", + "devframe": "^1.3.1", "valibot": "^1.5.0" }, "peerDependencies": { diff --git a/packages/devtools/src/__tests__/agent-mcp.test.ts b/packages/devtools/src/__tests__/agent-mcp.test.ts index bad822bf..0441decb 100644 --- a/packages/devtools/src/__tests__/agent-mcp.test.ts +++ b/packages/devtools/src/__tests__/agent-mcp.test.ts @@ -1,4 +1,4 @@ -import { readFileSync, readdirSync } from 'node:fs'; +import { readFileSync } from 'node:fs'; import { fileURLToPath } from 'node:url'; import { createDevServer } from 'devframe/adapters/dev'; import { afterEach, describe, expect, it, vi } from 'vitest'; @@ -252,23 +252,12 @@ describe('pangular dev MCP route', () => { describe('shared-state filter source', () => { const repo = fileURLToPath(new URL('../../../../', import.meta.url)); - // The filter must come from published devframe, not from `patches/`, which - // apply only inside this repository: an app that installs the package would - // otherwise get every key again (issue #238). - it('needs no local patch', () => { - for (const file of readdirSync(`${repo}patches`)) { - const lines = readFileSync(`${repo}patches/${file}`, 'utf8').split('\n'); - // A line a hunk only touches (to add a comma) is removed and added again. - const removed = new Set( - lines - .filter((line) => /^-(?!--)/.test(line)) - .map((line) => line.slice(1).replace(/,$/, '')), - ); - const added = lines - .filter((line) => /^\+(?!\+\+)/.test(line)) - .filter((line) => !removed.has(line.slice(1).replace(/,$/, ''))); - expect(added.join('\n'), file).not.toContain('exposeSharedState'); - } + // The route options must come from published devframe, not from pnpm + // patches, which apply only inside this repository: an app that installs + // the package would otherwise miss them (issues #238 and #428). + it('needs no local patch of devframe', () => { + const workspace = readFileSync(`${repo}pnpm-workspace.yaml`, 'utf8'); + expect(workspace).not.toMatch(/^\s*'?(?:devframe|@devframes\/[\w-]+)@[^:]*'?:\s*patches\//m); }); it('requires a devframe release that has the route option', () => { diff --git a/packages/devtools/src/agent-mcp.ts b/packages/devtools/src/agent-mcp.ts index 0c7c4d2c..915e3891 100644 --- a/packages/devtools/src/agent-mcp.ts +++ b/packages/devtools/src/agent-mcp.ts @@ -37,9 +37,8 @@ export function pangularMcpInstructions(config: ResolvedPangularConfig): string * dependency, and Pangular always registers agent tools. * * `exposeSharedState` (1.2.4 and later), `instructions` (1.2.6 and later), - * `resourceTemplates` and `onResourcesChanged` (1.3.0 and later) are devframe - * route options, so they also hold for the published package. `prompts` still - * comes from the patches in `patches/`; without them devframe ignores it. + * `resourceTemplates` and `onResourcesChanged` (1.3.0 and later) and `prompts` + * (1.3.1 and later) are devframe route options. */ export function pangularMcp( setting: McpSetting | undefined, diff --git a/packages/devtools/src/agent-prompts.ts b/packages/devtools/src/agent-prompts.ts index f724a1c9..289194f3 100644 --- a/packages/devtools/src/agent-prompts.ts +++ b/packages/devtools/src/agent-prompts.ts @@ -3,7 +3,7 @@ import { agentToolOffered, type ResolvedPangularConfig } from './config.ts'; import { redactText } from './serialize.ts'; import { clip } from './text.ts'; -/** One MCP prompt, as the patched `@devframes/agentic` server takes it. */ +/** One MCP prompt, as `@devframes/agentic` takes it. */ export type PangularMcpPrompt = NonNullable[number]; /** Whether a built-in agent tool is offered, by its name without `pangular:`. */ diff --git a/patches/@devframes__agentic@1.3.0.patch b/patches/@devframes__agentic@1.3.0.patch deleted file mode 100644 index dee10d40..00000000 --- a/patches/@devframes__agentic@1.3.0.patch +++ /dev/null @@ -1,85 +0,0 @@ -diff --git a/dist/mcp/index.mjs b/dist/mcp/index.mjs -index 278e426..33784f8 100644 ---- a/dist/mcp/index.mjs -+++ b/dist/mcp/index.mjs -@@ -1,6 +1,6 @@ - import { homedir } from "node:os"; - import process from "node:process"; --import { Server, createMcpHandler } from "@modelcontextprotocol/server"; -+import { ProtocolError, ProtocolErrorCode, Server, createMcpHandler } from "@modelcontextprotocol/server"; - import { DEVFRAME_EVENTS } from "devframe/constants"; - import { argsToJsonSchema, diagnostics, formatMcpError, getMcpContent, returnToJsonSchema, stringifyForMcp } from "devframe/internal"; - import { createHostContext } from "devframe/node"; -@@ -29,13 +29,15 @@ function buildMcpServerFromContext(ctx, options) { - }, { - capabilities: { - tools: { listChanged: true }, -- resources: { listChanged: true } -+ resources: { listChanged: true }, -+ ...options.prompts?.length ? { prompts: { listChanged: false } } : {} - }, - ...options.instructions ? { instructions: options.instructions } : {} - }); - registerToolHandlers(server, ctx, options.exposeSharedState); - const templates = options.resourceTemplates ?? []; - registerResourceHandlers(server, ctx, options.exposeSharedState, templates); -+ if (options.prompts?.length) registerPromptHandlers(server, options.prompts); - if (templates.length) server.setRequestHandler("resources/templates/list", async () => ({ resourceTemplates: templates.map(({ template: { uriTemplate, name, title, description, mimeType } }) => ({ - uriTemplate, - name, -@@ -111,6 +113,7 @@ async function createMcpServer(definition, options = {}) { - serverVersion: options.serverVersion ?? definition.version ?? "0.0.0", - exposeSharedState: options.exposeSharedState ?? true, - instructions: options.instructions, -+ prompts: options.prompts, - resourceTemplates - }; - let handle; -@@ -256,6 +259,39 @@ function registerToolHandlers(server, ctx, exposeSharedState) { - } - }); - } -+/** -+* Serve a fixed list of prompt templates. `prompts/list` projects each one; -+* `prompts/get` checks the required arguments and returns the messages its -+* `get` builds. An unknown name or a missing required argument is an -+* invalid-params error. The first prompt with a name wins. -+*/ -+function registerPromptHandlers(server, prompts) { -+ const byName = /* @__PURE__ */ new Map(); -+ for (const prompt of prompts) if (!byName.has(prompt.name)) byName.set(prompt.name, prompt); -+ server.setRequestHandler("prompts/list", async () => ({ prompts: [...byName.values()].map((prompt) => ({ -+ name: prompt.name, -+ ...prompt.title !== void 0 ? { title: prompt.title } : {}, -+ ...prompt.description !== void 0 ? { description: prompt.description } : {}, -+ ...prompt.arguments?.length ? { arguments: prompt.arguments.map((argument) => ({ -+ name: argument.name, -+ ...argument.description !== void 0 ? { description: argument.description } : {}, -+ ...argument.required !== void 0 ? { required: argument.required } : {} -+ })) } : {} -+ })) })); -+ server.setRequestHandler("prompts/get", async (request) => { -+ const { name, arguments: args } = request.params; -+ const prompt = byName.get(name); -+ if (!prompt) throw new ProtocolError(ProtocolErrorCode.InvalidParams, `[devframe/mcp] unknown prompt "${name}"`); -+ const given = args ?? {}; -+ const missing = (prompt.arguments ?? []).filter((argument) => argument.required && !given[argument.name]).map((argument) => argument.name); -+ if (missing.length) throw new ProtocolError(ProtocolErrorCode.InvalidParams, `[devframe/mcp] prompt "${name}" needs the argument(s): ${missing.join(", ")}`); -+ const result = await prompt.get(given); -+ return { -+ ...result.description !== void 0 ? { description: result.description } : {}, -+ messages: result.messages -+ }; -+ }); -+} - function registerResourceHandlers(server, ctx, exposeSharedState, templates) { - const stateFilter = sharedStateFilter(exposeSharedState); - server.setRequestHandler("resources/list", async () => { -@@ -547,6 +583,7 @@ function createMcpFetchHandler(ctx, options) { - serverVersion: options.serverVersion, - exposeSharedState: options.exposeSharedState, - instructions: options.instructions, -+ prompts: options.prompts, - resourceTemplates - })); - const unbridge = bridgeListChanged(ctx, { diff --git a/patches/@devframes__hub@1.3.0.patch b/patches/@devframes__hub@1.3.0.patch deleted file mode 100644 index 27e4b294..00000000 --- a/patches/@devframes__hub@1.3.0.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff --git a/dist/node/initiate.mjs b/dist/node/initiate.mjs -index c7a97cc..9548fc0 100644 ---- a/dist/node/initiate.mjs -+++ b/dist/node/initiate.mjs -@@ -151,6 +151,7 @@ function initHub(options) { - serverVersion: options.version ?? "0.0.0", - exposeSharedState: mcpConfig.exposeSharedState ?? true, - instructions: mcpConfig.instructions, -+ prompts: mcpConfig.prompts, - resourceTemplates: mcpConfig.resourceTemplates, - onResourcesChanged: mcpConfig.onResourcesChanged, - authorization: mcpConfig.authorization, diff --git a/patches/devframe@1.3.0.patch b/patches/devframe@1.3.0.patch deleted file mode 100644 index 7cbe0d7e..00000000 --- a/patches/devframe@1.3.0.patch +++ /dev/null @@ -1,113 +0,0 @@ -diff --git a/dist/_shared-C06DH07o.mjs b/dist/_shared-C06DH07o.mjs -index 0f9aed5..5dc62bc 100644 ---- a/dist/_shared-C06DH07o.mjs -+++ b/dist/_shared-C06DH07o.mjs -@@ -145,6 +145,7 @@ function resolveMcpConfig(mcp) { - ...mcp.allowedOrigins !== void 0 ? { allowedOrigins: mcp.allowedOrigins } : {}, - ...mcp.exposeSharedState !== void 0 ? { exposeSharedState: mcp.exposeSharedState } : {}, - ...mcp.instructions !== void 0 ? { instructions: mcp.instructions } : {}, -+ ...mcp.prompts !== void 0 ? { prompts: mcp.prompts } : {}, - ...mcp.resourceTemplates !== void 0 ? { resourceTemplates: mcp.resourceTemplates } : {}, - ...mcp.onResourcesChanged !== void 0 ? { onResourcesChanged: mcp.onResourcesChanged } : {}, - authorization -diff --git a/dist/_shared-DbO-OtUC.d.mts b/dist/_shared-DbO-OtUC.d.mts -index add8d6a..fc113c3 100644 ---- a/dist/_shared-DbO-OtUC.d.mts -+++ b/dist/_shared-DbO-OtUC.d.mts -@@ -1,4 +1,4 @@ --import { F as DevframeDefinition, G as McpAuthorization, I as DevframeDeploymentKind, Pt as McpResourcesChangedHook, Xt as DevframeAgentHost, jt as McpResourceTemplate, q as McpSetting, t as ConnectionMeta } from "./context-Dko5QFWF.mjs"; -+import { F as DevframeDefinition, G as McpAuthorization, I as DevframeDeploymentKind, Pt as McpResourcesChangedHook, Xt as DevframeAgentHost, jt as McpResourceTemplate, K as McpRouteOptions, q as McpSetting, t as ConnectionMeta } from "./context-Dko5QFWF.mjs"; - import { t as AgenticMcpModule } from "./agentic-D6HePbWg.mjs"; - //#region src/adapters/_shared.d.ts - /** -@@ -39,6 +39,8 @@ interface ResolvedMcpConfig { - exposeSharedState?: boolean | ((key: string) => boolean); - /** Handshake `instructions` from the route options; omitted means none. */ - instructions?: string; -+ /** Prompt templates from the route options; omitted means none. */ -+ prompts?: McpRouteOptions['prompts']; - /** Resource templates from the route options; omitted means none. */ - resourceTemplates?: McpResourceTemplate[]; - /** Resource-list change subscription from the route options; omitted means none. */ -diff --git a/dist/context-Dko5QFWF.d.mts b/dist/context-Dko5QFWF.d.mts -index 83f7c35..fc8c6e0 100644 ---- a/dist/context-Dko5QFWF.d.mts -+++ b/dist/context-Dko5QFWF.d.mts -@@ -404,6 +404,8 @@ interface CreateMcpServerOptions { - * `server/discover`) result. Omitted or empty sends no instructions. - */ - instructions?: string; -+ /** Prompt templates served through `prompts/list` and `prompts/get`; omitted means no `prompts` capability. */ -+ prompts?: readonly McpPrompt[]; - /** - * Resource templates served through `resources/templates/list`, and read - * through `resources/read`. Omitted or empty keeps the resources unchanged. -@@ -452,6 +454,8 @@ interface CreateMcpFetchHandlerOptions { - exposeSharedState: boolean | ((key: string) => boolean); - /** Usage guidance for the handshake; see {@link CreateMcpServerOptions.instructions}. */ - instructions?: string; -+ /** Prompt templates served through `prompts/list` and `prompts/get`; omitted means no `prompts` capability. */ -+ prompts?: readonly McpPrompt[]; - /** Resource templates; see {@link CreateMcpServerOptions.resourceTemplates}. */ - resourceTemplates?: McpResourceTemplate[]; - /** Host subscription for resource-list changes; see {@link CreateMcpServerOptions.onResourcesChanged}. */ -@@ -499,6 +503,38 @@ interface McpFetchHandler { - /** Tear down the handler (aborts in-flight exchanges, drops the change bridge). */ - dispose: () => Promise; - } -+/** One argument of an {@link McpPrompt}. */ -+interface McpPromptArgument { -+ name: string; -+ description?: string; -+ /** `prompts/get` fails with invalid params when a required argument is missing or empty. */ -+ required?: boolean; -+} -+/** One message of a prompt's answer. */ -+interface McpPromptMessage { -+ role: 'user' | 'assistant'; -+ content: { -+ type: 'text'; -+ text: string; -+ }; -+} -+/** What `prompts/get` returns for a prompt. */ -+interface McpPromptResult { -+ description?: string; -+ messages: McpPromptMessage[]; -+} -+/** -+ * A prompt template the MCP server lists in `prompts/list` and builds in -+ * `prompts/get`. A client usually offers it to the user as a slash command. -+ */ -+interface McpPrompt { -+ name: string; -+ title?: string; -+ description?: string; -+ arguments?: readonly McpPromptArgument[]; -+ /** Build the messages from the arguments the client sent. */ -+ get: (args: Record) => McpPromptResult | Promise; -+} - /** One concrete resource that an {@link McpResourceTemplate} lists in `resources/list`. */ - interface McpResourceTemplateEntry { - /** The resource URI. It SHOULD match the `uriTemplate` of its template, so `resources/read` finds it. */ -@@ -1484,6 +1520,8 @@ interface McpRouteOptions { - * Omitted or empty sends no instructions. - */ - instructions?: string; -+ /** Prompt templates served through `prompts/list` and `prompts/get`; omitted means no `prompts` capability. */ -+ prompts?: readonly McpPrompt[]; - /** - * Resource templates the route serves through MCP - * `resources/templates/list`. `resources/read` tries them after the -diff --git a/dist/dev-C-wQTIrV.mjs b/dist/dev-C-wQTIrV.mjs -index 43177ce..c66ab4d 100644 ---- a/dist/dev-C-wQTIrV.mjs -+++ b/dist/dev-C-wQTIrV.mjs -@@ -141,6 +141,7 @@ async function mountMcpRoute(app, context, def, base, setting) { - serverVersion: def.version ?? "0.0.0", - exposeSharedState: config.exposeSharedState ?? true, - instructions: config.instructions, -+ prompts: config.prompts, - resourceTemplates: config.resourceTemplates, - onResourcesChanged: config.onResourcesChanged, - authorization: config.authorization, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5e747ba9..09cb0507 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,17 +8,6 @@ packageExtensionsChecksum: sha256-pZ5Yb81CXMsN4lVTkqET1vwZkSfW0B8hDR3b6oB8KVw= pnpmfileChecksum: sha256-i4dX6oUtQ5fpnlOvszoub+bAsmeJV9P6sOw6CcJ4VO8= -patchedDependencies: - '@devframes/agentic@1.3.0': - hash: 6ffcac3393c36e0a64405fe19f700836c1c5dd4b754477af1a7c60e3833c466a - path: patches/@devframes__agentic@1.3.0.patch - '@devframes/hub@1.3.0': - hash: 30b066fc559322c735b40d1b6119cb677509f16e9ed244c17e555016723bb39c - path: patches/@devframes__hub@1.3.0.patch - devframe@1.3.0: - hash: 9e7d48e3525a8faa535860f24e730b85c08d3aedbc9c228a7b6d36d3c99dd75a - path: patches/devframe@1.3.0.patch - importers: .: @@ -54,8 +43,8 @@ importers: specifier: workspace:* version: link:packages/devtools devframe: - specifier: ^1.3.0 - version: 1.3.0(patch_hash=9e7d48e3525a8faa535860f24e730b85c08d3aedbc9c228a7b6d36d3c99dd75a)(@devframes/agentic@1.3.0)(cac@7.1.0)(srvx@1.0.8) + specifier: ^1.3.1 + version: 1.3.1(@devframes/agentic@1.3.1)(cac@7.1.0)(srvx@1.0.8) express: specifier: ^5.1.0 version: 5.2.1 @@ -91,11 +80,11 @@ importers: specifier: ^4.13.0 version: 4.13.0(playwright-core@1.63.0) '@devframes/agentic': - specifier: ^1.3.0 - version: 1.3.0(patch_hash=6ffcac3393c36e0a64405fe19f700836c1c5dd4b754477af1a7c60e3833c466a)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.0) + specifier: ^1.3.1 + version: 1.3.1(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.1) '@devframes/vite': - specifier: ^1.3.0 - version: 1.3.0(@devframes/hub-ui@1.3.0(@devframes/hub@1.3.0(patch_hash=30b066fc559322c735b40d1b6119cb677509f16e9ed244c17e555016723bb39c)(@devframes/agentic@1.3.0)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.0))(devframe@1.3.0))(@devframes/hub@1.3.0(patch_hash=30b066fc559322c735b40d1b6119cb677509f16e9ed244c17e555016723bb39c)(@devframes/agentic@1.3.0)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.0))(devframe@1.3.0)(vite@8.3.0(@types/node@24.13.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.105.0)(terser@5.51.2)(yaml@2.9.0)) + specifier: ^1.3.1 + version: 1.3.1(@devframes/hub-ui@1.3.1(@devframes/hub@1.3.1(@devframes/agentic@1.3.1)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.1))(devframe@1.3.1))(@devframes/hub@1.3.1(@devframes/agentic@1.3.1)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.1))(devframe@1.3.1)(vite@8.3.0(@types/node@24.13.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.105.0)(terser@5.51.2)(yaml@2.9.0)) '@ngrx/store': specifier: ^22.0.1 version: 22.0.1(@angular/core@22.1.7(@angular/compiler@22.1.7)(rxjs@7.8.2)(zone.js@0.16.3))(rxjs@7.8.2) @@ -357,26 +346,26 @@ importers: packages/devtools: dependencies: '@devframes/agentic': - specifier: ^1.3.0 - version: 1.3.0(patch_hash=6ffcac3393c36e0a64405fe19f700836c1c5dd4b754477af1a7c60e3833c466a)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.0) + specifier: ^1.3.1 + version: 1.3.1(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.1) '@devframes/hub': - specifier: ^1.3.0 - version: 1.3.0(patch_hash=30b066fc559322c735b40d1b6119cb677509f16e9ed244c17e555016723bb39c)(@devframes/agentic@1.3.0)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.0) + specifier: ^1.3.1 + version: 1.3.1(@devframes/agentic@1.3.1)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.1) '@devframes/hub-ui': - specifier: ^1.3.0 - version: 1.3.0(@devframes/hub@1.3.0(patch_hash=30b066fc559322c735b40d1b6119cb677509f16e9ed244c17e555016723bb39c)(@devframes/agentic@1.3.0)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.0))(devframe@1.3.0) + specifier: ^1.3.1 + version: 1.3.1(@devframes/hub@1.3.1(@devframes/agentic@1.3.1)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.1))(devframe@1.3.1) '@devframes/plugin-messages': - specifier: ^1.3.0 - version: 1.3.0(@devframes/hub@1.3.0(patch_hash=30b066fc559322c735b40d1b6119cb677509f16e9ed244c17e555016723bb39c)(@devframes/agentic@1.3.0)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.0))(@devframes/plugin-messages--assets@1.3.0)(devframe@1.3.0)(vite@8.3.0(@types/node@24.13.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.105.0)(terser@5.51.2)(yaml@2.9.0)) + specifier: ^1.3.1 + version: 1.3.1(@devframes/hub@1.3.1(@devframes/agentic@1.3.1)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.1))(@devframes/plugin-messages--assets@1.3.1)(devframe@1.3.1)(vite@8.3.0(@types/node@24.13.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.105.0)(terser@5.51.2)(yaml@2.9.0)) '@devframes/plugin-messages--assets': - specifier: ^1.3.0 - version: 1.3.0 + specifier: ^1.3.1 + version: 1.3.1 '@devframes/plugin-terminals': - specifier: ^1.3.0 - version: 1.3.0(@devframes/hub-ui@1.3.0(@devframes/hub@1.3.0(patch_hash=30b066fc559322c735b40d1b6119cb677509f16e9ed244c17e555016723bb39c)(@devframes/agentic@1.3.0)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.0))(devframe@1.3.0))(@devframes/hub@1.3.0(patch_hash=30b066fc559322c735b40d1b6119cb677509f16e9ed244c17e555016723bb39c)(@devframes/agentic@1.3.0)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.0))(@devframes/plugin-terminals--assets@1.3.0)(devframe@1.3.0)(vite@8.3.0(@types/node@24.13.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.105.0)(terser@5.51.2)(yaml@2.9.0)) + specifier: ^1.3.1 + version: 1.3.1(@devframes/hub-ui@1.3.1(@devframes/hub@1.3.1(@devframes/agentic@1.3.1)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.1))(devframe@1.3.1))(@devframes/hub@1.3.1(@devframes/agentic@1.3.1)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.1))(@devframes/plugin-terminals--assets@1.3.1)(devframe@1.3.1)(vite@8.3.0(@types/node@24.13.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.105.0)(terser@5.51.2)(yaml@2.9.0)) '@devframes/plugin-terminals--assets': - specifier: ^1.3.0 - version: 1.3.0 + specifier: ^1.3.1 + version: 1.3.1 '@valibot/to-json-schema': specifier: ^1.8.0 version: 1.8.0(valibot@1.5.0(typescript@6.0.3)) @@ -387,8 +376,8 @@ importers: specifier: ^7.1.0 version: 7.1.0 devframe: - specifier: ^1.3.0 - version: 1.3.0(patch_hash=9e7d48e3525a8faa535860f24e730b85c08d3aedbc9c228a7b6d36d3c99dd75a)(@devframes/agentic@1.3.0)(cac@7.1.0)(srvx@1.0.8) + specifier: ^1.3.1 + version: 1.3.1(@devframes/agentic@1.3.1)(cac@7.1.0)(srvx@1.0.8) valibot: specifier: ^1.5.0 version: 1.5.0(typescript@6.0.3) @@ -1493,40 +1482,40 @@ packages: resolution: {integrity: sha512-bPlN9S9O1A0euCpEWE4qnvB5YDuyYVsUTrxSgmAM1Is0j4tICHoVyOVAXfWMP/kS9ZrjvyIXWV2PmomiAXXqOw==} engines: {node: '>=20.19.0'} - '@devframes/agentic@1.3.0': - resolution: {integrity: sha512-gdKGiSp/KOQDg74C9WgSjdBaLOuNRhrG7FY/Qp8jTvToQzUNhFMHs+cDiVMiBYaT28KaSXKBQnewxcwjmW8yKw==} + '@devframes/agentic@1.3.1': + resolution: {integrity: sha512-wUHyiedkSA/U0vgjZTLjU1xbXqnKVTW3AruVZCPRb3sm7uXHYtLxJEtp7Sd7prUeJK+37da4VnefES5QVXgIsA==} peerDependencies: - devframe: 1.3.0 + devframe: 1.3.1 - '@devframes/hub-ui@1.3.0': - resolution: {integrity: sha512-04EjiKY3F20XEc0gcKRkAsqIgK/9J84VhRD4YlFP9ZgOH64qw0X11SAD5D87VoxzlPUxGvt7WLZgVTI35zvWIg==} + '@devframes/hub-ui@1.3.1': + resolution: {integrity: sha512-YkD7BeIrnPrlSzV1VuI0CAM5pWOfkrP1ESJQoJw2QyH2x8sIVU5nRshOPKe2Ah6S0mWzks9VqumXuW5f5LM+kQ==} peerDependencies: - '@devframes/hub': 1.3.0 - '@devframes/json-render': 1.3.0 - devframe: 1.3.0 + '@devframes/hub': 1.3.1 + '@devframes/json-render': 1.3.1 + devframe: 1.3.1 peerDependenciesMeta: '@devframes/json-render': optional: true - '@devframes/hub@1.3.0': - resolution: {integrity: sha512-4xpiImEuUf3F819YkvYaxNIhUMT1gSeg9/sYtBrju7Mgv1rzZv2sNl5+6nNZ2UvBG+jynWMq9cOK5ghpQOT/AQ==} + '@devframes/hub@1.3.1': + resolution: {integrity: sha512-Fkh5/gn6QS3ER7DJmCnWuRB1PfGCqPhcNdszuoKxbDz3QgDiRm73OExVI7BQzjtO+ks69M4DifQmZIhrO5VJoQ==} peerDependencies: - '@devframes/agentic': 1.3.0 - devframe: 1.3.0 + '@devframes/agentic': 1.3.1 + devframe: 1.3.1 peerDependenciesMeta: '@devframes/agentic': optional: true - '@devframes/plugin-messages--assets@1.3.0': - resolution: {integrity: sha512-YgvjZRNVRmfEcnW8SeuPe6no5YSOP67CfpuYtGUZcg2yN/gnm7ktKwjnPWImC3Jhl3CqH1voqFrZdyRcVwGOng==} + '@devframes/plugin-messages--assets@1.3.1': + resolution: {integrity: sha512-jUsR2lV5yvixBlBNxwXceNTxd5x/58TprCi9mI5buO6Q0JfJTwkPNf0w5VkC/uiuWkWaJ7q3XY7CupTZQ5OyBA==} - '@devframes/plugin-messages@1.3.0': - resolution: {integrity: sha512-X9HWSf7K4+xiz5eWYETIEAXi0srBJL4DzYxb4/CS4AO13LZLN6iTe7q0TKjpqlqau1H9KqjXNdubMS9HTZ20rQ==} + '@devframes/plugin-messages@1.3.1': + resolution: {integrity: sha512-6OroOk9WbckYpuBpENW1psw1qHSxQ74fHuRiqj5CyworHfIb0+QAG8nImzZ1lomMo1X2zoTbSj6MqohkoEcgZA==} hasBin: true peerDependencies: - '@devframes/hub': 1.3.0 - '@devframes/plugin-messages--assets': 1.3.0 - devframe: 1.3.0 + '@devframes/hub': 1.3.1 + '@devframes/plugin-messages--assets': 1.3.1 + devframe: 1.3.1 vite: ^7.0.0 || ^8.0.0 peerDependenciesMeta: '@devframes/plugin-messages--assets': @@ -1534,15 +1523,15 @@ packages: vite: optional: true - '@devframes/plugin-terminals--assets@1.3.0': - resolution: {integrity: sha512-E94upRu8wRZKxSCcAoY75teZe1/kXa4/z8eJP4h9yEZM/vLOs3TcPzI8eLttOE4l9YJ09DEDl+J3gGz1HplPsQ==} + '@devframes/plugin-terminals--assets@1.3.1': + resolution: {integrity: sha512-BYL+I175tWOQe5AAjrBk4T1RDLdsdPjQckPCpms5mc6x4fFacmNTn+Q33V0ofhSexi4JgnqNxXHQtiCD9mSS1g==} - '@devframes/plugin-terminals@1.3.0': - resolution: {integrity: sha512-Bt3fvsvNqeF3qYcgx/zwUP9SmhWa+PJooHwBtG+8uCpqMi+nXuDpF2kPdI84VclPqT5BIoBl8a8AgnFpa2xiXQ==} + '@devframes/plugin-terminals@1.3.1': + resolution: {integrity: sha512-nB+hrg1Vu9KVibEiMkCr72VQtApta/XXs1E+IJ9gR3BkAJ9vDmRKngtzlStrGtUXw/cVoiqUcT8GF58+JGl5Jw==} hasBin: true peerDependencies: - '@devframes/plugin-terminals--assets': 1.3.0 - devframe: 1.3.0 + '@devframes/plugin-terminals--assets': 1.3.1 + devframe: 1.3.1 vite: ^8.0.0 peerDependenciesMeta: '@devframes/plugin-terminals--assets': @@ -1550,17 +1539,17 @@ packages: vite: optional: true - '@devframes/service-open@1.3.0': - resolution: {integrity: sha512-k8Tum2vHNx3TMz7Rd8vvWGMhWJs3O3XGNWYUT4KPfOhnK2aWl8RtzdHmLrTrqYobaBYnzZnGG8c6MVzZP7cZzA==} + '@devframes/service-open@1.3.1': + resolution: {integrity: sha512-sQEth4hVIa/BTakrhHrzyfO8p6Aa/j99taHd5+RDFyI6mwQmvd1YkPrLjbdowjAn7Ba8O02Pb/B8i54R1/IwSQ==} peerDependencies: - devframe: 1.3.0 + devframe: 1.3.1 - '@devframes/vite@1.3.0': - resolution: {integrity: sha512-787X3D4EVMrfeT/9V2rZH6Wk9L8g+ngd+urZcUM6tjP/7O5qV02xE8NFAyGkAexXdvwxYUk0yl2xN6ceZNY6Vw==} + '@devframes/vite@1.3.1': + resolution: {integrity: sha512-pkEnVUc8ZCkL41e215SWTiQAqtcywGJnQsa7jGvVtGmanWxg58AgCqxJJbE123fPXYFl66aVdvt6abzj0ZwuXw==} peerDependencies: - '@devframes/hub': 1.3.0 - '@devframes/hub-ui': 1.3.0 - devframe: 1.3.0 + '@devframes/hub': 1.3.1 + '@devframes/hub-ui': 1.3.1 + devframe: 1.3.1 vite: ^7.0.0 || ^8.0.0 peerDependenciesMeta: '@devframes/hub': @@ -4859,14 +4848,6 @@ packages: crossws@0.3.5: resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} - crossws@0.4.12: - resolution: {integrity: sha512-aypfsr6t0uNvkqaZc6zvBfXzC6pLI0/sIulpkV6RwCVtZqG5ebBzv4weImKK0VNCj91Wl9F5j7p5WU4MNrybng==} - peerDependencies: - srvx: '>=0.11.5' - peerDependenciesMeta: - srvx: - optional: true - crossws@0.4.17: resolution: {integrity: sha512-YG2kyfafNXKmu7e6k64yrj6whrw7m5sBIsOSXOlJ/72X3TQWRQuw8DhvXFDcBk8HF77PnTSygnm7xpYCTnFpow==} peerDependencies: @@ -4995,11 +4976,11 @@ packages: engines: {node: '>= 16.0.0'} hasBin: true - devframe@1.3.0: - resolution: {integrity: sha512-3HR3SWp2ifVlZMxDE+4btodH0kak36heA8AKJzzD5orPnYyHi54vGrB5fTQ4RhuJL2qpOUITAvd8DVrV33YWIA==} + devframe@1.3.1: + resolution: {integrity: sha512-fqQ1jVncUy+0MmMOXuerq57b6dx5RUCfuwlQ4+Y4bK8SuSHSZHlXfE7dJdlj3higEdejS5YHS8IdKY+dvtAGCw==} hasBin: true peerDependencies: - '@devframes/agentic': 1.3.0 + '@devframes/agentic': 1.3.1 cac: ^7.0.0 peerDependenciesMeta: '@devframes/agentic': @@ -9079,75 +9060,75 @@ snapshots: '@csstools/css-tokenizer@4.0.1': {} - '@devframes/agentic@1.3.0(patch_hash=6ffcac3393c36e0a64405fe19f700836c1c5dd4b754477af1a7c60e3833c466a)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.0)': + '@devframes/agentic@1.3.1(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.1)': dependencies: '@modelcontextprotocol/client': 2.3.1 '@modelcontextprotocol/server': 2.3.1 - devframe: 1.3.0(patch_hash=9e7d48e3525a8faa535860f24e730b85c08d3aedbc9c228a7b6d36d3c99dd75a)(@devframes/agentic@1.3.0)(cac@7.1.0)(srvx@1.0.8) + devframe: 1.3.1(@devframes/agentic@1.3.1)(cac@7.1.0)(srvx@1.0.8) h3: 2.0.8(crossws@0.4.17(srvx@1.0.8)) pathe: 2.0.3 transitivePeerDependencies: - crossws - ocache - '@devframes/hub-ui@1.3.0(@devframes/hub@1.3.0(patch_hash=30b066fc559322c735b40d1b6119cb677509f16e9ed244c17e555016723bb39c)(@devframes/agentic@1.3.0)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.0))(devframe@1.3.0)': + '@devframes/hub-ui@1.3.1(@devframes/hub@1.3.1(@devframes/agentic@1.3.1)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.1))(devframe@1.3.1)': dependencies: - '@devframes/hub': 1.3.0(patch_hash=30b066fc559322c735b40d1b6119cb677509f16e9ed244c17e555016723bb39c)(@devframes/agentic@1.3.0)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.0) - devframe: 1.3.0(patch_hash=9e7d48e3525a8faa535860f24e730b85c08d3aedbc9c228a7b6d36d3c99dd75a)(@devframes/agentic@1.3.0)(cac@7.1.0)(srvx@1.0.8) + '@devframes/hub': 1.3.1(@devframes/agentic@1.3.1)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.1) + devframe: 1.3.1(@devframes/agentic@1.3.1)(cac@7.1.0)(srvx@1.0.8) - '@devframes/hub@1.3.0(patch_hash=30b066fc559322c735b40d1b6119cb677509f16e9ed244c17e555016723bb39c)(@devframes/agentic@1.3.0)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.0)': + '@devframes/hub@1.3.1(@devframes/agentic@1.3.1)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.1)': dependencies: destr: 2.0.5 - devframe: 1.3.0(patch_hash=9e7d48e3525a8faa535860f24e730b85c08d3aedbc9c228a7b6d36d3c99dd75a)(@devframes/agentic@1.3.0)(cac@7.1.0)(srvx@1.0.8) + devframe: 1.3.1(@devframes/agentic@1.3.1)(cac@7.1.0)(srvx@1.0.8) h3: 2.0.8(crossws@0.4.17(srvx@1.0.8)) pathe: 2.0.3 tinyexec: 1.3.1 zigpty: 0.2.1 optionalDependencies: - '@devframes/agentic': 1.3.0(patch_hash=6ffcac3393c36e0a64405fe19f700836c1c5dd4b754477af1a7c60e3833c466a)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.0) + '@devframes/agentic': 1.3.1(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.1) transitivePeerDependencies: - crossws - ocache - '@devframes/plugin-messages--assets@1.3.0': {} + '@devframes/plugin-messages--assets@1.3.1': {} - '@devframes/plugin-messages@1.3.0(@devframes/hub@1.3.0(patch_hash=30b066fc559322c735b40d1b6119cb677509f16e9ed244c17e555016723bb39c)(@devframes/agentic@1.3.0)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.0))(@devframes/plugin-messages--assets@1.3.0)(devframe@1.3.0)(vite@8.3.0(@types/node@24.13.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.105.0)(terser@5.51.2)(yaml@2.9.0))': + '@devframes/plugin-messages@1.3.1(@devframes/hub@1.3.1(@devframes/agentic@1.3.1)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.1))(@devframes/plugin-messages--assets@1.3.1)(devframe@1.3.1)(vite@8.3.0(@types/node@24.13.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.105.0)(terser@5.51.2)(yaml@2.9.0))': dependencies: - '@devframes/hub': 1.3.0(patch_hash=30b066fc559322c735b40d1b6119cb677509f16e9ed244c17e555016723bb39c)(@devframes/agentic@1.3.0)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.0) - '@devframes/service-open': 1.3.0(devframe@1.3.0) + '@devframes/hub': 1.3.1(@devframes/agentic@1.3.1)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.1) + '@devframes/service-open': 1.3.1(devframe@1.3.1) cac: 7.1.0 - devframe: 1.3.0(patch_hash=9e7d48e3525a8faa535860f24e730b85c08d3aedbc9c228a7b6d36d3c99dd75a)(@devframes/agentic@1.3.0)(cac@7.1.0)(srvx@1.0.8) + devframe: 1.3.1(@devframes/agentic@1.3.1)(cac@7.1.0)(srvx@1.0.8) optionalDependencies: - '@devframes/plugin-messages--assets': 1.3.0 + '@devframes/plugin-messages--assets': 1.3.1 vite: 8.3.0(@types/node@24.13.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.105.0)(terser@5.51.2)(yaml@2.9.0) - '@devframes/plugin-terminals--assets@1.3.0': {} + '@devframes/plugin-terminals--assets@1.3.1': {} - '@devframes/plugin-terminals@1.3.0(@devframes/hub-ui@1.3.0(@devframes/hub@1.3.0(patch_hash=30b066fc559322c735b40d1b6119cb677509f16e9ed244c17e555016723bb39c)(@devframes/agentic@1.3.0)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.0))(devframe@1.3.0))(@devframes/hub@1.3.0(patch_hash=30b066fc559322c735b40d1b6119cb677509f16e9ed244c17e555016723bb39c)(@devframes/agentic@1.3.0)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.0))(@devframes/plugin-terminals--assets@1.3.0)(devframe@1.3.0)(vite@8.3.0(@types/node@24.13.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.105.0)(terser@5.51.2)(yaml@2.9.0))': + '@devframes/plugin-terminals@1.3.1(@devframes/hub-ui@1.3.1(@devframes/hub@1.3.1(@devframes/agentic@1.3.1)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.1))(devframe@1.3.1))(@devframes/hub@1.3.1(@devframes/agentic@1.3.1)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.1))(@devframes/plugin-terminals--assets@1.3.1)(devframe@1.3.1)(vite@8.3.0(@types/node@24.13.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.105.0)(terser@5.51.2)(yaml@2.9.0))': dependencies: - '@devframes/vite': 1.3.0(@devframes/hub-ui@1.3.0(@devframes/hub@1.3.0(patch_hash=30b066fc559322c735b40d1b6119cb677509f16e9ed244c17e555016723bb39c)(@devframes/agentic@1.3.0)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.0))(devframe@1.3.0))(@devframes/hub@1.3.0(patch_hash=30b066fc559322c735b40d1b6119cb677509f16e9ed244c17e555016723bb39c)(@devframes/agentic@1.3.0)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.0))(devframe@1.3.0)(vite@8.3.0(@types/node@24.13.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.105.0)(terser@5.51.2)(yaml@2.9.0)) + '@devframes/vite': 1.3.1(@devframes/hub-ui@1.3.1(@devframes/hub@1.3.1(@devframes/agentic@1.3.1)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.1))(devframe@1.3.1))(@devframes/hub@1.3.1(@devframes/agentic@1.3.1)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.1))(devframe@1.3.1)(vite@8.3.0(@types/node@24.13.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.105.0)(terser@5.51.2)(yaml@2.9.0)) cac: 7.1.0 - devframe: 1.3.0(patch_hash=9e7d48e3525a8faa535860f24e730b85c08d3aedbc9c228a7b6d36d3c99dd75a)(@devframes/agentic@1.3.0)(cac@7.1.0)(srvx@1.0.8) + devframe: 1.3.1(@devframes/agentic@1.3.1)(cac@7.1.0)(srvx@1.0.8) zigpty: 0.2.1 optionalDependencies: - '@devframes/plugin-terminals--assets': 1.3.0 + '@devframes/plugin-terminals--assets': 1.3.1 vite: 8.3.0(@types/node@24.13.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.105.0)(terser@5.51.2)(yaml@2.9.0) transitivePeerDependencies: - '@devframes/hub' - '@devframes/hub-ui' - '@devframes/service-open@1.3.0(devframe@1.3.0)': + '@devframes/service-open@1.3.1(devframe@1.3.1)': dependencies: - devframe: 1.3.0(patch_hash=9e7d48e3525a8faa535860f24e730b85c08d3aedbc9c228a7b6d36d3c99dd75a)(@devframes/agentic@1.3.0)(cac@7.1.0)(srvx@1.0.8) + devframe: 1.3.1(@devframes/agentic@1.3.1)(cac@7.1.0)(srvx@1.0.8) pathe: 2.0.3 - '@devframes/vite@1.3.0(@devframes/hub-ui@1.3.0(@devframes/hub@1.3.0(patch_hash=30b066fc559322c735b40d1b6119cb677509f16e9ed244c17e555016723bb39c)(@devframes/agentic@1.3.0)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.0))(devframe@1.3.0))(@devframes/hub@1.3.0(patch_hash=30b066fc559322c735b40d1b6119cb677509f16e9ed244c17e555016723bb39c)(@devframes/agentic@1.3.0)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.0))(devframe@1.3.0)(vite@8.3.0(@types/node@24.13.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.105.0)(terser@5.51.2)(yaml@2.9.0))': + '@devframes/vite@1.3.1(@devframes/hub-ui@1.3.1(@devframes/hub@1.3.1(@devframes/agentic@1.3.1)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.1))(devframe@1.3.1))(@devframes/hub@1.3.1(@devframes/agentic@1.3.1)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.1))(devframe@1.3.1)(vite@8.3.0(@types/node@24.13.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.105.0)(terser@5.51.2)(yaml@2.9.0))': dependencies: - devframe: 1.3.0(patch_hash=9e7d48e3525a8faa535860f24e730b85c08d3aedbc9c228a7b6d36d3c99dd75a)(@devframes/agentic@1.3.0)(cac@7.1.0)(srvx@1.0.8) + devframe: 1.3.1(@devframes/agentic@1.3.1)(cac@7.1.0)(srvx@1.0.8) pathe: 2.0.3 optionalDependencies: - '@devframes/hub': 1.3.0(patch_hash=30b066fc559322c735b40d1b6119cb677509f16e9ed244c17e555016723bb39c)(@devframes/agentic@1.3.0)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.0) - '@devframes/hub-ui': 1.3.0(@devframes/hub@1.3.0(patch_hash=30b066fc559322c735b40d1b6119cb677509f16e9ed244c17e555016723bb39c)(@devframes/agentic@1.3.0)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.0))(devframe@1.3.0) + '@devframes/hub': 1.3.1(@devframes/agentic@1.3.1)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.1) + '@devframes/hub-ui': 1.3.1(@devframes/hub@1.3.1(@devframes/agentic@1.3.1)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.1))(devframe@1.3.1) vite: 8.3.0(@types/node@24.13.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.105.0)(terser@5.51.2)(yaml@2.9.0) '@emnapi/core@1.11.1': @@ -11761,10 +11742,6 @@ snapshots: dependencies: uncrypto: 0.1.3 - crossws@0.4.12(srvx@1.0.8): - optionalDependencies: - srvx: 1.0.8 - crossws@0.4.17(srvx@1.0.8): optionalDependencies: srvx: 1.0.8 @@ -11852,14 +11829,14 @@ snapshots: dependencies: address: 2.0.3 - devframe@1.3.0(patch_hash=9e7d48e3525a8faa535860f24e730b85c08d3aedbc9c228a7b6d36d3c99dd75a)(@devframes/agentic@1.3.0)(cac@7.1.0)(srvx@1.0.8): + devframe@1.3.1(@devframes/agentic@1.3.1)(cac@7.1.0)(srvx@1.0.8): dependencies: crossws: 0.4.17(srvx@1.0.8) h3: 2.0.8(crossws@0.4.17(srvx@1.0.8)) nostics: 1.3.0 pathe: 2.0.3 optionalDependencies: - '@devframes/agentic': 1.3.0(patch_hash=6ffcac3393c36e0a64405fe19f700836c1c5dd4b754477af1a7c60e3833c466a)(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.0) + '@devframes/agentic': 1.3.1(crossws@0.4.17(srvx@1.0.8))(devframe@1.3.1) cac: 7.1.0 transitivePeerDependencies: - ocache @@ -12864,7 +12841,7 @@ snapshots: '@parcel/watcher-wasm': 2.6.0 citty: 0.2.2 consola: 3.4.2 - crossws: 0.4.12(srvx@1.0.8) + crossws: 0.4.17(srvx@1.0.8) defu: 6.1.7 get-port-please: 3.2.0 h3: 1.15.11 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index e4366030..4cd38522 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -10,7 +10,3 @@ packageExtensions: '@analogjs/vite-plugin-nitro': dependencies: h3: ^1.15.0 -patchedDependencies: - '@devframes/agentic@1.3.0': patches/@devframes__agentic@1.3.0.patch - '@devframes/hub@1.3.0': patches/@devframes__hub@1.3.0.patch - devframe@1.3.0: patches/devframe@1.3.0.patch diff --git a/scripts/e2e-install.mjs b/scripts/e2e-install.mjs index c1a6085b..47094d89 100644 --- a/scripts/e2e-install.mjs +++ b/scripts/e2e-install.mjs @@ -18,7 +18,7 @@ * analog `create-analog`, the Vite plugin as vite.md shows (no overlay import), a * `vite build`, then the Vite dev server. * cli The standalone CLI in cli.md: `npx @pangular-inspector/devtools dev` without - * installing, with its MCP endpoint listing resource templates, then the + * installing, with its MCP endpoint listing resource templates and prompts, then the * installed `pangular build` static report. * * Package managers: npm, pnpm, yarn and bun. One that is not installed is skipped and says so. @@ -720,7 +720,7 @@ async function cliScenario(cell) { await step(cell, 'browser: the dev panel shows the source scan', () => checkInBrowser(cell, { panelUrl: `${base}/`, codeLog: devLog, live: false }), ); - await step(cell, 'MCP: resources/templates/list is not empty', () => + await step(cell, 'MCP: resource templates and prompts are listed', () => checkMcpLists(`${base}/__mcp`, mcpToken), ); } finally { diff --git a/scripts/lib/local-registry.mjs b/scripts/lib/local-registry.mjs index 6f27659d..ba592d2a 100644 --- a/scripts/lib/local-registry.mjs +++ b/scripts/lib/local-registry.mjs @@ -352,9 +352,8 @@ async function mcpRequest(url, session, id, method, params = {}) { } /** - * The installed package's MCP endpoint lists resource templates, which devframe 1.3.0 and later - * serve. Prompts still come from a workspace patch that doesn't ship, so their count is reported - * but not required. `token` is the bearer token the server asks for, if any. + * The installed package's MCP endpoint lists resource templates (devframe 1.3.0 and later) and + * prompts (devframe 1.3.1 and later). `token` is the bearer token the server asks for, if any. */ export async function checkMcpLists(url, token) { const session = { token }; @@ -367,10 +366,10 @@ export async function checkMcpLists(url, token) { await mcpRequest(url, session, undefined, 'notifications/initialized'); const { resourceTemplates } = await mcpRequest(url, session, 2, 'resources/templates/list'); if (!resourceTemplates?.length) throw new Error(`resources/templates/list at ${url} is empty`); - const prompts = init.capabilities?.prompts - ? ((await mcpRequest(url, session, 3, 'prompts/list')).prompts?.length ?? 0) - : 0; - return `${resourceTemplates.length} resource templates and ${prompts} prompts over MCP`; + if (!init.capabilities?.prompts) throw new Error(`${url} declares no prompts capability`); + const { prompts } = await mcpRequest(url, session, 3, 'prompts/list'); + if (!prompts?.length) throw new Error(`prompts/list at ${url} is empty`); + return `${resourceTemplates.length} resource templates and ${prompts.length} prompts over MCP`; } /** The panel page has its title and names a script that loads. */