@nifrajs/cli 3.3.0 → 4.0.0
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.
- package/README.md +42 -3
- package/dist/app-files.d.ts +11 -0
- package/dist/app-files.d.ts.map +1 -0
- package/dist/app-files.js +34 -0
- package/dist/app-files.js.map +1 -0
- package/dist/assure-hydration.d.ts +7 -1
- package/dist/assure-hydration.d.ts.map +1 -1
- package/dist/assure-hydration.js +128 -43
- package/dist/assure-hydration.js.map +1 -1
- package/dist/assure.d.ts.map +1 -1
- package/dist/assure.js +16 -2
- package/dist/assure.js.map +1 -1
- package/dist/capabilities-tool.d.ts +5 -1
- package/dist/capabilities-tool.d.ts.map +1 -1
- package/dist/capabilities-tool.js +32 -10
- package/dist/capabilities-tool.js.map +1 -1
- package/dist/cdn-check.d.ts +41 -0
- package/dist/cdn-check.d.ts.map +1 -0
- package/dist/cdn-check.js +207 -0
- package/dist/cdn-check.js.map +1 -0
- package/dist/check-diagnostics.d.ts +7 -15
- package/dist/check-diagnostics.d.ts.map +1 -1
- package/dist/check-diagnostics.js +162 -713
- package/dist/check-diagnostics.js.map +1 -1
- package/dist/check-scan.d.ts +58 -7
- package/dist/check-scan.d.ts.map +1 -1
- package/dist/check-scan.js +323 -62
- package/dist/check-scan.js.map +1 -1
- package/dist/check.d.ts +1 -0
- package/dist/check.d.ts.map +1 -1
- package/dist/check.js +145 -54
- package/dist/check.js.map +1 -1
- package/dist/cli.d.ts +42 -16
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +306 -87
- package/dist/cli.js.map +1 -1
- package/dist/command-catalog.d.ts +60 -5
- package/dist/command-catalog.d.ts.map +1 -1
- package/dist/command-catalog.js +298 -33
- package/dist/command-catalog.js.map +1 -1
- package/dist/config-target.d.ts +8 -0
- package/dist/config-target.d.ts.map +1 -0
- package/dist/config-target.js +45 -0
- package/dist/config-target.js.map +1 -0
- package/dist/contracts.d.ts +3 -2
- package/dist/contracts.d.ts.map +1 -1
- package/dist/contracts.js +56 -16
- package/dist/contracts.js.map +1 -1
- package/dist/db-audit.d.ts +37 -0
- package/dist/db-audit.d.ts.map +1 -0
- package/dist/db-audit.js +99 -0
- package/dist/db-audit.js.map +1 -0
- package/dist/db-child.d.ts +64 -0
- package/dist/db-child.d.ts.map +1 -0
- package/dist/db-child.js +213 -0
- package/dist/db-child.js.map +1 -0
- package/dist/db-config.d.ts +60 -0
- package/dist/db-config.d.ts.map +1 -0
- package/dist/db-config.js +176 -0
- package/dist/db-config.js.map +1 -0
- package/dist/db-tool.d.ts +84 -0
- package/dist/db-tool.d.ts.map +1 -0
- package/dist/db-tool.js +537 -0
- package/dist/db-tool.js.map +1 -0
- package/dist/dev-bun-config.d.ts +20 -13
- package/dist/dev-bun-config.d.ts.map +1 -1
- package/dist/dev-bun-config.js +98 -41
- package/dist/dev-bun-config.js.map +1 -1
- package/dist/dev-feed-tool.d.ts +106 -0
- package/dist/dev-feed-tool.d.ts.map +1 -0
- package/dist/dev-feed-tool.js +713 -0
- package/dist/dev-feed-tool.js.map +1 -0
- package/dist/dev-server-client.d.ts +67 -0
- package/dist/dev-server-client.d.ts.map +1 -0
- package/dist/dev-server-client.js +195 -0
- package/dist/dev-server-client.js.map +1 -0
- package/dist/diagnostics.d.ts +86 -0
- package/dist/diagnostics.d.ts.map +1 -1
- package/dist/diagnostics.js +85 -0
- package/dist/diagnostics.js.map +1 -1
- package/dist/diff-tool.d.ts +3 -3
- package/dist/diff-tool.d.ts.map +1 -1
- package/dist/diff-tool.js +6 -5
- package/dist/diff-tool.js.map +1 -1
- package/dist/docs-search.d.ts.map +1 -1
- package/dist/docs-search.js +12 -4
- package/dist/docs-search.js.map +1 -1
- package/dist/doctor.d.ts +17 -0
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +76 -15
- package/dist/doctor.js.map +1 -1
- package/dist/env-file.d.ts +15 -0
- package/dist/env-file.d.ts.map +1 -1
- package/dist/env-file.js +73 -1
- package/dist/env-file.js.map +1 -1
- package/dist/fix-recipes.d.ts.map +1 -1
- package/dist/fix-recipes.js +41 -21
- package/dist/fix-recipes.js.map +1 -1
- package/dist/frontend-guidance.js +5 -5
- package/dist/frontend-guidance.js.map +1 -1
- package/dist/i18n-check.d.ts +16 -0
- package/dist/i18n-check.d.ts.map +1 -0
- package/dist/i18n-check.js +154 -0
- package/dist/i18n-check.js.map +1 -0
- package/dist/init-agents.d.ts +49 -13
- package/dist/init-agents.d.ts.map +1 -1
- package/dist/init-agents.js +239 -34
- package/dist/init-agents.js.map +1 -1
- package/dist/internal/code-unit-order.d.ts +4 -0
- package/dist/internal/code-unit-order.d.ts.map +1 -0
- package/dist/internal/code-unit-order.js +6 -0
- package/dist/internal/code-unit-order.js.map +1 -0
- package/dist/internal/script-kind.d.ts +7 -0
- package/dist/internal/script-kind.d.ts.map +1 -0
- package/dist/internal/script-kind.js +12 -0
- package/dist/internal/script-kind.js.map +1 -0
- package/dist/internal/source-facts.d.ts +5 -0
- package/dist/internal/source-facts.d.ts.map +1 -1
- package/dist/internal/source-facts.js +61 -5
- package/dist/internal/source-facts.js.map +1 -1
- package/dist/internal/typescript-import.d.ts +49 -24
- package/dist/internal/typescript-import.d.ts.map +1 -1
- package/dist/internal/typescript-import.js +507 -67
- package/dist/internal/typescript-import.js.map +1 -1
- package/dist/introspect.d.ts +6 -4
- package/dist/introspect.d.ts.map +1 -1
- package/dist/introspect.js +93 -74
- package/dist/introspect.js.map +1 -1
- package/dist/learn.js +3 -3
- package/dist/learn.js.map +1 -1
- package/dist/levels-tool.d.ts +10 -0
- package/dist/levels-tool.d.ts.map +1 -1
- package/dist/levels-tool.js +33 -3
- package/dist/levels-tool.js.map +1 -1
- package/dist/load.d.ts +71 -16
- package/dist/load.d.ts.map +1 -1
- package/dist/load.js +78 -18
- package/dist/load.js.map +1 -1
- package/dist/manifest-tool.d.ts.map +1 -1
- package/dist/manifest-tool.js +3 -2
- package/dist/manifest-tool.js.map +1 -1
- package/dist/mcp-app-tool.d.ts.map +1 -1
- package/dist/mcp-app-tool.js +2 -0
- package/dist/mcp-app-tool.js.map +1 -1
- package/dist/mcp-context.d.ts.map +1 -1
- package/dist/mcp-context.js +5 -6
- package/dist/mcp-context.js.map +1 -1
- package/dist/mcp-delegate.d.ts +57 -0
- package/dist/mcp-delegate.d.ts.map +1 -0
- package/dist/mcp-delegate.js +130 -0
- package/dist/mcp-delegate.js.map +1 -0
- package/dist/mcp-docs-tools.d.ts.map +1 -1
- package/dist/mcp-docs-tools.js +23 -5
- package/dist/mcp-docs-tools.js.map +1 -1
- package/dist/mcp-exec.d.ts +3 -0
- package/dist/mcp-exec.d.ts.map +1 -1
- package/dist/mcp-exec.js +263 -131
- package/dist/mcp-exec.js.map +1 -1
- package/dist/mcp-http.d.ts.map +1 -1
- package/dist/mcp-http.js +20 -5
- package/dist/mcp-http.js.map +1 -1
- package/dist/mcp-io.d.ts +26 -0
- package/dist/mcp-io.d.ts.map +1 -1
- package/dist/mcp-io.js +113 -0
- package/dist/mcp-io.js.map +1 -1
- package/dist/mcp-isolate.d.ts +48 -0
- package/dist/mcp-isolate.d.ts.map +1 -0
- package/dist/mcp-isolate.js +222 -0
- package/dist/mcp-isolate.js.map +1 -0
- package/dist/mcp-path.d.ts +10 -0
- package/dist/mcp-path.d.ts.map +1 -0
- package/dist/mcp-path.js +51 -0
- package/dist/mcp-path.js.map +1 -0
- package/dist/mcp-project-child.d.ts +74 -0
- package/dist/mcp-project-child.d.ts.map +1 -0
- package/dist/mcp-project-child.js +130 -0
- package/dist/mcp-project-child.js.map +1 -0
- package/dist/mcp-reflect.d.ts.map +1 -1
- package/dist/mcp-reflect.js +2 -2
- package/dist/mcp-reflect.js.map +1 -1
- package/dist/mcp-render.d.ts.map +1 -1
- package/dist/mcp-render.js +64 -45
- package/dist/mcp-render.js.map +1 -1
- package/dist/mcp-root.d.ts +37 -9
- package/dist/mcp-root.d.ts.map +1 -1
- package/dist/mcp-root.js +124 -25
- package/dist/mcp-root.js.map +1 -1
- package/dist/mcp-run.d.ts +18 -1
- package/dist/mcp-run.d.ts.map +1 -1
- package/dist/mcp-run.js +159 -55
- package/dist/mcp-run.js.map +1 -1
- package/dist/mcp-ws.js +4 -1
- package/dist/mcp-ws.js.map +1 -1
- package/dist/mcp.d.ts +18 -5
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +165 -82
- package/dist/mcp.js.map +1 -1
- package/dist/migrate-layout.d.ts +44 -0
- package/dist/migrate-layout.d.ts.map +1 -0
- package/dist/migrate-layout.js +982 -0
- package/dist/migrate-layout.js.map +1 -0
- package/dist/openapi-tool.d.ts +2 -2
- package/dist/openapi-tool.d.ts.map +1 -1
- package/dist/openapi-tool.js.map +1 -1
- package/dist/openapi-types.d.ts +2 -1
- package/dist/openapi-types.d.ts.map +1 -1
- package/dist/openapi-types.js +240 -12
- package/dist/openapi-types.js.map +1 -1
- package/dist/pipeline-report.d.ts +3 -2
- package/dist/pipeline-report.d.ts.map +1 -1
- package/dist/pipeline-report.js +19 -16
- package/dist/pipeline-report.js.map +1 -1
- package/dist/port.d.ts +5 -4
- package/dist/port.d.ts.map +1 -1
- package/dist/port.js +46 -29
- package/dist/port.js.map +1 -1
- package/dist/project-facts.d.ts +28 -4
- package/dist/project-facts.d.ts.map +1 -1
- package/dist/project-facts.js +12 -2
- package/dist/project-facts.js.map +1 -1
- package/dist/recipes/4.0.0.d.ts +9 -0
- package/dist/recipes/4.0.0.d.ts.map +1 -0
- package/dist/recipes/4.0.0.js +34 -0
- package/dist/recipes/4.0.0.js.map +1 -0
- package/dist/recipes/index.d.ts.map +1 -1
- package/dist/recipes/index.js +2 -0
- package/dist/recipes/index.js.map +1 -1
- package/dist/release-verification.d.ts +11 -1
- package/dist/release-verification.d.ts.map +1 -1
- package/dist/release-verification.js +47 -4
- package/dist/release-verification.js.map +1 -1
- package/dist/review.d.ts +21 -0
- package/dist/review.d.ts.map +1 -0
- package/dist/review.js +823 -0
- package/dist/review.js.map +1 -0
- package/dist/route-types.d.ts +28 -0
- package/dist/route-types.d.ts.map +1 -0
- package/dist/route-types.js +106 -0
- package/dist/route-types.js.map +1 -0
- package/dist/rules/codes.d.ts +9 -0
- package/dist/rules/codes.d.ts.map +1 -1
- package/dist/rules/codes.js +9 -0
- package/dist/rules/codes.js.map +1 -1
- package/dist/rules/data-guard.d.ts +12 -0
- package/dist/rules/data-guard.d.ts.map +1 -0
- package/dist/rules/data-guard.js +213 -0
- package/dist/rules/data-guard.js.map +1 -0
- package/dist/rules/index.d.ts +3 -0
- package/dist/rules/index.d.ts.map +1 -1
- package/dist/rules/index.js +17 -5
- package/dist/rules/index.js.map +1 -1
- package/dist/rules/islands.d.ts.map +1 -1
- package/dist/rules/islands.js +7 -4
- package/dist/rules/islands.js.map +1 -1
- package/dist/rules/legacy.d.ts +3 -1
- package/dist/rules/legacy.d.ts.map +1 -1
- package/dist/rules/legacy.js +829 -34
- package/dist/rules/legacy.js.map +1 -1
- package/dist/rules/nano.d.ts.map +1 -1
- package/dist/rules/nano.js +15 -6
- package/dist/rules/nano.js.map +1 -1
- package/dist/rules/pages.d.ts +15 -0
- package/dist/rules/pages.d.ts.map +1 -0
- package/dist/rules/pages.js +88 -0
- package/dist/rules/pages.js.map +1 -0
- package/dist/rules/routes.d.ts +11 -0
- package/dist/rules/routes.d.ts.map +1 -1
- package/dist/rules/routes.js +180 -2
- package/dist/rules/routes.js.map +1 -1
- package/dist/rules/secrets.d.ts +10 -0
- package/dist/rules/secrets.d.ts.map +1 -0
- package/dist/rules/secrets.js +169 -0
- package/dist/rules/secrets.js.map +1 -0
- package/dist/rules/security.d.ts +7 -0
- package/dist/rules/security.d.ts.map +1 -1
- package/dist/rules/security.js +171 -65
- package/dist/rules/security.js.map +1 -1
- package/dist/rules/typescript.d.ts +16 -0
- package/dist/rules/typescript.d.ts.map +1 -0
- package/dist/rules/typescript.js +59 -0
- package/dist/rules/typescript.js.map +1 -0
- package/dist/rules/zones.d.ts +17 -0
- package/dist/rules/zones.d.ts.map +1 -0
- package/dist/rules/zones.js +174 -0
- package/dist/rules/zones.js.map +1 -0
- package/dist/scaffold.d.ts +25 -12
- package/dist/scaffold.d.ts.map +1 -1
- package/dist/scaffold.js +154 -90
- package/dist/scaffold.js.map +1 -1
- package/dist/sdk.d.ts +17 -3
- package/dist/sdk.d.ts.map +1 -1
- package/dist/sdk.js +941 -153
- package/dist/sdk.js.map +1 -1
- package/dist/search-terms.d.ts +2 -0
- package/dist/search-terms.d.ts.map +1 -1
- package/dist/search-terms.js +23 -8
- package/dist/search-terms.js.map +1 -1
- package/dist/smoke.d.ts +79 -0
- package/dist/smoke.d.ts.map +1 -0
- package/dist/smoke.js +494 -0
- package/dist/smoke.js.map +1 -0
- package/dist/sync-manifest.d.ts.map +1 -1
- package/dist/sync-manifest.js +2 -1
- package/dist/sync-manifest.js.map +1 -1
- package/dist/sync-routes.d.ts +4 -3
- package/dist/sync-routes.d.ts.map +1 -1
- package/dist/sync-routes.js +4 -3
- package/dist/sync-routes.js.map +1 -1
- package/dist/test-tool.d.ts.map +1 -1
- package/dist/test-tool.js +30 -11
- package/dist/test-tool.js.map +1 -1
- package/dist/types-search.d.ts.map +1 -1
- package/dist/types-search.js +11 -5
- package/dist/types-search.js.map +1 -1
- package/dist/upgrade.d.ts +36 -6
- package/dist/upgrade.d.ts.map +1 -1
- package/dist/upgrade.js +167 -29
- package/dist/upgrade.js.map +1 -1
- package/dist/verification-plan.d.ts.map +1 -1
- package/dist/verification-plan.js +8 -0
- package/dist/verification-plan.js.map +1 -1
- package/dist/verification.d.ts.map +1 -1
- package/dist/verification.js +45 -12
- package/dist/verification.js.map +1 -1
- package/dist/web-app-options.d.ts +19 -0
- package/dist/web-app-options.d.ts.map +1 -0
- package/dist/web-app-options.js +49 -0
- package/dist/web-app-options.js.map +1 -0
- package/dist/work-graph.d.ts +3 -0
- package/dist/work-graph.d.ts.map +1 -1
- package/dist/work-graph.js +33 -16
- package/dist/work-graph.js.map +1 -1
- package/docs/examples.json +185 -29
- package/docs/llms-full.txt +4123 -548
- package/docs/types.json +14391 -10060
- package/package.json +19 -11
- package/src/app-files.ts +40 -0
- package/src/assure-hydration.ts +139 -46
- package/src/assure.ts +17 -2
- package/src/capabilities-tool.ts +35 -9
- package/src/cdn-check.ts +268 -0
- package/src/check-diagnostics.ts +199 -797
- package/src/check-scan.ts +394 -63
- package/src/check.ts +146 -58
- package/src/cli.ts +347 -92
- package/src/command-catalog.ts +407 -45
- package/src/config-target.ts +47 -0
- package/src/contracts.ts +66 -15
- package/src/db-audit.ts +128 -0
- package/src/db-child.ts +285 -0
- package/src/db-config.ts +224 -0
- package/src/db-tool.ts +690 -0
- package/src/dev-bun-config.ts +116 -40
- package/src/dev-feed-tool.ts +912 -0
- package/src/dev-server-client.ts +267 -0
- package/src/diagnostics.ts +179 -0
- package/src/diff-tool.ts +6 -5
- package/src/docs-search.ts +10 -3
- package/src/doctor.ts +98 -15
- package/src/env-file.ts +78 -1
- package/src/fix-recipes.ts +44 -31
- package/src/frontend-guidance.ts +5 -5
- package/src/i18n-check.ts +179 -0
- package/src/init-agents.ts +301 -38
- package/src/internal/code-unit-order.ts +5 -0
- package/src/internal/script-kind.ts +11 -0
- package/src/internal/source-facts.ts +96 -22
- package/src/internal/typescript-import.ts +663 -68
- package/src/introspect.ts +93 -82
- package/src/learn.ts +3 -3
- package/src/levels-tool.ts +47 -2
- package/src/load.ts +144 -32
- package/src/manifest-tool.ts +3 -2
- package/src/mcp-app-tool.ts +2 -0
- package/src/mcp-context.ts +5 -7
- package/src/mcp-delegate.ts +162 -0
- package/src/mcp-docs-tools.ts +23 -5
- package/src/mcp-exec.ts +301 -161
- package/src/mcp-http.ts +22 -5
- package/src/mcp-io.ts +130 -0
- package/src/mcp-isolate.ts +287 -0
- package/src/mcp-path.ts +50 -0
- package/src/mcp-project-child.ts +182 -0
- package/src/mcp-reflect.ts +3 -2
- package/src/mcp-render.ts +72 -42
- package/src/mcp-root.ts +130 -24
- package/src/mcp-run.ts +190 -56
- package/src/mcp-ws.ts +4 -1
- package/src/mcp.ts +193 -91
- package/src/migrate-layout.ts +1121 -0
- package/src/openapi-tool.ts +7 -3
- package/src/openapi-types.ts +315 -13
- package/src/pipeline-report.ts +22 -18
- package/src/port.ts +53 -30
- package/src/project-facts.ts +42 -8
- package/src/recipes/4.0.0.ts +35 -0
- package/src/recipes/index.ts +2 -0
- package/src/release-verification.ts +74 -5
- package/src/review.ts +988 -0
- package/src/route-types.ts +133 -0
- package/src/rules/codes.ts +9 -0
- package/src/rules/data-guard.ts +230 -0
- package/src/rules/index.ts +18 -5
- package/src/rules/islands.ts +12 -4
- package/src/rules/legacy.ts +947 -35
- package/src/rules/nano.ts +18 -6
- package/src/rules/pages.ts +99 -0
- package/src/rules/routes.ts +181 -2
- package/src/rules/secrets.ts +174 -0
- package/src/rules/security.ts +198 -70
- package/src/rules/typescript.ts +77 -0
- package/src/rules/zones.ts +195 -0
- package/src/scaffold.ts +175 -98
- package/src/sdk.ts +1215 -158
- package/src/search-terms.ts +24 -7
- package/src/smoke.ts +607 -0
- package/src/sync-manifest.ts +2 -1
- package/src/sync-routes.ts +4 -3
- package/src/test-tool.ts +32 -11
- package/src/types-search.ts +11 -4
- package/src/upgrade.ts +205 -25
- package/src/verification-plan.ts +27 -0
- package/src/verification.ts +50 -12
- package/src/web-app-options.ts +57 -0
- package/src/work-graph.ts +40 -16
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where `nifra mcp` keeps project code: in a fresh subprocess per call (`mcp-project-child.ts`), never
|
|
3
|
+
* in the server. The server lists the tools, resources and prompts and forwards each call; the child,
|
|
4
|
+
* started in the project's directory, loads `.env` there, imports the config and the backend, answers
|
|
5
|
+
* and exits. So the server holds neither the project's environment nor its modules, and every call
|
|
6
|
+
* sees the project's current code.
|
|
7
|
+
*/
|
|
8
|
+
import { randomUUID } from "node:crypto";
|
|
9
|
+
import { existsSync } from "node:fs";
|
|
10
|
+
import { resolve } from "node:path";
|
|
11
|
+
import { fileURLToPath } from "node:url";
|
|
12
|
+
import { CONFIG_FILE } from "./app-files.js";
|
|
13
|
+
import { appFingerprint } from "./mcp-exec.js";
|
|
14
|
+
import { CHILD_TIMEOUT_MS, readBoundedLines, readBoundedStream } from "./mcp-io.js";
|
|
15
|
+
/**
|
|
16
|
+
* Project tools that stay in the server, because none runs project code in this process: each starts
|
|
17
|
+
* its own subprocess (run, render, ws, hydrate, test, the database tools), or reads only the
|
|
18
|
+
* framework's docs or the dev server's feed. `mcp-project-isolation.test.ts` calls each one and fails
|
|
19
|
+
* if the server evaluated project code, or if a name here has no probe there.
|
|
20
|
+
*/
|
|
21
|
+
export const IN_PROCESS_TOOLS = new Set([
|
|
22
|
+
"nifra_run",
|
|
23
|
+
"nifra_render",
|
|
24
|
+
"nifra_ws",
|
|
25
|
+
"nifra_hydrate",
|
|
26
|
+
"nifra_test",
|
|
27
|
+
"nifra_db_schema",
|
|
28
|
+
"nifra_db_query",
|
|
29
|
+
"nifra_db_role",
|
|
30
|
+
"nifra_errors",
|
|
31
|
+
"nifra_logs",
|
|
32
|
+
"nifra_inspect",
|
|
33
|
+
"nifra_explain",
|
|
34
|
+
"nifra_docs",
|
|
35
|
+
"nifra_example",
|
|
36
|
+
"nifra_types",
|
|
37
|
+
"nifra_learn",
|
|
38
|
+
"nifra_frontend",
|
|
39
|
+
]);
|
|
40
|
+
/** A tool result is bounded again by the stdio message limit when the server sends it. */
|
|
41
|
+
const ANSWER_MAX_BYTES = 8 * 1024 * 1024;
|
|
42
|
+
function childPath() {
|
|
43
|
+
return fileURLToPath(new URL(import.meta.url)).replace(/mcp-isolate\.(ts|js)$/, "mcp-project-child.$1");
|
|
44
|
+
}
|
|
45
|
+
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
46
|
+
const isAnswer = (value) => isRecord(value) &&
|
|
47
|
+
(value.ok === true || (value.ok === false && typeof value.message === "string"));
|
|
48
|
+
function parseMessage(text) {
|
|
49
|
+
let value;
|
|
50
|
+
try {
|
|
51
|
+
value = JSON.parse(text);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
if (!isRecord(value))
|
|
57
|
+
return undefined;
|
|
58
|
+
if (value.type === "answer" && isAnswer(value.answer)) {
|
|
59
|
+
return { type: "answer", answer: value.answer };
|
|
60
|
+
}
|
|
61
|
+
if (value.type === "progress" && typeof value.progress === "number") {
|
|
62
|
+
return typeof value.total === "number"
|
|
63
|
+
? { type: "progress", progress: value.progress, total: value.total }
|
|
64
|
+
: { type: "progress", progress: value.progress };
|
|
65
|
+
}
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
const failed = (message) => ({
|
|
69
|
+
ok: false,
|
|
70
|
+
message: `[nifra] ${message}`,
|
|
71
|
+
});
|
|
72
|
+
/** Answer `request` in a fresh subprocess in `cwd`; a crash, a timeout or no answer is `ok: false`. */
|
|
73
|
+
export async function askProjectChild(cwd, request, options = {}) {
|
|
74
|
+
const { context, timeoutMs } = options;
|
|
75
|
+
if (context?.signal.aborted)
|
|
76
|
+
return failed("the call was cancelled before it started");
|
|
77
|
+
const token = randomUUID();
|
|
78
|
+
let proc;
|
|
79
|
+
try {
|
|
80
|
+
proc = Bun.spawn([process.execPath, childPath(), cwd], {
|
|
81
|
+
cwd,
|
|
82
|
+
// Explicit: without `env`, Bun passes the environment it started with, missing `--env-file` values.
|
|
83
|
+
env: process.env,
|
|
84
|
+
stdin: "pipe",
|
|
85
|
+
stdout: "pipe",
|
|
86
|
+
stderr: "pipe",
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
return failed(`cannot start a process in ${cwd}: ${error instanceof Error ? error.message : String(error)}`);
|
|
91
|
+
}
|
|
92
|
+
let stopped;
|
|
93
|
+
const stop = (reason) => {
|
|
94
|
+
if (stopped !== undefined)
|
|
95
|
+
return;
|
|
96
|
+
stopped = reason;
|
|
97
|
+
proc.kill("SIGKILL");
|
|
98
|
+
};
|
|
99
|
+
const timer = timeoutMs === undefined ? undefined : setTimeout(() => stop("timeout"), timeoutMs);
|
|
100
|
+
const onAbort = () => stop("cancel");
|
|
101
|
+
context?.signal.addEventListener("abort", onAbort, { once: true });
|
|
102
|
+
try {
|
|
103
|
+
proc.stdin.write(JSON.stringify({ ...request, token }));
|
|
104
|
+
await proc.stdin.end();
|
|
105
|
+
const stderr = readBoundedStream(proc.stderr, 16 * 1024);
|
|
106
|
+
let answer;
|
|
107
|
+
let tooLarge = false;
|
|
108
|
+
for await (const item of readBoundedLines(proc.stdout, ANSWER_MAX_BYTES)) {
|
|
109
|
+
if (item.kind === "too-large") {
|
|
110
|
+
tooLarge = true;
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
if (!item.text.startsWith(`${token} `))
|
|
114
|
+
continue;
|
|
115
|
+
const message = parseMessage(item.text.slice(token.length + 1));
|
|
116
|
+
if (message?.type === "progress")
|
|
117
|
+
context?.reportProgress(message.progress, message.total);
|
|
118
|
+
else if (message?.type === "answer")
|
|
119
|
+
answer = message.answer;
|
|
120
|
+
}
|
|
121
|
+
const [errors] = await Promise.all([stderr, proc.exited]);
|
|
122
|
+
if (answer !== undefined)
|
|
123
|
+
return answer;
|
|
124
|
+
if (stopped === "timeout") {
|
|
125
|
+
return failed(`the project process did not answer within ${timeoutMs}ms and was killed`);
|
|
126
|
+
}
|
|
127
|
+
if (stopped === "cancel")
|
|
128
|
+
return failed("the call was cancelled");
|
|
129
|
+
if (tooLarge)
|
|
130
|
+
return failed(`the answer exceeded ${ANSWER_MAX_BYTES} bytes`);
|
|
131
|
+
const tail = errors.text.trim().slice(-600);
|
|
132
|
+
const how = proc.signalCode === null ? `with code ${proc.exitCode}` : `on ${proc.signalCode}`;
|
|
133
|
+
return failed(`the project process exited ${how} before answering${tail === "" ? "" : `: ${tail}`}`);
|
|
134
|
+
}
|
|
135
|
+
finally {
|
|
136
|
+
clearTimeout(timer);
|
|
137
|
+
context?.signal.removeEventListener("abort", onAbort);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
async function callTool(cwd, name, args, context) {
|
|
141
|
+
const answer = await askProjectChild(cwd, { op: "tool", name, args }, { context });
|
|
142
|
+
if (!answer.ok)
|
|
143
|
+
throw new Error(answer.message);
|
|
144
|
+
if ("result" in answer)
|
|
145
|
+
return answer.result;
|
|
146
|
+
throw new Error(`[nifra] the project process answered ${name} without a result`);
|
|
147
|
+
}
|
|
148
|
+
async function readResource(cwd, uri) {
|
|
149
|
+
const answer = await askProjectChild(cwd, { op: "resource", uri }, { timeoutMs: CHILD_TIMEOUT_MS });
|
|
150
|
+
if (!answer.ok)
|
|
151
|
+
throw new Error(answer.message);
|
|
152
|
+
if ("resource" in answer)
|
|
153
|
+
return answer.resource;
|
|
154
|
+
throw new Error(`[nifra] the project process answered ${uri} without its text`);
|
|
155
|
+
}
|
|
156
|
+
async function getPrompt(cwd, name, args) {
|
|
157
|
+
const answer = await askProjectChild(cwd, { op: "prompt", name, args }, { timeoutMs: CHILD_TIMEOUT_MS });
|
|
158
|
+
if (!answer.ok)
|
|
159
|
+
throw new Error(answer.message);
|
|
160
|
+
if ("messages" in answer)
|
|
161
|
+
return answer.messages;
|
|
162
|
+
throw new Error(`[nifra] the project process answered ${name} without messages`);
|
|
163
|
+
}
|
|
164
|
+
/** Each tool runs in a fresh project subprocess, unless it is one that runs no project code here. */
|
|
165
|
+
export function isolateTools(cwd, tools) {
|
|
166
|
+
return tools.map((tool) => IN_PROCESS_TOOLS.has(tool.name)
|
|
167
|
+
? tool
|
|
168
|
+
: { ...tool, handler: (args, context) => callTool(cwd, tool.name, args, context) });
|
|
169
|
+
}
|
|
170
|
+
/** Each resource is read in a fresh project subprocess. */
|
|
171
|
+
export function isolateResources(cwd, resources) {
|
|
172
|
+
return resources.map((resource) => ({ ...resource, read: () => readResource(cwd, resource.uri) }));
|
|
173
|
+
}
|
|
174
|
+
const EMPTY_SURFACE = { tools: [], resources: [], prompts: [] };
|
|
175
|
+
async function readSurface(cwd) {
|
|
176
|
+
const answer = await askProjectChild(cwd, { op: "surface" }, { timeoutMs: CHILD_TIMEOUT_MS });
|
|
177
|
+
const surface = answer.ok && "surface" in answer ? answer.surface : EMPTY_SURFACE;
|
|
178
|
+
return {
|
|
179
|
+
tools: surface.tools.map((tool) => ({
|
|
180
|
+
...tool,
|
|
181
|
+
handler: (args, context) => callTool(cwd, tool.name, args, context),
|
|
182
|
+
})),
|
|
183
|
+
resources: surface.resources.map((resource) => ({
|
|
184
|
+
...resource,
|
|
185
|
+
read: () => readResource(cwd, resource.uri),
|
|
186
|
+
})),
|
|
187
|
+
prompts: surface.prompts.map((prompt) => ({
|
|
188
|
+
...prompt,
|
|
189
|
+
handler: (args) => getPrompt(cwd, prompt.name, args),
|
|
190
|
+
})),
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* What the app declares on its backend (`app.tool(...)` and its resources and prompts), read in a
|
|
195
|
+
* project subprocess and kept until `nifra.config.ts`, `backend/framework.ts` or `backend/app.ts`
|
|
196
|
+
* changes. An app that cannot be loaded declares nothing: its absence must not withdraw the built-in
|
|
197
|
+
* tools, and a broken app must not start a subprocess on every message.
|
|
198
|
+
*/
|
|
199
|
+
export function createAppSurface(cwd) {
|
|
200
|
+
let cached;
|
|
201
|
+
return async () => {
|
|
202
|
+
const fingerprint = await appFingerprint(cwd).catch(() => "unreadable");
|
|
203
|
+
if (cached?.fingerprint !== fingerprint) {
|
|
204
|
+
cached = { fingerprint, surface: readSurface(cwd) };
|
|
205
|
+
}
|
|
206
|
+
return cached.surface;
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* `detectMonorepo`, with the root config evaluated in a project subprocess. Only a directory with a
|
|
211
|
+
* `nifra.config.ts` and no `routes/` can be a monorepo root, so no other directory starts one.
|
|
212
|
+
*/
|
|
213
|
+
export async function detectMonorepoIsolated(cwd) {
|
|
214
|
+
if (!existsSync(resolve(cwd, CONFIG_FILE)) || existsSync(resolve(cwd, "routes")))
|
|
215
|
+
return null;
|
|
216
|
+
const answer = await askProjectChild(cwd, { op: "monorepo" }, { timeoutMs: CHILD_TIMEOUT_MS });
|
|
217
|
+
if (!answer.ok || !("apps" in answer) || answer.apps === null)
|
|
218
|
+
return null;
|
|
219
|
+
const apps = Object.entries(answer.apps).filter((entry) => typeof entry[1] === "string");
|
|
220
|
+
return { apps: Object.fromEntries(apps) };
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=mcp-isolate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-isolate.js","sourceRoot":"","sources":["../src/mcp-isolate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve an MCP path without allowing lexical or symlink escapes from the selected project.
|
|
3
|
+
*
|
|
4
|
+
* MCP callers are not equivalent to a local CLI user: the selected checkout is their filesystem
|
|
5
|
+
* capability boundary. The nearest-existing-ancestor walk also supports output files that do not
|
|
6
|
+
* exist yet while still canonicalizing every existing path component.
|
|
7
|
+
*/
|
|
8
|
+
export declare function resolveMcpProjectPath(root: string, value: string): string | null;
|
|
9
|
+
export declare function mcpProjectPathError(label: string, value: string): string;
|
|
10
|
+
//# sourceMappingURL=mcp-path.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-path.d.ts","sourceRoot":"","sources":["../src/mcp-path.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmChF;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAExE"}
|
package/dist/mcp-path.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { realpathSync } from "node:fs";
|
|
2
|
+
import { basename, isAbsolute, relative, resolve } from "node:path";
|
|
3
|
+
/**
|
|
4
|
+
* Resolve an MCP path without allowing lexical or symlink escapes from the selected project.
|
|
5
|
+
*
|
|
6
|
+
* MCP callers are not equivalent to a local CLI user: the selected checkout is their filesystem
|
|
7
|
+
* capability boundary. The nearest-existing-ancestor walk also supports output files that do not
|
|
8
|
+
* exist yet while still canonicalizing every existing path component.
|
|
9
|
+
*/
|
|
10
|
+
export function resolveMcpProjectPath(root, value) {
|
|
11
|
+
if (value.length === 0 || isAbsolute(value))
|
|
12
|
+
return null;
|
|
13
|
+
const lexicalRoot = resolve(root);
|
|
14
|
+
const target = resolve(lexicalRoot, value);
|
|
15
|
+
const lexicalRelative = relative(lexicalRoot, target);
|
|
16
|
+
if (lexicalRelative.startsWith("..") || isAbsolute(lexicalRelative))
|
|
17
|
+
return null;
|
|
18
|
+
let canonicalRoot;
|
|
19
|
+
try {
|
|
20
|
+
canonicalRoot = realpathSync(lexicalRoot);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
let probe = target;
|
|
26
|
+
const missing = [];
|
|
27
|
+
while (true) {
|
|
28
|
+
try {
|
|
29
|
+
const canonicalProbe = realpathSync(probe);
|
|
30
|
+
const canonicalRelative = relative(canonicalRoot, canonicalProbe);
|
|
31
|
+
if (canonicalRelative.startsWith("..") || isAbsolute(canonicalRelative))
|
|
32
|
+
return null;
|
|
33
|
+
const candidate = resolve(canonicalProbe, ...missing.reverse());
|
|
34
|
+
const candidateRelative = relative(canonicalRoot, candidate);
|
|
35
|
+
return candidateRelative.startsWith("..") || isAbsolute(candidateRelative) ? null : candidate;
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
if (!(error && typeof error === "object" && error.code === "ENOENT"))
|
|
39
|
+
return null;
|
|
40
|
+
const parent = resolve(probe, "..");
|
|
41
|
+
if (parent === probe)
|
|
42
|
+
return null;
|
|
43
|
+
missing.push(basename(probe));
|
|
44
|
+
probe = parent;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export function mcpProjectPathError(label, value) {
|
|
49
|
+
return `${label} must be a relative path inside the selected project directory: ${value}`;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=mcp-path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-path.js","sourceRoot":"","sources":["../src/mcp-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnE;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY,EAAE,KAAa;IAC/D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IAExD,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACjC,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,CAAA;IAC1C,MAAM,eAAe,GAAG,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;IACrD,IAAI,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,eAAe,CAAC;QAAE,OAAO,IAAI,CAAA;IAEhF,IAAI,aAAqB,CAAA;IACzB,IAAI,CAAC;QACH,aAAa,GAAG,YAAY,CAAC,WAAW,CAAC,CAAA;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,KAAK,GAAG,MAAM,CAAA;IAClB,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;YAC1C,MAAM,iBAAiB,GAAG,QAAQ,CAAC,aAAa,EAAE,cAAc,CAAC,CAAA;YACjE,IAAI,iBAAiB,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,iBAAiB,CAAC;gBAAE,OAAO,IAAI,CAAA;YAEpF,MAAM,SAAS,GAAG,OAAO,CAAC,cAAc,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;YAC/D,MAAM,iBAAiB,GAAG,QAAQ,CAAC,aAAa,EAAE,SAAS,CAAC,CAAA;YAC5D,OAAO,iBAAiB,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAA;QAC/F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAK,KAA2B,CAAC,IAAI,KAAK,QAAQ,CAAC;gBACzF,OAAO,IAAI,CAAA;YACb,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;YACnC,IAAI,MAAM,KAAK,KAAK;gBAAE,OAAO,IAAI,CAAA;YACjC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAA;YAC7B,KAAK,GAAG,MAAM,CAAA;QAChB,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAa,EAAE,KAAa;IAC9D,OAAO,GAAG,KAAK,mEAAmE,KAAK,EAAE,CAAA;AAC3F,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The subprocess `nifra mcp` runs project code in. The server (`mcp-isolate.ts`) spawns a fresh one
|
|
3
|
+
* per call in the project's directory, so Bun loads that directory's `.env` files here, and the
|
|
4
|
+
* config, the backend and everything they import run here and exit with the process. The tools,
|
|
5
|
+
* resources and prompts answered here are the same ones the server lists: the project tools, and the
|
|
6
|
+
* ones the app declares on its backend.
|
|
7
|
+
*
|
|
8
|
+
* Protocol: one JSON request on stdin; on stdout, progress lines and then one answer line, each
|
|
9
|
+
* prefixed with the request's token, so anything project code prints cannot be read as an answer.
|
|
10
|
+
*/
|
|
11
|
+
import type { McpPrompt, McpPromptMessage, McpResource, McpTool, McpToolResult } from "./mcp-protocol.js";
|
|
12
|
+
export type ProjectChildRequest = {
|
|
13
|
+
readonly op: "monorepo";
|
|
14
|
+
} | {
|
|
15
|
+
readonly op: "surface";
|
|
16
|
+
} | {
|
|
17
|
+
readonly op: "tool";
|
|
18
|
+
readonly name: string;
|
|
19
|
+
readonly args: Record<string, unknown>;
|
|
20
|
+
} | {
|
|
21
|
+
readonly op: "resource";
|
|
22
|
+
readonly uri: string;
|
|
23
|
+
} | {
|
|
24
|
+
readonly op: "prompt";
|
|
25
|
+
readonly name: string;
|
|
26
|
+
readonly args: Record<string, unknown>;
|
|
27
|
+
};
|
|
28
|
+
/** What the server lists for the tools, resources and prompts the app declares on its backend. */
|
|
29
|
+
export interface AppSurface {
|
|
30
|
+
readonly tools: readonly Omit<McpTool, "handler">[];
|
|
31
|
+
readonly resources: readonly Omit<McpResource, "read">[];
|
|
32
|
+
readonly prompts: readonly Omit<McpPrompt, "handler">[];
|
|
33
|
+
}
|
|
34
|
+
export type ProjectChildAnswer = {
|
|
35
|
+
readonly ok: true;
|
|
36
|
+
readonly apps: Readonly<Record<string, string>> | null;
|
|
37
|
+
} | {
|
|
38
|
+
readonly ok: true;
|
|
39
|
+
readonly surface: AppSurface;
|
|
40
|
+
} | {
|
|
41
|
+
readonly ok: true;
|
|
42
|
+
readonly result: string | McpToolResult;
|
|
43
|
+
} | {
|
|
44
|
+
readonly ok: true;
|
|
45
|
+
readonly resource: {
|
|
46
|
+
readonly text: string;
|
|
47
|
+
readonly mimeType?: string;
|
|
48
|
+
};
|
|
49
|
+
} | {
|
|
50
|
+
readonly ok: true;
|
|
51
|
+
readonly messages: readonly McpPromptMessage[];
|
|
52
|
+
} | {
|
|
53
|
+
readonly ok: false;
|
|
54
|
+
readonly message: string;
|
|
55
|
+
};
|
|
56
|
+
export type ProjectChildMessage = {
|
|
57
|
+
readonly type: "progress";
|
|
58
|
+
readonly progress: number;
|
|
59
|
+
readonly total?: number;
|
|
60
|
+
} | {
|
|
61
|
+
readonly type: "answer";
|
|
62
|
+
readonly answer: ProjectChildAnswer;
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Answer `request` for the project at `cwd`. A tool, resource or prompt that throws answers
|
|
66
|
+
* `ok: false` with its message; an app that cannot be loaded declares nothing, as in the server.
|
|
67
|
+
*/
|
|
68
|
+
export declare function answerProjectRequest(cwd: string, request: ProjectChildRequest, reportProgress?: (progress: number, total?: number) => void): Promise<ProjectChildAnswer>;
|
|
69
|
+
/**
|
|
70
|
+
* Serve one request: read it from `input`, answer it and write each message through `write`,
|
|
71
|
+
* prefixed with the request's token. Returns false (writing nothing) for a malformed request.
|
|
72
|
+
*/
|
|
73
|
+
export declare function serveProjectChild(cwd: string, input: ReadableStream<Uint8Array>, write: (line: string) => Promise<void>): Promise<boolean>;
|
|
74
|
+
//# sourceMappingURL=mcp-project-child.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-project-child.d.ts","sourceRoot":"","sources":["../src/mcp-project-child.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The subprocess `nifra mcp` runs project code in. The server (`mcp-isolate.ts`) spawns a fresh one
|
|
3
|
+
* per call in the project's directory, so Bun loads that directory's `.env` files here, and the
|
|
4
|
+
* config, the backend and everything they import run here and exit with the process. The tools,
|
|
5
|
+
* resources and prompts answered here are the same ones the server lists: the project tools, and the
|
|
6
|
+
* ones the app declares on its backend.
|
|
7
|
+
*
|
|
8
|
+
* Protocol: one JSON request on stdin; on stdout, progress lines and then one answer line, each
|
|
9
|
+
* prefixed with the request's token, so anything project code prints cannot be read as an answer.
|
|
10
|
+
*/
|
|
11
|
+
import { detectMonorepo } from "./load.js";
|
|
12
|
+
import { projectResources } from "./mcp-context.js";
|
|
13
|
+
import { createCachedAppLoader, projectTools } from "./mcp-exec.js";
|
|
14
|
+
import { CHILD_INPUT_MAX_BYTES, readBoundedStream } from "./mcp-io.js";
|
|
15
|
+
import { extractBackendPrompts, extractBackendResources, extractBackendTools, } from "./mcp-reflect.js";
|
|
16
|
+
/**
|
|
17
|
+
* Answer `request` for the project at `cwd`. A tool, resource or prompt that throws answers
|
|
18
|
+
* `ok: false` with its message; an app that cannot be loaded declares nothing, as in the server.
|
|
19
|
+
*/
|
|
20
|
+
export async function answerProjectRequest(cwd, request, reportProgress = () => { }) {
|
|
21
|
+
try {
|
|
22
|
+
if (request.op === "monorepo") {
|
|
23
|
+
return { ok: true, apps: (await detectMonorepo(cwd))?.apps ?? null };
|
|
24
|
+
}
|
|
25
|
+
const loadAppCached = createCachedAppLoader(cwd);
|
|
26
|
+
const backend = () => loadAppCached().then((app) => app.backend, () => undefined);
|
|
27
|
+
if (request.op === "surface") {
|
|
28
|
+
const declared = await backend();
|
|
29
|
+
return {
|
|
30
|
+
ok: true,
|
|
31
|
+
surface: {
|
|
32
|
+
tools: extractBackendTools(declared),
|
|
33
|
+
resources: extractBackendResources(declared),
|
|
34
|
+
prompts: extractBackendPrompts(declared),
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
if (request.op === "tool") {
|
|
39
|
+
const tool = projectTools(cwd, loadAppCached).find((t) => t.name === request.name) ??
|
|
40
|
+
extractBackendTools(await backend()).find((t) => t.name === request.name);
|
|
41
|
+
if (tool === undefined)
|
|
42
|
+
return { ok: false, message: `unknown tool: ${request.name}` };
|
|
43
|
+
const result = await tool.handler(request.args, {
|
|
44
|
+
signal: new AbortController().signal,
|
|
45
|
+
requestId: null,
|
|
46
|
+
reportProgress,
|
|
47
|
+
});
|
|
48
|
+
return { ok: true, result };
|
|
49
|
+
}
|
|
50
|
+
if (request.op === "resource") {
|
|
51
|
+
const resource = projectResources(cwd, loadAppCached).find((r) => r.uri === request.uri) ??
|
|
52
|
+
extractBackendResources(await backend()).find((r) => r.uri === request.uri);
|
|
53
|
+
if (resource === undefined)
|
|
54
|
+
return { ok: false, message: `unknown resource: ${request.uri}` };
|
|
55
|
+
return { ok: true, resource: await resource.read() };
|
|
56
|
+
}
|
|
57
|
+
const prompt = extractBackendPrompts(await backend()).find((p) => p.name === request.name);
|
|
58
|
+
if (prompt === undefined)
|
|
59
|
+
return { ok: false, message: `unknown prompt: ${request.name}` };
|
|
60
|
+
return { ok: true, messages: await prompt.handler(request.args) };
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
return { ok: false, message: error instanceof Error ? error.message : String(error) };
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const isArgs = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
67
|
+
function parseRequest(text) {
|
|
68
|
+
let value;
|
|
69
|
+
try {
|
|
70
|
+
value = JSON.parse(text);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
if (!isArgs(value))
|
|
76
|
+
return undefined;
|
|
77
|
+
const { token, op, name, uri, args } = value;
|
|
78
|
+
if (typeof token !== "string" || !/^[0-9a-f-]{16,64}$/.test(token))
|
|
79
|
+
return undefined;
|
|
80
|
+
if (op === "monorepo" || op === "surface")
|
|
81
|
+
return { token, request: { op } };
|
|
82
|
+
if (op === "resource" && typeof uri === "string")
|
|
83
|
+
return { token, request: { op, uri } };
|
|
84
|
+
if ((op === "tool" || op === "prompt") && typeof name === "string" && isArgs(args)) {
|
|
85
|
+
return { token, request: { op, name, args } };
|
|
86
|
+
}
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Serve one request: read it from `input`, answer it and write each message through `write`,
|
|
91
|
+
* prefixed with the request's token. Returns false (writing nothing) for a malformed request.
|
|
92
|
+
*/
|
|
93
|
+
export async function serveProjectChild(cwd, input, write) {
|
|
94
|
+
const text = await readBoundedStream(input, CHILD_INPUT_MAX_BYTES);
|
|
95
|
+
const parsed = text.truncated ? undefined : parseRequest(text.text);
|
|
96
|
+
if (parsed === undefined)
|
|
97
|
+
return false;
|
|
98
|
+
const send = (message) => write(`${parsed.token} ${JSON.stringify(message)}\n`);
|
|
99
|
+
const answer = await answerProjectRequest(cwd, parsed.request, (progress, total) => {
|
|
100
|
+
void send(total === undefined ? { type: "progress", progress } : { type: "progress", progress, total });
|
|
101
|
+
});
|
|
102
|
+
let line;
|
|
103
|
+
try {
|
|
104
|
+
line = JSON.stringify({ type: "answer", answer });
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
line = JSON.stringify({
|
|
108
|
+
type: "answer",
|
|
109
|
+
answer: { ok: false, message: "the answer is not serializable" },
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
await write(`${parsed.token} ${line}\n`);
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
if (import.meta.main) {
|
|
116
|
+
// Bound before project code loads, so nothing it patches can reach the protocol channel.
|
|
117
|
+
const stdout = process.stdout.write.bind(process.stdout);
|
|
118
|
+
const toStderr = (...args) => {
|
|
119
|
+
process.stderr.write(`${args.map((arg) => String(arg)).join(" ")}\n`);
|
|
120
|
+
};
|
|
121
|
+
console.log = toStderr;
|
|
122
|
+
console.info = toStderr;
|
|
123
|
+
console.debug = toStderr;
|
|
124
|
+
const served = await serveProjectChild(process.argv[2] ?? process.cwd(), Bun.stdin.stream(), (line) => new Promise((done) => stdout(line, () => done())));
|
|
125
|
+
if (!served)
|
|
126
|
+
process.stderr.write("nifra mcp: invalid project request\n");
|
|
127
|
+
// Project code may leave a handle open (a pool, an interval); the answer is written, so stop here.
|
|
128
|
+
process.exit(served ? 0 : 2);
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=mcp-project-child.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-project-child.js","sourceRoot":"","sources":["../src/mcp-project-child.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-reflect.d.ts","sourceRoot":"","sources":["../src/mcp-reflect.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"mcp-reflect.d.ts","sourceRoot":"","sources":["../src/mcp-reflect.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EACV,SAAS,EAET,WAAW,EACX,OAAO,EAER,MAAM,mBAAmB,CAAA;AAO1B;yFACyF;AACzF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,EAAE,CAoD/D;AAYD,gHAAgH;AAChH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,WAAW,EAAE,CAqBvE;AAWD,4GAA4G;AAC5G,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,EAAE,CAgBnE;AAED,6EAA6E"}
|
package/dist/mcp-reflect.js
CHANGED
|
@@ -4,14 +4,14 @@
|
|
|
4
4
|
* These functions only translate reflected Nifra declarations into MCP descriptors. They do not know
|
|
5
5
|
* about stdio, HTTP, root trust, or project loading, so the reflection seam is independently testable.
|
|
6
6
|
*/
|
|
7
|
-
import {
|
|
7
|
+
import { reflectedRoutesFromEvidence, snapshotProjectEvidence } from "@nifrajs/core/evidence";
|
|
8
8
|
/** Extract tools registered via .tool() routes on the Nifra backend. Exported for the test that proves a
|
|
9
9
|
* `server().tool()` route surfaces in `tools/list` and executes through `tools/call`. */
|
|
10
10
|
export function extractBackendTools(backend) {
|
|
11
11
|
const b = backend;
|
|
12
12
|
if (!b || typeof b.routes !== "function")
|
|
13
13
|
return [];
|
|
14
|
-
const routes =
|
|
14
|
+
const routes = reflectedRoutesFromEvidence(snapshotProjectEvidence(b));
|
|
15
15
|
return routes
|
|
16
16
|
.filter((r) => r.schema !== undefined && r.tool !== undefined)
|
|
17
17
|
.map((r) => {
|
package/dist/mcp-reflect.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-reflect.js","sourceRoot":"","sources":["../src/mcp-reflect.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"mcp-reflect.js","sourceRoot":"","sources":["../src/mcp-reflect.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp-render.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-render.d.ts","sourceRoot":"","sources":["../src/mcp-render.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"mcp-render.d.ts","sourceRoot":"","sources":["../src/mcp-render.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAsDH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,OAAO,GAChB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAWnD"}
|