@dereekb/dbx-cli 13.13.0 → 13.14.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/index.esm.js CHANGED
@@ -11528,6 +11528,118 @@ function parseJsonData(rawData) {
11528
11528
  var isDefault = specifier == null || specifier === '_';
11529
11529
  return isDefault ? "".concat(modelType, ".").concat(call, "._") : "".concat(modelType, ".").concat(call, ".").concat(specifier);
11530
11530
  }
11531
+ /**
11532
+ * Default specifier key used when a handler is not behind a specifier router.
11533
+ *
11534
+ * Mirrors `DEFAULT_SPECIFIER_KEY` in `@dereekb/firebase-server/mcp` — kept in sync so the
11535
+ * build-time renderer composes the same tool names as the runtime generator.
11536
+ */ var DEFAULT_SPECIFIER_KEY = '_';
11537
+ /**
11538
+ * Soft limit for an MCP tool name. Mirrors `MCP_TOOL_NAME_WARN_LENGTH` in
11539
+ * `@dereekb/firebase-server/mcp`. Names over this are flagged at manifest-generation time.
11540
+ */ var MCP_TOOL_NAME_WARN_LENGTH = 55;
11541
+ /**
11542
+ * Hard limit for an MCP tool name. Mirrors `MCP_TOOL_NAME_MAX_LENGTH` in
11543
+ * `@dereekb/firebase-server/mcp`. Remote MCP clients reject a `tools/list` payload containing any
11544
+ * tool whose `name` exceeds this, so manifest generation fails when a name is over the cap.
11545
+ */ var MCP_TOOL_NAME_MAX_LENGTH = 64;
11546
+ /**
11547
+ * Builds the MCP tool name for a (modelSegment, callType, specifier) triple.
11548
+ *
11549
+ * Mirrors `buildMcpToolName` in `@dereekb/firebase-server/mcp` so the build-time manifest validation
11550
+ * sees the same names the runtime advertises. The call-type segment is only emitted for the default
11551
+ * (`_`) specifier; named specifiers drop it (`worker-syncCheckHqEmployee`).
11552
+ *
11553
+ * @param modelSegment - The model segment of the name (model type, or a per-model override).
11554
+ * @param callType - The call type / verb.
11555
+ * @param specifier - The specifier key, or `_` / undefined for the default entry.
11556
+ * @returns The hyphen-joined tool name.
11557
+ *
11558
+ * @example
11559
+ * ```ts
11560
+ * buildMcpToolName('worker', 'update', 'syncCheckHqEmployee'); // 'worker-syncCheckHqEmployee'
11561
+ * ```
11562
+ */ function buildMcpToolName(modelSegment, callType, specifier) {
11563
+ var isDefault = specifier == null || specifier === DEFAULT_SPECIFIER_KEY;
11564
+ return isDefault ? "".concat(modelSegment, "-").concat(callType) : "".concat(modelSegment, "-").concat(specifier);
11565
+ }
11566
+ /**
11567
+ * Classifies a tool name's length against the soft/hard MCP name-length limits.
11568
+ *
11569
+ * Mirrors `validateMcpToolName` in `@dereekb/firebase-server/mcp`.
11570
+ *
11571
+ * @param name - The fully-resolved tool name.
11572
+ * @returns The length classification — `error` over {@link MCP_TOOL_NAME_MAX_LENGTH}, `warn` over
11573
+ * {@link MCP_TOOL_NAME_WARN_LENGTH}, otherwise `ok`.
11574
+ *
11575
+ * @example
11576
+ * ```ts
11577
+ * validateMcpToolName('worker-create').level; // 'ok'
11578
+ * ```
11579
+ */ function validateMcpToolName(name) {
11580
+ var length = name.length;
11581
+ var level = 'ok';
11582
+ if (length > MCP_TOOL_NAME_MAX_LENGTH) {
11583
+ level = 'error';
11584
+ } else if (length > MCP_TOOL_NAME_WARN_LENGTH) {
11585
+ level = 'warn';
11586
+ }
11587
+ return {
11588
+ name: name,
11589
+ length: length,
11590
+ level: level
11591
+ };
11592
+ }
11593
+ /**
11594
+ * Single-character abbreviations for the standard CRUDQ + invoke call types.
11595
+ *
11596
+ * Mirrors `MCP_CALL_TYPE_ABBREVIATIONS` in `@dereekb/firebase-server/mcp` so the build-time renderer
11597
+ * disambiguates colliding names exactly like the runtime generator.
11598
+ */ var MCP_CALL_TYPE_ABBREVIATIONS = {
11599
+ create: 'c',
11600
+ read: 'r',
11601
+ update: 'u',
11602
+ delete: 'd',
11603
+ query: 'q',
11604
+ invoke: 'i'
11605
+ };
11606
+ /**
11607
+ * Abbreviates a call type for a disambiguated tool name; a custom call type is returned unchanged.
11608
+ *
11609
+ * Mirrors `abbreviateMcpCallType` in `@dereekb/firebase-server/mcp`.
11610
+ *
11611
+ * @param callType - The call type / verb.
11612
+ * @returns The single-character abbreviation, or the original string for a custom call type.
11613
+ *
11614
+ * @example
11615
+ * ```ts
11616
+ * abbreviateMcpCallType('update'); // 'u'
11617
+ * ```
11618
+ */ function abbreviateMcpCallType(callType) {
11619
+ var _MCP_CALL_TYPE_ABBREVIATIONS_callType;
11620
+ return (_MCP_CALL_TYPE_ABBREVIATIONS_callType = MCP_CALL_TYPE_ABBREVIATIONS[callType]) !== null && _MCP_CALL_TYPE_ABBREVIATIONS_callType !== void 0 ? _MCP_CALL_TYPE_ABBREVIATIONS_callType : callType;
11621
+ }
11622
+ /**
11623
+ * Builds the disambiguated MCP tool name — the form used only when {@link buildMcpToolName} collides
11624
+ * with another visible tool. Named specifiers re-insert the abbreviated call type
11625
+ * (`worker-u-syncCheckHqEmployee`); default (`_`) specifiers already carry the full call type and are
11626
+ * returned unchanged.
11627
+ *
11628
+ * Mirrors `buildDisambiguatedMcpToolName` in `@dereekb/firebase-server/mcp`.
11629
+ *
11630
+ * @param modelSegment - The model segment of the name (model type, or a per-model override).
11631
+ * @param callType - The call type / verb.
11632
+ * @param specifier - The specifier key, or `_` / undefined for the default entry.
11633
+ * @returns The hyphen-joined disambiguated tool name.
11634
+ *
11635
+ * @example
11636
+ * ```ts
11637
+ * buildDisambiguatedMcpToolName('worker', 'update', 'syncCheckHqEmployee'); // 'worker-u-syncCheckHqEmployee'
11638
+ * ```
11639
+ */ function buildDisambiguatedMcpToolName(modelSegment, callType, specifier) {
11640
+ var isDefault = specifier == null || specifier === DEFAULT_SPECIFIER_KEY;
11641
+ return isDefault ? "".concat(modelSegment, "-").concat(callType) : "".concat(modelSegment, "-").concat(abbreviateMcpCallType(callType), "-").concat(specifier);
11642
+ }
11531
11643
 
