This is an automated email from the ASF dual-hosted git repository.
lizhimins pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/rocketmq-dashboard.git
from d50ffecc9 docs: update development trunk branch to rocketmq-studio
add 5b761df83 feat(ai): hosted conversation platform with persisted
timeline and history management (#4606)
add 40a8f6ae7 feat(cluster): clarify supported NameServer address formats
(#4383)
add a24826048 fix(acl): clear a Tencent role's permissions instead of
deleting the role (#4469)
add 1172d8597 fix(studio): clear hidden resource selections (#4473)
add 8457a929d fix(dlq): isolate detail resend state across instance
switches (#4487)
add 2945fba5e fix(topic): scope topic page state to the selected instance
(#4490)
add c230fc989 fix(message): preserve replacement queue pull locks (#4501)
add aaaa957c9 fix(alert): match padded instance ids and render alert
windows and placeholders (#4464)
add f75951052 fix(studio): persist cleared optional instance and registry
fields (#4466)
add e63c8e56f fix(message): abbreviate message properties on code point
boundaries (#4467)
add 7ce9a6821 feat(topic): support cloud test-message sending (#4496)
add cb2ca635b fix(metrics): preserve unknown Apache queue lag (#4517)
add eda9884d6 fix(metrics): preserve unavailable broker runtime fields
(#4521)
add 85f839b6c fix(message): surface message-id lookup failures (#4525)
add d24f58b82 fix(tencent): reject incomplete catalog pages (#4529)
add a913ce7ae fix(group): preserve unknown lag in reset preview (#4540)
add 1c8542efa fix(group): preflight settings across brokers (#4542)
add df369b63a fix(studio): ignore stale consumer progress responses (#4546)
add f531fb8e6 fix(studio): preserve cluster filter in paginated metadata
queries (#4551)
add 27fc97dd3 fix(studio): isolate MCP tool results from audit failures
(#4553)
add c9795c1b7 fix(studio): ignore stale topic sync results (#4548)
add cd448e17f fix(group): preserve unavailable consumer connections (#4544)
add e55409633 fix(auth): bound the login username and correct the
wrong-password status (#4684)
add e3dee797e fix(instance): bound instance text to the column width and
read a legacy null vendor (#4713)
add 958a75990 fix(dlq): keep the redelivery count in exports and reject a
zero-length window (#4718)
add 15167dc5d fix(studio): normalize the audit search term and require an
alert metric (#4682)
add ce8acd080 fix(web): promote the byte unit at the rounding boundary and
localize MiniBar labels (#4680)
add 42b68d1d5 fix(web): surface failed requests instead of stale or blank
panels (#4615)
add 29a7d4abe fix(alert): audit exhausted deliveries with the shared
FAILED vocabulary (#4657)
add b88582b12 [ISSUE #4143][ISSUE #4147] feat(ai): bound message queries
and support custom traces (#4388)
add ed6613bd1 [ISSUE #4463] fix(producer): surface incomplete connection
scans (#4468)
add beae721a9 fix(ai): validate message properties before confirming a
send preview (#4470)
add 7c8ec156f fix(ai): keep the provider token out of
LlmProperties.toString (#4472)
add 61d1b178d fix(nameserver): preserve named IPv6 zone identifiers (#4522)
add 34b033208 fix(tencent): reject incomplete resource pages (#4531)
add cea345e69 fix(tencent): reject incomplete ACL role pages (#4533)
add dff6876d6 fix(client): constrain diagnostics to registered nameservers
(#4534)
add aae11ff0d fix(lite): surface session metric read failures (#4536)
add 74c9ea91c fix(topic): reject updates for missing topics (#4538)
add 59aaadfd7 fix(k8s): redact certificate private keys (#4555)
add 25d8645c8 fix(ai): repair corrupt prompt-template storage instead of
locking it out (#4575)
add e7bacd22e fix(studio): render session timestamps in the viewer
timezone (#4576)
add 5479af6f4 fix(lite): fail the TTL extension instead of partially
updating the cluster (#4578)
add f597fecc2 fix(audit): let the timeline target be activated from the
keyboard (#4580)
add eca042d3c fix(cluster): keep the selected instance when the display
language changes (#4590)
add af47c9697 fix(consumer): refresh the subscription verdict on the 2s
modal auto-refresh (#4593)
add d8157bf68 fix(clients): reset the text search and type filter when the
nameserver changes (#4595)
add fd3776615 fix(topic): reload the paginated inventory after importing
topics (#4602)
add 971a4d17d fix(consumer): keep a failed progress read out of the empty
and healthy states (#4604)
add 042b50d98 fix(message): record direct-consume audit failures as FAILED
(#4607)
add aec407743 fix(ai): seed the run id on attach so stop works after a
reconnect (#4613)
add 91bebfe44 fix(studio): localize the user management page (#4621)
add 480f4bca7 fix(rmqctl): fetch the confirm token after interactive
confirmation (#4623)
add 84174f0c1 fix(rmqctl): align install.sh with the actual release
artifacts (#4625)
add 7a1b8eeb4 fix(rmqctl): ignore non-positive --timeout instead of
failing every request (#4627)
add da43b1ea0 fix(studio): localize the remaining hardcoded strings on
Ops, BrokerCluster and AlertRuleAssets (#4629)
add 114656085 fix(ai): drop superseded LLM runtime responses instead of
letting them repopulate the state (#4631)
add b0b0e176f fix(web): localize the remaining hardcoded strings on the
message page (#4633)
add d388bc43d fix(metrics): keep the current data source when cancelling
the auth dialog (#4643)
add 1b9374b7f fix(rmqctl): escape control characters in table cell output
(#4661)
add 02d81ec28 fix(ai): retry a turn whose remembered agent session is gone
(#4693)
add 930e27df5 fix(ai): attach only the run of the conversation on screen
(#4696)
add c55a45244 fix(studio): keep a failed Ops load out of the
unsupported-cluster state (#4698)
add 71ffb696a fix(deliveries): offer a retry when the instance filter
cannot load (#4700)
add 96c484637 docs: correct the audit result values in the API spec (#4709)
add ef9b98269 fix: prevent unread badge from inflating when streaming
fails (#4715)
add ef5b203c3 fix(deploy): use gmt_create in the nameserver unique-key
migration (#4721)
add 3945f6d44 docs: align the ACL section of the API spec with the
controller (#4723)
add 4cbc45120 docs: align the instance section of the API spec with
InstanceType (#4725)
add cd6bec037 docs: list the enum values the API actually defines (#4727)
add 148cb694d docs: sync the Chinese README login description with the
code (#4729)
add 552409185 fix(web): key the protocol tag map by the values the API
returns (#4741)
add 4c697f07a fix(web): prefix CSV downloads with a UTF-8 BOM (#4743)
add 1ef5d8607 fix(studio): repair MCP tool gating, smooth AI streaming,
and polish console surfaces (#4855)
add b42a6ed1b feat(studio): enforce resource ownership isolation for open
source instances (#5006)
add 0228dad5b chore(studio): 3.0.0 release readiness (#5007)
No new revisions were added by this update.
Summary of changes:
.claude/skills/deploy-rocketmq/SKILL.md | 22 +
.dockerignore | 60 +
.github/workflows/ci.yml | 66 +-
.gitignore | 4 +
CONTRIBUTING.md | 47 +-
LICENSE | 15 +-
NOTICE | 11 +-
README.md | 96 +-
README_zh.md | 95 +-
deploy/.env.example | 77 +
deploy/deploy.sh | 10 +-
deploy/docker-compose.yml | 41 +-
deploy/mysql/upgrade-nameserver-name-uk.sql | 8 +-
deploy/rocketmq/README.md | 3 +-
deploy/rocketmq/conf/broker-0.conf | 2 +-
deploy/rocketmq/conf/broker-1.conf | 2 +-
deploy/rocketmq/conf/rmq-proxy.json | 2 +-
deploy/rocketmq/docker-compose.yml | 8 +-
docs/ai-agent-architecture.md | 254 +++
docs/api-spec.md | 587 ++++++-
rmqctl/Makefile | 25 +-
rmqctl/cmd/app.go | 2 +-
rmqctl/cmd/app_test.go | 62 +-
rmqctl/cmd/catalog.go | 14 +-
rmqctl/cmd/mcp_config_golden_test.go | 147 ++
rmqctl/install.sh | 8 +-
rmqctl/internal/catalog/catalog_gen.go | 17 +-
rmqctl/internal/output/output.go | 5 +-
rmqctl/internal/output/output_test.go | 24 +
rmqctl/internal/studio/auth.go | 18 +-
rmqctl/internal/studio/client.go | 14 +-
rmqctl/internal/studio/client_test.go | 78 +
rmqctl/internal/studio/mcp_http_test.go | 2 +-
.../studio/testdata/auth-hmac-vectors.json | 12 +-
rmqctl/internal/studio/tools_test.go | 26 +-
rmqctl/scripts/build-windows.ps1 | 94 ++
rmqctl/scripts/license-binary.go | 281 ++++
rmqctl/scripts/license-binary_test.go | 129 ++
rmqctl/scripts/package-release.sh | 47 +-
server/Dockerfile | 149 +-
server/LICENSE | 2 +-
server/NOTICE | 6 +-
server/pom.xml | 83 +-
server/scripts/legal.py | 310 ++++
server/scripts/legal_test.py | 114 ++
.../rocketmq/studio/auth/AuthInterceptor.java | 32 +-
.../apache/rocketmq/studio/auth/AuthService.java | 19 +-
.../studio/cluster/client/ClientProvider.java | 6 +
.../studio/cluster/client/ClientService.java | 5 +-
.../cluster/client/ProducerConnectionResultVO.java | 19 +-
.../client/ProducerConnectionScanResult.java | 41 +
.../cluster/client/ProducerConnectionService.java | 9 +-
.../client/ProducerConnectionSummaryVO.java | 26 +-
.../studio/cluster/client/ProducerController.java | 3 +-
.../rocketmq/studio/cluster/k8s/CreateCertDTO.java | 2 +
.../rocketmq/studio/cluster/k8s/K8sCertVO.java | 2 +
.../studio/cluster/metrics/MetricsService.java | 26 +-
.../ApacheRocketMqBusinessMetricsCollector.java | 56 +-
.../ApacheRocketMqClusterMetricsCollector.java | 24 +-
.../nameserver/NameserverRegistryService.java | 39 +
.../cluster/nameserver/NamesrvAddrParser.java | 6 +-
.../rocketmq/studio/common/config/CorsConfig.java | 6 +-
.../studio/common/util/MessagePropertyDisplay.java | 31 +-
.../rocketmq/studio/instance/InstanceService.java | 47 +-
.../instance/MybatisPlusInstanceRepository.java | 18 +-
.../studio/instance/ResourceOwnershipGuard.java | 287 ++++
.../instance/ResourceOwnershipSchemaMigration.java | 153 ++
.../studio/instance/dlq/DLQMessageExcelRow.java | 3 +
.../rocketmq/studio/instance/dlq/DLQService.java | 8 +
.../studio/instance/group/ConsumerGroupVO.java | 1 +
.../instance/group/DeleteConsumerGroupDTO.java | 1 +
.../studio/instance/message/MessageService.java | 63 +-
.../studio/instance/topic/DeleteTopicDTO.java | 1 +
.../studio/instance/topic/LiteTopicController.java | 2 +-
.../studio/instance/topic/LiteTopicService.java | 18 +-
.../instance/topic/LiteTopicTTLUpdateDTO.java | 2 +
.../studio/instance/topic/MetadataService.java | 136 +-
.../rocketmq/studio/ops/ai/AgentProvider.java | 46 +-
.../rocketmq/studio/ops/ai/AiController.java | 44 -
.../rocketmq/studio/ops/ai/AiExecuteResultVO.java | 31 -
.../rocketmq/studio/ops/ai/AiPayloadGuard.java | 44 +-
.../apache/rocketmq/studio/ops/ai/AiService.java | 73 -
.../org/apache/rocketmq/studio/ops/ai/ChatDTO.java | 35 -
.../studio/ops/ai/ClaudeCodeAgentProvider.java | 373 ++++-
.../studio/ops/ai/ClaudeCodeStreamParser.java | 712 ++++++++
.../rocketmq/studio/ops/ai/CliAgentProvider.java | 30 +-
.../studio/ops/ai/CliProcessEnvironment.java | 51 +-
.../rocketmq/studio/ops/ai/LlmConfigService.java | 5 +
.../apache/rocketmq/studio/ops/ai/LlmGateway.java | 26 -
.../rocketmq/studio/ops/ai/LlmProperties.java | 2 +
.../rocketmq/studio/ops/ai/LlmSseSession.java | 129 --
.../rocketmq/studio/ops/ai/McpServerRegistry.java | 36 -
.../studio/ops/ai/OpenAiCompatibleLlmGateway.java | 377 -----
.../rocketmq/studio/ops/ai/ToolController.java | 5 +-
.../studio/ops/ai/auth/McpAuthenticator.java | 54 +-
.../studio/ops/ai/conversation/AbortReason.java | 84 +
.../studio/ops/ai/conversation/AgentRunHandle.java | 354 ++++
.../ops/ai/conversation/AgentRunRegistry.java | 215 +++
.../ops/ai/conversation/AgentStreamSession.java | 385 +++++
.../ai/conversation/AiConversationController.java | 415 +++++
.../ai/conversation/AiConversationProperties.java | 74 +
.../ai/conversation/AiConversationRepository.java | 60 +
.../AiConversationSchemaMigration.java | 209 +++
.../ops/ai/conversation/AiConversationService.java | 549 +++++++
.../ai/conversation/AiConversationVoAssembler.java | 253 +++
.../studio/ops/ai/conversation/AiEventCodec.java | 91 ++
.../ops/ai/conversation/AiEventRepository.java | 48 +
.../studio/ops/ai/conversation/AiEventSink.java | 487 ++++++
.../studio/ops/ai/conversation/AiRunExecutor.java | 749 +++++++++
.../ops/ai/conversation/AiRunRepository.java | 66 +
.../studio/ops/ai/conversation/AiRunService.java | 596 +++++++
.../MybatisPlusAiConversationRepository.java | 132 ++
.../conversation/MybatisPlusAiEventRepository.java | 91 ++
.../conversation/MybatisPlusAiRunRepository.java | 184 +++
.../conversation/agent/AgentCapabilityProbe.java | 132 ++
.../ai/conversation/agent/AgentStreamOptions.java | 136 ++
.../ops/ai/conversation/agent/CliBinaryProbe.java | 111 ++
.../agent/InstanceCredentialResolver.java | 167 ++
.../ops/ai/conversation/agent/PromptEnhancer.java | 140 ++
.../ops/ai/conversation/agent/ResumeRecovery.java | 101 ++
.../ops/ai/conversation/agent/RmqctlWorkspace.java | 683 ++++++++
.../conversation/dto/AiConversationCreateDTO.java} | 29 +-
.../conversation/dto/AiConversationUpdateDTO.java} | 18 +-
.../ops/ai/conversation/dto/AiMessageDTO.java | 65 +
.../conversation/dto/ReportRunSpeedDTO.java} | 19 +-
.../ops/ai/conversation/event/AgentEvent.java | 102 ++
.../ai/conversation/event/AgentEventProjector.java | 515 ++++++
.../ops/ai/conversation/event/LiveEvent.java | 102 ++
.../ops/ai/conversation/event/RunStatus.java | 55 +
.../ops/ai/conversation/event/StopReason.java | 55 +
.../ops/ai/conversation/event/ThinkingSource.java | 65 +
.../ops/ai/conversation/event/TimelineEvent.java | 110 ++
.../ai/conversation/vo/AiActiveRunRef.java} | 28 +-
.../ai/conversation/vo/AiAgentCapabilitiesVO.java} | 31 +-
.../ai/conversation/vo/AiConversationDetailVO.java | 45 +
.../vo/AiConversationListItemVO.java} | 33 +-
.../ops/ai/conversation/vo/AiConversationVO.java | 66 +
.../ai/conversation/vo/AiRmqctlConfigVO.java} | 27 +-
.../ai/conversation/vo/AiRunStatsVO.java} | 24 +-
.../studio/ops/ai/conversation/vo/AiRunVO.java | 59 +
.../ai/conversation/vo/AiTimelineItemVO.java} | 31 +-
.../ai/conversation/vo/AiTimelineVO.java} | 23 +-
.../ai/tool/contract/group/GroupDetailOutput.java | 1 +
.../ops/ai/tool/contract/group/GroupListItem.java | 1 +
.../contract/message/MessageQueryByTopicInput.java | 16 +-
.../tool/contract/message/MessageQueryInput.java | 16 +-
.../tool/contract/message/MessageQueryOutput.java | 81 +
.../tool/contract/message/MessageTraceInput.java | 7 +-
.../studio/ops/ai/tool/core/ToolError.java | 4 +-
.../studio/ops/ai/tool/filter/ToolAuditFilter.java | 21 +-
.../ops/ai/tool/filter/ToolCapabilityFilter.java | 20 +
.../tool/handler/group/GroupDetailToolHandler.java | 7 +-
.../message/MessageQueryByTopicToolHandler.java | 16 +-
.../handler/message/MessageQueryToolHandler.java | 28 +-
.../handler/message/MessageSendToolHandler.java | 2 +
.../handler/message/MessageTraceToolHandler.java | 8 +-
.../ops/ai/tool/service/ToolExecutionService.java | 51 +-
.../ops/alert/MybatisPlusAlertStateRepository.java | 2 +-
.../studio/ops/alert/NativeAlertProcessor.java | 3 +-
.../ops/alert/NativeAlertRuleTestService.java | 6 +
.../ops/alert/NotificationOutboxService.java | 4 +-
.../rocketmq/studio/ops/audit/AuditService.java | 16 +-
.../persistence/MybatisPlusSettingsRepository.java | 2 +-
.../{RmqTopic.java => RmqAiConversation.java} | 31 +-
.../entity/{RmqInstance.java => RmqAiEvent.java} | 32 +-
.../{RmqOperationAudit.java => RmqAiRun.java} | 43 +-
.../persistence/entity/RmqK8sCertificate.java | 2 +
...uleMapper.java => RmqAiConversationMapper.java} | 4 +-
...RmqAclRuleMapper.java => RmqAiEventMapper.java} | 4 +-
.../{RmqGroupMapper.java => RmqAiRunMapper.java} | 4 +-
.../studio/provider/InstanceCapability.java | 1 +
.../rocketmq/studio/provider/InstanceProvider.java | 34 +
.../studio/provider/LiteTopicProvider.java | 6 +
.../provider/alibaba/AliyunInstanceProvider.java | 30 +
.../studio/provider/apache/AdminClient.java | 2 +
.../provider/apache/ApacheInstanceProvider.java | 43 +
.../provider/apache/ApacheWriteTargetResolver.java | 109 ++
.../provider/apache/ProxyConsumerResolver.java | 94 +-
.../provider/apache/RocketMQAdminClientImpl.java | 444 +++--
.../provider/apache/RocketMQClientProvider.java | 53 +-
.../provider/apache/RocketMQLiteTopicProvider.java | 105 +-
.../provider/apache/RocketMQMessageProvider.java | 139 +-
.../provider/apache/RocketMQMetadataProvider.java | 125 +-
.../studio/provider/tencent/TencentAclService.java | 53 +-
.../provider/tencent/TencentCatalogService.java | 23 +-
.../provider/tencent/TencentInstanceProvider.java | 71 +-
server/src/main/resources/application.yml | 70 +-
server/src/main/resources/db/schema.sql | 106 +-
.../main/resources/prompts/agent-system-prompt.txt | 29 +
.../main/resources/tool-catalog/tools/group.yaml | 7 +-
.../main/resources/tool-catalog/tools/message.yaml | 41 +-
.../main/resources/tool-catalog/tools/proxy.yaml | 6 +-
.../rocketmq/studio/auth/AuthInterceptorTest.java | 118 ++
.../AuthPasswordChangeStatusIntegrationTest.java | 110 ++
.../studio/auth/AuthServiceDatabaseTest.java | 48 +
.../AuthServiceSessionOverviewIntegrationTest.java | 10 +-
.../rocketmq/studio/auth/AuthServiceTest.java | 2 +-
.../studio/cluster/client/ClientServiceTest.java | 28 +-
.../client/ProducerConnectionServiceTest.java | 60 +-
.../client/ProducerConnectionSummaryVOTest.java | 9 +
.../cluster/client/ProducerControllerTest.java | 30 +-
.../k8s/K8sCertificateSecretRedactionTest.java | 62 +
.../studio/cluster/metrics/MetricsServiceTest.java | 77 +
...ApacheRocketMqBusinessMetricsCollectorTest.java | 37 +
.../ApacheRocketMqClusterMetricsCollectorTest.java | 33 +
.../nameserver/NameserverRegistryServiceTest.java | 122 +-
.../cluster/nameserver/NamesrvAddrParserTest.java | 12 +
.../studio/common/config/CorsConfigTest.java | 17 +
.../common/util/MessagePropertyDisplayTest.java | 54 +
.../studio/instance/InstanceServiceTest.java | 140 ++
.../MybatisPlusInstanceRepositoryTest.java | 56 +
.../instance/ResourceOwnershipGuardTest.java | 685 ++++++++
.../instance/dlq/DLQMessageExcelRowTest.java | 71 +
.../studio/instance/dlq/DLQServiceTest.java | 31 +
.../group/ConsumerGroupControllerTest.java | 26 +-
.../instance/message/MessageServiceTest.java | 121 +-
.../instance/topic/LiteTopicControllerTest.java | 25 +-
.../instance/topic/LiteTopicServiceTest.java | 36 +-
.../studio/instance/topic/MetadataServiceTest.java | 271 ++--
.../studio/instance/topic/TopicControllerTest.java | 25 +-
.../rocketmq/studio/ops/ai/AiControllerTest.java | 55 -
.../rocketmq/studio/ops/ai/AiPayloadGuardTest.java | 25 +-
.../rocketmq/studio/ops/ai/AiServiceTest.java | 187 ---
.../studio/ops/ai/ClaudeCodeAgentProviderTest.java | 304 ++++
.../studio/ops/ai/ClaudeCodeStreamParserTest.java | 653 ++++++++
.../studio/ops/ai/CliAgentProviderTest.java | 36 +
.../studio/ops/ai/CliProcessEnvironmentTest.java | 53 +
...LlmConfigVOTest.java => LlmPropertiesTest.java} | 24 +-
.../rocketmq/studio/ops/ai/LlmSseSessionTest.java | 130 --
.../ops/ai/OpenAiCompatibleLlmGatewayTest.java | 402 -----
.../studio/ops/ai/QoderAgentProviderTest.java | 23 +
.../rocketmq/studio/ops/ai/ToolControllerTest.java | 28 +-
.../ai/conversation/AgentRunHandleStopTest.java | 369 +++++
.../ops/ai/conversation/AgentRunRegistryTest.java | 264 +++
.../conversation/AiConversationControllerTest.java | 645 ++++++++
.../AiConversationPersistenceIntegrationTest.java | 521 ++++++
.../AiConversationSchemaMigrationTest.java | 231 +++
.../ai/conversation/AiConversationServiceTest.java | 442 +++++
.../AiConversationVoAssemblerTest.java | 666 ++++++++
.../ai/conversation/AiEventSeqAllocationTest.java | 320 ++++
.../ops/ai/conversation/AiRunExecutorTest.java | 617 +++++++
.../ops/ai/conversation/AiRunServiceTest.java | 561 +++++++
.../ops/ai/conversation/AiRunTestSupport.java | 365 +++++
.../ai/conversation/AiStreamControllerTest.java | 403 +++++
.../ai/conversation/AiTimelineRepositoryTest.java | 807 +++++++++
.../agent/InstanceCredentialResolverTest.java | 268 +++
.../ai/conversation/agent/RmqctlWorkspaceTest.java | 600 +++++++
.../event/AgentEventProjectorTest.java | 589 +++++++
.../ops/ai/conversation/event/AiEventCodecs.java | 109 ++
.../ai/conversation/event/AiEventContractTest.java | 526 ++++++
.../event/AiEventJsonSerializationTest.java | 453 ++++++
.../studio/ops/ai/mcp/McpToolRegistrarTest.java | 108 ++
.../ops/ai/tool/MessageTraceToolHandlerTest.java | 32 +
.../ops/ai/tool/catalog/ToolCatalogTest.java | 62 +
.../group/ConsumerGroupReadToolHandlersTest.java | 17 +
.../MessageQueryByTopicToolHandlerTest.java | 98 +-
.../message/MessageQueryToolHandlerTest.java | 171 +-
.../message/MessageSendToolHandlerTest.java | 17 +
.../ai/tool/service/ToolInstanceBindingTest.java | 317 ++++
.../ai/tool/service/ToolInstanceRoutingTest.java | 3 +-
.../tool/service/ToolOutputSchemaContractTest.java | 38 +-
.../alert/MybatisPlusAlertStateRepositoryTest.java | 29 +
.../studio/ops/alert/NativeAlertProcessorTest.java | 68 +
.../ops/alert/NativeAlertRuleTestServiceTest.java | 20 +
.../ops/alert/NotificationOutboxServiceTest.java | 38 +
.../studio/ops/audit/AuditServiceTest.java | 47 +
.../alibaba/AliyunInstanceProviderTest.java | 51 +
.../apache/ApacheInstanceProviderTest.java | 54 +
.../provider/apache/ProxyConsumerResolverTest.java | 57 +-
.../apache/RocketMQAdminClientImplTest.java | 327 +++-
.../apache/RocketMQClientProviderTest.java | 78 +-
.../apache/RocketMQLiteTopicProviderTest.java | 141 +-
.../apache/RocketMQMessageProviderTest.java | 126 +-
.../apache/RocketMQMetadataProviderTest.java | 89 +-
.../provider/tencent/TencentAclServiceTest.java | 74 +
.../tencent/TencentCatalogServiceTest.java | 42 +
.../tencent/TencentInstanceProviderTest.java | 82 +
.../src/test/resources/ai/agent-notices.txt | 21 +-
.../src/test/resources/ai/ai-event-contract.json | 263 +++
.../ai/claude-stream-capture-mcp-failed.jsonl | 196 +++
.../test/resources/ai/claude-stream-capture.jsonl | 278 ++++
web/Dockerfile | 18 +
web/LICENSE | 15 +-
web/NOTICE | 11 +-
web/licenses/toggle-selection-1.0.6/LICENSE | 21 +
web/nginx.conf | 33 +-
web/nginx_contract_test.sh | 23 +-
web/package-lock.json | 18 +-
web/package.json | 7 +-
.../TopicPerm.java => web/scripts/licenses.d.mts | 8 +-
web/scripts/licenses.mjs | 247 +++
web/scripts/licenses.test.mjs | 98 ++
web/src/App.test.tsx | 47 +-
web/src/App.tsx | 1 +
web/src/api/ai.test.ts | 521 ++++--
web/src/api/ai.ts | 372 +++--
web/src/api/aiConversations.test.ts | 299 ++++
web/src/api/aiConversations.ts | 263 +++
web/src/api/aiEvents.contract.test.ts | 706 ++++++++
web/src/api/aiEvents.optionalFields.test.ts | 640 ++++++++
web/src/api/aiEvents.ts | 371 +++++
web/src/api/client.ts | 2 -
web/src/api/cluster.ts | 4 -
web/src/api/instance.ts | 1 +
web/src/api/metadata.ts | 1 +
web/src/api/producer.test.ts | 17 +
web/src/api/producer.ts | 38 +-
web/src/assets/model-logos/LICENSE | 21 +
web/src/assets/model-logos/baichuan-color.svg | 1 +
web/src/assets/model-logos/chatglm-color.svg | 1 +
web/src/assets/model-logos/claude-color.svg | 1 +
web/src/assets/model-logos/deepseek-color.svg | 1 +
web/src/assets/model-logos/doubao-color.svg | 1 +
web/src/assets/model-logos/gemini-color.svg | 1 +
web/src/assets/model-logos/grok.svg | 1 +
web/src/assets/model-logos/hunyuan-color.svg | 1 +
web/src/assets/model-logos/kimi-color.svg | 1 +
web/src/assets/model-logos/metaai-color.svg | 1 +
web/src/assets/model-logos/minimax-color.svg | 1 +
web/src/assets/model-logos/mistral-color.svg | 1 +
web/src/assets/model-logos/moonshot.svg | 1 +
web/src/assets/model-logos/ollama.svg | 1 +
web/src/assets/model-logos/openai.svg | 1 +
web/src/assets/model-logos/qwen-color.svg | 1 +
web/src/assets/model-logos/spark-color.svg | 1 +
web/src/components/AlertRuleAssetList.tsx | 19 +
web/src/components/GrafanaDashboardList.tsx | 19 +
web/src/components/MetricsExplorer.tsx | 19 +-
web/src/components/MiniBar.tsx | 14 +-
web/src/components/QueueBrowser.tsx | 6 +-
.../__tests__/AlertRuleAssetList.test.tsx | 22 +
.../__tests__/GrafanaDashboardList.test.tsx | 28 +
.../components/__tests__/MetricsExplorer.test.tsx | 75 +
web/src/components/__tests__/MiniBar.test.tsx | 51 +-
web/src/components/__tests__/QueueBrowser.test.tsx | 31 +
web/src/constants/__tests__/theme.test.ts | 7 +
web/src/constants/theme.ts | 4 +-
web/src/i18n/translations.ts | 661 +++++++-
web/src/index.css | 108 +-
web/src/layouts/MainLayout.test.tsx | 7 +-
web/src/layouts/MainLayout.tsx | 343 ++--
web/src/mock/consumers.ts | 82 +-
web/src/pages/ai/__tests__/AiMessage.test.tsx | 68 -
web/src/pages/ai/__tests__/AiPage.test.tsx | 842 +++++-----
web/src/pages/ai/chatDraft.test.ts | 85 +-
web/src/pages/ai/chatDraft.ts | 70 +-
web/src/pages/ai/components/AssistantBubble.tsx | 310 ++++
web/src/pages/ai/components/BubbleList.tsx | 143 ++
web/src/pages/ai/components/ChatThread.tsx | 261 +++
web/src/pages/ai/components/Composer.tsx | 578 +++++++
.../pages/ai/components/ConversationListModal.tsx | 526 ++++++
web/src/pages/ai/components/ModelBadge.tsx | 132 ++
.../pages/ai/components/PromptTemplateModal.tsx | 382 +++++
web/src/pages/ai/components/RuntimeNotices.tsx | 79 +
web/src/pages/ai/components/SendStopButton.tsx | 94 ++
.../pages/ai/components/ToolPlaygroundModal.tsx | 348 ++++
web/src/pages/ai/components/UserBubble.tsx | 102 ++
web/src/pages/ai/components/WelcomeStarters.tsx | 170 ++
.../components/__tests__/AssistantBubble.test.tsx | 399 +++++
.../ai/components/__tests__/ChatThread.test.tsx | 330 ++++
.../ai/components/__tests__/Composer.test.tsx | 303 ++++
.../__tests__/ConversationListModal.test.tsx | 509 ++++++
.../components/__tests__/SendStopButton.test.tsx | 149 ++
.../ai/components/__tests__/ToolBlock.test.tsx | 146 ++
web/src/pages/ai/components/blocks/ErrorBlock.tsx | 66 +
web/src/pages/ai/components/blocks/NoticeBlock.tsx | 51 +
web/src/pages/ai/components/blocks/TextBlock.tsx | 50 +
.../pages/ai/components/blocks/ThinkingBlock.tsx | 116 ++
web/src/pages/ai/components/blocks/ToolBlock.tsx | 265 +++
web/src/pages/ai/hooks/useActiveRunAttach.test.ts | 77 +
web/src/pages/ai/hooks/useActiveRunAttach.ts | 60 +
web/src/pages/ai/hooks/useAgentCapabilities.ts | 49 +
web/src/pages/ai/hooks/useAgentRun.test.ts | 497 ++++++
web/src/pages/ai/hooks/useAgentRun.ts | 470 ++++++
web/src/pages/ai/hooks/useAiSend.ts | 149 ++
web/src/pages/ai/hooks/useComposerDraft.ts | 75 +
web/src/pages/ai/hooks/useConversationList.test.ts | 185 +++
web/src/pages/ai/hooks/useConversationList.ts | 139 ++
.../pages/ai/hooks/useConversationTimeline.test.ts | 243 +++
web/src/pages/ai/hooks/useConversationTimeline.ts | 217 +++
web/src/pages/ai/hooks/useDraftHandoff.ts | 127 ++
web/src/pages/ai/hooks/useLlmRuntime.test.ts | 136 ++
web/src/pages/ai/hooks/useLlmRuntime.ts | 148 ++
web/src/pages/ai/index.tsx | 1716 +++-----------------
web/src/pages/ai/pageStyle.ts | 45 +
web/src/pages/ai/promptTemplates.test.ts | 17 +
web/src/pages/ai/promptTemplates.ts | 37 +-
.../pages/ai/render/__tests__/streamSpeed.test.ts | 70 +
web/src/pages/ai/render/blocks.ts | 239 +++
web/src/pages/ai/render/equivalence.test.ts | 772 +++++++++
web/src/pages/ai/render/foldTimeline.ts | 343 ++++
web/src/pages/ai/render/markdown.ts | 35 +
web/src/pages/ai/render/reduceLive.ts | 76 +
web/src/pages/ai/render/streamSpeed.ts | 69 +
.../pages/cluster/__tests__/ClientsPage.test.tsx | 60 +-
.../pages/cluster/__tests__/ClusterPage.test.tsx | 211 ++-
web/src/pages/cluster/clients.tsx | 56 +-
web/src/pages/cluster/index.tsx | 258 ++-
.../pages/home/__tests__/DashboardPage.test.tsx | 10 +-
web/src/pages/home/__tests__/HomePage.test.tsx | 34 +-
web/src/pages/home/index.tsx | 247 +--
web/src/pages/instance/__tests__/AclPage.test.tsx | 40 +-
.../pages/instance/__tests__/ConsumerPage.test.tsx | 217 ++-
.../__tests__/ConsumerPageDiagnosticsRace.test.tsx | 166 ++
web/src/pages/instance/__tests__/DLQPage.test.tsx | 128 +-
.../pages/instance/__tests__/InstancePage.test.tsx | 46 +-
.../pages/instance/__tests__/MessagePage.test.tsx | 81 +-
.../__tests__/MessagePageAsyncState.test.tsx | 36 +-
.../pages/instance/__tests__/TopicPage.test.tsx | 225 ++-
web/src/pages/instance/acl.tsx | 4 +-
web/src/pages/instance/consumer.tsx | 93 +-
web/src/pages/instance/dlq.tsx | 60 +-
web/src/pages/instance/index.tsx | 2 +-
web/src/pages/instance/message.tsx | 258 +--
web/src/pages/instance/topic.tsx | 80 +-
web/src/pages/login/index.css | 299 ++--
web/src/pages/login/index.tsx | 135 +-
web/src/pages/ops/__tests__/AlertsPage.test.tsx | 106 ++
web/src/pages/ops/__tests__/AuditPage.test.tsx | 21 +-
.../__tests__/NotificationDeliveriesPage.test.tsx | 30 +-
.../pages/ops/__tests__/SystemAlertsPage.test.tsx | 32 +
web/src/pages/ops/alerts.tsx | 38 +-
web/src/pages/ops/audit.tsx | 20 +-
web/src/pages/ops/notificationDeliveries.tsx | 32 +-
web/src/pages/ops/systemAlerts.tsx | 8 +-
web/src/pages/settings/AboutTab.tsx | 4 +-
web/src/pages/studio/AlertRuleAssets.tsx | 2 +-
web/src/pages/studio/BrokerCluster.tsx | 10 +-
web/src/pages/studio/Ops.tsx | 35 +-
web/src/pages/studio/Producer.tsx | 21 +-
web/src/pages/studio/UserManagement.tsx | 289 ++--
.../__tests__/BrokerClusterInstanceScope.test.tsx | 185 +++
web/src/pages/studio/__tests__/Ops.test.tsx | 18 +
web/src/pages/studio/__tests__/Producer.test.tsx | 45 +
.../pages/studio/__tests__/UserManagement.test.tsx | 59 +-
web/src/services/consumerService.test.ts | 40 +-
web/src/services/consumerService.ts | 6 +-
web/src/stores/aiChatHistoryStore.test.ts | 205 ---
web/src/stores/aiChatHistoryStore.ts | 308 ----
web/src/test/setup.test.ts | 134 ++
web/src/test/setup.ts | 54 +-
web/src/utils/alertTemplatePreview.test.ts | 24 +
web/src/utils/alertTemplatePreview.ts | 6 +-
web/src/utils/apiError.ts | 15 +
web/src/utils/consumerConnections.test.ts | 51 +
web/src/utils/consumerConnections.ts | 35 +
web/src/utils/consumerGroupDiagnostics.test.ts | 12 +
web/src/utils/consumerGroupDiagnostics.ts | 18 +-
web/src/utils/download.test.ts | 36 +-
web/src/utils/download.ts | 6 +-
web/src/utils/format.test.ts | 7 +
web/src/utils/format.ts | 21 +-
web/src/utils/messageTraceDiagnostics.test.ts | 51 +-
web/src/utils/messageTraceDiagnostics.ts | 137 +-
web/vite.config.ts | 21 +-
455 files changed, 47809 insertions(+), 7177 deletions(-)
create mode 100644 .dockerignore
create mode 100644 docs/ai-agent-architecture.md
create mode 100644 rmqctl/cmd/mcp_config_golden_test.go
create mode 100644 rmqctl/internal/studio/client_test.go
create mode 100644 rmqctl/scripts/build-windows.ps1
create mode 100644 rmqctl/scripts/license-binary.go
create mode 100644 rmqctl/scripts/license-binary_test.go
create mode 100644 server/scripts/legal.py
create mode 100644 server/scripts/legal_test.py
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/cluster/client/ProducerConnectionScanResult.java
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/instance/ResourceOwnershipGuard.java
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/instance/ResourceOwnershipSchemaMigration.java
delete mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/AiController.java
delete mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/AiExecuteResultVO.java
delete mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/AiService.java
delete mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/ChatDTO.java
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/ClaudeCodeStreamParser.java
delete mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/LlmGateway.java
delete mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/LlmSseSession.java
delete mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/McpServerRegistry.java
delete mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/OpenAiCompatibleLlmGateway.java
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/conversation/AbortReason.java
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/conversation/AgentRunHandle.java
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/conversation/AgentRunRegistry.java
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/conversation/AgentStreamSession.java
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/conversation/AiConversationController.java
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/conversation/AiConversationProperties.java
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/conversation/AiConversationRepository.java
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/conversation/AiConversationSchemaMigration.java
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/conversation/AiConversationService.java
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/conversation/AiConversationVoAssembler.java
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/conversation/AiEventCodec.java
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/conversation/AiEventRepository.java
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/conversation/AiEventSink.java
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/conversation/AiRunExecutor.java
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/conversation/AiRunRepository.java
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/conversation/AiRunService.java
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/conversation/MybatisPlusAiConversationRepository.java
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/conversation/MybatisPlusAiEventRepository.java
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/conversation/MybatisPlusAiRunRepository.java
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/conversation/agent/AgentCapabilityProbe.java
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/conversation/agent/AgentStreamOptions.java
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/conversation/agent/CliBinaryProbe.java
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/conversation/agent/InstanceCredentialResolver.java
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/conversation/agent/PromptEnhancer.java
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/conversation/agent/ResumeRecovery.java
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/conversation/agent/RmqctlWorkspace.java
copy
server/src/main/java/org/apache/rocketmq/studio/{instance/dlq/DLQResendSelectedRequestDTO.java
=> ops/ai/conversation/dto/AiConversationCreateDTO.java} (56%)
copy
server/src/main/java/org/apache/rocketmq/studio/{instance/message/TraceNodeVO.java
=> ops/ai/conversation/dto/AiConversationUpdateDTO.java} (65%)
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/conversation/dto/AiMessageDTO.java
copy
server/src/main/java/org/apache/rocketmq/studio/ops/{alert/ToggleAlertRuleDTO.java
=> ai/conversation/dto/ReportRunSpeedDTO.java} (58%)
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/conversation/event/AgentEvent.java
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/conversation/event/AgentEventProjector.java
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/conversation/event/LiveEvent.java
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/conversation/event/RunStatus.java
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/conversation/event/StopReason.java
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/conversation/event/ThinkingSource.java
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/conversation/event/TimelineEvent.java
copy
server/src/main/java/org/apache/rocketmq/studio/{instance/acl/AclRuleVO.java =>
ops/ai/conversation/vo/AiActiveRunRef.java} (58%)
copy
server/src/main/java/org/apache/rocketmq/studio/{instance/dlq/DLQExportResultVO.java
=> ops/ai/conversation/vo/AiAgentCapabilitiesVO.java} (51%)
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/conversation/vo/AiConversationDetailVO.java
rename
server/src/main/java/org/apache/rocketmq/studio/ops/ai/{AiCommandDTO.java =>
conversation/vo/AiConversationListItemVO.java} (55%)
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/conversation/vo/AiConversationVO.java
copy
server/src/main/java/org/apache/rocketmq/studio/{instance/group/ResetConsumerOffsetDTO.java
=> ops/ai/conversation/vo/AiRmqctlConfigVO.java} (61%)
copy
server/src/main/java/org/apache/rocketmq/studio/{cluster/k8s/UpdateCertDTO.java
=> ops/ai/conversation/vo/AiRunStatsVO.java} (67%)
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/conversation/vo/AiRunVO.java
copy
server/src/main/java/org/apache/rocketmq/studio/{cluster/nameserver/NameserverRegistryVO.java
=> ops/ai/conversation/vo/AiTimelineItemVO.java} (52%)
copy
server/src/main/java/org/apache/rocketmq/studio/{instance/dlq/DLQExportResultVO.java
=> ops/ai/conversation/vo/AiTimelineVO.java} (59%)
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/ops/ai/tool/contract/message/MessageQueryOutput.java
copy
server/src/main/java/org/apache/rocketmq/studio/persistence/entity/{RmqTopic.java
=> RmqAiConversation.java} (70%)
copy
server/src/main/java/org/apache/rocketmq/studio/persistence/entity/{RmqInstance.java
=> RmqAiEvent.java} (67%)
copy
server/src/main/java/org/apache/rocketmq/studio/persistence/entity/{RmqOperationAudit.java
=> RmqAiRun.java} (61%)
copy
server/src/main/java/org/apache/rocketmq/studio/persistence/mapper/{RmqAclRuleMapper.java
=> RmqAiConversationMapper.java} (85%)
copy
server/src/main/java/org/apache/rocketmq/studio/persistence/mapper/{RmqAclRuleMapper.java
=> RmqAiEventMapper.java} (87%)
copy
server/src/main/java/org/apache/rocketmq/studio/persistence/mapper/{RmqGroupMapper.java
=> RmqAiRunMapper.java} (87%)
create mode 100644
server/src/main/java/org/apache/rocketmq/studio/provider/apache/ApacheWriteTargetResolver.java
create mode 100644 server/src/main/resources/prompts/agent-system-prompt.txt
create mode 100644
server/src/test/java/org/apache/rocketmq/studio/auth/AuthPasswordChangeStatusIntegrationTest.java
create mode 100644
server/src/test/java/org/apache/rocketmq/studio/cluster/k8s/K8sCertificateSecretRedactionTest.java
create mode 100644
server/src/test/java/org/apache/rocketmq/studio/instance/ResourceOwnershipGuardTest.java
create mode 100644
server/src/test/java/org/apache/rocketmq/studio/instance/dlq/DLQMessageExcelRowTest.java
delete mode 100644
server/src/test/java/org/apache/rocketmq/studio/ops/ai/AiControllerTest.java
delete mode 100644
server/src/test/java/org/apache/rocketmq/studio/ops/ai/AiServiceTest.java
create mode 100644
server/src/test/java/org/apache/rocketmq/studio/ops/ai/ClaudeCodeStreamParserTest.java
copy
server/src/test/java/org/apache/rocketmq/studio/ops/ai/{LlmConfigVOTest.java =>
LlmPropertiesTest.java} (60%)
delete mode 100644
server/src/test/java/org/apache/rocketmq/studio/ops/ai/LlmSseSessionTest.java
delete mode 100644
server/src/test/java/org/apache/rocketmq/studio/ops/ai/OpenAiCompatibleLlmGatewayTest.java
create mode 100644
server/src/test/java/org/apache/rocketmq/studio/ops/ai/conversation/AgentRunHandleStopTest.java
create mode 100644
server/src/test/java/org/apache/rocketmq/studio/ops/ai/conversation/AgentRunRegistryTest.java
create mode 100644
server/src/test/java/org/apache/rocketmq/studio/ops/ai/conversation/AiConversationControllerTest.java
create mode 100644
server/src/test/java/org/apache/rocketmq/studio/ops/ai/conversation/AiConversationPersistenceIntegrationTest.java
create mode 100644
server/src/test/java/org/apache/rocketmq/studio/ops/ai/conversation/AiConversationSchemaMigrationTest.java
create mode 100644
server/src/test/java/org/apache/rocketmq/studio/ops/ai/conversation/AiConversationServiceTest.java
create mode 100644
server/src/test/java/org/apache/rocketmq/studio/ops/ai/conversation/AiConversationVoAssemblerTest.java
create mode 100644
server/src/test/java/org/apache/rocketmq/studio/ops/ai/conversation/AiEventSeqAllocationTest.java
create mode 100644
server/src/test/java/org/apache/rocketmq/studio/ops/ai/conversation/AiRunExecutorTest.java
create mode 100644
server/src/test/java/org/apache/rocketmq/studio/ops/ai/conversation/AiRunServiceTest.java
create mode 100644
server/src/test/java/org/apache/rocketmq/studio/ops/ai/conversation/AiRunTestSupport.java
create mode 100644
server/src/test/java/org/apache/rocketmq/studio/ops/ai/conversation/AiStreamControllerTest.java
create mode 100644
server/src/test/java/org/apache/rocketmq/studio/ops/ai/conversation/AiTimelineRepositoryTest.java
create mode 100644
server/src/test/java/org/apache/rocketmq/studio/ops/ai/conversation/agent/InstanceCredentialResolverTest.java
create mode 100644
server/src/test/java/org/apache/rocketmq/studio/ops/ai/conversation/agent/RmqctlWorkspaceTest.java
create mode 100644
server/src/test/java/org/apache/rocketmq/studio/ops/ai/conversation/event/AgentEventProjectorTest.java
create mode 100644
server/src/test/java/org/apache/rocketmq/studio/ops/ai/conversation/event/AiEventCodecs.java
create mode 100644
server/src/test/java/org/apache/rocketmq/studio/ops/ai/conversation/event/AiEventContractTest.java
create mode 100644
server/src/test/java/org/apache/rocketmq/studio/ops/ai/conversation/event/AiEventJsonSerializationTest.java
create mode 100644
server/src/test/java/org/apache/rocketmq/studio/ops/ai/tool/service/ToolInstanceBindingTest.java
copy .github/ISSUE_TEMPLATE/config.yml =>
server/src/test/resources/ai/agent-notices.txt (51%)
create mode 100644 server/src/test/resources/ai/ai-event-contract.json
create mode 100644
server/src/test/resources/ai/claude-stream-capture-mcp-failed.jsonl
create mode 100644 server/src/test/resources/ai/claude-stream-capture.jsonl
create mode 100644 web/licenses/toggle-selection-1.0.6/LICENSE
copy
server/src/main/java/org/apache/rocketmq/studio/common/domain/enums/TopicPerm.java
=> web/scripts/licenses.d.mts (89%)
create mode 100644 web/scripts/licenses.mjs
create mode 100644 web/scripts/licenses.test.mjs
create mode 100644 web/src/api/aiConversations.test.ts
create mode 100644 web/src/api/aiConversations.ts
create mode 100644 web/src/api/aiEvents.contract.test.ts
create mode 100644 web/src/api/aiEvents.optionalFields.test.ts
create mode 100644 web/src/api/aiEvents.ts
create mode 100644 web/src/assets/model-logos/LICENSE
create mode 100644 web/src/assets/model-logos/baichuan-color.svg
create mode 100644 web/src/assets/model-logos/chatglm-color.svg
create mode 100644 web/src/assets/model-logos/claude-color.svg
create mode 100644 web/src/assets/model-logos/deepseek-color.svg
create mode 100644 web/src/assets/model-logos/doubao-color.svg
create mode 100644 web/src/assets/model-logos/gemini-color.svg
create mode 100644 web/src/assets/model-logos/grok.svg
create mode 100644 web/src/assets/model-logos/hunyuan-color.svg
create mode 100644 web/src/assets/model-logos/kimi-color.svg
create mode 100644 web/src/assets/model-logos/metaai-color.svg
create mode 100644 web/src/assets/model-logos/minimax-color.svg
create mode 100644 web/src/assets/model-logos/mistral-color.svg
create mode 100644 web/src/assets/model-logos/moonshot.svg
create mode 100644 web/src/assets/model-logos/ollama.svg
create mode 100644 web/src/assets/model-logos/openai.svg
create mode 100644 web/src/assets/model-logos/qwen-color.svg
create mode 100644 web/src/assets/model-logos/spark-color.svg
delete mode 100644 web/src/pages/ai/__tests__/AiMessage.test.tsx
create mode 100644 web/src/pages/ai/components/AssistantBubble.tsx
create mode 100644 web/src/pages/ai/components/BubbleList.tsx
create mode 100644 web/src/pages/ai/components/ChatThread.tsx
create mode 100644 web/src/pages/ai/components/Composer.tsx
create mode 100644 web/src/pages/ai/components/ConversationListModal.tsx
create mode 100644 web/src/pages/ai/components/ModelBadge.tsx
create mode 100644 web/src/pages/ai/components/PromptTemplateModal.tsx
create mode 100644 web/src/pages/ai/components/RuntimeNotices.tsx
create mode 100644 web/src/pages/ai/components/SendStopButton.tsx
create mode 100644 web/src/pages/ai/components/ToolPlaygroundModal.tsx
create mode 100644 web/src/pages/ai/components/UserBubble.tsx
create mode 100644 web/src/pages/ai/components/WelcomeStarters.tsx
create mode 100644
web/src/pages/ai/components/__tests__/AssistantBubble.test.tsx
create mode 100644 web/src/pages/ai/components/__tests__/ChatThread.test.tsx
create mode 100644 web/src/pages/ai/components/__tests__/Composer.test.tsx
create mode 100644
web/src/pages/ai/components/__tests__/ConversationListModal.test.tsx
create mode 100644
web/src/pages/ai/components/__tests__/SendStopButton.test.tsx
create mode 100644 web/src/pages/ai/components/__tests__/ToolBlock.test.tsx
create mode 100644 web/src/pages/ai/components/blocks/ErrorBlock.tsx
create mode 100644 web/src/pages/ai/components/blocks/NoticeBlock.tsx
create mode 100644 web/src/pages/ai/components/blocks/TextBlock.tsx
create mode 100644 web/src/pages/ai/components/blocks/ThinkingBlock.tsx
create mode 100644 web/src/pages/ai/components/blocks/ToolBlock.tsx
create mode 100644 web/src/pages/ai/hooks/useActiveRunAttach.test.ts
create mode 100644 web/src/pages/ai/hooks/useActiveRunAttach.ts
create mode 100644 web/src/pages/ai/hooks/useAgentCapabilities.ts
create mode 100644 web/src/pages/ai/hooks/useAgentRun.test.ts
create mode 100644 web/src/pages/ai/hooks/useAgentRun.ts
create mode 100644 web/src/pages/ai/hooks/useAiSend.ts
create mode 100644 web/src/pages/ai/hooks/useComposerDraft.ts
create mode 100644 web/src/pages/ai/hooks/useConversationList.test.ts
create mode 100644 web/src/pages/ai/hooks/useConversationList.ts
create mode 100644 web/src/pages/ai/hooks/useConversationTimeline.test.ts
create mode 100644 web/src/pages/ai/hooks/useConversationTimeline.ts
create mode 100644 web/src/pages/ai/hooks/useDraftHandoff.ts
create mode 100644 web/src/pages/ai/hooks/useLlmRuntime.test.ts
create mode 100644 web/src/pages/ai/hooks/useLlmRuntime.ts
create mode 100644 web/src/pages/ai/pageStyle.ts
create mode 100644 web/src/pages/ai/render/__tests__/streamSpeed.test.ts
create mode 100644 web/src/pages/ai/render/blocks.ts
create mode 100644 web/src/pages/ai/render/equivalence.test.ts
create mode 100644 web/src/pages/ai/render/foldTimeline.ts
create mode 100644 web/src/pages/ai/render/markdown.ts
create mode 100644 web/src/pages/ai/render/reduceLive.ts
create mode 100644 web/src/pages/ai/render/streamSpeed.ts
create mode 100644
web/src/pages/instance/__tests__/ConsumerPageDiagnosticsRace.test.tsx
create mode 100644
web/src/pages/studio/__tests__/BrokerClusterInstanceScope.test.tsx
delete mode 100644 web/src/stores/aiChatHistoryStore.test.ts
delete mode 100644 web/src/stores/aiChatHistoryStore.ts
create mode 100644 web/src/test/setup.test.ts
create mode 100644 web/src/utils/consumerConnections.test.ts
create mode 100644 web/src/utils/consumerConnections.ts