dsh-mnemon 0.3.1 → 0.3.3

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/lib/client.js CHANGED
@@ -40,6 +40,8 @@ window.__ModuleLoader__.load({
40
40
  const MNEMON_SETTINGS_CHANNEL = "/dsh-mnemon-settings";
41
41
  const MNEMON_SETTINGS_NAMESPACE = "mnemon";
42
42
  const MNEMON_UI_SETTINGS_NAMESPACE = "mnemon-ui";
43
+ const DEFAULT_EMBEDDING_ENDPOINT = "http://localhost:11434";
44
+ const DEFAULT_EMBEDDING_MODEL = "nomic-embed-text";
43
45
  const CATEGORIES = [
44
46
  "preference",
45
47
  "decision",
@@ -122,6 +124,9 @@ window.__ModuleLoader__.load({
122
124
  statusSummary() {
123
125
  return this.call(MNEMON_READ_CHANNEL, "status-summary", this.scoped()).catch(() => this.status());
124
126
  }
127
+ embeddingStatus() {
128
+ return this.call(MNEMON_READ_CHANNEL, "embedding-status", this.scoped());
129
+ }
125
130
  memorySystem() {
126
131
  return this.call(MNEMON_READ_CHANNEL, "memory-system", this.scoped());
127
132
  }
@@ -273,7 +278,7 @@ window.__ModuleLoader__.load({
273
278
  };
274
279
  //#endregion
275
280
  //#region \0dsh-mnemon-css:/home/runner/work/dsh-mnemon/dsh-mnemon/src/client/MnemonSettingsCard.module.css.mjs
276
- const css$5 = "._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_displayGrid{grid-template-columns:repeat(2,minmax(0,1fr))}._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{border-top:1px solid var(--dsw-alias-border-l2);flex-direction:column;gap:10px;min-width:0;padding-top:13px;display:flex}._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_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 input: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_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_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}}@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}}";
281
+ const css$5 = "._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_displayGrid{grid-template-columns:repeat(2,minmax(0,1fr))}._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_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 input: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_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_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}}@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}}";
277
282
  const tagId$5 = "dsh-mnemon/src/client/MnemonSettingsCard.module.css";
278
283
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$5) + "]") === null) {
279
284
  const tag = document.createElement("style");
@@ -298,6 +303,10 @@ window.__ModuleLoader__.load({
298
303
  "discard": "_v_wrq_discard",
299
304
  "displayGrid": "_v_wrq_displayGrid",
300
305
  "embeddedSection": "_v_wrq_embeddedSection",
306
+ "embeddingHeading": "_v_wrq_embeddingHeading",
307
+ "embeddingSection": "_v_wrq_embeddingSection",
308
+ "embeddingSecurity": "_v_wrq_embeddingSecurity",
309
+ "embeddingTest": "_v_wrq_embeddingTest",
301
310
  "error": "_v_wrq_error",
302
311
  "feedback": "_v_wrq_feedback",
303
312
  "globalLocationSetting": "_v_wrq_globalLocationSetting",
@@ -1140,6 +1149,23 @@ window.__ModuleLoader__.load({
1140
1149
  "config.nativeGlobalLocationHint": "mnemon 的全局范围可以使用默认目录或指定一个目录。",
1141
1150
  "config.nativeGlobalLocationWorkspaceHint": "当前使用工作区范围;切换到全局后可选择默认或自定义目录。",
1142
1151
  "config.nativeDefaultLocation": "默认 ~/.mnemon",
1152
+ "config.embeddingTitle": "本地向量嵌入",
1153
+ "config.embeddingDescription": "让 DSH Host 为每次 Mnemon CLI 调用注入 Ollama endpoint 与模型;Finder 或 Dock 启动的 macOS 桌面端无需依赖 shell 环境。",
1154
+ "config.embeddingManaged": "由 DSH 管理嵌入配置",
1155
+ "config.embeddingManagedHint": "开启后以这里保存的值覆盖 Mnemon 子进程环境;关闭后继续沿用 Host 环境与 Mnemon 默认值。",
1156
+ "config.embeddingEndpoint": "Ollama Endpoint",
1157
+ "config.embeddingModel": "嵌入模型",
1158
+ "config.embeddingEndpointInvalid": "嵌入 Endpoint 必须是不含凭据、查询参数或片段的 HTTP(S) 绝对 URL。",
1159
+ "config.embeddingModelInvalid": "嵌入模型必须包含 1–200 个字符,且不能包含控制字符。",
1160
+ "config.embeddingSecurity": "Mnemon 会把记忆与查询正文发送到该 Endpoint。远程 HTTP 会明文传输,请仅使用受信任的本地地址,或为远程服务配置 HTTPS。",
1161
+ "config.embeddingTest": "测试状态",
1162
+ "config.embeddingNotTested": "尚未检查当前 Mnemon Store 的连接与嵌入覆盖率。",
1163
+ "config.embeddingTesting": "正在通过 Mnemon 检查 Ollama 与嵌入覆盖率…",
1164
+ "config.embeddingSaveBeforeTest": "请先保存嵌入配置,再测试实际运行值。",
1165
+ "config.embeddingTestUnavailable": "当前 DSH Host 不提供嵌入状态检查。",
1166
+ "config.embeddingStatusAvailable": "Ollama 可用 · {model} · 已嵌入 {embedded}/{total}({coverage})",
1167
+ "config.embeddingStatusUnavailable": "Ollama 不可达 · {model} · 已嵌入 {embedded}/{total}({coverage})",
1168
+ "config.embeddingStatusFailed": "嵌入状态检查失败:{error}",
1143
1169
  "config.providerGlobalLocation": "全局数据位置",
1144
1170
  "config.providerGlobalLocationHint": "{provider} 默认使用全局范围目录,也可以指定一个自定义位置。",
1145
1171
  "config.providerGlobalLocationWorkspaceHint": "当前使用工作区默认位置;切换到全局范围后可指定自定义位置。",
@@ -2017,6 +2043,23 @@ window.__ModuleLoader__.load({
2017
2043
  "config.nativeGlobalLocationHint": "mnemon can use its default global directory or a directory you choose.",
2018
2044
  "config.nativeGlobalLocationWorkspaceHint": "Workspace scope is active; switch to Global to choose the default or a custom directory.",
2019
2045
  "config.nativeDefaultLocation": "Default ~/.mnemon",
2046
+ "config.embeddingTitle": "Local vector embeddings",
2047
+ "config.embeddingDescription": "Have the DSH Host inject the Ollama endpoint and model into every Mnemon CLI call, including macOS Desktop launches from Finder or the Dock.",
2048
+ "config.embeddingManaged": "Manage embedding settings in DSH",
2049
+ "config.embeddingManagedHint": "When enabled, saved values override the Mnemon child-process environment. When off, Mnemon keeps the Host environment and its built-in defaults.",
2050
+ "config.embeddingEndpoint": "Ollama endpoint",
2051
+ "config.embeddingModel": "Embedding model",
2052
+ "config.embeddingEndpointInvalid": "The embedding endpoint must be an absolute HTTP(S) URL without credentials, a query, or a fragment.",
2053
+ "config.embeddingModelInvalid": "The embedding model must contain 1–200 characters and no control characters.",
2054
+ "config.embeddingSecurity": "Mnemon sends memory and query text to this endpoint. Remote HTTP is unencrypted; use a trusted local address or HTTPS for a remote service.",
2055
+ "config.embeddingTest": "Test status",
2056
+ "config.embeddingNotTested": "The current Mnemon Store connection and embedding coverage have not been checked.",
2057
+ "config.embeddingTesting": "Checking Ollama and embedding coverage through Mnemon…",
2058
+ "config.embeddingSaveBeforeTest": "Save the embedding settings before testing their effective runtime values.",
2059
+ "config.embeddingTestUnavailable": "This DSH Host does not provide embedding status checks.",
2060
+ "config.embeddingStatusAvailable": "Ollama available · {model} · {embedded}/{total} embedded ({coverage})",
2061
+ "config.embeddingStatusUnavailable": "Ollama unreachable · {model} · {embedded}/{total} embedded ({coverage})",
2062
+ "config.embeddingStatusFailed": "Embedding status check failed: {error}",
2020
2063
  "config.providerGlobalLocation": "Global data location",
2021
2064
  "config.providerGlobalLocationHint": "{provider} uses the global scope directory by default, or you can choose a custom location.",
2022
2065
  "config.providerGlobalLocationWorkspaceHint": "The workspace default is active. Switch to Global to choose a custom location.",
@@ -3196,6 +3239,11 @@ window.__ModuleLoader__.load({
3196
3239
  "storageScope",
3197
3240
  "dataDir"
3198
3241
  ];
3242
+ const EMBEDDING_FIELDS = [
3243
+ "embeddingEnabled",
3244
+ "embeddingEndpoint",
3245
+ "embeddingModel"
3246
+ ];
3199
3247
  const INTERACTION_FIELDS = ["turnBar", "saveAction"];
3200
3248
  const TASK_AGENT_FIELDS = [
3201
3249
  "taskAgentModelMode",
@@ -3216,11 +3264,28 @@ window.__ModuleLoader__.load({
3216
3264
  displayMode: resolved.displayMode ?? "sidebar",
3217
3265
  storageScope: resolved.storageScope ?? (dataDir === "" ? "global" : "custom"),
3218
3266
  dataDir,
3267
+ embeddingEnabled: resolved.embedding?.enabled === true,
3268
+ embeddingEndpoint: resolved.embedding?.endpoint?.trim() || "http://localhost:11434",
3269
+ embeddingModel: resolved.embedding?.model?.trim() || "nomic-embed-text",
3219
3270
  taskAgentModelMode: resolved.taskAgentModel?.mode === "fixed" ? "fixed" : "inherit",
3220
3271
  taskAgentProvider: resolved.taskAgentModel?.provider?.trim() ?? "",
3221
3272
  taskAgentModel: resolved.taskAgentModel?.model?.trim() ?? ""
3222
3273
  };
3223
3274
  }
3275
+ function validEmbeddingEndpoint(value) {
3276
+ const endpoint = value.trim();
3277
+ if (endpoint === "" || endpoint.length > 2048) return false;
3278
+ try {
3279
+ const parsed = new URL(endpoint);
3280
+ return ["http:", "https:"].includes(parsed.protocol) && parsed.username === "" && parsed.password === "" && !endpoint.includes("?") && !endpoint.includes("#");
3281
+ } catch {
3282
+ return false;
3283
+ }
3284
+ }
3285
+ function validEmbeddingModel(value) {
3286
+ const model = value.trim();
3287
+ return model.length > 0 && model.length <= 200 && !/[\u0000-\u001f\u007f]/u.test(model);
3288
+ }
3224
3289
  function interactionDraft(value) {
3225
3290
  return {
3226
3291
  turnBar: value?.turnBar !== false,
@@ -3260,6 +3325,8 @@ window.__ModuleLoader__.load({
3260
3325
  const windowsUncAbsolute = /^\\\\[^\\/]+[\\/][^\\/]+/.test(directory);
3261
3326
  if (!posixAbsolute && !homeRelative && !windowsDriveAbsolute && !windowsUncAbsolute) return t("config.customAbsolute");
3262
3327
  }
3328
+ if (draft.embeddingEnabled && !validEmbeddingEndpoint(draft.embeddingEndpoint)) return t("config.embeddingEndpointInvalid");
3329
+ if (draft.embeddingEnabled && !validEmbeddingModel(draft.embeddingModel)) return t("config.embeddingModelInvalid");
3263
3330
  if (draft.taskAgentModelMode === "fixed" && (draft.taskAgentProvider.trim() === "" || draft.taskAgentModel.trim() === "")) return t("config.taskAgentRouteRequired");
3264
3331
  return null;
3265
3332
  }
@@ -3311,6 +3378,10 @@ window.__ModuleLoader__.load({
3311
3378
  const [topologyDraft, setTopologyDraft] = (0, react.useState)(null);
3312
3379
  const [topologyState, setTopologyState] = (0, react.useState)(connection === void 0 ? "unavailable" : "loading");
3313
3380
  const topologyRequest = (0, react.useRef)(0);
3381
+ const [embeddingStatus, setEmbeddingStatus] = (0, react.useState)(null);
3382
+ const [embeddingStatusState, setEmbeddingStatusState] = (0, react.useState)(connection === void 0 ? "unavailable" : "idle");
3383
+ const [embeddingStatusError, setEmbeddingStatusError] = (0, react.useState)(null);
3384
+ const embeddingStatusRequest = (0, react.useRef)(0);
3314
3385
  const configuredTaskAgentMode = coreSnapshot.value?.taskAgentModel?.mode === "fixed" ? "fixed" : "inherit";
3315
3386
  (0, react.useEffect)(() => {
3316
3387
  if (dirty.size === 0) setDraft(draftOf(coreSnapshot.value, interactionSnapshot.value));
@@ -3391,6 +3462,37 @@ window.__ModuleLoader__.load({
3391
3462
  workspaceId,
3392
3463
  targetRevision
3393
3464
  ]);
3465
+ (0, react.useEffect)(() => {
3466
+ embeddingStatusRequest.current += 1;
3467
+ setEmbeddingStatus(null);
3468
+ setEmbeddingStatusError(null);
3469
+ setEmbeddingStatusState(connection === void 0 ? "unavailable" : "idle");
3470
+ return () => {
3471
+ embeddingStatusRequest.current += 1;
3472
+ };
3473
+ }, [
3474
+ connection,
3475
+ sessionId,
3476
+ workspaceId,
3477
+ targetRevision
3478
+ ]);
3479
+ const testEmbedding = () => {
3480
+ if (connection === void 0) return;
3481
+ const request = embeddingStatusRequest.current + 1;
3482
+ embeddingStatusRequest.current = request;
3483
+ setEmbeddingStatus(null);
3484
+ setEmbeddingStatusError(null);
3485
+ setEmbeddingStatusState("loading");
3486
+ new MnemonClient(connection, sessionId, workspaceId).embeddingStatus().then((status) => {
3487
+ if (embeddingStatusRequest.current !== request) return;
3488
+ setEmbeddingStatus(status);
3489
+ setEmbeddingStatusState("ready");
3490
+ }, (reason) => {
3491
+ if (embeddingStatusRequest.current !== request) return;
3492
+ setEmbeddingStatusError(reason instanceof Error ? reason.message : String(reason));
3493
+ setEmbeddingStatusState("error");
3494
+ });
3495
+ };
3394
3496
  const coreUser = (0, react.useMemo)(() => record(coreSnapshot.user), [coreSnapshot.user]);
3395
3497
  const activeScope = coreDraft(coreSnapshot.value).storageScope === "workspace" ? "workspace" : "global";
3396
3498
  const error = validation(t, draft);
@@ -3437,6 +3539,7 @@ window.__ModuleLoader__.load({
3437
3539
  try {
3438
3540
  const coreOps = operations(CORE_FIELDS, dirty, draft);
3439
3541
  const regularCoreChanged = coreOps.length > 0;
3542
+ const embeddingChanged = EMBEDDING_FIELDS.some((field) => dirty.has(field));
3440
3543
  const taskAgentChanged = TASK_AGENT_FIELDS.some((field) => dirty.has(field));
3441
3544
  const topologyChanged = [...dirty].some((field) => field.startsWith("memoryTopology."));
3442
3545
  if (regularCoreChanged) {
@@ -3458,6 +3561,23 @@ window.__ModuleLoader__.load({
3458
3561
  model: draft.taskAgentModel.trim()
3459
3562
  }
3460
3563
  });
3564
+ if (embeddingChanged) {
3565
+ const validEndpoint = validEmbeddingEndpoint(draft.embeddingEndpoint);
3566
+ const validModel = validEmbeddingModel(draft.embeddingModel);
3567
+ coreOps.push({
3568
+ op: "set",
3569
+ path: ["embedding"],
3570
+ value: draft.embeddingEnabled ? {
3571
+ enabled: true,
3572
+ endpoint: draft.embeddingEndpoint.trim().replace(/\/+$/u, ""),
3573
+ model: draft.embeddingModel.trim()
3574
+ } : {
3575
+ enabled: false,
3576
+ ...validEndpoint ? { endpoint: draft.embeddingEndpoint.trim().replace(/\/+$/u, "") } : {},
3577
+ ...validModel ? { model: draft.embeddingModel.trim() } : {}
3578
+ }
3579
+ });
3580
+ }
3461
3581
  if (topologyChanged && topologyDraft !== null) for (const layer of topologyDraft.layers) {
3462
3582
  if (!dirty.has(`memoryTopology.${layer.id}.enabled`)) continue;
3463
3583
  coreOps.push({
@@ -3475,7 +3595,7 @@ window.__ModuleLoader__.load({
3475
3595
  await Promise.all([...coreOps.length === 0 ? [] : [commit(scope, coreOps)], ...interactionOps.length === 0 ? [] : [commit(interactionScope, interactionOps)]]);
3476
3596
  setDirty(/* @__PURE__ */ new Set());
3477
3597
  setApplied(true);
3478
- if (regularCoreChanged || topologyChanged) setTargetRevision((revision) => revision + 1);
3598
+ if (regularCoreChanged || embeddingChanged || topologyChanged) setTargetRevision((revision) => revision + 1);
3479
3599
  } catch (reason) {
3480
3600
  setFailed(reason instanceof Error ? reason.message : String(reason));
3481
3601
  } finally {
@@ -3485,6 +3605,7 @@ window.__ModuleLoader__.load({
3485
3605
  const coreDisabled = loading || saving || !coreSnapshot.writable;
3486
3606
  const interactionDisabled = loading || saving || !interactionSnapshot.writable;
3487
3607
  const scopeChanging = dirty.has("storageScope") || dirty.has("dataDir");
3608
+ const embeddingChanging = EMBEDDING_FIELDS.some((field) => dirty.has(field));
3488
3609
  const editLayerEnabled = (layerId, enabled) => {
3489
3610
  setTopologyDraft((current) => current === null ? current : {
3490
3611
  ...current,
@@ -3614,53 +3735,68 @@ window.__ModuleLoader__.load({
3614
3735
  })]
3615
3736
  })] }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3616
3737
  className: MnemonSettingsCard_module_css_default.providerPanelBody,
3617
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(GlobalLocationSetting, {
3618
- name: "mnemon-native-location",
3619
- ariaLabel: t("config.nativeGlobalLocation"),
3620
- label: t("config.nativeGlobalLocation"),
3621
- hint: draft.storageScope === "workspace" ? t("config.nativeGlobalLocationWorkspaceHint") : t("config.nativeGlobalLocationHint"),
3622
- defaultLabel: t("config.nativeDefaultLocation"),
3623
- customLabel: t("config.custom"),
3624
- custom: draft.storageScope === "custom",
3625
- workspace: draft.storageScope === "workspace",
3626
- disabled: coreDisabled,
3627
- onChange: (custom) => custom ? edit("storageScope", "custom") : editMany({
3628
- storageScope: "global",
3629
- dataDir: ""
3738
+ children: [
3739
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(GlobalLocationSetting, {
3740
+ name: "mnemon-native-location",
3741
+ ariaLabel: t("config.nativeGlobalLocation"),
3742
+ label: t("config.nativeGlobalLocation"),
3743
+ hint: draft.storageScope === "workspace" ? t("config.nativeGlobalLocationWorkspaceHint") : t("config.nativeGlobalLocationHint"),
3744
+ defaultLabel: t("config.nativeDefaultLocation"),
3745
+ customLabel: t("config.custom"),
3746
+ custom: draft.storageScope === "custom",
3747
+ workspace: draft.storageScope === "workspace",
3748
+ disabled: coreDisabled,
3749
+ onChange: (custom) => custom ? edit("storageScope", "custom") : editMany({
3750
+ storageScope: "global",
3751
+ dataDir: ""
3752
+ }),
3753
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3754
+ className: MnemonSettingsCard_module_css_default.settingRow,
3755
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3756
+ className: MnemonSettingsCard_module_css_default.settingCopy,
3757
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: t("config.customDirectory") }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("config.customDirectoryHint") })]
3758
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
3759
+ className: MnemonSettingsCard_module_css_default.directoryControl,
3760
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
3761
+ id: "mnemon-custom-directory",
3762
+ name: "mnemon-custom-directory",
3763
+ type: "text",
3764
+ className: MnemonSettingsCard_module_css_default.directoryInput,
3765
+ "aria-label": t("config.customAria"),
3766
+ "aria-invalid": error !== null,
3767
+ placeholder: t("config.customPlaceholder"),
3768
+ value: draft.dataDir,
3769
+ disabled: coreDisabled,
3770
+ autoComplete: "off",
3771
+ spellCheck: false,
3772
+ autoCapitalize: "none",
3773
+ autoCorrect: "off",
3774
+ onChange: (event) => edit("dataDir", event.target.value)
3775
+ })
3776
+ })]
3777
+ })
3630
3778
  }),
3631
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3632
- className: MnemonSettingsCard_module_css_default.settingRow,
3633
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3634
- className: MnemonSettingsCard_module_css_default.settingCopy,
3635
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: t("config.customDirectory") }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("small", { children: t("config.customDirectoryHint") })]
3636
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
3637
- className: MnemonSettingsCard_module_css_default.directoryControl,
3638
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
3639
- id: "mnemon-custom-directory",
3640
- name: "mnemon-custom-directory",
3641
- type: "text",
3642
- className: MnemonSettingsCard_module_css_default.directoryInput,
3643
- "aria-label": t("config.customAria"),
3644
- "aria-invalid": error !== null,
3645
- placeholder: t("config.customPlaceholder"),
3646
- value: draft.dataDir,
3647
- disabled: coreDisabled,
3648
- autoComplete: "off",
3649
- spellCheck: false,
3650
- autoCapitalize: "none",
3651
- autoCorrect: "off",
3652
- onChange: (event) => edit("dataDir", event.target.value)
3653
- })
3654
- })]
3779
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(EmbeddingSettingsSection, {
3780
+ draft,
3781
+ disabled: coreDisabled,
3782
+ connectionAvailable: connection !== void 0,
3783
+ changing: embeddingChanging,
3784
+ status: embeddingStatus,
3785
+ state: embeddingStatusState,
3786
+ error: embeddingStatusError,
3787
+ onEdit: edit,
3788
+ onTest: testEmbedding,
3789
+ t
3790
+ }),
3791
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(MnemonPackSection, {
3792
+ ...connection === void 0 ? {} : { connection },
3793
+ ...sessionId === void 0 ? {} : { sessionId },
3794
+ ...workspaceId === void 0 ? {} : { workspaceId },
3795
+ refreshKey: targetRevision,
3796
+ t,
3797
+ embedded: true
3655
3798
  })
3656
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(MnemonPackSection, {
3657
- ...connection === void 0 ? {} : { connection },
3658
- ...sessionId === void 0 ? {} : { sessionId },
3659
- ...workspaceId === void 0 ? {} : { workspaceId },
3660
- refreshKey: targetRevision,
3661
- t,
3662
- embedded: true
3663
- })]
3799
+ ]
3664
3800
  })]
3665
3801
  }),
3666
3802
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ProviderSettingsSection, {
@@ -3770,6 +3906,87 @@ window.__ModuleLoader__.load({
3770
3906
  ] })
3771
3907
  });
3772
3908
  }
3909
+ function EmbeddingSettingsSection(props) {
3910
+ const feedback = props.changing ? props.t("config.embeddingSaveBeforeTest") : props.state === "loading" ? props.t("config.embeddingTesting") : props.state === "error" ? props.t("config.embeddingStatusFailed", { error: props.error ?? "" }) : props.state === "ready" && props.status !== null ? props.status.available ? props.t("config.embeddingStatusAvailable", {
3911
+ model: props.status.model,
3912
+ embedded: props.status.embedded,
3913
+ total: props.status.totalInsights,
3914
+ coverage: props.status.coverage
3915
+ }) : props.t("config.embeddingStatusUnavailable", {
3916
+ model: props.status.model,
3917
+ embedded: props.status.embedded,
3918
+ total: props.status.totalInsights,
3919
+ coverage: props.status.coverage
3920
+ }) : props.state === "unavailable" ? props.t("config.embeddingTestUnavailable") : props.t("config.embeddingNotTested");
3921
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
3922
+ className: MnemonSettingsCard_module_css_default.embeddingSection,
3923
+ "aria-labelledby": "mnemon-embedding-heading",
3924
+ children: [
3925
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3926
+ className: MnemonSettingsCard_module_css_default.embeddingHeading,
3927
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
3928
+ id: "mnemon-embedding-heading",
3929
+ children: props.t("config.embeddingTitle")
3930
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", { children: props.t("config.embeddingDescription") })]
3931
+ }),
3932
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ToggleRow, {
3933
+ id: "mnemon-embedding-managed",
3934
+ label: props.t("config.embeddingManaged"),
3935
+ hint: props.t("config.embeddingManagedHint"),
3936
+ checked: props.draft.embeddingEnabled,
3937
+ disabled: props.disabled,
3938
+ onChange: (value) => props.onEdit("embeddingEnabled", value)
3939
+ }),
3940
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3941
+ className: MnemonSettingsCard_module_css_default.providerIdentityFields,
3942
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", { children: [props.t("config.embeddingEndpoint"), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
3943
+ type: "url",
3944
+ "aria-label": props.t("config.embeddingEndpoint"),
3945
+ "aria-invalid": props.draft.embeddingEnabled && !validEmbeddingEndpoint(props.draft.embeddingEndpoint),
3946
+ value: props.draft.embeddingEndpoint,
3947
+ disabled: props.disabled || !props.draft.embeddingEnabled,
3948
+ autoComplete: "off",
3949
+ spellCheck: false,
3950
+ autoCapitalize: "none",
3951
+ autoCorrect: "off",
3952
+ placeholder: DEFAULT_EMBEDDING_ENDPOINT,
3953
+ onChange: (event) => props.onEdit("embeddingEndpoint", event.target.value)
3954
+ })] }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", { children: [props.t("config.embeddingModel"), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
3955
+ type: "text",
3956
+ "aria-label": props.t("config.embeddingModel"),
3957
+ "aria-invalid": props.draft.embeddingEnabled && !validEmbeddingModel(props.draft.embeddingModel),
3958
+ value: props.draft.embeddingModel,
3959
+ disabled: props.disabled || !props.draft.embeddingEnabled,
3960
+ autoComplete: "off",
3961
+ spellCheck: false,
3962
+ autoCapitalize: "none",
3963
+ autoCorrect: "off",
3964
+ placeholder: DEFAULT_EMBEDDING_MODEL,
3965
+ onChange: (event) => props.onEdit("embeddingModel", event.target.value)
3966
+ })] })]
3967
+ }),
3968
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
3969
+ className: MnemonSettingsCard_module_css_default.embeddingSecurity,
3970
+ children: props.t("config.embeddingSecurity")
3971
+ }),
3972
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3973
+ className: MnemonSettingsCard_module_css_default.embeddingTest,
3974
+ "aria-live": "polite",
3975
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3976
+ className: props.state === "error" ? MnemonSettingsCard_module_css_default.error : void 0,
3977
+ role: props.state === "error" ? "alert" : void 0,
3978
+ children: feedback
3979
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
3980
+ type: "button",
3981
+ className: MnemonSettingsCard_module_css_default.textButton,
3982
+ disabled: props.disabled || !props.connectionAvailable || props.changing || props.state === "loading",
3983
+ onClick: props.onTest,
3984
+ children: props.t("config.embeddingTest")
3985
+ })]
3986
+ })
3987
+ ]
3988
+ });
3989
+ }
3773
3990
  function MemoryTopologySection(props) {
3774
3991
  const layerDescriptors = new Map(props.descriptor?.catalog.layers.map((layer) => [layer.id, layer]) ?? []);
3775
3992
  const builtInCopy = (layerId) => {
@@ -12298,6 +12515,106 @@ window.__ModuleLoader__.load({
12298
12515
  };
12299
12516
  }
12300
12517
  //#endregion
12518
+ //#region src/client/subagent-token-usage.tsx
12519
+ /** Mnemon compatibility shim for DSH's fork-backed subagent token metric. */
12520
+ const MNEMON_SUBAGENT_TOKEN_USAGE_KEY = "mnemonSubagentTokenUsage";
12521
+ const SUBAGENT_LINEAGE_SLOT = "conversation.session.header.lineage";
12522
+ const SUBAGENT_LOCALE = "subagent";
12523
+ const MNEMON_SHADOW_PRIORITY = -100;
12524
+ const scopedSnapshots = /* @__PURE__ */ new WeakMap();
12525
+ function isTokenUsage(value) {
12526
+ if (typeof value !== "object" || value === null || Array.isArray(value)) return false;
12527
+ const usage = value;
12528
+ return [
12529
+ "uncachedInputTokens",
12530
+ "outputTokens",
12531
+ "cacheReadTokens",
12532
+ "cacheWriteTokens"
12533
+ ].every((key) => {
12534
+ const count = usage[key];
12535
+ return typeof count === "number" && Number.isSafeInteger(count) && count >= 0;
12536
+ });
12537
+ }
12538
+ /**
12539
+ * Present the child-local projection under the generic key expected by the
12540
+ * released official catalog component. All other consumers continue seeing
12541
+ * DSH's complete-log `tokenUsage` value.
12542
+ */
12543
+ function scopeSubagentTokenUsage(state) {
12544
+ const cached = scopedSnapshots.get(state);
12545
+ if (cached !== void 0) return cached;
12546
+ let byId;
12547
+ for (const [id, summary] of Object.entries(state.byId)) {
12548
+ if (summary.origin !== "subagent") continue;
12549
+ const projections = summary.projectionValues;
12550
+ const scopedUsage = projections?.[MNEMON_SUBAGENT_TOKEN_USAGE_KEY];
12551
+ if (!isTokenUsage(scopedUsage)) continue;
12552
+ byId ??= { ...state.byId };
12553
+ byId[id] = {
12554
+ ...summary,
12555
+ projectionValues: {
12556
+ ...projections,
12557
+ tokenUsage: scopedUsage
12558
+ }
12559
+ };
12560
+ }
12561
+ const scoped = byId === void 0 ? state : {
12562
+ ...state,
12563
+ byId
12564
+ };
12565
+ scopedSnapshots.set(state, scoped);
12566
+ return scoped;
12567
+ }
12568
+ /** Wrap the framework hook while preserving its selector/equality contract. */
12569
+ function createScopedUseSessions(useSessions) {
12570
+ return (selector, equal) => useSessions((state) => selector(scopeSubagentTokenUsage(state)), equal);
12571
+ }
12572
+ function lineageShadow(official) {
12573
+ return function MnemonSubagentHeaderLineage(props) {
12574
+ return (0, react.createElement)(official, {
12575
+ ...props,
12576
+ useSessions: createScopedUseSessions(props.useSessions)
12577
+ });
12578
+ };
12579
+ }
12580
+ function officialLineage(entries) {
12581
+ return entries.find((entry) => (entry.options.priority ?? 0) === 0 && entry.locale === SUBAGENT_LOCALE && typeof entry.component === "function" && typeof entry.inject === "function");
12582
+ }
12583
+ /**
12584
+ * Shadow the released official single-slot entry at a lower priority. The
12585
+ * component and action factory are captured from the public slot ledger, so
12586
+ * Mnemon keeps the official UI, styles, locale, and navigation behavior.
12587
+ */
12588
+ function mountSubagentTokenUsageOverride(ctx) {
12589
+ const slots = ctx.slots;
12590
+ if (typeof slots.entries !== "function" || typeof slots.subscribe !== "function" || typeof slots.register !== "function") return () => {};
12591
+ let official;
12592
+ let disposeShadow;
12593
+ const reconcile = () => {
12594
+ const entries = slots.entries(SUBAGENT_LINEAGE_SLOT);
12595
+ if (official !== void 0 && entries.includes(official)) return;
12596
+ const disposePreviousShadow = disposeShadow;
12597
+ disposeShadow = void 0;
12598
+ official = void 0;
12599
+ disposePreviousShadow?.();
12600
+ official = officialLineage(entries);
12601
+ if (official === void 0) return;
12602
+ disposeShadow = slots.register({
12603
+ name: SUBAGENT_LINEAGE_SLOT,
12604
+ priority: MNEMON_SHADOW_PRIORITY,
12605
+ locale: official.locale,
12606
+ inject: official.inject,
12607
+ registrant: "dsh-mnemon/subagent-token-usage"
12608
+ }, lineageShadow(official.component));
12609
+ };
12610
+ const unsubscribe = slots.subscribe(SUBAGENT_LINEAGE_SLOT, reconcile);
12611
+ reconcile();
12612
+ return () => {
12613
+ unsubscribe();
12614
+ disposeShadow?.();
12615
+ };
12616
+ }
12617
+ //#endregion
12301
12618
  //#region src/client/index.ts
12302
12619
  const inject = [
12303
12620
  "slots",
@@ -12383,6 +12700,7 @@ window.__ModuleLoader__.load({
12383
12700
  zh,
12384
12701
  en
12385
12702
  }), "dsh-mnemon: locale dictionaries");
12703
+ ctx.slots.inject("conversation.session.header.lineage", () => mountSubagentTokenUsageOverride(ctx));
12386
12704
  const translate = ctx.locale.bind(namespace);
12387
12705
  let activeMemoryWorkspace;
12388
12706
  const reconcileMemoryWorkspace = () => {