Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .agents/skills/mas-plan-schedule/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ description: Use when adding, refactoring, or reviewing AUTO-MAS plan schedule t
## Objective
Keep AUTO-MAS plan schedules easy to extend without turning them into a generic field engine. Each schedule type owns its data model, config class, table UI, and account consumption path. Shared code should only cover type registration, API dispatch, list selection, and CRUD orchestration.

`UniversalPlanConfig` describes General scripts only. Keep its documentation and regression tests scoped to that feature; define specialized plan behavior in the owning adapter.

## Current Architecture
Backend has one shared multi-config collection and one lightweight registration table.

Expand Down
14 changes: 13 additions & 1 deletion app/api/plan.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@
from app.models.schema import OutBase
from app.utils import get_logger

OkwwPlanConfig = ConfigPayload[_config_models.OkwwPlanConfig]
OkwwPlanConfigInput = StrictConfigInput[_config_models.OkwwPlanConfig]

OkNtePlanConfig = ConfigPayload[_config_models.OkNtePlanConfig]
OkNtePlanConfigInput = StrictConfigInput[_config_models.OkNtePlanConfig]

Expand All @@ -58,6 +61,7 @@
"MSSPlanConfig",
"UniversalPlanConfig",
"OkNtePlanConfig",
"OkwwPlanConfig",
]


Expand All @@ -67,7 +71,13 @@ class PlanIndexItem(BaseModel):


PlanCreateType = Literal[
"MaaPlan", "MaaEndPlan", "BAAHPlan", "MSSPlan", "UniversalPlan", "OkNtePlan"
"MaaPlan",
"MaaEndPlan",
"BAAHPlan",
"MSSPlan",
"UniversalPlan",
"OkNtePlan",
"OkwwPlan",
]


Expand All @@ -78,6 +88,7 @@ class PlanIndexItem(BaseModel):
| MSSPlanConfig
| UniversalPlanConfig
| OkNtePlanConfig
| OkwwPlanConfig
)
type PlanConfigDataInput = (
MaaPlanConfigInput
Expand All @@ -86,6 +97,7 @@ class PlanIndexItem(BaseModel):
| MSSPlanConfigInput
| UniversalPlanConfigInput
| OkNtePlanConfigInput
| OkwwPlanConfigInput
)


