firebase-tools 15.1.0 → 15.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (523) hide show
  1. package/lib/accountExporter.js +3 -5
  2. package/lib/accountImporter.js +4 -5
  3. package/lib/api.js +3 -3
  4. package/lib/apiv2.js +9 -13
  5. package/lib/appUtils.js +19 -21
  6. package/lib/appdistribution/client.js +4 -8
  7. package/lib/appdistribution/distribution.js +4 -4
  8. package/lib/appdistribution/options-parser-util.js +8 -9
  9. package/lib/appdistribution/types.js +2 -2
  10. package/lib/appdistribution/yaml_helper.js +33 -17
  11. package/lib/apphosting/app.js +8 -13
  12. package/lib/apphosting/backend.js +34 -24
  13. package/lib/apphosting/config.js +14 -14
  14. package/lib/apphosting/githubConnections.js +38 -35
  15. package/lib/apphosting/localbuilds.js +4 -6
  16. package/lib/apphosting/repo.js +24 -20
  17. package/lib/apphosting/rollout.js +12 -5
  18. package/lib/apphosting/secrets/dialogs.js +9 -9
  19. package/lib/apphosting/secrets/index.js +9 -11
  20. package/lib/apphosting/utils.js +2 -3
  21. package/lib/apphosting/yaml.js +12 -11
  22. package/lib/apptesting/ensureProjectConfigured.js +1 -2
  23. package/lib/apptesting/invokeTests.js +2 -3
  24. package/lib/apptesting/parseTestFiles.js +5 -6
  25. package/lib/apptesting/types.js +2 -2
  26. package/lib/archiveDirectory.js +1 -2
  27. package/lib/auth.js +36 -40
  28. package/lib/bin/cli.js +2 -3
  29. package/lib/bin/mcp.js +1 -2
  30. package/lib/checkMinRequiredVersion.js +1 -2
  31. package/lib/checkValidTargetFilters.js +1 -2
  32. package/lib/command.js +6 -9
  33. package/lib/commands/appdistribution-testers-list.js +2 -3
  34. package/lib/commands/apphosting-backends-list.js +4 -6
  35. package/lib/commands/apphosting-builds-create.js +2 -3
  36. package/lib/commands/apphosting-builds-get.js +1 -2
  37. package/lib/commands/apphosting-rollouts-list.js +1 -2
  38. package/lib/commands/apps-init.js +1 -1
  39. package/lib/commands/{apptesting-execute.js → apptesting-wata.js} +3 -4
  40. package/lib/commands/crashlytics-symbols-upload.js +2 -2
  41. package/lib/commands/dataconnect-execute.js +4 -4
  42. package/lib/commands/dataconnect-sdk-generate.js +5 -6
  43. package/lib/commands/dataconnect-services-list.js +7 -8
  44. package/lib/commands/dataconnect-sql-diff.js +1 -2
  45. package/lib/commands/dataconnect-sql-migrate.js +4 -3
  46. package/lib/commands/dataconnect-sql-setup.js +2 -2
  47. package/lib/commands/dataconnect-sql-shell.js +5 -1
  48. package/lib/commands/emulators-start.js +1 -2
  49. package/lib/commands/ext-configure.js +6 -4
  50. package/lib/commands/ext-dev-list.js +2 -3
  51. package/lib/commands/ext-dev-upload.js +2 -2
  52. package/lib/commands/ext-export.js +1 -1
  53. package/lib/commands/ext-info.js +2 -3
  54. package/lib/commands/ext-install.js +5 -7
  55. package/lib/commands/firestore-backups-list.js +1 -2
  56. package/lib/commands/firestore-backups-schedules-list.js +1 -2
  57. package/lib/commands/firestore-indexes-list.js +1 -2
  58. package/lib/commands/firestore-utils.js +1 -2
  59. package/lib/commands/functions-artifacts-setpolicy.js +1 -2
  60. package/lib/commands/functions-config-export.js +2 -3
  61. package/lib/commands/hosting-channel-deploy.js +2 -2
  62. package/lib/commands/hosting-clone.js +2 -3
  63. package/lib/commands/hosting-sites-create.js +1 -1
  64. package/lib/commands/index.js +2 -3
  65. package/lib/commands/init.js +4 -5
  66. package/lib/commands/internaltesting-functions-discover.js +1 -1
  67. package/lib/commands/login.js +4 -5
  68. package/lib/commands/logout.js +3 -3
  69. package/lib/commands/projects-create.js +1 -1
  70. package/lib/commands/remoteconfig-experiments-list.js +2 -3
  71. package/lib/commands/remoteconfig-get.js +1 -1
  72. package/lib/commands/remoteconfig-rollback.js +1 -2
  73. package/lib/commands/remoteconfig-rollouts-list.js +2 -3
  74. package/lib/commands/remoteconfig-versions-list.js +3 -4
  75. package/lib/commands/use.js +3 -3
  76. package/lib/config.js +4 -5
  77. package/lib/crashlytics/buildToolsJarHelper.js +3 -5
  78. package/lib/crashlytics/events.js +4 -7
  79. package/lib/crashlytics/filters.js +10 -12
  80. package/lib/crashlytics/issues.js +2 -3
  81. package/lib/crashlytics/notes.js +3 -4
  82. package/lib/crashlytics/reports.js +21 -15
  83. package/lib/crashlytics/types.js +7 -7
  84. package/lib/crashlytics/utils.js +4 -4
  85. package/lib/database/api.js +2 -3
  86. package/lib/database/import.js +4 -4
  87. package/lib/database/metadata.js +5 -6
  88. package/lib/database/rulesConfig.js +2 -3
  89. package/lib/dataconnect/build.js +10 -13
  90. package/lib/dataconnect/checkIam.js +1 -2
  91. package/lib/dataconnect/client.js +15 -18
  92. package/lib/dataconnect/dataplaneClient.js +6 -6
  93. package/lib/dataconnect/ensureApis.js +2 -3
  94. package/lib/dataconnect/errors.js +8 -11
  95. package/lib/dataconnect/filters.js +2 -3
  96. package/lib/dataconnect/freeTrial.js +3 -4
  97. package/lib/dataconnect/graphqlError.js +5 -8
  98. package/lib/dataconnect/load.js +10 -11
  99. package/lib/dataconnect/names.js +14 -18
  100. package/lib/dataconnect/prompts.js +1 -2
  101. package/lib/dataconnect/provisionCloudSql.js +13 -17
  102. package/lib/dataconnect/schemaMigration.js +60 -27
  103. package/lib/dataconnect/types.js +10 -12
  104. package/lib/dataconnect/webhook.js +3 -3
  105. package/lib/defaultCredentials.js +3 -4
  106. package/lib/deploy/apphosting/deploy.js +2 -3
  107. package/lib/deploy/apphosting/prepare.js +3 -5
  108. package/lib/deploy/apphosting/release.js +1 -1
  109. package/lib/deploy/apphosting/util.js +1 -2
  110. package/lib/deploy/database/deploy.js +1 -2
  111. package/lib/deploy/database/prepare.js +1 -2
  112. package/lib/deploy/database/release.js +1 -2
  113. package/lib/deploy/dataconnect/context.js +15 -4
  114. package/lib/deploy/dataconnect/deploy.js +5 -6
  115. package/lib/deploy/dataconnect/prepare.js +7 -9
  116. package/lib/deploy/dataconnect/release.js +7 -10
  117. package/lib/deploy/extensions/deploy.js +7 -9
  118. package/lib/deploy/extensions/deploymentSummary.js +6 -7
  119. package/lib/deploy/extensions/planner.js +15 -18
  120. package/lib/deploy/extensions/prepare.js +9 -11
  121. package/lib/deploy/extensions/release.js +10 -12
  122. package/lib/deploy/extensions/secrets.js +8 -11
  123. package/lib/deploy/extensions/tasks.js +6 -8
  124. package/lib/deploy/extensions/v2FunctionHelper.js +2 -3
  125. package/lib/deploy/extensions/validate.js +1 -2
  126. package/lib/deploy/firestore/deploy.js +3 -5
  127. package/lib/deploy/firestore/prepare.js +2 -3
  128. package/lib/deploy/firestore/release.js +3 -4
  129. package/lib/deploy/functions/backend.js +52 -42
  130. package/lib/deploy/functions/build.js +41 -15
  131. package/lib/deploy/functions/cache/applyHash.js +3 -5
  132. package/lib/deploy/functions/cache/hash.js +4 -5
  133. package/lib/deploy/functions/cel.js +3 -3
  134. package/lib/deploy/functions/checkIam.js +8 -8
  135. package/lib/deploy/functions/containerCleaner.js +10 -6
  136. package/lib/deploy/functions/deploy.js +6 -8
  137. package/lib/deploy/functions/ensure.js +6 -9
  138. package/lib/deploy/functions/functionsDeployHelper.js +10 -11
  139. package/lib/deploy/functions/params.js +10 -10
  140. package/lib/deploy/functions/prepare.js +41 -36
  141. package/lib/deploy/functions/prepareFunctionsUpload.js +24 -10
  142. package/lib/deploy/functions/pricing.js +3 -3
  143. package/lib/deploy/functions/prompts.js +7 -10
  144. package/lib/deploy/functions/release/executor.js +5 -6
  145. package/lib/deploy/functions/release/fabricator.js +76 -29
  146. package/lib/deploy/functions/release/index.js +23 -14
  147. package/lib/deploy/functions/release/planner.js +15 -14
  148. package/lib/deploy/functions/release/reporter.js +20 -20
  149. package/lib/deploy/functions/release/sourceTokenScraper.js +4 -5
  150. package/lib/deploy/functions/remoteSource.js +3 -4
  151. package/lib/deploy/functions/runtimes/discovery/index.js +9 -12
  152. package/lib/deploy/functions/runtimes/discovery/parsing.js +2 -3
  153. package/lib/deploy/functions/runtimes/discovery/v1alpha1.js +29 -10
  154. package/lib/deploy/functions/runtimes/index.js +1 -2
  155. package/lib/deploy/functions/runtimes/node/index.js +18 -9
  156. package/lib/deploy/functions/runtimes/node/parseRuntimeAndValidateSDK.js +2 -2
  157. package/lib/deploy/functions/runtimes/node/validate.js +1 -2
  158. package/lib/deploy/functions/runtimes/node/versioning.js +6 -7
  159. package/lib/deploy/functions/runtimes/python/index.js +12 -12
  160. package/lib/deploy/functions/runtimes/supported/index.js +5 -6
  161. package/lib/deploy/functions/services/auth.js +49 -36
  162. package/lib/deploy/functions/services/database.js +1 -2
  163. package/lib/deploy/functions/services/dataconnect.js +16 -2
  164. package/lib/deploy/functions/services/firebaseAlerts.js +1 -2
  165. package/lib/deploy/functions/services/firestore.js +3 -5
  166. package/lib/deploy/functions/services/index.js +2 -2
  167. package/lib/deploy/functions/services/remoteConfig.js +1 -2
  168. package/lib/deploy/functions/services/storage.js +3 -5
  169. package/lib/deploy/functions/services/testLab.js +1 -2
  170. package/lib/deploy/functions/triggerRegionHelper.js +1 -2
  171. package/lib/deploy/functions/validate.js +12 -11
  172. package/lib/deploy/hosting/convertConfig.js +38 -22
  173. package/lib/deploy/hosting/deploy.js +4 -7
  174. package/lib/deploy/hosting/hashcache.js +2 -3
  175. package/lib/deploy/hosting/prepare.js +14 -14
  176. package/lib/deploy/hosting/release.js +1 -2
  177. package/lib/deploy/index.js +7 -8
  178. package/lib/deploy/lifecycleHooks.js +3 -5
  179. package/lib/deploy/remoteconfig/deploy.js +1 -1
  180. package/lib/deploy/remoteconfig/functions.js +5 -6
  181. package/lib/deploy/remoteconfig/prepare.js +2 -3
  182. package/lib/deploy/remoteconfig/release.js +2 -2
  183. package/lib/deploy/storage/deploy.js +1 -1
  184. package/lib/deploy/storage/prepare.js +1 -1
  185. package/lib/deploy/storage/release.js +1 -1
  186. package/lib/deploymentTool.js +5 -6
  187. package/lib/detectProjectRoot.js +1 -2
  188. package/lib/downloadUtils.js +2 -3
  189. package/lib/emulator/adminSdkConfig.js +2 -3
  190. package/lib/emulator/apphosting/config.js +1 -2
  191. package/lib/emulator/apphosting/developmentServer.js +3 -3
  192. package/lib/emulator/apphosting/serve.js +20 -14
  193. package/lib/emulator/auth/cloudFunctions.js +2 -3
  194. package/lib/emulator/auth/errors.js +2 -2
  195. package/lib/emulator/auth/handlers.js +3 -4
  196. package/lib/emulator/auth/index.js +6 -6
  197. package/lib/emulator/auth/operations.js +171 -129
  198. package/lib/emulator/auth/server.js +30 -22
  199. package/lib/emulator/auth/state.js +26 -36
  200. package/lib/emulator/auth/utils.js +12 -13
  201. package/lib/emulator/commandUtils.js +20 -20
  202. package/lib/emulator/controller.js +32 -29
  203. package/lib/emulator/databaseEmulator.js +1 -2
  204. package/lib/emulator/dataconnect/pgliteServer.js +48 -104
  205. package/lib/emulator/dataconnectEmulator.js +6 -9
  206. package/lib/emulator/download.js +2 -3
  207. package/lib/emulator/downloadableEmulatorInfo.json +7 -7
  208. package/lib/emulator/downloadableEmulators.js +49 -24
  209. package/lib/emulator/emulatorLogger.js +19 -4
  210. package/lib/emulator/env.js +6 -8
  211. package/lib/emulator/eventarcEmulator.js +2 -3
  212. package/lib/emulator/eventarcEmulatorUtils.js +3 -6
  213. package/lib/emulator/extensions/postinstall.js +1 -2
  214. package/lib/emulator/extensions/validation.js +4 -7
  215. package/lib/emulator/extensionsEmulator.js +6 -9
  216. package/lib/emulator/functionsEmulator.js +89 -46
  217. package/lib/emulator/functionsEmulatorRuntime.js +1 -1
  218. package/lib/emulator/functionsEmulatorShared.js +30 -30
  219. package/lib/emulator/functionsEmulatorShell.js +4 -6
  220. package/lib/emulator/functionsEmulatorUtils.js +8 -9
  221. package/lib/emulator/functionsRuntimeWorker.js +18 -9
  222. package/lib/emulator/hub.js +41 -34
  223. package/lib/emulator/hubClient.js +1 -1
  224. package/lib/emulator/initEmulators.js +2 -3
  225. package/lib/emulator/loggingEmulator.js +2 -2
  226. package/lib/emulator/portUtils.js +4 -5
  227. package/lib/emulator/registry.js +10 -4
  228. package/lib/emulator/shared/request.js +1 -2
  229. package/lib/emulator/storage/apis/firebase.js +16 -20
  230. package/lib/emulator/storage/apis/gcloud.js +6 -9
  231. package/lib/emulator/storage/apis/shared.js +1 -2
  232. package/lib/emulator/storage/crc.js +2 -3
  233. package/lib/emulator/storage/files.js +18 -41
  234. package/lib/emulator/storage/metadata.js +10 -4
  235. package/lib/emulator/storage/multipart.js +1 -2
  236. package/lib/emulator/storage/rfc.js +1 -2
  237. package/lib/emulator/storage/rules/config.js +1 -2
  238. package/lib/emulator/storage/rules/manager.js +3 -5
  239. package/lib/emulator/storage/rules/runtime.js +15 -13
  240. package/lib/emulator/storage/rules/types.js +2 -2
  241. package/lib/emulator/storage/rules/utils.js +5 -6
  242. package/lib/emulator/storage/server.js +1 -2
  243. package/lib/emulator/storage/upload.js +3 -4
  244. package/lib/emulator/taskQueue.js +11 -4
  245. package/lib/emulator/tasksEmulator.js +11 -12
  246. package/lib/emulator/types.js +6 -6
  247. package/lib/emulator/ui.js +6 -1
  248. package/lib/ensureApiEnabled.js +7 -9
  249. package/lib/env.js +2 -3
  250. package/lib/error.js +11 -13
  251. package/lib/errorOut.js +1 -2
  252. package/lib/experiments.js +15 -18
  253. package/lib/extensions/askUserForEventsConfig.js +12 -13
  254. package/lib/extensions/askUserForParam.js +11 -12
  255. package/lib/extensions/change-log.js +4 -5
  256. package/lib/extensions/checkProjectBilling.js +1 -2
  257. package/lib/extensions/diagnose.js +1 -2
  258. package/lib/extensions/displayExtensionInfo.js +25 -32
  259. package/lib/extensions/emulator/optionsHelper.js +6 -8
  260. package/lib/extensions/emulator/specHelper.js +15 -16
  261. package/lib/extensions/emulator/triggerHelper.js +3 -5
  262. package/lib/extensions/etags.js +2 -3
  263. package/lib/extensions/export.js +7 -9
  264. package/lib/extensions/extensionsApi.js +23 -29
  265. package/lib/extensions/extensionsHelper.js +52 -80
  266. package/lib/extensions/listExtensions.js +3 -5
  267. package/lib/extensions/localHelper.js +5 -5
  268. package/lib/extensions/manifest.js +15 -16
  269. package/lib/extensions/metricsUtils.js +3 -4
  270. package/lib/extensions/paramHelper.js +21 -18
  271. package/lib/extensions/provisioningHelper.js +17 -21
  272. package/lib/extensions/publishHelpers.js +1 -2
  273. package/lib/extensions/publisherApi.js +11 -13
  274. package/lib/extensions/refs.js +6 -7
  275. package/lib/extensions/runtimes/common.js +18 -19
  276. package/lib/extensions/runtimes/node.js +5 -6
  277. package/lib/extensions/secretsUtils.js +8 -8
  278. package/lib/extensions/tos.js +7 -8
  279. package/lib/extensions/types.js +3 -3
  280. package/lib/extensions/updateHelper.js +6 -7
  281. package/lib/extensions/utils.js +6 -8
  282. package/lib/extensions/versionHelper.js +1 -2
  283. package/lib/extensions/warnings.js +6 -8
  284. package/lib/fetchMOTD.js +1 -2
  285. package/lib/fetchWebSetup.js +3 -4
  286. package/lib/filterTargets.js +1 -2
  287. package/lib/firebaseConfigValidate.js +2 -3
  288. package/lib/firestore/api-sort.js +8 -9
  289. package/lib/firestore/api-types.js +15 -15
  290. package/lib/firestore/api.js +15 -13
  291. package/lib/firestore/backupUtils.js +3 -3
  292. package/lib/firestore/checkDatabaseType.js +1 -2
  293. package/lib/firestore/delete.js +1 -2
  294. package/lib/firestore/encodeFirestoreValue.js +1 -2
  295. package/lib/firestore/fsConfig.js +1 -2
  296. package/lib/firestore/options.js +1 -1
  297. package/lib/firestore/util.js +5 -6
  298. package/lib/firestore/validator.js +4 -5
  299. package/lib/frameworks/angular/index.js +14 -15
  300. package/lib/frameworks/angular/utils.js +21 -23
  301. package/lib/frameworks/astro/index.js +7 -7
  302. package/lib/frameworks/astro/utils.js +4 -6
  303. package/lib/frameworks/compose/discover/filesystem.js +3 -3
  304. package/lib/frameworks/compose/discover/frameworkMatcher.js +4 -5
  305. package/lib/frameworks/compose/discover/index.js +1 -2
  306. package/lib/frameworks/compose/discover/runtime/node.js +8 -11
  307. package/lib/frameworks/compose/driver/docker.js +3 -5
  308. package/lib/frameworks/compose/driver/hooks.js +2 -2
  309. package/lib/frameworks/compose/driver/index.js +2 -2
  310. package/lib/frameworks/compose/driver/local.js +2 -3
  311. package/lib/frameworks/compose/index.js +5 -7
  312. package/lib/frameworks/constants.js +3 -3
  313. package/lib/frameworks/express/index.js +7 -8
  314. package/lib/frameworks/flutter/index.js +6 -7
  315. package/lib/frameworks/flutter/utils.js +4 -5
  316. package/lib/frameworks/index.js +21 -22
  317. package/lib/frameworks/next/constants.js +5 -2
  318. package/lib/frameworks/next/index.js +34 -32
  319. package/lib/frameworks/next/utils.js +40 -39
  320. package/lib/frameworks/nuxt/index.js +9 -9
  321. package/lib/frameworks/nuxt/utils.js +4 -6
  322. package/lib/frameworks/nuxt2/index.js +7 -7
  323. package/lib/frameworks/sveltekit/index.js +6 -8
  324. package/lib/frameworks/utils.js +26 -24
  325. package/lib/frameworks/vite/index.js +8 -9
  326. package/lib/fsAsync.js +1 -2
  327. package/lib/fsutils.js +5 -6
  328. package/lib/functional.js +11 -11
  329. package/lib/functions/artifacts.js +25 -22
  330. package/lib/functions/ensureTargeted.js +1 -2
  331. package/lib/functions/env.js +13 -14
  332. package/lib/functions/functionslog.js +2 -3
  333. package/lib/functions/projectConfig.js +29 -33
  334. package/lib/functions/python.js +10 -4
  335. package/lib/functions/secrets.js +32 -18
  336. package/lib/functionsConfig.js +14 -14
  337. package/lib/functionsConfigClone.js +1 -2
  338. package/lib/functionsShellCommandAction.js +2 -3
  339. package/lib/gcp/apphosting.js +43 -28
  340. package/lib/gcp/apptesting.js +2 -2
  341. package/lib/gcp/artifactregistry.js +5 -5
  342. package/lib/gcp/auth.js +11 -13
  343. package/lib/gcp/cloudbilling.js +4 -5
  344. package/lib/gcp/cloudbuild.js +10 -11
  345. package/lib/gcp/cloudfunctions.js +61 -45
  346. package/lib/gcp/cloudfunctionsv2.js +81 -43
  347. package/lib/gcp/cloudlogging.js +2 -4
  348. package/lib/gcp/cloudmonitoring.js +7 -7
  349. package/lib/gcp/cloudscheduler.js +12 -14
  350. package/lib/gcp/cloudsql/cloudsqladmin.js +18 -20
  351. package/lib/gcp/cloudsql/connect.js +14 -9
  352. package/lib/gcp/cloudsql/fbToolsAuthClient.js +5 -3
  353. package/lib/gcp/cloudsql/interactive.js +2 -3
  354. package/lib/gcp/cloudsql/permissions.js +8 -8
  355. package/lib/gcp/cloudsql/permissionsSetup.js +9 -9
  356. package/lib/gcp/cloudtasks.js +19 -18
  357. package/lib/gcp/computeEngine.js +1 -2
  358. package/lib/gcp/devConnect.js +32 -29
  359. package/lib/gcp/docker.js +2 -4
  360. package/lib/gcp/eventarc.js +5 -5
  361. package/lib/gcp/firedata.js +4 -4
  362. package/lib/gcp/firestore.js +16 -16
  363. package/lib/gcp/iam.js +11 -12
  364. package/lib/gcp/identityPlatform.js +4 -5
  365. package/lib/gcp/k8s.js +1 -2
  366. package/lib/gcp/location.js +2 -2
  367. package/lib/gcp/proto.js +10 -11
  368. package/lib/gcp/pubsub.js +4 -5
  369. package/lib/gcp/resourceManager.js +5 -5
  370. package/lib/gcp/rules.js +13 -14
  371. package/lib/gcp/run.js +24 -31
  372. package/lib/gcp/runv2.js +39 -27
  373. package/lib/gcp/secretManager.js +60 -39
  374. package/lib/gcp/serviceusage.js +8 -4
  375. package/lib/gcp/storage.js +22 -20
  376. package/lib/gemini/fdcExperience.js +5 -5
  377. package/lib/getDefaultDatabaseInstance.js +2 -4
  378. package/lib/getDefaultHostingSite.js +3 -4
  379. package/lib/getProjectNumber.js +1 -2
  380. package/lib/hosting/api.js +32 -36
  381. package/lib/hosting/cloudRunProxy.js +2 -3
  382. package/lib/hosting/config.js +17 -17
  383. package/lib/hosting/expireUtils.js +3 -3
  384. package/lib/hosting/functionsProxy.js +1 -2
  385. package/lib/hosting/implicitInit.js +1 -2
  386. package/lib/hosting/initMiddleware.js +1 -2
  387. package/lib/hosting/interactive.js +1 -2
  388. package/lib/hosting/proxy.js +3 -5
  389. package/lib/hosting/runTags.js +8 -11
  390. package/lib/init/features/account.js +1 -2
  391. package/lib/init/features/ailogic/index.js +3 -5
  392. package/lib/init/features/ailogic/utils.js +6 -8
  393. package/lib/init/features/aitools/claude.js +1 -2
  394. package/lib/init/features/aitools/cursor.js +1 -2
  395. package/lib/init/features/aitools/gemini.js +1 -1
  396. package/lib/init/features/aitools/promptUpdater.js +10 -12
  397. package/lib/init/features/aitools.js +1 -2
  398. package/lib/init/features/apphosting.js +3 -4
  399. package/lib/init/features/apptesting/index.js +9 -9
  400. package/lib/init/features/database.js +4 -5
  401. package/lib/init/features/dataconnect/create_app.js +3 -4
  402. package/lib/init/features/dataconnect/index.js +25 -22
  403. package/lib/init/features/dataconnect/resolver.js +6 -10
  404. package/lib/init/features/dataconnect/sdk.js +31 -24
  405. package/lib/init/features/emulators.js +7 -6
  406. package/lib/init/features/extensions/index.js +3 -5
  407. package/lib/init/features/firestore/index.js +7 -9
  408. package/lib/init/features/firestore/indexes.js +2 -2
  409. package/lib/init/features/firestore/rules.js +3 -3
  410. package/lib/init/features/functions/index.js +3 -5
  411. package/lib/init/features/functions/javascript.js +1 -2
  412. package/lib/init/features/functions/npm-dependencies.js +1 -2
  413. package/lib/init/features/functions/python.js +1 -2
  414. package/lib/init/features/functions/typescript.js +1 -2
  415. package/lib/init/features/genkit/index.js +44 -18
  416. package/lib/init/features/hosting/github.js +6 -8
  417. package/lib/init/features/hosting/index.js +10 -13
  418. package/lib/init/features/project.js +4 -7
  419. package/lib/init/features/remoteconfig.js +1 -2
  420. package/lib/init/features/storage.js +3 -5
  421. package/lib/init/index.js +4 -7
  422. package/lib/init/spawn.js +7 -9
  423. package/lib/listFiles.js +1 -2
  424. package/lib/loadCJSON.js +1 -2
  425. package/lib/localFunction.js +14 -15
  426. package/lib/logError.js +1 -2
  427. package/lib/logger.js +7 -7
  428. package/lib/management/apps.js +22 -22
  429. package/lib/management/database.js +11 -12
  430. package/lib/management/projects.js +57 -56
  431. package/lib/management/provisioning/errorHandler.js +3 -5
  432. package/lib/management/provisioning/provision.js +15 -9
  433. package/lib/management/studio.js +2 -3
  434. package/lib/mcp/errors.js +4 -4
  435. package/lib/mcp/index.js +16 -23
  436. package/lib/mcp/prompt.js +1 -2
  437. package/lib/mcp/prompts/core/consult.js +2 -3
  438. package/lib/mcp/prompts/crashlytics/connect.js +15 -122
  439. package/lib/mcp/prompts/dataconnect/schema.js +3 -3
  440. package/lib/mcp/prompts/index.js +8 -10
  441. package/lib/mcp/resource.js +3 -15
  442. package/lib/mcp/resources/guides/app_id.js +39 -0
  443. package/lib/mcp/resources/guides/crashlytics_connect.js +51 -0
  444. package/lib/mcp/resources/guides/crashlytics_investigations.js +51 -0
  445. package/lib/mcp/resources/guides/crashlytics_issues.js +42 -0
  446. package/lib/mcp/resources/guides/crashlytics_reports.js +112 -0
  447. package/lib/mcp/resources/index.js +11 -3
  448. package/lib/mcp/tool.js +3 -15
  449. package/lib/mcp/tools/apphosting/fetch_logs.js +3 -4
  450. package/lib/mcp/tools/apphosting/list_backends.js +1 -1
  451. package/lib/mcp/tools/auth/get_users.js +5 -16
  452. package/lib/mcp/tools/core/create_android_sha.js +4 -1
  453. package/lib/mcp/tools/core/get_environment.js +3 -3
  454. package/lib/mcp/tools/core/get_sdk_config.js +4 -5
  455. package/lib/mcp/tools/core/get_security_rules.js +1 -2
  456. package/lib/mcp/tools/core/init.js +2 -2
  457. package/lib/mcp/tools/core/logout.js +1 -1
  458. package/lib/mcp/tools/core/read_resources.js +2 -2
  459. package/lib/mcp/tools/core/validate_security_rules.js +1 -2
  460. package/lib/mcp/tools/crashlytics/events.js +43 -19
  461. package/lib/mcp/tools/crashlytics/index.js +1 -6
  462. package/lib/mcp/tools/crashlytics/issues.js +33 -12
  463. package/lib/mcp/tools/crashlytics/reports.js +66 -117
  464. package/lib/mcp/tools/dataconnect/list_services.js +2 -3
  465. package/lib/mcp/tools/firestore/converter.js +3 -5
  466. package/lib/mcp/tools/firestore/delete_document.js +1 -1
  467. package/lib/mcp/tools/functions/get_logs.js +14 -12
  468. package/lib/mcp/tools/functions/list_functions.js +1 -1
  469. package/lib/mcp/tools/index.js +17 -9
  470. package/lib/mcp/util/apptesting/availability.js +1 -2
  471. package/lib/mcp/util/availability.js +1 -2
  472. package/lib/mcp/util/crashlytics/availability.js +1 -2
  473. package/lib/mcp/util/dataconnect/compile.js +7 -6
  474. package/lib/mcp/util/dataconnect/converter.js +7 -10
  475. package/lib/mcp/util/dataconnect/emulator.js +1 -2
  476. package/lib/mcp/util.js +9 -11
  477. package/lib/messaging/sendMessage.js +1 -2
  478. package/lib/metaprogramming.js +1 -2
  479. package/lib/operation-poller.js +2 -2
  480. package/lib/profileReport.js +6 -6
  481. package/lib/profiler.js +1 -2
  482. package/lib/projectPath.js +1 -2
  483. package/lib/projectUtils.js +5 -6
  484. package/lib/prompt.js +22 -13
  485. package/lib/rc.js +5 -7
  486. package/lib/remoteconfig/deleteExperiment.js +1 -2
  487. package/lib/remoteconfig/deleteRollout.js +1 -2
  488. package/lib/remoteconfig/get.js +2 -3
  489. package/lib/remoteconfig/getExperiment.js +2 -2
  490. package/lib/remoteconfig/getRollout.js +2 -2
  491. package/lib/remoteconfig/interfaces.js +1 -1
  492. package/lib/remoteconfig/listExperiments.js +2 -2
  493. package/lib/remoteconfig/listRollouts.js +2 -2
  494. package/lib/remoteconfig/publish.js +1 -2
  495. package/lib/remoteconfig/rollback.js +1 -2
  496. package/lib/remoteconfig/versionslist.js +1 -2
  497. package/lib/requireAuth.js +4 -6
  498. package/lib/requireConfig.js +5 -8
  499. package/lib/requireDatabaseInstance.js +2 -2
  500. package/lib/requireHostingSite.js +1 -2
  501. package/lib/requireInteractive.js +1 -1
  502. package/lib/requirePermissions.js +1 -2
  503. package/lib/requireTosAcceptance.js +1 -2
  504. package/lib/responseToError.js +1 -2
  505. package/lib/rtdb.js +2 -3
  506. package/lib/rulesDeploy.js +3 -4
  507. package/lib/serve/functions.js +9 -1
  508. package/lib/serve/hosting.js +4 -5
  509. package/lib/serve/index.js +1 -2
  510. package/lib/shortenUrl.js +1 -2
  511. package/lib/templates.js +3 -4
  512. package/lib/throttler/throttler.js +3 -3
  513. package/lib/timeout.js +2 -3
  514. package/lib/track.js +23 -14
  515. package/lib/tsconfig.publish.tsbuildinfo +1 -0
  516. package/lib/unzip.js +2 -3
  517. package/lib/utils.js +62 -63
  518. package/lib/vsCodeUtils.js +2 -3
  519. package/package.json +6 -6
  520. package/templates/extensions/typescript/index.ts +1 -1
  521. package/templates/extensions/typescript/package.lint.json +1 -1
  522. package/templates/extensions/typescript/package.nolint.json +1 -1
  523. package/templates/extensions/typescript/tsconfig.json +2 -1
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.crashlytics_issues = void 0;
4
+ const resource_1 = require("../../resource");
5
+ const RESOURCE_CONTENT = `
6
+ ### How to Display Issues
7
+
8
+ When displaying a list of issues, use the following format:
9
+
10
+ 1. Issue <full issue id>
11
+ * <the issue title>
12
+ * <the issue subtitle>
13
+ * **Description:** <a discription of the issue based on information from the tool response>
14
+
15
+ ### How to Prioritize Crashlytics Issues
16
+
17
+ Follow these steps to fetch issues and prioritize them.
18
+
19
+ 1. Use the 'crashlytics_get_report' tool to fetch the 'topIssues' report.
20
+ 1a. Analyze the user's query and apply the appropriate filters. Use the information in the [Firebase Crashlytics Reports Guide](firebase://guides/crashlytics/reports) to further construct appropriate report requests.
21
+ 1b. If the user asks for crashes, then set the *issueErrorType* filter to *FATAL*.
22
+ 1c. If the user asks about a particular time range, then set both the *intervalStartTime* and *intervalEndTime*.
23
+ 2. Use the 'crashlytics_get_report' tool to fetch the 'topVersions' for this app.
24
+ 3. If the user instructions include statements about prioritization, use those instructions.
25
+ 4. If the user instructions do not include statements about prioritization, then prioritize the returned issues using the following criteria:
26
+ 4a. The app versions for the issue include the most recent version of the app.
27
+ 4b. The number of users experiencing the issue across variants
28
+ 4c. The volume of crashes
29
+ 5. Return the top 5 issues, with a brief description each in a numerical list with the recommended format.
30
+ 5a. Describe the rationale for the prioritization order.
31
+ 6. Ask the user if they would like to diagnose and fix any of the issues presented before taking any action.
32
+ `.trim();
33
+ exports.crashlytics_issues = (0, resource_1.resource)({
34
+ uri: "firebase://guides/crashlytics/issues",
35
+ name: "crashlytics_issues_guide",
36
+ title: "Firebase Crashlytics Issues Guide",
37
+ description: "Guides the coding agent when working with Crashlytics issues, including prioritization rules and procedures for diagnosing and fixing crashes. ",
38
+ }, async (uri) => {
39
+ return {
40
+ contents: [{ uri, type: "text", text: RESOURCE_CONTENT }],
41
+ };
42
+ });
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.crashlytics_reports = void 0;
4
+ const resource_1 = require("../../resource");
5
+ const RESOURCE_CONTENT = `
6
+ ### Crashlytics Reports
7
+
8
+ Aggregate metrics for all of the events sent to Crashlytics are available as reports.
9
+ The following reports are available for all Crashlytics applications.
10
+
11
+ - name: "topIssues"
12
+ display_name: "Top Issues"
13
+ usage: |
14
+ Counts events and distinct impacted users, grouped by issue.
15
+ Issue groups are sorted by event count, in descending order.
16
+
17
+ - name: "topVariants"
18
+ display_name: "Top Variants"
19
+ usage: |
20
+ Counts events and distinct impacted users, grouped by issue variant.
21
+ Issue variant groups are sorted by event count, in descending order.
22
+ required: |
23
+ An issue filter including an issue id is required.
24
+
25
+ - name: "topVersions"
26
+ display_name: "Top Versions"
27
+ usage: |
28
+ Counts events, grouped by app version.
29
+ Versions are sorted by event count, in descending order.
30
+
31
+ - name: "topOperatingSystems"
32
+ display_name: "Top Operating Systems"
33
+ usage: |
34
+ Counts events, grouped by device operating systems and their versions.
35
+ Operating systems are sorted by event count, in descending order.
36
+
37
+ Mobile apps have one of the following reports available, depending on the platform.
38
+
39
+ - name: "topAndroidDevices"
40
+ display_name: "Top Android Devices"
41
+ usage: |
42
+ Counts events, grouped by android device.
43
+ Devices are sorted by event count, in descending order.
44
+
45
+ - name: "topAppleDevices"
46
+ display_name: "Top Apple Devices"
47
+ usage:
48
+ Counts events, grouped by operating system and Apple device.
49
+ Devices are sorted by event count, in descending order.
50
+
51
+ Report responses contain the following metrics:
52
+
53
+ - eventsCount: the number of events matching
54
+ - impactedUsers: the number of distinct end users in all the matching events
55
+
56
+ Report responses are always grouped by one of the following dimensions:
57
+
58
+ - app version
59
+ - issue
60
+ - variant
61
+ - operating system
62
+ - mobile device type
63
+
64
+ ### Filters
65
+
66
+ When setting report filters adhere to the following instructions.
67
+
68
+ * Issue Filtering:
69
+ * Use the \`issueErrorTypes\` field to focus on events of different fatalities:
70
+ * FATAL: native crashes, which caused the app to exit.
71
+ * NON_FATAL: uncaught or manually reported exceptions, which did not crash the app.
72
+ * ANR: "app not responding" events, only relevant on Android platforms.
73
+
74
+ * Time Interval:
75
+ * For a custom time range, you must specify both intervalStartTime and intervalEndTime.
76
+ * The specified time range must be within the last 90 days.
77
+ * If you don't provide a time range, it will default to the last 7 days.
78
+
79
+ * Display Names (for app versions, operating systems, and devices):
80
+ * The values for versionDisplayNames,operatingSystemDisplayNames, and deviceDisplayNames must be obtained from the displayName field of a previous API response.
81
+ * These display names must match specific formats:
82
+ * Device: 'manufacturer (device)'
83
+ * Operating System: 'os (version)'
84
+ * App Version: 'version (build)'
85
+
86
+ ### Useful Reports
87
+
88
+ * The "topIssues" report is comparable to the default view on the Crashlytics web dashboard. Use this report first to prioritize which issues are impacting the most users. Apply appropriate filters for time interval based on the user's query.
89
+
90
+ * Report responses grouped by issue will include a sample event URI. Use the "crashlytics_batch_get_events" tool to fetch the complete record for any sample event.
91
+
92
+ * When investigating an issue, use the appropriate top devices and top operating systems reports to understand what systems are impacted by the problem. Pass the "issueId" in the filter to narrow any report to a specific issue.
93
+
94
+ ### How to Display Issues
95
+
96
+ When displaying a list of issues, use the following format:
97
+
98
+ 1. Issue <full issue id>
99
+ * <the issue title>
100
+ * <the issue subtitle>
101
+ * **Description:** <a discription of the issue based on information from the tool response>
102
+ `.trim();
103
+ exports.crashlytics_reports = (0, resource_1.resource)({
104
+ uri: "firebase://guides/crashlytics/reports",
105
+ name: "crashlytics_reports_guide",
106
+ title: "Firebase Crashlytics Reports Guide",
107
+ description: "Guides the coding agent through requesting Crashlytics reports, including setting appropriate filters and how to understand the metrics. The agent should read this guide before requesting any report.",
108
+ }, async (uri) => {
109
+ return {
110
+ contents: [{ uri, type: "text", text: RESOURCE_CONTENT }],
111
+ };
112
+ });
@@ -1,15 +1,25 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.markdownDocsOfResources = exports.resolveResource = exports.resourceTemplates = exports.resources = void 0;
3
+ exports.resourceTemplates = exports.resources = void 0;
4
+ exports.resolveResource = resolveResource;
5
+ exports.markdownDocsOfResources = markdownDocsOfResources;
4
6
  const docs_1 = require("./docs");
