@@ -11,7 +11,7 @@ import {
1111 resolveThemeMode ,
1212 unregisterCustomAccent ,
1313} from '@/themes' ;
14- import type { LegacyActionConfig , MxuConfig , RecentlyClosedInstance } from '@/types/config' ;
14+ import type { LegacyActionConfig , MxuConfig , RecentlyClosedInstance , SavedTask } from '@/types/config' ;
1515import {
1616 clampAddTaskPanelHeight ,
1717 DEFAULT_MAX_LOGS_PER_INSTANCE ,
@@ -40,6 +40,10 @@ import {
4040 resolveCompatTaskDef ,
4141} from '@/types/pretasks' ;
4242import { decryptCdk , encryptCdk } from '@/utils/cdkCrypto' ;
43+ import {
44+ decryptPasswordOptionValues ,
45+ encryptPasswordOptionValues ,
46+ } from '@/utils/passwordOptionValues' ;
4347import { loggers } from '@/utils/logger' ;
4448import { findSwitchCase } from '@/utils/optionHelpers' ;
4549import { create } from 'zustand' ;
@@ -109,6 +113,25 @@ function cleanOptionValues(
109113 return sanitizeOptionValues ( optionValues , pi . option , ( message ) => loggers . config . warn ( message ) ) ;
110114}
111115
116+ function restoreOptionValuesFromConfig (
117+ optionValues : Record < string , OptionValue > ,
118+ pi : ProjectInterface | null ,
119+ projectName ?: string ,
120+ ) : Record < string , OptionValue > {
121+ const cleaned = cleanOptionValues ( optionValues , pi ) ;
122+ if ( ! pi ?. option ) return cleaned ;
123+ return decryptPasswordOptionValues ( cleaned , pi . option , projectName ) ;
124+ }
125+
126+ function persistOptionValues (
127+ optionValues : Record < string , OptionValue > ,
128+ pi : ProjectInterface | null ,
129+ projectName ?: string ,
130+ ) : Record < string , OptionValue > {
131+ if ( ! pi ?. option ) return optionValues ;
132+ return encryptPasswordOptionValues ( optionValues , pi . option , projectName ) ;
133+ }
134+
112135function updateSelectedName (
113136 selectedNames : Record < string , string > ,
114137 instanceId : string ,
@@ -1235,7 +1258,11 @@ export const useAppStore = create<AppState>()(
12351258 // pretask 伪任务的 option 引用顶层 pi.option
12361259 if ( isPretaskName ( t . taskName ) ) {
12371260 const pretaskItem = getPretaskItem ( pi , t . taskName ) ;
1238- const cleanedValues = cleanOptionValues ( t . optionValues , pi ) ;
1261+ const cleanedValues = restoreOptionValuesFromConfig (
1262+ t . optionValues ,
1263+ pi ,
1264+ get ( ) . projectInterface ?. name ,
1265+ ) ;
12391266 const defaultValues =
12401267 pretaskItem ?. option && pi ?. option
12411268 ? initializeAllOptionValues ( pretaskItem . option , pi . option )
@@ -1256,7 +1283,11 @@ export const useAppStore = create<AppState>()(
12561283 }
12571284
12581285 const taskDef = pi ?. task . find ( ( td ) => td . name === t . taskName ) ;
1259- const cleanedValues = cleanOptionValues ( t . optionValues , pi ) ;
1286+ const cleanedValues = restoreOptionValuesFromConfig (
1287+ t . optionValues ,
1288+ pi ,
1289+ get ( ) . projectInterface ?. name ,
1290+ ) ;
12601291 // 为缺失的 option 添加默认值(根据 default_case)
12611292 const defaultValues =
12621293 taskDef ?. option && pi ?. option
@@ -1437,7 +1468,21 @@ export const useAppStore = create<AppState>()(
14371468 stopTasks : 'F11' ,
14381469 globalEnabled : false ,
14391470 } ,
1440- recentlyClosed : config . recentlyClosed || [ ] ,
1471+ recentlyClosed : ( config . recentlyClosed || [ ] ) . map ( ( rc ) => ( {
1472+ ...rc ,
1473+ tasks : rc . tasks . map ( ( t ) =>
1474+ isMxuSpecialTask ( t . taskName )
1475+ ? t
1476+ : {
1477+ ...t ,
1478+ optionValues : restoreOptionValuesFromConfig (
1479+ t . optionValues ,
1480+ pi ,
1481+ pi ?. name ,
1482+ ) ,
1483+ } ,
1484+ ) ,
1485+ } ) ) ,
14411486 // 记录新增任务,并在有新增时自动展开添加任务面板
14421487 newTaskNames : detectedNewTaskNames ,
14431488 showAddTaskPanel : detectedNewTaskNames . length > 0 ,
@@ -1446,13 +1491,14 @@ export const useAppStore = create<AppState>()(
14461491 // 全局任务设置值:以 global_option 的默认值为基底,合并已保存值(保存值优先)
14471492 globalOptionValues : ( ( ) => {
14481493 const globalKeys = pi ?. global_option ;
1494+ const projectName = pi ?. name ;
14491495 if ( ! globalKeys || globalKeys . length === 0 || ! pi ?. option ) {
1450- return cleanOptionValues ( config . globalOptionValues || { } , pi ) ;
1496+ return restoreOptionValuesFromConfig ( config . globalOptionValues || { } , pi , projectName ) ;
14511497 }
14521498 const defaults = initializeAllOptionValues ( globalKeys , pi . option ) ;
14531499 return {
14541500 ...defaults ,
1455- ...cleanOptionValues ( config . globalOptionValues || { } , pi ) ,
1501+ ...restoreOptionValuesFromConfig ( config . globalOptionValues || { } , pi , projectName ) ,
14561502 } ;
14571503 } ) ( ) ,
14581504 } ) ;
@@ -2047,7 +2093,7 @@ export const useAppStore = create<AppState>()(
20472093 customName : t . customName ,
20482094 enabled : t . enabled ,
20492095 enabledByController : t . enabledByController ? { ...t . enabledByController } : undefined ,
2050- optionValues : cleanOptionValues ( t . optionValues , pi ) ,
2096+ optionValues : restoreOptionValuesFromConfig ( t . optionValues , pi , pi ?. name ) ,
20512097 expanded : false ,
20522098 } ) ) ,
20532099 isRunning : false ,
@@ -2295,6 +2341,13 @@ const _isWebUI = !isTauri();
22952341// 生成配置用于保存
22962342function generateConfig ( ) : MxuConfig {
22972343 const state = useAppStore . getState ( ) ;
2344+ const pi = state . projectInterface ;
2345+ const projectName = pi ?. name ;
2346+ const persistTasks = ( tasks : SavedTask [ ] ) : SavedTask [ ] =>
2347+ tasks . map ( ( t ) => ( {
2348+ ...t ,
2349+ optionValues : persistOptionValues ( t . optionValues , pi , projectName ) ,
2350+ } ) ) ;
22982351 return {
22992352 version : '1.0' ,
23002353 instances : state . instances . map ( ( inst ) => ( {
@@ -2305,18 +2358,20 @@ function generateConfig(): MxuConfig {
23052358 controllerName : inst . controllerName ,
23062359 resourceName : inst . resourceName ,
23072360 savedDevice : inst . savedDevice ,
2308- tasks : inst . selectedTasks . map ( ( t ) => ( {
2309- id : t . id ,
2310- taskName : t . taskName ,
2311- customName : t . customName ,
2312- enabled : t . enabled ,
2313- enabledByController : cacheTaskEnabledForController (
2314- t . enabledByController ,
2315- inst . controllerName ,
2316- t . enabled ,
2317- ) ,
2318- optionValues : t . optionValues ,
2319- } ) ) ,
2361+ tasks : persistTasks (
2362+ inst . selectedTasks . map ( ( t ) => ( {
2363+ id : t . id ,
2364+ taskName : t . taskName ,
2365+ customName : t . customName ,
2366+ enabled : t . enabled ,
2367+ enabledByController : cacheTaskEnabledForController (
2368+ t . enabledByController ,
2369+ inst . controllerName ,
2370+ t . enabled ,
2371+ ) ,
2372+ optionValues : t . optionValues ,
2373+ } ) ) ,
2374+ ) ,
23202375 schedulePolicies : inst . schedulePolicies ,
23212376 preActions : inst . preActions ,
23222377 } ) ) ,
@@ -2368,8 +2423,11 @@ function generateConfig(): MxuConfig {
23682423 customAccents : ba ?. customAccents ?? state . customAccents ,
23692424 } ;
23702425 } ) ( ) ,
2371- globalOptionValues : state . globalOptionValues ,
2372- recentlyClosed : state . recentlyClosed ,
2426+ globalOptionValues : persistOptionValues ( state . globalOptionValues , pi , projectName ) ,
2427+ recentlyClosed : state . recentlyClosed . map ( ( rc ) => ( {
2428+ ...rc ,
2429+ tasks : persistTasks ( rc . tasks ) ,
2430+ } ) ) ,
23732431 interfaceTaskSnapshot : state . projectInterface ?. task . map ( ( t ) => t . name ) || [ ] ,
23742432 newTaskNames : state . newTaskNames ,
23752433 lastActiveInstanceId : state . activeInstanceId || undefined ,
0 commit comments