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
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.crashlytics_connect = exports.RESOURCE_CONTENT = void 0;
|
|
4
|
+
const resource_1 = require("../../resource");
|
|
5
|
+
exports.RESOURCE_CONTENT = `
|
|
6
|
+
### Instructions for Working with Firebase Crashlytics Tools
|
|
7
|
+
|
|
8
|
+
When working interactively with a user, only ask the one question at a time. Do not proceed without user instructions. Upon receiving user instructions, refer to the relevant resources for guidance.
|
|
9
|
+
|
|
10
|
+
Use the \`firebase_read_resources\` tool to access the following guides.
|
|
11
|
+
|
|
12
|
+
1. [Firebase App Id Guide](firebase://guides/app_id)
|
|
13
|
+
This guide provides crucial instructions for obtaining the application's App Id which is required for all API calls.
|
|
14
|
+
|
|
15
|
+
2. [Firebase Crashlytics Reports Guide](firebase://guides/crashlytics/reports)
|
|
16
|
+
This guide details how to request and use aggregated numerical data from Crashlytics. The agent should read this guide before requesting any report.
|
|
17
|
+
|
|
18
|
+
3. [Firebase Crashlytics Issues Guide](firebase://guides/crashlytics/issues)
|
|
19
|
+
This guide details how to work with issues within Crashlytics. The agent should read this guide before prioritizing issues or presenting issue data to the user.
|
|
20
|
+
|
|
21
|
+
4. [Investigating Crashlytics Issues Guide](firebase://guides/crashlytics/investigations)
|
|
22
|
+
This guide provides instructions on investigating the root causes of crashes and exceptions reported in Crashlytics issues.
|
|
23
|
+
|
|
24
|
+
### How to Check That You Are Connected
|
|
25
|
+
|
|
26
|
+
Verify that you can read the app's Crashlytics data by getting the topVersions report. This report will tell you which app versions have the most events.
|
|
27
|
+
a. Read the firebase://guides/app_id if you need to find the app_id.
|
|
28
|
+
b. Call the \`crashlytics_get_report\` tool to read the \`topVersions\` report.
|
|
29
|
+
c. Help the user resolve any issues that arise when trying to connect.
|
|
30
|
+
|
|
31
|
+
After confirming that you can access Crashlytics, ask the user what they would like help with. Your capabilities include:
|
|
32
|
+
|
|
33
|
+
- *Reading Crashlytics reports to prioritize or find important issues.*
|
|
34
|
+
Before fetching reports, read the critical instructions for the \`crashlytics_get_report\` tool in the [Firebase Crashlytics Reports Guide](firebase://guides/crashlytics/reports).
|
|
35
|
+
|
|
36
|
+
- *Investigating bug reports using Crashlytics event data.*
|
|
37
|
+
Before attempting to investigate an individual issue, read the [Investigating Crashlytics Issues Guide](firebase://guides/crashlytics/investigations) to understand the best practices for debugging issues.
|
|
38
|
+
|
|
39
|
+
- *Proposing code changes to resolve identified bugs.*
|
|
40
|
+
|
|
41
|
+
`.trim();
|
|
42
|
+
exports.crashlytics_connect = (0, resource_1.resource)({
|
|
43
|
+
uri: "firebase://guides/crashlytics/connect",
|
|
44
|
+
name: "crashlytics_connect_guide",
|
|
45
|
+
title: "Firebase Crashlytics Connect Guide",
|
|
46
|
+
description: "Guides the coding agent to connect to Firebase Crashlytics.",
|
|
47
|
+
}, async (uri) => {
|
|
48
|
+
return {
|
|
49
|
+
contents: [{ uri, type: "text", text: exports.RESOURCE_CONTENT }],
|
|
50
|
+
};
|
|
51
|
+
});
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.crashlytics_investigations = void 0;
|
|
4
|
+
const resource_1 = require("../../resource");
|
|
5
|
+
const RESOURCE_CONTENT = `
|
|
6
|
+
### How to Diagnose and Fix Crashlytics Issues
|
|
7
|
+
|
|
8
|
+
Follow these steps to diagnose bugs and and propose fixes for issues.
|
|
9
|
+
|
|
10
|
+
1. Make sure you have a good understanding of the code structure and where different functionality exists.
|
|
11
|
+
2. Use the 'crashlytics_get_issue' tool to get more context on the issue.
|
|
12
|
+
3. Use the 'crashlytics_batch_get_events' tool to get an example crash for this issue. Use the event names in the sampleEvent fields.
|
|
13
|
+
3a. If you need to read more events, use the 'crashlytics_list_events' tool.
|
|
14
|
+
3b. Apply the same filtering criteria that you used to find the issue, so that you find a appropriate events.
|
|
15
|
+
4. Read the files that exist in the stack trace of the issue to understand the crash deeply.
|
|
16
|
+
5. Determine possible root causes for the crash - no more than 5 potential root causes.
|
|
17
|
+
6. Critique your own determination, analyzing how plausible each scenario is given the crash details.
|
|
18
|
+
7. Choose the most likely root cause given your analysis.
|
|
19
|
+
8. Create a plan for the most likely root cause using the following format for the plan:
|
|
20
|
+
|
|
21
|
+
## Cause
|
|
22
|
+
<A description of the root cause leading to the issue>
|
|
23
|
+
- **Fault**: <a determination of whether this code base is at fault or a dependent library is at fault>
|
|
24
|
+
- **Complexity**: <one of "simple", "moderately simple", "moderately hard", "hard", "oof, I don't know where to start">
|
|
25
|
+
|
|
26
|
+
## Fix
|
|
27
|
+
<A description of the fix for this issue and a break down of the changes.>
|
|
28
|
+
1. <Step 1>
|
|
29
|
+
2. <Step 2>
|
|
30
|
+
|
|
31
|
+
## Test
|
|
32
|
+
<A plan for how to test that the issue has been fixed and protect against regressions>
|
|
33
|
+
1. <Test case 1>
|
|
34
|
+
2. <Test case 2>
|
|
35
|
+
|
|
36
|
+
## Other potential causes
|
|
37
|
+
1. <Another possible root cause>
|
|
38
|
+
2. <Another possible root cause>
|
|
39
|
+
|
|
40
|
+
9. If there is not enough information in the crash report to find a root cause, describe why you cannot fix the issue instead of making a guess.
|
|
41
|
+
`.trim();
|
|
42
|
+
exports.crashlytics_investigations = (0, resource_1.resource)({
|
|
43
|
+
uri: "firebase://guides/crashlytics/investigations",
|
|
44
|
+
name: "crashlytics_investigations_guide",
|
|
45
|
+
title: "Firebase Crashlytics Investigations Guide",
|
|
46
|
+
description: "Guides the coding agent when investigating bugs reported in Crashlytics issues, including procedures for diagnosing and fixing crashes.",
|
|
47
|
+
}, async (uri) => {
|
|
48
|
+
return {
|
|
49
|
+
contents: [{ uri, type: "text", text: RESOURCE_CONTENT }],
|
|
50
|
+
};
|
|
51
|
+
});
|
|
@@ -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");
|
|
@@ -15,6 +16,7 @@ function hydrateTemplate(config) {
|
|
|
15
16
|
: "<NONE>";
|
|
16
17
|
const projectConfigPath = config.projectConfigPath || "<NO CONFIG PRESENT>";
|
|
17
18
|
const geminiTosAccepted = config.geminiTosAccepted ? "Accepted" : "<NOT ACCEPTED>";
|
|
19
|
+
const billingEnabled = config.projectId ? (config.isBillingEnabled ? "Yes" : "No") : "N/A";
|
|
18
20
|
const authenticatedUser = config.authenticatedUser || "<NONE>";
|
|
19
21
|
const detectedApps = Object.entries(config.detectedAppIds).length > 0
|
|
20
22
|
? `\n\n${(0, js_yaml_1.dump)(config.detectedAppIds).trim()}\n`
|
|
@@ -30,6 +32,7 @@ Project Directory: ${config.projectDir}
|
|
|
30
32
|
Project Config Path: ${projectConfigPath}
|
|
31
33
|
Active Project ID: ${activeProject}
|
|
32
34
|
Gemini in Firebase Terms of Service: ${geminiTosAccepted}
|
|
35
|
+
Billing Enabled: ${billingEnabled}
|
|
33
36
|
Authenticated User: ${authenticatedUser}
|
|
34
37
|
Detected App IDs: ${detectedApps}
|
|
35
38
|
Available Project Aliases (format: '[alias]: [projectId]'): ${availableProjects}${hasOtherAccounts ? `\nAvailable Accounts: \n\n${availableAccounts}` : ""}
|
|
@@ -50,10 +53,9 @@ b) Initialize a new Firebase project directory using the 'firebase_init' tool.
|
|
|
50
53
|
|
|
51
54
|
Confirm with the user before taking action.`}`;
|
|
52
55
|
}
|
|
53
|
-
exports.hydrateTemplate = hydrateTemplate;
|
|
54
56
|
exports.get_environment = (0, tool_1.tool)("core", {
|
|
55
57
|
name: "get_environment",
|
|
56
|
-
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.",
|
|
57
59
|
inputSchema: zod_1.z.object({}),
|
|
58
60
|
annotations: {
|
|
59
61
|
title: "Get Firebase Environment Info",
|
|
@@ -63,7 +65,7 @@ exports.get_environment = (0, tool_1.tool)("core", {
|
|
|
63
65
|
requiresAuth: false,
|
|
64
66
|
requiresProject: false,
|
|
65
67
|
},
|
|
66
|
-
}, async (_, { projectId, host, accountEmail, rc, config }) => {
|
|
68
|
+
}, async (_, { projectId, host, accountEmail, rc, config, isBillingEnabled }) => {
|
|
67
69
|
const aliases = projectId ? (0, projectUtils_1.getAliases)({ rc }, projectId) : [];
|
|
68
70
|
const geminiTosAccepted = !!configstore_1.configstore.get("gemini");
|
|
69
71
|
const projectFileExists = config.projectFileExists("firebase.json");
|
|
@@ -84,6 +86,7 @@ exports.get_environment = (0, tool_1.tool)("core", {
|
|
|
84
86
|
projectDir: host.cachedProjectDir,
|
|
85
87
|
projectConfigPath: projectFileExists ? config.path("firebase.json") : undefined,
|
|
86
88
|
geminiTosAccepted,
|
|
89
|
+
isBillingEnabled,
|
|
87
90
|
authenticatedUser: accountEmail || undefined,
|
|
88
91
|
projectAliasMap: rc.projects,
|
|
89
92
|
allAccounts,
|
|
@@ -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);
|