7
+ const app_id_1 = require("./guides/app_id");
5
8
  const init_ai_1 = require("./guides/init_ai");
6
9
  const init_auth_1 = require("./guides/init_auth");
7
10
  const init_backend_1 = require("./guides/init_backend");
8
11
  const init_firestore_1 = require("./guides/init_firestore");
9
12
  const init_firestore_rules_1 = require("./guides/init_firestore_rules");
10
13
  const init_hosting_1 = require("./guides/init_hosting");
14
+ const crashlytics_investigations_1 = require("./guides/crashlytics_investigations");
11
15
  const track_1 = require("../../track");
16
+ const crashlytics_issues_1 = require("./guides/crashlytics_issues");
17
+ const crashlytics_reports_1 = require("./guides/crashlytics_reports");
12
18
  exports.resources = [
19
+ app_id_1.app_id,
20
+ crashlytics_investigations_1.crashlytics_investigations,
21
+ crashlytics_issues_1.crashlytics_issues,
22
+ crashlytics_reports_1.crashlytics_reports,
13
23
  init_backend_1.init_backend,
14
24
  init_ai_1.init_ai,
15
25
  init_firestore_1.init_firestore,
@@ -37,7 +47,6 @@ async function resolveResource(uri, ctx, track = true) {
37
47
  void (0, track_1.trackGA4)("mcp_read_resource", { resource_name: uri, not_found: "true" });
38
48
  return null;
39
49
  }
40
- exports.resolveResource = resolveResource;
41
50
  function markdownDocsOfResources() {
42
51
  const allResources = [...exports.resources, ...exports.resourceTemplates];
43
52
  const headings = `
@@ -52,4 +61,3 @@ function markdownDocsOfResources() {
52
61
  });
53
62
  return headings + resourceRows.join("");
54
63
  }
55
- exports.markdownDocsOfResources = markdownDocsOfResources;
package/lib/mcp/tool.js CHANGED
@@ -1,27 +1,15 @@
1
1
  "use strict";
2
- var __rest = (this && this.__rest) || function (s, e) {
3
- var t = {};
4
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
- t[p] = s[p];
6
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
- t[p[i]] = s[p[i]];
10
- }
11
- return t;
12
- };
13
2
  Object.defineProperty(exports, "__esModule", { value: true });
14
- exports.tool = void 0;
3
+ exports.tool = tool;
15
4
  const zod_to_json_schema_1 = require("zod-to-json-schema");
16
5
  const util_1 = require("./util");
17
6
  const availability_1 = require("./util/availability");
18
7
  function tool(feature, options, fn) {
19
- const { isAvailable } = options, mcpOptions = __rest(options, ["isAvailable"]);
8
+ const { isAvailable, ...mcpOptions } = options;
20
9
  const isAvailableFunc = isAvailable || (0, availability_1.getDefaultFeatureAvailabilityCheck)(feature);
21
10
  return {
22
- mcp: Object.assign(Object.assign({}, mcpOptions), { inputSchema: (0, util_1.cleanSchema)((0, zod_to_json_schema_1.zodToJsonSchema)(options.inputSchema)) }),
11
+ mcp: { ...mcpOptions, inputSchema: (0, util_1.cleanSchema)((0, zod_to_json_schema_1.zodToJsonSchema)(options.inputSchema)) },
23
12
  fn,
24
13
  isAvailable: isAvailableFunc,
25
14
  };
26
15
  }
27
- exports.tool = tool;
@@ -31,20 +31,19 @@ exports.fetch_logs = (0, tool_1.tool)("apphosting", {
31
31
  requiresProject: true,
32
32
  },
33
33
  }, async ({ buildLogs, backendId, location } = {}, { projectId }) => {
34
- var _a, _b;
35
34
  location || (location = "");
36
35
  if (!backendId) {
37
36
  return (0, util_1.toContent)(`backendId must be specified.`);
38
37
  }
39
38
  const backend = await (0, apphosting_1.getBackend)(projectId, location, backendId);
40
39
  const traffic = await (0, apphosting_1.getTraffic)(projectId, location, backendId);
41
- const data = Object.assign(Object.assign({}, backend), { traffic });
40
+ const data = { ...backend, traffic };
42
41
  if (buildLogs) {
43
42
  const builds = await (0, apphosting_1.listBuilds)(projectId, location, backendId);
44
43
  builds.builds.sort((a, b) => new Date(a.createTime).getTime() - new Date(b.createTime).getTime());
45
44
  const build = (0, utils_1.last)(builds.builds);
46
45
  const r = new RegExp(`region=${location}/([0-9a-f-]+)?`);
47
- const match = r.exec((_a = build.buildLogsUri) !== null && _a !== void 0 ? _a : "");
46
+ const match = r.exec(build.buildLogsUri ?? "");
48
47
  if (!match) {
49
48
  throw new error_1.FirebaseError("Unable to determine the build ID.");
50
49
  }
@@ -59,7 +58,7 @@ exports.fetch_logs = (0, tool_1.tool)("apphosting", {
59
58
  }
60
59
  return (0, util_1.toContent)(entries);
61
60
  }
62
- const serviceName = (_b = (0, utils_1.last)(data.managedResources)) === null || _b === void 0 ? void 0 : _b.runService.service;
61
+ const serviceName = (0, utils_1.last)(data.managedResources)?.runService.service;
63
62
  if (!serviceName) {
64
63
  throw new error_1.FirebaseError("Unable to get service name from managedResources.");
65
64
  }
@@ -44,7 +44,7 @@ exports.list_backends = (0, tool_1.tool)("apphosting", {
44
44
  (0, apphosting_1.getTraffic)(projectId, location, id),
45
45
  (0, apphosting_1.listDomains)(projectId, location, id),
46
46
  ]);
47
- return Object.assign(Object.assign({}, backend), { traffic: traffic, domains: domains });
47
+ return { ...backend, traffic: traffic, domains: domains };
48
48
  });
49
49
  const data = await Promise.all(promises);
50
50
  return (0, util_1.toContent)(data);
@@ -1,15 +1,4 @@
1
1
  "use strict";
2
- var __rest = (this && this.__rest) || function (s, e) {
3
- var t = {};
4
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
- t[p] = s[p];
6
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
- t[p[i]] = s[p[i]];
10
- }
11
- return t;
12
- };
13
2
  Object.defineProperty(exports, "__esModule", { value: true });
14
3
  exports.get_users = void 0;
15
4
  const zod_1 = require("zod");
@@ -42,23 +31,23 @@ exports.get_users = (0, tool_1.tool)("auth", {
42
31
  },
43
32
  }, async ({ uids, emails, phone_numbers, limit }, { projectId }) => {
44
33
  const prune = (user) => {
45
- const { passwordHash, salt } = user, prunedUser = __rest(user, ["passwordHash", "salt"]);
34
+ const { passwordHash, salt, ...prunedUser } = user;
46
35
  return prunedUser;
47
36
  };
48
37
  let users = [];
49
- if (uids === null || uids === void 0 ? void 0 : uids.length) {
38
+ if (uids?.length) {
50
39
  const promises = uids.map((uid) => (0, auth_1.findUser)(projectId, undefined, undefined, uid).catch(() => null));
51
40
  users.push(...(await Promise.all(promises)).filter((u) => !!u));
52
41
  }
53
- if (emails === null || emails === void 0 ? void 0 : emails.length) {
42
+ if (emails?.length) {
54
43
  const promises = emails.map((email) => (0, auth_1.findUser)(projectId, email, undefined, undefined).catch(() => null));
55
44
  users.push(...(await Promise.all(promises)).filter((u) => !!u));
56
45
  }
57
- if (phone_numbers === null || phone_numbers === void 0 ? void 0 : phone_numbers.length) {
46
+ if (phone_numbers?.length) {
58
47
  const promises = phone_numbers.map((phone) => (0, auth_1.findUser)(projectId, undefined, phone, undefined).catch(() => null));
59
48
  users.push(...(await Promise.all(promises)).filter((u) => !!u));
60
49
  }
61
- if (!(uids === null || uids === void 0 ? void 0 : uids.length) && !(emails === null || emails === void 0 ? void 0 : emails.length) && !(phone_numbers === null || phone_numbers === void 0 ? void 0 : phone_numbers.length)) {
50
+ if (!uids?.length && !emails?.length && !phone_numbers?.length) {
62
51
  users = await (0, auth_1.listUsers)(projectId, limit || 100);
63
52
  }
64
53
  return (0, util_1.toContent)(users.map(prune));
@@ -36,5 +36,8 @@ exports.create_android_sha = (0, tool_1.tool)("core", {
36
36
  shaHash: sha_hash,
37
37
  certType,
38
38
  });
39
- return (0, util_1.toContent)(Object.assign(Object.assign({}, shaCertificate), { message: `Successfully added ${certType} certificate to Android app ${app_id}` }));
39
+ return (0, util_1.toContent)({
40
+ ...shaCertificate,
41
+ message: `Successfully added ${certType} certificate to Android app ${app_id}`,
42
+ });
40
43
  });
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.get_environment = exports.hydrateTemplate = void 0;
3
+ exports.get_environment = void 0;
4
+ exports.hydrateTemplate = hydrateTemplate;
4
5
  const zod_1 = require("zod");
5
6
  const tool_1 = require("../../tool");
6
7
  const util_1 = require("../../util");
@@ -52,10 +53,9 @@ b) Initialize a new Firebase project directory using the 'firebase_init' tool.
52
53
 
53
54
  Confirm with the user before taking action.`}`;
54
55
  }
55
- exports.hydrateTemplate = hydrateTemplate;
56
56
  exports.get_environment = (0, tool_1.tool)("core", {
57
57
  name: "get_environment",
58
- description: "Use this to retrieve the current Firebase **environment** configuration for the Firebase CLI and Firebase MCP server, including current authenticated user, project directory, active Firebase Project, and more.",
58
+ description: "Use this to retrieve the current Firebase **environment** configuration for the Firebase CLI and Firebase MCP server, including current authenticated user, project directory, active Firebase Project, and more. All tools require the user to be authenticated, but not all information is required for all tools. Pay attention to the tool requirements for which pieces of information are required.",
59
59
  inputSchema: zod_1.z.object({}),
60
60
  annotations: {
61
61
  title: "Get Firebase Environment Info",
@@ -28,13 +28,12 @@ exports.get_sdk_config = (0, tool_1.tool)("core", {
28
28
  requiresAuth: true,
29
29
  },
30
30
  }, async ({ platform: inputPlatform, app_id: appId }, { projectId }) => {
31
- var _a, _b;
32
- let platform = inputPlatform === null || inputPlatform === void 0 ? void 0 : inputPlatform.toUpperCase();
31
+ let platform = inputPlatform?.toUpperCase();
33
32
  if (!platform && !appId)
34
33
  return (0, util_1.mcpError)("Must specify one of 'web', 'ios', or 'android' for platform or an app_id for get_sdk_config tool.");
35
- const apps = await (0, apps_1.listFirebaseApps)(projectId, platform !== null && platform !== void 0 ? platform : apps_1.AppPlatform.ANY);
36
- platform = platform || ((_a = apps.find((app) => app.appId === appId)) === null || _a === void 0 ? void 0 : _a.platform);
37
- appId = appId || ((_b = apps.find((app) => app.platform === platform)) === null || _b === void 0 ? void 0 : _b.appId);
34
+ const apps = await (0, apps_1.listFirebaseApps)(projectId, platform ?? apps_1.AppPlatform.ANY);
35
+ platform = platform || apps.find((app) => app.appId === appId)?.platform;
36
+ appId = appId || apps.find((app) => app.platform === platform)?.appId;
38
37
  if (!appId)
39
38
  return (0, util_1.mcpError)(`Could not find an app for platform '${inputPlatform}' in project '${projectId}'`);
40
39
  const sdkConfig = await (0, apps_1.getAppConfig)(appId, platform);
@@ -23,7 +23,6 @@ exports.get_security_rules = (0, tool_1.tool)("core", {
23
23
  requiresAuth: true,
24
24
  },
25
25
  }, async ({ type }, { projectId }) => {
26
- var _a;
27
26
  if (type === "rtdb") {
28
27
  const dbUrl = await (0, getDefaultDatabaseInstance_1.getDefaultDatabaseInstance)(projectId);
29
28
  if (dbUrl === "") {
@@ -51,5 +50,5 @@ exports.get_security_rules = (0, tool_1.tool)("core", {
51
50
  if (!rulesetName)
52
51
  return (0, util_1.mcpError)(`No active ${productName} rules were found in project '${projectId}'`);
53
52
  const rules = await (0, rules_1.getRulesetContent)(rulesetName);
54
- return (0, util_1.toContent)((_a = rules === null || rules === void 0 ? void 0 : rules[0].content) !== null && _a !== void 0 ? _a : "Ruleset contains no rules files.");
53
+ return (0, util_1.toContent)(rules?.[0].content ?? "Ruleset contains no rules files.");
55
54
  });
@@ -213,8 +213,8 @@ exports.init = (0, tool_1.tool)("core", {
213
213
  };
214
214
  }
215
215
  const setup = {
216
- config: config === null || config === void 0 ? void 0 : config.src,
217
- rcfile: rc === null || rc === void 0 ? void 0 : rc.data,
216
+ config: config?.src,
217
+ rcfile: rc?.data,
218
218
  projectId: projectId,
219
219
  features: [...featuresList],
220
220
  featureInfo: featureInfo,
@@ -32,7 +32,7 @@ exports.logout = (0, tool_1.tool)("core", {
32
32
  if (email && accountsToLogOut.length === 0) {
33
33
  return (0, util_1.toContent)(`No account matches ${email}, can't log out.`);
34
34
  }
