nodefony 7.0.2 → 10.0.0-alpha.2
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/.ai/symbols.json +36135 -0
- package/LICENSE +544 -0
- package/README.md +316 -694
- package/bin/nodefony +2183 -85
- package/dist/client/Container.js +367 -0
- package/dist/client/Event.js +198 -0
- package/dist/client/Service.js +344 -0
- package/dist/client/Tools.js +162 -0
- package/dist/client/client/ClientKernel.js +276 -0
- package/dist/client/client/angular/index.js +352 -0
- package/dist/client/client/announce.js +212 -0
- package/dist/client/client/debugbar/DebugBar.js +1624 -0
- package/dist/client/client/debugbar/format.js +103 -0
- package/dist/client/client/debugbar/hmr.js +37 -0
- package/dist/client/client/debugbar/index.js +29 -0
- package/dist/client/client/debugbar/model.js +133 -0
- package/dist/client/client/debugbar/network.js +173 -0
- package/dist/client/client/debugbar/profile.js +114 -0
- package/dist/client/client/index.js +34 -0
- package/dist/client/client/react/index.js +268 -0
- package/dist/client/client/realtime/AdaptiveRate.js +240 -0
- package/dist/client/client/realtime/BrowserWsTransport.js +57 -0
- package/dist/client/client/realtime/RealtimeClient.js +898 -0
- package/dist/client/client/realtime/localEvents.js +56 -0
- package/dist/client/client/realtime/notice.js +125 -0
- package/dist/client/client/realtime/observe.js +280 -0
- package/dist/client/client/roles/index.js +3 -0
- package/dist/client/client/roles/registry.js +97 -0
- package/dist/client/client/roles/roles.js +91 -0
- package/dist/client/client/shim/events.js +88 -0
- package/dist/client/client/shim/util.js +20 -0
- package/dist/client/client/svelte/index.js +319 -0
- package/dist/client/client/syslog/context.js +122 -0
- package/dist/client/client/syslog/errors.js +49 -0
- package/dist/client/client/syslog/uplink.js +106 -0
- package/dist/client/client/vue/index.js +321 -0
- package/dist/client/colors.js +63 -0
- package/dist/client/debugbar.standalone.js +4274 -0
- package/dist/client/realtime/IRealtimeTransport.js +32 -0
- package/dist/client/realtime/JsonRpcPeer.js +251 -0
- package/dist/client/realtime/channelRate.js +39 -0
- package/dist/client/realtime/platformChannels.js +155 -0
- package/dist/client/syslog/Pdu.js +224 -0
- package/dist/client/syslog/Syslog.js +1159 -0
- package/dist/client/syslog/drivers/pduFlow.js +106 -0
- package/dist/client/syslog/drivers/pduProtocol.js +28 -0
- package/dist/client/syslog/logColor.js +80 -0
- package/dist/client/types/src/Container.d.ts +221 -0
- package/dist/client/types/src/Event.d.ts +171 -0
- package/dist/client/types/src/FileClass.d.ts +184 -0
- package/dist/client/types/src/Service.d.ts +165 -0
- package/dist/client/types/src/Tools.d.ts +116 -0
- package/dist/client/types/src/client/ClientKernel.d.ts +90 -0
- package/dist/client/types/src/client/IClientKernel.d.ts +195 -0
- package/dist/client/types/src/client/angular/index.d.ts +273 -0
- package/dist/client/types/src/client/announce.d.ts +74 -0
- package/dist/client/types/src/client/debugbar/DebugBar.d.ts +279 -0
- package/dist/client/types/src/client/debugbar/format.d.ts +48 -0
- package/dist/client/types/src/client/debugbar/hmr.d.ts +16 -0
- package/dist/client/types/src/client/debugbar/index.d.ts +30 -0
- package/dist/client/types/src/client/debugbar/model.d.ts +158 -0
- package/dist/client/types/src/client/debugbar/network.d.ts +55 -0
- package/dist/client/types/src/client/debugbar/profile.d.ts +99 -0
- package/dist/client/types/src/client/index.d.ts +47 -0
- package/dist/client/types/src/client/react/index.d.ts +207 -0
- package/dist/client/types/src/client/realtime/AdaptiveRate.d.ts +138 -0
- package/dist/client/types/src/client/realtime/BrowserWsTransport.d.ts +27 -0
- package/dist/client/types/src/client/realtime/RealtimeClient.d.ts +573 -0
- package/dist/client/types/src/client/realtime/localEvents.d.ts +53 -0
- package/dist/client/types/src/client/realtime/notice.d.ts +70 -0
- package/dist/client/types/src/client/realtime/observe.d.ts +284 -0
- package/dist/client/types/src/client/roles/index.d.ts +15 -0
- package/dist/client/types/src/client/roles/registry.d.ts +72 -0
- package/dist/client/types/src/client/roles/roles.d.ts +68 -0
- package/dist/client/types/src/client/shim/cli-color.d.ts +2 -0
- package/dist/client/types/src/client/shim/events.d.ts +39 -0
- package/dist/client/types/src/client/shim/util.d.ts +14 -0
- package/dist/client/types/src/client/svelte/index.d.ts +216 -0
- package/dist/client/types/src/client/syslog/context.d.ts +76 -0
- package/dist/client/types/src/client/syslog/errors.d.ts +46 -0
- package/dist/client/types/src/client/syslog/uplink.d.ts +89 -0
- package/dist/client/types/src/client/transport/websocket.d.ts +5 -0
- package/dist/client/types/src/client/vue/index.d.ts +234 -0
- package/dist/client/types/src/colors.d.ts +32 -0
- package/dist/client/types/src/config/infra.d.ts +171 -0
- package/dist/client/types/src/kernel/bootReport.d.ts +112 -0
- package/dist/client/types/src/kernel/readinessRegistry.d.ts +104 -0
- package/dist/client/types/src/realtime/IRealtimeSocket.d.ts +142 -0
- package/dist/client/types/src/realtime/IRealtimeTransport.d.ts +50 -0
- package/dist/client/types/src/realtime/JsonRpcPeer.d.ts +251 -0
- package/dist/client/types/src/realtime/RealtimeEventMap.d.ts +269 -0
- package/dist/client/types/src/realtime/channelRate.d.ts +55 -0
- package/dist/client/types/src/realtime/platformChannels.d.ts +147 -0
- package/dist/client/types/src/syslog/Pdu.d.ts +134 -0
- package/dist/client/types/src/syslog/Syslog.d.ts +482 -0
- package/dist/client/types/src/syslog/drivers/ILogDriver.d.ts +177 -0
- package/dist/client/types/src/syslog/drivers/pduFlow.d.ts +53 -0
- package/dist/client/types/src/syslog/drivers/pduProtocol.d.ts +20 -0
- package/dist/client/types/src/syslog/logColor.d.ts +59 -0
- package/dist/client/types/src/types/ICliKernel.d.ts +28 -0
- package/dist/client/types/src/types/ICommand.d.ts +14 -0
- package/dist/client/types/src/types/IContainer.d.ts +35 -0
- package/dist/client/types/src/types/IKernel.d.ts +138 -0
- package/dist/client/types/src/types/IMcpTool.d.ts +157 -0
- package/dist/client/types/src/types/IModule.d.ts +73 -0
- package/dist/client/types/src/types/IPage.d.ts +119 -0
- package/dist/client/types/src/types/IService.d.ts +62 -0
- package/dist/client/types/src/types/ISyslog.d.ts +58 -0
- package/dist/client/types/src/types/ITransport.d.ts +5 -0
- package/dist/client/types/src/types/globals.d.ts +47 -0
- package/dist/node/Cli.js +750 -0
- package/dist/node/Container.js +367 -0
- package/dist/node/Error.js +309 -0
- package/dist/node/Event.js +198 -0
- package/dist/node/FileClass.js +308 -0
- package/dist/node/Nodefony.js +78 -0
- package/dist/node/Service.js +344 -0
- package/dist/node/Tools.js +205 -0
- package/dist/node/bin/resolveLocalCli.js +10 -0
- package/dist/node/bundler/index.js +103 -0
- package/dist/node/cli/agentTargets.js +461 -0
- package/dist/node/cli/aiMcp.js +553 -0
- package/dist/node/cli/aiMcpReport.js +129 -0
- package/dist/node/cli/aiSync.js +323 -0
- package/dist/node/cli/aiSyncReport.js +142 -0
- package/dist/node/cli/card.js +186 -0
- package/dist/node/cli/cardReport.js +110 -0
- package/dist/node/cli/completion.js +415 -0
- package/dist/node/cli/create.js +805 -0
- package/dist/node/cli/env.js +332 -0
- package/dist/node/cli/envReport.js +159 -0
- package/dist/node/cli/execPortable.js +60 -0
- package/dist/node/cli/gitHooks.js +191 -0
- package/dist/node/cli/gitHooksReport.js +119 -0
- package/dist/node/cli/globalFlags.js +67 -0
- package/dist/node/cli/helpReport.js +288 -0
- package/dist/node/cli/manPage.js +165 -0
- package/dist/node/cli/nodefonyBin.js +61 -0
- package/dist/node/cli/outdated.js +144 -0
- package/dist/node/cli/progress.js +555 -0
- package/dist/node/cli/projectRoot.js +32 -0
- package/dist/node/cli/promptPassword.js +44 -0
- package/dist/node/cli/prompts.js +86 -0
- package/dist/node/cli/scaffold/destination.js +92 -0
- package/dist/node/cli/scaffold/engine.js +2156 -0
- package/dist/node/cli/scaffold/entityFields.js +589 -0
- package/dist/node/cli/scaffold/format.js +243 -0
- package/dist/node/cli/scaffold/interactive.js +124 -0
- package/dist/node/cli/scaffold/moduleLayout.js +38 -0
- package/dist/node/cli/scaffold/reservedEntities.js +74 -0
- package/dist/node/cli/scaffold/spec.js +704 -0
- package/dist/node/cli/scaffold/steps.js +40 -0
- package/dist/node/cli/scaffold/userContractSource.js +133 -0
- package/dist/node/cli/scaffold/versions.js +57 -0
- package/dist/node/cli/scaffold/writer.js +172 -0
- package/dist/node/cli/startMenu.js +496 -0
- package/dist/node/cli/symbols.js +205 -0
- package/dist/node/cli/sysexits.js +34 -0
- package/dist/node/cli/tableReport.js +184 -0
- package/dist/node/cli/usageReport.js +144 -0
- package/dist/node/colors.js +63 -0
- package/dist/node/command/Builder.js +153 -0
- package/dist/node/command/Command.js +348 -0
- package/dist/node/config/configProvenance.js +101 -0
- package/dist/node/config/defaults.js +39 -0
- package/dist/node/config/defineConfig.js +129 -0
- package/dist/node/config/defineEnv.js +264 -0
- package/dist/node/config/envExample.js +41 -0
- package/dist/node/config/envOverride.js +423 -0
- package/dist/node/config/infra.js +163 -0
- package/dist/node/config/reactivity.js +23 -0
- package/dist/node/config/reservedEnv.js +118 -0
- package/dist/node/config/schema.js +134 -0
- package/dist/node/config/use.js +24 -0
- package/dist/node/finder/File.js +49 -0
- package/dist/node/finder/FileResult.js +86 -0
- package/dist/node/finder/Finder.js +201 -0
- package/dist/node/finder/Result.js +45 -0
- package/dist/node/index.js +121 -0
- package/dist/node/kernel/BootConfigurationError.js +54 -0
- package/dist/node/kernel/CliKernel.js +630 -0
- package/dist/node/kernel/Kernel.js +2198 -0
- package/dist/node/kernel/Module.js +453 -0
- package/dist/node/kernel/adminPlane/adminCaller.js +98 -0
- package/dist/node/kernel/adminPlane/adminRbac.js +51 -0
- package/dist/node/kernel/adminPlane/catalog.js +158 -0
- package/dist/node/kernel/adminPlane/executeAdmin.js +78 -0
- package/dist/node/kernel/checks/deep.js +335 -0
- package/dist/node/kernel/checks/freshness.js +139 -0
- package/dist/node/kernel/checks/gating.js +231 -0
- package/dist/node/kernel/checks/guards.js +232 -0
- package/dist/node/kernel/checks/lastBoot.js +136 -0
- package/dist/node/kernel/checks/live.js +330 -0
- package/dist/node/kernel/checks/packageDeps.js +292 -0
- package/dist/node/kernel/checks/readiness.js +153 -0
- package/dist/node/kernel/checks/renderReport.js +780 -0
- package/dist/node/kernel/checks/report.js +421 -0
- package/dist/node/kernel/checks/runDoctor.js +731 -0
- package/dist/node/kernel/checks/surface.js +364 -0
- package/dist/node/kernel/checks/walk.js +100 -0
- package/dist/node/kernel/checks/wiring.js +450 -0
- package/dist/node/kernel/commands/AiMcpCommand.js +65 -0
- package/dist/node/kernel/commands/AiSyncCommand.js +48 -0
- package/dist/node/kernel/commands/BuildCommand.js +49 -0
- package/dist/node/kernel/commands/CardCommand.js +50 -0
- package/dist/node/kernel/commands/ClusterCommand.js +58 -0
- package/dist/node/kernel/commands/CompletionCommand.js +31 -0
- package/dist/node/kernel/commands/CreateCommand.js +45 -0
- package/dist/node/kernel/commands/DevCommand.js +99 -0
- package/dist/node/kernel/commands/DoctorCommand.js +115 -0
- package/dist/node/kernel/commands/EnvCommand.js +52 -0
- package/dist/node/kernel/commands/GitHooksCommand.js +47 -0
- package/dist/node/kernel/commands/InspectCommand.js +153 -0
- package/dist/node/kernel/commands/InstallCommand.js +20 -0
- package/dist/node/kernel/commands/MenuCommand.js +261 -0
- package/dist/node/kernel/commands/OutdatedCommand.js +164 -0
- package/dist/node/kernel/commands/ProdCommand.js +60 -0
- package/dist/node/kernel/commands/StatusCommand.js +30 -0
- package/dist/node/kernel/commands/StopCommand.js +35 -0
- package/dist/node/kernel/commands/SymbolsCommand.js +45 -0
- package/dist/node/kernel/commands/runtimeLauncher.js +95 -0
- package/dist/node/kernel/decorators/kernelDecorator.js +110 -0
- package/dist/node/kernel/injector/injector.js +137 -0
- package/dist/node/kernel/injector/serviceOrder.js +106 -0
- package/dist/node/kernel/inspect/adminSubjects.js +194 -0
- package/dist/node/kernel/inspect/docOutline.js +86 -0
- package/dist/node/kernel/lifecycleTags.js +76 -0
- package/dist/node/kernel/moduleConfig.js +75 -0
- package/dist/node/kernel/moduleGating.js +68 -0
- package/dist/node/kernel/readinessRegistry.js +98 -0
- package/dist/node/kernel/resolveModuleEntry.js +61 -0
- package/dist/node/mcp/caller.js +40 -0
- package/dist/node/mcp/guard.js +51 -0
- package/dist/node/mcp/protocol.js +157 -0
- package/dist/node/mcp/server.js +216 -0
- package/dist/node/mcp/tools.js +861 -0
- package/dist/node/oauth/authorizationServer.js +221 -0
- package/dist/node/oauth/protectedResource.js +293 -0
- package/dist/node/package.js +4 -0
- package/dist/node/realtime/IRealtimeTransport.js +32 -0
- package/dist/node/realtime/JsonRpcPeer.js +251 -0
- package/dist/node/realtime/RealtimeEventMap.js +15 -0
- package/dist/node/realtime/channelRate.js +39 -0
- package/dist/node/realtime/platformChannels.js +155 -0
- package/dist/node/runtime/GcScheduler.js +92 -0
- package/dist/node/runtime/RequestContext.js +76 -0
- package/dist/node/runtime/bearer.js +84 -0
- package/dist/node/runtime/engineEnvironment.js +79 -0
- package/dist/node/runtime/loadEnv.js +105 -0
- package/dist/node/runtime/pageFacets.js +85 -0
- package/dist/node/runtime/pageFilters.js +103 -0
- package/dist/node/runtime/pageGuard.js +84 -0
- package/dist/node/runtime/pageQuery.js +160 -0
- package/dist/node/runtime/pageSort.js +114 -0
- package/dist/node/runtime/redact.js +43 -0
- package/dist/node/runtime/withTimeout.js +71 -0
- package/dist/node/service/cluster/ClusterManager.js +202 -0
- package/dist/node/service/cluster/ClusterProbeAggregator.js +120 -0
- package/dist/node/service/cluster/ClusterRelay.js +74 -0
- package/dist/node/service/cluster/clusterMaster.js +65 -0
- package/dist/node/service/cluster/clusterMessage.js +70 -0
- package/dist/node/service/cluster/cpuQuota.js +59 -0
- package/dist/node/service/cluster/instanceProbe.js +52 -0
- package/dist/node/service/cluster/podEnvironment.js +48 -0
- package/dist/node/service/cluster/processProbe.js +70 -0
- package/dist/node/service/cluster/richProcessProbe.js +115 -0
- package/dist/node/service/cluster/topology.js +71 -0
- package/dist/node/service/dev/BootReporter.js +490 -0
- package/dist/node/service/dev/DevSupervisor.js +1004 -0
- package/dist/node/service/dev/bootVerdict.js +158 -0
- package/dist/node/service/dev/detachedStart.js +372 -0
- package/dist/node/service/dev/devProcess.js +1137 -0
- package/dist/node/service/dev/devProjects.js +138 -0
- package/dist/node/service/dev/devStatusReport.js +395 -0
- package/dist/node/service/dev/devStop.js +263 -0
- package/dist/node/service/fetchService.js +35 -0
- package/dist/node/service/gitService.js +62 -0
- package/dist/node/syslog/Pdu.js +224 -0
- package/dist/node/syslog/Syslog.js +1159 -0
- package/dist/node/syslog/drivers/ClusterFileLogDriver.js +114 -0
- package/dist/node/syslog/drivers/FileLogDriver.js +127 -0
- package/dist/node/syslog/drivers/ILogDriver.js +26 -0
- package/dist/node/syslog/drivers/LokiLogDriver.js +144 -0
- package/dist/node/syslog/drivers/MemoryLogDriver.js +33 -0
- package/dist/node/syslog/drivers/OpenSearchLogDriver.js +159 -0
- package/dist/node/syslog/drivers/builtinLogDrivers.js +114 -0
- package/dist/node/syslog/drivers/filterPdus.js +71 -0
- package/dist/node/syslog/drivers/logDriverRegistry.js +83 -0
- package/dist/node/syslog/drivers/opensearchShared.js +17 -0
- package/dist/node/syslog/drivers/pduFlow.js +106 -0
- package/dist/node/syslog/drivers/pduProtocol.js +28 -0
- package/dist/node/syslog/httpFetch.js +43 -0
- package/dist/node/syslog/logColor.js +80 -0
- package/dist/node/syslog/sinks/FileSink.js +142 -0
- package/dist/node/syslog/transports/BatchingHttpTransport.js +98 -0
- package/dist/node/syslog/transports/ConsoleTransport.js +14 -0
- package/dist/node/syslog/transports/FileTransport.js +17 -0
- package/dist/node/syslog/transports/HttpTransport.js +44 -0
- package/dist/node/syslog/transports/LokiTransport.js +80 -0
- package/dist/node/syslog/transports/OpenSearchTransport.js +53 -0
- package/dist/node/syslog/transports/SyslogTransport.js +13 -0
- package/dist/node/syslog/transports/index.js +8 -0
- package/dist/node/testing/index.js +190 -0
- package/dist/types/Cli.d.ts +177 -0
- package/dist/types/Container.d.ts +221 -0
- package/dist/types/Error.d.ts +162 -0
- package/dist/types/Event.d.ts +171 -0
- package/dist/types/FileClass.d.ts +184 -0
- package/dist/types/Nodefony.d.ts +66 -0
- package/dist/types/Service.d.ts +165 -0
- package/dist/types/Tools.d.ts +116 -0
- package/dist/types/bin/resolveLocalCli.d.ts +49 -0
- package/dist/types/bundler/index.d.ts +66 -0
- package/dist/types/cli/agentTargets.d.ts +378 -0
- package/dist/types/cli/aiMcp.d.ts +239 -0
- package/dist/types/cli/aiMcpReport.d.ts +113 -0
- package/dist/types/cli/aiSync.d.ts +68 -0
- package/dist/types/cli/aiSyncReport.d.ts +149 -0
- package/dist/types/cli/card.d.ts +49 -0
- package/dist/types/cli/cardReport.d.ts +127 -0
- package/dist/types/cli/completion.d.ts +154 -0
- package/dist/types/cli/create.d.ts +177 -0
- package/dist/types/cli/env.d.ts +103 -0
- package/dist/types/cli/envReport.d.ts +153 -0
- package/dist/types/cli/execPortable.d.ts +54 -0
- package/dist/types/cli/gitHooks.d.ts +48 -0
- package/dist/types/cli/gitHooksReport.d.ts +101 -0
- package/dist/types/cli/globalFlags.d.ts +48 -0
- package/dist/types/cli/helpReport.d.ts +110 -0
- package/dist/types/cli/manPage.d.ts +21 -0
- package/dist/types/cli/nodefonyBin.d.ts +45 -0
- package/dist/types/cli/outdated.d.ts +119 -0
- package/dist/types/cli/progress.d.ts +349 -0
- package/dist/types/cli/projectRoot.d.ts +19 -0
- package/dist/types/cli/promptPassword.d.ts +22 -0
- package/dist/types/cli/prompts.d.ts +102 -0
- package/dist/types/cli/scaffold/destination.d.ts +70 -0
- package/dist/types/cli/scaffold/engine.d.ts +545 -0
- package/dist/types/cli/scaffold/entityFields.d.ts +238 -0
- package/dist/types/cli/scaffold/format.d.ts +78 -0
- package/dist/types/cli/scaffold/interactive.d.ts +11 -0
- package/dist/types/cli/scaffold/moduleLayout.d.ts +69 -0
- package/dist/types/cli/scaffold/reservedEntities.d.ts +49 -0
- package/dist/types/cli/scaffold/spec.d.ts +159 -0
- package/dist/types/cli/scaffold/steps.d.ts +24 -0
- package/dist/types/cli/scaffold/userContractSource.d.ts +86 -0
- package/dist/types/cli/scaffold/versions.d.ts +14 -0
- package/dist/types/cli/scaffold/writer.d.ts +100 -0
- package/dist/types/cli/startMenu.d.ts +195 -0
- package/dist/types/cli/symbols.d.ts +84 -0
- package/dist/types/cli/sysexits.d.ts +31 -0
- package/dist/types/cli/tableReport.d.ts +44 -0
- package/dist/types/cli/usageReport.d.ts +108 -0
- package/dist/types/client/ClientKernel.d.ts +90 -0
- package/dist/types/client/IClientKernel.d.ts +195 -0
- package/dist/types/client/angular/index.d.ts +273 -0
- package/dist/types/client/announce.d.ts +74 -0
- package/dist/types/client/debugbar/DebugBar.d.ts +279 -0
- package/dist/types/client/debugbar/format.d.ts +48 -0
- package/dist/types/client/debugbar/hmr.d.ts +16 -0
- package/dist/types/client/debugbar/index.d.ts +30 -0
- package/dist/types/client/debugbar/model.d.ts +158 -0
- package/dist/types/client/debugbar/network.d.ts +55 -0
- package/dist/types/client/debugbar/profile.d.ts +99 -0
- package/dist/types/client/index.d.ts +47 -0
- package/dist/types/client/react/index.d.ts +207 -0
- package/dist/types/client/realtime/AdaptiveRate.d.ts +138 -0
- package/dist/types/client/realtime/BrowserWsTransport.d.ts +27 -0
- package/dist/types/client/realtime/RealtimeClient.d.ts +573 -0
- package/dist/types/client/realtime/localEvents.d.ts +53 -0
- package/dist/types/client/realtime/notice.d.ts +70 -0
- package/dist/types/client/realtime/observe.d.ts +284 -0
- package/dist/types/client/roles/index.d.ts +15 -0
- package/dist/types/client/roles/registry.d.ts +72 -0
- package/dist/types/client/roles/roles.d.ts +68 -0
- package/dist/types/client/shim/cli-color.d.ts +2 -0
- package/dist/types/client/shim/events.d.ts +39 -0
- package/dist/types/client/shim/util.d.ts +14 -0
- package/dist/types/client/svelte/index.d.ts +216 -0
- package/dist/types/client/syslog/context.d.ts +76 -0
- package/dist/types/client/syslog/errors.d.ts +46 -0
- package/dist/types/client/syslog/uplink.d.ts +89 -0
- package/dist/types/client/transport/websocket.d.ts +5 -0
- package/dist/types/client/vue/index.d.ts +234 -0
- package/dist/types/colors.d.ts +32 -0
- package/dist/types/command/Builder.d.ts +47 -0
- package/dist/types/command/Command.d.ts +268 -0
- package/dist/types/config/configMeta.d.ts +53 -0
- package/dist/types/config/configProvenance.d.ts +58 -0
- package/dist/types/config/defaults.d.ts +33 -0
- package/dist/types/config/defineConfig.d.ts +70 -0
- package/dist/types/config/defineEnv.d.ts +170 -0
- package/dist/types/config/envExample.d.ts +23 -0
- package/dist/types/config/envOverride.d.ts +236 -0
- package/dist/types/config/index.d.ts +23 -0
- package/dist/types/config/infra.d.ts +171 -0
- package/dist/types/config/reactivity.d.ts +36 -0
- package/dist/types/config/reservedEnv.d.ts +145 -0
- package/dist/types/config/schema.d.ts +113 -0
- package/dist/types/config/types.d.ts +374 -0
- package/dist/types/config/use.d.ts +80 -0
- package/dist/types/finder/File.d.ts +26 -0
- package/dist/types/finder/FileResult.d.ts +14 -0
- package/dist/types/finder/Finder.d.ts +51 -0
- package/dist/types/finder/Result.d.ts +10 -0
- package/dist/types/index.d.ts +205 -0
- package/dist/types/kernel/BootConfigurationError.d.ts +50 -0
- package/dist/types/kernel/CliKernel.d.ts +289 -0
- package/dist/types/kernel/Kernel.d.ts +1255 -0
- package/dist/types/kernel/Module.d.ts +326 -0
- package/dist/types/kernel/adminPlane/adminCaller.d.ts +105 -0
- package/dist/types/kernel/adminPlane/adminRbac.d.ts +44 -0
- package/dist/types/kernel/adminPlane/catalog.d.ts +122 -0
- package/dist/types/kernel/adminPlane/executeAdmin.d.ts +99 -0
- package/dist/types/kernel/bootReport.d.ts +112 -0
- package/dist/types/kernel/checks/deep.d.ts +122 -0
- package/dist/types/kernel/checks/freshness.d.ts +49 -0
- package/dist/types/kernel/checks/gating.d.ts +134 -0
- package/dist/types/kernel/checks/guards.d.ts +57 -0
- package/dist/types/kernel/checks/lastBoot.d.ts +189 -0
- package/dist/types/kernel/checks/live.d.ts +110 -0
- package/dist/types/kernel/checks/packageDeps.d.ts +44 -0
- package/dist/types/kernel/checks/readiness.d.ts +97 -0
- package/dist/types/kernel/checks/renderReport.d.ts +107 -0
- package/dist/types/kernel/checks/report.d.ts +414 -0
- package/dist/types/kernel/checks/runDoctor.d.ts +361 -0
- package/dist/types/kernel/checks/surface.d.ts +148 -0
- package/dist/types/kernel/checks/walk.d.ts +45 -0
- package/dist/types/kernel/checks/wiring.d.ts +54 -0
- package/dist/types/kernel/commands/AiMcpCommand.d.ts +39 -0
- package/dist/types/kernel/commands/AiSyncCommand.d.ts +28 -0
- package/dist/types/kernel/commands/BuildCommand.d.ts +13 -0
- package/dist/types/kernel/commands/CardCommand.d.ts +34 -0
- package/dist/types/kernel/commands/ClusterCommand.d.ts +29 -0
- package/dist/types/kernel/commands/CompletionCommand.d.ts +17 -0
- package/dist/types/kernel/commands/CreateCommand.d.ts +16 -0
- package/dist/types/kernel/commands/DevCommand.d.ts +40 -0
- package/dist/types/kernel/commands/DoctorCommand.d.ts +55 -0
- package/dist/types/kernel/commands/EnvCommand.d.ts +35 -0
- package/dist/types/kernel/commands/GitHooksCommand.d.ts +27 -0
- package/dist/types/kernel/commands/InspectCommand.d.ts +59 -0
- package/dist/types/kernel/commands/InstallCommand.d.ts +7 -0
- package/dist/types/kernel/commands/MenuCommand.d.ts +58 -0
- package/dist/types/kernel/commands/OutdatedCommand.d.ts +47 -0
- package/dist/types/kernel/commands/ProdCommand.d.ts +29 -0
- package/dist/types/kernel/commands/StatusCommand.d.ts +17 -0
- package/dist/types/kernel/commands/StopCommand.d.ts +17 -0
- package/dist/types/kernel/commands/SymbolsCommand.d.ts +29 -0
- package/dist/types/kernel/commands/runtimeLauncher.d.ts +76 -0
- package/dist/types/kernel/decorators/kernelDecorator.d.ts +76 -0
- package/dist/types/kernel/injector/injector.d.ts +47 -0
- package/dist/types/kernel/injector/serviceOrder.d.ts +29 -0
- package/dist/types/kernel/inspect/adminSubjects.d.ts +169 -0
- package/dist/types/kernel/inspect/docOutline.d.ts +53 -0
- package/dist/types/kernel/lifecycleTags.d.ts +79 -0
- package/dist/types/kernel/moduleConfig.d.ts +35 -0
- package/dist/types/kernel/moduleGating.d.ts +78 -0
- package/dist/types/kernel/readinessRegistry.d.ts +104 -0
- package/dist/types/kernel/resolveModuleEntry.d.ts +46 -0
- package/dist/types/mcp/caller.d.ts +55 -0
- package/dist/types/mcp/guard.d.ts +66 -0
- package/dist/types/mcp/protocol.d.ts +163 -0
- package/dist/types/mcp/server.d.ts +70 -0
- package/dist/types/mcp/tools.d.ts +209 -0
- package/dist/types/oauth/authorizationServer.d.ts +204 -0
- package/dist/types/oauth/protectedResource.d.ts +339 -0
- package/dist/types/realtime/IRealtimeSocket.d.ts +142 -0
- package/dist/types/realtime/IRealtimeTransport.d.ts +50 -0
- package/dist/types/realtime/JsonRpcPeer.d.ts +251 -0
- package/dist/types/realtime/RealtimeEventMap.d.ts +269 -0
- package/dist/types/realtime/channelRate.d.ts +55 -0
- package/dist/types/realtime/platformChannels.d.ts +147 -0
- package/dist/types/runtime/GcScheduler.d.ts +96 -0
- package/dist/types/runtime/RequestContext.d.ts +152 -0
- package/dist/types/runtime/bearer.d.ts +88 -0
- package/dist/types/runtime/engineEnvironment.d.ts +115 -0
- package/dist/types/runtime/loadEnv.d.ts +86 -0
- package/dist/types/runtime/pageFacets.d.ts +104 -0
- package/dist/types/runtime/pageFilters.d.ts +139 -0
- package/dist/types/runtime/pageGuard.d.ts +78 -0
- package/dist/types/runtime/pageQuery.d.ts +138 -0
- package/dist/types/runtime/pageSort.d.ts +86 -0
- package/dist/types/runtime/redact.d.ts +27 -0
- package/dist/types/runtime/withTimeout.d.ts +51 -0
- package/dist/types/service/cluster/ClusterManager.d.ts +112 -0
- package/dist/types/service/cluster/ClusterProbeAggregator.d.ts +68 -0
- package/dist/types/service/cluster/ClusterRelay.d.ts +57 -0
- package/dist/types/service/cluster/clusterMaster.d.ts +40 -0
- package/dist/types/service/cluster/clusterMessage.d.ts +94 -0
- package/dist/types/service/cluster/cpuQuota.d.ts +37 -0
- package/dist/types/service/cluster/instanceProbe.d.ts +82 -0
- package/dist/types/service/cluster/podEnvironment.d.ts +35 -0
- package/dist/types/service/cluster/processProbe.d.ts +53 -0
- package/dist/types/service/cluster/richProcessProbe.d.ts +77 -0
- package/dist/types/service/cluster/topology.d.ts +64 -0
- package/dist/types/service/dev/BootReporter.d.ts +67 -0
- package/dist/types/service/dev/DevSupervisor.d.ts +117 -0
- package/dist/types/service/dev/bootVerdict.d.ts +99 -0
- package/dist/types/service/dev/detachedStart.d.ts +164 -0
- package/dist/types/service/dev/devProcess.d.ts +638 -0
- package/dist/types/service/dev/devProjects.d.ts +121 -0
- package/dist/types/service/dev/devStatusReport.d.ts +141 -0
- package/dist/types/service/dev/devStop.d.ts +57 -0
- package/dist/types/service/fetchService.d.ts +29 -0
- package/dist/types/service/gitService.d.ts +24 -0
- package/dist/types/syslog/Pdu.d.ts +134 -0
- package/dist/types/syslog/Syslog.d.ts +482 -0
- package/dist/types/syslog/drivers/ClusterFileLogDriver.d.ts +40 -0
- package/dist/types/syslog/drivers/FileLogDriver.d.ts +55 -0
- package/dist/types/syslog/drivers/ILogDriver.d.ts +177 -0
- package/dist/types/syslog/drivers/LokiLogDriver.d.ts +44 -0
- package/dist/types/syslog/drivers/MemoryLogDriver.d.ts +20 -0
- package/dist/types/syslog/drivers/OpenSearchLogDriver.d.ts +40 -0
- package/dist/types/syslog/drivers/builtinLogDrivers.d.ts +43 -0
- package/dist/types/syslog/drivers/filterPdus.d.ts +21 -0
- package/dist/types/syslog/drivers/logDriverRegistry.d.ts +100 -0
- package/dist/types/syslog/drivers/opensearchShared.d.ts +11 -0
- package/dist/types/syslog/drivers/pduFlow.d.ts +53 -0
- package/dist/types/syslog/drivers/pduProtocol.d.ts +20 -0
- package/dist/types/syslog/httpFetch.d.ts +48 -0
- package/dist/types/syslog/logColor.d.ts +59 -0
- package/dist/types/syslog/sinks/FileSink.d.ts +78 -0
- package/dist/types/syslog/transports/BatchingHttpTransport.d.ts +59 -0
- package/dist/types/syslog/transports/ConsoleTransport.d.ts +8 -0
- package/dist/types/syslog/transports/FileTransport.d.ts +13 -0
- package/dist/types/syslog/transports/HttpTransport.d.ts +15 -0
- package/dist/types/syslog/transports/LokiTransport.d.ts +45 -0
- package/dist/types/syslog/transports/OpenSearchTransport.d.ts +40 -0
- package/dist/types/syslog/transports/SyslogTransport.d.ts +9 -0
- package/dist/types/syslog/transports/index.d.ts +12 -0
- package/dist/types/testing/index.d.ts +197 -0
- package/dist/types/types/IAdminApi.d.ts +246 -0
- package/dist/types/types/ICliKernel.d.ts +28 -0
- package/dist/types/types/ICommand.d.ts +14 -0
- package/dist/types/types/IContainer.d.ts +35 -0
- package/dist/types/types/IIdempotencyStore.d.ts +159 -0
- package/dist/types/types/IKernel.d.ts +138 -0
- package/dist/types/types/IMcpTool.d.ts +157 -0
- package/dist/types/types/IModule.d.ts +73 -0
- package/dist/types/types/IModuleManifest.d.ts +49 -0
- package/dist/types/types/IPage.d.ts +119 -0
- package/dist/types/types/IService.d.ts +62 -0
- package/dist/types/types/ISyslog.d.ts +58 -0
- package/dist/types/types/ITransport.d.ts +5 -0
- package/dist/types/types/globals.d.ts +47 -0
- package/docs/angular-services.md +318 -0
- package/docs/catalogue.md +184 -0
- package/docs/cli.md +369 -0
- package/docs/client.md +616 -0
- package/docs/debugbar.md +218 -0
- package/docs/environnement.md +308 -0
- package/docs/index.md +388 -0
- package/docs/kernel.md +670 -0
- package/docs/progression.md +228 -0
- package/docs/react-hooks.md +686 -0
- package/docs/request-context.md +507 -0
- package/docs/service.md +590 -0
- package/docs/svelte-reactivite.md +293 -0
- package/docs/syslog.md +848 -0
- package/docs/testing.md +203 -0
- package/docs/vue-composables.md +255 -0
- package/man/nodefony.1 +152 -0
- package/package.json +163 -83
- package/templates/app/agents/AGENTS.md.tpl +967 -0
- package/templates/app/agents/POINTEUR.md.tpl +12 -0
- package/templates/app/base/Dockerfile.tpl +104 -0
- package/templates/app/base/README.md.tpl +314 -0
- package/templates/app/base/dockerignore.tpl +28 -0
- package/templates/app/base/env.ts.tpl +130 -0
- package/templates/app/base/gitattributes.tpl +28 -0
- package/templates/app/base/github/workflows/ci.yml.tpl +91 -0
- package/templates/app/base/gitignore.tpl +46 -0
- package/templates/app/base/gitlab-ci.yml.tpl +42 -0
- package/templates/app/base/index.ts.tpl +69 -0
- package/templates/app/base/nodefony.config.ts.tpl +342 -0
- package/templates/app/base/oxlintrc.json.tpl +127 -0
- package/templates/app/base/package.json.tpl +75 -0
- package/templates/app/base/prettierignore.tpl +24 -0
- package/templates/app/base/prettierrc.json.tpl +12 -0
- package/templates/app/base/rolldown.config.ts.tpl +8 -0
- package/templates/app/base/tests/config.test.ts.tpl +29 -0
- package/templates/app/base/tests/e2e.setup.ts.tpl +181 -0
- package/templates/app/base/tests/e2e.test.ts.tpl +105 -0
- package/templates/app/base/tests/migrations.e2e.test.ts.tpl +579 -0
- package/templates/app/base/tsconfig.json.tpl +47 -0
- package/templates/app/base/vitest.config.ts.tpl +88 -0
- package/templates/app/base/vitest.e2e.config.ts.tpl +39 -0
- package/templates/app/complete/compose.yaml.tpl +328 -0
- package/templates/app/complete/deploy/migrate-job.yaml.tpl +100 -0
- package/templates/app/complete/docker/db/init-nodefony-e2e.sql.tpl +30 -0
- package/templates/app/complete/docker/grafana/provisioning/datasources/loki.yaml.tpl +15 -0
- package/templates/app/complete/env.local.tpl +11 -0
- package/templates/app/complete/env.tpl +53 -0
- package/templates/app/complete/nodefony/entity/User.ts.tpl +69 -0
- package/templates/app/complete/nodefony/security/provisionUsers.ts.tpl +124 -0
- package/templates/app/complete/nodefony/service/AppBannerService.ts.tpl +98 -0
- package/templates/app/complete/nodefony/service/AppInfoService.ts.tpl +85 -0
- package/templates/app/frontend/angular/frontend/src/accent.css.tpl +34 -0
- package/templates/app/frontend/angular/frontend/src/app/app.component.ts.tpl +400 -0
- package/templates/app/frontend/react/frontend/src/App.tsx.tpl +421 -0
- package/templates/app/frontend/react/frontend/src/accent.css.tpl +30 -0
- package/templates/app/frontend/shared/frontend/src/brand.ts.tpl +3 -0
- package/templates/app/frontend/shared/frontend/src/showcase.css.tpl +224 -0
- package/templates/app/frontend/shared/nodefony/controllers/AppController.ts.tpl +45 -0
- package/templates/app/frontend/svelte/frontend/src/App.svelte.tpl +371 -0
- package/templates/app/frontend/svelte/frontend/src/accent.css.tpl +34 -0
- package/templates/app/frontend/vue/frontend/src/App.vue.tpl +367 -0
- package/templates/app/frontend/vue/frontend/src/accent.css.tpl +34 -0
- package/templates/app/home/nodefony/controllers/HomeController.ts.tpl +38 -0
- package/templates/command/nodefony/command/__NAME__.ts.tpl +132 -0
- package/templates/controller/duplex/nodefony/controllers/__NAME__.ts.tpl +188 -0
- package/templates/controller/example/nodefony/controllers/__NAME__.ts.tpl +348 -0
- package/templates/controller/hello/nodefony/controllers/__NAME__.ts.tpl +143 -0
- package/templates/controller/realtime/nodefony/controllers/__NAME__.ts.tpl +153 -0
- package/templates/controller/realtime/tests/__KEBAB__-realtime.test.ts.tpl +79 -0
- package/templates/controller/rest/nodefony/controllers/__NAME__.ts.tpl +159 -0
- package/templates/entity/base/nodefony/entity/__PASCAL__.schema.ts.tpl +31 -0
- package/templates/entity/base/nodefony/entity/__PASCAL__.ts.tpl +68 -0
- package/templates/entity/controller/nodefony/controllers/__PASCAL__Controller.ts.tpl +335 -0
- package/templates/entity/service/nodefony/service/__PASCAL__Service.ts.tpl +126 -0
- package/templates/entity/tests/tests/__KEBAB__.e2e.test.ts.tpl +358 -0
- package/templates/entity/tests/tests/__KEBAB__.test.ts.tpl +87 -0
- package/templates/front/angular/frontend/src/app/app.component.ts.tpl +30 -0
- package/templates/front/base/nodefony/controllers/__NAME__.ts.tpl +60 -0
- package/templates/front/react/frontend/src/App.tsx.tpl +26 -0
- package/templates/front/svelte/frontend/src/App.svelte.tpl +19 -0
- package/templates/front/vue/frontend/src/App.vue.tpl +23 -0
- package/templates/module/ai/AGENTS.md.tpl +71 -0
- package/templates/module/base/README.md.tpl +62 -0
- package/templates/module/base/docs/index.md.tpl +55 -0
- package/templates/module/base/index.ts.tpl +50 -0
- package/templates/module/base/nodefony/config/config.ts.tpl +60 -0
- package/templates/module/base/nodefony/config/defineModuleConfig.ts.tpl +55 -0
- package/templates/module/base/nodefony/src/errors/__PASCAL__Error.ts.tpl +20 -0
- package/templates/module/base/package.json.tpl +53 -0
- package/templates/module/base/rolldown.config.ts.tpl +14 -0
- package/templates/module/base/tests/__KEBAB__.test.ts.tpl +39 -0
- package/templates/module/base/tsconfig.json.tpl +42 -0
- package/templates/module/base/vitest.config.ts.tpl +27 -0
- package/templates/module/packages/CLAUDE.md.tpl +51 -0
- package/templates/module/packages/MEMORY.md.tpl +39 -0
- package/templates/module/packages/tsconfig.declarations.json.tpl +19 -0
- package/templates/module/packages/tsconfig.tests.json.tpl +11 -0
- package/templates/module/service/nodefony/interfaces/I__PASCAL__Service.ts.tpl +14 -0
- package/templates/module/service/nodefony/interfaces/index.ts.tpl +1 -0
- package/templates/module/service/nodefony/service/__PASCAL__Service.ts.tpl +116 -0
- package/templates/service/nodefony/interfaces/I__PASCAL__Service.ts.tpl +19 -0
- package/templates/service/nodefony/service/__PASCAL__Service.ts.tpl +136 -0
- package/templates/service/tests/__PASCAL__Service.test.ts.tpl +53 -0
- package/templates/shared/front-entry/angular/frontend/src/main.ts.tpl +17 -0
- package/templates/shared/front-entry/react/frontend/src/main.tsx.tpl +11 -0
- package/templates/shared/front-entry/svelte/frontend/src/main.ts.tpl +13 -0
- package/templates/shared/front-entry/vue/frontend/src/main.ts.tpl +12 -0
- package/templates/shared/front-registrar/nodefony/frontend/register__PASCAL__Entry.ts.tpl +40 -0
- package/templates/shared/front-shell/frontend/index.html.tpl +39 -0
- package/templates/shared/ng-app-tsconfig/frontend/tsconfig.app.json.tpl +18 -0
- package/templates/shared/svelte-shim/frontend/src/env.d.ts.tpl +12 -0
- package/templates/shared/vue-shim/frontend/src/env.d.ts.tpl +15 -0
- package/.yarnclean +0 -45
- package/CHANGELOG.md +0 -406
- package/autoloader.es6 +0 -253
- package/builder.es6 +0 -366
- package/cli/builder/bundles/bundle.js +0 -328
- package/cli/builder/bundles/controller.js +0 -73
- package/cli/builder/bundles/users-bundle/.yarnclean +0 -45
- package/cli/builder/bundles/users-bundle/Command/fixtureTask.js +0 -47
- package/cli/builder/bundles/users-bundle/Command/usersCommand.js +0 -105
- package/cli/builder/bundles/users-bundle/Entity/mongoose/userEntity.js +0 -168
- package/cli/builder/bundles/users-bundle/Entity/sequelize/userEntity.js +0 -231
- package/cli/builder/bundles/users-bundle/Fixtures/users.js +0 -117
- package/cli/builder/bundles/users-bundle/Fixtures/usersFixtures.js +0 -114
- package/cli/builder/bundles/users-bundle/Resources/config/config.js +0 -90
- package/cli/builder/bundles/users-bundle/Resources/config/routing.js +0 -17
- package/cli/builder/bundles/users-bundle/Resources/config/security.js +0 -96
- package/cli/builder/bundles/users-bundle/Resources/config/services.js +0 -7
- package/cli/builder/bundles/users-bundle/Resources/config/webpack/webpack.dev.config.js +0 -13
- package/cli/builder/bundles/users-bundle/Resources/config/webpack/webpack.prod.config.js +0 -31
- package/cli/builder/bundles/users-bundle/Resources/config/webpack.config.js +0 -146
- package/cli/builder/bundles/users-bundle/Resources/js/users.js +0 -153
- package/cli/builder/bundles/users-bundle/Resources/public/favicon.ico +0 -0
- package/cli/builder/bundles/users-bundle/Resources/public/images/users-logo.png +0 -0
- package/cli/builder/bundles/users-bundle/Resources/scss/awesome/font-awesome.config.js +0 -11
- package/cli/builder/bundles/users-bundle/Resources/scss/custom.scss +0 -23
- package/cli/builder/bundles/users-bundle/Resources/scss/users.scss +0 -59
- package/cli/builder/bundles/users-bundle/Resources/swagger/openapi/login.js +0 -235
- package/cli/builder/bundles/users-bundle/Resources/swagger/openapi/users.js +0 -232
- package/cli/builder/bundles/users-bundle/Resources/translations/login.en_en.yml +0 -14
- package/cli/builder/bundles/users-bundle/Resources/translations/login.fr_fr.yml +0 -14
- package/cli/builder/bundles/users-bundle/Resources/translations/users.en_en.yml +0 -35
- package/cli/builder/bundles/users-bundle/Resources/translations/users.fr_fr.yml +0 -36
- package/cli/builder/bundles/users-bundle/Resources/views/base.html.twig +0 -32
- package/cli/builder/bundles/users-bundle/Resources/views/footer.html.twig +0 -7
- package/cli/builder/bundles/users-bundle/Resources/views/header.html.twig +0 -90
- package/cli/builder/bundles/users-bundle/Resources/views/login/login.html.twig +0 -43
- package/cli/builder/bundles/users-bundle/Resources/views/users/createUser.html.twig +0 -296
- package/cli/builder/bundles/users-bundle/Resources/views/users/readUsers.html.twig +0 -94
- package/cli/builder/bundles/users-bundle/controller/api/graphql/graphqlController.js +0 -56
- package/cli/builder/bundles/users-bundle/controller/api/graphql/userResolver.js +0 -121
- package/cli/builder/bundles/users-bundle/controller/api/graphql/usertype.js +0 -58
- package/cli/builder/bundles/users-bundle/controller/api/openapi/loginApiController.js +0 -210
- package/cli/builder/bundles/users-bundle/controller/api/openapi/restUserController.js +0 -244
- package/cli/builder/bundles/users-bundle/controller/loginController.js +0 -91
- package/cli/builder/bundles/users-bundle/controller/usersController.js +0 -332
- package/cli/builder/bundles/users-bundle/package.json +0 -58
- package/cli/builder/bundles/users-bundle/readme.md +0 -360
- package/cli/builder/bundles/users-bundle/services/usersService.js +0 -411
- package/cli/builder/bundles/users-bundle/src/providers/mongoose/userProvider.js +0 -47
- package/cli/builder/bundles/users-bundle/src/providers/sequelize/userProvider.js +0 -48
- package/cli/builder/bundles/users-bundle/tests/loginTest.js +0 -182
- package/cli/builder/bundles/users-bundle/usersBundle.js +0 -26
- package/cli/builder/microService/microService.js +0 -261
- package/cli/builder/microService/skeletons/.editorconfig +0 -18
- package/cli/builder/microService/skeletons/.env-cmdrc.js +0 -32
- package/cli/builder/microService/skeletons/.jshintrc +0 -37
- package/cli/builder/microService/skeletons/README.md +0 -117
- package/cli/builder/microService/skeletons/bin/bash/hello.sh +0 -5
- package/cli/builder/microService/skeletons/bin/cli +0 -13
- package/cli/builder/microService/skeletons/bin/python/hello.py +0 -20
- package/cli/builder/microService/skeletons/config/config.js +0 -29
- package/cli/builder/microService/skeletons/config/pm2.config.js +0 -72
- package/cli/builder/microService/skeletons/config/webpack/webpack.config.dev.js +0 -8
- package/cli/builder/microService/skeletons/config/webpack/webpack.config.prod.js +0 -25
- package/cli/builder/microService/skeletons/config/webpack.config.js +0 -114
- package/cli/builder/microService/skeletons/package.json +0 -76
- package/cli/builder/microService/skeletons/src/browser/index.css +0 -3
- package/cli/builder/microService/skeletons/src/browser/index.js +0 -16
- package/cli/builder/microService/skeletons/src/browser/socketio.js +0 -46
- package/cli/builder/microService/skeletons/src/cli/cli.js +0 -224
- package/cli/builder/microService/skeletons/src/cli/menu.js +0 -28
- package/cli/builder/microService/skeletons/src/n-api/README.md +0 -1
- package/cli/builder/microService/skeletons/src/n-api/binding.gyp +0 -14
- package/cli/builder/microService/skeletons/src/n-api/hello.cc +0 -14
- package/cli/builder/microService/skeletons/src/n-api/hello.js +0 -23
- package/cli/builder/microService/skeletons/src/n-api/package.json +0 -15
- package/cli/builder/microService/skeletons/src/node/examples/index.js +0 -120
- package/cli/builder/microService/skeletons/src/node/index.js +0 -102
- package/cli/builder/microService/skeletons/src/node/services/markdown/markdown.js +0 -27
- package/cli/builder/microService/skeletons/src/node/services/servers/http.js +0 -45
- package/cli/builder/microService/skeletons/src/node/services/servers/https.js +0 -44
- package/cli/builder/microService/skeletons/src/node/services/socketio/socketio.js +0 -46
- package/cli/builder/microService/skeletons/src/node/services/syscall/syscall.js +0 -111
- package/cli/builder/microService/skeletons/src/node/services/worker/thread.js +0 -59
- package/cli/builder/microService/skeletons/src/node/services/worker/worker.js +0 -60
- package/cli/builder/microService/skeletons/src/templates/base.html +0 -12
- package/cli/builder/microService/skeletons/src/templates/socket.html +0 -23
- package/cli/builder/microService/skeletons/tests/unit/serviceTest.js +0 -30
- package/cli/builder/project/project.js +0 -474
- package/cli/builder/project/skeletons/README.md +0 -778
- package/cli/builder/project/skeletons/bin/dev-deploy.sh +0 -5
- package/cli/builder/project/skeletons/bin/generateCertificates.sh.skeleton +0 -180
- package/cli/builder/project/skeletons/bin/prod-deploy.sh +0 -3
- package/cli/builder/project/skeletons/config/config.js.skeleton +0 -178
- package/cli/builder/project/skeletons/config/openssl/ca/openssl.cnf.skeleton +0 -150
- package/cli/builder/project/skeletons/config/openssl/ca_intermediate/openssl.cnf.skeleton +0 -152
- package/cli/builder/project/skeletons/config/pm2.config.js.skeleton +0 -62
- package/cli/builder/project/skeletons/documentation.html.twig +0 -24
- package/cli/builder/project/skeletons/editorconfig.skeleton +0 -18
- package/cli/builder/project/skeletons/eslintignore.skeleton +0 -15
- package/cli/builder/project/skeletons/eslintrc.js.skeleton +0 -97
- package/cli/builder/project/skeletons/gitignore.skeleton +0 -32
- package/cli/builder/project/skeletons/migrations/2022.12.25T17.37.37.entity-user.js +0 -137
- package/cli/builder/project/skeletons/migrations/2022.12.25T17.37.38.entity-session.js +0 -97
- package/cli/builder/project/skeletons/migrations/2022.12.25T17.37.39.entity-requests.js +0 -115
- package/cli/builder/project/skeletons/migrations/2022.12.25T17.37.40.entity-jwts.js +0 -97
- package/cli/builder/project/skeletons/migrations/migrations.skeleton.js +0 -101
- package/cli/builder/project/skeletons/package.json.twig +0 -71
- package/cli/builder/react/reactBuilder.js +0 -224
- package/cli/builder/react/skeletons/app/Resources/databases/nodefony.db +0 -0
- package/cli/builder/react/skeletons/app/Resources/translations/messages.en_en.yml +0 -5
- package/cli/builder/react/skeletons/app/Resources/translations/messages.fr_fr.yml +0 -5
- package/cli/builder/react/skeletons/app/Resources/views/base.html.twig +0 -33
- package/cli/builder/react/skeletons/app/config/config.js +0 -392
- package/cli/builder/react/skeletons/app/config/routing.js +0 -10
- package/cli/builder/react/skeletons/app/config/security.js +0 -74
- package/cli/builder/react/skeletons/app/controller/appController.js +0 -22
- package/cli/builder/sandbox/sandBoxBuilder.js +0 -610
- package/cli/builder/sandbox/skeletons/Resources/css/entry.css +0 -48
- package/cli/builder/sandbox/skeletons/Resources/js/entry.js +0 -60
- package/cli/builder/sandbox/skeletons/Resources/public/manifest.json +0 -32
- package/cli/builder/sandbox/skeletons/Resources/translations/messages.en_en.yml +0 -5
- package/cli/builder/sandbox/skeletons/Resources/translations/messages.fr_fr.yml +0 -5
- package/cli/builder/sandbox/skeletons/Resources/views/base.html.twig +0 -46
- package/cli/builder/sandbox/skeletons/Resources/views/index.html.twig +0 -34
- package/cli/builder/sandbox/skeletons/bootstrap/custom.scss +0 -27
- package/cli/builder/sandbox/skeletons/bootstrap/entry.scss +0 -60
- package/cli/builder/sandbox/skeletons/workbox/templates/index.html.twig +0 -32
- package/cli/builder/sandbox/skeletons/workbox/workers/service-worker.js +0 -196
- package/cli/builder/skeletons/Resources/public/favicon.ico +0 -0
- package/cli/builder/skeletons/Resources/public/images/app-logo.png +0 -0
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/401.html.twig +0 -1
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/401.json.twig +0 -24
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/403.html.twig +0 -1
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/403.json.twig +0 -20
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/404.html.twig +0 -1
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/404.json.twig +0 -20
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/500.html.twig +0 -1
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/base.html.twig +0 -30
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/exception.html.twig +0 -1
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/exception.json.twig +0 -24
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/footer.html.twig +0 -33
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/header.html.twig +0 -6
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/index.html.twig +0 -6
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/index.json.twig +0 -1
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/layout.html.twig +0 -125
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/layout.json.twig +0 -5
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/timeout.html.twig +0 -1
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/timeout.json.twig +0 -24
- package/cli/builder/skeletons/app/appKernel.js +0 -133
- package/cli/builder/skeletons/binding/binding.cc +0 -26
- package/cli/builder/skeletons/binding/binding.skeleton +0 -8
- package/cli/builder/skeletons/bundle/bundleClass.js +0 -37
- package/cli/builder/skeletons/command/commandClass.js +0 -11
- package/cli/builder/skeletons/command/taskClass.js +0 -20
- package/cli/builder/skeletons/config/config.js +0 -138
- package/cli/builder/skeletons/config/nodefony/elastic-bundle.js +0 -37
- package/cli/builder/skeletons/config/nodefony/framework-bundle.js +0 -22
- package/cli/builder/skeletons/config/nodefony/http-bundle.js +0 -104
- package/cli/builder/skeletons/config/nodefony/mail-bundle.js +0 -44
- package/cli/builder/skeletons/config/nodefony/mongoose-bundle.js +0 -51
- package/cli/builder/skeletons/config/nodefony/monitoring-bundle.js +0 -34
- package/cli/builder/skeletons/config/nodefony/realtime-bundle.js +0 -15
- package/cli/builder/skeletons/config/nodefony/redis-bundle.js +0 -44
- package/cli/builder/skeletons/config/nodefony/security-bundle.js +0 -25
- package/cli/builder/skeletons/config/nodefony/sequelize-bundle.js +0 -156
- package/cli/builder/skeletons/config/routing.js +0 -55
- package/cli/builder/skeletons/config/security.js +0 -102
- package/cli/builder/skeletons/config/services.js +0 -1
- package/cli/builder/skeletons/config/webpack/webpack.dev.config.js +0 -13
- package/cli/builder/skeletons/config/webpack/webpack.prod.config.js +0 -20
- package/cli/builder/skeletons/config/webpack.config.js +0 -148
- package/cli/builder/skeletons/controller/controllerClass.js +0 -75
- package/cli/builder/skeletons/package.json.twig +0 -57
- package/cli/builder/skeletons/unittest/testFile.js +0 -46
- package/cli/builder/vue/skeletons/Resources/public/images/app-logo.png +0 -0
- package/cli/builder/vue/skeletons/Resources/translations/messages.en_en.yml +0 -5
- package/cli/builder/vue/skeletons/Resources/translations/messages.fr_fr.yml +0 -5
- package/cli/builder/vue/skeletons/vue.config.js +0 -129
- package/cli/builder/vue/vueBuilder.js +0 -410
- package/cli/generate/generate.es6 +0 -103
- package/cli/install/install.js +0 -190
- package/cli/sequelize/sequelize.js +0 -94
- package/cli/start.js +0 -702
- package/cli/tools/pm2.es6 +0 -112
- package/cli/tools/tools.es6 +0 -97
- package/cli.es6 +0 -925
- package/container.es6 +0 -272
- package/error.es6 +0 -293
- package/fileClass.es6 +0 -242
- package/finder/file.es6 +0 -33
- package/finder/fileResult.es6 +0 -138
- package/finder/finder2.es6 +0 -275
- package/finder.es6 +0 -427
- package/kernel/annotations/annotations.es6 +0 -286
- package/kernel/api/api.es6 +0 -61
- package/kernel/api/graphqlApi.es6 +0 -107
- package/kernel/api/jsonApi.es6 +0 -177
- package/kernel/api/openApi.es6 +0 -139
- package/kernel/api/schemas/openApiSchema.js +0 -394
- package/kernel/babylon.es6 +0 -162
- package/kernel/bundle.es6 +0 -1200
- package/kernel/cliKernel.es6 +0 -869
- package/kernel/command.es6 +0 -78
- package/kernel/commands/nodefonyCommand.es6 +0 -247
- package/kernel/commands/tasks/bundlesTask.es6 +0 -59
- package/kernel/controllers/controller.es6 +0 -791
- package/kernel/fixture.es6 +0 -19
- package/kernel/injections/injections.es6 +0 -424
- package/kernel/kernel.es6 +0 -1960
- package/kernel/kernelWatcher.es6 +0 -387
- package/kernel/orm/entity.es6 +0 -59
- package/kernel/orm/orm.es6 +0 -139
- package/kernel/reader.es6 +0 -290
- package/kernel/security/encoder.es6 +0 -17
- package/kernel/security/factories/factory.es6 +0 -111
- package/kernel/security/factories/passeportFactory.es6 +0 -61
- package/kernel/security/provider.es6 +0 -58
- package/kernel/security/providers/chainProvider.es6 +0 -99
- package/kernel/security/providers/memoryProvider.es6 +0 -55
- package/kernel/security/providers/providerManager.es6 +0 -67
- package/kernel/security/providers/userEntityProvider.es6 +0 -50
- package/kernel/security/role.es6 +0 -12
- package/kernel/security/secureArea.es6 +0 -431
- package/kernel/security/tokens/token.es6 +0 -171
- package/kernel/security/user.es6 +0 -106
- package/kernel/serviceRealTime.es6 +0 -21
- package/kernel/services/connectionsService.es6 +0 -93
- package/kernel/services/cron/cronService.es6 +0 -123
- package/kernel/task.es6 +0 -80
- package/kernel/templates.es6 +0 -22
- package/kernel/templating/twig.es6 +0 -218
- package/kernel/tests/cliTest.js +0 -59
- package/kernel/tests/containerTest.js +0 -232
- package/kernel/tests/kernelTest.js +0 -39
- package/nodefony.es6 +0 -1084
- package/notificationsCenter.es6 +0 -118
- package/protocol.es6 +0 -86
- package/protocols/bayeux.es6 +0 -174
- package/protocols/jsonRpc/jsonrpc.es6 +0 -56
- package/result.es6 +0 -99
- package/service.es6 +0 -288
- package/syslog/pdu.es6 +0 -141
- package/syslog/syslog.es6 +0 -754
- package/watcher.es6 +0 -113
|
@@ -0,0 +1,861 @@
|
|
|
1
|
+
import { skippedChecks } from "../kernel/checks/report.js";
|
|
2
|
+
import { INSPECT_SUBJECTS, callAdminEndpoint, readAdminSubject } from "../kernel/inspect/adminSubjects.js";
|
|
3
|
+
import { collectDoctorReport, countCheckFindings } from "../kernel/checks/runDoctor.js";
|
|
4
|
+
import { ADMIN_SCOPE_READ, rolesFromScopes } from "../kernel/adminPlane/adminCaller.js";
|
|
5
|
+
import { lookupSymbol, readSymbolsGraph } from "../cli/symbols.js";
|
|
6
|
+
import { outlineMarkdown } from "../kernel/inspect/docOutline.js";
|
|
7
|
+
import { adminReadCatalog, findAdminReadEntry } from "../kernel/adminPlane/catalog.js";
|
|
8
|
+
//#region src/mcp/tools.ts
|
|
9
|
+
/**
|
|
10
|
+
* Outils MCP : le **catalogue intégré** du framework, et la **collecte** de ceux
|
|
11
|
+
* qu'une application déclare.
|
|
12
|
+
*
|
|
13
|
+
* ⚠️ **Rien n'est calculé ici.** Chaque outil intégré traduit un appel JSON-RPC
|
|
14
|
+
* vers une brique qui répond DÉJÀ à une autre porte : `inspect` lit le plan
|
|
15
|
+
* d'administration par {@link readAdminSubject} (la même fonction que la
|
|
16
|
+
* commande `nodefony inspect`), `check` appelle {@link collectDoctorReport} (la
|
|
17
|
+
* même que `nodefony doctor`). Une source, plusieurs portes — un outil qui
|
|
18
|
+
* recalculerait sa réponse finirait par contredire la commande, et c'est lui
|
|
19
|
+
* qu'on croirait sur parole.
|
|
20
|
+
*
|
|
21
|
+
* ⭐ **La description d'un outil est le premier critère de son déclenchement.**
|
|
22
|
+
* Un modèle n'appelle pas ce qu'il ne comprend pas : le POC de 2026-05 l'a payé
|
|
23
|
+
* cash — un outil à description neutre n'a jamais été appelé, un skill
|
|
24
|
+
* auto-déclenché prenait la main à chaque fois. Ces descriptions disent donc ce
|
|
25
|
+
* que l'outil rend ET quand s'en servir, pas seulement son nom.
|
|
26
|
+
*
|
|
27
|
+
* ## Pourquoi la collecte, et pas un registre
|
|
28
|
+
*
|
|
29
|
+
* Un module déclare ses outils par {@link IModule.getMcpTools} ; ils sont
|
|
30
|
+
* ramassés **au moment de servir la requête**, jamais stockés. C'est
|
|
31
|
+
* délibérément l'inverse du data plane admin ({@link IAdminRegistry}), qui a
|
|
32
|
+
* besoin d'un registre parce qu'il monte des ROUTES au boot et qu'un module
|
|
33
|
+
* arrivé trop tard n'aurait plus rien à monter. Un outil MCP n'a rien à monter :
|
|
34
|
+
* il est lu à la demande. D'où trois propriétés gagnées gratuitement — aucune
|
|
35
|
+
* structure allouée au démarrage (donc coût nul en production, où aucune porte
|
|
36
|
+
* MCP n'existe), aucun ordre de `register()` à respecter, et une fraîcheur qui
|
|
37
|
+
* est une propriété du mécanisme plutôt qu'une discipline à tenir.
|
|
38
|
+
*/
|
|
39
|
+
/**
|
|
40
|
+
* Au-delà de quoi une réponse cesse d'être une réponse.
|
|
41
|
+
*
|
|
42
|
+
* Mesuré, pas choisi en l'air : `inspect routes` rendait 47 000 caractères et
|
|
43
|
+
* `inspect config` 190 730 — le second dépassait ce que le client accepte, il
|
|
44
|
+
* partait sur disque, et l'agent brûlait vingt tours à le relire au `jq`. Le
|
|
45
|
+
* premier passait, et ne servait à rien pour autant : à qui demandait le NOMBRE
|
|
46
|
+
* de routes, il fallait compter 119 objets dans un mur de JSON.
|
|
47
|
+
*
|
|
48
|
+
* La borne est donc largement SOUS la limite des clients : ce qu'on protège
|
|
49
|
+
* n'est pas le transport, c'est la capacité de l'agent à répondre sans relire.
|
|
50
|
+
*/
|
|
51
|
+
const MCP_TEXT_MAX_CHARS = 32e3;
|
|
52
|
+
/** Ce qu'on garde d'une valeur dans une vue d'ensemble : la surface. */
|
|
53
|
+
const SCALAR_MAX_CHARS = 120;
|
|
54
|
+
/**
|
|
55
|
+
* La SURFACE d'un objet — ses champs scalaires courts, sans sa profondeur.
|
|
56
|
+
*
|
|
57
|
+
* Ce qui pèse dans un inventaire n'est presque jamais ce qu'on y cherche : sur
|
|
58
|
+
* une route, `name`/`path`/`controller` tiennent en cent caractères, et c'est la
|
|
59
|
+
* description, les tableaux de tags et les objets imbriqués qui font les 47 ko.
|
|
60
|
+
* On jette donc la profondeur et on garde la surface — TOUTES les entrées
|
|
61
|
+
* restent visibles, ce qu'un échantillon des N premières ne permet pas : une
|
|
62
|
+
* question portant sur la 100ᵉ recevrait une réponse fausse, et l'agent n'aurait
|
|
63
|
+
* aucun moyen de le savoir.
|
|
64
|
+
*/
|
|
65
|
+
function surfaceOf(value) {
|
|
66
|
+
if (value === null || typeof value !== "object") return value;
|
|
67
|
+
if (Array.isArray(value)) return `[${value.length}]`;
|
|
68
|
+
const kept = {};
|
|
69
|
+
for (const [key, v] of Object.entries(value)) if (v === null || typeof v === "number" || typeof v === "boolean") kept[key] = v;
|
|
70
|
+
else if (typeof v === "string" && v.length <= SCALAR_MAX_CHARS) kept[key] = v;
|
|
71
|
+
else if (Array.isArray(v) && v.every((e) => typeof e === "string")) {
|
|
72
|
+
if (v.join(",").length <= SCALAR_MAX_CHARS) kept[key] = v;
|
|
73
|
+
}
|
|
74
|
+
return kept;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Une donnée trop volumineuse, ramenée à une RÉPONSE.
|
|
78
|
+
*
|
|
79
|
+
* Deux formes, selon ce qu'on a sous la main :
|
|
80
|
+
* - **un tableau** rend son `count` — la première chose qu'on veut d'une liste,
|
|
81
|
+
* et celle qu'un modèle calcule mal et cher — puis ses entrées en surface ;
|
|
82
|
+
* - **un objet** rend ses clés de premier niveau : c'est la carte qui permet de
|
|
83
|
+
* demander ensuite la bonne branche (pour `config`, `inspect module <nom>`).
|
|
84
|
+
*
|
|
85
|
+
* Dans les deux cas la réponse DIT ce qu'elle a fait, et elle le dit EN TÊTE.
|
|
86
|
+
* Une troncature muette est pire que pas de troncature — l'agent croit tout
|
|
87
|
+
* tenir ; une troncature annoncée APRÈS vingt mille caractères d'entrées ne vaut
|
|
88
|
+
* guère mieux, il a déjà décidé quoi faire de ce qu'il a lu. Mesuré : sur la
|
|
89
|
+
* tâche « annonce le nombre de routes », l'agent recevait `count` puis 88
|
|
90
|
+
* entrées puis, tout en bas, l'avertissement — et repartait recompter les
|
|
91
|
+
* entrées visibles au lieu de lire le compte exact qu'on venait de lui donner.
|
|
92
|
+
*
|
|
93
|
+
* Et la note ne renvoie PAS vers un affinement : `routes`, `services` ou
|
|
94
|
+
* `modules` n'acceptent aucun filtre, si bien que « affine la demande » nommait
|
|
95
|
+
* un geste qui n'existe pas. Elle désigne ce qui EST utilisable — `count`, exact
|
|
96
|
+
* et portant sur la liste entière.
|
|
97
|
+
*/
|
|
98
|
+
function summarize(value, size) {
|
|
99
|
+
if (Array.isArray(value)) {
|
|
100
|
+
const items = value.map(surfaceOf);
|
|
101
|
+
let rendered = JSON.stringify({
|
|
102
|
+
count: value.length,
|
|
103
|
+
note: `count = ${value.length} : c'est le nombre EXACT, il porte sur la liste entière. Les entrées ci-dessous sont ramenées à leur surface (${size} caractères au complet) — demande le détail d'une entrée précise plutôt que la liste entière`,
|
|
104
|
+
items
|
|
105
|
+
}, null, 2);
|
|
106
|
+
if (rendered.length <= MCP_TEXT_MAX_CHARS) return rendered;
|
|
107
|
+
let keptCount = items.length;
|
|
108
|
+
while (keptCount > 1 && rendered.length > MCP_TEXT_MAX_CHARS) {
|
|
109
|
+
keptCount = Math.floor(keptCount / 2);
|
|
110
|
+
rendered = JSON.stringify({
|
|
111
|
+
count: value.length,
|
|
112
|
+
note: `count = ${value.length} : c'est le nombre EXACT, il porte sur la liste entière. Seules ${keptCount} entrées sont montrées (la liste pèse ${size} caractères) — toute affirmation sur le NOMBRE se fonde sur count, jamais sur les entrées visibles.`,
|
|
113
|
+
items: items.slice(0, keptCount)
|
|
114
|
+
}, null, 2);
|
|
115
|
+
}
|
|
116
|
+
return rendered;
|
|
117
|
+
}
|
|
118
|
+
const keys = value && typeof value === "object" ? Object.keys(value) : void 0;
|
|
119
|
+
return JSON.stringify({
|
|
120
|
+
keys,
|
|
121
|
+
note: `réponse de ${size} caractères, trop volumineuse pour être rendue entière — demande une branche précise (par exemple le module qui t'intéresse)`
|
|
122
|
+
}, null, 2);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Rend un résultat d'outil — les données partent en JSON indenté, lisible.
|
|
126
|
+
*
|
|
127
|
+
* Exporté parce qu'une application qui déclare un outil en a besoin : sans lui,
|
|
128
|
+
* chacune réinventerait l'enveloppe `content[]`, et une enveloppe mal formée
|
|
129
|
+
* n'échoue pas — elle rend un résultat vide que l'agent prend pour une réponse.
|
|
130
|
+
*
|
|
131
|
+
* **Un résultat est BORNÉ** ({@link MCP_TEXT_MAX_CHARS}) : au-delà, il rend un
|
|
132
|
+
* résumé plutôt qu'un déversement (voir {@link summarize}). La garde vit ICI, et
|
|
133
|
+
* non dans les quatre outils intégrés, pour qu'un outil déclaré par une
|
|
134
|
+
* application en hérite sans le savoir — c'est le genre de règle qu'on
|
|
135
|
+
* n'applique jamais deux fois de la même façon si on la laisse à l'appelant.
|
|
136
|
+
* En deçà de la borne — le cas courant — la donnée part TELLE QUELLE : un
|
|
137
|
+
* consommateur qui la parse n'a rien à changer, et on ne paie pas la garde sur
|
|
138
|
+
* 100 % des appels pour 1 % de gros sujets.
|
|
139
|
+
*
|
|
140
|
+
* @param value - donnée à rendre (sérialisée si ce n'est pas déjà du texte)
|
|
141
|
+
* @param isError - marque un échec MÉTIER (pas une faute de protocole)
|
|
142
|
+
*/
|
|
143
|
+
function mcpText(value, isError = false) {
|
|
144
|
+
const rendered = typeof value === "string" ? value : JSON.stringify(value, null, 2);
|
|
145
|
+
const text = isError || rendered.length <= MCP_TEXT_MAX_CHARS ? rendered : summarize(value, rendered.length);
|
|
146
|
+
return isError ? {
|
|
147
|
+
content: [{
|
|
148
|
+
type: "text",
|
|
149
|
+
text
|
|
150
|
+
}],
|
|
151
|
+
isError: true
|
|
152
|
+
} : { content: [{
|
|
153
|
+
type: "text",
|
|
154
|
+
text
|
|
155
|
+
}] };
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Marge laissée au corps d'un refus. Un producteur qui explique pourquoi il
|
|
159
|
+
* refuse tient en quelques centaines d'octets (un plan de page, une liste de
|
|
160
|
+
* valeurs) ; au-delà, c'est une donnée déguisée en message d'erreur, et une
|
|
161
|
+
* réponse démesurée sature la fenêtre de celui qui la lit.
|
|
162
|
+
*/
|
|
163
|
+
const MCP_ERROR_BODY_MAX_CHARS = 4e3;
|
|
164
|
+
/**
|
|
165
|
+
* Rend un refus du plan d'administration — la phrase ET ce que le producteur a
|
|
166
|
+
* joint pour la corriger.
|
|
167
|
+
*
|
|
168
|
+
* ⚠️ Rendre la seule phrase faisait conclure l'inverse de la vérité : demander
|
|
169
|
+
* une section absente d'une page PRÉSENTE produit « … introuvable (404) », et
|
|
170
|
+
* l'agent en déduisait que la page n'existait pas — alors que le producteur
|
|
171
|
+
* joignait le plan de cette page, c'est-à-dire la réponse. Une porte qui résume
|
|
172
|
+
* un refus lui fait dire autre chose.
|
|
173
|
+
*
|
|
174
|
+
* @param read - l'échec rendu par la lecture, corps du producteur inclus.
|
|
175
|
+
* @returns le résultat d'outil, en erreur, borné en volume.
|
|
176
|
+
*/
|
|
177
|
+
function mcpAdminFailure(read) {
|
|
178
|
+
if (read.body === void 0 || read.body === null) return mcpText(read.message, true);
|
|
179
|
+
const rendered = JSON.stringify(read.body, null, 2);
|
|
180
|
+
const body = rendered.length <= MCP_ERROR_BODY_MAX_CHARS ? rendered : `${rendered.slice(0, MCP_ERROR_BODY_MAX_CHARS)}\n… body du refus tronqué (${rendered.length} caractères)`;
|
|
181
|
+
return mcpText(`${read.message}\n\n${body}`, true);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Une page de documentation, ou son PLAN quand elle est trop lourde.
|
|
185
|
+
*
|
|
186
|
+
* Le résumé générique ({@link summarize}) sait ramener une liste à son compte et un
|
|
187
|
+
* objet à ses clés ; sur une page de 78 ko il rendrait
|
|
188
|
+
* `keys: [slug, frontmatter, markdown]` et conseillerait « demande une branche
|
|
189
|
+
* précise » — une phrase qui ne désigne aucun geste possible. Le plan, lui, se lit
|
|
190
|
+
* en quelques centaines d'octets et nomme exactement ce qu'il faut redemander.
|
|
191
|
+
*
|
|
192
|
+
* @param data - ce que le producteur a rendu pour la page
|
|
193
|
+
* @param module - module interrogé, pour rédiger le geste suivant
|
|
194
|
+
* @param slug - page interrogée, idem
|
|
195
|
+
*/
|
|
196
|
+
function pageOrOutline(data, module, slug) {
|
|
197
|
+
const page = data;
|
|
198
|
+
const markdown = typeof page?.markdown === "string" ? page.markdown : null;
|
|
199
|
+
if (markdown === null || markdown.length <= 28e3) return data;
|
|
200
|
+
return {
|
|
201
|
+
...data,
|
|
202
|
+
markdown: void 0,
|
|
203
|
+
chars: markdown.length,
|
|
204
|
+
note: `cette page pèse ${markdown.length} caractères — voici son PLAN. Rappelle l'outil avec section: "<titre>" (module: "${module}", slug: "${slug}") pour n'obtenir que le passage utile.`,
|
|
205
|
+
outline: outlineMarkdown(markdown)
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Clé de module telle que le kernel la connaît, depuis un nom de package npm.
|
|
210
|
+
*
|
|
211
|
+
* Le graphe symbolique indexe par nom npm (`@nodefony/http`) ; le plan
|
|
212
|
+
* d'administration, lui, désigne les modules par leur clé courte (`http`), et
|
|
213
|
+
* le socle sous le nom logique `core` — son package réel s'appelant `nodefony`
|
|
214
|
+
* pour des raisons d'histoire. Deux vocabulaires pour une même chose : la
|
|
215
|
+
* traduction vit ICI, une fois, plutôt que dans chaque appelant.
|
|
216
|
+
*/
|
|
217
|
+
function moduleKey(packageName) {
|
|
218
|
+
if (packageName === "nodefony" || packageName === "@nodefony/core") return "core";
|
|
219
|
+
return packageName.replace(/^@nodefony\//u, "");
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Largeur maximale d'un résumé dans le catalogue d'administration.
|
|
223
|
+
*
|
|
224
|
+
* Le catalogue vaut par sa densité : soixante lignes qu'on parcourt d'un coup
|
|
225
|
+
* d'œil. Un résumé de trois phrases y ferait perdre la colonne de gauche — le
|
|
226
|
+
* chemin, c'est-à-dire la seule chose qu'on recopie ensuite.
|
|
227
|
+
*/
|
|
228
|
+
const CATALOG_SUMMARY_MAX = 96;
|
|
229
|
+
/** Largeur de la colonne des chemins, au-delà de laquelle on cesse d'aligner. */
|
|
230
|
+
const CATALOG_PATH_COLUMN = 34;
|
|
231
|
+
/**
|
|
232
|
+
* Budget du catalogue rendu, sous la borne générique de {@link mcpText}.
|
|
233
|
+
*
|
|
234
|
+
* 🔴 Il ne s'agit pas de politesse : au-delà de sa borne, `mcpText` remplace une
|
|
235
|
+
* CHAÎNE par une note générique — le résumé sait ramener une liste à son compte
|
|
236
|
+
* et un objet à ses clés, mais d'un texte il ne garde rien. Le catalogue
|
|
237
|
+
* disparaîtrait donc en entier, en conseillant « demande une branche précise »,
|
|
238
|
+
* un geste qui ne désigne rien ici. On borne nous-mêmes, en gardant des entrées
|
|
239
|
+
* ET en nommant les deux restrictions qui EXISTENT.
|
|
240
|
+
*/
|
|
241
|
+
const CATALOG_MAX_CHARS = 24e3;
|
|
242
|
+
/**
|
|
243
|
+
* Met le catalogue en forme pour un lecteur qui va s'en servir tout de suite.
|
|
244
|
+
*
|
|
245
|
+
* Texte plutôt que JSON, et ce n'est pas une question de goût : la même
|
|
246
|
+
* information sérialisée en objets indentés pèse environ trois fois plus, pour
|
|
247
|
+
* une porte dont l'unique raison d'être est de ne pas coûter de contexte. Le
|
|
248
|
+
* groupement par producteur porte la seule structure nécessaire — le producteur
|
|
249
|
+
* est le premier argument de l'appel qui suit.
|
|
250
|
+
*
|
|
251
|
+
* @param view - ce que le cœur a retenu, et ce qu'il a écarté.
|
|
252
|
+
* @returns le catalogue rendu, écarts annoncés.
|
|
253
|
+
*/
|
|
254
|
+
function renderAdminCatalog(view) {
|
|
255
|
+
const gaps = [];
|
|
256
|
+
if (view.mutations > 0) gaps.push(`${view.mutations} mutations (POST/PATCH/DELETE — cette porte ne fait que LIRE)`);
|
|
257
|
+
if (view.selfService > 0) gaps.push(`${view.selfService} self-service liés à une session (« me », « sessions/mine ») — cette porte n'a pas d'utilisateur connecté`);
|
|
258
|
+
if (view.denied > 0) gaps.push(`${view.denied} hors des droits de ce jeton`);
|
|
259
|
+
if (view.filtered > 0) gaps.push(`${view.filtered} hors du filtre demandé`);
|
|
260
|
+
const lines = [`${view.entries.length} lectures appelables — sur ${view.total} endpoints déclarés par cette application.`, `Appel : nodefony_admin_call { namespace, path, params?, query? } — recopier « path » TEL QUEL, variables comprises.`];
|
|
261
|
+
if (gaps.length > 0) lines.push(`Non listés : ${gaps.join(" · ")}.`);
|
|
262
|
+
let namespace = null;
|
|
263
|
+
for (const entry of view.entries) {
|
|
264
|
+
if (entry.namespace !== namespace) {
|
|
265
|
+
namespace = entry.namespace;
|
|
266
|
+
const count = view.entries.filter((other) => other.namespace === namespace).length;
|
|
267
|
+
lines.push("", `## ${namespace} (${count})`);
|
|
268
|
+
}
|
|
269
|
+
const summary = entry.summary.length > CATALOG_SUMMARY_MAX ? `${entry.summary.slice(0, 95)}…` : entry.summary;
|
|
270
|
+
const suffix = summary === "" ? "" : ` ${summary}`;
|
|
271
|
+
lines.push(`${entry.path.padEnd(CATALOG_PATH_COLUMN)}${suffix}`.trimEnd());
|
|
272
|
+
const caps = [];
|
|
273
|
+
if (entry.page?.sortable.length) caps.push(`tri: ${entry.page.sortable.join(",")}`);
|
|
274
|
+
if (entry.page?.filters.length) caps.push(`filtres: ${entry.page.filters.join(",")}`);
|
|
275
|
+
if (entry.page?.search) caps.push("recherche q");
|
|
276
|
+
if (caps.length > 0) lines.push(`${" ".repeat(4)}${caps.join(" | ")}`);
|
|
277
|
+
}
|
|
278
|
+
if (view.entries.length === 0) lines.push("", "(aucune entrée ne répond à cette demande)");
|
|
279
|
+
const rendered = lines.join("\n");
|
|
280
|
+
if (rendered.length <= CATALOG_MAX_CHARS) return rendered;
|
|
281
|
+
const cut = rendered.slice(0, CATALOG_MAX_CHARS);
|
|
282
|
+
return `${cut.slice(0, cut.lastIndexOf("\n"))}\n\n… catalogue tronqué (${rendered.length} caractères pour ${view.entries.length} entrées). Rappelle l'outil avec namespace: "<producteur>" ou q: "<termes>" pour voir le reste.`;
|
|
283
|
+
}
|
|
284
|
+
function stringTable(value, field, arrays) {
|
|
285
|
+
if (value === void 0 || value === null) return {
|
|
286
|
+
ok: true,
|
|
287
|
+
value: {}
|
|
288
|
+
};
|
|
289
|
+
if (typeof value !== "object" || Array.isArray(value)) return {
|
|
290
|
+
ok: false,
|
|
291
|
+
why: `« ${field} » doit être un objet { clé: valeur }`
|
|
292
|
+
};
|
|
293
|
+
const table = {};
|
|
294
|
+
for (const [key, raw] of Object.entries(value)) {
|
|
295
|
+
if (typeof raw === "string") {
|
|
296
|
+
table[key] = raw;
|
|
297
|
+
continue;
|
|
298
|
+
}
|
|
299
|
+
if (typeof raw === "number" || typeof raw === "boolean") {
|
|
300
|
+
table[key] = String(raw);
|
|
301
|
+
continue;
|
|
302
|
+
}
|
|
303
|
+
if (arrays && Array.isArray(raw) && raw.every((item) => typeof item === "string")) {
|
|
304
|
+
table[key] = raw;
|
|
305
|
+
continue;
|
|
306
|
+
}
|
|
307
|
+
return {
|
|
308
|
+
ok: false,
|
|
309
|
+
why: `« ${field}.${key} » n'est pas une valeur transportable — attendu du texte${arrays ? " ou une liste de textes" : ""}`
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
return {
|
|
313
|
+
ok: true,
|
|
314
|
+
value: table
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
/** Préfixe des noms d'outils intégrés — un agent voit à qui il parle. */
|
|
318
|
+
const PREFIX = "nodefony_";
|
|
319
|
+
/**
|
|
320
|
+
* Forme admise pour un nom d'outil.
|
|
321
|
+
*
|
|
322
|
+
* Ce nom ne reste pas dans le serveur : il voyage jusque dans le contexte du
|
|
323
|
+
* modèle, et sert d'identifiant d'appel. Un nom porteur d'espace, de guillemet
|
|
324
|
+
* ou de saut de ligne ne provoque pas d'erreur — il produit des appels que rien
|
|
325
|
+
* ne résout, ce qui est bien pire à diagnostiquer. La borne haute est du même
|
|
326
|
+
* ordre : un nom de 4 000 caractères passerait, et mangerait le contexte.
|
|
327
|
+
*/
|
|
328
|
+
const NAME_PATTERN = /^[a-zA-Z0-9_-]{1,64}$/;
|
|
329
|
+
/**
|
|
330
|
+
* Clés des outils intégrés — ce que l'allowlist de configuration nomme.
|
|
331
|
+
*
|
|
332
|
+
* Publiée pour qu'un schéma de configuration puisse la valider au lieu de la
|
|
333
|
+
* retaper : une clé inconnue en config est silencieusement sans effet, et
|
|
334
|
+
* l'utilisateur croit avoir activé quelque chose.
|
|
335
|
+
*/
|
|
336
|
+
const BUILTIN_MCP_TOOL_KEYS = [
|
|
337
|
+
"inspect",
|
|
338
|
+
"card",
|
|
339
|
+
"check",
|
|
340
|
+
"symbols",
|
|
341
|
+
"docs",
|
|
342
|
+
"admin_list",
|
|
343
|
+
"admin_call"
|
|
344
|
+
];
|
|
345
|
+
/**
|
|
346
|
+
* Liste des sujets, rendue lisible pour la description de l'outil.
|
|
347
|
+
*
|
|
348
|
+
* Dérivée de {@link INSPECT_SUBJECTS} : ajouter un sujet au cœur le publie ici
|
|
349
|
+
* sans rien réécrire, et il ne peut pas exister de sujet annoncé qu'on ne
|
|
350
|
+
* saurait pas lire.
|
|
351
|
+
*/
|
|
352
|
+
function subjectLines() {
|
|
353
|
+
return Object.entries(INSPECT_SUBJECTS).map(([key, spec]) => `- \`${key}\` : ${spec.summary}`).join("\n");
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Catalogue intégré du framework, indexé par clé d'allowlist.
|
|
357
|
+
*
|
|
358
|
+
* Chaque handler capture ses dépendances par fermeture : c'est ce qui permet à
|
|
359
|
+
* ces quatre outils d'être des {@link IMcpTool} ordinaires, du même type que
|
|
360
|
+
* ceux d'une application — le serveur n'a plus aucun cas particulier à traiter.
|
|
361
|
+
*
|
|
362
|
+
* @param deps - briques qui répondent réellement
|
|
363
|
+
*/
|
|
364
|
+
function builtinMcpTools(deps) {
|
|
365
|
+
return {
|
|
366
|
+
inspect: {
|
|
367
|
+
name: `${PREFIX}inspect`,
|
|
368
|
+
description: `Lit l'état RÉEL de cette application Nodefony : les routes réellement montées, les modules chargés, les services enregistrés, la configuration effective et la provenance de chaque valeur, les stores de données, les entités de l'ORM. À utiliser avant d'écrire du code qui suppose une route, un service ou une clé de configuration — la réponse vient de l'application qui tourne, pas d'une lecture des sources, donc elle ne peut pas se tromper sur ce qui est chargé.
|
|
369
|
+
|
|
370
|
+
Sujets disponibles :\n${subjectLines()}`,
|
|
371
|
+
inputSchema: {
|
|
372
|
+
type: "object",
|
|
373
|
+
properties: {
|
|
374
|
+
subject: {
|
|
375
|
+
type: "string",
|
|
376
|
+
enum: Object.keys(INSPECT_SUBJECTS),
|
|
377
|
+
description: "Ce qu'on veut voir"
|
|
378
|
+
},
|
|
379
|
+
target: {
|
|
380
|
+
type: "string",
|
|
381
|
+
description: "Paramètre du sujet, quand il en attend un (ex. le nom d'un module pour `module`)"
|
|
382
|
+
}
|
|
383
|
+
},
|
|
384
|
+
required: ["subject"]
|
|
385
|
+
},
|
|
386
|
+
handler: async (args, caller) => {
|
|
387
|
+
const subject = typeof args.subject === "string" ? args.subject : "";
|
|
388
|
+
const target = typeof args.target === "string" ? args.target : void 0;
|
|
389
|
+
const read = await readAdminSubject(deps.broker, subject, adminCallerFromMcp(caller), target);
|
|
390
|
+
return read.ok ? mcpText(read.data) : mcpAdminFailure(read);
|
|
391
|
+
}
|
|
392
|
+
},
|
|
393
|
+
card: {
|
|
394
|
+
name: `${PREFIX}card`,
|
|
395
|
+
description: "Carte de visite de l'application : son identité, les modules chargés, où trouver la documentation, et les commandes à lancer. À utiliser en ARRIVANT sur une application inconnue, avant toute autre exploration — elle dit en un appel ce qu'il y a et où aller ensuite.",
|
|
396
|
+
inputSchema: {
|
|
397
|
+
type: "object",
|
|
398
|
+
properties: {}
|
|
399
|
+
},
|
|
400
|
+
handler: () => mcpText(deps.getCard())
|
|
401
|
+
},
|
|
402
|
+
check: {
|
|
403
|
+
name: `${PREFIX}check`,
|
|
404
|
+
description: "Diagnostic STATIQUE de l'application : classes écrites que rien n'enregistre (entité, controller ou service jamais câblé), paquets importés sans être déclarés, variables d'environnement requises absentes, modules du manifeste non installés, ports occupés, et le bilan du dernier démarrage. À utiliser APRÈS avoir écrit ou généré du code, avant de conclure que c'est fini : ni la compilation ni les tests ne voient qu'une classe n'est branchée à rien.",
|
|
405
|
+
inputSchema: {
|
|
406
|
+
type: "object",
|
|
407
|
+
properties: {}
|
|
408
|
+
},
|
|
409
|
+
handler: async () => {
|
|
410
|
+
const report = await collectDoctorReport(deps.projectRoot);
|
|
411
|
+
const total = countCheckFindings(report);
|
|
412
|
+
const skipped = skippedChecks(report.execution);
|
|
413
|
+
return mcpText({
|
|
414
|
+
verdict: total > 0 ? "manquements" : skipped.length > 0 ? "ok-mais-incomplet" : "ok",
|
|
415
|
+
total,
|
|
416
|
+
skipped,
|
|
417
|
+
...report
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
},
|
|
421
|
+
docs: {
|
|
422
|
+
name: `${PREFIX}docs`,
|
|
423
|
+
description: "Cherche et lit la DOCUMENTATION des modules installés — la prose écrite par leurs auteurs : concepts, recettes, pièges, exemples. À utiliser AVANT d'écrire du code qui utilise une brique du framework, et avant de conclure qu'une capacité n'existe pas. ⭐ Cette documentation vit sous `node_modules`, que les outils de recherche de fichiers EXCLUENT par défaut (dossier ignoré par git) : elle est livrée avec les paquets mais introuvable autrement qu'ici.\n\nSans argument : ce que l'application documente, module par module. Avec `query` : les pages qui portent tous les termes, avec leurs extraits. Avec `module` et `slug` : la page. Une page pèse souvent plus que ce qu'une réponse peut porter — demander alors `outline` pour son plan, puis `section` pour le seul passage utile.",
|
|
424
|
+
inputSchema: {
|
|
425
|
+
type: "object",
|
|
426
|
+
properties: {
|
|
427
|
+
query: {
|
|
428
|
+
type: "string",
|
|
429
|
+
description: "Texte cherché dans toute la documentation ; les espaces séparent des termes CUMULATIFS (`session redis` = les deux)"
|
|
430
|
+
},
|
|
431
|
+
module: {
|
|
432
|
+
type: "string",
|
|
433
|
+
description: "Module dont on veut la documentation (`http`, `security`, `core`…)"
|
|
434
|
+
},
|
|
435
|
+
slug: {
|
|
436
|
+
type: "string",
|
|
437
|
+
description: "Page à lire, telle que la recherche ou l'index la nomme"
|
|
438
|
+
},
|
|
439
|
+
section: {
|
|
440
|
+
type: "string",
|
|
441
|
+
description: "Titre de la seule section voulue (approchant suffit : sans accent, sans casse, sans emoji)"
|
|
442
|
+
},
|
|
443
|
+
outline: {
|
|
444
|
+
type: "boolean",
|
|
445
|
+
description: "Rendre le PLAN de la page au lieu de son body — le premier geste sur une page volumineuse"
|
|
446
|
+
},
|
|
447
|
+
limit: {
|
|
448
|
+
type: "integer",
|
|
449
|
+
description: "Nombre maximum de documents rendus par `query` (défaut 20)"
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
},
|
|
453
|
+
handler: async (args, caller) => {
|
|
454
|
+
const admin = adminCallerFromMcp(caller);
|
|
455
|
+
const module = typeof args.module === "string" ? args.module : "";
|
|
456
|
+
const slug = typeof args.slug === "string" ? args.slug : "";
|
|
457
|
+
const query = typeof args.query === "string" ? args.query.trim() : "";
|
|
458
|
+
const section = typeof args.section === "string" ? args.section : "";
|
|
459
|
+
if (module !== "" && slug !== "") {
|
|
460
|
+
const read = await callAdminEndpoint(deps.broker, {
|
|
461
|
+
namespace: "kernel",
|
|
462
|
+
path: "module/{name}/docs/{slug}",
|
|
463
|
+
params: {
|
|
464
|
+
name: module,
|
|
465
|
+
slug
|
|
466
|
+
},
|
|
467
|
+
query: section !== "" ? { section } : args.outline === true ? { outline: "1" } : {},
|
|
468
|
+
label: `${module}/${slug}`
|
|
469
|
+
}, admin);
|
|
470
|
+
if (!read.ok) return mcpAdminFailure(read);
|
|
471
|
+
return mcpText(pageOrOutline(read.data, module, slug));
|
|
472
|
+
}
|
|
473
|
+
if (query !== "") {
|
|
474
|
+
const limit = typeof args.limit === "number" && Number.isFinite(args.limit) ? Math.trunc(args.limit) : null;
|
|
475
|
+
const read = await callAdminEndpoint(deps.broker, {
|
|
476
|
+
namespace: "kernel",
|
|
477
|
+
path: "docs/search",
|
|
478
|
+
query: limit !== null && limit > 0 ? {
|
|
479
|
+
q: query,
|
|
480
|
+
limit: String(limit)
|
|
481
|
+
} : { q: query },
|
|
482
|
+
label: `recherche « ${query} »`
|
|
483
|
+
}, admin);
|
|
484
|
+
return read.ok ? mcpText(read.data) : mcpAdminFailure(read);
|
|
485
|
+
}
|
|
486
|
+
const read = module !== "" ? await callAdminEndpoint(deps.broker, {
|
|
487
|
+
namespace: "kernel",
|
|
488
|
+
path: "module/{name}/docs",
|
|
489
|
+
params: { name: module },
|
|
490
|
+
label: module
|
|
491
|
+
}, admin) : await callAdminEndpoint(deps.broker, {
|
|
492
|
+
namespace: "kernel",
|
|
493
|
+
path: "docs",
|
|
494
|
+
label: "documentation"
|
|
495
|
+
}, admin);
|
|
496
|
+
return read.ok ? mcpText(read.data) : mcpAdminFailure(read);
|
|
497
|
+
}
|
|
498
|
+
},
|
|
499
|
+
symbols: {
|
|
500
|
+
name: `${PREFIX}symbols`,
|
|
501
|
+
description: "Donne la SIGNATURE RÉELLE d'un symbole du framework — ses paramètres, ses types de retour, sa documentation — plus ce qu'il étend ou implémente et où il est défini. À utiliser AVANT d'appeler une classe, une interface ou une fonction du framework, plutôt que d'en deviner les arguments. ⭐ La déclaration est lue dans les types LIVRÉS du paquet installé (`node_modules`, que les outils de recherche de fichiers excluent) : c'est la version qui tourne vraiment, pas une supposition. Sans argument, rend le résumé du graphe ; avec `module`, la surface exportée d'un paquet.",
|
|
502
|
+
inputSchema: {
|
|
503
|
+
type: "object",
|
|
504
|
+
properties: {
|
|
505
|
+
name: {
|
|
506
|
+
type: "string",
|
|
507
|
+
description: "Nom exact du symbole (ex. `AbstractCrudService`, `IKernel`)"
|
|
508
|
+
},
|
|
509
|
+
module: {
|
|
510
|
+
type: "string",
|
|
511
|
+
description: "Paquet dont on veut la surface exportée (ex. `@nodefony/http`)"
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
},
|
|
515
|
+
handler: async (args, caller) => {
|
|
516
|
+
const graph = readSymbolsGraph(deps.projectRoot);
|
|
517
|
+
if (graph === null) return mcpText("aucun graphe symbolique atteignable — il est publié par le paquet `nodefony` (node_modules/nodefony/.ai/symbols.json) et régénérable dans ce dépôt par `npm run generate-symbols`", true);
|
|
518
|
+
const wanted = typeof args.name === "string" ? args.name : null;
|
|
519
|
+
const module = typeof args.module === "string" ? args.module : null;
|
|
520
|
+
if (wanted !== null) {
|
|
521
|
+
const sym = lookupSymbol(graph, wanted);
|
|
522
|
+
if (!sym) return mcpText(`« ${wanted} » est introuvable dans le graphe (${Object.keys(graph.symbols).length} symboles)`, true);
|
|
523
|
+
const declared = await callAdminEndpoint(deps.broker, {
|
|
524
|
+
namespace: "kernel",
|
|
525
|
+
path: "module/{name}/symbol/{symbol}",
|
|
526
|
+
params: {
|
|
527
|
+
name: moduleKey(sym.module),
|
|
528
|
+
symbol: sym.name
|
|
529
|
+
},
|
|
530
|
+
label: sym.name
|
|
531
|
+
}, adminCallerFromMcp(caller));
|
|
532
|
+
return mcpText(declared.ok ? {
|
|
533
|
+
...sym,
|
|
534
|
+
...declared.data
|
|
535
|
+
} : {
|
|
536
|
+
...sym,
|
|
537
|
+
declaration: null,
|
|
538
|
+
why: declared.message
|
|
539
|
+
});
|
|
540
|
+
}
|
|
541
|
+
const entries = Object.values(graph.symbols).filter((s) => module === null || s.module === module || moduleKey(s.module) === moduleKey(module));
|
|
542
|
+
if (module !== null) {
|
|
543
|
+
if (entries.length === 0) return mcpText(`aucun symbole pour « ${module} » — paquets présents dans le graphe : ${[...new Set(Object.values(graph.symbols).map((s) => s.module))].sort().join(", ")}`, true);
|
|
544
|
+
return mcpText(entries.sort((a, b) => a.name.localeCompare(b.name)));
|
|
545
|
+
}
|
|
546
|
+
const perPackage = Object.create(null);
|
|
547
|
+
for (const sym of entries) perPackage[sym.module] = (perPackage[sym.module] ?? 0) + 1;
|
|
548
|
+
return mcpText({
|
|
549
|
+
total: entries.length,
|
|
550
|
+
perPackage
|
|
551
|
+
});
|
|
552
|
+
}
|
|
553
|
+
},
|
|
554
|
+
admin_list: {
|
|
555
|
+
name: `${PREFIX}admin_list`,
|
|
556
|
+
description: "Catalogue des lectures d'ADMINISTRATION que cette application expose — bien au-delà des sujets de `nodefony_inspect` : journaux, sessions, comptes, clés d'API, webhooks, profileur, santé des connexions, entités, capacités de pagination. Chaque ligne est directement appelable par `nodefony_admin_call`. À utiliser dès que `nodefony_inspect` ne couvre pas ce qu'on cherche, plutôt que de supposer que la donnée n'existe pas.\n\nUn seul appel rend tout le catalogue ; `namespace` et `q` servent à le réduire quand on sait déjà ce qu'on cherche.",
|
|
557
|
+
inputSchema: {
|
|
558
|
+
type: "object",
|
|
559
|
+
properties: {
|
|
560
|
+
namespace: {
|
|
561
|
+
type: "string",
|
|
562
|
+
description: "Ne garder qu'un producteur (`kernel`, `http`, `security`, `syslog`, `user`, `orm`…)"
|
|
563
|
+
},
|
|
564
|
+
q: {
|
|
565
|
+
type: "string",
|
|
566
|
+
description: "Termes cherchés dans le chemin et le résumé ; les espaces séparent des termes CUMULATIFS (`session redis` = les deux)"
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
},
|
|
570
|
+
requiresAuth: true,
|
|
571
|
+
scopes: [ADMIN_SCOPE_READ],
|
|
572
|
+
handler: (args, caller) => mcpText(renderAdminCatalog(adminReadCatalog(deps.broker, adminCallerFromMcp(caller), {
|
|
573
|
+
namespace: typeof args.namespace === "string" ? args.namespace : void 0,
|
|
574
|
+
q: typeof args.q === "string" ? args.q : void 0
|
|
575
|
+
})))
|
|
576
|
+
},
|
|
577
|
+
admin_call: {
|
|
578
|
+
name: `${PREFIX}admin_call`,
|
|
579
|
+
description: "Appelle une lecture d'administration, telle que `nodefony_admin_list` la nomme. La réponse vient de l'application qui TOURNE — pas d'une lecture des sources — et elle est identique à ce que rendrait la console d'administration, redaction des secrets comprise.\n\nLECTURE seule : les mutations du plan (créer, modifier, supprimer) ne passent pas par ici. Recopier `namespace` et `path` tels quels ; `params` porte les variables du chemin (`module/{name}` → `{ name: \"http\" }`), `query` les paramètres de requête que l'endpoint accepte (pagination `page`/`limit`, tri `sort`, recherche `q`). Le catalogue publie, sous chaque entrée qui rend une liste, les tris et filtres RÉELLEMENT acceptés — tout le reste est refusé en 400, jamais ignoré.",
|
|
580
|
+
inputSchema: {
|
|
581
|
+
type: "object",
|
|
582
|
+
properties: {
|
|
583
|
+
namespace: {
|
|
584
|
+
type: "string",
|
|
585
|
+
description: "Producteur, tel que le catalogue le titre"
|
|
586
|
+
},
|
|
587
|
+
path: {
|
|
588
|
+
type: "string",
|
|
589
|
+
description: "Chemin, recopié TEL QUEL du catalogue (variables `{…}` comprises)"
|
|
590
|
+
},
|
|
591
|
+
params: {
|
|
592
|
+
type: "object",
|
|
593
|
+
description: "Valeurs des variables du chemin, par nom (`{ name: \"http\" }`)",
|
|
594
|
+
additionalProperties: { type: "string" }
|
|
595
|
+
},
|
|
596
|
+
query: {
|
|
597
|
+
type: "object",
|
|
598
|
+
description: "Paramètres de requête, comme une URL les porterait (`{ limit: \"20\" }`)"
|
|
599
|
+
}
|
|
600
|
+
},
|
|
601
|
+
required: ["namespace", "path"]
|
|
602
|
+
},
|
|
603
|
+
requiresAuth: true,
|
|
604
|
+
scopes: [ADMIN_SCOPE_READ],
|
|
605
|
+
handler: async (args, caller) => {
|
|
606
|
+
const admin = adminCallerFromMcp(caller);
|
|
607
|
+
const namespace = typeof args.namespace === "string" ? args.namespace.trim() : "";
|
|
608
|
+
const path = typeof args.path === "string" ? args.path.trim() : "";
|
|
609
|
+
if (namespace === "" || path === "") return mcpText("« namespace » et « path » sont requis — demande d'abord nodefony_admin_list, puis recopie les deux tels quels", true);
|
|
610
|
+
const entry = findAdminReadEntry(deps.broker, admin, namespace, path);
|
|
611
|
+
if (!entry) {
|
|
612
|
+
const proches = adminReadCatalog(deps.broker, admin, { namespace });
|
|
613
|
+
return mcpText(proches.entries.length === 0 ? `« ${namespace}/${path} » n'est pas appelable ici, et « ${namespace} » ne propose aucune lecture — soit ce module n'est pas chargé, soit ce jeton ne l'ouvre pas. nodefony_admin_list rend le catalogue réel.` : `« ${namespace}/${path} » n'est pas appelable ici. Chemins de « ${namespace} » : ${proches.entries.map((other) => other.path).join(", ")}`, true);
|
|
614
|
+
}
|
|
615
|
+
const params = stringTable(args.params, "params", false);
|
|
616
|
+
if (!params.ok) return mcpText(params.why, true);
|
|
617
|
+
const query = stringTable(args.query, "query", true);
|
|
618
|
+
if (!query.ok) return mcpText(query.why, true);
|
|
619
|
+
const missing = entry.params.filter((name) => typeof params.value[name] !== "string");
|
|
620
|
+
if (missing.length > 0) return mcpText(`« ${namespace}/${path} » attend ${missing.length > 1 ? "les variables" : "la variable"} ${missing.map((name) => `« ${name} »`).join(", ")} dans « params »`, true);
|
|
621
|
+
const read = await callAdminEndpoint(deps.broker, {
|
|
622
|
+
namespace,
|
|
623
|
+
path,
|
|
624
|
+
method: "GET",
|
|
625
|
+
params: params.value,
|
|
626
|
+
query: query.value,
|
|
627
|
+
label: `${namespace}/${path}`
|
|
628
|
+
}, admin);
|
|
629
|
+
return read.ok ? mcpText(read.data) : mcpAdminFailure(read);
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
};
|
|
633
|
+
}
|
|
634
|
+
/** Appelant anonyme — le défaut, et le seul défaut sûr. */
|
|
635
|
+
const ANONYMOUS = {
|
|
636
|
+
authenticated: false,
|
|
637
|
+
scopes: [],
|
|
638
|
+
roles: []
|
|
639
|
+
};
|
|
640
|
+
/**
|
|
641
|
+
* L'appelant satisfait-il ce que l'outil exige ?
|
|
642
|
+
*
|
|
643
|
+
* @returns `null` s'il passe, sinon le motif de la rétention
|
|
644
|
+
*/
|
|
645
|
+
/**
|
|
646
|
+
* Présente un appelant MCP au plan d'administration.
|
|
647
|
+
*
|
|
648
|
+
* Aucune décision ici : les rôles ont été posés par la porte, qui seule sait si
|
|
649
|
+
* elle est protégée et par qui. Cette fonction ne fait que TRADUIRE — et c'est
|
|
650
|
+
* volontaire : la traduction est le seul endroit où une identité pourrait se
|
|
651
|
+
* perdre, alors elle ne fait rien d'autre que la transporter.
|
|
652
|
+
*
|
|
653
|
+
* @param caller - l'appelant établi par la porte.
|
|
654
|
+
* @returns la même identité, dans le vocabulaire du plan d'administration.
|
|
655
|
+
*/
|
|
656
|
+
function adminCallerFromMcp(caller) {
|
|
657
|
+
return {
|
|
658
|
+
user: null,
|
|
659
|
+
roles: caller.roles,
|
|
660
|
+
label: caller.subject ? `le porteur « ${caller.subject} »` : caller.authenticated ? "un porteur authentifié" : "un appelant anonyme"
|
|
661
|
+
};
|
|
662
|
+
}
|
|
663
|
+
function withholdReason(tool, caller) {
|
|
664
|
+
const needsScopes = tool.scopes !== void 0 && tool.scopes.length > 0;
|
|
665
|
+
if (!needsScopes && tool.requiresAuth !== true) return null;
|
|
666
|
+
if (!caller.authenticated) {
|
|
667
|
+
const opened = needsScopes ? rolesFromScopes(tool.scopes) : [];
|
|
668
|
+
if (opened.length > 0 && opened.every((role) => caller.roles.includes(role))) return null;
|
|
669
|
+
return "exige une identité prouvée, l'appelant est anonyme";
|
|
670
|
+
}
|
|
671
|
+
if (!needsScopes) return null;
|
|
672
|
+
const missing = tool.scopes.filter((scope) => !caller.scopes.includes(scope));
|
|
673
|
+
return missing.length === 0 ? null : `scopes manquants : ${missing.join(", ")}`;
|
|
674
|
+
}
|
|
675
|
+
/**
|
|
676
|
+
* Énumère ce que cette application DÉCLARE : les intégrés autorisés, puis les
|
|
677
|
+
* outils des modules — sans rien retenir sur l'identité de qui que ce soit.
|
|
678
|
+
*
|
|
679
|
+
* Trois refus, tous énoncés par `onSkip` plutôt que silencieux :
|
|
680
|
+
* - **nom hors forme** ({@link NAME_PATTERN}) — il ne serait pas appelable ;
|
|
681
|
+
* - **collision** — le premier inscrit garde le nom, les intégrés passant en
|
|
682
|
+
* tête ; un module ne peut donc pas se substituer à `nodefony_inspect` et
|
|
683
|
+
* répondre à sa place ;
|
|
684
|
+
* - **déclaration en échec** — un `getMcpTools()` qui lève ne doit pas priver
|
|
685
|
+
* l'agent des outils de tous les autres modules.
|
|
686
|
+
*
|
|
687
|
+
* 🔴 **Ce que rend cette fonction n'est PAS servable tel quel** : elle contient
|
|
688
|
+
* les outils réservés. Toute porte passe par {@link collectMcpTools}, qui filtre
|
|
689
|
+
* sur l'appelant. Le seul usage légitime de la liste brute est de raisonner sur
|
|
690
|
+
* le CODE — ce que la porte EXIGE ({@link mcpDeclaredScopes}) — jamais de
|
|
691
|
+
* répondre à une requête.
|
|
692
|
+
*
|
|
693
|
+
* @param options - allowlist, dépendances, modules et journal des écarts
|
|
694
|
+
* @returns les outils déclarés, dans l'ordre où ils seraient publiés
|
|
695
|
+
*/
|
|
696
|
+
function declareMcpTools(options) {
|
|
697
|
+
const declared = [];
|
|
698
|
+
const seen = /* @__PURE__ */ new Set();
|
|
699
|
+
const add = (tool, origin) => {
|
|
700
|
+
if (typeof tool?.name !== "string" || !NAME_PATTERN.test(tool.name)) {
|
|
701
|
+
options.onSkip?.(`outil écarté (${origin}) : nom absent ou hors forme — attendu ${NAME_PATTERN.source}`);
|
|
702
|
+
return;
|
|
703
|
+
}
|
|
704
|
+
if (typeof tool.handler !== "function") {
|
|
705
|
+
options.onSkip?.(`outil « ${tool.name} » écarté (${origin}) : sans handler`);
|
|
706
|
+
return;
|
|
707
|
+
}
|
|
708
|
+
if (seen.has(tool.name)) {
|
|
709
|
+
options.onSkip?.(`outil « ${tool.name} » écarté (${origin}) : ce nom est déjà pris`);
|
|
710
|
+
return;
|
|
711
|
+
}
|
|
712
|
+
seen.add(tool.name);
|
|
713
|
+
declared.push(tool);
|
|
714
|
+
};
|
|
715
|
+
const builtin = builtinMcpTools(options.deps);
|
|
716
|
+
for (const key of options.builtins) if (Object.hasOwn(builtin, key)) add(builtin[key], "intégré");
|
|
717
|
+
for (const [name, module] of Object.entries(options.modules ?? {})) {
|
|
718
|
+
const declare = module?.getMcpTools;
|
|
719
|
+
if (typeof declare !== "function") continue;
|
|
720
|
+
let tools;
|
|
721
|
+
try {
|
|
722
|
+
tools = declare.call(module);
|
|
723
|
+
} catch (error) {
|
|
724
|
+
options.onSkip?.(`module « ${name} » : getMcpTools() a échoué — ${error.message}`);
|
|
725
|
+
continue;
|
|
726
|
+
}
|
|
727
|
+
if (!Array.isArray(tools)) {
|
|
728
|
+
options.onSkip?.(`module « ${name} » : getMcpTools() doit rendre un tableau`);
|
|
729
|
+
continue;
|
|
730
|
+
}
|
|
731
|
+
for (const tool of tools) add(tool, `module ${name}`);
|
|
732
|
+
}
|
|
733
|
+
return declared;
|
|
734
|
+
}
|
|
735
|
+
/**
|
|
736
|
+
* Ramasse les outils SERVIS à cet appelant.
|
|
737
|
+
*
|
|
738
|
+
* Aux trois refus de {@link declareMcpTools} s'ajoute une RÉTENTION, qui n'est
|
|
739
|
+
* pas une faute : un outil dont l'appelant ne satisfait pas les exigences
|
|
740
|
+
* ({@link IMcpTool.scopes}, {@link IMcpTool.requiresAuth}) ne sort pas d'ici.
|
|
741
|
+
* ⭐ **Filtrer À LA COLLECTE protège `tools/list` ET `tools/call` d'un seul
|
|
742
|
+
* geste** : le protocole ne reçoit que les outils servis, donc un outil retenu
|
|
743
|
+
* est « inconnu » pour lui — indistinguable d'un outil inexistant, ce qui ne
|
|
744
|
+
* révèle même pas son existence. Filtrer la liste sans filtrer l'appel n'aurait
|
|
745
|
+
* été qu'un rideau, et c'est l'erreur classique : deux points de décision, dont
|
|
746
|
+
* un qu'on oublie.
|
|
747
|
+
*
|
|
748
|
+
* @param options - allowlist, dépendances, modules, appelant et journaux
|
|
749
|
+
* @returns les outils exécutables, dans l'ordre où ils seront publiés
|
|
750
|
+
*/
|
|
751
|
+
function collectMcpTools(options) {
|
|
752
|
+
const caller = options.caller ?? ANONYMOUS;
|
|
753
|
+
const served = [];
|
|
754
|
+
for (const tool of declareMcpTools(options)) {
|
|
755
|
+
const withheld = withholdReason(tool, caller);
|
|
756
|
+
if (withheld !== null) {
|
|
757
|
+
options.onWithheld?.(tool.name, withheld);
|
|
758
|
+
continue;
|
|
759
|
+
}
|
|
760
|
+
served.push(tool);
|
|
761
|
+
}
|
|
762
|
+
return served;
|
|
763
|
+
}
|
|
764
|
+
/**
|
|
765
|
+
* Le vocabulaire de scopes que cette porte EXIGE — l'union de ce que ses outils
|
|
766
|
+
* déclarent, jamais une liste écrite à côté.
|
|
767
|
+
*
|
|
768
|
+
* 🔴 **C'est ce qu'un client doit demander**, et c'est à ce titre qu'il est
|
|
769
|
+
* publié (RFC 9728 `scopes_supported`) et nommé dans le défi (RFC 6750
|
|
770
|
+
* `scope`). Une liste de configuration disait autre chose que le code par
|
|
771
|
+
* simple oubli, dans les deux sens et sans qu'aucun contrôle ne l'aperçoive :
|
|
772
|
+
* un scope publié que rien n'exige envoie demander un droit qui n'ouvre rien ;
|
|
773
|
+
* un scope exigé que rien ne publie laisse le client deviner ce qu'on attend de
|
|
774
|
+
* lui — et un outil de module en était systématiquement là.
|
|
775
|
+
*
|
|
776
|
+
* L'énumération est délibérément celle des outils DÉCLARÉS, pas de ceux servis
|
|
777
|
+
* à un appelant : le document se lit avant d'avoir un jeton, et un catalogue
|
|
778
|
+
* filtré n'annoncerait à l'anonyme que ce dont il n'a pas besoin.
|
|
779
|
+
*
|
|
780
|
+
* @param options - allowlist, dépendances, modules et journal des écarts
|
|
781
|
+
* @returns les scopes, dédupliqués et triés ; vide si la porte n'exige rien
|
|
782
|
+
*/
|
|
783
|
+
function mcpDeclaredScopes(options) {
|
|
784
|
+
const vocabulaire = /* @__PURE__ */ new Set();
|
|
785
|
+
for (const tool of declareMcpTools(options)) for (const scope of tool.scopes ?? []) vocabulaire.add(scope);
|
|
786
|
+
return [...vocabulaire].sort();
|
|
787
|
+
}
|
|
788
|
+
/**
|
|
789
|
+
* Projette les outils pour `tools/list` — sans leur implémentation.
|
|
790
|
+
*
|
|
791
|
+
* Le `handler` est une fermeture sur l'état du serveur ; `JSON.stringify` le
|
|
792
|
+
* laisserait tomber en silence, mais compter là-dessus reviendrait à publier
|
|
793
|
+
* par accident ce qu'on ne publie pas exprès.
|
|
794
|
+
*/
|
|
795
|
+
function publishMcpTools(tools) {
|
|
796
|
+
return tools.map(({ name, description, inputSchema }) => ({
|
|
797
|
+
name,
|
|
798
|
+
description,
|
|
799
|
+
inputSchema
|
|
800
|
+
}));
|
|
801
|
+
}
|
|
802
|
+
/**
|
|
803
|
+
* Exécute un outil par son nom public.
|
|
804
|
+
*
|
|
805
|
+
* Un échec métier (sujet inconnu, module absent) rend un résultat `isError`,
|
|
806
|
+
* **pas** une erreur JSON-RPC : le protocole réserve celle-ci aux fautes de
|
|
807
|
+
* protocole. La distinction compte pour l'agent — une erreur de protocole
|
|
808
|
+
* signifie « tu t'y prends mal », un `isError` signifie « ta demande est
|
|
809
|
+
* recevable, voici pourquoi elle n'aboutit pas » ; c'est la seconde qu'il peut
|
|
810
|
+
* corriger seul.
|
|
811
|
+
*
|
|
812
|
+
* ⭐ **Aucun contrôle d'autorisation ici, et c'est voulu** : `tools` ne contient
|
|
813
|
+
* que ce que {@link collectMcpTools} a servi à CET appelant. Refaire la
|
|
814
|
+
* vérification à ce niveau créerait un second point de décision — deux copies
|
|
815
|
+
* d'une même règle, qui divergent en silence. Le corollaire tient en une
|
|
816
|
+
* phrase : **ne jamais passer ici une liste non filtrée.**
|
|
817
|
+
*
|
|
818
|
+
* @param name - nom public de l'outil (`nodefony_inspect`…)
|
|
819
|
+
* @param args - arguments fournis par l'agent
|
|
820
|
+
* @param tools - outils servis, tels que {@link collectMcpTools} les a ramassés
|
|
821
|
+
* @param caller - appelant établi, transmis au handler (anonyme par défaut)
|
|
822
|
+
* @returns le résultat de l'outil, ou `null` si le nom n'est pas exposé
|
|
823
|
+
*/
|
|
824
|
+
async function callMcpTool(name, args, tools, caller = ANONYMOUS) {
|
|
825
|
+
const tool = tools.find((candidate) => candidate.name === name);
|
|
826
|
+
if (!tool) return null;
|
|
827
|
+
const refusal = unknownArguments(tool, args);
|
|
828
|
+
if (refusal !== null) return mcpText(refusal, true);
|
|
829
|
+
return tool.handler(args, caller);
|
|
830
|
+
}
|
|
831
|
+
/**
|
|
832
|
+
* Arguments que l'outil ne déclare pas — refusés, jamais ignorés.
|
|
833
|
+
*
|
|
834
|
+
* ⚠️ Un paramètre accepté puis jeté est pire qu'un refus : la réponse a l'air
|
|
835
|
+
* d'avoir honoré la demande. Vécu sur cette porte — un `limit` passé à la
|
|
836
|
+
* recherche documentaire revenait avec vingt résultats, sans un mot, et
|
|
837
|
+
* l'appelant en concluait que la borne ne marchait pas plutôt que de voir
|
|
838
|
+
* qu'elle n'avait jamais été transmise. Le même silence accueillait une clé
|
|
839
|
+
* mal orthographiée : l'outil répondait comme si de rien n'était.
|
|
840
|
+
*
|
|
841
|
+
* La garde vit ICI, une fois, plutôt que dans chaque handler — et elle
|
|
842
|
+
* s'applique donc aussi aux outils qu'une application déclare. Un outil qui
|
|
843
|
+
* veut réellement des arguments libres l'écrit dans son schéma
|
|
844
|
+
* (`additionalProperties: true`), ce qui en fait un choix relu, pas un défaut.
|
|
845
|
+
*
|
|
846
|
+
* @param tool - l'outil visé, avec son schéma d'entrée.
|
|
847
|
+
* @param args - ce que l'agent a passé.
|
|
848
|
+
* @returns le message de refus, ou `null` si tout est déclaré.
|
|
849
|
+
*/
|
|
850
|
+
function unknownArguments(tool, args) {
|
|
851
|
+
const schema = tool.inputSchema;
|
|
852
|
+
if (schema?.additionalProperties === true) return null;
|
|
853
|
+
const declared = schema?.properties;
|
|
854
|
+
if (!declared || typeof declared !== "object") return null;
|
|
855
|
+
const intruders = Object.keys(args).filter((key) => !Object.hasOwn(declared, key));
|
|
856
|
+
if (intruders.length === 0) return null;
|
|
857
|
+
const known = Object.keys(declared);
|
|
858
|
+
return `« ${tool.name} » ne connaît pas ${intruders.map((c) => `« ${c} »`).join(", ")}. ` + (known.length > 0 ? `Arguments acceptés : ${known.join(", ")}.` : "Cet outil ne prend aucun argument.");
|
|
859
|
+
}
|
|
860
|
+
//#endregion
|
|
861
|
+
export { BUILTIN_MCP_TOOL_KEYS, builtinMcpTools, callMcpTool, collectMcpTools, declareMcpTools, mcpDeclaredScopes, mcpText, publishMcpTools };
|