dsh-mnemon 0.5.9 → 0.5.10

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/README.md CHANGED
@@ -30,6 +30,8 @@
30
30
 
31
31
  Runtime context, searchable documents and long-term evidence share a familiar Sidebar. The default Starter installs a tested plugin combination; contributors can replace or extend its parts without rebuilding the memory system.
32
32
 
33
+ Automatic idle review now uses bounded spawn checkpoints, a five-minute minimum interval and a 20-attempt limit per loaded session. It can be disabled independently. Published Agent Teams tool conflicts pause review before any child starts; failed runs retain committed receipt metadata and are never replayed automatically. See [review configuration and compatibility](./docs/en/reference/configuration.md#provider-requirements).
34
+
33
35
  ## Use three tiers, not three copies
34
36
 
35
37
  | Memory | Keep here | How it reaches the Agent |
package/README.zh-CN.md CHANGED
@@ -30,6 +30,8 @@
30
30
 
31
31
  运行时上下文、可检索档案和长期证据,使用同一个熟悉的侧栏(Sidebar)。默认安装包(Starter)安装经过验证的插件组合;贡献者可以独立替换或扩展其中的部分。
32
32
 
33
+ 自动空闲审查默认使用有界 spawn 检查点、至少五分钟间隔与每个加载会话最多 20 次尝试,并提供独立开关。已发布的 Agent Teams 工具冲突会在创建子 Agent 前暂停审查;失败运行保留已提交回执元数据且不自动重放。详见[审查配置与兼容性](./docs/zh-CN/reference/configuration.md)。
34
+
33
35
  ## 三层记忆,三种用途
34
36
 
35
37
  | 记忆 | 适合保存 | 如何进入 Agent 上下文 |
package/lib/client.js CHANGED
@@ -45,6 +45,15 @@ window.__ModuleLoader__.load({
45
45
  function isWorkspaceStorageScope(scope) {
46
46
  return scope === "workspace" || scope === "workspaces";
47
47
  }
48
+ const DEFAULT_IDLE_REVIEW = {
49
+ enabled: true,
50
+ provider: "spawn",
51
+ fallback: "spawn",
52
+ minIntervalMs: 3e5,
53
+ maxPerSession: 20,
54
+ maxContextChars: 24e3,
55
+ maxTokens: 4096
56
+ };
48
57
  const DEFAULT_EMBEDDING_ENDPOINT = "http://localhost:11434";
49
58
  const DEFAULT_EMBEDDING_MODEL = "nomic-embed-text";
50
59
  const MNEMON_EMBEDDING_PROTOCOLS = [
@@ -250,7 +259,7 @@ window.__ModuleLoader__.load({
250
259
  };
251
260
  //#endregion
252
261
  //#region \0dsh-mnemon-css:/home/runner/work/dsh-mnemon/dsh-mnemon/src/client/MnemonSettingsCard.module.css.mjs
253
- const css$11 = "._v_wrq_page{box-sizing:border-box;width:100%;min-width:0;max-width:720px;color:var(--dsw-alias-label-primary);flex-direction:column;gap:28px;padding-bottom:28px;font-family:inherit;display:flex}._v_wrq_page *,._v_wrq_page :before,._v_wrq_page :after{box-sizing:border-box}._v_wrq_page button,._v_wrq_page input,._v_wrq_page select{color:inherit;font:inherit}._v_wrq_loading{min-height:140px;color:var(--dsw-alias-label-tertiary);text-align:center;margin:0;font-size:13px;line-height:140px}._v_wrq_pageHeader h1{color:var(--dsw-alias-label-primary);margin:0;font-size:16px;font-weight:500;line-height:24px}._v_wrq_pageHeader p{max-width:64ch;color:var(--dsw-alias-label-tertiary);margin:8px 0 0;font-size:14px;line-height:22px}._v_wrq_section{flex-direction:column;gap:12px;min-width:0;display:flex}._v_wrq_sectionHeading{justify-content:space-between;align-items:flex-start;gap:18px;min-width:0;display:flex}._v_wrq_sectionHeading>div{flex:1;min-width:0}._v_wrq_sectionHeading h2{color:var(--dsw-alias-label-primary);margin:0;font-size:14px;font-weight:500;line-height:22px}._v_wrq_sectionHeading p{max-width:66ch;color:var(--dsw-alias-label-tertiary);margin:1px 0 0;font-size:12px;line-height:18px}._v_wrq_choiceGrid{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;display:grid}._v_wrq_topologyUnavailable{border:1px dashed var(--dsw-alias-border-l2);color:var(--dsw-alias-label-tertiary);border-radius:12px;margin:0;padding:13px;font-size:11px;line-height:17px}._v_wrq_topologyList{gap:8px;min-width:0;display:grid}._v_wrq_topologyLayer{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:12px;overflow:hidden}._v_wrq_topologyLayer[data-enabled=false]{background:color-mix(in srgb, var(--dsw-alias-bg-layer-3) 68%, transparent)}._v_wrq_topologyLayer>header{justify-content:space-between;align-items:center;gap:14px;min-width:0;padding:12px 13px;display:flex}._v_wrq_topologyLayer>header>span{flex-direction:column;flex:1;min-width:0;display:flex}._v_wrq_topologyLayer>header strong{color:var(--dsw-alias-label-primary);font-size:13px;font-weight:500;line-height:20px}._v_wrq_topologyLayer>header small{color:var(--dsw-alias-label-tertiary);font-size:10px;line-height:16px}._v_wrq_topologyToggle{color:var(--dsw-alias-label-tertiary);cursor:pointer;flex:none;align-items:center;gap:7px;font-size:10px;display:flex;position:relative}._v_wrq_topologyToggle input{clip-path:inset(50%);width:1px;height:1px;position:absolute;overflow:hidden}._v_wrq_topologyToggle i{background:var(--dsw-alias-bg-layer-2);width:34px;height:20px;box-shadow:inset 0 0 0 1px var(--dsw-alias-border-l2);border-radius:999px;display:block;position:relative}._v_wrq_topologyToggle i:after{content:\"\";background:var(--dsw-alias-bg-layer-3);width:14px;height:14px;box-shadow:0 1px 2px color-mix(in srgb, var(--dsw-alias-label-primary) 20%, transparent);border-radius:50%;transition:transform .14s;position:absolute;top:3px;left:3px}._v_wrq_topologyToggle input:checked+i{background:var(--dsw-alias-label-primary)}._v_wrq_topologyToggle input:checked+i:after{transform:translate(14px)}._v_wrq_topologyToggle:has(input:disabled){cursor:default;opacity:.45}._v_wrq_miniSpinner{border:2px solid var(--dsw-alias-border-l2);border-top-color:var(--dsw-alias-label-secondary);border-radius:50%;flex:none;width:16px;height:16px;margin-top:3px;animation:.7s linear infinite _v_wrq_task-agent-spin}._v_wrq_taskAgentPanel{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:12px;flex-direction:column;gap:12px;min-width:0;padding:12px 13px;display:flex}._v_wrq_taskAgentPanel[data-mode=fixed]{background:color-mix(in srgb, var(--dsw-alias-interactive-bg-hover) 54%, var(--dsw-alias-bg-layer-3))}._v_wrq_taskAgentFields{gap:12px;min-width:0;display:grid}._v_wrq_taskAgentFields>label{gap:6px;min-width:0;display:grid}._v_wrq_taskAgentFields>label>span{flex-direction:column;min-width:0;display:flex}._v_wrq_taskAgentFields strong{font-size:12px;font-weight:500;line-height:18px}._v_wrq_taskAgentFields small{color:var(--dsw-alias-label-tertiary);font-size:10px;line-height:16px}._v_wrq_taskAgentFields select{border:1px solid var(--dsw-alias-border-l2);width:100%;min-width:0;height:38px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2);font:inherit;border-radius:10px;outline:none;padding:0 10px;font-size:12px}._v_wrq_taskAgentFields select:disabled{cursor:default;opacity:.46}._v_wrq_taskAgentFields select:focus-visible{box-shadow:0 0 0 2px var(--dsw-alias-border-l3)}._v_wrq_taskAgentEffective{justify-content:space-between;align-items:center;gap:12px;min-width:0;display:flex}._v_wrq_taskAgentEffective>span{color:var(--dsw-alias-label-tertiary);font-size:10px;line-height:16px}._v_wrq_taskAgentEffective code{min-width:0;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-2);font-family:var(--ds-font-family-code,ui-monospace, monospace);text-overflow:ellipsis;white-space:nowrap;border-radius:999px;padding:3px 8px;font-size:10px;line-height:16px;overflow:hidden}._v_wrq_taskAgentEffective small{min-width:0;color:var(--dsw-alias-label-tertiary);text-align:right;text-overflow:ellipsis;white-space:nowrap;font-size:10px;line-height:16px;overflow:hidden}._v_wrq_taskAgentWarning{color:var(--dsw-alias-state-warning-primary,var(--dsw-alias-label-secondary));overflow-wrap:anywhere;margin:0;font-size:10px;line-height:16px}@keyframes _v_wrq_task-agent-spin{to{transform:rotate(360deg)}}._v_wrq_providerPanel{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:14px;overflow:hidden}._v_wrq_providerPanel>summary{cursor:pointer;justify-content:space-between;align-items:center;gap:16px;min-height:70px;padding:12px 14px;list-style:none;display:flex}._v_wrq_providerPanel>summary::-webkit-details-marker{display:none}._v_wrq_providerPanel>summary:after{content:\"›\";color:var(--dsw-alias-label-tertiary);font-size:20px;transition:transform .14s;transform:rotate(90deg)}._v_wrq_providerPanel[open]>summary:after{transform:rotate(-90deg)}._v_wrq_providerPanel[open]>summary{border-bottom:1px solid var(--dsw-alias-border-l2)}._v_wrq_providerIdentity{flex:1;align-items:center;gap:11px;min-width:0;display:flex}._v_wrq_providerIdentity>span{flex-direction:column;min-width:0;display:flex}._v_wrq_providerIdentity strong{font-size:14px;font-weight:500;line-height:21px}._v_wrq_providerIdentity small{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:17px}._v_wrq_nativeMark{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);border-radius:10px;flex:none;place-items:center;width:34px;height:34px;padding:4px;display:grid;overflow:hidden}._v_wrq_nativeMark>svg{border-radius:6px;width:100%;height:100%;display:block}._v_wrq_providerMark{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);border-radius:10px;flex:none;place-items:center;width:34px;height:34px;padding:4px;display:grid;overflow:hidden}._v_wrq_providerMark>img,._v_wrq_providerMark>svg{object-fit:contain;border-radius:6px;width:100%;height:100%;display:block}._v_wrq_providerHeaderMeta{flex:none;align-items:center;gap:7px;display:flex}._v_wrq_providerScopeTag{border-radius:999px;flex:none;padding:3px 8px;font-size:10px;font-weight:500;line-height:16px}._v_wrq_providerScopeTag[data-scope=global]{color:var(--dsw-alias-state-warning-primary,var(--dsw-alias-label-secondary));background:color-mix(in srgb, var(--dsw-alias-state-warning-primary,var(--dsw-alias-label-secondary)) 11%, transparent)}._v_wrq_providerScopeTag[data-scope=workspace]{color:var(--dsw-alias-state-business-primary,var(--dsw-alias-label-secondary));background:color-mix(in srgb, var(--dsw-alias-state-business-primary,var(--dsw-alias-label-secondary)) 11%, transparent)}._v_wrq_providerState{color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-2);border-radius:999px;flex:none;padding:3px 8px;font-size:10px;line-height:16px}._v_wrq_providerPanelBody{flex-direction:column;gap:12px;padding:0 14px 14px;display:flex}._v_wrq_providerList{flex-direction:column;gap:10px;min-width:0;display:flex}._v_wrq_providerRow{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:14px;overflow:hidden}._v_wrq_providerRowHeader{align-items:center;gap:16px;min-width:0;min-height:70px;padding:12px 14px;display:flex}._v_wrq_providerRow[data-expanded] ._v_wrq_providerRowHeader{border-bottom:1px solid var(--dsw-alias-border-l2)}._v_wrq_providerDisclosure{appearance:none;min-width:0;color:inherit;cursor:pointer;text-align:left;background:0 0;border:0;outline:none;flex:1;align-items:center;gap:8px;padding:0;display:flex}._v_wrq_providerDisclosure:disabled{cursor:default}._v_wrq_providerDisclosure:focus-visible{box-shadow:0 0 0 2px var(--dsw-alias-border-l3);border-radius:8px}._v_wrq_providerChevron{color:var(--dsw-alias-label-tertiary);flex:none;font-size:18px;font-style:normal;transition:transform .14s;display:inline-block;transform:rotate(90deg)}._v_wrq_providerDisclosure[aria-expanded=true] ._v_wrq_providerChevron{transform:rotate(-90deg)}._v_wrq_providerEnableControl{flex:none;align-items:center;gap:10px;display:flex}._v_wrq_providerState[data-enabled]{color:var(--dsw-alias-state-success-primary);background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 8%, transparent)}._v_wrq_providerToggle{cursor:pointer;display:inline-flex;position:relative}._v_wrq_providerToggle>input{clip:rect(0 0 0 0);clip-path:inset(50%);width:1px;height:1px;position:absolute;overflow:hidden}._v_wrq_providerToggle>span{background:var(--dsw-alias-bg-layer-2);width:38px;height:22px;box-shadow:inset 0 0 0 1px var(--dsw-alias-border-l2);border-radius:999px;transition:background-color .14s;display:block;position:relative}._v_wrq_providerToggle>span>i{background:var(--dsw-alias-bg-layer-3);width:16px;height:16px;box-shadow:0 1px 3px color-mix(in srgb, var(--dsw-alias-label-primary) 22%, transparent);border-radius:50%;transition:transform .14s;position:absolute;top:3px;left:3px}._v_wrq_providerToggle>input:checked+span{background:var(--dsw-alias-label-primary);box-shadow:none}._v_wrq_providerToggle>input:checked+span>i{transform:translate(16px)}._v_wrq_providerToggle>input:focus-visible+span{box-shadow:0 0 0 2px var(--dsw-alias-border-l3)}._v_wrq_providerToggle:has(input:disabled){cursor:default;opacity:.42}._v_wrq_providerInlineBody{padding:0 14px 14px}._v_wrq_providerToggleError{color:var(--dsw-alias-state-error-primary);margin:0;padding:0 14px 12px;font-size:10px;line-height:16px}._v_wrq_providerServiceForm{flex-direction:column;gap:12px;min-width:0;padding-top:13px;display:flex}._v_wrq_providerServicePrompt{color:var(--dsw-alias-label-tertiary);margin:0;font-size:11px;line-height:17px}._v_wrq_globalLocationSetting{flex-direction:column;min-width:0;display:flex}._v_wrq_providerServiceLocation{border-bottom:1px solid var(--dsw-alias-border-l2);padding-bottom:12px}._v_wrq_providerServiceLocation>._v_wrq_nativeLocation{min-height:0;padding:0 0 12px}._v_wrq_providerLocationField{border-top:1px solid var(--dsw-alias-border-l2);padding-top:11px}._v_wrq_nativeLocation{justify-content:space-between;align-items:center;gap:18px;min-height:68px;padding:12px 0;display:flex}._v_wrq_inlineChoices{flex:none;align-items:center;gap:6px;display:flex}._v_wrq_inlineChoices label{cursor:pointer;position:relative}._v_wrq_inlineChoices input{z-index:1;opacity:0;width:100%;height:100%;cursor:inherit;margin:0;position:absolute;inset:0}._v_wrq_inlineChoices span{border:1px solid var(--dsw-alias-border-l2);height:32px;color:var(--dsw-alias-label-secondary);border-radius:16px;align-items:center;padding:0 11px;font-size:12px;display:inline-flex}._v_wrq_inlineChoices input:checked+span{border-color:var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-hover)}._v_wrq_inlineChoices input:focus-visible+span{box-shadow:0 0 0 2px var(--dsw-alias-border-l3)}._v_wrq_inlineChoices input:disabled+span{cursor:default;opacity:.42}._v_wrq_embeddedSection,._v_wrq_embeddingSection{border-top:1px solid var(--dsw-alias-border-l2);flex-direction:column;gap:10px;min-width:0;padding-top:13px;display:flex}._v_wrq_embeddingHeading h3{color:var(--dsw-alias-label-primary);margin:0;font-size:13px;font-weight:500;line-height:20px}._v_wrq_embeddingHeading p{color:var(--dsw-alias-label-tertiary);margin:1px 0 0;font-size:10px;line-height:16px}._v_wrq_embeddingSection ._v_wrq_toggleRow{min-height:58px;padding:9px 0}._v_wrq_embeddingSecurity{color:var(--dsw-alias-state-warning-primary,var(--dsw-alias-label-tertiary));margin:0;font-size:10px;line-height:16px}._v_wrq_embeddingTest{justify-content:space-between;align-items:center;gap:10px;min-width:0;min-height:28px;display:flex}._v_wrq_embeddingTest>span{min-width:0;color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;font-size:10px;line-height:16px}._v_wrq_embeddingTest>span._v_wrq_error{color:var(--dsw-alias-state-error-primary)}._v_wrq_memoryConfig{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);border-radius:12px;flex-direction:column;gap:12px;min-width:0;padding:12px;display:flex}._v_wrq_memoryConfig:first-child{margin-top:12px}._v_wrq_memoryConfigHeader{justify-content:space-between;align-items:center;gap:12px;min-width:0;display:flex}._v_wrq_memoryConfigHeader>div{flex-direction:column;min-width:0;display:flex}._v_wrq_memoryConfigHeader strong{text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:500;line-height:20px;overflow:hidden}._v_wrq_memoryConfigHeader small{color:var(--dsw-alias-label-tertiary);font-size:10px;line-height:16px}._v_wrq_configActive{color:var(--dsw-alias-label-secondary);cursor:pointer;flex:none;align-items:center;gap:6px;font-size:11px;display:inline-flex}._v_wrq_configActive input{accent-color:var(--dsw-alias-label-primary)}._v_wrq_providerIdentityFields{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;min-width:0;display:grid}._v_wrq_providerSettingsGrid{grid-template-columns:minmax(0,1fr);gap:12px;min-width:0;display:grid}._v_wrq_providerIdentityFields>label,._v_wrq_providerFieldControl>label:not(._v_wrq_providerBoolean){min-width:0;color:var(--dsw-alias-label-secondary);flex-direction:column;gap:4px;font-size:10px;line-height:16px;display:flex}._v_wrq_providerIdentityFields input,._v_wrq_providerIdentityFields select,._v_wrq_providerFieldControl input:not([type=checkbox]),._v_wrq_providerFieldControl select{border:1px solid var(--dsw-alias-border-l2);width:100%;min-width:0;height:36px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-3);font:inherit;border-radius:9px;outline:none;padding:0 10px;font-size:12px}._v_wrq_providerIdentityFields select,._v_wrq_taskAgentFields select,._v_wrq_providerFieldControl select{appearance:none;cursor:pointer;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12' fill='none'%3E%3Cpath d='M3 4.5L6 7.5L9 4.5' stroke='%2381858C' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\");background-position:right 12px center;background-repeat:no-repeat;background-size:12px 12px;padding-right:32px}._v_wrq_providerIdentityFields select:disabled,._v_wrq_taskAgentFields select:disabled,._v_wrq_providerFieldControl select:disabled{cursor:default}._v_wrq_providerIdentityFields input:focus-visible,._v_wrq_providerIdentityFields select:focus-visible,._v_wrq_providerFieldControl input:focus-visible,._v_wrq_providerFieldControl select:focus-visible{box-shadow:0 0 0 2px var(--dsw-alias-border-l3)}._v_wrq_providerIdentityFields input:disabled,._v_wrq_providerIdentityFields select:disabled,._v_wrq_providerFieldControl input:disabled,._v_wrq_providerFieldControl select:disabled{opacity:.5}._v_wrq_providerFieldControl{flex-direction:column;justify-content:flex-end;gap:3px;min-width:0;display:flex}._v_wrq_providerBoolean{min-height:36px;color:var(--dsw-alias-label-secondary);align-items:center;gap:7px;font-size:11px;display:flex}._v_wrq_providerBoolean input{accent-color:var(--dsw-alias-label-primary)}._v_wrq_providerSecretInput{min-width:0;position:relative}._v_wrq_providerSecretInput>input{padding-right:39px}._v_wrq_providerSecretVisibility{appearance:none;width:28px;height:28px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;border-radius:7px;place-items:center;padding:0;display:grid;position:absolute;top:4px;right:4px}._v_wrq_providerSecretVisibility:hover:not(:disabled){color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-hover)}._v_wrq_providerSecretVisibility:focus-visible{box-shadow:0 0 0 2px var(--dsw-alias-border-l3);outline:none}._v_wrq_providerSecretVisibility:disabled{cursor:default;opacity:.35}._v_wrq_providerSecretVisibility svg{width:17px;height:17px}._v_wrq_memoryConfigFooter{border-top:1px solid var(--dsw-alias-border-l2);justify-content:space-between;align-items:center;gap:10px;min-height:36px;padding-top:10px;display:flex}._v_wrq_memoryConfigFooter>div{align-items:center;gap:6px;display:flex}._v_wrq_providerServiceFooter{flex-direction:column;align-items:stretch;min-height:0}._v_wrq_providerServiceFooter>button{align-self:flex-end}._v_wrq_configFeedback{flex:1;min-width:0;font-size:10px;line-height:15px}._v_wrq_addConfigButton{appearance:none;border:1px dashed var(--dsw-alias-border-l2);min-height:36px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border-radius:10px;font-size:11px}._v_wrq_addConfigButton:hover:not(:disabled){color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-hover)}._v_wrq_addConfigButton:disabled{cursor:default;opacity:.4}._v_wrq_scopeChanging,._v_wrq_providerTarget{color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-bg-layer-2);border-radius:10px;margin:0;padding:8px 10px;font-size:10px;line-height:16px}._v_wrq_scopeChanging{color:var(--dsw-alias-state-warning-primary,var(--dsw-alias-label-secondary))}._v_wrq_providerTarget{background:0 0;margin-top:-4px;padding:0}._v_wrq_providerLoadError{justify-content:space-between;align-items:center;gap:10px;font-size:11px;display:flex}._v_wrq_choiceCard{cursor:pointer;min-width:0;display:block;position:relative}._v_wrq_choiceCard>input,._v_wrq_toggleRow>input,._v_wrq_visuallyHidden{clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}._v_wrq_choiceFace{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:12px;flex-direction:column;justify-content:center;gap:1px;min-width:0;min-height:66px;padding:10px 34px 10px 13px;transition:border-color .14s,background-color .14s;display:flex;position:relative}._v_wrq_choiceFace:hover{background:var(--dsw-alias-interactive-bg-hover)}._v_wrq_choiceFace strong{text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:500;line-height:21px;overflow:hidden}._v_wrq_choiceFace small{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:11px;line-height:17px;overflow:hidden}._v_wrq_check{font-size:14px;line-height:18px;display:none;position:absolute;top:11px;right:12px}._v_wrq_choiceCard>input:checked+._v_wrq_choiceFace{border-color:var(--dsw-alias-border-l1);background:var(--dsw-alias-interactive-bg-hover)}._v_wrq_choiceCard>input:checked+._v_wrq_choiceFace ._v_wrq_check{display:block}._v_wrq_choiceCard>input:disabled+._v_wrq_choiceFace{cursor:default;opacity:.42}._v_wrq_choiceCard:has(input:disabled){cursor:default}._v_wrq_settingRow,._v_wrq_toggleRow{border-top:1px solid var(--dsw-alias-border-l2);justify-content:space-between;align-items:center;gap:18px;min-width:0;min-height:62px;padding:11px 0;display:flex;position:relative}._v_wrq_settingCopy{flex-direction:column;flex:1;min-width:0;display:flex}._v_wrq_settingCopy strong{color:var(--dsw-alias-label-primary);font-size:14px;font-weight:500;line-height:21px}._v_wrq_settingCopy small{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:17px}._v_wrq_settingCopy code{font-family:var(--ds-font-family-code,ui-monospace, monospace)}._v_wrq_directoryControl{flex:0 420px;align-items:center;gap:8px;min-width:0;max-width:60%;display:flex}._v_wrq_directoryInput{border:1px solid var(--dsw-alias-border-l2);width:100%;min-width:0;height:38px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-3);font-family:var(--ds-font-family-code,ui-monospace, monospace);border-radius:10px;outline:none;padding:0 11px;font-size:12px;line-height:20px}._v_wrq_directoryInput::placeholder{color:var(--dsw-alias-label-caption)}._v_wrq_directoryInput:disabled{cursor:default;opacity:.46}._v_wrq_rowGroup{border-bottom:1px solid var(--dsw-alias-border-l2)}._v_wrq_enhancementsSection{container-type:inline-size}._v_wrq_toggleRow{cursor:pointer}._v_wrq_toggleRow:first-child{border-top:1px solid var(--dsw-alias-border-l2)}._v_wrq_toggleRow:has(input:disabled){cursor:default;opacity:.46}._v_wrq_switch{background:var(--dsw-alias-bg-layer-2);width:40px;height:24px;box-shadow:inset 0 0 0 1px var(--dsw-alias-border-l2);border-radius:999px;flex:none;transition:background-color .14s;display:block;position:relative}._v_wrq_switch i{background:var(--dsw-alias-bg-layer-3);width:18px;height:18px;box-shadow:0 1px 3px color-mix(in srgb, var(--dsw-alias-label-primary) 22%, transparent);border-radius:50%;transition:transform .14s;position:absolute;top:3px;left:3px}._v_wrq_toggleRow>input:checked+._v_wrq_switch{background:var(--dsw-alias-label-primary);box-shadow:none}._v_wrq_toggleRow>input:checked+._v_wrq_switch i{transform:translate(16px)}._v_wrq_pillButton,._v_wrq_primaryPill,._v_wrq_actions button{appearance:none;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);height:36px;color:var(--dsw-alias-label-primary);cursor:pointer;white-space:nowrap;background:0 0;border-radius:18px;justify-content:center;align-items:center;gap:4px;padding:0 14px;font-size:14px;line-height:22px;display:inline-flex}._v_wrq_pillButton:hover:not(:disabled),._v_wrq_actions button:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover-solid)}._v_wrq_pillButton:disabled,._v_wrq_primaryPill:disabled,._v_wrq_actions button:disabled,._v_wrq_textButton:disabled{cursor:default;opacity:.4}._v_wrq_primaryPill,._v_wrq_save{color:var(--dsw-alias-label-primary-foreground)!important;background:var(--dsw-alias-button-primary-fill)!important;border-color:#0000!important}._v_wrq_primaryPill:hover:not(:disabled),._v_wrq_save:hover:not(:disabled){background:var(--dsw-alias-button-primary-hover)!important}._v_wrq_textButton{appearance:none;box-sizing:border-box;height:28px;color:var(--dsw-alias-label-secondary);cursor:pointer;font:inherit;background:0 0;border:0;border-radius:14px;flex:none;justify-content:center;align-items:center;padding:0 10px;font-size:12px;line-height:18px;display:inline-flex}._v_wrq_textButton:hover:not(:disabled){color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-hover)}._v_wrq_activePath{width:fit-content;max-width:100%;color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;margin-top:4px;font-size:11px;line-height:17px;overflow:hidden}._v_wrq_scopeMeta{color:var(--dsw-alias-label-tertiary);margin-top:1px;font-size:10px;font-style:normal;line-height:15px}._v_wrq_rowActions{flex:none;align-items:center;gap:8px;display:flex}._v_wrq_importBar{background:var(--dsw-alias-bg-layer-2);border-radius:12px;grid-template-columns:minmax(0,1fr) auto auto;align-items:center;gap:10px;min-width:0;padding:10px 12px;display:grid}._v_wrq_importBar>div{min-width:0;display:grid}._v_wrq_importBar strong{text-overflow:ellipsis;white-space:nowrap;font-size:12px;font-weight:500;line-height:18px;overflow:hidden}._v_wrq_importBar small{color:var(--dsw-alias-label-tertiary);font-size:10px;line-height:15px}._v_wrq_importBar ._v_wrq_textButton{padding:0 10px}._v_wrq_feedback,._v_wrq_packFeedback{gap:4px;display:grid}._v_wrq_feedback:empty,._v_wrq_packFeedback:empty{display:none}._v_wrq_feedback p,._v_wrq_packFeedback p{overflow-wrap:anywhere;margin:0;font-size:12px;line-height:18px}._v_wrq_error{color:var(--dsw-alias-state-error-primary)}._v_wrq_success{color:var(--dsw-alias-state-success-primary)}._v_wrq_readOnly{color:var(--dsw-alias-label-tertiary)}._v_wrq_packSuccess{color:var(--dsw-alias-state-success-primary)}._v_wrq_actions{display:none}._v_wrq_actionsVisible{border-top:1px solid var(--dsw-alias-border-l2);justify-content:space-between;align-items:center;gap:16px;padding-top:14px;display:flex}._v_wrq_actions>span{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px}._v_wrq_actions>div{gap:8px;display:flex}._v_wrq_discard{color:var(--dsw-alias-label-primary);background:0 0;border-color:var(--dsw-alias-border-l2)!important}._v_wrq_settingsNote{color:var(--dsw-alias-label-tertiary);margin:-14px 0 0;font-size:10px;line-height:16px}._v_wrq_settingsNote code{color:var(--dsw-alias-label-secondary);font-family:var(--ds-font-family-code,ui-monospace, monospace)}._v_wrq_choiceCard>input:focus-visible+._v_wrq_choiceFace,._v_wrq_toggleRow>input:focus-visible+._v_wrq_switch,._v_wrq_directoryInput:focus-visible,._v_wrq_pillButton:focus-visible,._v_wrq_primaryPill:focus-visible,._v_wrq_textButton:focus-visible,._v_wrq_actions button:focus-visible{box-shadow:0 0 0 2px var(--dsw-alias-border-l3);outline:none}@media (width<=620px){._v_wrq_page{gap:24px}._v_wrq_choiceGrid{grid-template-columns:minmax(0,1fr)}._v_wrq_settingRow{flex-direction:column;align-items:stretch;gap:9px}._v_wrq_directoryControl{justify-content:space-between;max-width:none}._v_wrq_rowActions{width:100%}._v_wrq_rowActions button{flex:1}._v_wrq_importBar{grid-template-columns:minmax(0,1fr) auto}._v_wrq_importBar ._v_wrq_primaryPill{grid-column:1/-1}._v_wrq_actionsVisible{flex-direction:column;align-items:stretch}._v_wrq_actions>div,._v_wrq_actions button{flex:1}._v_wrq_nativeLocation{flex-direction:column;align-items:stretch;gap:9px}._v_wrq_inlineChoices{width:100%}._v_wrq_inlineChoices label{flex:1}._v_wrq_inlineChoices span{justify-content:center;width:100%}._v_wrq_providerIdentityFields{grid-template-columns:minmax(0,1fr)}._v_wrq_providerRowHeader{align-items:flex-start;gap:8px}._v_wrq_providerEnableControl{flex-direction:column-reverse;align-items:flex-end;gap:5px;max-width:116px}._v_wrq_providerState{text-overflow:ellipsis;white-space:nowrap;max-width:108px;overflow:hidden}._v_wrq_memoryConfigFooter{flex-direction:column;align-items:stretch}._v_wrq_memoryConfigFooter>div:last-child{width:100%}._v_wrq_memoryConfigFooter button{flex:1}}@container (width<=180px){._v_wrq_enhancementsSection ._v_wrq_sectionHeading p,._v_wrq_enhancementsSection ._v_wrq_settingCopy small{display:none}._v_wrq_enhancementsSection ._v_wrq_toggleRow{grid-template-columns:minmax(0,1fr);gap:6px;min-height:0;padding:10px 0;display:grid}._v_wrq_enhancementsSection ._v_wrq_settingCopy strong{overflow-wrap:anywhere}._v_wrq_enhancementsSection ._v_wrq_switch{justify-self:end}}@media (prefers-reduced-motion:reduce){._v_wrq_choiceFace,._v_wrq_switch,._v_wrq_switch i,._v_wrq_providerChevron,._v_wrq_providerToggle>span,._v_wrq_providerToggle>span>i{transition:none}._v_wrq_miniSpinner{animation:none}}._v_wrq_storageChoiceGrid>:last-child{grid-column:1/-1}._v_wrq_workspaceStorageLocation{margin-top:16px}._v_wrq_workspaceStorageLocation>p{color:var(--dsw-alias-label-caption);margin:10px 0 0;font-size:12px;line-height:1.5}";
262
+ const css$11 = "._v_wrq_page{box-sizing:border-box;width:100%;min-width:0;max-width:720px;color:var(--dsw-alias-label-primary);flex-direction:column;gap:28px;padding-bottom:28px;font-family:inherit;display:flex}._v_wrq_page *,._v_wrq_page :before,._v_wrq_page :after{box-sizing:border-box}._v_wrq_page button,._v_wrq_page input,._v_wrq_page select{color:inherit;font:inherit}._v_wrq_loading{min-height:140px;color:var(--dsw-alias-label-tertiary);text-align:center;margin:0;font-size:13px;line-height:140px}._v_wrq_pageHeader h1{color:var(--dsw-alias-label-primary);margin:0;font-size:16px;font-weight:500;line-height:24px}._v_wrq_pageHeader p{max-width:64ch;color:var(--dsw-alias-label-tertiary);margin:8px 0 0;font-size:14px;line-height:22px}._v_wrq_section{flex-direction:column;gap:12px;min-width:0;display:flex}._v_wrq_sectionHeading{justify-content:space-between;align-items:flex-start;gap:18px;min-width:0;display:flex}._v_wrq_sectionHeading>div{flex:1;min-width:0}._v_wrq_sectionHeading h2{color:var(--dsw-alias-label-primary);margin:0;font-size:14px;font-weight:500;line-height:22px}._v_wrq_sectionHeading p{max-width:66ch;color:var(--dsw-alias-label-tertiary);margin:1px 0 0;font-size:12px;line-height:18px}._v_wrq_choiceGrid{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;display:grid}._v_wrq_topologyUnavailable{border:1px dashed var(--dsw-alias-border-l2);color:var(--dsw-alias-label-tertiary);border-radius:12px;margin:0;padding:13px;font-size:11px;line-height:17px}._v_wrq_topologyList{gap:8px;min-width:0;display:grid}._v_wrq_topologyLayer{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:12px;overflow:hidden}._v_wrq_topologyLayer[data-enabled=false]{background:color-mix(in srgb, var(--dsw-alias-bg-layer-3) 68%, transparent)}._v_wrq_topologyLayer>header{justify-content:space-between;align-items:center;gap:14px;min-width:0;padding:12px 13px;display:flex}._v_wrq_topologyLayer>header>span{flex-direction:column;flex:1;min-width:0;display:flex}._v_wrq_topologyLayer>header strong{color:var(--dsw-alias-label-primary);font-size:13px;font-weight:500;line-height:20px}._v_wrq_topologyLayer>header small{color:var(--dsw-alias-label-tertiary);font-size:10px;line-height:16px}._v_wrq_topologyToggle{color:var(--dsw-alias-label-tertiary);cursor:pointer;flex:none;align-items:center;gap:7px;font-size:10px;display:flex;position:relative}._v_wrq_topologyToggle input{clip-path:inset(50%);width:1px;height:1px;position:absolute;overflow:hidden}._v_wrq_topologyToggle i{background:var(--dsw-alias-bg-layer-2);width:34px;height:20px;box-shadow:inset 0 0 0 1px var(--dsw-alias-border-l2);border-radius:999px;display:block;position:relative}._v_wrq_topologyToggle i:after{content:\"\";background:var(--dsw-alias-bg-layer-3);width:14px;height:14px;box-shadow:0 1px 2px color-mix(in srgb, var(--dsw-alias-label-primary) 20%, transparent);border-radius:50%;transition:transform .14s;position:absolute;top:3px;left:3px}._v_wrq_topologyToggle input:checked+i{background:var(--dsw-alias-label-primary)}._v_wrq_topologyToggle input:checked+i:after{transform:translate(14px)}._v_wrq_topologyToggle:has(input:disabled){cursor:default;opacity:.45}._v_wrq_miniSpinner{border:2px solid var(--dsw-alias-border-l2);border-top-color:var(--dsw-alias-label-secondary);border-radius:50%;flex:none;width:16px;height:16px;margin-top:3px;animation:.7s linear infinite _v_wrq_task-agent-spin}._v_wrq_taskAgentPanel{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:12px;flex-direction:column;gap:12px;min-width:0;padding:12px 13px;display:flex}._v_wrq_taskAgentPanel[data-mode=fixed]{background:color-mix(in srgb, var(--dsw-alias-interactive-bg-hover) 54%, var(--dsw-alias-bg-layer-3))}._v_wrq_taskAgentFields{gap:12px;min-width:0;display:grid}._v_wrq_taskAgentFields>label{gap:6px;min-width:0;display:grid}._v_wrq_taskAgentFields>label>span{flex-direction:column;min-width:0;display:flex}._v_wrq_taskAgentFields strong{font-size:12px;font-weight:500;line-height:18px}._v_wrq_taskAgentFields small{color:var(--dsw-alias-label-tertiary);font-size:10px;line-height:16px}._v_wrq_taskAgentFields select,._v_wrq_taskAgentFields input[type=number]{border:1px solid var(--dsw-alias-border-l2);width:100%;min-width:0;height:38px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2);font:inherit;border-radius:10px;outline:none;padding:0 10px;font-size:12px}._v_wrq_taskAgentFields select:disabled,._v_wrq_taskAgentFields input:disabled{cursor:default;opacity:.46}._v_wrq_taskAgentFields select:focus-visible,._v_wrq_taskAgentFields input:focus-visible{box-shadow:0 0 0 2px var(--dsw-alias-border-l3)}._v_wrq_taskAgentEffective{justify-content:space-between;align-items:center;gap:12px;min-width:0;display:flex}._v_wrq_taskAgentEffective>span{color:var(--dsw-alias-label-tertiary);font-size:10px;line-height:16px}._v_wrq_taskAgentEffective code{min-width:0;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-2);font-family:var(--ds-font-family-code,ui-monospace, monospace);text-overflow:ellipsis;white-space:nowrap;border-radius:999px;padding:3px 8px;font-size:10px;line-height:16px;overflow:hidden}._v_wrq_taskAgentEffective small{min-width:0;color:var(--dsw-alias-label-tertiary);text-align:right;text-overflow:ellipsis;white-space:nowrap;font-size:10px;line-height:16px;overflow:hidden}._v_wrq_taskAgentWarning{color:var(--dsw-alias-state-warning-primary,var(--dsw-alias-label-secondary));overflow-wrap:anywhere;margin:0;font-size:10px;line-height:16px}@keyframes _v_wrq_task-agent-spin{to{transform:rotate(360deg)}}._v_wrq_providerPanel{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:14px;overflow:hidden}._v_wrq_providerPanel>summary{cursor:pointer;justify-content:space-between;align-items:center;gap:16px;min-height:70px;padding:12px 14px;list-style:none;display:flex}._v_wrq_providerPanel>summary::-webkit-details-marker{display:none}._v_wrq_providerPanel>summary:after{content:\"›\";color:var(--dsw-alias-label-tertiary);font-size:20px;transition:transform .14s;transform:rotate(90deg)}._v_wrq_providerPanel[open]>summary:after{transform:rotate(-90deg)}._v_wrq_providerPanel[open]>summary{border-bottom:1px solid var(--dsw-alias-border-l2)}._v_wrq_providerIdentity{flex:1;align-items:center;gap:11px;min-width:0;display:flex}._v_wrq_providerIdentity>span{flex-direction:column;min-width:0;display:flex}._v_wrq_providerIdentity strong{font-size:14px;font-weight:500;line-height:21px}._v_wrq_providerIdentity small{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:17px}._v_wrq_nativeMark{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);border-radius:10px;flex:none;place-items:center;width:34px;height:34px;padding:4px;display:grid;overflow:hidden}._v_wrq_nativeMark>svg{border-radius:6px;width:100%;height:100%;display:block}._v_wrq_providerMark{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);border-radius:10px;flex:none;place-items:center;width:34px;height:34px;padding:4px;display:grid;overflow:hidden}._v_wrq_providerMark>img,._v_wrq_providerMark>svg{object-fit:contain;border-radius:6px;width:100%;height:100%;display:block}._v_wrq_providerHeaderMeta{flex:none;align-items:center;gap:7px;display:flex}._v_wrq_providerScopeTag{border-radius:999px;flex:none;padding:3px 8px;font-size:10px;font-weight:500;line-height:16px}._v_wrq_providerScopeTag[data-scope=global]{color:var(--dsw-alias-state-warning-primary,var(--dsw-alias-label-secondary));background:color-mix(in srgb, var(--dsw-alias-state-warning-primary,var(--dsw-alias-label-secondary)) 11%, transparent)}._v_wrq_providerScopeTag[data-scope=workspace]{color:var(--dsw-alias-state-business-primary,var(--dsw-alias-label-secondary));background:color-mix(in srgb, var(--dsw-alias-state-business-primary,var(--dsw-alias-label-secondary)) 11%, transparent)}._v_wrq_providerState{color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-2);border-radius:999px;flex:none;padding:3px 8px;font-size:10px;line-height:16px}._v_wrq_providerPanelBody{flex-direction:column;gap:12px;padding:0 14px 14px;display:flex}._v_wrq_providerList{flex-direction:column;gap:10px;min-width:0;display:flex}._v_wrq_providerRow{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:14px;overflow:hidden}._v_wrq_providerRowHeader{align-items:center;gap:16px;min-width:0;min-height:70px;padding:12px 14px;display:flex}._v_wrq_providerRow[data-expanded] ._v_wrq_providerRowHeader{border-bottom:1px solid var(--dsw-alias-border-l2)}._v_wrq_providerDisclosure{appearance:none;min-width:0;color:inherit;cursor:pointer;text-align:left;background:0 0;border:0;outline:none;flex:1;align-items:center;gap:8px;padding:0;display:flex}._v_wrq_providerDisclosure:disabled{cursor:default}._v_wrq_providerDisclosure:focus-visible{box-shadow:0 0 0 2px var(--dsw-alias-border-l3);border-radius:8px}._v_wrq_providerChevron{color:var(--dsw-alias-label-tertiary);flex:none;font-size:18px;font-style:normal;transition:transform .14s;display:inline-block;transform:rotate(90deg)}._v_wrq_providerDisclosure[aria-expanded=true] ._v_wrq_providerChevron{transform:rotate(-90deg)}._v_wrq_providerEnableControl{flex:none;align-items:center;gap:10px;display:flex}._v_wrq_providerState[data-enabled]{color:var(--dsw-alias-state-success-primary);background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 8%, transparent)}._v_wrq_providerToggle{cursor:pointer;display:inline-flex;position:relative}._v_wrq_providerToggle>input{clip:rect(0 0 0 0);clip-path:inset(50%);width:1px;height:1px;position:absolute;overflow:hidden}._v_wrq_providerToggle>span{background:var(--dsw-alias-bg-layer-2);width:38px;height:22px;box-shadow:inset 0 0 0 1px var(--dsw-alias-border-l2);border-radius:999px;transition:background-color .14s;display:block;position:relative}._v_wrq_providerToggle>span>i{background:var(--dsw-alias-bg-layer-3);width:16px;height:16px;box-shadow:0 1px 3px color-mix(in srgb, var(--dsw-alias-label-primary) 22%, transparent);border-radius:50%;transition:transform .14s;position:absolute;top:3px;left:3px}._v_wrq_providerToggle>input:checked+span{background:var(--dsw-alias-label-primary);box-shadow:none}._v_wrq_providerToggle>input:checked+span>i{transform:translate(16px)}._v_wrq_providerToggle>input:focus-visible+span{box-shadow:0 0 0 2px var(--dsw-alias-border-l3)}._v_wrq_providerToggle:has(input:disabled){cursor:default;opacity:.42}._v_wrq_providerInlineBody{padding:0 14px 14px}._v_wrq_providerToggleError{color:var(--dsw-alias-state-error-primary);margin:0;padding:0 14px 12px;font-size:10px;line-height:16px}._v_wrq_providerServiceForm{flex-direction:column;gap:12px;min-width:0;padding-top:13px;display:flex}._v_wrq_providerServicePrompt{color:var(--dsw-alias-label-tertiary);margin:0;font-size:11px;line-height:17px}._v_wrq_globalLocationSetting{flex-direction:column;min-width:0;display:flex}._v_wrq_providerServiceLocation{border-bottom:1px solid var(--dsw-alias-border-l2);padding-bottom:12px}._v_wrq_providerServiceLocation>._v_wrq_nativeLocation{min-height:0;padding:0 0 12px}._v_wrq_providerLocationField{border-top:1px solid var(--dsw-alias-border-l2);padding-top:11px}._v_wrq_nativeLocation{justify-content:space-between;align-items:center;gap:18px;min-height:68px;padding:12px 0;display:flex}._v_wrq_inlineChoices{flex:none;align-items:center;gap:6px;display:flex}._v_wrq_inlineChoices label{cursor:pointer;position:relative}._v_wrq_inlineChoices input{z-index:1;opacity:0;width:100%;height:100%;cursor:inherit;margin:0;position:absolute;inset:0}._v_wrq_inlineChoices span{border:1px solid var(--dsw-alias-border-l2);height:32px;color:var(--dsw-alias-label-secondary);border-radius:16px;align-items:center;padding:0 11px;font-size:12px;display:inline-flex}._v_wrq_inlineChoices input:checked+span{border-color:var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-hover)}._v_wrq_inlineChoices input:focus-visible+span{box-shadow:0 0 0 2px var(--dsw-alias-border-l3)}._v_wrq_inlineChoices input:disabled+span{cursor:default;opacity:.42}._v_wrq_embeddedSection,._v_wrq_embeddingSection{border-top:1px solid var(--dsw-alias-border-l2);flex-direction:column;gap:10px;min-width:0;padding-top:13px;display:flex}._v_wrq_embeddingHeading h3{color:var(--dsw-alias-label-primary);margin:0;font-size:13px;font-weight:500;line-height:20px}._v_wrq_embeddingHeading p{color:var(--dsw-alias-label-tertiary);margin:1px 0 0;font-size:10px;line-height:16px}._v_wrq_embeddingSection ._v_wrq_toggleRow{min-height:58px;padding:9px 0}._v_wrq_embeddingSecurity{color:var(--dsw-alias-state-warning-primary,var(--dsw-alias-label-tertiary));margin:0;font-size:10px;line-height:16px}._v_wrq_embeddingTest{justify-content:space-between;align-items:center;gap:10px;min-width:0;min-height:28px;display:flex}._v_wrq_embeddingTest>span{min-width:0;color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;font-size:10px;line-height:16px}._v_wrq_embeddingTest>span._v_wrq_error{color:var(--dsw-alias-state-error-primary)}._v_wrq_memoryConfig{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);border-radius:12px;flex-direction:column;gap:12px;min-width:0;padding:12px;display:flex}._v_wrq_memoryConfig:first-child{margin-top:12px}._v_wrq_memoryConfigHeader{justify-content:space-between;align-items:center;gap:12px;min-width:0;display:flex}._v_wrq_memoryConfigHeader>div{flex-direction:column;min-width:0;display:flex}._v_wrq_memoryConfigHeader strong{text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:500;line-height:20px;overflow:hidden}._v_wrq_memoryConfigHeader small{color:var(--dsw-alias-label-tertiary);font-size:10px;line-height:16px}._v_wrq_configActive{color:var(--dsw-alias-label-secondary);cursor:pointer;flex:none;align-items:center;gap:6px;font-size:11px;display:inline-flex}._v_wrq_configActive input{accent-color:var(--dsw-alias-label-primary)}._v_wrq_providerIdentityFields{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;min-width:0;display:grid}._v_wrq_providerSettingsGrid{grid-template-columns:minmax(0,1fr);gap:12px;min-width:0;display:grid}._v_wrq_providerIdentityFields>label,._v_wrq_providerFieldControl>label:not(._v_wrq_providerBoolean){min-width:0;color:var(--dsw-alias-label-secondary);flex-direction:column;gap:4px;font-size:10px;line-height:16px;display:flex}._v_wrq_providerIdentityFields input,._v_wrq_providerIdentityFields select,._v_wrq_providerFieldControl input:not([type=checkbox]),._v_wrq_providerFieldControl select{border:1px solid var(--dsw-alias-border-l2);width:100%;min-width:0;height:36px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-3);font:inherit;border-radius:9px;outline:none;padding:0 10px;font-size:12px}._v_wrq_providerIdentityFields select,._v_wrq_taskAgentFields select,._v_wrq_providerFieldControl select{appearance:none;cursor:pointer;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12' fill='none'%3E%3Cpath d='M3 4.5L6 7.5L9 4.5' stroke='%2381858C' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\");background-position:right 12px center;background-repeat:no-repeat;background-size:12px 12px;padding-right:32px}._v_wrq_providerIdentityFields select:disabled,._v_wrq_taskAgentFields select:disabled,._v_wrq_providerFieldControl select:disabled{cursor:default}._v_wrq_providerIdentityFields input:focus-visible,._v_wrq_providerIdentityFields select:focus-visible,._v_wrq_providerFieldControl input:focus-visible,._v_wrq_providerFieldControl select:focus-visible{box-shadow:0 0 0 2px var(--dsw-alias-border-l3)}._v_wrq_providerIdentityFields input:disabled,._v_wrq_providerIdentityFields select:disabled,._v_wrq_providerFieldControl input:disabled,._v_wrq_providerFieldControl select:disabled{opacity:.5}._v_wrq_providerFieldControl{flex-direction:column;justify-content:flex-end;gap:3px;min-width:0;display:flex}._v_wrq_providerBoolean{min-height:36px;color:var(--dsw-alias-label-secondary);align-items:center;gap:7px;font-size:11px;display:flex}._v_wrq_providerBoolean input{accent-color:var(--dsw-alias-label-primary)}._v_wrq_providerSecretInput{min-width:0;position:relative}._v_wrq_providerSecretInput>input{padding-right:39px}._v_wrq_providerSecretVisibility{appearance:none;width:28px;height:28px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;border-radius:7px;place-items:center;padding:0;display:grid;position:absolute;top:4px;right:4px}._v_wrq_providerSecretVisibility:hover:not(:disabled){color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-hover)}._v_wrq_providerSecretVisibility:focus-visible{box-shadow:0 0 0 2px var(--dsw-alias-border-l3);outline:none}._v_wrq_providerSecretVisibility:disabled{cursor:default;opacity:.35}._v_wrq_providerSecretVisibility svg{width:17px;height:17px}._v_wrq_memoryConfigFooter{border-top:1px solid var(--dsw-alias-border-l2);justify-content:space-between;align-items:center;gap:10px;min-height:36px;padding-top:10px;display:flex}._v_wrq_memoryConfigFooter>div{align-items:center;gap:6px;display:flex}._v_wrq_providerServiceFooter{flex-direction:column;align-items:stretch;min-height:0}._v_wrq_providerServiceFooter>button{align-self:flex-end}._v_wrq_configFeedback{flex:1;min-width:0;font-size:10px;line-height:15px}._v_wrq_addConfigButton{appearance:none;border:1px dashed var(--dsw-alias-border-l2);min-height:36px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border-radius:10px;font-size:11px}._v_wrq_addConfigButton:hover:not(:disabled){color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-hover)}._v_wrq_addConfigButton:disabled{cursor:default;opacity:.4}._v_wrq_scopeChanging,._v_wrq_providerTarget{color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-bg-layer-2);border-radius:10px;margin:0;padding:8px 10px;font-size:10px;line-height:16px}._v_wrq_scopeChanging{color:var(--dsw-alias-state-warning-primary,var(--dsw-alias-label-secondary))}._v_wrq_providerTarget{background:0 0;margin-top:-4px;padding:0}._v_wrq_providerLoadError{justify-content:space-between;align-items:center;gap:10px;font-size:11px;display:flex}._v_wrq_choiceCard{cursor:pointer;min-width:0;display:block;position:relative}._v_wrq_choiceCard>input,._v_wrq_toggleRow>input,._v_wrq_visuallyHidden{clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}._v_wrq_choiceFace{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:12px;flex-direction:column;justify-content:center;gap:1px;min-width:0;min-height:66px;padding:10px 34px 10px 13px;transition:border-color .14s,background-color .14s;display:flex;position:relative}._v_wrq_choiceFace:hover{background:var(--dsw-alias-interactive-bg-hover)}._v_wrq_choiceFace strong{text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:500;line-height:21px;overflow:hidden}._v_wrq_choiceFace small{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:11px;line-height:17px;overflow:hidden}._v_wrq_check{font-size:14px;line-height:18px;display:none;position:absolute;top:11px;right:12px}._v_wrq_choiceCard>input:checked+._v_wrq_choiceFace{border-color:var(--dsw-alias-border-l1);background:var(--dsw-alias-interactive-bg-hover)}._v_wrq_choiceCard>input:checked+._v_wrq_choiceFace ._v_wrq_check{display:block}._v_wrq_choiceCard>input:disabled+._v_wrq_choiceFace{cursor:default;opacity:.42}._v_wrq_choiceCard:has(input:disabled){cursor:default}._v_wrq_settingRow,._v_wrq_toggleRow{border-top:1px solid var(--dsw-alias-border-l2);justify-content:space-between;align-items:center;gap:18px;min-width:0;min-height:62px;padding:11px 0;display:flex;position:relative}._v_wrq_settingCopy{flex-direction:column;flex:1;min-width:0;display:flex}._v_wrq_settingCopy strong{color:var(--dsw-alias-label-primary);font-size:14px;font-weight:500;line-height:21px}._v_wrq_settingCopy small{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:17px}._v_wrq_settingCopy code{font-family:var(--ds-font-family-code,ui-monospace, monospace)}._v_wrq_directoryControl{flex:0 420px;align-items:center;gap:8px;min-width:0;max-width:60%;display:flex}._v_wrq_directoryInput{border:1px solid var(--dsw-alias-border-l2);width:100%;min-width:0;height:38px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-3);font-family:var(--ds-font-family-code,ui-monospace, monospace);border-radius:10px;outline:none;padding:0 11px;font-size:12px;line-height:20px}._v_wrq_directoryInput::placeholder{color:var(--dsw-alias-label-caption)}._v_wrq_directoryInput:disabled{cursor:default;opacity:.46}._v_wrq_rowGroup{border-bottom:1px solid var(--dsw-alias-border-l2)}._v_wrq_enhancementsSection{container-type:inline-size}._v_wrq_toggleRow{cursor:pointer}._v_wrq_toggleRow:first-child{border-top:1px solid var(--dsw-alias-border-l2)}._v_wrq_toggleRow:has(input:disabled){cursor:default;opacity:.46}._v_wrq_switch{background:var(--dsw-alias-bg-layer-2);width:40px;height:24px;box-shadow:inset 0 0 0 1px var(--dsw-alias-border-l2);border-radius:999px;flex:none;transition:background-color .14s;display:block;position:relative}._v_wrq_switch i{background:var(--dsw-alias-bg-layer-3);width:18px;height:18px;box-shadow:0 1px 3px color-mix(in srgb, var(--dsw-alias-label-primary) 22%, transparent);border-radius:50%;transition:transform .14s;position:absolute;top:3px;left:3px}._v_wrq_toggleRow>input:checked+._v_wrq_switch{background:var(--dsw-alias-label-primary);box-shadow:none}._v_wrq_toggleRow>input:checked+._v_wrq_switch i{transform:translate(16px)}._v_wrq_pillButton,._v_wrq_primaryPill,._v_wrq_actions button{appearance:none;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);height:36px;color:var(--dsw-alias-label-primary);cursor:pointer;white-space:nowrap;background:0 0;border-radius:18px;justify-content:center;align-items:center;gap:4px;padding:0 14px;font-size:14px;line-height:22px;display:inline-flex}._v_wrq_pillButton:hover:not(:disabled),._v_wrq_actions button:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover-solid)}._v_wrq_pillButton:disabled,._v_wrq_primaryPill:disabled,._v_wrq_actions button:disabled,._v_wrq_textButton:disabled{cursor:default;opacity:.4}._v_wrq_primaryPill,._v_wrq_save{color:var(--dsw-alias-label-primary-foreground)!important;background:var(--dsw-alias-button-primary-fill)!important;border-color:#0000!important}._v_wrq_primaryPill:hover:not(:disabled),._v_wrq_save:hover:not(:disabled){background:var(--dsw-alias-button-primary-hover)!important}._v_wrq_textButton{appearance:none;box-sizing:border-box;height:28px;color:var(--dsw-alias-label-secondary);cursor:pointer;font:inherit;background:0 0;border:0;border-radius:14px;flex:none;justify-content:center;align-items:center;padding:0 10px;font-size:12px;line-height:18px;display:inline-flex}._v_wrq_textButton:hover:not(:disabled){color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-hover)}._v_wrq_activePath{width:fit-content;max-width:100%;color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;margin-top:4px;font-size:11px;line-height:17px;overflow:hidden}._v_wrq_scopeMeta{color:var(--dsw-alias-label-tertiary);margin-top:1px;font-size:10px;font-style:normal;line-height:15px}._v_wrq_rowActions{flex:none;align-items:center;gap:8px;display:flex}._v_wrq_importBar{background:var(--dsw-alias-bg-layer-2);border-radius:12px;grid-template-columns:minmax(0,1fr) auto auto;align-items:center;gap:10px;min-width:0;padding:10px 12px;display:grid}._v_wrq_importBar>div{min-width:0;display:grid}._v_wrq_importBar strong{text-overflow:ellipsis;white-space:nowrap;font-size:12px;font-weight:500;line-height:18px;overflow:hidden}._v_wrq_importBar small{color:var(--dsw-alias-label-tertiary);font-size:10px;line-height:15px}._v_wrq_importBar ._v_wrq_textButton{padding:0 10px}._v_wrq_feedback,._v_wrq_packFeedback{gap:4px;display:grid}._v_wrq_feedback:empty,._v_wrq_packFeedback:empty{display:none}._v_wrq_feedback p,._v_wrq_packFeedback p{overflow-wrap:anywhere;margin:0;font-size:12px;line-height:18px}._v_wrq_error{color:var(--dsw-alias-state-error-primary)}._v_wrq_success{color:var(--dsw-alias-state-success-primary)}._v_wrq_readOnly{color:var(--dsw-alias-label-tertiary)}._v_wrq_packSuccess{color:var(--dsw-alias-state-success-primary)}._v_wrq_actions{display:none}._v_wrq_actionsVisible{border-top:1px solid var(--dsw-alias-border-l2);justify-content:space-between;align-items:center;gap:16px;padding-top:14px;display:flex}._v_wrq_actions>span{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px}._v_wrq_actions>div{gap:8px;display:flex}._v_wrq_discard{color:var(--dsw-alias-label-primary);background:0 0;border-color:var(--dsw-alias-border-l2)!important}._v_wrq_settingsNote{color:var(--dsw-alias-label-tertiary);margin:-14px 0 0;font-size:10px;line-height:16px}._v_wrq_settingsNote code{color:var(--dsw-alias-label-secondary);font-family:var(--ds-font-family-code,ui-monospace, monospace)}._v_wrq_choiceCard>input:focus-visible+._v_wrq_choiceFace,._v_wrq_toggleRow>input:focus-visible+._v_wrq_switch,._v_wrq_directoryInput:focus-visible,._v_wrq_pillButton:focus-visible,._v_wrq_primaryPill:focus-visible,._v_wrq_textButton:focus-visible,._v_wrq_actions button:focus-visible{box-shadow:0 0 0 2px var(--dsw-alias-border-l3);outline:none}@media (width<=620px){._v_wrq_page{gap:24px}._v_wrq_choiceGrid{grid-template-columns:minmax(0,1fr)}._v_wrq_settingRow{flex-direction:column;align-items:stretch;gap:9px}._v_wrq_directoryControl{justify-content:space-between;max-width:none}._v_wrq_rowActions{width:100%}._v_wrq_rowActions button{flex:1}._v_wrq_importBar{grid-template-columns:minmax(0,1fr) auto}._v_wrq_importBar ._v_wrq_primaryPill{grid-column:1/-1}._v_wrq_actionsVisible{flex-direction:column;align-items:stretch}._v_wrq_actions>div,._v_wrq_actions button{flex:1}._v_wrq_nativeLocation{flex-direction:column;align-items:stretch;gap:9px}._v_wrq_inlineChoices{width:100%}._v_wrq_inlineChoices label{flex:1}._v_wrq_inlineChoices span{justify-content:center;width:100%}._v_wrq_providerIdentityFields{grid-template-columns:minmax(0,1fr)}._v_wrq_providerRowHeader{align-items:flex-start;gap:8px}._v_wrq_providerEnableControl{flex-direction:column-reverse;align-items:flex-end;gap:5px;max-width:116px}._v_wrq_providerState{text-overflow:ellipsis;white-space:nowrap;max-width:108px;overflow:hidden}._v_wrq_memoryConfigFooter{flex-direction:column;align-items:stretch}._v_wrq_memoryConfigFooter>div:last-child{width:100%}._v_wrq_memoryConfigFooter button{flex:1}}@container (width<=180px){._v_wrq_enhancementsSection ._v_wrq_sectionHeading p,._v_wrq_enhancementsSection ._v_wrq_settingCopy small{display:none}._v_wrq_enhancementsSection ._v_wrq_toggleRow{grid-template-columns:minmax(0,1fr);gap:6px;min-height:0;padding:10px 0;display:grid}._v_wrq_enhancementsSection ._v_wrq_settingCopy strong{overflow-wrap:anywhere}._v_wrq_enhancementsSection ._v_wrq_switch{justify-self:end}}@media (prefers-reduced-motion:reduce){._v_wrq_choiceFace,._v_wrq_switch,._v_wrq_switch i,._v_wrq_providerChevron,._v_wrq_providerToggle>span,._v_wrq_providerToggle>span>i{transition:none}._v_wrq_miniSpinner{animation:none}}._v_wrq_storageChoiceGrid>:last-child{grid-column:1/-1}._v_wrq_workspaceStorageLocation{margin-top:16px}._v_wrq_workspaceStorageLocation>p{color:var(--dsw-alias-label-caption);margin:10px 0 0;font-size:12px;line-height:1.5}";
254
263
  const tagId$11 = "dsh-mnemon/src/client/MnemonSettingsCard.module.css";
255
264
  if (typeof document !== "undefined") {
256
265
  let tag = document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$11) + "]");
@@ -756,7 +765,7 @@ window.__ModuleLoader__.load({
756
765
  "strategy.saving": "保存中…",
757
766
  "overview.providerOpenVikingHint": "连接已有 OpenViking 服务,由记忆空间工作流统一调度",
758
767
  "overview.providerSummary.mnemon-native": "官方原生、本地优先,保留完整图谱与软删除能力",
759
- "overview.providerSummary.openviking": "文件系统形态的共享记忆,支持分层读取与自动语义提炼",
768
+ "overview.providerSummary.openviking": "文件系统形态的共享记忆,支持经验证的精确写入与语义召回",
760
769
  "overview.providerSummary.honcho": "跨会话用户建模、Peer 档案、辩证推理与持久结论",
761
770
  "overview.providerSummary.mem0": "自动事实提取、语义召回、重排与去重",
762
771
  "overview.providerSummary.hindsight": "知识图谱记忆,具备实体解析、多策略召回与反思",
@@ -1113,7 +1122,7 @@ window.__ModuleLoader__.load({
1113
1122
  "strategy.saving": "Saving…",
1114
1123
  "overview.providerOpenVikingHint": "Connect an existing OpenViking service under the same Memory Space workflow",
1115
1124
  "overview.providerSummary.mnemon-native": "Official native, local-first storage with the full graph and soft-delete semantics",
1116
- "overview.providerSummary.openviking": "Filesystem-shaped shared memory with tiered reads and automatic semantic extraction",
1125
+ "overview.providerSummary.openviking": "Filesystem-shaped shared memory with verified exact writes and semantic retrieval",
1117
1126
  "overview.providerSummary.honcho": "Cross-session user modelling, peer profiles, dialectic reasoning, and persistent conclusions",
1118
1127
  "overview.providerSummary.mem0": "Automatic fact extraction, semantic retrieval, reranking, and deduplication",
1119
1128
  "overview.providerSummary.hindsight": "Knowledge-graph memory with entity resolution, multi-strategy recall, and reflection",
@@ -1461,8 +1470,24 @@ window.__ModuleLoader__.load({
1461
1470
  "status.description": "聚焦 dsh-mnemon、各记忆 Provider、三层存储和当前读写目录;连接配置由 DSH 部署统一管理。",
1462
1471
  "status.nominal": "系统正常",
1463
1472
  "status.reviewFailed": "后台审查失败",
1464
- "status.reviewFailedDetail": "本轮记忆检查未完成;候选内容会保留到后续符合条件的审查。",
1465
- "status.reviewContextWindow": "请在 Mnemon 设置中选择上下文窗口足以覆盖父会话的任务模型。后台审查需要继承父会话。",
1473
+ "status.reviewFailedDetail": "本轮记忆检查未完成,不会自动重放。后续审查受冷却时间和会话次数限制。",
1474
+ "status.reviewPartial": "已有写入提交;请按下列回执核对,未回滚。",
1475
+ "status.reviewTeamPaused": "Agent Teams 工具在役时暂停空闲审查:已发布的子代理策略与 fork 和 spawn 均不兼容。不更改召回与主动写入设置。",
1476
+ "status.reviewRun": "审查运行:{id}",
1477
+ "status.reviewContextWindow": "请切换为有界检查点(spawn),或选择上下文窗口足以覆盖父会话的任务模型。",
1478
+ "config.reviewTitle": "空闲审查",
1479
+ "config.reviewDescription": "只控制后台检查点审查。失败的运行不会自动重放;召回和主动记忆写入保持可用。",
1480
+ "config.reviewEnabled": "启用空闲审查",
1481
+ "config.reviewProvider": "审查方式",
1482
+ "config.reviewSpawn": "有界检查点(spawn)",
1483
+ "config.reviewFork": "完整父上下文(fork)",
1484
+ "config.reviewFallback": "fork 不可用时(仅启动前)",
1485
+ "config.reviewSkip": "跳过本次审查",
1486
+ "config.review.minIntervalMs": "最小审查间隔(毫秒)",
1487
+ "config.review.maxPerSession": "每会话最多尝试次数",
1488
+ "config.review.maxContextChars": "spawn 检查点字符预算",
1489
+ "config.review.maxTokens": "每次模型输出 token 上限",
1490
+ "config.reviewInvalid": "请检查审查预算:间隔 5000–86400000 毫秒,次数 0–200,字符 1000–1000000,输出 token 128–131072。",
1466
1491
  "status.checkRequired": "需要检查",
1467
1492
  "status.rechecking": "检查中…",
1468
1493
  "status.recheck": "重新检查",
@@ -1986,8 +2011,24 @@ window.__ModuleLoader__.load({
1986
2011
  "status.description": "dsh-mnemon, memory providers, three-tier storage, and the current read/write root. DSH deployment owns connection configuration.",
1987
2012
  "status.nominal": "System nominal",
1988
2013
  "status.reviewFailed": "Background review failed",
1989
- "status.reviewFailedDetail": "This memory checkpoint did not complete. Candidates remain pending for a later eligible review.",
1990
- "status.reviewContextWindow": "Choose a task model in Mnemon settings whose context window covers the parent conversation. Background review inherits the parent conversation.",
2014
+ "status.reviewFailedDetail": "This checkpoint did not complete and will not be replayed automatically. Later reviews respect the cooldown and session limit.",
2015
+ "status.reviewPartial": "Some writes committed. Reconcile the receipts below; they were not rolled back.",
2016
+ "status.reviewTeamPaused": "Idle review is paused while Agent Teams tools are active: the published child policy is incompatible with both fork and spawn. Recall and writeback settings are unchanged.",
2017
+ "status.reviewRun": "Review run: {id}",
2018
+ "status.reviewContextWindow": "Choose bounded checkpoint review (spawn), or a task model with a context window large enough for the parent conversation.",
2019
+ "config.reviewTitle": "Idle review",
2020
+ "config.reviewDescription": "Controls background checkpoint review. Failed runs are never replayed automatically; recall and intentional memory writes remain available.",
2021
+ "config.reviewEnabled": "Enable idle review",
2022
+ "config.reviewProvider": "Review method",
2023
+ "config.reviewSpawn": "Bounded checkpoint (spawn)",
2024
+ "config.reviewFork": "Full parent context (fork)",
2025
+ "config.reviewFallback": "When fork is unavailable (before startup only)",
2026
+ "config.reviewSkip": "Skip this review",
2027
+ "config.review.minIntervalMs": "Minimum review interval (milliseconds)",
2028
+ "config.review.maxPerSession": "Maximum attempts per session",
2029
+ "config.review.maxContextChars": "Spawn checkpoint character budget",
2030
+ "config.review.maxTokens": "Model output token limit per request",
2031
+ "config.reviewInvalid": "Check review budgets: interval 5000–86400000 ms, attempts 0–200, characters 1000–1000000, output tokens 128–131072.",
1991
2032
  "status.checkRequired": "Check required",
1992
2033
  "status.rechecking": "Checking…",
1993
2034
  "status.recheck": "Check again",
@@ -3368,6 +3409,10 @@ window.__ModuleLoader__.load({
3368
3409
  const resolved = value ?? {};
3369
3410
  const dataDir = resolved.dataDir?.trim() || legacyPackDirectory(resolved);
3370
3411
  return {
3412
+ idleReview: {
3413
+ ...DEFAULT_IDLE_REVIEW,
3414
+ ...resolved.idleReview
3415
+ },
3371
3416
  displayMode: normalizeDisplayMode(resolved.displayMode),
3372
3417
  storageScope: resolved.storageScope ?? (dataDir === "" ? "global" : "custom"),
3373
3418
  runtimeUserScope: resolved.runtimeUserScope === "global" ? "global" : "storage",
@@ -3425,6 +3470,31 @@ window.__ModuleLoader__.load({
3425
3470
  };
3426
3471
  }
3427
3472
  function validation(t, draft) {
3473
+ for (const [field, min, max] of [
3474
+ [
3475
+ "minIntervalMs",
3476
+ 5e3,
3477
+ 864e5
3478
+ ],
3479
+ [
3480
+ "maxPerSession",
3481
+ 0,
3482
+ 200
3483
+ ],
3484
+ [
3485
+ "maxContextChars",
3486
+ 1e3,
3487
+ 1e6
3488
+ ],
3489
+ [
3490
+ "maxTokens",
3491
+ 128,
3492
+ 131072
3493
+ ]
3494
+ ]) {
3495
+ const value = draft.idleReview[field];
3496
+ if (!Number.isInteger(value) || value < min || value > max) return t("config.reviewInvalid");
3497
+ }
3428
3498
  if (![
3429
3499
  "global",
3430
3500
  "workspace",
@@ -3657,6 +3727,7 @@ window.__ModuleLoader__.load({
3657
3727
  try {
3658
3728
  const coreOps = operations(CORE_FIELDS, dirty, draft);
3659
3729
  const regularCoreChanged = coreOps.length > 0;
3730
+ coreOps.push(...operations(["idleReview"], dirty, draft));
3660
3731
  const embeddingChanged = EMBEDDING_FIELDS.some((field) => dirty.has(field));
3661
3732
  const taskAgentChanged = TASK_AGENT_FIELDS.some((field) => dirty.has(field));
3662
3733
  const topologyChanged = [...dirty].some((field) => field.startsWith("memoryTopology."));
@@ -3905,6 +3976,80 @@ window.__ModuleLoader__.load({
3905
3976
  onEnabled: editLayerEnabled,
3906
3977
  t
3907
3978
  }),
3979
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
3980
+ className: MnemonSettingsCard_module_css_default.section,
3981
+ "aria-labelledby": "mnemon-review-heading",
3982
+ children: [
3983
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
3984
+ className: MnemonSettingsCard_module_css_default.sectionHeading,
3985
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h2", {
3986
+ id: "mnemon-review-heading",
3987
+ children: t("config.reviewTitle")
3988
+ }) })
3989
+ }),
3990
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ToggleRow, {
3991
+ id: "mnemon-idle-review",
3992
+ label: t("config.reviewEnabled"),
3993
+ hint: t("config.reviewDescription"),
3994
+ checked: draft.idleReview.enabled,
3995
+ disabled: coreDisabled,
3996
+ onChange: (enabled) => editMany({ idleReview: {
3997
+ ...draft.idleReview,
3998
+ enabled
3999
+ } })
4000
+ }),
4001
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4002
+ className: MnemonSettingsCard_module_css_default.taskAgentFields,
4003
+ children: [
4004
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: t("config.reviewProvider") }) }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
4005
+ value: draft.idleReview.provider,
4006
+ disabled: coreDisabled,
4007
+ onChange: (event) => editMany({ idleReview: {
4008
+ ...draft.idleReview,
4009
+ provider: event.target.value
4010
+ } }),
4011
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
4012
+ value: "spawn",
4013
+ children: t("config.reviewSpawn")
4014
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
4015
+ value: "fork",
4016
+ children: t("config.reviewFork")
4017
+ })]
4018
+ })] }),
4019
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: t("config.reviewFallback") }) }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
4020
+ value: draft.idleReview.fallback,
4021
+ disabled: coreDisabled,
4022
+ onChange: (event) => editMany({ idleReview: {
4023
+ ...draft.idleReview,
4024
+ fallback: event.target.value
4025
+ } }),
4026
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
4027
+ value: "spawn",
4028
+ children: t("config.reviewSpawn")
4029
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
4030
+ value: "skip",
4031
+ children: t("config.reviewSkip")
4032
+ })]
4033
+ })] }),
4034
+ [
4035
+ "minIntervalMs",
4036
+ "maxPerSession",
4037
+ "maxContextChars",
4038
+ "maxTokens"
4039
+ ].map((field) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: t(`config.review.${field}`) }) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
4040
+ type: "number",
4041
+ step: "1",
4042
+ value: draft.idleReview[field],
4043
+ disabled: coreDisabled,
4044
+ onChange: (event) => editMany({ idleReview: {
4045
+ ...draft.idleReview,
4046
+ [field]: Number(event.target.value)
4047
+ } })
4048
+ })] }, field))
4049
+ ]
4050
+ })
4051
+ ]
4052
+ }),
3908
4053
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(MemoryEnhancementsSection, {
3909
4054
  ...connection === void 0 ? {} : { connection },
3910
4055
  ...sessionId === void 0 ? {} : { sessionId },
@@ -7442,6 +7587,11 @@ window.__ModuleLoader__.load({
7442
7587
  role: "alert",
7443
7588
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: t("header.notReady") }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: statusError ?? status?.error })]
7444
7589
  }),
