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
package/lib/mcp/errors.js CHANGED
@@ -1,6 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.mcpAuthError = exports.noProjectDirectory = exports.requireGeminiToS = exports.NO_PROJECT_ERROR = void 0;
3
+ exports.NO_PROJECT_ERROR = void 0;
4
+ exports.requireGeminiToS = requireGeminiToS;
5
+ exports.noProjectDirectory = noProjectDirectory;
6
+ exports.mcpAuthError = mcpAuthError;
4
7
  const util_1 = require("./util");
5
8
  const ensureApis_1 = require("../dataconnect/ensureApis");
6
9
  exports.NO_PROJECT_ERROR = (0, util_1.mcpError)("To proceed requires an active project. Use the `firebase_update_environment` tool to set a project ID", "PRECONDITION_FAILED");
@@ -15,11 +18,9 @@ async function requireGeminiToS(projectId) {
15
18
  }
16
19
  return undefined;
17
20
  }
18
- exports.requireGeminiToS = requireGeminiToS;
19
21
  function noProjectDirectory(projectRoot) {
20
22
  return (0, util_1.mcpError)(`The current project directory '${projectRoot || "<NO PROJECT DIRECTORY FOUND>"}' does not exist. Please use the 'update_firebase_environment' tool to target a different project directory.`);
21
23
  }
