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.
- package/lib/accountExporter.js +3 -5
- package/lib/accountImporter.js +4 -5
- package/lib/api.js +3 -3
- package/lib/apiv2.js +9 -13
- package/lib/appUtils.js +19 -21
- package/lib/appdistribution/client.js +4 -8
- package/lib/appdistribution/distribution.js +4 -4
- package/lib/appdistribution/options-parser-util.js +8 -9
- package/lib/appdistribution/types.js +2 -2
- package/lib/appdistribution/yaml_helper.js +33 -17
- package/lib/apphosting/app.js +8 -13
- package/lib/apphosting/backend.js +34 -24
- package/lib/apphosting/config.js +14 -14
- package/lib/apphosting/githubConnections.js +38 -35
- package/lib/apphosting/localbuilds.js +4 -6
- package/lib/apphosting/repo.js +24 -20
- package/lib/apphosting/rollout.js +12 -5
- package/lib/apphosting/secrets/dialogs.js +9 -9
- package/lib/apphosting/secrets/index.js +9 -11
- package/lib/apphosting/utils.js +2 -3
- package/lib/apphosting/yaml.js +12 -11
- package/lib/apptesting/ensureProjectConfigured.js +1 -2
- package/lib/apptesting/invokeTests.js +2 -3
- package/lib/apptesting/parseTestFiles.js +5 -6
- package/lib/apptesting/types.js +2 -2
- package/lib/archiveDirectory.js +1 -2
- package/lib/auth.js +36 -40
- package/lib/bin/cli.js +2 -3
- package/lib/bin/mcp.js +1 -2
- package/lib/checkMinRequiredVersion.js +1 -2
- package/lib/checkValidTargetFilters.js +1 -2
- package/lib/command.js +6 -9
- package/lib/commands/appdistribution-testers-list.js +2 -3
- package/lib/commands/apphosting-backends-list.js +4 -6
- package/lib/commands/apphosting-builds-create.js +2 -3
- package/lib/commands/apphosting-builds-get.js +1 -2
- package/lib/commands/apphosting-rollouts-list.js +1 -2
- package/lib/commands/apps-init.js +1 -1
- package/lib/commands/{apptesting-execute.js → apptesting-wata.js} +3 -4
- package/lib/commands/crashlytics-symbols-upload.js +2 -2
- package/lib/commands/dataconnect-execute.js +4 -4
- package/lib/commands/dataconnect-sdk-generate.js +5 -6
- package/lib/commands/dataconnect-services-list.js +7 -8
- package/lib/commands/dataconnect-sql-diff.js +1 -2
- package/lib/commands/dataconnect-sql-migrate.js +4 -3
- package/lib/commands/dataconnect-sql-setup.js +2 -2
- package/lib/commands/dataconnect-sql-shell.js +5 -1
- package/lib/commands/emulators-start.js +1 -2
- package/lib/commands/ext-configure.js +6 -4
- package/lib/commands/ext-dev-list.js +2 -3
- package/lib/commands/ext-dev-upload.js +2 -2
- package/lib/commands/ext-export.js +1 -1
- package/lib/commands/ext-info.js +2 -3
- package/lib/commands/ext-install.js +5 -7
- package/lib/commands/firestore-backups-list.js +1 -2
- package/lib/commands/firestore-backups-schedules-list.js +1 -2
- package/lib/commands/firestore-indexes-list.js +1 -2
- package/lib/commands/firestore-utils.js +1 -2
- package/lib/commands/functions-artifacts-setpolicy.js +1 -2
- package/lib/commands/functions-config-export.js +2 -3
- package/lib/commands/hosting-channel-deploy.js +2 -2
- package/lib/commands/hosting-clone.js +2 -3
- package/lib/commands/hosting-sites-create.js +1 -1
- package/lib/commands/index.js +2 -3
- package/lib/commands/init.js +4 -5
- package/lib/commands/internaltesting-functions-discover.js +1 -1
- package/lib/commands/login.js +4 -5
- package/lib/commands/logout.js +3 -3
- package/lib/commands/projects-create.js +1 -1
- package/lib/commands/remoteconfig-experiments-list.js +2 -3
- package/lib/commands/remoteconfig-get.js +1 -1
- package/lib/commands/remoteconfig-rollback.js +1 -2
- package/lib/commands/remoteconfig-rollouts-list.js +2 -3
- package/lib/commands/remoteconfig-versions-list.js +3 -4
- package/lib/commands/use.js +3 -3
- package/lib/config.js +4 -5
- package/lib/crashlytics/buildToolsJarHelper.js +3 -5
- package/lib/crashlytics/events.js +4 -7
- package/lib/crashlytics/filters.js +10 -12
- package/lib/crashlytics/issues.js +2 -3
- package/lib/crashlytics/notes.js +3 -4
- package/lib/crashlytics/reports.js +21 -15
- package/lib/crashlytics/types.js +7 -7
- package/lib/crashlytics/utils.js +4 -4
- package/lib/database/api.js +2 -3
- package/lib/database/import.js +4 -4
- package/lib/database/metadata.js +5 -6
- package/lib/database/rulesConfig.js +2 -3
- package/lib/dataconnect/build.js +10 -13
- package/lib/dataconnect/checkIam.js +1 -2
- package/lib/dataconnect/client.js +15 -18
- package/lib/dataconnect/dataplaneClient.js +6 -6
- package/lib/dataconnect/ensureApis.js +2 -3
- package/lib/dataconnect/errors.js +8 -11
- package/lib/dataconnect/filters.js +2 -3
- package/lib/dataconnect/freeTrial.js +3 -4
- package/lib/dataconnect/graphqlError.js +5 -8
- package/lib/dataconnect/load.js +10 -11
- package/lib/dataconnect/names.js +14 -18
- package/lib/dataconnect/prompts.js +1 -2
- package/lib/dataconnect/provisionCloudSql.js +13 -17
- package/lib/dataconnect/schemaMigration.js +60 -27
- package/lib/dataconnect/types.js +10 -12
- package/lib/dataconnect/webhook.js +3 -3
- package/lib/defaultCredentials.js +3 -4
- package/lib/deploy/apphosting/deploy.js +2 -3
- package/lib/deploy/apphosting/prepare.js +3 -5
- package/lib/deploy/apphosting/release.js +1 -1
- package/lib/deploy/apphosting/util.js +1 -2
- package/lib/deploy/database/deploy.js +1 -2
- package/lib/deploy/database/prepare.js +1 -2
- package/lib/deploy/database/release.js +1 -2
- package/lib/deploy/dataconnect/context.js +15 -4
- package/lib/deploy/dataconnect/deploy.js +5 -6
- package/lib/deploy/dataconnect/prepare.js +7 -9
- package/lib/deploy/dataconnect/release.js +7 -10
- package/lib/deploy/extensions/deploy.js +7 -9
- package/lib/deploy/extensions/deploymentSummary.js +6 -7
- package/lib/deploy/extensions/planner.js +15 -18
- package/lib/deploy/extensions/prepare.js +9 -11
- package/lib/deploy/extensions/release.js +10 -12
- package/lib/deploy/extensions/secrets.js +8 -11
- package/lib/deploy/extensions/tasks.js +6 -8
- package/lib/deploy/extensions/v2FunctionHelper.js +2 -3
- package/lib/deploy/extensions/validate.js +1 -2
- package/lib/deploy/firestore/deploy.js +3 -5
- package/lib/deploy/firestore/prepare.js +2 -3
- package/lib/deploy/firestore/release.js +3 -4
- package/lib/deploy/functions/backend.js +52 -42
- package/lib/deploy/functions/build.js +41 -15
- package/lib/deploy/functions/cache/applyHash.js +3 -5
- package/lib/deploy/functions/cache/hash.js +4 -5
- package/lib/deploy/functions/cel.js +3 -3
- package/lib/deploy/functions/checkIam.js +8 -8
- package/lib/deploy/functions/containerCleaner.js +10 -6
- package/lib/deploy/functions/deploy.js +6 -8
- package/lib/deploy/functions/ensure.js +6 -9
- package/lib/deploy/functions/functionsDeployHelper.js +10 -11
- package/lib/deploy/functions/params.js +10 -10
- package/lib/deploy/functions/prepare.js +41 -36
- package/lib/deploy/functions/prepareFunctionsUpload.js +24 -10
- package/lib/deploy/functions/pricing.js +3 -3
- package/lib/deploy/functions/prompts.js +7 -10
- package/lib/deploy/functions/release/executor.js +5 -6
- package/lib/deploy/functions/release/fabricator.js +76 -29
- package/lib/deploy/functions/release/index.js +23 -14
- package/lib/deploy/functions/release/planner.js +15 -14
- package/lib/deploy/functions/release/reporter.js +20 -20
- package/lib/deploy/functions/release/sourceTokenScraper.js +4 -5
- package/lib/deploy/functions/remoteSource.js +3 -4
- package/lib/deploy/functions/runtimes/discovery/index.js +9 -12
- package/lib/deploy/functions/runtimes/discovery/parsing.js +2 -3
- package/lib/deploy/functions/runtimes/discovery/v1alpha1.js +29 -10
- package/lib/deploy/functions/runtimes/index.js +1 -2
- package/lib/deploy/functions/runtimes/node/index.js +18 -9
- package/lib/deploy/functions/runtimes/node/parseRuntimeAndValidateSDK.js +2 -2
- package/lib/deploy/functions/runtimes/node/validate.js +1 -2
- package/lib/deploy/functions/runtimes/node/versioning.js +6 -7
- package/lib/deploy/functions/runtimes/python/index.js +12 -12
- package/lib/deploy/functions/runtimes/supported/index.js +5 -6
- package/lib/deploy/functions/services/auth.js +49 -36
- package/lib/deploy/functions/services/database.js +1 -2
- package/lib/deploy/functions/services/dataconnect.js +16 -2
- package/lib/deploy/functions/services/firebaseAlerts.js +1 -2
- package/lib/deploy/functions/services/firestore.js +3 -5
- package/lib/deploy/functions/services/index.js +2 -2
- package/lib/deploy/functions/services/remoteConfig.js +1 -2
- package/lib/deploy/functions/services/storage.js +3 -5
- package/lib/deploy/functions/services/testLab.js +1 -2
- package/lib/deploy/functions/triggerRegionHelper.js +1 -2
- package/lib/deploy/functions/validate.js +12 -11
- package/lib/deploy/hosting/convertConfig.js +38 -22
- package/lib/deploy/hosting/deploy.js +4 -7
- package/lib/deploy/hosting/hashcache.js +2 -3
- package/lib/deploy/hosting/prepare.js +14 -14
- package/lib/deploy/hosting/release.js +1 -2
- package/lib/deploy/index.js +7 -8
- package/lib/deploy/lifecycleHooks.js +3 -5
- package/lib/deploy/remoteconfig/deploy.js +1 -1
- package/lib/deploy/remoteconfig/functions.js +5 -6
- package/lib/deploy/remoteconfig/prepare.js +2 -3
- package/lib/deploy/remoteconfig/release.js +2 -2
- package/lib/deploy/storage/deploy.js +1 -1
- package/lib/deploy/storage/prepare.js +1 -1
- package/lib/deploy/storage/release.js +1 -1
- package/lib/deploymentTool.js +5 -6
- package/lib/detectProjectRoot.js +1 -2
- package/lib/downloadUtils.js +2 -3
- package/lib/emulator/adminSdkConfig.js +2 -3
- package/lib/emulator/apphosting/config.js +1 -2
- package/lib/emulator/apphosting/developmentServer.js +3 -3
- package/lib/emulator/apphosting/serve.js +20 -14
- package/lib/emulator/auth/cloudFunctions.js +2 -3
- package/lib/emulator/auth/errors.js +2 -2
- package/lib/emulator/auth/handlers.js +3 -4
- package/lib/emulator/auth/index.js +6 -6
- package/lib/emulator/auth/operations.js +171 -129
- package/lib/emulator/auth/server.js +30 -22
- package/lib/emulator/auth/state.js +26 -36
- package/lib/emulator/auth/utils.js +12 -13
- package/lib/emulator/commandUtils.js +20 -20
- package/lib/emulator/controller.js +32 -29
- package/lib/emulator/databaseEmulator.js +1 -2
- package/lib/emulator/dataconnect/pgliteServer.js +48 -104
- package/lib/emulator/dataconnectEmulator.js +6 -9
- package/lib/emulator/download.js +2 -3
- package/lib/emulator/downloadableEmulatorInfo.json +7 -7
- package/lib/emulator/downloadableEmulators.js +49 -24
- package/lib/emulator/emulatorLogger.js +19 -4
- package/lib/emulator/env.js +6 -8
- package/lib/emulator/eventarcEmulator.js +2 -3
- package/lib/emulator/eventarcEmulatorUtils.js +3 -6
- package/lib/emulator/extensions/postinstall.js +1 -2
- package/lib/emulator/extensions/validation.js +4 -7
- package/lib/emulator/extensionsEmulator.js +6 -9
- package/lib/emulator/functionsEmulator.js +89 -46
- package/lib/emulator/functionsEmulatorRuntime.js +1 -1
- package/lib/emulator/functionsEmulatorShared.js +30 -30
- package/lib/emulator/functionsEmulatorShell.js +4 -6
- package/lib/emulator/functionsEmulatorUtils.js +8 -9
- package/lib/emulator/functionsRuntimeWorker.js +18 -9
- package/lib/emulator/hub.js +41 -34
- package/lib/emulator/hubClient.js +1 -1
- package/lib/emulator/initEmulators.js +2 -3
- package/lib/emulator/loggingEmulator.js +2 -2
- package/lib/emulator/portUtils.js +4 -5
- package/lib/emulator/registry.js +10 -4
- package/lib/emulator/shared/request.js +1 -2
- package/lib/emulator/storage/apis/firebase.js +16 -20
- package/lib/emulator/storage/apis/gcloud.js +6 -9
- package/lib/emulator/storage/apis/shared.js +1 -2
- package/lib/emulator/storage/crc.js +2 -3
- package/lib/emulator/storage/files.js +18 -41
- package/lib/emulator/storage/metadata.js +10 -4
- package/lib/emulator/storage/multipart.js +1 -2
- package/lib/emulator/storage/rfc.js +1 -2
- package/lib/emulator/storage/rules/config.js +1 -2
- package/lib/emulator/storage/rules/manager.js +3 -5
- package/lib/emulator/storage/rules/runtime.js +15 -13
- package/lib/emulator/storage/rules/types.js +2 -2
- package/lib/emulator/storage/rules/utils.js +5 -6
- package/lib/emulator/storage/server.js +1 -2
- package/lib/emulator/storage/upload.js +3 -4
- package/lib/emulator/taskQueue.js +11 -4
- package/lib/emulator/tasksEmulator.js +11 -12
- package/lib/emulator/types.js +6 -6
- package/lib/emulator/ui.js +6 -1
- package/lib/ensureApiEnabled.js +7 -9
- package/lib/env.js +2 -3
- package/lib/error.js +11 -13
- package/lib/errorOut.js +1 -2
- package/lib/experiments.js +15 -18
- package/lib/extensions/askUserForEventsConfig.js +12 -13
- package/lib/extensions/askUserForParam.js +11 -12
- package/lib/extensions/change-log.js +4 -5
- package/lib/extensions/checkProjectBilling.js +1 -2
- package/lib/extensions/diagnose.js +1 -2
- package/lib/extensions/displayExtensionInfo.js +25 -32
- package/lib/extensions/emulator/optionsHelper.js +6 -8
- package/lib/extensions/emulator/specHelper.js +15 -16
- package/lib/extensions/emulator/triggerHelper.js +3 -5
- package/lib/extensions/etags.js +2 -3
- package/lib/extensions/export.js +7 -9
- package/lib/extensions/extensionsApi.js +23 -29
- package/lib/extensions/extensionsHelper.js +52 -80
- package/lib/extensions/listExtensions.js +3 -5
- package/lib/extensions/localHelper.js +5 -5
- package/lib/extensions/manifest.js +15 -16
- package/lib/extensions/metricsUtils.js +3 -4
- package/lib/extensions/paramHelper.js +21 -18
- package/lib/extensions/provisioningHelper.js +17 -21
- package/lib/extensions/publishHelpers.js +1 -2
- package/lib/extensions/publisherApi.js +11 -13
- package/lib/extensions/refs.js +6 -7
- package/lib/extensions/runtimes/common.js +18 -19
- package/lib/extensions/runtimes/node.js +5 -6
- package/lib/extensions/secretsUtils.js +8 -8
- package/lib/extensions/tos.js +7 -8
- package/lib/extensions/types.js +3 -3
- package/lib/extensions/updateHelper.js +6 -7
- package/lib/extensions/utils.js +6 -8
- package/lib/extensions/versionHelper.js +1 -2
- package/lib/extensions/warnings.js +6 -8
- package/lib/fetchMOTD.js +1 -2
- package/lib/fetchWebSetup.js +3 -4
- package/lib/filterTargets.js +1 -2
- package/lib/firebaseConfigValidate.js +2 -3
- package/lib/firestore/api-sort.js +8 -9
- package/lib/firestore/api-types.js +15 -15
- package/lib/firestore/api.js +15 -13
- package/lib/firestore/backupUtils.js +3 -3
- package/lib/firestore/checkDatabaseType.js +1 -2
- package/lib/firestore/delete.js +1 -2
- package/lib/firestore/encodeFirestoreValue.js +1 -2
- package/lib/firestore/fsConfig.js +1 -2
- package/lib/firestore/options.js +1 -1
- package/lib/firestore/util.js +5 -6
- package/lib/firestore/validator.js +4 -5
- package/lib/frameworks/angular/index.js +14 -15
- package/lib/frameworks/angular/utils.js +21 -23
- package/lib/frameworks/astro/index.js +7 -7
- package/lib/frameworks/astro/utils.js +4 -6
- package/lib/frameworks/compose/discover/filesystem.js +3 -3
- package/lib/frameworks/compose/discover/frameworkMatcher.js +4 -5
- package/lib/frameworks/compose/discover/index.js +1 -2
- package/lib/frameworks/compose/discover/runtime/node.js +8 -11
- package/lib/frameworks/compose/driver/docker.js +3 -5
- package/lib/frameworks/compose/driver/hooks.js +2 -2
- package/lib/frameworks/compose/driver/index.js +2 -2
- package/lib/frameworks/compose/driver/local.js +2 -3
- package/lib/frameworks/compose/index.js +5 -7
- package/lib/frameworks/constants.js +3 -3
- package/lib/frameworks/express/index.js +7 -8
- package/lib/frameworks/flutter/index.js +6 -7
- package/lib/frameworks/flutter/utils.js +4 -5
- package/lib/frameworks/index.js +21 -22
- package/lib/frameworks/next/constants.js +5 -2
- package/lib/frameworks/next/index.js +34 -32
- package/lib/frameworks/next/utils.js +40 -39
- package/lib/frameworks/nuxt/index.js +9 -9
- package/lib/frameworks/nuxt/utils.js +4 -6
- package/lib/frameworks/nuxt2/index.js +7 -7
- package/lib/frameworks/sveltekit/index.js +6 -8
- package/lib/frameworks/utils.js +26 -24
- package/lib/frameworks/vite/index.js +8 -9
- package/lib/fsAsync.js +1 -2
- package/lib/fsutils.js +5 -6
- package/lib/functional.js +11 -11
- package/lib/functions/artifacts.js +25 -22
- package/lib/functions/ensureTargeted.js +1 -2
- package/lib/functions/env.js +13 -14
- package/lib/functions/functionslog.js +2 -3
- package/lib/functions/projectConfig.js +29 -33
- package/lib/functions/python.js +10 -4
- package/lib/functions/secrets.js +32 -18
- package/lib/functionsConfig.js +14 -14
- package/lib/functionsConfigClone.js +1 -2
- package/lib/functionsShellCommandAction.js +2 -3
- package/lib/gcp/apphosting.js +43 -28
- package/lib/gcp/apptesting.js +2 -2
- package/lib/gcp/artifactregistry.js +5 -5
- package/lib/gcp/auth.js +11 -13
- package/lib/gcp/cloudbilling.js +4 -5
- package/lib/gcp/cloudbuild.js +10 -11
- package/lib/gcp/cloudfunctions.js +61 -45
- package/lib/gcp/cloudfunctionsv2.js +81 -43
- package/lib/gcp/cloudlogging.js +2 -4
- package/lib/gcp/cloudmonitoring.js +7 -7
- package/lib/gcp/cloudscheduler.js +12 -14
- package/lib/gcp/cloudsql/cloudsqladmin.js +18 -20
- package/lib/gcp/cloudsql/connect.js +14 -9
- package/lib/gcp/cloudsql/fbToolsAuthClient.js +5 -3
- package/lib/gcp/cloudsql/interactive.js +2 -3
- package/lib/gcp/cloudsql/permissions.js +8 -8
- package/lib/gcp/cloudsql/permissionsSetup.js +9 -9
- package/lib/gcp/cloudtasks.js +19 -18
- package/lib/gcp/computeEngine.js +1 -2
- package/lib/gcp/devConnect.js +32 -29
- package/lib/gcp/docker.js +2 -4
- package/lib/gcp/eventarc.js +5 -5
- package/lib/gcp/firedata.js +4 -4
- package/lib/gcp/firestore.js +16 -16
- package/lib/gcp/iam.js +11 -12
- package/lib/gcp/identityPlatform.js +4 -5
- package/lib/gcp/k8s.js +1 -2
- package/lib/gcp/location.js +2 -2
- package/lib/gcp/proto.js +10 -11
- package/lib/gcp/pubsub.js +4 -5
- package/lib/gcp/resourceManager.js +5 -5
- package/lib/gcp/rules.js +13 -14
- package/lib/gcp/run.js +24 -31
- package/lib/gcp/runv2.js +39 -27
- package/lib/gcp/secretManager.js +60 -39
- package/lib/gcp/serviceusage.js +8 -4
- package/lib/gcp/storage.js +22 -20
- package/lib/gemini/fdcExperience.js +5 -5
- package/lib/getDefaultDatabaseInstance.js +2 -4
- package/lib/getDefaultHostingSite.js +3 -4
- package/lib/getProjectNumber.js +1 -2
- package/lib/hosting/api.js +32 -36
- package/lib/hosting/cloudRunProxy.js +2 -3
- package/lib/hosting/config.js +17 -17
- package/lib/hosting/expireUtils.js +3 -3
- package/lib/hosting/functionsProxy.js +1 -2
- package/lib/hosting/implicitInit.js +1 -2
- package/lib/hosting/initMiddleware.js +1 -2
- package/lib/hosting/interactive.js +1 -2
- package/lib/hosting/proxy.js +3 -5
- package/lib/hosting/runTags.js +8 -11
- package/lib/init/features/account.js +1 -2
- package/lib/init/features/ailogic/index.js +3 -5
- package/lib/init/features/ailogic/utils.js +6 -8
- package/lib/init/features/aitools/claude.js +1 -2
- package/lib/init/features/aitools/cursor.js +1 -2
- package/lib/init/features/aitools/gemini.js +1 -1
- package/lib/init/features/aitools/promptUpdater.js +10 -12
- package/lib/init/features/aitools.js +1 -2
- package/lib/init/features/apphosting.js +3 -4
- package/lib/init/features/apptesting/index.js +9 -9
- package/lib/init/features/database.js +4 -5
- package/lib/init/features/dataconnect/create_app.js +3 -4
- package/lib/init/features/dataconnect/index.js +25 -22
- package/lib/init/features/dataconnect/resolver.js +6 -10
- package/lib/init/features/dataconnect/sdk.js +31 -24
- package/lib/init/features/emulators.js +7 -6
- package/lib/init/features/extensions/index.js +3 -5
- package/lib/init/features/firestore/index.js +7 -9
- package/lib/init/features/firestore/indexes.js +2 -2
- package/lib/init/features/firestore/rules.js +3 -3
- package/lib/init/features/functions/index.js +3 -5
- package/lib/init/features/functions/javascript.js +1 -2
- package/lib/init/features/functions/npm-dependencies.js +1 -2
- package/lib/init/features/functions/python.js +1 -2
- package/lib/init/features/functions/typescript.js +1 -2
- package/lib/init/features/genkit/index.js +44 -18
- package/lib/init/features/hosting/github.js +6 -8
- package/lib/init/features/hosting/index.js +10 -13
- package/lib/init/features/project.js +4 -7
- package/lib/init/features/remoteconfig.js +1 -2
- package/lib/init/features/storage.js +3 -5
- package/lib/init/index.js +4 -7
- package/lib/init/spawn.js +7 -9
- package/lib/listFiles.js +1 -2
- package/lib/loadCJSON.js +1 -2
- package/lib/localFunction.js +14 -15
- package/lib/logError.js +1 -2
- package/lib/logger.js +7 -7
- package/lib/management/apps.js +22 -22
- package/lib/management/database.js +11 -12
- package/lib/management/projects.js +57 -56
- package/lib/management/provisioning/errorHandler.js +3 -5
- package/lib/management/provisioning/provision.js +15 -9
- package/lib/management/studio.js +2 -3
- package/lib/mcp/errors.js +4 -4
- package/lib/mcp/index.js +16 -23
- package/lib/mcp/prompt.js +1 -2
- package/lib/mcp/prompts/core/consult.js +2 -3
- package/lib/mcp/prompts/crashlytics/connect.js +15 -122
- package/lib/mcp/prompts/dataconnect/schema.js +3 -3
- package/lib/mcp/prompts/index.js +8 -10
- package/lib/mcp/resource.js +3 -15
- package/lib/mcp/resources/guides/app_id.js +39 -0
- package/lib/mcp/resources/guides/crashlytics_connect.js +51 -0
- package/lib/mcp/resources/guides/crashlytics_investigations.js +51 -0
- package/lib/mcp/resources/guides/crashlytics_issues.js +42 -0
- package/lib/mcp/resources/guides/crashlytics_reports.js +112 -0
- package/lib/mcp/resources/index.js +11 -3
- package/lib/mcp/tool.js +3 -15
- package/lib/mcp/tools/apphosting/fetch_logs.js +3 -4
- package/lib/mcp/tools/apphosting/list_backends.js +1 -1
- package/lib/mcp/tools/auth/get_users.js +5 -16
- package/lib/mcp/tools/core/create_android_sha.js +4 -1
- package/lib/mcp/tools/core/get_environment.js +3 -3
- package/lib/mcp/tools/core/get_sdk_config.js +4 -5
- package/lib/mcp/tools/core/get_security_rules.js +1 -2
- package/lib/mcp/tools/core/init.js +2 -2
- package/lib/mcp/tools/core/logout.js +1 -1
- package/lib/mcp/tools/core/read_resources.js +2 -2
- package/lib/mcp/tools/core/validate_security_rules.js +1 -2
- package/lib/mcp/tools/crashlytics/events.js +43 -19
- package/lib/mcp/tools/crashlytics/index.js +1 -6
- package/lib/mcp/tools/crashlytics/issues.js +33 -12
- package/lib/mcp/tools/crashlytics/reports.js +66 -117
- package/lib/mcp/tools/dataconnect/list_services.js +2 -3
- package/lib/mcp/tools/firestore/converter.js +3 -5
- package/lib/mcp/tools/firestore/delete_document.js +1 -1
- package/lib/mcp/tools/functions/get_logs.js +14 -12
- package/lib/mcp/tools/functions/list_functions.js +1 -1
- package/lib/mcp/tools/index.js +17 -9
- package/lib/mcp/util/apptesting/availability.js +1 -2
- package/lib/mcp/util/availability.js +1 -2
- package/lib/mcp/util/crashlytics/availability.js +1 -2
- package/lib/mcp/util/dataconnect/compile.js +7 -6
- package/lib/mcp/util/dataconnect/converter.js +7 -10
- package/lib/mcp/util/dataconnect/emulator.js +1 -2
- package/lib/mcp/util.js +9 -11
- package/lib/messaging/sendMessage.js +1 -2
- package/lib/metaprogramming.js +1 -2
- package/lib/operation-poller.js +2 -2
- package/lib/profileReport.js +6 -6
- package/lib/profiler.js +1 -2
- package/lib/projectPath.js +1 -2
- package/lib/projectUtils.js +5 -6
- package/lib/prompt.js +22 -13
- package/lib/rc.js +5 -7
- package/lib/remoteconfig/deleteExperiment.js +1 -2
- package/lib/remoteconfig/deleteRollout.js +1 -2
- package/lib/remoteconfig/get.js +2 -3
- package/lib/remoteconfig/getExperiment.js +2 -2
- package/lib/remoteconfig/getRollout.js +2 -2
- package/lib/remoteconfig/interfaces.js +1 -1
- package/lib/remoteconfig/listExperiments.js +2 -2
- package/lib/remoteconfig/listRollouts.js +2 -2
- package/lib/remoteconfig/publish.js +1 -2
- package/lib/remoteconfig/rollback.js +1 -2
- package/lib/remoteconfig/versionslist.js +1 -2
- package/lib/requireAuth.js +4 -6
- package/lib/requireConfig.js +5 -8
- package/lib/requireDatabaseInstance.js +2 -2
- package/lib/requireHostingSite.js +1 -2
- package/lib/requireInteractive.js +1 -1
- package/lib/requirePermissions.js +1 -2
- package/lib/requireTosAcceptance.js +1 -2
- package/lib/responseToError.js +1 -2
- package/lib/rtdb.js +2 -3
- package/lib/rulesDeploy.js +3 -4
- package/lib/serve/functions.js +9 -1
- package/lib/serve/hosting.js +4 -5
- package/lib/serve/index.js +1 -2
- package/lib/shortenUrl.js +1 -2
- package/lib/templates.js +3 -4
- package/lib/throttler/throttler.js +3 -3
- package/lib/timeout.js +2 -3
- package/lib/track.js +23 -14
- package/lib/tsconfig.publish.tsbuildinfo +1 -0
- package/lib/unzip.js +2 -3
- package/lib/utils.js +62 -63
- package/lib/vsCodeUtils.js +2 -3
- package/package.json +6 -6
- package/templates/extensions/typescript/index.ts +1 -1
- package/templates/extensions/typescript/package.lint.json +1 -1
- package/templates/extensions/typescript/package.nolint.json +1 -1
- 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.
|
|
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 =
|
|
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
|
|
8
|
+
const { isAvailable, ...mcpOptions } = options;
|
|
20
9
|
const isAvailableFunc = isAvailable || (0, availability_1.getDefaultFeatureAvailabilityCheck)(feature);
|
|
21
10
|
return {
|
|
22
|
-
mcp:
|
|
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 =
|
|
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(
|
|
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 = (
|
|
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
|
|
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
|
|
34
|
+
const { passwordHash, salt, ...prunedUser } = user;
|
|
46
35
|
return prunedUser;
|
|
47
36
|
};
|
|
48
37
|
let users = [];
|
|
49
|
-
if (uids
|
|
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
|
|
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
|
|
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 (!
|
|
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)(
|
|
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 =
|
|
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
|
-
|
|
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
|
|
36
|
-
platform = platform ||
|
|
37
|
-
appId = 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)(
|
|
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
|
|
217
|
-
rcfile: rc
|
|
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 ===
|
|
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 (!
|
|
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 (
|
|
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
|
|
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
|
-
|
|
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
|
|
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 (
|
|
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
|
-
|
|
113
|
-
if (!appId)
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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 =
|
|
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
|
-
|
|
143
|
-
if (!appId)
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
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 =
|
|
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.
|
|
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
|
|
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
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
});
|