firebase-tools 15.0.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 +33 -36
- 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 +47 -10
- 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 +31 -31
- 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 +19 -21
- 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 +47 -45
- 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 +7 -4
- 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 +67 -50
- 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
package/lib/mcp/errors.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
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
|
@@ -4,26 +4,27 @@ exports.FirebaseMcpServer = void 0;
|
|
|
4
4
|
const index_js_1 = require("@modelcontextprotocol/sdk/server/index.js");
|
|
5
5
|
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
6
6
|
const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
7
|
-
const
|
|
8
|
-
const
|
|
9
|
-
const index_1 = require("./tools/index");
|
|
10
|
-
const index_2 = require("./prompts/index");
|
|
11
|
-
const configstore_1 = require("../configstore");
|
|
7
|
+
const crossSpawn = require("cross-spawn");
|
|
8
|
+
const node_fs_1 = require("node:fs");
|
|
12
9
|
const command_1 = require("../command");
|
|
13
|
-
const requireAuth_1 = require("../requireAuth");
|
|
14
|
-
const projectUtils_1 = require("../projectUtils");
|
|
15
|
-
const errors_1 = require("./errors");
|
|
16
|
-
const track_1 = require("../track");
|
|
17
10
|
const config_1 = require("../config");
|
|
18
|
-
const
|
|
11
|
+
const configstore_1 = require("../configstore");
|
|
19
12
|
const hubClient_1 = require("../emulator/hubClient");
|
|
20
|
-
const node_fs_1 = require("node:fs");
|
|
21
|
-
const logging_transport_1 = require("./logging-transport");
|
|
22
13
|
const env_1 = require("../env");
|
|
14
|
+
const projectUtils_1 = require("../projectUtils");
|
|
15
|
+
const rc_1 = require("../rc");
|
|
16
|
+
const requireAuth_1 = require("../requireAuth");
|
|
23
17
|
const timeout_1 = require("../timeout");
|
|
18
|
+
const track_1 = require("../track");
|
|
19
|
+
const errors_1 = require("./errors");
|
|
20
|
+
const logging_transport_1 = require("./logging-transport");
|
|
21
|
+
const index_1 = require("./prompts/index");
|
|
24
22
|
const resources_1 = require("./resources");
|
|
25
|
-
const
|
|
23
|
+
const index_2 = require("./tools/index");
|
|
24
|
+
const types_1 = require("./types");
|
|
25
|
+
const util_1 = require("./util");
|
|
26
26
|
const availability_1 = require("./util/availability");
|
|
27
|
+
const cloudbilling_1 = require("../gcp/cloudbilling");
|
|
27
28
|
const SERVER_VERSION = "0.3.0";
|
|
28
29
|
const cmd = new command_1.Command("mcp");
|
|
29
30
|
const orderedLogLevels = [
|
|
@@ -38,15 +39,14 @@ const orderedLogLevels = [
|
|
|
38
39
|
];
|
|
39
40
|
class FirebaseMcpServer {
|
|
40
41
|
async trackGA4(event, params = {}) {
|
|
41
|
-
var _a, _b;
|
|
42
42
|
if (!this.clientInfo)
|
|
43
43
|
await (0, timeout_1.timeoutFallback)(this.ready(), null, 2000);
|
|
44
44
|
const clientInfoParams = {
|
|
45
|
-
mcp_client_name:
|
|
46
|
-
mcp_client_version:
|
|
45
|
+
mcp_client_name: this.clientInfo?.name || "<unknown-client>",
|
|
46
|
+
mcp_client_version: this.clientInfo?.version || "<unknown-version>",
|
|
47
47
|
gemini_cli_extension: process.env.IS_GEMINI_CLI_EXTENSION ? "true" : "false",
|
|
48
48
|
};
|
|
49
|
-
return (0, track_1.trackGA4)(event,
|
|
49
|
+
return (0, track_1.trackGA4)(event, { ...params, ...clientInfoParams });
|
|
50
50
|
}
|
|
51
51
|
constructor(options) {
|
|
52
52
|
this._ready = false;
|
|
@@ -55,6 +55,7 @@ class FirebaseMcpServer {
|
|
|
55
55
|
this.currentLogLevel = process.env.FIREBASE_MCP_DEBUG_LOG ? "debug" : undefined;
|
|
56
56
|
this.activeFeatures = options.activeFeatures;
|
|
57
57
|
this.startupRoot = options.projectRoot || process.env.PROJECT_ROOT;
|
|
58
|
+
this.enabledTools = options.enabledTools;
|
|
58
59
|
this.server = new index_js_1.Server({ name: "firebase", version: SERVER_VERSION });
|
|
59
60
|
this.server.registerCapabilities({
|
|
60
61
|
tools: { listChanged: true },
|
|
@@ -70,17 +71,16 @@ class FirebaseMcpServer {
|
|
|
70
71
|
this.server.setRequestHandler(types_js_1.ListResourcesRequestSchema, this.mcpListResources.bind(this));
|
|
71
72
|
this.server.setRequestHandler(types_js_1.ReadResourceRequestSchema, this.mcpReadResource.bind(this));
|
|
72
73
|
const onInitialized = () => {
|
|
73
|
-
var _a, _b;
|
|
74
74
|
const clientInfo = this.server.getClientVersion();
|
|
75
75
|
this.clientInfo = clientInfo;
|
|
76
|
-
if (clientInfo
|
|
76
|
+
if (clientInfo?.name) {
|
|
77
77
|
void this.trackGA4("mcp_client_connected");
|
|
78
78
|
}
|
|
79
|
-
if (!
|
|
79
|
+
if (!this.clientInfo?.name)
|
|
80
80
|
this.clientInfo = { name: "<unknown-client>" };
|
|
81
81
|
this._ready = true;
|
|
82
82
|
while (this._readyPromises.length) {
|
|
83
|
-
|
|
83
|
+
this._readyPromises.pop()?.resolve();
|
|
84
84
|
}
|
|
85
85
|
};
|
|
86
86
|
this.server.oninitialized = () => {
|
|
@@ -100,8 +100,7 @@ class FirebaseMcpServer {
|
|
|
100
100
|
});
|
|
101
101
|
}
|
|
102
102
|
get clientName() {
|
|
103
|
-
|
|
104
|
-
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>");
|
|
105
104
|
}
|
|
106
105
|
get clientConfigKey() {
|
|
107
106
|
return `mcp.clientConfigs.${this.clientName}:${this.startupRoot || process.cwd()}`;
|
|
@@ -111,7 +110,7 @@ class FirebaseMcpServer {
|
|
|
111
110
|
}
|
|
112
111
|
updateStoredClientConfig(update) {
|
|
113
112
|
const config = configstore_1.configstore.get(this.clientConfigKey) || {};
|
|
114
|
-
const newConfig =
|
|
113
|
+
const newConfig = { ...config, ...update };
|
|
115
114
|
configstore_1.configstore.set(this.clientConfigKey, newConfig);
|
|
116
115
|
return newConfig;
|
|
117
116
|
}
|
|
@@ -129,13 +128,13 @@ class FirebaseMcpServer {
|
|
|
129
128
|
return this.cachedProjectDir;
|
|
130
129
|
}
|
|
131
130
|
async detectActiveFeatures() {
|
|
132
|
-
|
|
133
|
-
if ((_a = this.detectedFeatures) === null || _a === void 0 ? void 0 : _a.length)
|
|
131
|
+
if (this.detectedFeatures?.length)
|
|
134
132
|
return this.detectedFeatures;
|
|
135
133
|
this.logger.debug("detecting active features of Firebase MCP server...");
|
|
136
134
|
const projectId = (await this.getProjectId()) || "";
|
|
137
135
|
const accountEmail = await this.getAuthenticatedUser();
|
|
138
|
-
const
|
|
136
|
+
const isBillingEnabled = projectId ? await (0, cloudbilling_1.checkBillingEnabled)(projectId) : false;
|
|
137
|
+
const ctx = this._createMcpContext(projectId, accountEmail, isBillingEnabled);
|
|
139
138
|
const detected = await Promise.all(types_1.SERVER_FEATURES.map(async (f) => {
|
|
140
139
|
const availabilityCheck = (0, availability_1.getDefaultFeatureAvailabilityCheck)(f);
|
|
141
140
|
if (await availabilityCheck(ctx))
|
|
@@ -168,24 +167,24 @@ class FirebaseMcpServer {
|
|
|
168
167
|
return `http://${host}:${emulatorInfo.port}`;
|
|
169
168
|
}
|
|
170
169
|
async getAvailableTools() {
|
|
171
|
-
|
|
172
|
-
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;
|
|
173
171
|
const projectId = (await this.getProjectId()) || "";
|
|
174
172
|
const accountEmail = await this.getAuthenticatedUser();
|
|
175
|
-
const
|
|
176
|
-
|
|
173
|
+
const isBillingEnabled = projectId ? await (0, cloudbilling_1.checkBillingEnabled)(projectId) : false;
|
|
174
|
+
const ctx = this._createMcpContext(projectId, accountEmail, isBillingEnabled);
|
|
175
|
+
return (0, index_2.availableTools)(ctx, features, this.enabledTools);
|
|
177
176
|
}
|
|
178
177
|
async getTool(name) {
|
|
179
178
|
const tools = await this.getAvailableTools();
|
|
180
179
|
return tools.find((t) => t.mcp.name === name) || null;
|
|
181
180
|
}
|
|
182
181
|
async getAvailablePrompts() {
|
|
183
|
-
|
|
184
|
-
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;
|
|
185
183
|
const projectId = (await this.getProjectId()) || "";
|
|
186
184
|
const accountEmail = await this.getAuthenticatedUser();
|
|
187
|
-
const
|
|
188
|
-
|
|
185
|
+
const isBillingEnabled = projectId ? await (0, cloudbilling_1.checkBillingEnabled)(projectId) : false;
|
|
186
|
+
const ctx = this._createMcpContext(projectId, accountEmail, isBillingEnabled);
|
|
187
|
+
return (0, index_1.availablePrompts)(ctx, features);
|
|
189
188
|
}
|
|
190
189
|
async getPrompt(name) {
|
|
191
190
|
const prompts = await this.getAvailablePrompts();
|
|
@@ -211,14 +210,14 @@ class FirebaseMcpServer {
|
|
|
211
210
|
this.logger.debug("calling requireAuth");
|
|
212
211
|
const email = await (0, requireAuth_1.requireAuth)(await this.resolveOptions(), skipAutoAuth);
|
|
213
212
|
this.logger.debug(`detected authenticated account: ${email || "<none>"}`);
|
|
214
|
-
return email
|
|
213
|
+
return email ?? (skipAutoAuth ? null : "Application Default Credentials");
|
|
215
214
|
}
|
|
216
215
|
catch (e) {
|
|
217
216
|
this.logger.debug(`error in requireAuth: ${e}`);
|
|
218
217
|
return null;
|
|
219
218
|
}
|
|
220
219
|
}
|
|
221
|
-
_createMcpContext(projectId, accountEmail) {
|
|
220
|
+
_createMcpContext(projectId, accountEmail, isBillingEnabled) {
|
|
222
221
|
const options = { projectDir: this.cachedProjectDir, cwd: this.cachedProjectDir };
|
|
223
222
|
return {
|
|
224
223
|
projectId: projectId,
|
|
@@ -227,6 +226,7 @@ class FirebaseMcpServer {
|
|
|
227
226
|
rc: (0, rc_1.loadRC)(options),
|
|
228
227
|
accountEmail,
|
|
229
228
|
firebaseCliCommand: this._getFirebaseCliCommand(),
|
|
229
|
+
isBillingEnabled,
|
|
230
230
|
};
|
|
231
231
|
}
|
|
232
232
|
_getFirebaseCliCommand() {
|
|
@@ -255,34 +255,34 @@ class FirebaseMcpServer {
|
|
|
255
255
|
};
|
|
256
256
|
}
|
|
257
257
|
async mcpCallTool(request) {
|
|
258
|
-
var _a, _b, _c, _d;
|
|
259
258
|
await this.detectProjectRoot();
|
|
260
259
|
const toolName = request.params.name;
|
|
261
260
|
const toolArgs = request.params.arguments;
|
|
262
261
|
const tool = await this.getTool(toolName);
|
|
263
262
|
if (!tool)
|
|
264
263
|
throw new Error(`Tool '${toolName}' could not be found.`);
|
|
265
|
-
if (!
|
|
264
|
+
if (!tool.mcp._meta?.optionalProjectDir) {
|
|
266
265
|
if (!this.cachedProjectDir || !(0, node_fs_1.existsSync)(this.cachedProjectDir)) {
|
|
267
266
|
return (0, errors_1.noProjectDirectory)(this.cachedProjectDir);
|
|
268
267
|
}
|
|
269
268
|
}
|
|
270
269
|
let projectId = await this.getProjectId();
|
|
271
|
-
if (
|
|
270
|
+
if (tool.mcp._meta?.requiresProject && !projectId) {
|
|
272
271
|
return errors_1.NO_PROJECT_ERROR;
|
|
273
272
|
}
|
|
274
273
|
projectId = projectId || "";
|
|
275
274
|
const skipAutoAuthForStudio = (0, env_1.isFirebaseStudio)();
|
|
276
275
|
const accountEmail = await this.getAuthenticatedUser(skipAutoAuthForStudio);
|
|
277
|
-
if (
|
|
276
|
+
if (tool.mcp._meta?.requiresAuth && !accountEmail) {
|
|
278
277
|
return (0, errors_1.mcpAuthError)(skipAutoAuthForStudio);
|
|
279
278
|
}
|
|
280
|
-
if (
|
|
279
|
+
if (tool.mcp._meta?.requiresGemini) {
|
|
281
280
|
const err = await (0, errors_1.requireGeminiToS)(projectId);
|
|
282
281
|
if (err)
|
|
283
282
|
return err;
|
|
284
283
|
}
|
|
285
|
-
const
|
|
284
|
+
const isBillingEnabled = projectId ? await (0, cloudbilling_1.checkBillingEnabled)(projectId) : false;
|
|
285
|
+
const toolsCtx = this._createMcpContext(projectId, accountEmail, isBillingEnabled);
|
|
286
286
|
try {
|
|
287
287
|
const res = await tool.fn(toolArgs, toolsCtx);
|
|
288
288
|
await this.trackGA4("mcp_tool_call", {
|
|
@@ -332,7 +332,8 @@ class FirebaseMcpServer {
|
|
|
332
332
|
projectId = projectId || "";
|
|
333
333
|
const skipAutoAuthForStudio = (0, env_1.isFirebaseStudio)();
|
|
334
334
|
const accountEmail = await this.getAuthenticatedUser(skipAutoAuthForStudio);
|
|
335
|
-
const
|
|
335
|
+
const isBillingEnabled = projectId ? await (0, cloudbilling_1.checkBillingEnabled)(projectId) : false;
|
|
336
|
+
const promptsCtx = this._createMcpContext(projectId, accountEmail, isBillingEnabled);
|
|
336
337
|
try {
|
|
337
338
|
const messages = await prompt.fn(promptArgs, promptsCtx);
|
|
338
339
|
await this.trackGA4("mcp_get_prompt", {
|
|
@@ -366,7 +367,8 @@ class FirebaseMcpServer {
|
|
|
366
367
|
projectId = projectId || "";
|
|
367
368
|
const skipAutoAuthForStudio = (0, env_1.isFirebaseStudio)();
|
|
368
369
|
const accountEmail = await this.getAuthenticatedUser(skipAutoAuthForStudio);
|
|
369
|
-
const
|
|
370
|
+
const isBillingEnabled = projectId ? await (0, cloudbilling_1.checkBillingEnabled)(projectId) : false;
|
|
371
|
+
const resourceCtx = this._createMcpContext(projectId, accountEmail, isBillingEnabled);
|
|
370
372
|
const resolved = await (0, resources_1.resolveResource)(req.params.uri, resourceCtx);
|
|
371
373
|
if (!resolved) {
|
|
372
374
|
throw new types_js_1.McpError(types_js_1.ErrorCode.InvalidParams, `Resource '${req.params.uri}' could not be found.`);
|
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 =
|
|
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${
|
|
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 =
|
|
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: "
|
|
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
|
|
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
|
-
|
|
29
|
+
### Required First Steps
|
|
23
30
|
|
|
24
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
${(
|
|
18
|
-
.source.files
|
|
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>"}`;
|
package/lib/mcp/prompts/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
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 =
|
|
25
|
-
newPrompt.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 =
|
|
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 (!
|
|
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 =
|
|
68
|
+
const feature = prompt.mcp._meta?.feature || "";
|
|
70
69
|
let description = prompt.mcp.description || "";
|
|
71
|
-
if (
|
|
70
|
+
if (prompt.mcp.arguments?.length) {
|
|
72
71
|
const argsList = prompt.mcp.arguments.map((arg) => ` <br><${arg.name}>${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;
|
package/lib/mcp/resource.js
CHANGED
|
@@ -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.
|
|
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
|
|
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
|
+
});
|