11532
11644
  /**
11533
11645
  * One entry in `<cluster>.scan[]`. Mirrors the shape of the legacy
@@ -56779,4 +56891,4 @@ function printPaginatedOutput(input) {
56779
56891
  })();
56780
56892
  }
56781
56893
 
56782
- export { ACTIONS_SCAN_CONFIG_FILENAME, ACTION_ENTRY_ROLES, ACTION_ROLE_ORDER, ActionDirectiveEntry, ActionEntry, ActionInputEntry, ActionManifest, ActionOutputEntry, ActionStateEntry, ActionStoreEntry, ActionStoreMethodEntry, ActionStoreObservableEntry, ActionsScanConfig, ActionsScanSection, BUILTIN_AUTH_CLAIMS, BUILTIN_AUTH_ROLES, BUILTIN_AUTH_SCOPES, CALL_MODEL_API_PATH, CALL_PASSTHROUGH_COMMAND, CLI_EXIT_CODE_AUTH, CLI_EXIT_CODE_HANDLER, CORE_TOPICS, CORE_TOPICS_SET, CSS_UTILITIES_SCAN_CONFIG_FILENAME, CSS_UTILITY_ROLES, CSS_UTILITY_SCOPES, CliError, CssUtilitiesScanConfig, CssUtilitiesScanSection, CssUtilityDeclaration, CssUtilityEntry, CssUtilityManifest, DBX_ACTION_STATE_VALUES, DBX_DOCS_UI_EXAMPLES_SCAN_CONFIG_FILENAME, DBX_DOCS_UI_EXAMPLE_USE_KINDS, DEFAULT_ACTIONS_SCAN_OUT_PATH, DEFAULT_ACTION_COMMAND_NAME, DEFAULT_CLI_OIDC_SCOPES, DEFAULT_CLI_REDIRECT_URI, DEFAULT_CLI_SECRET_PATTERNS, DEFAULT_CSS_UTILITIES_SCAN_OUT_PATH, DEFAULT_DBX_DOCS_UI_EXAMPLES_SCAN_OUT_PATH, DEFAULT_FILTERS_SCAN_OUT_PATH, DEFAULT_FORGE_FIELDS_SCAN_OUT_PATH, DEFAULT_MANIFEST_HELP_DATA_FORMAT, DEFAULT_MANIFEST_HELP_MODE, DEFAULT_MANIFEST_MODEL_COMMAND_NAME, DEFAULT_MODEL_DECODE_COMMAND_NAME, DEFAULT_MODEL_INFO_COMMAND_NAME, DEFAULT_MODEL_SNAPSHOT_FIELDS_SCAN_OUT_PATH, DEFAULT_PIPES_SCAN_OUT_PATH, DEFAULT_SCAN_OUT_PATH, DEFAULT_UI_COMPONENTS_SCAN_OUT_PATH, DEFAULT_UTILS_SCAN_OUT_PATH, DOWNSTREAM_CLUSTERS, DUMP_MERGE_MODES, DUMP_OUTPUT_MODES, DbxDocsUiExampleEntry, DbxDocsUiExampleManifest, DbxDocsUiExampleUseEntry, DbxDocsUiExamplesScanConfig, DbxDocsUiExamplesScanSection, DbxMcpConfig, EMPTY_ACTION_REGISTRY, EMPTY_AUTH_REGISTRY, EMPTY_CSS_UTILITY_REGISTRY, EMPTY_DBX_DOCS_UI_EXAMPLES_REGISTRY, EMPTY_FILTER_REGISTRY, EMPTY_FORGE_FIELD_REGISTRY, EMPTY_MODEL_SNAPSHOT_FIELD_REGISTRY, EMPTY_PIPE_REGISTRY, EMPTY_SEMANTIC_TYPE_REGISTRY, EMPTY_TOKEN_REGISTRY, EMPTY_UI_COMPONENT_REGISTRY, EMPTY_UTIL_REGISTRY, ExtractedDbxDocsUiExampleEntrySchema, ExtractedEntrySchema, ExtractedForgeFieldEntrySchema, ExtractedUiEntrySchema, FILTERS_SCAN_CONFIG_FILENAME, FILTER_KINDS, FILTER_KIND_ORDER, FIREBASE_MODELS, FIREBASE_MODEL_GROUPS, FORGE_FIELDS_SCAN_CONFIG_FILENAME, FORGE_FIELD_ARRAY_OUTPUTS, FORGE_FIELD_COMPOSITE_SUFFIXES, FORGE_FIELD_TIERS, FORGE_FIELD_WRAPPER_PATTERNS, FORM_FIELDS, FORM_TIER_ORDER, FilterDirectiveEntry, FilterEntry, FilterInputEntry, FilterManifest, FilterPatternEntry, FiltersScanConfig, FiltersScanSection, ForgeFieldEntry, ForgeFieldManifest, ForgeFieldPropertyEntry, ForgeFieldsScanConfig, ForgeFieldsScanSection, GET_COMMAND, GET_MANY_COMMAND, MAX_MODEL_ACCESS_MULTI_READ_KEYS, MCP_MANIFEST_VERSION, MODEL_ARCHETYPES, MODEL_ARCHETYPE_ADDON_SLUGS, MODEL_ARCHETYPE_SYNC_MODES, MODEL_SNAPSHOT_FIELDS_SCAN_CONFIG_FILENAME, MODEL_SNAPSHOT_FIELD_KINDS, MODEL_WRITE_OIDC_SCOPES, MULTIPLE_PAGES_OUTPUT_MODES, ModelSnapshotFieldEntry, ModelSnapshotFieldManifest, ModelSnapshotFieldParamEntry, ModelSnapshotFieldsScanConfig, ModelSnapshotFieldsScanSection, PIPES_SCAN_CONFIG_FILENAME, PIPE_CATEGORIES, PIPE_CATEGORY_ORDER, PIPE_PURITIES, PROMPT_CANCELLED_ERROR_CODE, PipeArgEntry, PipeEntry, PipeManifest, PipesScanConfig, PipesScanSection, RESERVED_MODEL_FOLDERS, SCAN_CONFIG_FILENAME$1 as SCAN_CONFIG_FILENAME, SERVICE_TOKEN_REQUIRED_OIDC_SCOPES, STANDARD_GLOBAL_OPTION_NAMES, SemanticTypeEntry, SemanticTypeManifest, SemanticTypeScanConfig, TOKEN_ROLES, TOKEN_SOURCES, TokenDefaults, TokenEntry, TokenManifest, UI_COMPONENTS_SCAN_CONFIG_FILENAME, UI_COMPONENT_CATEGORIES, UI_COMPONENT_KINDS, UTILS_SCAN_CONFIG_FILENAME, UTIL_KINDS, UiComponentEntry, UiComponentInputEntry, UiComponentManifest, UiComponentOutputEntry, UiComponentsScanConfig, UiComponentsScanSection, UtilEntry, UtilManifest, UtilParamEntry, UtilsScanConfig, UtilsScanSection, WORKSPACE_AUTH_APPS, WORKSPACE_AUTH_CLAIMS, WORKSPACE_FACTORY_SCAN_EXCLUDE, WORKSPACE_FACTORY_SCAN_INCLUDE, applyEnvVarOverrides, buildActionCommands, buildActionsManifest, buildAuthorizationUrl, buildCliPaths, buildCssUtilitiesManifest, buildDbxDocsUiExamplesManifest, buildDispatcherCreditByName, buildDumpFilePath, buildErrorOutput, buildFiltersManifest, buildForgeFieldsManifest, buildManifest, buildManifestCommands, buildModelDecodeCommand, buildModelInfoCommand, buildModelSnapshotFieldsManifest, buildOidcDiscoveryCandidates, buildPipesManifest, buildScanProject, buildUiComponentsManifest, buildUtilsManifest, callModelOverHttp, clearDownstreamCatalogCache, collectClassPropertiesWithInheritance, configureCliErrorMapper, configureCliSecretPatterns, configureOutputOptions, createActionCommand, createActionRegistry, createActionRegistryFromEntries, createAuthCommand, createAuthMiddleware, createAuthRegistryFromEntries, createCallModelCommand, createCli, createCliContext, createCliTokenCacheStore, createContextSlot, createCssUtilityRegistry, createCssUtilityRegistryFromEntries, createDbxDocsUiExamplesRegistry, createDbxDocsUiExamplesRegistryFromEntries, createDoctorCommand, createEnvCommand, createFilterRegistry, createFilterRegistryFromEntries, createForgeFieldRegistry, createForgeFieldRegistryFromEntries, createModelSnapshotFieldRegistry, createModelSnapshotFieldRegistryFromEntries, createOutputCommand, createOutputMiddleware, createPassthroughAuthMiddleware, createPipeRegistry, createPipeRegistryFromEntries, createSemanticTypeRegistry, createSemanticTypeRegistryFromEntries, createTokenRegistry, createTokenRegistryFromEntries, createUiComponentRegistry, createUiComponentRegistryFromEntries, createUtilRegistry, createUtilRegistryFromEntries, decodeFirestoreModelKey, defaultDoctorChecks, defaultGlobber, defaultReadFile, deriveOptionalFromName, detectDataHelpFormat, detectHelpMode, discoverDownstreamFirebasePackages, discoverDownstreamPackages, discoverOidcMetadata, dumpTimestamp, exchangeAuthorizationCode, expandModelKeys, extractActionEntries, extractAngularInputs, extractAngularOutputs, extractAuthEntries, extractCssUtilityEntries, extractDbxDocsUiExampleEntries, extractEntries, extractFilterEntries, extractForgeFieldEntries, extractModelSnapshotFieldEntries, extractModels, extractPipeEntries, extractUiEntries, extractUtilEntries, fetchSessionInfo, fetchUserInfo, filterReadOnlyModelScopes, findAndLoadConfig, findCliEnvDefault, findCliModelManifestEntry, flattenList, generateOAuthState, generatePkceMaterial, getBundledManifestsDirectory, getCliContext, getCliEnvVarName, getCliTimeoutMs, getDefaultBundledActionManifestPaths, getDefaultBundledCssUtilityManifestPaths, getDefaultBundledDbxDocsUiExamplesManifestPaths, getDefaultBundledFilterManifestPaths, getDefaultBundledForgeFieldManifestPaths, getDefaultBundledManifestPaths, getDefaultBundledModelFirebaseIndexManifestPaths, getDefaultBundledModelSnapshotFieldManifestPaths, getDefaultBundledPipeManifestPaths, getDefaultBundledTokenManifestPaths, getDefaultBundledUiManifestPaths, getDefaultBundledUtilManifestPaths, getDownstreamCatalog, getFirebaseBucketKeyedByIdModels, getFirebaseDistrictKeyedByIdModels, getFirebaseExternalIdKeyedByIdModels, getFirebaseModel, getFirebaseModelByPrefix, getFirebaseModelGroup, getFirebaseModelGroups, getFirebaseModels, getFirebaseModelsByArchetype, getFirebasePrefixCatalog, getFirebaseRegionKeyedByIdModels, getFirebaseSubcollectionsOf, getFirebaseUserKeyedByIdModels, getFirebaseUserRelatedModels, getModelArchetypeBySlug, getModelArchetypesByAxisValue, getModelArchetypesByCollectionKind, getModelArchetypesBySyncMode, getModelOverHttp, getMultipleModelsOverHttp, getMultipleModelsOverHttpChunked, getOutputOptions, globToRegex, isCliEnvConfigComplete, isCliVerbose, isCoreTopic, isStdinSentinel, isTokenExpired, isVisibleProperty, iterateDbxCliCallModel, loadActionManifests, loadActionRegistry, loadAuthRegistry, loadCliConfig, loadCssUtilityRegistry, loadDbxDocsUiExamplesManifests, loadDbxDocsUiExamplesRegistry, loadFilterManifests, loadFilterRegistry, loadForgeFieldManifests, loadForgeFieldRegistry, loadModelFirebaseIndexManifests, loadModelFirebaseIndexRegistry, loadModelSnapshotFieldManifests, loadModelSnapshotFieldRegistry, loadPackageName, loadPipeManifests, loadPipeRegistry, loadScanSection, loadSemanticTypeManifests, loadSemanticTypeRegistry, loadTokenManifests, loadTokenRegistry, loadUiComponentManifests, loadUiComponentRegistry, loadUtilManifests, loadUtilRegistry, maskEnv, maskSecret, mcpManifestKey, mergeCliConfig, mergeCliEnvWithDefault, mergeOutputConfig, openStreamingDump, outputError, outputResult, packageNameToSlug, parseAnnotation, parseDeclarations$1 as parseDeclarations, parseGetArgs, parseGetManyArgs, parsePastedRedirect, parseScanArgs, pickFields, promptLine, readAllStdin, readDirectiveDecorator, readEnvTokenEntry, readPropertyDescription, readSelector, readStdinTokens, readStringProperty, refreshAccessToken, renderDecodedKey, renderModelManifestEntry, renderModelManifestFields, renderModelManifestList, requireCliContext, resolveActiveEnvName, resolveCliEnv, resolveCliEnvOrThrow, resolveCliModel, resolveDemoClaimsPath, resolveExplicitFirebasePackages, resolveModelArchetype, resolveOutputConfig, resolvePerModelGetKey, revokeToken, runActionsScanCli, runCli, runCssUtilitiesScanCli, runDbxDocsUiExamplesScanCli, runFiltersScanCli, runForgeFieldsScanCli, runModelFirebaseIndexScanCli, runModelSnapshotFieldsScanCli, runPaginatedList, runPipesScanCli, runScanCli, runScanCliBase, runUiComponentsScanCli, runUtilsScanCli, sanitizeString, saveCliConfig, scanFactoryReferences, serializeActionManifest, serializeCssUtilityManifest, serializeDbxDocsUiExamplesManifest, serializeFilterManifest, serializeForgeFieldManifest, serializeManifest, serializeModelSnapshotFieldsManifest, serializePipeManifest, serializeUiComponentManifest, serializeUtilManifest, setCliContext, setCliTimeoutMs, setCliVerbose, splitListTagText$1 as splitListTagText, toActionEntryInfo, toFilterEntryInfo, toFormFieldInfo, tracedFetch, unwrapFenced, verboseLog, withCallModelArgs, withEnv, withMultiplePages, withOutput, withServiceTokenScopes, wrapCommandHandler, wrapSyncCommandHandler };
56894
+ export { ACTIONS_SCAN_CONFIG_FILENAME, ACTION_ENTRY_ROLES, ACTION_ROLE_ORDER, ActionDirectiveEntry, ActionEntry, ActionInputEntry, ActionManifest, ActionOutputEntry, ActionStateEntry, ActionStoreEntry, ActionStoreMethodEntry, ActionStoreObservableEntry, ActionsScanConfig, ActionsScanSection, BUILTIN_AUTH_CLAIMS, BUILTIN_AUTH_ROLES, BUILTIN_AUTH_SCOPES, CALL_MODEL_API_PATH, CALL_PASSTHROUGH_COMMAND, CLI_EXIT_CODE_AUTH, CLI_EXIT_CODE_HANDLER, CORE_TOPICS, CORE_TOPICS_SET, CSS_UTILITIES_SCAN_CONFIG_FILENAME, CSS_UTILITY_ROLES, CSS_UTILITY_SCOPES, CliError, CssUtilitiesScanConfig, CssUtilitiesScanSection, CssUtilityDeclaration, CssUtilityEntry, CssUtilityManifest, DBX_ACTION_STATE_VALUES, DBX_DOCS_UI_EXAMPLES_SCAN_CONFIG_FILENAME, DBX_DOCS_UI_EXAMPLE_USE_KINDS, DEFAULT_ACTIONS_SCAN_OUT_PATH, DEFAULT_ACTION_COMMAND_NAME, DEFAULT_CLI_OIDC_SCOPES, DEFAULT_CLI_REDIRECT_URI, DEFAULT_CLI_SECRET_PATTERNS, DEFAULT_CSS_UTILITIES_SCAN_OUT_PATH, DEFAULT_DBX_DOCS_UI_EXAMPLES_SCAN_OUT_PATH, DEFAULT_FILTERS_SCAN_OUT_PATH, DEFAULT_FORGE_FIELDS_SCAN_OUT_PATH, DEFAULT_MANIFEST_HELP_DATA_FORMAT, DEFAULT_MANIFEST_HELP_MODE, DEFAULT_MANIFEST_MODEL_COMMAND_NAME, DEFAULT_MODEL_DECODE_COMMAND_NAME, DEFAULT_MODEL_INFO_COMMAND_NAME, DEFAULT_MODEL_SNAPSHOT_FIELDS_SCAN_OUT_PATH, DEFAULT_PIPES_SCAN_OUT_PATH, DEFAULT_SCAN_OUT_PATH, DEFAULT_SPECIFIER_KEY, DEFAULT_UI_COMPONENTS_SCAN_OUT_PATH, DEFAULT_UTILS_SCAN_OUT_PATH, DOWNSTREAM_CLUSTERS, DUMP_MERGE_MODES, DUMP_OUTPUT_MODES, DbxDocsUiExampleEntry, DbxDocsUiExampleManifest, DbxDocsUiExampleUseEntry, DbxDocsUiExamplesScanConfig, DbxDocsUiExamplesScanSection, DbxMcpConfig, EMPTY_ACTION_REGISTRY, EMPTY_AUTH_REGISTRY, EMPTY_CSS_UTILITY_REGISTRY, EMPTY_DBX_DOCS_UI_EXAMPLES_REGISTRY, EMPTY_FILTER_REGISTRY, EMPTY_FORGE_FIELD_REGISTRY, EMPTY_MODEL_SNAPSHOT_FIELD_REGISTRY, EMPTY_PIPE_REGISTRY, EMPTY_SEMANTIC_TYPE_REGISTRY, EMPTY_TOKEN_REGISTRY, EMPTY_UI_COMPONENT_REGISTRY, EMPTY_UTIL_REGISTRY, ExtractedDbxDocsUiExampleEntrySchema, ExtractedEntrySchema, ExtractedForgeFieldEntrySchema, ExtractedUiEntrySchema, FILTERS_SCAN_CONFIG_FILENAME, FILTER_KINDS, FILTER_KIND_ORDER, FIREBASE_MODELS, FIREBASE_MODEL_GROUPS, FORGE_FIELDS_SCAN_CONFIG_FILENAME, FORGE_FIELD_ARRAY_OUTPUTS, FORGE_FIELD_COMPOSITE_SUFFIXES, FORGE_FIELD_TIERS, FORGE_FIELD_WRAPPER_PATTERNS, FORM_FIELDS, FORM_TIER_ORDER, FilterDirectiveEntry, FilterEntry, FilterInputEntry, FilterManifest, FilterPatternEntry, FiltersScanConfig, FiltersScanSection, ForgeFieldEntry, ForgeFieldManifest, ForgeFieldPropertyEntry, ForgeFieldsScanConfig, ForgeFieldsScanSection, GET_COMMAND, GET_MANY_COMMAND, MAX_MODEL_ACCESS_MULTI_READ_KEYS, MCP_CALL_TYPE_ABBREVIATIONS, MCP_MANIFEST_VERSION, MCP_TOOL_NAME_MAX_LENGTH, MCP_TOOL_NAME_WARN_LENGTH, MODEL_ARCHETYPES, MODEL_ARCHETYPE_ADDON_SLUGS, MODEL_ARCHETYPE_SYNC_MODES, MODEL_SNAPSHOT_FIELDS_SCAN_CONFIG_FILENAME, MODEL_SNAPSHOT_FIELD_KINDS, MODEL_WRITE_OIDC_SCOPES, MULTIPLE_PAGES_OUTPUT_MODES, ModelSnapshotFieldEntry, ModelSnapshotFieldManifest, ModelSnapshotFieldParamEntry, ModelSnapshotFieldsScanConfig, ModelSnapshotFieldsScanSection, PIPES_SCAN_CONFIG_FILENAME, PIPE_CATEGORIES, PIPE_CATEGORY_ORDER, PIPE_PURITIES, PROMPT_CANCELLED_ERROR_CODE, PipeArgEntry, PipeEntry, PipeManifest, PipesScanConfig, PipesScanSection, RESERVED_MODEL_FOLDERS, SCAN_CONFIG_FILENAME$1 as SCAN_CONFIG_FILENAME, SERVICE_TOKEN_REQUIRED_OIDC_SCOPES, STANDARD_GLOBAL_OPTION_NAMES, SemanticTypeEntry, SemanticTypeManifest, SemanticTypeScanConfig, TOKEN_ROLES, TOKEN_SOURCES, TokenDefaults, TokenEntry, TokenManifest, UI_COMPONENTS_SCAN_CONFIG_FILENAME, UI_COMPONENT_CATEGORIES, UI_COMPONENT_KINDS, UTILS_SCAN_CONFIG_FILENAME, UTIL_KINDS, UiComponentEntry, UiComponentInputEntry, UiComponentManifest, UiComponentOutputEntry, UiComponentsScanConfig, UiComponentsScanSection, UtilEntry, UtilManifest, UtilParamEntry, UtilsScanConfig, UtilsScanSection, WORKSPACE_AUTH_APPS, WORKSPACE_AUTH_CLAIMS, WORKSPACE_FACTORY_SCAN_EXCLUDE, WORKSPACE_FACTORY_SCAN_INCLUDE, abbreviateMcpCallType, applyEnvVarOverrides, buildActionCommands, buildActionsManifest, buildAuthorizationUrl, buildCliPaths, buildCssUtilitiesManifest, buildDbxDocsUiExamplesManifest, buildDisambiguatedMcpToolName, buildDispatcherCreditByName, buildDumpFilePath, buildErrorOutput, buildFiltersManifest, buildForgeFieldsManifest, buildManifest, buildManifestCommands, buildMcpToolName, buildModelDecodeCommand, buildModelInfoCommand, buildModelSnapshotFieldsManifest, buildOidcDiscoveryCandidates, buildPipesManifest, buildScanProject, buildUiComponentsManifest, buildUtilsManifest, callModelOverHttp, clearDownstreamCatalogCache, collectClassPropertiesWithInheritance, configureCliErrorMapper, configureCliSecretPatterns, configureOutputOptions, createActionCommand, createActionRegistry, createActionRegistryFromEntries, createAuthCommand, createAuthMiddleware, createAuthRegistryFromEntries, createCallModelCommand, createCli, createCliContext, createCliTokenCacheStore, createContextSlot, createCssUtilityRegistry, createCssUtilityRegistryFromEntries, createDbxDocsUiExamplesRegistry, createDbxDocsUiExamplesRegistryFromEntries, createDoctorCommand, createEnvCommand, createFilterRegistry, createFilterRegistryFromEntries, createForgeFieldRegistry, createForgeFieldRegistryFromEntries, createModelSnapshotFieldRegistry, createModelSnapshotFieldRegistryFromEntries, createOutputCommand, createOutputMiddleware, createPassthroughAuthMiddleware, createPipeRegistry, createPipeRegistryFromEntries, createSemanticTypeRegistry, createSemanticTypeRegistryFromEntries, createTokenRegistry, createTokenRegistryFromEntries, createUiComponentRegistry, createUiComponentRegistryFromEntries, createUtilRegistry, createUtilRegistryFromEntries, decodeFirestoreModelKey, defaultDoctorChecks, defaultGlobber, defaultReadFile, deriveOptionalFromName, detectDataHelpFormat, detectHelpMode, discoverDownstreamFirebasePackages, discoverDownstreamPackages, discoverOidcMetadata, dumpTimestamp, exchangeAuthorizationCode, expandModelKeys, extractActionEntries, extractAngularInputs, extractAngularOutputs, extractAuthEntries, extractCssUtilityEntries, extractDbxDocsUiExampleEntries, extractEntries, extractFilterEntries, extractForgeFieldEntries, extractModelSnapshotFieldEntries, extractModels, extractPipeEntries, extractUiEntries, extractUtilEntries, fetchSessionInfo, fetchUserInfo, filterReadOnlyModelScopes, findAndLoadConfig, findCliEnvDefault, findCliModelManifestEntry, flattenList, generateOAuthState, generatePkceMaterial, getBundledManifestsDirectory, getCliContext, getCliEnvVarName, getCliTimeoutMs, getDefaultBundledActionManifestPaths, getDefaultBundledCssUtilityManifestPaths, getDefaultBundledDbxDocsUiExamplesManifestPaths, getDefaultBundledFilterManifestPaths, getDefaultBundledForgeFieldManifestPaths, getDefaultBundledManifestPaths, getDefaultBundledModelFirebaseIndexManifestPaths, getDefaultBundledModelSnapshotFieldManifestPaths, getDefaultBundledPipeManifestPaths, getDefaultBundledTokenManifestPaths, getDefaultBundledUiManifestPaths, getDefaultBundledUtilManifestPaths, getDownstreamCatalog, getFirebaseBucketKeyedByIdModels, getFirebaseDistrictKeyedByIdModels, getFirebaseExternalIdKeyedByIdModels, getFirebaseModel, getFirebaseModelByPrefix, getFirebaseModelGroup, getFirebaseModelGroups, getFirebaseModels, getFirebaseModelsByArchetype, getFirebasePrefixCatalog, getFirebaseRegionKeyedByIdModels, getFirebaseSubcollectionsOf, getFirebaseUserKeyedByIdModels, getFirebaseUserRelatedModels, getModelArchetypeBySlug, getModelArchetypesByAxisValue, getModelArchetypesByCollectionKind, getModelArchetypesBySyncMode, getModelOverHttp, getMultipleModelsOverHttp, getMultipleModelsOverHttpChunked, getOutputOptions, globToRegex, isCliEnvConfigComplete, isCliVerbose, isCoreTopic, isStdinSentinel, isTokenExpired, isVisibleProperty, iterateDbxCliCallModel, loadActionManifests, loadActionRegistry, loadAuthRegistry, loadCliConfig, loadCssUtilityRegistry, loadDbxDocsUiExamplesManifests, loadDbxDocsUiExamplesRegistry, loadFilterManifests, loadFilterRegistry, loadForgeFieldManifests, loadForgeFieldRegistry, loadModelFirebaseIndexManifests, loadModelFirebaseIndexRegistry, loadModelSnapshotFieldManifests, loadModelSnapshotFieldRegistry, loadPackageName, loadPipeManifests, loadPipeRegistry, loadScanSection, loadSemanticTypeManifests, loadSemanticTypeRegistry, loadTokenManifests, loadTokenRegistry, loadUiComponentManifests, loadUiComponentRegistry, loadUtilManifests, loadUtilRegistry, maskEnv, maskSecret, mcpManifestKey, mergeCliConfig, mergeCliEnvWithDefault, mergeOutputConfig, openStreamingDump, outputError, outputResult, packageNameToSlug, parseAnnotation, parseDeclarations$1 as parseDeclarations, parseGetArgs, parseGetManyArgs, parsePastedRedirect, parseScanArgs, pickFields, promptLine, readAllStdin, readDirectiveDecorator, readEnvTokenEntry, readPropertyDescription, readSelector, readStdinTokens, readStringProperty, refreshAccessToken, renderDecodedKey, renderModelManifestEntry, renderModelManifestFields, renderModelManifestList, requireCliContext, resolveActiveEnvName, resolveCliEnv, resolveCliEnvOrThrow, resolveCliModel, resolveDemoClaimsPath, resolveExplicitFirebasePackages, resolveModelArchetype, resolveOutputConfig, resolvePerModelGetKey, revokeToken, runActionsScanCli, runCli, runCssUtilitiesScanCli, runDbxDocsUiExamplesScanCli, runFiltersScanCli, runForgeFieldsScanCli, runModelFirebaseIndexScanCli, runModelSnapshotFieldsScanCli, runPaginatedList, runPipesScanCli, runScanCli, runScanCliBase, runUiComponentsScanCli, runUtilsScanCli, sanitizeString, saveCliConfig, scanFactoryReferences, serializeActionManifest, serializeCssUtilityManifest, serializeDbxDocsUiExamplesManifest, serializeFilterManifest, serializeForgeFieldManifest, serializeManifest, serializeModelSnapshotFieldsManifest, serializePipeManifest, serializeUiComponentManifest, serializeUtilManifest, setCliContext, setCliTimeoutMs, setCliVerbose, splitListTagText$1 as splitListTagText, toActionEntryInfo, toFilterEntryInfo, toFormFieldInfo, tracedFetch, unwrapFenced, validateMcpToolName, verboseLog, withCallModelArgs, withEnv, withMultiplePages, withOutput, withServiceTokenScopes, wrapCommandHandler, wrapSyncCommandHandler };
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dereekb/dbx-cli-lint-cache",
3
- "version": "13.13.0",
3
+ "version": "13.14.0",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "devDependencies": {
@@ -8,7 +8,7 @@
8
8
  "eslint": "10.4.0"
9
9
  },
10
10
  "peerDependencies": {
11
- "@dereekb/util": "13.13.0",
11
+ "@dereekb/util": "13.14.0",
12
12
  "yargs": "^18.0.0"
13
13
  }
14
14
  }
@@ -57,6 +57,11 @@ var SUPPORTED_VERBS = new Set([
57
57
  'query',
58
58
  'invoke'
59
59
  ]);
60
+ /**
61
+ * JSDoc tag (without leading `@`) on a CRUD leaf naming the interface that a handler's
62
+ * `mapSuccessfulResult` produces for MCP. When present, the MCP manifest output schema is
63
+ * synthesized from this type instead of the raw result type.
64
+ */ var DBX_MODEL_API_MCP_RESULT_MARKER = 'dbxModelApiMcpResult';
60
65
  /**
61
66
  * Walks a `<model>.api.ts` source and returns one {@link CrudEntry} per
62
67
  * callable leaf (CRUD or standalone). Best-effort: malformed configs return
@@ -136,6 +141,7 @@ function extractCrudEntries(source) {
136
141
  valueNode: verbValueNode,
137
142
  entries: entries,
138
143
  fallbackDescription: readJsDocSummary(verbMember),
144
+ fallbackMcpResultTypeName: readJsDocTagValue(verbMember, DBX_MODEL_API_MCP_RESULT_MARKER),
139
145
  resolveTypeDocs: resolveTypeDocs
140
146
  });
141
147
  }
@@ -187,6 +193,8 @@ function extractCrudEntries(source) {
187
193
  var tuple = valueNode1 ? readTupleParamsResult(valueNode1) : undefined;
188
194
  var paramsDocs = resolveTypeDocs(tuple === null || tuple === void 0 ? void 0 : tuple.params);
189
195
  var resultDocs = resolveTypeDocs(tuple === null || tuple === void 0 ? void 0 : tuple.result);
196
+ var mcpResultTypeName = readJsDocTagValue(member1, DBX_MODEL_API_MCP_RESULT_MARKER);
197
+ var mcpResultDocs = resolveTypeDocs(mcpResultTypeName);
190
198
  entries.push({
191
199
  model: key,
192
200
  verb: 'standalone',
@@ -199,7 +207,10 @@ function extractCrudEntries(source) {
199
207
  paramsFields: paramsDocs === null || paramsDocs === void 0 ? void 0 : paramsDocs.fields,
200
208
  paramsHasApiParamsTag: paramsDocs === null || paramsDocs === void 0 ? void 0 : paramsDocs.hasApiParamsTag,
201
209
  resultTypeDescription: resultDocs === null || resultDocs === void 0 ? void 0 : resultDocs.typeDescription,
202
- resultFields: resultDocs === null || resultDocs === void 0 ? void 0 : resultDocs.fields
210
+ resultFields: resultDocs === null || resultDocs === void 0 ? void 0 : resultDocs.fields,
211
+ mcpResultTypeName: mcpResultTypeName,
212
+ mcpResultTypeDescription: mcpResultDocs === null || mcpResultDocs === void 0 ? void 0 : mcpResultDocs.typeDescription,
213
+ mcpResultFields: mcpResultDocs === null || mcpResultDocs === void 0 ? void 0 : mcpResultDocs.fields
203
214
  });
204
215
  }
205
216
  } catch (err) {
@@ -355,7 +366,7 @@ function isNullLiteralType(node) {
355
366
  }
356
367
  function collectVerbEntries(input) {
357
368
  var _readTupleParamsResult;
358
- var modelName = input.modelName, verb = input.verb, valueNode = input.valueNode, entries = input.entries, fallbackDescription = input.fallbackDescription, resolveTypeDocs = input.resolveTypeDocs;
369
+ var modelName = input.modelName, verb = input.verb, valueNode = input.valueNode, entries = input.entries, fallbackDescription = input.fallbackDescription, fallbackMcpResultTypeName = input.fallbackMcpResultTypeName, resolveTypeDocs = input.resolveTypeDocs;
359
370
  if (tsMorph.Node.isTypeLiteral(valueNode)) {
360
371
  var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
361
372
  try {
@@ -370,6 +381,8 @@ function collectVerbEntries(input) {
370
381
  var leaf = leafNode ? (_readTupleParamsResult1 = readTupleParamsResult(leafNode)) !== null && _readTupleParamsResult1 !== void 0 ? _readTupleParamsResult1 : readBareParams(leafNode) : undefined;
371
382
  var paramsDocs = resolveTypeDocs(leaf === null || leaf === void 0 ? void 0 : leaf.params);
372
383
  var resultDocs = resolveTypeDocs(leaf === null || leaf === void 0 ? void 0 : leaf.result);
384
+ var mcpResultTypeName = readJsDocTagValue(specMember, DBX_MODEL_API_MCP_RESULT_MARKER);
385
+ var mcpResultDocs = resolveTypeDocs(mcpResultTypeName);
373
386
  entries.push({
374
387
  model: modelName,
375
388
  verb: verb,
@@ -382,7 +395,10 @@ function collectVerbEntries(input) {
382
395
  paramsFields: paramsDocs === null || paramsDocs === void 0 ? void 0 : paramsDocs.fields,
383
396
  paramsHasApiParamsTag: paramsDocs === null || paramsDocs === void 0 ? void 0 : paramsDocs.hasApiParamsTag,
384
397
  resultTypeDescription: resultDocs === null || resultDocs === void 0 ? void 0 : resultDocs.typeDescription,
385
- resultFields: resultDocs === null || resultDocs === void 0 ? void 0 : resultDocs.fields
398
+ resultFields: resultDocs === null || resultDocs === void 0 ? void 0 : resultDocs.fields,
399
+ mcpResultTypeName: mcpResultTypeName,
400
+ mcpResultTypeDescription: mcpResultDocs === null || mcpResultDocs === void 0 ? void 0 : mcpResultDocs.typeDescription,
401
+ mcpResultFields: mcpResultDocs === null || mcpResultDocs === void 0 ? void 0 : mcpResultDocs.fields
386
402
  });
387
403
  }
388
404
  } catch (err) {
@@ -404,6 +420,7 @@ function collectVerbEntries(input) {
404
420
  var leaf1 = (_readTupleParamsResult = readTupleParamsResult(valueNode)) !== null && _readTupleParamsResult !== void 0 ? _readTupleParamsResult : readBareParams(valueNode);
405
421
  var paramsDocs1 = resolveTypeDocs(leaf1 === null || leaf1 === void 0 ? void 0 : leaf1.params);
406
422
  var resultDocs1 = resolveTypeDocs(leaf1 === null || leaf1 === void 0 ? void 0 : leaf1.result);
423
+ var mcpResultDocs1 = resolveTypeDocs(fallbackMcpResultTypeName);
407
424
  entries.push({
408
425
  model: modelName,
409
426
  verb: verb,
@@ -416,7 +433,10 @@ function collectVerbEntries(input) {
416
433
  paramsFields: paramsDocs1 === null || paramsDocs1 === void 0 ? void 0 : paramsDocs1.fields,
417
434
  paramsHasApiParamsTag: paramsDocs1 === null || paramsDocs1 === void 0 ? void 0 : paramsDocs1.hasApiParamsTag,
418
435
  resultTypeDescription: resultDocs1 === null || resultDocs1 === void 0 ? void 0 : resultDocs1.typeDescription,
419
- resultFields: resultDocs1 === null || resultDocs1 === void 0 ? void 0 : resultDocs1.fields
436
+ resultFields: resultDocs1 === null || resultDocs1 === void 0 ? void 0 : resultDocs1.fields,
437
+ mcpResultTypeName: fallbackMcpResultTypeName,
438
+ mcpResultTypeDescription: mcpResultDocs1 === null || mcpResultDocs1 === void 0 ? void 0 : mcpResultDocs1.typeDescription,
439
+ mcpResultFields: mcpResultDocs1 === null || mcpResultDocs1 === void 0 ? void 0 : mcpResultDocs1.fields
420
440
  });
421
441
  }
422
442
  function readTupleParamsResult(node) {
@@ -569,6 +589,64 @@ function readTypeDocs(sourceFile, typeName) {
569
589
  }
570
590
  return result;
571
591
  }
592
+ /**
593
+ * Reads the value token of a JSDoc tag (e.g. the `Foo` in `@dbxModelApiMcpResult Foo`).
594
+ *
595
+ * Used for value-carrying tags like `@dbxModelApiMcpResult` where the first token after the tag
596
+ * name names a type. Returns the first whitespace-delimited token of the tag's comment text.
597
+ *
598
+ * @param node - Any JSDocable ts-morph node (property signature, etc.).
599
+ * @param tagName - Tag name without the leading `@` (e.g. `'dbxModelApiMcpResult'`).
600
+ * @returns The first token of the tag's value, or `undefined` when the tag is absent or empty.
601
+ */ function readJsDocTagValue(node, tagName) {
602
+ var result;
603
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
604
+ try {
605
+ for(var _iterator = node.getJsDocs()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
606
+ var doc = _step.value;
607
+ var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
608
+ try {
609
+ for(var _iterator1 = doc.getTags()[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
610
+ var tag = _step1.value;
611
+ if (tag.getTagName() === tagName) {
612
+ var _tag_getCommentText;
613
+ var token = (_tag_getCommentText = tag.getCommentText()) === null || _tag_getCommentText === void 0 ? void 0 : _tag_getCommentText.trim().split(/\s+/)[0];
614
+ if (token) {
615
+ result = token;
616
+ }
617
+ }
618
+ }
619
+ } catch (err) {
620
+ _didIteratorError1 = true;
621
+ _iteratorError1 = err;
622
+ } finally{
623
+ try {
624
+ if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
625
+ _iterator1.return();
626
+ }
627
+ } finally{
628
+ if (_didIteratorError1) {
629
+ throw _iteratorError1;
630
+ }
631
+ }
632
+ }
633
+ }
634
+ } catch (err) {
635
+ _didIteratorError = true;
636
+ _iteratorError = err;
637
+ } finally{
638
+ try {
639
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
640
+ _iterator.return();
641
+ }
642
+ } finally{
643
+ if (_didIteratorError) {
644
+ throw _iteratorError;
645
+ }
646
+ }
647
+ }
648
+ return result;
649
+ }
572
650
  function readJsDocSummary(node) {
573
651
  var result;
574
652
  var docs = node.getJsDocs();
@@ -617,7 +695,9 @@ var READ_LEVEL_VALUES = new Set([
617
695
  'permissions'
618
696
  ]);
619
697
  var SERVICE_FACTORY_TAG = 'dbxModelServiceFactory';
698
+ var MCP_TOOL_NAME_SEGMENT_TAG = 'dbxModelMcpToolNameSegment';
620
699
  var MODEL_TYPE_VALUE_PATTERN = /^[a-z][A-Za-z0-9_$]*$/;
700
+ var TOOL_NAME_SEGMENT_PATTERN = /^[A-Za-z][A-Za-z0-9_$]*$/;
621
701
  /**
622
702
  * TS utility/structural wrappers that don't change the field surface for
623
703
  * inheritance walks — `Partial<T>`, `Required<T>`, `Readonly<T>`,
@@ -803,6 +883,7 @@ function buildInterface(decl) {
803
883
  var jsDocs = decl.getJsDocs();
804
884
  var hasDbxModelTag = jsDocsHaveTag(jsDocs, 'dbxModel');
805
885
  var dbxModelRead = readDbxModelReadTag(jsDocs);
886
+ var mcpToolNameSegment = readMcpToolNameSegmentTag(jsDocs);
806
887
  var extendsNames = decl.getExtends().map(resolveExtendsName);
807
888
  var props = [];
808
889
  var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
@@ -847,8 +928,61 @@ function buildInterface(decl) {
847
928
  props: props
848
929
  }, dbxModelRead === undefined ? {} : {
849
930
  dbxModelRead: dbxModelRead
931
+ }, mcpToolNameSegment === undefined ? {} : {
932
+ mcpToolNameSegment: mcpToolNameSegment
850
933
  });
851
934
  }
935
+ function readMcpToolNameSegmentTag(jsDocs) {
936
+ var result;
937
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
938
+ try {
939
+ for(var _iterator = jsDocs[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
940
+ var doc = _step.value;
941
+ var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
942
+ try {
943
+ for(var _iterator1 = doc.getTags()[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
944
+ var tag = _step1.value;
945
+ var _tag_getCommentText;
946
+ if (tag.getTagName() !== MCP_TOOL_NAME_SEGMENT_TAG) continue;
947
+ if (result !== undefined) continue;
948
+ var raw = (_tag_getCommentText = tag.getCommentText()) === null || _tag_getCommentText === void 0 ? void 0 : _tag_getCommentText.trim();
949
+ if (raw === undefined || raw.length === 0) continue;
950
+ var firstToken = raw.split(/\s+/)[0];
951
+ if (TOOL_NAME_SEGMENT_PATTERN.test(firstToken)) {
952
+ result = firstToken;
953
+ }
954
+ }
955
+ } catch (err) {
956
+ _didIteratorError1 = true;
957
+ _iteratorError1 = err;
958
+ } finally{
959
+ try {
960
+ if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
961
+ _iterator1.return();
962
+ }
963
+ } finally{
964
+ if (_didIteratorError1) {
965
+ throw _iteratorError1;
966
+ }
967
+ }
968
+ }
969
+ }
970
+ } catch (err) {
971
+ _didIteratorError = true;
972
+ _iteratorError = err;
973
+ } finally{
974
+ try {
975
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
976
+ _iterator.return();
977
+ }
978
+ } finally{
979
+ if (_didIteratorError) {
980
+ throw _iteratorError;
981
+ }
982
+ }
983
+ }
984
+ return result;
985
+ }
852
986
  function readDbxModelReadTag(jsDocs) {
853
987
  var result;
854
988
  var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
@@ -55,6 +55,11 @@ var SUPPORTED_VERBS = new Set([
55
55
  'query',
56
56
  'invoke'
57
57
  ]);
58
+ /**
59
+ * JSDoc tag (without leading `@`) on a CRUD leaf naming the interface that a handler's
60
+ * `mapSuccessfulResult` produces for MCP. When present, the MCP manifest output schema is
61
+ * synthesized from this type instead of the raw result type.
62
+ */ var DBX_MODEL_API_MCP_RESULT_MARKER = 'dbxModelApiMcpResult';
58
63
  /**
59
64
  * Walks a `<model>.api.ts` source and returns one {@link CrudEntry} per
60
65
  * callable leaf (CRUD or standalone). Best-effort: malformed configs return
@@ -134,6 +139,7 @@ function extractCrudEntries(source) {
134
139
  valueNode: verbValueNode,
135
140
  entries: entries,
136
141
  fallbackDescription: readJsDocSummary(verbMember),
142
+ fallbackMcpResultTypeName: readJsDocTagValue(verbMember, DBX_MODEL_API_MCP_RESULT_MARKER),
137
143
  resolveTypeDocs: resolveTypeDocs
138
144
  });
139
145
  }
@@ -185,6 +191,8 @@ function extractCrudEntries(source) {
185
191
  var tuple = valueNode1 ? readTupleParamsResult(valueNode1) : undefined;
186
192
  var paramsDocs = resolveTypeDocs(tuple === null || tuple === void 0 ? void 0 : tuple.params);
187
193
  var resultDocs = resolveTypeDocs(tuple === null || tuple === void 0 ? void 0 : tuple.result);
194
+ var mcpResultTypeName = readJsDocTagValue(member1, DBX_MODEL_API_MCP_RESULT_MARKER);
195
+ var mcpResultDocs = resolveTypeDocs(mcpResultTypeName);
188
196
  entries.push({
189
197
  model: key,
190
198
  verb: 'standalone',
@@ -197,7 +205,10 @@ function extractCrudEntries(source) {
197
205
  paramsFields: paramsDocs === null || paramsDocs === void 0 ? void 0 : paramsDocs.fields,
198
206
  paramsHasApiParamsTag: paramsDocs === null || paramsDocs === void 0 ? void 0 : paramsDocs.hasApiParamsTag,
199
207
  resultTypeDescription: resultDocs === null || resultDocs === void 0 ? void 0 : resultDocs.typeDescription,
200
- resultFields: resultDocs === null || resultDocs === void 0 ? void 0 : resultDocs.fields
208
+ resultFields: resultDocs === null || resultDocs === void 0 ? void 0 : resultDocs.fields,
209
+ mcpResultTypeName: mcpResultTypeName,
210
+ mcpResultTypeDescription: mcpResultDocs === null || mcpResultDocs === void 0 ? void 0 : mcpResultDocs.typeDescription,
211
+ mcpResultFields: mcpResultDocs === null || mcpResultDocs === void 0 ? void 0 : mcpResultDocs.fields
201
212
  });
202
213
  }
203
214
  } catch (err) {
@@ -353,7 +364,7 @@ function isNullLiteralType(node) {
353
364
  }
354
365
  function collectVerbEntries(input) {
355
366
  var _readTupleParamsResult;
356
- var modelName = input.modelName, verb = input.verb, valueNode = input.valueNode, entries = input.entries, fallbackDescription = input.fallbackDescription, resolveTypeDocs = input.resolveTypeDocs;
367
+ var modelName = input.modelName, verb = input.verb, valueNode = input.valueNode, entries = input.entries, fallbackDescription = input.fallbackDescription, fallbackMcpResultTypeName = input.fallbackMcpResultTypeName, resolveTypeDocs = input.resolveTypeDocs;
357
368
  if (Node.isTypeLiteral(valueNode)) {
358
369
  var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
359
370
  try {
@@ -368,6 +379,8 @@ function collectVerbEntries(input) {
368
379
  var leaf = leafNode ? (_readTupleParamsResult1 = readTupleParamsResult(leafNode)) !== null && _readTupleParamsResult1 !== void 0 ? _readTupleParamsResult1 : readBareParams(leafNode) : undefined;
369
380
  var paramsDocs = resolveTypeDocs(leaf === null || leaf === void 0 ? void 0 : leaf.params);
370
381
  var resultDocs = resolveTypeDocs(leaf === null || leaf === void 0 ? void 0 : leaf.result);
382
+ var mcpResultTypeName = readJsDocTagValue(specMember, DBX_MODEL_API_MCP_RESULT_MARKER);
383
+ var mcpResultDocs = resolveTypeDocs(mcpResultTypeName);
371
384
  entries.push({
372
385
  model: modelName,
373
386
  verb: verb,
@@ -380,7 +393,10 @@ function collectVerbEntries(input) {
380
393
  paramsFields: paramsDocs === null || paramsDocs === void 0 ? void 0 : paramsDocs.fields,
381
394
  paramsHasApiParamsTag: paramsDocs === null || paramsDocs === void 0 ? void 0 : paramsDocs.hasApiParamsTag,
382
395
  resultTypeDescription: resultDocs === null || resultDocs === void 0 ? void 0 : resultDocs.typeDescription,
383
- resultFields: resultDocs === null || resultDocs === void 0 ? void 0 : resultDocs.fields
396
+ resultFields: resultDocs === null || resultDocs === void 0 ? void 0 : resultDocs.fields,
397
+ mcpResultTypeName: mcpResultTypeName,
398
+ mcpResultTypeDescription: mcpResultDocs === null || mcpResultDocs === void 0 ? void 0 : mcpResultDocs.typeDescription,
399
+ mcpResultFields: mcpResultDocs === null || mcpResultDocs === void 0 ? void 0 : mcpResultDocs.fields
384
400
  });
385
401
  }
386
402
  } catch (err) {
@@ -402,6 +418,7 @@ function collectVerbEntries(input) {
402
418
  var leaf1 = (_readTupleParamsResult = readTupleParamsResult(valueNode)) !== null && _readTupleParamsResult !== void 0 ? _readTupleParamsResult : readBareParams(valueNode);
403
419
  var paramsDocs1 = resolveTypeDocs(leaf1 === null || leaf1 === void 0 ? void 0 : leaf1.params);
404
420
  var resultDocs1 = resolveTypeDocs(leaf1 === null || leaf1 === void 0 ? void 0 : leaf1.result);
421
+ var mcpResultDocs1 = resolveTypeDocs(fallbackMcpResultTypeName);
405
422
  entries.push({
406
423
  model: modelName,
407
424
  verb: verb,
@@ -414,7 +431,10 @@ function collectVerbEntries(input) {
414
431
  paramsFields: paramsDocs1 === null || paramsDocs1 === void 0 ? void 0 : paramsDocs1.fields,
415
432
  paramsHasApiParamsTag: paramsDocs1 === null || paramsDocs1 === void 0 ? void 0 : paramsDocs1.hasApiParamsTag,
416
433
  resultTypeDescription: resultDocs1 === null || resultDocs1 === void 0 ? void 0 : resultDocs1.typeDescription,
417
- resultFields: resultDocs1 === null || resultDocs1 === void 0 ? void 0 : resultDocs1.fields
434
+ resultFields: resultDocs1 === null || resultDocs1 === void 0 ? void 0 : resultDocs1.fields,
435
+ mcpResultTypeName: fallbackMcpResultTypeName,
436
+ mcpResultTypeDescription: mcpResultDocs1 === null || mcpResultDocs1 === void 0 ? void 0 : mcpResultDocs1.typeDescription,
437
+ mcpResultFields: mcpResultDocs1 === null || mcpResultDocs1 === void 0 ? void 0 : mcpResultDocs1.fields
418
438
  });
419
439
  }
420
440
  function readTupleParamsResult(node) {
@@ -567,6 +587,64 @@ function readTypeDocs(sourceFile, typeName) {
567
587
  }
568
588
  return result;
569
589
  }
590
+ /**
591
+ * Reads the value token of a JSDoc tag (e.g. the `Foo` in `@dbxModelApiMcpResult Foo`).
592
+ *
593
+ * Used for value-carrying tags like `@dbxModelApiMcpResult` where the first token after the tag
594
+ * name names a type. Returns the first whitespace-delimited token of the tag's comment text.
595
+ *
596
+ * @param node - Any JSDocable ts-morph node (property signature, etc.).
597
+ * @param tagName - Tag name without the leading `@` (e.g. `'dbxModelApiMcpResult'`).
598
+ * @returns The first token of the tag's value, or `undefined` when the tag is absent or empty.
599
+ */ function readJsDocTagValue(node, tagName) {
600
+ var result;
601
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
602
+ try {
603
+ for(var _iterator = node.getJsDocs()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
604
+ var doc = _step.value;
605
+ var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
606
+ try {
607
+ for(var _iterator1 = doc.getTags()[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
608
+ var tag = _step1.value;
609
+ if (tag.getTagName() === tagName) {
610
+ var _tag_getCommentText;
611
+ var token = (_tag_getCommentText = tag.getCommentText()) === null || _tag_getCommentText === void 0 ? void 0 : _tag_getCommentText.trim().split(/\s+/)[0];
612
+ if (token) {
613
+ result = token;
614
+ }
615
+ }
616
+ }
617
+ } catch (err) {
618
+ _didIteratorError1 = true;
619
+ _iteratorError1 = err;
620
+ } finally{
621
+ try {
622
+ if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
623
+ _iterator1.return();
624
+ }
625
+ } finally{
626
+ if (_didIteratorError1) {
627
+ throw _iteratorError1;
628
+ }
629
+ }
630
+ }
631
+ }
632
+ } catch (err) {
633
+ _didIteratorError = true;
634
+ _iteratorError = err;
635
+ } finally{
636
+ try {
637
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
638
+ _iterator.return();
639
+ }
640
+ } finally{
641
+ if (_didIteratorError) {
642
+ throw _iteratorError;
643
+ }
644
+ }
645
+ }
646
+ return result;
647
+ }
570
648
  function readJsDocSummary(node) {
571
649
  var result;
572
650
  var docs = node.getJsDocs();
@@ -615,7 +693,9 @@ var READ_LEVEL_VALUES = new Set([
615
693
  'permissions'
616
694
  ]);
617
695
  var SERVICE_FACTORY_TAG = 'dbxModelServiceFactory';
696
+ var MCP_TOOL_NAME_SEGMENT_TAG = 'dbxModelMcpToolNameSegment';
618
697
  var MODEL_TYPE_VALUE_PATTERN = /^[a-z][A-Za-z0-9_$]*$/;
698
+ var TOOL_NAME_SEGMENT_PATTERN = /^[A-Za-z][A-Za-z0-9_$]*$/;
619
699
  /**
620
700
  * TS utility/structural wrappers that don't change the field surface for
621
701
  * inheritance walks — `Partial<T>`, `Required<T>`, `Readonly<T>`,
@@ -801,6 +881,7 @@ function buildInterface(decl) {
801
881
  var jsDocs = decl.getJsDocs();
802
882
  var hasDbxModelTag = jsDocsHaveTag(jsDocs, 'dbxModel');
803
883
  var dbxModelRead = readDbxModelReadTag(jsDocs);
884
+ var mcpToolNameSegment = readMcpToolNameSegmentTag(jsDocs);
804
885
  var extendsNames = decl.getExtends().map(resolveExtendsName);
805
886
  var props = [];
806
887
  var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
@@ -845,8 +926,61 @@ function buildInterface(decl) {
845
926
  props: props
846
927
  }, dbxModelRead === undefined ? {} : {
847
928
  dbxModelRead: dbxModelRead
929
+ }, mcpToolNameSegment === undefined ? {} : {
930
+ mcpToolNameSegment: mcpToolNameSegment
848
931
  });
849
932
  }
933
+ function readMcpToolNameSegmentTag(jsDocs) {
934
+ var result;
935
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
936
+ try {
937
+ for(var _iterator = jsDocs[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
938
+ var doc = _step.value;
939
+ var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
940
+ try {
941
+ for(var _iterator1 = doc.getTags()[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
942
+ var tag = _step1.value;
943
+ var _tag_getCommentText;
944
+ if (tag.getTagName() !== MCP_TOOL_NAME_SEGMENT_TAG) continue;
945
+ if (result !== undefined) continue;
946
+ var raw = (_tag_getCommentText = tag.getCommentText()) === null || _tag_getCommentText === void 0 ? void 0 : _tag_getCommentText.trim();
947
+ if (raw === undefined || raw.length === 0) continue;
948
+ var firstToken = raw.split(/\s+/)[0];
949
+ if (TOOL_NAME_SEGMENT_PATTERN.test(firstToken)) {
950
+ result = firstToken;
951
+ }
952
+ }
953
+ } catch (err) {
954
+ _didIteratorError1 = true;
955
+ _iteratorError1 = err;
956
+ } finally{
957
+ try {
958
+ if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
959
+ _iterator1.return();
960
+ }
961
+ } finally{
962
+ if (_didIteratorError1) {
963
+ throw _iteratorError1;
964
+ }
965
+ }
966
+ }
967
+ }
968
+ } catch (err) {
969
+ _didIteratorError = true;
970
+ _iteratorError = err;
971
+ } finally{
972
+ try {
973
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
974
+ _iterator.return();
975
+ }
976
+ } finally{
977
+ if (_didIteratorError) {
978
+ throw _iteratorError;
979
+ }
980
+ }
981
+ }
982
+ return result;
983
+ }
850
984
  function readDbxModelReadTag(jsDocs) {
851
985
  var result;
852
986
  var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@dereekb/dbx-cli/manifest-extract",
3
- "version": "13.13.0",
3
+ "version": "13.14.0",
4
4
  "sideEffects": false,
5
5
  "peerDependencies": {
6
6
  "ts-morph": "^21.0.0"
7
7
  },
8
8
  "devDependencies": {
9
- "@dereekb/firebase": "13.13.0"
9
+ "@dereekb/firebase": "13.14.0"
10
10
  },
11
11
  "exports": {
12
12
  "./package.json": "./package.json",