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.
Files changed (903) hide show
  1. package/.ai/symbols.json +36135 -0
  2. package/LICENSE +544 -0
  3. package/README.md +316 -694
  4. package/bin/nodefony +2183 -85
  5. package/dist/client/Container.js +367 -0
  6. package/dist/client/Event.js +198 -0
  7. package/dist/client/Service.js +344 -0
  8. package/dist/client/Tools.js +162 -0
  9. package/dist/client/client/ClientKernel.js +276 -0
  10. package/dist/client/client/angular/index.js +352 -0
  11. package/dist/client/client/announce.js +212 -0
  12. package/dist/client/client/debugbar/DebugBar.js +1624 -0
  13. package/dist/client/client/debugbar/format.js +103 -0
  14. package/dist/client/client/debugbar/hmr.js +37 -0
  15. package/dist/client/client/debugbar/index.js +29 -0
  16. package/dist/client/client/debugbar/model.js +133 -0
  17. package/dist/client/client/debugbar/network.js +173 -0
  18. package/dist/client/client/debugbar/profile.js +114 -0
  19. package/dist/client/client/index.js +34 -0
  20. package/dist/client/client/react/index.js +268 -0
  21. package/dist/client/client/realtime/AdaptiveRate.js +240 -0
  22. package/dist/client/client/realtime/BrowserWsTransport.js +57 -0
  23. package/dist/client/client/realtime/RealtimeClient.js +898 -0
  24. package/dist/client/client/realtime/localEvents.js +56 -0
  25. package/dist/client/client/realtime/notice.js +125 -0
  26. package/dist/client/client/realtime/observe.js +280 -0
  27. package/dist/client/client/roles/index.js +3 -0
  28. package/dist/client/client/roles/registry.js +97 -0
  29. package/dist/client/client/roles/roles.js +91 -0
  30. package/dist/client/client/shim/events.js +88 -0
  31. package/dist/client/client/shim/util.js +20 -0
  32. package/dist/client/client/svelte/index.js +319 -0
  33. package/dist/client/client/syslog/context.js +122 -0
  34. package/dist/client/client/syslog/errors.js +49 -0
  35. package/dist/client/client/syslog/uplink.js +106 -0
  36. package/dist/client/client/vue/index.js +321 -0
  37. package/dist/client/colors.js +63 -0
  38. package/dist/client/debugbar.standalone.js +4274 -0
  39. package/dist/client/realtime/IRealtimeTransport.js +32 -0
  40. package/dist/client/realtime/JsonRpcPeer.js +251 -0
  41. package/dist/client/realtime/channelRate.js +39 -0
  42. package/dist/client/realtime/platformChannels.js +155 -0
  43. package/dist/client/syslog/Pdu.js +224 -0
  44. package/dist/client/syslog/Syslog.js +1159 -0
  45. package/dist/client/syslog/drivers/pduFlow.js +106 -0
  46. package/dist/client/syslog/drivers/pduProtocol.js +28 -0
  47. package/dist/client/syslog/logColor.js +80 -0
  48. package/dist/client/types/src/Container.d.ts +221 -0
  49. package/dist/client/types/src/Event.d.ts +171 -0
  50. package/dist/client/types/src/FileClass.d.ts +184 -0
  51. package/dist/client/types/src/Service.d.ts +165 -0
  52. package/dist/client/types/src/Tools.d.ts +116 -0
  53. package/dist/client/types/src/client/ClientKernel.d.ts +90 -0
  54. package/dist/client/types/src/client/IClientKernel.d.ts +195 -0
  55. package/dist/client/types/src/client/angular/index.d.ts +273 -0
  56. package/dist/client/types/src/client/announce.d.ts +74 -0
  57. package/dist/client/types/src/client/debugbar/DebugBar.d.ts +279 -0
  58. package/dist/client/types/src/client/debugbar/format.d.ts +48 -0
  59. package/dist/client/types/src/client/debugbar/hmr.d.ts +16 -0
  60. package/dist/client/types/src/client/debugbar/index.d.ts +30 -0
  61. package/dist/client/types/src/client/debugbar/model.d.ts +158 -0
  62. package/dist/client/types/src/client/debugbar/network.d.ts +55 -0
  63. package/dist/client/types/src/client/debugbar/profile.d.ts +99 -0
  64. package/dist/client/types/src/client/index.d.ts +47 -0
  65. package/dist/client/types/src/client/react/index.d.ts +207 -0
  66. package/dist/client/types/src/client/realtime/AdaptiveRate.d.ts +138 -0
  67. package/dist/client/types/src/client/realtime/BrowserWsTransport.d.ts +27 -0
  68. package/dist/client/types/src/client/realtime/RealtimeClient.d.ts +573 -0
  69. package/dist/client/types/src/client/realtime/localEvents.d.ts +53 -0
  70. package/dist/client/types/src/client/realtime/notice.d.ts +70 -0
  71. package/dist/client/types/src/client/realtime/observe.d.ts +284 -0
  72. package/dist/client/types/src/client/roles/index.d.ts +15 -0
  73. package/dist/client/types/src/client/roles/registry.d.ts +72 -0
  74. package/dist/client/types/src/client/roles/roles.d.ts +68 -0
  75. package/dist/client/types/src/client/shim/cli-color.d.ts +2 -0
  76. package/dist/client/types/src/client/shim/events.d.ts +39 -0
  77. package/dist/client/types/src/client/shim/util.d.ts +14 -0
  78. package/dist/client/types/src/client/svelte/index.d.ts +216 -0
  79. package/dist/client/types/src/client/syslog/context.d.ts +76 -0
  80. package/dist/client/types/src/client/syslog/errors.d.ts +46 -0
  81. package/dist/client/types/src/client/syslog/uplink.d.ts +89 -0
  82. package/dist/client/types/src/client/transport/websocket.d.ts +5 -0
  83. package/dist/client/types/src/client/vue/index.d.ts +234 -0
  84. package/dist/client/types/src/colors.d.ts +32 -0
  85. package/dist/client/types/src/config/infra.d.ts +171 -0
  86. package/dist/client/types/src/kernel/bootReport.d.ts +112 -0
  87. package/dist/client/types/src/kernel/readinessRegistry.d.ts +104 -0
  88. package/dist/client/types/src/realtime/IRealtimeSocket.d.ts +142 -0
  89. package/dist/client/types/src/realtime/IRealtimeTransport.d.ts +50 -0
  90. package/dist/client/types/src/realtime/JsonRpcPeer.d.ts +251 -0
  91. package/dist/client/types/src/realtime/RealtimeEventMap.d.ts +269 -0
  92. package/dist/client/types/src/realtime/channelRate.d.ts +55 -0
  93. package/dist/client/types/src/realtime/platformChannels.d.ts +147 -0
  94. package/dist/client/types/src/syslog/Pdu.d.ts +134 -0
  95. package/dist/client/types/src/syslog/Syslog.d.ts +482 -0
  96. package/dist/client/types/src/syslog/drivers/ILogDriver.d.ts +177 -0
  97. package/dist/client/types/src/syslog/drivers/pduFlow.d.ts +53 -0
  98. package/dist/client/types/src/syslog/drivers/pduProtocol.d.ts +20 -0
  99. package/dist/client/types/src/syslog/logColor.d.ts +59 -0
  100. package/dist/client/types/src/types/ICliKernel.d.ts +28 -0
  101. package/dist/client/types/src/types/ICommand.d.ts +14 -0
  102. package/dist/client/types/src/types/IContainer.d.ts +35 -0
  103. package/dist/client/types/src/types/IKernel.d.ts +138 -0
  104. package/dist/client/types/src/types/IMcpTool.d.ts +157 -0
  105. package/dist/client/types/src/types/IModule.d.ts +73 -0
  106. package/dist/client/types/src/types/IPage.d.ts +119 -0
  107. package/dist/client/types/src/types/IService.d.ts +62 -0
  108. package/dist/client/types/src/types/ISyslog.d.ts +58 -0
  109. package/dist/client/types/src/types/ITransport.d.ts +5 -0
  110. package/dist/client/types/src/types/globals.d.ts +47 -0
  111. package/dist/node/Cli.js +750 -0
  112. package/dist/node/Container.js +367 -0
  113. package/dist/node/Error.js +309 -0
  114. package/dist/node/Event.js +198 -0
  115. package/dist/node/FileClass.js +308 -0
  116. package/dist/node/Nodefony.js +78 -0
  117. package/dist/node/Service.js +344 -0
  118. package/dist/node/Tools.js +205 -0
  119. package/dist/node/bin/resolveLocalCli.js +10 -0
  120. package/dist/node/bundler/index.js +103 -0
  121. package/dist/node/cli/agentTargets.js +461 -0
  122. package/dist/node/cli/aiMcp.js +553 -0
  123. package/dist/node/cli/aiMcpReport.js +129 -0
  124. package/dist/node/cli/aiSync.js +323 -0
  125. package/dist/node/cli/aiSyncReport.js +142 -0
  126. package/dist/node/cli/card.js +186 -0
  127. package/dist/node/cli/cardReport.js +110 -0
  128. package/dist/node/cli/completion.js +415 -0
  129. package/dist/node/cli/create.js +805 -0
  130. package/dist/node/cli/env.js +332 -0
  131. package/dist/node/cli/envReport.js +159 -0
  132. package/dist/node/cli/execPortable.js +60 -0
  133. package/dist/node/cli/gitHooks.js +191 -0
  134. package/dist/node/cli/gitHooksReport.js +119 -0
  135. package/dist/node/cli/globalFlags.js +67 -0
  136. package/dist/node/cli/helpReport.js +288 -0
  137. package/dist/node/cli/manPage.js +165 -0
  138. package/dist/node/cli/nodefonyBin.js +61 -0
  139. package/dist/node/cli/outdated.js +144 -0
  140. package/dist/node/cli/progress.js +555 -0
  141. package/dist/node/cli/projectRoot.js +32 -0
  142. package/dist/node/cli/promptPassword.js +44 -0
  143. package/dist/node/cli/prompts.js +86 -0
  144. package/dist/node/cli/scaffold/destination.js +92 -0
  145. package/dist/node/cli/scaffold/engine.js +2156 -0
  146. package/dist/node/cli/scaffold/entityFields.js +589 -0
  147. package/dist/node/cli/scaffold/format.js +243 -0
  148. package/dist/node/cli/scaffold/interactive.js +124 -0
  149. package/dist/node/cli/scaffold/moduleLayout.js +38 -0
  150. package/dist/node/cli/scaffold/reservedEntities.js +74 -0
  151. package/dist/node/cli/scaffold/spec.js +704 -0
  152. package/dist/node/cli/scaffold/steps.js +40 -0
  153. package/dist/node/cli/scaffold/userContractSource.js +133 -0
  154. package/dist/node/cli/scaffold/versions.js +57 -0
  155. package/dist/node/cli/scaffold/writer.js +172 -0
  156. package/dist/node/cli/startMenu.js +496 -0
  157. package/dist/node/cli/symbols.js +205 -0
  158. package/dist/node/cli/sysexits.js +34 -0
  159. package/dist/node/cli/tableReport.js +184 -0
  160. package/dist/node/cli/usageReport.js +144 -0
  161. package/dist/node/colors.js +63 -0
  162. package/dist/node/command/Builder.js +153 -0
  163. package/dist/node/command/Command.js +348 -0
  164. package/dist/node/config/configProvenance.js +101 -0
  165. package/dist/node/config/defaults.js +39 -0
  166. package/dist/node/config/defineConfig.js +129 -0
  167. package/dist/node/config/defineEnv.js +264 -0
  168. package/dist/node/config/envExample.js +41 -0
  169. package/dist/node/config/envOverride.js +423 -0
  170. package/dist/node/config/infra.js +163 -0
  171. package/dist/node/config/reactivity.js +23 -0
  172. package/dist/node/config/reservedEnv.js +118 -0
  173. package/dist/node/config/schema.js +134 -0
  174. package/dist/node/config/use.js +24 -0
  175. package/dist/node/finder/File.js +49 -0
  176. package/dist/node/finder/FileResult.js +86 -0
  177. package/dist/node/finder/Finder.js +201 -0
  178. package/dist/node/finder/Result.js +45 -0
  179. package/dist/node/index.js +121 -0
  180. package/dist/node/kernel/BootConfigurationError.js +54 -0
  181. package/dist/node/kernel/CliKernel.js +630 -0
  182. package/dist/node/kernel/Kernel.js +2198 -0
  183. package/dist/node/kernel/Module.js +453 -0
  184. package/dist/node/kernel/adminPlane/adminCaller.js +98 -0
  185. package/dist/node/kernel/adminPlane/adminRbac.js +51 -0
  186. package/dist/node/kernel/adminPlane/catalog.js +158 -0
  187. package/dist/node/kernel/adminPlane/executeAdmin.js +78 -0
  188. package/dist/node/kernel/checks/deep.js +335 -0
  189. package/dist/node/kernel/checks/freshness.js +139 -0
  190. package/dist/node/kernel/checks/gating.js +231 -0
  191. package/dist/node/kernel/checks/guards.js +232 -0
  192. package/dist/node/kernel/checks/lastBoot.js +136 -0
  193. package/dist/node/kernel/checks/live.js +330 -0
  194. package/dist/node/kernel/checks/packageDeps.js +292 -0
  195. package/dist/node/kernel/checks/readiness.js +153 -0
  196. package/dist/node/kernel/checks/renderReport.js +780 -0
  197. package/dist/node/kernel/checks/report.js +421 -0
  198. package/dist/node/kernel/checks/runDoctor.js +731 -0
  199. package/dist/node/kernel/checks/surface.js +364 -0
  200. package/dist/node/kernel/checks/walk.js +100 -0
  201. package/dist/node/kernel/checks/wiring.js +450 -0
  202. package/dist/node/kernel/commands/AiMcpCommand.js +65 -0
  203. package/dist/node/kernel/commands/AiSyncCommand.js +48 -0
  204. package/dist/node/kernel/commands/BuildCommand.js +49 -0
  205. package/dist/node/kernel/commands/CardCommand.js +50 -0
  206. package/dist/node/kernel/commands/ClusterCommand.js +58 -0
  207. package/dist/node/kernel/commands/CompletionCommand.js +31 -0
  208. package/dist/node/kernel/commands/CreateCommand.js +45 -0
  209. package/dist/node/kernel/commands/DevCommand.js +99 -0
  210. package/dist/node/kernel/commands/DoctorCommand.js +115 -0
  211. package/dist/node/kernel/commands/EnvCommand.js +52 -0
  212. package/dist/node/kernel/commands/GitHooksCommand.js +47 -0
  213. package/dist/node/kernel/commands/InspectCommand.js +153 -0
  214. package/dist/node/kernel/commands/InstallCommand.js +20 -0
  215. package/dist/node/kernel/commands/MenuCommand.js +261 -0
  216. package/dist/node/kernel/commands/OutdatedCommand.js +164 -0
  217. package/dist/node/kernel/commands/ProdCommand.js +60 -0
  218. package/dist/node/kernel/commands/StatusCommand.js +30 -0
  219. package/dist/node/kernel/commands/StopCommand.js +35 -0
  220. package/dist/node/kernel/commands/SymbolsCommand.js +45 -0
  221. package/dist/node/kernel/commands/runtimeLauncher.js +95 -0
  222. package/dist/node/kernel/decorators/kernelDecorator.js +110 -0
  223. package/dist/node/kernel/injector/injector.js +137 -0
  224. package/dist/node/kernel/injector/serviceOrder.js +106 -0
  225. package/dist/node/kernel/inspect/adminSubjects.js +194 -0
  226. package/dist/node/kernel/inspect/docOutline.js +86 -0
  227. package/dist/node/kernel/lifecycleTags.js +76 -0
  228. package/dist/node/kernel/moduleConfig.js +75 -0
  229. package/dist/node/kernel/moduleGating.js +68 -0
  230. package/dist/node/kernel/readinessRegistry.js +98 -0
  231. package/dist/node/kernel/resolveModuleEntry.js +61 -0
  232. package/dist/node/mcp/caller.js +40 -0
  233. package/dist/node/mcp/guard.js +51 -0
  234. package/dist/node/mcp/protocol.js +157 -0
  235. package/dist/node/mcp/server.js +216 -0
  236. package/dist/node/mcp/tools.js +861 -0
  237. package/dist/node/oauth/authorizationServer.js +221 -0
  238. package/dist/node/oauth/protectedResource.js +293 -0
  239. package/dist/node/package.js +4 -0
  240. package/dist/node/realtime/IRealtimeTransport.js +32 -0
  241. package/dist/node/realtime/JsonRpcPeer.js +251 -0
  242. package/dist/node/realtime/RealtimeEventMap.js +15 -0
  243. package/dist/node/realtime/channelRate.js +39 -0
  244. package/dist/node/realtime/platformChannels.js +155 -0
  245. package/dist/node/runtime/GcScheduler.js +92 -0
  246. package/dist/node/runtime/RequestContext.js +76 -0
  247. package/dist/node/runtime/bearer.js +84 -0
  248. package/dist/node/runtime/engineEnvironment.js +79 -0
  249. package/dist/node/runtime/loadEnv.js +105 -0
  250. package/dist/node/runtime/pageFacets.js +85 -0
  251. package/dist/node/runtime/pageFilters.js +103 -0
  252. package/dist/node/runtime/pageGuard.js +84 -0
  253. package/dist/node/runtime/pageQuery.js +160 -0
  254. package/dist/node/runtime/pageSort.js +114 -0
  255. package/dist/node/runtime/redact.js +43 -0
  256. package/dist/node/runtime/withTimeout.js +71 -0
  257. package/dist/node/service/cluster/ClusterManager.js +202 -0
  258. package/dist/node/service/cluster/ClusterProbeAggregator.js +120 -0
  259. package/dist/node/service/cluster/ClusterRelay.js +74 -0
  260. package/dist/node/service/cluster/clusterMaster.js +65 -0
  261. package/dist/node/service/cluster/clusterMessage.js +70 -0
  262. package/dist/node/service/cluster/cpuQuota.js +59 -0
  263. package/dist/node/service/cluster/instanceProbe.js +52 -0
  264. package/dist/node/service/cluster/podEnvironment.js +48 -0
  265. package/dist/node/service/cluster/processProbe.js +70 -0
  266. package/dist/node/service/cluster/richProcessProbe.js +115 -0
  267. package/dist/node/service/cluster/topology.js +71 -0
  268. package/dist/node/service/dev/BootReporter.js +490 -0
  269. package/dist/node/service/dev/DevSupervisor.js +1004 -0
  270. package/dist/node/service/dev/bootVerdict.js +158 -0
  271. package/dist/node/service/dev/detachedStart.js +372 -0
  272. package/dist/node/service/dev/devProcess.js +1137 -0
  273. package/dist/node/service/dev/devProjects.js +138 -0
  274. package/dist/node/service/dev/devStatusReport.js +395 -0
  275. package/dist/node/service/dev/devStop.js +263 -0
  276. package/dist/node/service/fetchService.js +35 -0
  277. package/dist/node/service/gitService.js +62 -0
  278. package/dist/node/syslog/Pdu.js +224 -0
  279. package/dist/node/syslog/Syslog.js +1159 -0
  280. package/dist/node/syslog/drivers/ClusterFileLogDriver.js +114 -0
  281. package/dist/node/syslog/drivers/FileLogDriver.js +127 -0
  282. package/dist/node/syslog/drivers/ILogDriver.js +26 -0
  283. package/dist/node/syslog/drivers/LokiLogDriver.js +144 -0
  284. package/dist/node/syslog/drivers/MemoryLogDriver.js +33 -0
  285. package/dist/node/syslog/drivers/OpenSearchLogDriver.js +159 -0
  286. package/dist/node/syslog/drivers/builtinLogDrivers.js +114 -0
  287. package/dist/node/syslog/drivers/filterPdus.js +71 -0
  288. package/dist/node/syslog/drivers/logDriverRegistry.js +83 -0
  289. package/dist/node/syslog/drivers/opensearchShared.js +17 -0
  290. package/dist/node/syslog/drivers/pduFlow.js +106 -0
  291. package/dist/node/syslog/drivers/pduProtocol.js +28 -0
  292. package/dist/node/syslog/httpFetch.js +43 -0
  293. package/dist/node/syslog/logColor.js +80 -0
  294. package/dist/node/syslog/sinks/FileSink.js +142 -0
  295. package/dist/node/syslog/transports/BatchingHttpTransport.js +98 -0
  296. package/dist/node/syslog/transports/ConsoleTransport.js +14 -0
  297. package/dist/node/syslog/transports/FileTransport.js +17 -0
  298. package/dist/node/syslog/transports/HttpTransport.js +44 -0
  299. package/dist/node/syslog/transports/LokiTransport.js +80 -0
  300. package/dist/node/syslog/transports/OpenSearchTransport.js +53 -0
  301. package/dist/node/syslog/transports/SyslogTransport.js +13 -0
  302. package/dist/node/syslog/transports/index.js +8 -0
  303. package/dist/node/testing/index.js +190 -0
  304. package/dist/types/Cli.d.ts +177 -0
  305. package/dist/types/Container.d.ts +221 -0
  306. package/dist/types/Error.d.ts +162 -0
  307. package/dist/types/Event.d.ts +171 -0
  308. package/dist/types/FileClass.d.ts +184 -0
  309. package/dist/types/Nodefony.d.ts +66 -0
  310. package/dist/types/Service.d.ts +165 -0
  311. package/dist/types/Tools.d.ts +116 -0
  312. package/dist/types/bin/resolveLocalCli.d.ts +49 -0
  313. package/dist/types/bundler/index.d.ts +66 -0
  314. package/dist/types/cli/agentTargets.d.ts +378 -0
  315. package/dist/types/cli/aiMcp.d.ts +239 -0
  316. package/dist/types/cli/aiMcpReport.d.ts +113 -0
  317. package/dist/types/cli/aiSync.d.ts +68 -0
  318. package/dist/types/cli/aiSyncReport.d.ts +149 -0
  319. package/dist/types/cli/card.d.ts +49 -0
  320. package/dist/types/cli/cardReport.d.ts +127 -0
  321. package/dist/types/cli/completion.d.ts +154 -0
  322. package/dist/types/cli/create.d.ts +177 -0
  323. package/dist/types/cli/env.d.ts +103 -0
  324. package/dist/types/cli/envReport.d.ts +153 -0
  325. package/dist/types/cli/execPortable.d.ts +54 -0
  326. package/dist/types/cli/gitHooks.d.ts +48 -0
  327. package/dist/types/cli/gitHooksReport.d.ts +101 -0
  328. package/dist/types/cli/globalFlags.d.ts +48 -0
  329. package/dist/types/cli/helpReport.d.ts +110 -0
  330. package/dist/types/cli/manPage.d.ts +21 -0
  331. package/dist/types/cli/nodefonyBin.d.ts +45 -0
  332. package/dist/types/cli/outdated.d.ts +119 -0
  333. package/dist/types/cli/progress.d.ts +349 -0
  334. package/dist/types/cli/projectRoot.d.ts +19 -0
  335. package/dist/types/cli/promptPassword.d.ts +22 -0
  336. package/dist/types/cli/prompts.d.ts +102 -0
  337. package/dist/types/cli/scaffold/destination.d.ts +70 -0
  338. package/dist/types/cli/scaffold/engine.d.ts +545 -0
  339. package/dist/types/cli/scaffold/entityFields.d.ts +238 -0
  340. package/dist/types/cli/scaffold/format.d.ts +78 -0
  341. package/dist/types/cli/scaffold/interactive.d.ts +11 -0
  342. package/dist/types/cli/scaffold/moduleLayout.d.ts +69 -0
  343. package/dist/types/cli/scaffold/reservedEntities.d.ts +49 -0
  344. package/dist/types/cli/scaffold/spec.d.ts +159 -0
  345. package/dist/types/cli/scaffold/steps.d.ts +24 -0
  346. package/dist/types/cli/scaffold/userContractSource.d.ts +86 -0
  347. package/dist/types/cli/scaffold/versions.d.ts +14 -0
  348. package/dist/types/cli/scaffold/writer.d.ts +100 -0
  349. package/dist/types/cli/startMenu.d.ts +195 -0
  350. package/dist/types/cli/symbols.d.ts +84 -0
  351. package/dist/types/cli/sysexits.d.ts +31 -0
  352. package/dist/types/cli/tableReport.d.ts +44 -0
  353. package/dist/types/cli/usageReport.d.ts +108 -0
  354. package/dist/types/client/ClientKernel.d.ts +90 -0
  355. package/dist/types/client/IClientKernel.d.ts +195 -0
  356. package/dist/types/client/angular/index.d.ts +273 -0
  357. package/dist/types/client/announce.d.ts +74 -0
  358. package/dist/types/client/debugbar/DebugBar.d.ts +279 -0
  359. package/dist/types/client/debugbar/format.d.ts +48 -0
  360. package/dist/types/client/debugbar/hmr.d.ts +16 -0
  361. package/dist/types/client/debugbar/index.d.ts +30 -0
  362. package/dist/types/client/debugbar/model.d.ts +158 -0
  363. package/dist/types/client/debugbar/network.d.ts +55 -0
  364. package/dist/types/client/debugbar/profile.d.ts +99 -0
  365. package/dist/types/client/index.d.ts +47 -0
  366. package/dist/types/client/react/index.d.ts +207 -0
  367. package/dist/types/client/realtime/AdaptiveRate.d.ts +138 -0
  368. package/dist/types/client/realtime/BrowserWsTransport.d.ts +27 -0
  369. package/dist/types/client/realtime/RealtimeClient.d.ts +573 -0
  370. package/dist/types/client/realtime/localEvents.d.ts +53 -0
  371. package/dist/types/client/realtime/notice.d.ts +70 -0
  372. package/dist/types/client/realtime/observe.d.ts +284 -0
  373. package/dist/types/client/roles/index.d.ts +15 -0
  374. package/dist/types/client/roles/registry.d.ts +72 -0
  375. package/dist/types/client/roles/roles.d.ts +68 -0
  376. package/dist/types/client/shim/cli-color.d.ts +2 -0
  377. package/dist/types/client/shim/events.d.ts +39 -0
  378. package/dist/types/client/shim/util.d.ts +14 -0
  379. package/dist/types/client/svelte/index.d.ts +216 -0
  380. package/dist/types/client/syslog/context.d.ts +76 -0
  381. package/dist/types/client/syslog/errors.d.ts +46 -0
  382. package/dist/types/client/syslog/uplink.d.ts +89 -0
  383. package/dist/types/client/transport/websocket.d.ts +5 -0
  384. package/dist/types/client/vue/index.d.ts +234 -0
  385. package/dist/types/colors.d.ts +32 -0
  386. package/dist/types/command/Builder.d.ts +47 -0
  387. package/dist/types/command/Command.d.ts +268 -0
  388. package/dist/types/config/configMeta.d.ts +53 -0
  389. package/dist/types/config/configProvenance.d.ts +58 -0
  390. package/dist/types/config/defaults.d.ts +33 -0
  391. package/dist/types/config/defineConfig.d.ts +70 -0
  392. package/dist/types/config/defineEnv.d.ts +170 -0
  393. package/dist/types/config/envExample.d.ts +23 -0
  394. package/dist/types/config/envOverride.d.ts +236 -0
  395. package/dist/types/config/index.d.ts +23 -0
  396. package/dist/types/config/infra.d.ts +171 -0
  397. package/dist/types/config/reactivity.d.ts +36 -0
  398. package/dist/types/config/reservedEnv.d.ts +145 -0
  399. package/dist/types/config/schema.d.ts +113 -0
  400. package/dist/types/config/types.d.ts +374 -0
  401. package/dist/types/config/use.d.ts +80 -0
  402. package/dist/types/finder/File.d.ts +26 -0
  403. package/dist/types/finder/FileResult.d.ts +14 -0
  404. package/dist/types/finder/Finder.d.ts +51 -0
  405. package/dist/types/finder/Result.d.ts +10 -0
  406. package/dist/types/index.d.ts +205 -0
  407. package/dist/types/kernel/BootConfigurationError.d.ts +50 -0
  408. package/dist/types/kernel/CliKernel.d.ts +289 -0
  409. package/dist/types/kernel/Kernel.d.ts +1255 -0
  410. package/dist/types/kernel/Module.d.ts +326 -0
  411. package/dist/types/kernel/adminPlane/adminCaller.d.ts +105 -0
  412. package/dist/types/kernel/adminPlane/adminRbac.d.ts +44 -0
  413. package/dist/types/kernel/adminPlane/catalog.d.ts +122 -0
  414. package/dist/types/kernel/adminPlane/executeAdmin.d.ts +99 -0
  415. package/dist/types/kernel/bootReport.d.ts +112 -0
  416. package/dist/types/kernel/checks/deep.d.ts +122 -0
  417. package/dist/types/kernel/checks/freshness.d.ts +49 -0
  418. package/dist/types/kernel/checks/gating.d.ts +134 -0
  419. package/dist/types/kernel/checks/guards.d.ts +57 -0
  420. package/dist/types/kernel/checks/lastBoot.d.ts +189 -0
  421. package/dist/types/kernel/checks/live.d.ts +110 -0
  422. package/dist/types/kernel/checks/packageDeps.d.ts +44 -0
  423. package/dist/types/kernel/checks/readiness.d.ts +97 -0
  424. package/dist/types/kernel/checks/renderReport.d.ts +107 -0
  425. package/dist/types/kernel/checks/report.d.ts +414 -0
  426. package/dist/types/kernel/checks/runDoctor.d.ts +361 -0
  427. package/dist/types/kernel/checks/surface.d.ts +148 -0
  428. package/dist/types/kernel/checks/walk.d.ts +45 -0
  429. package/dist/types/kernel/checks/wiring.d.ts +54 -0
  430. package/dist/types/kernel/commands/AiMcpCommand.d.ts +39 -0
  431. package/dist/types/kernel/commands/AiSyncCommand.d.ts +28 -0
  432. package/dist/types/kernel/commands/BuildCommand.d.ts +13 -0
  433. package/dist/types/kernel/commands/CardCommand.d.ts +34 -0
  434. package/dist/types/kernel/commands/ClusterCommand.d.ts +29 -0
  435. package/dist/types/kernel/commands/CompletionCommand.d.ts +17 -0
  436. package/dist/types/kernel/commands/CreateCommand.d.ts +16 -0
  437. package/dist/types/kernel/commands/DevCommand.d.ts +40 -0
  438. package/dist/types/kernel/commands/DoctorCommand.d.ts +55 -0
  439. package/dist/types/kernel/commands/EnvCommand.d.ts +35 -0
  440. package/dist/types/kernel/commands/GitHooksCommand.d.ts +27 -0
  441. package/dist/types/kernel/commands/InspectCommand.d.ts +59 -0
  442. package/dist/types/kernel/commands/InstallCommand.d.ts +7 -0
  443. package/dist/types/kernel/commands/MenuCommand.d.ts +58 -0
  444. package/dist/types/kernel/commands/OutdatedCommand.d.ts +47 -0
  445. package/dist/types/kernel/commands/ProdCommand.d.ts +29 -0
  446. package/dist/types/kernel/commands/StatusCommand.d.ts +17 -0
  447. package/dist/types/kernel/commands/StopCommand.d.ts +17 -0
  448. package/dist/types/kernel/commands/SymbolsCommand.d.ts +29 -0
  449. package/dist/types/kernel/commands/runtimeLauncher.d.ts +76 -0
  450. package/dist/types/kernel/decorators/kernelDecorator.d.ts +76 -0
  451. package/dist/types/kernel/injector/injector.d.ts +47 -0
  452. package/dist/types/kernel/injector/serviceOrder.d.ts +29 -0
  453. package/dist/types/kernel/inspect/adminSubjects.d.ts +169 -0
  454. package/dist/types/kernel/inspect/docOutline.d.ts +53 -0
  455. package/dist/types/kernel/lifecycleTags.d.ts +79 -0
  456. package/dist/types/kernel/moduleConfig.d.ts +35 -0
  457. package/dist/types/kernel/moduleGating.d.ts +78 -0
  458. package/dist/types/kernel/readinessRegistry.d.ts +104 -0
  459. package/dist/types/kernel/resolveModuleEntry.d.ts +46 -0
  460. package/dist/types/mcp/caller.d.ts +55 -0
  461. package/dist/types/mcp/guard.d.ts +66 -0
  462. package/dist/types/mcp/protocol.d.ts +163 -0
  463. package/dist/types/mcp/server.d.ts +70 -0
  464. package/dist/types/mcp/tools.d.ts +209 -0
  465. package/dist/types/oauth/authorizationServer.d.ts +204 -0
  466. package/dist/types/oauth/protectedResource.d.ts +339 -0
  467. package/dist/types/realtime/IRealtimeSocket.d.ts +142 -0
  468. package/dist/types/realtime/IRealtimeTransport.d.ts +50 -0
  469. package/dist/types/realtime/JsonRpcPeer.d.ts +251 -0
  470. package/dist/types/realtime/RealtimeEventMap.d.ts +269 -0
  471. package/dist/types/realtime/channelRate.d.ts +55 -0
  472. package/dist/types/realtime/platformChannels.d.ts +147 -0
  473. package/dist/types/runtime/GcScheduler.d.ts +96 -0
  474. package/dist/types/runtime/RequestContext.d.ts +152 -0
  475. package/dist/types/runtime/bearer.d.ts +88 -0
  476. package/dist/types/runtime/engineEnvironment.d.ts +115 -0
  477. package/dist/types/runtime/loadEnv.d.ts +86 -0
  478. package/dist/types/runtime/pageFacets.d.ts +104 -0
  479. package/dist/types/runtime/pageFilters.d.ts +139 -0
  480. package/dist/types/runtime/pageGuard.d.ts +78 -0
  481. package/dist/types/runtime/pageQuery.d.ts +138 -0
  482. package/dist/types/runtime/pageSort.d.ts +86 -0
  483. package/dist/types/runtime/redact.d.ts +27 -0
  484. package/dist/types/runtime/withTimeout.d.ts +51 -0
  485. package/dist/types/service/cluster/ClusterManager.d.ts +112 -0
  486. package/dist/types/service/cluster/ClusterProbeAggregator.d.ts +68 -0
  487. package/dist/types/service/cluster/ClusterRelay.d.ts +57 -0
  488. package/dist/types/service/cluster/clusterMaster.d.ts +40 -0
  489. package/dist/types/service/cluster/clusterMessage.d.ts +94 -0
  490. package/dist/types/service/cluster/cpuQuota.d.ts +37 -0
  491. package/dist/types/service/cluster/instanceProbe.d.ts +82 -0
  492. package/dist/types/service/cluster/podEnvironment.d.ts +35 -0
  493. package/dist/types/service/cluster/processProbe.d.ts +53 -0
  494. package/dist/types/service/cluster/richProcessProbe.d.ts +77 -0
  495. package/dist/types/service/cluster/topology.d.ts +64 -0
  496. package/dist/types/service/dev/BootReporter.d.ts +67 -0
  497. package/dist/types/service/dev/DevSupervisor.d.ts +117 -0
  498. package/dist/types/service/dev/bootVerdict.d.ts +99 -0
  499. package/dist/types/service/dev/detachedStart.d.ts +164 -0
  500. package/dist/types/service/dev/devProcess.d.ts +638 -0
  501. package/dist/types/service/dev/devProjects.d.ts +121 -0
  502. package/dist/types/service/dev/devStatusReport.d.ts +141 -0
  503. package/dist/types/service/dev/devStop.d.ts +57 -0
  504. package/dist/types/service/fetchService.d.ts +29 -0
  505. package/dist/types/service/gitService.d.ts +24 -0
  506. package/dist/types/syslog/Pdu.d.ts +134 -0
  507. package/dist/types/syslog/Syslog.d.ts +482 -0
  508. package/dist/types/syslog/drivers/ClusterFileLogDriver.d.ts +40 -0
  509. package/dist/types/syslog/drivers/FileLogDriver.d.ts +55 -0
  510. package/dist/types/syslog/drivers/ILogDriver.d.ts +177 -0
  511. package/dist/types/syslog/drivers/LokiLogDriver.d.ts +44 -0
  512. package/dist/types/syslog/drivers/MemoryLogDriver.d.ts +20 -0
  513. package/dist/types/syslog/drivers/OpenSearchLogDriver.d.ts +40 -0
  514. package/dist/types/syslog/drivers/builtinLogDrivers.d.ts +43 -0
  515. package/dist/types/syslog/drivers/filterPdus.d.ts +21 -0
  516. package/dist/types/syslog/drivers/logDriverRegistry.d.ts +100 -0
  517. package/dist/types/syslog/drivers/opensearchShared.d.ts +11 -0
  518. package/dist/types/syslog/drivers/pduFlow.d.ts +53 -0
  519. package/dist/types/syslog/drivers/pduProtocol.d.ts +20 -0
  520. package/dist/types/syslog/httpFetch.d.ts +48 -0
  521. package/dist/types/syslog/logColor.d.ts +59 -0
  522. package/dist/types/syslog/sinks/FileSink.d.ts +78 -0
  523. package/dist/types/syslog/transports/BatchingHttpTransport.d.ts +59 -0
  524. package/dist/types/syslog/transports/ConsoleTransport.d.ts +8 -0
  525. package/dist/types/syslog/transports/FileTransport.d.ts +13 -0
  526. package/dist/types/syslog/transports/HttpTransport.d.ts +15 -0
  527. package/dist/types/syslog/transports/LokiTransport.d.ts +45 -0
  528. package/dist/types/syslog/transports/OpenSearchTransport.d.ts +40 -0
  529. package/dist/types/syslog/transports/SyslogTransport.d.ts +9 -0
  530. package/dist/types/syslog/transports/index.d.ts +12 -0
  531. package/dist/types/testing/index.d.ts +197 -0
  532. package/dist/types/types/IAdminApi.d.ts +246 -0
  533. package/dist/types/types/ICliKernel.d.ts +28 -0
  534. package/dist/types/types/ICommand.d.ts +14 -0
  535. package/dist/types/types/IContainer.d.ts +35 -0
  536. package/dist/types/types/IIdempotencyStore.d.ts +159 -0
  537. package/dist/types/types/IKernel.d.ts +138 -0
  538. package/dist/types/types/IMcpTool.d.ts +157 -0
  539. package/dist/types/types/IModule.d.ts +73 -0
  540. package/dist/types/types/IModuleManifest.d.ts +49 -0
  541. package/dist/types/types/IPage.d.ts +119 -0
  542. package/dist/types/types/IService.d.ts +62 -0
  543. package/dist/types/types/ISyslog.d.ts +58 -0
  544. package/dist/types/types/ITransport.d.ts +5 -0
  545. package/dist/types/types/globals.d.ts +47 -0
  546. package/docs/angular-services.md +318 -0
  547. package/docs/catalogue.md +184 -0
  548. package/docs/cli.md +369 -0
  549. package/docs/client.md +616 -0
  550. package/docs/debugbar.md +218 -0
  551. package/docs/environnement.md +308 -0
  552. package/docs/index.md +388 -0
  553. package/docs/kernel.md +670 -0
  554. package/docs/progression.md +228 -0
  555. package/docs/react-hooks.md +686 -0
  556. package/docs/request-context.md +507 -0
  557. package/docs/service.md +590 -0
  558. package/docs/svelte-reactivite.md +293 -0
  559. package/docs/syslog.md +848 -0
  560. package/docs/testing.md +203 -0
  561. package/docs/vue-composables.md +255 -0
  562. package/man/nodefony.1 +152 -0
  563. package/package.json +163 -83
  564. package/templates/app/agents/AGENTS.md.tpl +967 -0
  565. package/templates/app/agents/POINTEUR.md.tpl +12 -0
  566. package/templates/app/base/Dockerfile.tpl +104 -0
  567. package/templates/app/base/README.md.tpl +314 -0
  568. package/templates/app/base/dockerignore.tpl +28 -0
  569. package/templates/app/base/env.ts.tpl +130 -0
  570. package/templates/app/base/gitattributes.tpl +28 -0
  571. package/templates/app/base/github/workflows/ci.yml.tpl +91 -0
  572. package/templates/app/base/gitignore.tpl +46 -0
  573. package/templates/app/base/gitlab-ci.yml.tpl +42 -0
  574. package/templates/app/base/index.ts.tpl +69 -0
  575. package/templates/app/base/nodefony.config.ts.tpl +342 -0
  576. package/templates/app/base/oxlintrc.json.tpl +127 -0
  577. package/templates/app/base/package.json.tpl +75 -0
  578. package/templates/app/base/prettierignore.tpl +24 -0
  579. package/templates/app/base/prettierrc.json.tpl +12 -0
  580. package/templates/app/base/rolldown.config.ts.tpl +8 -0
  581. package/templates/app/base/tests/config.test.ts.tpl +29 -0
  582. package/templates/app/base/tests/e2e.setup.ts.tpl +181 -0
  583. package/templates/app/base/tests/e2e.test.ts.tpl +105 -0
  584. package/templates/app/base/tests/migrations.e2e.test.ts.tpl +579 -0
  585. package/templates/app/base/tsconfig.json.tpl +47 -0
  586. package/templates/app/base/vitest.config.ts.tpl +88 -0
  587. package/templates/app/base/vitest.e2e.config.ts.tpl +39 -0
  588. package/templates/app/complete/compose.yaml.tpl +328 -0
  589. package/templates/app/complete/deploy/migrate-job.yaml.tpl +100 -0
  590. package/templates/app/complete/docker/db/init-nodefony-e2e.sql.tpl +30 -0
  591. package/templates/app/complete/docker/grafana/provisioning/datasources/loki.yaml.tpl +15 -0
  592. package/templates/app/complete/env.local.tpl +11 -0
  593. package/templates/app/complete/env.tpl +53 -0
  594. package/templates/app/complete/nodefony/entity/User.ts.tpl +69 -0
  595. package/templates/app/complete/nodefony/security/provisionUsers.ts.tpl +124 -0
  596. package/templates/app/complete/nodefony/service/AppBannerService.ts.tpl +98 -0
  597. package/templates/app/complete/nodefony/service/AppInfoService.ts.tpl +85 -0
  598. package/templates/app/frontend/angular/frontend/src/accent.css.tpl +34 -0
  599. package/templates/app/frontend/angular/frontend/src/app/app.component.ts.tpl +400 -0
  600. package/templates/app/frontend/react/frontend/src/App.tsx.tpl +421 -0
  601. package/templates/app/frontend/react/frontend/src/accent.css.tpl +30 -0
  602. package/templates/app/frontend/shared/frontend/src/brand.ts.tpl +3 -0
  603. package/templates/app/frontend/shared/frontend/src/showcase.css.tpl +224 -0
  604. package/templates/app/frontend/shared/nodefony/controllers/AppController.ts.tpl +45 -0
  605. package/templates/app/frontend/svelte/frontend/src/App.svelte.tpl +371 -0
  606. package/templates/app/frontend/svelte/frontend/src/accent.css.tpl +34 -0
  607. package/templates/app/frontend/vue/frontend/src/App.vue.tpl +367 -0
  608. package/templates/app/frontend/vue/frontend/src/accent.css.tpl +34 -0
  609. package/templates/app/home/nodefony/controllers/HomeController.ts.tpl +38 -0
  610. package/templates/command/nodefony/command/__NAME__.ts.tpl +132 -0
  611. package/templates/controller/duplex/nodefony/controllers/__NAME__.ts.tpl +188 -0
  612. package/templates/controller/example/nodefony/controllers/__NAME__.ts.tpl +348 -0
  613. package/templates/controller/hello/nodefony/controllers/__NAME__.ts.tpl +143 -0
  614. package/templates/controller/realtime/nodefony/controllers/__NAME__.ts.tpl +153 -0
  615. package/templates/controller/realtime/tests/__KEBAB__-realtime.test.ts.tpl +79 -0
  616. package/templates/controller/rest/nodefony/controllers/__NAME__.ts.tpl +159 -0
  617. package/templates/entity/base/nodefony/entity/__PASCAL__.schema.ts.tpl +31 -0
  618. package/templates/entity/base/nodefony/entity/__PASCAL__.ts.tpl +68 -0
  619. package/templates/entity/controller/nodefony/controllers/__PASCAL__Controller.ts.tpl +335 -0
  620. package/templates/entity/service/nodefony/service/__PASCAL__Service.ts.tpl +126 -0
  621. package/templates/entity/tests/tests/__KEBAB__.e2e.test.ts.tpl +358 -0
  622. package/templates/entity/tests/tests/__KEBAB__.test.ts.tpl +87 -0
  623. package/templates/front/angular/frontend/src/app/app.component.ts.tpl +30 -0
  624. package/templates/front/base/nodefony/controllers/__NAME__.ts.tpl +60 -0
  625. package/templates/front/react/frontend/src/App.tsx.tpl +26 -0
  626. package/templates/front/svelte/frontend/src/App.svelte.tpl +19 -0
  627. package/templates/front/vue/frontend/src/App.vue.tpl +23 -0
  628. package/templates/module/ai/AGENTS.md.tpl +71 -0
  629. package/templates/module/base/README.md.tpl +62 -0
  630. package/templates/module/base/docs/index.md.tpl +55 -0
  631. package/templates/module/base/index.ts.tpl +50 -0
  632. package/templates/module/base/nodefony/config/config.ts.tpl +60 -0
  633. package/templates/module/base/nodefony/config/defineModuleConfig.ts.tpl +55 -0
  634. package/templates/module/base/nodefony/src/errors/__PASCAL__Error.ts.tpl +20 -0
  635. package/templates/module/base/package.json.tpl +53 -0
  636. package/templates/module/base/rolldown.config.ts.tpl +14 -0
  637. package/templates/module/base/tests/__KEBAB__.test.ts.tpl +39 -0
  638. package/templates/module/base/tsconfig.json.tpl +42 -0
  639. package/templates/module/base/vitest.config.ts.tpl +27 -0
  640. package/templates/module/packages/CLAUDE.md.tpl +51 -0
  641. package/templates/module/packages/MEMORY.md.tpl +39 -0
  642. package/templates/module/packages/tsconfig.declarations.json.tpl +19 -0
  643. package/templates/module/packages/tsconfig.tests.json.tpl +11 -0
  644. package/templates/module/service/nodefony/interfaces/I__PASCAL__Service.ts.tpl +14 -0
  645. package/templates/module/service/nodefony/interfaces/index.ts.tpl +1 -0
  646. package/templates/module/service/nodefony/service/__PASCAL__Service.ts.tpl +116 -0
  647. package/templates/service/nodefony/interfaces/I__PASCAL__Service.ts.tpl +19 -0
  648. package/templates/service/nodefony/service/__PASCAL__Service.ts.tpl +136 -0
  649. package/templates/service/tests/__PASCAL__Service.test.ts.tpl +53 -0
  650. package/templates/shared/front-entry/angular/frontend/src/main.ts.tpl +17 -0
  651. package/templates/shared/front-entry/react/frontend/src/main.tsx.tpl +11 -0
  652. package/templates/shared/front-entry/svelte/frontend/src/main.ts.tpl +13 -0
  653. package/templates/shared/front-entry/vue/frontend/src/main.ts.tpl +12 -0
  654. package/templates/shared/front-registrar/nodefony/frontend/register__PASCAL__Entry.ts.tpl +40 -0
  655. package/templates/shared/front-shell/frontend/index.html.tpl +39 -0
  656. package/templates/shared/ng-app-tsconfig/frontend/tsconfig.app.json.tpl +18 -0
  657. package/templates/shared/svelte-shim/frontend/src/env.d.ts.tpl +12 -0
  658. package/templates/shared/vue-shim/frontend/src/env.d.ts.tpl +15 -0
  659. package/.yarnclean +0 -45
  660. package/CHANGELOG.md +0 -406
  661. package/autoloader.es6 +0 -253
  662. package/builder.es6 +0 -366
  663. package/cli/builder/bundles/bundle.js +0 -328
  664. package/cli/builder/bundles/controller.js +0 -73
  665. package/cli/builder/bundles/users-bundle/.yarnclean +0 -45
  666. package/cli/builder/bundles/users-bundle/Command/fixtureTask.js +0 -47
  667. package/cli/builder/bundles/users-bundle/Command/usersCommand.js +0 -105
  668. package/cli/builder/bundles/users-bundle/Entity/mongoose/userEntity.js +0 -168
  669. package/cli/builder/bundles/users-bundle/Entity/sequelize/userEntity.js +0 -231
  670. package/cli/builder/bundles/users-bundle/Fixtures/users.js +0 -117
  671. package/cli/builder/bundles/users-bundle/Fixtures/usersFixtures.js +0 -114
  672. package/cli/builder/bundles/users-bundle/Resources/config/config.js +0 -90
  673. package/cli/builder/bundles/users-bundle/Resources/config/routing.js +0 -17
  674. package/cli/builder/bundles/users-bundle/Resources/config/security.js +0 -96
  675. package/cli/builder/bundles/users-bundle/Resources/config/services.js +0 -7
  676. package/cli/builder/bundles/users-bundle/Resources/config/webpack/webpack.dev.config.js +0 -13
  677. package/cli/builder/bundles/users-bundle/Resources/config/webpack/webpack.prod.config.js +0 -31
  678. package/cli/builder/bundles/users-bundle/Resources/config/webpack.config.js +0 -146
  679. package/cli/builder/bundles/users-bundle/Resources/js/users.js +0 -153
  680. package/cli/builder/bundles/users-bundle/Resources/public/favicon.ico +0 -0
  681. package/cli/builder/bundles/users-bundle/Resources/public/images/users-logo.png +0 -0
  682. package/cli/builder/bundles/users-bundle/Resources/scss/awesome/font-awesome.config.js +0 -11
  683. package/cli/builder/bundles/users-bundle/Resources/scss/custom.scss +0 -23
  684. package/cli/builder/bundles/users-bundle/Resources/scss/users.scss +0 -59
  685. package/cli/builder/bundles/users-bundle/Resources/swagger/openapi/login.js +0 -235
  686. package/cli/builder/bundles/users-bundle/Resources/swagger/openapi/users.js +0 -232
  687. package/cli/builder/bundles/users-bundle/Resources/translations/login.en_en.yml +0 -14
  688. package/cli/builder/bundles/users-bundle/Resources/translations/login.fr_fr.yml +0 -14
  689. package/cli/builder/bundles/users-bundle/Resources/translations/users.en_en.yml +0 -35
  690. package/cli/builder/bundles/users-bundle/Resources/translations/users.fr_fr.yml +0 -36
  691. package/cli/builder/bundles/users-bundle/Resources/views/base.html.twig +0 -32
  692. package/cli/builder/bundles/users-bundle/Resources/views/footer.html.twig +0 -7
  693. package/cli/builder/bundles/users-bundle/Resources/views/header.html.twig +0 -90
  694. package/cli/builder/bundles/users-bundle/Resources/views/login/login.html.twig +0 -43
  695. package/cli/builder/bundles/users-bundle/Resources/views/users/createUser.html.twig +0 -296
  696. package/cli/builder/bundles/users-bundle/Resources/views/users/readUsers.html.twig +0 -94
  697. package/cli/builder/bundles/users-bundle/controller/api/graphql/graphqlController.js +0 -56
  698. package/cli/builder/bundles/users-bundle/controller/api/graphql/userResolver.js +0 -121
  699. package/cli/builder/bundles/users-bundle/controller/api/graphql/usertype.js +0 -58
  700. package/cli/builder/bundles/users-bundle/controller/api/openapi/loginApiController.js +0 -210
  701. package/cli/builder/bundles/users-bundle/controller/api/openapi/restUserController.js +0 -244
  702. package/cli/builder/bundles/users-bundle/controller/loginController.js +0 -91
  703. package/cli/builder/bundles/users-bundle/controller/usersController.js +0 -332
  704. package/cli/builder/bundles/users-bundle/package.json +0 -58
  705. package/cli/builder/bundles/users-bundle/readme.md +0 -360
  706. package/cli/builder/bundles/users-bundle/services/usersService.js +0 -411
  707. package/cli/builder/bundles/users-bundle/src/providers/mongoose/userProvider.js +0 -47
  708. package/cli/builder/bundles/users-bundle/src/providers/sequelize/userProvider.js +0 -48
  709. package/cli/builder/bundles/users-bundle/tests/loginTest.js +0 -182
  710. package/cli/builder/bundles/users-bundle/usersBundle.js +0 -26
  711. package/cli/builder/microService/microService.js +0 -261
  712. package/cli/builder/microService/skeletons/.editorconfig +0 -18
  713. package/cli/builder/microService/skeletons/.env-cmdrc.js +0 -32
  714. package/cli/builder/microService/skeletons/.jshintrc +0 -37
  715. package/cli/builder/microService/skeletons/README.md +0 -117
  716. package/cli/builder/microService/skeletons/bin/bash/hello.sh +0 -5
  717. package/cli/builder/microService/skeletons/bin/cli +0 -13
  718. package/cli/builder/microService/skeletons/bin/python/hello.py +0 -20
  719. package/cli/builder/microService/skeletons/config/config.js +0 -29
  720. package/cli/builder/microService/skeletons/config/pm2.config.js +0 -72
  721. package/cli/builder/microService/skeletons/config/webpack/webpack.config.dev.js +0 -8
  722. package/cli/builder/microService/skeletons/config/webpack/webpack.config.prod.js +0 -25
  723. package/cli/builder/microService/skeletons/config/webpack.config.js +0 -114
  724. package/cli/builder/microService/skeletons/package.json +0 -76
  725. package/cli/builder/microService/skeletons/src/browser/index.css +0 -3
  726. package/cli/builder/microService/skeletons/src/browser/index.js +0 -16
  727. package/cli/builder/microService/skeletons/src/browser/socketio.js +0 -46
  728. package/cli/builder/microService/skeletons/src/cli/cli.js +0 -224
  729. package/cli/builder/microService/skeletons/src/cli/menu.js +0 -28
  730. package/cli/builder/microService/skeletons/src/n-api/README.md +0 -1
  731. package/cli/builder/microService/skeletons/src/n-api/binding.gyp +0 -14
  732. package/cli/builder/microService/skeletons/src/n-api/hello.cc +0 -14
  733. package/cli/builder/microService/skeletons/src/n-api/hello.js +0 -23
  734. package/cli/builder/microService/skeletons/src/n-api/package.json +0 -15
  735. package/cli/builder/microService/skeletons/src/node/examples/index.js +0 -120
  736. package/cli/builder/microService/skeletons/src/node/index.js +0 -102
  737. package/cli/builder/microService/skeletons/src/node/services/markdown/markdown.js +0 -27
  738. package/cli/builder/microService/skeletons/src/node/services/servers/http.js +0 -45
  739. package/cli/builder/microService/skeletons/src/node/services/servers/https.js +0 -44
  740. package/cli/builder/microService/skeletons/src/node/services/socketio/socketio.js +0 -46
  741. package/cli/builder/microService/skeletons/src/node/services/syscall/syscall.js +0 -111
  742. package/cli/builder/microService/skeletons/src/node/services/worker/thread.js +0 -59
  743. package/cli/builder/microService/skeletons/src/node/services/worker/worker.js +0 -60
  744. package/cli/builder/microService/skeletons/src/templates/base.html +0 -12
  745. package/cli/builder/microService/skeletons/src/templates/socket.html +0 -23
  746. package/cli/builder/microService/skeletons/tests/unit/serviceTest.js +0 -30
  747. package/cli/builder/project/project.js +0 -474
  748. package/cli/builder/project/skeletons/README.md +0 -778
  749. package/cli/builder/project/skeletons/bin/dev-deploy.sh +0 -5
  750. package/cli/builder/project/skeletons/bin/generateCertificates.sh.skeleton +0 -180
  751. package/cli/builder/project/skeletons/bin/prod-deploy.sh +0 -3
  752. package/cli/builder/project/skeletons/config/config.js.skeleton +0 -178
  753. package/cli/builder/project/skeletons/config/openssl/ca/openssl.cnf.skeleton +0 -150
  754. package/cli/builder/project/skeletons/config/openssl/ca_intermediate/openssl.cnf.skeleton +0 -152
  755. package/cli/builder/project/skeletons/config/pm2.config.js.skeleton +0 -62
  756. package/cli/builder/project/skeletons/documentation.html.twig +0 -24
  757. package/cli/builder/project/skeletons/editorconfig.skeleton +0 -18
  758. package/cli/builder/project/skeletons/eslintignore.skeleton +0 -15
  759. package/cli/builder/project/skeletons/eslintrc.js.skeleton +0 -97
  760. package/cli/builder/project/skeletons/gitignore.skeleton +0 -32
  761. package/cli/builder/project/skeletons/migrations/2022.12.25T17.37.37.entity-user.js +0 -137
  762. package/cli/builder/project/skeletons/migrations/2022.12.25T17.37.38.entity-session.js +0 -97
  763. package/cli/builder/project/skeletons/migrations/2022.12.25T17.37.39.entity-requests.js +0 -115
  764. package/cli/builder/project/skeletons/migrations/2022.12.25T17.37.40.entity-jwts.js +0 -97
  765. package/cli/builder/project/skeletons/migrations/migrations.skeleton.js +0 -101
  766. package/cli/builder/project/skeletons/package.json.twig +0 -71
  767. package/cli/builder/react/reactBuilder.js +0 -224
  768. package/cli/builder/react/skeletons/app/Resources/databases/nodefony.db +0 -0
  769. package/cli/builder/react/skeletons/app/Resources/translations/messages.en_en.yml +0 -5
  770. package/cli/builder/react/skeletons/app/Resources/translations/messages.fr_fr.yml +0 -5
  771. package/cli/builder/react/skeletons/app/Resources/views/base.html.twig +0 -33
  772. package/cli/builder/react/skeletons/app/config/config.js +0 -392
  773. package/cli/builder/react/skeletons/app/config/routing.js +0 -10
  774. package/cli/builder/react/skeletons/app/config/security.js +0 -74
  775. package/cli/builder/react/skeletons/app/controller/appController.js +0 -22
  776. package/cli/builder/sandbox/sandBoxBuilder.js +0 -610
  777. package/cli/builder/sandbox/skeletons/Resources/css/entry.css +0 -48
  778. package/cli/builder/sandbox/skeletons/Resources/js/entry.js +0 -60
  779. package/cli/builder/sandbox/skeletons/Resources/public/manifest.json +0 -32
  780. package/cli/builder/sandbox/skeletons/Resources/translations/messages.en_en.yml +0 -5
  781. package/cli/builder/sandbox/skeletons/Resources/translations/messages.fr_fr.yml +0 -5
  782. package/cli/builder/sandbox/skeletons/Resources/views/base.html.twig +0 -46
  783. package/cli/builder/sandbox/skeletons/Resources/views/index.html.twig +0 -34
  784. package/cli/builder/sandbox/skeletons/bootstrap/custom.scss +0 -27
  785. package/cli/builder/sandbox/skeletons/bootstrap/entry.scss +0 -60
  786. package/cli/builder/sandbox/skeletons/workbox/templates/index.html.twig +0 -32
  787. package/cli/builder/sandbox/skeletons/workbox/workers/service-worker.js +0 -196
  788. package/cli/builder/skeletons/Resources/public/favicon.ico +0 -0
  789. package/cli/builder/skeletons/Resources/public/images/app-logo.png +0 -0
  790. package/cli/builder/skeletons/Resources/views/framework-bundle/views/401.html.twig +0 -1
  791. package/cli/builder/skeletons/Resources/views/framework-bundle/views/401.json.twig +0 -24
  792. package/cli/builder/skeletons/Resources/views/framework-bundle/views/403.html.twig +0 -1
  793. package/cli/builder/skeletons/Resources/views/framework-bundle/views/403.json.twig +0 -20
  794. package/cli/builder/skeletons/Resources/views/framework-bundle/views/404.html.twig +0 -1
  795. package/cli/builder/skeletons/Resources/views/framework-bundle/views/404.json.twig +0 -20
  796. package/cli/builder/skeletons/Resources/views/framework-bundle/views/500.html.twig +0 -1
  797. package/cli/builder/skeletons/Resources/views/framework-bundle/views/base.html.twig +0 -30
  798. package/cli/builder/skeletons/Resources/views/framework-bundle/views/exception.html.twig +0 -1
  799. package/cli/builder/skeletons/Resources/views/framework-bundle/views/exception.json.twig +0 -24
  800. package/cli/builder/skeletons/Resources/views/framework-bundle/views/footer.html.twig +0 -33
  801. package/cli/builder/skeletons/Resources/views/framework-bundle/views/header.html.twig +0 -6
  802. package/cli/builder/skeletons/Resources/views/framework-bundle/views/index.html.twig +0 -6
  803. package/cli/builder/skeletons/Resources/views/framework-bundle/views/index.json.twig +0 -1
  804. package/cli/builder/skeletons/Resources/views/framework-bundle/views/layout.html.twig +0 -125
  805. package/cli/builder/skeletons/Resources/views/framework-bundle/views/layout.json.twig +0 -5
  806. package/cli/builder/skeletons/Resources/views/framework-bundle/views/timeout.html.twig +0 -1
  807. package/cli/builder/skeletons/Resources/views/framework-bundle/views/timeout.json.twig +0 -24
  808. package/cli/builder/skeletons/app/appKernel.js +0 -133
  809. package/cli/builder/skeletons/binding/binding.cc +0 -26
  810. package/cli/builder/skeletons/binding/binding.skeleton +0 -8
  811. package/cli/builder/skeletons/bundle/bundleClass.js +0 -37
  812. package/cli/builder/skeletons/command/commandClass.js +0 -11
  813. package/cli/builder/skeletons/command/taskClass.js +0 -20
  814. package/cli/builder/skeletons/config/config.js +0 -138
  815. package/cli/builder/skeletons/config/nodefony/elastic-bundle.js +0 -37
  816. package/cli/builder/skeletons/config/nodefony/framework-bundle.js +0 -22
  817. package/cli/builder/skeletons/config/nodefony/http-bundle.js +0 -104
  818. package/cli/builder/skeletons/config/nodefony/mail-bundle.js +0 -44
  819. package/cli/builder/skeletons/config/nodefony/mongoose-bundle.js +0 -51
  820. package/cli/builder/skeletons/config/nodefony/monitoring-bundle.js +0 -34
  821. package/cli/builder/skeletons/config/nodefony/realtime-bundle.js +0 -15
  822. package/cli/builder/skeletons/config/nodefony/redis-bundle.js +0 -44
  823. package/cli/builder/skeletons/config/nodefony/security-bundle.js +0 -25
  824. package/cli/builder/skeletons/config/nodefony/sequelize-bundle.js +0 -156
  825. package/cli/builder/skeletons/config/routing.js +0 -55
  826. package/cli/builder/skeletons/config/security.js +0 -102
  827. package/cli/builder/skeletons/config/services.js +0 -1
  828. package/cli/builder/skeletons/config/webpack/webpack.dev.config.js +0 -13
  829. package/cli/builder/skeletons/config/webpack/webpack.prod.config.js +0 -20
  830. package/cli/builder/skeletons/config/webpack.config.js +0 -148
  831. package/cli/builder/skeletons/controller/controllerClass.js +0 -75
  832. package/cli/builder/skeletons/package.json.twig +0 -57
  833. package/cli/builder/skeletons/unittest/testFile.js +0 -46
  834. package/cli/builder/vue/skeletons/Resources/public/images/app-logo.png +0 -0
  835. package/cli/builder/vue/skeletons/Resources/translations/messages.en_en.yml +0 -5
  836. package/cli/builder/vue/skeletons/Resources/translations/messages.fr_fr.yml +0 -5
  837. package/cli/builder/vue/skeletons/vue.config.js +0 -129
  838. package/cli/builder/vue/vueBuilder.js +0 -410
  839. package/cli/generate/generate.es6 +0 -103
  840. package/cli/install/install.js +0 -190
  841. package/cli/sequelize/sequelize.js +0 -94
  842. package/cli/start.js +0 -702
  843. package/cli/tools/pm2.es6 +0 -112
  844. package/cli/tools/tools.es6 +0 -97
  845. package/cli.es6 +0 -925
  846. package/container.es6 +0 -272
  847. package/error.es6 +0 -293
  848. package/fileClass.es6 +0 -242
  849. package/finder/file.es6 +0 -33
  850. package/finder/fileResult.es6 +0 -138
  851. package/finder/finder2.es6 +0 -275
  852. package/finder.es6 +0 -427
  853. package/kernel/annotations/annotations.es6 +0 -286
  854. package/kernel/api/api.es6 +0 -61
  855. package/kernel/api/graphqlApi.es6 +0 -107
  856. package/kernel/api/jsonApi.es6 +0 -177
  857. package/kernel/api/openApi.es6 +0 -139
  858. package/kernel/api/schemas/openApiSchema.js +0 -394
  859. package/kernel/babylon.es6 +0 -162
  860. package/kernel/bundle.es6 +0 -1200
  861. package/kernel/cliKernel.es6 +0 -869
  862. package/kernel/command.es6 +0 -78
  863. package/kernel/commands/nodefonyCommand.es6 +0 -247
  864. package/kernel/commands/tasks/bundlesTask.es6 +0 -59
  865. package/kernel/controllers/controller.es6 +0 -791
  866. package/kernel/fixture.es6 +0 -19
  867. package/kernel/injections/injections.es6 +0 -424
  868. package/kernel/kernel.es6 +0 -1960
  869. package/kernel/kernelWatcher.es6 +0 -387
  870. package/kernel/orm/entity.es6 +0 -59
  871. package/kernel/orm/orm.es6 +0 -139
  872. package/kernel/reader.es6 +0 -290
  873. package/kernel/security/encoder.es6 +0 -17
  874. package/kernel/security/factories/factory.es6 +0 -111
  875. package/kernel/security/factories/passeportFactory.es6 +0 -61
  876. package/kernel/security/provider.es6 +0 -58
  877. package/kernel/security/providers/chainProvider.es6 +0 -99
  878. package/kernel/security/providers/memoryProvider.es6 +0 -55
  879. package/kernel/security/providers/providerManager.es6 +0 -67
  880. package/kernel/security/providers/userEntityProvider.es6 +0 -50
  881. package/kernel/security/role.es6 +0 -12
  882. package/kernel/security/secureArea.es6 +0 -431
  883. package/kernel/security/tokens/token.es6 +0 -171
  884. package/kernel/security/user.es6 +0 -106
  885. package/kernel/serviceRealTime.es6 +0 -21
  886. package/kernel/services/connectionsService.es6 +0 -93
  887. package/kernel/services/cron/cronService.es6 +0 -123
  888. package/kernel/task.es6 +0 -80
  889. package/kernel/templates.es6 +0 -22
  890. package/kernel/templating/twig.es6 +0 -218
  891. package/kernel/tests/cliTest.js +0 -59
  892. package/kernel/tests/containerTest.js +0 -232
  893. package/kernel/tests/kernelTest.js +0 -39
  894. package/nodefony.es6 +0 -1084
  895. package/notificationsCenter.es6 +0 -118
  896. package/protocol.es6 +0 -86
  897. package/protocols/bayeux.es6 +0 -174
  898. package/protocols/jsonRpc/jsonrpc.es6 +0 -56
  899. package/result.es6 +0 -99
  900. package/service.es6 +0 -288
  901. package/syslog/pdu.es6 +0 -141
  902. package/syslog/syslog.es6 +0 -754
  903. 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 };