7590
+ status?.lifecycle?.current?.idleReviewBlocked === "agent-team" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
7591
+ className: MnemonView_module_css_default.alert,
7592
+ role: "status",
7593
+ children: t("status.reviewTeamPaused")
7594
+ }),
7445
7595
  status?.lifecycle?.current?.lastError !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7446
7596
  className: MnemonView_module_css_default.alert,
7447
7597
  role: "alert",
@@ -7450,6 +7600,17 @@ window.__ModuleLoader__.load({
7450
7600
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: t("status.reviewFailed") }),
7451
7601
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: status.lifecycle.current.lastError }),
7452
7602
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("status.reviewFailedDetail") }),
7603
+ status.lifecycle.current.lastReviewFailure?.status === "partial" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
7604
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: t("status.reviewPartial") }),
7605
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("status.reviewRun", { id: status.lifecycle.current.lastReviewFailure.runId ?? "" }) }),
7606
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ul", { children: status.lifecycle.current.lastReviewFailure.receipts.map((receipt, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: [
7607
+ receipt.tool,
7608
+ receipt.action,
7609
+ receipt.documentId,
7610
+ receipt.target,
7611
+ receipt.revision
7612
+ ].filter(Boolean).join(" · ") }, index)) })
7613
+ ] }),
7453
7614
  /CONTEXT_WINDOW_EXCEEDED|exceed(?:s|ed)? (?:the )?(?:available )?context (?:size|window)/iu.test(status.lifecycle.current.lastError) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("status.reviewContextWindow") })
