dsh-mnemon 0.5.37 → 0.5.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/repair-legacy-session.mjs +86 -10
- package/lib/bundle.js +1 -1
- package/lib/client.js +485 -116
- package/lib/core.js +1 -1
- package/lib/index.js +1177 -551
- package/lib/{runtime-zuuBe8x1.js → runtime-0u6dOiF9.js} +33 -1
- package/lib/{starter-resolution-DYeYvfwr.js → starter-resolution-C3yJawlA.js} +5 -5
- package/lib/starter.js +1 -1
- package/lib/testing.js +1 -1
- package/lib/types/src/client/locales.d.ts +15 -0
- package/lib/types/src/client/page-client.d.ts +3 -1
- package/lib/types/src/client/source-contracts.d.ts +6 -1
- package/lib/types/src/host/protocol.d.ts +13 -2
- package/package.json +39 -39
package/lib/client.js
CHANGED
|
@@ -303,6 +303,7 @@ window.__ModuleLoader__.load({
|
|
|
303
303
|
const DEFAULT_IDLE_REVIEW = {
|
|
304
304
|
enabled: true,
|
|
305
305
|
runtimeMemory: true,
|
|
306
|
+
persistWatermark: false,
|
|
306
307
|
provider: "spawn",
|
|
307
308
|
fallback: "spawn",
|
|
308
309
|
agentTeams: "pause",
|
|
@@ -315,6 +316,7 @@ window.__ModuleLoader__.load({
|
|
|
315
316
|
evolution: false,
|
|
316
317
|
allowCreate: true,
|
|
317
318
|
allowUpdate: true,
|
|
319
|
+
targetScope: "user",
|
|
318
320
|
autoBacktest: true,
|
|
319
321
|
hints: true,
|
|
320
322
|
sidebar: false,
|
|
@@ -2362,6 +2364,9 @@ window.__ModuleLoader__.load({
|
|
|
2362
2364
|
"common.showMore": "再显示 {count} 条",
|
|
2363
2365
|
"header.backToConversation": "返回会话",
|
|
2364
2366
|
"header.configure": "配置",
|
|
2367
|
+
"header.noticeSummary": "提示 {count} 条 · {labels}",
|
|
2368
|
+
"header.noticeRemoteReadOnly": "远程只读",
|
|
2369
|
+
"header.noticeIdleReview": "空闲审查",
|
|
2365
2370
|
"header.compositionHint": "点击前往配置调整组合。",
|
|
2366
2371
|
"header.checking": "检查中",
|
|
2367
2372
|
"header.connected": "已连接",
|
|
@@ -2480,6 +2485,13 @@ window.__ModuleLoader__.load({
|
|
|
2480
2485
|
"status.reviewFailedDetail": "本轮记忆检查未完成,不会自动重放。后续审查受冷却时间和会话次数限制。",
|
|
2481
2486
|
"status.reviewPartial": "已有写入提交;请按下列回执核对,未回滚。",
|
|
2482
2487
|
"status.reviewTeamPaused": "Agent Teams 工具在役时按兼容设置暂停空闲审查。如需继续审查,可在“插件 → 可组合记忆”页面的空闲审查中选择“受限任务 Agent 审查”。召回与主动写入设置不变。",
|
|
2488
|
+
"status.reviewToolAccessPaused": "自动审查所需的结果提交工具当前不可用,已跳过本轮,不消耗审查次数。后续符合条件的对话轮次会重新检查。请检查当前会话的工具限制或审批设置。",
|
|
2489
|
+
"status.reviewWatermarkUsage": "本会话审查尝试:{attempts} / {max}(已恢复 {restored} 次)。",
|
|
2490
|
+
"status.reviewWatermarkNext": "下次审查不早于 {time};仍需新的合格对话检查点。",
|
|
2491
|
+
"status.reviewWatermarkPaused": "自动审查已暂停:无法读取或保存持久化限额。",
|
|
2492
|
+
"status.reviewWatermarkRecovery": "停止使用此存储根目录的 Host,检查 state/idle-review 中该会话的状态或锁,然后重新打开会话。删除状态会重置限额;普通对话和手动操作仍可使用。",
|
|
2493
|
+
"config.reviewPersistWatermark": "重新打开会话后保留审查限额",
|
|
2494
|
+
"config.reviewPersistWatermarkHint": "默认关闭;按存储根目录和父会话保留尝试次数与冷却时间,失败或取消也计次",
|
|
2483
2495
|
"status.reviewRun": "审查运行:{id}",
|
|
2484
2496
|
"status.reviewContextWindow": "请切换为有界检查点(spawn),或选择上下文窗口足以覆盖父会话的任务 Agent 模型。",
|
|
2485
2497
|
"config.reviewTitle": "空闲审查",
|
|
@@ -3043,7 +3055,7 @@ window.__ModuleLoader__.load({
|
|
|
3043
3055
|
"config.syncAuthorDefault": "默认",
|
|
3044
3056
|
"config.syncAuthorMachine": "本机 Git",
|
|
3045
3057
|
"config.syncAuthorCustom": "自定义",
|
|
3046
|
-
"config.syncAuthorDefaultNote": "
|
|
3058
|
+
"config.syncAuthorDefaultNote": "优先使用本机 Git 身份;没有配置时以 {identity} 提交",
|
|
3047
3059
|
"config.syncAuthorMachineNote": "使用这台电脑的 Git 身份;没有配置时用默认身份",
|
|
3048
3060
|
"config.syncAuthorName": "姓名",
|
|
3049
3061
|
"config.syncAuthorEmail": "邮箱",
|
|
@@ -3119,6 +3131,11 @@ window.__ModuleLoader__.load({
|
|
|
3119
3131
|
"skills.allowCreateHint": "允许复盘提出新技能;已有建议仍可手动处理",
|
|
3120
3132
|
"skills.allowUpdate": "改进已有技能",
|
|
3121
3133
|
"skills.allowUpdateHint": "允许复盘提出已有技能的改进;两类建议均关闭时暂停复盘",
|
|
3134
|
+
"skills.targetScope": "新技能写入位置",
|
|
3135
|
+
"skills.targetScopeHint": "默认写入用户技能;跟随存储范围时,workspace / workspaces 写入项目,其余写入用户。已有建议和草案保留目标,改进写回原技能;采纳时可手动选择。",
|
|
3136
|
+
"skills.targetScope.user": "用户",
|
|
3137
|
+
"skills.targetScope.project": "项目",
|
|
3138
|
+
"skills.targetScope.storage": "跟随存储范围",
|
|
3122
3139
|
"skills.evolutionHint": "后台复盘并建议改进技能;会创建落盘的任务及子代理会话,Mnemon 不自动删除这些记录",
|
|
3123
3140
|
"skills.autoBacktest": "草案自动回测",
|
|
3124
3141
|
"skills.autoBacktestHint": "草案写好后,用测试用例与当前版本对比",
|
|
@@ -3162,6 +3179,9 @@ window.__ModuleLoader__.load({
|
|
|
3162
3179
|
"common.showMore": "Show {count} more",
|
|
3163
3180
|
"header.backToConversation": "Back to chat",
|
|
3164
3181
|
"header.configure": "Configure",
|
|
3182
|
+
"header.noticeSummary": "Notices {count} · {labels}",
|
|
3183
|
+
"header.noticeRemoteReadOnly": "Remote read only",
|
|
3184
|
+
"header.noticeIdleReview": "Idle review",
|
|
3165
3185
|
"header.compositionHint": "Select to change the composition in the configuration.",
|
|
3166
3186
|
"header.checking": "Checking",
|
|
3167
3187
|
"header.connected": "Connected",
|
|
@@ -3280,6 +3300,13 @@ window.__ModuleLoader__.load({
|
|
|
3280
3300
|
"status.reviewFailedDetail": "This checkpoint did not complete and will not be replayed automatically. Later reviews respect the cooldown and session limit.",
|
|
3281
3301
|
"status.reviewPartial": "Some writes committed. Reconcile the receipts below; they were not rolled back.",
|
|
3282
3302
|
"status.reviewTeamPaused": "Idle review is paused by the Agent Teams compatibility setting. To keep reviewing, select “Scoped task Agent review” under Idle review on the dsh-mnemon page under Plugins. Recall and writeback settings are unchanged.",
|
|
3303
|
+
"status.reviewToolAccessPaused": "The completion tool required by automatic review is currently unavailable. This checkpoint was skipped without consuming an attempt. Access will be checked again after a later eligible conversation turn. Check this session’s tool restrictions or approval settings.",
|
|
3304
|
+
"status.reviewWatermarkUsage": "Session review attempts: {attempts} / {max} ({restored} restored).",
|
|
3305
|
+
"status.reviewWatermarkNext": "Next review no earlier than {time}; a new eligible conversation checkpoint is still required.",
|
|
3306
|
+
"status.reviewWatermarkPaused": "Automatic review paused: persistent limits are unavailable.",
|
|
3307
|
+
"status.reviewWatermarkRecovery": "Stop Hosts using this storage root, inspect this session’s state or lock under state/idle-review, then reopen the session. Deleting state resets the limit; normal conversation and manual actions remain available.",
|
|
3308
|
+
"config.reviewPersistWatermark": "Keep review limits after reopening",
|
|
3309
|
+
"config.reviewPersistWatermarkHint": "Off by default; retain attempts and cooldown per storage root and parent session, including failed or cancelled attempts",
|
|
3283
3310
|
"status.reviewRun": "Review run: {id}",
|
|
3284
3311
|
"status.reviewContextWindow": "Choose bounded checkpoint review (spawn), or a task Agent model whose context window covers the parent conversation.",
|
|
3285
3312
|
"config.reviewTitle": "Idle review",
|
|
@@ -3843,7 +3870,7 @@ window.__ModuleLoader__.load({
|
|
|
3843
3870
|
"config.syncAuthorDefault": "Default",
|
|
3844
3871
|
"config.syncAuthorMachine": "This computer's Git",
|
|
3845
3872
|
"config.syncAuthorCustom": "Custom",
|
|
3846
|
-
"config.syncAuthorDefaultNote": "
|
|
3873
|
+
"config.syncAuthorDefaultNote": "Uses this computer's Git identity; falls back to {identity} when unconfigured",
|
|
3847
3874
|
"config.syncAuthorMachineNote": "Uses this computer's Git identity, else the default one",
|
|
3848
3875
|
"config.syncAuthorName": "Name",
|
|
3849
3876
|
"config.syncAuthorEmail": "Email",
|
|
@@ -3919,6 +3946,11 @@ window.__ModuleLoader__.load({
|
|
|
3919
3946
|
"skills.allowCreateHint": "Allow reviews to propose new skills; existing suggestions can still be handled manually",
|
|
3920
3947
|
"skills.allowUpdate": "Suggest skill improvements",
|
|
3921
3948
|
"skills.allowUpdateHint": "Allow reviews to improve existing skills; reviews pause when both suggestion types are off",
|
|
3949
|
+
"skills.targetScope": "New skill destination",
|
|
3950
|
+
"skills.targetScopeHint": "Defaults to user skills. Follow storage uses the project for workspace / workspaces, otherwise the user. Existing proposals keep their destination; improvements keep their original file. You can choose again at adoption.",
|
|
3951
|
+
"skills.targetScope.user": "User",
|
|
3952
|
+
"skills.targetScope.project": "Project",
|
|
3953
|
+
"skills.targetScope.storage": "Follow storage",
|
|
3922
3954
|
"skills.evolutionHint": "Review conversations and suggest skills. Task and subagent sessions are saved locally; Mnemon does not automatically delete them.",
|
|
3923
3955
|
"skills.autoBacktest": "Backtest drafts",
|
|
3924
3956
|
"skills.autoBacktestHint": "Compare a new draft with the current version on its test cases",
|
|
@@ -3968,7 +4000,7 @@ window.__ModuleLoader__.load({
|
|
|
3968
4000
|
const IconChevronLeftOutline14 = _deepseek_ai_dsh_client_ui_primitives.IconChevronLeftOutlineRegular;
|
|
3969
4001
|
//#endregion
|
|
3970
4002
|
//#region \0dsh-mnemon-css:/home/runner/work/dsh-mnemon/dsh-mnemon/src/client/MnemonView.module.css.mjs
|
|
3971
|
-
const css$14 = ".IIa07q_shell{--mn-bg:var(--dsw-alias-bg-base);--mn-backdrop:var(--dsw-alias-bg-overlay,var(--mn-bg));--mn-surface:linear-gradient(var(--mn-bg), var(--mn-bg)), linear-gradient(var(--mn-backdrop), var(--mn-backdrop)) var(--mn-bg);--mn-layer-1:var(--dsw-alias-bg-layer-1);--mn-layer-2:var(--dsw-alias-bg-layer-2);--mn-fill:var(--dsw-alias-bg-module-platform);--mn-block-fill:var(--mn-fill);--mn-input:var(--dsw-alias-bg-layer-1);--mn-text:var(--dsw-alias-label-primary);--mn-muted:var(--dsw-alias-label-secondary);--mn-faint:var(--dsw-alias-label-tertiary);--mn-caption:var(--dsw-alias-label-caption);--mn-line:var(--dsw-alias-border-l2);--mn-line-strong:var(--dsw-alias-border-l3);--mn-field-line:var(--dsw-alias-border-l4);--mn-card-line:var(--dsw-alias-settings-card-stroke);--mn-accent:var(--dsw-alias-state-business-primary);--mn-hover:var(--dsw-alias-interactive-bg-hover);--mn-pressed:var(--dsw-alias-interactive-bg-active);--mn-danger:var(--dsw-alias-state-error-primary);--mn-success:var(--dsw-alias-state-success-primary);--mn-warn:var(--dsw-alias-state-warn-primary);--mn-idle:var(--dsw-alias-state-idle-primary);--mn-priority:var(--dsw-alias-state-warn-primary);--mn-focus:var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));--mn-code:var(--ds-font-family-code,\"SFMono-Regular\", Consolas, monospace);--mn-sans:var(--dsw-font-family,-apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif);box-sizing:border-box;min-width:0;height:100%;min-height:0;color:var(--mn-text);background:var(--mn-surface);font:13px/20px var(--mn-sans);-webkit-tap-highlight-color:transparent;flex-direction:column;display:flex;overflow:hidden}:has(>[data-conversation-scroll]>[data-slot=conversation\\.session]>*>[data-slot=conversation\\.view]>.IIa07q_shell[data-mnemon-surface=builtin])>[data-width-handle]{visibility:hidden;pointer-events:none}.IIa07q_shell *,.IIa07q_shell :before,.IIa07q_shell :after{box-sizing:border-box}:where(.IIa07q_shell) :where(button,input,select,textarea){color:inherit;font:inherit}:where(.IIa07q_shell) :where(button,select){touch-action:manipulation}.IIa07q_shell button:focus-visible,.IIa07q_shell input:focus-visible,.IIa07q_shell select:focus-visible,.IIa07q_shell textarea:focus-visible,.IIa07q_shell summary:focus-visible,.IIa07q_shell [role=button]:focus-visible{outline:var(--dsw-focus-ring-width,2px) solid var(--mn-focus);outline-offset:2px}.IIa07q_shell :is(textarea,input:not([type=checkbox],[type=radio],[type=file])):focus-visible{outline:none}.IIa07q_shell code{font-family:var(--mn-code);font-size:.92em}.IIa07q_masthead{background:var(--mn-surface);flex:none;align-items:center;gap:12px;min-height:48px;padding:10px 24px 4px;display:flex}.IIa07q_backButton{flex:none;align-items:center;gap:4px;min-width:max-content;display:inline-flex}.IIa07q_backButton>svg{flex:none}.IIa07q_brand{flex-wrap:wrap;flex:auto;align-items:center;gap:4px 10px;min-width:0;display:flex}.IIa07q_brand h1{flex:none;margin:0;font-size:16px;font-weight:500;line-height:24px}.IIa07q_storageMode{color:var(--mn-faint);background:var(--mn-fill);white-space:nowrap;border-radius:999px;flex:none;align-items:center;gap:4px;padding:1px 8px;font-size:11px;line-height:17px;display:inline-flex}.IIa07q_storageMode>strong{color:var(--mn-muted);font-weight:500}.IIa07q_statusCluster{color:var(--mn-faint);white-space:nowrap;flex:none;align-items:center;gap:6px;font-size:13px;line-height:20px;display:inline-flex}.IIa07q_statusDot{background:var(--mn-idle);border-radius:50%;flex:none;width:6px;height:6px}.IIa07q_online{background:var(--mn-success)}.IIa07q_offline{background:var(--mn-danger)}.IIa07q_checking{background:var(--mn-idle)}.IIa07q_iconButton{border-radius:var(--dsw-radius-sm);width:28px;height:28px;color:var(--mn-caption);cursor:pointer;background:0 0;border:0;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.IIa07q_iconButton:hover:not(:disabled){color:var(--mn-muted);background:var(--mn-hover)}.IIa07q_iconButton>svg{flex:none}.IIa07q_headerActions{flex:none;justify-content:flex-end;align-items:center;gap:8px;min-width:0;display:flex}.IIa07q_workspacePicker{min-width:0;color:var(--mn-faint);align-items:center;gap:6px;font-size:12px;line-height:18px;display:inline-flex}.IIa07q_workspacePicker>[data-part=label]{white-space:nowrap}.IIa07q_workspacePicker button{width:min(200px,22vw);min-width:112px}.IIa07q_alert,.IIa07q_inlineError{border-radius:var(--dsw-radius-md);color:var(--mn-danger);background:color-mix(in srgb, var(--mn-danger) 8%, transparent);padding:8px 12px;font-size:12px;line-height:18px}.IIa07q_alert{flex-direction:column;flex:none;gap:2px;margin:8px 24px 0;display:flex}.IIa07q_alert ul{margin:4px 0 0;padding-left:18px}.IIa07q_alert[role=status]{color:var(--dsw-alias-state-warn-label,var(--mn-text));background:var(--dsw-alias-state-warn-tertiary,color-mix(in srgb, var(--mn-warn) 12%, transparent))}.IIa07q_notice{flex:none;margin:8px 24px 0}.IIa07q_compositionStatus{border-radius:var(--dsw-radius-sm);min-width:0;color:inherit;font:inherit;cursor:pointer;background:0 0;border:0;align-items:center;gap:6px;padding:2px 6px;display:inline-flex}.IIa07q_compositionStatus:hover:not(:disabled){background:var(--mn-hover)}.IIa07q_compositionStatus:disabled{cursor:default}.IIa07q_compositionStrategy{color:var(--mn-muted)}.IIa07q_compositionStrategy:before{content:\"·\";color:var(--mn-faint);margin-right:6px}.IIa07q_compositionStatusWrap{min-width:0;display:inline-flex;position:relative}.IIa07q_compositionSummary{z-index:20;border:.5px solid var(--dsw-alias-border-l2);border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-layer-2);width:max-content;max-width:min(320px,100vw - 32px);box-shadow:var(--dsw-elevation-prominent);color:var(--mn-muted);white-space:normal;opacity:0;pointer-events:none;flex-direction:column;align-items:flex-start;gap:8px;padding:12px;font-size:12px;line-height:18px;transition:opacity .14s ease-out,transform .14s ease-out;display:flex;position:absolute;top:calc(100% + 6px);right:0;transform:translateY(-4px)}.IIa07q_compositionStatusWrap:hover .IIa07q_compositionSummary,.IIa07q_compositionStatusWrap:focus-within .IIa07q_compositionSummary{opacity:1;transition-delay:.2s;transform:none}.IIa07q_compositionSummary>strong{color:var(--mn-text);font-size:13px;font-weight:500;line-height:20px}.IIa07q_compositionLayers{flex-wrap:wrap;gap:6px;display:flex}.IIa07q_compositionHint{color:var(--mn-faint)}@media (prefers-reduced-motion:reduce){.IIa07q_compositionSummary{transition:none}}.IIa07q_workspaceMismatch{border:.5px solid color-mix(in srgb, var(--dsw-alias-state-warn-label,var(--mn-warn)) 20%, transparent);border-radius:var(--dsw-radius-sm);min-width:0;min-height:28px;color:var(--dsw-alias-state-warn-label,var(--mn-text));background:var(--dsw-alias-state-warn-tertiary,color-mix(in srgb, var(--mn-warn) 12%, transparent));white-space:nowrap;flex:none;align-items:center;gap:6px;padding:0 3px 0 10px;font-size:12px;font-weight:500;line-height:18px;display:inline-flex}.IIa07q_workspaceMismatch>button{border-radius:var(--dsw-radius-xs);min-height:22px;color:inherit;background:color-mix(in srgb, currentColor 10%, transparent);cursor:pointer;border:0;padding:0 8px;font-size:12px}.IIa07q_workspaceMismatch>button:hover{background:color-mix(in srgb, currentColor 16%, transparent)}.IIa07q_workspace{flex-direction:column;flex:1;min-height:0;display:flex}.IIa07q_topNavigation{border-bottom:.5px solid var(--mn-line-strong);background:var(--mn-surface);flex:none;align-items:flex-end;min-width:0;padding:0 24px;display:flex}.IIa07q_nav{overscroll-behavior-inline:contain;scrollbar-width:none;flex:1;align-items:flex-end;gap:28px;min-width:0;display:flex;overflow-x:auto}.IIa07q_nav::-webkit-scrollbar{display:none}.IIa07q_nav button{min-width:max-content;color:var(--mn-faint);text-align:left;cursor:pointer;background:0 0;border:0;border-bottom:2px solid #0000;align-items:center;gap:6px;margin-bottom:-.5px;padding:10px 0 9px;font-size:13px;font-weight:500;line-height:16px;display:flex;position:relative}.IIa07q_nav button:hover{color:var(--mn-muted)}.IIa07q_nav button[data-active]{color:var(--mn-accent)}.IIa07q_nav button[data-layer-disabled]:not([data-active]){color:var(--mn-caption)}.IIa07q_nav .IIa07q_layerDisabledBadge{border:.5px solid var(--mn-field-line);color:var(--mn-faint);border-radius:999px;align-items:center;padding:0 6px;font-size:11px;font-style:normal;font-weight:500;line-height:15px;display:inline-flex}.IIa07q_canvas{overscroll-behavior-x:contain;overscroll-behavior-y:auto;scroll-behavior:auto;-webkit-overflow-scrolling:touch;background:var(--mn-surface);flex:1;min-width:0;overflow:auto}.IIa07q_page{width:100%;min-height:100%;margin:0 auto;padding:20px 24px clamp(96px,14vh,150px)}.IIa07q_pageHeader{justify-content:space-between;align-items:flex-start;gap:16px 24px;margin-bottom:16px;display:flex}.IIa07q_pageHeader>div:first-child{min-width:0}.IIa07q_pageHeader h2{margin:0;font-size:16px;font-weight:500;line-height:24px}.IIa07q_pageHeader p{max-width:72ch;color:var(--mn-muted);margin:2px 0 0;font-size:13px;line-height:20px}.IIa07q_pageHeaderMeta{flex-wrap:wrap;flex:none;justify-content:flex-end;align-items:center;gap:8px;min-width:0;display:flex}.IIa07q_pageHeaderMeta>code{border:.5px solid var(--mn-field-line);color:var(--mn-faint);font:500 11px/17px var(--mn-sans);font-variant-numeric:tabular-nums;white-space:nowrap;border-radius:999px;padding:1px 8px}.IIa07q_pageSpinner{width:20px;height:20px;color:var(--mn-faint);flex:none;place-items:center;display:inline-grid}.IIa07q_pageSpinner>i{border:2px solid color-mix(in srgb, currentColor 25%, transparent);border-top-color:currentColor;border-radius:50%;width:14px;height:14px;animation:.9s linear infinite IIa07q_mnemon-spin}.IIa07q_primaryButton,.IIa07q_secondaryButton,.IIa07q_ghostButton,.IIa07q_dangerButton,.IIa07q_dangerSolidButton{border-radius:var(--dsw-radius-md);min-height:32px;color:var(--mn-text);white-space:nowrap;cursor:pointer;background:0 0;border:0;justify-content:center;align-items:center;gap:4px;padding:0 12px;font-size:13px;font-weight:400;line-height:20px;transition:background-color .12s,color .12s,border-color .12s;display:inline-flex}.IIa07q_primaryButton{color:var(--dsw-alias-label-primary-foreground);background:var(--dsw-alias-button-primary-fill)}.IIa07q_primaryButton:hover:not(:disabled){background:var(--dsw-alias-button-primary-hover)}.IIa07q_secondaryButton{border:.5px solid var(--mn-line-strong)}.IIa07q_secondaryButton:hover:not(:disabled),.IIa07q_ghostButton:hover:not(:disabled){background:var(--mn-hover)}.IIa07q_secondaryButton:active:not(:disabled),.IIa07q_ghostButton:active:not(:disabled){background:var(--mn-pressed)}.IIa07q_dangerButton{color:var(--mn-danger)}.IIa07q_dangerButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover-danger,color-mix(in srgb, var(--mn-danger) 8%, transparent))}.IIa07q_dangerSolidButton{color:var(--dsw-static-neutral-00,#fff);background:var(--mn-danger)}.IIa07q_dangerSolidButton:hover:not(:disabled){background:color-mix(in srgb, var(--mn-danger), black 8%)}.IIa07q_shell :where(button:disabled){cursor:not-allowed;opacity:.4}.IIa07q_emptyState{text-align:center;flex-direction:column;justify-content:center;align-items:center;gap:12px;min-height:200px;padding:32px 24px;display:flex}.IIa07q_emptyGlyph{border:.5px solid var(--mn-line-strong);border-radius:var(--dsw-radius-lg);width:48px;height:48px;color:var(--mn-faint);flex:none;place-items:center;font-size:20px;line-height:1;display:grid}.IIa07q_emptyState h3{margin:0 0 4px;font-size:14px;font-weight:500;line-height:22px}.IIa07q_emptyState p{max-width:480px;color:var(--mn-faint);margin:0;font-size:13px;line-height:20px}.IIa07q_sourceManagementSummary{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);grid-template-columns:minmax(220px,1.2fr) minmax(260px,1fr) minmax(220px,1fr);gap:16px;margin-top:12px;padding:16px;display:grid}.IIa07q_sourceManagementIdentity{grid-template-columns:6px minmax(0,1fr);align-items:center;gap:10px;min-width:0;display:grid}.IIa07q_sourceManagementIdentity>span{background:var(--mn-success);border-radius:50%;width:6px;height:6px}.IIa07q_sourceManagementSummary[data-availability=degraded] .IIa07q_sourceManagementIdentity>span{background:var(--mn-warn)}.IIa07q_sourceManagementSummary[data-availability=unavailable] .IIa07q_sourceManagementIdentity>span{background:var(--mn-danger)}.IIa07q_sourceManagementIdentity>div{gap:2px;min-width:0;display:grid}.IIa07q_sourceManagementIdentity small,.IIa07q_sourceManagementCapabilities>small{color:var(--mn-faint);font-size:12px;line-height:18px}.IIa07q_sourceManagementIdentity strong{text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:500;line-height:20px;overflow:hidden}.IIa07q_sourceManagementIdentity code{color:var(--mn-faint);text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}.IIa07q_sourceManagementSummary dl{grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin:0;display:grid}.IIa07q_sourceManagementSummary dl>div{border-radius:var(--dsw-radius-sm);background:var(--mn-block-fill);align-content:center;gap:2px;min-width:0;padding:8px 10px;display:grid}.IIa07q_sourceManagementSummary dt{color:var(--mn-faint);font-size:11px;line-height:14px}.IIa07q_sourceManagementSummary dd{text-overflow:ellipsis;white-space:nowrap;margin:0;font-size:13px;line-height:20px;overflow:hidden}.IIa07q_sourceManagementSummary dd code{font-size:12px}.IIa07q_sourceManagementCapabilities{align-content:center;gap:6px;min-width:0;display:grid}.IIa07q_sourceManagementCapabilities>div{flex-wrap:wrap;gap:4px;display:flex}.IIa07q_sourceManagementCapabilities span{color:var(--mn-muted);background:var(--mn-fill);border-radius:999px;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.IIa07q_sourceManagementDiagnostics,.IIa07q_sourceManagementForm{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);margin-top:12px;padding:16px}.IIa07q_sourceManagementDiagnostics h3,.IIa07q_sourceManagementForm h3{margin:0;font-size:14px;font-weight:500;line-height:22px}.IIa07q_sourceManagementDiagnostics ul{color:var(--mn-muted);gap:4px;margin:8px 0 0;padding-left:18px;font-size:12px;line-height:18px;display:grid}.IIa07q_sourceManagementForm>div:first-child p{color:var(--mn-faint);margin:2px 0 0;font-size:12px;line-height:18px}.IIa07q_sourceManagementForm .IIa07q_formGrid label>small{color:var(--mn-faint);font-size:12px;line-height:18px}.IIa07q_sourceManagementForm .IIa07q_formGrid input[type=checkbox]{width:16px;min-width:0;height:16px;min-height:0;accent-color:var(--dsw-alias-brand-primary)}.IIa07q_sectionSpinner{z-index:6;width:20px;height:20px;color:var(--mn-faint);place-items:center;display:grid;position:absolute;top:10px;right:10px}.IIa07q_sectionSpinner>i{border:2px solid color-mix(in srgb, currentColor 25%, transparent);border-top-color:currentColor;border-radius:50%;width:14px;height:14px;animation:.9s linear infinite IIa07q_mnemon-spin}@keyframes IIa07q_mnemon-spin{to{transform:rotate(360deg)}}.IIa07q_inlineError{margin:0 0 12px}.IIa07q_loading{color:var(--mn-faint);padding:16px 0;font-size:13px}.IIa07q_bodyEdit{gap:12px;padding-top:2px;display:grid}.IIa07q_bodyEdit label,.IIa07q_formGrid label{color:var(--mn-muted);gap:6px;font-size:12px;font-weight:500;line-height:18px;display:grid}.IIa07q_bodyEdit input,.IIa07q_bodyEdit select,.IIa07q_bodyEdit textarea,.IIa07q_formGrid select,.IIa07q_formGrid input{border:.5px solid var(--mn-field-line);border-radius:var(--dsw-radius-md);width:100%;min-width:0;min-height:32px;color:var(--mn-text);background:var(--mn-input);outline:0;padding:5px 10px;font-size:13px;font-weight:400;line-height:20px}.IIa07q_bodyEdit textarea{resize:vertical}.IIa07q_bodyEdit input::placeholder,.IIa07q_bodyEdit textarea::placeholder,.IIa07q_formGrid input::placeholder{color:var(--dsw-alias-label-dimmed)}.IIa07q_bodyEdit input:focus,.IIa07q_bodyEdit select:focus,.IIa07q_bodyEdit textarea:focus,.IIa07q_formGrid select:focus,.IIa07q_formGrid input:focus{border-color:var(--mn-accent)}.IIa07q_providerFieldControl{gap:4px;min-width:0;display:grid}.IIa07q_providerFieldControl input[type=checkbox]{width:16px;height:16px;min-height:0;accent-color:var(--dsw-alias-brand-primary);margin:2px 0;padding:0}.IIa07q_bodyDeleteConfirm{gap:16px;display:grid}.IIa07q_bodyDeleteConfirm>p{color:var(--mn-muted);margin:0;font-size:13px;line-height:20px}.IIa07q_bodyDeleteSummary{border-radius:var(--dsw-radius-md);background:color-mix(in srgb, var(--mn-danger) 6%, transparent);gap:4px;padding:12px;display:grid}.IIa07q_bodyDeleteSummary strong{font-size:13px;font-weight:500}.IIa07q_bodyDeleteContent{white-space:pre-wrap;overflow-wrap:anywhere;margin:0;font-size:13px;font-weight:400;line-height:20px}.IIa07q_bodyDeleteSummary span{color:var(--mn-muted);font-size:12px;line-height:18px}.IIa07q_sectionHeading{justify-content:space-between;align-items:center;gap:16px;min-height:36px;margin-bottom:8px;display:flex}.IIa07q_sectionHeading h3{margin:0;font-size:14px;font-weight:500;line-height:22px}.IIa07q_sectionHeading>div>span{color:var(--mn-faint);font-size:12px;line-height:18px}.IIa07q_sectionHeading>strong{color:var(--mn-muted);background:var(--mn-fill);font-variant-numeric:tabular-nums;border-radius:999px;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.IIa07q_sectionHeading button{border-radius:var(--dsw-radius-sm);width:28px;height:28px;color:var(--mn-caption);cursor:pointer;background:0 0;border:0;justify-content:center;align-items:center;padding:0;display:inline-flex}.IIa07q_sectionHeading button:hover:not(:disabled){color:var(--mn-muted);background:var(--mn-hover)}.IIa07q_runtimeNotice{border-radius:var(--dsw-radius-md);color:var(--mn-success);background:color-mix(in srgb, var(--mn-success) 8%, transparent);margin-bottom:12px;padding:8px 12px;font-size:12px;line-height:18px}.IIa07q_runtimeFootnote{color:var(--mn-faint);margin:12px 2px 0;font-size:12px;line-height:18px}.IIa07q_formGrid{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-top:12px;display:grid}.IIa07q_listProgress{border-top:.5px solid var(--mn-line);min-height:56px;color:var(--mn-faint);justify-content:center;align-items:center;gap:12px;margin-top:12px;padding:10px;font-size:12px;line-height:18px;display:flex}.IIa07q_compactListProgress{border-top:.5px solid var(--mn-line);color:var(--mn-faint);text-align:center;justify-items:stretch;gap:8px;margin-top:8px;padding:10px 2px 2px;font-size:12px;line-height:18px;display:grid}.IIa07q_compactListProgress button{width:100%}.IIa07q_modalPortal{z-index:1000;isolation:isolate;pointer-events:none;position:fixed;inset:0}.IIa07q_modalTheme.IIa07q_modalTheme.IIa07q_modalTheme{width:auto;min-width:0;height:auto;min-height:0;color:var(--mn-text);pointer-events:none;background:0 0;display:block;position:absolute;inset:0;overflow:visible}.IIa07q_modalBackdrop{z-index:0;overscroll-behavior:contain;padding:max(24px, var(--dsh-frame-top-clearance,24px)) 24px;background:var(--dsw-alias-bg-mask-1);backdrop-filter:var(--dsw-mask-blur);touch-action:none;pointer-events:auto;justify-content:center;align-items:center;animation:.18s ease-out both IIa07q_mnemon-dialog-backdrop-enter;display:flex;position:fixed;inset:0;overflow:hidden}.IIa07q_modal{box-sizing:border-box;border-radius:var(--dsw-radius-panel);background:linear-gradient(var(--mn-layer-2), var(--mn-layer-2)), var(--mn-surface);width:min(640px,100%);min-height:0;max-height:100%;box-shadow:var(--dsw-elevation-prominent);touch-action:auto;transform-origin:50% 100%;backface-visibility:hidden;will-change:transform, opacity;border:0;flex-direction:column;animation:.2s cubic-bezier(.2,.75,.2,1) both IIa07q_mnemon-dialog-enter;display:flex;overflow:hidden}.IIa07q_modalBackdrop[data-closing],.IIa07q_modal[data-closing]{pointer-events:none}.IIa07q_modalDragHandle{display:none}.IIa07q_modalWide{width:min(760px,100%)}.IIa07q_modal>header{flex:none;justify-content:space-between;align-items:flex-start;gap:8px;padding:22px 14px 12px 24px;display:flex}.IIa07q_modal>header>div{min-width:0;padding-top:2px}.IIa07q_modal>header h2{margin:0;font-size:16px;font-weight:500;line-height:24px}.IIa07q_modal>header p{overflow-wrap:anywhere;max-width:64ch;color:var(--mn-muted);margin:4px 0 0;font-size:13px;line-height:20px}.IIa07q_modal>header .IIa07q_iconButton{color:var(--mn-muted);flex:none}.IIa07q_modalBody{overscroll-behavior:contain;scrollbar-gutter:stable;touch-action:pan-y;-webkit-overflow-scrolling:touch;min-height:0;padding:8px 24px 20px;overflow:hidden auto}.IIa07q_modalFooter{background:0 0;flex:none;justify-content:flex-end;align-items:center;gap:12px;padding:4px 24px 24px;display:flex}.IIa07q_modalFooter button{min-height:36px;padding-inline:14px}.IIa07q_modalFooterMeta{color:var(--mn-faint);margin-right:auto;font-size:12px;line-height:18px}.IIa07q_modalFooterActions{justify-content:flex-end;align-items:center;gap:8px;min-width:0;margin-left:auto;display:flex}@keyframes IIa07q_mnemon-dialog-backdrop-enter{0%{opacity:0}}@keyframes IIa07q_mnemon-dialog-enter{0%{opacity:0;transform:translateY(8px)scale(.985)}}@keyframes IIa07q_mnemon-sheet-enter{0%{transform:translateY(calc(100% + 32px))}to{transform:translate3d(0, var(--mn-modal-drag-y,0px), 0)}}@keyframes IIa07q_mnemon-metadata-sweep{to{transform:translate(120%)}}@keyframes IIa07q_mnemon-metadata-refreshed{0%{border-color:color-mix(in srgb, var(--mn-accent) 60%, var(--mn-card-line));box-shadow:0 0 0 2px color-mix(in srgb, var(--mn-accent) 14%, transparent)}to{border-color:var(--mn-card-line);box-shadow:0 0 #0000}}.IIa07q_healthStrip{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);flex-wrap:wrap;margin-bottom:16px;display:flex;position:relative;overflow:hidden}.IIa07q_asyncStatusBlock{min-width:0;min-height:36px;position:relative}.IIa07q_healthStrip article{box-sizing:border-box;border-top:.5px solid var(--mn-line);border-left:.5px solid var(--mn-line);flex:150px;align-items:flex-start;gap:10px;min-width:0;min-height:76px;margin:-.5px 0 0 -.5px;padding:14px 16px;display:flex}.IIa07q_healthStrip article>div{min-width:0}.IIa07q_healthStrip small{color:var(--mn-faint);margin-bottom:2px;font-size:12px;line-height:18px;display:block}.IIa07q_healthStrip strong{text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:500;line-height:22px;display:block;overflow:hidden}.IIa07q_healthStrip p{color:var(--mn-faint);text-overflow:ellipsis;white-space:nowrap;margin:2px 0 0;font-size:12px;line-height:18px;overflow:hidden}.IIa07q_healthIndicator{border-radius:50%;flex:none;width:6px;height:6px;margin-top:6px}.IIa07q_healthGood{background:var(--mn-success)}.IIa07q_healthBad{background:var(--mn-danger)}.IIa07q_healthMuted{background:var(--mn-idle)}.IIa07q_providerHealth{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);margin-bottom:16px;padding:16px}.IIa07q_providerHealthList{margin-top:8px}.IIa07q_providerHealthList article{align-items:center;gap:12px;min-width:0;min-height:56px;padding:8px 0;display:flex}.IIa07q_providerHealthList article+article{border-top:.5px solid var(--mn-line)}.IIa07q_providerHealthOff{border-top:.5px solid var(--mn-line);min-width:0;color:var(--mn-faint);justify-content:space-between;align-items:center;gap:12px;margin-top:4px;padding-top:10px;font-size:12px;line-height:18px;display:flex}.IIa07q_providerHealthMark{box-sizing:border-box;border:.5px solid var(--mn-line-strong);border-radius:var(--dsw-radius-md);flex:none;place-items:center;width:36px;height:36px;padding:6px;display:grid;overflow:hidden}.IIa07q_providerHealthMark>img,.IIa07q_providerHealthMark>svg{object-fit:contain;border-radius:4px;width:100%;height:100%;display:block}.IIa07q_providerHealthCopy{flex:1;gap:0;min-width:0;display:grid}.IIa07q_providerHealthCopy strong{text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:500;line-height:20px;overflow:hidden}.IIa07q_providerHealthCopy small{color:var(--mn-faint);font-size:12px;line-height:18px}.IIa07q_providerHealthCopy p{color:var(--mn-danger);text-overflow:ellipsis;white-space:nowrap;margin:2px 0 0;font-size:12px;line-height:18px;overflow:hidden}.IIa07q_providerHealthMeta{flex:none;align-items:center;gap:6px;display:flex}.IIa07q_providerHealthMeta small{color:var(--mn-faint);font-variant-numeric:tabular-nums;font-size:12px;line-height:18px}.IIa07q_providerHealthSignal{background:var(--mn-idle);border-radius:50%;width:6px;height:6px}.IIa07q_providerHealthList article[data-status=healthy] .IIa07q_providerHealthSignal{background:var(--mn-success)}.IIa07q_providerHealthList article[data-status=unhealthy] .IIa07q_providerHealthSignal{background:var(--mn-danger)}.IIa07q_providerHealthList article[data-status=idle] .IIa07q_providerHealthSignal{background:var(--mn-idle)}.IIa07q_storageDomains{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);margin-bottom:16px;padding:16px}.IIa07q_storageRoot{border-radius:var(--dsw-radius-md);background:var(--mn-block-fill);justify-content:space-between;align-items:center;gap:16px;min-width:0;margin-top:12px;padding:10px 12px;display:flex}.IIa07q_storageRoot>div:first-child{gap:2px;min-width:0;display:grid}.IIa07q_storageRoot span,.IIa07q_storageRoot small{color:var(--mn-faint);font-size:12px;line-height:18px}.IIa07q_storageRoot code{color:var(--mn-muted);text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}.IIa07q_storageRoot>div:last-child{flex:none;justify-items:end;gap:2px;display:grid}.IIa07q_storageRoot strong{font-variant-numeric:tabular-nums;font-size:13px;font-weight:500}.IIa07q_storageAreaGrid{grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin-top:8px;display:grid}.IIa07q_storageAreaGrid article{box-sizing:border-box;border:.5px solid var(--mn-line);border-radius:var(--dsw-radius-md);flex-direction:column;min-width:0;min-height:148px;padding:12px 14px;display:flex}.IIa07q_storageAreaGrid article>header{justify-content:space-between;align-items:center;gap:8px;display:flex}.IIa07q_storageAreaGrid article>header>div{align-items:center;gap:8px;min-width:0;display:flex}.IIa07q_storageAreaGrid article>header span{background:var(--mn-idle);border-radius:50%;flex:none;width:6px;height:6px}.IIa07q_storageAreaGrid article[data-status=ready]>header span{background:var(--mn-success)}.IIa07q_storageAreaGrid article[data-status=invalid]>header span{background:var(--mn-danger)}.IIa07q_storageAreaGrid article>header strong{text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:500;overflow:hidden}.IIa07q_storageAreaGrid article>header em{color:var(--mn-faint);white-space:nowrap;font-size:11px;font-style:normal;line-height:14px}.IIa07q_storageAreaMetric{align-items:baseline;gap:6px;margin-top:12px;display:flex}.IIa07q_storageAreaMetric strong{font-variant-numeric:tabular-nums;font-size:20px;font-weight:500;line-height:28px}.IIa07q_storageAreaMetric span{color:var(--mn-faint);font-size:12px}.IIa07q_storageAreaMetric code{color:var(--mn-faint);margin-left:auto;font-size:11px}.IIa07q_storageAreaGrid article>p{min-height:36px;color:var(--mn-faint);margin:6px 0 8px;font-size:12px;line-height:18px}.IIa07q_storagePath{border-top:.5px solid var(--mn-line);color:var(--mn-faint);text-overflow:ellipsis;white-space:nowrap;margin-top:auto;padding-top:8px;font-size:11px;line-height:16px;display:block;overflow:hidden}.IIa07q_storageAreaGrid article>small{color:var(--mn-danger);margin-top:6px;font-size:12px;line-height:18px;display:block}.IIa07q_storageUnavailable{border-radius:var(--dsw-radius-md);min-height:120px;color:var(--mn-muted);background:var(--mn-block-fill);text-align:center;place-content:center;gap:4px;margin-top:12px;display:grid}.IIa07q_storageUnavailable strong{font-size:13px;font-weight:500}.IIa07q_storageUnavailable p{max-width:520px;color:var(--mn-faint);margin:0;font-size:12px;line-height:18px}.IIa07q_storageFootnote{color:var(--mn-faint);margin:12px 0 0;font-size:12px;line-height:18px}.IIa07q_statusSectionHeader{justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.IIa07q_statusSectionHeader h3{margin:0;font-size:14px;font-weight:500;line-height:22px}.IIa07q_statusSectionHeader p{max-width:640px;color:var(--mn-faint);margin:2px 0 0;font-size:12px;line-height:18px}.IIa07q_phaseBadge{color:var(--mn-muted);background:var(--mn-fill);font-variant-numeric:tabular-nums;white-space:nowrap;border-radius:999px;flex:none;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.IIa07q_statusHeaderActions{align-items:center;gap:8px;display:flex}.IIa07q_versionDialogBody{grid-template-columns:minmax(0,1fr);gap:12px;display:grid}.IIa07q_versionChecking{min-height:112px;color:var(--mn-muted);justify-content:center;align-items:center;gap:10px;font-size:13px;display:flex}.IIa07q_versionChecking span{border:2px solid color-mix(in srgb, currentColor 25%, transparent);border-top-color:currentColor;border-radius:50%;width:14px;height:14px;animation:.9s linear infinite IIa07q_mnemon-spin}.IIa07q_versionError,.IIa07q_versionResult{border-radius:var(--dsw-radius-md);color:var(--mn-danger);background:color-mix(in srgb, var(--mn-danger) 8%, transparent);padding:10px 12px}.IIa07q_versionResult{color:var(--mn-success);background:color-mix(in srgb, var(--mn-success) 8%, transparent)}.IIa07q_versionError strong,.IIa07q_versionResult strong{font-size:13px;font-weight:500}.IIa07q_versionError p,.IIa07q_versionResult p{color:var(--mn-muted);margin:2px 0 0;font-size:12px;line-height:18px}.IIa07q_versionList{grid-template-columns:minmax(0,1fr);gap:8px;display:grid}.IIa07q_versionList article{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);padding:12px 14px}.IIa07q_versionList article>header{justify-content:space-between;align-items:center;gap:12px;display:flex}.IIa07q_versionList article>header>div{align-items:center;gap:8px;min-width:0;display:flex}.IIa07q_versionList article>header strong{font-size:14px;font-weight:500;line-height:22px}.IIa07q_versionList article>header span{color:var(--mn-muted);background:var(--mn-fill);border-radius:999px;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.IIa07q_versionList article>header em{color:var(--mn-success);white-space:nowrap;font-size:12px;font-style:normal;line-height:18px}.IIa07q_versionList article[data-outdated]>header em{color:var(--mn-accent)}.IIa07q_versionNumbers{grid-template-columns:1fr auto 1fr;align-items:end;gap:10px;margin-top:10px;display:grid}.IIa07q_versionNumbers>div{gap:2px;display:grid}.IIa07q_versionNumbers small{color:var(--mn-faint);font-size:12px;line-height:18px}.IIa07q_versionNumbers code{font-size:13px}.IIa07q_versionNumbers>span{color:var(--mn-faint);padding-bottom:1px}.IIa07q_versionLocation{min-width:0;color:var(--mn-faint);gap:6px;margin-top:8px;font-size:12px;line-height:18px;display:flex}.IIa07q_versionLocation>span{flex:none}.IIa07q_versionLocation>code{min-width:0;color:inherit;text-overflow:ellipsis;white-space:nowrap;font-size:11px;overflow:hidden}.IIa07q_versionList article>footer{border-top:.5px solid var(--mn-line);justify-content:space-between;align-items:flex-end;gap:16px;margin-top:10px;padding-top:10px;display:flex}.IIa07q_versionList article>footer p{max-width:470px;color:var(--mn-muted);margin:0;font-size:12px;line-height:18px}.IIa07q_versionList article>footer button{flex:none}.IIa07q_versionList article>header em[data-state=unknown],.IIa07q_versionList article>header em[data-state=local],.IIa07q_versionList article>header em[data-state=missing]{color:var(--mn-faint)}.IIa07q_versionList article>header em[data-state=restart]{color:var(--mn-accent)}.IIa07q_versionNotice{color:var(--mn-muted);margin:8px 0 0;font-size:12px;line-height:18px}.IIa07q_versionGuidance{border-radius:var(--dsw-radius-md);background:var(--mn-block-fill);gap:6px;min-width:0;margin-top:10px;padding:10px 12px;display:grid}.IIa07q_versionGuidance>strong{font-size:13px;font-weight:500}.IIa07q_versionGuidance>p{color:var(--mn-muted);margin:0;font-size:12px;line-height:18px}.IIa07q_versionGuidance>a{color:var(--dsw-alias-link,var(--mn-accent));justify-self:start;font-size:12px}.IIa07q_versionGuidanceDetails{min-width:0;color:var(--mn-muted);font-size:12px;line-height:18px}.IIa07q_versionGuidanceDetails>summary{cursor:pointer}.IIa07q_versionGuidanceDetails>p{margin:8px 0}.IIa07q_versionGuidanceDetails>a{color:var(--dsw-alias-link,var(--mn-accent))}.IIa07q_versionCommand{border-radius:var(--dsw-radius-sm);background:var(--mn-layer-1);flex-wrap:wrap;align-items:center;gap:8px;min-width:0;padding:8px 10px;display:flex}.IIa07q_versionCommand>code{overflow-wrap:anywhere;white-space:pre-wrap;user-select:text;flex:1;min-width:0;font-size:12px}.IIa07q_versionCommand>button{flex:none}.IIa07q_versionCommand>small{color:var(--mn-faint);flex-basis:100%;font-size:12px}.IIa07q_versionPackages{border-top:.5px solid var(--mn-line);min-width:0;margin-top:12px}.IIa07q_versionPackagesToggle{width:100%;min-height:44px;color:var(--mn-text);text-align:start;cursor:pointer;background:0 0;border:0;flex-wrap:wrap;align-items:center;gap:8px;padding:10px 0 0;display:flex}.IIa07q_versionPackagesToggle>strong{font-size:13px;font-weight:500}.IIa07q_versionPackagesToggle>small{color:var(--mn-faint);margin-left:auto;font-size:12px}.IIa07q_versionPackages h4{color:var(--mn-faint);margin:16px 0 8px;font-size:12px;font-weight:500;line-height:18px}.IIa07q_versionPackages ul{gap:8px;margin:0;padding:0;list-style:none;display:grid}.IIa07q_versionPackage{border:.5px solid var(--mn-line);border-radius:var(--dsw-radius-md);min-width:0;padding:10px 12px}.IIa07q_versionPackageHeader{flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:6px 12px;display:flex}.IIa07q_versionPackageHeader strong{overflow-wrap:anywhere;min-width:0;font-size:13px;font-weight:500}.IIa07q_versionPackageHeader em{color:var(--mn-faint);font-size:12px;font-style:normal}.IIa07q_versionPackageHeader em[data-state=available],.IIa07q_versionPackageHeader em[data-state=restart]{color:var(--mn-accent)}.IIa07q_versionPackageHeader em[data-state=current]{color:var(--mn-success)}.IIa07q_versionPackageMeta,.IIa07q_versionPackageNumbers{color:var(--mn-faint);flex-wrap:wrap;gap:6px 14px;margin-top:6px;font-size:12px;line-height:18px;display:flex}.IIa07q_versionPackageNumbers code{color:var(--mn-text)}.IIa07q_versionPackageAction{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;margin-top:8px;display:flex}.IIa07q_versionPackageAction p{min-width:150px;color:var(--mn-muted);flex:1;margin:0;font-size:12px;line-height:18px}.IIa07q_versionPackageAction button{flex:none}@media (width<=1000px){.IIa07q_sourceManagementSummary{grid-template-columns:1fr 1fr}.IIa07q_sourceManagementCapabilities{grid-column:1/-1}.IIa07q_storageAreaGrid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (width<=760px){.IIa07q_shell{min-height:0;overflow:hidden}.IIa07q_sourceManagementSummary{grid-template-columns:1fr}.IIa07q_sourceManagementSummary dl,.IIa07q_sourceManagementCapabilities{grid-column:auto}.IIa07q_masthead{padding:8px 16px 2px}.IIa07q_alert,.IIa07q_notice{margin-inline:16px}.IIa07q_topNavigation{padding:0 16px}.IIa07q_workspacePicker>[data-part=label]{display:none}.IIa07q_workspacePicker button{width:min(170px,32vw)}.IIa07q_modalBackdrop{padding:max(10px, env(safe-area-inset-top,0px)) 0 0;align-items:flex-end}.IIa07q_modal,.IIa07q_modalWide{width:100vw;max-height:calc(100vh - max(10px, env(safe-area-inset-top,0px)));border-radius:var(--dsw-radius-xl) var(--dsw-radius-xl) 0 0;transform:translate3d(0, var(--mn-modal-drag-y,0px), 0);animation-name:IIa07q_mnemon-sheet-enter;animation-duration:.34s;animation-timing-function:cubic-bezier(.2,.82,.2,1)}.IIa07q_modalDragHandle{cursor:grab;touch-action:none;user-select:none;flex:none;place-items:center;width:100%;height:28px;display:grid}.IIa07q_modalDragHandle span{background:var(--mn-line-strong);border-radius:999px;width:36px;height:4px;transition:width .14s,background-color .14s}.IIa07q_modal[data-dragging] .IIa07q_modalDragHandle{cursor:grabbing}.IIa07q_modal[data-dragging] .IIa07q_modalDragHandle span{background:var(--dsw-alias-border-l4);width:44px}.IIa07q_modal>header{padding:10px max(14px, env(safe-area-inset-right,0px)) 12px max(14px, env(safe-area-inset-left,0px));gap:12px}.IIa07q_modal>header p{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.IIa07q_modal>header .IIa07q_iconButton{width:44px;height:44px;margin:-4px -5px -4px 0}.IIa07q_modalBody{padding:14px max(14px, env(safe-area-inset-right,0px)) 18px max(14px, env(safe-area-inset-left,0px));scrollbar-gutter:auto;scroll-padding-bottom:12px}.IIa07q_modalBody button{min-height:44px}.IIa07q_modalFooter{padding:10px max(14px, env(safe-area-inset-right,0px)) calc(10px + env(safe-area-inset-bottom,0px)) max(14px, env(safe-area-inset-left,0px));flex-direction:column;align-items:stretch;gap:8px}.IIa07q_modalFooterMeta{max-width:none;margin:0}.IIa07q_modalFooterActions{grid-template-columns:minmax(82px,.55fr) minmax(0,1.45fr);gap:8px;width:100%;margin:0;display:grid}.IIa07q_modalFooterActions button{white-space:normal;min-width:0;min-height:44px;padding-block:8px}.IIa07q_versionList article>footer{flex-direction:column;align-items:stretch}.IIa07q_nav{gap:22px}.IIa07q_page{padding:16px 16px calc(170px + env(safe-area-inset-bottom,0px))}.IIa07q_pageHeader{gap:10px;display:grid}.IIa07q_pageHeaderMeta{justify-content:flex-start}.IIa07q_healthStrip article{flex-basis:100%}.IIa07q_providerHealthMeta{flex-direction:column;align-items:flex-end;gap:4px}.IIa07q_storageRoot{flex-direction:column;align-items:flex-start}.IIa07q_storageRoot>div:last-child{justify-items:start}.IIa07q_storageAreaGrid{grid-template-columns:1fr}}@media (width<=520px){.IIa07q_workspacePicker select{width:min(150px,39vw)}.IIa07q_nav{scroll-snap-type:x proximity;gap:18px}.IIa07q_nav button{scroll-snap-align:start}.IIa07q_pageHeaderMeta{align-items:stretch}.IIa07q_pageHeaderMeta>code{align-items:center;display:inline-flex}.IIa07q_pageHeaderMeta>button{flex:1}.IIa07q_emptyState{min-height:180px;padding:24px 16px}.IIa07q_formGrid{grid-template-columns:1fr}}@media (width<=360px){.IIa07q_modalFooterActions{grid-template-columns:1fr}}@media (height<=420px){.IIa07q_modal>header p{white-space:nowrap;text-overflow:ellipsis;display:block;overflow:hidden}}@media (width>=761px) and (height<=560px){.IIa07q_modalBackdrop{padding:8px}}@supports (height:100dvh){@media (width<=760px){.IIa07q_modal,.IIa07q_modalWide{max-height:calc(100dvh - max(10px, env(safe-area-inset-top,0px)))}}}@media (width<=1000px) and (height<=760px){.IIa07q_shell{min-height:0}.IIa07q_masthead{min-height:44px}}@media (width<=760px) and (pointer:coarse){.IIa07q_shell input,.IIa07q_shell select,.IIa07q_shell textarea{font-size:16px!important}}@media (pointer:coarse){.IIa07q_modal>header .IIa07q_iconButton{width:44px;min-width:44px;height:44px;min-height:44px}.IIa07q_modalBody button,.IIa07q_modalFooter button{min-height:44px}}@media (prefers-reduced-motion:reduce){.IIa07q_shell *,.IIa07q_shell :before,.IIa07q_shell :after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}.IIa07q_modalBackdrop,.IIa07q_modal{animation:none!important}}.IIa07q_page[data-source-page]>.IIa07q_workspacePicker{margin-bottom:16px}.IIa07q_page[data-source-page] .IIa07q_page{width:100%;min-height:0;margin:0;padding:0}";
|
|
4003
|
+
const css$14 = ".IIa07q_shell{--mn-bg:var(--dsw-alias-bg-base);--mn-backdrop:var(--dsw-alias-bg-overlay,var(--mn-bg));--mn-surface:linear-gradient(var(--mn-bg), var(--mn-bg)), linear-gradient(var(--mn-backdrop), var(--mn-backdrop)) var(--mn-bg);--mn-layer-1:var(--dsw-alias-bg-layer-1);--mn-layer-2:var(--dsw-alias-bg-layer-2);--mn-fill:var(--dsw-alias-bg-module-platform);--mn-block-fill:var(--mn-fill);--mn-input:var(--dsw-alias-bg-layer-1);--mn-text:var(--dsw-alias-label-primary);--mn-muted:var(--dsw-alias-label-secondary);--mn-faint:var(--dsw-alias-label-tertiary);--mn-caption:var(--dsw-alias-label-caption);--mn-line:var(--dsw-alias-border-l2);--mn-line-strong:var(--dsw-alias-border-l3);--mn-field-line:var(--dsw-alias-border-l4);--mn-card-line:var(--dsw-alias-settings-card-stroke);--mn-accent:var(--dsw-alias-state-business-primary);--mn-hover:var(--dsw-alias-interactive-bg-hover);--mn-pressed:var(--dsw-alias-interactive-bg-active);--mn-danger:var(--dsw-alias-state-error-primary);--mn-success:var(--dsw-alias-state-success-primary);--mn-warn:var(--dsw-alias-state-warn-primary);--mn-idle:var(--dsw-alias-state-idle-primary);--mn-priority:var(--dsw-alias-state-warn-primary);--mn-focus:var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));--mn-code:var(--ds-font-family-code,\"SFMono-Regular\", Consolas, monospace);--mn-sans:var(--dsw-font-family,-apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif);box-sizing:border-box;min-width:0;height:100%;min-height:0;color:var(--mn-text);background:var(--mn-surface);font:13px/20px var(--mn-sans);-webkit-tap-highlight-color:transparent;flex-direction:column;display:flex;overflow:hidden;container:IIa07q_mnemon-workbench/inline-size}:has(>[data-conversation-scroll]>[data-slot=conversation\\.session]>*>[data-slot=conversation\\.view]>.IIa07q_shell[data-mnemon-surface=builtin])>[data-width-handle]{visibility:hidden;pointer-events:none}.IIa07q_shell *,.IIa07q_shell :before,.IIa07q_shell :after{box-sizing:border-box}:where(.IIa07q_shell) :where(button,input,select,textarea){color:inherit;font:inherit}:where(.IIa07q_shell) :where(button,select){touch-action:manipulation}.IIa07q_shell button:focus-visible,.IIa07q_shell input:focus-visible,.IIa07q_shell select:focus-visible,.IIa07q_shell textarea:focus-visible,.IIa07q_shell summary:focus-visible,.IIa07q_shell [role=button]:focus-visible{outline:var(--dsw-focus-ring-width,2px) solid var(--mn-focus);outline-offset:2px}.IIa07q_shell :is(textarea,input:not([type=checkbox],[type=radio],[type=file])):focus-visible{outline:none}.IIa07q_shell code{font-family:var(--mn-code);font-size:.92em}.IIa07q_masthead{background:var(--mn-surface);flex:none;align-items:center;gap:12px;min-height:48px;padding:10px 24px 4px;display:flex}.IIa07q_backButton{flex:none;align-items:center;gap:4px;min-width:max-content;display:inline-flex}.IIa07q_backButton>svg{flex:none}.IIa07q_brand{flex-wrap:wrap;flex:auto;align-items:center;gap:4px 10px;min-width:0;display:flex}.IIa07q_brand h1{flex:none;margin:0;font-size:16px;font-weight:500;line-height:24px}.IIa07q_storageMode{color:var(--mn-faint);background:var(--mn-fill);white-space:nowrap;border-radius:999px;flex:none;align-items:center;gap:4px;padding:1px 8px;font-size:11px;line-height:17px;display:inline-flex}.IIa07q_storageMode>strong{color:var(--mn-muted);font-weight:500}.IIa07q_statusCluster{color:var(--mn-faint);white-space:nowrap;flex:none;align-items:center;gap:6px;font-size:13px;line-height:20px;display:inline-flex}.IIa07q_statusDot{background:var(--mn-idle);border-radius:50%;flex:none;width:6px;height:6px}.IIa07q_online{background:var(--mn-success)}.IIa07q_offline{background:var(--mn-danger)}.IIa07q_checking{background:var(--mn-idle)}.IIa07q_iconButton{border-radius:var(--dsw-radius-sm);width:28px;height:28px;color:var(--mn-caption);cursor:pointer;background:0 0;border:0;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.IIa07q_iconButton:hover:not(:disabled){color:var(--mn-muted);background:var(--mn-hover)}.IIa07q_iconButton>svg{flex:none}.IIa07q_headerActions{flex:none;justify-content:flex-end;align-items:center;gap:8px;min-width:0;display:flex}.IIa07q_workspacePicker{min-width:0;color:var(--mn-faint);align-items:center;gap:6px;font-size:12px;line-height:18px;display:inline-flex}.IIa07q_workspacePicker>[data-part=label]{white-space:nowrap}.IIa07q_workspacePicker button{width:min(200px,22vw);min-width:112px}.IIa07q_alert,.IIa07q_inlineError{border-radius:var(--dsw-radius-md);color:var(--mn-danger);background:color-mix(in srgb, var(--mn-danger) 8%, transparent);padding:8px 12px;font-size:12px;line-height:18px}.IIa07q_alert{flex-direction:column;flex:none;gap:2px;margin:8px 24px 0;display:flex}.IIa07q_alert ul{margin:4px 0 0;padding-left:18px}.IIa07q_alert[role=status]{color:var(--dsw-alias-state-warn-label,var(--mn-text));background:var(--dsw-alias-state-warn-tertiary,color-mix(in srgb, var(--mn-warn) 12%, transparent))}.IIa07q_noticeGroup,.IIa07q_noticeContents{flex-direction:column;flex:none;display:flex}.IIa07q_noticeToggle{display:none}.IIa07q_notice{flex:none;margin:8px 24px 0}.IIa07q_compositionStatus{border-radius:var(--dsw-radius-sm);min-width:0;color:inherit;font:inherit;cursor:pointer;background:0 0;border:0;align-items:center;gap:6px;padding:2px 6px;display:inline-flex}.IIa07q_compositionStatus:hover:not(:disabled){background:var(--mn-hover)}.IIa07q_compositionStatus:disabled{cursor:default}.IIa07q_compositionStrategy{color:var(--mn-muted)}.IIa07q_compositionStrategy:before{content:\"·\";color:var(--mn-faint);margin-right:6px}.IIa07q_compositionStatusWrap{min-width:0;display:inline-flex;position:relative}.IIa07q_compositionSummary{z-index:20;border:.5px solid var(--dsw-alias-border-l2);border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-layer-2);width:max-content;max-width:min(320px,100vw - 32px);box-shadow:var(--dsw-elevation-prominent);color:var(--mn-muted);white-space:normal;opacity:0;pointer-events:none;flex-direction:column;align-items:flex-start;gap:8px;padding:12px;font-size:12px;line-height:18px;transition:opacity .14s ease-out,transform .14s ease-out;display:flex;position:absolute;top:calc(100% + 6px);right:0;transform:translateY(-4px)}.IIa07q_compositionStatusWrap:hover .IIa07q_compositionSummary,.IIa07q_compositionStatusWrap:focus-within .IIa07q_compositionSummary{opacity:1;transition-delay:.2s;transform:none}.IIa07q_compositionSummary>strong{color:var(--mn-text);font-size:13px;font-weight:500;line-height:20px}.IIa07q_compositionLayers{flex-wrap:wrap;gap:6px;display:flex}.IIa07q_compositionHint{color:var(--mn-faint)}@media (prefers-reduced-motion:reduce){.IIa07q_compositionSummary{transition:none}}.IIa07q_workspaceMismatch{border:.5px solid color-mix(in srgb, var(--dsw-alias-state-warn-label,var(--mn-warn)) 20%, transparent);border-radius:var(--dsw-radius-sm);min-width:0;min-height:28px;color:var(--dsw-alias-state-warn-label,var(--mn-text));background:var(--dsw-alias-state-warn-tertiary,color-mix(in srgb, var(--mn-warn) 12%, transparent));white-space:nowrap;flex:none;align-items:center;gap:6px;padding:0 3px 0 10px;font-size:12px;font-weight:500;line-height:18px;display:inline-flex}.IIa07q_workspaceMismatch>button{border-radius:var(--dsw-radius-xs);min-height:22px;color:inherit;background:color-mix(in srgb, currentColor 10%, transparent);cursor:pointer;border:0;padding:0 8px;font-size:12px}.IIa07q_workspaceMismatch>button:hover{background:color-mix(in srgb, currentColor 16%, transparent)}.IIa07q_workspace{flex-direction:column;flex:1;min-height:0;display:flex}.IIa07q_topNavigation{border-bottom:.5px solid var(--mn-line-strong);background:var(--mn-surface);flex:none;align-items:flex-end;min-width:0;padding:0 24px;display:flex}.IIa07q_nav{overscroll-behavior-inline:contain;scrollbar-width:none;flex:1;align-items:flex-end;gap:28px;min-width:0;display:flex;overflow-x:auto}.IIa07q_nav::-webkit-scrollbar{display:none}.IIa07q_nav button{min-width:max-content;color:var(--mn-faint);text-align:left;cursor:pointer;background:0 0;border:0;border-bottom:2px solid #0000;align-items:center;gap:6px;margin-bottom:-.5px;padding:10px 0 9px;font-size:13px;font-weight:500;line-height:16px;display:flex;position:relative}.IIa07q_nav button:hover{color:var(--mn-muted)}.IIa07q_nav button[data-active]{color:var(--mn-accent)}.IIa07q_nav button[data-layer-disabled]:not([data-active]){color:var(--mn-caption)}.IIa07q_nav .IIa07q_layerDisabledBadge{border:.5px solid var(--mn-field-line);color:var(--mn-faint);border-radius:999px;align-items:center;padding:0 6px;font-size:11px;font-style:normal;font-weight:500;line-height:15px;display:inline-flex}.IIa07q_canvas{overscroll-behavior-x:contain;overscroll-behavior-y:auto;scroll-behavior:auto;-webkit-overflow-scrolling:touch;background:var(--mn-surface);flex:1;min-width:0;overflow:auto}.IIa07q_page{width:100%;min-height:100%;margin:0 auto;padding:20px 24px clamp(96px,14vh,150px)}.IIa07q_pageHeader{justify-content:space-between;align-items:flex-start;gap:16px 24px;margin-bottom:16px;display:flex}.IIa07q_pageHeader>div:first-child{min-width:0}.IIa07q_pageHeader h2{margin:0;font-size:16px;font-weight:500;line-height:24px}.IIa07q_pageHeader p{max-width:72ch;color:var(--mn-muted);margin:2px 0 0;font-size:13px;line-height:20px}.IIa07q_pageHeaderMeta{flex-wrap:wrap;flex:none;justify-content:flex-end;align-items:center;gap:8px;min-width:0;display:flex}.IIa07q_pageHeaderMeta>code{border:.5px solid var(--mn-field-line);color:var(--mn-faint);font:500 11px/17px var(--mn-sans);font-variant-numeric:tabular-nums;white-space:nowrap;border-radius:999px;padding:1px 8px}.IIa07q_pageSpinner{width:20px;height:20px;color:var(--mn-faint);flex:none;place-items:center;display:inline-grid}.IIa07q_pageSpinner>i{border:2px solid color-mix(in srgb, currentColor 25%, transparent);border-top-color:currentColor;border-radius:50%;width:14px;height:14px;animation:.9s linear infinite IIa07q_mnemon-spin}.IIa07q_primaryButton,.IIa07q_secondaryButton,.IIa07q_ghostButton,.IIa07q_dangerButton,.IIa07q_dangerSolidButton{border-radius:var(--dsw-radius-md);min-height:32px;color:var(--mn-text);white-space:nowrap;cursor:pointer;background:0 0;border:0;justify-content:center;align-items:center;gap:4px;padding:0 12px;font-size:13px;font-weight:400;line-height:20px;transition:background-color .12s,color .12s,border-color .12s;display:inline-flex}.IIa07q_primaryButton{color:var(--dsw-alias-label-primary-foreground);background:var(--dsw-alias-button-primary-fill)}.IIa07q_primaryButton:hover:not(:disabled){background:var(--dsw-alias-button-primary-hover)}.IIa07q_secondaryButton{border:.5px solid var(--mn-line-strong)}.IIa07q_secondaryButton:hover:not(:disabled),.IIa07q_ghostButton:hover:not(:disabled){background:var(--mn-hover)}.IIa07q_secondaryButton:active:not(:disabled),.IIa07q_ghostButton:active:not(:disabled){background:var(--mn-pressed)}.IIa07q_dangerButton{color:var(--mn-danger)}.IIa07q_dangerButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover-danger,color-mix(in srgb, var(--mn-danger) 8%, transparent))}.IIa07q_dangerSolidButton{color:var(--dsw-static-neutral-00,#fff);background:var(--mn-danger)}.IIa07q_dangerSolidButton:hover:not(:disabled){background:color-mix(in srgb, var(--mn-danger), black 8%)}.IIa07q_shell :where(button:disabled){cursor:not-allowed;opacity:.4}.IIa07q_emptyState{text-align:center;flex-direction:column;justify-content:center;align-items:center;gap:12px;min-height:200px;padding:32px 24px;display:flex}.IIa07q_emptyGlyph{border:.5px solid var(--mn-line-strong);border-radius:var(--dsw-radius-lg);width:48px;height:48px;color:var(--mn-faint);flex:none;place-items:center;font-size:20px;line-height:1;display:grid}.IIa07q_emptyState h3{margin:0 0 4px;font-size:14px;font-weight:500;line-height:22px}.IIa07q_emptyState p{max-width:480px;color:var(--mn-faint);margin:0;font-size:13px;line-height:20px}.IIa07q_sourceManagementSummary{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);grid-template-columns:minmax(220px,1.2fr) minmax(260px,1fr) minmax(220px,1fr);gap:16px;margin-top:12px;padding:16px;display:grid}.IIa07q_sourceManagementIdentity{grid-template-columns:6px minmax(0,1fr);align-items:center;gap:10px;min-width:0;display:grid}.IIa07q_sourceManagementIdentity>span{background:var(--mn-success);border-radius:50%;width:6px;height:6px}.IIa07q_sourceManagementSummary[data-availability=degraded] .IIa07q_sourceManagementIdentity>span{background:var(--mn-warn)}.IIa07q_sourceManagementSummary[data-availability=unavailable] .IIa07q_sourceManagementIdentity>span{background:var(--mn-danger)}.IIa07q_sourceManagementIdentity>div{gap:2px;min-width:0;display:grid}.IIa07q_sourceManagementIdentity small,.IIa07q_sourceManagementCapabilities>small{color:var(--mn-faint);font-size:12px;line-height:18px}.IIa07q_sourceManagementIdentity strong{text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:500;line-height:20px;overflow:hidden}.IIa07q_sourceManagementIdentity code{color:var(--mn-faint);text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}.IIa07q_sourceManagementSummary dl{grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin:0;display:grid}.IIa07q_sourceManagementSummary dl>div{border-radius:var(--dsw-radius-sm);background:var(--mn-block-fill);align-content:center;gap:2px;min-width:0;padding:8px 10px;display:grid}.IIa07q_sourceManagementSummary dt{color:var(--mn-faint);font-size:11px;line-height:14px}.IIa07q_sourceManagementSummary dd{text-overflow:ellipsis;white-space:nowrap;margin:0;font-size:13px;line-height:20px;overflow:hidden}.IIa07q_sourceManagementSummary dd code{font-size:12px}.IIa07q_sourceManagementCapabilities{align-content:center;gap:6px;min-width:0;display:grid}.IIa07q_sourceManagementCapabilities>div{flex-wrap:wrap;gap:4px;display:flex}.IIa07q_sourceManagementCapabilities span{color:var(--mn-muted);background:var(--mn-fill);border-radius:999px;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.IIa07q_sourceManagementDiagnostics,.IIa07q_sourceManagementForm{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);margin-top:12px;padding:16px}.IIa07q_sourceManagementDiagnostics h3,.IIa07q_sourceManagementForm h3{margin:0;font-size:14px;font-weight:500;line-height:22px}.IIa07q_sourceManagementDiagnostics ul{color:var(--mn-muted);gap:4px;margin:8px 0 0;padding-left:18px;font-size:12px;line-height:18px;display:grid}.IIa07q_sourceManagementForm>div:first-child p{color:var(--mn-faint);margin:2px 0 0;font-size:12px;line-height:18px}.IIa07q_sourceManagementForm .IIa07q_formGrid label>small{color:var(--mn-faint);font-size:12px;line-height:18px}.IIa07q_sourceManagementForm .IIa07q_formGrid input[type=checkbox]{width:16px;min-width:0;height:16px;min-height:0;accent-color:var(--dsw-alias-brand-primary)}.IIa07q_sectionSpinner{z-index:6;width:20px;height:20px;color:var(--mn-faint);place-items:center;display:grid;position:absolute;top:10px;right:10px}.IIa07q_sectionSpinner>i{border:2px solid color-mix(in srgb, currentColor 25%, transparent);border-top-color:currentColor;border-radius:50%;width:14px;height:14px;animation:.9s linear infinite IIa07q_mnemon-spin}@keyframes IIa07q_mnemon-spin{to{transform:rotate(360deg)}}.IIa07q_inlineError{margin:0 0 12px}.IIa07q_loading{color:var(--mn-faint);padding:16px 0;font-size:13px}.IIa07q_bodyEdit{gap:12px;padding-top:2px;display:grid}.IIa07q_bodyEdit label,.IIa07q_formGrid label{color:var(--mn-muted);gap:6px;font-size:12px;font-weight:500;line-height:18px;display:grid}.IIa07q_bodyEdit input,.IIa07q_bodyEdit select,.IIa07q_bodyEdit textarea,.IIa07q_formGrid select,.IIa07q_formGrid input{border:.5px solid var(--mn-field-line);border-radius:var(--dsw-radius-md);width:100%;min-width:0;min-height:32px;color:var(--mn-text);background:var(--mn-input);outline:0;padding:5px 10px;font-size:13px;font-weight:400;line-height:20px}.IIa07q_bodyEdit textarea{resize:vertical}.IIa07q_bodyEdit input::placeholder,.IIa07q_bodyEdit textarea::placeholder,.IIa07q_formGrid input::placeholder{color:var(--dsw-alias-label-dimmed)}.IIa07q_bodyEdit input:focus,.IIa07q_bodyEdit select:focus,.IIa07q_bodyEdit textarea:focus,.IIa07q_formGrid select:focus,.IIa07q_formGrid input:focus{border-color:var(--mn-accent)}.IIa07q_providerFieldControl{gap:4px;min-width:0;display:grid}.IIa07q_providerFieldControl input[type=checkbox]{width:16px;height:16px;min-height:0;accent-color:var(--dsw-alias-brand-primary);margin:2px 0;padding:0}.IIa07q_bodyDeleteConfirm{gap:16px;display:grid}.IIa07q_bodyDeleteConfirm>p{color:var(--mn-muted);margin:0;font-size:13px;line-height:20px}.IIa07q_bodyDeleteSummary{border-radius:var(--dsw-radius-md);background:color-mix(in srgb, var(--mn-danger) 6%, transparent);gap:4px;padding:12px;display:grid}.IIa07q_bodyDeleteSummary strong{font-size:13px;font-weight:500}.IIa07q_bodyDeleteContent{white-space:pre-wrap;overflow-wrap:anywhere;margin:0;font-size:13px;font-weight:400;line-height:20px}.IIa07q_bodyDeleteSummary span{color:var(--mn-muted);font-size:12px;line-height:18px}.IIa07q_sectionHeading{justify-content:space-between;align-items:center;gap:16px;min-height:36px;margin-bottom:8px;display:flex}.IIa07q_sectionHeading h3{margin:0;font-size:14px;font-weight:500;line-height:22px}.IIa07q_sectionHeading>div>span{color:var(--mn-faint);font-size:12px;line-height:18px}.IIa07q_sectionHeading>strong{color:var(--mn-muted);background:var(--mn-fill);font-variant-numeric:tabular-nums;border-radius:999px;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.IIa07q_sectionHeading button{border-radius:var(--dsw-radius-sm);width:28px;height:28px;color:var(--mn-caption);cursor:pointer;background:0 0;border:0;justify-content:center;align-items:center;padding:0;display:inline-flex}.IIa07q_sectionHeading button:hover:not(:disabled){color:var(--mn-muted);background:var(--mn-hover)}.IIa07q_runtimeNotice{border-radius:var(--dsw-radius-md);color:var(--mn-success);background:color-mix(in srgb, var(--mn-success) 8%, transparent);margin-bottom:12px;padding:8px 12px;font-size:12px;line-height:18px}.IIa07q_runtimeFootnote{color:var(--mn-faint);margin:12px 2px 0;font-size:12px;line-height:18px}.IIa07q_formGrid{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-top:12px;display:grid}.IIa07q_listProgress{border-top:.5px solid var(--mn-line);min-height:56px;color:var(--mn-faint);justify-content:center;align-items:center;gap:12px;margin-top:12px;padding:10px;font-size:12px;line-height:18px;display:flex}.IIa07q_compactListProgress{border-top:.5px solid var(--mn-line);color:var(--mn-faint);text-align:center;justify-items:stretch;gap:8px;margin-top:8px;padding:10px 2px 2px;font-size:12px;line-height:18px;display:grid}.IIa07q_compactListProgress button{width:100%}.IIa07q_modalPortal{z-index:1000;isolation:isolate;pointer-events:none;position:fixed;inset:0}.IIa07q_modalTheme.IIa07q_modalTheme.IIa07q_modalTheme{width:auto;min-width:0;height:auto;min-height:0;color:var(--mn-text);pointer-events:none;background:0 0;display:block;position:absolute;inset:0;overflow:visible}.IIa07q_modalBackdrop{z-index:0;overscroll-behavior:contain;padding:max(24px, var(--dsh-frame-top-clearance,24px)) 24px;background:var(--dsw-alias-bg-mask-1);backdrop-filter:var(--dsw-mask-blur);touch-action:none;pointer-events:auto;justify-content:center;align-items:center;animation:.18s ease-out both IIa07q_mnemon-dialog-backdrop-enter;display:flex;position:fixed;inset:0;overflow:hidden}.IIa07q_modal{box-sizing:border-box;border-radius:var(--dsw-radius-panel);background:linear-gradient(var(--mn-layer-2), var(--mn-layer-2)), var(--mn-surface);width:min(640px,100%);min-height:0;max-height:100%;box-shadow:var(--dsw-elevation-prominent);touch-action:auto;transform-origin:50% 100%;backface-visibility:hidden;will-change:transform, opacity;border:0;flex-direction:column;animation:.2s cubic-bezier(.2,.75,.2,1) both IIa07q_mnemon-dialog-enter;display:flex;overflow:hidden}.IIa07q_modalBackdrop[data-closing],.IIa07q_modal[data-closing]{pointer-events:none}.IIa07q_modalDragHandle{display:none}.IIa07q_modalWide{width:min(760px,100%)}.IIa07q_modal>header{flex:none;justify-content:space-between;align-items:flex-start;gap:8px;padding:22px 14px 12px 24px;display:flex}.IIa07q_modal>header>div{min-width:0;padding-top:2px}.IIa07q_modal>header h2{margin:0;font-size:16px;font-weight:500;line-height:24px}.IIa07q_modal>header p{overflow-wrap:anywhere;max-width:64ch;color:var(--mn-muted);margin:4px 0 0;font-size:13px;line-height:20px}.IIa07q_modal>header .IIa07q_iconButton{color:var(--mn-muted);flex:none}.IIa07q_modalBody{overscroll-behavior:contain;scrollbar-gutter:stable;touch-action:pan-y;-webkit-overflow-scrolling:touch;min-height:0;padding:8px 24px 20px;overflow:hidden auto}.IIa07q_modalFooter{background:0 0;flex:none;justify-content:flex-end;align-items:center;gap:12px;padding:4px 24px 24px;display:flex}.IIa07q_modalFooter button{min-height:36px;padding-inline:14px}.IIa07q_modalFooterMeta{color:var(--mn-faint);margin-right:auto;font-size:12px;line-height:18px}.IIa07q_modalFooterActions{justify-content:flex-end;align-items:center;gap:8px;min-width:0;margin-left:auto;display:flex}@keyframes IIa07q_mnemon-dialog-backdrop-enter{0%{opacity:0}}@keyframes IIa07q_mnemon-dialog-enter{0%{opacity:0;transform:translateY(8px)scale(.985)}}@keyframes IIa07q_mnemon-sheet-enter{0%{transform:translateY(calc(100% + 32px))}to{transform:translate3d(0, var(--mn-modal-drag-y,0px), 0)}}@keyframes IIa07q_mnemon-metadata-sweep{to{transform:translate(120%)}}@keyframes IIa07q_mnemon-metadata-refreshed{0%{border-color:color-mix(in srgb, var(--mn-accent) 60%, var(--mn-card-line));box-shadow:0 0 0 2px color-mix(in srgb, var(--mn-accent) 14%, transparent)}to{border-color:var(--mn-card-line);box-shadow:0 0 #0000}}.IIa07q_healthStrip{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);flex-wrap:wrap;margin-bottom:16px;display:flex;position:relative;overflow:hidden}.IIa07q_asyncStatusBlock{min-width:0;min-height:36px;position:relative}.IIa07q_healthStrip article{box-sizing:border-box;border-top:.5px solid var(--mn-line);border-left:.5px solid var(--mn-line);flex:150px;align-items:flex-start;gap:10px;min-width:0;min-height:76px;margin:-.5px 0 0 -.5px;padding:14px 16px;display:flex}.IIa07q_healthStrip article>div{min-width:0}.IIa07q_healthStrip small{color:var(--mn-faint);margin-bottom:2px;font-size:12px;line-height:18px;display:block}.IIa07q_healthStrip strong{text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:500;line-height:22px;display:block;overflow:hidden}.IIa07q_healthStrip p{color:var(--mn-faint);text-overflow:ellipsis;white-space:nowrap;margin:2px 0 0;font-size:12px;line-height:18px;overflow:hidden}.IIa07q_healthIndicator{border-radius:50%;flex:none;width:6px;height:6px;margin-top:6px}.IIa07q_healthGood{background:var(--mn-success)}.IIa07q_healthBad{background:var(--mn-danger)}.IIa07q_healthMuted{background:var(--mn-idle)}.IIa07q_providerHealth{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);margin-bottom:16px;padding:16px}.IIa07q_providerHealthList{margin-top:8px}.IIa07q_providerHealthList article{align-items:center;gap:12px;min-width:0;min-height:56px;padding:8px 0;display:flex}.IIa07q_providerHealthList article+article{border-top:.5px solid var(--mn-line)}.IIa07q_providerHealthOff{border-top:.5px solid var(--mn-line);min-width:0;color:var(--mn-faint);justify-content:space-between;align-items:center;gap:12px;margin-top:4px;padding-top:10px;font-size:12px;line-height:18px;display:flex}.IIa07q_providerHealthMark{box-sizing:border-box;border:.5px solid var(--mn-line-strong);border-radius:var(--dsw-radius-md);flex:none;place-items:center;width:36px;height:36px;padding:6px;display:grid;overflow:hidden}.IIa07q_providerHealthMark>img,.IIa07q_providerHealthMark>svg{object-fit:contain;border-radius:4px;width:100%;height:100%;display:block}.IIa07q_providerHealthCopy{flex:1;gap:0;min-width:0;display:grid}.IIa07q_providerHealthCopy strong{text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:500;line-height:20px;overflow:hidden}.IIa07q_providerHealthCopy small{color:var(--mn-faint);font-size:12px;line-height:18px}.IIa07q_providerHealthCopy p{color:var(--mn-danger);text-overflow:ellipsis;white-space:nowrap;margin:2px 0 0;font-size:12px;line-height:18px;overflow:hidden}.IIa07q_providerHealthMeta{flex:none;align-items:center;gap:6px;display:flex}.IIa07q_providerHealthMeta small{color:var(--mn-faint);font-variant-numeric:tabular-nums;font-size:12px;line-height:18px}.IIa07q_providerHealthSignal{background:var(--mn-idle);border-radius:50%;width:6px;height:6px}.IIa07q_providerHealthList article[data-status=healthy] .IIa07q_providerHealthSignal{background:var(--mn-success)}.IIa07q_providerHealthList article[data-status=unhealthy] .IIa07q_providerHealthSignal{background:var(--mn-danger)}.IIa07q_providerHealthList article[data-status=idle] .IIa07q_providerHealthSignal{background:var(--mn-idle)}.IIa07q_storageDomains{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);margin-bottom:16px;padding:16px}.IIa07q_storageRoot{border-radius:var(--dsw-radius-md);background:var(--mn-block-fill);justify-content:space-between;align-items:center;gap:16px;min-width:0;margin-top:12px;padding:10px 12px;display:flex}.IIa07q_storageRoot>div:first-child{gap:2px;min-width:0;display:grid}.IIa07q_storageRoot span,.IIa07q_storageRoot small{color:var(--mn-faint);font-size:12px;line-height:18px}.IIa07q_storageRoot code{color:var(--mn-muted);text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}.IIa07q_storageRoot>div:last-child{flex:none;justify-items:end;gap:2px;display:grid}.IIa07q_storageRoot strong{font-variant-numeric:tabular-nums;font-size:13px;font-weight:500}.IIa07q_storageAreaGrid{grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin-top:8px;display:grid}.IIa07q_storageAreaGrid article{box-sizing:border-box;border:.5px solid var(--mn-line);border-radius:var(--dsw-radius-md);flex-direction:column;min-width:0;min-height:148px;padding:12px 14px;display:flex}.IIa07q_storageAreaGrid article>header{justify-content:space-between;align-items:center;gap:8px;display:flex}.IIa07q_storageAreaGrid article>header>div{align-items:center;gap:8px;min-width:0;display:flex}.IIa07q_storageAreaGrid article>header span{background:var(--mn-idle);border-radius:50%;flex:none;width:6px;height:6px}.IIa07q_storageAreaGrid article[data-status=ready]>header span{background:var(--mn-success)}.IIa07q_storageAreaGrid article[data-status=invalid]>header span{background:var(--mn-danger)}.IIa07q_storageAreaGrid article>header strong{text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:500;overflow:hidden}.IIa07q_storageAreaGrid article>header em{color:var(--mn-faint);white-space:nowrap;font-size:11px;font-style:normal;line-height:14px}.IIa07q_storageAreaMetric{align-items:baseline;gap:6px;margin-top:12px;display:flex}.IIa07q_storageAreaMetric strong{font-variant-numeric:tabular-nums;font-size:20px;font-weight:500;line-height:28px}.IIa07q_storageAreaMetric span{color:var(--mn-faint);font-size:12px}.IIa07q_storageAreaMetric code{color:var(--mn-faint);margin-left:auto;font-size:11px}.IIa07q_storageAreaGrid article>p{min-height:36px;color:var(--mn-faint);margin:6px 0 8px;font-size:12px;line-height:18px}.IIa07q_storagePath{border-top:.5px solid var(--mn-line);color:var(--mn-faint);text-overflow:ellipsis;white-space:nowrap;margin-top:auto;padding-top:8px;font-size:11px;line-height:16px;display:block;overflow:hidden}.IIa07q_storageAreaGrid article>small{color:var(--mn-danger);margin-top:6px;font-size:12px;line-height:18px;display:block}.IIa07q_storageUnavailable{border-radius:var(--dsw-radius-md);min-height:120px;color:var(--mn-muted);background:var(--mn-block-fill);text-align:center;place-content:center;gap:4px;margin-top:12px;display:grid}.IIa07q_storageUnavailable strong{font-size:13px;font-weight:500}.IIa07q_storageUnavailable p{max-width:520px;color:var(--mn-faint);margin:0;font-size:12px;line-height:18px}.IIa07q_storageFootnote{color:var(--mn-faint);margin:12px 0 0;font-size:12px;line-height:18px}.IIa07q_statusSectionHeader{justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.IIa07q_statusSectionHeader h3{margin:0;font-size:14px;font-weight:500;line-height:22px}.IIa07q_statusSectionHeader p{max-width:640px;color:var(--mn-faint);margin:2px 0 0;font-size:12px;line-height:18px}.IIa07q_phaseBadge{color:var(--mn-muted);background:var(--mn-fill);font-variant-numeric:tabular-nums;white-space:nowrap;border-radius:999px;flex:none;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.IIa07q_statusHeaderActions{align-items:center;gap:8px;display:flex}.IIa07q_versionDialogBody{grid-template-columns:minmax(0,1fr);gap:12px;display:grid}.IIa07q_versionChecking{min-height:112px;color:var(--mn-muted);justify-content:center;align-items:center;gap:10px;font-size:13px;display:flex}.IIa07q_versionChecking span{border:2px solid color-mix(in srgb, currentColor 25%, transparent);border-top-color:currentColor;border-radius:50%;width:14px;height:14px;animation:.9s linear infinite IIa07q_mnemon-spin}.IIa07q_versionError,.IIa07q_versionResult{border-radius:var(--dsw-radius-md);color:var(--mn-danger);background:color-mix(in srgb, var(--mn-danger) 8%, transparent);padding:10px 12px}.IIa07q_versionResult{color:var(--mn-success);background:color-mix(in srgb, var(--mn-success) 8%, transparent)}.IIa07q_versionError strong,.IIa07q_versionResult strong{font-size:13px;font-weight:500}.IIa07q_versionError p,.IIa07q_versionResult p{color:var(--mn-muted);margin:2px 0 0;font-size:12px;line-height:18px}.IIa07q_versionList{grid-template-columns:minmax(0,1fr);gap:8px;display:grid}.IIa07q_versionList article{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);padding:12px 14px}.IIa07q_versionList article>header{justify-content:space-between;align-items:center;gap:12px;display:flex}.IIa07q_versionList article>header>div{align-items:center;gap:8px;min-width:0;display:flex}.IIa07q_versionList article>header strong{font-size:14px;font-weight:500;line-height:22px}.IIa07q_versionList article>header span{color:var(--mn-muted);background:var(--mn-fill);border-radius:999px;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.IIa07q_versionList article>header em{color:var(--mn-success);white-space:nowrap;font-size:12px;font-style:normal;line-height:18px}.IIa07q_versionList article[data-outdated]>header em{color:var(--mn-accent)}.IIa07q_versionNumbers{grid-template-columns:1fr auto 1fr;align-items:end;gap:10px;margin-top:10px;display:grid}.IIa07q_versionNumbers>div{gap:2px;display:grid}.IIa07q_versionNumbers small{color:var(--mn-faint);font-size:12px;line-height:18px}.IIa07q_versionNumbers code{font-size:13px}.IIa07q_versionNumbers>span{color:var(--mn-faint);padding-bottom:1px}.IIa07q_versionLocation{min-width:0;color:var(--mn-faint);gap:6px;margin-top:8px;font-size:12px;line-height:18px;display:flex}.IIa07q_versionLocation>span{flex:none}.IIa07q_versionLocation>code{min-width:0;color:inherit;text-overflow:ellipsis;white-space:nowrap;font-size:11px;overflow:hidden}.IIa07q_versionList article>footer{border-top:.5px solid var(--mn-line);justify-content:space-between;align-items:flex-end;gap:16px;margin-top:10px;padding-top:10px;display:flex}.IIa07q_versionList article>footer p{max-width:470px;color:var(--mn-muted);margin:0;font-size:12px;line-height:18px}.IIa07q_versionList article>footer button{flex:none}.IIa07q_versionList article>header em[data-state=unknown],.IIa07q_versionList article>header em[data-state=local],.IIa07q_versionList article>header em[data-state=missing]{color:var(--mn-faint)}.IIa07q_versionList article>header em[data-state=restart]{color:var(--mn-accent)}.IIa07q_versionNotice{color:var(--mn-muted);margin:8px 0 0;font-size:12px;line-height:18px}.IIa07q_versionGuidance{border-radius:var(--dsw-radius-md);background:var(--mn-block-fill);gap:6px;min-width:0;margin-top:10px;padding:10px 12px;display:grid}.IIa07q_versionGuidance>strong{font-size:13px;font-weight:500}.IIa07q_versionGuidance>p{color:var(--mn-muted);margin:0;font-size:12px;line-height:18px}.IIa07q_versionGuidance>a{color:var(--dsw-alias-link,var(--mn-accent));justify-self:start;font-size:12px}.IIa07q_versionGuidanceDetails{min-width:0;color:var(--mn-muted);font-size:12px;line-height:18px}.IIa07q_versionGuidanceDetails>summary{cursor:pointer}.IIa07q_versionGuidanceDetails>p{margin:8px 0}.IIa07q_versionGuidanceDetails>a{color:var(--dsw-alias-link,var(--mn-accent))}.IIa07q_versionCommand{border-radius:var(--dsw-radius-sm);background:var(--mn-layer-1);flex-wrap:wrap;align-items:center;gap:8px;min-width:0;padding:8px 10px;display:flex}.IIa07q_versionCommand>code{overflow-wrap:anywhere;white-space:pre-wrap;user-select:text;flex:1;min-width:0;font-size:12px}.IIa07q_versionCommand>button{flex:none}.IIa07q_versionCommand>small{color:var(--mn-faint);flex-basis:100%;font-size:12px}.IIa07q_versionPackages{border-top:.5px solid var(--mn-line);min-width:0;margin-top:12px}.IIa07q_versionPackagesToggle{width:100%;min-height:44px;color:var(--mn-text);text-align:start;cursor:pointer;background:0 0;border:0;flex-wrap:wrap;align-items:center;gap:8px;padding:10px 0 0;display:flex}.IIa07q_versionPackagesToggle>strong{font-size:13px;font-weight:500}.IIa07q_versionPackagesToggle>small{color:var(--mn-faint);margin-left:auto;font-size:12px}.IIa07q_versionPackages h4{color:var(--mn-faint);margin:16px 0 8px;font-size:12px;font-weight:500;line-height:18px}.IIa07q_versionPackages ul{gap:8px;margin:0;padding:0;list-style:none;display:grid}.IIa07q_versionPackage{border:.5px solid var(--mn-line);border-radius:var(--dsw-radius-md);min-width:0;padding:10px 12px}.IIa07q_versionPackageHeader{flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:6px 12px;display:flex}.IIa07q_versionPackageHeader strong{overflow-wrap:anywhere;min-width:0;font-size:13px;font-weight:500}.IIa07q_versionPackageHeader em{color:var(--mn-faint);font-size:12px;font-style:normal}.IIa07q_versionPackageHeader em[data-state=available],.IIa07q_versionPackageHeader em[data-state=restart]{color:var(--mn-accent)}.IIa07q_versionPackageHeader em[data-state=current]{color:var(--mn-success)}.IIa07q_versionPackageMeta,.IIa07q_versionPackageNumbers{color:var(--mn-faint);flex-wrap:wrap;gap:6px 14px;margin-top:6px;font-size:12px;line-height:18px;display:flex}.IIa07q_versionPackageNumbers code{color:var(--mn-text)}.IIa07q_versionPackageAction{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;margin-top:8px;display:flex}.IIa07q_versionPackageAction p{min-width:150px;color:var(--mn-muted);flex:1;margin:0;font-size:12px;line-height:18px}.IIa07q_versionPackageAction button{flex:none}@media (width<=1000px){.IIa07q_sourceManagementSummary{grid-template-columns:1fr 1fr}.IIa07q_sourceManagementCapabilities{grid-column:1/-1}.IIa07q_storageAreaGrid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (width<=760px){.IIa07q_shell{min-height:0;overflow:hidden}.IIa07q_sourceManagementSummary{grid-template-columns:1fr}.IIa07q_sourceManagementSummary dl,.IIa07q_sourceManagementCapabilities{grid-column:auto}.IIa07q_masthead{padding:8px 16px 2px}.IIa07q_alert,.IIa07q_notice{margin-inline:16px}.IIa07q_topNavigation{padding:0 16px}.IIa07q_workspacePicker>[data-part=label]{display:none}.IIa07q_workspacePicker button{width:min(170px,32vw)}.IIa07q_modalBackdrop{padding:max(10px, env(safe-area-inset-top,0px)) 0 0;align-items:flex-end}.IIa07q_modal,.IIa07q_modalWide{width:100vw;max-height:calc(100vh - max(10px, env(safe-area-inset-top,0px)));border-radius:var(--dsw-radius-xl) var(--dsw-radius-xl) 0 0;transform:translate3d(0, var(--mn-modal-drag-y,0px), 0);animation-name:IIa07q_mnemon-sheet-enter;animation-duration:.34s;animation-timing-function:cubic-bezier(.2,.82,.2,1)}.IIa07q_modalDragHandle{cursor:grab;touch-action:none;user-select:none;flex:none;place-items:center;width:100%;height:28px;display:grid}.IIa07q_modalDragHandle span{background:var(--mn-line-strong);border-radius:999px;width:36px;height:4px;transition:width .14s,background-color .14s}.IIa07q_modal[data-dragging] .IIa07q_modalDragHandle{cursor:grabbing}.IIa07q_modal[data-dragging] .IIa07q_modalDragHandle span{background:var(--dsw-alias-border-l4);width:44px}.IIa07q_modal>header{padding:10px max(14px, env(safe-area-inset-right,0px)) 12px max(14px, env(safe-area-inset-left,0px));gap:12px}.IIa07q_modal>header p{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.IIa07q_modal>header .IIa07q_iconButton{width:44px;height:44px;margin:-4px -5px -4px 0}.IIa07q_modalBody{padding:14px max(14px, env(safe-area-inset-right,0px)) 18px max(14px, env(safe-area-inset-left,0px));scrollbar-gutter:auto;scroll-padding-bottom:12px}.IIa07q_modalBody button{min-height:44px}.IIa07q_modalFooter{padding:10px max(14px, env(safe-area-inset-right,0px)) calc(10px + env(safe-area-inset-bottom,0px)) max(14px, env(safe-area-inset-left,0px));flex-direction:column;align-items:stretch;gap:8px}.IIa07q_modalFooterMeta{max-width:none;margin:0}.IIa07q_modalFooterActions{grid-template-columns:minmax(82px,.55fr) minmax(0,1.45fr);gap:8px;width:100%;margin:0;display:grid}.IIa07q_modalFooterActions button{white-space:normal;min-width:0;min-height:44px;padding-block:8px}.IIa07q_versionList article>footer{flex-direction:column;align-items:stretch}.IIa07q_nav{gap:22px}.IIa07q_page{padding:16px 16px calc(170px + env(safe-area-inset-bottom,0px))}.IIa07q_pageHeader{gap:10px;display:grid}.IIa07q_pageHeaderMeta{justify-content:flex-start}.IIa07q_healthStrip article{flex-basis:100%}.IIa07q_providerHealthMeta{flex-direction:column;align-items:flex-end;gap:4px}.IIa07q_storageRoot{flex-direction:column;align-items:flex-start}.IIa07q_storageRoot>div:last-child{justify-items:start}.IIa07q_storageAreaGrid{grid-template-columns:1fr}}@media (width<=520px){.IIa07q_workspacePicker select{width:min(150px,39vw)}.IIa07q_nav{scroll-snap-type:x proximity;gap:18px}.IIa07q_nav button{scroll-snap-align:start}.IIa07q_pageHeaderMeta{align-items:stretch}.IIa07q_pageHeaderMeta>code{align-items:center;display:inline-flex}.IIa07q_pageHeaderMeta>button{flex:1}.IIa07q_emptyState{min-height:180px;padding:24px 16px}.IIa07q_formGrid{grid-template-columns:1fr}}@media (width<=360px){.IIa07q_modalFooterActions{grid-template-columns:1fr}}@media (height<=420px){.IIa07q_modal>header p{white-space:nowrap;text-overflow:ellipsis;display:block;overflow:hidden}}@media (width>=761px) and (height<=560px){.IIa07q_modalBackdrop{padding:8px}}@supports (height:100dvh){@media (width<=760px){.IIa07q_modal,.IIa07q_modalWide{max-height:calc(100dvh - max(10px, env(safe-area-inset-top,0px)))}}}@media (width<=1000px) and (height<=760px){.IIa07q_shell{min-height:0}.IIa07q_masthead{min-height:44px}}@media (width<=760px) and (pointer:coarse){.IIa07q_shell input,.IIa07q_shell select,.IIa07q_shell textarea{font-size:16px!important}}@media (pointer:coarse){.IIa07q_modal>header .IIa07q_iconButton{width:44px;min-width:44px;height:44px;min-height:44px}.IIa07q_modalBody button,.IIa07q_modalFooter button{min-height:44px}}@media (prefers-reduced-motion:reduce){.IIa07q_shell *,.IIa07q_shell :before,.IIa07q_shell :after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}.IIa07q_modalBackdrop,.IIa07q_modal{animation:none!important}}.IIa07q_page[data-source-page]>.IIa07q_workspacePicker{margin-bottom:16px}.IIa07q_page[data-source-page] .IIa07q_page{width:100%;min-height:0;margin:0;padding:0}@container IIa07q_mnemon-workbench (width<=520px){.IIa07q_masthead{flex-wrap:wrap;gap:4px 8px;min-height:0;padding:8px 16px 2px}.IIa07q_shell .IIa07q_brand{display:contents}.IIa07q_brand h1{text-overflow:ellipsis;white-space:nowrap;flex:1 1 0;min-width:0;overflow:hidden}.IIa07q_backButton>span,.IIa07q_storageMode{display:none}.IIa07q_backButton{min-width:28px;padding-inline:4px}.IIa07q_shell .IIa07q_masthead .IIa07q_headerActions{margin-left:auto}.IIa07q_shell .IIa07q_masthead .IIa07q_compositionStatus>span:not([data-state]){display:none}.IIa07q_shell .IIa07q_masthead .IIa07q_statusCluster>.IIa07q_iconButton{display:inline-flex}.IIa07q_shell .IIa07q_masthead .IIa07q_workspacePicker{flex:1 0 100%;order:1}.IIa07q_shell .IIa07q_masthead .IIa07q_workspacePicker>[data-part=label]{display:none}.IIa07q_shell .IIa07q_masthead .IIa07q_workspacePicker>:last-child{flex:1;min-width:0}.IIa07q_shell .IIa07q_masthead .IIa07q_workspacePicker button{width:100%;min-width:0}.IIa07q_shell .IIa07q_masthead .IIa07q_workspaceMismatch{flex:1 0 100%;order:2}.IIa07q_shell .IIa07q_masthead .IIa07q_workspaceMismatch>span{display:inline}.IIa07q_alert,.IIa07q_notice{margin-inline:16px}.IIa07q_topNavigation{padding-inline:16px}.IIa07q_noticeToggle{border-radius:var(--dsw-radius-md);min-width:0;min-height:28px;color:var(--dsw-alias-state-warn-label,var(--mn-text));background:var(--dsw-alias-state-warn-tertiary,color-mix(in srgb, var(--mn-warn) 12%, transparent));text-align:left;cursor:pointer;border:0;justify-content:space-between;align-items:center;gap:8px;margin:8px 16px 0;padding:4px 12px;font-size:12px;line-height:18px;display:flex}.IIa07q_noticeToggle>span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.IIa07q_noticeToggle>svg{flex:none;transform:rotate(-90deg)}.IIa07q_noticeContents{display:none}.IIa07q_noticeGroup[data-expanded] .IIa07q_noticeContents{display:flex}.IIa07q_noticeGroup[data-expanded] .IIa07q_noticeToggle>svg{transform:rotate(90deg)}}@media (pointer:coarse){.IIa07q_masthead :is(button,select),.IIa07q_noticeToggle,.IIa07q_nav button{min-height:44px}.IIa07q_sectionHeading button{min-width:44px;min-height:44px}.IIa07q_primaryButton,.IIa07q_secondaryButton,.IIa07q_ghostButton,.IIa07q_dangerButton,.IIa07q_dangerSolidButton,.IIa07q_page :is(input:not([type=checkbox]):not([type=radio]),select,textarea){min-height:44px}.IIa07q_canvas{overscroll-behavior:contain}}";
|
|
3972
4004
|
const tagId$13 = "dsh-mnemon/src/client/MnemonView.module.css";
|
|
3973
4005
|
if (typeof document !== "undefined") {
|
|
3974
4006
|
let tag = document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$13) + "]");
|
|
@@ -4021,6 +4053,7 @@ window.__ModuleLoader__.load({
|
|
|
4021
4053
|
"mnemon-metadata-sweep": "IIa07q_mnemon-metadata-sweep",
|
|
4022
4054
|
"mnemon-sheet-enter": "IIa07q_mnemon-sheet-enter",
|
|
4023
4055
|
"mnemon-spin": "IIa07q_mnemon-spin",
|
|
4056
|
+
"mnemon-workbench": "IIa07q_mnemon-workbench",
|
|
4024
4057
|
"modal": "IIa07q_modal",
|
|
4025
4058
|
"modalBackdrop": "IIa07q_modalBackdrop",
|
|
4026
4059
|
"modalBody": "IIa07q_modalBody",
|
|
@@ -4033,6 +4066,9 @@ window.__ModuleLoader__.load({
|
|
|
4033
4066
|
"modalWide": "IIa07q_modalWide",
|
|
4034
4067
|
"nav": "IIa07q_nav",
|
|
4035
4068
|
"notice": "IIa07q_notice",
|
|
4069
|
+
"noticeContents": "IIa07q_noticeContents",
|
|
4070
|
+
"noticeGroup": "IIa07q_noticeGroup",
|
|
4071
|
+
"noticeToggle": "IIa07q_noticeToggle",
|
|
4036
4072
|
"offline": "IIa07q_offline",
|
|
4037
4073
|
"online": "IIa07q_online",
|
|
4038
4074
|
"page": "IIa07q_page",
|
|
@@ -8494,8 +8530,8 @@ window.__ModuleLoader__.load({
|
|
|
8494
8530
|
/**
|
|
8495
8531
|
* What this computer is called, where on the branch the memory goes and whose name
|
|
8496
8532
|
* its commits carry. Each field shows the value in use; the computer's name is the
|
|
8497
|
-
* host name or a typed one
|
|
8498
|
-
*
|
|
8533
|
+
* host name or a typed one. The default author follows this computer's Git
|
|
8534
|
+
* identity with a placeholder fallback; a custom author overrides it.
|
|
8499
8535
|
*/
|
|
8500
8536
|
function AdvancedSettings({ client, status, disabled, t, onSaved }) {
|
|
8501
8537
|
const [open, setOpen] = (0, react.useState)(false);
|
|
@@ -10546,13 +10582,13 @@ window.__ModuleLoader__.load({
|
|
|
10546
10582
|
let revision = management.revision;
|
|
10547
10583
|
let sequence = 0;
|
|
10548
10584
|
let accepted = 0;
|
|
10549
|
-
async function request(mode, operation, input, confirmed = true) {
|
|
10585
|
+
async function request(mode, operation, input, confirmed = true, options) {
|
|
10550
10586
|
const ticket = ++sequence;
|
|
10551
10587
|
if (mode === "assist" && !management.assistance?.operations.includes(operation)) throw new Error("Host assistance is unavailable for this Source instance: " + operation);
|
|
10552
10588
|
const result = mode === "assist" ? await management.assistance.execute(operation, input, {
|
|
10553
10589
|
expectedRevision: revision,
|
|
10554
10590
|
confirmed
|
|
10555
|
-
}) : mode === "read" ? await management.read(operation, input) : await management.mutate(operation, input, {
|
|
10591
|
+
}) : mode === "read" ? await (options === void 0 ? management.read(operation, input) : management.read(operation, input, options)) : await management.mutate(operation, input, {
|
|
10556
10592
|
confirmed: true,
|
|
10557
10593
|
expectedRevision: revision
|
|
10558
10594
|
});
|
|
@@ -10565,7 +10601,7 @@ window.__ModuleLoader__.load({
|
|
|
10565
10601
|
return {
|
|
10566
10602
|
canAssist: (operation) => management.assistance?.operations.includes(operation) === true,
|
|
10567
10603
|
assist: (operation, input, confirmed) => request("assist", operation, input, confirmed),
|
|
10568
|
-
read: (operation, input = null) => request("read", operation, input),
|
|
10604
|
+
read: (operation, input = null, options) => request("read", operation, input, true, options),
|
|
10569
10605
|
mutate: (operation, input, confirmed) => {
|
|
10570
10606
|
if (confirmed !== true) return Promise.reject(/* @__PURE__ */ new Error("Source page mutation requires explicit confirmation"));
|
|
10571
10607
|
return request("mutate", operation, input);
|
|
@@ -12003,8 +12039,8 @@ window.__ModuleLoader__.load({
|
|
|
12003
12039
|
}
|
|
12004
12040
|
/**
|
|
12005
12041
|
* 技能管理's settings on its page under Plugins. Switches apply at once; the
|
|
12006
|
-
* review parameters wait
|
|
12007
|
-
*
|
|
12042
|
+
* destination and folded review parameters wait for their own Apply. The
|
|
12043
|
+
* destination also applies to manual drafts while evolution is off.
|
|
12008
12044
|
*/
|
|
12009
12045
|
function SkillsSettings(props) {
|
|
12010
12046
|
const { scope, page, t } = props;
|
|
@@ -12019,6 +12055,9 @@ window.__ModuleLoader__.load({
|
|
|
12019
12055
|
const autoBacktest = useLive(saved.autoBacktest, write("autoBacktest"));
|
|
12020
12056
|
const hints = useLive(saved.hints, write("hints"));
|
|
12021
12057
|
const sidebar = useLive(saved.sidebar, write("sidebar"));
|
|
12058
|
+
const destination = useStaged({ targetScope: saved.targetScope }, async (draft) => {
|
|
12059
|
+
await scope.mutate([set("targetScope", draft.targetScope)]);
|
|
12060
|
+
});
|
|
12022
12061
|
const parameters = useStaged(parametersOf(saved), async (draft) => {
|
|
12023
12062
|
const changed = PARAMETERS.filter((field) => parameterValue(field, draft[field.key]) !== saved[field.key]);
|
|
12024
12063
|
if (changed.length > 0) await scope.mutate(changed.map((field) => set(field.key, parameterValue(field, draft[field.key]))));
|
|
@@ -12055,6 +12094,35 @@ window.__ModuleLoader__.load({
|
|
|
12055
12094
|
disabled,
|
|
12056
12095
|
onChange: allowUpdate.set
|
|
12057
12096
|
}),
|
|
12097
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(SelectRow, {
|
|
12098
|
+
id: "mnemon-skills-target",
|
|
12099
|
+
label: t("skills.targetScope"),
|
|
12100
|
+
hint: t("skills.targetScopeHint"),
|
|
12101
|
+
value: destination.draft.targetScope,
|
|
12102
|
+
options: [
|
|
12103
|
+
"user",
|
|
12104
|
+
"project",
|
|
12105
|
+
"storage"
|
|
12106
|
+
].map((value) => ({
|
|
12107
|
+
value,
|
|
12108
|
+
label: t(`skills.targetScope.${value}`)
|
|
12109
|
+
})),
|
|
12110
|
+
disabled: disabled || destination.saving,
|
|
12111
|
+
onChange: (targetScope) => destination.edit({ targetScope })
|
|
12112
|
+
}),
|
|
12113
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(PanelActions, {
|
|
12114
|
+
dirty: destination.dirty,
|
|
12115
|
+
saving: destination.saving,
|
|
12116
|
+
applied: destination.applied,
|
|
12117
|
+
failed: destination.failed,
|
|
12118
|
+
disabled,
|
|
12119
|
+
invalid: null,
|
|
12120
|
+
t,
|
|
12121
|
+
onDiscard: destination.discard,
|
|
12122
|
+
onApply: () => {
|
|
12123
|
+
destination.apply();
|
|
12124
|
+
}
|
|
12125
|
+
}),
|
|
12058
12126
|
evolution.value && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ToggleRow, {
|
|
12059
12127
|
id: "mnemon-skills-backtest",
|
|
12060
12128
|
label: t("skills.autoBacktest"),
|
|
@@ -12636,6 +12704,7 @@ window.__ModuleLoader__.load({
|
|
|
12636
12704
|
const choiceOf = (review) => ({
|
|
12637
12705
|
enabled: review.enabled,
|
|
12638
12706
|
runtimeMemory: review.runtimeMemory,
|
|
12707
|
+
persistWatermark: review.persistWatermark,
|
|
12639
12708
|
provider: review.provider,
|
|
12640
12709
|
fallback: review.fallback,
|
|
12641
12710
|
agentTeams: review.agentTeams
|
|
@@ -12757,6 +12826,14 @@ window.__ModuleLoader__.load({
|
|
|
12757
12826
|
disabled: props.disabled,
|
|
12758
12827
|
onChange: (enabled) => props.onChoice({ enabled })
|
|
12759
12828
|
}), choice.enabled && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
|
|
12829
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(ToggleRow, {
|
|
12830
|
+
id: "mnemon-review-persist-watermark",
|
|
12831
|
+
label: t("config.reviewPersistWatermark"),
|
|
12832
|
+
hint: t("config.reviewPersistWatermarkHint"),
|
|
12833
|
+
checked: choice.persistWatermark,
|
|
12834
|
+
disabled: props.disabled,
|
|
12835
|
+
onChange: (persistWatermark) => props.onChoice({ persistWatermark })
|
|
12836
|
+
}),
|
|
12760
12837
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(ToggleRow, {
|
|
12761
12838
|
id: "mnemon-review-runtime-memory",
|
|
12762
12839
|
label: t("config.reviewRuntimeMemory"),
|
|
@@ -13246,6 +13323,51 @@ window.__ModuleLoader__.load({
|
|
|
13246
13323
|
});
|
|
13247
13324
|
});
|
|
13248
13325
|
//#endregion
|
|
13326
|
+
//#region src/client/document-visibility.ts
|
|
13327
|
+
const visible = () => typeof document === "undefined" || document.visibilityState !== "hidden";
|
|
13328
|
+
const subscribe = (listener) => {
|
|
13329
|
+
document.addEventListener("visibilitychange", listener);
|
|
13330
|
+
return () => {
|
|
13331
|
+
document.removeEventListener("visibilitychange", listener);
|
|
13332
|
+
};
|
|
13333
|
+
};
|
|
13334
|
+
/** A selected panel in a background browser tab is still an inactive reader. */
|
|
13335
|
+
function useDocumentVisible() {
|
|
13336
|
+
return (0, react.useSyncExternalStore)(subscribe, visible, () => true);
|
|
13337
|
+
}
|
|
13338
|
+
//#endregion
|
|
13339
|
+
//#region src/client/change-signal.ts
|
|
13340
|
+
/**
|
|
13341
|
+
* A revision other surfaces bump when something they cannot observe directly
|
|
13342
|
+
* changed, such as a component switched on DSH's Plugins page. Readers reload
|
|
13343
|
+
* their own data when the revision moves.
|
|
13344
|
+
*/
|
|
13345
|
+
var MnemonChangeSignal = class {
|
|
13346
|
+
settleMs;
|
|
13347
|
+
revision = 0;
|
|
13348
|
+
pending;
|
|
13349
|
+
listeners = /* @__PURE__ */ new Set();
|
|
13350
|
+
constructor(settleMs = 100) {
|
|
13351
|
+
this.settleMs = settleMs;
|
|
13352
|
+
}
|
|
13353
|
+
getSnapshot = () => this.revision;
|
|
13354
|
+
subscribe = (listener) => {
|
|
13355
|
+
this.listeners.add(listener);
|
|
13356
|
+
return () => {
|
|
13357
|
+
this.listeners.delete(listener);
|
|
13358
|
+
};
|
|
13359
|
+
};
|
|
13360
|
+
/** A burst of announcements, such as one per component a write switched, moves the revision once. */
|
|
13361
|
+
bump = () => {
|
|
13362
|
+
if (this.pending !== void 0) return;
|
|
13363
|
+
this.pending = setTimeout(() => {
|
|
13364
|
+
this.pending = void 0;
|
|
13365
|
+
this.revision += 1;
|
|
13366
|
+
for (const listener of [...this.listeners]) listener();
|
|
13367
|
+
}, this.settleMs);
|
|
13368
|
+
};
|
|
13369
|
+
};
|
|
13370
|
+
//#endregion
|
|
13249
13371
|
//#region \0dsh-mnemon-css:/home/runner/work/dsh-mnemon/dsh-mnemon/src/client/SkillTurnTail.module.css.mjs
|
|
13250
13372
|
const css$2 = ".ebWjsW_root{min-width:0;max-width:100%;height:24px;color:var(--dsw-alias-label-tertiary);align-items:center;gap:6px;margin:2px 0;padding:0 6px;font-size:12px;line-height:18px;display:flex}.ebWjsW_mark{flex:none;display:inline-flex}.ebWjsW_label{flex:none;font-weight:500}.ebWjsW_items{align-items:center;gap:4px;min-width:0;display:inline-flex;overflow:hidden}.ebWjsW_item{border-radius:var(--dsw-radius-sm);cursor:pointer;min-width:0;max-width:220px;color:var(--dsw-alias-label-secondary);font:inherit;text-overflow:ellipsis;white-space:nowrap;background:0 0;border:0;padding:0 6px;font-size:12px;line-height:20px;overflow:hidden}.ebWjsW_item:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.ebWjsW_item:focus-visible{outline:var(--dsw-focus-ring-width,2px) solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:1px}.ebWjsW_item[data-tone=accent]{color:var(--dsw-alias-state-business-primary)}.ebWjsW_state{white-space:nowrap;flex:none;padding:0 6px}.ebWjsW_state[data-tone=error]{color:var(--dsw-alias-label-tertiary)}";
|
|
13251
13373
|
const tagId$2 = "dsh-mnemon/src/client/SkillTurnTail.module.css";
|
|
@@ -13274,6 +13396,7 @@ window.__ModuleLoader__.load({
|
|
|
13274
13396
|
const POLL_MS = 3e3;
|
|
13275
13397
|
/** After a turn ends, the bar looks a few more times for the review it may have earned. */
|
|
13276
13398
|
const SETTLE_CHECKS = 2;
|
|
13399
|
+
const NO_CHANGES = new MnemonChangeSignal();
|
|
13277
13400
|
/** One snapshot per conversation, shared by every bar under its turns. */
|
|
13278
13401
|
const entries = /* @__PURE__ */ new WeakMap();
|
|
13279
13402
|
function entryOf(connection, sessionId) {
|
|
@@ -13286,6 +13409,10 @@ window.__ModuleLoader__.load({
|
|
|
13286
13409
|
if (entry === void 0) {
|
|
13287
13410
|
entry = {
|
|
13288
13411
|
settle: 0,
|
|
13412
|
+
checkedCursor: -1,
|
|
13413
|
+
requestedCursor: -1,
|
|
13414
|
+
revision: 0,
|
|
13415
|
+
componentRevision: 0,
|
|
13289
13416
|
listeners: /* @__PURE__ */ new Set()
|
|
13290
13417
|
};
|
|
13291
13418
|
sessions.set(sessionId, entry);
|
|
@@ -13295,52 +13422,98 @@ window.__ModuleLoader__.load({
|
|
|
13295
13422
|
function waiting(snapshot) {
|
|
13296
13423
|
return snapshot?.reviews.some((review) => review.state === "scheduled" || review.state === "reviewing") === true;
|
|
13297
13424
|
}
|
|
13298
|
-
function
|
|
13299
|
-
|
|
13300
|
-
|
|
13301
|
-
|
|
13302
|
-
|
|
13425
|
+
function cancelScheduled(entry) {
|
|
13426
|
+
entry.cancelScheduled?.();
|
|
13427
|
+
delete entry.cancelScheduled;
|
|
13428
|
+
}
|
|
13429
|
+
function invalidate(entry) {
|
|
13430
|
+
entry.revision += 1;
|
|
13431
|
+
entry.checkedCursor = -1;
|
|
13432
|
+
entry.settle = SETTLE_CHECKS;
|
|
13433
|
+
cancelScheduled(entry);
|
|
13434
|
+
}
|
|
13435
|
+
/** Skills writes may add or remove suggestions without changing the conversation's event cursor. */
|
|
13436
|
+
function invalidateSkillActivity(connection) {
|
|
13437
|
+
for (const [sessionId, entry] of entries.get(connection) ?? []) {
|
|
13438
|
+
invalidate(entry);
|
|
13439
|
+
schedule(connection, sessionId, entry, 0, true);
|
|
13440
|
+
}
|
|
13441
|
+
}
|
|
13442
|
+
/** History renders before an optional skills scan; all its tails share this job. */
|
|
13443
|
+
function schedule(connection, sessionId, entry, delay = 0, idle = false) {
|
|
13444
|
+
if (entry.loading !== void 0 || entry.cancelScheduled !== void 0 || entry.listeners.size === 0) return;
|
|
13445
|
+
const run = () => {
|
|
13446
|
+
delete entry.cancelScheduled;
|
|
13447
|
+
load(connection, sessionId, entry);
|
|
13448
|
+
};
|
|
13449
|
+
if (idle && typeof requestIdleCallback === "function") {
|
|
13450
|
+
const id = requestIdleCallback(run, { timeout: 1e3 });
|
|
13451
|
+
entry.cancelScheduled = () => cancelIdleCallback(id);
|
|
13452
|
+
} else {
|
|
13453
|
+
const timer = setTimeout(run, delay);
|
|
13454
|
+
entry.cancelScheduled = () => clearTimeout(timer);
|
|
13303
13455
|
}
|
|
13456
|
+
}
|
|
13457
|
+
function load(connection, sessionId, entry) {
|
|
13458
|
+
if (entry.loading !== void 0 || entry.listeners.size === 0) return;
|
|
13459
|
+
const cursor = entry.requestedCursor;
|
|
13460
|
+
const revision = entry.revision;
|
|
13461
|
+
let succeeded = false;
|
|
13304
13462
|
entry.loading = new MnemonClient(connection, sessionId).skillActivity().then((snapshot) => {
|
|
13463
|
+
if (revision !== entry.revision) return;
|
|
13305
13464
|
entry.snapshot = snapshot;
|
|
13465
|
+
entry.checkedCursor = snapshot.available ? cursor : -1;
|
|
13466
|
+
succeeded = true;
|
|
13306
13467
|
}, () => void 0).finally(() => {
|
|
13307
13468
|
delete entry.loading;
|
|
13308
13469
|
for (const listener of [...entry.listeners]) listener();
|
|
13309
|
-
if (entry.
|
|
13310
|
-
if (waiting(entry.snapshot)) entry.
|
|
13470
|
+
if (revision !== entry.revision || succeeded && entry.requestedCursor > cursor) entry.nextReadAt = Date.now();
|
|
13471
|
+
else if (waiting(entry.snapshot)) entry.nextReadAt = Date.now() + POLL_MS;
|
|
13311
13472
|
else if (entry.settle > 0) {
|
|
13312
13473
|
entry.settle -= 1;
|
|
13313
|
-
entry.
|
|
13314
|
-
}
|
|
13474
|
+
entry.nextReadAt = Date.now() + POLL_MS;
|
|
13475
|
+
} else delete entry.nextReadAt;
|
|
13476
|
+
if (entry.nextReadAt !== void 0) schedule(connection, sessionId, entry, Math.max(0, entry.nextReadAt - Date.now()));
|
|
13315
13477
|
});
|
|
13316
13478
|
}
|
|
13317
13479
|
/** The conversation's skills activity, read again when a newer turn's bar appears. */
|
|
13318
|
-
function useSkillActivity(connection, sessionId,
|
|
13480
|
+
function useSkillActivity(connection, sessionId, cursor, revision) {
|
|
13481
|
+
const visible = useDocumentVisible();
|
|
13319
13482
|
const entry = sessionId === void 0 ? void 0 : entryOf(connection, sessionId);
|
|
13320
13483
|
const subscribe = (0, react.useCallback)((listener) => {
|
|
13321
|
-
if (entry === void 0) return () => {};
|
|
13484
|
+
if (entry === void 0 || !visible || cursor === void 0) return () => {};
|
|
13322
13485
|
entry.listeners.add(listener);
|
|
13323
13486
|
return () => {
|
|
13324
13487
|
entry.listeners.delete(listener);
|
|
13325
|
-
if (entry.listeners.size === 0
|
|
13326
|
-
clearTimeout(entry.timer);
|
|
13327
|
-
delete entry.timer;
|
|
13328
|
-
}
|
|
13488
|
+
if (entry.listeners.size === 0) cancelScheduled(entry);
|
|
13329
13489
|
};
|
|
13330
|
-
}, [
|
|
13490
|
+
}, [
|
|
13491
|
+
entry,
|
|
13492
|
+
visible,
|
|
13493
|
+
cursor
|
|
13494
|
+
]);
|
|
13331
13495
|
const getSnapshot = (0, react.useCallback)(() => entry?.snapshot, [entry]);
|
|
13332
13496
|
const snapshot = (0, react.useSyncExternalStore)(subscribe, getSnapshot, getSnapshot);
|
|
13333
13497
|
(0, react.useEffect)(() => {
|
|
13334
|
-
if (entry === void 0 || sessionId === void 0 ||
|
|
13335
|
-
|
|
13336
|
-
|
|
13337
|
-
|
|
13338
|
-
|
|
13498
|
+
if (entry === void 0 || sessionId === void 0 || cursor === void 0 || !visible) return;
|
|
13499
|
+
if (entry.componentRevision !== revision) {
|
|
13500
|
+
entry.componentRevision = revision;
|
|
13501
|
+
invalidate(entry);
|
|
13502
|
+
}
|
|
13503
|
+
if (cursor > entry.requestedCursor) {
|
|
13504
|
+
entry.requestedCursor = cursor;
|
|
13505
|
+
entry.settle = SETTLE_CHECKS;
|
|
13506
|
+
cancelScheduled(entry);
|
|
13507
|
+
}
|
|
13508
|
+
if (entry.snapshot === void 0 || cursor > entry.checkedCursor) schedule(connection, sessionId, entry, 0, true);
|
|
13509
|
+
else if (entry.nextReadAt !== void 0) schedule(connection, sessionId, entry, Math.max(0, entry.nextReadAt - Date.now()));
|
|
13339
13510
|
}, [
|
|
13340
13511
|
connection,
|
|
13341
13512
|
entry,
|
|
13342
13513
|
sessionId,
|
|
13343
|
-
|
|
13514
|
+
cursor,
|
|
13515
|
+
visible,
|
|
13516
|
+
revision
|
|
13344
13517
|
]);
|
|
13345
13518
|
return snapshot;
|
|
13346
13519
|
}
|
|
@@ -13356,13 +13529,14 @@ window.__ModuleLoader__.load({
|
|
|
13356
13529
|
* on the Skills page, and the review that followed it — waiting or running,
|
|
13357
13530
|
* then the suggestions it left. Hidden when the turn has nothing to say.
|
|
13358
13531
|
*/
|
|
13359
|
-
const SkillTurnTail = (0, react.memo)(function SkillTurnTail({ turn, sessionId, connection, localeRuntime, t }) {
|
|
13532
|
+
const SkillTurnTail = (0, react.memo)(function SkillTurnTail({ turn, seq, sessionId, connection, componentChanges = NO_CHANGES, localeRuntime, t }) {
|
|
13360
13533
|
const subscribeLocale = (0, react.useCallback)((listener) => localeRuntime.subscribe(listener), [localeRuntime]);
|
|
13361
13534
|
const getLocale = (0, react.useCallback)(() => localeRuntime.getSnapshot(), [localeRuntime]);
|
|
13362
13535
|
(0, react.useSyncExternalStore)(subscribeLocale, getLocale, getLocale);
|
|
13363
13536
|
const number = turnNumber(turn);
|
|
13364
13537
|
const closed = isClosedTurn(turn);
|
|
13365
|
-
const
|
|
13538
|
+
const revision = (0, react.useSyncExternalStore)(componentChanges.subscribe, componentChanges.getSnapshot, componentChanges.getSnapshot);
|
|
13539
|
+
const snapshot = useSkillActivity(connection, sessionId, closed && number !== void 0 ? seq : void 0, revision);
|
|
13366
13540
|
if (!closed || number === void 0 || snapshot?.available !== true) return null;
|
|
13367
13541
|
const used = snapshot.turns.find((entry) => entry.turn === number)?.skills ?? [];
|
|
13368
13542
|
const review = snapshot.reviews.find((entry) => entry.turn === number);
|
|
@@ -14344,7 +14518,7 @@ window.__ModuleLoader__.load({
|
|
|
14344
14518
|
* status while the summary still waits for a space or the CLI version. Another view context starts empty, and only
|
|
14345
14519
|
* the latest read answers.
|
|
14346
14520
|
*/
|
|
14347
|
-
function useWorkspaceStatus(client, viewContextKey) {
|
|
14521
|
+
function useWorkspaceStatus(client, viewContextKey, active = true) {
|
|
14348
14522
|
const [statusState, setStatusState] = (0, react.useState)(() => ({
|
|
14349
14523
|
contextKey: viewContextKey,
|
|
14350
14524
|
value: null,
|
|
@@ -14361,12 +14535,31 @@ window.__ModuleLoader__.load({
|
|
|
14361
14535
|
const statusLoading = currentStatusState.loading;
|
|
14362
14536
|
const statusError = currentStatusState.error;
|
|
14363
14537
|
const statusRequest = (0, react.useRef)(0);
|
|
14538
|
+
const current = (0, react.useRef)({
|
|
14539
|
+
client,
|
|
14540
|
+
viewContextKey,
|
|
14541
|
+
active
|
|
14542
|
+
});
|
|
14543
|
+
current.current = {
|
|
14544
|
+
client,
|
|
14545
|
+
viewContextKey,
|
|
14546
|
+
active
|
|
14547
|
+
};
|
|
14548
|
+
const mounted = (0, react.useRef)(true);
|
|
14549
|
+
(0, react.useEffect)(() => {
|
|
14550
|
+
mounted.current = true;
|
|
14551
|
+
return () => {
|
|
14552
|
+
mounted.current = false;
|
|
14553
|
+
};
|
|
14554
|
+
}, []);
|
|
14364
14555
|
return {
|
|
14365
14556
|
status,
|
|
14366
14557
|
statusLoading,
|
|
14367
14558
|
statusError,
|
|
14368
14559
|
loadStatus: (0, react.useCallback)(async () => {
|
|
14560
|
+
if (!mounted.current || !current.current.active || current.current.client !== client || current.current.viewContextKey !== viewContextKey) return;
|
|
14369
14561
|
const request = ++statusRequest.current;
|
|
14562
|
+
const isCurrent = () => request === statusRequest.current && mounted.current && current.current.active && current.current.client === client && current.current.viewContextKey === viewContextKey;
|
|
14370
14563
|
setStatusState((current) => ({
|
|
14371
14564
|
contextKey: viewContextKey,
|
|
14372
14565
|
value: current.contextKey === viewContextKey ? current.value : null,
|
|
@@ -14375,7 +14568,7 @@ window.__ModuleLoader__.load({
|
|
|
14375
14568
|
}));
|
|
14376
14569
|
try {
|
|
14377
14570
|
const summary = await client.statusSummary();
|
|
14378
|
-
if (
|
|
14571
|
+
if (!isCurrent()) return;
|
|
14379
14572
|
const needsDeepStatus = summary.memoryBodies?.some((body) => body.statusLoading === true) === true || summary.commandFound === true && summary.version === void 0;
|
|
14380
14573
|
setStatusState({
|
|
14381
14574
|
contextKey: viewContextKey,
|
|
@@ -14386,14 +14579,14 @@ window.__ModuleLoader__.load({
|
|
|
14386
14579
|
if (!needsDeepStatus) return;
|
|
14387
14580
|
try {
|
|
14388
14581
|
const next = await client.status();
|
|
14389
|
-
if (
|
|
14582
|
+
if (isCurrent()) setStatusState({
|
|
14390
14583
|
contextKey: viewContextKey,
|
|
14391
14584
|
value: next,
|
|
14392
14585
|
loading: false,
|
|
14393
14586
|
error: null
|
|
14394
14587
|
});
|
|
14395
14588
|
} catch (reason) {
|
|
14396
|
-
if (
|
|
14589
|
+
if (isCurrent()) setStatusState({
|
|
14397
14590
|
contextKey: viewContextKey,
|
|
14398
14591
|
value: summary,
|
|
14399
14592
|
loading: false,
|
|
@@ -14401,7 +14594,7 @@ window.__ModuleLoader__.load({
|
|
|
14401
14594
|
});
|
|
14402
14595
|
}
|
|
14403
14596
|
} catch (reason) {
|
|
14404
|
-
if (
|
|
14597
|
+
if (isCurrent()) setStatusState({
|
|
14405
14598
|
contextKey: viewContextKey,
|
|
14406
14599
|
value: null,
|
|
14407
14600
|
loading: false,
|
|
@@ -14413,24 +14606,60 @@ window.__ModuleLoader__.load({
|
|
|
14413
14606
|
}
|
|
14414
14607
|
//#endregion
|
|
14415
14608
|
//#region src/client/use-source-catalog.ts
|
|
14416
|
-
function bindSourceManagementClient(client, instance, taskClient) {
|
|
14609
|
+
function bindSourceManagementClient(client, instance, taskClient, assertCurrent, readEpoch, changed) {
|
|
14610
|
+
const pending = /* @__PURE__ */ new Map();
|
|
14611
|
+
const independent = async (run) => {
|
|
14612
|
+
assertCurrent();
|
|
14613
|
+
pending.clear();
|
|
14614
|
+
try {
|
|
14615
|
+
return await run();
|
|
14616
|
+
} finally {
|
|
14617
|
+
pending.clear();
|
|
14618
|
+
}
|
|
14619
|
+
};
|
|
14620
|
+
const write = async (run) => {
|
|
14621
|
+
const result = await independent(run);
|
|
14622
|
+
changed();
|
|
14623
|
+
return result;
|
|
14624
|
+
};
|
|
14417
14625
|
return {
|
|
14418
14626
|
sourceInstanceKey: instance.sourceInstanceKey,
|
|
14419
14627
|
revision: instance.revision,
|
|
14420
14628
|
...instance.assistance === void 0 || instance.assistance.length === 0 ? {} : { assistance: {
|
|
14421
14629
|
operations: instance.assistance,
|
|
14422
|
-
execute: (operation, input, options) => {
|
|
14423
|
-
|
|
14630
|
+
execute: async (operation, input, options) => {
|
|
14631
|
+
assertCurrent();
|
|
14632
|
+
const task = [
|
|
14424
14633
|
"agent-search",
|
|
14425
14634
|
"supervise",
|
|
14426
14635
|
"body-create",
|
|
14427
14636
|
"body-metadata-maintain"
|
|
14428
|
-
].includes(operation)
|
|
14637
|
+
].includes(operation);
|
|
14638
|
+
return write(() => (task ? taskClient : client).assistSource(instance.sourceInstanceKey, operation, input, options.expectedRevision, options.confirmed));
|
|
14429
14639
|
}
|
|
14430
14640
|
} },
|
|
14431
|
-
read: (operation, input = null) =>
|
|
14432
|
-
|
|
14433
|
-
|
|
14641
|
+
read: async (operation, input = null, options) => {
|
|
14642
|
+
assertCurrent();
|
|
14643
|
+
if (options?.coalesce !== true) return independent(() => client.readSourceManagement(instance.sourceInstanceKey, operation, input));
|
|
14644
|
+
const key = JSON.stringify([
|
|
14645
|
+
readEpoch(),
|
|
14646
|
+
operation,
|
|
14647
|
+
input
|
|
14648
|
+
]);
|
|
14649
|
+
let request = pending.get(key);
|
|
14650
|
+
if (request === void 0) {
|
|
14651
|
+
request = client.readSourceManagement(instance.sourceInstanceKey, operation, input).finally(() => {
|
|
14652
|
+
if (pending.get(key) === request) pending.delete(key);
|
|
14653
|
+
});
|
|
14654
|
+
pending.set(key, request);
|
|
14655
|
+
}
|
|
14656
|
+
return structuredClone(await request);
|
|
14657
|
+
},
|
|
14658
|
+
mutate: (operation, input, options) => write(() => client.mutateSourceManagement(instance.sourceInstanceKey, operation, input, options.expectedRevision ?? instance.revision, options.confirmed)),
|
|
14659
|
+
models: async () => {
|
|
14660
|
+
assertCurrent();
|
|
14661
|
+
return taskClient.taskAgentModels(true);
|
|
14662
|
+
}
|
|
14434
14663
|
};
|
|
14435
14664
|
}
|
|
14436
14665
|
/**
|
|
@@ -14438,45 +14667,90 @@ window.__ModuleLoader__.load({
|
|
|
14438
14667
|
* bound to each, the registered pages whose Source runs, and the Source types the descriptor-driven management
|
|
14439
14668
|
* page shows, those without a page of their own or with configuration fields.
|
|
14440
14669
|
*/
|
|
14441
|
-
function useSourceCatalog(client, taskClient, revision, viewContextKey, sourcePageEntries) {
|
|
14670
|
+
function useSourceCatalog(client, taskClient, revision, viewContextKey, sourcePageEntries, active = true, onSourceChanged) {
|
|
14442
14671
|
const [sourceCatalogState, setSourceCatalogState] = (0, react.useState)(() => ({
|
|
14443
14672
|
contextKey: viewContextKey,
|
|
14444
14673
|
value: null,
|
|
14445
14674
|
error: null
|
|
14446
14675
|
}));
|
|
14676
|
+
const current = (0, react.useRef)();
|
|
14677
|
+
const previousRead = current.current;
|
|
14678
|
+
const changed = previousRead?.client !== client || previousRead.viewContextKey !== viewContextKey || previousRead.active !== active || previousRead.revision !== revision;
|
|
14679
|
+
current.current = {
|
|
14680
|
+
client,
|
|
14681
|
+
viewContextKey,
|
|
14682
|
+
active,
|
|
14683
|
+
revision,
|
|
14684
|
+
epoch: (previousRead?.epoch ?? 0) + Number(changed)
|
|
14685
|
+
};
|
|
14686
|
+
const mounted = (0, react.useRef)(true);
|
|
14447
14687
|
(0, react.useEffect)(() => {
|
|
14448
|
-
|
|
14688
|
+
mounted.current = true;
|
|
14689
|
+
return () => {
|
|
14690
|
+
mounted.current = false;
|
|
14691
|
+
};
|
|
14692
|
+
}, []);
|
|
14693
|
+
(0, react.useEffect)(() => {
|
|
14694
|
+
if (!active) return;
|
|
14695
|
+
let pending = true;
|
|
14449
14696
|
client.sourceManagementCatalog().then((value) => {
|
|
14450
|
-
if (
|
|
14697
|
+
if (pending) setSourceCatalogState({
|
|
14451
14698
|
contextKey: viewContextKey,
|
|
14452
14699
|
value,
|
|
14453
14700
|
error: null
|
|
14454
14701
|
});
|
|
14455
14702
|
}).catch((reason) => {
|
|
14456
|
-
if (
|
|
14703
|
+
if (pending) setSourceCatalogState({
|
|
14457
14704
|
contextKey: viewContextKey,
|
|
14458
14705
|
value: null,
|
|
14459
14706
|
error: message(reason)
|
|
14460
14707
|
});
|
|
14461
14708
|
});
|
|
14462
14709
|
return () => {
|
|
14463
|
-
|
|
14710
|
+
pending = false;
|
|
14464
14711
|
};
|
|
14465
14712
|
}, [
|
|
14713
|
+
active,
|
|
14466
14714
|
client,
|
|
14467
14715
|
revision,
|
|
14468
14716
|
viewContextKey
|
|
14469
14717
|
]);
|
|
14470
14718
|
const sourceCatalog = sourceCatalogState.contextKey === viewContextKey ? sourceCatalogState.value : null;
|
|
14471
14719
|
const sourceInstances = sourceCatalog?.sources ?? [];
|
|
14720
|
+
const bindings = (0, react.useRef)();
|
|
14472
14721
|
return {
|
|
14473
14722
|
sourceCatalogState,
|
|
14474
14723
|
sourceCatalog,
|
|
14475
14724
|
sourceInstances,
|
|
14476
|
-
sourceManagementClients: (0, react.useMemo)(() =>
|
|
14725
|
+
sourceManagementClients: (0, react.useMemo)(() => {
|
|
14726
|
+
const previous = bindings.current;
|
|
14727
|
+
const reusable = previous?.client === client && previous.taskClient === taskClient && previous.context === viewContextKey && previous.generation === sourceCatalog?.generationId;
|
|
14728
|
+
const values = /* @__PURE__ */ new Map();
|
|
14729
|
+
for (const source of sourceInstances) {
|
|
14730
|
+
const signature = JSON.stringify(source);
|
|
14731
|
+
const prior = reusable ? previous.values.get(source.sourceInstanceKey) : void 0;
|
|
14732
|
+
values.set(source.sourceInstanceKey, prior?.signature === signature ? prior : {
|
|
14733
|
+
signature,
|
|
14734
|
+
management: bindSourceManagementClient(client, source, taskClient, () => {
|
|
14735
|
+
if (!mounted.current || current.current?.client !== client || current.current.viewContextKey !== viewContextKey) throw new Error("Source page is unmounted or its view context changed");
|
|
14736
|
+
}, () => current.current.epoch, () => onSourceChanged?.(source.sourceTypeId))
|
|
14737
|
+
});
|
|
14738
|
+
}
|
|
14739
|
+
bindings.current = {
|
|
14740
|
+
client,
|
|
14741
|
+
taskClient,
|
|
14742
|
+
context: viewContextKey,
|
|
14743
|
+
...sourceCatalog === null ? {} : { generation: sourceCatalog.generationId },
|
|
14744
|
+
values
|
|
14745
|
+
};
|
|
14746
|
+
return new Map([...values].map(([key, value]) => [key, value.management]));
|
|
14747
|
+
}, [
|
|
14477
14748
|
client,
|
|
14749
|
+
onSourceChanged,
|
|
14750
|
+
sourceCatalog,
|
|
14478
14751
|
sourceInstances,
|
|
14479
|
-
taskClient
|
|
14752
|
+
taskClient,
|
|
14753
|
+
viewContextKey
|
|
14480
14754
|
]),
|
|
14481
14755
|
visibleSourcePages: (0, react.useMemo)(() => {
|
|
14482
14756
|
const visibleTypes = new Set(sourceInstances.map((source) => source.sourceTypeId));
|
|
@@ -14519,9 +14793,13 @@ window.__ModuleLoader__.load({
|
|
|
14519
14793
|
* carries its input into a Source page, and a page follows its layer while the layer's Source stops and runs again.
|
|
14520
14794
|
*/
|
|
14521
14795
|
function useWorkspaceNavigation(options) {
|
|
14522
|
-
const { sessionId, viewContextKey, resetViewportScroll, sourceCatalog, sourcePageEntries, visibleSourcePages, managedSourceTypes, stoppedTypes, dashboard, sourceName, showWorkspaceToast, accepts, home = "status" } = options;
|
|
14796
|
+
const { sessionId, viewContextKey, resetViewportScroll, sourceCatalog, sourcePageEntries, visibleSourcePages, managedSourceTypes, stoppedTypes, disabledTypes, dashboard, sourceName, showWorkspaceToast, accepts, home = "status" } = options;
|
|
14523
14797
|
const t = useT();
|
|
14524
14798
|
const [page, setPage] = (0, react.useState)(home);
|
|
14799
|
+
const isDisabled = (0, react.useCallback)((target) => {
|
|
14800
|
+
const type = sourcePageEntryId(target)?.split("/")[0] ?? managedSourceTypeId(target) ?? stoppedSourceTypeId(target);
|
|
14801
|
+
return type !== void 0 && disabledTypes.has(type);
|
|
14802
|
+
}, [disabledTypes]);
|
|
14525
14803
|
(0, react.useEffect)(() => {
|
|
14526
14804
|
if (page === "status" && home !== "status") setPage(home);
|
|
14527
14805
|
}, [home, page]);
|
|
@@ -14587,9 +14865,10 @@ window.__ModuleLoader__.load({
|
|
|
14587
14865
|
glyph: "◇",
|
|
14588
14866
|
primary: true
|
|
14589
14867
|
})));
|
|
14590
|
-
return entries;
|
|
14868
|
+
return entries.filter((entry) => entry.sourceTypeId === void 0 || !disabledTypes.has(entry.sourceTypeId));
|
|
14591
14869
|
}, [
|
|
14592
14870
|
dashboard,
|
|
14871
|
+
disabledTypes,
|
|
14593
14872
|
managedSourceTypes,
|
|
14594
14873
|
sourceName,
|
|
14595
14874
|
sourcePageEntries,
|
|
@@ -14597,6 +14876,11 @@ window.__ModuleLoader__.load({
|
|
|
14597
14876
|
visibleSourcePages
|
|
14598
14877
|
]);
|
|
14599
14878
|
(0, react.useEffect)(() => {
|
|
14879
|
+
if (isDisabled(page)) {
|
|
14880
|
+
setPage(home);
|
|
14881
|
+
setNavigationInput(void 0);
|
|
14882
|
+
return;
|
|
14883
|
+
}
|
|
14600
14884
|
if (sourceCatalog === null) return;
|
|
14601
14885
|
const entryId = sourcePageEntryId(page);
|
|
14602
14886
|
const managedTypeId = managedSourceTypeId(page);
|
|
@@ -14613,6 +14897,7 @@ window.__ModuleLoader__.load({
|
|
|
14613
14897
|
});
|
|
14614
14898
|
}
|
|
14615
14899
|
}, [
|
|
14900
|
+
isDisabled,
|
|
14616
14901
|
managedSourceTypes,
|
|
14617
14902
|
page,
|
|
14618
14903
|
sourcePageEntries,
|
|
@@ -14629,6 +14914,11 @@ window.__ModuleLoader__.load({
|
|
|
14629
14914
|
}, [viewContextKey]);
|
|
14630
14915
|
/** Anchors address Source page ids; no Source component is imported here. */
|
|
14631
14916
|
const applyAnchor = (0, react.useCallback)((anchor) => {
|
|
14917
|
+
if (anchor.page !== "status" && isDisabled(sourcePage(anchor.page))) {
|
|
14918
|
+
setNavigationInput(void 0);
|
|
14919
|
+
selectPage(home);
|
|
14920
|
+
return;
|
|
14921
|
+
}
|
|
14632
14922
|
setNavigationInput({
|
|
14633
14923
|
page: anchor.page,
|
|
14634
14924
|
value: {
|
|
@@ -14637,7 +14927,11 @@ window.__ModuleLoader__.load({
|
|
|
14637
14927
|
}
|
|
14638
14928
|
});
|
|
14639
14929
|
selectPage(anchor.page === "status" ? "status" : sourcePage(anchor.page));
|
|
14640
|
-
}, [
|
|
14930
|
+
}, [
|
|
14931
|
+
home,
|
|
14932
|
+
isDisabled,
|
|
14933
|
+
selectPage
|
|
14934
|
+
]);
|
|
14641
14935
|
(0, react.useEffect)(() => {
|
|
14642
14936
|
const held = consumeMnemonAnchor(sessionId, accepts);
|
|
14643
14937
|
if (held !== null) applyAnchor(held);
|
|
@@ -14648,7 +14942,7 @@ window.__ModuleLoader__.load({
|
|
|
14648
14942
|
accepts
|
|
14649
14943
|
]);
|
|
14650
14944
|
return {
|
|
14651
|
-
page,
|
|
14945
|
+
page: isDisabled(page) ? home : page,
|
|
14652
14946
|
navigationInput,
|
|
14653
14947
|
openTab,
|
|
14654
14948
|
sourceNavigationEntries
|
|
@@ -14789,6 +15083,41 @@ window.__ModuleLoader__.load({
|
|
|
14789
15083
|
})]
|
|
14790
15084
|
});
|
|
14791
15085
|
}
|
|
15086
|
+
/** Only low-frequency guidance folds; errors, composition diagnostics and restart reminders stay visible. */
|
|
15087
|
+
function OrdinaryNotices(props) {
|
|
15088
|
+
const t = useT();
|
|
15089
|
+
const [expanded, setExpanded] = (0, react.useState)(false);
|
|
15090
|
+
const contentsId = (0, react.useId)();
|
|
15091
|
+
const labels = [props.remoteReadOnly ? t("header.noticeRemoteReadOnly") : void 0, props.reviewPaused ? t("header.noticeIdleReview") : void 0].filter((label) => label !== void 0);
|
|
15092
|
+
if (labels.length === 0) return null;
|
|
15093
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
15094
|
+
className: MnemonView_module_css_default.noticeGroup,
|
|
15095
|
+
"data-expanded": expanded || void 0,
|
|
15096
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
15097
|
+
type: "button",
|
|
15098
|
+
className: MnemonView_module_css_default.noticeToggle,
|
|
15099
|
+
"aria-expanded": expanded,
|
|
15100
|
+
"aria-controls": contentsId,
|
|
15101
|
+
onClick: () => setExpanded((value) => !value),
|
|
15102
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("header.noticeSummary", {
|
|
15103
|
+
count: labels.length,
|
|
15104
|
+
labels: labels.join(" / ")
|
|
15105
|
+
}) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconChevronLeftOutline14, { size: 14 })]
|
|
15106
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
15107
|
+
id: contentsId,
|
|
15108
|
+
className: MnemonView_module_css_default.noticeContents,
|
|
15109
|
+
children: [props.remoteReadOnly && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
15110
|
+
className: MnemonView_module_css_default.alert,
|
|
15111
|
+
role: "status",
|
|
15112
|
+
children: t("workspace.remoteReadOnly")
|
|
15113
|
+
}), props.reviewPaused && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
15114
|
+
className: MnemonView_module_css_default.alert,
|
|
15115
|
+
role: "status",
|
|
15116
|
+
children: t(props.reviewPaused === "tool-access" ? "status.reviewToolAccessPaused" : "status.reviewTeamPaused")
|
|
15117
|
+
})]
|
|
15118
|
+
})]
|
|
15119
|
+
});
|
|
15120
|
+
}
|
|
14792
15121
|
function SourceDisabledPage(props) {
|
|
14793
15122
|
const t = useT();
|
|
14794
15123
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
@@ -14901,12 +15230,19 @@ window.__ModuleLoader__.load({
|
|
|
14901
15230
|
return t(kind === "runtime" ? "status.storageRuntime" : kind === "memory-bodies" ? "status.storageSpaces" : kind === "documents" ? "status.storageDocuments" : "status.storageState");
|
|
14902
15231
|
}
|
|
14903
15232
|
function MnemonWorkbench(props) {
|
|
15233
|
+
const visible = useDocumentVisible();
|
|
15234
|
+
const active = props.active !== false && visible;
|
|
15235
|
+
const visibleProps = (0, react.useRef)(props);
|
|
15236
|
+
if (active) visibleProps.current = props;
|
|
14904
15237
|
const t = props.t ?? translateZh;
|
|
14905
15238
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(I18nContext.Provider, {
|
|
14906
15239
|
value: t,
|
|
14907
15240
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(LocaleContext.Provider, {
|
|
14908
15241
|
value: props.locale ?? "zh",
|
|
14909
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(MnemonWorkspace, {
|
|
15242
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(MnemonWorkspace, {
|
|
15243
|
+
...visibleProps.current,
|
|
15244
|
+
active
|
|
15245
|
+
})
|
|
14910
15246
|
})
|
|
14911
15247
|
});
|
|
14912
15248
|
}
|
|
@@ -14919,7 +15255,10 @@ window.__ModuleLoader__.load({
|
|
|
14919
15255
|
const componentRevision = (0, react.useSyncExternalStore)(componentSignal.subscribe, componentSignal.getSnapshot, componentSignal.getSnapshot);
|
|
14920
15256
|
const subscribeSettings = (0, react.useCallback)((listener) => settingsScope.subscribe(listener), [settingsScope]);
|
|
14921
15257
|
const getSettingsSnapshot = (0, react.useCallback)(() => settingsScope.getSnapshot(), [settingsScope]);
|
|
14922
|
-
const
|
|
15258
|
+
const liveSettingsSnapshot = (0, react.useSyncExternalStore)(subscribeSettings, getSettingsSnapshot, getSettingsSnapshot);
|
|
15259
|
+
const visibleSettings = (0, react.useRef)(liveSettingsSnapshot);
|
|
15260
|
+
if (active) visibleSettings.current = liveSettingsSnapshot;
|
|
15261
|
+
const settingsSnapshot = visibleSettings.current;
|
|
14923
15262
|
const subscribeSourcePages = (0, react.useCallback)((listener) => sourcePageDirectory.subscribe(listener), [sourcePageDirectory]);
|
|
14924
15263
|
const getSourcePages = (0, react.useCallback)(() => sourcePageDirectory.getSnapshot(), [sourcePageDirectory]);
|
|
14925
15264
|
const allSourcePageEntries = (0, react.useSyncExternalStore)(subscribeSourcePages, getSourcePages, getSourcePages);
|
|
@@ -14942,7 +15281,15 @@ window.__ModuleLoader__.load({
|
|
|
14942
15281
|
surface,
|
|
14943
15282
|
workspaceId
|
|
14944
15283
|
]);
|
|
14945
|
-
const
|
|
15284
|
+
const connectionContext = (0, react.useRef)({
|
|
15285
|
+
connection,
|
|
15286
|
+
revision: 0
|
|
15287
|
+
});
|
|
15288
|
+
if (connectionContext.current.connection !== connection) connectionContext.current = {
|
|
15289
|
+
connection,
|
|
15290
|
+
revision: connectionContext.current.revision + 1
|
|
15291
|
+
};
|
|
15292
|
+
const viewContextKey = `${`${connectionContext.current.revision}\u0000${sessionId ?? ""}\u0000${workspaceId ?? ""}`}\u0000${settingsSnapshot.revision === void 0 ? "loading" : JSON.stringify([
|
|
14946
15293
|
settingsSnapshot.value?.storageScope ?? null,
|
|
14947
15294
|
settingsSnapshot.value?.dataDir ?? null,
|
|
14948
15295
|
settingsSnapshot.value?.runtimeUserScope ?? null
|
|
@@ -14962,9 +15309,11 @@ window.__ModuleLoader__.load({
|
|
|
14962
15309
|
const inset = topInset ?? (header === null ? 0 : header.getBoundingClientRect().height + 12);
|
|
14963
15310
|
canvas.scrollTop = Math.max(0, canvas.scrollTop + element.getBoundingClientRect().top - canvas.getBoundingClientRect().top - inset);
|
|
14964
15311
|
}, []);
|
|
14965
|
-
const { status, statusLoading, statusError, loadStatus } = useWorkspaceStatus(client, viewContextKey);
|
|
15312
|
+
const { status, statusLoading, statusError, loadStatus } = useWorkspaceStatus(client, viewContextKey, active);
|
|
14966
15313
|
const [revision, setRevision] = (0, react.useState)(0);
|
|
14967
|
-
const { sourceCatalogState, sourceCatalog, sourceInstances, sourceManagementClients, visibleSourcePages, managedSourceTypes: allManagedSourceTypes } = useSourceCatalog(client, taskClient, revision, viewContextKey, sourcePageEntries)
|
|
15314
|
+
const { sourceCatalogState, sourceCatalog, sourceInstances, sourceManagementClients, visibleSourcePages, managedSourceTypes: allManagedSourceTypes } = useSourceCatalog(client, taskClient, revision, viewContextKey, sourcePageEntries, active, (0, react.useCallback)((sourceTypeId) => {
|
|
15315
|
+
if (sourceTypeId === "skills") invalidateSkillActivity(connection);
|
|
15316
|
+
}, [connection]));
|
|
14968
15317
|
const managedSourceTypes = (0, react.useMemo)(() => allManagedSourceTypes.filter(([sourceTypeId]) => shows(sourceTypeId)), [allManagedSourceTypes, shows]);
|
|
14969
15318
|
const [selectedSourceInstances, setSelectedSourceInstances] = (0, react.useState)({});
|
|
14970
15319
|
const stoppedLayers = status?.memorySystem?.configuration.layers;
|
|
@@ -14980,6 +15329,7 @@ window.__ModuleLoader__.load({
|
|
|
14980
15329
|
]);
|
|
14981
15330
|
const [dashboard, setDashboard] = (0, react.useState)(null);
|
|
14982
15331
|
(0, react.useEffect)(() => {
|
|
15332
|
+
if (!active) return;
|
|
14983
15333
|
let current = true;
|
|
14984
15334
|
client.viewDashboard().then((value) => {
|
|
14985
15335
|
if (current) setDashboard(Array.isArray(value?.entries) ? value : null);
|
|
@@ -14990,6 +15340,7 @@ window.__ModuleLoader__.load({
|
|
|
14990
15340
|
current = false;
|
|
14991
15341
|
};
|
|
14992
15342
|
}, [
|
|
15343
|
+
active,
|
|
14993
15344
|
client,
|
|
14994
15345
|
revision,
|
|
14995
15346
|
componentRevision
|
|
@@ -15002,8 +15353,25 @@ window.__ModuleLoader__.load({
|
|
|
15002
15353
|
const component = dashboard?.entries.find((entry) => entry.roles.includes("strategy") && entry.typeId === typeId);
|
|
15003
15354
|
return component === void 0 ? typeId : componentCopy(component, locale).label;
|
|
15004
15355
|
};
|
|
15005
|
-
const switchedOff = (0, react.useMemo)(() =>
|
|
15006
|
-
|
|
15356
|
+
const switchedOff = (0, react.useMemo)(() => {
|
|
15357
|
+
const entries = dashboard?.entries ?? [];
|
|
15358
|
+
const enabled = new Set(entries.filter((entry) => entry.enabled).map(layerOf));
|
|
15359
|
+
const managedPackages = new Set(entries.map((entry) => entry.packageName));
|
|
15360
|
+
for (const source of dashboard?.sources ?? []) if (!managedPackages.has(source.packageName)) enabled.add(source.sourceTypeId);
|
|
15361
|
+
return new Set(entries.filter((entry) => !entry.enabled).map(layerOf).filter((id) => id !== void 0 && !enabled.has(id)));
|
|
15362
|
+
}, [dashboard]);
|
|
15363
|
+
const savedLayers = settingsSnapshot.value?.memoryTopology?.layers;
|
|
15364
|
+
const configuredLayers = status?.memorySystem?.configuration.layers;
|
|
15365
|
+
const disabledTypes = (0, react.useMemo)(() => new Set([.../* @__PURE__ */ new Set([
|
|
15366
|
+
...Object.keys(configuredLayers ?? {}),
|
|
15367
|
+
...Object.keys(savedLayers ?? {}),
|
|
15368
|
+
...switchedOff
|
|
15369
|
+
])].filter((id) => (savedLayers?.[id]?.enabled ?? configuredLayers?.[id]?.enabled) === false || switchedOff.has(id))), [
|
|
15370
|
+
configuredLayers,
|
|
15371
|
+
savedLayers,
|
|
15372
|
+
switchedOff
|
|
15373
|
+
]);
|
|
15374
|
+
const focusPage = focusType === void 0 || disabledTypes.has(focusType) ? void 0 : sourcePageEntries.find((entry) => entry.navigation?.primary ?? true);
|
|
15007
15375
|
const home = focusPage === void 0 ? "status" : `source:${focusPage.id}`;
|
|
15008
15376
|
const { page, navigationInput, openTab, sourceNavigationEntries } = useWorkspaceNavigation({
|
|
15009
15377
|
sessionId,
|
|
@@ -15014,6 +15382,7 @@ window.__ModuleLoader__.load({
|
|
|
15014
15382
|
visibleSourcePages,
|
|
15015
15383
|
managedSourceTypes,
|
|
15016
15384
|
stoppedTypes,
|
|
15385
|
+
disabledTypes,
|
|
15017
15386
|
dashboard,
|
|
15018
15387
|
sourceName,
|
|
15019
15388
|
showWorkspaceToast,
|
|
@@ -15021,34 +15390,57 @@ window.__ModuleLoader__.load({
|
|
|
15021
15390
|
home
|
|
15022
15391
|
});
|
|
15023
15392
|
(0, react.useEffect)(() => {
|
|
15024
|
-
loadStatus();
|
|
15025
|
-
}, [loadStatus]);
|
|
15393
|
+
if (active) loadStatus();
|
|
15394
|
+
}, [active, loadStatus]);
|
|
15395
|
+
const currentView = (0, react.useRef)({
|
|
15396
|
+
active,
|
|
15397
|
+
client,
|
|
15398
|
+
viewContextKey
|
|
15399
|
+
});
|
|
15400
|
+
currentView.current = {
|
|
15401
|
+
active,
|
|
15402
|
+
client,
|
|
15403
|
+
viewContextKey
|
|
15404
|
+
};
|
|
15405
|
+
const viewMounted = (0, react.useRef)(true);
|
|
15406
|
+
(0, react.useEffect)(() => {
|
|
15407
|
+
viewMounted.current = true;
|
|
15408
|
+
return () => {
|
|
15409
|
+
viewMounted.current = false;
|
|
15410
|
+
};
|
|
15411
|
+
}, []);
|
|
15412
|
+
const isBoundView = (0, react.useCallback)(() => viewMounted.current && currentView.current.client === client && currentView.current.viewContextKey === viewContextKey, [client, viewContextKey]);
|
|
15413
|
+
const isCurrentView = (0, react.useCallback)(() => currentView.current.active && isBoundView(), [isBoundView]);
|
|
15414
|
+
const assertCurrentView = () => {
|
|
15415
|
+
if (!isBoundView()) throw new Error("Source page is unmounted or its view context changed");
|
|
15416
|
+
};
|
|
15026
15417
|
const mutate = (0, react.useCallback)(() => {
|
|
15418
|
+
if (!isCurrentView()) return;
|
|
15027
15419
|
setRevision((value) => value + 1);
|
|
15028
15420
|
loadStatus();
|
|
15029
|
-
}, [loadStatus]);
|
|
15421
|
+
}, [isCurrentView, loadStatus]);
|
|
15030
15422
|
const refreshAll = mutate;
|
|
15031
15423
|
const [refreshKey, setRefreshKey] = (0, react.useState)(0);
|
|
15032
15424
|
const refreshPage = (0, react.useCallback)(() => {
|
|
15033
15425
|
setRefreshKey((value) => value + 1);
|
|
15034
15426
|
refreshAll();
|
|
15035
15427
|
}, [refreshAll]);
|
|
15036
|
-
const shown = (0, react.useRef)(active);
|
|
15037
|
-
(0, react.useEffect)(() => {
|
|
15038
|
-
if (active && !shown.current) refreshAll();
|
|
15039
|
-
shown.current = active;
|
|
15040
|
-
}, [active, refreshAll]);
|
|
15041
15428
|
const seenComponents = (0, react.useRef)(componentRevision);
|
|
15042
15429
|
(0, react.useEffect)(() => {
|
|
15043
|
-
if (componentRevision === seenComponents.current) return;
|
|
15430
|
+
if (!active || componentRevision === seenComponents.current) return;
|
|
15044
15431
|
seenComponents.current = componentRevision;
|
|
15045
15432
|
refreshPage();
|
|
15046
|
-
}, [
|
|
15433
|
+
}, [
|
|
15434
|
+
active,
|
|
15435
|
+
componentRevision,
|
|
15436
|
+
refreshPage
|
|
15437
|
+
]);
|
|
15047
15438
|
const seenSettings = (0, react.useRef)({
|
|
15048
15439
|
revision: settingsSnapshot.revision,
|
|
15049
15440
|
context: viewContextKey
|
|
15050
15441
|
});
|
|
15051
15442
|
(0, react.useEffect)(() => {
|
|
15443
|
+
if (!active) return;
|
|
15052
15444
|
const seen = seenSettings.current;
|
|
15053
15445
|
seenSettings.current = {
|
|
15054
15446
|
revision: settingsSnapshot.revision,
|
|
@@ -15056,6 +15448,7 @@ window.__ModuleLoader__.load({
|
|
|
15056
15448
|
};
|
|
15057
15449
|
if (seen.revision !== settingsSnapshot.revision && seen.context === viewContextKey) refreshAll();
|
|
15058
15450
|
}, [
|
|
15451
|
+
active,
|
|
15059
15452
|
settingsSnapshot.revision,
|
|
15060
15453
|
viewContextKey,
|
|
15061
15454
|
refreshAll
|
|
@@ -15082,9 +15475,6 @@ window.__ModuleLoader__.load({
|
|
|
15082
15475
|
})),
|
|
15083
15476
|
onChange: workspaceSelection.onSelect
|
|
15084
15477
|
});
|
|
15085
|
-
const savedLayers = settingsSnapshot.value?.memoryTopology?.layers;
|
|
15086
|
-
const configuredLayers = status?.memorySystem?.configuration.layers;
|
|
15087
|
-
const disabledTypes = new Set([.../* @__PURE__ */ new Set([...Object.keys(configuredLayers ?? {}), ...Object.keys(savedLayers ?? {})])].filter((id) => (savedLayers?.[id]?.enabled ?? configuredLayers?.[id]?.enabled) === false || switchedOff.has(id)));
|
|
15088
15478
|
const notice = compositionNotice(status?.memorySystem, t);
|
|
15089
15479
|
const memoryOff = status?.memorySystem !== void 0 && !status.memorySystem.serving;
|
|
15090
15480
|
const composingType = status?.memorySystem?.serving === true ? status.memorySystem.strategyTypeId : void 0;
|
|
@@ -15108,6 +15498,7 @@ window.__ModuleLoader__.load({
|
|
|
15108
15498
|
value: { evolution: skillsSnapshot.value?.evolution ?? DEFAULT_SKILLS_CONFIG.evolution },
|
|
15109
15499
|
writable: skillsSnapshot.writable,
|
|
15110
15500
|
replace: async (value) => {
|
|
15501
|
+
assertCurrentView();
|
|
15111
15502
|
const evolution = jsonRecord(value)?.evolution;
|
|
15112
15503
|
if (typeof evolution !== "boolean") throw new Error("Skills preferences take evolution as a boolean");
|
|
15113
15504
|
await skillsScope.mutate([{
|
|
@@ -15128,6 +15519,7 @@ window.__ModuleLoader__.load({
|
|
|
15128
15519
|
} })),
|
|
15129
15520
|
writable: settingsSnapshot.writable,
|
|
15130
15521
|
replace: async (value) => {
|
|
15522
|
+
assertCurrentView();
|
|
15131
15523
|
const requested = jsonRecord(value)?.persistenceStrategy;
|
|
15132
15524
|
const strategy = requested === void 0 ? void 0 : jsonRecord(requested);
|
|
15133
15525
|
if (strategy === void 0) throw new Error("Persistence strategy preferences must be an object");
|
|
@@ -15153,6 +15545,7 @@ window.__ModuleLoader__.load({
|
|
|
15153
15545
|
sourceInstances: instances,
|
|
15154
15546
|
writable: writeEnabled,
|
|
15155
15547
|
locale,
|
|
15548
|
+
active,
|
|
15156
15549
|
...management === void 0 ? {} : { management },
|
|
15157
15550
|
...sessionId === void 0 ? {} : { sessionId },
|
|
15158
15551
|
...workspaceId === void 0 ? {} : { workspaceId },
|
|
@@ -15359,15 +15752,18 @@ window.__ModuleLoader__.load({
|
|
|
15359
15752
|
children: status?.restartPending !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RestartReminder, { pending: status.restartPending })
|
|
15360
15753
|
}),
|
|
15361
15754
|
workspaceToast.element,
|
|
15362
|
-
|
|
15363
|
-
|
|
15364
|
-
|
|
15365
|
-
children: t("workspace.remoteReadOnly")
|
|
15755
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(OrdinaryNotices, {
|
|
15756
|
+
remoteReadOnly,
|
|
15757
|
+
reviewPaused: focused ? void 0 : status?.lifecycle?.current?.idleReviewBlocked
|
|
15366
15758
|
}),
|
|
15367
|
-
!focused && status?.lifecycle?.current?.
|
|
15759
|
+
!focused && status?.lifecycle?.current?.idleReviewWatermark !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
15368
15760
|
className: MnemonView_module_css_default.alert,
|
|
15369
|
-
role: "status",
|
|
15370
|
-
children: t("status.
|
|
15761
|
+
role: status.lifecycle.current.idleReviewWatermark.state === "error" ? "alert" : "status",
|
|
15762
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("status.reviewWatermarkUsage", {
|
|
15763
|
+
attempts: status.lifecycle.current.idleReviewAttempts ?? 0,
|
|
15764
|
+
max: status.lifecycle.current.idleReviewWatermark.maxPerSession,
|
|
15765
|
+
restored: status.lifecycle.current.idleReviewWatermark.restoredAttempts
|
|
15766
|
+
}) }), status.lifecycle.current.idleReviewWatermark.state === "error" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: t("status.reviewWatermarkPaused") }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("status.reviewWatermarkRecovery") })] }) : status.lifecycle.current.nextReviewAt !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("status.reviewWatermarkNext", { time: new Date(status.lifecycle.current.nextReviewAt).toLocaleString(locale) }) })]
|
|
15371
15767
|
}),
|
|
15372
15768
|
!focused && status?.lifecycle?.current?.lastError !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
15373
15769
|
className: MnemonView_module_css_default.alert,
|
|
@@ -15405,6 +15801,10 @@ window.__ModuleLoader__.load({
|
|
|
15405
15801
|
"data-testid": "mnemon-canvas",
|
|
15406
15802
|
"data-lock-page-header": activeSourcePage?.navigation?.stickyHeader !== false ? "" : void 0,
|
|
15407
15803
|
children: [
|
|
15804
|
+
page === "status" && focus !== void 0 && disabledTypes.has(focus.sourceTypeId) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SourceDisabledPage, {
|
|
15805
|
+
title: focus.title,
|
|
15806
|
+
onOpenConfiguration: openConfiguration
|
|
15807
|
+
}),
|
|
15408
15808
|
page === "status" && !focused && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(WorkbenchStatusContext.Provider, {
|
|
15409
15809
|
value: status,
|
|
15410
15810
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(StatusPage, {
|
|
@@ -16490,38 +16890,6 @@ window.__ModuleLoader__.load({
|
|
|
16490
16890
|
}
|
|
16491
16891
|
};
|
|
16492
16892
|
//#endregion
|
|
16493
|
-
//#region src/client/change-signal.ts
|
|
16494
|
-
/**
|
|
16495
|
-
* A revision other surfaces bump when something they cannot observe directly
|
|
16496
|
-
* changed, such as a component switched on DSH's Plugins page. Readers reload
|
|
16497
|
-
* their own data when the revision moves.
|
|
16498
|
-
*/
|
|
16499
|
-
var MnemonChangeSignal = class {
|
|
16500
|
-
settleMs;
|
|
16501
|
-
revision = 0;
|
|
16502
|
-
pending;
|
|
16503
|
-
listeners = /* @__PURE__ */ new Set();
|
|
16504
|
-
constructor(settleMs = 100) {
|
|
16505
|
-
this.settleMs = settleMs;
|
|
16506
|
-
}
|
|
16507
|
-
getSnapshot = () => this.revision;
|
|
16508
|
-
subscribe = (listener) => {
|
|
16509
|
-
this.listeners.add(listener);
|
|
16510
|
-
return () => {
|
|
16511
|
-
this.listeners.delete(listener);
|
|
16512
|
-
};
|
|
16513
|
-
};
|
|
16514
|
-
/** A burst of announcements, such as one per component a write switched, moves the revision once. */
|
|
16515
|
-
bump = () => {
|
|
16516
|
-
if (this.pending !== void 0) return;
|
|
16517
|
-
this.pending = setTimeout(() => {
|
|
16518
|
-
this.pending = void 0;
|
|
16519
|
-
this.revision += 1;
|
|
16520
|
-
for (const listener of [...this.listeners]) listener();
|
|
16521
|
-
}, this.settleMs);
|
|
16522
|
-
};
|
|
16523
|
-
};
|
|
16524
|
-
//#endregion
|
|
16525
16893
|
//#region src/client/settings.ts
|
|
16526
16894
|
var MnemonSettingsScope = class {
|
|
16527
16895
|
connection;
|
|
@@ -17507,6 +17875,7 @@ window.__ModuleLoader__.load({
|
|
|
17507
17875
|
inject: (sessionId) => ({
|
|
17508
17876
|
...typeof sessionId === "string" && sessionId !== "" ? { sessionId } : {},
|
|
17509
17877
|
connection: ctx.connection,
|
|
17878
|
+
componentChanges: seats.components,
|
|
17510
17879
|
localeRuntime: ctx.locale,
|
|
17511
17880
|
t: translate
|
|
17512
17881
|
})
|