feat: expand companion platform, device controls, and memoir workflows
ci / verify (push) Canceled after 0s

Add customer and operator login, BLE provisioning, device fleet controls, call memory, memoir generation, and refreshed family and maintenance portals. Include API contracts, migrations, firmware sources, tests, assets, and deployment documentation.
This commit is contained in:
Codex Local
2026-10-08 10:06:44 +08:00
parent 98fb2965d0
commit bf1233d5df
861 changed files with 94614 additions and 3209 deletions
+45 -3
View File
@@ -23,6 +23,11 @@ const (
)
type Config struct {
volcAccount map[string]string
TOSRecordingAccountID string
TOSRecordingBucket string
TOSRecordingRegion string
TOSRecordingPlaybackEndpoint string
Onboarding OnboardingConfig
VikingResourceID string
VikingCollectionName string
@@ -121,7 +126,15 @@ type Config struct {
ArkBaseURL string
ArkAPIKey string
ArkContentModel string
ArkMemoirModel string
ArkMemoirImageModel string
ArkRequestTimeout time.Duration
DifyEnabled bool
DifyBaseURL string
DifyBridgeURL string
DifyBridgeSecret string
DifyExtractionAPIKey string
DifyMemoirAPIKey string
ContentSafetyProvider string
ContentSafetyEndpoint string
ContentSafetyAPIKey string
@@ -145,6 +158,10 @@ func Load(serviceName string) (Config, error) {
return Config{}, errors.New("service name is required")
}
account, err := loadVolcAccount()
if err != nil {
return Config{}, err
}
redisDB, err := intEnv("REDIS_DB", 0)
if err != nil {
return Config{}, err
@@ -225,6 +242,10 @@ func Load(serviceName string) (Config, error) {
if err != nil {
return Config{}, err
}
difyEnabled, err := boolEnv("DIFY_ENABLED", false)
if err != nil {
return Config{}, err
}
contentSafetyTimeout, err := durationEnv("CONTENT_SAFETY_TIMEOUT", 5*time.Second)
if err != nil {
return Config{}, err
@@ -254,14 +275,15 @@ func Load(serviceName string) (Config, error) {
return Config{}, err
}
environment := stringEnv("APP_ENV", EnvironmentLocal)
secretValues, err := loadSecretValues(
"ONBOARDING_MASTER_KEY", "ONBOARDING_SMS_GATEWAY_TOKEN",
secretValues, err := loadSecretValuesWithAccount(account,
"ONBOARDING_MASTER_KEY", "ONBOARDING_SMS_GATEWAY_TOKEN", "TENCENT_SMS_SECRET_ID", "TENCENT_SMS_SECRET_KEY", "WECHAT_MINI_APP_SECRET",
"DATABASE_URL", "REDIS_PASSWORD", "DEVICE_LOCAL_SECRET", "DEVICE_CREDENTIAL_MASTER_KEY", "MODEL_CREDENTIAL_MASTER_KEY", "RTC_APP_KEY", "RTC_TOKEN_SIGNING_SECRET",
"CURSOR_SIGNING_SECRET", "SHARE_TOKEN_SIGNING_SECRET", "PROVIDER_CALLBACK_SECRET", "PLATFORM_HEALTH_CALLBACK_SECRET",
"VOLC_SUBTITLE_CALLBACK_SECRET", "VIKING_MEMORY_API_KEY",
"MOCK_PROVIDER_API_KEY", "VOLC_ACCESS_KEY_ID", "VOLC_SECRET_ACCESS_KEY", "VOLC_SESSION_TOKEN",
"VOLC_HARDWARE_PRODUCT_SECRET", "VOLC_HARDWARE_DEVICE_CREDENTIAL_MASTER_KEY",
"OBJECT_STORE_ACCESS_KEY", "OBJECT_STORE_SECRET_KEY", "ALERT_WEBHOOK_SECRET", "ARK_API_KEY", "CONTENT_SAFETY_API_KEY", "MEMORY_TOOL_SIGNING_SECRET", "PROVIDER_MEMORY_API_KEY",
"DIFY_BRIDGE_SECRET", "DIFY_EXTRACTION_API_KEY", "DIFY_MEMOIR_API_KEY",
)
if err != nil {
return Config{}, err
@@ -404,8 +426,16 @@ func Load(serviceName string) (Config, error) {
ContentGenerator: stringEnv("CONTENT_GENERATOR", "local"),
ArkBaseURL: stringEnv("ARK_BASE_URL", "https://ark.cn-beijing.volces.com/api/v3"),
ArkAPIKey: secretValues["ARK_API_KEY"],
ArkContentModel: strings.TrimSpace(os.Getenv("ARK_CONTENT_MODEL")),
ArkContentModel: stringEnv("ARK_CONTENT_MODEL", "deepseek-v4-1-flash-260910"),
ArkMemoirModel: stringEnv("ARK_MEMOIR_MODEL", "doubao-seed-evolving"),
ArkMemoirImageModel: stringEnv("ARK_MEMOIR_IMAGE_MODEL", "doubao-seedream-5-0-pro-260628"),
ArkRequestTimeout: arkRequestTimeout,
DifyEnabled: difyEnabled,
DifyBaseURL: stringEnv("DIFY_BASE_URL", "http://story-dify-nginx/v1"),
DifyBridgeURL: stringEnv("DIFY_BRIDGE_URL", "http://model-bridge:8188"),
DifyBridgeSecret: secretValues["DIFY_BRIDGE_SECRET"],
DifyExtractionAPIKey: secretValues["DIFY_EXTRACTION_API_KEY"],
DifyMemoirAPIKey: secretValues["DIFY_MEMOIR_API_KEY"],
ContentSafetyProvider: stringEnv("CONTENT_SAFETY_PROVIDER", "local"),
ContentSafetyEndpoint: strings.TrimSpace(os.Getenv("CONTENT_SAFETY_ENDPOINT")),
ContentSafetyAPIKey: secretValues["CONTENT_SAFETY_API_KEY"],
@@ -491,6 +521,15 @@ func Load(serviceName string) (Config, error) {
if err != nil {
return Config{}, err
}
if err = cfg.Onboarding.loadTencentSMSFile(serviceName); err != nil {
return Config{}, err
}
if err = cfg.Onboarding.loadTencentCaptchaFile(serviceName); err != nil {
return Config{}, err
}
if err := cfg.applyVolcAccount(account); err != nil {
return Config{}, err
}
if err := cfg.Validate(); err != nil {
return Config{}, err
}
@@ -668,6 +707,9 @@ func (c Config) Validate() error {
}
}
if c.ServiceName == "api" || c.ServiceName == "worker" {
if c.DifyEnabled && (!isAbsoluteHTTPURL(c.DifyBaseURL) || !isAbsoluteHTTPURL(c.DifyBridgeURL) || c.DifyBridgeSecret == "" || c.DifyExtractionAPIKey == "" || c.DifyMemoirAPIKey == "") {
return errors.New("Dify workflows require internal URLs and extraction, memoir, bridge credentials")
}
if c.EmbeddingProvider != "local" && c.EmbeddingProvider != "ark" {
return errors.New("EMBEDDING_PROVIDER must be local or ark")
}