Full Code of phuhao00/greatestworks for AI

main 2a7ee66a8812 cached
453 files
4.3 MB
1.1M tokens
14347 symbols
1 requests
Download .txt
Showing preview only (4,820K chars total). Download the full file or copy to clipboard to get everything.
Repository: phuhao00/greatestworks
Branch: main
Commit: 2a7ee66a8812
Files: 453
Total size: 4.3 MB

Directory structure:
gitextract_cpr1egp_/

├── .dockerignore
├── .editorconfig
├── .gitignore
├── .gitmodules
├── .golangci.yml
├── .goreleaser.yaml
├── CONTRIBUTING.md
├── Dockerfile
├── Makefile
├── README.en.md
├── README.md
├── cmd/
│   ├── auth-service/
│   │   └── main.go
│   ├── game-service/
│   │   └── main.go
│   ├── gateway-service/
│   │   └── main.go
│   ├── replication/
│   │   └── main.go
│   └── scene/
│       └── main.go
├── configs/
│   ├── auth-service.yaml
│   ├── config.dev.yaml.example
│   ├── config.example.yaml
│   ├── config.prod.yaml.example
│   ├── data/
│   │   ├── items.json
│   │   ├── maps.json
│   │   ├── quests.json
│   │   ├── skills.json
│   │   └── units.json
│   ├── docker.yaml
│   ├── game-service.yaml
│   ├── gateway-service.yaml
│   ├── replication-service.yaml
│   └── scene-service.yaml
├── docker-compose.yml
├── docs/
│   └── k8s-local.md
├── go.mod
├── go.work
├── go.work.sum
├── internal/
│   ├── application/
│   │   ├── commands/
│   │   │   ├── battle/
│   │   │   │   ├── create_battle.go
│   │   │   │   └── errors.go
│   │   │   └── player/
│   │   │       ├── ban_player.go
│   │   │       ├── create_player.go
│   │   │       ├── delete_player.go
│   │   │       ├── errors.go
│   │   │       ├── gm_update_player.go
│   │   │       ├── level_up_player.go
│   │   │       ├── move_player.go
│   │   │       ├── unban_player.go
│   │   │       └── update_player.go
│   │   ├── handlers/
│   │   │   ├── command_bus.go
│   │   │   ├── query_bus.go
│   │   │   └── replication_subscribers.go
│   │   ├── interfaces/
│   │   │   └── command.go
│   │   ├── queries/
│   │   │   ├── battle/
│   │   │   │   ├── errors.go
│   │   │   │   └── get_battle.go
│   │   │   └── player/
│   │   │       ├── errors.go
│   │   │       ├── get_player.go
│   │   │       ├── get_player_detail.go
│   │   │       ├── get_player_stats.go
│   │   │       ├── list_players.go
│   │   │       └── search_players.go
│   │   └── services/
│   │       ├── building_service.go
│   │       ├── character_service.go
│   │       ├── fight_service.go
│   │       ├── hangup_service.go
│   │       ├── item_service.go
│   │       ├── mail_service.go
│   │       ├── map_service.go
│   │       ├── minigame_service.go
│   │       ├── npc_service.go
│   │       ├── pet_service.go
│   │       ├── plant_service.go
│   │       ├── player_service.go
│   │       ├── quest_service.go
│   │       ├── ranking_service.go
│   │       ├── replication_service.go
│   │       ├── sacred_service.go
│   │       ├── scene_service.go
│   │       ├── service_registry.go
│   │       ├── spawn_manager.go
│   │       ├── update_manager.go
│   │       ├── user_service.go
│   │       └── weather_service.go
│   ├── auth/
│   │   └── jwt.go
│   ├── base_module.go
│   ├── bootstrap/
│   │   ├── auth_bootstrap.go
│   │   ├── game_bootstrap.go
│   │   ├── gateway_bootstrap.go
│   │   ├── replication_bootstrap.go
│   │   └── scene_bootstrap.go
│   ├── config/
│   │   ├── config.go
│   │   ├── loader.go
│   │   ├── loader_test.go
│   │   ├── manager.go
│   │   └── types.go
│   ├── config_manager_base.go
│   ├── data_base.go
│   ├── database/
│   │   ├── mongodb.go
│   │   └── redis.go
│   ├── domain/
│   │   ├── ai/
│   │   │   └── monster_ai.go
│   │   ├── battle/
│   │   │   ├── battle.go
│   │   │   ├── errors.go
│   │   │   ├── repository.go
│   │   │   ├── service.go
│   │   │   └── skill.go
│   │   ├── building/
│   │   │   ├── aggregate.go
│   │   │   ├── entity.go
│   │   │   ├── errors.go
│   │   │   ├── events.go
│   │   │   ├── repository.go
│   │   │   ├── service.go
│   │   │   ├── types.go
│   │   │   └── value_object.go
│   │   ├── character/
│   │   │   ├── actor.go
│   │   │   ├── buff_attributes_test.go
│   │   │   ├── buff_flags_test.go
│   │   │   ├── entity.go
│   │   │   ├── events.go
│   │   │   ├── events_test.go
│   │   │   ├── monster.go
│   │   │   ├── player.go
│   │   │   ├── repository.go
│   │   │   ├── skill_damage_test.go
│   │   │   ├── subsystems.go
│   │   │   ├── subsystems_test.go
│   │   │   └── value_objects.go
│   │   ├── dialogue/
│   │   │   └── dialogue_manager.go
│   │   ├── events/
│   │   │   └── domain_event.go
│   │   ├── inventory/
│   │   │   ├── dressup/
│   │   │   │   ├── aggregate.go
│   │   │   │   ├── entity.go
│   │   │   │   ├── errors.go
│   │   │   │   ├── events.go
│   │   │   │   ├── repository.go
│   │   │   │   ├── service.go
│   │   │   │   └── value_object.go
│   │   │   ├── errors.go
│   │   │   ├── inventory.go
│   │   │   ├── repository.go
│   │   │   └── synthesis/
│   │   │       ├── aggregate.go
│   │   │       ├── entity.go
│   │   │       ├── errors.go
│   │   │       ├── events.go
│   │   │       ├── repository.go
│   │   │       ├── service.go
│   │   │       └── value_object.go
│   │   ├── mapmanager/
│   │   │   └── map.go
│   │   ├── minigame/
│   │   │   ├── aggregate.go
│   │   │   ├── entity.go
│   │   │   ├── errors.go
│   │   │   ├── events.go
│   │   │   ├── repository.go
│   │   │   ├── service.go
│   │   │   ├── types.go
│   │   │   └── value_object.go
│   │   ├── npc/
│   │   │   ├── aggregate.go
│   │   │   ├── entity.go
│   │   │   ├── errors.go
│   │   │   ├── events.go
│   │   │   ├── repository.go
│   │   │   ├── service.go
│   │   │   └── value_object.go
│   │   ├── pet/
│   │   │   ├── aggregate.go
│   │   │   ├── entity.go
│   │   │   ├── errors.go
│   │   │   ├── events.go
│   │   │   ├── repository.go
│   │   │   ├── service.go
│   │   │   └── value_object.go
│   │   ├── player/
│   │   │   ├── beginner/
│   │   │   │   ├── aggregate.go
│   │   │   │   ├── entity.go
│   │   │   │   ├── errors.go
│   │   │   │   ├── events.go
│   │   │   │   ├── repository.go
│   │   │   │   ├── service.go
│   │   │   │   └── value_object.go
│   │   │   ├── errors.go
│   │   │   ├── events.go
│   │   │   ├── hangup/
│   │   │   │   ├── aggregate.go
│   │   │   │   ├── entity.go
│   │   │   │   ├── errors.go
│   │   │   │   ├── events.go
│   │   │   │   ├── repository.go
│   │   │   │   ├── service.go
│   │   │   │   └── value_object.go
│   │   │   ├── honor/
│   │   │   │   ├── aggregate.go
│   │   │   │   ├── entity.go
│   │   │   │   ├── errors.go
│   │   │   │   ├── events.go
│   │   │   │   ├── repository.go
│   │   │   │   ├── service.go
│   │   │   │   └── value_object.go
│   │   │   ├── player.go
│   │   │   ├── query.go
│   │   │   ├── repository.go
│   │   │   ├── service.go
│   │   │   └── value_objects.go
│   │   ├── quest/
│   │   │   ├── errors.go
│   │   │   ├── quest.go
│   │   │   └── repository.go
│   │   ├── ranking/
│   │   │   ├── aggregate.go
│   │   │   ├── entity.go
│   │   │   ├── errors.go
│   │   │   ├── events.go
│   │   │   ├── repository.go
│   │   │   ├── service.go
│   │   │   └── value_object.go
│   │   ├── replication/
│   │   │   ├── events.go
│   │   │   ├── instance.go
│   │   │   ├── repository.go
│   │   │   └── snapshot.go
│   │   ├── scene/
│   │   │   ├── errors.go
│   │   │   ├── plant/
│   │   │   │   ├── aggregate.go
│   │   │   │   ├── entity.go
│   │   │   │   ├── errors.go
│   │   │   │   ├── events.go
│   │   │   │   ├── repository.go
│   │   │   │   ├── service.go
│   │   │   │   └── value_object.go
│   │   │   ├── repository.go
│   │   │   ├── sacred/
│   │   │   │   ├── aggregate.go
│   │   │   │   ├── entity.go
│   │   │   │   ├── errors.go
│   │   │   │   ├── events.go
│   │   │   │   ├── repository.go
│   │   │   │   ├── service.go
│   │   │   │   └── value_object.go
│   │   │   ├── scene.go
│   │   │   └── weather/
│   │   │       ├── aggregate.go
│   │   │       ├── entity.go
│   │   │       ├── errors.go
│   │   │       ├── events.go
│   │   │       ├── repository.go
│   │   │       ├── service.go
│   │   │       └── value_object.go
│   │   ├── skill/
│   │   │   ├── errors.go
│   │   │   ├── repository.go
│   │   │   └── skill.go
│   │   └── social/
│   │       ├── chat/
│   │       │   ├── aggregate.go
│   │       │   ├── chat_service.go
│   │       │   ├── errors.go
│   │       │   ├── events.go
│   │       │   ├── member.go
│   │       │   ├── message.go
│   │       │   └── repository.go
│   │       ├── email/
│   │       │   ├── attachment.go
│   │       │   ├── email.go
│   │       │   ├── email_service.go
│   │       │   ├── errors.go
│   │       │   ├── events.go
│   │       │   └── repository.go
│   │       ├── family/
│   │       │   ├── errors.go
│   │       │   ├── events.go
│   │       │   ├── family.go
│   │       │   ├── family_service.go
│   │       │   ├── member.go
│   │       │   └── repository.go
│   │       ├── friend/
│   │       │   ├── errors.go
│   │       │   ├── events.go
│   │       │   ├── friend_request.go
│   │       │   ├── friend_service.go
│   │       │   ├── friendship.go
│   │       │   └── repository.go
│   │       └── team/
│   │           ├── errors.go
│   │           ├── events.go
│   │           ├── repository.go
│   │           ├── team.go
│   │           ├── team_member.go
│   │           └── team_service.go
│   ├── errors/
│   │   └── domain_errors.go
│   ├── events/
│   │   ├── eventbus.go
│   │   ├── metrics.go
│   │   ├── middleware.go
│   │   └── worker.go
│   ├── game/
│   │   └── player.go
│   ├── icharacter.go
│   ├── imodule.go
│   ├── infrastructure/
│   │   ├── auth/
│   │   │   ├── jwt.go
│   │   │   └── middleware.go
│   │   ├── cache/
│   │   │   ├── cache_manager.go
│   │   │   ├── memory_cache.go
│   │   │   └── redis_cache.go
│   │   ├── config/
│   │   │   ├── environments/
│   │   │   │   ├── config.dev.yaml
│   │   │   │   ├── config.prod.yaml
│   │   │   │   └── config.test.yaml
│   │   │   ├── file_watcher.go
│   │   │   ├── unified.json
│   │   │   ├── unified.prod.json
│   │   │   └── unified_config.go
│   │   ├── container/
│   │   │   ├── container.go
│   │   │   ├── providers.go
│   │   │   └── simple_container.go
│   │   ├── datamanager/
│   │   │   └── data_manager.go
│   │   ├── errors/
│   │   │   └── errors.go
│   │   ├── logging/
│   │   │   └── logger.go
│   │   ├── managers/
│   │   │   ├── entity_manager.go
│   │   │   └── update_manager.go
│   │   ├── messaging/
│   │   │   ├── event_bus.go
│   │   │   ├── event_dispatcher.go
│   │   │   ├── logger_adapter.go
│   │   │   ├── nats_publisher.go
│   │   │   ├── nats_subscriber.go
│   │   │   ├── publisher.go
│   │   │   └── worker_pool.go
│   │   ├── monitoring/
│   │   │   └── metrics.go
│   │   ├── network/
│   │   │   ├── connection_manager.go
│   │   │   ├── netcore_client.go
│   │   │   └── netcore_server.go
│   │   ├── persistence/
│   │   │   ├── base_repository.go
│   │   │   ├── building_repository.go
│   │   │   ├── db_entities.go
│   │   │   ├── hangup_repository.go
│   │   │   ├── minigame_repository.go
│   │   │   ├── mongodb.go
│   │   │   ├── npc_repository.go
│   │   │   ├── plant_repository.go
│   │   │   ├── player_repository.go
│   │   │   ├── ranking_repository.go
│   │   │   ├── replication_repository.go
│   │   │   ├── repositories.go
│   │   │   ├── scene_repository.go
│   │   │   └── weather_repository.go
│   │   ├── protocol/
│   │   │   ├── binary_protocol.go
│   │   │   ├── json_protocol.go
│   │   │   └── protocol.go
│   │   └── weave/
│   │       └── weavelet.go
│   ├── interfaces/
│   │   ├── http/
│   │   │   ├── auth/
│   │   │   │   ├── login_handler.go
│   │   │   │   ├── middleware.go
│   │   │   │   ├── register_handler.go
│   │   │   │   └── token_handler.go
│   │   │   ├── battle_handler.go
│   │   │   ├── building_handler.go
│   │   │   ├── gm/
│   │   │   │   ├── player_management.go
│   │   │   │   └── server_monitor.go
│   │   │   ├── health_handler.go
│   │   │   ├── pet_handler.go
│   │   │   ├── player_handler.go
│   │   │   ├── replication_handlers.go
│   │   │   ├── response.go
│   │   │   └── server.go
│   │   ├── rpc/
│   │   │   ├── battle_service.go
│   │   │   ├── player_service.go
│   │   │   ├── ranking_service.go
│   │   │   ├── replication_service.go
│   │   │   └── server.go
│   │   └── tcp/
│   │       ├── connection/
│   │       │   ├── heartbeat.go
│   │       │   ├── manager.go
│   │       │   └── session.go
│   │       ├── handlers/
│   │       │   └── game_handler.go
│   │       ├── npc_handler.go
│   │       ├── pet_handler.go
│   │       ├── protocol/
│   │       │   ├── base_protocol.go
│   │       │   ├── errors.go
│   │       │   ├── game_protocol.go
│   │       │   ├── message_types.go
│   │       │   └── pet_protocol.go
│   │       ├── router.go
│   │       ├── scene_handler.go
│   │       └── server.go
│   ├── metrics_base.go
│   ├── module_manager.go
│   ├── network/
│   │   ├── codec.go
│   │   ├── protocol.go
│   │   └── session/
│   │       └── session.go
│   ├── platform.go
│   ├── proto/
│   │   ├── README.md
│   │   ├── battle/
│   │   │   └── battle.pb.go
│   │   ├── chat/
│   │   │   └── chat.pb.go
│   │   ├── common/
│   │   │   └── common.pb.go
│   │   ├── errors/
│   │   │   └── errors.pb.go
│   │   ├── gateway/
│   │   │   └── gateway.pb.go
│   │   ├── mail/
│   │   │   └── mail.pb.go
│   │   ├── messages/
│   │   │   └── messages.pb.go
│   │   ├── pet/
│   │   │   └── pet.pb.go
│   │   ├── player/
│   │   │   └── player.pb.go
│   │   ├── protocol/
│   │   │   └── protocol.pb.go
│   │   ├── room/
│   │   │   └── room.pb.go
│   │   ├── scene/
│   │   │   └── scene.pb.go
│   │   └── team/
│   │       └── team.pb.go
│   └── readme.md
├── k8s/
│   └── local/
│       ├── auth-service.yaml
│       ├── configmap-gateway.yaml
│       ├── game-service.yaml
│       ├── gateway-service.yaml
│       ├── mongodb.yaml
│       ├── namespace.yaml
│       ├── overlays/
│       │   └── registry/
│       │       └── kustomization.yaml
│       └── redis.yaml
├── license
├── proto/
│   ├── auth.proto
│   ├── battle.proto
│   ├── character.proto
│   ├── chat.proto
│   ├── common.proto
│   ├── entity.proto
│   ├── errors.proto
│   ├── fight.proto
│   ├── game.proto
│   ├── gateway.proto
│   ├── inventory.proto
│   ├── mail.proto
│   ├── map.proto
│   ├── messages.proto
│   ├── npc.proto
│   ├── pet.proto
│   ├── player.proto
│   ├── protocol.proto
│   ├── quest.proto
│   ├── room.proto
│   ├── scene.proto
│   └── team.proto
├── protoc/
│   ├── include/
│   │   └── google/
│   │       └── protobuf/
│   │           ├── any.proto
│   │           ├── api.proto
│   │           ├── compiler/
│   │           │   └── plugin.proto
│   │           ├── descriptor.proto
│   │           ├── duration.proto
│   │           ├── empty.proto
│   │           ├── field_mask.proto
│   │           ├── source_context.proto
│   │           ├── struct.proto
│   │           ├── timestamp.proto
│   │           ├── type.proto
│   │           └── wrappers.proto
│   └── readme.txt
├── scripts/
│   ├── build-images.ps1
│   ├── build.sh
│   ├── clean.sh
│   ├── db-migrate.sh
│   ├── deploy.sh
│   ├── docker-build.sh
│   ├── generate_proto.bat
│   ├── generate_proto.sh
│   ├── health-check.sh
│   ├── init-db.sh
│   ├── k8s-deploy.ps1
│   ├── load-images-to-k8s.ps1
│   ├── mongo-init.js
│   ├── publish-images.ps1
│   ├── setup-dev.sh
│   ├── start-services.bat
│   ├── start-services.sh
│   └── stop-services.sh
└── tools/
    └── simclient/
        ├── README_E2E.md
        ├── action_scenario.go
        ├── client.go
        ├── cmd/
        │   └── simclient/
        │       └── main.go
        ├── config.example.yaml
        ├── config.go
        ├── e2e.yaml
        ├── e2e_load.yaml
        ├── e2e_scenario.go
        ├── feature_library.go
        ├── main.go
        ├── metrics.go
        ├── runner.go
        ├── scenario.go
        └── simclient_test.go

================================================
FILE CONTENTS
================================================

================================================
FILE: .dockerignore
================================================
# =============================================================================
# Docker 构建忽略文件
# =============================================================================
# 此文件定义了在 Docker 构建过程中应该忽略的文件和目录
# 减少构建上下文大小,提高构建速度

# =============================================================================
# 版本控制
# =============================================================================
.git
.gitignore
.gitattributes
.gitmodules
.github/

# =============================================================================
# 文档和说明
# =============================================================================
README.md
CHANGELOG.md
CONTRIBUTING.md
LICENSE
*.md
docs/
*.txt
*.rst

# =============================================================================
# 开发工具配置
# =============================================================================
# IDE 配置
.vscode/
.idea/
*.swp
*.swo
*~

# 编辑器配置
.editorconfig

# =============================================================================
# 构建产物和缓存
# =============================================================================
# Go 构建产物
*.exe
*.exe~
*.dll
*.so
*.dylib
bin/
dist/
build/
vendor/

# 测试覆盖率
*.out
coverage.html
coverage.xml

# 性能分析文件
*.prof
*.pprof

# =============================================================================
# 日志和临时文件
# =============================================================================
logs/
*.log
*.log.*
tmp/
temp/
*.tmp
*.temp
*.pid
*.seed
*.pid.lock

# =============================================================================
# 数据库和数据文件
# =============================================================================
*.db
*.sqlite
*.sqlite3
data/
database/
backups/
*.dump
*.sql

# =============================================================================
# 配置和环境文件
# =============================================================================
# 环境变量文件
.env
.env.local
.env.*.local
.env.development
.env.test
.env.production

# 本地配置文件
config.local.yaml
config.local.yml
config.local.json
*.local.yaml
*.local.yml
*.local.json

# 密钥和证书文件
*.key
*.pem
*.crt
*.p12
*.pfx
secrets/
certs/
ssl/

# =============================================================================
# Docker 相关
# =============================================================================
Dockerfile.dev
Dockerfile.test
docker-compose.override.yml
docker-compose.local.yml
.dockerignore

# =============================================================================
# 测试文件
# =============================================================================
*_test.go
testdata/
test/
tests/
*.test

# 测试报告
test-results/
test-reports/
junit.xml

# =============================================================================
# 依赖管理
# =============================================================================
# Node.js (如果有前端资源)
node_modules/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
package-lock.json
yarn.lock

# Python (如果有 Python 脚本)
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg

# =============================================================================
# 操作系统文件
# =============================================================================
# macOS
.DS_Store
.AppleDouble
.LSOverride
Icon
._*
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent

# Windows
Thumbs.db
ehthumbs.db
Desktop.ini
$RECYCLE.BIN/
*.cab
*.msi
*.msm
*.msp
*.lnk

# Linux
*~
.fuse_hidden*
.directory
.Trash-*
.nfs*

# =============================================================================
# 监控和分析工具
# =============================================================================
# Prometheus 数据
prometheus_data/

# Grafana 数据
grafana_data/

# 性能分析
*.pprof
cpu.prof
mem.prof
goroutine.prof

# =============================================================================
# 部署和运维
# =============================================================================
# Kubernetes 配置
k8s/
kubernetes/
*.yaml
*.yml
!docker-compose.yml
!configs/*.yml
!configs/*.yaml

# Terraform
*.tfstate
*.tfstate.*
.terraform/

# Ansible
*.retry

# =============================================================================
# 备份和归档
# =============================================================================
*.bak
*.backup
*.old
*.orig
*.save
*.tar
*.tar.gz
*.tgz
*.zip
*.rar
*.7z

# =============================================================================
# 媒体文件
# =============================================================================
*.jpg
*.jpeg
*.png
*.gif
*.bmp
*.tiff
*.ico
*.svg
*.webp
*.mp3
*.mp4
*.avi
*.mov
*.wmv
*.flv
*.webm

# =============================================================================
# 大文件和资源
# =============================================================================
assets/
static/
public/
uploads/
downloads/

# =============================================================================
# 开发和调试工具
# =============================================================================
# Air (Go 热重载工具)
.air.toml
tmp/

# Delve 调试器
__debug_bin

# Go 工具
*.cover
*.coverprofile

# =============================================================================
# CI/CD 配置
# =============================================================================
.github/
.gitlab-ci.yml
.travis.yml
.circleci/
Jenkinsfile
.drone.yml

# =============================================================================
# 脚本和工具
# =============================================================================
scripts/
tools/
utils/
*.sh
*.bat
*.ps1
!docker-entrypoint.sh

# =============================================================================
# 许可证和法律文件
# =============================================================================
LICENSE*
COPYING*
NOTICE*
AUTHORS*
CONTRIBUTORS*

# =============================================================================
# 其他
# =============================================================================
# 编译器和构建工具生成的文件
*.o
*.a
*.lib
*.obj
*.pdb
*.idb
*.ilk
*.map
*.exp

# 包管理器锁文件
Gopkg.lock
glide.lock

# 临时和缓存目录
cache/
.cache/
.tmp/

# 本地开发配置
.local/
local/

# =============================================================================
# 注意事项
# =============================================================================
# 1. 确保不要忽略必要的配置文件
# 2. 对于生产环境,可能需要包含某些配置文件
# 3. 根据项目实际情况调整忽略规则
# 4. 定期检查和更新此文件
# =============================================================================

================================================
FILE: .editorconfig
================================================
# EditorConfig is awesome: https://EditorConfig.org

# top-most EditorConfig file
root = true

# All files
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
indent_style = space
indent_size = 2

# Go files
[*.go]
indent_style = tab
indent_size = 4

# Markdown files
[*.md]
trim_trailing_whitespace = false
indent_size = 2

# YAML files
[*.{yml,yaml}]
indent_size = 2

# JSON files
[*.json]
indent_size = 2

# JavaScript/TypeScript files
[*.{js,ts,jsx,tsx}]
indent_size = 2

# HTML files
[*.html]
indent_size = 2

# CSS/SCSS files
[*.{css,scss,sass}]
indent_size = 2

# Shell scripts
[*.{sh,bash}]
indent_size = 2

# Docker files
[{Dockerfile,Dockerfile.*}]
indent_size = 2

# Makefile
[{Makefile,makefile,*.mk}]
indent_style = tab
indent_size = 4

# Configuration files
[*.{toml,ini,cfg,conf}]
indent_size = 2

# SQL files
[*.sql]
indent_size = 2

# Protocol Buffer files
[*.proto]
indent_size = 2

# Git files
[.gitignore]
indent_size = 2

# License and README files
[{LICENSE,README,CHANGELOG,CONTRIBUTING}

================================================
FILE: .gitignore
================================================

# AI工作文件
.trae/
.cursor/

# 协作说明(如需本地自定义可忽略)
.github/instructions/

# 构建产物
dist/
build/
*.exe
*.dll
*.so
*.dylib

# 测试覆盖率
*.out
coverage.html
coverage.xml

# 日志文件
log/
logs/
*.log

# 临时文件
*.tmp
*.temp
.DS_Store
Thumbs.db

# IDE文件
.idea/
.vscode/
*.swp
*.swo
*~

# 环境配置
.env
.env.local
.env.*.local
config/local.yaml
config/dev.yaml
config/prod.yaml

# 依赖目录
node_modules/
vendor/

# 数据库文件
*.db
*.sqlite
*.sqlite3

# 证书和密钥
*.pem
*.key
*.crt
*.p12

# 备份文件
*.bak
*.backup

# 操作系统生成的文件
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db

# Go相关
# 如果你有vendor目录,取消下面的注释
# vendor/

# 测试二进制文件,使用go test -c构建
*.test

# 输出的二进制文件(可执行文件)
*.exe
*.exe~
*.dll
*.so
*.dylib

# 测试覆盖率文件
*.out

# 依赖分析文件
go.sum

# 本地环境文件
.env
.env.local
.env.development.local
.env.test.local
.env.production.local

# 编辑器和IDE
.vscode/
.idea/
*.swp
*.swo
*~

# 日志
*.log
logs/

# 运行时数据
pids
*.pid
*.seed
*.pid.lock

# 目录用于仪器化的libs生成的覆盖率报告
lib-cov

# 覆盖率目录,由诸如istanbul这样的工具使用
coverage/

# nyc测试覆盖率
.nyc_output

# Grunt中间存储(https://gruntjs.com/creating-plugins#storing-task-files)
.grunt

# Bower依赖目录(https://bower.io/)
bower_components

# node-waf配置
.lock-wscript

# 编译的二进制插件(https://nodejs.org/api/addons.html)
build/Release

# 依赖目录
node_modules/
jspm_packages/

# TypeScript v1声明文件
typings/

# TypeScript缓存
*.tsbuildinfo

# 可选的npm缓存目录
.npm

# 可选的eslint缓存
.eslintcache

# Microbundle缓存
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/

# 可选的REPL历史
.node_repl_history

# yarn v2的输出
.yarn/cache
.yarn/unplugged
.yarn/build-state.yml
.yarn/install-state.gz
.pnp.*


================================================
FILE: .gitmodules
================================================

[submodule "network/protocol"]
	path = network/protocol
	url = https://github.com/phuhao00/greatestworks-proto.git


================================================
FILE: .golangci.yml
================================================
# =============================================================================
# golangci-lint 配置文件
# 用于 Go 代码质量检查和静态分析
# =============================================================================

# 运行配置
run:
  # 超时时间
  timeout: 5m
  
  # 要检查的 Go 版本
  go: '1.21'
  
  # 并发数
  concurrency: 4
  
  # 跳过的目录
  skip-dirs:
    - vendor
    - .git
    - bin
    - tmp
    - _output
  
  # 跳过的文件
  skip-files:
    - ".*\\.pb\\.go$"
    - ".*\\.gen\\.go$"
    - ".*_test\\.go$"  # 可选:跳过测试文件
  
  # 构建标签
  build-tags:
    - integration
    - e2e

# 输出配置
output:
  # 输出格式: colored-line-number|line-number|json|tab|checkstyle|code-climate
  format: colored-line-number
  
  # 打印 linter 名称
  print-issued-lines: true
  print-linter-name: true
  uniq-by-line: true
  sort-results: true

# Linters 配置
linters:
  # 启用的 linters
  enable:
    # 默认启用
    - errcheck      # 检查未处理的错误
    - gosimple      # 简化代码建议
    - govet         # Go 官方 vet 工具
    - ineffassign   # 检查无效赋值
    - staticcheck   # 静态分析
    - typecheck     # 类型检查
    - unused        # 检查未使用的代码
    
    # 代码风格
    - gofmt         # 格式化检查
    - goimports     # import 排序和格式化
    - gocyclo       # 圈复杂度检查
    - goconst       # 重复字符串检查
    - gocritic      # 代码批评
    - gofumpt       # 更严格的格式化
    
    # 性能相关
    - prealloc      # 预分配切片
    - bodyclose     # HTTP body 关闭检查
    
    # 安全相关
    - gosec         # 安全检查
    
    # 错误处理
    - errorlint     # 错误处理最佳实践
    - wrapcheck     # 错误包装检查
    
    # 命名规范
    - stylecheck    # 风格检查
    - revive        # 替代 golint
    
    # 其他有用的
    - misspell      # 拼写检查
    - unconvert     # 不必要的类型转换
    - unparam       # 未使用的参数
    - whitespace    # 空白字符检查
    - exportloopref # 循环变量引用检查
    - nolintlint    # nolint 指令检查
  
  # 禁用的 linters
  disable:
    - deadcode      # 已废弃,使用 unused 替代
    - varcheck      # 已废弃,使用 unused 替代
    - structcheck   # 已废弃,使用 unused 替代
    - maligned      # 已废弃
    - interfacer    # 已废弃
    - scopelint     # 已废弃,使用 exportloopref 替代
    - golint        # 已废弃,使用 revive 替代
  
  # 快速模式,只运行快速的 linters
  fast: false

# Linters 设置
linters-settings:
  # errcheck 配置
  errcheck:
    # 检查类型断言
    check-type-assertions: true
    # 检查空白标识符
    check-blank: true
    # 忽略的函数
    ignore: fmt:.*,io/ioutil:^Read.*
  
  # govet 配置
  govet:
    # 检查影子变量
    check-shadowing: true
    # 启用所有检查
    enable-all: true
    # 禁用特定检查
    disable:
      - fieldalignment  # 字段对齐检查可能过于严格
  
  # gocyclo 配置
  gocyclo:
    # 圈复杂度阈值
    min-complexity: 15
  
  # goconst 配置
  goconst:
    # 最小字符串长度
    min-len: 3
    # 最小出现次数
    min-occurrences: 3
    # 忽略测试文件
    ignore-tests: true
  
  # gocritic 配置
  gocritic:
    # 启用的检查
    enabled-tags:
      - diagnostic
      - style
      - performance
      - experimental
    # 禁用的检查
    disabled-checks:
      - commentedOutCode
      - whyNoLint
  
  # gosec 配置
  gosec:
    # 严重性级别
    severity: medium
    # 置信度级别
    confidence: medium
    # 排除的规则
    excludes:
      - G104  # 审计错误未检查
  
  # revive 配置
  revive:
    # 最小置信度
    min-confidence: 0.8
    # 规则配置
    rules:
      - name: blank-imports
      - name: context-as-argument
      - name: context-keys-type
      - name: dot-imports
      - name: error-return
      - name: error-strings
      - name: error-naming
      - name: exported
      - name: if-return
      - name: increment-decrement
      - name: var-naming
      - name: var-declaration
      - name: package-comments
      - name: range
      - name: receiver-naming
      - name: time-naming
      - name: unexported-return
      - name: indent-error-flow
      - name: errorf
  
  # stylecheck 配置
  stylecheck:
    # 检查所有内容
    checks: ["all"]
  
  # misspell 配置
  misspell:
    # 语言
    locale: US
    # 忽略的单词
    ignore-words:
      - greatestworks
      - mmo
      - gameplay
  
  # whitespace 配置
  whitespace:
    multi-if: true
    multi-func: true
  
  # wrapcheck 配置
  wrapcheck:
    # 忽略的包
    ignoreSigs:
      - .Errorf(
      - errors.New(
      - errors.Unwrap(
      - .Wrap(
      - .Wrapf(

# Issues 配置
issues:
  # 排除默认的排除规则
  exclude-use-default: false
  
  # 最大 issues 数量,0 表示无限制
  max-issues-per-linter: 0
  max-same-issues: 0
  
  # 新代码检查
  new: false
  
  # 排除的规则
  exclude-rules:
    # 排除测试文件的某些检查
    - path: _test\.go
      linters:
        - gocyclo
        - errcheck
        - dupl
        - gosec
        - goconst
    
    # 排除生成的文件
    - path: \.pb\.go
      linters:
        - all
    
    # 排除 main 函数的某些检查
    - path: cmd/
      text: "main function"
      linters:
        - revive
    
    # 排除特定的错误消息
    - text: "Error return value of .((os\.)?std(out|err)\..*|.*Close|.*Flush|os\.Remove(All)?|.*printf?|os\.(Un)?Setenv). is not checked"
      linters:
        - errcheck
    
    # 排除 G104: Errors unhandled
    - text: "G104:"
      linters:
        - gosec
    
    # 排除包注释检查(对于 main 包)
    - text: "package-comments"
      path: cmd/
      linters:
        - revive
  
  # 包含的文件模式
  include:
    - EXC0002  # disable excluding of issues about comments from golint

# 严重性配置
severity:
  # 默认严重性
  default-severity: error
  
  # 规则严重性
  rules:
    - linters:
        - dupl
      severity: info
    - linters:
        - goconst
      severity: warning

================================================
FILE: .goreleaser.yaml
================================================
# This is an example .goreleaser.yml file with some sensible defaults.
# Make sure to check the documentation at https://goreleaser.com
before:
  hooks:
    # You may remove this if you don't use go modules.
    - go mod tidy
    # you may remove this if you don't need go generate
    - go generate ./...
builds:
  - env:
      - CGO_ENABLED=0
    goos:
      - linux
      - windows
      - darwin
archives:
  - replacements:
      darwin: Darwin
      linux: Linux
      windows: Windows
      386: i386
      amd64: x86_64
checksum:
  name_template: 'checksums.txt'
snapshot:
  name_template: "{{ incpatch .Version }}-next"
changelog:
  sort: asc
  filters:
    exclude:
      - '^docs:'
      - '^test:'

# modelines, feel free to remove those if you don't want/use them:
# yaml-language-server: $schema=https://goreleaser.com/static/schema.json
# vim: set ts=2 sw=2 tw=0 fo=cnqoj


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to GreatestWorks

Thanks for your interest in contributing! This project implements a distributed MMO game server in Go using DDD and a layered microservice architecture. To keep quality high and changes consistent, please follow the guidelines below.

If you only read one extra document, read this one from the repo:
- .github/instructions/gw.instructions.md (authoritative engineering conventions, architecture, and dos/don'ts)

## Prerequisites
- Go 1.24+
- MongoDB 4.4+ (5.0+ recommended)
- Redis 6.0+ (7.0+ recommended)
- Optional: Docker 20.10+, Docker Compose

## Project Architecture (Quick Recap)
- DDD + layered architecture (domain, application, infrastructure, interfaces)
- Services: auth-service (HTTP:8080), gateway-service (TCP:9090), game-service (Go RPC:8081)
- Storage: MongoDB (primary), Redis (cache)
- Protocols: HTTP (auth), TCP (gateway), Go RPC (gateway↔game)
- Protobuf definitions in /proto; prefer using scripts/generate_proto.(bat|sh)

See more details in .github/instructions/gw.instructions.md.

## Getting Started
- Fork and clone the repo
- Create a branch from main: feature/<short-name> or fix/<short-name>
- Run:
  - go fmt ./...
  - go mod tidy (after dependency changes)
  - go test ./...

## Development Standards
- Follow Go naming conventions; keep package names short and lower-case.
- Use internal/infrastructure/logging for all logs (no fmt.Println).
- Always pass context.Context across boundaries; honor cancellation/timeouts.
- Keep domain entities’ fields private; expose behavior via methods.
- Application layer orchestrates use cases; do not access DB/Redis directly here.
- Infrastructure layer implements persistence/cache/messaging/network.
- Interface adapters (HTTP/TCP/RPC) map DTO/proto <-> domain models.

## Errors and Observability
- Use internal/errors for domain errors and map appropriately in interfaces.
- Wrap errors with context: fmt.Errorf("...: %w", err)
- Structured logging (json) with key fields: service, module, player_id, trace_id.
- Optional pprof per service via configs/*.yaml; expose only in trusted networks.

## Protocols & Compatibility
- When changing .proto files, preserve backward compatibility:
  - Only add fields; do not change or reuse existing tags
  - Deletions should be reserved
- Update gateway and game handling logic consistently when protocol changes
- Generate code with scripts/generate_proto.bat (Windows) or .sh (Unix)

## Configuration
- All services load from configs/*.yaml via internal/config; never hardcode ports/secrets/URIs.
- Adding new config fields requires:
  - Updating the example files under configs/*
  - Updating loading/validation and defaults
  - Documenting changes in README or service docs

## Dependencies
- Prefer stdlib and existing deps; avoid introducing heavy/CGO deps.
- If adding a new dependency:
  1) Justify the choice and alternatives; 2) Pin versions; 3) Ensure Go 1.24 compatibility.
- After changes: go mod tidy

## Testing
- Unit tests co-located with code (_test.go), table-driven where possible.
- Cover core branches; ensure `go test ./...` passes before submitting PRs.
- Integration/E2E via tools/simclient (smoke/feature/load modes). Provide minimal runnable scripts/configs for new protocols or interfaces.

## Commit Messages and PRs
- Prefer Conventional Commits:
  - feat: new feature
  - fix: bug fix
  - refactor: refactoring without behavior change
  - docs: documentation updates
  - test: testing-related changes
  - chore/build/ci: build or pipeline updates
- Keep changes small and focused; avoid unrelated refactors.
- In PR description include:
  - Motivation and design summary
  - Impact surface (protocol/config/data/perf)
  - Verification steps (unit tests and/or simclient scenarios)
  - Any config/script/docs updates included

## Running Locally
- Windows:
  - scripts/start-services.bat
- Linux/Mac:
  - ./scripts/start-services.sh
- Or run each service via `go run cmd/<service>/main.go`

## Generating Protobuf Code
- Windows: `scripts/generate_proto.bat`
- Unix: `scripts/generate_proto.sh`
- Do not manually scatter generated files; use the scripts and keep backward compatibility.

## Do / Don't Quick List
Do:
- Keep changes minimal and reversible
- Respect layering and DDD boundaries
- Log via infrastructure/logging
- Pass context and close resources via defer

Don’t:
- Break proto compatibility (tag changes or reuse)
- Hardcode ports/secrets/URIs
- Introduce heavy/CGO deps without strong justification
- Access DB/Redis from interface or application layers

## Questions
Open an issue or start a discussion if anything is unclear. Thanks for contributing!


================================================
FILE: Dockerfile
================================================
# =============================================================================
# 多阶段构建优化版 Dockerfile
# =============================================================================

# 构建阶段 - 使用官方 Go 镜像
FROM golang:1.24-alpine AS builder

# 设置构建参数
ARG BUILD_VERSION=dev
ARG BUILD_TIME
ARG GIT_COMMIT
# 选择要构建的服务包,默认构建 game-service,可传入 ./cmd/auth-service 或 ./cmd/gateway-service
ARG SERVICE_PACKAGE=./cmd/game-service

# 安装构建依赖
RUN apk add --no-cache \
    git \
    ca-certificates \
    tzdata \
    upx

# 设置工作目录
WORKDIR /build

# 优化 Go 模块缓存
COPY go.mod go.sum ./
RUN go mod download && go mod verify

# 复制源代码
COPY . .

# 构建优化的二进制文件
RUN CGO_ENABLED=0 \
    GOOS=linux \
    GOARCH=amd64 \
    go build \
    -a \
    -installsuffix cgo \
    -ldflags="-s -w -X main.version=${BUILD_VERSION} -X main.buildTime=${BUILD_TIME} -X main.gitCommit=${GIT_COMMIT}" \
    -o server \
    ${SERVICE_PACKAGE}

# 使用 UPX 压缩二进制文件(可选)
RUN upx --best --lzma server

# =============================================================================
# 运行阶段 - 使用 scratch 最小化镜像
# =============================================================================
FROM scratch AS runtime

# 从构建阶段复制必要文件
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
COPY --from=builder /usr/share/zoneinfo /usr/share/zoneinfo
COPY --from=builder /build/server /server

# 复制配置文件(如果存在)
COPY --from=builder /build/configs/ /configs/

# 设置环境变量
ENV TZ=Asia/Shanghai
ENV GIN_MODE=release
ENV LOG_LEVEL=info

# 暴露端口
EXPOSE 8080 8081 9090

# 添加健康检查用户
USER 65534:65534

# 运行应用
ENTRYPOINT ["/server"]

# =============================================================================
# 开发阶段 - 包含调试工具
# =============================================================================
FROM alpine:latest AS development

# 安装开发工具
RUN apk add --no-cache \
    ca-certificates \
    tzdata \
    curl \
    wget \
    netcat-openbsd \
    htop \
    strace

# 创建非root用户
RUN addgroup -g 1000 appgroup && \
    adduser -D -s /bin/sh -u 1000 -G appgroup appuser

# 设置工作目录
WORKDIR /app

# 从构建阶段复制文件
COPY --from=builder /build/server .
COPY --from=builder /build/configs/ ./configs/

# 创建必要目录
RUN mkdir -p /var/log/mmo-server && \
    chown -R appuser:appgroup /app /var/log/mmo-server

# 切换到非root用户
USER appuser

# 设置环境变量
ENV TZ=Asia/Shanghai
ENV GIN_MODE=debug
ENV LOG_LEVEL=debug

# 暴露端口
EXPOSE 8080 8081 9090

# 健康检查
HEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=3 \
    CMD wget --no-verbose --tries=1 --spider --timeout=5 http://localhost:8080/health || exit 1

# 运行应用
CMD ["./server"]

# =============================================================================
# 默认目标为生产环境
# =============================================================================
FROM runtime AS final

================================================
FILE: Makefile
================================================
# GreatestWorks MMO 游戏服务器 Makefile

.PHONY: help build run stop clean test lint format docker-build docker-run docker-stop health-check

# 默认目标
help:
	@echo "GreatestWorks MMO 游戏服务器"
	@echo "可用命令:"
	@echo "  build          - 构建项目"
	@echo "  run            - 运行服务"
	@echo "  stop           - 停止服务"
	@echo "  clean          - 清理构建文件"
	@echo "  test           - 运行测试"
	@echo "  lint           - 代码检查"
	@echo "  format         - 格式化代码"
	@echo "  docker-build   - 构建Docker镜像"
	@echo "  docker-run     - 运行Docker服务"
	@echo "  docker-stop    - 停止Docker服务"
	@echo "  health-check   - 健康检查"

# 构建项目
build:
	@echo "构建项目..."
	go build -o bin/game-service ./cmd/game-service
	go build -o bin/auth-service ./cmd/auth-service
	go build -o bin/gateway-service ./cmd/gateway-service

# 运行服务
run: build
	@echo "启动游戏服务..."
	./bin/game-service

# 停止服务
stop:
	@echo "停止服务..."
	pkill -f game-service || true

# 清理构建文件
clean:
	@echo "清理构建文件..."
	rm -rf bin/
	rm -rf logs/
	docker system prune -f

# 运行测试
test:
	@echo "运行测试..."
	go test -v ./...

# 代码检查
lint:
	@echo "代码检查..."
	golangci-lint run

# 格式化代码
format:
	@echo "格式化代码..."
	go fmt ./...
	goimports -w .

# 构建Docker镜像
docker-build:
	@echo "构建Docker镜像..."
	docker build -t greatestworks/mmo-server:latest .

# 运行Docker服务
docker-run:
	@echo "启动Docker服务..."
	chmod +x scripts/*.sh
	docker-compose up -d

# 停止Docker服务
docker-stop:
	@echo "停止Docker服务..."
	docker-compose down

# 健康检查
health-check:
	@echo "健康检查..."
	chmod +x scripts/health-check.sh
	./scripts/health-check.sh

# 开发环境快速启动
dev: docker-run
	@echo "开发环境已启动"
	@echo "HTTP服务器: http://localhost:8080"
	@echo "健康检查: http://localhost:8080/health"
	@echo "指标监控: http://localhost:8080/metrics"

# 生产环境部署
deploy: docker-build
	@echo "部署到生产环境..."
	docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

# 查看日志
logs:
	@echo "查看服务日志..."
	docker-compose logs -f

# 进入容器
shell:
	@echo "进入游戏服务容器..."
	docker exec -it mmo-server /bin/sh

# 运行模拟客户端
simclient:
	@echo "运行模拟客户端 (integration 模式)..."
	go run ./tools/simclient/cmd/simclient -mode integration

================================================
FILE: README.en.md
================================================
# Greatest Works - Distributed MMO Game Server

A distributed, microservices-based MMO game server built with Go and Domain-Driven Design (DDD). It targets high throughput, horizontal scalability, and clean maintainability.

## Overview

Greatest Works adopts a DDD layered architecture and a multi-node deployment model. The platform splits concerns into dedicated services and uses different transports for each link to balance performance and simplicity.

### Highlights

- Production-grade build: compiles cleanly on Go 1.24+
- DDD architecture with clear boundaries and layering
- Distributed by design: horizontally scalable services
- Microservices: Auth, Gateway, Game, cleanly separated
- Structured logging and optional profiling endpoints
- Container-ready: Docker and Docker Compose

## Core Features

- DDD with clear separation of concerns
- Multi-protocol networking: HTTP + TCP + Go RPC
- Storage strategy: MongoDB (primary) + Redis (cache)
- JWT-based authentication
- Realtime state sync and event broadcasting (AOI)
- Fault-tolerant error handling and observability

## Distributed Architecture

### Services

- Auth Service
  - Protocol: HTTP
  - Port: 8080
  - Responsibilities: authentication, authorization, session

- Gateway Service
  - Protocol: TCP
  - Port: 9090
  - Responsibilities: client connections, protocol framing, routing

- Game Service
  - Protocol: Go RPC
  - Port: 8081
  - Responsibilities: core game logic, aggregates, rules

### Communication

```mermaid
flowchart LR
    subgraph Client[Client]
      C1[Game Client]
    end

    subgraph Auth[Auth Service\nHTTP:8080]
      A1[REST API]
    end

    subgraph Gateway[Gateway Service\nTCP:9090]
      G1[Conn Manager]
      G2[Router]
    end

    subgraph Game[Game Service\nGo RPC:8081]
      S1[Gameplay]
      S2[Domain]
    end

    subgraph Data[Storage & Messaging]
      M[(MongoDB)]
      R[(Redis)]
      N[(NATS)]
    end

    C1 -- HTTP --> A1
    C1 -- TCP --> G1
    G1 -- RPC --> S1
    S1 <-- RPC --> G2
    S1 --> M
    S1 --> R
    S1 -.events.-> N
    G1 --> R
```

- Client ↔ Auth: HTTP (REST) for login/registration
- Client ↔ Gateway: TCP binary protocol for game messages
- Gateway ↔ Game: Go RPC for internal calls
- Auth ↔ Game: Go RPC for user/session sync

## Simulator Client for E2E and Load Tests

Located in `tools/simclient`. Run as a standalone CLI and drive either a single end-to-end scenario or multi-user load.

### Quickstart

```powershell
go run ./tools/simclient/cmd/simclient -mode integration
```

### E2E Scenario

Built-in end-to-end flows covering login → connect → move → cast skill → logout.

```powershell
# Single E2E run
go run ./tools/simclient/cmd/simclient -mode integration -config tools/simclient/e2e.yaml

# Load (concurrent users)
go run ./tools/simclient/cmd/simclient -mode load -config tools/simclient/e2e_load.yaml

# Toggle auth quickly
go run ./tools/simclient/cmd/simclient -mode integration -config tools/simclient/e2e.yaml -auth
go run ./tools/simclient/cmd/simclient -mode integration -config tools/simclient/e2e.yaml -no-auth
```

For advanced details (framing, JSON payloads, timings, metrics), see `tools/simclient/README_E2E.md`.

#### E2E Sequence (Overview)

```mermaid
sequenceDiagram
  participant SC as SimClient
  participant AUTH as Auth Service
  participant GW as Gateway
  participant GS as Game

  Note over SC: Optional auth
  SC->>AUTH: POST /api/v1/auth/login
  AUTH-->>SC: 200 OK (token)

  SC->>GW: TCP Connect
  GW-->>SC: Conn Ack
  SC->>GW: MsgPlayerLogin(token|player)
  GW->>GS: RPC Login
  GS-->>GW: LoginOK(pos,map)
  GW-->>SC: LoginOK(pos,map)

  SC->>GW: MsgPlayerMove(x,y,z)
  GW->>GS: RPC Move
  GS-->>GW: MoveOK
  GW-->>SC: MoveOK
  GW-->>Clients: AOI broadcast

  SC->>GW: MsgBattleSkill(skill_id,target)
  GW->>GS: RPC CastSkill
  GS-->>GW: Result{damage,crit}
  GW-->>SC: SkillResult
  GW-->>Clients: AOI broadcast

  SC->>GW: MsgPlayerLogout
  GW->>GS: RPC Logout + persist position
  GS-->>GW: LogoutOK
  GW-->>SC: LogoutOK
```

## Latest Updates (2025-10)

- Character position persistence: restore on login; save on logout/disconnect
- Combat damage and critical hits (10% chance, 1.5x multiplier); result broadcast via AOI
- New E2E configs: `tools/simclient/e2e.yaml` and `e2e_load.yaml`
- Gateway now requires MongoDB to persist positions (use `docker-compose up -d` locally)

## Quick Start

### Requirements

- Go 1.24+
- MongoDB 4.4+ (5.0+ recommended)
- Redis 6.0+ (7.0+ recommended)
- Docker 20.10+ (optional)

### Install deps

```bash
go mod tidy
```

### Run services

Windows (PowerShell):

```powershell
scripts/start-services.bat
```

Linux/macOS:

```bash
./scripts/start-services.sh
```

Manual run:

```bash
go run cmd/auth-service/main.go
go run cmd/game-service/main.go
go run cmd/gateway-service/main.go
```

> Note: The Gateway service requires a reachable MongoDB instance for position persistence. Consider `docker-compose up -d` to bootstrap dependencies locally.

### Service Endpoints

- Auth: http://localhost:8080
- Gateway: tcp://localhost:9090
- Game: rpc://localhost:8081 (internal only)

## Architecture Diagrams

### DDD Layers

```mermaid
flowchart TB
    subgraph Interface[Interface Layer]
      HTTP[HTTP\nREST]
      TCP[TCP\nGame Protocol]
      RPC[RPC\nInternal]
    end

    subgraph Application[Application Layer]
      CMD[Commands]
      QRY[Queries]
      APP[Services / Orchestration]
    end

    subgraph Domain[Domain Layer]
      AGG[Aggregates / Entities / VOs]
      DSVC[Domain Services]
      DEVT[Domain Events]
    end

    subgraph Infra[Infrastructure Layer]
      PERS[Persistence]
      MSG[Messaging]
      NET[Network]
      CFG[Config]
      LOG[Logging]
    end

    Interface --> Application --> Domain
    Domain --> Infra
```

## Profiling (pprof)

Enable via `monitoring.profiling` in config. Default ports: Game 6060, Auth 6061, Gateway 6062. Use `go tool pprof` against `http://<host>:<port>/debug/pprof/`.

## Deployment

### 🐳 Docker Deployment

```bash
# Start complete environment (includes MongoDB, Redis)
docker-compose up -d

# Check service status
docker-compose ps

# View logs
docker-compose logs -f
```

### ☸️ Kubernetes Deployment

The project provides complete local Kubernetes deployment configurations supporting both Docker Desktop and Minikube. All k8s manifests are in the `k8s/local/` directory.

#### 📋 Prerequisites

- **Kubernetes**: Docker Desktop built-in k8s or Minikube 1.28+
- **kubectl**: Version matching your cluster
- **Docker**: 20.10+ (for building images)
- **PowerShell**: 5.1+ (Windows) or Bash (Linux/macOS)

#### 🚀 Quick Deploy (3 Steps)

**Step 1: Build Service Images**

```powershell
# Windows PowerShell
./scripts/build-images.ps1 -Tag dev

# Linux / macOS
./scripts/build-images.sh -t dev
```

Build artifacts:
- `greatestworks-auth:dev` (Auth service)
- `greatestworks-game:dev` (Game service)
- `greatestworks-gateway:dev` (Gateway service)

**Step 2: Load Images into Kubernetes Nodes**

> This step resolves the issue where Docker Desktop k8s cannot directly use local images.

```powershell
# Windows PowerShell
./scripts/load-images-to-k8s.ps1 -Tag dev

# Minikube users alternative
minikube image load greatestworks-auth:dev
minikube image load greatestworks-game:dev
minikube image load greatestworks-gateway:dev
minikube image load mongo:7
minikube image load redis:7
```

**Step 3: Deploy to Cluster**

```powershell
# Create namespace and deploy all services
kubectl apply -f k8s/local/namespace.yaml
kubectl apply -f k8s/local/mongodb.yaml
kubectl apply -f k8s/local/redis.yaml
kubectl apply -f k8s/local/configmap-gateway.yaml
kubectl apply -f k8s/local/auth-service.yaml
kubectl apply -f k8s/local/game-service.yaml
kubectl apply -f k8s/local/gateway-service.yaml

# Wait for Pods to be ready (about 1-2 minutes)
kubectl -n gaming get pods -w
```

Expected output (all Pods `Running` with `READY` as `1/1`):

```
NAME                               READY   STATUS    RESTARTS   AGE
auth-service-xxxxxxxxx-xxxxx       1/1     Running   0          2m
game-service-xxxxxxxxx-xxxxx       1/1     Running   0          2m
gateway-service-xxxxxxxxx-xxxxx    1/1     Running   0          2m
mongodb-xxxxxxxxx-xxxxx            1/1     Running   0          2m
redis-xxxxxxxxx-xxxxx              1/1     Running   0          2m
```

#### 🌐 Accessing Services

After successful deployment, services are exposed via NodePort locally:

| Service | Protocol | Port | Access URL | Purpose |
|---------|----------|------|------------|---------|
| **Auth Service** | HTTP | 30080 | `http://localhost:30080` | User login, registration, JWT auth |
| **Gateway Service** | TCP | 30909 | `localhost:30909` | Game client persistent connection |
| **Game Service** | RPC | 8081 | Internal only | Game logic (not exposed) |
| **MongoDB** | TCP | 27017 | Internal only | Data persistence |
| **Redis** | TCP | 6379 | Internal only | Cache & sessions |

**Verify Service Availability:**

```powershell
# View service endpoints
kubectl -n gaming get svc

# View Pod logs
kubectl -n gaming logs -l app=auth-service --tail=50
kubectl -n gaming logs -l app=gateway-service --tail=50
kubectl -n gaming logs -l app=game-service --tail=50

# Test auth service health (if /health endpoint is implemented)
curl http://localhost:30080/health
```

#### 🔧 Common Operations

**Check Cluster Status:**

```powershell
# View all resources
kubectl -n gaming get all

# View Pod details
kubectl -n gaming describe pod <pod-name>

# Enter container for debugging
kubectl -n gaming exec -it <pod-name> -- sh
```

**Restart Services (after config changes):**

```powershell
# Restart single service
kubectl -n gaming rollout restart deploy/auth-service

# Restart all services
kubectl -n gaming rollout restart deploy --all

# Wait for rollout completion
kubectl -n gaming rollout status deploy/auth-service
```

**Update Images (after code changes):**

```powershell
# 1. Rebuild images
./scripts/build-images.ps1 -Tag dev

# 2. Reload into k8s nodes
./scripts/load-images-to-k8s.ps1 -Tag dev

# 3. Force restart Pods (trigger image reload)
kubectl -n gaming rollout restart deploy --all
```

**Clean Up Environment:**

```powershell
# Delete all resources (keep namespace)
kubectl delete -f k8s/local/gateway-service.yaml
kubectl delete -f k8s/local/game-service.yaml
kubectl delete -f k8s/local/auth-service.yaml
kubectl delete -f k8s/local/configmap-gateway.yaml
kubectl delete -f k8s/local/redis.yaml
kubectl delete -f k8s/local/mongodb.yaml

# Delete namespace (cascading delete all resources)
kubectl delete namespace gaming
```

#### 📦 Push Images to Remote Registry (Optional)

If you need to deploy on multiple machines or in CI/CD environments, push images to Docker Hub or a private registry:

**Method 1: Use Publish Script**

```powershell
# Login to Docker Hub
docker login

# Push images to your repository
./scripts/publish-images.ps1 `
  -Registry docker.io `
  -Namespace YOUR_DOCKERHUB_USERNAME `
  -Tag dev `
  -IncludeInfra  # Optional: also push mongo and redis
```

**Method 2: Use Kustomize Overlay**

The project provides `k8s/local/overlays/registry/` config to automatically replace image paths during deployment:

```powershell
# 1. Edit k8s/local/overlays/registry/kustomization.yaml
#    Replace REPLACE_ME with your registry namespace, e.g.: docker.io/phuhao00

# 2. Deploy with kustomize
kubectl apply -k k8s/local/overlays/registry

# 3. Verify deployment
kubectl -n gaming get pods
```

#### 🐛 Troubleshooting

**Issue 1: Pod Status `ImagePullBackOff` or `ErrImagePull`**

**Cause**: Kubernetes cannot pull images from local Docker.

**Solution**:
- Ensure `./scripts/load-images-to-k8s.ps1` has been executed
- Check Pod's `imagePullPolicy` is `IfNotPresent`
- Verify image is loaded: `kubectl -n gaming describe pod <pod-name> | Select-String -Pattern "Image"`

**Issue 2: Pod Status `CrashLoopBackOff`**

**Cause**: Service fails to start, usually due to config errors or dependencies not ready.

**Solution**:
```powershell
# View crash logs
kubectl -n gaming logs <pod-name> --previous

# Common causes:
# - MongoDB/Redis not ready → Wait for infrastructure Pods to start first
# - Environment variable misconfiguration → Check Deployment env config
# - Port conflict → Check containerPort and Service port mapping
```

**Issue 3: Cannot Access Service via NodePort**

**Cause**: NodePort not properly mapped or firewall blocking.

**Solution**:
```powershell
# Verify Service config
kubectl -n gaming get svc

# Confirm NodePort range (default 30000-32767)
# Check Windows Firewall or Docker Desktop network settings

# Temporary workaround: use port forwarding
kubectl -n gaming port-forward svc/auth-service 8080:8080
kubectl -n gaming port-forward svc/gateway-service 9090:9090
```

**Issue 4: MongoDB/Redis Connection Failed**

**Cause**: Service startup order issue or DNS resolution failure.

**Solution**:
```powershell
# Check if infrastructure services are running
kubectl -n gaming get pods -l app=mongodb
kubectl -n gaming get pods -l app=redis

# Verify service DNS resolution (test in Pod)
kubectl -n gaming exec -it <auth-pod> -- nslookup mongodb
kubectl -n gaming exec -it <auth-pod> -- nslookup redis

# Check service endpoints
kubectl -n gaming get endpoints
```

#### 📊 Monitoring & Logging

**Real-time Log Viewing:**

```powershell
# Follow single service
kubectl -n gaming logs -f deploy/auth-service

# View all service logs (multiple windows)
kubectl -n gaming logs -f -l app=auth-service
kubectl -n gaming logs -f -l app=game-service
kubectl -n gaming logs -f -l app=gateway-service

# View Pod events
kubectl -n gaming get events --sort-by='.lastTimestamp'
```

**Resource Usage:**

```powershell
# View Pod resource consumption
kubectl -n gaming top pods

# View node resources
kubectl top nodes
```

#### 🔐 Production Environment Enhancements

Local deployment uses simplified configs. For production, consider:

**Security:**
- Use Kubernetes Secrets for sensitive data (DB passwords, JWT keys)
- Enable NetworkPolicy to restrict Pod-to-Pod communication
- Configure RBAC access control
- Use TLS for inter-service communication

**High Availability:**
- Increase replicas (`replicas: 3`)
- Configure PodDisruptionBudget
- Use StatefulSet for stateful services (MongoDB)
- Enable HorizontalPodAutoscaler for auto-scaling

**Persistence:**
- Configure PersistentVolumeClaim for MongoDB (avoid emptyDir)
- Regular database backups
- Configure data retention policies

**Example: Production-grade MongoDB Deployment**

```yaml
# Use StatefulSet + PVC (recommended for production)
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mongodb
  namespace: gaming
spec:
  serviceName: mongodb
  replicas: 3
  selector:
    matchLabels:
      app: mongodb
  template:
    spec:
      containers:
      - name: mongodb
        image: mongo:7
        volumeMounts:
        - name: mongo-data
          mountPath: /data/db
  volumeClaimTemplates:
  - metadata:
      name: mongo-data
    spec:
      accessModes: ["ReadWriteOnce"]
      resources:
        requests:
          storage: 10Gi
```

#### 🎯 Performance Tuning Tips

**Resource Quota Adjustment:**

Modify resource limits in `k8s/local/*-service.yaml` based on actual load:

```yaml
resources:
  requests:
    cpu: "500m"      # Guaranteed allocation
    memory: "512Mi"
  limits:
    cpu: "2"         # Maximum usage
    memory: "2Gi"
```

**Concurrent Connection Optimization:**

Adjust gateway config in `k8s/local/configmap-gateway.yaml`:

```yaml
server:
  tcp:
    max_connections: 50000  # Adjust based on node capacity
    buffer_size: 8192       # Increase buffer size
```

**Database Connection Pool:**

Optimize connection pool parameters in service configs:

```yaml
database:
  mongodb:
    max_pool_size: 200
    min_pool_size: 50
  redis:
    pool_size: 200
    min_idle_conns: 50
```

#### 📚 Related Documentation

- [Kubernetes Manifest Documentation](k8s/local/README.md) (to be created)
- [Docker Image Build Script](scripts/build-images.ps1)
- [Image Load Script](scripts/load-images-to-k8s.ps1)
- [Kustomize Overlay](k8s/local/overlays/registry/)

---

## Docs & Contributing

- Issues: https://github.com/phuhao00/greatestworks/issues
- Discussions: https://github.com/phuhao00/greatestworks/discussions
- See CONTRIBUTING.md for guidelines

## License

MIT. See LICENSE for details.

---

If this project helps you, please consider starring the repo. Thanks!


================================================
FILE: README.md
================================================
# Greatest Works - 分布式MMO游戏服务器

> English version: see [README.en.md](README.en.md)

基于Go语言和领域驱动设计(DDD)架构开发的分布式大型多人在线游戏服务器,采用现代化微服务设计,支持高并发和分布式部署。

## 🎯 项目概述

这是一个企业级的分布式MMO游戏服务器项目,采用领域驱动设计(Domain-Driven Design)架构模式,提供高性能、可扩展、易维护的游戏服务器解决方案。项目采用分布式多节点架构,支持独立部署和扩展。

### 🏆 项目亮点

- **✅ 编译通过**: 所有代码已修复编译错误,项目可正常构建
- **🏗️ DDD架构**: 完整的领域驱动设计实现
- **🌐 分布式**: 多服务独立部署,支持水平扩展
- **🔧 微服务**: 认证、网关、游戏服务分离
- **📊 监控**: 完整的日志和监控体系
- **🐳 容器化**: Docker和Kubernetes支持

## ✨ 核心特性

- 🏗️ **DDD架构**: 采用领域驱动设计,清晰的架构分层和职责分离
- 🌐 **分布式设计**: 多节点独立部署,支持水平扩展
- 🚀 **高性能网络**: 基于Go原生RPC + TCP + HTTP多协议支持
- 🔧 **微服务架构**: 认证服务、网关服务、游戏服务独立部署
- 💾 **多数据库支持**: MongoDB + Redis 混合存储策略
- 🔐 **安全认证**: JWT认证系统,保障用户数据安全
- 🎮 **完整游戏功能**: 涵盖现代MMO游戏的核心系统
- 📊 **实时同步**: 高频率的游戏状态同步和事件处理
- 🛡️ **容错设计**: 完善的错误处理、监控和恢复机制
- 🐳 **容器化部署**: Docker和Kubernetes支持
- 📚 **完整文档**: 详细的API文档和架构说明

## 🏗️ 分布式架构设计

本项目采用分布式多节点架构,将游戏服务器拆分为三个独立的服务节点:

### 服务节点

#### 🔐 认证服务 (Auth Service)
- **协议**: HTTP
- **端口**: 8080
- **职责**: 用户认证、授权、会话管理
- **功能**: 登录、注册、令牌管理、权限控制

#### 🌐 网关服务 (Gateway Service)  
- **协议**: TCP
- **端口**: 9090
- **职责**: 客户端连接管理、协议转换、负载均衡
- **功能**: 连接管理、消息路由、协议转换

#### 🎮 游戏服务 (Game Service)
- **协议**: Go原生RPC
- **端口**: 8081
- **职责**: 核心游戏逻辑、领域模型、业务规则
- **功能**: 玩家管理、战斗系统、排行榜、社交系统

### 通信协议

```mermaid
flowchart LR
    subgraph Client[客户端]
      C1[游戏客户端]
    end

    subgraph Auth[认证服务\nHTTP:8080]
      A1[REST API]
    end

    subgraph Gateway[网关服务\nTCP:9090]
      G1[连接管理]
      G2[消息路由]
    end

    subgraph Game[游戏服务\nGo RPC:8081]
      S1[玩法逻辑]
      S2[领域模型]
    end

    subgraph Data[数据与消息]
      M[(MongoDB)]
      R[(Redis)]
      N[(NATS)]
    end

    C1 -- HTTP --> A1
    C1 -- TCP --> G1
    G1 -- RPC --> S1
    S1 <-- RPC --> G2
    S1 --> M
    S1 --> R
    S1 -.事件发布.-> N
    G1 --> R
```

- **客户端 ↔ 认证服务**: HTTP (RESTful API) - 用户认证、注册、登录
- **客户端 ↔ 网关服务**: TCP (游戏协议) - 游戏数据交互
- **网关服务 ↔ 游戏服务**: Go原生RPC (内部通信) - 游戏逻辑处理
- **认证服务 ↔ 游戏服务**: Go原生RPC (服务间通信) - 用户状态同步
- **客户端不直接与游戏服务通信**: 所有游戏数据通过网关服务转发

## 🧪 集成测试与压测模拟客户端

项目提供了位于 `tools/simclient` 的模拟客户端,可用于端到端集成测试与压测实验。

### 快速体验

```powershell
go run ./tools/simclient/cmd/simclient -mode integration
```

默认会跳过认证服务并连接网关发送基础心跳与移动报文。若需启用认证或自定义参数,可指定配置文件:

```powershell
go run ./tools/simclient/cmd/simclient -mode integration -config tools/simclient/config.example.yaml
```

### E2E 场景(端到端流程)

已内置完整的 E2E 场景与示例配置,覆盖“认证→连接→登录→移动→施法→登出”的完整链路:

```powershell
# 运行单次端到端场景(集成验证)
go run ./tools/simclient/cmd/simclient -mode integration -config tools/simclient/e2e.yaml

# 运行端到端压测(并发多用户)
go run ./tools/simclient/cmd/simclient -mode load -config tools/simclient/e2e_load.yaml

# 可选:快速开关认证流程
# 强制启用认证
go run ./tools/simclient/cmd/simclient -mode integration -config tools/simclient/e2e.yaml -auth
# 强制跳过认证
go run ./tools/simclient/cmd/simclient -mode integration -config tools/simclient/e2e.yaml -no-auth
```

说明与高级用法请参阅 `tools/simclient/README_E2E.md`,包含:报文头+JSON载荷封装、动作时序、错误排查、指标输出等。

#### E2E 交互时序(概览)

```mermaid
sequenceDiagram
  participant SC as SimClient
  participant AUTH as 认证服务
  participant GW as 网关服务
  participant GS as 游戏服务

  Note over SC: 可选:认证
  SC->>AUTH: POST /api/v1/auth/login
  AUTH-->>SC: 200 OK (token)

  SC->>GW: TCP Connect
  GW-->>SC: Conn Ack
  SC->>GW: MsgPlayerLogin(token|player)
  GW->>GS: RPC Login
  GS-->>GW: LoginOK(pos,map)
  GW-->>SC: LoginOK(pos,map)

  SC->>GW: MsgPlayerMove(x,y,z)
  GW->>GS: RPC Move
  GS-->>GW: MoveOK
  GW-->>SC: MoveOK
  GW-->>Clients: AOI 广播

  SC->>GW: MsgBattleSkill(skill_id,target)
  GW->>GS: RPC CastSkill
  GS-->>GW: Result{damage,crit}
  GW-->>SC: SkillResult
  GW-->>Clients: AOI 广播

  SC->>GW: MsgPlayerLogout
  GW->>GS: RPC Logout + 持久化位置
  GS-->>GW: LogoutOK
  GW-->>SC: LogoutOK
```

### 压测模式

```powershell
go run ./tools/simclient/cmd/simclient -mode load -config tools/simclient/config.example.yaml -users 200 -concurrency 50
```

压测模式会按配置并发启动虚拟玩家,输出各动作的最小值、平均值、P95 与最大耗时,并记录失败样例。

### 集成测试

在服务运行的情况下,可以开启模拟客户端的冒烟测试:

```powershell
$Env:SIMCLIENT_E2E="1"; go test ./tools/simclient -run TestBasicScenarioSmoke -count=1
```

未设置环境变量时,测试会自动跳过,避免在未部署依赖服务时误报失败。

### 功能级场景(独立功能验证)

模拟客户端现在支持基于功能库的可配置场景,便于对单个系统(如玩家、战斗、宠物等)进行独立验证。通过在配置文件中将 `scenario.type` 设为 `feature`,即可按功能清单驱动消息序列:

```yaml
scenario:
  name: "pet-feature-check"
  type: "feature"          # 可选:basic(默认)或 feature
  features:                 # 复用内置功能库(详见 tools/simclient/feature_library.go)
    - "player.basic"
    - "pet.basic"
  actions:                  # 也可追加自定义动作
    - name: "quest.accept"
      message: "quest.accept"
      expect_response: true
      pause: "2s"
```

常用功能标识包括 `player.login`、`battle.basic`、`pet.summon`、`building.status` 等。每个功能会自动映射到对应的网关消息并记录响应时间。若仅配置 `scenario.type` 而省略 `features`,程序会尝试匹配内置功能;也可以完全使用 `actions` 字段自定义报文序列,支持设置 `flags`、`repeat`、`pause` 等参数,实现更精细的验证脚本。

## 📁 项目结构

```
greatestworks/
├── cmd/                        # 应用程序入口
│   ├── auth-service/           # 认证服务 (HTTP:8080)
│   │   └── main.go
│   ├── gateway-service/        # 网关服务 (TCP:9090)
│   │   └── main.go
│   └── game-service/           # 游戏服务 (RPC:8081)
│       └── main.go
├── configs/                    # 配置文件
│   ├── auth-service.yaml       # 认证服务配置
│   ├── gateway-service.yaml    # 网关服务配置
│   ├── game-service.yaml       # 游戏服务配置
│   ├── docker.yaml            # Docker环境配置
│   └── config.*.yaml          # 环境配置模板
├── docs/                       # 项目文档
│   └── diagrams/              # 架构图表
│       ├── module.drawio      # 模块关系图
│       ├── svr.frame.drawio   # 服务器架构图
│       └── uml.drawio         # UML类图
├── internal/                   # 内部模块 (DDD架构)
│   ├── application/           # 应用层 (CQRS + 服务编排)
│   │   ├── commands/          # 命令处理器
│   │   ├── handlers/          # 命令/查询总线实现
│   │   ├── interfaces/        # 应用层接口契约
│   │   ├── queries/           # 查询处理器
│   │   └── services/          # 应用服务与 service_registry
│   ├── domain/                # 领域层
│   │   ├── player/           # 玩家领域
│   │   │   ├── beginner/     # 新手引导
│   │   │   ├── hangup/       # 挂机系统
│   │   │   ├── honor/        # 荣誉系统
│   │   │   ├── player.go     # 玩家聚合根
│   │   │   ├── service.go    # 领域服务
│   │   │   └── repository.go # 仓储接口
│   │   ├── battle/           # 战斗领域
│   │   ├── social/           # 社交领域 (31个文件)
│   │   ├── building/         # 建筑领域
│   │   ├── pet/              # 宠物领域
│   │   ├── ranking/          # 排行榜领域
│   │   ├── minigame/         # 小游戏领域
│   │   ├── npc/              # NPC领域
│   │   ├── quest/            # 任务领域
│   │   ├── scene/            # 场景领域 (24个文件)
│   │   ├── skill/            # 技能领域
│   │   ├── inventory/        # 背包领域
│   │   │   ├── dressup/      # 装扮系统
│   │   │   └── synthesis/    # 合成系统
│   │   └── events/           # 领域事件
│   ├── infrastructure/        # 基础设施层
│   │   ├── persistence/      # 数据持久化 (10个文件)
│   │   │   ├── base_repository.go    # 基础仓储
│   │   │   ├── player_repository.go  # 玩家仓储
│   │   │   ├── battle_repository.go  # 战斗仓储
│   │   │   ├── hangup_repository.go # 挂机仓储
│   │   │   ├── weather_repository.go # 天气仓储
│   │   │   ├── plant_repository.go   # 植物仓储
│   │   │   └── npc_repository.go     # NPC仓储
│   │   ├── cache/            # 缓存服务
│   │   ├── messaging/        # 消息服务 (5个文件)
│   │   │   ├── nats_publisher.go    # NATS发布者
│   │   │   ├── nats_subscriber.go   # NATS订阅者
│   │   │   ├── event_dispatcher.go  # 事件分发器
│   │   │   └── worker_pool.go       # 工作池
│   │   ├── network/          # 网络服务
│   │   ├── config/           # 配置管理 (7个文件)
│   │   ├── logging/          # 日志服务
│   │   ├── auth/            # 认证服务
│   │   ├── container/       # 依赖注入容器
│   │   └── monitoring/      # 监控服务
│   ├── interfaces/            # 接口层
│   │   ├── http/             # HTTP接口 (13个文件)
│   │   │   ├── auth/         # 认证接口
│   │   │   ├── gm/           # GM管理接口
│   │   │   └── server.go     # HTTP服务器
│   │   ├── tcp/              # TCP接口 (14个文件)
│   │   │   ├── handlers/     # TCP处理器
│   │   │   ├── connection/   # 连接管理
│   │   │   └── protocol/     # 协议定义
│   │   └── rpc/              # RPC接口 (4个文件)
│   ├── events/               # 事件系统
│   │   ├── eventbus.go       # 事件总线
│   │   ├── middleware.go      # 事件中间件
│   │   └── worker.go         # 事件工作器
│   ├── errors/               # 错误处理
│   │   └── domain_errors.go # 领域错误
│   ├── proto/                # 协议定义
│   │   ├── battle/           # 战斗协议
│   │   ├── player/           # 玩家协议
│   │   └── common/           # 通用协议
│   └── readme.md             # 内部模块说明
├── proto/                     # Protocol Buffers定义
│   ├── battle.proto          # 战斗协议
│   ├── player.proto          # 玩家协议
│   ├── pet.proto             # 宠物协议
│   └── common.proto          # 通用协议
├── scripts/                   # 开发脚本
│   ├── start-services.bat    # Windows启动脚本
│   ├── start-services.sh     # Linux/Mac启动脚本
│   ├── build.sh              # 构建脚本
│   ├── deploy.sh             # 部署脚本
│   ├── generate_proto.sh     # 协议生成脚本
│   └── setup-dev.sh          # 开发环境设置
├── docker-compose.yml         # Docker编排
├── Dockerfile                 # Docker镜像
├── Makefile                   # 构建工具
├── go.mod                     # Go模块定义
├── go.work                    # Go工作空间
└── README.md                  # 项目说明
```

## 🛠️ 技术栈

### 核心技术
- **语言**: Go 1.24+
- **架构模式**: 领域驱动设计 (DDD) + 分布式架构
- **网络协议**: HTTP + TCP + Go原生RPC
- **数据库**: MongoDB (主数据库) + Redis (缓存)
- **消息队列**: NATS (可选)
- **认证**: JWT + 自定义认证
- **服务发现**: 支持Consul、Etcd等

### 开发工具
- **构建工具**: Make + Go Modules
- **容器化**: Docker + Docker Compose
- **编排**: Kubernetes
- **代码质量**: golangci-lint + 自定义规范
- **文档**: Markdown + 架构图

### 监控与运维
- **日志**: 结构化日志 + 分级输出
- **监控**: 自定义指标收集(Prometheus 已移除,保留配置项仅为兼容)
- **性能剖析**: 内置 `pprof` HTTP 端点,可按服务独立开启/关闭
- **健康检查**: HTTP健康检查接口
- **配置管理**: YAML配置 + 环境变量

#### 🔍 性能剖析 (pprof)
- 通过 `monitoring.profiling` 配置块启用,默认 `host=0.0.0.0`,启用时若未指定端口则为 `6060`。
- 示例配置:

  ```yaml
  monitoring:
    profiling:
      enabled: true
      host: "0.0.0.0"
      port: 6061
  ```

- 默认示例端口:游戏服务 `6060`、认证服务 `6061`、网关服务 `6062`(可按需调整)。
- 访问方式:`http://<host>:<port>/debug/pprof/`(支持 `profile`, `heap`, `goroutine` 等子路径)。
- 安全建议:仅在受信任网络内开放或通过防火墙/反向代理限制访问;生产环境建议结合 mTLS 或内网隧道。
- Go 原生工具链支持直接采样,例如:

  ```bash
  go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30
  ```

- 常用子路径一览:

  | 路径 | 数据类型 | 典型用途 |
  | --- | --- | --- |
  | `/debug/pprof/profile` | CPU 采样 (默认 30s) | 分析热点函数、CPU 使用率 |
  | `/debug/pprof/heap` | 堆内存快照 | 排查内存占用与泄漏 |
  | `/debug/pprof/goroutine` | Goroutine 堆栈 | 定位死锁、阻塞、协程泄漏 |
  | `/debug/pprof/block` | 阻塞 / 互斥等待 | 查看锁竞争、IO 阻塞(含网络等待) |
  | `/debug/pprof/mutex` | 互斥锁争用 | 识别锁热点 |
  | `/debug/pprof/threadcreate` | 线程创建 | 观察系统线程增量 |
  | `/debug/pprof/trace` | 全局执行轨迹 | 捕获调度、GC、网络事件,生成 `.trace` 文件 |

- 采集跟踪 (含网络事件) 示例:

  ```bash
  go tool trace -http=:0 http://localhost:6060/debug/pprof/trace?seconds=5
  ```

  打开浏览器后可查看网络/系统调用阻塞、协程调度等细节。

#### 🧪 Profiling 快速入门

1. **启用配置**:在目标服务的配置文件中确保 `monitoring.profiling.enabled: true`,并确认端口未被占用。
2. **启动服务**:通过 `make run-<service>`、`docker-compose up` 或自定义脚本启动对应进程。
3. **采集快照**:使用以下命令保存原始数据以便离线分析:

  ```bash
  # CPU 采样 60 秒后保存为 cpu.prof
  curl -o cpu.prof "http://localhost:6060/debug/pprof/profile?seconds=60"

  # 堆内存快照
  curl -o heap.prof "http://localhost:6060/debug/pprof/heap"

  # Goroutine 栈信息
  curl -o goroutine.txt "http://localhost:6060/debug/pprof/goroutine?debug=1"
  ```

4. **可视化分析**:

  ```bash
  # CLI 分析热点函数
  go tool pprof cpu.prof

  # 启动 Web UI(会自动打开浏览器)
  go tool pprof -http=:0 heap.prof
  ```

5. **高级跟踪**:通过 `go tool trace` 加载第 3 步生成的 `.trace` 文件,可在浏览器中查看网络/系统调用、协程调度和 GC 时间线。

> 端口速查:游戏服务 `6060`、认证服务 `6061`、网关服务 `6062`,可根据部署环境在配置文件中调整。


## 🎉 最新更新 (2025-10)

### ✅ 核心改进

- **应用层内聚**: 将原 `application/*` 目录整体迁移至 `internal/application`,统一导入路径并引入集中式 `service_registry`。
- **接口适配**: 同步更新 HTTP/TCP/RPC 适配层的依赖路径,保持命令与查询总线的运行一致性。
- **构建可靠性**: 全量执行 `go fmt ./...` 与 `go test ./...`,确保代码风格统一且测试通过。

### ✨ 新增功能

- 角色位置持久化:登录自动恢复上次地图与坐标,登出/断线即时保存。
- 战斗伤害计算与结果广播:实现基础伤害与暴击(10% 概率,1.5x 倍率),通过 AOI 将结果广播给可见实体。
- 模拟客户端 E2E 场景:新增 `tools/simclient/e2e.yaml` 与 `tools/simclient/e2e_load.yaml`,支持端到端验证与并发压测。
- 依赖提醒:网关服务现需连接 MongoDB 才能完成位置持久化(本地可通过 `docker-compose up -d` 一键拉起依赖)。

### 🧹 技术债务清理

- 归档旧有的应用层入口说明,将文档与现有目录结构保持一致。
- 补充最新的启动脚本说明,方便在 Windows / Linux 环境快速拉起服务。
- 梳理文档链接与示例配置,移除失效路径。

## 🚀 快速开始

### 📋 环境要求

- **Go**: 1.24 或更高版本
- **MongoDB**: 4.4+ (推荐 5.0+)
- **Redis**: 6.0+ (推荐 7.0+)
- **Docker**: 20.10+ (可选,用于容器化部署)

### 📦 安装依赖

```bash
# 克隆项目
git clone https://github.com/phuhao00/greatestworks.git
cd greatestworks

# 安装Go依赖
go mod tidy
```

### ⚙️ 配置文件

项目使用独立的配置文件,每个服务都有自己的配置:

**Windows (PowerShell):**
```powershell
Copy-Item configs/auth-service.yaml configs/auth-service-dev.yaml
Copy-Item configs/gateway-service.yaml configs/gateway-service-dev.yaml
Copy-Item configs/game-service.yaml configs/game-service-dev.yaml
```

**Linux / macOS:**
```bash
cp configs/auth-service.yaml configs/auth-service-dev.yaml
cp configs/gateway-service.yaml configs/gateway-service-dev.yaml
cp configs/game-service.yaml configs/game-service-dev.yaml
```

### 🎮 启动服务

#### 方式一:使用启动脚本(推荐)

**Windows:**
```powershell
scripts/start-services.bat
```

**Linux/Mac:**
```bash
./scripts/start-services.sh
```

#### 方式二:手动启动

```bash
# 启动认证服务
go run cmd/auth-service/main.go

# 启动游戏服务(新终端)
go run cmd/game-service/main.go

# 启动网关服务(新终端)
go run cmd/gateway-service/main.go
```

> 提示:网关服务需要可用的 MongoDB 实例用于玩家位置持久化。若未手动部署数据库,建议先执行 `docker-compose up -d` 启动依赖环境。

#### 方式三:Docker启动

```bash
# 启动完整环境
docker-compose up -d

# 查看服务状态
docker-compose ps
```

### 🔧 服务地址

启动后,各服务将在以下地址运行:

- **认证服务**: http://localhost:8080 (客户端可访问)
- **网关服务**: tcp://localhost:9090 (客户端可访问)
- **游戏服务**: rpc://localhost:8081 (仅内部服务访问,客户端不可直接访问)

### 📡 客户端访问说明

- **客户端 → 认证服务**: 直接HTTP访问,用于用户认证
- **客户端 → 网关服务**: 直接TCP连接,用于游戏数据交互
- **客户端 → 游戏服务**: ❌ 不直接访问,所有游戏逻辑通过网关服务转发

## 🏛️ 技术架构图

### 🎯 整体架构
```mermaid
flowchart TB
    C[客户端] -->|HTTP| AUTH[认证服务\nHTTP:8080]
    C -->|TCP| GW[网关服务\nTCP:9090]
    GW -->|Go RPC| GAME[游戏服务\nRPC:8081]

    GAME --> M[(MongoDB)]
    GAME --> R[(Redis)]
    GAME -.事件.-> N[(NATS)]
```

### 🏗️ DDD分层架构
```mermaid
flowchart TB
    subgraph Interface[接口层]
      HTTP[HTTP\nREST]
      TCP[TCP\nGame Protocol]
      RPC[RPC\nInternal]
    end

    subgraph Application[应用层]
      CMD[命令处理器]
      QRY[查询处理器]
      APP[应用服务/编排]
    end

    subgraph Domain[领域层]
      AGG[聚合根/实体/值对象]
      DSVC[领域服务]
      DEVT[领域事件]
    end

    subgraph Infra[基础设施层]
      PERS[持久化]
      MSG[消息]
      NET[网络]
      CFG[配置]
      LOG[日志]
    end

    Interface --> Application --> Domain
    Domain --> Infra
```

## 🏛️ DDD领域架构

### 核心领域 (Core Domains)

#### 🎮 玩家领域 (Player Domain)
- **职责**: 玩家基础信息、等级经验、属性管理
- **核心实体**: Player, PlayerStats, PlayerProfile
- **主要功能**: 玩家创建、升级、属性计算、状态管理

#### ⚔️ 战斗领域 (Battle Domain)
- **职责**: 战斗逻辑、技能系统、伤害计算
- **核心实体**: Battle, Skill, Damage, BattleResult
- **主要功能**: PvP/PvE战斗、技能释放、战斗结算

#### 🏠 社交领域 (Social Domain)
- **职责**: 聊天、好友、家族、队伍系统
- **核心实体**: Chat, Friend, Guild, Team, Mail
- **主要功能**: 社交互动、组队协作、消息通信

#### 🏗️ 建筑领域 (Building Domain)
- **职责**: 建筑系统、家园管理、建筑升级
- **核心实体**: Building, BuildingTemplate, BuildingUpgrade
- **主要功能**: 建筑建造、升级、功能管理

#### 🐾 宠物领域 (Pet Domain)
- **职责**: 宠物系统、宠物培养、宠物战斗
- **核心实体**: Pet, PetTemplate, PetSkill
- **主要功能**: 宠物获取、培养、进化、战斗辅助

#### 🏆 排行榜领域 (Ranking Domain)
- **职责**: 各类排行榜、积分统计、奖励发放
- **核心实体**: Ranking, RankingEntry, RankingReward
- **主要功能**: 排名计算、榜单更新、奖励分发

#### 🎯 小游戏领域 (Minigame Domain)
- **职责**: 各种小游戏、活动玩法、特殊奖励
- **核心实体**: Minigame, MinigameSession, MinigameReward
- **主要功能**: 小游戏逻辑、积分计算、奖励发放

## 🌐 网络协议设计

### 多协议支持
- **HTTP**: 认证服务,RESTful API
- **TCP**: 网关服务,游戏客户端连接
- **RPC**: 服务间通信,Go原生RPC

### TCP协议格式
```
+--------+--------+--------+----------+
| Magic  | Length | Type   | Data     |
| 2bytes | 4bytes | 2bytes | Variable |
+--------+--------+--------+----------+
```

### 消息分类
- **0x1xxx**: 系统消息 (登录、心跳、错误)
- **0x2xxx**: 玩家消息 (属性、状态、升级)
- **0x3xxx**: 社交消息 (聊天、好友、邮件)
- **0x4xxx**: 战斗消息 (技能、伤害、结果)
- **0x5xxx**: 建筑消息 (建造、升级、管理)
- **0x6xxx**: 宠物消息 (获取、培养、战斗)
- **0x7xxx**: 排行榜消息 (查询、更新、奖励)
- **0x8xxx**: 小游戏消息 (开始、操作、结算)
- **0x9xxx**: 管理消息 (GM命令、系统公告)

## 🗄️ 数据存储设计

### MongoDB 集合设计

#### 核心业务集合
- **players**: 玩家基础信息和状态
- **player_stats**: 玩家统计数据和属性
- **battles**: 战斗记录和结果
- **guilds**: 公会信息和成员关系
- **buildings**: 建筑数据和状态
- **pets**: 宠物信息和属性
- **rankings**: 排行榜数据和历史
- **minigames**: 小游戏记录和积分

### Redis 缓存策略

#### 热点数据缓存
- **在线玩家**: `online:players:{server_id}`
- **玩家会话**: `session:{player_id}`
- **排行榜**: `ranking:{type}:{period}`
- **公会信息**: `guild:{guild_id}`

#### 临时数据缓存
- **战斗状态**: `battle:{battle_id}`
- **队伍信息**: `team:{team_id}`
- **聊天频道**: `chat:{channel_id}`
- **活动状态**: `event:{event_id}`

## 👨‍💻 开发指南

### 🏗️ DDD开发模式

#### 添加新领域
1. 在 `internal/domain/` 下创建领域目录
2. 定义领域实体、值对象和聚合根
3. 实现领域服务和仓储接口
4. 创建对应的应用服务
5. 实现基础设施层的具体实现
6. 添加接口层的处理器

#### 领域开发规范
```go
// 领域实体示例
type Player struct {
    id       PlayerID
    name     string
    level    int
    exp      int64
    stats    PlayerStats
    // 领域行为
}

func (p *Player) LevelUp() error {
    // 领域逻辑实现
}
```

### 🔧 开发工具使用

#### Make命令
```bash
make setup      # 初始化开发环境
make dev        # 启动开发服务器
make build      # 构建生产版本
make test       # 运行测试
make lint       # 代码质量检查
make clean      # 清理构建产物
make docs       # 生成文档
```

### 📊 性能优化策略

#### 数据库优化
- **连接池管理**: 合理配置MongoDB和Redis连接池
- **索引优化**: 为查询频繁的字段创建合适索引
- **分片策略**: 大数据量集合采用分片存储
- **读写分离**: 读操作使用从库,写操作使用主库

#### 缓存策略
- **多级缓存**: 内存缓存 + Redis缓存 + 数据库
- **缓存预热**: 服务启动时预加载热点数据
- **缓存更新**: 采用Cache-Aside模式更新缓存
- **缓存穿透**: 使用布隆过滤器防止缓存穿透

#### 网络优化
- **连接复用**: TCP连接池和HTTP Keep-Alive
- **消息批处理**: 批量处理非实时消息
- **压缩传输**: 大数据包启用压缩
- **协议优化**: 使用二进制协议减少传输开销

## 🚀 部署指南

### 🐳 Docker部署

#### Docker Compose部署
```bash
# 启动完整环境(包含MongoDB、Redis)
docker-compose up -d

# 查看服务状态
docker-compose ps

# 查看日志
docker-compose logs -f
```

#### 单容器部署
```bash
# 构建镜像
docker build -t greatestworks .

# 运行认证服务
docker run -d --name auth-service -p 8080:8080 greatestworks auth-service

# 运行游戏服务
docker run -d --name game-service -p 8081:8081 greatestworks game-service

# 运行网关服务
docker run -d --name gateway-service -p 9090:9090 greatestworks gateway-service
```

### ☸️ Kubernetes部署

项目提供了完整的 Kubernetes 本地部署方案,支持 Docker Desktop 和 Minikube。所有 k8s 配置文件位于 `k8s/local/` 目录。

#### 📋 前置要求

- **Kubernetes**: Docker Desktop 内置 k8s 或 Minikube 1.28+
- **kubectl**: 与集群版本匹配
- **Docker**: 20.10+ (用于构建镜像)
- **PowerShell**: 5.1+ (Windows) 或 Bash (Linux/macOS)

#### 🚀 快速部署(三步启动)

**步骤 1: 构建服务镜像**

```powershell
# Windows PowerShell
./scripts/build-images.ps1 -Tag dev

# Linux / macOS
./scripts/build-images.sh -t dev
```

构建产物:
- `greatestworks-auth:dev` (认证服务)
- `greatestworks-game:dev` (游戏服务)
- `greatestworks-gateway:dev` (网关服务)

**步骤 2: 加载镜像到 Kubernetes 节点**

> 此步骤解决 Docker Desktop k8s 无法直接使用本地镜像的问题。

```powershell
# Windows PowerShell
./scripts/load-images-to-k8s.ps1 -Tag dev

# Minikube 用户替代方案
minikube image load greatestworks-auth:dev
minikube image load greatestworks-game:dev
minikube image load greatestworks-gateway:dev
minikube image load mongo:7
minikube image load redis:7
```

**步骤 3: 部署到集群**

```powershell
# 创建命名空间和部署所有服务
kubectl apply -f k8s/local/namespace.yaml
kubectl apply -f k8s/local/mongodb.yaml
kubectl apply -f k8s/local/redis.yaml
kubectl apply -f k8s/local/configmap-gateway.yaml
kubectl apply -f k8s/local/auth-service.yaml
kubectl apply -f k8s/local/game-service.yaml
kubectl apply -f k8s/local/gateway-service.yaml

# 等待 Pod 就绪(约 1-2 分钟)
kubectl -n gaming get pods -w
```

预期输出(所有 Pod 状态为 `Running` 且 `READY` 为 `1/1`):

```
NAME                               READY   STATUS    RESTARTS   AGE
auth-service-xxxxxxxxx-xxxxx       1/1     Running   0          2m
game-service-xxxxxxxxx-xxxxx       1/1     Running   0          2m
gateway-service-xxxxxxxxx-xxxxx    1/1     Running   0          2m
mongodb-xxxxxxxxx-xxxxx            1/1     Running   0          2m
redis-xxxxxxxxx-xxxxx              1/1     Running   0          2m
```

#### 🌐 访问服务

部署成功后,服务通过 NodePort 暴露在本地:

| 服务 | 协议 | 端口 | 访问地址 | 用途 |
|-----|------|------|---------|------|
| **认证服务** | HTTP | 30080 | `http://localhost:30080` | 用户登录、注册、JWT 验证 |
| **网关服务** | TCP | 30909 | `localhost:30909` | 游戏客户端长连接入口 |
| **游戏服务** | RPC | 8081 | 仅集群内部 | 游戏逻辑处理(不对外暴露) |
| **MongoDB** | TCP | 27017 | 仅集群内部 | 数据持久化 |
| **Redis** | TCP | 6379 | 仅集群内部 | 缓存与会话 |

**验证服务可用性:**

```powershell
# 查看服务端点
kubectl -n gaming get svc

# 查看 Pod 日志
kubectl -n gaming logs -l app=auth-service --tail=50
kubectl -n gaming logs -l app=gateway-service --tail=50
kubectl -n gaming logs -l app=game-service --tail=50

# 测试认证服务健康检查(如果实现了 /health 端点)
curl http://localhost:30080/health
```

#### 🔧 常见操作

**查看集群状态:**

```powershell
# 查看所有资源
kubectl -n gaming get all

# 查看 Pod 详情
kubectl -n gaming describe pod <pod-name>

# 进入容器调试
kubectl -n gaming exec -it <pod-name> -- sh
```

**重启服务(应用配置更改后):**

```powershell
# 重启单个服务
kubectl -n gaming rollout restart deploy/auth-service

# 重启所有服务
kubectl -n gaming rollout restart deploy --all

# 等待滚动更新完成
kubectl -n gaming rollout status deploy/auth-service
```

**更新镜像(代码变更后):**

```powershell
# 1. 重新构建镜像
./scripts/build-images.ps1 -Tag dev

# 2. 重新加载到 k8s 节点
./scripts/load-images-to-k8s.ps1 -Tag dev

# 3. 强制重启 Pod(触发镜像重新拉取)
kubectl -n gaming rollout restart deploy --all
```

**清理环境:**

```powershell
# 删除所有资源(保留命名空间)
kubectl delete -f k8s/local/gateway-service.yaml
kubectl delete -f k8s/local/game-service.yaml
kubectl delete -f k8s/local/auth-service.yaml
kubectl delete -f k8s/local/configmap-gateway.yaml
kubectl delete -f k8s/local/redis.yaml
kubectl delete -f k8s/local/mongodb.yaml

# 删除命名空间(会级联删除所有资源)
kubectl delete namespace gaming
```

#### 📦 推送镜像到远程仓库(可选)

如果需要在多台机器或 CI/CD 环境中部署,可以将镜像推送到 Docker Hub 或私有仓库:

**方式 1: 使用发布脚本**

```powershell
# 登录 Docker Hub
docker login

# 推送镜像到你的仓库
./scripts/publish-images.ps1 `
  -Registry docker.io `
  -Namespace YOUR_DOCKERHUB_USERNAME `
  -Tag dev `
  -IncludeInfra  # 可选:同时推送 mongo 和 redis
```

**方式 2: 使用 Kustomize 覆盖层**

项目提供了 `k8s/local/overlays/registry/` 配置,可以在部署时自动替换镜像路径:

```powershell
# 1. 编辑 k8s/local/overlays/registry/kustomization.yaml
#    将 REPLACE_ME 替换为你的仓库命名空间,例如:docker.io/phuhao00

# 2. 使用 kustomize 部署
kubectl apply -k k8s/local/overlays/registry

# 3. 验证部署
kubectl -n gaming get pods
```

#### 🐛 故障排查

**问题 1: Pod 状态为 `ImagePullBackOff` 或 `ErrImagePull`**

**原因**: Kubernetes 无法从本地 Docker 拉取镜像。

**解决方案**:
- 确保已执行 `./scripts/load-images-to-k8s.ps1`
- 检查 Pod 的 `imagePullPolicy` 是否为 `IfNotPresent`
- 验证镜像已加载: `kubectl -n gaming describe pod <pod-name> | Select-String -Pattern "Image"`

**问题 2: Pod 状态为 `CrashLoopBackOff`**

**原因**: 服务启动失败,通常是配置错误或依赖未就绪。

**解决方案**:
```powershell
# 查看崩溃日志
kubectl -n gaming logs <pod-name> --previous

# 常见原因:
# - MongoDB/Redis 未就绪 → 等待基础设施 Pod 先启动
# - 环境变量配置错误 → 检查 Deployment 的 env 配置
# - 端口冲突 → 检查 containerPort 和 Service port 映射
```

**问题 3: 无法通过 NodePort 访问服务**

**原因**: NodePort 未正确映射或防火墙阻止。

**解决方案**:
```powershell
# 验证 Service 配置
kubectl -n gaming get svc

# 确认 NodePort 范围(默认 30000-32767)
# 检查 Windows 防火墙或 Docker Desktop 网络设置

# 临时替代方案:使用端口转发
kubectl -n gaming port-forward svc/auth-service 8080:8080
kubectl -n gaming port-forward svc/gateway-service 9090:9090
```

**问题 4: MongoDB/Redis 连接失败**

**原因**: 服务启动顺序问题或 DNS 解析失败。

**解决方案**:
```powershell
# 检查基础设施服务是否运行
kubectl -n gaming get pods -l app=mongodb
kubectl -n gaming get pods -l app=redis

# 验证服务 DNS 解析(在 Pod 内测试)
kubectl -n gaming exec -it <auth-pod> -- nslookup mongodb
kubectl -n gaming exec -it <auth-pod> -- nslookup redis

# 检查服务端点
kubectl -n gaming get endpoints
```

#### 📊 监控与日志

**实时查看日志:**

```powershell
# 跟踪单个服务
kubectl -n gaming logs -f deploy/auth-service

# 查看所有服务日志(多窗口)
kubectl -n gaming logs -f -l app=auth-service
kubectl -n gaming logs -f -l app=game-service
kubectl -n gaming logs -f -l app=gateway-service

# 查看 Pod 事件
kubectl -n gaming get events --sort-by='.lastTimestamp'
```

**资源使用情况:**

```powershell
# 查看 Pod 资源占用
kubectl -n gaming top pods

# 查看节点资源
kubectl top nodes
```

#### 🔐 生产环境增强配置

本地部署使用简化配置,生产环境建议增强:

**安全性:**
- 使用 Kubernetes Secrets 管理敏感信息(数据库密码、JWT密钥)
- 启用 NetworkPolicy 限制 Pod 间通信
- 配置 RBAC 权限控制
- 使用 TLS 加密服务间通信

**高可用:**
- 增加副本数 (`replicas: 3`)
- 配置 PodDisruptionBudget
- 使用 StatefulSet 部署有状态服务(MongoDB)
- 启用 HorizontalPodAutoscaler 自动扩缩容

**持久化:**
- 为 MongoDB 配置 PersistentVolumeClaim(避免使用 emptyDir)
- 定期备份数据库
- 配置数据保留策略

**示例:生产级 MongoDB 部署**

```yaml
# 使用 StatefulSet + PVC(生产环境推荐)
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mongodb
  namespace: gaming
spec:
  serviceName: mongodb
  replicas: 3
  selector:
    matchLabels:
      app: mongodb
  template:
    spec:
      containers:
      - name: mongodb
        image: mongo:7
        volumeMounts:
        - name: mongo-data
          mountPath: /data/db
  volumeClaimTemplates:
  - metadata:
      name: mongo-data
    spec:
      accessModes: ["ReadWriteOnce"]
      resources:
        requests:
          storage: 10Gi
```

#### 🎯 性能调优建议

**资源配额调整:**

根据实际负载修改 `k8s/local/*-service.yaml` 中的资源限制:

```yaml
resources:
  requests:
    cpu: "500m"      # 保证分配
    memory: "512Mi"
  limits:
    cpu: "2"         # 最大使用
    memory: "2Gi"
```

**并发连接优化:**

在 `k8s/local/configmap-gateway.yaml` 中调整网关配置:

```yaml
server:
  tcp:
    max_connections: 50000  # 根据节点能力调整
    buffer_size: 8192       # 增大缓冲区
```

**数据库连接池:**

在各服务配置中优化连接池参数:

```yaml
database:
  mongodb:
    max_pool_size: 200
    min_pool_size: 50
  redis:
    pool_size: 200
    min_idle_conns: 50
```

#### 📚 相关文档

- [Kubernetes 配置清单说明](k8s/local/README.md)(待创建)
- [Docker 镜像构建脚本](scripts/build-images.ps1)
- [镜像加载脚本](scripts/load-images-to-k8s.ps1)
- [Kustomize 覆盖层](k8s/local/overlays/registry/)

---

### 🔧 生产环境配置

#### 环境变量
```bash
# 服务配置
export SERVICE_TYPE="auth-service"  # auth-service, game-service, gateway-service
export SERVER_PORT=8080
export SERVER_HOST=0.0.0.0

# 数据库配置
export MONGODB_URI="mongodb://mongo-cluster:27017/gamedb"
export REDIS_ADDR="redis-cluster:6379"

# 认证配置
export JWT_SECRET="your-production-secret-key"

# 日志配置
export LOG_LEVEL=info
export LOG_FORMAT=json
```

## 📚 文档与图示

- `docs/diagrams/README.md`:架构示意与上下游关系说明,附带 module / svr.frame / uml 等 Draw.io 源文件。
- `internal/readme.md`:内部模块快速索引,包括领域层、基础设施层与接口层的职责梳理。
- `module.drawio.png`、`svr.drawio.png`:面向汇报的静态架构图,可直接嵌入文档或 PPT。
- 若需要生成协议文档,可运行 `scripts/generate_proto.sh` / `.bat` 后在 `proto/` 目录查阅最新的 `.proto` 定义。

## 🤝 贡献指南

我们欢迎所有形式的贡献!请阅读 [CONTRIBUTING.md](CONTRIBUTING.md) 了解详细信息。

### 贡献流程
1. **Fork** 项目到你的GitHub账户
2. **创建** 功能分支 (`git checkout -b feature/amazing-feature`)
3. **提交** 你的更改 (`git commit -m 'Add some amazing feature'`)
4. **推送** 到分支 (`git push origin feature/amazing-feature`)
5. **创建** Pull Request

### 开发规范
- 遵循 [Go代码规范](https://golang.org/doc/effective_go.html)
- 编写单元测试,保持测试覆盖率 > 80%
- 更新相关文档
- 通过所有CI检查

## 📄 许可证

本项目采用 MIT 许可证 - 查看 [LICENSE](LICENSE) 文件了解详情。

## 📞 联系我们

- **QQ群**: 366905799
- **项目主页**: [https://github.com/phuhao00/greatestworks](https://github.com/phuhao00/greatestworks)
- **问题反馈**: [GitHub Issues](https://github.com/phuhao00/greatestworks/issues)
- **讨论交流**: [GitHub Discussions](https://github.com/phuhao00/greatestworks/discussions)

## 📈 项目状态

![Build Status](https://github.com/phuhao00/greatestworks/workflows/CI/badge.svg)
![Go Version](https://img.shields.io/badge/Go-1.24+-blue.svg)
![License](https://img.shields.io/badge/License-MIT-green.svg)
![Docker Pulls](https://img.shields.io/docker/pulls/greatestworks/server.svg)

## 🎯 路线图

### v2.0.0 (计划中)
- [ ] 服务网格集成
- [ ] GraphQL API支持
- [ ] 实时数据分析和BI
- [ ] 多语言客户端SDK
- [ ] 云原生部署优化

### v1.5.0 (开发中)
- [ ] 管理后台界面
- [ ] 性能监控面板
- [ ] 自动化测试覆盖
- [ ] 服务发现集成

### v1.0.0 ✅ (已发布)
- [x] 分布式架构重构完成
- [x] 多节点服务分离
- [x] Go原生RPC通信
- [x] Docker容器化支持
- [x] 基础监控和日志
- [x] 完整文档体系

---

<div align="center">

**⭐ 如果这个项目对你有帮助,请给我们一个Star!⭐**

*Built with ❤️ by the Greatest Works Team*

</div>

================================================
FILE: cmd/auth-service/main.go
================================================
// Package main 认证服务主程序
// 基于DDD架构的分布式认证服务
package main

import (
	"context"
	"greatestworks/internal/bootstrap"
	"log"
	"os"
	"os/signal"
	"syscall"

	"greatestworks/internal/config"
	"greatestworks/internal/infrastructure/logging"
)

// AuthServiceConfig aliases the shared configuration schema for readability.
type AuthServiceConfig = config.Config

// loadInitialConfig 加载配置并返回配置与文件来源
func loadInitialConfig() (*AuthServiceConfig, []string, *config.Loader, error) {
	loader := config.NewLoader(
		config.WithService("auth-service"),
	)

	cfg, sources, err := loader.Load()
	if err != nil {
		return nil, nil, nil, err
	}

	return cfg, sources, loader, nil
}

// main 主函数
func main() {
	logger := logging.NewBaseLogger(logging.InfoLevel)
	logger.Info("启动认证服务")

	cfg, sources, loader, err := loadInitialConfig()
	if err != nil {
		log.Fatalf("加载配置失败: %v", err)
	}

	logger.Info("配置加载成功", logging.Fields{
		"environment": cfg.App.Environment,
		"sources":     sources,
	})

	manager, err := config.NewManager(loader)
	if err != nil {
		log.Fatalf("创建配置管理器失败: %v", err)
	}
	defer func() {
		_ = manager.Close()
	}()

	runtimeCfg := manager.Config()
	service := bootstrap.NewAuthBootstrap(runtimeCfg, logger)

	manager.OnChange(func(next *config.Config) {
		if next == nil {
			return
		}
		service.UpdateConfig(next)
		logger.Info("认证服务配置已刷新", logging.Fields{
			"service_version": next.Service.Version,
		})
	})

	watchCtx, watchCancel := context.WithCancel(context.Background())
	defer watchCancel()

	if runtimeCfg != nil && runtimeCfg.Environment.HotReload {
		if err := manager.StartWatching(watchCtx); err != nil {
			logger.Error("启动配置热更新监听失败", err, logging.Fields{})
		} else {
			logger.Info("已启用配置热更新", logging.Fields{})
		}
	}

	if err := service.Start(); err != nil {
		log.Fatalf("启动认证服务失败: %v", err)
	}

	sigChan := make(chan os.Signal, 1)
	signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP)

	select {
	case sig := <-sigChan:
		logger.Info("收到关闭信号", logging.Fields{"signal": sig.String()})
	case <-service.Done():
		logger.Info("上下文已取消")
	}

	logger.Info("正在关闭认证服务...")
	watchCancel()
	if err := service.Stop(); err != nil {
		logger.Error("关闭认证服务失败", err, logging.Fields{})
		os.Exit(1)
	}

	logger.Info("认证服务已关闭")
}


================================================
FILE: cmd/game-service/main.go
================================================
// Package main 游戏服务主程序
// 基于DDD架构的分布式游戏服务
package main

import (
	"context"
	"greatestworks/internal/bootstrap"
	"log"
	"os"
	"os/signal"
	"syscall"

	"greatestworks/internal/config"
	"greatestworks/internal/infrastructure/logging"
)

// GameServiceConfig 游戏服务配置
type GameServiceConfig = config.Config

// loadConfig 加载配置
func loadInitialConfig() (*GameServiceConfig, []string, *config.Loader, error) {
	loader := config.NewLoader(
		config.WithService("game-service"),
	)

	cfg, files, err := loader.Load()
	if err != nil {
		return nil, nil, nil, err
	}

	return cfg, files, loader, nil
}

// main 主函数
func main() {
	logger := logging.NewBaseLogger(logging.InfoLevel)
	logger.Info("启动游戏服务", logging.Fields{})

	cfg, sources, loader, err := loadInitialConfig()
	if err != nil {
		log.Fatalf("加载配置失败: %v", err)
	}

	logger.Info("配置加载成功", logging.Fields{
		"environment": cfg.App.Environment,
		"sources":     sources,
	})

	manager, err := config.NewManager(loader)
	if err != nil {
		log.Fatalf("创建配置管理器失败: %v", err)
	}
	defer func() {
		_ = manager.Close()
	}()

	runtimeCfg := manager.Config()
	service := bootstrap.NewGameBootstrap(runtimeCfg, logger)

	manager.OnChange(func(next *config.Config) {
		if next == nil {
			return
		}
		service.UpdateConfig(next)
		logger.Info("游戏服务配置已刷新", logging.Fields{
			"service_version": next.Service.Version,
		})
	})

	watchCtx, watchCancel := context.WithCancel(context.Background())
	defer watchCancel()

	if runtimeCfg != nil && runtimeCfg.Environment.HotReload {
		if err := manager.StartWatching(watchCtx); err != nil {
			logger.Error("启动配置热更新监听失败", err, logging.Fields{})
		} else {
			logger.Info("已启用配置热更新", logging.Fields{})
		}
	}

	if err := service.Start(); err != nil {
		log.Fatalf("启动游戏服务失败: %v", err)
	}

	sigChan := make(chan os.Signal, 1)
	signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP)

	select {
	case sig := <-sigChan:
		logger.Info("收到关闭信号", logging.Fields{"signal": sig.String()})
	case <-service.Done():
		logger.Info("上下文已取消", logging.Fields{})
	}

	logger.Info("正在关闭游戏服务...", logging.Fields{})
	watchCancel()
	if err := service.Stop(); err != nil {
		logger.Error("关闭游戏服务失败", err, logging.Fields{})
		os.Exit(1)
	}

	logger.Info("游戏服务已关闭", logging.Fields{})
}


================================================
FILE: cmd/gateway-service/main.go
================================================
// Package main 网关服务主程序
// 基于DDD架构的分布式网关服务
package main

import (
	"context"
	"greatestworks/internal/bootstrap"
	"log"
	"os"
	"os/signal"
	"syscall"

	"greatestworks/internal/config"
	"greatestworks/internal/infrastructure/logging"
)

// GatewayServiceConfig aliases the shared configuration schema for readability.
type GatewayServiceConfig = config.Config

// loadInitialConfig 加载配置并返回配置与文件来源
func loadInitialConfig() (*GatewayServiceConfig, []string, *config.Loader, error) {
	loader := config.NewLoader(
		config.WithService("gateway-service"),
	)

	cfg, sources, err := loader.Load()
	if err != nil {
		return nil, nil, nil, err
	}

	return cfg, sources, loader, nil
}

// main 主函数
func main() {
	logger := logging.NewBaseLogger(logging.InfoLevel)
	logger.Info("启动网关服务")

	cfg, sources, loader, err := loadInitialConfig()
	if err != nil {
		log.Fatalf("加载配置失败: %v", err)
	}

	logger.Info("配置加载成功", logging.Fields{
		"environment": cfg.App.Environment,
		"sources":     sources,
	})

	manager, err := config.NewManager(loader)
	if err != nil {
		log.Fatalf("创建配置管理器失败: %v", err)
	}
	defer func() {
		_ = manager.Close()
	}()

	runtimeCfg := manager.Config()
	service := bootstrap.NewGatewayBootstrap(runtimeCfg, logger)

	manager.OnChange(func(next *config.Config) {
		if next == nil {
			return
		}
		service.UpdateConfig(next)
		logger.Info("网关服务配置已刷新", logging.Fields{
			"service_version": next.Service.Version,
		})
	})

	watchCtx, watchCancel := context.WithCancel(context.Background())
	defer watchCancel()

	if runtimeCfg != nil && runtimeCfg.Environment.HotReload {
		if err := manager.StartWatching(watchCtx); err != nil {
			logger.Error("启动配置热更新监听失败", err, logging.Fields{})
		} else {
			logger.Info("已启用配置热更新", logging.Fields{})
		}
	}

	if err := service.Start(); err != nil {
		log.Fatalf("启动网关服务失败: %v", err)
	}

	sigChan := make(chan os.Signal, 1)
	signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP)

	select {
	case sig := <-sigChan:
		logger.Info("收到关闭信号", logging.Fields{"signal": sig.String()})
	case <-service.Done():
		logger.Info("上下文已取消")
	}

	logger.Info("正在关闭网关服务...")
	watchCancel()
	if err := service.Stop(); err != nil {
		logger.Error("关闭网关服务失败", err, logging.Fields{})
		os.Exit(1)
	}

	logger.Info("网关服务已关闭")
}


================================================
FILE: cmd/replication/main.go
================================================
// Package main 副本服务主程序
// 负责副本/实例的创建、匹配与回收
package main

import (
	"context"
	"greatestworks/internal/bootstrap"
	"log"
	"os"
	"os/signal"
	"syscall"

	"greatestworks/internal/config"
	"greatestworks/internal/infrastructure/logging"
)

// ReplicationServiceConfig 配置别名
type ReplicationServiceConfig = config.Config

// loadInitialConfig 加载配置
func loadInitialConfig() (*ReplicationServiceConfig, []string, *config.Loader, error) {
	loader := config.NewLoader(
		config.WithService("replication-service"),
	)
	cfg, files, err := loader.Load()
	if err != nil {
		return nil, nil, nil, err
	}
	return cfg, files, loader, nil
}

// main 入口
func main() {
	logger := logging.NewBaseLogger(logging.InfoLevel)
	logger.Info("启动副本服务", logging.Fields{})

	cfg, sources, loader, err := loadInitialConfig()
	if err != nil {
		log.Fatalf("加载配置失败: %v", err)
	}
	logger.Info("配置加载成功", logging.Fields{"environment": cfg.App.Environment, "sources": sources})

	manager, err := config.NewManager(loader)
	if err != nil {
		log.Fatalf("创建配置管理器失败: %v", err)
	}
	defer func() { _ = manager.Close() }()

	runtimeCfg := manager.Config()
	service := bootstrap.NewReplicationBootstrap(runtimeCfg, logger)

	manager.OnChange(func(next *config.Config) {
		if next == nil {
			return
		}
		service.UpdateConfig(next)
		logger.Info("副本服务配置已刷新", logging.Fields{"service_version": next.Service.Version})
	})

	watchCtx, watchCancel := context.WithCancel(context.Background())
	defer watchCancel()
	if runtimeCfg != nil && runtimeCfg.Environment.HotReload {
		if err := manager.StartWatching(watchCtx); err != nil {
			logger.Error("启动配置热更新监听失败", err, logging.Fields{})
		} else {
			logger.Info("已启用配置热更新", logging.Fields{})
		}
	}

	if err := service.Start(); err != nil {
		log.Fatalf("启动副本服务失败: %v", err)
	}

	sigChan := make(chan os.Signal, 1)
	signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP)

	select {
	case sig := <-sigChan:
		logger.Info("收到关闭信号", logging.Fields{"signal": sig.String()})
	case <-service.Done():
		logger.Info("上下文已取消", logging.Fields{})
	}

	logger.Info("正在关闭副本服务...", logging.Fields{})
	watchCancel()
	if err := service.Stop(); err != nil {
		logger.Error("关闭副本服务失败", err, logging.Fields{})
		os.Exit(1)
	}
	logger.Info("副本服务已关闭", logging.Fields{})
}


================================================
FILE: cmd/scene/main.go
================================================
// Package main 场景服务主程序
// 负责地图/副本/区域等场景的生命周期与调度
package main

import (
	"context"
	"greatestworks/internal/bootstrap"
	"log"
	"os"
	"os/signal"
	"syscall"

	"greatestworks/internal/config"
	"greatestworks/internal/infrastructure/logging"
)

// SceneServiceConfig 配置别名
type SceneServiceConfig = config.Config

// loadInitialConfig 加载配置
func loadInitialConfig() (*SceneServiceConfig, []string, *config.Loader, error) {
	loader := config.NewLoader(
		config.WithService("scene-service"),
	)

	cfg, files, err := loader.Load()
	if err != nil {
		return nil, nil, nil, err
	}
	return cfg, files, loader, nil
}

// main 主函数
func main() {
	logger := logging.NewBaseLogger(logging.InfoLevel)
	logger.Info("启动场景服务", logging.Fields{})

	cfg, sources, loader, err := loadInitialConfig()
	if err != nil {
		log.Fatalf("加载配置失败: %v", err)
	}

	logger.Info("配置加载成功", logging.Fields{
		"environment": cfg.App.Environment,
		"sources":     sources,
	})

	manager, err := config.NewManager(loader)
	if err != nil {
		log.Fatalf("创建配置管理器失败: %v", err)
	}
	defer func() { _ = manager.Close() }()

	runtimeCfg := manager.Config()
	service := bootstrap.NewSceneBootstrap(runtimeCfg, logger)

	manager.OnChange(func(next *config.Config) {
		if next == nil {
			return
		}
		service.UpdateConfig(next)
		logger.Info("场景服务配置已刷新", logging.Fields{
			"service_version": next.Service.Version,
		})
	})

	watchCtx, watchCancel := context.WithCancel(context.Background())
	defer watchCancel()

	if runtimeCfg != nil && runtimeCfg.Environment.HotReload {
		if err := manager.StartWatching(watchCtx); err != nil {
			logger.Error("启动配置热更新监听失败", err, logging.Fields{})
		} else {
			logger.Info("已启用配置热更新", logging.Fields{})
		}
	}

	if err := service.Start(); err != nil {
		log.Fatalf("启动场景服务失败: %v", err)
	}

	sigChan := make(chan os.Signal, 1)
	signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP)

	select {
	case sig := <-sigChan:
		logger.Info("收到关闭信号", logging.Fields{"signal": sig.String()})
	case <-service.Done():
		logger.Info("上下文已取消", logging.Fields{})
	}

	logger.Info("正在关闭场景服务...", logging.Fields{})
	watchCancel()
	if err := service.Stop(); err != nil {
		logger.Error("关闭场景服务失败", err, logging.Fields{})
		os.Exit(1)
	}

	logger.Info("场景服务已关闭", logging.Fields{})
}


================================================
FILE: configs/auth-service.yaml
================================================
app:
  name: "GreatestWorks Auth"
  version: "1.0.0"
  environment: "development"
  debug: false

service:
  name: "auth-service"
  version: "1.0.0"
  environment: "development"
  node_id: "auth-node-1"

server:
  http:
    host: "0.0.0.0"
    port: 8080
    read_timeout: "30s"
    write_timeout: "30s"
    idle_timeout: "60s"
    max_header_bytes: 1048576
    enable_cors: true
    enable_metrics: true
    enable_swagger: true
    rate_limit_enabled: true
    rate_limit_requests: 100
    rate_limit_window: "1s"

database:
  mongodb:
    uri: "mongodb://localhost:27017"
    database: "auth_service"
    username: "admin"
    password: "admin123"
    auth_source: "admin"
    max_pool_size: 50
    min_pool_size: 5
    max_idle_time: "10m"
    connect_timeout: "10s"
    socket_timeout: "30s"
  redis:
    addr: "localhost:6379"
    password: "redis123"
    db: 0
    pool_size: 50
    min_idle_conns: 5
    max_retries: 3
    dial_timeout: "5s"
    read_timeout: "3s"
    write_timeout: "3s"
    pool_timeout: "4s"
    idle_timeout: "5m"

security:
  jwt:
    secret: "your-super-secret-jwt-key-change-in-production"
    issuer: "greatestworks-auth"
    audience: "mmo-players"
    access_token_ttl: "1h"
    refresh_token_ttl: "24h"
  encryption:
    enabled: true
    key: "32-character-encryption-key-here"
    algorithm: "AES-256-GCM"
  password_policy:
    min_length: 8
    require_uppercase: true
    require_lowercase: true
    require_numbers: true
    require_symbols: false
    max_attempts: 5
    lockout_duration: "15m"
  rate_limit:
    enabled: true
    requests_per_minute: 1000
    burst: 200
    interval: "1m"
    global_limit: 1000
    per_ip_limit: 100
  ddos_protection:
    enabled: true
    threshold: 1000
    ban_duration: "1h"
  cors:
    allowed_origins:
      - "http://localhost:3000"
      - "https://greatestworks.com"
    allowed_methods:
      - "GET"
      - "POST"
      - "PUT"
      - "DELETE"
      - "OPTIONS"
    allowed_headers:
      - "Content-Type"
      - "Authorization"
      - "X-Requested-With"
    allow_credentials: true

session:
  max_sessions_per_user: 3
  session_timeout: "24h"
  cleanup_interval: "1h"
  store_type: "redis"

logging:
  level: "info"
  format: "json"
  output: "stdout"
  fields:
    service: "auth-service"
    version: "1.0.0"

monitoring:
  health:
    enabled: true
    path: "/health"
  metrics: # deprecated legacy settings
    enabled: false
    namespace: "auth_service"
  profiling:
    enabled: true
    host: "0.0.0.0"
    port: 6061 # 访问 http://<host>:6061/debug/pprof/{profile,heap,goroutine,block,trace,...}

third_party:
  email:
    smtp:
      host: "smtp.gmail.com"
      port: 587
      username: "your-email@gmail.com"
      password: "your-app-password"
  oauth:
    providers:
      google:
        client_id: ""
        client_secret: ""
      github:
        client_id: ""
        client_secret: ""

environment:
  hot_reload: false
  mock_data: false
  test_mode: false


================================================
FILE: configs/config.dev.yaml.example
================================================
# =============================================================================
# 开发环境配置模板
# 用于本地开发和测试
# =============================================================================

# 应用基础配置
app:
  name: "GreatestWorks MMO Server (Dev)"
  version: "1.0.0-dev"
  environment: "development"
  debug: true
  
# 服务器配置
server:
  http:
    host: "localhost"
    port: 8080
    read_timeout: "30s"
    write_timeout: "30s"
    idle_timeout: "60s"
  
  websocket:
    host: "localhost"
    port: 8081
    check_origin: false  # 开发环境允许跨域
    
  tcp:
    host: "localhost"
    port: 8082
    max_connections: 1000  # 开发环境限制连接数
    
  metrics:
    host: "localhost"
    port: 9090

# 数据库配置
database:
  mongodb:
    uri: "mongodb://localhost:27017"
    database: "mmo_game_dev"
    username: "admin"
    password: "admin123"
    auth_source: "admin"
    max_pool_size: 10  # 开发环境较小的连接池
    min_pool_size: 2
    
  redis:
    addr: "localhost:6379"
    password: "redis123"
    db: 1  # 使用不同的数据库
    pool_size: 10
    min_idle_conns: 2

# 消息队列配置
messaging:
  nats:
    url: "nats://localhost:4222"
    cluster_id: "mmo-cluster-dev"
    client_id: "mmo-server-dev-1"

# 安全配置(开发环境使用简单配置)
security:
  jwt:
    secret: "dev-jwt-secret-not-for-production"
    access_token_ttl: "24h"  # 开发环境更长的过期时间
    refresh_token_ttl: "7d"
    
  cors:
    allowed_origins:
      - "http://localhost:3000"
      - "http://localhost:3001"
      - "http://127.0.0.1:3000"
    allow_credentials: true

# 日志配置
logging:
  level: "debug"  # 开发环境使用 debug 级别
  format: "text"  # 开发环境使用易读的文本格式
  output: "stdout"
  
  fields:
    service: "mmo-server-dev"
    version: "1.0.0-dev"

# 游戏配置(开发环境调整)
game:
  player:
    max_level: 100
    initial_gold: 10000  # 开发环境给更多初始金币
    initial_experience: 1000
    
  battle:
    max_battle_time: "1m"  # 开发环境缩短战斗时间
    
  chat:
    rate_limit: 100  # 开发环境放宽限制

# 性能配置(开发环境优化)
performance:
  worker_pool:
    size: 10  # 较小的工作池
    queue_size: 100
    
  cache:
    default_ttl: "10m"  # 较短的缓存时间
    max_entries: 1000
    
  rate_limit:
    enabled: false  # 开发环境禁用限流

# 监控配置
monitoring:
  health:
    enabled: true
    
  metrics:
    enabled: true
    
  tracing:
    enabled: false  # 开发环境可选启用
    
  profiling:
    enabled: true  # 开发环境启用性能分析
    host: "localhost"
    port: 6060

# 开发工具配置
development:
  hot_reload:
    enabled: true
    watch_dirs:
      - "./internal"
      - "./cmd"
      - "./configs"
      
  debug:
    pprof_enabled: true
    race_detector: true
    
  test_data:
    enabled: true
    auto_create_users: 5
    auto_create_items: 50

# 第三方服务(开发环境使用测试配置)
third_party:
  email:
    provider: "mock"  # 使用模拟邮件服务
    
  push:
    provider: "mock"  # 使用模拟推送服务
    
  payment:
    provider: "mock"

================================================
FILE: configs/config.example.yaml
================================================
# =============================================================================
# GreatestWorks MMO 游戏服务器配置模板
# 复制此文件为 config.yaml 并根据环境修改相应配置
# =============================================================================

# 应用基础配置
app:
  name: "GreatestWorks MMO Server"
  version: "1.0.0"
  environment: "development"  # development, staging, production
  debug: true
  
# 服务器配置
server:
  # HTTP 服务器
  http:
    host: "0.0.0.0"
    port: 8080
    read_timeout: "30s"
    write_timeout: "30s"
    idle_timeout: "60s"
    max_header_bytes: 1048576  # 1MB
  
  # WebSocket 服务器
  websocket:
    host: "0.0.0.0"
    port: 8081
    read_buffer_size: 4096
    write_buffer_size: 4096
    check_origin: false
    
  # TCP 游戏服务器
  tcp:
    host: "0.0.0.0"
    port: 8082
    max_connections: 10000
    read_timeout: "30s"
    write_timeout: "30s"
    
  # 指标服务器
  metrics:
    host: "0.0.0.0"
    port: 9090
    path: "/metrics"

# 数据库配置
database:
  # MongoDB 主数据库
  mongodb:
    uri: "mongodb://localhost:27017"
    database: "mmo_game"
    username: "admin"
    password: "admin123"
    auth_source: "admin"
    max_pool_size: 100
    min_pool_size: 10
    max_idle_time: "10m"
    connect_timeout: "10s"
    socket_timeout: "30s"
    
  # Redis 缓存
  redis:
    addr: "localhost:6379"
    password: "redis123"
    db: 0
    pool_size: 100
    min_idle_conns: 10
    max_retries: 3
    dial_timeout: "5s"
    read_timeout: "3s"
    write_timeout: "3s"
    pool_timeout: "4s"
    idle_timeout: "5m"

# 消息队列配置
messaging:
  # NATS 配置
  nats:
    url: "nats://localhost:4222"
    cluster_id: "mmo-cluster"
    client_id: "mmo-server-1"
    max_reconnect: 10
    reconnect_wait: "2s"
    timeout: "5s"
    
    # JetStream 配置
    jetstream:
      enabled: true
      domain: "mmo"
      
    # 主题配置
    subjects:
      player_events: "player.events.>"
      game_events: "game.events.>"
      system_events: "system.events.>"

# 认证和安全配置
security:
  # JWT 配置
  jwt:
    secret: "your-super-secret-jwt-key-change-in-production"
    issuer: "greatestworks-mmo"
    audience: "mmo-players"
    access_token_ttl: "1h"
    refresh_token_ttl: "24h"
    
  # 加密配置
  encryption:
    key: "32-character-encryption-key-here"
    algorithm: "AES-256-GCM"
    
  # CORS 配置
  cors:
    allowed_origins:
      - "http://localhost:3000"
      - "https://yourdomain.com"
    allowed_methods:
      - "GET"
      - "POST"
      - "PUT"
      - "DELETE"
      - "OPTIONS"
    allowed_headers:
      - "Content-Type"
      - "Authorization"
      - "X-Requested-With"
    expose_headers:
      - "X-Total-Count"
    allow_credentials: true
    max_age: 86400

# 日志配置
logging:
  level: "info"  # debug, info, warn, error
  format: "json"  # json, text
  output: "stdout"  # stdout, stderr, file
  
  # 文件日志配置(当 output 为 file 时)
  file:
    path: "/var/log/mmo-server/app.log"
    max_size: 100  # MB
    max_backups: 10
    max_age: 30  # days
    compress: true
    
  # 日志字段
  fields:
    service: "mmo-server"
    version: "1.0.0"

# 游戏配置
game:
  # 玩家配置
  player:
    max_level: 100
    initial_gold: 1000
    initial_experience: 0
    max_inventory_slots: 100
    
  # 战斗配置
  battle:
    max_battle_time: "10m"
    damage_variance: 0.1  # 10% 伤害浮动
    critical_rate_base: 0.05  # 5% 基础暴击率
    critical_damage_base: 1.5  # 150% 暴击伤害
    
  # 经验配置
  experience:
    base_exp_per_level: 100
    exp_multiplier: 1.2
    max_exp_bonus: 2.0
    
  # 聊天配置
  chat:
    max_message_length: 500
    rate_limit: 10  # 每分钟最大消息数
    banned_words:
      - "spam"
      - "cheat"

# 性能配置
performance:
  # 工作池配置
  worker_pool:
    size: 100
    queue_size: 1000
    
  # 缓存配置
  cache:
    default_ttl: "1h"
    max_entries: 10000
    cleanup_interval: "10m"
    
  # 限流配置
  rate_limit:
    enabled: true
    requests_per_minute: 1000
    burst: 100
    
  # 连接池配置
  connection_pool:
    max_idle: 100
    max_open: 200
    max_lifetime: "1h"

# 监控配置
monitoring:
  # 健康检查
  health:
    enabled: true
    path: "/health"
    
  # 指标收集
  metrics: # deprecated, reserved for legacy Prometheus setups
    enabled: false
    namespace: "mmo_server"
    
  # 链路追踪
  tracing:
    enabled: false
    jaeger_endpoint: "http://localhost:14268/api/traces"
    sample_rate: 0.1
    
  # 性能分析
  profiling:
    enabled: true
    host: "0.0.0.0"
    port: 6060

# 第三方服务配置
third_party:
  # 邮件服务
  email:
    provider: "smtp"  # smtp, sendgrid, ses
    smtp:
      host: "smtp.gmail.com"
      port: 587
      username: "your-email@gmail.com"
      password: "your-app-password"
      
  # 推送通知
  push:
    provider: "fcm"  # fcm, apns
    fcm:
      server_key: "your-fcm-server-key"
      
  # 支付服务
  payment:
    provider: "stripe"  # stripe, paypal
    stripe:
      public_key: "pk_test_..."
      secret_key: "sk_test_..."
      webhook_secret: "whsec_..."

# 开发工具配置
development:
  # 热重载
  hot_reload:
    enabled: true
    watch_dirs:
      - "./internal"
      - "./cmd"
      - "./configs"
      
  # 调试工具
  debug:
    pprof_enabled: true
    race_detector: true
    
  # 测试数据
  test_data:
    enabled: true
    auto_create_users: 10
    auto_create_items: 100

================================================
FILE: configs/config.prod.yaml.example
================================================
# =============================================================================
# 生产环境配置模板
# 用于生产环境部署
# 注意:所有敏感信息应通过环境变量或密钥管理系统提供
# =============================================================================

# 应用基础配置
app:
  name: "GreatestWorks MMO Server"
  version: "1.0.0"
  environment: "production"
  debug: false
  
# 服务器配置
server:
  http:
    host: "0.0.0.0"
    port: 8080
    read_timeout: "30s"
    write_timeout: "30s"
    idle_timeout: "120s"
    max_header_bytes: 1048576
  
  websocket:
    host: "0.0.0.0"
    port: 8081
    read_buffer_size: 8192
    write_buffer_size: 8192
    check_origin: true  # 生产环境严格检查来源
    
  tcp:
    host: "0.0.0.0"
    port: 8082
    max_connections: 50000  # 生产环境支持更多连接
    read_timeout: "60s"
    write_timeout: "60s"
    
  metrics:
    host: "0.0.0.0"
    port: 9090

# 数据库配置
database:
  mongodb:
    # 生产环境使用环境变量
    uri: "${MONGODB_URI}"
    database: "${MONGODB_DATABASE}"
    username: "${MONGODB_USERNAME}"
    password: "${MONGODB_PASSWORD}"
    auth_source: "admin"
    max_pool_size: 200
    min_pool_size: 20
    max_idle_time: "30m"
    connect_timeout: "10s"
    socket_timeout: "60s"
    
    # 生产环境额外配置
    replica_set: "${MONGODB_REPLICA_SET}"
    read_preference: "secondaryPreferred"
    write_concern:
      w: "majority"
      j: true
      wtimeout: "5s"
    
  redis:
    addr: "${REDIS_ADDR}"
    password: "${REDIS_PASSWORD}"
    db: 0
    pool_size: 200
    min_idle_conns: 20
    max_retries: 5
    dial_timeout: "10s"
    read_timeout: "5s"
    write_timeout: "5s"
    pool_timeout: "10s"
    idle_timeout: "10m"
    
    # Redis 集群配置(如果使用)
    cluster:
      enabled: false
      addrs:
        - "${REDIS_CLUSTER_ADDR_1}"
        - "${REDIS_CLUSTER_ADDR_2}"
        - "${REDIS_CLUSTER_ADDR_3}"

# 消息队列配置
messaging:
  nats:
    url: "${NATS_URL}"
    cluster_id: "${NATS_CLUSTER_ID}"
    client_id: "${HOSTNAME}-${POD_NAME}"
    max_reconnect: 50
    reconnect_wait: "5s"
    timeout: "10s"
    
    # 生产环境 TLS 配置
    tls:
      enabled: true
      cert_file: "/etc/ssl/certs/nats-client.crt"
      key_file: "/etc/ssl/private/nats-client.key"
      ca_file: "/etc/ssl/certs/ca.crt"
      
    jetstream:
      enabled: true
      domain: "mmo-prod"
      
    subjects:
      player_events: "prod.player.events.>"
      game_events: "prod.game.events.>"
      system_events: "prod.system.events.>"

# 安全配置
security:
  jwt:
    secret: "${JWT_SECRET}"  # 必须通过环境变量提供
    issuer: "greatestworks-mmo-prod"
    audience: "mmo-players"
    access_token_ttl: "1h"
    refresh_token_ttl: "24h"
    
  encryption:
    key: "${ENCRYPTION_KEY}"  # 必须通过环境变量提供
    algorithm: "AES-256-GCM"
    
  cors:
    allowed_origins:
      - "https://yourdomain.com"
      - "https://www.yourdomain.com"
      - "https://game.yourdomain.com"
    allowed_methods:
      - "GET"
      - "POST"
      - "PUT"
      - "DELETE"
      - "OPTIONS"
    allowed_headers:
      - "Content-Type"
      - "Authorization"
      - "X-Requested-With"
    expose_headers:
      - "X-Total-Count"
      - "X-Rate-Limit-Remaining"
    allow_credentials: true
    max_age: 86400
    
  # TLS 配置
  tls:
    enabled: true
    cert_file: "/etc/ssl/certs/server.crt"
    key_file: "/etc/ssl/private/server.key"
    min_version: "1.2"
    
  # 安全头配置
  security_headers:
    enabled: true
    hsts_max_age: 31536000
    content_type_nosniff: true
    frame_deny: true
    xss_protection: true

# 日志配置
logging:
  level: "info"  # 生产环境使用 info 级别
  format: "json"  # 生产环境使用 JSON 格式便于解析
  output: "stdout"  # 容器环境输出到标准输出
  
  # 结构化日志字段
  fields:
    service: "mmo-server"
    version: "1.0.0"
    environment: "production"
    datacenter: "${DATACENTER}"
    region: "${REGION}"
    
  # 敏感信息过滤
  sensitive_fields:
    - "password"
    - "token"
    - "secret"
    - "key"

# 游戏配置
game:
  player:
    max_level: 100
    initial_gold: 1000
    initial_experience: 0
    max_inventory_slots: 100
    
  battle:
    max_battle_time: "10m"
    damage_variance: 0.1
    critical_rate_base: 0.05
    critical_damage_base: 1.5
    
  experience:
    base_exp_per_level: 100
    exp_multiplier: 1.2
    max_exp_bonus: 2.0
    
  chat:
    max_message_length: 500
    rate_limit: 10
    profanity_filter: true
    banned_words:
      - "spam"
      - "cheat"
      - "hack"

# 性能配置
performance:
  worker_pool:
    size: 500  # 生产环境更大的工作池
    queue_size: 10000
    
  cache:
    default_ttl: "1h"
    max_entries: 100000
    cleanup_interval: "5m"
    
  rate_limit:
    enabled: true
    requests_per_minute: 1000
    burst: 200
    
  connection_pool:
    max_idle: 200
    max_open: 500
    max_lifetime: "1h"
    
  # 内存管理
  memory:
    gc_percent: 100
    max_heap_size: "2GB"
    
  # CPU 配置
  cpu:
    max_procs: 0  # 使用所有可用 CPU

# 监控配置
monitoring:
  health:
    enabled: true
    path: "/health"
    
  metrics:
    enabled: true
    namespace: "mmo_server"
    
  tracing:
    enabled: true
    jaeger_endpoint: "${JAEGER_ENDPOINT}"
    sample_rate: 0.01  # 生产环境低采样率
    
  profiling:
    enabled: false  # 生产环境默认禁用
    
  # 告警配置
  alerting:
    enabled: true
    webhook_url: "${ALERT_WEBHOOK_URL}"
    
  # 审计日志
  audit:
    enabled: true
    log_file: "/var/log/audit/mmo-server.log"

# 第三方服务配置
third_party:
  email:
    provider: "${EMAIL_PROVIDER}"
    smtp:
      host: "${SMTP_HOST}"
      port: 587
      username: "${SMTP_USERNAME}"
      password: "${SMTP_PASSWORD}"
      
  push:
    provider: "${PUSH_PROVIDER}"
    fcm:
      server_key: "${FCM_SERVER_KEY}"
      
  payment:
    provider: "${PAYMENT_PROVIDER}"
    stripe:
      public_key: "${STRIPE_PUBLIC_KEY}"
      secret_key: "${STRIPE_SECRET_KEY}"
      webhook_secret: "${STRIPE_WEBHOOK_SECRET}"

# 备份配置
backup:
  enabled: true
  schedule: "0 2 * * *"  # 每天凌晨 2 点
  retention_days: 30
  storage:
    type: "s3"
    bucket: "${BACKUP_BUCKET}"
    region: "${BACKUP_REGION}"
    access_key: "${BACKUP_ACCESS_KEY}"
    secret_key: "${BACKUP_SECRET_KEY}"

# 灾难恢复配置
disaster_recovery:
  enabled: true
  backup_region: "${DR_REGION}"
  rto: "1h"  # 恢复时间目标
  rpo: "15m"  # 恢复点目标

# 合规配置
compliance:
  gdpr:
    enabled: true
    data_retention_days: 365
    
  audit_log:
    enabled: true
    retention_days: 2555  # 7 年
    
  encryption_at_rest:
    enabled: true
    
  encryption_in_transit:
    enabled: true

================================================
FILE: configs/data/items.json
================================================
[
  {
    "id": 10001,
    "name": "Health Potion",
    "type": 1,
    "quality": 1,
    "max_stack": 99,
    "price": 50,
    "sell_price": 10,
    "effect_type": 1,
    "effect_value": 300,
    "description": "Restores 300 HP"
  },
  {
    "id": 10002,
    "name": "Mana Potion",
    "type": 1,
    "quality": 1,
    "max_stack": 99,
    "price": 50,
    "sell_price": 10,
    "effect_type": 2,
    "effect_value": 200,
    "description": "Restores 200 MP"
  },
  {
    "id": 20001,
    "name": "Iron Sword",
    "type": 2,
    "quality": 2,
    "max_stack": 1,
    "price": 500,
    "sell_price": 100,
    "equip_slot": 1,
    "required_level": 5,
    "str_bonus": 10,
    "ad_bonus": 50,
    "description": "A sturdy iron sword"
  },
  {
    "id": 20002,
    "name": "Magic Staff",
    "type": 2,
    "quality": 2,
    "max_stack": 1,
    "price": 600,
    "sell_price": 120,
    "equip_slot": 1,
    "required_level": 5,
    "int_bonus": 15,
    "ap_bonus": 80,
    "description": "A mystical staff imbued with magic"
  },
  {
    "id": 20003,
    "name": "Leather Armor",
    "type": 2,
    "quality": 2,
    "max_stack": 1,
    "price": 400,
    "sell_price": 80,
    "equip_slot": 2,
    "required_level": 3,
    "vit_bonus": 8,
    "def_bonus": 30,
    "description": "Light leather armor"
  },
  {
    "id": 20004,
    "name": "Steel Helmet",
    "type": 2,
    "quality": 2,
    "max_stack": 1,
    "price": 300,
    "sell_price": 60,
    "equip_slot": 3,
    "required_level": 5,
    "vit_bonus": 5,
    "def_bonus": 20,
    "description": "A protective steel helmet"
  },
  {
    "id": 30001,
    "name": "Gold Coin",
    "type": 3,
    "quality": 1,
    "max_stack": 9999,
    "price": 1,
    "sell_price": 1,
    "description": "Currency used for trading"
  },
  {
    "id": 30002,
    "name": "Goblin Ear",
    "type": 3,
    "quality": 1,
    "max_stack": 99,
    "price": 5,
    "sell_price": 1,
    "description": "Proof of slaying a goblin"
  },
  {
    "id": 30003,
    "name": "Magic Crystal",
    "type": 3,
    "quality": 3,
    "max_stack": 99,
    "price": 100,
    "sell_price": 20,
    "description": "A crystal containing magical energy"
  }
]


================================================
FILE: configs/data/maps.json
================================================
[
  {
    "id": 1,
    "name": "Newbie Village",
    "width": 1000,
    "height": 1000,
    "spawn_points": [
      {
        "id": 1,
        "x": 100.0,
        "y": 0.0,
        "z": 100.0,
        "type": 1
      },
      {
        "id": 2,
        "x": 500.0,
        "y": 0.0,
        "z": 500.0,
        "type": 2
      }
    ],
    "npcs": [
      {
        "id": 3001,
        "x": 200.0,
        "y": 0.0,
        "z": 200.0
      },
      {
        "id": 3002,
        "x": 250.0,
        "y": 0.0,
        "z": 200.0
      }
    ],
    "monsters": [
      {
        "id": 2001,
        "spawn_count": 10,
        "respawn_time": 30
      }
    ]
  },
  {
    "id": 2,
    "name": "Dark Forest",
    "width": 2000,
    "height": 2000,
    "spawn_points": [
      {
        "id": 1,
        "x": 100.0,
        "y": 0.0,
        "z": 100.0,
        "type": 1
      }
    ],
    "monsters": [
      {
        "id": 2002,
        "spawn_count": 20,
        "respawn_time": 60
      },
      {
        "id": 2003,
        "spawn_count": 5,
        "respawn_time": 120
      }
    ]
  },
  {
    "id": 3,
    "name": "Boss Arena",
    "width": 500,
    "height": 500,
    "spawn_points": [
      {
        "id": 1,
        "x": 250.0,
        "y": 0.0,
        "z": 50.0,
        "type": 1
      }
    ],
    "monsters": [
      {
        "id": 2003,
        "spawn_count": 1,
        "respawn_time": 300
      }
    ]
  }
]


================================================
FILE: configs/data/quests.json
================================================
[
  {
    "id": 1001,
    "name": "Goblin Hunt",
    "description": "Help the village by eliminating goblins",
    "level": 1,
    "objectives": [
      {
        "type": 1,
        "target_id": 2001,
        "required": 10,
        "description": "Kill 10 Goblins"
      }
    ],
    "rewards": {
      "exp": 500,
      "gold": 100,
      "items": [
        {
          "item_id": 10001,
          "count": 5
        }
      ]
    },
    "prerequisite_quests": []
  },
  {
    "id": 1002,
    "name": "Collect Goblin Ears",
    "description": "Collect goblin ears as proof of your hunt",
    "level": 1,
    "objectives": [
      {
        "type": 2,
        "target_id": 30002,
        "required": 5,
        "description": "Collect 5 Goblin Ears"
      }
    ],
    "rewards": {
      "exp": 300,
      "gold": 50,
      "items": []
    },
    "prerequisite_quests": [1001]
  },
  {
    "id": 1003,
    "name": "Talk to the Elder",
    "description": "Report your success to the village elder",
    "level": 1,
    "objectives": [
      {
        "type": 4,
        "target_id": 3002,
        "required": 1,
        "description": "Talk to Quest Giver"
      }
    ],
    "rewards": {
      "exp": 200,
      "gold": 50,
      "items": [
        {
          "item_id": 20001,
          "count": 1
        }
      ]
    },
    "prerequisite_quests": [1002]
  },
  {
    "id": 2001,
    "name": "Venture into the Dark Forest",
    "description": "Explore the dangerous dark forest",
    "level": 5,
    "objectives": [
      {
        "type": 3,
        "target_id": 100,
        "required": 1,
        "description": "Reach Dark Forest Entrance"
      }
    ],
    "rewards": {
      "exp": 800,
      "gold": 200,
      "items": []
    },
    "prerequisite_quests": [1003]
  },
  {
    "id": 2002,
    "name": "Defeat the Orc Warriors",
    "description": "Clear the orc warriors blocking the path",
    "level": 8,
    "objectives": [
      {
        "type": 1,
        "target_id": 2002,
        "required": 15,
        "description": "Kill 15 Orc Warriors"
      }
    ],
    "rewards": {
      "exp": 1500,
      "gold": 300,
      "items": [
        {
          "item_id": 20003,
          "count": 1
        }
      ]
    },
    "prerequisite_quests": [2001]
  },
  {
    "id": 3001,
    "name": "Boss Challenge: Dark Mage",
    "description": "Defeat the powerful dark mage",
    "level": 15,
    "objectives": [
      {
        "type": 1,
        "target_id": 2003,
        "required": 1,
        "description": "Defeat the Dark Mage"
      }
    ],
    "rewards": {
      "exp": 5000,
      "gold": 1000,
      "items": [
        {
          "item_id": 20002,
          "count": 1
        },
        {
          "item_id": 30003,
          "count": 3
        }
      ]
    },
    "prerequisite_quests": [2002]
  }
]


================================================
FILE: configs/data/skills.json
================================================
[
  {
    "id": 1,
    "name": "Basic Attack",
    "type": 1,
    "base_damage": 100,
    "scale_ad": 1.0,
    "scale_ap": 0.0,
    "damage_type": 1,
    "cooldown": 1.0,
    "cast_time": 0.3,
    "range": 2.0,
    "mp_cost": 0,
    "target_type": 1
  },
  {
    "id": 2,
    "name": "Power Strike",
    "type": 1,
    "base_damage": 200,
    "scale_ad": 1.5,
    "scale_ap": 0.0,
    "damage_type": 1,
    "cooldown": 5.0,
    "cast_time": 0.5,
    "range": 2.0,
    "mp_cost": 30,
    "target_type": 1
  },
  {
    "id": 3,
    "name": "Whirlwind",
    "type": 2,
    "base_damage": 150,
    "scale_ad": 1.2,
    "scale_ap": 0.0,
    "damage_type": 1,
    "cooldown": 8.0,
    "cast_time": 1.0,
    "range": 5.0,
    "mp_cost": 50,
    "target_type": 2
  },
  {
    "id": 11,
    "name": "Fire Bolt",
    "type": 1,
    "base_damage": 150,
    "scale_ad": 0.0,
    "scale_ap": 1.5,
    "damage_type": 2,
    "cooldown": 3.0,
    "cast_time": 0.8,
    "range": 15.0,
    "mp_cost": 40,
    "target_type": 1
  },
  {
    "id": 12,
    "name": "Ice Storm",
    "type": 2,
    "base_damage": 200,
    "scale_ad": 0.0,
    "scale_ap": 2.0,
    "damage_type": 2,
    "cooldown": 10.0,
    "cast_time": 1.5,
    "range": 12.0,
    "mp_cost": 80,
    "target_type": 2,
    "buff_id": 101
  },
  {
    "id": 13,
    "name": "Lightning Chain",
    "type": 1,
    "base_damage": 180,
    "scale_ad": 0.0,
    "scale_ap": 1.8,
    "damage_type": 2,
    "cooldown": 6.0,
    "cast_time": 1.0,
    "range": 10.0,
    "mp_cost": 60,
    "target_type": 1
  },
  {
    "id": 21,
    "name": "Heal",
    "type": 3,
    "base_damage": -200,
    "scale_ad": 0.0,
    "scale_ap": 1.5,
    "damage_type": 0,
    "cooldown": 8.0,
    "cast_time": 1.0,
    "range": 10.0,
    "mp_cost": 100,
    "target_type": 3
  },
  {
    "id": 22,
    "name": "Buff Strength",
    "type": 4,
    "base_damage": 0,
    "scale_ad": 0.0,
    "scale_ap": 0.0,
    "damage_type": 0,
    "cooldown": 60.0,
    "cast_time": 0.5,
    "range": 0.0,
    "mp_cost": 50,
    "target_type": 4,
    "buff_id": 201
  }
]


================================================
FILE: configs/data/units.json
================================================
[
  {
    "id": 1001,
    "name": "Warrior",
    "type": 1,
    "level": 1,
    "max_hp": 1000,
    "max_mp": 200,
    "str": 50,
    "int": 20,
    "agi": 30,
    "vit": 40,
    "spr": 25,
    "ad": 100,
    "ap": 20,
    "def": 50,
    "res": 30,
    "spd": 100,
    "move_speed": 5.0,
    "skills": [1, 2, 3]
  },
  {
    "id": 1002,
    "name": "Mage",
    "type": 1,
    "level": 1,
    "max_hp": 600,
    "max_mp": 800,
    "str": 20,
    "int": 60,
    "agi": 30,
    "vit": 25,
    "spr": 50,
    "ad": 30,
    "ap": 150,
    "def": 20,
    "res": 80,
    "spd": 90,
    "move_speed": 4.5,
    "skills": [11, 12, 13]
  },
  {
    "id": 2001,
    "name": "Goblin",
    "type": 2,
    "level": 5,
    "max_hp": 500,
    "max_mp": 100,
    "str": 30,
    "int": 10,
    "agi": 40,
    "vit": 25,
    "spr": 15,
    "ad": 60,
    "ap": 10,
    "def": 30,
    "res": 20,
    "spd": 120,
    "move_speed": 6.0,
    "skills": [1],
    "ai_type": 1,
    "exp_reward": 50,
    "gold_reward": 10
  },
  {
    "id": 2002,
    "name": "Orc Warrior",
    "type": 2,
    "level": 10,
    "max_hp": 1500,
    "max_mp": 100,
    "str": 60,
    "int": 10,
    "agi": 25,
    "vit": 50,
    "spr": 20,
    "ad": 120,
    "ap": 10,
    "def": 70,
    "res": 30,
    "spd": 80,
    "move_speed": 4.0,
    "skills": [1, 2],
    "ai_type": 1,
    "exp_reward": 150,
    "gold_reward": 30
  },
  {
    "id": 2003,
    "name": "Dark Mage",
    "type": 2,
    "level": 15,
    "max_hp": 800,
    "max_mp": 1200,
    "str": 20,
    "int": 80,
    "agi": 30,
    "vit": 30,
    "spr": 60,
    "ad": 30,
    "ap": 200,
    "def": 25,
    "res": 100,
    "spd": 85,
    "move_speed": 4.0,
    "skills": [11, 12, 13],
    "ai_type": 2,
    "exp_reward": 300,
    "gold_reward": 50
  },
  {
    "id": 3001,
    "name": "Shop Keeper",
    "type": 3,
    "level": 1,
    "max_hp": 100,
    "max_mp": 100,
    "str": 10,
    "int": 10,
    "agi": 10,
    "vit": 10,
    "spr": 10,
    "ad": 10,
    "ap": 10,
    "def": 10,
    "res": 10,
    "spd": 50,
    "move_speed": 0.0,
    "npc_type": 1
  },
  {
    "id": 3002,
    "name": "Quest Giver",
    "type": 3,
    "level": 1,
    "max_hp": 100,
    "max_mp": 100,
    "str": 10,
    "int": 10,
    "agi": 10,
    "vit": 10,
    "spr": 10,
    "ad": 10,
    "ap": 10,
    "def": 10,
    "res": 10,
    "spd": 50,
    "move_speed": 0.0,
    "npc_type": 2
  }
]


================================================
FILE: configs/docker.yaml
================================================
# =============================================================================
# Docker 环境配置文件
# 用于 Docker Compose 部署
# =============================================================================

# 应用基础配置
app:
  name: "GreatestWorks MMO Server (Docker)"
  version: "1.0.0"
  environment: "docker"
  debug: false
  
# 服务器配置
server:
  http:
    host: "0.0.0.0"
    port: 8080
    read_timeout: "30s"
    write_timeout: "30s"
    idle_timeout: "60s"
  
  websocket:
    host: "0.0.0.0"
    port: 8081
    check_origin: false
    
  tcp:
    host: "0.0.0.0"
    port: 8082
    max_connections: 5000
    
  metrics:
    host: "0.0.0.0"
    port: 9090

# 数据库配置(使用 Docker 服务名)
database:
  mongodb:
    uri: "mongodb://mongodb:27017"
    database: "mmo_game"
    username: "admin"
    password: "admin123"
    auth_source: "admin"
    max_pool_size: 50
    min_pool_size: 5
    
  redis:
    addr: "redis:6379"
    password: "redis123"
    db: 0
    pool_size: 50
    min_idle_conns: 5

# 消息队列配置
messaging:
  nats:
    url: "nats://nats:4222"
    cluster_id: "mmo-cluster"
    client_id: "mmo-server-docker-1"

# 安全配置
security:
  jwt:
    secret: "docker-jwt-secret-change-in-production"
    access_token_ttl: "1h"
    refresh_token_ttl: "24h"
    
  cors:
    allowed_origins:
      - "http://localhost:3000"
      - "http://localhost:8080"
    allow_credentials: true

# 日志配置
logging:
  level: "info"
  format: "json"
  output: "stdout"
  
  fields:
    service: "mmo-server-docker"
    version: "1.0.0"
    container: "true"

# 游戏配置
game:
  player:
    max_level: 100
    initial_gold: 1000
    initial_experience: 0
    
  battle:
    max_battle_time: "5m"
    
  chat:
    rate_limit: 20

# 性能配置
performance:
  worker_pool:
    size: 50
    queue_size: 500
    
  cache:
    default_ttl: "30m"
    max_entries: 5000
    
  rate_limit:
    enabled: true
    requests_per_minute: 500
    burst: 50

# 监控配置
monitoring:
  health:
    enabled: true
    
  metrics: # deprecated legacy settings
    enabled: false

  tracing:
    enabled: false
    
  profiling:
    enabled: true
    host: "0.0.0.0"
    port: 6060

# 开发工具配置(Docker 环境禁用)
development:
  hot_reload:
    enabled: false
    
  debug:
    pprof_enabled: false
    race_detector: false
    
  test_data:
    enabled: false

================================================
FILE: configs/game-service.yaml
================================================
# 游戏服务配置文件

# 应用基础配置
app:
  name: "GreatestWorks MMO Server"
  version: "1.0.0"
  environment: "development"
  debug: true

# 服务器配置
server:
  # HTTP 服务器
  http:
    host: "0.0.0.0"
    port: 8080
    read_timeout: "30s"
    write_timeout: "30s"
    idle_timeout: "60s"
  
  # RPC 服务器
  rpc:
    host: "0.0.0.0"
    port: 8081
    max_connections: 1000
    timeout: "30s"
    keep_alive: true
    keep_alive_period: "30s"
    read_timeout: "30s"
    write_timeout: "30s"

# 数据库配置
database:
  # MongoDB 主数据库
  mongodb:
    uri: "mongodb://admin:admin123@mongodb:27017"
    database: "mmo_game"
    username: "admin"
    password: "admin123"
    auth_source: "admin"
    max_pool_size: 100
    min_pool_size: 10
    max_idle_time: "10m"
    connect_timeout: "10s"
    socket_timeout: "30s"
    
  # Redis 缓存
  redis:
    addr: "redis:6379"
    password: "redis123"
    db: 0
    pool_size: 100
    min_idle_conns: 10
    max_retries: 3
    dial_timeout: "5s"
    read_timeout: "3s"
    write_timeout: "3s"
    pool_timeout: "4s"
    idle_timeout: "5m"

# 消息队列配置
messaging:
  # NATS 配置
  nats:
    url: "nats://nats:4222"
    cluster_id: "mmo-cluster"
    client_id: "mmo-server-1"
    max_reconnect: 10
    reconnect_wait: "2s"
    timeout: "5s"
    
    # JetStream 配置
    jetstream:
      enabled: true
      domain: "mmo"
      
    # 主题配置
    subjects:
      player_events: "player.events.>"
      game_events: "game.events.>"
      system_events: "system.events.>"

# 日志配置
logging:
  level: "info"
  format: "json"
  output: "stdout"
  
  fields:
    service: "mmo-server"
    version: "1.0.0"

security:
  jwt:
    secret: "dev-secret-change-me"
    issuer: "greatestworks"
    audience: "players"
    access_token_ttl: "15m"
    refresh_token_ttl: "168h"
  rate_limit:
    enabled: true
    requests_per_minute: 1000
    burst: 100

# 游戏配置
game:
  # 玩家配置
  player:
    max_level: 100
    initial_gold: 1000
    initial_experience: 0
    max_inventory_slots: 100
    
  # 战斗配置
  battle:
    max_battle_time: "10m"
    damage_variance: 0.1
    critical_rate_base: 0.05
    critical_damage_base: 1.5
    
  # 经验配置
  experience:
    base_exp_per_level: 100
    exp_multiplier: 1.2
    max_exp_bonus: 2.0
    
  # 聊天配置
  chat:
    max_message_length: 500
    rate_limit: 10
    banned_words:
      - "spam"
      - "cheat"

# 性能配置
performance:
  # 工作池配置
  worker_pool:
    size: 100
    queue_size: 1000
    
  # 缓存配置
  cache:
    default_ttl: "1h"
    max_entries: 10000
    cleanup_interval: "10m"
    
  # 限流配置
  rate_limit:
    enabled: true
    requests_per_minute: 1000
    burst: 100

# 监控配置
monitoring:
  health:
    enabled: true
    path: "/health"
  metrics: # deprecated legacy settings
    enabled: false
    namespace: "game_service"
  profiling:
    enabled: true
    host: "0.0.0.0"
    port: 6060 # 访问 http://<host>:6060/debug/pprof/{profile,heap,goroutine,block,trace,...}

================================================
FILE: configs/gateway-service.yaml
================================================
app:
  name: "GreatestWorks Gateway"
  version: "1.0.0"
  environment: "development"
  debug: false

service:
  name: "gateway-service"
  version: "1.0.0"
  environment: "development"
  node_id: "gateway-node-1"

server:
  tcp:
    host: "0.0.0.0"
    port: 9090
    max_connections: 10000
    read_timeout: "30s"
    write_timeout: "30s"
    buffer_size: 4096
    compression_enabled: false
    encryption_enabled: false
    heartbeat_enabled: true
    heartbeat_interval: "30s"
    heartbeat_timeout: "10s"
    heartbeat_max_missed: 3
    keep_alive: true
    keep_alive_interval: "30s"
    no_delay: true

database:
  redis:
    addr: "localhost:6379"
    password: "redis123"
    db: 1
    pool_size: 100
    min_idle_conns: 10
    max_retries: 3
    dial_timeout: "5s"
    read_timeout: "3s"
    write_timeout: "3s"
    pool_timeout: "4s"
    idle_timeout: "5m"

security:
  rate_limit:
    enabled: true
    requests_per_minute: 10000
    burst: 200
    interval: "1m"
    global_limit: 10000
    per_ip_limit: 100
  ddos_protection:
    enabled: true
    threshold: 1000
    ban_duration: "1h"
  encryption:
    enabled: true
    algorithm: "AES-256-GCM"
    key: ""

gateway:
  game_services:
    discovery:
      type: "consul"
      consul:
        address: "localhost:8500"
        datacenter: "dc1"
        service_name: "game-service"
      etcd:
        endpoints:
          - "localhost:2379"
      static:
        endpoints:
          - "localhost:8081"
          - "localhost:8082"
          - "localhost:8083"
    rpc:
      protocol: "grpc"
      timeout: "30s"
      retry_attempts: 3
      retry_delay: "1s"
      circuit_breaker:
        enabled: true
        failure_threshold: 5
        timeout: "30s"
        max_requests: 100
    load_balancer:
      strategy: "round_robin"
      health_check:
        enabled: true
        interval: "10s"
        timeout: "5s"
        path: "/health"
  auth_service:
    base_url: "http://localhost:8080"
    timeout: "10s"
    retry_attempts: 3
    retry_delay: "1s"
    circuit_breaker:
      enabled: true
      failure_threshold: 5
      timeout: "30s"
      max_requests: 100
  connection:
    max_connections: 10000
    connection_timeout: "30s"
    idle_timeout: "5m"
    cleanup_interval: "1m"
    session:
      timeout: "24h"
      cleanup_interval: "1h"
      store_type: "redis"
    message_queue:
      enabled: true
      provider: "redis"
      topics:
        player_events: "gateway.player.events"
        game_events: "gateway.game.events"
        system_events: "gateway.system.events"
  protocol:
    client:
      type: "tcp"
      codec: "binary"
      compression: false
      encryption: false
    game:
      type: "grpc"
      codec: "protobuf"
      compression: true
      encryption: true
  routing:
    rules:
      - pattern: "player.*"
        target: "game-service"
        method: "rpc"
      - pattern: "battle.*"
        target: "game-service"
        method: "rpc"
      - pattern: "auth.*"
        target: "auth-service"
        method: "http"
    load_balancer:
      strategy: "round_robin"
      health_check: true
      failover: true

logging:
  level: "info"
  format: "json"
  output: "stdout"
  fields:
    service: "gateway-service"
    version: "1.0.0"

monitoring:
  health:
    enabled: true
    path: "/health"
  metrics: # deprecated legacy settings
    enabled: false
    namespace: "gateway_service"
  profiling:
    enabled: true
    host: "0.0.0.0"
    port: 6062 # 访问 http://<host>:6062/debug/pprof/{profile,heap,goroutine,block,trace,...}

performance:
  worker_pool:
    size: 100
    queue_size: 1000
  cache:
    default_ttl: "1h"
    max_entries: 10000
    cleanup_interval: "10m"
    eviction_policy: "lfu"
  connection_pool:
    max_idle: 100
    max_open: 200
    max_lifetime: "1h"

environment:
  hot_reload: false
  mock_data: false
  test_mode: false


================================================
FILE: configs/replication-service.yaml
================================================
app:
  name: "GreatestWorks Replication"
  version: "1.0.0"
  environment: "development"
  debug: false

service:
  name: "replication-service"
  version: "1.0.0"
  environment: "development"
  node_id: "replication-node-1"

server:
  http:
    host: "0.0.0.0"
    port: 8085
    read_timeout: "30s"
    write_timeout: "30s"
    idle_timeout: "60s"

logging:
  level: "info"
  format: "json"
  output: "stdout"
  fields:
    service: "replication-service"
    version: "1.0.0"

monitoring:
  health:
    enabled: true
    path: "/health"
  metrics: # deprecated legacy settings
    enabled: false
    namespace: "replication_service"
  profiling:
    enabled: true
    host: "0.0.0.0"
    port: 6064


================================================
FILE: configs/scene-service.yaml
================================================
app:
  name: "GreatestWorks Scene"
  version: "1.0.0"
  environment: "development"
  debug: false

service:
  name: "scene-service"
  version: "1.0.0"
  environment: "development"
  node_id: "scene-node-1"

server:
  http:
    host: "0.0.0.0"
    port: 8083
    read_timeout: "30s"
    write_timeout: "30s"
    idle_timeout: "60s"
  rpc:
    host: "0.0.0.0"
    port: 8084
    max_connections: 1000
    timeout: "30s"
    keep_alive: true
    keep_alive_period: "30s"
    read_timeout: "30s"
    write_timeout: "30s"

logging:
  level: "info"
  format: "json"
  output: "stdout"
  fields:
    service: "scene-service"
    version: "1.0.0"

monitoring:
  health:
    enabled: true
    path: "/health"
  metrics: # deprecated legacy settings
    enabled: false
    namespace: "scene_service"
  profiling:
    enabled: true
    host: "0.0.0.0"
    port: 6063


================================================
FILE: docker-compose.yml
================================================
# =============================================================================
# GreatestWorks MMO 游戏服务器 - 优化版 Docker Compose
# =============================================================================
version: '3.8'

# 全局配置
x-logging: &default-logging
  driver: "json-file"
  options:
    max-size: "10m"
    max-file: "3"

x-restart-policy: &restart-policy
  restart: unless-stopped

services:
  # =============================================================================
  # MMO 游戏服务器 - 主应用
  # =============================================================================
  mmo-server:
    build:
      context: .
      dockerfile: Dockerfile
      target: ${BUILD_TARGET:-final}
      args:
        BUILD_VERSION: ${BUILD_VERSION:-dev}
        BUILD_TIME: ${BUILD_TIME}
        GIT_COMMIT: ${GIT_COMMIT}
    image: greatestworks/mmo-server:${IMAGE_TAG:-latest}
    container_name: mmo-server
    ports:
      - "${SERVER_HTTP_PORT:-8080}:8080"
      - "${SERVER_WS_PORT:-8081}:8081"
      - "${SERVER_METRICS_PORT:-9090}:9090"
    environment:
      # 应用配置
      - APP_ENV=${APP_ENV:-production}
      - GIN_MODE=${GIN_MODE:-release}
      - LOG_LEVEL=${LOG_LEVEL:-info}
      - LOG_FORMAT=${LOG_FORMAT:-json}
      
      # 数据库配置
      - MONGODB_URI=mongodb://${MONGODB_USER:-admin}:${MONGODB_PASSWORD:-admin123}@mongodb:27017/${MONGODB_DATABASE:-mmo_game}?authSource=admin
      - REDIS_URL=redis://:${REDIS_PASSWORD:-redis123}@redis:6379/0
      
      # 消息队列配置
      - NATS_URL=nats://nats:4222
      - NATS_CLUSTER_ID=${NATS_CLUSTER_ID:-mmo-cluster}
      
      # 安全配置
      - JWT_SECRET=${JWT_SECRET:-change-me-in-production}
      - ENCRYPTION_KEY=${ENCRYPTION_KEY:-32-char-encryption-key-change-me}
      
      # 性能配置
      - MAX_CONNECTIONS=${MAX_CONNECTIONS:-10000}
      - WORKER_POOL_SIZE=${WORKER_POOL_SIZE:-100}
      - CACHE_TTL=${CACHE_TTL:-3600}
    env_file:
      - .env
    depends_on:
      mongodb:
        condition: service_healthy
      redis:
        condition: service_healthy
      nats:
        condition: service_healthy
    volumes:
      - ./logs:/var/log/mmo-server:rw
      - ./configs:/configs:ro
      - /etc/localtime:/etc/localtime:ro
    <<: *restart-policy
    logging: *default-logging
    networks:
      - mmo-network
    deploy:
      resources:
        limits:
          cpus: '${SERVER_CPU_LIMIT:-2.0}'
          memory: ${SERVER_MEMORY_LIMIT:-2G}
        reservations:
          cpus: '${SERVER_CPU_RESERVATION:-0.5}'
          memory: ${SERVER_MEMORY_RESERVATION:-512M}
    healthcheck:
      test: [
        "CMD-SHELL",
        "wget --no-verbose --tries=1 --spider --timeout=5 http://localhost:8080/health || exit 1"
      ]
      interval: 30s
      timeout: 10s
      retries: 5
      start_period: 60s
    security_opt:
      - no-new-privileges:true
    read_only: false
    tmpfs:
      - /tmp:noexec,nosuid,size=100m

  # MongoDB数据库
  mongodb:
    image: mongo:7.0
    ports:
      - "27017:27017"
    environment:
      - MONGO_INITDB_ROOT_USERNAME=admin
      - MONGO_INITDB_ROOT_PASSWORD=admin123
      - MONGO_INITDB_DATABASE=mmo_game
    volumes:
      - mongodb_data:/data/db
      - ./scripts/mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro
    restart: unless-stopped
    networks:
      - mmo-network
    healthcheck:
      test: echo 'db.runCommand("ping").ok' | mongosh localhost:27017/mmo_game --quiet
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

  # NATS消息系统
  nats:
    image: nats:2.10-alpine
    ports:
      - "4222:4222"
      - "8222:8222"  # HTTP监控端口
      - "6222:6222"  # 集群端口
    command: [
      "--http_port", "8222",
      "--port", "4222",
      "--cluster_name", "mmo-cluster",
      "--cluster", "nats://0.0.0.0:6222",
      "--routes", "nats-route://nats:6222",
      "--jetstream",
      "--store_dir", "/data"
    ]
    volumes:
      - nats_data:/data
    restart: unless-stopped
    networks:
      - mmo-network
    healthcheck:
      test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8222/healthz"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 10s

  # Redis缓存
  redis:
    image: redis:7.2-alpine
    ports:
      - "6379:6379"
    command: redis-server --appendonly yes --requirepass redis123
    volumes:
      - redis_data:/data
    restart: unless-stopped
    networks:
      - mmo-network
    healthcheck:
      test: ["CMD", "redis-cli", "-a", "redis123", "ping"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 10s

  # Nginx反向代理(可选)
  nginx:
    image: nginx:1.25-alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./nginx/ssl:/etc/nginx/ssl:ro
      - ./logs/nginx:/var/log/nginx
    depends_on:
      - mmo-server
    restart: unless-stopped
    networks:
      - mmo-network
    profiles:
      - production

  # MongoDB管理界面(开发环境)
  mongo-express:
    image: mongo-express:1.0.0
    ports:
      - "8081:8081"
    environment:
      - ME_CONFIG_MONGODB_ADMINUSERNAME=admin
      - ME_CONFIG_MONGODB_ADMINPASSWORD=admin123
      - ME_CONFIG_MONGODB_URL=mongodb://admin:admin123@mongodb:27017/
      - ME_CONFIG_BASICAUTH_USERNAME=admin
      - ME_CONFIG_BASICAUTH_PASSWORD=admin123
    depends_on:
      - mongodb
    restart: unless-stopped
    networks:
      - mmo-network
    profiles:
      - development

  # Redis管理界面(开发环境)
  redis-commander:
    image: rediscommander/redis-commander:latest
    ports:
      - "8082:8081"
    environment:
      - REDIS_HOSTS=local:redis:6379:0:redis123
      - HTTP_USER=admin
      - HTTP_PASSWORD=admin123
    depends_on:
      - redis
    restart: unless-stopped
    networks:
      - mmo-network
    profiles:
      - development

  # Prometheus监控(生产环境)
  prometheus:
    image: prom/prometheus:v2.47.0
    ports:
      - "9090:9090"
    volumes:
      - ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml:ro
      - prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--web.console.libraries=/etc/prometheus/console_libraries'
      - '--web.console.templates=/etc/prometheus/consoles'
      - '--storage.tsdb.retention.time=200h'
      - '--web.enable-lifecycle'
    restart: unless-stopped
    networks:
      - mmo-network
    profiles:
      - monitoring

  # Grafana仪表板(生产环境)
  grafana:
    image: grafana/grafana:10.1.0
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=admin123
      - GF_USERS_ALLOW_SIGN_UP=false
    volumes:
      - grafana_data:/var/lib/grafana
      - ./monitoring/grafana/provisioning:/etc/grafana/provisioning:ro
    depends_on:
      - prometheus
    restart: unless-stopped
    networks:
      - mmo-network
    profiles:
      - monitoring

volumes:
  mongodb_data:
    driver: local
  nats_data:
    driver: local
  redis_data:
    driver: local
  prometheus_data:
    driver: local
  grafana_data:
    driver: local

networks:
  mmo-network:
    driver: bridge
    ipam:
      config:
        - subnet: 172.20.0.0/16

================================================
FILE: docs/k8s-local.md
================================================
# Run GreatestWorks locally on Kubernetes (Windows)

This guide helps you run the Go services locally on a Kubernetes cluster using Docker Desktop or minikube on Windows PowerShell.

## Prerequisites

- Windows with PowerShell 5.1+
- Docker Desktop (recommended) or minikube
- kubectl in PATH
- (If using minikube) minikube in PATH

## Build images

Build three service images (auth, game, gateway) using the unified Dockerfile:

```
# From repo root
./scripts/build-images.ps1 -Tag dev
```

This produces:
- greatestworks-auth:dev
- greatestworks-game:dev
- greatestworks-gateway:dev

## Deploy to Kubernetes

Docker Desktop (Kubernetes enabled):

```
./scripts/k8s-deploy.ps1 -Namespace gaming -Tag dev
```

Minikube:

```
# Ensure 'minikube start' is already running
./scripts/k8s-deploy.ps1 -UseMinikube -Namespace gaming -Tag dev
```

The script applies:
- Namespace: `gaming`
- Infra: MongoDB (user: admin / pass: admin123), Redis (password: redis123)
- Services: auth-service (HTTP 8080), game-service (RPC 8081), gateway-service (TCP 9090)
- NodePorts: auth-service 30080, gateway-service 30909

## Verify

```
kubectl -n gaming get pods
kubectl -n gaming get svc
```

- Auth HTTP: http://localhost:30080/health
- Gateway TCP: connect to port 30909 from your client

## Notes

- Config files are bundled in the image under `/configs`.
- Auth-service DB URIs and Redis address are overridden via env vars in the Deployment.
- Gateway-service config is provided via a ConfigMap mounted to `/configs/gateway-service.yaml` to point at in-cluster services.
- For non-NodePort clusters, use `kubectl port-forward` as needed.

## Cleanup

```
kubectl delete ns gaming
```


================================================
FILE: go.mod
================================================
module greatestworks

go 1.24.0

require (
	github.com/fsnotify/fsnotify v1.7.0
	github.com/gin-gonic/gin v1.10.0
	github.com/golang-jwt/jwt/v5 v5.2.0
	github.com/google/uuid v1.6.0
	github.com/nats-io/nats.go v1.31.0
	github.com/redis/go-redis/v9 v9.6.1
	go.mongodb.org/mongo-driver v1.13.4
	go.opentelemetry.io/otel/trace v1.38.0
	golang.org/x/crypto v0.37.0
	google.golang.org/protobuf v1.36.10
	gopkg.in/yaml.v3 v3.0.1
)

replace github.com/phuhao00/greatestworks-proto v1.4.8 => ../greatestworks-proto

require (
	github.com/bytedance/sonic v1.14.0 // indirect
	github.com/bytedance/sonic/loader v0.3.0 // indirect
	github.com/cespare/xxhash/v2 v2.3.0 // indirect
	github.com/cloudwego/base64x v0.1.5 // indirect
	github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
	github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
	github.com/gabriel-vasile/mimetype v1.4.8 // indirect
	github.com/gin-contrib/sse v1.1.0 // indirect
	github.com/go-playground/locales v0.14.1 // indirect
	github.com/go-playground/universal-translator v0.18.1 // indirect
	github.com/go-playground/validator/v10 v10.26.0 // indirect
	github.com/goccy/go-json v0.10.5 // indirect
	github.com/golang/snappy v1.0.0 // indirect
	github.com/json-iterator/go v1.1.12 // indirect
	github.com/klauspost/compress v1.18.0 // indirect
	github.com/klauspost/cpuid/v2 v2.2.10 // indirect
	github.com/kr/pretty v0.3.1 // indirect
	github.com/leodido/go-urn v1.4.0 // indirect
	github.com/mattn/go-isatty v0.0.20 // indirect
	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
	github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect
	github.com/montanaflynn/stats v0.7.1 // indirect
	github.com/nats-io/nkeys v0.4.5 // indirect
	github.com/nats-io/nuid v1.0.1 // indirect
	github.com/pelletier/go-toml/v2 v2.2.4 // indirect
	github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
	github.com/rogpeppe/go-internal v1.12.0 // indirect
	github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
	github.com/ugorji/go/codec v1.3.0 // indirect
	github.com/xdg-go/pbkdf2 v1.0.0 // indirect
	github.com/xdg-go/scram v1.1.2 // indirect
	github.com/xdg-go/stringprep v1.0.4 // indirect
	github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
	go.opentelemetry.io/otel v1.38.0 // indirect
	golang.org/x/arch v0.20.0 // indirect
	golang.org/x/net v0.38.0 // indirect
	golang.org/x/sync v0.17.0 // indirect
	golang.org/x/sys v0.32.0 // indirect
	golang.org/x/text v0.24.0 // indirect
	gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
)


================================================
FILE: go.work
================================================
go 1.24.0

use .


================================================
FILE: go.work.sum
================================================
cloud.google.com/go v0.34.0 h1:eOI3/cP2VTU6uZLDYAoic+eyzzB9YyGmJ7eIjl8rOPg=
cloud.google.com/go/auth v0.9.1 h1:+pMtLEV2k0AXKvs/tGZojuj6QaioxfUjOpMsG5Gtx+w=
cloud.google.com/go/auth v0.9.1/go.mod h1:Sw8ocT5mhhXxFklyhT12Eiy0ed6tTrPMCJjSI8KhYLk=
cloud.google.com/go/auth/oauth2adapt v0.2.4 h1:0GWE/FUsXhf6C+jAkWgYm7X9tK8cuEIfy19DBn6B6bY=
cloud.google.com/go/auth/oauth2adapt v0.2.4/go.mod h1:jC/jOpwFP6JBxhB3P5Rr0a9HLMC/Pe3eaL4NmdvqPtc=
cloud.google.com/go/compute/metadata v0.7.0 h1:PBWF+iiAerVNe8UCHxdOt6eHLVc3ydFeOCw78U8ytSU=
cloud.google.com/go/compute/metadata v0.7.0/go.mod h1:j5MvL9PprKL39t166CoB1uVHfQMs4tFQZZcKwksXUjo=
cloud.google.com/go/iam v1.1.13 h1:7zWBXG9ERbMLrzQBRhFliAV+kjcRToDTgQT3CTwYyv4=
cloud.google.com/go/iam v1.1.13/go.mod h1:K8mY0uSXwEXS30KrnVb+j54LB/ntfZu1dr+4zFMNbus=
dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk=
dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s=
dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
github.com/Azure/azure-sdk-for-go v68.0.0+incompatible h1:fcYLmCpyNYRnvJbPerq7U0hS+6+I79yEDJBqVNcqUzU=
github.com/Azure/azure-sdk-for-go v68.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8=
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs=
github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
github.com/Azure/go-autorest/autorest v0.11.28 h1:ndAExarwr5Y+GaHE6VCaY1kyS/HwwGGyuimVhWsHOEM=
github.com/Azure/go-autorest/autorest v0.11.28/go.mod h1:MrkzG3Y3AH668QyF9KRk5neJnGgmhQ6krbhR8Q5eMvA=
github.com/Azure/go-autorest/autorest/adal v0.9.18 h1:kLnPsRjzZZUF3K5REu/Kc+qMQrvuza2bwSnNdhmzLfQ=
github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ=
github.com/Azure/go-autorest/autorest/azure/auth v0.5.12 h1:wkAZRgT/pn8HhFyzfe9UnqOjJYqlembgCTi72Bm/xKk=
github.com/Azure/go-autorest/autorest/azure/auth v0.5.12/go.mod h1:84w/uV8E37feW2NCJ08uT9VBfjfUHpgLVnG2InYD6cg=
github.com/Azure/go-autorest/autorest/azure/cli v0.4.5 h1:0W/yGmFdTIT77fvdlGZ0LMISoLHFJ7Tx4U0yeB+uFs4=
github.com/Azure/go-autorest/autorest/azure/cli v0.4.5/go.mod h1:ADQAXrkgm7acgWVUNamOgh8YNrv4p27l3Wc55oVfpzg=
github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw=
github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74=
github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk=
github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE=
github.com/Azure/go-autorest/autorest/validation v0.3.0 h1:3I9AAI63HfcLtphd9g39ruUwRI+Ca+z/f36KHPFRUss=
github.com/Azure/go-autorest/autorest/validation v0.3.0/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E=
github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg=
github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=
github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo=
github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=
github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg=
github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
github.com/ClickHouse/clickhouse-go v1.5.4 h1:cKjXeYLNWVJIx2J1K6H2CqyRmfwVJVY1OV1coaaFcI0=
github.com/ClickHouse/clickhouse-go v1.5.4/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI=
github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8=
github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 h1:UQUsRi8WTzhZntp5313l+CHIAT95ojUI2lpP/ExlZa4=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0/go.mod h1:Cz6ft6Dkn3Et6l2v2a9/RpN7epQ1GtDlO6lj8bEcOvw=
github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI=
github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc=
github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
github.com/Masterminds/sprig/v3 v3.2.2 h1:17jRggJu518dr3QaafizSXOjKYp94wKfABxUmyxvxX8=
github.com/Masterminds/sprig/v3 v3.2.2/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk=
github.com/Microsoft/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA=
github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY=
github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow=
github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM=
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
github.com/Microsoft/hcsshim v0.9.6 h1:VwnDOgLeoi2du6dAznfmspNqTiwczvjv4K7NxuY9jsY=
github.com/Microsoft/hcsshim v0.9.6/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc=
github.com/Microsoft/hcsshim v0.11.0 h1:7EFNIY4igHEXUdj1zXgAyU3fLc7QfOKHbkldRVTBdiM=
github.com/Microsoft/hcsshim v0.11.0/go.mod h1:OEthFdQv/AD2RAdzR6Mm1N1KPCztGKDurW1Z8b8VGMM=
github.com/NYTimes/gziphandler v1.0.1 h1:iLrQrdwjDd52kHDA5op2UBJFjmOb9g+7scBan4RN8F0=
github.com/NYTimes/gziphandler v1.0.1/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
github.com/Sereal/Sereal/Go/sereal v0.0.0-20231009093132-b9187f1a92c6 h1:5kUcJJAKWWI82Xnp/CaU0eu5hLlHkmm9acjowSkwCd0=
github.com/Sereal/Sereal/Go/sereal v0.0.0-20231009093132-b9187f1a92c6/go.mod h1:JwrycNnC8+sZPDyzM3MQ86LvaGzSpfxg885KOOwFRW4=
github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo=
github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558=
github.com/alecthomas/kingpin/v2 v2.3.1 h1:ANLJcKmQm4nIaog7xdr/id6FM6zm5hHnfZrvtKPxqGg=
github.com/alecthomas/kingpin/v2 v2.3.1/go.mod h1:oYL5vtsvEHZGHxU7DMp32Dvx+qL+ptGn6lWaot2vCNE=
github.com/alecthomas/kingpin/v2 v2.3.2 h1:H0aULhgmSzN8xQ3nX1uxtdlTHYoPLu5AhHxWrKI6ocU=
github.com/alecthomas/kingpin/v2 v2.3.2/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE=
github.com/alecthomas/kingpin/v2 v2.4.0 h1:f48lwail6p8zpO1bC4TxtqACaGqHYA22qkHjHpqDjYY=
github.com/alecthomas/kingpin/v2 v2.4.0/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE=
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM=
github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc=
github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE=
github.com/aliyun/alibaba-cloud-sdk-go v1.62.156 h1:K4N91T1+RlSlx+t2dujeDviy4ehSGVjEltluDgmeHS4=
github.com/aliyun/alibaba-cloud-sdk-go v1.62.156/go.mod h1:Api2AkmMgGaSUAhmk76oaFObkoeCPc/bKAqcyplPODs=
github.com/apparentlymart/go-textseg/v13 v13.0.0 h1:Y+KvPE1NYz0xl601PVImeQfFyEy6iT90AvPUL1NNfNw=
github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo=
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e h1:QEF07wC0T1rKkctt1RINW/+RMTVmiwxETico2l3gxJA=
github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=
github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so=
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
github.com/aws/aws-sdk-go-v2 v1.33.0 h1:Evgm4DI9imD81V0WwD+TN4DCwjUMdc94TrduMLbgZJs=
github.com/aws/aws-sdk-go-v2 v1.33.0/go.mod h1:P5WJBrYqqbWVaOxgH0X/FYYD47/nooaPOZPlQdmiN2U=
github.com/aws/aws-sdk-go-v2/config v1.29.1 h1:JZhGawAyZ/EuJeBtbQYnaoftczcb2drR2Iq36Wgz4sQ=
github.com/aws/aws-sdk-go-v2/config v1.29.1/go.mod h1:7bR2YD5euaxBhzt2y/oDkt3uNRb6tjFp98GlTFueRwk=
github.com/aws/aws-sdk-go-v2/credentials v1.17.54 h1:4UmqeOqJPvdvASZWrKlhzpRahAulBfyTJQUaYy4+hEI=
github.com/aws/aws-sdk-go-v2/credentials v1.17.54/go.mod h1:RTdfo0P0hbbTxIhmQrOsC/PquBZGabEPnCaxxKRPSnI=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.24 h1:5grmdTdMsovn9kPZPI23Hhvp0ZyNm5cRO+IZFIYiAfw=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.24/go.mod h1:zqi7TVKTswH3Ozq28PkmBmgzG1tona7mo9G2IJg4Cis=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.28 h1:igORFSiH3bfq4lxKFkTSYDhJEUCYo6C8VKiWJjYwQuQ=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.28/go.mod h1:3So8EA/aAYm36L7XIvCVwLa0s5N0P7o2b1oqnx/2R4g=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.28 h1:1mOW9zAUMhTSrMDssEHS/ajx8JcAj/IcftzcmNlmVLI=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.28/go.mod h1:kGlXVIWDfvt2Ox5zEaNglmq0hXPHgQFNMix33Tw22jA=
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ=
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc=
github.com/aws/aws-sdk-go-v2/service/ec2 v1.200.0 h1:3hH6o7Z2WeE1twvz44Aitn6Qz8DZN3Dh5IB4Eh2xq7s=
github.com/aws/aws-sdk-go-v2/service/ec2 v1.200.0/go.mod h1:I76S7jN0nfsYTBtuTgTsJtK2Q8yJVDgrLr5eLN64wMA=
github.com/aws/aws-sdk-go-v2/service/ecs v1.53.8 h1:v1OectQdV/L+KSFSiqK00fXGN8FbaljRfNFysmWB8D0=
github.com/aws/aws-sdk-go-v2/service/ecs v1.53.8/go.mod h1:F0DbgxpvuSvtYun5poG67EHLvci4SgzsMVO6SsPUqKk=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 h1:iXtILhvDxB6kPvEXgsDhGaZCSC6LQET5ZHSdJozeI0Y=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1/go.mod h1:9nu0fVANtYiAePIBh2/pFUSwtJ402hLnp854CNoDOeE=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.9 h1:TQmKDyETFGiXVhZfQ/I0cCFziqqX58pi4tKJGYGFSz0=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.9/go.mod h1:HVLPK2iHQBUx7HfZeOQSEu3v2ubZaAY2YPbAm5/WUyY=
github.com/aws/aws-sdk-go-v2/service/sso v1.24.11 h1:kuIyu4fTT38Kj7YCC7ouNbVZSSpqkZ+LzIfhCr6Dg+I=
github.com/aws/aws-sdk-go-v2/service/sso v1.24.11/go.mod h1:Ro744S4fKiCCuZECXgOi760TiYylUM8ZBf6OGiZzJtY=
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.10 h1:l+dgv/64iVlQ3WsBbnn+JSbkj01jIi+SM0wYsj3y/hY=
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.10/go.mod h1:Fzsj6lZEb8AkTE5S68OhcbBqeWPsR8RnGuKPr8Todl8=
github.com/aws/aws-sdk-go-v2/service/sts v1.33.9 h1:BRVDbewN6VZcwr+FBOszDKvYeXY1kJ+GGMCcpghlw0U=
github.com/aws/aws-sdk-go-v2/service/sts v1.33.9/go.mod h1:f6vjfZER1M17Fokn0IzssOTMT2N8ZSq+7jnNF0tArvw=
github.com/aws/smithy-go v1.22.1 h1:/HPHZQ0g7f4eUeK6HKglFz8uwVfZKgoI25rb/J+dnro=
github.com/aws/smithy-go v1.22.1/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg=
github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A=
github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/benbjohnson/immutable v0.4.0 h1:CTqXbEerYso8YzVPxmWxh2gnoRQbbB9X1quUC8+vGZA=
github.com/benbjohnson/immutable v0.4.0/go.mod h1:iAr8OjJGLnLmVUr9MZ/rz4PWUy6Ouc2JLYuMArmvAJM=
github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY=
github.com/boltdb/bolt v1.3.1 h1:JQmyP4ZBrce+ZQu0dY660FMfatumYDLun9hBCUVIkF4=
github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s=
github.com/cenkalti/backoff/v3 v3.0.0 h1:ske+9nBpD9qZsTBoF41nW5L+AIuFBKMeze18XQ3eG1c=
github.com/cenkalti/backoff/v3 v3.0.0/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs=
github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=
github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams=
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=
github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=
github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=
github.com/chenzhuoyu/iasm v0.9.0 h1:9fhXjVzq5hUy2gkhhgHl95zG2cEAhw9OSGs8toWWAwo=
github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=
github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58 h1:F1EaeKL/ta07PY/k9Os/UFtwERei2/XzGemhpGnBKNg=
github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80=
github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=
github.com/containerd/cgroups v1.0.4 h1:jN/mbWBEaz+T1pi5OFtnkQ+8qnmEbAr1Oo1FRm5B0dA=
github.com/containerd/cgroups v1.0.4/go.mod h1:nLNQtsF7Sl2HxNebu77i1R0oDlhiTG+kO4JTrUzo6IA=
github.com/containerd/containerd v1.6.18 h1:qZbsLvmyu+Vlty0/Ex5xc0z2YtKpIsb5n45mAMI+2Ns=
github.com/containerd/containerd v1.6.18/go.mod h1:1RdCUu95+gc2v9t3IL+zIlpClSmew7/0YS8O5eQZrOw=
github.com/containerd/containerd v1.7.3 h1:cKwYKkP1eTj54bP3wCdXXBymmKRQMrWjkLSWZZJDa8o=
github.com/containerd/containerd v1.7.3/go.mod h1:32FOM4/O0RkNg7AjQj3hDzN9cUGtu+HMvaKUNiqCZB8=
github.com/containerd/containerd v1.7.6 h1:oNAVsnhPoy4BTPQivLgTzI9Oleml9l/+eYIDYXRCYo8=
github.com/containerd/containerd v1.7.6/go.mod h1:SY6lrkkuJT40BVNO37tlYTSnKJnP5AXBc0fhx0q+TJ4=
github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI=
github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M=
github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE=
github.com/containerd/errdefs/pkg v0.3.0/go.mod h1:NJw6s9HwNuRhnjJhM7pylWwMyAkmCQvQ4GpJHEqRLVk=
github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I=
github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo=
github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A=
github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw=
github.com/coreos/etcd v3.3.27+incompatible h1:QIudLb9KeBsE5zyYxd1mjzRSkzLg9Wf9QlRwFgd6oTA=
github.com/coreos/etcd v3.3.27+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
github.com/coreos/go-oidc/v3 v3.9.0 h1:0J/ogVOd4y8P0f0xUh8l9t07xRP/d8tccvjHl2dcsSo=
github.com/coreos/go-oidc/v3 v3.9.0/go.mod h1:rTKz2PYwftcrtoCzV5g5kvfJoWcm0Mk8AF8y1iAQro4=
github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4=
github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec=
github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf h1:iW4rZ826su+pqaw19uhpSCzhj44qo35pNgKFGqzDKkU=
github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs=
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/coreos/pkg v0.0.0-20220810130054-c7d1c02cb6cf h1:GOPo6vn/vTN+3IwZBvXX0y5doJfSC7My0cdzelyOCsQ=
github.com/coreos/pkg v0.0.0-20220810130054-c7d1c02cb6cf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
github.com/cosiner/argv v0.1.0 h1:BVDiEL32lwHukgJKP87btEPenzrrHUjajs/8yzaqcXg=
github.com/cosiner/argv v0.1.0/go.mod h1:EusR6TucWKX+zFgtdUsKT2Cvg45K5rtpCcWz4hK06d8=
github.com/cpuguy83/dockercfg v0.3.1 h1:/FpZ+JaygUR/lZP2NlFI2DVfrOEMAIKP5wWEJdoYe9E=
github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc=
github.com/cpuguy83/dockercfg v0.3.2 h1:DlJTyZGBDlXqUZ2Dk2Q3xHs/FtnooJJVaad2S9GKorA=
github.com/cpuguy83/dockercfg v0.3.2/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc=
github.com/creack/pty v1.1.9 h1:uDmaGzcdjhF4i/plgjmEsriH11Y0o7RKapEf/LDaM3w=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-xdr v0.0.0-20161123171359-e6a2ba005892 h1:qg9VbHo1TlL0KDM0vYvBG9EY0X0Yku5WYIPoFWt8f6o=
github.com/davecgh/go-xdr v0.0.0-20161123171359-e6a2ba005892/go.mod h1:CTDl0pzVzE5DEzZhPfvhY/9sPFMQIxaJ9VAMs9AagrE=
github.com/deckarep/golang-set/v2 v2.3.1 h1:vjmkvJt/IV27WXPyYQpAh4bRyWJc5Y435D17XQ9QU5A=
github.com/deckarep/golang-set/v2 v2.3.1/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4=
github.com/denverdino/aliyungo v0.0.0-20170926055100-d3308649c661 h1:lrWnAyy/F72MbxIxFUzKmcMCdt9Oi8RzpAxzTNQHD7o=
github.com/denverdino/aliyungo v0.0.0-20170926055100-d3308649c661/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0=
github.com/digitalocean/godo v1.10.0 h1:uW1/FcvZE/hoixnJcnlmIUvTVNdZCLjRLzmDtRi1xXY=
github.com/digitalocean/godo v1.10.0/go.mod h1:h6faOIcZ8lWIwNQ+DN7b3CgX4Kwby5T+nbpNqkUIozU=
github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U=
github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE=
github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk=
github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
github.com/dmarkham/enumer v1.5.8 h1:fIF11F9l5jyD++YYvxcSH5WgHfeaSGPaN/T4kOQ4qEM=
github.com/dmarkham/enumer v1.5.8/go.mod h1:d10o8R3t/gROm2p3BXqTkMt2+HMuxEmWCXzorAruYak=
github.com/dmarkham/enumer v1.5.9 h1:NM/1ma/AUNieHZg74w67GkHFBNB15muOt3sj486QVZk=
github.com/dmarkham/enumer v1.5.9/go.mod h1:e4VILe2b1nYK3JKJpRmNdl5xbDQvELc6tQ8b+GsGk6E=
github.com/dmarkham/enumer v1.6.1 h1:aSc9awYtZL07TUueWs40QcHtxTvHTAwG0EqrNsK45w4=
github.com/dmarkham/enumer v1.6.1/go.mod h1:yixql+kDDQRYqcuBM2n9Vlt7NoT9ixgXhaXry8vmRg8=
github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8=
github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
github.com/docker/docker v20.10.22+incompatible h1:6jX4yB+NtcbldT90k7vBSaWJDB3i+zkVJT9BEK8kQkk=
github.com/docker/docker v20.10.22+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
github.com/docker/docker v24.0.5+incompatible h1:WmgcE4fxyI6EEXxBRxsHnZXrO1pQ3smi0k/jho4HLeY=
github.com/docker/docker v24.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
github.com/docker/docker v24.0.6+incompatible h1:hceabKCtUgDqPu+qm0NgsaXf28Ljf4/pWFL7xjWWDgE=
github.com/docker/docker v24.0.6+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
github.com/docker/docker v28.4.0+incompatible h1:KVC7bz5zJY/4AZe/78BIvCnPsLaC9T/zh72xnlrTTOk=
github.com/docker/docker v28.4.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ=
github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c=
github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc=
github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw=
github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ=
github.com/emicklei/go-restful/v3 v3.10.1 h1:rc42Y5YTp7Am7CS630D7JmhRjq4UlEUuEKfrDac4bSQ=
github.com/emicklei/go-restful/v3 v3.10.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
github.com/envoyproxy/go-control-plane/contrib v1.32.4 h1:/udV6s9xkDGe13WfrT2MHAxXTNDMBYBPxI1GkleCrmM=
github.com/envoyproxy/go-control-plane/contrib v1.32.4/go.mod h1:gkGYoY7plfQg7FPBDhyKtP1cDA9frFR/3YsCx8taRvI=
github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI=
github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4=
github.com/envoyproxy/go-control-plane/xdsmatcher v0.13.4 h1:fjfDu4egQNml0gl63Jd9gRFruSW+sDgJPIt4lcVvNCs=
github.com/envoyproxy/go-control-plane/xdsmatcher v0.13.4/go.mod h1:Yi7sK6Hs9iURfbHRKDKWvCJ1KpVMzWM2rktIIosIxKU=
github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=
github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk=
github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY=
github.com/fullstorydev/grpchan v1.1.1 h1:heQqIJlAv5Cnks9a70GRL2EJke6QQoUB25VGR6TZQas=
github.com/fullstorydev/grpchan v1.1.1/go.mod h1:f4HpiV8V6htfY/K44GWV1ESQzHBTq7DinhzqQ95lpgc=
github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM=
github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ=
github.com/gin-contrib/cors v1.4.0/go.mod h1:bs9pNM0x/UsmHPBWT2xZz9ROh8xYjYkiURUfmBoMlcs=
github.com/gin-contrib/requestid v0.0.6/go.mod h1:9i4vKATX/CdggbkY252dPVasgVucy/ggBeELXuQztm4=
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
github.com/gin-contrib/timeout v1.1.0/go.mod h1:NpRo4gd1Ad8ZQ4T6bQLVFDqiplCmPRs2nvfckxS2Fw4=
github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk=
github.com/go-jose/go-jose/v3 v3.0.4 h1:Wp5HA7bLQcKnf6YYao/4kpRpVMp/yf6+pJKV8WFSaNY=
github.com/go-jose/go-jose/v3 v3.0.4/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ=
github.com/go-jose/go-jose/v4 v4.1.1 h1:JYhSgy4mXXzAdF3nUx3ygx347LRXJRrpgyU3adRmkAI=
github.com/go-jose/go-jose/v4 v4.1.1/go.mod h1:BdsZGqgdO3b6tTc6LSE56wcDbMMLuPsw5d4ZD5f94kA=
github.com/go-kit/kit v0.9.0 h1:wDJmvq38kDhkVxi50ni9ykkdUr1PKgqKOoi01fa0Mdk=
github.com/go-kit/log v0.1.0 h1:DGJh0Sm43HbOeYDNnVZFl8BvcYVvjD5bqYJvp0REbwQ=
github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU=
github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
github.com/go-logfmt/logfmt v0.5.0 h1:TrB8swr/68K7m9CcGut2g3UOihhbcbiMAYiuTXdEih4=
github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA=
github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-openapi/analysis v0.21.5 h1:3tHfEBh6Ia8eKc4M7khOGjPOAlWKJ10d877Cr9teujI=
github.com/go-openapi/analysis v0.21.5/go.mod h1:25YcZosX9Lwz2wBsrFrrsL8bmjjXdlyP6zsr2AMy29M=
github.com/go-openapi/errors v0.22.0 h1:c4xY/OLxUBSTiepAg3j/MHuAv5mJhnf53LLMWFB+u/w=
github.com/go-openapi/errors v0.22.0/go.mod h1:J3DmZScxCDufmIMsdOuDHxJbdOGC0xtUynjIx092vXE=
github.com/go-openapi/jsonpointer v0.20.1 h1:MkK4VEIEZMj4wT9PmjaUmGflVBr9nvud4Q4UVFbDoBE=
github.com/go-openapi/jsonpointer v0.20.1/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs=
github.com/go-openapi/jsonreference v0.20.3 h1:EjGcjTW8pD1mRis6+w/gmoBdqv5+RbE9B85D1NgDOVQ=
github.com/go-openapi/jsonreference v0.20.3/go.mod h1:FviDZ46i9ivh810gqzFLl5NttD5q3tSlMLqLr6okedM=
github.com/go-openapi/loads v0.21.3 h1:8sSH2FIm/SnbDUGv572md4YqVMFne/a9Eubvcd3anew=
github.com/go-openapi/loads v0.21.3/go.mod h1:Y3aMR24iHbKHppOj91nQ/SHc0cuPbAr4ndY4a02xydc=
github.com/go-openapi/runtime v0.26.2 h1:elWyB9MacRzvIVgAZCBJmqTi7hBzU0hlKD4IvfX0Zl0=
github.com/go-openapi/runtime v0.26.2/go.mod h1:O034jyRZ557uJKzngbMDJXkcKJVzXJiymdSfgejrcRw=
github.com/go-openapi/spec v0.20.12 h1:cgSLbrsmziAP2iais+Vz7kSazwZ8rsUZd6TUzdDgkVI=
github.com/go-openapi/spec v0.20.12/go.mod h1:iSCgnBcwbMW9SfzJb8iYynXvcY6C/QFrI7otzF7xGM4=
github.com/go-openapi/strfmt v0.23.0 h1:nlUS6BCqcnAk0pyhi9Y+kdDVZdZMHfEKQiS4HaMgO/c=
github.com/go-openapi/strfmt v0.23.0/go.mod h1:NrtIpfKtWIygRkKVsxh7XQMDQW5HKQl6S5ik2elW+K4=
github.com/go-openapi/swag v0.22.5 h1:fVS63IE3M0lsuWRzuom3RLwUMVI2peDH01s6M70ugys=
github.com/go-openapi/swag v0.22.5/go.mod h1:Gl91UqO+btAM0plGGxHqJcQZ1ZTy6jbmridBTsDy8A0=
github.com/go-openapi/validate v0.22.4 h1:5v3jmMyIPKTR8Lv9syBAIRxG6lY0RqeBPB1LKEijzk8=
github.com/go-openapi/validate v0.22.4/go.mod h1:qm6O8ZIcPVdSY5219468Jv7kBdGvkiZLPOmqnqTUZ2A=
github.com/go-ozzo/ozzo-validation v3.6.0+incompatible h1:msy24VGS42fKO9K1vLz82/GeYW1cILu7Nuuj1N3BBkE=
github.com/go-ozzo/ozzo-validation v3.6.0+incompatible/go.mod h1:gsEKFIVnabGBt6mXmxK0MoFy+cZoTJY6mu5Ll3LVLBU=
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs=
github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA=
github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos=
github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js=
github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I=
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI=
github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
github.com/golang/glog v1.2.5 h1:DrW6hGnjIhtvhOIiAKT6Psh/Kd/ldepEa81DKeiRJ5I=
github.com/golang/glog v1.2.5/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
github.com/golang/protobuf v1.5.0 h1:LUVKkCeviFUMKqHa4tXIIij/lbhnMbP7Fn5wKdKkRh4=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54=
github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk=
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw=
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE=
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo=
github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM=
github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA=
github.com/google/tcpproxy v0.0.0-20180808230851-dfa16c61dad2 h1:AtvtonGEH/fZK0XPNNBdB6swgy7Iudfx88wzyIpwqJ8=
github.com/google/tcpproxy v0.0.0-20180808230851-dfa16c61dad2/go.mod h1:DavVbd41y+b7ukKDmlnPR4nGYmkWXR6vHUkjQNiHPBs=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs=
github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0=
github.com/googleapis/gax-go/v2 v2.13.0 h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s=
github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A=
github.com/gophercloud/gophercloud v0.3.0 h1:6sjpKIpVwRIIwmcEGp+WwNovNsem+c+2vm6oxshRpL8=
github.com/gophercloud/gophercloud v0.3.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8=
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 h1:JeSE6pjso5THxAzdVpqr6/geYxZytqFMBCOtn/ujyeo=
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w70xmWCQKmi1ONH4KIaBptdivuRPyosB9RmPlGEwA=
github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI=
github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 h1:5ZPtiqj0JL5oKWmcsq4VMaAW5ukBEgSGXEN89zeH1Jo=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3/go.mod h1:ndYquD05frm2vACXE1nsccT4oJzjhw2arTS2cpUD1PI=
github.com/hashi-derek/grpc-proxy v0.0.0-20231207191910-191266484d75 h1:V5Uqf7VoWMd6UhNf/5EMA8LMPUm95GYvk2YF5SzT24o=
github.com/hashi-derek/grpc-proxy v0.0.0-20231207191910-191266484d75/go.mod h1:5eEnHfK72jOkp4gC1dI/Q/E9MFNOM/ewE/vql5ijV3g=
github.com/hashicorp/consul-awsauth v0.0.0-20250825122907-9e35fe9ded3a h1:Qd0N8lIr1QP/d7FYxseYjRLUtJp2+2R8k+mjiC2rmiY=
github.com/hashicorp/consul-awsauth v0.0.0-20250825122907-9e35fe9ded3a/go.mod h1:++exZ1sI8JLIv4QvzGvTjZdf1eZARoZcaNEjNT9SZYA=
github.com/hashicorp/consul/api v1.32.1 h1:0+osr/3t/aZNAdJX558crU3PEjVrG4x6715aZHRgceE=
github.com/hashicorp/consul/api v1.32.1/go.mod h1:mXUWLnxftwTmDv4W3lzxYCPD199iNLLUyLfLGFJbtl4=
github.com/hashicorp/consul/troubleshoot v0.7.6 h1:Ts+cbAn0aM9sWXY+clpfJx0mFl8IKB/rPqh172cOr0I=
github.com/hashicorp/consul/troubleshoot v0.7.6/go.mod h1:Wjh5zhikXsr7fhvvTf0qXc1FmfwCOrf50d92vmY9nfA=
github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
github.com/hashicorp/go-checkpoint v0.5.0 h1:MFYpPZCnQqQTE18jFwSII6eUQrD/oxMFp3mlgcqk5mU=
github.com/hashicorp/go-checkpoint v0.5.0/go.mod h1:7nfLNL10NsxqO4iWuW6tWW0HjZuDrwkBuEQsVcpCOgg=
github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=
github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=
github.com/hashicorp/go-connlimit v0.3.0 h1:oAojHGjFxUTTTA8c5XXnDqWJ2HLuWbDiBPTpWvNzvqM=
github.com/hashicorp/go-connlimit v0.3.0/go.mod h1:OUj9FGL1tPIhl/2RCfzYHrIiWj+VVPGNyVPnUX8AqS0=
github.com/hashicorp/go-discover v1.1.0 h1:FN5AXXBCXbEMVq/BYk+qkYRhr+lwYgvBro2hMBUtnlA=
github.com/hashicorp/go-discover v1.1.0/go.mod h1:jqvs0vDZPpnKlN21oG80bwkiIKPGCrmKChV6qItAjI0=
github.com/hashicorp/go-discover/provider/gce v0.0.0-20241120163552-5eb1507d16b4 h1:ywaDsVo7n5ko12YD8uXjuQ8G2mQhC2mxAc4Kj3WW3GE=
github.com/hashicorp/go-discover/provider/gce v0.0.0-20241120163552-5eb1507d16b4/go.mod h1:yxikfLXA8Y5JA3FcFTR720PfqVEFd0dZY9FBpmcsO54=
github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c=
github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=
github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=
github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
github.com/hashicorp/go-immutable-radix/v2 v2.1.0 h1:CUW5RYIcysz+D3B+l1mDeXrQ7fUvGGCwJfdASSzbrfo=
github.com/hashicorp/go-immutable-radix/v2 v2.1.0/go.mod h1:hgdqLXA4f6NIjRVisM1TJ9aOJVNRqKZj+xDGF6m7PBw=
github.com/hashicorp/go-memdb v1.3.4 h1:XSL3NR682X/cVk2IeV0d70N4DZ9ljI885xAEU8IoK3c=
github.com/hashicorp/go-memdb v1.3.4/go.mod h1:uBTr1oQbtuMgd1SSGoR8YV27eT3sBHbYiNm53bMpgSg=
github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
github.com/hashicorp/go-raftchunking v0.7.0 h1:APNMnCXmTOhumkFv/GpJIbq7HteWF7EnGZ3875lRN0Y=
github.com/hashicorp/go-raftchunking v0.7.0/go.mod h1:Dg/eBOaJzE0jYKNwNLs5IA5j0OSmL5HoCUiMy3mDmrI=
github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=
github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=
github.com/hashicorp/go-secure-stdlib/awsutil v0.1.6 h1:W9WN8p6moV1fjKLkeqEgkAMu5rauy9QeYDAmIaPuuiA=
github.com/hashicorp/go-secure-stdlib/awsutil v0.1.6/go.mod h1:MpCPSPGLDILGb4JMm94/mMi3YysIqsXzGCzkEZjcjXg=
github.com/hashicorp/go-secure-stdlib/parseutil v0.1.6 h1:om4Al8Oy7kCm/B86rLCLah4Dt5Aa0Fr5rYBG60OzwHQ=
github.com/hashicorp/go-secure-stdlib/parseutil v0.1.6/go.mod h1:QmrqtbKuxxSWTN3ETMPuB+VtEiBJ/A9XhoYGv8E1uD8=
github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 h1:kes8mmyCpxJsI7FTwtzRqEy9CdjCtrXrXGuOpxEA7Ts=
github.com/hashicorp/go-secure-stdlib/strutil v0.1.2/go.mod h1:Gou2R9+il93BqX25LAKCLuM+y9U2T4hlwvT1yprcna4=
github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek=
github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY=
github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=
github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
github.com/hashicorp/golang-lru/v2 v2.0.0 h1:Lf+9eD8m5pncvHAOCQj49GSN6aQI8XGfI5OpXNkoWaA=
github.com/hashicorp/golang-lru/v2 v2.0.0/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
github.com/hashicorp/hcdiag v0.5.1 h1:KZcx9xzRfEOQ2OMbwPxVvHyXwLLRqYpSHxCEOtHfQ6w=
github.com/hashicorp/hcdiag v0.5.1/go.mod h1:RMC2KkffN9uJ+5mFSaL67ZFVj4CDeetPF2d/53XpwXo=
github.com/hashicorp/hcl/v2 v2.14.1 h1:x0BpjfZ+CYdbiz+8yZTQ+gdLO7IXvOut7Da+XJayx34=
github.com/hashicorp/hcl/v2 v2.14.1/go.mod h1:e4z5nxYlWNPdDSNYX+ph14EvWYMFm3eP0zIUqPc2jr0=
github.com/hashicorp/hcp-scada-provider v0.2.6 h1:nGBrrPpL9B+6jOrvYkOUULuEB+HpAjySYa5rrL4eaaE=
github.com/hashicorp/hcp-scada-provider v0.2.6/go.mod h1:ZFTgGwkzNv99PLQjTsulzaCplCzOTBh0IUQsPKzrQFo=
github.com/hashicorp/hcp-sdk-go v0.80.0 h1:oKGx7+X0llBN5NEpkWg0Qe3x9DIAH6cc3MrxZptDB7Y=
github.com/hashicorp/hcp-sdk-go v0.80.0/go.mod h1:vQ4fzdL1AmhIAbCw+4zmFe5Hbpajj3NvRWkJoVuxmAk=
github.com/hashicorp/hil v0.0.0-20200423225030-a18a1cd20038 h1:n9J0rwVWXDpNd5iZnwY7w4WZyq53/rROeI7OVvLW8Ok=
github.com/hashicorp/hil v0.0.0-20200423225030-a18a1cd20038/go.mod h1:n2TSygSNwsLJ76m8qFXTSc7beTb+auJxYdqrnoqwZWE=
github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y=
github.com/hashicorp/mdns v1.0.4 h1:sY0CMhFmjIPDMlTB+HfymFHCaYLhgifZ0QhjaYKD/UQ=
github.com/hashicorp/net-rpc-msgpackrpc/v2 v2.0.0 h1:kBpVVl1sl3MaSrs97e0+pDQhSrqJv9gVbSUrPpVfl1w=
github.com/hashicorp/net-rpc-msgpackrpc/v2 v2.0.0/go.mod h1:6pdNz0vo0mF0GvhwDG56O3N18qBrAz/XRIcfINfTbwo=
github.com/hashicorp/raft-boltdb v0.0.0-20171010151810-6e5ba93211ea h1:xykPFhrBAS2J0VBzVa5e80b5ZtYuNQtgXjN40qBZlD4=
github.com/hashicorp/raft-boltdb/v2 v2.2.2 h1:rlkPtOllgIcKLxVT4nutqlTH2NRFn+tO1wwZk/4Dxqw=
github.com/hashicorp/raft-boltdb/v2 v2.2.2/go.mod h1:N8YgaZgNJLpZC+h+by7vDu5rzsRgONThTEeUS3zWbfY=
github.com/hashicorp/raft-wal v0.4.1 h1:aU8XZ6x8R9BAIB/83Z1dTDtXvDVmv9YVYeXxd/1QBSA=
github.com/hashicorp/raft-wal v0.4.1/go.mod h1:A6vP5o8hGOs1LHfC1Okh9xPwWDcmb6Vvuz/QyqUXlOE=
github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=
github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=
github.com/hashicorp/vault-plugin-auth-alicloud v0.14.0 h1:O6tNk0s/arubLUbLeCyaRs5xGo9VwmbQazISY/BfPK4=
github.com/hashicorp/vault-plugin-auth-alicloud v0.14.0/go.mod h1:We3fJplmALwK1VpjwrLuXr/4QCQHYMdnXLHmLUU6Ntg=
github.com/hashicorp/vault/api v1.12.2 h1:7YkCTE5Ni90TcmYHDBExdt4WGJxhpzaHqR6uGbQb/rE=
github.com/hashicorp/vault/api v1.12.2/go.mod h1:LSGf1NGT1BnvFFnKVtnvcaLBM2Lz+gJdpL6HUYed8KE=
github.com/hashicorp/vault/api/auth/gcp v0.3.0 h1:taum+3pCmOXnNgEKHlQbmgXmKw5daWHk7YJrLPP/w8g=
github.com/hashicorp/vault/api/auth/gcp v0.3.0/go.mod h1:gnNBFOASYUaFunedTHOzdir7vKcHL3skWBUzEn263bo=
github.com/hashicorp/vault/sdk v0.7.0 h1:2pQRO40R1etpKkia5fb4kjrdYMx3BHklPxl1pxpxDHg=
github.com/hashicorp/vault/sdk v0.7.0/go.mod h1:KyfArJkhooyba7gYCKSq8v66QdqJmnbAxtV/OX1+JTs=
github.com/hashicorp/vic v1.5.1-0.20190403131502-bbfe86ec9443 h1:O/pT5C1Q3mVXMyuqg7yuAWUg/jMZR1/0QTzTRdNR6Uw=
github.com/hashicorp/vic v1.5.1-0.20190403131502-bbfe86ec9443/go.mod h1:bEpDU35nTu0ey1EXjwNwPjI9xErAsoOCmcMb9GKvyxo=
github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw=
github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=
github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=
github.com/imdario/mergo v0.3.15 h1:M8XP7IuFNsqUx6VPK2P9OSmsYsI/YFaGil0uD21V3dM=
github.com/imdario/mergo v0.3.15/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk=
github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo=
github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
github.com/jhump/protoreflect v1.11.0 h1:bvACHUD1Ua/3VxY4aAMpItKMhhwbimlKFJKsLsVgDjU=
github.com/jhump/protoreflect v1.11.0/go.mod h1:U7aMIjN0NWq9swDP7xDdoMfRHb35uiuTd3Z9nFXJf5E=
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
github.com/joyent/triton-go v1.7.1-0.20200416154420-6801d15b779f h1:ENpDacvnr8faw5ugQmEF1QYk+f/Y9lXFvuYmRxykago=
github.com/joyent/triton-go v1.7.1-0.20200416154420-6801d15b779f/go.mod h1:KDSfL7qe5ZfQqvlDMkVjCztbmcpp/c8M77vhQP8ZPvk=
github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA=
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U=
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
github.com/kisielk/errcheck v1.5.0 h1:e8esj/e4R+SAOwFwN+n3zr0nYeCyeweozKfO23MvHzY=
github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg=
github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=
github.com/klauspost/reedsolomon v1.12.0 h1:I5FEp3xSwVCcEh3F5A7dofEfhXdF/bWhQWPH+XwBFno=
github.com/klauspost/reedsolomon v1.12.0/go.mod h1:EPLZJeh4l27pUGC3aXOjheaoh1I9yut7xTURiW3LQ9Y=
github.com/knz/go-libedit v1.10.1 h1:0pHpWtx9vcvC0xGZqEQlQdfSQs7WRlAjuPvk3fOZDCo=
github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8=
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
github.com/kr/pty v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw=
github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q=
github.com/linode/linodego v0.10.0 h1:AMdb82HVgY8o3mjBXJcUv9B+fnJjfDMn2rNRGbX+jvM=
github.com/linode/linodego v0.10.0/go.mod h1:cziNP7pbvE3mXIPneHj0oRY8L1WtGEIKlZ8LANE4eXA=
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4=
github.com/lyft/protoc-gen-star/v2 v2.0.4-0.20230330145011-496ad1ac90a4 h1:sIXJOMrYnQZJu7OB7ANSF4MYri2fTEGIsRLz6LwI4xE=
github.com/lyft/protoc-gen-star/v2 v2.0.4-0.20230330145011-496ad1ac90a4/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk=
github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo=
github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
github.com/magiconair/properties v1.8.10 h1:s31yESBquKXCV9a/ScB3ESkOjUYYv+X0rg8SYxI99mE=
github.com/magiconair/properties v1.8.10/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU=
github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg=
github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k=
github.com/mitchellh/cli v1.1.4 h1:qj8czE26AU4PbiaPXK5uVmMSM+V5BYsFBiM9HhGRLUA=
github.com/mitchellh/cli v1.1.4/go.mod h1:vTLESy5mRhKOs9KDp0/RATawxP1UqBmdrpVRMnpcvKQ=
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ=
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw=
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc=
github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg=
github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0=
github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0=
github.com/mitchellh/hashstructure/v2 v2.0.2 h1:vGKWl0YJqUNxE8d+h8f6NJLcCJrgbhC4NcD46KavDd4=
github.com/mitchellh/hashstructure/v2 v2.0.2/go.mod h1:MG3aRVU/N29oo/V/IhBX8GR/zz4kQkprJgF2EVszyDE=
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/mkevac/debugcharts v0.0.0-20191222103121-ae1c48aa8615 h1:/mD+ABZyXD39BzJI2XyRJlqdZG11gXFo0SSynL+OFeU=
github.com/mkevac/debugcharts v0.0.0-20191222103121-ae1c48aa8615/go.mod h1:Ad7oeElCZqA1Ufj0U9/liOF4BtVepxRcTvr2ey7zTvM=
github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0=
github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo=
github.com/moby/go-archive v0.1.0 h1:Kk/5rdW/g+H8NHdJW2gsXyZ7UnzvJNOy6VKJqueWdcQ=
github.com/moby/go-archive v0.1.0/go.mod h1:G9B+YoujNohJmrIYFBpSd54GTUB4lt9S+xVQvsJyFuo=
github.com/moby/patternmatcher v0.5.0 h1:YCZgJOeULcxLw1Q+sVR636pmS7sPEn1Qo2iAN6M7DBo=
github.com/moby/patternmatcher v0.5.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc=
github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk=
github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc=
github.com/moby/sys/mount v0.3.3 h1:fX1SVkXFJ47XWDoeFW4Sq7PdQJnV2QIDZAqjNqgEjUs=
github.com/moby/sys/mount v0.3.3/go.mod h1:PBaEorSNTLG5t/+4EgukEQVlAvVEc6ZjTySwKdqp5K0=
github.com/moby/sys/mountinfo v0.6.2 h1:BzJjoreD5BMFNmD9Rus6gdd1pLuecOFPt8wC+Vygl78=
github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI=
github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc=
github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo=
github.com/moby/sys/sequential v0.6.0 h1:qrx7XFUd/5DxtqcoH1h438hF5TmOvzC/lspjy7zgvCU=
github.com/moby/sys/sequential v0.6.0/go.mod h1:uyv8EUTrca5PnDsdMGXhZe6CCe8U/UiTWd+lL+7b/Ko=
github.com/moby/sys/user v0.4.0 h1:jhcMKit7SA80hivmFJcbB1vqmw//wU61Zdui2eQXuMs=
github.com/moby/sys/user v0.4.0/go.mod h1:bG+tYYYJgaMtRKgEmuueC0hJEAZWwtIbZTB+85uoHjs=
github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g=
github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28=
github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc=
github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw=
github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0=
github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y=
github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=
github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU=
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/natefinch/npipe v0.0.0-20160621034901-c1b8fa8bdcce h1:TqjP/BTDrwN7zP9xyXVuLsMBXYMt6LLYi55PlrIcq8U=
github.com/natefinch/npipe v0.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:ifHPsLndGGzvgzcaXUvzmt6LxKT4pJ+uzEhtnMt+f7A=
github.com/nicolai86/scaleway-sdk v1.10.2-0.20180628010248-798f60e20bb2 h1:BQ1HW7hr4IVovMwWg0E0PYcyW8CzqDcVmaew9cujU4s=
github.com/nicolai86/scaleway-sdk v1.10.2-0.20180628010248-798f60e20bb2/go.mod h1:TLb2Sg7HQcgGdloNxkrmtgDNR9uVYF3lfdFIN4Ro6Sk=
github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4=
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
github.com/oklog/ulid/v2 v2.1.0 h1:+9lhoxAP56we25tyYETBBY1YLA2SaoLvUFgrP2miPJU=
github.com/oklog/ulid/v2 v2.1.0/go.mod h1:rcEKHmBBKfef9DhnvX7y1HZBYxjXb0cP5ExxNsTT1QQ=
github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8=
github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA=
github.com/onsi/ginkgo/v2 v2.2.0 h1:3ZNA3L1c5FYDFTTxbFeVGGD8jYvjYauHD30YgLxVsNI=
github.com/onsi/ginkgo/v2 v2.2.0/go.mod h1:MEH45j8TBi6u9BMogfbp0stKC5cdGjumZj5Y7AG4VIk=
github.com/onsi/ginkgo/v2 v2.9.5 h1:+6Hr4uxzP4XIUyAkg61dWBw8lb/gc4/X5luuxN/EC+Q=
github.com/onsi/ginkgo/v2 v2.9.5/go.mod h1:tvAoo1QUJwNEU2ITftXTpR7R1RbCzoZUOs3RonqW57k=
github.com/onsi/ginkgo/v2 v2.21.0 h1:7rg/4f3rB88pb5obDgNZrNHrQ4e6WpjonchcpuBRnZM=
github.com/onsi/ginkgo/v2 v2.21.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo=
github.com/onsi/gomega v1.20.1 h1:PA/3qinGoukvymdIDV8pii6tiZgC8kbmJO6Z5+b002Q=
github.com/onsi/gomega v1.20.1/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo=
github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE=
github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg=
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 h1:rc3tiVYb5z54aKaDfakKn0dDjIyPpTtszkjuMzyt7ec=
github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
github.com/opencontainers/image-spec v1.1.0-rc4 h1:oOxKUJWnFC4YGHCCMNql1x4YaDfYBTS5Y4x/Cgeo1E0=
github.com/opencontainers/image-spec v1.1.0-rc4/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8=
github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040=
github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M=
github.com/opencontainers/runc v1.1.5 h1:L44KXEpKmfWDcS02aeGm8QNTFXTo2D+8MYGDIJ/GDEs=
github.com/opencontainers/runc v1.1.5/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg=
github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b h1:FfH+VrHHk6Lxt9HdVS0PXzSXFyS2NbZKXv33FYPol0A=
github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b/go.mod h1:AC62GU6hc0BrNm+9RK9VSiwa/EUe1bkIeFORAMcHvJU=
github.com/packethost/packngo v0.1.1-0.20180711074735-b9cb5096f54c h1:vwpFWvAO8DeIZfFeqASzZfsxuWPno9ncAebBEP0N3uE=
github.com/packethost/packngo v0.1.1-0.20180711074735-b9cb5096f54c/go.mod h1:otzZQXgoO96RTzDB/Hycg0qZcXZsWJGJRSXbmEIJ+4M=
github.com/pascaldekloe/name v1.0.1 h1:9lnXOHeqeHHnWLbKfH6X98+4+ETVqFqxN09UXSjcMb0=
github.com/pascaldekloe/name v1.0.1/go.mod h1:Z//MfYJnH4jVpQ9wkclwu2I2MkHmXTlT9wR5UZScttM=
github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc=
github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ=
github.com/paulmach/protoscan v0.2.1 h1:rM0FpcTjUMvPUNk2BhPJrreDKetq43ChnL+x1sRg8O8=
github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo=
github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ=
github.com/philhofer/fwd v1.1.2 h1:bnDivRJ1EWPjUIRXV5KfORO897HTbpFAQddBdE8t7Gw=
github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0=
github.com/phuhao00/netcore-go v1.0.1/go.mod h1:kW1PqBl/F24G/XolcotkSyVYrpsAl3yY7JuL+GXTaU4=
github.com/pierrec/lz4 v2.6.1+incompatible h1:9UY3+iC23yxF0UfGaYrGplQ+79Rg+h/q9FV9ix19jjM=
github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXqo=
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw=
github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 h1:xoIK0ctDddBMnc74udxJYBqlo9Ylnsp1waqjLsnef20=
github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M=
github.com/quic-go/qtls-go1-19 v0.3.2 h1:tFxjCFcTQzK+oMxG6Zcvp4Dq8dx4yD3dDiIiyc86Z5U=
github.com/quic-go/qtls-go1-19 v0.3.2/go.mod h1:ySOI96ew8lnoKPtSqx2BlI5wCpUVPT05RMAlajtnyOI=
github.com/quic-go/qtls-go1-20 v0.2.2 h1:WLOPx6OY/hxtTxKV1Zrq20FtXtDEkeY00CGQm8GEa3E=
github.com/quic-go/qtls-go1-20 v0.2.2/go.mod h1:JKtK6mjbAVcUTN/9jZpvLbGxvdWIKS8uT7EiStoU1SM=
github.com/quic-go/quic-go v0.48.2 h1:wsKXZPeGWpMpCGSWqOcqpW2wZYic/8T3aqiOID0/KWE=
github.com/quic-go/quic-go v0.48.2/go.mod h1:yBgs3rWBOADpga7F+jJsb6Ybg1LSYiQvwWlLX+/6HMs=
github.com/rboyer/safeio v0.2.3 h1:gUybicx1kp8nuM4vO0GA5xTBX58/OBd8MQuErBfDxP8=
github.com/rboyer/safeio v0.2.3/go.mod h1:d7RMmt7utQBJZ4B7f0H/cU/EdZibQAU1Y8NWepK2dS8=
github.com/redis/go-redis/v9 v9.3.0/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=
github.com/renier/xmlrpc v0.0.0-20170708154548-ce4a1a486c03 h1:Wdi9nwnhFNAlseAOekn6B5G/+GMtks9UKbvRU/CMM/o=
github.com/renier/xmlrpc v0.0.0-20170708154548-ce4a1a486c03/go.mod h1:gRAiPF5C5Nd0eyyRdqIu9qTiFSoZzpTq727b5B8fkkU=
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
github.com/ryanuber/columnize v2.1.2+incompatible h1:C89EOx/XBWwIXl8wm8OPJBd7kPF25UfsK2X7Ph/zCAk=
github.com/ryanuber/columnize v2.1.2+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk=
github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc=
github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
github.com/segmentio/fasthash v1.0.3 h1:EI9+KE1EwvMLBWwjpRDc+fEM+prwxDYbslddQGtrmhM=
github.com/segmentio/fasthash v1.0.3/go.mod h1:waKX8l2N8yckOgmSsXJi7x1ZfdKZ4x7KRMzBtS3oedY=
github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI=
github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
github.com/shirou/gopsutil/v4 v4.25.5 h1:rtd9piuSMGeU8g1RMXjZs9y9luK5BwtnG7dZaQUJAsc=
github.com/shirou/gopsutil/v4 v4.25.5/go.mod h1:PfybzyydfZcN+JMMjkF6Zb8Mq1A/VcogFFg7hj50W9c=
github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8=
github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 h1:JIAuq3EEf9cgbU6AtGPK4CTG3Zf6CKMNqf0MHTggAUA=
github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog=
github.com/softlayer/softlayer-go v0.0.0-20180806151055-260589d94c7d h1:bVQRCxQvfjNUeRqaY/uT0tFuvuFY0ulgnczuR684Xic=
github.com/softlayer/softlayer-go v0.0.0-20180806151055-260589d94c7d/go.mod h1:Cw4GTlQccdRGSEf6KiMju767x0NEHE0YIVPJSaXjlsw=
github.com/spf13/afero v1.10.0 h1:EaGW2JJh15aKOejeuJ+wpFSHnbd7GE6Wvp3TsNhb6LY=
github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ=
github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w=
github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU=
github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s=
github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0=
github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=
github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spiffe/go-spiffe/v2 v2.5.0 h1:N2I01KCUkv1FAjZXJMwh95KK1ZIQLYbPfhaxw8WS0hE=
github.com/spiffe/go-spiffe/v2 v2.5.0/go.mod h1:P+NxobPc6wXhVtINNtFjNWGBTreew1GBUCwT2wPmb7g=
github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/tencentcloud/tencentcloud-sdk-go v1.0.162 h1:8fDzz4GuVg4skjY2B0nMN7h6uN61EDVkuLyI2+qGHhI=
github.com/tencentcloud/tencentcloud-sdk-go v1.0.162/go.mod h1:asUz5BPXxgoPGaRgZaVm1iGcUAuHyYUo1nXqKa83cvI=
github.com/testcontainers/testcontainers-go v0.14.0 h1:h0D5GaYG9mhOWr2qHdEKDXpkce/VlvaYOCzTRi6UBi8=
github.com/testcontainers/testcontainers-go v0.14.0/go.mod h1:hSRGJ1G8Q5Bw2gXgPulJOLlEBaYJHeBSOkQM5JLG+JQ=
github.com/testcontainers/testcontainers-go v0.23.0 h1:ERYTSikX01QczBLPZpqsETTBO7lInqEP349phDOVJVs=
github.com/testcontainers/testcontainers-go v0.23.0/go.mod h1:3gzuZfb7T9qfcH2pHpV4RLlWrPjeWNQah6XlYQ32c4I=
github.com/testcontainers/testcontainers-go v0.25.0 h1:erH6cQjsaJrH+rJDU9qIf89KFdhK0Bft0aEZHlYC3Vs=
github.com/testcontainers/testcontainers-go v0.25.0/go.mod h1:4sC9SiJyzD1XFi59q8umTQYWxnkweEc5OjVtTUlJzqQ=
github.com/testcontainers/testcontainers-go v0.38.0 h1:d7uEapLcv2P8AvH8ahLqDMMxda2W9gQN1nRbHS28HBw=
github.com/testcontainers/testcontainers-go v0.38.0/go.mod h1:C52c9MoHpWO+C4aqmgSU+hxlR5jlEayWtgYrb8Pzz1w=
github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
github.com/tinylib/msgp v1.1.8 h1:FCXC1xanKO4I8plpHGH2P7koL/RzZs12l/+r7vakfm0=
github.com/tinylib/msgp v1.1.8/go.mod h1:qkpG+2ldGg4xRFmx+jfTvZPxfGFhi64BcnL9vkCm/Tw=
github.com/tjfoc/gmsm v1.4.1 h1:aMe1GlZb+0bLjn+cKTPEvvn9oUEBlJitaZiiBwsbgho=
github.com/tjfoc/gmsm v1.4.1/go.mod h1:j4INPkHWMrhJb38G+J6W4Tw0AbuN8Thu3PbdVYhVcTE=
github.com/ugorji/go v1.2.7 h1:qYhyWUUd6WbiM+C6JZAUkIJt/1WrjzNHY9+KCIjVqTo=
github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M=
github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY=
github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU=
github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8=
github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok=
github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g=
github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds=
github.com/vmware/govmomi v0.18.0 h1:f7QxSmP7meCtoAmiKZogvVbLInT+CZx6Px6K5rYsJZo=
github.com/vmware/govmomi v0.18.0/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU=
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
github.com/xhit/go-str2duration v1.2.0 h1:BcV5u025cITWxEQKGWr1URRzrcXtu7uk8+luz3Yuhwc=
github.com/xhit/go-str2duration v1.2.0/go.mod h1:3cPSlfZlUHVlneIVfePFWcJZsuwf+P1v2SRTV4cUmp4=
github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc=
github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU=
github.com/xtaci/kcp-go/v5 v5.6.24 h1:0tZL4NfpoESDrhaScrZfVDnYZ/3LhyVAbN/dQ2b4hbI=
github.com/xtaci/kcp-go/v5 v5.6.24/go.mod h1:7cAxNX/qFGeRUmUSnnDMoOg53FbXDK9IWBXAUfh+aBA=
github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE=
github.com/zclconf/go-cty v1.11.1 h1:UMMYDL4riBFaPdzjEWcDdWG7x/Adz8E8f9OX/MGR7V4=
github.com/zclconf/go-cty v1.11.1/go.mod h1:s9IfD1LK5ccNMSWCVFCE2rJfHiZgi7JijgeWIMfhLvA=
github.com/zeebo/errs v1.4.0 h1:XNdoD/RRMKP7HD0UhJnIzUy74ISdGGxURlYG8HSWSfM=
github.com/zeebo/errs v1.4.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4=
go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ=
go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw=
go.etcd.io/etcd/api/v3 v3.6.4 h1:7F6N7toCKcV72QmoUKa23yYLiiljMrT4xCeBL9BmXdo=
go.etcd.io/etcd/api/v3 v3.6.4/go.mod h1:eFhhvfR8Px1P6SEuLT600v+vrhdDTdcfMzmnxVXXSbk=
go.etcd.io/etcd/client/pkg/v3 v3.6.4 h1:9HBYrjppeOfFjBjaMTRxT3R7xT0GLK8EJMVC4xg6ok0=
go.etcd.io/etcd/client/pkg/v3 v3.6.4/go.mod h1:sbdzr2cl3HzVmxNw//PH7aLGVtY4QySjQFuaCgcRFAI=
go.etcd.io/etcd/client/v3 v3.6.4 h1:YOMrCfMhRzY8NgtzUsHl8hC2EBSnuqbR3dh84Uryl7A=
go.etcd.io/etcd/client/v3 v3.6.4/go.mod h1:jaNNHCyg2FdALyKWnd7hxZXZxZANb0+KGY+YQaEMISo=
go.mongodb.org/mongo-driver v1.12.0/go.mod h1:AZkxhPnFJUoH7kZlFkVKucV20K387miPfm7oimrSmK0=
go.mongodb.org/mongo-driver v1.17.1/go.mod h1:wwWm/+BuOddhcq3n68LKRmgk2wXzmF6s0SFOa0GINL4=
go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M=
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
go.opentelemetry.io/contrib/detectors/gcp v1.36.0 h1:F7q2tNlCaHY9nMKHR6XH9/qkp8FktLnIcy6jJNyOCQw=
go.opentelemetry.io/contrib/detectors/gcp v1.36.0/go.mod h1:IbBN8uAIIx734PTonTPxAxnjc2pQTxWNkwfstZ+6H2k=
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 h1:4Pp6oUg3+e/6M4C0A/3kJ2VYa++dsWVTtGgLVj5xtHg=
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 h1:Mne5On7VWdx7omSrSSZvM4Kw7cS7NQkOOmLcgscI51U=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0/go.mod h1:IPtUMKL4O3tH5y+iXVyAXqpAwMuzC1IrxVS81rummfE=
go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA=
go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI=
go.opentelemetry.io/otel/sdk v1.16.0 h1:Z1Ok1YsijYL0CSJpHt4cS3wDDh7p572grzNrBMiMWgE=
go.opentele
Download .txt
gitextract_cpr1egp_/

├── .dockerignore
├── .editorconfig
├── .gitignore
├── .gitmodules
├── .golangci.yml
├── .goreleaser.yaml
├── CONTRIBUTING.md
├── Dockerfile
├── Makefile
├── README.en.md
├── README.md
├── cmd/
│   ├── auth-service/
│   │   └── main.go
│   ├── game-service/
│   │   └── main.go
│   ├── gateway-service/
│   │   └── main.go
│   ├── replication/
│   │   └── main.go
│   └── scene/
│       └── main.go
├── configs/
│   ├── auth-service.yaml
│   ├── config.dev.yaml.example
│   ├── config.example.yaml
│   ├── config.prod.yaml.example
│   ├── data/
│   │   ├── items.json
│   │   ├── maps.json
│   │   ├── quests.json
│   │   ├── skills.json
│   │   └── units.json
│   ├── docker.yaml
│   ├── game-service.yaml
│   ├── gateway-service.yaml
│   ├── replication-service.yaml
│   └── scene-service.yaml
├── docker-compose.yml
├── docs/
│   └── k8s-local.md
├── go.mod
├── go.work
├── go.work.sum
├── internal/
│   ├── application/
│   │   ├── commands/
│   │   │   ├── battle/
│   │   │   │   ├── create_battle.go
│   │   │   │   └── errors.go
│   │   │   └── player/
│   │   │       ├── ban_player.go
│   │   │       ├── create_player.go
│   │   │       ├── delete_player.go
│   │   │       ├── errors.go
│   │   │       ├── gm_update_player.go
│   │   │       ├── level_up_player.go
│   │   │       ├── move_player.go
│   │   │       ├── unban_player.go
│   │   │       └── update_player.go
│   │   ├── handlers/
│   │   │   ├── command_bus.go
│   │   │   ├── query_bus.go
│   │   │   └── replication_subscribers.go
│   │   ├── interfaces/
│   │   │   └── command.go
│   │   ├── queries/
│   │   │   ├── battle/
│   │   │   │   ├── errors.go
│   │   │   │   └── get_battle.go
│   │   │   └── player/
│   │   │       ├── errors.go
│   │   │       ├── get_player.go
│   │   │       ├── get_player_detail.go
│   │   │       ├── get_player_stats.go
│   │   │       ├── list_players.go
│   │   │       └── search_players.go
│   │   └── services/
│   │       ├── building_service.go
│   │       ├── character_service.go
│   │       ├── fight_service.go
│   │       ├── hangup_service.go
│   │       ├── item_service.go
│   │       ├── mail_service.go
│   │       ├── map_service.go
│   │       ├── minigame_service.go
│   │       ├── npc_service.go
│   │       ├── pet_service.go
│   │       ├── plant_service.go
│   │       ├── player_service.go
│   │       ├── quest_service.go
│   │       ├── ranking_service.go
│   │       ├── replication_service.go
│   │       ├── sacred_service.go
│   │       ├── scene_service.go
│   │       ├── service_registry.go
│   │       ├── spawn_manager.go
│   │       ├── update_manager.go
│   │       ├── user_service.go
│   │       └── weather_service.go
│   ├── auth/
│   │   └── jwt.go
│   ├── base_module.go
│   ├── bootstrap/
│   │   ├── auth_bootstrap.go
│   │   ├── game_bootstrap.go
│   │   ├── gateway_bootstrap.go
│   │   ├── replication_bootstrap.go
│   │   └── scene_bootstrap.go
│   ├── config/
│   │   ├── config.go
│   │   ├── loader.go
│   │   ├── loader_test.go
│   │   ├── manager.go
│   │   └── types.go
│   ├── config_manager_base.go
│   ├── data_base.go
│   ├── database/
│   │   ├── mongodb.go
│   │   └── redis.go
│   ├── domain/
│   │   ├── ai/
│   │   │   └── monster_ai.go
│   │   ├── battle/
│   │   │   ├── battle.go
│   │   │   ├── errors.go
│   │   │   ├── repository.go
│   │   │   ├── service.go
│   │   │   └── skill.go
│   │   ├── building/
│   │   │   ├── aggregate.go
│   │   │   ├── entity.go
│   │   │   ├── errors.go
│   │   │   ├── events.go
│   │   │   ├── repository.go
│   │   │   ├── service.go
│   │   │   ├── types.go
│   │   │   └── value_object.go
│   │   ├── character/
│   │   │   ├── actor.go
│   │   │   ├── buff_attributes_test.go
│   │   │   ├── buff_flags_test.go
│   │   │   ├── entity.go
│   │   │   ├── events.go
│   │   │   ├── events_test.go
│   │   │   ├── monster.go
│   │   │   ├── player.go
│   │   │   ├── repository.go
│   │   │   ├── skill_damage_test.go
│   │   │   ├── subsystems.go
│   │   │   ├── subsystems_test.go
│   │   │   └── value_objects.go
│   │   ├── dialogue/
│   │   │   └── dialogue_manager.go
│   │   ├── events/
│   │   │   └── domain_event.go
│   │   ├── inventory/
│   │   │   ├── dressup/
│   │   │   │   ├── aggregate.go
│   │   │   │   ├── entity.go
│   │   │   │   ├── errors.go
│   │   │   │   ├── events.go
│   │   │   │   ├── repository.go
│   │   │   │   ├── service.go
│   │   │   │   └── value_object.go
│   │   │   ├── errors.go
│   │   │   ├── inventory.go
│   │   │   ├── repository.go
│   │   │   └── synthesis/
│   │   │       ├── aggregate.go
│   │   │       ├── entity.go
│   │   │       ├── errors.go
│   │   │       ├── events.go
│   │   │       ├── repository.go
│   │   │       ├── service.go
│   │   │       └── value_object.go
│   │   ├── mapmanager/
│   │   │   └── map.go
│   │   ├── minigame/
│   │   │   ├── aggregate.go
│   │   │   ├── entity.go
│   │   │   ├── errors.go
│   │   │   ├── events.go
│   │   │   ├── repository.go
│   │   │   ├── service.go
│   │   │   ├── types.go
│   │   │   └── value_object.go
│   │   ├── npc/
│   │   │   ├── aggregate.go
│   │   │   ├── entity.go
│   │   │   ├── errors.go
│   │   │   ├── events.go
│   │   │   ├── repository.go
│   │   │   ├── service.go
│   │   │   └── value_object.go
│   │   ├── pet/
│   │   │   ├── aggregate.go
│   │   │   ├── entity.go
│   │   │   ├── errors.go
│   │   │   ├── events.go
│   │   │   ├── repository.go
│   │   │   ├── service.go
│   │   │   └── value_object.go
│   │   ├── player/
│   │   │   ├── beginner/
│   │   │   │   ├── aggregate.go
│   │   │   │   ├── entity.go
│   │   │   │   ├── errors.go
│   │   │   │   ├── events.go
│   │   │   │   ├── repository.go
│   │   │   │   ├── service.go
│   │   │   │   └── value_object.go
│   │   │   ├── errors.go
│   │   │   ├── events.go
│   │   │   ├── hangup/
│   │   │   │   ├── aggregate.go
│   │   │   │   ├── entity.go
│   │   │   │   ├── errors.go
│   │   │   │   ├── events.go
│   │   │   │   ├── repository.go
│   │   │   │   ├── service.go
│   │   │   │   └── value_object.go
│   │   │   ├── honor/
│   │   │   │   ├── aggregate.go
│   │   │   │   ├── entity.go
│   │   │   │   ├── errors.go
│   │   │   │   ├── events.go
│   │   │   │   ├── repository.go
│   │   │   │   ├── service.go
│   │   │   │   └── value_object.go
│   │   │   ├── player.go
│   │   │   ├── query.go
│   │   │   ├── repository.go
│   │   │   ├── service.go
│   │   │   └── value_objects.go
│   │   ├── quest/
│   │   │   ├── errors.go
│   │   │   ├── quest.go
│   │   │   └── repository.go
│   │   ├── ranking/
│   │   │   ├── aggregate.go
│   │   │   ├── entity.go
│   │   │   ├── errors.go
│   │   │   ├── events.go
│   │   │   ├── repository.go
│   │   │   ├── service.go
│   │   │   └── value_object.go
│   │   ├── replication/
│   │   │   ├── events.go
│   │   │   ├── instance.go
│   │   │   ├── repository.go
│   │   │   └── snapshot.go
│   │   ├── scene/
│   │   │   ├── errors.go
│   │   │   ├── plant/
│   │   │   │   ├── aggregate.go
│   │   │   │   ├── entity.go
│   │   │   │   ├── errors.go
│   │   │   │   ├── events.go
│   │   │   │   ├── repository.go
│   │   │   │   ├── service.go
│   │   │   │   └── value_object.go
│   │   │   ├── repository.go
│   │   │   ├── sacred/
│   │   │   │   ├── aggregate.go
│   │   │   │   ├── entity.go
│   │   │   │   ├── errors.go
│   │   │   │   ├── events.go
│   │   │   │   ├── repository.go
│   │   │   │   ├── service.go
│   │   │   │   └── value_object.go
│   │   │   ├── scene.go
│   │   │   └── weather/
│   │   │       ├── aggregate.go
│   │   │       ├── entity.go
│   │   │       ├── errors.go
│   │   │       ├── events.go
│   │   │       ├── repository.go
│   │   │       ├── service.go
│   │   │       └── value_object.go
│   │   ├── skill/
│   │   │   ├── errors.go
│   │   │   ├── repository.go
│   │   │   └── skill.go
│   │   └── social/
│   │       ├── chat/
│   │       │   ├── aggregate.go
│   │       │   ├── chat_service.go
│   │       │   ├── errors.go
│   │       │   ├── events.go
│   │       │   ├── member.go
│   │       │   ├── message.go
│   │       │   └── repository.go
│   │       ├── email/
│   │       │   ├── attachment.go
│   │       │   ├── email.go
│   │       │   ├── email_service.go
│   │       │   ├── errors.go
│   │       │   ├── events.go
│   │       │   └── repository.go
│   │       ├── family/
│   │       │   ├── errors.go
│   │       │   ├── events.go
│   │       │   ├── family.go
│   │       │   ├── family_service.go
│   │       │   ├── member.go
│   │       │   └── repository.go
│   │       ├── friend/
│   │       │   ├── errors.go
│   │       │   ├── events.go
│   │       │   ├── friend_request.go
│   │       │   ├── friend_service.go
│   │       │   ├── friendship.go
│   │       │   └── repository.go
│   │       └── team/
│   │           ├── errors.go
│   │           ├── events.go
│   │           ├── repository.go
│   │           ├── team.go
│   │           ├── team_member.go
│   │           └── team_service.go
│   ├── errors/
│   │   └── domain_errors.go
│   ├── events/
│   │   ├── eventbus.go
│   │   ├── metrics.go
│   │   ├── middleware.go
│   │   └── worker.go
│   ├── game/
│   │   └── player.go
│   ├── icharacter.go
│   ├── imodule.go
│   ├── infrastructure/
│   │   ├── auth/
│   │   │   ├── jwt.go
│   │   │   └── middleware.go
│   │   ├── cache/
│   │   │   ├── cache_manager.go
│   │   │   ├── memory_cache.go
│   │   │   └── redis_cache.go
│   │   ├── config/
│   │   │   ├── environments/
│   │   │   │   ├── config.dev.yaml
│   │   │   │   ├── config.prod.yaml
│   │   │   │   └── config.test.yaml
│   │   │   ├── file_watcher.go
│   │   │   ├── unified.json
│   │   │   ├── unified.prod.json
│   │   │   └── unified_config.go
│   │   ├── container/
│   │   │   ├── container.go
│   │   │   ├── providers.go
│   │   │   └── simple_container.go
│   │   ├── datamanager/
│   │   │   └── data_manager.go
│   │   ├── errors/
│   │   │   └── errors.go
│   │   ├── logging/
│   │   │   └── logger.go
│   │   ├── managers/
│   │   │   ├── entity_manager.go
│   │   │   └── update_manager.go
│   │   ├── messaging/
│   │   │   ├── event_bus.go
│   │   │   ├── event_dispatcher.go
│   │   │   ├── logger_adapter.go
│   │   │   ├── nats_publisher.go
│   │   │   ├── nats_subscriber.go
│   │   │   ├── publisher.go
│   │   │   └── worker_pool.go
│   │   ├── monitoring/
│   │   │   └── metrics.go
│   │   ├── network/
│   │   │   ├── connection_manager.go
│   │   │   ├── netcore_client.go
│   │   │   └── netcore_server.go
│   │   ├── persistence/
│   │   │   ├── base_repository.go
│   │   │   ├── building_repository.go
│   │   │   ├── db_entities.go
│   │   │   ├── hangup_repository.go
│   │   │   ├── minigame_repository.go
│   │   │   ├── mongodb.go
│   │   │   ├── npc_repository.go
│   │   │   ├── plant_repository.go
│   │   │   ├── player_repository.go
│   │   │   ├── ranking_repository.go
│   │   │   ├── replication_repository.go
│   │   │   ├── repositories.go
│   │   │   ├── scene_repository.go
│   │   │   └── weather_repository.go
│   │   ├── protocol/
│   │   │   ├── binary_protocol.go
│   │   │   ├── json_protocol.go
│   │   │   └── protocol.go
│   │   └── weave/
│   │       └── weavelet.go
│   ├── interfaces/
│   │   ├── http/
│   │   │   ├── auth/
│   │   │   │   ├── login_handler.go
│   │   │   │   ├── middleware.go
│   │   │   │   ├── register_handler.go
│   │   │   │   └── token_handler.go
│   │   │   ├── battle_handler.go
│   │   │   ├── building_handler.go
│   │   │   ├── gm/
│   │   │   │   ├── player_management.go
│   │   │   │   └── server_monitor.go
│   │   │   ├── health_handler.go
│   │   │   ├── pet_handler.go
│   │   │   ├── player_handler.go
│   │   │   ├── replication_handlers.go
│   │   │   ├── response.go
│   │   │   └── server.go
│   │   ├── rpc/
│   │   │   ├── battle_service.go
│   │   │   ├── player_service.go
│   │   │   ├── ranking_service.go
│   │   │   ├── replication_service.go
│   │   │   └── server.go
│   │   └── tcp/
│   │       ├── connection/
│   │       │   ├── heartbeat.go
│   │       │   ├── manager.go
│   │       │   └── session.go
│   │       ├── handlers/
│   │       │   └── game_handler.go
│   │       ├── npc_handler.go
│   │       ├── pet_handler.go
│   │       ├── protocol/
│   │       │   ├── base_protocol.go
│   │       │   ├── errors.go
│   │       │   ├── game_protocol.go
│   │       │   ├── message_types.go
│   │       │   └── pet_protocol.go
│   │       ├── router.go
│   │       ├── scene_handler.go
│   │       └── server.go
│   ├── metrics_base.go
│   ├── module_manager.go
│   ├── network/
│   │   ├── codec.go
│   │   ├── protocol.go
│   │   └── session/
│   │       └── session.go
│   ├── platform.go
│   ├── proto/
│   │   ├── README.md
│   │   ├── battle/
│   │   │   └── battle.pb.go
│   │   ├── chat/
│   │   │   └── chat.pb.go
│   │   ├── common/
│   │   │   └── common.pb.go
│   │   ├── errors/
│   │   │   └── errors.pb.go
│   │   ├── gateway/
│   │   │   └── gateway.pb.go
│   │   ├── mail/
│   │   │   └── mail.pb.go
│   │   ├── messages/
│   │   │   └── messages.pb.go
│   │   ├── pet/
│   │   │   └── pet.pb.go
│   │   ├── player/
│   │   │   └── player.pb.go
│   │   ├── protocol/
│   │   │   └── protocol.pb.go
│   │   ├── room/
│   │   │   └── room.pb.go
│   │   ├── scene/
│   │   │   └── scene.pb.go
│   │   └── team/
│   │       └── team.pb.go
│   └── readme.md
├── k8s/
│   └── local/
│       ├── auth-service.yaml
│       ├── configmap-gateway.yaml
│       ├── game-service.yaml
│       ├── gateway-service.yaml
│       ├── mongodb.yaml
│       ├── namespace.yaml
│       ├── overlays/
│       │   └── registry/
│       │       └── kustomization.yaml
│       └── redis.yaml
├── license
├── proto/
│   ├── auth.proto
│   ├── battle.proto
│   ├── character.proto
│   ├── chat.proto
│   ├── common.proto
│   ├── entity.proto
│   ├── errors.proto
│   ├── fight.proto
│   ├── game.proto
│   ├── gateway.proto
│   ├── inventory.proto
│   ├── mail.proto
│   ├── map.proto
│   ├── messages.proto
│   ├── npc.proto
│   ├── pet.proto
│   ├── player.proto
│   ├── protocol.proto
│   ├── quest.proto
│   ├── room.proto
│   ├── scene.proto
│   └── team.proto
├── protoc/
│   ├── include/
│   │   └── google/
│   │       └── protobuf/
│   │           ├── any.proto
│   │           ├── api.proto
│   │           ├── compiler/
│   │           │   └── plugin.proto
│   │           ├── descriptor.proto
│   │           ├── duration.proto
│   │           ├── empty.proto
│   │           ├── field_mask.proto
│   │           ├── source_context.proto
│   │           ├── struct.proto
│   │           ├── timestamp.proto
│   │           ├── type.proto
│   │           └── wrappers.proto
│   └── readme.txt
├── scripts/
│   ├── build-images.ps1
│   ├── build.sh
│   ├── clean.sh
│   ├── db-migrate.sh
│   ├── deploy.sh
│   ├── docker-build.sh
│   ├── generate_proto.bat
│   ├── generate_proto.sh
│   ├── health-check.sh
│   ├── init-db.sh
│   ├── k8s-deploy.ps1
│   ├── load-images-to-k8s.ps1
│   ├── mongo-init.js
│   ├── publish-images.ps1
│   ├── setup-dev.sh
│   ├── start-services.bat
│   ├── start-services.sh
│   └── stop-services.sh
└── tools/
    └── simclient/
        ├── README_E2E.md
        ├── action_scenario.go
        ├── client.go
        ├── cmd/
        │   └── simclient/
        │       └── main.go
        ├── config.example.yaml
        ├── config.go
        ├── e2e.yaml
        ├── e2e_load.yaml
        ├── e2e_scenario.go
        ├── feature_library.go
        ├── main.go
        ├── metrics.go
        ├── runner.go
        ├── scenario.go
        └── simclient_test.go
Download .txt
Showing preview only (1,266K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (14347 symbols across 330 files)

FILE: cmd/auth-service/main.go
  function loadInitialConfig (line 21) | func loadInitialConfig() (*AuthServiceConfig, []string, *config.Loader, ...
  function main (line 35) | func main() {

FILE: cmd/game-service/main.go
  function loadInitialConfig (line 21) | func loadInitialConfig() (*GameServiceConfig, []string, *config.Loader, ...
  function main (line 35) | func main() {

FILE: cmd/gateway-service/main.go
  function loadInitialConfig (line 21) | func loadInitialConfig() (*GatewayServiceConfig, []string, *config.Loade...
  function main (line 35) | func main() {

FILE: cmd/replication/main.go
  function loadInitialConfig (line 21) | func loadInitialConfig() (*ReplicationServiceConfig, []string, *config.L...
  function main (line 33) | func main() {

FILE: cmd/scene/main.go
  function loadInitialConfig (line 21) | func loadInitialConfig() (*SceneServiceConfig, []string, *config.Loader,...
  function main (line 34) | func main() {

FILE: internal/application/commands/battle/create_battle.go
  type BattleType (line 9) | type BattleType
  constant BattleTypePvP (line 12) | BattleTypePvP BattleType = iota
  constant BattleTypePvE (line 13) | BattleTypePvE
  constant BattleTypeTeamPvP (line 14) | BattleTypeTeamPvP
  constant BattleTypeRaid (line 15) | BattleTypeRaid
  type CreateBattleCommand (line 19) | type CreateBattleCommand struct
    method CommandType (line 55) | func (cmd *CreateBattleCommand) CommandType() string {
    method Validate (line 60) | func (cmd *CreateBattleCommand) Validate() error {
  type CreateBattleResult (line 25) | type CreateBattleResult struct
  type CreateBattleHandler (line 33) | type CreateBattleHandler struct
    method Handle (line 50) | func (h *CreateBattleHandler) Handle(ctx context.Context, cmd *CreateB...
  type BattleService (line 38) | type BattleService interface
  function NewCreateBattleHandler (line 43) | func NewCreateBattleHandler(battleService BattleService) *CreateBattleHa...

FILE: internal/application/commands/battle/errors.go
  constant ErrCodeInvalidCreatorID (line 10) | ErrCodeInvalidCreatorID     = int32(protoerrors.BattleErrorCode_ERR_INVA...
  constant ErrCodeInvalidBattleType (line 11) | ErrCodeInvalidBattleType    = int32(protoerrors.BattleErrorCode_ERR_INVA...
  constant ErrCodeInvalidBattleID (line 12) | ErrCodeInvalidBattleID      = int32(protoerrors.BattleErrorCode_ERR_INVA...
  constant ErrCodeInvalidPlayerID (line 13) | ErrCodeInvalidPlayerID      = int32(protoerrors.BattleErrorCode_ERR_INVA...
  constant ErrCodeInvalidTargetID (line 14) | ErrCodeInvalidTargetID      = int32(protoerrors.BattleErrorCode_ERR_INVA...
  constant ErrCodeInvalidSkillID (line 15) | ErrCodeInvalidSkillID       = int32(protoerrors.BattleErrorCode_ERR_INVA...
  constant ErrCodeInvalidTeam (line 16) | ErrCodeInvalidTeam          = int32(protoerrors.BattleErrorCode_ERR_INVA...
  constant ErrCodeBattleNotFound (line 17) | ErrCodeBattleNotFound       = int32(protoerrors.CommonErrorCode_ERR_BATT...
  constant ErrCodeBattleAlreadyStarted (line 18) | ErrCodeBattleAlreadyStarted = int32(protoerrors.BattleErrorCode_ERR_BATT...
  constant ErrCodeBattleNotStarted (line 19) | ErrCodeBattleNotStarted     = int32(protoerrors.BattleErrorCode_ERR_BATT...
  constant ErrCodePlayerNotInBattle (line 20) | ErrCodePlayerNotInBattle    = int32(protoerrors.BattleErrorCode_ERR_PLAY...
  constant ErrCodeInsufficientMana (line 21) | ErrCodeInsufficientMana     = int32(protoerrors.BattleErrorCode_ERR_INSU...
  constant ErrCodeSkillOnCooldown (line 22) | ErrCodeSkillOnCooldown      = int32(protoerrors.BattleErrorCode_ERR_SKIL...
  constant ErrCodeInvalidAction (line 23) | ErrCodeInvalidAction        = int32(protoerrors.BattleErrorCode_ERR_INVA...

FILE: internal/application/commands/player/ban_player.go
  type BanPlayerCommand (line 9) | type BanPlayerCommand struct
    method CommandType (line 60) | func (cmd *BanPlayerCommand) CommandType() string {
    method Validate (line 65) | func (cmd *BanPlayerCommand) Validate() error {
  type BanPlayerResult (line 19) | type BanPlayerResult struct
  type BanPlayerHandler (line 27) | type BanPlayerHandler struct
    method Handle (line 39) | func (h *BanPlayerHandler) Handle(ctx context.Context, cmd *BanPlayerC...
  function NewBanPlayerHandler (line 32) | func NewBanPlayerHandler(playerService PlayerService) *BanPlayerHandler {

FILE: internal/application/commands/player/create_player.go
  type CreatePlayerCommand (line 10) | type CreatePlayerCommand struct
    method CommandType (line 93) | func (cmd *CreatePlayerCommand) CommandType() string {
    method Validate (line 98) | func (cmd *CreatePlayerCommand) Validate() error {
  type CreatePlayerResult (line 17) | type CreatePlayerResult struct
  type CreatePlayerWithAccountCommand (line 25) | type CreatePlayerWithAccountCommand struct
    method CommandType (line 35) | func (cmd *CreatePlayerWithAccountCommand) CommandType() string {
    method Validate (line 40) | func (cmd *CreatePlayerWithAccountCommand) Validate() error {
  type CreatePlayerWithAccountResult (line 57) | type CreatePlayerWithAccountResult struct
  type CreatePlayerHandler (line 65) | type CreatePlayerHandler struct
    method Handle (line 88) | func (h *CreatePlayerHandler) Handle(ctx context.Context, cmd *CreateP...
  type PlayerService (line 73) | type PlayerService interface
  function NewCreatePlayerHandler (line 81) | func NewCreatePlayerHandler(playerService PlayerService) *CreatePlayerHa...

FILE: internal/application/commands/player/delete_player.go
  type DeletePlayerCommand (line 11) | type DeletePlayerCommand struct
    method CommandType (line 52) | func (cmd *DeletePlayerCommand) CommandType() string {
    method Validate (line 57) | func (cmd *DeletePlayerCommand) Validate() error {
  type DeletePlayerResult (line 17) | type DeletePlayerResult struct
  type DeletePlayerHandler (line 24) | type DeletePlayerHandler struct
    method Handle (line 36) | func (h *DeletePlayerHandler) Handle(ctx context.Context, cmd *DeleteP...
  function NewDeletePlayerHandler (line 29) | func NewDeletePlayerHandler(playerService PlayerService) *DeletePlayerHa...

FILE: internal/application/commands/player/gm_update_player.go
  type GMUpdatePlayerCommand (line 9) | type GMUpdatePlayerCommand struct
    method CommandType (line 59) | func (cmd *GMUpdatePlayerCommand) CommandType() string {
    method Validate (line 64) | func (cmd *GMUpdatePlayerCommand) Validate() error {
  type GMUpdatePlayerResult (line 18) | type GMUpdatePlayerResult struct
  type GMUpdatePlayerHandler (line 26) | type GMUpdatePlayerHandler struct
    method Handle (line 38) | func (h *GMUpdatePlayerHandler) Handle(ctx context.Context, cmd *GMUpd...
  function NewGMUpdatePlayerHandler (line 31) | func NewGMUpdatePlayerHandler(playerService PlayerService) *GMUpdatePlay...

FILE: internal/application/commands/player/level_up_player.go
  type LevelUpPlayerCommand (line 11) | type LevelUpPlayerCommand struct
    method CommandType (line 57) | func (cmd *LevelUpPlayerCommand) CommandType() string {
    method Validate (line 62) | func (cmd *LevelUpPlayerCommand) Validate() error {
  type LevelUpPlayerResult (line 17) | type LevelUpPlayerResult struct
  type LevelUpPlayerHandler (line 29) | type LevelUpPlayerHandler struct
    method Handle (line 41) | func (h *LevelUpPlayerHandler) Handle(ctx context.Context, cmd *LevelU...
  function NewLevelUpPlayerHandler (line 34) | func NewLevelUpPlayerHandler(playerService PlayerService) *LevelUpPlayer...

FILE: internal/application/commands/player/move_player.go
  type Position (line 8) | type Position struct
  type MovePlayerCommand (line 15) | type MovePlayerCommand struct
    method CommandType (line 53) | func (cmd *MovePlayerCommand) CommandType() string {
    method Validate (line 58) | func (cmd *MovePlayerCommand) Validate() error {
  type MovePlayerResult (line 21) | type MovePlayerResult struct
  type MovePlayerHandler (line 29) | type MovePlayerHandler struct
    method Handle (line 41) | func (h *MovePlayerHandler) Handle(ctx context.Context, cmd *MovePlaye...
  function NewMovePlayerHandler (line 34) | func NewMovePlayerHandler(playerService PlayerService) *MovePlayerHandler {

FILE: internal/application/commands/player/unban_player.go
  type UnbanPlayerCommand (line 9) | type UnbanPlayerCommand struct
    method CommandType (line 56) | func (cmd *UnbanPlayerCommand) CommandType() string {
    method Validate (line 61) | func (cmd *UnbanPlayerCommand) Validate() error {
  type UnbanPlayerResult (line 17) | type UnbanPlayerResult struct
  type UnbanPlayerHandler (line 24) | type UnbanPlayerHandler struct
    method Handle (line 36) | func (h *UnbanPlayerHandler) Handle(ctx context.Context, cmd *UnbanPla...
  function NewUnbanPlayerHandler (line 29) | func NewUnbanPlayerHandler(playerService PlayerService) *UnbanPlayerHand...

FILE: internal/application/commands/player/update_player.go
  type UpdatePlayerCommand (line 9) | type UpdatePlayerCommand struct
    method CommandType (line 45) | func (cmd *UpdatePlayerCommand) CommandType() string {
    method Validate (line 50) | func (cmd *UpdatePlayerCommand) Validate() error {
  type UpdatePlayerResult (line 17) | type UpdatePlayerResult struct
  type UpdatePlayerHandler (line 27) | type UpdatePlayerHandler struct
    method Handle (line 39) | func (h *UpdatePlayerHandler) Handle(ctx context.Context, cmd *UpdateP...
  function NewUpdatePlayerHandler (line 32) | func NewUpdatePlayerHandler(playerService PlayerService) *UpdatePlayerHa...

FILE: internal/application/handlers/command_bus.go
  type Command (line 10) | type Command interface
  type CommandHandler (line 16) | type CommandHandler interface
  type CommandBus (line 21) | type CommandBus struct
    method RegisterHandler (line 33) | func (bus *CommandBus) RegisterHandler(commandType string, handler int...
    method Execute (line 38) | func (bus *CommandBus) Execute(ctx context.Context, cmd Command) (inte...
  function NewCommandBus (line 26) | func NewCommandBus() *CommandBus {
  function ExecuteTyped (line 81) | func ExecuteTyped[T Command, R any](ctx context.Context, bus *CommandBus...
  type Middleware (line 97) | type Middleware interface
  type ValidationMiddleware (line 102) | type ValidationMiddleware struct
    method Execute (line 105) | func (m *ValidationMiddleware) Execute(ctx context.Context, cmd Comman...
  type LoggingMiddleware (line 113) | type LoggingMiddleware struct
    method Execute (line 129) | func (m *LoggingMiddleware) Execute(ctx context.Context, cmd Command, ...
  type Logger (line 118) | type Logger interface
  function NewLoggingMiddleware (line 124) | func NewLoggingMiddleware(logger Logger) *LoggingMiddleware {

FILE: internal/application/handlers/query_bus.go
  type Query (line 10) | type Query interface
  type QueryHandler (line 16) | type QueryHandler interface
  type QueryBus (line 21) | type QueryBus struct
    method RegisterHandler (line 33) | func (bus *QueryBus) RegisterHandler(queryType string, handler interfa...
    method Execute (line 38) | func (bus *QueryBus) Execute(ctx context.Context, query Query) (interf...
  function NewQueryBus (line 26) | func NewQueryBus() *QueryBus {
  function ExecuteQueryTyped (line 81) | func ExecuteQueryTyped[T Query, R any](ctx context.Context, bus *QueryBu...
  type QueryMiddleware (line 97) | type QueryMiddleware interface
  type CachingMiddleware (line 102) | type CachingMiddleware struct
    method Execute (line 119) | func (m *CachingMiddleware) Execute(ctx context.Context, query Query, ...
  type Cache (line 107) | type Cache interface
  function NewCachingMiddleware (line 114) | func NewCachingMiddleware(cache Cache) *CachingMiddleware {
  type QueryLoggingMiddleware (line 141) | type QueryLoggingMiddleware struct
    method Execute (line 151) | func (m *QueryLoggingMiddleware) Execute(ctx context.Context, query Qu...
  function NewQueryLoggingMiddleware (line 146) | func NewQueryLoggingMiddleware(logger Logger) *QueryLoggingMiddleware {

FILE: internal/application/handlers/replication_subscribers.go
  function RegisterReplicationSubscribers (line 13) | func RegisterReplicationSubscribers(bus *events.EventBus, logger logging...

FILE: internal/application/interfaces/command.go
  type Command (line 7) | type Command interface
  type CommandHandler (line 13) | type CommandHandler interface
  type CommandBus (line 18) | type CommandBus interface
  type Query (line 24) | type Query interface
  type QueryHandler (line 30) | type QueryHandler interface
  type QueryBus (line 35) | type QueryBus interface
  type Event (line 41) | type Event interface
  type EventHandler (line 49) | type EventHandler interface
  type EventBus (line 54) | type EventBus interface
  type Middleware (line 61) | type Middleware interface
  type QueryMiddleware (line 66) | type QueryMiddleware interface

FILE: internal/application/queries/player/get_player.go
  type GetPlayerQuery (line 9) | type GetPlayerQuery struct
    method QueryType (line 143) | func (query *GetPlayerQuery) QueryType() string {
    method Validate (line 148) | func (query *GetPlayerQuery) Validate() error {
  type PlayerDTO (line 14) | type PlayerDTO struct
  type PositionDTO (line 35) | type PositionDTO struct
  type StatsDTO (line 42) | type StatsDTO struct
  type BanInfoDTO (line 53) | type BanInfoDTO struct
  type GetPlayerResult (line 63) | type GetPlayerResult struct
  type GetPlayerByUsernameQuery (line 69) | type GetPlayerByUsernameQuery struct
    method QueryType (line 74) | func (query *GetPlayerByUsernameQuery) QueryType() string {
    method Validate (line 79) | func (query *GetPlayerByUsernameQuery) Validate() error {
  type GetPlayerByUsernameResult (line 87) | type GetPlayerByUsernameResult struct
  type PlayerWithAccountDTO (line 93) | type PlayerWithAccountDTO struct
  type GetPlayerHandler (line 109) | type GetPlayerHandler struct
    method Handle (line 130) | func (h *GetPlayerHandler) Handle(ctx context.Context, query *GetPlaye...
  type PlayerQueryService (line 114) | type PlayerQueryService interface
  function NewGetPlayerHandler (line 123) | func NewGetPlayerHandler(playerQueryService PlayerQueryService) *GetPlay...

FILE: internal/application/queries/player/get_player_detail.go
  type GetPlayerDetailQuery (line 8) | type GetPlayerDetailQuery struct
    method Validate (line 50) | func (q *GetPlayerDetailQuery) Validate() error {
  type GetPlayerDetailResult (line 13) | type GetPlayerDetailResult struct
  type GetPlayerDetailHandler (line 19) | type GetPlayerDetailHandler struct
    method Handle (line 31) | func (h *GetPlayerDetailHandler) Handle(ctx context.Context, query *Ge...
  function NewGetPlayerDetailHandler (line 24) | func NewGetPlayerDetailHandler(playerQueryService PlayerQueryService) *G...

FILE: internal/application/queries/player/get_player_stats.go
  type GetPlayerStatsQuery (line 11) | type GetPlayerStatsQuery struct
    method QueryType (line 52) | func (query *GetPlayerStatsQuery) QueryType() string {
    method Validate (line 57) | func (query *GetPlayerStatsQuery) Validate() error {
  type GetPlayerStatsResult (line 16) | type GetPlayerStatsResult struct
  type GetPlayerStatsHandler (line 30) | type GetPlayerStatsHandler struct
    method Handle (line 47) | func (h *GetPlayerStatsHandler) Handle(ctx context.Context, query *Get...
  type PlayerStatsService (line 35) | type PlayerStatsService interface
  function NewGetPlayerStatsHandler (line 40) | func NewGetPlayerStatsHandler(playerStatsService PlayerStatsService) *Ge...

FILE: internal/application/queries/player/list_players.go
  type ListPlayersQuery (line 8) | type ListPlayersQuery struct
    method QueryType (line 58) | func (q *ListPlayersQuery) QueryType() string {
    method Validate (line 63) | func (q *ListPlayersQuery) Validate() error {
  type ListPlayersResult (line 17) | type ListPlayersResult struct
  type ListPlayersHandler (line 25) | type ListPlayersHandler struct
    method Handle (line 37) | func (h *ListPlayersHandler) Handle(ctx context.Context, query *ListPl...
  function NewListPlayersHandler (line 30) | func NewListPlayersHandler(playerQueryService PlayerQueryService) *ListP...

FILE: internal/application/queries/player/search_players.go
  type SearchPlayersQuery (line 8) | type SearchPlayersQuery struct
    method Validate (line 64) | func (q *SearchPlayersQuery) Validate() error {
  type SearchPlayersResult (line 23) | type SearchPlayersResult struct
  type SearchPlayersHandler (line 31) | type SearchPlayersHandler struct
    method Handle (line 43) | func (h *SearchPlayersHandler) Handle(ctx context.Context, query *Sear...
  function NewSearchPlayersHandler (line 36) | func NewSearchPlayersHandler(playerQueryService PlayerQueryService) *Sea...

FILE: internal/application/services/building_service.go
  type BuildingApplicationService (line 12) | type BuildingApplicationService struct
    method CreateBuildingType (line 60) | func (s *BuildingApplicationService) CreateBuildingType(ctx context.Co...
    method StartConstruction (line 143) | func (s *BuildingApplicationService) StartConstruction(ctx context.Con...
    method CompleteConstruction (line 236) | func (s *BuildingApplicationService) CompleteConstruction(ctx context....
    method UpgradeBuilding (line 310) | func (s *BuildingApplicationService) UpgradeBuilding(ctx context.Conte...
    method GetPlayerBuildings (line 403) | func (s *BuildingApplicationService) GetPlayerBuildings(ctx context.Co...
    method GetBuildingDetails (line 514) | func (s *BuildingApplicationService) GetBuildingDetails(ctx context.Co...
    method validateCreateBuildingTypeRequest (line 608) | func (s *BuildingApplicationService) validateCreateBuildingTypeRequest...
    method validateStartConstructionRequest (line 631) | func (s *BuildingApplicationService) validateStartConstructionRequest(...
    method parseBuildingCategory (line 646) | func (s *BuildingApplicationService) parseBuildingCategory(categoryStr...
    method parseBuildingStatus (line 667) | func (s *BuildingApplicationService) parseBuildingStatus(statusStr str...
  function NewBuildingApplicationService (line 20) | func NewBuildingApplicationService(
  type CreateBuildingTypeRequest (line 35) | type CreateBuildingTypeRequest struct
  type CreateBuildingTypeResponse (line 47) | type CreateBuildingTypeResponse struct
  type StartConstructionRequest (line 121) | type StartConstructionRequest struct
  type StartConstructionResponse (line 129) | type StartConstructionResponse struct
  type CompleteConstructionRequest (line 213) | type CompleteConstructionRequest struct
  type CompleteConstructionResponse (line 219) | type CompleteConstructionResponse struct
  type BuildingRewardResponse (line 228) | type BuildingRewardResponse struct
  type UpgradeBuildingRequest (line 293) | type UpgradeBuildingRequest struct
  type UpgradeBuildingResponse (line 299) | type UpgradeBuildingResponse struct
  type GetPlayerBuildingsRequest (line 363) | type GetPlayerBuildingsRequest struct
  type BuildingResponse (line 370) | type BuildingResponse struct
  type BuildingEffectResponse (line 388) | type BuildingEffectResponse struct
  type GetPlayerBuildingsResponse (line 396) | type GetPlayerBuildingsResponse struct
  type GetBuildingDetailsRequest (line 492) | type GetBuildingDetailsRequest struct
  type GetBuildingDetailsResponse (line 497) | type GetBuildingDetailsResponse struct
  type ConstructionResponse (line 503) | type ConstructionResponse struct

FILE: internal/application/services/character_service.go
  type CharacterService (line 15) | type CharacterService struct
    method CreateCharacter (line 35) | func (s *CharacterService) CreateCharacter(ctx context.Context, userID...
    method GetCharacter (line 95) | func (s *CharacterService) GetCharacter(ctx context.Context, character...
    method GetCharactersByUser (line 100) | func (s *CharacterService) GetCharactersByUser(ctx context.Context, us...
    method DeleteCharacter (line 105) | func (s *CharacterService) DeleteCharacter(ctx context.Context, charac...
    method LoadCharacter (line 110) | func (s *CharacterService) LoadCharacter(ctx context.Context, characte...
    method SaveCharacter (line 183) | func (s *CharacterService) SaveCharacter(ctx context.Context, player *...
    method UpdatePosition (line 224) | func (s *CharacterService) UpdatePosition(ctx context.Context, charact...
    method UpdateLastLocation (line 229) | func (s *CharacterService) UpdateLastLocation(ctx context.Context, cha...
    method AddExp (line 235) | func (s *CharacterService) AddExp(ctx context.Context, player *charact...
    method AddGold (line 247) | func (s *CharacterService) AddGold(ctx context.Context, player *charac...
  function NewCharacterService (line 22) | func NewCharacterService(

FILE: internal/application/services/fight_service.go
  type SkillCastResult (line 13) | type SkillCastResult struct
  type FightService (line 24) | type FightService struct
    method SetMapService (line 37) | func (s *FightService) SetMapService(ms *MapService) {
    method CastSkill (line 42) | func (s *FightService) CastSkill(ctx context.Context, caster *characte...
    method CastSkillByID (line 70) | func (s *FightService) CastSkillByID(ctx context.Context, casterEntity...
    method ApplyDamage (line 106) | func (s *FightService) ApplyDamage(ctx context.Context, attacker, targ...
    method ApplyHeal (line 132) | func (s *FightService) ApplyHeal(ctx context.Context, caster, target *...
    method ApplyBuff (line 148) | func (s *FightService) ApplyBuff(ctx context.Context, caster, target *...
    method RemoveBuff (line 161) | func (s *FightService) RemoveBuff(ctx context.Context, target *charact...
    method UpdateFight (line 171) | func (s *FightService) UpdateFight(ctx context.Context, actor *charact...
    method onActorDeath (line 178) | func (s *FightService) onActorDeath(ctx context.Context, deadActor, ki...
    method Resurrect (line 183) | func (s *FightService) Resurrect(ctx context.Context, actor *character...
  function NewFightService (line 30) | func NewFightService(characterService *CharacterService) *FightService {

FILE: internal/application/services/hangup_service.go
  type HangupService (line 11) | type HangupService struct
    method StartHangup (line 43) | func (s *HangupService) StartHangup(ctx context.Context, playerID stri...
    method StopHangup (line 87) | func (s *HangupService) StopHangup(ctx context.Context, playerID strin...
    method GetHangupStatus (line 143) | func (s *HangupService) GetHangupStatus(ctx context.Context, playerID ...
    method GetAvailableLocations (line 181) | func (s *HangupService) GetAvailableLocations(ctx context.Context, pla...
    method GetHangupHistory (line 209) | func (s *HangupService) GetHangupHistory(ctx context.Context, playerID...
    method GetHangupStatistics (line 222) | func (s *HangupService) GetHangupStatistics(ctx context.Context, playe...
    method ClaimOfflineReward (line 235) | func (s *HangupService) ClaimOfflineReward(ctx context.Context, player...
    method updateStatistics (line 269) | func (s *HangupService) updateStatistics(ctx context.Context, playerID...
    method buildHangupStatusDTO (line 292) | func (s *HangupService) buildHangupStatusDTO(hangupRecord *hangup.Hang...
    method buildLocationDTOs (line 307) | func (s *HangupService) buildLocationDTOs(locations []*hangup.HangupLo...
    method buildHistoryDTOs (line 324) | func (s *HangupService) buildHistoryDTOs(history []*hangup.HangupAggre...
    method buildStatisticsDTO (line 342) | func (s *HangupService) buildStatisticsDTO(stats *hangup.HangupStatist...
    method calculateEstimatedReward (line 358) | func (s *HangupService) calculateEstimatedReward(hangupRecord *hangup....
  function NewHangupService (line 22) | func NewHangupService(
  type HangupStatusDTO (line 370) | type HangupStatusDTO struct
  type HangupLocationDTO (line 382) | type HangupLocationDTO struct
  type HangupHistoryDTO (line 393) | type HangupHistoryDTO struct
  type HangupStatisticsDTO (line 405) | type HangupStatisticsDTO struct
  type LocationStats (line 418) | type LocationStats struct

FILE: internal/application/services/item_service.go
  type ItemService (line 14) | type ItemService struct
    method CreateItem (line 26) | func (s *ItemService) CreateItem(ctx context.Context, characterID int6...
    method GetItem (line 56) | func (s *ItemService) GetItem(ctx context.Context, itemUID int64) (*pe...
    method GetCharacterItems (line 61) | func (s *ItemService) GetCharacterItems(ctx context.Context, character...
    method UseItem (line 66) | func (s *ItemService) UseItem(ctx context.Context, itemUID int64) error {
    method MoveItem (line 92) | func (s *ItemService) MoveItem(ctx context.Context, itemUID int64, new...
    method DeleteItem (line 105) | func (s *ItemService) DeleteItem(ctx context.Context, itemUID int64) e...
    method SplitItem (line 110) | func (s *ItemService) SplitItem(ctx context.Context, itemUID int64, sp...
    method MergeItem (line 147) | func (s *ItemService) MergeItem(ctx context.Context, fromUID, toUID in...
  function NewItemService (line 19) | func NewItemService(itemRepo *persistence.ItemRepository) *ItemService {

FILE: internal/application/services/mail_service.go
  type MailService (line 12) | type MailService struct
    method SendMail (line 24) | func (s *MailService) SendMail(ctx context.Context, receiverID int64, ...
    method GetMails (line 51) | func (s *MailService) GetMails(ctx context.Context, receiverID int64, ...
    method ReadMail (line 60) | func (s *MailService) ReadMail(ctx context.Context, mailID int64) error {
    method DeleteMail (line 65) | func (s *MailService) DeleteMail(ctx context.Context, mailID int64) er...
    method ClaimAttachments (line 70) | func (s *MailService) ClaimAttachments(ctx context.Context, mailID int...
    method SendSystemMail (line 80) | func (s *MailService) SendSystemMail(ctx context.Context, receiverID i...
    method SendRewardMail (line 85) | func (s *MailService) SendRewardMail(ctx context.Context, receiverID i...
    method CleanupExpiredMails (line 100) | func (s *MailService) CleanupExpiredMails(ctx context.Context) error {
  function NewMailService (line 17) | func NewMailService(mailRepo *persistence.MailRepository) *MailService {

FILE: internal/application/services/map_service.go
  type MapService (line 15) | type MapService struct
    method SetBroadcaster (line 32) | func (s *MapService) SetBroadcaster(fn mapmanager.BroadcastFn) {
    method SetSpawnManager (line 43) | func (s *MapService) SetSpawnManager(sm *SpawnManager) {
    method LoadMap (line 50) | func (s *MapService) LoadMap(ctx context.Context, mapID int32) error {
    method GetMap (line 76) | func (s *MapService) GetMap(mapID int32) (*mapmanager.Map, error) {
    method EnterMap (line 89) | func (s *MapService) EnterMap(ctx context.Context, entity *character.E...
    method LeaveMap (line 117) | func (s *MapService) LeaveMap(ctx context.Context, entity *character.E...
    method LeaveMapByID (line 128) | func (s *MapService) LeaveMapByID(ctx context.Context, mapID int32, en...
    method UpdatePosition (line 137) | func (s *MapService) UpdatePosition(ctx context.Context, entity *chara...
    method UpdatePositionByID (line 147) | func (s *MapService) UpdatePositionByID(ctx context.Context, mapID int...
    method GetEntitiesInRange (line 156) | func (s *MapService) GetEntitiesInRange(ctx context.Context, mapID int...
    method TransferMap (line 166) | func (s *MapService) TransferMap(ctx context.Context, entity *characte...
    method BroadcastToMap (line 183) | func (s *MapService) BroadcastToMap(ctx context.Context, mapID int32, ...
    method BroadcastToRange (line 201) | func (s *MapService) BroadcastToRange(ctx context.Context, mapID int32...
    method Tick (line 213) | func (s *MapService) Tick(ctx context.Context, delta time.Duration) {
  function NewMapService (line 25) | func NewMapService() *MapService {

FILE: internal/application/services/minigame_service.go
  type MinigameApplicationService (line 12) | type MinigameApplicationService struct
    method CreateMinigame (line 59) | func (s *MinigameApplicationService) CreateMinigame(ctx context.Contex...
    method StartGameSession (line 136) | func (s *MinigameApplicationService) StartGameSession(ctx context.Cont...
    method SubmitGameScore (line 233) | func (s *MinigameApplicationService) SubmitGameScore(ctx context.Conte...
    method GetGameSession (line 338) | func (s *MinigameApplicationService) GetGameSession(ctx context.Contex...
    method GetPlayerScores (line 406) | func (s *MinigameApplicationService) GetPlayerScores(ctx context.Conte...
    method GetMinigameLeaderboard (line 490) | func (s *MinigameApplicationService) GetMinigameLeaderboard(ctx contex...
    method validateCreateMinigameRequest (line 540) | func (s *MinigameApplicationService) validateCreateMinigameRequest(req...
    method validateStartGameSessionRequest (line 563) | func (s *MinigameApplicationService) validateStartGameSessionRequest(r...
    method validateSubmitGameScoreRequest (line 574) | func (s *MinigameApplicationService) validateSubmitGameScoreRequest(re...
    method parseGameType (line 585) | func (s *MinigameApplicationService) parseGameType(gameTypeStr string)...
    method parseDifficulty (line 605) | func (s *MinigameApplicationService) parseDifficulty(difficultyStr str...
  function NewMinigameApplicationService (line 20) | func NewMinigameApplicationService(
  type CreateMinigameRequest (line 35) | type CreateMinigameRequest struct
  type CreateMinigameResponse (line 46) | type CreateMinigameResponse struct
  type StartGameSessionRequest (line 118) | type StartGameSessionRequest struct
  type StartGameSessionResponse (line 125) | type StartGameSessionResponse struct
  type SubmitGameScoreRequest (line 207) | type SubmitGameScoreRequest struct
  type SubmitGameScoreResponse (line 214) | type SubmitGameScoreResponse struct
  type GameRewardResponse (line 225) | type GameRewardResponse struct
  type GetGameSessionRequest (line 317) | type GetGameSessionRequest struct
  type GetGameSessionResponse (line 322) | type GetGameSessionResponse struct
  type GetPlayerScoresRequest (line 383) | type GetPlayerScoresRequest struct
  type PlayerScoreResponse (line 390) | type PlayerScoreResponse struct
  type GetPlayerScoresResponse (line 399) | type GetPlayerScoresResponse struct
  type GetMinigameLeaderboardRequest (line 466) | type GetMinigameLeaderboardRequest struct
  type LeaderboardEntryResponse (line 473) | type LeaderboardEntryResponse struct
  type GetMinigameLeaderboardResponse (line 482) | type GetMinigameLeaderboardResponse struct

FILE: internal/application/services/npc_service.go
  type NPCService (line 12) | type NPCService struct
    method GetNPCInfo (line 47) | func (s *NPCService) GetNPCInfo(ctx context.Context, npcID string) (*N...
    method GetNearbyNPCs (line 70) | func (s *NPCService) GetNearbyNPCs(ctx context.Context, playerID strin...
    method StartDialogue (line 95) | func (s *NPCService) StartDialogue(ctx context.Context, playerID strin...
    method ContinueDialogue (line 124) | func (s *NPCService) ContinueDialogue(ctx context.Context, playerID st...
    method EndDialogue (line 154) | func (s *NPCService) EndDialogue(ctx context.Context, playerID string,...
    method GetAvailableQuests (line 184) | func (s *NPCService) GetAvailableQuests(ctx context.Context, playerID ...
    method AcceptQuest (line 203) | func (s *NPCService) AcceptQuest(ctx context.Context, playerID string,...
    method CompleteQuest (line 225) | func (s *NPCService) CompleteQuest(ctx context.Context, playerID strin...
    method GetShopInfo (line 253) | func (s *NPCService) GetShopInfo(ctx context.Context, npcID string) (*...
    method BuyItem (line 264) | func (s *NPCService) BuyItem(ctx context.Context, playerID string, sho...
    method GetRelationship (line 297) | func (s *NPCService) GetRelationship(ctx context.Context, playerID str...
    method UpdateRelationship (line 320) | func (s *NPCService) UpdateRelationship(ctx context.Context, playerID ...
    method GetNPCStatistics (line 367) | func (s *NPCService) GetNPCStatistics(ctx context.Context, npcID strin...
    method filterNPCsByDistance (line 379) | func (s *NPCService) filterNPCsByDistance(npcs []*npc.NPCAggregate, lo...
    method updateDialogueStatistics (line 390) | func (s *NPCService) updateDialogueStatistics(ctx context.Context, pla...
    method updateQuestStatistics (line 409) | func (s *NPCService) updateQuestStatistics(ctx context.Context, player...
    method buildNPCDTO (line 430) | func (s *NPCService) buildNPCDTO(npcAggregate *npc.NPCAggregate) *NPCD...
    method buildNPCDTOs (line 449) | func (s *NPCService) buildNPCDTOs(npcs []*npc.NPCAggregate) []*NPCDTO {
    method buildLocationDTO (line 458) | func (s *NPCService) buildLocationDTO(location *npc.Location) *Locatio...
    method buildAttributesDTO (line 469) | func (s *NPCService) buildAttributesDTO(attributes *npc.NPCAttributes)...
    method buildBehaviorDTO (line 482) | func (s *NPCService) buildBehaviorDTO(behavior *npc.NPCBehavior) *NPCB...
    method buildDialogueSessionDTO (line 492) | func (s *NPCService) buildDialogueSessionDTO(session *npc.DialogueSess...
    method buildDialogueResponseDTO (line 505) | func (s *NPCService) buildDialogueResponseDTO(response *npc.DialogueRe...
    method buildDialogueChoiceDTOs (line 517) | func (s *NPCService) buildDialogueChoiceDTOs(choices []*npc.DialogueOp...
    method buildQuestDTOs (line 532) | func (s *NPCService) buildQuestDTOs(quests []*npc.Quest) []*QuestDTO {
    method buildQuestInstanceDTO (line 551) | func (s *NPCService) buildQuestInstanceDTO(instance *npc.QuestInstance...
    method buildQuestRewardDTO (line 565) | func (s *NPCService) buildQuestRewardDTO(reward *npc.QuestReward) *Que...
    method buildShopDTO (line 575) | func (s *NPCService) buildShopDTO(shop *npc.Shop) *ShopDTO {
    method buildShopItemDTOs (line 588) | func (s *NPCService) buildShopItemDTOs(items []*npc.ShopItem) []*ShopI...
    method buildShopScheduleDTO (line 605) | func (s *NPCService) buildShopScheduleDTO(schedule *npc.ShopSchedule) ...
    method buildTradeResultDTO (line 615) | func (s *NPCService) buildTradeResultDTO(result *npc.TradeResult) *Tra...
    method buildRelationshipDTO (line 627) | func (s *NPCService) buildRelationshipDTO(relationship *npc.Relationsh...
    method buildNPCStatisticsDTO (line 639) | func (s *NPCService) buildNPCStatisticsDTO(stats *npc.NPCStatistics) *...
  function NewNPCService (line 24) | func NewNPCService(
  type NPCDTO (line 656) | type NPCDTO struct
  type LocationDTO (line 673) | type LocationDTO struct
  type NPCAttributesDTO (line 682) | type NPCAttributesDTO struct
  type NPCBehaviorDTO (line 693) | type NPCBehaviorDTO struct
  type DialogueSessionDTO (line 701) | type DialogueSessionDTO struct
  type DialogueResponseDTO (line 712) | type DialogueResponseDTO struct
  type DialogueChoiceDTO (line 722) | type DialogueChoiceDTO struct
  type QuestDTO (line 731) | type QuestDTO struct
  type QuestInstanceDTO (line 744) | type QuestInstanceDTO struct
  type QuestRewardDTO (line 756) | type QuestRewardDTO struct
  type ShopDTO (line 764) | type ShopDTO struct
  type ShopItemDTO (line 775) | type ShopItemDTO struct
  type ShopScheduleDTO (line 786) | type ShopScheduleDTO struct
  type TradeResultDTO (line 794) | type TradeResultDTO struct
  type RelationshipDTO (line 804) | type RelationshipDTO struct
  type NPCStatisticsDTO (line 814) | type NPCStatisticsDTO struct

FILE: internal/application/services/pet_service.go
  type PetApplicationService (line 12) | type PetApplicationService struct
    method CreatePet (line 67) | func (s *PetApplicationService) CreatePet(ctx context.Context, req *Cr...
    method FeedPet (line 140) | func (s *PetApplicationService) FeedPet(ctx context.Context, req *Feed...
    method TrainPet (line 220) | func (s *PetApplicationService) TrainPet(ctx context.Context, req *Tra...
    method GetPet (line 311) | func (s *PetApplicationService) GetPet(ctx context.Context, req *GetPe...
    method GetPlayerPets (line 368) | func (s *PetApplicationService) GetPlayerPets(ctx context.Context, req...
    method validateCreatePetRequest (line 442) | func (s *PetApplicationService) validateCreatePetRequest(req *CreatePe...
    method validateFeedPetRequest (line 459) | func (s *PetApplicationService) validateFeedPetRequest(req *FeedPetReq...
    method validateTrainPetRequest (line 473) | func (s *PetApplicationService) validateTrainPetRequest(req *TrainPetR...
    method parseRarity (line 487) | func (s *PetApplicationService) parseRarity(rarityStr string) (pet.Pet...
    method parseSource (line 506) | func (s *PetApplicationService) parseSource(sourceStr string) (string,...
    method calculateFoodExp (line 524) | func (s *PetApplicationService) calculateFoodExp(foodType string, amou...
    method calculateTrainingGains (line 541) | func (s *PetApplicationService) calculateTrainingGains(trainingType st...
    method calculateTrainingExp (line 571) | func (s *PetApplicationService) calculateTrainingExp(trainingType stri...
    method checkSkillLearning (line 577) | func (s *PetApplicationService) checkSkillLearning(petAggregate *pet.P...
  function NewPetApplicationService (line 24) | func NewPetApplicationService(
  type CreatePetRequest (line 47) | type CreatePetRequest struct
  type CreatePetResponse (line 56) | type CreatePetResponse struct
  type FeedPetRequest (line 123) | type FeedPetRequest struct
  type FeedPetResponse (line 130) | type FeedPetResponse struct
  type TrainPetRequest (line 202) | type TrainPetRequest struct
  type TrainPetResponse (line 209) | type TrainPetResponse struct
  type GetPetRequest (line 284) | type GetPetRequest struct
  type GetPetResponse (line 289) | type GetPetResponse struct
  type GetPlayerPetsRequest (line 350) | type GetPlayerPetsRequest struct
  type GetPlayerPetsResponse (line 359) | type GetPlayerPetsResponse struct

FILE: internal/application/services/plant_service.go
  type PlantService (line 11) | type PlantService struct
    method GetFarmInfo (line 43) | func (s *PlantService) GetFarmInfo(ctx context.Context, playerID strin...
    method PlantSeed (line 71) | func (s *PlantService) PlantSeed(ctx context.Context, playerID string,...
    method WaterCrop (line 126) | func (s *PlantService) WaterCrop(ctx context.Context, playerID string,...
    method FertilizeCrop (line 163) | func (s *PlantService) FertilizeCrop(ctx context.Context, playerID str...
    method HarvestCrop (line 201) | func (s *PlantService) HarvestCrop(ctx context.Context, playerID strin...
    method GetCropInfo (line 254) | func (s *PlantService) GetCropInfo(ctx context.Context, playerID strin...
    method GetPlayerCrops (line 272) | func (s *PlantService) GetPlayerCrops(ctx context.Context, playerID st...
    method GetAvailableSeeds (line 285) | func (s *PlantService) GetAvailableSeeds(ctx context.Context, playerID...
    method GetHarvestHistory (line 312) | func (s *PlantService) GetHarvestHistory(ctx context.Context, playerID...
    method GetPlantingStatistics (line 324) | func (s *PlantService) GetPlantingStatistics(ctx context.Context, play...
    method UpdateCropGrowth (line 336) | func (s *PlantService) UpdateCropGrowth(ctx context.Context) error {
    method UpgradeFarmPlot (line 366) | func (s *PlantService) UpgradeFarmPlot(ctx context.Context, playerID s...
    method updatePlantingStatistics (line 400) | func (s *PlantService) updatePlantingStatistics(ctx context.Context, p...
    method updateHarvestStatistics (line 424) | func (s *PlantService) updateHarvestStatistics(ctx context.Context, pl...
    method buildFarmDTO (line 448) | func (s *PlantService) buildFarmDTO(farm *plant.FarmAggregate) *FarmDTO {
    method buildCropDTO (line 475) | func (s *PlantService) buildCropDTO(crop *plant.Crop) *CropDTO {
    method buildCropDTOs (line 497) | func (s *PlantService) buildCropDTOs(crops []*plant.Crop) []*CropDTO {
    method buildSeedDTOs (line 506) | func (s *PlantService) buildSeedDTOs(seeds []plant.SeedType) []*SeedDTO {
    method buildHarvestResultDTO (line 525) | func (s *PlantService) buildHarvestResultDTO(harvestResult *plant.Harv...
    method buildHarvestHistoryDTOs (line 538) | func (s *PlantService) buildHarvestHistoryDTOs(history []*plant.Harves...
    method buildStatisticsDTO (line 554) | func (s *PlantService) buildStatisticsDTO(stats *plant.FarmStatistics)...
  function NewPlantService (line 22) | func NewPlantService(
  type FarmDTO (line 571) | type FarmDTO struct
  type PlotDTO (line 583) | type PlotDTO struct
  type CropDTO (line 594) | type CropDTO struct
  type SeedDTO (line 614) | type SeedDTO struct
  type HarvestResultDTO (line 627) | type HarvestResultDTO struct
  type HarvestHistoryDTO (line 638) | type HarvestHistoryDTO struct
  type PlantingStatisticsDTO (line 648) | type PlantingStatisticsDTO struct
  type CropTypeStats (line 661) | type CropTypeStats struct

FILE: internal/application/services/player_service.go
  type PlayerService (line 13) | type PlayerService struct
    method CreatePlayer (line 37) | func (s *PlayerService) CreatePlayer(ctx context.Context, cmd *CreateP...
    method MovePlayer (line 62) | func (s *PlayerService) MovePlayer(ctx context.Context, playerID strin...
    method LoginPlayer (line 102) | func (s *PlayerService) LoginPlayer(ctx context.Context, cmd *LoginPla...
    method LogoutPlayer (line 139) | func (s *PlayerService) LogoutPlayer(ctx context.Context, cmd *LogoutP...
    method MovePlayerWithCommand (line 169) | func (s *PlayerService) MovePlayerWithCommand(ctx context.Context, cmd...
    method DeletePlayer (line 199) | func (s *PlayerService) DeletePlayer(ctx context.Context, playerID str...
    method GetPlayer (line 233) | func (s *PlayerService) GetPlayer(ctx context.Context, query *GetPlaye...
    method GetOnlinePlayers (line 266) | func (s *PlayerService) GetOnlinePlayers(ctx context.Context, query *G...
    method Login (line 297) | func (s *PlayerService) Login(ctx context.Context, playerID string) (*...
    method Logout (line 329) | func (s *PlayerService) Logout(ctx context.Context, playerID string) e...
    method GetPlayerInfo (line 354) | func (s *PlayerService) GetPlayerInfo(ctx context.Context, playerID st...
    method UpdatePlayer (line 378) | func (s *PlayerService) UpdatePlayer(ctx context.Context, playerID str...
  function NewPlayerService (line 18) | func NewPlayerService(playerRepo player.Repository) *PlayerService {
  type CreatePlayerCommand (line 25) | type CreatePlayerCommand struct
  type CreatePlayerResult (line 30) | type CreatePlayerResult struct
  type LoginPlayerCommand (line 87) | type LoginPlayerCommand struct
  type LoginPlayerResult (line 92) | type LoginPlayerResult struct
  type LogoutPlayerCommand (line 134) | type LogoutPlayerCommand struct
  type MovePlayerCommand (line 163) | type MovePlayerCommand struct
  type GetPlayerQuery (line 194) | type GetPlayerQuery struct
  type GetPlayerResult (line 222) | type GetPlayerResult struct
  type GetOnlinePlayersQuery (line 255) | type GetOnlinePlayersQuery struct
  type GetOnlinePlayersResult (line 260) | type GetOnlinePlayersResult struct

FILE: internal/application/services/quest_service.go
  type QuestService (line 14) | type QuestService struct
    method AcceptQuest (line 26) | func (s *QuestService) AcceptQuest(ctx context.Context, characterID in...
    method GetQuests (line 62) | func (s *QuestService) GetQuests(ctx context.Context, characterID int6...
    method UpdateObjective (line 67) | func (s *QuestService) UpdateObjective(ctx context.Context, characterI...
    method SubmitQuest (line 120) | func (s *QuestService) SubmitQuest(ctx context.Context, characterID in...
    method AbandonQuest (line 157) | func (s *QuestService) AbandonQuest(ctx context.Context, characterID i...
    method OnKill (line 184) | func (s *QuestService) OnKill(ctx context.Context, characterID int64, ...
    method OnCollect (line 189) | func (s *QuestService) OnCollect(ctx context.Context, characterID int6...
    method OnReach (line 194) | func (s *QuestService) OnReach(ctx context.Context, characterID int64,...
    method OnTalk (line 199) | func (s *QuestService) OnTalk(ctx context.Context, characterID int64, ...
  function NewQuestService (line 19) | func NewQuestService(questRepo *persistence.QuestRepository) *QuestServi...

FILE: internal/application/services/ranking_service.go
  type RankingApplicationService (line 12) | type RankingApplicationService struct
    method CreateRanking (line 57) | func (s *RankingApplicationService) CreateRanking(ctx context.Context,...
    method UpdatePlayerScore (line 139) | func (s *RankingApplicationService) UpdatePlayerScore(ctx context.Cont...
    method GetRanking (line 256) | func (s *RankingApplicationService) GetRanking(ctx context.Context, re...
    method GetPlayerRank (line 339) | func (s *RankingApplicationService) GetPlayerRank(ctx context.Context,...
    method GetTopPlayers (line 382) | func (s *RankingApplicationService) GetTopPlayers(ctx context.Context,...
    method ResetRanking (line 444) | func (s *RankingApplicationService) ResetRanking(ctx context.Context, ...
    method validateCreateRankingRequest (line 487) | func (s *RankingApplicationService) validateCreateRankingRequest(req *...
    method validateUpdatePlayerScoreRequest (line 510) | func (s *RankingApplicationService) validateUpdatePlayerScoreRequest(r...
    method parseRankType (line 521) | func (s *RankingApplicationService) parseRankType(rankTypeStr string) ...
    method parsePeriodType (line 543) | func (s *RankingApplicationService) parsePeriodType(periodTypeStr stri...
  function NewRankingApplicationService (line 20) | func NewRankingApplicationService(
  type CreateRankingRequest (line 35) | type CreateRankingRequest struct
  type CreateRankingResponse (line 45) | type CreateRankingResponse struct
  type UpdatePlayerScoreRequest (line 119) | type UpdatePlayerScoreRequest struct
  type UpdatePlayerScoreResponse (line 127) | type UpdatePlayerScoreResponse struct
  type GetRankingRequest (line 225) | type GetRankingRequest struct
  type RankEntryResponse (line 232) | type RankEntryResponse struct
  type GetRankingResponse (line 241) | type GetRankingResponse struct
  type GetPlayerRankRequest (line 322) | type GetPlayerRankRequest struct
  type GetPlayerRankResponse (line 328) | type GetPlayerRankResponse struct
  type GetTopPlayersRequest (line 369) | type GetTopPlayersRequest struct
  type GetTopPlayersResponse (line 375) | type GetTopPlayersResponse struct
  type ResetRankingRequest (line 431) | type ResetRankingRequest struct
  type ResetRankingResponse (line 437) | type ResetRankingResponse struct

FILE: internal/application/services/replication_service.go
  type ReplicationService (line 17) | type ReplicationService struct
    method CreateInstance (line 86) | func (s *ReplicationService) CreateInstance(ctx context.Context, cmd *...
    method JoinInstance (line 151) | func (s *ReplicationService) JoinInstance(ctx context.Context, cmd *Jo...
    method LeaveInstance (line 191) | func (s *ReplicationService) LeaveInstance(ctx context.Context, cmd *L...
    method UpdateInstanceProgress (line 231) | func (s *ReplicationService) UpdateInstanceProgress(ctx context.Contex...
    method GetInstanceInfo (line 267) | func (s *ReplicationService) GetInstanceInfo(ctx context.Context, inst...
    method ListActiveInstances (line 291) | func (s *ReplicationService) ListActiveInstances(ctx context.Context) ...
    method CleanupExpiredInstances (line 317) | func (s *ReplicationService) CleanupExpiredInstances(ctx context.Conte...
    method publishEvents (line 348) | func (s *ReplicationService) publishEvents(ctx context.Context, instan...
  function NewReplicationService (line 24) | func NewReplicationService(
  type CreateInstanceCommand (line 37) | type CreateInstanceCommand struct
  type JoinInstanceCommand (line 49) | type JoinInstanceCommand struct
  type LeaveInstanceCommand (line 58) | type LeaveInstanceCommand struct
  type UpdateInstanceProgressCommand (line 64) | type UpdateInstanceProgressCommand struct
  type InstanceInfoDTO (line 71) | type InstanceInfoDTO struct

FILE: internal/application/services/sacred_service.go
  type SacredService (line 12) | type SacredService struct
    method GetSacredPlace (line 46) | func (s *SacredService) GetSacredPlace(ctx context.Context, sacredID s...
    method GetAvailableSacredPlaces (line 69) | func (s *SacredService) GetAvailableSacredPlaces(ctx context.Context, ...
    method EnterSacredPlace (line 93) | func (s *SacredService) EnterSacredPlace(ctx context.Context, playerID...
    method StartChallenge (line 125) | func (s *SacredService) StartChallenge(ctx context.Context, playerID s...
    method CompleteChallenge (line 148) | func (s *SacredService) CompleteChallenge(ctx context.Context, playerI...
    method ActivateBlessing (line 182) | func (s *SacredService) ActivateBlessing(ctx context.Context, playerID...
    method GetPlayerBlessings (line 203) | func (s *SacredService) GetPlayerBlessings(ctx context.Context, player...
    method GetAvailableArtifacts (line 214) | func (s *SacredService) GetAvailableArtifacts(ctx context.Context, sac...
    method UseArtifact (line 225) | func (s *SacredService) UseArtifact(ctx context.Context, playerID stri...
    method GetSacredStatistics (line 249) | func (s *SacredService) GetSacredStatistics(ctx context.Context, playe...
    method GetChallengeHistory (line 260) | func (s *SacredService) GetChallengeHistory(ctx context.Context, playe...
    method updateChallengeStatistics (line 273) | func (s *SacredService) updateChallengeStatistics(ctx context.Context,...
    method buildSacredPlaceDTO (line 293) | func (s *SacredService) buildSacredPlaceDTO(sacredPlace *sacred.Sacred...
    method buildSacredPlaceDTOs (line 312) | func (s *SacredService) buildSacredPlaceDTOs(sacredPlaces []*sacred.Sa...
    method buildChallengeInstanceDTO (line 321) | func (s *SacredService) buildChallengeInstanceDTO(instance *sacred.Cha...
    method buildChallengeRewardDTO (line 337) | func (s *SacredService) buildChallengeRewardDTO(reward *sacred.Challen...
    method buildPlayerBlessingDTOs (line 348) | func (s *SacredService) buildPlayerBlessingDTOs(blessings []interface{...
    method buildArtifactDTOs (line 368) | func (s *SacredService) buildArtifactDTOs(artifacts []interface{}) []*...
    method buildArtifactEffectDTO (line 389) | func (s *SacredService) buildArtifactEffectDTO(effect interface{}) *Ar...
    method buildChallengeHistoryDTOs (line 399) | func (s *SacredService) buildChallengeHistoryDTOs(history []*sacred.Ch...
    method buildStatisticsDTO (line 417) | func (s *SacredService) buildStatisticsDTO(stats *sacred.SacredStatist...
  function NewSacredService (line 24) | func NewSacredService(
  type SacredPlaceDTO (line 435) | type SacredPlaceDTO struct
  type ChallengeInstanceDTO (line 452) | type ChallengeInstanceDTO struct
  type ChallengeRewardDTO (line 466) | type ChallengeRewardDTO struct
  type PlayerBlessingDTO (line 474) | type PlayerBlessingDTO struct
  type ArtifactDTO (line 487) | type ArtifactDTO struct
  type ArtifactEffectDTO (line 501) | type ArtifactEffectDTO struct
  type ChallengeHistoryDTO (line 509) | type ChallengeHistoryDTO struct
  type SacredStatisticsDTO (line 521) | type SacredStatisticsDTO struct
  type ChallengeResultData (line 535) | type ChallengeResultData struct

FILE: internal/application/services/scene_service.go
  type SceneService (line 15) | type SceneService struct
    method CreateScene (line 58) | func (s *SceneService) CreateScene(ctx context.Context, cmd *CreateSce...
    method PlayerEnterScene (line 107) | func (s *SceneService) PlayerEnterScene(ctx context.Context, cmd *Play...
    method PlayerLeaveScene (line 160) | func (s *SceneService) PlayerLeaveScene(ctx context.Context, cmd *Play...
    method UpdateScene (line 207) | func (s *SceneService) UpdateScene(ctx context.Context, cmd *UpdateSce...
    method GetSceneInfo (line 257) | func (s *SceneService) GetSceneInfo(ctx context.Context, query *GetSce...
    method ListAvailableScenes (line 284) | func (s *SceneService) ListAvailableScenes(ctx context.Context, query ...
  type EventPublisher (line 22) | type EventPublisher interface
  function NewSceneService (line 27) | func NewSceneService(
  type CreateSceneCommand (line 40) | type CreateSceneCommand struct
  type CreateSceneResult (line 50) | type CreateSceneResult struct
  type PlayerEnterSceneCommand (line 98) | type PlayerEnterSceneCommand struct
  type PlayerLeaveSceneCommand (line 154) | type PlayerLeaveSceneCommand struct
  type UpdateSceneCommand (line 201) | type UpdateSceneCommand struct
  type GetSceneInfoQuery (line 242) | type GetSceneInfoQuery struct
  type SceneInfoDTO (line 247) | type SceneInfoDTO struct
  type ListAvailableScenesQuery (line 278) | type ListAvailableScenesQuery struct

FILE: internal/application/services/service_registry.go
  type ServiceRegistry (line 13) | type ServiceRegistry struct
    method RegisterCoreServices (line 29) | func (r *ServiceRegistry) RegisterCoreServices() error {
    method RegisterDomainServices (line 62) | func (r *ServiceRegistry) RegisterDomainServices() error {
    method RegisterApplicationServices (line 79) | func (r *ServiceRegistry) RegisterApplicationServices() error {
    method registerCommandHandlers (line 94) | func (r *ServiceRegistry) registerCommandHandlers() error {
    method registerQueryHandlers (line 101) | func (r *ServiceRegistry) registerQueryHandlers() error {
    method Start (line 108) | func (r *ServiceRegistry) Start(ctx context.Context) error {
    method Stop (line 145) | func (r *ServiceRegistry) Stop(ctx context.Context) error {
    method GetContainer (line 157) | func (r *ServiceRegistry) GetContainer() *container.SimpleContainer {
    method GetCommandBus (line 162) | func (r *ServiceRegistry) GetCommandBus() interfaces.CommandBus {
    method GetQueryBus (line 167) | func (r *ServiceRegistry) GetQueryBus() interfaces.QueryBus {
    method GetEventBus (line 172) | func (r *ServiceRegistry) GetEventBus() interfaces.EventBus {
    method GetLogger (line 177) | func (r *ServiceRegistry) GetLogger() logging.Logger {
  function NewServiceRegistry (line 22) | func NewServiceRegistry() *ServiceRegistry {
  type mockCommandBus (line 183) | type mockCommandBus struct
    method RegisterHandler (line 185) | func (m *mockCommandBus) RegisterHandler(commandType string, handler i...
    method Execute (line 186) | func (m *mockCommandBus) Execute(ctx context.Context, cmd interfaces.C...
  type mockQueryBus (line 190) | type mockQueryBus struct
    method RegisterHandler (line 192) | func (m *mockQueryBus) RegisterHandler(queryType string, handler inter...
    method Execute (line 193) | func (m *mockQueryBus) Execute(ctx context.Context, query interfaces.Q...
  type mockEventBus (line 197) | type mockEventBus struct
    method Publish (line 199) | func (m *mockEventBus) Publish(ctx context.Context, event interfaces.E...
    method Subscribe (line 202) | func (m *mockEventBus) Subscribe(eventType string, handler interfaces....
    method Unsubscribe (line 205) | func (m *mockEventBus) Unsubscribe(eventType string, handler interface...
  type mockPlayerService (line 209) | type mockPlayerService struct
  type mockBattleService (line 211) | type mockBattleService struct

FILE: internal/application/services/spawn_manager.go
  type SpawnTask (line 12) | type SpawnTask
  type SpawnManager (line 15) | type SpawnManager struct
    method Start (line 32) | func (m *SpawnManager) Start(parent context.Context, workers int) {
    method Stop (line 55) | func (m *SpawnManager) Stop() {
    method Enqueue (line 69) | func (m *SpawnManager) Enqueue(task SpawnTask) {
  function NewSpawnManager (line 22) | func NewSpawnManager(logger logging.Logger, queueSize int) *SpawnManager {
  function safeRun (line 77) | func safeRun(ctx context.Context, task SpawnTask, logger logging.Logger) {

FILE: internal/application/services/update_manager.go
  type Updatable (line 12) | type Updatable interface
  type UpdateFunc (line 17) | type UpdateFunc
    method Update (line 19) | func (f UpdateFunc) Update(ctx context.Context, delta time.Duration) e...
  type UpdateManager (line 22) | type UpdateManager struct
    method Register (line 44) | func (m *UpdateManager) Register(id string, u Updatable) {
    method Unregister (line 51) | func (m *UpdateManager) Unregister(id string) {
    method Start (line 58) | func (m *UpdateManager) Start(parent context.Context) {
    method Stop (line 73) | func (m *UpdateManager) Stop() {
    method loop (line 88) | func (m *UpdateManager) loop(ctx context.Context) {
    method tick (line 108) | func (m *UpdateManager) tick(ctx context.Context, delta time.Duration) {
  function NewUpdateManager (line 32) | func NewUpdateManager(logger logging.Logger, interval time.Duration) *Up...

FILE: internal/application/services/user_service.go
  type UserService (line 15) | type UserService struct
    method Register (line 27) | func (s *UserService) Register(ctx context.Context, username, password...
    method Login (line 59) | func (s *UserService) Login(ctx context.Context, username, password st...
    method GetUserInfo (line 85) | func (s *UserService) GetUserInfo(ctx context.Context, userID int64) (...
    method BanUser (line 90) | func (s *UserService) BanUser(ctx context.Context, userID int64) error {
    method UnbanUser (line 101) | func (s *UserService) UnbanUser(ctx context.Context, userID int64) err...
  function NewUserService (line 20) | func NewUserService(userRepo *persistence.UserRepository) *UserService {

FILE: internal/application/services/weather_service.go
  type WeatherService (line 11) | type WeatherService struct
    method GetCurrentWeather (line 40) | func (s *WeatherService) GetCurrentWeather(ctx context.Context, region...
    method GetWeatherForecast (line 64) | func (s *WeatherService) GetWeatherForecast(ctx context.Context, regio...
    method GetWeatherEffects (line 97) | func (s *WeatherService) GetWeatherEffects(ctx context.Context, region...
    method UpdateWeather (line 116) | func (s *WeatherService) UpdateWeather(ctx context.Context, regionID s...
    method GetWeatherHistory (line 152) | func (s *WeatherService) GetWeatherHistory(ctx context.Context, region...
    method GetWeatherStatistics (line 163) | func (s *WeatherService) GetWeatherStatistics(ctx context.Context, reg...
    method GetGlobalWeatherInfo (line 172) | func (s *WeatherService) GetGlobalWeatherInfo(ctx context.Context) (*G...
    method TriggerSpecialWeather (line 199) | func (s *WeatherService) TriggerSpecialWeather(ctx context.Context, re...
    method GetSeasonInfo (line 222) | func (s *WeatherService) GetSeasonInfo(ctx context.Context, regionID s...
    method updateStatistics (line 250) | func (s *WeatherService) updateStatistics(ctx context.Context, regionI...
    method buildWeatherDTO (line 271) | func (s *WeatherService) buildWeatherDTO(weatherAggregate *weather.Wea...
    method buildForecastDTOs (line 289) | func (s *WeatherService) buildForecastDTOs(forecasts []*weather.Weathe...
    method buildEffectDTOs (line 308) | func (s *WeatherService) buildEffectDTOs(effects []*weather.WeatherEff...
    method buildHistoryDTOs (line 324) | func (s *WeatherService) buildHistoryDTOs(history []*weather.WeatherAg...
    method buildStatisticsDTO (line 342) | func (s *WeatherService) buildStatisticsDTO(stats *weather.WeatherStat...
    method buildGlobalWeatherDTO (line 357) | func (s *WeatherService) buildGlobalWeatherDTO(allWeather []*weather.W...
    method buildSeasonInfoDTO (line 383) | func (s *WeatherService) buildSeasonInfoDTO(seasonInfo interface{}) *S...
  function NewWeatherService (line 21) | func NewWeatherService(
  type WeatherDTO (line 398) | type WeatherDTO struct
  type WeatherForecastDTO (line 414) | type WeatherForecastDTO struct
  type WeatherEffectDTO (line 427) | type WeatherEffectDTO struct
  type WeatherHistoryDTO (line 437) | type WeatherHistoryDTO struct
  type WeatherStatisticsDTO (line 449) | type WeatherStatisticsDTO struct
  type GlobalWeatherDTO (line 462) | type GlobalWeatherDTO struct
  type SeasonInfoDTO (line 471) | type SeasonInfoDTO struct

FILE: internal/auth/jwt.go
  type JWTManager (line 15) | type JWTManager struct
    method Generate (line 37) | func (manager *JWTManager) Generate(userID, username, role string) (st...
    method Verify (line 54) | func (manager *JWTManager) Verify(tokenString string) (*UserClaims, er...
    method Refresh (line 80) | func (manager *JWTManager) Refresh(tokenString string) (string, error) {
  type UserClaims (line 21) | type UserClaims struct
  function NewJWTManager (line 29) | func NewJWTManager(secretKey string, tokenDuration time.Duration) *JWTMa...

FILE: internal/base_module.go
  type BaseModule (line 11) | type BaseModule struct
    method OnEvent (line 18) | func (b *BaseModule) OnEvent(c Character, event interface{}) {
    method SetEventCategoryActive (line 22) | func (b *BaseModule) SetEventCategoryActive(eventCategory int) {
    method Get (line 30) | func (b *BaseModule) Get(id uint32) interface{} {
    method Load (line 34) | func (b *BaseModule) Load() {
    method Save (line 38) | func (b *BaseModule) Save() {
    method GetName (line 42) | func (b *BaseModule) GetName() string {
    method Description (line 46) | func (b *BaseModule) Description() string {
    method SetName (line 50) | func (b *BaseModule) SetName(str string) {
    method OnStart (line 54) | func (b *BaseModule) OnStart() {
    method AfterStart (line 58) | func (b *BaseModule) AfterStart() {
    method OnStop (line 62) | func (b *BaseModule) OnStop() {
    method AfterStop (line 66) | func (b *BaseModule) AfterStop() {
    method RegisterHandler (line 70) | func (b *BaseModule) RegisterHandler() {
  function NewBaseModule (line 26) | func NewBaseModule() *BaseModule {

FILE: internal/bootstrap/auth_bootstrap.go
  type AuthBootstrap (line 22) | type AuthBootstrap struct
    method UpdateConfig (line 46) | func (s *AuthBootstrap) UpdateConfig(cfg *config.Config) {
    method Start (line 52) | func (s *AuthBootstrap) Start() error {
    method Stop (line 98) | func (s *AuthBootstrap) Stop() error {
    method initializeInfrastructure (line 130) | func (s *AuthBootstrap) initializeInfrastructure(cfg *config.Config) e...
    method initializeHTTPServer (line 172) | func (s *AuthBootstrap) initializeHTTPServer(cfg *config.Config) error {
    method Done (line 187) | func (s *AuthBootstrap) Done() <-chan struct{} { return s.ctx.Done() }
  function NewAuthBootstrap (line 37) | func NewAuthBootstrap(cfg *config.Config, logger logging.Logger) *AuthBo...

FILE: internal/bootstrap/game_bootstrap.go
  type GameBootstrap (line 24) | type GameBootstrap struct
    method UpdateConfig (line 53) | func (s *GameBootstrap) UpdateConfig(cfg *config.Config) {
    method Start (line 59) | func (s *GameBootstrap) Start() error {
    method Stop (line 110) | func (s *GameBootstrap) Stop() error {
    method initializeInfrastructure (line 148) | func (s *GameBootstrap) initializeInfrastructure(cfg *config.Config) e...
    method initializeApplicationLayer (line 182) | func (s *GameBootstrap) initializeApplicationLayer(cfg *config.Config)...
    method initializeHTTPServer (line 191) | func (s *GameBootstrap) initializeHTTPServer(cfg *config.Config) error {
    method initializeRPCServer (line 202) | func (s *GameBootstrap) initializeRPCServer(cfg *config.Config) error {
    method Done (line 211) | func (s *GameBootstrap) Done() <-chan struct{} { return s.ctx.Done() }
  function NewGameBootstrap (line 44) | func NewGameBootstrap(cfg *config.Config, logger logging.Logger) *GameBo...

FILE: internal/bootstrap/gateway_bootstrap.go
  type GatewayBootstrap (line 26) | type GatewayBootstrap struct
    method UpdateConfig (line 60) | func (s *GatewayBootstrap) UpdateConfig(cfg *config.Config) {
    method Start (line 66) | func (s *GatewayBootstrap) Start() error {
    method Stop (line 123) | func (s *GatewayBootstrap) Stop() error {
    method initializeInfrastructure (line 153) | func (s *GatewayBootstrap) initializeInfrastructure(cfg *config.Config...
    method initializeApplicationLayer (line 193) | func (s *GatewayBootstrap) initializeApplicationLayer(cfg *config.Conf...
    method initializeTCPServer (line 217) | func (s *GatewayBootstrap) initializeTCPServer(cfg *config.Config) err...
    method Done (line 274) | func (s *GatewayBootstrap) Done() <-chan struct{} { return s.ctx.Done() }
  function NewGatewayBootstrap (line 51) | func NewGatewayBootstrap(cfg *config.Config, logger logging.Logger) *Gat...

FILE: internal/bootstrap/replication_bootstrap.go
  type ReplicationBootstrap (line 27) | type ReplicationBootstrap struct
    method UpdateConfig (line 52) | func (s *ReplicationBootstrap) UpdateConfig(cfg *config.Config) {
    method Start (line 58) | func (s *ReplicationBootstrap) Start() error {
    method Stop (line 116) | func (s *ReplicationBootstrap) Stop() error {
    method Done (line 155) | func (s *ReplicationBootstrap) Done() <-chan struct{} {
    method initializeInfrastructure (line 159) | func (s *ReplicationBootstrap) initializeInfrastructure(cfg *config.Co...
    method initializeApplicationLayer (line 206) | func (s *ReplicationBootstrap) initializeApplicationLayer(cfg *config....
    method initializeHTTPServer (line 217) | func (s *ReplicationBootstrap) initializeHTTPServer(cfg *config.Config...
    method initializeRPCServer (line 234) | func (s *ReplicationBootstrap) initializeRPCServer(cfg *config.Config)...
  function NewReplicationBootstrap (line 43) | func NewReplicationBootstrap(cfg *config.Config, logger logging.Logger) ...

FILE: internal/bootstrap/scene_bootstrap.go
  type SceneBootstrap (line 27) | type SceneBootstrap struct
    method UpdateConfig (line 52) | func (s *SceneBootstrap) UpdateConfig(cfg *config.Config) {
    method Done (line 59) | func (s *SceneBootstrap) Done() <-chan struct{} {
    method Start (line 63) | func (s *SceneBootstrap) Start() error {
    method Stop (line 121) | func (s *SceneBootstrap) Stop() error {
    method initializeInfrastructure (line 159) | func (s *SceneBootstrap) initializeInfrastructure(cfg *config.Config) ...
    method initializeApplicationLayer (line 206) | func (s *SceneBootstrap) initializeApplicationLayer(cfg *config.Config...
    method initializeHTTPServer (line 215) | func (s *SceneBootstrap) initializeHTTPServer(cfg *config.Config) error {
    method initializeRPCServer (line 229) | func (s *SceneBootstrap) initializeRPCServer(cfg *config.Config) error {
  function NewSceneBootstrap (line 43) | func NewSceneBootstrap(cfg *config.Config, logger logging.Logger) *Scene...

FILE: internal/config/config.go
  type Logger (line 20) | type Logger interface
  type Config (line 27) | type Config struct
  type ServerConfig (line 41) | type ServerConfig struct
  type DatabaseConfig (line 50) | type DatabaseConfig struct
  type RedisConfig (line 62) | type RedisConfig struct
  type NATSConfig (line 72) | type NATSConfig struct
  type GatewayConfig (line 84) | type GatewayConfig struct
  type SceneConfig (line 92) | type SceneConfig struct
  type BattleConfig (line 101) | type BattleConfig struct
  type ActivityConfig (line 110) | type ActivityConfig struct
  type LoginConfig (line 118) | type LoginConfig struct
  type LogConfig (line 127) | type LogConfig struct
  type Manager (line 138) | type Manager struct
    method Load (line 158) | func (m *Manager) Load() error {
    method Get (line 187) | func (m *Manager) Get() *Config {
    method Watch (line 194) | func (m *Manager) Watch(callback func(*Config)) {
    method StartWatching (line 201) | func (m *Manager) StartWatching() {
    method StopWatching (line 206) | func (m *Manager) StopWatching() {
    method watchConfigFile (line 211) | func (m *Manager) watchConfigFile() {
    method setDefaults (line 243) | func (m *Manager) setDefaults(config *Config) {
    method LoadFromEnv (line 314) | func (m *Manager) LoadFromEnv() {
    method Save (line 337) | func (m *Manager) Save() error {
  function NewManager (line 148) | func NewManager(configPath string, logger Logger) *Manager {

FILE: internal/config/loader.go
  type Loader (line 16) | type Loader struct
    method Load (line 99) | func (l *Loader) Load() (*Config, []string, error) {
    method LoadInto (line 159) | func (l *Loader) LoadInto(target any) ([]string, error) {
    method Environment (line 179) | func (l *Loader) Environment() string {
    method Service (line 184) | func (l *Loader) Service() string {
    method BaseDir (line 189) | func (l *Loader) BaseDir() string {
    method resolveCandidates (line 193) | func (l *Loader) resolveCandidates() []string {
    method applyEnvOverrides (line 225) | func (l *Loader) applyEnvOverrides(cfg *Config) {
  type Option (line 24) | type Option
  function NewLoader (line 27) | func NewLoader(opts ...Option) *Loader {
  function WithBaseDir (line 59) | func WithBaseDir(dir string) Option {
  function WithEnvironment (line 69) | func WithEnvironment(env string) Option {
  function WithService (line 76) | func WithService(service string) Option {
  function WithExplicitFiles (line 83) | func WithExplicitFiles(files ...string) Option {
  function normalizePaths (line 266) | func normalizePaths(paths []string) []string {
  function normalizeEnv (line 292) | func normalizeEnv(env string) string {

FILE: internal/config/loader_test.go
  function TestLoaderMergesFilesAndAppliesDefaults (line 9) | func TestLoaderMergesFilesAndAppliesDefaults(t *testing.T) {
  function TestLoaderRespectsEnvironmentOverrides (line 69) | func TestLoaderRespectsEnvironmentOverrides(t *testing.T) {

FILE: internal/config/manager.go
  type WatcherFunc (line 12) | type WatcherFunc
  type Manager (line 15) | type Manager struct
    method Config (line 68) | func (m *Manager) Config() *Config {
    method OnChange (line 75) | func (m *Manager) OnChange(callback WatcherFunc) {
    method Reload (line 89) | func (m *Manager) Reload() error {
    method StartWatching (line 131) | func (m *Manager) StartWatching(ctx context.Context) error {
    method Close (line 157) | func (m *Manager) Close() error {
    method watchLoop (line 169) | func (m *Manager) watchLoop(ctx context.Context, watcher *fsnotify.Wat...
  type ManagerOption (line 26) | type ManagerOption
  function WithDebounce (line 29) | func WithDebounce(interval time.Duration) ManagerOption {
  function NewManager (line 38) | func NewManager(loader *Loader, opts ...ManagerOption) (*Manager, error) {

FILE: internal/config/types.go
  type Config (line 10) | type Config struct
    method ApplyDefaults (line 720) | func (c *Config) ApplyDefaults() {
    method Validate (line 1019) | func (c *Config) Validate() error {
    method Clone (line 1052) | func (c *Config) Clone() *Config {
  type AppConfig (line 31) | type AppConfig struct
  type ServiceConfig (line 39) | type ServiceConfig struct
  type ServerConfig (line 49) | type ServerConfig struct
  type HTTPServerConfig (line 58) | type HTTPServerConfig struct
  type RPCServerConfig (line 77) | type RPCServerConfig struct
  type TCPServerConfig (line 90) | type TCPServerConfig struct
  type GRPCServerConfig (line 110) | type GRPCServerConfig struct
  type MetricsServerConfig (line 117) | type MetricsServerConfig struct
  type DatabaseConfig (line 124) | type DatabaseConfig struct
  type MongoDBConfig (line 131) | type MongoDBConfig struct
  type RedisConfig (line 147) | type RedisConfig struct
  type RedisClusterConfig (line 164) | type RedisClusterConfig struct
  type SQLConfig (line 170) | type SQLConfig struct
  type MessagingConfig (line 179) | type MessagingConfig struct
  type NATSConfig (line 187) | type NATSConfig struct
  type JetStreamConfig (line 201) | type JetStreamConfig struct
  type SubjectsConfig (line 207) | type SubjectsConfig struct
  type KafkaConfig (line 215) | type KafkaConfig struct
  type SQSConfig (line 221) | type SQSConfig struct
  type SchedulerConfig (line 227) | type SchedulerConfig struct
  type LoggingConfig (line 233) | type LoggingConfig struct
  type FileLogConfig (line 243) | type FileLogConfig struct
  type SecurityConfig (line 252) | type SecurityConfig struct
  type JWTConfig (line 263) | type JWTConfig struct
  type RateLimitConfig (line 272) | type RateLimitConfig struct
  type EncryptionConfig (line 282) | type EncryptionConfig struct
  type PasswordPolicyConfig (line 289) | type PasswordPolicyConfig struct
  type DDoSProtectionConfig (line 300) | type DDoSProtectionConfig struct
  type TLSConfig (line 310) | type TLSConfig struct
  type CORSConfig (line 320) | type CORSConfig struct
  type MonitoringConfig (line 330) | type MonitoringConfig struct
  type HealthConfig (line 340) | type HealthConfig struct
  type MetricsConfig (line 348) | type MetricsConfig struct
  type TracingConfig (line 354) | type TracingConfig struct
  type ProfilingConfig (line 362) | type ProfilingConfig struct
  type AlertingConfig (line 369) | type AlertingConfig struct
  type AuditConfig (line 375) | type AuditConfig struct
  type GameConfig (line 382) | type GameConfig struct
  type PlayerConfig (line 393) | type PlayerConfig struct
  type BattleConfig (line 403) | type BattleConfig struct
  type ExperienceConfig (line 413) | type ExperienceConfig struct
  type ChatConfig (line 420) | type ChatConfig struct
  type RankingConfig (line 428) | type RankingConfig struct
  type WeatherConfig (line 435) | type WeatherConfig struct
  type PlantConfig (line 442) | type PlantConfig struct
  type DomainConfig (line 449) | type DomainConfig struct
  type ApplicationConfig (line 454) | type ApplicationConfig struct
  type BusConfig (line 461) | type BusConfig struct
  type PerformanceConfig (line 470) | type PerformanceConfig struct
  type WorkerPoolConfig (line 478) | type WorkerPoolConfig struct
  type CacheConfig (line 484) | type CacheConfig struct
  type ConnectionPoolConfig (line 492) | type ConnectionPoolConfig struct
  type ThirdPartyConfig (line 499) | type ThirdPartyConfig struct
  type PaymentConfig (line 507) | type PaymentConfig struct
  type StripeConfig (line 512) | type StripeConfig struct
  type PushNotificationConfig (line 519) | type PushNotificationConfig struct
  type FirebaseConfig (line 524) | type FirebaseConfig struct
  type EmailConfig (line 529) | type EmailConfig struct
  type OAuthConfig (line 534) | type OAuthConfig struct
  type OAuthProviderConfig (line 539) | type OAuthProviderConfig struct
  type SMTPConfig (line 545) | type SMTPConfig struct
  type EnvironmentConfig (line 553) | type EnvironmentConfig struct
  type ObservabilityConfig (line 560) | type ObservabilityConfig struct
  type SessionConfig (line 566) | type SessionConfig struct
  type GatewayConfig (line 574) | type GatewayConfig struct
  type GatewayGameServicesConfig (line 583) | type GatewayGameServicesConfig struct
  type GatewayDiscoveryConfig (line 590) | type GatewayDiscoveryConfig struct
  type GatewayConsulConfig (line 598) | type GatewayConsulConfig struct
  type GatewayEtcdConfig (line 605) | type GatewayEtcdConfig struct
  type GatewayStaticConfig (line 610) | type GatewayStaticConfig struct
  type GatewayRPCConfig (line 615) | type GatewayRPCConfig struct
  type GatewayCircuitBreakerConfig (line 624) | type GatewayCircuitBreakerConfig struct
  type GatewayLoadBalancerConfig (line 632) | type GatewayLoadBalancerConfig struct
  type GatewayHealthCheckConfig (line 638) | type GatewayHealthCheckConfig struct
  type GatewayExternalServiceConfig (line 646) | type GatewayExternalServiceConfig struct
  type GatewayConnectionConfig (line 655) | type GatewayConnectionConfig struct
  type GatewaySessionConfig (line 665) | type GatewaySessionConfig struct
  type GatewayMessageQueueConfig (line 672) | type GatewayMessageQueueConfig struct
  type GatewayMessageTopicsConfig (line 679) | type GatewayMessageTopicsConfig struct
  type GatewayProtocolConfig (line 686) | type GatewayProtocolConfig struct
  type GatewayProtocolEndpointConfig (line 692) | type GatewayProtocolEndpointConfig struct
  type GatewayRoutingConfig (line 700) | type GatewayRoutingConfig struct
  type GatewayRoutingRule (line 706) | type GatewayRoutingRule struct
  type GatewayRoutingLoadBalancerConfig (line 713) | type GatewayRoutingLoadBalancerConfig struct
  function validPort (line 1074) | func validPort(port int) bool {
  function copyStringSlice (line 1078) | func copyStringSlice(src []string) []string {
  function copyStringMap (line 1087) | func copyStringMap(src map[string]string) map[string]string {
  function copyOAuthProviders (line 1098) | func copyOAuthProviders(src map[string]OAuthProviderConfig) map[string]O...
  function copyGatewayRoutingRules (line 1109) | func copyGatewayRoutingRules(src []GatewayRoutingRule) []GatewayRoutingR...

FILE: internal/config_manager_base.go
  type ConfigManagerBase (line 4) | type ConfigManagerBase struct
    method Load (line 8) | func (c *ConfigManagerBase) Load() {
    method Get (line 13) | func (c *ConfigManagerBase) Get(id uint32) interface{} {

FILE: internal/data_base.go
  type DataAsPublisher (line 5) | type DataAsPublisher struct
  type DataAsSubscriber (line 9) | type DataAsSubscriber struct

FILE: internal/database/mongodb.go
  type MongoDB (line 18) | type MongoDB struct
    method Connect (line 43) | func (m *MongoDB) Connect(ctx context.Context) error {
    method Disconnect (line 81) | func (m *MongoDB) Disconnect(ctx context.Context) error {
    method GetCollection (line 91) | func (m *MongoDB) GetCollection(name string) *mongo.Collection {
    method GetDatabase (line 96) | func (m *MongoDB) GetDatabase() *mongo.Database {
    method GetClient (line 101) | func (m *MongoDB) GetClient() *mongo.Client {
  type MongoConfig (line 25) | type MongoConfig struct
  function NewMongoDB (line 36) | func NewMongoDB(config *MongoConfig) *MongoDB {

FILE: internal/database/redis.go
  type Redis (line 16) | type Redis struct
    method Connect (line 43) | func (r *Redis) Connect(ctx context.Context) error {
    method Disconnect (line 85) | func (r *Redis) Disconnect() error {
    method GetClient (line 95) | func (r *Redis) GetClient() *redis.Client {
    method Set (line 100) | func (r *Redis) Set(ctx context.Context, key string, value interface{}...
    method Get (line 105) | func (r *Redis) Get(ctx context.Context, key string) (string, error) {
    method Del (line 110) | func (r *Redis) Del(ctx context.Context, keys ...string) error {
    method Exists (line 115) | func (r *Redis) Exists(ctx context.Context, keys ...string) (int64, er...
    method Expire (line 120) | func (r *Redis) Expire(ctx context.Context, key string, expiration tim...
  type RedisConfig (line 22) | type RedisConfig struct
  function NewRedis (line 36) | func NewRedis(config *RedisConfig) *Redis {

FILE: internal/domain/ai/monster_ai.go
  type AIState (line 10) | type AIState
  constant AIStateIdle (line 13) | AIStateIdle   AIState = 0
  constant AIStateWalk (line 14) | AIStateWalk   AIState = 1
  constant AIStateChase (line 15) | AIStateChase  AIState = 2
  constant AIStateCast (line 16) | AIStateCast   AIState = 3
  constant AIStateGoback (line 17) | AIStateGoback AIState = 4
  constant AIStateHurt (line 18) | AIStateHurt   AIState = 5
  constant AIStateDeath (line 19) | AIStateDeath  AIState = 6
  type MonsterAI (line 23) | type MonsterAI struct
    method Start (line 48) | func (ai *MonsterAI) Start(ctx context.Context, initPos character.Vect...
    method Update (line 56) | func (ai *MonsterAI) Update(ctx context.Context, deltaTime float32) er...
    method updateIdle (line 83) | func (ai *MonsterAI) updateIdle(ctx context.Context, deltaTime float32) {
    method updateWalk (line 97) | func (ai *MonsterAI) updateWalk(ctx context.Context, deltaTime float32) {
    method updateChase (line 120) | func (ai *MonsterAI) updateChase(ctx context.Context, deltaTime float3...
    method updateCast (line 145) | func (ai *MonsterAI) updateCast(ctx context.Context, deltaTime float32) {
    method updateGoback (line 167) | func (ai *MonsterAI) updateGoback(ctx context.Context, deltaTime float...
    method updateHurt (line 180) | func (ai *MonsterAI) updateHurt(ctx context.Context, deltaTime float32) {
    method OnHurt (line 187) | func (ai *MonsterAI) OnHurt(attacker *character.Actor) {
    method detectTarget (line 195) | func (ai *MonsterAI) detectTarget() bool {
    method trySkillCast (line 202) | func (ai *MonsterAI) trySkillCast() {
    method changeState (line 214) | func (ai *MonsterAI) changeState(newState AIState) {
    method GetState (line 220) | func (ai *MonsterAI) GetState() AIState {
  function NewMonsterAI (line 37) | func NewMonsterAI(owner *character.Monster, patrolRadius, chaseRadius, a...
  type MissileAI (line 225) | type MissileAI struct
    method Update (line 244) | func (mai *MissileAI) Update(ctx context.Context, deltaTime float32) e...
    method onHit (line 298) | func (mai *MissileAI) onHit() {
  function NewMissileAI (line 234) | func NewMissileAI(owner *character.Missile, target *character.Actor, spe...

FILE: internal/domain/battle/battle.go
  type BattleID (line 11) | type BattleID struct
    method String (line 21) | func (id BattleID) String() string {
  function NewBattleID (line 16) | func NewBattleID() BattleID {
  type BattleStatus (line 26) | type BattleStatus
  constant BattleStatusWaiting (line 29) | BattleStatusWaiting BattleStatus = iota
  constant BattleStatusInProgress (line 30) | BattleStatusInProgress
  constant BattleStatusFinished (line 31) | BattleStatusFinished
  constant BattleStatusCancelled (line 32) | BattleStatusCancelled
  type BattleType (line 36) | type BattleType
  constant BattleTypePvP (line 39) | BattleTypePvP BattleType = iota
  constant BattleTypePvE (line 40) | BattleTypePvE
  constant BattleTypeTeamPvP (line 41) | BattleTypeTeamPvP
  constant BattleTypeRaid (line 42) | BattleTypeRaid
  type Battle (line 46) | type Battle struct
    method ID (line 120) | func (b *Battle) ID() BattleID {
    method Status (line 125) | func (b *Battle) Status() BattleStatus {
    method GetBattleType (line 130) | func (b *Battle) GetBattleType() BattleType {
    method Participants (line 135) | func (b *Battle) Participants() []*BattleParticipant {
    method AddParticipant (line 140) | func (b *Battle) AddParticipant(playerID player.PlayerID, team int, hp...
    method Start (line 171) | func (b *Battle) Start() error {
    method ExecuteAction (line 189) | func (b *Battle) ExecuteAction(actorID player.PlayerID, targetID *play...
    method executeAttack (line 237) | func (b *Battle) executeAttack(action *BattleAction, actor *BattlePart...
    method executeDefend (line 269) | func (b *Battle) executeDefend(action *BattleAction, actor *BattlePart...
    method executeHeal (line 274) | func (b *Battle) executeHeal(action *BattleAction, actor *BattlePartic...
    method rollCritical (line 281) | func (b *Battle) rollCritical() bool {
    method findParticipant (line 287) | func (b *Battle) findParticipant(playerID player.PlayerID) *BattlePart...
    method addActionToCurrentRound (line 297) | func (b *Battle) addActionToCurrentRound(action *BattleAction) {
    method checkBattleEnd (line 313) | func (b *Battle) checkBattleEnd() {
    method endBattle (line 338) | func (b *Battle) endBattle(winnerTeam int) {
    method Winner (line 361) | func (b *Battle) Winner() *player.PlayerID {
    method IsFinished (line 366) | func (b *Battle) IsFinished() bool {
    method Version (line 371) | func (b *Battle) Version() int64 {
    method StartTime (line 376) | func (b *Battle) StartTime() time.Time {
    method EndTime (line 381) | func (b *Battle) EndTime() *time.Time {
    method CreatedAt (line 386) | func (b *Battle) CreatedAt() time.Time {
    method UpdatedAt (line 391) | func (b *Battle) UpdatedAt() time.Time {
    method Rounds (line 396) | func (b *Battle) Rounds() []*BattleRound {
  type BattleParticipant (line 61) | type BattleParticipant struct
  type BattleRound (line 73) | type BattleRound struct
  type BattleAction (line 81) | type BattleAction struct
  type ActionType (line 94) | type ActionType
  constant ActionTypeAttack (line 97) | ActionTypeAttack ActionType = iota
  constant ActionTypeSkill (line 98) | ActionTypeSkill
  constant ActionTypeDefend (line 99) | ActionTypeDefend
  constant ActionTypeHeal (line 100) | ActionTypeHeal
  constant ActionTypeEscape (line 101) | ActionTypeEscape
  function NewBattle (line 105) | func NewBattle(battleType BattleType) *Battle {

FILE: internal/domain/battle/repository.go
  type Repository (line 9) | type Repository interface

FILE: internal/domain/battle/service.go
  type Service (line 12) | type Service struct
    method CreateBattle (line 29) | func (s *Service) CreateBattle(ctx context.Context, battleType BattleT...
    method JoinBattle (line 40) | func (s *Service) JoinBattle(ctx context.Context, battleID BattleID, p...
    method StartBattle (line 58) | func (s *Service) StartBattle(ctx context.Context, battleID BattleID) ...
    method ExecuteAttack (line 76) | func (s *Service) ExecuteAttack(ctx context.Context, battleID BattleID...
    method ExecuteSkill (line 95) | func (s *Service) ExecuteSkill(ctx context.Context, battleID BattleID,...
    method executeSkillAction (line 134) | func (s *Service) executeSkillAction(battle *Battle, actorID player.Pl...
    method executeSkillAttack (line 167) | func (s *Service) executeSkillAttack(battle *Battle, action *BattleAct...
    method executeSkillHeal (line 208) | func (s *Service) executeSkillHeal(battle *Battle, action *BattleActio...
    method executeSkillDefense (line 231) | func (s *Service) executeSkillDefense(battle *Battle, action *BattleAc...
    method executeSkillBuff (line 244) | func (s *Service) executeSkillBuff(battle *Battle, action *BattleActio...
    method executeSkillDebuff (line 264) | func (s *Service) executeSkillDebuff(battle *Battle, action *BattleAct...
    method applySkillEffect (line 281) | func (s *Service) applySkillEffect(target *BattleParticipant, effect *...
    method rollCritical (line 303) | func (s *Service) rollCritical() bool {
    method GetBattleStatus (line 309) | func (s *Service) GetBattleStatus(ctx context.Context, battleID Battle...
    method GetPlayerBattles (line 319) | func (s *Service) GetPlayerBattles(ctx context.Context, playerID playe...
    method EndBattle (line 329) | func (s *Service) EndBattle(ctx context.Context, battleID BattleID) er...
    method CalculateBattleRewards (line 354) | func (s *Service) CalculateBattleRewards(ctx context.Context, battleID...
    method calculateExpReward (line 387) | func (s *Service) calculateExpReward(participant *BattleParticipant, b...
    method calculateGoldReward (line 401) | func (s *Service) calculateGoldReward(participant *BattleParticipant, ...
    method calculateItemRewards (line 411) | func (s *Service) calculateItemRewards(participant *BattleParticipant,...
  function NewService (line 18) | func NewService(battleRepository Repository) *Service {
  type BattleReward (line 427) | type BattleReward struct

FILE: internal/domain/battle/skill.go
  type SkillID (line 9) | type SkillID struct
    method String (line 19) | func (id SkillID) String() string {
  function NewSkillID (line 14) | func NewSkillID(id string) SkillID {
  type SkillType (line 24) | type SkillType
  constant SkillTypeAttack (line 27) | SkillTypeAttack  SkillType = iota
  constant SkillTypeDefense (line 28) | SkillTypeDefense
  constant SkillTypeHeal (line 29) | SkillTypeHeal
  constant SkillTypeBuff (line 30) | SkillTypeBuff
  constant SkillTypeDebuff (line 31) | SkillTypeDebuff
  constant SkillTypeUtility (line 32) | SkillTypeUtility
  type SkillTarget (line 36) | type SkillTarget
  constant SkillTargetSelf (line 39) | SkillTargetSelf     SkillTarget = iota
  constant SkillTargetEnemy (line 40) | SkillTargetEnemy
  constant SkillTargetAlly (line 41) | SkillTargetAlly
  constant SkillTargetAll (line 42) | SkillTargetAll
  constant SkillTargetEnemyAll (line 43) | SkillTargetEnemyAll
  constant SkillTargetAllyAll (line 44) | SkillTargetAllyAll
  type Skill (line 48) | type Skill struct
    method ID (line 84) | func (s *Skill) ID() SkillID {
    method Name (line 89) | func (s *Skill) Name() string {
    method Description (line 94) | func (s *Skill) Description() string {
    method GetSkillType (line 99) | func (s *Skill) GetSkillType() SkillType {
    method TargetType (line 104) | func (s *Skill) TargetType() SkillTarget {
    method ManaCost (line 109) | func (s *Skill) ManaCost() int {
    method Cooldown (line 114) | func (s *Skill) Cooldown() time.Duration {
    method Damage (line 119) | func (s *Skill) Damage() int {
    method Healing (line 124) | func (s *Skill) Healing() int {
    method Effects (line 129) | func (s *Skill) Effects() []*SkillEffect {
    method Range (line 134) | func (s *Skill) Range() float64 {
    method Level (line 139) | func (s *Skill) Level() int {
    method MaxLevel (line 144) | func (s *Skill) MaxLevel() int {
    method CanUpgrade (line 149) | func (s *Skill) CanUpgrade() bool {
    method Upgrade (line 154) | func (s *Skill) Upgrade() error {
  function NewSkill (line 65) | func NewSkill(id, name, description string, skillType SkillType, targetT...
  type SkillEffect (line 168) | type SkillEffect struct
    method GetEffectType (line 202) | func (e *SkillEffect) GetEffectType() EffectType {
    method Value (line 207) | func (e *SkillEffect) Value() int {
    method Duration (line 212) | func (e *SkillEffect) Duration() time.Duration {
    method IsStackable (line 217) | func (e *SkillEffect) IsStackable() bool {
  type EffectType (line 176) | type EffectType
  constant EffectTypePoison (line 179) | EffectTypePoison           EffectType = iota
  constant EffectTypeBurn (line 180) | EffectTypeBurn
  constant EffectTypeFreeze (line 181) | EffectTypeFreeze
  constant EffectTypeStun (line 182) | EffectTypeStun
  constant EffectTypeAttackBoost (line 183) | EffectTypeAttackBoost
  constant EffectTypeDefenseBoost (line 184) | EffectTypeDefenseBoost
  constant EffectTypeSpeedBoost (line 185) | EffectTypeSpeedBoost
  constant EffectTypeAttackReduction (line 186) | EffectTypeAttackReduction
  constant EffectTypeDefenseReduction (line 187) | EffectTypeDefenseReduction
  constant EffectTypeSpeedReduction (line 188) | EffectTypeSpeedReduction
  function NewSkillEffect (line 192) | func NewSkillEffect(effectType EffectType, value int, duration time.Dura...
  type PlayerSkill (line 222) | type PlayerSkill struct
    method GetSkill (line 238) | func (ps *PlayerSkill) GetSkill() *Skill {
    method CanUse (line 243) | func (ps *PlayerSkill) CanUse(currentMana int) bool {
    method Use (line 258) | func (ps *PlayerSkill) Use() error {
    method GetCooldownRemaining (line 270) | func (ps *PlayerSkill) GetCooldownRemaining() time.Duration {
    method Uses (line 279) | func (ps *PlayerSkill) Uses() int {
  function NewPlayerSkill (line 229) | func NewPlayerSkill(skill *Skill) *PlayerSkill {
  type SkillRegistry (line 284) | type SkillRegistry struct
    method RegisterSkill (line 296) | func (sr *SkillRegistry) RegisterSkill(skill *Skill) {
    method GetSkill (line 301) | func (sr *SkillRegistry) GetSkill(skillID string) (*Skill, error) {
    method GetAllSkills (line 310) | func (sr *SkillRegistry) GetAllSkills() []*Skill {
    method InitializeDefaultSkills (line 319) | func (sr *SkillRegistry) InitializeDefaultSkills() {
  function NewSkillRegistry (line 289) | func NewSkillRegistry() *SkillRegistry {

FILE: internal/domain/building/aggregate.go
  type BuildingAggregate (line 9) | type BuildingAggregate struct
    method StartConstruction (line 79) | func (b *BuildingAggregate) StartConstruction(duration time.Duration, ...
    method UpdateConstructionProgress (line 110) | func (b *BuildingAggregate) UpdateConstructionProgress(progress float6...
    method CompleteConstruction (line 136) | func (b *BuildingAggregate) CompleteConstruction() error {
    method CancelConstruction (line 157) | func (b *BuildingAggregate) CancelConstruction(reason string) error {
    method StartUpgrade (line 177) | func (b *BuildingAggregate) StartUpgrade(targetLevel int32, duration t...
    method UpdateUpgradeProgress (line 218) | func (b *BuildingAggregate) UpdateUpgradeProgress(progress float64) er...
    method CompleteUpgrade (line 244) | func (b *BuildingAggregate) CompleteUpgrade() error {
    method CancelUpgrade (line 271) | func (b *BuildingAggregate) CancelUpgrade(reason string) error {
    method Repair (line 291) | func (b *BuildingAggregate) Repair(amount int32, costs []*ResourceCost...
    method TakeDamage (line 316) | func (b *BuildingAggregate) TakeDamage(damage int32, damageType Damage...
    method Demolish (line 348) | func (b *BuildingAggregate) Demolish(reason string) error {
    method SetPosition (line 373) | func (b *BuildingAggregate) SetPosition(position *Position) error {
    method SetOrientation (line 388) | func (b *BuildingAggregate) SetOrientation(orientation Orientation) er...
    method AddWorker (line 399) | func (b *BuildingAggregate) AddWorker(workerID uint64, role WorkerRole...
    method RemoveWorker (line 435) | func (b *BuildingAggregate) RemoveWorker(workerID uint64, reason strin...
    method AddEffect (line 449) | func (b *BuildingAggregate) AddEffect(effect *BuildingEffect) error {
    method RemoveEffect (line 479) | func (b *BuildingAggregate) RemoveEffect(effectType EffectType, target...
    method UpdateProduction (line 493) | func (b *BuildingAggregate) UpdateProduction(production *ProductionInf...
    method UpdateStorage (line 508) | func (b *BuildingAggregate) UpdateStorage(storage *StorageInfo) error {
    method UpdateDefense (line 523) | func (b *BuildingAggregate) UpdateDefense(defense *DefenseInfo) error {
    method PerformMaintenance (line 538) | func (b *BuildingAggregate) PerformMaintenance(maintenanceType Mainten...
    method SetMetadata (line 586) | func (b *BuildingAggregate) SetMetadata(key string, value interface{}) {
    method GetMetadata (line 595) | func (b *BuildingAggregate) GetMetadata(key string) (interface{}, bool) {
    method AddTag (line 604) | func (b *BuildingAggregate) AddTag(tag string) {
    method RemoveTag (line 617) | func (b *BuildingAggregate) RemoveTag(tag string) {
    method HasTag (line 628) | func (b *BuildingAggregate) HasTag(tag string) bool {
    method IsActive (line 640) | func (b *BuildingAggregate) IsActive() bool {
    method IsUnderConstruction (line 645) | func (b *BuildingAggregate) IsUnderConstruction() bool {
    method IsUpgrading (line 650) | func (b *BuildingAggregate) IsUpgrading() bool {
    method IsDamaged (line 655) | func (b *BuildingAggregate) IsDamaged() bool {
    method IsDestroyed (line 660) | func (b *BuildingAggregate) IsDestroyed() bool {
    method CanUpgrade (line 665) | func (b *BuildingAggregate) CanUpgrade() bool {
    method CanRepair (line 670) | func (b *BuildingAggregate) CanRepair() bool {
    method NeedsMaintenance (line 675) | func (b *BuildingAggregate) NeedsMaintenance() bool {
    method GetEfficiency (line 683) | func (b *BuildingAggregate) GetEfficiency() float64 {
    method GetTotalUpgradeCost (line 713) | func (b *BuildingAggregate) GetTotalUpgradeCost(targetLevel int32) []*...
    method GetOccupiedArea (line 735) | func (b *BuildingAggregate) GetOccupiedArea() int32 {
    method GetBoundingBox (line 743) | func (b *BuildingAggregate) GetBoundingBox() *BoundingBox {
    method checkRequirements (line 761) | func (b *BuildingAggregate) checkRequirements() error {
    method checkUpgradeRequirements (line 771) | func (b *BuildingAggregate) checkUpgradeRequirements(targetLevel int32...
    method applyUpgradeEffects (line 784) | func (b *BuildingAggregate) applyUpgradeEffects() {
    method calculateActualDamage (line 798) | func (b *BuildingAggregate) calculateActualDamage(damage int32, damage...
    method getMaxWorkers (line 818) | func (b *BuildingAggregate) getMaxWorkers() int {
    method getWorkerEfficiencyFactor (line 826) | func (b *BuildingAggregate) getWorkerEfficiencyFactor() float64 {
    method getEffectFactor (line 843) | func (b *BuildingAggregate) getEffectFactor(effectType EffectType) flo...
    method getUpgradeCostForLevel (line 854) | func (b *BuildingAggregate) getUpgradeCostForLevel(level int32) []*Res...
    method Validate (line 955) | func (b *BuildingAggregate) Validate() error {
  function NewBuildingAggregate (line 46) | func NewBuildingAggregate(playerID uint64, buildingTypeID, name string, ...
  function generateBuildingID (line 866) | func generateBuildingID() string {
  constant DefaultMaxLevel (line 874) | DefaultMaxLevel      = int32(10)
  constant DefaultMaxHealth (line 875) | DefaultMaxHealth     = int32(100)
  constant DefaultMaxDurability (line 876) | DefaultMaxDurability = int32(100)
  constant MaintenanceInterval (line 879) | MaintenanceInterval = 24 * time.Hour
  constant MaintenanceCost (line 880) | MaintenanceCost     = int64(50)
  constant DefaultConstructionTime (line 883) | DefaultConstructionTime = 1 * time.Hour
  constant DefaultUpgradeTime (line 884) | DefaultUpgradeTime      = 30 * time.Minute
  constant MinEfficiency (line 887) | MinEfficiency      = 0.1
  constant MaxEfficiency (line 888) | MaxEfficiency      = 2.0
  constant BaseEfficiency (line 889) | BaseEfficiency     = 1.0
  constant NoWorkerEfficiency (line 890) | NoWorkerEfficiency = 0.5
  function ReconstructBuildingAggregate (line 896) | func ReconstructBuildingAggregate(

FILE: internal/domain/building/entity.go
  type ConstructionInfo (line 9) | type ConstructionInfo struct
    method AddWorker (line 90) | func (ci *ConstructionInfo) AddWorker(assignment *WorkerAssignment) er...
    method RemoveWorker (line 108) | func (ci *ConstructionInfo) RemoveWorker(workerID uint64) error {
    method AddMaterial (line 120) | func (ci *ConstructionInfo) AddMaterial(material *MaterialUsage) error {
    method AddPhase (line 131) | func (ci *ConstructionInfo) AddPhase(phase *ConstructionPhase) error {
    method StartNextPhase (line 142) | func (ci *ConstructionInfo) StartNextPhase() *ConstructionPhase {
    method CompleteCurrentPhase (line 155) | func (ci *ConstructionInfo) CompleteCurrentPhase() error {
    method UpdateProgress (line 184) | func (ci *ConstructionInfo) UpdateProgress(progress float64) error {
    method SetMetadata (line 202) | func (ci *ConstructionInfo) SetMetadata(key string, value interface{}) {
    method GetMetadata (line 211) | func (ci *ConstructionInfo) GetMetadata(key string) (interface{}, bool) {
    method GetEstimatedCompletionTime (line 220) | func (ci *ConstructionInfo) GetEstimatedCompletionTime() time.Time {
    method GetEfficiency (line 231) | func (ci *ConstructionInfo) GetEfficiency() float64 {
  type ConstructionStatus (line 31) | type ConstructionStatus
    method String (line 43) | func (cs ConstructionStatus) String() string {
    method IsValid (line 63) | func (cs ConstructionStatus) IsValid() bool {
  constant ConstructionStatusPlanning (line 34) | ConstructionStatusPlanning   ConstructionStatus = iota + 1
  constant ConstructionStatusInProgress (line 35) | ConstructionStatusInProgress
  constant ConstructionStatusPaused (line 36) | ConstructionStatusPaused
  constant ConstructionStatusCompleted (line 37) | ConstructionStatusCompleted
  constant ConstructionStatusCancelled (line 38) | ConstructionStatusCancelled
  constant ConstructionStatusFailed (line 39) | ConstructionStatusFailed
  function NewConstructionInfo (line 68) | func NewConstructionInfo(buildingID string, duration time.Duration) *Con...
  type UpgradeInfo (line 247) | type UpgradeInfo struct
    method AddBenefit (line 328) | func (ui *UpgradeInfo) AddBenefit(benefit *UpgradeBenefit) error {
    method AddRequirement (line 339) | func (ui *UpgradeInfo) AddRequirement(requirement *Requirement) error {
    method CheckRequirements (line 350) | func (ui *UpgradeInfo) CheckRequirements() bool {
    method UpdateProgress (line 360) | func (ui *UpgradeInfo) UpdateProgress(progress float64) error {
    method SetMetadata (line 378) | func (ui *UpgradeInfo) SetMetadata(key string, value interface{}) {
    method GetMetadata (line 387) | func (ui *UpgradeInfo) GetMetadata(key string) (interface{}, bool) {
  type UpgradeStatus (line 268) | type UpgradeStatus
    method String (line 280) | func (us UpgradeStatus) String() string {
    method IsValid (line 300) | func (us UpgradeStatus) IsValid() bool {
  constant UpgradeStatusPlanning (line 271) | UpgradeStatusPlanning   UpgradeStatus = iota + 1
  constant UpgradeStatusInProgress (line 272) | UpgradeStatusInProgress
  constant UpgradeStatusPaused (line 273) | UpgradeStatusPaused
  constant UpgradeStatusCompleted (line 274) | UpgradeStatusCompleted
  constant UpgradeStatusCancelled (line 275) | UpgradeStatusCancelled
  constant UpgradeStatusFailed (line 276) | UpgradeStatusFailed
  function NewUpgradeInfo (line 305) | func NewUpgradeInfo(buildingID string, fromLevel, toLevel int32, duratio...
  type WorkerAssignment (line 396) | type WorkerAssignment struct
    method Start (line 464) | func (wa *WorkerAssignment) Start() {
    method Pause (line 470) | func (wa *WorkerAssignment) Pause() {
    method Resume (line 476) | func (wa *WorkerAssignment) Resume() {
    method Complete (line 482) | func (wa *WorkerAssignment) Complete() {
    method Cancel (line 491) | func (wa *WorkerAssignment) Cancel() {
    method UpdateProgress (line 499) | func (wa *WorkerAssignment) UpdateProgress(progress float64) error {
    method GetDuration (line 515) | func (wa *WorkerAssignment) GetDuration() time.Duration {
  type WorkerAssignmentStatus (line 412) | type WorkerAssignmentStatus
    method String (line 423) | func (was WorkerAssignmentStatus) String() string {
    method IsValid (line 441) | func (was WorkerAssignmentStatus) IsValid() bool {
  constant WorkerAssignmentStatusAssigned (line 415) | WorkerAssignmentStatusAssigned  WorkerAssignmentStatus = iota + 1
  constant WorkerAssignmentStatusWorking (line 416) | WorkerAssignmentStatusWorking
  constant WorkerAssignmentStatusPaused (line 417) | WorkerAssignmentStatusPaused
  constant WorkerAssignmentStatusCompleted (line 418) | WorkerAssignmentStatusCompleted
  constant WorkerAssignmentStatusCancelled (line 419) | WorkerAssignmentStatusCancelled
  function NewWorkerAssignment (line 446) | func NewWorkerAssignment(workerID uint64, role WorkerRole, task string) ...
  type MaterialUsage (line 523) | type MaterialUsage struct
    method Use (line 598) | func (mu *MaterialUsage) Use(amount int64) error {
    method Waste (line 621) | func (mu *MaterialUsage) Waste(amount int64) error {
    method GetRemaining (line 636) | func (mu *MaterialUsage) GetRemaining() int64 {
    method GetUsageRate (line 641) | func (mu *MaterialUsage) GetUsageRate() float64 {
    method GetWasteRate (line 649) | func (mu *MaterialUsage) GetWasteRate() float64 {
  type MaterialUsageStatus (line 541) | type MaterialUsageStatus
    method String (line 553) | func (mus MaterialUsageStatus) String() string {
    method IsValid (line 573) | func (mus MaterialUsageStatus) IsValid() bool {
  constant MaterialUsageStatusOrdered (line 544) | MaterialUsageStatusOrdered   MaterialUsageStatus = iota + 1
  constant MaterialUsageStatusDelivered (line 545) | MaterialUsageStatusDelivered
  constant MaterialUsageStatusInUse (line 546) | MaterialUsageStatusInUse
  constant MaterialUsageStatusUsed (line 547) | MaterialUsageStatusUsed
  constant MaterialUsageStatusWasted (line 548) | MaterialUsageStatusWasted
  constant MaterialUsageStatusReturned (line 549) | MaterialUsageStatusReturned
  function NewMaterialUsage (line 578) | func NewMaterialUsage(materialType string, quantity int64, cost int64) *...
  type ConstructionPhase (line 657) | type ConstructionPhase struct
    method Start (line 735) | func (cp *ConstructionPhase) Start() {
    method Complete (line 743) | func (cp *ConstructionPhase) Complete() {
    method Pause (line 752) | func (cp *ConstructionPhase) Pause() {
    method Resume (line 758) | func (cp *ConstructionPhase) Resume() {
    method Cancel (line 764) | func (cp *ConstructionPhase) Cancel() {
    method UpdateProgress (line 770) | func (cp *ConstructionPhase) UpdateProgress(progress float64) error {
    method AddTask (line 786) | func (cp *ConstructionPhase) AddTask(task *PhaseTask) error {
  type PhaseStatus (line 677) | type PhaseStatus
    method String (line 689) | func (ps PhaseStatus) String() string {
    method IsValid (line 709) | func (ps PhaseStatus) IsValid() bool {
  constant PhaseStatusPending (line 680) | PhaseStatusPending    PhaseStatus = iota + 1
  constant PhaseStatusInProgress (line 681) | PhaseStatusInProgress
  constant PhaseStatusPaused (line 682) | PhaseStatusPaused
  constant PhaseStatusCompleted (line 683) | PhaseStatusCompleted
  constant PhaseStatusCancelled (line 684) | PhaseStatusCancelled
  constant PhaseStatusFailed (line 685) | PhaseStatusFailed
  function NewConstructionPhase (line 714) | func NewConstructionPhase(name, description string, order int32, duratio...
  type PhaseTask (line 797) | type PhaseTask struct
    method Start (line 952) | func (pt *PhaseTask) Start() {
    method Complete (line 960) | func (pt *PhaseTask) Complete() {
    method Assign (line 969) | func (pt *PhaseTask) Assign(workerID uint64) {
    method Unassign (line 975) | func (pt *PhaseTask) Unassign() {
    method AddDependency (line 981) | func (pt *PhaseTask) AddDependency(taskID string) {
    method RemoveDependency (line 993) | func (pt *PhaseTask) RemoveDependency(taskID string) {
    method UpdateProgress (line 1004) | func (pt *PhaseTask) UpdateProgress(progress float64) error {
  type TaskType (line 816) | type TaskType
    method String (line 832) | func (tt TaskType) String() string {
    method IsValid (line 860) | func (tt TaskType) IsValid() bool {
  constant TaskTypeFoundation (line 819) | TaskTypeFoundation  TaskType = iota + 1
  constant TaskTypeFramework (line 820) | TaskTypeFramework
  constant TaskTypeWalls (line 821) | TaskTypeWalls
  constant TaskTypeRoof (line 822) | TaskTypeRoof
  constant TaskTypeElectrical (line 823) | TaskTypeElectrical
  constant TaskTypePlumbing (line 824) | TaskTypePlumbing
  constant TaskTypeInterior (line 825) | TaskTypeInterior
  constant TaskTypeExterior (line 826) | TaskTypeExterior
  constant TaskTypeLandscaping (line 827) | TaskTypeLandscaping
  constant TaskTypeCustom (line 828) | TaskTypeCustom
  type TaskPriority (line 865) | type TaskPriority
    method String (line 875) | func (tp TaskPriority) String() string {
    method IsValid (line 891) | func (tp TaskPriority) IsValid() bool {
  constant TaskPriorityLow (line 868) | TaskPriorityLow      TaskPriority = iota + 1
  constant TaskPriorityNormal (line 869) | TaskPriorityNormal
  constant TaskPriorityHigh (line 870) | TaskPriorityHigh
  constant TaskPriorityCritical (line 871) | TaskPriorityCritical
  type TaskStatus (line 896) | type TaskStatus
    method String (line 908) | func (ts TaskStatus) String() string {
    method IsValid (line 928) | func (ts TaskStatus) IsValid() bool {
  constant TaskStatusPending (line 899) | TaskStatusPending    TaskStatus = iota + 1
  constant TaskStatusInProgress (line 900) | TaskStatusInProgress
  constant TaskStatusPaused (line 901) | TaskStatusPaused
  constant TaskStatusCompleted (line 902) | TaskStatusCompleted
  constant TaskStatusCancelled (line 903) | TaskStatusCancelled
  constant TaskStatusFailed (line 904) | TaskStatusFailed
  function NewPhaseTask (line 933) | func NewPhaseTask(name, description string, taskType TaskType, priority ...
  type Blueprint (line 1020) | type Blueprint struct
    method AddLayer (line 1063) | func (bp *Blueprint) AddLayer(layer *BlueprintLayer) error {
    method AddMaterial (line 1074) | func (bp *Blueprint) AddMaterial(material *MaterialRequirement) error {
    method AddCost (line 1085) | func (bp *Blueprint) AddCost(cost *ResourceCost) error {
    method AddTag (line 1096) | func (bp *Blueprint) AddTag(tag string) {
  function NewBlueprint (line 1040) | func NewBlueprint(name, description string, category BuildingCategory) *...
  type BlueprintLayer (line 1108) | type BlueprintLayer struct
  function NewBlueprintLayer (line 1120) | func NewBlueprintLayer(name string, level int32) *BlueprintLayer {
  type BlueprintBlock (line 1135) | type BlueprintBlock struct
  function NewBlueprintBlock (line 1149) | func NewBlueprintBlock(blockType string, position *Position, size *Size)...
  type BlueprintConnection (line 1166) | type BlueprintConnection struct
  function NewBlueprintConnection (line 1178) | func NewBlueprintConnection(fromBlock, toBlock, connectionType string) *...
  type MaterialRequirement (line 1193) | type MaterialRequirement struct
  function NewMaterialRequirement (line 1202) | func NewMaterialRequirement(materialType string, quantity int64) *Materi...
  type UpgradeBenefit (line 1213) | type UpgradeBenefit struct
  function NewUpgradeBenefit (line 1221) | func NewUpgradeBenefit(benefitType, target string, value float64, descri...
  function generateConstructionID (line 1233) | func generateConstructionID() string {
  function generateUpgradeID (line 1238) | func generateUpgradeID() string {
  function generateWorkerAssignmentID (line 1243) | func generateWorkerAssignmentID() string {
  function generateMaterialUsageID (line 1248) | func generateMaterialUsageID() string {
  function generatePhaseID (line 1253) | func generatePhaseID() string {
  function generateTaskID (line 1258) | func generateTaskID() string {
  function generateBlueprintID (line 1263) | func generateBlueprintID() string {
  function generateLayerID (line 1268) | func generateLayerID() string {
  function generateBlockID (line 1273) | func generateBlockID() string {
  function generateConnectionID (line 1278) | func generateConnectionID() string {

FILE: internal/domain/building/errors.go
  type BuildingError (line 9) | type BuildingError interface
  type ErrorSeverity (line 22) | type ErrorSeverity
    method String (line 32) | func (es ErrorSeverity) String() string {
    method IsValid (line 48) | func (es ErrorSeverity) IsValid() bool {
  constant ErrorSeverityLow (line 25) | ErrorSeverityLow      ErrorSeverity = iota + 1
  constant ErrorSeverityMedium (line 26) | ErrorSeverityMedium
  constant ErrorSeverityHigh (line 27) | ErrorSeverityHigh
  constant ErrorSeverityCritical (line 28) | ErrorSeverityCritical
  type BaseBuildingError (line 53) | type BaseBuildingError struct
    method Error (line 76) | func (e *BaseBuildingError) Error() string {
    method GetCode (line 81) | func (e *BaseBuildingError) GetCode() string {
    method GetMessage (line 86) | func (e *BaseBuildingError) GetMessage() string {
    method GetSeverity (line 91) | func (e *BaseBuildingError) GetSeverity() ErrorSeverity {
    method GetTimestamp (line 96) | func (e *BaseBuildingError) GetTimestamp() time.Time {
    method GetContext (line 101) | func (e *BaseBuildingError) GetContext() map[string]interface{} {
    method SetContext (line 106) | func (e *BaseBuildingError) SetContext(key string, value interface{}) {
    method IsRetryable (line 114) | func (e *BaseBuildingError) IsRetryable() bool {
    method GetRetryAfter (line 119) | func (e *BaseBuildingError) GetRetryAfter() time.Duration {
    method SetRetryable (line 124) | func (e *BaseBuildingError) SetRetryable(retryable bool, retryAfter ti...
  function NewBuildingError (line 64) | func NewBuildingError(code, message string, severity ErrorSeverity) *Bas...
  type BuildingNotFoundError (line 132) | type BuildingNotFoundError struct
  function NewBuildingNotFoundError (line 138) | func NewBuildingNotFoundError(buildingID string) *BuildingNotFoundError {
  type ConstructionNotFoundError (line 152) | type ConstructionNotFoundError struct
  function NewConstructionNotFoundError (line 158) | func NewConstructionNotFoundError(constructionID string) *ConstructionNo...
  type UpgradeNotFoundError (line 172) | type UpgradeNotFoundError struct
  function NewUpgradeNotFoundError (line 178) | func NewUpgradeNotFoundError(upgradeID string) *UpgradeNotFoundError {
  type BlueprintNotFoundError (line 192) | type BlueprintNotFoundError struct
  function NewBlueprintNotFoundError (line 198) | func NewBlueprintNotFoundError(blueprintID string) *BlueprintNotFoundErr...
  type InvalidBuildingStateError (line 212) | type InvalidBuildingStateError struct
  function NewInvalidBuildingStateError (line 221) | func NewInvalidBuildingStateError(buildingID string, currentState, expec...
  type InsufficientResourcesError (line 241) | type InsufficientResourcesError struct
  function NewInsufficientResourcesError (line 250) | func NewInsufficientResourcesError(resourceType string, required, availa...
  type PositionOccupiedError (line 270) | type PositionOccupiedError struct
  function NewPositionOccupiedError (line 277) | func NewPositionOccupiedError(position *Position, occupyingBuilding stri...
  type ConstructionFailedError (line 293) | type ConstructionFailedError struct
  function NewConstructionFailedError (line 301) | func NewConstructionFailedError(buildingID, constructionID, reason strin...
  type UpgradeFailedError (line 320) | type UpgradeFailedError struct
  function NewUpgradeFailedError (line 328) | func NewUpgradeFailedError(buildingID, upgradeID, reason string) *Upgrad...
  type RepairFailedError (line 347) | type RepairFailedError struct
  function NewRepairFailedError (line 354) | func NewRepairFailedError(buildingID, reason string) *RepairFailedError {
  type DestroyFailedError (line 371) | type DestroyFailedError struct
  function NewDestroyFailedError (line 378) | func NewDestroyFailedError(buildingID, reason string) *DestroyFailedError {
  type WorkerNotAvailableError (line 394) | type WorkerNotAvailableError struct
  function NewWorkerNotAvailableError (line 401) | func NewWorkerNotAvailableError(workerID uint64, reason string) *WorkerN...
  type InvalidInputError (line 418) | type InvalidInputError struct
  function NewInvalidInputError (line 425) | func NewInvalidInputError(field, value, reason string) *InvalidInputError {
  type RepositoryError (line 441) | type RepositoryError struct
  function NewRepositoryError (line 448) | func NewRepositoryError(operation, entity, reason string) *RepositoryErr...
  type ConcurrencyError (line 465) | type ConcurrencyError struct
  function NewConcurrencyError (line 472) | func NewConcurrencyError(resourceID, operation string) *ConcurrencyError {
  constant ErrCodeInvalidInput (line 492) | ErrCodeInvalidInput     = "BUILDING_INVALID_INPUT"
  constant ErrCodeRepositoryError (line 493) | ErrCodeRepositoryError  = "BUILDING_REPOSITORY_ERROR"
  constant ErrCodeConcurrencyError (line 494) | ErrCodeConcurrencyError = "BUILDING_CONCURRENCY_ERROR"
  constant ErrCodeInvalidOperation (line 495) | ErrCodeInvalidOperation = "BUILDING_INVALID_OPERATION"
  constant ErrCodeBuildingNotFound (line 498) | ErrCodeBuildingNotFound      = "BUILDING_NOT_FOUND"
  constant ErrCodeInvalidBuildingState (line 499) | ErrCodeInvalidBuildingState  = "BUILDING_INVALID_STATE"
  constant ErrCodePositionOccupied (line 500) | ErrCodePositionOccupied      = "BUILDING_POSITION_OCCUPIED"
  constant ErrCodeInsufficientResources (line 501) | ErrCodeInsufficientResources = "BUILDING_INSUFFICIENT_RESOURCES"
  constant ErrCodeConstructionNotFound (line 504) | ErrCodeConstructionNotFound = "CONSTRUCTION_NOT_FOUND"
  constant ErrCodeConstructionFailed (line 505) | ErrCodeConstructionFailed   = "CONSTRUCTION_FAILED"
  constant ErrCodeUpgradeNotFound (line 508) | ErrCodeUpgradeNotFound = "UPGRADE_NOT_FOUND"
  constant ErrCodeUpgradeFailed (line 509) | ErrCodeUpgradeFailed   = "UPGRADE_FAILED"
  constant ErrCodeInvalidUpgrade (line 510) | ErrCodeInvalidUpgrade  = "UPGRADE_INVALID"
  constant ErrCodeRepairFailed (line 513) | ErrCodeRepairFailed  = "REPAIR_FAILED"
  constant ErrCodeDestroyFailed (line 514) | ErrCodeDestroyFailed = "DESTROY_FAILED"
  constant ErrCodeWorkerNotFound (line 517) | ErrCodeWorkerNotFound     = "WORKER_NOT_FOUND"
  constant ErrCodeWorkerNotAvailable (line 518) | ErrCodeWorkerNotAvailable = "WORKER_NOT_AVAILABLE"
  constant ErrCodeBlueprintNotFound (line 521) | ErrCodeBlueprintNotFound = "BLUEPRINT_NOT_FOUND"
  constant ErrCodeBlueprintInvalid (line 522) | ErrCodeBlueprintInvalid  = "BLUEPRINT_INVALID"
  constant ErrCodeSystemError (line 525) | ErrCodeSystemError  = "BUILDING_SYSTEM_ERROR"
  constant ErrCodeConfigError (line 526) | ErrCodeConfigError  = "BUILDING_CONFIG_ERROR"
  constant ErrCodeNetworkError (line 527) | ErrCodeNetworkError = "BUILDING_NETWORK_ERROR"
  constant ErrCodeTimeoutError (line 528) | ErrCodeTimeoutError = "BUILDING_TIMEOUT_ERROR"
  function IsBuildingError (line 534) | func IsBuildingError(err error) bool {
  function GetBuildingError (line 540) | func GetBuildingError(err error) (BuildingError, bool) {
  function IsRetryableError (line 546) | func IsRetryableError(err error) bool {
  function GetErrorSeverity (line 554) | func GetErrorSeverity(err error) ErrorSeverity {
  function GetErrorCode (line 562) | func GetErrorCode(err error) string {
  function IsNotFoundError (line 572) | func IsNotFoundError(err error) bool {
  function IsValidationError (line 582) | func IsValidationError(err error) bool {
  function IsResourceError (line 591) | func IsResourceError(err error) bool {
  function IsSystemError (line 599) | func IsSystemError(err error) bool {
  function IsOperationError (line 610) | func IsOperationError(err error) bool {
  type ErrorRecoveryStrategy (line 621) | type ErrorRecoveryStrategy
    method String (line 632) | func (ers ErrorRecoveryStrategy) String() string {
  constant RecoveryStrategyNone (line 624) | RecoveryStrategyNone                ErrorRecoveryStrategy = iota + 1
  constant RecoveryStrategyRetry (line 625) | RecoveryStrategyRetry
  constant RecoveryStrategyFallback (line 626) | RecoveryStrategyFallback
  constant RecoveryStrategyCircuitBreaker (line 627) | RecoveryStrategyCircuitBreaker
  constant RecoveryStrategyGracefulDegradation (line 628) | RecoveryStrategyGracefulDegradation
  function GetRecoveryStrategy (line 650) | func GetRecoveryStrategy(err error) ErrorRecoveryStrategy {
  type ErrorStatistics (line 676) | type ErrorStatistics struct
    method AddError (line 701) | func (es *ErrorStatistics) AddError(err error) {
    method GetMostFrequentError (line 744) | func (es *ErrorStatistics) GetMostFrequentError() string {
    method GetErrorRate (line 759) | func (es *ErrorStatistics) GetErrorRate() float64 {
    method GetRetryableErrorRate (line 776) | func (es *ErrorStatistics) GetRetryableErrorRate() float64 {
  function NewErrorStatistics (line 688) | func NewErrorStatistics() *ErrorStatistics {
  function WrapError (line 786) | func WrapError(err error, code, message string, severity ErrorSeverity) ...
  function ChainErrors (line 793) | func ChainErrors(errors []error) BuildingError {
  function ValidateErrorCode (line 825) | func ValidateErrorCode(code string) bool {
  function FormatError (line 861) | func FormatError(err error) string {
  function GetErrorDetails (line 874) | func GetErrorDetails(err error) map[string]interface{} {

FILE: internal/domain/building/events.go
  type BuildingEvent (line 10) | type BuildingEvent interface
  type BaseBuildingEvent (line 20) | type BaseBuildingEvent struct
    method GetEventID (line 30) | func (e *BaseBuildingEvent) GetEventID() string {
    method GetEventType (line 35) | func (e *BaseBuildingEvent) GetEventType() string {
    method GetBuildingID (line 40) | func (e *BaseBuildingEvent) GetBuildingID() string {
    method GetTimestamp (line 45) | func (e *BaseBuildingEvent) GetTimestamp() time.Time {
    method GetPayload (line 50) | func (e *BaseBuildingEvent) GetPayload() interface{} {
    method Validate (line 55) | func (e *BaseBuildingEvent) Validate() error {
    method SetMetadata (line 72) | func (e *BaseBuildingEvent) SetMetadata(key string, value interface{}) {
    method GetMetadata (line 80) | func (e *BaseBuildingEvent) GetMetadata(key string) (interface{}, bool) {
  type BuildingCreatedEvent (line 91) | type BuildingCreatedEvent struct
  function NewBuildingCreatedEvent (line 102) | func NewBuildingCreatedEvent(buildingID, name string, buildingType Build...
  type BuildingUpdatedEvent (line 119) | type BuildingUpdatedEvent struct
  function NewBuildingUpdatedEvent (line 125) | func NewBuildingUpdatedEvent(buildingID string, changes map[string]inter...
  type BuildingDeletedEvent (line 140) | type BuildingDeletedEvent struct
  function NewBuildingDeletedEvent (line 146) | func NewBuildingDeletedEvent(buildingID, reason string) *BuildingDeleted...
  type BuildingStatusChangedEvent (line 163) | type BuildingStatusChangedEvent struct
  function NewBuildingStatusChangedEvent (line 171) | func NewBuildingStatusChangedEvent(buildingID string, oldStatus, newStat...
  type BuildingHealthChangedEvent (line 188) | type BuildingHealthChangedEvent struct
  function NewBuildingHealthChangedEvent (line 196) | func NewBuildingHealthChangedEvent(buildingID string, oldHealth, newHeal...
  type BuildingLevelChangedEvent (line 213) | type BuildingLevelChangedEvent struct
  function NewBuildingLevelChangedEvent (line 221) | func NewBuildingLevelChangedEvent(buildingID string, oldLevel, newLevel ...
  type ConstructionStartedEvent (line 240) | type ConstructionStartedEvent struct
  function NewConstructionStartedEvent (line 248) | func NewConstructionStartedEvent(buildingID, constructionID string, dura...
  type ConstructionProgressUpdatedEvent (line 264) | type ConstructionProgressUpdatedEvent struct
  function NewConstructionProgressUpdatedEvent (line 272) | func NewConstructionProgressUpdatedEvent(buildingID, constructionID stri...
  type ConstructionCompletedEvent (line 288) | type ConstructionCompletedEvent struct
  function NewConstructionCompletedEvent (line 296) | func NewConstructionCompletedEvent(buildingID, constructionID string) *C...
  type ConstructionCancelledEvent (line 311) | type ConstructionCancelledEvent struct
  function NewConstructionCancelledEvent (line 318) | func NewConstructionCancelledEvent(buildingID, constructionID, reason st...
  type UpgradeStartedEvent (line 336) | type UpgradeStartedEvent struct
  function NewUpgradeStartedEvent (line 346) | func NewUpgradeStartedEvent(buildingID, upgradeID string, fromLevel, toL...
  type UpgradeProgressUpdatedEvent (line 363) | type UpgradeProgressUpdatedEvent struct
  function NewUpgradeProgressUpdatedEvent (line 371) | func NewUpgradeProgressUpdatedEvent(buildingID, upgradeID string, progre...
  type UpgradeCompletedEvent (line 387) | type UpgradeCompletedEvent struct
  function NewUpgradeCompletedEvent (line 398) | func NewUpgradeCompletedEvent(buildingID, upgradeID string, fromLevel, t...
  type UpgradeCancelledEvent (line 415) | type UpgradeCancelledEvent struct
  function NewUpgradeCancelledEvent (line 422) | func NewUpgradeCancelledEvent(buildingID, upgradeID, reason string) *Upg...
  type BuildingRepairedEvent (line 440) | type BuildingRepairedEvent struct
  function NewBuildingRepairedEvent (line 449) | func NewBuildingRepairedEvent(buildingID string, oldHealth, newHealth fl...
  type BuildingDamagedEvent (line 466) | type BuildingDamagedEvent struct
  function NewBuildingDamagedEvent (line 476) | func NewBuildingDamagedEvent(buildingID string, oldHealth, newHealth flo...
  type BuildingDestroyedEvent (line 495) | type BuildingDestroyedEvent struct
  function NewBuildingDestroyedEvent (line 501) | func NewBuildingDestroyedEvent(buildingID, reason string) *BuildingDestr...
  type WorkerAssignedEvent (line 518) | type WorkerAssignedEvent struct
  function NewWorkerAssignedEvent (line 528) | func NewWorkerAssignedEvent(buildingID string, workerID uint64, role Wor...
  type WorkerUnassignedEvent (line 545) | type WorkerUnassignedEvent struct
  function NewWorkerUnassignedEvent (line 554) | func NewWorkerUnassignedEvent(buildingID string, workerID uint64, reason...
  type BlueprintCreatedEvent (line 572) | type BlueprintCreatedEvent struct
  function NewBlueprintCreatedEvent (line 582) | func NewBlueprintCreatedEvent(blueprintID, name string, category Buildin...
  type BlueprintUsedEvent (line 599) | type BlueprintUsedEvent struct
  function NewBlueprintUsedEvent (line 606) | func NewBlueprintUsedEvent(buildingID, blueprintID string, userID uint64...
  type BuildingSystemErrorEvent (line 624) | type BuildingSystemErrorEvent struct
  function NewBuildingSystemErrorEvent (line 633) | func NewBuildingSystemErrorEvent(buildingID, errorCode, errorMessage, se...
  type BuildingMaintenanceScheduledEvent (line 650) | type BuildingMaintenanceScheduledEvent struct
  function NewBuildingMaintenanceScheduledEvent (line 659) | func NewBuildingMaintenanceScheduledEvent(buildingID, maintenanceType st...
  constant EventTypeBuildingCreated (line 679) | EventTypeBuildingCreated = "building.created"
  constant EventTypeBuildingUpdated (line 680) | EventTypeBuildingUpdated = "building.updated"
  constant EventTypeBuildingDeleted (line 681) | EventTypeBuildingDeleted = "building.deleted"
  constant EventTypeBuildingStatusChanged (line 684) | EventTypeBuildingStatusChanged = "building.status_changed"
  constant EventTypeBuildingHealthChanged (line 685) | EventTypeBuildingHealthChanged = "building.health_changed"
  constant EventTypeBuildingLevelChanged (line 686) | EventTypeBuildingLevelChanged  = "building.level_changed"
  constant EventTypeConstructionStarted (line 689) | EventTypeConstructionStarted         = "construction.started"
  constant EventTypeConstructionProgressUpdated (line 690) | EventTypeConstructionProgressUpdated = "construction.progress_updated"
  constant EventTypeConstructionCompleted (line 691) | EventTypeConstructionCompleted       = "construction.completed"
  constant EventTypeConstructionCancelled (line 692) | EventTypeConstructionCancelled       = "construction.cancelled"
  constant EventTypeUpgradeStarted (line 695) | EventTypeUpgradeStarted         = "upgrade.started"
  constant EventTypeUpgradeProgressUpdated (line 696) | EventTypeUpgradeProgressUpdated = "upgrade.progress_updated"
  constant EventTypeUpgradeCompleted (line 697) | EventTypeUpgradeCompleted       = "upgrade.completed"
  constant EventTypeUpgradeCancelled (line 698) | EventTypeUpgradeCancelled       = "upgrade.cancelled"
  constant EventTypeBuildingRepaired (line 701) | EventTypeBuildingRepaired  = "building.repaired"
  constant EventTypeBuildingDamaged (line 702) | EventTypeBuildingDamaged   = "building.damaged"
  constant EventTypeBuildingDestroyed (line 703) | EventTypeBuildingDestroyed = "building.destroyed"
  constant EventTypeWorkerAssigned (line 706) | EventTypeWorkerAssigned   = "worker.assigned"
  constant EventTypeWorkerUnassigned (line 707) | EventTypeWorkerUnassigned = "worker.unassigned"
  constant EventTypeBlueprintCreated (line 710) | EventTypeBlueprintCreated = "blueprint.created"
  constant EventTypeBlueprintUsed (line 711) | EventTypeBlueprintUsed    = "blueprint.used"
  constant EventTypeBuildingSystemError (line 714) | EventTypeBuildingSystemError          = "building.system_error"
  constant EventTypeBuildingMaintenanceScheduled (line 715) | EventTypeBuildingMaintenanceScheduled = "building.maintenance_scheduled"
  type BuildingEventHandler (line 721) | type BuildingEventHandler interface
  type BuildingEventBus (line 728) | type BuildingEventBus interface
  type BuildingEventAggregator (line 739) | type BuildingEventAggregator struct
    method AddEvent (line 760) | func (ea *BuildingEventAggregator) AddEvent(event BuildingEvent) {
    method GetEvents (line 767) | func (ea *BuildingEventAggregator) GetEvents() []BuildingEvent {
    method GetEventsByType (line 772) | func (ea *BuildingEventAggregator) GetEventsByType(eventType string) [...
    method GetEventsAfter (line 783) | func (ea *BuildingEventAggregator) GetEventsAfter(timestamp time.Time)...
    method GetEventCount (line 794) | func (ea *BuildingEventAggregator) GetEventCount() int {
    method GetEventCountByType (line 799) | func (ea *BuildingEventAggregator) GetEventCountByType(eventType strin...
    method Clear (line 810) | func (ea *BuildingEventAggregator) Clear() {
    method GetBuildingID (line 817) | func (ea *BuildingEventAggregator) GetBuildingID() string {
    method GetVersion (line 822) | func (ea *BuildingEventAggregator) GetVersion() int64 {
    method GetCreatedAt (line 827) | func (ea *BuildingEventAggregator) GetCreatedAt() time.Time {
    method GetUpdatedAt (line 832) | func (ea *BuildingEventAggregator) GetUpdatedAt() time.Time {
  function NewBuildingEventAggregator (line 748) | func NewBuildingEventAggregator(buildingID string) *BuildingEventAggrega...
  type BuildingEventStatistics (line 839) | type BuildingEventStatistics struct
    method AddEvent (line 862) | func (es *BuildingEventStatistics) AddEvent(event BuildingEvent) {
    method GetMostFrequentEventType (line 881) | func (es *BuildingEventStatistics) GetMostFrequentEventType() string {
    method GetEventsInLastHour (line 896) | func (es *BuildingEventStatistics) GetEventsInLastHour() int64 {
    method GetEventsInLastDay (line 902) | func (es *BuildingEventStatistics) GetEventsInLastDay() int64 {
  function NewBuildingEventStatistics (line 850) | func NewBuildingEventStatistics(buildingID string) *BuildingEventStatist...
  function generateEventID (line 910) | func generateEventID() string {
  function ValidateEventType (line 915) | func ValidateEventType(eventType string) bool {
  function GetEventCategory (line 951) | func GetEventCategory(eventType string) string {
  function IsSystemEvent (line 975) | func IsSystemEvent(eventType string) bool {
  function IsUserEvent (line 980) | func IsUserEvent(eventType string) bool {
  function GetEventPriority (line 986) | func GetEventPriority(eventType string) int {

FILE: internal/domain/building/repository.go
  type BuildingRepository (line 10) | type BuildingRepository interface
  type ConstructionRepository (line 45) | type ConstructionRepository interface
  type UpgradeRepository (line 74) | type UpgradeRepository interface
  type BlueprintRepository (line 103) | type BlueprintRepository interface
  type BuildingQuery (line 133) | type BuildingQuery struct
    method WithOwner (line 547) | func (q *BuildingQuery) WithOwner(ownerID uint64) *BuildingQuery {
    method WithType (line 553) | func (q *BuildingQuery) WithType(buildingType BuildingType) *BuildingQ...
    method WithCategory (line 559) | func (q *BuildingQuery) WithCategory(category BuildingCategory) *Build...
    method WithStatus (line 565) | func (q *BuildingQuery) WithStatus(status BuildingStatus) *BuildingQue...
    method WithLevelRange (line 571) | func (q *BuildingQuery) WithLevelRange(minLevel, maxLevel int32) *Buil...
    method WithHealthRange (line 578) | func (q *BuildingQuery) WithHealthRange(minHealth, maxHealth float64) ...
    method WithPosition (line 585) | func (q *BuildingQuery) WithPosition(position *Position) *BuildingQuery {
    method WithArea (line 591) | func (q *BuildingQuery) WithArea(area *Area) *BuildingQuery {
    method WithTags (line 597) | func (q *BuildingQuery) WithTags(tags []string) *BuildingQuery {
    method WithSort (line 603) | func (q *BuildingQuery) WithSort(sortBy, sortOrder string) *BuildingQu...
    method WithPagination (line 610) | func (q *BuildingQuery) WithPagination(page, pageSize int) *BuildingQu...
  type ConstructionQuery (line 172) | type ConstructionQuery struct
    method WithBuildingID (line 627) | func (q *ConstructionQuery) WithBuildingID(buildingID string) *Constru...
    method WithStatus (line 633) | func (q *ConstructionQuery) WithStatus(status ConstructionStatus) *Con...
    method WithWorker (line 639) | func (q *ConstructionQuery) WithWorker(workerID uint64) *ConstructionQ...
    method WithProgressRange (line 645) | func (q *ConstructionQuery) WithProgressRange(minProgress, maxProgress...
    method WithSort (line 652) | func (q *ConstructionQuery) WithSort(sortBy, sortOrder string) *Constr...
    method WithPagination (line 659) | func (q *ConstructionQuery) WithPagination(page, pageSize int) *Constr...
  type UpgradeQuery (line 200) | type UpgradeQuery struct
    method WithBuildingID (line 676) | func (q *UpgradeQuery) WithBuildingID(buildingID string) *UpgradeQuery {
    method WithStatus (line 682) | func (q *UpgradeQuery) WithStatus(status UpgradeStatus) *UpgradeQuery {
    method WithLevelRange (line 688) | func (q *UpgradeQuery) WithLevelRange(fromLevel, toLevel int32) *Upgra...
    method WithProgressRange (line 695) | func (q *UpgradeQuery) WithProgressRange(minProgress, maxProgress floa...
    method WithSort (line 702) | func (q *UpgradeQuery) WithSort(sortBy, sortOrder string) *UpgradeQuery {
    method WithPagination (line 709) | func (q *UpgradeQuery) WithPagination(page, pageSize int) *UpgradeQuery {
  type BlueprintQuery (line 231) | type BlueprintQuery struct
    method WithName (line 726) | func (q *BlueprintQuery) WithName(name string) *BlueprintQuery {
    method WithAuthor (line 732) | func (q *BlueprintQuery) WithAuthor(author string) *BlueprintQuery {
    method WithCategory (line 738) | func (q *BlueprintQuery) WithCategory(category BuildingCategory) *Blue...
    method WithDifficultyRange (line 744) | func (q *BlueprintQuery) WithDifficultyRange(minDifficulty, maxDifficu...
    method WithTags (line 751) | func (q *BlueprintQuery) WithTags(tags []string) *BlueprintQuery {
    method WithKeyword (line 757) | func (q *BlueprintQuery) WithKeyword(keyword string) *BlueprintQuery {
    method WithSort (line 763) | func (q *BlueprintQuery) WithSort(sortBy, sortOrder string) *Blueprint...
    method WithPagination (line 770) | func (q *BlueprintQuery) WithPagination(page, pageSize int) *Blueprint...
  type PaginationResult (line 276) | type PaginationResult struct
  type BuildingStatistics (line 288) | type BuildingStatistics struct
  type ConstructionStatistics (line 328) | type ConstructionStatistics struct
  type UpgradeStatistics (line 376) | type UpgradeStatistics struct
  type BlueprintStatistics (line 416) | type BlueprintStatistics struct
  type TagStatistic (line 465) | type TagStatistic struct
  type Area (line 471) | type Area struct
    method IsValid (line 493) | func (a *Area) IsValid() bool {
    method Contains (line 498) | func (a *Area) Contains(pos *Position) bool {
    method Overlaps (line 508) | func (a *Area) Overlaps(other *Area) bool {
    method GetVolume (line 518) | func (a *Area) GetVolume() int64 {
    method GetCenter (line 526) | func (a *Area) GetCenter() *Position {
  function NewArea (line 481) | func NewArea(minX, maxX, minY, maxY, minZ, maxZ int32) *Area {
  function NewBuildingQuery (line 537) | func NewBuildingQuery() *BuildingQuery {
  function NewConstructionQuery (line 617) | func NewConstructionQuery() *ConstructionQuery {
  function NewUpgradeQuery (line 666) | func NewUpgradeQuery() *UpgradeQuery {
  function NewBlueprintQuery (line 716) | func NewBlueprintQuery() *BlueprintQuery {
  constant DefaultPageSize (line 780) | DefaultPageSize = 20
  constant MaxPageSize (line 781) | MaxPageSize     = 100
  constant DefaultSortBy (line 784) | DefaultSortBy    = "created_at"
  constant DefaultSortOrder (line 785) | DefaultSortOrder = "desc"
  constant MaxTagsCount (line 788) | MaxTagsCount  = 10
  constant MaxKeywordLen (line 789) | MaxKeywordLen = 100
  constant MaxNameLen (line 790) | MaxNameLen    = 100
  constant MaxAuthorLen (line 791) | MaxAuthorLen  = 50
  constant MaxVersionLen (line 792) | MaxVersionLen = 20
  function ValidateQuery (line 798) | func ValidateQuery(page, pageSize int, sortBy, sortOrder string, validSo...
  function ValidateBuildingQuery (line 827) | func ValidateBuildingQuery(query *BuildingQuery) error {
  function ValidateConstructionQuery (line 837) | func ValidateConstructionQuery(query *ConstructionQuery) error {
  function ValidateUpgradeQuery (line 847) | func ValidateUpgradeQuery(query *UpgradeQuery) error {
  function ValidateBlueprintQuery (line 857) | func ValidateBlueprintQuery(query *BlueprintQuery) error {

FILE: internal/domain/building/service.go
  type BuildingService (line 10) | type BuildingService struct
    method CreateBuilding (line 36) | func (bs *BuildingService) CreateBuilding(ctx context.Context, req *Cr...
    method StartConstruction (line 84) | func (bs *BuildingService) StartConstruction(ctx context.Context, req ...
    method UpdateConstructionProgress (line 157) | func (bs *BuildingService) UpdateConstructionProgress(ctx context.Cont...
    method StartUpgrade (line 215) | func (bs *BuildingService) StartUpgrade(ctx context.Context, req *Star...
    method CompleteUpgrade (line 293) | func (bs *BuildingService) CompleteUpgrade(ctx context.Context, upgrad...
    method RepairBuilding (line 343) | func (bs *BuildingService) RepairBuilding(ctx context.Context, req *Re...
    method DestroyBuilding (line 396) | func (bs *BuildingService) DestroyBuilding(ctx context.Context, buildi...
    method GetBuildingsByOwner (line 433) | func (bs *BuildingService) GetBuildingsByOwner(ctx context.Context, ow...
    method GetBuildingStatistics (line 461) | func (bs *BuildingService) GetBuildingStatistics(ctx context.Context, ...
    method CreateBlueprint (line 475) | func (bs *BuildingService) CreateBlueprint(ctx context.Context, req *C...
    method GetBlueprints (line 527) | func (bs *BuildingService) GetBlueprints(ctx context.Context, query *B...
    method ValidateBlueprint (line 550) | func (bs *BuildingService) ValidateBlueprint(ctx context.Context, blue...
    method checkResourceAvailability (line 608) | func (bs *BuildingService) checkResourceAvailability(ctx context.Conte...
  function NewBuildingService (line 19) | func NewBuildingService(
  type CreateBuildingRequest (line 617) | type CreateBuildingRequest struct
    method Validate (line 628) | func (req *CreateBuildingRequest) Validate() error {
  type StartConstructionRequest (line 649) | type StartConstructionRequest struct
    method Validate (line 659) | func (req *StartConstructionRequest) Validate() error {
  type UpdateConstructionProgressRequest (line 673) | type UpdateConstructionProgressRequest struct
    method Validate (line 679) | func (req *UpdateConstructionProgressRequest) Validate() error {
  type StartUpgradeRequest (line 690) | type StartUpgradeRequest struct
    method Validate (line 700) | func (req *StartUpgradeRequest) Validate() error {
  type RepairBuildingRequest (line 714) | type RepairBuildingRequest struct
    method Validate (line 721) | func (req *RepairBuildingRequest) Validate() error {
  type CreateBlueprintRequest (line 732) | type CreateBlueprintRequest struct
    method Validate (line 746) | func (req *CreateBlueprintRequest) Validate() error {
  type BlueprintValidationResult (line 766) | type BlueprintValidationResult struct
  constant DefaultBuildingHealth (line 777) | DefaultBuildingHealth = 100.0
  constant DefaultBuildingLevel (line 778) | DefaultBuildingLevel  = 1
  constant MaxBuildingLevel (line 781) | MaxBuildingLevel   = 100
  constant MaxBuildingNameLen (line 782) | MaxBuildingNameLen = 100
  constant MaxDescriptionLen (line 783) | MaxDescriptionLen  = 500
  constant MaxLayersCount (line 785) | MaxLayersCount       = 50
  constant MaxBlocksPerLayer (line 786) | MaxBlocksPerLayer    = 1000
  constant MaxMaterialsCount (line 787) | MaxMaterialsCount    = 100
  constant MaxCostsCount (line 788) | MaxCostsCount        = 20
  constant MaxWorkersCount (line 789) | MaxWorkersCount      = 50
  constant MaxPhasesCount (line 790) | MaxPhasesCount       = 20
  constant MaxTasksPerPhase (line 791) | MaxTasksPerPhase     = 100
  constant MaxDependenciesCount (line 792) | MaxDependenciesCount = 10
  constant MinConstructionDuration (line 795) | MinConstructionDuration = 1 * time.Minute
  constant MaxConstructionDuration (line 796) | MaxConstructionDuration = 30 * 24 * time.Hour
  constant MinUpgradeDuration (line 797) | MinUpgradeDuration      = 1 * time.Minute
  constant MaxUpgradeDuration (line 798) | MaxUpgradeDuration      = 7 * 24 * time.Hour
  function ValidateBuildingName (line 804) | func ValidateBuildingName(name string) error {
  function ValidateDescription (line 815) | func ValidateDescription(description string) error {
  function ValidateDuration (line 823) | func ValidateDuration(duration time.Duration, minDuration, maxDuration t...
  function ValidateLevel (line 834) | func ValidateLevel(level int32) error {
  function ValidateHealth (line 845) | func ValidateHealth(health float64) error {
  function ValidateProgress (line 856) | func ValidateProgress(progress float64) error {
  function CalculateConstructionTime (line 867) | func CalculateConstructionTime(baseTime time.Duration, difficulty int32,...
  function CalculateUpgradeCost (line 877) | func CalculateUpgradeCost(baseCost int64, fromLevel, toLevel int32) int64 {
  function CalculateRepairCost (line 886) | func CalculateRepairCost(baseCost int64, currentHealth, targetHealth flo...

FILE: internal/domain/building/types.go
  type BuildingType (line 4) | type BuildingType
    method IsValid (line 15) | func (bt BuildingType) IsValid() bool {
  constant BuildingTypeResidential (line 7) | BuildingTypeResidential  BuildingType = "residential"
  constant BuildingTypeCommercial (line 8) | BuildingTypeCommercial   BuildingType = "commercial"
  constant BuildingTypeIndustrial (line 9) | BuildingTypeIndustrial   BuildingType = "industrial"
  constant BuildingTypePublic (line 10) | BuildingTypePublic       BuildingType = "public"
  constant BuildingTypeRecreational (line 11) | BuildingTypeRecreational BuildingType = "recreational"
  type BuildingConfig (line 25) | type BuildingConfig struct

FILE: internal/domain/building/value_object.go
  type BuildingStatus (line 12) | type BuildingStatus
    method String (line 28) | func (bs BuildingStatus) String() string {
    method IsValid (line 56) | func (bs BuildingStatus) IsValid() bool {
    method CanTransitionTo (line 61) | func (bs BuildingStatus) CanTransitionTo(target BuildingStatus) bool {
  constant BuildingStatusPlanning (line 15) | BuildingStatusPlanning          BuildingStatus = iota + 1
  constant BuildingStatusUnderConstruction (line 16) | BuildingStatusUnderConstruction
  constant BuildingStatusActive (line 17) | BuildingStatusActive
  constant BuildingStatusUpgrading (line 18) | BuildingStatusUpgrading
  constant BuildingStatusMaintenance (line 19) | BuildingStatusMaintenance
  constant BuildingStatusDamaged (line 20) | BuildingStatusDamaged
  constant BuildingStatusDestroyed (line 21) | BuildingStatusDestroyed
  constant BuildingStatusDemolished (line 22) | BuildingStatusDemolished
  constant BuildingStatusCancelled (line 23) | BuildingStatusCancelled
  constant BuildingStatusInactive (line 24) | BuildingStatusInactive
  type BuildingCategory (line 88) | type BuildingCategory
    method String (line 105) | func (bc BuildingCategory) String() string {
    method IsValid (line 135) | func (bc BuildingCategory) IsValid() bool {
  constant BuildingCategoryResidential (line 91) | BuildingCategoryResidential   BuildingCategory = iota + 1
  constant BuildingCategoryCommercial (line 92) | BuildingCategoryCommercial
  constant BuildingCategoryIndustrial (line 93) | BuildingCategoryIndustrial
  constant BuildingCategoryMilitary (line 94) | BuildingCategoryMilitary
  constant BuildingCategoryReligious (line 95) | BuildingCategoryReligious
  constant BuildingCategoryEducational (line 96) | BuildingCategoryEducational
  constant BuildingCategoryMedical (line 97) | BuildingCategoryMedical
  constant BuildingCategoryEntertainment (line 98) | BuildingCategoryEntertainment
  constant BuildingCategoryUtility (line 99) | BuildingCategoryUtility
  constant BuildingCategoryDecoration (line 100) | BuildingCategoryDecoration
  constant BuildingCategorySpecial (line 101) | BuildingCategorySpecial
  type Position (line 142) | type Position struct
    method Distance (line 154) | func (p *Position) Distance(other *Position) float64 {
    method IsAdjacent (line 162) | func (p *Position) IsAdjacent(other *Position) bool {
    method Validate (line 170) | func (p *Position) Validate() error {
    method Clone (line 178) | func (p *Position) Clone() *Position {
  function NewPosition (line 149) | func NewPosition(x, y, z int32) *Position {
  type Size (line 183) | type Size struct
    method Volume (line 195) | func (s *Size) Volume() int32 {
    method Area (line 200) | func (s *Size) Area() int32 {
    method Validate (line 205) | func (s *Size) Validate() error {
    method IsValid (line 213) | func (s *Size) IsValid() bool {
    method Clone (line 218) | func (s *Size) Clone() *Size {
  function NewSize (line 190) | func NewSize(width, height, depth int32) *Size {
  type BoundingBox (line 225) | type BoundingBox struct
    method Contains (line 243) | func (bb *BoundingBox) Contains(pos *Position) bool {
    method Intersects (line 250) | func (bb *BoundingBox) Intersects(other *BoundingBox) bool {
    method Volume (line 257) | func (bb *BoundingBox) Volume() int32 {
  function NewBoundingBox (line 235) | func NewBoundingBox(minX, minY, minZ, maxX, maxY, maxZ int32) *BoundingB...
  type Orientation (line 262) | type Orientation
    method String (line 274) | func (o Orientation) String() string {
    method IsValid (line 294) | func (o Orientation) IsValid() bool {
    method Opposite (line 299) | func (o Orientation) Opposite() Orientation {
  constant OrientationNorth (line 265) | OrientationNorth Orientation = iota + 1
  constant OrientationEast (line 266) | OrientationEast
  constant OrientationSouth (line 267) | OrientationSouth
  constant OrientationWest (line 268) | OrientationWest
  constant OrientationUp (line 269) | OrientationUp
  constant OrientationDown (line 270) | OrientationDown
  type ResourceCost (line 321) | type ResourceCost struct
    method Validate (line 337) | func (rc *ResourceCost) Validate() error {
    method Clone (line 348) | func (rc *ResourceCost) Clone() *ResourceCost {
  function NewResourceCost (line 328) | func NewResourceCost(resourceType string, amount int64) *ResourceCost {
  type RequirementType (line 359) | type RequirementType
    method String (line 372) | func (rt RequirementType) String() string {
    method IsValid (line 394) | func (rt RequirementType) IsValid() bool {
  constant RequirementTypeLevel (line 362) | RequirementTypeLevel      RequirementType = iota + 1
  constant RequirementTypeResource (line 363) | RequirementTypeResource
  constant RequirementTypeBuilding (line 364) | RequirementTypeBuilding
  constant RequirementTypeTechnology (line 365) | RequirementTypeTechnology
  constant RequirementTypePopulation (line 366) | RequirementTypePopulation
  constant RequirementTypeTime (line 367) | RequirementTypeTime
  constant RequirementTypeCustom (line 368) | RequirementTypeCustom
  type Requirement (line 399) | type Requirement struct
    method IsMet (line 423) | func (r *Requirement) IsMet() bool {
    method SetMet (line 428) | func (r *Requirement) SetMet(met bool) {
    method Validate (line 433) | func (r *Requirement) Validate() error {
    method Clone (line 447) | func (r *Requirement) Clone() *Requirement {
  function NewRequirement (line 410) | func NewRequirement(reqType RequirementType, target string, value int64,...
  type EffectType (line 462) | type EffectType
    method String (line 478) | func (et EffectType) String() string {
    method IsValid (line 506) | func (et EffectType) IsValid() bool {
  constant EffectTypeProduction (line 465) | EffectTypeProduction EffectType = iota + 1
  constant EffectTypeDefense (line 466) | EffectTypeDefense
  constant EffectTypeEfficiency (line 467) | EffectTypeEfficiency
  constant EffectTypeCapacity (line 468) | EffectTypeCapacity
  constant EffectTypeSpeed (line 469) | EffectTypeSpeed
  constant EffectTypeCost (line 470) | EffectTypeCost
  constant EffectTypeHealth (line 471) | EffectTypeHealth
  constant EffectTypeDurability (line 472) | EffectTypeDurability
  constant EffectTypeRange (line 473) | EffectTypeRange
  constant EffectTypeCustom (line 474) | EffectTypeCustom
  type BuildingEffect (line 511) | type BuildingEffect struct
    method IsActive (line 543) | func (be *BuildingEffect) IsActive() bool {
    method SetDuration (line 561) | func (be *BuildingEffect) SetDuration(duration time.Duration) {
    method Start (line 571) | func (be *BuildingEffect) Start() {
    method Validate (line 582) | func (be *BuildingEffect) Validate() error {
    method Clone (line 593) | func (be *BuildingEffect) Clone() *BuildingEffect {
  function NewBuildingEffect (line 527) | func NewBuildingEffect(effectType EffectType, target string, value float...
  type ProductionType (line 631) | type ProductionType
    method String (line 642) | func (pt ProductionType) String() string {
    method IsValid (line 660) | func (pt ProductionType) IsValid() bool {
  constant ProductionTypeResource (line 634) | ProductionTypeResource ProductionType = iota + 1
  constant ProductionTypeItem (line 635) | ProductionTypeItem
  constant ProductionTypeUnit (line 636) | ProductionTypeUnit
  constant ProductionTypeService (line 637) | ProductionTypeService
  constant ProductionTypeCustom (line 638) | ProductionTypeCustom
  type ProductionInfo (line 665) | type ProductionInfo struct
    method AddOutput (line 699) | func (pi *ProductionInfo) AddOutput(output *ProductionOutput) {
    method AddInput (line 705) | func (pi *ProductionInfo) AddInput(input *ProductionInput) {
    method AddTask (line 711) | func (pi *ProductionInfo) AddTask(task *ProductionTask) {
    method StartNextTask (line 717) | func (pi *ProductionInfo) StartNextTask() *ProductionTask {
    method CompleteCurrentTask (line 731) | func (pi *ProductionInfo) CompleteCurrentTask() *ProductionTask {
    method Validate (line 744) | func (pi *ProductionInfo) Validate() error {
  function NewProductionInfo (line 681) | func NewProductionInfo(productionType ProductionType) *ProductionInfo {
  type ProductionOutput (line 761) | type ProductionOutput struct
  function NewProductionOutput (line 769) | func NewProductionOutput(resourceType string, amount int64, rate float64...
  type ProductionInput (line 779) | type ProductionInput struct
  function NewProductionInput (line 787) | func NewProductionInput(resourceType string, amount int64, rate float64)...
  type ProductionTask (line 797) | type ProductionTask struct
    method Start (line 863) | func (pt *ProductionTask) Start() {
    method Complete (line 871) | func (pt *ProductionTask) Complete() {
    method Cancel (line 880) | func (pt *ProductionTask) Cancel() {
    method UpdateProgress (line 886) | func (pt *ProductionTask) UpdateProgress(progress float64) {
  type ProductionTaskStatus (line 815) | type ProductionTaskStatus
    method String (line 826) | func (pts ProductionTaskStatus) String() string {
  constant ProductionTaskStatusPending (line 818) | ProductionTaskStatusPending    ProductionTaskStatus = iota + 1
  constant ProductionTaskStatusInProgress (line 819) | ProductionTaskStatusInProgress
  constant ProductionTaskStatusCompleted (line 820) | ProductionTaskStatusCompleted
  constant ProductionTaskStatusCancelled (line 821) | ProductionTaskStatusCancelled
  constant ProductionTaskStatusFailed (line 822) | ProductionTaskStatusFailed
  function NewProductionTask (line 844) | func NewProductionTask(taskType ProductionType, target string, quantity ...
  type StorageType (line 904) | type StorageType
    method String (line 919) | func (st StorageType) String() string {
    method IsValid (line 945) | func (st StorageType) IsValid() bool {
  constant StorageTypeGeneral (line 907) | StorageTypeGeneral  StorageType = iota + 1
  constant StorageTypeResource (line 908) | StorageTypeResource
  constant StorageTypeItem (line 909) | StorageTypeItem
  constant StorageTypeFood (line 910) | StorageTypeFood
  constant StorageTypeWeapon (line 911) | StorageTypeWeapon
  constant StorageTypeArmor (line 912) | StorageTypeArmor
  constant StorageTypeLiquid (line 913) | StorageTypeLiquid
  constant StorageTypeGas (line 914) | StorageTypeGas
  constant StorageTypeSpecial (line 915) | StorageTypeSpecial
  type StorageInfo (line 950) | type StorageInfo struct
    method GetAvailable (line 985) | func (si *StorageInfo) GetAvailable() int64 {
    method GetUsagePercentage (line 990) | func (si *StorageInfo) GetUsagePercentage() float64 {
    method IsFull (line 998) | func (si *StorageInfo) IsFull() bool {
    method CanStore (line 1003) | func (si *StorageInfo) CanStore(itemType string, quantity int64) bool {
    method AddItem (line 1026) | func (si *StorageInfo) AddItem(item *StorageItem) error {
    method RemoveItem (line 1050) | func (si *StorageInfo) RemoveItem(itemType string, quantity int64) err...
    method Validate (line 1075) | func (si *StorageInfo) Validate() error {
  function NewStorageInfo (line 966) | func NewStorageInfo(storageType StorageType, capacity int64) *StorageInfo {
  type StorageItem (line 1095) | type StorageItem struct
    method CanStack (line 1122) | func (si *StorageItem) CanStack(other *StorageItem) bool {
  function NewStorageItem (line 1107) | func NewStorageItem(itemType string, quantity int64) *StorageItem {
  type AccessRule (line 1130) | type AccessRule struct
  function NewAccessRule (line 1139) | func NewAccessRule(permission string) *AccessRule {
  type DamageType (line 1150) | type DamageType
    method String (line 1166) | func (dt DamageType) String() string {
    method IsValid (line 1194) | func (dt DamageType) IsValid() bool {
  constant DamageTypePhysical (line 1153) | DamageTypePhysical  DamageType = iota + 1
  constant DamageTypeFire (line 1154) | DamageTypeFire
  constant DamageTypeIce (line 1155) | DamageTypeIce
  constant DamageTypeLightning (line 1156) | DamageTypeLightning
  constant DamageTypePoison (line 1157) | DamageTypePoison
  constant DamageTypeAcid (line 1158) | DamageTypeAcid
  constant DamageTypeMagic (line 1159) | DamageTypeMagic
  constant DamageTypeHoly (line 1160) | DamageTypeHoly
  constant DamageTypeDark (line 1161) | DamageTypeDark
  constant DamageTypeCustom (line 1162) | DamageTypeCustom
  type DefenseInfo (line 1199) | type DefenseInfo struct
    method GetDefenseValue (line 1234) | func (di *DefenseInfo) GetDefenseValue(damageType DamageType) int32 {
    method AddResistance (line 1259) | func (di *DefenseInfo) AddResistance(damageType DamageType, value int3...
    method AddImmunity (line 1265) | func (di *DefenseInfo) AddImmunity(damageType DamageType) {
    method AddWeakness (line 1277) | func (di *DefenseInfo) AddWeakness(damageType DamageType) {
    method RegenerateShield (line 1289) | func (di *DefenseInfo) RegenerateShield() {
    method Validate (line 1300) | func (di *DefenseInfo) Validate() error {
  function NewDefenseInfo (line 1215) | func NewDefenseInfo() *DefenseInfo {
  type WorkerRole (line 1325) | type WorkerRole
    method String (line 1338) | func (wr WorkerRole) String() string {
    method IsValid (line 1360) | func (wr WorkerRole) IsValid() bool {
  constant WorkerRoleGeneral (line 1328) | WorkerRoleGeneral     WorkerRole = iota + 1
  constant WorkerRoleBuilder (line 1329) | WorkerRoleBuilder
  constant WorkerRoleMaintenance (line 1330) | WorkerRoleMaintenance
  constant WorkerRoleOperator (line 1331) | WorkerRoleOperator
  constant WorkerRoleGuard (line 1332) | WorkerRoleGuard
  constant WorkerRoleManager (line 1333) | WorkerRoleManager
  constant WorkerRoleSpecialist (line 1334) | WorkerRoleSpecialist
  type WorkerStatus (line 1365) | type WorkerStatus
    method String (line 1378) | func (ws WorkerStatus) String() string {
    method IsValid (line 1400) | func (ws WorkerStatus) IsValid() bool {
  constant WorkerStatusActive (line 1368) | WorkerStatusActive    WorkerStatus = iota + 1
  constant WorkerStatusIdle (line 1369) | WorkerStatusIdle
  constant WorkerStatusBusy (line 1370) | WorkerStatusBusy
  constant WorkerStatusResting (line 1371) | WorkerStatusResting
  constant WorkerStatusSick (line 1372) | WorkerStatusSick
  constant WorkerStatusOnLeave (line 1373) | WorkerStatusOnLeave
  constant WorkerStatusDismissed (line 1374) | WorkerStatusDismissed
  type WorkerInfo (line 1405) | type WorkerInfo struct
  function NewWorkerInfo (line 1419) | func NewWorkerInfo(workerID uint64, role WorkerRole) *WorkerInfo {
  type VisitorInfo (line 1436) | type VisitorInfo struct
    method Leave (line 1458) | func (vi *VisitorInfo) Leave() {
  function NewVisitorInfo (line 1446) | func NewVisitorInfo(visitorID uint64, purpose string) *VisitorInfo {
  type MaintenanceType (line 1467) | type MaintenanceType
    method String (line 1480) | func (mt MaintenanceType) String() string {
    method IsValid (line 1502) | func (mt MaintenanceType) IsValid() bool {
  constant MaintenanceTypeRoutine (line 1470) | MaintenanceTypeRoutine    MaintenanceType = iota + 1
  constant MaintenanceTypePreventive (line 1471) | MaintenanceTypePreventive
  constant MaintenanceTypeEmergency (line 1472) | MaintenanceTypeEmergency
  constant MaintenanceTypeRepair (line 1473) | MaintenanceTypeRepair
  constant MaintenanceTypeUpgrade (line 1474) | MaintenanceTypeUpgrade
  constant MaintenanceTypeCleaning (line 1475) | MaintenanceTypeCleaning
  constant MaintenanceTypeInspection (line 1476) | MaintenanceTypeInspection
  type MaintenanceInfo (line 1507) | type MaintenanceInfo struct
  function NewMaintenanceInfo (line 1518) | func NewMaintenanceInfo() *MaintenanceInfo {
  type MaintenanceRecord (line 1531) | type MaintenanceRecord struct
  function NewMaintenanceRecord (line 1540) | func NewMaintenanceRecord(maintenanceType MaintenanceType) *MaintenanceR...
  function abs (line 1553) | func abs(x int32) int32 {

FILE: internal/domain/character/actor.go
  type Actor (line 11) | type Actor struct
    method Name (line 111) | func (a *Actor) Name() string {
    method Level (line 118) | func (a *Actor) Level() int32 {
    method SetLevel (line 125) | func (a *Actor) SetLevel(level int32) {
    method HP (line 134) | func (a *Actor) HP() float32 {
    method MP (line 141) | func (a *Actor) MP() float32 {
    method Speed (line 148) | func (a *Actor) Speed() float32 {
    method ChangeHP (line 155) | func (a *Actor) ChangeHP(amount float32) {
    method ChangeMP (line 173) | func (a *Actor) ChangeMP(amount float32) {
    method IsDeath (line 191) | func (a *Actor) IsDeath() bool {
    method Revive (line 198) | func (a *Actor) Revive(ctx context.Context) error {
    method GetFlagState (line 210) | func (a *Actor) GetFlagState() FlagState {
    method AddFlagState (line 217) | func (a *Actor) AddFlagState(state FlagState) {
    method RemoveFlagState (line 232) | func (a *Actor) RemoveFlagState(state FlagState) {
    method ZeroFlagState (line 247) | func (a *Actor) ZeroFlagState() {
    method SetFlagStateExact (line 261) | func (a *Actor) SetFlagStateExact(state FlagState) {
    method OnHurt (line 275) | func (a *Actor) OnHurt(ctx context.Context, info *DamageInfo) error {
    method DamageSource (line 303) | func (a *Actor) DamageSource() *DamageInfo {
    method GetAttributeManager (line 312) | func (a *Actor) GetAttributeManager() *AttributeManager {
    method GetSkillManager (line 317) | func (a *Actor) GetSkillManager() *SkillManager {
    method GetBuffManager (line 322) | func (a *Actor) GetBuffManager() *BuffManager {
    method GetSpell (line 327) | func (a *Actor) GetSpell() *Spell {
    method SetEventPublisher (line 339) | func (a *Actor) SetEventPublisher(p EventPublisher) { a.publisher = p }
    method GetEventPublisher (line 342) | func (a *Actor) GetEventPublisher() EventPublisher { return a.publisher }
    method Start (line 347) | func (a *Actor) Start(ctx context.Context) error {
    method Update (line 378) | func (a *Actor) Update(ctx context.Context, deltaTime float32) error {
    method String (line 407) | func (a *Actor) String() string {
  type DamageInfo (line 42) | type DamageInfo struct
  type AttackerInfo (line 52) | type AttackerInfo struct
  type DamageType (line 60) | type DamageType
  constant DamageTypeUnknown (line 63) | DamageTypeUnknown  DamageType = 0
  constant DamageTypePhysical (line 64) | DamageTypePhysical DamageType = 1
  constant DamageTypeMagical (line 65) | DamageTypeMagical  DamageType = 2
  constant DamageTypeReal (line 66) | DamageTypeReal     DamageType = 3
  constant DamageTypeHeal (line 67) | DamageTypeHeal     DamageType = 4
  type AttackerType (line 71) | type AttackerType
  constant AttackerTypeSkill (line 74) | AttackerTypeSkill       AttackerType = 0
  constant AttackerTypeBuff (line 75) | AttackerTypeBuff        AttackerType = 1
  constant AttackerTypeNormal (line 76) | AttackerTypeNormal      AttackerType = 2
  constant AttackerTypeEnvironment (line 77) | AttackerTypeEnvironment AttackerType = 3
  function NewActor (line 81) | func NewActor(
  type EventPublisher (line 334) | type EventPublisher interface

FILE: internal/domain/character/buff_attributes_test.go
  function TestBuffAttributeModifiersAffectFinalsAndSpeed (line 8) | func TestBuffAttributeModifiersAffectFinalsAndSpeed(t *testing.T) {

FILE: internal/domain/character/buff_flags_test.go
  function TestBuffFlagsAffectActorState (line 8) | func TestBuffFlagsAffectActorState(t *testing.T) {

FILE: internal/domain/character/entity.go
  type Entity (line 10) | type Entity struct
    method ID (line 58) | func (e *Entity) ID() EntityID {
    method Type (line 65) | func (e *Entity) Type() EntityType {
    method UnitID (line 72) | func (e *Entity) UnitID() int32 {
    method Position (line 81) | func (e *Entity) Position() Vector3 {
    method Position2D (line 88) | func (e *Entity) Position2D() Vector2 {
    method Direction (line 95) | func (e *Entity) Direction() Vector3 {
    method GetTransform (line 102) | func (e *Entity) GetTransform() Transform {
    method SetPosition (line 109) | func (e *Entity) SetPosition(pos Vector3) {
    method SetDirection (line 117) | func (e *Entity) SetDirection(dir Vector3) {
    method SetTransform (line 124) | func (e *Entity) SetTransform(transform Transform) {
    method IsValid (line 134) | func (e *Entity) IsValid() bool {
    method Invalidate (line 141) | func (e *Entity) Invalidate() {
    method SetMap (line 150) | func (e *Entity) SetMap(mapRef interface{}) {
    method GetMap (line 157) | func (e *Entity) GetMap() interface{} {
    method SetAOIEntity (line 166) | func (e *Entity) SetAOIEntity(aoiEntity interface{}) {
    method GetAOIEntity (line 173) | func (e *Entity) GetAOIEntity() interface{} {
    method Start (line 182) | func (e *Entity) Start(ctx context.Context) error {
    method Update (line 188) | func (e *Entity) Update(ctx context.Context, deltaTime float32) error {
    method Destroy (line 194) | func (e *Entity) Destroy(ctx context.Context) error {
    method DistanceTo (line 202) | func (e *Entity) DistanceTo(other *Entity) float32 {
    method String (line 211) | func (e *Entity) String() string {
  function NewEntity (line 35) | func NewEntity(

FILE: internal/domain/character/events.go
  type DomainEvent (line 8) | type DomainEvent interface
  type BaseDomainEvent (line 15) | type BaseDomainEvent struct
    method EventName (line 29) | func (e BaseDomainEvent) EventName() string {
    method OccurredOn (line 33) | func (e BaseDomainEvent) OccurredOn() time.Time {
    method AggregateID (line 37) | func (e BaseDomainEvent) AggregateID() interface{} {
  function NewBaseDomainEvent (line 21) | func NewBaseDomainEvent(eventName string, aggregateID interface{}) BaseD...
  type EntityCreatedEvent (line 44) | type EntityCreatedEvent struct
  function NewEntityCreatedEvent (line 50) | func NewEntityCreatedEvent(entityID EntityID, entityType EntityType) *En...
  type EntityDestroyedEvent (line 59) | type EntityDestroyedEvent struct
  function NewEntityDestroyedEvent (line 65) | func NewEntityDestroyedEvent(entityID EntityID, entityType EntityType) *...
  type PlayerCreatedEvent (line 76) | type PlayerCreatedEvent struct
  function NewPlayerCreatedEvent (line 84) | func NewPlayerCreatedEvent(characterID, userID int64, name string, level...
  type PlayerLevelUpEvent (line 95) | type PlayerLevelUpEvent struct
  function NewPlayerLevelUpEvent (line 102) | func NewPlayerLevelUpEvent(characterID int64, oldLevel, newLevel int32) ...
  type PlayerDeathEvent (line 112) | type PlayerDeathEvent struct
  function NewPlayerDeathEvent (line 119) | func NewPlayerDeathEvent(characterID int64, killerID EntityID, position ...
  type DamageDealtEvent (line 131) | type DamageDealtEvent struct
  function NewDamageDealtEvent (line 140) | func NewDamageDealtEvent(attackerID, targetID EntityID, amount int32, da...
  type SkillCastEvent (line 152) | type SkillCastEvent struct
  function NewSkillCastEvent (line 159) | func NewSkillCastEvent(casterID EntityID, skillID int32, targetID Entity...
  type BuffAddedEvent (line 169) | type BuffAddedEvent struct
  function NewBuffAddedEvent (line 177) | func NewBuffAddedEvent(targetID EntityID, buffID int32, casterID EntityI...
  type BuffRemovedEvent (line 188) | type BuffRemovedEvent struct
  function NewBuffRemovedEvent (line 194) | func NewBuffRemovedEvent(targetID EntityID, buffID int32) *BuffRemovedEv...
  type MonsterDeathEvent (line 205) | type MonsterDeathEvent struct
  function NewMonsterDeathEvent (line 214) | func NewMonsterDeathEvent(monsterID, killerID EntityID, position Vector3...

FILE: internal/domain/character/events_test.go
  type fakePublisher (line 9) | type fakePublisher struct
    method Publish (line 14) | func (f *fakePublisher) Publish(e DomainEvent) {
    method CountByName (line 19) | func (f *fakePublisher) CountByName(name string) int {
  function TestDamageDealtEventIsPublished (line 31) | func TestDamageDealtEventIsPublished(t *testing.T) {

FILE: internal/domain/character/monster.go
  type Monster (line 9) | type Monster struct
    method InitPosition (line 70) | func (m *Monster) InitPosition() Vector3 {
    method GetSpawnDefine (line 75) | func (m *Monster) GetSpawnDefine() *SpawnDefine {
    method GetAI (line 80) | func (m *Monster) GetAI() AI {
    method Start (line 85) | func (m *Monster) Start(ctx context.Context) error {
    method Update (line 102) | func (m *Monster) Update(ctx context.Context, deltaTime float32) error {
    method Revive (line 119) | func (m *Monster) Revive(ctx context.Context) error {
    method String (line 135) | func (m *Monster) String() string {
  type SpawnDefine (line 23) | type SpawnDefine struct
  type AI (line 31) | type AI interface
  function NewMonster (line 38) | func NewMonster(
  type NPC (line 142) | type NPC struct
    method NPCID (line 185) | func (n *NPC) NPCID() int32 {
    method Name (line 190) | func (n *NPC) Name() string {
    method HasFunction (line 195) | func (n *NPC) HasFunction(function NPCFunction) bool {
    method Functions (line 205) | func (n *NPC) Functions() []NPCFunction {
    method String (line 210) | func (n *NPC) String() string {
  type NPCFunction (line 154) | type NPCFunction
  constant NPCFunctionDialogue (line 157) | NPCFunctionDialogue NPCFunction = 0
  constant NPCFunctionShop (line 158) | NPCFunctionShop     NPCFunction = 1
  constant NPCFunctionQuest (line 159) | NPCFunctionQuest    NPCFunction = 2
  constant NPCFunctionTeleport (line 160) | NPCFunctionTeleport NPCFunction = 3
  constant NPCFunctionCraft (line 161) | NPCFunctionCraft    NPCFunction = 4
  function NewNPC (line 165) | func NewNPC(
  type Missile (line 217) | type Missile struct
    method Update (line 258) | func (m *Missile) Update(ctx context.Context, deltaTime float32) error {
    method String (line 288) | func (m *Missile) String() string {
  function NewMissile (line 235) | func NewMissile(

FILE: internal/domain/character/player.go
  type Player (line 9) | type Player struct
    method UserID (line 71) | func (p *Player) UserID() int64 {
    method CharacterID (line 76) | func (p *Player) CharacterID() int64 {
    method Exp (line 83) | func (p *Player) Exp() int32 {
    method Gold (line 88) | func (p *Player) Gold() int64 {
    method GetName (line 93) | func (p *Player) GetName() string {
    method GetRace (line 98) | func (p *Player) GetRace() int32 {
    method GetClass (line 105) | func (p *Player) GetClass() int32 {
    method GetExp (line 110) | func (p *Player) GetExp() int64 {
    method GetGold (line 115) | func (p *Player) GetGold() int64 {
    method AddExp (line 120) | func (p *Player) AddExp(amount int64) {
    method AddGold (line 130) | func (p *Player) AddGold(amount int64) {
    method CanLevelUp (line 138) | func (p *Player) CanLevelUp() bool {
    method LevelUp (line 150) | func (p *Player) LevelUp() {
    method ChangeExp (line 175) | func (p *Player) ChangeExp(amount int32) {
    method ChangeGold (line 188) | func (p *Player) ChangeGold(amount int64) {
    method GetInventory (line 201) | func (p *Player) GetInventory() *Inventory {
    method GetTaskManager (line 206) | func (p *Player) GetTaskManager() *TaskManager {
    method GetDialogueManager (line 211) | func (p *Player) GetDialogueManager() *DialogueManager {
    method SetInteractingNPC (line 218) | func (p *Player) SetInteractingNPC(npc *NPC) {
    method GetInteractingNPC (line 223) | func (p *Player) GetInteractingNPC() *NPC {
    method Start (line 230) | func (p *Player) Start(ctx context.Context) error {
    method Revive (line 250) | func (p *Player) Revive(ctx context.Context) error {
    method String (line 263) | func (p *Player) String() string {
  function NewPlayer (line 34) | func NewPlayer(
  type Inventory (line 271) | type Inventory struct
    method Start (line 279) | func (i *Inventory) Start(ctx context.Context) error {
  function NewInventory (line 275) | func NewInventory(owner *Player) *Inventory {
  type TaskManager (line 284) | type TaskManager struct
    method Start (line 292) | func (tm *TaskManager) Start(ctx context.Context) error {
  function NewTaskManager (line 288) | func NewTaskManager(owner *Player) *TaskManager {
  type DialogueManager (line 297) | type DialogueManager struct
  function NewDialogueManager (line 301) | func NewDialogueManager(owner *Player) *DialogueManager {

FILE: internal/domain/character/repository.go
  type EntityRepository (line 8) | type EntityRepository interface
  type PlayerRepository (line 20) | type PlayerRepository interface
  type MonsterRepository (line 38) | type MonsterRepository interface
  type NPCRepository (line 50) | type NPCRepository interface
  type UnitDefineRepository (line 62) | type UnitDefineRepository interface
  type UnitDefine (line 71) | type UnitDefine struct

FILE: internal/domain/character/skill_damage_test.go
  function TestSkillDamageReducesTargetHP (line 8) | func TestSkillDamageReducesTargetHP(t *testing.T) {

FILE: internal/domain/character/subsystems.go
  type AttributeManager (line 9) | type AttributeManager struct
    method Start (line 67) | func (am *AttributeManager) Start(ctx context.Context) error {
    method Base (line 94) | func (am *AttributeManager) Base() *Attributes {
    method Final (line 101) | func (am *AttributeManager) Final() *Attributes {
    method Recalculate (line 108) | func (am *AttributeManager) Recalculate() {
    method SetBase (line 172) | func (am *AttributeManager) SetBase(attrs Attributes) {
    method ModifyBase (line 180) | func (am *AttributeManager) ModifyBase(mod func(a *Attributes)) {
  type Attributes (line 18) | type Attributes struct
  type AttributeModifier (line 40) | type AttributeModifier struct
  function NewAttributeManager (line 58) | func NewAttributeManager(owner *Actor) *AttributeManager {
  type SkillManager (line 190) | type SkillManager struct
    method Start (line 206) | func (sm *SkillManager) Start(ctx context.Context) error {
    method Update (line 212) | func (sm *SkillManager) Update(ctx context.Context, deltaTime float32)...
    method GetSkill (line 226) | func (sm *SkillManager) GetSkill(skillID int32) *Skill {
    method AddSkill (line 233) | func (sm *SkillManager) AddSkill(skill *Skill) {
  function NewSkillManager (line 198) | func NewSkillManager(owner *Actor) *SkillManager {
  type Skill (line 242) | type Skill struct
    method ID (line 289) | func (s *Skill) ID() int32 {
    method SetDamage (line 294) | func (s *Skill) SetDamage(base, scaleAD, scaleAP float32, dmgType Dama...
    method Update (line 304) | func (s *Skill) Update(ctx context.Context, deltaTime float32) error {
    method State (line 338) | func (s *Skill) State() SkillState {
    method SetTimings (line 345) | func (s *Skill) SetTimings(cast, active, cooldown float32) {
    method StartCast (line 354) | func (s *Skill) StartCast() bool {
  type SkillState (line 265) | type SkillState
  constant SkillStateIdle (line 268) | SkillStateIdle     SkillState = 0
  constant SkillStateReady (line 269) | SkillStateReady    SkillState = 1
  constant SkillStateIntonate (line 270) | SkillStateIntonate SkillState = 2
  constant SkillStateActive (line 271) | SkillStateActive   SkillState = 3
  constant SkillStateCooling (line 272) | SkillStateCooling  SkillState = 4
  function NewSkill (line 276) | func NewSkill(id int32, owner *Actor) *Skill {
  type BuffManager (line 384) | type BuffManager struct
    method Start (line 400) | func (bm *BuffManager) Start(ctx context.Context) error {
    method Update (line 405) | func (bm *BuffManager) Update(ctx context.Context, deltaTime float32) ...
    method AddBuff (line 439) | func (bm *BuffManager) AddBuff(buff *Buff) {
    method RemoveBuff (line 452) | func (bm *BuffManager) RemoveBuff(buff *Buff) {
    method GetBuffByID (line 471) | func (bm *BuffManager) GetBuffByID(id int32) *Buff {
    method RemoveBuffByID (line 483) | func (bm *BuffManager) RemoveBuffByID(id int32) {
    method CollectModifiers (line 499) | func (bm *BuffManager) CollectModifiers() []AttributeModifier {
    method collectFlags (line 510) | func (bm *BuffManager) collectFlags() FlagState {
    method refreshActorFlags (line 519) | func (bm *BuffManager) refreshActorFlags() {
  function NewBuffManager (line 392) | func NewBuffManager(owner *Actor) *BuffManager {
  type Buff (line 530) | type Buff struct
    method Update (line 555) | func (b *Buff) Update(ctx context.Context, deltaTime float32) error {
    method IsExpired (line 561) | func (b *Buff) IsExpired() bool {
    method SetModifier (line 566) | func (b *Buff) SetModifier(mod AttributeModifier) { b.modifier = mod }
    method Modifier (line 569) | func (b *Buff) Modifier() AttributeModifier { return b.modifier }
    method SetFlagAdd (line 572) | func (b *Buff) SetFlagAdd(flags FlagState) { b.addFlags = flags }
    method FlagAdd (line 575) | func (b *Buff) FlagAdd() FlagState { return b.addFlags }
  function NewBuff (line 544) | func NewBuff(id int32, owner, caster *Actor, duration float32) *Buff {
  type Spell (line 580) | type Spell struct
    method CurrentSkill (line 596) | func (s *Spell) CurrentSkill() *Skill {
    method SetCurrentSkill (line 603) | func (s *Spell) SetCurrentSkill(skill *Skill) {
    method Cast (line 610) | func (s *Spell) Cast(skillID int32, target *Actor) bool {
    method ApplySkillEffect (line 633) | func (s *Spell) ApplySkillEffect(skill *Skill) {
    method SetTarget (line 686) | func (s *Spell) SetTarget(target *Actor) {
    method Target (line 693) | func (s *Spell) Target() *Actor {
  function NewSpell (line 589) | func NewSpell(owner *Actor) *Spell {
  function computeDamage (line 656) | func computeDamage(attacker *Actor, defender *Actor, skill *Skill) float...

FILE: internal/domain/character/subsystems_test.go
  function TestSkillFSMTransitions (line 8) | func TestSkillFSMTransitions(t *testing.T) {
  function TestAttributesInitAndRegen (line 50) | func TestAttributesInitAndRegen(t *testing.T) {

FILE: internal/domain/character/value_objects.go
  type Vector3 (line 8) | type Vector3 struct
    method Zero (line 20) | func (v Vector3) Zero() Vector3 {
    method ToVector2 (line 25) | func (v Vector3) ToVector2() Vector2 {
    method Distance (line 30) | func (v Vector3) Distance(other Vector3) float32 {
  function NewVector3 (line 15) | func NewVector3(x, y, z float32) Vector3 {
  type Vector2 (line 38) | type Vector2 struct
    method ToVector3 (line 49) | func (v Vector2) ToVector3() Vector3 {
    method Distance (line 54) | func (v Vector2) Distance(other Vector2) float32 {
    method Normalized (line 61) | func (v Vector2) Normalized() Vector2 {
    method Add (line 70) | func (v Vector2) Add(other Vector2) Vector2 {
    method Sub (line 75) | func (v Vector2) Sub(other Vector2) Vector2 {
    method Mul (line 80) | func (v Vector2) Mul(scalar float32) Vector2 {
  function NewVector2 (line 44) | func NewVector2(x, y float32) Vector2 {
  type EntityID (line 85) | type EntityID
    method IsValid (line 88) | func (id EntityID) IsValid() bool {
    method Int32 (line 93) | func (id EntityID) Int32() int32 {
  type EntityType (line 98) | type EntityType
    method String (line 111) | func (t EntityType) String() string {
  constant EntityTypePlayer (line 101) | EntityTypePlayer      EntityType = 0
  constant EntityTypeMonster (line 102) | EntityTypeMonster     EntityType = 1
  constant EntityTypeNPC (line 103) | EntityTypeNPC         EntityType = 2
  constant EntityTypeMissile (line 104) | EntityTypeMissile     EntityType = 3
  constant EntityTypeDroppedItem (line 105) | EntityTypeDroppedItem EntityType = 4
  constant EntityTypePet (line 106) | EntityTypePet         EntityType = 5
  constant EntityTypeSummon (line 107) | EntityTypeSummon      EntityType = 6
  type AnimationState (line 133) | type AnimationState
  constant AnimationStateIdle (line 136) | AnimationStateIdle  AnimationState = 0
  constant AnimationStateMove (line 137) | AnimationStateMove  AnimationState = 1
  constant AnimationStateSkill (line 138) | AnimationStateSkill AnimationState = 2
  constant AnimationStateHurt (line 139) | AnimationStateHurt  AnimationState = 3
  constant AnimationStateDeath (line 140) | AnimationStateDeath AnimationState = 4
  constant AnimationStateJump (line 141) | AnimationStateJump  AnimationState = 5
  constant AnimationStateFall (line 142) | AnimationStateFall  AnimationState = 6
  type FlagState (line 146) | type FlagState
    method HasFlag (line 160) | func (f FlagState) HasFlag(flag FlagState) bool {
    method AddFlag (line 165) | func (f FlagState) AddFlag(flag FlagState) FlagState {
    method RemoveFlag (line 170) | func (f FlagState) RemoveFlag(flag FlagState) FlagState {
  constant FlagStateZero (line 149) | FlagStateZero       FlagState = 0
  constant FlagStateStun (line 150) | FlagStateStun       FlagState = 1
  constant FlagStateRoot (line 151) | FlagStateRoot       FlagState = 2
  constant FlagStateSilence (line 152) | FlagStateSilence    FlagState = 4
  constant FlagStateInvincible (line 153) | FlagStateInvincible FlagState = 8
  constant FlagStateInvisible (line 154) | FlagStateInvisible  FlagState = 16
  constant FlagStateDisarm (line 155) | FlagStateDisarm     FlagState = 32
  constant FlagStateSlow (line 156) | FlagStateSlow       FlagState = 64
  type Transform (line 175) | type Transform struct
  function NewTransform (line 181) | func NewTransform(pos, dir Vector3) Transform {

FILE: internal/domain/dialogue/dialogue_manager.go
  type DialogueType (line 9) | type DialogueType
  constant DialogueTypeNormal (line 12) | DialogueTypeNormal DialogueType = 0
  constant DialogueTypeQuest (line 13) | DialogueTypeQuest  DialogueType = 1
  constant DialogueTypeShop (line 14) | DialogueTypeShop   DialogueType = 2
  type DialogueAction (line 18) | type DialogueAction
  constant DialogueActionNone (line 21) | DialogueActionNone        DialogueAction = 0
  constant DialogueActionAcceptQuest (line 22) | DialogueActionAcceptQuest DialogueAction = 1
  constant DialogueActionSubmitQuest (line 23) | DialogueActionSubmitQuest DialogueAction = 2
  constant DialogueActionOpenShop (line 24) | DialogueActionOpenShop    DialogueAction = 3
  type DialogueNode (line 28) | type DialogueNode struct
  type DialogueOption (line 35) | type DialogueOption struct
  type DialogueManager (line 43) | type DialogueManager struct
    method StartDialogue (line 59) | func (dm *DialogueManager) StartDialogue(npcID int32, dialogueID int32...
    method SelectOption (line 78) | func (dm *DialogueManager) SelectOption(optionIndex int32) (*DialogueN...
    method EndDialogue (line 111) | func (dm *DialogueManager) EndDialogue() {
    method GetCurrentNode (line 120) | func (dm *DialogueManager) GetCurrentNode() *DialogueNode {
    method GetCurrentNPCID (line 127) | func (dm *DialogueManager) GetCurrentNPCID() int32 {
  function NewDialogueManager (line 52) | func NewDialogueManager(ownerID int64) *DialogueManager {
  type ShopItem (line 134) | type ShopItem struct
  type Shop (line 141) | type Shop struct
  type ShopManager (line 148) | type ShopManager struct
    method GetShop (line 162) | func (sm *ShopManager) GetShop(shopID int32) *Shop {
    method Buy (line 169) | func (sm *ShopManager) Buy(shopID int32, itemDefineID int32, count int...
    method Sell (line 199) | func (sm *ShopManager) Sell(itemDefineID int32, count int32) error {
  function NewShopManager (line 155) | func NewShopManager() *ShopManager {

FILE: internal/domain/events/domain_event.go
  type DomainEvent (line 10) | type DomainEvent interface
  type BaseDomainEvent (line 20) | type BaseDomainEvent struct
    method GetEventType (line 40) | func (e *BaseDomainEvent) GetEventType() string {
    method GetAggregateID (line 45) | func (e *BaseDomainEvent) GetAggregateID() string {
    method GetVersion (line 50) | func (e *BaseDomainEvent) GetVersion() int64 {
    method GetOccurredAt (line 55) | func (e *BaseDomainEvent) GetOccurredAt() time.Time {
    method GetData (line 60) | func (e *BaseDomainEvent) GetData() interface{} {
    method ToJSON (line 65) | func (e *BaseDomainEvent) ToJSON() ([]byte, error) {
  function NewBaseDomainEvent (line 29) | func NewBaseDomainEvent(eventType, aggregateID string, version int64, da...
  constant EventTypePlayerCreated (line 71) | EventTypePlayerCreated   = "player.created"
  constant EventTypePlayerLoggedIn (line 72) | EventTypePlayerLoggedIn  = "player.logged_in"
  constant EventTypePlayerLoggedOut (line 73) | EventTypePlayerLoggedOut = "player.logged_out"
  constant EventTypePlayerMoved (line 74) | EventTypePlayerMoved     = "player.moved"
  constant EventTypePlayerLeveledUp (line 75) | EventTypePlayerLeveledUp = "player.leveled_up"
  constant EventTypePlayerDied (line 76) | EventTypePlayerDied      = "player.died"
  constant EventTypePlayerHealed (line 77) | EventTypePlayerHealed    = "player.healed"
  constant EventTypePlayerGainedExp (line 78) | EventTypePlayerGainedExp = "player.gained_exp"
  constant EventTypeBattleCreated (line 83) | EventTypeBattleCreated        = "battle.created"
  constant EventTypeBattleStarted (line 84) | EventTypeBattleStarted        = "battle.started"
  constant EventTypeBattleFinished (line 85) | EventTypeBattleFinished       = "battle.finished"
  constant EventTypeBattleCancelled (line 86) | EventTypeBattleCancelled      = "battle.cancelled"
  constant EventTypePlayerJoinedBattle (line 87) | EventTypePlayerJoinedBattle   = "battle.player_joined"
  constant EventTypePlayerLeftBattle (line 88) | EventTypePlayerLeftBattle     = "battle.player_left"
  constant EventTypeBattleActionExecuted (line 89) | EventTypeBattleActionExecuted = "battle.action_executed"
  type PlayerCreatedEvent (line 93) | type PlayerCreatedEvent struct
  function NewPlayerCreatedEvent (line 101) | func NewPlayerCreatedEvent(playerID, playerName string, level int) *Play...
  type PlayerLoggedInEvent (line 112) | type PlayerLoggedInEvent struct
  function NewPlayerLoggedInEvent (line 118) | func NewPlayerLoggedInEvent(playerID string) *PlayerLoggedInEvent {
  type PlayerLoggedOutEvent (line 127) | type PlayerLoggedOutEvent struct
  function NewPlayerLoggedOutEvent (line 133) | func NewPlayerLoggedOutEvent(playerID string) *PlayerLoggedOutEvent {
  type PlayerMovedEvent (line 142) | type PlayerMovedEvent struct
  function NewPlayerMovedEvent (line 151) | func NewPlayerMovedEvent(playerID string, x, y, z float64) *PlayerMovedE...
  type PlayerLeveledUpEvent (line 163) | type PlayerLeveledUpEvent struct
  function NewPlayerLeveledUpEvent (line 171) | func NewPlayerLeveledUpEvent(playerID string, oldLevel, newLevel int) *P...
  type BattleCreatedEvent (line 182) | type BattleCreatedEvent struct
  function NewBattleCreatedEvent (line 190) | func NewBattleCreatedEvent(battleID, battleType, creatorID string) *Batt...
  type BattleStartedEvent (line 201) | type BattleStartedEvent struct
  function NewBattleStartedEvent (line 207) | func NewBattleStartedEvent(battleID string) *BattleStartedEvent {
  type BattleFinishedEvent (line 216) | type BattleFinishedEvent struct
  function NewBattleFinishedEvent (line 224) | func NewBattleFinishedEvent(battleID string, winnerID *string, duration ...

FILE: internal/domain/inventory/dressup/aggregate.go
  type DressupAggregate (line 9) | type DressupAggregate struct
    method GetPlayerID (line 95) | func (d *DressupAggregate) GetPlayerID() string {
    method AddOutfit (line 100) | func (d *DressupAggregate) AddOutfit(outfit *Outfit) error {
    method EquipOutfit (line 111) | func (d *DressupAggregate) EquipOutfit(outfitID string, slot OutfitSlo...
    method UnequipOutfit (line 127) | func (d *DressupAggregate) UnequipOutfit(slot OutfitSlot) error {
    method GetCurrentSet (line 134) | func (d *DressupAggregate) GetCurrentSet() *OutfitSet {
    method GetOutfits (line 139) | func (d *DressupAggregate) GetOutfits() map[string]*Outfit {
    method updateVersion (line 144) | func (d *DressupAggregate) updateVersion() {
    method GetVersion (line 150) | func (d *DressupAggregate) GetVersion() int {
    method GetUpdatedAt (line 155) | func (d *DressupAggregate) GetUpdatedAt() time.Time {
    method SaveOutfitSet (line 160) | func (d *DressupAggregate) SaveOutfitSet(name string) error {
    method LoadOutfitSet (line 173) | func (d *DressupAggregate) LoadOutfitSet(name string) error {
    method DeleteOutfitSet (line 198) | func (d *DressupAggregate) DeleteOutfitSet(name string) error {
    method GetSavedSets (line 209) | func (d *DressupAggregate) GetSavedSets() map[string]*OutfitSet {
    method AddFashionSet (line 214) | func (d *DressupAggregate) AddFashionSet(fashionSet *FashionSet) error {
    method GetFashionSets (line 225) | func (d *DressupAggregate) GetFashionSets() map[string]*FashionSet {
    method GetFashionSet (line 230) | func (d *DressupAggregate) GetFashionSet(setID string) *FashionSet {
    method UnlockDyeColor (line 235) | func (d *DressupAggregate) UnlockDyeColor(color *DyeColor) error {
    method GetDyeColors (line 247) | func (d *DressupAggregate) GetDyeColors() map[string]*DyeColor {
    method GetUnlockedDyeColors (line 252) | func (d *DressupAggregate) GetUnlockedDyeColors() []*DyeColor {
    method DyeOutfit (line 263) | func (d *DressupAggregate) DyeOutfit(outfitID, part, colorID string) e...
    method AddStyle (line 280) | func (d *DressupAggregate) AddStyle(style *DressupStyle) error {
    method SetCurrentStyle (line 291) | func (d *DressupAggregate) SetCurrentStyle(styleID string) error {
    method GetCurrentStyle (line 304) | func (d *DressupAggregate) GetCurrentStyle() string {
    method GetStyles (line 309) | func (d *DressupAggregate) GetStyles() map[string]*DressupStyle {
    method GetPreferences (line 314) | func (d *DressupAggregate) GetPreferences() *DressupPreferences {
    method UpdatePreferences (line 319) | func (d *DressupAggregate) UpdatePreferences(preferences *DressupPrefe...
    method GetStatistics (line 325) | func (d *DressupAggregate) GetStatistics() *DressupStatistics {
    method UpdateStatistics (line 330) | func (d *DressupAggregate) UpdateStatistics() {
    method FilterOutfits (line 358) | func (d *DressupAggregate) FilterOutfits(filter *OutfitFilter) []*Outf...
    method matchesFilter (line 371) | func (d *DressupAggregate) matchesFilter(outfit *Outfit, filter *Outfi...
    method containsIgnoreCase (line 447) | func (d *DressupAggregate) containsIgnoreCase(str, substr string) bool {
    method GetRecommendedOutfits (line 453) | func (d *DressupAggregate) GetRecommendedOutfits(slot OutfitSlot, limi...
    method AutoEquipBest (line 480) | func (d *DressupAggregate) AutoEquipBest() error {
    method GetTotalPower (line 508) | func (d *DressupAggregate) GetTotalPower() int {
    method GetTotalAttributes (line 513) | func (d *DressupAggregate) GetTotalAttributes() map[string]int {
    method CanUpgradeAnyOutfit (line 518) | func (d *DressupAggregate) CanUpgradeAnyOutfit() bool {
    method CanEnhanceAnyOutfit (line 528) | func (d *DressupAggregate) CanEnhanceAnyOutfit() bool {
    method GetOutfitsBySet (line 538) | func (d *DressupAggregate) GetOutfitsBySet(setID string) []*Outfit {
    method GetSetCompletionRate (line 549) | func (d *DressupAggregate) GetSetCompletionRate(setID string) float64 {
  type DressupPreferences (line 25) | type DressupPreferences struct
  type DressupStatistics (line 35) | type DressupStatistics struct
  function NewDressupAggregate (line 49) | func NewDressupAggregate(playerID string) *DressupAggregate {
  function NewDressupPreferences (line 67) | func NewDressupPreferences() *DressupPreferences {
  function NewDressupStatistics (line 79) | func NewDressupStatistics() *DressupStatistics {

FILE: internal/domain/inventory/dressup/entity.go
  type Outfit (line 10) | type Outfit struct
    method GetID (line 68) | func (o *Outfit) GetID() string {
    method GetName (line 73) | func (o *Outfit) GetName() string {
    method GetType (line 78) | func (o *Outfit) GetType() OutfitType {
    method GetRarity (line 83) | func (o *Outfit) GetRarity() Rarity {
    method AddAttribute (line 88) | func (o *Outfit) AddAttribute(attr string, value int) {
    method GetAttributes (line 93) | func (o *Outfit) GetAttributes() map[string]int {
    method AddSlot (line 98) | func (o *Outfit) AddSlot(slot OutfitSlot) {
    method CanEquipToSlot (line 103) | func (o *Outfit) CanEquipToSlot(slot OutfitSlot) bool {
    method Lock (line 113) | func (o *Outfit) Lock() {
    method Unlock (line 118) | func (o *Outfit) Unlock() {
    method IsLocked (line 123) | func (o *Outfit) IsLocked() bool {
    method GetObtainedAt (line 128) | func (o *Outfit) GetObtainedAt() time.Time {
    method GetDescription (line 133) | func (o *Outfit) GetDescription() string {
    method SetDescription (line 138) | func (o *Outfit) SetDescription(description string) {
    method GetQuality (line 143) | func (o *Outfit) GetQuality() OutfitQuality {
    method SetQuality (line 148) | func (o *Outfit) SetQuality(quality OutfitQuality) {
    method GetSource (line 153) | func (o *Outfit) GetSource() OutfitSource {
    method SetSource (line 158) | func (o *Outfit) SetSource(source OutfitSource) {
    method IsEquipped (line 163) | func (o *Outfit) IsEquipped() bool {
    method SetEquipped (line 168) | func (o *Outfit) SetEquipped(equipped bool) {
    method GetLevel (line 178) | func (o *Outfit) GetLevel() int {
    method GetExp (line 183) | func (o *Outfit) GetExp() int {
    method GetMaxExp (line 188) | func (o *Outfit) GetMaxExp() int {
    method AddExp (line 193) | func (o *Outfit) AddExp(exp int) bool {
    method calculateMaxExp (line 209) | func (o *Outfit) calculateMaxExp(level int) int {
    method GetTags (line 214) | func (o *Outfit) GetTags() []string {
    method AddTag (line 219) | func (o *Outfit) AddTag(tag string) {
    method RemoveTag (line 230) | func (o *Outfit) RemoveTag(tag string) {
    method GetSetID (line 240) | func (o *Outfit) GetSetID() string {
    method SetSetID (line 245) | func (o *Outfit) SetSetID(setID string) {
    method GetAppearance (line 250) | func (o *Outfit) GetAppearance() *AppearanceConfig {
    method SetAppearance (line 255) | func (o *Outfit) SetAppearance(appearance *AppearanceConfig) {
    method GetDyeColors (line 260) | func (o *Outfit) GetDyeColors() map[string]*DyeColor {
    method SetDyeColor (line 265) | func (o *Outfit) SetDyeColor(part string, color *DyeColor) {
    method RemoveDyeColor (line 270) | func (o *Outfit) RemoveDyeColor(part string) {
    method GetEnhanceLevel (line 275) | func (o *Outfit) GetEnhanceLevel() int {
    method Enhance (line 280) | func (o *Outfit) Enhance() bool {
    method GetEnhanceBonuses (line 297) | func (o *Outfit) GetEnhanceBonuses() map[string]int {
    method GetTotalAttributes (line 302) | func (o *Outfit) GetTotalAttributes() map[string]int {
    method GetLastUsedAt (line 331) | func (o *Outfit) GetLastUsedAt() *time.Time {
    method GetUseCount (line 336) | func (o *Outfit) GetUseCount() int {
    method GetMetadata (line 341) | func (o *Outfit) GetMetadata() map[string]interface{} {
    method SetMetadata (line 346) | func (o *Outfit) SetMetadata(key string, value interface{}) {
    method GetMetadataValue (line 351) | func (o *Outfit) GetMetadataValue(key string) (interface{}, bool) {
    method CanUpgrade (line 357) | func (o *Outfit) CanUpgrade() bool {
    method CanEnhance (line 362) | func (o *Outfit) CanEnhance() bool {
    method GetPower (line 367) | func (o *Outfit) GetPower() int {
    method Clone (line 385) | func (o *Outfit) Clone() *Outfit {
  function NewOutfit (line 38) | func NewOutfit(name string, outfitType OutfitType, rarity Rarity) *Outfit {
  type OutfitSet (line 469) | type OutfitSet struct
    method EquipToSlot (line 500) | func (os *OutfitSet) EquipToSlot(slot OutfitSlot, outfit *Outfit) {
    method UnequipFromSlot (line 506) | func (os *OutfitSet) UnequipFromSlot(slot OutfitSlot) {
    method GetEquippedOutfit (line 512) | func (os *OutfitSet) GetEquippedOutfit(slot OutfitSlot) *Outfit {
    method GetAllEquipped (line 517) | func (os *OutfitSet) GetAllEquipped() map[OutfitSlot]*Outfit {
    method GetSetBonuses (line 522) | func (os *OutfitSet) GetSetBonuses() map[string]int {
    method calculateSetBonuses (line 527) | func (os *OutfitSet) calculateSetBonuses() {
    method GetFashionSets (line 607) | func (os *OutfitSet) GetFashionSets() map[string]*FashionSetBonus {
    method GetFashionSetBonus (line 612) | func (os *OutfitSet) GetFashionSetBonus(setID string) *FashionSetBonus {
    method SetStyleBonus (line 617) | func (os *OutfitSet) SetStyleBonus(style *DressupStyle) {
    method GetStyleBonus (line 623) | func (os *OutfitSet) GetStyleBonus() *DressupStyle {
    method GetTotalPower (line 628) | func (os *OutfitSet) GetTotalPower() int {
    method GetLastUpdated (line 633) | func (os *OutfitSet) GetLastUpdated() time.Time {
    method GetEquippedCount (line 638) | func (os *OutfitSet) GetEquippedCount() int {
    method GetEmptySlots (line 649) | func (os *OutfitSet) GetEmptySlots() []OutfitSlot {
    method GetOutfitsByType (line 667) | func (os *OutfitSet) GetOutfitsByType(outfitType OutfitType) []*Outfit {
    method GetOutfitsByRarity (line 678) | func (os *OutfitSet) GetOutfitsByRarity(rarity Rarity) []*Outfit {
    method GetTotalAttributes (line 689) | func (os *OutfitSet) GetTotalAttributes() map[string]int {
    method CanEquipOutfit (line 710) | func (os *OutfitSet) CanEquipOutfit(outfit *Outfit, slot OutfitSlot) b...
    method GetSetCompletionRate (line 734) | func (os *OutfitSet) GetSetCompletionRate(setID string) float64 {
    method GetHighestQualityOutfit (line 744) | func (os *OutfitSet) GetHighestQualityOutfit() *Outfit {
    method GetAverageLevel (line 759) | func (os *OutfitSet) GetAverageLevel() float64 {
    method GetAverageEnhanceLevel (line 778) | func (os *OutfitSet) GetAverageEnhanceLevel() float64 {
    method Clone (line 797) | func (os *OutfitSet) Clone() *OutfitSet {
  type FashionSetBonus (line 479) | type FashionSetBonus struct
  function NewOutfitSet (line 488) | func NewOutfitSet() *OutfitSet {

FILE: internal/domain/inventory/dressup/events.go
  type DomainEvent (line 9) | type DomainEvent interface
  type BaseDomainEvent (line 18) | type BaseDomainEvent struct
    method GetEventID (line 26) | func (e *BaseDomainEvent) GetEventID() string {
    method GetEventType (line 31) | func (e *BaseDomainEvent) GetEventType() string {
    method GetAggregateID (line 36) | func (e *BaseDomainEvent) GetAggregateID() string {
    method GetOccurredAt (line 41) | func (e *BaseDomainEvent) GetOccurredAt() time.Time {
  type OutfitEquippedEvent (line 46) | type OutfitEquippedEvent struct
    method GetEventData (line 71) | func (e *OutfitEquippedEvent) GetEventData() interface{} {
  function NewOutfitEquippedEvent (line 55) | func NewOutfitEquippedEvent(playerID, outfitID string, slot OutfitSlot, ...
  type OutfitUnequippedEvent (line 81) | type OutfitUnequippedEvent struct
    method GetEventData (line 104) | func (e *OutfitUnequippedEvent) GetEventData() interface{} {
  function NewOutfitUnequippedEvent (line 89) | func NewOutfitUnequippedEvent(playerID, outfitID string, slot OutfitSlot...
  type OutfitObtainedEvent (line 113) | type OutfitObtainedEvent struct
    method GetEventData (line 136) | func (e *OutfitObtainedEvent) GetEventData() interface{} {
  function NewOutfitObtainedEvent (line 121) | func NewOutfitObtainedEvent(playerID string, outfit *Outfit, source stri...
  type OutfitUpgradedEvent (line 145) | type OutfitUpgradedEvent struct
    method GetEventData (line 174) | func (e *OutfitUpgradedEvent) GetEventData() interface{} {
  function NewOutfitUpgradedEvent (line 156) | func NewOutfitUpgradedEvent(playerID, outfitID string, oldLevel, newLeve...
  type StyleAppliedEvent (line 186) | type StyleAppliedEvent struct
    method GetEventData (line 209) | func (e *StyleAppliedEvent) GetEventData() interface{} {
  function NewStyleAppliedEvent (line 194) | func NewStyleAppliedEvent(playerID, styleID string, style *DressupStyle)...
  type SetBonusActivatedEvent (line 218) | type SetBonusActivatedEvent struct
    method GetEventData (line 243) | func (e *SetBonusActivatedEvent) GetEventData() interface{} {
  function NewSetBonusActivatedEvent (line 227) | func NewSetBonusActivatedEvent(playerID, setType string, pieceCount int,...

FILE: internal/domain/inventory/dressup/repository.go
  type DressupRepository (line 6) | type DressupRepository interface
  type OutfitTemplateRepository (line 51) | type OutfitTemplateRepository interface
  type OutfitTemplate (line 69) | type OutfitTemplate struct
    method CreateOutfitFromTemplate (line 83) | func (ot *OutfitTemplate) CreateOutfitFromTemplate() *Outfit {

FILE: internal/domain/inventory/dressup/service.go
  type DressupService (line 9) | t
Condensed preview — 453 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (5,127K chars).
[
  {
    "path": ".dockerignore",
    "chars": 6544,
    "preview": "# =============================================================================\n# Docker 构建忽略文件\n# ======================"
  },
  {
    "path": ".editorconfig",
    "chars": 1055,
    "preview": "# EditorConfig is awesome: https://EditorConfig.org\n\n# top-most EditorConfig file\nroot = true\n\n# All files\n[*]\ncharset ="
  },
  {
    "path": ".gitignore",
    "chars": 1558,
    "preview": "\n# AI工作文件\n.trae/\n.cursor/\n\n# 协作说明(如需本地自定义可忽略)\n.github/instructions/\n\n# 构建产物\ndist/\nbuild/\n*.exe\n*.dll\n*.so\n*.dylib\n\n# 测试覆"
  },
  {
    "path": ".gitmodules",
    "chars": 116,
    "preview": "\n[submodule \"network/protocol\"]\n\tpath = network/protocol\n\turl = https://github.com/phuhao00/greatestworks-proto.git\n"
  },
  {
    "path": ".golangci.yml",
    "chars": 5170,
    "preview": "# =============================================================================\n# golangci-lint 配置文件\n# 用于 Go 代码质量检查和静态分析"
  },
  {
    "path": ".goreleaser.yaml",
    "chars": 886,
    "preview": "# This is an example .goreleaser.yml file with some sensible defaults.\n# Make sure to check the documentation at https:/"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 4653,
    "preview": "# Contributing to GreatestWorks\n\nThanks for your interest in contributing! This project implements a distributed MMO gam"
  },
  {
    "path": "Dockerfile",
    "chars": 2765,
    "preview": "# =============================================================================\n# 多阶段构建优化版 Dockerfile\n# ================"
  },
  {
    "path": "Makefile",
    "chars": 2046,
    "preview": "# GreatestWorks MMO 游戏服务器 Makefile\n\n.PHONY: help build run stop clean test lint format docker-build docker-run docker-st"
  },
  {
    "path": "README.en.md",
    "chars": 16487,
    "preview": "# Greatest Works - Distributed MMO Game Server\n\nA distributed, microservices-based MMO game server built with Go and Dom"
  },
  {
    "path": "README.md",
    "chars": 27611,
    "preview": "# Greatest Works - 分布式MMO游戏服务器\n\n> English version: see [README.en.md](README.en.md)\n\n基于Go语言和领域驱动设计(DDD)架构开发的分布式大型多人在线游戏服"
  },
  {
    "path": "cmd/auth-service/main.go",
    "chars": 2256,
    "preview": "// Package main 认证服务主程序\n// 基于DDD架构的分布式认证服务\npackage main\n\nimport (\n\t\"context\"\n\t\"greatestworks/internal/bootstrap\"\n\t\"log\"\n"
  },
  {
    "path": "cmd/game-service/main.go",
    "chars": 2257,
    "preview": "// Package main 游戏服务主程序\n// 基于DDD架构的分布式游戏服务\npackage main\n\nimport (\n\t\"context\"\n\t\"greatestworks/internal/bootstrap\"\n\t\"log\"\n"
  },
  {
    "path": "cmd/gateway-service/main.go",
    "chars": 2271,
    "preview": "// Package main 网关服务主程序\n// 基于DDD架构的分布式网关服务\npackage main\n\nimport (\n\t\"context\"\n\t\"greatestworks/internal/bootstrap\"\n\t\"log\"\n"
  },
  {
    "path": "cmd/replication/main.go",
    "chars": 2269,
    "preview": "// Package main 副本服务主程序\n// 负责副本/实例的创建、匹配与回收\npackage main\n\nimport (\n\t\"context\"\n\t\"greatestworks/internal/bootstrap\"\n\t\"log\""
  },
  {
    "path": "cmd/scene/main.go",
    "chars": 2269,
    "preview": "// Package main 场景服务主程序\n// 负责地图/副本/区域等场景的生命周期与调度\npackage main\n\nimport (\n\t\"context\"\n\t\"greatestworks/internal/bootstrap\"\n\t"
  },
  {
    "path": "configs/auth-service.yaml",
    "chars": 2974,
    "preview": "app:\n  name: \"GreatestWorks Auth\"\n  version: \"1.0.0\"\n  environment: \"development\"\n  debug: false\n\nservice:\n  name: \"auth"
  },
  {
    "path": "configs/config.dev.yaml.example",
    "chars": 2722,
    "preview": "# =============================================================================\n# 开发环境配置模板\n# 用于本地开发和测试\n# ==============="
  },
  {
    "path": "configs/config.example.yaml",
    "chars": 5108,
    "preview": "# =============================================================================\n# GreatestWorks MMO 游戏服务器配置模板\n# 复制此文件为 c"
  },
  {
    "path": "configs/config.prod.yaml.example",
    "chars": 6306,
    "preview": "# =============================================================================\n# 生产环境配置模板\n# 用于生产环境部署\n# 注意:所有敏感信息应通过环境变量"
  },
  {
    "path": "configs/data/items.json",
    "chars": 2173,
    "preview": "[\n  {\n    \"id\": 10001,\n    \"name\": \"Health Potion\",\n    \"type\": 1,\n    \"quality\": 1,\n    \"max_stack\": 99,\n    \"price\": 5"
  },
  {
    "path": "configs/data/maps.json",
    "chars": 1431,
    "preview": "[\n  {\n    \"id\": 1,\n    \"name\": \"Newbie Village\",\n    \"width\": 1000,\n    \"height\": 1000,\n    \"spawn_points\": [\n      {\n  "
  },
  {
    "path": "configs/data/quests.json",
    "chars": 2829,
    "preview": "[\n  {\n    \"id\": 1001,\n    \"name\": \"Goblin Hunt\",\n    \"description\": \"Help the village by eliminating goblins\",\n    \"leve"
  },
  {
    "path": "configs/data/skills.json",
    "chars": 2072,
    "preview": "[\n  {\n    \"id\": 1,\n    \"name\": \"Basic Attack\",\n    \"type\": 1,\n    \"base_damage\": 100,\n    \"scale_ad\": 1.0,\n    \"scale_ap"
  },
  {
    "path": "configs/data/units.json",
    "chars": 2385,
    "preview": "[\n  {\n    \"id\": 1001,\n    \"name\": \"Warrior\",\n    \"type\": 1,\n    \"level\": 1,\n    \"max_hp\": 1000,\n    \"max_mp\": 200,\n    \""
  },
  {
    "path": "configs/docker.yaml",
    "chars": 2280,
    "preview": "# =============================================================================\n# Docker 环境配置文件\n# 用于 Docker Compose 部署\n#"
  },
  {
    "path": "configs/game-service.yaml",
    "chars": 2889,
    "preview": "# 游戏服务配置文件\n\n# 应用基础配置\napp:\n  name: \"GreatestWorks MMO Server\"\n  version: \"1.0.0\"\n  environment: \"development\"\n  debug: tr"
  },
  {
    "path": "configs/gateway-service.yaml",
    "chars": 3882,
    "preview": "app:\n  name: \"GreatestWorks Gateway\"\n  version: \"1.0.0\"\n  environment: \"development\"\n  debug: false\n\nservice:\n  name: \"g"
  },
  {
    "path": "configs/replication-service.yaml",
    "chars": 700,
    "preview": "app:\n  name: \"GreatestWorks Replication\"\n  version: \"1.0.0\"\n  environment: \"development\"\n  debug: false\n\nservice:\n  name"
  },
  {
    "path": "configs/scene-service.yaml",
    "chars": 856,
    "preview": "app:\n  name: \"GreatestWorks Scene\"\n  version: \"1.0.0\"\n  environment: \"development\"\n  debug: false\n\nservice:\n  name: \"sce"
  },
  {
    "path": "docker-compose.yml",
    "chars": 7203,
    "preview": "# =============================================================================\n# GreatestWorks MMO 游戏服务器 - 优化版 Docker C"
  },
  {
    "path": "docs/k8s-local.md",
    "chars": 1673,
    "preview": "# Run GreatestWorks locally on Kubernetes (Windows)\n\nThis guide helps you run the Go services locally on a Kubernetes cl"
  },
  {
    "path": "go.mod",
    "chars": 2645,
    "preview": "module greatestworks\n\ngo 1.24.0\n\nrequire (\n\tgithub.com/fsnotify/fsnotify v1.7.0\n\tgithub.com/gin-gonic/gin v1.10.0\n\tgithu"
  },
  {
    "path": "go.work",
    "chars": 17,
    "preview": "go 1.24.0\n\nuse .\n"
  },
  {
    "path": "go.work.sum",
    "chars": 81233,
    "preview": "cloud.google.com/go v0.34.0 h1:eOI3/cP2VTU6uZLDYAoic+eyzzB9YyGmJ7eIjl8rOPg=\ncloud.google.com/go/auth v0.9.1 h1:+pMtLEV2k"
  },
  {
    "path": "internal/application/commands/battle/create_battle.go",
    "chars": 1612,
    "preview": "package battle\n\nimport (\n\t\"context\"\n\t\"time\"\n)\n\n// BattleType 战斗类型\ntype BattleType int\n\nconst (\n\tBattleTypePvP BattleType"
  },
  {
    "path": "internal/application/commands/battle/errors.go",
    "chars": 2218,
    "preview": "package battle\n\nimport (\n\t\"errors\"\n\tprotoerrors \"greatestworks/internal/proto/errors\"\n)\n\n// Battle命令相关错误码 - 使用proto生成的常量"
  },
  {
    "path": "internal/application/commands/player/ban_player.go",
    "chars": 1985,
    "preview": "package player\n\nimport (\n\t\"context\"\n\t\"time\"\n)\n\n// BanPlayerCommand GM封禁玩家命令\ntype BanPlayerCommand struct {\n\tPlayerID    "
  },
  {
    "path": "internal/application/commands/player/create_player.go",
    "chars": 3026,
    "preview": "package player\n\nimport (\n\t\"context\"\n\t\"greatestworks/internal/application/interfaces\"\n\t\"time\"\n)\n\n// CreatePlayerCommand 创"
  },
  {
    "path": "internal/application/commands/player/delete_player.go",
    "chars": 1373,
    "preview": "package player\n\nimport (\n\t\"context\"\n\t\"time\"\n\t// TODO: Add necessary imports when implementing Delete functionality\n\t// \""
  },
  {
    "path": "internal/application/commands/player/errors.go",
    "chars": 967,
    "preview": "package player\n\nimport \"errors\"\n\n// Player命令相关错误\nvar (\n\tErrInvalidPlayerName       = errors.New(\"invalid player name\")\n\t"
  },
  {
    "path": "internal/application/commands/player/gm_update_player.go",
    "chars": 1877,
    "preview": "package player\n\nimport (\n\t\"context\"\n\t\"time\"\n)\n\n// GMUpdatePlayerCommand GM更新玩家命令\ntype GMUpdatePlayerCommand struct {\n\tPl"
  },
  {
    "path": "internal/application/commands/player/level_up_player.go",
    "chars": 1595,
    "preview": "package player\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\t\"greatestworks/internal/domain/player\"\n)\n\n// LevelUpPlayerCommand 玩家升级命令\nt"
  },
  {
    "path": "internal/application/commands/player/move_player.go",
    "chars": 1645,
    "preview": "package player\n\nimport (\n\t\"context\"\n)\n\n// Position 位置信息\ntype Position struct {\n\tX float64 `json:\"x\"`\n\tY float64 `json:\"y"
  },
  {
    "path": "internal/application/commands/player/unban_player.go",
    "chars": 1644,
    "preview": "package player\n\nimport (\n\t\"context\"\n\t\"time\"\n)\n\n// UnbanPlayerCommand GM解封玩家命令\ntype UnbanPlayerCommand struct {\n\tPlayerID"
  },
  {
    "path": "internal/application/commands/player/update_player.go",
    "chars": 1442,
    "preview": "package player\n\nimport (\n\t\"context\"\n\t\"time\"\n)\n\n// UpdatePlayerCommand 更新玩家命令\ntype UpdatePlayerCommand struct {\n\tPlayerID"
  },
  {
    "path": "internal/application/handlers/command_bus.go",
    "chars": 3363,
    "preview": "package handlers\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"reflect\"\n)\n\n// Command 命令接口\ntype Command interface {\n\tCommandType() strin"
  },
  {
    "path": "internal/application/handlers/query_bus.go",
    "chars": 3736,
    "preview": "package handlers\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"reflect\"\n)\n\n// Query 查询接口\ntype Query interface {\n\tQueryType() string\n\tVal"
  },
  {
    "path": "internal/application/handlers/replication_subscribers.go",
    "chars": 1091,
    "preview": "package handlers\n\nimport (\n\t\"context\"\n\t\"reflect\"\n\n\t\"greatestworks/internal/domain/replication\"\n\t\"greatestworks/internal/"
  },
  {
    "path": "internal/application/interfaces/command.go",
    "chars": 1631,
    "preview": "// Package interfaces 定义应用层接口\npackage interfaces\n\nimport \"context\"\n\n// Command 命令接口\ntype Command interface {\n\tCommandTyp"
  },
  {
    "path": "internal/application/queries/battle/errors.go",
    "chars": 55,
    "preview": "package battle\n\n// import \"errors\"\n\n// English comment\n"
  },
  {
    "path": "internal/application/queries/battle/get_battle.go",
    "chars": 132,
    "preview": "package battle\n\n// import \"time\" // 未使用\n\n// English comment// English comment// English comment// English comment// Engl"
  },
  {
    "path": "internal/application/queries/player/errors.go",
    "chars": 493,
    "preview": "package player\n\nimport \"errors\"\n\n// Player查询相关错误\nvar (\n\tErrPlayerNotFound    = errors.New(\"player not found\")\n\tErrInvali"
  },
  {
    "path": "internal/application/queries/player/get_player.go",
    "chars": 4389,
    "preview": "package player\n\nimport (\n\t\"context\"\n\t\"time\"\n)\n\n// GetPlayerQuery 获取玩家查询\ntype GetPlayerQuery struct {\n\tPlayerID string `j"
  },
  {
    "path": "internal/application/queries/player/get_player_detail.go",
    "chars": 1228,
    "preview": "package player\n\nimport (\n\t\"context\"\n)\n\n// GetPlayerDetailQuery GM获取玩家详情查询\ntype GetPlayerDetailQuery struct {\n\tPlayerID s"
  },
  {
    "path": "internal/application/queries/player/get_player_stats.go",
    "chars": 1750,
    "preview": "package player\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\t\"greatestworks/internal/domain/player\"\n)\n\n// GetPlayerStatsQuery 获取玩家统计信息查"
  },
  {
    "path": "internal/application/queries/player/list_players.go",
    "chars": 1611,
    "preview": "package player\n\nimport (\n\t\"context\"\n)\n\n// ListPlayersQuery 列表查询玩家请求\ntype ListPlayersQuery struct {\n\tPage     int    `jso"
  },
  {
    "path": "internal/application/queries/player/search_players.go",
    "chars": 1836,
    "preview": "package player\n\nimport (\n\t\"context\"\n)\n\n// SearchPlayersQuery GM搜索玩家查询\ntype SearchPlayersQuery struct {\n\tKeyword   string"
  },
  {
    "path": "internal/application/services/building_service.go",
    "chars": 22135,
    "preview": "package services\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"greatestworks/internal/domain/building\"\n)\n\n// BuildingApplicatio"
  },
  {
    "path": "internal/application/services/character_service.go",
    "chars": 6513,
    "preview": "package services\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"greatestworks/internal/domain/character\"\n\t\"greatestwor"
  },
  {
    "path": "internal/application/services/fight_service.go",
    "chars": 4502,
    "preview": "package services\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"math/rand/v2\"\n\n\t\"greatestworks/internal/domain/character\"\n\t\"greatestwo"
  },
  {
    "path": "internal/application/services/hangup_service.go",
    "chars": 13785,
    "preview": "package services\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\t\"greatestworks/internal/domain/player/hangup\"\n)\n\n// HangupService 挂机应用服务"
  },
  {
    "path": "internal/application/services/item_service.go",
    "chars": 4164,
    "preview": "package services\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"greatestworks/internal/infrastructure/datamanager\"\n\t\"g"
  },
  {
    "path": "internal/application/services/mail_service.go",
    "chars": 2754,
    "preview": "package services\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"greatestworks/internal/infrastructure/persistence\"\n)\n\n// MailSer"
  },
  {
    "path": "internal/application/services/map_service.go",
    "chars": 5138,
    "preview": "package services\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"sync\"\n\t\"time\"\n\n\t\"greatestworks/internal/domain/character\"\n\t\"greatestwo"
  },
  {
    "path": "internal/application/services/minigame_service.go",
    "chars": 19127,
    "preview": "package services\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"greatestworks/internal/domain/minigame\"\n)\n\n// MinigameApplicatio"
  },
  {
    "path": "internal/application/services/npc_service.go",
    "chars": 25937,
    "preview": "package services\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"greatestworks/internal/domain/npc\"\n)\n\n// NPCService NPC应用服务\ntype"
  },
  {
    "path": "internal/application/services/pet_service.go",
    "chars": 18621,
    "preview": "package services\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"greatestworks/internal/domain/pet\"\n)\n\n// PetApplicationService 宠"
  },
  {
    "path": "internal/application/services/plant_service.go",
    "chars": 20684,
    "preview": "package services\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\t\"greatestworks/internal/domain/scene/plant\"\n)\n\n// PlantService 种植应用服务\nty"
  },
  {
    "path": "internal/application/services/player_service.go",
    "chars": 9219,
    "preview": "// Package services 应用服务层\npackage services\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"log\"\n\n\t\"greatestworks/internal/domain/player\"\n)"
  },
  {
    "path": "internal/application/services/quest_service.go",
    "chars": 4678,
    "preview": "package services\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\n\t\"greatestworks/internal/domain/quest\"\n\t\"greatestworks/internal/"
  },
  {
    "path": "internal/application/services/ranking_service.go",
    "chars": 17114,
    "preview": "package services\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"greatestworks/internal/domain/ranking\"\n)\n\n// RankingApplicationS"
  },
  {
    "path": "internal/application/services/replication_service.go",
    "chars": 8809,
    "preview": "// Package services 应用服务层\n// ReplicationService 编排副本实例的创建、管理和销毁\npackage services\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"time\"\n\n\t\""
  },
  {
    "path": "internal/application/services/sacred_service.go",
    "chars": 19487,
    "preview": "package services\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"greatestworks/internal/domain/scene/sacred\"\n)\n\n// SacredService "
  },
  {
    "path": "internal/application/services/scene_service.go",
    "chars": 7778,
    "preview": "// Package services 应用服务层 - 场景服务\npackage services\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"greatestworks/internal/domain/s"
  },
  {
    "path": "internal/application/services/service_registry.go",
    "chars": 5356,
    "preview": "// Package services 应用层服务注册器\npackage services\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"greatestworks/internal/application/interface"
  },
  {
    "path": "internal/application/services/spawn_manager.go",
    "chars": 1716,
    "preview": "package services\n\nimport (\n\t\"context\"\n\t\"sync\"\n\t\"time\"\n\n\t\"greatestworks/internal/infrastructure/logging\"\n)\n\n// SpawnTask "
  },
  {
    "path": "internal/application/services/update_manager.go",
    "chars": 3061,
    "preview": "package services\n\nimport (\n\t\"context\"\n\t\"sync\"\n\t\"time\"\n\n\t\"greatestworks/internal/infrastructure/logging\"\n)\n\n// Updatable "
  },
  {
    "path": "internal/application/services/user_service.go",
    "chars": 2523,
    "preview": "package services\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"greatestworks/internal/infrastructure/persistence\"\n\n\t\""
  },
  {
    "path": "internal/application/services/weather_service.go",
    "chars": 16837,
    "preview": "package services\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\t\"greatestworks/internal/domain/scene/weather\"\n)\n\n// WeatherService 天气应用服"
  },
  {
    "path": "internal/auth/jwt.go",
    "chars": 2078,
    "preview": "// Package auth JWT认证相关功能\n// Author: MMO Server Team\n// Created: 2024\n\npackage auth\n\nimport (\n\t\"errors\"\n\t\"time\"\n\n\t\"githu"
  },
  {
    "path": "internal/base_module.go",
    "chars": 1305,
    "preview": "package internal\n\nimport (\n\t// \"greatestworks/internal/infrastructure/module_router\" // TODO: 实现模块路由\n\t// \"greatestworks/"
  },
  {
    "path": "internal/bootstrap/auth_bootstrap.go",
    "chars": 6225,
    "preview": "package bootstrap\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/redis/go-redis/v9\"\n\t\"go.mongodb.org/m"
  },
  {
    "path": "internal/bootstrap/game_bootstrap.go",
    "chars": 7716,
    "preview": "package bootstrap\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/redis/go-redis/v9\"\n\t\"go.mongodb.org/m"
  },
  {
    "path": "internal/bootstrap/gateway_bootstrap.go",
    "chars": 8879,
    "preview": "package bootstrap\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/redis/go-redis/v9\"\n\t"
  },
  {
    "path": "internal/bootstrap/replication_bootstrap.go",
    "chars": 8850,
    "preview": "package bootstrap\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/redis/go-redis/v9\"\n\t\"go.mongodb.org/m"
  },
  {
    "path": "internal/bootstrap/scene_bootstrap.go",
    "chars": 8286,
    "preview": "package bootstrap\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/redis/go-redis/v9\"\n\t\"go.mongodb.org/m"
  },
  {
    "path": "internal/config/config.go",
    "chars": 8311,
    "preview": "//go:build ignore\n// +build ignore\n\npackage config\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\""
  },
  {
    "path": "internal/config/loader.go",
    "chars": 6678,
    "preview": "package config\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sort\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"gopkg.in/yaml.v3\"\n)\n\n/"
  },
  {
    "path": "internal/config/loader_test.go",
    "chars": 2247,
    "preview": "package config\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n)\n\nfunc TestLoaderMergesFilesAndAppliesDefaults(t *testing.T)"
  },
  {
    "path": "internal/config/manager.go",
    "chars": 4506,
    "preview": "package config\n\nimport (\n\t\"context\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/fsnotify/fsnotify\"\n)\n\n// WatcherFunc receives an updat"
  },
  {
    "path": "internal/config/types.go",
    "chars": 36879,
    "preview": "package config\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"time\"\n)\n\n// Config coordinates all configuration sections for services.\ntyp"
  },
  {
    "path": "internal/config_manager_base.go",
    "chars": 220,
    "preview": "package internal\n\n// ConfigManagerBase 配置管理器基类\ntype ConfigManagerBase struct {\n}\n\n// Load 加载配置\nfunc (c *ConfigManagerBas"
  },
  {
    "path": "internal/data_base.go",
    "chars": 221,
    "preview": "package internal\n\n// \"greatestworks/internal/note/event\" // TODO: 实现事件系统\n\ntype DataAsPublisher struct {\n\t// event.BasePu"
  },
  {
    "path": "internal/database/mongodb.go",
    "chars": 2453,
    "preview": "// Package database 数据库连接池和操作封装\n// Author: MMO Server Team\n// Created: 2024\n\npackage database\n\nimport (\n\t\"context\"\n\t\"fmt"
  },
  {
    "path": "internal/database/redis.go",
    "chars": 2869,
    "preview": "// Package database Redis缓存操作封装\n// Author: MMO Server Team\n// Created: 2024\n\npackage database\n\nimport (\n\t\"context\"\n\t\"fmt"
  },
  {
    "path": "internal/domain/ai/monster_ai.go",
    "chars": 5810,
    "preview": "package ai\n\nimport (\n\t\"context\"\n\t\"greatestworks/internal/domain/character\"\n\t\"math\"\n)\n\n// AIState AI状态\ntype AIState int32"
  },
  {
    "path": "internal/domain/battle/battle.go",
    "chars": 8086,
    "preview": "// Package battle 战斗领域\npackage battle\n\nimport (\n\t\"github.com/google/uuid\"\n\t\"greatestworks/internal/domain/player\"\n\t\"time"
  },
  {
    "path": "internal/domain/battle/errors.go",
    "chars": 1041,
    "preview": "package battle\n\nimport \"greatestworks/internal/errors\"\n\n// 战斗领域错误定义 - 使用统一的错误处理机制\nvar (\n\tErrBattleNotFound           = e"
  },
  {
    "path": "internal/domain/battle/repository.go",
    "chars": 972,
    "preview": "package battle\n\nimport (\n\t\"context\"\n\t\"greatestworks/internal/domain/player\"\n)\n\n// Repository 战斗仓储接口\ntype Repository inte"
  },
  {
    "path": "internal/domain/battle/service.go",
    "chars": 10316,
    "preview": "package battle\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"greatestworks/internal/domain/player\"\n\t\"math/rand\"\n\t\"time\"\n)\n\n// Service 战斗"
  },
  {
    "path": "internal/domain/battle/skill.go",
    "chars": 7276,
    "preview": "package battle\n\nimport (\n\t\"errors\"\n\t\"time\"\n)\n\n// SkillID 技能ID值对象\ntype SkillID struct {\n\tvalue string\n}\n\n// NewSkillID 创建"
  },
  {
    "path": "internal/domain/building/aggregate.go",
    "chars": 27188,
    "preview": "package building\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\n// BuildingAggregate 建筑聚合根\ntype BuildingAggregate struct {\n\tID             "
  },
  {
    "path": "internal/domain/building/entity.go",
    "chars": 36789,
    "preview": "package building\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\n// ConstructionInfo 建造信息实体\ntype ConstructionInfo struct {\n\tID           str"
  },
  {
    "path": "internal/domain/building/errors.go",
    "chars": 24087,
    "preview": "package building\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\n// BuildingError 建筑错误接口\ntype BuildingError interface {\n\terror\n\tGetCode() st"
  },
  {
    "path": "internal/domain/building/events.go",
    "chars": 28729,
    "preview": "package building\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"time\"\n)\n\n// BuildingEvent 建筑事件接口\ntype BuildingEvent interface {\n\tGetEvent"
  },
  {
    "path": "internal/domain/building/repository.go",
    "chars": 25296,
    "preview": "package building\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"time\"\n)\n\n// BuildingRepository 建筑仓储接口\ntype BuildingRepository interface {"
  },
  {
    "path": "internal/domain/building/service.go",
    "chars": 27934,
    "preview": "package building\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"time\"\n)\n\n// BuildingService 建筑领域服务\ntype BuildingService struct {\n\tbuildin"
  },
  {
    "path": "internal/domain/building/types.go",
    "chars": 1146,
    "preview": "package building\n\n// BuildingType 建筑类型\ntype BuildingType string\n\nconst (\n\tBuildingTypeResidential  BuildingType = \"resid"
  },
  {
    "path": "internal/domain/building/value_object.go",
    "chars": 42375,
    "preview": "package building\n\nimport (\n\t\"fmt\"\n\t\"math\"\n\t\"time\"\n)\n\n// 建筑状态相关值对象\n\n// BuildingStatus 建筑状态\ntype BuildingStatus int32\n\ncon"
  },
  {
    "path": "internal/domain/character/actor.go",
    "chars": 8117,
    "preview": "package character\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"sync\"\n)\n\n// Actor 角色实体 - 具有战斗属性的实体(玩家、怪物等)\n// 继承自Entity,添加战斗相关的属性和行为\ntyp"
  },
  {
    "path": "internal/domain/character/buff_attributes_test.go",
    "chars": 1043,
    "preview": "package character\n\nimport (\n\t\"context\"\n\t\"testing\"\n)\n\nfunc TestBuffAttributeModifiersAffectFinalsAndSpeed(t *testing.T) {"
  },
  {
    "path": "internal/domain/character/buff_flags_test.go",
    "chars": 829,
    "preview": "package character\n\nimport (\n\t\"context\"\n\t\"testing\"\n)\n\nfunc TestBuffFlagsAffectActorState(t *testing.T) {\n\tactor := NewAct"
  },
  {
    "path": "internal/domain/character/entity.go",
    "chars": 3789,
    "preview": "package character\n\nimport (\n\t\"context\"\n\t\"sync\"\n)\n\n// Entity 实体基类 - 所有游戏实体的基础\n// 遵循DDD原则:Entity是具有唯一标识的领域对象\ntype Entity s"
  },
  {
    "path": "internal/domain/character/events.go",
    "chars": 5274,
    "preview": "package character\n\nimport (\n\t\"time\"\n)\n\n// DomainEvent 领域事件接口\ntype DomainEvent interface {\n\tEventName() string\n\tOccurredO"
  },
  {
    "path": "internal/domain/character/events_test.go",
    "chars": 1391,
    "preview": "package character\n\nimport (\n\t\"context\"\n\t\"sync\"\n\t\"testing\"\n)\n\ntype fakePublisher struct {\n\tmu     sync.Mutex\n\tevents []Do"
  },
  {
    "path": "internal/domain/character/monster.go",
    "chars": 4996,
    "preview": "package character\n\nimport (\n\t\"context\"\n\t\"fmt\"\n)\n\n// Monster 怪物实体\ntype Monster struct {\n\t*Actor // 继承Actor\n\n\t// 初始位置(用于AI"
  },
  {
    "path": "internal/domain/character/player.go",
    "chars": 5178,
    "preview": "package character\n\nimport (\n\t\"context\"\n\t\"fmt\"\n)\n\n// Player 玩家实体 - 聚合根\ntype Player struct {\n\t*Actor // 继承Actor\n\n\t// 用户关联\n"
  },
  {
    "path": "internal/domain/character/repository.go",
    "chars": 2103,
    "preview": "package character\n\nimport (\n\t\"context\"\n)\n\n// EntityRepository 实体仓储接口 - 由基础设施层实现\ntype EntityRepository interface {\n\t// 通用"
  },
  {
    "path": "internal/domain/character/skill_damage_test.go",
    "chars": 1118,
    "preview": "package character\n\nimport (\n\t\"context\"\n\t\"testing\"\n)\n\nfunc TestSkillDamageReducesTargetHP(t *testing.T) {\n\tattacker := Ne"
  },
  {
    "path": "internal/domain/character/subsystems.go",
    "chars": 14666,
    "preview": "package character\n\nimport (\n\t\"context\"\n\t\"sync\"\n)\n\n// AttributeManager 属性管理器 - 管理Actor的属性计算\ntype AttributeManager struct "
  },
  {
    "path": "internal/domain/character/subsystems_test.go",
    "chars": 2271,
    "preview": "package character\n\nimport (\n\t\"context\"\n\t\"testing\"\n)\n\nfunc TestSkillFSMTransitions(t *testing.T) {\n\tactor := NewActor(1, "
  },
  {
    "path": "internal/domain/character/value_objects.go",
    "chars": 3881,
    "preview": "package character\n\nimport (\n\t\"math\"\n)\n\n// Vector3 三维向量(位置、方向)\ntype Vector3 struct {\n\tX float32\n\tY float32\n\tZ float32\n}\n\n"
  },
  {
    "path": "internal/domain/dialogue/dialogue_manager.go",
    "chars": 4228,
    "preview": "package dialogue\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n)\n\n// DialogueType 对话类型\ntype DialogueType int32\n\nconst (\n\tDialogueTypeNormal D"
  },
  {
    "path": "internal/domain/events/domain_event.go",
    "chars": 6167,
    "preview": "// Package events 领域事件定义\npackage events\n\nimport (\n\t\"encoding/json\"\n\t\"time\"\n)\n\n// DomainEvent 领域事件接口\ntype DomainEvent int"
  },
  {
    "path": "internal/domain/inventory/dressup/aggregate.go",
    "chars": 13152,
    "preview": "package dressup\n\nimport (\n\t\"time\"\n\t// \"github.com/google/uuid\"\n)\n\n// DressupAggregate 换装聚合根\ntype DressupAggregate struct"
  },
  {
    "path": "internal/domain/inventory/dressup/entity.go",
    "chars": 17593,
    "preview": "package dressup\n\nimport (\n\t\"time\"\n\n\t\"github.com/google/uuid\"\n)\n\n// Outfit 服装实体\ntype Outfit struct {\n\tid             stri"
  },
  {
    "path": "internal/domain/inventory/dressup/errors.go",
    "chars": 1139,
    "preview": "package dressup\n\nimport \"errors\"\n\n// 换装系统相关错误\nvar (\n\tErrInvalidOutfit         = errors.New(\"invalid outfit\")\n\tErrOutfitN"
  },
  {
    "path": "internal/domain/inventory/dressup/events.go",
    "chars": 6276,
    "preview": "package dressup\n\nimport (\n\t\"github.com/google/uuid\"\n\t\"time\"\n)\n\n// DomainEvent 领域事件接口\ntype DomainEvent interface {\n\tGetEv"
  },
  {
    "path": "internal/domain/inventory/dressup/repository.go",
    "chars": 3146,
    "preview": "package dressup\n\nimport \"context\"\n\n// DressupRepository 换装仓储接口\ntype DressupRepository interface {\n\t// SaveDressupAggrega"
  },
  {
    "path": "internal/domain/inventory/dressup/service.go",
    "chars": 6194,
    "preview": "package dressup\n\nimport (\n\t\"math/rand\"\n\t\"time\"\n)\n\n// DressupService 换装领域服务\ntype DressupService struct {\n\toutfitFactory *"
  },
  {
    "path": "internal/domain/inventory/dressup/value_object.go",
    "chars": 13793,
    "preview": "package dressup\n\n// OutfitType 服装类型\ntype OutfitType int\n\nconst (\n\tOutfitTypeWeapon OutfitType = iota + 1\n\tOutfitTypeArmo"
  },
  {
    "path": "internal/domain/inventory/errors.go",
    "chars": 1358,
    "preview": "package inventory\n\nimport \"errors\"\n\nvar (\n\t// 背包相关错误\n\tErrInventoryFull   = errors.New(\"inventory is full\")\n\tErrInvalidCa"
  },
  {
    "path": "internal/domain/inventory/inventory.go",
    "chars": 8158,
    "preview": "// Package inventory 背包领域\npackage inventory\n\nimport (\n\t\"errors\"\n\t\"greatestworks/internal/domain/player\"\n\t\"time\"\n\n\t\"githu"
  },
  {
    "path": "internal/domain/inventory/repository.go",
    "chars": 3274,
    "preview": "package inventory\n\nimport (\n\t\"context\"\n\t\"time\"\n)\n\n// Quality 物品品质\ntype Quality int\n\nconst (\n\tQualityCommon    Quality = "
  },
  {
    "path": "internal/domain/inventory/synthesis/aggregate.go",
    "chars": 5525,
    "preview": "package synthesis\n\nimport (\n\t\"math/rand\"\n\t\"time\"\n\t// \"github.com/google/uuid\"\n)\n\n// SynthesisAggregate 合成聚合根\ntype Synthe"
  },
  {
    "path": "internal/domain/inventory/synthesis/entity.go",
    "chars": 7261,
    "preview": "package synthesis\n\nimport (\n\t\"time\"\n\n\t\"github.com/google/uuid\"\n\t// \"math/rand\"\n\t// \"github.com/google/uuid\"\n)\n\n// Recipe"
  },
  {
    "path": "internal/domain/inventory/synthesis/errors.go",
    "chars": 989,
    "preview": "package synthesis\n\nimport \"errors\"\n\n// 合成系统相关错误\nvar (\n\tErrInvalidRecipe        = errors.New(\"invalid recipe\")\n\tErrRecipe"
  },
  {
    "path": "internal/domain/inventory/synthesis/events.go",
    "chars": 8515,
    "preview": "package synthesis\n\nimport (\n\t\"github.com/google/uuid\"\n\t\"time\"\n)\n\n// DomainEvent 领域事件接口\ntype DomainEvent interface {\n\tGet"
  },
  {
    "path": "internal/domain/inventory/synthesis/repository.go",
    "chars": 5939,
    "preview": "package synthesis\n\nimport \"context\"\n\n// SynthesisRepository 合成仓储接口\ntype SynthesisRepository interface {\n\t// SaveSynthesi"
  },
  {
    "path": "internal/domain/inventory/synthesis/service.go",
    "chars": 9004,
    "preview": "package synthesis\n\nimport (\n\t\"math/rand\"\n\t\"time\"\n)\n\n// SynthesisService 合成领域服务\ntype SynthesisService struct {\n\trecipeFac"
  },
  {
    "path": "internal/domain/inventory/synthesis/value_object.go",
    "chars": 6424,
    "preview": "package synthesis\n\n// RecipeCategory 配方分类\ntype RecipeCategory int\n\nconst (\n\tRecipeCategoryWeapon RecipeCategory = iota +"
  },
  {
    "path": "internal/domain/mapmanager/map.go",
    "chars": 11195,
    "preview": "package mapmanager\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"sync\"\n\n\tcharacter \"greatestworks/internal/domain/character\"\n)\n\n// Map 地"
  },
  {
    "path": "internal/domain/minigame/aggregate.go",
    "chars": 23253,
    "preview": "package minigame\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n\t\"sync\"\n\t\"time\"\n)\n\n// MinigameAggregate 小游戏聚合根\ntype MinigameAggregate struc"
  },
  {
    "path": "internal/domain/minigame/entity.go",
    "chars": 29119,
    "preview": "package minigame\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\n// RewardType 奖励类型\ntype RewardType string\n\nconst (\n\tRewardTypeCoin     Rewa"
  },
  {
    "path": "internal/domain/minigame/errors.go",
    "chars": 27735,
    "preview": "package minigame\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\n// 错误代码常量\nconst (\n\tErrorCodeInvalidState        = \"INVALID_STATE\"\n\tErrorCod"
  },
  {
    "path": "internal/domain/minigame/events.go",
    "chars": 30484,
    "preview": "package minigame\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"time\"\n)\n\n// MinigameEvent 小游戏事件接口\ntype MinigameEvent interface {\n\tGetEven"
  },
  {
    "path": "internal/domain/minigame/repository.go",
    "chars": 27488,
    "preview": "package minigame\n\nimport (\n\t\"context\"\n\t\"time\"\n)\n\n// MinigameRepository 小游戏仓储接口\ntype MinigameRepository interface {\n\t// 基"
  },
  {
    "path": "internal/domain/minigame/service.go",
    "chars": 24040,
    "preview": "package minigame\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"time\"\n)\n\n// MinigameService 小游戏领域服务\ntype MinigameService struct {\n\tminiga"
  },
  {
    "path": "internal/domain/minigame/types.go",
    "chars": 6643,
    "preview": "package minigame\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\n// GameCategory 游戏分类\ntype GameCategory string\n\nconst (\n\tGameCategoryNormal "
  },
  {
    "path": "internal/domain/minigame/value_object.go",
    "chars": 29542,
    "preview": "package minigame\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\n// 小游戏类型相关值对象\n\n// GameType 游戏类型\ntype GameType int32\n\nconst (\n\tGameTypeSaveD"
  },
  {
    "path": "internal/domain/npc/aggregate.go",
    "chars": 16077,
    "preview": "package npc\n\nimport (\n\t\"time\"\n)\n\n// NPCAggregate NPC聚合�?\ntype NPCAggregate struct {\n\tid            string\n\tname         "
  },
  {
    "path": "internal/domain/npc/entity.go",
    "chars": 21854,
    "preview": "package npc\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\n// Dialogue 对话实体\ntype Dialogue struct {\n\tid          string\n\tname        string\n"
  },
  {
    "path": "internal/domain/npc/errors.go",
    "chars": 18785,
    "preview": "package npc\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"time\"\n)\n\n// 基础错误变量\nvar (\n\t// NPC相关错误\n\tErrNPCNotFound        = fmt.Errorf(\"NPC "
  },
  {
    "path": "internal/domain/npc/events.go",
    "chars": 20031,
    "preview": "package npc\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\n// DomainEvent 领域事件接口\ntype DomainEvent interface {\n\tGetEventID() string\n\tGetEven"
  },
  {
    "path": "internal/domain/npc/repository.go",
    "chars": 14679,
    "preview": "package npc\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\n// NPCRepository NPC仓储接口\ntype NPCRepository interface {\n\t// 基础CRUD操作\n\tSave(npc *"
  },
  {
    "path": "internal/domain/npc/service.go",
    "chars": 25032,
    "preview": "package npc\n\nimport (\n\t\"fmt\"\n\t\"math/rand\"\n\t\"time\"\n)\n\n// NPCService NPC领域服务\ntype NPCService struct {\n\tnpcTemplates      m"
  },
  {
    "path": "internal/domain/npc/value_object.go",
    "chars": 27981,
    "preview": "package npc\n\nimport (\n\t\"math\"\n\t\"time\"\n)\n\n// NPCType NPC类型\ntype NPCType int\n\nconst (\n\tNPCTypeVillager   NPCType = iota + "
  },
  {
    "path": "internal/domain/pet/aggregate.go",
    "chars": 11749,
    "preview": "package pet\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\n// PetAggregate 宠物聚合根\ntype PetAggregate struct {\n\tid         string\n\tplayerID   "
  },
  {
    "path": "internal/domain/pet/entity.go",
    "chars": 14608,
    "preview": "package pet\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\n// PetFragment 宠物碎片实体\ntype PetFragment struct {\n\tid           string\n\tplayerID  "
  },
  {
    "path": "internal/domain/pet/errors.go",
    "chars": 28500,
    "preview": "package pet\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n)\n\n// 宠物领域错误定义\n\n// 常用错误变量\nvar (\n\tErrPetNotFound = errors.New(\"pet not found\")\n)\n\n"
  },
  {
    "path": "internal/domain/pet/events.go",
    "chars": 21631,
    "preview": "package pet\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\n// 宠物相关事件定义\n\n// PetEvent 宠物事件基础接口\ntype PetEvent interface {\n\tGetEventID() string"
  },
  {
    "path": "internal/domain/pet/repository.go",
    "chars": 13656,
    "preview": "package pet\n\nimport (\n\t\"time\"\n)\n\n// PetRepository 宠物仓储接口\ntype PetRepository interface {\n\t// 基础CRUD操作\n\tSave(pet *PetAggre"
  },
  {
    "path": "internal/domain/pet/service.go",
    "chars": 13840,
    "preview": "package pet\n\nimport (\n\t\"math/rand\"\n\t\"time\"\n)\n\n// PetService 宠物领域服务\ntype PetService struct {\n\tpetTemplates      map[uint3"
  },
  {
    "path": "internal/domain/pet/value_object.go",
    "chars": 12917,
    "preview": "package pet\n\nimport (\n\t\"math/rand\"\n\t\"time\"\n)\n\n// PetCategory 宠物类别\ntype PetCategory int\n\nconst (\n\tPetCategoryFire   PetCa"
  },
  {
    "path": "internal/domain/player/beginner/aggregate.go",
    "chars": 7139,
    "preview": "package beginner\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"time\"\n)\n\n// BeginnerAggregate 新手聚合根\ntype BeginnerAggregate struct {\n\tplay"
  },
  {
    "path": "internal/domain/player/beginner/entity.go",
    "chars": 6988,
    "preview": "package beginner\n\nimport (\n\t// \"fmt\" // 未使用\n\t// \"strings\" // 未使用\n\t\"time\"\n\n\t\"github.com/google/uuid\"\n)\n\n// GuideStep 引导步骤"
  },
  {
    "path": "internal/domain/player/beginner/errors.go",
    "chars": 1249,
    "preview": "package beginner\n\nimport \"errors\"\n\n// 新手系统相关错误\nvar (\n\tErrInvalidGuide             = errors.New(\"invalid guide\")\n\tErrGuid"
  },
  {
    "path": "internal/domain/player/beginner/events.go",
    "chars": 10881,
    "preview": "package beginner\n\nimport (\n\t\"github.com/google/uuid\"\n\t\"time\"\n)\n\n// DomainEvent 领域事件接口\ntype DomainEvent interface {\n\tGetE"
  },
  {
    "path": "internal/domain/player/beginner/repository.go",
    "chars": 7288,
    "preview": "package beginner\n\nimport (\n\t\"context\"\n\t\"time\"\n)\n\n// BeginnerRepository 新手仓储接口\ntype BeginnerRepository interface {\n\t// Sa"
  },
  {
    "path": "internal/domain/player/beginner/service.go",
    "chars": 10859,
    "preview": "package beginner\n\nimport (\n\t\"time\"\n)\n\n// BeginnerService 新手领域服务\ntype BeginnerService struct {\n\tguideFactory     *GuideFa"
  },
  {
    "path": "internal/domain/player/beginner/value_object.go",
    "chars": 10688,
    "preview": "package beginner\n\nimport (\n\t\"strconv\"\n\t\"strings\"\n)\n\n// StepType 步骤类型\ntype StepType int\n\nconst (\n\tStepTypeDialog StepType"
  },
  {
    "path": "internal/domain/player/errors.go",
    "chars": 628,
    "preview": "package player\n\nimport \"greatestworks/internal/errors\"\n\n// 玩家领域错误定义 - 使用统一的错误处理机制\nvar (\n\tErrPlayerNotFound      = errors"
  },
  {
    "path": "internal/domain/player/events.go",
    "chars": 4206,
    "preview": "package player\n\nimport (\n\t\"time\"\n)\n\n// DomainEvent 领域事件接口\ntype DomainEvent interface {\n\tEventID() string\n\tEventType() st"
  },
  {
    "path": "internal/domain/player/hangup/aggregate.go",
    "chars": 8559,
    "preview": "package hangup\n\nimport (\n\t\"time\"\n)\n\n// HangupAggregate 挂机聚合根\ntype HangupAggregate struct {\n\tplayerID        string\n\tcurr"
  },
  {
    "path": "internal/domain/player/hangup/entity.go",
    "chars": 11063,
    "preview": "package hangup\n\nimport (\n\t\"time\"\n)\n\n// HangupLocation 挂机地点实体\ntype HangupLocation struct {\n\tid              string\n\tname "
  },
  {
    "path": "internal/domain/player/hangup/errors.go",
    "chars": 14323,
    "preview": "package hangup\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n)\n\n// 挂机系统相关错误定义\n\n// 挂机地点相关错误\nvar (\n\t// ErrInvalidHangupLocation 无效的挂机地点\n\tErrI"
  },
  {
    "path": "internal/domain/player/hangup/events.go",
    "chars": 15954,
    "preview": "package hangup\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\n// DomainEvent 领域事件接口\ntype DomainEvent interface {\n\tGetEventID() string\n\tGetE"
  },
  {
    "path": "internal/domain/player/hangup/repository.go",
    "chars": 14458,
    "preview": "package hangup\n\nimport (\n\t\"context\"\n\t\"time\"\n)\n\n// HangupRepository 挂机仓储接口\ntype HangupRepository interface {\n\t// Save 保存挂"
  },
  {
    "path": "internal/domain/player/hangup/service.go",
    "chars": 13447,
    "preview": "package hangup\n\nimport (\n\t\"fmt\"\n\t\"math\"\n\t\"time\"\n)\n\n// HangupService 挂机领域服务\ntype HangupService struct {\n\tconfig          "
  },
  {
    "path": "internal/domain/player/hangup/value_object.go",
    "chars": 11072,
    "preview": "package hangup\n\nimport (\n\t\"math/rand\"\n\t\"time\"\n)\n\n// LocationType 挂机地点类型\ntype LocationType int\n\nconst (\n\tLocationTypeUnkn"
  },
  {
    "path": "internal/domain/player/honor/aggregate.go",
    "chars": 8147,
    "preview": "package honor\n\nimport (\n\t\"time\"\n\t// \"github.com/google/uuid\" // 未使用\n)\n\n// HonorAggregate 荣誉聚合根\ntype HonorAggregate struc"
  },
  {
    "path": "internal/domain/player/honor/entity.go",
    "chars": 5877,
    "preview": "package honor\n\nimport (\n\t\"time\"\n\t// \"github.com/google/uuid\"\n)\n\n// Title 称号实体\ntype Title struct {\n\tid               stri"
  },
  {
    "path": "internal/domain/player/honor/errors.go",
    "chars": 8737,
    "preview": "package honor\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n)\n\n// 荣誉系统相关错误定义\n\n// 称号相关错误\nvar (\n\t// ErrInvalidTitle 无效的称号\n\tErrInvalidTitle = "
  },
  {
    "path": "internal/domain/player/honor/events.go",
    "chars": 10739,
    "preview": "package honor\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\n// DomainEvent 领域事件接口\ntype DomainEvent interface {\n\tGetEventID() string\n\tGetEv"
  },
  {
    "path": "internal/domain/player/honor/repository.go",
    "chars": 7237,
    "preview": "package honor\n\nimport \"context\"\n\n// HonorRepository 荣誉仓储接口\ntype HonorRepository interface {\n\t// Save 保存荣誉聚合根\n\tSave(ctx c"
  },
  {
    "path": "internal/domain/player/honor/service.go",
    "chars": 11047,
    "preview": "package honor\n\nimport (\n\t\"fmt\"\n\t// \"time\" // 未使用\n)\n\n// HonorService 荣誉领域服务\ntype HonorService struct {\n\ttitleTemplates   "
  },
  {
    "path": "internal/domain/player/honor/value_object.go",
    "chars": 9993,
    "preview": "package honor\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\n// TitleCategory 称号分类\ntype TitleCategory int\n\nconst (\n\tTitleCategoryUnknown   "
  },
  {
    "path": "internal/domain/player/player.go",
    "chars": 4698,
    "preview": "// Package player 玩家领域\npackage player\n\nimport (\n\t\"time\"\n\n\t\"github.com/google/uuid\"\n)\n\n// PlayerID 玩家ID值对象\ntype PlayerID "
  },
  {
    "path": "internal/domain/player/query.go",
    "chars": 2291,
    "preview": "package player\n\nimport \"time\"\n\n// PlayerQuery 玩家查询条件\ntype PlayerQuery struct {\n\t// 基础查询条件\n\tID       *PlayerID     `json:"
  },
  {
    "path": "internal/domain/player/repository.go",
    "chars": 752,
    "preview": "package player\n\nimport \"context\"\n\n// Repository 玩家仓储接口\ntype Repository interface {\n\t// Save 保存玩家\n\tSave(ctx context.Conte"
  },
  {
    "path": "internal/domain/player/service.go",
    "chars": 4255,
    "preview": "package player\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"math\"\n)\n\n// Service 玩家领域服务\ntype Service struct {\n\trepository Repository\n}\n\n"
  },
  {
    "path": "internal/domain/player/value_objects.go",
    "chars": 5661,
    "preview": "package player\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"regexp\"\n\t\"strings\"\n)\n\n// PlayerName 玩家名称值对象\ntype PlayerName struct {\n\tvalue "
  },
  {
    "path": "internal/domain/quest/errors.go",
    "chars": 3043,
    "preview": "package quest\n\nimport \"errors\"\n\nvar (\n\t// 任务管理器相关错误\n\tErrQuestManagerNotFound = errors.New(\"quest manager not found\")\n\tEr"
  },
  {
    "path": "internal/domain/quest/quest.go",
    "chars": 13747,
    "preview": "//nolint:staticcheck // Quest rich model contains fields reserved for future use; suppress U1000 unused field warnings i"
  },
  {
    "path": "internal/domain/quest/repository.go",
    "chars": 8690,
    "preview": "package quest\n\nimport (\n\t\"context\"\n\t\"time\"\n)\n\n// Repository 任务仓储接口\ntype Repository interface {\n\t// 基础CRUD操作\n\tSave(ctx co"
  },
  {
    "path": "internal/domain/ranking/aggregate.go",
    "chars": 19021,
    "preview": "package ranking\n\nimport (\n\t\"fmt\"\n\t\"sort\"\n\t\"sync\"\n\t\"time\"\n)\n\n// RankingAggregate 排行榜聚合根\ntype RankingAggregate struct {\n\t/"
  },
  {
    "path": "internal/domain/ranking/entity.go",
    "chars": 20451,
    "preview": "package ranking\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\t\"time\"\n)\n\n// RankEntry 排行榜条目实体\ntype RankEntry struct {\n\t// 基础信息\n\tID       stri"
  },
  {
    "path": "internal/domain/ranking/errors.go",
    "chars": 26420,
    "preview": "package ranking\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\n// 排行榜领域错误定义\n\n// RankingError 排行榜错误基础接口\ntype RankingError interface {\n\terror"
  },
  {
    "path": "internal/domain/ranking/events.go",
    "chars": 27901,
    "preview": "package ranking\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\n// 排行榜相关事件定义\n\n// RankingEvent 排行榜事件基础接口\ntype RankingEvent interface {\n\tGetEv"
  }
]

// ... and 253 more files (download for full content)

About this extraction

This page contains the full source code of the phuhao00/greatestworks GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 453 files (4.3 MB), approximately 1.1M tokens, and a symbol index with 14347 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!