7454
7615
  ]
7455
7616
  }),
package/lib/index.js CHANGED
@@ -20,6 +20,11 @@ import { spawn } from "node:child_process";
20
20
  import { StringDecoder } from "node:string_decoder";
21
21
  import { z as z$1 } from "zod";
22
22
  import { Remote, TypertRemoteService } from "@deepseek-ai/dsh-typert-protocol";
23
+ //#region src/host/view-protocol.ts
24
+ const MNEMON_VIEW_CHANNEL = "/dsh-mnemon-view";
25
+ const MNEMON_VIEW_WRITE_CHANNEL = "/dsh-mnemon-view-settings";
26
+ const MNEMON_VIEW_SETTINGS_NAMESPACE = "mnemon-view";
27
+ //#endregion
23
28
  //#region src/host/display-mode.ts
24
29
  /** Keep the historical misspelling at input boundaries, never in UI or runtime state. */
25
30
  function normalizeDisplayMode(value) {
@@ -28,11 +33,6 @@ function normalizeDisplayMode(value) {
28
33
  throw new Error("dsh-mnemon: displayMode must be sidebar or builtin (legacy buildin is accepted)");
29
34
  }
30
35
  //#endregion
31
- //#region src/host/view-protocol.ts
32
- const MNEMON_VIEW_CHANNEL = "/dsh-mnemon-view";
33
- const MNEMON_VIEW_WRITE_CHANNEL = "/dsh-mnemon-view-settings";
34
- const MNEMON_VIEW_SETTINGS_NAMESPACE = "mnemon-view";
35
- //#endregion
36
36
  //#region src/host/protocol.ts
37
37
  /** Starter Entry ids remain reserved when DSH nests them under an include. */
38
38
  function isDefaultSourceInstance(instanceKey, sourceTypeId) {
@@ -48,6 +48,15 @@ const MNEMON_SETTINGS_NAMESPACE = "mnemon";
48
48
  function isWorkspaceStorageScope(scope) {
49
49
  return scope === "workspace" || scope === "workspaces";
50
50
  }
51
+ const DEFAULT_IDLE_REVIEW = {
52
+ enabled: true,
53
+ provider: "spawn",
54
+ fallback: "spawn",
55
+ minIntervalMs: 3e5,
56
+ maxPerSession: 20,
57
+ maxContextChars: 24e3,
58
+ maxTokens: 4096
59
+ };
51
60
  const CATEGORIES = [
52
61
  "preference",
53
62
  "decision",
@@ -151,6 +160,15 @@ const RuntimeMemorySchema = z.object({
151
160
  userLimitBytes: z.number().step(1).min(1).max(MAX_RUNTIME_MEMORY_LIMIT_BYTES).default(DEFAULT_RUNTIME_USER_LIMIT_BYTES),
152
161
  maintenanceMaxTokens: z.number().step(1).min(1).max(MAX_RUNTIME_MAINTENANCE_MAX_TOKENS).default(DEFAULT_RUNTIME_MAINTENANCE_MAX_TOKENS)
153
162
  });
163
+ const IdleReviewSchema = z.object({
164
+ enabled: z.boolean().default(DEFAULT_IDLE_REVIEW.enabled),
165
+ provider: z.union(["spawn", "fork"]).default(DEFAULT_IDLE_REVIEW.provider),
166
+ fallback: z.union(["spawn", "skip"]).default(DEFAULT_IDLE_REVIEW.fallback),
167
+ minIntervalMs: z.number().step(1).min(5e3).max(864e5).default(DEFAULT_IDLE_REVIEW.minIntervalMs),
168
+ maxPerSession: z.number().step(1).min(0).max(200).default(DEFAULT_IDLE_REVIEW.maxPerSession),
169
+ maxContextChars: z.number().step(1).min(1e3).max(1e6).default(DEFAULT_IDLE_REVIEW.maxContextChars),
170
+ maxTokens: z.number().step(1).min(128).max(131072).default(DEFAULT_IDLE_REVIEW.maxTokens)
171
+ });
154
172
  const MemoryParticipationModeSchema = z.union([
155
173
  "off",
156
174
  "manual",
@@ -224,6 +242,7 @@ const Config = z.object({
224
242
  recallMode: z.union(["guided", "off"]).default("guided"),
225
243
  writebackMode: z.union(["guided", "off"]).default("guided"),
226
244
  idleReviewMs: z.number().step(1).min(5e3).max(6e5).default(DEFAULT_IDLE_REVIEW_MS),
245
+ idleReview: IdleReviewSchema.default(DEFAULT_IDLE_REVIEW),
227
246
  conversationInteraction: z.object({
228
247
  toolviews: z.boolean().default(false),
229
248
  turnBar: z.boolean().default(true),
@@ -394,6 +413,7 @@ function resolveConfig(config = {}) {
394
413
  recallMode: config.recallMode ?? "guided",
395
414
  writebackMode: config.writebackMode ?? "guided",
396
415
  idleReviewMs: config.idleReviewMs ?? 3e4,
416
+ idleReview: IdleReviewSchema(config.idleReview ?? {}),
397
417
  conversationInteraction: {
398
418
  toolviews: config.conversationInteraction?.toolviews ?? false,
399
419
  turnBar: config.conversationInteraction?.turnBar ?? true,
@@ -424,7 +444,7 @@ const COMPONENT_ORDER = [
424
444
  ];
425
445
  const BODY_ID = /^[a-zA-Z0-9][a-zA-Z0-9_-]*$/;
426
446
  const SQLITE_HEADER = Buffer.from("SQLite format 3\0", "binary");
427
- function record$2(value) {
447
+ function record$3(value) {
428
448
  return typeof value === "object" && value !== null && !Array.isArray(value) ? value : void 0;
429
449
  }
430
450
  function utf8(bytes, label) {
@@ -467,7 +487,7 @@ function componentsForScope(scope) {
467
487
  return [scope];
468
488
  }
469
489
  function parseManifest(value) {
470
- const manifest = record$2(value);
490
+ const manifest = record$3(value);
471
491
  if (manifest?.format !== "mnemonpack" || manifest.version !== 1) throw new Error("unsupported Mnemon Pack format or version");
472
492
  if (manifest.scope !== "full" && !COMPONENT_ORDER.includes(manifest.scope)) throw new Error("Mnemon Pack scope is invalid");
473
493
  if (typeof manifest.exportedAt !== "string") throw new Error("Mnemon Pack exportedAt is invalid");
@@ -476,11 +496,11 @@ function parseManifest(value) {
476
496
  if (components.length === 0 || new Set(components).size !== components.length || components.some((component) => !COMPONENT_ORDER.includes(component))) throw new Error("Mnemon Pack components are invalid");
477
497
  const expected = componentsForScope(manifest.scope);
478
498
  if (components.length !== expected.length || expected.some((component) => !components.includes(component))) throw new Error("Mnemon Pack scope does not match its components");
479
- const source = record$2(manifest.source);
499
+ const source = record$3(manifest.source);
480
500
  if (source?.plugin !== "dsh-mnemon" || typeof source.pluginVersion !== "string") throw new Error("Mnemon Pack source is invalid");
481
501
  if (!Array.isArray(manifest.summary)) throw new Error("Mnemon Pack summary is invalid");
482
502
  const summary = manifest.summary.map((entry) => {
483
- const item = record$2(entry);
503
+ const item = record$3(entry);
484
504
  const component = item?.component;
485
505
  if (!COMPONENT_ORDER.includes(component) || !Number.isSafeInteger(item?.files) || !Number.isSafeInteger(item?.bytes) || !Number.isSafeInteger(item?.items) || Number(item?.files) < 0 || Number(item?.bytes) < 0 || Number(item?.items) < 0) throw new Error("Mnemon Pack summary entry is invalid");
486
506
  return {
@@ -530,8 +550,8 @@ function parseArchive(base64, runtimeLimits = RUNTIME_MEMORY_LIMITS) {
530
550
  if (path !== "manifest.json" && path !== "checksums.json" && !allowedPayloadPath(path)) throw new Error(`unsupported Mnemon Pack entry: ${path}`);
531
551
  }
532
552
  const manifest = parseManifest(json$1(files["manifest.json"], "manifest.json"));
533
- const checksumValue = record$2(json$1(files["checksums.json"], "checksums.json"));
534
- const checksumFiles = record$2(checksumValue?.files);
553
+ const checksumValue = record$3(json$1(files["checksums.json"], "checksums.json"));
554
+ const checksumFiles = record$3(checksumValue?.files);
535
555
  if (checksumValue?.algorithm !== "sha256" || checksumFiles === void 0) throw new Error("Mnemon Pack checksums are invalid");
536
556
  const payloadNames = names.filter((path) => path.startsWith("payload/")).sort();
537
557
  if (Object.keys(checksumFiles).length !== payloadNames.length) throw new Error("Mnemon Pack checksum inventory does not match the payload");
@@ -554,10 +574,10 @@ function parseArchive(base64, runtimeLimits = RUNTIME_MEMORY_LIMITS) {
554
574
  };
555
575
  }
556
576
  function parseRuntime(value, limits = RUNTIME_MEMORY_LIMITS) {
557
- const source = record$2(value);
577
+ const source = record$3(value);
558
578
  if (source?.version !== RUNTIME_MEMORY_VERSION || !Array.isArray(source.entries)) throw new Error("runtime memories.json is invalid");
559
579
  const entries = source.entries.map((raw) => {
560
- const entry = record$2(raw);
580
+ const entry = record$3(raw);
561
581
  if (typeof entry?.content !== "string" || entry.target !== "memory" && entry.target !== "user" || ![
562
582
  "critical",
563
583
  "normal",
@@ -588,13 +608,13 @@ function runtimeProjection(entries, target) {
588
608
  return content === "" ? "" : `${content}\n`;
589
609
  }
590
610
  function parseDocumentIndex(value) {
591
- const index = record$2(value);
611
+ const index = record$3(value);
592
612
  if (index?.version !== DOCUMENTS_VERSION || !Array.isArray(index.documents)) throw new Error("Documents index.json is invalid");
593
613
  const ids = /* @__PURE__ */ new Set();
594
614
  return {
595
615
  version: 1,
596
616
  documents: index.documents.map((raw) => {
597
- const item = record$2(raw);
617
+ const item = record$3(raw);
598
618
  if (typeof item?.id !== "string" || item.id.trim() === "" || ids.has(item.id)) throw new Error("Documents index contains an invalid or duplicate id");
599
619
  if (typeof item.title !== "string" || typeof item.description !== "string" || item.status !== "active" && item.status !== "archived") throw new Error("Documents index contains an invalid record");
600
620
  if (typeof item.filename !== "string" || basename(item.filename) !== item.filename || !/^[a-zA-Z0-9._-]+\.md$/u.test(item.filename)) throw new Error("Documents index contains an unsafe filename");
@@ -624,13 +644,13 @@ function parseDocumentIndex(value) {
624
644
  };
625
645
  }
626
646
  function parseRegistry(value) {
627
- const registry = record$2(value);
647
+ const registry = record$3(value);
628
648
  if (registry?.version !== 1 || !Array.isArray(registry.bodies)) throw new Error("Memory Space registry is invalid");
629
649
  const ids = /* @__PURE__ */ new Set();
630
650
  return {
631
651
  version: 1,
632
652
  bodies: registry.bodies.map((raw) => {
633
- const body = record$2(raw);
653
+ const body = record$3(raw);
634
654
  if (typeof body?.id !== "string" || !BODY_ID.test(body.id) || ids.has(body.id)) throw new Error("Memory Space registry contains an invalid or duplicate id");
635
655
  if (typeof body.name !== "string" || body.name.trim() === "" || body.name.length > 100 || typeof body.description !== "string" || body.description.length > 1e3) throw new Error("Memory Space registry contains invalid metadata");
636
656
  if (typeof body.createdAt !== "string" || typeof body.updatedAt !== "string") throw new Error("Memory Space registry contains invalid timestamps");
@@ -1263,7 +1283,7 @@ function safeBytes(path) {
1263
1283
  function readJson(path) {
1264
1284
  return JSON.parse(readFileSync(path, "utf8"));
1265
1285
  }
1266
- function record$1(value) {
1286
+ function record$2(value) {
1267
1287
  return typeof value === "object" && value !== null && !Array.isArray(value) ? value : void 0;
1268
1288
  }
1269
1289
  function missing(kind, path) {
@@ -1281,9 +1301,9 @@ function runtimeArea(root) {
1281
1301
  const source = join(path, "memories.json");
1282
1302
  if (!existsSync(source)) return missing("runtime", path);
1283
1303
  try {
1284
- const file = record$1(readJson(source));
1304
+ const file = record$2(readJson(source));
1285
1305
  if (file === void 0 || !Array.isArray(file.entries)) throw new Error("memories.json is not a valid runtime-memory source");
1286
- const entries = file.entries.map(record$1).filter((entry) => entry !== void 0);
1306
+ const entries = file.entries.map(record$2).filter((entry) => entry !== void 0);
1287
1307
  const userEntries = entries.filter((entry) => entry.target === "user").length;
1288
1308
  const memoryEntries = entries.filter((entry) => entry.target === "memory").length;
1289
1309
  const projectionsHealthy = existsSync(join(path, "USER.md")) && existsSync(join(path, "MEMORY.md"));
@@ -1318,8 +1338,8 @@ function memorySpacesArea(root) {
1318
1338
  if (!existsSync(path)) return missing("memory-bodies", path);
1319
1339
  try {
1320
1340
  const registryPath = join(path, ".dsh-memory-bodies.json");
1321
- const registry = existsSync(registryPath) ? record$1(readJson(registryPath)) : void 0;
1322
- const bodies = Array.isArray(registry?.bodies) ? registry.bodies.map(record$1).filter((body) => body !== void 0) : [];
1341
+ const registry = existsSync(registryPath) ? record$2(readJson(registryPath)) : void 0;
1342
+ const bodies = Array.isArray(registry?.bodies) ? registry.bodies.map(record$2).filter((body) => body !== void 0) : [];
1323
1343
  const databaseCount = readdirSync(path, { withFileTypes: true }).filter((entry) => entry.isDirectory() && existsSync(join(path, entry.name, "mnemon.db"))).length;
1324
1344
  const activeCount = bodies.filter((body) => body.active === true).length;
1325
1345
  const invalidRegistry = existsSync(registryPath) && (registry?.version !== 1 || !Array.isArray(registry.bodies));
@@ -1354,9 +1374,9 @@ function documentsArea(root) {
1354
1374
  const indexPath = join(path, "index.json");
1355
1375
  if (!existsSync(indexPath)) return missing("documents", path);
1356
1376
  try {
1357
- const index = record$1(readJson(indexPath));
1377
+ const index = record$2(readJson(indexPath));
1358
1378
  if (index === void 0 || !Array.isArray(index.documents)) throw new Error("index.json is not a valid Documents index");
1359
- const documents = index.documents.map(record$1).filter((document) => document !== void 0);
1379
+ const documents = index.documents.map(record$2).filter((document) => document !== void 0);
1360
1380
  const active = documents.filter((document) => document.status === "active").length;
1361
1381
  const archived = documents.filter((document) => document.status === "archived").length;
1362
1382
  return {
@@ -1392,9 +1412,9 @@ function stateArea(root) {
1392
1412
  let providerConnections = 0;
1393
1413
  let providerServices = 0;
1394
1414
  if (existsSync(providerRegistry)) try {
1395
- const registry = record$1(readJson(providerRegistry));
1415
+ const registry = record$2(readJson(providerRegistry));
1396
1416
  providerConnections = Array.isArray(registry?.bodies) ? registry.bodies.length : 0;
1397
- providerServices = record$1(registry?.services) === void 0 ? 0 : Object.keys(record$1(registry?.services)).length;
1417
+ providerServices = record$2(registry?.services) === void 0 ? 0 : Object.keys(record$2(registry?.services)).length;
1398
1418
  } catch {}
1399
1419
  return {
1400
1420
  kind: "state",
@@ -2615,12 +2635,21 @@ function hostSessionEventAt(session, seq) {
2615
2635
  //#region src/host/review-tools.ts
2616
2636
  const startingReview = new AsyncLocalStorage();
2617
2637
  /**
2638
+ * The published Agent Teams alpha.2 tool suite installs its policy before a
2639
+ * provider publishes a child descriptor. Both rc.2 in-process providers then
2640
+ * lose membership on step two. Inspect public services/capabilities only and
2641
+ * skip before creating a child; do not remove another plugin's policy.
2642
+ */
2643
+ function idleReviewBlockReason(parent) {
2644
+ return parent.ctx?.get?.("agentTeams") !== void 0 && parent.ctx.tools?.get?.("spawn_teammate", parent) !== void 0 ? "agent-team" : void 0;
2645
+ }
2646
+ /**
2618
2647
  * DSH restrict() filters inherited capabilities, leaving own-scope plugin tools
2619
2648
  * visible. Attach its monotonic execution guard during publication, before a
2620
2649
  * review child can run. Async context attributes concurrent provider starts;
2621
2650
  * public registry ownership verifies the exact causal parent.
2622
2651
  */
2623
- async function startGuardedReview(host, parent, toolNames, start) {
2652
+ async function startGuardedReview(host, parent, toolNames, start, published) {
2624
2653
  const agents = host.agents;
2625
2654
  if (typeof agents?.isOwnedBy !== "function") throw new Error("Mnemon review requires DSH Agent ownership and scoped tool guard support");
2626
2655
  const pending = Symbol("Mnemon review publication");
@@ -2639,6 +2668,7 @@ async function startGuardedReview(host, parent, toolNames, start) {
2639
2668
  });
2640
2669
  if (typeof dispose !== "function") throw new Error("Mnemon review tool guard did not return a disposer");
2641
2670
  guards.set(agent, dispose);
2671
+ published?.(agent);
2642
2672
  } catch (error) {
2643
2673
  attachmentError = error;
2644
2674
  throw error;
@@ -2692,6 +2722,51 @@ async function startGuardedReview(host, parent, toolNames, start) {
2692
2722
  }
2693
2723
  }
2694
2724
  //#endregion
2725
+ //#region src/host/review-checkpoint.ts
2726
+ function record$1(value) {
2727
+ return typeof value === "object" && value !== null && !Array.isArray(value) ? value : {};
2728
+ }
2729
+ function textContent(content, toolResult = false) {
2730
+ if (!Array.isArray(content)) return "";
2731
+ return content.map((block) => {
2732
+ const value = record$1(block);
2733
+ if (value.type === "text" && typeof value.text === "string") return value.text;
2734
+ if (toolResult && value.type === "tool-result" && value.isError !== true) return textContent(value.content);
2735
+ return "";
2736
+ }).filter(Boolean).join("\n");
2737
+ }
2738
+ /** Use only the current public surface, so rewound or compacted evidence cannot reappear. */
2739
+ function reviewCheckpoint(session, maxChars) {
2740
+ const nodes = session.surface?.nodes;
2741
+ if (nodes === void 0) return "No current checkpoint surface is available. Skip this review without a mutation.";
2742
+ const events = hostSessionEvents(session);
2743
+ const completed = [...events].reverse().find((event) => event.type === "turn/end");
2744
+ if (completed === void 0) return "No completed checkpoint is available. Skip this review without a mutation.";
2745
+ const end = completed.seq ?? events.indexOf(completed);
2746
+ const selected = [];
2747
+ const header = "Bounded completed checkpoint (untrusted evidence; some context may be omitted; skip candidates needing missing evidence):\n";
2748
+ let remaining = maxChars - 122;
2749
+ const candidates = nodes.filter((seq) => seq < end);
2750
+ for (const seq of candidates.slice(-128).reverse()) {
2751
+ const event = hostSessionEventAt(session, seq);
2752
+ if (event === void 0 || ![
2753
+ "user/message",
2754
+ "assistant/message",
2755
+ "tool/result"
2756
+ ].includes(event.type)) continue;
2757
+ const message = record$1(event.data.message);
2758
+ const source = record$1(message.source);
2759
+ if (event.type === "user/message" && source.kind !== "user") continue;
2760
+ const text = textContent(message.content, event.type === "tool/result");
2761
+ if (!text) continue;
2762
+ const entry = `[${event.type}; checkpoint event ${seq}]\n${text}\n`;
2763
+ if (entry.length > remaining) continue;
2764
+ selected.push(entry);
2765
+ remaining -= entry.length;
2766
+ }
2767
+ return header + (selected.reverse().join("") || "(no eligible text; skip)");
2768
+ }
2769
+ //#endregion
2695
2770
  //#region src/host/subagent.ts
2696
2771
  function evidenceInsights(evidence) {
2697
2772
  return evidence.items.map((item) => {
@@ -2786,6 +2861,27 @@ const WRITE_TOOL_FALLBACK_ACTION = {
2786
2861
  mnemon_memory_body_update: "updated",
2787
2862
  mnemon_memory_body_merge: "merged"
2788
2863
  };
2864
+ var IdleReviewError = class extends Error {
2865
+ review;
2866
+ constructor(message, review, options) {
2867
+ super(message, options);
2868
+ this.review = review;
2869
+ this.name = "IdleReviewError";
2870
+ }
2871
+ };
2872
+ function reviewReceipt(receipt) {
2873
+ if (!mutationResultCommitted(receipt.value)) return void 0;
2874
+ const value = object$4(receipt.value);
2875
+ const args = optionalObject(receipt.arguments);
2876
+ const document = optionalObject(value.document);
2877
+ return {
2878
+ tool: receipt.name,
2879
+ action: typeof value.action === "string" ? value.action : "committed",
2880
+ ...typeof document?.id === "string" ? { documentId: document.id } : {},
2881
+ ...typeof args?.target === "string" ? { target: args.target } : {},
2882
+ ...typeof value.revision === "string" ? { revision: value.revision } : {}
2883
+ };
2884
+ }
2789
2885
  const WRITE_SCHEMA = {
2790
2886
  type: "object",
2791
2887
  properties: {
@@ -3785,7 +3881,28 @@ ${naturalRequest(request)}`;
3785
3881
  };
3786
3882
  }
3787
3883
  async review(parent, signal) {
3788
- const { provider, runId, result } = await this.delegate(parent, "review", "Mnemon idle checkpoint review", "Review the inherited completed checkpoint now.", REVIEW_TOOLS, WRITE_SCHEMA, signal, "fork", REVIEW_PERSONA);
3884
+ if (idleReviewBlockReason(parent) !== void 0) return {
3885
+ delegated: false,
3886
+ action: "skipped",
3887
+ summary: "Idle review is paused while Agent Teams tools are active because the published child policy is incompatible.",
3888
+ documentIds: []
3889
+ };
3890
+ const config = this.runtimeSource.config.idleReview;
3891
+ let preferred = config.provider;
3892
+ if (preferred === "fork") try {
3893
+ this.provider("fork");
3894
+ } catch (error) {
3895
+ if (config.fallback === "skip") return {
3896
+ delegated: false,
3897
+ action: "skipped",
3898
+ summary: "Fork provider unavailable; idle review skipped.",
3899
+ documentIds: []
3900
+ };
3901
+ preferred = "spawn";
3902
+ }
3903
+ const prompt = preferred === "fork" ? "Review the inherited completed checkpoint now." : reviewCheckpoint(parent.session, config.maxContextChars);
3904
+ const persona = preferred === "fork" ? REVIEW_PERSONA : REVIEW_PERSONA.replaceAll("inherited", "supplied bounded");
3905
+ const { provider, runId, result } = await this.delegate(parent, "review", "Mnemon idle checkpoint review", prompt, REVIEW_TOOLS, WRITE_SCHEMA, signal, preferred, persona, { terminalTools: ["mnemon_runtime_memory", "mnemon_document_create"] });
3789
3906
  const value = object$4(result.structured);
3790
3907
  return {
3791
3908
  delegated: true,
@@ -4271,8 +4388,11 @@ ${runtimeSnapshotContext("user", plan.entries)}`;
4271
4388
  const staged = /* @__PURE__ */ new WeakMap();
4272
4389
  const recoverableTools = new Set(recovery?.terminalTools ?? []);
4273
4390
  const committedReceipts = [];
4391
+ const reviewReceipts = [];
4392
+ let reviewChildId;
4274
4393
  const stagedReceipts = /* @__PURE__ */ new Map();
4275
4394
  let run;
4395
+ let completed;
4276
4396
  let failure;
4277
4397
  let disposeResultObserver;
4278
4398
  let releaseWorkflow;
@@ -4284,7 +4404,14 @@ ${runtimeSnapshotContext("user", plan.entries)}`;
4284
4404
  }
4285
4405
  if (this.disposed) throw new Error("dsh-mnemon subagent coordinator is disposed");
4286
4406
  const observer = this.resultRuntime.on("tools/result", ((execution, result) => {
4287
- if (signal.aborted || !this.resultRequests.has(requestId)) return;
4407
+ if (!this.resultRequests.has(requestId)) return;
4408
+ if (operation === "review" && execution.agent?.id === reviewChildId && execution.name !== void 0 && recoverableTools.has(execution.name) && result.isError !== true && Object.hasOwn(result, "value")) reviewReceipts.push({
4409
+ agentId: execution.agent.id,
4410
+ name: execution.name,
4411
+ arguments: execution.arguments,
4412
+ value: result.value
4413
+ });
4414
+ if (signal.aborted) return;
4288
4415
  if (execution.token !== void 0) {
4289
4416
  const entries = stagedReceipts.get(execution.token);
4290
4417
  if (entries !== void 0) {
@@ -4349,7 +4476,7 @@ ${runtimeSnapshotContext("user", plan.entries)}`;
4349
4476
  Completion protocol: call \`${resultToolName}\` exactly once with requestId \`${requestId}\` and result matching this JSON schema:
4350
4477
  ${JSON.stringify(outputSchema)}
4351
4478
  This is the only completion channel for this run. Do not finish with a plain-text answer. The requestId expires when this run finishes or is cancelled.`;
4352
- const perOpMaxTokens = operation === "migration" || operation === "compaction" ? this.runtimeMaintenanceMaxTokensResolver?.() ?? 8192 : operation === "document-archive" ? 8192 : operation === "metadata-maintenance" ? 4096 : void 0;
4479
+ const perOpMaxTokens = operation === "migration" || operation === "compaction" ? this.runtimeMaintenanceMaxTokensResolver?.() ?? 8192 : operation === "document-archive" ? 8192 : operation === "metadata-maintenance" ? 4096 : operation === "review" ? this.runtimeSource.config.idleReview.maxTokens : void 0;
4353
4480
  const fixed = this.taskAgentModelResolver?.();
4354
4481
  const baseAgentOptions = perOpMaxTokens === void 0 ? void 0 : { maxTokens: perOpMaxTokens };
4355
4482
  const resolvedAgentOptions = fixed === void 0 ? baseAgentOptions : {
@@ -4370,7 +4497,9 @@ This is the only completion channel for this run. Do not finish with a plain-tex
4370
4497
  toolFilter: { allow: [...tools, resultToolName] },
4371
4498
  persona: completionPersona
4372
4499
  });
4373
- run = operation === "review" ? await startGuardedReview(this.resultRuntime, parent, [...tools, resultToolName], start) : await start();
4500
+ run = operation === "review" ? await startGuardedReview(this.resultRuntime, parent, [...tools, resultToolName], start, (child) => {
4501
+ reviewChildId = child.id;
4502
+ }) : await start();
4374
4503
  const activeRun = run;
4375
4504
  const result = await activeRun.result;
4376
4505
  if (captured !== void 0 && captured.agentId !== activeRun.id) throw new Error("Mnemon subagent result was recorded by a different child");
@@ -4382,11 +4511,12 @@ This is the only completion channel for this run. Do not finish with a plain-tex
4382
4511
  throw new Error(`memory subagent stopped with ${result.stopReason}${detail === void 0 ? "" : `: ${detail}`}`);
4383
4512
  }
4384
4513
  if (structured === void 0) throw new Error("memory subagent completed without recording its result");
4385
- this.counters[operation === "write" ? "writes" : operation === "review" ? "reviews" : operation === "placement" ? "placements" : operation === "migration" ? "migrations" : operation === "compaction" ? "compactions" : operation === "document-archive" ? "documentArchives" : operation === "metadata-maintenance" ? "metadataMaintenances" : "answers"] += 1;
4386
- this.counters.lastRunId = activeRun.id;
4387
- if (operation !== "answer") this.counters.lastOperation = operation;
4388
- this.counters.lastAt = (/* @__PURE__ */ new Date()).toISOString();
4389
- return {
4514
+ if (operation === "review" && [
4515
+ "failed",
4516
+ "partial",
4517
+ "unknown"
4518
+ ].includes(String(object$4(structured).action))) throw new Error(`memory review reported ${object$4(structured).action}`);
4519
+ completed = {
4390
4520
  provider,
4391
4521
  runId: activeRun.id,
4392
4522
  result: {
@@ -4397,8 +4527,14 @@ This is the only completion channel for this run. Do not finish with a plain-tex
4397
4527
  };
4398
4528
  } catch (error) {
4399
4529
  this.counters.failures += 1;
4400
- failure = error;
4401
- throw error;
4530
+ const receipts = reviewReceipts.map(reviewReceipt).filter((receipt) => receipt !== void 0);
4531
+ failure = operation === "review" ? new IdleReviewError(error instanceof Error ? error.message : String(error), {
4532
+ status: receipts.length > 0 ? "partial" : "failed",
4533
+ provider,
4534
+ ...reviewChildId === void 0 ? {} : { runId: reviewChildId },
4535
+ receipts
4536
+ }, { cause: error }) : error;
4537
+ throw failure;
4402
4538
  } finally {
4403
4539
  this.resultRequests.delete(requestId);
4404
4540
  let cleanupFailure;
@@ -4413,8 +4549,24 @@ This is the only completion channel for this run. Do not finish with a plain-tex
4413
4549
  if (failure === void 0 && cleanupFailure === void 0) cleanupFailure = error;
4414
4550
  }
4415
4551
  releaseWorkflow?.();
4416
- if (cleanupFailure !== void 0) throw cleanupFailure;
4552
+ if (cleanupFailure !== void 0) {
4553
+ this.counters.failures += 1;
4554
+ if (operation !== "review") throw cleanupFailure;
4555
+ const receipts = reviewReceipts.map(reviewReceipt).filter((receipt) => receipt !== void 0);
4556
+ throw new IdleReviewError(cleanupFailure instanceof Error ? cleanupFailure.message : String(cleanupFailure), {
4557
+ status: receipts.length > 0 ? "partial" : "failed",
4558
+ provider,
4559
+ ...reviewChildId === void 0 ? {} : { runId: reviewChildId },
4560
+ receipts
4561
+ }, { cause: cleanupFailure });
4562
+ }
4417
4563
  }
4564
+ if (completed === void 0) throw new Error("memory subagent did not complete");
4565
+ this.counters[operation === "write" ? "writes" : operation === "review" ? "reviews" : operation === "placement" ? "placements" : operation === "migration" ? "migrations" : operation === "compaction" ? "compactions" : operation === "document-archive" ? "documentArchives" : operation === "metadata-maintenance" ? "metadataMaintenances" : "answers"] += 1;
4566
+ this.counters.lastRunId = completed.runId;
4567
+ if (operation !== "answer") this.counters.lastOperation = operation;
4568
+ this.counters.lastAt = (/* @__PURE__ */ new Date()).toISOString();
4569
+ return completed;
4418
4570
  }
4419
4571
  provider(preferred) {
4420
4572
  const names = this.subagents.list();
@@ -5117,6 +5269,9 @@ var MnemonAgentLifecycle = class {
5117
5269
  lastReviewAction;
5118
5270
  lastReviewScore;
5119
5271
  lastReviewDocumentIds;
5272
+ idleReviewAttempts = 0;
5273
+ lastReviewAttemptAt;
5274
+ lastReviewFailure;
5120
5275
  lastPhase = "idle";
5121
5276
  lastAt;
5122
5277
  lastError;
@@ -5166,6 +5321,10 @@ var MnemonAgentLifecycle = class {
5166
5321
  idleReviewPending: this.idleReviewTimer !== void 0,
5167
5322
  reviewRunning: this.reviewRunning,
5168
5323
  reviewActivity: this.reviewActivity(),
5324
+ idleReviewAttempts: this.idleReviewAttempts,
5325
+ ...idleReviewBlockReason(this.agent) === void 0 ? {} : { idleReviewBlocked: "agent-team" },
5326
+ ...this.lastReviewAttemptAt === void 0 ? {} : { nextReviewAt: new Date(this.lastReviewAttemptAt + this.config.idleReview.minIntervalMs).toISOString() },
5327
+ ...this.lastReviewFailure === void 0 ? {} : { lastReviewFailure: this.lastReviewFailure },
5169
5328
  lastPhase: this.lastPhase,
5170
5329
  ...this.lastReviewAt === void 0 ? {} : { lastReviewAt: this.lastReviewAt },
5171
5330
  ...this.lastReviewAction === void 0 ? {} : { lastReviewAction: this.lastReviewAction },
@@ -5291,9 +5450,9 @@ var MnemonAgentLifecycle = class {
5291
5450
  this.releaseView(turn);
5292
5451
  }
5293
5452
  scheduleIdleReview(turn) {
5294
- if (!this.config.lifecycleEnabled || !this.config.writeEnabled || this.config.writebackMode !== "guided") return;
5295
- if (this.config.memoryTopology.strategyId !== "default-three-tier") return;
5296
5453
  this.cancelIdleReview(true);
5454
+ if (!this.idleReviewAllowed()) return;
5455
+ if (this.config.memoryTopology.strategyId !== "default-three-tier") return;
5297
5456
  const activity = this.ensureTurnActivity(turn);
5298
5457
  const tools = completedToolActivity(hostSessionEvents(this.agent.session), turn);
5299
5458
  activity.toolCallCount = tools.count;
@@ -5301,15 +5460,24 @@ var MnemonAgentLifecycle = class {
5301
5460
  if (!this.reviewActivity().eligible || !this.reviewAdmitted(turn)) return;
5302
5461
  this.idleReviewTimer = setTimeout(() => {
5303
5462
  this.idleReviewTimer = void 0;
5304
- if (this.config.memoryTopology.strategyId !== "default-three-tier") return;
5463
+ if (!this.idleReviewAllowed() || this.reviewRunning) return;
5464
+ if (this.lastReviewAttemptAt !== void 0 && Date.now() < this.lastReviewAttemptAt + this.config.idleReview.minIntervalMs) {
5465
+ this.scheduleIdleReview(turn);
5466
+ return;
5467
+ }
5305
5468
  if (this.agent.status !== "idle") return;
5306
5469
  if (!hostSessionEvents(this.agent.session).some((event) => event.type === "turn/end" && eventTurn(event) === turn) || !this.reviewActivity().eligible || !this.reviewAdmitted(turn)) return;
5307
5470
  this.runIdleReview();
5308
- }, this.config.idleReviewMs);
5471
+ }, Math.max(this.config.idleReviewMs, (this.lastReviewAttemptAt ?? -Infinity) + this.config.idleReview.minIntervalMs - Date.now()));
5472
+ }
5473
+ idleReviewAllowed() {
5474
+ return this.config.lifecycleEnabled && this.config.writeEnabled && this.config.writebackMode === "guided" && this.config.idleReview.enabled && this.idleReviewAttempts < this.config.idleReview.maxPerSession && idleReviewBlockReason(this.agent) === void 0 && this.config.memoryTopology.strategyId === "default-three-tier";
5309
5475
  }
5310
5476
  async runIdleReview() {
5311
5477
  const controller = new AbortController();
5312
5478
  const triggeredScore = this.reviewActivity().score;
5479
+ this.idleReviewAttempts += 1;
5480
+ this.lastReviewAttemptAt = Date.now();
5313
5481
  this.reviewRunning = true;
5314
5482
  this.reviewController = controller;
5315
5483
  this.mark("review");
@@ -5320,11 +5488,13 @@ var MnemonAgentLifecycle = class {
5320
5488
  this.lastReviewAction = result.action;
5321
5489
  this.lastReviewScore = triggeredScore;
5322
5490
  this.lastReviewDocumentIds = result.documentIds;
5491
+ this.lastReviewFailure = void 0;
5323
5492
  this.turnActivity.clear();
5324
5493
  this.lastError = void 0;
5325
5494
  this.mark("review");
5326
5495
  } catch (error) {
5327
- if (!controller.signal.aborted) this.fail(error);
5496
+ if (error instanceof IdleReviewError) this.lastReviewFailure = error.review;
5497
+ if (!controller.signal.aborted || error instanceof IdleReviewError && error.review.status === "partial") this.fail(error);
5328
5498
  } finally {
5329
5499
  if (this.reviewController === controller) {
5330
5500
  this.reviewRunning = false;
@@ -7118,6 +7288,7 @@ const MUTABLE_FIELDS = [
7118
7288
  "recallMode",
7119
7289
  "writebackMode",
7120
7290
  "idleReviewMs",
7291
+ "idleReview",
7121
7292
  "displayMode",
7122
7293
  "tabEnabled",
7123
7294
  "writeEnabled",
@@ -7674,7 +7845,7 @@ function registerTools(ctx, runtimeSource, coordinator) {
7674
7845
  },
7675
7846
  old_text: {
7676
7847
  type: "string",
7677
- description: "Unique substring of the existing entry. Required for replace and remove."
7848
+ description: "Full content of the existing entry, or a unique substring. A unique full-content match takes precedence within the selected target. Required for replace and remove."
7678
7849
  },
7679
7850
  importance: {
7680
7851
  type: "string",
@@ -7724,7 +7895,7 @@ function registerTools(ctx, runtimeSource, coordinator) {
7724
7895
  }));
7725
7896
  ctx.tools.register(definition({
7726
7897
  name: "mnemon_remember",
7727
- description: "Archive one durable insight in a selected provider-backed Memory Space. Ordinary new hot memory belongs in mnemon_runtime_memory; use direct archival only for explicit long-term persistence or runtime capacity migration. Choose the narrowest existing space, search it first, verify capabilities.remember=true, and wait for the provider receipt. OpenViking writes are asynchronous semantic extraction and may truthfully return skipped. Do not dump transcripts, temporary progress, routine observations, or repository-obvious facts.",
7898
+ description: "Archive one durable insight in a selected provider-backed Memory Space. Ordinary new hot memory belongs in mnemon_runtime_memory; use direct archival only for explicit long-term persistence or runtime capacity migration. Choose the narrowest existing space, search it first, verify capabilities.remember=true, and wait for the provider receipt. Exact writes require confirmed persistence; providers using semantic extraction may truthfully return skipped. Do not dump transcripts, temporary progress, routine observations, or repository-obvious facts.",
7728
7899
  parameters: {
7729
7900
  type: "object",
7730
7901
  properties: {
@@ -127,7 +127,23 @@ export declare const zh: {
127
127
  'status.nominal': string;
128
128
  'status.reviewFailed': string;
129
129
  'status.reviewFailedDetail': string;
130
+ 'status.reviewPartial': string;
131
+ 'status.reviewTeamPaused': string;
132
+ 'status.reviewRun': string;
130
133
  'status.reviewContextWindow': string;
134
+ 'config.reviewTitle': string;
135
+ 'config.reviewDescription': string;
136
+ 'config.reviewEnabled': string;
137
+ 'config.reviewProvider': string;
138
+ 'config.reviewSpawn': string;
139
+ 'config.reviewFork': string;
140
+ 'config.reviewFallback': string;
141
+ 'config.reviewSkip': string;
142
+ 'config.review.minIntervalMs': string;
143
+ 'config.review.maxPerSession': string;
144
+ 'config.review.maxContextChars': string;
145
+ 'config.review.maxTokens': string;
146
+ 'config.reviewInvalid': string;
131
147
  'status.checkRequired': string;
132
148
  'status.rechecking': string;
133
149
  'status.recheck': string;
@@ -1110,7 +1126,23 @@ export declare const en: {
1110
1126
  'status.nominal': string;
1111
1127
  'status.reviewFailed': string;
1112
1128
  'status.reviewFailedDetail': string;
1129
+ 'status.reviewPartial': string;
1130
+ 'status.reviewTeamPaused': string;
1131
+ 'status.reviewRun': string;
1113
1132
  'status.reviewContextWindow': string;
1133
+ 'config.reviewTitle': string;
1134
+ 'config.reviewDescription': string;
1135
+ 'config.reviewEnabled': string;
1136
+ 'config.reviewProvider': string;
1137
+ 'config.reviewSpawn': string;
1138
+ 'config.reviewFork': string;
1139
+ 'config.reviewFallback': string;
1140
+ 'config.reviewSkip': string;
1141
+ 'config.review.minIntervalMs': string;
1142
+ 'config.review.maxPerSession': string;
1143
+ 'config.review.maxContextChars': string;
1144
+ 'config.review.maxTokens': string;
1145
+ 'config.reviewInvalid': string;
1114
1146
  'status.checkRequired': string;
1115
1147
  'status.rechecking': string;
1116
1148
  'status.recheck': string;
@@ -173,6 +173,25 @@ export interface ResolvedRuntimeMemoryConfig {
173
173
  }
174
174
  export { normalizeDisplayMode } from './display-mode.ts';
175
175
  export type MnemonDisplayMode = 'sidebar' | 'builtin';
176
+ export declare const DEFAULT_IDLE_REVIEW: {
177
+ enabled: true;
178
+ provider: "spawn";
179
+ fallback: "spawn";
180
+ minIntervalMs: number;
181
+ maxPerSession: number;
182
+ maxContextChars: number;
183
+ maxTokens: number;
184
+ };
185
+ export interface ResolvedIdleReviewConfig {
186
+ enabled: boolean;
187
+ provider: 'spawn' | 'fork';
188
+ /** Applies only before a child starts; a failed run is never replayed. */
189
+ fallback: 'spawn' | 'skip';
190
+ minIntervalMs: number;
191
+ maxPerSession: number;
192
+ maxContextChars: number;
193
+ maxTokens: number;
194
+ }
176
195
  export interface Config {
177
196
  storageScope?: StorageScopeKind;
178
197
  /** Whether USER.md follows the selected storage root or stays in the global root. */
@@ -200,6 +219,7 @@ export interface Config {
200
219
  recallMode?: 'guided' | 'off';
201
220
  writebackMode?: 'guided' | 'off';
202
221
  idleReviewMs?: number;
222
+ idleReview?: Partial<ResolvedIdleReviewConfig>;
203
223
  conversationInteraction?: {
204
224
  toolviews?: boolean;
205
225
  turnBar?: boolean;
@@ -276,6 +296,7 @@ export interface ResolvedConfig {
276
296
  recallMode: 'guided' | 'off';
277
297
  writebackMode: 'guided' | 'off';
278
298
  idleReviewMs: number;
299
+ idleReview: ResolvedIdleReviewConfig;
279
300
  conversationInteraction: {
280
301
  toolviews: boolean;
281
302
  turnBar: boolean;
@@ -418,9 +439,26 @@ export interface LifecycleAgentSnapshot {
418
439
  lastReviewAction?: string;
419
440
  lastReviewScore?: number;
420
441
  lastReviewDocumentIds?: string[];
442
+ idleReviewAttempts?: number;
443
+ idleReviewBlocked?: 'agent-team';
444
+ nextReviewAt?: string;
445
+ lastReviewFailure?: IdleReviewFailure;
421
446
  lastAt?: string;
422
447
  lastError?: string;
423
448
  }
449
+ /** Reconciliation metadata only; raw tool arguments and memory content stay private. */
450
+ export interface IdleReviewFailure {
451
+ status: 'failed' | 'partial';
452
+ runId?: string;
453
+ provider: string;
454
+ receipts: Array<{
455
+ tool: string;
456
+ action: string;
457
+ documentId?: string;
458
+ target?: string;
459
+ revision?: string;
460
+ }>;
461
+ }
424
462
  export interface LifecycleSnapshot {
425
463
  enabled: boolean;
426
464
  recallMode: 'guided' | 'off';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-mnemon",
3
- "version": "0.5.9",
3
+ "version": "0.5.10",
4
4
  "description": "Composable three-tier memory control plane for DeepSeek Harness: persistent runtime context, searchable project documents, pluggable long-term memory, guarded strategies, WebUI, and headless tools.",
5
5
  "keywords": [
6
6
  "deepseek-harness",
@@ -145,12 +145,12 @@
145
145
  "dsh-mnemon-provider-honcho": "0.5.4",
146
146
  "dsh-mnemon-provider-mem0": "0.5.4",
147
147
  "dsh-mnemon-provider-mnemon-native": "0.5.5",
148
- "dsh-mnemon-provider-openviking": "0.5.4",
148
+ "dsh-mnemon-provider-openviking": "0.5.5",
149
149
  "dsh-mnemon-provider-retaindb": "0.5.4",
150
150
  "dsh-mnemon-provider-supermemory": "0.5.4",
151
151
  "dsh-mnemon-source-documents": "0.5.6",
152
- "dsh-mnemon-source-memory-spaces": "0.5.7",
153
- "dsh-mnemon-source-runtime": "0.5.6",
152
+ "dsh-mnemon-source-memory-spaces": "0.5.8",
153
+ "dsh-mnemon-source-runtime": "0.5.7",
154
154
  "dsh-mnemon-strategy-auto-capture": "0.5.4",
155
155
  "dsh-mnemon-strategy-default-three-tier": "0.5.5",
156
156
  "dsh-mnemon-strategy-light-context": "0.5.4",