Expand Down
12 changes: 10 additions & 2 deletions app/core/config/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@
OkNtePlanConfig,
OkNteUserConfig,
OkwwConfig,
OkwwPlanConfig,
OkwwUserConfig,
PlanConfigType,
QueueConfig,
Expand Down Expand Up @@ -1631,7 +1632,13 @@ async def reorder_user(self, script_id: str, index_list: list[str]) -> None:
async def add_plan(
self,
script: Literal[
"MaaPlan", "MaaEndPlan", "BAAHPlan", "MSSPlan", "UniversalPlan", "OkNtePlan"
"MaaPlan",
"MaaEndPlan",
"BAAHPlan",
"MSSPlan",
"UniversalPlan",
"OkNtePlan",
"OkwwPlan",
],
*,
payload: dict[str, Any] | None = None,
Expand All @@ -1643,7 +1650,8 @@ async def add_plan(
| BAAHPlanConfig
| MSSPlanConfig
| UniversalPlanConfig
| OkNtePlanConfig,
| OkNtePlanConfig
| OkwwPlanConfig,
]:
"""添加计划表"""

Expand Down
10 changes: 9 additions & 1 deletion app/models/config/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,14 @@ class _PlanRegistration(TypedDict):


PLAN_BOOK: dict[str, _PlanRegistration] = {
"OkwwPlanConfig": {
"create_type": "OkwwPlan",
"config_class": OkwwPlanConfig,
"consumer": PLAN_CONSUMER_VALUES[6],
"script_class": OkwwConfig,
"field_group": "Info",
"field_name": "PlanMode",
},
"OkNtePlanConfig": {
"create_type": "OkNtePlan",
"config_class": OkNtePlanConfig,
Expand All @@ -74,7 +82,7 @@ class _PlanRegistration(TypedDict):
"create_type": "UniversalPlan",
"config_class": UniversalPlanConfig,
"consumer": PLAN_CONSUMER_VALUES[4],
# 只服务通用脚本:专项各自的整份配置由各自计划承载
# General 的完整原生配置轮换计划
"script_class": GeneralConfig,
"field_group": "Info",
"field_name": "PlanMode",
Expand Down
93 changes: 91 additions & 2 deletions app/models/config/plan.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
from typing import Annotated, Literal
from uuid import UUID

from pydantic import Field
from pydantic import BeforeValidator, ConfigDict, Field, create_model

from app.config import (
ConfigGroup,
Expand All @@ -37,6 +37,7 @@

from .base import DomainEntry
from .shared import (
OkwwTaskFields,
default_baah_plan_key,
none_as,
normalize_baah_plan_key,
Expand Down Expand Up @@ -680,7 +681,7 @@ def normalize_payload(cls, data):


class UniversalPlanConfig(PlanDaysConfig):
"""完整原生配置的按日轮换;初版由通用脚本消费。"""
"""通用脚本完整原生配置的按日轮换。"""

class InfoFields(ConfigGroup):
Name: str = Field(default="新通用脚本计划表", description="计划表名称")
Expand Down Expand Up @@ -767,19 +768,107 @@ class InfoFields(ConfigGroup):
Info: InfoFields = Field(default_factory=InfoFields)


# 日常字段只声明一次;计划中的空值表示继承,不把默认值当作当天覆写。
OkwwPlanKey = create_model(
"OkwwPlanKey",
__config__=ConfigDict(extra="forbid"),
**{
name: (
Annotated[field.annotation | None, *metadata]
if (
metadata := [
item
for item in field.metadata
if not isinstance(item, BeforeValidator)
]
)
else field.annotation | None,
Field(default=None, description=field.description),
)
for name, field in OkwwTaskFields.model_fields.items()
},
)


class OkwwPlanConfig(WeeklyKeyPlan):
"""按日叠加日常体力参数,其他账号配置保持原有来源。"""

class DayFields(ConfigGroup):
Key: OkwwPlanKey = Field(
default_factory=lambda: OkwwPlanKey(
WhichToFarm="Tacet Suppression",
WhichTacetSuppressionToFarm=1,
WhichForgeryChallengeToFarm=1,
MaterialSelection="Shell Credit",
),
description="体力计划参数",
)

ALL: DayFields = Field(default_factory=DayFields)
Monday: DayFields = Field(default_factory=DayFields)
Tuesday: DayFields = Field(default_factory=DayFields)
Wednesday: DayFields = Field(default_factory=DayFields)
Thursday: DayFields = Field(default_factory=DayFields)
Friday: DayFields = Field(default_factory=DayFields)
Saturday: DayFields = Field(default_factory=DayFields)
Sunday: DayFields = Field(default_factory=DayFields)
Day1: DayFields = Field(default_factory=DayFields)
Day2: DayFields = Field(default_factory=DayFields)
Day3: DayFields = Field(default_factory=DayFields)
Day4: DayFields = Field(default_factory=DayFields)
Day5: DayFields = Field(default_factory=DayFields)
Day6: DayFields = Field(default_factory=DayFields)
Day7: DayFields = Field(default_factory=DayFields)
Day8: DayFields = Field(default_factory=DayFields)
Day9: DayFields = Field(default_factory=DayFields)
Day10: DayFields = Field(default_factory=DayFields)
Day11: DayFields = Field(default_factory=DayFields)
Day12: DayFields = Field(default_factory=DayFields)
Day13: DayFields = Field(default_factory=DayFields)
Day14: DayFields = Field(default_factory=DayFields)
Day15: DayFields = Field(default_factory=DayFields)
Day16: DayFields = Field(default_factory=DayFields)
Day17: DayFields = Field(default_factory=DayFields)
Day18: DayFields = Field(default_factory=DayFields)
Day19: DayFields = Field(default_factory=DayFields)
Day20: DayFields = Field(default_factory=DayFields)
Day21: DayFields = Field(default_factory=DayFields)
Day22: DayFields = Field(default_factory=DayFields)
Day23: DayFields = Field(default_factory=DayFields)
Day24: DayFields = Field(default_factory=DayFields)
Day25: DayFields = Field(default_factory=DayFields)
Day26: DayFields = Field(default_factory=DayFields)
Day27: DayFields = Field(default_factory=DayFields)
Day28: DayFields = Field(default_factory=DayFields)
Day29: DayFields = Field(default_factory=DayFields)
Day30: DayFields = Field(default_factory=DayFields)
Day31: DayFields = Field(default_factory=DayFields)

class InfoFields(ConfigGroup):
Name: str = Field(default="新 Okww 计划表", description="计划表名称")
Mode: Literal["ALL", "Weekly", "Rotate"] = Field(
default="Weekly", description="计划模式"
)
RotateDays: int = Field(default=7, ge=1, le=31, description="轮换天数")

Info: InfoFields = Field(default_factory=InfoFields)


type PlanConfigType = (
MaaPlanConfig
| MaaEndPlanConfig
| BAAHPlanConfig
| MSSPlanConfig
| UniversalPlanConfig
| OkNtePlanConfig
| OkwwPlanConfig
)


__all__ = [
"PlanConfigType",
"OkNtePlanConfig",
"OkwwPlanConfig",
"UniversalPlanConfig",
"WeeklyKeyPlan",
"MaaPlanConfig",
Expand Down
49 changes: 13 additions & 36 deletions app/models/config/script.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,11 +64,13 @@
MaaPlanConfig,
MSSPlanConfig,
OkNtePlanConfig,
OkwwPlanConfig,
UniversalPlanConfig,
)
from .queue import Webhook
from .shared import (
_BGI_LEGACY_SERVERS_TO_RESOURCE,
OkwwTaskFields,
SRAProfileName,
_migrate_baah_event_first,
_migrate_bgi_account_switch_default,
Expand Down Expand Up @@ -2947,6 +2949,16 @@ class DataFields(ConfigGroup):
Data: DataFields = Field(default_factory=DataFields)

class InfoFields(ConfigGroup):
PlanMode: Annotated[
UUID | Literal["Fixed"],
ref(
"PlanConfig",
default="Fixed",
allow_values=("Fixed",),
entry_types=(OkwwPlanConfig,),
),
] = Field(default="Fixed", description="固定配置或 Okww 计划表")

Base: Annotated[
Literal["shared", "independent", "native"],
legacy(
Expand Down Expand Up @@ -3044,19 +3056,7 @@ class NotifyFields(ConfigGroup):

Notify: NotifyFields = Field(default_factory=NotifyFields)

class TaskFields(ConfigGroup):
AdditionalTasks: list[
Literal[
"Check Weekly Garden",
"Auto Farm all Nightmare Nest",
"Merge Echo If discarded > 1000",
"Teleport and Farm 4C Echo",
]
] = Field(
default_factory=lambda: ["Check Weekly Garden"],
description="每日任务后运行的附加任务",
)

class TaskFields(OkwwTaskFields):
IfCustomArguments: bool = Field(
default_factory=lambda: False, description="启用自定义启动参数"
)
Expand All @@ -3065,29 +3065,6 @@ class TaskFields(ConfigGroup):
description="自定义启动参数,开启后原样传递给 ok-ww",
)

FarmNightmareNestForDailyEcho: bool = Field(
default_factory=lambda: True, description="使用梦魇巢穴完成日常声骸"
)

MaterialSelection: Literal["Resonator EXP", "Weapon EXP", "Shell Credit"] = (
Field(default_factory=lambda: "Shell Credit", description="模拟领域材料")
)

WhichForgeryChallengeToFarm: Annotated[int, Field(ge=1, le=99), none_as(1)] = (
Field(default_factory=lambda: 1, description="凝素领域序号")
)

WhichTacetSuppressionToFarm: Annotated[int, Field(ge=1, le=99), none_as(1)] = (
Field(default_factory=lambda: 1, description="无音区序号")
)

WhichToFarm: Literal[
"Tacet Suppression", "Forgery Challenge", "Simulation Challenge"
] = Field(
default_factory=lambda: "Tacet Suppression",
description="每日任务体力用途(仅日常任务且开启覆写常规配置时生效)",
)

Task: TaskFields = Field(default_factory=TaskFields)
Notify_CustomWebhooks: ConfigCollection[Webhook] = collection(Webhook)

Expand Down
43 changes: 41 additions & 2 deletions app/models/config/shared.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,11 @@
import json
from copy import deepcopy
from datetime import datetime, timezone, tzinfo
from typing import TYPE_CHECKING, Annotated, Any, cast
from typing import TYPE_CHECKING, Annotated, Any, Literal, cast

from pydantic import BeforeValidator, TypeAdapter
from pydantic import BeforeValidator, Field, TypeAdapter

from app.config import ConfigGroup

if TYPE_CHECKING:
from .script import UserConfigType
Expand Down Expand Up @@ -536,3 +538,40 @@ def _migrate_baah_event_first(data: dict) -> tuple[dict, bool]:
"validate_baah_plan_key",
"validate_maaend_plan_key",
]


class OkwwTaskFields(ConfigGroup):
AdditionalTasks: list[
Literal[
"Check Weekly Garden",
"Auto Farm all Nightmare Nest",
"Merge Echo If discarded > 1000",
"Teleport and Farm 4C Echo",
]
] = Field(
default_factory=lambda: ["Check Weekly Garden"],
description="每日任务后运行的附加任务",
)

FarmNightmareNestForDailyEcho: bool = Field(
default_factory=lambda: True, description="使用梦魇巢穴完成日常声骸"
)

MaterialSelection: Literal["Resonator EXP", "Weapon EXP", "Shell Credit"] = Field(
default_factory=lambda: "Shell Credit", description="模拟领域材料"
)

WhichForgeryChallengeToFarm: Annotated[int, Field(ge=1, le=99), none_as(1)] = Field(
default_factory=lambda: 1, description="凝素领域序号"
)

WhichTacetSuppressionToFarm: Annotated[int, Field(ge=1, le=99), none_as(1)] = Field(
default_factory=lambda: 1, description="无音区序号"
)

WhichToFarm: Literal[
"Tacet Suppression", "Forgery Challenge", "Simulation Challenge"
] = Field(
default_factory=lambda: "Tacet Suppression",
description="每日任务体力用途(日常任务按账号覆写或绑定计划生效)",
)
4 changes: 3 additions & 1 deletion app/models/schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -370,7 +370,9 @@ class EmulatorDeleteIn(BaseModel):
emulatorId: str = Field(..., description="模拟器 ID")


PlanComboxConsumer = Literal["maa", "maaend", "baah", "mss", "universal", "oknte"]
PlanComboxConsumer = Literal[
"maa", "maaend", "baah", "mss", "universal", "oknte", "okww"
]


class MaaEndAutoEssencePlanKey(BaseModel):
Expand Down
Loading
Loading