22
- exports.noProjectDirectory = noProjectDirectory;
23
24
  function mcpAuthError(skipADC) {
24
25
  if (skipADC) {
25
26
  return (0, util_1.mcpError)(`The user is not currently logged into the Firebase CLI, which is required to use this tool. Please run the 'firebase_login' tool to log in.`);
@@ -27,4 +28,3 @@ function mcpAuthError(skipADC) {
27
28
  return (0, util_1.mcpError)(`The user is not currently logged into the Firebase CLI, which is required to use this tool. Please run the 'firebase_login' tool to log in, or instruct the user to configure [Application Default Credentials][ADC] on their machine.
28
29
  [ADC]: https://cloud.google.com/docs/authentication/application-default-credentials`);
29
30
  }
30
- exports.mcpAuthError = mcpAuthError;
package/lib/mcp/index.js CHANGED
@@ -39,15 +39,14 @@ const orderedLogLevels = [
39
39
  ];
40
40
  class FirebaseMcpServer {
41
41
  async trackGA4(event, params = {}) {
42
- var _a, _b;
43
42
  if (!this.clientInfo)
44
43
  await (0, timeout_1.timeoutFallback)(this.ready(), null, 2000);
45
44
  const clientInfoParams = {
46
- mcp_client_name: ((_a = this.clientInfo) === null || _a === void 0 ? void 0 : _a.name) || "<unknown-client>",
47
- mcp_client_version: ((_b = this.clientInfo) === null || _b === void 0 ? void 0 : _b.version) || "<unknown-version>",
45
+ mcp_client_name: this.clientInfo?.name || "<unknown-client>",
46
+ mcp_client_version: this.clientInfo?.version || "<unknown-version>",
48
47
  gemini_cli_extension: process.env.IS_GEMINI_CLI_EXTENSION ? "true" : "false",
49
48
  };
50
- return (0, track_1.trackGA4)(event, Object.assign(Object.assign({}, params), clientInfoParams));
49
+ return (0, track_1.trackGA4)(event, { ...params, ...clientInfoParams });
51
50
  }
52
51
  constructor(options) {
53
52
  this._ready = false;
@@ -72,17 +71,16 @@ class FirebaseMcpServer {
72
71
  this.server.setRequestHandler(types_js_1.ListResourcesRequestSchema, this.mcpListResources.bind(this));
73
72
  this.server.setRequestHandler(types_js_1.ReadResourceRequestSchema, this.mcpReadResource.bind(this));
74
73
  const onInitialized = () => {
75
- var _a, _b;
76
74
  const clientInfo = this.server.getClientVersion();
77
75
  this.clientInfo = clientInfo;
78
- if (clientInfo === null || clientInfo === void 0 ? void 0 : clientInfo.name) {
76
+ if (clientInfo?.name) {
79
77
  void this.trackGA4("mcp_client_connected");
80
78
  }
81
- if (!((_a = this.clientInfo) === null || _a === void 0 ? void 0 : _a.name))
79
+ if (!this.clientInfo?.name)
82
80
  this.clientInfo = { name: "<unknown-client>" };
83
81
  this._ready = true;
84
82
  while (this._readyPromises.length) {
85
- (_b = this._readyPromises.pop()) === null || _b === void 0 ? void 0 : _b.resolve();
83
+ this._readyPromises.pop()?.resolve();
86
84
  }
87
85
  };
88
86
  this.server.oninitialized = () => {
@@ -102,8 +100,7 @@ class FirebaseMcpServer {
102
100
  });
103
101
  }
104
102
  get clientName() {
105
- var _a, _b;
106
- return (_b = (_a = this.clientInfo) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : ((0, env_1.isFirebaseStudio)() ? "Firebase Studio" : "<unknown-client>");
103
+ return this.clientInfo?.name ?? ((0, env_1.isFirebaseStudio)() ? "Firebase Studio" : "<unknown-client>");
107
104
  }
108
105
  get clientConfigKey() {
109
106
  return `mcp.clientConfigs.${this.clientName}:${this.startupRoot || process.cwd()}`;
@@ -113,7 +110,7 @@ class FirebaseMcpServer {
113
110
  }
114
111
  updateStoredClientConfig(update) {
115
112
  const config = configstore_1.configstore.get(this.clientConfigKey) || {};
116
- const newConfig = Object.assign(Object.assign({}, config), update);
113
+ const newConfig = { ...config, ...update };
117
114
  configstore_1.configstore.set(this.clientConfigKey, newConfig);
118
115
  return newConfig;
119
116
  }
@@ -131,8 +128,7 @@ class FirebaseMcpServer {
131
128
  return this.cachedProjectDir;
132
129
  }
133
130
  async detectActiveFeatures() {
134
- var _a;
135
- if ((_a = this.detectedFeatures) === null || _a === void 0 ? void 0 : _a.length)
131
+ if (this.detectedFeatures?.length)
136
132
  return this.detectedFeatures;
137
133
  this.logger.debug("detecting active features of Firebase MCP server...");
138
134
  const projectId = (await this.getProjectId()) || "";
@@ -171,8 +167,7 @@ class FirebaseMcpServer {
171
167
  return `http://${host}:${emulatorInfo.port}`;
172
168
  }
173
169
  async getAvailableTools() {
174
- var _a;
175
- const features = ((_a = this.activeFeatures) === null || _a === void 0 ? void 0 : _a.length) ? this.activeFeatures : this.detectedFeatures;
170
+ const features = this.activeFeatures?.length ? this.activeFeatures : this.detectedFeatures;
176
171
  const projectId = (await this.getProjectId()) || "";
177
172
  const accountEmail = await this.getAuthenticatedUser();
178
173
  const isBillingEnabled = projectId ? await (0, cloudbilling_1.checkBillingEnabled)(projectId) : false;
@@ -184,8 +179,7 @@ class FirebaseMcpServer {
184
179
  return tools.find((t) => t.mcp.name === name) || null;
185
180
  }
186
181
  async getAvailablePrompts() {
187
- var _a;
188
- const features = ((_a = this.activeFeatures) === null || _a === void 0 ? void 0 : _a.length) ? this.activeFeatures : this.detectedFeatures;
182
+ const features = this.activeFeatures?.length ? this.activeFeatures : this.detectedFeatures;
189
183
  const projectId = (await this.getProjectId()) || "";
190
184
  const accountEmail = await this.getAuthenticatedUser();
191
185
  const isBillingEnabled = projectId ? await (0, cloudbilling_1.checkBillingEnabled)(projectId) : false;
@@ -216,7 +210,7 @@ class FirebaseMcpServer {
216
210
  this.logger.debug("calling requireAuth");
217
211
  const email = await (0, requireAuth_1.requireAuth)(await this.resolveOptions(), skipAutoAuth);
218
212
  this.logger.debug(`detected authenticated account: ${email || "<none>"}`);
219
- return email !== null && email !== void 0 ? email : (skipAutoAuth ? null : "Application Default Credentials");
213
+ return email ?? (skipAutoAuth ? null : "Application Default Credentials");
220
214
  }
221
215
  catch (e) {
222
216
  this.logger.debug(`error in requireAuth: ${e}`);
@@ -261,29 +255,28 @@ class FirebaseMcpServer {
261
255
  };
262
256
  }
263
257
  async mcpCallTool(request) {
264
- var _a, _b, _c, _d;
265
258
  await this.detectProjectRoot();
266
259
  const toolName = request.params.name;
267
260
  const toolArgs = request.params.arguments;
268
261
  const tool = await this.getTool(toolName);
269
262
  if (!tool)
270
263
  throw new Error(`Tool '${toolName}' could not be found.`);
271
- if (!((_a = tool.mcp._meta) === null || _a === void 0 ? void 0 : _a.optionalProjectDir)) {
264
+ if (!tool.mcp._meta?.optionalProjectDir) {
272
265
  if (!this.cachedProjectDir || !(0, node_fs_1.existsSync)(this.cachedProjectDir)) {
273
266
  return (0, errors_1.noProjectDirectory)(this.cachedProjectDir);
274
267
  }
275
268
  }
276
269
  let projectId = await this.getProjectId();
277
- if (((_b = tool.mcp._meta) === null || _b === void 0 ? void 0 : _b.requiresProject) && !projectId) {
270
+ if (tool.mcp._meta?.requiresProject && !projectId) {
278
271
  return errors_1.NO_PROJECT_ERROR;
279
272
  }
280
273
  projectId = projectId || "";
281
274
  const skipAutoAuthForStudio = (0, env_1.isFirebaseStudio)();
282
275
  const accountEmail = await this.getAuthenticatedUser(skipAutoAuthForStudio);
283
- if (((_c = tool.mcp._meta) === null || _c === void 0 ? void 0 : _c.requiresAuth) && !accountEmail) {
276
+ if (tool.mcp._meta?.requiresAuth && !accountEmail) {
284
277
  return (0, errors_1.mcpAuthError)(skipAutoAuthForStudio);
285
278
  }
286
- if ((_d = tool.mcp._meta) === null || _d === void 0 ? void 0 : _d.requiresGemini) {
279
+ if (tool.mcp._meta?.requiresGemini) {
287
280
  const err = await (0, errors_1.requireGeminiToS)(projectId);
288
281
  if (err)
289
282
  return err;
package/lib/mcp/prompt.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.prompt = void 0;
3
+ exports.prompt = prompt;
4
4
  const availability_1 = require("./util/availability");
5
5
  function prompt(feature, options, fn, isAvailable) {
6
6
  const isAvailableFunc = isAvailable || (0, availability_1.getDefaultFeatureAvailabilityCheck)(feature);
@@ -10,4 +10,3 @@ function prompt(feature, options, fn, isAvailable) {
10
10
  isAvailable: isAvailableFunc,
11
11
  };
12
12
  }
13
- exports.prompt = prompt;
@@ -19,7 +19,6 @@ exports.consult = (0, prompt_1.prompt)("core", {
19
19
  title: "Consult Firebase Assistant",
20
20
  },
21
21
  }, async ({ prompt }, { config, projectId }) => {
22
- var _a, _b, _c;
23
22
  const gifTosError = await (0, errors_1.requireGeminiToS)(projectId);
24
23
  if (gifTosError) {
25
24
  return [
@@ -27,7 +26,7 @@ exports.consult = (0, prompt_1.prompt)("core", {
27
26
  role: "user",
28
27
  content: {
29
28
  type: "text",
30
- text: `Missing required conditions to run this prompt:\n\n${(_a = gifTosError.content[0]) === null || _a === void 0 ? void 0 : _a.text}\n\nPlease ask the user if they would like to accept these terms of service before proceeding. If they decline, inform them that this operation cannot continue without their acceptance.`,
29
+ text: `Missing required conditions to run this prompt:\n\n${gifTosError.content[0]?.text}\n\nPlease ask the user if they would like to accept these terms of service before proceeding. If they decline, inform them that this operation cannot continue without their acceptance.`,
31
30
  },
32
31
  },
33
32
  ];
@@ -39,7 +38,7 @@ App Platform(s): ${platforms.join(", ")}
39
38
 
40
39
  Question: ${prompt}`;
41
40
  const result = await (0, fdcExperience_1.chatWithFirebase)(gifPrompt, projectId);
42
- const outputString = (_c = (_b = result.output.messages) === null || _b === void 0 ? void 0 : _b[0].content) !== null && _c !== void 0 ? _c : "";
41
+ const outputString = result.output.messages?.[0].content ?? "";
43
42
  return [
44
43
  {
45
44
  role: "user",
@@ -2,145 +2,38 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.connect = void 0;
4
4
  const prompt_1 = require("../../prompt");
5
+ const crashlytics_connect_1 = require("../../resources/guides/crashlytics_connect");
5
6
  exports.connect = (0, prompt_1.prompt)("crashlytics", {
6
7
  name: "connect",
7
8
  omitPrefix: false,
8
- description: "Access a Firebase application's Crashlytics data.",
9
+ description: "Use this command to access a Firebase application's Crashlytics data.",
9
10
  annotations: {
10
11
  title: "Access Crashlytics data",
11
12
  },
12
13
  }, async (unused, { accountEmail, firebaseCliCommand }) => {
14
+ const loggedInInstruction = `
15
+ **The user is logged into Firebase as ${accountEmail || ""}.
16
+ `.trim();
17
+ const notLoggedInInstruction = `
18
+ **Instruct the User to Log In**
19
+ The user is not logged in to Firebase. None of the Crashlytics tools will be able to authenticate until the user has logged in. Instruct the user to run \`${firebaseCliCommand} login\` before continuing, then use the \`firebase_get_environment\` tool to verify that the user is logged in.
20
+ `.trim();
13
21
  return [
14
22
  {
15
23
  role: "user",
16
24
  content: {
17
25
  type: "text",
18
26
  text: `
19
- You are going to help a developer prioritize and fix issues in their
20
- mobile application by accessing their Firebase Crashlytics data.
27
+ You will assist developers in investigating and resolving mobile application issues by leveraging Firebase Crashlytics data.
21
28
 
22
- Active user: ${accountEmail || "<NONE>"}
29
+ ### Required First Steps
23
30
 
24
- General rules:
25
- **ASK THE USER WHAT THEY WOULD LIKE TO DO BEFORE TAKING ACTION**
26
- **ASK ONLY ONE QUESTION OF THE USER AT A TIME**
27
- **MAKE SURE TO FOLLOW THE INSTRUCTIONS, ESPECIALLY WHERE THEY ASK YOU TO CHECK IN WITH THE USER**
28
- **ADHERE TO SUGGESTED FORMATTING**
31
+ ${accountEmail ? loggedInInstruction : notLoggedInInstruction}
29
32
 
30
- ## Required first steps! Absolutely required! Incredibly important!
33
+ **Obtain the Firebase App ID.**
34
+ If an App ID is not readily available, consult this guide for selection: [Firebase App Id Guide](firebase://guides/app_id).
31
35
 
32
- 1. **Make sure the user is logged in. No Crashlytics tools will work if the user is not logged in.**
33
- a. Use the \`firebase_get_environment\` tool to verify that the user is logged in.
34
- b. If the Firebase 'Active user' is set to <NONE>, instruct the user to run \`${firebaseCliCommand} login\`
35
- before continuing. Ignore other fields that are set to <NONE>. We are just making sure the
36
- user is logged in.
37
-
38
- 2. **Get the app ID for the Firebase application.**
39
- a. **PRIORITIZE REMEMBERED APP ID ENTRIES** If an entry for this directory exists in the remembered app ids, use the remembered app id
40
- for this directory without presenting any additional options.
41
- i. If there are multiple remembered app ids for this directory, ask the user to choose one by providing
42
- a numbered list of all the package names. Tell them that these values came from memories and how they can modify those values.
43
- b. **IF THERE IS NO REMEMBERED ENTRY FOR THIS DIRECTORY** Use the app IDs from the \`firebase_get_environment\` tool.
44
- i. If you've already called this tool, use the previous response from context.
45
- ii. If the 'Detected App IDs' is set to <NONE>, ask the user for the value they want to use.
46
- iii. If there are multiple 'Detected App IDs', ask the user to choose one by providing
47
- a numbered list of all the package names and app ids.
48
- c. **IF THERE IS A REMEMBERED VALUE BUT IT DOES NOT MATCH ANY DETECTED APP IDS** Ask if the user would like to replace the value with one of
49
- the detected values.
50
- i. **Description:** A valid app ID to remember contains four colon (":") delimited parts: a version
51
- number (typically "1"), a project number, a platform type ("android", "ios", or "web"),
52
- and a sequence of hexadecimal characters.
53
- ii. Replace the value for this directory with this valid app id, the android package name or ios bundle identifier, and the project directory.
54
- c. **IF THERE IS NO REMEMBERED ENTRY FOR THIS DIRECTORY** Ask if the user would like to remember the app id selection
55
- i. **Description:** A valid app ID to remember contains four colon (":") delimited parts: a version
56
- number (typically "1"), a project number, a platform type ("android", "ios", or "web"),
57
- and a sequence of hexadecimal characters.
58
- ii. Store the valid app id value, the android package name or ios bundle identifier, and the project directory.
59
-
60
- ## Next steps
61
-
62
- Once you have confirmed that the user is logged in to Firebase, confirmed the
63
- id for the application that they want to access, and asked if they want to remember the app id for this directory,
64
- ask the user what actions they would like to perform.
65
-
66
- Use the following format to ask the user what actions they would like to perform:
67
-
68
- 1. Prioritize the most impactful stability issues
69
- 2. Diagnose and propose a fix for a crash
70
-
71
- Wait for their response before taking action.
72
-
73
- ## Instructions for Using Crashlytics Data
74
-
75
- ### How to prioritize issues
76
-
77
- Follow these steps to fetch issues and prioritize them.
78
-
79
- 1. Use the 'crashlytics_get_top_issues' tool to fetch up to 20 issues.
80
- 1a. Analyze the user's query and apply the appropriate filters.
81
- 1b. If the user asks for crashes, then set the issueErrorType filter to *FATAL*.
82
- 1c. If the user asks about a particular time range, then set both the intervalStartTime and intervalEndTime.
83
- 2. Use the 'crashlytics_get_top_versions' tool to fetch the top versions for this app.
84
- 3. If the user instructions include statements about prioritization, use those instructions.
85
- 4. If the user instructions do not include statements about prioritization,
86
- then prioritize the returned issues using the following criteria:
87
- 4a. The app versions for the issue include the most recent version of the app.
88
- 4b. The number of users experiencing the issue across variants
89
- 4c. The volume of crashes
90
- 5. Return the top 5 issues, with a brief description each in a numerical list with the following format:
91
- 1. Issue <issue id>
92
- * <the issue title>
93
- * <the issue subtitle>
94
- * **Description:** <a discription of the issue based on information from the tool response>
95
- * **Rationale:** <the reason this issue was prioritized in the way it was>
96
- 6. Ask the user if they would like to diagnose and fix any of the issues presented
97
-
98
- ### How to diagnose and fix issues
99
-
100
- Follow these steps to diagnose and fix issues.
101
-
102
- 1. Make sure you have a good understanding of the code structure and where different functionality exists
103
- 2. Use the 'crashlytics_get_issue' tool to get more context on the issue.
104
- 3. Use the 'crashlytics_batch_get_events' tool to get an example crash for this issue. Use the event names in the sampleEvent fields.
105
- 3a. If you need to read more events, use the 'crashlytics_list_events' tool.
106
- 3b. Apply the same filtering criteria that you used to find the issue, so that you find a appropriate events.
107
- 4. Read the files that exist in the stack trace of the issue to understand the crash deeply.
108
- 5. Determine possible root causes for the crash - no more than 5 potential root causes.
109
- 6. Critique your own determination, analyzing how plausible each scenario is given the crash details.
110
- 7. Choose the most likely root cause given your analysis.
111
- 8. Write out a plan for the most likely root cause using the following criteria:
112
- 8a. Write out a description of the issue and including
113
- * A brief description of the cause of the issue
114
- * A determination of your level of confidence in the cause of the issue using your analysis.
115
- * A determination of which library is at fault, this codebase or a dependent library
116
- * A determination for how complex the fix will be
117
- 8b. The plan should include relevant files to change
118
- 8c. The plan should include a test plan for how the user might verify the fix
119
- 8d. Use the following format for the plan:
120
-
121
- ## Cause
122
- <A description of the root cause leading to the issue>
123
- - **Fault**: <a determination of whether this code base is at fault or a dependent library is at fault>
124
- - **Complexity**: <one of "simple", "moderately simple", "moderately hard", "hard", "oof, I don't know where to start">
125
-
126
- ## Fix
127
- <A description of the fix for this issue and a break down of the changes.>
128
- 1. <Step 1>
129
- 2. <Step 2>
130
-
131
- ## Test
132
- <A plan for how to test that the issue has been fixed and protect against regressions>
133
- 1. <Test case 1>
134
- 2. <Test case 2>
135
-
136
- ## Other potential causes
137
- 1. <Another possible root cause>
138
- 2. <Another possible root cause>
139
-
140
- 9. Present the plan to the user and get approval before making the change.
141
- 10. Only if they approve the plan, create a fix for the issue.
142
- 10a. Be mindful of API contracts and do not add fields to resources without a clear way to populate those fields
143
- 10b. If there is not enough information in the crash report to find a root cause, describe why you cannot fix the issue instead of making a guess.
36
+ ${crashlytics_connect_1.RESOURCE_CONTENT}
144
37
  `.trim(),
145
38
  },
146
39
  },
@@ -7,15 +7,15 @@ const types_1 = require("../../../dataconnect/types");
7
7
  const content_1 = require("../../util/dataconnect/content");
8
8
  const compile_1 = require("../../util/dataconnect/compile");
9
9
  function renderServices(fdcServices) {
10
- var _a;
11
10
  if (!fdcServices.length)
12
11
  return "Data Connect Status: <UNCONFIGURED>";
13
12
  return `\n\n## Data Connect Schema
14
13
 
15
14
  The following is the up-to-date content of existing schema files (their paths are relative to the Data Connect source directory).
16
15
 
17
- ${(_a = (0, types_1.mainSchema)(fdcServices[0].schemas)
18
- .source.files) === null || _a === void 0 ? void 0 : _a.map((f) => `\`\`\`graphql ${f.path}\n${f.content}\n\`\`\``).join("\n\n")}`;
16
+ ${(0, types_1.mainSchema)(fdcServices[0].schemas)
17
+ .source.files?.map((f) => `\`\`\`graphql ${f.path}\n${f.content}\n\`\`\``)
18
+ .join("\n\n")}`;
19
19
  }
20
20
  function renderErrors(errors) {
21
21
  return `\n\n## Current Schema Build Errors\n\n${errors || "<NO ERRORS>"}`;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.markdownDocsOfPrompts = exports.availablePrompts = void 0;
3
+ exports.availablePrompts = availablePrompts;
4
+ exports.markdownDocsOfPrompts = markdownDocsOfPrompts;
4
5
  const core_1 = require("./core");
5
6
  const dataconnect_1 = require("./dataconnect");
6
7
  const crashlytics_1 = require("./crashlytics");
@@ -21,8 +22,8 @@ const prompts = {
21
22
  };
22
23
  function namespacePrompts(promptsToNamespace, feature) {
23
24
  return promptsToNamespace.map((p) => {
24
- const newPrompt = Object.assign({}, p);
25
- newPrompt.mcp = Object.assign({}, p.mcp);
25
+ const newPrompt = { ...p };
26
+ newPrompt.mcp = { ...p.mcp };
26
27
  if (newPrompt.mcp.omitPrefix) {
27
28
  }
28
29
  else if (feature === "core") {
@@ -31,7 +32,7 @@ function namespacePrompts(promptsToNamespace, feature) {
31
32
  else {
32
33
  newPrompt.mcp.name = `${feature}:${p.mcp.name}`;
33
34
  }
34
- newPrompt.mcp._meta = Object.assign(Object.assign({}, p.mcp._meta), { feature });
35
+ newPrompt.mcp._meta = { ...p.mcp._meta, feature };
35
36
  return newPrompt;
36
37
  });
37
38
  }
@@ -45,10 +46,9 @@ async function availablePrompts(ctx, activeFeatures) {
45
46
  }));
46
47
  return allPrompts.filter((_, i) => availabilities[i]);
47
48
  }
48
- exports.availablePrompts = availablePrompts;
49
49
  function getAllPrompts(activeFeatures) {
50
50
  const promptDefs = [];
51
- if (!(activeFeatures === null || activeFeatures === void 0 ? void 0 : activeFeatures.length)) {
51
+ if (!activeFeatures?.length) {
52
52
  activeFeatures = Object.keys(prompts);
53
53
  }
54
54
  if (!activeFeatures.includes("core")) {
@@ -60,15 +60,14 @@ function getAllPrompts(activeFeatures) {
60
60
  return promptDefs;
61
61
  }
62
62
  function markdownDocsOfPrompts() {
63
- var _a, _b;
64
63
  const allPrompts = getAllPrompts();
65
64
  let doc = `
66
65
  | Prompt Name | Feature Group | Description |
67
66
  | ----------- | ------------- | ----------- |`;
68
67
  for (const prompt of allPrompts) {
69
- const feature = ((_a = prompt.mcp._meta) === null || _a === void 0 ? void 0 : _a.feature) || "";
68
+ const feature = prompt.mcp._meta?.feature || "";
70
69
  let description = prompt.mcp.description || "";
71
- if ((_b = prompt.mcp.arguments) === null || _b === void 0 ? void 0 : _b.length) {
70
+ if (prompt.mcp.arguments?.length) {
72
71
  const argsList = prompt.mcp.arguments.map((arg) => ` <br>&lt;${arg.name}&gt;${arg.required ? "" : " (optional)"}: ${arg.description || ""}`);
73
72
  description += ` <br><br>Arguments:${argsList.join("")}`;
74
73
  }
@@ -78,4 +77,3 @@ function markdownDocsOfPrompts() {
78
77
  }
79
78
  return doc;
80
79
  }
81
- exports.markdownDocsOfPrompts = markdownDocsOfPrompts;
@@ -1,27 +1,16 @@
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.resourceTemplate = exports.resource = void 0;
3
+ exports.resource = resource;
4
+ exports.resourceTemplate = resourceTemplate;
15
5
  function resource(options, fnOrText) {
16
6
  const fn = typeof fnOrText === "string"
17
7
  ? async (uri) => ({ contents: [{ uri, text: fnOrText }] })
18
8
  : fnOrText;
19
9
  return { mcp: options, fn };
20
10
  }
21
- exports.resource = resource;
22
11
  function resourceTemplate(options, fnOrText) {
23
12
  let matchFn;
24
- const { match } = options, mcp = __rest(options, ["match"]);
13
+ const { match, ...mcp } = options;
25
14
  if (match instanceof RegExp) {
26
15
  matchFn = (uri) => match.test(uri);
27
16
  }
@@ -36,4 +25,3 @@ function resourceTemplate(options, fnOrText) {
36
25
  : fnOrText;
37
26
  return { mcp, match: matchFn, fn };
38
27
  }
39
- exports.resourceTemplate = resourceTemplate;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.app_id = exports.RESOURCE_CONTENT = void 0;
4
+ const resource_1 = require("../../resource");
5
+ exports.RESOURCE_CONTENT = `
6
+ ### Firebase App ID
7
+ The Firebase App ID is used to identify a mobile or web client application to Firebase back end services such as Crashlytics or Remote Config. Use the information below to find the developer's App ID.
8
+
9
+ 1. **PRIORITIZE REMEMBERED APP ID ENTRIES** If an entry for this directory exists in the remembered app ids, use the remembered app id
10
+ for this directory without presenting any additional options.
11
+ i. If there are multiple remembered app ids for this directory, ask the user to choose one by providing
12
+ a numbered list of all the package names. Tell them that these values came from memories and how they can modify those values.
13
+ 2. **IF THERE IS NO REMEMBERED ENTRY FOR THIS DIRECTORY** Use the app IDs from the \`firebase_get_environment\` tool.
14
+ i. If you've already called this tool, use the previous response from context.
15
+ ii. If the 'Detected App IDs' is set to <NONE>, ask the user for the value they want to use.
16
+ iii. If there are multiple 'Detected App IDs', ask the user to choose one by providing
17
+ a numbered list of all the package names and app ids.
18
+ 3. **IF THERE IS A REMEMBERED VALUE BUT IT DOES NOT MATCH ANY DETECTED APP IDS** Ask if the user would like to replace the value with one of
19
+ the detected values.
20
+ i. **Description:** A valid app ID to remember contains four colon (":") delimited parts: a version
21
+ number (typically "1"), a project number, a platform type ("android", "ios", or "web"),
22
+ and a sequence of hexadecimal characters.
23
+ ii. Replace the value for this directory with this valid app id, the android package name or ios bundle identifier, and the project directory.
24
+ 4. **IF THERE IS NO REMEMBERED ENTRY FOR THIS DIRECTORY** Ask if the user would like to remember the app id selection
25
+ i. **Description:** A valid app ID to remember contains four colon (":") delimited parts: a version
26
+ number (typically "1"), a project number, a platform type ("android", "ios", or "web"),
27
+ and a sequence of hexadecimal characters.
28
+ ii. Store the valid app id value, the android package name or ios bundle identifier, and the project directory.
29
+ `.trim();
30
+ exports.app_id = (0, resource_1.resource)({
31
+ uri: "firebase://guides/app_id",
32
+ name: "app_id_guide",
33
+ title: "Firebase App Id Guide",
34
+ description: "guides the coding agent through choosing a Firebase App ID in the current project",
35
+ }, async (uri) => {
36
+ return {
37
+ contents: [{ uri, type: "text", text: exports.RESOURCE_CONTENT }],
38
+ };
39
+ });
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.crashlytics_connect = exports.RESOURCE_CONTENT = void 0;
4
+ const resource_1 = require("../../resource");
5
+ exports.RESOURCE_CONTENT = `
6
+ ### Instructions for Working with Firebase Crashlytics Tools
7
+
8
+ When working interactively with a user, only ask the one question at a time. Do not proceed without user instructions. Upon receiving user instructions, refer to the relevant resources for guidance.
9
+
10
+ Use the \`firebase_read_resources\` tool to access the following guides.
11
+
12
+ 1. [Firebase App Id Guide](firebase://guides/app_id)
13
+ This guide provides crucial instructions for obtaining the application's App Id which is required for all API calls.
14
+
15
+ 2. [Firebase Crashlytics Reports Guide](firebase://guides/crashlytics/reports)
16
+ This guide details how to request and use aggregated numerical data from Crashlytics. The agent should read this guide before requesting any report.
17
+
18
+ 3. [Firebase Crashlytics Issues Guide](firebase://guides/crashlytics/issues)
19
+ This guide details how to work with issues within Crashlytics. The agent should read this guide before prioritizing issues or presenting issue data to the user.
20
+
21
+ 4. [Investigating Crashlytics Issues Guide](firebase://guides/crashlytics/investigations)
22
+ This guide provides instructions on investigating the root causes of crashes and exceptions reported in Crashlytics issues.
23
+
24
+ ### How to Check That You Are Connected
25
+
26
+ Verify that you can read the app's Crashlytics data by getting the topVersions report. This report will tell you which app versions have the most events.
27
+ a. Read the firebase://guides/app_id if you need to find the app_id.
28
+ b. Call the \`crashlytics_get_report\` tool to read the \`topVersions\` report.
29
+ c. Help the user resolve any issues that arise when trying to connect.
30
+
31
+ After confirming that you can access Crashlytics, ask the user what they would like help with. Your capabilities include:
32
+
33
+ - *Reading Crashlytics reports to prioritize or find important issues.*
34
+ Before fetching reports, read the critical instructions for the \`crashlytics_get_report\` tool in the [Firebase Crashlytics Reports Guide](firebase://guides/crashlytics/reports).
35
+
36
+ - *Investigating bug reports using Crashlytics event data.*
37
+ Before attempting to investigate an individual issue, read the [Investigating Crashlytics Issues Guide](firebase://guides/crashlytics/investigations) to understand the best practices for debugging issues.
38
+
39
+ - *Proposing code changes to resolve identified bugs.*
40
+
41
+ `.trim();
42
+ exports.crashlytics_connect = (0, resource_1.resource)({
43
+ uri: "firebase://guides/crashlytics/connect",
44
+ name: "crashlytics_connect_guide",
45
+ title: "Firebase Crashlytics Connect Guide",
46
+ description: "Guides the coding agent to connect to Firebase Crashlytics.",
47
+ }, async (uri) => {
48
+ return {
49
+ contents: [{ uri, type: "text", text: exports.RESOURCE_CONTENT }],
50
+ };
51
+ });
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.crashlytics_investigations = void 0;
4
+ const resource_1 = require("../../resource");
5
+ const RESOURCE_CONTENT = `
6
+ ### How to Diagnose and Fix Crashlytics Issues
7
+
8
+ Follow these steps to diagnose bugs and and propose fixes for issues.
9
+
10
+ 1. Make sure you have a good understanding of the code structure and where different functionality exists.
11
+ 2. Use the 'crashlytics_get_issue' tool to get more context on the issue.
12
+ 3. Use the 'crashlytics_batch_get_events' tool to get an example crash for this issue. Use the event names in the sampleEvent fields.
13
+ 3a. If you need to read more events, use the 'crashlytics_list_events' tool.
14
+ 3b. Apply the same filtering criteria that you used to find the issue, so that you find a appropriate events.
15
+ 4. Read the files that exist in the stack trace of the issue to understand the crash deeply.
16
+ 5. Determine possible root causes for the crash - no more than 5 potential root causes.
17
+ 6. Critique your own determination, analyzing how plausible each scenario is given the crash details.
18
+ 7. Choose the most likely root cause given your analysis.
19
+ 8. Create a plan for the most likely root cause using the following format for the plan:
20
+
21
+ ## Cause
22
+ <A description of the root cause leading to the issue>
23
+ - **Fault**: <a determination of whether this code base is at fault or a dependent library is at fault>
24
+ - **Complexity**: <one of "simple", "moderately simple", "moderately hard", "hard", "oof, I don't know where to start">
25
+
26
+ ## Fix
27
+ <A description of the fix for this issue and a break down of the changes.>
28
+ 1. <Step 1>
29
+ 2. <Step 2>
30
+
31
+ ## Test
32
+ <A plan for how to test that the issue has been fixed and protect against regressions>
33
+ 1. <Test case 1>
34
+ 2. <Test case 2>
35
+
36
+ ## Other potential causes
37
+ 1. <Another possible root cause>
38
+ 2. <Another possible root cause>
39
+
40
+ 9. If there is not enough information in the crash report to find a root cause, describe why you cannot fix the issue instead of making a guess.
41
+ `.trim();
42
+ exports.crashlytics_investigations = (0, resource_1.resource)({
43
+ uri: "firebase://guides/crashlytics/investigations",
44
+ name: "crashlytics_investigations_guide",
45
+ title: "Firebase Crashlytics Investigations Guide",
46
+ description: "Guides the coding agent when investigating bugs reported in Crashlytics issues, including procedures for diagnosing and fixing crashes.",
47
+ }, async (uri) => {
48
+ return {
49
+ contents: [{ uri, type: "text", text: RESOURCE_CONTENT }],
50
+ };
51
+ });