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 +2 -0
- package/README.zh-CN.md +2 -0
- package/lib/client.js +168 -7
- package/lib/index.js +217 -46
- package/lib/types/src/client/locales.d.ts +32 -0
- package/lib/types/src/host/protocol.d.ts +38 -0
- package/package.json +4 -4
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
|
|
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.
|
|
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
|
|
1990
|
-
"status.
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
534
|
-
const checksumFiles = record$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
1322
|
-
const bodies = Array.isArray(registry?.bodies) ? registry.bodies.map(record$
|
|
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$
|
|
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$
|
|
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$
|
|
1415
|
+
const registry = record$2(readJson(providerRegistry));
|
|
1396
1416
|
providerConnections = Array.isArray(registry?.bodies) ? registry.bodies.length : 0;
|
|
1397
|
-
providerServices = record$
|
|
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
|
-
|
|
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 (
|
|
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)
|
|
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
|
-
|
|
4386
|
-
|
|
4387
|
-
|
|
4388
|
-
|
|
4389
|
-
|
|
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
|
-
|
|
4401
|
-
|
|
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)
|
|
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.
|
|
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 (
|
|
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: "
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
153
|
-
"dsh-mnemon-source-runtime": "0.5.
|
|
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",
|