35
- const logoutDefault = email === (defaultAccount === null || defaultAccount === void 0 ? void 0 : defaultAccount.user.email);
35
+ const logoutDefault = email === defaultAccount?.user.email;
36
36
  let newDefaultAccount = undefined;
37
37
  if (logoutDefault && additionalAccounts.length > 0) {
38
38
  newDefaultAccount = additionalAccounts[0];
@@ -21,7 +21,7 @@ exports.read_resources = (0, tool_1.tool)("core", {
21
21
  .describe("list of resource uris to read. each must start with `firebase://` prefix. omit to list all available resources"),
22
22
  }),
23
23
  }, async ({ uris }, ctx) => {
24
- if (!(uris === null || uris === void 0 ? void 0 : uris.length)) {
24
+ if (!uris?.length) {
25
25
  void (0, track_1.trackGA4)("mcp_read_resource", { resource_name: "__list__" });
26
26
  return (0, util_1.toContent)(resources_1.resources
27
27
  .map((r) => `Available resources:\n\n- [${r.mcp.title || r.mcp.name}](${r.mcp.uri}): ${r.mcp.description}`)
@@ -34,7 +34,7 @@ exports.read_resources = (0, tool_1.tool)("core", {
34
34
  out.push(`<resource uri="${uri}" error>\nRESOURCE NOT FOUND\n</resource>`);
35
35
  continue;
36
36
  }
37
- out.push(`<resource uri="${uri}" title="${resolved.mcp.title || resolved.mcp.name}">\n${resolved.result.contents.map((c) => c.text).join("")}\n</resource>`);
37
+ out.push(`<resource uri="${uri}" title="${resolved.mcp.title || resolved.mcp.name}">\n${resolved.result.contents.map((c) => ("text" in c ? c.text : "")).join("")}\n</resource>`);
38
38
  }
39
39
  return (0, util_1.toContent)(out.join("\n\n"));
40
40
  });
@@ -79,7 +79,6 @@ exports.validate_security_rules = (0, tool_1.tool)("core", {
79
79
  return rtdbActive || storageActive || firestoreActive;
80
80
  },
81
81
  }, async ({ type, source, source_file }, { projectId, config, host }) => {
82
- var _a, _b;
83
82
  let rulesSourceContent;
84
83
  if (source && source_file) {
85
84
  return (0, util_1.mcpError)("Must supply `source` or `source_file`, not both.");
@@ -116,7 +115,7 @@ exports.validate_security_rules = (0, tool_1.tool)("core", {
116
115
  const result = await (0, rules_1.testRuleset)(projectId, [
117
116
  { name: "test.rules", content: rulesSourceContent },
118
117
  ]);
119
- if ((_b = (_a = result.body) === null || _a === void 0 ? void 0 : _a.issues) === null || _b === void 0 ? void 0 : _b.length) {
118
+ if (result.body?.issues?.length) {
120
119
  const issues = result.body.issues;
121
120
  let out = `Found ${issues.length} issues in rules source:\n\n`;
122
121
  out += formatRulesetIssues(issues, rulesSourceContent);
@@ -1,13 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.batch_get_events = exports.list_events = void 0;
4
- const zod_1 = require("zod");
5
- const tool_1 = require("../../tool");
6
4
  const js_yaml_1 = require("js-yaml");
5
+ const zod_1 = require("zod");
7
6
  const events_1 = require("../../../crashlytics/events");
8
- const types_1 = require("../../../crashlytics/types");
9
7
  const filters_1 = require("../../../crashlytics/filters");
10
- const util_1 = require("../../util");
8
+ const types_1 = require("../../../crashlytics/types");
9
+ const app_id_1 = require("../../resources/guides/app_id");
10
+ const tool_1 = require("../../tool");
11
11
  const DUMP_OPTIONS = { lineWidth: 200 };
12
12
  function formatFrames(origFrames, maxFrames = 20) {
13
13
  const frames = origFrames || [];
@@ -33,7 +33,9 @@ function formatFrames(origFrames, maxFrames = 20) {
33
33
  return formatted;
34
34
  }
35
35
  function toText(event) {
36
- var _a, _b;
36
+ if (!event) {
37
+ return {};
38
+ }
37
39
  const result = {};
38
40
  for (const [key, value] of Object.entries(event)) {
39
41
  if (key === "logs") {
@@ -46,7 +48,7 @@ function toText(event) {
46
48
  const breadcrumbs = value || [];
47
49
  const slicedBreadcrumbs = breadcrumbs.length > 10 ? breadcrumbs.slice(-10) : breadcrumbs;
48
50
  const breadcrumbLines = slicedBreadcrumbs.map((b) => {
49
- const paramString = Object.entries(b.params)
51
+ const paramString = Object.entries(b?.params || {})
50
52
  .map(([k, v]) => `${k}: ${v}`)
51
53
  .join(", ");
52
54
  const params = paramString ? ` { ${paramString} }` : "";
@@ -56,7 +58,7 @@ function toText(event) {
56
58
  }
57
59
  else if (key === "threads") {
58
60
  let threads = value || [];
59
- if (((_a = event.issue) === null || _a === void 0 ? void 0 : _a.errorType) === types_1.ErrorType.FATAL || ((_b = event.issue) === null || _b === void 0 ? void 0 : _b.errorType) === types_1.ErrorType.ANR) {
61
+ if (event.issue?.errorType === types_1.ErrorType.FATAL || event.issue?.errorType === types_1.ErrorType.ANR) {
60
62
  threads = threads.filter((t) => t.crashed || t.blamed);
61
63
  }
62
64
  const threadStrings = threads.map((thread) => {
@@ -109,13 +111,24 @@ exports.list_events = (0, tool_1.tool)("crashlytics", {
109
111
  requiresAuth: true,
110
112
  },
111
113
  }, async ({ appId, filter, pageSize }) => {
112
- var _a;
113
- if (!appId)
114
- return (0, util_1.mcpError)(`Must specify 'appId' parameter.`);
115
- if (!filter || (!filter.issueId && !filter.issueVariantId))
116
- return (0, util_1.mcpError)(`Must specify 'filter.issueId' or 'filter.issueVariantId' parameters.`);
114
+ const result = { content: [] };
115
+ if (!appId) {
116
+ result.isError = true;
117
+ result.content.push({ type: "text", text: "Must specify 'appId' parameter" });
118
+ result.content.push({ type: "text", text: app_id_1.RESOURCE_CONTENT });
119
+ }
120
+ if (!filter || (!filter.issueId && !filter.issueVariantId)) {
121
+ result.isError = true;
122
+ result.content.push({
123
+ type: "text",
124
+ text: `Must specify 'filter.issueId' or 'filter.issueVariantId' parameters.`,
125
+ });
126
+ }
127
+ if (result.content.length > 0) {
128
+ return result;
129
+ }
117
130
  const response = await (0, events_1.listEvents)(appId, filter, pageSize);
118
- const eventsContent = ((_a = response.events) === null || _a === void 0 ? void 0 : _a.map((e) => toText(e))) || [];
131
+ const eventsContent = response.events?.map((e) => toText(e)) || [];
119
132
  return {
120
133
  content: [{ type: "text", text: (0, js_yaml_1.dump)(eventsContent, DUMP_OPTIONS) }],
121
134
  };
@@ -139,13 +152,24 @@ exports.batch_get_events = (0, tool_1.tool)("crashlytics", {
139
152
  requiresAuth: true,
140
153
  },
141
154
  }, async ({ appId, names }) => {
142
- var _a;
143
- if (!appId)
144
- return (0, util_1.mcpError)(`Must specify 'appId' parameter.`);
145
- if (!names || names.length === 0)
146
- return (0, util_1.mcpError)(`Must provide event resource names in name parameter.`);
155
+ const result = { content: [] };
156
+ if (!appId) {
157
+ result.isError = true;
158
+ result.content.push({ type: "text", text: "Must specify 'appId' parameter." });
159
+ result.content.push({ type: "text", text: app_id_1.RESOURCE_CONTENT });
160
+ }
161
+ if (!names || names.length === 0) {
162
+ result.isError = true;
163
+ result.content.push({
164
+ type: "text",
165
+ text: "Must provide event resource names in name parameter.",
166
+ });
167
+ }
168
+ if (result.content.length > 0) {
169
+ return result;
170
+ }
147
171
  const response = await (0, events_1.batchGetEvents)(appId, names);
148
- const eventsContent = ((_a = response.events) === null || _a === void 0 ? void 0 : _a.map((e) => toText(e))) || [];
172
+ const eventsContent = response.events?.map((e) => toText(e)) || [];
149
173
  return {
150
174
  content: [{ type: "text", text: (0, js_yaml_1.dump)(eventsContent, DUMP_OPTIONS) }],
151
175
  };
@@ -12,11 +12,6 @@ exports.crashlyticsTools = [
12
12
  events_1.list_events,
13
13
  events_1.batch_get_events,
14
14
  notes_1.list_notes,
15
- reports_1.get_top_issues,
16
- reports_1.get_top_variants,
17
- reports_1.get_top_versions,
18
- reports_1.get_top_apple_devices,
19
- reports_1.get_top_android_devices,
20
- reports_1.get_top_operating_systems,
15
+ reports_1.get_report,
21
16
  issues_1.update_issue,
22
17
  ];
@@ -2,11 +2,12 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.update_issue = exports.get_issue = void 0;
4
4
  const zod_1 = require("zod");
5
- const tool_1 = require("../../tool");
5
+ const filters_1 = require("../../../crashlytics/filters");
6
6
  const issues_1 = require("../../../crashlytics/issues");
7
7
  const types_1 = require("../../../crashlytics/types");
8
- const filters_1 = require("../../../crashlytics/filters");
8
+ const tool_1 = require("../../tool");
9
9
  const util_1 = require("../../util");
10
+ const app_id_1 = require("../../resources/guides/app_id");
10
11
  exports.get_issue = (0, tool_1.tool)("crashlytics", {
11
12
  name: "get_issue",
12
13
  description: `Gets data for a Crashlytics issue, which can be used as a starting point for debugging.`,
@@ -22,10 +23,19 @@ exports.get_issue = (0, tool_1.tool)("crashlytics", {
22
23
  requiresAuth: true,
23
24
  },
24
25
  }, async ({ appId, issueId }) => {
25
- if (!appId)
26
- return (0, util_1.mcpError)(`Must specify 'appId' parameter.`);
27
- if (!issueId)
28
- return (0, util_1.mcpError)(`Must specify 'issueId' parameter.`);
26
+ const result = { content: [] };
27
+ if (!appId) {
28
+ result.isError = true;
29
+ result.content.push({ type: "text", text: "Must specify 'appId' parameter" });
30
+ result.content.push({ type: "text", text: app_id_1.RESOURCE_CONTENT });
31
+ }
32
+ if (!issueId) {
33
+ result.isError = true;
34
+ result.content.push({ type: "text", text: "Must specify 'issueId' parameter." });
35
+ }
36
+ if (result.content.length > 0) {
37
+ return result;
38
+ }
29
39
  return (0, util_1.toContent)(await (0, issues_1.getIssue)(appId, issueId));
30
40
  });
31
41
  exports.update_issue = (0, tool_1.tool)("crashlytics", {
@@ -46,11 +56,22 @@ exports.update_issue = (0, tool_1.tool)("crashlytics", {
46
56
  requiresAuth: true,
47
57
  },
48
58
  }, async ({ appId, issueId, state }) => {
49
- if (!appId)
50
- return (0, util_1.mcpError)(`Must specify 'app_id' parameter.`);
51
- if (!issueId)
52
- return (0, util_1.mcpError)(`Must specify 'issue_id' parameter.`);
53
- if (!state)
54
- return (0, util_1.mcpError)(`Must specify 'state' parameter.`);
59
+ const result = { content: [] };
60
+ if (!appId) {
61
+ result.isError = true;
62
+ result.content.push({ type: "text", text: "Must specify 'appId' parameter" });
63
+ result.content.push({ type: "text", text: app_id_1.RESOURCE_CONTENT });
64
+ }
65
+ if (!issueId) {
66
+ result.isError = true;
67
+ result.content.push({ type: "text", text: "Must specify 'issueId' parameter." });
68
+ }
69
+ if (!state) {
70
+ result.isError = true;
71
+ result.content.push({ type: "text", text: "Must specify 'state' parameter" });
72
+ }
73
+ if (result.content.length > 0) {
74
+ return result;
75
+ }
55
76
  return (0, util_1.toContent)(await (0, issues_1.updateIssue)(appId, issueId, state));
56
77
  });