@confluentinc/mcp-confluent 1.3.0 → 1.4.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/README.md +148 -67
- package/assets/oauth-templates/callback-success.html +80 -0
- package/assets/oauth-templates/styles.html +101 -40
- package/dist/config/env-config.d.ts.map +1 -1
- package/dist/config/env-config.js +5 -0
- package/dist/config/env-config.js.map +1 -1
- package/dist/config/models.d.ts +3 -0
- package/dist/config/models.d.ts.map +1 -1
- package/dist/config/models.js +5 -0
- package/dist/config/models.js.map +1 -1
- package/dist/confluent/base-client-manager.d.ts +34 -1
- package/dist/confluent/base-client-manager.d.ts.map +1 -1
- package/dist/confluent/base-client-manager.js.map +1 -1
- package/dist/confluent/direct-client-manager.d.ts +2 -2
- package/dist/confluent/direct-client-manager.d.ts.map +1 -1
- package/dist/confluent/direct-client-manager.js +25 -17
- package/dist/confluent/direct-client-manager.js.map +1 -1
- package/dist/confluent/node-deps.d.ts +1 -0
- package/dist/confluent/node-deps.d.ts.map +1 -1
- package/dist/confluent/node-deps.js +7 -1
- package/dist/confluent/node-deps.js.map +1 -1
- package/dist/confluent/oauth/callback-pages.d.ts +9 -1
- package/dist/confluent/oauth/callback-pages.d.ts.map +1 -1
- package/dist/confluent/oauth/callback-pages.js +14 -5
- package/dist/confluent/oauth/callback-pages.js.map +1 -1
- package/dist/confluent/oauth/pkce-login.d.ts +20 -1
- package/dist/confluent/oauth/pkce-login.d.ts.map +1 -1
- package/dist/confluent/oauth/pkce-login.js +118 -9
- package/dist/confluent/oauth/pkce-login.js.map +1 -1
- package/dist/confluent/oauth-client-manager.d.ts +2 -2
- package/dist/confluent/oauth-client-manager.d.ts.map +1 -1
- package/dist/confluent/oauth-client-manager.js +6 -6
- package/dist/confluent/oauth-client-manager.js.map +1 -1
- package/dist/confluent/schema-registry-helper.d.ts +5 -9
- package/dist/confluent/schema-registry-helper.d.ts.map +1 -1
- package/dist/confluent/schema-registry-helper.js +1 -9
- package/dist/confluent/schema-registry-helper.js.map +1 -1
- package/dist/confluent/telemetry.d.ts +7 -1
- package/dist/confluent/telemetry.d.ts.map +1 -1
- package/dist/confluent/telemetry.js +6 -0
- package/dist/confluent/telemetry.js.map +1 -1
- package/dist/confluent/tools/base-tools.d.ts +42 -0
- package/dist/confluent/tools/base-tools.d.ts.map +1 -1
- package/dist/confluent/tools/base-tools.js +36 -0
- package/dist/confluent/tools/base-tools.js.map +1 -1
- package/dist/confluent/tools/connection-predicates.d.ts +13 -5
- package/dist/confluent/tools/connection-predicates.d.ts.map +1 -1
- package/dist/confluent/tools/connection-predicates.js +16 -5
- package/dist/confluent/tools/connection-predicates.js.map +1 -1
- package/dist/confluent/tools/handlers/billing/list-billing-costs-handler.d.ts +2 -1
- package/dist/confluent/tools/handlers/billing/list-billing-costs-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/billing/list-billing-costs-handler.js +36 -3
- package/dist/confluent/tools/handlers/billing/list-billing-costs-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/catalog/add-tags-to-topic.d.ts +2 -1
- package/dist/confluent/tools/handlers/catalog/add-tags-to-topic.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/catalog/add-tags-to-topic.js +2 -1
- package/dist/confluent/tools/handlers/catalog/add-tags-to-topic.js.map +1 -1
- package/dist/confluent/tools/handlers/catalog/create-topic-tags.d.ts +2 -1
- package/dist/confluent/tools/handlers/catalog/create-topic-tags.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/catalog/create-topic-tags.js +2 -1
- package/dist/confluent/tools/handlers/catalog/create-topic-tags.js.map +1 -1
- package/dist/confluent/tools/handlers/catalog/delete-tag.d.ts +2 -1
- package/dist/confluent/tools/handlers/catalog/delete-tag.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/catalog/delete-tag.js +2 -1
- package/dist/confluent/tools/handlers/catalog/delete-tag.js.map +1 -1
- package/dist/confluent/tools/handlers/catalog/list-tags.d.ts +2 -1
- package/dist/confluent/tools/handlers/catalog/list-tags.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/catalog/list-tags.js +2 -1
- package/dist/confluent/tools/handlers/catalog/list-tags.js.map +1 -1
- package/dist/confluent/tools/handlers/catalog/remove-tag-from-entity.d.ts +2 -1
- package/dist/confluent/tools/handlers/catalog/remove-tag-from-entity.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/catalog/remove-tag-from-entity.js +2 -1
- package/dist/confluent/tools/handlers/catalog/remove-tag-from-entity.js.map +1 -1
- package/dist/confluent/tools/handlers/clusters/list-clusters-handler.d.ts +2 -1
- package/dist/confluent/tools/handlers/clusters/list-clusters-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/clusters/list-clusters-handler.js +2 -1
- package/dist/confluent/tools/handlers/clusters/list-clusters-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/connect/connect-tool-handler.d.ts +14 -1
- package/dist/confluent/tools/handlers/connect/connect-tool-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/connect/connect-tool-handler.js +26 -1
- package/dist/confluent/tools/handlers/connect/connect-tool-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/connect/{read-connectors-handler.d.ts → get-connector-config-handler.d.ts} +2 -3
- package/dist/confluent/tools/handlers/connect/get-connector-config-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/connect/get-connector-config-handler.js +35 -0
- package/dist/confluent/tools/handlers/connect/get-connector-config-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/connect/get-connector-error-recommendations-handler.d.ts +9 -0
- package/dist/confluent/tools/handlers/connect/get-connector-error-recommendations-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/connect/get-connector-error-recommendations-handler.js +66 -0
- package/dist/confluent/tools/handlers/connect/get-connector-error-recommendations-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/connect/get-connector-error-summary-handler.d.ts +9 -0
- package/dist/confluent/tools/handlers/connect/get-connector-error-summary-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/connect/get-connector-error-summary-handler.js +131 -0
- package/dist/confluent/tools/handlers/connect/get-connector-error-summary-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/connect/get-connector-logs-handler.d.ts +9 -0
- package/dist/confluent/tools/handlers/connect/get-connector-logs-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/connect/get-connector-logs-handler.js +244 -0
- package/dist/confluent/tools/handlers/connect/get-connector-logs-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/connect/get-connector-offsets-handler.d.ts +9 -0
- package/dist/confluent/tools/handlers/connect/get-connector-offsets-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/connect/get-connector-offsets-handler.js +35 -0
- package/dist/confluent/tools/handlers/connect/get-connector-offsets-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/connect/get-connector-status-handler.d.ts +9 -0
- package/dist/confluent/tools/handlers/connect/get-connector-status-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/connect/get-connector-status-handler.js +44 -0
- package/dist/confluent/tools/handlers/connect/get-connector-status-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/connect/get-connector-tasks-handler.d.ts +9 -0
- package/dist/confluent/tools/handlers/connect/get-connector-tasks-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/connect/get-connector-tasks-handler.js +35 -0
- package/dist/confluent/tools/handlers/connect/get-connector-tasks-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/connect/pause-connector-handler.d.ts +9 -0
- package/dist/confluent/tools/handlers/connect/pause-connector-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/connect/pause-connector-handler.js +35 -0
- package/dist/confluent/tools/handlers/connect/pause-connector-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/connect/restart-connector-handler.d.ts +9 -0
- package/dist/confluent/tools/handlers/connect/restart-connector-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/connect/restart-connector-handler.js +35 -0
- package/dist/confluent/tools/handlers/connect/restart-connector-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/connect/resume-connector-handler.d.ts +9 -0
- package/dist/confluent/tools/handlers/connect/resume-connector-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/connect/resume-connector-handler.js +35 -0
- package/dist/confluent/tools/handlers/connect/resume-connector-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/connect/update-connector-config-handler.d.ts +9 -0
- package/dist/confluent/tools/handlers/connect/update-connector-config-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/connect/update-connector-config-handler.js +44 -0
- package/dist/confluent/tools/handlers/connect/update-connector-config-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/diagnostics/explain-disabled-tools-handler.d.ts +3 -2
- package/dist/confluent/tools/handlers/diagnostics/explain-disabled-tools-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/diagnostics/explain-disabled-tools-handler.js +28 -15
- package/dist/confluent/tools/handlers/diagnostics/explain-disabled-tools-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/docs/get-product-doc-page-handler.d.ts +2 -1
- package/dist/confluent/tools/handlers/docs/get-product-doc-page-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/docs/get-product-doc-page-handler.js +2 -1
- package/dist/confluent/tools/handlers/docs/get-product-doc-page-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/docs/search-product-docs-handler.d.ts +2 -1
- package/dist/confluent/tools/handlers/docs/search-product-docs-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/docs/search-product-docs-handler.js +2 -1
- package/dist/confluent/tools/handlers/docs/search-product-docs-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/environments/list-environments-handler.d.ts +8 -7
- package/dist/confluent/tools/handlers/environments/list-environments-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/environments/list-environments-handler.js +7 -6
- package/dist/confluent/tools/handlers/environments/list-environments-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/environments/read-environment-handler.d.ts +2 -1
- package/dist/confluent/tools/handlers/environments/read-environment-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/environments/read-environment-handler.js +2 -1
- package/dist/confluent/tools/handlers/environments/read-environment-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/catalog/catalog-resolver.d.ts +16 -2
- package/dist/confluent/tools/handlers/flink/catalog/catalog-resolver.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/catalog/catalog-resolver.js +4 -4
- package/dist/confluent/tools/handlers/flink/catalog/catalog-resolver.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/catalog/describe-table-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/catalog/describe-table-handler.js +19 -9
- package/dist/confluent/tools/handlers/flink/catalog/describe-table-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/catalog/get-table-info-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/catalog/get-table-info-handler.js +19 -9
- package/dist/confluent/tools/handlers/flink/catalog/get-table-info-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/catalog/list-catalogs-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/catalog/list-catalogs-handler.js +9 -4
- package/dist/confluent/tools/handlers/flink/catalog/list-catalogs-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/catalog/list-databases-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/catalog/list-databases-handler.js +9 -4
- package/dist/confluent/tools/handlers/flink/catalog/list-databases-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/catalog/list-tables-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/catalog/list-tables-handler.js +9 -4
- package/dist/confluent/tools/handlers/flink/catalog/list-tables-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/flink-sql-helper.d.ts +13 -0
- package/dist/confluent/tools/handlers/flink/flink-sql-helper.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/flink-sql-helper.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/flink-tool-handler.d.ts +2 -1
- package/dist/confluent/tools/handlers/flink/flink-tool-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/flink-tool-handler.js +2 -1
- package/dist/confluent/tools/handlers/flink/flink-tool-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/flink/list-flink-statements-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/flink/list-flink-statements-handler.js +0 -1
- package/dist/confluent/tools/handlers/flink/list-flink-statements-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/kafka/alter-topic-config.d.ts +2 -1
- package/dist/confluent/tools/handlers/kafka/alter-topic-config.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/kafka/alter-topic-config.js +2 -1
- package/dist/confluent/tools/handlers/kafka/alter-topic-config.js.map +1 -1
- package/dist/confluent/tools/handlers/kafka/consume-kafka-messages-handler.d.ts +212 -27
- package/dist/confluent/tools/handlers/kafka/consume-kafka-messages-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/kafka/consume-kafka-messages-handler.js +783 -63
- package/dist/confluent/tools/handlers/kafka/consume-kafka-messages-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/kafka/consumer-group-enums.d.ts +48 -0
- package/dist/confluent/tools/handlers/kafka/consumer-group-enums.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/kafka/consumer-group-enums.js +84 -0
- package/dist/confluent/tools/handlers/kafka/consumer-group-enums.js.map +1 -0
- package/dist/confluent/tools/handlers/kafka/consumer-group-helpers.d.ts +54 -0
- package/dist/confluent/tools/handlers/kafka/consumer-group-helpers.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/kafka/consumer-group-helpers.js +89 -0
- package/dist/confluent/tools/handlers/kafka/consumer-group-helpers.js.map +1 -0
- package/dist/confluent/tools/handlers/kafka/create-topics-handler.d.ts +2 -1
- package/dist/confluent/tools/handlers/kafka/create-topics-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/kafka/create-topics-handler.js +2 -1
- package/dist/confluent/tools/handlers/kafka/create-topics-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/kafka/delete-topics-handler.d.ts +2 -1
- package/dist/confluent/tools/handlers/kafka/delete-topics-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/kafka/delete-topics-handler.js +2 -1
- package/dist/confluent/tools/handlers/kafka/delete-topics-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/kafka/describe-consumer-group-handler.d.ts +64 -0
- package/dist/confluent/tools/handlers/kafka/describe-consumer-group-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/kafka/describe-consumer-group-handler.js +140 -0
- package/dist/confluent/tools/handlers/kafka/describe-consumer-group-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/kafka/get-consumer-group-lag-handler.d.ts +73 -0
- package/dist/confluent/tools/handlers/kafka/get-consumer-group-lag-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/kafka/get-consumer-group-lag-handler.js +337 -0
- package/dist/confluent/tools/handlers/kafka/get-consumer-group-lag-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/kafka/get-partition-offsets-handler.d.ts +43 -0
- package/dist/confluent/tools/handlers/kafka/get-partition-offsets-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/kafka/get-partition-offsets-handler.js +123 -0
- package/dist/confluent/tools/handlers/kafka/get-partition-offsets-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/kafka/get-topic-config.d.ts +2 -1
- package/dist/confluent/tools/handlers/kafka/get-topic-config.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/kafka/get-topic-config.js +2 -1
- package/dist/confluent/tools/handlers/kafka/get-topic-config.js.map +1 -1
- package/dist/confluent/tools/handlers/kafka/list-consumer-groups-handler.d.ts +45 -0
- package/dist/confluent/tools/handlers/kafka/list-consumer-groups-handler.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/kafka/list-consumer-groups-handler.js +86 -0
- package/dist/confluent/tools/handlers/kafka/list-consumer-groups-handler.js.map +1 -0
- package/dist/confluent/tools/handlers/kafka/list-topics-handler.d.ts +2 -1
- package/dist/confluent/tools/handlers/kafka/list-topics-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/kafka/list-topics-handler.js +2 -1
- package/dist/confluent/tools/handlers/kafka/list-topics-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/kafka/partition-watermarks.d.ts +54 -0
- package/dist/confluent/tools/handlers/kafka/partition-watermarks.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/kafka/partition-watermarks.js +56 -0
- package/dist/confluent/tools/handlers/kafka/partition-watermarks.js.map +1 -0
- package/dist/confluent/tools/handlers/kafka/produce-kafka-message-handler.d.ts +5 -4
- package/dist/confluent/tools/handlers/kafka/produce-kafka-message-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/kafka/produce-kafka-message-handler.js +6 -14
- package/dist/confluent/tools/handlers/kafka/produce-kafka-message-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/kafka/topic-metadata.d.ts +18 -0
- package/dist/confluent/tools/handlers/kafka/topic-metadata.d.ts.map +1 -0
- package/dist/confluent/tools/handlers/kafka/topic-metadata.js +18 -0
- package/dist/confluent/tools/handlers/kafka/topic-metadata.js.map +1 -0
- package/dist/confluent/tools/handlers/metrics/list-metrics-handler.d.ts +2 -1
- package/dist/confluent/tools/handlers/metrics/list-metrics-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/metrics/list-metrics-handler.js +2 -1
- package/dist/confluent/tools/handlers/metrics/list-metrics-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/metrics/query-metrics-handler.d.ts +2 -1
- package/dist/confluent/tools/handlers/metrics/query-metrics-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/metrics/query-metrics-handler.js +2 -1
- package/dist/confluent/tools/handlers/metrics/query-metrics-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/organizations/list-organizations-handler.d.ts +2 -1
- package/dist/confluent/tools/handlers/organizations/list-organizations-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/organizations/list-organizations-handler.js +2 -1
- package/dist/confluent/tools/handlers/organizations/list-organizations-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/schema/delete-schema-handler.d.ts +2 -1
- package/dist/confluent/tools/handlers/schema/delete-schema-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/schema/delete-schema-handler.js +2 -1
- package/dist/confluent/tools/handlers/schema/delete-schema-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/schema/list-schemas-handler.d.ts +2 -1
- package/dist/confluent/tools/handlers/schema/list-schemas-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/schema/list-schemas-handler.js +2 -1
- package/dist/confluent/tools/handlers/schema/list-schemas-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/search/search-topic-by-tag-handler.d.ts +2 -1
- package/dist/confluent/tools/handlers/search/search-topic-by-tag-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/search/search-topic-by-tag-handler.js +2 -1
- package/dist/confluent/tools/handlers/search/search-topic-by-tag-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/search/search-topics-by-name-handler.d.ts +2 -1
- package/dist/confluent/tools/handlers/search/search-topics-by-name-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/search/search-topics-by-name-handler.js +2 -1
- package/dist/confluent/tools/handlers/search/search-topics-by-name-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/list-tableflow-regions-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/list-tableflow-regions-handler.js +1 -2
- package/dist/confluent/tools/handlers/tableflow/list-tableflow-regions-handler.js.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/tableflow-tool-handler.d.ts +2 -1
- package/dist/confluent/tools/handlers/tableflow/tableflow-tool-handler.d.ts.map +1 -1
- package/dist/confluent/tools/handlers/tableflow/tableflow-tool-handler.js +2 -1
- package/dist/confluent/tools/handlers/tableflow/tableflow-tool-handler.js.map +1 -1
- package/dist/confluent/tools/tool-availability.d.ts +29 -12
- package/dist/confluent/tools/tool-availability.d.ts.map +1 -1
- package/dist/confluent/tools/tool-availability.js +19 -10
- package/dist/confluent/tools/tool-availability.js.map +1 -1
- package/dist/confluent/tools/tool-name.d.ts +15 -1
- package/dist/confluent/tools/tool-name.d.ts.map +1 -1
- package/dist/confluent/tools/tool-name.js +15 -1
- package/dist/confluent/tools/tool-name.js.map +1 -1
- package/dist/confluent/tools/tool-registry.d.ts +1 -2
- package/dist/confluent/tools/tool-registry.d.ts.map +1 -1
- package/dist/confluent/tools/tool-registry.js +36 -5
- package/dist/confluent/tools/tool-registry.js.map +1 -1
- package/dist/env-schema.d.ts +1 -0
- package/dist/env-schema.d.ts.map +1 -1
- package/dist/env-schema.js +10 -5
- package/dist/env-schema.js.map +1 -1
- package/dist/env.d.ts +1 -0
- package/dist/env.d.ts.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -3
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +1 -0
- package/dist/mcp/server.js.map +1 -1
- package/package.json +2 -1
- package/dist/confluent/tools/handlers/connect/read-connectors-handler.d.ts.map +0 -1
- package/dist/confluent/tools/handlers/connect/read-connectors-handler.js +0 -54
- package/dist/confluent/tools/handlers/connect/read-connectors-handler.js.map +0 -1
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { BaseToolHandler, READ_ONLY, ToolCategory, } from "../../../../confluent/tools/base-tools.js";
|
|
2
|
+
import { disposeIfOAuth, resolveKafkaClusterArgs, } from "../../../../confluent/tools/cluster-arg-resolvers.js";
|
|
3
|
+
import { kafkaBootstrapOrOAuth } from "../../../../confluent/tools/connection-predicates.js";
|
|
4
|
+
import { stateName, typeName, } from "../../../../confluent/tools/handlers/kafka/consumer-group-enums.js";
|
|
5
|
+
import { describeGroupOutcome, notFoundGroupMessage, } from "../../../../confluent/tools/handlers/kafka/consumer-group-helpers.js";
|
|
6
|
+
import { ToolName } from "../../../../confluent/tools/tool-name.js";
|
|
7
|
+
import { logger } from "../../../../logger.js";
|
|
8
|
+
import { z } from "zod";
|
|
9
|
+
export const describeConsumerGroupArgs = z.object({
|
|
10
|
+
groupId: z
|
|
11
|
+
.string()
|
|
12
|
+
.min(1)
|
|
13
|
+
.describe("Consumer group ID to describe. Discover existing group IDs via list-consumer-groups."),
|
|
14
|
+
cluster_id: z
|
|
15
|
+
.string()
|
|
16
|
+
.optional()
|
|
17
|
+
.describe("Confluent Cloud logical Kafka cluster ID (lkc-...). Discover via list-clusters."),
|
|
18
|
+
environment_id: z
|
|
19
|
+
.string()
|
|
20
|
+
.optional()
|
|
21
|
+
.describe("Confluent Cloud environment ID (env-...) that owns the cluster. Discover via list-environments."),
|
|
22
|
+
});
|
|
23
|
+
export class DescribeConsumerGroupHandler extends BaseToolHandler {
|
|
24
|
+
category = ToolCategory.Kafka;
|
|
25
|
+
predicate = kafkaBootstrapOrOAuth;
|
|
26
|
+
getToolConfig() {
|
|
27
|
+
return {
|
|
28
|
+
name: ToolName.DESCRIBE_CONSUMER_GROUP,
|
|
29
|
+
description: "Describe a single consumer group on a Kafka cluster. " +
|
|
30
|
+
"Returns the group's state, type, protocol, partition assignor, " +
|
|
31
|
+
"coordinator, and per-member assignment as a flat array " +
|
|
32
|
+
"of {topic, partition} pairs.",
|
|
33
|
+
inputSchema: describeConsumerGroupArgs.shape,
|
|
34
|
+
annotations: READ_ONLY,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
async handle(runtime, toolArguments) {
|
|
38
|
+
const parsed = describeConsumerGroupArgs.parse(toolArguments);
|
|
39
|
+
const { connId, clientManager } = this.resolveSoleConnection(runtime);
|
|
40
|
+
const { clusterId, envId } = resolveKafkaClusterArgs(parsed, runtime, connId);
|
|
41
|
+
const admin = await clientManager.getKafkaAdminClient(clusterId, envId);
|
|
42
|
+
try {
|
|
43
|
+
const outcome = await describeGroupOutcome(admin, parsed.groupId);
|
|
44
|
+
if (outcome.kind === "notFound") {
|
|
45
|
+
return this.createResponse(notFoundGroupMessage(parsed.groupId), true);
|
|
46
|
+
}
|
|
47
|
+
if (outcome.kind === "error") {
|
|
48
|
+
return this.createResponse(outcome.error.message, true);
|
|
49
|
+
}
|
|
50
|
+
const groupDesc = outcome.group;
|
|
51
|
+
const payload = {
|
|
52
|
+
groupId: groupDesc.groupId,
|
|
53
|
+
state: stateName(groupDesc.state),
|
|
54
|
+
type: typeName(groupDesc.type),
|
|
55
|
+
protocol: groupDesc.protocol,
|
|
56
|
+
partitionAssignor: groupDesc.partitionAssignor,
|
|
57
|
+
isSimpleConsumerGroup: groupDesc.isSimpleConsumerGroup,
|
|
58
|
+
coordinator: buildCoordinator(groupDesc.coordinator),
|
|
59
|
+
members: groupDesc.members.map(buildMember),
|
|
60
|
+
};
|
|
61
|
+
const summary = `Consumer group "${payload.groupId}" is ${payload.state} ` +
|
|
62
|
+
`with ${payload.members.length} member(s); ` +
|
|
63
|
+
`coordinator ${payload.coordinator.host}:${payload.coordinator.port}.`;
|
|
64
|
+
return this.createStructuredResponse(summary, payload);
|
|
65
|
+
}
|
|
66
|
+
finally {
|
|
67
|
+
await disposeIfOAuth(runtime, connId, admin);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function buildCoordinator(node) {
|
|
72
|
+
const out = {
|
|
73
|
+
id: node.id,
|
|
74
|
+
host: node.host,
|
|
75
|
+
port: node.port,
|
|
76
|
+
};
|
|
77
|
+
if (node.rack !== undefined)
|
|
78
|
+
out.rack = node.rack;
|
|
79
|
+
return out;
|
|
80
|
+
}
|
|
81
|
+
function buildMember(member) {
|
|
82
|
+
const out = {
|
|
83
|
+
memberId: member.memberId,
|
|
84
|
+
clientId: member.clientId,
|
|
85
|
+
clientHost: member.clientHost,
|
|
86
|
+
assignment: buildAssignment(member),
|
|
87
|
+
};
|
|
88
|
+
if (member.groupInstanceId !== undefined) {
|
|
89
|
+
out.groupInstanceId = member.groupInstanceId;
|
|
90
|
+
}
|
|
91
|
+
return out;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Cooked partition-list extraction from a {@link MemberDescription}'s
|
|
95
|
+
* `assignment` field, working around an upstream type/runtime mismatch.
|
|
96
|
+
*
|
|
97
|
+
* The kafkajs `.d.ts` declares `assignment: TopicPartition[]` (flat array),
|
|
98
|
+
* but the native C++ binding actually returns `assignment: { topicPartitions:
|
|
99
|
+
* TopicPartition[] }` (wrapped object) — verified in
|
|
100
|
+
* `node_modules/@confluentinc/kafka-javascript/src/common.cc` →
|
|
101
|
+
* `FromMemberDescription`. The wrapped shape is also where the binding
|
|
102
|
+
* exposes an optional `targetAssignment: { topicPartitions: ... }` field
|
|
103
|
+
* the `.d.ts` doesn't acknowledge at all.
|
|
104
|
+
*
|
|
105
|
+
* Handle both shapes defensively: if the binding ever reconciles the
|
|
106
|
+
* mismatch in either direction, the handler keeps working. Anything else
|
|
107
|
+
* gets a "Wacky --" log and falls through to an empty array so a future
|
|
108
|
+
* binding surprise doesn't crash the tool.
|
|
109
|
+
*
|
|
110
|
+
* Map field-by-field rather than passing the upstream array verbatim —
|
|
111
|
+
* the upstream `TopicPartition` carries optional `error` / `leaderEpoch`
|
|
112
|
+
* fields we don't want leaking into the response.
|
|
113
|
+
*/
|
|
114
|
+
function buildAssignment(member) {
|
|
115
|
+
const raw = member.assignment;
|
|
116
|
+
if (Array.isArray(raw)) {
|
|
117
|
+
return raw.map(toAssignedPartition);
|
|
118
|
+
}
|
|
119
|
+
if (raw !== null &&
|
|
120
|
+
typeof raw === "object" &&
|
|
121
|
+
"topicPartitions" in raw &&
|
|
122
|
+
Array.isArray(raw.topicPartitions)) {
|
|
123
|
+
return raw.topicPartitions.map(toAssignedPartition);
|
|
124
|
+
}
|
|
125
|
+
logger.warn({
|
|
126
|
+
memberId: member.memberId,
|
|
127
|
+
clientId: member.clientId,
|
|
128
|
+
assignmentType: typeof raw,
|
|
129
|
+
isBuffer: Buffer.isBuffer(raw),
|
|
130
|
+
sampleKeys: raw !== null && typeof raw === "object" && !Buffer.isBuffer(raw)
|
|
131
|
+
? Object.keys(raw).slice(0, 10)
|
|
132
|
+
: undefined,
|
|
133
|
+
}, "Wacky -- MemberDescription.assignment is neither a TopicPartition[] " +
|
|
134
|
+
"nor a {topicPartitions: TopicPartition[]} wrapper; surfacing as empty array.");
|
|
135
|
+
return [];
|
|
136
|
+
}
|
|
137
|
+
function toAssignedPartition(tp) {
|
|
138
|
+
return { topic: tp.topic, partition: tp.partition };
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=describe-consumer-group-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"describe-consumer-group-handler.js","sourceRoot":"","sources":["../../../../../src/confluent/tools/handlers/kafka/describe-consumer-group-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { CallToolResult } from "../../../../confluent/schema.js";
|
|
2
|
+
import { BaseToolHandler, ToolCategory, ToolConfig } from "../../../../confluent/tools/base-tools.js";
|
|
3
|
+
import { ServerRuntime } from "../../../../server-runtime.js";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
export declare const getConsumerGroupLagArgs: z.ZodObject<{
|
|
6
|
+
groupId: z.ZodString;
|
|
7
|
+
topics: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
8
|
+
cluster_id: z.ZodOptional<z.ZodString>;
|
|
9
|
+
environment_id: z.ZodOptional<z.ZodString>;
|
|
10
|
+
}, z.core.$strip>;
|
|
11
|
+
/**
|
|
12
|
+
* Per-partition lag row as the tool returns it. `committedOffset` /
|
|
13
|
+
* `highWatermark` are strings to preserve int64 precision past JS's 2^53
|
|
14
|
+
* safe-integer boundary; `lag` is a `Number` because the BigInt subtraction
|
|
15
|
+
* is done server-side and asking an LLM caller to subtract two int64-typed
|
|
16
|
+
* strings is the wrong ergonomic trade. `null` for both `committedOffset`
|
|
17
|
+
* and `lag` marks a partition where the lag is unknown — either the group
|
|
18
|
+
* has never committed (distinct from a zero-lag partition the group is
|
|
19
|
+
* caught up on) or the broker reported a per-partition error on the
|
|
20
|
+
* OffsetFetch response (see {@link error}).
|
|
21
|
+
*/
|
|
22
|
+
export type ConsumerGroupLagPartition = {
|
|
23
|
+
partition: number;
|
|
24
|
+
committedOffset: string | null;
|
|
25
|
+
highWatermark: string;
|
|
26
|
+
lag: number | null;
|
|
27
|
+
metadata: string | null;
|
|
28
|
+
leaderEpoch: number | null;
|
|
29
|
+
/**
|
|
30
|
+
* Set when the broker reported a per-partition error on the
|
|
31
|
+
* OffsetFetch response (e.g., leader unavailable, partition-level
|
|
32
|
+
* authorization failure). `committedOffset` and `lag` are `null` in
|
|
33
|
+
* this case — the broker's `offset` value is not meaningful when an
|
|
34
|
+
* error is attached — and the partition is excluded from `totalLag`.
|
|
35
|
+
* Surfacing the `code` and `message` lets the caller act on the
|
|
36
|
+
* specific failure rather than guessing why the lag is unknown.
|
|
37
|
+
*/
|
|
38
|
+
error?: {
|
|
39
|
+
code: number;
|
|
40
|
+
message: string;
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
/** Per-topic group of {@link ConsumerGroupLagPartition} rows. */
|
|
44
|
+
export type ConsumerGroupLagTopic = {
|
|
45
|
+
topic: string;
|
|
46
|
+
partitions: ConsumerGroupLagPartition[];
|
|
47
|
+
};
|
|
48
|
+
/** Structured response payload mirrored into `result.structuredContent`. */
|
|
49
|
+
export type GetConsumerGroupLagResponse = {
|
|
50
|
+
groupId: string;
|
|
51
|
+
topics: ConsumerGroupLagTopic[];
|
|
52
|
+
totalLag: number;
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Read-only tool that computes live offset lag for a single Kafka
|
|
56
|
+
* consumer group, returning per-(topic, partition) {committed, high, lag}
|
|
57
|
+
* rows and a total lag count. Combines `admin.fetchOffsets({groupId})`
|
|
58
|
+
* (committed offsets) with the shared `fetchPartitionWatermarks` helper
|
|
59
|
+
* (high watermarks), then BigInt-subtracts per partition. A partition the
|
|
60
|
+
* group has never committed to surfaces as {committedOffset: null,
|
|
61
|
+
* lag: null} and is excluded from the `totalLag` sum. Lag may briefly go
|
|
62
|
+
* negative during a consumer-group rebalance (committed offset captured
|
|
63
|
+
* at a different isolation level than the watermark snapshot); the value
|
|
64
|
+
* is surfaced as-is rather than clamped, since clamping would hide a real
|
|
65
|
+
* if rare state.
|
|
66
|
+
*/
|
|
67
|
+
export declare class GetConsumerGroupLagHandler extends BaseToolHandler {
|
|
68
|
+
readonly category = ToolCategory.Kafka;
|
|
69
|
+
readonly predicate: import("../../../../confluent/tools/connection-predicates.js").ConnectionPredicate;
|
|
70
|
+
getToolConfig(): ToolConfig;
|
|
71
|
+
handle(runtime: ServerRuntime, toolArguments: Record<string, unknown>): Promise<CallToolResult>;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=get-consumer-group-lag-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-consumer-group-lag-handler.d.ts","sourceRoot":"","sources":["../../../../../src/confluent/tools/handlers/kafka/get-consumer-group-lag-handler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EACL,eAAe,EAEf,YAAY,EACZ,UAAU,EACX,MAAM,oCAAoC,CAAC;AAoB5C,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,uBAAuB;;;;;iBA2BlC,CAAC;AAEH;;;;;;;;;;GAUG;AACH,MAAM,MAAM,yBAAyB,GAAG;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B;;;;;;;;OAQG;IACH,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C,CAAC;AAEF,iEAAiE;AACjE,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,yBAAyB,EAAE,CAAC;CACzC,CAAC;AAEF,4EAA4E;AAC5E,MAAM,MAAM,2BAA2B,GAAG;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,qBAAqB,EAAE,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,qBAAa,0BAA2B,SAAQ,eAAe;IAC7D,QAAQ,CAAC,QAAQ,sBAAsB;IACvC,QAAQ,CAAC,SAAS,8EAAyB;IAE3C,aAAa,IAAI,UAAU;IAgBrB,MAAM,CACV,OAAO,EAAE,aAAa,EACtB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACrC,OAAO,CAAC,cAAc,CAAC;CAoH3B"}
|
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
import { KafkaJS } from "@confluentinc/kafka-javascript";
|
|
2
|
+
import { BaseToolHandler, READ_ONLY, ToolCategory, } from "../../../../confluent/tools/base-tools.js";
|
|
3
|
+
import { disposeIfOAuth, resolveKafkaClusterArgs, } from "../../../../confluent/tools/cluster-arg-resolvers.js";
|
|
4
|
+
import { kafkaBootstrapOrOAuth } from "../../../../confluent/tools/connection-predicates.js";
|
|
5
|
+
import { describeGroupOutcome, isGroupIdNotFoundError, notFoundGroupMessage, } from "../../../../confluent/tools/handlers/kafka/consumer-group-helpers.js";
|
|
6
|
+
import { createWatermarkCache, narrowMessageCount, } from "../../../../confluent/tools/handlers/kafka/partition-watermarks.js";
|
|
7
|
+
import { normalizeFetchTopicMetadataResponse } from "../../../../confluent/tools/handlers/kafka/topic-metadata.js";
|
|
8
|
+
import { ToolName } from "../../../../confluent/tools/tool-name.js";
|
|
9
|
+
import { logger } from "../../../../logger.js";
|
|
10
|
+
import { z } from "zod";
|
|
11
|
+
export const getConsumerGroupLagArgs = z.object({
|
|
12
|
+
groupId: z
|
|
13
|
+
.string()
|
|
14
|
+
.min(1)
|
|
15
|
+
.describe("Consumer group ID to compute lag for. Discover groups via list-consumer-groups."),
|
|
16
|
+
topics: z
|
|
17
|
+
.array(z.string().min(1))
|
|
18
|
+
.nonempty()
|
|
19
|
+
.optional()
|
|
20
|
+
.describe("Restrict lag computation to these topics. " +
|
|
21
|
+
"Omit to compute lag for every topic the group has committed offsets on."),
|
|
22
|
+
cluster_id: z
|
|
23
|
+
.string()
|
|
24
|
+
.optional()
|
|
25
|
+
.describe("Confluent Cloud logical Kafka cluster ID (lkc-...). Discover via list-clusters."),
|
|
26
|
+
environment_id: z
|
|
27
|
+
.string()
|
|
28
|
+
.optional()
|
|
29
|
+
.describe("Confluent Cloud environment ID (env-...) that owns the cluster. Discover via list-environments."),
|
|
30
|
+
});
|
|
31
|
+
/**
|
|
32
|
+
* Read-only tool that computes live offset lag for a single Kafka
|
|
33
|
+
* consumer group, returning per-(topic, partition) {committed, high, lag}
|
|
34
|
+
* rows and a total lag count. Combines `admin.fetchOffsets({groupId})`
|
|
35
|
+
* (committed offsets) with the shared `fetchPartitionWatermarks` helper
|
|
36
|
+
* (high watermarks), then BigInt-subtracts per partition. A partition the
|
|
37
|
+
* group has never committed to surfaces as {committedOffset: null,
|
|
38
|
+
* lag: null} and is excluded from the `totalLag` sum. Lag may briefly go
|
|
39
|
+
* negative during a consumer-group rebalance (committed offset captured
|
|
40
|
+
* at a different isolation level than the watermark snapshot); the value
|
|
41
|
+
* is surfaced as-is rather than clamped, since clamping would hide a real
|
|
42
|
+
* if rare state.
|
|
43
|
+
*/
|
|
44
|
+
export class GetConsumerGroupLagHandler extends BaseToolHandler {
|
|
45
|
+
category = ToolCategory.Kafka;
|
|
46
|
+
predicate = kafkaBootstrapOrOAuth;
|
|
47
|
+
getToolConfig() {
|
|
48
|
+
return {
|
|
49
|
+
name: ToolName.GET_CONSUMER_GROUP_LAG,
|
|
50
|
+
description: "Compute live offset lag for a single Kafka consumer group. " +
|
|
51
|
+
"Returns per-(topic, partition) {committedOffset, highWatermark, lag} rows " +
|
|
52
|
+
"and a total lag count across the group. " +
|
|
53
|
+
"Pass `topics` to restrict the response to specific topics; " +
|
|
54
|
+
"omit to compute lag for every topic the group has touched. " +
|
|
55
|
+
"Partitions the group has never committed to surface with " +
|
|
56
|
+
"`committedOffset: null` and `lag: null` and are excluded from `totalLag`.",
|
|
57
|
+
inputSchema: getConsumerGroupLagArgs.shape,
|
|
58
|
+
annotations: READ_ONLY,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
async handle(runtime, toolArguments) {
|
|
62
|
+
const parsed = getConsumerGroupLagArgs.parse(toolArguments);
|
|
63
|
+
const { connId, clientManager } = this.resolveSoleConnection(runtime);
|
|
64
|
+
const { clusterId, envId } = resolveKafkaClusterArgs(parsed, runtime, connId);
|
|
65
|
+
const admin = await clientManager.getKafkaAdminClient(clusterId, envId);
|
|
66
|
+
try {
|
|
67
|
+
// 1. Fetch the group's committed offsets.
|
|
68
|
+
let committedByTopic;
|
|
69
|
+
try {
|
|
70
|
+
committedByTopic = await admin.fetchOffsets(parsed.topics
|
|
71
|
+
? { groupId: parsed.groupId, topics: parsed.topics }
|
|
72
|
+
: { groupId: parsed.groupId });
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
if (isGroupIdNotFoundError(err)) {
|
|
76
|
+
return this.createResponse(notFoundGroupMessage(parsed.groupId), true);
|
|
77
|
+
}
|
|
78
|
+
throw err;
|
|
79
|
+
}
|
|
80
|
+
// Disambiguate "unknown group" from "real group, no commits". CCloud's
|
|
81
|
+
// fetchOffsets resolves with `[]` for an unknown group ID rather than
|
|
82
|
+
// rejecting with ERR_GROUP_ID_NOT_FOUND (the documented path the catch
|
|
83
|
+
// above handles), which means an empty result by itself can't tell the
|
|
84
|
+
// caller whether the group exists or not. Probe via describeGroups
|
|
85
|
+
// before continuing — only on the empty path, so happy-path calls pay
|
|
86
|
+
// nothing.
|
|
87
|
+
if (committedByTopic.length === 0) {
|
|
88
|
+
const outcome = await describeGroupOutcome(admin, parsed.groupId);
|
|
89
|
+
if (outcome.kind === "notFound") {
|
|
90
|
+
return this.createResponse(notFoundGroupMessage(parsed.groupId), true);
|
|
91
|
+
}
|
|
92
|
+
if (outcome.kind === "error") {
|
|
93
|
+
// Propagate the raw librdkafka error so downstream handlers
|
|
94
|
+
// and logs can inspect `code` / `errno` / `origin` rather
|
|
95
|
+
// than just a message string.
|
|
96
|
+
throw outcome.error;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// 2. For each topic+partition the group has committed to, fetch the
|
|
100
|
+
// partition's high watermark and compute lag = high - committed. A
|
|
101
|
+
// topic the group has committed offsets for but that's since been
|
|
102
|
+
// deleted from the cluster short-circuits with the same friendly
|
|
103
|
+
// "Topic not found" error the filter-topics path uses below.
|
|
104
|
+
const watermarkCache = createWatermarkCache(admin);
|
|
105
|
+
const lagResult = await buildLagFromCommittedOffsets(parsed.groupId, committedByTopic, watermarkCache);
|
|
106
|
+
if (lagResult.kind === "topicNotFound") {
|
|
107
|
+
return this.createResponse(lagResult.message, true);
|
|
108
|
+
}
|
|
109
|
+
const { topics: responseTopics, totalLagBigInt } = lagResult;
|
|
110
|
+
// 3. If the caller passed `topics`, verify that any never-committed
|
|
111
|
+
// filter topics exist on the cluster (so we can return
|
|
112
|
+
// `{topic, partitions: []}` for each) and surface a friendly
|
|
113
|
+
// "Topic not found" error for any that don't.
|
|
114
|
+
if (parsed.topics) {
|
|
115
|
+
const seenTopics = new Set(committedByTopic.map(({ topic }) => topic));
|
|
116
|
+
const filterResult = await resolveNeverCommittedFilterTopics(parsed.topics, seenTopics, admin);
|
|
117
|
+
if (filterResult.kind === "topicNotFound") {
|
|
118
|
+
return this.createResponse(filterResult.message, true);
|
|
119
|
+
}
|
|
120
|
+
responseTopics.push(...filterResult.topics);
|
|
121
|
+
}
|
|
122
|
+
// 4. Narrow the BigInt accumulator to a JS Number for the wire
|
|
123
|
+
// payload, saturating at Number.MAX_SAFE_INTEGER (and emitting a
|
|
124
|
+
// Wacky log) if the cross-partition sum exceeds the safe-integer
|
|
125
|
+
// boundary even though each individual partition fit.
|
|
126
|
+
const totalLag = narrowMessageCount(totalLagBigInt, {
|
|
127
|
+
groupId: parsed.groupId,
|
|
128
|
+
scope: "totalLag",
|
|
129
|
+
topicCount: responseTopics.length,
|
|
130
|
+
});
|
|
131
|
+
const payload = {
|
|
132
|
+
groupId: parsed.groupId,
|
|
133
|
+
topics: responseTopics,
|
|
134
|
+
totalLag,
|
|
135
|
+
};
|
|
136
|
+
const summary = `Consumer group "${parsed.groupId}" has ${totalLag} message(s) of lag ` +
|
|
137
|
+
`across ${responseTopics.length} topic(s).`;
|
|
138
|
+
return this.createStructuredResponse(summary, payload);
|
|
139
|
+
}
|
|
140
|
+
finally {
|
|
141
|
+
await disposeIfOAuth(runtime, connId, admin);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Build one {@link ConsumerGroupLagPartition} row from a committed offset
|
|
147
|
+
* and a paired watermark. Splits the never-committed sentinel
|
|
148
|
+
* (`offset === "-1"`) from the real arithmetic path so the latter remains
|
|
149
|
+
* a clean BigInt subtraction. Returns the raw BigInt diff (or `null` for
|
|
150
|
+
* the never-committed case) alongside the row so the caller can
|
|
151
|
+
* accumulate `totalLag` in BigInt across partitions and narrow once at
|
|
152
|
+
* the end via {@link narrowMessageCount} — individual per-partition lags
|
|
153
|
+
* each fit in `Number`, but their sum can still overflow the
|
|
154
|
+
* safe-integer boundary.
|
|
155
|
+
*/
|
|
156
|
+
function buildLagRow(groupId, topic, committed, watermark) {
|
|
157
|
+
// Broker-reported per-partition error: the offset value isn't
|
|
158
|
+
// meaningful (could be a sentinel, stale, or garbage), so surface the
|
|
159
|
+
// error code and message verbatim and treat the lag as unknown.
|
|
160
|
+
// Excluded from the cross-partition `totalLag` sum. `!= null` (loose
|
|
161
|
+
// equality) catches both `undefined` (the TypeScript-declared shape)
|
|
162
|
+
// and `null` (what kafkajs-compat actually populates for successful
|
|
163
|
+
// partitions — the upstream type lies about the runtime).
|
|
164
|
+
if (committed.error != null) {
|
|
165
|
+
return {
|
|
166
|
+
row: {
|
|
167
|
+
partition: committed.partition,
|
|
168
|
+
committedOffset: null,
|
|
169
|
+
highWatermark: watermark.high,
|
|
170
|
+
lag: null,
|
|
171
|
+
metadata: committed.metadata,
|
|
172
|
+
leaderEpoch: committed.leaderEpoch,
|
|
173
|
+
error: {
|
|
174
|
+
code: committed.error.code,
|
|
175
|
+
message: committed.error.message,
|
|
176
|
+
},
|
|
177
|
+
},
|
|
178
|
+
lagBigInt: null,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
if (committed.offset === "-1") {
|
|
182
|
+
return {
|
|
183
|
+
row: {
|
|
184
|
+
partition: committed.partition,
|
|
185
|
+
committedOffset: null,
|
|
186
|
+
highWatermark: watermark.high,
|
|
187
|
+
lag: null,
|
|
188
|
+
metadata: committed.metadata,
|
|
189
|
+
leaderEpoch: committed.leaderEpoch,
|
|
190
|
+
},
|
|
191
|
+
lagBigInt: null,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
const diff = BigInt(watermark.high) - BigInt(committed.offset);
|
|
195
|
+
const lag = narrowMessageCount(diff, {
|
|
196
|
+
groupId,
|
|
197
|
+
topic,
|
|
198
|
+
partition: committed.partition,
|
|
199
|
+
committed: committed.offset,
|
|
200
|
+
high: watermark.high,
|
|
201
|
+
});
|
|
202
|
+
return {
|
|
203
|
+
row: {
|
|
204
|
+
partition: committed.partition,
|
|
205
|
+
committedOffset: committed.offset,
|
|
206
|
+
highWatermark: watermark.high,
|
|
207
|
+
lag,
|
|
208
|
+
metadata: committed.metadata,
|
|
209
|
+
leaderEpoch: committed.leaderEpoch,
|
|
210
|
+
},
|
|
211
|
+
lagBigInt: diff,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Two distinct librdkafka codes report the same conceptual failure:
|
|
216
|
+
* `ERR_UNKNOWN_TOPIC_OR_PART` (broker-issued, single underscore) and
|
|
217
|
+
* `ERR__UNKNOWN_TOPIC` (local-side, double underscore — fires when the
|
|
218
|
+
* client's own metadata cache rejects the topic before the broker is
|
|
219
|
+
* consulted). Both funnel into the same friendly "topic not found"
|
|
220
|
+
* message; same posture get-partition-offsets takes.
|
|
221
|
+
*/
|
|
222
|
+
function isUnknownTopicError(err) {
|
|
223
|
+
if (typeof err !== "object" || err === null || !("code" in err)) {
|
|
224
|
+
return false;
|
|
225
|
+
}
|
|
226
|
+
const code = err.code;
|
|
227
|
+
return (code === KafkaJS.ErrorCodes.ERR_UNKNOWN_TOPIC_OR_PART ||
|
|
228
|
+
code === KafkaJS.ErrorCodes.ERR__UNKNOWN_TOPIC);
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Iterate the group's committed offsets and produce per-(topic, partition)
|
|
232
|
+
* lag rows paired with a BigInt running total. The accumulator stays in
|
|
233
|
+
* BigInt so a sum that exceeds the safe-integer boundary stays precise;
|
|
234
|
+
* narrow once at the end via {@link narrowMessageCount}. A
|
|
235
|
+
* deleted-but-still-committed-to topic short-circuits with its name in
|
|
236
|
+
* the `topicNotFound` arm — see {@link BuildLagResult}.
|
|
237
|
+
*/
|
|
238
|
+
async function buildLagFromCommittedOffsets(groupId, committedByTopic, watermarkCache) {
|
|
239
|
+
const topics = [];
|
|
240
|
+
let totalLagBigInt = 0n;
|
|
241
|
+
for (const { topic, partitions: committedPartitions } of committedByTopic) {
|
|
242
|
+
let watermarks;
|
|
243
|
+
try {
|
|
244
|
+
watermarks = await watermarkCache(topic);
|
|
245
|
+
}
|
|
246
|
+
catch (err) {
|
|
247
|
+
if (isUnknownTopicError(err)) {
|
|
248
|
+
return {
|
|
249
|
+
kind: "topicNotFound",
|
|
250
|
+
message: notFoundTopicMessage(topic),
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
throw err;
|
|
254
|
+
}
|
|
255
|
+
const watermarkByPartition = new Map(watermarks.map((w) => [w.partition, w]));
|
|
256
|
+
const rows = [];
|
|
257
|
+
for (const committed of committedPartitions) {
|
|
258
|
+
const watermark = watermarkByPartition.get(committed.partition);
|
|
259
|
+
if (watermark === undefined) {
|
|
260
|
+
logger.warn({ groupId, topic, partition: committed.partition }, "Wacky -- committed offset reported for a partition with no matching watermark; skipping");
|
|
261
|
+
continue;
|
|
262
|
+
}
|
|
263
|
+
const { row, lagBigInt } = buildLagRow(groupId, topic, committed, watermark);
|
|
264
|
+
rows.push(row);
|
|
265
|
+
if (lagBigInt !== null) {
|
|
266
|
+
totalLagBigInt += lagBigInt;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
topics.push({ topic, partitions: rows });
|
|
270
|
+
}
|
|
271
|
+
return { kind: "resolved", topics, totalLagBigInt };
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Verify each filter topic that didn't appear in the `fetchOffsets`
|
|
275
|
+
* response (group never committed to them) exists on the cluster, via
|
|
276
|
+
* `admin.fetchTopicMetadata` — the right primitive for a yes/no
|
|
277
|
+
* existence question, where `fetchTopicOffsets` would fan out per
|
|
278
|
+
* partition and discard the watermark data we don't need on this path.
|
|
279
|
+
* Topics that exist but the group hasn't committed to surface as
|
|
280
|
+
* `{topic, partitions: []}` in the `resolved` arm; topics that don't
|
|
281
|
+
* exist short-circuit with a pre-formatted user-facing message in the
|
|
282
|
+
* `topicNotFound` arm. Non-unknown-topic errors propagate via throw.
|
|
283
|
+
*
|
|
284
|
+
* Defensive against both unknown-topic surface shapes: librdkafka may
|
|
285
|
+
* reject the batched call with `ERR_UNKNOWN_TOPIC_OR_PART` /
|
|
286
|
+
* `ERR__UNKNOWN_TOPIC` (which doesn't identify which candidate
|
|
287
|
+
* triggered it — we surface the full list in the message) or resolve
|
|
288
|
+
* cleanly with the unknown topic absent from the returned `topics`
|
|
289
|
+
* array (which does give us specificity).
|
|
290
|
+
*/
|
|
291
|
+
async function resolveNeverCommittedFilterTopics(filterTopics, seenTopics, admin) {
|
|
292
|
+
const missing = filterTopics.filter((t) => !seenTopics.has(t));
|
|
293
|
+
if (missing.length === 0) {
|
|
294
|
+
return { kind: "resolved", topics: [] };
|
|
295
|
+
}
|
|
296
|
+
let rawMetadata;
|
|
297
|
+
try {
|
|
298
|
+
rawMetadata = await admin.fetchTopicMetadata({ topics: [...missing] });
|
|
299
|
+
}
|
|
300
|
+
catch (err) {
|
|
301
|
+
if (!isUnknownTopicError(err))
|
|
302
|
+
throw err;
|
|
303
|
+
// The batched call rejected with an unknown-topic code but doesn't
|
|
304
|
+
// tell us which candidate triggered the failure. With K=1 there's
|
|
305
|
+
// only one possibility so we can still name it; with K>1 surface
|
|
306
|
+
// the full list so the caller can spot the typo without us paying
|
|
307
|
+
// K extra round-trips to identify the specific one.
|
|
308
|
+
const message = missing.length === 1
|
|
309
|
+
? notFoundTopicMessage(missing[0])
|
|
310
|
+
: `Topic not found in [${missing.join(", ")}] on this cluster.`;
|
|
311
|
+
return { kind: "topicNotFound", message };
|
|
312
|
+
}
|
|
313
|
+
// Defensive against the silently-omits-missing-topic surface shape:
|
|
314
|
+
// locate the first requested topic that didn't come back, in
|
|
315
|
+
// user-supplied order.
|
|
316
|
+
const returnedNames = new Set(normalizeFetchTopicMetadataResponse(rawMetadata).map((t) => t.name));
|
|
317
|
+
const firstMissing = missing.find((t) => !returnedNames.has(t));
|
|
318
|
+
if (firstMissing !== undefined) {
|
|
319
|
+
return {
|
|
320
|
+
kind: "topicNotFound",
|
|
321
|
+
message: notFoundTopicMessage(firstMissing),
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
return {
|
|
325
|
+
kind: "resolved",
|
|
326
|
+
topics: missing.map((topic) => ({ topic, partitions: [] })),
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Canonical user-facing "topic not found" message format. Centralizes
|
|
331
|
+
* the phrasing so the step-2 (deleted-since-commit topic) and step-3
|
|
332
|
+
* (filter topic missing from metadata) paths can't drift apart.
|
|
333
|
+
*/
|
|
334
|
+
function notFoundTopicMessage(topic) {
|
|
335
|
+
return `Topic "${topic}" not found on this cluster.`;
|
|
336
|
+
}
|
|
337
|
+
//# sourceMappingURL=get-consumer-group-lag-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-consumer-group-lag-handler.js","sourceRoot":"","sources":["../../../../../src/confluent/tools/handlers/kafka/get-consumer-group-lag-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { CallToolResult } from "../../../../confluent/schema.js";
|
|
2
|
+
import { BaseToolHandler, ToolCategory, ToolConfig } from "../../../../confluent/tools/base-tools.js";
|
|
3
|
+
import { ServerRuntime } from "../../../../server-runtime.js";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
export declare const getPartitionOffsetsArgs: z.ZodObject<{
|
|
6
|
+
topicName: z.ZodString;
|
|
7
|
+
partition: z.ZodOptional<z.ZodNumber>;
|
|
8
|
+
cluster_id: z.ZodOptional<z.ZodString>;
|
|
9
|
+
environment_id: z.ZodOptional<z.ZodString>;
|
|
10
|
+
}, z.core.$strip>;
|
|
11
|
+
/**
|
|
12
|
+
* One partition's offset metadata as the tool returns it. `lowWatermark` and
|
|
13
|
+
* `highWatermark` are strings to preserve int64 precision past JS's 2^53
|
|
14
|
+
* safe-integer boundary; `messageCount` is a `Number` because the BigInt
|
|
15
|
+
* subtraction is done server-side and asking an LLM caller to subtract two
|
|
16
|
+
* int64-typed strings is the wrong ergonomic trade.
|
|
17
|
+
*/
|
|
18
|
+
export type PartitionOffsetInfo = {
|
|
19
|
+
partition: number;
|
|
20
|
+
lowWatermark: string;
|
|
21
|
+
highWatermark: string;
|
|
22
|
+
messageCount: number;
|
|
23
|
+
};
|
|
24
|
+
/** Structured response payload mirrored into `result.structuredContent`. */
|
|
25
|
+
export type GetPartitionOffsetsResponse = {
|
|
26
|
+
topicName: string;
|
|
27
|
+
partitions: PartitionOffsetInfo[];
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Read-only tool that returns per-partition low/high watermarks (and the
|
|
31
|
+
* derived message count) for a single Kafka topic. Thin wrapper over the
|
|
32
|
+
* broker's `Admin.fetchTopicOffsets` admin call — the metadata primitive
|
|
33
|
+
* that `consume-messages` already relies on internally for `start:
|
|
34
|
+
* "earliest" / "latest" / {timestamp} / {tail}` resolution but doesn't
|
|
35
|
+
* surface in its response.
|
|
36
|
+
*/
|
|
37
|
+
export declare class GetPartitionOffsetsHandler extends BaseToolHandler {
|
|
38
|
+
handle(runtime: ServerRuntime, toolArguments: Record<string, unknown>): Promise<CallToolResult>;
|
|
39
|
+
getToolConfig(): ToolConfig;
|
|
40
|
+
readonly category = ToolCategory.Kafka;
|
|
41
|
+
readonly predicate: import("../../../../confluent/tools/connection-predicates.js").ConnectionPredicate;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=get-partition-offsets-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-partition-offsets-handler.d.ts","sourceRoot":"","sources":["../../../../../src/confluent/tools/handlers/kafka/get-partition-offsets-handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EACL,eAAe,EAEf,YAAY,EACZ,UAAU,EACX,MAAM,oCAAoC,CAAC;AAc5C,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,uBAAuB;;;;;iBA0BlC,CAAC;AAEH;;;;;;GAMG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,4EAA4E;AAC5E,MAAM,MAAM,2BAA2B,GAAG;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,mBAAmB,EAAE,CAAC;CACnC,CAAC;AAsBF;;;;;;;GAOG;AACH,qBAAa,0BAA2B,SAAQ,eAAe;IACvD,MAAM,CACV,OAAO,EAAE,aAAa,EACtB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACrC,OAAO,CAAC,cAAc,CAAC;IAkF1B,aAAa,IAAI,UAAU;IAY3B,QAAQ,CAAC,QAAQ,sBAAsB;IACvC,QAAQ,CAAC,SAAS,8EAAyB;CAC5C"}
|